OmniAICreator/Qiita-1.07M huggingface dataset:
Firebase iOS SDKが刷新されましたよっていう話し

ふと案件でAndroid向けに作ってたちょっとしたアプリをiOSに移植しようとしたら、
Firebaseの使い方が大きく変わっててネット上の情報がまるで役に立たない状況に陥ってて焦りましたよっていう愚痴です(´・Д・)

調べると、まさに昨日更新された模様。。
![スクリーンショット 2017-05-18 17.20.21.png](https://qiita-image-store.s3.amazonaws.com/0/16981/5ca1f8dc-5d4f-e123-03c6-8990f28980df.png)

破壊的変更内容は。。。
詳細はこちら：https://firebase.google.com/docs/reference/ios/naming-migration-guide

```
The following changes have been made to the Swift SDK across all Firebase products:

Removing the FIR prefix across names for all constants, protocols, classes, enums, and type definitions.
Renaming FIRApp to FirebaseApp.
Renaming FIROptions to FirebaseOptions.
For a full list of the changes, see the detailed list of changes section.
```

クラス名めっちゃ変わるぅぅ( ﾟдﾟ)

#本題
とりあえずやりたかったことは、Databaseへの格納だけだったので、
変更点は下記の通りです。
# 初期化時
before

```swift
import UIKit
import Firebase

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        FIRApp.configure()
        return true
    }
}
```
after

```swift
import UIKit
import Firebase

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        FirebaseApp.configure()
        return true
    }
}
```

# データ投入時
before

```swift
import UIKit
import Firebase

class MainViewController: UIViewController {

    func yourmethod() {
        let firebaseRef = Firebase(url: "https://<your-firebase>.firebaseio.com")  
        let messageData = ["example": "data"];
        firebaseRef.childByAutoId().setValue(messageData)
    }
}
```
after

```swift
import UIKit
import Firebase

class MainViewController: UIViewController {

    func yourmethod() {
        let firebaseRef = Database.database().reference(fromURL: "https://<your-firebase>.firebaseio.com")
        let messageData = ["example": "data"];
        firebaseRef.childByAutoId().setValue(messageData)
    }
}
```

以上、近々で焦ってる人向けの記事でした(=ﾟωﾟ)ﾉ

#追記
そういえば、丁度Google I/Oやってるんだったな(；´∀｀)
別アプリケーションからProcessクラスのCloseMainWindow()メソッドを使用してウィンドウを閉じる際に、終了確認用メッセージボックスを出力しないようにする

Windowsフォームアプリケーションで、閉じるボタン(ウィンドウ右上の×ボタン)を押した際に終了確認用メッセージボックスを出力したい場合があると思います。しかし、別のアプリケーションから`Process`クラスの`CloseMainWindow()`メソッドを実行してウィンドウを閉じる場合は終了確認用メッセージボックスを出力したくない場合もあるかと思います。その対処法を記述します。

## 動作確認環境
- Windows10
- C# 5.0
- .NET FrameWork 4.5

## サンプル

```csharp:MainForm.cs
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.UserClosing)
    {
        var text = "閉じてよろしいでしょうか？";
        var caption = "確認";
        if (MessageBox.Show(text, caption, MessageBoxButtons.YesNo) == DialogResult.No)
        {
            var piCloseReason = this.GetType().GetProperty("CloseReason", BindingFlags.Instance | BindingFlags.SetProperty | BindingFlags.NonPublic);

            piCloseReason.SetValue(this, CloseReason.None, null);
            e.Cancel = true;
        }
    }
}
```

`CloseMainWindow()`メソッドが実行されると`CloseReason`プロパティに`CloseReason.TaskManagerClosing`がセットされます。
しかし、先に閉じるボタンを押して、表示されるメッセージボックスで「いいえ」ボタンを押してクローズ処理をキャンセルする等して`CloseReason`プロパティに`CloseReason.None`以外がセットされると、`CloseMainWindow()`メソッドが実行されても`CloseReason`プロパティに`CloseReason.TaskManagerClosing`がセットされません。
そこで、クローズ処理がキャンセルされた場合は、リフレクションを使用して`CloseReason`プロパティに`CloseReason.None`をセットしています。
これで期待通りの動作を実現できました。

## 参考
[Reference Source - Microsoft](https://referencesource.microsoft.com/)


不備がございましたら、ご指摘いただければ幸いです。
DataFrame の列から特定のタイプ（str, float etc）の列を探す方法

# DataFrame の列から特定のタイプ（str, float etc）の列を探す方法


|        |       Age |    City   | 
|:--------------:|:---------------:|:------------------:|
| 0            |              21 |        Tokyo       |

というデータフレームがあった場合。

## bool値で返す場合

```python:

df.dtypes == object

>>
Age False
City True
dtype: bool

```

## 列を返す場合

```python:

df.loc[:, df.dtypes == object]

>>
    Age    City
0   21    Tokyo

```


## 列の名前をリストに格納する場合

```python:

mylist = list(df.select_dtypes(include = ['object']).columns)

mylist 

>>
['City']


```
C/C++のファイル操作速度比較

C++は最速！！と思い込んでいました。ネットで「Cのべた書きとSTLはどっちが速い」なんて、C++速いぞって記事をたまに見かけるでしょう。
しかし実際にfstreamを使ったファイルコピーを書いてみたら、C++、意外に遅いか？という結果に・・・。具体的にどれぐらい違うのかC標準ライブラリとの実行速度の比較を行なってみました。

# 環境
使用したのはVisualStudio 2008。VS2013でもあまり変わらないみたいです。

# コード
比較したコードは下記の４つ。いづれも入力ファイルから出力ファイルへバイナリコピーします。エラー処理は省いています。

## 1:streambuf_iteratorとcopy()を使う

```C++:C++
void CopyFile( const char *from_file_name, const char *to_file_name )
{
	ifstream is( from_file_name, ios::in | ios::binary );
	ofstream os( to_file_name, ios::out | ios::binary );

	// ファイルコピー
	istreambuf_iterator<char> iit(is);
	istreambuf_iterator<char> end;
	ostreambuf_iterator<char> oit(os);
	copy( iit, end, oit );
}
```
## 2:fstream::rdbuf()と<<を使う

```c++:C++
void CopyFile( const char *from_file_name, const char *to_file_name )
{
	ifstream is( from_file_name, ios::in | ios::binary );
	ofstream os( to_file_name, ios::out | ios::binary );

	// ファイルコピー
	os << is.rdbuf();
}
````

## 3:fstreamとバッファ(1MB)を使う

```c++:c++
void CopyFile( const char *from_file_name, const char *to_file_name )
{
	ifstream is( from_file_name, ios::in | ios::binary );
	ofstream os( to_file_name, ios::out | ios::binary );

	// バッファ確保
	vector<char> buffer( 1024*1024 );
	// ファイルコピー
	while( !is.eof() )
	{
		size_t size = is.read( &buffer[0], buffer.size() ).gcount();
		os.write( &buffer[0], size );
	}
}
```
## 4:Cの標準ライブラリとバッファ(1MB)を使う
```C++:C++
void CopyFile( const char *from_file_name, const char *to_file_name )
{
	FILE *fpr = fopen( from_file_name, "rb" );
	FILE *fpw = fopen( to_file_name , "wb" );

	// バッファ確保
	vector<char> buffer( 1024*1024 );
	// ファイルコピー
	while( !feof( fpr ) )
	{
		size_t size = fread( &buffer[0], 1, buffer.size(), fpr );
		fwrite( &buffer[0], 1, size, fpw );
	}
	fclose( fpr );
	fclose( fpw );
}
```

# 結果

Cの標準ライブラリが数倍速いです。


|コード| 処理時間・キャッシュなし (ms) | 処理時間・キャッシュあり(ms)|
|--------|----------:|---:|
|1:streambuf_iteratorとcopy()|2,400|2.000|
|2:fstream::rdbuf()と<<|2,000|1,900|
|3:fstreamとバッファ|1,200|500|
|4:Cの標準ライブラリ|650|90|

「キャッシュなし」はファイルのメモリへの初回読み込み、「キャッシュあり」は２回目以降の読み込みです。「キャッシュあり」はあまり意味がないと思ったのですが、速度差が大きいので載っけておきました。

キャッシュなしで比較すると、１or２(fstream+algorithm)と３(fstream)の速度比がおおざっぱに２倍、３(fstream)と４(Cライブラリ)の速度比も２倍ですから、fstream遅いわ、`copy()`,`<<`等のアルゴリズム遅いわで、両者の共犯でこの速度差になっていると推測できます。

（測定条件）130Mバイトのファイルを使用。x86。普通のリリースモード（速度最適化）。処理時間は多少ばらつくので数回実行して目分量で丸めています。

# まとめ
CとC++(fstream)で数倍の差が出たのはちょっと驚きでした。
速度を求めるときfstreamは使用できませんね。

# 番外：C# 
C#でも同様のコードを書いて試してみました。

```C#:C#
private static void CopyFile( string from, string to )
{
	using( BinaryReader br = new BinaryReader( File.OpenRead( from ) ) )
	using( BinaryWriter bw = new BinaryWriter( File.OpenWrite( to ) ) ) 
	{
		// ファイルコピー
		while(true)
		{
			byte[] buf = br.ReadBytes( 1024*1024 );
			if( buf.Length == 0 )
				break;
			bw.Write( buf );
		}
	}
}
```
|コード| 処理時間・キャッシュなし(ms) |処理時間・キャッシュあり(ms)
|--------|----------:|----------:|
|C#|650|130|
速い。Cライブラリに肉薄。
AWSアカウントを作成して、はじめにすること


一番最初にしておきたいことをまとめていきます。

# １．MFA（Multi-Factor Authentication）の設定
AWSアカウントを作成するとrootでログインされます。
rootが乗っ取られれないようにMFAの設定は必ずやっておきたいと思います。
以下は、その手順です。
## MFAデバイスの用意
公式のMFAページ https://aws.amazon.com/jp/iam/details/mfa/

### 仮想MFAデバイス
専用のMFAデバイスを購入するほどでもないので、手元のスマートフォンを仮想MFAデバイスとして使用したいと思います。
以下から、MFAアプリケーションをインストールします。

![Kobito.PBL4mn.png](https://qiita-image-store.s3.amazonaws.com/0/176986/4c40b6e7-4b64-3169-352d-0aafae880bcd.png "Kobito.PBL4mn.png")


## IAM(Identity & Access Management)コンソールを表示
* 次にIAMコンソールからMFAの設定をしていきたいと思います。

![Kobito.xZW6Wa.png](https://qiita-image-store.s3.amazonaws.com/0/176986/da7a0d5d-55dd-edca-3025-f4109a6ba500.png "Kobito.xZW6Wa.png")


「ルートアカウントのMFAを有効化」を選択する

![Kobito.EGJ2EL.png](https://qiita-image-store.s3.amazonaws.com/0/176986/b3d77e1c-2b95-c0e4-4086-d14ee102fc20.png "Kobito.EGJ2EL.png")


![Kobito.qF3Fsw.png](https://qiita-image-store.s3.amazonaws.com/0/176986/652ca30b-3318-0b29-222c-5d3817e46638.png "Kobito.qF3Fsw.png")

用意した仮想MFAデバイスでQRコードを読み込むと数字が表示されます。
時間が経つと数字が変わるので気をつけてください。

「認証コード１」に数字を入力したら、次に表示される数字を「認証コード２」に入力して「仮想MFAの有効化」をクリックしてください。


## 再ログインする
次回移行ログインするときは、MFAの確認を要求されるので仮想MFAデバイスに表示されている数字を入力してください。
※ MFAの仮想デバイスの管理には気をつけてください。

# ２．ユーザーアカウント（IAMユーザー）を作成する
通常使用するようにアカウントを作成したいと思います。

![Kobito.JtGo41.png](https://qiita-image-store.s3.amazonaws.com/0/176986/23c45ba8-1448-7ddf-c88d-a90ca7d02a82.png "Kobito.JtGo41.png")

IAMコンソールの←メニューから「ユーザー」を選択して、「ユーザーを追加」をクリックする

![Kobito.x1CcjW.png](https://qiita-image-store.s3.amazonaws.com/0/176986/8a01fee8-7e62-870a-ff99-096687d77962.png "Kobito.x1CcjW.png")

ユーザ名を入力して、完了画面を表示する。
![Kobito.3Kw2vo.png](https://qiita-image-store.s3.amazonaws.com/0/176986/16ecd193-ab2f-70a3-d545-2844169e5d88.png "Kobito.3Kw2vo.png")

アクセスキー、シークレットアクセスキー、パスワードを保持して、別ブラウザでログインをする。

![Kobito.SEtuFi.png](https://qiita-image-store.s3.amazonaws.com/0/176986/29236241-f00d-7cce-1860-12fec1b4f68b.png "Kobito.SEtuFi.png")

最後に権限を付与する

# ３．CloudTrailの設定
操作ログを記録するようにしたいと思います。

![Kobito.A9Mtrw.png](https://qiita-image-store.s3.amazonaws.com/0/176986/504d3330-f3f9-be29-ff94-a6c60114cd93.png "Kobito.A9Mtrw.png")

![Kobito.x9PIKJ.png](https://qiita-image-store.s3.amazonaws.com/0/176986/6e0ca75e-337b-1873-44c4-2fb43312a5cf.png "Kobito.x9PIKJ.png")


# ４．開発環境の設定
CLIをローカルの環境にインストールします。

```
sudo pip install awscli

```

インストール時に以下のエラーが発生

```
DEPRECATION: Uninstalling a distutils installed project (six) has been deprecated and will be removed in a future version. This is due to the fact that uninstalling a distutils project will only partially uninstall the project.
    Uninstalling six-1.4.1:
    
```

以下のコマンドで無事にインストール完了
こちらを参考：https://saku.io/failed-to-install-awscli-on-mac/


```
sudo -H pip install awscli --upgrade --ignore-installed six
```
QAチームの意義

## 背景
QAチーム立ち上げを提案するために意義をまとめた。
僕自身はQAの専門家ではないのでその点はご注意を。

## 開発効率の向上効果

- バグの発生を減らすことで、それまでバグ対応していた時間を新規開発に当てられるようになる
- リグレッションテストの設計改善を行うことでリリースにかかる固定のコストが減らせる
- 緊急リリースが必要なバグの発生を減少させ、リリース回数を減らせる
- 品質とコストをマネジメントできる

## 視点、役割、専門性の違い
- テスト技術は専門性が高いため、開発を主とするエンジニアが片手間に高いレベルの技術を身につけることはできない
- ハイレベルのテストエンジニアが指導することで、エンジニアの作成するテストの品質を効果的に底上げできる
- PM、エンジニアはリリースすることへの意識が強くなりリスクを軽視してしまうバイアスを持ちやすいが、QAというロールを別途設けることでリスクを客観的に判断できるようになる
- 障害を分析することで、リスクの高い箇所に効果的なアプローチを行える

## 職務
- テストプロセスの設計・改善
- テスト設計技法の教育
- テスト設計
- テストレビュー
- リスク分析
- 品質アセスメント
- 技術やツールの調査/導入
LeaveOneOut交差検証を用いて単回帰モデルの性能を評価する

# はじめに

量の少ないデータ量を用いて分析を行った際に、モデルの評価方法としてLeaveOneOut交差検証を用いたので、共有します。

LeaveOneOut交差検証では、あるnサンプルのデータについて、1サンプルをテストデータ、その他をトレインデータとして用いて、トレーニングとテストを実施します。
そして、テストデータを入れ替えながらこれをn回繰り返し、モデルの性能を評価するというものです。
k分割交差検証でいえば、kをデータ量のnサンプルと同じ値にしたものになります。
データ量が少ない場合に用いられるそうです。

下記では単回帰をLOO法で評価してみます。

# コード

あるDataFrameがあり、その中から単回帰に用いる説明変数を`loo_column`で指定しています。
DataFrameの`mokuteki`に目的変数が入っているとします。
データを入れ替えながらn回学習を行い、最終的に`RootMeanSquaredError`を計算し返します。
単回帰には`statsmodels`を用いています。

```loo.py
from sklearn.model_selection import LeaveOneOut
from statsmodels import api as sm

loo_column = "setsumei"

def loo_rmse(df,loo_column):
    loo_X = df[loo_column]
    
    # 単回帰の定数項を作成します。
    loo_X = sm.add_constant(loo_X)
    loo_y = df_analytics["recognition"]

    loo = LeaveOneOut()
    loo.get_n_splits(loo_X)

    # square_errorを保存するリスト
    se_list = list()
    
    # trainとtestに用いるデータのindexを入れ替えながらデータ分くりかえす
    for train_index, test_index in loo.split(loo_X):
        X_train, X_test = loo_X.iloc[train_index], loo_X.iloc[test_index]
        y_train, y_test = loo_y.iloc[train_index], loo_y.iloc[test_index]
        
        # 単回帰の学習
        model = sm.OLS(y_train,X_train)
        result = model.fit()
        
        # 学習結果を元にtestデータに対して予測。誤差を得る。
        pred = result.params["const"] + result.params[loo_column] * X_test[loo_column].values[0]
        diff = pred - y_test.values[0]
        
        # 誤差を二乗して保存
        se_list.append(diff**2)

    # 二乗誤差を平均し、ルートを取って返す
    ar = np.array(se_list)
    print("RMSE:",np.sqrt(ar.mean()))
```

# 参考

http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.LeaveOneOut.html


ありがとうございました。
Rancher meetup #6

# Rancher meetup #6

2017/05/17(水) 18:30 〜 21:00

`個人の所感です`

## Rancherを活用して開発効率を上げる on IIJ

https://www.slideshare.net/MichitakaTerada/rancher-76015488

IIJ の中で s3 互換のストレージサービスに Rancher を利用

モチベーション

- ストレージサービスのリリースが手作業
- 検証環境を高速に作りたい
- オーケストレータが選べる

結果

- 検証の気軽さが増した
- 丸ごと環境を作成して作り直しが楽
- つまり PaaS の基盤

## Rancherを使った開発事例の紹介 on Recruit Technologies

https://www.slideshare.net/recruitcojp/rancherrancher

メリット

- ログ見るの楽
- 権限管理が楽(LDAP 連携)
- コンテナ環境全体のバージョン管理ができるのでバージョン不整合を回避、トラブル再現も楽

## オンプレと public cloud を VPN で繋いで Rancher でシームレスに管理 on スーパーソフトウェア

https://capsulecloud.io/blog/aws/4647
https://capsulecloud.io/blog/aws/4609


気軽にハイブリッドを管理できるという意味でいいかも

`SofTalk で喋らせながらムービーでスライド紹介という斬新な表現手法、発表者は大阪で会場には現れず`

## Longhorn (分散ブロックストレージ) 紹介とDockerCon '17フィードバック

盛り上がってたらしい、 Longhorn はまだ Production では使えるレベルではない。
Cattle じゃなくて Swarm でしか現状動作しない 

## 都内にRancherショールーム開設

牛に会えるらしい

## 所感

Pros

- オーケストレータ層は色々選択できる
- サーバーの払い出しの方が楽になりそう
- カタログは自作できる
- 新しいメンバーが入った時に気軽に壊していい環境が作成できる
- Kubernetes や Swarm の構築が面倒だけど Rancher にお任せ
- Hadoop Cluster とかもあった

Cons

- HA 構成とかどうするんだろう
- Document ない
- Cattle 内部 LB の over head どうなんだろう
Linuxサーバーの時刻・時計がおかしいぞ？

さくらインターネット社のデーターセンターメンテナンスがありました。

さくらVPSで借りたLinuxサーバーの時間がおかしくなっていてデプロイ出来ないって事があり、時刻合わせのお仕事をいただいたので、その時のメモ。

# 時刻の確認
```terminal
$ date
Thu May 18 16:10:27 JST 2017
$ sudo hwclock -r
Thu May 18 16:10:43 2017  -0.999303 seconds
```

`date`すると、2時間くらい遅く表示されていて、ハードウェア時刻ってのと合わない状況になっておりました。

# 修正方法

```
$ sudo ntpdate ntp.nict.jp
$ sudo /etc/init.d/ntpd start
$ sudo /etc/init.d/ntpd status
ntpd (pid  398) is running...
```

他のサイトだと`ntpd`が動いてて`stop`させてからってのが手順になってるんだけど、私の場合は`stop`してた。
後は`CentOS7`だと`systemctl start ntpd`で起動かな。注意ですね。

後は、自動起動スクリプトを設定して終了です。

```
$ sudo chkconfig ntpd on # 私の場合は既に設定されてた。
$ chkconfig --list ntpd
```
HTMLタグだけで PDF を埋め込み表示する方法


今だと、PDF ファイルのページ中の表示を、何も特殊な JS ライブラリを使わずに、HTML だけで埋め込めることが出来るようになったそうです。

ただし iOS の Safari だけ、iOS 10 まで確認しているのですが、うまく表示されないようです。

参考
https://pdfobject.com/static.html


# object を使う方法

```
<object data="pdf.pdf#page=2" type="application/pdf" width="100%" height="100%">
   <p><b>表示されない時の表示</b>: <a href="pdf.pdf">PDF をダウンロード</a>.</p>
</object>
```

## concrete5 CMS

concrete5 CMS でも無料アドオンがあります。

PDF Viewer
https://www.concrete5.org/marketplace/addons/pdf-viewer1

こちらも object を使ってシンプルに PDF を埋め込み表示してくれるアドオンです。

# embed を使う方法

```htm
<embed src="pdf.pdf#page=2" type="application/pdf" width="100%" height="100%">
```

# iframe を使う方法

```html
<iframe src="pdf.pdf#page=2" width="100%" height="100%">
   <p><b>表示されない時の表示</b>: <a href="pdf.pdf">PDF をダウンロード</a>.</p>
</iframe>
```

# object の中に iframe をいれて、できるだけたくさんのユーザーに対応

```html
<object data="pdf.pdf#page=2" type="application/pdf" width="100%" height="100%">
	<iframe src="pdf.pdf#page=2" width="100%" height="100%">
   	<p><b>表示されない時の表示</b>: <a href="pdf.pdf">PDF をダウンロード</a>.</p>
	</iframe>
</object>

```

# PDF.js を利用する

iOS などでもどうしても表示させたい場合は、[PDF.js](https://qiita.com/nissuk/items/01d0490e19dff6e19a03)というものがあるそうです。

情報提供: @heresist さん
IFTTT,GAS,Line-notifyを使ってボタン１プッシュでLineに直近のバス情報を通知する

# はじめに
最近、バス通勤になった
→バスなんて10分に１本くらいあるやろ、余裕やしww
→5分前に出ました。次は50分後です
→Oh...

てなことがあって、バスの時刻表をカメラで撮って、毎回確認してたが、
フォトアプリを起動
→該当の写真を探して開く
→現在の時間と時刻表を照らし合わせて直近のやつを探す

というメンドクサイ作業を毎回やっていた。

アプリを作ってもいいが、かなーりニッチな要求だしGoogle Playに公開するのもイケテナイし、iPhoneとかでも使えると嬉しいなぁと思っていたところ、

なんやかんやあって**IFTTTとGASとLineNotifyを連携させればいけんじゃねー？**となって作って見た。

# ざっくり全体図と実装方針
![kouseizu.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/76726/2c73a9f5-2cdd-d169-350c-3a8508d796de.jpeg)

実質コードを書いたのはGAS部分だけってのがイイ

## 実装方針
- IFTTT側からGASにイベントを送る場合は、Maker Web hooksを使う。これでPOSTでデータを送れる
- GAS側はウェブアプリケーションとして公開することでGETやPOSTでデータを受け付けられるようにする
- LineNotifyでは自分のみの通知を行うようにするため、Tokenを作って、GASからはそれを使って通知を送る
- 時刻表はあらかじめGoogle Spread Sheetに書いておく(手動)

# GASの実装
[Gist](https://gist.github.com/kiuchikeisuke/fcf4c7015cf3bc4cfbc2c0c084e93016)にコードをあげたのでこっちを参照(一部やっつけ実装がある)

## コード上に無い仕様てきなやつ
- Web hooksからは`terminal=sibuya` `terminal=tokyo` がパラメータとして渡って来る想定
- SpreadSheetのシート名は「sibuya」と「tokyo」になってる想定
- SpreadSheetの**１行目**に平日の時刻が「6:10」「6:20」・・・といった感じで書かれている。同様に**2行目に土曜日**の時刻が、**３行目に日曜日**が書かれている

## 処理の流れ
Webhook側からdoPost(e)がキックされるとパラメータとして持ってる`terminal`の情報を抜き出し、現在時間と合わせて`generateResentBusMsg`に渡す。
`getSheet`で該当の時刻表の書かれているシートを取得する。
その後、現在時間と時刻表を照らし合わせ、直近のバスの時刻と次発のバスの時刻を割り出す
最後にnotify2LineメソッドでメッセージをLINEに送る

## 定数について
LINEToken→https://notify-bot.line.me/my/ ログインしたらマイページからアクセストークンを発行する。トークン名が長いとメッセージを圧迫するので短い方がよさげ
spreadSheetId→GoogleSpreadSheetを開いた時のURLに含まれてる。それをコピペすればOK
`https://docs.google.com/spreadsheets/d/{spreadSheetId}/~`

## 公開方法
Google Apps Scriptの編集画面の「公開」→「ウェブアプリケーションとして導入」をクリック。ボタンぽちぽち押せば公開用URLが発行されるのでコピー
なお、何かしらの更新をした場合、バージョンは「新規作成」を選択しないとなぜか更新されなかった。

# IFTTTの設定
this→「Button widget」を選択。できることが一つしかないので迷うことはない
that→「Maker Webhooks」を選択。
その後、*URL*に**GASの公開URL**を貼り付け、
*Method*に**POST**を選択、
*Content Type*に**application x-www-form-urlencoded**を選択、
*Body*に**terminal=shibuya** or **terminal=tokyo**を設定。`terminal=shibuya`にしたらボタンを押したら渋谷のバス停の情報を取得、`terminal=tokyo`なら東京のバス停の情報、みたいな感じ。
設定したら名前を任意に決めて保存。ここの名前がそのままウィジェットの名前になる

# Lineの設定
LINEアプリにて「LineNotify」と友達になっておく。

# Android側の設定
ウィジェットからIFTTTを選び、作成したバス停ウィジェットを配置する
Ruby on Rails resourcesメソッドのネスト例

Ruby on Rails　ルーティングに関して、```resourcesメソッド```の整理。
```resouresメソッド```とは、7つのアクションへのルーティングをまとめて表記できるもの。
ルーティングを一つ一つ手打ちすることも可能だけど、```resourcesメソッド```はよく使う機能のルーティングがひとまとめになっていて便利。
参考文献：<a href="http://railsdoc.com/references/resources">Rails公式ドキュメント　</a>


#resourcesメソッド使用例(ネストなし)
ネストなし、tweetsコントローラのみ。

```ruby:routes.rb
Rails.application.routes.draw do
  resources :tweets
end

# の'resources :tweets'はすなわち

GET    '/tweets'          => 'tweets#index'   # 一覧画面を生成
GET    '/tweets/:id'      => 'tweets#show'    # 詳細画面を生成
GET    '/tweets/new'      => 'tweets#new'     # 登録画面を生成
POST   '/tweets/create'   => 'tweets#create'  # 登録処理
GET    '/tweets/:id/edit' => 'tweets#edit'    # 編集画面を生成
PUT    '/tweets/:id'      => 'tweets#update'  # 更新処理
DELETE '/tweets/:id'      => 'tweets#destroy' # 削除処理

```
createはPOST、その他PUT・GETなどは自分で編集せずとも自動的にそのように設定されている。
便利なフレームワーク。


#resourcesメソッド使用例(ネストあり)
ネストあり、tweetsコントローラに加えて、commentsコントローラとusersコントローラ。

```ruby:routes.rb
Rails.application.routes.draw do
  # 実際はここに devise_for :users (ログイン・ログアウト機能など)
  resources :tweets do
    resources :comments, only: [:create]
  end
  resources :users, only: [:show]

end

# の'resources :tweets　〜　only: [:show]'はすなわち

GET    '/tweets'          => 'tweets#index'   # 一覧画面を生成
GET    '/tweets/:id'      => 'tweets#show'    # 詳細画面を生成
GET    '/tweets/new'      => 'tweets#new'     # 登録画面を生成
POST   '/tweets/create'   => 'tweets#create'  # 登録処理
GET    '/tweets/:id/edit' => 'tweets#edit'    # 編集画面を生成
PUT    '/tweets/:id'      => 'tweets#update'  # 更新処理
DELETE '/tweets/:id'      => 'tweets#destroy' # 削除処理

POST   '/tweets/:id/comments' => 'comments#create' # ツイートにコメント

GET    '/users/:id'       => 'users#show'     # ユーザーのマイページを表示 

```
SQL Server テーブル一覧取得いろいろ

# SQL Serverでテーブル一覧に関する情報を取得する。
## テーブル一覧取得
```SQL:全テーブル取得
select * from sys.objects;
```
```SQL:ユーザーテーブルだけ
select * from sys.objects where type = 'U';
```
```SQL:特定(hoge)のスキーマ配下だけ
select * from sys.objects where schema_id = schema_id('hoge');
```
##テーブルの行数を一括で求める（PostgreSQL風）
```SQL:特定(hoge)のスキーマ配下のテーブルの行数を求める
select
  schema_name(SYSOBJ.schema_id) as schemaname,
  SYSOBJ.name as relname,
  SINDEXES.rows as n_live_tup
from sys.objects as SYSOBJ inner join sys.sysindexes as SYSINDEXES on
  SYSOBJ.object_id = SYSINDEXES.id and
  SYSINDEXES.indid < 2
where SYSOBJ.type = 'U'
  and schema_name(SYSOBJ.schema_id) = 'hoge'
order by SYSOBJ.name; 
```
git/ssh - ssh リモートホストのユーザーや root でローカルの git ユーザー名やメールアドレスを渡して使わせる方法


参考URL

- ["Correct user names when tracking /etc/ in git repository and committing as root - Server Fault"](http://serverfault.com/questions/256754/correct-user-names-when-tracking-etc-in-git-repository-and-committing-as-root)


# 概要

タイトル通り、`ssh` 接続先のユーザーや `sudo` で `root` になって `git` を使うとき､ローカルの `git config` のユーザー名やメールアドレスを渡して使わせる方法。

## 経緯

`ssh` 接続先ユーザや `sudo -s` して `root` になって `git` を使うとき `git config` でユーザー設定したくないけどコミット時に `--author=` 書くのも面倒臭すぎるので調べた。


## 参考 URL 情報からの方針決定

`git` は以下の環境変数があればそれを参照してコミッターとオーサーをセットしてくれるらしい。

- `GIT_AUTHOR_NAME`
- `GIT_AUTHOR_EMAIL`
- `GIT_COMMITTER_NAME`
- `GIT_COMMITTER_EMAIL`

これを利用して、ローカルの `git` ユーザー情報を `ssh` 経由でリモートの環境変数に転送し、さらに `sudoers` で `root` になった時まで伝搬させる。

これを手順概要にすると以下の通り。

1. ローカル環境の `git` ユーザー情報を環境変数に `export`
2. `ssh` の `SendEnv` に (1) で `export` した環境変数を指定
3. リモート側の `sshd` と `sudoers` のコンフィグで (1) の環境変数を受け取る様に設定

リモート側はもちろん要 `root` 権限。


# 手順 & 作業内容


1. ローカル : `~/.bash_profile` に以下を追記

	```sh:~/.bash_profile
# .ssh/config で SendEnv するために環境変数をセットします。
export GIT_AUTHOR_NAME=`git config --get user.name`
export GIT_AUTHOR_EMAIL=`git config --get user.email`
export GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"
export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"
	```
	
	ローカル側は `git config` で `user.name`,`user.email` の設定が済んでいる事が前提です。

2. ローカル : `~/.ssh/config` に以下を追記

	```config:~/.ssh/config
	Host *
		SendEnv			GIT_*
	```
	
	Host の `*` すべての接続先のデフォルトという意味になるため、送出先ホストを固定したい場合ここを適宜変更する事。
	この辺の正確な設定方法は  `man ssh_config` 参照。
	
3. リモート : `/etc/ssh/sshd_config` に `GIT_*` を受け付ける設定を追記

    ```config:/etc/ssh/sshd_config
    # Accept git enviroment vars.
    AcceptEnv GIT_*
	```

4. リモート : `sudoers` 編集。リモートの `/etc/sudoers` に以下の設定を追加する。`visudo`で編集する事。

    ```config:/etc/sudoers
    Defaults    env_keep += "GIT_*"
    ```
    
    `root` にならないならこのフェーズはスキップして良い
    
5. ローカル & リモート : コンフィグリロード
	- ローカル

	    ```bash
	    $ source ~/.bash_profile
        ```
    あるいはコンソールの再起動
    - リモート
    	
        ```bash
        $ sudo service sshd restart
        ```
	
7. ssh ログインして確認する

    ```bash
    $ printenv | grep GIT_*
    ```


## 注意

面倒なので各種環境変数の伝搬指定を`GIT_*` のようにワイルドカード指定したが、もちろんワイルドカードを使わずに指定した方が安全。
シェスクリプトのパスワードを暗号化する

## この記事について
シェルスクリプトを書くとき、パスワードを平文で記載してしまいがちだが、
暗号化してセキュアにする手順

## 手順
秘密鍵 ~/.ssh/id_rsaを作成する

```
$ ssh-keygen
```

xxxxxという文字列を暗号化して pass.rsa に書き込むコマンド

```
echo 'xxxxx' | openssl rsautl -encrypt -inkey ~/.ssh/id_rsa > password.rsa
```

暗号化されたpassword.rsaファイルを復号化して表示するコマンド

```
openssl rsautl -decrypt -inkey ~/.ssh/id_rsa -in password.rsa
```

シェルスクリプト内に記載する方法

```
#!/bin/sh

# シェルスクリプトでの記載
PASSWORD=$(openssl rsautl -decrypt -inkey ~/.ssh/id_rsa -in password.rsa)
```

これでセキュアになる！


※
あとでもう少し整理する
Atomのバージョンを1.17.0にするとremote-sync パッケージが使えなくなる問題

Atomの[remote-sync](https://github.com/yongkangchen/remote-sync)は、scpやsftpを使って、Atom上のプロジェクトとサーバー上のディレクトリをカジュアルに同期してくれる、何かと便利なプラグインです。使っている方も多いのではないでしょうか。

かれこれ1年くらい愛用しており、今日もこれを使って作業をしようとしたところ、
プロジェクトツリーで右クリックすれば出てくるはずの remote-sync用の選択項目( `upload` とか`configure` とか]が出てこない・・・。

Atom自体や、パッケージのアップデートを試みるもダメ。

色々と調べてみたところ・・・。

# 公式のバグ報告と修正方法

Github公式にIssueが上がっていました。

[[Atom 1.17.0] Missing configuration option when right clicking project folder or specific file #388](https://github.com/yongkangchen/remote-sync/issues/388)

どうやら、ATOMがアップデートでプロジェクトツリーのDOM構造が変わった事による影響のようです。

(引用)

> [McNuggetSauce commented a day ago]
Okay so I digged into this a little bit. It's caused by the non-existing class name selector for the context menu.
>Selector used is .tree-view.full-menu but the menu container only now has tool-panel and tree-view. Adding the full-menu back using the developer tool of Atom in <div class="tool-panel tree-view full-menu" 
> tabindex="-1" style="" brings back the context menu item (just to test). Of course, appropriate selectors must be applied to the context.cson file to fix the problem. 

合わせて、解決法も掲載されていました。
まだ公式が対応していないとの事なので、 `~/.atom/packages/remote-sync/menus/context.cson` を直接修正すると良いそうです。

>[dtsdev commented 15 hours ago]
>@McNuggetSauce solution works like a charm. To fix issue "permanently" before it comes in update, open context.cson (.atom/packages/remote-sync/menus) and change the following lines:
>
>line 2: from 'atom-text-editor, .tree-view.full-menu .file':[ to 'atom-text-editor, .tool-panel.tree-view .file':[
line 13: from '.tree-view.full-menu .header.list-item':[ to '.tool-panel.tree-view .header.list-item':[
Restart Atom, done.

こちらを対応したところ、無事remote-syncが右クリックメニューから復活しました！

<img width="222" alt="スクリーンショット 2017-05-18 15.19.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/48843/c838a999-4473-cdd7-9225-70f65c027320.png">

# 修正内容

参考までに、修正後の `context.cson` を張っておきます。

```
'context-menu':
  'atom-text-editor, .tool-panel.tree-view .file':[
    label: 'Remote Sync',
    submenu:[
      {label: 'Upload File', command: 'remote-sync:upload-file'}
      {label: 'Download File', command: 'remote-sync:download-file'}
      {label: 'Diff File', command: 'remote-sync:diff-file'}
      {label: 'Delete File', command: 'remote-sync:delete-file'}
      {label: 'Monitor File (Upload on External Save)', command: 'remote-sync:monitor-file'}
    ]
  ]

  '.tool-panel.tree-view .header.list-item':[
    label: 'Remote Sync',
    submenu:[
      {label: 'Configure', command: 'remote-sync:configure'}
      {label: 'Upload Folder', command: 'remote-sync:upload-folder'}
      {label: 'Upload Folder Change', command: 'remote-sync:upload-git-change'}
      {label: 'Download Folder', command: 'remote-sync:download-folder'}
      {label: 'Diff Folder', command: 'remote-sync:diff-folder'}
      {label: 'Delete Folder', command: 'remote-sync:delete-folder'}
    ]
  ]
```

そのうち公式で修正パッチが出ると思いますが、それまではこの方法で対応してね、との事でした！
MySQLメモメモ


ユーザーの作成とログイン

	GRANT ALL ON データベース名.* to ユーザー名@接続元 identified by 'パスワード';

データベースの作成	
	
	CREATE DATABASE データベース名;

データベースの接続	 
	
	USE データベース名;

データベースの削除	
	
	DROP DATABASE データベース名;

テーブルを作成	
	
	CREATE TABLE テーブル名 (フィールド名 データ型, …);

ログイン	

	mysql -ユーザー名 -p テーブル名;

データベース内のテーブル一覧を取得	 
	
	SHOW TABLES;

テーブルのフィールドを確認		
	
	DESC テーブル名;

テーブルを削除	

	DROP TABLE テーブル名;

フィールドの追加	

	ALTER TABLE テーブル名 ADD カラム名 データ型;

フィールドの変更	

	カラム名を変更する場合
	ALTER TABLE テーブル名 CHANGE カラム名 新カラム名 データ型;

	カラム名を変更しない場合
	ALTER TABLE テーブル名 MODIFY カラム名 データ型;
	
フィールドの削除

	ALTER TABLE テーブル名 DROP カラム名;
	
テーブル名の変更

	ALTER TABLE テーブル名 RENAME 新テーブル名;
	
レコードの追加

	INSERT INTO テーブル名 (カラム名, ...) VALUES (値, ...);
	
レコードの更新

	UPDATE テーブル名 SET カラム名 = 値 [, ...] [WHERE 抽出条件];
	
レコードの削除

	DELETE FROM テーブル名 [WHERE 抽出条件]; 
	
	
レコードの並び替え

	SELECT カラム名, ... FROM テーブル名 ORDER BY カラム名;
プリンシプルオブプログラミングは初級プログラマのためのベストアルバムだ〜原則編〜

上田勲さんの「プリンシプルオブプログラミング」から学んだことを全7記事に分けるシリーズですが、本記事は第二弾の原則編です。

[〜前提編〜](http://qiita.com/toshimitsu-miyachi/items/f685d97dd5eba53612c3)
〜原則編〜（いまここ）
〜思想編〜
〜視点編〜
〜習慣編〜
〜手法編〜
〜法則編〜

#シンプルであるには、各要素の責務を最小限に抑え、要素同士の関連を単純化する

前回の記事の通り、コードは本質的に修正されうるものであるため、コードをシンプルに保たないと手入れが難しくなります。シンプルとは具体的に何かですが、クラスや関数の責務を最小限に抑えることとそれに対して適切な名前をつけることで分かりやすくすることと、それぞれがどんな従属関係になっているかなどを分かりやすくすることです。

また、要件を満たすために必要最低限なコードだけ書くことがいいとのこと。

#DRYは抽象化により実現する

Don't Repeat YourselfはRubyの原則で何度も出てきたのですが、カッコイイフレーズで好きです。ロジックを各関数にコピーしたり、制御文のブロックをコピーしたり、定数リテラルを直接コードに書くことが例示として挙げられています。コードをコピペしたくなったら足を止めて考えようと思います。

抽象化するには、思い切りというか、部品を組み立てて1つの機能を作る分解のセンスが必要だと思うのですが、そこがなかなか難しい。オブジェクト指向プログラミングやデザインパターンは、重複排除も目的にした手法であり、重複させないようにするためにたくさんの知見が交差してる感じが面白いと感じました。
SlackBotでMentionするとスマホだけ通知が来ない時の確認箇所

# はじめに
Google Apps Scriptを使ってSlack Botを作ったが、PC版にはメンション通知が来るのにスマホでは通知が来ない、という現象にハマったので備忘録として記載。


# 確認箇所
## スマホ側の通知設定がミスってる
定番といえば定番。忘れがちなのが個別チャネルのNotification設定がされている場合は、そちらが優先されるので、個別で通知なしにしてると来ない。
設定はPCにて、Account->Notificationの項目で設定する。PCとスマホで通知条件も変えられるので注意が必要

## UserIdではなくUserNameでメンション通知を実装している
今回のハマったパターン。Botから対象のユーザーに対してメンションする場合、
以下のようにかける。

` user_id=U2147483697` `user_name=Steve` 

```js
<@U2147483697> //user_idでメンション通知
<@Steve>       //user_nameでメンション通知
```

これはどちらでもSlack上では「@Steve」でリンクになるし、クリックするときちんとユーザー情報が見れる。
しかし、**スマホでは `<@U2147483697>` しかNotificationの反応が来ない**。
そしてややこしいのは、 **PC版は `<@U2147483697>` でも `<@Steve>` でもNotificationの反応が来る**こと。

なので、PC側は正常にNotificationが来るのにスマホだとNotificationが来ない！という場合は、メンションの指定がuser_name指定になってないかを確認して見ると良い。

なお、UserIdは
https://api.slack.com/methods/users.info/test
で確認できるほか、Slackからのパラメータとして渡って来るのでそちらを利用する
vagrant upでネットワークエラーが出たら 

## 概要
vagrant upしたときに、ネットワークエラーが出ることがあったので、その対処方法のメモ。根本原因は別途要調査。

## エラー内容

```
$ vagrant up
**snip**

==> default: Configuring and enabling network interfaces...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

# Down the interface before munging the config file. This might
# fail if the interface is not actually set up yet so ignore
# errors.
/sbin/ifdown 'eth1'
# Move new config into place
mv -f '/tmp/vagrant-network-entry-eth1-1489021809-0' '/etc/sysconfig/network-scripts/ifcfg-eth1'
# attempt to force network manager to reload configurations
nmcli c reload || true

# Restart network
service network restart


Stdout from the command:

Restarting network (via systemctl):  [FAILED]


Stderr from the command:

usage: ifdown <configuration>
Job for network.service failed. See 'systemctl status network.service' and 'journalctl -xn' for details.
```

## 変な名前のnetwork-scriptsを削除する
vagranにsshで入る。（上記のエラーが出ててもログインできます。）
`ifcfg-enp0s3` こんな感じのやつを消す。

```
[vagrant]$ sudo rm -f /etc/sysconfig/network-scripts/ifcfg-xxxxxx
```

## network restart
vagrant内で実行

```
[vagrant]$ sudo service network restart
```

## vagrant reload
これで、vagrant up, reloadしてもエラーは出なくなった。

```
$ vagrant reload
```

以上
ロードバランサー配下な Apache & Nginx で常時 SSL 接続のためのリダイレクト Config


常時 SSL 接続を行いたいウェブサイトがあります。

ただ、ロードバランサーなどで、https -> http 変換で Web サーバーに来ている構成だったりします。

その時の解決方法です。

# 前提

- ロードバランサーで https -> http をしている
- ロードバランサーで http_x_forwarded_proto のヘッダーをきちんと追加している

# Apache の .htaccess or Conf

```
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

```

## 番外編：さくらインターネットの場合

さくらインターネットのレンタルサーバープランで常時 SSL 接続する場合、実は、ロードバランサーみたいなものの配下にあるので、通常の .htaccess では動きません。

下記の設定が必要です。

```
RewriteEngine on
RewriteCond %{ENV:HTTPS} !^on$
RewriteCond %{HTTP:X-Sakura-Forwarded-For} ^$
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

```



# Nginx の Conf


nginx.conf の `server{} `の中に下記を入れる。（Apache のバーチャルホスト的な設定ファイルの構成な人は、別の場所に保存されているかもなので気をつけてください。）


```
#### https Redirect Under Load Balancer
if ($http_x_forwarded_proto = 'http') {
    return 301 https://$host$request_uri;
}
```

# クレジット

この記事が役に立ったら、「 **CMS は concrete5 が一番**」と頭の中で10回唱えてください。

CMS は断然 [concrete5](https://concrete5-japan.org/)で決まり。
別々のディレクトリにあるファイルを条件指定してcpする

# 目的
* カレントディレクトリより下にある全ディレクトリ・全ファイルを再帰的に検索して，特定の条件を満たすファイルだけをカレントディレクトリにコピーしたい．

# 方法
* `find`コマンドに`-exec`オプションをつける．

## 使用例
### カレントディレクトリ直下にある全てのpngファイルを`~/dest`というディレクトリにコピーする
```
find . -name "*.png" -exec cp {} ~/dest/ \;
```

* 解説
    * `cp`直後の`{}`に検索結果のファイル名のリストが格納される．
    * 最後の`\;` は`-exec`の終わりを表す記号．末尾に必ずつける．
* 応用例
    * 他の動作：
        * `cp`を`mv`に変更すれば移動・リネーム
        * `cp`を`rm`に変更すれば削除
    * ワイルドカードの使用：
        * `"*.png"`を`"hoge*/*.png"`に変更すれば，ファイル名が`hoge`で始まるすべての`png`ファイルが操作対象になる．
        * `find .`の部分を`find foo`に変更すれば，カレントディレクトリ直下ではなく`foo`というディレクトリ直下のファイルが操作対象になる．
    * 確認しながら操作
        * `-exec`を`-ok`に変更すれば，操作を行う前に逐一確認できる
            * `find foo -name "hoge*" -ok mv {} ~/dest \;`と書けば`foo`ディレクトリ直下にある，ファイルが`hoge`から始まる全てのファイルに対して1個ずつ「移動しますか？」と確認され`yes`と入力すれば移動される

# 参考文献
* [rakkyooの備忘録 - 検索したファイルをコピー（コマンド）](http://rakkyoo.net/?p=724)
* http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230777/
UITableViewのセルの再利用の正しいやり方

正しいかもしれないですし、正しくないかもしれません。
わかる方教えてください

#参考

> https://developer.apple.com/reference/uikit/uitableview/1614878-dequeuereusablecell
> https://developer.apple.com/reference/uikit/uitableview/1614891-dequeuereusablecell

#本題

```swift:UITableView
    open func dequeueReusableCell(withIdentifier identifier: String) -> UITableViewCell? // Used by the delegate to acquire an already allocated cell, in lieu of allocating a new one.

    @available(iOS 6.0, *)
    open func dequeueReusableCell(withIdentifier identifier: String, for indexPath: IndexPath) -> UITableViewCell // newer dequeue method guarantees a cell is returned and resized properly, assuming identifier is registered
```

　UITableVIewのdequeueReusableCellメソッドにindexPathを引数に持つものと持たないやつがいます。
動作は基本的に同じで、違うのは返り値がnilの可能性があるかないかです。（他にも違うところがあるかもしれませんが、調べた感じわかりませんでした。）

`dequeueReusableCell(withIdentifier:for:)`の方のメソッドを使えば毎回guardでnilチェックをしなくてもよくなりますね！

#結論

`dequeueReusableCell(withIdentifier:for:)`を使いましょう！
redashでAWS Athena使おうとしたら、DataSourceに出てこなくてはまったので解決策

# redashでAWS Athena使おうとしたら、はまったので解決策

使うぞって思ってたら、
Data SourceのType欄に出てこなかったので
解決策を記載しておきます:smiley:

※すべて2017/5/18現在の事象です

## 場面

今回は以下の場面です

* AWSのEC2のAMIを利用
* ソースをダウンロードしてインストール

**Hostedでは、問題なく選択できました**

## redashのインストール

redashのインストール方法を記載しておきます

### パターン1. AWS EC2でredashのAMIを利用する

* EC2インスタンス作成時に、redashで提供されているAMIを選択する

[Setting up a Redash Instance](https://redash.io/help-onpremise/setup/setting-up-redash-instance.html)

※現時点（2017/5/18）では、`1.0.1+b2833` がインストールされます

### パターン2. ソースを持ってきてインストールする

* EC2インスタンス作成時に、OSは、ubuntuを選択
* 以下を実行

ソースゲット

```
cd /usr/local/src/

wget https://raw.githubusercontent.com/getredash/redash/master/setup/ubuntu/bootstrap.sh
```

スクリプト実行

```
sh bootstrap.sh
```

アップグレード

```
cd /opt/redash/current
sudo bin/upgrade
```

確認

```
ls -l /opt/redash/
```

※現時点（2017/5/18）では、`1.0.3.b2850` にアップグレードされます

## 本題のAWS Athenaへの接続

### 現象

上記2つの方法で設定すると以下の画像のように
AWS Athenaが出てきません:cry:

---

![redash01.png](https://qiita-image-store.s3.amazonaws.com/0/66113/8b86695d-d10b-4444-9383-31c007d4c556.png)

---

### 調査

`/opt/redash/redash.1.0.3.b2850/redash/query_runner/athena.py`

ファイルあるしなぁと調査したり

### 解決策

公式のサーポートに書いてました:joy:

[Support for AWS Athena](https://discuss.redash.io/t/support-for-aws-athena/302/19)

### 方法

`/opt/redash/.env`

に以下を追加

```
export REDASH_ADDITIONAL_QUERY_RUNNERS="redash.query_runner.athena"
```

再起動して、反映

```
/etc/init.d/supervisor reload
```

すると![redash02.png](https://qiita-image-store.s3.amazonaws.com/0/66113/5558a0a9-5414-acc7-8923-8ea9838e9af5.png)

出てきました！:tiger::tiger::tiger:

あとは、
AWS AthenaへのKey等を設定してください～

### ※注意※

**redashのバージョンが、0.12以下の場合はエラーになるので注意！**
業務に使うアカウントは二段階認証にしよう | Skype / Slack / Github / Google (Gmail)

注意喚起記事。

# 二段階認証とは

ざっくり言うと、自分の携帯電話が手元にないと、ログインできないようにする仕組み。(基本的には)
アカウントのセキュリティを高めることが出来る。

# ヒント

- 注意一秒ケガ一生
- SMSは届きにくいことがあるので、電話登録のほうが良いかもしれない
- この記事には「業務に使うアカウント」と書いたが、もちろんプライベートでも設定した方が良い。

# だって面倒じゃん？

「皮の盾」と「ロトの盾」

どちらを装備しますか。

コマンド？

# Skype

[2 段階認証について](https://support.microsoft.com/ja-jp/help/12408/microsoft-account-about-two-step-verification)

# Slack

[Slackのアカウントで２段階認証を設定する - Qiita](http://qiita.com/teruichi81/items/b1453c7a36f13262d715)

[Set up two-factor authentication – Slack Help Center](https://get.slack.help/hc/en-us/articles/204509068-Set-up-two-factor-authentication)

# Github

[About Two-Factor Authentication - User Documentation](https://help.github.com/articles/about-two-factor-authentication/)

二段階認証にすると、ターミナルからレポジトリに対して操作をおこなう時は、公開鍵での ssh 接続が必要になる。

[GitHubで二段階認証に変更する - Qiita](http://qiita.com/katsukii/items/9773e9cfea7d929fcf9c)

# Google / Gmail

Google アカウントを二段階認証にすれば、Gmailを含めたGoogleの全サービスに適用されるはう。

[Google 2 段階認証プロセス](https://www.google.co.jp/intl/ja/landing/2step/)

# Qiita 

我らがQiitaも対応してた。

[Qiita・Qiita:Teamのアカウントで2段階認証ができるようになりました - Qiita Blog](http://blog.qiita.com/post/93858790619/two-factor-authentication)

# 思うこと

- そもそもサービスが「二段階認証を提供してる」と知らないと、設定しようと思いつかない問題
- なんとなく面倒で登録を見送ってしまう問題
- 個人個人では設定がおこなわれても、全社的に導入されない問題

これを改善するにはどうすれば良いんだろう。








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[Cakephp]フォームにマスタテーブルから読み込んだリストを表示したい件

CakePHPで入力フォームを作るとき、
たとえば都道府県を入れさせるときに普通ならリストボックス作りたいわけで、
で、HTMLファイルにごりごりと

```HTML
<option value="01">北海道</option>
<option value="02">青森県</option>
<option value="03">岩手県</option>
```
とか47都道府県書きたくないし、
そもそもDB上じゃ都道府県はマスタ作って
コードで管理してるんだわって時に、

いつもならフレームワーク使わずに
PHPで都道府県マスタテーブルお呼び出しして作ってたんですよ。

CakePHPならどうするんだろうなと思って調べたんだけど
調べ方が悪いのか全然ヒットしなかったのでメモ。

##用意するもの
MySQL
- 都道府県テーブル(Prefs)
CakePHP
- ArticlesTable.php
- ArticlesController.php
- index.ctp

##書き方
1.ArticlesTable.phpのpublic function initialize()に
　都道府県テーブルを関連付け(belongsTo)してやる。

```php:CakePHP
public function initialize(array $config)
    {
       $this->belongsTo('Prefs', [
            'className' => 'Lists.Prefs',
            'foreignKey' => 'pref_id'
        ]);
    }
```

2.ArticlesController.phpで都道府県テーブルを取り出す変数をセット。

```php:CakePHP
public function index() {
        $prefs=$this->Articles->Prefs->find();
        $this->set('prefs',$prefs);
    }
```

3.index.ctpにセレクトボックス生成用のフォームヘルパーを取り付け。

```php:CakePHP
    echo $this->Form->create($article);
    echo $this->Form->label('都道府県','都道府県');
    $selectprefs = array();
    foreach ($prefs as $pref){
        $selectprefs +=array($pref->pref_id => $pref->pref_name);
    }
    echo $this->Form->select('都道府県',$selectprefs);
    echo $this->Form->end();
```

CakePHPは触り始めたばっかりなんで
まだ生のPHP触ってる方が楽だなーなどと思うこともたびたびありますが
たぶん慣れればこっちの方が楽なんだろうな。
できないことも多々ありそうだけど。
AWS Elastic Beanstalkでmonit監視するための注意点

最近、インフラのお仕事をしています

Ruby on railsのアプリケーションでよしなにキューを使いたいという用件があり、[shoryuken](https://github.com/phstc/shoryuken)を使っておりました
[sidekiq](https://github.com/mperham/sidekiq)でいいんじゃね、というツッコミはなしにして、インフラ担当の自分はデプロイ時下記の要件を満たすインフラを作る必要がありました

* shoryukenのジョブが立ち上がっていなかったら立ち上げる
* shoryukenのジョブが落ちたら復旧する

元々Elastic Beanstalkで構成していたのですが、上記の用件を満たすために　`.ebextensions` で実現しようとしましたがなかなかハマったのでメモを残しておきます

## shoryukenを立ち上げるために

shoryukenを立ち上げるために下記のファイルを配置しました

```　.ebextensions/shoryuken.config
files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/50_restart_shoryuken":
    mode: "000777"
    content: |
      . /opt/elasticbeanstalk/support/envvars
      . /opt/elasticbeanstalk/support/scripts/use-app-ruby.sh

      # undefined $HOME when execute this script, so abort `bundle exec shoryuken`
      HOME=/root; export HOME

      mkdir -p /var/app/support/pids
      mkdir -p /var/app/support/logs

      cd /var/app/current

      if [ -f /var/app/support/pids/shoryuken.pid ] && \
         ps aux | grep `cat /var/app/support/pids/shoryuken.pid` | grep 'shoryuken'
      then
        kill -TERM `cat /var/app/support/pids/shoryuken.pid`
        rm -rf /var/app/support/pids/shoryuken.pid
      fi

      sleep 10

      bundle exec shoryuken \
        -R \
        -P /var/app/support/pids/shoryuken.pid \
        -L /var/app/support/logs/shoryuken.log \
        -d

  "/opt/elasticbeanstalk/hooks/appdeploy/pre/03_mute_shoryuken":
    mode: "000777"
    content: |
      if [ -f /var/app/support/pids/shoryuken.pid ]
      then
        kill -USR1 `cat /var/app/support/pids/shoryuken.pid`
      fi
```

HOMEが定義されているのが渋いところなのですが、shoryukenを実行するコードの中にデフォルトで `~` にアクセスしているコード(ライブラリ側)があり、monitから叩かれる際には `root` なので、HOMEがない状態で、タスク自体がabortしてしまいます。ちょっと他に回避策が思いつかなかったので、緊急回避的にこうなっています。

## monit管理下におく

```　.ebextensions/monit.config
packages:
  yum:
    monit: []
commands:
  00_copy_monit_config:
    command: "cp /var/app/support/monit.d/shoryuken.conf /etc/monit.d/shoryuken.conf"
  01_monit_chkconfig:
    command: "/sbin/chkconfig monit on"
  02_monit_restart:
    command: "/sbin/service monit restart"
    ignoreErrors: true
files:
  "/var/app/support/monit.d/shoryuken.conf" :
    mode: "000644"
    owner: root
    group: root
    content: |
      check process shoryuken-proc with pidfile /var/app/support/pids/shoryuken.pid
      start program = "/usr/bin/sudo /opt/elasticbeanstalk/hooks/appdeploy/post/50_restart_shoryuken"
      stop  program = "/usr/bin/sudo /bin/kill -QUIT kill -TERM `cat /var/app/support/pids/shoryuken.pid` && rm -rf /var/app/support/pids/shoryuken.pid"
```

注目すべきは一番最初のcommandのcopyなのですが、これは直接 `/etc/monit.d/shoryuken.conf` を配置するとEBが気を利かせて過去ファイルを `/etc/monit.d/shoryuken.conf.bak` を配置してしまい `monit` が立ち上がらないという状態になってしまいます
これはデフォルトの monit.confが `/etc/monit.d/*` のファイルすべてをIncludeしており、過去ファイルまでIncludeするとプロセス名が被ってしまうためです

回避策として `/etc/monit.d/` 外にファイルを一旦配置して、それをコピーすることにより
 `*.bak` ファイルの影響を受けないようにしました

## まとめ

下記の二点の~~気持ち悪い~~機転を聞かせた対応により、shoryukenを起動しプロセス監視できるようになりました

* ダミーの環境変数定義
* confファイルの一次退避

EBを使っていると遭遇する問題かと思いますので、何かの参考になりましたら幸いです
kotlin/Nativeでサンプルのテトリスを動かす

google i/o でkotlinがAndroidで公式サポートされる発表があったので、kotlin/Nativeのテトリスをビルドしてみた。


### ライブラリの追加

> Install SDL2 development files (see https://www.libsdl.org/download-2.0.php). For Mac - copy SDL2.framework to $HOME/Library/Frameworks. For Debian-like Linux - use apt-get install libsdl2-dev.

Kotolin-nativeのビルドには必要ないがテトリスのビルドにSDL2のライブラリが必要と書いているので、追加しておく


### Kotolin-nativeのビルド

```
$ git clone https://github.com/JetBrains/kotlin-native
$ cd kotlin-native
$ ./gradlew dependencies:update
$ ./gradlew dist
```

### パスを通す

```
$ export PATH=./dist/bin:$PATH
```

### テトリスのビルド

```
$ cd samples/tetris
$ ./build.sh
```

### 実行

```
$ ./Tetris.kexe.kexe
```

![スクリーンショット 2017-05-18 12.49.39.png](https://qiita-image-store.s3.amazonaws.com/0/108413/0de86f03-f1c7-20fd-5079-2a58e338a078.png)
もうJava9にadd-apt-repositoryは要らない

ちょっと昔のAnsibleを動かしたらUbuntuでJava9がインストできなくなっていたので、調べたことを書き留めます。

# これまでのインストール方法

```コマンドの場合.
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java9-installer
```

```ansible.yml
- name: add repository for install jdk9
  apt_repository:
    repo: 'ppa:webupd8team/java'
- name: auto accept license for java9
  shell: echo oracle-java9-installer shared/accepted-oracle-license-v1-1 select true | sudo /usr/bin/debconf-set-selections
- name: install jdk9
  apt:
    update_cache: yes
    name: oracle-java9-installer
    state: latest
```

このコードたちは今は息をしていません。

# これからのインストール方法

```コマンドの場合.
$ sudo apt-get install openjdk-9 #ここで一度失敗するがdebファイルをDLする
$ sudo apt-get install openjdk-9-jdk-headless
$ sudo dpkg --configure -a
$ sudo dpkg -i --force-overwrite '/var/cache/apt/archives/openjdk-9-jdk_9~b114-0ubuntu1_amd64.deb'
$ java -version
openjdk version "9-internal"
OpenJDK Runtime Environment (build 9-internal+0-2016-04-14-195246.buildd.src)
OpenJDK 64-Bit Server VM (build 9-internal+0-2016-04-14-195246.buildd.src, mixed mode)
```

```ansible.yml
- name: install jdk9
  apt:
    update_cache: yes
    name: "{{ item }}"
    state: latest
  failed_when: False
  with_items:
    - openjdk-9-jdk

- name: install jdk9 headless
  apt:
    update_cache: yes
    name: "{{ item }}"
    state: latest
  with_items:
    - openjdk-9-jdk-headless

- name: dpkg java9
  shell: |
    dpkg --configure -a
    sudo dpkg -i --force-overwrite '/var/cache/apt/archives/openjdk-9-jdk_9~b114-0ubuntu1_amd64.deb'

```


お気づきの方しかいないと思いますが、上記はあくまで当面のインストール方法です。時が来たらこのコマンド・コードたちは息を引き取ると思います。
でもその時にはもっと楽な世界になっていると思います、インストール方法が。

もっと詳しいことはこちら https://askubuntu.com/questions/769467/can-not-install-openjdk-9-jdk-because-it-tries-to-overwrite-file-aready-includ
中國内地從香港進口的黃金猛增至15個月來最高

中國内地3月份從香港進口的黃金數量達到2015年12月來的最高水平，因為買家抓住金價當月一度下挫的機會購買黃金。

據彭博匯編香港政府統計處的數據，中國内地3月份從香港凈進口黃金107.4噸，是2月份進口量的兩倍多。3月份内地共從香港進口黃金117.6噸，2月份報49.7噸；對香港出口黃金10.2噸，2月份報2.05噸。

3月份，隨著美國國債收益率上升以及預期美聯儲將進一步升息，金價曾短暫跌破每盎司1200美元。之後美聯儲主席耶倫表示該央行打算“在一段時間内”維持寬松政策不變、 讓原本預期她會持鹰派立場的投資者感到意外，由此引發金價反彈，當月末時價格基本與月初持平。

“金價在3月上半月跌破1200美元可能對購買行為起到激勵作用，”凱投宏觀駐倫敦大宗商品經濟學家Simona Gambarini在電郵中說。“中國買家往往對價格非常敏感。不過無論如何這些數據確實强到令人覺得意外。不過我們必須再等待幾個月才能對此有一個更清晰的了解。這可能是新趨勢的開始，也可能只是一次性的。” 引用網址：http://www.mainlandhot.com/FIN2017042600131901.html
¥¥fileserv 等(samba)のアカウントを消す方法(windows10)

##  :desktop:社内サーバ等のネットワークにアクセスをする際に記録されたアカウント（資格）情報を削除する
（例としてWindows10で¥¥fileservにアクセスする）

- アドレス欄に入力から資格情報の記録:writing_hand:
（あまり何度も見る画面でもないのでこのような画面です。）
<img width="600" alt="fileserv.png" src="https://qiita-image-store.s3.amazonaws.com/0/156167/0ee8020c-7050-2028-94b9-dac01d43c4eb.png">

↓ Enter

<img width="400" alt="sikakujoho.png" src="https://qiita-image-store.s3.amazonaws.com/0/156167/fc74b953-b8b4-6fe1-bcad-00bc1f8e4f19.jpeg">

- 資格情報を記録する
にチェックを入れると以後自動でログインされます。
がログインしなおしたい場合、記録されたデータ（資格情報）の削除が必要です。

----
### コマンドで削除する
GUIでコントロールパネルで削除もできますがコマンドで行う方法もありました。
*Windows+r で cmdと入力後、以下のコマンドを実行してください。*

- 現在保存されている資格情報の一覧
`cmdkey /list`
いくつかでるターゲットの項目に接続したサーバ名の fileserv が出て来ます。

- 記録されている資格情報の削除
`cmdkey /delete:fileserv`
この後、ログアウトしないと反映されないようです。

----
#### GUI -> CUI
今までコンパネの検索で資格と検索し対応してたので
誰かに頼まれた時はコマンドで消してみたらいかがでしょう:muscle::relaxed::keyboard:
Glassfishのasadminコマンドメモ


今後よく使うことになりそうなので、メモを作成。


##起動・停止コマンド
####$ asadmin start-domain "domain"
ドメイン"domain"を起動する。

####$ asadmin stop-domain "domain"
ドメイン"domain"を停止する。


##ドメイン管理のコマンド
####$ asadmin list-domain
ドメインの一覧を表示する。

####$ asadmin delete-domain "domain"
ドメイン"domain"を削除する。

####$ asadmin create-domain --portbase=10000 "domain"
ドメイン"domain"を作成する。
portbaseを10000で指定しているので、アクセスは10080でアクセスできる。（管理画面は10048）

##アプリケーションの管理コマンド
####$ asadmin deploy --contextroot=app --name=app app.war
warファイルをデプロイする。
"--contextroot"でコンテキストルートを指定する。
"--app"でアプリケーション名を指定する。
"--libraries"を指定すると、アプリケーションが使用するjarファイルを指定できる。
"--force=true"を指定しておくと、すでに配置されいてる同一モジュールがあっても再配置を行う。

####$ asadmin undeploy app
アプリケーションをアンデプロイする。
アプリケーション名を指定する。
[Java] シングルトンパターン

Javaの学習メモ

# シングルトンパターン
## 基本（シングルスレッドからの使用前提）
```java:SingletonClass.java
package com.company;

public class SingletonClass {
    private static SingletonClass instance = new SingletonClass();

    private SingletonClass() {}

    public static SingletonClass getInstance() {
        return instance;
    }
}
```

```java:Main.java
package com.company;

public class Main {
    public static void main(String[] args) {
        SingletonSample obj = SingletonSample.getInstance();
    }
}
```

+ `getter` を定義 (C#と違ってプロパティ構文はない)
+ インスタンス生成とコンストラクタは `private` にする。(C#と同じ)
+ GoF本の定義は古いので注意
+ インスタンスが作られるのはクラスがロードされたときではなく、初めて使われるとき
    + => マルチスレッドから `getInstance()` が使われる場合にインスタンスが複数作成される可能性がある

## マルチスレッド対応

上にも書いたとおり、インスタンスが生成されるのはクラスがロードされたときではなく初めて使われるときのため、`getInstance()` のマルチスレッドからの呼び出しを許可している場合、インスタンスが複数作成される可能性がある。

対応方法として、以下などが挙げられる。

```java:synchronized修飾子を使用
class Singleton {
    static Singleton instance = null;
    public static synchronized Singleton getInstace() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
```

```java:Initialize-on-Demand_Holder_クラスパターン
class Singleton {
    private Singleton(){}

    public static Singleton getInstace() {
        return SingletonHolder.INSTANCE;
    }

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
}
```

参考
[デザインパターン「Singleton」 - Qiita](http://qiita.com/shoheiyokoyama/items/c16fd547a77773c0ccc1)
[MSC07-J. シングルトンオブジェクトのインスタンスを複数作らない](http://www.jpcert.or.jp/java-rules/msc07-j.html)

# 関連
[[C#6.0~] シングルトンパターンの実装 - Qiita](http://qiita.com/koara-local/items/8abe1a0ac03f84bbd62f)

# 参考
[JavaのSingletonデザインパターン - Qiita](http://qiita.com/silverskyvicto/items/a32227bdb749d182103a)
[MSC07-J. シングルトンオブジェクトのインスタンスを複数作らない](http://www.jpcert.or.jp/java-rules/msc07-j.html)
Javaの勉強 - 9

# 奇数、偶数の判定
結論を書いてしまうとifの条件式で「%」を使えばよかった。

四則演算をやったときに「余り」なんていつ使うんだよ
って思ったけど、なるほど、使いました。

2で割って、余りがなければ・・・偶数
2で割って、余りがあれば・・・奇数

こういう考えを持っていればいいんですね。

■ キーボードから入力された数値が奇数か偶数かを判定する
いつものキーボード入力できる方の形に↓を追加

```java:
int num1;

System.out.print("整数を入力 > ");
num1 = Integer.parseInt(br.readLine());      // キーボード入力

if (num1 % 2 == 0){         // 2で割って余りがないとき
	System.out.println("入力された数値は偶数");
} else if (num1 % 2 == 1){     // 余りが出たらこっち
	System.out.println("入力された数値は奇数");
}
```

「else if」のところは「else」でもよかったけど
何となく条件式つけたかったので「else if」にしておいた。

# 〇倍の倍数かを判定
結論を書いてしまうとifの条件式で「%」を使えばよかった。

四則演算をやったときに「余り」なんていつ使うんだよ
って思ったけど、なるほど、『また』使いました。

3の倍数のときは
3で割って、余りがなければ・・・3の倍数
3で割って、余りがあれば・・・3の倍数ではない

って書いたあとで、偶数は2の倍数なことに気づいた。
何と言う算数の弱さ。

■ キーボードから入力された数値が3の倍数であるかを判定する
いつものキーボード入力できる方の形に↓を追加

```java:
int num1;

System.out.print("整数を入力 > ");
num1 = Integer.parseInt(br.readLine());      // キーボード入力

if (num1 % 3 == 0){         // 3で割って余りがないとき
	System.out.println("入力された数値は3の倍数");
} else {                     // 余りが出たらこっち
	System.out.println("入力された数値は3の倍数ではない");
}
```

「else」のところは「else if (num1%3==1 || num1%3==2)」でもいいか。
むしろ、勉強してるんだから後者でいくべきだったか。

「||(または)」を使う練習にもなるし。