コグノスケ


2013年 7月 2日

スクリプト言語始めました

スクリプト言語の手始めに、まずは有名どころ(Python と Ruby)から目を付けました。どちらも甲乙つけ難かったため、両方使ってみることにしました。

開発環境は Python が JetBrain の PyCharm、Ruby が同じく JetBrain の RubyMine です。これらは有償ですが、30日間の無料評価期間がありますので、触ってみたいだけなら十分に楽しめるはずです。

N クイーンを移植

スクラッチから書く用事が今のところないので、先日 JavaScript で書いた N クイーン問題のソルバ(2013年 5月 13日の日記参照)の移植にトライしようと思います。手始めに無駄な処理を削って、5倍くらい速くした JavaScript 版を準備しました。

この JavaScript 版 N クイーンを Python と Ruby と、ついでに Java への移植、それに加えて並列処理ができるように改造する、というところまで実践しました。アルゴリズム自体は JavaScript 版と同等とします。

目指せ一本道 Python

実際に書いてみると、Python は初心者に優しい作りになっているように思います。特に公式のチュートリアルが非常に丁寧かつ、まとまっていてありがたいです。教育用の名は伊達じゃありません。

さらに Python はおかしな書き方をしないように、様々な考慮がなされています。その一つが、言語策定者自らによるコーディングルール(PEP 8 - Style Guide for Python Code※)です。チェックツールまでも用意されていて、PEP 8 に違反している個所を注意してくれます。

(※)ありがたいことに 和訳を公開されている方がいらっしゃいます。

僕らは自由 Ruby

Ruby は好きな書き方ができてしまいますが、変な書き方を発見すると RubyMine さんが警告してくれるので、それに従っています。ただ、RubyMine さんはやたらと if 文を後置(Modifier?)したがるのが困りものです。

慣れの問題だとは思いますが、処理→条件の順で書かれると、条件判定→処理という実際の手続きと逆になってしまって、理解が遠のく感じがします。英語だと文章の順に近くなるから嬉しいのかなあ。

あと、Ruby とはあまり関係ないけれど、躓いてしばらく悩んだ点を書いておきます。

自作のクラスなどを書いた .rb ファイルを require するときは、2点注意が必要です。1個目は require './hoge.rb' のように ./ を付けること、2個目は RubyMine の実行設定で Working directory を設定しておくことです。

パスに ./ を付ける理由は Ruby 1.9 から require の探索対象パスが変わって、カレントディレクトリが対象外になったから、だそうです。RubyMine の設定を変える理由は、Working directory のデフォルト値が「空」になっていて require の探索が迷子になってしまうからです。

速度はいかに?

せっかく作ったので、各言語のソルバに N クイーン(N = 15)を解かせて、速度を測ってみました。オマケで測った割に、予想以上の差が出てちょっとびっくりです。

環境について付記しておきます。CPU は Intel Core i5 2450M/2.50GHz、OS は Windows 8 Pro 64ビット版です。

C++: Visual C++ 2012 Relase ビルド
非並列 1049[ms]、並列 425[ms]
Java: IntelliJ IDEA 付属の Java 7 JRE(1.7.0_10)
非並列 1101[ms]、並列 533[ms]
JavaScript: Internet Explorer 10(10.0.9200.16599)
非並列 10415[ms]、並列(不可)
Python: Jython 2.5.3
非並列 31664[ms]、並列 15416[ms]
Ruby: JRuby 1.7.4
非並列 30653[ms]、並列 21166[ms]
Ruby: Ruby 1.9.2-p0 Windows x64 版
非並列 121059[ms]、並列 121294[ms]
Python: Python 3.3.2 Windows x64 版
非並列 161900[ms]、並列 158069[ms]

こういう単純な計算の場合、Java はケタ違いに速いです。並列化の効果も出ます(※)。当初から C 言語と比較しては遅い遅いと文句言う人達と、ガチンコ勝負してきた成果でしょうか。

JavaScript はブラウザによって 2〜3倍の差が出ましたが、一番速かった IE 10 の結果を載せました。スクリプト言語では速い方?

Python も Ruby も桁違いにゆっくりです。スレッドは備えているものの、スレッドを使って並列化しても実際には 1スレッド分の速度しか出ません。どうも CPython や CRuby はネイティブスレッドを使わないようです。

(※)Core i5 は 2コア 4スレッドなので、性能が 4倍か 3倍くらいになることが期待値だったのですが、なぜか性能は 2倍にしかなりません。謎ですね…。

余談

次に挑戦するなら、JavaVM 上で動作するスクリプト言語が良いだろうと思っています。開発環境(IntelliJ IDEA)から使える言語から選ぶなら、Groovy か Scala か Kotlin かな…?どれも良さげです。

今までは Java 開発には Eclipse を使っていたのですが、最近は IntelliJ IDEA を試しています。ここに PyCharm と RubyMine が加わったおかげで、開発環境が JetBrain 一色に染まってしまいました。

ただ IntelliJ も PyCharm も RubyMine も、今のところ開発環境の能力を活用できている気が微塵もしないのが残念なところです。もうしばらく使ってみないとねー。

編集者: すずき(更新: 2013年 7月 4日 01:15)

コメント一覧

  • IKeJI 
    require_relativeつうのがあります。
    http://doc.ruby-lang.org/ja/1.9.3/method/Kernel/m/require_relative.html

    CRubyより早いと噂のJRubyとかどうですか? 
    (2013年07月03日 10:55:31)
  • すずき 
    >IKeJI さん
    ありがとうございます。
    require_relative まさにこれがやりたかった…。

    JRuby が何者か良くわかっていませんが、測れるようなら測ってみます。Windows で動くといいな。 
    (2013年07月03日 11:14:08)
  • すずき 
    Python と Ruby の JVM 版インタプリタ(Jython, JRuby)でも測ってみました。スレッドの効果も出ていますし、1桁以上速くなります。
    これは良いですね。 
    (2013年07月03日 22:17:52)
  • たいよ 
    Rubinius速いですよ!
    nqueens 15 false を測定したら、以下の結果:
    * ruby-1.8.7: 300sec
    * ruby-2.0.0p: 75sec
    * rubinius-1.2.4: 11sec
    どう? 
    (2013年07月05日 17:35:50)
  • たいよ 
    ↑の測定マシンは、Core i7 2.93GHz です。参考まで。 
    (2013年07月05日 17:36:49)
  • すずき 
    >たいよさん
    情報ありがとうございます。
    数字見た感じJRubyより速そうですね、試してみます。 
    (2013年07月06日 00:58:35)
  • すずき 
    Rubinius はまだ Windows 対応していなかった…。残念…。 
    (2013年07月06日 01:36:53)
  • たいよ 
    RubiniusはLLVMが必要だからかな。残念。 
    (2013年07月08日 11:23:06)
open/close この記事にコメントする



2013年 7月 3日

インタプリタ on Java VM

コメント欄にて他のインタプリタ実装もあるよ、と教えていただいたので、早速試してみました。

今回試したのは Jython と JRuby です。開発環境が認識するかどうか不安だったのですが、PyCharm も RubyMine もいとも簡単に認識してくれました。これは便利。JetBrain さんに感謝だ。

Visual Studio も持っていたので、ついでに C++ 版も作りました。Windows/POSIX スレッド、時刻取得辺りは、超てきとー実装なので、参考にしないでください。

再び測定

つまるところ、今回追加したのは下記の 3つです。

  • C++ 実装
  • Python VM の Java 実装 Jython
  • Ruby VM の Java 実装 JRuby

結果はこんな感じです。上から速い順に並んでいます。Java って速いね。

C++: Visual C++ 2012 Relase ビルド
非並列 1049[ms]、並列 425[ms]
Java: IntelliJ IDEA 付属の Java 7 JRE(1.7.0_10)
非並列 1101[ms]、並列 533[ms]
JavaScript: Internet Explorer 10(10.0.9200.16599)
非並列 10415[ms]、並列(不可)
Python: Jython 2.5.3
非並列 31664[ms]、並列 15416[ms]
Ruby: JRuby 1.7.4
非並列 30653[ms]、並列 21166[ms]
Ruby: Ruby 1.9.2-p0 Windows x64 版
非並列 121059[ms]、並列 121294[ms]
Python: Python 3.3.2 Windows x64 版
非並列 161900[ms]、並列 158069[ms]

併せて 7月2日の方も結果一覧を更新しています。

コード

測定に使用したソースコードとプロジェクト設定ファイルは下記に置いています。Web インタフェースからアーカイブが取れます。ページ右上の zip とか bz2 というリンクからどうぞ。

もし Git が使える環境なら git clone https://〜 でもコピー可能です(2019年 3月 12日、GitHub に移しました)。コミットの push はできないので、お気づきの点はコメントかなんかで教えてください。

いずれも Apache License, version 2.0 です。といっても、流用することはないでしょうけど…。
N クイーン C++ 版
N クイーン Java 版
N クイーン Python 版
N クイーン Ruby 版

N クイーン JavaScript 版(リポジトリは作っていないです)

開発環境やインタプリタはググればすぐ見つかりますので、各自拾ってくださいませ。

編集者: すずき(更新: 2019年 3月 12日 23:52)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2013年 7月 4日

PukiWiki と PHP 5.4

家サーバの Debian アップグレードに伴い、PHP のバージョンも 5.4.4 になったため、ついに PukiWiki が動かなくなりました。Google 先生に聞いてみると、同じ問題にハマった人たちがパッチを公開してくれているため、もう少し延命できそうです。

PukiWiki は PHP という言語で書かれていますが、PHP は 1年くらいでガンガン仕様変更してくるため、最新バージョンに食いついていかないといけないようです。

ところが PukiWiki は最終版 1.4.7_notb のリリースが 2007 年(!)と古く、開発版も 1.4.8 から進んでいる様子がありません。もはや公式リリースでの対応は望めないでしょう。PukiWiki 便利で好きだったんですが、残念ですね…。

このサイトも他人事ではない

実はこのサイトの日記システムも PHP で書かれていて、最終更新が 2008 年頃と古いのですが、PHP 5.4 で動作させても見た目は特に問題ありませんでした。

とはいえ PukiWiki のこともあったので、念のため Apache のエラーログを眺めていたら、閲覧の度にめちゃくちゃエラー出ているじゃないですか。ホゲェー。

すぐに直したいところですが、いかんせんシステムの構造が思い出せません。しかも日記システムを書いた後は PHP を一切使わなくなったため、PHP の文法すら理解が怪しい状態です。こ、これはちょっとヤバいかも。

日記という息の長そうなシステムなのに、当時流行っていたという理由で PHP 言語を選択したのは軽率だったよ…うん。

反省はさておいて、土日になんとかしましょう。なんとかなるさ…きっとね。

編集者: すずき(更新: 2013年 7月 5日 02:38)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2013年 7月 7日

ARIB 違反とは?

例のパナソニックのテレビ、電波産業会(ARIB)の運用規定に違反って書いてるニュースもあった…。

産経へのリンク

ARIB のどこに違反してるのか気になってきたので、ちょっと見てみた。たぶん ARIB TR-B14「地上デジタルテレビジョン放送運用規定」だなあ。

産経曰く「ガイドラインは「テレビ起動時、テレビ映像を画面全体に表示するのが望ましい」と明記」とのことだが、ARIB のどの運用規定に「明記」されてるんだろう?

ARIB TR-B14 地上デジタルテレビジョン放送運用規定「9.3 放送番組及びコンテンツ一意性の確保」のこと言ってるのかな?

第 2 項に「テレビ放送画面とインターネットのブラウザ画面が一体であるかのように視聴者に誤解させるような機能」はダメ、と書いているけど、起動時とか全画面とか、そんな記述はない。

それとも他に項目があるのかな?うーん??

(技術系?の話は Facebook から転記しておくことにした)

編集者: すずき(更新: 2014年 3月 16日 23:53)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



こんてんつ

open/close wiki
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報