エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

dockerの勉強メモ

docker コマンドメモ

docker run -it --name "container_name" centos /bin/bash

docker run -d -p 8080:80 nginx
localhost:8080にアクセスするとnginxのホームが出る。

後で読む

131p

気になった単語

httpd デーモン

  • workdir
  • expose
  • volume

ログをマウント→ログの永続化、手元にログを管理出来るという利点あり。

サーバ3層

php-apacheの公式イメージ読んでみる

github.com

公式イメージ読んだら、

COPY docker-php-ext-* docker-php-entrypoint /usr/local/bin/

ENTRYPOINT ["docker-php-entrypoint"]
##<autogenerated>##
COPY apache2-foreground /usr/local/bin/
WORKDIR /var/www/html

EXPOSE 80
CMD ["apache2-foreground"]
##</autogenerated>##

って書いてたから、このイメージさんApache入れてhttpd起動までしてくれてる・・・って思ったけどなにこれ。

ENTRYPOINTでdocker-php-entrypointに書かれたapache2-foregroundのデーモン起動かと思ったら、
自動生成されたコマンドで、再度手動実行されてる・・・どういうことだ・・・?

そもそもdocker-php-entrypointの${1#-}はなんだ・・・$1は第一引数だけど・・・←もはやシェルの話になって脇道逸れたので諦める

追記:${1#-}の#-部分は-を前方一致で取り除くらしい。
-fが第一引数なら、 f != -fになってif文の中が実行されるってお話・・・なるほど・・・今度個別記事にしよう。

Man page of BASH

docker-compose.yml

コンテナのポート
ports→公開してるポート ホスト公開ポートから内部ポートへの切り替えもここ
expose→linkとかでコンテナ間でのみ使うポートはここ。データベースサーバとか。portsだと直接アクセスされちゃう。

【PHP】参照渡しと破壊的な関数とは。【103日目】

クイズ

swapは2つの値を入れ替える関数です。
swapを実行した後の$x,$yの値は?

例のプログラム

$x = 1;
$y = 2;

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

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

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

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

実行結果

f:id:willow710kut:20180124224742g:plain

どういうこと?

swap($x, $y);は、
function swap($a, $b)の$aに$x(=1)、$bに$y(=2)の値をコピーしているだけ。

だから、関数を実行した後も$xと$yの数値が変わらない。

swap2($x, $y);は、
function swap2(&$a, &$b)に変数そのものを渡している。 &$aは$xになり、&$bは$yになる。

従って、$xと$yの値がswap2の後に入れ替わっている。

&$aのような書き方を『参照渡し』と言い、 実行後に変数が書き換わるような関数を『破壊的な関数』と言う。

日記

シンボルテーブルについての説明は省略。

gifを使ってみましたが、見やすいでしょうか。

良さそうならこんな感じの記事を増やしたいところ。

プログラムってどうやって書くんだっけ【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の開発にも参加出来ました。仮想通貨のトレードを、ヴァーチャルな資金で体験しようというサイトです。
私も株とかの取引は体験してないので、その知識も得られたらなと。

https://coin-step.com/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+これからもう少しやります