OmniAICreator/Qiita-1.07M huggingface dataset:
電子回路入門　測距センサー

#**はじめに**
[書籍](https://www.amazon.co.jp/%E9%9B%BB%E5%AD%90%E9%83%A8%E5%93%81%E3%81%94%E3%81%A8%E3%81%AE%E5%88%B6%E5%BE%A1%E3%82%92%E5%AD%A6%E3%81%B9%E3%82%8B-Raspberry-Pi-%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C%E5%AE%9F%E8%B7%B5%E8%AC%9B%E5%BA%A7-%E7%A6%8F%E7%94%B0/dp/4800711614 "電子部品ごとの制御を学べる! Raspberry Pi 電子工作実践講座")に沿って引き続き進めていきます。

距離計測は[超音波](https://qiita.com/aikawa_YO/items/a99bdfd5df81ef5ff80a)もやりました。

#**測距モジュール**
赤外線をピーと出したら物体に当たった時に反射してきます。距離が遠くなると入射角が大きくなって受信側の光が当たる位置が変化する感じで計測できます。

今回もI2Cで動作させますが、アナログ出力端子もあるので、1つや2つの動作であればアナログ値から求める方法をお勧めします。
(配線やプログラムが単純でいい)
![反射角.png](https://qiita-image-store.s3.amazonaws.com/0/195542/c02d20c4-6785-1eb5-9c2e-14fa58fa61cf.png)


#**使用部品**
- PSoC 5LP
- [GP2Y0E03](http://akizukidenshi.com/catalog/g/gI-07547/)
<br>[仕様書](http://akizukidenshi.com/download/ds/sharp/gp2y0e03_e.pdf)
- PCA9306
- 3.3Vを作り出す何か。([DCDCコンバータ](https://strawberry-linux.com/catalog/items?code=12010),　[3端子レギュレーター](http://akizukidenshi.com/catalog/g/gI-00534/))

#**回路図**
前回と同じような回路では動かなかったので変更。

これじゃいけないと思う。
供給電圧は5VまでOKだが、その他は5Vまで許可されていない。(仕様書参照)
良い子はまねをしないように。

これで動いたが…きっとこのPSoCは3.3Vで動作しているに違いない。(5Vで動いているとわかっていながらの確信犯)
![測距_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/195542/2cfc071a-cc0b-0ecc-bc7f-e551857386bf.png)

あぁ、電流が足りないのかな？平均消費電流が26～36mAになってる。(仕様書参照)
[環境センサー](https://qiita.com/aikawa_YO/items/b3cbe0776dfabefe2dc4)や[加速度センサー](https://qiita.com/aikawa_YO/items/282f14f842b42a49242d)は1mA程度でしたが… 赤外線出すから結構電流が必要なのか。(今までのやり方では1mA程度でした)
これはダメだ(´・ω・`)電流取れない。↓分圧の場合。
![並列_回路図.png](https://qiita-image-store.s3.amazonaws.com/0/195542/9e41616a-e78e-581c-25e0-653b7d041829.png)

[3端子レギュレーター](http://akizukidenshi.com/catalog/g/gI-00432/ "ＮＪＵ７２２３Ｆ３３")を使用するべきだと思います。

![3端子レギュレータ_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/195542/0b18ccf2-06d2-9a19-86ba-69054bb6b3f4.png)



#**プログラム**
スレーブアドレスは0x80,0x81らしいが、[前回](https://qiita.com/aikawa_YO/items/282f14f842b42a49242d)同様右へシフトさせて0x40

```c
#include "project.h"
#include <stdio.h>
#include <stdlib.h>

 
char imp[255];

 uint8 I2C_Read(uint8 SlaveAddress, uint8 *DataAddress, uint8 Byte_Count, uint8 I2C_Mode){
    uint8 temp;
    temp = I2C_1_MasterWriteBuf(SlaveAddress,DataAddress,1,I2C_Mode);
    while (temp != I2C_1_MSTR_NO_ERROR);
    while(I2C_1_MasterStatus() & I2C_1_MSTAT_XFER_INP);
    temp = I2C_1_MasterClearStatus();
   
    temp = I2C_1_MasterReadBuf(SlaveAddress,DataAddress,Byte_Count, I2C_Mode);
    while (temp != I2C_1_MSTR_NO_ERROR);
    while(I2C_1_MasterStatus() & I2C_1_MSTAT_XFER_INP);
    temp = I2C_1_MasterClearStatus();
    return (temp);
}

int main(void)
{
    CyGlobalIntEnable;
    
    UART_1_Start();
    I2C_1_Start();
    CyDelay(2000);
    uint8 wr_buff[2]={0,0};
    for(;;)
    {
        wr_buff[0] = 0x5E;
        I2C_Read(0x40,wr_buff,2,I2C_1_MODE_COMPLETE_XFER);
        int ans;
        ans = ((wr_buff[0]*16+wr_buff[1]) / 16) / 4 ;
        sprintf(imp,"%d\n",ans);
        UART_1_PutString(imp);
        CyDelay(1000);
    }
}
```

#**結果**
センチメートルです。最大で計測できるのは63cmかな？と思ったが、使用書見たら50cmだった。
![結果.png](https://qiita-image-store.s3.amazonaws.com/0/195542/ffc59f41-3589-5094-5bbf-237fce493998.png)
CocoaPodsをプロジェクトから削除する方法

CocoaPods関連のファイルを一つ一つ削除する、というやり方をよく見かけるのですが、ちょっと面倒。
削除するファイルを間違えたりして、ビルドが通らなくなったらまた面倒。

バシッと一発で削除できるプラグインがあったので紹介します。

##インストール
```:ターミナル
$ sudo gem install cocoapods-deintegrate
```

##やってみよう
#####１．プロジェクトフォルダに移動
```:ターミナル
$ cd プロジェクト名
```

#####２．念のためプロジェクトのバックアップ

#####３．削除コマンド実行
```:ターミナル
$ pod deintegrate
```

ちなみにコマンド実行後も
Podfile, Podfile.lock, Workspace
ファイルは残ります。

Podfile, Podfile.lockはrmコマンドで削除できます。

```:ターミナル
$ rm Podfile
```

###参照
https://github.com/CocoaPods/cocoapods-deintegrate
https://medium.com/@xwildeyes/remove-uninstall-deintegrate-cocoapods-from-your-xcode-ios-project-c4621cee5e42
【AWS】CLIでS3コマンドを使ってサーバに複数ファイルを配布する方法

サーバに複数ファイルを配布する方法として、S3コマンドを使いました。

#**Ⅰ. AWSコンソール**

###①S3ファイル準備
S3にバケットを作成し、サーバに配布したいファイルをアップロードしておく。

###②IAMユーザを作成

IAMユーザを作成し、下記のポリシーを直接アタッチする。
・AmazonS3ReadOnlyAccess

※作成後にcsvダウンロードして、
Access key ID、Secret access keyを取得しておく。

#**Ⅱ. CLI**

###①AWS CLIのインストール
awsコマンドを使用するため、CLIをインストールする。

 # curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
 # sudo python get-pip.py
 # sudo pip install awscli

###②認証情報の設定

 # aws configure
AWS Access Key ID [None]: **********
AWS Secret Access Key [None]: **********
Default region name [ap-northeast-1]: ＜Enter＞
Default output format [None]: json

（下記ファイルに設定されます）
 # cat ~/.aws/config
 # cat ~/.aws/credentials

###③S3コマンドの実行
まず、S3バケットの情報を取得できることを確認する。
 # aws s3 ls s3://<バケット名>/ 


同期させたいS3バケット名と、配布先として任意のディレクトリを指定する。
 # aws s3 sync s3://<バケット名>/ <任意のディレクトリ>





S3バケット内のファイルのみコピーしたい場合は、下記コマンドを実施する。
 # aws s3 cp s3://<バケット名>/ <任意のディレクトリ> --recursive


# 参考
・[【AWS】CLIの初期設定について（認証情報とコマンド補完）](http://www.task-notes.com/entry/20141026/1414322858)
・[ AWS-CLIのsync機能でローカルファイルをS3に同期させる](http://hisasann.github.io/2017/05/15/synchronize-s3-and-local-files-with-sync/)
ColaboratoryでMeCabを使えようにする。

タイトル通りです。
Colaboratoryを使い始めたのですが、ColaboratoryってUbuntuで動いているみたいですね。
だったら、UbuntuにMeCabを入れる要領でやれば、使えるでしょって思ったのでやってみました。
# 関連記事
[MeCabのインストール方法、辞書のカスタマイズ方法、使い方についてのメモ。](https://www.pytry3g.com/entry/2018/04/24/143934)
# Colaboratoryって何？
[【秒速で無料GPUを使う】TensorfFow/Keras/PyTorch/Chainer環境構築 on Colaboratory](https://qiita.com/tomo_makes/items/f70fe48c428d3a61e131)
# MeCabのインストール
インストールの前にnotebook上のランタイム>ランタイムのタイプの変更、でランタイムのタイプがPython3になっているか確認してください。
MeCabのインストールはこんな感じ。
コマンド３つを実行するだけです。
```!apt install aptitude```
```!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y```
```!pip install mecab-python3==0.7```
自分の場合、特にエラーは出ずに無事にインストールは完了しました。

# 試してみる
![img2.PNG](https://qiita-image-store.s3.amazonaws.com/0/157216/8411cdd7-aaed-7f89-bb9d-ba56aafdf4f4.png)
うまくいきました:blush:
python の virtualenv をオフラインで使いたい

# 概要

オフライン環境で、 `virtualenv` を使いたかったのでメモ

# 結論

```
virtualenv -p python3 --no-download YOUR_VIRTUAL_ENVIRONMENT
```

# 参考

[python \- Using virtualenv on machine without access to pypi \- Stack Overflow](https://stackoverflow.com/questions/20266562/using-virtualenv-on-machine-without-access-to-pypi)
【tvOS】UIFocusGuide

![Screen Shot 2018-03-19 at 14.18.28.png](https://qiita-image-store.s3.amazonaws.com/0/242761/67a849bf-cb42-43a0-bbb1-f5d01af6c17a.png)


# 問題
先端のボタンから、「追加」のボタンへFocusできないこと。
# 解決
```swift:sensei.swift
    @IBOutlet weak var addBtn: UIButton!
    @IBOutlet weak var senseiCollection: UICollectionView!
    private let focusGuide = UIFocusGuide()
    override func viewDidLoad() {
        super.viewDidLoad()
        view.addLayoutGuide(focusGuide)
        
        focusGuide.topAnchor.constraint(equalTo: addBtn.topAnchor).isActive = true
        focusGuide.leftAnchor.constraint(equalTo: senseiCollection.leftAnchor).isActive = true
        
        focusGuide.heightAnchor.constraint(equalTo: addBtn.heightAnchor).isActive = true
        focusGuide.widthAnchor.constraint(equalTo: senseiCollection.widthAnchor).isActive = true
        
        focusGuide.preferredFocusEnvironments = [addBtn]
    }
```
# fish で ssh-pageant する

# fish で ssh-pageant する
- Cygwin の ssh-pageant.exe の出力は bash 用
- そのまま eval (ssh-pageant -r -a "tmp/.ssh-pageant-$USERNAME") してもダメ
- fish の set -gx ... するように ssh-pageant の出力をフィルタする

## ssh-pageant の出力内容
- ssh-pageant のオプション
	- -r : 既に SOCKET があれば使いまわす（新しく作らない）
	- -a : 指定パスに SOCKET を作る
- ssh-pageant -r -a "/tmp/.ssh-pageant-$USERNAME"

```
SSH_AUTH_SOCK='/tmp/.ssh-pageant-hogefuge'; export SSH_AUTH_SOCK;
SSH_PAGEANT_PID=1234; export SSH_PAGEANT_PID;
echo ssh-pageant pid 1234;
```

## 期待する出力内容

```
set -gx SSH_AUTH_SOCK '/tmp/.ssh-pageant-hogefuge';
set -gx SSH_PAGEANT_PID 1234;
```

## ~/.config/fish/functions/invoke-ssh-pageant.fish

```
function invoke-ssh-pageant
        eval (ssh-pageant.exe -r -a "/tmp/.ssh-pageant-$USERNAME" \
        | gawk -f ~/.config/fish/functions/ssh-pageant.awk)
end
```

## ~/.config/fish/functions/ssh-pageant.awk

```
#!/usr/bin/gawk
/SSH_AUTH_SOCK/ {
        split($0, a, "[;=]")
        print "set -gx SSH_AUTH_SOCK " a[2] ";"
}
/SSH_PAGEANT_PID/ {
        split($0, a, "[;=]")
        print "set -gx SSH_PAGEANT_PID " a[2] ";"
}
```

## ~/.config/fish/functions/config.fish
- 適当な箇所で invoke-ssh-pageant を呼ぶ

```
invoke-ssh-pageant
```
【VSTO】アドインは見つからなかったか、または読み込めませんでした

VSTOで開発していて急に「アドインは見つからなかったか、または読み込めませんでした」とエラーが出てそれの対処に時間がかかったのでメモ。

# 現象
画像のように「ファイルまたはアセンブリ'XXXX'、またはその依存関係の１つが読み込めませんでした…」となってアドインタブが表示されない。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/3b547f36-92af-f1f8-d027-a1c5c400db49.png)

# 対応
csprojで<PlatformTaget>x86<PlatformTarget>の行があるため、64bitだとエラーになっていた模様。その行を削除で解決。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/e5cd0b02-3829-c539-5bad-ed9f7ebc5066.png)
MXレコードが適用されているかどうかをnslookupコマンドで確認する

## 確認方法

DNSの設定って若干タイムラグがあったりして、適用されているかどうかを確認したい時あると思います。
以下の方法で確認が可能となっているので、メモを残しておきます。

```
$ nslookup
```

上記実行後`>`というようなプロンプトが表示されるので、続けて以下を入力する

```
> set type=mx
> ドメイン名
```



上記を実行すると、設定されているレコードが出てくるので、確認をする。


抜けたいときは、`exit`としてあげればいい
WordPressに後からcomposerを入れる幾つかの方法

WordPressのメンテしててcomposerでライブラリ入れたいときってあると思うんですよ。

で、よさげな方法を2つみつけたので紹介します。

## 1. テーマにそのまま入れる

もうWordPressのアーキテクチャ上 テーマ = カスタム部分 になるのはある程度、割り切っても良いと思うんですよ。

その考えで行くと単に テーマディレクトリ直下に `composer.json` 置いて `require_once __DIR__ . '/vendor/autoload.php';` で良い気がします。

## 2. mu-plugins に入れる

今回の記事での本命。

この手を使うと、composer化されたプラグインも、通常のプラグインも1つのディレクトリ以下に押し込んで読み込みを強制する事が出来るので良い気がします。

`/wp-content/mu-plugins` 直下に composer.json を置いて以下のようにします。

```compose.php
<?php
/*
Plugin Name: Composer Libraries
Description: Required Libs.
*/

require_once __DIR__ . '/vendor/autoload.php';
```

これで、bladeテンプレートを使えるようにするプラグインのbladerunnerとかもこれだけで良い感じに入ります。

普通のPHP開発だとvendor以下はリポジトリに入れない方がメジャーだと思いますが、WordPressを後から取り扱ってるような場合は、入れちゃってもまぁ良いと思います。 お好み＆プロジェクトの状況次第で。

既にKUSANAGIなどでmu-plugins以下を他の事にも使っている場合、composer.jsonやvendorの置き場を一層だけディレクトリ深くすれれば良いと思います。
checkの文字コード

### fontawesomeでもいいが、単純に文字コードで。
```css
.checked:before{content:'\2714'}
```
```js
String.fromCharCode(0x2714)
```

### 全部
```html
<label class="checked"></label><br>
<label class="a"></label>
<style>.checked:before{content:'\2714'}</style>
<script>document.querySelector('.a').textContent=String.fromCharCode(0x2714)</script>
```
Globus (データ転送システム) > endpoint > 定義と作成方法 (Windows, OS X, Linux) | endpoint間のデータ転送 | 転送エラー対処 | 転送できないファイル

WRF(Weather Research and Forecasting Model)とその前処理であるWPS、およびWRFの後続処理のF***T関連。

[WRF > NCAR's Research Data Archive Blog > システム障害などの経緯の紹介 | Outage | 経過 2018/03/19](https://qiita.com/7of9/items/baf03fd1592dfd71775f)

処理に使うデータのサイトがシステム障害を起こし、データ取得できない。
Globusというサービスを使うように記載がある。

サイトのアカウントを使いGlobusにログインすると、データを転送するendpointという定義をする必要があることが分かった。

### endpointの定義

endpointの定義は下記に見つけた。

https://docs.globus.org/faq/globus-connect-endpoints/#what_is_an_endpoint

### endpointの作成方法

endpointをローカルPCに作る方法は下記に記載されている。Windows, OS X, Linuxで使えるようだ。

https://docs.globus.org/faq/globus-connect-endpoints/#how_can_i_create_an_endpoint

Linuxのsetupに関しては、Tcl/Tkを使う方法とコマンドラインで行う方法が記載されている。

コマンドラインでの方法を試そうとしたが、globusというコマンドが見つからずTcl/Tk版の方でセットアップした。

1. GlobusのサイトでGenerate Setup Keyを実行
    - Dipslay Name: 適宜決めた。後で検索しやすい名前にしておく
2. Linux上で`./globusconnect`を実行する
    - Globus Connect Personal画面が表示される
3. Setup Keyを入力する
    - 下側の項目はデフォルト値を使用
    - > Globus Online: Connectedになる


### endpoint間のデータ転送

データ提供元のendpointからセットアップしたendpointへデータを転送してみた。

1つのファイルの転送の場合、リトライ処理をしながら転送できる。
2つのファイルの転送でもリトライ処理をしながら転送できた。

転送ファイル数を3つ以上にした時に処理が失敗しやすいようだ。


### 転送エラーの対処

- 複数のファイルを転送する1タスクでは失敗しやすい
- 1つのファイルを転送するタスクを複数設定すると、リトライ処理をしながら転送をすることができる
    - 5ファイル転送する場合、5タスクに分けた方が成功しやすい

接続が時々切れるのはendpoint側の問題なのかGlobusの問題かこちらの環境によるのか不明。

### 転送できないファイル

リトライ処理をしても転送できないファイルがある。
18.44MBのファイルであるが、15MBの転送で止まってしまう。

転送元のシステム障害と関係しているのだろうか。

(追記 2018/03/22)
同じファイルはftp経由でも取得できるが、同じサイズで取得失敗する。
データ提供サイト自体のdisk failureによりファイルが破損していると思われる。
Globus経由での取得ではデータはそろわないだろう。
Cognos Analytics 11.0.10 新機能紹介

#概要
週末にCognos Analytics 11.0.10がリリースされましたので、新機能の概要を紹介します。

**What’s New with Dashboards in 11.0.10**
https://www.ibm.com/communities/analytics/cognos-analytics-blog/whats-new-with-dashboards-in-11-0-10/

#ダッシュボードからレポートにドリルスルー可能になった
タイトルの通りですが、ダッシュボードからレポートに対してドリルスルーが可能になりました。

ダッシュボードを作成し、視覚化のグラフをクリックすると表示される、このアイコンでドリルスルーの設定が可能です。
![002.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/6063cf3b-158a-94d8-dbf8-99d4fb00c527.jpeg)

「新規ドリルスルーの追加」を選択します。
![003.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/ce1c09fb-ed1a-3e02-ed6a-efc22a9e2805.jpeg)

ターゲットのレポートを指定します。
※レポートにはパラメーターを使用したフィルターを設定済みです。
![004.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/3650500e-704d-9618-8834-da16f71f06f1.jpeg)

以下のように、ターゲットレポートのパラメーターと、ソースのダッシュボード側のデータアイテムのマッピングを行います。
チェックボックスで、このドリルスルーが他の視覚化グラフと共用させるかどうかを指定が可能です。
![005.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/bad18dda-5c47-1f89-c5c2-0b1b84b6e7b4.jpeg)

ダッシュボードを実行し、棒グラフをクリックした場合は、ハイライトされるだけです。
![006.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/2d931a57-2fb4-3007-c9ee-97f2bb364d7b.jpeg)

ドリルスルーしたい時は、棒グラフを右クリックし、「ドリルスルー」アイコンを選択します。
![007.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/cf7aab11-9ae7-a652-9273-6e2fa144523f.jpeg)

無事、ターゲットのレポートに、製品ライン=登山用品で絞り込まれて遷移しました。
![008.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/7ec5bddc-9b2f-5e76-a14f-60ff1a110484.jpeg)

ちなみに、もしかしてレポートでの視覚化グラフからドリルスルーできるようになったのでは、と期待してやってみましたが、残念ながらその様な機能はありませんでした。
とはいえダッシュボードではできるようになったので、次のリリースあたりで、レポートの視覚化でもドリルスルー可能になりますかね、期待しましょう。
![010.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/57af4be6-0368-a6d0-74cc-8cc8eaa7947d.jpeg)

**Drill-through comes to dashboards!**
https://www.ibm.com/communities/analytics/cognos-analytics-blog/drill-through-comes-to-dashboards/

#ダッシュボードをPDF出力できるようになった
ダッシュボードを作成し、「PDFにエクスポート」を選択します。
![011.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/d2b8d25b-c2e2-aa54-020e-ed7da2d829fd.jpeg)

「ページ・サイズ」「用紙の向き」を選択しOK。
![012.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/49e46845-1b46-c5d2-0a36-6ac8cd24a210.jpeg)

すると、いきなり印刷の画面が表示されます。
PDFに出力したい場合は、PDFのドライバーをPCに導入している事が必要のようです。
![013.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/63569e5d-309b-9d8a-07c6-dc827a49b303.jpeg)

という話は、こちらのTechnoteに詳細ありますので、ご参照下さい。
**Exporting a dashboard to PDF requires specific steps for each browser and OS**
http://www-01.ibm.com/support/docview.wss?uid=swg27050856

**What’s New with Dashboards in 11.0.10**
https://www.ibm.com/communities/analytics/cognos-analytics-blog/whats-new-with-dashboards-in-11-0-10/


#ジョブの機能が、管理者以外の普通のユーザーでも使用できるようになった
11.0.9までは、ジョブの機能は、管理者権限を持ったユーザーが「管理」の機能から呼び出していましたが、11.0.10からは通常のユーザーが「新規」メニューからジョブの作成や実行を行えるようになりました。
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/3dab5365-b102-3300-8d28-29782caf29ca.jpeg)

#その他の拡張
「OpenID Connectの移行が簡素化された」という情報が記載されていますが、詳細は情報が無いので、どこかで経験したらフィードバックします。

140件以上のバグ修正も含まれているとのことです。
**Cognos Analytics 11.0 Fix Lists**
http://www-01.ibm.com/support/docview.wss?uid=swg27047208
(メモ)telnetでsmtp,httpをしてみる



## SMTP

```
telnet mailserver.home 587
```

```sh
helo telnet1
mail from: <user@mailserver.home>
rcpt to: user@mailserver.home
```

```sh:メール送信
data
本文をここに書く
.
```

> 250 2.0.0 Ok: queued as B9D3217FFFFF

## HTTP

```sh:
$ telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /index.html
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
Connection closed by foreign host.
```
AWS Elastic Beanstalk で異なるプラットフォームバージョンに eb clone

* ebで異なるプラットフォームバージョンへのアップグレードができず、
* eb cloneも異なるプラットフォームバージョンにはcloneできない

など、割とつらいですが、以下のように進めれば簡単です。

# 環境の保存

マウスでポチポチして保存

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/environment-configuration-savedconfig.html

# eb platform list

目当てのプラットフォームを探します

```
sasasin@mbp2018:~/Downloads/ebsample$ eb platform list | grep php
php-5.3
php-5.4
php-5.5
php-5.6
php-7.0
php-7.1
sasasin@mbp2018:~/Downloads/ebsample$
```

# eb create --platform

プラットフォーム指定できるので、 `--cfg` と合わせることで、異なるプラットフォームバージョンに eb cloneを実現できます。

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb3-create.html

```bash
eb create eb-sample-after \
--cfg eb-sample-before \
--platform php-7.1
```
Androidアプリのパッケージ名を変更する


こんにちは。m_saekiです。

初期開発の時のパッケージ名から変更することってよくありますよね。
その際の手順を忘備録も兼ねて残しておきます。
パッケージ変更はファイルが消えるという記事とかも見かけたので自己責任でお願いします。
パッケージ名: jp.co.aaa ⇨ jp.co.bbbに変更

#開発環境 
mac
AndroidStudio 3.0

# build.gradle (Module: app)の変更

```
    defaultConfig {
        applicationId "jp.co.bbb"
        :
    }
```

# AndroidManifest.xmlの変更

```
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="jp.co.bbb">
```

# ディレクトリの変更
Finderから
src ⇨ main ⇨ java以降のディレクトリ名を変更
jp ⇨ co ⇨ bbb

# ファイルのパッケージ名の変更
AndroidStudioから
cmd + shift + r ⇨ Replace in Pathを表示
上に jp.co.aaa
下に jp.co.bbb
をセットしAll Replaceする

# AndroidStudio Restart
File ⇨ Invalidate Caches/Restart... ⇨ Invalidate And Restartを選択
AndroidStudio再起動したら出来上がり
AWS Elastic Beanstalk で異なるVPCに eb clone

# 環境の保存

マウスでポチポチして保存

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/environment-configuration-savedconfig.html

# eb createで、VPCまわりのCLIパラメータ付けて実行

```bash
eb create eb-sample-after \
--cfg eb-sample-before \
--vpc \
--vpc.publicip \
--vpc.id <vpc-id> \
--vpc.ec2subnets <subnet-id-1>,<subnet-id-2> \
--vpc.elbpublic \
--vpc.elbsubnets <subnet-id-1>,<subnet-id-2>
```
JavaScript:Array.prototype.reduceとrest parametersを使ってパイプライン演算子っぽいものを作ってみた。ついでに関数合成

reduceってパイプラインに似てるなと思ったので作ってみました。

+ 初期値xと数が決まってない複数の関数を引数にとって
+ ()内で、fは[rest parameters](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions_and_function_scope/rest_parameters) ... で 実際に渡された引数による配列になって関数に渡されます。
+ 初期値xのアキュムレータaccに配列fの要素eを順に適用していく(reduce)


```Javascript:
const pipe = x => (...fs) => fs.reduce( (acc, f) => f(acc), x)
```

```Javascript:
// 使用例
const succ = n => n + 1
const square = n => n * n

   pipe(1)()
//=> 1
   pipe(1)(succ)
//=> 1 + 1 = 2
   pipe(1)(succ, succ)
//=> ( 1 + 1 ) + 1 = 3
   pipe(1)(succ, succ, square)
//=> (( 1 + 1 ) + 1 ) ^ 2 = 9
   pipe(1)(succ, square, succ)
//=> (( 1 + 1 ) ^ 2 ) + 1 = 5
```

まあそのうち[```|>```が使えるようになる](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Pipeline_operator)んでしょうが。

## 追記: ついでに関数合成っぽいもの
これって順序を逆にすれば関数合成ってことになるのかな?

```Javascript:
const compose = (...fs) => x => fs.reduceRight( (acc, f) => f(acc), x)
```

```Javascript:
// 使用例
   compose()(1)
//=> 1
   compose(succ)(1)
//=> 1 + 1 = 2
   compose(succ, succ)(1)
//=> ( 1 + 1 ) + 1 = 3
   compose(square, succ, succ)(1)
//=> (( 1 + 1 ) + 1 ) ^ 2 = 9
   compose(succ, square, succ)(1)
//=> (( 1 + 1 ) ^ 2 ) + 1 = 5
// 部分適用して関数にする
   const succ2Sq = compose(square, succ, succ)
//=> undefined
   succ2Sq(1)
//=> (( 1 + 1 ) + 1 ) ^ 2 = 9
   succ2Sq(2)
//=> (( 2 + 1 ) + 1 ) ^ 2 = 16
```
いけてる。
むしろこっちの方が使いでがありそう。
GREATEST(), LEAST()関数はPostgreSQLだけNULLの扱いが違う

SQLには複数レコードから最大値/最小値を求める集約関数の`MAX()`, `MIN()`関数がありますが、そうでなく複数指定した引数のうちの最大値/最小値を求める関数を、SQL非標準ながら複数のRDBが持っています。
それが`GREATEST()`, `LEAST()`関数。

しかしこの両関数に渡した引数値にひとつでも`NULL`が含まれていた場合の振る舞いがPostgreSQLだけ違うので製品移行の際に注意が必要です。
<table><tr><th>RDB</th><th>NULLが含まれた場合</th></tr><tr><td>Oracle</td><td rowspan=5>NULLを返す</td></tr><tr><td>DB2</td></tr><tr><td>MySQL</td></tr><tr><td>SQLite<br>（多引数`MAX()`, `MIN()`）</td></tr><tr><td>BigQuery</td></tr><tr><td>**PostgreSQL**</td><td>**NULLを無視し残りの値の最大または最小**</td></tr><tr><td>SQL Server</td><td>（非搭載）</td></tr></table>
設計、コーディングで悩んだら

この手の記事は、山ほどあるけど備忘録的にまとめておく

# DRY
## Don't Repeat Yourself.

頭文字を取って **DRY** と呼ぶ。
「あっちゃこっちゃに同じ処理を書き散らかさない」です。
ファイルを扱う処理は、一箇所にまとめる。DBアクセスする部分はあるところにまとめる。
同じ処理内容をあちらこちらにバラバラと散らかさない。
図書館でも、同じ分類のものは一箇所にまとまってますよね？

http://ja.wikipedia.org/wiki/Don't_repeat_yourself

# OAOO
## Once and Only Once

DRYと似ていますがもっと局所的な話で、「コードの重複の排除」です。
コピーアンドペーストの悪しき習慣を勇気をもって排除しましょう。
例えば、コピーして作成したプログラムにバグがあったらどうでしょう。
コピーした分だけ修正しなければいけませんよね？
どこに書かれている分からない、コピーアンドペーストされたバグコードはgrepして直すしか方法がありません。

# YAGNI
## You Aren't Going to Need It.
（今必要なことだけ行う）
先の事を考えて、前払い的に機能を増やし、実装を複雑化させる事は避ける。
むしろ無駄な機能があれば削りとり、今必要な機能だけのシンプルな実装に留めておく。
このことで後のイレギュラーな変更に対応しやすいようにする。
拡張可能性を残しつつ、必要最小限でということですかね。
良かれと思ってやったことは、たいてい余計なことです。
使いもしない関数や、メソッド、クラスをいたずらに増やさない。
いるかいらないかわからない、そんなときはいらない。

http://ja.wikipedia.org/wiki/YAGNI

# KISSの原則
## Keep it simple, stupid

直訳すると、シンプルにしとけ。クソッタレ。ということ。
美しいものは、みなシンプルです。
どんなに複雑なものでも、単純なものの組み合わせです。
単純でシンプルなものまで分解して、それを組み合わせましょう。
一つの関数、クラス、メソッドなどが数千行になってないですか？

http://ja.wikipedia.org/wiki/KISS%E3%81%AE%E5%8E%9F%E5%89%87

# PIEの原則
## Program Intently and Expressively

意図を明確にしろ。
レビューで、変数名、クラス名、メソッド名などをごちゃごちゃ言われるのは、その名前が何を意味しているか曖昧だからです。コードは人が読むことを前提としているため、人が読めなければ意味がない。
いつ、誰が読んでも理解できるコードを心がける。

これらは、[プリンシプル オブ プログラミング](https://www.amazon.co.jp/dp/4798046140/) にまとまってる。

May the Good Programing Life be with you.
sar(sysstat)の00時00分のデータが取れてない？

ここではsar(sysstat)のインストール方法、使い方などは省かせていただきます。
非常にわかりやすかったページのリンクを貼っておきます。
> [sar(sysstat)によるボトルネック特定](https://qiita.com/kidach1/items/07637a5baa0da7d52e6a)

## cron の設定について
デフォルトは下記のような設定になっていると思います。

```sh:/etc/cron.d/sysstat
*/10 * * * * root /usr/lib/sa/sa1 1 1
53 23 * * * root /usr/lib/sa/sa2 -A
```

しかし、00時00分～00時10分のデータを見てみると、

```sh:
$ sar -q -s 00:00:00 -e 00:11:00


00時00分01秒   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15
00時10分01秒         1       488      0.01      0.32      0.29
平均値:          1       488      0.01      0.32      0.29
```
取れてない？

## cron 設定変更

下記のページによると、
> http://sebastien.godard.pagesperso-orange.fr/faq.html
日本語訳＞
Sysstatは深夜にデータを取得しますが、値を表示するには2つのデータサンプルが必要です。
"ファイルローテーション"（新しい日の始まり）があると、sadcはそのデータを前日のデータファイル（/var/log/sa/sa\<DD>）の末尾に書きます。

ということだそうです。
データサンプルが1つしかないため、00時00分のデータが表示されなかったようです。
crontab の例を基に下記のようにしました。

```sh:/etc/cron.d/sysstat
#*/10 * * * * root /usr/lib/sa/sa1 1 1
53 23 * * * root /usr/lib/sa/sa2 -A

*/10 1-22 * * * root /usr/lib/sa/sa1 1 1
0-40/10 23 * * * root /usr/lib/sa/sa1 1 1
50 23 * * * root /usr/lib/sa/sa1 600 2
10-50/10 0 * * * root /usr/lib/sa/sa1 1 1
```
``` sh:
$ sar -q -s 23:50:00 -e 00:01:00 -f /var/log/sa/sa＜DD＞

23時50分01秒   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15
00時00分01秒         1       424      0.13      0.03      0.01
平均値:          1       424      0.13      0.03      0.01
```
末尾に00時00分のデータが書き込まれていました。
＜DD＞を「17」とした場合、
翌日18日の00時00分のデータが「/var/log/sa/sa17」の末尾に書き込まれています。

5分毎の場合は下記のようになると思います。(未検証)

```sh:/etc/cron.d/sysstat
58 23 * * * root /usr/lib/sa/sa2 -A

*/5 1-22 * * * root /usr/lib/sa/sa1 1 1
0-50/5 23 * * * root /usr/lib/sa/sa1 1 1
55 23 * * * root /usr/lib/sa/sa1 300 2
5-55/5 0 * * * root /usr/lib/sa/sa1 1 1
```

##さいごに
翌日のデータが末尾に書き込まれる、というのが要注意です。
00時00分のデータは必要ない、という場合はこのような設定変更は不要です。
データが抜け落ちてて気持ち悪い、という方はご参考までに
iOSのステータスバーの文字を白くする【Xamarin.Forms(Prism)】

# iOSのステータスバーの文字を白くする

Xamrin.FormsでPrism使ってるときにiOSアプリのステータスバーの文字が白くならなかったので試行錯誤した
一応できたけどこういうもんなの？ってモヤモヤが残る。
もっといい方法ありそう。

## できたパターン①

.iOSプロジェクトのinfo.plistに

```xml:info.plist
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
```

起動時のスプラッシュでも変更する場合は以下も

```xml:info.plist
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
```

PCLでNavigationPageを継承し、コンストラクタで設定する

```csharp:CustomNavigationPage.cs
// usingとかnamespace省略
public class CustomNavigationPage : NavigationPage
{
    public CustomNavigationPage() : base()
    {
        // ナビゲーションバー、ステータスバーの背景色
        BarBackgroundColor = Color.Blue;
        // ナビゲーションバー、ステータスバーの文字色(ステータスバーは白か黒になる)
        BarTextColor = Color.White;
    }
}
```

App.xaml.csでコンテナに登録するNavigationPageをCustomNavigationPageに差し替える
nameはNavigationPageにしておくと差し替えの影響が少ないはず

```csharp:App.xaml.cs
protected override async void OnInitialized()
{
    InitializeComponent();
    await NavigationService.NavigateAsync("NavigationPage/MainPage");
}

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    //containerRegistry.RegisterForNavigation<NavigationPage>();
    containerRegistry.RegisterForNavigation<CustomNavigationPage>("NavigationPage");
    containerRegistry.RegisterForNavigation<MainPage>();
}
```

![ステータスバー文字色変更①.jpg](https://qiita-image-store.s3.amazonaws.com/0/64415/a7f5216d-a602-04d5-a3d4-6ca0bc43750c.jpeg)

## できたパターン②

info.plistは①と同様

App.xaml.csでNavigationAsyncしたあとにNavigationPageを取り出してプロパティ変更

```csharp:App.xaml.cs
protected override async void OnInitialized()
{
    InitializeComponent();
    await NavigationService.NavigateAsync("NavigationPage/MainPage");

    var naviPage = (NavigationPage)MainPage;
    naviPage.BarBackgroundColor = Color.Green;
    naviPage.BarTextColor = Color.White;
}
```

Prismを使わないXamarin.Formsだと`MainPage`プロパティに最初のページを設定していた気がするので取り出してみたらいけた。
が、どう考えても①の方が安全

![ステータスバー文字色変更②.jpg](https://qiita-image-store.s3.amazonaws.com/0/64415/8b3dc53f-1145-4244-e85a-426dd5c6b111.jpeg)

## ダメだったパターン

info.plistまでは同様

iOSプロジェクトのAppDelegate.csに追加

```csharp:AppDelegate.cs
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
    global::Xamarin.Forms.Forms.Init();
    LoadApplication(new App(new iOSInitializer()));

    UIApplication.SharedApplication.SetStatusBarStyle(UIStatusBarStyle.LightContent, false); // ← これ

    return base.FinishedLaunching(app, options);
}
```

結構紹介されているパターンだがステータスバーの文字は黒いままだった。
これは最初からiOSのみのプロジェクトだろうか…？
Railsのmaster branchにdelegate methodをprivateにするオプションが追加されてた

ActiveSupportの`delegate`したやmethodをprivateにする方法ないかなーと思ってみてたら、Railsのmasterブランチだとオプション追加されてた。
https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/module/delegation.rb#L171
`delegate :hoge, to: :fuga, private: true`みたいな。

5-2-stableにはなかったのでリリースされるのはまだ先かなぁ。
ちなみにPRは以下。
https://github.com/rails/rails/pull/31933

他にも似たようなissueあがってるんで、リリースされるまでにI/Fかわるかもね。
new Date('YYYY-MM-DD')の時間

date-fnsのparse('YYYY-MM-DD')で生成した日付オブジェクトが0時０分0秒に対して、new Date('YYYY-MM-DD')で作成した日付オブジェクトの時間が日本時間9時になります。
日付比較などに使う時に注意する必要があります。

#### parse

```javascript
console.log(parse('1989-01-08'));
// Sun Jan 08 1989 00:00:00 GMT+0900 (JST)
```

#### new Date

```javascript
console.log(new Date('1989-01-08'));
// Sun Jan 08 1989 09:00:00 GMT+0900 (JST)
```
ELB の Sticky Session(スティッキーセッション)について

# Sticky Session(スティッキーセッション)とは？
ひとことで言うと、ユーザーのセッションを維持して、ELBから同じインスタンスにロードバランスをする仕組み。
### AWS公式参考
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/elb-sticky-sessions.html
googleOptimizeでデータレイヤー変数を使用する

googleOptimizeを用いてABテストを行いたかったのですが、
単純なページロード時にランダムにテストではなく、条件をつけたかったのでメモ。
>googleOptimizeとはについてはこちらがとてもわかりやすかったです
https://webbu.jp/googleoptimize-2-3173

*やりたかったこと*
`blogの記事カテゴリによってABテストの表示切り替えを行いたい
（該当カテゴリのみBのパターンを表示、など）`

*実現方法*
1）ソース側
サーバーサイド側で実現したい絞り込みで条件分岐させ真偽なりintなりでABテストを行うか否かのフラグを立てる
立てたフラグをscriptタグ側で表示させる

```javascript:sample.js
<?php
$hoge_flg = 0;
 if ($category === 'hoge') {
 $hoge_flg = 1;
}?>
dataLayer = [{'test': <?php echo json_encode($hoge_flg);?>}];
```

ただし、上の形式ではGoogleのスニペット（</header>より上）に記載しないと取得が正常に働かない:cold_sweat:
サーバーサイド側でフラグを取得できるタイミングが</head>より後になるのであれば

```javascript:sample.js
<?php
$hoge_flg = 0;
 if ($category === 'hoge') {
 $hoge_flg = 1;
}?>
dataLayer = dataLayer || [];
dataLayer.push({'test':<?php  echo json_encode($hoge_flg); ?>});
```
とする必要がありそう

`dataLayer = dataLayer || [];`
の詳細な解説を含め、こちらを大変参考にさせていただきました:clap_tone1::clap_tone1:
わかりやすい解説です！感謝

[解決済み: GTMとデータレイヤー変数でのeコマース実装は、カグアさんのブログの通りのデータレイヤーコード書き出... - Google 広告主コミュニティ](https://www.ja.advertisercommunity.com/t5/%E3%83%88%E3%83%A9%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%AE%9F%E8%A3%85/GTM%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E5%A4%89%E6%95%B0%E3%81%A7%E3%81%AEe%E3%82%B3%E3%83%9E%E3%83%BC%E3%82%B9%E5%AE%9F%E8%A3%85%E3%81%AF-%E3%82%AB%E3%82%B0%E3%82%A2%E3%81%95%E3%82%93%E3%81%AE%E3%83%96%E3%83%AD%E3%82%B0%E3%81%AE%E9%80%9A%E3%82%8A%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E6%9B%B8%E3%81%8D%E5%87%BA%E3%81%97%E3%81%A7%E5%95%8F%E9%A1%8C%E3%81%AA%E3%81%84%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B/td-p/20624)

2）GoogleOptimize側での設定

今回はデータレイヤー変数を使用

上記で呼び出した`hoge_flg`を　データレイヤーの変数名　と　変数名　に設定し、
if条件も任意に設定する
https://support.google.com/optimize/answer/6301794?hl=ja&ref_topic=6283433

たいした内容ではなくすみません。。もっと詳しい方の細くもお待ちしております:angel:
staticな変数にはUnityのAttribute（属性）が効かないっぽい

Unity初心者の備忘録
タイトルのまんまで単純なことなのですが、検索ででてこなくて半日潰したのでメモっておきます。


例えば、これだとダメで

```csharp:
[Range(0, 5)]
public static int Hoge;
```
これならいけます。

```csharp:
[Range(0, 5)]
public int Hoge;
```
[SerializeField]とかも当然効かないです。

getter、setterを設定するのが面倒だったのでstaticにしたのですが、まさかこんな落とし穴があるとは…。
次からはちゃんと{get; set;}くらいは書こうと思います。
DDEオプション変えてもExcelブックを読み取り専用で開けなかったので、いろいろ調べて解決したお話

# 経緯とか

```text:環境
Windows 10
Office 2016
```

よくある「読み取り専用で開く」を有効化したかった。

でもぐぐったらよく出てくる、DDEオプションを修正する方法ではうまく行かなかったぷーん

いろいろ調べて解決できたので残しておこうと思います
環境（orバージョン）的なものなのか、過去の自分がやらかしただけなのかはわからないですが、同じような現象で悩んでる人の参考になれば幸いです

\# 記事内では `.xlsx` のみを記載してますが、 `.xls` とか `.xlsm` とか、その辺も同様に有効化させたいときにはいい感じに読み替えてください。

# TL;DR

```reg
[HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\OpenAsReadOnly]
@="読み取り専用で開く(&R)"
"Extended"=-

[HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\OpenAsReadOnly\command]
@="\"C:\\hoge\\foo bar\\EXCEL.EXE\" /r \"%1\""
```


# いつものやつ(?)

## Shiftキー押さなくてもコンテキストメニューに出したい

```reg:メニューにだす
[HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\OpenAsReadOnly]
@="読み取り専用で開く(&R)"
"Extended"=-
```

## 読み取り専用でちゃんと開くようにDDEコマンドを修正

```reg:これでROMれるはず
[HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\OpenAsReadOnly\ddeexec]
@="[open(\"%1\",,1,,,,,,,,,,,,1,,1)]"
```

かんぺき。

……じゃない。普通に開いちゃうじゃん。なんで！


# そもそもDDEが使われてなかった

いろいろ調べてみて、レジストリでのファイルの開き方のたどり方を勉強してみた。

`.xlsx` でのファイルを開く際のコマンドを見てみたら、

```reg
[HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\OpenAsReadOnly\command]
@="\"C:\\hoge\\foo bar\\EXCEL.EXE\" /h \"%1\""
```

DDE使われてないじゃん！[^1]
\# DDEを使うときは、 `EXCEL.EXE` に `/dde` オプションを指定するらしいです。


`/h` オプションってなんだろう……[載ってない](https://support.microsoft.com/ja-jp/help/291288/description-of-the-startup-switches-for-excel)んだけど……


というわけで、ここの `EXCEL.EXE` に対して `/r` のオプションを指定。
ついでによくわからない `/h` オプションも削除。

```reg:これでOK
[HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\OpenAsReadOnly\command]
@="\"C:\\hoge\\foo bar\\EXCEL.EXE\" /r \"%1\""
```
（開発がrとhをtypoしたとかそういうオチなのかなこれ）

無事しっかり読み取り専用で開けるようになりました。
めでたしめでたし。

---

ちなみに、

```
[HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\OpenAsReadOnly\ddeexec]
@="[open(\"%1\",,1,,,,,,,,,,,,1,,1)]"
```

↑これは削除してしまっても大丈夫です。

---

[^1]: Windows10から？こうなってるのか、自分がよくわからないまま別のところで調べてたときに直しちゃったのかは謎……わかる方ぜひ教えてください。
PHPUnit assertSameとassertEqualsの違い

# 概要

今まで意識して使っていなかったが、テストを作成する際に調べていたら結構重要なことだったので、忘備録。


# assertSameとassertEqualsの違い

PHPでいうと

assertSame => 「===」
assertEquals => 「==」

となる。
そのため、型までしっかり判定したいというとき(ほとんどの場合そうだと思うが)は
assertSameを使うと良い。

# 追記

assertEquals を**わざと利用する**場合は、**背景、理由についてコメントを残す**ことを進める。

そうしなかった場合、
assertSameにしたら、ユニットテストがおかしくなったなど起きる可能性があるため。
そもそもそのようなテストがよくな(ry
CMakeをroot権限なしでインストール

自分がsudo権限のない共用サーバでCMakeでのビルドを使いたかったのですが、
CMake等はインストール先を$HOMEディレクトリにすれば、
インストールできることを知ったのでメモしておきます。

元記事はこちらです。

- [Local build without root](https://pachterlab.github.io/kallisto/local_build.html)

ちなみに `make` と `zlib` は必要みたいですが、これもローカルビルドすれば可能かもしれません。

## 環境変数の追加
ビルド先を指定するために環境変数に$HOME以下のディレクトリを指定します。
また、もしなければdirectoryも作っておきます。

```bash:.bashrc
export PATH=$HOME/bin:$PATH
export LD_LIBRARY_PATH=$HOME/lib/:$LD_LIBRARY_PATH
```

ビルドするだけならsession内でexportすればいいですが、
cmakeコマンドを毎回ロードする際は.bashrc等にも記載します。

`bin`は`.bin`とかでもいいかもしれません。
また、LD_LIBRARY_PATHは不要かもしれないですね、、

## CMakeのダウンロード・ビルド

ローカルにダウンロードしてビルドします。

[公式サイト](https://cmake.org/install/)では `./bootstrap` でconfigurationしていますが、
下の記事のように、`.configure`を使っています。

- [Ubuntu に cmake を install する。 ](https://qiita.com/YutakakINJO/items/69f01d2abfb958ada88b)

また、`--prefix`オプションでインストール先を指定することでローカルにインストールしています。

```shell
$ tar -xf cmake*.tar.gz
$ cd cmake*
$ ./configure --prefix=$HOME
$ make
$ make install
```

これで完了です。

```shell

$ cmake --version
```
無料ウイルス対策ソフト「カスペルスキー セキュリティスキャン」がひっそり終了。代わりの「Kaspersky Free」を導入

当方では通常利用のクライアントに「カスペルスキーインターネットセキュリティ」ライセンスを購入して使用している。ただ、一時的に利用するPCには、無料のKaspersky Security Scanを導入していた。

しかし、それがダウンロードできなくなっていた。
https://www.kaspersky.co.jp/free-virus-scan

どうやら先週、2018年3月13日にサポートを終えたらしい。
https://support.kaspersky.co.jp/14090

調べると、日本法人ではなく、米国では、
代わりの「Kaspersky Free」がダウンロードできるとのこと。
[カスペルスキー、無償アンチウイルスソフトを全世界リリース - 窓の杜](https://forest.watch.impress.co.jp/docs/news/1072567.html)

ダウンロードはこちらから可能。
https://usa.kaspersky.com/free-virus-scan

無料の範囲では、日本語化はできず英語でのインターフェースになるが、ファイル保護、Web保護、メッセンジャー保護、メール保護がついてくる。MS純正のWindows Defenderよりも信頼できる無料セキュリティソフトを探している場合は、一考してほしい。
【JQuery】値変更不可＆Form送信できるセレクトボックス

#困ったことに
・SelectはReadOnly属性が効かない
・Disabledは効くけどForm送信できない

#やりたいこと
・セレクトボックスの値を変更できないようにしたい
・でもForm送信はしたい

#他のoption消しちゃえ
選択させたくないoptionはdisabledにする、とかプラグインをいれる方法もあるみたいですが、プラグインいれるほどではないし、optionをdisabledする方法だと確かに選択できなくなるけど表示されるのが嫌だな～と思って、それなら消しちゃおうと思いました。

他の方法
[HTMLのSelectタグやInputタグのRadioボタンをReadOnlyにする方法](http://simple-asta.blogspot.jp/2013/08/readonly-select-tag.html)
[セレクトボックスを変更できないよう固定してかつ値も送信するjQueryプラグイン](https://qiita.com/17ringe/items/f42d2685b5516d5f5319)

```html:test.html

<select name="animal" id="animals">
	<option value="dog">いぬ</option>
	<option value="cat" selected="selected">ねこ</option>
	<option value="rabbit">うさぎ</option>
</select>

```

```js:test.js
 $("#animals select option[value='cat']").prop("selected", true);
 $("#animals select option:not(:selected)").remove();

```

こういう指定（option:not(:selected)）もできるって知らなかったので( ..)φメモメモ
Twitterの通知みたいなUIをCSSで作る方法

Twitter公式アプリの通知UIが好きなので、CSSで作ってみました。
画面下部にシャキーンって出てくるあれです。

![sample.gif](https://qiita-image-store.s3.amazonaws.com/0/223036/b948e1dc-f66c-d80f-941a-011c75649f38.gif)

ポイントは、ひとつの長方形をスライドさせて表示するのではなく、2つの長方形を両サイドからスライドさせて衝突させる感じです。

![sample.jpg](https://qiita-image-store.s3.amazonaws.com/0/223036/a93ae34f-7f0e-1199-9aa4-b053acc8e65d.jpeg)

##CSS
```css
body {
	overflow: hidden;
}

body::before {
	content: "";
	display: block;
	position: absolute;
	left: -50%;
	bottom: 0;
	width: 50%;
	height: 30px;
	background: #09f;
	animation: cutInLeft 5s ease infinite;
}

body::after {
	content: "";
	display: block;
	position: absolute;
	left: 100%;
	bottom: 0;
	width: 50%;
	height: 30px;
	background: #09f;
	animation: cutInRight 5s ease infinite;
}

@keyframes cutInLeft {
	0% { left: -50%; }
	30% { left: -50%; }
	32% { left: 0%; }
	100%{ left: 0%; }
}

@keyframes cutInRight {
	0% { left: 100%; }
	30% { left: 100%; }
	32% { left: 50%; }
	100%{ left: 50%; }
}
```

バーの上にテキストやボタンなどを載せたい場合は、バーの表示タイミングにあわせてフェードインするようにします。

使いどころがいまいちわかりませんが、シャキーンとさせたいときに有効です。
centos7 sudo追加

### centos7 sudo追加

sudoは最初から使用できるものかと思っていましたが、最初に設定ファイルに登録する必要がある。

何も設定せずにsudo を使用すると
「sudoers ファイル内にありません」とエラーが出る。

■sudo設定手順
1,root権限のあるユーザもしくはrootでログインする。

2,「visudo」コマンドを実行する。

3,コメントを外す
\## Allows people in group wheel to run all commands
\#%wheel ALL=(ALL)       ALL
↓
\## Allows people in group wheel to run all commands
%wheel ALL=(ALL)       ALL
\#%wheel ALL=(ALL)       ALL

4,「usermod -G wheell ユーザ名」を実行して、ログアウト後、ログインすれば「sudo」が使える。
POST送信を行っているページにBackするとエラーが出る際の対処法

# POST送信を行っているページにBackするとエラーが出る際の対処法

経緯
クライアント「ブラウザで戻る、進むをした時に、エラーが出ないようにしてほしい」
僕「なるほど　やってみます:fist:」

備忘録メモ
実際にはまっていた理由は```session_start();```がソース上にいくつもあって、どこが本当に利用されているのかわからなかったからなんだけど…
やっぱりフレームワークはちゃんと使った方がいいよね…

## 参考にさせていいただいたサイト:sunny:
* [忘れんうちに書いとけ:PHPでWebページの有効期限が切れてますとなる時の傾向と対策](http://blog.livedoor.jp/trisys/archives/1510439.html "忘れんうちに書いとけ:PHPでWebページの有効期限が切れてますとなる時の傾向と対策")
* [ブラウザの戻るボタンを押すと有効期限切れとなるのはなぜですか - PHPプロ！Q&A掲示板](http://www.phppro.jp/qa/311 "ブラウザの戻るボタンを押すと有効期限切れとなるのはなぜですか - PHPプロ！Q&A掲示板")

## エラーの内容と原因
POST送信されたデータをもとに処理を行っている画面に、ブラウザの戻るボタンや、JSのBackで戻ろうとすると、有効期限切れエラーが表示されてしまう。

原因は、PHPでSESSIONをStartした際に、Sessionを制御するヘッダーが送信され、ブラウザ側のキャッシュが利用されなくなるため。
そのため、解決策としては「Sessionを制御するヘッダー」をどうにかしてやればよい。

## 対策1　session_cache_limiter('none')
対策として有名なのは、session_start()する前に、session_cache_limiter('none')とすること。

```php
<?php
session_cache_limiter('none'); //これを追加
session_start();
```

これにより、SESSIONを使っても余計なHTTPヘッダーが送出されなくなる。
SESSIONの設定を変更しているだけなので、```php.ini```の```session.cache_limiter```の設定値を変えてあげても同じことができる（と思う。）
でもこれを使うと、headerが全く出力されず、他の部分に影響が出る可能性もある（らしい）

## 対策2 headerを直接変更する
以下のように、headerを直接上書きする。

```php
<?php
session_start();
header('Expires:');
header('Cache-Control:');
header('Pragma:');
```

ソース的には長いし、何か物々しい感じがするが、明示的にheaderを制御していることがわかるので、可読性は高いのかもしれない。
とりあえず自分的にはこれを使うようにする。

実際の動作を確認しても、POST送信したページにエラー表示なく戻ることができた。
しかし、表示されているのはあくまでもキャッシュされたページに過ぎないので、最新の情報を表示させる必要があったり、フォームの確認画面で2重送信の危険があったりというところでは、この対応はとるべきではないと思う。
CSSで兄弟要素を指定する場合、IEに注意

# CSSで兄弟要素を指定する場合、IEに注意

## 兄弟要素の指定

CSSでは複数の兄弟要素について指定ができます。  
具体的には同じ階層の自身より後ろの要素にCSSの指定ができます。

```php
<!doctype html>
<html lang="ja">
<head>
</head>
<body>
	<style>
		div.base ~ div.check {
		display:none;
	}
	</style>
	<div class="base">start</div>
	<?php for ($i = 1;$i <= 1000; $i++):?>
		<div class="check"><?php echo $i;?></div>
	<?php endfor;?>
	<div class="end">end</div>
</body>
</html>

```

こんなのを書くと、画面はこうなります。

![2018-03-19_10h51_48.png](https://qiita-image-store.s3.amazonaws.com/0/54588/08272b44-37a4-f2ed-e87f-4105a0214f8d.png)

checkクラスが全て`display: none;`になっていますね。


参考リンク

https://developer.mozilla.org/ja/docs/Web/CSS/General_sibling_selectors

## で

![2018-03-19_10h48_30.png](https://qiita-image-store.s3.amazonaws.com/0/54588/547e04e3-f034-b76c-250d-f5db69a1f7f9.png)


こんな事案が発生。。。
上記コードをIEで確認すると・・・

![2018-03-19_10h53_07.png](https://qiita-image-store.s3.amazonaws.com/0/54588/b0da2e57-7444-cd03-dd3d-e138956cc615.png)


こうなります。。。

299個目までは認識してくれていますが、300個目から兄弟要素として認識してくれないようです。。。

とりあえずFirefox/Chrome/Edgeではこのような現象が発生しないことは確認しました。

普通300個先の兄弟要素とか指定しないと思いますけど、~~手抜き~~JSじゃなくてCSSでうまいことやりたかったので、頑張ってみた結果がこれだよ！

## ということで
なかなか当たる問題じゃないとは思いますが、兄弟要素をcssで指定するときはご注意をば。

(隣接兄弟要素の指定の場合は特に問題にはならないです。というか普通は隣接までですよね。。。)
組織アカウントと同じアドレスの個人アカウントがあるとWindows版Hangout Chatアプリを起動できない 

# 現象
組織アカウントと同じアドレスの個人アカウントがあるとWindows版Hangout Chatアプリを起動できない。（ブラウザでWEBアプリが開かれてしまう）

# 解決方法
1. シークレットタブなどで個人アカウントの方でログインする。
2. ログインできたら、別のGmailアドレスか、別サービスのアドレスに変更するか選択せよ、と言われるのでどちらか選んで、重複した個人アカウントから移行する（と、重複した個人アカウントは消去される）
3. ここまでできたら、普通にWindows版Chatアプリを起動してログインできるようになる。
ざっくばらんメモ_27：kaggle bowl2018

###kaggle bowl2018
[コンペ](https://www.kaggle.com/c/data-science-bowl-2018)
[code](https://github.com/festa78/kaggle_bowl2018)
前回はDilated Residual Networkを用いた推論を行い、あまり結果が良くなかった。
今回は[pytorchベースのsegmentationコード](https://github.com/ycszen/pytorch-seg)を
folkし、今回のデータに合わせた形でadapterを加えつつ試した。
まず初めにbilinear補完によるupsampleを用いたFCNを学習した。
結果：LB0.148と結果は微妙。
upsamplingにdense upsampling (cf. https://arxiv.org/abs/1702.08502 )を用いた版を
学習するも、model colapseしてしまうのか、０のみを出力するようなモデルが出来てしまった。
一般のcityscapesなどでは高性能を発揮してきたモデルなのでうまくいくと踏んでいたが、
そうでもないようである。
IBM Cloud (Bluemix) を利用して5分でWebサーバーを公開する

開発中など、一時的にローカルじゃないWebサーバーを立てたい時ってありますよね。他ドメインに置いたデータをアクセスするロジックを試したい、とか。テスト中のページをメンバーに見てもらいたい、とか。

IBM Cloud (Bluemix)アカウントを持っている場合、5分もあればWebサーバー環境を起動できて、不要になったらすぐ消せます。便利なので、ぜひ試してみてください。

# 前提条件

以下の条件を満たしている方であれば誰でも利用できる小技です。

* IBM Cloud (Bluemix) アカウントを持っていること
* [CFツールを導入](https://qiita.com/yamachan360/items/12545f3277fc0c65d2f8#cf%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E5%B0%8E%E5%85%A5) していること
* 実行できる仮想マシンの枠が余っていること (特に無料アカウントの場合)

# Web サーバーの作成

ターミナル (Windowsだとコマンドプロンプト) を起動し、適当なディレクトリで以下のコマンドを入力してIBM Cloud(Bluemix) にログオンします。

```
cf api https://api.ng.bluemix.net
cf login
```

続いて以下のコマンドを入力し、作業ディレクトリを作成します。'yamachan-web-test' はユニークである必要がありますので、ご自身で決めた適当な文字列に置き換えて入力してください。

```
md yamachan-web-test
cd yamachan-web-test
```

さて、ここからが本番です。以下のように入力して必要なファイルを作成します。

```
echo root: public > Staticfile
md public
echo Hello Bluemix > public/index.html
```

これで準備は完了です。以下のコマンドでWebサーバーを作成します。

```
cf push yamachan-web-test -m 64M
```

以下のように表示されればokです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/cf699e7d-dc24-34fc-c593-a0ce9ccb3aeb.png)

Webブラウザで表示されたURLにアクセスし、表示を確認しましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/f605a053-d30b-e4d9-30ac-79b80918c92f.png)

# Web サーバーの更新

作成した public ディレクトリの中身が、今回作成した Web サービスでそのまま公開されます。以下のように index.html の内容を修正し、cf push で IBM Cloud (Blluemix) 環境に反映します。

```
echo !! >> public/index.html
cf push yamachan-web-test -m 64M
```

Webページが更新されましたね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/9ff70a96-c16e-8eb2-4828-3c8ca6fce699.png)

# Web サーバーの削除

Web サーバーが不要になったら以下のコマンドで作成したサービスと、公開時に自動設定されたルート設定を削除します。

```
cf ds yamachan-web-test
cf delete-route mybluemix.net -n yamachan-web-test
```

# 解説

今回のサービス利用のポイントは [staticfile-buildpack](https://github.com/cloudfoundry/staticfile-buildpack) の利用です。

CF (Cloud Foundry) 用のビルドパックには多くの種類がありますが、staticfile は [nginx](https://ja.wikipedia.org/wiki/Nginx) というWeb サーバーを動かすためのシンプルな環境です。

IBM Cloud (Bluemix) 環境に cf push で公開する際に、自動的にビルドパックの選択がおこなわれるのですが、Staticfile という名称の設定ファイルがあると、この staticfile-buildpack が選択されます。

このビルドパックはシンプルなので、実行にそれほどメモリを必要としません。そこで cd push の際に -m 64M オプションを付与することで、作成される仮想環境のメモリに 64M Bytes を指定しています。

設定ファイル Staticfile には root 指定だけが記載されており、public ディレクトリが指定されています。なのでWebサイト公開後はこの public ディレクトリがサーバーのルートとして公開され、配置されたファイルにアクセスできます。

# おわりに

IBM Cloud (Bluemix) および Cloud Foundry 環境において、[staticfile-buildpack](https://github.com/cloudfoundry/staticfile-buildpack) は非常にお手軽、かつ便利なものです。

また CF の仕組み自体の便利さと、ビルドパックの自動選択の手軽さがうまくマッチして、お手軽に利用できる良い例になっていると思います。

ちょっとしたテストや公開用に、そして初心者の方が試す際の最初の一歩として、ぜひ活用してみてください。
テキストの折返しの制御

**<h2>レスポンシブで望む場所で改行させる</h2>**

画面の横幅が狭くなることによって文節中に改行して見栄えが悪くなったり、文言の意味が理解しづらい状況になることがあります。それを防ぐための方法。


**メディアクエリを利用**

 1.改行したい場所に```<br class="">```
 2.メディアクエリで横幅が大きい時は```display: none;```を
   横幅が狭くなって、変な場所で改行し始めたら```display: block;```

**inline-block**

 1.改行したい場所で分けてそれぞれ```display: inline-block;```でくくる


<p data-height="265" data-theme-id="0" data-slug-hash="PRbKXQ" data-default-tab="html,result" data-user="aiyumi" data-embed-version="2" data-pen-title="PRbKXQ" class="codepen">See the Pen <a href="https://codepen.io/aiyumi/pen/PRbKXQ/">PRbKXQ</a> by aiyumi (<a href="https://codepen.io/aiyumi">@aiyumi</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
diff + patch + git > 手順 > 24個のファイルそれぞれに対して8個のパラメータを変更する

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
GeForce GT 730 1GB GDDR5
CentOS 6.9 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```


### やりたいこと

- 24個のファイルがある
- 全てのファイルに対して8個のパラメータを同じように変更する

24個のファイルに対してエディタで逐次修正していくと

- 時間がかかる
- 間違う

### 手順

以下とする

1. gitの準備
    - git initにて対象ディレクトリのgit環境を用意
2. 1つ目のファイル(以下file1)のオリジナルをコピーしておく
    - `cp file1 original`
3. エディタにてfile1のパラメータを変更する
4. diffを取る
    - `diff original file1 > diff_file1`
5. git stashを使って変更を捨てる
    - `git stash`
    - `git stash drop`
6. 全部のファイルにパッチ適用する
    - `ls f*.input*`で対象ファイル全てが見つかる場合
        - `for afile in $(ls f*.input*);do patch $afile diff_file1;done`
7. 更新ファイル名の確認
    - `git diff --name-only`
8. ファイルを1つ開いて変更されていることを確認

作業後、originalファイルとdiff_file1ファイルを消す。

### 備考

- [Git で変更を patch ファイルにする / patch コマンドで適用する](https://qiita.com/sea_mountain/items/7d9c812e68a26bd1a292)

git diffによる差分ファイルを使おうとしたが、以下のようなエラーとなったため、上記の手順とした。

> Hunk #n FAILED at nnn. n out of n hunks FAILED -- saving rejects to file file.rej

参考: http://uguisu.skr.jp/Windows/diff_patch.html


### 検索用キーワード

- 複数の
30 Seconds of CSSからよく使うもの３つ抜粋

# 30 Seconds of CSS より、使うものを自分用にメモ

参照元：https://atomiks.github.io/30-seconds-of-css/

## テキスト選択色の変更

```html:html
<p class="custom-text-selection">Select some of this text.</p>
```
```cs:css
::selection {
  background: aquamarine;
  color: black;
}
.custom-text-selection::selection {
  background: deeppink;
  color: white;
}
```
<iframe width="100%" height="300" src="//jsfiddle.net/ironhearts/vsmL9o18/1/embedded/" allowpaymentrequest allowfullscreen="allowfullscreen" frameborder="0"></iframe>

## テキストを選択反転させない
チェックボックスとかラジオを選択してる最中に、ラベルのテキストが選択されてうっとうしいときが多々ある。地味にストレス。

```html:html
<p>You can select me.</p>
<p class="unselectable">You can't select me!</p>
```

```css:css
.unselectable {
  user-select: none;
}
```
- サポートしないブラウザもある
- 選択状態にならないだけで、コンテンツのコピーを防ぐものではない。


## hover時に下線(underline)をアニメーション
```html:html
<p class="hover-underline-animation">Hover this text to see the effect!</p>
```
```css:css
.hover-underline-animation {
  display: inline-block;
  position: relative;
  color: #0087ca;
}
.hover-underline-animation::after {
  content: '';
  position: absolute;
  width: 100%;
  transform: scaleX(0);
  height: 2px;
  bottom: 0;
  left: 0;
  background-color: #0087ca;
  transform-origin: bottom right;
  transition: transform 0.25s ease-out;
}
.hover-underline-animation:hover::after {
  transform: scaleX(1);
  transform-origin: bottom left;
}
```
GKEのingressに中間証明書をインストールするよ

GKE内のサービスをTLSで外部に公開したい場合、kubernetesのingressを使ってGCPのL7LBをたてるのが楽ですが、その時のTSL証明書の設定で苦戦したのでメモよりのメモ

## 証明書の結合ファイルを作る
ingressはGCPのhttpLBのように中間証明書をインストールするディレクティブがありません。そこで中間証明書等がある場合はサーバ証明書に中間証明書を結合してあげる必要があります。

``` bash
$ cat wildcard.example.com_20190430.cer tyukan_cert.cer >> cert.pem
```
このようにコマンドで結合するとマジ卍です。
## secretを作る
次に結合した証明書と鍵をkubernetesのsecretとして登録します。
secretは値をbase64でエンコードする必要があるのですが、kubectlコマンドを使うと簡単にkubernetesの定義ファイルを吐き出すことができます。

``` bash
$ kubectl create secret tls wildcard-example-com-20190420 --key=wildcard.example.com_20190430.key --cert=cert.pem -o yaml --dry-run > tls_secret.template.yaml
```

作成した定義ファイルを適用すればsecretの完成です。

``` bash
$ kubectl apply -f tls_secret.template.yaml
```
## ドメイン
予めドメインと静的IPアドレスのヒモ付は行っておいて下さい。
管理はterraformを使うと便利なので一応tfファイルの書き方ものせておきます。

```
resource "google_compute_global_address" "example-lb" {
  name = "example-lb"
}
resource "google_dns_record_set" "test_example_com" {
  managed_zone = "XXX"
  name         = "test.example.com."
  type         = "A"
  ttl          = 300
  rrdatas      = ["${google_compute_global_address.example-lb.address}"]
}
```
これで`example-lb`という名前の静的IPアドレスがGCP上に登録されます。
## ingressを作る
あとはingressをたてるだけです。
ingressには先程作成した静的IPアドレスをannotationsに、secretをtlsディレクティブに指定します。

``` example-ingress.yaml
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    kubernetes.io/ingress.allow-http: "false"
    kubernetes.io/ingress.global-static-ip-name: example-lb #ここに静的IPアドレスの名前
spec:
  tls:
  - secretName: wildcard-example-com-20190420 #ここにsecretの名前
  rules:
  - host: test.example.com
    http:
      paths:
      - backend:
          serviceName: example-service
          servicePort: 9000
```
上記の定義ファイルをkubectlでapplyするとしばらくすると(10分程度)httpsLoadbalancerが動き始めます。テンアゲ！

``` bash
$ kubectl apply -f example-ingress.yaml
```

## 確認
確認は確認用のサイトを使うといいでしょう。
ブラウザからの確認だと中間証明書がうまく設定できてなくても普通に通信できてしまったりします。
下記のサイト等を使って証明書にエラーが無いことを確認すると良いです。

[GeoTrustCryptoReport](https://cryptoreport.geotrust.com/checker/)

#### 参考記事

[SSLサーバー証明書に中間証明書を結合する [(全部俺)何でも Advent Calendar 2013 8日目]](http://diary.bis5.net/2013/12/10/450.html)
AWS Cognito のIdentity poolに登録されたidentityIdをまとめて削除する。

aws cognitoで認証管理しているシステムでは、開発環境などで大量に作成されたidentityIdを削除したくなる時があります。
そんな時、以下のようなcliでaws Cognito Federated Identitesの identity poolに登録されたidentityIdをまとめて削除できます。

```
POOL_ID="xxxxxxxxxx"
aws cognito-identity list-identities --identity-pool-id $POOL_ID  --max-results 50 | jq '.Identities | .[].IdentityId'  |  awk '{ print "echo delete id... " $1 "; aws cognito-identity delete-identities --identity-ids-to-delete "  $1 }' | sh
```

上のscriptでは、最大50件削除します。
復旧不可なので、誤って削除しないよう注意しつつ実行を。