SublimeText3でURLをダブルクリックした時にそのURLを開くようにする

忘れやすいのでメモ。

  • Command + Shift + P
  • install と入力し Enter
  • Clickable URLs を選択しEnter ->インストールが完了したら次のStepへ
  • Sublime Text -> Preferences -> Package Settings -> Clickable URLs -> Mouse Bindings – User
  • 下記のコードを入力しSave
[ 
	{
		"button": "button1",
		"count": 2,
		"command": "open_url_under_cursor"
	}
]

以上。

いろいろupgradeしてみた

簡単にまとめると
・Fedora 23 -> 26
・PHP 5.6 -> 7.1
・Python 2.7 -> 3.6

PHPはWordpressでも利用しているため、結構、コードを修正する必要があった。
new文の & を消し
eregi関数がなくなったのでpreg関数に書き換え

Pythonはencode, decodeを使ってたところを修正
pip installも pip3 installでやりなおし
print “hogehoge”を print(“hogehoge”)に修正
crontabのjobは /bin/python3を付けてpython3で実行させるように修正

などなど、いろいろとハマったけど、勉強になったし、今どきな環境になったのでヨシとしよう。

Emoji test

😀 😃 😄 😁 😆 😅 😂 🤣 ☺️ 😊 😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 😜 😝 😛 🤑 🤗 🤓 😎 🤡 🤠 😏 😒 😞 😔 😟 😕 🙁 ☹️ 😣 😖 😫 😩 😤 😠 😡 😶 😐 😑 😯 😦 😧 😮 😲 😵 😳 😱 😨 😰 😢 😥 🤤 😭 😓 😪 😴 🙄 🤔 🤥 😬 🤐 🤢 🤧 😷 🤒 🤕 😈 👿 👹 👺 💩 👻 💀 ☠️ 👽 👾 🤖 🎃 😺 😸 😹 😻 😼 😽 🙀 😿 😾 👐 🙌 👏 🙏 🤝 👍 👎 👊 ✊ 🤛 🤜 🤞 ✌️ 🤘 👌 👈 👉 👆 👇 ☝️ ✋ 🤚 🖐 🖖 👋 🤙 💪 🖕 ✍️ 🤳 💅 🖖 💄 💋 👄 👅 👂 👃 👣 👁 👀 🗣 👤 👥 👶 👦 👧 👨 👩 👱‍♀️ 👱 👴 👵 👲 👳‍♀️ 👳 👮‍♀️ 👮 👷‍♀️ 👷 💂‍♀️ 💂 🕵️‍♀️ 🕵️ 👩‍⚕️ 👨‍⚕️ 👩‍🌾 👨‍🌾 👩‍🍳 👨‍🍳 👩‍🎓 👨‍🎓 👩‍🎤 👨‍🎤 👩‍🏫 👨‍🏫 👩‍🏭 👨‍🏭 👩‍💻 👨‍💻 👩‍💼 👨‍💼 👩‍🔧 👨‍🔧 👩‍🔬 👨‍🔬 👩‍🎨 👨‍🎨 👩‍🚒 👨‍🚒 👩‍✈️ 👨‍✈️ 👩‍🚀 👨‍🚀 👩‍⚖️ 👨‍⚖️ 🤶 🎅 👸 🤴 👰 🤵 👼 🤰 🙇‍♀️ 🙇 💁 💁‍♂️ 🙅 🙅‍♂️ 🙆 🙆‍♂️ 🙋 🙋‍♂️ 🤦‍♀️ 🤦‍♂️ 🤷‍♀️ 🤷‍♂️ 🙎 🙎‍♂️ 🙍 🙍‍♂️ 💇 💇‍♂️ 💆 💆‍♂️ 🕴 💃 🕺 👯 👯‍♂️ 🚶‍♀️ 🚶 🏃‍♀️ 🏃 👫 👭 👬 💑 👩‍❤️‍👩 👨‍❤️‍👨 💏 👩‍❤️‍💋‍👩 👨‍❤️‍💋‍👨 👪 👨‍👩‍👧 👨‍👩‍👧‍👦 👨‍👩‍👦‍👦 👨‍👩‍👧‍👧 👩‍👩‍👦 👩‍👩‍👧 👩‍👩‍👧‍👦 👩‍👩‍👦‍👦 👩‍👩‍👧‍👧 👨‍👨‍👦 👨‍👨‍👧 👨‍👨‍👧‍👦 👨‍👨‍👦‍👦 👨‍👨‍👧‍👧 👩‍👦 👩‍👧 👩‍👧‍👦 👩‍👦‍👦 👩‍👧‍👧 👨‍👦 👨‍👧 👨‍👧‍👦 👨‍👦‍👦 👨‍👧‍👧 👚 👕 👖 👔 👗 👙 👘 👠 👡 👢 👞 👟 👒 🎩 🎓 👑 ⛑ 🎒 👝 👛 👜 💼 👓 🕶 🌂 ☂️
🐶 🐱 🐭 🐹 🐰 🦊 🐻 🐼 🐨 🐯 🦁 🐮 🐷 🐽 🐸 🐵 🙊 🙉 🙊 🐒 🐔 🐧 🐦 🐤 🐣 🐥 🦆 🦅 🦉 🦇 🐺 🐗 🐴 🦄 🐝 🐛 🦋 🐌 🐚 🐞 🐜 🕷 🕸 🐢 🐍 🦎 🦂 🦀 🦑 🐙 🦐 🐠 🐟 🐡 🐬 🦈 🐳 🐋 🐊 🐆 🐅 🐃 🐂 🐄 🦌 🐪 🐫 🐘 🦏 🦍 🐎 🐖 🐐 🐏 🐑 🐕 🐩 🐈 🐓 🦃 🕊 🐇 🐁 🐀 🐿 🐾 🐉 🐲 🌵 🎄 🌲 🌳 🌴 🌱 🌿 ☘️ 🍀 🎍 🎋 🍃 🍂 🍁 🍄 🌾 💐 🌷 🌹 🥀 🌻 🌼 🌸 🌺 🌎 🌍 🌏 🌕 🌖 🌗 🌘 🌑 🌒 🌓 🌔 🌚 🌝 🌞 🌛 🌜 🌙 💫 ⭐️ 🌟 ✨ ⚡️ 🔥 💥 ☄️ ☀️ 🌤 ⛅️ 🌥 🌦 🌈 ☁️ 🌧 ⛈ 🌩 🌨 ☃️ ⛄️ ❄️ 🌬 💨 🌪 🌫 🌊 💧 💦 ☔️
🍏 🍎 🍐 🍊 🍋 🍌 🍉 🍇 🍓 🍈 🍒 🍑 🍍 🥝 🥑 🍅 🍆 🥒 🥕 🌽 🌶 🥔 🍠 🌰 🥜 🍯 🥐 🍞 🥖 🧀 🥚 🍳 🥓 🥞 🍤 🍗 🍖 🍕 🌭 🍔 🍟 🥙 🌮 🌯 🥗 🥘 🍝 🍜 🍲 🍥 🍣 🍱 🍛 🍚 🍙 🍘 🍢 🍡 🍧 🍨 🍦 🍰 🎂 🍮 🍭 🍬 🍫 🍿 🍩 🍪 🥛 🍼 ☕️ 🍵 🍶 🍺 🍻 🥂 🍷 🥃 🍸 🍹 🍾 🥄 🍴 🍽
⚽️ 🏀 🏈 ⚾️ 🎾 🏐 🏉 🎱 🏓 🏸 🥅 🏒 🏑 🏏 ⛳️ 🏹 🎣 🥊 🥋 ⛸ 🎿 ⛷ 🏂 🏋️‍♀️ 🏋️ 🤺 🤼‍♀️ 🤼‍♂️ 🤸‍♀️ 🤸‍♂️ ⛹️‍♀️ ⛹️ 🤾‍♀️ 🤾‍♂️ 🏌️‍♀️ 🏌️ 🏄‍♀️ 🏄 🏊‍♀️ 🏊 🤽‍♀️ 🤽‍♂️ 🚣‍♀️ 🚣 🏇 🚴‍♀️ 🚴 🚵‍♀️ 🚵 🎽 🏅 🎖 🥇 🥈 🥉 🏆 🏵 🎗 🎫 🎟 🎪 🤹‍♀️ 🤹‍♂️ 🎭 🎨 🎬 🎤 🎧 🎼 🎹 🥁 🎷 🎺 🎸 🎻 🎲 🎯 🎳 🎮 🎰
🚗 🚕 🚙 🚌 🚎 🏎 🚓 🚑 🚒 🚐 🚚 🚛 🚜 🛴 🚲 🛵 🏍 🚨 🚔 🚍 🚘 🚖 🚡 🚠 🚟 🚃 🚋 🚞 🚝 🚄 🚅 🚈 🚂 🚆 🚇 🚊 🚉 🚁 🛩 ✈️ 🛫 🛬 🚀 🛰 💺 🛶 ⛵️ 🛥 🚤 🛳 ⛴ 🚢 ⚓️ 🚧 ⛽️ 🚏 🚦 🚥 🗺 🗿 🗽 ⛲️ 🗼 🏰 🏯 🏟 🎡 🎢 🎠 ⛱ 🏖 🏝 ⛰ 🏔 🗻 🌋 🏜 🏕 ⛺️ 🛤 🛣 🏗 🏭 🏠 🏡 🏘 🏚 🏢 🏬 🏣 🏤 🏥 🏦 🏨 🏪 🏫 🏩 💒 🏛 ⛪️ 🕌 🕍 🕋 ⛩ 🗾 🎑 🏞 🌅 🌄 🌠 🎇 🎆 🌇 🌆 🏙 🌃 🌌 🌉 🌁
🚗 🚕 🚙 🚌 🚎 🏎 🚓 🚑 🚒 🚐 🚚 🚛 🚜 🛴 🚲 🛵 🏍 🚨 🚔 🚍 🚘 🚖 🚡 🚠 🚟 🚃 🚋 🚞 🚝 🚄 🚅 🚈 🚂 🚆 🚇 🚊 🚉 🚁 🛩 ✈️ 🛫 🛬 🚀 🛰 💺 🛶 ⛵️ 🛥 🚤 🛳 ⛴ 🚢 ⚓️ 🚧 ⛽️ 🚏 🚦 🚥 🗺 🗿 🗽 ⛲️ 🗼 🏰 🏯 🏟 🎡 🎢 🎠 ⛱ 🏖 🏝 ⛰ 🏔 🗻 🌋 🏜 🏕 ⛺️ 🛤 🛣 🏗 🏭 🏠 🏡 🏘 🏚 🏢 🏬 🏣 🏤 🏥 🏦 🏨 🏪 🏫 🏩 💒 🏛 ⛪️ 🕌 🕍 🕋 ⛩ 🗾 🎑 🏞 🌅 🌄 🌠 🎇 🎆 🌇 🌆 🏙 🌃 🌌 🌉 🌁
⌚️ 📱 📲 💻 ⌨️ 🖥 🖨 🖱 🖲 🕹 🗜 💽 💾 💿 📀 📼 📷 📸 📹 🎥 📽 🎞 📞 ☎️ 📟 📠 📺 📻 🎙 🎚 🎛 ⏱ ⏲ ⏰ 🕰 ⌛️ ⏳ 📡 🔋 🔌 💡 🔦 🕯 🗑 🛢 💸 💵 💴 💶 💷 💰 💳 💎 ⚖️ 🔧 🔨 ⚒ 🛠 ⛏ 🔩 ⚙️ ⛓ 🔫 💣 🔪 🗡 ⚔️ 🛡 🚬 ⚰️ ⚱️ 🏺 🔮 📿 💈 ⚗️ 🔭 🔬 🕳 💊 💉 🌡 🚽 🚰 🚿 🛁 🛀 🛎 🔑 🗝 🚪 🛋 🛏 🛌 🖼 🛍 🛒 🎁 🎈 🎏 🎀 🎊 🎉 🎎 🏮 🎐 ✉️ 📩 📨 📧 💌 📥 📤 📦 🏷 📪 📫 📬 📭 📮 📯 📜 📃 📄 📑 📊 📈 📉 🗒 🗓 📆 📅 📇 🗃 🗳 🗄 📋 📁 📂 🗂 🗞 📰 📓 📔 📒 📕 📗 📘 📙 📚 📖 🔖 🔗 📎 🖇 📐 📏 📌 📍 📌 🎌 🏳️ 🏴 🏁 🏳️‍🌈 ✂️ 🖊 🖋 ✒️ 🖌 🖍 📝 ✏️ 🔍 🔎 🔏 🔐 🔒 🔓
❤️ 💛 💚 💙 💜 🖤 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 🚻 🚮 🎦 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 ✔️ ☑️ 🔘 ⚪️ ⚫️ 🔴 🔵 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ ⬛️ ⬜️ 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 👁‍🗨 💬 💭 🗯 ♠️ ♣️ ♥️ ♦️ 🃏 🎴 🀄️ 🕐 🕑 🕒 🕓 🕔 🕕 🕖 🕗 🕘 🕙 🕚 🕛 🕜 🕝 🕞 🕟 🕠 🕡 🕢 🕣 🕤 🕥 🕦 🕧
🏳️ 🏴 🏁 🚩 🏳️‍🌈 🇦🇫 🇦🇽 🇦🇱 🇩🇿 🇦🇸 🇦🇩 🇦🇴 🇦🇮 🇦🇶 🇦🇬 🇦🇷 🇦🇲 🇦🇼 🇦🇺 🇦🇹 🇦🇿 🇧🇸 🇧🇭 🇧🇩 🇧🇧 🇧🇾 🇧🇪 🇧🇿 🇧🇯 🇧🇲 🇧🇹 🇧🇴 🇧🇦 🇧🇼 🇧🇷 🇮🇴 🇻🇬 🇧🇳 🇧🇬 🇧🇫 🇧🇮 🇰🇭 🇨🇲 🇨🇦 🇮🇨 🇨🇻 🇧🇶 🇰🇾 🇨🇫 🇹🇩 🇨🇱 🇨🇳 🇨🇽 🇨🇨 🇨🇴 🇰🇲 🇨🇬 🇨🇩 🇨🇰 🇨🇷 🇨🇮 🇭🇷 🇨🇺 🇨🇼 🇨🇾 🇨🇿 🇩🇰 🇩🇯 🇩🇲 🇩🇴 🇪🇨 🇪🇬 🇸🇻 🇬🇶 🇪🇷 🇪🇪 🇪🇹 🇪🇺 🇫🇰 🇫🇴 🇫🇯 🇫🇮 🇫🇷 🇬🇫 🇵🇫 🇹🇫 🇬🇦 🇬🇲 🇬🇪 🇩🇪 🇬🇭 🇬🇮 🇬🇷 🇬🇱 🇬🇩 🇬🇵 🇬🇺 🇬🇹 🇬🇬 🇬🇳 🇬🇼 🇬🇾 🇭🇹 🇭🇳 🇭🇰 🇭🇺 🇮🇸 🇮🇳 🇮🇩 🇮🇷 🇮🇶 🇮🇪 🇮🇲 🇮🇱 🇮🇹 🇯🇲 🇯🇵 🎌 🇯🇪 🇯🇴 🇰🇿 🇰🇪 🇰🇮 🇽🇰 🇰🇼 🇰🇬 🇱🇦 🇱🇻 🇱🇧 🇱🇸 🇱🇷 🇱🇾 🇱🇮 🇱🇹 🇱🇺 🇲🇴 🇲🇰 🇲🇬 🇲🇼 🇲🇾 🇲🇻 🇲🇱 🇲🇹 🇲🇭 🇲🇶 🇲🇷 🇲🇺 🇾🇹 🇲🇽 🇫🇲 🇲🇩 🇲🇨 🇲🇳 🇲🇪 🇲🇸 🇲🇦 🇲🇿 🇲🇲 🇳🇦 🇳🇷 🇳🇵 🇳🇱 🇳🇨 🇳🇿 🇳🇮 🇳🇪 🇳🇬 🇳🇺 🇳🇫 🇰🇵 🇲🇵 🇳🇴 🇴🇲 🇵🇰 🇵🇼 🇵🇸 🇵🇦 🇵🇬 🇵🇾 🇵🇪 🇵🇭 🇵🇳 🇵🇱 🇵🇹 🇵🇷 🇶🇦 🇷🇪 🇷🇴 🇷🇺 🇷🇼 🇼🇸 🇸🇲 🇸🇦 🇸🇳 🇷🇸 🇸🇨 🇸🇱 🇸🇬 🇸🇽 🇸🇰 🇸🇮 🇬🇸 🇸🇧 🇸🇴 🇿🇦 🇰🇷 🇸🇸 🇪🇸 🇱🇰 🇧🇱 🇸🇭 🇰🇳 🇱🇨 🇵🇲 🇻🇨 🇸🇩 🇸🇷 🇸🇿 🇸🇪 🇨🇭 🇸🇾 🇹🇼 🇹🇯 🇹🇿 🇹🇭 🇹🇱 🇹🇬 🇹🇰 🇹🇴 🇹🇹 🇹🇳 🇹🇷 🇹🇲 🇹🇨 🇹🇻 🇻🇮 🇺🇬 🇺🇦 🇦🇪 🇬🇧 🇺🇸 🇺🇾 🇺🇿 🇻🇺 🇻🇦 🇻🇪 🇻🇳 🇼🇫 🇪🇭 🇾🇪 🇿🇲 🇿🇼
🤣 🤠 🤡 🤥 🤤 🤢 🤧 🤴 🤶 🤵 🤷 🤦 🤰 🕺 🤳 🤞 🤙 🤛 🤜 🤚 🤝 🖤 🦍 🦊 🦌 🦏 🦇 🦅 🦆 🦉 🦎 🦈 🦐 🦑 🦋 🥀 🥝 🥑 🥔 🥕 🥒 🥜 🥐 🥖 🥞 🥓 🥙 🥚 🥘 🥗 🥛 🥂 🥃 🥄 🛑 🛴 🛵 🛶 🥇 🥈 🥉 🥊 🥋 🤸 🤼 🤽 🤾 🤺 🥅 🤹 🥁 🛒

Macで画面を分割

最近、外出する機会が増え、隙間時間にMacで作業を行う。
自宅で作業する時はトリプルモニターな環境なので不自由はしないが、一枚の画面だとどうしても効率が低下してしまう。
何とかならないものかと思い調べてみるとMacには標準でSplit Viewという機能がついている。
しかし、以下の点が気に入らない。

  • ・画面を上下に分割できない
  • ・ショートカットキーを用いて画面分割することができない

調べてみたところ、良いソフトを見つけることができたのでメモしておく。

ShiftIt
https://github.com/fikovnik/ShiftIt/releases

Rubyを基本からやり直した

Rubyを久しぶりに書くことになり、不安だったのでドットインストールでおさらいすることにした。その時のメモをここに書いておく。
ドットインストール Ruby入門(全23回) http://dotinstall.com/lessons/basic_ruby_v2

print "Hello world!" #終わったあとに改行がない
puts "Hello world!" #改行がある
p "hello world(p)" #データの形式がわかるように表示
#複数行に渡るコメントはbeginとendで。
=begin
コメント
コメント
=end

#変数:データにつけるラベル(英小文字から始まる)
#定数:変更されないデータにつけるラベル(英大文字から始まる。通例として全て大文字とする)
msg = "hello world!"
 p msg
ADMIN_EMAIL = "hoge@gmail.com"

#データ(Rubyのデータは全てオブジェクト。いろんな便利な命令が詰まったデータ型。)
# – メソッド(便利な命令。クラスで定義されている。クラスはオブジェクトの設計図のようなもの。
#全てのデータは何らかのクラスに属している。公式サイトから見ることができる。 http://ruby-doc.org/core-2.0.0/#class-index
p "hello world".length #文字列の長さを返してくれる
#数値オブジェクト-Numericクラスで定義
x = 10 #整数値 100_000_000 アンダーバーを無視するという仕様。
y = 20.5 #実数値
z = 1/3r #分数値 Rational(1, 3)

#使える演算子 + - * / % **

p x % 3 # 1
p x ** 3 # 1000
p z * 2 # 2/3
#x = x + 5 → x +=5 #自己代入
p y.round #四捨五入

#文字列オブジェクト-Stringクラスで定義
name = "temosy"
x = "hello world, #{name}" #変数展開、特殊文字(改行\n タブ\t)を使える
y = 'hello world, #{name}'

puts x #ちゃんと展開される
puts y #展開できないのでそのまま表示される

#連結するときには+, 繰り返す時は*が使える
puts "hello world" + " temosy"
puts "hello world" * 5

# ! 破壊的メソッド
# ? 真偽値を返すメソッド
s = "temosy"
puts s.upcase! #元データを書き換えたい場合は破壊的メソッドを使う
p s.empty? # false

#配列オブジェクト-Arrayクラスで定義
sales = [5, 8, 4] #文字列を入れたり、配列の中に配列を入れることも可能。
p sales[1] #添字(インデックスは0から始まる)

#添字の範囲指定方法
p sales[0..2] #0から2を取得
p sales[0...2] #0から2未満を取得
p sales[-1] #最後の要素を取得
p sales[1, 2] #一番目から2個分取得

#複数の要素を書き換え
sales[0...2] = [1 , 2] #0から2未満を次の要素で書き換え
p sales #[1 ,2 , 4]

#複数の要素を挿入
sales[1,0] = [10, 11, 12] #1から0個分を次の要素で書き換え。実質的に挿入される。
p sales #[5, 10, 11, 12, 8, 4]

#複数の要素を削除
sales[0, 2] = [] #0から2個分を空配列に。
p sales #[4]

#よく使うメソッド
p sales.size #要素数を取得できる
p sales.sort #小さい順にソート
p sales.sort.reverse #大きい順にソート
p sales.push(100) #配列の末尾に要素を追加
sales << 100 << 102 #配列の末尾に複数の要素を追加

#ハッシュ-Hashクラスで定義(配列と同じように複数の値を管理できる。配列と違い識別子であるkeyを付けることができる)
#key value
sales = {:A-san => 200, :B-san => 300}
p sales[:A-san]

#Ruby 1.9からはこのような書き方もできる
sales = {A-san: 200, B-san: 300}
p sales[:A-san]

#よく使うメソッド
p sales.size #要素数を返す
p sales.keys #keyだけを返す
p sales.values #valueだけを返す
p sales.has_key?(:A-san) #そのkeyがあるかどうかを真偽値で返す

#オブジェクトの変換
a = 10
b = "5"
p a + b.to_i #to integerの略。整数値15が返ってくる
p a + b.to_f #to floatの略。実数値15.0が返ってくる
p a.to_s + b #to stringの略。連結されて文字列105が返ってくる

h= {A-san: 100, B-san: 200}
p h.to_a #ハッシュを配列に変換
p h.to_a.to_h #配列をハッシュに変換

# %記法(エスケープシーケンスを書かなくて済む)
s ="hello"
s =%Q(hello)
s =%(hello)

s ="hel\"lo"
s =%Q(hel"lo)
s =%(hel"lo)

s ='hel\"lo'
s =%q(hel"lo)

#配列の%記法(ダブルクォーテーションをたくさん書かなくて済む)
a = ["a", "b", "c"]
a = %W(a b c)

a = ['a', 'b', 'c']
a = %w(a b c)

#条件分岐 if文
=begin
比較演算子
> < #より大きい、より小さい
>= <= #以上、以下
== != #等しい、等しくない

&& (AND)
|| (OR)
! (NOT)
=end

sore = 80
if score > 60
  puts "OK!"
elseif score > 40
  puts "SOSO..."
else
  puts "NG!"
end

#真偽値と条件演算子
#false: false nil(オブジェクトが存在しない)
#true: それ以外(0 ''を含む)

if x #←演算子が無いがtrueが省略されている
  puts "..."
end

#b = 10
#c = 20
b, c = 10, 20 #多重代入
a = b > c ? b : c #bがcより大きかったらbを返しなさい。そうでなければcを返しなさい。
puts a #20

条件分岐 case文
signal = "red"

case signal
when "red"
  puts "STOP!"
when "green"
  puts "GO!"
when "yellow"
 puts "CAUTION!"
else
 puts "wrong signal"
end

#繰り返し処理 times、while、break、next
#times
3.times do |i|
  puts "#{i}: hello"
end

#while
i = 0
while i < 3 do
  puts "#{i}: hello"
  i +=1
end

#break:ループを抜ける
3.times do |i|
  if i == 1
    break
  end
  puts "#{i}: hello"
end

#next:ループを1回スキップ
3.times do |i|
  if i == 1
    next
  end
  puts "#{i}: hello"
end

#繰り返し処理 for、each
#for
for i in 0..2 do
  puts i
end

for color in ["red", "blue", "pink"] do
  puts color
end

#each
{"red"=>200, "blue"=>100, "pink"=>50}.each do |color, price|
  puts "#{color}: #{price}"
end

#関数的メソッド-自分でメソッドを作る方法
def sayHi(name = "Steve")
  puts "hello! " + name
  s = "hello!  " + name
  return s
end

sayHi("Tom")
sayHi("Bob")
sayHi()
greet = sayHi()
puts greet

#クラスの作り方
#クラス(オブジェクトの設計図)
#メソッドの定義
#インスタンスを作成

class User #クラス名は大文字から始まる
  
  @@count = 0 #クラス変数(@@で始まる。クラス共通でデータを保持するときに使う) 

  def initialize(name) #クラスからオブジェクト(インスタンス)を作成
    @name = name #インスタンス変数は@から始まる(そのインスタンス内の別のメソッドから呼び出せる)
    @@count += 1 #インスタンスが初期化される度にカウントを増やす
  end

  def sayHi #インスタンスメソッド(インスタンスから呼び出せる)
    puts "hello, my name is #{@name}"
  end

  def User.sayHello #クラスメソッド(クラスから直接呼び出せる)
    puts "hello from User class (#{@@count} users)"
  end
end

tom = User.new("Tom")
tom.sayHi()

bob = User.new("Bob")
bob.sayHi()

User.sayHello()

#クラスの継承(性質を受け継ぎつつ、少し違ったクラスを作成する)
class User

  def initialize(name)
    @name = name
  end

  def sayHi
    puts "hello, my name is #{@name}"
  end

end

class SuperUser < User #Userクラスの性質を継承し、メソッドを追加。

  def shout
    puts "HELLO! from #{#name}!"
  end

end

tom = User.new("Tom")
bob = SuperUser.new("Bob")
tom.sayHi()
bob.sayHi()
bob.shout()

アクセサ(getter, setter)の使い方(インスタンス変数に外部からアクセスする)
#今までクラスをインスタンス化してメソッドを作ってきたが、同じようにインスタンス変数にアクセスできれば便利。
class User

  def initialize(name)
    @name = name
  end

=begin
  #getter
  def name
   #return @name
   @name #returnは省略できる。
  end

  #setter
  def setName(newName)
    @name = newName
  end
=end

  attr_accessor :name #シンボルでインスタンス変数の名前を与えるとgetterとsetterをまとめて自動生成できる。
  attr_reader :name #getterだけを自動生成することができる
  attr_writer :name #setterだけを自動生成することができる

  def sayHi
    puts "hello, my name is #{@name}"
  end

end

bob.User.new("Bob")
bob.sayHi()
#p bob.name # undefined method 'name' (NomethodError)のエラーになる。クラスのインスタンス変数は外部からアクセスできない。
#bob.setName("Tom")
bob.name = "Tom"
bob.seyHi()

#Timeクラス(時間計算などに使える)
t = Time.now #現在時刻を取得
t = Time.new(2013, 12, 25, 12, 32, 22) #2013-12-25 12:32:22 +0900
t += 10 #10秒足す
t.strftime("Updated: %Y-%m-%d")

p t.year
p t.month

MacBook Air (13-inch, Mid 2012)の内蔵 無線LANモジュールを換装してみた

今回無線LANモジュールを換装しようと思ったきっかけはプロバイダーにてフレッツ設備の増速工事に伴うメンテナンスが行われて回線速度が大幅にSpeed upしたからです。回線速度の結果はこちら。
Ethernet(有線LAN)で下り514Mbpsということで、メンテナンスが行われる前と比較して3倍速になりました。

ここまで来るとWi-Fi(無線LAN)の環境もupgradeしないと折角の回線も宝の持ち腐れとなってしまいます。

そこで、まずは無線LANルーターを買い換えました。今まで使っていた無線ルーターはこちらです。
[amazonjs asin=”B0088UGF0S” locale=”JP”]

そして現在使っている無線LANルーターはこちらです。
[amazonjs asin=”B00TTUU2DM” locale=”JP”]

無線LANルーターの機種選定には悩みましたが、今まで使っていたBuffaloのWZR-600DHPはたまにハングアップして機能しなくなったりして困っていたということ、Wi-Fi接続するデバイスが年々増加しており、今後もその傾向は変わらないだろうし、この機会に最上位モデルを購入しておけば、しばらくは買い替えなくても済むだろうということでNETGEARのNighthawk X6 R8000-100JPSに決めました。

そして、私の使っているMacBook Airは13-inch, Mid 2012です。このモデルの場合、新しく購入した無線LANルーターのパフォーマンスを最大限有効利用することができません。なぜなら、下記の通りWi-Fiの規格であるIEEE 802.11 a/b/g/nにしか対応していないからです。より上位の規格であるIEEE 802.11acに対応させるためには内蔵無線LANモジュールを換装する必要があります。
[sh]
$ system_profiler | grep "Interfaces" -A15 ‹system›

Interfaces:
en0:
Card Type: AirPort Extreme (0x14E4, 0xE9)
Firmware Version: Broadcom BCM43xx 1.0 (7.21.94.136.1a1)
MAC Address: xx:xx:xx:xx:xx:xx
Locale: Japan
Country Code: JP
Supported PHY Modes: 802.11 a/b/g/n
Supported Channels: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140
Wake On Wireless: Supported
AirDrop: Supported
Status: Connected
Current Network Information:
BullGEAR40-5G-1:
PHY Mode: 802.11n
BSSID: xx:xx:xx:xx:xx:xx
[/sh]
無線LANモジュール換装前(IEEE 802.11nでの接続時)の回線速度はこちらです。

今回は無線LANモジュールを下記のものに交換しました。
[amazonjs asin=”B00PDNDQ0K” locale=”JP”]

その際にMacBook Airを分解するための専用ドライバー(五つ星型ドライバー)が必要となりますので、こちらを購入しました。
[amazonjs asin=”B00DGJ2PIC” locale=”JP”]

また内部の分解に六つ星型レンチが必要となりますので、こちらも購入しました。
[amazonjs asin=”B000I0KLMO” locale=”JP”]

さぁ、早速手術開始です。ドライバーで裏フタのネジを外します。
IMG_0471

開けてびっくり!汚なっ!ついでにキレイに掃除します。
IMG_0472

無線LANモジュールはこいつです!
IMG_0473

六つ星型レンチで無線LANモジュールを固定しているネジを外します。
IMG_0474

無線LANモジュールを取り替えます。そもそも大きさが異なるのでアンテナの配線で苦戦しました。無理矢理配線し、何とか換装できました。
IMG_0477

換装後、ターミナルからコマンドでどのように認識されている確認します。OKですね。PHY Mode: 802.11acで認識されています。
[sh]
$ system_profiler | grep "Interfaces" -A15 ‹system›
Interfaces:
en0:
Card Type: AirPort Extreme (0x14E4, 0x117)
Firmware Version: Broadcom BCM43xx 1.0 (7.21.94.136.1a1)
MAC Address: xx:xx:xx:xx:xx:xx
Locale: FCC
Country Code: JP
Supported PHY Modes: 802.11 a/b/g/n/ac
Supported Channels: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140
Wake On Wireless: Supported
AirDrop: Supported
Status: Connected
Current Network Information:
BullGEAR40-5G-1:
PHY Mode: 802.11ac
BSSID: xx:xx:xx:xx:xx:xx
[/sh]

さぁ、それでは再度、回線速度を計測します!

無線LANで上り、下りともに300Mbps超えです。大満足です。
ただし、この改造により大切なMacbook Airが故障する危険性がありますのでマネする人は自己責任でお願いします。

以上、換装してみたレポートでした! 

パソコンが重いから様子を見てほしいと言われた時

ITサポート業務を行っていると、必ずと言っていいほど、「パソコンが重いんだけど、ちょっと見てもらえない?」という相談が来ます。そういう相談が来た時はタスクマネージャーを開き、プロセスのタブからどのプロセスがリソースを多く消費しているかを確認し、重くなる原因を探します。「何か最近、エラーメッセージとか出たりしていませんか?」という質問をして、出ていたということであれば、Event Logも確認するようにしています。大抵、Firefoxのタブを開きすぎていたり、Excelのファイル自体に問題があったりして、そのプロセスを停止すると重くなるのを防ぐことができます。場合によってはバックグラウンドでWindows Updateが走っていて、一時的に重くなる場合もあります。ただ、もう一歩突っ込んだことができないかな?と最近思っていたりして、使えそうだなと思ったものがあったので書き残しておこうと思います。

[sh]
https://technet.microsoft.com/ja-jp/windows/win7_tips46.aspxから引用
次のオプションを使用すると、コマンド ラインから直接 Perfmon.exe をより細かく制御することができます。

perfmon /rel: コンピューターの信頼性と問題の履歴を確認できます (パフォーマンス モニターで [モニター ツール] ノードを右クリックして、[システム信頼性の表示] をクリックした場合と同じです)。

perfmon /report: 60 秒のパフォーマンス データを収集し、システム診断レポートを生成して表示します。

perfmon /res: リソース モニターを開きます (パフォーマンス モニターで [モニター ツール] ノードを右クリックして [リソース モニター] をクリックした場合と同じです)。

perfmon /sys: スタンドアロン モードでパフォーマンス モニターを開きます (Sysmon.ocx という ActiveX コントロールです)。

追加のオプションである /comp を使用すると、起動している 2 つのパフォーマンス モニターのインスタンス間の重複した部分を比較できます。

これらのオプションは Perfmon.msc ではなく Perfmon.exe で使用するものであることに注意してください。
[/sh]

RictyをWindowsに入れてみる

Mac Book Airの内臓マイクが故障したため修理に出しました。
仕方なくWindowsで作業をすることになるのですが、やはりfontがイケてない…
開発用のfontと言えばRictyっしょ。ってことでWindowsに入れてみる。

Rictyは複数の等幅フォントと開発に適したチューニングを行ったものであるため配布ができないようだ。
自分で生成する必要がある。

Rictyの詳細は→ https://github.com/yascentur/Ricty/blob/master/README.md

Windowsマシンで作業してください。
[bash]
https://github.com/yascentur/Ricty/archive/master.zip をダウンロード
http://www.geocities.jp/meir000/fontforge/fontforge-cygwin_2012_08_02.zip をダウンロード
http://levien.com/type/myfonts/Inconsolata.otf をダウンロード
http://sourceforge.jp/frs/redir.php?m=jaist&f=%2Fmix-mplus-ipa%2F59022%2Fmigu-1m-20130617.zip をダウンロード
Ricty-master.zip を解凍
Inconsolata.otf をRicty-masterに移動(入れる)
fontforge-cygwin_2012_08_02.zip を解凍して中身をRicty-masterに移動(入れる)
migu-1m-20130617.zip を解凍を解凍して中身をRicty-masterに移動(入れる)
Ricty-masterの中にあるfontforge.bat を編集する
[/bash]
最後の3行
[bash]
xwin-close.exe -wait
fontforge.exe -nosplash %file0% %1 %2 %3 %4 %5 %6 %7
xwin-close.exe -close
[/bash]
を下記のとおりに書き換えて上書き保存
[bash]
xwin-close.exe -wait
sh ricty_generator.sh auto
sh misc/os2version_reviser.sh Ricty-*.ttf RictyDiscord-*.ttf
xwin-close.exe -close
[/bash]
fontforge.batをダブルクリック実行してしばらく待つ
Rictyディレクトリの中に下記4つのfontが生成される。
・Ricty-Bold.ttf
・Ricty-Regular.ttf
・RictyDiscord-Bold.ttf
・RictyDiscord-Regular.ttf
あとは、これを
[bash]WindowsマシンのC:\Windows\Fontsへコピー[/bash]
これでRictyを使えるようになったが、汚いのでgdippというものをinstallする
[bash]https://code.google.com/p/gdipp/downloads/list をダウンロードしてinstall[/bash]
設定方法はこちらが詳しい→ http://align-centre.hatenablog.com/entry/2014/07/11/184500
gdippはinstallしたあと、再起動しないと反映されない。

Linuxの場合は、ターミナルを開いて下記のとおり順番にコマンドを実行(Cent OS, fedoraを想定)
[bash]
$ cd ~
$ git clone https://github.com/yascentur/Ricty.git
$ yum install fontforge -y
$ wget http://levien.com/type/myfonts/Inconsolata.otf
$ wget http://sourceforge.jp/frs/redir.php?m=jaist&f=%2Fmix-mplus-ipa%2F59022%2Fmigu-1m-20130617.zip
$ unzip *migu-1m-*.zip
$ mv Inconsolata.otf Ricty
$ mv migu-1m-20130617/*.ttf Ricty
$ rm -rf *migu-1m-*
$ cd Ricty
$ sh ricty_generator.sh auto
[/bash]

Succeeded in generating Ricty!と表示され、Rictyディレクトリの中に下記4つのfontが生成される。
・Ricty-Bold.ttf
・Ricty-Regular.ttf
・RictyDiscord-Bold.ttf
・RictyDiscord-Regular.ttf
あとは、これをfontディレクトリーに入れるだけ。

[bash]
$ mkdir /usr/shre/fonts/ Ricty
$ cp Ricty/Ricty* /usr/shre/fonts/ Ricty
[/bash]

Doctorに久しぶりに診てもらった

まぁ、なんというか、直しましょう。
[bash]
brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don’t worry and just ignore them. Thanks!

Warning: Broken symlinks were found. Remove them with `brew prune`:
/usr/local/lib/python2.7/site-packages/site-packages

Warning: Your XQuartz (2.7.5) is outdated
Please install XQuartz 2.7.7:
https://xquartz.macosforge.org

Warning: Unbrewed dylibs were found in /usr/local/lib.
If you didn’t put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

Unexpected dylibs:
/usr/local/lib/libmacfuse_i32.2.dylib
/usr/local/lib/libmacfuse_i64.2.dylib

Warning: Unbrewed header files were found in /usr/local/include.
If you didn’t put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

Unexpected header files:
/usr/local/include/fuse/fuse.h
/usr/local/include/fuse/fuse_common.h
/usr/local/include/fuse/fuse_common_compat.h
/usr/local/include/fuse/fuse_compat.h
/usr/local/include/fuse/fuse_darwin.h
/usr/local/include/fuse/fuse_lowlevel.h
/usr/local/include/fuse/fuse_lowlevel_compat.h
/usr/local/include/fuse/fuse_opt.h
/usr/local/include/fuse.h
/usr/local/include/osxfuse/fuse/fuse.h
/usr/local/include/osxfuse/fuse/fuse_common.h
/usr/local/include/osxfuse/fuse/fuse_common_compat.h
/usr/local/include/osxfuse/fuse/fuse_compat.h
/usr/local/include/osxfuse/fuse/fuse_darwin.h
/usr/local/include/osxfuse/fuse/fuse_lowlevel.h
/usr/local/include/osxfuse/fuse/fuse_lowlevel_compat.h
/usr/local/include/osxfuse/fuse/fuse_opt.h

Warning: You have unlinked kegs in your Cellar
Leaving kegs unlinked can lead to build-trouble and cause brews that depend on
those kegs to fail to run properly once built. Run `brew link` on these:

ChmodBPF
ruby
Error: Failed to import: llvm
No such file or directory
[/bash]

YouTubeからAudioデータのみをダウンロードする

Homebrewでyoutube-dlをインストールする。

そして

[bash]youtube-dl –extract-audio –audio-format mp3 –audio-quality 0 youtubeのURL[/bash]

それだけ。オプションは下記のとおり。いろいろやれる。

[bash]

Usage: youtube-dl [options] url [url…]

Options:
General Options:
-h, –help print this help text and exit
–version print program version and exit
-U, –update update this program to latest version. Make sure that you have sufficient permissions (run with sudo if needed)
-i, –ignore-errors continue on download errors, for example to skip unavailable videos in a playlist
–abort-on-error Abort downloading of further videos (in the playlist or the command line) if an error occurs
–dump-user-agent display the current browser identification
–list-extractors List all supported extractors and the URLs they would handle
–extractor-descriptions Output descriptions of all supported extractors
–proxy URL Use the specified HTTP/HTTPS proxy. Pass in an empty string (–proxy &quot;&quot;) for direct connection
–socket-timeout None Time to wait before giving up, in seconds
–default-search PREFIX Use this prefix for unqualified URLs. For example &quot;gvsearch2:&quot; downloads two videos from google videos for youtube-dl &quot;large apple&quot;. Use the value &quot;auto&quot; to let
youtube-dl guess (&quot;auto_warning&quot; to emit a warning when guessing). &quot;error&quot; just throws an error. The default value &quot;fixup_error&quot; repairs broken URLs, but emits an
error if this is not possible instead of searching.
–ignore-config Do not read configuration files. When given in the global configuration file /etc/youtube-dl.conf: do not read the user configuration in ~/.config/youtube-dl.conf
(%APPDATA%/youtube-dl/config.txt on Windows)

Video Selection:
–playlist-start NUMBER playlist video to start at (default is 1)
–playlist-end NUMBER playlist video to end at (default is last)
–match-title REGEX download only matching titles (regex or caseless sub-string)
–reject-title REGEX skip download for matching titles (regex or caseless sub-string)
–max-downloads NUMBER Abort after downloading NUMBER files
–min-filesize SIZE Do not download any videos smaller than SIZE (e.g. 50k or 44.6m)
–max-filesize SIZE Do not download any videos larger than SIZE (e.g. 50k or 44.6m)
–date DATE download only videos uploaded in this date
–datebefore DATE download only videos uploaded on or before this date (i.e. inclusive)
–dateafter DATE download only videos uploaded on or after this date (i.e. inclusive)
–min-views COUNT Do not download any videos with less than COUNT views
–max-views COUNT Do not download any videos with more than COUNT views
–no-playlist download only the currently playing video
–age-limit YEARS download only videos suitable for the given age
–download-archive FILE Download only videos not listed in the archive file. Record the IDs of all downloaded videos in it.
–include-ads Download advertisements as well (experimental)
–youtube-include-dash-manifest Try to download the DASH manifest on YouTube videos (experimental)

Download Options:
-r, –rate-limit LIMIT maximum download rate in bytes per second (e.g. 50K or 4.2M)
-R, –retries RETRIES number of retries (default is 10)
–buffer-size SIZE size of download buffer (e.g. 1024 or 16K) (default is 1024)
–no-resize-buffer do not automatically adjust the buffer size. By default, the buffer size is automatically resized from an initial value of SIZE.

Filesystem Options:
-a, –batch-file FILE file containing URLs to download (‘-‘ for stdin)
–id use only video ID in file name
-A, –auto-number number downloaded files starting from 00000
-o, –output TEMPLATE output filename template. Use %(title)s to get the title, %(uploader)s for the uploader name, %(uploader_id)s for the uploader nickname if different, %(autonumber)s
to get an automatically incremented number, %(ext)s for the filename extension, %(format)s for the format description (like &quot;22 – 1280×720&quot; or &quot;HD&quot;), %(format_id)s
for the unique id of the format (like Youtube’s itags: &quot;137&quot;), %(upload_date)s for the upload date (YYYYMMDD), %(extractor)s for the provider (youtube, metacafe,
etc), %(id)s for the video id, %(playlist)s for the playlist the video is in, %(playlist_index)s for the position in the playlist and %% for a literal percent.
%(height)s and %(width)s for the width and height of the video format. %(resolution)s for a textual description of the resolution of the video format. Use – to output
to stdout. Can also be used to download to a different directory, for example with -o ‘/my/downloads/%(uploader)s/%(title)s-%(id)s.%(ext)s’ .
–autonumber-size NUMBER Specifies the number of digits in %(autonumber)s when it is present in output filename template or –auto-number option is given
–restrict-filenames Restrict filenames to only ASCII characters, and avoid &quot;&amp;&quot; and spaces in filenames
-t, –title [deprecated] use title in file name (default)
-l, –literal [deprecated] alias of –title
-w, –no-overwrites do not overwrite files
-c, –continue force resume of partially downloaded files. By default, youtube-dl will resume downloads if possible.
–no-continue do not resume partially downloaded files (restart from beginning)
–no-part do not use .part files
–no-mtime do not use the Last-modified header to set the file modification time
–write-description write video description to a .description file
–write-info-json write video metadata to a .info.json file
–write-annotations write video annotations to a .annotation file
–write-thumbnail write thumbnail image to disk
–load-info FILE json file containing the video information (created with the &quot;–write-json&quot; option)
–cookies FILE file to read cookies from and dump cookie jar in
–cache-dir DIR Location in the filesystem where youtube-dl can store some downloaded information permanently. By default $XDG_CACHE_HOME/youtube-dl or ~/.cache/youtube-dl . At the
moment, only YouTube player files (for videos with obfuscated signatures) are cached, but that may change.
–no-cache-dir Disable filesystem caching
–rm-cache-dir Delete all filesystem cache files

Verbosity / Simulation Options:
-q, –quiet activates quiet mode
–no-warnings Ignore warnings
-s, –simulate do not download the video and do not write anything to disk
–skip-download do not download the video
-g, –get-url simulate, quiet but print URL
-e, –get-title simulate, quiet but print title
–get-id simulate, quiet but print id
–get-thumbnail simulate, quiet but print thumbnail URL
–get-description simulate, quiet but print video description
–get-duration simulate, quiet but print video length
–get-filename simulate, quiet but print output filename
–get-format simulate, quiet but print output format
-j, –dump-json simulate, quiet but print JSON information. See –output for a description of available keys.
–newline output progress bar as new lines
–no-progress do not print progress bar
–console-title display progress in console titlebar
-v, –verbose print various debugging information
–dump-intermediate-pages print downloaded pages to debug problems (very verbose)
–write-pages Write downloaded intermediary pages to files in the current directory to debug problems
–print-traffic Display sent and read HTTP traffic

Workarounds:
–encoding ENCODING Force the specified encoding (experimental)
–no-check-certificate Suppress HTTPS certificate validation.
–prefer-insecure Use an unencrypted connection to retrieve information about the video. (Currently supported only for YouTube)
–user-agent UA specify a custom user agent
–referer REF specify a custom referer, use if the video access is restricted to one domain
–add-header FIELD:VALUE specify a custom HTTP header and its value, separated by a colon ‘:’. You can use this option multiple times
–bidi-workaround Work around terminals that lack bidirectional text support. Requires bidiv or fribidi executable in PATH

Video Format Options:
-f, –format FORMAT video format code, specify the order of preference using slashes: &quot;-f 22/17/18&quot;. &quot;-f mp4&quot; and &quot;-f flv&quot; are also supported. You can also use the special names &quot;best&quot;,
&quot;bestvideo&quot;, &quot;bestaudio&quot;, &quot;worst&quot;, &quot;worstvideo&quot; and &quot;worstaudio&quot;. By default, youtube-dl will pick the best quality.
–all-formats download all available video formats
–prefer-free-formats prefer free video formats unless a specific one is requested
–max-quality FORMAT highest quality format to download
-F, –list-formats list all available formats

Subtitle Options:
–write-sub write subtitle file
–write-auto-sub write automatic subtitle file (youtube only)
–all-subs downloads all the available subtitles of the video
–list-subs lists all available subtitles for the video
–sub-format FORMAT subtitle format (default=srt) ([sbv/vtt] youtube only)
–sub-lang LANGS languages of the subtitles to download (optional) separated by commas, use IETF language tags like ‘en,pt’

Authentication Options:
-u, –username USERNAME account username
-p, –password PASSWORD account password
-2, –twofactor TWOFACTOR two-factor auth code
-n, –netrc use .netrc authentication data
–video-password PASSWORD video password (vimeo, smotri)

Post-processing Options:
-x, –extract-audio convert video files to audio-only files (requires ffmpeg or avconv and ffprobe or avprobe)
–audio-format FORMAT &quot;best&quot;, &quot;aac&quot;, &quot;vorbis&quot;, &quot;mp3&quot;, &quot;m4a&quot;, &quot;opus&quot;, or &quot;wav&quot;; best by default
–audio-quality QUALITY ffmpeg/avconv audio quality specification, insert a value between 0 (better) and 9 (worse) for VBR or a specific bitrate like 128K (default 5)
–recode-video FORMAT Encode the video to another format if necessary (currently supported: mp4|flv|ogg|webm|mkv)
-k, –keep-video keeps the video file on disk after the post-processing; the video is erased by default
–no-post-overwrites do not overwrite post-processed files; the post-processed files are overwritten by default
–embed-subs embed subtitles in the video (only for mp4 videos)
–embed-thumbnail embed thumbnail in the audio as cover art
–add-metadata write metadata to the video file
–xattrs write metadata to the video file’s xattrs (using dublin core and xdg standards)
–prefer-avconv Prefer avconv over ffmpeg for running the postprocessors (default)
–prefer-ffmpeg Prefer ffmpeg over avconv for running the postprocessors
–exec CMD Execute a command on the file after downloading, similar to find’s -exec syntax. Example: –exec ‘adb push {} /sdcard/Music/ &amp;&amp; rm {}’

[/bash]

FYI youtube-dl Documentation

ちなみにニコニコ動画に関しては下記でDLできます。

[bash]youtube-dl -u <ユーザー名> -p <パスワード> –extract-audio –audio-format mp3 –audio-quality 0 <動画のURL>[/bash]

[iframe src=”//www.slideshare.net/slideshow/embed_code/29236950″ width=”427″ height=”356″ frameborder=”0″ marginwidth=”0″ marginheight=”0″ scrolling=”no” style=”border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;” allowfullscreen] [/iframe]

MacでBitcasa Infinite Driveが開けなくなった時の対処法

Windowsだとこの問題は発生しないのだが、Macだと何故だかBitcasa Infinite Driveをマウントできなくなってしまう。
そこでBitcasaのヘルプデスクに質問してみたところ、下記の手順で復旧できるとのこと。
実際に試してみたのだが、バッチリ!
マウントできなくて困っている方はぜひ、お試しください。

  • Click on the Bitcasa MenuTray icon

スクリーンショット 2014-09-04 12.04.19

  • Go to preferences

スクリーンショット 2014-09-04 11.55.44

  • Under the account tab
  • Choose the unlink this computer option

スクリーンショット 2014-09-04 11.56.45

  • Make sure that Bitcasa is completely exited

スクリーンショット 2014-09-04 12.23.01

  • Relaunch the app

スクリーンショット 2014-09-04 12.24.00

GPG 鍵の取得に失敗しました: [Errno 14] curl#37 – “Couldn’t open file /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-x86_64”

fedupでfedora19 から20にアップグレードしたところ、GPG鍵のエラーが出て、yumコマンドがまともに使えなくなっていました。
とりあえず、
[bash]
yum update -y –nogpgcheck
[/bash]
とかして、しばらく放置して(ごまかして)いたのですが、流石によろしくないので直しました。
[bash]
rpm -q –whatprovides system-release
[/bash]
とすると、fedora-release-20-3.noarchと返って来たので
[bash]
pmkeys –import /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-20-x86_64
[/bash]
とやったら直りました。めでたし、めでたし

WindowsにおいてAFT HDDかどうかを見分ける方法

AFTとはAdvanced Format Technologyの略。HDDの一種。4K-HDDとも呼ぶらしい。
IT用語辞典e-Wordsによると、

ハードディスク製品の種類の一つで、従来より大きなサイズの物理セクタを採用したもの。セクタはディスクに記録するデータの最小単位で、長らく512バイトだったが、AFTでは8倍の4,096バイト(4KB/4KiB)のセクタを使用する。コンピュータで利用するにはBIOS/EFIやOSが対応している必要がある。

ハードディスクは使用前のフォーマット操作によってセクタ単位に細かく分割されるが、セクタとセクタの間には何も記録されない空白の領域ができるほか、セクタごとに誤り訂正符号(ECC)が付加されるため、セクタの数が多い(セクタあたりの容量が小さい)ほど、本来の記憶容量からのロスが大きくなる。近年はディスクの高記録密度化が進み、こうしたロスが無視できなくなってきたため、物理セクタ容量を4KBに拡張したAFTが登場した。

とのこと。

管理者権限でコマンドプロンプトを開き、 Fsutil fsinfo ntfsinfo c: とコマンドを打つ。
[bash]
C:\WINDOWS\system32>Fsutil fsinfo ntfsinfo c:
NTFS ボリューム シリアル番号 : 0x52046dab046d92b1
NTFS バージョン : 3.1
LFS バージョン : 2.0
セクター数 : 0x000000000c7507e0
総クラスター数 : 0x00000000018ea0fc
空きクラスター数 : 0x0000000000a782b5
総予約数 : 0x0000000000000780
セクターあたりのバイト数 : 512
物理セクターあたりのバイト数 : 512
クラスターあたりのバイト数 : 4096
ファイル セグメントあたりのバイト数 : 1024
ファイル セグメントあたりのクラスター数 : 0
MFT の有効なデータ長 : 0x0000000011240000
MFT 開始 LCN : 0x00000000000c0000
MFT2 開始 LCN : 0x00000000007f4fff
MFT ゾーン開始 : 0x0000000000981220
MFT ゾーン終了 : 0x0000000000981340
リソース マネージャー識別子 : 8F8A3455-4D5E-11E2-A93F-E406E76A58B7
[/bash]

物理セクターあたりのバイト数が512であれば非AFT、4096であればAFTと思われる。
これで本当に見分けることができるのかはわからない。
どなたか、知っている方がみえたら、ぜひともコメントください。

Mac OSXをアップグレードしたら、プリンタが使えなくなった

Mac OSXをアップグレードするとプリンタが使えなくなって、その度にハマるのですが、
手っ取り早いソリューションをご紹介。

私の環境ですが、

OS OSX 10.9
プリンタ Canon MP600

となっております。

古い機種ですが、バリバリ現役です。
皆さんの中にもOSのアップグレードに伴い、プリンタが使えなくなったという方が
いらっしゃるのではないでしょうか?

そんな方はぜひ、Gutenprint をお試しください。ダウンロードしてインストールするだけで
プリンタが使えるようになるかもしれません。

ぜひ、お試しください。

mysqlでcsvをインポートするためのコマンドライン

ブログをずっと放置していました。
ドメインを変更して画像やファイルへのリンクが全て切れていることにも気づいていませんでした。
絶対パス指定になっていたんですね。

一個、一個手でやっていたらキリが無いので、下記の手順でなおしてやろうと思いました。

1. phpMyAdminで記事のデータベースをcsvエクスポート
2. エクスポートしたcsvを開いてリンクのドメイン部分を一気に置換して上書き保存
3. phpMyAdminで上書き保存したcsvをインポート

だけど、なぜか失敗。(最初からcsvではなくsqlでエクスポートすれば良かった。。。)
で、phpMyAdminを使わずに直接mysqlコマンドでcsvをインポートしてやることにしました。
これも文字化けが発生したのですが、何とか下記の手順でうまくいったのでメモ。
ポイントは”set character_set_database=utf8″ですね。
utf8の場合は¥(円)と\(バックスラッシュ)が区別されるので注意。
macで\を入力するにはOption + ¥ です。
あと、今回は文字化けしたテーブルに上書きインポートしたかったので
“replace into table テーブル名” としましたが、テーブルが空ならばreplaceは書かなくても良いです。

mysql -uユーザー名 -pパスワード
use データベース名;
set character_set_database=utf8;
load data local infile "インポートするcsvのファイルパス/hoge.csv" replace into table テーブル名 fields terminated by ',' enclosed by '"' escaped by '\\' lines terminated by '\r\n';
quit

DevQuiz 惨敗でしたorz

DevQuiz惨敗でとても凹んでいます。
まず、得点はまさかの70点。 スタートライン(100点)に到達できなかった(ToT)

では私の間違っている回答とかひどいソースを晒します。一人ゲームのやつは答え(最短手数)がマジで知りたいです。
おかしいところはバシバシご指摘頂けると幸いです。

まずはウォーミングアップクイズ。これはヒントとか書いてありましたし、一発で全問正解です。

次ぎにWeb Game。

これは日本語プログラミング言語なでしこを使って解きました。動画をご覧下さい。

なでしこのブラウザ要素クリック命令を使って総当り攻撃してクリアしました。
わかりやすいように1手1手の間にスリープをかましてあります。
実際には一瞬で次の問題へどんどん進む感じです。
ソースは19行です。
[text]
母艦を最大化
Browserとはブラウザ
そのURLは「http://gdd-2011-quiz-japan.appspot.com/webgame/problem」
そのレイアウトは全体
Browserのブラウザ読込待機

BrowserのEmailに「********@gmail.com」をブラウザINPUT値設定
BrowserのPasswdに「********」をブラウザINPUT値設定
BrowserのsignInをブラウザ要素クリック
2秒待つ
Browserのブラウザ読込待機
iを0から1023まで繰り返す
0.000001秒待つ
jを0から1023まで繰り返す
Browserの「card{i}」をブラウザ要素クリック
HTML=Browserの「card{i}」をブラウザHTML取得
HTMLをメモ記入
Browserの「card{j}」をブラウザ要素クリック

「完了」と言う
終了
[/text]

そして時間をアホのように費やしてしまった一人ゲーム。
とても悔しいんだけど、これは一番楽しかった。

何回やっても不正解をくらいました。
これが私の回答です。(間違っています)
[text]
2
5
8
4
1
1
16
1
1
2
4
20
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8
7
11
15
15
15
15
14
15
21
21
12
21
16
21
21
13
14
21
21
21
21
15
8
14
21
8
11
10
21
13
15
21
14
13
16
13
21
8
13
12
1
5
9
11
7
7
1
6
6
17
1
3
3
1
21
21
16
16
16
6
21
21
21
10
9
6
10
21
[/text]

そして稚拙なソースです。

public class OneGame {

	public static void main(String[] args) {
		int[] result1 = new int[100];
		int[] result2 = new int[100];
		int[] result3 = new int[100];
		int[] result4 = new int[100];
		int[] result5 = new int[100];
		int[] result6 = new int[100];

		result1 = Turn1();
		result2 = Turn2();
		result3 = Turn3();
		result4 = Turn4();
		result5 = Turn5();
		result6 = Turn6();

		for(int i=0;i<100;i++){
			if(result1[i]<=result2[i] && result1[i]<=result3[i] && result1[i]<=result4[i] && result1[i]<=result5[i] && result1[i]<=result6[i]){
				//System.out.println((i+1)+"	"+result1[i]+"	1");
				System.out.println(result1[i]);
			}
			else if(result2[i]<=result1[i] && result2[i]<=result3[i] && result2[i]<=result4[i] && result2[i]<=result5[i] && result2[i]<=result6[i]){
				//System.out.println((i+1)+"	"+result2[i]+"	2");
				System.out.println(result2[i]);
			}
			else if(result3[i]<=result1[i] && result3[i]<=result2[i] && result3[i]<=result4[i] && result3[i]<=result5[i] && result3[i]<=result6[i]){
				//System.out.println((i+1)+"	"+result3[i]+"	3");
				System.out.println(result3[i]);
			}
			else if(result4[i]<=result1[i] && result4[i]<=result2[i] && result4[i]<=result3[i] && result4[i]<=result5[i] && result4[i]<=result6[i]){
				//System.out.println((i+1)+"	"+result4[i]+"	4");
				System.out.println(result4[i]);
			}
			else if(result5[i]<=result1[i] && result5[i]<=result2[i] && result5[i]<=result3[i] && result5[i]<=result4[i] && result5[i]<=result6[i]){
				//System.out.println((i+1)+"	"+result5[i]+"	5");
				System.out.println(result5[i]);
			}
			else if(result6[i]<=result1[i] && result6[i]<=result2[i] && result6[i]<=result3[i] && result6[i]<=result4[i] && result6[i]<=result5[i]){
				//System.out.println((i+1)+"	"+result6[i]+"	6");
				System.out.println(result6[i]);
			}
		}
	}

	private static int[] Turn1(){
		int sum =0;
		int Opr =0;
		int[] flag = new int[10];
		int[] turn = new int[100];
		Object[][] testcase = {
				{10,11},
				{0,9,9},
				{81,67,83,86},
				{11,22,30},
				{0},
				{5},
				{999999},
				{1000000},
				{5,10},
				{0,10,11},
				{10,20,21,22,23},
				{422808,211404,761062,845625,491519},
				{13,64,68,17,19},
				{93,31,72,65,75},
				{84,99,41,25,93},
				{2,72,63,58,66},
				{62,79,49,98,67},
				{87,31,37,36,95},
				{65,15,12,43,91},
				{34,71,60,41,95},
				{96,54,69,16,96},
				{73,69,64,92,24},
				{4,69,91,97,20,90,21,62,90,13},
				{75,72,44,100,96,12,99,59,4,97},
				{0,79,30,83,46,56,61,49,60,89},
				{10,72,2,7,75,26,82,30,57,2},
				{73,41,24,43,21,42,76,26,24,9},
				{59,77,32,6,23,87,97,23,43,32},
				{100,20,12,96,63,16,14,21,90,31},
				{6,18,19,51,54,70,10,96,80,62},
				{31,11,54,88,48,22,41,17,23,91},
				{45,59,56,4,13,95,65,81,64,79},
				{990492,953221,920810,925284,861402},
				{899023,958739,958208,836961,925983},
				{911568,986679,994864,913816,813822},
				{956961,827371,995429,889788,892175},
				{839452,878345,954982,995491,834352},
				{802331,957687,915094,875111,832466},
				{882981,867664,896820,809482,923023},
				{829415,814512,940226,978115,831827},
				{806232,837813,961698,844056,983721},
				{923071,972399,982766,907131,850043},
				{822380,818586,871538,983745,960983,888003,964137,810508,899267,973336},
				{900100,982013,808539,976012,951908,845870,821011,870749,835719,886450},
				{838102,882622,987311,850465,853342,924716,844930,821971,847907,921772},
				{960016,863774,990144,845274,819333,989933,990153,959626,915206,820545},
				{804154,989730,955129,987771,980677,943257,812049,869455,911280,997259},
				{914490,957061,893002,957989,900964,988645,967661,956006,920414,862668},
				{861248,833995,928360,905682,825217,819327,966070,921564,807581,962290},
				{957683,939387,929149,876470,949392,911001,816772,936305,874797,818163},
				{806342,944111,889814,947927,923905,816274,952687,933739,866972,851059},
				{927477,808550,854154,941801,808248,837432,905868,994125,928239,895436},
				{988355,859418,943243,85,31,908839,5,967426,81,76},
				{920885,96,93,81,91,910368,815514,859321,10,981845},
				{44,912531,853040,12,960455,34,47,950435,88,863403},
				{73,922852,948456,834894,2,960106,78,65,842099,94},
				{803747,907241,93,48,909454,6,831646,39,51,992766},
				{876093,972202,49,81,880075,870892,80,54,953444,70},
				{98,920283,65,72,926740,84,850577,61,971311,876298},
				{55,951463,27,65,51,931780,802803,822026,858115,2},
				{921210,76,96,56,883540,45,802952,875906,897253,13},
				{959601,94,79,907610,74,930570,925235,100,51,912353},
				{57,990272,83,72,872502,9,93,902753,959862,914956},
				{932080,13,918249,845303,11,952276,18,865247,47,72},
				{861980,903396,83,35,944843,28,20,835860,11,826473},
				{936501,832727,66,8,42,52,55,956372,985537,917775},
				{847993,36,36,69,968095,945997,94,941853,963485,29},
				{823023,909096,962680,41,41,54,883159,848431,94,0},
				{946709,91,23,949782,863270,74,851065,92,39,930297},
				{837100,803780,860731,994749,69,84,9,27,29,988495},
				{29,802154,817777,71,24,53,960860,991250,900741,90},
				{879442,44,71,909470,55,830018,953556,870500,71,48},
				{128045,198660,195045,292430,938475,848800,658025,18395,285990},
				{105845,925965,42160,838685,448125,867103,278575,425151,715515,408045},
				{348100,453269,401085,893840,905165,306894,636900,922294,718150},
				{100630,63625,778340,311801,963520,43070,47584,476250,681507,550577},
				{491085,978917,858207,935090,442655,382695,788275,108640,460810,548910},
				{501580,624375,760010,976280,850614,3461,238315,948471,122520},
				{35065,514755,37685,48695,966305,737615,768375,159990,984840,275120},
				{531255,280470,150040,191880,883375,779620,215615,391315,941299},
				{11965,264895,180705,438700,341955,152125,970615,108987,376215},
				{385589,222710,550825,8590,470980,857260,871945},
				{548095,171865,541530,47860,52915,556140,345710},
				{497425,532135,891590,115850,321655,141230,319363},
				{131145,824840,61682,750820,456200,448650,805700,406905,285575,296420},
				{658160,57975,655620,73875,868865,157425,221280,230000,303105,788835},
				{129505,225175,889478,183482,497060,601970,216510,328200,719735},
				{633558,9235,550805,186875,950260,693970,626480,312052,355210},
				{289493,206540,873310,579285,292110,75415,518399,277095,531205,201726},
				{4600,186240,633895,291565,880145,415980,510677,571620},
				{292940,358186,173775,618978,554415,145015,744130,263230,998825},
				{894815,519560,841626,226210,238400,861200,551280,305785,544815},
				{42173,442414,28217,528438,806372,831256,52691,469314,527242},
				{648135,857252,707497,674046,907447},
				{654777,56384,576619,28417,388568,631976,468675},
				{607408,233855,467335,999846,970166,891046,186959,190439,647967},
				{412288,567395,46370,807131,318180,747962},
				{346635,30738,802843,518662,83440},
				{34164,676647,72118},
				{67490,35919,955396,896463,760949,602740,657628,626224,85892,272851}
		};


		for(int i=0;i<testcase.length;i++){

			//合計フラグの初期化
			sum=0;

			//フラグ配列の初期化
			for(int j=0;j<10;j++){
				flag[j]=0;
			}

			//turnの初期化
			turn[i]=0;

			//全要素の末尾が0もしくは5になるまで各要素単位への処理を繰り返す
			while(sum!=testcase[i].length){

				sum=0;

				//フラグ配列の初期化
				for(int j=0;j<10;j++){
					flag[j]=0;
				}

				//各要素の末尾が0もしくは5であるかの判定処理
				for(int k=0;k<testcase[i].length;k++){
					if(flag[k]==0 && (String.valueOf(testcase[i][k]).endsWith("0")==true || String.valueOf(testcase[i][k]).endsWith("5")==true)){
						flag[k] =1;
					}
					sum += flag[k];
				}

				//全要素の末尾が0もしくは5である場合はturnを+1して削除
				if(sum==testcase[i].length){
					for(int n=0;n<testcase[i].length;n++){
						testcase[i][n]=null;
					}
					turn[i]++;
				}

				//違えば1/2にする。
				else if(sum!=testcase[i].length){
					for(int m=0;m<testcase[i].length;m++){
						Opr=(Integer) testcase[i][m];
						testcase[i][m]=Opr/2;
					}
					turn[i]++;
				}
			}
			//System.out.println(turn[i]);
		}
		return turn;
	}

	private static int[] Turn2(){
		int sumA = 0;
		int sumB = 0;
		int Opr = 0;
		int Opr2 = 0;
		int[] turn = new int[100];
		int[] flag = new int[10];
		int[] next = new int[10];

		Object[][] testcase = {
				{10,11},
				{0,9,9},
				{81,67,83,86},
				{11,22,30},
				{0},
				{5},
				{999999},
				{1000000},
				{5,10},
				{0,10,11},
				{10,20,21,22,23},
				{422808,211404,761062,845625,491519},
				{13,64,68,17,19},
				{93,31,72,65,75},
				{84,99,41,25,93},
				{2,72,63,58,66},
				{62,79,49,98,67},
				{87,31,37,36,95},
				{65,15,12,43,91},
				{34,71,60,41,95},
				{96,54,69,16,96},
				{73,69,64,92,24},
				{4,69,91,97,20,90,21,62,90,13},
				{75,72,44,100,96,12,99,59,4,97},
				{0,79,30,83,46,56,61,49,60,89},
				{10,72,2,7,75,26,82,30,57,2},
				{73,41,24,43,21,42,76,26,24,9},
				{59,77,32,6,23,87,97,23,43,32},
				{100,20,12,96,63,16,14,21,90,31},
				{6,18,19,51,54,70,10,96,80,62},
				{31,11,54,88,48,22,41,17,23,91},
				{45,59,56,4,13,95,65,81,64,79},
				{990492,953221,920810,925284,861402},
				{899023,958739,958208,836961,925983},
				{911568,986679,994864,913816,813822},
				{956961,827371,995429,889788,892175},
				{839452,878345,954982,995491,834352},
				{802331,957687,915094,875111,832466},
				{882981,867664,896820,809482,923023},
				{829415,814512,940226,978115,831827},
				{806232,837813,961698,844056,983721},
				{923071,972399,982766,907131,850043},
				{822380,818586,871538,983745,960983,888003,964137,810508,899267,973336},
				{900100,982013,808539,976012,951908,845870,821011,870749,835719,886450},
				{838102,882622,987311,850465,853342,924716,844930,821971,847907,921772},
				{960016,863774,990144,845274,819333,989933,990153,959626,915206,820545},
				{804154,989730,955129,987771,980677,943257,812049,869455,911280,997259},
				{914490,957061,893002,957989,900964,988645,967661,956006,920414,862668},
				{861248,833995,928360,905682,825217,819327,966070,921564,807581,962290},
				{957683,939387,929149,876470,949392,911001,816772,936305,874797,818163},
				{806342,944111,889814,947927,923905,816274,952687,933739,866972,851059},
				{927477,808550,854154,941801,808248,837432,905868,994125,928239,895436},
				{988355,859418,943243,85,31,908839,5,967426,81,76},
				{920885,96,93,81,91,910368,815514,859321,10,981845},
				{44,912531,853040,12,960455,34,47,950435,88,863403},
				{73,922852,948456,834894,2,960106,78,65,842099,94},
				{803747,907241,93,48,909454,6,831646,39,51,992766},
				{876093,972202,49,81,880075,870892,80,54,953444,70},
				{98,920283,65,72,926740,84,850577,61,971311,876298},
				{55,951463,27,65,51,931780,802803,822026,858115,2},
				{921210,76,96,56,883540,45,802952,875906,897253,13},
				{959601,94,79,907610,74,930570,925235,100,51,912353},
				{57,990272,83,72,872502,9,93,902753,959862,914956},
				{932080,13,918249,845303,11,952276,18,865247,47,72},
				{861980,903396,83,35,944843,28,20,835860,11,826473},
				{936501,832727,66,8,42,52,55,956372,985537,917775},
				{847993,36,36,69,968095,945997,94,941853,963485,29},
				{823023,909096,962680,41,41,54,883159,848431,94,0},
				{946709,91,23,949782,863270,74,851065,92,39,930297},
				{837100,803780,860731,994749,69,84,9,27,29,988495},
				{29,802154,817777,71,24,53,960860,991250,900741,90},
				{879442,44,71,909470,55,830018,953556,870500,71,48},
				{128045,198660,195045,292430,938475,848800,658025,18395,285990},
				{105845,925965,42160,838685,448125,867103,278575,425151,715515,408045},
				{348100,453269,401085,893840,905165,306894,636900,922294,718150},
				{100630,63625,778340,311801,963520,43070,47584,476250,681507,550577},
				{491085,978917,858207,935090,442655,382695,788275,108640,460810,548910},
				{501580,624375,760010,976280,850614,3461,238315,948471,122520},
				{35065,514755,37685,48695,966305,737615,768375,159990,984840,275120},
				{531255,280470,150040,191880,883375,779620,215615,391315,941299},
				{11965,264895,180705,438700,341955,152125,970615,108987,376215},
				{385589,222710,550825,8590,470980,857260,871945},
				{548095,171865,541530,47860,52915,556140,345710},
				{497425,532135,891590,115850,321655,141230,319363},
				{131145,824840,61682,750820,456200,448650,805700,406905,285575,296420},
				{658160,57975,655620,73875,868865,157425,221280,230000,303105,788835},
				{129505,225175,889478,183482,497060,601970,216510,328200,719735},
				{633558,9235,550805,186875,950260,693970,626480,312052,355210},
				{289493,206540,873310,579285,292110,75415,518399,277095,531205,201726},
				{4600,186240,633895,291565,880145,415980,510677,571620},
				{292940,358186,173775,618978,554415,145015,744130,263230,998825},
				{894815,519560,841626,226210,238400,861200,551280,305785,544815},
				{42173,442414,28217,528438,806372,831256,52691,469314,527242},
				{648135,857252,707497,674046,907447},
				{654777,56384,576619,28417,388568,631976,468675},
				{607408,233855,467335,999846,970166,891046,186959,190439,647967},
				{412288,567395,46370,807131,318180,747962},
				{346635,30738,802843,518662,83440},
				{34164,676647,72118},
				{67490,35919,955396,896463,760949,602740,657628,626224,85892,272851}
		};

		for(int i=0;i<testcase.length;i++){

			//合計フラグの初期化
			sumA=0;
			sumB=0;

			//フラグ配列の初期化
			for(int j=0;j<10;j++){
				flag[j]=0;
				next[j]=0;
			}

			//turnの初期化
			turn[i]=0;

			//全要素の末尾が0もしくは5になるまで各要素単位への処理を繰り返す
			while(sumA!=testcase[i].length){

				sumA=0;
				sumB=0;

				//フラグ配列の初期化
				for(int j=0;j<10;j++){
					flag[j]=0;
					next[j]=0;
				}

				//とにかく1/2にする。
				for(int m=0;m<testcase[i].length;m++){
					if(testcase[i][m]==null){
						testcase[i][m]=0;
					}
					Opr = (Integer)testcase[i][m];
					testcase[i][m]=Opr/2;
				}
				turn[i]++;

				//各要素の末尾が0もしくは5であるかの判定処理
				for(int k=0;k<testcase[i].length;k++){
					if(flag[k]==0 && (String.valueOf(testcase[i][k]).endsWith("0")==true || String.valueOf(testcase[i][k]).endsWith("5")==true)){
						flag[k] =1;
					}
					sumA += flag[k];
				}

				//末尾が0もしくは1であるかの判定処理
				for(int k=0;k<testcase[i].length;k++){
					if(next[k]==0 && (String.valueOf(testcase[i][k]).endsWith("0")==true || String.valueOf(testcase[i][k]).endsWith("1")==true)){
						next[k] =1;
					}
					sumB += next[k];
				}

				//1つでも末尾が0もしくは5の要素がある場合削除
				if(sumA>0){
					for(int k=0;k<testcase[i].length;k++){
						if(testcase[i][k]==null){
							testcase[i][k]=0;
						}
						Opr2 = (Integer)testcase[i][k];
						if(flag[k]==1 && sumA>=sumB){
							testcase[i][k]=null;
						}
						else{
							testcase[i][k]=Opr2/2;
						}
					}
					turn[i]++;
				}
			}
			//System.out.println(turn[i]);
		}
		return turn;
	}

	private static int[] Turn3(){
		int sumA = 0;
		int sumB = 0;
		int Opr = 0;
		int Opr2 =0;
		int[] flag = new int[10];
		int[] next = new int[10];
		int[] turn = new int[100];
		Object[][] testcase = {
				{10,11},
				{0,9,9},
				{81,67,83,86},
				{11,22,30},
				{0},
				{5},
				{999999},
				{1000000},
				{5,10},
				{0,10,11},
				{10,20,21,22,23},
				{422808,211404,761062,845625,491519},
				{13,64,68,17,19},
				{93,31,72,65,75},
				{84,99,41,25,93},
				{2,72,63,58,66},
				{62,79,49,98,67},
				{87,31,37,36,95},
				{65,15,12,43,91},
				{34,71,60,41,95},
				{96,54,69,16,96},
				{73,69,64,92,24},
				{4,69,91,97,20,90,21,62,90,13},
				{75,72,44,100,96,12,99,59,4,97},
				{0,79,30,83,46,56,61,49,60,89},
				{10,72,2,7,75,26,82,30,57,2},
				{73,41,24,43,21,42,76,26,24,9},
				{59,77,32,6,23,87,97,23,43,32},
				{100,20,12,96,63,16,14,21,90,31},
				{6,18,19,51,54,70,10,96,80,62},
				{31,11,54,88,48,22,41,17,23,91},
				{45,59,56,4,13,95,65,81,64,79},
				{990492,953221,920810,925284,861402},
				{899023,958739,958208,836961,925983},
				{911568,986679,994864,913816,813822},
				{956961,827371,995429,889788,892175},
				{839452,878345,954982,995491,834352},
				{802331,957687,915094,875111,832466},
				{882981,867664,896820,809482,923023},
				{829415,814512,940226,978115,831827},
				{806232,837813,961698,844056,983721},
				{923071,972399,982766,907131,850043},
				{822380,818586,871538,983745,960983,888003,964137,810508,899267,973336},
				{900100,982013,808539,976012,951908,845870,821011,870749,835719,886450},
				{838102,882622,987311,850465,853342,924716,844930,821971,847907,921772},
				{960016,863774,990144,845274,819333,989933,990153,959626,915206,820545},
				{804154,989730,955129,987771,980677,943257,812049,869455,911280,997259},
				{914490,957061,893002,957989,900964,988645,967661,956006,920414,862668},
				{861248,833995,928360,905682,825217,819327,966070,921564,807581,962290},
				{957683,939387,929149,876470,949392,911001,816772,936305,874797,818163},
				{806342,944111,889814,947927,923905,816274,952687,933739,866972,851059},
				{927477,808550,854154,941801,808248,837432,905868,994125,928239,895436},
				{988355,859418,943243,85,31,908839,5,967426,81,76},
				{920885,96,93,81,91,910368,815514,859321,10,981845},
				{44,912531,853040,12,960455,34,47,950435,88,863403},
				{73,922852,948456,834894,2,960106,78,65,842099,94},
				{803747,907241,93,48,909454,6,831646,39,51,992766},
				{876093,972202,49,81,880075,870892,80,54,953444,70},
				{98,920283,65,72,926740,84,850577,61,971311,876298},
				{55,951463,27,65,51,931780,802803,822026,858115,2},
				{921210,76,96,56,883540,45,802952,875906,897253,13},
				{959601,94,79,907610,74,930570,925235,100,51,912353},
				{57,990272,83,72,872502,9,93,902753,959862,914956},
				{932080,13,918249,845303,11,952276,18,865247,47,72},
				{861980,903396,83,35,944843,28,20,835860,11,826473},
				{936501,832727,66,8,42,52,55,956372,985537,917775},
				{847993,36,36,69,968095,945997,94,941853,963485,29},
				{823023,909096,962680,41,41,54,883159,848431,94,0},
				{946709,91,23,949782,863270,74,851065,92,39,930297},
				{837100,803780,860731,994749,69,84,9,27,29,988495},
				{29,802154,817777,71,24,53,960860,991250,900741,90},
				{879442,44,71,909470,55,830018,953556,870500,71,48},
				{128045,198660,195045,292430,938475,848800,658025,18395,285990},
				{105845,925965,42160,838685,448125,867103,278575,425151,715515,408045},
				{348100,453269,401085,893840,905165,306894,636900,922294,718150},
				{100630,63625,778340,311801,963520,43070,47584,476250,681507,550577},
				{491085,978917,858207,935090,442655,382695,788275,108640,460810,548910},
				{501580,624375,760010,976280,850614,3461,238315,948471,122520},
				{35065,514755,37685,48695,966305,737615,768375,159990,984840,275120},
				{531255,280470,150040,191880,883375,779620,215615,391315,941299},
				{11965,264895,180705,438700,341955,152125,970615,108987,376215},
				{385589,222710,550825,8590,470980,857260,871945},
				{548095,171865,541530,47860,52915,556140,345710},
				{497425,532135,891590,115850,321655,141230,319363},
				{131145,824840,61682,750820,456200,448650,805700,406905,285575,296420},
				{658160,57975,655620,73875,868865,157425,221280,230000,303105,788835},
				{129505,225175,889478,183482,497060,601970,216510,328200,719735},
				{633558,9235,550805,186875,950260,693970,626480,312052,355210},
				{289493,206540,873310,579285,292110,75415,518399,277095,531205,201726},
				{4600,186240,633895,291565,880145,415980,510677,571620},
				{292940,358186,173775,618978,554415,145015,744130,263230,998825},
				{894815,519560,841626,226210,238400,861200,551280,305785,544815},
				{42173,442414,28217,528438,806372,831256,52691,469314,527242},
				{648135,857252,707497,674046,907447},
				{654777,56384,576619,28417,388568,631976,468675},
				{607408,233855,467335,999846,970166,891046,186959,190439,647967},
				{412288,567395,46370,807131,318180,747962},
				{346635,30738,802843,518662,83440},
				{34164,676647,72118},
				{67490,35919,955396,896463,760949,602740,657628,626224,85892,272851}
		};


		for(int i=0;i<testcase.length;i++){

			//合計フラグの初期化
			sumA=0;
			sumB=0;

			//フラグ配列の初期化
			for(int j=0;j<10;j++){
				flag[j]=0;
				next[j]=0;
			}

			//turnの初期化
			turn[i]=0;

			//全要素の末尾が0もしくは5になるまで各要素単位への処理を繰り返す
			while(sumA!=testcase[i].length){

				sumA=0;
				sumB=0;

				//フラグ配列の初期化
				for(int j=0;j<10;j++){
					flag[j]=0;
					next[j]=0;
				}


				//末尾が0もしくは5であるかの判定処理
				for(int k=0;k<testcase[i].length;k++){
					if(flag[k]==0 && (String.valueOf(testcase[i][k]).endsWith("0")==true || String.valueOf(testcase[i][k]).endsWith("5")==true)){
						flag[k] =1;
					}
					sumA += flag[k];
				}

				//末尾が0もしくは1であるかの判定処理
				for(int k=0;k<testcase[i].length;k++){
					if(next[k]==0 && (String.valueOf(testcase[i][k]).endsWith("0")==true || String.valueOf(testcase[i][k]).endsWith("1")==true)){
						next[k] =1;
					}
					sumB += next[k];
				}

				//1つでも末尾が0もしくは5である場合は削除してturnを+1
				if(sumA>0){
					for(int n=0;n<testcase[i].length;n++){
						if(testcase[i][n]==null){
							testcase[i][n]=0;
						}
						Opr2 =(Integer)testcase[i][n];
						if(flag[n]==1 && sumA>=sumB && Opr2>=100 ){
							testcase[i][n]=null;
						}
						else{
							testcase[i][n]=Opr2/2;
						}
					}
					turn[i]++;
				}
				//違えば1/2にする。
				else{
					for(int m=0;m<testcase[i].length;m++){
						if(testcase[i][m]==null){
							testcase[i][m]=0;
						}
						Opr=(Integer) testcase[i][m];
						testcase[i][m]=Opr/2;
					}
					turn[i]++;
				}
			}
			//System.out.println(turn[i]);
		}
		return turn;
	}

	private static int[] Turn4(){
		int sum = 0;
		int Opr = 0;
		int[] turn = new int[100];
		int[] flag = new int[10];
		Object[][] testcase = {
				{10,11},
				{0,9,9},
				{81,67,83,86},
				{11,22,30},
				{0},
				{5},
				{999999},
				{1000000},
				{5,10},
				{0,10,11},
				{10,20,21,22,23},
				{422808,211404,761062,845625,491519},
				{13,64,68,17,19},
				{93,31,72,65,75},
				{84,99,41,25,93},
				{2,72,63,58,66},
				{62,79,49,98,67},
				{87,31,37,36,95},
				{65,15,12,43,91},
				{34,71,60,41,95},
				{96,54,69,16,96},
				{73,69,64,92,24},
				{4,69,91,97,20,90,21,62,90,13},
				{75,72,44,100,96,12,99,59,4,97},
				{0,79,30,83,46,56,61,49,60,89},
				{10,72,2,7,75,26,82,30,57,2},
				{73,41,24,43,21,42,76,26,24,9},
				{59,77,32,6,23,87,97,23,43,32},
				{100,20,12,96,63,16,14,21,90,31},
				{6,18,19,51,54,70,10,96,80,62},
				{31,11,54,88,48,22,41,17,23,91},
				{45,59,56,4,13,95,65,81,64,79},
				{990492,953221,920810,925284,861402},
				{899023,958739,958208,836961,925983},
				{911568,986679,994864,913816,813822},
				{956961,827371,995429,889788,892175},
				{839452,878345,954982,995491,834352},
				{802331,957687,915094,875111,832466},
				{882981,867664,896820,809482,923023},
				{829415,814512,940226,978115,831827},
				{806232,837813,961698,844056,983721},
				{923071,972399,982766,907131,850043},
				{822380,818586,871538,983745,960983,888003,964137,810508,899267,973336},
				{900100,982013,808539,976012,951908,845870,821011,870749,835719,886450},
				{838102,882622,987311,850465,853342,924716,844930,821971,847907,921772},
				{960016,863774,990144,845274,819333,989933,990153,959626,915206,820545},
				{804154,989730,955129,987771,980677,943257,812049,869455,911280,997259},
				{914490,957061,893002,957989,900964,988645,967661,956006,920414,862668},
				{861248,833995,928360,905682,825217,819327,966070,921564,807581,962290},
				{957683,939387,929149,876470,949392,911001,816772,936305,874797,818163},
				{806342,944111,889814,947927,923905,816274,952687,933739,866972,851059},
				{927477,808550,854154,941801,808248,837432,905868,994125,928239,895436},
				{988355,859418,943243,85,31,908839,5,967426,81,76},
				{920885,96,93,81,91,910368,815514,859321,10,981845},
				{44,912531,853040,12,960455,34,47,950435,88,863403},
				{73,922852,948456,834894,2,960106,78,65,842099,94},
				{803747,907241,93,48,909454,6,831646,39,51,992766},
				{876093,972202,49,81,880075,870892,80,54,953444,70},
				{98,920283,65,72,926740,84,850577,61,971311,876298},
				{55,951463,27,65,51,931780,802803,822026,858115,2},
				{921210,76,96,56,883540,45,802952,875906,897253,13},
				{959601,94,79,907610,74,930570,925235,100,51,912353},
				{57,990272,83,72,872502,9,93,902753,959862,914956},
				{932080,13,918249,845303,11,952276,18,865247,47,72},
				{861980,903396,83,35,944843,28,20,835860,11,826473},
				{936501,832727,66,8,42,52,55,956372,985537,917775},
				{847993,36,36,69,968095,945997,94,941853,963485,29},
				{823023,909096,962680,41,41,54,883159,848431,94,0},
				{946709,91,23,949782,863270,74,851065,92,39,930297},
				{837100,803780,860731,994749,69,84,9,27,29,988495},
				{29,802154,817777,71,24,53,960860,991250,900741,90},
				{879442,44,71,909470,55,830018,953556,870500,71,48},
				{128045,198660,195045,292430,938475,848800,658025,18395,285990},
				{105845,925965,42160,838685,448125,867103,278575,425151,715515,408045},
				{348100,453269,401085,893840,905165,306894,636900,922294,718150},
				{100630,63625,778340,311801,963520,43070,47584,476250,681507,550577},
				{491085,978917,858207,935090,442655,382695,788275,108640,460810,548910},
				{501580,624375,760010,976280,850614,3461,238315,948471,122520},
				{35065,514755,37685,48695,966305,737615,768375,159990,984840,275120},
				{531255,280470,150040,191880,883375,779620,215615,391315,941299},
				{11965,264895,180705,438700,341955,152125,970615,108987,376215},
				{385589,222710,550825,8590,470980,857260,871945},
				{548095,171865,541530,47860,52915,556140,345710},
				{497425,532135,891590,115850,321655,141230,319363},
				{131145,824840,61682,750820,456200,448650,805700,406905,285575,296420},
				{658160,57975,655620,73875,868865,157425,221280,230000,303105,788835},
				{129505,225175,889478,183482,497060,601970,216510,328200,719735},
				{633558,9235,550805,186875,950260,693970,626480,312052,355210},
				{289493,206540,873310,579285,292110,75415,518399,277095,531205,201726},
				{4600,186240,633895,291565,880145,415980,510677,571620},
				{292940,358186,173775,618978,554415,145015,744130,263230,998825},
				{894815,519560,841626,226210,238400,861200,551280,305785,544815},
				{42173,442414,28217,528438,806372,831256,52691,469314,527242},
				{648135,857252,707497,674046,907447},
				{654777,56384,576619,28417,388568,631976,468675},
				{607408,233855,467335,999846,970166,891046,186959,190439,647967},
				{412288,567395,46370,807131,318180,747962},
				{346635,30738,802843,518662,83440},
				{34164,676647,72118},
				{67490,35919,955396,896463,760949,602740,657628,626224,85892,272851}
		};

		for(int i=0;i<testcase.length;i++){

			//合計フラグの初期化
			sum=0;

			//フラグ配列の初期化
			for(int j=0;j<10;j++){
				flag[j]=0;
			}

			//turnの初期化
			turn[i]=0;

			//全要素の末尾が0もしくは5になるまで各要素単位への処理を繰り返す
			while(sum!=testcase[i].length){

				sum=0;

				//フラグ配列の初期化
				for(int j=0;j<10;j++){
					flag[j]=0;
				}

				//とにかく1/2にする。
				for(int m=0;m<testcase[i].length;m++){
					if(testcase[i][m]==null){
						testcase[i][m]=0;
					}
					Opr = (Integer)testcase[i][m];
					testcase[i][m]=Opr/2;
				}
				turn[i]++;

				//各要素の末尾が0もしくは5であるかの判定処理
				for(int k=0;k<testcase[i].length;k++){
					if(flag[k]==0 && (String.valueOf(testcase[i][k]).endsWith("0")==true || String.valueOf(testcase[i][k]).endsWith("5")==true)){
						flag[k] =1;
					}
					sum += flag[k];
				}

				//1つでも末尾が0もしくは5の要素がある場合削除
				if(sum>0){
					for(int k=0;k<testcase[i].length;k++){
						if(flag[k]==1){
							testcase[i][k]=null;
						}
					}
					turn[i]++;
				}
			}
			//System.out.println(turn[i]);
		}
		return turn;
	}

	private static int[] Turn5(){
		int sumA = 0;
		int sumB = 0;
		int Opr = 0;
		int Opr2 =0;
		int[] flag = new int[10];
		int[] next = new int[10];
		int[] turn = new int[100];
		Object[][] testcase = {
				{10,11},
				{0,9,9},
				{81,67,83,86},
				{11,22,30},
				{0},
				{5},
				{999999},
				{1000000},
				{5,10},
				{0,10,11},
				{10,20,21,22,23},
				{422808,211404,761062,845625,491519},
				{13,64,68,17,19},
				{93,31,72,65,75},
				{84,99,41,25,93},
				{2,72,63,58,66},
				{62,79,49,98,67},
				{87,31,37,36,95},
				{65,15,12,43,91},
				{34,71,60,41,95},
				{96,54,69,16,96},
				{73,69,64,92,24},
				{4,69,91,97,20,90,21,62,90,13},
				{75,72,44,100,96,12,99,59,4,97},
				{0,79,30,83,46,56,61,49,60,89},
				{10,72,2,7,75,26,82,30,57,2},
				{73,41,24,43,21,42,76,26,24,9},
				{59,77,32,6,23,87,97,23,43,32},
				{100,20,12,96,63,16,14,21,90,31},
				{6,18,19,51,54,70,10,96,80,62},
				{31,11,54,88,48,22,41,17,23,91},
				{45,59,56,4,13,95,65,81,64,79},
				{990492,953221,920810,925284,861402},
				{899023,958739,958208,836961,925983},
				{911568,986679,994864,913816,813822},
				{956961,827371,995429,889788,892175},
				{839452,878345,954982,995491,834352},
				{802331,957687,915094,875111,832466},
				{882981,867664,896820,809482,923023},
				{829415,814512,940226,978115,831827},
				{806232,837813,961698,844056,983721},
				{923071,972399,982766,907131,850043},
				{822380,818586,871538,983745,960983,888003,964137,810508,899267,973336},
				{900100,982013,808539,976012,951908,845870,821011,870749,835719,886450},
				{838102,882622,987311,850465,853342,924716,844930,821971,847907,921772},
				{960016,863774,990144,845274,819333,989933,990153,959626,915206,820545},
				{804154,989730,955129,987771,980677,943257,812049,869455,911280,997259},
				{914490,957061,893002,957989,900964,988645,967661,956006,920414,862668},
				{861248,833995,928360,905682,825217,819327,966070,921564,807581,962290},
				{957683,939387,929149,876470,949392,911001,816772,936305,874797,818163},
				{806342,944111,889814,947927,923905,816274,952687,933739,866972,851059},
				{927477,808550,854154,941801,808248,837432,905868,994125,928239,895436},
				{988355,859418,943243,85,31,908839,5,967426,81,76},
				{920885,96,93,81,91,910368,815514,859321,10,981845},
				{44,912531,853040,12,960455,34,47,950435,88,863403},
				{73,922852,948456,834894,2,960106,78,65,842099,94},
				{803747,907241,93,48,909454,6,831646,39,51,992766},
				{876093,972202,49,81,880075,870892,80,54,953444,70},
				{98,920283,65,72,926740,84,850577,61,971311,876298},
				{55,951463,27,65,51,931780,802803,822026,858115,2},
				{921210,76,96,56,883540,45,802952,875906,897253,13},
				{959601,94,79,907610,74,930570,925235,100,51,912353},
				{57,990272,83,72,872502,9,93,902753,959862,914956},
				{932080,13,918249,845303,11,952276,18,865247,47,72},
				{861980,903396,83,35,944843,28,20,835860,11,826473},
				{936501,832727,66,8,42,52,55,956372,985537,917775},
				{847993,36,36,69,968095,945997,94,941853,963485,29},
				{823023,909096,962680,41,41,54,883159,848431,94,0},
				{946709,91,23,949782,863270,74,851065,92,39,930297},
				{837100,803780,860731,994749,69,84,9,27,29,988495},
				{29,802154,817777,71,24,53,960860,991250,900741,90},
				{879442,44,71,909470,55,830018,953556,870500,71,48},
				{128045,198660,195045,292430,938475,848800,658025,18395,285990},
				{105845,925965,42160,838685,448125,867103,278575,425151,715515,408045},
				{348100,453269,401085,893840,905165,306894,636900,922294,718150},
				{100630,63625,778340,311801,963520,43070,47584,476250,681507,550577},
				{491085,978917,858207,935090,442655,382695,788275,108640,460810,548910},
				{501580,624375,760010,976280,850614,3461,238315,948471,122520},
				{35065,514755,37685,48695,966305,737615,768375,159990,984840,275120},
				{531255,280470,150040,191880,883375,779620,215615,391315,941299},
				{11965,264895,180705,438700,341955,152125,970615,108987,376215},
				{385589,222710,550825,8590,470980,857260,871945},
				{548095,171865,541530,47860,52915,556140,345710},
				{497425,532135,891590,115850,321655,141230,319363},
				{131145,824840,61682,750820,456200,448650,805700,406905,285575,296420},
				{658160,57975,655620,73875,868865,157425,221280,230000,303105,788835},
				{129505,225175,889478,183482,497060,601970,216510,328200,719735},
				{633558,9235,550805,186875,950260,693970,626480,312052,355210},
				{289493,206540,873310,579285,292110,75415,518399,277095,531205,201726},
				{4600,186240,633895,291565,880145,415980,510677,571620},
				{292940,358186,173775,618978,554415,145015,744130,263230,998825},
				{894815,519560,841626,226210,238400,861200,551280,305785,544815},
				{42173,442414,28217,528438,806372,831256,52691,469314,527242},
				{648135,857252,707497,674046,907447},
				{654777,56384,576619,28417,388568,631976,468675},
				{607408,233855,467335,999846,970166,891046,186959,190439,647967},
				{412288,567395,46370,807131,318180,747962},
				{346635,30738,802843,518662,83440},
				{34164,676647,72118},
				{67490,35919,955396,896463,760949,602740,657628,626224,85892,272851}
		};


		for(int i=0;i<testcase.length;i++){

			//合計フラグの初期化
			sumA=0;
			sumB=0;

			//フラグ配列の初期化
			for(int j=0;j<10;j++){
				flag[j]=0;
				next[j]=0;
			}

			//turnの初期化
			turn[i]=0;

			//全要素の末尾が0もしくは5になるまで各要素単位への処理を繰り返す
			while(sumA!=testcase[i].length){

				sumA=0;
				sumB=0;

				//フラグ配列の初期化
				for(int j=0;j<10;j++){
					flag[j]=0;
					next[j]=0;
				}


				//末尾が0もしくは5であるかの判定処理
				for(int k=0;k<testcase[i].length;k++){
					if(flag[k]==0 && (String.valueOf(testcase[i][k]).endsWith("0")==true || String.valueOf(testcase[i][k]).endsWith("5")==true)){
						flag[k] =1;
					}
					sumA += flag[k];
				}

				//末尾が0もしくは1であるかの判定処理
				for(int k=0;k<testcase[i].length;k++){
					if(next[k]==0 && (String.valueOf(testcase[i][k]).endsWith("0")==true || String.valueOf(testcase[i][k]).endsWith("1")==true)){
						next[k] =1;
					}
					sumB += next[k];
				}

				//1つでも末尾が0もしくは5である場合は削除してturnを+1
				if(sumA>0){
					for(int n=0;n<testcase[i].length;n++){
						if(testcase[i][n]==null){
							testcase[i][n]=0;
						}
						Opr2 =(Integer)testcase[i][n];
						if(flag[n]==1 && sumA>sumB && Opr2>=100 ){
							testcase[i][n]=null;
						}
						else{
							testcase[i][n]=Opr2/2;
						}
					}
					turn[i]++;
				}

				//違えば1/2にする。
				else{
					for(int m=0;m<testcase[i].length;m++){
						if(testcase[i][m]==null){
							testcase[i][m]=0;
						}
						Opr=(Integer) testcase[i][m];
						testcase[i][m]=Opr/2;
					}
					turn[i]++;
				}
			}
			//System.out.println(turn[i]);
		}
		return turn;
	}

	private static int[] Turn6(){
		int sumA = 0;
		int sumB = 0;
		int Opr = 0;
		int Opr2 = 0;
		int[] turn = new int[100];
		int[] flag = new int[10];
		int[] next = new int[10];

		Object[][] testcase = {
				{10,11},
				{0,9,9},
				{81,67,83,86},
				{11,22,30},
				{0},
				{5},
				{999999},
				{1000000},
				{5,10},
				{0,10,11},
				{10,20,21,22,23},
				{422808,211404,761062,845625,491519},
				{13,64,68,17,19},
				{93,31,72,65,75},
				{84,99,41,25,93},
				{2,72,63,58,66},
				{62,79,49,98,67},
				{87,31,37,36,95},
				{65,15,12,43,91},
				{34,71,60,41,95},
				{96,54,69,16,96},
				{73,69,64,92,24},
				{4,69,91,97,20,90,21,62,90,13},
				{75,72,44,100,96,12,99,59,4,97},
				{0,79,30,83,46,56,61,49,60,89},
				{10,72,2,7,75,26,82,30,57,2},
				{73,41,24,43,21,42,76,26,24,9},
				{59,77,32,6,23,87,97,23,43,32},
				{100,20,12,96,63,16,14,21,90,31},
				{6,18,19,51,54,70,10,96,80,62},
				{31,11,54,88,48,22,41,17,23,91},
				{45,59,56,4,13,95,65,81,64,79},
				{990492,953221,920810,925284,861402},
				{899023,958739,958208,836961,925983},
				{911568,986679,994864,913816,813822},
				{956961,827371,995429,889788,892175},
				{839452,878345,954982,995491,834352},
				{802331,957687,915094,875111,832466},
				{882981,867664,896820,809482,923023},
				{829415,814512,940226,978115,831827},
				{806232,837813,961698,844056,983721},
				{923071,972399,982766,907131,850043},
				{822380,818586,871538,983745,960983,888003,964137,810508,899267,973336},
				{900100,982013,808539,976012,951908,845870,821011,870749,835719,886450},
				{838102,882622,987311,850465,853342,924716,844930,821971,847907,921772},
				{960016,863774,990144,845274,819333,989933,990153,959626,915206,820545},
				{804154,989730,955129,987771,980677,943257,812049,869455,911280,997259},
				{914490,957061,893002,957989,900964,988645,967661,956006,920414,862668},
				{861248,833995,928360,905682,825217,819327,966070,921564,807581,962290},
				{957683,939387,929149,876470,949392,911001,816772,936305,874797,818163},
				{806342,944111,889814,947927,923905,816274,952687,933739,866972,851059},
				{927477,808550,854154,941801,808248,837432,905868,994125,928239,895436},
				{988355,859418,943243,85,31,908839,5,967426,81,76},
				{920885,96,93,81,91,910368,815514,859321,10,981845},
				{44,912531,853040,12,960455,34,47,950435,88,863403},
				{73,922852,948456,834894,2,960106,78,65,842099,94},
				{803747,907241,93,48,909454,6,831646,39,51,992766},
				{876093,972202,49,81,880075,870892,80,54,953444,70},
				{98,920283,65,72,926740,84,850577,61,971311,876298},
				{55,951463,27,65,51,931780,802803,822026,858115,2},
				{921210,76,96,56,883540,45,802952,875906,897253,13},
				{959601,94,79,907610,74,930570,925235,100,51,912353},
				{57,990272,83,72,872502,9,93,902753,959862,914956},
				{932080,13,918249,845303,11,952276,18,865247,47,72},
				{861980,903396,83,35,944843,28,20,835860,11,826473},
				{936501,832727,66,8,42,52,55,956372,985537,917775},
				{847993,36,36,69,968095,945997,94,941853,963485,29},
				{823023,909096,962680,41,41,54,883159,848431,94,0},
				{946709,91,23,949782,863270,74,851065,92,39,930297},
				{837100,803780,860731,994749,69,84,9,27,29,988495},
				{29,802154,817777,71,24,53,960860,991250,900741,90},
				{879442,44,71,909470,55,830018,953556,870500,71,48},
				{128045,198660,195045,292430,938475,848800,658025,18395,285990},
				{105845,925965,42160,838685,448125,867103,278575,425151,715515,408045},
				{348100,453269,401085,893840,905165,306894,636900,922294,718150},
				{100630,63625,778340,311801,963520,43070,47584,476250,681507,550577},
				{491085,978917,858207,935090,442655,382695,788275,108640,460810,548910},
				{501580,624375,760010,976280,850614,3461,238315,948471,122520},
				{35065,514755,37685,48695,966305,737615,768375,159990,984840,275120},
				{531255,280470,150040,191880,883375,779620,215615,391315,941299},
				{11965,264895,180705,438700,341955,152125,970615,108987,376215},
				{385589,222710,550825,8590,470980,857260,871945},
				{548095,171865,541530,47860,52915,556140,345710},
				{497425,532135,891590,115850,321655,141230,319363},
				{131145,824840,61682,750820,456200,448650,805700,406905,285575,296420},
				{658160,57975,655620,73875,868865,157425,221280,230000,303105,788835},
				{129505,225175,889478,183482,497060,601970,216510,328200,719735},
				{633558,9235,550805,186875,950260,693970,626480,312052,355210},
				{289493,206540,873310,579285,292110,75415,518399,277095,531205,201726},
				{4600,186240,633895,291565,880145,415980,510677,571620},
				{292940,358186,173775,618978,554415,145015,744130,263230,998825},
				{894815,519560,841626,226210,238400,861200,551280,305785,544815},
				{42173,442414,28217,528438,806372,831256,52691,469314,527242},
				{648135,857252,707497,674046,907447},
				{654777,56384,576619,28417,388568,631976,468675},
				{607408,233855,467335,999846,970166,891046,186959,190439,647967},
				{412288,567395,46370,807131,318180,747962},
				{346635,30738,802843,518662,83440},
				{34164,676647,72118},
				{67490,35919,955396,896463,760949,602740,657628,626224,85892,272851}
		};

		for(int i=0;i<testcase.length;i++){

			//合計フラグの初期化
			sumA=0;
			sumB=0;

			//フラグ配列の初期化
			for(int j=0;j<10;j++){
				flag[j]=0;
				next[j]=0;
			}

			//turnの初期化
			turn[i]=0;

			//全要素の末尾が0もしくは5になるまで各要素単位への処理を繰り返す
			while(sumA!=testcase[i].length){

				sumA=0;
				sumB=0;

				//フラグ配列の初期化
				for(int j=0;j<10;j++){
					flag[j]=0;
					next[j]=0;
				}

				//とにかく1/2にする。
				for(int m=0;m<testcase[i].length;m++){
					if(testcase[i][m]==null){
						testcase[i][m]=0;
					}
					Opr = (Integer)testcase[i][m];
					testcase[i][m]=Opr/2;
				}
				turn[i]++;

				//各要素の末尾が0もしくは5であるかの判定処理
				for(int k=0;k<testcase[i].length;k++){
					if(flag[k]==0 && (String.valueOf(testcase[i][k]).endsWith("0")==true || String.valueOf(testcase[i][k]).endsWith("5")==true)){
						flag[k] =1;
					}
					sumA += flag[k];
				}

				//末尾が0もしくは1であるかの判定処理
				for(int k=0;k<testcase[i].length;k++){
					if(next[k]==0 && (String.valueOf(testcase[i][k]).endsWith("0")==true || String.valueOf(testcase[i][k]).endsWith("1")==true)){
						next[k] =1;
					}
					sumB += next[k];
				}

				//1つでも末尾が0もしくは5の要素がある場合削除
				if(sumA>0){
					for(int k=0;k<testcase[i].length;k++){
						if(testcase[i][k]==null){
							testcase[i][k]=0;
						}
						Opr2 = (Integer)testcase[i][k];
						if(flag[k]==1 && sumA>sumB){
							testcase[i][k]=null;
						}
						else{
							testcase[i][k]=Opr2/2;
						}
					}
					turn[i]++;
				}
			}
			//System.out.println(turn[i]);
		}
		return turn;
	}
}


一人ゲームに向きになってしまい、他の問題は確認すらしていない状況でした。

今日の昼休憩にAndroid問題を見てやってみたら、30分くらいでできました。
こちらはコンテスト締切後に実施のため得点加算されていません。
マジで一人ゲームはパスしてこっちやっとけば良かったorz

この問題では2つのアプリを使います。問題用のアプリのサービスから自分で作ったアプリでコードをゲットするのです。

まずは問題用アプリを起動してメールアドレスとパスワードを入れて保存ボタンをタッチ

そうすると解答コードが保存されます。

そして自分の作ったアプリを起動して、AIDLでコードを取得します。ハッキングっぽくておもしろかったです。

それではソースコードです。
Main.Java

package com.google.android.apps.gddquiz;

import android.app.Activity;
import android.os.Bundle;
import com.google.android.apps.gddquiz.R;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.Gravity;
import android.widget.Toast;

public class Main extends Activity {
    /** Called when the activity is first created. */
	//サービスのインターフェイス宣言
	private IQuizService serviceIf;
	String tex;
	

	@Override
    public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //サービスへのバインド処理
        Intent intent = new Intent(IQuizService.class.getName());
        bindService(intent, con, BIND_AUTO_CREATE);
    }

    //サービスの接続
    private ServiceConnection con = new ServiceConnection(){
    	//サービス接続処理
    	public void onServiceConnected(ComponentName name, IBinder service){
    		//サービスのインターフェイスを取得
    		serviceIf = IQuizService.Stub.asInterface(service);

    		try{
    			tex = serviceIf.getCode() ;
    			Toast toast = Toast.makeText(Main.this, "DevQuizアプリのコードはズバリ¥n"+tex+"だ!", Toast.LENGTH_LONG);
    			toast.setGravity(Gravity.CENTER, 0, 0);
    			toast.show();
    		}
    		catch (RemoteException e){
    			e.printStackTrace();
    		}
    	}
    	//サービス切断処理
    	public void onServiceDisconnected(ComponentName name){
    		serviceIf = null;
    	}
    };
}

IQuizService.aidl

package com.google.android.apps.gddquiz;

interface IQuizService {
  String getCode();
}

IQuizService.java(AIDLファイルを作ると自動生成される)

/*
 * This file is auto-generated.  DO NOT MODIFY.
 * Original file: /Users/haruo/Dropbox/MacDev/workspace/CodeGet/src/com/google/android/apps/gddquiz/IQuizService.aidl
 */
package com.google.android.apps.gddquiz;
public interface IQuizService extends android.os.IInterface
{
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements com.google.android.apps.gddquiz.IQuizService
{
private static final java.lang.String DESCRIPTOR = "com.google.android.apps.gddquiz.IQuizService";
/** Construct the stub at attach it to the interface. */
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}
/**
 * Cast an IBinder object into an com.google.android.apps.gddquiz.IQuizService interface,
 * generating a proxy if needed.
 */
public static com.google.android.apps.gddquiz.IQuizService asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = (android.os.IInterface)obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof com.google.android.apps.gddquiz.IQuizService))) {
return ((com.google.android.apps.gddquiz.IQuizService)iin);
}
return new com.google.android.apps.gddquiz.IQuizService.Stub.Proxy(obj);
}
public android.os.IBinder asBinder()
{
return this;
}
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
switch (code)
{
case INTERFACE_TRANSACTION:
{
reply.writeString(DESCRIPTOR);
return true;
}
case TRANSACTION_getCode:
{
data.enforceInterface(DESCRIPTOR);
java.lang.String _result = this.getCode();
reply.writeNoException();
reply.writeString(_result);
return true;
}
}
return super.onTransact(code, data, reply, flags);
}
private static class Proxy implements com.google.android.apps.gddquiz.IQuizService
{
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote)
{
mRemote = remote;
}
public android.os.IBinder asBinder()
{
return mRemote;
}
public java.lang.String getInterfaceDescriptor()
{
return DESCRIPTOR;
}
public java.lang.String getCode() throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
java.lang.String _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
mRemote.transact(Stub.TRANSACTION_getCode, _data, _reply, 0);
_reply.readException();
_result = _reply.readString();
}
finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
}
static final int TRANSACTION_getCode = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
}
public java.lang.String getCode() throws android.os.RemoteException;
}
˙

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.google.android.apps.gddquiz"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="10" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Main"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

と、長くなってしまいましたがこんな感じです。
来年こそはGDD行けるように勉強しなくては。

それではお休みなさい。

Lionが転んだ

Lionが転んだのでレポートを残しておく

[bash]
Interval Since Last Panic Report: 69 sec
Panics Since Last Report: 1
Anonymous UUID: 64388781-56AB-41E4-9597-DD806D42C1C5

Sun Aug 7 19:51:15 2011
panic(cpu 1 caller 0xffffff80002c268d): Kernel trap at 0xffffff7f807a5b44, type 14=page fault, registers:
CR0: 0x000000008001003b, CR2: 0x0000000000000048, CR3: 0x0000000000100000, CR4: 0x0000000000000660
RAX: 0x0000000000000000, RBX: 0xffffff80136cfed0, RCX: 0x0000000000000000, RDX: 0xffffff80144b9c10
RSP: 0xffffff80fe24bf90, RBP: 0xffffff80fe24bfb0, RSI: 0xffffff80146a19c0, RDI: 0xffffff80144b9c10
R8: 0xffffff8014e9e940, R9: 0x0000000000000000, R10: 0xffffff8000801000, R11: 0xffffff8025af0200
R12: 0xffffff8013510b30, R13: 0xffffff80008bfa60, R14: 0xffffff801b72ac08, R15: 0xffffff7f807c1c10
RFL: 0x0000000000010213, RIP: 0xffffff7f807a5b44, CS: 0x0000000000000008, SS: 0x0000000000000010
CR2: 0x0000000000000048, Error code: 0x0000000000000000, Faulting CPU: 0x1

Backtrace (CPU 1), Frame : Return Address
0xffffff80fe24bc50 : 0xffffff8000220702
0xffffff80fe24bcd0 : 0xffffff80002c268d
0xffffff80fe24be70 : 0xffffff80002d7a3d
0xffffff80fe24be90 : 0xffffff7f807a5b44
0xffffff80fe24bfb0 : 0xffffff8000820057
Kernel Extensions in backtrace:
com.apple.filesystems.smbfs(1.7)[4DB5DCA8-58D3-3DD2-8E91-1508ED8210E3]@0xffffff7f8078d000->0xffffff7f807c1fff
dependency: com.apple.kext.triggers(1.0)[AE7BE743-CEA4-3E66-818F-C34233D9CF64]@0xffffff7f807e9000

BSD process name corresponding to current thread: kernel_task

Mac OS version:
11A511

Kernel version:
Darwin Kernel Version 11.0.0: Sat Jun 18 12:56:35 PDT 2011; root:xnu-1699.22.73~1/RELEASE_X86_64
Kernel UUID: 24CC17EB-30B0-3F6C-907F-1A9B2057AF78
System model name: MacBookPro5,5 (Mac-F2268AC8)

System uptime in nanoseconds: 321825390350411
last loaded kext at 321614950244796: com.apple.iokit.IOAVBFamily 1.0.0d22 (addr 0xffffff7f807ff000, size 36864)
last unloaded kext at 321345409352281: com.apple.iokit.IOEthernetAVBController 1.0.0d5 (addr 0xffffff7f807fa000, size 20480)
loaded kexts:
org.virtualbox.kext.VBoxNetAdp 4.0.8
org.virtualbox.kext.VBoxNetFlt 4.0.8
org.virtualbox.kext.VBoxUSB 4.0.8
org.virtualbox.kext.VBoxDrv 4.0.8
com.apple.filesystems.smbfs 1.7.0
com.apple.driver.AppleIntelProfile 81
com.apple.driver.AppleHWSensor 1.9.4d0
com.apple.filesystems.autofs 3.0
com.apple.filesystems.ntfs 3.8
com.apple.driver.IOBluetoothSCOAudioDriver 2.5f17
com.apple.driver.IOBluetoothA2DPAudioDriver 2.5f17
com.apple.driver.AppleUpstreamUserClient 3.5.9
com.apple.driver.AppleMCCSControl 1.0.24
com.apple.driver.AppleMikeyHIDDriver 122
com.apple.driver.AppleHDA 2.1.1f11
com.apple.driver.AppleMikeyDriver 2.1.1f11
com.apple.driver.AGPM 100.12.40
com.apple.driver.AppleLPC 1.5.1
com.apple.driver.SMCMotionSensor 3.0.1d2
com.apple.driver.AudioAUUC 1.59
com.apple.driver.AppleSMCLMU 2.0.1d2
com.apple.iokit.IOUserEthernet 1.0.0d1
com.apple.Dont_Steal_Mac_OS_X 7.0.0
com.apple.driver.AudioIPCDriver 1.2.0
com.apple.driver.AppleBacklight 170.1.9
com.apple.driver.ACPI_SMC_PlatformPlugin 4.7.0b2
com.apple.GeForce 7.0.2
com.apple.driver.AppleUSBTCButtons 220.8
com.apple.driver.AppleUSBTCKeyboard 220.8
com.apple.driver.AppleIRController 309
com.apple.driver.AppleUSBCardReader 3.0.0
com.apple.iokit.SCSITaskUserClient 3.0.0
com.apple.AppleFSCompression.AppleFSCompressionTypeDataless 1.0.0d1
com.apple.AppleFSCompression.AppleFSCompressionTypeZlib 1.0.0d1
com.apple.BootCache 32
com.apple.iokit.IOAHCIBlockStorage 2.0.0
com.apple.driver.AppleFWOHCI 4.8.6
com.apple.driver.AirPort.Brcm4331 500.20.6
com.apple.driver.AppleAHCIPort 2.1.8
com.apple.driver.AppleHPET 1.6
com.apple.nvenet 2.0.17
com.apple.driver.AppleUSBHub 4.4.0
com.apple.driver.AppleUSBEHCI 4.4.0
com.apple.driver.AppleUSBOHCI 4.4.0
com.apple.driver.AppleEFINVRAM 1.5.0
com.apple.driver.AppleRTC 1.4
com.apple.driver.AppleSmartBatteryManager 161.0.0
com.apple.driver.AppleACPIButtons 1.4
com.apple.driver.AppleSMBIOS 1.7
com.apple.driver.AppleACPIEC 1.4
com.apple.driver.AppleAPIC 1.5
com.apple.driver.AppleIntelCPUPowerManagementClient 166.0.0
com.apple.nke.applicationfirewall 3.0.30
com.apple.security.quarantine 1
com.apple.driver.AppleIntelCPUPowerManagement 166.0.0
com.apple.iokit.IOAVBFamily 1.0.0d22
com.apple.iokit.IOEthernetAVBController 1.0.0d5
com.apple.driver.AppleProfileTimestampAction 81
com.apple.driver.AppleProfileThreadInfoAction 81
com.apple.driver.AppleProfileRegisterStateAction 81
com.apple.driver.AppleProfileReadCounterAction 81
com.apple.driver.AppleProfileKEventAction 81
com.apple.driver.AppleProfileCallstackAction 81
com.apple.iokit.AppleProfileFamily 81
com.apple.kext.triggers 1.0
com.apple.driver.DspFuncLib 2.1.1f11
com.apple.driver.AppleSMBusController 1.0.10d0
com.apple.iokit.IOFireWireIP 2.2.3
com.apple.iokit.IOSurface 80.0
com.apple.iokit.IOBluetoothSerialManager 2.5f17
com.apple.iokit.IOSerialFamily 10.0.5
com.apple.iokit.IOAudioFamily 1.8.3fc11
com.apple.kext.OSvKernDSPLib 1.3
com.apple.driver.AppleBacklightExpert 1.0.3
com.apple.driver.AppleSMC 3.1.1d2
com.apple.driver.IOPlatformPluginFamily 4.7.0b2
com.apple.driver.AppleHDAController 2.1.1f11
com.apple.iokit.IOHDAFamily 2.1.1f11
com.apple.driver.AppleSMBusPCI 1.0.10d0
com.apple.nvidia.nv50hal 7.0.2
com.apple.NVDAResman 7.0.2
com.apple.iokit.IONDRVSupport 2.3
com.apple.iokit.IOGraphicsFamily 2.3
com.apple.driver.BroadcomUSBBluetoothHCIController 2.5f17
com.apple.driver.AppleUSBBluetoothHCIController 2.5f17
com.apple.iokit.IOBluetoothFamily 2.5f17
com.apple.driver.AppleUSBMultitouch 220.23
com.apple.iokit.IOUSBHIDDriver 4.4.0
com.apple.iokit.IOSCSIBlockCommandsDevice 3.0.0
com.apple.iokit.IOUSBMassStorageClass 3.0.0
com.apple.driver.AppleUSBMergeNub 4.4.0
com.apple.driver.AppleUSBComposite 3.9.0
com.apple.iokit.IOSCSIMultimediaCommandsDevice 3.0.0
com.apple.iokit.IOBDStorageFamily 1.6
com.apple.iokit.IODVDStorageFamily 1.6
com.apple.iokit.IOCDStorageFamily 1.7
com.apple.driver.XsanFilter 403
com.apple.iokit.IOAHCISerialATAPI 2.0.0
com.apple.iokit.IOSCSIArchitectureModelFamily 3.0.0
com.apple.iokit.IOFireWireFamily 4.4.3
com.apple.iokit.IO80211Family 400.40
com.apple.iokit.IOAHCIFamily 2.0.6
com.apple.iokit.IONetworkingFamily 2.0
com.apple.iokit.IOUSBUserClient 4.4.0
com.apple.iokit.IOUSBFamily 4.4.0
com.apple.driver.NVSMU 2.2.9
com.apple.driver.AppleEFIRuntime 1.5.0
com.apple.iokit.IOHIDFamily 1.7.0
com.apple.iokit.IOSMBusFamily 1.1
com.apple.security.sandbox 165
com.apple.kext.AppleMatch 1.0.0d1
com.apple.security.TMSafetyNet 7
com.apple.driver.DiskImages 326
com.apple.iokit.IOStorageFamily 1.7
com.apple.driver.AppleKeyStore 28.18
com.apple.driver.AppleACPIPlatform 1.4
com.apple.iokit.IOPCIFamily 2.6.5
com.apple.iokit.IOACPIFamily 1.4
Model: MacBookPro5,5, BootROM MBP55.00AC.B03, 2 processors, Intel Core 2 Duo, 2.26 GHz, 8 GB, SMC 1.47f2
Graphics: NVIDIA GeForce 9400M, NVIDIA GeForce 9400M, PCI, 256 MB
Memory Module: BANK 0/DIMM0, 4 GB, DDR3, 1333 MHz, 0x0000, 0x202020202020202020202020202020202020
Memory Module: BANK 1/DIMM0, 4 GB, DDR3, 1333 MHz, 0x0000, 0x202020202020202020202020202020202020
AirPort: spairport_wireless_card_type_airport_extreme (0x14E4, 0x8D), Broadcom BCM43xx 1.0 (5.100.98.75.6)
Bluetooth: Version 2.5.0f17, 2 service, 19 devices, 1 incoming serial ports
Network Service: AirPort, AirPort, en1
Serial ATA Device: WDC WD5000BEVT-11ZAT0, 500.11 GB
Serial ATA Device: HL-DT-ST DVDRW GS23N
USB Device: Internal Memory Card Reader, apple_vendor_id, 0x8403, 0x26500000 / 2
USB Device: Built-in iSight, apple_vendor_id, 0x8507, 0x24400000 / 2
USB Device: BRCM2046 Hub, 0x0a5c (Broadcom Corp.), 0x4500, 0x06100000 / 2
USB Device: Bluetooth USB Host Controller, apple_vendor_id, 0x8213, 0x06110000 / 3
USB Device: Apple Internal Keyboard / Trackpad, apple_vendor_id, 0x0238, 0x04600000 / 3
USB Device: IR Receiver, apple_vendor_id, 0x8242, 0x04500000 / 2
[/bash]

このレポートを見たところで今の自分には何もできないけど
将来これを見て何かわかるようになっているかもしれない自分のために残しておく。

Titanium MobileでAndroidアプリ2

ハンズオンに参加

先週の土曜日(6月18日)につ部(Android 名古屋 つくる部)の
第2回名古屋Android勉強会 Titanium Mobileハンズオンに参加しました。
https://github.com/masuidrive/TiWorkShopNagoya

Titanium Mobileで開発するiPhone/Androidアプリ JavaScriptによるスマートフォンアプリ開発入門
ハンズオンは6月16日発売のTitanium Mobileで開発するiPhone/Androidアプリ(通称:Ti本)
沿ったかたちで進められ、数時間であっという間に簡易Twitterビュアーを作ることができました。
しかも1回書けば、iPhoneでも動く(UIまわり等、若干書きなおす必要はあります)のがとても魅力的でした。

世の中そんなに甘くない

ここまでは良かったのですが、やっぱり世の中そんなに甘くない!!んですよね。
エミュレータで実行した場合と実機で実行した場合とでUIが異なるという問題にぶつかりました。

書き方が悪いのかと思い、ソースを何回も見直しましたが、解決方法が見つからず、
ぼそっとつぶやいてしまいました。

Titanium MobileでTwitter Viewer。実機とエミュレーターとでUIが異なり過ぎてうんざり。これは解決方法を編み出さないと使い物にならん。 http://twitpic.com/5du6i3less than a minute ago via Saezuri Favorite Retweet Reply

そしたら、

サイズ指定をdipにしてますか? RT @temosy: Titanium MobileでTwitter Viewer。実機とエミュレーターとでUIが異なり過ぎてうんざり。これは解決方法を編み出さないと使い物にならん。 http://twitpic.com/5du6i3less than a minute ago via TweetDeck Favorite Retweet Reply

画像はpx指定ですか? RT @temosy: Titanium MobileでTwitter Viewer。実機とエミュレーターとでUIが異なり過ぎてうんざり。これは解決方法を編み出さないと使い物にならん。 http://t.co/nXUnLqjless than a minute ago via web Favorite Retweet Reply


天から神の声が!! @gabuさん@mrshiromiさん 本当にありがとうございます!
ヒントが得られただけで一気に気合が入りました!

私と同じですねー RT @temosy Titanium MobileでTwitter Viewer。実機とエミュレーターとでUIが異なり過ぎてうんざり。これは解決方法を編み出さないと使い物にならん。 http://twitpic.com/5du6i3less than a minute ago via Twittelator Favorite Retweet Reply


@metal_presidentさんも同じ症状とのことです。自分だけかと悩んでいたので、こういうツイートはとても嬉しいです!
ありがとうございます!

dip指定をしてみる

そして、単位の指定をしていなかったのですが、dip指定(単位:dp)してみたら、

だいぶよくなりました!でも、Tabのアイコンサイズが・・・。

Tabアイコンサイズとの戦い

正直、こいつのために何時間費やしてしまったことか。
結論から申しますと、tiapp.xmlのAndroidマニフェストを記述する部分に

	<manifest>
		<supports-screens android:anyDensity="false"/>
	</manifest>

を追加すれば良いという話です。こんな感じで↓

これをやれば、dip指定しなくてもTi本に載ってるようなコーディングスタイルでエミュレータと同じ大きさになります。

ここに辿り着くまでの道のり・・・

KitchenSinkではTabのアイコンを大きく表示できているからKitchenSinkのソースを見てみよう http://twitpic.com/5f0dkfless than a minute ago via twicca Favorite Retweet Reply

github、web上から直感的にソースが見れて最高。less than a minute ago via web Favorite Retweet Reply

う~ん、ぱっと見た感じtabのアイコンサイズをdip指定しているような感じではないなぁ。もしかしてTitanium Developerで実機にinstallする場合とTitanium Studioでinstallする場合とで挙動が違ったりするのかな?less than a minute ago via web Favorite Retweet Reply

今、Androidに入っているKitchenSinkはTitanium Developerでinstallしたんだよなぁ。で、今いろいろいじくってるtwitterビュアーはStudioで作ってinstallしてるんだよな。これは帰ってから、確かめなくては。less than a minute ago via web Favorite Retweet Reply

Titanium MobileのTabアイコンサイズの件、Titanium DeveloperでビルドしてもStudioでビルドしてもサイズは変わりませんでした。(エミュレータではいい感じなのに実機だと小さい)less than a minute ago via Saezuri Favorite Retweet Reply

また、Studioとmobile SDKのバージョンがあがりましたが、バージョンアップしてからビルドしても結果は変わりませんでした。 KitchenSinkではTabのアイコンサイズが大きいし、ソースを見ると同じ画像(png)を使っており、dip指定やサイズ指定していない。less than a minute ago via Saezuri Favorite Retweet Reply

違うところと言えば、KitchenSinkではjss(JavaScript Style Sheets)でUIを定義しているところくらい。less than a minute ago via Saezuri Favorite Retweet Reply

Titanium Studioでjssを開くとエラーを吐かれてしまいますね。barColorっつうプロパティなんて存在しねぇよ!とかless than a minute ago via Saezuri Favorite Retweet Reply

jssに何書いても、そんなプロパティは存在しねぇよって怒れれる。less than a minute ago via Saezuri Favorite Retweet Reply

↑もう疲れて、怒られるを怒れれるってツイートしちゃってます。

Studioでjssを書くときに〇〇プロパティは存在しませんって怒られないようにする良い方法をご存知の方いらっしゃいませんか?  #TitaniumJPless than a minute ago via Saezuri Favorite Retweet Reply

やはり、ハッシュタグ付けてツイートしても、検索結果に表示されない。いつになったら、スパム解除してもらえるのだろうか?今日こそ返事が来ると期待していますよ。twitterさん。less than a minute ago via Saezuri Favorite Retweet Reply

そう、私はtwitterにスパム認定を受けているため、ハッシュタグを付けて助けを求めることも許されていなかった。
いつまで、この戦いは続くのだろうか?
っていうかjss絶対関係無いだろ!もう一度、KitchenSinkを見てみようということで、
tiapp.xmlを覗いて見たら、これだ!!となったわけです。


そして先ほど、この戦いに勝利したご褒美としてtwitterのスパム認定が解除されました!!

めでたしめでたし!

追記:下記も読んでおくと良いです

[あわせて読みたい]android:anyDensity=”false”の解説 via: Y.A.M の 雑記帳: Android multi screen 対応 http://j.mp/cj6tVLless than a minute ago via TweetDeck Favorite Retweet Reply

うわー。ショック!!普通にAppcelerator Developer Blog
に<supports-screens android:anyDensity=”false”/>の記事が載ってますね。http://goo.gl/9zjTk あれだけ格闘したのに・・・。less than a minute ago via Saezuri Favorite Retweet Reply

Titanium MobileでAndroidアプリ

Titanium Mobileで開発するiPhone/Androidアプリ JavaScriptによるスマートフォンアプリ開発入門を買いました!

で、Mac OSXにおける開発環境のインストールに関して以前つぶやいた内容が痛い内容であることに気付きました。


こういうエラーが出たとき、

用は~/dev/android-sdk/platform-tools/に入っている “adb” を~/dev/android-sdk/tools/にコピーすればOKとのこと。less than a minute ago via Saezuri Favorite Retweet Reply


cp -r ~/android-sdk-mac/platform-tools/adb ~/android-sdk-mac/tools/less than a minute ago via Saezuri Favorite Retweet Reply

ハイ、バカですね。用はじゃなくて要はだし。

正しくは

ln -s ~/android-sdk-mac/platform-tools/adb ~/android-sdk-mac/tools

コピーするんじゃなくて、シンボリックリンクを作るだけで良いがや!ということです。
コピーしたらHDDの容量をムダに使用することになります。

Androidことはじめ


Androidとは・・・GoogleとOpen Handset Allianceによって作られた携帯電話のためのOSS Tool Kit。
・ロイヤリティを支払うことなく、プラットフォームを利用したりカスタマイズできる。
・1つのベンダーに縛られていない。(Windows PhoneであればMicrosoft。iPhoneであればApple。)
・すべてJavaで書かれ、Dalvik仮想マシンによって実行されるためARM,x86,その他のアーキテクチャにまたがって移植性が確保されている。


構図



<Linuxカーネル>
Androidは安定した環境として定評のあるLinuxカーネルのもとで動作するように作られている。
Linuxはヘルシンキ大学の学生だったLinus Torvaldsが1991年に開発したOS。
LinuxがAndroidに対してハードウェア抽象化レイヤを提供しているので
将来のAndroidは様々なプラットフォームに移植できるはず。


Androidは

 ・メモリ管理
 ・プロセス管理
 ・ネットワーキング
 ・その他のシステムサービス

の実行のためにLinuxを使っている。
AndroidケータイのユーザからはLinuxは見えないし、プログラムも直接的なLinux呼び出しは行わない。

しかし、デベロッパとしてはLinuxがあることを意識する必要がある。
たとえば、adb shellコマンドを実行するときとか。
adb shellコマンドを叩くと、Linuxシェルがオープンされる。
シェルからはセキュリティ上の制約の範囲内でLinuxファイルシステムを見たり、
アクティブなプロセスを見たりすることができる。
#ま、rootを取ってしまえば、セキュリティ上の制約もクソもそんなの関係ねぇ!ってな状態だけど。

<ネーティブライブラリ>
カーネルのすぐ上のレイヤはAndroidネーティブライブラリ。
こいつはC or C++で書かれた共有ライブラリでケータイが使っているハードウェアアーキテクチャに特化した形で
コンパイルされていおり、ケータイメーカーによってプレインストールされている。

ネーティブアプリで特に重要なものは次のもの。

●サーフェスマネージャ
 AndroidはVistaやCompizとよくにているが、ずっと単純な複合ウィンドウマネージャを使っている。
 描画コマンドは画面バッファに直接書き込まれるのではなく、オフスクリーンビットマップに送られ、
 そこでほかのビットマップと結合されてユーザが見る画面になる。
 こうすることによりシステムはシースルーウィンドウとか
 画面のおしゃれな切り替えといった面白い効果を生み出すことができる。

●2D、3Dグラフィック
 Androidに対する単一のユーザインタフェースに2D/3Dの要素を結合できる。
 このライブラリはデバイスが3Dハードウェアを持っていればそれを使い、
 そうでなければ高速ソフトウェアレンダラを使う。

●メディアコーデック
 AndroidはAAC、AVC(H.264)、H.263、MP3、MPEG-4などの様々なフォーマットを持つビデオの再生と
 オーディオの録音/再生をサポートしている。

●SQLデータベース
 AndroidにはFireFoxやiPhoneが使っているのと同じSQLiteデータベースエンジンが搭載されている。
 このデータベースはアプリケーションの永続記憶として使える。

●ブラウザエンジン
 AndroidはHTMLコンテンツの高速表示のためにWebKitライブラリを使っている。これはGoogle Chromeブラウザ、
 AppleのSafariブラウザ、iPhone、Nokia S60プラットフォームが使っているのと同じエンジンである。

これらのライブラリは自立したアプリケーションではない。より高い水準のプログラムから呼び出されるだけである。
Android1.5以降、NDK(Native Development Kit)を使って独自のネーティブライブラリを書いてデプロイできるようになった。

<Androidランタイム>
カーネルの上にはAndroidランタイムも乗っている。ランタイムにはDalvik仮想マシンとコアJavaライブラリが含まれている。
Dalvik仮想マシンはGoogleが実装したJavaで、モバイルデバイスに合わせて最適化されている。
Android用のコードはすべてJavaでかかれているので、このVMの中で実行される。
Dalvikは次の2つの点で従来のJavaとは大きく異なる。

●Dalvik VMはコンパイル時に標準の.class、.jarファイルから変換、生成された.dexファイルを実行する。
 .dexファイルは.classファイルよりも小さく効率的であり、
 Androidのターゲットであるバッテリ駆動でメモリの小さいデバイスに適している。

●Androidに付属しているコアJavaライブラリはJava SE(Java Standard Edition)ライブラリや
 Java ME(Java Mobile Edition)ライブラリとは異なるが、重なり合う部分は多い。

「Dalvik」とは何か
 DalvikはGoogleのDan Bornsteinによって設計、実装された仮想マシン(VM)である。
 自分で書いたコードはマシンに依存しないバイトコードと呼ばれる命令にコンパイルされ、
 それがモバイルデバイスに搭載されているDalvik仮想マシンによって実行される。
 
 バイトコードの形式にわずかな違いはあるが、Dalvikは基本的にメモリが少ない環境に合わせて
 最適化されたJava仮想マシンである。同時に複数のVMインスタンスを実行でき、
 セキュリティやプロセスの隔離については下のOS(Linux)を利用できる。

 Dalvikという名前はBornsteinの祖先が住んでいたアイスランドの漁村にちなんで付けられたものである。

<アプリケーションフレームワーク>
ネーティブライブラリとランタイムの上にはアプリケーションフレームワークのレイヤがある。
このレイヤはアプリケーション開発のために使える高水準の部品を提供する。
このフレームワークはAndroidにプレインストールされた形で提供されるが、
必要に応じて独自コンポーネントを追加して拡張することができる。

フレームワークの中で重要な部分は次のものである。

平等と拡張
Androidのユニークで協力な特徴の1つはすべてのアプリケーションが平等な立場にいることである。
システムアプリケーションと言っても自分が使うのと同じ公開APIを使わなければならない。
必要なら標準アプリケーションの代わりに自作のアプリケーションを使うようAndroidに指示することさえできる。

●アクティビティマネジャ
 アプリケーションのライフサイクルを支配しユーザナビゲーションの共通「バックスタック」を管理する。

●コンテンツプロバイダ
 アドレス帳などのようにアプリケーションの間で共有しなければならないデータをカプセル化する。

●リソースマネージャ
 リソースとはプログラムに含まれるコード以外の部分ことである。

●位置マネージャ
 Androidケータイはいつでも自分の場所を把握している。

●通知マネージャ
 メッセージの到着、約束の時間、近接アラーム、外部からの侵入などのイベントは
 邪魔にならない形でユーザに知らされる。

<アプリケーションとウィジェット>
Androidのアーキテクチャ図で最も上のレイヤに配置されるのはアプリケーションとウィジェットレイヤである。
アプリケーションはAndroidという氷山の頂点と考えることができるだろう。エンドユーザからはアプリケーションと
ウィジェットしか見えず、彼らは水面下で行われるあらゆる動きを知らずにいることができる。
しかし、Androidデベロッパは、もっと多くのことを知らなければならない。

・アプリケーションは画面全体を占有してユーザとやり取りをするプログラムである。
 それに対し、
・ウィジェット(ガジェットと呼ばれることもある)はHome画面の一部の小さな矩形の中だけで動作する。

Android搭載機を買ってくると次に示すような標準システムアプリケーションがあらかじめインストールされている。

●ダイアラ
●電子メール
●アドレス帳
●Webブラウザ
●Android Market

<生きているアプリケーション>
LinuxやWindowsの標準的なデスクトップでは多くのアプリケーションを様々なウィンドウに同時に表示させることができる。
それらのウィンドウのうち1つだけがキーボードフォーカスを持つが、それを除けば、すべてのプログラムは平等である。
プログラムの切り替えは簡単であり、自分の操作が見えるようにウィンドウを動かしたり、不要になったウィンドウを
クローズしたりするのはユーザの仕事である。

でも、Androidはそのようには動いていない。
Androidにはフォアグラウンドアプリケーションが1つあり、一般的にはそれがステータス行以外の画面全体を占有している。
ユーザがケータイの電源を入れると最初に表示されるのはHomeアプリケーションである。
このアプリケーションは一般に時刻、背景イメージ、ユーザが実行できる他のアプリケーションの
スクロールできるリストを表示する。

ユーザがアプリを実行するとAndroidはそれを起動してフォアグラウンドに配置する。
ユーザはそのアプリからさらに別のアプリを起動したり、同じアプリの別の画面を表示したり、
別のアプリの今までとは別の画面を表示したりできる。
これらのプログラムや画面はシステムのアクティビティマネージャによってアプリケーションスタックに記録される。
ユーザはBackボタンを押せば、スタックに含まれている前の画面にいつでも戻ることができる。
ユーザから見るとWebブラウザのヒストリ(履歴)機能のように感じられるだろう。
Backを押すと、前のページに戻るのだ。

<プロセス!=アプリケーション>
個々のユーザインタフェース画面はActivityクラスによって表現される。
個々のアクティビティはそれぞれ自分のライフサイクルを持っている。
アプリは1つ以上のアクティビティとそれを格納するLinuxプロセスである。

Androidではアプリケーションはプロセスが殺された後でも「生きている」ことができる。
言い換えればアクティビティのライフサイクルとプロセスのライフサイクルにはずれがある。
プロセスはアクティビティを入れる使い捨ての容器に過ぎない。
これは他のどのようなシステムともおそらく異なる形である。


Androidプログラムの個々のアクティビティはいくつかの状態の中のどれかに属している。
デベロッパはプログラムの状態を自分で変えることはできない。状態は100%システムによって管理されている。
しかし、状態が変わろうとする直前にonXX( )メソッド呼び出しを通じて通知が送られてくる。

Activityクラスでこれらのメソッドをオーバーライドすれば、Androidは適切なタイミングでそれらを呼び出す。

●onCreate(Bundle)
 アクティビティが最初に起動するときに呼び出される。これを利用すればUIの作成など、
 一度だけ実行される初期化処理を実行できる。onCreate( )には引数が1個渡される。
 その値はnullかonSaveInstanceState( )メソッドで保存された何らかの状態情報である。

●onStart( )
 アクティビティが表示される直前だということを知らせる。

●onResume( )
 アクティビティがユーザとのやり取りを始められるようになる直前に呼び出される。
 アニメーションや音楽を開始するタイミングとして適切である。

●onPause( )
 アクティビティがバックグラウンドに隠れる直前に呼び出される。
 通常、隠れる原因は他のアクティビティが起動されて、現在のアクティビティよりも手前に出てくることにある。
 編集中だったデータベースレコードなどは、このタイミングで永続記憶に保存するとよい。

●onStop( )
 アクティビティがユーザからは見えなくなり、しばらく不要になった時に呼び出される。
 メモリの残量が少なくなるとonStop( )は呼び出されない場合がある。(システムが単純にプロセスを破棄してしまう場合)

※状態保存コードが正しく動作しているかどうかを簡単にテストできる方法。
 デバイスの向きが変わると(横長モードと縦長モードの間の切り替え)、システムがインスタンス状態の保存、
 一時停止、終了、破棄を行い、保存された状態を使ってアクティビティの新しいインスタンスを作る。

●onRestart( )
 終了状態だったアクティビティが再び表示されようとしていることを知らせる。

●onDestroy( )
 アクティビティが破棄される直前に呼び出される。メモリの残量が少なくなると、
 onDestroy( )が呼び出されない場合がある(システムが単純にプロセスを破棄してしまう場合)。

●onSaveInstanceState(Bundle)
 Androidはテキストフィールド内のカーソル位置などのインスタンスごとの状態情報を
 アクティビティに保存させるためにこのメソッドを呼び出す。
 しかし、デフォルト実装が自動的にUIコントロールのすべての状態を保存してくれるので、
 通常、これをオーバーライドする必要はない。

●onRestoreInstanceState(Bundle)
 前にonSaveInstanceState( )メソッドで保存された状態からアクティビティが再初期化される直前に呼び出される。
 デフォルト実装はUIの状態を復元する。

フォアグラウンドで実行されていないアクティビティは新しいアクティビティのためのスペースを作るために、
いつでも終了される可能性がある。終了とはコンテナのLinuxプロセスを終了させることである。
これはよく起きることなので最初からこれを計算に入れてアプリケーションを設計することが大切。
アクティビティの中で最後に呼び出されるメソッドがonPause( )になる場合があるので、
次回実行時のために残しておきたいデータは、このタイミングで保存していなければならない。

Androidのフレームワークはプログラムのライフサイクルを管理するだけでなく、
アプリケーション開発のために使える部品も提供している。

<開発のための部品>
 Android SDKには、すべてのデベロッパがよく知っていなければならないオブジェクトが定義されている。
 その中でも最も重要なのはアクティビティ、インテント、サービス、コンテンツプロバイダである。

●アクティビティ
 UI画面のこと。アプリはプログラムの異なる側面を処理するために1つ以上のアクティビティを定義できる。
 個々のアクティビティはアプリのライフサイクルの一部として後で復元できるようにするために、
 自らの状態を保存しなければならない。ActivityクラスはContextを継承しているので、
 これを使えばアプリのグローバル情報が手に入る。

●インテント
 「写真を選択する」、「家に電話する」、「ポッドの開閉口を開けろ」などのアクションを記述するメカニズムである。
 Androidではほとんどすべてのものがインテントを経由するのでコンポーネントを交換、再利用するチャンスは無数にある。
 たとえば「電子メールを送る」というインテントがある。メールを送らなければならなくなったアプリケーションは
 そのインテントを呼び出せば良い。新しい電子メールアプリを書いている場合にはインテントを処理するアクティビティ
 として自作のものを登録し、標準のメールアプリの代わりに使うことができる。次に誰かが電子メールを送ろうとしたときには、
 標準のメーラではなく、自分で作ったアプリが起動される。

●サービス
 Unixデーモンと同じようにユーザとの直接的なやり取りを行わず、バックグラウンドで実行されるタスクである。
 たとえば、ミュージックプレイヤについて考えてみよう。音楽はアクティビティによって開始されるかもしれないが
 ユーザが別のプログラムに移動しても、音楽の再生は続けたいところだ。そこで、実際に再生を行うコードは
 サービスにするのである。後でほかのアクティビティがサービスにバインドされれば、トラックの変更や再生の停止を
 命令することができる。Androidには多くのサービスが組み込まれており、それらにアクセスするための便利なAPIも
 用意されている。ライブウォールペーパーはサービスを使ってHome画面の背景として動画を描画している。

●コンテンツプロバイダ
 コンテンツプロバイダは読み書きするためのカスタムAPIを持つデータの塊である。
 アプリケーションの間でグローバルデータを共有するための最良の方法となっている。
 たとえば、Googleはアドレス帳のためのコンテンツプロバイダを提供している。アドレス帳に含まれている名前、
 住所、電話番号などの情報はそれを必要とするすべてのアプリケーションの間で共有できる。

<リソースの使い方>
リソースとはローカライズされた文字列、ビットマップ、その他プログラムが必要とする小さなコード以外の情報のこと。
リソースはビルド時にアプリに組み込まれる。リソースは国際化や複数のデバイスタイプのサポートで役に立つ。

リソースはプロジェクトのresディレクトリに作成する。Androidのリソースコンパイラ(aapt)はリソースが格納されている
サブフォルダとファイルフォーマットを手がかりにしてリソースを処理する。たとえば、PNG、JPGフォーマットの
ビットマップはres/drawableディレクトリに格納し、画面レイアウトを記述するXMLファイルはres/layoutディレクトリに
格納しなければならない。また、特定の言語、画面の向き、解像度などを表すサフィックスを追加することもできる。

リソースコンパイラはリソースを圧縮、パッキングして、プログラム内でリソースを参照するために使う識別子を格納した
Rという名前のクラスを生成する。これはキー文字列で参照されるJavaの標準リソースとは異なる。
このような方法をとることによって、Androidは無効な参照を作らないようにするとともにリソースキーを不要にして
スペースを節約しているのである。Eclipseは同様の方法を使ってEclipseプラグインのリソースを格納、参照している。

<アクセス保護とセキュリティ>
アプリケーションは自分用のLinuxプロセスの中で実行される。ハードウェアはプロセスがほかのプロセスのメモリにアクセス
することを禁止する。さらにアプリケーションには特定のユーザIDが対応付けられる。
アプリケーションが作成したファイルは他のアプリケーションからは読み書きできない。

さらに特定のクリティカルな処理へのアクセスは制限され、AndroidManifest.xmlというファイルを使って特に許可を
求めなければならない。アプリケーションがインストールされるときにパッケージマネージャが証明書に基づいて
(必要な場合はさらにユーザに問い合わせて)許可するかどうかを決める。
許可が必要な処理の中でもっとも一般的なものをまとめると・・・

●INTERNET
 インターネットにアクセスする。

●READ_CONTACTS
 ユーザのアドレス帳データを読み出す(書き込みはしない)

●WRITE_CONTACTS
 ユーザのアドレス帳データに書き込む(読み出しはしない)

●RECEIVE_SMS
 受信されるSMS(ショートメッセージ)をモニタリングする

●ACCESS_COARSE_LOCATION
 携帯中継局やWiFiなどの制度の低い位置プロバイダを使う

●ACCESS_FINE_LOCATION
 GPSなどのより正確な位置プロバイダを使う

たとえば、送られてくるSMSメッセージをモニタリングするためにはマニフェストファイルに次のような指定が必要となる。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.google.android.app.myapp"
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
</manifest>

Androidはシステム全体へのアクセスを制限することさえできる。AndroidManifest.xmlのXMLタグを使えば
アクティビティの起動、サービスの開始、バインド、レシーバへのインテントのブロードキャスト、
コンテンツプロバイ内へのアクセスなどを制限できる。この種の制限についてはAndroidセキュリティモデルの
オンラインヘルプ
を参照。

は~疲れた!
ここまで、何とか頭に叩き込みました!