twicliの☆を♡にする

Twitter公式では、お気に入り(fav: ☆アイコン)が、いいね(like: ♡アイコン)に変更されました。


twicliでも♡アイコンを使いたい方は、以下のユーザスタイルシートを適用することで変更できます。


手順は、+タブ→設定とクリックして、ユーザスタイルシート の欄に以下をコピペし、保存ボタンを押せばOKです。

.fav > img { opacity: 0; z-index: 9; position: absolute; }
.fav > span:before { background-image: url("images/icon_like_empty.png"); background-size: contain; width: 16px; height: 16px; display: inline-block; content: "."; color: transparent; line-height: 0; }
.fav > img[src*="loading"] + span:before { background-image: url("images/icon_like_loading.png"); }
.fav > img[src*="full"] + span:before { background-image: url("images/icon_like_full.png"); }

MicroView + FM Tuner

OLEDディスプレイ搭載ArduinoMicroView (Uno互換) と、FM Tuner Si4703 評価ボードを組み合わせてFMラジオを試作しました。
電源はリチウムイオン電池LiPro Charger


動いてるところ。表示は1行目から周波数、ボリューム、感度 ([S]はステレオ受信)、放送局名*1、Radio Text(曲名等)。

タクトスイッチ(写真だとつけてませんが)か、Serialで選曲、ボリューム操作ができます。


ラジオ聞くだけなら付属のライブラリを使えば何の問題もなし。

U.S.やヨーロッパではRDS (Radio Data System)といって、放送局名や放送中の曲名、代替周波数などの情報がFM放送に重畳されており、Si4703はそのデコードもできます。が、SparkFunの配布しているArduinoライブラリだと、RDS機能の実装が手抜きでよく分からん文字列を拾ってくる。そこでデコーダーを書き直し、放送局名(PS, 最大8文字)とRadio Text(最大64文字、曲名、アーティスト名など)をきちんと抽出できるようにしました。


修正版のライブラリ、MicroView用のスケッチ(examples/uView_Radio4703)は以下に。
https://github.com/NeoCat/Si4703_FM_Tuner_Evaluation_Board/tree/master/Libraries/Arduino/Si4703_Breakout/examples

*1:U.S.だと曲名等も8文字ずつを時分割で送ってたりする曲もあります。

Open vSwitchやNamespaceの関係図をコマンド一つで描く

LinuxでSDNっぽいことをOpen vSwitchでやろうとすると、BridgeやらNamespaceやらInterfaceやらが増えまくって全貌の把握が困難になってきます。また、なぜかpingが通らないときなど、あっちこっちでtcpdumpして回るのは大変です。

そこで、コマンド一つでOpen vSwitchやNamespaceの関係図を描き、ついでに全interfaceをtcpdumpしてpingがどこを通っているかも色で示すツールを作りました。


今のところ単一ホスト内のみなので複数nodeあるときは各nodeで実行する必要がありますが。

使い方

ソースは https://github.com/NeoCat/ovsimager にあります。sudo できるユーザかrootで

 $ sudo gem install ovsimager
 $ sudo yum install graphviz
 $ ovsimager

とインストールして実行すると、interfaces.png というファイルに関係図が出力されます。


以下はOpenStack Neutron DVR(all-in-one構成)でinstanceにFloating IPを振った状態です。
Open vSwitch Virtual SwitchとLinuxBridge内のInterface、およびNamespaceとの関係(routingに使われうる、IPが振られたインターフェイスのみ)が点線で描かれます。vethやOpen vSwitch間のpeerは実線で繋がります。


pingをトレースするときは、400byteのpayloadのpingを打ちながら、

 $ sudo ovsimager -d

とします。すると、全インターフェイスtcpdumpが数秒間起動され、400byteのping (vxlanも含む) が通った場所を記録、図にpingの宛先・送信元IPアドレスが追加され、色もつきます。(黄: ICMP Echo Request/Response両方が通過、ピンク: Requestのみ通過、赤:Responseのみ通過)


なお ovsimager 自身に ping を実行させることもできます。

 $ sudo ovsimager -d -f 10.0.0.1 -t 192.0.2.1

pingのトレース時は全interfaceでtcpdumpを同時実行するとか割と荒っぽいので、大規模な環境で実行しないほうがいいと思います。。が、学習用にはいいかな、と。

FedoraやCentOS 6/7、RHEL 6/7のinitramfsを展開する

FedoraCentOS 6/7、RHEL 6/7のinitramfsでは、先頭にEarly CPIO image(CPUのmicrocodeなどが入っている)がつくようになり、本体の起動RAMディスクイメージ(圧縮cpio image)はその後に来ます。

本体を展開するには、先頭部分を飛ばす必要があるため、dracutが提供している skipcpio というユーティリティを通してから展開します。

mkdir img
cd img
/usr/lib/dracut/skipcpio /boot/initramfs-XXX.img | gunzip -c | cpio -i -d

なお中のファイルリストが見たいだけなら

lsinitrd /boot/initramfs-XXX.img

でOK。ちなみにlsinitrdの中身はskipcpioなどを使ったshell scriptです。

HTTPS接続がCan't verify SSL peersというエラーになるときは

久しぶりにMacでとあるPerlスクリプトを実行したら OAuth::Lite::Consumer が特にエラーも出さずに失敗してしまった。


いろいろ試しているうちに、下記のようなスクリプトを実行すると

% perl -MLWP::UserAgent -e 'print LWP::UserAgent->new()->get("https://www.google.com/")->as_string'

500 Can't verify SSL peers without knowing which Certificate Authorities to trust
Content-Type: text/plain
Client-Date: Wed, 06 May 2015 04:47:19 GMT
Client-Warning: Internal response

Can't verify SSL peers without knowing which Certificate Authorities to trust

This problem can be fixed by either setting the PERL_LWP_SSL_CA_FILE
envirionment variable or by installing the Mozilla::CA module.

To disable verification of SSL peers set the PERL_LWP_SSL_VERIFY_HOSTNAME
envirionment variable to 0.  If you do this you can't be sure that you
communicate with the expected peer.

とか言われた。これは信頼出来るCAを見つけられなくてSSL接続先を検証できなかったため(そのまんま)。


OAuth::Lite::Consumer も接続先がHTTPSだったため、内部的にこのエラーで接続ができずに(タチの悪いことに無言で)失敗していた。


Macの場合、CAはKeychainで管理されているので、PERL_LWP_SSL_CA_FILE を設定するといった方法は使えない。ホスト認証を止める(PERL_LWP_SSL_VERIFY_HOSTNAME=0にする)のはいやなので、上記メッセージの通り

% sudo cpan install Mozilla::CA

Mozilla::CAを導入すれば、Mozillaが提供するCA Bundleを勝手に取得してくれ解決する。

MouseCapeでIBeamカーソルを見やすくする

Mac OS X 10.9くらいから、Iビームのマウスポインタが暗い背景で非常に見にくくなってしまいました。ターミナル等で背景色を黒っぽい色にしていると、テキストを選択しようとした時などにマウスポインタがどこにあるかわからず、非常に不便です。


MouseCapeというマウスポインタをカスタマイズすることができるソフトを使うことで、Iビームの周囲に白いハイライトを足すことで、見易さを改善できました。


作成したcape(カスタマイズされたカーソル集)はGitHubにあります。使い方はcapeファイルをダウンロードしてImportし、取り込まれた「Enhanced IBeam」をダブルクリックして適用するだけです。


https://github.com/NeoCat/enhanced-ibeam


他にもさまざまなcapeが公開されているので、自分好みに置き換えてみるのも楽しいかもしれません。
capeを右クリックしてEditを選び、ポインタの種類を選択してアイコンをFinderにoptionドラッグすると、pngファイルを取り出せます。pngファイルを別のcapeのアイコンにドロップすれば、特定のポインタだけを入れ替えることもできます。

Xcodeでは別の対処が必要

XcodeはOSとは別にカーソルを持っているようで、Mousecapeでは置換されないようです。下記を使えば同様の対処が可能です。

https://github.com/egold/better-xcode-ibeam-cursor

「リツイート直後のツイートを探す」twicliプラグイン

Twitterで、自分のツイートがリツイートされた後、感想などが直後にツイートされることがあります。しかし、特にリプライ先の指定がされているわけでもないので、フォローしていないユーザーがどんな反応をしたかは自分にはわからないことが多いですよね。


そんなとき、@jz5さんの「リツイート直後のツイートを表示するやつ」を使うと、そういった反応を集めてくれ、なかなか便利です。


このサービスとほぼ同様のことをするtwicliプラグイン tweets_after_rt.js をつくってみました。


このプラグインは現在デフォルトで追加されています。反応を知りたいツイートの▼メニューから、「リツイート直後のツイートを探す」を選ぶと、ポップアップで反応を集めてきて表示します。該当するものがない場合は何も起きません(わかりにくい)。

*1


なお、1回あたり最大20回ほどユーザタイムライン取得のAPIを発行するので、利用しすぎるとAPIの利用制限に引っかかります*2

仕組み

対象ツイートに対する最新のリツイート情報20件を取得し、そこに含まれていた全ユーザーのツイートを取得します。その際、IDの範囲指定を対象ツイートの時点〜その10分後までにすることで、そのRTに対する反応だと思われるものをピックアップしています。


なお、取得するツイートを10分後までに限定する方法として、APIのmax_id(取得する上限ID)指定を利用しています。TwitterのツイートID (全63bit) の生成に使われているsnowflakeは、

時刻(ms単位) 41bit サーバID 10bit サーバごとのシーケンス番号 12bit

という構成になっています。→参考 http://www.slideshare.net/moaikids/20130901-snowflake *3 したがって、対象ツイートからだいたい10分後(600,000ms後)までにするためには、

max_id = target_tweet_id + 600000 * (1<<22);

のようにmax_idを計算すれば良いことになります。*4

*1:関係ないけどちゃんとネタだと理解されてるのか心配な反応がある

*2:ユーザタイムライン取得の制限は15分間で150回なので、15分間に少なくとも7回まで使える計算になります(対象ツイートのRTが少なければもっと使えます)。

*3:これによってサーバ間でロックをとったりすることなく重複しないIDが作れるわけですね。

*4:直接シフトするのではでなく1 << 22を掛け算しているのは、JavaScriptでシフト演算は32bit整数に対してしか行えないためです。掛け算なら浮動小数点に変換して計算されます。浮動小数点であるため、必然的に多少の誤差が出ますが、上位41bit分の範囲指定に使うくらいであれば問題ないでしょう。