OmniAICreator/Qiita-1.07M huggingface dataset:
デザイナーでも出来るSQL #SQL #超初心者

# デザイナーがSQLを覚えた始めたから書くよ。 基本形
※これだけあれば、だいたい出来るんじゃない？っていう個人的な意見を反映させてます。
もっと覚えるべき事はあるんだろうけど、これだけできればどうにかなると思います。



|A列|B列|C列|
|---|---|---|
|鈴木|2017/05/25|いくら|
|佐藤|2015/12/15|うに|
|伊藤|2004/04/06|うに|

今回はこんなテーブルがあったとしましょう。

## 全体忘れちゃいけないselect と from
select と、　fromがあればそれっぽいデータが来ます。
これ鉄則

### SQL
```
select A列,B列 
from テーブル名
```
### 抽出結果
|A列|B列|
|---|---|
|鈴木|2017/05/25|
|佐藤|2015/12/15|
|伊藤|2004/04/06|


## whereでフィルタが掛けられるイメージ
ある程度条件はつけたいもの。
where内で複数条件を入れたいときは**and**で増やせます。
ex.5/25にいくらを買った人を出したい！

### SQL

```
select A列,B列 
from テーブル名
where B列 = "2017-05-25 00:00:00"
and C列 = いくら
```

### 抽出結果
|A列|B列|
|---|---|
|鈴木|2017/05/25|

### 比較演算子でよく使いそうなもの
- = "2017-05-25"
    - 5月25日だけを抽出したいとき使う
- < "2017-05-25"
    - 2017年05月25日以前
    - >にすればもちろん逆に
- <> "いくら"
    - いくら以外を抽出したいときに


## 一定の期間を絞りたいときはbetween and

何日〜何日までのデータをだしたい〜ってときに使えます。
最悪、抽出後にエクセルでフィルタかけるでも全然いいと思うですよ。
ex.2015/4/15~2017/5/25の間の購入者を出したい。

### SQL

```
select A列,B列,C列
from テーブル名
where B列 between '2015-04-15 00:00:00' and '2017-05-25 00:00:00' 
```

### 抽出結果

|A列|B列|C列|
|---|---|---|
|鈴木|2017/05/25|いくら|
|佐藤|2015/12/15|うに|


## セルの数を数えたいときはcount

エクセルでよくつかう関数は結構使えます。
ex.いままでの累計購入者を出したい。

### SQL

```
select A列 count(*)
from テーブル名
group by A列
```

### 抽出結果

|A列|
|---|
|3|
[Node.js] passportのコールバックURLに任意のパラメータを引継ぐ

OAuthライブラリをつかっていると、
コールバック先に任意のパラメータを渡したくなることがある。
（リダイレクト先を出し分けたりするため）

Nodeのpassportを使った場合の方法をまとめる。
（ちょっと難癖あり）

※ 編集中
Node.js + Express をAWS Elastic Beanstalkで動かす

以前と設定の仕方が変わったようで、
npm startを設定しないとExpressが起動されなかったので手順をまとめました。
クライアントはMacです。

#IAMユーザーの作成
マネジメントコンソールから必要な権限を持ったIAMユーザーを作成し、認証情報を取得。

#awscliのインストール

```
sudo pip install awscli
aws --version
-------
aws-cli/1.11.74 Python/2.7.13 Darwin/16.6.0 botocore/1.5.55
-------

aws configure
------
AWS Access Key ID [None]: ********
AWS Secret Access Key [None]:  ********
Default region name [None]: ap-northeast-1
Default output format [None]: 
------
```

# ebコマンドのインストール

```
pip install --upgrade --user awsebcli
vi .bash_profile
-----
export PATH=~/Library/Python/2.7/bin:$PATH
-----

eb --version
------
EB CLI 3.10.1 (Python 2.7.1)
------
```

#Express環境の設定

```
sudo npm install -g express
sudo npm install -g express-generator
```

#Expressプロジェクトの作成

```
express test-nodejs
cd test-nodejs/
npm install
```

#git初期設定

```
git init

cat > .gitignore <<EOT 
node_modules/
.gitignore
.elasticbeanstalk/
EOT
```

#Elastic Beanstalkの初期設定/アプリ作成

```

eb init --platform node.js --region ap-northeast-1
eb create --sample test-nodejs

eb status
------
Environment details for: test-nodejs
  Application name: test-nodejs
  Region: ap-northeast-1
  Deployed Version: app-e465-170525_182949
  Environment ID: e-v7aa4cmhbi
  Platform: arn:aws:elasticbeanstalk:ap-northeast-1::platform/Node.js running on 64bit Amazon Linux/4.1.0
  Tier: WebServer-Standard
  CNAME: test-nodejs.xxxxxxxxx.ap-northeast-1.elasticbeanstalk.com
  Updated: 2017-05-25 09:31:52.871000+00:00
  Status: Ready
  Health: Green
```

これでElastic Beanstalk側の環境が完了です。

```
eb open
```

<img width="1177" alt="スクリーンショット 2017-05-25 20.58.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/52904/b1cd7803-2e5d-3029-9b93-ed873735acd7.png">

ここからExpressアプリをデプロイしていきます。

#elasticbeanstalkでExpressを動かす設定

```

mkdir .ebextensions

vi .ebextensions/nodecommand.config
------
option_settings:
  aws:elasticbeanstalk:container:nodejs:
    NodeCommand: "npm start"
-------

```

ちなみに、これをやらないで進めると、Expressが起動せずに502エラーになってしまう。

<img width="892" alt="スクリーンショット 2017-05-25 18.28.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/52904/d437621b-098e-05eb-6c38-c6946edfd611.png">


#アプリのデプロイ

```
vi views/index.jade
-----
extends layout

block content
  h1= title
  p Welcome to AWS
------

git add .
git commit -m "First express app"    
eb deploy
 
eb open

```

無事expressアプリが表示されました
 
<img width="717" alt="スクリーンショット 2017-05-25 18.32.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/52904/3da5d93e-664f-7851-b3df-ace7d3b7f30d.png">

#参考
http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create_deploy_nodejs_express.html
OpenAI Baselinesをwindows（winpython）で試す。

OpenAIから強化学習をtensorflowで簡単にお試しできるソースコードが公開されたようなのでWindows環境（WinPython）で試してみました。(とりあえず殴り書き)

https://blog.openai.com/openai-baselines-dqn

##WinPythonを以下からダウンロード
http://winpython.sourceforge.net/
以下、WinPython-64bit-3.5.3.1Qt5を利用した場合です。

##GPU関連とtensorflowを以下を参考にインストール
https://www.tensorflow.org/install/install_windows

##OpenAI Baselinesを以下を参考にインストール
https://github.com/openai/baselines
Winpythonのコンソールで

```
pip install baselines
pip install gym
```

##CartPoleのトレーニング＆テスト
Winpythonのコンソールで以下を実行するとcart pole（台車の棒が倒れないようにするゲーム）のトレーニングとテストができます。

```
python -m baselines.deepq.experiments.train_cartpole
python -m baselines.deepq.experiments.enjoy_cartpole
```

#ここからが本題
ここまでは順調ですが、Pong（ポン）のサンプルを試そうと以下を実行するとエラーが出ます。

```
python -m baselines.deepq.experiments.train_pong
```

以下のようにatariを入れろとヒントがでるので、実行すると
pip install gym[atari]
→make がないので、エラーとなります。

以下のスレッドの途中あたりを参考にatariを頑張ってコンパイルします。（bash on ubuntu on windowsを使う方じゃないやつ）
https://github.com/openai/gym/issues/11

msys2を以下を参考にインストールして、makeできるようにします。
http://www.msys2.org/
msys2のコンソールで以下を打ってアップデートします。

```
pacman -Syu
コンソールを立ち上げなおして
pacman -Su
開発環境もインストールします
pacman -S base-devel mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake
```
msys2のコンソールで以下を実行するとmakeができるはずですが

```
pip install -U git+https://github.com/Kojoley/atari-py.git
```
pipがないというエラーが出ます。

winpythonにパスを通しておく必要があるので
windowsの環境変数のpathに以下を追加します。

```
C:\WinPython-64bit-3.5.3.1Qt5
C:\WinPython-64bit-3.5.3.1Qt5\python-3.5.3.amd64\Scripts
C:\WinPython-64bit-3.5.3.1Qt5\python-3.5.3.amd64
```

そのままだとmsysのコンソールにpathが引き継がれないようなので環境変数のMSYS2_PATH_TYPEにinheritを追加します。
http://chirimenmonster.github.io/2016/05/09/msys2-path.html

gitコマンドにもパスが通ってないといけないのでgit for windowsを入れておきます。
https://git-for-windows.github.io/

再度、msys2のコンソールで以下のコマンドを打ちます。

```
pip install -U git+https://github.com/Kojoley/atari-py.git
```
できたっぽい。

winpythonのコンソールでpip listを実行してatariがインストールされているのを確認します。

やっとこさで目的のサンプルを実行します。

```
python -m baselines.deepq.experiments.train_pong
```
v3がないというエラーがでるので
`
C:\WinPython-64bit-3.5.3.1Qt5\python-3.5.3.amd64\Lib\site-packages\baselines\deepq\experiments\train_pong.py`の"PongNoFrameskip-v3"を"PongNoFrameskip-v4"に変更します。

enjoy_pong.pyも同じくv4変更しておきます。

で、もう一回、以下のコマンドを実行します。

```
python -m baselines.deepq.experiments.train_pong
```

トレーニングが始まりました！が、まだ終わらないので、今日はここまで。（学習終わったら結果の画像を載せたい）

追記：
学習終わりました。上手くなってる！（右側がプレーヤー）

学習前
<blockquote class="twitter-video" data-lang="ja"><p lang="ja" dir="ltr">Pong 学習前 <a href="https://t.co/0xAdAr1X7b">pic.twitter.com/0xAdAr1X7b</a></p>&mdash; tmizu23 (@tmizu23) <a href="https://twitter.com/tmizu23/status/868001044688584705">2017年5月26日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

学習後
<blockquote class="twitter-video" data-lang="ja"><p lang="ja" dir="ltr">Pong 学習後 <a href="https://t.co/EzmCrIv6lj">pic.twitter.com/EzmCrIv6lj</a></p>&mdash; tmizu23 (@tmizu23) <a href="https://twitter.com/tmizu23/status/868001716129546241">2017年5月26日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
SharePoint 集計列メモ

個人的なメモ

### 最新の日付
```
=MAX([列名1],[列名2],[列名3])
```

### 日付を文字列にして結合
```
=TEXT([列名1],"yyyy/mm/dd")&", "&TEXT([列名2],"yyyy/mm/dd")&", "&TEXT([列名3],"yyyy/mm/dd")
```
画面遷移をpanelでやってみた

#まずはじめに
Unityで画面をタッチすると次の画面に進んだり、戻ったりするゲームを作りたかった。
それを実現しようとして考えたのが、Sceneの変更とPanelの変更の2通りである。
今回はSceneだと読み込みの時間が重くなってしまうことと、作業する際にわざわざSceneを変えなくてはいけないことをを考慮して、Panelを使った方法を使用した。
#これ目標
![giphy.gif](https://qiita-image-store.s3.amazonaws.com/0/181142/01c6cad0-e02e-2f7b-5d42-6cbd65362a78.gif)


#さて作る
##仕組み
基本的に**PanelのSetActiveをonまたはoffにする**というScriptを作ることで画面遷移を行う。
Panel上にBottonを作成し、それを押すことで上のScriptが実行。
Panelが変更し、画面が変わる。
完成。

##Panelを作る
###作成
下の動画のようにPanelを作る
動画の要領でPanelBも作成する。
![panelの作成.gif](https://qiita-image-store.s3.amazonaws.com/0/181142/3f3f48c4-a4f1-1635-93d4-ba6b542f9370.gif)

###区別する
Panelが変わったのがわかるようにPanelに色を付ける。
今回はPanelAを青にPanelBを赤にしてみた。
![panelの色付け.gif](https://qiita-image-store.s3.amazonaws.com/0/181142/c0559d09-098f-6c01-85dc-83a8757fbe60.gif)

###Buttonの設置
各PanelにButtonを作成する。
そのあとPanelAのButtonのTextに「すすむ」を入れる。
そして、PanelBのButtonのTextに「もどる」を入れる。
![Buttonsakusei.gif](https://qiita-image-store.s3.amazonaws.com/0/181142/045ff60f-cffd-b717-6e95-fe0ec42f5177.gif)

##Panelを操作する仕組みづくり
ここでは、PanelAからPanelBに変わる仕組みを作る。
つまり、Scriptを書いて、GameObjectにつけるまでをやる。
###まずScirptを書く
新しくScriptを開いて、```Update()```メソッドの下に以下のScriptを書く。

```
int panelIndex = 0; //今表示しているpanelのindex
public GameObject[] panels;//Panelを入れる箱を用意
public void ChangeIndex (int input){
	panelIndex = input;//引数のinputをpanelIndexに代入する
	Display();
}

//panelIndexのの番号のpanelを画面に表示する
void Display(){
	//for文でiを0からpanelsの長さまで繰り返し1ずつ足していく
	for (int i = 0; i < panels.Length; i++) {
		if (i == panelIndex) {
			//表示したいPanelを決める
			panels [i].SetActive (true);
		} else {
			//それ以外のPanelを表示しない
			panels [i].SetActive (false);
		}
	}
}
```

###書いたScriptをGameObjectに
新しくGameObjectを作り、Scriptをアタッチする。
![PanelManagernoyau.gif](https://qiita-image-store.s3.amazonaws.com/0/181142/b0d65d09-9fae-8350-0b53-7ec572f665b1.gif)




アタッチしたら、Inspector>PanelManagerにあるPanel>Sizeの数字を変える。
Panelを入れる箱がその数分発生する。
そこに、PanelAとPanelBをドラッグする。
![Panel入れる.gif](https://qiita-image-store.s3.amazonaws.com/0/181142/9cc56417-9659-2104-42df-87faba018e1d.gif)



これで、ひとまず完成。

##画面を変える
最後の作業。
ButtonとScriptを紐付けて、Buttonを押すことでScriptに書いた内容が動くようにする作業。

###すすむを押すとpanelBに
PanelA>ButtonのInspector>Button(Script)>On Click()の枠の右下にある + マークを押す。
そして、空いてる箱にPanelManagerをドラッグする。
そして、下のgif画像のように設定していく
![button付ける.gif](https://qiita-image-store.s3.amazonaws.com/0/181142/d3f43c1e-3090-ff7c-41d2-36a6bbb8dba7.gif)

この画像の最後に打ち込む数字は先ほどPanelをドラッグした箱の番号だ。
下の画像の右下である。
![スクリーンショット 2017-05-30 18.24.47.png](https://qiita-image-store.s3.amazonaws.com/0/181142/468011a7-0b3f-1d17-de55-5b7795817a01.png)

###もどるを押すとpanelAに
上と同じ要領でButtonとScriptを暇付ける。

##再生してみる
![完成.gif](https://qiita-image-store.s3.amazonaws.com/0/181142/8a1a9e27-673c-4094-5ad5-a49c75d58db9.gif)

#完成
![完成あ.gif](https://qiita-image-store.s3.amazonaws.com/0/181142/2f4b2f29-2a54-c079-1d75-3e1d585d08e3.gif)
SharePoint 列の検証メモ

個人的なメモ

## 日付系

### 今年
```
=YEAR(TODAY())=YEAR([列名])
```

### 今年度
```
=AND([列名]>=DATE(YEAR(TODAY()),"04","01"),[列名]<=DATE((YEAR(TODAY())+1),"03","31"))
```

### 年月

```
=AND(LEN([列名])=7,ISERROR(DATEVALUE([列名]&"/01"))=FALSE())
```
RxJava2では失敗してくれないObservableのテスト

# この記事について
この記事は、以下のような人に役立ちます。つまり、私のことです。
- RxJava2を使っている
- ObservableやFlowableを返すメソッドのテストを書きたい
- TestObserverやTestSubscriberを使っていなかった

今まで書いていたObservableのテストが失敗しなくなったので、原因と対策を調べてみました。結論としては、TestObserverやTestSubscriberを使いましょうという話です。

# 前提
- RxJava 2.1.0 を利用
- テスティングフレームワークは Junit 4.12
- ラムダ式（Retrolambda）を利用

# 失敗してくれないテスト
まずは、興味深い例を紹介します。

``` java
@Test
public void test() throws Exception {
    Observable.just(1).subscribe(integer -> {
        Assert.assertEquals(2, (int) integer);
    });
}
```

このテストはRxJava1では失敗しますが、RxJava2では失敗しません。期待する値は2なのに対し、Observableから流れてくる値は1なので、`assertEquals`メソッドで`AssertionError`が発生します。`AssertionError`は`onNext()`の処理中に発生するので`onError()`の処理が呼ばれます。
ここで、RxJava1では`OnErrorNotImplementedException`が発生して、テストが失敗します。しかし、RxJava2では`OnErrorNotImplementedException`がコンソールに出力されるものの、テストは成功してしまいます。

以下のように`onError()`でfailさせてもダメです。

```
@Test
public void test() throws Exception {
    Observable.just(1).subscribe(integer -> {
        Assert.assertEquals(2, (int) integer);
    }, throwable -> Assert.fail());
}
```

## 原因
これは、RxJava2のエラーハンドリング方針が変更されたためにおきる現象です。`onError`の中で`Throwable`が発生した場合、RxJava1ではthrowされますが、RxJava2では`RxJavaPlugins.onError(Throwable error)`で処理されます。`RxJavaPlugins.onError(Throwable error)`は、（特に何も設定していない場合）エラーのスタックトレースを出力し、最終的には`UncaughtExceptionHandler#uncaughtException`にエラー処理を任せます。

``` RxJavaPlugins.java
/**
 * Called when an undeliverable error occurs.
 * @param error the error to report
 */
public static void onError(@NonNull Throwable error) {
    Consumer<? super Throwable> f = errorHandler;

    if (error == null) {
        error = new NullPointerException("onError called with null. Null values are generally not allowed in 2.x operators and sources.");
    } else {
        if (!isBug(error)) {
            error = new UndeliverableException(error);
        }
    }

    if (f != null) {
        try {
            f.accept(error);
            return;
        } catch (Throwable e) {
            // Exceptions.throwIfFatal(e); TODO decide
            e.printStackTrace(); // NOPMD
            uncaught(e);
        }
    }

    error.printStackTrace(); // NOPMD
    uncaught(error);
}

static void uncaught(@NonNull Throwable error) {
    Thread currentThread = Thread.currentThread();
    UncaughtExceptionHandler handler = currentThread.getUncaughtExceptionHandler();
    handler.uncaughtException(currentThread, error);
}
```

JUnitはテストメソッドが例外を投げた時にテストが失敗したと判断しますが、RxJava2では`Throwable`が`UncaughtExceptionHandler#uncaughtException`で処理され、throwされることがないためにテストが失敗しないと考えられます。

## 対策
TestObserverやTestSubscriberを使うことで、この問題は解決します。今回の例では、以下のようにTestObserverを使うとテストが期待通りに失敗します。

```
@Test
public void test() throws Exception {
    Observable.just(1)
            .test() // TestObserverを返す
            .assertValue(2);
}
```


# 結論
- RxJava2ではエラーハンドリングの方針が変わり、例外がthrowされなくなった
- ObservableのテストにはTestObserverやTestSubscriberを使いましょう

subscribeの中でassert系のメソッド呼び出しをしている場合は、RxJava2でテストが失敗しなくなるので気をつけましょう。

# 参考記事
- https://github.com/ReactiveX/RxJava/wiki/What%27s-different-in-2.0#error-handling
国際化モジュール(intl.so)インストールメモ

Zendのi18n配下にあるValidatorを使用したところ、intlモジュールがなくて異常が発生したのでintlモジュールのインストール方法

```
# yum install icu libicu-devel
# pecl install intl
```

※一部サーバにはgcc,g++がなくて異常が起きたので以下コマンドでインストール

```
# yum -y install gcc
# yum -y install gcc-c++ 
```

/etc/php.d
に以下の内容で
20-intl.ini
ファイルを追加

※20-intl.ini ってファイル名が適切なのかは不明。。

```
===============================
; Enable intl extension module
extension = intl.so
===============================
```

apache再起動

`# service httpd restart`
Eclipseインストール時の設定整備

最近Intellij ideaが流行ってるけど、
なんだかんだでEclipseは無料だし機能は揃っていてよく使うので、
個人的に開発しやすいEclipse環境をサクッと作る設定をまとめた
（順次追記予定）

## 使用するEclipse
Pleiades All in One 4.6.3.v20170422（Eclipse Neon 3）
Standard Edition（Java）

## インストール後のEclipse設定
### 実行Java変更
- 設定 > Java > インストール済みの JRE：jdkを追加し、チェックを付ける。JREが設定されてたら消しちゃう

### コードスタイルをGoogle準拠に（インデントはスペース4つにする）
- 設定 > Java > コード・スタイル > フォーマッター：インポート → [eclipse-java-google-style.xml](https://github.com/google/styleguide/blob/gh-pages/eclipse-java-google-style.xml)
- 設定 > Java > コード・スタイル > フォーマッター：編集 → インデント・サイズ4に変更

### Eclipseを黒くする（男なら黒に染まれ）
- 設定 > 一般 > 外観：ルック＆フィールをMoonRiseに変更
- 設定 > 一般 > 外観 > 色とテーマ：[テーマのインポート]からRainbowDropsを入れる

### フォント等設定
- 設定 > 一般 > 外観 > 色とフォント：デフォルトの編集で、好きなフォント、サイズに変更
- 設定 > 一般 > 外観 > 色とフォント：基本 > ダイアログ・フォントをMeiryo UIに変更
- 設定 > 一般 > ワークスペース：新規テキスト・ファイルの行区切り文字を[Unix]に変更
- 設定 > 一般 > エディター > テキスト・エディター：空白文字を表示にチェック（可視性の構成で、空白はチェックを外す）

### 拡張機能
- ヘルプ > マーケットプレイス：Vrapperをインストールする（Vim拡張）
本番環境のデータをローカルに落としたい時に使うコマンドはこれだ【初心者向け】

## 対象となる方々
- あるバッチファイルを実行したいけど本番／STG環境で検証なんてこわくてできるわけがない。
- でもローカル環境に入っているDBのデータ量がしょぼくて臨場感がない。
- 自分のローカル環境をできる限り本番環境に近づけたい。

## 前提
- Rails 5.0.0.1
- MySQL 5.7

## 本番環境のDBをmysqldumpでダンプする

まずは本番環境のDBのデータをダンプ（データ等をまるごと記録すること）する必要がある。
ターミナルで以下のコマンドを叩く。作業ディレクトリにダンプファイルを置いたままにすると、git管理下に入ってしまうので、それを忘れたまんまコミットしようとすると恐ろしいことになる…なんてことはしないですよね…m(_ _)m

```shell-session
$ mysqldump -u user_name -h host_name -p --database database_name > file_name
$ Enter password: ここにパスワードを記入する
・・・・・・・・ダンプ実行が開始される・・・・・・・・・
```

ダンプが終わったら、そのファイルをローカル環境のDBにインポートする。

```shell-session
$ mysql -u user_name -p database_name < file_name
database_nameにはインポート先のデータベース名を指定する
```
## scpコマンドを使う場合
linuxコマンドの一つ。ssh接続を介して、ファイルのアップロード／ダウンロードをすることができたりする。
https://webkaru.net/linux/scp-command/

これを使う場合は、本番サーバーにあらかじめダンプファイルが置いてあるという条件が必要。

ssh接続して本番サーバーに入り同じように`mysqldump`でダンプファイルを作成。
ただ、本番環境にあっても意味のないファイルのため、`/tmp`以下に作成するようにした方が良い。

ターミナル上のどこでも良いので、以下のコマンドを実行。ダウンロードが開始すれば、右端にファイル転送時間と容量を表示してくれる。

```
$ scp username@ipaddress:[ダウンロード元のパス] [ダウンロード先のパス]
hoge.sql                                 100%  540MB 337.5KB/s   27:18
```

`username`って何？と一瞬思ってしまったんですが、AWSとか使ってる場合は`ec2-user`とかになりますね。
`ipaddress`は本番サーバーに割り当てられているIPアドレス（ホストネーム）をかけばOKのはずです。
非 Babel 環境で使うツールに Babel プラグインを解決させる方法

# 問題

バージョン: Babel 6.X

グローバルインストールして CLI として使う npm パッケージを作っていて、内部で Babel (Node API) を使っていたのだが、プラグイン名の解決に失敗した。

```javascript
var result = babel.transform(code, {
    plugins: ["transform-react-jsx"],
});
```

```
ReferenceError: Unknown plugin "transform-react-jsx" specified in "base" at 0
```

状況をもう少し詳しく説明すると、ツールの package.json の `dependencies` には `babel-plugin-transform-react-jsx` が含まれている。開発時には動作するのだが、 Babel と関係ない環境からツールを使おうとすると、カレントディレクトリから node_modules を探しに行ってしまいプラグインが見つからない。


# 解決方法

`plugins` に[ファイルパスを指定できる](https://babeljs.io/docs/plugins/#plugin-preset-paths)ようだ。

```javascript
var result = babel.transform(code, {
    plugins: [Path.join(__dirname, '../node_modules/babel-plugin-transform-react-jsx/lib/index.js')]
});
```
Redmine 3.3.2 に Microsoft Teams Plugin をインストールして通知を送る

## 前提
Redimineのバージョン：Redmine 3.3.2.stable.16304

## Microsoft Teams Plugin のインストール
http://www.redmine.org/plugins/redmine_msteams
上記URLを参考にしてプラグインをインストール

`/plugins` ディレクトリで以下のコマンドを実行

```
$ git clone https://github.com/simplethings/redmine-msteams.git redmine_msteams
$ bundle install
```

実行後はRedmineを再起動する。

## Microsoft Teams でIncoming Webhook を設定する
通知させたいチャンネルの「…」から `コネクタ` を選択。
`Incoming Webhook` を選択後、名称とアイコンを入力して `Create` 。
`Webhook URL` が生成されるので、コピーしておく。

## Redmine で Microsoft Teams Plugin の設定を行う。
Redmine の管理画面からプラグインを選択し、 `Microsoft Teams Plugin` の `設定` を選択。
`Webhook URL` にコネクタ作成時に生成された Webhook URL をペースト。
適用。

以上。
BigQuery | bq load コマンドでpartitioned table を作成する

# パーティションテーブルを作成する

```
$ bq mk --time_partitioning_type=DAY dataset.table
```

# 適当なログファイルを用意

```:forload.log
alice
bob
carol
```

# BigQueryにロードする

```
$ bq load dataset.table forload.log name:string
```

# 確認

ロードすると内部的に「今日の日付」が記録される。
これをWHERE句で絞り込むことが出来る。

```sql
#LegacySQL
SELECT
  *
FROM
  [dataset.table]
WHERE
  _PARTITIONTIME = TIMESTAMP("2017-05-25")
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/1d31c6ad-14d1-436d-9f99-e5be071cb623.png)

# 日付を指定してロードする

パーティション形式のテーブル名を指定して、そのままロードすれば良い。

```
$ bq dataset.table\$20170101 forload.log name:string
```

### 注意

**ドル記号をバックスラッシュ ( `\` ) でエスケープするのを忘れないこと！**
これを忘れると、サイレントに「現在の時刻」でパーティションされてしまう。(シェルの特殊記号なので)

こんな風に、空の変数として扱われてしまう。

```
echo $20170101
```

# パーティションの確認

以下のクエリでパーティション情報を確認できる。

```
#LegacySQL
SELECT
  *
FROM
  [dataset.table$__PARTITIONS_SUMMARY__]
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/7e6e34fa-131b-1a66-b898-8fcfd6ef30d8.png)


# 参考

- [Creating and Updating Date-Partitioned Tables  |  BigQuery Documentation  |  Google Cloud Platform](https://cloud.google.com/bigquery/docs/creating-partitioned-tables)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
RSpecの実行時、pending exampleのリストをやめるには

RSpecを実行したとき、pendingテストがあると、そのリストが出ます。pendingが少ないときはこれでもよいのですが、長くなるとじゃまな場合もあります。

pendingは件数だけで十分という場合の対応がここに書いてありました。
https://github.com/rspec/rspec-core/issues/2377

具体的には、以下の手順でできます。

* `~/.no_pending.rb` を作っておく
* rspec実行時に `-r ~/.no_pending` をつける
    * 例: `bundle exec rspec -r ~/.no_pending -fp`

.no_pending.rb

```ruby
# -*-ruby-*-

# Silence output from pending examples in documentation formatter
# https://github.com/rspec/rspec-core/issues/2377

module FormatterOverrides
  def example_pending(_)
  end

  def dump_pending(_)
  end
end

RSpec::Core::Formatters::DocumentationFormatter.prepend FormatterOverrides
RSpec::Core::Formatters::ProgressFormatter.prepend FormatterOverrides
```

実行例:

```
% bundle exec rspec -r ~/.no_pending -fp
..........................................

Finished in 1.59 seconds (files took 0.68398 seconds to load)
42 examples, 0 failures, 10 pending
```
Android 簡単にボタンに"押した感"を出す

## Androidで、簡単にImagebuttonやbuttonに押した感を出す方法
![image3.jpg](https://qiita-image-store.s3.amazonaws.com/0/61531/811264f9-5c2b-d99a-4182-b71086dacabf.jpeg)
1.下記、2つのJavaクラスを作成して、プロジェクトに追加。
　※「*****」部分は編集してください

```java:PushButton.java
package *****パッケージ名*****;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.Button;

/*** プッシュするエフェクトのボタン ***/
public class PushButton extends Button {
    public PushButton(Context context) {
        super(context);
    }

    public PushButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setPressed(boolean pressed) {
        if(pressed){
            this.setScaleY(0.92f);
            this.setScaleX(0.96f);
        }else{
            this.setScaleY(1.0f);
            this.setScaleX(1.0f);
        }
        super.setPressed(pressed);
    }

}
```

```java:AlphaButton.java
package *****パッケージ名*****;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.Button;

/*** 半透明になるエフェクトのボタン ***/
public class AlphaButton extends Button {
    public AlphaButton(Context context) {
        super(context);
    }

    public AlphaButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setPressed(boolean pressed) {
        if(pressed){
            this.setAlpha(0.75f);
        }else{
            this.setAlpha(1.0f);
        }
        super.setPressed(pressed);
    }

}
```

2.あとはレイアウトXMLに「Button」の代わりにカスタムボタンを配置
・レイアウト例
　※「*****」部分は編集してください

```xml:layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainframe"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#000000">

    <!--- 押すと縮小するボタン -->
    <*****パッケージ名*****.PushButton
        android:id="@+id/button_sample01"
        android:layout_width="200dp"
        android:layout_height="60dp"
        android:background="@drawable/button_sample"
        />

    <!--- 押すと半透明のボタン -->
    <*****パッケージ名*****.AlphaButton
        android:id="@+id/button_sample02"
        android:layout_width="200dp"
        android:layout_height="60dp"
        android:background="@drawable/button_sample"
        />
</LinearLayout>
```

以上
Gitのブランチの切り替え(checkout)履歴をpecoる

pecoとかxargsとかawkはきっとみんなインストール済みだと思うけど、まだの人はインストールするといいと思う。
fishでしか確認してないけど普通にどのシェルでも動くんじゃないかな。

develop/master は表示除外してるけどそのへんはお好みでどうぞ。

```bash
git --no-pager reflog | awk '$3 == "checkout:" && /moving from/ {print $8}' | grep -vE '(develop|master)' | uniq | head -n 20 | peco | xargs git checkout
```

aliasを適当に設定してね。ぼくは `gitcohistory` にしてる。

```bash:~/.config/fish/config.fish
alias gitcohistory='git --no-pager reflog | awk \'$3 == "checkout:" && /moving from/ {print $8}\' | grep -vE \'(develop|master)\' | uniq | head -n 20 | peco | xargs git checkout'
```

-------

#### 追記

`.gitconfig` にセットしたほうがキレイだったのでそうした

```bash:.gitconfig
[alias]
    co-history = "!git --no-pager reflog | awk '$3 == \"checkout:\" && /moving from/ {print $8}'" | grep -vE '(develop|master)' | uniq | head -n 20 | peco | xargs git co
```

-------

![](https://qiita-image-store.s3.amazonaws.com/0/3865/13baa393-2941-df48-95bb-73a3733b8cb9.png)

![](https://qiita-image-store.s3.amazonaws.com/0/3865/c2bbcebd-5fd1-77ce-b3af-958d11957d0f.png)

![](https://qiita-image-store.s3.amazonaws.com/0/3865/c1ffebbe-ddb9-2c23-0abf-b4a07fb7c9b0.png)


参考: http://qiita.com/karupanerura/items/502833d970a7cf93ed96
[Get started]から始めるReact開発：その2:Rendering Elements

引き続き[React](https://facebook.github.io/react/docs/rendering-elements.html)

[[Get started]から始めるReact開発：その1](http://qiita.com/t-katsura/items/6c3a92583b8a738e2921)
[[Get started]から始めるReact開発：その2:Rendering Elements](http://qiita.com/t-katsura/items/43ac2e758fd53a8a9ffa)
[[Get started]から始めるReact開発：その3:Components and Props](http://qiita.com/t-katsura/items/d3c320a0b68cee7c9d77)
[[Get started]から始めるReact開発：その4(State and Lifecycle①](http://qiita.com/t-katsura/items/7b8e4889fe73e4d3245d)
[[Get started]から始めるReact開発：その4(State and Lifecycle②](http://qiita.com/t-katsura/items/24a14ff763ac7738a036)

#Rendering Elements

`Elements`はReact appsでの最小のブロックです。
どんなふうに画面上で見ることができるかを表しています。

```javascript:code
const element = <h1>Hello, world</h1>;
```

ブラウザのDOM要素とは異なり、`React Element`は簡素なオブジェクトで、作り事自体は簡単です。
`React Dom`は`React Elementｓ`と一致するようにDOMの更新を行います。

>componentsと混同するかもしれませんが、componentsに関しては次のsectionで紹介しています。一足とびにそちらを学ぶ前にこのセクションを読むことを奨励しているそうです。

##Rendering an Element into the DOM

仮にあなたのHTMLファイルの何処かに`<div>`タグがあったとします。

```
<div id="root"></div>
```

`React DOm`で管理をしたいのでこれを`root`DOMと呼びます。
Reactで作られたアプリケーションはシングル`root DOM`ノードを持ちます。もしあなたが既に作られたアプリケーションにReactを採用するのであれば、好きなだけ多くの独立した`root DOM`を持つことができます。

`root DOM`の中に`React Elements`をレンダリングするためには、`ReactDOM.render()`に両方を渡します。

```javascript:code
const element = <h1>Hello, world</h1>;
ReactDOM.render(
  element,
  document.getElementById('root')
);
```

[CodePenで確認](http://codepen.io/gaearon/pen/rrpgNB?editors=1010)

`Hello, world`がページに表示されます。

##Updating the Rendered Element

`React Element`は変更ができません([React elements are immutable](https://en.wikipedia.org/wiki/Immutable_object))。一度要素を作るとその子や属性を変更することはできません。
要素は映画の1フレームのようにある特定の時点でのUIを表します。（…何だこの日本語

これまでの私達の知識では、UIを更新する方法は新しく要素を作り出すことと、`ReactDOM.render()`にそれをわたすことです。

時計の例で考えてみます。

```javascript:code
function tick() {
  const element = (
    <div>
      <h1>Hello, world!</h1>
      <h2>It is {new Date().toLocaleTimeString()}.</h2>
    </div>
  );
  ReactDOM.render(
    element,
    document.getElementById('root')
  );
}

setInterval(tick, 1000);
```

[CodePenで試す](http://codepen.io/gaearon/pen/gwoJZk?editors=0010)

上記の例では`setInterval`で毎秒`ReactDOM.render()`を呼び出しています。

>練習の中で、多くのReact appsは一度だけしか`ReactDOM.render()`をよびだしていません。次のセクションでそれらがどのようにステートフルなコンポーネントにカプセル化されているかを学びます。
>それらは相互に関連しておりお互いに基づいて構築されているので、現在のトピックをスキップしないことをおすすめしています。

##React Only Updates What's Necessary(Reactは必要なものだけを更新する)

Reactは要素とその子要素について一つ前の要素と比較します。望みの状態にDOMを持ってくるために必要な更新をDOMに適用します。
[最後の例](http://codepen.io/gaearon/pen/gwoJZk?editors=0010)をブラウザの検証ツールで検証することができます。[^1]

全てのUIツリーの記述を毎秒作り出すとしても、内容が変更されたテキストノードだけがReact DOMによって更新されます。(このあとちょっと訳すのが難しいのでgoogle翻訳)私たちの経験では、時間をかけてUIを変更する方法ではなく、UIをどのように見なければならないか考えてみると、バグ全体が取り除かれます。


[^1]:ここでChromeとかのブラウザ検証ツールを使っているGIF画像が表示されていますが参照しません。
Azure ServiceFabric - エミュレーターからLocalDBへの接続

LocalDBは外部からの接続に制限がある。
Azure Service FabricのエミュレーターからLocalDBへ接続する場合、外部接続
扱いとなってしまう。

LocalDBに共有名を設定し、"NETWORK SERVICE"アカウントを追加し、db_ownerのロールにマッピングすると、Service Fabricのエミュレーターから共有名でのアクセスができるようになる。

コマンドプロンプトから下記のコマンドを実行。
[[databasename]]のところは環境に合わせて変更(3か所)

```bat
sqllocaldb create MSSQLLocalDB
sqllocaldb start MSSQLLocalDB
sqllocaldb share mssqllocaldb sharedlocal
sqllocaldb stop MSSQLLocalDB
sqllocaldb start MSSQLLocalDB

"c:\Program Files\Microsoft SQL Server\110\Tools\Binn\SQLCMD.EXE" -S "(localdb)\.\sharedlocal" -d "[[databasename]]" -Q"create login [nt authority\network service] FROM windows with DEFAULT_DATABASE=[[databasename]];use [[databasename]];exec sp_addrolemember 'db_owner', 'nt authority\network service';"
```

App.configの接続文字列を下記のように設定
[[DbContextName]]、[[databasename]]は環境に合わせて変更

```bat
<add name="[[DbContextName]]" connectionString="data source=(localdb)\.\sharedlocal;initial catalog=[[databasename]];integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
```


参考
[stackoverflow - Using LocalDB with Service Fabric](https://stackoverflow.com/questions/36401991/using-localdb-with-service-fabric)
KotlinでAndroidアプリを開発したときのコンパイル後の生成物を眺める

KotlinでAndroidアプリを開発しているときに，APKの中を見ると `kotlin/kotlin.kotlin_builtins` のような `*.kotlin_builtins` ファイルや `META_INF` 下に `*.kotlin_module` という見覚えの無いファイルが含まれていて，リリース時に含めるべきファイルなんだろうか？と思って気づいたらKotlinのコード読んだりclassファイル読んだりしていました．

`*.kotlin_builtins` と`*.kotlin_module`については，結論から言えば `kotlin-reflect`でリフレクションをしたりKotlinの型情報を実行時に扱う黒魔術に手を染めてない限りは実行時に使わないのでAPKに含めなくて良さそう．
Kotlin正式サポートされたので，将来的には不要な場合にはAPKに含めないようになるのかも．

以下，あまりAndroid関係ない内容です．

# *.kotlin_builtins

Kotlinの組み込み型に関する型情報が入っている．

[リフレクション時](https://github.com/JetBrains/kotlin/blob/master/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java)やコンパイル時の他に，[IDEのプラグインとか](https://github.com/JetBrains/kotlin/blob/1.1.0/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/builtIns/KotlinBuiltInDecompiler.kt)も参照している．
ファイルの中身はProtocol Buffersでエンコードされている．

https://stackoverflow.com/questions/41052868/what-are-kotlin-builtins-files-and-can-i-omit-them-from-my-uberjars


# *.kotlin_module

Kotlinの[モジュール](https://kotlinlang.org/docs/reference/visibility-modifiers.html#modules)単位で必要に応じて作られるファイル．
クラスの外に実装されたトップレベルの関数や`typealias`等に関する情報などが入っている．

# 色々

## Metadataアノテーション

組み込み型の型情報は，kotlin_builtinsファイルで管理されているみたいだけど，通常のクラスはどうかと見てみるとKotlinのクラスには，謎のMetadataアノテーションが付いている．

https://github.com/JetBrains/kotlin/blob/1.1.0/core/runtime.jvm/src/kotlin/Metadata.kt

- ScalaにもScalaSignatureというのがあったけどほぼ同じようなもの
- 中見ると謎データ入っているけど，これもProtoBufでエンコードされたメソッド等の型情報

`kotlin-reflect`とか使うなら，ProGuardに削除されないように気をつける必要がありそう．
逆にリフレクションとかしないならProGuardに削除されるのでサイズのオーバーヘッド考えなくて良い．

## interfaceのデフォルト実装

- デフォルト実装をstaticメンバとして持った `$DefaultImpls` クラスが生成される
- インタフェイスを実装しているクラスでoverrideしていなければ，実装クラスのメソッドを呼び出すだけのメソッドが追加される
- インライン展開っぽいことはしないみたい

## トップレベル関数

classの外に書かれたトップレベル関数はファイル名 + `Kt` という名前のクラスが生成され，そこに定義される．

Kotlinのコンパイル単位をまたいで参照する場合，それがトップレベル関数であることがわからなくなりそうですが，どのクラスファイルがトップレベル関数を持っているかの情報が，META_INF 内の `*.kotlin_module` に入ってるのでこれをれ見て解決される．

classファイルが自動生成されますが，`$` とか入ってないので，うっかり`Kt` で終わるクラス作ると普通に衝突する．

## 拡張関数

扱いはトップレベル関数とほぼ同じ．`static`メソッドになってて`this`が引数で受け取ったオブジェクトに置き換えられている．

## nullチェック

KotlinではNullableが明確に区別されていますが，javaからKotlinの関数を呼ぶ時にNullableでない箇所にnullを入れると例外が飛びます．

内部的には各メソッドの先頭で [internal.Intrinsics.checkNotNull](https://github.com/JetBrains/kotlin/blob/1.1.0/core/runtime.jvm/src/kotlin/jvm/internal/Intrinsics.java) でnull チェックされてます．

privateメソッド等，明らかにnullが渡って来ない場所ではチェックは省略されます．

## コレクションクラスの mapやfold

Listとかに mapやfold生えててとても嬉しい．
コンパイル後のコード見たら，単純なコードならインライン展開されててただのループだし安心．躊躇なく使って良さげ．

# 最後に

巷で言われている通り，Javaと比べて生成されるコードサイズも実行速度もほとんどオーバーヘッドは無さそう．

Kotlin自体は3年以上前から触ってますが，話題になったときにたまに思い出して触るにわかなのでいい加減なこと書いてるかも．
AWS Lambdaが実行されているリージョンを取得する


`AWS_DEFAULT_REGION`という環境変数にリージョンが設定されいるので、お使いの言語で環境変数にアクセスすれば取得できます。
pythonだと以下のようになります。

```python
import os
def lambda_handler(event, context):
    print "REGION:" + os.getenv("AWS_DEFAULT_REGION")
```

その他使用できる環境変数は[こちら](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/current-supported-versions.html)から確認できます。
concrete5 5.7 & V8 でよく使う config ファイル設定サンプル


/application/config/concrete.php でよくやっている設定を書き残します。

## Version 8

```
<?php
// ロードバランサーを利用している場合：Get remote address
$remoteIps = [
	'127.0.0.1/32', # CIDR表記の例
	'127.0.0.1', #IPの例
]; 

return [
	// ロードバランサーを利用している場合
    'security' => [
        'trusted_proxies' => [
            'ips' => $remoteIps,
        ],
    ],

    /**
     * ------------------------------------------------------------------------
     * Email settings
     * ------------------------------------------------------------------------
     */
    'email' => [
        /*
         * Enable emails
         *
         * @var bool
         */
        'enabled' => true,
        'default' => [
            'address' => 'no-reply@example.com',
            'name' => '差出人',
        ],
        'form_block' => [
            'address' => 'no-reply@example.com',
            'name' => '差出人',
        ],
        'forgot_password' => [
            'address' => 'no-reply@example.com',
            'name' => '差出人',
        ],
        'validate_registration' => [
            'address' => 'no-reply@example.com',
            'name' => '差出人',
        ],
    ],
    'user' => [
    	// 新規ユーザー登録時のメール送信先
        'registration' => [
            'notification_email' => 'info@example.com',
        ]
    ],

    /*
     * --------------------------------------------------------------------
     * Miscellaneous settings
     * --------------------------------------------------------------------
     */
    'misc' => [
        'app_version_display_in_header' => false,
    ],
    'seo' => [
        'trailing_slash' => true,
        'redirect_to_canonical_url' => true,
    ],
];
```


## 5.7.x

$_SERVER['REMOTE_ADDR']; の例もこちらに。
ただし、閉じた環境など、特別な場合のみ使用してください。

```
<?php
// ロードバランサーを利用している場合：Get remote address
$remoteIp = $_SERVER['REMOTE_ADDR'];


return array(
	// ロードバランサーを利用している場合
    'security' => array(
        'trusted_proxies' => array(
            'ips' => array($remoteIp),
        ),
    ),

    /**
     * ------------------------------------------------------------------------
     * Email settings
     * ------------------------------------------------------------------------
     */
    'email'             => array(

        /**
         * Enable emails
         *
         * @var bool
         */
        'enabled' => true,
        'default' => array(
            'address' => 'info@example.com',
            'name'    => '差出人'
        ),
        'form_block' => array(
            'address' => 'info@example.com',
            'name'    => '差出人'
        ),
        'forgot_password' => array(
            'address' => 'info@example.com',
            'name'    => '差出人'
        ),
        'validate_registration' => array(
            'address' => 'info@example.com',
            'name'    => '差出人'
        ),
    ),

    'misc'              => array(
        'app_version_display_in_header' => false
    ),

    'seo'               => array(
        'trailing_slash'       => true,
    ),

    'updates' => array(
        'enable_auto_update_core' => true
    ),
);
```



この記事が役に立ったら、「 **CMS は concrete5 が一番**」と頭の中で10回唱えてください。
Sails.jsでcsv出力する方法

## json2csvを使えば楽
https://www.npmjs.com/package/json2csv

### インストール
```
npm install json2csv --save
```

### csvデータ作成
```sample.js
var json2csv = require('json2csv');
var fields = ['id', 'title'];
var data = {
  "id": 1,
  "title": "test",
};
var csv = json2csv({data: data, fields: fields});
```

#### フィールドのカスタマイズもできる
```sample.js
var fieldNames = ['番号', 'タイトル'];
var csv = json2csv({data: data, fields: fields, fieldNames: fieldNames});
```
その他詳細な機能は[githubドキュメント](https://github.com/zemirco/json2csv)参照。

### 日本語エクセル対応
エクセルで読み出したいので、charsetをshift_jisにしたい。

#### iconv_liteを使う
https://github.com/ashtuchkin/iconv-lite
```
npm install iconv-lite --save
```

```sample.js
var iconv = require('iconv-lite');
```

```sample.js
var csv = iconv.encode(csv, "Shift_JIS");
```

### 送信
sailsなのでexpress.jsに準じる。

```sample.js
var filename = 'file.csv'

res.attachment(filename);
var csv = iconv.encode(csv, "Shift_JIS");
res.send(csv);
```

これで日本語Excel対応のCSVファイルがレスポンスされます。
Googleの研究論文は一般公開されているのをご存知ですか？

#Googleの論文を読もう！

Googleでは研究論文を一般に公開しており、論文で発表された内容がしばらくしてGoogleのサービスとして、リリースされることも多い。
例えば、あなたが大きなプロジェクトを任され、ソースコードのバージョン管理をどうするか悩んでいたとする。
そんな時、一日数万行のソースコードがコミットされるというGoogleにおいて、どのようにバージョン管理を行っているのか？ を知ることができれば、何らかのヒントが見つかるかもしれない。

そのようなケースで、参考になるのが以下のサイトである。
**[Research at Google](https://research.google.com/pubs/papers.html)**

様々な分野に関する論文が掲載されており、自由にPDFでダウンロードすることができる。
後学のためやビジネススキル向上等、是非とも、有効に活用されたい。


#Appendix
例に挙げたバージョン管理に関しては、"version control" で検索しただけで、幾つか参考になりそうな情報が簡単に取得できる。
https://research.google.com/pubs/author35663.html
https://static.googleusercontent.com/media/research.google.com/ja//pubs/archive/42942.pdf
BottomNavigationViewの上に何かを重ねたい

# やりたいこと

備忘録っぽく。

Designサポートライブラリに入ってる
BottomNavigationView
の上に何かを重ねたい。
！マークとかそーゆーの。


# 試したこと

## その１

FrameLayoutとかにBottomNavigationViewと重ねたいViewと同居させるとか。
駄目だった。


## その２

BottomNavigationViewはたぶんZオーダーがつおいんだと思う。
ので、レイアウトでもコードでもいいんだけど
それより手前に指定してあげたら重なった。

レイアウトだとこんな

```java
android:translationZ=”xxdp”  xxには極端な数値
```

でも、minSDKバージョンが○○以上でしか使えないってことで没


## その３

↓のように
BottomNavigationViewの外周をFrameLayoutで囲って
さらに重ねたいものを別途用意したら重なった。

```xml
    <!-- 外周を囲う -->
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:layout_alignParentBottom="true"
        >

        <android.support.design.widget.BottomNavigationView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="bottom"
            android:background="?android:attr/windowBackground"
            app:menu="@menu/navigation"
            />

    </FrameLayout>

    <!-- 上に兼ねたいのを別途用意する -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:orientation="horizontal"
        android:layout_alignParentBottom="true"
        >

        <ここに重ねるなにかを>

    </LinearLayout>
```


# その４

Xperia Z ultraとか変態解像度の端末で動かしたり
横画面で見るとボタンが中央に寄ってバランスが崩れてガッカリ。

BottomNavigationViewのChildを辿って色をつけてみたら左右にスペースが。。。

```java
BottomNavigationMenuView menuView = (BottomNavigationMenuView) mNavigation.getChildAt(0);
menuView.setBackgroundColor(Color.RED);
```

ので、真面目に計算することにしました。

```java
final LinearLayout view;  // 重ねる用のView達

int width = getResources().getDimensionPixelSize(android.support.design.R.dimen.design_bottom_navigation_active_item_max_width);
int height = (int) getResources().getDimension(R.dimen.hogehoge);

RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
        width * view.getChildCount(),
        height
);

layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);

view.setLayoutParams(layoutParams);
```

子要素の数で幅を計算して
あとはそれを中央と下段に寄せてます。


# おまけ。

ボタン画像のサイズを変更するサンプル。
画像そのものを変更もできるようだけど、触るともとに戻る。。

```java
BottomNavigationMenuView menuView = (BottomNavigationMenuView) navigation.getChildAt(0);
for (int i = 0; i < menuView.getChildCount(); i++) {
    Drawable drawable = ContextCompat.getDrawable(this, R.drawable.icon);

    BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);

    final View iconView = menuView.getChildAt(i).findViewById(android.support.design.R.id.icon);

    final ViewGroup.LayoutParams layoutParams = iconView.getLayoutParams();
    final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
    // set your height here
    layoutParams.height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 32, displayMetrics);
    // set your width here
    layoutParams.width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 32, displayMetrics);
    iconView.setLayoutParams(layoutParams);
}
```
Jenkins Declarative Pipeline 〜whenを使い倒す！〜

Jenkins2系からPipelineが標準サポートされましたね。
そのPipelineも初期のScripted PipelineからDeclarative Pipelineに代わり、
宣言的に記述することができるようになりました。

今回はそのDeclarative Pipelineの１機能である`when`についてです。

## whenとは何か？
`when`は実行の分岐を`stage`単位で制御できる、if 文みたいなものです。

まずは簡単な例を見てみましょう！

```groovy
pipeline {
    agent any
    stages {
        stage('Example Deploy') {
            when {
                branch 'production'
            }
                echo 'Deploying'
            }
        }
    }
} 
```

はい、ぱっと見ただけでやっていることがわかりますね？
これはブランチが`production`のときにだけ、`Example Deploy stage`が実行されるようになります。
それ以外はスルーになります。

## whenの条件に指定できるのは？
このように便利な`when`ですが、2017/05/25現在、指定できる条件は以下の３つになります。

| 条件 | 説明 | 例 |
|------|-------|----|
|branch|指定したブランチのときに|`when { branch 'master' }`|
|environmet|環境変数が指定した値のとき|`when { environment name: 'DEPLOY_TO', value: 'production' }`|
|expression|groovyで書いた条件がtrueを返すとき|`when { expression { return params.DEBUG_BUILD } }`|

とくに`expression`はgroovyで記述できるため、複雑な条件も記述できるため重宝します。

```groovy
pipeline {
    agent any
    parameters {
        string (
            defaultValue: '*',
            description: '',
            name : 'BRANCH_PATTERN')
        booleanParam (
            defaultValue: false,
            description: '',
            name : 'FORCE_FULL_BUILD')
    }
    stages {
        stage ('Build') {
            when {
                expression {
                    GIT_BRANCH = 'origin/' + sh(returnStdout: true, script: 'git rev-parse --abbrev-ref HEAD').trim()
                    return GIT_BRANCH == 'origin/master' || params.FORCE_FULL_BUILD
                }
            }
            steps {
                sh 'echo HelloWorld'
            }
        }
    }
}
```

## And, Or はどうやるの？
条件を作っていると、複合条件が必要になってくる場合が往々にしてあります。
例えば、AブランチかBブランチのときに実行したい。CブランチのときはDパラメータがあるときに実行したい、などなど。

その場合、どうするか？
まずは例を見てみましょう！

```groovy
pipeline {
    agent any
    stages {
        stage('Example Build') {
            when {
                anyOf {
                    allOf {
                        not {
                            expression { false } 
                        }
                        expression { true }
                    }
                    expression { false }
                }
            }
            steps {
                echo 'Hello World'
            }
        }
    }
} 
```

なんとなくわかりますが、説明します。

| 条件 | 表記 |
|------|------|
|AND条件| allOf |
|OR条件| anyOf |
|NOT条件| not |

このように英語らしい表現になっていて、入れ子も可能になります。
上の例は、みなさんが見慣れた（？）Javaのif文で書くとこのようになります。

```java
if ( (!false && true) || false) {
  ...
}
```

## 所感
複合条件の部分はドキュメントに載っていないので、ソースコードを追っかけ苦労した部分でもあります。
みなさんの助けになれば、と思ってQiitaに投稿しました。

## 参考
* https://jenkins.io/doc/book/pipeline/syntax/
* https://jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/
* https://github.com/jenkinsci/pipeline-model-definition-plugin/tree/master/pipeline-model-definition/src/test/resources
TensorFlowを中心とした機械学習環境をMacで構築

##目的
TensorFlow(r1.1)を中心とした機械学習環境をMacに構築します。機械学習環境はvirutalenvを利用してPython 3の仮想環境上に構築します。virutalenvを利用することで、システムのライブラリに影響を与えずに、手軽に機械学習環境を構築できます。Linux (Ubuntu 16.04LTS)版は[こちら](http://qiita.com/JeJeNeNo/items/a2b004a2afc732bc98d5)。

## virtualenvを利用してPython 3の仮想環境を構築
MacにはデフォルトでPython 3は入ってないので、Python 3をシステムにインストールします。[Homebrew](https://brew.sh/)を使う方法と[Pythonの公式ページ](https://www.python.org/downloads/mac-osx/)からインストールする方法があります。Homebrewだとパッケージをまとめてアップグレードする際にPythonもアップグレードされることがあります。Pythonのバージョンをマイナーバージョンまで複数のコンピュータやOSでそろえるなら[Pythonの公式ページ](https://www.python.org/downloads/mac-osx/)からインストールしたほうが便利かもしれません。

```bash:terminal
brew install python3 # Homebrewを使う場合
```

次にvirtualenvを利用してPython 3の仮想環境を構築します。
以下のコマンドで`tensorflow`という名前のPython 3の仮想環境がカレントディレクトリに構築されます。

```bash:terminal
pip3 install virtualenv          # virtualenvのインストール
virtualenv -p python3 tensorflow # python3の仮想環境を構築
```

## Python 3の仮想環境上にTensorFlowなどの機械学習ライブラリをインストール

Python 3の仮想環境に移動します。移動後はユーザー名の前に仮想環境名が表示されます。
この場合は(tensorflow)。

```bash:terminal
user@local $ source tensorflow/bin/activate 
(tensorflow) user@local $ python --version
Python 3.5.2
```

仮想環境上でTensorFlowをインストールします。

```bash:terminal
pip3 install --upgrade tensorflow
```

上記の方法でうまくいかない時や特定のバージョンをインストールしたい場合は

```bash:terminal
pip3 install --upgrade \
https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.3.0-py3-none-any.whl
```

よく使う機械学習関連のライブラリなどもお好みでインストールしましょう。

```bash:terminal
pip3 install scipy matplotlib scikit-learn Keras jupyter
```

###仮想環境からの脱出
仮想環境から脱出する際は、`deactivate`というコマンドを打てばOK。通常のコマンドライン表示に戻ります。

```bash:terminal
(tensorflow) user@local $ deactivate
user@local $
```

##その他pip関連
###パッケージ情報を書き出し、違う環境で同じパッケージをインストール
`pip freeze`コマンドでインストールしたパッケージを全て書き出せます。書き出したファイルを違う環境で使えば、同じパッケージをインストールできます。

```bash:terminal
#インストールしたパッケージ情報を"requirements.txt"に書き出す。
pip freeze > requirements.txt
#同じパッケージをインストール
pip install -r requiremnts.txt
```

###パッケージを一括アップグレード
以下の一行のコマンドでインストールされているPythonのパッケージを全てアップグレードできます。

```bash:terminal
pip list --format=legacy --outdated | awk '{print $1}' | xargs pip install --upgrade
```

##参考
Python (公式ページ): [Python Releases for Mac OS X](https://www.python.org/downloads/mac-osx/)
Homebrew (公式ページ): [Homebrew](https://brew.sh/)
TensorFlow (公式ページ): [Installing with virtualenv](https://www.tensorflow.org/install/install_mac#installing_with_virtualenv)
virtualenvについて：
- [pyenvが必要かどうかフローチャート - Qiita] (http://qiita.com/shibukawa/items/0daab479a2fd2cb8a0e7)
- [virtualenvでpython3の環境を作成する際のコマンド - Qiita](http://qiita.com/tackey/items/a5e1ab29c8152fcc5da6)
pip関連：
- [Python アプリ依存パッケージ管理 ベストプラクティス集 - Qiita] (http://qiita.com/zakuro9715/items/68c8d8c6b1b05f91fa2e)
- [pipで一括アップデート（確認付き） - Qiita](http://qiita.com/kkdd/items/2a0e703929d1b2d7a793)
Javaソース内のコメント

Eclipse + GITみたいな環境で
多人数でJavaを開発しているとレビュー指摘だったり
要件待ち、不具合だったりするものをコード内にコメントとして
残しておくと便利だったりします。

その際に使うコメント、過去、あまり気にしてこなかったのですが
最近よく使うようになってきたので、備忘録として残しておきます。

# コメントの意味
* TODO:hogehoge<br />
⇒　要件待ちで実装できないものやそもそも、未実装なもの。
* FIXME:hogehoge<br />
⇒　コードが間違っていて修正が必要なもの。<br />
　　また、Interfaceクラスに対して、APIを追加し、別の人に実装してもらうもの<br />
　　その場合<br />
　　　FIXME:○○さん hogehoge<br />
　　という使い方をする。
* XXX:hogehoge<br />
⇒　基本的には不具合。ただし、正常ケースでは問題は起こらないものに対して使う<br />
　　使用用途は限定的。

※ hogehoge には任意でコメントを記載する

# コメント箇所の確認方法
Eclipse の場合<br />
１．メニューの[ウィンドウ]->[ビューの表示]->[その他]を選択
２．表示された子画面で、[一般]フォルダを選び、[タスク]ビューを選択
３．タスクビューの[▽]をクリックし、[内容の構成]を選ぶ
４．確認したいコメントの内容で構成を作成する
　　この時、[スコープ]を設定すると、特定のプロジェクトのみに絞り込むことも可能
　　(たくさんのプロジェクトで作業している場合に便利)
　　※　ワーキング・セットを使用すると、任意の複数プロジェクトを
　　　　絞り込み対象とすることができる
MySQLでchained replicationを構成する


#はじめに
MySQLでchained replicationを構成してみます。
chained replicationとは、
`master -> slave1 -> slave2`
のような構成です。
このとき、slave1はslave2にとってのmasterでもあります。

#前提
- MySQL5.6以降
- レプリケーション用ユーザ：repl



#必要な設定
通常のレプリケーションに必要な設定（バイナリログ書き出し）に加えて、`log_slave_updates`が必要になります。
これは、デフォルトではslaveがmasterから受け取った更新情報をバイナリログに書き出さないためです。
https://dev.mysql.com/doc/refman/5.6/ja/replication-options-slave.html


##master
```Bash:my.cnf
[mysqld]
server-id=1
expire_logs_days = 30 #任意です
binlog_format = mixed
log-bin = mysql-bin
sync_binlog = 1 #任意です
log_slave_updates #masterには不要ですが、将来的にslaveになれるよう、有効にしておきます
read_only = 0
```
##slave1
```Bash:my.cnf
[mysqld]
server-id=2
expire_logs_days = 30 #任意です
binlog_format = mixed
log-bin = mysql-bin
sync_binlog = 1 #任意です
log_slave_updates
read_only = 1 #安全のため
```
##slave2
```Bash:my.cnf
[mysqld]
server-id=3
expire_logs_days = 30 #任意です
binlog_format = mixed
log-bin = mysql-bin
sync_binlog = 1 #任意です
log_slave_updates
read_only = 1 #安全のため
```

#構築手順
##master
/etc/my.cnfの設定は完了しているものとする
レプリケーション構築のため、dump

```Bash:master
$ mysqldump -uroot -p \
   --all-databases \
   --opt \
   --flush-logs \
   --add-drop-table \
   --single-transaction \
   --master-data=2 \
 | gzip > /tmp/master.gz
```
上記ファイルをslave1に転送する

##slave1
/etc/my.cnfの設定は完了しているものとする
ダンプデータのログファイル名とポジション情報を確認

```Bash:slave1
$ zcat /tmp/master.gz | head -n 25
 
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.XXXXXX', MASTER_LOG_POS=XXX;
```
masterのダンプデータをインポート

```Bash:slave1
$ zcat /tmp/master.gz | mysql -uroot -p
```

レプリケーション設定

```Bash:slave1
$ mysql -uroot -p
mysql>
change master to
master_host='MASTER_IP',
master_user='repl',
master_password='PASSWORD',
master_log_file='mysql-bin.XXXXXX',
master_log_pos=XXX;
```

レプリケーション開始

```Bash:slave1
mysql> start slave;
```

スレーブの状態確認

```Bash:slave1
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
...snip...
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
```

レプリケーション構築のため、dump

```Bash:slave1
$ mysqldump -uroot -p \
   --all-databases \
   --opt \
   --flush-logs \
   --add-drop-table \
   --single-transaction \
   --master-data=2 \
 | gzip > /tmp/slave1.gz
```
上記ファイルをslave2に転送する

##slave2
/etc/my.cnfの設定は完了しているものとする
ダンプデータのログファイル名とポジション情報を確認

```Bash:slave2
$ zcat /tmp/slave1.gz | head -n 25
 
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.XXXXXX', MASTER_LOG_POS=XXX;
```
slave1のダンプデータをインポート

```Bash:slave2
$ zcat /tmp/slave1.gz | mysql -uroot -p
```
レプリケーション設定

```Bash:slave2
$ mysql -uroot -p
mysql>
change master to
master_host='SLAVE1_IP',
master_user='repl',
master_password='PASSWORD',
master_log_file='mysql-bin.XXXXXX',
master_log_pos=XXX;
```
レプリケーション開始

```Bash:slave2
mysql> start slave;
```

スレーブの状態確認

```Bash:slave2
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
...snip...
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
```
【質問】SpringSecurityを使用した①認可コード②アクセストークンの桁数の変更

###実現したいこと
Spring Securityで認証・認可システムを作っております。認可コード、アクセストークンの桁数を増やしたいのですが、拡張方法はありますでしょうか。ご教示お願い致します。
Linuxシェル -- 踏み台などで他のApacheの起動状態を取得する例

以下に、記述。

```shell
#!/bin/bash

ssh -o ConnectTimeout=2 linux_user@your_server ps -lef | grep ' apache ' | grep '/usr/sbin/httpd' > /tmp/check_apache_run.txt

if [ -s /tmp/check_apache_run.txt ]; then
  echo "FILE SIZE != 0" 
  echo "Yourサーバー(Apache) ok" >> /tmp/check_apache_run_report.txt
else
  echo "FILE SIZE = 0" 
  echo "Yourサーバー(Apache) 【停止】状態" >> /tmp/check_apache_run_report.txt
fi

```