So-net無料ブログ作成
検索選択

メイリオが他のフォントとくらべて小さく表示される件 [ソフト開発]

左側がMS Pゴシックで、右側がメイリオ。
高さを同じ80pixcelで書いているのに、メイリオは3割型小さくなる。
メイリオサンプル

メイリオの場合、GetTextMetricsで取得できるtmInternalLeadingとtmDescentが
妙に大きいということがわかっている。
GetTextMetricsの詳細情報はこちら。
つまり上下方向の余白が広いってことだ。

上の文字描画結果を出すためのソースコードは以下の通り。(VC++)
void CTextOutTestView::OnDraw(CDC* pDC)
{
	CTextOutTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// MS Pゴシック
	CFont font1;
	font1.CreateFont(80,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,
		OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
		DEFAULT_PITCH,_T("MS Pゴシック"));
	CFont* pBack = pDC->SelectObject( &font1 );
	pDC->SetTextAlign( TA_LEFT | TA_BASELINE );
	pDC->TextOutW( 0, 100, _T("あ亜ay") );
	pDC->SelectObject( pBack );

	// メイリオ
	CFont font2;
	font2.CreateFont(80,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,
		OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
		DEFAULT_PITCH,_T("メイリオ"));
	pBack = pDC->SelectObject( &font2 );
	pDC->SetTextAlign( TA_LEFT | TA_BASELINE );
	pDC->TextOutW( 250, 100, _T("あ亜ay") );
	pDC->SelectObject( pBack );

	// ベースライン
	pDC->MoveTo( 0, 100 );
	pDC->LineTo( 500, 100 );
}

カギになるのはCreateFontらしい。
CreatePointFontを使うと、MS Pゴシックとメイリオで同じくらいの大きさになる。
また、CreateFontでも高さにマイナス値を設定しても同じくらいになる。
以下の計算をした結果をCreateFontの第1引数にセットするということ。
::MulDiv(ptsize,-GetDeviceCaps(LOGPIXELSY),72)
つまり、文字高さはピクセルじゃなくてポイントで指定しろってことか。。。

この手の問題が世のアプリで多く出ているんじゃないかと思ったが、そうでもない。
ちなみにWordやExcelでは両フォントの大きさがほぼ同じになる。
まだ研究の余地がありそうだ。

USBメモリを小容量に見せかける方法 [ソフト開発]

USBメモリの大容量化が年々加速している。
おいらが最初に買ったのが10年くらい前で、128MBで1万円くらいだったか。
今では、4GBが500円で買える時代になっている。
個人で使うには容量が多いに越したことはないが、企業ユースとなると
話しは変わってくる。
大容量USBメモリで、手軽に企業内秘密情報を社外に流出できちゃうと困るのだ。

フロッピーはその点ですぐれていた。
限られた容量でデータの持ち運びができていた。
ただ、ここ5年くらいでFDドライブ装備のPCがなくなってきたことと、
FDメディアが買いにくくなってきたことで、もう絶滅間近だろう。
1.44MBという超小容量というのも難点だった。
ではCDやDVDがいいかというと、こいつらは専用のドライブと
ライディングというやっかいな手間がかかるので、手軽さにかける。

前置きはこれくらいにして、本題に入ろう。
USBメモリを小容量に見せかける方法だ。
4GBのUSBメモリを500円で買ってきて、ある処理を施すことで、
使える容量を100MBに制限してしまう方法があるのだ。
USBメモリ内に2つのパーティションを作ると、Windowsからは1つ目の
パーティションしか認識できないという特徴を利用する。
1つ目のパーティション容量を100MBとする(FAT16)
2つ目のパーティション容量をディスクの残容量全てとする(FAT32)
2つ目のパーティションを作らなくてもよさそうなものだが、Windows標準機能の
ディスクの管理で2つ目のパーティションのサイズ変更が可能なので、それを
防ぐために必要となる。

理屈としては上記のようになるが、実際にはどうすればよいか。
C++でプログラムを作る必要がある。
具体的にはWin32APIのDeviceIoControlなどを駆使することになる。
一応組んだプログラムが手元にあるのだが、これを公開するのはちょいと気が
引けるのでやめておく。

では、この処理を行ったUSBメモリを元容量に戻すにはどうしたらよいか。
企業内の使用者が簡単に容量を戻せてしまったら意味がない。
エクスプローラやディスクの管理ではできない。
ここであまり詳細にそれを書くのは気が引けるので、キーワードだけ。
DISKPARTというコマンドを使う。

以上、USBメモリを小容量に見せかける方法を表面的に語ってみた。
より詳しい情報をどうしても知りたい人は、コメントなどで連絡くれれば、
ご案内することもあるかもしれない。

iTextSharpによるPDFファイルのページ分割 [ソフト開発]

iTextSharpはフリーのPDF関連コンポーネントであり、いろんなことができるのは
知っていた。
ドットNET、つまりC#かVB使いであれば、けっこう簡単にPDFを操ることができるの
だが、あいにくおいらはC++使いなので、これまでは触れる機会がなかった。

iTextSharpを使ったプログラムでPDFをページごとに分割したら、あるPDFにおいて
元通りの状態で分割されずに、回転した状態になってしまうんだが、何とかならないか。
という相談を受けて解決に導いてあげられたので、そのアウトプットをここに掲載する。
VB.NETのソースコード付きプログラムと回転したPDFのサンプル。

相談を受けた直後は、ググって以下のサイトを見つけたので「ここ見れ!」
って教えてあげた。
iTextSharpを使ってPDF分割アプリケーションを作成する
ところが「それやってもダメだった」とのことなので、さらにググって以下を発見。
Rotating PDF in C# using iTextSharp

英語サイトでC#なんで少々腰がひけたけれども、乗りかかった船なので最後まで
がんばってみた。
最初のサイトでは、90度と270度のときにそれっぽい処理を行っているがこれではダメ。
すべての回転角度(0度、90度、180度、270度)に対して、異なる処理をいれなきゃいかん
ということが上記英語サイトからわかった。
うまくいくかどうか確かめるために、ほとんど使ったことのないVBプログラムをやらなければ
ならなくて、けっこうめんどうな気持ちになったが、やってみたらけっこう簡単だった。

調査の過程で以下サイトも見つけている。
PDFファイルを分割するサンプル(VB.NET)
回転角度0度以外だったら回転させる処理になっているので、うまくいきそうに見えたが
実際はダメで、高さと幅の考慮がないことでうまくいかないことがわかった。

iTextSharpによるPDFファイルのページ分割を行いたいという要求は、今後少なくない
人間が持つことだろう。
その際、上の二つのサイトにたどり着いて同じ組み方で不十分なプログラムになって
しまうことを避けるために、おいらが導いた解決策を両サイトには連絡しておいた。

そんなこんなで、iTextSharpが簡単でおもいしろいってことを発見できた。
iTextSharpは、Ver.5からAGPLライセンスが適用されていて扱いがやっかいだ。
ようするに、iTextSharp5を組み込んだアプリ全体のソースコードを公開しなきゃいかん。
そんなことを知っていたので、今回はiTextSharp4を使っている。
近いうちにこのあたりのことを調べてみようと思っている。

C++ [ソフト開発]

プログラム言語で唯一まともに使えるのがC++だったりするおいらなわけだが、
C++のことをずいぶん知っているかというとそうでもなかったりする。

absという関数があって、絶対値を求めるものだっていうのはもちろん知っていた。
long型変数の場合はlabsで、実数型変数だったらfabsだってことも。
これはC言語の常識なんだが、C++では違っていたことを今日知った。
C++ではabsだけでよくて、変数の型によって呼び分けしてくれるそうだ。
このことを、関数のオーバーロード と呼ぶ。

C++の++って何か?
Cのインクリメントが++であって、Cから一歩進んでいるってことだ。
その一歩というのがオブジェクト指向だ。

そもそもC言語て、なんでそんな名前なの?
C言語の前にB言語があったっていうのは、ウソのようなホントの話だ。
じゃあ、B言語はどうやって命名されたのか?
ってのははっきりしていないものの、BasicなんちゃらのBを取ったという
説がある模様。

C言語系の言語はたくさんある。
C、C++、C#、Java、Objective-Cなど。
新しいMacBookも出たことだし、そいつを買ってObjective-Cを学んで、
iOS用のアプリでも作ってみるかな。
CADばかりじゃ、つまらんからさ。

PDF印刷のアプリ指定 [ソフト開発]

PCにAdobe ReaderとAcrobatの両方が入っている場合、PDFファイルを
右クリックメニューから印刷ってやると、どっちで印刷されるのか?
Windows XPまでは、拡張子の関連付けのところから、どのアプリで
印刷されるのかを確認、変更できたのだが、Vista以降では無理になっている。

以下に、その確認・変更手順を記しておく。
1.レジストリエディタを起動
2.HKEY_CLASSES_ROOTから、キー「.pdf」の「既定」の値を確認する
 例)AcroExch.Document
3.HKEY_CLASSES_ROOTから、2のキーを探しその配下の以下キーを確認する
 Shell\print\command
  例)C:\Program Files\Adobe\Acrobat 9.0\Acrobat\Acrobat.exe" /p /h "%1
 Shell\printto\command
  例)C:\Program Files\Adobe\Acrobat 9.0\Acrobat\Acrobat.exe" /t "%1" "%2" "%3" "%4
 この場合は、Acrobatで印刷することになっている
4.Adobe Readerで印刷したいなら
 上記2つのexe指定のところを以下に変更する
 例)C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe

後から入れたほうが指定されるのかと思いきや、そうでない場合もある模様。
PDF印刷は、Adobe Readerでやるのが一番安全なので、Acrobatになっている場合は
Adobe Readerに変更することをお勧めする。

ついでに、レジストリエディタで目的のキーを素早く見つける技をひとつ。
見つけようとするキーの親キーを選択しておいて、キーボードから見つけたいキーの
つづりを素早く打ち込むべし。
例えば、HKEY_CLASSES_ROOTを選択しておいて、キーボードから「.pdf」と
打ち込むわけだ。
一瞬でみつかって便利なことこの上ない。
なお、素早く打ち込む時間的基準は、キー入力の間隔が1.5秒以内とのこと。
ブラインドタッチできれば余裕だろう。

POSTフィルター [ソフト開発]

VCでつくったWindowsアプリから、Webサイト上のPHPを呼び出して、
MySQLのDBをいじる。
そんなストーリーを思いつき、サンプルアプリを作った。
家からやったら問題なかったので会社から試したら、403エラーが返ってきた。

原因はPOSTフィルターだった。
会社からのインターネットアクセスは制限が厳しい。
コンテンツフィルタリングが導入されていて、2chや検索結果のキャッシュ、
芸能・スポーツ関連などが閲覧できない。
その程度のことは、仕事をするのに関係ないからいいわけだが、
POSTフィルターは曲者だ。
掲示板への書き込みなどに使われるPOSTという技術をブロックするのだ。
POSTは、ブラウザからWebサーバーに情報を送信する方法の一つ。
表面にあらわれないで多くの情報を送信するのに便利なのだ。
GETだと、URLに?ではじまるパラメータが追加されて、送信情報が
そのまま見える形になってしまう。
ということは、送信した情報が検索エンジンに登録されてしまって、
意図せず情報が広まってしまう。

前述のサンプルアプリを協力会社のメンバーに試してもらったら、
何の問題なく動作した。
ちょっと、うちの会社のコンテンツフィルタリングは厳しすぎだな。
POSTフィルタリングだが、Web上のすべてのPOSTが
ブロックされているわけではなさそうだ。
おいらが試したのは、某レンタルサーバーを自分で借りた場所で、
サブドメインを付けたところ。
きっと、ドメイン名でブロックしているのか、レンタルサーバー会社が
登録してあるIPアドレスをすべてブロックしているかだ。
自分でつくった場所なんだから、あらかじめ登録されていたわけではない。
きっと、除外申請すればそこだけPOSTフィルタがかからなくなるだろうが、
その手続きは煩雑だし、またそれを一部のユーザーにさせるわけにはいかない。

興味深いサイトを見つけた。
自社のインターネットの規制はどれくらい?
これをみると、POSTフィルターまでやっているのは全体の5%。
2006年のデータなので、今よりもヌルイことは当然。
5年後の今は、情報漏えい、個人情報保護、コンプライアンスなどが
厳しく言われ始めているので、もっと増えていることだろう。
しかし、ソフト開発がWebに移行してきている昨今、ソフト開発会社で
POSTフィルタをかけているというのは、理不尽な気がしてきた。
2ch上の優良な技術情報をみたいときはある。
その他掲示板で、技術情報の交換をしたいときだってある。
会社に属する一技術者として、立ち上がってみようかね。

そうは言っても、そうそう短期的にルールが変わるものではない。
前述のアプリについてどうするか?
POSTをベースに作っておいて、もし403エラーで失敗したときには
送信情報を暗号化してGETで送信する。
サーバーサイド(PHP)で、複合化して情報取得してDBに送る。
POST用とGET用で、PHPを2つ用意しておけばよい。
ふむふむ、とりあえずの解決策がみえてきた。

KB2538242 [ソフト開発]

また、VC2005再頒布可能パッケージの新しいものが出た。
昨日のWindowsUpdateでそれっぽいのが出てきたから、
もしやと思ったらビンゴだった。
Microsoft Visual C++ 2005 Service Pack 1 再頒布可能パッケージ MFC のセキュリティ更新プログラム

ある人によると「Windows2000で使用できないAPIを使っていたことへの対策」
ということなので、KB2467175への対策をようやくおこなってきたということ、
なのかもしれない。

その事件はひどいものだった。
もうサポート期限が切れたWindows2000だとはいえ、WindowsUpdateしたら、
VC2005でMFCをを使ったプログラムが動かなくなってしまったなんて。
こんな状態を2か月放置して、MSからはこれまで何の公式見解もででいなかった。
一部の人は「MSによる障害事実の隠ぺいだ!」なんて言っていた。

手近にWindows2000がないので、事実関係をはっきりさせることはできないが、
きっとこのKBでこの問題は収束したのだろう。

PMサーバー版リリース [ソフト開発]

PMサーバー版

ペーパーモデル化ツールサーバー版の宣伝。
詳しくは、kensetsu21のこちらのサイト(PDF)をご覧あれ。

クライアントは、サーバー上の共有フォルダにファイルを
ドラッグ&ドロップするだけ。
サーバー側では共有フォルダを常に監視しており、
ファイルが放り込まれたことをリアルタイムで検知して変換を開始、
変換結果は別の共有フォルダに作成する。
サーバーへのセットアップは、共有フォルダ作成や
変換設定を行う必要がある分、それなりにやっかいだが、
クライアントは共有フォルダが見れさえすればよく、
アプリのインストールは不要。

まだ価格が公開されておらず、正直おいらも知らない(忘れた)が、
通常版5万円よりは格段に高いものになるであろう。
レイアウトが使用されたAutoCAD図面をモデル空間に
変換する必要がある人が5人以上いる企業が対象と考えれば、
その程度の価格設定になるであろう。

サーバー版のアイコンは、Ver3の一部をすげ替えただけ。
3をSVに変えただけでおもしろみがない。
時間があれば凝ったものを作ったのだが、いかんせん
急遽決まった企画だったので仕方ない。

歴代PMツールのアイコンを並べてみる。
本物は32×32だが、特別に110×110で拡大して載せてみた。

pm pm2 pm3

もしVer4が出るようなことがあれば、おいらのデザインセンスを
駆使して、立派なアイコンを作ることを心に誓っておく。(軽く)

ペーパーモデル化ツール3 [ソフト開発]

3年半の沈黙を経て、ペーパーモデル化ツールのバージョンアップが行われた。
とりあえずはVectorにアップロードされただけであり、販促活動はこれから
本格的に行われていくはずだ。
興味がある人は、以下をクリックしてみるとよい。
ペーパーモデル化ツール3

今後は、スタンドアロン版だけでなく新しい形での提供もはじまる。
どんなものなのかはまだ明かせないが、提供側としては今後の発展に
大きく寄与してほしいと考えている期待の星である。

【新バージョン用につくったロゴ】
ペーパーモデル化ツール3

【新バージョンの変更点(readme.txt記載)】
・Windows7を動作可能OSに加えました。
・変換元ファイルに、2010形式のDXF,DWGファイルを加えました。
・変換後ファイルに、2007形式および2010形式のDXF,DWGファイルを加えました。
・Revitで保存したDWGファイルの変換に対応しました。(以前はレイアウトがないと判断して、
 変換できませんでした。)
・異尺度オブジェクトのうち、テキスト・マルチテキスト・寸法・ハッチング・引出線・マルチ引
 出線・幾何交差に対して、レイアウト上の見た目の注釈の大きさを有効にして変換するように
 しました。
 変換後オブジェクトのプロパティにおいて、異尺度対応は「いいえ」となります。
・寸法線折り曲げ(分断されていることを示す折り曲げ)に対応しました。
・円弧が延長された直径、半径、角度寸法に対応しました。
・検査寸法(寸法値が円弧と線で囲まれている)に対応しました。
・座標寸法、折り曲げ半径寸法を、寸法として変換するようにしました。(以前は分解)
・寸法において「矢印を反転した」状態が有効となるようにしました。
・ビューポートの画層プロパティ優先を考慮して、線色・線種・線幅を変換するようにしました。
・マルチ引出線を、[基本図形に分解される図形]に加えました。
・OLE2フレームを、[元の通りに変換できる図形]に加えました。
・らせんを、[元の通りに変換できる図形]に加えました。
・ラスターイメージのクリップ反転に対応しました。
・ファイルオプションに、[変換時の警告表示]を追加しました。
・図形オプションの分解に、属性・楕円・スプラインを追加しました。
・図形オプションに、[ビューポート境界にある幾何図形を切り取らない]を追加しました。
・図形オプションに、[レイヤが非印刷の図形を変換しない]を追加しました。
・図形オプションに、[寸法線の黒丸矢印を二重の円として変換する]を追加しました。
・STB(名前の付いた印刷スタイル)の図面を、STB図面のまま変換するようにしました。
・各種オプション(ファイル、図形、文字)について、iniファイルへの保存、iniファイルからの
 読み込みを可能にしました。
・簡易ビューア(DD View)を機能強化しました。
 1.線の太さ表示の切り替え 2.ファイルのドラッグ&ドロップによるオープン
 3.ペーパーモデル化ツールのツールバーボタンによる単独起動 4.システムメニューを追加
 5.別名のDXF,DWGファイルとして書き出す機能を追加

暗号 [ソフト開発]

こんな本を買った。
『RSA 暗号技術の基礎からC++による実装まで』

ソフトの認証を行うのに、シリアル番号とパスワードを使いたいから。
シリアルは、一定の桁数のランダムな数値とする。
パスワードは、シリアル番号に対してある演算をすることで求められる値とし、
パスワードに逆の演算を行うと、シリアル番号に戻る。
まさに暗号と復号であり、これが何とも奥が深い。
他人に予想できず、それらしい演算である必要がある。
とりあえず、自己流につくってはみたが、どうも満足できない。

ネット上にそれっぽいものが落ちてないか何度も調べたが、なかなかない。
そこで何度も引っかかってきたのが前記の本。
本を買ってまで実装するものかと迷うこと、5年。
ずいぶん長いこと迷ったものだが、昨日この本が届いたので、
ななめに読んで30分で内容をつかんだ。

RSA暗号とは...。(Wikipediaから引用)
桁数が大きい合成数の素因数分解問題が困難であることを安全性の
根拠とした公開鍵暗号の一つである。
暗号(Cipher)とデジタル署名(Digital signature)を実現できる方式として
最初に公開されたものである。

RSAでは、512ビットの鍵を使うのが一般的だ。
512ビットの数値ということは、2の512乗のことであり、
10進数にすると154桁の整数ということになる。
C言語の標準で扱える最大の桁数は、doubleの16桁程度。
16桁と154桁では、天と地ほど違う。
しかも、512ビットでは解読されてしまうリスクがあるらしく、
今後は1024ビットや2048ビットの鍵が使われるとのこと。
616桁の整数を扱うってことだ。

こんな巨大な整数のことを、Multi-Precision IntegersといいMPIと略す。
和・差・積・商といった基本的な演算から始まり、素因数分解や
最小公倍数、最大公約数、素数、乱数を求める。
要するに、小さい値を基本語長の値として演算を行い、
オーバーフローしそうになったら、もうひとつの基本語長の値を利用して、
繰り上げていくというわけだ。
考え方はシンプルだが、この処理をいかに高速にするかが超難しい。

昔、分数を約分するコードを独自に書いたことを思い出した。
2,3,5,7,11といった小さな素数で順番に割っていくという、
何の工夫もない、くだらないプログラムだ。
約分するためには、最小公倍数で割っていけばいいということは
わかっていたが、この最小公倍数を求めるのが難しい。
ユークリッドの互除法というのを、この本で知った。
aとbの最大公約数を求める関数を転記してみる。
long getGCD( long a, long b )
{
  while( b != 0)
  {
    long w = a % b;
    a = b;
    b = w;
  }
  return( a );
}
たったこれだけかと、唖然とした。
世の中、頭がいい人はいるものだ。

この際、暗号はどうでもよくなってきた。
円周率を1兆数千億桁求めて世界記録達成、なんてのがニュースになる。
円周率は3.05より大きいことを証明せよ。こんなテーマに取り組んだことがある。
円周率の整数部をたった1桁導き出すのに、たいへんな苦労をしたものだ。
この本で学んだことで、100桁くらいは独力で出せそうな気がしてきた。
暇で暇でしょうがないときに、やってみようと思う。
こんなことしても、金にならないのが残念なことではあるけれども...。
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:学問