本を読む

読書やコンピュータなどに関するメモ

「21世紀少年」上

 「楳図かずおが描いていたら傑作だった」と言われる「20世紀少年」の最終章が、題名を変えて登場。

21世紀少年 上 (1)
21世紀少年 上 (1)
posted with amazlet on 07.05.31
浦沢 直樹
小学館 (2007/05/30)
売り上げランキング: 7

「私家版魚類図譜」

 「私家版鳥類図譜」に続き、今度は魚を軸にしたオムニバス短編集。

 人魚の悲恋を描いた深海魚ネタ、古代史ネタ、破滅後の近未来ネタなど、「鳥類」同様さまざまな角度から物語をつむいでくれて、満足。

 が、さまざまに飛んで行く鳥類に対して、魚類だと不安とか悩みとかそっちのほうにイメージが進んでいくなと思った。あと、「へんないきもの」の影響は(昇華されているけど)あるなと思った。

 そうそう、サラリーマンとしては、「奇妙な味の短篇」系の「魚の夢を見る男」が最も印象に残った。

私家版魚類図譜
私家版魚類図譜
posted with amazlet on 07.05.30
諸星 大二郎
講談社 (2007/03/23)
売り上げランキング: 685

「「夜のオンナ」はいくら稼ぐか?」

 「人にいえない仕事はなぜ儲かるのか?」の勢いで、同じ著者の新書を読んだ。

 本書のテーマは、ずばり風俗産業のカネの動き。「人にいえない~」は内容が整理されていてわれわれサラリーマンにも参考になるのに対して、本書は風俗産業の経済をそのまま説明していて、「闇金ウシジマ君」のようにエンターテインメントとして読めるのが特徴。

 それにしても、その世界でのすべてのカネは、そのスジの方々に行き着くのですな。食物連鎖。

「夜のオンナ」はいくら稼ぐか?
門倉 貴史
角川書店 (2006/07)
売り上げランキング: 77702

「人にいえない仕事はなぜ儲かるのか?」

 たぶん、狙いは裏「さおだけ屋はなぜ潰れないのか」だったのだろうと思う。序章でも、悪徳さおだけ屋の事例を紹介しているし。

 「さおだけ屋~」の会計に対して、本書で扱っているのは税。フリーランスな人たちの節税や、サラリーマンの副業について解説したあと、後半は得意のアンダーグラウンドビジネスを税の面から解説している。

 さらに最後は、税制として、「支出税」を唱えている。利点と欠点(やっぱ実現性はとか)はさておき、理論としては面白い。

 便乗本と思いきや、けっこう勉強になってしまいました。

人にいえない仕事はなぜ儲かるのか?  角川oneテーマ21
門倉 貴史
角川書店 (2005/11/10)
売り上げランキング: 173443

「千年、働いてきました―老舗企業大国ニッポン」

 百年以上続いている老舗企業を取材してまとめたルポ。

 「この道ひとすじ、一つの味を守って続けてきました」というような話…ではない。むしろ、会社存亡の危機を経たりして、老舗の技術を違う分野で開花させた企業を主に扱っている。

 携帯のモーターに生かされる貴金属会社の技術、自動車やPCのゴミの山を鉱山として貴金属を抽出する銅山の製錬会社、羊毛を刈るのに使われる醤油会社のバイオ技術、など、先端的な分野で活躍する老舗の技術力が、人間味のある筆致で紹介されている。

 正直なところ、読む前はあまり期待していなかったのだけど、読んでみたら拾い物だった。

千年、働いてきました―老舗企業大国ニッポン
野村 進
角川書店 (2006/11)
売り上げランキング: 4060

Re: FizzBuzzでLisp脳

Karetta|Gaucheプログラミング|「Lisp脳」の謎に迫る - Schemeプログラマの発想

> Schemeプログラマの発想の一端がお分かりいただけたでしょうか?

 なるほど、本物のSchemeプログラマの人はこういうふうに発想するのか。すごく参考になる。

 ちょっとLispをかじった素人の私の場合、とりあえず、何と何をconsするかを中心に考えてしまうのだよなぁ。

 たとえば、FizzBuzzで、こういう関数を作るとする。

(fizzbuzz 100)

 これは、nのときの演算結果と、n - 1のfizzbuzzをconsしてやればいいと考える。

(define (fizzbuzz n)
  (cons
    ; なんか演算した値
    (fizzbuzz (- n 1)) ))

 このままだと停止しない。0のときに()を返せば、1のときは演算結果と()をconsして、1要素のリストになる。

(define (fizzbuzz n)
  (if (zero? n)
    ()
    (cons
      ; なんか演算した値
      (fizzbuzz (- n 1)) )))

 続いて、「なんか演算した値」の部分を埋めてみる。

(define (fizzbuzz n)
  (if (zero? n)
    ()
    (cons
      (cond ((zero? (modulo n 15)) "FizzBuzz")
            ((zero? (modulo n 3)) "Fizz")
            ((zero? (modulo n 5)) "Buzz")
            (else n) )
      (fizzbuzz (- n 1)) )))

 末尾再帰なので、つまりはループですな。2007.8.8修正:末尾再帰でもないし、単純にループにもならない。

 元エントリのループの例と同じような構造のコードだと思う。で、実行。

(print (fizzbuzz 100))
(Buzz Fizz 98 97 Fizz Buzz 94 Fizz 92 91 FizzBuzz 89 88 Fizz 86 Buzz Fizz 83 82 Fizz Buzz 79 Fizz 77 76 FizzBuzz 74 73 Fizz 71 Buzz Fizz 68 67 Fizz Buzz 64 Fizz 62 61 FizzBuzz 59 58 Fizz 56 Buzz Fizz 53 52 Fizz Buzz 49 Fizz 47 46 FizzBuzz 44 43 Fizz 41 Buzz Fizz 38 37 Fizz Buzz 34 Fizz 32 31 FizzBuzz 29 28 Fizz 26 Buzz Fizz 23 22 Fizz Buzz 19 Fizz 17 16 FizzBuzz 14 13 Fizz 11 Buzz Fizz 8 7 Fizz Buzz 4 Fizz 2 1)

 逆順はダメですか。じゃnreverse、いやSchemeなのでreverse!。

(define (fizzbuzz n)
  (define (fb n)
    (if (zero? n)
      ()
      (cons
        (cond ((zero? (modulo n 15)) "FizzBuzz")
              ((zero? (modulo n 3)) "Fizz")
              ((zero? (modulo n 5)) "Buzz")
              (else n) )
        (fb (- n 1)) )))
  (reverse! (fb n)) )

seqコマンドを勝手にFizzBuzz化

 いまさらながらFizzBuzz問題ネタ。

 seqコマンド自身を、再コンパイルなしにFizzBuzz化してみるという、アスペクト指向(嘘)な方法を試した。Linux限定かもしれない。

 まず、こんな感じでfizzbuzzize.cを書く。

// fizzbuzzize.c
#include <stdio.h>
#include <math.h>
#include <stdarg.h>

int printf(const char* format, ...)
{
    va_list ap;
    char buf[8];
    double data;

    va_start(ap, format);
    data = va_arg(ap, double);

    fputs((fmod(data, 15) == 0) ?  "FizzBuzz" :
          (fmod(data, 3) == 0)  ?  "Fizz" :
          (fmod(data, 5) == 0)  ?  "Buzz" :
                                   (snprintf(buf, 8, "%g", data), buf)
          ,stdout);
}

 これを.soにコンパイル。

$ gcc -shared -fPIC -o fizzbuzzize.so fizzbuzzize.c

 あとは、seq 100を実行する。

$ LD_PRELOAD=./fizzbuzzize.so \
seq 100
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
(以下略)

mixi日記を勝手に絵文字化するブックマークレット

 mixi日記の文中にある「(笑)」を、顔文字アイコンに変換するブックマークレットは、こんな感じかな。

javascript:void($$('.h12').each(function(v,i){v.innerHTML=v.innerHTML.replace(/[((]笑[)]?)/g,'<img src="http://img.mixi.jp/img/emoji/50.gif" alt="わーい(嬉しい顔)" width="16" height="16" class="emoji" border="0">')}))

 Firefox 2.0で動作確認。もちろん、データが書き換わるわけではなくて、表示が変わるだけだ。

 正規表現の部分を変えると、いろいろなパターンに対応できるはず。ただし、「w」の1文字を変換させると、えらいことになりそうだ。

 元ネタは「IT戦記 - mixi の絵文字を無効化する JavaScript」。やってることは逆だけど。

テキストからOpenOffice.org Impressファイルを作るツール

 アウトライン形式のプレーンテキストから、OpenOffice.org Impress(PowerPoint互換のソフト)の.odpファイルを生成するツールを、Perlで試作した。OpenOffice::OODocモジュールを使っている。

背景

 私がプレゼン資料とか作るときには、まずテキストファイルにアウトライン形式で構成を下書きしている。それをPowerPointやOpenOffice.orgのアウトラインモードに貼りつけてから、仕上げる。

 貼りつけるとき、PowerPointでは、こんな(↓)感じのテキストにしておくと、構造付けができる(<tab>とある部分はタブ)。

ページタイトル1
<tab>箇条書き項目1
<tab><tab>箇条書き小項目1-1
<tab><tab>箇条書き小項目1-2
<tab>箇条書き項目2
ページタイトル2

 しかし、OpenOffice.org Impressだと、タブによる構造づけが効かない。そこで、変換ツールを作ってみた。

入力形式

 PukiWikiやYukiWiki、はてなダイアリーなどで使われている形式をベースにしている。

  • 1項目1行
  • ページのタイトルは、行頭に「*」
  • 箇条書き項目は、行頭に「-」。「-」の数でレベルを表わす
  • それ以外の行は無視(空行など)

 実例はこんな(↓)感じ。

*ページタイトル1
-箇条書き項目1
--箇条書き小項目1-1
--箇条書き小項目1-2
-箇条書き項目2
*ページタイトル2

事前に必要なもの

 雛形になるOpenOffice.org Impressのファイルを用意しておく。

  • ファイル名は「template.odp」
  • 全1ページ
  • 箇条書きスタイルを選んえ、内容を適当に入れておく

 あともちろん、PerlとOpenOffice::OODocモジュール、その依存モジュールは必要。

決めうちなもの

 手抜きのため、以下の点は決めうちにしている。

  • 入力テキストは標準入力のみで、文字コードはUTF-8
  • 雛形ファイルは、カレントディレクトリの「template.odp」
  • 出力ファイルは、カレントディレクトリの「output.odp」

 実行はこんな(↓)感じ。

$ perl outline2odp.pl < sample.txt

outline2odp.plのスクリプト実物

#!/usr/bin/perl
use strict;
use warnings;
use OpenOffice::OODoc;

our $VERSION = '0.01';

localEncoding 'utf-8';

my $tmplfile = 'template.odp';
my $outfile = 'out.odp';
my $tmplpage = 1;

my $doc = MyOdp->new(file => $tmplfile);

$doc->clear_title_text($tmplpage);
$doc->clear_list_element($tmplpage);

my $page = $tmplpage;
while (<>) {
    chomp;
    if (my ($title) = m/^\*\s*(.*)$/) {
	$doc->copy_page($tmplpage, ++$page);
	$doc->set_title($page, $title);
    } elsif (my ($level, $text) = m/^(-+)\s*(.*)$/) {
	$doc->append_list_element($page, $text, length($level));
    }
}

$doc->save($outfile);


package MyOdp;
use base qw( OpenOffice::OODoc::Document );

sub copy_page {
    my $self = shift;
    my ($source, $dest) = @_;

    my $p = $self->getElement(page_xpath($source)) or die;
    my $p2 = $p->copy();
    $p2->paste(last_child => $self->getElement('//office:presentation'));
    $self->setAttributes($p2, 'draw:name' => "page$dest");
}

sub set_title {
    my $self = shift;
    my ($page, $text) = @_;

    my $t = $self->getElement(title_xpath($page)) or die;
    my $e = $self->createParagraph($text, 'P1');
    $e->paste(last_child => $t);
}

sub clear_title_text {
    my $self = shift;
    my ($page) = @_;
    $self->replaceElement(title_xpath($page), 0,
                         $self->createElement('<draw:text-box />'));
}

sub clear_list_element {
    my $self = shift;
    my ($page) = @_;
    $self->replaceElement(list_xpath($page), 0,
                         $self->createElement('<draw:text-box />'));
}

sub append_list_element {
    my $self = shift;
    my ($page, $text, $level) = @_;

    my $t = $self->getElement(list_xpath($page)) or die;
    my $list = create_list_element($self, $text, $level);
    $list->paste(last_child => $t);
}

sub create_list_element {
    my $self = shift;
    my ($text, $level) = @_;

    my $e = $self->createParagraph($text, ('P' . ($level + 2)));
    while ($level--) {
	my $li = $self->createElement('text:list-item');
	$e->paste(last_child => $li);
	my $ul = $self->createElement('text:list');
	$li->paste(last_child => $ul);
	$e = $ul;
    }
    $self->setAttribute($e, 'text:style-name' => 'L1');
    $e;
}

sub page_xpath {
    my ($page) = @_;
    sprintf('//draw:page[@draw:name="page%d"]', $page);
}

sub title_xpath {
    my ($page) = @_;
    page_xpath($page) .
	'/draw:frame[@presentation:class="title"]/draw:text-box';
}

sub list_xpath {
    my ($page) = @_;
    page_xpath($page) .
	'/draw:frame[@presentation:class="outline"]/draw:text-box';
}

Ubuntu 7.04でcommand-not-foundが便利

 Ubuntu Linux 7.04にしてみましたシリーズ。

 驚いたのが、bash のコマンドラインで、インストールしていないプログラムを実行しようとしたら、候補のパッケージまで表示されたこと。こりゃ便利だ。

$ traceroute
プログラム 'traceroute' は以下のパッケージで見つかりました:
 * traceroute-nanog
 * traceroute
次の操作を試してください: sudo apt-get install <選択したパッケージ>
bash: traceroute: command not found

 調べてみると、/etc/bash.bashrc で command_not_found_handle という関数を定義している。

if [ -x /usr/bin/command-not-found ]; then
        function command_not_found_handle {
                /usr/bin/command-not-found $1
                return $?
        }
fi

 man bashしてみたところ、command_not_found_handleは、コマンドが見つからないときに実行される関数だとか。へー、知らなかった。

 /usr/bin/command-not-foundはcommand-not-foundパッケージに含まれるようだ。

$ dpkg -S /usr/bin/command-not-found 
command-not-found: /usr/bin/command-not-found

 実体はPythonのスクリプト。

$ file /usr/bin/command-not-found 
/usr/bin/command-not-found: python script text executable

 中を見ると、実際の処理はCommandNotFoundパッケージを呼んでいる。

 /usr/share/doc/command-not-found/READMEを見たら、解説サイトが紹介されていた。

 どうやら、/usr/share/command-not-foundの下にあるデータベースを呼んでいるらしい。で、これらはいまの実装では、特にaptとかの連係とかはなくて、固定的なデータのように見える。なるほど。

「一生モノの人脈力」

 ブログめぐり中に、外資系企業のすごい方(その1その2)が「真似できない」という意味の感想を書いていたので、気になって読んでみた。

 基本的には、貧しい家庭に生まれ育った自分がいかに成り上がったか、という話。だけど、精神論とか苦労話とかのウェットな部分を抜きにして「人脈がすべて!」という線で展開していくのがアメリカ~ンな感じだった。

 人脈術としては、こんな(↓)ところが印象に残った。

  • 人生の目標をさだめ、そのために必要な人たちに積極的にコンタクトしていく
  • 人脈作りのためのリストマニアになり、用途別に整理しておく
  • 懇親パーティの前には、事前に主催者にネゴして参加者リストを入手し、それぞれのバックグラウンドを調査して臨む
  • 名刺交換した日は、誰よりも早くフォローの連絡を入れる
  • ビル・クリントンは、学生時代から政治家を志し、パーティで会った人はその場でメモしていた
  • 連絡を絶やさないように、定期的に連絡をとる

 参考になるという部分もあれど、やはりそれ以上に狩猟民族的な人脈術にアテられたというのが、日本の一般サラリーマン私の感想だ。さらに、これらの項目に並行して、「誠意が重要」といった精神論を訴えるのが、むしろトップビジネスマンの恐いところだと思った。

 そんなこんなを総合した意味で、とても面白かった。

一生モノの人脈力
一生モノの人脈力
posted with amazlet on 07.05.06
キース・フェラッジ タール・ラズ 森田由美
ランダムハウス講談社 (2006/07/20)
売り上げランキング: 8536

「仮面ライダーSPIRITS」12巻

 ZXが特訓のすえ、新必殺技を披露。Xライダーとコンラッドは、コンビネーションでカッコよく決めてくれる。

 一方、V3は悲壮な戦いに向かう。無事でいてほしい。

 滝や村雨しずかの行方が次巻のカギだろうか。やや地味めの巻。

仮面ライダーSPIRITS 12 (12)
石ノ森 章太郎 村枝 賢一
講談社 (2007/04/23)
売り上げランキング: 73

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad