2008年12月31日

2008年最後の投稿

今日は12月31日。大晦日。
そんな2008年最後の日に、この1年を振り返ってみる。

このブログをはじめたのは2008年2月の事。プログラムに関することをブログで書くという事はいろいろ悩んだ部分もあったけど、公に晒すというのは良い刺激にもなって思い切ってはじめてよかったと思っている。来年はもっと投稿のペースを上げたい。

勉強会に参加するようになったのも、おなじく2月。9月には懇親会にも参加して会社以外の人と話をする機会もあった。今後も参加していくつもり。

Googleが提供していた3D仮想世界Livelyで遊んで、いろいろな人に会った。残念ながら今日で終わってしまうが、ここで出会った方々とは今後もどこかでお会いできるでしょう。

こうしてみると、現実・ネットともに多くの人との「出会い」の1年だった。
来年もどうぞよろしくお願いいたします。

2008年12月4日

Pythonはじめる

2008/12/3(現地時間)に、Python3.0がリリースされた。
http://www.python.org/download/releases/3.0/
この機会に本気でPythonを勉強してみようと思う。
早速インストールしてみる。インストーラは上記URLのページから。Windowsの場合は「Windows x86 MSI Installer (3.0)」か「Windows AMD64 MSI Installer (3.0) 」のどちらかを選択。ダウンロードしたものを実行してクリック、クリック。
今回はLinuxへのインストールに挑戦してみる。同URLから「Gzipped source tar ball (3.0)」を選択してダウンロードし、展開する。展開後はソースからのインストール。インストール先は/usr/lib/python3.0を指定した。

$ tar xvzf Python3.0.tgz
$ cd Python3.0/
$ ./configure --prefix=/usr/lib/python3.0
$ make
$ sudo make install

インストールの最後には、以下のようなメッセージが表示された。既にバージョン2.xがインストールされているなら、フルインストールはお勧めしない。

* Note: not installed as 'python'.
* Use 'make fullinstall' to install as 'python'.
* However, 'make fullinstall' is discouraged,
* as it will clobber your Python 2.x installation.
インストールが成功すると、/usr/lib/python3.0/bin/配下にバイナリpython3.0 があるので、それを実行する。するとインタラクティブモードで起動する。

Python 3.0 (r30:67503, Dec  4 2008, 22:58:26) 
[GCC 4.2.4 (Ubuntu 4.2.4-1ubuntu3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

遊んでみよう。

大好きなHelloWorld

>>> print('hello world')
hello world

電卓としてつかったり

>>> 3+4
7
>>> 80/4
20.0

「3」にちなんで、なべあつってみたり

>>> for i in range(10):
...  if (i % 3) == 0:
...   print(i, 'あほ')
...  else:
...   print(i)
... 
0 あほ
1
2
3 あほ
4
5
6 あほ
7
8
9 あほ

最初のHelloWorldについて、今までのバージョンでは

>>>print 'hello world'

として実行できたが、3.0からはエラーとなる。print「文」が廃止され、print「関数」として定義された為。今までのバージョンアップでは互換性を重視してきたが、3.0では互換性を犠牲にしてでも理想的な設計を目指したらしい。

「Python 3.0って何がすごいの?」という方は,以下の記事などをお読みいただけるとよいと思います:-D。
Python 3.0 リリース! — TRIVIAL TECHNOLOGIES 2.0
もっと知りたいPython3000

2008年11月18日

System.CodeDom

今回はSystem.CodeDom名前空間 のクラスたちで遊ぶ。CodeDomのクラスを用いるとソースコードの構成をクラスで表現することが出来る。例のごとくHelloWorldを作成してみる。

CodeCompileUnit compileiUnit = new CodeCompileUnit();

//名前空間追加
CodeNamespace sampleNamespace = new CodeNamespace("CodeDomSample");
compileiUnit.Namespaces.Add(sampleNamespace);

//System名前空間をインポート
CodeNamespaceImport systemImport = new CodeNamespaceImport("System");
sampleNamespace.Imports.Add(systemImport);

//クラス追加
CodeTypeDeclaration programType = new CodeTypeDeclaration("Program");
programType.IsClass = true;
sampleNamespace.Types.Add(programType);

//メソッド追加
CodeEntryPointMethod mainMethod = new CodeEntryPointMethod();
programType.Members.Add(mainMethod);

//メソッド内処理の設定
CodeMethodInvokeExpression hello = new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("Console"),
                                                                  "WriteLine",
                                                                  new CodePrimitiveExpression("Hello World"));

CodeExpressionStatement consoleWriteStatement = new CodeExpressionStatement(hello);
mainMethod.Statements.Add(consoleWriteStatement);

大きな流れは

  1. CodeCompileUnitクラスのオブジェクトを生成
  2. CodeCompileUnitオブジェクトに名前空間を追加
  3. 名前空間オブジェクトにタイプ(クラス)を追加
  4. タイプオブジェクトにメンバ(メソッド)追加
  5. メソッドにステートメント(処理)を追加
となる。
これをCodeDomProviderクラスを継承したクラスに渡せばソースコードファイルを生成することができる。

private void GenerateCodeFile(CodeCompileUnit unit)
{
    Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider();
    string fileName = "HelloWorld." + provider.FileExtension;
    using (System.IO.StreamWriter writer = new System.IO.StreamWriter(fileName))
    {
        System.CodeDom.Compiler.CodeGeneratorOptions options = new System.CodeDom.Compiler.CodeGeneratorOptions();
        options.IndentString = "    ";
        provider.GenerateCodeFromCompileUnit(unit, writer, new System.CodeDom.Compiler.CodeGeneratorOptions());
        writer.Close();
    }
}

生成されたHelloWorldソースは以下

//------------------------------------------------------------------------------
// 
//     このコードはツールによって生成されました。
//     ランタイム バージョン:2.0.50727.1433
//
//     このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
//     コードが再生成されるときに損失したりします。
// 
//------------------------------------------------------------------------------

namespace CodeDomSample {
    using System;

    public class Program {
        
        public static void Main() {
            Console.WriteLine("Hello World");
        }
    }
}

auto-generatedのコメントは消せないのかな。

2008年11月2日

セキュポロ参加してきた

北海道情報セキュリティ勉強会(おもに札幌)(通称:セキュポロ)に参加してきた。セキュリティに関して他の方の話を聞く機会が今まで無かったため、とても有意義な時間を過ごせた。書いておいたメモをいくつか

  1. 基調講演:IT革命とは何だったのか
    • ラリージャパンへようこそ。
    • 予約後プログラムでHello World
    • open xor die
    • pypyencodeをさがせ
    • 既に我々の世界は機械に支配されている?
  2. 100%技術者脳
  3. Webセキュリティ:開発現場の心理と現実的なWAFの運用
    • IISはエラー出力もブラウザへ返してしまう
    • サニタイズHTML Escapeの他に文字エンコーディングのチェックも必要
    • mod_wafful

ネタのメモばかりで本題のメモが少なかったが、気にしないでおく

2008年10月27日

BloggerのFollowが日本語にも対応してた

ちょっと前にクリボウさんのTipsに、BloggerにFollow機能が追加されたことが紹介されていた。記事中に

(今のところ、表示言語を英語にした場合のみ)
と書かれている通り、このブログでは使用できないでいたのだが、先日ふと使用できることに気がついた。ブログパーツ「読者」も追加したところ、問題なく使用できた(しかし、読者数0という悲しい結果を目の当たりにしたのですぐ削除した)。



追加の手順

手順 1:「追加」ボタンを押押すと表示される。ここでURLを直接入力するか、Google Readerから指定する。
手順 2:追加した相手やその他ユーザに知らせるかどうかを指定する

なお、追加したリストはGoogle Readerに「読者になっているブログ」として追加される。つまりGoogle ReaderからBloggerの閲覧リストに追加した場合は、また別途Google Readerに追加される、という。。

管理

「管理」ボタンを押すと、下の画面が表示される(手順2の公開・匿名を変更するものと思う)

「2さんのブログ」の「2」は件数だろうか。

2008年10月9日

Predicate デリゲート

配列の中から、「ある条件に一致するものを探す」ような場面ではSystem.Array クラスのジェネリックメソッドが使える。例えば

  • Find:ある条件に一致する要素を探す
  • Exists:ある条件に一致する要素が存在するかどうかを調べる
  • FindIndex:ある条件に一致する要素のインデックスを取得

など。これらのメソッドの引数にPredicateデリゲートを渡す必要がある。このデリゲートには「ある条件に一致かどうか」を返す処理を実装する。

public void Execute()
{
    string[] animals ={ "cat", "dog", "pig", "bear" };

    Console.WriteLine(Array.Exists(animals, new Predicate(StartWithP)).ToString());
    Console.WriteLine(Array.Find(animals, new Predicate(StartWithP)));
    Console.WriteLine(Array.FindIndex(animals, new Predicate(StartWithP)).ToString());
}

//"p"で始まるかどうかを判定する
private bool StartWithP(string value)
{
    return (value.StartsWith("p"));
}

ただし、これだと「ある条件」が固定となってしまう。
条件を動的にするには以下のように変数を使用すればよいが、以下のようにExecuteメソッドの外に宣言しなければならない。

private string _condition;

public void Execute()
{
    string[] animals ={ "cat", "dog", "pig", "bear" };
    _condition = "p";

    Console.WriteLine(Array.Exists(animals, new Predicate(StartWith)).ToString());
    Console.WriteLine(Array.Find(animals, new Predicate(StartWith)));
    Console.WriteLine(Array.FindIndex(animals, new Predicate(StartWith)).ToString());
}

//指定の文字列で始まるかどうかを判定
private bool StartWith(string value)
{
    return (value.StartsWith(_condition));
}

ここはこの変数のスコープをExecuteメソッド内としたいところ。
なるほど、ここで匿名メソッドが使える。匿名メソッドではその外部のメソッド内のローカル変数にもアクセス可能であるため、条件を示す変数もExecuteメソッド内に宣言できる。

public void Execute()
{
    string[] animals ={ "cat", "dog", "pig", "bear" };
    string condition = "p";

    //匿名メソッドで指定文字列から始まるかを返すメソッドを定義
    Predicate d = delegate(string value) { return (value.StartsWith(condition)); };
    Console.WriteLine(Array.Exists(animals, d).ToString());
    Console.WriteLine(Array.Find(animals, d));
    Console.WriteLine(Array.FindIndex(animals, d).ToString());
}

これは便利だ

2008年9月29日

CLR/H Community Launch 2008 Autumnのメモ

CLR/HのCommunity Launch 2008 Autumnに参加してきた。すこしメモをとったので書いてみる。

  1. こんなにも面白い!こんな風に作ろう!ASP.NET MVCによるサイト構築
    • ASP.NETとは考え方が大きく異なる
    • URLルーティングを使用してURLも設計できる
    • Visual StudioでMVCプロジェクトを作成すると単体テスト用プロジェクトも作られる(エディションによる)
    • アドインのインストールにご注意(?)
    • テストが行いやすい
    • RailsやDjango経験者におすすめ
    • コンセントつけ忘れにご注意
  2. Sliverlightで業務アプリを作る"ワケ"業務アプリプラットフォームとして見たSliverlight
    • Silverlight2では.NETのスキルを生かせる(C#やVB.NETでも開発ができる)
    • 配布サイズを小さくする目的により標準では配布されていないコントロールもある
    • コントロールにコントロールを配置することも可能
    • Blend不便(?)
    • テンプレートで独自UIを作る場合はプロパティのバインドが必要
    • Bindingクラスを有効活用すべし
    • Blend便利
    • イケメン
  3. 最新データアクセス・テクノロジー〜LINQ Entity Framework〜
    • System.Data.Common名前空間のクラス群はEntity Frameworkでも使用されている
    • LINQのプロバイダは自作も可能
    • LINQ to SQLで生成されるSQLはパラメータを使用している(インジェクション対応)
    • メジャーリーグにはルーズソックスというチームがある
    • Entity Frameworkで複数テーブルで構成していても、マッピングの設定を行えば更新はそれぞれのテーブルに行われる
    • SQL Server 2008 対応のManagement Studioではインテリセンスも動く
    • ユーザー定義テーブル型を使えばストアド引数にDataTableをバインドできる
    • FILESTREAMストレージでファイルシステムと統合(画像などのバイナリに最適)

2008年9月26日

無限ループ

久しぶりに無限ループにハマってしまった。手順は以下。
  1. 遊んでみたくなったのでubuntu serverをインストール
  2. apt-get updateで文字化け
  3. .bashrcをviで編集
  4. vi使ったことないので思うように入力できず
  5. emacsインストールしたくなる(emacsならなんとかなる気がする)
  6. apt-get install emacs で見つからない言われる(cdromしか見ていない模様)
  7. aptのsource.listをviで編集
  8. 手順4へ戻る
どうもネットワーク設定も失敗してるような。まずはviの操作をある程度調べなければ

2008年9月8日

MyMiniCityレベル2

いつからか始めたMyMiniCityもようやくレベル2へ到達。これからは人口増やすだけではいけないらしい。 こんどは工場を発展させる必要もある。人口だけ増えても仕事がない国なんて住んでられねーすよ。

2008/09/08現在の状況
    Population 人口 51 人
    Revenues 財政 7900 €
    Unemployment 失業率 0 %
    Transport 交通 100 %
    Crime rate 犯罪 0 %
    Pollution 環境汚染 0 %

2008年7月28日

「クリボウの部屋」を発見。日本語入力ツールを知る。

Livelyで遊んでいるとBlogger Tipsで何度もお世話になっているクリボウさんの部屋を発見。お邪魔してみた。ちょうどその時の画像がほかの方のBlogに載っていた。

2008/07/27現在。Livelyでのチャットに日本語入力ができないのだが、そこはやはり対応するツールがあるらしい。「Lively JP Chat Tool」略してLJCT。ここからダウンロードが出来る。

2008年7月21日

「Lively」ベータ開始

Googleが3D仮想空間「Lively」のベータ版を開始したらしいので、試しにやってみた。

グラフィックボードを搭載していない、オンボードなPCなのだが、それなりに動作するのが驚いた。比較されるであろう「Second Life」はやったことなく、3D仮想空間とやらは初めてなのだが、なかなか面白い。

試しに「Chuta's Room」を作ってみた。中にいくつかこのエントリへのリンクも仕込んでおいた。もしLivelyから来られた方は、コメントでも残していただけると有難い。

2008年7月20日

Bloggerでトラックバックを使う

Bloggerには標準でトラックバック打つことができない。HaloScanなどのサービスを利用する必要があるらしい。

やらなきゃと思いつつ、ずっとやっていなかったがやっと取り掛かった。

クリボウの Blogger 入門: トラックバックを参考に、と思ったが新たな方法がHaloScanで用意された模様。

  1. HaloScanでUserName、Passwordなど一通り登録
  2. 登録した内容でログイン
  3. 上部のInstallタブをクリック
  4. Blogger or Blogspot (New Version / Google Login)」を選んで「Next」をクリック
  5. ここで英語で手順が書かれているページが表示される。
  6. Bloggerのカスタマイズページへから「レイアウト」を選択
  7. 「HTMLの編集」を選択
  8. 「テンプレートをすべてダウンロード」をクリックし、テンプレートファイルをローカルに保存
  9. 手順5のページで「参照」ボタンより保存したテンプレートファイルを指定して「Upload Blogger Template」をクリック
  10. 次の画面へ遷移するので、「Donwload New Template」をクリック、ローカルに保存
  11. Bloggerカスタマイズ側で、手順10で保存したテンプレートファイルをアップロード

試しにこのブログの最初の投稿へトラックバックしてみる。

2008年6月13日

iGoogleから投稿

クリボウの Blogger Tips: iGoogle で Blogger 投稿ができるガジェット「Blogger Post Gadget」を知ったので、早速使ってみる。 Blogger上で追記 ボタン押した後、「Invalid JSON format. Unescaped JSON is a not supported format for attribute or text values.」と出て何度か試していたら、すべて保存されていた。

2008年5月13日

IDE依存

プログラム始めた時に必ず書くであろう世界で一番有名なプログラム「Hello World」。最初はIDEを使わないでビルドして欲しい。これはもう時代遅れの考えなのだろうか?

2008年3月1日

匿名メソッド

C#2.0からの機能として「匿名メソッド」があるが、VBにはない。どんなものか試しに使ってみる。

using System;

class anonumous
{
    static void Main(string[] args)
    {
        GetStringDelegate d = delegate { return "Hello World"; };
        Console.WriteLine(d.Invoke());
    }
    private delegate string GetStringDelegate();
}

「Hello World」の文字列を返すメソッドは、その名の通り名前のないメソッドとなっている。

2008年2月20日

ConditionalAttribute クラス

最近必要になったので。
虫を取り除く(Debug)には殺虫剤(デバッグ用のメソッド)が必要になる場合があるが、それが製品(Releace)にも含まれていたら大変である。 デバッグ用メソッドはDebugビルドの場合のみビルドされるようにしたい そこで、属性ConditionalAttributeを利用する。 この属性をデバッグ用メソッドに付け、conditionStringに文字列"DEBUG"を指定する。これによってこのメソッドはコンパイル定数DEBUGを定義してビルドした場合にのみ実行されるようになる。(Visual Studioの規定ではDebugビルド時にはコンパイル定数DEBUGが定義されている。)

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            ReleaseMethod();
            DebugMethod();
        }

        static void ReleaseMethod()
        {
            Console.WriteLine("おいしい餃子");
        }

        [System.Diagnostics.Conditional("DEBUG")]
        static void DebugMethod()
        {
            Console.WriteLine("殺虫剤 噴出中");
        }
    }
}
Debugでビルドした場合。
    おいしい餃子
    殺虫剤 噴出中
Releaceでビルドした場合。
    おいしい餃子

ただし、これで出来上がった製品は殺虫剤を噴出はしないが、隠し持っている状態になる。

2008年2月19日

メモ帳とコマンドプロンプトでC#アプリケーションを作成するには

今更ながらC#をはじめようと思う。
兎にも角にもHello Worldを書いてみる。ただ書くのでは面白くないので、全くの初心者相手を想定した説明も書いてみる。


「メモ帳とコマンドプロンプトでC#アプリケーションを作成するには」



  1. Windowsのスタートメニューより「すべてのプログラム」→「アクセサリ」→「メモ帳」を選択します。
  2. メモ帳が起動したら、以下のコードを記述します。
    using System;
    public class Helloworld{
    public static void Main(){
    Console.WriteLine("Hello World !");
    }
    }

  3. ファイルに「HelloWorld.cs」と名前をつけてC:\Documents and Settings\<ユーザ名>\に保存します。
  4. 次にスタートメニューより「すべてのプログラム」→「アクセサリ」→「コマンドプロンプト」を選択します。
  5. コマンドプロンプトに以下の内容を打ち込んでEnterを押します。
        > "C:\Program Files\Microsoft.NET\SDK\v2.0\Bin\sdkvars.bat"
    > csc HelloWorld.cs

  6. 何も表示されなければ、コンパイルが成功です。次のようにコマンドプロンプトに打ち込んで起動します。
        >    HelloWorld.exe

  7. 「Hello World !」と表示されればプログラムは正常に動作しています。

2008年2月11日

基本的なHTML

投稿時の参考用にメモ 基本的な HTML について教えてください。 プログラムなどのコードを記述するにはどうすれば良いのか調査中

2008年2月6日

コミュニティ参加してきました。

自分もいいかげん次のステップへ、ということで先日コミュニティを知る為にCLR/H コミュニティローンチ 2008に参加してきた。 .NET Framework 3.0以降について全く知識を持たずに行ったのだが、とても参考になった。まずは「WPF」をキーワードに勉強していこうか。

2008年2月3日

ブログはじめました。

自分もいいかげん次のステップへ、ということで何かのきっかけになればと思いブログをはじめました。