DoYouFeed.comというサービスを使って本サイトもiPhoneデザインに"なんとなく"対応してみましたよ。
DoYouFeed.comはFeedを流すだけで、iPhone向けレイアウトを吐いてくれるというサービス。
まぁGoogleからの検索でダイレクトに各記事に飛ぼうとして、iPhoneを選んでしまうと(分岐)、トップページに飛ばされてしまうので。一長一短な感じですけどね。
DoYouFeed.comというサービスを使って本サイトもiPhoneデザインに"なんとなく"対応してみましたよ。
DoYouFeed.comはFeedを流すだけで、iPhone向けレイアウトを吐いてくれるというサービス。
まぁGoogleからの検索でダイレクトに各記事に飛ぼうとして、iPhoneを選んでしまうと(分岐)、トップページに飛ばされてしまうので。一長一短な感じですけどね。
ブラックフライデーでPocket InformantのiPhoneアプリがセール(800円)になっていたので、早速購入しました(ver1.11.08)。細かい設定は他のサイトを参考にしていただくとして、他サイトで結構、欠落していたのアラーム情報の実験結果をまとめてみたいと思います。
iPhoneのOSでは現状、サードパーティのデベロッパーにカレンダやアラームシステムにアクセスを許していません。
ですからサードパーティ製品でアラーム機能を利用する場合には、Push Alarms機能を使う必要があります。つまりiPhoneの対応が変わらない限り、一律、サードパーティ製品ではネットワーク接続なしでは、アラーム機能は使えません。
ネットワーク接続なしで、アラームを使うということを念頭に実験してみたところ、下記のような結果になりました。
…私の場合、平日日中はネットワーク接続に恵まれないので、ホントにiPhoneで通知が必要なイベント事項は標準カレンダでイベント登録して通知を設定するのが実は一番手っ取り早そう──という、「なんだかなー」という結果に(iPhoneがカレンダー/アラーム機能との連携を許さん!と云っているわけですから、しょーがないけど。どのアプリを使っても、結局この壁にぶつかるわけで…)。
ネットワーク接続可能の環境下でアラーム機能を使う場合には、選択肢も広がるんですけどね。
Pocket Informant/標準カレンダでいちいちシンクしなくてもカレンダに関しては、メール/モバイルで通知はくるわけですから。
ToDoのに関して言えば、Push Alarms機能でアラームがくるわけですし。
ちなみにPocket InformantのPush Alarms機能を利用するには、[設定]-[通知]で[サウンド]/[警告]をオンにする必要があります(Push Alarms機能はネットワーク機能ですから、タスクを登録した後はシンクしてください)。でもネットワーク接続出来ない環境では当然通知はきませんのでご注意。
Pocket Informantの公式サイト:http://www.pocketinformant.com/index.php
公式サイトにはPDFでマニュアルもあるので、なんだかんだいってこれを見るのが早いかも…。
googleのおすすめカレンダーにある「日本の祝日」をiPhoneの標準カレンダにCalDavで同期するときの設定って
https://www.google.com/calendar/dav/ja.japanese%23holiday%40group.v.calendar.google.com/user
だったのですね。
カレンダID「ja.japanese#holiday@group.v.calendar.google.com」でそのまま試みてエラーだったので、これまで諦めて別のカレンダーを当てていましたよ。あーすっきりしたぁ。
ニュース等でのTwitterの速報性の記述はみていたものの、早速目の当たりにしました。Twitterすごーい。
流行トピックがどーしても気になって仕方のない私ですが、今日の前半はT-Mobileネタで盛り上がっていましたよね。USでダウンしたようでKill!とかFuck!とかhate!とかみなさん罵ってて、感情の発露を楽しんでいました。で、ちらちらとその間にも#IranElectionのハッシュダグは気にはなっていたんですが。#IranElection関連はすごい勢いで伸びてましたね。流行のトピックにずらずらっと並んでいた#13abanとか#Tehranとかは全部一緒のネタ。テヘランでの政府公認の反米デモと、非公認の反政府デモの話で、どんどんツイートが更新されていくわけですよ。その中のひとつのつぶやきにguardianのコトが書いてあったので、Guardianへとんだら実況報告・まとめページがありました。わー、ニュースソースはTwitterとかだよ。もはやそんな時代なんだ…。渦の中からのレポとはいえ、Trending topicsとかで引けるし、こりゃすごいなぁと。いまさらですけど体感しましたね。
これまであまり食指が伸びなくてひたすらスルーしてきましたが。先日、やっとTwitterのアカウントをとりました。
iPhoneユーザーになって、やたらとTwitter絡みのアプリも見かけますしね。さすがに無視できなくなってきた、というところ。
で、始めてみたら。これは結構、面白いですね。体験しないとやっぱりこの面白さはわからないですね。
つぶやくつぶやかないはともかく、短縮URLだとかのロジックなんかにもつい思いを馳せて、ワクワクしたし。
流行トピックだとかも。検索結果でつぶやきがわーーッと更新されていくのをみていとリアルタイムで「うわー動いている動いている!更新されてくー」という胎動も感じられて。これが結構楽しい。
140字だと英語のつぶやきも気楽に読めて、流行トピックのつぶやきなんかはテーマが絞られているので読みやすいし、見ているだけでも結構楽しいです。
というわけで、右側にオレンジの鳥マークってわけです。
iPhoneユーザ-なったので、近頃GoogleReaderをごそごそと。iPhoneのRSS系のアプリにはGoogleReaderと連携するツールが結構あるんですよね。iPhoneアプリについて色々みてまわると、GoogleReaderへの言及も多いので、ふーんと、好奇心。
これまではRSSは、Operaでシンプルにローカル管理(RSSがないサイトは「はてなアンテナ」に登録、という使い分けでやっていました。しかしこれだと当然、マシンが変わると共有できませんからね。
イマイチ、使いづらいなぁと思って、遠ざかっていたReaderの研究です。レイアウトは相変わらずあまり好きになれませんが、機能は結構スゴイような気がしますね。
しかし機能がありすぎてイマイチわからないことも。コメントとメモ機能の違いってナニ?コメントは公開サイトには表示されないようですが、じゃぁどういうときに活用するのか?というとよくわかりませんな。ま、使っていくうちにそのうちわかるでしょ???
とりあえず、メモ共有等は面白そうなので、自分の共有アイテムをlogbookからもリンクすることにしました(画面右下のウィジェットより)。
で、現状私のRSS環境はどうなってしまったかというと、今後もOperaはOperaで使ってゆくだろうし(読みやすいから)、はてなははてなでRSS未対応のサイトに対して使ってゆくだろうし(はてなのフィードをGのリーダーに突っ込んだので、はてなアンテナまでダイレクトに見に行く必要はないかな?)。Googleリーダーは主にiPhoneでのヴューアー、及び、メモ機能の為に利用することになるような…?
アンテナくらいひとつにしたいような気もしますが、それぞれ使いやすさもあり、ひとつにできないこのもどかしさ…。(-_-;)
▲iPhoneでのメーラー設定画面の一幕。「アカウントの追加」する際、gmailもこんな感じで、選択しやすい画面なのですヨ。
ソフトバンクの友達にiPhoneからgmailでメールを送ったら、フツーに迷惑メールにされました。
ソフトバンク同士なのにー。
どーゆーこと? ヽ(`Д´)ノ
docomoの友達からメールがきたと思ったら、やたらとハートだのクジラだのの絵文字。
…クジラ?
こんなにファンシーなメールを書くコだったっけ?
と思っていたら。
docomo→iPhoneの絵文字では、だいぶテキトーに変換されているようでした。
PCのwebブラウザでgmailを見たら、そこには笑顔、汗つき笑顔の絵文字(gmailは一応絵文字対応ですから)。
クジラよりも断然、文脈に合っている絵文字。…全然違うじゃん!!
ちなみに「iPhoneでも絵文字を使えるようになった」というハナシでしたが、iPhone: 絵文字キーボードの使用についてを読むと絵文字を送信できるのは、SoftBank のメールアカウントおよび SoftBank SIM を使っている、OS バージョン2.2 の iPhone のみ
とありますので、現状メアドでは「i.softbank.jp」アドレス以外は絵文字はうてないようですね(SMSとかならうてますけど)。
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で使っているので、私本人としては転送設定していないつもり。なのになんで転送しようとしちゃうのかな。私がフィルターの設定を間違えているっぽな…)。しばらく様子をみてみましょう。
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の国際化)よりも、面白かったりして。まぁ後半の若手二人の方が、プレゼン自体は上手だったけどネ!
今年の4月に、家のルータを新調・いじり倒したことも、iPhone購入の要因として大きいですね。2年契約の縛りが切れるのを待って、auからのりかえ。
iPhoneもラク~に家の無線に接続できたので、家ではつなぎ放題、ということに!!
iPhoneといえば、ケータイと比較されてなんのかんのと云われているメールの設定ですが。
私はもともとGmail主体の人間だったので、とりあえずこんな具合で設定。
もともと、前のキャリアのauでも件名着信で、本文は読むときに受信していたので、この設定だと違和感が限りなくゼロに近いですね。
ちなみにi.softbank.jpのアカウントは設定していません(というか色々やったものの、削除してみた)。
アカウントを設定する必要があるのかと思いましたが、設定しなくても、着信はくるようですね。
i.softbank.jpにはメールが溜まることにはなりますが、どーせ30日間保存なので、着信専用でまぁいいや、と割り切りました。
i.softbank.jp のアカウントを設定すると、メールのアイコンのヨコに未読件数がgmailの分とi.softbankの分が倍増して表示されるわけですが、i.softbankのアカウントを削除すると、gmailでの未読の件数のみが表示されてスッキリするわけですね。
バージョンアップしたら大変なコトになりました。AppleStoreが文字化けしまくりで、PCからは使い物になりません。iPhoneからアプリを落とせばいいとも思いましたが、やはり気になる…、というコトでググってみると。XPでJIS2004 対応 MS ゴシック & MS 明朝フォントパッケージをあてていると、文字化けするんですって。JIS2004…。あぁいれちまったさ!!
家ではこだわっていませんので、あっさりアンインストール作業を行いました。
手順等詳しくはこちらを参照しました。
こんにちは、今年の夏休みをスウェーデンで過ごして、モバイルに目覚めてしまったじょにですよ(?)。
これまで「モバイルなんてしないもんね」と割り切っていてケータイも使いこなしていなかったわりに、ここへきてあっさりiPhoneに乗換え──変わり身の早さに、周囲は呆れ気味。
でも!!だってねぇ?!北欧ときたらモバイル先進国ですからね。
これまで私が旅してきた国々では(トルコ、エジプト、コスタリカ、キューバetc…)、ネットカフェにはでーん!!とPCがあったのに。
北欧ときたら提供されているのは無線LANポイントだけで、実機がある場所が殆どないんですよ。非モバイラーの旅行者としてはメールチェックすらなかなかままならない事態に。しかし現地の人々を観察すれば、それぞれネットブックだのモバイルを持っていて困ってない模様。
「去年のキューバはディスプレイもCRTというレトロな世界でネット・カフェ自体殆どなかったけど、今年の旅は先進国だし…」と思って軽くみていた私が甘かった!!
今度は先進すぎて、いわゆる私が求めている「ネット・カフェ」が、ストックホルムでは存在しなかったのです。
マシンがあっても、管理人不在向けのハードからして特殊仕様・先進的すぎ(自販機でID/パスワードを発行 or クレジットカードで接続…とかそんなノリ)。
トルコやコスタリカのはカフェならば、大抵ネット・カフェには管理人がいて、A~Cのマシンは日本語入れて、B~Dのマシンは中国語担当して…とマシンごとに言語を割り振っていて、日本語使いたい旨を告げるとマシンを、どのマシンを使えと割り当ててくれたわけですよ。やっかいな外国語の旅行者にとっては、とてもフレンドリーな環境で。XPの言語環境はベンリになったもんだなーと思っていたわけです。
ところが北欧のネット・カフェは無人!XPも特殊カスタマイズ!ハードもいわゆるPCと違うネット・カフェ専用機!見るからにゼッタイ、日本語ムリ!メールなんて殆ど日本語ばっかりだから、殆ど文字化け!!
年々、国際空港ではLANのポイントのまわりにバッグパッカーだのが座り込んで自分のマシンを繋いでネットやっている姿をみかけることが増えたなー、そろそろ私もなんらかのモバイルをもつべき?──とはぼんやり去年あたりから考えてはいましたが。モバイル先進国へ行って、カルチャーショック。一気にギアが入りました。
auの2年契約がこの9月で切れるのを待って乗り換えと相成りました。…これってストックホルム症候群(違)?
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は全滅ってわけですか…。修正プログラムも出ているっぽいけど。こんなのイチイチ、マシンに入れて歩いてられないよなぁ(運用前後はバタバタしているから入れ忘れそう)。印刷レベルでは全角マイナスで頑張るしかないか。
「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関数で小数点以下を無視している)、除数で掛け算して、割る数から引けば、そりゃ余り。
いろいろありましたが、まとめ、いきましょう。とりあえずPDFCreatorのverは0.9.8になります。
コンパイル環境のない方の為に、やすさんからいただいたバイナリとソースをUPしておきますね。やすさん、ありがとう!
当バイナリは、W2K(SP4)/XP(SP3)での動作が確認されています。
Vista(32bit SP2)環境では、"VB6JP.DLL"をインストールする必要があるようです(これはVisual Basic 6.0 SP6あたりのランタイムを入れれば入ると思われ…)。
以下は上記ソースにいたるまでの解説・経緯のまとめになります。本家でバージョンアップがされたときのために…。
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に変換する、という流れ。
引数で受け取る値を見ても、一見「!?」という感じですし、暗号でも見ている気分でしたよ。やすさんスゴイ!!ヽ(´ー`)ノ
やすさんの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進数を文字に置換しているのはわかっていても、「何故変換するのか。なにが入ってきて、どう変換すべきなのか」というそもそもの役割とかが見えきていないッス・泣)。
今回は「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
情報セキュリティEXPO行ってきましたー。行った方も多いんじゃないでしょうかね。…かくいう私の親友も、すれ違いで昨日、出展者側で受付壌とかやっていた気配があったりするわけですが(笑)。
展示会をのぞくのは1年ぶり?くらいで、楽しかったです。以下ざっくりレポ。
情報漏えい対策ツール、色々なソフトが出回っていますけど。今や資産管理とかと連動しているんですね!──というのが、ちょっとしたオドロキでした。道理といえば道理ですけど、アタマいー。
棚卸作業はいまやUSBメモリまで!という感じで、USBメモリからの情報漏えいも多いわけだからそりゃそーだよね、と思いつつ、「ほへー!」という感じでした。
ちなみに情報システム部でもない私が、何故棚卸ジャンルを気にするかというと、部内のマシン各種・ライセンス管理を不本意ながらこの数年やっているからです。これが大変面倒くさい!(てゆーか、持ち回りにして!大変さや仕組みがわかれば、不届きモノも減るだろうから)
毎回、大捜索をしたり(勝手に返すな)、発見したりしながら(ちゃんと管理人に言ってよ!)、ヘトヘトの思いで足で稼いでいるわけです。存在するものだけでも予めリストになっていたら、どれだけラクなことか…。
そんなこんなの思惑もあって「こういうソフトがあれば少しはラクチンなんじゃないかなぁ」と未練タラタラで、ブースのヒトに根堀り葉掘り…。
でもよく考えると社内で既に導入済みLanScopeでもこのテの情報をとっているハズだよなー…。以前、工場で、未登録のUSBをマシンに刺したら、管理者がとんできたことがあったし。ということは、情報システムのヒトがウチの部に情報くれてないだけ or ウチの部の上司がそういうことを考えもつかずにスルーしているだけなのかも(でも情報システムのヒトにはLanScope情報から、ぜひとも棚卸リストに情報を反映させるところを作ってほしいわー…)。
ちなみにMacはこのテのソフトは対応していないものが多いみたいですね。「Macは仕様をなかなか公開したがらないから開発しづらいんですよ」みたいなコトを言ってました(ホント?)。
MacからLinuxまで、ぜーんぶまとめて一括管理できたら、ベンリなんですけどねー。
って、今日まで知りませんでした。そういうジャンルがあるんですね。(;´Д`)
ざっくりとしたプレゼンを聞いて、「機械的なSQLインジェクション攻撃とかにはある程度はこのテのソフトで対応する、というのは可能だろうしアリかもねー」とは思いました(やばそうな既存案件とか。いまさら改修もおっつなさそうな案件とかで)。
ちょっと興味がわいて、他にも類似ソフトがあるかと思って探してみたわけですが、最初の1社以外のものは見つけられませんでした。情報セキュリティの展示会なのに!…このジャンル、流行っているんですか?そうでもないんですか?そもそもまともに開発していれば、不要ですか?
なんの気なしに覗いて見たわけですが。プレゼンしていたヒト、玉木宏に似ていませんでしたか?!
完全別行動だったものの、同期も会場にいることは知っていたので、「ちょっと似ているんだけど!」とメールしたら、「見たいー!でもセミナー尽くしで抜け出せない」と返信がきました。わはは、みたいよね、やっぱり。
ちなみに肝心のプレゼン内容は、クラウド、クラウド言っていましたが、SaaSタイプのセキュリティソフトってところでしょうかね。パターンファイルとかで対応するアンチウイルスソフトだと、パターンが増えるにつれ、日々、負担も増えるし。SaaSとセキュリティソフトは相性がいいかもね。…ま、ネットがつなげないときは動かない、ってコトですが。ネットでつなげないとなると、メディア経由でのセキュリティに限定されてくるわけですからね。
パターンファイルに縛らないソフトはこれだ!
昨日、こんな記事を読んだばかりだったので、チラッと野次馬。…地味なブースでした(余計なお世話)。
▲ウイルスバスターだともう少し安く、しかも1ライセンスで3台に入れられるんだよなー…。
「おぉぉ、なんだかパッケージで見たコトあるカオだ!」と思ったら、ユージン・カスペルスキー氏が来日して講演していた!──というわけで、早速、潜り込み(ミーハーだから)。
ウイルスバスターから他のソフトに乗り換えようかなぁと、思っているわけですが。カスペルスキーもいいなぁ。…高いけど。
ついつい情報セキュリティEXPOに長居してしまいましたが、同時開催のソフトウェア開発環境展の方ものぞいてきました。しかしIPAがザクザク、ブース内でセミナーをやっているのが目に付いて、そこで足止め。IPA監修の「データ白書」ももらってきました。
「データ白書」の収集データは国内20社から収集したプロジェクト・データの実績。プロジェクトの特性(開発種別、業種、業務、アーキテクチャ、主言語など)、システム規模、工期、工数などの分布図なんかが載っています。グラフや散布図を眺めているだけでも、意外と面白いです。まー個人的にそんなに興味があるジャンルってわけではないんですが、否が応でもかかわってくる話ですし、「体感」としても理解できますからね。
「データ白書」をソフト化したものが「プロジェクト診断診断ツール」ってことになるようです(登録して、自分のプロジェクト実績を入れると、20社のデータをベンチマークに評価してくれるらしい)。
ちなみに、本日最後にゲットしたこの「データ白書」が結構重くて、色んなものを捨ててきました…。( ‥)
うーん、これも道理といば道理。さらに言えば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
これはまぁ意外性はないんですけど、とりあえず測定だけはしておこうかと。
.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
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
今回、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
いろいろAccessで測定してみたくなったので、まずは測定クラスの作成。
VBA単独はではミリ秒を測れないようなので、API関数を利用。
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秒での計測バージョン。
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
「PDFCreatorの文字化け問題-修正箇所発見」のやすさんのコメント欄からの記事になります。
PDFCreatorは家使いなのでそこまで使いきっている感じでもなく、これまで私は素通りしていましたが。PDFCreatorは印刷時のPDF情報を設定する際、日本語が混じっているとその部分はスルーする、という現象があるのですね。日本語を入れるとはじかれる、無視される…。
私の場合、家にはVB6.0環境がないので、とりあえず、やすさんのコメント欄とソースコードを頼りにロジックのみ考えてみました。
ちなみに問題のモジュールを含む本家オリジナルのソースはこちら。
やすさんの修正案のコードの全貌。
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 50011 Dim bStr() As Byte 50020 tStr = "" 50030 ' First we look for oct encoding chars 50040 For i = 127 To 255 50050 Str1 = Replace$(Str1, "\" & Oct$(i), Chr$(i)) 50060 Next i 50070 ReplaceEncodingChars = Str1 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 50111 ReDim bStr((Len(Str1) - 2) / 2) 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 '50170 tStr = tStr & Chr$(CByte("&H" & Mid$(Str1, i, 2))) 50170 bStr((i - 2) / 2) = CByte("&H" & Mid$(Str1, i, 2)) 50180 End If 50190 Else 50200 Exit Function 50210 End If 50220 Next i 50221 tStr = StrConv(bStr, vbUnicode) 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: '---ErrPtnr-OnError-END--- DO NOT MODIFY ! --- End Function
ReplaceEncodingCharsの役割としては、
という関数なわけですね?(コードから推測…)
だとすると、やすさんの修正案通り、バイトの配列を一端作る流れが妥当だと私も思います。
いまのところ、敢えて修正案を出すなら
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
あたりの分岐はコメントアウトしちゃっていいんじゃないの?と思ったくらいでしょうか。「なんかもー、どうせバイト変換できないときに抜けちゃうなら、エラー処理でいいんじゃないの?」と思うので…。
それにしてもオリジナルのコードは明らかにおかしいですよね。2桁ずつゲットして文字変換されても、マルチバイトな言語では明らかに困るだろう。(;´Д`)
やすさんの修正案のコードの全貌。
Public Function EncodeChars(ByVal CodePage As eCodePage, ByVal Str1 As String) As String ' UTF-16, UTF-8 conversion '---ErrPtnr-OnError-START--- DO NOT MODIFY ! --- On Error GoTo ErrPtnr_OnError '---ErrPtnr-OnError-END--- DO NOT MODIFY ! --- 50010 Dim i As Long, tStr As String, Size As Long, buffer() As Byte, c As Long, tL As Long 50020 50030 If LenB(Str1) = 0 Then 50040 Exit Function 50050 End If 50061 Select Case CodePage Case eCodePage.CP_NoEncoding 50080 EncodeChars = "(" & Str1 & ")" 50090 Case eCodePage.CP_UTF8 50100 For i = 1 To Len(Str1) 50110 c = AscW(Mid$(Str1, i, 1)) 50121 Select Case c Case 0 To &H7F& 50140 tStr = tStr & String(2 - Len(Hex(c)), "0") & Hex(c) 50150 Case &H80& To &H7FF& 50160 tL = &HC0& Or ((c And &H3FC0&) \ &H40&) 50170 tStr = tStr & String(2 - Len(Hex(tL)), "0") & Hex(tL) 50180 tL = &H80& Or (c And &H3F&) 50190 tStr = tStr & String(2 - Len(Hex(tL)), "0") & Hex(tL) 50200 Case &H800& To &HFFFF& 50210 tL = &HE0& Or ((c And &HF000&) \ &H1000&) 50220 tStr = tStr & String(2 - Len(Hex(tL)), "0") & Hex(tL) 50230 tL = &H80& Or ((c And &HFC0&) \ &H40&) 50240 tStr = tStr & String(2 - Len(Hex(tL)), "0") & Hex(tL) 50250 tL = &H80& Or (c And &H3F&) 50260 tStr = tStr & String(2 - Len(Hex(tL)), "0") & Hex(tL) 50270 End Select 50280 Next i 50290 EncodeChars = "<BFBBEF" & tStr & ">" 50540 Case eCodePage.CP_UTF16 50550 For i = 1 To Len(Str1) 50560 c = AscW(Mid$(Str1, i, 1)) '50570 tStr = tStr & String(4 - Len(Hex(c)), "0") & Hex(c) 50570 tStr = tStr & Right("0000" & Hex(c), 4) 50580 Next i 50590 EncodeChars = "<FEFF" & tStr & ">" 50600 End Select '---ErrPtnr-OnError-START--- DO NOT MODIFY ! --- Exit Function ErrPtnr_OnError: '---ErrPtnr-OnError-END--- DO NOT MODIFY ! --- End Function
引数でエンコーディング、及び文字列を渡して、引数で決めたエンコーディングの16進を返すファンクションですね(eCodePageはEnumで、CP_NoEncoding/CP_UTF8/CP_UTF16の三択です)。
AscWが負の値のとき(たとえば「髙」とか)、オリジナルのコードだとHex(c)に「FFFF9AD9」などアタマ4桁に余計なコードがついて16進数を返せなくなくなりますね。36行目を
50560 c = CLng("&H" & Hex(AscW(Mid$(Str1, i, 1))))
このように修正すれば、どうにか…、という感じですけど。
やすさんのRight関数を使っての4桁取得が妥当ですよね。エレガントだし、これはこれで完成っぽいですね。
いろいろネタ的には初めて尽くしで、すごく勉強になりました!ありがとうございます。
(1)の方は、根本的にこれ以上のロジックが私のアタマで浮かぶか怪しいですが、しばらく考えてみます。
もともとどこかでbyteの配列をゲットしているチャンスがあるんだから、そのままどーにかならなかったの?とか思わなくもありませんが。そこまで手を広げていくと、収拾つかなくなっていきそうですよね…。
いやー、それにしてもこうしてみてみると、つくづくと面白いですね!(←だんだんノってきた) +。:.゚ヽ(*´∀`)ノ゚.:。+゚
久しぶりにサンプルソースを書いていて、気になりだしたのがソースのハイライト・ツール。
これまでgoogle-code-prettifyを利用していたわけですが、VBのソースのハイライトが美しくないので以前から気になってはいたのですよ。
どれどれと思って本家をのぞいてみたら、だいぶバージョンアップされていました。「早速、使ってみよう」と思って、javascriptやcssのアップロード先として便利に使っていたGoogleのPageCreatorに行ってみたら…。
えーっ! Σ(゚Д゚;≡;゚д゚)
Google Page Creator is no longer accepting new sign-ups.
お前もか、ブルータス(←GoogleNotebook愛好家)。
PageCreatorの類似品としてgにはSiteができたもんねー。SiteはSiteで結構便利機能満載なんですが、プレーンなjavascriptとかのアップロードはできないんですねよね。…多分、コンテンツは作らないのに、データだけおいて、外から呼びだしている私みたいな輩がいるから?(´・ω・`)
というわけで現在ログインはできても、更新作業ができないPageCreator。立ち退きムード満載ですね。
他にゆくあてもないので、ソース類は諦めてガジェットに突っ込むことにしました。
そしてついでなので思い切ってSyntax Highlighterへ浮気することにしました。
なぜなら行番号を出すのも簡単で、「view plane」のモードまであって実に高機能だから。
でもちょっと、「ついで」にしては思い切りすぎだったかな。(ーoー)y~~~
言語ごとにclassをつけていくのが面倒くさかったよ。VB系にC#、ColdFusionにJavaFXにコマンド系。正直、どの言語を当てればOKなのかわからないものもちらほらあったりして、その点はprettyprintはテキトーすぎてラクチンでしたねぇ。
Syntax Highlighterを導入したら、私は今後もう使わないかも…なマクロのサンプルソース、「EmEditorのマクロ 選択範囲へ改行タグ」で、ダブルクオーテーションに囲まれた<br />がどーしても表示でず、改行されてしまった(リンク先、サンプルソースの23行目とか30行目)。
「google-code-prettifyのときはヘーキだったのにー?!!コードとしてのbrで、しかもタグは16進数も使っているのに改行されちまうのさー!?」とモヤモヤとしていたら。
本家のこの記事みてなんとなーくわかっちゃった。ウチの場合、改行キー等、全部タグは手打ち(私の場合エディタのマクロ…)なので、むしろdp.SyntaxHighlighter.BloggerMode();
の1行は不要なのですよ。なので、この一文をコメントアウト。するとどうやらうまくいったような気がします。…それとも他で影響でるかな?(ΦωΦ)
昨日に引き続き、ソースを見ていたらキャラセット問題は解決したので、「記事を書こうかなー」と思っていたところ、前回の記事のコメント欄で匿名さんからまさに同じ結論がくだされていて笑いました。本日私が修正したソースとあまりに同じ結果でしたので。…行番号まで(w)
匿名さんのおっしゃる通り、標準モジュール([Common])の[modGeneral2]-[SetFrame]を下記のように書き換えれば(13、14行目を追加すればOK。フォントサイズも変更したければ、匿名さんのコメントどおり、11行目を「50070 ctl.Font.Name = Options.ProgramFont」に変更)、日本語表示はどーにかなります。とゆーか、キャラセット問題は全面解決しそうな予感…。未確認ですが、現状だと欧文以外は多分全部文字化けしていると思うんですよね。
Public Sub SetFrame(ByRef ctl As Control, Optional TempOptionsDesign = -1) '---ErrPtnr-OnError-START--- DO NOT MODIFY ! --- On Error GoTo ErrPtnr_OnError '---ErrPtnr-OnError-END--- DO NOT MODIFY ! --- 50010 Dim tOD As Long 50020 If TempOptionsDesign > -1 Then 50030 tOD = TempOptionsDesign 50040 Else 50050 tOD = Options.OptionsDesign 50060 End If 50070 ctl.Font.Size = 10 '-----------------// 追加ここから //------------------------ 50071 ctl.Font.Name = Options.ProgramFont 50072 ctl.Font.Charset = Options.ProgramFontCharset '-----------------// ここまで //------------------------ 50080 ctl.TextShaddowColor = &HC00000 50090 If ComputerScreenResolution <= 8 Or tOD = 1 Then 50100 ctl.UseGradient = False: ctl.Caption3D = [Flat Caption] 50110 If UCase$(ctl.Name) = "DMFRADESCRIPTION" Then 50120 ctl.BarColorFrom = vbRed 50130 Else 50140 ctl.BarColorFrom = vbBlue 50150 End If 50160 Else 50170 ctl.UseGradient = True: ctl.Caption3D = [Raised Caption] 50180 If UCase$(ctl.Name) = "DMFRADESCRIPTION" Then 50190 ctl.BarColorFrom = &HB0BED '&HA0A0FF ' &HFB& 50200 ctl.BarColorTo = &H20564 '&HE0& ' &HDDFF& 50210 Else 50220 ctl.BarColorFrom = &HED0B0B '&HFFA0A0 50230 ctl.BarColorTo = &H640502 '&H600000 50240 End If 50250 End If '---ErrPtnr-OnError-START--- DO NOT MODIFY ! --- Exit Sub ErrPtnr_OnError: Select Case ErrPtnr.OnError("modGeneral2", "SetFrame") Case 0: Resume Case 1: Resume Next Case 2: Exit Sub Case 3: End End Select '---ErrPtnr-OnError-END--- DO NOT MODIFY ! --- End Sub
これをコンパイルして、exeファイルを上書きしたら、ちゃんと日本語表示されました(色々訳アリで、setup.exeを作ってないので、exeの上書き)。
SourceForge.netだとこの辺のソース。
本家で直してもらわないと、バージョンアップの度にこの作業をしなくちゃならないのでフィードバックしたいなぁ、と思っているわけですが。なにせSourceForgeみたいなものを使ったことがないので(スタンドアローン、バッチ処理、ほぼ単独での開発が身の上)、参加の仕方がわからない。(;´Д`)
Trackerの辺りで発言するのが手っ取り早そうだけれども、気後れ状態…。あーでも頑張りますー(たぶんね)。
追記→5/9、Trackerで投稿してみました。
…これからどうなるんでしょう。ヽ(。_°)ノ?
あいかわらずぼちぼちPDFCreatorの文字化け関連にまつわる記事にはアクセスいただいているようなので、久しぶりに本家をのぞいてみました。すると0.9.8まで出ているのですね。早速アップデート。
…しかしやはり日本語は化けますね。
オープンソースなので、落としてソースをみてみたところ、なんだよVB6.0じゃんか…(.NetだったらExpressで家でも開けるのに!テキストエディタで見るのはシンドイわ…)。
ちょいちょいと見た限りでは、フォームのFontプロパティの文字セットが[欧文]のままになっていて、化け化けになるように見受けられますな(※図参照)。
なんとなーくどの辺のモジュールでセットしているのかは、分かってきたけれども時間切れ。…中途半端なネタですいません。しかしこれVB6.0でいまだに開発しているのですね。それもちょっとショック(まだver0.9ですけど。ver1.0までこのまま突っ走るのでしょうかね)。C#なら張り切るのに!!
このところバイナリデータ あーんど C#いじりにハマりつつあるじょにです。
FileStreamクラスを使って、ぐるぐるバイナリ状態でファイルのI/Oをやっていて、体感として
「ファイルの読み込み・書き込みについてだけ考えたら、TextReaderクラスやTextWriterクラスよりもFileStreamを使った方が早いような気がする…」
と思ってちょっと調べてみると、StreamReader/StreamWriterクラスは、byteデータを扱うストリーム・オブジェクトクトをラップしているクラスでした。ああ、やっぱり。(;´Д`)
ということは、「FileStreamを使ってバイナリ状態のままデータを扱った方が、StreamReader/StreamWriterクラスを使うより、処理は早い(≒Text系のストリームでは、I/Oは指定した文字コードでの処理、内部処理はUnicodeのハズ。いちいち文字コードの変換をかけている分、コストがかかっているのではないか?)」──という推論の元に実験開始!
読み込み/書き出しのクラスをセットにして、それぞれ
で計測してみました。
4.のCopyメソッドについては、当然、バイナリでコピーをやっていると思うので、その際の参考値。予測としては多分一番早い。
コピー元の実験材料は郵便局の郵便番号データをちょちょいと加工して1行を1002バイト(改行キー含むバイト数)、1ファイル全体で117MBくらいになったものです。で、FileStreamのReadクラスやWriteクラスのMaxのバッファは1002にしたので、StreamReader/StreamWriterクラスとI/Oの回数は同一のハズ。メモリの空き容量で差がでてこないように、直前でGC.Colloect();いれてマス。
結果は
という具合でした。2.の11秒はさすがに1バイトずつだとI/Oが多くてあまりよい数字はでてこない、ということになりますが。でもまぁI/Oの回数が多いわりには、意外ととStreamReader/StreamWriterクラスに迫っていますよね。最も外付けHDDやネットワーク越しに作業をしたり、ファイルサイズがも巨大であればあるほど、I/Oの問題はもっと顕著になってくるわけですけれどね。
ちなみに実験ソースはこんな感じ。
実験環境はVC#2008Express版(.Net Framework3.5)。
_InFilePath/_OutFilePathは実験クラスのメンバー変数です。
//------------------------ Stopwatch sw = new Stopwatch(); sw.Reset(); sw.Start(); //------------------------ using (StreamReader _SReder = new StreamReader(_InFilePath, Encoding.GetEncoding(932))) using (StreamWriter _SWriter = new StreamWriter(_OutFilePath, true, Encoding.GetEncoding(932))) { while (_SReder.Peek() != -1) { _SWriter.WriteLine(_SReder.ReadLine()); } } //------------------------ sw.Stop(); MessageBox.Show(sw.Elapsed.ToString()); //------------------------
//------------------------ Stopwatch sw = new Stopwatch(); sw.Reset(); sw.Start(); //------------------------ using (FileStream _FReder = new FileStream(_InFilePath, FileMode.Open, FileAccess.Read)) using (FileStream _FWriter = new FileStream(_OutFilePath, FileMode.Create, FileAccess.Write)) { int _ReadByte = 0; while (_ReadByte != -1) { _ReadByte = _FReder.ReadByte(); _FWriter.WriteByte((byte)_ReadByte); } } //------------------------ sw.Stop(); MessageBox.Show(sw.Elapsed.ToString()); //------------------------
//------------------------ int _BufferSize = 1002; //------------------------ Stopwatch sw = new Stopwatch(); sw.Reset(); sw.Start(); //------------------------ using (FileStream _FReder = new FileStream(_InFilePath, FileMode.Open, FileAccess.Read)) using (FileStream _FWriter = new FileStream(_OutFilePath, FileMode.Create, FileAccess.Write)) { byte[] _ReadBuffer = new byte[_BufferSize]; int _ReadSize = _BufferSize; while (_ReadSize != 0) { _ReadSize = _FReder.Read(_ReadBuffer, 0, _BufferSize); _FWriter.Write(_ReadBuffer, 0, _ReadSize); } } //------------------------ sw.Stop(); MessageBox.Show(sw.Elapsed.ToString()); //------------------------
VBからC#へ移行しつつある今日この頃のじょにですが、先日、VBネタで気になるネタを拾いました。
なにーー? Σ(゚Д゚;≡;゚д゚)
VBなのにアンダースコアがなくなる?(そんなのVBじゃねー!)Implicit Lineだとー?それって可能?アリ?
C#等の言語では明示的に「;」で終端を表現しているからよいでしょう。
しかしVBの基本は行末=終端なのです。VBの中では「行継続」というのはある意味、イレギュラーなのです。ゆえにVBでは改行してもなお「継続」する場合には、アンダースコアの表現が不可欠──他言語からのヒトからは、アンダースコアは不評で、"面倒臭い”だの"煩雑"などと云われもしましたが、VB育ちの私にとっては自然な感覚でした(慣れればどうということもない)。
それなのに、暗黙の行継続?衝撃というか革命的というか…。成立しない構文もでてくるだろうに、そこまでコンパイラに解釈してもらうのはちょっと気色が悪いというか…。
リンク先の記事にもありますが、withの中でのピリオドとか、「どー解釈すればいいのかわからない!」とい表現もでてきちゃいますものね。かえってルールが煩雑になりはしませんか。
VBチームのオリジナルの記事、「Implicit Line Continuation in VB 10」を読むとThings are always changing.
とかいって、歴史博物館やらマシンに託けてVBのコンパイラも…、なーんておっしゃっていますけど。言語仕様には興味をそそられているところもありますよ?でも、ユーザー的心境としては、ヒトコト。──大丈夫なのか…。(-_-;)
DCP-535CNが我が家にやってきました。
"重さ8.0Kg"──となかなか重そうなので、どんなに大きいコがやってくるのだろうと多少不安に思っていたのですが、思ったよりもちんまりしたコでした。
一人で持てる程度の重さで、家庭用はこうでなくちゃ!というところですね(まぁ8kgというと10kgの米袋より軽いですからね…)。
「家庭内で共有してプリンターを使おう」というのが今回のテーマで、結局現時点のネットワーク構成としてはこんなふうになりました(図参照)。
プリンタについては「無線でつなげるようにしよう」というコトがまずアタマにありました。ちょっと調べてみると、どうやら「プリンタサーバ(14,000円くらいする)+プリンター」の構成で買うよりも、無線機能つきのプリンタを購入した方が安上がりになるので、「無線機能つきのインクジェット複合機」というテーマで物色。
家庭用なのでA4で十分──ということでキヤノンのPIXUS MP620とブラザーのDCP-535CNとの間で迷いました。価格にすると数千円の違いでしかないので、購入基準は家での使い方の想定やラニングコスト等のプライオリティの持ち方ですよね。
ざっくりスペックを対比するとこんな感じ(物量面ばかり拾っていますが、家庭用ではサイズ重要!)。ちょっと表現の仕方がメーカーによって違うのでなんですが、あしからず。
項目 | DCP-535CN | PIXUS MP620 |
---|---|---|
質量 (カートリッジ込み) | 約8.0kg | 約8.6kg |
外形寸法(mm) | 390×375×180 | 450×368×176 |
メモリ容量 | 40MB | - |
インターフェイス | 有線LAN(10/100BASE-TX) 無線LAN(IEEE802.11b/g/AOSS/WPS) Hi-Speed USB |
有線LAN(10/100BASE-TX) 無線LAN(IEEE802.11b/g) Hi-Speed USB Bluetooth v2.0 |
プリント速度 | カラー:最高27枚/分 モノクロ:最高33枚/分 | 約31秒 |
A4普通紙(カラー) インクコスト | 約7.9円/枚 | 約8.4円/枚 |
正直言って、大差はないです(だから迷う)。なので初期投資のかからないDCP-535CN。Linux系のドライバなんかもそこそこ揃っているので、ワタクシ的には合格点です。
VBOXでゲストOSの起動のタイミングで自動的にホストOSとの共有フォルダをマウントする方法です。
ちなみに私の場合、Ubuntu(ゲストOS)の[home/ユーザー名/共有フォルダ]にマウントしています。あしからず。
無線LANのセキュリティ回りの用語には混乱させられるので、サラッとまとめ。とりあえずステルス機能とかはまた別として。
もーバッファローのAOSSあたりがやっぱり一番手軽にセキュアなんだ、って思ってしまいました(勝手に一番最適な状態にしてくれる)。MACフィルタリングとかこそないけれど、親機と子機のスイッチをパパッと押さないと接続できないんだから、MACフィルタリング的な他者の"除外行為"はここでおこなっちゃっているんだものね。MACフィルタリングを変更できるLANカードがあることも考えると、むしろ、どーしても親機のスイッチを押さなきゃないAOSSとかの方がある意味、すぐれているんじゃない?とか思っちゃうし。
ホント、よくベンリに考えたもんだよね!
無線ルータの親機を新調しました!バッファロー「WZR-HP-G300NH」。これはすごいですよー。背面にUSBポートがついているから外付けHDDをNASとして使えちゃうんだもんね。マルチセキュリティにも対応しているし、結構理想の無線親機ではないですか?(※清水理史の「イニシャルB」の受け売り)。
家の中の無線子機の方は、マシンを新調したりで新しくなっていたわけですが(ドラフト11nには対応していませんが)、親機もこれでどーにか少しは追いつきました。というわけで今後プロバイダの契約もみあった速度に変更する予定デス。
数年ぶりにルータを物色して驚いたのは、まずは安くなったよね(1万円切って買ったし)ということと、なんかベンリになったよね?ということ。AOSSとか(…まー2台目以降はソフトをインストールするのも面倒くさいので設定は手動でやりましたが。puppyの設定で大変苦労したのでなんとなくコツはわかる)。マルチセキュリティとか。ESS-IDステルス機能とか(ANY接続拒否)。11nの規格にも遅ればせながら驚きましたよ。法律の改正と連動しているのね、とか。調べていて面白かった。
とうわけで、ざっくり無線LANの規格のまとめ。11nについてはまだドラフトで、ホントの11nはまだこれから──というわけで誤りがあったらご指摘ください(nはともかくドラフトの2.0とかいってもちょっとあやふやなんだよなー…)。セキュリティについてはまた今度。
"おやおや私の仕事マシンにもメイリオが入っているぞ(OSはXP)、さてはSQLServer2008Expressをいれたときのドサクサで入っちゃったんだな"──などと思い、ExcelにメイリオとMSゴシック字を並べて、見比べていたわけです。ふと思いついて
"そういえば、メイリオで字形が変わったんだっけ?"と思いいたったわけですが(メイリオというよりJIS2004ですかね)。
"Excelでメイリオを指定したファイルを、メイリオが入っていないマシンで表示するとどうなるんだろ?"と思いついて、「メイリオなんて入れてない」と主張する先輩のマシシンで、Excelファイルを開いて見ると。「フォント」のコンボックスには「メイリオ」と表示されているわりに、ゴシックな字形で。でも之繞は2点になっている。
"あれあれ。私のマシンでMSゴシックの字形では1点で表現されるのに、2点で表現される先輩のマシンってどうなっちゃってるの?"と思って調べて見ると。
どうやらJIS2004では2点で、JIS90では1点ということらしい。
では自分のMSゴシックが、JIS2004なのか、JIS90なのかをどうやって見極めればいいかというと。
「C:\WINDOWS\Fonts」に入っている「MSゴシック & ~」のプロパティでMSGOTHIC.TTならJIS90版、MSGOTH04.TTCならJIS2004版と判断すればいいようだ。
で、2点で表現する先輩のマシンは見事にMSGOTH04.TTCだったという次第。
ははーなるほど。先輩もSQLServer2008Expressを入れたので、おそらくそのときにMSゴシック&MS明朝をJIS2004にしてしまったのだな(ちなみに先輩のマシンは「プログラムの追加と削除」をみてもJIS2004対応フォント(KB927489)をインストールした形跡はないのでWinのアップデートで更新したわけではない)。
で、別のXPマシンで同じExcelファイルをひらいてみると。
メイリオを指定したセルではフォントのコンボボックスでは「メイリオ」と表示しているわりに、字形はあきらかにMSゴシックで、しかも1点なのでした。
要はExcelというのは、フォントの名前はコンボボックスに保存されたフォント名を一応表示するけれど、フォントそれ自体はデフォルト設定の文字で表現する、というだけのことだったらしい。
それにしても、持ち主の知らぬ間にJIS2004にされてしまうとは怖いことですねぇ。作業マシンで仮に宛先のラベルシールなんかを出力したら、これまで1点でおさまっていたところが、いきなり2点になってしまうということ?外字とかうるさいところだと、かなり危ないなぁ、これ。Web案件とかだとJIS90で入力したかJIS2004で入力したかなんて、チェックかけられないだろうし。全国の之繞つきのヒトの名前はどうなっちゃうんだ?(字形かわったのは之繞だけじゃないみたいだけど)
というわけで(?)、Newマシンを買ったわけです。
HPのG60 NoteBook。15.6/16インチワイド。HP Directplusから購入。スペックはざっとこんな感じ。
メモリは3GBに変更して、3年の保守引取りサービスをつけ、送料込みで84,000円也。
利用者は親。ライトユーザーなので、利用ソフトはせいぜいのところIE、Thunderbird、Skype、OpenOffice(もらったExcelとかをみるだけ)、ウイルスバスターあたり。
画面はほどほどに大きい方が使いやすいんだろうな(老眼)、ということで15.6/16ワイドをチョイス。15.6/16ワイドともなると、作業用としてもなかなか快適にイケますね。キーボードもデスクトップ並でフルサイズですし、テンキーもつきますし。2.8kgの重量でモバイルとは言い難いものの、省スペースマシンとして捉えるとよく出来ています。無線LANの状態などもLEDのランプがついていてわかりやすい。サクサク動いて快適、快適。だがしかし!私が余計なことをした為に(好奇心)、紆余曲折ありました。
なにがあってもいいように、まずリカバリDVDを作って準備(CD-Rで焼こうとしたら11枚要求され、慌ててDVD-Rを買いに行きました)。
ドキドキしながらライブCDのPuppyのGpartedを利用して、パーティションを区切ったわけです。
もともとの構成ではCドライブ、Dドライブはリカバリ用となっています。これを、Cドライブをリサイズして、CとEに分けようという目論。しかし見事に玉砕…。
GpartedでCドライブをリサイズして、EドライブをNTFSフォーマットかけてApplyまで一気にやったら、Winが起動しなくなりました。で、リカバリDVDからVistaを再インストールしたら。Eドライブがある!!リカバリのメディアから再インストールすると、単にCドライブにインストールをするだけなんだ?(リカバリCDで再インストールすると、ドライブの構成もCドライブ1コに戻るのかと思っていました)。ふーん、へー。
で、Gpartedですが。巧くCドライブを二分割できたときのことを思い起こしながら、色々失敗した原因を考えてみました。
なにしろうんともすんともいいませんでしたからねぇ。次回やるときは上記を踏まえて頑張りたいと思います(←果敢)。
Newマシンがきて、ようやっとアタイもVistaかー(ホントは親のマシンです。ま、設定だけ)、と思ったのもつかの間。
XP→VistaのThunderBirdの移行ってどうやるんだっけ?と、まごまご。結果的には実に簡単でした。
そしてThunderBirdを起動すると、じゃじゃーん!バッチリOKでした。
忘れるのでメモ。
MS-IMEでシフトJISでのコード入力したいときは、シフトJISコードを入力してから「F5」キーを押す。
IME2002スタンダードの場合。ヘルプからの抜粋。
文字コード番号の前に以下の文字を追加することによって、異なるコードで入力することができます。
文字コード番号だけを入力した場合は、シフト JIS コードでの入力になります。
あけましておめでとうございます。
本年もよろしくお願いいたします。
近頃FireFoxでネットサーフィンをしていますと、ちらほらフォントが果てしなくギザギザ・フォント、汚くなってしまったサイトに出くわします。たとえばInfoQのサイトを見てみますと、大きいフォントはそこそこ見られるフォントではあるものの、標準サイズの文字はギザギザで汚い!
このサイトはこんなフォント指定だったっけ?──としばし悩んでいたわけですが。そういえば年賀状の絵を描くときに、入れた覚えもないのに、フォント選択でしばしば[メイリオ]をみかけた覚えがあるぞ。もしかして、先日SQLServer2008Expressをインストールしたら、VS2008なども同時にインストールされ、さらに同梱のメイリオもインストールされた?──ということにに思い至りました。故に現在のワタクシめの環境は、XP×メイリオ、という状態なんですね。原因はどうやらこの組み合わせのような気がしてきました。
ゴソゴソ調べてみますと、XPのデフォルト設定では、ClearTypeの機能(MSが開発したフォントのアンチエイリアシング技術)が14ポイント以下の文字では有効になっていないらしいんですね。故に以下の手順で回避。
すると少しは表示はマシになりました。
Vistaユーザーがどれほど普及しているのかは謎ですが、XPでIE以外のユーザーには優しくないので、Webサイトでメイリオをフォント指定するのは、まだちょっと早いような気がしますね。
さらに!!メイリオには「P」とかついていないのでわかりにいくですが、欧文部はプロポーショナル、和文部は等隔なんですね。MSゴシックに格別愛着はありませんし(むしろ飽きた。印刷フォントは明朝派です)、等隔が特に美しいとも思いませんが、コーディング等では等隔でないと困りますので、エディタ等でのメイリオ利用はあり得ないですねぇ。