エンジニアのひよこ_level10

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

シェルスクリプトで、引数がオプションか判断する方法【104日目】

参考元

github.com

dockerの公式イメージ読んでたら思わぬノウハウを。

結論

if [ "${1#-}" != "$1" ]; then

コードの意味

${1#-} なんぞやっていう。

Man page of BASH

${parameter#word} ${parameter##word} パターンに前方一致した部分を取り除く。 word が展開され、パス名展開の場合と同じようなパターンを作ります。 このパターンが > parameter の値の先頭部分とマッチする場合、展開して得られる値は parameter を展開した値から最短一致パターン (#''の場合) > または最長一致パターン (##'' の場合) を取り除いたものになります。 parameter が @ または * である場合、 パターンを削除する操作は全ての位置パラメータに順番に適用され、 展開結果はリストとして得られます。 parameter が @ または * が添字になっている配列変数である場合、 パターンを削除する操作は配列の全ての要素に順番に適用され、 展開結果はリストとして得られます。

つまり

if [ "${1#-}" != "$1" ]; then

-fが第一引数なら、 f != -fになってif文の中が実行される
some_nameが第一引数なら、 some_name != some_nameになってif文の中が実行されない

ってお話。

日記

Dockerの勉強してたら${1#-}が読めなくて友人に助け求めたらこんな面白い発見が。

シェルスクリプトで変数展開なるものがあるらしい。

こんな感じに変数を取得する時に、中身を変えてから出力出来るんだってね。#以外にもいろいろあるから、
今後使う時の参考にしようと思います。

とりあえず・・・今日はいっぱい勉強して疲れた・・・そして風邪が未だに治らない。

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」∠)