‘未分類’ カテゴリーのアーカイブ

CakePHP でシェルを書くときに最初にやったこと(親クラス作り)

CakePHP にはデバッグで便利な pr() って関数があります。
出力の前後に pre タグ を付けてくれる print_r() のラッパーです。当然Web用。

シェルにも欲しいです。てなわけで作りました。

    function pr($obj){
        $pr = print_r($obj, true);
        $this->out($pr);
    }

簡単。こんな感じで使います。

    $popopopooon = array('こんにちわ' => 'こんにちワン', 'ありがとう' => 'ありがとウサギ');
    $this->pr($popopopooon);

このようにコンソールに出力されます。

 Array
(
    [こんにちわ] => こんにちワン
    [ありがとう] => ありがとウサギ
)

print_r() は第2引数に true を渡すと出力せずに結果を返してくれるのでオブジェクト構造をログに出したりするときにも便利です。
 
でもコレ、全部のシェルに書きたくない。

どこに集約したらいいのか悩んだのですが、実際に実行するシェルの親クラスを作成して継承することにしました。継承の段数が増えるのはあまりすきじゃないのですが、Shellクラス をそのまま継承するよりも1段増やしといたほうがいいかな?って気もしたので。

appbase.php

class AppbaseShell extends Shell {

    function initialize() {
        parent::initialize();
    }

    function startup() {
        //ウェルカムメッセージを消すためにオーバーライド
    }

    /**
     * デバッグ用
     */
    protected function pr($obj){
        $pr = print_r($obj, true);
        $this->out($pr);
    }
}

ついでに startup() をオーバライドしてウェルカムメッセージを消しました。
こういう事やるには1段あいだに入ってるほうがいいですね。

実際に起動するシェルは AppbaseShellクラス を継承します。

aisatu.php

App::import('Shell', 'Appbase');
class AisatuShell extends AppbaseShell {
    function initialize() {
        parent::initialize();
    }

    function main() {
        $popopopooon = array('こんにちわ' => 'こんにちワン', 'ありがとう' => 'ありがとウサギ');
        $this->pr($popopopooon);
    }
}

サンプルコードは今テキトーに書いたのでちょっとあやしいかも。

最後にオチを。

このprメソッド、実際に作ったんですが普通に print_r() すればコンソールに出力されるんですよねー。「そりゃそうだ」と後で気づいたわけで。

CakePHP のシェルでは $this->out() でコンソールへの出力をすることになってますが、開発中にしか使わないし print_r() をそのまま使えばいいかなと。親クラスは機能の集約に役立ってます。

Facebooktwitterlinkedintumblrmail

VB2010でNUnit2.5を利用する

初めまして、miyazakiです。今年からこちらでお世話になることになりました。よろしくお願いします!
初めての投稿なのでものすごく緊張していますが、さっそく本題に入っていきたいと思います。

VB.NETの環境でNUnitを使うことになったので入れてみました。

参考ページ
NUnit 2.5 の導入 Step by Step
VB2010 Express + NUnit 2.5 で、 初めてのTDD Step by Step

参考にしたページと同じ環境だったのと、とても詳しく分かりやすく書かれていたので、インストールから動かしてみるまでサクサク進めました。
なのでこちらではメモ程度に書いていきたいと思います。

まずはインストール。
NUnitのページのDOWNLOADから”NUnit-2.5.10.11092.msi”をクリックしインストール。

インストールすると中にサンプルが入っているので、とりあえずそちらを動かしてみることにします。
ソリューションを開くと、このプログラム古いから今の環境で動くようにしろ、と言われるので指示に従ってコンバート。
コンバートして開けたところでビルドするんですが、元が古いということでプロジェクトで参照されているnunit.frameworkも古いです。新しいほうを参照させる必要があります。
NUnitをインストールしたドライブ\NUnit 2.5.10\net-2.0\framework内にnunit.framework.dllがあるので、プロジェクトごとに設定しなおしていきます。
これでビルドが通りました。

ビルドに成功したところでNUnitを起動。このままだとVisual Studioのファイルが開けないので、
[Tools] > [Settings…]から[IDE Support]を選択し[Enable Visual Studio Support]という項目にチェックを入れておきます。
これでNUnit側でサンプルを開くことができます。
読み込み時にdllファイルが見つからないエラーが出る場合は、
[Project] > [Configurations] > [2 Release]
を選択します。
あとはRunを押すとテストされるかと思います。こんな感じで。


赤い部分がテスト失敗。緑の部分が成功しているということを表しています。

 

では、実際にプロジェクトを作ってやっていきたいと思います。こちらも参考ページにバッチリ書いてあるので大まかな部分とテストの記述部分のみ触れていきます。

構成としてはメインプログラムとテスト用とプロジェクトを分けて作成します。
テスト用プロジェクトに関してはクラスライブラリで作成し、NUnitから呼び出して使うためにdllとして作ります。
参照設定は先ほども出たnunit.frameworkと、メインプロジェクトを設定しておきます。

テストケース部分

Imports FizzBuzz
Imports NUnit.Framework


Public Class FizzBuzzerTest

    'Fizz Buzz - 数字を数え、3の倍数でFizz、5の倍数でBuzz、3と5の倍数でFizzBuzz
    
    Public Sub SayNextTest_1回目は1_1()
        Dim obj As FizzBuzzer = New FizzBuzzer()
        Dim result As String = obj.SayNext()
        Assert.AreEqual("1 - 1", result)    'Assert.AreEqual(期待値, 検査したい値)
    End Sub

End Class

NUnitはTestFixture()を見て「このクラスにテストケースがある」ということ、Test()で「このメソッドがテストケース」であることを判断します。

Assert.AreEqual()ですが、このプログラムはFizz Buzzをしているので、この場合1回目の期待値は”1-1″、検査する値はSayNext()(数字、Fizz、Buzzのいずれかを返す)で返ってくる値になります。

また、テストケースを増やすうえで、同じような処理がある場合はまとめて書くことができます。


Public Class FizzBuzzerTest
    '同じような処理をするテストはTestCaseを使うことでまとめて書ける
        '1のとき
        '2のとき
        '3のとき
   Public Sub SayNextTest(ByVal count As Integer, ByVal expected As String)
        Dim obj As FizzBuzzer = New FizzBuzzer()
        Dim result As String = Nothing
        For i As Integer = 1 To count
            result = obj.SayNext()
        Next
        Assert.AreEqual(expected, result)    'Assert.AreEqual(期待値, 検査したい値)
    End Sub
End Class

と、こんな感じでテストケースを書いては実装を繰り返し、無事すべてのケースをグリーンにさせることができました!

 

Facebooktwitterlinkedintumblrmail

いつか通った道

富士通のWindows 7ケータイ F-07C ですが、これに似たような物を持っていたなと。
思い出してみると、SHARPのWillcom D4でした。

D4と比べてみるとサイズは少し小さくて、重量に至っては218グラムでD4の半分以下。
非力とはいえ、今この重量でWindows OSの機種は他に無さそうです。
が、iPhoneやGalaxySよりは大きいので、それで大きいと感じる人には向かないですね。
携帯用OSが入っているから、普段は困らないかも知れないですが、それならWindowsは不要じゃないかと言う事にも。

必要か、必要無いかと言えば必要無いんですが。
必要無いんですが。
そろそろ携帯買い替えようかと思っていたところでこんな物が出たら・・・。

取り合えず、安く済ませる事だけ考えるように、他は何も考えないようにしています。

Facebooktwitterlinkedintumblrmail

オープンソースカンファレンス 2011 Kansai@Kobe でセミナー

オープンソースカンファレンス 2011 Kansai@Kobe でセミナー講師やってきました。

OpenCOBOLとPerlを使った汎用機ダウンサイジング

上記ですが、遠方とかで見に行けなかった人、字が小さくてプレゼン資料が読めなかった人もいらっしゃると思いますので特に見て頂きたい部分につきましてファイル用意いたしました(クリックで拡大)。

既存の汎用機リソースの移植をなるべく工数をかけずに出来るように頑張ってみました。

次回はOSC2011 Hokkaido にて出展予定ですので、宜しくお願い申し上げます。

追記:セミナースライドも上げておきます
20110415MFdownsizing

Facebooktwitterlinkedintumblrmail

OSC 2011 Kansai@KOBE セミナー前説

オープンソースカンファレンス 2011 Kansai@KOBEで
「OpenCOBOLとPerlを使った汎用機ダウンサイジング」
というセミナーを、弊社、峰松がやります。

私も行くので軽い内容の前説をやることにしました。

この土日で前説用のスライドを作ったのですが、
ネタに走ったので後でスライドを公開するという
わけにもいかない内容になってしまいました。

見に来て欲しいなぁ。

4/16(土)です。よろしくお願いします。

※ただし、一部にしか刺さらないネタです。

Facebooktwitterlinkedintumblrmail

OSC北海道、設営完了。開場待ち。

設営完了しました。

昨日は会場の場所を下見してホテルまであるいてみたら1時間
かかったりしましたが、タクシーだと一瞬だったぜ!(言い過ぎ)。

設営完了して油断してる代表を激写。
OSC北海道、設営完了

Facebooktwitterlinkedintumblrmail

OSC北海道に向けて出発!

の準備中です。私は着替えるだけですけども。

隣の部屋ではmine氏がギリギリまでスライドを作っていたようです。
午前3時とかにつぶやいてましたし、@minemaz。

今回のセミナーは前回の神戸よりも技術寄りな内容になります。
https://www.ospn.jp/osc2011-do/modules/eguide/event.php?eid=23

ブースには仮想プリンタの出力見本なども用意しています。
のぞきにきてくださいね。

それではいってきます(の前に服着ないと)。

Facebooktwitterlinkedintumblrmail

munin-node-win32でWindowsのリソース監視

「パソコンがなんか遅いんだよ」的なお客様のご不満。

弊社はデータベースサーバー側のチューニング等を行っているのですが状況を聞いてみると「プログラムの起動が遅い」といった話で、どうもクライアント側の問題かもなぁといった感じ。どうも他社のシステム(しかも画像絡み)が同時に動いているらしいのでそちらにリソースを取られているんじゃないかと想像。

しかし、想像にすぎないのでどうにか確かめられないかと考えていたらmineさんは言いました。

「そのパソコンにSNMPd設置するとか」

MRTGで監視しようってことです。

それで閃いた(といいますか、なぜそれまで思いつかなかったのか)。

そのお客様のところのデータベースサーバーとファイルサーバーはMuninで監視してるわけで

「Windows用のmunin-nodeがあれば監視できるじゃない」

ありました。munin-node-win32

http://sourceforge.net/projects/munin-nodewin32/

現在はお客様のパソコンへの投入前のテストをやっているのですが、バッチリです。

引っかかったところは2つ

  1. zip解凍して実行ファイルmunin-node.exeをダブルクリックして「あれ?」
  2. 「メモリのグラフが出来ないなぁ」

一つ目はマニュアルをちゃんと読めってことで。
サービスとしてインストールするには次のようにします。

> munin-node.exe -install

逆にサービスから削除するときには -uninstall オプション。

二つ目のメモリのグラフについては偉大な先人がいらっしゃいました。

munin-node-win32でメモリーのグラフが出ない問題 « こにやnのぶろぐ

munin(cronで起動されてグラフを作成してる方)の設定(munin.conf)内の対象Windows機のmunin-nodeに関する所には次のようにmemoryに関する記述の追加が必要ってことですね。

[TargetPC] #Windows PC
address xxx.xxx.xxx.xxx #IP Address
memory.swap.label swap
memory.swap.draw STACK
memory.swap.info Swap memory used.

ありがてぇ。ありがてぇ。

Facebooktwitterlinkedintumblrmail

とある休日のうどん打ち

ふと思い立ってひさしぶりにうどんを打ってみました。 ヘタになってた。

季節で加水率を変えたほうがいいのですが(寒い時期は増やして暖かい時期は減らす。たぶん)、私は次のレシピで固定してます。

  • 小麦粉 200 g
  • 水 90 g
  • 塩 10 g

 

おぼえやすいでしょ? これで3食〜2食分です。

小麦粉は今回、うどんづくりではスタンダードな中力粉を使ってますが薄力粉でもいいと思います。作ってすぐ食べたいときなんかは薄力粉がお勧めです。今回も薄力粉のほうがよかったんだけどね。

分量をちゃんと計れば勝ったも同然! 小麦粉料理にデジタルキッチンスケールは必須です。

 

水には塩を溶きます。電子レンジで少しあたためてぬるま湯位にするとやりやすいです。

 

まず、水回し。少しずつ塩入りぬるま湯を加えながら全体に馴染ませます。私は箸をつかってやってます(ここらへん、『ウー・ウェンの北京小麦粉料理』という本を参考にしてます。小麦粉料理やるなら持っといて損はない本です。中華料理の本なのでうどんは載ってませんが)。

こんな感じになります。

この状態からコネていきます。ある程度までコネたらラップでもして寝かしてから(30分以上推奨)再度コネると良いです。

薄力粉の場合は寝かしなしでOK。

今回、中力粉でやってるのに早く食べたくて寝かしを10分弱で切り上げてしまいました(起きてすぐに朝飯用に作ってたんだもの)。

その結果がこの熟成と練が足りてない小麦粉の塊だよ!

 

普通は表面がなめらかになるまでコネますが、腹へってたのでこの状態で延ばして切っちゃったのでした。

打ち粉して延ばして、ほどよいところまで延びたらさらに打ち粉して折りたたたんで切ります(苦手です。とくに延ばすのが。均等に出来ずに端がうすくなっちゃう)。

打ち粉は片栗粉を使いました。なかったら小麦粉でもいいのですが片栗粉のほうが扱いやすい気がします。

 

一食分は切ったので茹でます(朝食用)。

お湯はなるべく多めが良いです。写真の状態だとギリって感じ。

吹きこぼれないように気をつけつつ麺が自然に回る火加減で10分位。

鍋から揚げたての麺です。表面がぬるぬるしてます。このまま卵にぶち込んで釜玉もいいですね。

水で数回ゴシゴシと洗ってあげるとツルンツルンになります。

ここまで撮影したりしつつボチボチやって1時間弱です。 ね? 簡単でしょ?

 

すぐに食べたいときには薄力粉で寝かしなしで全力で作れば30分位で食べるところまでいけます。

 

朝食は出汁醤油と鰹節をかけていただきました。今回、ひどい手抜きでしたがちゃんと美味しい。

 

残りは昼にカレーうどんにして食べました。 前日のカレーの残りでカレーうどんを作りたくて打ったんだ。実は。

 

麺が残ったら茹でる前の切った状態で密閉して冷凍しとくと良いです。乾麺ほどじゃないですが、かなりもちます。

 

Facebooktwitterlinkedintumblrmail

CakePHPのRouter::normalizeにヤラれる

あるいは認証後に存在しないsコントローラーに飛ばされてエラーになる件。

1.3.6での話なのですが、例えば

http://lancard.com/hoge/

というCakePHPで構築したサイトがあってAuthで認証を行っているとします。
そこにhogesコントローラーがあったとしましょう。そのindexアクション

http://lancard.com/hoge/hoges/

で認証切れすると戻り先のUrlとしてAuth.redirectセッションに/hogesが
保持されるのですが、この状態で認証して再ログインすると

http://lancard.com/hoge/s

に飛ばされる不思議現象。 犯人はRouter::normalize。

リダイレクト処理時にRouter::normalizeで前処理されるのですがその中に

if (!empty($paths['base']) && stristr($url, $paths['base'])) {
    $url = preg_replace('/^' . preg_quote($paths['base'], '/') . '/', '', $url, 1);
}

というコードがあって、結果、Router::normalize('/hoges')は/sを返しやがります。

if (!empty($paths['base']) && stristr($url, $paths['base'] . '/')) {
    $url = preg_replace('/^' . preg_quote($paths['base'], '/') . '/', '', $url, 1);
}

と改造して$paths['base']の後ろに/がある時だけ置換するようにして対処しました。
悪影響がないことを祈りつつ。

なるべくならフレームワークに手を入れるのは避けたいところ。いい手があったら教えてください。

Facebooktwitterlinkedintumblrmail