いろいろ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が故障する危険性がありますのでマネする人は自己責任でお願いします。

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

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]

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

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

私の環境ですが、

OS OSX 10.9
プリンタ Canon MP600

となっております。

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

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

ぜひ、お試しください。

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の容量をムダに使用することになります。

みなさん、おひさしぶりです!

ど〜も、おひさしぶりです!temosyです。

実は昨年5月、自宅サーバのHDD(SEAGATE製)が

クラッシュし、データをすべて失ってしまいました。

それを機にサーバOSをVineLinuxからOpenSolarisに変更しました。

しかし、なかなかサーバ構築に時間を費やすことができず放置状態に。

年末年始の長期休暇でやっと時間を確保できたので

WEBサーバを再構築しました。

過去の記事はすべて失ってしまいましたが、

新たな気持で再出発致します!

主に・・・
[note]・日本語プログラミング言語「なでしこ」
・OpenSolaris
・Mac
・iPhoneアプリ制作
・Androidアプリ制作[/note]

について書いて行く予定です。

今年もよろしくお願い致します。