ラベル computer の投稿を表示しています。 すべての投稿を表示
ラベル computer の投稿を表示しています。 すべての投稿を表示

2008年10月28日火曜日

優秀なプログラマは空気を読んで空気を描く

まず、3つのポイントをおさらい。
  1. 変数のスコープは小さく抑える
  2. Do Not Repeat Yourself (DRYの原則) 同じコードは2度書くな
  3. 言語を極めよ

この1と2は、まったく違うようで、とても似た問題を扱っていることにお気づきでしょうか。それは「依存関係」を減らすか増やすか。


矛盾を抱えるプログラマ 変数のスコープを短くすると、コードで必要なデータを近くにまとめて依存関係を減らすことができます。要するに、コードを

inputから、output(+副作用)を作る

というメソッドと同じparadigm(パラダイム: 枠組み)にまとめたいわけです。この形にすると、コードをメソッドの形に書き直して、再利用することが簡単になります。グローバル変数を多く使っているコードは、依存関係を即座に判断するのが難しく、メソッドに纏め上げるのが大変なので忌み嫌われています。

一方、DRYの原則に従ってメソッドやクラスとして一箇所にまとめられたロジックは、使うユーザーや使われる場所が増えるため、依存関係を増やします。使う場所が増えないなら、メソッドやクラスにまとめる理由は、コードにわかりやすい名前(alias)をつけるくらいの意味しかありません。例えば、あちこちで頻繁に使われる文字列型(string)の最初の文字のindexが0ではなく1に変更されたら、大惨事になるでしょう。

プログラマって、依存関係を減らそうと努力しているかと思えば、一方で依存関係を増やそうと一生懸命になる、とても不思議な生き物です。入力から出力を作る枠組みでしか物事を考えられない、可哀想な生き物でもあります。

変数のスコープを最小に抑えると、リソースを解放するタイミングを明確にできる利点がありますが、GC(garbage collection) を搭載した現代的な言語実装では、不要になったらメモリを即解放というわけにはいかないので、スコープが多少ずれていても、さほど深刻ではありません。

プログラマは空気を読む 学生向けにプログラミングの講義をしていたときに学んだのは、ソースコードを追う能力の乏しい段階の学生さんは、抽象化されたコードの「意味」ではなく、「動作」を追ってしまう、ということ。

例えば、SQLなどは高度に抽象化されたコードの典型例でしょう。(これを宣言型という人も多いですが、抽象化の度合いの違いにすぎません)。以下のSQL文、

SELECT * FROM t1, t2 WHERE t1.id = t2.id

を見て、「2つのテーブルt1とt2でidが同じ値の行を結合する」、と読み取れたなら、おめでとう! もうあなたは立派に優秀なプログラマです。

例え内部で、lexer, parserからなるSQLコンパイラが動いていて、テーブルとクエリの静的型チェックをし、問い合わせスケジュールを組み立て、テーブルのデータ分布に基づいてスケジュールを最適化し、B+-treeとsequentialレコードを、ページロックを取得しながらserializabilityが保証されるようなプロトコルに従って検索して、必要ならライトウェイトロックで管理されたキャッシュにディスクページを保存しつつ、テーブルの結合にディスクを介したhash joinやexternal merge sortを実行していたとしても、そんなことは気にしてはいけません。SQLという入力から得られる結果の意味、つまり空気を読むことが大事です。

プログラミング言語は空気を描くもの どのプログラム言語を極めたらいいかって? 空気を読みやすくて、自分の空気を描けるもの。できなければ拡張するか、作る。これが言語を極めるということでしょう。作るのは割に合わない? 使いやすいプログラミング言語とその実装・ライブラリが出来上がるのを待つリスクが割に合うなら、のほほんと偶然の産物を待つのも一興でしょう。

(追記 10月29日)

考えることを減らせるように書く

長くなったのですが、同じラボにいた川中君がきれいにまとめてくれました。


メソッド(関数)によるコードの整理や、オブジェクト指向による実装の隠蔽、プログラミング言語のなりたちなど、プログラミングのすべてはこの動機から始まります。すばらしい。

2008年10月21日火曜日

僕のパソコンで動いたよ!証明書

開発者にとって、作ったプログラムがちゃんと動くことを証明するのは、悩みの種。なぜなら、人によってOSの設定も、インストールされているソフトウェアも違うから、作ったコードはそのままじゃ動かないかもしれない。でも安心して! そんな時はこのバッジを張ればいいんだ。

Works on My Machine Certificate 
僕のパソコンで動いたよ!証明書



Technical Certification Requirement
このバッジ(証明書)を発行するための技術的な要件は以下の通り:
  • コードをコンパイルします(他の開発者が修正した最新版のコードを使うかどうかはあなた次第であり、この証明書の要件ではありません)
  • コンパイルしたアプリケーション/ウェブサイトを立ち上げます
  • 変更箇所に該当するコードを実行します(推奨する方法は、自分の手でad-hocにコードの動作を確認すること。もし変更箇所が5行に満たない場合や、開発のプロフェッショナルとしてエラーが起こりようもないと判断できるときは、このステップを省略してもよいでしょう)
  • 修正したコードをヴァージョン管理システムにチェックインします
Notification Requirement
この証明書を使用するときの通知義務:
  • テスターや顧客に、この証明書を開示する義務はありませんが、きっと人に見せたいと思うはずです。そして、あなた自身はきっとこの証明書を相当誇りに思うでしょうが、「僕のパソコンで動いたよ!」証明書を使うときには、むやみやたらに大喜びするのではなく、さりげなくこれは自己満足なんだよ、という雰囲気を醸し出すと良いでしょう。
使用例:



2008年9月3日水曜日

Googleの新しいブラウザChrome レビュー

Googleが開発しているブラウザGoogle ChromeのBeta版がリリースされました。最初から、AJAXを使ったものを含むいろいろなサイトが問題なく動くのはさすが、というところ。(Google にはChrome Botというのがいて、何百万というWebページを自動でテストしてるらしいです。)

Googleにとって、ブラウザ技術というのはサービスを提供するための基盤技術という意味で、まさにOSです。ブラウザの開発は過去にNetscapeが過去のコードを捨てて一から書き直すなどの苦労をしていたように、とても大変な領域なのですが、基盤技術を自分達で作るという正攻法に素直に取り組んで実現までしてしまうのがGoogleらしいですね。

使い始めて驚き。まず、検索バーがありません。Google Chromeのおかげで、検索バーは、本来必要ないものだったことがわかります。使い方は簡単。まず、Ctrl+Lを押してアドレスバーに飛びます。ここで、覚えているURLの一部分なり、キーワードを入れると、過去の閲覧履歴やら、Google Suggestやら、ブックマークやらを検索して、見つけてきてくれます。検索バーなどが統合された分、全体として余計なボタンが省かれたすっきりしたブラウザになっています。


新しいタブを開く操作は、IE7, Firefoxと同じCtrl+Tです。すると、普段よく見てい
るサイトがスクリーンショットとともに一覧表示されます。これは便利。反対に閉じるときはCtrl+Wと、タブを切り替えるときは、Ctrl+Tabを使います。



マウスで選択してもよいし、タブを開くとすぐアドレスバーにフォーカスが移るので、そのままキーボードで検索を開始できます。このあたりのつながりの良さが快適。

各タブ毎にプロセスを生成しているので、重いサイトがあっても、他のページは不自由なく見続けられるなど、技術的にもOS好き、プログラマにとっては興味深いことばかり。ブラウザ中にデータベースを保持できるGoogle Gearsも最初から組み込まれているのもうれしいところ。技術者には、ここにあるGoogle Chrome紹介のコミックがお勧め。(JavaScriptのGarbage Collectionを作り直しているとか、すごい正攻法。これもGmailなど, 自前のGoogle Web Toolkitで作成されている部分の高速化につながるので、自分の財産の価値をさらに高めています)

Web Developer向けの機能として、HTMLソース中の各タグの構造やスタイルを表示してくれるinspector機能がうれしい。FirefoxでFireBugsプラグインと同じような機能が最初から使えるのです。ありがとう、Google。Web開発者の気持ちをよく理解してくれています。


タブをブラウザの外側にドラッグすると、独立したウィンドウになるので、他のページを参照しながら、ブログを書くということも、簡単。

ページ表示の履歴を残さないシークレットモードもあります。のアイコンには笑ってしまいました。スパイ活動に使うのか、なるほどw。リンクを開くときに右クリックで「シークレットモード」を選べます。

IMEのon/off関係なしに、スペースキーで画面のスクロールができるし、わりと細かいところもしっかり実装されていて感心。デフォルトのブラウザに設定して、しばらく使ってみることにします。

(追記)
その他のショートカットキー
  • Ctrl+F ページ内単語検索 これもシームレスで速い!
  • Ctrl+U ページのソースコード表示
  • Ctrl+H 閲覧履歴のページ表示
  • Ctrl+N 新しいwindowを開く
  • Ctrl+R ページの再読み込み
  • Ctrl+J ダウンロード履歴の表示
  • アドレスバーでの検索結果をAlt+Enterで新しいタブで開く
  • backspaceで一つ前のページ、Shift+backspaceで一つ先のページ
  • 意外と便利なCtrl+Shift+Tで閉じたタブを復元。フォームの入力内容も復元されます。何回か押すと、1つ前、2つ前に閉じたタブを復元していきます。
Shift+ESCキーで、各ページがどれくらいメモリとCPUを使っているかもわかります。すごい。



about:network でネットワークのアクセス状況、about:memoryでメモリの使用状況の詳細も見られます。AJAXアプリケーションなどバックグラウンドで通信を行う様子を確認できて便利。


雑感 GoogleがGearsを統合したブラウザを開発し、僕が2年くらい前に予測していた「ブラウザがデータベースを持つ日」がようやく実現されましたが、使う側にとっても、開発者側にとっても、データを扱うという点については、まだまだ不自由が多いと思います。例えば、Twitterの過去ログを追う、などの問題。Twitter APIからログを取得して保存しておくような媒介サービスはたくさんあるけれど、これがブラウザ上でユーザーの手で実現できるところまでブラウザは進化すべきだと僕は考えています。ここからが競争。

2008年8月27日水曜日

プログラマとして生きるということ

はてなを眺めるようになってから、「IT土方(どかた)」という言葉を知りました。IT土方とは、

システムエンジニアプログラマーなどにおける過酷な労働条件を自嘲的に表現したもの。「土方」は差別用語及び放送禁止用語として扱われているため、使用の際には留意すること。

という意味だそうです。僕は研究者だけれど、プログラマでもあるので、プログラマが世間でこう呼ばれているのは非常に悲しいことです。プログラマというのは、本当はとても魅力的な仕事です。土方で甘んじているのは、きっと「プログラマ」として生きていないのだとも思います。(例えば、矢野勉さんのエントリにも挙げられているような状況の人達です)


プログラムをデザインする、ということ プログラムの場合、通常の土木工事と比べて顕著に違うのが、一度作ったコードを「一から作り直さないようにデザインできる」ということ。たとえば、コマンドライン引数を処理するプログラムを一度作ると、それをクラスの形に整理して(OptionParserクラスなどと名づけて)ライブラ リにしておきます。ライブラリを作る作業は、Windowsならdllを作る、JavaならJARファイルにまとめることに相当します。

書いたプログラムが自動的に再利用可能になるわけではなく、そうなるように「デザインできる」ということで、この間は結構違いがあります。二度目からは、ライブラリにリンクして使うので必要な仕事の量は格段に減りますし、使い道にあわせてライブラリの修正をしなくてはいけないことも多いですが、機能を改善し、使い勝手を向上できるというメリットがあります。修正に費やす時間は、今直すか、後で必要になってから取り掛かるか、という違い。Ruby on Railsのフレームワークも、Webアプリケーションで頻繁に書くようなコードをうまくライブラリ、モジュールにしていると思います。

プログラミングが肉体労働になりやすいのは、おそらく、このライブラリにまとめるという経験が不足している場合。Visual Studioでdllを作っておくだけで、ビルド時間や開発時間は短縮できるし、Javaならmavenを使えば、細かな修正を施したjarを頻繁にreleaseする作業が苦ではなくなります。PerlだったらCPAN用のモジュールを作るとか、RubyならRuby gems用モジュールを作るというところでしょうか。

他に考えられるのは、プログラマ自身が今書いているコードが二度目のコード(重複がある)と思っていない可能性。オブジェクト指向の考え方や、デザインパターン(クラスの組み方の過去の知見)を知らなくて、コードを再利用可能な形でまとめることに考えが及ばない、ということがありえます。Subversionやgitなどのソースコード管理ツールの存在を知らないと、再利用といっても、常にコピー&ペーストするという最悪な方法を採っている人も多いかと思います。これでは単純労働となっても仕方がない。


ハッカーと画家 ここで紹介したいのが、「ハッカーと画家」という話です。ソースコードを書くのは、絵画を描くのと非常に似ています。僕自身もそうですが、新しいものを創ることだけでなく、良いコード、簡潔でわかりやすいコードをデザインすることに魅力を感じます。本文中には以下のように書かれています:
ハッカーと画家に共通することは、どちらもものを創る人間だということだ。作曲家や建築家や作家と同じように、ハッカーと画家がやろうとしているのは、良いものを創るということだ。良いものを創ろうとする過程で新しいテクニックを発見することがあり、それはそれで良いことだが、いわゆる研究活動とはちょっと違う。
コードをデザインする能力が、画家の画力と同じように、良いプログラマたる条件でしょう。良いデザインを考えることはかなり高度な知的活動になります。ただ、ビジネスモデルの中で、プログラマが良いデザインをすることと売れることが直接結びつくケースは少なく、プログラマが労働過多になるのは、以下のような事情によるものかと推察します:
Yahooに入ってみたら、彼らにとってハックするということはソフトウェアを実装するということで、デザインするということではないということがわかった。プログラマは、プロダクトマネージャのビジョンとかいったものをコードへと翻訳する技師とみなされていたのだ。

究極のプログラミング - コンパイラを作る- コードをデザインする時間・許可が与えられない場合、たとえば、コンパイラを作る、なんてことは到底認められないでしょう。けれど、コードを書くというのは、人が考えていることを機械が実行できるようにすること。この意味から考えると、究極のプログラミングはコンパイラを作ることにあります(お絵かきソフトなど人の入力を画像データにするのも、ある意味コンパイラですね)。簡単な記述で、素敵な仕事をしてくれるのがコンパイラです。コンパイラを作る時間、そのために必要な技術を習得するコストが大きいので、通常は、他人が作った言語やフレームワークを使ってコードを書いているだけです。

Webアプリケーションのように、どのOS、どのブラウザでも動くコードを書くのは大変です(主にIEが他とケンカしてしまう悪い子なので…)。だから、その作業を軽減するために、Google Web ToolkitではJava言語からJavascriptコードを生成するコンパイラを作るという、とても良い仕事をしてくれました。けれど、コンパイラを作るのだって、そんなに大変なわけじゃないですよ?以下は、Joel on Softwareより引用
Most people don't realize that writing a compiler like this is only about 2 months work for one talented person who read the Dragon book. Since the compiler only has one body of code to compile, it is much easier to write. It doesn't have to be a general-purpose compiler. It doesn't have a math library, for example. (多くの人が、コンパイラを書くのはドラゴンブックを読んだ優秀な人が2ヶ月くらいでやる仕事だってことをわかってない。コンパイラには、コンパイルするコードしかないので書くのは簡単だし、一般的なコンパイラなんて書く必要はないんだ。数学ライブラリなんてものもいらない。)
ドラゴンブックはコンパイラの教科書としてとても有名ですが、隅から隅まで読む必要はなくて、字句解析、構文解析の概要を知って、Lex/Yacc/Bison, ANTLR、JavaCCなどどれか1つのツールの使い方を学べば、コンパイラはすぐにでも作り始めることができます。

開発するプログラムが同程度のものなら、フレームワークなり、コンパイラがあるだけで相当仕事が短縮されるはずです。ここで負荷が減らないなら、コンパイラで仕事が簡単になったから、あれこれ追加機能を実装しようと欲張るなど、開発すべき仕事が単純に増えているのでしょう。逆に、コンパイルコマンド1つで製品ができても、それを1分、1秒の時間単価や人月で見積もられてはいけないのだと思います。

プログラミング+αの時代  インターフェースのデザインなどは、上記の「ハッカーと画家」の例のような比較とは違って、本当に「画家」とか「デザイナー」の能力を要する分野に踏み込んでいるので、プログラマの仕事としては過負荷になっているのだと思います。

僕は、デザインすることは昔から好きだし、コミック、油絵とかも良く描いていたので、ウェブデザインをするのは時間はかかって大変なことだけれど、楽しい部分として受け入れることができます。まだまだ未熟だけれど、デザイン+コーディングの両方できるというのは僕自身の専売特許だと思います。データベースが専門でシステムを作れるというのも、プログラマとして持っている僕の付加価値です。プログラマは、コードをデザインするだけでなく、+α(アルファ)の部分で、自身のブランドを作れる存在だと僕は思っています。売れないブランドだって当然でてくるわけで、オープンソースのApacheブランドだって、よくよく見てみるといいコードばかりではありません。

プログラムをデザインする能力を習得した上で表現すべき「+α」の部分が、まだまだ未開拓のように感じています。コンピュータ専攻の人だけでなく、もっといろいろな人にプログラムを学んで欲しいと思うのです。自分の魅力である「+α」をアピールするためにプログラムを作ってみる、知識が足りなければプログラミングを学ぶ、この繰り返しをするのがレベルアップへの近道でしょう。

プログラムやコンパイラを作るというのは大変なことですが、「魅力的なものを創る」ためには欠かせないことです。コンピュータ、インターネット内だけの話ではなくて、コンピューターでデザインして、現実の作品を作るなんてこともできます。せっかくプログラミングという応用分野が広く、すばらしい技術を学んだのに、人に言われたものだけ黙々と作るというのでは、面白くないのは当然。

プログラマが「+α」を作るという意味で、作ったものが売れないことがあるのも、飛ぶように売れる(有名になる)ことがあるのも、作家や画家と似たものを感じます。それはプログラマという職そのものの性質ではなくて、ビジネスとしてブランドの宣伝であったり、市場があるかどうかなど問題だと感じます。プログラマも、作りたいものだけを作る、と小説家や芸術家くらいわがままであってもいいと思います(これは偏見ですが)。わがままを通して「食える」ようになるというのは、プログラマに限らずまたどこか別の次元の話です。

プログラマとして生きるということ プログラマとして生きていくというのは、ビジネスを含めて、自身のブランドとして独立する覚悟が必要ですし、そうしない道を選ぶなら、他で生活の糧を得る必要があります。これは、プログラマとして能力が劣ることを意味するわけでも、恥ずかしいことでもありません。Googleだって広告収入が安定しているからこそ、Google Web Toolkitなどの開発に注力できているのです。

開発をしていて労働過多で見合った収入が得られていないと感じたときに、「プログラマだから」と結びつけるのは、誤った思い込みであるように思います。「プログラマ」とはそんなひとくくりにできるような言葉ではありません。「プログラマ」は好きなものを思いのままに作れる夢のような職業である一方、製造・出版業のような既存のレールがない分、ものをつくる職業として確立できていない難しさもあるでしょう。

けれど、そんな時代の荒波を生きていくのが「プログラマ」です。数年で技術が変わり、新しいツールも次々に出てくる。そんな中、目指すものを創るために、自ら学ぶことを止めず、成長し続ける人が、真の「プログラマ」と呼ばれるべきです。3年前にも同様のことを書きましたが、プログラマやハッカーという言葉に対するこの思いは今でも変わっていません。

2008年7月1日火曜日

Rails、Hibernate、EJB スキーママッピングあれこれ

久し振りの更新。普段、突発的にものを書きたくなる衝動をブログにぶつけていたのですが、最近はそれがTwitterに吸収されてしまっています。短い単発コメントより、まとまった文章がある方が本当は価値が高いんですけどね。今日はTwitterが重いので、ブログに戻ってきました。

閑話休題。

SIGMOD2008に参加してみて不思議だったのは、Schema Mappingの研究が想像以上に盛んだったこと。これは、データベースのスキーマ(テーブル構造情報)を、他のスキーマへと変換するときに使います。データベースの移行とか、アプリケーションに合わせて形を書き換えるとか。

でも、そもそもマッピングって、足し算が入るだけでも、不可逆変換なんですよね。1+2を合わせて、「3」というデータを作ったとき、この「3」というデータは、1+2の結果か、2+1の結果かわからなくなる。そうすると、マッピングに使える演算の種類は限られてきます。

SIGMOD2007のベストペーパー、Compiling Mappings to Bridge Applications and Databasesにあるように、テーブルデータ -> オブジェクトというマッピングをし、オブジェクトの更新結果をテーブルデータに正しく反映させるといった、roundtrip制約を入れると、使えるマッピングの種類を限定せざるを得ません。Join演算なんてもってのほかです。

問題を、オブジェクト(Javaのクラスなど)とテーブルデータ(relational database)の構造の違い(impedance mismatch)の吸収に絞ると、すでに世間で実用化されている技術がいくつかあります。Ruby on Rails, EJB3.0 (Enterprise Java Beans), Hibernateなどがその代表でしょう。

それぞれの一長一短(pros and cons)

Rails: テーブルの列名に対応したメソッドを自動追加するので(Person.id, Person.name, ...などでアクセス)、簡単なスキーマ変更(カラムを増やす、など)なら、ソースコードの変更が不要。ただし、実行時に初めてわかるメソッドなので、コンパイラによる静的チェックの恩恵が受けられない。実際に、動かしてみるまでプログラムが正しく動くかどうかわかりません。

EJB3.0: Javaのクラス定義と、テーブルデータをAnnotationなどを駆使して対応させます。テーブル名、カラム名とクラス名、メソッド名が食い違う場合はAnnotationを使って細かい対応付けができるのが売り。Data Access Objectを通して、オブジェクトを更新、テーブルに反映させるという手順。ただし、1つのオブジェクト定義でも、文脈に応じて、別々のテーブルに格納したいことがあります。たとえば、Personクラスを、student, teacherテーブルへ。student(Personクラスに対応)の一部を、alumniテーブルに格納したい、などなど。クラス定義の中に対応するテーブル名やカラム名を含める設計だと、この目的には対応できません。ここはぜひ分離してほしいところ。(Railsも、クラスに対応するテーブル名は決め打ちです。プログラミングはとても簡単な反面、オブジェクトの使いまわしは難しい。一応、オブジェクトに対応するテーブル名は設定可能ですが)

Hibernate: 僕はこのtutorialを読むだけでがっかりしました。こちらにも解説書のサンプルがあります。Javaのクラスと、テーブルデータベースの違いを吸収するのに、XMLで書かれたマッピングファイルが必要なんです。EJB3.0も裏でHibernateを使っているようです。なんだ、なんだ?。これだと、クラスを書き換えたら、XMLも書き換える必要がある。そのXMLファイルをクラスファイルから自動生成できるのかもしれないけれど、Javaのリフレクションを使えばXMLをあらかじめ用意する必要なんてないはず。設定ファイルが多い(ある)という点で、Railsほどの簡潔さ、わくわく感はありません。


明示的であれ暗黙的であれ設定項目を把握するまで動作が理解できないスキーママッピングなら、技術としての重要性は低いように思う。Railsのようにマッピングを決め打ちできる状況は多いと感じるし、テーブル型データとオブジェクト間のimpedance mismatchがそれほどあるとも思えません。現に、Object-Relational Databaseというように、Reational databaseは、様々な形のオブジェクトを保存できるように成長しています。


データベースのデータを扱うのが、プログラム言語中であるなら、プログラム中で使うクラス定義(オブジェクト)がスキーマそのものです。オブジェクトをそのまま保存できれば事足ります。テーブル名、カラム名なんてプログラム中で気にする必要はないはず。それに加えて、オブジェクトをどのような位置(コンテキスト)に保存するかが選択できればよい。たとえば、2007年度のデータ、2008年度のデータなど、フォルダでファイルを管理するのと同じように、データを保存する位置を決める。この2点ができれば、データベースの機能としては十分なんじゃないかと思います。

コンテキストを表す能力が高いのはXMLだし、定型データを扱うのはRelational Databaseの得意技。データベースの研究者として、両者の融合をもう少し進めていきたいところです。

2008年3月24日月曜日

あなたの大切なファイルに、突然「さよなら」と言われないために

三浦しをんさんのブログを眺めていたところ、彼女の原稿ファイルが壊れてしまったという話がありました。小説家にはとっても痛い話でしょう。そんな悲劇を少しでも防ぐために、ファイルの変更履歴を管理するためのシステムSubversionについて、以前に僕が書いた簡単な使い方のページを紹介します。

http://www.xerial.org/trac/Xerial/wiki/Subversion


情報系学生向けの内容なので、英語で、しかもコマンド入力形式を前提に書いているので、一般のパソコン利用者には読んで理解するのは大変かと思うのですが、こういうものがあるんだよということをぜひ知ってもらいたいです。

Windowsなら、TortoiseSVNという、マウスクリックで使えるSubversionもあるので、こちらをインストールして使ってください。

簡単な概念の説明
  • 適当な位置に、リポジトリ(repository)と呼ばれるものを作ります。これは、あなたのファイルとその変更履歴を保存するデータベースのようなものです。
  • 普段の執筆作業、ファイルの編集等は、ワーキングコピー(working copy)と呼ばれる、リポジトリの中身のコピーに対して行います。ワーキングコピー内のファイルをいくら編集したり、削除しようと、リポジトリには影響を与えません。
  • ワーキングコピーを作成するには、まず、チェックアウト(checkout)という操作を行い、リポジトリからあなたのファイルのコピーを取り出します。
  • ワーキングコピー上のファイルの編集結果を、リポジトリに反映させてもいいと判断したら、コミット(commit)と呼ばれる操作を行い、ワーキングコピー上での編集内容を、リポジトリに送ります。
  • ワーキングコピー上の新しいファイルは、自分でリポジトリに追加(add)する、と選択しない限り、リポジトリには送られません。
  • リポジトリには、コミットする前と後のファイルの内容がすべて記録されています。従って、一ヶ月前の原稿を取り出したい、という要求にもこたえることができます。1回のコミットごとに、リビジョン(revision)の番号が更新されていきます。
  • ファイルを元に戻したい、というときには、リポジトリから復元(revert)操作を行います。誤って消してしまったファイルや、修正結果などを元に(リポジトリに保存されている状態に)戻せます。
  • 定期的にリポジトリのエクスポート(export)を行って、最新の状態のファイルのバックアップをDVDなどの外部メディアに保存しておくと良いでしょう。更新履歴を含めたリポジトリ全体のバックアップが必要なときは、svnadmin dumpコマンドを使えるように設定する必要があります(詳細は公式ページや、onlineのsubversion解説書で)。
(サーバーに設置するとき)
  • リポジトリは、Webサーバー上に作成するといたるところで自分のファイルにアクセスできるようになるので、利便性が高まります(Apache + mod_dav_svnなど)。あるいは、sshログインできるサーバー上に、リポジトリを作っておくと設定要らずで簡単です(svn+ssh://(server address)/home/leo/svn/repository というようなURLでアクセスできる)。
  • Webサーバーなんて設置できない、という人は、最近はUSBメモリが大容量化しているので、こちらにリポジトリを作成してもよいのかもしれません。ただ、盗難、紛失によってデータを失うリスクが高いので、あまりお勧めできません。
  • 複数の人(自分一人の場合でも、自宅、会社のPCなど)のコミット後の更新結果を手元のワーキングコピーに反映させるには、更新(update)を実行します。自宅と会社で同じファイルを編集してしまった場合は、コミットや、更新を行ったときに警告が出されます。両者の変更を簡単に合成(G: merGed)できるときもありますが、そうでないときはC(Conflict)マークが出ます。その際は、手作業で更新がぶつかった箇所を編集して、conflict resolvedという操作を行わないと、そのファイルはコミットできなくなります。人の更新結果を使って、手元の更新結果を無視して上書き、なんてこともできます。
何箇所かのPCにワーキングコピーが残っていれば、いざリポジトリが入っているディスクが故障したときでも、ワーキングコピーから新しいリポジトリを作ればいいだけなので、完全ではないとは言え、ラフなバックアップ効果があります。

文章やプログラムを書くという作業は、もうSubversionがないと怖くてできません。でも、世の中の大半の人は、まだこの恩恵にあずかれていないのかと思うと、少し悲しくなってきます。リポジトリの置き場所、バージョン管理って何?という面で、やや敷居が高いのですが、 あなたの大切な「パートナー」のことですので、真剣に考えてあげてくださいね。

2008年3月4日火曜日

USBメモリからLinuxをインストール

PXEBootによるネットワークインストールでもいいけれど、CD/DVDドライブがないマシンの場合、このやり方も簡単。

まず、好きなLinuxのdistributionから、diskboot.imgをダウンロードしてくる。

ブートイメージをUSBメモリ(FAT32フォーマットしたもの)に展開
> cat diskboot.img > /dev/sdg1

/dev/sdg1 はUSBメモリなどのデバイス名+partition番号。
cygwinを使っている場合は、cat /proc/partitionsでどのデバイスが使えるか確認できます。

Linuxのインストールは、USBメモリをマシンに差し込む。起動メニューでUSBメモリを選択すると、Linuxのインストールメニューが出てくる。あとは、ネットワーク経由でパッケージをダウンロードするインストールの方法と一緒。

CDメディアを作成するよりお手軽かな。

2008年2月12日火曜日

grepでマッチした行だけ取り除くスクリプト

SubversionのDateタグって、意図しない文字コードの日付に置換されてしまい、予測不能な問題を生じてしまうことが多かった取り除くことにしました。

そこで、一行プログラミング。
for f in $(grep -n  "\$Date" src/**/*.java | cut -d ':' -f 1);
  do echo $f; grep -v "\$Date" $f > $f.tmp; mv $f.tmp $f; done;

もっと賢い方法や、こういう時に便利なコマンドがあったら教えてくださいな。

2007年12月30日日曜日

サーバーをいくつか経由してsshログインする方法

sshでサーバーをいくつか経由して、目的のサーバーに接続する方法です。

sshで、server(Bとする)に接続したいけれど、severBは、serverAを経由しないとアクセスできない位置に設置されているとします。

  localhost -> serverA -> serverB

ssh serverA ssh serverB

と実行すれば一応接続できるのですが、ssh (remote host) (command ...)という構文で、コマンドを実行するだけなので、serverBにログインした後、すぐconnectionが切断されてしまいます。

rsyncなどは、この形式でも、以下のように使えば、serverBのデータを取得できます。

rsync -av -e 'ssh serverA ssh' serverB:./(src) (dest)

本題のsshですが、

ssh -t serverA ssh serverB

とすると、仮想ttyを作ってくれて、serverBにログイン後、shellでの作業を続けられます。

sshのkey agentを使う設定にしておけば、パスワード認証要らずで、サーバーをどんどん経由して、ログインできるようになります。

2007年11月22日木曜日

Facebookに参加してみました

今、ビジネス誌で話題のFacebookに参加してみました。

招待された人しか参加できないmixiと違って、Facebookは誰でも参加できるんだけど、中で閉じたネットワークをつくれるので、mixiより安心かと。

mixiには「大切なマイミクさん」という人間味の乏しい紹介文で固める集団がいるけど、これって同じ人がいろんな人のふりをして「月収○○○万ビジネス」と称した詐欺サイトに誘導しているだけみたい。こんな人がたくさんやってくるので、mixiにはちょっと嫌気がしています。

でも、Facebookも基本的にアメリカの大学発のものなので、英語圏の人ばかりで、mixiのように日本の昔の友達を探す楽しみがないのが残念。

mixiの方が機能はずいぶん劣っているけれど、それはたいしたことではないみたい。どちらも、自己紹介の手間を省きつつ、コミュニティを手軽に作れる、というところが画期的な共通項。

日本人のコミュニティとしてはmixiは圧倒的なんだけど、アカデミックなコミュニティとしてはFacebookの方が質は高そう。mixiでscientificなコミュニティがあっても、集まる人の質が千差万別すぎて、ただの井戸端会議になってしまい、身のある議論ができません。テレビでよくある政治討論でもそうだけれど、知識を深めたり、あるべき姿を建設的に決めるということは全くなく、自分の主張をいかに通すかっていうつまらないコミュニティしか出来上がらないような気がします。

サークルとか、NGOの運営と似ているかな。取りまとめる人が大事な点とかが。真剣なディスカッションになればなるほど、対話に比したネットの非効率さも浮き彫りになってくるだろうし、どういう人をコミュニティに招くかというのも、コミュニティが実りあるものになるために必要な要素。

昔のMicrosoftのコミックチャットの方が、簡易コミュニティを作って会話するための機能としては優れていたような気もします。Second Lifeも似た雰囲気がありますよね。SNSって発展したら、就職活動とかにも使えそう。欲しい人材を振り分けて、ネットで交渉して、適材適所を実践。能力を持て余している人とか、人材が必要だけどどこを探していいか分からないことはよくありますし。

2007年2月17日土曜日

プログラム開発でよくある失敗

Visual Studio 2003 (vc7.1)から、Visual Studio 2005 (vc8)に乗り換えました。

ただ、この2つで使われるマルチスレッドのライブラリのversionが違っていて、vc7.1でビルドしたマルチスレッドを使うライブラリ(dll)を実行時に使ってしまうと、原因とは脈絡もないところでメモリ関連のエラーが出てデバッグに苦しみます。

そういうときは、
> dumpbin /dependents (dllのファイル)
で調べます。
Dump of file xerces-c_2_7D.dll

File Type: DLL

Image has the following dependencies:

WS2_32.dll
ADVAPI32.dll
KERNEL32.dll
MSVCR80D.dll

MSVCR80D.dll が、MSVCR71D.dllなどになっていたら危険信号。結局、普段良く使っている、BerkeleyDBとか、Xerces-C++とかを再コンパイル。

その点BoostライブラリのWindows版はよくできていて、対応するコンパイラでビルドされたライブラリがない場合はちゃんとこのライブラリがない、と実行時に指摘してくれます。dllを動的に読み込んでるからこそできる技。

でも、こんなの慣れた開発者じゃないとわからないよなぁ。。。。C++の教科書読んだって書いてないもの。xercesだって、BerkeleyDBだって、vc7.1でbuildされたdllを注意書きもなくしれっと配布しているし。。。やれやれ。

2007年2月14日水曜日

このキーボード欲しい


Microsoftのキーボードの新製品 Wireless Entertainment Desktop 8000が、USER'S SIDE2で購入できるみたいです。テンキー無しでコンパクト、充電スタンドがセットなので、ワイヤレスキーボードの悩みの種だった電池交換が要りません。最近のマイクロソフトのキーボードは明らかに静穏性も意識しているので、キーがかちゃかちゃ鳴らないようになっています。周りの同僚に迷惑をかけることもありません。

でも、税込みで41,895円…。高すぎ。これまで高級キーボードの代名詞だったHHK Proとか、Realforceが2個買えてしまいます。でも、HHKや、Realforceは意外と打鍵音がうるさいのが難点。キータッチは適度に軽く深くで最高なのですが。

理想形は、ThinkPadのトラックポイント付きキーボードがそのまま外付けにできるものだと思います。。現在、市販されているものは、値段の割にキーがぺちぺちしていて作りが安物なんです。ノートブックのものと比べて明らかに品質が悪い。あまり自社の魅力を理解していないのか、単にキーボードなんてリターンの少ないものには投資していないのか。たかが外付けキーボードとはいえ、あの製品はブランド力を下げていますね。

2007年2月13日火曜日

Microsoft OfficeかOpen Officeか

僕自身、文書作成には、プログラマ御用達のEmacs (Meadow)を使ってテキストを作成することがほとんどなのですが、見た目にスタイリッシュな文章を作成しなくてはいけないこともあります。

ただ、一般に使われるMicrosoft Office製品は、英語を書くときには文法間違いやスペルミスを発見してくれて強力なツールなのですが、日本語文書を作成するときには、ソフトウェアの価格ほどメリットを感じないことが多いです。それでも、周りのみんなが使っているから、自分も使わなくてはという強迫めいたものがあります。重要な事務書類をWord/Excelで作成してください、ということが多く、使わざるをえないのです。

以前、NHKの特集で、官公庁がMicrosoft OfficeとWindowsから、コスト削減のため無料でまかなえるOpenOfficeとLinuxに乗り換えようとしているという話がありました。 でも、既存の文書のレイアウトが崩れてしまうなどの理由で、Windowsマシンも残しているとか。

特定のOSを選ぶ理由は、やはりアプリケーションにあります。今まで使えたアプリケーションが使えなくなるなら、それを上回る新しい魅力がないと、OSを切り替える気も起きません。

つまり、もうひとつ重要な観点があって、データを何年残しておくか?ということ考える必要があります。Microsoftは財務体力を得た会社だから、Vistaの普及が思うように進まなくて失敗したとしても、数年でつぶれるような会社ではないです。だから、Office製品が突如死に絶えてOfficeのデータが使えなくなることはないでしょう。でも、SunのCEOであるJonathan Schwaltz氏が指摘しているように、Web上で使えるGoogle Docsや、フリーのOpen Officeのように他に魅力的な文書作成ソフトが出てきたときに、Open Document Format (ODF)のような公開されている仕様で、文章を作成しておくと切り替えがスムーズにできます。OSが代わってもデータを生かしておくことができるのです。

スタイル(自分で登録したデザイン)を作成できて、アウトラインを作成できるという意味では、もう、無料のOpenOfficeでも、Wordと同等、あるいはそれ以上の機能が備わっていて、問題なく使用できます。PDFに変換することもできるので、PDF形式で相手に渡せば、Wordや OpenOfficeをインストールしてなくてもメッセージを伝えることができます。プレゼンテーション資料も、Open Office Impressで、見た目に遜色のないもの作れるので、PowerPointいらずです。今の段階では、PowerPointの方が動作が軽いのですが、スライドをPDFに変換してAcrobatでプレゼンすれば、動作も軽快ですし、OS依存部分を減らせるので、配布するときも喜ばれます。

MacOS Xでは、X上で動作するOpenOfficeを使うより、NeoOfficeを使うほうが動作が快適なようです。1万円を払う気があるなら、iWorkを購入して、PagesやKeynoteを使う方が最初から見た目のよいものが作れるし快適です。ただ、こちらは残念ながらODFには対応していないし、連携する表計算やデータベースソフトがないので、OpenOffice/NeoOffice、あるいはMicrosoft Excel, Accessのお世話になります。PDFやRTF(rich text format), Word形式の文書は作成できるんですけど。

表計算に関しては、簡単な計算式が書けて、ピボットテーブルが作成できればいいと思うのですが、それも、Excel, Open Office Calcのどちらでもできるようになりました。

ただ、Excelが断然優れているのは、グラフ作成機能でしょう。世の中には、グラフを作成する無料のツール(GnuPlotなど)もありますが、使いこなすまでの労力を考えるとExcelに軍配が上がってしまうのは残念。MacのPagesもなかなかきれいなグラフは作れます。

僕のPC生活

僕のパソコンの活用法を少し紹介。一般の利用者向けです。

最近、毎日持ち歩いても苦にならない大きさのノートブックPCが手軽に買えるようになりました。Windows XPはHome Editionでいいやとか(リモートデスクトップの機能が使えないですが、大きな違いはそれだけかも)、Office製品はいらないなどとあれこれ切り詰めてカスタマイズすると、20万円以下でも十分実用的なマシンになります。昨年にそういった構成でVAIOのType-Tを購入しました。液晶の解像度も高く、バッテリーの持ちも良い(7~9時間)のでかなり重宝しています。

そんなノートパソコンを、僕は、電子書籍代わりに使っています。デジカメで本を1ページ毎に撮影して、画像ファイルをまとめてPDFにしてしまいます。(Adobe Acrobatを使うと簡単ですが、画像をアルバムのようにPDFにするだけなら他にもいろいろツールがあるようです。) スキャナとかも試してみたのですが、デジカメの方が本のサイズにかかわらず撮れるし、1ページあたりに費やす時間が数秒で済むので、速いです。GoogleのPicasaなどの写真編集ソフトで紙の色などを調整すると良いかもしれません。PDF文書を読むときは、Acrobat Reader(こちらは無料)のショートカットキーを覚えると吉です。

Ctrl + 1, 2, ... ページの表示方法の切り替え
Ctrl + +(プラス)、-(マイナス) で、ページの拡大縮小。
Ctrl + L (全画面表示)

などなど。気が向いたときに本を撮影して、必要なときにじっくり読めるように持ち歩いています。職業柄分厚い本を読むことが多いので、本当に助かっています。


本当はもう1つ、ファイルのバージョン管理ソフト、Subversionについても書きたいのですが、とてもブログ1つに収まる内容ではないのが辛いところ。もはや僕のPC作業に欠かせないものになっています。USBメモリでも使えるはずなので、あまりパソコンに詳しくない人でも使いこなせるんじゃないかと思っています。その話題はまた後日。

License

Creative Commons LicenseLeo's Chronicle by Taro L. Saito is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 2.1 Japan License.