2014年9月25日木曜日

金貨の価値

小説家になろう とかの転生物を読んでると、いくつかの貨幣が出てきます
銅貨が何枚で銀貨 銀貨が何枚で金貨 というのが あまりにもキリがいいので、んなわけないだろ と思い計算してみました

まずお金の価値についてですが、これは"使用している金属の価値"がそのままお金の価値となります
金貨はそもそもお金の形をしている必要はなく、金の粒はそれの価値と等価の物と物々交換ができます
金貨の絵柄を国が決めているのは、国が「この高価は純粋な金ですよ 混ぜ物はありませんよ」と価値を保証しているに過ぎません
ということで、図柄の美術的な価値とかは無視して計算します

今回の計算に使用する金属は金(Au)・銀(Ag)・銅(Cu)の3種類ですが、この金属の価値は今日時点で調べたおおよその価格を使用しています
時代による価値の変化は考慮していません
中世ヨーロッパ的世界観なのに金属の価値が現代と同じなのは(ryみたいなツッコミはご遠慮願います


さて、計算をしてみたいと思いますが、その前に前提となる数字を用意したいと思います

まずそれぞれの金属の価値
金:4650円/g
銀:73円/g
銅:0.7円/g
という感じです
この時点でいい感じに50や100で割れそうですねww でももうちょっと計算します

次に必要な数字ですが、硬貨の大きさを決める必要があります
とりあえず500円硬貨より一回り大きいサイズとして、直径30mm*厚さ2mmとします
円筒と考えると体積は1.4cm^3です

金・銀・銅の密度はそれぞれ19.3g/cm^3,10.5g/cm^3, 8.94g/cm^3です
1.4cm^3で計算すると重量は27.3g, 14.8g, 12.6gになります

これに先ほどの価値をかけると
金:12万7千円
銀:1千円
銅:8.8円
となります

微妙にキリが悪いので、銅貨を大きく、金貨を小さくし、10万円・1千円・10円とすると、それぞれ100倍になります

結論:銅貨100枚で銀貨1枚 銀貨100枚で金貨1枚 という換算レートは現代の価値で考えると結構ピッタリ



作中では商人同士で使うようなやたらと価値の高い硬貨もありますが、金の数十-数百倍の価値を持つ金属というと、何があるんだろう?
たぶん同じような硬貨だと紛失しやすいと思うのでw 実際に使うんであれば金のインゴットとかになる気がします


なお、この計算は金属の価値が現代の地球と同等と仮定して行っています
やたら大量に金が採掘されるとか、銅がめちゃくちゃ貴重だったりすると、全然違う価値になるので注意が必要です

そもそも地球と同じ国際単位系が使われてるとか ご都合主義にも程があるので、そのあたりは気にせずに物語を読むが吉だと思います

2014年9月22日月曜日

コズミックin赤平とかを見学とか参加してきた

9月20日に赤平の植松電機で開催されたコズミックカレッジin赤平とかに参加してきました

"とか"と言うのは、コズミック後の北海道スポーツシューティングクラブの例会にも参加したためです

・コズミックカレッジ

コズミックカレッジの対象は小3-中3なので、僕は見学です

今回のコズミックカレッジは参加者が5チームにわかれ、その中で2班を作り、モデルロケットを作る班とmbedを使った缶サットを作る班になります

モデルロケットは紙に印刷されたもので、それを切り出したり接着剤で貼りあわせたりしてC11-3を2本使って打ち上げます

缶サットチームはmbedに気圧センサ(LPS331AP)を接続し、打ち上げ時の高度を計測しました
高度の解析は後日植松電機の人が解析しWebページに掲載するようです
(1機はコズミックの最後に解析方法を説明し高度の速報値を出していました)

モデルロケットチームも缶サットチームも午前中の2時間程度で作り上げていました
ただ缶サットについては予め用意されたLチカコードの点滅周期を変更したりにとどまり、気圧を計測するプログラムは予め用意したものをそのまま使用していました
小学生3年生から参加し、ハードウェアの作成も含めて2時間という制限の中ではこれくらいがちょうどいいと思います

昼食の後、午後は実際にモデルロケットの発射を行いました

打ち上げ直前の説明の時に少し雨がパラパラと降ってきましたが、いざ打ち上げという時になるとほぼ快晴になっていました

晴天の中、C11x2の白煙を伸ばして飛んで行くモデルロケットはすごく綺麗でした

中盤からは雲が増えてきて、最後にはテントが飛ばされるのではと心配するほどの風も吹いていましたが、ちゃんと空力設計を行われたロケットはまっすぐ上昇していき、ロケットも缶サットも全て会場内で回収出来ました

その後植松さんの話が少しあり、コズミックは終了となりました

ただ、コズミック後に時間がある人は植松電機に残り、マルイBOYsを使ったサバゲを行っていました(後述)

・スポシュー

スポシューはコズミックが終わってから植松電機内で行われています
いつもは暗くなってからでしたが、今回はコズミック参加者に声をかけて、明るい内に打ち合いをしました
大人も子供も全員に10禁電動ガン(一部はエアコキ)を配り、バリケードを設置して打ち合います
チーム分けは大人対子供の2チームで、保護者は子供との遊び方を知っているためか、みんな楽しそうに遊んでいました

そして日が暮れてコズミック参加者が解散した後に、スポシューの参加者が集まりました
今回のスポシューは参加者が少なめでしたが、いつもどおり屋内で色々打ったりした後に、真っ暗になってから屋外で打ち合いをしました

真っ暗と言っても、今回は水銀灯を点灯させていたためにうっすらと何処にいるかはわかります
前回は真っ暗な中でしたが、フルオートトレーサーを全員装備していたため、マズルフラッシュ等で何処にいるかが一目瞭然でした
今回はそれが無いためにどこから打たれてるかがわからず、弾道も見えないためにいきなりヒットすることがありました
「弾道が見えないから狙いづらい」という声もありましたが、本来の打ち合いは弾道は見えないので、これもアリかなと思います あとトレーサー使うとすぐにヒットして楽しくないですし


僕もいつもは銃を持って打ち合いに参加しましたが、今回は途中途中でカメラを持って撮影を行っていました
上の写真はISO51200 SS1/2 F3.5という感じです
真っ暗なのでファインダーでは見えず、フォーカスはマニュアルでてきとーな位置に固定です

ノイズだらけでピントも甘いので緑一色にすると意外とそれっぽく見えるのが面白いですw

とりあえず今回わかったのは、この程度の人数(8人くらい?)だとほとんど誤射されない ということです
ということで次は僕の位置をバレやすいようにケミカルでも持って、α7sで挑みたいと思います
さすがに誤射されてレンズとかに当たったら悲しいので

ISO51200 SS1/2 F3.5をα7SのISO409600 F1.8に当てはめると、シャッタースピードは1/60くらいまで稼げるようです
ということで次は動画にチャレンジです


今回僕が使用したARはこんなかんじです
KeyModベースにアングルグリップとライト 反対側にContour ホロサイトとバックアップアイアンサイト と、ちょっとタクトレっぽい感じです
短時間しか使ってないですが、KeyModにグリップは不要な気がします
ライトも屋外だとほとんど使いものにならないので、不要か、物凄い明るいライトを付ける必要がります
ホロサイトはEoTechの実物を借りたため、レティクルも綺麗だし透明度も高いので使いやすいです

ただ中華の買ったまんまらしく、セミオートで撃てない(!)という不具合がありました
弾ばら撒くのはすきじゃないんだけどなぁ…


次回のコズミック&スポシューは11月15日です 真冬です 寒いと思います

スポシューは去年の11月に1回目を行ったので、次回が1周年です

2014年9月18日木曜日

MD5からデータを予測する

ちょっと気になったので実験
MD5から元のデータを予測することはできるか? という事

まず必要なデータを用意する
テストデータとしては"abc"と書かれた3バイトのテキストデータを用意する
このデータのMD5値は900150983cd24fb0d6963f7d28e17f72になる

次にC#で作ったプログラムにこの値を設定する
そして起動

input MD5が与えたMD5値
sizeが"たぶんこのバイナリだろう"と予想した大きさ
dataはそのバイナリを文字列として扱った結果(今回はバイナリファイルは想定していない)
timeは処理時間

無事に元の"abc"を得ることができた

3バイトを得るのに30秒
2バイトだと0.11秒くらいだった
1バイト増える毎にループが256回増えるので、まぁ計算通りかな
たった5バイトでも1ヶ月近くかかる計算
ネットの配布物に付属するMD5値から実際のデータを取り出すのは現実的に不可能

しかしこれにも抜け道は合って、バイナリデータとMD5の変換テーブルを作る というのがある
CPUリソースが開いている時にバイナリデータのMD5をどんどん計算しておいて、MD5値が入力されたら今までに作ったテーブルと比較する
これなら過去に計算したバイナリに同じものがあれば正常なバイナリを答えることができる

ランダムに全ての組み合わせのバイナリを作った場合
数kBくらいで何らかの画像データを得ることができる
数MBであれば何らかの音楽データになり得る
数GBあれば何かの映画を見ることができる

2014年9月16日火曜日

二重スリット実験 みたいなの

レーザーモジュールと厚紙を使って二重スリット実験のようなことをやってみました

使用したのは秋月電子で売られている緑色レーザーです
赤色(=長波長)のほうが間隔が広いのですが、手持ちに有る赤色は安物のためか干渉縞が全く現れませんでした


なんかもやっとしてますが、数珠のように干渉縞が見えます

今回使用したレーザーの波長は532nmで、スクリーンまでの距離はおよそ283cm スリットの間隔は0.5mmくらいです
これを元に干渉縞の間隔を計算すると
間隔 = (0.000532*2830)/0.5 = 3.01
で、3mmくらいになるはずです
実際、目安の定規と比較するとそれくらいになっています

レーザーモジュールさえちゃんとした性能のものがあれば、他は特に特殊なものはないので、結構簡単にできる遊びだと思います

2014年9月15日月曜日

strtokっぽい関数

C言語のstring.hにはstrtokという関数があって、文字列を指定した区切り文字で分割することができます
しかしこの関数では区切り文字が連続した場合、その部分をまとめて次のデータに飛んでしまいます
この場合、CSVのヌルデータ等は正常に処理できません
ということでそのような連続した区切り文字が存在する場合も次に飛ばないような関数を作ってみました

#include <stdio.h>
#include <string.h>

char *strtoks(char *s1, const char *s2) {
    static char *str = 0;
    register int i, j;

    if (s1) {
        str = s1;
    } else {
        s1 = str;
    }
    if (!s1) { return(0); }

    j = strlen(s2);

    while (1) {
        if (!*str) {
            str = 0;
            return(s1);
        }

        for (i = 0; i < j; i++) {
            if (*str == s2[i]) {
                *str++ = 0;
                return(s1);
            }
        }

        str++;
    }
}

char *strtokc(char *s1, char s2) {
    static char *str = 0;

    if (s1) {
        str = s1;
    } else {
        s1 = str;
    }
    if (!s1) { return(0); }

    while (1) {
        if (!*str) {
            str = 0;
            return(s1);
        }

        if (*str == s2) {
            *str++ = 0;
            return(s1);
        }

        str++;
    }
}

int main(int argc, char *argv[]) {
    char str1[] = "10,20,30,,50,60,,,90";
    char str2[] = "10,20,30,,50,60,,,90";
    char str3[] = "10,20,30,,50,60,,,90";
    char *p;

    printf("strtok\n");
    p = strtok(str1, ",");
    while (p) {
        static int cnt = 0;
        printf("%d:\"%s\"\n", ++cnt, p);
        p = strtok(0, ",");
    }

    printf("\nstrtoks\n");
    p = strtoks(str2, ",");
    while (p) {
        static int cnt = 0;
        printf("%d:\"%s\"\n", ++cnt, p);
        p = strtoks(0, ",");
    }

    printf("\nstrtokc\n");
    p = strtokc(str3, ',');
    while (p) {
        static int cnt = 0;
        printf("%d:\"%s\"\n", ++cnt, p);
        p = strtokc(0, ',');
    }

    return(0);
}

上記のstrtoksとstrtokcが今回作った関数です
strtoksは複数の区切り文字のいずれかが出てきたらそこで区切ります
strtokcは区切り文字は文字列ではなく文字として渡します そのため若干パフォーマンスが向上します

実行結果は
strtok
1:"10"
2:"20"
3:"30"
4:"50"
5:"60"
6:"90"

strtoks
1:"10"
2:"20"
3:"30"
4:""
5:"50"
6:"60"
7:""
8:""
9:"90"

strtokc
1:"10"
2:"20"
3:"30"
4:""
5:"50"
6:"60"
7:""
8:""
9:"90"

という感じです
strtokではスキップしてしまうところも正常に処理しています
なお、strtoksおよびstrtokcのヌルデータはptr[0] = '\0'となっています
例えば整数型が入っていると仮定し、整数型から変換する関数に渡した場合、場合によっては問題が発生する可能性があります
その可能性が有る場合は最初にヌルデータか否かを確認する必要があります

あと、わざわざ説明する必要もないと思いますが、strtokや上記の関数は受け取ったデータを破壊します
char *str = "123,456,789"; p = strtok(str, ","); とかやらないよーに

2014年9月5日金曜日

STM32F4

STM32F4の生チップを買ったので、とりあえずLチカをしてみました



STM32F401RBTとSTM32F429IITの2種類です

401RBTはF4で一番安いチップ F429IITはF4で一番高いチップ となります
(F4では429の上に439というシリーズが有りますが、RSでは176pinは扱っていませんでした)

/*
蛇足ですが、秋月のQFP176変換基板 コネクタの配置が1.27mmピッチです
つまり2.54mmピッチのユニバーサル基板に乗りません
秋月さん!!!何やってるの!!!!!
*/

さて、扱いやすさで言えば64pinパッケージは非常に簡単です
パスコン6個と短絡1箇所で動作します
アナログ電源(VDDA)すら不要です

次に176ですが、こちらはちょっと手間取りました
パスコンが15個くらい必要です


・BOOT0
これは起動するプログラムを選択します
F1であればBOOT0はGNDに短絡でもいいのですが、F4はシステムROMにUSB接続プログラムが書かれているため、BOOT0をH BOOT1をLにする場合があります
ということでBOOT0は47k程度でプルダウンとしておきます
もちろんST-Link等のデバッガを使う場合はその限りではないので、BOOT0をGNDに短絡しても構いません

・BYPASS_REG
このピンは内蔵されたレギュレータのON/OFFを行うようです
レギュレータ止めてどうするんだよ… と思いますが、その場合は外部電源でコアを走らせることができるようです
で、内蔵レギュレータを使用する場合はBYPASS_REGをLにします
Hにすると停止です

・PDR_ON
このピンも電源周りのようです
DISCOVERYの回路図を見るとGNDに落ちているので、これを真似ることにします

・NRST
リセット端子です
例に漏れず負論理なのでプルアップで処理します… といいたいところですが、オープンで問題ないようです
これは内蔵プルアップ抵抗(min30/typ40/max50)で釣り上げられているためです

・VCAP
64pinではVCAPが1本 それよりも大きいパッケージでは2本あります
これは内蔵レギュレータのコア側のパスコンのようです
データシートには2.2uFと0.1uFの接続を指定されています
とりあえず2.2uFを使用しています

・VREF+
ADCのリファレンス電圧だと思います
なんか別にも使われてる気がしますが、そこまでまだ調べていません
これはVDDAに短絡させています

・VSSA
アナログ電源のGNDです とりあえずVSSに短絡しています

・VDDA
アナログ電源です この電源はかなり綺麗にする必要があるようです
とりあえず47Ωと47uFでLPFを形成していますが、本来はインダクタとかを使ったほうが良いと思います

・VSS/VDD
電源です
各VDD・各VSSは内部で接続されています
なので最低限動作させるだけであれば1組のVDDとVSSに適当な電圧を入力すれば動作します
しかしダイとボンディングワイヤで接続されているだけなので、抵抗値はそこそこ高いようです
なのでQFP176で例えれば136のVDDに3.3Vを入れて、36のVDDからLPF経由で39のVDDAに入れる ということをするとドロップ電圧が無視できません


確実に動作させるコツは「確実な電源ライン」です


それとソフトウェア的なことですが
Cubeの出力するファイルにはSTM32F401RBTに使えるスタートアップコードがありません
とりあえずSTM32F401RETのバイナリを焼いています
またCubeが生成したLDファイルでは配置があまりよろしくないようです

この辺りは追々修正することを期待するか、自前でなんとかする必要があります



F401RBTやF429IITは結構扱いづらいです
QFP176なんて簡単に扱えないですし F401RBTは正直機能が… という感じがします

個人的にはSTM32F415RGTあたりが使いやすそうな気がします
QFP64なので簡単に扱えますし、内部ペリフェラルも豊富です