半農半エンジニアの記録

関西在住エンジニア。個人で勉強・開発したこと、その他趣味のことを書いてます。農業してます。

【kubernetes】php-fpmで環境変数が取得できない罠

kubernetes使う時に、コンテナに環境変数を渡してやるのは超が付くほど一般的だし、ほとんどの人がやることだと思います。 この度phpでそうする時にハマったのでメモしときます。

おさらい

コンテナへの環境変数の渡し方

渡したいコンテナにenvで設定してやります。

env
  - name: KEY
    value: VALUE

phpの環境変数参照方法

2つあります。(もっとあるかな?初心者なのでよく知りません)

  • getenv('KEY')
  • $_ENV['KEY']

ですね。

※後述しますが、これらも違いがあります。

普通ならこれで渡してあげたVALUEが取れるはずです。

今回は取れませんでした。。

今回の構成

ubuntu 18.04にnginxとphp-fpmでfastCGIを動かす、よくあると思われる構成です。

phpは5.6ですが、7系でも同じことが起こると思います。

詳細は後日まとめる予定。

解決方法

どうやらphp-fpmでは環境変数がリセットされるらしい!

なので設定ファイルをいじってやります。

clear_env=no

以下のファイルに /var/conf/php/5.6/fpm/pool.d/www.conf

clear_env=noを設定します。

今回はデフォルトでコメントアウトされていたので、解除してやるだけです。

これでgetenv()は取得できます。

ただし、$_ENVは取得できないかもしれません。

variables_order

/var/conf/php/5.6/fpm/php.ini の設定にvariables_orderという項目があって、こちらも今回は

GPCS

となってました。これを

EGPCS

としてやります。

これで晴れて$_ENVも設定されました!

おわりに

そろそろphpが嫌になってきた。

k8sのPHPクライアントライブラリのエラーを修正した

先日の課題が解決です。

www.m24te28.com

tl;dr

mergeしてもらったプルリクエストです。

github.com

振り返り

k8sのAPIクライアントは各言語向けに公式のものが用意されていますが、PHPは公式ではなく有志のものが紹介されています。

Client Libraries - Kubernetes

2つ紹介されていますが、私が使わせてもらったのはこちら。

※ネコ好きだからとかでは決してない!

github.com

で使ってる時にエラーが出てたので調べました。

調べる

エラーメッセージ

前回曖昧にしてたので、改めてエラーメッセージはこんな感じ。

"Deployment in version \"v1\" cannot be handled as a Deployment: v1.Deployment.Spec: v1.DeploymentSpec.Template: v1.PodTemplateSpec.Spec: v1.PodSpec.Volumes: v1.Volume: v1.Volume.VolumeSource: EmptyDir: readObjectStart: expect { or n, but found [, error found in #10 byte of ...|ptyDir\": \n |..., bigger context ...|\": \"shared\",\n \"emptyDir\": []\n }\n ]\n |...

expect { or n, but found [

がポイントっぽい。

マニフェストファイル

処理としては.ymlファイルを読み込ませてarrayに変換し、ライブラリのpods()->createメソッド呼んでるだけ。 先に.ymlの確認。

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}

実際のファイルでは無いですが、これで十分なので公式で公開されているマニフェストを参考にします。

emptyDir: {}

とあるのがエラーメッセージとかなり関係してそう。

ちなみにこのファイルで kubectl apply -f pod.yml とかすると正常にPodができます。

ソースコード

さてついにソースコードです。 create()の中を追っていきます。

Repository.phpという抽象クラスに集約されています。

抜粋)

 /**
     * Send a request.
     *
     * @param  string  $method
     * @param  string  $uri
     * @param  array   $query
     * @param  mixed   $body
     * @param  boolean $namespace
     * @return array
     */
    protected function sendRequest($method, $uri, $query = [], $body = [], $namespace = true)
    {
        $apiVersion = $this->getApiVersion();
        if ($apiVersion == 'v1') {
            $apiVersion = null;
        }
        return $this->client->sendRequest($method, $uri, $query, $body, $namespace, $apiVersion);
    }
...
    /**
     * Create a new model.
     *
     * @param  \Maclof\Kubernetes\Models\Model $model
     * @return array
     */
    public function create(Model $model)
    {
        return $this->sendRequest('POST', '/' . $this->uri, null, $model->getSchema(), $this->namespace);
    }

$modelに読み込んだマニフェストのarrayを渡しています。

呼び出し先はClient.php

 public function sendRequest($method, $uri, $query = [], $body = [], $namespace = true, $apiVersion = null)
    {
        $baseUri = $apiVersion ? 'apis/' . $apiVersion : 'api/' . $this->apiVersion;
        if ($namespace) {
            $baseUri .= '/namespaces/' . $this->namespace;
        }
        $requestUri = $baseUri . $uri;
        $requestOptions = [];
        if (is_array($query) && !empty($query)) {
            $requestOptions['query'] = $query;
        }
        if ($body !== null) {
            $requestOptions['body'] = is_array($body) ? json_encode($body) : $body;
        }
...
    }

ここの$bodyが渡された$model->getSchema()です。json_encodeしている。ここでしょう。

結論

expect { or n, but found [

ということなので、空の配列として認識されてるっぽい。

json_encodeにはオプションが指定できるらしい。使えそうなのを見つける。

JSON_FORCE_OBJECT (integer)

非連想配列を使用した場合に、配列ではなくオブジェクトを出力します。 出力を受け取る側がオブジェクトを期待しており、配列が空っぽである場合などに特に便利です。 この定数は PHP 5.3.0 以降で使用可能です。

これかな?

というわけで修正して実行!成功です!

あとは先の通りプルリクエスト出して、数時間後に無事マージしていただきました。

感想

オープンソースにコミットするのが初めてでしたが、ゲームやってるみたいで楽しいですね。

これからもっとやっていきます。

kubernetesの公式で紹介されているPodを作成しようとして400 BadRequestが返された話

phpのk8sクライアントライブラリを使ったときの話です。

使用したライブラリ

こちら、k8s公式でも紹介されているので信頼性が高いと思い採用しました。

GitHub - maclof/kubernetes-client: A simple yet elegant client for accessing and controlling a Kubernetes cluster (https://github.com/kubernetes/kubernetes)

400 BadRequest

k8s公式で紹介されているPodの定義です。

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}

で、これを読み込んでcreateする。

$client = new Client([
    'master' => 'http://master.mycluster.com',
]);
$conf = yaml_parse_file('pod.yml')
$client->pods()->create($conf);

すると400 BadRequestが返ってきます。もちろんPodは作成されません。

CLIではエラーが出ない

でもこれ、コマンドで実行するとエラーが発生しないんです!(いやそれが当たり前なんだよ公式だぞ

kubectl apply -f pod.yml

エラーを解消する

で、メッセージ見るとなんか言うてる。意訳すると

( があるべきとこに { があるよ?何してんの?

(あれ、逆だったかな。後ほど確認します。)

いやいやお前が何言ってんねん、と思いYAMLを確認すると、

emptyDir: {}

めっちゃ怪しいヤツいるやんー。

こうしてやりました。

emptyDir:

でPHP実行。上手くいきました!

ちなみに修正後のファイルでもCLIはちゃんと実行できます。

課題(解決)

とりあえず上記の通りPHPのAPIクライアントで実行した時にエラーになったので、こいつの問題である可能性が高い。

でもちゃんと調べてないのでそれを調べる。

追記

無事解決しました。やはりAPIクライアントの問題だったので、修正してプルリクエスト送りました。

https://www.m24te28.com/entry/20190308/1552038961www.m24te28.com

GKEでServiceやらIngressにstaticIPを設定する

GKEでロードバランサを使用すると、type:LoadBalancerのServiceを作成する方法とtype:NodePortのServiceを作成してIngressを立てる方法があります。

どちらでもstaticIPを設定できますが、試しにやってるとエラーが出たのでメモ。

経緯

ロードバランサーにIngressを立てる前提で進めていたんですが、ポートで分ける必要が出たのでIngressのままではできないので、Service使ってできないかなと思いました。

※ Nginx Ingress Controller を使えばL4ロードバランスできる、みたいなことちらほら見かけましたが、設定見るとL7でやってるのと同じに見えた。

遭遇したエラー

先にIngressでstaticIPを設定できることを確認できていて、その時に予約したIPをそのままLoadBalancerで使おうとして発生しました。GKEのことを理解されている方であれば、この時点でもうお察しかと思います。

で、こんなエラーが出ました。

Error creating load balancer (will retry): failed to ensure load balancer for service default/lb1: requested ip "xxx.xxx.xxx.xxx" is neither static nor assigned to the LB

つまり

ロードバランサ作るのに失敗したよ。リクエストしたIPは静的じゃないしLBに割り当てられてないよ。

原因

静的 IP アドレスを使用したドメイン名の構成  |  Kubernetes Engine のチュートリアル  |  Google Cloud

公式docにばっちり載ってました。

Service を使用してアプリケーションを公開する場合は、リージョン IP アドレスを作成する必要があります。次のセクションで説明するように、グローバル IP アドレスは Ingress リソースタイプでのみ機能します。

というわけでリージョンのIPを予約して設定してみたら、無事成功しました。

まとめ

Service使ってL7ロードバランスっぽいことができました!

複数のServiceに同じstaticIPを割り当てて、ポートで別のPodに向けてます。

これがk8sの思想に合ってるかはわかりません。。

余談

ちなみに解決したのでいいんですが、このエラーメッセージわかりにくくないですか?

一応staticIPやし。。

というのと、エラー出てるくせにGCPコンソールではサービスには青チェックついてて正常に動いてるように見えるのに、アクセスしたら動いてない、というのも微妙。

サービス→イベント を見てようやくエラー出てることに気づきました。

MySQLで「SQLSTATE[HY000] [2002] No such file or directory」となってハマった時の対処

MySQLのエラーログ

MySQLの設定してたら、こんなエラーに遭遇しました。

PHP message: PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002] No such file or directory' in ...

ログ解析

ファイルかディレクトリが無いよ云々。

とは言ってるものの、それらしい名前が出てないから探しようがない・・・。

とりあえずググる

エラー内容そのままググればそれらしいのを書いてくださっている方がいました。

SQLSTATE[HY000] [2002] No such file or directoryが出たときの対処方法

localhost -> 127.0.0.1 にするだけらしい。

原因

「localhost」だとWindowsでは名前付きパイプを使用して接続され、名前付きパイプ接続が有効にされていない場合は、エラーが発生するそうです。 「127.0.0.1」はTCP/IPで接続されるため、エラーが出なくなったというわけでした。

ということらしい。

課題

正直よくわからんけど、自分の環境はクライアントがWindows、サーバーはUbuntuだったので「Windowsでは」ってのはクライアントのことなんかな?

Macだったらlocalhostのままでよかったのか?

調べたら追記する。

dockerのubuntu18.04でnginxとphpの環境作成

前回の続き

www.m24te28.com

tl;dr

githubに載せたので、そちらでどうぞ。

github.com

おさらい

dockerコンテナを使ってubuntu 18に入れたnginxでphpを動かす環境を作ります。

最終的にはKubernetesへのデプロイも考えてますが、まずはdocker-composeで動かせるところまで。

構成

最終的にはこんな感じになります。

.
|--docker-compose.yml
|--html
|  |--index.php
|--nginx
|  |--Dockerfile
|  |--nginx.conf
|  |--server.conf
|--php
   |--Dockerfile

コンテナ使わずにやるならnginxとphpは1つのインスタンスに入れると思いますが、コンテナはプロセス毎に分けるのがベストプラクティスとされているので分けます。敢えてね。

設定ファイル

nginx

Dockerfile for nginx on ubuntu

server.conf(抜粋)

phpの処理をphpコンテナに送ります。

        location ~ \.php$ {
              include snippets/fastcgi-php.conf;
        
              # With php-fpm (or other unix sockets):
              fastcgi_pass php:9000;
        }

fastcgi_pass php:9000;

のphpはdocker-compose.ymlのservice名で名前解決しているので、適宜変更してください。

nginx.conf

include /etc/nginx/sites-enabled/*; を消すだけです。

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        gzip on;

        include /etc/nginx/conf.d/*.conf;
}

php

Dockerfile for php on ubuntu

docker-compose

compose nginx and php via http

nginxとphpの通信

server.confに記述しているように、phpファイルはphpのコンテナに処理を移譲します。

このnginxとphpのやりとりにsocket通信かhttpを設定できて、どちらを使うかによって設定が変わります。

上記の設定ではhttpで行なっているので、socket通信する場合はgithubの方に修正箇所を記載したのでそちらを参照してください。

まとめ

phpを動かすのが初めてだったので少し苦戦しましたが、最終的な内容を見るとこんなもんかという感じでまだまだ勉強せな、となりました。。

次回はKubernetesで動かしてみます!

dockerのubuntuコンテナにnginxを設定

dockerのubuntuでnginxとphpを動かすことになったので、調べたことのメモ

今回はubuntuにnginxを設定します。

環境

  • ubuntu 18.04
  • nginx 1.14.0
  • php5.6(予定)

Dockerfile

Docker Hubのnginxがalpineかdebianだったので、ubuntuイメージをベースにします。

FROM ubuntu:18.04

LABEL maintainer=""

RUN apt-get update && \
    apt-get install -y -q curl gnupg2
RUN curl http://nginx.org/keys/nginx_signing.key | apt-key add -

RUN apt-get update && \
    apt-get install -y -q nginx

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

イメージビルドしてコンテナ起動します。

docker build -t my-nginx .
docker run  --rm -p 443:443/tcp -p 80:80/tcp my-nginx:latest

--rmはコンテナ終了時に削除するオプションなので、不要なら削除してください。

いったんlocalhostにつないでnginxのindex.htmlが表示されることを確認。

(追記)

ちなみにnginxのインストール前に以下を入れるとvar.1.14.2になり、設定が変わります(nginxのrootが/usr/share/nginx/htmlになったり)。今回は無しで動かしてます。

RUN touch /etc/apt/sources.list.d/nginx.list && \
    echo "deb http://nginx.org/packages/ubuntu/ bionic nginx" >> /etc/apt/sources.list.d/nginx.list && \
    echo "deb-src http://nginx.org/packages/ubuntu/ bionic nginx" >> /etc/apt/sources.list.d/nginx.list

nginxの設定

以前nginxの設定したのはWindows Serverで、nginxもだいぶ前のバージョンだったのでデフォルトの設定を確認しました。

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}
.
.
.

どうやら仮想サーバーの設定は別のところでするらしい。

確認すると/etc/nginx/conf.dは何も入っておらず、 /etc/nginx/sites-enabledにデフォルト設定が入ってました。

server {
        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;
}

rootの場所にindex.nginx-debian.htmlがあったので、これを変更してlocalhostで変更が反映されることが確認できました。

conf.dとsites-enabled

nginx.confでこれらをincludeしてますが、違いがわからなかったので調べました。

パッと見ですが公式のドキュメントを見つけられなかったので、以下の内容をざっくりまとめます。

linux - What is the different usages for sites-available vs the conf.d directory for nginx - Server Fault

共通

  • serverごとにファイル分けておく

conf.d

  • こっちがベストプラクティス
  • 外したい設定はファイルの拡張子変える
  • こっちの方が速度で有利?(ファイル直接だから?)

sites-enabled

  • sites-enabledはsites-availableへのシンボリックリンクを入れる
  • この構成はdebian系の名残
  • 外したい設定はシンボリックリンク外す

ということなので、conf.dにserver単位で設定ファイルを置いていくのが良さそうです。

phpの設定

これは次回やります。

nginxではapacheとはphpの動かし方が異なるらしい。

そもそもapacheでも設定したことないけど。

MySQLをdockerコンテナで初期データとともにデプロイ

とりあえず調べたのでメモ。

Dockerfile

これだけです。

FROM mysql:5.7

COPY [FILE_NAME_FROM] /docker-entrypoint-initdb.d/[FILE_NAME_TO]

コンテナが初めて起動されたときにだけ、docker-entrypoint-initdb.dディレクトリにある.sh、.sql、.sql.gz拡張子のファイルを実行するらしい。

SQLの実行対象はデフォルトでMYSQL_DATABASE変数で指定した場所。

アルファベット順に実行されます。

Excelのセル着色と表作成のショートカットをマクロで実現

excelで資料作成

excelで資料作成するのは割とどこでもやってますよね。

そのときにセルに色を付ける(ペンキマーク)ことって多くて、かつ好みとかで使う色って割と限られてると思うんです。

なのでそんなマクロを作ってショートカットキーに設定すると仕事捗るので紹介します。

セル着色

選択してるセルを着色します。

なんでこのショートカットキー無いねん!と昔から思ってました。

色はお好きなのに変えてください。

ちょっと変更すれば、1色ではなく複数の色をループさせれます。

コード

Sub set_color()
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorLight1
        .TintAndShade = 0.499984740745262
        .PatternTintAndShade = 0
    End With
End Sub

表作成

範囲選択して実行することで、枠線とセル着色で選択部分を表っぽく描画します。

1列しか選択していない場合はヘッダのみ描画されます。

実行イメージ

表作成マクロ実行前
マクロ実行前
↓↓↓↓
表作成マクロ実行結果
マクロ実行結果

コード

Sub draw_table()
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    With Selection.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlHairline
    End With
    With Selection.Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlThin
    End With
    
    Range(Selection(1), Selection(1).Offset(0, Selection.Columns.Count - 1)).Select
    
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlDouble
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlThick
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    With Selection.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlHairline
    End With
    Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorDark1
        .TintAndShade = -0.149998474074526
        .PatternTintAndShade = 0
    End With
End Sub

豊中市居場所づくりアイデアソンに参加してきました

豊中市居場所づくりアイデアソンとは?

豊中市居場所づくりアイデアソン - connpass
簡単に言うと、地域活性化のためのコンテンツ、サービスのアイデアを皆で一緒に考えましょう!という会。

参加動機はアイデアソンやってみたいのと、医療従事者やシステムエンジニアを明確な対象者としてたので自分と似たような人と知り合える可能性高そうな感じしたからです。

あと地域としても豊中市で生まれ育ったことでしょうか。(兄が庄内駅前で焼鳥屋やってることは微塵も関係ありません)
本格炭火焼鳥 松家 - 庄内/焼鳥 [食べログ]

 

アイデアソンに参加してみて

アイデアソンには初めての参加でしたが、成果はあったかと。

じっくり考えるアイデアもいいけど、閃きのアイデアも大事

熟考するとどうしても実現可能性を意識してしまう。
自分が閃き系のアイデアを出すのが苦手なのは自覚していて、アイデアソンのベテランの方曰く、慣れれば出てくるようになるとのことなので続けていきたい。

自分の知らないリソースがたくさんある

庄内は前述の通りで呑みに行く程度だったので居酒屋しかないやろ、くらいの感覚でした。
が、庄内には森友学園を筆頭に阪急バスの本社や大阪音大(今日の会場)があったり、市の花はバラで庄内にバラ栽培の会社があったり、ローズ球場やマリンフードのグラウンドまで割と幅広く備えているらしい。

医療・介護従事者が多かった

これはアイデアソンのテーマ次第ですが、聞こえてくる会話からして医療とか介護従事者が多かった。
仕事に繋がりそうな人とも出会えた。狙い通り。

アイデアソンの結果は・・・

肝心のアイデアソン自体の結果ですが、自分がいたチームは最終的にちょっとアイデアが発散しすぎて何がやりたいのかわからなくなってしまった。途中から参加したこともあり話にうまく乗れず軌道修正できなかったのは反省点。チームの中に良いアイデアはあったので余計に残念でした。最優秀賞を取ったチームは個人的にも一番良いなと感じたので文句ナシです。

今後もアイデアソンに参加したい

勉強会や技術のMeetupと違って参加者の属性が幅広い!
いろんな人のアイデアを聞けるのは貴重やし総じて楽しかったのでまた参加したいです。

帰りは兄の焼いた焼き鳥とビールを頂いて、自宅に向かうバスの中から更新でした。

Google Kubernetes EngineでKubernetesデビュー

Kubernetesはデファクト

今やコンテナ仮想化といえばdocker、dockerといえばKubernetesという雰囲気。
案の定技術者は取り合い。
Kuberenetesのスキルは、いま飛び抜けて米国の転職で有利。米Dice&米Indeed - Publickey
うちはRancher 1.xで docker運用していて、今の2.xと違ってKubernetes推奨ではなかったので当時推奨されてたらしい?kettleを使用してます。(ジョイン前の話なのでよく知らない)
でもまあRancher2.1でkettle→Kubernetesの移行がサポートされたらしいので、Kubernetesに変える機会をひっそり伺ってました。
で、別案件でKubernetesを使う機会に恵まれたので、無事デビューが決まりました!

ただ、まだ触ってません笑。

Kubernetesは覚えることが多そうだ

業務で使うことになったので、見積もりのために顧客の要件を聞いて調査始めたところです。
一応勉強会とかには何度か行って、動向だけは追ってるつもりでしたが、勉強し始めてみると全然わかってないなーと実感してます。
ただ動かすだけならコンソールぽちぽちしてればできるでしょうけど、せっかくなのでしっかり自分のスキルとして積んでおきたいです。
とりあえず明日からアカウント登録して実際に触ってみる予定です。
なので今日はそんなに書くことがないんですが、前から気になってることを書いときます。

なんて呼んで(読んで)ますか?

KubernetesのWikipediaの冒頭に「クバネティス/クバネテス」と書いてます。
でもそんなんはどっちでもいいんです。
「エムバペ」なのか「ムバッペ」なのかくらいどっちでもいいです。
外国語をカタカナで表記するのには限界があるので。
問題はね、これですよ。

「よくK8sと略記される」

これ、初めてmeetup行ったときある意味衝撃でした。
その日は6,7人登壇してたと思うんですけど、半分くらい
「ケーハチエス」
って言ってたんですよ。
自分は「ケイツ」やと思ってましたよ。
Avril Lavigneの「sk8er boi」と同じですよ。ね?
Kubernetesは初心者ですが、これだけは言っときたかった。

chromebookがどんどん使いやすくなっていく

chromebookの新機能!

この記事見て、今日知りました。
japanese.engadget.com

何気に面倒な一手間をしなくてよくなるって大きいと思うんですよね〜。

我が家のchromebook

我が家では2台のchromebookが活躍してます。

1つは妻が使用してますが、youtubeとネットサーフィン、たまにブログくらいの用途なので、起動も早いしバッテリーの持ちもいいので満足してます。
ASUS C302CA シルバー 12.5型ノートPC【日本正規代理店品】インテル Core m3-6Y30/4GB/eMMC 64GB/?C302CA-F6Y30/A

私が愛用してるのは、もう一回り小さい機種です。持ち運びするので軽いのを選びました。
あと購入後でしたけどLinux動かせるようになったのも、私がこちらを使ってる理由ですね。
ASUS Chromebook Flip C101PA シルバー 10.1型ノートPC【日本正規代理店品】CP1 Hexa-core/4GB/eMMC16GB/C101PA-OP1/A

chromebookの現時点の使い勝手

キーボードは好みにも依りますが、私は結構気に入ってます。
ちなみにどちらもUSキーボードを選んでみたんですが、慣れると日本語キーボードが嫌になってきます。笑

1つ、chromebook使ってるので不便なのが、トラックパッドの操作です。
macbookだと3点タッチでドラッグができますが、chromebookの場合はブラウザのタブが切り替わるだけなんですよね。。
これ設定変えれないんかなぁ。。。。

LINE Things ハンズオンに参加してきました

ハンズオン初参加!

昨日大阪で開催されたLINE Thingsハンズオンに参加してきました。

【好評につき増枠!】LINE Things ハンズオン @大阪 - connpass

ハンズオンイベントは行ったこと無かったんですが、IoTやってみる良い機会だと思ったので。

 

今回のハンズオンの内容 

昨年末に東京で開催されたものと同じ内容らしいです。

手順・資料はQiitaに投稿されています。

LINE Things Developer Trial ハンズオン - Qiita

こちらにLINE Thingsとは?みたいなことも含めて詳しく書かれているので、その辺は割愛。

 

ハンズオンやってみて

ハンズオン自体は資料見ながら進めれば、IoT初心者の自分でも特につまづく事なく最後までできました!

かなりIoT開発の敷居が下がるのかな、というのは感じましたね。

今はまだ、LIFF(LINE上でWEBを動かすプラットフォーム)でLINE Thingsプロダクトをユーザー操作で起動する必要があるようですが、年内(というか近いうち?)にはそのユーザー操作も不要にできるようになる見込みのようです。

 

またLINE社の方も来ていて、開発事例をいくつか紹介されていました。

個人的には、赤外線センサーで心拍と血中酸素濃度を測ってLIFFで表示するやつが、病院・介護施設でめっちゃ需要ありそうやなと感じました。

 

次はハッカソン

ちなみに今回のハンズオンは、来月にあるハッカソンに向けてのプレイベントとのこと。

LINE Things ハッカソン @大阪 - connpass

行きたいけど東京出張の予定が入るかもなので、まだ参加表明していません・・・。

なんとか都合合わせて参加したいところ。

 

そういや年末にLT発表したやつ、まだ仕上げてなかった・・。

docker meetup kansai に行ってきました

dockerの勉強会に参加

タイトルの通り、先日(1ヶ月経ってますが)docker meetup kansaiなる勉強会に参加してきました。

dockerkansai.connpass.com

 

  • 業務でdockerとrancherで本番環境を動かしている
  • 開発でdockerを使っているけどあまりいい感じで使えてない

という背景があって、参考になる話が聞けないかなと軽い気持ちで行きました。

 

rancherは特に事例が少ない?

が、その狙いは全く当たらず。。

話によると、関東ではdockerを本番環境に採用する企業が増えているが、関西ではまだ少ないとのこと。ここでも関東>関西なのか・・・。

rancherもあんまり事例無いし、ググっても情報も少ないので、次はRancher meetupに行ってみようと思います。

代わりに?いろいろ(自分にとっては)新しい話をいろいろ聞けました。

 

 今後勉強するようのメモ

  • OpenFaas
  • CNCF

情報処理技術者試験の勉強方法

情報処理技術者試験にpythonがジョイン!

www.itmedia.co.jp 最近、情報処理技術者試験に関するツイートをよく見かけます。
私は数年前に基本情報、応用情報、DBスペシャリストに合格してるので、勉強方法とか紹介してみようと思います。

どんな試験か?

まず軽くそれぞれどんな試験か主観的な意見とともに紹介しておきます。

  • 基本情報
    ITにおける知識を広く浅く問われる。
    午前・午後ともに選択式。
    過去問数年分と参考書1冊1周すれば合格できる。
    試験の雰囲気を味わったり勉強するきっかけとして受験すれば良いと思う。

  • 応用情報
    ITにおける知識を広く浅く問われる。
    午前は選択式、午後は記述式。
    用語をしっかり理解しておけば午後試験も特別な勉強は不要。

  • DBスペシャリスト
    ITにおける基本的な知識およびデータベースに関する専門的な知識を問われる。
    午前は選択式、午後は記述式。
    業務でデータベースの設計を経験していれば容易に合格レベルまでいける。
    非エンジニアの場合はここまで勉強するメリットはそんなに無さそう。

どの試験にも言えることですが、あくまでITに関する知識を問うだけの試験なので、合格してるからといって仕事ができるかとか良いエンジニアかどうかとかは測れません。「どの程度専門用語を交えて話しても通じる人か」の目安でしかありません。

どれを受験するか

私は基本→応用→DBと順に受験しましたが、情報処理の試験は下位の試験に合格していなくても上位の試験が受験できます。
基本から受けたのは、一番近いのが春の試験だったからのと、会社が合格したら奨励金を出してくれたからです。
そういう事情がなければ半年に1回(高度試験は1年に1回)しか受けれない試験ですし時間の無駄なので、自分がゴールとする試験を受験すればいいです。

勉強方法

  • 基本情報
    上記の通り選択式のみの試験ですし、過去問も結構そのまま出ます。
    ありがたいことに無料で公開されているので、それを解けばいいでしょう。 応用情報まで目指す人は、基本情報の参考書は買わずに応用情報の参考書でいけます。
  • 応用情報
    午前は基本情報と同じで過去問と参考書やっとけばいけます。
    午後が基本情報との一番の違いで、記述式なので用語を理解しておくことが大事。でも逆に理解できていれば、実はただの国語の試験。
    なので結局参考書だけで十分。
  • DBスペシャリスト
    午前は上記2つと同じやり方で十分。
    個人的に一番の難関?はER図書くところだと思います。
    これ業務でもそんなにしっかり作ってるところって無いでしょうし、作ってても自動で作ったりするので手書きなんて。。
    これこそ過去問やるしか無いです。

結局改めて振り返ってみると、参考書やっとけということになってしまいましたね。。

とはいえ無駄なくまとまってるのでやはり間違いないです。(というか参考書に載ってない問題も数問出る)

ちなみに必ずしも最新の参考書を買う必要は無いと思うので、メルカリで去年のやつとか安く帰るのであればそれでも足りると思います。

参考書の持ち運び

こういった試験の参考書って試験が終わったらほぼ用無しになることが多いし、分厚くて重いものが多いです。

なので私は章ごとに裁断して持ち運んでます。

通勤通学中に電車とかで読む人にはオススメです。

勉強は計画的に

やたらと「簡単だ」ということを書きましたが、だからと言って勉強しなくて合格できるわけでも無いです。

でもほとんどの人が半年または1年スパンで勉強の計画を立てると思うので、1日30分とかで半年続ければほぼ確実に合格できます。

あまり参考にならなかったかもしれませんが、これから受験しようと考えてる方は頑張ってください!