2010年5月21日金曜日

sudoで一時的に管理者権限を与える

Check
lennyのお話。

毎回$su (password) を使ってroot権限に切り替えていたのだが、ログアウトしわすれてrootのまま作業してしまうということがよくあった。そこで実行したいコマンドだけにroot権限を与えるsudoというコマンドを使うことにした。

導入の手順は以下のとおり。ここでは、一般ユーザwashiにすべての管理者権限を与えようと思う(個人で使う分にはこれで問題なさそう)。

$ su[RET]
$ パスワードを入力[RET]
$ aptitude install sudo[RET]
$ visudo[RET]

エディタが起動するので、
# User privilege specification
root ALL=(ALL) ALL
washi ALL=(ALL) ALL #<- 追加 
上記を記述して、保存する。
$ exit[RET] #一般ユーザに戻る
$ sudo aptitude update[RET] #ためしにaptitude updateを実行

その後washiのパスワード(rootではないを尋ねられるので入力したら、無事実行できるはず。

参考サイト:
http://www.garunimo.com/program/linux/visudo.xhtml

2010年5月18日火曜日

wxWidgets + OpenGL + Cygwin or Linux(Lenny) + Mercurial + Emacs + CEDET = 大混乱

Check
タイトルのとおり、学校では上記の環境で、家ではDebian(lenny)を使って開発していたら、覚えることが多すぎてブログを更新する暇すらなかった。本当はちょこちょこ覚えるたびに更新するのが理想なのだろうけど…

まずは、wxWidgetsによるOpenGLフレームの作成。現在のところ、三次元日誌さんの『wxWidgetsのOpenGL雛形』を丸写し。なさけないが、とりあえずはこれで必要なソースはできた。

次に、Cygwinでのビルド。コンパイラにいろいろなパラメタを与えなければいけないのだが、wx-configというコマンドを使うことでかなり楽をできる。
  • wx-config --cxxflags インクルードパスやコンパイルオプションなどを勝手にやってくれる
  • wx-config --libs gl コアライブラリやwxWidgetsのGL用ライブラリパスと名前の解決をやってくれる。GLが必要ないときは、glという引数を外せばよい。
実際にコマンドラインで使用するときは以下のようになる。
g++ main.cpp `wx-config --libs gl` `wx-config --cxxflags`
Lennyではこのままでもリンクまで通るのだが、Cygwinでやるとリンクエラーをおこしてしまう。libopengl32.lib.aを見つけきれないのが原因だと思われるので、上記のオプションに加え、-lopengl32を加えてやると無事通った。
g++ main.cpp `wx-config --libs gl` `wx-config --cxxflags` -lopengl32
Lenny上での実行イメージは以下のとおり。


さて、こういう風に作ったコードをリポジトリに保存して管理も一元化しようと思いたくなるのは人の常。くわえて、今学校の先生と一緒にいろいろ企んでいるので、他の人からも参照出来るようにしたい。

cvsやsvnあたりは定番だが、ディレクトリごとに管理用のファイルを作られてしまう上に、GitやMercurialといった分散型と比べるとちょっと古くさい気もしたので、今回はMercurialを選択することにした。Mercurialの何が良いって、デフォルトでhttpサーバとして機能するところ。ちょっと前まで、おうちのマシンでMercurialサーバーを動かしていたのですが、httpサーバーだとよほどのことがない限りwebフィルタリングにも引っかかりません。惜しむらくは、cvsやsvnはもとより、Gitと比較しても普及していないところでしょうか。もっと流行ってほしいな。

bitbucketというMercurial用のリポジトリサービスも発見したので、今はここを使わせてもらっています。

Mercurialの超簡単な操作説明。当然コマンドラインからです。Linuxはもちろんのこと、Windows、Cygwinと多くのプラットフォームから使用できます。今のところ私が使ったものだけを紹介。hgというのがMercurialのコマンド名。水銀のことだそうです。
  • hg init リポジトリをカレントディレクトリに作成。
  • hg clone http://foo.bar/ リモートにあるリポジトリをカレントディレクトリにコピー。
  • hg add filename filenameをローカルリポジトリに追加。
  • hg commit 変更をローカルリポジトリにコミットする。この時、オプションである-u usernameでコミットしたユーザを、-m "文字列"でエディタを開かずにメッセージを追加できます。
  • hg remove filename filenameを削除ののち、次回のコミット時にリポジトリから削除。
  • hg forget filename filenameをローカルリポジトリから外す。ファイル自体は消さない。
  • hg rename from to ファイル名をfromからtoに変更する。
  • hg push ローカルリポジトリをリモートにあるリポジトリへ送る。
  • hg pull リモートリポジトリからローカルリポジトリへコピー。 -uをpullの後ろにつけることで、即時にローカルリポジトリを更新。hg pull -uで1セットという感じ。他の使い方は知らん。
ざっとこんな感じ。設定ファイルは.hg/hgrcあたりをいじるのだが、正直コミット時のオプションで何とかなっているのでほとんど触ってない。

2010年5月11日火曜日

pacoで快適なパッケージ管理を

Check
以前 make install したプログラムを消すのに苦労したことがある。

基本的にパッケージマネージャ経由でインストール出来ればいいのだけど、対応していないものも多い。
さらに、make uninstallがなかったりすると泣きたくなる。

そこで、make install時のログを取っておいてくれて、消したいときも簡単な操作でアンインストールを行ってくれるpacoというソフトを入れた。

使い方は、"とってもやさしいpacoの使い方"の情報が大いに役立った。

インストールを記録したいときは、
$ paco -lD make install
※-lDオプションをつけることで、「パッケージ名何にすっべかなー」と迷うこと無く、カレントディレクトリ名が登録されます。

消したいときは、
$ paco -r パッケージ名
となる。まだ消したことないけど。

パッケージ名が分からないときは、
$paco -1a
でインストールされているパッケージ名一覧が出るようです。

2010年5月10日月曜日

Cygwin+wxWidgetsでGLWindow

Check
ソースコードの管理はMercurial+bitbucketを使用して、自宅と学校で一元化に成功した。

次はプラットフォーム間の差異を吸収しちゃろうということで、おなじみのwxWidgetsを使った。CygwinでのwxWidgets導入に関してはソフトとハードの交差点さんの記事が大変参考になった。
VCからコンパイルするときはオプションのテキストファイルを直接いじったのだが、今回は./configureの時に引数で渡すだけという楽ちんなものだった。
 打ち込むコマンドは以下。

./configure --build=i686-pc-mingw32 --disable-threads --disable-precomp-headers --without-expat
私の場合はさらにOpenGLを使うので --with-opengl というオプションも追加してある。

2010年5月7日金曜日

CygwinでGLWindow

Check
ようやくCygwin+EmacsでOpenGL開発ができるようになってきた。

makefileが曲者で、Cygwin上で動かすためにはリンク時に-mno-cygwinというオプションが必要だということがわかった。
#makefile

VPATH = /usr/include/opengl
CPPFLAGS = -I /usr/include/opengl

libss := -lglut32 -lglu32 -lopengl32

main: main.o
main.o: main.cpp

%.o: %.cpp
$(COMPILE.cpp) $(OUTPUT_OPTION) $<

%: %.o
$(LINK.o) $^ -mno-cygwin $(libss) -o $@

.PHONY: clean
clean:
rm -f *.o *.exe
$(LINK.o)の行にある-mno-cygwinというオプションを指定することでリンカが-lglut32のリンク先を見つけてくれるようになります。これがないと-lglut32が見つかりませんというメッセージが出てリンクエラーとなる。

makefileについては調べながら勉強中みたいなものなので、ひどい書き方になってるかもしれませんがご容赦ください:-)

以下はソースコード。

#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>a

const char *APP_NAME = "GL Window on Emacs!!";

void Display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glutSwapBuffers();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(500, 500);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);

    glutCreateWindow(APP_NAME);
    glutDisplayFunc(Display);

    glClearColor(1,1,1,0);
    glutMainLoop();

    return 0;
}
実行例

2010年5月5日水曜日

GWやったこと

Check
いろいろやりすぎてブログぜんぜん書いてねえ・・・。

以下、GW中の生活の様子を簡単にまとめる。

読書
PC・プログラム
  • PuTTYでWindowsからLinux鯖にアクセスしてそこでemacs使って簡単なプログラムをビルドできるようになった。
  • Makefileを書いて、作業ディレクトリで"make"と打つだけでビルドできるようになった。
  • glutを使用したウィンドウをlinux上で作成することができるようになった。
  • Debian(lenny)上で日本語の表示(jfbterm)と入力(uim-fep+anthy)ができるようになった。
  • flexなる字句解析用のジェネレータ?を使ってみた。
  • プライベート用のWinXPマシンが死亡。原因は不明だが、このままパーツだけ取ってさよならになりそう。
私生活
  • 京都のゲーム会社に4月から入社した友人がGW休暇で帰ってきたのでいろいろ面白い話をきいた。
  • 部屋を掃除して、本を50冊ほど売ってきた。
とにかく継続して何かを続けること、学生であるこの1年はがっつりプログラミングに身を捧げることを誓った連休でした。

2010年5月1日土曜日

UNIXタイムをYmdHMSに変換する

Check
On Python.
SquidのアクセスログがUNIXタイムで非常に見づらかったので、わかりやすい表示に変換してみた。
import time
UNIXTIME = 1234567890 
time.asctime(time.gmtime(UNIXTIME))
#>>> 'Fri Feb 13 23:31:30 2009'