2010年12月4日土曜日

もんじゃ焼きのおいしい焼き方

先日、嫁さんと2人でお好み焼き屋にいってきたのですが、そのとき久しぶりに「もんじゃ焼き」を注文しました。
あれの調理の仕方って
「なんとなくまぜてぐちゃぐちゃにする」
ぐらいの認識しかなくっていっつも「これっておいしいの?」という仕上がりになってしまうので、嫁さんの注文にドキドキしていたのですが、お店の店員さんが調理法を解説しながらつくってくれたんです!!
店員さんからの調理法は以下の通り。
  1. 野菜を先に炒める。このとき、ヘラを使って野菜を細かく刻んでおく。
  2. 野菜に火が通ってきたら、野菜をドーナツ状に配置する。
  3. もんじゃの生地の液体に、もんじゃのたれを入れる。
  4. ドーナツ状に配置された野菜の中心に生地の液体を入れる。このとき液体を一気にいれるのではなく、スプーン3、4杯ぐらいずつ入れるようにする。
  5. 生地にとろみがでてきたら、野菜の中心を広げつつ生地の液を足していく。
  6. 最後にもんじゃにソースをかけてかき混ぜてできあがり。
ポイントは野菜をドーナツ状に配置したときに、最初は中心の円がなるべく小さくなるようにすることと生地の液は少しずついれることだそうです。 「もんじゃっていっつも失敗するんだよな~」という同胞の方の参考になれば。

2010年11月14日日曜日

【XYZZYTips】「""」などの囲み文字を連続して入力したらカーソルを文字の間に移動させる

自分は開発作業で「XYZZY」というエディタを利用しているのですが、ネットとか見てると意外と利用者が多そうなので、自分で作ったスクリプトをちょっと公開してみようかと。

新人の頃に「"」などの囲み文字は「""」というように最初に対の形で入力して、その後に中身を書いていくという癖を付けられました。まあ、囲み文字を閉じ忘れるのにはいいと思うのですが、如何せんカーソルを一度戻して入力を続けるというのが結構面倒なんですよね。
今はPHPで仕事をしてるんですけど、PHPなんで当然HTMLタグとかも書いたりしてると、囲み文字が結構あって、その都度カーソル戻って入力するのが、結構嫌だった。

そこでXYZZYで「""」や「<>」と入力すると勝手に1文字分カーソルが戻ってくれるようなマクロを作りました。
こちらがソースになります。
;;囲み文字を入力したら、カーソルを戻して囲み文字の間にカーソルが入るようにする
(setq *backword-char-item-list* '((#\) "()") (#\] "[]") (#\} "{}") (#\' "\'\'") (#\" "\"\"") (#\> "<>")))
(defun backword-char-command-hook (list)
   (if (consp list)
      (let ((last-command (first (first list))) (back-key (first (rest (first list)))))
         (add-hook '*post-command-hook*
            #'(lambda()
               (if (and (eq *last-command-char* last-command)
                     (looking-back back-key)
                   ) (backward-char)))
         )
         (backword-char-command-hook (rest list))
      )
    ))
(backword-char-command-hook *backword-char-item-list*)
つたないコードですが、誰かの参考になれば幸いです。

2010年11月11日木曜日

脳を活性化する速読メソッド

脳を活性化する速読メソッド
呉 真由美
PHP研究所
売り上げランキング: 38181

~速読とは脳の状態である~

(本書より) 著者はテレビに出てバッティングマシンで150kmのボールを打ち返したそうです。本書でもそのエピソードが少し紹介されており、これも著者曰く速読訓練の賜物だそうです。本書は、他の速読本のようにいくつかの速読トレーニングを紹介し、速読を身につけられる構成になっています。しかし、本書は「速読は技術ではなく脳の状態である」という趣旨で統一されており紹介されているトレーニングもそれを意識したものとなっています。
【読書メモ】
■本書で紹介しているトレーニング
  1. 読書速度の計測
    6秒間で読める文字数を計測して結果を10倍にして1分間の文字数を計測します。本書では、行末に文字数が書かれているページがあり、それを利用して読書速度を計測できるようになっています

  2. 眼筋と毛様体筋のトレーニング
    下記の3種類のトレーニングをそれぞれ6秒ずつ行い回数を計測する。
    このトレーニングは眼筋を鍛える事で血流を良くする事が目的です。
    1. 顔の左右に指を立てて左右交互に指を見る。
    2. 顔の上下に指を横に出して上下交互に指を見る。
    3. 顔の10cm後、30cm後に指を立てて手前、奥と交互に指を見る。

  3. 読まずに速く見るトレーニング
    本の文字を読まずに、上下の幅を意識しながら1ページ、1秒ぐらいのペースで本を「眺める」

  4. 脳をウニュウニュするトレーニング
    これをやると脳が「ウニュウニュ」した感じになります。これは脳が活性化している証拠です。
    1. 片手でこぶしを握り足をたたき、反対の手で足をスリスリする。
    2. 本に出てくるじゃんけんのパターンを声に出しながら手は負ける手を出す。

  5. 視機能を強化するトレーニング
    5 × 5 マス内にある数字を出来るだけ速く指指していき、時間を計測する
■その他のTips色々
  • 速読でも黙読でも、各自が抱く感想はそれぞれにきっと同じ。ただ、読む時間が短くなるだけのこと。
  • 多くの人が速読は技術だと思っていらっしゃるから、「いろいろなトレーニングをたくさんしないといけない」という誤解が生まれているのでしょう。しかし、「脳がもともと持っている本当の力を引き出す」という”いちばん肝心な部分”を理解しないで、それを抜きにどんなトレーニングをやってみても、おそらく速読と言える状態にはならないはずです。

2010年10月3日日曜日

大事なことはすべて記録しなさい

大事なことはすべて記録しなさい大事なことはすべて記録しなさい
posted with amazlet at 10.10.03
鹿田 尚樹
ダイヤモンド社
売り上げランキング: 53610
Amazon.co.jp で詳細を見る

~記録は成功・成長のブースターである~

(本書より) 著者は高校時代からあらゆることを記録し続け、それによって様々な成功を手中に収めてきた方のようです。この本は著者が日々実践している記録方法を紹介しています。著者は記録のみを行い、記録した内容を分類したりしないことを奨励しています。そのかわり、常に見返したいTipsなどは「Bノート」という別のノートに集約するという方法を紹介しています。読んでいて、ここらへんは「情報はすべて1冊のノートにまとめなさい」とは違うな~と思いました。
また、議員秘書時代に培った写真や名刺を使った記録方法も紹介されており、そういった点がこの本の個性となっています。
【読書メモ】
■記録・インプット術
  1. ノート・・・A6サイズを利用する。「毎日用」と「勝負用」を使い分ける。
  2. スケジュール・・・A6サイズを利用する。ノートとサイズを合わせることで管理を楽にする。
    長期間の中で優先順位を決め手取り組めるマンスリータイプが使いやすい。
  3. ベースノート・・・机が用意された環境などで利用A5サイズを利用する。リング式を利用する。
    リング式を利用すると半分に折り曲げて利用できる。
  4. Bノート
    「自分専用の教科書」
    記録した学びの中で特に身につけたいことや記録した学びの中で特に身につけたいことや大切なことを書き写して持ち運べるようにする。
    著者は最初のページに「夢・目標」を記録している。具体的には

    短期・・・3~6ヶ月の目標
    中期・・・1年までの目標
    長期・・・3年までの目標

    を記述する。

    また他に
    1)漫画のコピー・・・やる気スイッチをいれるため
    2)読書ノートからのフレームワーク・・・仕事の成果につなげるため
    3)仕事の雛形・・・レジュメや仕事の手順などを再利用するため
    4)引用句・金言集・・・人に伝えるときに引用するため

  5. 企画・アイディアノート
    A4を利用する。テーマやコンセプトを太いマジックで書く。ボールペンは使わずシャープペンシルで書く(修正できるようにする)。
■その他のTips色々
  • 大事なことはすべて記録する。
  • 日付、時間を書く&整理・分類しない
  • シンプルに書く(「箇条書き」&キーワード)
  • 1ページ、1コンテンツ
  • 1日5分記録を読み返す。
  • 家中にペンを置く。
  • 色の力を使って記録する。
  • ネット画面はキャプチャ機能を活用する。
  • ICレコーダーを利用する(自分の話し方改善にも利用できる)。
  • 集合写真を撮る。
  • 移動中は携帯電話で記録する。
  • 音声(CD)を利用する。
  • タイムログ(時間の家計簿)を記録する。

2010年8月14日土曜日

AIRで挫折したので、JavaFXでの作成を試みる

AIRでは、結局画面のキャプチャを取る方法がなかった(みつからなかった?)ので、AIRの対抗馬と言える(?)JavaFxを利用して作ろうかと試みてみました。
HSVやRGBを変更したときの再計算の処理はJavaで実装しようとしてみたのですが、JavaFxは型なし言語で、Javaは静的な型あり言語。どうもJavaFxのスライダーの値をJavaのライブラリに渡すのが上手くいかない。誤差がすごい出て、動きがめちゃくちゃになってしまう。結局JavaFxでの開発はあきらめて、Swingを利用することに決めました。

2010年8月12日木曜日

スクリーンからのサンプリングを試みるも挫折

AIRでカラーピッカーを作ろうとしているんですが、カラーピッカーに必要な画面のキャプチャ機能を作ろうとしたのですが、色々調べてみてもAIRに画面をキャプチャする方法が見つからなかった。
色々調べた結果、クリップボードの画像を画面に貼り付けられそうだという事はわかった。
なので考えた方法があらかじめ画面をキャプチャして、それを子ウィンドウ上に表示してウィンドウ内の色をキャプチャするという方法。

2010年4月4日日曜日

カラーピッカーを作るその3(RGB変換とAIRイベント)



前回カラーピッカーを作るための画面をMXMLで作成したのですが、これにイベントをつけました。
イベントの付け方なんですが、通常は


<mx:Button x="31" y="36" label="ウィンドウ作成" click="createWindow();" />


のようにmxmlファイルのタグでイベントと呼び出すメソッドの紐付けをするのですが、これをするとビューとロジックの分離が上手く行かないのが嫌で、こちらのサイトを参考にビューとロジックを分けて見ました。




このサイトでは、<helper>タグを利用しているようですが、自分は<logic>タグを利用しました。使い方は一緒です。



  1. IMXMLObjectインタフェースを継承したオブジェクトを生成する
  2. イベントハンドラを設定するメソッドを作成する
  3. 作成したメソッドを initialized メソッドの中でFlexEvent.CREATION_COMPLETEイベントに紐づくようにする

という形になります。


HSB(色相、彩度、明度)で設定した色をRGBに変更するロジックは




から拝借しました。


ソースを全部のっけます。


colorPicker.ColorHSB.as ― HSBからRGBへの変換ロジックのあるクラス


package colorPicker {
public final class ColorHSB
{
public var h:uint = 0;    // hue
public var s:uint = 0;    // saturation
public var b:uint = 0;    // brightness

public function ColorHSB(hue:uint = 0, saturation:uint = 0, brightness:uint = 0)
{
h = hue;
s = saturation;
b = brightness;
}

public function to_object():Object
{
return {h:h, s:s, b:b };
}

public static function rgb_to_hsb(color:uint):ColorHSB
{
var r:int = (color >> 16) & 0xFF;
var g:int = (color >> 8) & 0xFF;
var b:int = color & 0xFF;

var min:int = Math.min(Math.min(r, g), b);
var max:int = Math.max(Math.max(r, g), b);

var delta:int = max - min;

var brightness:int = max;
var saturation:Number = (max == 0) ? 0 : Number(delta) / max;

var hue:Number = 0;
if (saturation != 0) {
if (r == brightness) hue = (60 * (g - b)) / delta;
else if (g == brightness) hue = 120 + (60 * (b - r)) / delta;
else    hue = 240 + (60 * (r - g)) / delta;

if (hue < 0) hue += 360;
}

return new ColorHSB(Math.round(hue), Math.round(saturation * 100), Math.round((brightness / 255) * 100) );
}

public static function hsb_to_rgb(hsb:ColorHSB):uint
{
var brightness:Number = hsb.b / 100;
if (brightness == 0) return 0;
var hue:Number = (hsb.h % 360) / 60;
var saturation:Number = hsb.s / 100;

var i:Number = Math.floor(hue);
var p:Number = (1 - saturation);
var q:Number = (1 - (saturation * (hue - i)));
var t:Number = (1 - (saturation * (1 - (hue - i))));

var r:Number, g:Number, b:Number;
switch (i) {
case 0: r = 1; g = t; b = p; break;
case 1: r = q; g = 1; b = p; break;
case 2: r = p; g = 1; b = t; break;
case 3: r = p; g = q; b = 1; break;
case 4: r = t; g = p; b = 1; break;
case 5: r = 1; g = p; b = q; break;
}

return ((Math.round(r * 255 * brightness) & 0xFF) << 16) | ((Math.round(g * 255 * brightness) & 0xFF) << 8) | (Math.round(b * 255 * brightness) & 0xFF);
}
}
}


colorPicker.ColorPickerEvent.as ― イベントハンドラを登録しているクラス


package colorPicker {
import mx.core.*;
import mx.events.*;
import colorPicker.*;
import flash.display.*;
import flash.events.*;
import flash.geom.*;
import flash.desktop.*;

public class ColorPickerEvent implements IMXMLObject
{
// 新しく生成するウィンドウを格納する変数
public var win:NativeWindow;

private var view:ColorPicker;

/**
* インタフェースから継承したメソッド
*
* @param Object document
* @param String id
*/
public function initialized(document:Object, id:String):void
{
view = document as ColorPicker
view.addEventListener(FlexEvent.CREATION_COMPLETE, creationCompleteHandler);
}


/**
* アプリケーション生成完了時に呼び出されるメソッド
*
* @param FlexEvent event
*/
private function creationCompleteHandler(event:FlexEvent):void
{
// 初期値設定
redraw(0xFFFFFF);

// イベント設定
view.colorText.addEventListener(FlexEvent.ENTER, colorTextEnterEvent);
view.tx_r.addEventListener(NumericStepperEvent.CHANGE, rgbStepperEvent);
view.tx_g.addEventListener(NumericStepperEvent.CHANGE, rgbStepperEvent);
view.tx_b.addEventListener(NumericStepperEvent.CHANGE, rgbStepperEvent);
view.rSlider.addEventListener(SliderEvent.CHANGE, rgbSliderEvent);
view.gSlider.addEventListener(SliderEvent.CHANGE, rgbSliderEvent);
view.bSlider.addEventListener(SliderEvent.CHANGE, rgbSliderEvent);
view.tx_h.addEventListener(NumericStepperEvent.CHANGE, hsvStepperEvent);
view.tx_s.addEventListener(NumericStepperEvent.CHANGE, hsvStepperEvent);
view.tx_v.addEventListener(NumericStepperEvent.CHANGE, hsvStepperEvent);
view.hSlider.addEventListener(SliderEvent.CHANGE, hsvSliderEvent);
view.sSlider.addEventListener(SliderEvent.CHANGE, hsvSliderEvent);
view.vSlider.addEventListener(SliderEvent.CHANGE, hsvSliderEvent);
}


/**
* HSVのNumericStepperが変更されたときのイベント
*
* @param NumericStepperEvent event
*/
private function hsvStepperEvent(event:NumericStepperEvent):void
{
var hsb:ColorHSB = new ColorHSB(view.tx_h.value,
view.tx_s.value,
view.tx_v.value);
var color:uint = ColorHSB.hsb_to_rgb(hsb);
redraw(color);
}


/**
* RGBのNumericStepperが変更された時のイベント
*
* @param NumericStepperEvent event
*/
private function rgbStepperEvent(event:NumericStepperEvent):void
{
var r:uint     = view.tx_r.value;
var g:uint     = view.tx_g.value;
var b:uint     = view.tx_b.value;
var color:uint = r << 16 | g << 8 | b;
redraw(color);
}


/**
* HSVのスライダーが変更された場合のイベント
*
* @param SliderEvent event
*/
private function hsvSliderEvent(event:SliderEvent):void
{
var hsb:ColorHSB = new ColorHSB(view.hSlider.value,
view.sSlider.value,
view.vSlider.value);
var color:uint = ColorHSB.hsb_to_rgb(hsb);
redraw(color);
}

/**
* RGBのスライダーが変更された場合のイベント
*
* @param SliderEvent event
*/
private function rgbSliderEvent(event:SliderEvent):void
{
var r:uint     = view.rSlider.value;
var g:uint     = view.gSlider.value;
var b:uint     = view.bSlider.value;
var color:uint = r << 16 | g << 8 | b;
redraw(color);
}


/**
* 色指定テキストに値を設定する
*
* @param uint color
*/
private function updateColorText(color:uint):void
{
var colorStr:String = rightAlign(color.toString(16), 6, "0");
view.colorText.text = "#" + colorStr.toUpperCase();
}

/**
* 指定した桁数になるまで、指定した文字列を右詰する
*
* @param String str
* @param uint   digit
* @param String fill
* @reutrn String
*/
private function rightAlign(str:String, digit:uint, fill:String):String
{
var i:int = digit - str.length;
while(i-- > 0) str = fill + str;

return str;
}

/**
* エンタキー押下時のイベント
*
*/
private function colorTextEnterEvent(event:FlexEvent):void
{
var s:String = view.colorText.text.toUpperCase();
var d:String = "";
for (var i:int = 0; i < s.length; i++) {
var c:int = s.charCodeAt(i);
if ( ( c < 48 || c > 57) && (c < 65 || c > 70 ) ) continue;
d += String.fromCharCode(c);
}
var color:uint = uint(d == '' ? 0 : '0x' + d);
redraw(color);
}


/**
* 指定された色にあわせてバーと数値を変更する
*
* @param uint color
*/
private function redrawBars(color:uint):void
{
var r:uint = (color >> 16) & 0xFF;
var g:uint = (color >> 8) & 0xFF;
var b:uint = color & 0xFF;

var hsb:ColorHSB = ColorHSB.rgb_to_hsb(color);

// 値を設定する
view.rSlider.value = r;
view.tx_r.value = r;
view.gSlider.value = g;
view.tx_g.value = g;
view.bSlider.value = b;
view.tx_b.value = b;
view.tx_h.value = hsb.h;
view.hSlider.value = hsb.h;
view.tx_s.value = hsb.s;
view.sSlider.value = hsb.s;
view.tx_v.value = hsb.b;
view.vSlider.value = hsb.b;
}


/**
* 指定した色を元に画面を再描画する
*
* @param uint color
*/
private function redraw(color:uint):void {
updateColorText(color);
view.colorCanvas.setStyle("backgroundColor", color);
redrawBars(color);
}
}
}


ColorPicker.mxml


<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" height="380" width="560" backgroundColor="#ffffff" xmlns:logic="colorPicker.*">
<logic:ColorPickerEvent id="logic" />
<mx:HBox backgroundColor="#d4d0c8" horizontalScrollPolicy="off" verticalScrollPolicy="off" height="90%" width="100%">
<mx:VBox backgroundColor="#d4d0c8" paddingLeft="10" paddingRight="10" paddingTop="10">
<mx:HBox>
<mx:TextInput id="colorText" maxChars="7" restrict="#a-fA-F0-9"/>
</mx:HBox>
<mx:Canvas id="colorCanvas" width="200" height="200"/>
</mx:VBox>
<mx:VRule strokeColor="#808080" shadowColor="#FFFFFF" height="100%"/>
<mx:VBox paddingLeft="10" paddingTop="10">
<mx:HBox>
<mx:Label text="R" fontSize="12" fontWeight="bold" />
<mx:NumericStepper id="tx_r" maxChars="3" minimum="0" maximum="255" stepSize="1"/>
<mx:HSlider id="rSlider" minimum="0" maximum="255"
showDataTip="false"
tickColor="black"
snapInterval="1" tickInterval="10"
allowTrackClick="true"
liveDragging="true"/>
</mx:HBox>
<mx:HBox>
<mx:Label text="G" fontSize="12" fontWeight="bold" />
<mx:NumericStepper id="tx_g" maxChars="3" minimum="0" maximum="255" stepSize="1"/>
<mx:HSlider id="gSlider" minimum="0" maximum="255"
showDataTip="false"
tickColor="black"
snapInterval="1" tickInterval="10"
allowTrackClick="true"
liveDragging="true"/>
</mx:HBox>
<mx:HBox paddingBottom="20">
<mx:Label text="B" fontSize="12" fontWeight="bold" />
<mx:NumericStepper id="tx_b" maxChars="3" minimum="0" maximum="255" stepSize="1"/>
<mx:HSlider id="bSlider" minimum="0" maximum="255"
showDataTip="false"
tickColor="black"
snapInterval="1" tickInterval="10"
allowTrackClick="true"
liveDragging="true"/>
</mx:HBox>
<mx:HBox>
<mx:Label text="H" fontSize="12" fontWeight="bold" />
<mx:NumericStepper id="tx_h" maxChars="3" minimum="0" maximum="360" stepSize="1"/>
<mx:HSlider id="hSlider" minimum="0" maximum="360"
showDataTip="false"
tickColor="black"
snapInterval="1" tickInterval="10"
allowTrackClick="true"
liveDragging="true"/>
</mx:HBox>
<mx:HBox>
<mx:Label text="S" fontSize="12" fontWeight="bold" />
<mx:NumericStepper id="tx_s" maxChars="3" minimum="0" maximum="100" stepSize="1"/>
<mx:HSlider id="sSlider" minimum="0" maximum="100"
showDataTip="false"
tickColor="black"
snapInterval="1" tickInterval="10"
allowTrackClick="true"
liveDragging="true"/>
</mx:HBox>
<mx:HBox>
<mx:Label text="V" fontSize="12" fontWeight="bold" />
<mx:NumericStepper id="tx_v" maxChars="3" minimum="0" maximum="100" stepSize="1"/>
<mx:HSlider id="vSlider" minimum="0" maximum="100"
showDataTip="false"
tickColor="black"
snapInterval="1" tickInterval="10"
allowTrackClick="true"
liveDragging="true"/>
</mx:HBox>
</mx:VBox>
</mx:HBox>
</mx:WindowedApplication>