12-02-02 (Thu)
■[ruby] さくらインターネットの VPS で cron で ruby のスクリプトが動かない
rvm で 1.9.3-p0 をインストールしたがトラブルが…。
libyaml の警告を消す
It seems your ruby installation is missing psych (for YAML output). To eliminate this warning, please install libyaml and reinstall your ruby.
$ wget http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz $ tar xzvf yaml-0.1.4.tar.gz $ cd yaml-0.1.4 $ ./configure $ make $ sudo make install
その後、
$ rvm reinstall ruby-1.9.3-p0
tlsmail の警告を消す
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/tlsmail-0.0.1/lib/net/smtp.rb:806: warning: already initialized constant SMTPSession
smtp.rb と pop.rb を直接修正する必要があるらしい。
Net.instance_eval {remove_const :SMTPSession} if defined?(SMTPSession) SMTPSession = SMTP
Net.instance_eval {remove_const :POP} if defined?(POP) Net.instance_eval {remove_const :POPSession} if defined?(POPSession) Net.instance_eval {remove_const :POP3Session} if defined?(POP3Session) POP = POP3 POPSession = POP3 POP3Session = POP3 (snip) Net.instance_eval {remove_const :APOPSession} if defined?(APOPSession) APOPSession = APOP
コマンドラインから実行すると動作するが、cron で実行すると動かない
<internal:gem_prelude>:1:in `require': cannot load such file -- rubygems.rb (LoadError)
GEM_HOME や RUBYLIB を設定しないといけない。crontab -e で先頭に以下の行を追加した。
GEM_HOME=/usr/local/rvm/gems/ruby-1.9.3-p0 RUBYLIB=/usr/local/rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/x86_64-linux/:/usr/local/rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/
11-11-11 (Fri)
■[メモ] Ruby で bit.ly などの短縮 URL の展開
ググって調べて書いてみた。
require 'net/http' require 'uri' def expandShortenURI(s) uri = URI(s) Net::HTTP.start(uri.host, uri.port) {|http| response = http.head(uri.request_uri) case response when Net::HTTPRedirection expandShortenURI(response['location']) else return s end } end
11-10-02 (Sun)
■[メモ] ibus + mozc
Mozc の最新版 (PPA)
sudo add-apt-repository ppa:japanese-testers/mozc
ibus
1.3.9 が自分の環境では安定していた。1.4.0 はトリガーキーが最初の1回そのまま送信されてしまう。しかし、有効/無効キーバインドは使いたいのでパッチは当てる。
git checkout 1.3.9 git cherry-pick e3140b7206d409419faa0c8bfa50f25ad3644cd0
失敗するので↓のような感じで直す
https://gist.github.com/1256975
追記
修正していただきました。↓コメント参照
11-09-25 (Sun)
■[メモ] emacs のテキストモードで Shift+Tab を実現する
秀丸のような Shift+Tab のバックタブ(逆インデント)を emacs で実現してみた。
タブ位置の調整
emacs ではインデントの考え方が特殊で、テキストモードで (setq tab-width 4) としても効果がない。tab-width に従うのは C 言語モードの Tab キーに割り当てられている c-indent-line-or-region で、テキストモードの Tab キーに割り当てられている tab-to-tab-stop は tab-stop-list というインデント位置のリストに従う。例として幅 4 のソフトタブの設定を以下に示す。
(add-hook 'text-mode-hook '(lambda() (define-key text-mode-map "\C-i" 'tab-to-tab-stop) (define-key text-mode-map [backtab] 'backtab) (setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128)) (setq indent-tabs-mode nil)))
バックタブ
超汚くて恐縮だが、以下のように (backtab) を実装した。
(defun backtab() "Do reverse indentation" (interactive) (back-to-indentation) (delete-backward-char (if (< (current-column) (car tab-stop-list)) 0 (- (current-column) (car (let ((value (list 0))) (dolist (element tab-stop-list value) (setq value (if (< element (current-column)) (cons element value) value)))))))))
追記(リージョンの対応)
やっつけ実装ですが、複数行まとめてタブを入れたり、タブを抜いたりできます。
(defun backtab-line-or-region () (interactive) (if mark-active (save-excursion (setq count (count-lines (region-beginning) (region-end))) (goto-char (region-beginning)) (while (> count 0) (backtab) (forward-line) (setq count (1- count))) (setq deactivate-mark nil)) (backtab))) (defun tab-to-tab-stop-line-or-region () (interactive) (if mark-active (save-excursion (setq count (count-lines (region-beginning) (region-end))) (goto-char (region-beginning)) (while (> count 0) (tab-to-tab-stop) (forward-line) (setq count (1- count))) (setq deactivate-mark nil)) (tab-to-tab-stop)))
11-09-24 (Sat)
■[メモ] emacs で dired でディレクトリを移動してカレントディレクトリを変更する
function emacscd { export EMACS_DIR_FILE=$HOME/.emacs.dir.$$ emacs . if [ -f $EMACS_DIR_FILE ]; then cd `cat $EMACS_DIR_FILE` rm -f $EMACS_DIR_FILE fi }
(defun dired-set-current-dir-and-exit() "Set viewing directory to the current directory" (interactive) (write-region (expand-file-name dired-directory) nil (getenv "EMACS_DIR_FILE")) (save-buffers-kill-terminal)) (add-hook 'dired-mode-hook '(lambda() (define-key dired-mode-map "\C-x\C-c" 'dired-set-current-dir-and-exit)))
11-09-19 (Mon)
11-09-17 (Sat)
■[作ってみた] URL を正規表現でマッチさせてブラウザを分岐させる
会社などで IE 専用のサイトがあったり、Firefox 推奨のサイトがあったり、Chrome 推奨のサイトがあったりして、うっかり違うブラウザで開いて、また開きなおすといった場面が多かったので支援ツールを作りました(ずっと前に)。
デフォルトブラウザとして登録することで、設定ファイルの正規表現に従ってブラウザを切り替えます。
コンセプト説明用の LT
http://www.slideshare.net/iwagaki/make-and-love-your-own-tool
バイナリとソースコード
http://github.com/iwagaki/BrowserSelector
インストール方法
11-08-27 (Sat)
■[メモ] Android メモ
新しいリリースや、リリース間の違いを確認するために特定リリースの manifest を確認したい
manifest.git の clone を作る
git clone https://android.googlesource.com/platform/manifest.git # 初回 git pull # 更新 git branch -a # manifest のブランチ状況 git checkout origin/android-4.0.3_r1 # 特定のリリースの manifest の取得
複数のリリースのソースコードを効率的に取得したい
Mirror を作って、cron 等で repo sync しておく。新しい repo をする場合は --reference=mirror をつける。
cd mirror repo init -u https://android.googlesource.com/mirror/manifest --mirror
11-08-24 (Wed)
■[メモ] Redmine のチケット監視者のチェックボックスのデフォルトを checked にする
「新しいチケット」でチケット監視者のチェックボックスを全員オンにする。ちゃんと設定があるのかもしれないが、ひとまず app/views/issues/_form.rhtml に :checked => 'true' を追加することで対応した。
<label class="floating"><%= check_box_tag 'issue[watcher_user_ids][]', user.id, @issue.watcher_user_ids.include?(user.id), :checked => 'true' %> <%=h user %></label>
11-08-15 (Mon)
■[メモ] YouTube でリピート再生(ループ)させるブックマークレット
↓をブックマークレットとして登録しておいて、YouTube の動画再生画面で実行すると、リピート再生(ループ)するモードに入る。
javascript:(function(){ if (location.href.match(/http:\/\/www\.youtube\.com\/watch\?v=([^&]+)/)) { var url = "http://www.youtube.com/v/" + RegExp.$1 + "&loop=1&autoplay=1"; location.href = url; }})()
参考
11-08-14 (Sun)
■[メモ] libomxil-bellagio-0.9.3 で case value ‘2130706435’ not in enumerated type でビルドエラー
cc1: warnings being treated as errors omx_base_component.c: In function ‘omx_base_component_GetParameter’: omx_base_component.c:991:3: error: case value ‘2130706435’ not in enumerated type ‘OMX_INDEXTYPE’ omx_base_component.c:918:3: error: case value ‘2130706436’ not in enumerated type ‘OMX_INDEXTYPE’ make[3]: *** [libomxbase_la-omx_base_component.lo] エラー 1
CFLAGS="${CFLAGS} -Wall"
#CFLAGS="${CFLAGS} -Wall -Werror"
11-08-12 (Fri)
■[メモ] Sharepoint でリッチテキストの編集欄が小さい
Microsoft Sharepoint + Internet Explorer で、タスクリストのリッチテキスト編集欄を大きくしたい。
- 以下の1行をテキストファイルで適当に user.css として保存する
- 「ツール」→「インターネットオプション」→「全般」タブ→デザイン「ユーザー補助」→ユーザースタイルシート「自分のスタイルシートでドキュメントの書式を設定する」をチェックしてファイルを指定
色々検索して調べた方法はうまくいかなかったが、自分の環境では↓のスタイルシートに落ち着いた。
.ms-rtelong {width:800px !important; height:800px !important;}
11-08-06 (Sat)
■[メモ] 無料のラブひなを一括ダウンロードする python スクリプト
import os for i in range(1,15): os.system("wget http://dl.j-comi.jp/download/book/1%02d/hq/LH%02d_hq.pdf" % (i, i))
■[メモ] ビルドサーバの設定メモ
https://help.ubuntu.com/community/NFSv4Howto
apt-get
# apt-get install portmap nfs-common nfs-kernel-server
service portmap restart が動かない場合は、マシンを再起動する。
/etc/exports
/target_dir 192.168.0.1/255.255.255.0(rw,rync)
ワイルドカードはドメイン名の省略なので、IP 指定の時は↑のようにする。
/etc/default/nfs-common (Server/Client 側両方)
NEED_IDMAPD=yes
client からマウント
mount -t nfs 192.168.0.1:/target_dir /mount_point
公開鍵
client の id_rsa.pub を host の .ssh/authorized_keys に追加(なければ作成)
sudoers
/etc/sudoers.d に sudoers_local として root:root 440 として、
username ALL=(ALL) NOPASSWD: ALL
11-05-13 (Fri)
■[メモ] ファイルデスクリプタから逆にファイルパスを得る
こんなのしか思いつかなかった。
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <assert.h> #define VERIFY(x) if (!(x)) { assert(x); abort(); } int main(int argc, char *argv[]) { pid_t pid = 0; int fd = 0; char proc_path[1024]; char path[1024]; VERIFY(argc == 2); fd = open(argv[1], O_RDONLY); pid = getpid(); sprintf(proc_path, "/proc/%d/fd/%d", (int)pid, fd); int size = readlink(proc_path, path, 1024); VERIFY(size > 0); path[size] = 0; // for null-termination printf("fd = %d, path = %s\n", fd, path); return 0; }
実行例
$ ./a.out main.c fd = 3, path = /home/admin/fd_to_path/main.c
11-04-27 (Wed)
■[メモ] Linux でブートディスクとしてフォーマットした HDD をデータディスクとして使う
- 一度 Linux をインストールした HDD をそのまま外付け HDD として流用したい
- ブートデバイスが USB 優先になっている PC にその外付け HDD を接続すると起動してしまうが、起動しないようにしたい
パーティションテーブルの修正
fdisk でスワップ領域等を削除して、メインのパーティションをブート可能フラグを落とす
Bootstrap の移植
これだけだと外付け HDD の bootstrap が読み込まれた時点で止まってしまうので、データディスク用?の bootstrap を移植する。実際に起動ディスクの bootstrap とデータディスクの bootstrap のコードは異なっていて、内容はいつか調べる必要がありそう。
- 適当に USB メモリ (/dev/sdc とする) を EXT3 でフォーマットする
- 念のためデータディスク化したい外付け HDD (/dev/sdb とする) の MBR を sudo dd if=/dev/sdb of=~/mbr_backup bs=512 count=1 でファイルにバックアップ
- sudo dd if=/dev/sdc of=~/mbr_datadisk bs=512 count=1 でデータディスク用の MBR をファイルに保存する
- sudo dd if=~/mbr_datadisk of=/dev/sdb bs=446 count=1 で bootstrap の部分だけ書き変える
11-04-02 (Sat)
■[メモ] git clone --bare で clone したレポジトリに remote を設定する
git clone すると通常は clone 元が origin に設定されるので、git push でパラメータなしで push できるが、git clone --bare で clone すると origin の設定が必要なようだ。
例
$ git clone --bare git@github.com:<username>/<project>.git $ cd <project>.git $ git push fatal: No destination configured to push to. $ git remote add origin git@github.com:<username>/<project>.git $ git push Everything up-to-date
■[メモ] CQPerl で Rational ClearQuest API を利用した場合に The following characters are invalid で強制終了してしまう
Windows 上で CQPerl を使って Rational ClearQuest の自動クエリーなどのスクリプトを書いた場合に、以下のエラーでスクリプトが強制終了して困っていた。
String returned from the CQPerl is not in the local code page, "932 (Japanese (Shift-JIS))". The string is "(略)" (98 characters in total). The following characters are invalid: U+2013 at 14
http://www-01.ibm.com/support/docview.wss?uid=swg21266293
上にサポート記事があるが、スクリプト側での対象方法が明確でない。試行錯誤して以下のコードで回避できた。
my $cq = CQClearQuest::Build(); $cq->SetPerlReturnStringMode($CQPerlExt::CQ_RETURN_STRING_UNICODE);
11-03-28 (Mon)
■[メモ] ubuntu で adb を実行すると no permissions と表示されて接続できない
ubuntu では root 権限で adb server を実行する必要がある。面倒なので、オーナーを root にして sticky bit を立てる。一般ユーザが root 権限で adb を実行できる。
sudo chown root:root adb sudo chmod u+sx adb
■[メモ] Android Project をソース共有するときに必要なファイル
Eclipse で Android project を作ってアプリケーションを開発した場合に、Git に commit すべきファイルを忘れるのでメモ。
ワークスペースのフォルダに見えるファイル
.classpath .project .settings AndroidManifest.xml assets/ bin/ default.properties gen/ proguard.cfg res/ src/
共有すべきファイル
AndroidManifest.xml res/ src/
共有しなくてよいファイル
.classpath .project .settings assets/ bin/ default.properties gen/ proguard.cfg
Checkout した場合
Eclipse では File->New->Android Project で Create project from existing source で上記のファイルのあるフォルダを指定すればプロジェクトを作成できる。
CUI では、
android update project --name <Project Name> --target <Target ID> --path ./
のようにしてプロジェクトを作れば、build.xml *.properties proguard.cfg が補完されて、ant debug とか ant release でビルドできるようになる。Target ID (android-10, etc) は android list target で一覧を出せる。
http://developer.android.com/guide/developing/projects/projects-cmdline.html
11-03-21 (Mon)
■[メモ] ubuntu 10.10 で Growl の代わりに notify-send + notification-daemon を利用する
libnotify-bin パッケージを apt-get すると notify-send が利用できるが、バックエンドが notify-osd の場合だと問題がある。
notify-osd はまだ完成度が低い。バックエンドを notification-daemon に切り替えると解消される。
notify-osd から notification-daemon に切り替える
ただし WiFi の接続通知などすべての通知のスタイルに影響する。
sudo apt-get remove notify-osd sudo apt-get install notification-daemon
通知の色を変える(テーマを変える)
デフォルトだと -u critical でも控えめで目立たない。notification-daemon のテーマを standard にする。
$ gconftool-2 --type string --set /apps/notification-daemon/theme 'standard'
インストールされているテーマは /usr/lib/notification-daemon-1.0/engines/ を見ると分かる。
例
make; notify-send -t 0 -u critical "Build Successful" `pwd`
11-03-20 (Sun)
■[作ってみた] iOS 4 で 1 click のラウンチャーを作る
iOS Developer Program に参加してほやほやです。やったことのまとめ。
作りたいもの
メーラーの起動
アプリケーション間の通信の手段として、カスタム URL スキーマを使う仕組みがある。メーラーならば mailto: を開けば起動できる。to, subject, body が指定できる。自分のアプリにも URL スキーマは定義できるらしい。
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto:?to=宛先&subject=題名"]];
アプリケーションの終了
- openURL は別プロセス起動に相当するので、自分のプロセスは残る
- ライフサイクルとしては、OS からの終了では applicationWillTerminate() が呼ばれるが、自発的に終了できるのか?
- exit() で無理矢理終了できるが、iPhone Human Interface Guideline で禁止されている
- Don’t Quit Programmatically
- http://developer.apple.com/library/ios/#qa/qa1561/_index.html
アプリケーションライフサイクル
- プロセスは残るのは仕方がないとして、初回起動以外でもアイコンをタップしたら呼ばれる関数は何か?
- applicationDidBecomeActive()
- ライフサイクルは下記のページがとてもわかりやすかった
ビューを作らない最低限の構成
- 新規プロジェクトの Window-based Application や View-based Application のテンプレートの差分を見て試行錯誤したが、まとまっている記事を発見した
- main とあとはデリゲート先さえはっきりしていれば、アプリケーションライフサイクルを実現する最低限の要件は満たしているようだ
main.m
- NSAutoreleasePool は Cocoa のリファレンスカウント式のメモリプールらしいが、厳密にどういう時に必要なのか(どういう前提なら要らないのか)はちょっとはっきりせず
- UIApplicationMain() は UIApplication.h のコメントを見ると Info.plist と連動している→nil ではなく具体的にかけば、MainWindow.xib は削除可能
int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, @"MailButtonAppDelegate"); [pool release]; return retVal; }
MailButtonAppDelegate.h
- View だけじゃなく、Window も削除
@interface MailButtonAppDelegate : NSObject <UIApplicationDelegate> { } @end
MailButtonAppDelegate.m
- 以下、主要部分のみ
#import "MailButtonAppDelegate.h" @implementation MailButtonAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { return YES; } - (void)applicationDidBecomeActive:(UIApplication *)application { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto:?to=foo@bar.com&subject=NEW%20TASK"]]; } - (void)dealloc { [super dealloc]; } @end
スクリーンショットw
そもそも特定サイトへのリンクはホーム画面に置けるのだから、mailto: も置けそうな気がしますが・・・。
11-03-19 (Sat)
■[メモ] iPhone での Provisioning Profile の登録
http://www.facebook.com/note.php?note_id=138500006215364
こちらの 6. 以降を参考にしました。それでも少しハマったのでメモ。
- developer_identity.cer, AppleWWDRCA.cer はダウンロードしてダブルクリックしてもダイアログ等がでるわけではない
- Provisioning Profile にひもづけた App ID の Bundle identifier と、アプリの Bundle identifier はマッチさせる必要がある
- Xcode の Resouces - appname-Info.plist で Bundle identifier は変更可能
- Provisioning Profile をオーガナイザに登録→デバイスに転送する必要がある
- できていなくても「ビルドとデバッグ」をすると警告がでるだけで Install & Run を押すと一応実機で動くが毎回警告が表示された
- オーガナイザの Device -> 自分の端末 -> Summary タブの Provisoning の欄の + を押して Provisioning Profile ファイルを指定しても無反応で追加できない
- Provisioning Profile ファイルをダブルクリックすると、オーガナイザの Development -> Provisioning Profiles にエントリがでる。その後、デバイスの USB ケーブルを抜き差ししたら Installed になった。
11-02-19 (Sat)
■[メモ] Mac OS で UQ WiMAX D03NA を挿入してもすぐ接続されない
Try WiMAX などで D01NA を借りて、その後 D03NA を購入したのだが、USB に挿入してもすぐ反応せず困っていた。古い D01NA のドライバが残っていて衝突していたようだ。
Warning - kext jp.co.nec.UQWiMAX.UD01NA_2 has immediate dependencies on both com.apple.kernel* and com.apple.kpi.* components; use only one style. Warning - kext jp.co.nec.UQWiMAX.UD03NA_2 has immediate dependencies on both com.apple.kernel* and com.apple.kpi.* components; use only one style. Warning - kext jp.co.nec.UQWiMAX.UD03NA_1 has immediate dependencies on both com.apple.kernel* and com.apple.kpi.* components; use only one style. Warning - kext jp.co.nec.UQWiMAX.UD01NA_2 has immediate dependencies on both com.apple.kernel* and com.apple.kpi.* components; use only one style. OSMetaClass: Kext jp.co.nec.UQWiMAX.UD01NA_2 class NecatWiMAX_2 is a duplicate;kext jp.co.nec.UQWiMAX.UD03NA_2 already has a class by that name. Kext jp.co.nec.UQWiMAX.UD01NA_2 start failed (result 0xdc00400a). Kext jp.co.nec.UQWiMAX.UD01NA_2 failed to load (0xdc008017). Failed to load kext jp.co.nec.UQWiMAX.UD01NA_2 (error 0xdc008017).
/System/Library/Extensions/UQWiMAXUD01NA_1.kext と UQWiMAXUD01NA_2.kext を root 権限で削除したところ解消した。
10-07-25 (Sun)
■[形式知にしてみた] 動機ドリブンタグ付け
見たい情報が溢れてしまっていたので整理方法をブレストしてみた。
対象
- 色々と興味を持ってしまい情報を集めすぎてしまう(ブックマークとか)
- 未整理や未読の情報が重荷になってイライラしてきた
- 積ん読が多すぎて本を読み出しても途中で別の本が気になる
- タスクのプライオリティ付けをやっているつもりが踏み込みが足りない
- 結局迷ってばかりで何もできていない
原因
基本原則を考え直してみる
- 情報を読むことで理解できると考えることが根本的に浅はか
- やったことしか理解できない。読んだ知識はまやかし
- 情報は実は料理しないとまったく食べられない(腹をこわす)ものと考える
- 素材を使って何か行動をおこすことで知識は得られる
- 情報収集ではなく情報消化を優先して、実際に身につく“筋力”情報量を最大化する問題ととらえる
何のために情報を集めるのか
- 興味があるだけでは発散してしまう
- 集めて本当に使っているのか?タグ付けしてどうしているのか?
- 話題についていきたいだけ?
- 何かできるようになりたいのか?
- その分野について詳しくなりたいのか?(○○ならば○○さん)
情報のタグ付け方法の見直し
動機を絞り込む
- やりたいことを絞る
- 重要なものをまっさきにやる
- 集中するための土壌を作る
- やりたいことが、いちばん魅力的なことはまれである
- やりたいことが、いちばん楽しくなるように、他をつまらなくする、さわらない、そういうコントロールが必要
- 分野を絞る
