合法SESおじさんがPGを目指す日記

合法SESおじさんがICT現場でひたすら足搔く様子はなるたけ書かない技術ブログです

ABC始めました 〜今は遠き緑の勲章〜

こんばんは。せのです。

ファイターズの勝利に酔いしれてたらこんな時間になってました。

定時上がり出来たので更新します。

senobro.hatenablog.com

さて、前回のあらすじです。
・ABCのB問題に挑戦

その前にABCとはなんぞやから始めますか。

詳しくはこちら。

AtCoder Beginner Contest 089 - AtCoder

AtCoder Beginner Contest(ABC)とは?
プログラミングには興味あるけど、何をしていいかわからない...
そんな人のためのコンテンツです。
原文ママ

つまり「見習いプログラマーはこれでコード書いて知的好奇心を満たせ」ってやつです。
合法SESおじさんは見習いプログラマーにもなれていない感が満載なので、
こうやってひたすらコードを書くしかないのです

そんなわけで今回挑戦した問題はこれ!

B - Hina Arare

難しかったです。結局自力でB問題を解くことは出来ませんでした。
何も理解してないんだな俺ってのを痛感しました。吊ってきます

僕が無い頭フル活用して調べながら必死こいて書いたクソコードがこちらです。
ローカル開発環境で書いたんですが、コンパイルエラーで提出すら出来ませんでした。まじ死にてえ

#include <bits/stdc++.h>
using namespace std;

enum arare{
	P,
	W,
	G,
	Y
};

int main() {
	enum arare S;
	int N;
	int A[3] = {};
//	string S;

	cin >> N;
	cin >> S;

	for (int i = 0; i < N; i++) {

	switch(S){
		case P:
			A[0] = 1;
			break;
		case W:
			A[1] = 1;
			break;
		case G:
			A[2] = 1;
			break;
		case Y:
			A[3] = 1;
			break;
		defalt:
			break;
	}

	cout << A[0] << endl;
	cout << A[1] << endl;
	cout << A[2] << endl;
	cout << A[3] << endl;

	if ( (A[0] == 1 && A[1] == 1 && A[2] == 1) || (A[1] == 1 && A[2] == 1 && A[3] == 1 ) ) {
		cout << "Three" << endl;
	}else if( (A[0] == 1 && A[1] == 1 && A[2] == 1 && A[3] == 1 ) ){
		cout << "Four" << endl;
	}else{
		cout << "error" << endl;
	}
} 

ちなみに、人様の書いたコードでコンパイル通って満点だったコードがこちらになります。
将来拡張性を持たせるために少々アレンジしてます。
え?拡張性なんてABCの問題に無い?うっせーな!あるかもしれないじゃん!

#include <bits/stdc++.h>
using namespace std;

int main() {
	int n;
	cin >> n;
	bool flag = false;
	for(int i = 0; i<n; i++){
		string s;
		cin >> s;
		if (s=="Y"){
			flag = true;
		}else{
			;//nothing to do
		}
	}
	cout << ( flag ? "Four" : "Three" ) << endl;
}

はい素晴らしいですね。ちゃんと満点……って待て待て!
これバグコードじゃねえか!
全網羅テストして気付きましたが、明らかにバグコードです。

これだとYがあったら1つでも2つでもFourになります。
少し考えますので時間下さい。
考え方は良いと思うので、どんな状態でも正しくthreeとFourが出るコードに修正してみます。

もう11時も近いので寝ます。
続きはまた次回。

期待しないで待ってて下さい。

そうだ、ソース読もう 〜永遠の初心者からの脱出に向けて〜(2)

こんばんは。せのです

風邪が長引くので人狼はパスしました。
おのれ風邪め……薬をキメて駆逐してやる。

senobro.hatenablog.com

さて、現場のコードを読む隙があったのでこの前の続きです。

自分の仕事のレビューがあって、あまり時間が取れなかったので「おや?」と思った点だけ書きます。

マジックナンバーにしてない変数の出所がわからない
おそらく、コードを読むときに持ってきたソースの塊だと思ってたものが一欠片に過ぎず
他のファイルに格納されていたのだと思います…これは完全に自分自身の凡ミスですね。

②何処から呼んでるのか分からない関数がある
これもきっと①と同じなので自分の凡ミスです。

①と②の例を書くとこんな感じです。

void HogefugaFugo(void)
{
switch(foo){
    case: BAAAAAR:        //①:あなた一体何処に定義されてるの
      functionall();      //②:あなた一体何処から来たの
      avar = ABABABABA;   //①:あなた一体何処に定義されてるの
      Timer = 0;
  }else{
      ;
  }
  break;

  case BAAAN:           //①:あなた一体何処に定義されてるの
    Timer++;
    foo = ABAAA;          //①:あなた一体何処に定義されてるの
    //以下略
}

他にも何でタイマー処理をインクリメントでやってるのかって言うもにょるアレもありましたが、
意図がよくわかんないのでスルーします。仕様書によっては多分俺もこう書いちゃうだろうし…

ところでサブルーチンと言えばいいのか最近悩むところではありますが、
僕は今のところ組み込み屋さんなので、あえて関数と呼ばせて頂いています。
多分、Web屋さんと組み込み屋さんでその辺のニュアンスがだいぶ違うのかなー…と思ったり

続きはまた次回。
ABC問題1問だけ解いて寝ます。

やべえよ、今度はB問題だよ……解けるか自信ねえよorz

あれ?もしかしてプログラミングって…楽しいのでは?

…と思ったせのです。こんばんは

EX11 - 電卓をつくろう2 / 1.11

これをですね…解けたんですよ。自力で。C++

まあ、ヒント見ながら調べながらですけどね!

提出して、通ったコードはこちらです。

#include <bits/stdc++.h>
using namespace std;
 
int main() {
    int N, A;
 
    cin >> N >> A;
    
    // ここにプログラムを追記
    int ans;
    char op;
    int B;
    
    ans = A;
    
    for (int i = 0; i < N; i++) {
    
    cin >> op >> B;
 
        switch (op) {
            case '+':
                ans += B;
                cout << i + 1 << ":" << ans <<endl;
                break;
 
            case '-':
                ans -= B;
                cout << i + 1 << ":" << ans <<endl;
                break;
                
            case '*':
                ans *= B;
                cout << i + 1 << ":" << ans <<endl;
                break;
                
            case '/':
                if (B == 0) {
                    cout << "error" << endl;
                    return 0;
                }else{
                    ans /= B;
                    cout << i + 1 << ":" << ans <<endl;
                    break;
                }
                
            default:
                break;
        }
    }
}

多分、見る人が見たら長すぎるわクソコードって言うんでしょうねえ…

模範解答を見たら僕の書いたコードより短く書いてありましたし、
他の人が書いた一番容量が少ないコードを見たらすごく短かったです。

ともあれ、問題を自力で解けるところまでは地力がついたってことだと思うので、これは素直に喜びたいと思います。

あとは短く書くことを意識したいですね。今の所はそれを意識するのが精一杯

明日は仕事終わりに人狼しに遊びにいく予定です。

コミュニケーションスキルを磨くのも立派なエンジニアの訓練ってことで!

LAMP環境構築した報告

せのです。こんにちは

ローカル開発環境にLAMP入れましたという進捗です。

qiita.com

こちらを見ながら入れました。

そういえば何でLAMP環境構築したんだっけ……

ああそうだ、元素のデータベース作りたかったんだ。昨日思い立ったんだった。

元素の一覧 - Wikipedia

元素と分子量のデータベース作って、そこからmol計算するアプリ作りたい的な。

kagakuimage.com

これ参考にしようと思います。

まずはデータベース作ろう。話はそれからだー

Homebrewを入れようとして上手く行かなくなってた話

こんばんは。せのです

大変です。
やらかしてました。

Homebrewを入れよう入れようとしてずーっと失敗してました

その前にHomebrewってなんぞやって話ですねサーセン

Homebrew (パッケージ管理システム) - Wikipedia

brew.sh

なるほど、わからん。
とりあえずrubyやってる勢には人気があることだけはわかった。

ただ問題は自分のmacに入れられないってこと…さて困ったぞー

と言いながらやっぱり良いやこんなもの入れなくてと投げ出しては入れたくなってを繰り返して今日ふと気付きました

「あ、これコマンドラインで入れてねえ!vagrant立ち上げた仮想サーバに繋げたまま導入しようとしてた!」

そんなわけでコマンドラインで入れたら上手くいきました。

そんな感じの失敗メモです。

皆さんもhomebrew入れるときは僕と同じ間違いしないように、vagrant使わないときはちゃんとexitで抜けましょうねorz

そうだ、ソース読もう 〜永遠の初心者からの脱出に向けて〜

こんばんは。せのです

最近テスト案件ばっかりでコーディング出来てません!
のでせめてソースコード読んで力を付けたい!

www.atmarkit.co.jp

と思ったので、昼休みにソースコードを読むコツみたいなの無いかなってググってたらこんな記事を見つけました。

以下、記事より抜粋(原文ママ
========================================
【1】記録を付ける
「記録を付ける」というのは、自分でノートを付けてもいいでしょうし、
ブログなどでソースコードを読んだときに気が付いたことを書いてみるとかでもいいでしょう。

こういった学習は積み重ねをどれくらいしてきたかが分かるようにするということが大切です。
なんとなくではなく、この日に、このソースコードを読んだ、というのを工夫して記録してみましょう。
記録をたまに確認してみると、努力した分量が分かりますから、それが持続の原動力となるはずです。
========================================

とあったので、早速ですが今の案件のソースコードのファイルを読んで
気づいた点、面白いと思った点、ここダメじゃね?と思った点をつらつら書いていきます。

【気づいた点】
・ORを取ったり、bit移動する処理が多い
C言語はなんでも細かく出来る分(ネガティブな言い方をすると何でもやらなきゃいけない分)
bit演算処理に気を配る必要があるので、読んでると「あ、やっぱり自分は何も分かってないな」というのが分かってきます。

マジックナンバーほとんど使ってない
C言語使う現場なので、殆どの値をdefineして使用しているっぽいです。
使っててもコメントで補完しているので、可読性が高いです。
出来るプログラマーはこういうところで差が付くのかなと感じてます。

・関数の先頭で異常系の処理をしてる
今日のところは1ファイルを読み進めていっただけなので、これが良い書き方なのかは分かりません。
が、スッキリ書ける異常系は早めに書いて、長ったらしい正常系の処理は後に書くのは良い書き方だなと思いました。

【面白いと思った点】
プログラマの名前が書いてない
書いてもきっと早晩入れ替わるから誰が書いたコードかなんて
長い目で見れば些細なことですよねきっとうんそうだそうに違いない(白目)
おそらく、この辺はsvnで管理してるのかなと思ったりしてます。

・プロトタイプ宣言と関数の数が合わない
プロトタイプ宣言をしなくても大丈夫な関数があるのか別のヘッダーで宣言してるのかは分かりませんが、どうなんでしょう?
C言語に強い人誰か教えてください!オナシャス!何でもしますから!

【ここダメじゃね?と思った点】
・ビットANDの処理でマジックナンバーが使われてた
コメント書いてるには書いてるんですが、初見ではどういう意図でAND処理をしてるのか分かりませんでした…
正直これはよろしくない書き方なんだろうなと思ってます。
どういう意図でビット演算したのかが一目瞭然じゃないと、バグの温床になりそうで怖さがありますし…

・このswitch文で分岐するためのデータはどこから引っ張ってるの…?
この辺は多分僕の読解力が足りないせいだと思いますふへへ心がしんどいorz
ポインタを戻り値にしてて、アロー演算子でデータ引っ張ってきてるようには読めたんですが、果たしてそのデータはどこからやって来るのか…
引っ張ってくる構造体の中身はどこのタイミングで切り替わるのか、疑問は尽きない…
まあ、多分この辺は開発設計に回らないと全容解明出来なさそうなんですけどねー。
多分全容解明する頃には寿命来る。天寿が来い

・明らかにコピペしてる箇所が複数ある
何やってるんですか先輩!まずいですよ!
ここダメじゃね?と思った点の冒頭にも取り上げたマジックナンバーがペタペタコピペされてる感じの処理が見受けられました。
これはいけない。プログラミング素人の僕でもわかる。
どういう意図で付けたかわかんない16進数でAND処理が行われてる。何これ怖い
更にコピペされてどんどんマジックナンバーのAND処理が行われる。何これ怖い

・一行一行にコメント付けてて直しにくそう
処理の後ろの行に1行コメントが書かれることは珍しいことではないと思うのですが、
問題はほとんど全部の行にコメントがついてる関数があることですね…
長くなるなら、処理前に以下の形で書くとか、関数の説明が書かれる箇所(いわゆるソース看板)に描くとか色々方法ありそうです。
/* ~~~~~~~
なんか長い説明
なんか長い説明
なんか長い説明
~~~~~~~ */

・まとめ
気づいたことをメモしてアウトプットすることで、自分でソースコード書くときにやっちゃいけないことや
こうすれば見やすくなるなと感じることが多いので、ソースコードを読む際に記録をつけることはとても良い方法だなと思いました。

「【2】興味を持っている分野のソースコードを読む」もやりたいですね。
現場のソースコードは仕事の片手間にしか読めなくて、仕事なのでモチベーションも下がるので…

まずはあれですね。ガチャのソースコードを探しまくって読もうかと思います。

Progateも始めた

進捗です

やっぱり定時上がりできる環境って最高だと思う