とある休日のうどん打ち

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

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

  • 小麦粉 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

VB.NETのMy.Application.Logをラッピングしたクラス作ってみた

現在進めているプロジェクトでのロギングにはmiyazakiさんに調べてもらったMy.Application.Logを使うことにしました。

が、そのままだとちょいと辛かったのでラッピングしてクラスを作ってみました。

Public Class Log
    Public Shared Sub Write(
        ByVal message As String,
        ByVal traceEventType As String,
        Optional ByVal isShowMsgBox As Boolean = False
    )
        Dim severity As System.Diagnostics.TraceEventType =
            System.Enum.Parse(GetType(System.Diagnostics.TraceEventType), traceEventType)

        My.Application.Log.WriteEntry(My.Computer.Clock.LocalTime.ToString & "> " & message, severity)
        My.Application.Log.TraceSource.Flush()
        '下記表示判定は何パターンか試した結果ですが正しいかの確認は出来ていません。
        If My.Application.Log.TraceSource.Switch.Level > severity Then
            showMsgBox(message, severity, traceEventType, isShowMsgBox)
        End If
    End Sub

    Private Shared Sub showMsgBox(
        ByVal message As String,
        ByVal severity As System.Diagnostics.TraceEventType,
        ByVal title As String,
        Optional ByVal isShowMsgBox As Boolean = False
    )
        If isShowMsgBox Then
            Dim msgBoxButtons As MsgBoxStyle
            Select Case severity
                Case Diagnostics.TraceEventType.Critical, Diagnostics.TraceEventType.Error
                    msgBoxButtons = MsgBoxStyle.Critical
                Case Diagnostics.TraceEventType.Warning
                    msgBoxButtons = MsgBoxStyle.Exclamation
                Case Else
                    msgBoxButtons = MsgBoxStyle.Information
            End Select
            MsgBox(message, msgBoxButtons, title)
        End If
    End Sub

    Public Shared Sub Verbose(
        ByVal message As String,
        Optional ByVal isShowMsgBox As Boolean = False
    )
        Log.Write(message, "Verbose", isShowMsgBox)
    End Sub

    Public Shared Sub Info(
        ByVal message As String,
        Optional ByVal isShowMsgBox As Boolean = False
    )
        Log.Write(message, "Information", isShowMsgBox)
    End Sub

    Public Shared Sub Warn(
        ByVal message As String,
        Optional ByVal isShowMsgBox As Boolean = False
    )
        Log.Write(message, "Warning", isShowMsgBox)
    End Sub

    Public Shared Sub Err(
        ByVal message As String,
        Optional ByVal isShowMsgBox As Boolean = False
    )
        Log.Write(message, "Error", isShowMsgBox)
    End Sub

    Public Shared Sub Exception(
        ByVal ex As Exception,
        ByVal message As String,
        Optional ByVal isShowMsgBox As Boolean = False
    )
        message &= System.Environment.NewLine &
            " [例外内容] " & ex.Message & System.Environment.NewLine &
            " [スタックトレース] " & System.Environment.NewLine & ex.StackTrace
        Log.Err(message, isShowMsgBox)
    End Sub
End Class

Verboseがlog4netのDebugにあたる感じで使えると思います。
メッセージボックスを表示したりも出来ます。

My.Application.Log.には例外用のメソッドWriteExceptionがあるのですが出力される情報がイマイチだったので使わないで実装しました。

まだあまり使ってないのでバグってたりするかもしれません。
コードを修正したらここも修正するということで。

Facebooktwitterlinkedintumblrmail

MacアプリでURLをブラウザで開く方法

これでHTTPなURLスキームに対応しているアプリのidentifierの一覧が取れます。

NSArray *identifiers = (NSArray*)LSCopyAllHandlersForURLScheme((CFStringRef)@"http");

ただ、このままだとブラウザでないアプリケーション(例えばEvernoteなど)も取れてしまいますので、うまい具合にブラウザだけ取る方法があれば教えてください。

次にURLをデフォルトブラウザで開く方法

NSURL *url = [NSURL URLWithString:@"http://www.example.com/"];
[[NSWorkspace sharedWorkspace] openURL:url];

最後にURLを指定のアプリケーションで開く方法

NSURL *url = [NSURL URLWithString:@"http://www.example.com/"];
[[NSWorkspace sharedWorkspace] openURLs:[NSArray arrayWithObject:url]
                withAppBundleIdentifier:@"com.apple.Safari" //取得したidentifierを渡してやる
                                options:NSWorkspaceLaunchDefault
         additionalEventParamDescriptor:nil
                      launchIdentifiers:nil];
Facebooktwitterlinkedintumblrmail

Xcodeでリリースビルド時に.dmgを自動生成する

Using Xcode to build a disk image (and upload a web site)

こちらを参考に、hdiutilを使ってリリースビルド時のみ生成するようにしてみました。

グループとファイルからビルドターゲットを右クリックし、[追加 > 新規ビルドフェーズ > 新規スクリプトを実行]を選択します。

スクリプトを入力する画面が表示されますので、下記のようにスクリプトを設定します。.dmgはデスクに保存するようにしています。cpしているところは適時置き換えて頂ければいいかと思います。

set -ex

[ "$ACTION" = build ] || exit 0
[ "$BUILD_VARIANTS" = "normal" ] || exit 0
[ "$CONFIGURATION" = "Release" ] || exit 0

dir="$TEMP_FILES_DIR/disk"
dmg="$HOME/Desktop/$PROJECT_NAME.dmg"

rm -rf "$dir"
mkdir "$dir"
cp -R "$BUILT_PRODUCTS_DIR/$PROJECT_NAME.app" "$dir"
cp -R "$PROJECT_DIR/README.txt" "$dir"
cp -R "$PROJECT_DIR/LICENSE.txt" "$dir"
ln -s "/Applications" "$dir/Applications"
rm -f "$dmg"
hdiutil create -srcfolder "$dir" -volname "$PROJECT_NAME" "$dmg"
rm -rf "$dir"
Facebooktwitterlinkedintumblrmail

Gitでブランチのコミット数とか

既存ブランチのコミット総数

git log --pretty=oneline | wc -l

派生先ブランチでの派生元からのコミット数

git log --pretty=oneline branch1..branch2 | wc -l
Facebooktwitterlinkedintumblrmail

長崎ITキャンプ2010やりますよ!って話

昨年に引き続き、長崎ITキャンプが開催されます。

大事なことなので最初に書きます。今週末にはプレイベントなのでもうすぐ締切りだと思いますが、8/30現在、社会人枠はまだ募集中です。申し込みフォームからお申込みくださいませ。参加費は3,000円です。
学生さんは締め切っちゃってます。ごめんなさい。

峰松、村部はスタッフで参加します。よろしくお願いします。

去年は「海」でしたが、今年は秋ということもあり「山」です!
時期的に紅葉なんかには早いと思いますが、ITキャンプの頃の山の空気は気持ちイイと思われますよ(私が下見にいった8/28は猛烈に暑かったですけど)。

キャンプインと呼んでいるプレイベントが今週末に迫ってまいりました。参加予定の方々には既に連絡が届いているかもしれませんが、これから申し込みたいという方には情報が少ないと思います。私が分かる範囲で書いておきますね。

●キャンプイン(プレイベント『趣旨説明およびグループ分け』)
日 時: 平成22年9月4日(土) 13:00〜18:00 + 懇親会
会 場: 長崎市民会館 6階 第2・第3大会議室

12:30受付開始です。
今回プレイベントでTwiiterを使う予定ですのでTwitterアカウントを事前に取得しておいてください。アカウントの取り方がわからない方は早め(12:00位〜)に来てくださればスタッフが対応します。

●ITキャンプ(本イベント『合宿研修』)
日 時: 平成22年9月24日(金)20:00 ~ 26日(日)16:30(2泊3日)
会 場: 長崎式見ハイツ

金曜日スタートですが、夜8時からですので勤務等に差支えはでないかと思います。ご安心を。
交通手段としては大型バスでの送迎もありますし、自家用車で行ってもOKだそうです。

今回、各チームの自主性に重きを置いて「ITで長崎の魅力を発信」するという大きな目標を目指してもらうという挑戦的な試みとなります。我こそは!という方、待ってます。

Facebooktwitterlinkedintumblrmail

どうでも良い話

タッチパッドが苦手です。
キータッチしているうちに、触って別の場所にフォーカスしてしまう。
果てはWeb上のフォームで入力中にPostしてしまう。
そんな経験を何度もしているうちに、苦手になりました。
設定やアプリで変更出来ますよと言う人もいるけど、割と設定画面が違ったりして面倒です。

今使っているノートPCはUSBマウスを挿すと自動的にタッチパッドが無効化されるので、
設定で出来ます、じゃなくて初期設定でそうなるように作ってある事が良いと感じました。
Firefoxのアドオンやコンフィグが一部で評価が悪いのが分かった気がします。WindowsMobileも。

そもそもタッチパッド付けなければ良いじゃないか、
とかタッチパッド嫌いはThinkPad買えと言う話が出るんですがまぁそれは別の話で。

Facebooktwitterlinkedintumblrmail

Munin を Ubuntu にインストールする

MRTG よりラクちんにサーバーリソースをモニタリングしたいなぁ、ということでセットアップが簡単と評判の Munin を試してみることにしました。

ターゲットのサーバーは Debian なのですが、個人的趣味で実験環境は Ubuntu です。どちらもパッケージ管理は APT ですし、いいよね?

Debian/Ubuntu は Munin のパッケージを入れるだけで動いちゃうらしいです。

どれどれ、パッケージあるかな〜。

$ sudo aptitude search munin
pi  munin                                                               - network-wide graphing framework (grapher/gatherer)                           
p   munin-libvirt-plugins                                               - Munin plugins using libvirt                                                  
pi  munin-node                                                          - network-wide graphing framework (node)                                       
p   munin-plugins-extra                                                 - network-wide graphing framework (user contributed plugins for node)          

ありました。munin がグラフ化をおこなうソフトで munin-node がリソースの情報を収集するソフトです。

localhostのリソース監視をさせたいので2つまとめてインストール。

$ sudo aptitude install munin munin-node
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Reading extended state information      
Initializing package states... Done
The following NEW packages will be installed:
  gawk{a} libdate-manip-perl{a} libhtml-template-perl{a} libio-multiplex-perl{a} libnet-cidr-perl{a} libnet-server-perl{a} libnet-snmp-perl{a} 
  librrd4{a} librrds-perl{a} munin munin-node rrdtool{a} 
0 packages upgraded, 12 newly installed, 0 to remove and 0 not upgraded.
Need to get 3,227kB of archives. After unpacking 8,442kB will be used.
Do you want to continue? [Y/n/?] 

gawk やら perl のライブラリやらに依存してる模様。ほいほい、全部入れちゃって〜「Y」。

Writing extended state information... Done
Get:1 http://us.archive.ubuntu.com karmic/main gawk 1:3.1.6.dfsg-0ubuntu2 [525kB]
Get:2 http://us.archive.ubuntu.com karmic/main libdate-manip-perl 5.54-1 [173kB]
Get:3 http://us.archive.ubuntu.com karmic/main libhtml-template-perl 2.9-1 [65.8kB]
Get:4 http://us.archive.ubuntu.com karmic/main libio-multiplex-perl 1.10-1 [22.9kB]
Get:5 http://us.archive.ubuntu.com karmic/main libnet-cidr-perl 0.13-1 [14.6kB]
Get:6 http://us.archive.ubuntu.com karmic/main libnet-server-perl 0.97-1ubuntu1 [141kB]
Get:7 http://us.archive.ubuntu.com karmic/main libnet-snmp-perl 5.2.0-1 [112kB]
Get:8 http://us.archive.ubuntu.com karmic-updates/main librrd4 1.3.1-4ubuntu2.1 [241kB]
Get:9 http://us.archive.ubuntu.com karmic-updates/main librrds-perl 1.3.1-4ubuntu2.1 [79.0kB]
Get:10 http://us.archive.ubuntu.com karmic-updates/main rrdtool 1.3.1-4ubuntu2.1 [596kB]
Get:11 http://us.archive.ubuntu.com karmic/main munin 1.2.6-13ubuntu3 [613kB]
Get:12 http://us.archive.ubuntu.com karmic/main munin-node 1.2.6-13ubuntu3 [644kB]
Fetched 3,227kB in 5s (604kB/s)  
Selecting previously deselected package gawk.
(Reading database ... 29378 files and directories currently installed.)
Unpacking gawk (from .../gawk_1%3a3.1.6.dfsg-0ubuntu2_i386.deb) ...
Selecting previously deselected package libdate-manip-perl.
Unpacking libdate-manip-perl (from .../libdate-manip-perl_5.54-1_all.deb) ...
Selecting previously deselected package libhtml-template-perl.
Unpacking libhtml-template-perl (from .../libhtml-template-perl_2.9-1_all.deb) ...
Selecting previously deselected package libio-multiplex-perl.
Unpacking libio-multiplex-perl (from .../libio-multiplex-perl_1.10-1_all.deb) ...
Selecting previously deselected package libnet-cidr-perl.
Unpacking libnet-cidr-perl (from .../libnet-cidr-perl_0.13-1_all.deb) ...
Selecting previously deselected package libnet-server-perl.
Unpacking libnet-server-perl (from .../libnet-server-perl_0.97-1ubuntu1_all.deb) ...
Selecting previously deselected package libnet-snmp-perl.
Unpacking libnet-snmp-perl (from .../libnet-snmp-perl_5.2.0-1_all.deb) ...
Selecting previously deselected package librrd4.
Unpacking librrd4 (from .../librrd4_1.3.1-4ubuntu2.1_i386.deb) ...
Selecting previously deselected package librrds-perl.
Unpacking librrds-perl (from .../librrds-perl_1.3.1-4ubuntu2.1_i386.deb) ...
Selecting previously deselected package rrdtool.
Unpacking rrdtool (from .../rrdtool_1.3.1-4ubuntu2.1_i386.deb) ...
Selecting previously deselected package munin.
Unpacking munin (from .../munin_1.2.6-13ubuntu3_all.deb) ...
Selecting previously deselected package munin-node.
Unpacking munin-node (from .../munin-node_1.2.6-13ubuntu3_all.deb) ...
Processing triggers for install-info ...
Processing triggers for man-db ...
Setting up gawk (1:3.1.6.dfsg-0ubuntu2) ...

Setting up libdate-manip-perl (5.54-1) ...
Setting up libhtml-template-perl (2.9-1) ...
Setting up libio-multiplex-perl (1.10-1) ...
Setting up libnet-cidr-perl (0.13-1) ...
Setting up libnet-server-perl (0.97-1ubuntu1) ...
Setting up libnet-snmp-perl (5.2.0-1) ...
Setting up librrd4 (1.3.1-4ubuntu2.1) ...

Setting up librrds-perl (1.3.1-4ubuntu2.1) ...
Setting up rrdtool (1.3.1-4ubuntu2.1) ...
Setting up munin (1.2.6-13ubuntu3) ...
Adding system user `munin' (UID 103) ...
Adding new group `munin' (GID 110) ...
Adding new user `munin' (UID 103) with group `munin' ...
Not creating home directory `/var/lib/munin'.

Setting up munin-node (1.2.6-13ubuntu3) ...
Initializing plugins..done.
Restarting munin-node.. * Stopping Munin-Node
   ...done.
 * Starting Munin-Node
   ...done.
 * Starting Munin-Node
   ...done.

Processing triggers for libc-bin ...
ldconfig deferred processing now taking place
Reading package lists... Done             
Building dependency tree       
Reading state information... Done
Reading extended state information      
Initializing package states... Done
Writing extended state information... Done

おけ。インストールすると動きだします。

しばらく待って、グラフの作成先を確認してみると

$ ls /var/www/munin/
definitions.html  index.html  localdomain  logo.png  style.css

できとる、できとる。ほんと楽チンだ。

Facebooktwitterlinkedintumblrmail

VMware で Ubuntu イメージをコピーしたら NIC が見えなくなる件

テスト環境を作ろうと Ubuntu 9.10 Server の仮想アプライアンスを取ってきてブートしたら eth0 が up しないという事態が発生。少々ハマりました。

結論は「VMware とかで Debian イメージをコピったら NIC が見えなくなる件」に書いてある通り、新しいMACアドレスで eth1 ができていました。ubuntu の場合は /etc/udev/rules.d/70-persistent-net.rules にMACアドレスと eth* との対応が書いてあります。

$ sudo cat /etc/udev/rules.d/70-persistent-net.rules 
# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.

# PCI device 0x1022:0x2000 (pcnet32)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:1f:93:3e", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x1022:0x2000 (pcnet32)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:1e:58:e2", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

これを編集すればいいわけですが、ちょっと手を抜いて、設定ファイルをリネーム後再起動して解決しました。

$ sudo mv /etc/udev/rules.d/70-persistent-net.rules /etc/udev/rules.d/70-persistent-net.rules.old
$ sudo shutdown -r now

自動で 70-persistent-net.rules を作り直してくれますので 新しいMACアドレスで eth0 の設定が作られます。確認してみましょう。

$ sudo ls -l /etc/udev/rules.d/
total 20
-rw-r--r-- 1 root root  595 2009-11-03 22:20 70-persistent-cd.rules
-rw-r--r-- 1 root root  443 2010-03-29 23:49 70-persistent-net.rules
-rw-r--r-- 1 root root  631 2010-03-29 18:39 70-persistent-net.rules.old
-rw-r--r-- 1 root root  813 2009-11-03 22:40 99-vmware-scsi-udev.rules
-rw-r--r-- 1 root root 1157 2009-10-15 23:01 README

できてますね。

$ sudo cat /etc/udev/rules.d/70-persistent-net.rules
# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.

# PCI device 0x1022:0x2000 (pcnet32)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:1e:58:e2", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

大して手間は変わらない気もしますが、ミスはしにくいかも?

Facebooktwitterlinkedintumblrmail