• 面白い話題があったら適当に書き足してください。
  • 量が増えてきたら適当に別のページに移してください。

日付の計算

  • wikipedia 閏年
  • 4で割り切れる年は閏年。
  • ただし、4で割り切れる年でも100で割り切れる場合は平年。
  • ただし、100で割り切れる年でも400で割り切れる場合は閏年(世紀末閏年)。

ある年が閏年かどうか判定する式。
year%4 == 0 && year%100 != 0 || year%400 == 0

  • カレンダーは400年で一周する。
  • 世紀末閏年の1月1日は常に土曜日。
  • ある日の曜日は世紀末閏年を起点に計算する。
  • 平年は365日、閏年は366日ある。
  • 閏年には2月29日がある。

思い付きのメモ

○○ on Japan/○○ in Japan といったような場合、
  • ○○ > on
  • ○○ > in
  • in > Japan
  • on > Japan
と続く確率をそれぞれ足し合わせると1になる方法を知りたい。
○○によってonが続くかinが続くか変わるが、Japanが別の単語だった場合onもinもつかないかもしれない。

検索にんじん

検索にんじんを検索してみると、1,260,000件ヒット。

Atom


SQLite


C++でデリゲートを実装する方法



名前

名前付けに移動しました。

C++を始める


脱出ゲーム


HRESULT




S 0=success, 1=failure
R
C
N
r
Facility 種別
Code

BPE圧縮


  • 極端なケースとしてすべて同じ値のデータについて考える。
  • 画像であれば単色で塗りつぶされた画像など。
  • 圧縮後のデータに必要なものは、辞書を各圧縮段ごとに、圧縮後に残ったデータ、辞書データ全体の長さ又は辞書の段数も必要です。
  • 各圧縮段の辞書は、辞書の長さ、圧縮後の一バイトと圧縮前の二バイトのマップを必要なだけ。
  • 圧縮後に残ったデータはバイト列ですが、長さがあったほうが親切かもしれません。

  • 辞書の段数は最大32ビットとする。
  • 各圧縮段のマップ数は最大で256。

以下、適当に修正してください。

struct 圧縮後の一バイトと圧縮前の二バイトのマップ {
    char key;
    char val[2];
};

struct 各圧縮段ごとの辞書 {
    unsigned char 長さ-1;
    圧縮後の一バイトと圧縮前の二バイトのマップ [長さ]; 
};

struct 辞書 {
    unsigned long 段数;
    各圧縮段ごとの辞書 [段数];
};

struct データ {
    unsigned long 長さ-1;
    char 圧縮後に残ったデータ[長さ];
};

圧縮されたデータ。

データ;
辞書;


  • 以上のような構造として試算する。
  • unsigned longは4バイトと仮定する。
  • 圧縮前のデータは、1024バイトとする。
  • 全体が同じ値のデータを圧縮するので各段で必ず全体が圧縮される。
  • 圧縮の一段目では1024バイトが512バイトになる。
  • 二段目では512バイトが256バイトになる。
  • 以下同様に繰り返す。
  • 全体で10回繰り返されるので段数は10段。
  • 最後に残るデータは1バイト。

辞書。
  • 各圧縮段ごとの辞書は、常に4バイトになる。
  • 4バイト * 10段 + 段数の4バイト = 44バイト。

データ。
  • 同じ値の連続は常に圧縮されるので最後に残るのは1バイト。
  • 1バイト + 長さの4バイト = 5バイト。

圧縮後のデータは全体で49バイトになりました。
1,2,1,2,1,2,.....と繰り返すデータも同様に49バイトになります。

1,2,3,1,2,3,1,2,3,...と繰り返すデータは繰り返すペアの頻度から1,2のペアと圧縮されない3に分かれるのが最善だが・・・。
今回の場合2,3または3,1のペアも同数あり、1,2のペア、3,1のペア、2,3のペアと分かれる。

  • 一段目の圧縮では1,2のペア171組342バイトが171バイトに圧縮され、3,1のペア171組342バイトが171バイトに圧縮され、2,3のペア170組340バイトが170バイトに圧縮され、合計512バイトになる。

この状態で、1,2のペアが空いているバイト4に圧縮されたと考え、同様に3,1→5、2,3→6と圧縮されたとする。
  • この状態では、4,5,6,4,5,6・・・4,5,6,4,5という並びの512バイトになっている。
  • 辞書は組み合わせの数が1から3に増えているので4バイトから10バイトに増えている。
  • 以下ほぼ同じ状態で繰り返す。

  • 9段目でデータ列は1,2,3,1となり、辞書の組み合わせ数が2個7バイトになる。
  • 同様に10段目では、データ列が4,5、組み合わせが1個4バイト。
  • データは最終的に1バイトまで圧縮される。

結果の辞書を含めた圧縮データ全体で96バイトになった。
繰り返しデータには非常に強いように見える。

以上、ただの試算なのであってるかどうかは知りません。

  • 空いているバイトがどれだけあるかが圧縮の可否に関係しそう。
  • 今回試算したデータ列は常に圧縮できる同じパターンの繰り返しデータなので、1,2,3が使われている場合に4,5,6が空き、その逆も成り立ちます。
  • 現実的には、そううまくはいかず簡単に空きがなくなると思われます。
  • 1バイトまで圧縮できることはないでしょう。(この場合の1バイトとは辞書を含まないデータのみです。)
  • というわけで、BPE圧縮が使える状況が全く想像つかなかったりします。

システムハンガリアン記法


ググラー

ググれば何でも分かると思っている人をググラーと呼んでみてはどうだろう?という提案。

JavaはC++の2-3倍速い


もめた時に決着をつける方法。


二つの変数の値を入れ替える方法


  • swap関数風に。

テンポラリ変数を使わない方法。
x = x ^ y;
y = x ^ y;
x = x ^ y;

テンポラリ変数を使わない別の方法。
x = x + y;
y = x - y;
x = x - y;

コマンドプロンプトで別の文字コードが使いたい

  • chcpコマンドでコマンドプロンプトのコードページが変更できる。

現在のコード ページ番号を表示または設定します。

CHCP [nnn]

  nnn   コード ページ番号を指定します。

現在のコード ページ番号を表示するときは、パラメータを指定せずに CHCP と入力してください。

  • UTF-8に変更したい場合、 chcp 65001
  • shift-jisに戻したい場合、 chcp 932

ベンチマーク

  • Google Trendsで任意の単語間で話題性を比較できます。

SQLite


  • SQLiteでSELECT COUNT(*) from tbl;が異常に遅い。

ある数値の桁数を求めたい

beruponuさんのアイデア。
  • 対数を使う。
licksさんのアイデア。
  • log n 5 ==>log m 5/ log m n で自由に基数を変えられる。
というわけで、
  • log(数値)/log(基数)+1 = 桁数付近
  • 桁数付近から小数点以下を落とすと桁数
この計算では、0が一桁になる。
  • 0は一桁か?
  • 基数が不正な場合などエラーはどうする?
  • 負の数を与えると結果は虚数になるので絶対値を取って与えたほうがいい。
  • 虚数の二乗は-1。

CSVを読み込んでグラフを描画したい

  • 超長いグラフになるので全体を見たり一部を拡大したりスムーズにしたい。
  • 言語は何がいいか?
  • 何でもいいが簡単なものの方がいい。
  • 生産性は重要。
  • エクセルでやったほうが簡単では?
  • エクセルでコロコロしてると発狂しそうになる。

サンプル。



名前:
コメント:



ページビュー -

タグ:

+ タグ編集
  • タグ:
最終更新:2008年10月07日 03:25
添付ファイル