OmniAICreator/Qiita-1.07M huggingface dataset:
Javaのお勉強#7(分岐構文の種類)

## 三種類のif構文
- if文とは
**条件が満たされなかった場合、何もしない**
結果が**false**の場合、何もしないという場合は**else**を省略できる文。

```java
if ("条件式"){
    //ブロック１
}
```

- if-else if-else構文とは
**もし条件が満たされなかった場合、別の条件で評価したい**
else ifで始まるブロックをelseの前に挿入した**if-else if-else構文**

```java
if ("条件式1"){
    //ブロック1
} else if ("条件式2"){
   //ブロック2
} else if ("条件式3"){
  //ブロック3
} else {
 //最終ブロック
}
```

if-else if-else構文は、1つの文で3つ以上のルートに分岐できる。
この構文にはルールが2つある。
一つはelse ifブロックは**複数記述できる**が、**ifブロックより後ろ**、
**elseブロックより前にだけ**記述できる。

## 雑談
まだ二種類しか書けていませんが、今日はここまでで…
いろいろ頭を整理するところはありますが、明日からはもう少し早めの更新を心がけていこうと思います。
忙しいのもあって、へこたれそうですが頑張って勉強は続けていこうと思います！
明日は今回掛けなかったswitch構文について！これも書いて行こうと思います。
【Java】サーブレットフィルタ


ちょっと調べたので備忘。。。

---

#<<何者？>>
- サーブレットやjspの共通処理を記述するための仕組み
- サーブレットを呼び出す前や終了する前に自動的に呼び出される
- 続けて、次のフィルタ呼び出したければ、chain.doFilter()を呼び出す<br>**→コメ最後のフィルタの時は、サーブレットが呼ばれる**


#<<どうやって使う？>>
- java.servlet.Filterインタフェースを実装したクラスを作成して使う
- 使えるメソッド（長くなるので、引数は省略）
	1. void init()；初期化時に一度だけ呼び出される
	1. void doFilter()；フィルタ処理
	1. void destroy()；終了時に一度だけ呼ばれる

#<<関連するインタフェース>>
- java.servlet.FilterConfigインタフェース
	- init()メソッドの引数に指定されっる
	- web.xmlに指定されたパラメータを取得するときに使う
- java.servlet.FilterChainインタフェース
	- doFilter()メソッドの引数に指定される
	- フィルタを複数呼び出される（フィルタチェーンという）
pythonのone-liner

# pythonistaとしておさえておきたいコーディング

## ~~if部門~~ 三項演算子のif判定

```python:python
debug = 1
DEBUG_FLAG = True if debug else False

```

### 活用例:

実行環境や状況に合わせる事で、削除や変更漏れを防げる。
自分の場合は、開発環境がmacなので、プラットホームでMacの場合のみ、デバッグモードにするなどして、「開発環境、テスト環境、本番環境」で自動識別で活用している。

#### 追加

```python:python
f=("NG", "OK")[x==0]

#xが、0だった場合、OK
#xが、0意外だった場合、 NG
```

[コメント](https://qiita.com/jack-low/items/ab3023ff67829ff42aa0#comment-994abf75352f1bc63fde) にもあるように 
個人的には、Socketモジュールで使ってたりします。
例えば、`socket.connect_ex()`では、
正常処理の場合は、0が返ってくるため、それ以外は排除する時などに利用してます。
あとは、応用で色々な物でも使えます。

## 辞書オブジェクトdict(key, value)

```python:python
cnf = {'default': { 'PROJECT' : 'PROJECT_NAME', 'SERVER_NAME' : 4, 'DEV' : 'yes', 'API' : 'yes', 'GZIP' : 'yes', 'LOG' : 'no', 'WIFI' : 'no', 'PORT' : 8000, 'URL' : '127.0.0.1'}, 'custom':{'PROJECT' : 'PROJECT_NAME2'...省略...}}
INI_CONFIG     = {k: str(v) for (k, v) in cnf['default'].items()}
```

### 活用例:

例えば、defaultのみ参照したい場合など、keyに属する辞書型を参照する際、
keyを追加されても継承できるので、コード影響が少なく済む。
このようなコードを組み込む事で、可変時に強くなる。


次の更新を待たれよ…続く…
GCP Always FreeでのGoogleさんのオゴリ額を調べる

Google Cloud Platformの無料枠（[Always Free](https://cloud.google.com/free/)）で提供されているサービスについて、無料枠が無かったとしたら本来おいくら相当なのか、調べてみました。

（下記に挙げたサービス・内容が無料枠の全てではありませんが、普段GCPを使っていない人にも魅力のありそうなサービスを独断で選んでみました）

# GAE (Google App Engine)

スケーラビリティ高いけど少し不便な元祖PaaS！

| 内容             |             無料枠 |          月間オゴリ額 |
|:-----------------|:------------------|------------------:|
| フロントエンドインスタンス | 28時間/日 |             $42.00 |
| バックエンドインスタンス | 9時間/日 |             $13.50 |
| GCSストレージ     | 5GB/月 |             $0.10 |

無料枠はStandard Environmentのみです。念のため。

# GCE (Google Compute Engine)

Linuxのインスタンスが1台使い放題！

| 内容             |             無料枠 |            月間オゴリ額 |
|:-----------------|:------------------|------------------:|
| f1-microインスタンス（USのみ） |   1インスタンス/月 |  $3.88 |
| HDD              |           30GB/月 |             $1.20 |
| 下りネットワーク(中国・豪州以外)  | 1GB/月 |           $0.12 |


# GCS (Google Cloud Storage)

AWS S3と同様のクラウドストレージが無料で使える！

| 内容             |             無料枠 |            月間オゴリ額 |
|:-----------------|:------------------|------------------:|
| Regional Storage（USのみ） |   5GB/月 |             $0.10 |
| 下りネットワーク  |             1GB/月 |             $0.12 |
| クラスAオペレーション |             5000/月 |             $0.025 |
| クラスBオペレーション |             50000/月 |             $0.02 |


# BigQuery

ログなどを適当に入れておけばいつでも検索可能！

| 内容             |             無料枠 |            月間オゴリ額 |
|:-----------------|:------------------|------------------:|
| クエリ使用量      |             1TB/月 |             $5.00 |
| ストレージ        |            10GB/月 |             $0.20 |

# Google Cloud ソースレポジトリ

個人で無料でプライベートリポジトリが作れるよ！

| 内容             |             無料枠 |            月間オゴリ額 |
|:-----------------|:------------------|------------------:|
| 利用ユーザー      |     5プロジェクト人/月 |             $5.00 |
| ストレージ        |            50GB/月 |             $5.00 |
| 下りネットワーク  |            50GB/月 |             $5.00 |

ライバルの[Amazon CodeCommit](https://aws.amazon.com/jp/codecommit/)と同等の無料枠になっています。

# 月間オゴリ総額まとめ

| サービス          |       月間オゴリ総額 |
|:-----------------|------------------:|
| GAE              |             $55.60 |
| GCE              |             $5.20 |
| GCS              |             $0.265 |
| BigQuery         |             $5.20 |
| Google Cloud ソースレポジトリ | $15.00 |

GAEが優勝ですね！

調べてみて、GCSのオゴリ総額が断然少ない、という気づきを得ました。逆に言えば、GCSは原価ギリギリでやっているということの表れかもしれません。BigQueryやGCEはオトクな気がしていましたが、実際オトクですね。GAEは定価が高いなあ…。

# 参考URL

- https://cloud.google.com/appengine/pricing
- https://cloud.google.com/compute/pricing
- https://cloud.google.com/storage/pricing
- https://cloud.google.com/bigquery/pricing
- https://cloud.google.com/source-repositories/pricing
「USB3.0 カメラについて調査中」を大幅に書き足しました。

以下の記事に事例を増やして書き直しました。
USB3.0 のカメラモジュールの他に
USB3.0のインタフェースを持つステレオカメラについても追記しました。
カメラを探すうえで最初のヒントになると幸いです。

[USB3.0 カメラについて調査中](https://qiita.com/nonbiri15/items/1b2123b76e8b6b88fe28)
【議事録】Laravel 5.4 Artisanコンソールにtcpdf_addfont.phpコマンドを追加

# 背景
下記の記事で日本語のPDFが使えるようになりましたが、vendor/tecnick.com/tcpdf の中にフォントが追加されてしまうので、gitコミットができません。
https://qiita.com/edisonthk/items/01c84ed6d0fceee19a8c

せっかくローカルでは日本語が使えるようになったのに、コミットされないと、awsやherokuなどにデプロイされても日本語が使えません。

それで、デプロイ時にtcpdf_addfontが実行されるようにartisanコマンドに追加しました。

# tcpdf_addfontのArtisanコマンドを作成

Artisan コマンドを作成

```
php artisan make:command TcpdfAddFont
```

app/Console/Kernel.php にコマンドを登録 (Register)

```app/Console/Kernel.php
protected $commands = [
    ...
    Commands\TcpdfAddFont::class,  // これを追加
　　　　　　　　...
];
```

```app/Console/Commands/TcpdfAddFont.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use TCPDF_FONTS;

class TcpdfAddFont extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'tcpdf:add-font {font-file} {font-type}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'TCPDFに新しいフォントを登録、追加するコマンド';

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {

        $fontFile = $this->argument('font-file');
        $fontType = $this->argument('font-type');
        $enc = '';
        $flags = 32;
        $outpath = '';
        $platid = 3;
        $encid = 1;
        $addcbbox = true;

        // 関数の詳細はvendor/tecnick.com/tcpdf/include/tcpdf_fonts.php を参照してください。
        // 
        $fontname = TCPDF_FONTS::addTTFfont(base_path('resources/fonts/'.$fontFile), $fontType, $enc, $flags, $outpath, $platid, $encid, $addcbbox);

        if($fontname === false) {
            $this->comment('フォント登録失敗しました');
        } else {
            $this->comment($fontname.'を登録しました');
        }
    }
}

```

`<project_root>/resources/fonts/`フォルダに`ipaexg.ttf`を配置。

最後にcomposer.jsonにTcpdfAddFontコマンドが実行されるように追加

```composer.json
{
...
    "scripts": {
        ...
        "post-install-cmd": [
            ...
            "php artisan tcpdf:add-font ipaexg.ttf TrueTypeUnicode"
        ],
        "post-update-cmd": [
            ...
            "php artisan tcpdf:add-font ipaexg.ttf TrueTypeUnicode"
        ]
        ...
    },
...
}
```
【HTML】CSSによる検索フォームのデザイン

## デフォルトのデザイン
![form00.PNG](https://qiita-image-store.s3.amazonaws.com/0/205287/5c1afd45-9664-2652-36a8-84651a59d25b.png)

```html:HTML
<form action="#">
    <input type="text">
    <input type="submit">
</form>
```
## 一体型
![form01.PNG](https://qiita-image-store.s3.amazonaws.com/0/205287/4b70a557-246d-c332-a7e1-a85a909fbb40.png)

```html:HTML
<form id="form01" action="#">
    <input id="input01" type="text"><!--
    /input間で改行したい場合はコメントアウト必須/
    --><input id="submit01" type="submit" value="検索">
</form>
```
```css:CSS
#form01{
    background-color: white;
    width:200px;
    height: 20px;
    border: 1px green solid;
}
#form01 input{
    vertical-align: top;
    margin: 0px;
    height: 100%;
    box-sizing: border-box;
    background-color: transparent;
}
#input01{
    width: 150px;
    border: none;
    border-right: 1px green solid;
}
#submit01{
    width: 50px;
    border: none;
}
```
## 一体型(画像ボタンによるsubmit)
![form03.PNG](https://qiita-image-store.s3.amazonaws.com/0/205287/f9ea2452-a452-ab72-1d27-5a85dbc70f5f.png)

```html:HTML
<form id="form02" action="#">
    <input id="input02" type="text" placeholder="検索"><!--
    /input間で改行したい場合はコメントアウト必須/
    --><input id="submit02" type="submit" value="">
</form>
```
```css:CSS
#form02{
    background-color: white;
    width:200px;
    height: 20px;
    border: 1px green solid;
}
#form02 input{
    vertical-align: top;
    margin: 0px;
    height: 100%;
    box-sizing: border-box;
    background-color: transparent;
}
#form02{
    border-radius: 10px;
}
#input02{
    border: none;
    width: 170px;
    padding-left: 10px;
}
#submit02{
    width: 30px;
    border: none;
    background-image: url(画像へのパス);
    background-position: center;
    background-size: auto 90%;
    background-repeat: no-repeat;
}
```
pythonでprogressbar

# progressbar2
検索して一番上に出てきた日本語の記事が古いせいか微妙に動かなかったので、日本語のメモを残す。
使うライブラリは、python3ならprogressbar2、python2ならprogressbarを使えばいい。
今回使ったのはpython3のprogressbar2なので注意。

```py3
from progressbar import ProgressBar

min = 0
max = 100

p = ProgressBar(min, max)

for i in range(100):
    p.update(i)
```

こんな感じに、第一引数に数値の最小値を設定しないといけなくなった。
僕が参考にしたページではmaxしか設定していなかったのでエラーになって動かなかった。
ちなみに、経過した時間を自動で測定して終了までの推定時間を表示してくれるのが最高に便利。

progressbarにはこれ以外にもアニメーションするアイコンや現在の時間、フォーマットの指定など便利そうな機能があったのでオシャレな待機時間を演出したい方は是非ご利用下さい。

# 表示フォーマット
デフォルトのフォーマットでも十分に使えるけど、必要なら他にも色々な情報が表示できる。
フォーマットを指定するためには、ProgressBarのwidgetsキーワードにリストとして渡す。
文字列なんかはそのまま表示される。どんなwidgetがあるかは公式のドキュメント見ればなんとなく分かると思う。
どうも内部で関数の実行なんかもできるっぽいのでやろうと思えばオリジナルの拡張なんかも書けそう。

```py3
import progressbar
import time

prog_bar = progressbar.ProgressBar(0, 100, widgets=[
        progressbar.CurrentTime(), ':',
        '(', progressbar.Counter(), ' of {}) '.format(100),
        progressbar.Bar(),
        ' ', progressbar.ETA(),
    ])

for i in range(0, 100):
    prog_bar.update(i)
    time.sleep(1)
```

これで現在の時刻とカウンター、プログレスバー、推定終了時間が表示されるようになった。
visudoの魔のオプションxとは

本当にあった怖い話です。

# 前提
ubuntu14, 16で動作検証しております。

# visudoについて
visudoは`/etc/sudoers`を安全に編集する為のツールです。この`/etc/sudoers`はsudo周りの重要な設定が書かれたファイルです。編集を失敗すると最悪sudoする事ができなくなる場合があります。
なのでvimなどでは絶対に編集してはなりませぬ。

/etc/sudoers のパーミッション

```
vagrant@vagrant-ubuntu-trusty-64:/$ ll /etc/sudoers
-r--r----- 1 root root 755 Oct 14  2016 /etc/sudoers
```

とwrite権限がそもそも与えられてないので編集するために`chmod +w`とするのもいけませぬ。
法をくぐり抜けるような悪い考えはやめましょう。

`visudo`を使えば、シンタックスエラー等がある場合は編集時に教えてくれます。

```
root@vagrant-ubuntu-trusty-64:/# visudo
>>> /etc/sudoers: syntax error near line 20 <<<
What now?
Options are:
  (e)dit sudoers file again
  e(x)it without saving changes to sudoers file
  (Q)uit and save changes to sudoers file (DANGER!)

What now?
```

ここで無理やり上書き保存やるような事は無いでしょう。

これで安全に扱える。と、思いきや。。

# visudoでも事故るケース
visudoは`-f`オプションで編集対象ファイルを指定できます。もう一つファイルを指定するオプションが`-x`です。
ここで間違って以下のようなことをすると死にます。

```
sudo visudo -x <編集対象のsudoersファイル>
```
この後は、編集対象のsudoersファイルにjsonが吐き出されて、sudoersが壊れます。
ちなみに、この `-x`オプションは何かというと、

```
vagrant@vagrant-ubuntu-trusty-64:/$ sudo visudo -h
visudo - safely edit the sudoers file

usage: visudo [-chqsV] [-f sudoers] [-x file]

Options:
  -c, --check       check-only mode
  -f, --file=file   specify sudoers file location
  -h, --help        display help message and exit
  -q, --quiet       less verbose (quiet) syntax error messages
  -s, --strict      strict syntax checking
  -V, --version     display version information and exit
  -x, --export=file export sudoers in JSON format
```

jsonフォーマットでsudoersをエクスポートする。というものです。
つまり編集対象のsudoersファイルを有無を言わさず上書きします。
この時、パーミッションがrootのreadのみだったとしてもです！

sudoersという超重要なファイルを安全に編集する為のvisudoが凶器に変わります。
ちなみに私はこれで、AzureのとあるVM上で二度とsudoできなくなりました。。。

ご注意を！
Virtualbox上のubuntu16にホストオンリーネットワークでつなぐ

はじめに
---

* 毎回調べ直してるので個人メモ

環境
---

* MacにVirtualBoxをインストール済み

手順
---

### VirtualBox上のGUIでホストオンリーネットワークを作る

* VirtualBoxの上のバーのメニューから「環境設定＞ネットワーク＞ホストオンリーネットワーク」を選択
* +ボタンを押して追加したのち、ダブルクリックで開く
* アダプタータブのアドレスはそのまま「192.168.56.1」でOK
* DHCPサーバタブのサーバーアドレスは「192.168.56.100」、アドレス下限上限共に「192.168.56.101」を指定
  * DHCPの下限・上限を同じにすることでゲストのIPを101に固定する

### VirtualBoxのGUIでホストオンリーネットワークをVMに紐づける

* VMを作成する
* VMの設定＞ネットワークを開く
* アダプター１はそのままでいい（NAT）
* アダプター２はネットワークアダプターを有効化にチェックして、ホストオンリーアダプターを選択
* さっき作成したホストオンリーネットワークを名前に指定

### OSをインストール

* 通常通りUbuntuをインストールする
* 途中で```enp0s3``` と ```enp0s8```というNICのどちらをインストールに使うか？みたいなことを聞かれるので、ここでは```enp0s3```の方を選ぶ（こっちがNATの方っぽい）
* あとは普通にインストールを続ける

### ネットワーク設定

* ubuntuが起動したら```/etc/network/interfaces```を編集して下記を追記
 
```
auto enp0s8
iface enp0s8 inet dhcp
```

* ネットワークの再起動

```
systemctl restart networking.service
```

* するとホストオンリーネットワークが増えている

```
enp0s8    Link encap:イーサネット  ハードウェアアドレス 08:00:27:d7:82:dd  
          inetアドレス:192.168.56.101  ブロードキャスト:192.168.56.255  マスク:255.255.255.0
          inet6アドレス: fe80::a00:27ff:fed7:82dd/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:140 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:110 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000 
          RXバイト:14981 (14.9 KB)  TXバイト:27689 (27.6 KB)
```

### ホスト側からつなぐ

* 普通にホスト側から繋がる

```
ssh user@192.168.56.101
```

終わりに
===

単なるメモでしたー
ダイジェスト認証時のELBヘルスチェックではまった。。。ELBのヘルスチェックを認証から外す。

#はじめに
ELB⇒EC2の構成で、ダイジェスト認証を行っているサーバーに対してヘルスチェックを行う際、
ずっとステータスが`OutofService`で、解決するのに時間がかかてつぃまった。。。


#原因
**ヘルスチェック対象のサーバーに、Digest認証やBasic認証がある場合、ヘルスチェックも妨害されてしまう。。。**
Apacheのアクセスログに、`401エラー`が出ていました。
⇒`401エラー`は認証を必要としているエラーです。
[Apacheのステータスコードについてはこちら](http://lwr.homelinux.com/code-apache.html)


#解決策
**ヘルスチェックの通信を除外するように、設定ファイルに追記しました！
基本はlocationタブ内の範囲を、設定ファイルに追記すれば大丈夫なはずです。**
/etc/httpd/conf/httpd.confだけ使っていれば、httpd.confに追記します。
バーチャルホストを使用しているのであれば、各バーチャルホストの設定ファイルに書いていきましょう。
※バーチャルホストを使用している場合は、httpd.confに書くとすべてに適用される可能性があるので気を付けてください。

```
# vi /etc/httpd/conf.d/virtualhost.conf


●変更前

<VirtualHost *:80>
    ServerName {{ 任意のサーバー名 }}:80
    DocumentRoot /var/www/html
    DirectoryIndex index.php
    RewriteEngine on
    RewriteCond $1 !^/(index\.php|img|js|fonts|css|robots\.txt|favicon\.ico|.well-known)
    <Directory /var/www/html>
        AuthType Digest
        AuthName "Digest Auth"
        AuthUserFile "/var/www/.htdigest"
        Require valid-user
    </Directory>
</VirtualHost>


●変更後

<VirtualHost *:80>
    ServerName {{ 任意のサーバー名 }}:80
    DocumentRoot /var/www/html
    DirectoryIndex index.php
    RewriteEngine on
    RewriteCond $1 !^/(index\.php|img|js|fonts|css|robots\.txt|favicon\.ico|.well-known|health\.html)　★リダイレクトの設定がある場合のみ。ヘルスチェックで使用するファイル名を追記！(「.」の前に「\」が必要)
    <Directory /var/www/html>
        AuthType Digest　★認証方法（Basic認証ならBasic）
        AuthName "Digest Auth"　★認証設定時に設定した認証名
        AuthUserFile "/var/www/.htdigest"　★認証情報が記載されたファイルパス
        Require valid-user
    </Directory>

    <Location />　★下記（<location>～</location>）を追記！
        AllowOverride all
        Satisfy Any
        SetEnvIf Request_URI "/health.html" healthcheck　★"ここはヘルスチェックで使用するファイル名"
        Order Deny,Allow
        Deny from all
        Allow from env=healthcheck
        AuthType Digest　★認証方法（Basic認証ならBasic）
        require valid-user
        AuthName "Digest Auth"　★認証設定時に設定した認証名
       AuthUserFile "/var/www/.htdigest"　★認証情報が記載されたファイルパス
    </Location>
</VirtualHost>


●文法確認
# httpd -t


●設定反映
# systemctl restart httpd
```


#はまったところ
**リダイレクト設定が入っていることで、解消に時間がかかってしまいました。。。**
⇒単に気が付くのが遅かっただけです。。。

下記の設定で、任意のファイル名を追記することでアクセス許可することができます。
アプリの仕様上、静的ファイルへのアクセスを制限するために下記設定を入れていたようです。。。。
`RewriteCond $1 !^/(index\.php|img|js|fonts|css|robots\.txt|favicon\.ico|.well-known|health\.html)`
リダイレクトについて、まだ全然わかっていないので、別の機会にまとめます。


#参考にしたURL
- [Mod_Rewriteを使って、リダイレクト設定する手順をまとめてみた](http://viral-community.com/seo/mod_rewrite-3019/)
- [RewriteRuleのフラグと、RewriteCondの変数一覧](https://qiita.com/tsukaguitar/items/e37245260f0b1407341d)
新人プログラマがPHPを勉強する（入力フォーム編）

HTMLやCSSを一通り勉強して、今度はPHPを覚えたいと思ったのでメモ。全て独学なので、間違えていたら指摘お願いします。
##PHPでフォームからデータを受け取る
[![https://gyazo.com/df3213ed15d1800847415ec716fab833](https://i.gyazo.com/df3213ed15d1800847415ec716fab833.gif)](https://gyazo.com/df3213ed15d1800847415ec716fab833)


フォームからのデータの受け取り方法は「GET」と「POST」がある。今回は「POST」について。ファイルはHTMLとPHPの2つを用意する。

##HTML
```test.html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>入力フォーム</title>
</head>
<body>
	<form method="post" action="test.php">
		あなたの名前は？：
		<input type="text" name="name" required>
		<input type="submit" value="送信">
	</form>
</body>
</html>
```
##PHP
```test.php
<?php
print_r($_POST);
?>
```
###コードの説明
```test.html
<form method="post" action="test.php">
```
- 「method（メソッド）」で入力データの受け渡し方として「post」を指定する
- 「action」でデータ送り先のPHPファイルの名前を指定する

```test.html
<input type="text" name="name" required>
```
- 「input type="text"」一行テキストボックスを作成する
- 「type」を「text」にすることで、テキストの入力欄になる
- 「required(リクワイアード)」で入力必須の項目として指定する

```test.html
<input type="submit" value="送信">
```
- 「input type="submit"」送信ボタンを作成する
- 「value」ボタンに表示されるテキストを指定する

```test.php
print_r($_POST);
```
関数 = print_r　→　定められた処理を実行
引数 = ($_POST);　→　何を・どんな処理をするのかを記述

- 「print\_r」続く()の内容を見やすい形で表示する
- 「($_POST);」test.htmlのフォームで入力されたデータが格納される

##URL
送信ボタンを押すと、htmlファイルからphpファイルにデータを渡せていることがわかる。

▼送信ボタン クリック前「test.html」
[![https://gyazo.com/4753b4e98018bb37c056a689f8299261](https://i.gyazo.com/4753b4e98018bb37c056a689f8299261.png)](https://gyazo.com/4753b4e98018bb37c056a689f8299261)

▼送信ボタン クリック後「test.php」
[![https://gyazo.com/c1b51e646d8c890a256ebe11330b1a26](https://i.gyazo.com/c1b51e646d8c890a256ebe11330b1a26.png)](https://gyazo.com/c1b51e646d8c890a256ebe11330b1a26)
paperclip gem で画像のリサイズ　個人的メモ

paperclipは画像をアップロードするgemだ。
公式のドキュメントが貧弱なのではまった。
基本的な使い方は以下の記事で。
https://qiita.com/schroneko/items/473568fda091e5ec4420

具体的なリサイズはmodelで大きさを定義している
has_attached_file :image, styles: { medium: "300x300" }
を
"300x300<"
"300x300@"
"300x300#"
などと記号をつけて定義していく。
viewでimage_tag pin.image.url(:medium)で呼び出せる。
（http://www.imagemagick.org/script/command-line-processing.php#geometry
Image Geometryの章を参考）

具体例。
"300x300"  =　画像が"300x300"になるように画像の縦横の比率を変えない
![nomal.jpg](https://qiita-image-store.s3.amazonaws.com/0/183835/77211d64-f89b-e1ee-e14b-98aa8339aaf8.jpeg)

"300x300#" =　画像が"300x300"になるようにはみ出た部分をカットする。縦のほうが横よりも短いので、縦の幅300になるように拡大される。
![#.jpg](https://qiita-image-store.s3.amazonaws.com/0/183835/e76d7f50-92be-ee6c-4c97-66986abaf024.jpeg)

"300x300!" =　強制的に"300x300"にあわせる。画像の縦横の比率は崩れる。
![!.jpg](https://qiita-image-store.s3.amazonaws.com/0/183835/6586d80a-f589-100d-3830-4503b2283844.jpeg)

"300"      =　横幅を300にあわせてくれる。
![weight.jpg](https://qiita-image-store.s3.amazonaws.com/0/183835/4d2c56d2-b08f-036c-eb38-4e9798e3430b.jpeg)

"x300"     =　縦幅を300に合わせてくれる。
![heigtht.jpg](https://qiita-image-store.s3.amazonaws.com/0/183835/234717f0-25a6-653d-bf79-a37f4fb0f9fc.jpeg)

別のcarrierwaveというgemに乗り換えた方がいいかもと思いました。
SRE本まとめ（8章 リリースエンジニアリング）

自分の理解を深めるためにまとめてみました。[7章](https://qiita.com/bassbone/items/33fbdcde83900c2893db)の続きです。

## 8章 リリースエンジニアリング

### リリースエンジニアの役割
Googleではリリースに関するデータ（デプロイにかかった時間等）を収集するツールを持っている。

### 哲学
リリースを頻繁に行うことでバージョン間の変更を極力少なくするという哲学を持っている。1時間毎にビルドしたり、「Push on Green」リリースモデルを使っているチームもある。ビルドは密封型であり、ビルドマシン上にインストールされているライブラリやその他のソフトウェアには影響されない。チェリーピッキングを採用している。基本的にはコードレビューを必須としている。

### 継続的ビルドとデプロイメント
GoogleはRapidと呼ばれる自動化されたリリースシステムを開発した。ビルドツールとしてBlazeを使用。全てのコードはソースコードツリーのメインブランチにチェックインされる。主要なプロジェクトはメインブランチから直接リリースされるのではなく、特定のリビジョンでメインブランチからブランチを作成し、そのブランチに加えられた変更はメインブランチにはマージしない。バグフィックスはメインブランチにコミットされ、チェリーピックによってリリース時にブランチに取り込まれる。メインブランチに変更が入るたびにユニットテストが走るようになっている。MPMによりパッケージ化され、本番環境に配布される。

### まとめ
リリースエンジニアリングは初期の段階からやるべき。

（[9章](https://qiita.com/bassbone/items/9372ddd967c940c3fb3b)に続く）
Bash on Arch Linux on Windows で pacman -Syyu がコケる話

# 問題
タイトルの通り、bash on arch on windows (alwslを使ったもの)で、ArchLinux環境を作ったところ、pgpキー(またこいつか)のせいでpacman -Syyu(-Syu)ができない

``` 
root@..# pacman -Syyu 
...(省略)
(69/69) checking keys in keyring                   [#########################] 100%
downloading required keys...
error: key "4A1AFC345EBE18F8" could not be looked up remotely
error: required key missing from keyring
error: failed to commit transaction (unexpected error)
Errors occurred, no packages were upgraded.
```
# 状況
Windows10 Pro下にalwslを適用して、以下のコマンドが実行された状態
```
root@...# mv /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak
root@...# mv /etc/pacman.d/mirrorlist.pacnew /etc/pacman.d/mirrorlist
root@...# nano /etc/pacman.d/mirrorlist
(Ctrl+W Japan / 下２つ両方のServerという文字の手前にある＃を削除) 
```
さて、どうしたものか。
# 解決方法の予測
## 【更新】
ArchLinuxの公式ページをめくっていたら気づいた事があったので追記
以下のコマンドを実行
```
root@...# nano /etc/pacman.d/gnupg/gpg.conf
(keyserver hkp://pgp.mit.edu:11371 に変更)
root@...# pacman-key --init
root@...# pacman-key --populate archlinux
```
これを実行してからpacman -Syyuを動かすと上手く行く...ようである
ーー更新終了ーー

なんとなく弄くり倒していたらうまく行ってしまったので、後で再編集をするが、

1. pacman -Sy archlinux-keyring 
2. pacman -Su
3. pacman-key --init
4. pacman-key --populte archlinux(時間がかかる)
5. pacman-key --refresh-keys（やたら時間がかかるが、多分動かない...必要なのかは自信がない）

を適当に何度もtry & errorすることがコツのようだ。

とにかく以上の5つのコマンドを実行すればどうにかなることがわかったので、解決とする...(どの順番でやると良いかはわからなかった)

# 今後の課題
どの順番で、或いはどれを選んでやれば良いのかを調べたい...
また、新たな課題としてEmacsのXサーバー(VcXsv)を利用した起動がコケるので、こちらの調査も行う。
Xcode9のFoldingのアニメーションが心地よい


# Foldingとは
ソースコードをblock単位,function単位などでまとめる(1行にして表示する)機能のこと（だと思います）


# アニメーション
![folding.gif](https://qiita-image-store.s3.amazonaws.com/0/93918/b53fd338-225b-3f41-7ddb-4457e44e942e.gif)

# 設定方法/キーバインド確認
Xcode > Preference > Key Binding から変更可能/確認可能

![スクリーンショット_2017-10-03_20_39_27.png](https://qiita-image-store.s3.amazonaws.com/0/93918/167d8a4b-1cc1-0b46-faf0-54f7f7cc67d0.png)

上記画像では、Ctrl + Shift + ]キー でUnfoldAll, Ctrl + Shift + [キー で FoldAll.

良い...
Realmを使ってみた

今までDBはFMDBを使うことが多かったが、今回Realmを使ってみました。
基礎部分しか使ってませんが、備忘録として、基礎的な部分のコードを残します。

### 事前準備
※プロジェクトにRealmをインストールしておいてください。

### モデルの用意
必要なモデルオブジェクトを用意します。

```
#import <Foundation/Foundation.h>
#import <Realm/Realm.h>

@interface ModelClass : RLMObject
@property (strong, nonatomic) NSString *id;
@property (strong, nonatomic) NSString *name;
@property (nonatomic) int count;
@end
```

###オブジェクトデータの保存
```
 ModelClass * modelClass = [[ModelClass alloc]init];
    modelClass.id = @"1";
    modelClass.name = @"naoya";
    modelClass.count = 25;
    
    // 下記でデータを保存します。
    RLMRealm *realm = [RLMRealm defaultRealm];
    [realm beginWriteTransaction];
    [realm addObject: modelClass];
    [realm commitWriteTransaction];
```
###オブジェクトデータの取得
```
// id=1のオブジェクトを取得します。
RLMResults *results = [ModelClass objectsWhere:@"id=1"];
NSLog(@"%@", results);

// ModelClassの全オブジェクトを取得します。
RLMResults<ModelClass *> *results = [ModelClass allObjects];
NSLog(@"%@", results);
```
###オブジェクトデータの削除
```
ModelClass * modelClass = [[ModelClass alloc]init];
RLMRealm *realm = [RLMRealm defaultRealm];

// ModelClassのオブジェクトを削除します
[realm beginWriteTransaction];
[realm deleteObject: modelClass];
[realm commitWriteTransaction];

// 全てのクラスのオブジェクトを削除します
[realm beginWriteTransaction];
[realm deleteAllObjects];
[realm commitWriteTransaction];
```

###Realm内のデータを確認する
下記のソフトで確認することができます。
Realm Browser
https://itunes.apple.com/jp/app/realm-browser/id1007457278?mt=12

###まとめ
保存、取得、削除と、基本的なところしか触っていないですが、個人的にはFMDBより使いやすくコード量も抑えられそうです。
【AWS EC2】Apacheのポートを変更できない。80番以外のポートにしたい。

#はじめに
EC2インスタンスで、30080ポートを解放したときに少し詰まったので、メモします。


#原因
**SElinuxが有効になっていました！！**

```
# getenforce
Enforcing　★これだとだめ！
```

#解決策
**SElinuxを無効にします！！**

```
# vi /etc/sysconfig/selinux

●変更前

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing　★有効になっています！
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted


●変更後

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled　★ここを無効に変更
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted


●変更が終わったら、サーバーの再起動！
# shutdown -r now


●確認！
# getenforce
Disabled　★これならOK
```

#その他の確認ポイント
- ELBのリスナーポートの転送設定
- ELB経由しているかどうか
- セキュリティグループ（EC2とELB）
DatadogでJavaのメトリクスを取得する


JavaアプリケーションのパフォーマンスをDatadogで可視化しようとしたときにハマったので、
誰かの役に立てばと思い、残しておきます。

## やりたかったこと
- JVMHeap使用状況などのメトリクスを取得したかった。

公式ドキュメントは以下にあるので、ドキュメントを参考にやってみます。
[JMX Checks](https://docs.datadoghq.com/ja/integrations/java/)

## JavaのIntegrationを有効にする
DatadogはデフォルトではJavaのメトリクスを取得するようになっていません。
なので明示的に設定をOnにする必要があります。
サイドバーのIntegrationから、Javaを検索し設定をOnにします。
![Setup___Datadog.png](https://qiita-image-store.s3.amazonaws.com/0/17490/07d8039a-0819-4413-f583-6f20db8cfb3c.png "Setup___Datadog.png")

availableをクリックし詳細画面からinstall integrationをクリック

![Setup___Datadog.png](https://qiita-image-store.s3.amazonaws.com/0/17490/9f79e3bb-132a-3129-6529-e3012602ca23.png "Setup___Datadog.png")

## jmx.yamlを追加
次にdatadog-agentをinstallしたサーバ内に入り、Javaが動いているサーバの情報をdatadog-agentに教えてあげる必要があります。

datadog-agentはデフォルトで様々なintegrationのコンフィグファイル例を用意してくれており、今回はそれをコピーしてそのまま使います。


```
$ cp /etc/dd-agent/conf.d/jmx.yaml.example  /etc/dd-agent/conf.d/jmx.yaml
```

```
$ vim /etc/dd-agent/conf.d/jmx.yaml
```

```/etc/dd-agent/conf.d/jmx.yaml
init_config:
instances:
-   host: localhost
    port: 7199
```
port: 7199など気になる設定はありますが、そのまま使用します。

## datadog-agentをrestartする
設定ファイルを変更した際はagentをrestartすると変更した設定が読み込まれます。

```
$ sudo /etc/init.d/datadog-agent restart
```

## だが値は取れない
dashboardを作成したときに、jmx.hogehogeが候補として出てくることを期待するが出てこない。
Listenしてないportなどを指定していたので当たり前といえば当たり前です。

結論から言うとJavaアプリケーション起動時にJMXのポートを公開しておかないと値が取れません。
JMXとは何かという方は以下を参照してください。
[JMX について](http://otndnld.oracle.co.jp/document/products/wls/docs103/jmxinst/understanding.html)

起動時に以下のオプションを追加する。

```
# jmxをonにする
-Dcom.sun.management.jmxremote
# jmxの情報を取得できるportを指定します。jmx.yamlで指定したportはここでの設定したportになります
-Dcom.sun.management.jmxremote.port=7199
# 通信時にsslをonにするかどうか。今回はlocalhostでの通信なのでOffにします。
-Dcom.sun.management.jmxremote.ssl=false
# password認証をするか
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=true
```


## 追加すると
jvmがプレフィックスにつくメトリクスが、Datadogのコンソール上に表示されるようになりました。
![biz-prd-elb__created_via_Terraform____Datadog.png](https://qiita-image-store.s3.amazonaws.com/0/17490/a0946375-fe9b-7564-d3af-d9407f5be746.png "biz-prd-elb__created_via_Terraform____Datadog.png")
Python2 > 文字列置換 > dictionary + 関数エイリアス(別名)使用 > png_170614/processed_06.pngをCOMPOSITE/processed_compo.pngに変換

### 仕様

`png_170614/processed_06.png`
を
`COMPOSITE/processed_compo.png`
に変換する。

変換リストは先に定義すること。

###

https://ideone.com/rdCU1Z
(Python 2)

```py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

adict = {"png_170614":"COMPOSITE", "_06.png":"_compo.png"}
SRC = "png_170614/processed_06.png"

kys = adict.keys()
vls = adict.values()
dst=SRC.replace(kys[0], vls[0]).replace(kys[1], vls[1])
print(dst)

```

```txt:run
COMPOSITE/processed_compo.png
```

とくに読みやすいコードではない。
AWS完結でサーバレス構成のWebアプリ(SPA)を作ったときに使ったAWSサービスたち

##前置き
EC2+RDSのサービスを作った事はあったものの、もろもろの設定(VPCの諸々とか)がめんどくさかったので、流行りのサーバレスで作ってみたら簡単になるんじゃないかと思ってチャレンジ。
##ターゲット
EC2+RDSでサービス作った事あるけどサーバレス構成では作った事ない人
##前提
サービスはSPA(Single Page Application)、サーバサイドの処理は主にAPI。

#◆通常(EC2+RDS)の流れ
EC2+RDSの構成でサービス構築する流れは下記のイメージ。

**[Route53]** ドメインを取得、Hosted Zonesの作成
**[VPC]** VPC作成、セキュリティグループの作成
**[Certificate Manager]** 証明書を取得
**[EC2]** pemの作成、EC2インスタンスの作成、Elastic IPを取得・設定、ELB(Elastic Load Barancer)に証明書設置・EC2を紐付け
**[Route53]** ELBのエンドポイントにドメインを割り当て
**[RDS]** RDSのインスタンスを作成

この後EC2内で環境構築、RDSとの接続設定、などなど

・備考
静的ファイルはEC2に配置


#◆サーバレスの流れ
サーバレス構成でサービス構築する流れは下記のイメージ。

**[Route53]** ドメインを取得、Hosted Zonesの作成
**[Certificate Manager]** バージニア北部(us-east-1)リージョンで証明書を取得 ※これ重要
**[S3]** バケットの作成、静的ファイルの配置、静的Webホスティングの設定
**[CloudFront]** 証明書の設置、利用するS3の設定
**[Route53]** cloudfrontドメインをサービス用ドメインのAレコードのエイリアスに設定
**[Lambda]** Lambda関数の作成
**[API Gateway]** 作成したLambda関数との紐付け設定、カスタムドメインの設定、CORSの設定
**[Route53]** API Gatewayのカスタムドメイン設定で吐き出された(なぜか)cloudfrontドメインを、API用サブドメインのAレコードのエイリアスに設定
**[DynamoDB]** テーブルの作成


##作ってみて
当初考えてたより、利用するサービス数はかなり多くなった。
通常の構成と比べて、インフラ周りの細かい設定とかは解放された感が強い。

##ハマったところ

###証明書をバージニア北部で取得しないといけない問題
最初何も考えずSSL証明書を東京リージョンで取得、CloudFrontに設置する段階になって、バージニア北部で取得した証明書じゃないと設置出来ない事を知る。
取得し直し。
###Lambdaのクロスドメイン制約設定問題
API GatewayでCORS設定してるはずなのに、なぜかクロスドメイン制約発生。
ちなみにLambdaはnodeを選択。
Lambda関数のレスポンスに
```
var response = {
	statusCode: 200,
    headers: {
    	"Access-Control-Allow-Headers":"Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token",
        "Access-Control-Allow-Origin":"*"
    },
    body: ""
};
// context.succeed(response);
return callback(null,response);
```
こんな感じでheadersにAccess-Control-Allow-Originの設定を書いて解決。


なんだか他にもいっぱいハマった気がするけど思い出せない

#◆参考
[CloudFront + S3 によるCDN (Cache Distribution パターン) 構築手順](http://dev.classmethod.jp/cloud/aws/cdn-with-cloudfront-and-s3/)
[Amazon API Gateway を独自ドメインで利用する](http://dev.classmethod.jp/cloud/aws/api-gateway-with-custom-domain/)

なんだか他にもいっぱい参考にした気がするけど思い(ry
ブロックチェーン　コンセンサスアルゴリズムの特徴　まとめ

#この記事について
ブロックチェーンのコンセンサスアルゴリズムについて、それぞれの特徴を簡単にまとめてみました。ブロックチェーンの前提知識がある方は、まとめの表だけご覧いただければ十分かと思います。（具体的なアルゴリズムの中身までは踏み込んでいません。）

#ブロックチェーンとは
要は、情報を記録するための技術の１種です。よく「分散型台帳」と訳され、これまでの中央集権的な情報記録技術に比べて改ざんされにくいと言われています。

#コンセンサスアルゴリズムとは
先に「分散型」台帳と述べた通り、同じ記録を複数のノードで同時に保持します。この時に、複数のノード間でどの記録が正しい記録なのかを判断し、最終的に保存される正当なデータを確定する必要があります。このどの記録が正しいのかを判断し、記録内容を統一するアルゴリズムのことを、コンセンサスアルゴリズムと呼びます。


#コンセンサスアルゴリズムの種類と特徴
||Proof of Work (Pow)|Proof of Stake (PoS)|Proof of Authority (PoA)|
|:--|:--|:--|:--|
|BC利用|Bit Coin <br>Lite Coin|Ethereum|Ethereum <br>Hyperledger|
|ブロック作成者|参加しているノード全員|参加しているノード全員|管理者が認めたノード|
|ブロック作成方法（マイニング）|難易度を満たすナンス（nonce）を見つける|所持金よりも小さいハッシュ値を見つける<br><br>つまり、コインを持っていないと採掘しにくい<br>→コインを持たない悪者は邪魔をしにくいし、コイン保持者はその価値が下がるような不正行動をする動機は持ちにくい<br>→システムの安全につながる|管理者に認められたノードの秘密鍵でブロックに署名<br><br>＊悪意のある者が入った場合には、投票で参加権限の剥奪が可能|
|演算コスト|大<br><br>難易度を満たすナンスの計算にリソースが消費される|中<br><br>PoWほどではないものの、それなりに計算が必要|小<br><br>署名するだけなので、消費するリソースは少なくてすむ|
|通信コスト|小<br><br>参加サーバ全域ではなく、ローカルの通信のみで良いから|小<br><br>参加サーバ全域ではなく、ローカルの通信のみで良いから|大<br><br>参加サーバ全域で通信するから|
|権限の分散性|電気代の安い地域に集中する可能性有り|貨幣保有が集中する可能性有り|参加ノード間で平等|


#参考文献
- 『ブロックチェーン仕組みと理論』　赤羽喜治・愛敬真生
- 『技術者向けビットコイン、ブロックチェーンの基礎用語 まとめ』（https://qiita.com/hshimo/items/5fb019e2b0ad63d1d92e）
ちょっとずつ読むドメイン駆動設計 第ニ部 モデル駆動設計の構成要素 第五章 ソフトウェアで表現されたモデル7(値オブジェクト) 

# 値オブジェクト(バリューオブジェクト)

同一性を担保する必要がなく、
> その属性しか関心の対象とならないのであれば、その要素を値オブジェクトとして分類する(第二部第五章より)

会員(エンティティ)であれば会員名・会員住所・連絡先電話番号・連絡先メールアドレス・・・など・・・会員IDなんかも値オブジェクトですね。

値オブジェクトの特徴など全部書いてありますね。

- 不変なものとして扱うこと

値オブジェクトはいわゆる物なので、一度オブジェクトを作ったら変更しないのが原則。都道府県で言えば、「東京都」は「宮崎県」に変更できないということです。


- 他の値オブジェクトで構成される入り組んだ値オブジェクトにもできる
- 値オブジェクトはエンティティを参照することもできる
- エンティティ（および他の値オブジェクト)の属性としても使用される
- しばしばオブジェクト間のメッセージでパラメータとして渡される
- 概念的な統一体を形成すべき

"概念的な統一体を形成すべき"というのは、「住所」であれば、「都道府県」「市区町村」「その他住所」で構成するということ、「人」オブジェクトの属性であってはいけないということです。


明日は値オブジェクトの設計面を読んでいきます。
Ruby net/httpでリダイレクト先のURLを取得する

URLが正しいものか確かめたくて、Rubyの`net/http`ライブラリを使って以下のように書きました

```rb:check_url.rb
require 'net/http'

response = Net::HTTP.get_response(URL)
puts response.body
```
結果

```shell-session
$ ruby check_url.rb
$
```
空になってました。

リダイレクト先を指定する必要がありそうだと思ったので調べてみたところ、最後に`['location']`をつけるとリダイレクト先のURLを取得できることがわかりました

```rb:check_url.rb
require 'net/http'

redirect_url = Net::HTTP.get_response(URL)['location']
response = Net::HTTP.get_response(redirect_url)

puts response.body
```

スクレイピングでよくmechanizeを使うのですが、勝手にリダイレクトしてくれるのであまり考えたことがありませんでした。

ちなみにcurlの場合は`-L`をつけるとリダイレクトしてくれます。

```shell-session
$ curl -L URL
```

### 参考
URLをチェックするメソッドがこの記事で実装されていました
http://piko.hateblo.jp/entry/2013/05/24/194739
仮想環境で AWS Lambda の検証を行う


## docker インストール
```console
yum install -y docker
```

## docker 起動
### CentOS 6 系
```console
service docker start
```

### CentOS 7 系
```console
systemctl start docker
```

## 準備
### 適当な作業ディレクトリを掘って移動する
```console
mkdir /home/lambda
cd /home/lambda
```

### event の入力を適当に用意する (Hello World をそのままコピペ)
```console
vim input.json
```

```input.json
{
  "key3": "value3",
  "key2": "value2",
  "key1": "value1"
}
```

### 実行スクリプトを適当に書く
```console
vim index.js
```

```index.js
exports.handler = ( event, context, callback ) => {
    console.log( 'event: ' + JSON.stringify( event, null, 2 ) );
    console.log( 'context: ' + JSON.stringify( context, null, 2 ) );
};
```


## docker を起動して実行
```console
docker run -v "$PWD":/var/task lambci/lambda index.handler $(printf '%s' $(cat input.json))
```
**初回起動時はイメージのダウンロードとかがあるのでめっちゃ時間がかかる。**

### 実行結果
```output
START RequestId: bfb50b8e-04c3-1187-2d98-444e21663fea Version: $LATEST
2017-10-03T10:15:42.553Z        bfb50b8e-04c3-1187-2d98-444e21663fea    event: {
  "key3": "value3",
  "key2": "value2",
  "key1": "value1"
}
2017-10-03T10:15:42.554Z        bfb50b8e-04c3-1187-2d98-444e21663fea    context: {
  "callbackWaitsForEmptyEventLoop": true,
  "logGroupName": "/aws/lambda/test",
  "logStreamName": "2017/10/03/[$LATEST]af9c9a780a74aac9a5eff6b5e1bb8d80",
  "functionName": "test",
  "memoryLimitInMB": "1536",
  "functionVersion": "$LATEST",
  "invokeid": "bfb50b8e-04c3-1187-2d98-444e21663fea",
  "awsRequestId": "bfb50b8e-04c3-1187-2d98-444e21663fea",
  "invokedFunctionArn": "arn:aws:lambda:us-east-1:1586600703:function:test"
}
END RequestId: bfb50b8e-04c3-1187-2d98-444e21663fea
REPORT RequestId: bfb50b8e-04c3-1187-2d98-444e21663fea  Duration: 4.98 ms       Billed Duration: 100 ms Memory Size: 1536 MB    Max Memory Used: 19 MB  

null
```

### Lambda でも実行して見る
```output
START RequestId: xxxxxxxxxx-a824-11e7-9d62-xxxxxxxxxx Version: $LATEST
2017-10-03T10:18:41.539Z	xxxxxxxxxx-a824-11e7-9d62-xxxxxxxxxx	event: {
  "key3": "value3",
  "key2": "value2",
  "key1": "value1"
}
2017-10-03T10:18:41.544Z	xxxxxxxxxx-a824-11e7-9d62-xxxxxxxxxx	context: {
  "callbackWaitsForEmptyEventLoop": true,
  "logGroupName": "/aws/lambda/testOnLambda",
  "logStreamName": "2017/10/03/[$LATEST]xxxxxxxxxxxxxxxxxxxxxx",
  "functionName": "testOnLambda",
  "memoryLimitInMB": "128",
  "functionVersion": "$LATEST",
  "invokeid": "xxxxxxxxxx-a824-11e7-9d62-xxxxxxxxxx",
  "awsRequestId": "xxxxxxxxxx-a824-11e7-9d62-xxxxxxxxxx",
  "invokedFunctionArn": "arn:aws:lambda:ap-northeast-1: xxxxxxxxxx:function:testOnLambda"
}
END RequestId: xxxxxxxxxx-a824-11e7-9d62-xxxxxxxxxx
REPORT RequestId: xxxxxxxxxx-a824-11e7-9d62-xxxxxxxxxx	Duration: 27.69 ms	Billed Duration: 100 ms 	Memory Size: 128 MB	Max Memory Used: 19 MB
```

適当にマスクかけたけど、ほぼ同じ結果だと思う。
Gitの基本操作を教えてもらったのでメモ

# はじめに
普段はSourcetreeを使用していたのですがコンソールを使ってGitを操作しないといけなくなったのでエンジニアに教えてくれました（感謝:v:

# 基本操作
githubからclone
httpsのurlはページ右側の緑のボタンをクリックしてコピーできる
例) ```https://github.com/xxxxxx/aaaa.git```

## インデックスに登録〜プッシュまで
```
$ git add .
　　　　または↓
$ git add ファイル名

$ git commit -m "○○を修正しました。"
$ git push origin ブランチ名
```

## ブランチ作成
```
# ブランチを作成
$ git branch <new branch name>

# 作ったブランチに移動
$ git checkout <branch name>

# ブランチを作ってついでに移動
$ git checkout -b <new branch name>
($ git checkout -b feature/<new branch name>)
```

# ブランチの削除
```
$ git branch -d <del branch name>
```

# マージする
```
$ git status(で状態を確認（謎なファイルがあれば他の作業者に確認してみる）
$ git fetch
$ git merge origin/<branch name>
```
※`$ git fetch` から上記２つを毎回打つより、pullで一気にやってしまう方が楽。

```
$ git pull origin/<branch name>
```

# コミットメッセージを変更
```
$ git commit -m "こんにちゃ"　を　こんにちはにしたいとき
$ git commit --amend -m "こんにちは"
```

# addしてしまったファイルをadd前の状態に戻す
```
$ git reset ファイル名
$ git reset .
```

# コンフリクト解消手順

## 状態
git pull などすると、 `CONFLICT (add/add): Merge conflict in ddddd/xxxx.html` のように、コンフリクトの旨が表示される。

## 解消方法

1. vi などのエディターでコンフリクトしたファイルを開く `vi ファイル名`

1. コンフリクトした箇所を修正する `Tips: vi はdを２回押すと選択行を消すことができる`

1. 保存する Tips: vi の保存は `Esc > :wq > Enter` の順で入力する

1. `git add コンフリクトしたファイル名` で修正を知らせる
1. `git commit -m '修正したマージ内容'`　で、マージ内容を保存する

## 基準ブランチを優先して、取り込まれるブランチの変更を無視
```
$ git checkout --ours ファイル名
$ git add ファイル名
$ git commit -m "メッセージ"
```

## 取り込まれるブランチを優先して、基準ブランチの変更を無視
```
$ git checkout --theirs ファイル名
$ git add ファイル名
$ git commit -m "メッセージ"
```

## その他参考サイト
https://qiita.com/konweb/items/621722f67fdd8f86a017
https://www.backlog.jp/git-guide/reference/basic.html
Python2 + eog > 複数の画像をeogで開く | overlay_image_171003_execとの組合わせ例

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
```

Pythonスクリプトから複数画像をeogで開く。

### code

```test_eog_files_171003.py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import subprocess as sb
import os
import time

#on Python 2.6.6
#coding rule: PEP8

IMG_CMD = "eog"


def debug_show_single_image(afile):
    # require wait to open each image in eog
    chkcmd = IMG_CMD + " " + afile
    print(chkcmd)
    sb.Popen(chkcmd.split())
    time.sleep(1)

alist = "gray.png", "blue.png", "red.png"

for elem in alist:
    debug_show_single_image(elem)

```

```txt:run
$python test_eog_files_171003.py 
```

上記を実行すると3つのeogのウィンドウが開く。

waitを入れないと1つのeogウィンドウしか開かない。


### 使用例

```composite_171003.py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import glob
import sys
import subprocess as sb
import os
import time

# v0.1 Oct. 03, 2017
#   - add debug_show_single_image()
#   - add invoke_script()
#   - add get_filename()
#   - add remove_symlinks()


def invoke_script(ascript):
    #scd: script directory
    scd = os.path.dirname(os.path.realpath(__file__))
    acmd = scd + "/" + ascript
    print(acmd)
    sb.call(acmd.split())


def debug_show_single_image(afile):
    # require wait to open each image in eog
    chkcmd="eog " + afile
    print(chkcmd)
    sb.Popen(chkcmd.split())
    time.sleep(1)


res = sorted(glob.glob("png*/*_06.png"), key=os.path.getmtime)
for elem in res:
    print(elem)
    full_len = len(elem)
    #print(full_len)

    wo_hh = elem[:full_len - 7]  # 7: to remove "_hh.png"
    print(wo_hh)

    acmd = "overlay_image_171003_exec "
    for postfix in "_24.png", "_18.png", "_12.png", "_06.png":
        debug_show_single_image(wo_hh + postfix)
        #
        acmd += wo_hh + postfix + " "
    acmd += "wrk.png"
    acmd += ""
    invoke_script(acmd)
    debug_show_single_image("wrk.png")

    sys.exit()  # debug

```

データを用意して実行すると、4つのeogウィンドウが開き、それらの合成のwrk.pngがeogで開く。

関連

- [Python2 > Python scriptを置いているディレクトリにあるbash scriptを実行する実装 > def invoke_script(ascript)](https://qiita.com/7of9/items/8a94927e4550e982d4c4)
- [ImageMagick | bash > 4枚の画像の重ね合わせ > overlay_image_171003_exec](https://qiita.com/7of9/items/d78fb76197bfdbda4b72)
Jenkinsでビルドパラメータで指定するブランチをプルダウンで選択できるようにする

# イメージ

こんな感じで動的にブランチ一覧をプルダウンで表示させる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/63169/26478959-868f-4bb5-a0c1-e568cbcd897a.png)

# やりかた

[Extended Choice Parameter Plugin](https://wiki.jenkins.io/display/JENKINS/Extended+Choice+Parameter+plugin?focusedCommentId=46337022)を使います


プラグインをインストールしたら、ビルドパラメータで、Extended Choice Parameterが選択できるので、以下のようにparameter typeにSingle Selectを指定します

![image.png](https://qiita-image-store.s3.amazonaws.com/0/63169/1e48998c-8b2a-ff89-acc3-88b323e99d5b.png)

Choose Source for Valueに以下のようなGroovy Scriptを指定入力すれば完成です。

```groovy:listBranches.groovy
#!/usr/bin/env groovy

import hudson.model.*
import jenkins.model.*

def listBranches() {
    // target repo url
    def gitURL = "https://github.com/jenkinsci/jenkins.git"
    // get branches
    def branches = ("git ls-remote -t -h ${gitURL}").execute()
    return branches.text.readLines().collect { it.split()[1].replaceAll('refs/heads/|refs/tags/', '') }.unique().join(",")
}
return listBranches()
```

プライベートリポジトリの場合は以下のようにJenkinsで管理しているクレデンシャルを取得すればOKです。 

```groovy:listBranches.groovy
#!/usr/bin/env groovy

import hudson.model.*
import jenkins.model.*

def listBranches() {
    // target repo url
    def gitURL = "https://YOUR_PRIVATE_GIT_URL"
    def credentialID = "YOUR_CREDENTIAL_ID"

    // get credential
    def creds = com.cloudbees.plugins.credentials.CredentialsProvider.lookupCredentials(
        com.cloudbees.plugins.credentials.common.StandardUsernamePasswordCredentials.class,
        jenkins.model.Jenkins.instance
    )
    def credential = creds.findResult { it.id == credentialID ? it : null}

    // get branches
    gitURL = gitURL.replace("https://", "https://${credential.username}:${credential.password}@")
    def branches = ("git ls-remote -t -h ${gitURL}").execute()

    return branches.text.readLines().collect { it.split()[1].replaceAll('refs/heads/|refs/tags/', '') }.unique().join(",")
}
return listBranches()
```
[Survey] Kaggle - Carvana 11位解法まとめ

Kaggle - Carvana Image Masking Challenge[^1]の11位解法[^2]の調査記事です．

Title: LB 11th(0.9971) solution overview
Name: JandJ
Kaggle Discussion: https://www.kaggle.com/c/carvana-image-masking-challenge/discussion/40126


## 概要

- 二段階に処理を分離
	- Stage 1: 1/4縮小画像でマスク領域の予測．
	- Stage 2: エッジ部分に絞ってマスク領域の予測

## Stage 1

- 320x480にリサイズ
- U-Netで学習
- テストデータのマスクを予測

## Stage 2

- ステージ1のマスク領域のエッジ部分を切り取って256x256のパッチ画像を抽出
- 6層のdownsample & upsampleのU-Netを利用
- 訓練時には各パッチ画像は2回ずつ重なるようにデータを作成
- 推論時には各パッチ画像が少なくとも3回は重なるようデータを作成．(U-Netはエッジ領域の判定が苦手だったが，この方法で緩和できた)
- Data Augmentation
	- 10%の拡大縮小
	- 左右反転
	- 輝度, コントラスト
	- ずらし
- 損失関数: dice coeff
- Batch Normalizationを利用．(batch内の各種パッチ画像はランダム)

## 教訓

- 可視化と分析は大事！(Stage 1.でのミスをずっと気づかずじまいだったとのこと)

## References

[^1]: Kaggle, [Carvana Image Masking Challenge](https://www.kaggle.com/c/carvana-image-masking-challenge), 2017.
[^2]: JandJ, [LB 11th(0.9971) solution overview](https://www.kaggle.com/c/carvana-image-masking-challenge/discussion/40126), 2017.
ジョイ・インク 読書会 第一回


# 概要
- 主催:[アジャイルプロセス協議会](http://www.agileprocess.jp/) アジャイルマインド勉強会
- [申し込みページ](https://agileprocess.connpass.com/event/67772/)
- 日時:2017/10/03(火) 19:00 〜 21:00
- 場所:永和システムマネジメント東京支社会議室
- 第一回の範囲:イントロダクションと第一章

---

# 進め方
- 月一回予定
    - 次回は10/31(火)
- 毎月一章ペース
    - どの章を読むかは、ご相談
- 最初に軽く書いてあることを説明して、その後ディスカッションをする。
    - 読んで来てください

---

# 序章 イントロダクション

---

## 1.なぜ喜び（Joy）なのか

- メンロー社
    - 「喜び(Joy)」こそが存在理由
    - リッチ（著者）
        - リチャード・シェリダン
    - [アナーバー](https://www.google.co.jp/maps/place/%E3%82%A2%E3%83%A1%E3%83%AA%E3%82%AB%E5%90%88%E8%A1%86%E5%9B%BD+%E3%83%9F%E3%82%B7%E3%82%AC%E3%83%B3%E5%B7%9E+%E3%82%A2%E3%83%8A%E3%83%BC%E3%83%90%E3%83%BC/@42.2732991,-101.6673787,4z/data=!4m5!3m4!1s0x883cb00dd4431f33:0xdb09f94686c8b5e2!8m2!3d42.2808256!4d-83.7430378)

---

## 2.喜びを考えてみよう

- 喜びの定義
    - ちゃんと日の目を見られて
    - 楽しんで使ってもらえて
    - 意図した人びとに広く普及するものをデザインし
    - 作り上げること
- 「これ、あんたが作ったのか？大好きなんだよ！」

---

## 3.喜び？　ご冗談でしょう

- ソフトウェア業界
    - デスマーチ
    - バカなユーザー

---

## 4.喜びあふれる文化は共有される

- メンローへの訪問者
    - 2193人（2012年）
    - 世界中から

---

## 5.喜びがあればあなたとチームは空を飛べる

- ラングレー
    - 飛行機を作りたかった
    - 名声、儲ける
- ライト兄弟
    - 空を飛びたかった
    - 喜びの追求

---

## 6.喜びと幸せは同じではない

- 幸せ
    - ある時点における状態
- 喜び
    - マラソンを目指して練習を積み重ね、そして完走した時に得られる、深い満足感

---

# 1章　僕が喜び(Joy)にたどり着くまで

- 13歳でプログラミングに恋をした
- 国際プログラミングコンテストのゲーム部門で賞をとった
- 高校生でプログラマーとして働いた

---

## 1.喜びから恐怖へ

- アナーバーの企業で、プログラマーからVPになっていった
    - インターフェースシステムズ社
- よくなるばかりのキャリア
    - でも逃げ出したかった　
- 仕事を変えることにした
    - めちゃくちゃイカしたソフトウェアチームを作る

---

## 2.喜びはふたたび　カチッとはまる

- エクストリームプログラミング
- IDEO
- 理想の職場の見本
- CEO, 経営陣, パートナーを手に入れた
- 残りはチームのプログラマーたち

---

## 3.流血、暴力、殺人

- チームのメンバー
    - リッチ、やめてください

---

## 4.最初の実験

- 作業スペース
- エクストリームプログラミングを試した
    - ペアプログラミング
    - 自動ユニットテスト
    - 手書きのカード
- すごく楽しい！
    - 意見が両極端

---

## 5.場所も大事

- 古い工場を見つけた

---

## 6.第二の実験

- 一週間だけ試してみよう
- Java
    - プログラマーが学びたい言語

---

## 7.リーダーシップの試練

- 実験は、とても楽しかった
- でも、仕事にはしたくない
    - 心の準備ができていない
- 前進あるのみ

---

## 8.変化は簡単ではない

- 変化
    - 既存の報酬系の破壊を伴う
    - 個人専用オフィスとか
- 新しい報酬
    - プロダクトがちゃんと動く
    - とかとか

---

## 9.新たな一日

- チームは徐々に古い仕事を選ばなくなった。
- ６ヶ月後、古いオフィスはいらないといった
- ショウ＆テル
    - 恐怖と退屈から
    - 喝采と笑いに

---

## 10.小さな赤いワゴン

- http://www.radioflyer.co.jp/
- 自発的
- 競争と緊張の代わりに
- 安心と育成

---

## 11.同じままでいることのリスク

- インターネットバブル
- 株価が$2から$80へ
- 2000年9月 インターフェイス社は好条件で買収された
- 2001年初頭 インターネットバブルがはじけた
- 失職
- 2001年6月 メンロー社誕生

---

## 12.喜びは尽きない

- 発見した喜びについて、この本で明らかにしていきたい

---

## この後

2章 スペースとノイズ 
3章 自由に学ぶ 
4章 会話・儀式・道具
5章 インタビュー・採用・立ち上げ
6章 観察のもつ力 
7章 恐怖と戦い、変化を抱擁する 
8章 ボスではなくリーダーを育てる 

---

9章 カオスを終わらせ、曖昧さをなくす 
10章 厳密、規律、品質 
11章 持続可能性と柔軟性 
12章 スケーラビリティ
13章 説明責任と結果 
14章 アライメントー向きを揃える
15章 問題 
16章 まとめ――喜びのなかへ 
エピローグ――ひらめき
謎の便利 Confluence マクロ "Wiki Markup Macro"

# Confluence とは

* Wiki ツール

---

# 嫌いなところ

* **リッチテキストエディター（死）**
    * 内部では記事を HTML で保存している
    * マークアップは保存されない

---

![fxxk2.gif](https://qiita-image-store.s3.amazonaws.com/0/66421/cae4817b-0d39-2e26-b73f-ea266dbab77d.gif)

---

# ふつうの対策

* Markdown マクロを使う
    * マークアップのまま保存される

![image.png](https://qiita-image-store.s3.amazonaws.com/0/66421/56afb370-cd46-9926-1abc-eddad20a1fd7.png)

---

# ふつうの対策の難点

* Confluence 独自の表現が使えない

---

## 例: warning マクロ

```
{warning}注意してね！{warning}
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/66421/933bdf7b-8dff-3b94-6dda-737bdd349152.png)

---

## 例: jira マクロ

```
{jira:XXX-1}
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/66421/db65299f-8885-5f0b-052b-621f37056580.png)

---

# そこで Wiki Markup Macro 

---

## 使い方

* **存在しないマクロを使おうとすると出現**
    * なぜかドキュメントに載ってない？

![wikimarkupmacro.gif](https://qiita-image-store.s3.amazonaws.com/0/66421/c7ceffde-3692-d93b-201d-84a84fcbef10.gif)

---

## 特徴

* マークアップのまま保存される
* confluence マクロも使える

![image.png](https://qiita-image-store.s3.amazonaws.com/0/66421/7af32040-5535-f2c6-1aa5-752722eb20fd.png)

---

## このマクロ、テキストではどう書くの？

* [公式ドキュメント](https://confluence.atlassian.com/conf57/macros-701434957.html) からマクロ名をクリック
* ページ下部の Wikimarkup example を参考に

---

# まとめ

* Wiki Markup Macro は便利
    * 存在しないマクロを使おうとすると出現
    * マークアップのまま保存される

* 初めからそうしてくれ頼む

---

# 参考

* http://dontpanic.42.nl/2012/01/confluence-4x-rich-editor-survival-guide.html
Google Playからcom.android.vending.INSTALL_REFERRERで投げられるBroadcastのIntentの中身を確認してみた

Android OからBackground execution limitsでほとんどの暗黙的Broadcastが動作しなくなりましたよねー

ドキュメントは以下。

https://developer.android.com/about/versions/oreo/android-8.0-changes.html#back-all

ちなみに、以下のドキュメントに書いてあるActionなどは暗黙的Broadcastでもまだ動きます。

https://developer.android.com/guide/components/broadcast-exceptions.html

## インストールリファラー(`com.android.vending.INSTALL_REFERRER`)のBroadcast どうなるの？？

さて、本題。

「おー、じゃインストールリファラーの`com.android.vending.INSTALL_REFERRER`とかどうなるんだ？動かないのか？」と思ったわけです。


## Google Playからcom.android.vending.INSTALL_REFERRERで投げられるBroadcastのIntentの中身を確認してみた

Logactの出力結果が以下です。

```java
10-03 18:19:15.740 D/InstallReferrerReceiver(28042): Intent { act=com.android.vending.INSTALL_REFERRER flg=0x10 pkg=com.os.operando.takosan cmp=com.os.operando.takosan/.InstallReferrerReceiver (has extras) }
10-03 18:19:15.740 D/InstallReferrerReceiver(28042): key : referrer
10-03 18:19:15.740 D/InstallReferrerReceiver(28042): value : referrer_test
10-03 18:19:15.740 D/InstallReferrerReceiver(28042): key : referrer_timestamp_seconds
10-03 18:19:15.740 D/InstallReferrerReceiver(28042): value : 1507022325
10-03 18:19:15.740 D/InstallReferrerReceiver(28042): com.android.vending.INSTALL_REFERRER
10-03 18:19:15.740 D/InstallReferrerReceiver(28042): com.os.operando.takosan
10-03 18:19:15.741 D/InstallReferrerReceiver(28042): referrer : referrer_test
```

`Intent { act=com.android.vending.INSTALL_REFERRER flg=0x10 pkg=com.os.operando.takosan cmp=com.os.operando.takosan/.InstallReferrerReceiver (has extras) }`ってなってるのを見ると、Intentは明示的に投げられてるっぽいっすね。

Manifestの中身見て、該当するBroadcastを探して投げてくれてるのかな？内部実装はわからん...

## 結論

* Android Oでもインストールリファラー(`com.android.vending.INSTALL_REFERRER`)のBroadcastは動く
* なぜなら、明示的Intentで実行されてるから


## 確認方法

* 以下のQRはGoogle Playで公開してる🐙アプリへのURL + リファラー付き

![qr20171003184149087.png](https://qiita-image-store.s3.amazonaws.com/0/43637/9b08b978-879a-f6cd-39d6-0192786f72f1.png)

* QRを読み込んで、Google Playでアプリをインストールする
* アプリを起動したタイミングで、LogcatにIntentの内容が出力される
* 実装したコードはこんな感じ
 * https://github.com/operando/TakoSan/commit/6b2964660e5e7ee1b86929d45a76e4465a267868