#fav2toshi_a Advent Calendar
この記事は #fav2toshi_a Advent Calendar 10日目のために書かれたものです.
とりあえずいくつかとしぁさんのツイートピックアップしてみた
ソースコードにミクとデート行った時の日記は見つかりませんでしたが,mikutterのコードじゃなかったかもしれないが、昔はソースコードにミクとデートにいった時の日記とか書いてた
— レッドストーンカイロ (@toshi_a) December 10, 2012
mikutter/core/test/test_message.rb の中にはこんな記述がありましたね.
31 toshi = User.new_ifnecessary(:id => 123456, :idname => 'toshi_a', :name => 'toshi') 32 miku = User.new_ifnecessary(:id => 393939, :idname => 'ha2ne39', :name => 'miku') 33 c1 = Message.new_ifnecessary(:id => 11, :message => '@ha2ne39 みくちゃああああああああああああん', :user => toshi, :created => Time.now) 34 c2 = Message.new_ifnecessary(:id => 12, :message => '@toshi_a なに', :user => miku, :replyto =>c1, :created => Time .now) 35 c3 = Message.new_ifnecessary(:id => 13, :message => '@ha2ne39 ぺろぺろぺろぺろ(^ω^)', :user => toshi, :replyto =>c2, :created => Time.now) 36 c4 = Message.new_ifnecessary(:id => 14, :message => '@toshi_a 垢消せ', :user => miku, :replyto =>c3, :created => Ti me.now) 37 c5 = Message.new_ifnecessary(:id => 15, :message => '@toshi_a キモい', :user => miku, :replyto =>c3, :created => Ti me.now)
56 toshi = User.new_ifnecessary(:id => 123456, :idname => 'toshi_a', :name => 'toshi') 57 miku = User.new_ifnecessary(:id => 393939, :idname => 'ha2ne39', :name => 'miku') 58 c1 = Message.new_ifnecessary(:id => 21, :message => 'おはよう', :user => toshi, :created => Time.now) 59 c2 = Message.new_ifnecessary(:id => 22, :message => '@toshi_a おはよう', :user => miku, :replyto =>c1, :created => Time.now) 60 c3 = Message.new_ifnecessary(:id => 23, :message => '@ha2ne39 ぺろぺろぺろぺろ(^ω^)', :user => toshi, :replyto =>c2, :created => Time.now) 61 c4 = Message.new_ifnecessary(:id => 24, :message => '@toshi_a おはよう', :user => toshi, :replyto =>c1, :created => Time.now)
デートの日記じゃないけどいちゃいちゃしてるツイートはあるのですね.
もしかしたら古いソースにはあるんかな?
としぁさんのとこの会社は水飲み放題らしいですね.弊社、水飲み放題です
— レッドストーンカイロ (@toshi_a) December 10, 2012
ちなみにうちの研究室も水飲み放題です.
もちろん,お仕事(ry
思わず「テオキシス」に空目したのは僕だけではないでしょう・・・デオキシス欲しいな
— レッドストーンカイロ (@toshi_a) December 10, 2012
寒くて仕事がはかどりませんぞーーーーぴょぴょぴょぴょぴょwwww
— レッドストーンカイロ (@toshi_a) December 10, 2012
こういうツイートを見ると研究室は暖かいので幸せ(なのでしょうか…)
でもとしぁさんはミクが温めてくれるじゃないですかー
筋肉痛こねええええwwwぴょぴょぴょぴょぴょwwwwwwwwww
— レッドストーンカイロ (@toshi_a) December 10, 2012
としぁさん,もう年なのでは…
mikutterのソースコードをgrepする旅
この記事はmikutterアドベントカレンダーのために書かれたものです.
mikutterとの出会いとか
よく覚えていませんが,1年半くらい前でしょうか.
それまではTwitterにはあまり首をつっこんでいませんでしたが,このクライアントを使い始めてからというもの,
しました.
あまりにもひどい激変っぷりだったためか,下のようなコードがmikutterに残っています.
core/test/test_entity.rb
126 tweet = 'もともとは@penguin2716さんに勧められて始めたついった。そして彼より遅く始めた自分がTwitterにハマり、彼の総ポスト数をすぐに追い抜いたと思ったのですが、今や彼はれっきとしたmikutter廃人となり、ワタシの手の届かぬ領域に到達されました。'
実際のところ,プラグインが簡単に作れるし,UserStreamに対応してるし,
よく落ちるしメモリを食う素晴らしいTwitterクライアントだったのでずっと使ってたわけです.
mikutterが使いにくいクライアントだったらこんな熱狂的なておくれファンは集まりません.
いつからでしょうか,
10.times do |x| Service.primary.post :message => "ぴゃああああああああああ#{" " * x}" end
みたいなことをやりはじめたのは…
しかしながら,mikutterは様々な使い方のできるTwitterクライアントなので,
自分が「こうしたい!」と思ったことは大体実現できます.
きっとそんな魅力にとらわれて,僕は今でもmikutterを使っているのでしょう.
ところで,mikutterのソースコードって面白いよね!
core/utils.rb とかを覗いてみると,こんなメソッドが見つかりますよね.
21 # 基本的な単位であり、数学的にも重要なマジックナンバーで、至るところで使われる。 22 # これが言語仕様に含まれていないRubyは正直気が狂っていると思う。 23 # http://ja.uncyclopedia.info/wiki/Hyde 24 HYDE = 156
mikutterには上に示したようなコードが点在しています.
今回はgrepやfindを駆使していろんなコードを探してみましたので,いくつか紹介したいと思います.
core/utils.rb
mikutterには数学的にも重要なマジックナンバーHYDEが定義されていることは既に述べました.
mikutterではこのマジックナンバーを応用して複数Linkの検出を行っているようですね.
6 if defined? HYDE 7 raise "HYDEが再定義されました。utils.rbを2回Linkしてるんじゃないか?それ> はいけない。すぐにバグをSHOT AT THE DEVILしろ。" 8 # こんなふうにするといいと想います 9 require File.expand_path(File.join(File.dirname(__FILE__), 'utils'))
「複数条件ifなんて誰が使うん…」と思う方もいるでしょう.
しかし,何か理由があって書かれたものなのです.そう信じるのです…
52 # 複数条件if 53 # 条件を二つ持ち、a&b,a&!b,!a&b,!a&!bの4パターンに分岐する 54 # procs配列は前から順番に、上記の条件の順番に対応している。 55 # 評価されたブロックの戻り値を返す。ブロックがない場合はfalseを返す。 56 # なお、ブロックはa,bを引数に取り呼び出される。 57 # 誰得すぎて自分でも使ってないけどどこかで使った気がするなぁ 58 def biif(a, b, *procs, &last_proc) 59 procs.push(last_proc) 60 num = 0 61 if not(a) then 62 num += 2 63 end 64 if not(b) then 65 num += 1 66 end 67 if(procs[num]) then 68 procs[num].call(a,b) 69 end 70 end
「メルト」の歌詞をうっかり忘れてしまった場合でも,mikutterのソースを見れば一発で思い出しますね!!
そうだ,今度としぁさんとカラオケ行った時にこの歌詞で歌おう.
437 # freezeされていない同じ内容のオブジェクトを作って返す。 438 # メルト 溶けてしまいそう (実装が)dupだなんて 絶対に 言えない 439 def melt 440 if frozen? then dup else self end end end
core/miquire.rb
「ミク」でgrepしたらこんなコードにたどり着きました.
いやぁ,なんて分かりやすい説明なんだろう.
10 # ミクってかわいいよねぇ。 11 # ツインテールいいよねー。 12 # どう良いのかを書くとコードより長くなりそうだから詳しくは書かないけどいいよ ねぇ。 13 # ふたりで寒い時とかに歩いてたら首にまいてくれるんだよー。 14 # 我ながらなんてわかりやすい説明なんだろう。 15 # (訳: Miquire::miquire のエイリアス) 16 def miquire(*args) 17 Miquire.miquire(*args) 18 end
core/lib/mikutwitter.rb
sedとかを駆使してみつけたコード.ファイル行数9行です.
実はTwitter.rbにしたかった作者の気持ちがひしひしと伝わってきます.
1 # -*- coding: utf-8 -*- 2 # よくもこんなキ○ガイライブラリを!!! 3 # だってだってぇ、Twitterとかにしたら、他と名前被るじゃないですかぁ〜(悲) 4 5 require "mikutwitter/connect" 6 require "mikutwitter/api_call_support" 7 require "mikutwitter/api_shortcuts" 8 require "mikutwitter/oauth_hacks" 9 require "mikutwitter/streaming_failed_actions"
おわりに
mikutterに出会った頃の話をしたあとに,楽しいコードがある中の一部をご紹介しました.
実際にgrepしてみると「色々アレでソレ」なコードも見つかります.
3時間くらいておくれましたが,日本時間ではまだ27時くらいなのでセーフですね!!!
それでは,12/25のmikutterお誕生日会の準備をしましょう!
次は@haru067さんです?バトンタッチですー
追伸:
冬コミC83では「らぼちっく;げーと」というサークル名で,12/31(月)東2ホール Y-17aにブースを出します!
「俺のクラウドがこんなに安いわけがない」というタイトルで100ページくらいの薄い本を販売します.
mikutterの薄い本と各種グッズの委託販売も受けておりますので,皆様どうぞお越しください.
mikutter-modeのステマ
インストール方法
まずはgitでソースを取得
cd ~/.emacs.d/
git clone git://github.com/toshia/mikutter-mode.git
.emacsとかinit.elとかに追記
(add-to-list 'load-path "~/.emacs.d/mikutter-mode") (require 'mikutter-mode)
とかすると,とりあえず使えるようになります.
使ってみよう
mikutter-modeはdbusで通信するので,dbusが使える状態にしておいて下さい.
mikutterとEmacsを起動します.
とりあえずなんでもいいのでhoge.rbとか適当に新しいファイルを開きましょう.
M-x mikutter-mode
を叩いてmikutter-modeを有効にします.
Service.primary.post :message => "mikutter-mode ナーーーーーーーーーーーーーー"
とだけ入力して C-c C-c しましょう.
C-c C-c すると開いているバッファのコードがそのままmikutterに転送され,評価されます.
どうです!つぶやけていますね!!
Plugin.call(:update, nil, [Message.new(:message => "Systemメッセージだよ♡", :system => true)])
こうするとmikutter_botちゃんがシステムメッセージとしてTLに流れてきます.
デバッグの際とかに便利そうですね.
プラグインの作成・編集
プラグインの作成もいままでよりも格段にやりやすくなっています.
コードを書いて C-c C-c すれば良いのです.
Plugin.create :gray_protected_users do filter_message_background_color do | mp, array | if mp.to_message.user[:protected] == true array = [0xcccc, 0xcccc, 0xcccc] end [mp, array] end end
例えば,このプラグインは鍵垢ユーザのツイートの背景をグレーに変更します.
C-c C-c するとインストールされ,mikutterに即反映されます.
たとえば,グレーじゃなくて真っ青にしたい場合は,コードを次のように書き換えて C-c C-c すれば即反映されます.
Plugin.create :gray_protected_users do filter_message_background_color do | mp, array | if mp.to_message.user[:protected] == true array = [0, 0, 0xffff] end [mp, array] end end
鍵垢ユーザのツイートが真っ青ですね!!
mikutter-mode では,現在編集しているプラグインが既にインストールされている場合,
既存のプラグインをアンインストールしてから再度インストールされます.
このため,いちいちmikutterを再起動することなくプラグインの更新が可能になります.
ファイルの先頭にコマンドの出力結果を追加するには
ファイルの先頭に別のコマンド出力を追加
/tmp/foo
foo1 foo2 foo3
/tmp/bar
bar1 bar2 bar3
こういうファイルをくっつけるときは
cat foo bar
とするとできますが,コマンドの出力結果を貼り付けたい場合はどうしましょう?
別のファイルに書けばできますが,もっと短く書きたいですよね.
そこで,
ls -l | tac | xargs -I% sed -i 1i\ % foo
とかすると,
total 8 -rw-r--r-- 1 penguin penguin 15 Jul 24 07:08 bar -rw-r--r-- 1 penguin penguin 15 Jul 24 06:39 foo foo1 foo2 foo3
みたいに,コマンドの出力結果をfooの先頭に書くことができます.
解説とか
tacコマンドはcatの出力を逆順にするコマンドです.
a_command | xargs -I% another_command % arg2 arg3
みたいにすると,a_commandの出力結果がxargsに渡されますが,
その値が%に入って,変数のように扱うことができます.
すると,another_commandに渡す複数の引数の第一引数とかとして渡すことができます.
mikutterクラウド「みくらうど」をつくろう!
「みくらうど」とは
クライアントOSに依存せずにmikutterが使えるみくみくな環境だよ!
WindowsでもMacでもLinuxでもFreeBSDでも,sshとXが動く環境ならmikutterが使えるよ!
iPhoneとかでもうごくよ!
実装方法
- GentooとかUbuntuとか適当な環境を用意する
- mikutterをインストール
- ibusとかをインストールして日本語入力できるようにする
- /etc/ssh/sshd_config を編集して X11Forwarding を yes に設定
- ssh でリモートログインできるようにする
- 適宜ユーザを作成してibusとかの設定をする
上記の手順に沿って環境を用意するとみくみくなサーバが作れるよ!
実行方法
既にお気付きだと思いますが,次のようなコマンドでログインしましょう!
"-Y"をつけないとXが必要なアプリケーションが立ち上がらないよ!
ssh -Y cloud@192.168.1.39
ログインしたら,おもむろに
ibus-daemon -d -x
とかしてIMEを立ちあげます..bashrcとかその辺に書いといてもいいかも.
ここまできたら,
mikutter
とか
svn co svn://toshia.dip.jp/mikutter/trunk mikutter ruby mikutter/mikutter.rb
みたいな感じでmikutterが起動します!
OSに縛られずにみくみくできます!やったね!
mikutterにサーバ機能を持たせてソケット経由でつぶやけるプラグイン書いた
mikutterにサーバ機能を追加するプラグインです.
ソケットで文字列を送るとつぶやいてくれます.
github:penguin2716/MikutterSocketServer
デフォルトだとlocalhost:3939で接続を待ち受けます.
たとえばシェルで
uname -a | ruby mikutter_socket.rb
みたいな感じでコマンド叩くと
Linux ThinkStation 3.2.6-gentoo #1 SMP PREEMPT Tue Feb 14 21:52:10 JST 2012 x86_64 Intel(R) Xeon(R) CPU X3450 @ 2.67GHz GenuineIntel GNU/Lin
みたいな感じに140字に自動的に削られてつぶやかれます.あるいはtelnetとかで
telnet localhost 3939
とかやって,好きなようにつぶやいたあとで^]を入れてEOF入れて閉じればつぶやかれます.
標準入力から内容を突っ込めるので,ある程度の汎用性はあると思います.
echo "うちのWiFiパスワードは`echo 'GentooかわいいよGentoo' | \ md5sum | awk '{print $1}'`です!" | ruby mikutter_socket.rb
aliasするか/usr/local/bin/あたりにln -sしとくと便利かもしれません.
Androidのロック解除画面(パターン)でなぞった軌跡が残らないようにする方法
画面ロックの設定をしましょう
最近はかなりスマートフォンが普及してきましたね.これはガラケーにも言える話ですが,携帯電話を落としたりすると大切な情報が第三者に知られてしまう可能性があります.携帯電話には様々な情報が保存されていることはみなさんもご存知かと思いますが,すぐ思いつくだけでもこれくらいありますね.
- 電話番号
- メールアドレス
- 住所
- 誕生日
- 送受信したメール
- その他利用履歴
これらの情報は自分だけのものではなく,多くの場合は友人や仕事先の人のものもあるかと思います.もし携帯電話が盗難にあったりした場合,少なくとも画面ロックの設定くらいはしておかないと個人情報はすぐに漏れてしまいます.メモアプリ等でアカウント名やパスワードを保存することは言語道断ですが,万一そういうことをしていた場合,様々な被害が自分だけでなく他人にも振りかかることになります.
画面ロックの設定をしておけば,ある程度の被害は防げるかと思います(完全ではありませんが).夫や彼氏の携帯電話がロックしてあるからと言ってむやみに「浮気してるんじゃないの!!?」とか怒ってはいけません.立派なことだと褒めましょう.
パターンロックの設定方法
今回はパターンロックの話になります.表示されたタッチパネルの利点を生かしたとても便利なロック方法になります.Androidの場合,「ホーム画面でメニューボタン→設定→位置情報とセキュリティ→画面ロックの設定」の手順で画面ロックを設定することができます.今回はパターンについての話ですので,画面ロックがない状態からパターンを設定するまでのスクリーンショットを貼っておきます(時刻に整合性が取れていないのはご容赦ください).設定が完了すると,次回から画面OFFしたときにロック解除画面が表示されます.
また,「位置情報とセキュリティ」の項目の中の「パターンを線で表示」のチェックを外すと,ロック解除画面での入力時に入力した軌跡が表示されないので,パターンが盗み見されにくくなります.ただし,自分も入力できたかどうか分からなくなるので,「入力時バイブレーション」のチェックを入れてパターンを入力しているときに端末が振動するようにすることをおすすめします.すると,横で見ていても分からないが自分には入力フィードバックがあるのでロック解除しやすくなります.
指のあとが残りますよね
さて,これであなたのAndroidは画面ロックが設定されたので,むやみやたらに他人に触られて情報が流出する心配はないですね!・・・と言いたいところですが,パターンロックの場合,どうしてもロック解除時の指でなぞった軌跡が画面に残ってしまいます.
これではせっかく設定した画面ロックもすぐに破られてしまいそうですね.しかし,最近のスマートフォンはほとんどがマルチタッチ対応です*1.つまりは指でなぞらなければ良いのです.指でなぞる代わりに,指を2本使ってパターンを入力します.
入力の仕方としては,
- 指Aで1点目に触れる
- 指Bで2点目に触れる
- 指Aを離す
- 指Bを少し動かす
の繰り返しになります.すると,あら不思議!指でなぞっていないのにパターンの入力ができるではありませんか!この方法でロックを解除したときの画面がこちらになります.
どの順番で点を通過したのか分かりませんね!指でなぞったあとが残らないので,携帯電話が盗難にあってもロックが解除の正しい通過順序が分かりません!
問題点とか
この方法を使えばどの通過点をどの順序で通ったのかは分かりにくくなりますが,問題点もあります.
- 通過する点数が少ないとロックが破られやすい
- 片手でできないので面倒
- そもそもPINとかでよくね
1つ目の問題に関してはロックを解除した後,あるいは画面OFFした後に使っていない点の場所に指のあとを付けておくことで解消できると思います.下の2点に関しては,PINロックかパスワードをお使い下さいとしか言えません.
まとめ
- 携帯電話は個人情報の塊なので,画面ロックは必ず設定しましょう
- たとえ夫や彼氏の携帯がロックしてあっても怒ってはいけません
- パターンロックは便利だが画面に指でなぞった軌跡が残る
- 指を2本使うことで軌跡が残らなくなった
- よりセキュリティを強化したい方はパスワードを設定しましょう
*1:マルチタッチ対応でも動作しない機種があるようです.