「見つめていてもご飯皿はいっぱいになったためしがない!」
― スヌーピー
2013-05-13
■[linux][メモ] ディスクを別マシンに引っ越したらeth0が消え去った件
常識なんだろうけど自分用メモ。
とあるマシンで動いていたUbuntu12.04のディスクを、そのまま別マシンに挿したらeth0が消え去ってネット接続ができなくなって30分ほど嵌まった。
結論としては、eth0がeth1になっていた。それを確かめるためにはifconfigでは出力されないのでip linkコマンドを使う必要がある
$ ip link 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
■[linux][nasm][cmake] x86_64上のLinux上で、x86(32bit)のビルド環境を整えた
数日前からx86のアセンブリ言語の勉強を始めてみた。とりあえず、x86_64は面倒臭いのでx86からはじめることにして、開発環境を整える。x86_64は面倒くさいので、当面x86で進めることにする。アセンブラはnasm、ビルド管理にはCMakeを使う。
環境
OSはUbuntu Linux 12.04
$ nasm -v NASM version 2.09.10 compiled on Oct 17 2011 $ cmake --version cmake version 2.8.7
ビルド
まず、最初のプログラムとして helloworld.asm を準備。
;;; Borrowed from http://cs.lmu.edu/~ray/notes/nasmexamples/ ;;; helloworld.asm global main extern printf section .text message: db 'Hello, World', 10, 0 main: ;; call libc printf() push message call printf add esp, 4 ;; call exit(0) mov eax, 1 mov ebx, 0 int 80h
最初にlibcの中のprintf()関数を呼び出し、次にシステムコールのexit()関数を呼び出している。
さて、次に、これをアセンブル・リンクするためのCMakeLists.txtを準備する。あまりまとまった説明が無いので、インストールされたCMakeのファイルを読んだりして調べるハメになった。
# CMakeLists.txt cmake_minimum_required(VERSION 2.8) include (CheckFunctionExists) include (CheckIncludeFiles) set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMake" ${CMAKE_MODULE_PATH}) if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") set(CMAKE_ASM_NASM_OBJECT_FORMAT "elf32") else() message(ERROR "This CMakeLists.txt works only on Linux") endif() set(CMAKE_ASM_NASM_LINK_EXECUTABLE "gcc -m32 <OBJECTS> -o <TARGET> <LINK_LIBRARIES>") enable_language(ASM_NASM) add_executable(helloworld helloworld.asm)
とりあえずLinux上でgccを使ってリンクすることを前提にしている。というか上記のプログラム自体、Linuxじゃないと動かないし(externで宣言している関数の名前にアンダースコアが無い点およびシステムコールを呼んでいる点)。
最後に、32ビット版libcをインストールしておく必要がある。
$ sudo apt-get install libc6-i386 libc6-dev-i386
これで準備が整ったはず。ビルドディレクトリを別に作成し、ビルドしてみる。
$ mkdir /tmp/nasm-build $ cd /tmp/nasm-build $ cmake <ソースディレクトリ> -- The C compiler identification is GNU -- The CXX compiler identification is GNU -- Check for working C compiler: /usr/bin/gcc -- Check for working C compiler: /usr/bin/gcc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- The ASM_NASM compiler identification is unknown -- Found assembler: /usr/bin/nasm -- Configuring done -- Generating done -- Build files have been written to: /tmp/nasm-build $ make Scanning dependencies of target helloworld [100%] Building ASM_NASM object CMakeFiles/helloworld.dir/helloworld.asm.o Linking ASM_NASM executable helloworld [100%] Built target helloworld $ ./helloworld Hello, World
動いた!
2013-05-07
■[clojure] macportsのleiningenが壊れてる?
メモ。macportsでインストールしたclojure 1.4.0とleiningenを使おうとしたら下記のエラーが出る。
結論から言うと、leiningenは削除して自前でインストールすることによって動作した。動いたのでこれ以上追求する興味は無し。以上!
$ lein run Exception in thread "main" java.lang.RuntimeException: java.lang.NoSuchMethodError: clojure.lang.KeywordLookupSite.<init>(ILclojure/lang/Keyword;)V at clojure.lang.Util.runtimeException(Util.java:165) at clojure.lang.Compiler.eval(Compiler.java:6476) at clojure.lang.Compiler.eval(Compiler.java:6431) at clojure.core$eval.invoke(core.clj:2795) at clojure.main$eval_opt.invoke(main.clj:296) at clojure.main$initialize.invoke(main.clj:315) at clojure.main$script_opt.invoke(main.clj:339) at clojure.main$main.doInvoke(main.clj:426) at clojure.lang.RestFn.invoke(RestFn.java:457) at clojure.lang.Var.invoke(Var.java:413) at clojure.lang.AFn.applyToHelper(AFn.java:172) at clojure.lang.Var.applyTo(Var.java:518) at clojure.main.main(main.java:37) Caused by: java.lang.NoSuchMethodError: clojure.lang.KeywordLookupSite.<init>(ILclojure/lang/Keyword;)V at leiningen.util.paths$legacy_native_path.<clinit>(paths.clj:32) at leiningen.util.paths__init.load(Unknown Source) at leiningen.util.paths__init.<clinit>(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:249) at clojure.lang.RT.loadClassForName(RT.java:2030) at clojure.lang.RT.load(RT.java:417) at clojure.lang.RT.load(RT.java:398) at clojure.core$load$fn__4610.invoke(core.clj:5386) at clojure.core$load.doInvoke(core.clj:5385) at clojure.lang.RestFn.invoke(RestFn.java:408) at clojure.core$load_one.invoke(core.clj:5200) at clojure.core$load_lib.doInvoke(core.clj:5237) at clojure.lang.RestFn.applyTo(RestFn.java:142) at clojure.core$apply.invoke(core.clj:602) at clojure.core$load_libs.doInvoke(core.clj:5271) at clojure.lang.RestFn.applyTo(RestFn.java:137) at clojure.core$apply.invoke(core.clj:602) at clojure.core$require.doInvoke(core.clj:5352) at clojure.lang.RestFn.invoke(RestFn.java:408) at leiningen.core$loading__4414__auto__.invoke(core.clj:1) at leiningen.core__init.load(Unknown Source) at leiningen.core__init.<clinit>(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:249) at clojure.lang.RT.loadClassForName(RT.java:2030) at clojure.lang.RT.load(RT.java:417) at clojure.lang.RT.load(RT.java:398) at clojure.core$load$fn__4610.invoke(core.clj:5386) at clojure.core$load.doInvoke(core.clj:5385) at clojure.lang.RestFn.invoke(RestFn.java:408) at clojure.core$load_one.invoke(core.clj:5200) at clojure.core$load_lib.doInvoke(core.clj:5237) at clojure.lang.RestFn.applyTo(RestFn.java:142) at clojure.core$apply.invoke(core.clj:602) at clojure.core$load_libs.doInvoke(core.clj:5271) at clojure.lang.RestFn.applyTo(RestFn.java:137) at clojure.core$apply.invoke(core.clj:604) at clojure.core$use.doInvoke(core.clj:5363) at clojure.lang.RestFn.invoke(RestFn.java:408) at user$eval1.invoke(NO_SOURCE_FILE:1) at clojure.lang.Compiler.eval(Compiler.java:6465) ... 11 more
2013-05-03
■[node.js][express][require.js] Node.js + express + require.jsを使ってGoogle Mapを読み込んでみたメモ。
Node.js + express + require.jsを使ってGoogle Mapを読み込んでみた。なお、jqueryのプラグインとしてjquery-ui-mapというものがあるが、これは今回用いなかった。理由は、APIがラップされてしまっていて、本家のドキュメントが直に適用できなくなってしまっているためだ。自分のプロジェクトでGoogle Mapを使うのは初めてのため、APIを生で使いたかった。
まず、node.jsを初期化する
$ express googlemap-test create : googlemap-test create : googlemap-test/package.json create : googlemap-test/app.js create : googlemap-test/public create : googlemap-test/public/javascripts create : googlemap-test/public/images create : googlemap-test/public/stylesheets create : googlemap-test/public/stylesheets/style.css create : googlemap-test/routes create : googlemap-test/routes/index.js create : googlemap-test/routes/user.js create : googlemap-test/views create : googlemap-test/views/layout.jade create : googlemap-test/views/index.jade install dependencies: $ cd googlemap-test && npm install run the app: $ node app
ここでは、require.jsとjQueryが結合された require-jquery.js を使う。本家からサンプルパッケージをダウンロードして、その中からrequire-jquery.jsを取り出し、public/javascripts に置いておく。
次に、トップページで読み込むindex.jsを作成する。Require.jsモジュールとして作成してある。
// public/javascripts/index.js define(['jquery'], function(jquery) { /** * Callback function : update #lat and #lng element value. */ function updateLatLng(map) { latlng = map.getCenter(); console.log(latlng); $('#lat').text(latlng.lat()); $('#lng').text(latlng.lng()); } /** * Callback function for an 'init' event of Google Map */ function gmap_init() { var mapOptions = { zoom : 15, center : new google.maps.LatLng(35.6903, 139.7006), mapTypeId :google.maps.MapTypeId.ROADMAP, }; var map = new google.maps.Map($('#map-canvas')[0], mapOptions); // add event listener google.maps.event.addListener(map, 'center_changed', function() { updateLatLng(map); }); updateLatLng(map); } /** * Load Google Map Asynchronously */ function load_gmap_async() { // gmap's callback function must be an global function window.gmap_init = gmap_init; // Asynchronously load Google Map var api_key = 'AIzaSyAVjMnXeLfuiBPBC4n9qpbyVMhYhZ0hQqs'; var params = $.param({key : api_key, sensor : 'true', callback : 'gmap_init'}); var script = document.createElement('script'); script.type = 'text/javascript'; script.src = 'http://maps.googleapis.com/maps/api/js?' + params; document.body.appendChild(script); } load_gmap_async(); });
次に、実際に表示されるHTMLをJadeテンプレートで作成。
// views/index.jade extends layout block content h1 jQUeryとRequire.jsによる地図テスト div#map-canvas(style="width : 600px; height : 300px;") div p 緯度 span#lat p 経度 span#lng script. var require = { urlArgs : 'bust=' + (new Date()).getTime(), baseUrl : 'javascripts', }; script(type="text/javascript", src="javascripts/require-jquery.js", data-main="index.js")
最後に npm install を実行した後、nodeサーバーを走らせる。
$ npm install
$ node app
ブラウザで http://localhost:3000/ を開く。
できた!
2013-03-13
■ id:naoyaさんの「入門Chef Solo - Infrastructure as Code」を買った
ちょうどChefを使ってシステムを組もうとしているところだったので、id:naoyaさんのツイート
をみて、脊髄反射で買いました。
| 入門Chef Solo - Infrastructure as Code | |
| 伊藤直也 伊藤直也 2013-03-11 売り上げランキング : 2 Amazonで詳しく見る by G-Tools | |
そしてタイトル画像がないじゃないか!!
感想としては、
- 良くも悪くも、KDP時代らしいスピード感に溢れた本。
- 自分にとっては、要所要所で躓きやすいポイントが抑えられていて、かつ冗長なところは少なく、非常に読みやすい本だった。
- 対象読者としては、Chefに挑んで玉砕した人。Chefの本家ドキュメントを英語で読もうと思えば読めるがメンドイ、とっかかりが欲しい、というレベルの人。いわゆるWeb開発周りの常識というか暗黙の前提知識を共有できている人向け。
- Chefというものが全く始めての人は、もう少し丁寧な解説本が出るのを待った方が良いかも。
- 「Rubyの知識はあんまり要りません」と書かれているが、知らないと厳しい。書けないけど読める、または類似のスクリプト言語(Perl, Python等)は普通に書けるがRubyは余り詳しくない、という程度の知識が必要だと思う
といったところでしょうか。
価格が600円くらいだともっとよかったです! (^q^)


