YOUもUNIXコマンド作ってみませんか? コンテスト第一回 当選者発表
入賞者 江川 芳孝 様 / C & bash / comm
- source code: comma_ega_wave_20140910.tar.gz
コードの自己紹介
Open usp Tukubaiコマンド共通フレームワークを目指して作りました。コンマを付ける必要最小限の処理はcomma.impl.cで行い、その他、Open usp Tukubaiコマンドで共通の機能は、apply/fldmrg/bashスクリプトで行います。
C言語(Not C++)で作ったのは、軽さ(モジュールの小ささ)を狙ったためです。(C++が必要なのはvectorだけなので、という理由もあります)apply/fldmrgの類のコマンドは、誰か作っていそうな気がするのですが、私自身、見たことがないので作ってみました。ユニケージ開発で幅広く使えるコマンドだと思います。
仕様通りに動作しているかどうか
- 例1:OK
- 例2:OK
- 例3:OK
- 例4ー1:OK
- 例4ー2:OK
速さでの評価
テスト方法:1000万レコードのデータを入力し、commaをテストしました。同一環境で3コマンドを比較しております。
$ seq 1 10000000 | tarr > data $ ls -al data | comma 5 -rwxrwx--- 1 root vboxsf 78,888,897 12月 19 09:29 2014 data $ time comma 1 data > result (製品版のcomma) $ time ./comma 1 data > result (Open usp Tukubaiのcomma) $ time /usr/local/bin/comma 1 data > result (応募作品)
テスト結果:Open usp Tukubaiより実行速度が速いですね!
製品版 | 応募作品 | Open usp Tukubai | |
---|---|---|---|
real | 0m0.803s | 0m34.523s | 6m46.338s |
user | 0m0.421s | 0m20.943s | 6m45.293s |
sys | 0m0.166s | 0m23.032s | 0m0.479s |
TIPS: データの読み込みにread(1)システムコールを1バイトサイズごとに呼び出しておられますが、コンテキストスイッチ的にもディスクI/O的にもこれはとても負荷の高い処理です。読み込みをfopen(3)系の関数に変更するか、fopen(3)系の関数が実施しているのと似たようなバッファ処理を記述することでさらに高速化が可能だと思います。
短さの評価
ソースの短さという観点からは少し弱いですね。とはいえ、今回は共通フレームワークを目指したということですので、ソースコードが長くなるのはしょうがないかと思います。
$ gyo -f *.c | keta -- | awk '{print $0"行"}' apply.c 303行 comma.impl.c 142行 fldmrg.c 125行 vector_int32.c 65 行 vector_int64.c 65 行 vector_int8.c 103行 $ gyo -f *.c | sm2 0 0 2 2 | awk '{print $0"行"}' 803行 $
美しさの評価 / 面白さの評価
各コマンドの共通フレームワークを作るという試みの面白さと美しさは理解できます。applyとfldmrgを使えば各フィールドに別々のコマンドを適用することが出来るため、あとはその最小コマンドを作れば処理手法を増やせるという手法ですね。1技術者として非常に面白い試みだと感じます。
しかし、弊社のユニケージ開発手法とは相容れない手法です。ユニケージ開発手法の場合、各コマンドが共有するライブラリは存在せず、コマンドに必要なソースコードは全て1ファイルに入れています。各コマンドで共通の処理が存在する場合は、そのソースコードをコピーして使っています。弊社ではそのやり方を「全有」という概念で説明しています。詳しくは弊社の教育講座K-ARCHにて詳しく説明しておりますが、様々な過去の経緯からその手法を採用しています。
以上から応募作品はユニケージ開発手法とは相容れない手法ですので、美しさ・面白さの観点から評価は出来ません。ただし1技術者としてとても面白い試みだと思います。
入賞者 田原 勝典 様 / awk(gawk) / comma
- source code: comma.awk
コードの自己紹介
実用としてエラーなく使えることを目指しましたが、さてどうでしょうか。
仕様通りに動作しているかどうか
- 例1:OK
- 例2:OK
- 例3:OK
- 例4ー1:OK
- 例4ー2:OK
速さでの評価
テスト方法:1000万レコードのデータを入力し、commaをテストしました。VM環境でテストしたので全体的な実行速度は遅めですが、同一環境で3コマンドを比較しております。
$ seq 1 10000000 | tarr > data $ ls -al data | comma 5 -rwxrwx--- 1 root vboxsf 78,888,897 12月 19 09:29 2014 data $ time comma 1 data > result (製品版のcomma) $ time ./comma 1 data > result (Open usp Tukubaiのcomma) $ time gawk -f ../comma.awk 1 data > result (応募作品)
テスト結果:Open usp Tukubaiより実行速度が速いですね!
製品版 | 応募作品 | Open usp Tukubai | |
---|---|---|---|
real | 0m0.803s | 1m4.413s | 6m46.338s |
user | 0m0.421s | 1m4.132s | 6m45.293s |
sys | 0m0.166s | 0m0.235s | 0m0.479s |
TIPS: awkの実装系としてはmawkが高速です。awkでさらなる高みに上り詰めるならmawkの使用も検討してみてください。
短さの評価
Open usp Tukubaiのcomma:228行 応募作品のcomma:98行
短いですね!
美しさの評価
ソースコード内にて繰り返しを多用していて awk の書き方としてはあまり美しくないかも…
面白さの評価
特にありませんでした。
コンテスト内容
usp Tukubaiのコマンドのうち特によく使われるものについては「Open usp Tukubai」というオープンソース版を公開しています。本サイト(UEC : ユニケージ・エンジニア・コミュニティ)ではこれらコマンドの使い方をさまざまな方向から紹介しています。
コンテストではこうしたすでにオープンソースソフトウェアとして提供されているコマンドや、オープンソース版の実装は公開していないものの、マニュアル(つまり仕様書)は公開してあるコマンドなどについて開発競争を行います。
実装を募したコマンドは次のとおりです。
- comma
- 【こんま】指定したフィールドに3桁または4桁のカンマを付ける
- divsen
- 【でぃぶせん】指定フィールドを千で割る
- keta
- 【けた】テキストファイルの桁を揃える
- lcalc
- 【えるかるく】フィールドの高精度演算(整数18桁+小数18桁)
- lineup
- 【らいんなっぷ】指定したフィールドのデータのラインナップを抽出
- maezero
- 【まえぜろ】前にゼロを付ける
- marume
- 【まるめ】四捨五入、切り上げ、切り捨て
- sisu
- 【しすう】指数(構成比)を計算
- sorter
- 【そーたー】キーでファイル分割する
評価のポイント
次の4つのポイントを中心に審査員がソースコードを評価しています。
審査員
- 當仲寛哲(ユニバーサル・シェル・プログラミング研究所 所長)
- 「大事なのは情報の自由度です」
- 後藤大地(BSDコンサルティング取締役/オングス代表取締役/FreeBSDコミッタ)
- 「UNIXとともにあらんことを」
- 片山善雄(ユニバーサル・シェル・プログラミング研究所 研究員)
- 「Cプログラム高速化研究班 コードを高速化する20の実験と達人の技」
賞品・特典
- A賞 Open usp Tukubaiへコマンドをマージ
- B賞 TechLION出場権(推薦枠)
- C賞 TechLION入場券(10名様)
- D賞 USP MAGAZINEにインタビュー記事掲載(約1名様)
- E賞 「商品券」1,000円(30名様) : 優秀なコマンドを作られた方には3万円を進呈(約5名様)
- F賞 USP MAGAZINE1年分(10名様)