エンジニアの卵_level5

【毎日更新!】エンジニアの卵のブログです!技術以外も書いたり。

プログラムってどうやって書くんだっけ【102日目】

○○なプログラム作ってくださいと言われたら

  1. 何を使うか考える
  2. どんなアルゴリズムにするか考える
  3. 日本語で動作の過程を考える

とか、完成に向かうためのプロセスってどんなものがあるだろうって。

人によってそのプロセスって違うのかなって。

初心者がプログラムを作るために考えることって?

よく教材でforを使ってソートを作ろうっていうのはよくあるけど、
○○を作ろう。それには何が必要かなっていう力はつかない気がする。

一からプログラムを作るのと、プログラムの問題を解くのとは違うのかなって思った。

それで言うと、私は○○を使って作ろうは出来るけど、一から作るはあんまり上手じゃない。

それは、○○を作るには、何が必要かなって考える力が足りてないからな気がする。

その力を手に入れるにはどうしたらいいんでしょう・・・

日記

風邪引いてます治りません。昨日も日記書いて即寝したのに。

今日もさっさと寝ましょう。

明日元気になってたらいいな。

おやすみなさい。

このPHPのコードのメモリの扱いがわからない。【101日目】

問題のプログラム

php > echo memory_get_usage();
350552
php > class A {
php { public $number = 10;
php { }
php > echo memory_get_usage();
351040
php > $a = new A();
php > echo memory_get_usage();
351096
php > $b = new A();
php > echo memory_get_usage();
351184
php > $a->number = 12;
php > echo memory_get_usage();
351696
php > $b->number = 11;
php > echo memory_get_usage();
351696
php > echo $a->number;
12
php > echo $b->number;
11

ここはわかる

php > $a = new A();
php > echo memory_get_usage();
351096
php > $b = new A();
php > echo memory_get_usage();
351184
php > $a->number = 12;
php > echo memory_get_usage();
351696

インスタンス生成した時点ではclassのコピー扱いなのかな、$a->number = 12;で値を変えることでコピーとして扱えないから、新たにメモリにclassAのコピーを展開するからメモリが増えると予測は出来る

でもこれがわからん

php > $a->number = 12;
php > echo memory_get_usage();
351696
php > $b->number = 11;
php > echo memory_get_usage();
351696

なぜ増えない・・・$a$bは異なる変数のはずなのに・・・

日記

PHPについていっぱいお勉強する週間。

シンボリックテーブルとか、参照渡しとかいろいろ勉強した。

参考サイトが出たらまた記事にまとめたいところ。

ただ、これが解決しないと、理解が出来たと言えない・・・なんだこれ・・・

ブログ100日間を振り返る【100日目】

技術系の日記の数。

72/112 が技術系の記事
約7割ですね。

毎日日記を書いていると、忘備録もここまで貯まってきます。
年末年始と、仕事が忙しい時は残念ながら技術記事は少なくなりましたが、
それでも約7割書けてるのは良いこと。

生活の変化。

日記を書くきっかけとなった方と3時間食事しながら話す機会が得られたのは本当に嬉しかった。
私の成長に大きな影響を与えてくださいましたし、ちゃんと、いただいた言葉を実行出来ましたと報告出来ました。まあ、まだ道半ばですが。

自主勉強もいい感じに習慣づいてきました。本読む時間が取れるのは素晴らしい。
やっぱり本読むって楽しいですね。忘れてたこの感覚。

また、CoinStepの開発にも参加出来ました。仮想通貨のトレードを、ヴァーチャルな資金で体験しようというサイトです。
私も株とかの取引は体験してないので、その知識も得られたらなと。

coin-step.com

Twitterアカウントで簡単に登録できますので、良かったら使ってみてください(ダイマ

次の目標。

大きな目標としては、365日目を迎えること。

その前に、188日目でまたこういう記事を書きたい。

あと、こんな風に貯めてきた知識を、後の後輩の役に立てるようにしたいですね。

そのためにも、時間が取れたらリライトとかしたいですね。

最後に

色んな人に支えられて、少しずつ成長させていただいているのだなと感じています。
この調子で様々なことを学んでいきたいです。

そして4月には後輩が出来ます。(今もちょっとした後輩みたいな人はいますが)

その後輩のためにも、一生懸命成長できるように頑張ります!

これからも温かい目で見ていただけると幸いです。

それでは、エンジニアの卵をこれからもどうぞよろしくお願いいたします。

無事100日目迎えたので

てってれー!! ういろうはレベルアップしたー!

PHPの参照渡しのメモ【99日目】

参照サイト

PHP: リファレンスとは? - Manual

PHP: リファレンス渡し - Manual

伝える内容候補

極力参照渡しでメソッド作らない方が良い
普通のメソッドは、値を直接書き換えてるわけじゃないよ。コピーを使ってるんだよ。
メモリの存在←ここまで説明するとなると骨が折れる気がする

参照渡しを使うとどうなるか

引数に渡した変数の値が変更される。

使う側が予想していない値に変わる可能性がある。

普通の関数との違い

参照渡しするメソッドは、破壊的なメソッドと呼ばれる

function swap($a, $b)
{
  $temp = $a;
  $a = $b;
  $b = $temp;
}
function swap2(&$a, &$b)
{
  $temp = $a;
  $a = $b;
  $b = $temp;
}

2つの違いは、メソッドを実行した後、使用した変数が変化していること

普通のメソッドの場合

$x = 1;
$y = 2;

swap($x, $y);
echo $x;
echo $y;

1,2の順で表示されて、$xと$yの値は変更されない。

$x = 1;
$y = 2;

swap2($x, $y);
echo $x;
echo $y;

2、1の順で表示されて、数値が入れ替わっているのがわかる。

日記

来週会社で説明する予定の参照渡しについて。

何を説明しなきゃいけないか、がまとまらない。

説明したい内容が固まれば、それに合わせて説明の内容が変わるので、それをよく考えなきゃ。

今の所

プログラムをメソッドに切り分ける、これはどういう意味を持つんだろう【98日目】

プログラムをメソッドに切り分ける

    //$end_index ソート時に最後に見る配列の位置を指す
    for($end_index = count($array) - 1; $end_index > 0; $end_index--) {
        // $1と$1-1を比較し、大きい数値の方を$1に入れる
        for($i = 1; $i <= $end_index; $i++) {
            if($array[$i] < $array[$i - 1]) {
                $temp = $array[$i];
                $array[$i] = $array[$i - 1];
                $array[$i - 1] = $temp;
            }
        }
    }

こんなプログラムを

    // 昇順でソートする
    function asc_sort($array):array
    {
       //$end_index ソート時に最後に見る配列の位置を指す
       for($end_index = count($array) - 1; $end_index > 0; $end_index--) {
           for($i = 1; $i <= $end_index; $i++) {
               if($array[$i] < $array[$i - 1]) {
                   swap($array[$i], $array[$i - 1]);
               }
           }
        }
      return $array;
    }

    // 変数の値を入れ替える
    function swap(&$a, &$b)
    {
      $temp = $a;
      $a = $b;
      $b = $temp;
    }

こんな風にする。

どういう意味を持つか。

swap()の部分。これをメソッドにしたというのはどういう意味を持つか。
それは、見る人が下のコードの状態でも問題ないということ。

           for($i = 1; $i <= $end_index; $i++) {
               if($array[$i] < $array[$i - 1]) {
                   swap($array[$i], $array[$i - 1]);
               }
           }

swapがどんな風に実装されているかわからないけど、それでも問題ないということ。
私達はvar_dump()の内部実装知らないけど使えてる。

これも抽象化

最初はswapの具体的な実装を見ないようにすれば、swapが私達から見て抽象的な存在と捉えられる。
具体的な実装、swapの中身見なきゃわからない、そりゃそうだ。

そして、メソッド化はいくらでも細かく出来るけど、内部実装がわからなくても問題のないように切り出すべき。
そうすると、『意味のある単位でメソッドを切り出す』ってことがより理解しやすくなる。
$array[$i] < $array[$i - 1] もメソッドにしたっていいわけだし。

抽象化抽象化というけど、それはimplementsとか、実装がないメソッドを用意することが
即抽象化という意味と考えていると理解が足りないねって思えた。

日記

勉強会で出された何気ない宿題から、いろいろ勉強させてもらってる。

そして、自分の勉強になると思って、あえてツッコミが来るのを期待して破壊的なメソッド書いたら
『次回これが何か説明してねっ☆』って来た。
うへぇ(:3」∠)
とりあえず参照渡しを説明するってことだよね。たぶん。

もしシンボルテーブルの話してまで言われたらまだ無理ぃ(:3」∠)

PHPの$a=$bが、$aをreturnしているのを調べよう【97日目】

導入のきっかけ

willow710kut.hatenablog.com

なので、=が関数なら、何をreturnしてるか調べようってお話

書いたプログラム

$a = 0;
var_dump($a);
var_dump($b);
var_dump($a = $b);
var_dump($a);
var_dump($b);
var_dump($a = $a);
var_dump($a = $b = $c);

実行結果

php -a使って確認。php7.0です。

見にくいので改行入れました。

php > $a = 0;

php > var_dump($a);
int(0)

php > var_dump($a = $b);
PHP Notice:  Undefined variable: b in php shell code on line 1
Notice: Undefined variable: b in php shell code on line 1
NULL

php > var_dump($a);
NULL

php > var_dump($b);
PHP Notice:  Undefined variable: b in php shell code on line 1
Notice: Undefined variable: b in php shell code on line 1
NULL

php > $a = $b;
PHP Notice:  Undefined variable: b in php shell code on line 1
Notice: Undefined variable: b in php shell code on line 1

php > var_dump($a = $a);
NULL

php > var_dump($a = $b = $c);
PHP Notice:  Undefined variable: c in php shell code on line 1
Notice: Undefined variable: c in php shell code on line 1
NULL

それぞれの原因を予想しよう

代入。

php > $a = 0;

php > var_dump($a);
int(0)

$aに代入。echoしてないので返り値は見れないです。
ということで、これは標準出力に吐き出しているわけではない模様。

var_dumpは引数の型や値を出力してくれる便利関数。今の$aはint型で0みたいですね。

=の出力

php > var_dump($a = $b);
PHP Notice:  Undefined variable: b in php shell code on line 1
Notice: Undefined variable: b in php shell code on line 1
NULL

php > var_dump($a);
NULL

php > var_dump($b);
PHP Notice:  Undefined variable: b in php shell code on line 1
Notice: Undefined variable: b in php shell code on line 1
NULL

var_dump($a = $b)var_dump($a)var_dump($b)を比較すると、

var_dump($a = $b)のまえに$bを読み込んで
PHP Notice:  Undefined variable: b in php shell code on line 1
Notice: Undefined variable: b in php shell code on line 1
を出し、その後、
$aを出力した

と予測されますが・・・その前に、$a = $bで$bがエラーを吐かずに$bだけ出力した可能性が残されてます。

代入単体でテスト

php > $a = $b;
PHP Notice:  Undefined variable: b in php shell code on line 1
Notice: Undefined variable: b in php shell code on line 1

php > var_dump($a = $a);
NULL

あ、$a = $bでエラー出してますね。これは仮定が正しそう。
そして、var_dump($a = $a)すると、$a = $aがちゃんと値をreturnしてるっぽいですね。

3つ繋いだ場合は?

php > var_dump($a = $b = $c);
PHP Notice:  Undefined variable: c in php shell code on line 1
Notice: Undefined variable: c in php shell code on line 1
NULL
  1. $c→エラー
  2. $bにNULL代入、$bを出力
  3. 出力された$b(NULL)を$aに代入
  4. $aを出力→NULL

って感じで私は$a = $b$aを出力したと予想しました!

結論:何事も試してみる大切。

頭で考えていただけだと、$aと$bのどちらを出力するのかわからなかったので、
コードを書いて試してみるとか、ドキュメント読むとか、元のソースコードを追うとか大切。

日記

100日目まであと3日!

100日目に書く記事何も考えてない!!!

とりあえず、少しずつ勉強する生活が安定してきました!

ブラックの会社の人より、自由時間使って勉強しないと置いていかれるって聞いて、
なるほどって思ったし、実際周りの友人残業やばい人いくらでも思い浮かぶし、
頑張って勉強して自分の成長に投資しないといけないですね。

頑張れ私ー!

今日の作業時間

30分+これからもう少しやります

今日の運動

エアロバイク1.5km+これからもう少しやります

PHPの==とか=って実際何してるんだろう【96日目】

演算子だってプログラム

何気なく書いてる+=ってありますが、これって何をしてるのでしょう。
プログラムによって仕様が違うわけで。

そこで先輩に教えていただいた言葉。
『“演算子“とは全てただの関数である』

あーなるほど、引数が2つあって、関数が動いてると考えると確かに・・・

ってことで先輩に問題出されました

"比較演算子"( <, >, ==, <=, >=)とはどのような関数でしょう?

"代入演算子"(=)とはどのような関数でしょう?

「◯◯をinputとし、◯◯をoutputする関数」って答えると良いよと言われたので、
php -aを駆使しながらいろいろ考えましたと。

これ、何気に難しかったです。

私の回答

"比較演算子"

a == b

aとbをinputとし、比較結果をbooleanでoutputする関数

"代入演算子"

$a = $b

[$aのアドレス]と$bをinputし、
[$aのアドレス]に$bを書き込み、
$aをoutputする

$aか$bかどっちを出力してるか調べるの大変だった。

代入演算子の回答を出すために使ったプログラム

$a = 0;
var_dump($a);
var_dump($b);
var_dump($a = $b);
var_dump($a);
var_dump($b);
var_dump($a = $a);
var_dump($a = $b = $c);

php -aで、エラーの出力、エラーが出ても実行する環境じゃないと再現出来ないかも。

実行結果は今手元にないので、明日の記事にしますね。

結論

何気なく使ってるものも意味がある。よく考察すると、理解が深まって、応用ができるようになるよ。

日記

勉強捗ってますね!いい感じにいろいろインプット出来てます!が!

vue、chart.jsが・・・苦戦・・・なんで動かないのこれ(´;ω;`)

ってことで、今日無理だったら明日以降友人に聞こうと思いましたまる。

運動

プログラミング

このあとやります。ただ予定あるので、30分プログラミングと1.5kmエアロバイクの予定。

時間ないからさくっと腹筋ローラーもやっておこう。