金曜日, 12月 09, 2011

CHIRASHI App

CHIRASHI というMacアプリを作りました。
3日ほど前にMac App Storeのレビューがおわり、公開されました。
http://itunes.apple.com/jp/app/chirashi/id482532068?mt=12

1年ほど前からMacでアプリを開発をしようと思い立って、
この夏、8月末頃にCHIRASHIの開発に着手しました。
結局3ヶ月ほどかかりました。
最初はなめていて、頭の中では一ヶ月くらいで作れるつもりだった。
最初の一ヶ月でXCodeのプロジェクトから4度やり直し、おおむね現在の
見た目になった。10月の2週間くらいでQRコードとJANコードの生成ロジック
を実装し、概ね今の外観になった。
しかし、嫁さんに見せたところ、かなりいまいちな評価となった。
文字が入力しづらいとか、文字の表示がピンぼけになっているとか、図形が足りないとかいろいろ。。。
そこで再度見直した。レイヤーで文字を描画するとピンぼけることがわかり、レイヤーの使用をやめたり、描画コードを書き直し、入力方法も見直した。図形を大幅に追加することを決め、別途図形描画ツールを作ったりした。
Mac App Storeの基準をよくよく調べると、OS X Lionでの動作が必須となっていた。結局、OSをLionに更新した。XCodeのバージョンも上がった。Lionの新機能 フルスクリーンモード、オートセーブ、バージョンなんかについては最初、懐疑的だったが、使ってみると、すばらしいと感じた。そこで、対応することにした。対応すると、他にも気に入らないところがでてくる。だから磨いた。 ぷきぷき。。。

Appleの開発ガイドを読んでいると、開発のフェーズは、大まかに言うと

  • デザイン
  • 実装とテスト
  • 磨く (Polish)

からなる。
Polishが重要なのだという。Polishはテストではない。納得できるまで磨くのだ。
納得できなければリリースするべきではない。
と言うと、私のアプリは永遠にリリースできなさそうであるが、、、


11月下旬にやっとApp Storeにレビューを申請した。その数日後、不具合に気がつき、
申請を取り下げ、再申請をしたりしたあげく、無事レビュー完了の知らせが届いた。

AppStoreに公開されたのは嬉しかった。
また、次にむけてがんばろー。おー。

日曜日, 11月 06, 2011

Cocoaでの縦書きの実現について

OS/X 10.7 (Lion)では、NSTextView でも日本語のような
縦書による入力が可能になった。
OS標準のテキストエディタでも縦書きができるように
なっている。じぶんではあまり縦書きの文書は書かないので
あるが、使ってみると、なかなかいい。テキストカーソルは
水平になり、変換候補も横方向に縦書きで表示されるので
とても面白い。

NSTextView でレイアウトを縦書きにするには

setLayoutOrientation: で
NSTextLayoutOrientationVertical を指定するだけでよいことが
わかった。これだけで、テキストエディタと同じように縦書きで
テキスト入力ができる。

では、NSTextViewを使わずに、NSViewに縦書きのテキストを表示する
にはどうすればいいのか?
以前調べたときCoreTextを使って実現する方法がわかったが、
結構面倒なことになってしまったが、10.7になって、もっと楽な
方法ができたようだ。
CoreTextを使わずにCocoaのテキスト関連クラスで実現できる。
 NSTextStorage
 NSTextContainer
 NSLayoutManager

このうちNSTextStorage はNSMutableAttributedStringを継承している。
つまり、テキストの書式などの属性はテキストと共にNSTextStorageに格納する。
ここで、属性として NSVerticalGlyphFormAttributeName を設定すればよいようだ。

NSTextStorage *textStorage; があるとして、

    [textStorage addAttribute:NSVerticalGlyphFormAttributeName 
                      value:[NSNumber numberWithBool:YES] range:NSMakeRange(0, [textStorage length])];


のように指定する。
これで、日本語の文字はは左に90度回転した状態で水平方向に並ぶようになる。


あとは、あなたも首を90度傾ければ、縦書き表示が実現する。

首がつかれるので、いやだ? 

冗談はさておき、最初私は、さらに90配置を変更してくれる設定があるのだろうと
探していたが、見つからなかった。
じゃあ、Drawする前に、コンテキストに90度の回転を加えれば、それらしくなる
のかなと思ったのであった。ようは首を傾けるかわりにモニターを傾けるようなものだ。
その際に、表示域の縦と横を入れ替えてTextContainerに指定すればつじつまがあいそうだ。
でも、なんかしょぼい気がするし、NSTextViewはどうやっているのか気になった。
そこでヘッダファイルの説明を読むと、90度回転して表示しているらしいとわかった。
なんだ、同じじゃん!

コンテキストを回転するには     CGContextRotateCTM で90度時計回りの回転を
指定する。私のアプリはもともと任意の角度での回転を施していたんで、回転に
90度を足すだけだった。
やってみると、非常にいいあんばいになった。
もともと水平方向の描画をコンテキストで90回転しているだけなので、
水平方向のテキストアライメント(右寄せとかセンタリングとか)がそのまま
垂直方向に働く。よって縦書きテキストが上寄せ、中央寄せ、下寄せというように。

しかし細かいところで、課題が残った。
例えば水平テキストにアンダーラインを引くと当然、それは文字の下に線が引かれる
ことになるが、垂直なテキストでの傍線は私の実現方法では左側になってしまう。
それは普通、右側に引くものか?という点が気になる。
たぶんそうだ。右利きで鉛筆で縦書きに傍線を引くとき、左側に引こうとすれば
文字が隠れてしまう。よって、右側に引くのが自然だ。
でも、縦書きの印刷物で傍線が引かれたものなんて余り見かけないような気がする。


Appleの人も右側だと考えているようだ。テキストエディタでも右側に
傍線が引かれるようになっている。
しかし、これを実現する方法は今のところわからない。


土曜日, 11月 05, 2011

NSScrollView内のNSViewの位置について

OS/X では、NSViewなどのコンテンツを表示するビューを
NSScrollView内に配置すると、そのNSViewは左下隅に貼り付く。
原点を左上隅にあわせるためには、そのNSViewのサブクラスにて
BOOL isFlipped をオーバーライドして {return YES} を
返すようにすればよい。

であるが、ウィンドウをリサイズして、NSScrollViewが小さくなったときに
表示されている内容が上にスクロールしてしまう。

(NSScrollViewは自動的にリサイズするようにしておいたとして。)

絵にするとこんな感じである。
ウィンドウをリサイズすることにつれてスクロールビューもちいさくなる。
そのとき、狭くなった分だけ、表示されている内容が上に上がってしまう。



普通のアプリケーションはそのような状態にはなっていないので、当然なんとかなるはずが
その方法がわからず、なやんだ。
Appleのサンプルプログラムのsketchの状態を調べているうちに
やっと違いが見つかった。

Interface Builder のSize Inspector でのAutosizingの設定が不足していた
ことが原因だった。
これは、コンテンツのNSViewの設定である。

不十分な設定

対策
これによって、問題が解決した。
簡単なことであったが、知らないばかりに悩んでしまった。

まあ、いつも思うことだが、複雑な解決策は何か遠回りをしているものだ。
何かを解決できずはまってしまう時は、間違った方向に難しく考えすぎている
可能性がある。また、その方向で、何とか実現できたとしても、
その方法が自分でも気に入らない時は、おそらく、まだベストではない。
もっとシンプルな方法が見つかるはずなのだ。

木曜日, 10月 27, 2011

Quick Look Pluginプロジェクトの準備

自分のアプリケーションのドキュメントファイルにファインダーなど
でサムネイルやプレビューを表示するためには、
Quick Look Plugin を作成するという方法がある。

1) XCode 新規プロジェクトで System Plug-in  の Quick Look Plug-inを選択する。


2) アプリケーションのソースコードを(必要な奴だけ)プロジェクトに参照で追加する。

3) GenerateThumbnailForURL.c , GeneratePreviewForURL.c を
 の拡張子を.m に変更する。
    必要ならばincludeするライブラリを変更する。
 //#include <CoreFoundation/CoreFoundation.h>
 #include <Cocoa/Cocoa.h>

 アプリケーションソースもインクルードする
 例)
 #include "MyDocument.h"  

4) フレームワークの変更
  必要ならばCocoa.frameworkを追加する。

5) info.plist の編集
  Document types
    Document Content Type UTIs
      Item SUPPORTED_UTI_TYPE    
  
  SUPPORTED_UTI_TYPEを自分のアプリケーションのUTIに変更する

6) ターゲットにファイルをコピーするビルドフェーズを追加する。
   ※絶対パス
   ※コピー先: ~/Library/QuickLook   (/Library/QuickLook も可)

  そしてビルドフェーズに Product のオブジェクトを追加(ドラッグで)する。

7) GenerateThumbnailForURL.c , GeneratePreviewForURL.cを編集する。

8) テストツールを設定する。
 メニュー:プロジェクト→新規カスタム実行可能ファイル
   /usr/bin/qlmanage 
  引数を指定する。
   -p  documentFile.name       プレビューの場合
   -t   documentFile.name  サムネイルの場合

以上!

木曜日, 10月 20, 2011

あっひーるちゃん

昨日まで、プログラムで図形を描くために、
方眼紙の上で座標を調べつつ、コードを書いたりしていたが
かわいい絵を作ろうと思ったとたんに、面倒になった。

そこで、ソースコードを生成するためのプログラムを
作ってみた。

まず、これはモデルのアヒルちゃんである。











で、作ったアプリケーションで描いてみた。












いい感じじゃありません?

金曜日, 10月 14, 2011

うしの写真

今日、うちの嫁が会社帰りに牛の写真集を買ってきました。
牛ばっかりのほのぼのとした写真集です。
これはいいものです。

へえ、こんなもの出している人がいたんだ〜と
とてもうれしくなりました。

今年、福島のほうでは、原発事故の避難により
取り残された牛達の悲惨なニュースを見かけます。
野良牛となってもなんとか生き残ってきた牛もいるそうです。
その映像をみて涙が出そうになりました。
せめてその牛達が無事に保護されよい牧場へ引き取られる
ことを希望します。

水曜日, 9月 14, 2011

Cocoaでの上下逆さま

Cocoaでプログラミングを始めて惑ったことのひとつに
座標系(Cordinate system)がWindowsなどと違うことだ。
多くの言語では画面上の座標の原点は左上隅にあり、
垂直方向の座標は下に行くほど大きくなる。
Cocoaでは原点は左下にあり、垂直方向に上にいくほど座標が
大きくなる。(これは数学や、日常的な座標系とおなじである。)
とはいえ、このこと自体は慣れると思う。

ただ、左下隅が原点であるということによる不都合もある。
スクロールビュー(NSScrollView)の中に表示するビュー(NSViewなど)
がデフォルトでは左下隅にくっついてしまうのだ。

外側の青い部分がスクロールビュー
内側の白い部分が内容を表示するビュー






この状態では、アプリケーションの使い勝手が悪くなってしまう。
これをこういう状態になおしたい。


この場合、内側のビュー(NSViewなどを継承したビュー)
のクラスにて isFlipped をオーバーライドし、戻り値としてYESを返すようにするだけでよい。
- (void)isFlipped{
    return YES;
}




ビューに直接描画しているのであれば、これでOKなのであるが、
いったんレイヤー(CGLayer)に描画してからビューに投影している
ような場合、不都合が残っている。


左図のように鏡で上下が逆さまになった状態となってしまう。
レイヤーはFlip(上下反転)していないままそこに Hello と描画している。そのレイヤーをFlipされたビューに描画する際にひっくりかえるのだ。


よって、レイヤーもFlipしておく必要がある。
レイヤーに描画する前にそのコンテキストに対して以下を施す。



CGContextTranslateCTM(layerContext, 0, layerHeight );

CGContextScaleCTM(layerContext, 1, -1);


一つ目で、原点を垂直方向に移動させる座標変換がコンテキストに登録され
二つ目で、垂直方向の座標の符号を逆転する座標変換が登録される。
例えば横幅100 x 縦100 のサイズを持つレイヤー上の
座標(10, 20) はFlip(上下反転)すると
一つ目の変換では 座標(0, 100) を原点とした場合の座標に変換されれるので
(10, -80) となる。
二つ目の変換では垂直方向の符号を逆転するので、(10, 80) となる。

※つまり下から20ポイントの場所は高さ100ポイントの場所からみると
下に向かって80ポイントの場所にあたるということである。

このようにしてFlipされたレイヤーには上下反転して描画される。
そのレイヤーをFlipされたViewに描画すると、さらに上下反転され
正常な状態で表示される。

金曜日, 9月 02, 2011

COCOA備忘

これは自分のための備忘です。すみません。


  • Resources フォルダのファイルパスをプログラム実行時に取得するコード
    • [[NSBundle mainBundle] pathForResource:@"filename" ofType:@"extension"]

  • CGLayer上にテキストを出力する方法。
    NSViewなどに出力する時はNSStringのdrawInRectが使えるが、CGLayerに出力するケースには使えない。この場合CoreTextを使う方法が簡単そうであった。
    • NSAttributedStringを生成
      NSAttributedString *attrStr = [[NSAttributedString allocinitWithString:@"こんにちは" attributes:fontAttributes]; 
    • CTLineCreateWithAttributedStringを使って CTLineRefを生成
      CTLineRef line = CTLineCreateWithAttributedString((CFAttributedStringRef)attrStr);
    • CGContextSetTextPositionを使って出力位置を指定
      CGContextSetTextPosition(context, pt.x, pt.y);
    • CTLineDrawを使って文字を出力
      CTLineDraw(line, context);
    • メモリの解放
      CFRelease(line);
      [attrStr release];

  • イメージの特定の色を透過させる方法。
    このような処理を Maskingと呼ぶ。
    rect はNSRect型で表示したい場所をさしている。
    ctx はグラフィックコンテキストをさしている。
    • 元のイメージが NSImage *nsimg に生成済みだとする。
      これからCGImageRefを取得する。
      CGImageRef cgimg = [nsimg CGImageForProposedRect:&rect context: ctx hints: [[NSDictionary alloc] init]];
    • マスキングカラーを設定する
      CGFloat maskingColors[6] = {255,255,255,255,255,255};
      //左から二つずつ組となりそれぞれR,G,Bの範囲を示している。
    • マスキングをかけたイメージを生成する
      CGImageRef maskedImage = CGImageCreateWithMaskingColors(cgimg, maskingColors);
    • コンテキストに描く
      CGContextDrawImage(ctx, rect, maskedImage);

木曜日, 9月 01, 2011

数学

先日、友人と飲みにいったときに、やっぱり、
数学は大事だよね。ということになった。

プログラムを作る上で、何か変わったことをしたいと
思った時、数学的な知識の不足を感じるのだ。
例えば、画面上に表示する図形を傾けるだけでも
角度を求めるために三角関数を使ったりする。
プログラミング言語には数学関数のライブラリがある訳だから
sin も cos も tan も使えばいいのだが、高校以来
そういうものは忘れてしまっているので、
まずそこから調べねばならなくなる。
先日、QRコードの誤り訂正コードのことを書きましたが、
あれは 有限体とかガロア体というもの性質を応用している訳だが
そういうものは、さっぱりわからぬ。
誤り訂正という技術は、通信データの補正などにも使われている
そうだ。そういうものがあるので、はやぶさのような宇宙探査機と
地球との間で通信ができるのだ。
インターネットで使う暗号技術だって、数学者が生み出した。
数学がないと安心してネットで買い物が出来ないのだ。

そう、実は数学は世の中を支配しているのだ。
という結論で飲み会はお開きになった。

金曜日, 8月 26, 2011

Cocoa

去年の暮れに iMacを買いました。
これまでずっとWindows一辺倒だったのですが、
なんかインターフェースがすっきりしているというか
洗練されているところに惹かれてiMacにしました。
WindowsXP以降インターフェースのデザインが
だんだん野暮ったくなっているような気がします。

まあWindowsはおいといて、今後はMacでアプリを作ってみたいぞ
というわけで、時間を見つけてはAppleのフレームワークである
Cocoaの学習をしています。
年末に「Mac OS X Cocoa プログラミング」という本を買いました。

本当はある程度集中して、読み進めた方がいいのですが、
仕事の合間に、ちまちまと読みすすめてきたので、今週になって
やっとほぼ読み終わったところです。
でも、この本はObjective-Cも初めて、Macも初心者という私にはちょうど
とりかかりやすいものでした。

今週から、自分の作りたいようにいろいろ試しています。
いつもそうですが、教科書のサンプルコードを書いて試しているうちはいいですが
いざ、自分でこれをしようとか思った時には、まごつきます。
教科書に載っていたことも忘れているし、やりたいことがその教科書に
載っているとも限りません。
幸い、XCodeに附属のドキュメントはとてもよく出来ているようです。

これからが本当の始まりです。楽しみがいっぱいです。


水曜日, 8月 24, 2011

パソコンの掃除

パソコンはDELLのDimension 5150C という4、5年前のモデルだ。
先日OSからすべて入れ直したので、電源ONから使えるようになるまでの
時間は1分ちょっとくらいになり、まあ古いパソコンとしては並になった。
しかし、ファンはあいかわらずフル回転し掃除機並みの音を出しているのでとても快適とは言い難かった。

インターネットでくだんのパソコン名と騒音といったキーワードで探してみると、困っている人はたくさんいたようで結構出てきた。
いくつかのページを拝見したところ、どうも、

  • 電源ファンは筐体内に暖まった空気を放出し、CPUファンも外気を取り込みCPUの放熱により暖められた空気も筐体内に排出され、ハードディスクのあたりを通ってそとに自然放出するつくりのため、内部の温度が上がりやすい。
  • CPUの発熱が最近のものに比べて大きい。
  • 吸気ファンの吸い込み口の構造上、掃除しにくい場所にホコリがたまってしまう。

ということらしい。
構造上の問題はどうにもならないので、(改造している人もいたが。。。)
どうも分解掃除がよいということなので、やってみた。

分解方法とか手順については、
http://www.yoshi-systemservice.com/computerservice_dell-dimension-5150c_cleaning.htm
が写真入りで詳しい。

http://buono99tt.blog55.fc2.com/blog-entry-156.html
このサイトもさらに丁寧に手順が書かれていた。
後で見つけたのであるが、これを見ていれば、もっと簡単に分解できた
かもしれない。ただ、フィギュアのブログなのでかわいらしい。

で、分解してみたら、外気吸い込み口の前はこんな状態だった。


びっしりとホコリが固まっていて、これでは空気が通るまい。
また、ファンの状態もひどくホコリがこびりついていた。

で、掃除機でホコリを吸いとり、こびりついた汚れを綿棒で拭き取り、
組み立て直しました。

そして、電源を入れると、おお〜。
ものすごく静かになった。しばらく使っても、大丈夫、それほど回転数は上がらないようで比較的静かだ。

というわけで、分解掃除は効果が多いにあった。
ただ、前面パネルがぴったりとはまらなくなってしまったが、
自分で使う分には、まあ、特に問題ない。

火曜日, 8月 23, 2011

QRコードを作るプログラムを作る(5)

誤り訂正コードの作成です。
ここはもっとも難航したところなので、ブログも書きづらい。
規格書およびネットで検索して参考にさせていただいた情報に
もとにプログラムを書くことはできましたが、なぜそうなのという
ところが完全には理解できていないせいである。

最初に、ネットで検索して、大変参考になったページを
を書き留めておきます。

そもそもQRコード作成の手順としては

この方の説明は全体的にとてもわかりやすいもので、
おそらくページの説明なしに、私は完成できなかったと思います。
大変感謝です。

それから、ガロア体というのは下記のページを見て参考にしました。


結局、数学として理解できないことはいったんさしおいて、プログラム作成にあたって、
理解したことは次のとおりである。
  • 誤り訂正コードの生成多項式に登場する係数 αn のところで指数 n に対する整数が一意に存在する。
  • 指数 n に対する整数の求め方は 8桁の2進数で指数0のとき "00000001"から初めて、指数が上がるたびに左にシフトしていき、桁があふれたとき "00011101"と排他的論理和をする。
    • αの指数n=0   "00000001" (1)10進
    • αの指数n=1   左シフト ⇒ "00000010"  (2)
    • αの指数n=2   左シフト ⇒ "00000100" (3)
    • αの指数n=7   左シフト ⇒ "10000000" (128)
    • αの指数n=8   左シフト ⇒ "00000000"  XOR "00011101" ⇒ "00011101" (29)
    • αの指数n=9   左シフト ⇒ "00111010" (58)
    • αの指数n=10  左シフト ⇒ "01110100" (116)
    • αの指数n=11  左シフト ⇒ "11101000" (232)
    • αの指数n=12  左シフト ⇒ "11010000" XOR "00011101" ⇒ "11001101" (205)
    • αの指数n=255 のとき "00000001" に戻る
  • 生成多項式の係数の演算において掛け算 αm * αnx8  = α(m+n)x8  になる。 
  • αの指数は255以上にならない。前述の計算で255以上になるときは255を減ずる。
    • α255 = α0  だからだ。 
  • 符号化によって生成したデータコード語列をコード語総数-1乗から始まる多項式に当てはめる。これをf(x)としておく。
    • たとえば1-H型のデータコード語列  32, 68, 35, 115, 10, 82, 127, 0, 236 があったとすると 1-H型のコード語数総数は 26 なので
      • f(x)=32x25 +68x24 + 35x23 +115x22 +10x21 +82x20 +127x19 +0x18 +236x17  
  • 誤り訂正コード数に応じて31の生成多項式が用意されている。これをg(x)とする。
    •  1-H型の場合誤り訂正語数は17である。(総コード数(26)-データコード数(9)=17)
      17語の場合てに生成多項式は
      • g(x)=x17+α43x16+α139x15+α206x14+α78x13+α43x12+α239x11+α123x10+α206x9+α214x8+α147x7+α24x6+α99x5+α150x4+α39x3+α243x2+α163x+α136
  • f(x)をg(x)で割った余りが誤り訂正コード語列になる。
  • でも、多項式同士の割り算の余りの求め方は通常の算術と同様ではなく、以下のようなイメージである。
    • 1-H型の場合だとコード語数総数である26個の箱を用意する。箱には番号25番~0番の順にふってある。これらの箱一式を FX と呼ぶことにする。
    • 箱の番号はf(x)の多項式のxの指数と同じである。
    • 箱の番号25~順にデータコード語を入れていく
      • 32, 68, 35, 115, 10, 82, 127, 0, 236  が25番から17番までに収まる。
    • もう一そろい同様に25~0番の番号を振った箱を用意する。これらの箱をGXと呼ぶことにする。
    • GX箱には対応するxの指数の場所に生成多項式 g(x)の係数を入れていく。
      • 17番~0番まで、1,α431392067843239,123206214147249915039243163136
    • FX箱の現在値の入っている先頭の箱は25番である。その箱にはいっている値は32でその対応するガロア体の指数は5である。そこでGX箱の先頭の箱番号は17である。箱の番号を合わせるためにGX箱をそれぞれ6個シフトそれぞれ、αの指数に5を加算する。この箱一式をGX' とする。
      • 25番~8番まで、α5481442118348244,1282112191522910415544248168141
    • これをFX箱と排他論理和をとったものをFX箱に入れる。
      • FXの25番の 32 に対し GX' の25番のα5は32 だから、その排他的論理和は 0 になる。
      • 同様に24番以降の箱も排他的論理和を取る。今FXの24番は68である。GX'の24番はα48でこれは70である。これらの排他的論理和は 2 である。 
      • 結果FX箱の中は25番は空となり24番以降の箱に値が残っている。
    • これを繰り返していくとFXの箱は25番から17番まで空となる。
    • 最後に16番から0番に残ったものが誤り訂正コード語列である。
やれやれ、これで、誤り訂正コードの算出ができます。
ちなみに、最初ここのプログラミングでちょっとしたミスをしていたのですが、
そうすると、QRイメージをリーダー読み取ると、違う文字に変わってしまったり
しました。結構大変でした。


木曜日, 8月 18, 2011

パソコンの断捨離

最近までメインに使っていたパソコンはたぶん買ってから4年ぐらいになる。
最近は非常に処理が重くなり、立ち上げてから10分たっても
まともに使えないようになっていた。
ファンも常にフル回転していているようでまるで掃除機のような音がとまらない。

今思えば、何かをインストールするたびに遅くなっていた。
Office をプレインストールの2003から2007に変えたとき、
重くなった。なんか索引キーをひたすら作っているようだった。
とりあえず止めてやった。
VisualStudio。SQLサーバーのサービスが重いのか?。
とりあえず停止した。
SAPの評価版かなにかの無償のベーシス環境。これをインストールすれば
家でもABAPが書ける。(書いてどうする?)
SAPのインストーラーが再びSQLサーバーもインストールしてしまった。
そして、さらに重くなった。
結局重くて何もできぬ。
Norton360。
重かった。しかし止める訳にもいかぬ。
最新版は軽くなったようだが。


それで、すべてを消して、ハードディスクも
パーティションを切り直し、フォーマットし直して
ほぼ買った時の状態、Officeもプレインストール時の2003に戻した。
それからVisualStudioも入れた。SQLサーバーだけはインストールしないことにした。
Nortonは最新版を入れ直した。

電源をいれて1分くらいで普通に使える。
よかった。今後はよけいなものはいれないようにしよう。

というわけで、かなり快適になったはずだった。
しかし、掃除機のような音は止まらない。ファンはあいかわらずフル回転している。
うるさいし、すごく熱いのだ。
そこで、さらに分解掃除に挑むことにした。

水曜日, 8月 17, 2011

QRコードを作るプログラムを作る(4)


QRコードを生成する手順で、

1. 入力テキストの分析と符号化
2. 誤り訂正符号というものを生成する
3. マトリックス(碁盤の目)に符号を並べる
4. マスクなるものをかける
5. 形式と型番を示す情報をつける

「2. 誤り訂正符号というものを生成する」にやってきました。

規格書を読んでみると、
  • QRコードには、損傷した場合に復元できる”誤り訂正”能力がある。
  • 誤り訂正レベルは以下の4段階から選べる
    • レベル L 復元能力7%
    • レベル M 復元能力15%
    • レベル Q 復元能力25%
    • レベル H 復元能力30%
ふむ。そうですか。

そのために、
  • データコード後列に付加する一連の誤り訂正コード語を生成するリードソロモン誤り訂正を備えている。
?※△□? なんだそれ。その後しばらくよく理解できない記述が続いている。
ハクション大魔王じゃないが痒い。

で、結局どうすればいいのさ!というところを読み取っていくと、
まず基本として理解しなければならないのは、こういうことだった。
  • 1. 入力テキストの分析と符号化にて符号化された入力テキストを8ビットずつにわけたが、8ビットで1データコード語と呼ぶ。
  • QRコードに格納されるデータは、データコード語列とそのデータコードに対して計算された誤り訂正コード語列である。
  • 型番と誤り訂正レベルによって、データコード語の数と誤り訂正語の数が決められている。例えば、
    • 型番1で誤り訂正レベルLの場合(以下 1 - L のように表記する。)、データコード語は19個で、誤り訂正コード語は7個と規定されている。
    • 1- H の場合、データコード語は9個になり、誤り訂正コード語は17個とされている。
  • 型番と誤り訂正レベルによって、データコード語列を複数のブロックに分けることになっている。このブロックをRS(リードソロモン)ブロックという。RSブロックごとに、誤り訂正コード語列を算出する。例えば、以下のように決められている。
    • 1- x であれば、RSブロック数は1である。
    • 3 - Q の場合、RSブロック数は2である。3- Qの全ブロックのデータコード語は34個、誤り訂正コード語は36個であるが、各RSブロックのデータコード語は17個、誤り訂正コード語は18個である。
    • 5 - H の場合、RSブロック数は4個あり、そのうち2個のRSブロックのデータコード語は11個、誤り訂正コード語は22個、残り2個のRSブロックのデータコード語は12個、誤り訂正コード語は22個。

というわけでプログラムの手順としては
  • 使う型番と誤り訂正レベルに応じて、データコード語列をRSブロックに分割する。
  • 分割したデータコード語列に対して誤り訂正コード語列を求める。
ということになる。

さて、誤り訂正コード語列を求めるにはどすればいいのか。
規格書にはさらに難解な言葉が、、、
  • 規格書より引用
    QRコードの多項式は、2を法とする算術及び100011101を法とする算術(体の原始多項式 x8 + x4 + x3 + x2 + 1の係数を示す100011101を持つ2の8乗のガロア体)を用いて計算する。。。。。。

うーん。高校で数学をちゃんとやっておけば、、、いや、高校でもガロア体なんて言葉聞いたことないとおもうぞ。。。やっぱり理系のひとはこんなのわかるんだろうね。きっと。そもそも私はスペイン文学士だ。ドンキホーテなら全部読んだぞ。えへん。日本語だけど。ぶつぶつ。。。

いや、こんなときはgoogleで検索してみよう。じゃあガロア体とは?

うーん。高校で数学をちゃんとやっておけば、、、いや、高校でもガロア体なんて。。。。


続く。。。




金曜日, 8月 12, 2011

QRコードのデコーダーを買いました。

そうそう、QRコードを作るプログラムはできたので昨日Vectorにて公開しました。

http://www.vector.co.jp/soft/winnt/writing/se492441.html

テストの際に デンソーウェーブさんの iPhone 向けアプリで
 QRdeCODE というのを使わせていただきました。

http://www.denso-wave.com/ja/adcd/QRdeCODE/index.html

AppStore で¥170でした。
私はiPod Touchにて使っています。

たぶん私のだけではないと思いますが、携帯電話のバーコードリーダーは
3型までのQRコードしか読めないようです。
このアプリの場合は、そういう制約はないみたいです。

一番重宝したのは、パソコンの画面上のQRコードも
読めるということです。(携帯もそうだけど)
以前、USB接続のバーコードリーダーを買ったときに、
印刷するのが面倒くさいとおもって、画面から直接読もうとして、
だめでした。
しかし、QRコードのリーダーの場合、全然問題ありません。

あと、このアプリの反応が速いのと、QRの誤り訂正機能の
威力はすごいもんです。
私の手がぷるぷるして、iPodのカメラからQRコードのイメージが
一部はずれていても、もう読み取れてます。
すごい。
一部が欠損していても、復元できるということの
威力を実感しました。
さすが、本家です。

木曜日, 8月 11, 2011

QRコードを作るプログラムを作る(3)

暑い日が続いてますなあ。
あまりに暑いので、半ズボンにTシャツで仕事を
してます。ハワイ気分でプログラミング。
BGMにはハワイのFMをかけたりして。
これこれ
http://www.hawaiian105.com/

さて、QRコードのつづき。
今日は8ビットバイトモードの符号化だ。

これは簡単に言うとASCIIコードというかシフトJISの
文字コードをそのまま使うものである。
いわゆる半角文字などといわれるものです。

よって、単純に 入力データの文字コードを
2進数で表せばよい。

例) ab12 の場合


  1. 文字コードは 61 62 31 32 
  2. 2進数では 00111101 00111110 00011111 00100000
  3. モード指示子 0100
  4. 文字数指示子 00000100 (型番により桁数が違う)
  5. 全部つないで
    • 0100 00000100 00111101 00111110 00011111 00100000


8ビットバイトモード以上。

次に漢字モードも続けます。
漢字モードの漢字とはシフトJISの2バイト文字コード(16ビット)を
13ビットに圧縮するものだ。

文字コードが二つの範囲に分かれる。

  • 16進数で 8140〜9FFCまでのグループ
    • 8140を引く
  • 16進数で E040〜EBBFまでのグループ
    • C140を引く
その後下記のように処理する
  • 上記の結果の上位バイトにC0を掛ける
  • その結果に下位バイトを足す。
  • 13ビットの2進数に変換

規格書の例ですが、 ”点” という文字の場合で要領を示すと

  1. 文字コードは 935F
  2. 8140 を引く 121F
  3. 上位バイト(12)にC0を掛ける D80
  4. 下位バイト(1F)を足す D9F
  5. 13ビットの2進数 0 1101 1001 1111
  6. モード指示子は 1000
  7. 文字数指示子は8又は10又は12ビットの2進数

というわけで、数字、英数字、8ビットバイトモード、漢字モードと
ここまで順調に符号化すすんだ。
混在モードは以上のモードを切り替えながら符号化するものだ。
モードを切り替えるたびに、モード指示子と文字数指示子が
入るので、やたらめったら、モードを切り替えるべきではない。
その辺の切り替えの指針は規格書にも載っているが、絶対ではない。

私は、だいたい、規格書の指針を参考にやりました。

続く。

火曜日, 8月 09, 2011

くどい

今日も暑い日だった。暑い中、服装はどうあるべきかと考えているときにふと思い出した。

僕は来年で結婚10年になるが、結婚式もちゃんともっともらしくおこなった。
結婚式にむけては特にお嫁さんは衣装合わせがある。何度もある。
そして何度も付き添って通った。衣装に関して、基本的にお嫁さん中心だ。僕の衣装合わせなんか10分ですんだ。当日の着付けだって10分ですんだ。
まあ、それでも、それは楽しいことだった。やはりなんでも楽しみなことはわくわくするものだ。
衣装合わせの一環で、カラーコーディネータの方による、似合う色味の診断なるサービスがあり、僕も受けた。僕は、濃い色というかはっきりした色のほうがあうらしいということだった。濃紺とか濃いグレーとか赤とかはっきりしてるのはよくて、黄色とかグレーとか、パステルカラーは似合わないということだった。なんでかというと、顔がくどいからだそうな。
うーん。たしかにそうなんだけど。。。

まあ、いっか。

月曜日, 8月 08, 2011

QRコードを作るプログラムを作る(2)

月曜日のEテレの0655では爆笑問題田中さんのたなくじがあります。
今日いただいたくじはプチ凶みたいな感じのやつでした。あまり
気に入らなかったので、消しました。じくなた〜。

先日、QRコードの数字モードの符号化について書きました。
本日は英数字モードの符号化について続けます。
なんか、気が乗りません。あまりおもしろくないかも。

では、英数字モードです。
数字0〜9までと大文字のアルファベット(A〜Z)および
記号(スペース、$、%、*、+、-、.、/、: )が対象となる。
これらの数字には規格書の中で、先ほど紹介した順に
0〜44までの番号が割り振られている。
つまり、数字の0は0番、Aは10番、Bは11番と続いて、
スペースが36番、そして: が最後で44番である。

英数字モードでは入力テキストを二文字ずつに区切って符号化することで
短縮化している。手順は以下の通り。

例:入力データ HELLO

  1. それぞれの文字の番号を取得すると 17,  14,  21,  21,  24 になる。
  2. 二つずつのグループにする。 (17, 14)   (21, 21)  (24)
  3. 各グループごとに一つ目の数字を45倍して二つ目の数字と足す。
    ただし最後の1文字残った場合はそのまま。
    • (17, 14) → 17 x 45 + 14  =  779
    • (21, 21) → 21 x 45 + 21  =  966
    • (24)        → 24
  4. それぞれを11桁の2進数にする。ただし、最後の1文字分は6桁でよい。11桁というのは、3の手順で数値化した二桁の文字の値の最大値が44 x 45 + 44 = 2024 でこれを2進数で表すと111 1110 1000 となり11桁必要だからだ。同様に最後の一桁の場合最大値は44だからそれは6桁で足りる。
    • 779 → 011 0000 1011
    • 966 → 011 1100 0110
    • 24    → 01 1000
  5. 最後にこれらをつなげて、前にモード指示子と文字数指示子をつける。
    以下のようになる。
    モード:0010 (英数字)
    文字数:0 0000 0101 (5文字)※長さは型番により変わる
    データ:011 0000 1011    011 1100 0110     01 1000

            結果:00100000001010110000101101111000110011000

ということで、英数字モードは簡単でしたが、
やっぱり、なんかつまらない。くじのせいかな。


土曜日, 8月 06, 2011

iPod袋

うちの嫁さんは働いていて忙しいのにもかかわらず、多芸で趣味が多い。
合唱団で歌い、編み物の学校に通い、ハワイアンキルトもちくちくと縫っている。

そんな嫁さんにお願いして作ってもらった。
これは、iPod Touchを入れる袋である。
入れた感じはこんなである。

ゴム編みという編み方で編んだそうだ。伸び縮みして、ぴったりフィットする。

実は、Apple Store で売っている iPod Socks のパクリだ。
あれを見てかわいいと思い欲しかったのだが、5個で一組で売られていたので、ひとつでいいのにと思って買わなかったのだ。

で、嫁さんに相談したら作ってくれるという。
ええ!ほんと!と喜び、
きれいで明るい感じになるようにとお願いした。
そしたら、こんなにかわいく作ってくれたのだ。

とても気に入って使っている。

金曜日, 8月 05, 2011

扇風機にまつわる顛末

今年は、節電せねば! と気合いをいれたわけではない。
猛暑だった去年の夏は仕事の都合で、ずっと出張していたので、
あまり家にいなかったのだが、うちの嫁さんによると、
寝室のエアコンが調子悪くてすぐ止まると言っていた。
じゃあ、今年は買い替えようということになった。

工房にもエアコンがほしいなと思った。
私の仕事部屋である工房には冷房がないのだ。
冬はいい。暖房ならある。それに、うちの古い方の
パソコンはすごい熱を出す。
しかし、予算もないので、扇風機でいいことにした。

で、扇風機を使おうと思ったら、なんと、3枚の羽のうち1枚が
折れている。いつの間に。3月の地震の時かなあ?
ああ、肝心なときにと思ったが、仕方ない。


けなげな私は、ガムテーブで折れた扇風機の羽をつないでみた。
おお、使えるじゃん。とおもったが、
半日ほどして、扇風機はガラガラとけたたましい音をたてた。
遠心力で、羽が飛んでしまったのだ。

やはりケチはいかんな。

まあ、これは嫁さんが学生時代に買ったという20年ものだしどちらにしても、扇風機も買い替えることにした。


で、いそいそとケーズデンキに出かけた。6月下旬のことだ。
電気屋が好きなのだ。だからいつもいそいそと出かける。

ところが、驚いたことに扇風機があまりなかった。
そういえば、節電だからテレビや新聞で扇風機の活用をすすめていたし、扇風機が不足しているというニュースもあったなと思い出した。

結局、その日は、エアコンは注文したが、扇風機は買わずに帰ってしまった。
扇風機があまり種類がなかったことと、
エアコン選びで思っていたより高いやつを買ったからだ。
どうせなら省エネ性能が高いやつをと思い、
こいつは目が動くんだ、すごいなどと興奮し、
旧型のほうがちょっと安かったのに
新型のほうがリモコンがいいなどと調子にのり、
奮発したのだ。
しかしその反動で扇風機については、気が小さくなって
ケチケチ心が再びわいてしまったのである。

帰ってから、

やっぱり扇風機ほしい。

とおもったのは言うまでもない。
翌週、ケーズデンキにはいよいよ扇風機の在庫がなくなっていた。
ヨドバシにも行ってみたが、そこにもなかった。

7月上旬、暑い日が続いていた。
寝室のエアコンはすばらしい性能をあげていた。
しかし我が工房ではパソコンがうなり、はげしく熱を発している。
そんなとき、別の買い物で秋葉原にいった。
結局、その用事は果たせなかったのだが
ヨドバシに寄ると、USB扇風機が大量に売られていた。

これでいい。
これを買おう。

で、ついに工房に扇風機が導入された。

す、涼しい。




その後、台風がきて、一頃の暑さが収まった。
そして扇風機の品薄も解消されたのか、
ケーズデンキにも扇風機が並んでいた。
もちろん、今度は、すぐに買って帰ったのである。

QRコードを作るプログラムを作る(1)

JISの規格書を購入してから半月ほどたって、
先週末、QRコードを作るプログラムにとりかかることにした。

さて、、、

pdfはどこだ?

規格書をダウンロードした時にファイルを適当なフォルダに
放り込んでいたので、わからなくなってしまったのだ。
いや、そもそもどっちのパソコンで落としたんだっけ?
やばい。と焦ったのであったが、見つかった。よかった。
今度は、ファイルサーバーのしかるべき場所に保存しておかねば。

さて、、、
うむむ。。。
むぅ。
規格書は本文とたくさんの15の附属書からなっていた。
その間を行ったり来たりしつつ考え込むこと丸一日。

うん。よくわからないけど、まあいいや。
小さなことからこつこつと。
ひとつひとつ片付けよう。

大まかな手順で言うと
  1. 入力テキストの分析と符号化(0と1にする)
  2. 誤り訂正符号というものを生成する
  3. マトリックス(碁盤の目)に符号を並べる
  4. マスクなるものをかける
  5. 形式と型番を示す情報をつける
ということだ。
とりあえず、入力テキストの符号化を
やってみっぺ。

分析とは、、、
要するにQRコードにしたいテキストに含まれている
文字の種類を調べて、なるべくたくさんの文字を
詰め込めるように効率的に符号化しようということだ。
符号化とは、すべてを0と1で表そうということだ。
QRコードというのは、あの白と黒のつぶつぶが、
白は0、黒は1を意味しているのじゃ。

QRコードでは符号化のモードというものがあるが、
基本は、以下の4つのモードとその混在モードのようだ。
  • 数字モード
  • 英数字モード
  • 8ビットバイトモード
  • 漢字モード
規格によると、他に拡張チャネルモードとか構造的連接モードとか、
FNC1モードとかあるが、特定のアプリケーションに対応するものの
ようなので、今日のところは見逃してやろう。

で、ちいさなことからこつこつと。

数字モードは数字すなわち0〜9までの10種類の数字
だけを表現するモードだ。
話を進める前に、
さて、0から9までの10個を表すのに、最低必要な2進数の桁数
は何桁でしょう。
  • 0 -> 0000
  • 1 -> 0001
  • 2 -> 0010
  • 3 -> 0011
  • 4 -> 0100
  • 5 -> 0101
  • 6 -> 0110
  • 7 -> 0111
  • 8 -> 1000
  • 9 -> 1001
ということで4桁必要だということがわかる。
4桁で数字1文字を表現する方法だと、例えば
01234567という数字を符号化(1と0化)すると

   0000 0001 0010 0011 0100 0101 0110 0111 

となり全部で32桁となる。

しかしながら、本来4桁あれば、16種類の文字が
表現できる。さっきのに続けると、、、
  • 10 -> 1010
  • 11 -> 1011
  • 12 -> 1100
  • 13 -> 1101
  • 14 -> 1110
  • 15 -> 1111     
というわけで使ってないパターンが6個ある。
よって、もったいないということになる。

さて、規格によるとQRコードの数字モードは
次のようにしている。
  1. まず3桁ずつにグループ分けする
         012 345 67
  2. 各グループを10桁の2進数にする
    ※3桁の整数を表すのに2進数で10桁必要だからだ。
    012 -> 0000001100
    345 -> 0101011001
    67   -> 1000011     ※元が2桁の場合は7桁、元が1桁の場合は4桁
  3. 2進データをつなぎ合わせる
    0000001100 0101011001 1000011
この方法だと、上記の例では27桁で表現できている。

あと、符号化されたデータがどのように符号化されているのか
を示す情報が必要である。それをモード指示子という。
また、そのモードで何文字符号化されているか、文字数を示す必要が
ある。それを文字数指示子という。
  • モード指示子は4桁で各モードで決められている。数字モードの場合は

    0001
      
  • 文字数指示子はQRコードの大きさ(これを型番という)によって
    変わるが、小さいやつは10桁の2進数で表す。
    上記の例だと、8文字だから

        0000001000
これらを符号化されたデータの前に配置すると完成だ。
         0001 0000001000 0000001100 0101011001 1000011

    で、これをプログラムに書いてみた。

    と、さらりと書いたが、実は結構苦労した。今回はVBで書いている。
    VBでビット操作ってどうやるの?とか知らなかったので、
    またググりまくった。ありがとう、Google とネットの人々よ。
    VBはあまりこういうlow levelなことには向いてないのかも知れませんな。
    その辺はまた別の機会にして、とにかく、プログラムはできた。
    さてやってみよう。

         0001 0000001000 0000001100 0101011001 1000011

    OK、今日は完璧だ。

    次回に続く

    木曜日, 8月 04, 2011

    バーコードリーダーを買う

    QRコードを作るプログラムを書いてみたいのは
    やまやまだったが、さしあたって、バーコードラベルの
    リリースに向けて忙しかった。
    バーコードラベルは、今のところ一次元のバーコードで下記の
    種類に対応している。

    • JANコード・・・商品についているバーコードでスーパーなんかでピッとやっているやつ。
    • ITFコード・・・数字だけのバーコードで、黒いバーと白いバーの組み合わせで二桁ずつ表現することで、スペースを節約している。
    • Code39・・・英数字で43文字ほど表現できるがスペース多く使う
    バーコードには結構種類があります。Wikipediaなんかでみていると鬼のように
    あります。全部対応したら偉いだろうなと思いつつ、さしあたり、上記の三つ(JANには8桁と13桁バージョンがあるので細かくは4種類)に対応したところで、リリースした。
    今のところラベルデータの入力のしやすさとか、デザイン機能を改良したほうがいいかなと思ったからだ。

    さて、バーコードの実装の話だが、ありがたいことに、
    一次元のバーコードの仕様はWikipedia なんかで検索すると、
    詳しく載っていた。後にQRコードでは苦労することになるが、
    ITF, JAN, Code39 は比較的、今思えば簡単だった。
    ただ、、、作ってはいるものの、本当にこのバーコードは読めるのか?
    当然、検証する必要があるではないか。

    ということでバーコードリーダーを購入した。
    最初秋葉原に行ったのだが、はてな、どこで売っているのかわからない。
    うーむ。結局、暑かったので、前から欲しかったUSB扇風機を買って帰ってきた。

    で、ネットで検索したらアマゾンで売ってました。
    で、意外と安いんだなと思いながら、レビューを読んで、評判がよかったので、これを買いました。

    ビジコム CCDバーコードリーダーBC-PS800-U

    というもので値段は3990円でした。

    二日ぐらいして早速とどいた。

    USB接続なので、パソコンからはキーボードの一種という扱いになるらしい。
    パソコンにつないで、メモ帳を開いて、え〜
    そのあたりにあるティッシュの箱とかペットボトルとか本とかの
    バーコードを当ててみた。

    ピッ! というするどい音、静寂な我が家では、けたたましく感じたが
    本来使うであろう、お店とか倉庫では、必要なのであろう。

    メモ帳を見ると、おお、読めている。当たり前か。

    さて、では、私のソフトが作り出したバーコードはどうか?
    最初、プリントするのが面倒で(うちのプリンタはリビングにある。
    我が家は広いので、片道21歩あり、スイッチを入れにいき、戻ってきて
    プリントして、また取りにいくと、2往復で84歩だ。:p)
    なので、画面に表示したバーコードを読もうとした。

    だめでした。

    ずぼらはいかん。84歩ほど歩いてプリントし、今度は紙に当ててみた。

    ウンとも言わぬ。

    ティッシュの箱のバーコードと自分で印刷したバーコードを見比べる。
    凝視する。うーん。なんか違うな。
    Wikipediaで参照した規格をもう一度読み直した。
    どうやら解釈を間違えていたようだった。

    で、小一時間経過して、ふたたび、プリンタまで往復した。

    ピッ!

    おお!読めている!すばらしい。
    さわやかな充実感でした。

    ちなみに、もう一度パソコンのモニターに映ったバーコードを
    バーコードリーダーで読もうとしてみましたが、
    やっぱりだめでした。




    QRコード

    2次元バーコードのQRコードを作るソフトはいろいろ出回っていますが、
    自分でも作ってみたかった。

    調べてみると、

    • QRコードはデンソーが開発したものらしい。
      http://www.qrcode.com/index.html に詳しく載っている。
    • QRコードの仕様はJIS/ISOで規格化されていて、「QRコードは(株)デンソーウェーブの登録商標です。」の一言があれば使用料はかからず、自由に使っていい。
    • JIS/ISOの規格は実は簡単に入手できる。そんなに高くない。

    ということがわかった。

    早速、規格書を入手した。
    JIS/ISOの規格は 日本規格協会(JSA)がウェブストアを開いていて
    そこで規格番号 " X0510"で規格書を検索することができた。
    http://www.webstore.jsa.or.jp/webstore/top/index.jsp 
    価格は 4,830円だった。それほど高くない。PDFのダウンロード販売だ。
    クレジットカードで購入するとすぐに入手できた。

    さてこれでいつでも作れるぞと思い、そのまま半月が経過したのだった。

    続く。