2011年12月31日土曜日

大きな桁数の足し算

最近生活リズムが乱れまくってますね…

ニートなんてこんなもんです(キリッ

ごめんなさい...


とりあえず 大きな数値同士の足し算をする関数
第一引数に最初の数値を
第二引数に次の数値を
第三引数に結果を
戻り値に結果の桁数を
という感じ
ムダな処理とかもかなりあるけど
PCで動作確認だけする予定だったので
移植性とか全く考えてないんですよ…
だってPICで1000桁同士の足し算とかやらないじゃないですか…

とりあえず「結果の桁数がintに収まる程度」までは計算できると思います
(実際問題として配列とかの最大数の問題があるので intの最大数までの計算はできませんが)

引数はすべて文字列へのポインタです
最低限の条件として
第一引数長 < 第三引数長 && 第二引数長 < 第三引数長
である必要があります

処理としては
文字列長獲得

文字列前後反転

文字列から数字を抜き出して足し算

文字列前後反転
という感じです

戻り値がintなので
例えば文字列の中に数字以外が含まれていたらEOFを返して終了
とかにしてもいいかも

このコードはけっこームダが多い気がするので
実際には使わないが吉と思いますけど
一応書いておきます
デカイ数字を扱うのにこういう方法もあるんだよ~
という一例として


int add(char *text1, char *text2, char *text3) {

char
*text1p, *text1q, *text1c,
*text2p, *text2q, *text2c,
*text3p, *text3q,
ca, cal = 0;
int i;

for ( text1p = text1; *text1p != '\0'; text1p++ ) ;
for ( text2p = text2; *text2p != '\0'; text2p++ ) ;

text1c = text1p;
text2c = text2p;

*(text1p--) = '\0';
*(text2p--) = '\0';

for ( text1q = text1; text1p > text1q; ) {
ca = *text1p;
*text1p = *text1q;
*text1q = ca;
text1p--;
text1q++;
}

for ( text2q = text2; text2p > text2q; ) {
ca = *text2p;
*text2p = *text2q;
*text2q = ca;
text2p--;
text2q++;
}

for ( i = 0; ; i++ ) {
if ((text1 + i) >= text1c && (text2 + i) >= text2c && !cal) {
*(text3 + i) = '\0';
break;
}
*(text3 + i) = (
((text1 + i < text1c) ? (*(text1 + i)) - '0' : 0) +
((text2 + i < text2c) ? (*(text2 + i)) - '0' : 0) +
cal);
if (*(text3 + i) >= 10) {
*(text3 + i) -= 10;
cal = 1;
} else {
cal = 0;
}
*(text3 + i) += '0';
}
text3p = text3 + i - 1;
text3q = text3;

while (text3p > text3q) {
ca = *text3p;
*text3p = *text3q;
*text3q = ca;
text3p--;
text3q++;
}

return i;
}


とりあえず
この程度の桁数なら「数世代前」のPCでも一瞬で計算できます
まぁ… あたりまえっちゃー当たり前なんですが
PCはC2Q RAM8G Win7Ux64

※画像はCで作った「コマンドライン引数で与えられた数値を足してstdiutに出力する」というコンソールアプリをC#で呼び出してGUIにしているものです


お世辞にも綺麗と言えるコードではないですけど
AOJでトップランククラスのコードだとどういう風に扱ってるんでしょ
まずテキストで扱うということはしてないと思うのですけども…


↑のコードは上記PCでVisual C++ 2010を使って作成したものです
またGUI部分はVisual C# 2010で作成しました



/* 今年最後の1日は「彼女はつっこまれるのが好き!5」を読みながら開始しました
  どんな一日になるんだろう
  とりあえず宇宙へのパスポートを読みながら寝ようかと思いつつ */

2011年12月30日金曜日

今更ながらに


Apple Wireless Keyboard いいですね
MacはUSとJISが共存できるということで
JIS買いました
買ってから気づいたのだけど Winで言う半角全角キーが無いじゃん(´・ω・`)
Boot Campで使いやすいと思ったのに><


さて
今更ながらに腐女子彼女コミック5を読みました
1,2,3,4は某ハードの電子コミックだったので いずれ買い揃えます

映画版腐女子彼女はあまり好きじゃないのですけど
コミック版は読んでて2828が止まりませんね
(某主要キャラと共通点があるというのもあるんですけども)

それと 32GBのSDカードも買っちゃいました
C10です Amazon FFP
C10早いっすね
体感的にはあまり変わらないけど 処理的には早くなってる

ちなみに C10というのは クラス10のことで
4/6/10があります(他にもあったかな?
これは転送速度の事で
C10なら
「最低10MByte/secを保証しますよ」
と言うこと
勘の良い人なら気がつくかもしれないけど
「保証しますよ」というだけで「限界ですよ」じゃないんですよね
なので 某メーカーとかだとC4のくせにC10と同等の速度が出てるとかもあるらしいです
(もちろん保証値じゃないので相性とかいろいろな問題がありますが)

僕のデジカメで4k3kの画像が2.6Mbyte位なので
C10だと1秒間に3枚くらいは記録できる
ただし今度はデジカメの性能が追いつかないので 実際は秒1枚程度です

SDHCで秒7コマ 3k4k以上 というのはどういうふうな仕組みになってるんでしょ
バッファでもあるのかな?


と、言うことで
Amazonから本が来て積み本が増えました
という報告でした

ビット長と最大数の関係


みずらいけど 各ビット長での符号あり/なしの最小値と最大値の表

Excelの内部計算がIEEE 754だから 36bitくらいまでしかちゃんと表現できない
どうやったらちゃんと表現できるだろうね
一番手っ取り早いのは頭で倍々して行ってメモ帳とかで打ち込むのかw

とりあえず計算方法

符号あり最小値:((2^(ビット長 - 1)) * -1)
符号あり最大値:((2^(ビット長 - 1))-1)
符号なし最小値:0
符号なし最大値:((2^(ビット長))-1)
という感じ

符号ありは1bitが符号に割り当てられるので使えるビット長-1の長さが実際に使える範囲です
符号なしは2進のn乗を計算して1減算するだけです



#ifdef nonsns

掛け算とか割り算って 足し算とか引き算を繰り返すだけだから
数百桁の足し算とか引き算をできる関数を作ってやれば
128bitの最大値とかも計算できるだろうけど
足し算引き算掛け算割り算をする関数を作った所で
使い道が無いのが欠点だよね
超大規模な予算とか
天文学的数字の計算にしか使えない

Cで書いて
アセンブラに移植して
「PIC アセンブラでも1.8446744e+019位余裕で扱えます!」
とか? いらねぇよ…

#endif

とりあえずIEEE 754 と言うか 浮動小数点数とかが まだよくわかってないから
そこら辺も勉強し直さねば

Amazonから本とかいろいろ来て積み本もどんどん増えてるし...

とりあえず


プログラミングの何がめんどくさいって扱える数字がめんどくさい
この表だと0bitが左だからなんか見づらい

多分作りなおす


さて
「128bitCPU」とか
ぐぐればいろんな記事が出てくるけど
個人的には128bitCPUなんてどうでもいいからlong long longみたいな変数に対応して欲しい
long longがlongの倍ならlong long longで128bit変数
みたいな

charは環境によって違うみたいね
HI-TECHだと「普通はunsignedだけどコンパイラオプションでsignedだよ」みたいなこと書いてあるから
可能であれば明確的に指定すべきかも
他の人にコードを渡す場合とか
コンパイラを変更した時とか 移植したときに
問題が出るかもしれないし

いちいちsignedを指定するのはめんどくさいけど
保守性とかから見れば 多少は
有効かと

組み込み用の石だと符号ありと符号なしでは実効速度が違ったりとかする場合があるから
そういう意味では組み込み開発者はちゃんと区別するべきなのかも

PIC16F88で4096個のパルスを出力するコードとか 大変だったなぁw
(時間制限がキツイからfor(int i = 0; i < 4096; i++) { }とかじゃ遅すぎる)
結局charのネストでも重くて
結構無茶なコード書いた気がする

TLC5940を制御するだけなのだけどね…
Arduinoだとライブラリがあるけど
PICは探して出てくるほど多くなかったから
気が向いたら修正して公開するかも

2011年12月28日水曜日

文章は難しいorz

とりあえずビットとかバイトとか変数とかそこら辺を説明できる文章をつくろうと思って
まずExcelで表を作って ついでに文章をつくろうとしたけど
ExcelじゃテキストはめんどくさいのでWordを起動

までしたはいいけど やっぱいきなり書き始めるのは無理があるねorz


とりあえずビットバイト変数他の解説だけしたいのだけど
「そーいやこんな本あったよなぁ」って

「コンピュータープログラミング入門以前」という本です
(9784839936914)


まーCMOSとかから説明してますけど


とりあえずこれと「CPUの創り方」を読んでおけば大体は理解できるんじゃないかなぁ
とむちゃぶり


でも CPUの創り方は神がかってます
あれは読んでおいて損はない




でも
実際に文章を書くためにVisualC++(中身はC)で色々コード走らせてみて
色々と新しい発見がありました


覚えるより慣れろ とかですかね(←理論後回しにして痛い目に会った人)




とりあえず ビットとか バイトとか そう言うの知りたかったらてきとーに本屋で立ち読みしてみてください。。。




変数の説明するにはバイトとかビットが必要で
ビットの説明するにはデジタル回路の説明が必要で みたいな感じで
どんどん増えていくんですよ 内容が


変数とかポインタとかそういうのも多少は理解しているつもりでも
説明できるわけじゃないんですよねぇ

2011年12月26日月曜日

ロケット!

WinXPの実機が欲しいということで 
かなりジト目になりながらCeleronシングルコア2.4Gマシンを起動してみたら
かなり懐かしい(&思い出の?)ファイルが出てきました
ええ 即バックアップです
このHDDフォーマットしたくないなぁ…
今時IDEのHDDなんて入手できるの?


というのが今日一日のやったことでした
大したことしてませんね


さて 今回はロケットです

ロケットといえば2005年のロケットボーイズとかほうかごのロケッティアとか
ラノベ的にもオススメな作品が多いですが

自分でロケットを作るとなるとどのような選択肢が有るでしょうか?
とりあえず思いつくのがペットボトルロケットとかモデルロケットです
ハイブリッドロケットを個人作成とかは あまり聞かないですかね

とりあえずソフトウェアで缶サットとか飛ばせるロケットを計算したところ
総重量8kgとかになりました 全長180cm無いんですけど…
ちなみに水ロケットでトリプルタンク 1.4L水を入れた時 という計算
缶サットやアビオニクス系も含んでいます

しかし 空気圧で8kgも飛ばすというのはなかなか大変ですね
ロケットというからには自重の6倍くらいの推力が無いと辛いか
36kgf?
無理ッス...
イヤっす...

miniCAMUIとか気になるんですけど
あまり情報がでてこないんですよね
と言うか実験自体あまりやってないのか

缶サットだけじゃなくアビオニクスとかの実験もしたいので
実験コストが1000円/回以下くらいがいいんですけどもね
機体も1機あたり5000円くらいにならないと遊べないしなぁ

モデルロケットという選択肢も有るんですけど
北海道だと全てにおいて入手性が悪いので
結局選択肢に入らないんですよねぇ
エンジンとか売ってないですし 機体の材料とか売ってないですし

それに値段も高いですし
A8-3が1700円(←僕が初めて買ったときは1500円だった)
ESTESの直販だと日本円にして800円ですからね
倍以上ですよ しかも「個人輸入は禁止^^」ですからね


そうなるとペットボトルロケットくらいしか選択肢が無いんですよね
ペットボトルロケットは モデルロケットよりは入手性がいい(通販ページがちゃんと機能してる)んですけど
それでも3タンク1段式が限界になるんですよ
ある程度ペイロードつもうと思ったらクラスタとかブースターとかが必要になっちゃうし
ソ連方式でやりますか...



ということで
今回は愚痴に終わりました
最近は何も進んでないんですよorz

2011年12月20日火曜日

缶サット 途中経過 3

さて…
お久しぶりですm(_ _)m

まず先日行われたCSWおよびSNSのロケットの感想から
16日は夜間打ち上げでした
動画ははなから諦めてノイズ出まくりのカメラでバルブ撮影しました
(バルブモードなんて無いのでシャッター15秒ですけど)

写真は案の定ノイズが酷いですが結構良い感じに撮れました
某HPにも紹介していただいたので物好きな方は調べてみてください

(しかしISO1600だとノイズが酷いしバルブができないので
 デジイチが欲しいと思う今日この頃
 8万くらいのでいいのがあるけど
 今回は完全に自腹になるのでなかなか買えない
 まず家電量販店すら無いから現物が見れないというのもあるけど)


さて 翌17日はCAMUI2機とSNSの「ゆきあかり」の計3機になります

CAMUI2号機の詳細を忘れてしまいましたが

CAMUI3号機には北海道工業大学の缶サットが搭載されていたみたいです
缶サットキャリアが見当たらなかったので直接搭載したみたいですが
自律飛行&通信試験などをしていたみたいです
距離的にXBeeProかな?
(別物の可能性もあるけど去年がXBeeだったし)
後から動画を見るかぎり物凄い回転してたので
自立は難しいみたいです...
(僕の缶サットも自律飛行させる予定ですが やめよっかなぁ… 自立)

それと今回CAMUIやゆきあかりには通信モジュールが搭載されていて
ダウンリンクには飛行状態を
アップリンクは確認だけ
という感じで通信試験をしていたみたいです



ちなみに今回の打ち上げから電光掲示板が導入されました
1文字がA3サイズ(30cm×42cm位の大きさ)で
それが5セット("+n:nn")です
しかし 今回報道等は550mの安全距離を設けているので
約380m程離れた距離にありました
…見えるわけねぇよ...

一応12倍の双眼鏡を使うとギリギリ判別できるんですけどね…

これは今後の課題ですね
まぁあと1年もすればかなり改善されてると思います 期待(((



ということで つらつらと16/17日の出来事を書きましたが
他にもいろいろ書きたいことがあるけど自重しておきます



さて おまけ本題

缶サット 進展なしです
全く進んでません

とりあえず前に書いたARMですが
STBeeとSTBeeMiniがあります
まずはMiniの方でちょっと遊んでみようかなという感じ
ストロベリーリナックスの環境を使って
(マイコン徹底入門の方は全くわからない)

Miniは32本のIOがある(実際にはボードの関係でもうちょっと少ない)ので
まずはGPS/加速度センサ/角速度センサ/温度計/XBee位を積んでみようかなぁと
I2Cの大気圧センサは使い方がよくわからないので放置...
サーボはPWMがなさそうなのでタイマ割り込みでソフト実装するにしても
まずは自分の位置がわからないことには誘導できないので

とりあえずこんなところです
来年夏くらいには完成してればいいなぁ…

2011年12月9日金曜日

佐川の荷物紛失+その後

僕のTwitterを見ていた人はなんとなく知ってるかもしれませんが
思い出しつつまとめます

あらすじ
amazonで注文した荷物がいつまでたっても届かない
いい加減気になったので佐川に聞いたら荷物を紛失したらしい
探すと言われて待ってたらamazonが同じ物を再発送してくれた
そしたら翌日 最初に発送した荷物が届いた
んで更に最発送したものが届いて
アカウントサービスに連絡したら amazonまで送り返してください とのこと
ということでその旨を佐川の人に言ったら持ち帰ったのだけど
また持ってきた ←イマココ


↓の表はPagesで作ったので 色々とご了承下さい


2011/12/01
amazonから最初の荷物が2個発送される
1
同日
ステータスが“お近くの配達店まで輸送中です“になる
1
2011/12/04
2日に発送されたほかの荷物1個が到着する
1
2011/12/05
ステータスが変わらないので佐川に連絡 午後3時半頃
(4時半頃再度連絡をくれとの回答)
1
同日
4時半頃再度電話 先ほど出た人が帰ったらしいので違う人が対応
曰く「伝票が剥がれた等の理由により追跡不能 現在捜索中」
仕方ないので分かり次第配送先の電話番号(自宅)に電話してくれと伝言
1
2011/12/06
amazonから同商品を最発送するとの連絡がメールにて届く
2
同日
amazonが商品を発送
2
同日
最初の発送分のステータスが“札幌白石区”になる
1
2011/12/07
最初の商品が到着する
無事受け取り完了
1
同日
amazonカスタマーに1個目が届いた旨を報告
その際「返送してくれればこちらで受け取る」との指示を得る

2011/12/08
2個目が到着する 指示通り返送するように言う
2
同日
ステータスが”受け取りを拒否されました”になる
2
同日
再度荷物を持ってくる
2


現状このような感じです
さて今日どうなるか…
しかし佐川の手違いで色々ややこしいことになってるのに
こっち側が悪いみたいな表示は嫌だなぁ…

通販は便利だし
家電量販店すらないようなところに住んでる身からすれば
どんなものでも3日で届けてくれるのはありがたいのだけど
それが当たり前 じゃなくて 問題が起きるというのも自覚しておかないとダメですね
原発の安全神話じゃないですけど
安くて便利だけどどこかに落とし穴がある
まだ今回の落とし穴は落ちてる途中という感じがするので
ちゃんと底に着地できたらもう一度報告します

2011年12月5日月曜日

Media Centerで電波レベルを確認する方法【メモ】

メモ
Media Centerで電波の受信レベルを確認する方法
まずMedia Centerが起動している状態から
最後にPCの環境が書いてあります

1. 「Extras ライブラリ」をクリック


2. 「TVチューナーの設定」をクリック


3. 「アンテナ受信確認」をクリック


4. 電波(地上or衛星)を選び「テスト」をクリック

そうすると電波状態が表示されます
30以上あれば文句ないのかな?

ただ基地局との距離が10kmとか有ると
雪が降ってる時と降っていないときの違いがものすごくて
降っているときに合わせると降っていないときに過剰になってしまう

利得調整が屋外のブースターなので
天気に合わせて調整というのもめんどくさい
どうしたものか…
「ブースターで最高まで上げて手元でレベルを落とす」
とかでもいいかもしれないけど うーん...

とりあえず メモということで


PC環境
Win7Ux64
CPU:C2Q @ 2.66GHz
RAM:2GBx4 8GB
チューナー:IO-DATA GV-MC7/VZ
アンテナ:YAGI 地上デジタルアンテナ
ブースター:YAGI DSU35M
(上記3リンクはamazonアソシエイトリンク)

地デジ環境改良+衛星放送環境構築

モーパイがBS11で放送されるということなので
衛星放送を受信できる環境を構築しようと思いました
ついでにチューナーの特性上ブースターが必要なようなので
地デジにも対応したブースターを買いました
結構高いっすorz

そして
地デジはブースターを通して見れるようになりました
めでたしめでたし

さて 衛星放送
これが
Twitterを見てる人は知ってると思いますが
衛星アンテナが運送業者(佐川急便)の手違いで紛失されました
現在追跡して探しているようですが
うーん… どうしたものか
YACの教材資料で
中華鍋で衛星放送を受信するというのがありましたね
傘で衛星放送を受信してみますか…

とにかくモーパイが始まるまでに衛星環境を構築しないとダメなので
少なくとも今月中旬までには届いて欲しいところ
間に合わなかったら近くの電気屋でアンテナを買ってきて
amazonからは代引の受取拒否するか…
とも考えているのですが

支払い方法で3回くらいやり直ししたり
今回はいろいろ大変だ……


/* ****** */

PCの方
とりあえずメモリ4本さした状態で起動してますが
一応動いてます
ただ時々グラフィックドライバが落ちますが
なんなんでしょうかねぇ…
グラボとMedia Centerの相性が悪い?
地デジチューナーの環境を満たしてないから?