読者です 読者をやめる 読者になる 読者になる

Mac OS X MavericksのHomebrewでPlease reinstall ... と出た場合の対処法

解決方法

真面目に後の方の "using a compatible compiler." とかを見て唸ってて解決しなかったが、単にbrew uninstallで言われているパッケージを一回アンインストールしてから再度brew installしなおせばでなくなる。

原因

どうやら、Mac OS X Mavericksになってコンパイル時のライブラリが変わったために、バージョンアップ前にコンパイルしたライブラリを依存関係の解決に使用できなくてこんなエラーが出るらしい。

おまけ

なんだったら、brew upgradeでインストールしてるパッケージを全てバージョンアップしておけばこんな問題に当たらなくて住むかも。

Google Compute Engineで立ち上げたCentOSのインスタンスにgit & vim & tmux環境構築

Google Compute Engine

Google Cloud Platform Startar Packのプロモコードをもらったので、さっそく登録してインスタンスを立ててみた。

基本的に登録やインスタンスを立てるところまでは書いてある説明を読めばなにも躓くことはなく、せっかくなのでMachine Typeにはn1-standard-2を選択。2つの仮想CPUと7.5GBのメモリで、USホストなら$0.207(US)/時とのこと。
これでStatar Packが切れる6ヶ月後まで走らせたら通信量課金と合わせて$1000超えそうだな......そのうちもう一個低いグレードに落とすかもしれない。

まあともかくそれで、イメージにはDebianCentOSを選べるとの事だったので、CentOSのイメージ( centos-6-v20131120 )を選択。
ちゃんと立ち上がってsshもできたのはよかったものの、gitとvimとtmuxの環境構築で幾つかのエラーにあたって解消法を調べたので、これからまた同じインスタンスを立てることもあるかもしれないし、メモがてらここに書いておこうというのが今回の目的。

ちなみにCentOSのバージョンは

$ cat /etc/redhat-release
CentOS release 6.5 (Final)

6.5。

gitの環境構築

vimのパッケージ管理にVundleを使用しているため、gitは環境構築に必須となる。

今回詰まったのは結局2点で、

  • yumでgitを入れると最新版でないためにエラーが起こる
  • gitを入れる前にlibcurlを入れないとhttpでのcloneでエラーが起こる

というところだった。

なので、とりあえずlibcurlをインストールする。

$ sudo yum install curl-devel

で、必要なパッケージをインストールしてから、gitの最新版をwgetで持ってきてmake installする (gitの最新版はgit-coreのGoogle Projectページで確認できる)。
この時一応、アンインストールしたい時のためにソースコード/usr/local/srcに置いておくようにする。

$ yum install -y zlib-devel perl-devel gettext
$ cd /usr/local/src
$ wget http://git-core.googlecode.com/files/git-1.8.5.tar.gz
$ tar xvzf git-1.8.5.tar.gz 
$ rm git-1.8.5.tar.gz
$ cd git-1.8.5
$ ./configure
$ make
$ make install

この通りやるとインストールディレクトリが/usr/local/bin/gitになってしまうので、シンボリックリンクを貼っておかないとデフォルトの設定ではパスが通りません。

$ ln -s /usr/local/bin/git /usr/bin/git
$ git --version

ちゃんとバージョンが表示されればインストール成功。

vimの環境構築

vimは標準で7.3が入っていたので、それをそのまま使用。Vagrantについては自分のdotfilesにあるsymlink.shを叩けば.vimrc.tmux.confと一緒に自動で入るようになっているので、省略。

tmuxの環境構築

tmuxはyumでインストールできなかったので、gitと同じように最新版をダウンロードしてきてインストールする。

また、参考サイトの monopocket.jp - 最新版 tmux のインストール方法 (Linux)によると

yum を使わないインストールの場合には、libevent の 2 系 が必要

とのことなので、これもwgetとmakeを使ってインストールする。

$ wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
$ tar xvzf libevent-2.0.21-stable.tar.gz
$ cd libevent-2.0.21-stable
$ ./configure
$ make
$ make install

Source Forgeのtmuxのページを見るとtmuxの最新版は1.8なので、これをダウンロード・インストールする。

$ wget http://sourceforge.net/projects/tmux/files/tmux/tmux-1.8/tmux-1.8.tar.gz/download?use_mirror=jaist
$ tar xvzf tmux-1.8.tar.gz
$ cd tmux-1.8
$ ./configure
$ make
$ make install

あとはtmuxとlibevent2を結びつける必要がある。このalias ...の文は毎回bash立ち上げ時に実行されるよう~/.bashrcなどに書き込んでおく。

$ alias tmux="LD_LIBRARY_PATH=/usr/local/lib /usr/local/bin/tmux"
$ tmux

無事全ての環境構築が終了した。

参考サイト

libcurlのインストール: Stackoverflow - git clone: fatal: Unable to find remote helper for 'https'

最新版のgitのインストール: Qiita - CentOS6.3にgitをソースコードから入れる

最新版のtmuxのインストール: monopocket.jp - 最新版 tmux のインストール方法 (Linux)

今日のコード (1)

このシリーズについて

書いて、自分でそれなりによく書けたなあというコードが、たまにあります。 きれいにデザインパターンを取り入れられてるとか、メモリ管理が良く出来てるとか、速度が速いとか、それだけでなく、美しいなあ、と思えるコードがあるのです。

そういうコードがあった時に紹介するという試みをやってみようと思います。毎日書くわけではありませんが、「今日のコード」としてみました。

プログラムというのはただのツールだとも言い切れない、と僕は思うのです。

言語

今回の言語は、Cです。

Cはメモリの使い方から関数や構造体といったものの持つ意味合いまで自分なりに決められる、どんな性格の人でも受け入れやすい言語だと感じます。

最近は最も有名なCコンパイラであるGCCMac OS Xの標準となったclangも中身はC++であったりするので、だんだん製品からは消えてきていますが、アマチュアプログラマーにとってこの言語以上にプログラムの可能性を感じさせてくれるような言語は未だ存在しないのではないでしょうか。

ソースコード

#include <stdlib.h>

#define CODE_LENGTH 64

typedef struct Code_tag Code;
struct Code_tag{
    char code[CODE_LENGTH];
    Code *next;
};

typedef struct Source_tag Source;
struct Source_tag{
    Code *codes;
    int codes_len;
    Source *next;
};

Code *create_code(){
    Code *code = (Code *)malloc(sizeof(Code));
    code->next = NULL;
    return code;
}

Source *create_source(){
    Source *source = (Source *)malloc(sizeof(Source));
    source->codes = create_code();
    source->codes_len = 0;
    source->next = NULL;
    return source;
}

Source *get_strings(FILE *in){
    Source *source = create_source();
    Source *cur_source = source;
    Code *code = cur_source->codes;
    int i = 0;
    char c;

    for(c = fgetc(in); c != EOF; c = fgetc(in)){
        if(c == '\n'){
            code->code[i] = '\0';
            cur_source->next = create_source();
            cur_source = cur_source->next;
            code = cur_source->codes;
            i = 0;
        } else{
            if(i == CODE_LENGTH){
                code->next = create_code();
                code = code->next;
                i = 0;
            }
            code->code[i++] = c;
            cur_source->codes_len++;
        }
    }
    return source;
}

解釈

なかなかのボリュームがありますが、これはGPGPU上でBrainfuckインタプリタを実装するために、ファイルから改行で区切られた複数のBrainfuckソースコードをメモリ上に読み込む関数get_stringsを定義したものです。

入力ファイルの例としては、以下の様なものが挙げられます。

>++++++++[<+++++++++>-]<.
>++++++++++[<++++++++++>-]<+.
>++++++++++[<+++++++++++>-]<--.
>++++++++++[<+++++++++++>-]<--.
>++++++++++[<+++++++++++>-]<+.
>++++[<+++++++++++>-]<.
>++++[<++++++++>-]<.
>+++++++++[<++++++++++>-]<---.
>++++++++++[<+++++++++++>-]<+.
>++++++++++[<+++++++++++>-]<++++.
>++++++++++[<+++++++++++>-]<--.
>++++++++++[<++++++++++>-]<.
>++++[<++++++++>-]<+.
.

上記は上から順に
Hello,World!\0を出力するBrainfuckプログラムです。

最初は普通にfgetsで読み込み、1つづつのchar型の配列にしてその配列の配列を返す関数にしようかと考えていましたが、後々文字数が必要になることを考えると、strlenなどを使って再び1文字づつのループを回すのは気が引けたので、はじめからfgetcを用いることにしました。 なお、fgetcgetcの違いについては何気にWikipediaの記事が分かりやすいです。

Source構造体は1行に書かれているソースコードを表し、Code構造体はリストとなってそのソースコードのすべての文字列を保持します。Source構造体をリストとしたものの先頭ポインタを返すことで、get_stringsの戻り値が極めてわかりやすくなっていることが伺えます。

また、関数内の各行も、一般的な型名から構造体の名前になっていることで、英語のようにスラスラと読み下せるようになります。ここまで簡潔であれば、コメントを書く必要など無いでしょう。

また、プログラマから見た見やすさだけでなく、Code構造体によってどのような長さのソースコードが1行に書かれていても物理的にメモリが許せばその全てをSource構造体に格納し切ることが出来ますし、reallocなどという挙動の怪しい関数を用いる必要もなくなります。もし、実行速度の効率よりも可能な限り無駄なメモリを使用したくないと考えるのであれば、CODE_LENGTHの値をもっと小さくすればいいでしょう。或いは、この値を実行時のコマンドライン引数でユーザに与えさせるというのも悪くないアイディアです。

もしかすると、for文の書き方については異論のある人が多いかもしれませんが、普段イテレータを初期化したり更新したりという操作をforの括弧内で行っていることを鑑みれば、こうした書き方もそれほど忌むべきもので無いのではないかと思い、あえてfgetc(in)を2度書く形をとりました。

例えばif(i == CODE_LENGTH)のようなところで>=なんかを使わないことによる機械に対する信頼やcode[i++]とするかfor文の最後に..., i++){とするかという葛藤の話もしたいのですが、ここはグッと堪えて、細部については実際のコードを読んで感じ取ってもらうようにしたいと思います。

最後に

かなりスペシフィックなコードですので、誰のコーディングにも役には立たないかと思いますが、プログラムをただのツールでなく、ひとつの作品として愛でるような場がなかなかなかったので、自分だけでこっそりと始めてみてしまいました。

もし、運悪くこの記事を読んでしまった方がいらっしゃいましたら、ごめんなさい。ただもし少しでもご興味が有るのなら、ぜひご自身のプログラミング言語観などをコメントしていただければと思います。

Mac OSX Lion上でのEclipse Junoインストールメモ

ずっとpleiadesと一緒にEclipse Heliosを使っていて、Functional Programmingとかzen-codingとか某Javaを使う授業とか色々なプラグインを入れまくっていたので、一度全て消去してEclipse Junoをインストールすることにした。
で、せっかくなので、インストールしたプラグインをメモっておく。

0. 文字コード設定

プラグインではないが、先にPreferences > WorkspaceのText file encodingでOtherを指定し、文字コードUTF-8に設定しておく。

1. Eclipse Color Theme

やっぱり背景白は厳しいものがあるので、
Eclipseのエディタの色をカスタマイズする方法 - AkicanBlog
なんかを参考にしつつ、背景色などを簡単に変えられるお決まりプラグインをインストール。
ちなみにテーマは標準で入っているObsidianにした。

2. Vrapper

vim使いとしてはこれは必須。
Eclipseのキーバインドをvim風にできるVrapperが素晴らしすぎる件について - ( ꒪⌓꒪) ゆるよろ日記
ここを参考にインストールしたが、まだ.vrapperrcは書いてない。

3. Tomcat Plugin

Tomcat Serverを手元で使うので、Tomcatをインストールして、
eclipse-Tomcatプラグインの設定 - Javaちょこっとリファレンス
ここらへんを参考にTomcat Pluginも入れておく。

4. ADT

Androidの開発もしたいので、ADTを
ADT Pluginのインストール - Android入門
こういうとこにあるURLを参考にインストール。
ADT入れればWindow > Android SDK ManagerからSDKもAVDも入れられる。


...あんまり量なかった。
これから更新していくかもです。

Javaでgnuplotを使ってグラフを生成するJavaPlot on Mac OSX Lion

Javaで数式やら統計やらのグラフ画像を生成できるといいなあ、と思い、やはりgnuplotだろうなあ、と思っていると、などというジャストミートなライブラリを見つけた。
どうやら、Javaで書いたとおりにgnuplotを動かしてグラフ画像を生成してくれるらしい。

で、gnuplotもまじめに使ったことがなかったので、そのインストールから始めたわけだが、妙な所でハマったので一応メモ。
環境はMac OSX Lion (10.7.5)。

とりあえずgnuplotをインストール

(2014年1月29日追記: Mac OS X使ってるなら、Homebrewでインストールしましょう...)
MacPortsとかでできるらしいが、なんかいまいちうまく行かなくてよくわからなかったので、ソースコードからインストール。(おそらくこの判断が一番の間違い)
gnuplot homepageから最新のソースコード(2013年1月23日現在で4.6.1)を入手してきて解凍し、

$ cd gnuplot-4.6.1/
$ ./configure

すると、なんか嫌な文字が。

png terminal: no (requires libgd)

むむむ。
実は、JavaPlotで一番使うことになるであろうImageTerminalクラスのgetImage()はgnuplotのterminalをpngに変更して、そのpngをImageIO.readで読み込むことでBufferdImageに変換してくれている。
だから、とりあえずpng terminalをyesにするためにlibgdをインストールすることにした。
ちなみに、このままmakeとmake installをやっても、とりあえず動くことは動くし、自分の環境ではX11 terminalは正常に動作した。

libgdのインストール

libgdとは、よく知らないが、pnggif、jpgの画像を生成するためのCライブラリらしい。
とりあえずググっていると、本家のサーバーは長いことダウンしたままらしいが、Repository deleted — Bitbucketからダウンロードできることが発覚。
Downloads -> Tags -> GD_2_0_33のgz
をダウンロードした。(最新版っぽいのにしなかったのはGDライブラリがダウンロードできない! ・・・GDライブラリの提供元(www.libgd.org)サイトが早く復活してほしい - r_nobuホームページを参考にしていたから)

普通に解凍して解凍したディレクトリに移動し、

$ ./configure
...
$ make

で、大量にエラー発生。
え。
どうやら、png.hとやらが見つからないらしい。

libpng12のインストール

調べてみるとpng.h not found on MacOS Lion · Issue #96 · DCPUTeam/DCPUToolchain · GitHubにあるように、

/usr/X11/include/libpng15/

にバージョン1.5があるのだが、どうやらバージョン1.2でないといけないらしい。
configureの吐き出したログをもう一度みてみると

checking for libpng12-config... no

と確かにlibpng12を探しに行っている。

そこで、再度 libpng-1.2.5 を ソースから インストールを参考にlibpng-1.2.5.tar.gz [505988 bytes] - Download Mirrors (1/8)の中の適当なアドレスからgzをダウンロード。
解凍してconfigureを実行すると、丁寧に「configureを実行するんじゃなくてscriptディレクトリから適当なmakefileを取り出してmakeしてね」と教えてくださるので、自分の場合は

$ cp script/makefile.macosx Makefile
$ make
...
$ install

でインストールできた。

ようやくJavaPlotを動かすところまで

これでlibgdもインストールできるようになり、gnuplotpng terminalを使える状態でインストールできた。
遂に念願のJavaPlotを動かすべく、からダウンロードしたtarを解凍し、dist/JavaPlot.jarにクラスパスを通しつつ以下のようなコードをコンパイル

import javax.imageio.ImageIO;
import com.panayotis.gnuplot.JavaPlot;
import com.panayotis.gnuplot.terminal.ImageTerminal;
public class JavaPlotTest{
	public static void main(String args[]){
		JavaPlot p = new JavaPlot();
		ImageTerminal terminal = new ImageTerminal();
		p.setTerminal(terminal);
		p.addPlot("sin(x)");
		p.plot();
		ImageIO.write(terminal.getImage(), "PNG", "test.png");
	}
}

無事、sin xのグラフのpng画像を生成することができた。

JasminによるJava Bytecode入門(とりあえずHelloWorldまで)

コンパイラをつくりましょう、と思って、GASのコードを吐き出したりしてもいいのでしょうが、あまりきれいじゃないし、リンクとかよく分からなくて難しいし、動くところが限られるし、ということでJava Bytecodeをはき出すコンパイラを作ることにしました。

そこで、今回はJava BytecodeのアセンブラであるJasminを使うための環境構築(簡単だけど)の方法を書いておこうかと思います。


Jasminを始めるための説明としては Javaアセンブラ「Jasmin」を使おう [Javaプログラミング] All About にすごくわかりやすくまとまっているものがあるのですが、残念ながら最初にダウンロードできるものも、ここにあるものも、HelloWorldサンプルプログラムがうまく動かない。
というわけで、まだぜんぜん知識がないためにWeb上の情報をかき集めただけになりますが、JasminでHello Worldを表示するまでを、とりあえず記事にしておきます。

Jasminのダウンロード

JasminはJavaで書かれているので、 Jasmin Home Page からJarファイルをダウンロードすれば、JVMが入っている環境では簡単に動いてくれます。
この記事を書いている時点での最新版はjasmin-2.4です。

実際に動かすためにはダウンロードしたZIPファイルを解凍してjasmin.jarのあるディレクトリにcdし、

$ java -jar jasmin.jar xxx.j

と普通に引数にアセンブルするファイルを指定してJarファイルを実行するだけです。

HelloWorld.jを試す

早速解凍された中にあったexsampleディレクトリの中のHelloWorld.jをアセンブルすると

$ java -jar jasmin.jar exsample/HelloWorld.j
Generated: NoJad/j.class

"Generated"とうまくいった感じになります。
ん、でもなんで名前が"j.class"なんだろう。とか思いながら実行してみると

$ java NoJad.j
Exception in thread "main" java.lang.VerifyError: (class: NoJad/j, method: main signature: ([Ljava/lang/String;)V) Expecting to find object/array on stack

うまくいかない。
というわけで、ちょっと調べてみると、やはり全く同じお困り事を持った人が SourceForge.net: Jasmin - a Java assembler: stuck at HelloWorld step :-S にいた。

ここの回答によるとどうやらJasmin付属のHelloWorld.jはバージョン2.0から壊れているらしい。なんのこっちゃ。
でも結局、私の場合はバージョン1.1のHelloWorld.jを使っても結局同じエラーが出てしまったので、最終的には上のスレッドの回答に載っているコードをコピペして、ようやく実行することができました。

最終的なHelloWorldプログラムは以下。

.class public examples/HelloWorld
.super java/lang/Object

.method public <init>()V
   aload_0
   invokenonvirtual java/lang/Object/<init>()V
   return
.end method

.method public static main([Ljava/lang/String;)V
   .limit stack 2
   getstatic java/lang/System/out Ljava/io/PrintStream;
   ldc "Hello, World!"
   invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
   return
.end method

まだほとんど意味はわからないけど、嬉しいな。

おまけ

ちなみに、今はワークスペースディレクトリとjasmin.jarのあるディレクトリとを別にしているので、jasmin.jarのあるディレクトリをPATHの通っているところに移して、そこに"jasmin"という名前のシェルスクリプトファイルを作成し、

#!/bin/sh
java -jar [jasmin.jarへの絶対パス]/jasmin.jar $1

として、どこからでも

$ jasmin xxx.j

アセンブルできるようにしてみています。
うん、ぽいな。

Mac OS X LionへのTitanium環境構築

javascriptのコードを書くだけで、iOS用のObjective-CコードとAndroid用のJavaコードの両方を生成してくれる、それはそれはありがたいTitaniumというSDKがおるらしいので、早速環境構築をやってみた。

 

環境構築に必要な物は以下。

 

1. iOSのSDK

 これはAppleからダウンロードできたはず。ググれば出てくる。

 

2. AndroidSDK(2.2)

 これも普通にGoogleからダウンロードできる。ただ、バージョン2.2でないとTitanium上でうまく動作しないので、必ず2.2を入れる。めちゃ時間かかる。

 

3. Titanium Studio

 aptanaベースの、まあまあ使い良い統合開発環境にTitanium SDKがくっついているもの。appceleratorというところのサイトからダウンロードできる。

 

それぞれダウンロードしたらTitanium Studioをインストールして、

「環境設定」→「Aptana Studio」→「Titanium」で

Android SDK Home」にAndroid SDKのディレクトリパス(platformsディレクトリとかsamplesディレクトリの親ディレクトリ)を入力し、

「Default Android SDK」を「Android 2.2」にする。

(ここでもし「Android 2.2」がなければ、ちゃんとバージョン2.2がダウンロードされていなかったり、Android SDKのパスが間違っている可能性がある)

 

あとはaptanaとかeclipseみたいに

「File」→「New」→「Titanium Mobile Project」とやって、

プロジェクトの形態、名前、App Id (このままJavaのパッケージ名になる)を入力してあげれば、めでたくサンプルコードの書かれたプロジェクトが生成される。

 

ちなみにこのとき、「Deployment Targets」の「iPad」、「iPhone」、「Android」、「BlackBerry」、「Mobile Web」のうちチェックできないものがあれば、それのSDKがうまく読み込めていないということなので、チェックできるようになるようにうまくSDKをダンロードし直す。

「Set-up/Configure SDKs」のリンクをクリックするとすぐに環境設定が開いて、「Configure」ボタンでそれぞれのダウンローダとかをぱっと開けるので、便利。

 

プロジェクトが上手く生成されたら「Project Explorer」ウィンドウから作成したプロジェクトを副ボタンクリックして、「Run As」を選択すると各モバイル環境のエミュレータで即実行することができる。

iPadiPhoneAndroidとかやってみると、それぞれちょっとは違うものの、綺麗に動いて感動。

 

ちなみに、表示されるのはタブで切り替えられる2つのウィンドウ。

 

 

あと、さらにこのTitaniumの素晴らしいところとして、綺麗なプロジェクトの形でObjective-Cコード、Javaコードを生成してくれるところが挙げられる。

起動時にワークスペースに指定したディレクトリ内のプロジェクトのディレクトリに移動すると「build」というディレクトリがあるので、この中を探せばJavaObjective-Cもコンパイル前のコードが見られる。

 

これは、最悪Titaniumで実装できない操作をしたくなった場合に、JavaObjective-Cに乗り換えられる、ということなのかな。

 

まあ、とりあえずこれからアプリ作ってみようかと思います。