ブログトップ 記事一覧 ログイン 無料ブログ開設

本当は怖い情報科学 RSSフィード

「見つめていてもご飯皿はいっぱいになったためしがない!」
― スヌーピー
この日記のはてなブックマーク数

2013-05-13

[][] ディスクを別マシンに引っ越したら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

[][][] 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

[] 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を使って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/ を開く。

f:id:keisukefukuda:20130503204301p:image

できた!

2013-03-13

id:naoyaさんの「入門Chef Solo - Infrastructure as Code」を買った

ちょうどChefを使ってシステムを組もうとしているところだったので、id:naoyaさんのツイート

をみて、脊髄反射で買いました。

入門Chef Solo - Infrastructure as Code
入門Chef Solo - Infrastructure as Code伊藤直也

伊藤直也 2013-03-11
売り上げランキング : 2


Amazonで詳しく見る
by G-Tools

そしてタイトル画像がないじゃないか!!

感想としては、

  • 良くも悪くも、KDP時代らしいスピード感に溢れた本。
  • 自分にとっては、要所要所で躓きやすいポイントが抑えられていて、かつ冗長なところは少なく、非常に読みやすい本だった。
  • 対象読者としては、Chefに挑んで玉砕した人。Chefの本家ドキュメントを英語で読もうと思えば読めるがメンドイ、とっかかりが欲しい、というレベルの人。いわゆるWeb開発周りの常識というか暗黙の前提知識を共有できている人向け。
  • Chefというものが全く始めての人は、もう少し丁寧な解説本が出るのを待った方が良いかも。
  • 「Rubyの知識はあんまり要りません」と書かれているが、知らないと厳しい。書けないけど読める、または類似のスクリプト言語(Perl, Python等)は普通に書けるがRubyは余り詳しくない、という程度の知識が必要だと思う

といったところでしょうか。

価格が600円くらいだともっとよかったです! (^q^)