はじめてのCodeRepos

CodeReposに申請メール送ってコミッターに入れてもらったときの興奮を書き残しておきます。

前説

最近ブログとかを読んでいると「CodeRepos」という単語を目にすることが多くなりました。個人で持っているソースコードを、みんなで共有しちゃおう!!というプロジェクトのようです。何人もの人が参加していて、大量のプロジェクトやソースコードSVNリポジトリに登録されています。ソースコードをチェックアウトして読んだりするのは誰でもできて、リポジトリにコミットするには、申請メールを送れば中の人(yappoさん)が設定してくれるそうです。
CodeReposのサイトや、参加者のブログとかを見ていると、なんだか楽しそうな雰囲気で「参加してみたい!」と思わせる要素がいっぱいありました。そして、CodeReposにうpすることは怖くないよ というエントリのタイトルだけ見て、おっかなびっくりだけど「申請メールを送ってみよう」という気持ちになりました。
私はしがない場末のプログラマーなので、「俺みたいな名もないタダのおっさんが申請メールなんか出したら、運営の人は困るんじゃないか」とか「変テコなコードをコミットしたら怒られるんじゃないかな」とか、後ろ向きなことを色々と考えてしまい、無駄に緊張してメールの送信ボタンを押すのにかなりの時間を要しました。意味もなく風呂に入ってみたり、机の上を片付けたり。
数日後、yappoさんから「登録完了しました〜」という返信メールが届き、CodeReposのサイトを見ると自分のIDが載っていました。何だかとっても嬉しかったです。

ここから本題

CodeReposのサイトを見ていると、何人かのコミッターさんたちにアイコンが表示されているのに気が付きました。

↑こんなの
私のIDにはついていなかったので、「何か設定が必要なのだろうなぁ」と思いながらも、どうやったらいいのかわからず、その時はすぐに考えるのをやめたのですが、CodeReposサイトのJavaScriptソース(これもCodeReposに登録されている)を読んでいたらわかりました。JavaScriptを使って、はてなプロフィール画像を表示してるんですね。同じように悩んでいる人のためにメモしておきます。

  1. CodeReposからソースコードをチェックアウトする。
  2. /websites/coderepos.org/trac/share/js/TracUtils.js を開く。
  3. 「AUTHOR_ICONS」っていう名前の連想配列に、自分はてなIDを追加する。(キーがCodeReposのID。値がはてなのID。ID持ってない人は画像ファイルのURLでもいいみたい。)
  4. コミットする。コミットメッセージのルールがあるみたいです。私は「websites/coderepos.org/trac/share/js/TracUtils.js: set icon」って書きました。(1つ前の人のコメントをコピーしただけ・・・)

文章で書いてみたけど、わかりにくいですね。要するにこういうことです。「文法エラーでCodeReposのサイトが破壊されたりしたらどうしよう!!」とか「ローカル環境で単体テストしてからの方がいいかな?!」とか、またしても一通りアタフタしてからコミットしました。

数分後に確認したら、無事に表示されてました。うおおおおおすげえええぇぇぇぇーーー!!!!!

まとめ

CodeReposに参加したけど、さしあたってコミットするものがない。」という人は、コミットの練習がてらに、自分のアイコンを設定するのがいいと思いました。なんてゆーか、その、興奮します。

はてなハイク

漫然と書いているだけだけど、ちょっとずつ絵が上手くなってる気がする。

サンプル

始めた頃

最近

学んだこと

太い筆と白で白目、中くらいの筆と黒で黒目を書く。点を打つだけでスライムの目が書ける。簡単。
黒目の位置が1ピクセル違うと全然違う顔になる。
とりあえず何か絵を描けばスターがもらえる。 → スターもらうと嬉しい。 → もっと書きたくなる。 → 振り出しに戻る。の好循環。
絵で字を書くときは注意しないと余白がなくなる。子供の頃にやった習字の授業と一緒。成長していない。

Twitterで背景画像を表示するぐりもん

Twitterで遊んでいると、「背景画像が気になるーーー!!!」っていうページに出会うことがよくあります。そんなとき、ワンタッチで見れたらいいなーっと思って作りました。


↑これが

↑こうなります。

使ってみた様子

残念ながら元には戻すことはできません。F5押してください。

.user.js を上げられるうpろだが見つかりませんでした。残念。下のコードをaaa.user.jsって名前でどこかに保存して、FireFoxにドラッグしてください。欲を言うと誰かコードレビューして下さい。

// Hello World! example user script
// version 0.1 BETA!
// 2005-04-22
// Copyright (c) 2005, Mark Pilgrim
// Released under the GPL license
// http://www.gnu.org/copyleft/gpl.html
//
// --------------------------------------------------------------------
//
// This is a Greasemonkey user script.
//
// To install, you need Greasemonkey: http://greasemonkey.mozdev.org/
// Then restart Firefox and revisit this script.
// Under Tools, there will be a new menu item to "Install User Script".
// Accept the default configuration and install.
//
// To uninstall, go to Tools/Manage User Scripts,
// select "Hello World", and click Uninstall.
//
// --------------------------------------------------------------------
//
// ==UserScript==
// @name Twitter背景表示ぐりもん
// @namespace http://d.hatena.ne.jp/drgqst/
// @description Twitterのページで背景を表示する。
// @include http://twitter.com/*
// ==/UserScript==
(function(){
    const ELEMENT_NODE = 1;
    
    // 「body」要素を取得。
    var body = document.body;
    if( body == undefined )
    {
        return;
    }
    
    var nodes = document.body.childNodes;
    var firstElement = null;
    for( var i=0; i<nodes.length; i++ )
    {
        if( nodes[i].nodeType == ELEMENT_NODE )
        {
            firstElement = nodes[i];
            break;
        }
    }
    
    if( firstElement == undefined )
    {
        alert( 'firstElement is undefined' );
        return;
    }
    
    // リンクを作成
    var link = document.createElement( 'a' );
    link.innerHTML = '背景を表示';
    link.href = 'javascript:void(0);';
    link.addEventListener( "click", invisible, false );
    
    // リンクを配置
    var div = document.createElement( 'div' );
    div.style.textAlign = 'right';
    div.appendChild( link );
    body.insertBefore( div, firstElement );
    
    
    function invisible ()
    {
        var nodes = document.body.childNodes;
        for( var i=0; i<nodes.length; i++ )
        {
            if( nodes[i].nodeType == ELEMENT_NODE )
            {
                nodes[i].style.visibility = 'hidden';
            }
        }
    }
})();

気が付いたら4時じゃないか。明日起きられるかな。

追記

よく考えたら、Firefoxには右クリックメニューに「背景画像を表示」ってのがあるなぁー。そっちを使ったほうがいいなぁー。プヒー。

ホイミン


ねんがんの ドラクエ4を てにいれたぞ!!

というわけで、DSでリメイクされたドラクエ4を購入して、フガフガと鼻息を荒げながらやっていたのだけど、第一章でライアンの仲間になるホイミンのセリフに違和感を覚えたので、整理するためにちょっと書くことにした。

ライアンさん ぼくとおなじ
ホイミスライムが あらわれても
なさけをかけちゃ ダメだよ

ホイミンは魔物としてこの世に生を受けたのだけど、人間になりたいと言う。動機は不明だけど、魔物ではなく人間として、生きていきたい。そのためにライアンの仲間になり、子どもたちをさらうピサロの手先をやっつける。

人間に協力してくれるのはありがたいのだけど、同属のホイミスライムを躊躇なく切り捨ててしまうことに対して、なんだか不気味なものを感じた。実際に切り捨てているのはライアンで、ホイミンはサポートしているだけだとしても、どうしても何か気持ち悪いものがつきまとう。例えば「人間が魔物になりたい」と言って、そのために自分と同じ人間をザクザクと殺すというのを想像したらどうだろうか。私は恐ろしい。っていうかバルザックじゃないか。

ホイミンを先頭にして村人に話しかけると、子供たちはそうでもないが、大人たちはものすごい拒否反応を示す。ファミコン版を遊んだ子供の頃は「悪い奴をやっつけて子供たちを連れて帰ってきたのに、何てひどい人たちだ。」と思っていたけど、大人になった今改めて考えると、やはりホイミンと仲良くするのは難しいんじゃないかと思う。命を賭けて子供たちを助けてくれたのは、感謝するし尊敬もするけど、やっぱり人間と魔物は仲良くできない。「ロザリーヒルっていう村があって、そこでは魔物と人間が仲良く暮らしているらしい。そこに行って静かに暮らしてくれないかな。」っていうのが本音だ。

後にホイミンは人間になるのだけど、彼の目にキングレオバルザックはどう写るのだろう。「人間として生まれたのに、魔物になりたいなんて理解不能だよ。」って感じなのかな。立場が違うだけでやってることは一緒なのに。

Twitter API の If-Modified-Since

TwitterAPI をいじってました。
お友達のタイムラインを取得する時は、リクエストに「If-Modified-Since」ヘッダをつけると、指定した日時以降の発言だけ取得できるよー。と書いてあったので、最後に取得した発言の日時を覚えておいて、無駄なく発言を取得しようと思いやってみたのですが、、、何回やっても何回やっても「If-Modified-Since」が無視されてしまい、途方にくれておりました。FirefoxのRESTTestプラグインでやれば、ちゃんと取得できるのにー。

<?php

require_once "HTTP/Request.php";

$url = 'http://twitter.com/statuses/friends_timeline/drgqst.rss';
$last_crawl = 'Sat, 15 Dec 2007 05:13:37 +0000';

// HTTPリクエストを作成
$req =& new HTTP_Request( $url );
$req->addHeader("If-Modified-Since", $last_crawl );

// HTTPリクエストを送信
$response = $req->sendRequest();

// 出力
echo $req->getResponseBody();

?>

一晩悩んでどうしようもなくなったので寝てしまい、先ほどむくむくと起き出してProxomitronとか使って色々調べてみたら、あっさり解決しました。
TwitterBasic認証を行わずに、お友達のタイムラインを取得しようとすると、一見それっぽく取得できるのですが、実は、パラメータの「since」が無視されて、常に最新の20件を取得するようになっているみたいです。なるほど。これはびっくりだ。

<?php

require_once "HTTP/Request.php";

$url = 'http://twitter.com/statuses/friends_timeline/drgqst.rss';
$twitter_name = 'drgqst';
$twitter_password = '********';
$last_crawl = 'Sat, 15 Dec 2007 05:13:37 +0000';

// HTTPリクエストを作成
$req =& new HTTP_Request( $url );
$req->setBasicAuth( $twitter_name, $twitter_password );
$req->addHeader("If-Modified-Since", $last_crawl );

// HTTPリクエストを送信
$response = $req->sendRequest();

// 出力
echo $req->getResponseBody();

?>

こんな風にしたら、あっさり上手くいきました。

教訓

上手くいかなくて途方にくれたら、とっとと寝るのが一番。

勇者の素人と玄人を見分ける方法


http://anond.hatelabo.jp/20071212132540のパクリ。元ネタが面白かったのでムラムラしてやってしまった。


世界の半分をもらうために竜王と手を組むのが素人。誘惑に抗い正義を貫くのが玄人。
サマルトリアの王子が使えないと腹を立てるのが素人。3人の能力を最大限発揮できる作戦を練るのが玄人。
船を手に入れてから「どこに行けばいいんだ」と不安になるのが素人。「どこまでも行けるようになった」とワクワクするのが玄人。
ロンダルキアの洞窟終盤ではぐれメタルの群れに全滅させられるのが素人。
ノアニールを放置するのが素人。人間とエルフの悲しい恋の結末に涙するのが玄人。
必要に迫られてから商人を調達するのが素人。最初から商人を加え、共に戦った仲間の新しい人生に思いを馳せるのが玄人。
賢者の石を取ってリレミトするのが素人。父親の無念を晴らすべく、そのまま魔王の元へ突き進むのが玄人。
小手先のダジャレで笑わせようとするのが素人。魔王を倒して人々が心から笑える日を取り戻すのが玄人。
大切な人を亡くした怒りでバケモノ化するのが素人。悲しみを乗り越えて戦うのが玄人。