改めて傘を買うということをしてみた。


前回傘を買ったのははるか遠い昔のこと。
しかもどこか移動中に急に雨に降られて立ち寄ったコンビニで買った安い折りたたみ傘だったかな。。
握るところが「J」の字になってるやつ
折りたたんだときの長さを測ってみたら39cmだった
カバンに入れるときはちょいナナメにしないと入らない
結構これが長持ちで大活躍だった。今までごくろうであった、私から心の勲章を送る(なぜかシンミリと・・)



デカい傘もいいけど私は折り畳み傘派



どこへ行くにも常にカバンに入れておけば天気の心配はノープロブレム


でもなぜか天気予報はよく見る


SO 人は裏腹なもの


これでいいのだ これが旅人である私の哲学


いやいや旅人じゃない基本的にインドア派


じゃあ傘あんまり使わないか



と、わけのわからないことを一通り書き終えたところで、どうしてこの傘を買ったかを今から熱弁します。



まずは折りたたんだときの長さが36.5cmだった!!


すごい すごすぎる 画期的 これでカバンにすっぽりと収まる
試しに愛用のカバンに入れてみた。完璧 ありえないほどのぴったりサイズ
もしかしたらこのカバンを意識してこの傘は作られたんじゃないかとしか思えないほどに



次に傘の骨の数が通常8本が10本に増量されていた!!


つまりタコさんがイカさんになったということですな
いやいやイカさんのは10本のうち2本は触腕ってやつですよ
いやそういうことを言いたいんじゃなくて、つまりはそれだけ丈夫になったということで風の強い日でも傘がおちょこにならずに済むことが確率的に高いゾと これはイケてるゾと



最後に色が地味だった!!


まぁなにせ傘ですから地味なものがいいんですよね
これは好みだからあまり伝わらない気がする
こんな地味な傘を私が使わずして誰が使うんだと 私が買わなきゃ売れ残るゾと 日本経済冷え込むゾと



以上、あまり伝わらない話でした。



Cで書かれたソフトウェアは、Cのソースコードをコンパイルしてインストールする作業の流れになります。
コンパイル(翻訳)とは、実行環境のCPUが理解できる命令への翻訳をすることで、インストールとはコンパイル後の実行ファイル等を適切な場所にコピーする作業になります。

 


コンパイルの流れを見てみると、コンパイラがCソースコードを解釈してオブジェクトファイルを生成し、1つ以上のオブジェクトファイルとこれらが参照しているライブラリにある関数をリンクして実行ファイルを作成します。

 


このうち、コンパイラがオブジェクトファイルを生成する段階でどのようなことが行われているかを以下に記述します。

 


1.「プリプロセスという前処理」
プリプロセス処理はCの処理とは直接関係ないのでCの文法とかは関係なく処理する。
外部ファイルの取り込み、マクロ置換、条件付き前処理など

 


2.「Cの構文解析」
トークン(識別子・キーワード・定数・文字列リテラル・演算子・他の区切子)に分解され解釈される。コメントやブランクは無視される。

 

識別子・・・変数名、関数名などユーザ定義のもので、[a-zA-Z_]の英字で始まり[a-zA-Z0-9_]の英数字がつづく(数字で始まると整数定数と判別がつかなくなる)
キーワード・・・いわゆる予約語。if, while, int, structなど・・
定数・・・整数定数、文字定数、浮動小数点定数、列挙定数
文字列リテラル・・・"Hello world."のように「"」ダブルクォートで囲まれていて展開時には文字列終端を表す\0が末尾に付加
演算子・・・ /, +, %, sizeof()など
他の区切子・・・ 「,」など

 


プリプロセスはCの構文解析前の処理なのでsizeof()演算子やenum定数は使えない

 

昨日の記事 でトポロジカルソートのことを書きましたので、PHPでコーディングしてみました。
試しに「風が吹けば桶屋が儲かる」の論法をランダムに並べて、トポロジカルソートを使って並べ替えてみます。



■読み込むデータファイル内容(tsort.txt)

風が吹く    桶屋が儲かる
三味線弾きが増える    三味線が売れる
ねずみが増える    ねずみが桶をかじる
砂が目に入って失明する    三味線弾きが増える
ねずみが桶をかじる    桶がなくなる
猫が殺される    ねずみが増える
風が吹く    砂ぼこりが舞う
桶がなくなる    桶を買う人が増える
砂ぼこりが舞う    砂が目に入って失明する
桶を買う人が増える    桶屋が儲かる
三味線が売れる    猫が殺される




■トポロジカルソート(tsort.php)
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);


$file= "tsort.txt";
foreach (tsort($file) as $value) echo $value,"<br />\n";



function readmap($file)
{
    $map= $order= array();
    if (file_exists($file) and $fp=fopen($file, "rb")){


        while (($line=fgets($fp)) !== false){ // 一行ずつ読み出す


            // 切り出す
            if (!preg_match('/(\S+)\s+(\S+)/', $line, $match)) continue;


            // ベクトルを2次元配列にマッピングおよび全ワードをnull値で初期化
            $map[$match[1]][$match[2]]= $order[$match[1]]=
            $order[$match[2]]= null;
        }
        fclose($fp);
    }


    return array($map, $order);
}
function tsort($file)
{
    list($map, $order)= readmap($file); // ファイルデータ切り出し
    $order= _tsort($order, $map, count($order)); // トポロジカルソート


    // null値が残っていればNG(空配列を返す)
    if (array_search(null, $order)) return array();


    arsort($order); // 値順に並び替え


    return array_keys($order);
}
function _tsort(&$order, &$map, &$count)
{
    $pointed= $checklist= array();


    foreach (array_keys($order) as $param){
        if ($order[$param] !== null) continue;
        $checklist[]= $param; // 順番未確定のものを集める
        if (isset($map[$param]))
            foreach (array_keys($map[$param]) as $right)
                $pointed[$right]= 1; // ポイントされてるものをセット
    }
    // ポイントされてないものに順番を振る
    foreach ($checklist as $value){
        if (!isset($pointed[$value]) && $order[$value] === null){
            $order[$value]= $count--;
            unset($map[$value]);
            $count && _tsort($order, $map, $count);
            break;
        }
    }


    return($order);
}


?>




[出力結果]

風が吹く
砂ぼこりが舞う
砂が目に入って失明する
三味線弾きが増える
三味線が売れる
猫が殺される
ねずみが増える
ねずみが桶をかじる
桶がなくなる
桶を買う人が増える
桶屋が儲かる



うまくいったようです。。 ∩( ・ω・)∩ばんじゃーい