pythonで時間の計算
15:46:13の616秒前っていつだ?って時のためのメモ。
$ python >>> import datetime >>> d = datetime.datetime(2007, 11, 20, 15, 46, 13) >>> d - datetime.timedelta(0, 616) datetime.datetime(2007, 11, 20, 15, 35, 57)
手打ちではめんどうだし、スクリプトに書くほどでもないし。
他にいい方法を探索中。
Solarisメモ
Solaris(Solaris 9)を使う機会があるので自分用メモ。
マニュアル
どれがlatestなのかまったくわからん。
admin collection | http://docs.sun.com/app/docs/coll/140.16?l=ja |
---|---|
reference manual collection | http://docs.sun.com/app/docs/coll/40.7?l=ja |
プロセスの情報
pargs PID | processのコマンドライン引数を表示 |
---|---|
preap PID | defucnt processを削除 |
ニコニコの時報広告はダメだろ
ニコニコが時報で広告を打つらしい。がこの機能はウザイウザイと非常に評判が悪い機能だ。*1
しかも、不愉快なタイミングでの広告は逆効果らしいので広告主にとって費用対効果はマイナスだったりして。
JavaのString.split(”,”)は、split(”,”, -1)にしたほうがいい
知ってる人にとっては何をいまさらって感じなんでしょうけど、はまってしまいました。
JavaのString.splitは、limit引数をつけないと、最後の空文字をとります。
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#split(java.lang.String,%20int)
new String("a,b,c,,,").split(",")
の結果は、
{"a", "b", "c"}
{"a", "b", "c", "", "", ""}
を取るには、以下のように、-1をつける必要があります。
new String("a,b,c,,,").split("," , -1)
APIドキュメントには、-2とかいう変な数値で例がありますが、基本的に-1でも-2でも負の数値なら同じ。最初に読んだときは意味がわからず、華麗にスルーしてしまったので、こんな羽目になりました。
ドキュメント読めっていうのは当然ですが、この仕様はひどい。perlとかから持ってきたんでしょうかね。
ちなみに、他の言語で "a,b,c,,,".split()すると、こんな感じでした。個人的には、python大好きだし、隠れた仕様がないpythonが一番いいと思うんですが、もしかして、後ろの空文字を期待する自分が変なんでしょうか?
python : ["a", "b", "c", "", "", ""]
perl : ["a", "b", "c"]
ruby : ["a", "b", "c"]
「キミのコードが汚い理由」のコードが汚い理由
キミのコードが汚い理由 - ITmedia エンタープライズ
言いたいことはともかく、コードがひどすぎですよ。。この手は話はコードで説得してくれ、と言いたくなります。
とりあえず、自分のコードをさらします。たぶん自分ならこう書くでしょう。*1
class SetScorer { private int games[2] = {0, 0}; public static final int MINIMAL_DIFFERENCE = 2; public static final int MAX_SCORE = 7; public static final int MINIMAL_WIN = 6; void gameWon(int playerNo) { games[playerNo]++; } String getSetScore() { if (isGameOver()) { return "Player" + getWinner() + " won the game " + games[getWinner()] + "-" games[theOther(getWinner())]; } if (games[0] == games[1]) { return "Set is tied at " + games[0]; } return "Player" + getWinner() + " leads " + games[getWinner()] + "-" + games[theOther(getWinner())]; } private int theOther(int playerNo) { return 1 - playerNo; } private boolean isGameOver() { for (int i= 0; i < 2; i++) { if (games[i] >= MAX_SCORE) { return true; } if (games[i] >= MINIMAL_WIN && games[i] - games[theOther(i)] >= MINIMAL_DIFFERENCE) { return true; } } // not correct if tied private int getWinner() { int winner = (games[0] > games[1]) ? 0 : 1; } }
彼もいっているように、コードの美しさは主観でしか計れませんが、たぶん多くの人にとっては私のほうがわかりやすいと思います。私から見た、彼のコードが汚い理由。
- 名前の付け方が悪いです。人間が読むメッセージを返すメソッドの名前がgetSetScoreでは、徹夜でがんばっているプログラマの脳に負担をかけすぎです。
- 関数に詰め込みすぎです。このクラスの場合だと、テニスの試合が終わったか終わっていないかの判定が大事ですが、そこを関数や、メンバにくくりだしていないのは致命的です。これは、コーディングの対象をきちんと理解していないから大事な部分がくくりだせないのです。
わたしの経験から言わせてもらうと、彼のコードはごく平均的なプログラマのコードです。彼は、次のことに気をつけるべきです。
- 名前にもっと意識を持ちましょう。知り合いのエンジニアがいつも主張していることですが、「プログラマは名前をつけるのが仕事」です。名前は読みやすさに大きく影響します。
- 意味のあるコードのブロックは関数にして名前をつけましょう。小さい関数を作ることを恐れてはいけません。「わかりにくい条件」とわかっているなら、関数にして名前をつけましょう。
- よく考えて、ちゃんと理解してからコードを書きましょう。「われわれは一部のゲーム、セット、最終スコアにかなり複雑な条件があることに気付いた」と言っていますが、この程度で複雑なんて職業プログラマに失礼です。
- 全体として、コードの構造やアルゴリズムにとらわれているようですが、むしろセマンティクスに気を配るべきです。構造だけでは読みやすいコードは書けません。
ちなみに、読みやすさと同様にコードの品質として上げられるのがテストのしやすさですが、その視点で見てもメソッドを単体でテストできるので、私のほうがいいでしょうね。。
子供の絵の見方、育て方
新装版 子どもの絵の見方、育て方 鳥居 昭美 (2003/03/25) 大月書店 この商品の詳細を見る |
最近子供がもじゃもじゃ絵を書き出したので、久しぶりに育児系の本を読んでみた。
分かったこと:
- 小学校前の子供は自分の絵が人に分かることは期待してない。何描いたの?って聞くのはあり、っていうか聞かないとダメ。
- 9歳前の子供は形がどうとか、色がどうというような客観的な絵は描けない。大人の書いてほしい絵を強制するとよくないことが起こる。
- 絵を見るときは、うまさではなくて、手数を見る。どこに力を入れて描いたか、で子供の表現したいことを観察する。
特に最後のところが気に入った。
以下、蛇足。
人のコードを見るときも、どこに力を入れてるかをよく見ると教育上いいのかもしれない。
力の入れ具合は(変数、関数、クラス名などの)ネーミングで分かる気がする。
でも、子供の絵の場合は力を入れて描いた部分を共有するというのが大事なんだろうけど、
コードに関しては力を入れていない部分でバグが発生しやすいわけで教育の方向としては逆だな。
力を入れてる部分が分かった後の対応が分からん。うーむ。