たいちょーの雑記

ぼくが3日に一度くらい雑記をかくところ

今更改行コードで死にかけたお話

コタツに入っていても手は寒い

何とかなりませんかね?

改行コード

ふと思い立ってC#からbashを起動したくなった。
bashの起動自体は

Process process = new Process();
ProcessStartInfo psi_bash = new ProcessStartInfo();
//設定
psi_bash.FileName= @"C:\cygwin64\bin\bash.exe";
psi_bash.RedirectStandardInput = true;
psi_bash.RedirectStandardOutput = true;
psi_bash.RedirectStandardError = true;
psi_bash.CreateNoWindow = true;
psi_bash.UseShellExecute = false;
psi_bash.Arguments = "--login";
psi_bash.StandardErrorEncoding = System.Text.Encoding.UTF8;
psi_bash.StandardOutputEncoding = System.Text.Encoding.UTF8;

//プロセス起動
process = Process.Start(psi_bash);
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.OutputDataReceived += onBashOutput;
process.ErrorDataReceived += onBashError;

とまぁこんなふうに標準入出力を確保して起動すれば標準入力のStreamWriterに書き込めば次々とbashのコマンドを実行するんですぜ

private void sendToCygwinBash(Process bash) {
    StreamWriter sw = bash.StandardInput;
    if (sw.BaseStream.CanWrite) {
        sw.WriteLine(command);
    }
}
private void onBashOutput(object sender, DataReceivedEventArgs e) {
    outputCommand(e.Data);
}

private void onBashError(object sender, DataReceivedEventArgs e) {
    outputCommand(e.Data);
}

標準出力や標準エラー出力はリダイレクトしてて出力を読み取るたびにイベントが呼び出されるのでそこは楽でした。

問題は入力

上のコードを見ると入力を適当に受け取ってStreamWriterに適当に書き込んでますがなんか出力がへん
入力はls
出力はhomelsした結果が返ってくると踏んでました。

CRNL1

エラーでとるやんけ!

文字化けもしとるやんけ!

この際文字化けはいいですがbashがなんて言ってるのかはだいたい掴めます

ls\rなんてコマンドはないです

さいですか

謎の\r

どこから降って湧いたのか改行コード\rがこんにちはしていますね。
これのせいでbashがコマンドを理解できないでいます。うっとうしい

手始めにコマンドを格納している変数commandにコマンドを格納するときに紛れ込んでしまったとみてReplace

command = command.Replace(System.Environment.NewLine, "");

CRNL1

ダメみたいですね。
ていうかそもそもcommandを出力させてるところに\rが紛れ込んでない時点でここじゃないですね~

ならばStreamWriterかな?

private void sendToCygwinBash(Process bash) {
    StreamWriter sw = bash.StandardInput;
    sw.NewLine="\n";
    if (sw.BaseStream.CanWrite) {
        sw.WriteLine(command);
    }
}

CRNL2

あっうまくいった!

大した問題ではなかったですがここで躓いてたら 大いなる計画 がとん挫するところだったので解決してよかったです。

それでは良い改行コードライフを!

まほプリが終わってしまうダメージをシェル芸で癒したいね

魔法つかいプリキュア49話でめちゃくちゃ泣いた

涙腺のゆるみから老化を感じる

シェル芸をやろうとおもいました

近々部活でコンテストがあるので作品をまた作ろうと思っていました。
しかし今度のコンテストではLT部門っつーのができるらしくて

d.hatena.ne.jp

どうせなら出たいので、なにを話そうかな~~~と考えてました。
何か勧誘的なことを話せば一緒にそれをやる人がふえるな~~と思って色々考えてました。
例えば

まぁいろいろあるのですがどれも人を選ぶので、僕の話術ではなかなか思うように引き込めないだろうな~~と

なら よく使ってて馴染みのあるものを強化した感じ のことを話せば何とかこちらサイドに引き込めるのでは
つまるところ シェル芸

https://blog.ueda.asia/?page_id=1434blog.ueda.asia

まぁ僕も最近真剣にやり始めたばかりなので部内コンまでにお勉強しないとなんですが、試しにFizzBuzzやってみました

seq 1 50|
awk '{if(NR%3==0){print "Fizz"}else{print $1}}'|
awk '{if(NR%5==0){print $1 "Buzz"}else{print $1}}'|
sed -E 's/[0-9]+Buzz/Buzz/g'

そしてドーン

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz

awkを二連続でつなげて3の倍数と5の倍数をFizzとBuzzにドーン!!
最後にBuzzの前の余計な数字をsedでドカーン!

sed拡張正規表現の指定が-eではなく-Eであることに気付くのに5分ぐらいかかったのでまだまだ感があります。

そしてこんなものも・・・

% seq 0 2|awk '{if($1==0){print "NOP"}else if($1==1){print "ADD"}else if($1==2){print "SUB"}}'
NOP
ADD
SUB

catで命令列を記述したファイルを読み出してパイプすればCPUできないかなーーー?なんて思っております。

問題はレジスタファイルやデータメモリをどうするかなんですが・・・
ファイルに書き出してみる?Open usp Tukubai系を使えばなんとかなりそう?

https://uec.usp-lab.com/TUKUBAI/CGI/TUKUBAI.CGI?POMPA=ABOUTuec.usp-lab.com

なんにせよまだ手探りでやっています。

上達すれば、部内LTでも頑張って話したいですね。

( ˘ω˘ ).oO(そして身内や部内でシェルスクリプトbashが流行りますように・・・)

CPUが出来た

習慣化しないとマズい

CPU_final1
↓↑
CPU_final2

三日に一度ぐらいとは

ご利用は計画的に

ソフトウェア開発の現場でデスマーチになるなんて言うのはよーく聞く話で
www.itmedia.co.jp

それについての講義もあるわけですが
どういうスカポンタンがやったら納期遅れになるのっておもってましたよ

あるいは

Twitterで締め切りに追われるクリエイターさん達が死を呟いているのを見て
どういうスケジュールならこうなるのっておもってましたよ

なるね

なんていうかデスマーチになりかけたよ

どういう道のりを歩んだか

僕のチームは僕含めて4人でした。
命令セットが公開されてはいスタートって言われたのが10月の半ばでした。
その日に決まったことといえば
 「パターソン&ヘネシーの本で題材になっていたMIPSアーキテクチャに命令セットが似ているから、それ真似よう」
ということだけでした。

滑り出しが悪かったからかしばらくメンバー間であまり情報交換などがありませんでした。
必須仕様などの理解も全員が出来ていなかったし、そもそもMIPSのRTLがなぜああなっているのかについて解っていない感もありました。

やべえ と思ったので僕が主導してRTL設計を進めていました。しかし今思えばここの時点で僕が結構しくじっていました。
というのも

  • なぜ僕がこういう設計をしたのかメンバーに理解させきれてない。
  • 僕がメンバーに解ったかどうかについて聞いてない。

などですかね。まぁほかにもあるかもしれませんが・・・・

これがどういうことになるかというと

最初があんまりわからない→次もちょっとわからない→わからない→わからない→・・・・→無
オートマトンの状態遷移図で書くとこうです
CPU_final3

解らない状態でVerilogに手を出しても1ミリも設計はすすみません。
実際、わかっている僕(設計に自信なし)がほとんどのモジュールを書きました。

他のメンバーには書いてあるモジュールについてテストをしてもらうように頼んでいました。
しかし自分がやった方がはやいということになりがちでした。

他人の時間を拘束することの難しさ

そいつにはそいつの集中力とかやる気が満ち溢れる時間が違うし、バイトとかもあるだろうし
自分のやってほしいことをその人にやらせる強制力というか支配力?なんて言ったいいのか

結果はすぐ帰ってこないしデバッグは自分でもできるし、そっちの方が速い→自分でやる
まぁそうするとメンバーは余計わからなくなるわけですが。

指定問題を解くために

指定問題が3問ありました。
簡単に言うと

  • 20000=n(n+1)/2を求める問題
  • 最小値探す奴
  • 選択ソート

これらを解く必要がありました。この内、最小値と選択ソートは同一の問題であるとして特化した設計にしました。
どうするかというと 問題を解くための命令を追加してしまう です。

幸い命令セットに予約されていたのは14個で、オペコードは4bitだったので2つ空きがありました。やったぜ

なので、総和とnを求める命令とSTするたびに二つ目のデータメモリにも格納していって選択ソートする命令を追加しました。
これによって圧倒的速さで問題を解けました。

Quartusは敵か味方か

RTL図をもとにゴリゴリつないでいってIverilogのシミュレーションを一通り終わらせたところで、Quartusでボードに焼くためにAnalysisさせました
https://www.altera.co.jp/products/design-software/fpga-design/quartus-prime/what-s-new.htmlwww.altera.co.jp

CPU_final4

ボードで動かせるような構成になっていれば
CPU_final5
という表示が出ますが最初から出るわけもなくここが一番しんどかったです。

なによりボードによるループ回数の制限が苦しかったです。

for (i = 0; i<index-1; i++) begin 
    min=subDM[i];k=i;
    for (j = i + 1; j<index; j++) begin
        if (!Order) begin //昇順
            if (subDM[j]<min) begin 
                min=subDM[j];k=j; 
            end  
        end else begin //降順
            if (subDM[j]>min) begin
                min=subDM[j];k=j; 
            end 
        end 
    end
    subDM[i]<=subDM[k];
    subDM[k]<=subDM[i];
end

まぁこれはよく見る選択ソートの簡単なコードです。言語はVerilogですがCとよく似ているので読めるかと思います。
一見ダメそうなところのない普通のコードですがQuartusはこれにNOを突き付けました。

だめなところ
- ++(インクリメント) - forの条件式に変数index - 配列の参照外になりそうもない配列へのアクセス

それぞれのダメなところは以下のように書き換えねばなりません。

i=i+1
for(i=0;i<32;i=i+1)
if(j<SUBDMMAXSIZE) begin min=subDM[j];k=j; end

特に二つ目のforの条件のところはかなり厳しいです。

今回はボードの制限なのかforwhileでループできる上限は250回まででした。
indexは配列の長さで決まるので何ループするのか わからない これがダメなようです。
初期値が何で``いくつずつ足されて``いつ終わるのかいつも確実でないといけないわけです。

これがきっつい、ループ回数が明確でないといけないので定数を入れるしかありません。
しかしループはあるところで終わってほしい・・・
そこで僕が取った行動は

begin : LOOP
    for(i=0;i<32;i=i+1) begin
        if(i==index)begin
            disable LOOP
        end
    end
end

ifforbreakする意味の解らない方法です。
これのおかげでエラーは消えましたが別の問題が・・・・

ifが増えすぎた

ifが増えるとどうなるかっていうと、回路が複雑で大きくなります。当然です。

result=Rd_data+disp4;

CPU_final6

if(add)begin
    result=Rd_data+disp4;
end else begin
    result=Rd_data-disp4;
end

CPU_final7

まあこういうことです。

3つ目の対策と合わせるとif文がINF個になってしまいました。
指定されたQuartusのバージョンが9.1(32bit)ということもあって、Analysisが全く終わりませんでした。なくなくリジェクト

データメモリの初期化がうまくいかない

FPGAボードに割り当てた回路のリセットボタンを押したときに、データメモリの中の初期値を設定してくれるものがあります。
初期値はMIF(Memory Initialize File)という形式で記述されて、ビルド時にそれが読み込まれます。
しかし、これがうまくいかない。

具体的には データメモリの1番地だけがボードごとに値が変わる のである。

いみわかんないw

指定問題の中にはデータメモリの中から最小値を見つけるようにというものがあったんですが
この1番地が勝手に変わる問題のせいで 最小値がボードごとに変わる。

他ゼミにも聞いたところ同じような現象が起こっており、Quartusのバージョンを15にすると直ったという。

はいもうね現行バージョン16なのに9.1使えって何事よって思ってたんですけど。
こういうこと起こるんですよ。課題渡す前に自分たちで一度やってほしいですね。まぁ無茶でしょうけど・・・

ボード手前まで来てQuartusにいじめられる世界。
焼いてもいじめられる世界。
FPGAは難しい・・・

結果は

追加命令のおかげで問1である総和の問題は超高速で解けました。
他が1200クロックぐらいかかって居るところを13クロックで終了させました。

問2に関してもデータメモリの初期化不良を除けば解けていました。
これも250クロック以上かかっているところを109クロックで終わらせました。

しかし教授陣には難色を示されました。いままで命令を追加されるなんて言うことが無かったみたいで、扱いに困っていましたね。
まぁプロジェクト概要にも追加しちゃダメって書いてなかったので僕の勝ちです。

普通に勝負していたら他ゼミにたぶん負けていた気がします。みるのはクロック数だけらしいので・・・

今回のプロジェクトは本当に力になった気がします。それはVerilogFPGAの知識だけでなくメンバーとどう連携を取っていくかなども含めてです。
来年はこれをもとに卒論…頑張りたいですね。

今年中にできてないことを集めて

BGMは"日本中の不思議を集めて"で

どうもメリー大晦日
とうとう今年も終わるんですねーーー

やれそうでウッフン やれなさそでウッフン

さて隊長たくさんやりたいことがあります。例えば

  • Xamarin
  • ゼノンを210lvに
  • バイトを始める
  • ゲームを完成させる
  • 超能力を獲得する

まぁまぁこんなもんでしょうか、まだあるんですが

やりたいこと と言っているあたり やれていない ということが普通の読解力のある人ならわかるでしょう。

やりたいと思ったのにはそれなりに理由があるとおもいます。
やれてないということはその理由を 忘れている ということだと思うので書き出して来年には忘れずに挑戦できるようにしたいです。

Xamarin

www.xamarin.com
なんでこれをやりたいと思ったのかっていうのは夏に参加したインターンでの出来事からです。
5日間でデザイン通りのAndroidアプリを作成するモノでした。
これの参加が決まっとき「Unityでええやろw」と馬鹿にしていました。

しかし初日に刈り取られました。なめてた

ざっとどんなものかっていうとアニメーションするカレンダーだったんですがこれがなかなか複雑なアニメーションをしていました。

Unityはわりとその辺の処理が得意であったのでなんとか見てくれを完成させたとき気づいたんです。

カレンダーも手作りじゃね・・・?

Unityにはカレンダーをぽいっと生成するようなものはありません(AssetStoreさがせばあるか?)
つまりデザイン通りのカレンダーをオブジェクトを並べて作らなければなりません。
祝日は文字を赤くしないとダメですし、うるう年なんかの計算と処理も自力です。

ばーかw

それと見えてないオブジェクトの処理をしないようにしても、完成した見てくれを10年分並べただけで Unityがこわれた(固まった)のでアプローチもダメみたいですね
なので毎回の進捗報告会でなんとか笑いを取るしかありませんでした。とれてたか問題もありますが・・・

なので最後の発表会でXamarinでの開発を志しました。
しかしいまはVerilogHDLに追われています。

ゼノンを210lvに

Vアップデートで五次転職が実装されました。

maplestory.nexon.net

強そうなスキルとかがいっぱい追加されるのでコアが増える206lvとリンクスキルレベルが3になる210lvまで頑張ろうと思いました。

まぁいまは201lvなわけですが。
なんでれれりんぐできてないのかっていうと、リゼロイベントとメガバーニングイベントでゼノン以外をプレイしてる時間が長かったからですねーーーーーーー

リゼロのときに作った火毒魔がゼノンより火力出てるんじゃないかってことで一瞬ハマってましたが、スタンスが無さ過ぎてゼノンに戻ってきました。
メガスマッシャーもかっこいいのでこれから目標を212lvにあげてがんばりたいです。

バイトを始める

むり

ゲームを完成させる

前回の記事でかいた Azuh.exe ですが完成してないです。完成させたいです。

xztaityozx.hatenablog.com

超能力を獲得する

いつも思っていました。出かけるときに一瞬で目的地に着いたり、空を飛んでいけたらと。 kotoshi1

いつも思っていました。うるさいことを言うやつを一撃で黙らせるパワーがあればと。
kotoshi2

いつも思っていました。ニュースなどで報道される紛争地域に介入して一人で無双して解決したいと。
kotoshi3

いつも思っていました。こういった力を得るにはどうしたらいいのかと。
kotoshi4

これはえらく長いこと思っていることで、いろいろ調べていますが 超能力 と呼ばれるものを持つ人はマンガやアニメにしか出てこず、現実にそういう を持った人はいませんでした。
なら最初の人になる
まだ手に入れることができていませんが、ぼくの挑戦は終わりません

まとめ

なんだよこの記事

来年はもっとましなこと書けるようにしたい

Azuh.exeってゲームを作った

結構長いことやってた

去る11月に所属している部活でコンテストが開かれました。みんなそれぞれ作品を作って発表していました。
もちろん僕もそれにだいたい参加しています。

その時ぼくが発表したゲームをそろそろ公開したと思います。
別に温めてたとかじゃなくて単に忘れてただけなんですが・・・

ゲームの名は。

azuhexe1
Azuh.exe Unlimited World
です

CAPC〇Mの〇ックマンエグゼのオマージュです。
Unityで作ってます。

Azuh.exeってなんだよ

Azuhは厨二病が治っておらず日々妄想を膨らましていた時にできたネットナビです。
azuhexe3
名前に特に意味はなく、パスワード生成器で4文字出力したら出てきたのでそれにしました。

以前の記事でも出てきたかと思いますね。

xztaityozx.hatenablog.com

Unlimited Worldってなんだよ

このゲームは開発中にいろいろあってストーリーのあるゲームとしませんでした。
流行りのオープンワールドゲームなのでUnlimitedということですね。

DLはここから

1drv.ms
zipアーカイブです。
解凍したらReadmeみたいなのが二つとゲーム本体とぼくが暇なときにしこしこ書いていたAzuhのストーリーが入っています。
起動するときは画面サイズを16:9にするといい感じになります。

ゲームはこんなかんじだよ

azuhexe2

こういう感じで導入が始まります。

azuhexe3

十字キーを使って8方向に移動できます。
オープンワールドを謳っているので狭い世界から飛び出しましょう。

azuhexe4

はい

azuhexe5

メニュー画面も用意しましたぜ。
といってもほとんどの機能がなくて出来るのはチップフォルダの編集だけです。

azuhexe6
azuhexe7

この辺のアニメーションは結構頑張ってるので見てやってほしい

戦闘もできます。

azuhexe8

部内コンでは言い忘れてましたが、プログラムアドバンスも使えます。

azuhexe9

個性豊かなウイルスたちがいます(全4体10種)

azuhexe10

ホントに目的がなく、無限空間を歩くだけですがたまーにこんなのがあったりするので探してみてね

azuhexe11

挙動が変

反省してます。
アニメーションの管理が思ったより難しいですね~~・・・
その辺とかのバグ修正もしたかったんですけど色々忙しくて、自分の中から消え去らないうちに公開だけしとこうと思って

また時間が取れたらなんとか完成させたいです。Azuhに対する愛着もあるので

それでは良い 無限空間 を!

世界一わかりやすい絶対パス

世界一は盛り過ぎた

みなさんcdx使ってますか。ぼくは使ってます。

xztaityozx.hatenablog.com

パスって見づらい

Linux上で作業をしていてたまに思うことがありません?僕は思います。
例えば
no1path1
こういうの

これってまだ見やすい方ですけど、長くなってくると意味わかんなくなるよね
それに同じ色だからどこが/なのか分かりにくいし正直長いパスでも後ろいくつかでわかるし
no1path2

お得意のシェルスクリプト

こういうのってcdxのときみたくggったら出てきそうなんですけど・・・
自分で作ればシェル芸人パワー上がるしいいよね

まずはパスの一番最後の要素 つまり

/home/taityo/testdir/dir
                     ↑これとか
/home/taityo/testdir/item.txt
                     ↑これ

これに対して色を付けてやります。
こいつは目的の場所、もしくは目的のファイルであるので目立つ方がいいですね。

#!/bin/bash

path=$1

bpath=${path##*/} #最後尾
fpath=${path%/*}  #その前

out_path=""

bpath="\e[1;33m$bpath\e[0;39m"

out_path="$fpath/$bpath"
echo -e  $out_path

\e[1;33m$fpath\e[0;39mは端末の出力に色を付けるものです。この場合だと黄色の太文字になりますね。echo 色付けとかでggるとでてきまする。
本当はsedとかawkとか使って一撃でやりたかったんですけど・・・
出力はこんなかんじ
no1path3
いいねいいね。

次は最後の要素から上二つまでのディレクトリに別の色をつけます。まぁ同じようにやってもいいんですが ダセー ので配列に展開してしまいましょう

#!/bin/bash

path=$1
arr=(`echo $path|tr -s '/' '  '`) #配列に展開
path_range=${#arr[@]}#要素をカウント

out_path=""

bpath="\e[1;33m${arr[`echo $path_range - 1 | bc`]}\e[0;39m"#最後の要素
bbpath="\e[1;36m${arr[`echo $path_range - 3|bc`]}\e[0;39m/\e[1;36m${arr[`echo $path_range - 2|bc`]}\e[0;39m"
echo -e $bbpath/$bpath

こっちのがいいですね~
ちょっとインデックス計算のところが変なことになってますが・・・
bcコマンドは文字列を計算式として計算してくれる(日本語が下手)コマンドです
exprより使い勝手がいいのでよく使います。

出力は
no1path4

今度は/home/から下3つまでの要素を省略しましょう。
パスが長くなるとターミナルを占領してしまって目がおかしくなるのでね
no1path5

省略する場合パスの要素が6個以上必要ですね~。

#!/bin/bash

path=$1
arr=(`echo $path|tr -s '/' '  '`)
path_range=${#arr[@]}

if [ $path_range -le 2 ]; then #パスが短かった時
    echo -e "/${arr[0]}/\e[1;33m${arr[1]}\e[0;39m"
    exit;
fi

out_path=""

bpath="\e[1;33m${arr[`echo $path_range - 1 | bc`]}\e[0;39m"
bbpath="\e[1;36m${arr[`echo $path_range - 3|bc`]}\e[0;39m/\e[1;36m${arr[`echo $path_range - 2|bc`]}\e[0;39m"
if [ $path_range -ge 6 ]; then
        bbpath="home\e[0;39m/.../$bbpath"
else
        path_range=`echo $path_range - 4|bc`
        while [ $path_range -ge 0 ]; do
                bbpath="${arr[$path_range]}/$bbpath"
                path_range=`echo $path_range - 1|bc`
        done
fi
echo -e /$bbpath/$bpath

こんなかんじになるよ
no1path6
例が悪いから良くなった感があんまないな・・・

で?

これどこでつかうんだ?

一応これを~/.bashrcとかに書いておけばパスを呼び出すときとかに通してやれば綺麗になりますよ!
no1path7

快適な パスライフ を!

CPUの設計をしてて思うこと

進捗がやばい

OIT Advent Calendar 2016は無事全部全部埋まったようですね!

www.adventar.org

最初は僕と主催者だけだったので冷ついてましたがよかったです。

さて
CPU設計プロジェクトの進捗がやばいです。
どうヤバいかっていうと初期設計の段階で欠陥が見つかりました(最近)

納期は1月の半ばということでまだ一か月あるんですが・・・

地獄を見そう

諸先輩方が口をそろえて「地獄を見た」と言っていたのですが、隊長これを大げさだと思っていました。
しかし最近大げさでなさそうなのがチラリズムしてまいりました。

この間中間報告会があったのですが、そこで「中旬にはシミュレーションしておきたい」と言ったものの全くできておりません。

HAHAHA

とはいえ

内部の配線名とか決めた設計図は完成しているし、モジュールも実はほとんど書き終わってて
ステージを記述すれば全体が組みあがりそうなんです(テストが終わってるとは言わない)

ボードで動くところまでなんとか行きたいですね。がんばります。

じゃあはやくやれよ

課題とか就活関係イベとかであまり時間がないのが苦しいです。
いや、ポケモンする時間を削ればいいんですがね(くいしんぼうカビゴンはやく出来て)

これを書いている時間もモジュールを書けばいいんですが、やる気が出ないのはなんでなんでしょうね・・・!