Hatena::ブログ(Diary)

hogeなlog

プロフィール

hogelog

hogelog

小室 直(こむろ すなお)。電気通信大学2003年入学。2010年修士卒業。プログラミングとかしてます。

カレンダー
1984 | 01 |
2006 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 |
2010 | 01 | 06 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 05 | 08 | 09 | 10 | 12 |
2012 | 01 | 04 | 06 |

June 26(Thu), 2008

[] 私が「Twitterはmixiに追い付いたな」と判断した、たった一つの理由

k.inabaさんがTwitterはじめたから

[][] ruby拡張を書いてみるテスツ

すごく簡単だった。rubyアーカイブに同梱されてるREADME.EXTすら読まずに適当に雰囲気で作れた。というわけで合ってないかもしれないけど。画面サイズとDPIを取得するモジュール。

require 'sinfo'

printf "%dx%d (px)\n", ScreenInfo::W_PX, ScreenInfo::H_PX
printf "%dx%d (mm)\n", ScreenInfo::W_MM, ScreenInfo::H_MM
printf "%dx%d (dpi)\n", ScreenInfo::W_DPI, ScreenInfo::H_DPI

こんなコードが

1024x768 (px)
271x203 (mm)
9640x9650 (dpi)

こんな出力をするもの。sinfoをrequireしたときの画面情報取得してモジュールScreenInfoの定数にぶちこむだけ。


ソースコードsinfo.cはこんなの。requireしたときの初期化動作を記述したInit_sinfo書いてるだけ。

#include "ruby.h"
#ifdef WIN32
#include <windows.h>
#else
#include <X11/Xlib.h>
#endif

static VALUE mSInfo;
void Init_sinfo(void) {
  mSInfo = rb_define_module("ScreenInfo");
  int w_px, w_mm, w_dpi;
  int h_px, h_mm, h_dpi;
#if defined(WIN32)
  HDC dc;
  dc = GetDC(GetDesktopWindow());
  if(dc == NULL) {
    rb_raise(rb_eLoadError, "sinfo: fail to GetDesctopWindow");
    return;
  }
  w_px = GetDeviceCaps(dc, HORZRES);
  w_mm = GetDeviceCaps(dc, HORZSIZE);
  h_px = GetDeviceCaps(dc, VERTRES);
  h_mm = GetDeviceCaps(dc, VERTSIZE);
  ReleaseDC(GetDesktopWindow(), dc);
#elif defined(_XLIB_H_)
  Display *display = XOpenDisplay(NULL);
  if(display == NULL) {
    rb_raise(rb_eLoadError, "sinfo: fail to XOpenDisplay");
    return;
  }
  w_px = DisplayWidth(display, DefaultScreen(display));
  w_mm = DisplayWidthMM(display, DefaultScreen(display));
  h_px = DisplayHeight(display, DefaultScreen(display));
  h_mm = DisplayHeightMM(display, DefaultScreen(display));
  XCloseDisplay(display);
#endif
  w_dpi = (w_px*254 + w_mm*5) / w_mm*10;
  h_dpi = (h_px*254 + h_mm*5) / h_mm*10;
  rb_define_const(mSInfo, "W_PX", INT2FIX(w_px));
  rb_define_const(mSInfo, "W_MM", INT2FIX(w_mm));
  rb_define_const(mSInfo, "H_PX", INT2FIX(h_px));
  rb_define_const(mSInfo, "H_MM", INT2FIX(h_mm));
  rb_define_const(mSInfo, "W_DPI", INT2FIX(w_dpi));
  rb_define_const(mSInfo, "H_DPI", INT2FIX(h_dpi));
}

そして以下のようなrubyスクリプトextconf.rbとを作る。

#!/usr/bin/ruby

require 'mkmf'
create_makefile 'sinfo'

あとは

$ ruby extconf.rb
$ make
# make site-install

でおしまい。処理系の拡張機能とかは他にはPHPしか作ったことないから比較対象多くないけど、これはすごく作りやすくていいなあと思う。書き易さもそうだけど読みやすさもこっちのが格段上。言語は同じCなんだけどねえ。俺にとってはこれだけで十分好きになる理由になるなあと感じた。

June 25(Wed), 2008

[][] RubyKaigi2008に行ってきた

最近体調崩しっぱなしだったのですが土日にRubyKaigi出かけたら、直後は疲れてぐったりしてたのもの以降はとっても元気です! RubyKaigi最高!


そんなわけでチケットも買ってないというのにほいほい参加してきました。メイン会場には侵入できないものの、サブ会場は無料で居座ることができたので。サブ会場の発表が無いときにはメイン会場の中継が映ってるし電源も無線環境も完備と、いや金払ってませんけどいいんすかどうもという気分を満喫。

0th day

研究室のゼミがあったのでつくばには行けず。調布から日本 Ruby 会議 2008 - RubyKaigi2008 Golfコンペに参加してました。rubyもgolfもちょい久しぶりでとても微妙な成績。まあ元々ゴルファー力そんな高くないからそんなもんだけど。

「1日目から行く」以外何も考えてなかったところでid:sotarokが「fauなんとかukstudioを乗っけてくから乗らねー?」というので「じゃあそれで」と。マクロスF見てから就寝。

1st day

池袋7:30集合というので5時くらい起き。眠い。いつも通りだらだらしつつ準備して出発。だらだらし過ぎて10分くらい遅刻してsotarokの車が待つ場所に到着。ukもfauも来てねえ。ukは30分くらい遅刻し、fauは間に合わんから電車で。まあとかくsotarokがid:blanc_et_noirに駐車場案内してもらったり途中でfaultierに合流したりしてる横で阿呆面晒して付いていったらとりあえずRubyKaigi会場に辿りついた。以降チケット無いのでずっとサブ会場の住人に。

Blurring the Language Barrier(Aaron Patterson)

「言語間の壁をあやふやに」という、まさにその通りの内容。johnsonを使ってRuby、JavaScript間の連携を強くしRuby側からjsのfunction呼べたりjs側からRubyのハッシュ使えたり。jsエンジンはSpiderMonkey。

私は以前「PHPからGauche呼べるようにしたぜ!」とかいう話をしてきたことありますが、この発表はそれを真面目にやってた。相互のオブジェクトの変換とかをきっちりやるようにしないとあんまし意味が無いんだよね。

WebばかりがUIじゃない! 〜 新しくなったRuby/Tk (永井秀利)

Ruby/Tkっつうとまあ発表者の方の想定してる通り、古くさい感じの微妙な印象を抱いてました。しかしRuby1.8.7とか1.9のはけっこう刷新したりとかがあるようで、そのうちまた触れようと思った。

Rubyで快適に連投する11の方法 (ujihisa)

うじひさだった。快適に連投する方法ということで、ujihisaのTwitterアカウントとかmixiアカウントを開いて準備していた。半ばでうじひさがmixi日記確認するときには間にあわなかった。mixiの「本当に投稿しますか?」メッセージに負けた。最後にうじひさがmixi日記を確認する前にコメント投稿することに成功して満足した。まあでも発表の盛り上がり的には最後のオチみたいな扱いになって後のだけ成功して良かったかなーと思った。

よる

http://generation1986.g.hatena.ne.jp/daftbeats/20080616/1213637384

RubyKaigi参加者とつくば民と飲み会。体調おもわしくなく、それでいて適当に固形物液体を胃に詰め込みまくったら限界突破などしたりしてあとは寝てた。たぶんハチロク世代(なにそれおいしいの?)のイベントだったんだけどid:TAKESAKOが普通にいたりして「ハチロク世代は1986±25年生まれのグループ」という定義はまったく正しいなと思った。「マクロスFがすばらしい」みたいなことを語った。その後id:from_kyushuなどに小判鮫してhacktour298に流れこみ、そのまま死んだ。

2nd day

あさ

のろのろと起きてコンビニでおにぎりなど買ってもそもそ食う。会場(お金を払っていないのでサブ会場です!)についてyuguiさんの初めてのRuby(はじるび)買う。

Ruby構文による構造化データ記述 (前田和昭)

データ記述とかもう全部S式でいいよS式でと思ってる俺でしたけど、まあruby構文のサブセットにしてruby処理系をライブラリとして使う道とかもまあいいのかなーと思ったりした。

ひる

id:from_kyushuなどhacktourの方々と飯場へ。たまたま遭遇したid:hajimehoshiさんなどと同席する。


あとyuguiさんにサインもらう。「twitterなどでたまに話しますねhogelogですどうもー」などと。今読んでるけどうん俺ふつーにrubyできない人だったんじゃないかということを認識した。ブロックとか普通は{}で書くもんだと思ってたけどこれはgolf畑でrubyに手を出したからかもと思った。

Rubyのゲーム開発の現状と自作ゲームライブラリStar Ruby (星一)

Rubyによるゲーム開発の現状話よかった。「字祷子D」とかニトロ+がそんなruby使った商品出してるとかおもしれー。Star Rubyに関してはさわってみた感じはすごく使いやすいかもなーとは思った。

net-irc gem のライブラリデザイン (cho45)

最前列に位置取りしていた人達がみんな敵という過酷な状況でのTalk。下手なDSL使うと憶えなきゃいけないこと増えるで良くないみたいな話も。

RubyGCをどけんかせんといかん (authorNari)

街頭アンケートで「ガーベジコレクションといったら誰でしょう?」と聞いて一番多く返ってくる人のnariさんです。99.9999999%が無効回答をすると思いますけど。

MRI(Matz Ruby Implementation)ってのは確かにGC屋が参入しやすい位置なんだろうなーと。SunのHotspot VMのGC開発に首つっこむこと考えてみましょう。GC論文眺めてりゃどいつもこいつもSunの研究者(それは言い過ぎ)の、GCに狂った魑魅魍魎が跋扈する世界ですよHotspot VMは。それにひきかえMRIは、言ってみりゃ敵はmatzだけ。matzの書いたしょっぱいGC(おい失礼だぞ!)を越えるGC書いてしまえばもうruby界のGCスペシャリストとして鼻高々ですよ。やった!

(Hotspot VMの魔物達の活動を見たい方はhttp://mail.openjdk.java.net/mailman/listinfo/hotspot-gc-dev:hotspot-gc ML]をチェック!)

RejectKaigi, RejectRejectKaigi

すさまじくカオスでもみくちゃな感じが楽しかったので来年も開催するといいなーと思った。@_tad_によるLTがとてもうるさくて笑った。

よる

うじひさやyharaさんなどと一緒にTX乗ってて気付いたらカレー食い放題の店など入っていた。腹がくちくなった。疲れてしおしおになりながら帰宅。録画してあったコードギアス見ることもなく眠りについた。RubyKaigiと関係無いけどコードギアスはこう、御都合主義が加速してる気がするけど、それはそれこれはこれとするとかなり楽しめて好きだ。

トラックバック - http://d.hatena.ne.jp/hogelog/20080625

June 13(Fri), 2008

[] TeXコンパイル用のMakefile

もう死んでて、毎週研究室のゼミ資料つくるだけの日常。


hogehoge.texをコンパイルするとして、以下のようなMakefileでコンパイル。dviをつくるときmake、psファイルを作りたいときはmake ps、pdfファイルを作りたいときはmake pdf。BibTeXファイルは~/docs/bibtex/あたりにあるgc.bib, gcbook.bib, embedded.bib。

RESUME = hogehoge
BIBS = gc.bib,gcbook.bib,embedded.bib
TEX     = platex
BIB     = jbibtex
DVIPS = dvips
DVIPDF = dvipdfmx

.SUFFIXES: .ps .dvi .tex .eps .pdf .bib

all: dvi
dvi: deps bib $(RESUME).dvi
ps: $(RESUME).ps
pdf: $(RESUME).pdf

force:
        $(TEX) $(RESUME)
        $(BIB) $(RESUME)
        $(TEX) $(RESUME)
        $(TEX) $(RESUME)

deps:
        ./texdep.pl $(RESUME).tex >deps

bib:
        zsh -c "cp -p $(HOME)/docs/bibtex/{$(BIBS)} ."

clean:
        -rm -f *.aux *.toc *.lot *.lof *.dvi *.log *.bbl *.blg *.pdf *.ps

remake: clean all

.tex.dvi:
        $(TEX) $(RESUME)
        $(BIB) $(RESUME)
        $(TEX) $(RESUME)
        $(TEX) $(RESUME)
.dvi.ps:
        $(DVIPS) $(RESUME)
.dvi.pdf:
        $(DVIPDF) $(RESUME)

-include deps

依存関係を調べるtexdep.plはこんなの。

#!/usr/bin/perl

use strict;
use warnings;
if(@ARGV == 0) {
  print "usage: $0 texfile\n";
  exit -1;
}
my $texfile = $ARGV[0];

if($texfile =~ /([^\.]+)\.tex/) {
  my $texname = $1;
  print "$texname.dvi: ", join(' ', texdep($texfile)), "\n";
  print "$texname.ps: $texname.dvi\n";
  print "$texname.pdf: $texname.dvi\n";
}

sub texdep {
  my ($texfile) = @_;
  my (@depls, @texls);
  open TEX, $texfile or die "cannot open $texfile";
  while(<TEX>) {
    if(/\\input{([^}]+)}/) {
      print $1;
      push @texls, $1;
    }
    elsif(/\\verbatiminput{([^}]+)}/ or /\\includegraphics\[.+\]{([^}]+)}/) {
      push @depls, $1;
    }
    elsif(/\\bibliography{([^}]+)}/) {
      push @depls, map{"$_.bib"}split(',', $1);
    }
  }
  close TEX;
  for my $input (@texls) {
    push @depls, texdep($input);
  }
  return $texfile, @depls;
}
最近のコメント