2014-06-01 :-)
_ 読書メーター
2014年5月の読書メーター
読んだ本の数:5冊
読んだページ数:1361ページ
ナイス数:19ナイス
冴えない彼女の育てかた 6 (富士見ファンタジア文庫)の感想
英梨々巻。メインヒロイン以外は倫也にデレデレなんだが相変わらず肝心の倫也の本命が見えないというかメンバー全員に対して誠実なのでなおさら本命が分からない。英梨々に対しては能動的に見えるんだけど幼馴染だからというだけだろうか
読了日:5月28日 著者:丸戸史明
学戦都市アスタリスク 05. 覇凰決戦 (MF文庫J)の感想
ロボが自我を持ち、学習により成長し、主人公たちを追い詰める。いい。ロボがいい。
読了日:5月28日 著者:三屋咲ゆう
ザ・トヨタウェイ(下)
読了日:5月24日 著者:ジェフリー・K・ライカー
ザ・トヨタウェイ(上)の感想
「トヨタウェイは、長期的な生産性を上げる狙いで、品質のつくり込みのために立ち止まったり、ゆっくり進んだりする哲学を会社のカルチャーに組み込むことである」(p.262) ところでトヨタ工場勤務していた知人が居るんだがry
読了日:5月17日 著者:ジェフリー・K・ライカー
クロス×レガリア女王の領域 (角川スニーカー文庫)の感想
ナタも蓮花も「愛する」ということを自覚したのに、物語は残酷だ / おにと鬼仙の戦争が決定したが、馳郎なら両方ひっくるめて丸く収めてくれるに違いない。
読了日:5月11日 著者:三田誠
読書メーター
_ [NetBSD][/bin/mkdir][mkdir][コードリーディング]NetBSD /bin/mkdir を読む
ソース src/bin/mkdir/mkdir.c
マニュアル mkdir - NetBSD Manual Pages
流れ
main mkpath または mkdir
main() を読む。
最初に作成するディレクトリのモードについて。~umask(0) して全部ビット立てる。umask(0) で 許可しない ビットを取得し、それを ~ で反転。mode で | で繋げるために ~ している。
/* * The default file mode is a=rwx (0777) with selected permissions * removed in accordance with the file mode creation mask. For * intermediate path name components, the mode is the default modified * by u+wx so that the subdirectories can always be created. */ mode = (S_IRWXU | S_IRWXG | S_IRWXO) & ~umask(0); dir_mode = mode | S_IWUSR | S_IXUSR;
S_IRWXU などは sys/stat.h に定義されている。
src/sys/sys/stat.h
#define S_IRWXU 0000700 /* RWX mask for owner */ #define S_IRUSR 0000400 /* R for owner */ #define S_IWUSR 0000200 /* W for owner */ #define S_IXUSR 0000100 /* X for owner */ #if defined(_NETBSD_SOURCE) #define S_IREAD S_IRUSR #define S_IWRITE S_IWUSR #define S_IEXEC S_IXUSR #endif #define S_IRWXG 0000070 /* RWX mask for group */ #define S_IRGRP 0000040 /* R for group */ #define S_IWGRP 0000020 /* W for group */ #define S_IXGRP 0000010 /* X for group */ #define S_IRWXO 0000007 /* RWX mask for other */ #define S_IROTH 0000004 /* R for other */ #define S_IWOTH 0000002 /* W for other */ #define S_IXOTH 0000001 /* X for other */
肝心のディレクトリ作成の処理はここ。引数に指定されたディレクトリをすべて処理する。
for の引数をどう使おうが勝手だけどループに影響しない変数を初期化するのやめようよ。まあ好みの問題ですが。
for (exitval = EXIT_SUCCESS; *argv != NULL; ++argv) { #ifdef notdef char *slash; /* Kernel takes care of this */ /* Remove trailing slashes, per POSIX. */ slash = strrchr(*argv, '\0'); while (--slash > *argv && *slash == '/') *slash = '\0'; #endif if (pflag) { // mkdir -p foo/bar/baz などと呼ばれたとき // ディレクトリを潜って作成する。 if (mkpath(*argv, mode, dir_mode) < 0) exitval = EXIT_FAILURE; } else { // mkdir foo などと呼ばれたとき // mkdir(2) を呼ぶだけ if (mkdir(*argv, mode) < 0) { warn("%s", *argv); exitval = EXIT_FAILURE; } else { // 自分がオーナーではないディレクトリを作成しようとしたんだろうから // ちょっと chmod しておくは /* * The mkdir() and umask() calls both honor * only the file permission bits, so if you try * to set a mode including the sticky, setuid, * setgid bits you lose them. So chmod(). */ if ((mode & ~(S_IRWXU|S_IRWXG|S_IRWXO)) != 0 && chmod(*argv, mode) == -1) { warn("%s", *argv); exitval = EXIT_FAILURE; } } } } exit(exitval); /* NOTREACHED */ }
パスを辿ってディレクトリを作成する関数がこちら。やってることはパス区切りを辿りひたすら mkdir を繰り返す。のはずなんだが
/* * mkpath -- create directories. * path - path * mode - file mode of terminal directory * dir_mode - file mode of intermediate directories */ static int mkpath(char *path, mode_t mode, mode_t dir_mode) { struct stat sb; char *slash; int done, rv; done = 0; slash = path; for (;;) { // ここの処理でパスをたどるはず slash += strspn(slash, "/"); slash += strcspn(slash, "/"); done = (*slash == '\0'); *slash = '\0'; rv = mkdir(path, done ? mode : dir_mode); if (rv < 0) { /* * Can't create; path exists or no perms. * stat() path to determine what's there now. */ int sverrno; sverrno = errno; if (stat(path, &sb) < 0) { /* Not there; use mkdir()s error */ errno = sverrno; warn("%s", path); return -1; } if (!S_ISDIR(sb.st_mode)) { /* Is there, but isn't a directory */ errno = ENOTDIR; warn("%s", path); return -1; } } else if (done) { /* * Created ok, and this is the last element */ /* * The mkdir() and umask() calls both honor only the * file permission bits, so if you try to set a mode * including the sticky, setuid, setgid bits you lose * them. So chmod(). */ if ((mode & ~(S_IRWXU|S_IRWXG|S_IRWXO)) != 0 && chmod(path, mode) == -1) { warn("%s", path); return -1; } } if (done) { break; } // でもここで slash に '/' を入れると // 次のループのとき '/' から "/" を探す↑ という処理になるので // パスを辿れないんではないのかしら *slash = '/'; } return 0; }
2014-06-02 :-(
_ 午後
1300 検討
_ [NetBSD][/bin/pwd][pwd][コードリーディング]NetBSD /bin/pwd を読む
ソース bin/pwd/pwd.c
マニュアル pwd - NetBSD Manual Pages
使用例
% pwd -L /home/rin/public_html/diary
シンボリックリンクを解決する
% pwd -P /home/rin/public_html/tdiary-core
処理の流れ
main getcwd または getcwd_logical
読む。
冒頭に嘆きの声
/* * Note that EEE Std 1003.1, 2003 requires that the default be -L. * This is inconsistent with the historic behaviour of everything * except the ksh builtin. * To avoid breaking scripts the default has been kept as -P. * (Some scripts run /bin/pwd in order to get 'pwd -P'.) */
「仕様では -L がデフォルトなんだけど、互換性のために -P 残しとくわ」
main() を読む
// pwd -L された場合 if (lFlag) p = getcwd_logical(); // それ以外では NULL にしておく else p = NULL; // -L ではない場合はこっち。つまりデフォルト if (p == NULL) p = getcwd(NULL, 0);
-P またはオプションなしの場合は getcwd を呼ぶ getcwd(3) - NetBSD Manual Pages
getcwd_logical を読む。-L された場合にこっちにくる。論理 PATH というらしんだが相対 PATH のことでいいんだろか。
static char * getcwd_logical(void) { char *pwd; struct stat s_pwd, s_dot; // 環境変数 $PWD を使う // 正確だし高速だし /* Check $PWD -- if it's right, it's fast. */ pwd = getenv("PWD"); if (pwd == NULL) return NULL; // root からの PATH だった場合は返る if (pwd[0] != '/') return NULL; // こういう PATH も返る if (strstr(pwd, "/./") != NULL) return NULL; if (strstr(pwd, "/../") != NULL) return NULL; // stat を取得できない場合も返る if (stat(pwd, &s_pwd) == -1 || stat(".", &s_dot) == -1) return NULL; // 現在地と . が一致しなければ返る if (s_pwd.st_dev != s_dot.st_dev || s_pwd.st_ino != s_dot.st_ino) return NULL; // 相対 PATH が返る? ./ みたいな? return pwd; }
2014-06-03 :-(
2014-06-04 :-(
_ 午後
1300 lint祭り
_ [NetBSD][/bin/rm][rm][ランダム][RC4][コードリーディング]NetBSD /bin/rm を読む
ソース src/bin/rm/rm.c
マニュアル rm - NetBSD Manual Pages
使用例
rm ファイル rm -r ディレクトリ
流れはこうなる。-r があると rm_tree にいく。
main rm_file または rm_tree
面白いのは -P されたとき。
rm -P ファイル
マニュアルより
-P Overwrite regular files before deleting them. Files are overwrit- ten three times, first with the byte pattern 0xff, then 0x00, and then with random data, before they are deleted. Some care is taken to ensure that the data are actually written to disk, but this can- not be guaranteed, even on traditional filesystems; on log-struc- tured filesystems or if any block-journaling scheme is in use, this option is completely useless. If the file cannot be overwritten, it will not be removed.
- ファイルに 0xff を書く
- ファイルに 0x00 を書く
- ファイルにランダム値を書く
ファイルを削除する前にデタラメな値を書き込んで、それから削除する。
これを rm_overwrite() で処理している。
コメントがあるので読むとよい。
/* * rm_overwrite -- * Overwrite the file 3 times with varying bit patterns. * * This is an expensive way to keep people from recovering files from your * non-snapshotted FFS filesystems using fsdb(8). Really. No more. Only * regular files are deleted, directories (and therefore names) will remain. * Also, this assumes a fixed-block file system (like FFS, or a V7 or a * System V file system). In a logging file system, you'll have to have * kernel support. * * A note on standards: U.S. DoD 5220.22-M "National Industrial Security * Program Operating Manual" ("NISPOM") is often cited as a reference * for clearing and sanitizing magnetic media. In fact, a matrix of * "clearing" and "sanitization" methods for various media was given in * Chapter 8 of the original 1995 version of NISPOM. However, that * matrix was *removed from the document* when Chapter 8 was rewritten * in Change 2 to the document in 2001. Recently, the Defense Security * Service has made a revised clearing and sanitization matrix available * in Microsoft Word format on the DSS web site. The standardization * status of this matrix is unclear. Furthermore, one must be very * careful when referring to this matrix: it is intended for the "clearing" * prior to reuse or "sanitization" prior to disposal of *entire media*, * not individual files and the only non-physically-destructive method of * "sanitization" that is permitted for magnetic disks of any kind is * specifically noted to be prohibited for media that have contained * Top Secret data. * * It is impossible to actually conform to the exact procedure given in * the matrix if one is overwriting a file, not an entire disk, because * the procedure requires examination and comparison of the disk's defect * lists. Any program that claims to securely erase *files* while * conforming to the standard, then, is not correct. We do as much of * what the standard requires as can actually be done when erasing a * file, rather than an entire disk; but that does not make us conformant. * * Furthermore, the presence of track caches, disk and controller write * caches, and so forth make it extremely difficult to ensure that data * have actually been written to the disk, particularly when one tries * to repeatedly overwrite the same sectors in quick succession. We call * fsync(), but controllers with nonvolatile cache, as well as IDE disks * that just plain lie about the stable storage of data, will defeat this. * * Finally, widely respected research suggests that the given procedure * is nowhere near sufficient to prevent the recovery of data using special * forensic equipment and techniques that are well-known. This is * presumably one reason that the matrix requires physical media destruction, * rather than any technique of the sort attempted here, for secret data. * * Caveat Emptor. * * rm_overwrite will return 0 on success. */
ここで言ってる「U.S. DoD 5220.22-M "National Industrial Security Program Operating Manual"」とやらはこれらしい。
DoD 5220.22-M(PDF)
「8-301. Clearing and Sanitization.」に項目があるけど、具体的な手法については書いてない。
rm_overwrite() を読む。
書き込み処理は define されている。なぜマクロ....
do{}while で囲むのは定石。カッコ付きで呼び出されたりしたときなどの対策。
#define RAND_BYTES 1 #define THIS_BYTE 0 #define WRITE_PASS(mode, byte) do { \ off_t len; \ size_t wlen, i; \ char buf[8 * 1024]; \ \ // ファイル先頭へ移動。fd は rm_overwrite() 冒頭で open() されたファイルディスクリプタ if (fsync(fd) || lseek(fd, (off_t)0, SEEK_SET)) \ goto err; \ \ // 0x00 を書くときは buf (1024*8バイト) を 0x00 で埋める。 // ランダム値を設定するときは↓で設定するので、ここではようするにデフォルト値を設定してる if (mode == THIS_BYTE) \ memset(buf, byte, sizeof(buf)); \ // ファイルサイズぶんを 8 * 1024 ずつ処理していく // ファイル末尾のほうで 8 * 1024 から余ったら余ったぶんだけ書く for (len = sbp->st_size; len > 0; len -= wlen) { \ // ランダム値を書く場合は // 8 * 1024 バイトの buf をランダム値で埋める if (mode == RAND_BYTES) { \ for (i = 0; i < sizeof(buf); \ i+= sizeof(u_int32_t)) \ *(int *)(buf + i) = arc4random(); \ } \ wlen = len < (off_t)sizeof(buf) ? (size_t)len : sizeof(buf); \ // write します if ((size_t)write(fd, buf, wlen) != wlen) \ goto err; \ } \ sync(); /* another poke at hidden caches */ \ } while (/* CONSTCOND */ 0)
読み込む処理もマクロ。
#define READ_PASS(byte) do { \ off_t len; \ size_t rlen; \ char pattern[8 * 1024]; \ char buf[8 * 1024]; \ \ if (fsync(fd) || lseek(fd, (off_t)0, SEEK_SET)) \ goto err; \ \ // pattern が比較元。埋める memset(pattern, byte, sizeof(pattern)); \ // ファイルをすべて読み込む。WRITE_PASS と同じ for(len = sbp->st_size; len > 0; len -= rlen) { \ rlen = len < (off_t)sizeof(buf) ? (size_t)len : sizeof(buf); \ if((size_t)read(fd, buf, rlen) != rlen) \ goto err; \ // 読んだ値 buf と pattern を比較 if(memcmp(buf, pattern, rlen)) \ goto err; \ } \ sync(); /* another poke at hidden caches */ \ } while (/* CONSTCOND */ 0)
つまり WRITE_PASS でファイルにちゃんと書かれているかを確認している。
これらを呼び出す処理。
/* * DSS sanitization matrix "clear" for magnetic disks: * option 'c' "Overwrite all addressable locations with a single * character." */ randint = arc4random(); randchar = *(char *)&randint; WRITE_PASS(THIS_BYTE, randchar); /* * DSS sanitization matrix "sanitize" for magnetic disks: * option 'd', sub 2 "Overwrite all addressable locations with a * character, then its complement. Verify "complement" character * was written successfully to all addressable locations, then * overwrite all addressable locations with random characters; or * verify third overwrite of random characters." The rest of the * text in d-sub-2 specifies requirements for overwriting spared * sectors; we cannot conform to it when erasing only a file, thus * we do not conform to the standard. */ /* 1. "a character" */ WRITE_PASS(THIS_BYTE, 0xff); /* 2. "its complement" */ WRITE_PASS(THIS_BYTE, 0x00); /* 3. "Verify 'complement' character" */ READ_PASS(0x00); /* 4. "overwrite all addressable locations with random characters" */ WRITE_PASS(RAND_BYTES, 0x00);
arc4random() はランダム生成器 arc4random - NetBSD Manual Pages
RC4 でランダム値を生成するよ。
でもちょっとヤバいかもしれず という噂 RC4の脆弱性とSSL/TLSへの攻撃
_ 茨城県プレミアム宿泊券が販売開始です。:大洗ホテル【公式ブログ】:So-netブログ
インターネットナントカは売り切れておりもはや茨城でしか買えない 茨城県プレミアム付き宿泊券2014 | 観光いばらき(茨城県の観光情報ポータルサイト)
2014-06-06 :-(
_ 午後
1300 デバッグしTARI
_ [NetBSD][/bin/sync][コードリーディング]NetBSD /bin/sync を読む
ソース src/bin/sync/sync.c
マニュアル sync - NetBSD Manual Pages
shutdown する前に呼び出すようなオマジナイのあれ。
int main(int argc, char *argv[]) { setprogname(argv[0]); sync(); exit(0); /* NOTREACHED */ }
sync(2) - NetBSD Manual Pages を呼んで終わり。
2014-06-08 :-)
_ [艦これ]艦これ 5-2 珊瑚諸島沖
珊瑚諸島沖海戦「MO作戦を実施する。空母機動部隊を展開し、南方海域に出没する敵機動部隊を叩け!」
ボス 4 回撃破でクリアという海域。
史実の戦闘はこれか。珊瑚海海戦 - Wikipedia
珊瑚海海戦(さんごかいかいせん, Battle of the Coral Sea)は、太平洋戦争(大東亜戦争)で大日本帝国海軍(以下日本海軍)と連合国(アメリカ合衆国・オーストラリア)軍のあいだで戦われた主な海戦のひとつ。
1942年5月8日、珊瑚海で日本海軍の空母機動部隊とアメリカ海軍を主力とする連合国軍の空母部隊が激突し、歴史上初めて航空母艦同士が主力として戦った海戦である。また、この海戦は対抗する両艦隊が互いに相手の艦を視界内に入れないで行われた、歴史上最初の海戦である
編成はこんな。正規空母x2 と軽空母。戦艦をテキトーに、先制雷撃のためにハイパーズ。レベル上げたり周回するときは戦艦を重巡にしたりなどもっと低燃費にしないとツラいだろう。春イベント以来 制空権確保が重要になったので烈風をどれだけ積めるかを考えると加賀さんが必須になってしまった。
ルートはこっちだったり
こっちだったり
昼戦で終わることもあれば夜戦にもつれ込むこともしばしば。
先日のメンテナンスで飛龍改二が実装されたけど手元には居なくて、facebook の「FB鎮守府」で飛龍祭りになっており非常に羨ましい思いをしていたんだが、ついに我が鎮守府にも飛龍が来た。
三隈も来た。
霧島 N 人目。
クリア
いままで無課金( 母港 100 人 )だったんだがけど飛龍、三隈を迎えて母港が限界になったのでついに課金してしまった。母港20拡張。
2014-06-09 :-(
_ 午後
1300 デバッグしTARI
_ 夜
1700 残業アワー
2130 退勤 || 東京アメッシュを見たら東京都がすげえことになってたんだけど外に出てみたら小降りだった
2230 飯。鮭の味噌焼き? 味噌漬けてフライパンでごーんとしただけ
_ ,
汝、いま何時?
_ ,
life is game.
2014-06-10 :-(
2014-06-12 :-(
2014-06-14 :-)
2014-06-15 :-)
_ [リッジレーサーナイト]SweepRecord Presents RIDGE RACER NIGHT 2
未遂
会場まで行ったんだが入場規制されていたのでサクっと引き返した。
優先入場整理券の CD 帯は持っていたんだけど最初から行くと疲労がハンパないし翌日に響くので大久保博さんの出番から行くかーと思いゆっくりしていたら Yahoo リアルタイム検索で RRN2 タグを検索したら入場規制されているという post を見かけたんだがひとまず行ってみたところまあたしかに入場規制されていた。
記念撮影だけ
細江慎治さんからの reply きた。検討してくれるってよ(ぇ
@miwarin すんませーん|д゜)
— shinji hosoe (@shinji_hosoe) 2014, 6月 15
@miwarin け…検討させます(;゚ー゚)
— shinji hosoe (@shinji_hosoe) 2014, 6月 15
_ 読書するから設けるんじゃなくて設けるスキルがあるひとが読んだだけ
必読!年収1000万円超えのビジネスパーソンが選んだ20冊 - CNET Japan
おおむね読んだけど年収1000万円もありません。
- 【読】 7つの習慣―成功には原則があった! スティーブン・R.コヴィー
- マネジメント ピーター・F.ドラッカー
- 【読】人を動かす デール・カーネギー
- 【読】ビジョナリー・カンパニー― 時代を超える生存の原則 ジェームズ・C・コリンズ、ジェリー・I.・ポラス
- 【読】孫子(孫子の兵法) 孫武(『孫子の兵法』著者は守屋洋)
- 【読】論語 孔子
- 【読】坂の上の雲 司馬遼太郎
- コトラー&ケラーのマーケティング・マネジメント フィリップ・コトラー、ケビン・レーン ケラー
- 【読】ザ・ゴール ― 企業の究極の目的とは何か エリヤフ・ゴールドラット
- 竜馬がゆく 司馬遼太郎
- 競争の戦略 マイケル・E・ポーター
- 【読】プロフェッショナルの条件―いかに成果をあげ、成長するか ピーター・F. ドラッカー
- 三国志 陳寿
- 【読】金持ち父さん貧乏父さん ロバート・キヨサキ
- 考える技術・書く技術―問題解決力を伸ばすピラミッド原則 バーバラ・ミント
- 聖書
- 【読】道は開ける デール・カーネギー
- 【読】もし高校野球の女子マネージャーがドラッカーの『マネジメント』を読んだら 岩崎夏海
- 企業参謀 大前研一
- 生き方―人間として一番大切なこと 稲盛和夫
2014-06-17 :-(
_ 午後
1300 デバッグしTARI
_ すくすくスク水
スクラム の原典があるというのでたどり着いたが会員登録しないと全文読めないので会員登録した。
The New New Product Development Game - Harvard Business Review
2014-06-18 :-)
_ 鎌倉紀行
アジサイの時期なのでアジサイを見てきた。
一昨年は開成まで行った[ 20120616#p04 ]んだがあそこは周囲が田んぼでありアジサイだけを見るのでいまいち他の楽しみがない。アジサイ寺が存在するくらいなので鎌倉へ行ってきた。
明月院が有名らしい。平日だから人は少ないだろうと思っていたが甘かった。多い。土日だったらどうなっていたことか。
ハートっぽい?
途中に ラビットハウス うさぎ小屋があった。
鎌倉駅方面へ移動しておひる @鎌倉峰本
天丼おいしい
その後 鶴岡八幡宮へお参り。
これが倒れてしまった大銀杏( 鶴岡八幡宮 - 大銀杏 )
お土産を買って帰路についた。
2014-06-20 :-(
_ 午後
1300 エラーを考えTARI
2014-06-22 :-)
2014-06-23 :-(
_ 午後
1300 エラーを考えTARI
_ 夜
1700 退勤 && 移動
1800 自社業務@大田区民プラザ || スクラムがどうのこうのとか Running Lean がどうのこうのとかといったことを後輩たちへ教えるなど || 薄っぺらい知識でスマぬ || いやどうなん Running Lean というかリーンスタートアップって話題に見なくなったけど、話題にならないくらい当たり前のものとして浸透しているから今更話題にならないのか、リーンスタートアップはオワコンだからすでに話題になっていないのか
2130 飯。鮭のムニエル
_ 富野由悠季が監督やるガンダムの主人公は若手声優が演じる
という仮説を昔から考えてるんだけど今更調べてみた。
ただしソースは wikipedia
作品 | テレビ放映(年) | 主人公 | 声優 | 活動開始(年) |
機動戦士ガンダム | 1979 | アムロ・レイ | 古谷徹 | 1966 |
機動戦士Ζガンダム | 1985 | カミーユ・ビダン | 飛田展男 | 1982年 |
機動戦士ガンダムΖΖ | 1986 | ジュドー・アーシタ | 矢尾一樹 | 1985 |
機動戦士ガンダムF91 | 1991 | シーブック・アノー | 辻谷耕史 | 1985 |
機動戦士Vガンダム | 1993 | ウッソ・エヴィン | 阪口大助 | 1992 |
∀ガンダム | 1999 | ロラン・セアック | 朴璐美 | 1998 |
ガンダム Gのレコンギスタ | 2014 | ベルリ・ゼナム | 石井マーク | ???? |
「活動開始」はその声優が声優としての活動を始めた時期らしい。
古谷徹は 10 年目のときにアムロ・レイやったけど、それ以外の方々は若手といっていい。かなあどうかなあ。
辻谷耕史は 1989年「0080ポケットの中の戦争」が初レギュラーだそうな。石井マークは wikipedia に載ってない。事務所のページを見たけど詳細が分からん。
2014-06-24 :-(
_ 午後
1300 調査したような
_ 夜
1700 退勤 && 移動
1800 打ち合わせ@自社 && 「許可を求めるな謝罪せよ」というような方向性を確認した次第 (ref. 許可を求めるな謝罪せよ。(Don't ask for permission, beg for forgiveness ) - 未来のいつか/hyoshiokの日記 )
1920 退勤
2130 飯
2014-06-25 :-(
_ 午後
1300 射撃しつつ前転
_ [コードリーディング][NetBSD][/bin/sleep]NetBSD /bin/sleep を読む
ソース src\bin\sleep
マニュアル sleep - NetBSD Manual Pages
Note: The NetBSD sleep command will accept and honor a non-integer number of specified seconds. This is a non-portable extension, and its use will nearly guarantee that a shell script will not execute properly on another system.
NetBSD では小数点にも対応してるけど互換性が無いので非推奨。
コード読む
処理は main() のみ。
冒頭のコメントも含めて
昔の sleep との互換性のために小数点をチェックしてる。 最近はでかい数値であっても問題ないはずだけどねー 1000000000.9 とかいう数値を渡してきても知らんよ :-) atof は locale の影響を受けるので isdigit してます。 /* * Okay, why not just use atof for everything? Why bother * checking if there is a fraction in use? Because the old * sleep handled the full range of integers, that's why, and a * double can't handle a large long. This is fairly useless * given how large a number a double can hold on most * machines, but now we won't ever have trouble. If you want * 1000000000.9 seconds of sleep, well, that's your * problem. Why use an isdigit() check instead of checking for * a period? Because doing it this way means locales will be * handled transparently by the atof code. */ fracflag = 0; arg = *argv; for (temp = arg; *temp != '\0'; temp++) if (!isdigit((unsigned char)*temp)) fracflag++; if (fracflag) { val = atof(arg); if (val <= 0) usage(); ival = floor(val); fval = (1000000000 * (val-ival)); ntime.tv_sec = ival; ntime.tv_nsec = fval; } else { ntime.tv_sec = atol(arg); if (ntime.tv_sec <= 0) return EXIT_SUCCESS; ntime.tv_nsec = 0; }
国ごとに小数点が異なるので( 小数点 - Wikipedia ) atof は locale に影響されるという。
あとは nanosleep で寝るだけ nanosleep(2) - NetBSD Manual Pages
original = ntime.tv_sec; signal(SIGINFO, report_request); while ((rv = nanosleep(&ntime, &ntime)) != 0) {
tv_nsec について
timespec 構造体の tv_nsec はナノ秒である timespec(3) - NetBSD Manual Pages
ナノ秒は 1/100万秒( 0.000000001秒 )である。
コメントに書かれている 1000000000.9 を指定するとようするに tv_nsec はオーバーフローする。
おためしコード。
char *arg = "1000000000.9"; val = atof(arg); ival = floor(val); fval = (1000000000 * (val-ival));
値は以下のとおり
val=1000000000.900000 ival=1000000000.000000 fval=899999976.158142
10.9 を指定すると
char *arg = "10.9";
こうなる
val=10.900000 ival=10.000000 fval=900000000.000000
とはいえ tv_nsec (ナノ秒) がオーバーフローしたところで、ナノ秒のスケールでの誤差が果てして問題になるのか、OS の tick がナノ秒に対応しているのか( 対応してないだろ )、そもそもナノ秒の sleep が NetBSD だけの実装なのでそれが問題になるのか。などなど
2014-06-26 :-(
_ 午後
1300 射撃しつつ前転
_ [ポエム][プロジェクト管理][リーダー]歩き回らない経営らしきもの
Management by wandering around - Wikipedia, the free encyclopedia
Yahoo の「爆速経営」を読んでそのなかの経営陣のうちの誰だったか配下のメンバーの様子を把握するために強制的に(システムとして)毎週メンバーと会話する席を作り自分の意識とメンバーの意識を合わせていった雑談でもなんでもいいからやった等と書いてあったので私も真似て始めてみた。
「歩き回る経営」というのがある。プロジェクトリーダーがプロジェクトメンバーのもとへ行き「どうよ」等と話しかけメンバーに変わったところがないかなどを洞察し状況を把握するための手法である。最初に目にしたのはたしか「アート・オブ・プロジェクトマネジメント」だったと思うんだが、もとを辿ると hp のヒューレットだったかパッカードだったかどちらかがやっていたことらしい。
去年 10 月からいまの仕事場へ勤務しはじめてメンバーの様子を把握するために「歩き回る経営」をやってみようと考えていたんだがどうにもちょいとメンバーとの場所が離れているしそもそも業務で関わりがあるわけではないし若干訪問しづらくて要するに億劫になっていてあまり「歩き回る経営」が出来なかった。根性でやろうと思っていたが根性では出来ないのでメンバーと強制的に会話する仕組みを作ることにした。作った。といってもだいたい毎週 15 分くらい駄弁るだけではある。ひとまず 2, 3 ヶ月やってみる。
以前の派遣先では昼休みに上司とひたすら駄弁っていた。どうやってカネを儲けるか、派遣に来ている我々の役割りはなにか、何が出来るのか、といったことを議論したりしていた。とはいえ会話のほとんどは通勤時間の南武線は JK も見かけず目がツラいとか、横浜にある県庁のレストランが安いとか、リッジレーサーがどうのこうのとか、8 割くらいはそういうどうでもいい会話だった。それでもその時間を過ごしたことにより仕事について上司と方向性を確認したり、私自身仕事のやり方がまったくダメだったことを教え込まれたし、有意義ではあった。
その経験をいまのメンバーたちにも実践してやりたいんである。なにも「亀の甲より年の功」と云うつもりはなくて、お互いに刺激しあえればよいと思っている。私かて立派な人間だとは思っておらんゆえ。
4822274292
4873112990
2014-06-27 :-(
_ 午後
1300 射撃しつつ前転
2014-06-28 :-)
_ [ガールズ&パンツァー][ガルパン][サンスポ]サンスポ特別版「ガールズ&パンツァー新聞」
サンスポ特別版「ガールズ&パンツァー新聞」明日発売!ねんどろ沙織予約受付開始! ガールズ&パンツァー公式ブログ/ウェブリブログ
コンビニで買えるらしいので手当たり次第に寄ったところサークルKサンクスにあったので買った。
_ [PGM]PGM を読む
ファイルの中身はこんな。世界一有名な女性なのではないかと レナ (画像データ) - Wikipedia
とりあえず読むだけ
ruby
# conding: utf-8 class PGM :ST_MAGICK :ST_SIZE :ST_GRAY :ST_DATA def initialize() @stat = :ST_MAGICK end def read( filepath ) magick = "" width = 0 length = 0 gray = 0 data = nil filesize = File::stat( filepath ).size pgm = File.open( filepath ).read( filesize ) pgm.each_line {|line| case @stat when :ST_MAGICK next if line =~ /^#/ magick = line @stat = :ST_SIZE when :ST_SIZE next if line =~ /^#/ sp = line.split() width = sp[ 0 ].to_i length = sp[ 1 ].to_i @stat = :ST_GRAY when :ST_GRAY next if line =~ /^#/ gray = line.to_i @stat = :ST_DATA when :ST_DATA data = line.unpack("C*") end } puts "magick: #{magick}" puts "width: #{width}" puts "length: #{length}" puts "gray: #{gray}" # puts "data: #{data}" end end def main(argv) pgm = PGM.new() pgm.read(argv[0]) end main(ARGV)
参考: PGM ‐ 通信用語の基礎知識
2014-06-29 :-)
_ [コードリーディング][NetBSD][/bin/sync]NetBSD /bin/sync を読む
ソース src/bin/sync/sync.c
マニュアル sync - NetBSD Manual Pages
sync(2) - NetBSD Manual Pages を呼ぶだけ
int main(int argc, char *argv[]) { setprogname(argv[0]); sync(); exit(0); /* NOTREACHED */ }
_ エモエモ [CDポチったけど行きそびれたンゴ|д゚)]
_ みわ [最後のほうは物凄い密集度だったらしい。むしろエモエモどこにおるの]
_ エモエモ [盛岡なんだよなぁ(無理ゲー)]
_ みわ [無理すぎる。。]