7月2008

これといったネタが浮かばない…

3日にActiveBasicの開発チームミーティングが開かれるわけですが、そこで新しいライブラリを紹介する時間が用意されているので、とりあえず何かプレゼンしようかと思っているのですが、単に新しい機能を紹介しているだけだと、やっぱり華が無くてつまらないですよね。何かサンプルプログラムを作って実行するのが良いのですが、これといってネタが思いつかなくて困ってます。FileSystemWatcherあたりを実装しておけば、簡易的なデスクトップサーチ的なものを作れそうなんですけどね。残念ながらFileSystemWarcherクラスの存在についさっき気づいた次第です。ちなみに、最近CP5のサンプルコードを掲載していないのも、ほとんど同じ理由です。

でも、どうせ実演はちょっとあれなんですよね。あれ。実はPowerPoint持ってないんで、Keynoteでプレゼンは作るわけですけど、私のiBookはPPCなんでWindowsアプリケーションは動作しないんですね。Keynoteでプレゼンンして、デモだけに他のPC借りるのも面倒ですし、もし何か実演するならば、動画キャプチャーでもしてきてしまいましょうかね。

まーとにかく、ネタが浮かびそうにないです。lsコマンドみたいなの作ってもつまらないですしねー、何か面白いもの…

遅延ロード的生活習慣

私は基本的に、やらなければいけないことは、やらなければいけない時にならないとやらない傾向にあり、今もその状態におかれています。要するに、夏休みの宿題は最終日に必死にやるタイプの人間というわけです。

あんまり似ているわけではありませんが、これはプログラムにおける遅延ロードに少し似ています。必要なリソースは、必要なった時に読み込むというやつです。これによりアプリケーションの起動時間は短縮しますし、メモリの使用にも無駄が少なくなります。もちろん、デメリットもあるわけで、ときどきリソース読み込むことでプログラムが一時停止したり、高速な処理を連続的にしたい場合には、遅延ロードではなくて、先に必要なリソースをすべて読み込んでおくべきです。

そういうわけで、プログラムにおいて遅延ロードはなかなか良い物ですが、現実の生活に適応すると良いのか悪いのか、一般的には悪いとされてますよね。でも、追い込まれた方がパフォーマンスを発揮できそうな気がしないでもないですよね。これにより、やらなければいけないことをする時間が短縮できるかもしれません。

と、こんな話を書きましたが、残り時間は少なくなるばかりです。実際、生活に遅延ロードを持ってきてもいいことはないですよね、時間に追われてだんだんテキトーになってくる、ミスは増える、ぎりぎりでやると予測不可能な事態に陥った時にどうしようもなくなるし

なるべく早めに行動すべきですね。

資料: Objective-Cによるオブジェクト指向プログラミング
Objective-Cにおいての遅延ロードが書かれている場所があります。

今更知ったこと

最近激しく勘違いしていたことが二つあります。

1. HTMLのdlタグ内のdtとddを反対に使っていた。
どうもブラウザのデフォルトの表示がおかしいと思っていたら、おかしかったのは自分だったようです。

2. C言語で指数関数の演算子はない

関数「f(n):=nを7で割った余り」と定義するとき、あなたの好きな自然数nを選びなさい。ただし、この問題の得点は「3f(Σ(k:1→7)n^k)」である。

という、うろ覚えの問題を友達と考えていたときに、しかたなくプログラムで計算結果を確かめていたのですが、なぜかうまく計算できないと思ったら、C言語に「^」演算子はなかったようです。代わりにpow関数が定義されてるんですね。コンパイル時にエラーはでなかったので、何か他の演算が定義されてるんでしょうね。

インターフェースを重視するApple

最近、いろいろなところで評価を聞くAppleですが、もちろん、そのすばらしい環境を保つために、様々なドキュメントが書かれています。例えば、「Dashboardプログラミングトピック」と呼ばれるドキュメントがあるのですが、このドキュメントの一番最初に取り上げられているトピックは何でしょうか?

見ればすぐにわかりますが、「ウィジェットのデザイン」です。そのあとのトピックには、特に変わったところはなく、普通のプログラミングに関する読み物となっています。しかし、このプログラミングのドキュメントでデザインについて言及しているところがAppleの特徴といえるでしょう。実際に「ウィジェットのデザイン」のトピックを見てみると、意外と多くのことが書かれており、しかも結構細かいところまで指摘されています。たとえば、ウィジェットは多機能にするべきでない、大きなサイズのウィジェットは作るな、Aqua(OS X標準)コントロールを使うな、細かいところではドロップシャドウの詳しい値なども書かれています。このように、プログラミングだけのガイドではなく、インターフェースについてのガイドラインもしっかりと明文化されています。

ウィジェットに限らず、Appleはさまざまなドキュメントにおいて、インターフェースついて言及しています。もちろん、iPhoneも例外ではありません。現在、iPhoneに関するドキュメントはデベロッパ以外に公開することができないので、詳しく話することができないのは残念ではありますが、iPhone OS Programming Guideには、インターフェースに限らず、携帯デバイスのあるべき姿というものを示してくれているような気がします。”Fast Launch, Short Use”とか…

というわけで、ドキュメントは結構大切です。MSDNには確かに大量の文章がありますが、読み物としてのドキュメントが少ない気がします。

AB5 CP5サンプル: 特定の文字列が含まれるファイルの検索

この前の記事で、どんなドキュメントを書いて欲しいか募集したところ、それほど集まらなかったので、適当にサンプルコードでも定期的に載せていこうかと思います。特に説明はしませんが、よくわからないところがあれば質問してください。ちなみに、初心者向けのドキュメントは、AB5が正式にリリースしてから書こうと考えています。

さて、今回のサンプルコードは検索です。検索対象のフォルダに含まれるファイル全てから、特定の文字列が含まれるファイルを検索し、そのファイル名と、検索文字列が何行目に含まれるか出力します。それなりに実用的ですが、ファイルの数が多いとかなり時間がかかります。ちなみに、日本語でも検索できるかもしれませんが、基本的に英語のみサポートです。

Imports System
Imports System.IO

#console

Console.Write("検索するフォルダを入力してください : ")
Dim directoryname = Console.ReadLine() As String
Console.Write("検索する文字列を入力してください : ")
Dim searchString = Console.ReadLine() As String

Dim files = Directory.GetFiles(directoryname, "?*", SearchOption.AllDirectories)
Dim filename As String
Foreach filename In files
	Dim lines = File.ReadAllLines(filename)
	Dim i As Long
	For i = 1 To lines.Count
		If lines[i-1].Contains(searchString) Then
			Console.WriteLine(filename + " - " + i.ToString())
		End If
	Next
Next

Console.WriteLine("検索終了")
Console.ReadLine()

実行例

検索するフォルダを入力してください : D:ab5.0.0.5(rev.535)system
検索する文字列を入力してください : ab
D:ab5.0.0.5(rev.535)systemMainWnd_exe_windowbase_e.sbp - 7
D:ab5.0.0.5(rev.535)systemnew_window_template_e.sbp - 7
D:ab5.0.0.5(rev.535)systemdxdx_graphics.sbp - 36
D:ab5.0.0.5(rev.535)systemdxdx_graphics.sbp - 230
D:ab5.0.0.5(rev.535)systemdxdx_graphics.sbp - 262
D:ab5.0.0.5(rev.535)systemdxdx_graphics.sbp - 284
D:ab5.0.0.5(rev.535)systemdxdx_graphics.sbp - 297
D:ab5.0.0.5(rev.535)systemenum_process64enum_process64.pj - 26
D:ab5.0.0.5(rev.535)systemenum_process64list.dat - 21
検索終了

従来のようなWin32APIスタイルのプログラミング方法では、結構手間がかかると思いますが、付属ライブラリを使うと、これくらいのプログラムは手軽に作成することが出来ます。

iPhone人気ですね

私はそれなりに地方に住んでいるのですが、さっきソフトバンクショップに行ったところ、残念ながらiPhoneは完売してしまったそうです。話によると、夜から並んでいた人がいたそうです。iPhoneを少し甘く見ていました。

それはそうと、早くSDKを正式リリースして、ドキュメントも公開してくれないと、話のネタが見つけにくいです。開発者ドキュメントを見るだけで、iPhoneの凄さがわかりますからね。

Snow Leopardに期待

WWDC2008基調講義の後に、Mac OS Xの次のバージョンであるSnow Leopardについて詳しい話があったらしいですが、残念ながらまだその内容は公開されていません。が、しかし、いくつかの情報は公開されています。

アップル – Mac OS X Leopard – Snow Leopard

今回のバージョンアップで、もっとも特徴的なのは、新機能を追加しないという点です。要するに、目には見えない部分、システムのパフォーマンスを改善するために、OSをよりスマートにし、新たな技術を投入するわけです。

ユーザーから見ればつまらないバージョンアップかもしれませんが、デベロッパから見れば、嬉しいバージョンアップかもしれません。なぜなら、QuickTimeが新しくQuickTime Xとなり、大幅な改定が期待できるからです。

現在QuickTimeを扱う最も簡単な方法は、QTKitを使う方法です。Cocoaと相性がよく、とても簡単に動画を再生したり、簡単な編集をすることもできるのですが、QuickTimeのすべての機能にアクセスすることはできません。例えば、新しいビデオトラックを作成しようとする場合には、どうしても古い形式のQuickTime APIを呼び出さなければなりません。

私の勝手な想像では、QuickTime Xは、Cocoa並みに簡単に扱えるフレームワークになると思うので、そうしたら、動画編集アプリケーションでも作ってみようかと思っています。

ActiveBasic CP5がリリースされました

ActiveBasic CP5がリリースされました。これでコンパイラの方は、一通りの完成を迎えたと言えるでしょう。さて、この前から、一応ドキュメントは書いていた物の、半分くらいまで書いた後に、誰をターゲットに記事を書けば良いかわからなくなってきたので、手が止まってしまいました。そういうわけで、今回、どのような記事を書いてほしいか、募集します。どうぞ、ActiveBasicユーザーの皆さん、コメントに書いてください。

とかいいつつも、基本事項は下に書きます。

標準入出力

現在、CP5では、RADの整備が行き届いてないため、コンソール出力でプログラムを作ることをお勧めします。また、N88互換環境もまだ整備されていないので、とりあえずまともに使えそうなものは、コンソールとなります。おそらく、サンプルコード見れば、どう使えば良いか瞬時にわかるでしょう。特に説明はしません。

#console
System.Console.WriteLine( "Hello World" )
System.Console.Write( "現在時刻: ")
System.Console.WriteLine( System.DateTime.Now )

System.Console.Write("数値を入力してください。")
Dim line = System.Console.ReadLine() As String
Dim toValue = Val( line ) As Long
Dim i As Long
For i = 0 To toValue
	System.Console.WriteLine( i )
Next

System.Console.ReadLine()

名前空間

付属の便利なライブラリを使うためには、オブジェクト指向の概念は必ずしも必要ありませんが、名前空間の説明はしなければなりません。

さっきの、標準入出力を、System.Console.WriteLine()と書いていましたが、なぜ長いのかと言えば、System名前空間のConsoleクラスのWriteLineメソッドを呼び出しているからです。この記述が長いと思う場合、System名前空間を使用することを宣言することによって、Systemを省略することができます。

Imports System
#console
Console.WriteLine( "hello" )
Console.ReadLine()

名前空間を詳しく説明します。
名前空間とは、コードを分類して、名前の衝突を防ぐ働きをする物です。例えば、MyNameSpaceを定義し、その中に、関数やクラスを宣言します。

Namespace MyNameSpace
	Function Fx(x As Long) As Long
		Return x^2
	End Function
End Namespace

このように、名前空間を適用した関数は、次のように呼び出します。

MyNameSpace.Fx(x)

このようにしておけば、例えば他の名前空間Fx関数があった場合にも、区別をすることができます。

付属ライブラリのConsoleクラスは、System名前空間で定義されているので、Systemを書く必要があるわけです。

文字列

CP5では、文字列を完全にUNICODEで扱うようになっており、以前BytePtrなんかで文字列操作しているようなコードを書いてしまっている人は、大幅な修正が必要になって来しまいます。Stringだけで文字列操作をしている場合、それほどCP5の移行に苦労しないかもしれませんが、StringでWin32APIとやり取りしているコードを書いたりしている場合も、危険です。

文字列は、以前ブログで取り上げたので、とりあえずそれのリンクを貼っておきます。仕様変更はほとんどないと思われます。
1.[ライブラリ]Stringクラス – 機能編
2.[ライブラリ]Stringクラス – Win32API編
3.[ライブラリ]Stringクラス – 非推奨編

配列

CP5からは、AB付属のライブラリで配列を扱う場合、Listクラスを使用するようになっています。まだ基本的な機能しか実装されていませんが、ここでは簡単に使い方を紹介します。Listクラスは、System名前空間の中のCollections名前空間の中のGeneric名前空間に定義されているので、先頭で名前空間を宣言しておきます。

Imports System
Imports System.Collections.Generic
#console

Dim list As List<Long>
list.Add(1)
list.Add(2)
list.Add(3)

Dim i As Long
Dim sum As Long
For i = 0 To list.Count-1
	sum += list[i]
Next

Console.WriteLine(sum)
Console.ReadLine()

Listクラスは、CP5から導入されたジェネリックと呼ばれる機能を使用しているので、List型の宣言の他に、Listの中に何を格納するかを<type>で宣言します。

例えば、このようにすれば、文字列を格納する配列になります。

Imports System
Imports System.Collections.Generic
#console

Dim list As List<String>
list.Add("ABC")
list.Add("DEF")
list.Add("GHI")

Dim s As String
Foreach s In list
	Console.WriteLine(s)
Next
Console.ReadLine()

ついでに説明しますが、Foreachという、新たな構文が追加されています。難しい話をすれば、これはIEnumerableインターフェースを継承しているクラスが使えるのですが、要するに、Listクラスを指定すれば、各要素を取り出してForループしてくれる機能です。よくわからないなら、普通のForループを使いましょう。

コメントをする前に

さて、猛スピードで書いた記事なので、かなり雑になっています。ここで冒頭でも述べた、CP5のどこの記事を優先的に書いてほしいのか、アンケートをとります。といっても、何も無ければ答えづらいと思うので、下にCP5で新しくできるようになったことを、おおざっぱに列挙しておきます。何か気になる物があれば、コメントお願いします。

  • 標準入出力
  • ファイル操作
  • ファイル情報取得
  • XML処理
  • 文字列操作
  • 配列
  • 例外処理

その他、何かあったらぜひ書き込んでください。

最後に、AB5の雰囲気を味わえそうなコードを書いてみます。

#console
Imports System
Imports System.IO

Dim currentDir = New DirectoryInfo( Environment.CurrentDirectory )
Console.WriteLine(currentDir.FullName() + "にファイルを作成します。ファイル名を入力してください。")

Try
	Dim filename = Path.Combine( currentDir.FullName(), Console.ReadLine() ) As String
	Dim writer = New StreamWriter( New FileStream(filename, FileMode.CreateNew) )
	writer.WriteLine( DateTime.Now.ToString() + "時点の" + currentDir.FullName() + "内のファイル" )
	writer.WriteLine( currentDir.GetFiles() )
	writer.Close()
Catch ex As Exception
	Console.WriteLine( "Try内でエラーが発生すると、ここに飛びます。" )
	Console.WriteLine( ex )
	Console.ReadLine()
End Try

ダビング10の抜け穴?

この前、友達がダビング10のおかげでiPodとかにテレビ番組を入れられないなー、と、そんな話をしていたのですが、普通にDVDをパソコンで取り込んじゃえば良いんじゃないの?って聞き返しました。しかし、どうやらDVDも特殊なものでないと記録できないようで、それがパソコンで取り込めない、そんな話を聞きました。

ダビング10の話はよく調べてないのですが、要するに、今のところ破られる心配はなさそうです。

ところが、この前珍しくテレビのCMを見ると、なんと地デジをアナログのテレビで見ることのできる、変換機の宣伝をしているわけですよ。これ使えば、普通にアナログ出力したテレビを、アナログの録画機で録画できそうですよね?どうなんでしょうか。

ダビング10(wikipedia)
HVT-T100 アナログテレビで地デジが見られる!(IO DATA)