エンジニア端くれ。

それに所属してはいるが、末に連なるつまらぬ者。末輩。

基本情報技術者試験の振り返り

18/12

  • 「キタミ式」を一通り読む。
  • わからない箇所はとりあえずそのままで、全体を知るのを目的にした。

 

19/1〜19/2

  • 過去問道場をずっとやる。
  • 移動中と寝る前。
  • わからない箇所は「キタミ式」で調べるか、「分かりそうで分からないでも分かった気になれるIT用語辞典」で調べる。
  • ここで「過去問道場」の疑似試験で7割以上取れるようになった。
  • この時点では午後問題は手を付けず。(空き時間にやる過去問道場は、午前問題の対策に適している)

 

19/3

  • 午後問題対策開始。
  • 「過去問道場」で正答率の悪い分野を重点的に対策。「過去問道場」で解けている問題は基礎から理解できているという考えがあった。
  • 自分はネットワーク、アルゴリズム、マネジメントを重視。
  • プログラムはCを選択することを決めたが、これは「苦C」のサイトを一通り読んだだけで終わる。(基礎的なところはなんとなく理解できているつもり)
  • データベースは捨て。

19/4 当日

  • 午前自己採点80%
  • 午後自己採点55%

 

反省

  • 午後は時間がない
  • 問題文が長い。1設問につき、10分単位で消える
  • また疲労もある。
  • 午後は得意なものを先に解くのが良い
  • 午前は過去問道場でガッチリ

hello world をやる意味

入門で必ずやる"hello world"

プログラミングの勉強を始めると、必ずやらされるのが"hello world"。
画面に"hello world"と表示させるだけで簡単なプログラムであるが、これをやる意味を初心者が自発的に理解するのは難しい。

私は大学の授業で"hello world"を始めて実行したとき、「入力した文字が出るのだから当然じゃん。意味なくねー?」と思った。

"hello world"をやって何になる?

プログラム、またはプログラムを実装するもの(PC、マイコン、アプリケーション…)は全て次の動作を行う。

  1. プログラムにデータを入力する
  2. データを処理する
  3. 処理したデータを出力する

例えば体重計であれば、以下のような動作になる。

  1. 重さをデータにしてプログラムに入力する
  2. データを計算する
  3. データを表示する

"hello world"はこの流れをもっとも簡単に把握できるプログラムである。
その動作を理解できることに意味があり、授業や入門書で必ず触れるようになっている(と思う)。
ただ、講義や入門書でその説明がない場合があるので、意味を感じにくい。
以下は"hello world"の動作。

  1. "hello world"を入力する *1
  2. "hello world "が表示される

"hello world"の次

"hello world"が出来た。
何かやりたいことがあるのだが…次はどうすればいいか?

入力をデータにすることを考えてみよう。

データにすれば、計算や処理ができるので何とかなる。
重さ、タッチ反応、加速度でも、なんでも。

「入力ってそもそも何よ?」とか「どうやってデータにするんだ?」という知識がないと、プログラム作成で躓いてしまう*2
以下は入力とデータに変換する方式のヒント。参考になれば幸い。

例:「やりたいこと」→「変換方式」→「出力」

  • 温度を数値化して表示したい→温度センサをつかってデータを取得 *3→処理して表示
  • スマホのタッチ反応を感知したい→ライブラリを使ってタッチを感知*4→感知後関数処理
  • twitterを自動で呟きたい→呟き内容を入力してAPIに渡す→自動で呟くように処理

参考文献

汎用的な考えとして、以下の書籍を紹介する。
読むのに中学数学の知識が必要であるが、比例や合同の知識はプログラム作成の上で必修だと思っている。

いかにして問題をとくか

*1:表示するだけなので計算や処理はこの場合無い

*2:データ変換は恒常的な問題と思う

*3:プログラムを使ってセンサと通信しデータを取得する

*4:ライブラリは処理を行ってくれるプログラム

Processing 収縮拡大する円

やりたかったこと

動きがあるクラスを作って描画をする。

描画するもの

円クラスを使って、複数個の円に同じ動きをつける。

動き

  • 広がる/縮む
  • 移動する

インスタンス化した円が広がったり、移動したりする。

f:id:daigakuinnsei:20180708180733g:plain

コード

Circle c1,c2,c3,c4,c5,c6;    //decalation
int clr_back = 255;          //color of background. 255 = white

void setup(){
  size(400,400);
  smooth();
  background(clr_back);
  frameRate(50);
  
  c1 = new Circle();        //making 6 instances
  c2 = new Circle();
  c3 = new Circle();
  c4 = new Circle();
  c5 = new Circle();
  c6 = new Circle();
}


void draw(){
 c1.updateMe(255,0,0);    //calling 6 the method of the instance
 c2.updateMe(0,255,0);
 c3.updateMe(0,0,255);  
 c4.updateMe(255,255,0);
 c5.updateMe(0,255,255);
 c6.updateMe(255,0,255);  
}


class Circle {
  float clr_r,clr_g,clr_b;    //for color
  float x, y;                 //for axis
  float radius;
  int rad;      
 
  Circle () {
    x = random(width);
    y = random(height); 
    rad = 10;
  }
  
  void updateMe(float clr_r,float clr_g,float clr_b){
    noStroke();
    fill(clr_back);                                //paint it white the ellipse before writing
    ellipse(x, y, radius * 1.05, radius * 1.05);
    radius = abs(sq(sin(radians(rad)))) * 200;    //caliculate next radius
    rad = rad + 1;                                //caliculate next radian
    if(rad == 170){                               //return the radian
      rad = 10;
      x = random(width);                          //remove
      y = random(height);
      background(clr_back);
    }
    fill(clr_r,clr_g,clr_b);
    ellipse(x, y, radius, radius);                //paint the ellipse       
  }
}

ソースの流れ

  1. setup(ウィンドウやインスタンスの作成)
  2. draw(インスタンスをアップデートし描画する)
  3. その他(Circleクラスの作成)

個人的ポイント

  • abs(sq(sin(radians(rad)))) * 半径

sinの2乗を円の半径にかけることで、円の収縮動作が弾むようになる。

[普及版]ジェネラティブ・アート―Processingによる実践ガイド