春鳥 -ハルドリ-

2006年7月

2006-07-31(MON)

ロボ

何日目だっけ?タイトルが5日目なのが2つあるから、きっと9日目。

横振りけん玉の改良をしました。先生のアイデアでUの字というか、Vの字というか……そんな感じで腕を振らして玉をカップに入れるという風に。水平振りのときの最高が4回連続成功だったのに対し、V?字振りでは12回連続成功という快挙を成し遂げました。

近頃、1号機ばかりに力を注いでいます。今年メインとなるはずの2号機には何をさせればいいんだろう。

2006-07-30(SUN)

gconf-editor

GNOMEの設定エディタをインストールしました。これを使うとデスクトップに表示されている「ごみ箱」などのアイコンを消すことができます。FC5をインストールするときに見落としていたのかずっと入れていなかったんですよね。これでデスクトップがスッキリしました。

2006-07-29(SAT)

春鳥は更新への意欲が眠気を上回ったときに更新されています。

今月は更新を休みがちでしたね。書くことがあっても眠いと筆が進まんのですよ。

では、昨日のできごと。サーボがプルプル震えるハンチングという症状は、サーボの設定を変えることで解決できると知った一昨日。しかし、サーボとパソコン、そして電源を繋ぐために必要なケーブルが無いのであった……。で、ハンダごての使用もやむを得ないとか考えていたんですが、1号機の問題のサーボを2号機の基板に接続して、2号機用のソフトから設定を書き換えることで解決。設定はロボ本体の基板に保存されるのかと思ってたら、サーボ自体に記録されました。上半身の他のサーボたちも同じ設定をしておいた方が良いみたいなので、1号機の残りのサーボとついでに2号機にも。それから、もう一度1号機のホームポジションの確認。ここで衝撃の事実が発覚しました。フトモモと胴体を繋ぐ金具が前後逆。見た目自然過ぎて気がつかなかった……。これを直したことによって若干重心が変わったような気がします。

ここまでやったところで、1時間ほど数学の時間。そしてロボ再開の前に、体験入学の参加賞のようなものとして、256MBのフラッシュメモリを貰いました。使い道としては、パソコンに差しっ放しにしておいて、Linux、Windows間でのデータ共有に使おうかと考えています。LinuxからWindowsは見られるけど、WindowsからLinuxは見られませんからね。などと考えつつひとしきりワクワクしたところで、1号機に昨年のけん玉用カップを装着し、今年もできるかどうか確認しました。縦振りは、玉が入るところで腕を少し上に上げるよう調節することで成功するようになりました。横振りはイマイチな感じです。その後、カップに入った玉を排出する動きを作り直している間に帰宅の時間。排出の動きはかなり気合いが入ってます。これがロボ7日目。

ようやく、今日の話。14時頃からゲド戦記を見に行くということだったので、1230起床。ゲド戦記を見終り、散髪屋に行って髪を切り、家に帰ってパソコンを起動するとエラー画面が。昨日貰ったフラッシュメモリを使うために/etc/fstabを編集した時、余計な所まで書き換えたのが原因でした。具体的には、1行目の「LABEL=/1」ってなってたのを「LABEL=/」に。パソコンを起動すると復旧を促すメッセージが表示され、rootでログインできるのですが、ディスクがリードオンリーになっていてfstabの書き換えができない。なので、KNOPPIXに頑張ってもらい、亊無きを得ました。KNOPPIXは頼りになりますね。

2006-07-27(THU)

先週から土日以外こんな生活。

箇条書きのようで箇条書きでない文章たちで今日の一日を綴る。

8時30分起床。テレビを見ながらダラダラ着替えたり、朝ご飯食べたり。準備が出来次第、学校に向け出撃。途中コンビニでお茶とおにぎりを購入。10時丁度に学校着。寄り道せずに武道場へ。人が来るまで着替えたり、窓を開けたり、素振りをしたり、準備運動したりしながら待機。今日は30分待ち。ようやく部活開始。防具をつけた練習の後は、剣道形の練習。12時半頃部活終わり。ロボの元へ。

とりあえず、昼食。昼食後、今日から始めることになった追試のための数学の勉強。時々先生に見てもらいながら、1時間くらい。そして、ロボ6日目。1号機、2号機を一度に接続できるように、家から持参したUSBハブを本番で使う予定のノートパソコンへ取り付け。ロボの設定ソフトをノートにインストールした後、今まで使っていたパソコンからモーションデータ等々をコピー。動作確認。作りが雑だったのか、はたまた酷使しすぎたのか、1号機の様子がおかしいので、ネジを締め直したり、脚を取り付け直したり、物差しを駆使しながらトリムの調整をしたり。時間をかけたおかげで、標準のホームポジションデータで安定した直立を実現。昨年から問題のあった左肩はハンチングという症状であることを知る。これはサーボの設定で解決できるとか。しかし、差し込み口の合うケーブルが見つからず、明日1年ぶりのハンダごて。2つのケーブルから1つのケーブルを合成する予定。ということにして今日のロボ終了。15分くらい先生とプログラムの話。大きなデータを扱うときはメモリのヒープ領域を使うということを教えてもらう。18時45分下校。

帰宅。夕食。Web巡り。流石に疲れたのでプログラミングは休み。11時50分日記を書きはじめる。予定より遥かに長くグダグダに。25時最後の段落が書き終わる。お疲れさまでした。

2006-07-26(WED)

ロボ5日目

ぎこちない横歩きを覚えさせました。もっと、カサカサした動きをさせたいです。

直したり、試したり

ファイルの頭にヌル文字は、先生に聞いてみるとアリらしいです。さらに、strcpy(outs,"\0");outs[0] = '\0';に直してもらいました。

家に帰ってから、空の配列がどうなっているのか確かめるため、


#include <stdio.h>
int main()
{
    char str[10];
    printf(str);
    return 0;
}

というのを作って試してみることに。結果は、Fedora、Windowsともに怪しい文字列が表示されました。これはこういうモノなんだということを理解。

ついでなので、Windowsでも昨日のプログラムの動作を確認しました。これも相対アドレスで指定しないとエラーが出ましたが、それ以外特に問題なく動くようです。コマンドプロンプトでの日本語入力は、Alt+半角/全角 漢字であることを初めて知りました。

そういえば、昨日のでは、最後の行に文字列を入れられないですね。その辺りもどうにかして直したいです。

2006-07-25(TUE)

ロボ5日目

ジャンプのようなものができるようになりました。動画を撮影して検証しなくては、わからないくらいの数mmのジャンプです。

指定した行に(以下略

心配な所もあるけど、一応できたから、全部公開。解説やらコメントやらは下に書いてます。


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

int main(int argc, char *argv[])
{
    FILE *in, *out;
    char bak[20];//.bakファイルの名前
    char name[20];//出力ファイルの名前
    char str[100];//挿入する文字列
    char buf[256];//入力ファイルの1行
    char outs[102400];//出力ファイル
    int i,c,line,j=1,nl=0;

    for(i=1;i<argc;i++){
//.bakファイルの作成
        strcpy(bak,argv[i]);//配列bakに入力ファイル名をコピー
        strcat(bak,".bak");
        out = fopen(bak,"w");
        if(out == NULL){
            printf("出力ファイルのオープンに失敗しました。\n");
            return 1;
        }
        in = fopen(argv[i],"r");
        if(in == NULL){
            printf("入力ファイルのオープンに失敗しました。\n");
            return 1;
        }
        while ((c = fgetc(in)) != EOF){
            fputc(c, out);
            if(c=='\n')
                ++nl;
        }
        fclose(in);
        fclose(out);

//指定した行に任意の文字列を追加
        in = fopen(argv[i],"r");
        if(in == NULL){
            printf("入力ファイルのオープンに失敗しました。\n");
            return 1;
        }
        strcpy(name,argv[i]);
        if(i==1){
            printf("書き加えたい文字列を入力してください。\n");
            fgets(str,sizeof(str),stdin);
            //stdinでキーボードから文字を読み込み
            printf("何行目に書き加えますか?\n");
            scanf("%d",&line);
            if(line >= nl)
                printf("行はそんなにありません。\n");
        }
        strcpy(outs,"\0");//出力ファイルの頭にヌル文字をコピー
        while(fgets(buf,sizeof(buf),in) != NULL){
            if(j!=line)
                strcat(outs,buf);
            if(j==line){
                strcat(outs,str);
                strcat(outs,buf);
            }
            j++;
        }
        fclose(in);
        out = fopen(name,"w");
        if(out == NULL){
            printf("出力ファイルのオープンに失敗しました。\n");
            return 1;
            }
        fputs(outs, out);
        fclose(out);
        }
    return 0;
}

関数化するのは気が向いたら頑張ってみることにします。それでは、解説。出力ファイルの大きさは100KBまでです。もっと小さくて良いような気もするけど、念のために気持ち大きめで。複数ファイルのときは、すべて同じ行に同じ文字列が追加されるようになっています。そして、日本語にも対応。絶対アドレスでファイルを指定するとエラーがでるので、相対アドレスでしていするといいようです。例えば、$ ./a.out ./2006/2006_07.htmlのように。ディレクトリの中のファイルをまとめて書き加えたいときは$ ./a.out ./2006/*でOKです。

続いて、心配なところ。strcpy(outs,"\0");で、出力ファイルの頭にヌル文字を入れています。こうしておかないと、strcatで文字列を出力ファイルに追加したときに、1行目の先頭に文字化けしたようなモノが入ってしまうからです。何も入れていない配列の中には何かわけの分らないものが入っているんでしょう。きっと。だから、ヌル文字なんだけど、ファイルの頭にヌル文字が入っていてもいいものなんだろうか。でも、ちゃんとファイルは出力されているしなぁ。outsに文字を入れるところで、1行目のときにstrcpyで次の行からstrcatにしてもいいけど、行数が増えるんですよね。まぁ、今のところ問題はないから、良いということにしておこう。次は、文字の置換です。

2006-07-24(MON)

ロボ4日目

動きを作るソフトが新しくなっているので、手を振らせたり、しゃがませてみたりと簡単な動きで操作になれることにしました。動きのループができるようになるなどして、アイデア次第で動きの幅が広がりそうです。

2006-07-23(SUN)

海賊映画

面白かったけど長かった。前作見てない人や忘れた人はDVDを見て予習復習をしてから行ったほうが良いです。

それにしても、ポケモンの人気は凄まじいなと、親子連れの列を見て思いました。

久々の続き

「指定した行へ任意の文字列を挿入する」はできました。後はどうやってこれをファイルに出力するか。

状況としては、配列に「入力ファイルの指定した行へ任意の文字列を挿入した文字列たち」を格納。で、これを入力ファイルと同じ名前にして出力したい(上書きしたい)わけなのだけれども、r+(読み込み+書き込みモード)にすると、追加書き込みと同じ(「元の文字列たち」+「入力ファイルの指定した行へ任意の文字列を挿入した文字列たち」)になってしまい失敗。だったら、w(書き込みモード)で入力ファイルと同じ名前のファイルを作って出力すれば、ファイルを上書きしてくれるんじゃないか、と考えて色々試しています。しかし、これもどこかを書き間違っているようで、挿入した文字列だけが書かれたファイルが出力されて失敗しています。

前回の考えとは違い、今回は出力ファイルの文字列を一旦すべて配列に入れるようにしました。これだと、ハードディスク上には書き換えられたファイルとバックアップファイルの二つしかできませんし、「バックアップファイルを作らない」という選択もできるようになる……かもしれません。

2006-07-21(FRI)

ふはは!見ろ、川がみそ汁のようだ!

雨降り過ぎですね。

ようやくロボ本体が完成しました。配線を適当に束ねた後、とりあえず、ホームポジションを設定して、サンプルモーションをいくつか試したところで3日目終わり。2日休みで月曜から再開です。手間をかけて設定したわりにホームポジションは改善の余地アリですね。前のKHR-1はやや猫背気味だったのに、KHR-2では脚の間接が変わったおかげで背筋を延ばした姿勢で安定するみたいです。

2006-07-20(THU)

ロボ2日目

1日目は、各サーボへ金属のフレームを取り付け、サーボの初期位置の設定まで進みました。

で、2日目の今日。手を腕に足を脚に。これらと頭部をそれぞれ胴体に連結、背部に取り付けた基板への配線が終わりました。明日中には歩く姿が見られるかもしれません。それにしても、前回よりも製作に時間がかかっているのは気のせいだろうか。

午前中にに部活して夕方までロボ、夜はプログラム作り……といきたいところだけど夜までやる気が続かなくてプログラムが進みません。しかたない、Web徘徊の時間を減らすか……。

2006-07-18(TUE)

オープンソースの中の人

GaaOのドキュメンタリーを見に行ったら、REVOLUTION OSというのを放映中でした。GNUプロジェクトの人やリーナスさんや伽藍とバザールの人等々、オープンソース界の有名人が大集合。動いてるリーナスさんを初めて見ました。なんかスゴクいい人そう。

「GNU/Linux」の読みは、「グニュースラッシュリナックス」で、「/」の部分も発音するんだなーと、本編と微妙に関係ない所が印象に残りました。

2006-07-17(MON)

ただいまー

個人戦は一回戦負けでしたよ。15、16日の事は携帯からBBSに書き込んでいたので気になる人は見てください。明日辺り日記に書き加えるつもりではありますが。今日はもう疲れました。

さて、8月になったら剣道三段の昇段試験があります。そんなわけで、水曜日から再び練習を始めることになりました。さらに、今年もロボットのお手伝いをすることになっているので、午前中に部活をやって、終わり次第ロボへ向かうという感じになると思います。

2006-07-16(SUN)

団体戦

5試合中2試合出場しました。結果は2敗。

1試合目は延長戦で胴を抜かれ、2試合目はあっという間に2本負け。

ところで、強い学校同士の試合を見ていると、僕らと動きが全然違うことに驚きますね。やっていることは同じなのに、ウチの学校とは別の競技をしているようで少し感動しました。

わかりやすく(?)例えるならば、ワールドカップの日本代表戦を見た後で、決勝戦を見た時のような感じ。

強い所は練習量から違うんだろうなぁ。

2006-07-15(SAT)

暑い……

試合場につきました。早く着き過ぎたため、今は皆で談笑してます。

今日は、この後一時間ほど練習があって、16時頃宿泊先へと向かう予定。試合は明日から始まります。

とにかく、暑い。

僕はバスの中~

練習終わりました。後10分長引いていたらやばかったかもしれない……。

それでは、ホテルへ移動します。

ホテル

夕食前の一休み。

エアコンの真正面を確保しました。ただし、この位置からはテレビが見えません。

2006-07-14(FRI)

明日の準備

明日から毎年恒例の2泊3日試合の旅。防具、胴着、竹刀に面タオルは学校で準備済み。バッグには、着替え、タオル、予備の面タオル、ティッシュ、ビニール袋、のど飴、トランプ、財布、筆記用具、MDプレイヤー及びイヤホンをザッと詰め込みました。携帯電話、洗面用具、保険証、昼ご飯は明日の朝に忘れないよう持っていきます。

2006-07-13(THU)

リベリオンが見られなかった人はDVDを借りればいいと思うよ。

ついに、明日から夏休み。とは言っても、土日月と試合に行くから、本格的に休みが始まるのは火曜日以降になります。

今年の夏休みの目標は、最終日までに宿題を終わらせる事と、プログラムを完成させること。インドアーな方向で頑張りを見せます。

2006-07-12(WED)

久々にC

前回の続きから。でも、ちっとも進まないので、考え的なものをざっと紹介。

  1. とりあえず、バックアップファイルの作成
  2. 追加したい行と文字列の入力
  3. fgetsで元になるファイルを指定した行まで一行ずつ読み込み。それと同時にfputsで出力。
  4. 出力ファイルに追加したい一行を書き加え。
  5. 入力ファイルの残りの行を最後まで読み込みつつ、出力ファイルに書き込み。
  6. できあがり。

でも、これだと元ファイル、出力ファイル、バックアップファイルで容量が元のファイルの3倍以上必要だったりするんじゃないかという問題点が。テキストファイルの大きさなんてたかが知れてますけど、もっと無駄の無い動きをさせたいですね。後、出力ファイルのファイル名もどうしようか。3の時点でファイル名は決まっているわけだから、5の作業のことを考えると入力ファイルと同じ名前にして上書きするわけにはいかないし。3で上書きして、5はバックアップファイルを使えばいいのかなぁ。

2006-07-11(TUE)

人類の天敵 in 僕の部屋

背後でバサバサッっていう羽音が聞こえたんです。何事かと思って振り返ったんですね。そしたら、茶色くて大きいのが。壁に。部屋の壁に。一瞬、蛾かと思ったんですよ。いや、むしろそうであって欲しかったんだろうと思います。蛾は虫の中で1、2を争うくらい大嫌いだけど。それでも、その現実を受け入れたくなかったんです。

部屋にゴキブリ。

あぁ、何故。どうして……。今年初遭遇が自室だなんて。食糧なんてないのに。

だからさー、動く度にカサカサいうなよー。何でマンガみたいな音立てるんだよー。僕は君に対して何もしないからさー。そんなに触覚動かすなよー。動かすんだったら、その触覚で出口を見つけてくれよー。壁が登りにくいのはわかったからさー。羽ばたかないで……あの、ホント、お願いします。さっきはタメ口きいてすみませんでした。いや、なんかもう色々とゴメンナサイ。だから、羽を広げないで……。

彼はベッドと壁のスキマで落ち着いたようで出てこなくなりました。僕はいったいどこで寝ればいいんですか。

目が覚めて枕元でいたら泣く。絶対泣く。そんなわけで、モーニングゴッキーだけは勘弁してください。

2006-07-09(SUN)

天気がよかったから

S端子ケーブルを買いました。綺麗になったというのが感じられるくらい綺麗になりました。別のテレビでやっているみたいに画面が明るいよ!

まだ、大神でしか試してないから、他のゲームでどれくらい変わっているのか試してみたいですね。

2006-07-08(SAT)

アマテラスかわいい。

姉が大神を貸してくれました。

映像綺麗、音楽和風。意外とアクションが豪快です。オオカミだけあってジャンプ力がすごいですね。意味もなく飛び跳ねたくなります。ダッシュをすると走った後に花が咲いたりして、これもまた意味もなく走り回りたくなります。

2006-07-07(FRI)

先延ばし

レポート提出は夏休み明けに延期されました。これって良いことなのだろうか。

さて、課題が一段落ついたことですし、プログラミングを再開させたいですね。前回の続きからで、参考になりそうなのは、猫でもわかるプログラミング第19章 ファイル操作 その2の辺り。fprintfを使ってアレコレすればいいみたいです。

よし、今週はよく頑張ったから、明日から再開ということにしよう。

2006-07-06(THU)

今夜から明日未明にかけて

実験のレポートをカリカリと。眠りたいけど、眠るとトンデモナイことになるから終わるまでは眠れません。

某国の事件のおかげ(?)

エースコンバットのBGMがニュースでよく流れていますね。今朝の特ダネ!ではFortress→First Flight→Wardogの三曲が連続で流れていました。夜のニュースでは、早くもZEROの曲が使われているらしいです。

そういえば、今朝はZEROのサントラを買う夢をみました。夢にみる程欲しいのか、自分。それにしても、何かを手に入れる夢から醒めた後の喪失感といったらないですね……。

2006-07-04(TUE)

夏休み前課題祭

今週は月曜:宿題、火曜:レポート、レポート、小テスト、水曜:宿題、木曜:レポート、金曜:レポート、と立て続けに提出物があります。一番大変そうなのは、金曜の実験レポート提出でしょうか。どういう風に書けばいいのやら……。

S

部屋でテレビを見ている時に、今更ながら気がつきました。このテレビ、S端子があるじゃないか。これがあるということは、PS2がより綺麗な映像で楽しめるというわけですね。しかし、ウチにS端子用のケーブルなんてハイカラなモノはありません。

雨が止んだら買いに行こう。

2006-07-02(SUN)

続きの途中

次は、「指定した行に文字列の挿入」というのを。これにはgetsを使えばいいんじゃないかということで、char str[100];を用意して、動きを確認するために、とりあえず、gets(str);puts(str);。そして、コンパイル。すると、warning: the `gets' function is dangerous and should not be used.というエラーが出ました。「getsは危ないから使うな」ということみたいです。

実際、gets(scanf)は使わずfgetsを使う方が良いらしいので、fgets(str,sizeof(str),stdin);という風に。stdinでキーボードからの入力を読み込むことになるようです。おぉ、勉強になるなぁ。

2006-07-01(SAT)

複数ファイル対応

また明日といいつつ、翌日も力尽きていました。しかし、十分な睡眠をとったらあっという間に完成。

そして、なんとなくオープンソース。


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

int main(int argc, char *argv[])
{
        FILE *in, *out;
        char bak[20];
        int i,n,c;

        for(i=1; i<argc; i++){
                strcpy(bak,argv[i]);
                n=strlen(bak);
                bak[n]='.';
                bak[n+1]='b';
                bak[n+2]='a';
                bak[n+3]='k';
                bak[n+4]='\0';
                out = fopen(bak,"w");
                in = fopen(argv[i],"r");
                while ((c = fgetc(in)) != EOF){
                        fputc(c, out);
                }
                fclose(in);
                fclose(out);
        }
        return 0;
}

out = fopen(bak,"w");の前にin = fopen(argv[i],"r");があると、出力ファイル名が何故か文字化けしました。なので、順番を入れ替えて解決。

それにしても、bak[n+1]のあたりはもっとスマートにならないんだろうか。とか思っていたら、文字列を結合するstrcatって便利な関数があるじゃないですか。

strcat(bak,".bak");の1行だけでn=strlen(bak);以下6行が要らなくなりました。どんな関数があらかじめ用意されているのか知っておく必要があるみたいですね。