2010年2月6日
#
2010年1月20日
#
まず間違いなく車輪の再発明だろうけど晒す。
javascript:(function(){var%20q=(document.all)?document.selection.createRange().text:(window.getSelection()+'');if(q!==''){q='\"'+q+'\"%20';}url_next='http://twitter.com/home/?status='+encodeURIComponent(q)+encodeURIComponent(document.title)+'%20'+encodeURIComponent(location.href);location.href=url_next})();
登録はこちらからどうぞ
[2010/1/21修正]
- Webページの選択箇所を「"」で囲うように修正
- 選択してない場合、先頭に空白が入ってしまっていたので修正
たとえば、このページで実行すると、次のようなテキストがtwitterのtweet画面に設定されます。
"まず間違いなく車輪の再発明だろうけど晒す。" Webページの選択箇所をtweetするscriptlet http://blogs.wankuma.com/masaru/archive/2010/01/20/185206.aspx
2010年1月18日
#
SeagateのアレをRMAしてみる~その1~
SeagateのアレをRMAしてみる~その2~
の完結編。
その2でHDDを送った後、Seagateに到着したらまずその到着メールが届きました。
Seagate RMS Receipt Acknowledgement RMA#: XXXXXXXXX
それからしばらくして、今度は送付したよのメールが。
Ship Advice for Shipper Number XXXXXXXXXX
そして、いよいよブツが届きました。
結構でかい箱です。これを開けてみると・・・
こんな感じで波々スポンジでサンドされています。このスポンジを取ると・・・
がっちりと固定された、新しいHDDを拝むことができます。ちなみに同じ型のHDDみたいです。
無事に帰ってきたので、こいつは今度ブートディスクに仕立てあげようかと思ってますが、それはまた、別の、話・・・
「すべてがFになる」等の小説でおなじみの森博嗣さんによる、「自由」を扱った一冊。
森さんの小説が元々好きで、この本はたまたま書店で発見して購入しました。
目次
1章 人生の目的は自由の獲得である
2章 他者からの支配、社会からの支配
3章 身近に忍び寄る支配
4章 支配に対するレジスタンス
5章 やっかいなのは自分による支配
森さんは、知っている人は知っていると思いますが、かなりの「自由人」であるといえます(本人はまだまだ不自由だと思っているところもあるようですが)。
しかし、もちろん元々「自由」だったわけではもちろんなく、どのように「自由」を定義し、どうやって「自由」を獲得してきたのか、その方法を彼なりの視点から説明したのが本書です。
私なりに本書から感じたことは、外部からの支配、肉体的な制限による支配、自分の思い込みによる支配、それらに「支配されている」ことを認識し、その支配から脱却するため、とにかく「考え」て道を一歩一歩踏み出していこう、といったことです。
そしてこの考えは、今流行りの勝間さんの様々な著書や、Joel Spolskyの「射撃しつつ前進」にも通じるところがあり、「なるほど成功した人は、すべからくコツコツと努力しているのだな」と、少し納得した気分になりました。
実際にどのように「考える」のかは本書を読んでしていただくとして、最後に森さんが「自由」をどのように定義しているのか引用して、このエントリを終えたいと思います。
まえがきより
「自由というのは、自分の思ったとおりにできることです」
少しでも「不自由だな」「自由になりたいな」と思っている人には、ぜひお勧めしたい一冊です。
#そして今更だけど、@dankogaiも書評してたのね。
#404 Blog Not Found:全てがF(ree)になる? - #書評_ - 自由をつくる 自在に生きる
2010年1月13日
#
来たる1/16(土)、第13回長岡IT開発者勉強会が開催されます。
私も久しぶりに参加する予定です。また、秀丸ネタでひとつセッションも行います。
皆様お誘いあわせの上、ぜひご参加ください。
第13回勉強会(2010/01/16)
スペシャル企画!! WordPress祭り
日時
2010/01/16(土) 13:00~17:00
場所
長岡市 中央公民館 406教室
「美容室みょんみょん」「花のコメサン」のある交差点の通りを、少し進むと標識があるはずです。
バスを利用する場合
JR長岡駅前または厚生会館前で、
・[ 4番線]中央循環(外回り)
・[10番線]南循環(内回り)
・[ 6番線]西長岡・関原・大積行き
のいずれかのバスに乗り、千手3丁目停留所で下車。(約5分)バス停から徒歩1分。
参加料金
無料
内容
現在予定されているセッションです。(時間の都合や、初スピーカー優先の原則により変更する可能性があります)
- 13:00~13:30
準備、説明、役員会議
- 13:30~16:30
セッション
- 13:30~14:30 (質疑応答20分)
WordPressネタ
- 入門的な内容
- WordPress の携帯対応について
- 15:00~15:40(質疑応答10分)
障害者からみたWeb
- 15:50~16:20(質疑応答10分)
効率10倍UP!?秀丸IDE化法
- 16:30~16:50
LT、フリートーク
- 後片付け&解散(17:00)
資料はこちらになります。勉強会の終了後に懇親会を実施します。
懇親会
人数が多くなければ、予約を取らずにブラブラと適当なお店に飛び込んで適当に注文します。
人数多数のため会場を予約する予定です。予算は4000円以内におさめたいです
懇親会のみの参加もOKです。(連絡は@civicへ)ITと関係のない方の参加も歓迎です。
飲酒しない人に対する懇親会割引きは今回はやらない予定です。(期待していた方、申し訳ありません..)
実施しない理由は、今回は参加人数が多く会場の予約が必要となることと、飲み放題プランを適用したいためです。
初参加でも、遠慮なく申し込んで下さい。
(毎回、どなたか初参加の方がいらっしゃいますので、常連ばかりで入りづらいということはないはずです)
2010年1月7日
#
デザインパターンを学ぶ~その21:Commandパターン(1)~
デザインパターンを学ぶ~その22:Commandパターン(2)~
と続いたCommandパターンの最後は、Undo機能を実装してみましょう。手順は次の通り。
- Do、UndoメソッドをもつIUndoableCommandインターフェイスを定義します。
public interface IUndoableCommand
{
void Do();
void Undo();
}
- Receiverを定義します。今回はサンプルとしてCounterクラスを考えます。
public class Counter
{
public Counter(int initialValue)
{
Count = initialValue;
}
public void Up()
{
Count++;
}
public void Down()
{
Count--;
}
public int Count
{
get;
private set;
}
}
- Counterクラスに対し、カウントアップ、ダウンを行うCommandクラスを定義します。
public class CountUpCommand : IUndoableCommand
{
private Counter counter;
public CountUpCommand(Counter counter)
{
this.counter = counter;
}
public void Do()
{
counter.Up();
}
public void Undo()
{
counter.Down();
}
}
public class CountDownCommand : IUndoableCommand
{
private Counter counter;
public CountDownCommand(Counter counter)
{
this.counter = counter;
}
public void Do()
{
counter.Down();
}
public void Undo()
{
counter.Up();
}
}
- Undoに備えて何もしないNullCommandクラスも定義します。
public class NullCommand : IUndoableCommand
{
public void Do()
{
}
public void Undo()
{
}
}
- Invokerとして、CountManagerクラスを定義します。
public class CountManager
{
private IUndoableCommand upCommand; // カウントアップ用Command
private IUndoableCommand downCommand; // カウントダウン用Command
private IUndoableCommand undoCommand; // Undo用Command
public CountManager(IUndoableCommand upCommand, IUndoableCommand downCommand)
{
// 引数で渡されたCommandをフィールド設定
this.upCommand = upCommand;
this.downCommand = downCommand;
// 最初はUndo操作をしても何もしないので、
// NullCommandをundoCommandに設定
this.undoCommand = new NullCommand();
}
public void DoUp()
{
// カウントアップ実行
upCommand.Do();
// 実行したCommandをundoCommandに設定
undoCommand = upCommand;
}
public void DoDown()
{
// カウントダウン実行
downCommand.Do();
// 実行したCommandをundoCommandに設定
undoCommand = downCommand;
}
public void Undo()
{
// Undo実行
undoCommand.Undo();
// Undoを連続して行えないよう、
// NullCommandを設定
undoCommand = new NullCommand();
}
}
では、実行してみましょう。実行用コードは以下の通りです。
class Program
{
static void Main(string[] args)
{
// 新規カウンター(Receiver)作成
Counter counter = new Counter(10);
Console.WriteLine(counter.Count);
// カウントアップ、ダウン用Commandクラスのインスタンス作成
CountUpCommand cuc = new CountUpCommand(counter);
CountDownCommand cdc = new CountDownCommand(counter);
// CountManager(Invoker)を作成
CountManager cm = new CountManager(cuc, cdc);
// カウントアップ
cm.DoUp();
Console.WriteLine(counter.Count);
// カウントダウン
cm.DoDown();
Console.WriteLine(counter.Count);
// Undo
cm.Undo();
Console.WriteLine(counter.Count);
// Undo
cm.Undo();
Console.WriteLine(counter.Count);
}
}
実行結果は以下の通り。
一度目のUndoでカウンターが元に戻り、二度目のUndoではカウンターに変化がないことが確認できます。
さて、ここまでのやり方は一度しかUndoが出来ないものでした。これを複数回Undo可能にするにはどうすればいいのでしょうか?
実はかなり簡単です。Invokerの中にStackとして実行したCommandを保持して、PopしながらUndoを行えばいいだけです。以下は、複数回のUndoを可能にしたCountManagerMultiUndoableです。
public class CountManagerMultiUndoable
{
private IUndoableCommand upCommand; // カウントアップ用Command
private IUndoableCommand downCommand; // カウントダウン用Command
private Stack<IUndoableCommand> undoCommands; // Undo用CommandのStack
public CountManagerMultiUndoable(IUndoableCommand upCommand, IUndoableCommand downCommand)
{
// 引数で渡されたCommandをフィールド設定
this.upCommand = upCommand;
this.downCommand = downCommand;
// Stackを初期化
undoCommands = new Stack<IUndoableCommand>();
}
public void DoUp()
{
// カウントアップ実行
upCommand.Do();
// 実行したCommandをStackにPush
undoCommands.Push(upCommand);
}
public void DoDown()
{
// カウントダウン実行
downCommand.Do();
// 実行したCommandをStackにPush
undoCommands.Push(downCommand);
}
public void Undo()
{
if (undoCommands.Count != 0)
{
// Stackが空でなければ、PopしてUndo実行
var undoCommand = undoCommands.Pop();
undoCommand.Undo();
}
}
}
では、実行してみましょう。先ほどと違って、Undoを3回行うようにしてみます。
class Program
{
static void Main(string[] args)
{
// 新規カウンター(Receiver)作成
Counter counter = new Counter(10);
Console.WriteLine(counter.Count);
// カウントアップ、ダウン用Commandクラスのインスタンス作成
CountUpCommand cuc = new CountUpCommand(counter);
CountDownCommand cdc = new CountDownCommand(counter);
// CountManager(Invoker)を作成
CountManagerMultiUndoable cm = new CountManagerMultiUndoable(cuc, cdc);
// カウントアップ
cm.DoUp();
Console.WriteLine(counter.Count);
// カウントダウン
cm.DoDown();
Console.WriteLine(counter.Count);
// Undo
cm.Undo();
Console.WriteLine(counter.Count);
// Undo
cm.Undo();
Console.WriteLine(counter.Count);
// Undo
cm.Undo();
Console.WriteLine(counter.Count);
}
}
実行結果は以下の通りです。
2度Undoが行われ、3度目は何もカウンターに変化がないことが確認できます。
ここまで3回にわたりCommandパターンを紹介しましたが、いかがでしたでしょうか?
Commandパターンは他にも、
- QueueにCommandオブジェクトを登録して順次呼び出す
- Commandオブジェクトを永続化して、必要な際に取り出して呼び出す
- Commandオブジェクトを直列化(シリアライズ)して、ネットワークなどの境界を越えて実行
など、色々と活用する場面があるようです。
私も今後もどのように有効に活用できるか考えていきたいと思います。
昨年はまったくと言っていいほど進まなかった、このデザインパターンシリーズ。今年はがんばってやっていこうと思います。次回は「Adapterパターン」に入っていくつもりですので、今後ともお付き合いをお願いします。
なお、今後コードはC#のみとさせてもらいます。案外VBにportするのが大変なものでf(^^;
2010年1月1日
#
あけましておめでとうございます。
いよいよ2010年が始まりました。
大晦日、教育テレビで過去の映像が紹介されていて、そこに出てきた松下幸之助さんがこんなことをおっしゃっていました。
「資本主義も社会主義も共産主義もない新しい時代が早くて50年、遅くとも100年後にはやってくる」
これが1962年の言葉です。まだ、戦後間もない時代にこんなことを言っていたことに驚きなのですが、昨年からの世間はまさに上で言ったような時代への過渡期のように感じます。
そんな時代ですので、政治、経済ともなかなかに厳しい昨今ですが、皆様にとって明るい一年となりますように!
本年もよろしくお願いいたします。
2009年12月30日
#
後2日を残していますが、早めに。
まずは、当初の目標から振り返ってみます。昨年のエントリを見直してみたらこんなこと書いていました。
ただ、心残りなのは、blogでのデザインパターンシリーズが一向に進まなかったことです。最近は徐々に時間を取れるようにもなってきましたし、急がずに最後までいけるよう頑張ります。
さらには、宣言してしまった家計簿ソフトの開発。こちらもぼちぼちと進めていきます。
うわー、両方出来てないや・・・
ただ、今年は思いもよらない、とあるプロジェクトの作業などにほとんどのリソースを割いたので仕方ないかなぁと言い訳。すみません、次こそはがんばります。
コミュニティ活動については、相変わらずわんくま勉強会には参加できませんでした。が、長岡IT開発者勉強会(NDS)では、スピーカーとして3回登壇しましたし、Ruby on Railsに触れたり、参加者とtwitterでさらにつながってみたりと、なかなかに充実していたと感じています。
また、12月頭には長岡のtwittererが一堂に会して忘年会を行うなど、なかなか愉快なことになっています。昨年の年末にこんなことになっているとは予想もできませんでした。twitterがここまではやるとも思ってませんでしたし。
来年はそろそろ息子も大きくなってきましたし、上記とあるプロジェクトも全てのリソースを割かなくてはならないほどの状況は脱しましたので、今まで以上に積極的にコミュニティ活動を行っていくつもりです。
そんなわけで、第一弾はNDSの第13回勉強会が1/16にあり、そこで秀丸IDE化についてセッションします。お暇な方はぜひ。
あとは、仕事、プライベートについてですね。
まずは、今年とうとう家を建てちゃいました。それにともない、確定申告が大変なことになるので、がんばらないといけませんね。ただ、おかげで行動の拠点が定まりましたので、主に気持ちの上で色々と楽になりました。
仕事では、会社に「(子供が小さいうちは)なるべく出張がないように」とお願いしていたこともあり、ほとんど自社で様々なプロジェクトをちぎっては投げ、ちぎっては投げ状態でした。
そんな中、Javaでしたがライブラリというかフレームワークと言うか、「指定されたフレームワークに皮をかぶせるお仕事」が出来たのは幸いでした。数年前から地道に蓄えてきた知識を、ようやく実践の場で試せる機会が出来ましたので。ただ、実際やってみると、楽しいけど大変ですねライブラリ作るのって。その節は主にtwitterで色々な方にお世話になりました。ありがとうございました。
あとは、プロジェクトのサブのサブチーム程度のところで、管理者業務を経験することもできました。中身はまぁちょっとあれでしたが、納期には間に合わせたので結果は及第点かなと。ただし、もう少しうまく回せばメンバーの負担も多少は軽減できただろうなと思うところもあり、そこは反省点として今後に生かしていくつもりです。
#そもそもの作業量と納期がおかしいことはありますが、ね・・・
さて、来年はとうとう「三十路」に踏み入れる年となります。なんだか言い表しようのない焦燥感に駆られますが、まずは自分の体調、生活を第一に、無理せず仕事もコミュニティ活動も行っていくようにしたいと思います。身体や家族をないがしろにしても意味はありませんから。
その上で、より一層のクオリティ、パフォーマンスを発揮できるよう、自らを磨きあげることも忘れないようにしていきたいと思います。
それでは、みなさま今年も大変お世話になりました。今後ともよろしくお願いします。
良いお年を!
2009年12月26日
#
SeagateのアレをRMAしてみる~その1~の続き。
ようやく100均で材料をそろえたので、今回は梱包について。
材料
- 100均で仕入れた適当な箱
- 100均で仕入れた洗車用スポンジ×2
- 静電気防止袋(Amazonでポチった)
手順
- HDDを静電気防止袋に入れます。
- 箱に洗車用スポンジのでこぼこした方を上に詰め込みます。

↓これをこんな感じで
- その上にHDDを置きます。
- HDDを挟み込むように、もう1つの洗車用スポンジをのせます。
- 無理やり押し込んで、箱のふたをテープで固定します。
- RMA申請時に届いたメールについていた、RMA番号付きのラベルを印刷して貼り付けます。
Seagateのサイトにある梱包方法とは違いますが、がっちり固定されてるので、まぁいいかなーと。
あとは、ラベルに書かれた宛先に送るだけです。今日、明日のうちに発送する予定です。
この続きは発送後に。
2009年12月11日
#
ちょっと必要になったので。
#コードはXMLリテラルでXElementが簡単に作れるVBで。
その1:XmlDocument.LoadXmlメソッドにXElementをToStringして食わせる
Dim xelm = _
<parent>
<child>
ほげほげ
</child>
</parent>
Dim xmlDoc As New XmlDocument()
xmlDoc.LoadXml(xelm.ToString())
その2:XmlDocument.LoadメソッドにXElement.CreateReaderで作成したXmlReaderを食わせる
Dim xelm = _
<parent>
<child>
ほげほげ
</child>
</parent>
Using reader As XmlReader = xelm.CreateReader()
Dim xmlDoc As New XmlDocument()
xmlDoc.Load(reader)
End Using
なんか他にいい方法があったら教えてください。