OmniAICreator/Qiita-1.07M huggingface dataset:
AWS・IAM(Identity and Access Management)ユーザの作成

#IAM(Identity and Access Management)とは

ユーザーに対して AWS へのアクセスを安全に制御するための仕組み。
AWSのサービスやリソースへのアクセス権をユーザーに付与し、それらへのアクセスを許可する。
要は、AWSのユーザ管理ツールです。


#IAMユーザの作成方法

まず、コンソールへログインしサービス一覧から[IAM]を選択。

![IAM01.png](https://qiita-image-store.s3.amazonaws.com/0/174392/dbd13a48-08da-4e17-4840-345f335d8a36.png)

今回はグループとユーザ追加のみ行います。

![IAM02.png](https://qiita-image-store.s3.amazonaws.com/0/174392/bcf5a006-da65-553c-8310-2c4f7da898b7.png)


##グループの作成
ユーザ作成から始めて、その途中グループ作成ということも可能ですが、今回グループを先に作ってからユーザ作成という形で進めてみました。

![グループ作成01.png](https://qiita-image-store.s3.amazonaws.com/0/174392/fb95a740-64bd-fbeb-5019-6bf8337b42a2.png)

任意のグループ名を入力。

![グループ追加01.png](https://qiita-image-store.s3.amazonaws.com/0/174392/015f32df-d5f0-d13b-6509-5861c6d7d964.png)

ポリシーのアタッチ(接続する・付属する・取り付ける)をします。
ポリシーのアタッチをすることで、ユーザのAWSに対するアクセス＆管理権限を与えることができます。
ポリシーはAWSで既に用意されている既存のものを使うことも可能ですが、条件に合わせてカスタマイズもできるようです。
カスタマイズは難易度が高そうなので今回は触れません。

![グループ追加02ポリシー.png](https://qiita-image-store.s3.amazonaws.com/0/174392/e34b7ed4-5b72-e424-463d-f27666ec60a6.png)

ポリシーの中でも利用頻度が高そうな以下２つについて。

**AdministratorAccess**
既存のポリシーも271件とものすごく多いんですね。中でも一番権限が強いのがこのAdministratorAccessです。
AWSのルートアカウントと同じような権限を持っています。


**PowerUserAccess**
AdministratorAccessからIAMの管理が外されているポリシーで２番目に強い権限を持っています。

どちらも権限が強いユーザとなっていますが、どちらのポリシーであっても「請求とコスト管理」にはアクセスできません。
こちらへのアクセスをさせたい場合は別で設定が必要になります。


ポリシーのアタッチが完了すると、グループの作成は完了です。
今回作成したグループが一覧に表示されています。

![グループ追加完了.png](https://qiita-image-store.s3.amazonaws.com/0/174392/724c8ee6-3644-1c31-0b22-b60262318efd.png)

#ユーザの作成
![ユーザ追加01.png](https://qiita-image-store.s3.amazonaws.com/0/174392/d8c9d476-6299-c992-0d8a-c078b5c4ea6f.png)

作成するユーザ名を入力しアクセスの種類を選択します。今回はマネジメントコンソールへんアクセスをチェック。

![ユーザ追加03.png](https://qiita-image-store.s3.amazonaws.com/0/174392/c1f8ecba-ba83-4a17-f31a-6d04499ae826.png)

ユーザのアクセス権限を設定します。
先ほど作成したグループにユーザを追加する形で権限の設定を行います。

![ユーザ追加アクセス権限.png](https://qiita-image-store.s3.amazonaws.com/0/174392/8d8f315a-b5d5-c58c-51b8-9e9f5b3dee2e.png)
![ユーザ追加04.png](https://qiita-image-store.s3.amazonaws.com/0/174392/1f784d83-127a-e8a0-dcac-39606e71755c.png)![グループ追加完了.png](https://qiita-image-store.s3.amazonaws.com/0/174392/bcb0e302-f4ee-ce7a-5908-a6c784824f9f.png)

[公式サイト手順はこちら](http://docs.aws.amazon.com/ja_jp/cloudhsm/latest/userguide/create-iam-user.html)

#AWSルートアカウント・セキュリティ対策はしっかりと！
今回作成したIAMユーザはAWSを利用する上で常時必要となるアカウントです。
AWSにはこのIAMの他にルートアカウントが存在しています。登録時に必ず作成するものです。
AWSのルートアカウントはAWSサービスに対してフル権限を持っています。
支払い関係もこのアカウントであれば操作可能。クレジットカード情報も操作可能。
そのため基本的に運用する上でこのルートアカウントは使用しません。

特に自分以外の複数人で利用する場合はrootアカウントを安易に利用できないよう注意する必要があります。
ルートアカウントのセキュリティをより高いものにするため、[AWS Multi-Factor Authentication (MFA)](https://aws.amazon.com/jp/iam/details/mfa/)の利用がオススメです！

簡単にいうとインターネットバンキングによくある、ワンタイムパスワードと同じような仕組みです。
【JavaScript/jQuery】コナミコマンドで文字を爆発させる

# 見本
* キーボードで「↑↑↓↓←→←→BA」を入力すると背景がグラディウスに変わり、クリックで爆弾が設置できるようになる。爆発すると、文字が爆散する。
 
![tweettech2.gif](https://qiita-image-store.s3.amazonaws.com/0/178077/211fd964-420e-692b-ff5e-be63fe5ba591.gif)

# ソースコード
* 爆発には[fontBomb](http://fontbomb.ilex.ca/)というスクリプトを使用

````js:app/assets/javascripts/konami.js
$(function() {

  //入力されたキーを保存する
  var inputKey = [];

  //入力されたキーと比較する隠しコマンド
  //38 = 上
  //40 = 下
  //37 = 左
  //39 = 右
  //66 = B
  //65 = A
  var konamiCommand = [38,38,40,40,37,39,37,39,66,65];

 //画面上のキー入力イベントリスナ
 $(window).keyup(function(e) {
 
  //キー入力を配列に追加
   inputKey.push(e.keyCode);

   //キー入力が保存された配列と隠しコマンドを比較
   if (inputKey.toString().indexOf(konamiCommand) >= 0) {

      //隠しコマンド成功時
      alert("コナミコマンド発動！");

      //cssにbackground-imageを記述したクラスを追加
      $(".body-wrapper").addClass('konami');

      //fontBombのスクリプトをコピー
      javascript:(function () {var s = document.createElement('script');
        s.setAttribute('src', 'http://fontbomb.ilex.ca/js/main.js');
        document.body.appendChild(s);}());

      //キー入力を初期化
      inputKey = [];
   }
 });
});

````
#　参考
* [コナミコマンドで動くJavaScriptコードを書いてみる](http://qiita.com/sdn_tome/items/b663e3fae23031431535)
* [WEBページにJavaScriptで隠しコマンドを設置する方法！！](https://byuzensen.com/javascript-konami-command)
* [fontBomb](http://fontbomb.ilex.ca/)
MVCという概念をさくっと理解するためのまとめ。

# 概要
MVCについて改めて概念を理解しようと思い、さくっと読めるように短くまとめてみました。

# MVCとは？
MVCはそれぞれ以下の言葉の頭文字をとったものです。

- Model（モデル）
- View（ビュー）
- Controller（コントローラー）

それぞれについて見ていきましょう。

### Model（モデル）

モデルはアプリケーションの中でビジネスロジックを担当する部分です。以下の処理を担当します。

- データの検索
- データの変換
- データの検証
- データの関連

コントローラーから受け取った処理に基づいて、必要なデータをDBで参照します。
DBから取得したデータを一時的に預かりコントローラーへ渡しますが、DBそのものではありません。


### View（ビュー）

ビューはコントローラーから渡された（モデリングされた）データをHTMLなどで整形した状態を表現します。
またユーザーの入力を取得する部分でもあります。
ユーザーが実際に目にする部分だと思えば理解しやすいと思います。以下の流れです。

- リクエスト（ユーザーの入力）を取得する
- リクエストをコントローラーへ渡す
- コントローラーから受け取ったデータをHTMLなどで出力する



### Controller（コントローラー）
コントローラーは、ビューからのリクエスト（ユーザーの入力）を受け取り、モデルへのメッセージに変換します。
レスポンスとして処理後の画面をビューに返します。
またユーザーの処理に基づいてモデルをコントロールする部分でもあります。以下のような流れです。

- ビューからリクエストを受け取る
- 受け取ったリクエストに基づいて該当するアクションを実行しモデルに伝える
- モデリングされたデータをモデルから受け取り、レスポンスとしてビューへ返す


# どうしてMVC？
MVCを考慮する理由は、 **開発の管理のしやすさ** にあるのだと思います。
MVCを考慮して開発する場合、各要素が比較的はっきりと分かれるので、プログラムが見やすい状態になります。
また作業分担もわかりやすくなり **開発効率の向上を見込める** というのがメリットです。

- 開発管理がしやすい
- 開発効率の向上を見込める

# あとがき
さくっとMVCについてまとめてみましたが、開発手法にはいろいろあってそれぞれが独自の良さを持っているものだと思います。
案件の数だけ開発手法があり、流行り廃りがつきものであることもまた事実です。
社内でMVC開発を行う際は、こういったイメージをもって取り組みたいと思います。

# 参考にさせて頂きました
https://www.slideshare.net/MugeSo/mvc-14469802
http://at-grandpa.hatenablog.jp/entry/2013/11/01/072636
https://book.cakephp.org/2.0/ja/cakephp-overview/understanding-model-view-controller.html
Db2 Developer Community Editionを "数クリック" で 導入してみた (1)


リレーショナル･データベースを わずか 数クリックで導入、しかも ツールも同時に導入、しかもしかも 無償、という お手軽なデータベースがIBMから提供開始されました。 "Db2 Developer Community Edition" という名前で、以前から商用で使われている DB2 の 新エディションという位置づけです。 非生産用途に限られているので、本番業務には使えませんが、ちょっと試すRDBがほしいときにうってつけです。
早速試してみることに･････

# ダウンロードする
IBM IDが必要なので、お持ちでなければ [事前に作って](https://www.ibm.com/account/profile/us?page=reg)おいてください。

IBM IDを取得したら、 IBM IDでログインして[ダウンロード画面](https://www.ibm.com/marketing/iwm/iwm/web/preLogin.do?source=swg-db2dtrial)に入ります。

![スクリーンショット 2017-06-29 18.00.33.png](https://qiita-image-store.s3.amazonaws.com/0/131443/6359380f-8e0e-bce4-cb87-e36b762d634e.png)



どれをダウンロードするか選択。 筆者はMacBookで動かしたいので、Mac版を選択しました。
<img width="625" alt="スクリーンショット 2017-06-30 11.17.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/131443/e239708b-e220-a4db-2edd-742567e976c2.png">



ダウンロードした .dmgファイルをダブルクリック。
画面がでるので、指示どおりアプリケーションフォルダーに drag & drop
![スクリーンショット 2017-06-30 11.21.14.png](https://qiita-image-store.s3.amazonaws.com/0/131443/ce7e39c0-695f-d4a3-9e4f-2a9592357960.png)


これで導入の準備完了です。 

ここまではあっという間です。
つづきは[こちらの記事](http://qiita.com/kirinchan/items/5d0217c66af3c131e6b9)にて････
はじめてのSwiftアプリ制作3: CocoaPods と SwiftLint

今回は、アプリを開発する前に導入しておくとよいツールを紹介いたします。

前回
[はじめてのSwiftアプリ制作2: Xcodeの機能](http://qiita.com/tsubamechi/items/ff3f2ce5cda751fa4dc3)
## 環境
Xcode 8.3
Swift 3.0

## CocoaPods
CocoaPodsは、Xcodeに備えられているapple純正のフレームワーク(UIKitなど)以外のライブラリを用いる際に必要となるライブラリ管理ツールです。

アプリ開発ではいつかは外部ライブラリを使用する機会は訪れる可能性が高く、
始めからプロジェクトにPodsを入れておいた方が無難でしょう。

また、[Carthage](https://github.com/Carthage/Carthage)という同じようなライブラリ管理ツールはありますが、今回はPodsを利用いたします。

* CocoaPodsをMacにインストールする  

CocoaPodsはターミナルのコマンドを使ってインストールすることができます。

```
$ sudo gem install cocoapods
```
```
$ pod setup
```

上記の手順でMacにCocoaPodsが導入されました。

* プロジェクトにPodfileを作成する
次に、作成したプロジェクトにPodを入れたいと思います。
ターミナル上で、Xcodeプロジェクトファイルがあるフォルダに移動します。

```
$ cd (プロジェクトのあるフォルダのパス)
```
移動したら、podを使用する準備をします。
```
$ pod init
```
これでフォルダにPodfileというCocoaPodsを使用する際に入れるライブラリ名を書くファイルが作成されました。

* プロジェクトにPodを追加する

まだ何のライブラリもいれませんが、プロジェクトにPodsを追加しておきましょう。

```
$ pod install
```

これによってPodが導入されたXcodeワークスペースがフォルダ内に作成されました。
今後は、ワークスペースを開いて作業していきます。

## SwiftLint
SwiftLintはJavaScriptでのEslintと同様、コードの書き方に規則を設定して書き方を無視した場合に警告やエラーを表示する静的コード解析ツールです。
アプリの品質を担保するために導入しておくのが良いかと思います。

* SwiftLintをMacにインストールする
Macに[HomeBrew](https://brew.sh/index_ja.html)をインストールしてください。

その後、

```
brew install swiftlint
```

これでMacにSwiftLintがインストールされました。

* .swiftlint.ymlファイルを作成する
.swiftlint.ymlファイルはSwiftLintの規約の設定を書くファイルです。
[このような](https://github.com/realm/SwiftLint/blob/master/.swiftlint.yml)感じで規定されてます。

* SwiftLintをプロジェクトをビルドした際に動かすようにする
実際に、プロジェクトにSwiftLintを反映します。

Xcode上でプロジェクトを選び、[Targets] -> [Build Phases] を選択し、+ボタンから「New Run Script Phase」を選択。
追加されたRun Scriptに以下のシェルスクリプトを書きます。

```
if which swiftlint >/dev/null; then
swiftlint
else
echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi
```

<img width="987" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/189662/259752af-f0be-84ba-1791-e66b6ab693f0.png">

これでプロジェクトをビルドすると、Warningが何個か出るかと思います。
（２行以上の空行がある・コードの一番最後の閉じかっこ以降に空行がある等）
今後、コードを書いていく上でこういった警告やエラーが出るたび修正することで、品質が保証されるコードを書く事ができます。

## まとめ
* 外部フレームワークを利用するためにプロジェクトに[CocoaPods](https://cocoapods.org)か[Carthage](https://github.com/Carthage/Carthage)といったライブラリ管理ツールを導入しよう
* コードの品質を保つために静的コード解析ツール「SwiftLint」を導入しよう

次回はStoryBoardを触っていきたいと思います。
GCP Cloud SQLにプロキシ経由で繋ぐ


Google Cloud Platform(以下GCP)のCloud SQLにアクセスする際、次の二つの方法があります。

1. 特定IPアドレスからの接続を許可する
2. Cloud SQL Proxyを使う

前者が使えるのは、AWSなどの別のクラウドから接続する、あるいは社内LANから接続するなどのケースだと思います。本稿では、開発環境からアクセスする場合に便利な、後者(プロキシの使い方)について扱います。(というか自分用のメモ)

- 対象読者: とりあえずGCPにアカウント持ってる/作ろうとしている
- 使いどき: Cloud SQLを試してみたい/開発環境から繋げてみたい

## 下準備

### プロジェクトの作成

もし、GCP上での作業が初めてであればプロジェクトを事前に作成しておく必要があります。[コンソール](https://console.cloud.google.com/)にアクセスし、[ドキュメントを参照](https://cloud.google.com/resource-manager/docs/creating-managing-projects)して、作成しておいてください。

### Cloud SDK

SDKが必要です。手元の環境にない場合は、[こちらからSDKをダウンロード](https://cloud.google.com/sdk/downloads)して、インストールしておきましょう。

初めて使う場合は、次のコマンドでログインしましょう。自動的にブラウザが開いて、Googleアカウントでの認証が求められます。

```bash
$ gcloud auth login
```

ログインに成功したら、次のコマンドで確かめておきます。

```bash
$ gcloud auth list
```

### SDKの認証

GCPのドキュメントを見ていると、上記だけで使えそうな記述もあるのですが、実際には次の手順が必要です。上記のログインの場合と同様に、ブラウザが開いてGoogleアカウントでの認証が求められます。

```bash
$ gcloud auth application-default login
```

### APIの有効化

[こちらにアクセス](https://console.cloud.google.com/flows/enableapi?apiid=sqladmin)して、Cloud SQL APIを有効化しておきます。

![Enable an API.png](https://qiita-image-store.s3.amazonaws.com/0/1858/77dcc797-ecf5-b21b-ae2d-4c00664119de.png "Enable an API.png")

1. 上記の画面でプロジェクトを選択して、`Continue`します。これで、有効化完了です。
2. 次の画面で、認証情報の作成ボタン(`Go to credentials`)が表示されますが、ここでは特に作成の必要がないので、そのままブラウザを閉じてOKです。

### プロキシのインストール


適当な場所(ここでは、自分のホームディレクトリ`/Users/<ユーザ名>`)に移動して、次のコマンドでプログラムをダウンロードします。(以下はMacの場合です。他の環境については[ドキュメント参照](https://cloud.google.com/sql/docs/mysql/connect-admin-proxy))

```bash
$ curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
```

実行権限を付与しておきます。

```bash
$ chmod +x cloud_sql_proxy
```

※よく使うのであれば、パスも通しておきましょう。

## MySQLに接続

### Cloud SQLのインスタンスを作成

[Cloud SQL](https://console.cloud.google.com/sql/instances)にアクセスして、`CREATE INSTANCE`のボタンをクリックします。

1. MySQLを選択
2. MySQL Second Generationを選択
3. インスタンスの設定
	- Instance ID: 適当な名前。ここでは`my-database`
	- Region: `asia-northeast1`
	- Machine type: お試しなら`db-f1-micro`か`db-g1-small`あたり
	- Root password: `Generate`ボタンをクリックしてメモっておく
	- ほかの項目は、任意で変更

インスタンスの作成には数分かかります。

### プロキシの起動

先ほどプロキシをインストールしたフォルダに、移動します。事前に適当な名前(ここでは`cloudsql`)でフォルダを作っておいてください。

次のコマンドで、プロキシが起動します。

```bash
$ ./cloud_sql_proxy -dir=cloudsql -instances=my-project:asia-northeast1:my-database
```

なお、インスタンスの指定は`-instances=<プロジェクトID>:<リージョン>:<データベースのインスタンスID>`の書式で行います。適宜書き換えてください。

上記では、`/Users/<ユーザ名>/cloudsql/my-project:asia-northeast1:my-database`がソケットのパスになります。

※なお、上記のUnixソケットを使う方法のほか、いくつかの方式があります。詳しくは、[プロキシのドキュメント参照](https://cloud.google.com/sql/docs/mysql/sql-proxy)。

### MySQLクライアントから接続

以下は、[Querious](https://www.araelium.com/querious/)の場合の例です。

![Querious.png](https://qiita-image-store.s3.amazonaws.com/0/1858/4b593821-2e45-126e-49d8-c46eacc9ae0c.png "Querious.png")

- User: `root` (あるいは、ほかの設定済みのアカウント)
- Password: インスタンス作成時にメモしたもの
- Socket Path: `/Users/<ユーザ名>/cloudsql/my-project:asia-northeast1:my-database`

おつかれさまでした。以上で、無事、開発環境からデータベースにアクセスできたはずです。
全ブランチから文字列検索・全コミットから文字列検索

Stack Overflowで紹介されていた技法なのですが、日本語で紹介した記事がどこにもないようだったので。
https://stackoverflow.com/questions/18278774/search-git-remote-all-branches-for-file-contents

全ブランチから文字列検索する
---
```bash
git grep 【キーワード】 $(git branch -a --format='%(objectname) %(refname:short)' | sort | uniq -w 40 | cut -c 42-)
```

全コミットから文字列検索する
---
```bash
git grep 【キーワード】 $(git rev-list --all)
```

仕組み
---
全ブランチを（コミットの重複なく）列挙するには以下のように書きます。

```bash
git branch -a --format='%(objectname) %(refname:short)' | sort | uniq -w 40 | cut -c 42-
```

1. ローカル+リモートブランチを`ハッシュ値 ブランチ名`という書式で出力し
2. 先頭から40文字（ハッシュ値）で重複削除し
3. 42文字目以降（ブランチ名）だけ切り出す

べしと書きました。

全コミットを列挙するコマンドは最初からあります。

```bash
git rev-list --all
```

`git grep`というコマンドは指定コミット（複数指定可）から指定文字列を検索してくれるものです。そこで、存在するブランチ全部または存在するコミット全部をリスト化して`git grep`に渡してやることで目的が達成できるという具合。

リモートにある分を取りこぼさないよう、`git fetch`してからどうぞ。
CSSで文字にグラデーション（Modernizrでクロスブラウザ対応）

テキストへのグラデーションをCSSで処理して、Modernizrでクロスブラウザ対応するメモ。

テキストへのグラデーション処理に **-webkit-background-clip** と **-webkit-text-fill-color** を使います。

前提として[Modernizr](https://modernizr.com)を読み込んでおくこと。

```ruby:html
<p class="txt-gradation">text-garadation</p>
```

```ruby:css
.txt-gradation {
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
    background-color: #F07575; /* fallback color if gradients are not supported */
    background-image: -webkit-linear-gradient(top, hsl(0, 80%, 70%), #bada55); /* For Chrome and Safari */
    background-image:    -moz-linear-gradient(top, hsl(0, 80%, 70%), #bada55); /* For old Fx (3.6 to 15) */
    background-image:     -ms-linear-gradient(top, hsl(0, 80%, 70%), #bada55); /* For pre-releases of IE 10*/
    background-image:      -o-linear-gradient(top, hsl(0, 80%, 70%), #bada55); /* For old Opera (11.1 to 12.0) */ 
    background-image:         linear-gradient(to bottom, hsl(0, 80%, 70%), #bada55); /* Standard syntax; must be last */
}
.no-backgroundcliptext .txt-gradation {
    background-image: none;
    background-color: #fff;
    color: #F07575;
}
```
という感じで指定します。

## スクリーンショット

文字グラデーション対応ブラウザ

![スクリーンショット01](https://qiita-image-store.s3.amazonaws.com/0/158124/b6f7d79f-3a80-5253-c0d0-8df2fc9db6fe.png)

非対応ブラウザ

![スクリーンショット02](https://qiita-image-store.s3.amazonaws.com/0/158124/89129c75-a76a-bad3-65b1-57e20efc71dc.png)

・・・となるはずですが、実機確認までは出来ていないのであしからず。

テキストへのグラデーション処理が頻繁に出てくるデザインには有益かと。

別にModernizr判別でなくてもいいので、兎も角未対応のブラウザには

`background-image: none;`

を入れてあげないと悲しいことになるのでご注意を。
Capistrano3でdeployすると毎回DBがリセットされてしまうとき

#前置き
- Rails5
- Capistrano3
- nginx + Unicorn

DBにsqliteを使っている場合に、指定していないのにdeployするたびにDBが自動でリセットされてしまう。
deployは普通に行ってほしく、resetやseedのタスクを自分の任意のタイミングで呼び出したい。

#sqliteのファイルをsharedに入れる。
database.ymlに、.sqlite3がsharedに入るよう指定してあげる。

```ruby:shared/config/database.yml
production:
  <<: *default
  database: /var/www/プロジェクト名/shared/db/production.sqlite3
```
これでdeployすると、DB自動リセット問題は解消

#任意で発動させるためのタスク追加

rails5では、production環境でDBの破壊系の操作ができなくなっているので、
ActiveRecordで操作できる環境からproductionを抜いたものを、application.rbに追加してあげる

```ruby:config/application.rb
ActiveRecord::Base.protected_environments = %w(staging)
```

```ruby:config/deploy.rb
namespace :deploy do

  task :db_reset do
    on roles(:app) do
      within release_path do
        with rails_env: fetch(:rails_env) do
          execute :rake, "db:migrate:reset"
        end
      end
    end
  end

  task :db_seed do
    on roles(:db) do |host|
      with rails_env: fetch(:rails_env) do
        within current_path do
          execute :bundle, :exec, :rake, 'db:seed'
        end
      end
    end
  end

end
```

開発中は触ることがちょいちょい多いので、
`cap production deploy`
`cap production deploy:db_reset`
`cap production deploy:migrate`
`cap production deploy:db_seed`

これでOK。

#
SwiftでもKotlinのif式を使いたい

Kotlinのif式が便利なので、Swiftでも使いたいなーと思って試してみました。

# Kotlinのif式
- if式が値を返すので、そのまま変数に代入できて便利です。

```Kotlin
val boolean = true
val string: String = if (boolean) {
    val str1 = "Hello"
    val str2 = "World"
    str1 + " " + str2
} else {
    "NO"
}
print(string) // Hello World
```
# Swiftで困ったこと

単純に値を代入するだけであれば、三項演算子を使えばOKです。

```Swift
let string: String = boolean ? "YES" : "NO"
```

しかし、分岐した後に複数行の処理を入れられません。

```Swift
// こんな記述はできない
let string: String = boolean ? {
    let str1 = "Hello"
    let str2 = "World"
    return str1 + " " + str2
} : "NO"
```

# クロージャが使えそう
[Swiftのリファレンス](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html)をみてみると、*Setting a Default Property Value with a Closure or Function*の項にクロージャを使ってプロパティに初期値をセットする方法が書かれています。クロージャは値を返せるので利用できそうです。

```Swift
//  Setting a Default Property Value with a Closure or Functionの項より引用
let someProperty: SomeType = {
    return someValue
}()
```

# クロージャ + 三項演算子で実装

クロージャを返すようにするだけで簡単に実装できました。

```Swift
let string: String = boolean ? {
    let str1 = "Hello"
    let str2 = "World"
    return str1 + "" + str2
}() : "NO"
```

初期値を与えて`$0`で使うこともできます。

```Swift
let string: String = boolean ? {
    let str2 = "World"
    return $0 + "" + str2
}("Hello") : "NO"
```

# クロージャ + switch文で実装

三項演算子では2つの分岐しか作れないので、3つ以上に分岐するためswitch文を使ってみます。
~~2重のクロージャになってしまうし、内部で値を保持するために`var`も使っていて実用性がありません。。。~~
コメントでご指摘いただき修正しました！実用できそうです :bulb: 

```Swift
let num = 0
let string: String = {
    switch num {
    case 0:
        let str1 = "Hello"
        let str2 = "World"
        return str1 + "" + str2
    case 1:
        return ""
    default:
        return ""
    }
}()
```

# まとめ

Kotlinのif式っぽいものをSwiftで書いてみました。
クロージャを使うので少しだけネストが増えますが、便利に使えそうです。


# 参考
- [Kotlin - If Expression](https://kotlinlang.org/docs/reference/control-flow.html#if-expression)
- [The Swift Programming Language - Initialization](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html)
WordPressのローカル環境構築メモ

##はじめに
必要性がなかった！
10年ほどWEB系には興味がなかった！！！
・・・という言い訳なのですがｗ

- HTMLはタグを手で打つもの
- 掲示板、チャットは基本CGI（Perl）
- 複雑なのはPHP＋DBかJava
- CSSははじめの頃の知識しかない

という古い人間です。ごめんなさい。

最近はjQueryとかJSがすごいなーとは思いつつ
あまりやる気が出ず、ずっと傍観者だったのですが
仕事もらえるとのことで、またWEB開発やりますよ！

まずはローカル環境からやっていこうと思います（^^;
**OS:Windows7**

WordPressという名前は前々から良く聞いていたものの
「ブログ作るやつ、PHPでできているらしい」
くらいの知識しかないので、間違ってたらごめんなさい┌○))

いろいろ調べると仮想OSにぶっこんどくとテスト環境の作り直しが
コマンドラインで簡単にできるとのことだったので
その方向性でやってます！

参考にしたサイト
https://www.webprofessional.jp/ultimate-wordpress-development-environment/


##インストールとリポジトリダウンロード
###▼インストールしたもの
・VirtualBox
・Vagrant

###▼ダウンロードしたリポジトリ
・https://github.com/Varying-Vagrant-Vagrants/VVV.git

参考にしたサイト
https://www.wildwest-service.com/vvv/
http://wpwand.com/build-wordpress-dev-env-on-windows/


##起動

###▼vagrant の使い方
http://qiita.com/daichi87gi/items/d5da33c76295ee32a735

よーし！なんかわからんけどとりあえず起動するぞ！！
<PRE>vagrant up</PRE>
![vvvインストール中.png](https://qiita-image-store.s3.amazonaws.com/0/106779/de40e073-614e-59da-d7b5-3fa68bb7a736.png)

初回はしばらく時間がかかるとのことで放置してたら
こうなりましたｗｗｗ
![E_FAIL.png](https://qiita-image-store.s3.amazonaws.com/0/106779/1f1e2cf8-0c79-ebf4-b55e-8be376935996.png)

起動に失敗してるっぽいので
Google先生にお尋ねしたところ
exeの互換モードを「Windows 7」にしなさいって書いてたのでチェックつけて各exeごとにﾁﾏﾁﾏ指定
- VirtualBox.exe
- VBoxManage.exe
- VBoxHeadless.exe

![互換モード.png](https://qiita-image-store.s3.amazonaws.com/0/106779/dcb78567-484b-3e22-d85c-83ee9a925b9c.png)
参考URL
https://stackoverflow.com/questions/37367618/vagrant-up-command-not-working

参考サイトにあったとおり
https://www.wildwest-service.com/vvv/
Permission denied　になりました　＼ﾔｯﾊﾟﾘ!!!／
![PermissionDenied.png](https://qiita-image-store.s3.amazonaws.com/0/106779/52c029d8-fc9c-7d7b-fa35-5bd2b7d30164.png)

で、管理者で実行すると
![E_FAIL2.png](https://qiita-image-store.s3.amazonaws.com/0/106779/30014313-a6d5-ee49-ebae-aaa707dfc33b.png)

今度はなに！？
参考サイトから引用
http://wpwand.com/build-wordpress-dev-env-on-windows/

> PCあるいはVirtualBoxを再起動して、再度コマンドを実行したら直りました。
> ローカルにサイトが追加されるまで10分ぐらいかかるかもです。
> 完了したらブラウザで 以下のURLでアクセスして、インストールできたことを確認します：

10分かー
結構かかるなー
と思いつつ放置。
![起動.png](https://qiita-image-store.s3.amazonaws.com/0/106779/b8d4342f-b2e7-3eea-882e-fa36ce035bd9.png)

TimeOutだと！？
![TimeOut.png](https://qiita-image-store.s3.amazonaws.com/0/106779/3bf418e5-50e5-6b97-5e3b-34e495705e85.png)

何かがおかしい・・・
Visual StudioさんにCドライブが圧迫されているので
Adobe CCもZドライブにインストールしているのだけれど
若干Cドライブにファイルが作られるので
もうCドライブがパンパン！！！

仮想環境ともなるとかなりデータ食うので
Zドライブにインストールしてるんですが
どうも、User\ユーザ名\の中にファイルを作りたがるのです

Zドライブにインストールした
VirtualBox.exe
を起動して設定確認
まーいろいろCドライブに作ってまして致命的なのが

User\ユーザ名\VirtualBox VMs\
この中に仮想ディスク作られるみたいなんですが
Cドライブの容量が足りてませんでした.....orz

インストールをZドライブにしたんだから
仮想ディスクも同じパス使ってよ！！！

もろもろ手動でCドライブからZドライブにパス変更とか
環境パスとかも手動でやって再起動とかいろいろやって

やっと起動ログが流れ始めましたよ（涙）
10分～20分かかるらしいので
エラーが出ないかドキドキしながら
コンソール眺めていました

![終わったっぽい.png](https://qiita-image-store.s3.amazonaws.com/0/106779/9516e140-bccc-f96f-fde9-2520115f52a6.png)
**added 894 packages in 55.288s**

なぜ途中で色が変わっているのかはよくわかりませんが
終わったっぽい！！！！！

![終わったっぽい2.png](https://qiita-image-store.s3.amazonaws.com/0/106779/2699167b-a79a-8e12-da18-80c73bd6fb82.png)

ということでブラウザで確認

![WEB確認.png](https://qiita-image-store.s3.amazonaws.com/0/106779/c3d7877e-d706-073e-08b8-3f019f090cc1.png)

無事環境設定終わりました (ﾜｰｲ
Emacsを１日に何度も起動するのはにわかっ! ...え！？

Emacsはテキストエディタというにはあまりにも色々できすぎるのでもはやエディタとしても使える。くらいに思うようになった。もうこれOSじゃねぇの？と割とよく思う。
で今日の表題
TwitterでEmacsについて検索していたら
> Emacsを１日に何度も起動するのはにわか！

あるいは

> Emacsを終了させるのはにわか

ってツイートを発見してしまった。
愕然とした。そんな方法があるのかよって。
Emacsの設定ファイルinit.elに500行以上の書き込みがある僕のEmacsは起動するのにそれなりに時間がかかっていた。ブランチの切り替えはMagitを導入してからEmacsを終了させなくても良くなったけどそれでも１日に何度もストップアンドゴーを繰り返す。だから驚いた。同時にエディタの定義がゲシュタルト崩壊した。エディタってなんや？(´・ω・`)？

## デーモン閣下のEmacs
悪魔であろう。
そうであろう。
なぜならデーモンを利用するとEmacsをずっと起動しておくことができるのだから。
よせ！Emacsが過労死しちゃう！
まさに悪魔の所業。
`emacs --daemon`というコマンドを実行することでEmacsは明示的に終了のコマンドを入れないとずっと起動したままになる。
そして起動しているEmacsにコネクトしてファイルを編集するときは`emacsclient -nw`で行う。<-nwとつけないと日本語が打てないというスパルタクスモードになる。それも悪くない...

> デーモンの名前の由来はギリシャ神話から面倒事をデーモンという精霊に押し付けたことに由来するそうな。

神なのに鬼畜の所業...
あと読み書きの都合上デーモンとなるけれど精霊を意味するdaemonと悪魔をさすdemonとだと綴がちがうそうな。僕はさっき知った。

## 働き者のEmacsに慈悲を
ずっと起動しっぱなしのEmacsを停止する便利コマンドがあってそれを入れればEmacsを止められる。
にわかと言われることはしょうがないが止め方も書き残す（Emacs歴１ヶ月の新参なので）
`"emacsclient -e '(kill-emacs)'`これでいいらしい。


## あとがき 
### 使うのが楽しいけどEmacsを触ることが目的にならないようにしないと
Emacsの`package-install`コマンドを利用して日々知らないパッケージをザッピングするのが好きです。
昨晩見つけたパッケージで`httprepl`というのがあってEmacsからHTTPリクエストを送るんだけどREPLで実行できるから下手なターミナルからするよりずっとかんたん。
RailsでAPIサーバー立てて検証するならこれ多分最強。

あとまた別の日にまとめようと思ったけどブラウザが存在するらしい。
本当にEmacsって何なんだ？って思います。
最新の僕の見解ではこれはOS。
数値の桁数に応じて頭に0埋めする簡単な方法 [Python]

ちょうべんり。


```
In [1]: '{0:03d}'.format(2)
Out[1]: '002'

In [2]: '{0:03d}'.format(2000)
Out[2]: 2000
```

空白地も埋められる。

```
In [3]: '{0:3d}'.format(2)
Out[3]: '  2'
```
keybaseとaws_iam_user_login_profileを使ってIAMUserにログインパスワードを設定

# 目的
* keybaseとaws_iam_user_login_profileを使ってIAMUserにログインパスワードを設定し、マネジメントコンソールログインを有効化する

# 前提
* keybaseでPGP-key作成済

# 設定
* `iam_user_login_profile.tf`でkeybaseアカウントを記述することで`terraform.tfstate`に暗号化されたパスワードが記述される


```iam_user_login_profile.tf
resource "aws_iam_user_login_profile" "<iam-user-name>" {
  user    = "${aws_iam_user.<iam-user-name>}"
  pgp_key = "keybase:<keybase-user-name>"
}

output "password" {
  value = "${aws_iam_user_login_profile.<iam-user-name>.encrypted_password}"
}

```

* SecretAccessKeyも暗号化

```iam_user.tf
resource "aws_iam_user" "<iam-user-name>" {
  name = "<iam-user-name>"
}

resource "aws_iam_access_key" "<iam-key-name>" {
  user    = "${aws_iam_user.<iam-user-name>.name}"
  pgp_key = "keybase:<keybase-user-name>"

}
```

# 確認
* applyすると暗号化されたパスワードが出力されます

```
password = (snip)dfhsdhsdcFM(snip)twA
secret = (snip)FMA9vdyK9wzqFf(snip)LwA=
```

* 復号化

```
$ terraform output password | base64 -d | gpg -r <pgp-key>
(snip)
*************
$ terraform output secret | base64 -d | gpg -r <pgp-key>
(snip)
*************

```

# 所感
* keybase対応は、凄い刺さります！
【Illustrator】クリッピングマスク一括解除の仕方

#【Illustrator】クリッピングマスク一括解除の仕方

PDFをIllustratorで開くとクリッピングマスクが何重にもかかっていて一気に解除したい時ありますよね。

1. すべてを選択
2. オブジェクト > クリッピングマスク > 解除（これで解除される）

***※以下は必要なくなったクリッピングパスを一括削除する方法***
3. 元クリッピングパスを適当に一つ選択する．そいつや他の元クリッピングパスは塗りも色もないオブジェクトのはずだから，選択 > 共通 > 塗りと線
4. 「削除」

上記の内容は以下を参照しました:http://kakiikanikan.blogspot.jp/2013/12/blog-post_9.html?m=1
Treasure Data上特定のレコードを削除する

#timeを活用して特定のレコードを削除する
Treasure Data上のテーブルに格納されているレコードを削除する

* 期間を指定して削除コマンドを実行(partial_delete)
 * CLI

[partial_delete](https://docs.treasuredata.com/articles/deleting-rows)でデータの作成日(time)の範囲を指定してレコードが削除できます。でもtime以外のカラム例idなどを指定してレコードを削除したいです。

##テーブルのレコード
|time|id|name|age|
|:--------|:--------|:--------|:--------|
|1498727491|1|jane|30|
|1498727491|2|lucy|20|
|1498727491|3|boby|25|
|1498727491|4|stepin|26|
|1498727491|5|lily|28|
* 1498727491はデータの作成日:2017-06-29 18:11:31

##やりたいこと
id=4のレコードを削除したいです。

##やる方法
partial_deleteでtimeを元に削除するため、timeを活用したら実現できます。
上記のレコード再作成。idをintのままtimeに変換してtimeとして保存する。

|time|id|name|age|
|:--------|:--------|:--------|:--------|
|1|1|jane|30|
|2|2|lucy|20|
|3|3|boby|25|
|4|4|stepin|26|
|5|5|lily|28|

コマンド実行

```
$ td table:partial_delete example_db original_table  --from 4 --to 5
Time for the -f / --from and -t / --to options must either be a multiple of 3600 (1 hour)
  or be expressed in Ruby time string format where the minutes and seconds are 0
```
エラーになって、timeのfrom、toは3600 (1 hour)の倍数にしないといけないです。
なるほど、上記のレコードを再作成`time=id * 3600`

|time|id|name|age|
|:--------|:--------|:--------|:--------|
|3600|1|jane|30|
|7200|2|lucy|20|
|10800|3|boby|25|
|14400|4|stepin|26|
|18000|5|lily|28|

コマンドを再実行

```
$ td table:partial_delete example_db original_table --from 14400 --to 18000
Partial delete job 17227446 is queued.
Use 'td job:show 17227446' to show the status.
```

コンソール画面で確認したら、

```
Duration 00:00:02
SQL Query

DELETE FROM original_table WHERE 14400 <= time AND time < 18000
```
一瞬で終わり。

### 結果

|time|id|name|age|
|:--------|:--------|:--------|:--------|
|3600|1|jane|30|
|7200|2|lucy|20|
|10800|3|boby|25|
|18000|5|lily|28|

正常に削除できました。

##年齢は26~29歳のレコードを削除
同じくageを3600の倍数に変換してtimeとしてレコードを作成する

|time|id|name|age|
|:--------|:--------|:--------|:--------|
|108000|1|jane|30|
|72000|2|lucy|20|
|90000|3|boby|25|
|100800|5|lily|28|

コマンドを実行

```
$ td table:partial_delete example_db original_table --from 93600 --to 108000
Partial delete job 17227447 is queued.
Use 'td job:show 17227447' to show the status.
```
### 結果

|time|id|name|age|
|:--------|:--------|:--------|:--------|
|108000|1|jane|30|
|72000|2|lucy|20|
|90000|3|boby|25|

#まとめ
Treasure Data上partial_deleteでレコードを削除できますが、time以外の項目を指定して削除できません。特定のレコードを削除する場合、当カラム(type: int)をtimeとして保存すれば、削除できます。
[AWS] DynamoDB DocumentClient を Lambda + Node.js で使う

# DocumentClient
「DocumentClientは属性値の概念を抽象化することにより、Amazon DynamoDBのアイテムの操作を簡素化します。」
と公式のクラスリファレンスに書かれています。

[Class: AWS.DynamoDB.DocumentClient](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html)

Lambdaで実行する方法を調べたので、単純な使い方だけですが紹介します。
コードはNode.jsで書いています。

# 宣言

```js
const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();

const tableName = 'myTable';
```

# キーで検索
例えばプライマリキー名が「id」で、「user01」を取得したい時。

```js
const params = {
    TableName: tableName,
    Key:{
        "id": "user01"
    }
};

docClient.get(params, function(err, data) {
    if (err) {
        console.error('Unable to get item. Error JSON:', JSON.stringify(err, null, 2));
        callback(err);
        return;
    }
    callback(null, data.Item);
});
```

data.Item から、各項目が取得できます。

# キー以外でフィルタリング
例えば「year」という項目があって、「2017」で絞り込みたい時。

```js
const params = {
    TableName: tableName,
    FilterExpression : "year = :val",
    ExpressionAttributeValues : {":val" : 2017}
};
    
docClient.scan(params, function(err, data) {
    if (err) {
        console.error('Unable to get item. Error JSON:', JSON.stringify(err, null, 2));
        callback(err);
        return;
    }
    callback(null, data.Items);
});
```

data.Items に、各項目が配列でセットされています。

# 登録、更新
指定したプライマリキーが存在すれば更新、存在しなければ新規登録になります。

```js
const id = 'user02';
const params = {
    TableName: tableName,
    Item: {
        "id": id,
        "name": "test user",
        "year": 2017
    }
};

docClient.put(params, function(err, data) {
    if (err) {
        console.error('Unable to add item. Error JSON:', JSON.stringify(err, null, 2));
        callback(err);
        return;
    }
    callback(null, {"id": id});
});
```

# 削除
キーを指定して削除します。
というかキーを指定しないと削除できません。
以下の例はプライマリキー名が「id」で、「user01」を削除したい時。

```js
const params = {
    TableName: tableName,
    Key:{
        "id": "user01"
    }
};

docClient.delete(params, function(err, data) {
    if (err) {
        console.error('Unable to delete item. Error JSON:', JSON.stringify(err, null, 2));
        callback(err);
        return;
    }
    callback(null, data);
});
```

data は空のオブジェクト{}が返されます。
Go - beegoのフラッシュメッセージのデザインを自動適用させる

beegoはフラッシュメッセージが簡単に登録・読み込みできますが、cakePHPみたいなフラッシュメッセージ用のviewが用意されているわけではなく、ただのテキストが読み込めるだけなので、これにHTMLタグをくっつけた状態で自動的に出力できるようにします。

## フラッシュメッセージの登録と読み込みの方法

### フラッシュメッセージの登録

下記で登録できます。

```go
flash := beego.NewFlash()
flash.Notice("成功しました！")
flash.Store(&c.Controller)
```

### フラッシュメッセージの読み込み

下記を実行することで、c.Data["flash"]にフラッシュメッセージが登録されます。なので、viewで{{.flash.notice}}とかが使えるようになります。

```go
beego.ReadFromRequest(&c.Controller)
```

## 自動的にHTMLタグを追加する

テンプレート関数を使います。

```go
package main

import (
	"github.com/astaxie/beego"
	"fmt"
	"html/template"
)

func AddTmplFuncs() {
	beego.AddFuncMap("unEscape", unEscape)
	beego.AddFuncMap("flash", flash)
}

func unEscape(in string) template.HTML {
	return template.HTML(in)
}

func flash(flash map[string]string) template.HTML {
	out := ""
	color := "blue"
	if len(flash) > 0 {
		if f, ok := flash["notice"]; ok {
			out = f
		} else if f, ok = flash["warning"]; ok {
			out = f
			color = "yellow"
		} else {
			out = flash["error"]
			color = "red"
		}
		out = fmt.Sprintf(`<div class="ui %s message">%s</div>`, color, out)
	}
	return unEscape(out)
}
```

上記のAddTmplFuncs()を、main()内で実行します。

## 使い方

テンプレート内で下記のように使います。フラッシュメッセージがなければ何も出力されず、あれば、フラッシュメッセージの種類（noticeか、warningかerror）に応じて適切なHTMLタグが追加された状態で出力されます。ちなみに、上記の`<div class="ui blue message">`というのは、[Semantic UIのメッセージ](https://semantic-ui.com/collections/message.html#colored)です。`unEscape()`というのは、エスケープ処理を無効化してます。

```go

{{.flash | flash}}
```
キーストアとエイリアスのパスワード確認

### キーストアとエイリアスのパスワード確認

Androidのビルドに必要なkeystoreファイルについて、少しまとめ。
keystoreからパスワード情報を取得することは出来ないので、そうではなく、
自分の知っているパスワードが正しいかどうかを確認する方法をまとめました。

### キーストアのパスワードの確認

エイリアスの一覧を見るコマンドを使えば、キーストアのパスワードが正しいかどうか分かります。

```
$ keytool -v -list -keystore キーストアファイル
```

を入力し、キーストアパスワードを聞かれるので答えると、エイリアス一覧が確認出来ます。

一度に済ませる場合は

```
$ keytool -v -list -keystore キーストアファイル  -storepass キーストアのパスワード
```

です。

### エイリアスのパスワード確認

ちょっといい方法が思いつかなかったので、PKCS12形式にエクスポートすることが出来るかどうかで確認しました。エクスポート（出力）したキーストア・エイリアスは使わないので、パスワードを確認したあとは削除してしまってOKです。

```
keytool -v -importkeystore -srckeystore キーストアファイル -srcalias エイリアス名 -destkeystore 出力用p12ファイル名 -deststoretype PKCS12
```

出力用p12ファイル名は、まだ存在しないファイルとします。

```
出力先キーストアのパスワードを入力してください
```

と表示されたら、出力用のキーストア兼エイリアスのパスワードを入れてください。これは、PKCS12形式ではストアとエイリアスで別々のパスワードを設定できないためです。

```
新規パスワードを再入力してください
```

と表示されたら、再度、出力用キーストア兼エイリアスのパスワードを入力します。

```
ソース・キーストアのパスワードを入力してください
```

と表示されたら、今調べたい（入力用の）キーストアのパスワードを入力してください。

```
[エイリアス名]の鍵パスワードを入力してください
```

と表示されたら、今調べたい（入力用の）エイリアスのパスワードを入力します。

すべて成功すると、PKCS12形式の鍵ファイルが作成されます。

一度に済ませる場合は

```
keytool -v -importkeystore -srckeystore キーストアファイル -srcalias エイリアス名 -destkeystore 出力用p12ファイル名 -deststoretype PKCS12 -storepass 新しいキーストアパスワード -srcstorepass キーストアのパスワード -srckeypass エイリアスのパスワード
```

です。
再度注意しておきますが、PKCS12形式のため、出力用のキーストアのパスワードは、出力用のエイリアスのパスワードと同じにします。
[Memo]javascript-日付差分計算

・javascriptでcookieの有効期限を設定するときにjquery.cookieを使用していたので日数設定しかできず
　その際に作成したfunctionをメモ

##コード

```js
    var getDateDiff = function(dateStartStr,dateEndStr){

	　　var dateStart = new Date(dateStartStr);
	　　var dateEnd = new Date(dateEndStr);

	　　//ミリ秒に変換
	　　var msDiff = dateEnd.getTime() - dateStart.getTime();

	　　// 経過ミリ秒÷(1000ミリ秒×60秒×60分×24時間) 端数切捨て
	　　var daysDiff = Math.floor(msDiff / (1000 * 60 * 60 *24));

	　　// 計算した差分に1加算してreturn
	　　return ++daysDiff;
    };
```
##その他
　　こうしたほうがいいとかあったら教えてください。
Proself 4 の管理者ログを取得する

# 目的

[Proself 4](https://www.proself.jp/) の管理者画面にあるログをスクリプトでダウンロードする

# テンプレート

```py
#!/usr/bin/env python

import re
import requests

host = 'https://example.com'
username = 'admin_user'
password = 'admin_password'

s = requests.session()

headers = {
    'Accept-Language': 'ja,en;q=0.8',
    'Referer': host + '/',
}
data = {
    'AD': 'certification',
    'username': username,
    'password': password,
}
res = s.post(host + '/proself/login/login.go', headers=headers, data=data)
loginticket = re.search('name="loginticket" value="(.*?)"', res.text).group(1)

data = {
    'AD': 'logindownload', # 下記参照
    'loginticket': loginticket,
    'targetdate': '2017/06', # yyyy/mm
}
res = s.post(host + '/proself/admin/log/downloadhistory.go', headers=headers, data=data)
# print res.text etc.
```

- Cookie と Referer, フォームの loginticket は必須
- Accept-Language で ja を優先すると、結果の一部が日本語になるが、完全ではないようだ。

# 取得できるログの種類

| 名称 | AD |
|:--|:--|
| ログインログ | logindownload |
| 管理ログ | admindownload |
| ダウンロードログ | getdownload |
| アップロードログ | putdownload |
| ファイル操作ログ | resourceoperationdownload |
| Web公開操作ログ | publicdownload |
| Web公開ダウンロードログ | getpublicdownload |
| Web公開アップロードログ | putpublicdownload |

- 列数可変の CSV 形式で出力されている。
- それぞれのログの内容は https://www.proself.jp/support/faq129/ に説明がある。
- ある時刻のあるログを取得するたびにスクリプトを起動すると、ログインログが自分ので埋まってしまうので注意する。
  - 一定時間以内にアクセスすればセッションを維持できるので、永続化を検討する。
【swift3】WKWebViewでUIGestureRecognizerを使う

**何かと使う機会が多そうなので...:confused:**

```swift:WebviewController.swift

import UIKit

//WebKit Frameworkをインポート
import WebKit

class WebviewController: UIViewController, UIGestureRecognizerDelegate {
    
    //WKWebviewの宣言
    var _webkitview: WKWebView?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        //WebKitのインスタンス作成
        self._webkitview = WKWebView()
            
        //WebKitをviewに紐付け
        self.view = self._webkitview!
            
        // ジェスチャーを生成(今回はタップ・スワイプ・長押し)
        let tapGesture:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(WebviewController.tap(_:)))
        let swipeGesture:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(WebviewController.swipe(_:)))
        let longPressGesture:UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(WebviewController.longPress(_:)))
            
        // デリゲートをセット
        tapGesture.delegate = self;
        swipeGesture.delegate = self;
        longPressGesture.delegate = self;
            
        // WebViewに追加
        self._webkitview!.addGestureRecognizer(tapGesture)
        self._webkitview!.addGestureRecognizer(swipeGesture)
        self._webkitview!.addGestureRecognizer(longPressGesture)
            
        //URLを作って表示
        var url:NSURL
        url = NSURL(string:"http://******")!
            
        let req:NSURLRequest;
            
        req = NSURLRequest(url:url as URL, cachePolicy: NSURLRequest.CachePolicy.reloadIgnoringLocalCacheData, timeoutInterval: 0)
            
        self._webkitview!.load(req as URLRequest)
            
        }
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
   
    func gestureRecognizer(
        _ gestureRecognizer: UIGestureRecognizer,
        shouldRecognizeSimultaneouslyWith
        otherGestureRecognizer: UIGestureRecognizer
        ) -> Bool {
        return true
    }
    
    func tap(_ sender: UITapGestureRecognizer){
        //タップ時の処理
        print("tap")
    }

    func swipe(_ sender: UITapGestureRecognizer){
        //スワイプ時の処理
        print("swipe")
    }

    func longPress(_ sender: UITapGestureRecognizer){
        //長押し時の処理
        print("longPress")
    }
    
}

```
wpscan環境をWin10 proで手っ取り早く作り、Wordpressサイトの脆弱性をスキャンしてみる

#はじめに

Wordpressサイトの脆弱性スキャンツールと言えば、「[WPScan](https://wpscan.org/)」が有名なのですが、使えるように環境を構築するだけでいろいろと面倒そう...

と諦めかけましたが、「Docker Community Edition for Window」を使ったら、Windows 10環境でも手っ取り早くWPScan環境が作れたのでメモしておきます。

「[WPScan](https://wpscan.org/)」の「Install」の説明を見ると、

>Windows is not supported

とか書かれていますが、「Docker Community Edition for Window」を使えば、Windows環境でも使えます。

#使ったもの：
- Windows 10 pro 64bit
- Docker Community Edition for Windows (stable) 
- wpscan (DOCKER版) 
  
Win10 pro 64bit環境さえあれば、とても簡単です。

#手順1. Docker CE for Windowsをセットアップする

Dockerサイトから、Docker Community Edition for Windows (stable) をダウンロードしてセットアップします。

[Docker Community Edition for Windows](https://store.docker.com/editions/community/docker-ce-desktop-windows)

ダウンロードしたInstallDocker.msiを使って、そのままデフォルトでセットアップ。「Hyper-Vを有効化するか？」とか聞かれるので、有効化してPCを再起動すると、PowershellでDockerコマンドが使えるようになります。

**参考にしたページ :**
- [Docker Community Edition for WindowsをWindows 10 Proにインストール - Qiita](http://qiita.com/spiderx_jp/items/a6495010c0d2bf7c6fb7)
- [Windows管理者のためのDocker入門：無償の「Docker for Windows」で手軽にLinuxコンテナを利用する (1/2) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1609/01/news053.html)

#手順2. DockerにWPScan環境を入れる

Dockerコマンドが使えるようになったら、Powershellから下記のdockerコマンドでwpscan環境をpullします。

```console
> docker pull wpscanteam/wpscan
```

pullできたら、Dockerイメージを確認してみます。

```console
> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
wpscanteam/wpscan   latest              6144edb58732        1 minutes ago   153MB
```

これでWPScan環境が使えるようになりました。

**参考にしたページ :**
- [WPScan by the WPScan Team](https://wpscan.org/)

#手順3. WPScanを試す

dockerからWPScanを起動して、管理しているWordpressサイトをスキャンしてみます。

```console
> docker run -it --rm wpscanteam/wpscan -u http://*url.your*site.com
_______________________________________________________________
        __          _______   _____
        \ \        / /  __ \ / ____|
         \ \  /\  / /| |__) | (___   ___  __ _ _ __ ®
          \ \/  \/ / |  ___/ \___ \ / __|/ _` | '_ \
           \  /\  /  | |     ____) | (__| (_| | | | |
            \/  \/   |_|    |_____/ \___|\__,_|_| |_|

        WordPress Security Scanner by the WPScan Team
                       Version 2.9.2
          Sponsored by Sucuri - https://sucuri.net
   @_WPScan_, @ethicalhack3r, @erwan_lr, pvdl, @_FireFart_
_______________________________________________________________

[+] URL: http://*url.your*site.com
...
...
...
```

スキャンして、もし何かの脆弱性が見つかった場合は、即座に修正した方が良いですね。

その他、WPScanで使える様々なコマンドライン・オプションについては、本家サイトや解説サイトなどで確認しましょう。

WPScanは本来自分が管理運営しているWordpressサイトの脆弱性を調べるためのものです。しかし、使い方次第では攻撃ツールにもなりえます。これだけ簡単にセットアップできてしまうということは、だれでも攻撃ツールを手にできるということもでもあります。

Wordpressサイトのセキュリティは、こまめにしっかりとやらないといけないと再認識しました。

**参考にしたページ :**
- [wivern.com | WPScan 入門](http://www.wivern.com/security20150526.html)
- [WPScanで友人のWordPressサイトをハッキングしてみた話 | ネクスト株式会社](https://www.nxsw.co.jp/articles/2015/wpscan.html)
【Scala】AnormでStackOverflowErrorと言われた時の対処法

#TL; DR
AnormでSQL文を実行する際のSQL文が長すぎるとStackOverflowErrorがthrowされる。
解決方法はクエリの長い部分を別途Stringで切り出すことで回避可能

#内容
AnormでSQL文を実行する下記関数

```scala:
val sql = "INSERT *******"
anorm.SQL(sql).execute()
anorm.SQL(sql).executeInsert()
anorm.SQL(sql).executeUpdate()
```

において、sql: Stringが長すぎると、StackOverflowErrorとなる。
(具体的に何文字かは不明だが、自分は約5000文字の場合エラーとなった)

回避方法として、下記のようにクエリの一部分を生文字リテラルとして切り出してしまうとうまくいく。

```scala:
val text = """(めちゃめちゃ長いstring)"""
val sql = s"""INSERT INTO xxx (id, text) VALUES ("1", "$text");"""
SQL(sql).executeInsert()
```

#補足
ちなみにslickの

```scala:
Q.updateNA(xxx).execute
```
でも問題なく実行できます。自分は結局こっちを使いました（約5000文字でも問題なく実行できた）

何かご指摘やもっと良い方法等がありましたらコメントお願いします！
楽曲生成ニューラルネットワークを作った話

自作のMIDIパーサとLSTMを使って楽曲生成ニューラルネットワークを作りました。最近では[Magenta](https://magenta.tensorflow.org/)のようなプロジェクトもありn番煎じ感はありますが、出力される確率分布からのサンプリング方法に手を加えたところちょっと面白い結果が得られたので共有します。

[デモ (※即時再生のため音量注意)](https://soundcloud.com/tsyworks/sets/deep-improvisation)
[レポジトリ](https://github.com/tatsuyah/deep-improvisation)

## LSTM
シーケンシャルなデータの持つ文脈を学習することができるニューラルネットワークの一種です。詳細については良記事が山ほどあるのそちらに譲ります。以下が詳しいです。

 - [リカレントニューラルネットワークの理不尽な効力（翻訳）](http://qiita.com/KojiOhki/items/397f157342e0def06a9b) - 先日TeslaのAI及びAutopilot VisionのディレクターになったAndrej Karpathy氏の記事。実例が多く理解しやすい。
 - [LSTMネットワークの概要
](http://qiita.com/KojiOhki/items/89cd7b69a8a6239d67ca) - 演算プロセスについて詳しい。

## MIDI(SMF)
演奏データが音高、音量、時間情報等を持つチャンクのシーケンスとして表現されたフォーマットです。このシーケンス(の一部)をLSTMの入力として利用します。

 - [Standard MIDI File (Wikipedia)](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%80%E3%83%BC%E3%83%89MIDI%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)

## 処理の流れ

 1. 学習対象のMIDIファイルをパースし、チャンクを文字列に変換
 2. 変換後のチャンクのシーケンスを使い、モデルを訓練
 3. 作成したモデルと適当なチャンクのシーケンスを元にMIDIデータを表現するテキストデータを生成。**モデルからの出力の都度、確率分布からのサンプリングに使うパラメータを変更することでランダム性を付加。**
 4. 出力結果をMIDIに変換

## 結果
発生確率の低い要素を一定の頻度で出力するようにしたところ、原曲を若干アレンジした風の楽曲が生成されました。

## 備考
自作MIDIパーサが現状なかなか簡易的で、処理していないチャンク、情報もあるためもうちょっと作り込めば出力の質も上がると思われます。
【swift3】バックグラウンド処理有効化

**備忘録として。**

# AppDelegateクラス内で以下を定義
var backgroundTaskID : UIBackgroundTaskIdentifier = 0

# applicationWillResignActive内に以下を追記
self.backgroundTaskID = application.beginBackgroundTask(){
            [weak self] in
            application.endBackgroundTask((self?.backgroundTaskID)!)
            self?.backgroundTaskID = UIBackgroundTaskInvalid
        }

# applicationDidBecomeActive内に以下を追記
application.endBackgroundTask(self.backgroundTaskID)
はじめてのSwiftアプリ制作2: Xcodeの機能

今回は、Xcodeの機能や画面・エディタの表示変更・便利なショートカットキーについて書きます。

前回
[はじめてのSwiftアプリ制作1: プロジェクトの作り方](http://qiita.com/tsubamechi/items/dfdff846ac574297a0e2
 "プロジェクトの作り方")

## 環境
Xcode 8.3
Swift 3.0

## Xcodeの機能について
Xcodeの画面は、主に６つの領域に分かれていて右上の表示ボタン等を押して必要なものを表示することができます。

![1-2.png](https://qiita-image-store.s3.amazonaws.com/0/189662/4c9a76da-5e4b-113d-a96f-13b53a37e99f.png)

| 色 | 領域 | 内容 |
|:--|:--|:--|
| 赤 | ツールバー | アプリやシミュレーターの起動、表示の変更等ができます |
| 茶 | タブバー | 別のファイルをタブとして開くことができます（デフォルト非表示）|
| 青 | ナビゲーション領域 | プロジェクト内のファイル一覧や、様々なナビゲーション表示をすることができます（後日説明予定）|
| 黄 | エディタ領域 | 各ファイルのコードやストーリーボード等の表示をします |
| 緑 | ユーティリティ領域 | 各ファイルの設定の表示や変更等ができます |
| 紫 | デバッグ領域 | アプリを起動した際のデバッグログ等が表示されます |

<img width="235" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/189662/51d1c689-81e2-f706-4624-db96eb16d0e4.png">

またツールバーの右上にあるボタンで領域の開閉が可能です。
ツールバー自体や、タブバーの表示非表示は [View] -> [Hide or Show ToolBar or TabBar]で可能です。
エディタ領域は中心となる表示のため閉じることができません。

また、開閉ボタンの左にはエディタ領域の表示変更ができ
テキスト・・・通常の表示
わっか・・・アシスタントエディタの表示（ストーリーボードの表示の際によく使うので、詳細はそちらで説明予定）
やじるし・・・Git管理している際に、コミット前のものを表示し比較する

の３つがあります。

## エディタの表示設定を変える
先ほどの画像で、エディタがデフォルトの白背景ではなく黒っぽい背景になっているのに気づいた方はいるでしょうか。

こちらエディタ領域の背景や文字の色や大きさ等の設定は[Xcode] -> [Preference] -> [Fonts & Colors] から変更可能です。

<img width="749" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/189662/1cd3ec96-3591-cbf3-306d-0542eb0f0e48.png">

今後一番見ていく画面ですので、自分の見やすい表示にすることはまず初めにやっておいて損はないかと思います。

## Xcodeのショートカットについて
Xcodeには様々なショートカットキーがありますが、実際に作業する前に使う頻度の高いショートカットキーは覚えておいた方がよいでしょう。

| 項目 | キー | 内容 |
|:-:|:-:|:-:|
| ユーティリティ領域の開閉  | ⌘ + Option + 0 | - |
| コメントアウト  | ⌘ + / | コードをコメントアウトする |
| 左インデント  | ⌘ + [ | コードを左側にインデントする |
| 右インデント  | ⌘ + ] | コードを右側にインデントする |
| 説明文の作成 | ⌘ + Alt + / | コードのdescriptionを作成する |
| ジャンプ  | ⌘ + クリック | クラスやメソッドの元にジャンプする |
| 履歴移動  | ⌘ + Ctrl + ◀︎ or ▶︎ | エディタ領域が遷移した際に、戻るや進むを行う |
| 実行（Run) | ⌘ + r | 選択した端末（シミュレーター）でプロジェクトを実行する |
| ビルド  | ⌘ + b | プロジェクトをビルドする |

この他にも様々ありますが、個人的によく使う（&楽できる）のはこのあたりでしょうか。
その他よく使われそうなコマンドや一覧が見たい方は、「Xcode ショートカット」で調べるとすぐでてくるのでそちらをご覧ください。

## まとめ
* Xcodeの画面には6つの領域があり、エディタ領域以外は表示非表示を選ぶことができる
* 背景色や文字の色・フォントを変更して自分の見やすいようにしよう
* よく使うショートカットは覚えておこう（&使って慣れよう）

次回は、開発を開始する前にしておくと良い事を書きます。
Go - beegoでgomailとテンプレートを使ってメールを送る

irisって人気ないらしいし、フラッシュメッセージ使ったらデッドロックみたいになるし、使うのやめて、beego使うことにした。これはすごくいい気がする。中国製で中国の大きい会社も沢山つかってるし、irisと比べるとかなりいたれりつくせりだし、スターの数もフレームワーク中一番多いっぽい。軽量ならechoを使ってみようと思う。

beegoもメール機能はないっぽいので、gomailを使ってやってみる。

# gomailをテンプレート使って送る例

```mail.go
package mail

import (
	"gopkg.in/gomail.v2"
	"html/template"
	"bytes"
)

var contentType = "text/plain"

func Send (from string, to string, sub string,
	vars interface{}, files ...string) error {

	body, err := makeBody(vars, files...)
	if err != nil {
		return err
	}
	m := gomail.NewMessage()
	m.SetHeader("From", from)
	m.SetHeader("To", to)
	m.SetHeader("Subject", sub)
	m.SetBody(contentType, body)
	d := gomail.Dialer{Host: "localhost", Port: 25}
	err = d.DialAndSend(m)
	return err
}

func makeBody(vars interface{}, files ...string) (string, error) {
	t, err := template.ParseFiles(files...)
	if err != nil {
		return "", err
	}
	buff := &bytes.Buffer{}
	t.Execute(buff, vars)
	return buff.String(), nil
}
```

# 使い方の例

```contact.go
func send_contact(contact *Contact) error {
	from := "from@example.com"
	to := "to@example.com"
	sub := "お問合せありがとうございます"
	vars := contact
	files := []string{"views/mail/contact.tpl", "views/mail/footer.tpl"}
	err := mail.Send(from, to, sub, vars, files...)
	if err != nil{
		return err
	}
	to = contact.Mail
	err = mail.Send(from, to, sub, vars, files...)
	return err
}
```

# テンプレートファイルの例

```contact.tpl
{{.Name}}様

お問合せありがとうございます！

メールアドレス： {{.Mail}}

{{.Content}}

{{template "footer"}}
```

```footer.tpl
{{define "footer"}}

-------------
Example
http://example.com
info@example.com
{{end}}
```

beego特有のコードは何もないので他のフレームワークとかでも使えるのかなと思います。
もっといい方法とかあったら教えてくれるとうれしいです。
swagger スタブのresponseが空になる問題調査メモ

swaggerの書き方によっては、スタブのレスポンスでデータが出力されないことがありました。

# ①$ref参照の中で、さらに$refを参照。

```
get:
  .....
responses:
"200":
  schema:
    $ref: "#/definitions/sampleAList"

definitions:
  sampleAList:
    type: object
    properties:
      resultAList:
        type: array
        items:
          type: object
          properties:
            aaaCd:
              type: string
            bbbCd:
              type: string
      resultBList: 
        $ref: "#/definitions/sampleBList"

  sampleBList:
    type: object
        ～～～   
```

⇒この場合、resultBListが空となる。
別のところで使用していても、毎回省略せずすべて書く必要がある。

# ②出力されない書き方例：$ref参照のtypeがarray。
```
get:
  .....
responses:
"200":
  schema:
    $ref: "#/definitions/sampleAList"

definitions:
  sampleAList:
      type: array
      items:
        properties:
         aaaCd:
           type: string
         bbbCd:
           type: string
```
⇒この場合、responseのbodyは空となる。
(設計書の表示としては問題ない)
sampleAListをtype: objectにするとスタブが生成される。
[AWS] DynamoDBでシーケンス用テーブルを作る (Node.js)

DynamoDBはシーケンス発行の仕組みを持っていませんが、アトミックカウンターの使ってインクリメントすることができます。

# シーケンス用テーブル作成
まずはシーケンス用のテーブルを作成します。
ここでは「sequences」という名前にします。
プライマリキーは「name」で文字列です。

<hr>
<img width="795" alt="スクリーンショット 2017-06-30 10.57.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/92538/39db265d-2abc-f92a-5679-4a13fc59fb49.png">
<hr>

テーブルができたら、項目を作成します。
name:シーケンス発行したいテーブル名
current_number:現在のシーケンス値（最初だから0）を設定

<hr>
<img width="980" alt="スクリーンショット 2017-06-30 11.03.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/92538/1afceba2-9064-7622-2be1-793b1c919770.png">
<hr>

DynamoDBの準備は完了です。

# シーケンス発行方法
Node.jsでの例です。
Lambdaで実行することを想定したコードです。

```js
'use strict';

const table = 'test_table';

const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();

// シーケンス発行関数
function sequence(sequenceName, callback) {
    const params = {
        TableName: "sequences",
        Key: {
            name: sequenceName
        },
        UpdateExpression: "set current_number = current_number + :val",
        ExpressionAttributeValues: {
            ":val":1
        },
        ReturnValues: "UPDATED_NEW"
    };
    
    docClient.update(params, function(err, data) {
        let id;
        if (err) {
            console.error('Unable to update item. Error JSON:', JSON.stringify(err, null, 2));
        } else {
            console.log('UpdateItem succeeded:', JSON.stringify(data, null, 2));
            id = data.Attributes.current_number;
        }
        callback(id);
    });
}

exports.handler = (event, context, callback) => {

    // シーケンス取得
    sequence(table, function(id) {
        console.log("sequence:" + id);
    });
};
```

参考にした記事:
[DynamoDB でシーケンスを管理する](http://dev.classmethod.jp/cloud/aws/dyanmodb-sequenses/)
公式:
[ステップ 3.4: アトミックカウンターを増分する](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/gettingstartedguide/GettingStarted.NodeJs.03.html#GettingStarted.NodeJs.03.04)
nodebrewをインストールする

Nodebrew: GitHub
https://github.com/hokaccha/nodebrew

お馴染みのHobebrewといきたいが、どうもcurl絡みがうまく動かないので公式から取ってくる。

##　インストール

端末（Terminal.app）を開きワンライナーで実行。

```
% curl -L git.io/nodebrew | perl - setup
```

## パスの設定

.bashrc や .zshrc に Nodebrew用のパスを追記しておく。

```
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

## 動作確認

```
% nodebrew help
```
rbenvをインストールする（Homebrew）

rbenv：GitHub
https://github.com/rbenv/rbenv

## インストール

```
% brew update
% brew install rbenv
% rbenv init
```

`rbenv init`を実行すると、

```
# the following to ~/.zshrc:

eval "$(rbenv init -)"

```
と表示される。ここは素直になって ~/.zshrc に`eval "$(rbenv init -)"`を追記しておく。