なぜx86 大学の機械語序論という授業でx86(x86_64ではない)でアセンブラを書いています。 x86のアドレッシングモードが難しかったので復習を兼ねてまとめます。 やりたかったこと 授業でfib(10)を求めてebxに格納する課題がありました。 方針としては、aというシンボルのデータ領域を、アドレッシングモードを使って配列のように扱い、 フィボナッチ数列を計算することにしました。 わかりやすくRubyで書くとこんな方針です。

fib.rb a = 1, 1, 0, 0, 0, 0, 0, 0, 0, 0.each {|i| a[i+2] = a[i+1] + a[i]} puts a[10] アセンブラでa[i+2]やa[i+1]を参照する必要があったので、 アドレッシングモードを利用したいと思ったわけです。

x86のアドレッシングモード 授業の資料によると、x86 では、以下のアドレッシングができるそうです。 BASE+(INDEX*SCALE)+DISPLACEMENT DISPLACEMENT: アドレス、もしくはベースレジスタからのオフセットを示す。定数。 BASE: ベースレジスタ INDEX: インデックスレジスタ、配列の添え字のようなもの SCALE: 2,4,8 のいずれか。配列要素のサイズを指定する。 そして、これを次のように記述するらしいです。 DISPLACEMENT(BASE, INDEX, SCALE) 注意点 ここがポイントなのですが、 アドレッシングモードを利用するときには必ず型を守らなくてはいけません。 特に、 BASEをレジスタにするのを忘れて エラーになるケースが多いような気がします。 コンパイラはjunk errorとか適当なエラーメッセージしか出してくれないので、 何がいけないのか分からずに苦労しました。 DISPLACEMENTには定数を指定する。 BASEとINDEXにはレジスタを指定する。 DISPLACEMENTはバイト単位(long型の配列なら、添字*4を指定する)。 これらを踏まえると、%eaxにインデックス、%ecxに配列arrayの先頭アドレスを格納したとき、 array[%eax+2]を参照するためには、次のようにする必要がありました。

Read more


Mac OS Xでjavacやjavaで文字化けした場合の対処ですが、 次のように~/.bash_profilealiasを設定すれば、治ると思います。

この例ではターミナルのエンコーディングがUTF-8という 前提で設定しているので、UTF-8の部分は自分の環境に合わせて変更してください。

# ~/.bash_profile
alias javac='javac -J-Dfile.encoding=UTF-8'
alias java='java -Dfile.encoding=UTF-8'

最後にsource ~/.bash_profileしてね。

私に関して言うと、Javaを書くときはEclipseを使うことにしたので、この設定はあまり役に立ってないね!

Read more


HSPプログラミングコンテスト2012で秀和システム賞を受賞しました。

HSPプログラムコンテスト2012 入賞作品詳細

入賞作品名はSoar(ソアー)で、女の子を落下しないように操作して、ひたすら上を目指すシンプルなゲームです。

去年はこのコンテストに参加しなかったので、2年ぶりの参加でした。

今年はコンテストTVなどでも 取り上げて貰えたので嬉しかったです。

(開発期間が本当に3日くらいだったので、)不具合などを修正したら、 ソースコードなどもGitHubなどに公開する予定です。

技術的な点だと、キャラクターの移動の計算に速度を使ったり、 床の移動に三角関数を用いたりして、滑らかな動きを実現しました。

久しぶりにHSPを触りましたが、やっぱりこのくらいの規模のゲームを サクッと作るにはとても便利な言語ですね。

最近ではJavaScriptに変換できたり、 スマートフォン上にも簡単に移植できるようになっているようなので、 期待が高まります。

コンテストの主催者の方、審査員の方、協賛の方、Soarを遊んで下さった方、 関係者さんに感謝です。来年も参加したいと思います。

Read more


近状報告

久しぶりの更新ですね()

今年まで大学が3学期制なので、11/22で2学期が無事に終わり、 昨日から3学期になりました。

10日間の秋休みは日中はバイト、夜はFPSという謎の生活を送っていました()

なぜタイミングチャートと回路図

学類の2年次の2学期の必修の授業として論理回路実験というのがあったのですが、 そのレポートが本当に重かったです。

レポートを作成するにあたって、タイミングチャートや回路図を書く必要 があるのですが、普通にWordのオートシェイプで描くのは困難を極めたので、 後輩たちに知恵を授けようと思い、この記事を書くに至りました。

タイミングチャート

タイミングチャート清書ツールを使いましょう。

MacでもUNIXでもWindowsでも動作するようです。

次のような手順で使います。

  • テキストエディタでタイミングチャートを書く。
  • このツールでepsなどに変換する。

素晴らしい点を挙げると次のようになります。

  • テキスト形式の文法がシンプル
  • LaTex使いにとっては、epsで生成してくれると助かる
  • 実体はPerlスクリプトなので、環境を汚さない

これは実際に課題で使用したタイミングチャートです。

まず、次のようにタイミングチャートのソースを書きます。

s     ____~~__~~__~~__~~__~~__~~__~~__~~__
x     _______~~~~____~~~~____~~~~____~~~~_
Q1    __________________~~~~~~~~~~~~~~~~~~
Q2    __________~~~~~~~~~~~~~~~~__________
u     ________________________________~~__
v     ____~~______~~______~~______~~______
reset ~_~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

tchart.plを適当にパスの通った場所に置いて、

tchart.pl tc1.tc > tc1.epsとすれば、次のようなタイミングチャートを簡単に生成できます。

タイミングチャート

回路図

Qt-BSch3V Modifiedを使いましょう。

MacとUNIXで動作するようです。元々WindowsのソフトをMac用に移植したらしいので、本家のソフトはWindowsでも動作します。

少々使い方がわかりにくかったので、簡単に使うまでの手順を説明します。

  • qtbsch3v.appを起動。
  • 上のメニューから、Set>Libraryでライブラリを追加する。このとき、展開したディレクトリ/LIBV/LOGIC74.lb3を追加すればよいと思う。
  • Componentボタンでゲート(ANDゲートが7408という名前だったりするので探すのが厄介)を配置、 WireJunctionボタンで配線ができる。これだけ覚えておけばok。

次のような回路図を描くことができます。

7分周器回路の回路図

Read more


大学の数値計算法・数理アルゴリズムなどの授業でMatlabを使わないといけないのですが、 Matlabを買うお金がなかったので、代替ソフトとしてGNU OctaveをMac OS Xに入れました。 けっこうハマりどころが多かったのでメモします。 GNU Octaveについて wikipediaからの抜粋です。 GNU Octaveとは、MATLABと互換性を持ったフリーな数値解析ソフトウェアであり、GNUで開発している。 MATLABとの互換性を主に目指しており、MATLABの機能の多くをOctaveも持っている。また MATLAB のために書かれたプログラムも修正せずに動作するものが多い。 GNU Octave Mountain Lion にしたらHomebrewがおかしくなった人はこれ Mountain Lion にしたら、Homebrewがおかしくなった人は、まず次のリンクを参考にしてFixしましょう。 Get Mountain Lion and Homebrew to Be Happy HomebrewでOctaveを入れる # リポジトリ追加 brew tap free/open # updateしないとうまくいかなかった brew update # OctaveのコンパイルにFortranのコンパイラが必要 brew install gfortran # ようやくOctaveがコンパイルできる brew install octave plotとかでグラフを描けるようにする Octave自体には、グラフの描画機能はなく、gnuplotに依存しているのでgnuplotを入れます。 brew install gnuplot 次に、GNUTERMという環境変数を設定します。

~/.bash_profile export GNUTERM=x11 次にsource ~/.bash_profileをするかログインし直せばOctaveでplotなどからグラフを描画できるようになります。

ちなみに、GNUTERMを設定しないとこういう感じのエラーになります。 octave :1> plot(x) gnuplot> set terminal aqua enhanced title "Figure 1" size 560 420 font "*,6" ^ line 0: unknown or ambiguous terminal type; type just ‘set terminal’ for a list MacのターミナルからOctaveを使うための設定

Read more


WEBrickを使って、RubyCGIをローカル上でプレビューする方法を紹介します。前にTwinCalを作った時にこの方法を覚えました。

ApacheはC言語で書かれていているためにパフォーマンスが良いので本番環境ではApacheを採用しましたが、 ローカルでテスト用に使うにはWEBrickでちょろっとサーバを立てるのが良いですよね、そうしましょう。

テスト環境(ローカル) :WEBrick

本番環境(サーバ) :Apache

あとは、rsyncとかでファイルを同期できるようにしたら完璧。

1. Rubyのパスを本番環境とテスト環境で統一する

Rubyのパスを本番環境とテスト環境で統一するために、 /usr/bin/rubyのシンボリックリンクをrvmなどで入れたRubyに置き換えます。

mv /usr/bin/ruby /usr/bin/ruby-original
ln -s /Users/gam0022/.rvm/rubies/ruby-1.9.3-p194/bin/ruby /usr/bin/ruby

本番環境とテスト環境の両方で行います。

当然ですが、RubyのCGIではこのパスを1行目に指定します。

2. WEBrickを使う

WEBrickについて簡単に説明すると、RubyでWEBサーバを立てるためのライブラリです。 これをrequireすることで、10行くらいのコードを書くだけで簡易WEBサーバが完成します。

私の場合、次のようなpreview.rbを書きました。 WEBrickで.rbをAddHandlerする方法がなかなかわからなくて苦労しました。

require 'webrick'
include WEBrick

module WEBrick::HTTPServlet
  FileHandler.add_handler('rb', CGIHandler)
end

s = HTTPServer.new(
  :Port => 3000,
  :DocumentRoot => File.join(Dir.pwd),
  :DirectoryIndex => ['index.rb']
)
trap("INT") { s.shutdown }
s.start

このpreview.rbを公開したいディレクトリに設置し、 ターミナルでruby preview.rbをすれば、ブラウザでlocalhost:3000にアクセスすることで、 簡単にローカル上でCGIをテストすることができます。

おまけ: WEBrickでRequestURITooLargeが発生したときの対処方法

ApacheではURIの上限が大きいので、かなり長いURIを発行しても問題がないのですが、WEBrickでは2083byteの制限があるので、 CGIで長いURIを発行すると、RequestURITooLargeというエラーになってしまうことがあります。

これは、WEBrickのソースコードを書き換えることで対処できます。

私の環境では、/usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/webrick/httprequest.rbのL293に、 MAX_URI_LENGTHという定数があったので、これを書き換えることで対処できました。

291     private
292 
293     MAX_URI_LENGTH = 20830#2083 # :nodoc:
294 
295     def read_request_line(socket)

RubyでWebrick利用時にRequestURITooLargeエラー発生時の対処

Read more


Rubyで何かWebアプリを作ってみたかったので、 Twinsに登録した時間割をGoogleカレンダーやiCalにインポートするWebサービス「TwinCal」を作ってみました。

TwinCal

筑波大学生以外にも分かるように説明すると、筑波大学にはTwinsという履修の登録をするWebのシステムがあり、 Twinsでは時間割をCSV出力する機能があるので、そのCSVをiCalender形式に変換して、 GoogleカレンダーやiCalにインポートをサポートするWebアプリを作りました。

来年、Twinsが改修されるらしいので、半年後には使えなくなると思います。

バイトでPHPを使ってWebアプリを開発した経験はありましたが、個人でWebアプリを作ったのは初めてでした。

気を使ったこととして、ビューの部分はerb(railsでも使われているアレ)を使い、MVCを意識して作りました。

最近流行りのbootstrapやjQueryなどを使ったのですが、この2つを使ったのは正解でした。 これらのおかげでロジック部分に集中することができ、かなりサクサク作業することができました。

このアプリを作ろうと思い立ったのは12日で、14日には公開できるような状態になりました。

あまり使ってくれている人はいないようですが、bootstrapとhtml5で遊べたことだけでもよい経験となりました。

今回のことで学んだテクニックがいくつかあるので、後ほど記事にしたいです。

Read more


@daigoroubotをMac OS Xで動かすまでのメモです。 なんて需要が無さそうな記事なんだ! Rubyとgemををインストール とりあえず、バージョンは次のような感じで。インストール方法はこれを参考にしてください。 ruby 1.9.3p194 gem 1.8.24 required gems gem install oauth json sqlite3 twitter tweetstream unicode_math MeCabを使えるようにしておく homebrewを導入しているなら、これでok。 Mac用のメモですが、Ubuntuならbrewの代わりにapt-getなど、環境に合わせた適当なパッケージ管理システムにすれば普通に動くと思います。 brew install mecab mecab-ipadic MeCabのRubyバインディングをする ここからbrewで入れたMeCabと同じバージョンのRubyバインディングをダウンロードする。 tar -jxf mecab-ruby-xxx.tar.gzなどで解凍。 READMEの指示通りに作業する。 もし次のようなエラーが出たら、extconf.rbを編集する必要があるよう。 (参考:MacPortsで、mecabと、mecab-rubyのインストール) dyld: lazy symbol binding failed: Symbol not found: __ZN5MeCab12getLastErrorEv Referenced from: /Users/kobayashi/.rvm/rubies/ruby-1.8.7-p174/lib/ruby/site_ruby/1.8/i686-darwin10.7.0/MeCab.bundle Expected in: flat namespace dyld: Symbol not found: __ZN5MeCab12getLastErrorEv Referenced from: /Users/kobayashi/.rvm/rubies/ruby-1.8.7-p174/lib/ruby/site_ruby/1.8/i686-darwin10.7.0/MeCab.bundle Expected in: flat namespace extconf.

Read more


Octopressで画像などを使うとき、例えば、トップページで表示されるときと記事の詳細ページで表示されるときでは、 ディレクトリの階層が同じならないため、アドレスは絶対パスで指定するしかないのですが、そのときに使えるテクニックを紹介します。

URLを/から指定すると、Octopress側で絶対パスに補完してくれるようです。

例を挙げると、次のような具合に補完してくれます。

例: /images/hoge.png => http://gam0022.net/images/hoge.png

この機能は、plugins/octopress_filters.rbの79行目のexpand_urlsというメソッドで定義されているようです。

Read more


このブログで、カテゴリーに濁点を含んだ日本語を使うと、カテゴリーの一覧などからカテゴリーのページにリンクしたとき、 404エラーになってしまう問題が起きました。 原因は、このブログの開発環境にありました。 このブログは静的コンテンツなのですが、次のような手順でブログを運営しています。 (Rakefileで自動化されていますが、内部ではこうなっています) ローカル(Mac OS X)でブログを生成する。 サーバ(Ubuntu)にRsyncで生成したブログをアップロードする。 Mac OS X では、ファイル名のエンコードにUTF-8-MACを使っているので、 そのままアップロードすると、サーバ上のファイル名もUTF-8-MACになります。 しかし、ファイル自体のエンコードはUTF-8でURLをパーセントエンコーディングしていないので、 リンク先が見つからなくなってしまうようです。 UTF-8-MAC問題について詳しく知りたい人は、こちらなどが勉強になるとおもいます。 解決方法は簡単で、Rsyncでアップロードするときに、–iconvオプションを使い、 ファイル名をUTF-8-MACからUTF-8に変換すれば治ります。 Rsyncのバージョンを3にする Rsyncの–iconvオプションが使えるのは、Rsync3からなのでアップデートします。

brew tap homebrew/dupes #リポジトリを追加(2019/06/20追記。この手順は不要になりました。) brew install libiconv #iconvオプションを使うために必須のよう brew install rsync 念のため、サーバ側(Ubuntu)のrsync3にします。

aptitude install rsync Rakefileを修正する Rakefileのok_failed system…の行を書き換えます。 desc "Deploy website via rsync" task :rsync do exclude = "" if File.exists?(‘./rsync-exclude’) exclude = "–exclude-from ‘#{File.expand_path(‘./rsync-exclude’)}’" end puts "## Deploying website via Rsync" #ok_failed system("rsync -avze ‘ssh -p #{ssh_port}’ #{exclude} #{"–delete" unless rsync_delete == false} #{public_dir}/ #{ssh_user}:#{document_root}") ok_failed system("rsync –iconv=UTF-8-MAC,UTF-8 -avze ‘ssh -p #{ssh_port}’ #{exclude} #{"–delete" unless rsync_delete == false} #{public_dir}/ #{ssh_user}:#{document_root}") end 完。 これでうまくいきました。

Read more