2009-12-02
これが解けたら$289.00
The 17x17 challenge. Worth $289.00. This is not a joke.
http://blog.computationalcomplexity.org/2009/11/17x17-challenge-worth-28900-this-is-not.html
適当に要約すると、
17×17のマス目があり、それぞれのマスを4色で塗り分ける。同じ色で塗られた任意の4マスを選んだとき、それぞれを頂点とする長方形を描くことができる組み合わせが存在しないように塗り分けることはできるか。
いわゆる4色問題を思い出すけど、微妙にちがう。
17x17がわかると他の組み合わせも芋づる式に解決するので、プログラムでもなんでもいいから解答例くれよってことらしい。解答例が正しいことを検証するプログラムなら簡単なアルゴリズムで作れそうだけど(早速phpで書いてる人がいる)、問題を解くとなるとぜんぜんピンとこないな。
ブラウジングは左手で極める
システム開発の仕事をやるようになって、いかに効率的にPCを操作するかということをわりと意識しだした。フリーウェアを探してみたりとか、キーボードショートカットを活用したりとか、データの整理分類とか、そういうの。人間って1つやり方を覚えてしまうと、他にもっと良いやり方があったとしてもそれで良いって思っちゃって、効率を考えずにずっとそれ使っちゃいがちなんだけど、そういうのを意識的に一つずつ見直していってどんどん他のもっとうまいやり方に置き換えていくと、驚くほど作業効率あがっていってすげえ楽しい。でも、そういう情報を活発に発信してるところってこれが意外とないんよな。
そんなわけで、俺が最近覚えたテクの一部について、語尾にキリッを付けつつちょっと紹介してみたい。もちろんここに挙げたやり方が全てではないので、もし知らない操作があったらちょっと試してみるかな的スタンスで捉えてほしいっていうか、他にもっとうまいやり方とかあったら教えてほしいっす。それぞれFirefox3.5.5でデフォルト有効なのを確認してるけど、業界標準的な感じでIEとかChromeでも大体使えるし、ほかのアプリでも同じキーバインドを採用しているものが多いので、慣れとくといろいろ応用効くね。ちなみにCtrl+CとかCtrl+Fとかあんまり普通すぎるやつは書かない。
自分が使いやすいようにキーバインドをカスタマイズするのもいいんだけど、いつも同じPCで作業するとは限らなかったりするし、OS再インストールとかで環境変わったときに設定しなおすのめんどいし、やっぱデフォルトのキーバインドってそれなりに偉い人が考えて作ってるからそれなりに覚えやすいし使いやすいよねってことで、極力いじらずに覚えていくのがいいと思う。体にいったん染み付いてしまったやり方を変えるのにはかなりエネルギーを使うんだけど、一度慣れたらだいぶ世界が変わるのでぜひ騙されたと思って試してほしいっす。
では紹介。
- タブ切り替え
Ctrl+Tab / Ctrl+Shift+Tab
or
Ctrl+PageDown / Ctrl+PageUp
タブの狭い長方形エリアにマウスをあわせてカチカチ切り替えてたのをこれに変えるだけで、かなりストレス減った。逆方向に切り替えたい場合は、Shift+Ctrl+TabかCtrl+PageDown。キーボードの配列にも依ると思うけど、左Ctrlキーは小指、右Ctrlキーは親指に乗せる感じ。Shiftを付けると逆の操作になることが多いので、何かの逆をしたいと思ったらとりあえずShift押してみるとうまくいくね。
- ブラウザのスクロール
Space / Shift+Space
or
PageDown / PageUp
それぞれ左側と右側にあるので、状況に応じて使い分けるといいかも。慣れると左手だけでタブ切り替えとスクロールができるので、右手のマウスはリンクをクリックするのに専念できていい感じ。リンクのクリックすらもキーボードで操作できるvimperatorというFirefoxアドオンもあるのだが、いろいろ敷居が高いのであまりオススメしない。あとブラウザのスクロールでたぶん一番良くないのが、スクロールバーをマウスで掴むやり方だと思う。すげえ狭いので、時々うまく掴めずに無駄にイライラしてしまう。
- タブを閉じる
Ctrl+w
これマジで便利っす。Ctrl+Tabでカチャカチャとタブを切り替えつつ、不要になったタブがあったらすぐにCtrl+wで閉じられます。ちなみにFirefoxだとCtrl+Shift+wでウィンドウを閉じてしまうので、うっかりShiftキーに指がかかってるとめんどいことに。割り当てを変更しときたい。
- 最後に閉じたタブを開く
Ctrl+Shift+T
上のショートカットキーでうっかり閉じてしまった場合には、これで復元する。Tは「タブ」のTで、Ctrl+Tだとタブの新規作成になるので、このキーバインドに逆操作を意味するShiftを追加して復元、って感じで何となく覚える。
- アクティブなフィールドの切り替え
Tab / Shift+Tab
分かりづらいけど、住所とか氏名の入力フォームで、一つ項目を入力するたびにマウスに持ち替えて次のテキストフィールドを選択するのもうやめたいっていうか。入力し終わったら両手はそのままでTab押してガンガン次に進めるし、セレクトボックスが出てきたら、Arrowキー(↓とか→とか)とPageUp/PageDownで選べばいい。チェックボックスとかラジオボタンはスペースで選択。決定ボタンとか送信ボタンは、Tabでフォーカス当てた状態でEnterな。
- 検索バーにフォーカス
Ctrl+E
ウッと思ったらパッと検索。もうわざわざマウスで検索バーにフォーカス当てたりしてはいけない。
- アドレスバーにフォーカス
Ctrl+L
アドレスバーも同じ。ちなみに、JWordとか入れてなくてもアドレスバーになんか文字打ってEnter押すと1番目の検索結果に飛ぶので、「kakaku」とか「ヤマト」とか、目的のサイトが1位にくるキーワードを覚えとけば、お気に入り代わりにもなる。
- 戻る / 進む
BackSpace / Shift+BackSpace
Alt+← / Alt+→
この辺も地味に便利。特にWindowsのエクスプローラでもこれ使えるので、日ごろから体に染み込ませる。
こんな感じかな。これらにマウスジェスチャを併用していくとさらに効果的。特に、「戻る/進む」や「ページの先頭/末尾」あたり。「ページの先頭/末尾」は、Home/Endキーでも操作可能なので、そのときの手の位置に応じてマウスとキーボードをうまく使い分けるのがコツ。
あとついでにこれも。
F10
「google」って打とうとしたらIMEがオンで「ごおgぇ」とかなってイラッとしたときに、BackSpaceを連打してまた入力しなおすのは超もったいない。F10を押して一発で「google」に変換。
一部に好評だったらまた書く。
2009-11-24
Skype4COMを使ったBOTプログラム
世間がTwitterで盛り上がってる中、時代に逆行してSkypeのBOTプログラムを作ってます。最初、以下のようにvbscriptで書いてたんだけど、途中から、発言メッセージ内にURLが含まれた場合にページタイトルを取得してきて返す機能をつけたくなって、それってvbscriptだと無理なので、Windowsのシェルで外部スクリプトに文字列を渡そうとしたんだけども、それやばくね?!っていう記事を見つけて、確かに!とおもって断念。身内のチャットではアンパサンドとかをエスケープする仕様にして動かしちゃってるんだけど、やっぱそもそも好ましくないので、ちょっと根本的に設計を変えて作り直したいという感じ。
で、もう最初からperlで書いちゃえばよくね?←今ココ。
vbsだとこんな感じになったというのを一応残しておく。Skype4COMを落としてきて、下のスクリプトと同じ階層に置いて、vbsを実行すればBOTを動かせます(たぶん)。perlに渡すつもりだったので、URLタイトルを取得とかはこれ単体だとできない。特定文字列とかに反応させるようにするには下の方のcase文を追加したりしてちょこちょこいじればいいんだけど、そうなると文字列操作に長けたperlがやっぱ便利だなあと思った。
Dim BOT_HEADER 'BOTが発言するメッセージのヘッダ
Dim BOT_QUIT 'BOTプログラムを終了させるためのコマンド
Dim BOT_STATUS 'BOTプログラムの生存確認をするためのコマンド
BOT_HEADER = "[BOT] "
BOT_QUIT = "qbot"
BOT_STATUS = "bot"
Dim lngAnswer 'ダイアログのyes/no
Dim resultMsg '
Dim chatName() 'chatnameを保持するための動的配列を宣言
ReDim chatName(0) '動的配列のサイズを1に
Dim chatNum 'chatnameの添え字を指定する用
'// Skype4COM用の変数
Dim oSkype
Dim oChat
Dim cAttachmentStatus_Available
Dim cMessageStatus_Sending
Dim cMessageStatus_Received
Dim cMessageType_Said
Dim cMessageType_Left
Dim cMessageStatus_Said
'// このあたりはSkype4COMのおまじない
'// Create a Skype4COM object:
Set oSkype = WScript.CreateObject("Skype4COM.Skype","Skype_")
'// Start the Skype client:
If Not oSkype.Client.IsRunning Then oSkype.Client.Start() End If
'// Declare the following Skype constants:
cAttachmentStatus_Available = oSkype.Convert.TextToAttachmentStatus("AVAILABLE")
cMessageStatus_Sending = oSkype.Convert.TextToChatMessageStatus("SENDING")
cMessageStatus_Received = oSkype.Convert.TextToChatMessageStatus("RECEIVED")
cMessageType_Said = oSkype.Convert.TextToChatMessageType("SAID")
cMessageType_Left = oSkype.Convert.TextToChatMessageType("LEFT")
'// The AttachmentStatus event handler monitors attachment status and attempts to connect to the Skype API:
Public Sub Skype_AttachmentStatus(ByVal aStatus)
If aStatus = cAttachmentStatus_Available Then oSkype.Attach() End If
End Sub
'// 全アクティブチャットについてbotの起動可否を確認
For Each oChat In oSkype.ActiveChats
lngAnswer = MsgBox(oChat.Timestamp & vbCrLf & oChat.FriendlyName & vbCrLf & "でbotを起動しますか?", vbYesNo + vbQuestion)
If lngAnswer = vbYes Then
'// 動的配列を拡張してchatnameを格納
ReDim chatName(UBound(chatName)+1)
chatName(UBound(chatName)) = oChat.Name
'// 起動メッセージ送信
oSkype.Chat(oChat.Name).SendMessage(BOT_HEADER + "おいすー^^")
End If
Next
Do While True
'// 無限ループ
WScript.Sleep(5000)
'// ここに時報とか実装予定
'For chatNum = 1 To UBound(chatName)
'oSkype.Chat(chatName(chatNum)).SendMessage("")
'Next
Loop
Public Sub Skype_MessageStatus(ByRef aMsg, ByVal aStatus)
Dim WSH
Set WSH = CreateObject("WScript.Shell")
'// 対象となるチャット全てに以下の処理を実行
For chatNum = 1 To UBound(chatName)
If aMsg.Chat.Name = chatName(chatNum) Then
'// メッセージ受信 or 送信時の処理
If Instr(aMsg.Body, BOT_HEADER) = 0 And (aStatus = cMessageStatus_Received Or aStatus = cMessageStatus_Said) Then
Select case aMsg.Body
'// プログラム終了
case BOT_QUIT
aMsg.Chat.SendMessage(BOT_HEADER + "終了")
WScript.Quit()
'// プログラム生存確認
case BOT_STATUS
aMsg.Chat.SendMessage(BOT_HEADER + "おー^^")
'// それ以外のときは外部スクリプトに文字列を渡して解釈してもらい、
'// 受け取った文字列をメッセージ送信(の予定だった)
case else
Set resultMsg = WSH.Exec("cmd.exe /c perl -e ""print 'hoge'""")
aMsg.Chat.SendMessage(BOT_HEADER + resultMsg.StdOut.ReadAll())
End Select
End If
End If
Next
Set WSH = Nothing
End Sub
2009-11-22
スカイ・クロラ挫折
スカイ・クロラを1時間半ぐらいがんばって観たんだけど、なんか押井守の作品もう無理だとおもって見るのやめた。こう、「俺の考えた俺設定を、少ない情報から色々推測して面白がれ!」っていう押しつけに耐えられなさすぎる。変な間とか淡泊な人物描写とかにも全然魅力を感じないし。ビューティフル・ドリーマーだけはいつかみてやってもいい。
ここのレビューが的確だった。
http://blog.livedoor.jp/ten_years_after/archives/52007203.html
リファレンス買うのなるべくやめたい
本屋いくと色んな言語のリファレンスとか入門書みたいのが並んでて、俺もこれまでいくつか買わされてきたんだけど、あれいらないよな。ネットで見られる言語仕様やAPIのドキュメントとかサンプルコードとかが一次情報だったり一番新鮮な情報だったりして確実だもん。そういうのをかみ砕いて整理してわかりやすく説明してくれてる本なら欲しいけど、それって言語仕様とかAPIのドキュメントが使い物にならないってことだから、そんな言語とかAPIなるべく使いたくねえよっていう気がする。入門レベルの学習もネットに落ちてる記事の範囲でなるべく済ませたい。高度な内容はやっぱ本だけどね。
2009-11-21
ゆっくりデスクトップ
http://pktn.sakura.ne.jp/f/YukkuriDesktop.html
AIR+box2dで、ゆっくりが上から降ってくるデスクトップアプリつくってみた。みかん星人を彷彿とさせるキモさです。マウスドラッグで動かせて、アクティブな状態でキーが何か押されると終了。インストール後にYukkuriDesktop.exeの拡張子を.scrに変えると、スクリーンセイバーにもできるっぽい。なかなかの重さなので、PCの動作もゆっくりになります。
これで何かもうちょっと面白いことできそうな感じがプンプンするけど、他につくりたいものがいろいろあるので一旦これでよしとしよう。
AIRでシステムアイコンを設定するとき
以下の環境で発生。
ADFファイル(アプリ名-app.xml)のiconにpathを指定すればよいが、これが曲者。このファイルからはソースパスに指定されたディレクトリしか見えてないので、src以下のどこかに置くか、画像ファイルの親ディレクトリをソースパスに指定するかしないといけない。
あと、リリースビルドで一度このエラーを出すと、元のairファイルを削除するまでまた同じエラーがでるっぽい。「元のAIRファイルを上書きする」を選択していても安心してはいけない。俺の場合、元のAIRファイルを削除してもFlex Builder 3を再起動してもなぜかだめで、AIRファイルのパブリッシュ先を変えたらうまくいった。
ちなみにアイコン画像は、NativeApplication.nativeApplication.icon.bitmapsにArrayで持ってるらしい。


