2009年11月21日
放置しすぎ……
2009年06月23日
WPF面白い
ブログすっかりご無沙汰してました。書きたいことはたくさんあるのですが、なかなか記事にするのが面倒くさくて……。ただ、最近文章熱も上がってきたので少しずつ記事を上げていこうと思います。
で、近頃はWPFをちょこちょこ調べています。調べれば調べるほど奥が深いというか、良く出来ていることを実感します。依存プロパティ、コマンド、バインディングといった諸機能が協調してUIとロジックの分離を促進しているところなど、かなり感動的です。
ただ、そのぶん覚えることも多くて大変です。精進あるのみですね。勉強の成果はブログに書いていきたいと思います。週1回程度のペースでのんびりと……。
2008年10月05日
日本HP Pavilion Notebook dv5/CTが届いた
ついに、注文していたdv5/CTが届きました。初期設定と普段使うソフトウェアのインストールを終えて2日ほど稼働してみた段階での感想を書いていきたいと思います。
まずは初期設定についてです。日本HPのサポートページを見る限りではBIOSやドライバがdv5発売後にアップデートされていましたが、それらはしっかり最新のものがインストールされていました。ですので、ネットワークの設定後にWindows Updateをするぐらいで大した作業にはなりませんでした(BIOSやドライバのアップデートに関してもHP Software UpdateというHP製品用のアップデート管理ソフトを使えば簡単に行えるようです)。
ただ、リカバリディスクの作成がかなり面倒でした。ファイルの作成などの準備に非常に時間がかかる上に、DVDへの書き込みも時間がかかります。さらに私の場合は書き込みに失敗してはじめからやり直したりしたため、総合するとかなりの時間を費やしました。
続いてしばらく使ってみた感想をずらずら並べてみます。
店頭でも確かめましたが見た目は良いです。ですが、液晶が光沢タイプ、さらにキーボードも全体的に光沢があるので、明るいところでは光の反射が少し気になります。また、ピカピカボディなのでほこりや指紋、油が目立つので、付属のクロスでこまめに拭く必要があります。
キーボードについては最初はバックスペースキーとホームキーを打ち間違えることが多くイライラしましたが、慣れると間違えなくなりました。打鍵の感触は普通のノートPCのキーで可もなく不可もなくといったところです。
性能については文句なしです。Visual Studio 2008もサクサク動きますし、ウィルスチェック中でも各種作業が問題なく行えます。発熱に関しては私が大した作業をしてないせいかそれほど気になりません。
今のところ大した問題もなく快適に使えています。あとは壊れないことを祈るばかりです。
2008年09月15日
ノートPCを注文した
6年前に購入した自宅デスクトップPC(Windows XP Home SP3、Cerelon 2.4GHz、512MBRAM)ではVisual Studio 2008でのASP.NETアプリケーション開発を行うのはさすがに厳しいということが判明したので、PCを買い換えることにしました。
まずデスクトップPCにするかノートPCにするかで悩みました。自宅デスクトップPCの新調なので運搬について考える必要はないのですが、最近のノートはスペックも充分あるようですし場所もとらないということでノートPCにしました。
続いてどのノートPCにするかです。趣味のプログラミングに使うということで
- Visual Studio 2008が快適に動作する
- 画面解像度は1280×800以上である(広ければ広いほど嬉しい)
の2点をベースに、
- 値段はそれなり(あまりにも高いのは無理)
- デザインもそれなり(あまりにも格好悪いのはやだ)
という2点を加味しつつ各メーカーサイトを見てまわり、
を購入候補に選びました。店頭で現物を見たところdv5/CTはデザインがなかなか良く性能的にもカタログ上ではThinkPad T500に勝るとも劣らないようなので、dv5/CTに決めました。
HPのオンラインストアで注文して、10月1日に届く予定です。待ち遠しい……。
2008年09月01日
仕事で.NET漬け
お久しぶりです……。平日は仕事、土日はだらけてしまってすっかりブログの更新が滞っていましたが、最近は仕事というものに少しは慣れてきて心に余裕が出来てきたので、またぼちぼちブログを書いていこうと思います。
仕事について、研修などでは会社的にはJavaの案件が多いという話を聞いていました。ですが、「C#できます」と入社前に言っていたせいかこれまでのところ.NETの案件に回されています。どうもこのまま.NET/Windows系開発要員になりそうです。
そんなわけで、最近お仕事で
- Office Open XML形式のWordファイルから文書情報を格納したXMLファイルを取り出す
- 取り出したファイルをXSLTスタイルシートで変換する
- 変換後のファイルをLINQ to XMLで処理する
みたいなことをやりました。LINQ to XMLをはじめて触りましたが、XMLReader/WriterやDOMにくらべてとんでもなく楽にXMLをいじれますね。かなり使い勝手がよいです。
Office Open XMLやLINQ to XMLのほかにも、仕事をしているとブログのネタに出来そうなことにちらほら遭遇しますので、随時記事にしていきたいと思います。
2008年05月11日
ADO.NETを勉強中
今まであまり手を出してこなかったADO.NETを勉強し始めました。面白いのですが、難しいです……。LINQ to ADO.NET(LINQ to DataSetとLINQ to SQL)を勉強する前の準備として始めたのですが、これだけでお腹いっぱいになりそうです。
ADO.NETではデータベースへの接続・クエリの実行とクエリ結果への処理・接続の終了という一連の流れからなるよくあるデータアクセスと、それらの上に構築された非接続型のデータアクセスという2つのデータアクセスが可能です。
非接続型のデータアクセスというのは簡単に言うと、クエリ結果のテーブルをメモリ上のDataSetオブジェクト(テーブルのセットを表すオブジェクト)やDataTableオブジェクト(テーブルを表すオブジェクト)にそのまま保持するという方法です。こうすることで、クエリ結果の取得(データベース接続が必要)とクエリ結果への処理(データベース接続は不要)を明確に分離することができます(という理解であってるのかな?)。
今はこの非接続型のデータアクセスを中心に勉強していますが、webだけだと詳細まで立ち入った解説が少ないようで、難航しています。
というわけで書籍を購入しようと思うのですが、ADO.NETを中心として取り扱っている書籍は数が少なく、とりあえず一番しっかりしてそうな
プログラミングMicrosoft ADO.NET2.0 (マイクロソフト公式解説書 Microsoft Visual Studi) 販売元 : Amazon.co.jp 本 価格 : ¥ | |
を購入しようと考えています。かなり高価ですが、それに見合う中身はあると期待して……。
2008年04月20日
社会人生活そろそろ1ヶ月
入社1ヶ月まではあと10日ほどありますが、新人研修もそろそろ終わりです。ビジネスマナーの講習や会社と業務の講習、各種書類の書き方、電話番、掃除などといった基本的な事柄を習っているだけなのですがかなりぐったりします……。
研修が終わったあとは、簡単な仕事が都合よく取れればOJTという形で先輩と組んでそれに取り組み、無い場合は先輩を顧客に見立てた仮想的なプロジェクトか社内ツールの作成に取り組むことになるようです。
定時に帰ってはいるのですが、疲れてしまってなかなか趣味のプログラミングの時間が取れません。業務ではJavaの案件が多い(といっても上流の設計が主体で実際にプログラミングすることはほとんど無いらしい)のでJavaを勉強し始めましたが、あまり気が乗りません……。
Javaなんか放っておいてOCamlやりたいよー。うわーん。
2008年03月29日
2008年03月21日
OCamlのお勉強 その8 〜リストの練習問題〜
「プログラミング in OCaml ~関数型プログラミングの基礎からGUI構築まで~」を読んでの勉強記録です。
今回は、本に記載されている練習問題を解いていきます。
練習問題 5.2 次の関数を定義しなさい。
5.5 練習問題,p106-107
以下に与えられた9つの関数を定義していきます。
正の整数nから1までの降順リストを生成する関数
downto1
。
# let downto1 n = let rec downto1' i l = if i > n then l else downto1' (i + 1) (i :: l) in downto1' 0 [];; val downto1 : int -> int list = <fun> # downto1 5;; - : int list = [5; 4; 3; 2; 1; 0]
このくらいならすぐに書けました。一応、末尾再帰にしてあります。今後も練習のため末尾再帰可能なものについてはなるべく末尾再帰で書いていきます。
与えられた正の整数のローマ数字表現(文字列)を求める関数
roman
(I = 1,V = 5,X = 10,L = 50,C = 100,D = 500,M = 1000です)。
# let roman dict n = let rec roman' dict n s = let rec find f l = match l with | (a', b) :: rest -> if f a' then (a', b) else find f rest in match n with | 0 -> s | _ -> let (i, r) = find (fun x -> n >= x) dict in roman' dict (n - i) (s ^ r) in roman' dict n "";; (* 警告を省略 *) val roman : (int * string) list -> int -> string = <fun>
find関数はfが真となる要素をリストlの中から見つける関数ですが、要素が見つからない場合については定義してありません。そのため、find関数のマッチ式が網羅的でないという警告が出ています。今は例外処理のやり方がわからないので無視しておきます。以下は実行結果です。
# let romans = [(1000, "M"); (500, "D"); (100, "C"); (50, "L"); (10, "X"); (5, "V"); (1, "I")];; (* romansの表示を省略 *) # roman romans 1984;; - : string = "MDCCCCLXXXIIII" # let romans = [(1000, "M"); (900, "CM"); (500, "D"); (400, "CD"); (100, "C"); (90, "XC"); (50, "L"); (40, "XL"); (10, "X"); (9, "IX"); (5, "V"); (4, "IV"); (1, "I")];; (* romansの表示を省略 *) # roman romans 1984;; - : string = "MCMLXXXIV"
辞書を入れ替えることでより正確な表記を行います。
与えられたリストのリストに対し、(内側のリストの)要素の総数を返す関数
nested_length
。
予め、与えられたリストの長さを返す関数lengthを定義しておきます。
# let length l = let rec length' l n = match l with | [] -> n | _ :: rest -> length' rest (n + 1) in length' l 0;; val length : 'a list -> int = <fun>
続いてnested_lengthを定義します。
# let nested_length ll = let rec nested_length' ll n = match ll with | [] -> n | l :: rest -> nested_length' rest (n + length l) in nested_length' ll 0;; val nested_length : 'a list list -> int = <fun> # nested_length [[1; 2; 3]; [4; 5]; [6]; [7; 8; 9; 10]];; - : int = 10
確かに計算できています。
今回はここまで。次回もリストの練習問題をいくつか解いていきます。
2008年03月19日
OCamlのお勉強 その7 〜リスト〜
「プログラミング in OCaml ~関数型プログラミングの基礎からGUI構築まで~」を読んでの勉強記録です。
リストを作成できる。リストは再帰的なデータ構造である。
- 空リスト
[]
はリスト - リスト
l
の先頭に要素e
を加えたe :: l
はリスト
# [0; 1; 2; 3];; - : int list = [0; 1; 2; 3] # [];; - : 'a list = [] # 3 :: [];; - : int list = [3] # 2 :: 3 :: [];; - : int list = [2; 3] # 1 :: 2 :: 3 :: [];; - : int list = [1; 2; 3] # 0 :: 1 :: 2 :: 3 :: [];; - : int list = [0; 1; 2; 3]
リストのリストなども作れます。ただし、リストの各要素は同じ型でなければなりません。
パターンマッチングによりリストの先頭要素と後に続くリストそれぞれに変数を束縛できる。match式でパターンによる分岐を記述できる。
# let rec project f l = match l with | [] -> [] | x :: rest -> f x :: project f rest;; val project : ('a -> 'b) -> 'a list -> 'b list = <fun> # project string_of_int [0; 1; 2; 3; 4];; - : string list = ["0"; "1"; "2"; "3"; "4"] # project (fun x -> x * x) [0; 1; 2; 3; 4];; - : int list = [0; 1; 4; 9; 16]
project関数は与えられた関数fに基づいてリストの射影を求める関数です。通常、mapやselectなどと名付けられることが多いです(実際、OCamlにはmap関数があります)。リストに対する高階関数の基本ですね。
リストの各要素に対して処理をするような関数はほとんど上記のように「空リストの場合は何かを返して終了、そうでない場合は残りのリストに対して再帰」という形になります。
match式を組み込んだ匿名関数をfunction構文で定義できる。
# let rec project f = function | [] -> [] | x :: rest -> f x :: project f rest;; val project : ('a -> 'b) -> 'a list -> 'b list = <fun>
function構文を使うことでmatch with式より少しだけ書くのが楽になります。
今回はここまで。次回はリストの練習問題をいくつか解いていきます。