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

PDFの用紙サイズはポイントで表現されている [ソフト開発]

PDFの用紙サイズをiTexSharpで取得したら、mmでもinchでもない、
謎の数値が得られたので、調べてみたらポイントという単位だった。
ポイントとは、WordやEXCELで文字の大きさを指定するときに
使うもので、1inchを72で割ったものであることが判明した。
ポイントはptと略して表現されている。
読みの場合は「ポ」と省略することあるような話を昔聞いたかもしれない。

ウィキペディアから引用してみよう。
1 pt = 1/72 in. (= 25.4/72 mm = 0.3527777... mm)
つまり、iTextSharpで取得した用紙サイズに0.352777を掛ければ
mmの値になるっていうことですなぁ。
きっと用紙サイズだけの話でなく、あらゆる大きさの値が同じなはずだ。

なお、PDFのバージョンが新しくなると、このポイントという単位を
任意の単位に変更できるようになっているらしい。
mmとかInchにして、直感的にわかりやすい値にできるってことだ。
まだその詳細はつかんでいないので、今後の課題としておく。

アプリでzip圧縮と解凍をやりたくてzlibを組み込んでみたんだけど。。 [ソフト開発]

でかいファイルは、圧縮してコンパクトに扱いたくなる。
テキスト形式で定義されているファイルをアプリで読み書きする。
テキストは圧縮すれば1/5くらいになるので、その結果小さくなった
ファイルをアプリの入出力とすればよいという発想だった。
アプリは、圧縮されたファイルを解凍してから入力して、
何らかの編集操作後には再度圧縮して出力することになる。

圧縮ファイルと言えばzipであり、zipを扱うならば商用利用も
可能なzlibということになった。
zlibの最新版は1.2.8(update2013/4/28)である。

zlibサイトを下にスクロールさせて、真ん中より少し下の
「Related External Links」の中の
「zlib for Windows 9x/NT/2000/XP/2003 (DLL version, plus related utilities) 」
をクリックでwinimage社のサイトに飛んで、zlib125.zipと
zlib125dll.zipをダウンロードして、アプリに組み込んだのだった。
winimage社は、zlibをWindowsで使う用にラッパーのDLLを作成&
公開してくれていて、その作成時期が少し前なのでzlibの最新の1.2.8
ではなく、1.2.5というバージョンになっていた。
(このラッパーはwinimage社のminizipから切り出したものらしい。)
その程度のバージョン違いは問題ないと考えたし、またアプリへの
組み込みも問題なくできたので、やれやれってことで終わっていた。

最近になって、zlibのバージョンが最新かどうかという話が出て、
あらためてwinimage社のサイトに行ってみたら、ダウンロードできる
ファイルがzlib123.zipとzlib123dll.zipになっていることが判明した。
1.2.5あるいは最新の1.2.8ベースが出ているかと思ったら、なぜか
バージョンが1.2.3に戻ってしまっていた。(2015/12/23現在)
不具合、脆弱性、ライセンスなどの問題で戻した可能性が高い。

そもそもの話として、zlib本体をアプリに組み込むべきだ。
しかし、ネットではwinimage社のラッパーを組み込むネタは転がって
いるものの、zlib本体を組み込む方法が見つからない。
容易に組み込めるwinimage社のラッパーに飛びつくのはよくわかる。
zlib本体は、hとdefとlibの構成になっているので、そんなに難しくない
ようには思えるが、いかんせん英語で前例がネットにないと来ている。
がんばって英語と格闘するか、ネットでの事例を探し出すか。。。
zlib最新版を使うための戦いは続く。

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

左側が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が出るようなことがあれば、おいらのデザインセンスを
駆使して、立派なアイコンを作ることを心に誓っておく。(軽く)