OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】OpenPyXLでExcelを自動操作する

Excel用のPythonライブラリのうち,
日本語記事が既にいくつか存在するOpenPyXLについて説明します｡

# インストール方法
````
pip install OpenPyXL
````
普通にpipするのみ
場合によってはMSのframeworkのインストールが必要になることもあり
また､OpenPyXLで画像ファイルを扱うためにはPillowという画像ファイル向けのライブラリが使える


# OpenPyXLとXlsxWriterの比較
同様に日本語記事が多い､Excel用のPythonライブラリであるXlsxWriterと比較を行うと､
XlsxWriterは新規Excelファイルの作成が必要になるため､
既存Excelの編集時はOpenPyXLを使うことになる｡
また､既存Excelファイルの読み込みを行う場合も必然的にOpenPyPlを使うことになる｡
したがってXlsxWriterを使う必要性を感じなかったため､自分はOpenPyXLに一本化しました｡

# ExcelへのPython搭載のウワサの非公式NG回答(2018/12/26 追記)
Pythonのライブラリ使えとのことのようです。細かくはこちらのエントリーをご覧ください。
「ExcelにPythonが搭載？その後 - xlwings を使おう - Qiita」
https://qiita.com/yniji/items/b38bc312e860027108ac


# OpenPyXL
## 公式サイト
「openpyxl - A Python library to read/write Excel 2010 xlsx/xlsm files — openpyxl 2.5.2 documentation」
https://openpyxl.readthedocs.io/en/stable/

## ファイルの保存(絶対パス)
```` filesave.py
# 新規ファイル作成
wb = px.Workbook()
# 保存
wb.save('C:\myDev\myTest\sample.xlsx')
````

## セルの値書き込み
```` writeCellValue.py
# 新規ファイル作成
wb = px.Workbook()
# 対象のシートを選択する
ws = wb.active
# セル操作
## A1形式
ws['A1'].value = 'Hello World'
## R1C1形式
ws.cell(row=2, column=3).value = "123"
# 保存(絶対パス)
wb.save('C:\myDev\myTest\sample.xlsx')
````

## セルの値読み込み
```` readCellValue.py
# ファイル読み込み
wb = px.load_workbook('./example.xlsx')
ws = wb.active

# A1形式
a1 = ws['A1'].value
print(a1)
# R1C1形式
r1c1 = ws.cell(row=2, column=3).value
print(r1c1)
````


## Excel関数の使用
```` useExcelMethods.py
# 新規ファイル作成
wb = px.Workbook()
# 対象のシートを選択する
ws = wb.active

# 値を入力
# 数字は文字型ではなく数値型として入力した方がベターなよう
ws['A1'].value = 1
ws['A2'].value = 2.50000003
ws['A3'].value = 3.5

# 関数を入力
ws['B1'].value = '=SUM(A1:A3)'
ws['B2'].value = '=AVERAGE(A:A)'

# 保存(絶対パス)
wb.save('C:\myDev\myTest\calc.xlsx')

````



## 画像ファイルの挿入
```` inserImages.py

import openpyxl as px
from openpyxl.drawing.image import Image


# 新規ファイル作成
wb = px.Workbook()
# 対象のシートを選択する
ws = wb.active

# 画像ファイル(相対パス)
img = Image('test.jpg')
# 画像ファイル(相対パス)
img2 = Image("C:\myDev\myTest\\test.jpg")

# A1形式で挿入
ws.add_image(img, 'A1')
# R1C1形式は不可...?
# ws.add_image(img2, 'R8C[8')

wb.save('logo.xlsx')
````


## 読み込み専用モード
大容量ファイルや変更を行いたくないファイル向けに読み込みモードが利用可能
「Read-only mode — openpyxl 2.5.2 documentation」
https://openpyxl.readthedocs.io/en/stable/optimized.html

# 雑記
仕事ではExcel地獄かってぐらいにExcel使うんですが､
仕事以外ではほとんど使わないんですよね｡｡

Happy Excel!
JavaScript - Template literalを使って改行テキストを配列にする

ES2015で導入されたTemplate Literalではヒアドキュメントが使えるようになりました。
今まで、マスターデータを使ってコードを書く時に一行一行、クォーテーションマークをつけていましたがそれも不要になる。

```js
const urls = `https://twitter.com/mottox2
https://twitter.com/tbpgr
https://twitter.com/TatumakiGen
https://twitter.com/mitatyandesu`.split('\n')
```
を実行すると以下のような配列が得られます。
雑に書くときに便利。

```js
[
  'https://twitter.com/mottox2'
  'https://twitter.com/tbpgr'
  'https://twitter.com/TatumakiGen'
  'https://twitter.com/mitatyandesu'
]
```
PowershellでDLL/EXEファイルのバージョン一覧を出す。

配下のファイルのバージョンを一覧で出す。

```powershell

ls | sort  | ?{ $_.Name -like '*.dll' -or $_.Name -like '*.exe'} | %{echo $($_.name + "`t" + (Get-ItemProperty $_).VersionInfo.FileVersion)}

```

別のディレクトリにあるファイルを、現在のディレクトリ配下にあるファイルでフィルタし、バージョン一覧を取得する。

```powershell

ls | sort  | ?{ $_.Name -like '*.dll' -or $_.Name -like '*.exe'} | %{$_.name} | %{echo $($_ + "`t" + (Get-ItemProperty $("C:\SomeSystem\HogePath\" + $_) ).VersionInfo.FileVersion)}

```

僕はリリース用モジュールと、本番稼働モジュールのバージョンの違い一覧を見たい場合とかに使ってる。
変にコケて中身が空っぽのストアドを探しだすだけのクエリ

### どんな感じよ

自作スクリプトとかで一括してストアドを流したあと、反映に失敗してるやつを見つけるためのクエリ・・・
ものすごくピンポイントでたぶん僕しか使わないですねえ。僕のよくやる失敗のケツを吹くだけのクエリですねえ。

## 例えば

開発環境で作成・編集したストアドを、ステージング環境へ反映だ！って時に、まさかまさか

```sql
SELECT * FROM OPENDATASOURCE('fugafuga','Data Source=hogehoge;----').dbo.SomeTable
```
なんて罠があったりするとコケる。
あるいは

```sql
SELECT * FROM AnotherRenamedDataBase.dbo.SomeTable
```

なんて言うふうに、開発環境用のデータベース名にしてて、それを変更せぬまま反映しようとしてコケたとか。

単にコケるだけならいいけど、ストアドは残るけど中身は空っぽ、ってなことになったりする。

### そんなときに

```sql

SELECT   O.type,
         O.name,
         M.definition
FROM     sys.sql_modules AS M
           INNER JOIN sys.objects AS O
            ON M.object_id = O.object_id
WHERE    O.type='P'
and REPLACE(rtrim(ltrim(M.definition)), CHAR(13) + CHAR(10), '') like '%AS'
ORDER BY O.type,
         O.name;
```

これを使用すると、クエリが途中で切れちゃってるやつを検索出来る。
必要なファイルのみzcompileする

# zcompileとは
zshのソースをコンパイルすること。
コンパイルされたソースはコンパイル前のファイル名に.zwcという拡張子が追加され、該当するファイルの代わりにロードされる。

# 「必要なファイルのみzcompile」とは
.zshrcロード時などに、もとのソースコードに変更が加えられたものだけがコンパイルされれば理想なのだが、その方法をググると.zwc（コンパイル後）ファイルとソースコード（コンパイル前）の更新日を比較するため、一度手動でコンパイルしzwcファイルを生成しておかなければ正常に稼働しないコードばかりが見つかった。

複数の環境で利用する.zshrcなどにコンパイルのコードを書いておくと新しい環境で利用する際のことを考えるとしっくり来ない。

# そこで

```zsh:.zshrc
() {
  local src
  for src in $@; do
    ([[ ! -e $src.zwc ]] || [ ${src:A} -nt $src ]) && zcompile $src
  done
} ~/.zshrc ~/.zprofile ~/.zlogin ~/.zlogout
```

で良いと思う。
.zwcファイルが無いならコンパイルする必要があるってだけだと思う。
2018年のトレンドになるかもしれないJAM Stackの日本語情報がなかったので和訳してみる

# TL;DR
### Why JAM Stack?
フロントエンドを業務で触らないエンジニアだけどYoutubeでJAM Stackに関するトークの動画を見て、
マイクロサービスアーキテクチャとかサーバレスアーキテクチャとかSSRとかSPAといったスキームを統合して呼称できる概念で、
かつ今後マイクロサービスとかウェブアプリケーションの構成として当たり前になって行くなと言う印象を受けたので、
イケてる実例とかを探して見たものの日本語のドキュメントや話題が皆無だったので、
自分で邦訳して界隈のトレンドリーダーに一瞬でもなってやろうと思いました。まる。

この記事では https://jamstack.org の内容を邦訳していきます。

# JAM Stack
## JAMStack : 名詞
### クライアントサイドJavaScript, 再利用可能なAPI、マークアップの３つを組み合わせた モダンなウェブ開発のスタック

私たちが"このスタック"と言う時に私たちはオペレーティングシステムやある特定のWebサービスやサーバーサイドの開発言語やデータベースに関する話をもはや行なっていません


## JAM Stackとは何か
つぎの三つの主要な要件を満たしていれば、あなたのプロジェクトはすでにJAM Stackを採用していると言えるでしょう

### JavaScript
クライアントサイドのみで処理され動的にリクエストとレスポンスのサイクルを管理していること。
これはどんなJavaScriptのライブラリでもフロントエンドフームワークでも、バニラなJSの実装であっても構いません

### APIs
全てのサーバーサイドのプロセスまたはデータベース操作は再利用可能なAPIによって抽象化され、JavaScriptによってHTTP経由で操作されること。
APIは自作されたものであれ、外部の第三者によって提供されたサービスのものであれ構いません

### Markup
マークアップは、テンプレート化され、デプロイ時に静的サイトの生成ツールやアプリケーションのビルドツールによって事前にビルドされていなければいけません

## JAM Stackを用いていないウェブサイトはどのようなものか？
いかなるプロジェクトであれ、サーバーサイドとクライアントサイドが密結合な場合にはJAM Stackにのっとって実装されているとは言えません。
具体的には以下のような場合です
### ・WordPressのようなサーバーサイドCMSで構成されたサイトはJAM Stackではありません
### ・RubyやNodeといった言語で実装されたモノリシックなサーバーサイドアプリケーションに依存するような場合にはそれはJAM Stackではありません
### ・実行時にサーバーサイドとクライアントサイドでアイソモーフィックなレンダリングを行うSPAはJAM Stackではありません

##なぜ JAM Stackなのか？

### より良いパフォーマンス
なぜデプロイ時にビルドしておけるものを都度ビルドされるまで待つのでしょうか？
最初の1バイトにかかる時間を最小化するのに、事前にビルドされCDNでホスティングされるファイルより優れたものはありません

### より強いセキュリティ
サーバーサイドの処理がマイクロサービスのAPIへ抽象化されていることで、
攻撃への対策を減らすことができ、高度なサードパーティサービスを活用したドメインの専門化を行うことができます。

### 安価で、スケーラブルであること
どこにでも配信できるような規模のファイルしか持たない時に、問題となるのはいかに多くの場所で配信を行うかと言うことです。
CDNはその際に最適なサービスで、そして大抵の場合はホスティングをスケールすることができます。

### より良い開発体験
サーバー・クライアント間の依存を減らし、処理を分割して行くことで、より開発とデバッグに集中することができます。
また、CMSやサイトジェネレータの選択肢が拡大することで、コンテンツとマーケティングの二つのスタックをメンテナンスする必要性をなくすことができます。


## EOC End of Contents
以上、拙訳で申し訳ないですが、 https://jamstack.org のindexページに記載された概要をGoogle翻訳や辞書を使わずに翻訳してみました。
フロントエンドのエンジニアではない上にモダンの最先端トレンドを追っかける仕事でもないので、用語の理解や翻訳に誤りがあるとは思いますが、気兼ねなくコメントマサカリをぶん投げていただければ修正していきます。

## End Note...
JAM Stackとはつまるところ、複数のマイクロサービスAPIを使用するSPAをCDNでホスティングする。
と言うスタックのことです。サーバレスとプレビルドのSPAの組み合わせによってサーバレスSPAというスタックが生まれ、
界隈で話題になりだしていますが、つまりそれです。
フロントSPA化と、バックエンドのAPI化&マイクロサービス化によってスケーラビリティはメインテナンスのしやすさを確保したまま、アプリケーションを多機能化して行くためのデザインパターンなのです。

そんなんしってるよ！/やってるよ！と言う人は多いかもしれませんが、
命名することによって事象を構造化し認知可能なものにすると言うのは構造主義的には正しい認知手段です。
これによってSSPAやSSR SPA+MicroService系のスタックがJAM Stackという名前と定義を獲得し、
より広がって行くことを楽しみに2018年を過ごしてみようと思います。


## 参考

[The JAM Stack: The New Front-End Stack For Web Development](https://www.youtube.com/watch?v=_3zYAMkaMf8)
[JAM Stack | JavaScript, APIs, and Markup](https://jamstack.org)
PlantUMLで出力するUML図をスタイリッシュでモノクロなデザインにする

## はじめに

PlantUMLはテキストベースでUMLを作成できる非常に便利なツールです。
しかし、デフォルトのデザインが若干ダサいです。(デザインを決めた方すみません。。)

そこで、今回は簡単なコードでUML図をスタイリッシュなモノクロデザインに変更する方法を紹介します。

## 実装

[こちらの記事](https://qiita.com/uhooi/items/7f102e0f546b477f0ad8#実装)で紹介したクラス図のスキンをモノクロに変更してみます。

`!include` で他のPlantUMLファイルを読み込むことができます。
スキンを別ファイルに分けることで、簡単に他のクラス図にも同じスキンを適用することができるのでおすすめです。

```diff:car.pu
@startuml

' ----------------------------------------
' スキン設定
' ----------------------------------------

- ' 可視性のアイコンを非表示にする
- skinparam classAttributeIconSize 0
+ !include ./skinparam.pu

' ----------------------------------------
' クラス定義
' ----------------------------------------

class 車 {
  +車種
  +ナンバープレート
  +走る()
  +止まる()
  +曲がる()
}
note left: 車

class タイヤ {
}

class ドライバー {
  +アクセルを踏む()
  +ブレーキを踏む()
  +ハンドルを切る()
}

class 運転免許証 {
}

' ----------------------------------------
' 関連
' ----------------------------------------

車 "1" *-- "4" タイヤ
車 -- ドライバー
ドライバー "1" o-- "1" 運転免許証

@enduml

```

スキン設定は全て `skinparam.pu` に記述することにします。

```pu:skinparam.pu
@startuml

' ----------------------------------------
' スキン設定
' ----------------------------------------

' 可視性のアイコンを非表示にする
skinparam classAttributeIconSize 0

' モノクロにする
skinparam monochrome true

' 影をなくす
skinparam shadowing false

' 手描き風にする
skinparam handwritten true


@enduml

```

## 出力結果

### Before

![car.png](https://qiita-image-store.s3.amazonaws.com/0/138245/ac792f38-8111-39e6-df7d-5ba52119293c.png)

### After

![car_mono.png](https://qiita-image-store.s3.amazonaws.com/0/138245/c4e981e1-421d-75e9-d8dc-f77da2bf1680.png)

どうでしょうか？
__タイトルが盛大な釣り__ だと感じられた方、すみません。

言い訳すると、色付きの図を見たあとに色なしの図を見ているので質素な雰囲気に感じるだけです。
実際に設計図の一部として組み込むとスタイリッシュに見えますのでご安心ください。
モノクロは __どんな色と組み合わせても調和が取れる万能な色__ です。

## おわりに

手描き風にしているのは私の個人的な趣味です。
職場によってはふざけていると思われるので、適宜変えてください。

この記事を読まれている方には、このような遊び心が通じるような会社、そして上司との関係性であってほしいですね！
ちなみに私は手描き風のUML図を作成して設計書に載せたら、後輩に「 __何か線が曲がっていて変ですね__ 」と言われました。
Ubuntu16.04のUSキーボード設定


1. Fcitxをインストール
`sudo aptitude install fcitx`

1. fcitxを起動して、入力メソッドのウィンドウの「入力メソッド」タブを選択。左下の十字ボタンで追加を行って

    Mozc
    キーボード-英語(US)
の２つを出現させる。
1. mozcを選択し、左下のキーボードレイアウト(工具がクロスしてるマークやつ)を選択。キーボードレイアウトとして「英語（US）」を選択(これによりmozcのキーレイアウトがUSになる)
1. 完成
Fortigateの初期設定

代理店からユーザー登録完了連絡が来ないので、いじりはじめてしまうことにする。
まずは利用予定の無いWAN2ポートをマネージメントポートに仕立てる。
ついでにホスト名を変更。シリアル番号が含まれちゃうからコピペが面倒くさいｗ

```
XXX # config system global

XXX (global) # set hostname FGT60E

XXX (global) # end

FGT60E #

FGT60E # config system interface

FGT60E (interface) # edit wan2

FGT60E (wan2) # set mode static

FGT60E (wan2) # set ip 192.168.0.100 255.255.255.0

FGT60E (wan2) # set allowaccess https http ssh ping

FGT60E (wan2) # end

FGT60E #
```

これでWebブラウザからもログインできるようになります。
なお、操作のすべてをHTTPSで行う場合でもHTTPも有効にしておきましょう。HTTPで接続しても、デフォルトでHTTPSにリダイレクトされるのでリスクは低いです。
HTTPSを付けないでアクセスしようとして、うーん繋がらないなあと悩んでしまいましたｗ

触りだして思ったのが、管理者接続のタイムアウトが短すぎる点。これも変更してしまいます。
まだ構築中なので利便性最優先。
上記のリダイレクトもここで指定します。（デフォルトで有効になっています）

後、趣味の範囲ですが管理接続用のHTTPSのポート番号も変えておきます。
上で設定した自動リダイレクト先がちゃんと変えたポート番号になっているところが地味に偉いです。

```
FGT60E # config system global

FGT60E (global) # set admintimeout 60

FGT60E (global) # set admin-https-redirect enable

FGT60E (global) # set admin-sport 10443

FGT60E (global) # end

FGT60E # 
```

ここからインターフェイスの設定をしていこうと思ったのですが、先人達がぶつかっていたVLAN周りの問題にぶちあたりました。
いやいや、そんな馬鹿な設定できるでしょと思ってましたが本当にダメみたい。
スイッチ買ってきます･･･
常微分方程式　まとめ

マセマで勉強したことを主にまとめる

## 線形
yやuの従属変数と、その導関数y',y'',...u<sub>x</sub>,u<sub>yy</sub>などが全て一次式である微分方程式を線形という。
### 従属変数
独立変数の値によって値が変化する変数。y=f<sub>(x)</sub>でいうyが従属変数で、xが独立変数。
### 独立変数
従属変数を予測するために使われる変数のこと。説明変数ともいう

## 非線形
線形でないもの

## 一般解と特殊解
一階の正規形状微分方程式dy/dx = f<sub>(x)</sub>の一般解がy=F<sub>(x)</sub>＋Cであるのを見ればわかるように、1階の常微分方程式には一つの任意定数(Cのこと)が存在する。
一般にn階の常微分方程式について、n個の任意定数をもつ解を一般解と呼ぶ。
それに対して、初期条件や、境界条件などの様々な条件をつけて、任意定数をある値に定めて求まる解を特殊解、特解と呼ぶ。
・初期条件はx=x<sub>1</sub>における、y<sub>(x<sub>1</sub>)</sub>=y<sub>1</sub>などの条件(一点における条件)
・境界条件はx=x<sub>1</sub>とx<sub>2</sub>における、y<sub>(x<sub>1</sub>)</sub>=y<sub>1</sub>,y<sub>(x<sub>2</sub>)</sub>=y<sub>2</sub>などの条件(二つの端点における条件)
プログラマ歴1年のボクガカンガエタサイキョウのFizzBuzz(@Java)

#動機
ちょっとプライベートで色々あってむしゃくしゃしたので、そういえばちゃんとやったことのなかったFizzBuzzとかいう奴をやってみようという気になった。そもそもアカウント登録だけして何もしていなかったので、とりあえず何か書いてみることから始めようと思いました。よかったらFeed Backお願いします。

#目標
できるだけimmutable, 汎用性高い奴。

#FizzBuzzの要件
あんまりよく知らないのだが、

1. ３で割り切れる時はFizz
2. 5で割りきれる時はBuzz
3. どちらでも割りきれる時はFizz Buzz(FizzBuzzの時もある？）
4. 割り切れない時は元の数字

と言った感じだったので、

1. nで割りきれる時任意の文字列
2. 複数で割りきれる時はその結合（" "で繋げる）
3. 割り切れない時は元の数字
4. callする数字の最初と最後を指定(inclusive)

としてみた
以下ソース

```java:FizzBuzzCaller.java
package FizzBuzz;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class FizzBuzzCaller {
	final private Map<Integer, String> callMap;
	
	FizzBuzzCaller(Map<Integer, String> callMap){
		this.callMap = Collections.unmodifiableMap(new HashMap<>(callMap));
	}
	
	public Map<Integer, String> getCallMap(){
		return callMap;
	}
	
	public List<String> getCallsListOnClosedRange(int start, int end){
		return IntStream.rangeClosed(start, end)
			.mapToObj(n ->
				callMap.entrySet().stream()
				.filter(e -> n % e.getKey() == 0)
				.map(e -> e.getValue())
				.reduce((x, y) -> x +" "+ y)
				.orElse(String.valueOf(n))
			)
			.collect(Collectors.toList());
	}
}

```
#テスト
マイナスを念のため含めた。

```java:CallTest.java
package FizzBuzz;

import java.util.HashMap;
import java.util.Map;

public class CallTest {
	public static void main(String[] arg){
		Map<Integer, String> callMap = new HashMap<>();
		callMap.put(3, "Fizz");
		callMap.put(5, "Buzz");
		callMap.put(-7, "Huss");
		callMap.put(13, "Boss");
		FizzBuzzCaller oneCaller = new FizzBuzzCaller(callMap);
		System.out.println(oneCaller.getCallMap());
		callMap.put(3, "DUZZ");// this does not work
		oneCaller.getCallsListOnClosedRange(-20,100).stream().forEach(System.out::println);
	}
}

```

結果的はこんな感じ

```console:console
{3=Fizz, 5=Buzz, -7=Huss, 13=Boss}
Buzz
-19
Fizz
-17
-16
Fizz Buzz
Huss
Boss
Fizz
-11
Buzz
Fizz
-8
Huss
Fizz
Buzz
-4
Fizz
-2
-1
Fizz Buzz Huss Boss
1
2
Fizz
4
Buzz
Fizz
Huss
8
Fizz
Buzz
11
Fizz
Boss
Huss
Fizz Buzz
16
17
Fizz
19
Buzz
Fizz Huss
22
23
Fizz
Buzz
Boss
Fizz
Huss
29
Fizz Buzz
31
32
Fizz
34
Buzz Huss
Fizz
37
38
Fizz Boss
Buzz
41
Fizz Huss
43
44
Fizz Buzz
46
47
Fizz
Huss
Buzz
Fizz
Boss
53
Fizz
Buzz
Huss
Fizz
58
59
Fizz Buzz
61
62
Fizz Huss
64
Buzz Boss
Fizz
67
68
Fizz
Buzz Huss
71
Fizz
73
74
Fizz Buzz
76
Huss
Fizz Boss
79
Buzz
Fizz
82
83
Fizz Huss
Buzz
86
Fizz
88
89
Fizz Buzz
Huss Boss
92
Fizz
94
Buzz
Fizz
97
Huss
Fizz
Buzz
```
#反省
+ mapうざい？
+ なんかこのコンストラクタの使い方が釈然としない。
+ 遅延評価したい。
+ 他の言語で書いたらどうなるかそのうちやりたい。

#参考にしたページ
+ FizzBuzzについて
https://en.wikipedia.org/wiki/Fizz_buzz
KubernetesにDashboardをインストールして、認証なしでアクセスする

社内の開発環境用のKubernetes Dashboardであれば、認証なし(tokenの入力なし)でアクセスしたいですよね。
そのための手順です。


# 1. Dashboardをインストール

```
$ wget https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/alternative/kubernetes-dashboard.yaml

# Serviceをtype: NodePortに変更
$ vim kubernetes-dashboard.yaml
・・・
    namespace: kube-system
  spec:
+   type: NodePort #これを追加
    ports:
    - port: 80


$ kubectl apply -f  kubernetes-dashboard.yaml
```

# 2. Dashboard Service Accountに管理権限を与える

```
$ cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard
  labels:
    k8s-app: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: kubernetes-dashboard
  namespace: kube-system
EOF
```

# 3. Dashboardにアクセス

MasterNodeのIPとkubernetes-dashboard ServiceのPortをもとにアクセスする。httpsじゃなくhttpでアクセスすること。
認証なし(tokenの入力なし)でダッシュボードがみれる。

![スクリーンショット 2018-04-13 22.25.03.png](https://qiita-image-store.s3.amazonaws.com/0/14124/eb9a761c-e653-5535-7abf-541b6fe6056e.png)

# 認証ありのインストール手順例

1, https://github.com/kubernetes/dashboard/wiki/Installation の"Recommended setup"を実行
2, https://github.com/kubernetes/dashboard/wiki/Accessing-Dashboard---1.7.X-and-above#nodeport のNodePortのセクションを実行
3, https://github.com/kubernetes/dashboard/wiki/Access-control#bearer-token を参考に、service accountのtokenを取得
4, ダッシュボードを開きtokenを入力

---

参考: https://stackoverflow.com/questions/46664104/how-to-sign-in-kubernetes-dashboard
噴水のようなパーティクルを作る

ねってぃです！particleを花火としてしか使わないのは勿体ない。他の使い道もあるのでは？と思って、噴水作ってみました。

#準備
Hierarchyビューを参照
　Create >　Effects > Particle System とクリック
![スクリーンショット 2018-04-13 21.19.14.png](https://qiita-image-store.s3.amazonaws.com/0/160446/d4f49995-7c14-e1df-ea25-8ee6ddedb616.png)
 
噴水を作るので、分かりやすいようにParticle System の名前を fountain に変更しておきます。
![スクリーンショット 2018-04-13 21.22.22.png](https://qiita-image-store.s3.amazonaws.com/0/160446/999b62a7-d32a-82e0-921a-e4d6bfdecae1.png)

#inspector の設定
inspectorのParticle Systemにあるfountainを調整していきます。
![スクリーンショット 2018-04-13 21.26.02.png](https://qiita-image-store.s3.amazonaws.com/0/160446/d2c34faa-d554-0e08-268a-2cfb165e2997.png)

#水を出す
つまりは、今出ている白い光を水らしくしようという事です。
まず、色を青に変えましょう。
Start Colorの白い箱をクリック > 青を選択
![スクリーンショット 2018-04-13 21.33.29.png](https://qiita-image-store.s3.amazonaws.com/0/160446/5a42cd06-87a8-f70b-466d-1d6a59bfc111.png)
次に、まん丸な光を雨粒らしく整形します。
3D Start Size をチェック > x=1, y=2, z=1 と入力
![スクリーンショット 2018-04-13 21.37.49.png](https://qiita-image-store.s3.amazonaws.com/0/160446/3a759e54-fdaf-2b80-5456-5f8988b41c86.png)
x,y,zの値は x:y:z = 1:2:1  くらいであればいいと思います。
x=0.5, y=1, z=0.5 でもOKという事です。
Gameビューはこんな感じ。
![スクリーンショット 2018-04-13 21.42.28.png](https://qiita-image-store.s3.amazonaws.com/0/160446/9b2e2268-589a-f538-97ec-fd50644229c4.png)
まだ噴水っぽくはないですね。

#水圧・重力を強める
まず水圧。吹き出してる感を強めましょう。
Start Speed を5→25に変更
そして重力を追加。噴水なら、ある程度の高さまでいった水は落ちて来ますよね。
Gravity Modifer を0→2に変更
![スクリーンショット 2018-04-13 21.56.33.png](https://qiita-image-store.s3.amazonaws.com/0/160446/acfcd936-c576-235b-9c63-b3e4320f5c60.png)

うーん。まだ噴水じゃないですね。

#形を整える
粒子が消えるまでの時間を調整します。
Start Lifetime を5→2に変更
![スクリーンショット 2018-04-13 22.10.18.png](https://qiita-image-store.s3.amazonaws.com/0/160446/2f022e20-64f9-46bd-380f-f2e5d453ed6b.png)
吹き出し方を調整。
Shape > Shape を Cone にする
Angle を10に変更
Radius を0.01に変更
![スクリーンショット 2018-04-13 22.07.18.png](https://qiita-image-store.s3.amazonaws.com/0/160446/42683fc2-ad21-9b9b-b393-f9a39b1c5a0d.png)
すると

![1fountain.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/160446/cf9a65a8-8eb6-d330-9bd8-5e51305b70db.gif)
かなり噴水らしくなりました。

#仕上げ
水量アップで噴水に仕上げます
Emission > Rate over Time を100に変更
![スクリーンショット 2018-04-13 22.15.52.png](https://qiita-image-store.s3.amazonaws.com/0/160446/ba43ddcf-9a95-1d00-e42f-6fab15fe07f7.png)


![qiitafountain.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/160446/9e7a35b3-bb4b-415f-7a22-05a02fa75dd5.gif)
できた！




#まとめ
particle を噴水として使ってみた、いかがでしたか。参考になれば幸いです。では。
Vim8にPrettierを導入する


遅れながら話題のPrettierを導入してみました。
備忘録を兼ねて導入手順を記事にしてみようと思います。

## 当方のVim環境
Homebrewで`--with-python3`でインストールしています。

## 必要なもの
* Vim
* [Prettier](https://github.com/prettier/prettier)
* [prettier/vim-prettier](https://github.com/prettier/vim-prettier)

**Prettierを非同期で実行するにはVim8以上が必須です。**

## 導入手順
### 1. Prettierをインストール
> If using other vim plugin managers or doing manual setup make sure to have 
`prettier` installed globally or go to your vim-prettier directory and 
either do `npm install` or `yarn install` 


とヘルプに書いてあるので、お好みでどちらかの方法でインストールしてください。

https://prettier.io/docs/en/vim.html#vim-prettier-installation

#### グローバルインストール

```terminal
npm i -g prettier
```

#### vim-prettierディレクトリにインストール
例はdeinのtomlなので、各自の環境に置き換えてください。
buildオプションに`npm install`を設定します。
そうすると、プラグインのインストール時にPrettierをインストールしてくれます。

```toml
[[plugins]]
repo  = 'prettier/vim-prettier'
build = 'npm install'
```

### 2. vim-prettierをインストール
当方はプラグイン管理にdeinを使っています。
また、設定ファイルはtomlなので、各自の環境に置き換えてください。

lazyする・しないはお好みで。
当方はVimの起動を少しでも早くしたいので、dein_lazy.tomlに書いています。

`on_ft`で特定のファイルタイプの時に起動するようにします。
ファイルタイプはお好みで設定してください。(Prettierがサポートしている範囲で）

この設定では、保存前にPrettierAsyncを実行します。
**Prettierを非同期で実行するにはVim8以上が必須です。**

```toml
[[plugins]]
repo     = 'prettier/vim-prettier'
build    = 'npm install'
on_ft    = ['javascript', 'typescript', 'vue', 'css', 'scss', 'json', 'markdown']
hook_source = '''
  " @formatアノテーションを持ったファイルの自動フォーマットを無効にする
  let g:prettier#autoformat = 0
  
  " Prettierのパースエラーをquickfixに表示しない
  let g:prettier#quickfix_enabled = 0
  
  autocmd BufWritePre *.js,*.ts,*.vue,*.css,*.scss,*.json,*.md PrettierAsync
'''
```

> By default it will auto format javascript, typescript, less, scss and css files that have "@format" annotation in the header of the file.

>To enable vim-prettier to run in files without requiring the "@format" doc tag. First disable the default autoformat, then update to your own custom behaviour

とあるので、無効にして保存前のタイミングで実行するようにしています。
パースエラーをquickfixに表示したくないので無効にしています。

他にもオプションがあるので、お好みの設定で試してみてください。
https://prettier.io/docs/en/vim.html#vim-prettier-configuration


以上になります。

## おわりに
linterとPrettierを併用する場合は、設定をうまくやってやる必要がありますが、
自動で良しなにやってくれるのですごく便利です😊

間違っていたりおかしい箇所があれば、コメントいただければ幸いです🙌
Mac OS Homebrew の PHP 関連の formulae 変更されて大変だった (2018年4月)



自分の Mac では Valet を使っています。 concrete5 の開発に日々役立っています。

PHP7.2 で使っていました。

ただ、全てのアプリで対応していないものがあり、今回は Mautic をローカルで動かしたいと思って、PHP 7.1 にダウングレードを試みました。

すご～くハマってしまったので書き残します。

原因は、Homebrew が homebrew/php を deprecate し、古い時代の ini 設定ファイルがローカルの Mac にゴミとして残り続けていたことでエラーを吐き出していました。

今 PHP は 新しく php@7.1 などと @ の後にバージョンが着くようになり、最新バージョンは「php」だけになりました。

## 再現手順

デフォルトの php7.2 をアンインストールし、php7.1 を入れます。

```
$ brew remove php
$ brew install php@7.1
$ echo 'export PATH="/usr/local/opt/php@7.1/bin:$PATH"' >> ~/.bash_profile
$ echo 'export PATH="/usr/local/opt/php@7.1/sbin:$PATH"' >> ~/.bash_profile
$ brew services start php@7.1
```

ちゃんとインストールされたかな・・・と確認してみると。


```
$ php -v
```

Warning の嵐。

```
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/opt/php71-intl/intl.so' - dlopen(/usr/local/opt/php71-intl/intl.so, 9): image not found in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library '/usr/local/opt/php71-intl/intl.so' - dlopen(/usr/local/opt/php71-intl/intl.so, 9): image not found in Unknown on line 0

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/opt/php71-mcrypt/mcrypt.so' - dlopen(/usr/local/opt/php71-mcrypt/mcrypt.so, 9): image not found in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library '/usr/local/opt/php71-mcrypt/mcrypt.so' - dlopen(/usr/local/opt/php71-mcrypt/mcrypt.so, 9): image not found in Unknown on line 0
```

削除されていない古い ini ファイルはこちら

```
$ ls /usr/local/etc/php/7.1/conf.d
ext-igbinary.ini ext-intl.ini ext-mcrypt.ini   ext-opcache.ini  ext-redis.ini
```

これらを削除してしまったら良いです。

```
$ rm /usr/local/etc/php/7.1/conf.d/*
```

ついでに、非推奨の homebrew/php も消します。

```
$ brew untap homebrew/php
```

## 感謝！「homebrewでphp71-*系がインストールできなくなってた」

3日間ぐらい悩まされて、その間、MAMP に逃げてたんですが、
下記の記事に助けられました！

**homebrewでphp71-*系がインストールできなくなってた**
http://rskull.hateblo.jp/entry/2018/04/06/164236

ありがとうございます！


## Valet 再インストールの手順

参考 Laravel/Valet 2.0 のアップグレードでハマったのでメモ
https://qiita.com/katzueno/items/4e7a65bcab18aa2b2f23


# クレジット

この記事が役に立ったら、「 **CMS は concrete5 が一番**」と頭の中で10回唱えてみてください〜。
電気系プログラミングガチ素人学生がC#のクラスを勉強する話　三日目~ローカル関数とスコープ~

# まえがき
このレポートはSkype勉強会での活動を「書面としてアウトプットする」こと、「電気系の学生の成果物を作るための意識高い系のレポート」です。完全初心者なので、勉強会参加者の先輩たちから様々なツッコミを頂きながら書いております。それゆえに先輩たちの目から外れた誤字脱字等ございますが、ぜひともツッコミいただいて、私の勉強にさせていただければと思います。

#ローカル関数について
C#7.0以降では、メイン関数の中でローカルに関数を設定できます。個人的な解釈では、メイン関数の中に「メソッドが入ったような感覚」になりました。

```C#
using System;

namespace rocal
{
    class Program
    {
        static void Main(string[] args)
        {
            double Discount(int price, double rate)//コレがローカル関数
            {
                return price * (1 - rate);
            }//ただ、こういうのってあんまり多用すると、こんがらがりそうではある・・・
            
            Console.WriteLine(Discount(1000,0.2));
        }
    }
}
```

# 忘れがちなスコープについて
変数のスコープは、コードの中での変数の有効範囲のことです。
## フィールドのスコープ
クラス全体からアクセス可能です。CLASSブロックの直下で宣言します。
##ローカル変数のスコープ
メソッド内でのみ、アクセス可能。
##ブロックスコープ
ブロック内でのみ、アクセス可能

```C#
using System;
using System.IO;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace class_scope
{
    
    class ScopeBasic
    {
        public string data = "フィールド";//コレがフィールドスコープ（クラス内で有効）

        public string show(){
            string data ="ローカル";//こっちがローカルスコープ（関数内で有効）
            return data;
        }
        static void Main(string[] args)
        {
         var s = new  ScopeBasic();
         Console.WriteLine(s.show());//Show内のみの実行
         Console.WriteLine(s.data); 
        }
    }
}
```
実行結果は
ローカルと、フィールドになります。

コレをthisに変更してみます。

```C#
using System;
using System.IO;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace class_scope
{
    
    class ScopeBasic
    {
        public string data = "フィールド";

        public string show(){
            string data ="ローカル";
            return this.data;//thisで、フィールドのdataにアクセスし、値を返す。
        }
        static void Main(string[] args)
        {
         var s = new  ScopeBasic();
         Console.WriteLine(s.show());
         Console.WriteLine(s.data); 
        }
    }
}

```

出力結果はこの場合は、どちらもフィールドになります。フィールドのアクセスにはThisを使うのがおすすめなようです。

# ブロックスコープ
ローカルスコープよりも更に小さなスコープの単位が、ブロックスコープです。if,while/for、tryなど制御ブロックで宣言された変数は、そのブロックの中でしかアクセスできません。

#あとがき
ついに既存のコードもクラス化しまくってます。なんて言っても高速に動作したり、エラーを解析するのに便利なところは病みつきに成るんじゃないかなと思います。C#erの道はまだ遠いですが・・・応援よろしくおねがいします！
マルチプロセス（マルチスレッド）でのFizzBuzzって？

マルチプロセス（マルチスレッド）のプログラムってとても難しいですね。
特にJavaScript（TypeScript）の場合はことさら難しいと思いました。

そこで、練習のためにマルチプロセスでのFizzBuzzを以下の仕様を満たすように作ってみました。

* FizzBuzz値を算出する複数のワーカープロセス（ワーカースレッド）を使う
* ワーカープロセス（ワーカースレッド）からメインプロセス（メインスレッド）に算出した結果を送信する
* メインプロセス（メインスレッド）では（逐次出力ではなく）結果がすべて揃った後に、結果をまとめて出力する
* 出力する形式（文字列）の細かいところは問わないこととする

以下は、Node.jsのclusterを使ったマルチプロセス版（TypeScript）です。
RxJSだったらどうなるのか少し気になりますね。
もっと簡単にできるのでしょうか？

```fizzbuzz.ts
import * as cluster from "cluster";
import * as events from "events";
events.EventEmitter.defaultMaxListeners = 30;

function* range(begin: number, end: number) {
    for (let i = begin; i <= end; i++) {
        yield i;
    }
}

function fizzbuzz(i: number) {
    return i % 15 === 0 ? "FizzBuzz"
        : i % 5 === 0 ? "Buzz"
            : i % 3 === 0 ? "Fizz"
                : i.toString();
}

async function main() {
    if (cluster.isMaster) {
        const promises = Array.from(range(1, 30)).map((i) => {
            return new Promise<[number, string]>((resolve) => {
                cluster.on("message", (worker, [index, result]: [number, string]) => {
                    if (i === index) {
                        resolve([i, result]);
                    }
                });
            });
        });
        for (const i of range(1, 30)) {
            const worker = cluster.fork();
            worker.on("online", () => {
                worker.send(i);
            });
        }
        const map = new Map(await Promise.all(promises));
        console.log(map);

        Object.values(cluster.workers).forEach((w) => w!.kill());
    } else {
        process.on("message", (i) => {
            process.send!([i, fizzbuzz(i)]);
        });
    }
}

if (require.main === module) {
    main();
}

```

ポイントはPromiseを作ってからfork/sendして、そのあとawaitで待つことです。
結果は以下のようになります。

```
> Executing task: npm-run ts-node src/fizzbuzz.ts <

Map {
  1 => '1',
  2 => '2',
  3 => 'Fizz',
  4 => '4',
  5 => 'Buzz',
  6 => 'Fizz',
  7 => '7',
  8 => '8',
  9 => 'Fizz',
  10 => 'Buzz',
  11 => '11',
  12 => 'Fizz',
  13 => '13',
  14 => '14',
  15 => 'FizzBuzz',
  16 => '16',
  17 => '17',
  18 => 'Fizz',
  19 => '19',
  20 => 'Buzz',
  21 => 'Fizz',
  22 => '22',
  23 => '23',
  24 => 'Fizz',
  25 => 'Buzz',
  26 => '26',
  27 => 'Fizz',
  28 => '28',
  29 => '29',
  30 => 'FizzBuzz' }
```
[DL学習メモ] Entity Embedding - Word embedding と似たようなことをカテゴリ変数でも

「TalkingData AdTracking Fraud Detection Challenge」コンペのディスカッションで、なんでNNでEntity Embedding使っているの？という質問がありました。
そこでおすすめされていた[論文](https://arxiv.org/abs/1604.06737)を読んだのでメモします。

タイトルは、「Entity Embeddings of Categorical Variables」


# 導入
* unstructuredなデータを扱う問題に対して、NNはよい結果を残してきましたが、structuredなデータを扱う問題に対しては、decision treeベースのアルゴリズムが優勢のようです
* これは、NNは、非連続な関数を扱うのに向いていないためと思われます(back propできないから？)
* categoricalな変数に対しては、OHE(One Hot Encoding)がよく使われていますが、欠点としてはリソースを大量に使うことと、値間の関連性を表現できないことです。(直交表現だから？)
* そこで、NLPで使われているword embedding(Word2Vecとかの)をcategoricalな変数に適用してみます
    * word embeddingの特徴は、似通った語句は似たような値になるのに加えて、演算できること: King - Queen ≂ Man - Woman
* これによって、値の近さが表現できるようになることを期待 -> 連続関数になってNNにうれしい？

# 比較対象
* GBT:  Gradient Boosted Trees
    * structured data系Kaggleコンペで強いやつ
    * 領域を分けながら、greedyにカテゴリ分けを進めていく
    * 領域の大きさをどのくらいにするかを決めるのがコツ
* structured dataについて
    * norminal vs cardinal
    * norminalは名目の値 ← red,gree,blueに1,2,3と振るとか数値間の計算に意味がないもの
    * cardinal or ordinal は比較とか計算できる値 ← 年齢とか  
 
# Entity Embedding(EE)
* 離散値を複数次元空間に展開する処理です
* 重み行列とOHEの積で計算
* それぞれの変数に対してEEを求め、そのままfull connectedのレイヤにつなげていく(concatと呼んでいるのがこれ?)

# 実験(Kaggleでの例)
* 店情報、日付からの売り上げを予測する問題にEEを適用してみました
* Tips: 日付に祝日とか学校休日とか、スポーツイベント日かとか、Google Trendと連携させたりする人もいましたが、ここでは、EEなしと比較するためにシンプルな状態(もとのデータのみ)で取り組みます
* 売上は桁４つ違うので、 log(Sale)/ log(Salemax)　でスケーリングしました
* 結果的にNNに適用したものが最も良好だったが、どの手法にEEを適用しても大きな効果が見られました

# 分析
* t-SNEで平面に店をマップしたら、なんと地理的な位置関係とそっくりだった！
* これは既知のクラスタリングアルゴリズムが適用できることを示唆しているのでは？

---
カテゴリかるなデータは、One Hot一択だと思ってました。
シンプルで、リソースも少なくて済み、性能もよくなるとはいいことずくめ!
なぜfor文は禁止なのか？Octave版

元記事：[なぜfor文は禁止なのか？関数型記述のススメ](https://qiita.com/ukiuni@github/items/abad07524856c65a20ea#comment-f2d7f3bb190f9395bf38)
から色々あって
親記事：[何故for文は許されるのか？反省会会場]
(https://qiita.com/miyabisun/items/4cc9114c1a998cd9bfd7)

親記事とその元となっている記事を遡って読んで、「なるほどjavascriptだとそうなるんですね」と目から鱗が落ちたのでOctaveで試してみます。

CourseraのMachine Learningの中でアンドリュー教授は何度も、for文は遅いし機械学習のコードを書くには向かないと言ってました。そこで、使い慣れたOctaveを使って今回のお題である「ゼロから99までの数字から偶数だけを累計」する処理を、for文の場合と行列演算の場合で比較してみます。

まずはfor文を使うパターン。チックタックで、その間の時間を測れるのが素敵です。

```
tic;
a = [0:99];
total = 0;
for i = 1:100
    if rem(a(i), 2) == 0,
        total = total + a(i);
    end
end
toc;

fprintf('ans=%d\n', total);

> Elapsed time is 1.54901e-03 seconds.
> ans=2450
```

続いてfor文を使わないパターン。

```
tic;
a = [0:99];
ans=sum(a(rem(a, 2) == 0));
toc;

fprintf('ans=%d\n', ans);

> Elapsed time is 4.22001e-05 seconds.
> ans=2450
```

行列演算なら2行で答えに辿り着けますしfor文より桁違いに高速です。それにソースも行列演算の方がエレガントな気がします^^;　とういうことで、Octaveを使って機械学習のコードを書くのなら極力for文は回避した方が良さそうです。

使用する言語によって得意不得意がはっきりと出てきそうで面白いですね。
Container Component のテストを良い感じに書く

[reduxのドキュメント](https://redux.js.org/recipes/writing-tests#connected-components)によると `connected` コンポーネントは `connect` 対象のコンポーネントを `export` してテストしましょう。と書いてあります。
が、どっちかというと `mapStateToProps` や `mapDispatchToProps` がどんな挙動になるかテストしたかったので、こちらの[良さげな例](https://medium.com/@visualskyrim/test-your-redux-container-with-enzyme-a0e10c0574ec)を自分なりに少しアレンジしてみました。

```jsx

import { shallow } from 'enzyme'
import { expect } from 'chai'
import React from 'react'
import configureStore from 'redux-mock-store'
import { connect } from 'react-redux'

// actionCreator
const changeName = value => ({ type: 'CHANGE_NAME', payload: value })

// statelessComponent
const Hello = props => {
  return (
    <div>
      Hello {props.name}!!
      <input onChange={props.onChange} value={props.name} />
    </div>
  )
}

// containerComponent
const mapStateToProps = state => {
  return {
    name: state.hello.name
  }
}

const mapDispatchToProps = dispatch => {
  return {
    onChange: e => {
      dispatch(changeName(e.target.value))
    }
  }
}

const Container = connect(mapStateToProps, mapDispatchToProps)(Hello)

// test
const shallowWithStore = (component, store) => {
  const context = {
    store
  }
  return shallow(component, { context })
}

describe('Container', () => {
  const state = {
    hello: {
      name: 'foo'
    }
  }

  const createMockStore = configureStore()

  const store = createMockStore(state)

  const wrapper = shallowWithStore(<Container />, store)

  it('name', () => {
    expect(wrapper.props().name).to.eql(state.hello.name)
  })

  it('onChange', () => {
    wrapper.props().onChange({ target: { value: 'bar' } })
    expect(store.getActions()).to.includes(changeName('bar'))
  })
})
```

結局のところ何をテストしたいかというと、 `state` が` connect` 対象のコンポーネントにどういう `props` として渡されているかということと、`props` として渡されたハンドラがどういうアクションを発行するかというところなので、 `shallowWrapper.props()` の中身をテストしてやればいいということになります。
特にハンドラは今回シンプルに `ActionCreator` を実行するだけのものですが、複雑な分岐がある場合でもただの副作用のない関数をテストするのと同じことなので簡単にテストが書けると思います。

# 参考
* https://medium.com/@visualskyrim/test-your-redux-container-with-enzyme-a0e10c0574ec
* https://redux.js.org/recipes/writing-tests#connected-components
PHPUnitで例外をテスト

## 概要
[前回の記事](https://qiita.com/juve_534/items/d3b4a4cb4601c3f5b2c6)で、PHPUnitのパラメタライズドテストについて記載しました。
今回はPHPUnitで例外のテストを行う方法を記載します。

## 対応
まずはテスト用に下記のプログラムを用意しました。
ただパラメータが1か判定するプログラムですね。

```php:Example.php
class Example
{ 
    public function checkNumberOwn(int $number):bool
    {
        if ($number !== 1) {
            throw new LogicException('Invalid Param : ' . $number);
        }
        return true;
    }
}
```
これをテストしていきます。

### [@expectedException](https://phpunit.de/manual/6.5/ja/appendixes.annotations.html#appendixes.annotations.expectedException)
テストするコードで例外がスローされたかどうかを判定するアノテーションです。
アノテーションに、判定したい例外クラスを指定してください。

```php
/**
 * @test
 * @expectedException LogicException
 */
public function checkNumberOwnTestExcept()
{
    $obj = new Example();
    $obj->checkNumberOwn(2);
}
```

### [@expectedExceptionMessage](https://phpunit.de/manual/6.5/ja/appendixes.annotations.html#appendixes.annotations.expectedExceptionMessage)
テストするコードでスローされた例外のメッセージを判定するアノテーションです。
アノテーションに、判定したいメッセージを指定してください。
メッセージは一部でも、判定することができます。

```php
/**
 * @test
 * @expectedException LogicException
 * @expectedExceptionMessage Invalid Param
 */
public function checkNumberOwnTestMessage()
{
    $obj = new Example();
    $obj->checkNumberOwn(2);
}
```

### [@expectedExceptionMessageRegExp](https://phpunit.de/manual/6.5/ja/appendixes.annotations.html#appendixes.annotations.expectedExceptionMessageRegExp)
テストするコードでスローされた例外のメッセージを、正規表現で判定するアノテーションです。
アノテーションに、判定したいメッセージを指定してください。

```php
/**
 * @test
 * @expectedException LogicException
 * @expectedExceptionMessageRegExp /Invalid Param : /
 */
public function checkNumberOwnTestMessage()
{
    $obj = new Example();
    $obj->checkNumberOwn(2);
}
```

これらを使うことで、テストが冗長的になることを防げるかなと思います。
参考までに、テストコードは[こちら](https://github.com/juve534/TIL/tree/develop/PHP/PHPUnit/code)に上げました。

## 気になること
複数の例外やエラーメッセージを1つのメソッドでやろうと思ったのですが、単純にアノテーションを複数セットするだけではだめでした…。
モデルで`PDOException`と`LogicException`を投げる、とかを1つのテストメソッドではできないのか…。

@tadsanさんにご教授頂き、`$this->expectException()`や`$this->expectExceptionMessage()`で複数の例外やエラーメッセージをチェック出来ることがわかりました。
ご教授ありがとうございました！

```php
public function checkExceptionDataProvider():array
{
    return [
        'number 1' => [1, \LogicException::class, 'number 1'],
        'number 2' => [2, \ErrorException::class, 'number 2'],
    ];
}

/**
 * @test
 * @dataProvider checkExceptionDataProvider
 */
public function checkExceptionTest($param, $errorClass, $errorMessage)
{
    $this->expectException($errorClass);
    $this->expectExceptionMessage($errorMessage);

    $obj = new Example();
    $obj->checkExecption($param);
}
```

## 参考資料

* [PHPUnit マニュアル – 付録B アノテーション](https://phpunit.de/manual/6.5/ja/appendixes.annotations.html)
* [PHPUnit マニュアル – 第2章 PHPUnit 用のテストの書き方](https://phpunit.de/manual/6.5/ja/writing-tests-for-phpunit.html)
MySQLのJOINにLIKEを使う方法

どうもmiyachi（[@_38ch](https://twitter.com/_38ch)）です。
MySQLのJOINにLIKEを使う方法をご紹介します。

例えば以下のような二つのテーブルがあったとします。

table1: user_info

| user_id      | name      | address      |
|:-----------------|:-----------------|:-----------------|
| 1             | 小田常雄            | 香川県 仲多度郡多度津町 東浜 1-14-12    |
| 2             | 松井昭司           | 鳥取県 米子市 淀江町小波 4-16-13    |
| 3             | 田中美涼           | 大阪府 守口市 大久保町 3-3-10    |
| 4             | 有賀沙也佳           | 宮城県 刈田郡七ヶ宿町 矢立 1-13    |
| 5             | 寺島勇次           | 大分県 中津市 片端町 4-5   |

table2: prefecture

| pref_id      | pref_name      | pref_population      |
|:-----------------|:-----------------|:-----------------|
| 1             | 北海道            |  5,348,102   |
| 2             | 青森           |  1,278,581   |
| ...           | ...           | ...    |
| 46             | 鹿児島           |   1,625,434  |
| 47            | 沖縄           |  1,447,134  |

で、 `user_info`のaddressを見て、`prefecture`のpref_nameでLIKE検索かけて、人口をJOINさせてあげたい。（ここでLEFT()でaddressから都道府県名取ればいいじゃんって話は受け付けません:no_good_tone1:）

SQLはこうやって書くらしい

```sql

SELECT 
  t1.user_id,
  t1.user_name,
  t1.address,
  t2.pref_population
FROM 
  user_info t1
LEFT JOIN
  prefecture t2
  ON t1.address LIKE CONCAT(t2.pref_name, '%')
```

まさかCONCATを使って、LIKE検索の `%keyword%` のやつを作るとは・・・
bitrise.ymlをリポジトリ内で管理するための手引き

Bitriseはモバイル開発向けのCIサービス => [bitrise.io](https://www.bitrise.io/)

|<img width="430" alt="build_for.png" src="https://qiita-image-store.s3.amazonaws.com/0/178904/8f3e5cb1-eb1f-f0d0-22fa-661542561b17.png">|
|:-:|

無料の範囲でiOSビルドを行うことができるので、個人プロジェクトにはありがたい。今回はReactNativeプロジェクトのリポジトリを設定して動かして見た。

## bitrise.ymlでワークフローを設定する

Bitriseにリポジトリを設定した初期段階では、bitrise.ymlはサービス側（bitrise.io）で管理されているが、それをプロジェクトのリポジトリ内で管理したい。そんなとき。

当然ながら公式には手引きがある => [Use bitrise.yml from repository](https://devcenter.bitrise.io/tips-and-tricks/use-bitrise-yml-from-repository/)

英語が分かる人なら何事もなく実現できるのだが、自分は公式の手引きが100%理解できていなかったために若干はまってしまった。上の手引きの概要をまとめつつ、はまったポイントを残しておきたい。

## トリガーマップはbitrise.ioで持つ、それ以降はリポジトリ内で持つ

公式の手引きによると、bitrise.ymlのトリガーマップはbitrise.ioで持った方が良いとのこと。その理由は、リポジトリ内でトリガーマップを持つと、クローンした後でないとトリガーのパターンを判定できなくなるから。

bitrise.ioでトリガーマップの設定をすれば、下図のワークフローが始まる前にトリガーのパターンに応じて処理をしないというフローも作れるのだが、全てをリポジトリ内で持つと必ずクローンしなければならなくなる。

|![bitrise_flow01.png](https://qiita-image-store.s3.amazonaws.com/0/178904/00965864-17cb-e654-91a6-78cb591e6ddc.png)|
|:-:|

なので公式ではbitrise.ymlを分けて持つことが推奨されている。

上図の`Git Clone Repository`までをbitrise.ioで設定し、それ以降のワークフローをリポジトリ内で設定する感じ。


## 作業手順

- bitrise.io上のbitrise.ymlをダウンロード
- リポジトリ直下にbitrise.ymlを置く
- リポジトリ内のbitrise.ymlの`steps`にある`activate-ssh-key`と`git-clone`の設定を削除する
- bitrise.ioのbitrise.ymlの内容を公式記載の設定で上書きする
- あとはpushすれば動きます（ということだ）

作業をした後のbitrise.io上のWorkFlowsは下のような感じになる。

|![bitrise_flow02.png](https://qiita-image-store.s3.amazonaws.com/0/178904/d71036ec-5fe3-e4bf-d405-9cd084bafaa6.png)|
|:-:|


## はまった点

上の手順をやって動かしてみたが、`continue from repo`でエラーになってしまった。エラー内容は『`ci`っていうworkflowは定義されていない』みたいな感じだった。

自分はこの時点でBitriseのドキュメントをあんまり読んでなかったので、ちゃんと勉強してから戻ってきたら、おそらくbitrise.ioのbitrise.ymlで設定している`bitrise run "${BITRISE_TRIGGERED_WORKFLOW_ID}"`で引っかかってるんだろうなと当たりがついた。

直前に`printenv`を入れて確認してみると、この変数に`ci`っていう値が入っていた。

この変数はbitrise.ioの`trigger_map`で設定している`workflow`の値が入るらしい。

公式の手引きにもちゃんと書いてあった（初見で理解できなかった自分にエールを）

> The trick is bitrise run "\${BITRISE_TRIGGERED_WORKFLOW_ID}". The BITRISE_TRIGGERED_WORKFLOW_ID environment variable is set to the "entry" workflow, the one which started the build. So, by running the ci workflow, the bitrise run "${BITRISE_TRIGGERED_WORKFLOW_ID}" command will be the same as bitrise run "ci".


故に解法としては、bitrise.ioの`trigger_map`の`workflow`に設定している値と、リポジトリ内の`workflows`に設定している値を対応させてあげればよい。


## 以上

![bitrise_logo.png](https://qiita-image-store.s3.amazonaws.com/0/178904/d9abd1e4-d4cf-d833-1f13-942a20b125d5.png)

- Bitriseのアイコン可愛い。癒される〜
- Bitriseのアイコン可愛い。癒される〜
- Bitriseのアイコン可愛い。癒される〜
【Swift】NSNullをnilのように扱う方法

#受け取ったJsonデータがNSNullであるかどうかで処理を変えたい時
valueを受け取ったJsonデータだとすると

```swift:
if value is NSNull{
   //NSNullの時
}else{
   //NSNullじゃない時
}
```
これだけです！
if (value.isKindOfClass(NSNull) == true) {}
としている記事しかなかったので投稿してみました。

間違いや質問等ありましたら教えてください。
sshと標準入出力

これは普通にできる。

```shell-session
$ echo 'hoge' | ssh pi@raspberrypi.local cat
hoge
```

リモートで複数コマンド実行したいときは？
これも普通にできる。

```shell-session
$ echo 'hoge' | ssh pi@raspberrypi.local 'cat; echo "fuga"'
hoge
fuga
```

リモートでなにかコマンドを実行したあと、別のコマンドで標準入力を受け取りたい。
これも普通にできる。

```shell-session
$ echo 'hoge' | ssh pi@raspberrypi.local 'echo "fuga"; cat'
fuga
hoge
```

sshでリモートで実行するコマンドにローカルから標準入力を渡すときは、ローカルでシェルスクリプトに標準入力を渡す場合と同じ挙動と考えてよさそう。
dockerで動いているdjangoをIntelliJでデバッグする

dockerもdjangoも素人ですごく苦労したのでメモ。

変なこと書いていたら教えてください。

## IntelliJのバージョン

IntelliJ IDEA 2018.1 (Ultimate Edition)

多分PyCharmとかでもやり方は同じだと思う。

## 状況

django(djangorestframework)とmysqlをそれぞれ別々のcontainerで起動。
djangoをIntelliJでデバッグしながら開発したい。

djangoは`./manage.py runserver 0.0.0.0:8000`で動かしている。


## やりかた

### `Project Structure` の設定

`⌘+;`の`Project Structure`の`Modules`で下記のように設定する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137959/7b806281-8db3-1d7e-59ff-d749700dde0c.png)

`Django`が表示されていない場合は一度`-`で消して再度`+`すれば出てくると思います。

`Django project root`：
 `manage.py` がある場所を指定

`Settings`：
`settings.py`を指定

`Manage script`: 
`manage.py`を指定

### `Edit Configurations`の設定

django用の起動設定を作成します。

`Run` > `Edit Configurations` とか、右上から`Edit Configurations`を開く
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137959/9fdbff5d-1719-b30b-613d-2112b9d4d4e5.png)

`Django server`を選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137959/31c9d7e8-69b1-f533-e3d1-3e96ee59af32.png)

`Django server`がないときはmoreをクリックするとあるはず。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137959/8015ce7c-5b25-aae6-6f9a-cdaa54a2a250.png)

こんな感じに設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137959/eb8e2d98-2f6a-90f8-b9d7-5d12d1800bf7.png)

`Host`: 
`0.0.0.0`
=> 重要ポイントその１

`Port`: 
django動かしてるポート (`8000`)

`Environment variables`: 
勝手に入っている
`DJANGO_SETTINGS_MODULE=api.settings` おそらくこれが重要

`Python Interpreter`:
Project SDK　として指定しているdockerのpythonを指定

`Docker container settings`:
各々の環境に合わせて設定。
ここでハマった。
横の`...`をクリックでGUIで指定できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137959/d87db380-73a0-120b-42eb-381f08eae30c.png)
`Network mode`:
=> 重要ポイントその２
mysqlが動いているネットワーク名を指定
`$ docker network ls`で確認できます。

そのほかの項目は`docker-compose.yml`と合わせる。


## 実行

### 1.何らかの方法でmysqlのdockerを起動

私の場合は
`$ docker-compose up db`

### 2.上記で作成した起動ファイルを実行

設定ファイル名を選択して虫マークをクリック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137959/73bc8c63-944a-be6e-ced5-8413ab8b392f.png)

### 3.やったぜ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137959/0b13c0a1-5519-ec11-36cd-ec95e30208af.png)
「Unity Remote 5」の使い方～android編


どうも大森です。　

今回は、「Unity Remote 5」の使い方を見ていきます。

Unity Remote 5は、実機テストができるアプリで　
（unityのゲームシーンをリアルタイムで見ることができます）

従来よりも簡単に、モバイルでの確認ができます。　

Unity Remote 5は、androidとiPhoneの両方で使えます。　

今回は、　androidでの使い方を説明します。　

<br><br>

#　ステップ１　下準備　
<br><br>

必要なもの　

・unity
事前にgamesceneを作っておきます。　

Android Build Supportも必要です。


<br>

・Unity Remote 5
グーグルプレイから、ダウンロードしておいてください。
<br>
・androidstudio　

こちらから、ダウンロードしておいてください。

https://developer.android.com/studio/index.html?hl=ja

<br>

・モバイル端末とＰＣを繋げる、ＵＳＢケーブルも必要

<br><br>
#　ステップ２　　モバイル端末で　USBデバッグをONにする
<br><br>
モバイル端末で、　設定→開発者向けオプションから　

USBのデバッグをＯＮにしておきます。

<br><br>
#　ステップ３　　Android SDKをインストールし、Pathを追加する
<br><br>

androidstudioを開きます。　

そして、画面右下の　Configure　→　ＳＤＫmanagerを開きます
<br>
![bandicam 2018-04-09 19-20-03-782.jpg](https://qiita-image-store.s3.amazonaws.com/0/196263/03333150-24f7-4e65-4059-66c4ad637018.jpeg)

<br>


そして、androidSDKを選択して、　android　SDKLoationの部分をコピーします。

<br>

![bandicam 2018-04-09 19-20-42-560.jpg](https://qiita-image-store.s3.amazonaws.com/0/196263/549829c9-613b-596d-9467-8337d6d60fbc.jpeg)

<br>
コピーした内容を、Unityの
「メニューから → Edit　→　Preference → External Tools：Android SDK」に貼り付ける。

<br><br>
#　ステップ４　　エディターセッティングをする

<br><br>
Unityで

Edit → Project Settings → Editor を開く

Device で使用するデバイスを “Any Android Device”にする。

それ以外の部分はデフォルトで大丈夫です。

<br>
![bandicam 2018-04-09 19-36-12-377.jpg](https://qiita-image-store.s3.amazonaws.com/0/196263/9aeb90c5-2d8e-bf4c-5d2a-716372dfa5d9.jpeg)


<br><br>
#　ステップ５　　ＵＳＢケーブルで接続する　
<br><br>

上記の設定が出来たら、　ＰＣとモバイル端末をケーブルで接続して　


Unity Remote 5を開きます。　

そしたら、　unityの方で、gameを再生します。　

それで、　gamesceneがモバイル端末で表示されます。

<br>

#　結果　　簡単にモバイル端末で確認ができる。

<br><br>
昔は、もっとめんどくさい方法でしたが　今はこのアプリで　
実機テストができるので、　アプリゲームを作るなら必須といえるでしょう。


<br><br>


ＰＳ　
<br><br>

Ｕｄｅｍｙにて　unity講座など出してます。　

以下はクーポンです。　
<br><br>
ユニティ　クーポン
https://www.udemy.com/unity-brender/?couponCode=UNITY01
（初心者向けの内容ですので）
<br><br>
Ｃ＃クーポン
https://www.udemy.com/visual-c/?couponCode=CPROGRAM1

<br><br>
ゲームツクールクーポン
https://www.udemy.com/rpgtukurugame/?couponCode=RPGMVV100


<br><br>
vagrantの時刻がずれたときの対処法

vagrantのコマンドに
su と打って　date -s "2018/04/13 20:20:20"（←その時の日時を入力） でEnterし、dateで確認すると変わっています。

TwitterOmniAuthなどを使っていてvagrantの時刻がずれているとエラーが発生するのでこれで対処しています。

vagrantの時刻がずれない方法はないのか。。。
Azure BLOB Storage + SAS URL を使ったベストプラクティスの例

## こんな人に向けた記事
AzureのBLOB Storageを使ってセキュアでかつ上手な使い方をしたいけどMSDNは書いてあることが大量なので簡単に必要なことだけまとめてあると楽でいいなーと思っていた人。

SAS使わないでGatewayにStorageKey保存して利用しようとしてセキュリティざるなのでダメに決まってるだろうとレビュアーに怒られたけど、どうすればいいかわからない人にも。

## 関連記事
この記事で使われているシーケンス図は[seqdiag利用マニュアル](https://qiita.com/yukio_tokuyoshi/items/c65bcec2d5a8fd2805de "seqdiag利用マニュアル")で作成しています。

## 今回の例でやっていること
![sasurl.png](https://qiita-image-store.s3.amazonaws.com/0/242111/f38381ba-8230-5689-184d-bf89d3bb981a.png)

Gatewayが複数のファイルをアップロードするシナリオに向けた設計例となります。
Gatewayに限った設計ではなく、「利用者」と読み替えてもらうことで汎用的に使えるものです。

ただファイルをアップロードさせるだけでなく、エンタープライズシステムで利用するために以下の点を考慮した設計になっています。それぞれの点についてどのような方式・設計で実現しているか記載します。

### SASを使ったセキュリティ
* 超簡単に書くとURLのクエリーストリングに利用期間等の権限がついていて、そのURLそのものを検証できるシグネチャ付きで提供できるもの。期間などを書き換えるとシグネチャと一致しないのでNGとなるので、短い期間でSAS発行することで他人に知られたときにはそのURLは既に期限切れになっているので安全ですよっていう、ざっくりいうとそんなものです。

* 上記の内容について、ちゃんとした文書が必要な人は、諦めて[MSのページ](https://docs.microsoft.com/ja-jp/azure/storage/common/storage-dotnet-shared-access-signature-part-1 "MSのページ")を見ましょう。

* FIXER社の技術ブログの[日山さんの記事](https://tech-blog.cloud-config.jp/2014/06/14/how-long-does-it-take-me-sas-issue-of-azure-storage-blob/ "日山さんの記事")も非常に参考になると思います。

### 送信途中の状態をシステムで把握可能（送信中に障害で停止した、なども把握したい）
* SAS URLを発行するタイミングでシステムにはファイル名とステータスを登録する。（登録時はURL発行済）
* アップロード完了報告の際に対象のファイルが全てBLOBにアップロード済か検証しステータスを更新する。（ファイル登録未済 OR 完了）
* 必要れあればダッシュボードやバッチなどでこのステータスを使って見たい情報を出したりアラート設定したりする。

### ファイルが複数ある場合にも対応
* 最初の要求でFileCountを一緒に登録させる

### ファイルを色々な条件で検索したい
* DBにファイル名以外の属性も登録して管理する
 * 検索さえ出来れば良いのでSQL DatabaseでもCosmosDBでも好きなデータストアを使ってよい

## 応用例
アップロード完了報告の際にキュー登録するとかして、Web JobsでこのファイルをFFMpegで連結してMediaServicesにエンコード用登録する処理をKickする、といったことをが出来ます。やたら具体的な例ですね。
FFMpegみたいな外部PGM使わないなら、今は極力Fnctions使っておきましょう。

## 利用事例
社名は出せませんが私が提供した会社さま複数社で元気に稼働中です。
Jupyter notebookで写経しながら便利だなと思った5つのショートカットキー

こんにちは、研修1週目途中の新米データサイエンティストです。
今Jupyter notebook形式で公開されているデータサイエンス演習コンテンツに取り組んでいます。

<u>**こちらです→** **[東大松尾研データサイエンス演習](http://weblab.t.u-tokyo.ac.jp/gci_contents/)**</u>

こちらを写経しながら学習を進めているのですが、今回はその中で知っていると便利だなと思ったショートカットキーを5つ紹介させて頂きます！

##**はじめに：Jupyter notebookの二つのモード**

jupyter notebookにはEdit modeとCommand modeがあります。 

- Edit mode：セルの左端が緑色。コードなどを書き込める。

<img width="1265" alt="スクリーンショット 2018-04-13 15.43.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/221497/7c7d8828-d7e3-d411-cbdd-e93365880bae.png">

- Command mode：セルの左端が青色。セルを消したり増やしたり、ノートブック単位での操作ができる。

<img width="1000" alt="スクリーンショット 2018-04-13 15.43.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/221497/06277a0e-4165-5e04-9c81-4c251cd1f45f.png">

これら二つのモードはEdit modeの時にはEscキー、Command modeの時にはEnterキーで互いに行き来する事ができます。
これから紹介させていただくショートカットキーは、主に左端が青色のCommand modeで使用します。

##**1. 「B」 : 下に一つセル追加**
今最も使っているショートカットです。サンプルコードの下に１つセルを追加し、上のセルを見ながら自分でコードを打つということをしているので、かなりお世話になっています。
ちなみに、上にセルを追加するショートカットもあるのですが、自分は上のコードを見ながらの方が写経しやすいので下にセルを追加する方を主に使っています。

##**2. 「M」 : セルのタイプをマークダウンに変更**
Jupyter notebookのセルにはCode, Markdown, Raw NBConvert, Headingの4種類あるのですが、自分は今の所CodeとMarkdownしか使っていません（笑）
コードの出力結果に対して、何かコメントを残したい時、「M」ですぐにマークダウンに切り替えることができるので、こちらにもお世話になっています。

##**3. 「Y」 : セルのタイプをコードに変更**
2.のコードに変換する番です。間違ってセルのタイプをマークダウンに変更してしまった時、かなり便利です。
自分は知らずに、間違ってマークダウンタイプに変更してしまった時はマウスで変更していました。
今ではすっかりお世話になっています。

##**4. 「X」 : セルを削除**
謝ってセルを追加しすぎてしまった時、便利です。
「B」を押しすぎてしまった時、お世話になっています。

##**5. 「H」 : ショートカットキー一覧を表示**
これってショートカットキー用意されていないかな？と思った時、お世話になっています。
大概既に用意されていて、「おお」となります。

##**終わりに**
さて、予想外に薄い内容となってしまいました。。。
非常に恐れ多いですが、何かの役に立つかもしれないと思い、このままポストさせて頂きます。。
もっと内容の濃い記事を書けるよう、精進して参ります。悪しからずご容赦ください。