投稿

2011の投稿を表示しています

英数字の縦書き

http://brickybox.com/2010/09/15/html-vertical-text-safari-firefox-chrome-and-opera

Reliability rateとは何か?

Reliability Ratings and Bonuses

TopCoderでは Reliability rate というものがあります。SRM や Marathon では意識する必要がないけれど、Component Development などではReliability rateによって獲得賞金に色がついたりします。

Reliability rate とは、過去に参加したプロジェクトでレビューを通せた割合です。より具体的には、過去に参加登録したプロジェクトのうち最近15回分が考慮されます。その中でもレビューが通ったプロジェクトの数だけReliability rateが増加します。まとめると、(Reliability rate) = (レビューが通ったプロジェクトの数)/15 となります。

ボーナスについては、Reliability rate が 80 %以上なら賞金額の1割、90 %以上なら1.5割、95 %以上なら2割が獲得賞金として計算されます。

注意が必要なのは、Reliability rate は単一のスコアではなくて、カテゴリ毎に別計算されている点です。例えば、Component Design で15/15=100 %のrateを保持していたとしても、Component Development で 0/15=0 % であれば Development ではボーナスがつきません。

Mac で Java を使い分ける

Mac で Java 環境を使い分けるのは、一筋縄ではいかないようです。

探してみると、数々のサイトで解説されていることが分かります。中でも参考になったサイトを挙げると、

Snow LeopardのJava環境に手を入れる(2)OSXのJava環境切替えのしくみSwitching Java versions on a Mac (setting JAVA_HOME and using Java 6 Revisited)Switching JDKs on Mac 上記のサイトを回るとJava環境を使い分けるのはいくつかのケースを考慮しないといけないことが分かります。javacやjavaコマンドを使い分けたいだけであればJava Preferences.appを使えばよいが、javawsを使いたい場合はCurrentJDKを手動でリンクし直す必要があるなどなど。

解説サイトを回ってみて不思議だったのは、Java Preferences.appに関する具体的な情報が無いことです。ADCやOracleで探してみても情報を見つけることができませんでした。「バージョンを変えてくれる」「設定を変えてくれる」などの解説はあるのですが、どのファイルをどのように変えるのかは分かりませんでした。

という残念記事でした。

neocomplcacheメモ

インストールは全てこぴーするだけ

設定も推奨設定をコピペするだけ

補完はC-k

http://d.hatena.ne.jp/kano4/20111013/javacomplete

Component Developmentのメモ

これは参加方法の解説や関連ページの翻訳ではありません。あくまで単なるメモです。


Development Distribution Usage Instructions


Java Development Distribution


配布されるjarファイルを参照して要件などを確認する。


提出するものは
ソースコード単体テスト単体テストを通ったログComponent_Specification作業手順は


jarファイルをダウンロードjar xvf *_dist.jar/docs 以下のデザインドキュメントを確認する/src/java/ 以下のソースコードを確認するMember Handle: 匿名性保持のため、ソースやドキュメントに名前、ハンドル名、メールなどを載せてはならない。ハンドルを載せたい場合は、TCSDEVELOPERと書く。
Unit Test Cases: テストケースは/src/java/tests/com/topcoder/PACKAGE に入れる。全てのメソッド、コンストラクタを試す。
Testing your code: ant testを実行するUnitsTests.javaと自分で追加したテストケースのみを提出し、他のコードは改変しない最後に、"ant dev_submission"を実行して提出用ファイルを生成する。
build.xmlについては ant compile : ソースのコンパイルant test : テストケースの実行ant comple_targets : JVMを指定してコンパイルant dev_submission : 提出用ファイルの生成となっている。
anonymity : 匿名
Component Development Member Guidelines
各ソフトウェアのバージョン
ソースやドキュメントの制限事項 一行120文字を超えないとか
Component Development Tutorial


junit や cobertura などは build-expen...に従って配置すると楽


依存パッケージはtopcoderから入手できるものもある。


やるべきことは
ソースを書くユニットテストを行うドキュメントを書く(ソースとテストの両方)Writing Java Unit Tests
まず、src/java/tests以下にテストコード…

Dynamic Viewに切り替えました

ブログのテーマをDynamic Viewに切り替えました。

ソースコードの見栄えを考慮してずっと悩んでいましたが、source-hilight の変換がいい感じだった今後はこちらでいろいろ試しつつ、vimのTOhtmlも良さげなので浮気しつつで行こうと思います。

以前はSyntaxHighlighterを使用してソースを張り付けていました。行番号も出力しつつ背景色も見やすく、非常に気にっていました。ところが、Dynamic Viewではテンプレートをいじれない、ヘッダー部分にJavaScriptを追加できない仕様となっているため、使い続けることができなくなってしまいました。

以前の記事のソースコードについては、さかのぼって編集し直すことはないと思います。あしからず。

と、いう投稿テスト。

マウスとキー入力のイベントを同時に判定したい

イメージ
昨日つまづいたのでメモ。

特定の要素内にマウスが乗ってる時だけキー入力を受け付けたい、そんな場面に出くわしました。もっと具体的には・・・まず、ページ構成として入力エリアと選択エリアの二分されている状態を想像してください。入力エリアではフォームが幾つか配置されていて、選択エリアではアイテムがタブキーの入力で動的に変更されるように設計されていたとします。この時何の工夫もしていなければ、タブキーを押すとフォーカスがフォームを移動すると同時に選択エリアが更新されてしまう場合があります。これはユーザーが意図しない挙動で、入力エリアと選択エリアでタブキーの役割を変更するべきだと考えられます。

前置きが長くなりましたが、要は、マウスが乗ってる状態とキー入力のイベントをペアで制御したいということになります。

これを実現するためにやるべきことは、大きく分けて 2 つになります。

keydownイベントで実行する関数本体を作るmouseoverイベントでkeydownイベントに1.をバインドする (mouseoutでunbind) 具体的なサンプルコードは以下のようになります。
<html><head><scripttype="text/javascript"src="./jquery-1.7.1.min.js"></script><scripttype="text/javascript"> $(function(){ $("div").css("background-color","#C0C0C0");functiondisplayKeycode(event){ $("div").text(event.keyCode);} $("div").mouseover(function(){ $(document).bind("keydown",displayKeycode);}); $("div").mouseout(function(…

TopCoder SRM練習支援スクリプト AirSRM

https://github.com/kawakami-o3/AirSRM

TopCoder SRM(以下、SRM)での練習はほぼ日課と化していたのですが、10月頃からだったか、practice roomに入れないことが度々発生するようになりました。この問題は多くの方が経験されたようで、12月1日にはサーバのリプレースなどの対処がなされたようです(詳しくはforum参照)。以降一部の部屋には入れるようになりましたが、それでもまだアクセスできないところもあるようです。

SRMで練習する時は TopCoder Competition Arena にいくつかのプラグイン(FileEditやExampleBuilder)を使用していますが、主に使っている機能は以下のようになります。

問題文の取得システムテスト上位陣のコード取得雛形コードの生成 このうち、上位 3 つはcommunity.topcoder.comにアクセスすることで情報収集することができます。雛形コードについては雛形化している部分が多くないこともあり、一問あたり2, 3分もあれば手で打ち込むこともできます。つまり、部屋に入れなくても、大体は問題なく練習できるということになります。

ただ一点、面倒になってしまうのはやはりシステムテストです。ウェブにアクセスすることでパラメータを取得することは出来ますが、全てをテストするコードを書くのは大変手間がかかってしまいます。実のところ、このためだけに部屋に入っているといっても過言ではないかも知れません。

この問題を解決するべく組んだのが AirSRM です。
% ruby AirSRM.rb --srm=525 --div=2 --lv=1 --systemtest とコマンドを打つだけで 、SRM 525 Div 2 Easyのシステムテストコードを生成し、ローカルで擬似システムテストを行うことが出来るようになります。

ただ、もともとシステムテストをしたかっただけで、他が結構お座なりで現在のところJavaしか対応していません(テンプレートを差し替えれば割と簡単に C# にも対応できるはず。。。いつか修正します)。

Quicksilverのキーバインドを変更する

Quicksilver、言わずと知れたMac OS Xの便利なランチャー。

アップデートの頻度は多くないものの、今でも着実に開発が進めらているようです。最近ではこんな機能も

* NEW: vi bindings in command interface (⌃h, ⌃j, ⌃k, ⌃l) (Issue #368)

要するに、Ctrl+hやj,k,lで上下左右の移動ができるようになったということです。

私としては^hをバックスペースの感覚で使用してしまうので、左移動にバインドされてしまうと不便を感じてしまいます。

これを解消するには、/Applications/Quicksilver.app/Contents/Frameworks/QSInterface.framework/Versions/A/Resources/DefaultBindings.qskeys を編集します。

このファイルはXML形式となっているので、^hを探しだして適当にバインドさせることができます。これで^hを左移動から解放できます。

ただ、新たにキーバインドを登録することは出来ないようで、ソースレベルの変更が必要かもしれません。

LWJGLとMaven

MavenプロジェクトにLWJGLを取り込むには pom.xml の dependencies に追加する必要があるようですが、自分の理解力不足でまだ達成できていません。

http://code.google.com/p/mavennatives/

上記のサイトでは雛形となるプロジェクトが公開されているので、こちらを利用したほうが簡単なようです。

LWJGL Basics 2 (Input)

LWJGL Basics 2 (Input)

import org.lwjgl.LWJGLException; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode; public class InputExample { public void start() { try { Display.setDisplayMode(new DisplayMode(800, 600)); Display.create(); } catch (LWJGLException e) { e.printStackTrace(); System.exit(0); } while (!Display.isCloseRequested()) { pollInput(); Display.update(); } Display.destroy(); } public void pollInput() { if (Mouse.isButtonDown(0)) { int x = Mouse.getX(); int y = Mouse.getY(); System.out.println("MOUSE DOWN @ X: " + x + " Y: " + y); } if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) { System.out.println("SPACE KEY IS DOWN"); } while (Keyboard.next()) { if (Keyboard.getEventKeyState()) { if (Keyboard.getEventKey() == Keyboard.KEY_A) { S…

5分で分かるMaven

Maven in 5 Minutes

上記のサイトを参考にしていますが、翻訳でも解説でもないので悪しからず。

ステップ1「インストール」

「インストール」とは言うものの解説は一切なし。入って無ければ、本家ページからダウンロードして、インストールすればいいよってくらい。Linuxだったらyumやaptでインストールできるだろうし、Macだったらmacportsで簡単にインストールできる。

バージョン確認は"mvn --version"で、Macなら以下の通り
$ mvn --version Apache Maven 3.0.3 (r1075438; 2011-03-01 02:31:09+0900) Maven home: /opt/local/share/java/maven3 Java version: 1.6.0_26, vendor: Apple Inc. Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home Default locale: en_US, platform encoding: MacRoman OS name: "mac os x", version: "10.6.8", arch: "x86_64", family: "mac"
ステップ2「プロジェクトの作成」

プロジェクトを作成するには以下のコマンドを実行する。
$ mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app \ -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false 各オプションの意味はディレクトリ構成と照らしあわせてみるとわかりやすい。
設定内容は ./my-app/pom.xml に記述されている。 難解だと言われているけど、それほど長いわけでもなく割りと理解しやすい。
jarファイルの生成については
$ mvn package 他にも、コンパイル "mvn compile&quo…

LWJGL Basics 1 (The Display)

LWJGL Basics 1 (The Display)
Java向けゲームライブラリLWJGLのチュートリアルその1。
要はcreate()で画面を表示して、update()で更新、destroy()で閉じる。 表示する画面についてはsetDisplayMode()で設定を行なっていて、例のプログラムでは解像度800x600の真っ黒な画面となります。
import org.lwjgl.LWJGLException; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode; public class DisplayExample { public void start() { try { Display.setDisplayMode(new DisplayMode(800,600)); Display.create(); } catch (LWJGLException e) { e.printStackTrace(); System.exit(0); } while (!Display.isCloseRequested()) { Display.update(); } Display.destroy(); } public static void main(String[] argv) { DisplayExample displayExample = new DisplayExample(); displayExample.start(); } } コンパイルと実行には以下のようなスクリプトを用いると、作業が楽になります。
#!/bin/sh PTH=.:res:jar/lwjgl.jar:jar/lwjgl_test.jar:jar/lwjgl_util.jar:jar/jinput.jar: /usr/bin/javac -cp $PTH DisplayExample.java /usr/bin/java -cp $PTH -Djava.library.path=native/macosx/ DisplayExample Di…

ウェブでできるプログラミング

ブラウザだけで利用できるプログラミング環境のまとめ


実行環境

http://repl.it/

Ruby, Python, Lua, Scheme, JavaScript, Javascript.next, Move, Kaffeine, CoffeeScript, QBasic, Forth, Emoticon, Brainf**k, LOLCODE, Unlambda, Bloop

http://codepad.org/

C, C++, D, Haskell, Lua, OCaml, PHP, Perl, Python, Ruby, Scheme, Tcl

http://ideone.com/

Ada, Assemler, AWK, Bash, Bc, Brainf**k, C, C#, C++, C++0x, C99 strict, CLIPS, Clojure, COBOL, COBOL 85, Common Lisp, D, Erlang, F#, Factor, Falcon, Forth, Fortran, Go, Groovy, Haskell, Icon, Intercal, Java, JavaScript, Lua, Nemerle, Nice, Nimrod, Objective-C, OCaml, Oz, Pascal, Perl, PHP, Pike, Prolog, Python, R, Ruby, Scala, Scheme, Smalltalk, SQL, Tcl, Unlambda, Visual Basic .NET, Whitespace



エディタのみ

http://codr.cc/

複数人で共有、同時編集が行える。

http://paste.codebasehq.com/

コードを綺麗に表示してくれるだけ。Ruby, Javascript, HTML, CSS

http://pastebin.com/

https://gist.github.com/

vimのci

発端はこのツイートhttps://twitter.com/cwgem/status/119811120356786176
ci' and ci" in VIM for great justice.わかりやすいredditのトピックは"Did you know about ci''?"
http://www.reddit.com/r/vim/comments/9ltr5/didyouknowaboutci/ci を簡単に説明するなら、対応する括弧内の内容を変更する、ということになります。使用できる条件がやや限られていますが、編集モードで""や''などの括弧内にカーソルがあったとします。
そこで、ci" と入力すれば""で閉じられている中身が消去され入力モードに移行します。
同様に、''の中で ci' と入力すれば''の中身を一気に削除して入力することができます。ci の後に続く括弧の記号は開始でも閉じでも構いません。
()括弧の中を編集する場合は、()内にカーソルを移動して、ci( もしくは ci) と入力すれば中身が削除され入力モードに移行します。

[Java] 母音か子音か

SRM 240 Div2 easyより
変数chrがStringで、小文字一文字だけだった時に、母音(a, i, u, e, o)か子音かを判定したい時、素直に考えて
chr.equals("a") || chr.equals("i") || chr.equals("u") || chr.equals("e") || chr.equals("o") と書いていたけど、
"aiueo".indexOf(chr) >= 0 のスマートさに愕然とした。

Ruby Version Manager

https://rvm.beginrescueend.com/
http://gihyo.jp/dev/serial/01/ruby/0039
http://po-ru.com/diary/using-rvm-with-tcsh/
tcshの説明部分については、po-ru.comから引用しています。
RVMのインストール
bashやzsh
bash < <(curl -s https://rvm.beginrescueend.com/install/rvm) tcsh
curl -Lo rvm-install.sh https://rvm.beginrescueend.com/install/rvm bash rvm-install.sh RVMの設定
bashやzsh
[[ -s "/Users/mikami/.rvm/scripts/rvm" ]] && source "/Users/mikami/.rvm/scripts/rvm" tcsh
まず、ラッパースクリプトrvm.tcshを作成します。
#!/usr/bin/env tcsh set rvm_command="source ${HOME}/.rvm/scripts/rvm; rvm $*" if ($1 == "use") then bash -c "$rvm_command && tcsh" else bash -c "$rvm_command" endif あとは、エイリアス設定を行っておいきます。
alias rvm rvm.tcsh rvmシェルでのプロンプト設定は
set prompt_info = "" if ($?RUBY_VERSION) then set prompt_info = "[$RUBY_VERSION] $prompt_info" endif # plus any other information you want set prompt = "$prompt_info%. %# " # yours may be more colourf…

神スクリプトの使い方 Codeforces編

神スクリプトのソースとその解説サイトは以下の通りOnlineJudgeHelperPKUやCodeforcesなど5つのオンラインジャッジ対応の神スクリプトLinuxやMac OS Xで利用する場合は、まず最初に改行コードの変更を行う必要があります。次に、pythonなどのパス設定などを適宜行いますが、Codeforcesで利用する場合は setting.json を作成する必要はありません。実行例は以下のようになります。 % oj.py --codeforces -i PalindromicTimes.java 108 A ソースファイルは -i で指定します。問題番号については、いつの問題の何番目かを指定します。これらの英数字はURLから判断します。上記の例では、問題文のURLがhttp://www.codeforces.com/contest/108/problem/Aとなっているため、contestとproblemの後ろの英数字を引数として与えています。もし、ソースコードがいい加減で間違えている(入力に"hogehoge"を追加して出力するだけなど)場合は % oj.py --codeforces -i PalindromicTimes.java 108 A compiling... Case #0: 13:31 | 12:21hogehoge Case #1: 00:00 | 23:59hogehoge WrongAnswer (max 0.299582958221s) となり、左に期待される出力、右に間違えた出力がそれぞれ表示されます。正解だった場合は、 % oj.py --codeforces -i PalindromicTimes.java 108 A compiling... Case #0: 13:31 13:31 Case #1: 00:00 00:00 OK (max 0.301555156708s) となります。テストを追加する場合は、全ての英数字を連結して引数に与えます。 % oj.py -a 108A Test case template file 2 is…

丸め誤差対策

C/C++なら
#define D2I(a) (int)((a)*(1+1e-15)) Rubyなら
class Float def to_ii (self * (1+1.0e-6)).to_i end end puts (0.29*100).to_i puts (0.29*100).to_ii EPSが小さすぎて失敗したというつぶやきをいくつか見かけたが、相対的なEPSを与えることでそのようなミスを回避することができる。
とはいえ、求められる精度や値域を把握した上で、そっとEPSを足してあげる方が正しい姿勢な気がする。

(追記:2011/12/7)

どんな時にエラーが発生するのか分からない場合は、以下のrubyコードのようにして実験してみるといいかも知れません。

(1..10).each do |i| (i+1..10).each do |j| a = 0.01*i b = 0.01*j c = i*j d = a*b*10000 puts "#{i} x #{j} = #{c} <-> #{d}" unless c==d end end

気象庁から最高気温を最低気温を取得する

ここ数日は本当に暑い。一体どのくらいの勢いで最高気温を更新してんだよってことで書いてみた。 #!/usr/bin/ruby -Ku # -*- coding: utf-8 -*- # 過去一ヶ月間の最高気温、最低気温を取得する require 'iconv' require 'rubygems' require 'mechanize' require 'hpricot' require 'open-uri' require 'pp' TargetCity = ""  # Ex. TargetCity = "東京" if TargetCity == ""   puts "データを取得したい都市 ( TargetCity ) を設定してください"   exit -1 else   puts TargetCity end a = Mechanize.new (1..30).each do |num|   a.get("http://www.data.jma.go.jp/obd/stats/data/mdrr/synopday/data#{num}.html") do |page|     (page/"tr").each do |tr|       city = (tr/"td.o0").map do |td| Iconv.conv('UTF-8','EUC-JP',td.inner_html) end.first       if city == TargetCity         list = (tr/"td.oR").map do |i| Iconv.conv('UTF-8','EUC-JP',i.inner_html) end         day  = (Time.now-(num-1)*24*3600).day         puts "day=#{day}  max=#{list[3]} min=#{list[4]}&…

hpricot

http://tam.qmix.org/wiki/Hpricot.html

ペネトレーションテスト

http://www.backtrack-linux.org/

JUnit

JUnit で使える assert のまとめhttp://kentbeck.github.com/junit/javadoc/latest/"All Classes" → "Assert"assertArrayEqualsfloat, doubleo なら誤差の許容範囲を指定するassertEqualsassertFalseassertNotNullassertNotSameassertNullassertSameassertThat http://journal.mycom.co.jp/articles/2007/07/20/junit1/index.htmlassertTruefailコマンドjava junit.textui.TestRunner classnameassertArrayEqualsを使用する場合は import static を忘れずに。

Macでの配信環境

FMLECam TwistSoundflowerLadio casthttp://idita.blog11.fc2.com/blog-entry-95.html

Box2DJS

Box2DJShttp://box2d-js.sourceforge.net/はじめる!Box2DJShttp://tatsu-zine.com/books/box2djsgithubhttps://github.com/technohippy/box2d-jshttps://github.com/technohippy/box2djs-samples (はじめる!Box2DJSのサンプルコード)ジョイントの制限「はじめる!Box2DJS」の「2.6.2 動きの角度を制約する」で、ジョイントの角度だけではなく、可動域を制限する方法にも触れられています。以下メモ座標を取得するvar str = ""; for (var b = world.GetBodyList() ; b ; b=b.GetNext()) { str += b.m_position.x + ", " + b.m_position.y + " && "; } GetPosition()でも取得できるらしいんだけど、エラーになってしまう。他の物理エンジンhttp://en.wikipedia.org/wiki/Physics_engine

[Java] BufferedReader

System.inは静的で、BufferedReaderのclose()で解放されてしまう。

SQLite

コマンドラインから直接SQLを発行して操作する方法をまとめます。インストールMacportsなら$ sudo port install sqlite3起動と終了$ sqlite3 test.db作成されたテーブルはtest.dbに保存されます。終了するには、sqlite> .quitと入力するか、Ctrl+dを入力しますデータの読み込みsqlite> .import datafile.txt tableデフォルトの区切り文字は"|"となっています。区切り文字を","に変更する場合は、sqlite> .separator ","ここで、","ではなく , とダブルクォートを外しても構いません。データファイルに余分な空白などが含まれている場合、全て含めてデータとして読み込まれてしまうため、注意が必要です。SQLsqlite> create table stock (code numeric primary key, name varchar(10), price integer);sqlite> insert into stock values (100, 'file', 50); sqlite> insert into stock values (100, 'file', 55); Error: column code is not unique sqlite> insert into stock values (101, 'paper', 10); sqlite> insert into stock values (130, 'pen', 100); sqlite> insert into stock values (230, 'eraser', 200); sqlite> insert into stock values (300, 'ink', 20); sqlite> insert into stock values (301, 'ruler', 1000); sqlite> insert into stock v…

JavaでIRCクライアント

コメントを投げるだけのシンプルなIRCボットをJavaで作成してみました。
作成にあたってRFCを参照した他に、PircBotのソースを参考にしました。IRCボット作成用のJavaフレームワークで、GPLと商用ライセンスの両方が利用できます。
以下のソースはgithubでも公開してあります。
https://gist.github.com/1489587
import java.net.*; import java.io.*; import java.util.*; class IrcSenderSimple { static void sendString(BufferedWriter bw, String str) { try { bw.write(str + "\r\n"); bw.flush(); } catch (Exception e) { System.out.println("Exception: "+e); } } public static void main(String args[]) { try { String server = "chat1.ustream.tv"; int port = 6667; String nickname = "ustreamer-183999bot"; String channel = "#bot-test-ch"; String message = "hi, all"; Socket socket = new Socket(server,port); System.out.println("*** Connected to server."); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(socket.getOutputStream()); System.out.prin…

Java

イメージ
FileOutputStreamとDataOutputStreamを使ったときのcloseは、後者に対して実行するだけでいいんだろうか?独習Java 第4版のP. 360あたりにサンプルコードが載っているけど、DataOutputStreamをcloseするだけで、FileOutputStreamも閉じられるの?FileOutputStreamだけを閉じたとき、DataOutputStreamも閉じられるの?これを確認するのには、ソース読まなきゃダメ?JDK7のソースを開いてみたら、そんなに複雑でもなく理解できそう。あとで、該当箇所をまとめておこう。

グラフ作成ソフトを探したら、選択肢はR一択だった件

普段はIDLを使用してグラフ作成を行っていますが、IDLが使用できなくなった場合に備えて無償ソフトを探してみました。考慮する条件は以下のとおりで、英語版wikipediaのplottingカテゴリから探しました。最近も活発に開発が行われている (最終安定版が最近一年以内にリリースされている)MacPortsで配布されていたり、pkgバイナリが用意されているなど、インストール作業が簡単である。グラフ作成処理をスクリプト化できるこの他、綺麗なグラフの作成やスクリプト言語の習得が容易であるかなども重要だと考えていますが、実際に触ってみなければ判断できないため、選考基準からは外しました。実際にインストールを試みたのは Fityk, MayaVi, PLplot, QtiPlot, Rでしたが、コンパイルエラーを解決できなかったり、スクリプトの実行に必要なライブラリが見つからないなどの問題が発生しました。結局、自分に使えそうなのは R のみとなりました。以下に、Rのサンプルとrubyからの利用方法をまとめます。なお、Rのサンプルを実行するには、サンプルのファイル名を sample.r とすると、$ R --no-save < sample.r もしくは$ Rscript sample.r というコマンドを使用します。Rスクリプトのサンプルその1一次元プロット。x <- c(1,2,3,4,5,6) y <- x^2 plot(x,y,xlab="x",ylab="y=f(x)",main="f(x) = x^2") サンプルその2カラーコントアとコントアの重ねあわせ。ここではpng画像に保存しています。png(filename="./Rplot.png",width=480,height=480,units="px",bg="white") x <- (1:100)/100*7 y <- x r <- sqrt(outer(x*x,y*y,"+")) z <- sin(r) n=200 image(x,y,z,col=rainbow(n,s=1,v=1,start=0,end=max(1,n-1…

勉強しよう

HTML5とかおHamlとかSCSSとかJQueryとかCoffeeSCriptとか、いつか、いつか、いつよ?

Erlang

イメージ
基本的にはプログラミングErlangを参照して勉強しています。他に参考にしているのは、以下のサイトです。http://www.ibm.com/developerworks/jp/opensource/library/os-erlang1/?cmp=dw&cpb=dwope&ct=dwrss&cr=dwrss&ccy=jp&csr=061011http://www.erlang.org/doc.html使用方法シェルを起動するには erl、スクリプトを実行する場合はescriptを使用する。文法コメントは %変数は先頭文字が大文字関数定義は a(X) -> X * 2. のようになる。最後のピリオドに注意。無名関数は fun(X) -> X * 2 end 。最後のendを忘れずに。if 文は if N==0 -> 1; true -> N end のように、セミコロンで区切る。else文の代わりにtrueを用意しておく、必ず。main([]) -> ... コマンドライン引数を取らないときのメインio:format標準出力。エスケープ文字はチルダ ~ 。つまり、~ nで改行。~wで数値。http://www.erlang.org/doc/man/io.html

Node.jsメモ

http://d.hatena.ne.jp/kuenishi/20101013/1286973687>「node.jsってPythonのTwistedだったりRubyのEventMachineみたいなもんだよ」> ErlangのWebサーバーってのはね、1コネクションにつき1プロセス立ち上げるわけ。わかる?100Kのコネクションがあったら、100KのWebサーバーが立ってるわけ。そん中のいっこくらい死んでも何ともないのがErlang.スケーラビリティと対障害性のトレードオフ?

Y Combinator

イメージ
Y コンビネータを思い出すために、いくつかの言語で実際に作ってみます。
このトピックは不定期更新で、一番最後のプログラムが最新の投稿となっています。また、どの言語でYコンビネータを作成するかはその時の思いつきで決めています。以下で取り上げている言語は
SchemeCommon LispOcaml (断念)HaskellErlangJavascriptRubyPythonPHPSmalltalkPerlGo (中断、調査中)LuaIo (断念)C 今後計画している言語は、C++, Java, Vala, Scalaです。
それでは、本題に入っていきます。
Scheme
(define Y (lambda (f) ((lambda (proc) (f (lambda (arg) ((proc proc) arg)))) (lambda (proc) (f (lambda (arg) ((proc proc) arg))))))) (define fact (lambda (f) (lambda (n) (if (zero? n) 1 (* n (f (- n 1))))))) (print ((Y fact) 5)) Common Lisp
(defun Y (f) ((lambda (proc) (funcall f (lambda (arg) (funcall (funcall proc proc) arg)))) (function (lambda (proc) (funcall f (lambda (arg) (funcall (funcall proc proc) arg))))))) (defun fact (f) (function (lambda (n) (if (zerop n) 1 (* n (funcall f (1- n ))))))) (print (funcall (Y 'fact) 5)) Scheme版と結構違ったものになってしまいました。入門Common LispではもっとシンプルなY combinatorの例が掲載されています。ただし、factを定義するために、…

Pythonメモ

True, Falseそれぞれ 1, 0 だけど、0はfalseと判定され、0以外の数字はtrueと判定される。ソースで確認。三項演算子a = x if st else ystがtrueならx、falseならyこれを使うと階乗は次のように書ける fact = lambda n: 1 if n==0 else n*fact(n-1) print fact(5)

XMLHttpRequest2

http://www.html5rocks.com/en/tutorials/file/xhr2/
クロスドメインでのPOSTもできる感じなんかな?

無駄のないコード

チラ裏御免。Project Eulerの上位陣と自分のコードを比較してみると、明らかに変数の量が違う。自分のコードでは、一回しか使わなないのに変数として保持したままになっていることが多い。数列の一部分は「とりあえず」で保存してしまっている。ループ中に必要になるのはそのループにマッチした、特定の項だけだとしても。以前は、方針がよく分からず例題用コードから行き当たりばったりで最適化を行うようなことをしていた。でも、今はコードを書く前にアルゴリズムを書き出すことができるようになっている...(いや、これは奢りだな)。計算量やメモリ量を見積って、実行する前に計算時間があらかた予想できている。これからは不要な変数に注意を払いながらアルゴリズムを考えるようにしよう。いや、基本生兵法なのがいけないか。もっと本を読もう。

byobu on Mac

How to install Python newt or snack in Mac OS X for byobu

Mac で byobu を使おうとした時に、newt関連で実行できないことがあります。解決策はいろいろあると思いますが、MacPortsを使うなら libnewt をインストールして環境変数を設定すれば解決できます。実行するコマンドは以下のようになります。

% sudo port install libnewt
% export PYTHONPATH=/opt/local/lib/python2.6/site-packages/
csh系なら
% setenv PYTHONPATH /opt/local/lib/python2.6/site-packages/

以前つまづいた問題がsuperuserで質問されていたので答えましたよってだけです。

Node.js

http://www.ibm.com/developerworks/jp/cloud/library/cl-nodejscloud/
を読んで頭が混乱。。。というかNode.jsについて何も分かっていないことを認識した。

そして、ググること数秒
http://d.hatena.ne.jp/forest1040/20110407/1302150936
で目からウロコが落ちた。

Perl

http://lab.kamawada.com/techmemo/index.cgi?page=%40INC%A4%CB%A5%D1%A5%B9%A4%F2%C4%C9%B2%C3%A4%B9%A4%EB%A4%CB%A4%CF

LinkedListのサンプル

LinkedListで整数を扱おうとしたところ、java.lang.Objectを(int)で型変換しようとして失敗。。。ハズカシス。

扱うオブジェクトが整数(Integer)と分かりきっている場合は
import java.util.*; class LinkedListTest { public static void main(String[] args) { LinkedList<Integer> list = new LinkedList<Integer>(); list.add(1); list.add(11); list.add(13); for (int i = 0; i < list.size(); i++) { int x = (int)list.get(i); System.out.println(x); } } }
オブジェクトを判別しながら処理する必要がある場合は、instanceof 演算子で調べget()の返り値をキャストする。
import java.util.*; class LinkedListTest { public static void main(String[] args) { LinkedList list = new LinkedList(); list.add(1); list.add("Hello"); list.add(13); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i) instanceof Integer); if (list.get(i) instanceof Integer) { Integer x=(Integer)list.get(i); System.out.println(x); …

Tiny Core Linux

Rubygem上のJavaScript関連プロジェクト

$ gem search --remote javascript*** REMOTE GEMS ***harukizaemon-cascading_javascripts (2.0.3)inline_javascript (0.1)javascript_auto_include (0.1.0)javascript_eraser (1.0.2)javascript_features (1.0.1)javascript_i18n (0.2.2)javascript_localize (0.0.2)javascripto (0.0.2)javascripto-rails (0.0.3)mack-javascript (0.8.3.1)neerajdotname-javascript_lab (0.0.15)niessner-javascript_generator_enhancements (0.0.1)qoobaa-javascript_i18n (0.2.2)to-javascript (1.0.0)universe-javascript (0.1.1)上記のうちrubygems.orgにあるのは以下http://rubygems.org/gems/inline_javascripthttp://rubygems.org/gems/javascript_auto_includehttp://rubygems.org/gems/javascript_eraserhttp://rubygems.org/gems/javascript_featureshttp://rubygems.org/gems/javascript_i18nhttp://rubygems.org/gems/javascript_localizehttp://rubygems.org/gems/javascriptohttp://rubygems.org/gems/javascripto-railshttp://rubygems.org/gems/mack-javascripthttp://rubygems.org/gems/to-javascripthttp://rubygems.org/gems/universe-javascript

Xcode

http://ameblo.jp/xcc/entry-10400027873.htmlhttp://blog.livedoor.jp/mogiken1/archives/3379746.html

V8(d8)でLimeChatスクリプトをデバッグするためには

Google Chrome の Javascript エンジン V8 を使って LimeChat スクリプトをデバッグするためのメモ。V8のインストールについてはhttp://shinya-blog.blogspot.com/2011/01/macjavascriptv8.html実際に使用するのは d8。V8のソースからは shell もコンパイルできるが、複数行の命令文を解釈できない。ソースコードで変更しなければならない点は以下のとおりevent::関連。::が構文エラーになるActiveXObject定義しておくべき関数や変数logsendsendRawXMLHttpRequestはどうしたらいいか分からない。ウェブを検索すると非同期通信を除いてはライブラリがあるらしい。また、rhinoであっても標準では付属していない。

Javascript

http://d.hatena.ne.jp/amachang/20080903/1220405193
http://shinya-blog.blogspot.com/動作環境の判別が簡単にできるなら、d8でのみテストコードを実行するとかできそうなんだけどなぁ。

bitly

http://code.google.com/p/bitly-api/wiki/ApiDocumentation#/v3/shortenhttp://code.google.com/p/bitly-api/wiki/ApiBestPracticeshttp://blog.bungu-do.jp/archives/1659http://umeblo.mydns.jp/?p=193LimeChatのヘルプに中にGoogle検索のサンプルがあったので、それを流用してbitlyでURL短縮を行うスクリプトを作ってみました。https://github.com/ust18365/javascript-stuff/blob/master/google-bitly.jsfunctiontinyurl(url) { varlogin='YOUR_LOGIN_ID' varapiKey='YOUR_API_KEY' varencUrl=encodeURIComponent(url); varbitly='http://api.bitly.com/v3/shorten?' varquery='longUrl='+encUrl+'&login='+login+'&apiKey='+apiKey varreq=newActiveXObject("Microsoft.XMLHTTP"); req.open('get',query,false) req.send(''); eval('var s='+req.responseText);

OAuth

日記投稿スクリプトを考え、実際に作ってみる

記日記のバックアップを考える」の続きのようなメモ自分が何を求めているのかをはっきりさせるためにいろいろ文章化してみようと思います。当初作ろうとしていたRubyスクリプトは、ウェブスクレイピングした内容を定期的に投稿するというものでした。日々更新される複数のサイトを巡回して情報収集を行う場合、手動で閲覧して確認するには多くの時間が必要です。この労力を削減するために、要点のみを抽出することを試みました。この時、サイトの巡回とHTMLの解釈が必要になったため、mechanizeやhpricotモジュールを使用することで目的を達成することができました。これによって毎日の更新を確認することはもちろんのこと、時間単位での更新を追うことも可能になしました。この後、こうして集められた情報は自分以外の人にも必要にされていることが分かったため、Bloggerで公開することにしました。また、記事投稿の作業を簡単にするため、bloggerモジュールで自動化できないか調べてみました。その結果、bloggerモジュールが提供しているのは新規記事の投稿であることが分かりました。これでは日に何度も更新すると、不必要になった古いデータが残されたままになってしまいます。このため、記事を更新できるスクリプトを作成しようと考えました。求めている機能について箇条書きでまとめてみます。日付あるいはトピック指定での記事を投稿するサイトを巡回して、データを取得する(既に実現済み)二時間おきに巡回と記事の更新を行う実行環境については以下のように計画しています。herokuで実行します。また、ウェブcronで2時間に一回程度アクセスしてもらいます。herokuは無料の範囲内で運用します1 dyno (1 cpu、10-50 requests/s)更新周期が遅いため処理にもたついても運用できると楽観視しています。こうして自分の求めるものをまとめていると次々に具体的にしなければならないことが浮かび上がってくる上、実は必要なかった機能やその逆が見えてきます。現在公開されている記事は何度も修正されたものとなっています。また、これからも変わっていくでしょう。まだ理解していない、考えがまとまっていないことはエラー処理googleauthモジュールの使用。bloggerモジュールで使われているが実際どんな機能があるのか。何が考…

疑問リスト

XmlSimple.xml_in の引数の意味

日記のバックアップを考える

先日のBloggerダウンからstatus blogの重要性を学びましたが、毎日欠かさず確認して即座にバックアップを取れるようにするのは大変です。そこでどうやってバックアップをとるべきかを考えてみます。バックアップの対象としては、記事の内容やコメント、さらにはブログの設定なども含まれてくるかも知れません。しかし、ここでは第一目標として、ブログの記事のみに的を絞りたいと思います。そうすると、バックアップのタイミングは記事の投稿時のみでよくなります。以下、メモ今頭の中にある方法は、ローカルマシンと他のブログにバックアップを保存しておくことです。どうやって実現するかについては、別件で作成中の記事投稿スクリプトを改変して対応するつもりです。実際の作業の流れは、ローカルで記事の編集を行い、スクリプトの実行でBloggerや他のブログに投稿を行うというようになります。http://wiki.livedoor.jp/staff/d/API/AtomPub
http://auth.hatena.ne.jp/記事の投稿ができるアプリケーションはどのプラットフォームでもいくつかあるし、実際に自分もScribeFireを使ってみている。でも、ローカルにデータを保存しておくことはできないし、複数のブログへ同じ内容を投稿することはできない。

Blogger Buzz: Blogger is back

Blogger Buzz: Blogger is back: "Update (5/13 7:46PM PST): Nearly all posts since Wednesday are restored, now bringing back comments from last couple days. We expect the co..."Bloggerのダウン、そして巻き戻り。何が原因だったのか分からないけど、ことの経緯について記録しておこうと思う。時間についてはおぼろげなので間違っているかも知れない。まず、週の初めあたりに最初の問題が発生した。投稿エディタが読込中になったまま使えず、投稿ができない状態になった。サポートフォーラムを確認すると、ごく狭い地域でこの問題が発生していること、パッチはもう出荷されていること、問題が改善されない場合はキャッシュを削除することなどが報告されていた。しかし、報告通りに問題が改善することはなかった。ただし、旧投稿エディタは問題なく動作していたし、投稿もできた。水曜になって、Bloggerのダウンが発生した。具体的には、Bloggerの閲覧はできるものの、投稿ページであるダッシュボードにアクセスできなくなった。これはstatus blogではメンテナンスと記述されていたが、事前に通知はされていなかった。status blogに予告があったようだが、投稿があったのは直前の9日だった。この数時間後にBloggerのデータが巻き戻され、記事内容が水曜以前のものに置き換えられた。ダウンから丸一日たって、ダッシュボードにアクセスできるようになった。この時Bloggerチームはデータを復元中であると報告していた。そして、現在、「記事の復元が完了し、コメントを復元中である」という報告がなされている。しかし、記事データは水曜以前の古いままである。おそらく、もうデータがもどってくることはないだろう。バックアップとサポートについて考えさせられる一件であった。今回の件から学んだことstatus blog を毎日欠かさず見なければならない。それができないなら、毎日バックアップする仕組を考えなければならない。報告は具体的かつ正確であった方がいい。悪い内容であっても、信頼を損なうことはなくなる。

Ruby de Google Data API

参考ページ Using Ruby with the Google Data APIsRubygemのbloggerモジュールで不足している機能を実現するために、Google Data APIについて学習します。Bloggerモジュールで実現したかったのは定期的な記事修正でしたが、日付指定の記事投稿ができなかったため断念するしかありませんでした。他のモジュールについてはGoogle Data APIを直接扱うものがあり、類似のモジュールがいくつもあります。このため自分にとって何が必要でどのモジュールが適しているのかを判断する必要があります。また、可能ならばbloggerモジュールにコミットしたいと考えています。このような背景からドキュメントを読む必要があると考えました。以下では、まとめきれていないメモを羅列していくつもりです。GET (記事の取得)、 POST (記事の投稿)、PUT (既存の記事を更新)200 (feedやエントリーの取得に成功)、201 (リソース?の作成や更新に成功)、400 (Bad Requiest)Obtaining and install RubyRubyのインストールとXmlSimpleの準備をする。RubyについてはLinuxならすでに用意されているから、aptなどを使うといい。Windowsだったら、Ruby本家のページに行くと様々なパッケージを見つけることができる。XmlSimpleについては、以下のようにしてインストールする。$ gem install xml-simpleサンプルrequire 'net/http'<br />youtube_top_rated_videos_feed_uri = 'http://gdata.youtube.com/feeds/api/standardfeeds/top_rated'<br />uri = URI.parse(youtube_top_rated_videos_feed_uri)<br />p uri.host<br />Net::HTTP.start(uri.host, uri.port) do |http|<br /> puts http.get(uri.path)<br /&…

Ocaml

プログラミングの基礎
http://www.saiensu.co.jp/?page=book_details&ISBN=ISBN978-4-7819-1160-1&YEAR=2007
サポートページ http://pllab.is.ocha.ac.jp/~asai/book/Top.html

Ruby de Blogger

RubyスクリプトからBloggerへ記事投稿を行うためのメモ。

対象とする環境は
$ ruby --version ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-darwin10.7.0] 使うのは blogger です。

まず、bloggerをインストールします。
% gem install blogger 環境によっては管理者権限で実行する必要があるかもしれません。

日本語の解説で検索上位にあるのは、http://d.hatena.ne.jp/rubellum/20110330/post_to_blogger_ruby

サンプルを実行するには Blog ID が必要になります。Blog ID を確認するためには、「ダッシュボード」→「投稿の編集」などのように辿ります。この時、URLに含まれている「blogID=」以下の数字が Blog ID となります。

このbloggerモジュールでは非常に簡単に記事の投稿が行える反面、扱える機能が少なく、日付を指定して投稿するなどの操作を行うことができない。

仕様

要求仕様の美学
http://it.impressbm.co.jp/taxonomy/term/134
http://it.impressbm.co.jp/e/2009/02/16/498

ストレンジアトラクタ

アサシンクリードにもでてくるのね

C/C++

配列を関数に渡す
http://ratan.dyndns.info/MicrosoftVisualC++/hairetukansu.html

参照渡し
http://www.geocities.jp/ky_webid/cpp/language/015.html

Redis

http://gihyo.jp/dev/feature/01/redis

---> Fetching redis ---> Attempting to fetch redis-2.2.4.tar.gz from http://redis.googlecode.com/files/ ---> Verifying checksum(s) for redis ---> Extracting redis ---> Applying patches to redis ---> Configuring redis ---> Building redis ---> Staging redis into destroot ---> Creating launchd control script ########################################################### # A startup item has been generated that will aid in # starting redis with launchd. It is disabled # by default. Execute the following command to start it, # and to cause it to launch at startup: # # sudo port load redis ########################################################### ---> Installing redis @2.2.4_0 ---> Activating redis @2.2.4_0 To start up a redis server instance use this command: redis-server /opt/local/etc/redis.conf ---> Cleaning redis

avahi

/var/log/system.log を眺めていたところ、以下のようなエラーメッセージが定期的に出力されていた。com.apple.launchd[1] (org.freedesktop.avahi-daemon[16990]): posix_spawn("/opt/local/sbin/avahi-daemon", ...): No such file or directory com.apple.launchd[1] (org.freedesktop.avahi-dnsconfd[16991]): posix_spawn("/opt/local/sbin/avahi-dnsconfd", ...): No such file or directory com.apple.launchd[1] (org.freedesktop.avahi-daemon[16990]): Exited with exit code: 1これはMacportsのavahiに関連するエラーで、avahiをアンインストールした場合に発生するようだ。このエラー出力を止める方法がわかったので、後でまとめることにする。...まとめると書いたっきり全然まとめてないませんでした。え...っと、上記のエラーメッセージが発生する環境について改めて書くと、以下のようになります。Macportsを使用しているavahiをインストールしたことがあるその後、avahiをアンインストールしているどのバージョンのavahiに問題があるのかは分かりません。メーリングリストを調べてみると、エラーの報告とパッチの作成が何度か繰り返されているようです。解決策は、avahiデーモンが起動しないようにすることです。そのためには二つの作業が必要で、まずlaunchctlから削除し、次に設定ファイルも削除する必要があります。具体的なコマンドなどについてはまた後で更新します。

ruby

Visual Basic まとめ

Rails

rails new myapp

rails server

rails myappcd myappgit initgit add .git commit -m "my new app"heroku creategit push heroku mastergit commit http://www8.atwiki.jp/git_jp/pub/git-manual-jp/Documentation/gittutorial.html

ssh-keygenの使い方

$ ssh-keygen -t rsa
$
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/432makesshkey.html