Hatena::ブログ(Diary)

英語とプログラミング気まぐれ日記 このページをアンテナに追加 RSSフィード

2013-12-17 はてなブログに移動しました

2012-01-13

[] "unsigned long long int"型の変数の値が負のとき

メモ。

test.cc

#include <iostream>
#include <iomanip>
#include <limits> 

int main()
{
    unsigned long long int a = 1;
    unsigned long long int b = 2;
    unsigned long long int c = -1;

    std::cout << std::setw(20) << std::right <<  "1 - 2 = " << a - b << std::endl;
    std::cout << std::setw(20) << std::right <<  "-1 = " << c << std::endl; 
    std::cout << std::setw(20) << std::right <<  "ULLONG_MAX = " << ULLONG_MAX << std::endl;
    return 0;
}

実行

$ g++ test.cc
$ ./a.out
            1 - 2 = 18446744073709551615
               -1 = 18446744073709551615
       ULLONG_MAX = 18446744073709551615

負数は2の補数で表現されるので、2進数だと-1は全ビットが1となる。

その値の型をunsignedにすると、当然ながら最上位ビットも通常の値と解釈されるので、その型のMAX値と同値となる。

上記のtest.ccでは、"unsigned long long int"型の「-1」と"unsigned long long int"型のMAX値を表すULLONG_MAXが同じ値であることを示した。

ULLONG_MAXの定義は /usr/include/i386/limits.h に書かれている

$ grep ULLONG_MAX /usr/include/i386/limits.h
#define ULLONG_MAX      0xffffffffffffffffULL   /* max unsigned long long */
#define UQUAD_MAX       ULLONG_MAX

2011-12-24

[][] UNIXネットワークプログラミング第2版 Vol.1 買った

いろいろ忘れそうなので、その都度メモしながら読む。

UNIX Network Programming, Volume 1, Second Editionが2011/12現在のサポートページ(本に書かれているリンクとは異なるので注意。)。


第2版と第3版の違い

第2版は大分内容が古くなっているようなので注意。

買ってから気付いたが、、日本語訳の最新版は原著の第2版。

原著の最新版は第3版。素直に英語版を買ったほうがよさげ。。。。

第3版のサーポートページ: UNIX Network Programming

第3版では、XTIは廃れたので丸ごと削られている

というこは、日本語訳版 第2版のp.735〜p.850の115ページ分は読まなくてよい。

第3版では、トランザクションTCP(T/TCP)も削られている

日本語訳版 第2版だと、p.359で取り上げられている。

第3版では、SCTPという比較的新しいトランスポートプロトコルの説明に3章費している
第3版では、例題の検証に使用したOSが新しくなっている

これ重要。第2版のサンプルコードだとmakeが通らないことが多いみたい。(第3版でも修正が必要な箇所はあるようだが、新しいコードを使うに越したことはない。)

第3版も買えばいいんですね!!!!!!!!!!!!!!


プログラムの実行環境

以下の環境でサンプルコードをビルドした。

OS

Mac OS X 10.5.8


メモ

サンプルプログラムの./configure時のエラー
  • npv13e/libfree
    • mcast_leave.c

問題: 「error: argument ‘size’ doesn’t match prototype」と言われてmakeが失敗する。

$ gmake 
gcc -I../lib -g -O2 -D_REENTRANT -Wall   -c -o inet_ntop.o inet_ntop.c
inet_ntop.c: In function ‘inet_ntop’:
inet_ntop.c:61: error: argument ‘size’ doesn’t match prototype
/usr/include/arpa/inet.h:99: error: prototype declaration
gmake: *** [inet_ntop.o] Error 1

解決策: あとで調べて追記する。

参考ページ: あとで調べて追記する。

2011-04-03

[] カーネルの再構築

以下の作業中にカーネルの再構築が必要になったので、方法を調べて実施する。

jail内でのmount - 英語とプログラミング気まぐれ日記


現在のカーネルのバージョンを確認しておく

この作業は必須ではない。念の為。

$ sysctl kern.version
kern.version: FreeBSD 7.3-RELEASE-p2 #0: Mon Jul 12 19:04:04 UTC 2010
    root@i386-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC

使用されているカーネルモジュールを調べる。

$ kldstat 
Id Refs Address    Size     Name
 1    5 0xc0400000 a220cc   kernel
 2    1 0xc0e23000 6a500    acpi.ko
 3    1 0xc277a000 4000     nullfs.ko
 4    1 0xc27b6000 4000     fdescfs.ko

カーネルモジュールは /boot/kernel/ディレクトリ 以下に大量に存在するが、現在使用されているのは"acpi"、"nullfs"、"fdescfs"だけであることが分かった。


これらのモジュールだけコンパイルされるよう設定する

カーネルの設定ファイルを編集する。

ここでは、GENERICカーネルの設定ファイル "/usr/src/sys/i386/conf/GENERIC" をコピーして編集することにする。

GENERICカーネルの設定ファイル(GENERIC)(CUSTOM_NULLFS)にコピー
$ cd /usr/src/sys/i386/conf/
$ sudo cp GENERIC CUSTOM_NULLFS

コピーしたファイルを編集。
kldstatで調べたモジュール名を空白区切りで指定する。
$ sudo vim CUSTOM_NULLFS
makeoptions  MODULES_OVERRIDE="linux acpi/acpi nullfs fdescfs"
    ※ モジュール名は /usr/src/sys/modules 以下にあるディレクトリ名らしい

カーネルコンパイル

configの実行
コンパイル用のディレクトリが作成される
$ cd /usr/src/sys/i386/conf/
$ sudo config CUSTOM_NULLFS

コンパイル用のディレクトリに移動
$ cd /usr/src/sys/compile/CUSTOM_NULLFS

コンパイルの実行
$ sudo make depend
$ sudo make

現在のカーネルと入れ替える

$ sudo make install

再起動して、カーネルが変更されていることを確認。

$ sysctl kern.version
kern.version: FreeBSD 7.3-RELEASE-p4 #0: Sun Apr  3 20:26:57 JST 2011
    root@test-freebsd.dip.jp:/usr/src/sys/i386/compile/CUSTOM_NULLFS

おお、うまくいったみたい。

参考資料

Q&Aでわかる!インターネットサーバの技 FreeBSD Tips Collection:p.40 を参考にした

OCN繝悶Ο繧ー莠コ縺ョ繧オ繝シ繝薙せ邨ゆコ?縺ォ縺、縺?縺ヲ?ス廾CN 繝悶Ο繧ー莠コ

OCN繝悶Ο繧ー莠コ縺ョ繧オ繝シ繝薙せ邨ゆコ?縺ォ縺、縺?縺ヲ?ス廾CN 繝悶Ο繧ー莠コ

2011-03-10

[] Mojolicious を使ってみる

ものすごいドキュメントが充実してる。

Mojolicious - Perl real-time web framework


とりあえずインストール

$ cpanm Mojolicious
Fetching http://search.cpan.org/CPAN/authors/id/K/KR/KRAIH/Mojolicious-1.12.tar.gz ... OK
Configuring Mojolicious-1.12 ... OK
Building and testing Mojolicious-1.12 for Mojolicious ... OK
Successfully installed Mojolicious-1.12

とりあえず以下で感じをつかんだ

Mojolicious::Guides - The Mojolicious Guide to the Galaxy


Mojolicious::Lite でプロトタイプを作成してから、Mojolicious アプリに仕上げていく過程を以下で学んだ

Mojolicious::Guides - The Mojolicious Guide to the Galaxy

躓いたところを以下にメモしておく。

to()メソッド引数が何を意味しているか分からなかった
  package MyApp;
  use Mojo::Base 'Mojolicious';
...
    $r->any('/')->to('login#index')->name('index');
は
    $r->any('/')->to(controller => 'login', action => 'index')->name('index');
と同じ。

上記の例だと、「/」にアクセスすると、lib/MyApp/Login.pm コントローラの indexアクションメソッドが呼ばれる。

to()メソッドについて詳しくはMojolicious::Guides - The Mojolicious Guide to the Galaxyに載っている。

Mojoliciousのディレクトリ構成はMojolicious::Guides - The Mojolicious Guide to the Galaxyを参照。

テストコードをよく理解していない

とりあえずコピペで動いた。

あとでいろいろ試す。