2009年06月30日

【1日1Java】ZIP解凍

// JRE 1.6.0_07
// java.util.zip.ZipFile
// ZipFileクラスを使用してZipファイルの解凍
// 1階層のみ対応
// 圧縮ファイル内にディレクトリがある場合については、
// ZipInputStreamのエントリー(明日書く予定)参照
// tag zip


続きを読む

【1日1Commons】HTML,Javascript,XMLのエスケープ

// JRE 1.6.0_07
// Commons Lang 2.4
// HTML,Javascript,XMLのエスケープ
// org.apache.commons.lang.StringEscapeUtils
// tag エスケープ,サニタイズ


続きを読む

カミュ「異邦人」

「私はこのプロマネに対してクビを要求します。 そしてクビを要求してもさっぱりとした気持ちです。
 思うに、私は在職もすでに長く、その間、幾たびかクビを要求しましたが、今日ほど、この苦痛な義務が、1つの正当、正義の意識と、非生産的なもの以外、何1つ読み取れないプロジェクトのマネージャーを前にして私が感ずる恐怖とによって、償われ、釣合いがとれ、光をうけるように感じたことは、かつてないことです」

話を終えた人事部長が腰をおろすと、かなり長い沈黙が続いた。
私は暑さと驚きとにぼんやりしていた。

取締役が少し咳をした。
ごく低い声で、何かいい足すことはないか、と私に尋ねた。
私は立ち上がった。

私は話したいと思っていたので、多少出まかせに、「故意にプロジェクトを破綻させようとしていたわけではない」といった。

取締役は、それは1つの主張だ、と答え、これまでの君自身の弁明はうまくいっていないように思うので、君の上司に話を聞く前に、君がプロジェクトを破綻させた原因だけでもはっきりしてもらえれば幸いだ、といった。

私は、早口にすこし言葉をもつれさせながら、そして、自分の滑稽さを承知しつつ、それはSunのせいだ、と述べた。

【1日1Rails】単数形、複数形の変換

Ruby 1.8.7
Rails 2.3.2
英単語の単数形 <=> 複数形変換
命名を大事にするRailsにとってはとても大事な機能

pluralize, singularize


続きを読む

【1日1Java】URLのエンコード、デコード

// JRE 1.6.0_07
// java.net.URLEncoder
// java.net.URLDecoder
// URLのエンコード、デコード
// tag encode

続きを読む

【1日1Commons】CSV用の値のエスケープ

// JRE 1.6.0_07
// Commons Lang 2.4
// CSV用エスケープ
// org.apache.commons.lang.StringEscapeUtils
// tag エスケープ

続きを読む

2009年06月28日

【1日1Rails】前月・翌月を取得する

Ruby 1.8.7
Rails 2.3.2

# Dateでやってますが、Timeでも動きます

# 先月=last_month, 翌月=next_month
>> date = Date.new(2009, 1, 1)
  => Thu, 01 Jan 2009
>> date.last_month
  => Mon, 01 Dec 2008
>> date.next_month
  => Sun, 01 Feb 2009

# 2ヶ月後、2ヶ月前
>> date.months_ago(2)
  => Sat, 01 Nov 2008
>> date.months_since(2)
  => Sun, 01 Mar 2009

# monthをyearにすれば、年の扱い
>> date.next_year
  => Fri, 01 Jan 2010
>> date.last_year
  => Tue, 01 Jan 2008
>> date.years_ago(2)
  => Mon, 01 Jan 2007
>> date.years_since(2)
  => Sat, 01 Jan 2011

# 標準関数でやるとこんな感じ
>> date = Date.new(2009, 1, 1)
>> date << 1
  => 20081201

# ちなみに3月31日の1ヶ月前2月28日
>> date = Date.new(2009, 3, 31)
>> date << 1
  => 20090228

【1日1Commons】実行中のOSを判定する

// JRE 1.6.0_07
// Commons Lang 2.4
// 実行しているOSを判定する
// WindowsかLinuxかを判定する
// org.apache.commons.lang.SystemUtils
// tag system

// WindowsXPで動かしています

System.out.println( SystemUtils.OS_ARCH ); //=> x86
System.out.println( SystemUtils.OS_NAME ); //=> Windows XP
System.out.println( SystemUtils.OS_VERSION ); //=> 5.1

// Windowsかどうか判定
System.out.println( SystemUtils.IS_OS_WINDOWS );

// Linuxかどうか判定
System.out.println( SystemUtils.IS_OS_LINUX );

// Unixかどうか判定
// IS_OS_AIX || IS_OS_HP_UX || IS_OS_IRIX || IS_OS_LINUX ||
// IS_OS_MAC_OSX || IS_OS_SOLARIS || IS_OS_SUN_OS
// という判定をしているらしい
// MacOSの]もちゃんと入ってる
System.out.println( SystemUtils.IS_OS_UNIX );

// Macかどうか判定
System.out.println( SystemUtils.IS_OS_MAC );

【1日1Java】ランダムな数値、アルファベットを取得

// JRE 1.6.0_07
// java.lang.Math
// java.util.Random
// ランダムな数値、ランダムなアルファベット(a-z)を取得する
// tag ランダム Math

// 0〜9までのランダムな数を取得する
// Math.randomは0.0以上、1未満(1を含まない)の値を返す
// ので、10かけてfloorすれば、0〜9の値になる
int num = (int) Math.floor( Math.random() * 10 );
System.out.println( num );

// JavaDoc
// http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Math.html#random()

// ランダムなアルファベットを取る場合は、「a = (char)97」なので、
// 「a-z = 26文字」に「97」を足す
char c = (char) Math.floor( Math.random() * 26 + 97 );
System.out.println( c );

// そういえば、java.util.Randomというのが居た
// こちらの方がnextIntが居る分、可読性が良いかも
Random random = new Random();
num = random.nextInt(10);
System.out.print( num );

// コンストラクタでシードを指定できるけど、デフォルトコンストラクタの中で
// こんな風にシードを指定してるので、普通は気にしなく良いかも
// ++seedUniquifier + System.nanoTime()
// (内部的に持ってるlongの値をインクリメントしつつ、ナノ秒を足してる)

// a-zを取る場合はこんな感じ
// nextCharという子はいない()
c = (char) Math.floor( random.nextInt(26) + 97 );
System.out.print(c);

// JavaDoc
// http://java.sun.com/javase/ja/6/docs/ja/api/java/util/Random.html

// ちなみにjava.lang.Math.randomは、内部的にjava.util.Randomの
// インスタンスをシングルトンで持っていて、それを使用している
// ので、パフォーマンス上はMath.randomの方が良いかも

【1日1Commons】実行中のJavaのバージョンを取得する

// JRE 1.6.0_07
// Commons Lang 2.4
// 使用中のJVMのバージョンを判定する
// org.apache.commons.lang.SystemUtils
// system

// バージョンを取得する
System.out.println( SystemUtils.JAVA_VERSION ); //=> 1.6.0_07

// JavaDoc
// http://commons.apache.org/lang/api-release/org/apache/commons/lang/SystemUtils.html#JAVA_VERSION


// まぁ、バージョン取るだけならこれで良いのですが
System.out.println( System.getProperty("java.version") ); //=> 1.6.0_07 


// いきなりFloatやintで取れたりもします
float fVersion = SystemUtils.JAVA_VERSION_FLOAT; //=> 1.6
int iVersion = SystemUtils.JAVA_VERSION_INT; //=> 160


// バージョン判定をするメソッドもいます
if( SystemUtils.IS_JAVA_1_6 ) {
    System.out.println( "1.6の処理" );
}
else if ( SystemUtils.IS_JAVA_1_5 ) {
    System.out.println( "1.5の処理" );
}

// JavaDoc
// http://commons.apache.org/lang/api-release/org/apache/commons/lang/SystemUtils.html#IS_JAVA_1_4

2009年06月27日

【1日1Java】簡易スケジューラ(5秒置きに処理実行)

import java.util.Date;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;

public class Test {

    public static void main(String[] args) throws Exception {
        // JRE 1.6.0_07
        // java.util.Timer
        // java.util.TimerTask
        // 定期的(本例では5秒ごと)に処理を実行する

        Timer timer = new Timer( "hoge" );

        // 3秒後に1度目のタスクを実行し、その後は5秒置きに実行する
        timer.scheduleAtFixedRate(new TestTimerTask(), 3 * 1000, 5 * 1000);
        
        // 30秒待って、処理を終了する
        Thread.sleep(10 * 3000);
        timer.cancel();
        
        // JavaDoc
        // http://java.sun.com/javase/ja/6/docs/ja/api/
        // 上記のような「固定頻度実行」だけでなく、処理終了後から指定秒後に再度
        // 処理を実行するような「固定遅延実行」も可能
        
        
        // 指定したname(hoge)はそのままスレッドの名前として設定される
        // こんな阿呆な消し方も可能と言えば可能(Thread.stopはduplicated)
        // Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces();
        // for( Thread thread : map.keySet() ) {
        //     if( "hoge".equals( thread.getName() ) ) {
        //         thread.stop();
        //     }
        // }
    }
}

class TestTimerTask extends TimerTask {
    public void run() {
        System.out.println(new Date());
    }
}

【1日1Rails】月の末日を取得する

Ruby 1.8.7
Rails 2.3.2

# end_of_monthで取れる
Date.today.end_of_month #=> Tue 30 Jun 2009

# Timeだと末日の最終秒が取れる
Time.now.end_of_month #=> Tue Jun 30 23:59:59 +0900 2009

# Rubyの標準関数のみでやろうとすると、こんな感じ
Date.new( Date.today.year, Date.today.month, -1 ) #=> Tue 30 Jun 2009

Fedora11になったらgemが動かなくなった

自動アップデートでFedora11にしたらgemやらrailsコマンドが動かなくなった。md5.soでのLoadErrorとか。見た感じ、openssl関連のモジュールへのリンクが切れてる様子。ありがち。

他にもいろいろ切れてそうな気がしたので、Rubyをソースからインストールし直して対応。

Eclipseのソースの落とし方

Eclipseのソースの色変えのロジックが見たくて、ソース自体を落としてくる。


落とし方はここ
http://wiki.eclipse.org/CVS_Howto


主な設定
Host : dev.eclipse.org
Path : /cvsroot/eclipse
User : anonymous
Password: 空白
Connection Type : pserver


パスはいろいろあるので、この辺から欲しいものを適当に
http://wiki.eclipse.org/CVS_Howto#CVS_Repository_Paths


【1日1Rails】SQLを直接実行する

# Railsで直接SQLを発行する
# エンコード指定を打ちたい時、
# ActiveRecordの実行速度がボトルネックになる時などに使用
 
# SELECTも実行できる
rs = ActiveRecord::Base.connection.execute( "select * from hoge" )
rs.each { | item |
  puts item[0]
}

【1日1Commons】null、空白判定

// JRE 1.6.0_07
// Commons Lang 2.4
// Nullか空文字を判定する
// org.apache.commons.lang.StringUtils
// tag 文字列,空白

// method
// StringUtils.isEmpty( String )
// 引数がnullか空文字ならtrueを返す

// method
// StringUtils.isBlank( string )
// 引数がnullか空文字,もしくは空白文字のみであればtureを返す

// isEmpty → null => true
StringUtils.isEmpty( null );
// isEmpty → 空文字 => true
StringUtils.isEmpty( "" );
// isEmpty → 半角スペース => false
StringUtils.isEmpty( " " );
// isEmpty → abc => false
StringUtils.isEmpty( "abc" );

// isBlank → null => true
StringUtils.isBlank( null );
// isBlank → 空文字 => true
StringUtils.isBlank( "" );
// isBlank → 半角スペース => true
StringUtils.isBlank( " " );
// isBlank → タブ => true
StringUtils.isBlank( "\t" );
// isBlank → 改行 => true
StringUtils.isBlank( "\r\n");
// isBlank → 全角スペース  => true
StringUtils.isBlank( " " );
// isBlank → abc => false
StringUtils.isBlank( "abc" );

// 全角スペースもtrueになるらしい(知らなかった)
// 内部的にはCharacter.isWhitespaceを使用して空白判定している

// isWhitespace
// http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Character.html#isWhitespace(int) 

気が付いたらFedora11になっていた

家に帰ってFedoraを立ち上げたら、何やらUPDATEしろとかいう文字がでてきた。何も考えずに「オッケー」と軽いノリで答えたら、「Fedora11のアップデート始めるよ」とか出ていた。

なんだこりゃ、最近のFedoraはバージョン上がった時も自動アップデートなのか。しかもまだリリースされて1ヶ月も経ってない代物を。

さすがチャレンジャー用ディストリビューションだなと思いながら、とりあえずそういう風土なら仕方ないということで、そのままアップデート。風呂に入って帰ってくると、Fedora11になっていた……

Fedora11の主な変更箇所を調べたら、ext4がデフォルトになったと書いてあった。でも、アップデートの場合は当然、前の形式が引き継がれるようで、我が家では引き続きext3。

あとはXとGNOMEのバージョンが上がったとか。詳しくはこの辺。
http://sourceforge.jp/magazine/09/06/18/0413208


軽く動かしてみたけど、10の時の設定はしっかり引き継がれているようだし、普段は端末から操作していたので何かが変わったという感触はないなぁ、と思っていたらネットワークに繋がってないことに気づく。

「ifconfig」したら「192.168.1.1」という答えが返ってきた。そりゃ、無理だ。前は固定IPにしていたはずだけど、その辺の情報が受け継がれなかったのだろうか。とりあえずIPの設定し直して(システム→管理→ネットワークからやってみた)、「/etc/init.d/network restart」で一見落着。

しかしこの動きだと、いつの間にかアップデートして、いつの間にか192.168.1.1が被って家中のマシンが繋がらないとか起こりそう。まぁ、Fedora使ってる人ならすぐ解決できるか。

あ、あと壁紙がちょっと深みのある色になってた。

2009年06月26日

【1日1Java】Javaの文字列比較

// JRE 1.6.0_07
// Javaの文字列比較
// java.lang.String
// tag 文字列,比較

// 文字列を比較する
String hoge1 = new String("HOGE");
String hoge2 = new String("HOGE");

// == ではfalseになる場合がある
boolean bool = ( hoge1 == hoge2 ); //=> false

// 特に理由がなければ、equalsを使用する
hoge1.equals( hoge2 ); //=> true

// == で trueになる場合がある理由は、== がObjectを比較し、
// equalsが文字列を比較しているから。
// Objectの比較でtrueになるとは、同じものを参照しているということ

// == でfalseにならない例
String fuga1 = "FUGA";
String fuga2 = "FUGA";
String fuga3 = "FUG";
fuga3 += "A";

// 初期化時に値を入れた場合、Javaは容量の節約の為、
// ヒープ領域に入れられた1つの"FUGA"という文字列を、共有して参照する
bool = ( fuga1 == fuga2 ); //=> true

// fuga3のように演算を噛ませると、別の領域にFUGAを確保するので、
// ==比較はfalseになる
bool = ( fuga2 == fuga3 ); //=> false
fuga2.equals( fuga3 ); //=> true 

10万PV計画

どうも連載が終了になるらしい。副業もほとんどやめてしまったので、今はけっこう時間がある。

その時間を利用して、「mwsoft.jp」(blog, www合計)のPVを10万まで引き上げようと思う。10万PVのサイトを持ってれば、後々、別の仕事とかに繋げれそうな気がするので。

現在は1日2000PVくらい。先は長い。


- ルール
  - IT系で攻める(IT系であればネタ記事は可)
  - ITと関連のない時事ネタは禁止
  - 2ch系、ニコ動系は控える
  - 清純派にそぐわない記事は禁止(アダルト等)
  - 日記については例外的にIT系以外を扱う
  - 文学については例外として扱うかもしれない


以下、計画書

2009年06月25日

WEB系ツール/デザインリンク集

プログラマのためのテキストエディタ18選
http://journal.mycom.co.jp/news/2009/06/24/030/index.html


Free xhtml/css templates
http://www.templateworld.com/free_templates.html


Firefox3.5の使えそうな機能
http://www.lifehacker.jp/2009/06/090624firefox_35top_10.html


Webデベロッパ/デザイナのためのOSSツール18選
http://journal.mycom.co.jp/news/2009/02/23/047/index.html


Webアプリ開発に使えるブラウザエクステンション15選
http://journal.mycom.co.jp/news/2008/11/21/006/index.html


Webサイトデザイン・アプリケーション開発向けアイコンパック 8選
http://journal.mycom.co.jp/news/2008/08/01/030/index.html


死にかけのITスキル10選
http://slashdot.jp/developers/article.pl?sid=09/05/22/0231254


スタンダードな画面パターン集
http://designingwebinterfaces.com/designing-web-interfaces-12-screen-patterns


tlbox - Web Design Tools
http://www.tlbox.com/web_designers/


無料で使えるCSSグラフ9選『10 Free CSS Graph Resources』
http://blog.creamu.com/mt/2007/05/css910_free_css_graph_resource.html


プログラミング向けフォント32選
http://kenz0.s201.xrea.com/weblog/2008/10/post_144.html


光をうまく使ったサイトデザイン25選
http://vandelaydesign.com/blog/galleries/light-effects/

日記的なもの(2009/06/24)

仕事がおもろい。しかし熱中すると疲労が濃くなる。少し疲れが出てきたので、今日は帰宅後、1時間ほどカミュの「転落」を後ろのページから読むという妙な試みをして、だらりとする。chute = chute.reverse。

「ご存じのように、たとえどんな利口な人たちだって、隣の人間より酒を一本余計に飲めることを誇りに思うんですからね」

最近、作中のこの言葉をよく思い浮かべます。そんな風に思うことは好きじゃないのに、気が付くと傲慢な思考がちらほらとよぎる。まったく、不便なものだ。人間というヤツは。

「でもご安心を。今ではもう遅すぎるんです。いつだって遅すぎるでしょう。ありがたいことにね」

以下、普通の日記

2009年06月23日

プログラマをピクッとさせる10の発言

オタクをピクっとさせる10の発言
http://news.livedoor.com/article/detail/4205853/

この記事になんとなく触発されて、これまで自分がピクッとなった言葉を適当に並べてみた。


10. Python? 聞いたことない言語だね

前にどっかで面談した時に言われた言葉です。
「そうですよねー。マイナーですから」と話を合わせた自分は社会人としては合格。
でも、殉教者としては失格。ごめんなさい。


9. 松屋より吉野家の方が肉がおいしい

電車で延々と言い合いをしているサラリーマンを見かけたことがあります。
私は具のない味噌汁の話を出されるとより反応します。


8. セガってゲーム機が売れなくて潰れた会社だよね

勘違い系の発言。
これも電車の中で聞いた。正気を保つのが大変なくらい威力があった。


7. 青春18切符で大阪まで行っちゃって、すごい疲れた

話し込んでいたら青函トンネルとか関門トンネルを超えた(2日かけて)強者が現れて思い出話が始まった。
あと5枚綴り時代の話も出た。


6. 初心者ですが質問です

調べごとをしているとあまりにもよく目にする。
見るたびにちょっとピクッとして、そのまま見なかったことにする。


5. 一番優れたディストリビューションはUbuntuです

「異論をどうぞ」と言っているような発言ですね。
より注目を集めたい時は「Vineが一番です」と言うのも良いかもしれない。


4. X Windowsは今ひとつ好きになれなくて

どこをつっこんでいいのか分からないので、もだえながらスルーする系の発言かと。


3. Cなんていまどき使ってる人いるんですか?

前に自分の後輩がした発言。
とりあえず飯に連れて行って穏やかに懇々と「お話」をしておいた。


2. Mac購入者はAppleロゴに500ドル払っている

私が言ったんじゃないですよ。
スティーブ・バルマーが言ったんです。


1. 地方自治体のサーバーにハッカーが進入し改ざん

だからそれはクラッカーだと何度(ry

2009年06月21日

Firefox3.5 RC2 来ました

Firefox3.5のRC2が来たようです。

http://www.itmedia.co.jp/enterprise/articles/0906/21/news002.html

正式版は早ければ今月中とか。ただ、まだ未対応のアドオンもあると思うので、しばらく生贄機にだけ入れて動いているか確認しつつ、よき時に実用機に入れようかと。とりあえずLiveHttpHeaderとFirebugを入れてみたところ、我が家ではちゃんと動いている風でした。

しかしアドオン作者も大変ですよね。まぁ、1年に1回のメジャーバージョンアップなら、余程の変更がされなければなんとかなると言えばなんとかなりそうですが。1人で保守してる人とか、凄いと思います。

定番のAcid3を通してみたところ、結果は93点。3.0よりも20点ほど上昇。HTML5への対応も進んでるらしい。FirefoxとSafariで使える機能なら、PCユーザの30%程度がカバーできるってことなので、それなりに使っても良いかなという気持ちになるかも。


追加された機能の情報
https://developer.mozilla.org/Ja/Firefox_3.5_for_developers

日本語だと情報少ないので、足りない人はこちら
https://developer.mozilla.org/En/Firefox_3.5_for_developers


個人的に気になった機能はこの辺

・HTTP 向けのクロスサイトアクセスコントロール
サーバ側が許可した場合らしいけど、どういうセキュリティポリシーになるんだろう
https://developer.mozilla.org/En/HTTP_access_control
ここを見た感じでは、サーバにこれ入れろとか
Access-Control-Allow-Origin: http://foo.example
こいつ、何者かと思って見たら、一応w3cにいた
http://www.w3.org/TR/access-control/

・DNS プリフェッチの制御
Chromeがやってるヤツ
DNSサーバ大忙し

・HTML の内容への SVG 効果の適用
字面だけ読むと、画面効果がかなりダイナミックにできそうだけど、どうなんだろう
まぁ、IEがアレなんで使うことはないと思いますが

・localStorageのサポート
もう付いてると思ってたけど、違ったんだ
今あるのはsessionStorageだっけ


あと、使いたいと思った機能がこれ
HTML 5 の audio および video 要素をサポート
https://developer.mozilla.org/Ja/Using_audio_and_video_in_Firefox

Safariも対応済み。
現状はOggとWAVがサポートされてるとか。
これでよりドラクエなスクリプトが組めそう。


Safari4の時より説明に熱が入っているのは私の仕様。悪いことだとは思っている。反省はしていない。

ところで、Firefox3.5入れた時に最初に出る画像って、コンボイ?

JavaScriptであみだくじ

というわけで、休日潰してJavascriptであみだくじを作った。これを灰色の人生と呼ぶか、バラ色の人生と呼ぶかは、私には分からない。

http://www.mwsoft.jp/programming/webtools/random_chooser_amida.html
Firefox3, IE8, IE8互換モード, Chrome1で動作確認。


数字を選択すると、赤い線が伸びながらあみだをたどっていくようにした。この時、下や右に線を伸ばすのはEffect.Scale(対象のエレメントを伸長する)で実現できたのだが、左側に伸ばす設定が見当たらなかった。

探せばあるような気がしたけど、Effect.Scaleの中身見てたら、現在の場所を中心として上下左右に伸長する機能があったので、その辺を少し拡張して左上に向けて伸長する機能も追加してみた。

イメージ的にはこんな感じ。optionsにscaleFromRightBottom:trueを設定すると、左上に伸びるようになる。いろいろいじってたので記憶が薄いけど、たぶん1/2してる以外センターと同じ。

var ExEffect = Class.create();
Effect.ExScale = Class.create(Effect.Scale, {
  setDimensions: function(height, width) {
    //中略
    else if (this.options.scaleFromRightBottom) {
      var topd  = (height - this.dims[0]);
      var leftd = (width  - this.dims[1]);
      if (this.elementPositioning == 'absolute') {
        if (this.options.scaleY) d.top = this.originalTop-topd + 'px';
        if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
      } else {
        if (this.options.scaleY) d.top = -topd + 'px';
        if (this.options.scaleX) d.left = -leftd + 'px';
      }
    }
    //後略

2009年06月20日

offsetTopとoffsetLeftのズレ

今日は完全1日オフなので、休みの日らしくJavascriptであみだくじ作ろうと思ったんですよ。

で、あみだくじを描画する場所の指定に、Javascriptの「offsetTop」と「offsetLeft」を使おうと思ったんです。

この2つは指定エレメントの座標を取ってくれる子です。

で、いつものごとくFirefox with Firebugを使って線を引く記述をしてみたんですが、これをIEで見るとどうもズレる。ChromeでもSafariでもちゃんと表示できたので「またIEか」と思ってたんですが、調べてみると「offsetTop」と「offsetLeft」はブラウザによって挙動にけっこうブレがあるようで。


サンプルコード
http://mwsoft.jp/sandbox/js/random_chooser_amida.html
IEで見ると描画位置がズレます。でも、たまに描画に成功することも。ヘッダ部分にJavascript使ってるせいかなと思いつつ。


とりあえず使わない方向で撤退することに。

NetBeansの「ウィンドウをリセット」機能を考える

最近、NetBeansを使っています。Linux版を使用しているのですが(鳥はFedora10)、今ひとつ安定していません。たまにキー入力が効かなくなったり、タブの切り替えがスムーズにできなくなったりします。

でも、それほどストレスを感じずに使えています。その要因の1つが、表題の「ウィンドウをリセット」機能。ウィンドウをいったん落として、立ち上げ直してくれます。必要なモジュールはロードしっぱなしのようで、一瞬で立ち上がってくれます。これを実行すると、たいていの動作不良は解消されます。

前にFirefoxもけっこう落ちるけど、それほどストレスは感じていないという話を書いた気がしますが、すぐに復旧する(寸断のみ)のであれば、バグっていてもストレスは少ないのだなぁと思いました。


ソフトウェアを作る上でバグはどうしても発生してしまうものですが、例えそれで何か問題が発生したとしても、ストレスに感じない程度の寸断に収めること。その意識の違いによって、同じ量のバグでも大きく評価が分かれるのではないかと、そんなことを思いました。

2009年06月19日

テキストエリアの中からランダムで値を選ぶ

最近、自サイトの手入れがイマイチ行き届いてなかったので、申し訳程度にスクリプトを1つ追加。

幹事決め、おみくじなどに使えるJavaScript
http://www.mwsoft.jp/programming/webtools/random_chooser.html

とても簡易なものだけど、たまに使いたい時があるかもしれない。「これ、誰がやる?」という話が出た時に、恨みっこなしで選べる。あっさりし過ぎてるので、3回勝負機能くらい付けた方がいいかな。



ところでこのスクリプトを書いている時に、JavaScriptの正規表現で

^\s+$

というのを書いた。空白・タブ・改行のみのエントリーを省く為に。ところが、IEでこれを実行すると%0D(CR)のみの行が引っかからなかった。そういうものなんだろうか。寝ぼけているので気のせいかもしれない。週末に確認しておこう。

2009年06月17日

プログラマのクラスチェンジ表(草稿)

いろんな種類が存在するプログラマの呼称を利用して、RPGゲーム的なクラスチェンジ表を作ってみようと思った。とりあえず説明文だけ。現実よりもイメージを優先させてしまったので、正確さには欠ける気がする。

・コーダー
プログラムを学び始めた人が最初になる職業。
クラスチェンジの条件はコードの読み書きができること。
英語で例えるとTOEIC500〜600点くらい。
RPGゲームで言えばレベル1〜5くらい。
簡単な記述を羅列することはできるが、難易度の高い言い回しやレアな処理は理解できない。
参照渡しと値渡しの差が分からなかったり、closeを書く意味を知らなかったりすることから、被害をもたらす記述を創造することもしばしばある。

・コピペプログラマ
WEBから情報を収集する技を身につけたコーダーのこと。
順調に学習していれば、コーダーを3ヶ月〜半年ほど続けているうちに自然とこの職業にクラスチェンジできるようになる。
Google検索から望みのコードを発掘して、コピペでソースファイルを埋め尽くすこと(通称、スクラップブックコーディング - 筆者命名)によって様々な難易度の高い処理を実現することができる。
張り付けているソースを100%理解した上で使用している人はコピペプログラマとは呼ばない。
なんとなく張り付けてなんとなく動いたというやっつけ仕事をする人を指す。

・プログラマ
コードの読み書きがつつがなくできる人。
TOEICで言えば800点くらい。日常会話に困ることはなく、専門用語にもある程度の知見があるレベル。
RPGゲームで言えばレベル20くらい。中級の魔法とかも使える。
プログラマはレベルが上がると、マネージャー、コンサルタント、営業などにクラスチェンジできる。
将来、どのクラスにチェンジするか早めに決めて準備しておかないと、会社命令による強制クラスチェンジが発生することがあるので注意が必要。

・マニア
1つ以上の技術に対して深く掘り下げている人。
好きな技術の話をすると笑顔になる人。
言語の歴史にやたら詳しい人。
「今週末、コードゴルフで勝負しない?」と声をかけた時に「オッケー」と気軽に乗ってくるような人。
などなど、ディープな要素を1つでも持っているプログラマを指す。
マニアになっても給与的に得をすることはないが、仕事は楽しくなるかもしれない。
筆者はおそらくこのクラスに所属する。

・アーキテクト
高い技術力を持つプログラマを高い値段で売る為に創設された比較的新しい職業。
案件に応じて適切なフレームワークや開発環境を選定できたり、ミドルウェアに近い部分を触っていたりするとアーキテクトっぽいかもしれない。
英会話の能力で例えると、ただ日常会話ができるだけでなく、韻を踏んだり、どこかの大統領とまではいかないがそれなりに人の心に届くスピーチができるレベル。

・スーパープログラマ
別次元のコードを書く人。
3倍速でコードを書きあげる人。
300倍速で動作するコードが書ける人。
難しい仕事を頼んでも顔色ひとつ変えずに引き受けて、予想より早いタイミングで「できたよ」と言ってくれる人。
RPGゲームで例えるとレベル70以上。ラスボスも余裕で倒せる。

・クラッカー
ダークサイドに落ちたプログラマが手を染める職業。
プログラムに対する知見を、情報の盗聴や破壊などに使用する人。
ニュースではハッカー(誤用)と呼ばれている人。
RPGゲームで例えると、PKでアイテム収集してたりボットで稼いでいる人。
クラッカーは非常に奥が深い職業だが、常に門戸は開かれていて、クラスチェンジ条件は緩い。コピペプログラマクラスの能力でもクラスチェンジ可能。但しリスクは高い。

・ハッカー
ハックするのが好きな人。
ハッカーが開発現場に出没するとスーパープログラマと呼ばれることが多い。
プログラミング言語やソフトウェアをただ使うだけでなく、その中身まで十分理解し、時には中身を自前で書き換えてしまう人。
RPGゲームで例えると、ダメージの計算式や乱数の生成ルールなどを踏まえてプレイするような人。

・ギーク
マニアよりも深く広い知見を持つ上級クラス。
RPGゲームに例えるとマザーのラスボスくらいの強さ。この人たちの得意領域に足を踏み込んでしまうとけして勝てないので、戦う際は祈るなどの手順を踏む必要がある。
ギークにクラスチェンジするには、食事を宅配のピザとコーラで済ませ、寝ている時間以外はすべて自分が愛するものに注力するという生活を、数年間続けなければならない。
端から見ると修行僧のような生き方に見えるかもしれないが、本人たちは好きでやっているだけで修行などしているつもりは毛頭ない。

・ウィザード
ハッカーの上級クラス。
全世界に推定1024人しか存在しないスゴい人たち。(数字は筆者妄想)
名前の通り魔法のようなことができてしまう。
例えば一般的なプログラマが「ファイルシステム的にこの処理速度が限界だ」という状況に出くわすと「それは仕方ないね」という結論にたどり着くが、魔法使いは「ファイルシステム書き直しといた」という答えを持ってきたりする。
RPGゲームに例えると、「がた」くらいの強さ。分かりづらい例ですまない。
開発現場で拝めるレベルの人たちではないが、メーリングリストや講演などで接触することができる。


以上、クラスチェンジ表に使う文章の草稿でした。途中からRPGの例がマニアックになってしまった気がするけど、まぁ、いいか。

ふたつ名を持つことにする

前にコンサル関係のセミナーで、「名刺交換をする際に一番インパクトを残せる人になれば、仕事を得るチャンスは数段増える」という話を聞いた。「一番」である。2番手以降では意味がない。相手がSEを必要とした時に、一番最初に名前を思いついてもらえなければ連絡は来ないのだから。

それを聞いてからずっと、名刺に載せる言葉とか、一言で相手にインパクトを残すキャッチフレーズとかを考えてきた。いくつか思いついたものを使ってみたこともあるけど、いまいち食いつきが良くなかった。

そこで考えた。インパクトのあるふたつ名を持つことにしよう。ここのところ後戻りできないくらい前に押し出している、あの言葉を使って。


「プログラマ界随一の清純派・MW」


あー、なんかホント後戻り出来てない感じ。初回がコケたドラマを必死に番宣しているような辛さを感じる。

とりあえずこれを名刺に入れて、渡す時にこう言おう。私のことを話題に出す時は「あの清純派の人」と呼んでください。Please call me Man of the Seijunha.

成否のほどは置いておいて、今よりもインパクトは残せるだろう。どうせ無難にやっていても名刺交換から仕事に繋げるなんて出来ないのだから、確率の低い場所に行った時は冒険してみても良いと思う。

2009年06月16日

川端康成「雪国」

営業に連れられてゲートを抜けると修羅場であった。プログラマの前途が暗くなった。入り口のそばで足が止まった。

向かい側の座席からSEが立って来て、部長席の前の受話器を取った。顧客の怒声が流れ込んだ。SEは手をいっぱいに広げて、遠くへ叫ぶように、
「仕様なんです、仕様なんです」

IDカードをさげてゆっくり入館して来た男はiPodで耳の穴をふさぎ、目に大きなクマを作っていた。

もうそんな状況かとプログラマは開発現場を眺めると、人が寝ていたらしい毛布が床に寒々と散らばっているだけで、彼の心はそこまで行かぬうちに闇に呑まれていた。

「お客さん、仕様です。議事録にもそうあります」
「ああ、話にならんじゃないか。部長はいるかい。また作り直しだよ」

2009年06月15日

枕草子

春は設計
まったく白紙のままの、要求は少しも決まらないで、裁断された議事録の細くたなびきたる。

夏は実装
定時過ぎはさらなり。終電もなほ、プログラマの多く乗り逃したる。
またただ1人2人など、(力尽きて)儚く椅子に突っ伏して寝るもをかし。徹夜するもをかし。

秋は試験
夕日のさす頃にようやく仕事をする気持ちになりたるに、(定時までに)お客様のところへ確認へ行くとて、3人4人、2人3人など慌てて飛び出していく様などあはれなり。
まいて重役などの連ねたるが、肩を落として客先へ謝罪に行くのもいとをかし。
日入り果てて、(会議室から聞こえる)怒声、罵声などはまたいふべきにもあらず。

冬は運用
システムの落ちたるはいふべきにあらず。データの不整合も、またさらでも、不審な動作にログなどを急ぎ開いて、追いかけて回るもいとつきづきし。
昼になりて、障害票を持ていけば、上司の顔色が白く灰がちになりてわろし。

日記的なもの(2009/06/13-14)

06/13

原稿の締め切りがあるので、ポメラに書いておいたネタを引っ張りだして正しさを検証。たまに正しいと思い込んでいた情報が嘘だったりするから怖い。YAMLのことをずっと「Yet Another Markup Language」だと思っていた。正解は「YAML Ain't a Markup Language」。まぁ、確かにマークアップ言語ではないか。

知り合いと映画を見に行く。なんて人間らしい休日の行動なんだろうと、心の中で1人感動する。観たのは天使と悪魔。原作を読んだことがあって、あの分厚い内容をどう映画内に収めるかを注目してみたのだけど、残念ながらダイジェスト的になってしまったようだ。以下、普通の日記

2009年06月14日

プログラムをしている時の呼吸

さっき、月例の現実逃避としてプログラムを書いていて気づいたのですが、調子に乗って一連の動作とかを記述している時、自分は呼吸を止めているような気がしました。

フレーズに悩みながら原稿を書いている時も止めてるかもしれません。気づくと少し息苦しさを覚えながら大きく息を吐いて吸い直している自分がいます。

どの程度止めてるのかは不明。大丈夫なのかな、呼吸しなくても。


さて、変なこと書いてないで原稿書かないと。現在、進捗70%。このままだと睡眠時間がヤバイことに……

2009年06月12日

日記的なもの(2009/06/11)

今日も真面目に働く。かなり真面目に働いている。労働時間は短い方だけど、そのわりに疲労が濃い。それは楽しいからだと思う。

風呂場でチームアメリカ(サウスパークの人が作った映画)を見る。人形に声優が声を当てているヤツなので聞き取り易い。ついでに馬鹿馬鹿しすぎて癒される。


以下、普通の日記

2009年06月11日

6月の風物詩、住民税

6月も中旬に入り、喉に刺さった骨のようにいつも心にいたあの子のお知らせがやって参りました。住民税。

フリーでやっていると、3月に確定申告をして所得税(一部前払い)を払った後、6月に住民税のお知らせが来ます。この住民税がやたら高い。うちの地方では所得税の倍とまではいきませんがそれに近い金額になっています。

4分割で支払えるのでいきなり滞納ということにはなりませんが、計画的に貯蓄しておかないと心が凍ることになります。あー、凍った、凍った。骨まで凍った。

Yahooラボ

こんなものが出来たらしい。Yahoo Japanのラボ。
http://labs.yahoo.co.jp/

サーチのなかみ(地域別)というのが面白かった。
http://labs.yahoo.co.jp/detail/?pid=13

各検索ワードがどこの都道府県から発信されたかの分布が見れる。

浦和レッズ
埼玉 : 23.6%
栃木 : 5.9%
岩手 : 5.5%
http://search.yahoo-labs.jp/nakami/ipgeo?q=%E6%B5%A6%E5%92%8C%E3%83%AC%E3%83%83%E3%82%BA&term=d&type=s
さすがだよ、レッズサポ。

阪神タイガース
兵庫 : 7.0%
奈良 : 6.7%
大阪 : 6.4%
http://search.yahoo-labs.jp/nakami/ipgeo?q=%E9%98%AA%E7%A5%9E%E3%82%BF%E3%82%A4%E3%82%AC%E3%83%BC%E3%82%B9&term=d&type=s
大阪集中じゃなく、関西全体で満遍なくという感じのようだ。

Linuxの検索
鳥取 : 5.4%
滋賀 : 5.1%
岩手 : 4.5%
http://search.yahoo-labs.jp/nakami/ipgeo?q=Linux&term=d&type=s
直近1日のデータなので、これくらいの揺れは起こるものらしい。直近1ヶ月に設定すると全都道府県同じくらいになる。


検索サイトっていろんなデータを持っているから面白いなぁと思いました。Yahooが持っている情報量って羨ましいよなぁ、と。

2009年06月10日

Safari4リリース

Safariの4がリリースされたようです。さっそく入れてみましたが、Apple的な雰囲気がより拡張されていた感があり、きっと美しいのだと思うのだけど、私のような心が貧しい人間には戸惑いを覚える動きでした。良いとは思うんです。私の心が貧しいのがダメなんです。

レンダリング、JavaScriptエンジン共に速度が上がり、Acid3も100点になったそうです。最新のChromeも実行すると100点と表示されるけど、同時に「LINKTEST FAILED」と表示されてしまう。Safari4はそれが表示されることもないです。

Operaはもうクリアしたんでしたっけ。Firefoxはいまだに70点ちょいです。Shiretoko(現在、β4)を待てという感じですね。IE8は……まぁ、アレだ。別にAcid3なんてテストの1観点でしかなく、別に70点だって12点だって変わりなしと、まぁ、そんな風に思っているさ。


実際に使ってみると、Chromeと比べても遜色ないと思える速度。まぁ、この速度まで来ると4倍とか言われてもあまり変わりは体感できないわけですが。

HTML5のサポートも進んだらしいですが、あまり調べてません。IEはちゃんと追ってくれるかなぁということが気になります。この子が追わなければ仕事では使えないからなぁ。

2009年06月09日

Yahooデベロッパが便利だった

Yahooデベロッパ(http://developer.yahoo.co.jp/webapi/search/)がけっこう使えたので、使える具合が伝わるような紹介。

機能は通常の検索や動画検索、オークション検索の他に、形態素解析、キーフレーズ抽出、関連語検索、ルビ振り、校正支援などの言葉関連のものがけっこうある。

とりあえず、フォームから呼べるようなものを用意してみた。


関連語検索
http://www.mwsoft.jp/sandbox/yahoo/related_words.html
入力したキーワードに関連の深い言葉をいろいろ提示してくれます。「眠い」って入れたら「パトラッシュ」を提示してくれました。

校正支援
http://www.mwsoft.jp/sandbox/yahoo/text_check.html
入力チェックツールです。平仮名部分はわざと間違って書いてもあまり指摘してくれない気がするけど、なかなか面白い結果が返ってくる。

ルビ振り
http://www.mwsoft.jp/sandbox/yahoo/set_ruby.html
読みのサービスは割と少ない気がしたので使えるかも。

2009年06月08日

欲しいものリスト

働く気力を湧かせる為に欲しいものを並べてみる。物欲は薄い方だからあんまり高まらないけど。


1. 消費電力が低くて音が小さいマシン
常時起動クローラー用。Atomなネットブックで良いか。CUIだけで動かす予定。

2. Androidの乗ったネットブック
Acerが秋頃に出すとか言ってたので、それの評判を聞きながらボチボチ。

3. スペックの良いLinux開発マシン
これは値が張りそうなので(8万くらい?)メインで使ってるWindows機をLinuxに入れ替えた方が現実的かも。OEMのWindowsXP Proを乗っけちゃった子をLinuxにするというのも、趣深い。とりあえずSUSE入れてみようかな。

4. 教育用DVD。
入浴学習の為。AmazonでDVD+教育で調べたら子供用かアダルトなのばっか引っかかった。教育実習生という言葉がアダルティらしい。清純派で検索かけてもいかがわしいのばっかでるし、どうなってるんだこの世の中は。清純派なめんな。学習で検索したらいくらかそれっぽいものが出てきたけど、善し悪しが分からない。下調べはちゃんとしないといけなそう。

5. ハゲタカのDVD-BOX
娯楽品。好きだったのに最終話見逃したままなので。そういえば、ユニゾンとスティールのニュースは見ていて割と震えました。

6. Kindle
やっぱり欲しいなぁと。日本でも流行してコンテンツがもう少し充実してくれたりはしないだろうか。

7. Googleのアレ
まぁ、いつか気が向いたら。


という風に書いてみると、自分が欲しいものはコンテンツそのものか、コンテンツを利用する機器に集中していることが分かった。世の中の傾向もそっちに向かっているのだろうか。

Ruby + Mysql5.1 = ハマる

SQLiteにも飽きてきたのでMySQLに立ち返ろうと思い、MySql5.1でRailsを動かそうとする。で、ハマった末に以下のような記事に辿り着く。


Windows に Ruby on Rails 2.2 + MySQL 5.x 環境を構築する手順とハマり所
http://d.hatena.ne.jp/seiunsky/20081228/1230485404


5.1はハマりやすいらしい。というか、Windows版は全体的に不安定な気がする。とりあえず面倒になったので、SQLiteにリターン。


ついでにWindowsでSQLite使うときにgemで怒られる件もここに書いておこう。

gem install sqlite3-ruby
とやると、「'nmake' は、内部コマンドまたは外部コマンド……」みたいなエラーが出る。
gem install sqlite3-ruby --version '= 1.2.3'
とすると良いらしい。


参考
http://d.hatena.ne.jp/GARAPON/20081022/1224657975

日記的なもの(2009/06/06-07)

06/06

朝起きる。今日は経理の手伝いをしてくれている人が来る予定。少し早く目が覚めてしまったので、プログラムを書きながら待つ。Rubyのオブジェクト指向に対するアプローチは分かり易くて好きだと思う。

経理の人が来る。働いている後ろで、風呂掃除をしたり、棚を拭いたり。お陰で綺麗になった。


以下、普通の日記

2009年06月06日

Rubyの定数の動きを確認する

Rubyの定数の動きを把握していなかったので確認をする。

クラス内で宣言された場合はそのクラス内がスコープになり、クラスの外で宣言された場合はObjectクラスの定数になる。

# クラスの外で宣言
HOGE = "uga"

# クラス内で定数を宣言
class Test1
  HOGE = "hoge"
  def initialize
    p HOGE #=> hoge
  end
end

# 継承した場合、定数もちゃんと継承される
class Test2 < Test1
  def initialize
    super  #=> hoge
    p HOGE #=> hoge
  end
end

# 継承して同名の定数を宣言した場合は、上書きされる
# superした場合は継承元を見る
class Test3 < Test1
  HOGE = "fuga"
  def initialize
    super  #=> hoge
    p HOGE #=> fuga
  end
end

# 定数を宣言してない場合は、Objectの定数を見る
class Test4
  def initialize
    p HOGE #=> uga
  end
end


真性オブジェクト指向言語を名乗る(?)だけあって、非常にイメージしやすい動き。こういうところは好きです。

2009年06月04日

パソコンがフリーズするコードを書いてもうた

NetBeansさんと戯れたくて久々にWindows機でRuby書いていたら、途中でPCがフリーズした。どうやら以前から何度か遭遇してきたRubyとウィルスセキュリティの仲の悪さが原因のようだ。ウィルスセキュリティを切ったらフリーズしなくなった。

具体的には、open-uriとウィルスセキュリティががっちんこして、ついでにそのコードが記述ミス等でエラーになると(シンタックス的には通ってURLへのリクエストもしたけど、その結果を不明なメソッドに渡したみたいな)起こるんじゃないかと思った。電プチ必須なフリーズなので、あまり何度も検証したわけじゃないけど。

ソフトウェア同士仲良くしようぜ、兄弟。その前にエラーになるようなコードを書くなと言われたら何も言えない。


そういえば以前、Javaで誤って再帰的にディレクトリを掘り続けるコードを書いてしまい(本当は6階層くらいまでしか掘らないつもりだったのに、再起止め損ねて数千掘る設定になっていた)、実行したらプツンと音がしてPCが落ちるという現象が発生した。問答無用の電プチプログラムとして売り出そうかと思ったよ。

2009年06月03日

今日もn-gramの結果と戯れる

取得した中から、「っ」や「ー」で始まるものを消したり、nを1増やすと「てにをは」などの助詞っぽいものがくっつくヤツを取り除いて、集まっている文字列の精度を上げてみる。

その程度の猿知恵(猿に謝れ)では1000あるゴミを500に出来る程度。特徴的な言葉を抜きたいなら、やはり形態素解析で連結率見た方が賢明だよなと悟る。Perlのなら何かあるらしいし。

方向性を見失った感があるが、中途半端に終わらせるのもいまいちなので、「お」か「ご」か「漢字」で始まる文字だけ取り出して、それっぽい結果だけ導いてみる。


相変わらずの斜陽からの抽出文字列。ゴミの中に混じって固有の言葉っぽいのが残っている。
shayo_ngram.txt


同様のロジックを当ブログの記事にかけた場合、アルファベットやら記号やらがうまく扱えずだいぶ困る。クローラーで収集した適当なファイルにかけたらもっと酷いことになった。ExtractContentで本文抽出はしたのだけど、どうやら広告が混ざってしまっているらしく、それっぽい文字列が上位を占有してしまった。

形態素解析をした場合でも、除き損ねた広告文字列は邪魔をしそう。本文と同じブロックに広告がいると弾き辛い。とりあえずAタグの中は全部カットするとして、リンクの下に説明文とか入れられたら厳しい。広告判定プログラム作らないと。

とかなんとかやっていたら、もう2時過ぎ。最近、こういった微妙なプログラムにハマっているので睡眠不足。睡眠を削ってでもやりたいと思えることがあるのは、精神的には健康なことだとは思うけど。

2009年06月02日

Ruby on Railsで前方一致検索をする際に

Ruby on Railsで前方一致検索をしようと思う。LIKE用のメソッドは用意されていないように見えたので(プラグインがあるという記述を見かけたので、きっとないのだろうという判断)、conditionsをベタっぽく書くことにする。

が、普通にlike 'hoge%'と書くと、こんなエラーが出る。

malformed format string - %

どうやら%は置換用の文字になっているので使ってはいけないらしい。サニタイズのこととかもあるので、「?」使うのがとりあえず正解のように見えた。

Hoge.find(:all, :conditions => ["fuga like ?", "moge%"]

Railsのことはまだまだよく分からない。何度も「もうfind_by_sqlでいいか」と思いつつ、それでは学習しないのでやり方を調べる日々。