2001年03月19日(月) 明日は春分の日
■ 明日祝日なので休暇を取っている人が多い。静か。
■ [dev] perlでロック
座標ファイル出力CGIプログラムを、出力ファイル作成中はロックするようにした。perlでロックを実現するにはflock()を使えばよいらしい。でこれはUNIXでないとうまく動かないようだ。
open(OUT, ">> filename"); flock(OUT, 2); truncate(OUT, 0); seek(OUT, 0, 0); print(OUT $data); close(OUT);
とした。ファイルが壊れなきゃいいので、読み込み時はロックしない。これをメモっておこう。
今見ると戻り値のチェックをしないといけない気がする。でもいいことにしよう。うーむ。
2002年03月19日(火) 山手線止まった日
■ 会社
- 10:55 グレムリンで止まってたけど、場所は日付を選択するダイアログだった。こんなとこで止まられてもどうしようもないなあ。
- 19:00 かー、ERCからエラーメイルが来た。「レコードサイズが不正です」だって。なにこれ。こんなの見たことない。まあまだおれが積極的に調べる必要はないだろう。
■ [java] サーバサイドJAVA開発環境比較
Java開発環境の評価レポート。WEB+DB Press vol.6より。
■ [java] Java Web Start
Java Web Startの解説。What's new about Javaより。
■ [security] PKI 関連技術解説
IPAによるPKI解説。セキュリティホールmemoより。分量が多すぎてさ...
■ テレビ/本
- アリーマイラブ4(録画)。ジョンとラリーの対決。どっちが勝つのかな。テープが途中で切れてるので結末が分からないー。
- JavaWorld4月号やっと読み終わり。
- 少年ジャンプ立ち読み。ガアラは去りサスケが追う。来週火影様とオロチ丸が戦いそう。ウェザーリポートはゴッホに攻撃されアナスイはヤギに攻撃されている。
- スピリッツ立ち読み。時雄ダウンもまたぶつかり合う。「人の形になっている」というセリフが面白かった。
2003年03月19日(水)
■ 会社
- (11:55)出社。久しぶり。半蔵門線の終点が伸びていることに気付いた。清澄白河行きだったかな。が、今路線図を見たらもっと先まで伸びているようだ。ほー。
- 要らない資料などを捨てる。ホチキスでとめるなよー。
- (16:30〜17:30)Proxyの勉強。
- (18:00)退出。何もしてへん。
■ [java] Java BluePrints Questions and Answers (JDC)
SunによるJ2EEのFAQ日本語訳。Sunからのメイルより。
■ [dev] Successful Reproduction of MS03-007 "Unchecked Buffer In Windows Component Could Cause Web Server Compromise"NEW (LAC)
LACによるMS03-007への警告。PASSJセキュリティ分科会MLより。問題を起こすリクエストが示されているのは目新しいのだと思う。
■ [soft] Terminal Emulator Guevara
ssh2をサポートした端末エミュレータ。常時接続MLより。.NETアプリケーションのようだ。自分は日本語化されたputtyで満足しているけど、日本製のソフトには頑張ってほしいです。
■ [life] 初Suica
Suicaを初めて使った。何度か素振りしてからタッチ・アンド・ゴー。なんだ、簡単じゃん。ゴー後に使用金額と残金を素早く見なければならないところが少し難しいけど、できるできる。残金50円になっちゃったので初チャージ1000円。更に3000円のパスネットも購入で、大量の交通費を前払い。
■ やること
- 携帯&PHS&ThinkPadを返す
- 退職後の手続きをまとめる
アントレを返す- Vineで印刷の設定→Sambaの設定→SWTのサンプルプログラムの印刷
2007年03月19日(月)
- 全然書くことがない。今日の予定を書く。
- パスの所の処理を見直して、テストを書く。
- 検索結果画面に手を付けて、検出の機能を作り始める。
- テストを書くのはできた。でもテストケースが全然足りない。検出の機能には手が回らず。でもこれは後回しでよいことになった。
- vimのマウス機能が便利すぎる件を試してみた。すごいんだけど、今までとクリック時の挙動が変わるので使いにくいさが勝る。慣れれば平気かなあ。
■ [howto][unix] grep -r で対象ファイルを絞り込む
grep -r は簡単でよいけど対象ファイルを絞り込めないので不便、と思っていたが、ときどきの雑記帖 リターンズによると絞り込めるみたい。
試してみた。
$ grep -r adapter * config/.svn/text-base/database.yml.svn-base: adapter: sqlite3 config/.svn/text-base/database.yml.svn-base: adapter: sqlite3 config/.svn/text-base/database.yml.svn-base: adapter: sqlite3 config/database.yml: adapter: sqlite3 config/database.yml: adapter: sqlite3 config/database.yml: adapter: sqlite3 $ grep -r --include='*.yml' adapter * config/database.yml: adapter: sqlite3 config/database.yml: adapter: sqlite3 config/database.yml: adapter: sqlite3
ちょっと長くなるけどfindを使うよりは短い。
参考:grepのmanより:
-R, -r, --recursive Read all files under each directory, recursively; this is equivalent to the -d recurse option. --include=PATTERN Recurse in directories only searching file matching PATTERN. --exclude=PATTERN Recurse in directories skip file matching PATTERN.
■ [ruby] 今日学んだこと
private_class_method
クラスメソッドをプライベートにするときはprivate_class_methodを使う。
- 参考: 5.7 メソッドの可視性を指定したいのですが (Ruby FAQ)
これには private のように以下に書いたもの全てをプライベートにする機能はないみたい。
定数
定数が指しているオブジェクトは変更可能。
- 参考: 2.13 定数は変更されませんか (Ruby FAQ)
一時ディレクトリ、一時ファイル
システムの一時ファイルディレクトリは Dir.tmpdir で取得できる。一時ファイルは Tempfile クラスで作れるようだが一時ディレクトリを作ってくれる標準ライブラリはなさそう。
レシピブックにはDir.tmpdirの返す値が環境変数により変わるように書かれているが、そのような挙動は確認できなかった(ruby 1.8.5 (2006-12-04 patchlevel 2) )。
特異メソッド
特異メソッドを使ってみた。
my_string = String.new def my_string.mmmmm '特異メソッド' end puts my_string.mmmmm #=> 特異メソッド
こんな感じで、オブジェクトmy_stringに対してメソッドを定義できるようだ。
RAILS_GEM_VERSION
environment.rb で定義されている定数 RAILS_GEM_VERSION により、使用するRailsのバージョンが固定されるみたい。この定数を定義しなければ最新のRailsを使ってくれる模様。
■ [ruby] Refeの文字化け
Refeを使ってみたが文字化けしてしまう。とりあえず適当日記にあったのと同じ修正をした。うーむ。
--- searcher.rb 2003-10-17 21:44:12.000000000 +0900 +++ /usr/lib/ruby/gems/1.8/gems/refe-0.8.0.3/lib/refe/searcher.rb 2007-03-19 15:00:23.000000000 +0900 @@ -9,7 +9,7 @@ # require 'nkf' - +require 'iconv' module ReFe @@ -19,7 +19,8 @@ if shift_jis_platform? NKF.nkf('-Es', str) else - str + #str + Iconv.iconv("UTF-8","EUC-JP", str) end end
■ やること
- 年金
2008年03月19日(水)
- 今日の行数:2544
- このプロジェクトはもうほとんどおしまい。
■ [dev][unix] The GNU Readline Libraryを使った
Readlineライブラリを使ってみたのでメモ。使用したReadlineのバージョンは5.2。
単純なサンプル
次のプログラムで、
- 行の読み取り
- 読み取った行の履歴を保存(C-pや↑で参照可能)
- C-b, C-f, C-a, C-e などのお馴染の編集操作
- ~/.inputrc ファイルによるカスタマイズ
などが可能になる。
#include <stdio.h> #include <stdlib.h> #include <readline/readline.h> #include <readline/history.h> int main() { char* line; while (line = readline("> ")) { /* 行の読み取り */ printf("line is '%s'\n", line); if (strlen(line) > 0) { add_history(line); /* 履歴を保存 */ } free(line); } printf("\nexit\n"); return 0; }
C-cで行のクリアがされるようにしたい
上のプログラムだと、C-cを入力するとプログラムが終了してしまった。C-c入力時は入力行を捨てて次の入力待ちになるようにしたい。
ドキュメントの 2.5 Readline Signal Handling にある機能を使えば制御できそうなんだけれど、うまくいかない。正しい使い方がよくわからん。
自分でシグナルハンドラを書いて、次のようにしたら一応実現できた。 Readlineの機能はrl_event_hook, rl_done, rl_delete_text() を利用している。
#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h> #include <readline/readline.h> #include <readline/history.h> static volatile sig_atomic_t signal_handled = 0; static void handle_signal(int signo) { signal_handled = 1; } static void set_signal_handler() { struct sigaction action; action.sa_handler = handle_signal; action.sa_flags = 0; if (sigemptyset(&action.sa_mask)) { perror("sigemptyset"); exit(1); } if (sigaction(SIGINT, &action, NULL)) { perror("sigaction"); exit(1); } } /* readline()内から定期的に呼ばれる関数 */ static int check_state() { if (signal_handled) { signal_handled = 0; /* 入力中のテキストを破棄 */ rl_delete_text(0, rl_end); /* readline()をreturnさせる */ rl_done = 1; } return 0; } int main() { set_signal_handler(); /* check_state()が定期的に呼ばれるように設定 */ rl_event_hook = check_state; char* line; while (line = readline("> ")) { printf("line is '%s'\n", line); if (strlen(line) > 0) { add_history(line); } free(line); } printf("\nexit\n"); return 0; }
C-cでreadline()がNULLを返すようにしたい
C-c入力時に行のクリアではなくプログラムが先に進むようにしたい場合はどうするのか。(最初のプログラムでC-cを入力すると最後の「exit」が出力されないが、これが出力されるようにしたい。)
上の2番目のプログラムのcheck_state()の内容を次のように変えると実現できた。
/* readline()内から定期的に呼ばれる関数 */ static int check_state() { if (signal_handled) { /* こうしないとこの関数がどんどん呼ばれてしまうみたい */ rl_event_hook = 0; /* これを呼ばないとプログラム終了後の端末がエコーバックしない */ /* 標準入力closeの前に実行しないとダメ */ rl_deprep_terminal(); /* 標準入力をcloseするとreadline()がNULLを返すみたい */ close(STDIN_FILENO); } return 0; }
コメントにも書いたけど、
- rl_event_hook をクリアしないと無限ループしてしまってダメ。
- rl_deprep_terminal() を呼ばないとC-cでのプログラム終了後に端末がエコーバックしなくなる。プログラム実行前のsttyの実行結果が「speed 38400 baud; line = 0;」だったのが、プログラム終了後は「lnext = <undef>; min = 1; time = 0; -icrnl -icanon -echo」になった。ちなみに、このように端末がおかしくなった場合は resetコマンド で元に戻せる。
- rl_deprep_terminal()の代わりにrl_cleanup_after_signal()でもいいみたい。
標準入力をcloseするのは強引かもしれない。変数signal_handledを作っているのだから、main内のループにてこの変数が1ならbreakするようにする方がいいかも。そうすればrl_deprep_terminal()の呼び出しなども不要だ。
ReadlineはGPL
便利なReadlineだけれどライセンスはGPLなんだな。利用するプログラムをGPLコンパチにできないときは使えない。
■ やること
クレジットカードダンボール振替納税手続き- シュレッダー
2013年03月19日(火)
■ [life] 歯科で歯の詰め物が取れたのを修復
土曜日に食事をしていたら、金属の歯の詰め物(インレーと言うみたい)が外れてしまった。右上奥歯。最近治した所ではなく、いつ治療したのか覚えていない。痛みは全くなし。
取れた金属の写真を青い背景で撮ると錆びたように赤く写る。不思議。本当は綺麗な銀色なんだけど。
月曜日に歯科に連絡したら、今日の予約が取れた。診てもらった所、虫歯が原因で取れたわけではないとのこと。残っていたセメントを手作業で除き、更に機械で少し削られた。削られるときは少しだけ痛かった。金属ではなくプラスチックを充填して治すとのことで、その日のうちに修復完了。プラスチックだと割れたりしても気付かなそうで心配。質問しておけばよかった…。2400円。
2019年03月19日(火)
■ [ruby] test-unit-runner-junitxmlをリリースした
Rubyのtest-unitのテスト結果をJUnit XML形式で出力するためのライブラリをリリースした。
実際に作ったのは5年くらい前で、テスト結果をJenkinsに登録するために使っていたもの。現在において需要があるかは疑問だけれど、gemになっていた方が自分が便利なので公開した。
次のようにして使う。
# test.rb require "test/unit/runner/junitxml" class MyTest < Test::Unit::TestCase def test_1 assert_equal(1, 2) end end
$ ruby test.rb --runner=junitxml --junitxml-output-file=result.xml $ cat result.xml <?xml version="1.0" encoding="UTF-8" ?> <testsuites> <testsuite name="MyTest" tests="1" errors="0" failures="1" skipped="0" time="0.0048183"> <testcase classname="MyTest" name="test_1(MyTest)" time="0.0047834" assertions="1"> <failure message="<1> expected but was <2>."> Failure: test_1(MyTest) [test.rb:6]: <1> expected but was <2>. </failure> </testcase> </testsuite> </testsuites>
2021年03月19日(金)
■ [go] http.Clientのサンプル
http.Clientを使うサンプルをメモ。GitHubのリポジトリ情報取得のAPIにアクセスしてみる。
package main import ( "encoding/json" "fmt" "log" "net/http" ) func main() { // http.Requestのインスタンスreqを作って req, err := http.NewRequest( "GET", "https://api.github.com/repos/kenichiice/test-unit-runner-junitxml", nil) if err != nil { log.Fatal("failed to create HTTP request") } // reqにHTTPヘッダを追加して req.Header.Set("Accept", "application/vnd.github.v3+json") // http.Clientを使ってreqの内容を送信する client := http.Client{} resp, err := client.Do(req) if err != nil { log.Fatal("failed to send HTTP request") } // HTTP応答のBodyを読み取る場合はCloseが必要 defer resp.Body.Close() // HTTP応答のステータスコードの確認 if resp.StatusCode != http.StatusOK { log.Fatalf("HTTP status code: %d", resp.StatusCode) } // HTTP応答のBodyのJSONを読み取る var repo struct { Description string } if err := json.NewDecoder(resp.Body).Decode(&repo); err != nil { log.Fatal("failed to decode HTTP response") } fmt.Println(repo.Description) }