Linux起動スクリプトのfunctionsメモ

#!/bin/sh

. /etc/init.d/functions

# 色々書いて・・・
for chek in 1 2 3
do
    # 重要なコマンドを3回実行して・・・
    RETVAL=$?
    [ $RETVAL = 0 ] && success && echo
    [ $RETVAL != 0 ] && failure && echo
done
exit 0

でこれを実行すると、

# ./boot_script.sh
check 1 :                           [失敗]
check 2 :                           [失敗]
check 3 :                           [  OK  ]

てな感じで、起動スクリプトのような出力が可能。

apacheモジュールのメモリ管理

物欲日記ばっかり書かずに、たまにはお勉強の話でも。

fp = ap_pfopen(p, hoge.txt, "r");

if (fp == NULL) {
    fprintf(stderr, "%sは無いよ!\n", hoge.txt);
    return 1;
}

/* hoge.txt を色々弄って・・・*/

ap_pfclose(p, fp);

apacheのモジュールについて最近勉強しているので、やったことをメモしていこうと思ってます。色々調べてて、メモリとかファイルハンドル回りでほーほーと思ったことをいくつか。

  • apacheモジュールはC言語にも関わらず、メモリのリソース管理はapacheがよしなにしてくれる。
  • apacheはリソース管理のためにプール構造をとっている。
  • 新たに確保するメモリ等はプールに結び付けて管理されるので、プール破棄時にメモリも破棄されるわけですな。
  • というか、むしろメモリ開放のインターフェイスすら用意されてない。
  • リソースプールからアロケートされたメモリの開放はapache自身がすることになってる。
  • かってにプログラマがfree()とかしたらダメ。
  • リクエスト時などに、一時的にメモリ確保とかファイルハンドルを割り当てたい場合は、Request poolを生成して、そこから割り当てれば、レスポンス終了時にRequest poolが自動的に破棄されて、メモリとかも開放される。
  • 動的にメモリ確保する場合も、poolにから割り当てるので、NULLチェックの必要が無い。

ほーほー、ようするにCなのにメモリ管理は、用途によって用意された各種poolからpool生成して、そっからアロケートするから、プログラマが適当にメモリを弄るなってことなのね。

制御構造のコーディング規約

色々あるみたいだが、適当に思ったことを。

if ( hoge ) {
    hogehoge;
}
else {
    fuga
}

上記のような書き方は、なんだかクシャッとしていて見難くて、受け入れづらかった。
なので、GNUのコーディング規約でもあり、Linux・Unixのパッケージのソースなどでよく用いられていて、大学でもC言語な人達が好んで使用していた以下のようなコーディング法を個人的に気に入って使っている。

if ( hoge )
{
    hogehoge;
}
else
{
    fuga
}

続きを読む

遷移なしのPager

PEARのpagerライブラリを使用していたが、色々と微妙だったので、簡単に自分でコーディング。

phpからのreturnを表示するエリアをjavascritで記述し、そのreturnの中にさらにそのエリアで表示を行うhtmlを表示。

そうすることで、最初に表示されたエリア内のフォーム等をクリックすることで、さらにページ遷移の無い表示エリアで表示の切り替えが可能。

表示エリアの記述はこんな感じ。

<div id="search_result_area_ff">検索結果表示エリア</div>

遷移無しにそのエリアにphpのreturnを表示するJavascriptはこんなの。

function formPostClick()
{
    new Ajax.Request
    (
        './test.php',
        {
            method     : 'post',
            parameters : Form.serialize('ajaxForm'),
            onComplete :    function( httpObj )
            {
                $('search_result_area_ff').innerHTML = httpObj.responseText;
            }
        }
    );
}

function formPostClickNext()
{
    new Ajax.Request
    (
        './test.php',
        {
            method     : 'post',
            parameters : Form.serialize('ajaxNextForm'),
            onComplete :    function( httpObj )
            {
                $('search_result_area_ff').innerHTML = httpObj.responseText;
            }
        }
    );
}

function formPostClickPrev()
{
    new Ajax.Request
    (
        './test.php',
        {
            method     : 'post',
            parameters : Form.serialize('ajaxPrevForm'),
            onComplete :    function( httpObj )
            {
                $('search_result_area_ff').innerHTML = httpObj.responseText;
            }
        }
    );
}

で、最後にReturn表示エリアに表示エリア内でさらなるReturnを表示しなおすPHPでの
Pager実装は以下。

### PAGER Setting ###

$pagelimit = 50;

$name = $_POST['name'];
$currentPageID = $_POST['page'];
$sort = $_POST['sort'];

$next_page = $currentPageID + 1;
$prev_page = $currentPageID - 1;

if ($prev_page > 0)
{
    printf('
        <table><tr><td>
        <form method="post" id="ajaxPrevForm">
        <input type="hidden" name="name" id="name" value="'.$name.'">
        <input type="hidden" name="page" id="page" value="'.$prev_page.'">
        <input type="hidden" name="sort" id="sort" value="'.$sort.'">
        <input id = "search_button_fff"
        type = "button"
        value = "prev"
        onclick = "formPostClickPrev();">
        </form>
        </td><td>
    ');
}

printf('
    <form method="post" id="ajaxNextForm">
    <input type="hidden" name="name" id="name" value="'.$name.'">
    <input type="hidden" name="page" id="page" value="'.$next_page.'">
    <input type="hidden" name="sort" id="sort" value="'.$sort.'">
    <input id = "search_button_fff"
    type = "button"
    value = "next"
    onclick = "formPostClickNext();">
');

if ($prev_page > 0)
{
    printf('</form></td></tr></table>');
}

$index = ($currentPageID - 1) * $pagelimit + 1;
$min_hit_num = $index;

if ($rowNum < $index + $pagelimit)
{
    $max_hit_num = $rowNum;
}
else
{
    $max_hit_num = $index + $pagelimit - 1;
}

printf("<div id=resultNum>検索結果(%d?%d件目):%dヒット</div>",
    $min_hit_num, $max_hit_num, $rowNum);

これで、簡単ではあるが、ページ遷移なしのPagerが使用できる。

Googleの新しいブラウザ

Googleが開発した新しいブラウザとして、Google Chromeが9月2日からリリースされている。

それを使ってみた感想。

とりあえず、体感がめっちゃ早い。
使っていない人は使ってみて欲しい。

特にWEBページを読み込んだ後の、ページ内遷移が早い気がする。

まるで、バックグラウンドでページ内をどんどん保存してキャッシュにしているかのよう。

後は、GoogleMapの拡大などが非常に早く、Gmailもクルクルさくさく動く。

GoogleのWEBサービスにはかなり最適化されている模様。
エンジンにはSafariが使っていたWebkitを使っているのね。

JavaScriptの実行速度が速いらしく、これからのリッチコンテンツを見越しての開発なのだろう。
Googleの新しいJavaScript エンジンである v8 と呼ばれるものを開発したようだ。

キャッシュに持っていないページの表示も速いので、純粋なブラウザにおける技術力が高いと考えられ、「技術力はないけど、広告力と企画力がすぐれている」と言っていたひろゆき氏も、そろそろ「まぁまぁ技術力はある」と言うことになるのだろうか。

僕は、ひろゆき氏の言う、Googleがやりとげた検索エンジン開発における広告力と企画力っていうのは、当然技術力の範囲に含まれるものだと思うのだけれど。

脆弱性もどんどん見つかっているようだけど、これは期待できるブラウザである。

・・・・・・

こうやってどんどんGoogleに囲いこまれていくのかなぁ。

実装を見ていないからわからないけど、Googleが持つページのキャッシュともリンクしていくような作りになると、本当にWEBはGoogleがプラットフォームになってしまいそうで怖い。