2009/10/04

Googleリーダー

iPhoneユーザ-なったので、近頃GoogleReaderをごそごそと。iPhoneのRSS系のアプリにはGoogleReaderと連携するツールが結構あるんですよね。iPhoneアプリについて色々みてまわると、GoogleReaderへの言及も多いので、ふーんと、好奇心。

これまではRSSは、Operaでシンプルにローカル管理(RSSがないサイトは「はてなアンテナ」に登録、という使い分けでやっていました。しかしこれだと当然、マシンが変わると共有できませんからね。

イマイチ、使いづらいなぁと思って、遠ざかっていたReaderの研究です。レイアウトは相変わらずあまり好きになれませんが、機能は結構スゴイような気がしますね。

しかし機能がありすぎてイマイチわからないことも。コメントとメモ機能の違いってナニ?コメントは公開サイトには表示されないようですが、じゃぁどういうときに活用するのか?というとよくわかりませんな。ま、使っていくうちにそのうちわかるでしょ???

とりあえず、メモ共有等は面白そうなので、自分の共有アイテムをlogbookからもリンクすることにしました(画面右下のウィジェットより)。


で、現状私のRSS環境はどうなってしまったかというと、今後もOperaはOperaで使ってゆくだろうし(読みやすいから)、はてなははてなでRSS未対応のサイトに対して使ってゆくだろうし(はてなのフィードをGのリーダーに突っ込んだので、はてなアンテナまでダイレクトに見に行く必要はないかな?)。Googleリーダーは主にiPhoneでのヴューアー、及び、メモ機能の為に利用することになるような…?

アンテナくらいひとつにしたいような気もしますが、それぞれ使いやすさもあり、ひとつにできないこのもどかしさ…。(-_-;)

2009/09/26

ソフトバンク同士

▲iPhoneでのメーラー設定画面の一幕。「アカウントの追加」する際、gmailもこんな感じで、選択しやすい画面なのですヨ。

ソフトバンクの友達にiPhoneからgmailでメールを送ったら、フツーに迷惑メールにされました。

ソフトバンク同士なのにー。

どーゆーこと? ヽ(`Д´)ノ

iPhoneの絵文字

docomoの友達からメールがきたと思ったら、やたらとハートだのクジラだのの絵文字。

…クジラ? 

こんなにファンシーなメールを書くコだったっけ?

と思っていたら。

docomo→iPhoneの絵文字では、だいぶテキトーに変換されているようでした。

PCのwebブラウザでgmailを見たら、そこには笑顔、汗つき笑顔の絵文字(gmailは一応絵文字対応ですから)。

クジラよりも断然、文脈に合っている絵文字。…全然違うじゃん!!

ちなみに「iPhoneでも絵文字を使えるようになった」というハナシでしたが、iPhone: 絵文字キーボードの使用についてを読むと絵文字を送信できるのは、SoftBank のメールアカウントおよび SoftBank SIM を使っている、OS バージョン2.2 の iPhone のみとありますので、現状メアドでは「i.softbank.jp」アドレス以外は絵文字はうてないようですね(SMSとかならうてますけど)。

2009/09/21

Delivery Status Notification (Failure)

iPhoneになって、gmailを使っているのはいいんですけれど。

MLとかは気が向いたときに読む程度なので、即時的にお知らせがこなくてもいいや、と思って。gmailのフィルターを使ってML以外のメールをi.softbank.jpのメアドに転送して、プッシュ型っぽいコトを実現しているわけですが。

ときどき「Delivery Status Notification (Failure)」のメールがgmailに残っているんですよ。(;´Д`)

gmailはi.softbank.jpに転送したけど、i.softbank.jpに断られた?みたいな内容なわけで。i.softbank.jpにgmailがスパム扱いされている?

gmailにメールは残っているので、iPhoneからつなげば見えるし、PCからも繋げばフツーにメールは見れるわけですが。

ググってみたところ、5月くらいにもiPhoneユーザーの間ではそんな騒ぎがあったようで。しかし、それがどう決着したのかは不明。

自分の状況を分析して見ると、どうやらgmailの特定の拡張アドレスを使っているヤツだけがエラーになっているフシはあるんですけれどね(ちなみに拡張アドレスものは殆どMLで使っているので、私本人としては転送設定していないつもり。なのになんで転送しようとしちゃうのかな。私がフィルターの設定を間違えているっぽな…)。しばらく様子をみてみましょう。

2009/09/18

.NET 開発テクノロジーの全体像

Tech Fieldersの『.NET 開発テクノロジーの全体像』というセミナーに行ってきました。そしたら下記の本が当たってしまいました!今年の運、使いました?あと3ヶ月くらいだから、ま、いっか?

肝心のセミナーはある程度覚悟はしていましたが正直言って、殆どわかりませんでした。本読んで勉強しなくちゃ…。(;´Д`)

予想通りASP.NETのデモばっかりで、Windowsフォームはレガシーテクノロジー扱いでしたし。C#なのはまぁいいのですが、ある意味、VSの使い方自体についていけてない感じでした。.NETFramework3.5くらいからかなりライブラリが増えたコトだけは認識しましたけどね。

ASP.NET MVCの話は、それってRuby on Rails?という気がしましたが、この辺の私知識はCakePHPとかの解説をさらーっと読んだことがあるくらいのものなのでただの勘。ただ"設定より規約”(convention over configuration)とかの科白はさすがに聞き覚えありますからねぇ。名前付けのルールとかもなんだか見覚えあったし。Windwosフォームばっかり作っている身からすると、こーゆーのってある意味勝手に優秀なIDEがやってくれているものだから、意識してないようなところがありますが。

PHPなんかはエディタで頑張るからきっと大事なんだろうネ!?(Rubyも?)効果が出やすいんだろネ!?

MVCはそういう非IDEな環境から生まれた発想なんじゃないかなー?という気もしましたが、どうなんでしょう?でも、MSもIDEがありながらそれに、この度追随しました!?というところ???

もっとも、ASP.NETはどーもとっつきにくくて、VSユーザーのわりに手を染めていません。ASP.NETのどの辺が食いついていけないところかというと、HTMLのデザイン部分ですよ。「HTML=タグうち」育ちなので、まるきりWindowsフォームみたいにコントロールを置くというお作法に抵抗が…。ASP.NET MVCについては、UIは完全にHTMLベースになったようで、個人的には好印象。

というわけで、今後のASP.NETではWebフォームでの開発と、このMVCの開発の選択肢があるというわけですね。でもまー、「MVCはWebフォームに置き換わるものではない」そうなので、どっちの選択がベスト・チョイスなのか、というのは、その場のシチュエーションによるものらしい…(←受け売り)。


ADO.NETはいまだにVS2005ユーザーだし、LINQさえも使ってない私としては未来すぎました!(バッチ処理が多い私には、LINQは遅いし所詮無縁なテクノロジー!!というのが去年の悟り)

ADO.NET Entity Frameworkの構造はなんとなーくわかったけど。DBもそりゃ切り替えやすいでしょうけど。あのリレーションの図を書くようなところを変更するような自体になったら結局大変なんじゃん??とか思ってみたり。


Azureの話は難しすぎた!11月までは無料お試しができることだけはわかった!

あとAzureではKey-Valueストアがデフォルトで使えるのね。Key-Valueストアとかはgoogleとかで有名になっているアレでしょ?(アレってなに?)


ちなみにLTは大分面白かったデス。

シリアル通信のヒトとかも、面白すぎでしょ。あと、病名のコード化とかも、なぬなぬななぬ?!という感じ。形態素解析のようなことを病名でやるのだねぇ。…しかもSQLで。詳細はよくわからなかったけど、そーゆージャンルもあるんだ、という感じ。

ネタ的には、私よりも未来のコトを語っている後半の二人(一人はデータアクセスの歴史、も一人はSilverlightの国際化)よりも、面白かったりして。まぁ後半の若手二人の方が、プレゼン自体は上手だったけどネ!

プロバイダ考

Gigazine.netを読んでいてたまたまこんな記事が目にとまりました。

なぜ追加料金なしの格安で固定IPが利用できるのか、ユーザー目線のサービス「livedoorプロバイダ」の秘密に迫ってみた

「あら、固定IP…」と思って、読みはじめたわけですが、livedoorプロバイダのサイトにとんだらなんか公衆無線LANのことも書いてある!(←そっち?)
iPhoneになった今や、FONとか公衆無線LANにすごく興味があるわけですが(3Gで使い倒す!というのも一つのあり方ですが、Wi-Fiの方が早いですから…)。
ライブドアと契約すると
livedoorwireless(市街地に強い)+FON(住宅街に強いし海外でも使える!)
が使えちゃうのかー。
月額料金は
プロバイダ料金1,500円+フレッツ光5,000円くらい(←戸建の場合。マンションだと3,000円くらいらしい)
だとするとウチの場合6,000~7,000円くらいの見積もりですな(戸建てのフレッツは高いなー)。
ウチの場合、CATVのパック料金で賄っているので(TV+電話+ネット)、ネットだけのことを考えるとプラス2,000円ちょっとくらいの出費…。)。今より劇的に回線速度は速くなるけど、ウチの機器はほぼ無線で繋いでいるから、現状ではそこまで回線だけ早くなっても効果は薄いし。ルータはー11nで使えるけど、子機はウチの機器は今のところどれもこれも対応していませんので…。3Gの使い方にもよるけれど、かなり微妙な選択ですな。Wi-Fiのエリアが増えるのは嬉しいけれど、プロバイダの「ついで」だから嬉しいというレベルであって、現状、3Gほど広範囲なわけではありませんしね。回線+プロバイダ料金が合計5,000円程度でおさまるなら、livedoorに乗り変えもアリかなーと思いますが、2,000円以上のUPとなるとヨドバシの公衆線無線LANを申し込んだ方が安いし…。戸建のフレッツ高すぎ。(;´Д`)

ただこういうプロバイダが今後増えてきたりするのかなーとは認識しました。グローバルIPはともかく、公衆無線LANも使えまっせ!!というプロバイダは他にもありそうですね(SoftBabankもある程度は使い放題で提供していますけどね)。

2009/09/14

iPhoneことはじめ

今年の4月に、家のルータを新調・いじり倒したことも、iPhone購入の要因として大きいですね。2年契約の縛りが切れるのを待って、auからのりかえ。

iPhoneもラク~に家の無線に接続できたので、家ではつなぎ放題、ということに!!

メール

iPhoneといえば、ケータイと比較されてなんのかんのと云われているメールの設定ですが。

私はもともとGmail主体の人間だったので、とりあえずこんな具合で設定。

  • Gmailをフェッチの「手動」に設定。
  • Gmail でフィルター設定して任意のものだけ、i.softbank.jpのアドレスへ転送(私の場合、Gmailを主体で使っているので、MLやらもガンガンくるわけですが、それはリアルタイムでの着信など受け取りたくないので、フィルター設定は必須)。
  • i.softbank.jpはプッシュなので、リアルタイムで「You got a mail」が表示されるように。
  • 着信に気が付いたところで、おもむろにgmailをチェックすればよい。

もともと、前のキャリアのauでも件名着信で、本文は読むときに受信していたので、この設定だと違和感が限りなくゼロに近いですね。

ちなみにi.softbank.jpのアカウントは設定していません(というか色々やったものの、削除してみた)。

アカウントを設定する必要があるのかと思いましたが、設定しなくても、着信はくるようですね。

i.softbank.jpにはメールが溜まることにはなりますが、どーせ30日間保存なので、着信専用でまぁいいや、と割り切りました。

i.softbank.jp のアカウントを設定すると、メールのアイコンのヨコに未読件数がgmailの分とi.softbankの分が倍増して表示されるわけですが、i.softbankのアカウントを削除すると、gmailでの未読の件数のみが表示されてスッキリするわけですね。

iTunes9

バージョンアップしたら大変なコトになりました。AppleStoreが文字化けしまくりで、PCからは使い物になりません。iPhoneからアプリを落とせばいいとも思いましたが、やはり気になる…、というコトでググってみると。XPでJIS2004 対応 MS ゴシック & MS 明朝フォントパッケージをあてていると、文字化けするんですって。JIS2004…。あぁいれちまったさ!!

家ではこだわっていませんので、あっさりアンインストール作業を行いました。

手順等詳しくはこちらを参照しました。

2009/09/13

iPhoneゲット

こんにちは、今年の夏休みをスウェーデンで過ごして、モバイルに目覚めてしまったじょにですよ(?)。

これまで「モバイルなんてしないもんね」と割り切っていてケータイも使いこなしていなかったわりに、ここへきてあっさりiPhoneに乗換え──変わり身の早さに、周囲は呆れ気味。

でも!!だってねぇ?!北欧ときたらモバイル先進国ですからね。

これまで私が旅してきた国々では(トルコ、エジプト、コスタリカ、キューバetc…)、ネットカフェにはでーん!!とPCがあったのに。

北欧ときたら提供されているのは無線LANポイントだけで、実機がある場所が殆どないんですよ。非モバイラーの旅行者としてはメールチェックすらなかなかままならない事態に。しかし現地の人々を観察すれば、それぞれネットブックだのモバイルを持っていて困ってない模様。

「去年のキューバはディスプレイもCRTというレトロな世界でネット・カフェ自体殆どなかったけど、今年の旅は先進国だし…」と思って軽くみていた私が甘かった!!

今度は先進すぎて、いわゆる私が求めている「ネット・カフェ」が、ストックホルムでは存在しなかったのです。

マシンがあっても、管理人不在向けのハードからして特殊仕様・先進的すぎ(自販機でID/パスワードを発行 or クレジットカードで接続…とかそんなノリ)。

トルコやコスタリカのはカフェならば、大抵ネット・カフェには管理人がいて、A~Cのマシンは日本語入れて、B~Dのマシンは中国語担当して…とマシンごとに言語を割り振っていて、日本語使いたい旨を告げるとマシンを、どのマシンを使えと割り当ててくれたわけですよ。やっかいな外国語の旅行者にとっては、とてもフレンドリーな環境で。XPの言語環境はベンリになったもんだなーと思っていたわけです。

ところが北欧のネット・カフェは無人!XPも特殊カスタマイズ!ハードもいわゆるPCと違うネット・カフェ専用機!見るからにゼッタイ、日本語ムリ!メールなんて殆ど日本語ばっかりだから、殆ど文字化け!!

年々、国際空港ではLANのポイントのまわりにバッグパッカーだのが座り込んで自分のマシンを繋いでネットやっている姿をみかけることが増えたなー、そろそろ私もなんらかのモバイルをもつべき?──とはぼんやり去年あたりから考えてはいましたが。モバイル先進国へ行って、カルチャーショック。一気にギアが入りました。

auの2年契約がこの9月で切れるのを待って乗り換えと相成りました。…これってストックホルム症候群(違)?

2009/09/01

Opera10

これまでOpera9を利用していましたが、10の正式版がリリースされたということでバージョンアップしてみました!
普段はOperaでサーフィンして、会社ではChromeで作業、家ではFireFoxで作業、みたいな住み分けをしている、たぶんマイノリティなワタクシ。
メインのわりにバージョンアップに対して怠惰なのは、iniファイルをいじり倒しすぎて、その辺のカスタマイズをしなおすのが面倒くさいから(※iniファイルやcssをいじる気さえなくせば、Operaのバージョンアップはスムーズです。デフォルト設定のカスタマイズであれば、きちんと移行しますし。…しかし私の場合、メインだからこそいじり倒したくなるのです!)。
今回も[standard_menu.ini]が移動していて、一瞬、おろおろしましたが[ui]フォルダにちゃんといました。書き方は細々かわっているぽいけど、昔ながらの書き方でもいけるみたいですね。
ウワサのTurboは…、これってホントに速いんですかね???むしろ[無効]にしてサーフィンした方が動作が軽い気がするのは私だけ?(画像もノーマルにきれいだし。Turboを使わないデフォルトでも、以前より描画は早いと思います)
気になるUnitの機能は10.10で搭載されるようですね。

2009/08/18

全角ハイフン(U+2010)の欠落

VS2005でActiveReportsを使って開発していたら(XPPro環境デス)、住所に入っていた全角ハイフンが消えちゃった!Y(>_<、)Y

データでは「‐」(全角ハイフン)があるのに、プレビューすると消えている。──あー、そういえば以前、パンチ会社を変えたときに、師匠たちが一瞬大騒ぎしていたような記憶アリ。"たしかあのときは「-」(全角マイナス)に置換してしのいんだんだっけ?"と思いだして、デスマーチの手伝いの真っ只中ではとりあえずそれで凌ぎましたが。


徹夜明けて、落ち着いてくるとビミョーにひっかかってきたので、多少ググってみました。

すると出てきた…。

Windows Server 2008、Windows Vista、Windows Server 2003、および Windows XP で GDI+ API 関数を使用するアプリケーションを使用すると、Unicode ハイフン文字 (U+2010) が描画されない

原因

この問題が発生するのは、GDI+ が日本語の全角ハイフン (U+2010) の Unicode コード文字を描画しないためです。代わりに、GDI+ は文字をソフト ハイフン (U+00AD) として描画します。しかし、U+2010 コードは、ハイフン マイナス文字 (U+002D) として描画される必要があります。


なんだこりゃ。(-_-#)

つまりGDI+を使っているヤツではU+2010は全滅ってわけですか…。修正プログラムも出ているっぽいけど。こんなのイチイチ、マシンに入れて歩いてられないよなぁ(運用前後はバタバタしているから入れ忘れそう)。印刷レベルでは全角マイナスで頑張るしかないか。

2009/06/18

Excel MOD関数で#NUMエラー

「ExcelのMod関数(割り算の余りを求める関数)を使うとエラーがでるんだよ」という相談を受け、問題のBookをもらって眺めてみたところ。

割られる数の桁が妙に多い。

「なんかそれって怪しいなー」と思って、試しに割られる数の桁を少なくすると、ちゃんとMod関数は機能する。どうやらMod関数では、割る数が1桁の場合、おおよそ9桁前後で#NUMエラーが出てくる模様。ウーム、と思ってMod関数の割られる数の上限を求めてググってみると、MSのサイトにちゃんと原因・解決法が書いてありました。

原因は、これ。

#NUM! エラーが返されるのは、以下の条件に該当する場合です。 (除数 ' * 134217728) が、数値' 以下です。

ここでいう数値'というのは、割られる数のコトですね。

たとえば1234567890 ÷ 7のケースを考えてみると、

7 × 134217728 = 939524096

割られる数1,234,567,890よりも939,524,096の方が小さいからアウト、というわけですな。

それじゃぁ桁数が大きいときに、MOD関数を使わずに余りを求めたいときはどうすりゃいいの?というのは簡単(上記のリンク先のヘルプにも書いてありますけど)。

1234567890 ÷ 7のケースで考えるならば、

1234567890 -(INT(1234567890/7)*7)

でOK。INT(1234567890/7)で商を求めて(INT関数で小数点以下を無視している)、除数で掛け算して、割る数から引けば、そりゃ余り。

2009/05/31

PDFCreator日本語問題まとめ

いろいろありましたが、まとめ、いきましょう。とりあえずPDFCreatorのverは0.9.8になります。

PDFCreator0.9.8 (日本語対応バイナリ配布)

コンパイル環境のない方の為に、やすさんからいただいたバイナリとソースをUPしておきますね。やすさん、ありがとう!

配布
  1. PDFCreator0.9.8 (日本語対応exeファイル)
    PDFCreator_0516.zip
    (MD5 : 91ae1b27a964be1cfdbd111b286e445f)
  2. 参考 PDFCreator0.9.8(上記ソース)
    Version 0.9.8_090516.zip
    (MD5 : db8944afaa2e672b31d9f66a8a473060)
使い方
  1. 本家からPDFCreator0.9.8をDLしていただき、一旦インストールします。
  2. その後、PDFCreator.exeを上記1.の日本語版exeファイルと差し替えます。
動作環境の報告

当バイナリは、W2K(SP4)/XP(SP3)での動作が確認されています。

Vista(32bit SP2)環境では、"VB6JP.DLL"をインストールする必要があるようです(これはVisual Basic 6.0 SP6あたりのランタイムを入れれば入ると思われ…)。

Ω Ω Ω

以下は上記ソースにいたるまでの解説・経緯のまとめになります。本家でバージョンアップがされたときのために…。

メニュー画面の日本語化について。

  1. PDFCreatorの文字化けをなおす…必須
  2. PDFCreatorの文字化けをなおす2…小手先
  3. PDFCreatorの文字化け問題-修正箇所発見…Vb6.0でコンパイルできるヒト向け(これで完璧に)

PDF情報の日本語入力について(※すべて、VB6.0でコンパイルできるヒト向け)

  1. PDFCreatorの日本語問題-PDF情報編2
  2. PDFCreatorの日本語問題-PDF情報編…(2)EncodeCharsについての部分のみ利用してください

2.の記事にある「(1)ReplaceEncodingCharsについて」は不完全だということがわかりましたので、以下がやすさんの差し替えソースです。

[Common]-[modPDF.bas]

Public Function ReplaceEncodingChars(Str1 As String) As String
'---ErrPtnr-OnError-START--- DO NOT MODIFY ! ---
On Error GoTo ErrPtnr_OnError
'---ErrPtnr-OnError-END--- DO NOT MODIFY ! ---
50010  Dim i As Integer, tStr As String
'---2009/05/16-START--- by yasu
       Dim bStr() As Byte
       Dim j, k As Integer
'---2009/05/16-End--- by yasu
50020  tStr = ""
50030  ' First we look for oct encoding chars
'---2009/05/16-START--- by yasu
'50040  For i = 127 To 255
'50050   Str1 = Replace$(Str1, "\" & Oct$(i), Chr$(i))
'50060  Next i
50070  ReplaceEncodingChars = Str1

        j = 0
        ReDim bStr(Len(Str1))
        For i = 1 To Len(Str1)
        Do
            If Mid$(Str1, i, 1) <> "\" Then
                bStr(j) = AscB(Mid$(Str1, i, 1)): j = j + 1
            Else
                If i <> Len(Str1) Then
                    If Mid$(Str1, i + 1, 1) Like "[\{}()]" Then
                        bStr(j) = AscB(Mid$(Str1, i + 1, 1)): j = j + 1: i = i + 1
                        Exit Do
                    End If
                End If
                If Len(Str1) - i > 3 Then
                    For k = 1 To 3
                        If Not Mid$(Mid$(Str1, i + 1, 3), k, 1) Like "[0-9]" Then
                            Exit For
                        End If
                    Next
                    If k = 4 Then
                        bStr(j) = CByte("&O" & Mid$(Str1, i + 1, 3)): j = j + 1: i = i + 3
                    Else
                        bStr(j) = AscB(Mid$(Str1, i, 1)): j = j + 1
                    End If
                Else
                    bStr(j) = AscB(Mid$(Str1, i, 1)): j = j + 1
                End If
            End If
        Loop Until 1
        Next
        tStr = StrConv(bStr, vbUnicode)
'---2009/05/16-End--- by yasu
50080  ' Second we look for hex encoding chars
50090  If Len(Str1) >= 4 Then
50100   If Mid$(Str1, 1, 1) = "<" And Mid$(Str1, Len(Str1), 1) = ">" Then
50110    If Len(Str1) Mod 2 = 0 Then
'---2009/05/16-START--- by yasu
          ReDim bStr((Len(Str1) - 2) / 2)
'---2009/05/16-END---
50120     For i = 2 To Len(Str1) - 1 Step 2
50130      If IsNumeric("&H" & Mid$(Str1, i, 2)) = True Then
50140        If CByte("&H" & Mid$(Str1, i, 2)) > 255 Then
50150          Exit Function
50160         Else
'---2009/05/09-START--- by yasu
               bStr((i - 2) / 2) = CByte("&H" & Mid$(Str1, i, 2))
'50170          tStr = tStr & Chr$(CByte("&H" & Mid$(Str1, i, 2)))
'---2009/05/09-END--- by yasu
50180        End If
50190       Else
50200        Exit Function
50210      End If
50220     Next i
'---2009/05/09-START--- by yasu
          tStr = StrConv(bStr, vbUnicode)
'---2009/05/09-END--- by yasu
50230    End If
50240   End If
50250  End If
50260  If Len(tStr) > 0 Then
50270   ReplaceEncodingChars = tStr
50280  End If
'---ErrPtnr-OnError-START--- DO NOT MODIFY ! ---
Exit Function
ErrPtnr_OnError:
Select Case ErrPtnr.OnError("modPDF", "ReplaceEncodingChars")
Case 0: Resume
Case 1: Resume Next
Case 2: Exit Function
Case 3: End
End Select
'---ErrPtnr-OnError-END--- DO NOT MODIFY ! ---
End Function

後半だけでなく、前半の8進変換もどきもバイト配列に一端いれてから日本語変換する必要があったようです。

前段の8進もどきで一体なにをやっているかといいますと…。

たとえば「\203R\203\201\203\223\203g\202\360\223\212\215e」を日本語にすると「コメントの投稿」となるわけですが。「\203R」の「\数値3桁」を16進数に変換、アルファベットをASCIIの16進数に変換すると「83 54」。これはS-JISでの「コ」…。以下略。──という具合に日本語に変換していかなくてはならないわけですよ。数値にアルファベットと入り交ざっているこいつらを一端16進数に戻して、S-JISに変換する、という流れ。

引数で受け取る値を見ても、一見「!?」という感じですし、暗号でも見ている気分でしたよ。やすさんスゴイ!!ヽ(´ー`)ノ

2009/05/18

PDFCreatorの日本語問題-PDF情報編2

やすさんのUPしてくださったソースと比較して、日本語(マルチバイトの文字列)が混ざると、PDFを[保存]できない原因がわかりました。

[保存]できない現象に対しての、修正箇所は

[Common]-[modCDlg.bas]-[SaveFileDialog]

もともとこのモジュールではOPENFILENAMEに対して下記のようにセットしていますが。

オリジナル

50160  With ofn
50170   .nStructSize = Len(ofn)
50180   .hWndOwner = hwnd
50190   .sFilter = tFil
50200   .nFilterIndex = FilterIndex
50210   .sFile = InitFilename & Space$(1024) & vbNullChar & vbNullChar
50220   .nMaxFile = Len(.sFile)
50230   .sDefFileExt = DefaultFileExtension & vbNullChar & vbNullChar
50240   .sFileTitle = vbNullChar & Space$(512) & vbNullChar & vbNullChar
50250   .nMaxTitle = Len(ofn.sFileTitle)

50260   If InitDir = vbNullString Then
50270     .sInitialDir = GetPDFCreatorApplicationPath & vbNullChar & vbNullChar
50280    Else
50290     .sInitialDir = InitDir & vbNullChar & vbNullChar
50300   End If
50310   .sDialogTitle = DialogTitle
50320   .Flags = Flags
50330  End With

OPENFILENAME構造体は、


.nMaxFile   :ファイル名のバッファのサイズを設定

.nMaxFileTitle :フルパス用のバッファのサイズを設定


ですので、オリジナルのようにLenで計算している(行番号07.、10.)と、マルチバイトの文字列が入るとおかしくなっちゃうんですねー。

というわけで、下記のようにLenBにあらためます。

修正後

50160  With ofn
50170   .nStructSize = Len(ofn)
50180   .hWndOwner = hwnd
50190   .sFilter = tFil
50200   .nFilterIndex = FilterIndex
50210   .sFile = InitFilename & Space$(1024) & vbNullChar & vbNullChar
'50220   .nMaxFile = Len(.sFile)
50220   .nMaxFile = LenB(.sFile)  
50230   .sDefFileExt = DefaultFileExtension & vbNullChar & vbNullChar
50240   .sFileTitle = vbNullChar & Space$(512) & vbNullChar & vbNullChar
'50250   .nMaxTitle = Len(ofn.sFileTitle)
50250   .nMaxTitle = LenB(ofn.sFileTitle)

50260   If InitDir = vbNullString Then
50270     .sInitialDir = GetPDFCreatorApplicationPath & vbNullChar & vbNullChar
50280    Else
50290     .sInitialDir = InitDir & vbNullChar & vbNullChar
50300   End If
50310   .sDialogTitle = DialogTitle
50320   .Flags = Flags
50330  End With

この部分を修正すると無事、マルチバイトの文字列が入っていても、[保存]できるようになりますねぇ。

ちなみに[ReplaceEncodingChars]については、前回の16進変換の修正のみのモジュールのままでも、とりあえずのところは動きました(←そして8進変換の役割が、相変わらず、わかっていないじょにでした。[\XXX]の8進数を文字に置換しているのはわかっていても、「何故変換するのか。なにが入ってきて、どう変換すべきなのか」というそもそもの役割とかが見えきていないッス・泣)。

String型の連結-VBA編

今回は「VB6.0やVBAだとこういう書き方もアリなんだー」という、個人的には目から鱗ネタです。下記のソース、(1)と(2)、どちらが速いか?というわけですね。

(1)
For i = 0 To lngMax
    strText1 = strText1 & "あいうえおかきくけこさしすせそ"
Next
(2)
For i = 0 To lngMax
    strText2 = strText2 & "あいうえおかきくけこさしすせそ"
    If Len(strText2) > 3000 Then strText1 = strText1 & strText2: strText2 = vbNullString
Next
If Len(strText2) Then strText1 = strText1 & strText2

(1)の方が一般的な書き方だと思いますが、この場合、(2)の方が圧倒的に速いのです。

結果

(1):343 ミリ秒

(2):16 ミリ秒

※Acceess2003で実験

VB6.0のString型は値型なので文字列を追加する度に、データの文字列をコピーしているわけですね。コピーするものが、長ければ長いほど、コピーの作業にコストがかかる。

ひるがえって(2)ではstrText2にちまちま文字列を追加して、 If Len(strText2) > 3000 のタイミングでstrText1に突っ込んで、strText2をカラッポにしてまた文字列をためていく。その方が、長い文字列をコピーする回数が激減して、処理が速くなるというわけなんですね(ちなみに.Netだとstring型は一応参照型なので、文字列をセットする度にコンストラクタが発生している様子でVB6.0/VBAどころではない負荷を、もはや「体感」として感じます。なのでStringBuilderのインデクサで対応)。

サンプルソース

フォームにtxtDATAという名前のテキストボックスを作って、そこにタイムを表示する。clsTimerMMクラスは「時間経過計測クラス‐VBA編」参照。

Dim clsTimerMM As clsTimerMM
Dim strTextMsg As String
'************************
Dim strMsg As String
Dim strText1 As String
Dim strText2 As String
Dim lngMax As Long
Dim i As Long
'************************
Set clsTimerMM = New clsTimerMM
strMsg = "あいうえおかきくけこさしすせそ"

lngMax = 10000
'************************
clsTimerMM.SetStartDate
For i = 0 To lngMax
    strText1 = strText1 & strMsg
Next
strTextMsg = "(1):" & clsTimerMM.ElapsedTime & vbCrLf
Me.txtText1.Value = strText1 & vbCrLf
strText1 = vbNullString
'************************
clsTimerMM.SetStartDate
For i = 0 To lngMax
    strText2 = strText2 & strMsg
    If Len(strText2) > 3000 Then strText1 = strText1 & strText2: strText2 = vbNullString
Next
If Len(strText2) Then strText1 = strText1 & strText2
strTextMsg = strTextMsg & "(2):" & clsTimerMM.ElapsedTime & vbCrLf
Me.txtText2.Value = strText1 & vbCrLf

Me.txtDATA.Value = strTextMsg
Set clsTimerMM = Nothing

2009/05/15

情報セキュリティEXPO

情報セキュリティEXPO行ってきましたー。行った方も多いんじゃないでしょうかね。…かくいう私の親友も、すれ違いで昨日、出展者側で受付壌とかやっていた気配があったりするわけですが(笑)。

展示会をのぞくのは1年ぶり?くらいで、楽しかったです。以下ざっくりレポ。

資産管理と情報漏えい

情報漏えい対策ツール、色々なソフトが出回っていますけど。今や資産管理とかと連動しているんですね!──というのが、ちょっとしたオドロキでした。道理といえば道理ですけど、アタマいー。

棚卸作業はいまやUSBメモリまで!という感じで、USBメモリからの情報漏えいも多いわけだからそりゃそーだよね、と思いつつ、「ほへー!」という感じでした。

ちなみに情報システム部でもない私が、何故棚卸ジャンルを気にするかというと、部内のマシン各種・ライセンス管理を不本意ながらこの数年やっているからです。これが大変面倒くさい!(てゆーか、持ち回りにして!大変さや仕組みがわかれば、不届きモノも減るだろうから)

毎回、大捜索をしたり(勝手に返すな)、発見したりしながら(ちゃんと管理人に言ってよ!)、ヘトヘトの思いで足で稼いでいるわけです。存在するものだけでも予めリストになっていたら、どれだけラクなことか…。

そんなこんなの思惑もあって「こういうソフトがあれば少しはラクチンなんじゃないかなぁ」と未練タラタラで、ブースのヒトに根堀り葉掘り…。

でもよく考えると社内で既に導入済みLanScopeでもこのテの情報をとっているハズだよなー…。以前、工場で、未登録のUSBをマシンに刺したら、管理者がとんできたことがあったし。ということは、情報システムのヒトがウチの部に情報くれてないだけ or ウチの部の上司がそういうことを考えもつかずにスルーしているだけなのかも(でも情報システムのヒトにはLanScope情報から、ぜひとも棚卸リストに情報を反映させるところを作ってほしいわー…)。

ちなみにMacはこのテのソフトは対応していないものが多いみたいですね。「Macは仕様をなかなか公開したがらないから開発しづらいんですよ」みたいなコトを言ってました(ホント?)。

MacからLinuxまで、ぜーんぶまとめて一括管理できたら、ベンリなんですけどねー。

WAF

って、今日まで知りませんでした。そういうジャンルがあるんですね。(;´Д`)

ざっくりとしたプレゼンを聞いて、「機械的なSQLインジェクション攻撃とかにはある程度はこのテのソフトで対応する、というのは可能だろうしアリかもねー」とは思いました(やばそうな既存案件とか。いまさら改修もおっつなさそうな案件とかで)。

ちょっと興味がわいて、他にも類似ソフトがあるかと思って探してみたわけですが、最初の1社以外のものは見つけられませんでした。情報セキュリティの展示会なのに!…このジャンル、流行っているんですか?そうでもないんですか?そもそもまともに開発していれば、不要ですか?

トレンドマイクロ

なんの気なしに覗いて見たわけですが。プレゼンしていたヒト、玉木宏に似ていませんでしたか?!

完全別行動だったものの、同期も会場にいることは知っていたので、「ちょっと似ているんだけど!」とメールしたら、「見たいー!でもセミナー尽くしで抜け出せない」と返信がきました。わはは、みたいよね、やっぱり。

ちなみに肝心のプレゼン内容は、クラウド、クラウド言っていましたが、SaaSタイプのセキュリティソフトってところでしょうかね。パターンファイルとかで対応するアンチウイルスソフトだと、パターンが増えるにつれ、日々、負担も増えるし。SaaSとセキュリティソフトは相性がいいかもね。…ま、ネットがつなげないときは動かない、ってコトですが。ネットでつなげないとなると、メディア経由でのセキュリティに限定されてくるわけですからね。

yarai

パターンファイルに縛らないソフトはこれだ!

昨日、こんな記事を読んだばかりだったので、チラッと野次馬。…地味なブースでした(余計なお世話)。

▲ウイルスバスターだともう少し安く、しかも1ライセンスで3台に入れられるんだよなー…。

カスペルスキー

「おぉぉ、なんだかパッケージで見たコトあるカオだ!」と思ったら、ユージン・カスペルスキー氏が来日して講演していた!──というわけで、早速、潜り込み(ミーハーだから)。

ウイルスバスターから他のソフトに乗り換えようかなぁと、思っているわけですが。カスペルスキーもいいなぁ。…高いけど。

IPA

ついつい情報セキュリティEXPOに長居してしまいましたが、同時開催のソフトウェア開発環境展の方ものぞいてきました。しかしIPAがザクザク、ブース内でセミナーをやっているのが目に付いて、そこで足止め。IPA監修の「データ白書」ももらってきました。

「データ白書」の収集データは国内20社から収集したプロジェクト・データの実績。プロジェクトの特性(開発種別、業種、業務、アーキテクチャ、主言語など)、システム規模、工期、工数などの分布図なんかが載っています。グラフや散布図を眺めているだけでも、意外と面白いです。まー個人的にそんなに興味があるジャンルってわけではないんですが、否が応でもかかわってくる話ですし、「体感」としても理解できますからね。

「データ白書」をソフト化したものが「プロジェクト診断診断ツール」ってことになるようです(登録して、自分のプロジェクト実績を入れると、20社のデータをベンチマークに評価してくれるらしい)。

ちなみに、本日最後にゲットしたこの「データ白書」が結構重くて、色んなものを捨ててきました…。( ‥)

2009/05/14

Function対決-VBA編

うーん、これも道理といば道理。さらに言えばC#を書きはじめるまで、ファンクションの返り値にこういう条件式をつっこむ、という書き方はしなかったんですけれど(なぜならVBで書くと、なんでも「=」で不気味だから)。

わざわざif文で評価してから返すよりも、ダイレクトに評価してしまった方が、当然処理は速いですものネ。…ま、Functionの中身はかなり短いロジックにならざるをえませんので需要があるかどうかはビミョーですが。とりあえず、速度対決。

(1)

Private Function IsTestTrue01(ByVal a As Long) As Boolean
If (a Mod 2 = 0) Then
    IsTestTrue01 = True
Else
    IsTestTrue01 = False
End If
End Function

(2)

Private Function IsTestTrue02(ByVal a As Long) As Boolean
IsTestTrue02 = (a Mod 2 = 0)
End Function

結果

(1):1756 ミリ秒

(2):1588 ミリ秒

※Access2003で実験

サンプルソース

フォームにtxtDATAという名前のテキストボックスを作って、そこにタイムを表示する。clsTimerMMクラスは「時間経過計測クラス‐VBA編」参照。

Dim clsTimerMM As clsTimerMM
Dim i As Long
Dim lngMax As Long
Dim strMsg As String

Set clsTimerMM = New clsTimerMM
lngMax = 10000000

'************************
clsTimerMM.SetStartDate
For i = 0 To lngMax
    Call IsTestTrue01(i)
Next
strMsg = "(1):" & clsTimerMM.ElapsedTime & vbCrLf
'************************
clsTimerMM.SetStartDate
For i = 0 To lngMax
    Call IsTestTrue02(i)
Next
strMsg = strMsg & "(2):" & clsTimerMM.ElapsedTime & vbCrLf

'************************
Me.txtDATA.Value = strMsg
Set clsTimerMM = Nothing

2009/05/12

And と Ifのネスト対決-VBA編

これはまぁ意外性はないんですけど、とりあえず測定だけはしておこうかと。

.Netだったら。VBではAndAlso、C#では&&とかが使えるんですけど、VBAでは使えませんものね。

というわけで、またの名を、And v.s AndAlso ってコトですかね?!これをVBAではAnd とIfのネスト構造で再現して対決します。

(1)If IsCheck(i) And IsCheck(i + 1) Then

(2)If IsCheck(i) Then if IsCheck(i + 1) Then

結果

(1):3436 ミリ秒
(2):2563 ミリ秒

※Access2003で実験

サンプルソース

フォームにtxtDATAという名前のテキストボックスを作って、そこにタイムを表示する。clsTimerMMクラスは「時間経過計測クラス‐VBA編」参照。

Dim ClsTimerMM As ClsTimerMM
Dim strTextMsg As String
'************************
Dim lngMax As Long
Dim i As Long
'************************
Set ClsTimerMM = New ClsTimerMM
lngMax = 10000000

'************************
ClsTimerMM.SetStartDate
For i = 0 To lngMax
    If IsCheck(i) And IsCheck(i + 1) Then
    End If
Next
strTextMsg = Left("If IsCheck(i) And IsCheck(i + 1) Then" & String(50, " "), 50) & ":" & ClsTimerMM.ElapsedTime & vbCrLf
'************************
ClsTimerMM.SetStartDate
For i = 0 To lngMax
    If IsCheck(i) Then
        If IsCheck(i + 1) Then
        End If
    End If
Next
strTextMsg = strTextMsg & Left("If IsCheck(i) Then If IsCheck(i + 1) Then" & String(50, " "), 50) & ":" & ClsTimerMM.ElapsedTime & vbCrLf
'************************

Me.txtDATA.Value = strTextMsg
Set ClsTimerMM = Nothing
Private Function IsCheck(ByVal intChk As Long) As Boolean
 IsCheck = (intChk Mod 2 = 0)
End Function

2009/05/11

空文字チェック対決-VBA編

VBAで空文字("")をチェックするときの速度1千万回対決。とりあえず、Nullは空文字ではないので除外。

結果

strData = "あいうえおかきくけこさしすせそ"
If strData = "" Then          :517 ミリ秒
If Len(strData) = 0 Then      :230 ミリ秒
If LenB(strData) = 0 Then     :234 ミリ秒

strData = "0123456789abcdefg"
If strData = "" Then          :516 ミリ秒
If Len(strData) = 0 Then      :270 ミリ秒
If LenB(strData) = 0 Then     :234 ミリ秒

※LenとLenBの速度差は、なんだか色々フクザツです。

strDataに「あいうえお」等が入っていると、Len/LenBの速度差の順位は、状況によってはひっくりかえったりしてマチマチ。「0123abcd」などの文字列のときは、何度やってもにLenBが早くなります。何故かはいまのところ不明。

サンプルソース

フォームにtxtDATAという名前のテキストボックスを作って、そこにタイムを表示する。clsTimerMMクラスは「時間経過計測クラス‐VBA編」参照。

Dim ClsTimerMM As ClsTimerMM
Dim strTextMsg As String
'************************
Dim strData As String
Dim strGet As String
Dim lngMax As Long
Dim i As Long
'************************
Set ClsTimerMM = New ClsTimerMM
strData = "あいうえおかきくけこさしすせそ"
'strData = "0123456789abcdefg"
strTextMsg = "strData:" & strData & vbCrLf
lngMax = 10000000
'************************
ClsTimerMM.SetStartDate
For i = 0 To lngMax
    If strData = "" Then
    End If
Next
strTextMsg = Left("If strData = """" Then" & String(30, " "), 30) & ":" & ClsTimerMM.ElapsedTime & vbCrLf
'************************
ClsTimerMM.SetStartDate
For i = 0 To lngMax
    If Len(strData) = 0 Then
    End If
Next
strTextMsg = strTextMsg & Left("If Len(strData) = 0 Then" & String(30, " "), 30) & ":" & ClsTimerMM.ElapsedTime & vbCrLf
'************************
ClsTimerMM.SetStartDate
For i = 0 To lngMax
    If LenB(strData) = 0 Then
    End If
Next
strTextMsg = strTextMsg & Left("If LenB(strData) = 0 Then" & String(30, " "), 30) & ":" & ClsTimerMM.ElapsedTime & vbCrLf
'************************
Me.txtDATA.Value = strTextMsg
Set ClsTimerMM = Nothing

$マークつきの関数について-MidとMid$関数対決

今回、PDFCreatorのソースをみていて気になったのがやたらと出てくる$マーク。UCase$とかOct$とかChr$とかMid$とかがものすごーく気になっていたわけですよ。ググってもひっかかりにくいし、VB6.0のヘルプは手元にないし、でもどうやらフツーに$記号ナシのUcaseやらMidと同じ動作をする。

悶々と々としていたのですが、ちょっと別のコトを調べていたら、スゴい記述をみつけてしまいました。英文サイトのFaster Visual Basic Programs。

マジでー?!

$マークつけた方が、処理早いの??? Σ(゚Д゚;≡;゚д゚)

Midの返り値はvariantなのに対して、Mid$の返り値はString型だから、という理由にはナットクしたものの、Mid$なんて隠し玉の存在を知りませんでした。$で文字列を返すというのは、Basicの名残っぽいですよね。

「….Netでも実験してみよー!」と一瞬、思ったものの、.Netに移行してから、Mid関数とかあんまり使わないかなぁ。(´・ω・`)

私の今の行動範囲で現実的にこの知識を生かせるのってむしろVBA?──というわけでAccess2003で実験してみました。


まずはMidとMid$対決の一千万回対決。

MID$の方がちょっと速いですね。

結果

MID :3277 ミリ秒

MID$:3011 ミリ秒

サンプルソース

フォームにtxtDATAという名前のテキストボックスを作って、そこにタイムを表示する。clsTimerMMクラスは「時間経過計測クラス‐VBA編」参照。

Dim ClsTimerMM As ClsTimerMM
Dim strTextMsg As String
'************************
Dim strData As String
Dim strGet As String
Dim lngMax As Long
Dim i As Long
'************************
Set ClsTimerMM = New ClsTimerMM
strData = "あいうえおかきくけこさしすせそ"
lngMax = 10000000
'************************
ClsTimerMM.SetStartDate
For i = 0 To lngMax
    strGet = Mid(strData, "5", 1)
Next
strTextMsg = "MID :" & ClsTimerMM.ElapsedTime & vbCrLf
'************************
ClsTimerMM.SetStartDate
For i = 0 To lngMax
    strGet = Mid$(strData, "5", 1)
Next
strTextMsg = strTextMsg & "MID$:" & ClsTimerMM.ElapsedTime & vbCrLf
'************************

Me.txtDATA.Value = strTextMsg
Set ClsTimerMM = Nothing

参考

同類な関数

Chr ChrB CurDir Dir Format Hex Input InputB LCase Left LeftB Mid MidB Oct Right RightB RTrim Space Str String Trim UCase

時間経過計測クラス‐VBA編

いろいろAccessで測定してみたくなったので、まずは測定クラスの作成。

VBA単独はではミリ秒を測れないようなので、API関数を利用。

ClsTimerMM

Option Compare Database
Option Explicit

'============================
' ミリ秒 で経過時間を計測
'============================

Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Public StartTime As Variant

Public Sub SetStartDate()
StartTime = timeGetTime()
End Sub
Public Function ElapsedTime() As String
ElapsedTime = (timeGetTime() - StartTime) & " ミリ秒"
End Function

そしてオマケで、hh時間nn分ss秒での計測バージョン。

ClsTimer

Option Compare Database
Option Explicit
'============================
' hh時間nn分ss秒 で経過時間を計測
'============================

Private StartDate As Variant
Public Sub SetStartDate()
StartDate = Now
End Sub
Public Function ElapsedTime() As String
ElapsedTime = Format(Now - StartDate, "hh時間nn分ss秒")
End Function