データの並び順で別のデータを表す方法 [日記]
拙作「梅・竹・桜」のヘルプに、こんなことが書いてあります。
(256色)画像のパレットの順番を入れ替えることで、そこに約210byteのデータを隠せる。
どういうことかを、4つのデータを使って説明します。
iTextのソースを追ってみた [日記]
拙作『青空文庫形式のテキストファイルをPDFに変換するツール、略して「青P」』で、動作報告をいくつかもらいました。
主だったものは、次の2点。
- (フォントをPDFファイル中に埋め込まず)標準のフォント(日本語用)を使用すると、携帯端末のPDFビューアでは、文字が表示されない(らしい)。フォントの埋め込みを行えば表示できる(らしい)。
- 縦書きにすると、括弧や記号が横書きの文字で表示される。
(標準フォントの場合、全角の括弧は正しく縦書き用になるのに、半角の括弧は横書き用のまま)
これらは青Pの問題というよりも、PDF作成のために使っている iText の都合です。
原因は何なのか。解決策はあるのか。iTextのソースコードを追ってみました。
ぼくのかんがえたcrackme [日記]
シェアウェアには、シリアルコードを入力すると使用制限が解除されるものが良くあります。
また、シリアルコードを入力しないとインストールすらできない製品も多くあります。
そして、
プログラムを解析(リバースエンジニアリング)して、シリアルコードを見つけ出したり、そもそもシリアルコードを入力しなくても良い様にプログラムを改変したりすることも、行われていたりします。
一方、解析できなくする(解析できなくすることは実質不可能)、解析を難しくする方法が考案されています。
そこで、自分も(解析を難しくする方法を)考えてみました。
注1)解析関係(特に最近のもの)は素人同然なので、「そんなの基本じゃん」と思われること必至です。
注2)アイデアだけで、ここにはcrackmeのプログラムはありません。
前提
- シリアルコードを入力しないと、一部の機能が制限されるタイプを対象
- コンパイルして出来上がった実行ファイルに対して、何らかの操作(例えば「パッカー」で圧縮とか)は、行いたくない
- アセンブリ言語(インラインアセンブラとか)も極力使いたくない
例外コード c0000417 [日記]
先日、こんな報告がありました。
例外 不明なソフトウェア例外(0xc0000417)がアプリケーションの0x0042d637で発生しました。
なんだろう、これ……
ローカルでHTMLにHTMLをインクルード [日記]
HTMLファイルの中に、別にファイルに記述されたHTMLを埋め込みたいのです。
SSIでは、こんな感じ。
<!--#include file="~" -->
JSPでは、こんな感じ。
<%@ include file="~" %>
これと同じことを、サーバを使わず、ローカル環境のみで行いたいのです。
javascriptを使って。
昔語り [日記]
Visual C++ にある WinSock2.h というヘッダファイルに、次のような構造体の定義があります。
typedef struct _SOCKET_ADDRESS_LIST { INT iAddressCount; SOCKET_ADDRESS Address[1]; } SOCKET_ADDRESS_LIST, FAR * LPSOCKET_ADDRESS_LIST;
これを見て、ある人が、こんなことを言っていました。
型名に
LIST
って付いているのに、実際には1つしかデータを格納できないじゃないか(ぷ
そう言えば、C++を使うようになって、この“テクニック”は使わなくなったなぁ……。
Java最大の罪は、オブジェクト指向を知らない(自称)オブジェクト指向プログラマを量産したことだと思う [日記]
タイトルにJavaとあるけど、中身はC++。
プロジェクトが順調に進んでいるとプロジェクトマネージャは暇になるのでしょうか?
ある日「今、手が空いているから何か手伝う」と言い出しました。
そこで、
『2つのファイルの内容が等しいか判定する関数を書いて』とお願いしました。
そして出来上がったのが、こんなクラスでした。
class FileComparator { private: const char* path1_; const char* path2_; public: FileComparator(const char* path1, const char* path2) : path1_(path1), path2_(path2) { } bool compare() { FILE* fp1 = fopen(path1_, "r"); FILE* fp2 = fopen(path2_, "r"); int c1, c2; do { c1 = fgetc(fp1); c2 = fgetc(fp2); } while (c1 == c2 && c1 != EOF && c2 != EOF); return c1 == c2; } };
これは、ひどい(某氏風に)
10進数と16進数の整数クラス(設計編) [日記]
文字列で表現された整数を表すクラスがありました。
必要な部分だけ書くと、こんな↓クラスです。
class Value { public: Value(const char* value_str); // (コンストラクタで)指定した文字列が数値を表しているかどうか。 bool is_valid() const; // 数値を取得する。 int get_int() const; };
こんな風に使います。
int main() { char buff[100]; std::cin >> buff; Value value(buff); if (value.is_valid()) { std::cout << value.get_int() * 2 << "\n"; } else { std::cout << "数値ではない\n"; } return 0; }
イメージとしては、Javaのjava.lang.Integer
クラスの様なものです。
(java.lang.Integer
は整数を表すクラスと言うよりint型のラッパの毛色が強いですが…)
さて、上のクラスは10進数で書かれている整数が対象ですが、
"0x"で始まる場合は16進数と解釈するクラスが必要になりました。
拡張子の関連付け [日記]
Windowsでは、ファイルの拡張子に、そのファイルを処理するコマンドが関連付けられています。
ですが、関連付けられているコマンドを取得したり、逆に拡張子にコマンドを関連付けたりするAPIが無かったような気がします。
ではどうするかというと、レジストリを直接操作するしかなかったり。
そこで、拡張子から関連付けられているコマンドが決定するまでの流れを調べてみました。
実数の剰余 [日記]
「2つのデータが整数倍かどうかの判定をするんだってさ」
「整数倍ってどうやって判定するんだっけ?」
「割り算をやって“余り”が“0”になれば整数倍だ」
「でもこのデータは実数だけど、実数で余りって計算できるんだっけ?」
「う~ん……」
「…………」
いや、別に“余り”が計算できなくっても、本来の目的が整数倍かどうかの判定なんだから、普通に割り算して結果が整数かどうか判定したら良いんじゃないかと思ったり思わなかったり。
それは兎も角
実数の割り算で、「余り」って何だろう……。
オレオレ証明書を作る [日記]
某社に収めている某WWWシステムをSSL通信できるようにすることになった。
今まではDBにアクセスするためのパスワードをWWWサーバの中に持っていたのだけど、セキュリティ強化の為、毎回ユーザにパスワードを入力させるように仕様変更となったのだ。
そこで、、開発用サーバ(というか自分が使っているPC)用に、認証局とかが設定されていない、所謂オレオレ証明書を作ることにしました。
(本物のサーバには、ちゃんとした証明書が用意されることになっているらしい。本当かどうかは知らないけど…)
再帰の誘い [日記]
とあるWWWアプリケーションで使っているJava実行環境を1.3から5.0に変更しました。
テストも一通り終り、本番環境で動かしてみると、動作が変だ。
なんとなく、例外を投げて途中で止まっているっぽい。今まで動いていたのに。
MeCab for Win での単語追加 [日記]
形態素解析ツールの「MeCab (和布蕪)」を使ってみた。
で、単語を追加するのに(ユーザ辞書を作るのに)色々と苦労したので、メモっておく。
ちなみに、以下の話は、コンパイル済みのMeCab 0.95 for Windows(mecab-0.95.exe)の話。
Windowsアプリケーションでprintf:裏技編 [日記]
(前回までのあらすじ)
Windowsアプリケーションでコマンドプロンプトに文字を出力するには、AllocConsole(AttachConsole)
とfreopen
で出来るけど、AllocConsole
は必ずもう1つコマンドプロンプトが開くし、AttachConsole
はXP以降専用なので、どっちもいまいち。