OmniAICreator/Qiita-1.07M huggingface dataset:
ClojureでActive Directory Federation Server(ADFS)とSAML2連携

ClojureのアプリケーションをService Provider(SP)、ADFSサーバをIdentity Provider(IdP)としてSAML2認証をするための覚書です。

## Clojure用SAML SPライブラリ
https://github.com/k2n/saml20-clj

こちらは、https://github.com/vlacs/saml20-clj のフォークです。OpenSAMLではSHA1がSAML Requestの標準アルゴリズムになっていますが、ADFSはデフォルトではSHA256を要求します。（AD側のSP設定で変えられるようですが）私はADFSの管理権限を持っていないですし、[SHA1の衝突攻撃は現実的](http://www.security-next.com/078897)ということなので、SP側でSHA256を用いるように変更しました。

## 既存のPEMファイルからJava KeyStore(JKS)の作成
今回は、もともと[Shibboleth](https://shibboleth.net/products/service-provider.html)+NGINX+FastCGIで動作していたSAML認証が、SSLターミネーションをAWS ELB側で行うことにしたため、動作しなくなってしまった問題の回避策として始まっています。NGINXはShibbolethでは公式にサポートされておらず、[nginx-http-shibboleth](https://github.com/nginx-shib/nginx-http-shibboleth)を[dockerイメージ](https://hub.docker.com/r/matter/shibboleth-nginx/)として利用していたのですが、SSLスキームの不一致によるエラーの回避策を調べてもわからず、本家MLでも回答が期待できそうになかったので、いっそClojureアプリ本体でSAMLを扱ってしまおう、というのが動機でした。ですので、すでにopensslでcert.pemとkey.pemを生成し、Idp側に登録されていました。通常、JKSファイルは新規プライベートキーと共に生成されるのですが、ここでは既存のファイルを使ってJKSを生成します。
この例では、certificateが`sp-cert.pem`、プライベートキーファイルが`sp-key.pem`です。

* まずPEMファイルをPKCS12形式に変換します。

```
openssl pkcs12 -export -in sp-cert.pem -inkey sp-key.pem -certfile sp-cert.pem -out testkeystore.p12
```
プロンプトでパスワードを聞かれるので、適宜指定してください。

* PKCS12ファイルを基にJKSファイルを生成します。ここでは`saml-stg.jks`というファイル名にしていますが、適宜変更してください。

```
keytool -importkeystore -srckeystore testkeystore.p12 -srcstoretype pkcs12 -destkeystore saml-stg.jks -deststoretype JKS
```

* Aliasは標準で`1`が振られているので、わかりやすい名前に変更します。

```
keytool -change-alias -keystore saml-stg.jks -alias 1
```
プロンプトで新エイリアス名を尋ねられるので、名前を指定してください。

## saml20-cljの設定
quephirdさんが[saml20-cljのテスト用プロジェクト](https://github.com/quephird/saml-test)を作成してくださっています。saml20-cljを使っている人があまりいない感じで、腰が引けていたのですが、こちらでIdPとのやりとりができることを確認し、だいぶ勇気づけられました。
[こちらの設定サンプル](https://github.com/quephird/saml-test/blob/master/src/saml_test/core.clj#L7)を見れば、だいたいのところは見当がつきます。気づいた点を挙げておくと...

* `app-name`はentityIDに使われるのですが、URLが望ましいということで、`https://sp.example.com/saml/meta`を指定しておきました。
* `idp-uri`は、ADFSの場合、https://sso.example.com/adfs/ls/ を指定します。
* `idp-cert`は、https://adfs.example.com/federationMetadata/2007-06/federationMetadata.xml
の`/EntityDescriptor/RoleDescriptor/KeyDescriptor[@use="signing"]/KeyInfo/X509Data/X509Certificate`を指定します。関数のドキュメントでは指定しなければverificationをしないだけでオプショナルだよ、と書いてありますが、実際はこれを指定しないと平文化したSAMLResponseを返してくれません。
* `keystore-file`はプロジェクトルートからの相対パス、または絶対パスで上で生成したJKSファイルを指定します。
* `keystore-password`は生成時に指定したパスワードです。`def`のため、JVM起動時に評価されます。パスワードが指定されていないと、JKSファイルが壊れているかもというエラーが出てしまいますので、環境変数などで外出ししている場合は必ずコンパイル時に正しいパスワードが渡るように設定しておく必要があります。
* `key-alias`は前項のステップで指定したエイリアス名です。
* relay-stateの検証がなぜか失敗します。今回のユースケースでは転送先は固定で、SAML Requestとともに渡す必要が無いので、[relay-stateのHMAC検証](https://github.com/quephird/saml-test/blob/master/src/saml_test/routes.clj#L88)のロジックは無効にしてしまいました。
Jupyter NotebookでWindowsのコマンドプロンプトの命令を実行する

# はじめに
最近 Jupyter Notebook にハマっています．
仕事での計算も，しばらく前までは Fortran 90 がメインでしたが，最近は Python3 に一本化しつつあり．Jupyter Notebook で関連プログラム類をまとめて実行・管理しています．
通常，これらの計算は，Macbook Pro 13inch Retina で行っていますが，どうしても会社支給の Windows PC でやらなければならない場合も生じてきており，Windows PC に Anaconda を入れまてみました．Python3 はもちろん，matplotlib, numpy, scipy も入っており，インストールも簡単でした．
ただし，Jupyter Notebook が入っている Anaconda Navigator を立ち上げるのに１分以上かかり，その待ち時間が結構ストレスです．まあ，一分一秒を争うわけではないので，そこは横においてある Mac をいじりながら時間つぶししています．

# やりたいこと
雑談はこれくらいにして．．．．．
計算結果を matplotlib で図化し画像出力するまではいいのですが，報告書を MS-Word で作ることが義務付けられており，これにたくさんの画像を一枚一枚貼り付けるのは大変面倒な作業です．そこで，関連する画像を結合して Word に画像を貼り付ける作業を減らすことを考えるわけです．
画像の結合は Python でプログラムを作る手もありますが，私自身画像の取扱は全くの素人でよくわかりません．ここで登場するのが，ImageMagick．
Mac なら，Jypyter Notebook の Code セルに bash のスクリプトを書き，ImageMagick のコマンドを実行できますが，Windows ではどうしたものか？

そこで思いついたのが，一手間かかりますが，Python の subprocess を使ったプログラムを作り実行すること．

以下に具体例を示します．

### Jupyter Notebook で実行する Shell スクリプト（Macの場合）
ImageMagick コマンドの意味するところは以下の通り．

+ 画像 fig_chart1.png の余白を調整して画像 \_1.png に出力
+ 同様に画像 fig_chart2.png の余白を調整して画像 \_2.pngに出力
+ 画像 \_1.png と \_2.png を横に繋いで fig_flow.png を作成

```
%%bash
convert -trim fig_chart1.png -bordercolor 'white' -border 50x50 _1.png
convert -trim fig_chart2.png -bordercolor 'white' -border 50x50 _2.png
montage -tile 2x1 -resize 100% -geometry +0+0 _1.png _2.png fig_flow.png
```

### Jupyter Notebook で実行する Python プログラム

Python プログラムでは，ImageMagick コマンドを文字列 cmd1, cmd2, cmd3 に格納して，```subprocess.call(cmd,shell=True)```で実行します．

```
import subprocess

cmd1='convert -trim fig_chart1.png -bordercolor "white" -border 50x50 _1.png'
cmd2='convert -trim fig_chart2.png -bordercolor "white" -border 50x50 _2.png'
cmd3='montage -tile 2x1 -resize 100% -geometry +0+0 _1.png _2.png fig_flow.png'
subprocess.call(cmd1,shell=True)
subprocess.call(cmd2,shell=True)
subprocess.call(cmd3,shell=True)
print('end')
```

上記により，Mac & Windows で ImageMagick を用いた同じ処理が可能となります．
もちろん ImageMagick は各マシンに別途インストールしなければなりません．

以　上
Pythonでスクレイピングをする際にwebdriverのchrome.exeのプロセスが残る



表題の通り。chrome起動にselenium webdriverを使用してたら、タスクマネージャーでリソースモニターを開きプロセスを監視していると大量のchrome.exeが残っている。

chromeの設定→詳細設定→システムの
「Google Chromeを閉じた際にバックグラウンドアプリの処理を続行する」にチェックが入っている場合は、検索などのために都度開いているchromeのバックグラウンド処理の可能性があるのでそれをはずせばよいが、今回は定期実行のスクレイピングプログラムでのwebdriver使用が原因で実行終了後もプロセスが残る。なので、スクレイピング処理の最後に下記の2つを追加で解決。

```pyhotn
WebDriver.close()
WebDriver.quit()
```
Cell上のLabelの行数に合わせてCellの高さを動的に設定する

いろいろなところでこのTipsは紹介されていますが、自分用にわかりやすいようメモ。

## Xib上の操作
### パーツの配置
とりあえず、レイアウトしたいパーツをXibのキャンバス上に並べる

<img width="687" alt="スクリーンショット 2017-03-24 15.40.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/65686/8024b305-9615-886a-0559-3da565eaaa0a.png">

ここでは...
・label：セル内左部に固定したラベル
・value：中身の文字数に応じて複数行に対応し、行数が少ない場合は文字を上寄せで表示するラベル
として扱う。

このとき、valueの縦幅は改行されることを想定した大きさで予め作っておく。

### 制約の追加
セルの高さに直接影響するラベル（ここではvalue）に対して、以下の制約を追加する。

・上下の位置（top,bottomを指定 もしくはcenterYで中央）
・左右の位置（leading,trailing）

### Linesを0または必要な最大数にする
<img width="256" alt="スクリーンショット 2017-03-24 17.01.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/65686/b6f356ae-b05b-3e13-2f1c-df4e08e7232c.png">

## コードの記述（Self-Sizing Cells）
以上の設定が終わったら、このcellを使うtableviewを定義している部分で、以下の記述を追加する

```swift:Self-SizingCellsの設定 
self.tableView.estimatedRowHeight = 44 //テキトーな値
self.tableView.rowHeight = UITableViewAutomaticDimension
```
**ただし、上記の書き方をすると全セル共通で動的な高さを与えてしまう。**

複雑なレイアウトが入り組む詳細ページなどでは、セルによって高さを固定したかったり動的に変えたりしたいことがある。今回自分が遭遇したのはそういうケース。
ということで、

```swift
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {}
```
の中で特定のindexPathに対して ``UITableViewAutomaticDimension`` を ``return`` してあげるようにして対応した。Self-Sizing Cellsのポリシーに反している気がする...

## 結果
こうなった。
文字数にあわせて改行されている
<img width="317" alt="スクリーンショット 2017-03-24 17.13.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/65686/53e9c581-d14a-9ce3-be62-0ea2fb6e15d9.png">
embulkでSQLなどの長いパラメータを複数行で記述する

## はじめに

embulkで`embulk-input-jdbc` などを使っていると、`query` に長いSQLを書きたいときがあります。
次のように工夫することで複数行に渡る文字列を記述することができます

## 方法1: YAMLの複数行リテラルを使う方法

`|` を使うと複数行の入力ができます

```yaml
in:
    type: mysql
    host: localhost
    user: root
    password: foobar
    query: |
       SELECT 
          ID,
          NAME
       FROM
          USER_MST      
```

## 方法2: liquidの`capture` を使う方法

`{%capture%} ... {%endcapture%}`を使った方法です。

1. 複数行リテラルを`capture`で変数`raw_query`に代入する
2. さらに変数`query`に改行コードを除いたものを代入する
3. YAML内で`query` を参照する


```yaml
{%capture raw_query %}
       SELECT 
          ID,
          NAME
       FROM
          USER_MST 
{%endcapture%}
{% capture query %} {{ raw_query | strip_newlines }} {%endcapture%}
    type: mysql
    host: localhost
    user: root
    password: foobar
    query: {{query}}
```

変数`query`を使わず、YAML内に{{ raw_query | strip_newlines }}  と書いてもOKです。
Swift3.0でUTを書く　~Manual Mocking~

# **UTの作成準備**
### Objective-CクラスをSwiftでテストコードを作成する場合
1. AppTestsファイルに新規で「Unit Test Case Class」ファイルを追加する。
    - サブクラス：XCTestCaseになっていることを確認
    - Language：Swiftにする
TargetはAppTestsのみにチェックを入れる (ここで余計なファイルにチェックすると「Cannot load underlying module for ‘XCTest’」のコンパイルエラーが起こる。。。)


1. Objective-C Bridging Headerを作成する。以下のダイアログが出たら「YES」を選ぶと自動で作ってくれる。
(AppTestsのBuildSettingのSwift Compiler - GeneralのObjective-C Generated Interface Header Name にも自動的に登録される)

    　　　![1 bridge-alert.png](https://qiita-image-store.s3.amazonaws.com/0/171345/f28dbd37-32ce-85e1-b33c-8a26ffc3fe36.png)

1. Bridging HeaderファイルにSwiftのUTクラスで利用したいObjective-Cクラスのimportを記述する。
(今回はAppTests-Bridging-Header.hという名前で作成)
        
    ```objc:AppTests-Bridging-Header.h
    #ifndef App_Bridging_Header_h
    #define App_Bridging_Header_h
  
    // Swiftのテストクラスで使いたいObj-CクラスのHeaderを記述する
    #import "App.h"
    #import "AppSetting.h"
    #endif
    ```
         
1. 作成したUTクラスに「import XCTest」があることを確認する。


### SwiftクラスをSwiftでテストコードを作成する場合
1. プロジェクトファイル .xcodeproj の "Defines Module" を YES に設定。→ Xcodeで対象のプロジェクトを開き、Build SettingsのDefines Modulesを "YES"にする
2. 各テストクラスで @testable import YourAppModuleName を追記する。

# **Manual Mocking**
## Manual Mockingとは・・・
- Swiftでテストコードを書く場合のスタブ・モック作成が可能、(Obj-CクラスのテストをSwiftで書くときにも使用可)
- Xcodeに標準装備
- XCTestをimportしていれば利用できる(ライブラリのインストールなどは不要)
- あるクラスの特定のメソッドをモック化し、戻り値などを任意に変更できる
- テスト用の関数内でスタブ化したいクラスのサブクラスを作成し、メソッドをオーバライドすることによって、モッククラスのスコープをその関数内で利用できる


## Manual Mockingを利用したUT


```objc:AppSettingTest.swift
    /// Bridging-Header.hを作成しているのでXCTest以外のimportは無し
    /// Swiftクラスをテストする場合もXCTestのｉｍｐｏｒｔは必要
    import XCTest　
  
    @testable import App /// Swiftクラスのテストコードを作成するときに記述する. Obj-Cのみの場合は必要ない
  
    class AppSettingTest: XCTestCase {
 
        /// Appをテストクラス内で使い回すためにプロパティとして準備する(テストメソッドごとに作成してもOK)
        var app: App? = nil
 
        override func setUp() {
 
            super.setUp()
 
            /// Manual Mocking：Mock用インスタンスの中身を変更する
            class AppMock: App {
                override func isApp() -> Bool { ///AppクラスのisApp()メソッドをモック化して戻り値を指定
                    return true
                }
            }
 
            /// Mock化したメソッドを含んだクラスを空のインスタンスに入れる
            self.app = AppMock()
        }
  
        func testAppVersion() { /// このメソッドはAssertの例を示すために架空のメソッドを追加している
            /// AssertはXCTestの書き方
            XCTAssertTrue(app?.isApp())
            XCTAssertFalse(app?.isApp())
        }
    }
```
AWSのEC2でマイクラの鯖建てした時のメモ

先駆者の方々のおかげで無事できましたとさ。
というわけで自分用のメモ。

# 参考したところ
[AWSでminecraftサーバーを立てたお話](https://ayatk.com/blog/aws-minecraft/)
[Minecraft サーバーを Amazon EC2 上に構築](http://qiita.com/EugeneAshizawa/items/d88f4d2778e738efe2eb)
[Amazon EC2にMinecraftサーバーを構築する方法](http://blog.praisefirst.jp/2014/05/amazon-ec2minecraft.html)

## 自分の作業環境
・mac OSX capitan（ターミナルから接続するため）
・windows10（ゲーム本体がこっちに入っている）
・お菓子（モチベ維持のため）

windowsだけでもawsに接続して設定できるけどもなんかインストールだとかがめんどくさかったのでmac選びました。
結果的に、両方起動させてることになっちゃったけど、私は特に無問題。

## 使っているサービス
AWSのEC2
一年間の無料枠があるので今回はそれを利用。
![スクリーンショット 2017-03-24 16.30.28.png](https://qiita-image-store.s3.amazonaws.com/0/149691/76c9f7d7-8cde-5b13-e55b-c44de086be6c.png)
を使っています。無料枠が確かマイクロなのでこれ
3人でプレイしてて1時間か2時間に一回落ちるかな？って感じ。
でもネザー入ったときは落ちなかった。ちょっと落ちる原因探し中。
インスタンスは停止、再起動するとデータが消えるうんぬん出るんですけど、EBSに保存されてる感じだから気にしなくてイイノカナー
多分大丈夫、確認したらデータ保存されてるし...？

## 流れ
詳しい作り方は上の参考にしたものをご参照ください。
私は一から作った方法とりましたが簡単な方法もあるみたい。
流れ的には
AWS登録
↓
EC2で無料枠を選ぶ
↓
インスタンス生成
↓
設定する。ちょっと多い
↓
キーペア作ってダウンロード
↓
作成したインスタンスにターミナルから接続
↓
awsの文字が出たらマイクラマルチ用クライアントとか落とす
↓
設定ちょっと触ってマイクラマルチのクライアント？を起動する

っていう感じ。めちゃ端折ってる

ターミナルから接続する時は、ダウンロードしたキーペアでssh通して接続。ssh接続するためのキーペアて感じだっけ

キーペアの場所（自分はdownload）に移動→chmodで400でキーペアの名前叩いて→ログイン
みたいな。ログイン後マイクラするためには[マイクラ公式](https://minecraft.net/ja-jp/download/server)に書いてある
> java -Xmx1024M -Xms1024M -jar minecraft_server.1.11.2.jar nogui

を入れたら立ち上がります。すごーい

#おわり
ゲームを終えたらインスタンスを停止させよう！じゃなきゃなんか怖いぞ！
1時間ごとに課金のようなのでずっとつけっぱなしだと怖い。大変なことになった人もいるみたいだし。
今確か6時間ほど遊んでるけど、請求ダッシュボードみたら＄0.62だった。

いろいろ条件下で無料枠の範囲超えちゃったりするみたいなのでちゃんと説明を読んで楽しくゲームしよっ！

ぶっちゃけ自分のパソコンを鯖にするより簡単だった。

AWS興味あったけどどうやって使うか悩んでたから、こうやって使ってみて試すのもありだなって思ったり。
Android の Library を Travis CI でビルドしたときだけエラーになったときの対処方法

# はじめに

結果だけ簡潔に書きます

**モジュール名とディレクトリ名が違っていました**

# やったこと

ディレクトリ名: SDK
モジュール名: sdk

```
* What went wrong:
A problem occurred configuring project ':example'.
> Could not resolve all dependencies for configuration ':example:_debugApk'.
   > Project :example declares a dependency from configuration 'compile' to configuration 'default' which is not declared in the descriptor for project :sdk.
```

Android Studio の Refactor 機能を利用して、

ディレクトリ名: sdk
モジュール名: sdk

に変更すると正常にビルドできました

# 環境・設定

## PC 

- MacBook Pro
  - macOS Sierra バージョン 10.12.3

## .travis.yml

```yaml:.travis.yml
language: android
sudo: required
android:
  components:
  - tools
  - platform-tools
  - build-tools-25.0.1
  - android-25
  - extra
script:
- "./gradlew clean build"
branches:
  only:
  - master
  - develop
  - "/^release.*$/"
```

# 備考

ローカルだと何の問題もなくビルドが成功しました
Python / datetime > YYYYMMDD形式をYYYY/MM/DDに変換する実装

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 3.6.0 on virtualenv
```

20170324という文字列を2017/03/24という文字列に変換したい。

- 方法1: スライス使用
   - 参考: http://stackoverflow.com/questions/4022827/insert-some-string-into-given-string-at-given-index-in-python
- 方法2: datetime使用
   - 参考: http://qiita.com/shibainurou/items/0b0f8b0233c45fc163cd

```test_python_170324k.py
orgstr = "20170324"  # YYYYMMDD
print(orgstr)

# 1
newstr = orgstr[:4] + '/' + orgstr[4:6] + '/' + orgstr[6:]
print(newstr)

# 2
from datetime import datetime as dt
adt = dt.strptime(orgstr, '%Y%m%d')
newstr = adt.strftime('%Y/%m/%d')
print(newstr)
```

```txt:結果
$ python test_python_170324k.py 
20170324
2017/03/24
2017/03/24
```

最初はinsertなど考えていたが、
http://stackoverflow.com/questions/4022827/insert-some-string-into-given-string-at-given-index-in-python
によると
> answered Oct 26 '10 at 12:02
bgporter
An important point that often bites new Python programmers but the other posters haven't made explicit is that **strings in Python are immutable** -- you can't ever modify them in place

とのこと。
UIテスト自動化 Seleniumを試してみて

### はじめに
----
Seleniumを開発に取り入れてみてどうだったかを書いていく。
今後の設計・開発で考慮すべきこと等をまとめる。

### Seleniumとは？
----
* Webブラウザを使ったテスト自動化を実現するフレームワーク  
* マルチブラウザでのテストが可能  

### 目的
----
- 機能追加・修正に伴うデグレの防止
- 特定のブラウザでのみ動作しないといった不具合が発生した為、こういった事象をリリース前に確認すること

### 今回の試みで目指した姿
----
selenium webDriverを使った、マルチブラウザでテストを実行する。
テストコードは各ユースケースで1つとし、以下のブラウザでサイトの動作を確認する。
また、スマートフォンでも同様にサイトの動作を確認する。

###### PCブラウザ
* FireFox
* Chrome
* IE11
* MSEdge

###### スマトーフォン
* Android
* iOS

### 実施する上での課題
----
- ブラウザの切替
 - 複数のブラウザをテストする為、手動でブラウザを切替るということは避けたかった。
- 社内Proxy
 - 開発環境を利用してテストをする為、社内Proxy越しにテストを行うと、毎回Proxyの認証を行う必要があった。seleniumはテストケース終了毎にブラウザが閉じられる為、全てのテストケースで認証が発生してしまう。

### 感想
----
- 今回の開発では、seleniumを利用することを前提としてシステム設計を行っていなかったが、統合テストで実施したテストケースの約8割をseleniumで置換えられそう。
- 既にIT・STともに終了した段階で自動テストを適用した為、テストケースのメンテナンスを行う必要が少なかった。
- UIテスト自動化は適用するタイミングが難しい。動作保障は単体テストでやるべき。キャプチャリプレイツールという前提から外れることは避けたほうが無難。
- 感覚としてですが、ITとSTの間にあると良いくらいのイメージ。何をしたいのか？狙いを絞って使わないとメンテナンスコストだけが大きくなってしまうかも。

### 向き・不向き
----
利用した方が良い場面

- マルチブラウザ対応を行う場合（ただし、アンチパターンでもある）
- レスポンシブなサイトを開発する場合（PC・スマートフォン両方で検証したい）

避けた方が良い場面

- メンテナンスコストを負担出来ない場合

### 今後に向けて
----
- pageObjectパターンの適用 ← 興味有り。次回は是非とも。
- selenium Grid ← 設計を考慮し、分散実行出来るように作ると、テスト時間の短縮や制約から抜け出せることも。
- アンチパターンの調査・学習。実際にseleniumを使おうを思っている場合は、勉強してからが良いでしょう。

参考

[selenium antipatterns](https://www.slideshare.net/miyajan/selenium-antipatterns)
CodeClimateでチェックするルールを変更する

CodeClimateを使っていて特定のチェックを無視したい場合は`.codeclimate.yml`でカスタマイズできる。
今回はPHPの場合です。

phpmdで短い変数名だとCodeClimateのissuesに上がってきますが、
これをチェックしたくない場合は`.codeclimate.yml`を作成して以下のように記述します。

```codeclimate.yml
engines:
  phpmd:
    enabled: true
    checks:
      Naming/ShortVariable:
        enabled: false
ratings:
  paths:
  - "**.php"

```

これでNaming/ShortVariableはチェックされなくなります。

他にもルールを変更したい場合はCodeClimateのissuesの一覧画面で右上に目みたいなアイコンがあるので、
そこの「Disable Check」をクリックします。

![スクリーンショット 2017-03-24 16.20.17.png](https://qiita-image-store.s3.amazonaws.com/0/70971/ad6ea879-00ae-f72c-05c3-5207cb81a4fc.png)


そうすると`.codeclimate.yml`の記述例が表示されます。

![スクリーンショット 2017-03-24 16.20.21.png](https://qiita-image-store.s3.amazonaws.com/0/70971/d5de11f0-e3d3-dd88-0171-712ca6056e13.png)

あとはその内容を`.codeclimate.yml`に記述すればOKです。
problem that certificate verify failed on mac python pip

OpenSSL: installed by Homebrew

## The Answer
http://stackoverflow.com/questions/24675167/ca-certificates-mac-os-x

## The Problem

```bash
$ pip install tox
Collecting tox
  Could not fetch URL https://pypi.python.org/simple/tox/: There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:645) - skipping
  Could not find a version that satisfies the requirement tox (from versions: )
No matching distribution found for tox
```

SSL errors caused and can not continue installing … :cry:

## The Solution

Open *Keychain Access* and select all certs in system root and export them.

![image](https://qiita-image-store.s3.amazonaws.com/0/17305/fcdce093-0439-281c-1b4c-3d16193d99ad.png)

Save exported pem into `/usr/local/etc/openssl/certs`. (← check `brew info openssl`)

<img src=https://qiita-image-store.s3.amazonaws.com/0/17305/af949b50-c38e-cfb9-112f-97d5dd440c7c.png width=400>

Then run rehash command.

```bash
$ /usr/local/opt/openssl/bin/c_rehash

$ pip install tox

Requirement already satisfied: tox in /usr/local/lib/python2.7/site-packages
Requirement already satisfied: pluggy<0.4.0,>=0.3.0 in /usr/local/lib/python2.7/site-packages (from tox)
Requirement already satisfied: virtualenv>=1.11.2 in /usr/local/lib/python2.7/site-packages (from tox)
Requirement already satisfied: py>=1.4.17 in /usr/local/lib/python2.7/site-packages (from tox)
```

It worked!
Gitで、Pull Request での変更をプレビューするコマンド

今まで、 `git diff master` とかで、今いるブランチをマージしたらどう変更されるのか調べていた。

ただしこれはリモートの方が別ブランチで更新されたらそれも出てしまうので、毎回GitHubに行ってプルリクの画面を見ていた。

さすがに効率化した方が良いと思ったので書いた。

とりあえずこれでできた。多分もっといい方法があるはずなのだが。

```bash:~/bin/git-pr-preview
#!/bin/bash

current_branch=$(git branch --contains=HEAD | awk '{print $2}')

git checkout origin/master
git merge --no-commit --no-ff $current_branch
git diff HEAD
git merge --abort
git checkout $current_branch
```

参考
http://stackoverflow.com/questions/5817579/how-can-i-preview-a-merge-in-git
Unityのshaderで動く雲っぽいやつ

いつもどうやってつくるんだったっけってなるので記録を残しておく

![5d745321c2e16bd68dc87c54c06386f6.gif](https://qiita-image-store.s3.amazonaws.com/0/108368/8555666a-f69b-2042-8a9c-cf634a111a66.gif)


#コード

```glsl:qiita.glsl

Shader "Unlit/KUMO"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog
            
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            float Circle(float2 p){
				p*= 10.0;

				return ((p.x*p.x+p.y*p.y)-10);
			}
            
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            float rand(float3 co)
{
return frac(sin(dot(co.xyz, float3(12.9898, 78.233, 56.787))) * 43758.5453);
}

            float rings(float2 p){
				return sin(length(p)*100);
			}

			float noise(float3 pos)
{
float3 ip = floor(pos);
float3 fp = smoothstep(0, 1, frac(pos));
float4 a = float4(
rand(ip + float3(0, 0, 0)),
rand(ip + float3(1, 0, 0)),
rand(ip + float3(0, 1, 0)),
rand(ip + float3(1, 1, 0)));
float4 b = float4(
rand(ip + float3(0, 0, 1)),
rand(ip + float3(1, 0, 1)),
rand(ip + float3(0, 1, 1)),
rand(ip + float3(1, 1, 1)));
a = lerp(a, b, fp.z);
a.xy = lerp(a.xy, a.zw, fp.y);
return lerp(a.x, a.y, fp.x);
}

			float perlin(float3 pos,float time){
			return 
(noise(pos) +
noise(pos * 2 ) +
noise(pos * 4) +
noise(pos * 8) +
noise(pos * 16-time) +
noise(pos * 32+time) ) / 6;
}

            
            fixed4 frag (v2f i) : SV_Target
            {
           
               	float s = _Time*10;

		
              
               float2 m = i.uv+perlin (float3(_Music*10,_Music*10,0),s);
               float4 col = float4(0,0,1,1)+float4(perlin (float3(i.uv,0),s),perlin (float3(i.uv,0),s),perlin (float3(i.uv,0),s),1);
        
               return col;
                }

                 
            
            ENDCG
        }
    }
}
```


パーリンノイズでいい感じにしてあげてあとは動かす！

終わり
Python / subprocess > Symbolic link先のファイル名だけ取得する実装 > os.readlink()を教えていただきました

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 3.6.0 on virtualenv
```

```
$ touch test_original_170324
$ ln -fs test_original_170324 LN_link_170324
$ ls -l LN_link_170324 
lrwxrwxrwx 1 user user 20 Mar 24 16:06 LN_link_170324 -> test_original_170324
```

LN_link_170324の元リンクファイルである`test_original_170324`をPython scriptから取得したい。

参考 [python3で外部のシェルスクリプト（ls）とかの返り値を取得](http://qiita.com/kamuiroeru/items/d97ede9fa9f3781060e7)
参考 https://docs.python.jp/3/library/subprocess.html

```test_python_170324j.py
from subprocess import getoutput

# Python 3.6.0 on virtualenv

cmd = 'ls -l LN_link_170324'
last = getoutput(cmd).split(' ')[-1]
print(last)
```

```txt:結果
$ python test_python_170324j.py 
test_original_170324
```

### 教えたいただいた事項
(追記 2017/03/25)

@komeda-shinjiさんに[コメント](http://qiita.com/7of9/items/526e8707ae6e7c4f3583/#comment-b368d7b7ded184b4d7b6)にてos.readlink()を教えていただきました。

情報感謝です。
ActionView::Template::Error: 'nil' is not an ActiveModel-compatible object. It must implement :to_partial_path.　解決方法

#**いいね！（Like!)機能を作っていましたが、ActionView::Template::Error: 'nil' is not an ActiveModel-compatible object. It must implement :to_partial_path.**

私の場合、
```show.html.erb
          <%= link_to @blog.likes.count, liking_users_blog_path(@blog.id), id: "like-count"  %>人がいいね！といっています
```
の場所から、
ActionView::Template::Error ('nil' is not an ActiveModel-compatible object. It must implement :to_partial_path.)が出てしまいました。
そこでこのエラーメッセージの**"nil"**に注目致しました。
```/liking_users.rb
<%= render @users %>
```

このviewファイルの中にある<%= render @users %>がnilというエラー画面によるヒントを元に、
解決しました。

このエラー解決手順の考え方は、
まず@usersの中がnilであるがために、<%= render @users %>が呼ばれても、
エラーとして機能しないのである。
おそらくここまでの過程をcodingしているのなら、
ある程度機能としては、うまくいっているだろうと思う。

私の場合、controllerに着目しました。
このviewファイルの<%= render @users %>を呼び出せるように、
定義しているかどうかを。

```blogs_controller.rb
class BlogsController < ApplicationController
def liking_user
    @users = @blog.liking_users
end
```

def liking_userのuserをusersにすればいいことでした。
つまり、

```blogs_controller.rb
class BlogsController < ApplicationController
def liking_users
    @users = @blog.liking_users
end
```

ということ。

ActionView::Template::Error: 'nil' is not an ActiveModel-compatible object. It must implement :to_partial_path.のエラーが出たら、renderしたい@xxxxxの定義をちゃんとコントローラーに定義しているか、もしくはどのように定義しているか、
確認しましょう！


##参考にしたサイト
http://stackoverflow.com/questions/17569368/ruby-render-error
Python3 リスト・タプル・辞書・集合の基本的な操作一覧

# 概要

Pythonのリスト・タプル・辞書・集合の基本的な操作について忘れやすいのでメモ。Python 3.x系での挙動。

# is mutable?
| リスト | タプル | 辞書 | 集合 |
|:-:|:-:|:-:|:-:|
| Yes | <font color="$EE0000">No</font> | Yes | Yes |

# 基本操作早見表
| 操作 | リスト | タプル | 辞書 | 集合 |
|:--|:--|:--|:--|:--|  
| 空コレクションの生成 | `list()` <br> `[ ]` | `tuple()` <br> `( )` | `dict()` <br> `{ }` | `set()` |
| リテラル | `[0, 1]` | `(0, 1)` | `{'A': 0, 'B': 1}` | `{0, 1}` |
| 複製 (浅いコピー) | `list(a)` <br> `a.copy()` <br> `a[:]` | `tuple(a)` <br> <sub>代入</sub> | `dict(a)` <br> `a.copy()` | `set(a)` <br> `a.copy()` |
| 追加 | `a.append(val)` | - | `a[key] = val` | `a.add(val)` |
| 結合 (in-place) | `a.extend(b)` <br> `a += b` | - | `a.update(b)` | `a.update(b)` <br> `a` &#124;`= b` |
| 結合 (not-in-place) | `a + b` | `a + b` | - | `a` &#124; `b` <br> `a.union(b)` |
| 結合 (starred expression[^starred]) | `[*a, *b]` | `(*a, *b)` <br> `*a, *b` | `{**a, **b}`  | `{*a, *b}` |
| 挿入 (単一要素) | `a.insert(idx, val)` <br> `a[idx:idx] = val,` | - | - | - |
| 挿入 (複数要素) | `a[idx:idx] = b` | - | - | - |
| 積集合 | - | - | - | `a & b` <br> `a.intersection(b)`  |
| 差分 | - | - | - | `a - b` <br> `a.difference(b)`  |
| 削除 (値指定) | `a.remove(val)` | - | - | `a.remove(val)` |
| 削除 (キー指定) | `del a[idx]` <br> `del a[start:stop:step]` | - | `del a[key]` | - |
| 全削除 | `a.clear()` <br> `del a[:]` | - | `a.clear()` | `a.clear()` |
| 要素数 | `len(a)` <br> `a.count()`  | `len(a)` | `len(a)` | `len(a)` |

[]( |  | `` | `` | `` | `` | )

[^starred]: Python 3.5から使用可能。
忘れやすいCSSセレクタ

#アスタリスク（`*`）ですべての要素にスタイルを適用することができます。

▼すべての要素に適用されます。
* {
  color:red;
}

▼p要素の中にある要素すべてに適用されます。
p * {
  color:red;

}

#クラス名を半角スペースで区切ると複数適用することもできます。
■　CSS　■
p.sample1 {
  color:red;
}
p.sample2 {
  font-size:18px;
}

■　HTML　■
<p class="sample1 sample2">2種類のスタイルが同時に適用されます</p>

セレクタを半角スペースで区切ると、ある要素の下の階層にある要素にスタイルを適用します。
p strong {
  font-size:16px;
}

▼pタグの中にあるstrong要素に適用されます。
<p>このようにpタグのなかにある<strong>strongタグ</strong>に適用されます。</p>

#セレクタを「>」で区切ると、ある要素の直下の階層にある要素にスタイルを適用します。
div.sample > a {
  font-size:18px;
  font-weight:bold;
}

クラス名sampleの直下にあるa要素にのみ適用されます。

```
<div class="sample">
  <a href="#">リンク1<a/>
  <ul>
    <li><a href="#">リンク1<a/></li>
  </ul>
<div>
```

#▼「+」で隣接している要素にスタイルを適用することができます。
h4要素に隣接しているp要素の文字が赤になります。

```
<h4>H4要素</h4>
<p>h4要素の隣にあると適用されます</p>
<p>h4要素の隣ではないので適用されません</p>
```

#「~」である要素の後にある要素にスタイルを適用することができます。
h4要素に隣接しているp要素の文字が赤になります。

```
h4 ~ p {
  color:red;
  font-weight:bold;
}

<p>h4要素のの前なので適用されません</p>
<h4>H4要素</h4>
<p>h4要素の後にあると適用されます</p>
<p>h4要素の後にあると適用されます</p>
```

#最初の行にだけ適用
:first-lineを指定することで、最初の行にだけ適応されます。今回の場合1行目だけ赤い太字になり、2行目からは元に戻ります。

```
:first-line

p:first-line {
  font-weight:bold;
  color:red;
}

#最初に現れる要素にだけ適用
:first-child
p:first-child {
  font-weight:bold;
  color:red;
}

<p>最初のp要素にだけ適用されます。</p>
<p>2つ目以降のp要素には適用されません。</p>

```

#n番目に現れる要素に適用
:nth-of-type(n)でn番目に現れる要素にスタイルを適用します。
2番目に現れるp要素にのみ適用されます。

```
p:nth-of-type(2) {
  font-weight:bold;
  color:red;
}

<p>1行目</p>
<p>2行目</p>
<p>3行目</p>
<p>4行目</p>
<p>5行目</p>

nの部分は以下のように複数指定することもできます。
:nth-child(n)　･･･　n番目の要素に適用
:nth-child(odd)　･･･　奇数番目の要素に適用
:nth-child(2n+1)　･･･　奇数番目の要素に適用
:nth-child(even)　･･･　偶数番目の要素に適用
:nth-child(2n)　･･･　偶数番目の要素に適用
:nth-child(3n)　･･･　3,6,9,12…番目の要素に適用
:nth-child(3n+1)　･･･　1,4,7,10…番目の要素に適用

```

#後ろからn番目に現れる要素に適用
:nth-last-of-type(n)で後ろから数えてn番目に現れる要素にスタイルを適用します。nの使い方は先ほどと同じです。

```
p:nth-last-of-type(2) {
  font-weight:bold;
  color:red;
}
後ろから2番目に現れるp要素にのみ適用されます。
<p>1行目</p>
<p>2行目</p>
<p>3行目</p>
<p>4行目</p>
<p>5行目</p>

```

#オンマウス時に適用
:hover
hoverといえばリンクですが、divでも利用できます。ただしIE6はダメ

```
div.onmouse:hover {
  background:#eee;
}

#該当しない場合に適用
指定したセレクタに該当しない場合にスタイルが適用されます。
p:not(#sample) {
  font-size:18px;
}
「sample」というidを付けられたpタグ以外にスタイルが適用されます。
body *:not(strong) {
font-size:18px;
}
```

#チェックされているユーザーインターフェース要素に適用
ようするにラジオボタンやチェックボックスです。

```
input[type=radio]:checked + label {
  color: red;
  font-weight:bold;
}
```

#チェックされてボタンに直接スタイルを適用するのではなく、その隣のラベルに適用します。

```
<form>
   <input type="radio" name="btn" value="sample1">
   <label>ボタン1</label>
   <input type="radio" name="btn" value="sample2">
   <label>ボタン2</label> 
</form>
```

#属性セレクタ

##特定の属性を持つ要素に適用
E[foo]　

```
a[title] {
  font-weight:bold;
  color:red;
}
```

##特定の属性(値)を持つ要素に適用する
E[foo="bar"]
tittle属性に「タイトルその1」という値を持つa要素にスタイルを適用します。

```
a[title="タイトルその1"] {
  font-weight:bold;
  color:red;
}
```

##属性の値が指定した文字で始まる場合に適用する
tittle属性が「タイトル」で始まる場合にスタイルを適用します。

```
a[title^="タイトル"] {
  font-weight:bold;
  color:red;
}
```

##属性の値が指定した文字で終わる場合に適用する

```
a[title$="タイトル"] {
  font-weight:bold;
  color:red;
}
```

##属性の値が指定した文字を含む場合に適用する
tittle属性が「その」を含む場合にスタイルを適用します。

```
a[title*="その"] {
  font-weight:bold;
  color:red;
}
```
k8sのingressにsecret経由で証明書を設定する

GKEだとこれでうまくいった

secret 作る

~~~
$ kubectl create secret tls mycert --key /tmp/tls.key --cert /tmp/tls.crt 
~~~

作ったsecretを参照して設定
ingress.yml

~~~
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ing
  annotations:
    kubernetes.io/ingress.allow-http: "false"
spec:
  tls:
    - secretName: mycert
  backend:
    serviceName: mysvc
    servicePort: 80
~~~
【MySQL】グループ毎に連番を振る

# 用途
日付順で表示していた一覧にソート順変更機能を追加したい時の既存データの変換対応など

# 抽出方法
| id | group_id | title   | description | created_date        |
|:---|:---------|:--------|:------------|:--------------------|
|  1 |        1 | 件名1   | 本文1       | 2017-03-24 14:47:16 |
|  2 |        1 | 件名2   | 本文2       | 2017-03-24 14:47:21 |
|  3 |        1 | 件名3   | 本文3       | 2017-03-24 14:47:26 |
|  4 |        2 | 件名4   | 本文4       | 2017-03-24 14:47:30 |
|  5 |        2 | 件名5   | 本文5       | 2017-03-24 14:47:35 |
|  6 |        3 | 件名6   | 本文6       | 2017-03-24 14:47:39 |


上記のテーブルのgroup_id毎に1からはじまる連番を振りたい。
created_dateの古いものから連番を振っていく。

```mysql:
set @no:=0;
set @groupid:=null;

select
    id,
    group_id,
    title,
    description,
    created_date,
    if(@groupid <> group_id, @no:=1, @no:=@no+1) as no,
    @groupid:=group_id
from articles
order by group_id,created_date;
```

前の行の値と比較し、違う値に変わっていたら1を代入、group_idが同じ場合は1ずつ追加していく。


| id | group_id | title   | description | created_date        | no   | @groupid:=group_id |
|:---|:---------|:--------|:------------|:--------------------|:-----|:-------------------|
|  1 |        1 | 件名1   | 本文1       | 2017-03-24 14:47:16 |    1 |                  1 |
|  2 |        1 | 件名2   | 本文2       | 2017-03-24 14:47:21 |    2 |                  1 |
|  3 |        1 | 件名3   | 本文3       | 2017-03-24 14:47:26 |    3 |                  1 |
|  4 |        2 | 件名4   | 本文4       | 2017-03-24 14:47:30 |    1 |                  2 |
|  5 |        2 | 件名5   | 本文5       | 2017-03-24 14:47:35 |    2 |                  2 |
|  6 |        3 | 件名6   | 本文6       | 2017-03-24 14:47:39 |    1 |                  3 |
ASP.net MVC でOpenCvSharpを動かす

画像の変換WebAPIとか作りたいとか思うじゃないですか。

C#でOpenCvを使うためのライブラリ　OpenCvSharp　https://github.com/shimat/opencvsharp というのがあります。
今回使ったのはOpenCvSharp　の2.4系

ここにライブラリの作者によるASP.net の使い方解説があるが、古い。3年前。
http://schima.hatenablog.com/entry/2014/01/22/203026

しかも、x86用のNugetなんてない。
とはいえ、大筋でこの通りでおこないます。x86絶対。


どはまったのは、OpenCvのDllの読み込み方。
ASP.net MVCがどういう仕組みでDllを読んでいるのかよくわからないのですが、実行フォルダの直下に置かないとダメみたいです。
Nugetをインストールしただけでは動きません。

そのため、プロジェクトの直下にx86版のDllを配置し、新しいときはコピーするにチェック入れます。

![de1e0f92189ba7c1bdb4fb8cbdebab55.png](https://qiita-image-store.s3.amazonaws.com/0/43633/65c3c1ad-b2a3-bc79-0363-6f4b8489a19b.png)

こんな感じに不格好になりますが、こうすると動きます。

（フォルダに入れてキレイにしたいのだけどやり方教えてください）
Windows 10 / fonts > PDF化した時にフォントが画像化してしまう症状

```txt:動作環境
Windows 10 Pro (64bit) Anniversary Update適用済
```

Windows 10上のとあるソフトからPDFファイルを作成時、フォントが画像化してしまう症状に遭遇した。

PDF化には標準のドライバ「Microsoft Print to PDF」を使用していた。このドライバではフォントの埋め込み関連の設定は見つからず。
調べた情報としては、「Microsoft Print to PDF」にすると自動的にフォントを埋め込む、というような記載がいくつか見つかった。

しかしながら、フォントが画像化する問題は解消できなかった。

[Windows 10 > 3rd party PDF generatorが正常動作しない](http://qiita.com/7of9/items/c0fa27d4044d41a97500)に記載の通り、Windows 10ではPDFドライバが正常に動作しない状況である。

上記の問題があるため別途調査して、以下を見つけた。
http://www.bullzip.com/products/pdf/download.php

上記のソフト(BullZip)ではMS Gothic Boldフォント以外は画像化しなくなった。

MS Gothic Boldフォントについて調べたところ、Windows の標準フォントとしては「太字がない」ようだ。
コントロールパネル->フォントの一覧で見てもMS Gothic Boldフォントには「太字」の記載はなく「標準」のみ。
別途、「太字」の記載があるフォント(ArialやTahoma)に変更して、BullZipでPDF化したところ、すべてのフォントが画像化しなくなった。

PDFドライバについては、上記は有償（もしくは個人での限定利用）のため、検討は必要だろう。
Swift3でsnake_caseとcamelCaseを変換する

必要に迫られて、変換する処理を書いたのでメモ。
何か他に良い方法があれば教えてください。

```swift
extension String {
    
    func snake2camel() -> String {
        return self
            .components(separatedBy: "_")
            .enumerated()
            .map {0 == $0 ? $1 : $1.capitalized}
            .joined()
    }
    
    func camel2snake() -> String {
        return self.replacingOccurrences(of: "([A-Z])",
                                         with: "_$1",
                                         options: .regularExpression,
                                         range: self.startIndex ..< self.endIndex).lowercased()
    }
}
```

こんな感じで使えます。

```swift
let camel = "snake_case_to_camel_case"
print("\(camel.snake2camel())")         // snakeCaseToCamelCase
        
let snake = "camelCaseToSnakeCase"
print("\(snake.camel2snake())")         // camel_case_to_snake_case
```

## 謝辞
(2017/03/24 17:00　追記)
fuzzballさんがコメントしてくださった内容に更新しました。ありがとうございます！

## 黒歴史

|ω・）...一応、変更前も晒しておくスタイル


```swift
extension String {

    func snake2camel() -> String {
        var ressult = ""
        
        let items = self.components(separatedBy: "_")
        
        items.enumerated().forEach {
            ressult += 0 == $0 ? $1 : $1.capitalized
        }
        
        return ressult
    }
    
    func camel2snake() -> String {
        return self.replacingOccurrences(of: "([a-z])([A-Z])",
                                         with: "$1_$2",
                                         options: .regularExpression,
                                         range: self.startIndex ..< self.endIndex).lowercased()
    }
}
```
既存のコードを Embedded Framework にする方法

## 概要

Embedded Framework に切り出す作業の手順のメモです

## 背景

- 一つのプロジェクトで複数のアプリを作りたい
- Scheme 切替時にビルドが遅い
- 共通部分は Framework に切り出したい

## 方法

- 1. Target に新しく Cocoa Touch Framework を追加する

![スクリーンショット 2017-03-24 13.50.18.png](https://qiita-image-store.s3.amazonaws.com/0/31477/88bb5067-81c0-dc76-d2f2-6c079afc2193.png)

- 2. Xcode の左側のファイルツリーから移したいファイルを複数選択して新しい Target のフォルダにドラッグする

![スクリーンショット 2017-03-24 13.57.29.png](https://qiita-image-store.s3.amazonaws.com/0/31477/f3b5b7a2-e862-987f-aa32-c06de4220a25.png)

![スクリーンショット 2017-03-24 13.57.51.png](https://qiita-image-store.s3.amazonaws.com/0/31477/389e282d-ae48-402f-d4f3-2b4e930fa8fd.png)

- 3. 移したファイルを全て選択して右クリック、Show in Finder を選択

![スクリーンショット 2017-03-24 13.59.24.png](https://qiita-image-store.s3.amazonaws.com/0/31477/445f3cc2-662c-043e-ec8e-32f1f55cf413.png)

- 4. Finder で選択されたファイルを新しい Target のディレクトリに移動する

![スクリーンショット 2017-03-24 14.00.27.png](https://qiita-image-store.s3.amazonaws.com/0/31477/3a8996cc-20e5-fcbf-0bc6-5d89be4ef98b.png)

- 5. Xcode に戻り、選択状態のまま右側ペインの Identity and Type の下の Location のフォルダアイコンをクリックして新しい Target のディレクトリを選択する

![スクリーンショット 2017-03-24 13.53.44.png](https://qiita-image-store.s3.amazonaws.com/0/31477/348d959e-2a71-9df3-2609-5a2119d5a9a9.png)

- 6. .m と .swift を選択して Xcode の右側の Target Membership から元の Target のチェックを外して新しい Target にチェックを入れる

![スクリーンショット 2017-03-24 13.56.21.png](https://qiita-image-store.s3.amazonaws.com/0/31477/de443995-299b-97c1-7e75-f54af7cc43d6.png)

- 7. 公開したい .h を選択して Xcode の右側の Target Membership で新しい Target にチェックを入れて Public を選択する

![スクリーンショット 2017-03-24 14.02.11.png](https://qiita-image-store.s3.amazonaws.com/0/31477/c3a84be2-1524-7540-65c8-c21eca055c42.png)

- 8. フレームワークを使う Target の Embedded Framework に作成したフレームワークを追加する

![スクリーンショット 2017-03-24 14.03.14.png](https://qiita-image-store.s3.amazonaws.com/0/31477/2e23d68b-e807-dd78-3969-ab711482d7d6.png)

- 9. Modulemap を作成する

![スクリーンショット 2017-03-24 14.07.18.png](https://qiita-image-store.s3.amazonaws.com/0/31477/7bd0e426-4c24-d10e-ce10-2a6ad566a734.png)

```swift:Shared.modulemap
framework module Shared {
    umbrella header "Shared.h"

    export *
    module * { export * }
}
```

追加した Framework の Build Settings の `Module Map File` に作成したファイルのパス `Shared/Shared.modulemap` を指定する

- 10. 公開するヘッダを #import する

```objc

#import <UIKit/UIKit.h>

//! Project version number for Shared.
FOUNDATION_EXPORT double SharedVersionNumber;

//! Project version string for Shared.
FOUNDATION_EXPORT const unsigned char SharedVersionString[];

// In this header, you should import all the public headers of your framework using statements like #import <Shared/PublicHeader.h>

#import <Shared/Preference.h>
```

## framework 内で objc から swift のコードを呼ぶときの注意

`#include "FooBar-Swift.h"`

ではなく

`#include <FooBar/FooBar-Swift.h>`

を使う
[Laravel] 僕のRouteの書き方を公開してみる

# LaravelのRouteの書き方

LaravelのRouteの書き方について自分のやり方じゃない、
もっといい方法があるんじゃないかと思った。

そこで、僕のRouteの書き方を公開することで、
よりよい方法が無いかアドバイスを貰おう！という魂胆。

# 環境

Laravel5.4

# 僕のRouteの書き方

Webルートを定義するものとする。

## Web.php

```php:Web.php
<?php namespace Routes;

use Illuminate\Support\Facades\Route;
use Routes\Web\Top;

Route::group(['namespace' => 'Web'], function() {

    // Top画面のRouteをまとめているクラス
    Top::route();

});
```

## Top.php

```php:Top.php
<?php namespace Routes\Web;

use Illuminate\Support\Facades\Route;

class Top
{
    public static function route()
    {
        Route::get('/', [
            'as'   => 'top.index',
            'uses' => 'TopController@index',
        ]);
    }
}
```

# 上記のようなした経緯

複数のルートを全て `Web.php` に定義するのは保守的に良くないと判断。

なので、ルートを分類してそれぞれでクラスを作ってやり、
`route(){}` メソッドの中にルートを定義してやることにした。
`route(){}` メソッドは static にすることでアクセスを簡単にしている。

# まとめ

どうでしょうか？
皆さんどのようにルートの定義を行っているでしょうか？

意見交換できたら幸いです(^O^)
リンク先が現在のページかを確認する方法

```js
const matchLocation = (href) => {
  if(typeof href !== 'string') {
    throw new TypeError('Not string.');
  }

  const { hostname, port, pathname } = location;
  const _hostname = hostname.replace(/([\/\.\*\(\)])/g, '\\$1');
  const _pathname = pathname.replace(/\//g, '\\\/');

  const _r = new RegExp(
    `^(http|https):\\\/\\\/${ _hostname }(:(${ port })?)?${ _pathname }(\\\?.+)?(#.*)?$`
  );

  return href.match(_r);
};

const el = document.getElementsByTagName('a')[0];

matchLocation(el.href);
```

パラメータとハッシュは無視するようにしています。
Slackのemojiをスタンプ風に使用できるbot

#はじめに
Slackにはなぜかスタンプ機能がないということなので、簡易的にですがそれっぽく使えるBotを作成してみることにしました。
外部に画像を用意してもいいのですが、せっかくなので今回はSlack APIを使いcustom emojiの原寸大を表示するという手法を取ることにします。

#本文
##実際の動作
![time_yamasoto___jtec_Slack.png](https://qiita-image-store.s3.amazonaws.com/0/171917/4fa26b43-46d6-f9ae-ab11-7160d7442d5e.png)

- Botの呼び出しは`icon emojiの登録名`で行う
- 特殊な設定は不要で、emojiの登録後すぐに使うことができる
- 画像の最大サイズは128*128

##開発環境
- Botの開発: GAS
- 使用API Slack API [emoji.list](https://api.slack.com/methods/emoji.list)

##準備
###1. GAS
GASでSlack Botを作成する際には下記のサイトを参考にしました。
SlackとGASの連携などについてはこのページでは特に説明しません。
>初心者がGASでSlack Botをつくってみた
>https://tech.camph.net/slack-bot-with-gas/

####Outgoing WebHooksの設定はこんな感じ

![Outgoing_WebHooks___jtec_Slack.png](https://qiita-image-store.s3.amazonaws.com/0/171917/f169efb4-1c80-482a-8747-f6e25d97ba32.png)


###2. emoji.list
[emoji.list](https://api.slack.com/methods/emoji.list)にアクセスし、Testerタブを開きます。

![emoji_list_method___Slack.png](https://qiita-image-store.s3.amazonaws.com/0/171917/c5d286cc-2b6a-cd05-2a0c-c32e2138f226.png)

1.でSlack API Tokenを取得していれば、tokenのセレクトボックスに表示されているはずなので、[Test Method]をクリック。

![emoji_list_method___Slack.png](https://qiita-image-store.s3.amazonaws.com/0/171917/8fdf92ec-7043-f0b8-289c-6eb1216964f9.png)

tokenに問題がなければ、URLとcustom emojiの一覧が表示されます。
URLは後で使うので、控えておいてください。

![emoji_list_method___Slack.png](https://qiita-image-store.s3.amazonaws.com/0/171917/0d220679-a9ac-0480-d181-c399e04c3bbc.png)

##開発
###emoji一覧の取得

```
function getEmojiList() {
  //APIのURL
  var url = "hoge";
  //JSONで取得してからパース
  var response = UrlFetchApp.fetch(url);  
  var content = response.getContentText("UTF-8");
  var return_data = JSON.parse(content);
  
  //emojiのリストのみ返す
  return return_data['emoji'];
}
```

urlを先ほど控えたemoji.listのURLに置き換えます。
これで、slackに保存されたcustom emojiの名前とurlの配列を取得できます。

###emojiのURL
emoji名textのemojiのURLを返します

```
function getEmojiURL(text){
  var return_message = "error";
  //emojiリストの取得
  var emoji_list = getEmojiList();
  //リストからtextのURLを取得
  //textから空白を削除している
  return_message = emoji_list[text.trim()];
  
  return return_message;
}
```


###Bot部分の作成
```
var token = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN');

function doPost(e) {
  
  var bot_name = "icon";
  var bot_icon = "";
  
  var app = SlackApp.create(token);
  
  var message = "";
  
  //slackで投稿された文章から4文字目より後ろを取得
  //今回はicon 絵文字の登録名 で呼び出しているため 
  var text=e.parameter.text.substr(4);
  
  message = "no icon";
  if(text!=""){
    message = getEmojiURL(text);
  }
  
  //chatPostMessageでチャットとして投稿
  //呼び出されたチャンネルに投稿する
  return app.postMessage(e.parameter.channel_id, message, {
    username: bot_name,
    icon_url: bot_icon
  });
}
```

以上で完成となります。

#おわりに
初めての投稿のため色々と拙いところはあると思いますが、参考にしてもらえることがあれば幸いです。
SQL の FETCH FIRST n ROWS構文で Top n や 同ソートキー値のレコードを抽出する。(Oracle Database 12c)

Oracle Database 12c で追加された FETCH FIRST n ROWS構文を使うと、
Top n や 同ソートキー値のレコードを抽出できるんやで彡(ﾟ)(ﾟ)

サンプルは以下のデータ

```sql
SELECT MIN(C1)            AS C1_MIN
     , MAX(C1)            AS C1_MAX
     , COUNT(C1)          AS C1_CNT
     , COUNT(DISTINCT C1) AS C1_NUM_DISTINCT
  FROM TBL_A;

    C1_MIN     C1_MAX     C1_CNT C1_NUM_DISTINCT
---------- ---------- ---------- ---------------
         1      10000      10001           10000

SELECT C1, C2
  FROM TBL_A
 WHERE C1 = 3;

        C1 C2
---------- ----------
         3 REC3
         3 RECCHOFUKU ★C1=3のレコードのみ重複
```

以下のSQLでTop n(例はTop 3)を抽出彡(ﾟ)(ﾟ)

```sql
-- Top 3 を抽出
SELECT C1, C2
  FROM TBL_A
 ORDER BY C1 FETCH FIRST 3 ROWS ONLY;

        C1 C2
---------- ----------
         1 REC1
         2 REC2
         3 REC3
```

OFFSET句を使って6個目～10個目のレコードを抽出彡(ﾟ)(ﾟ)
※OFFSET句はORDER BYのキー値重複を考慮しないから、ランキングには使い辛いのか。。。彡(-)(-)

```sql
-- 6個目～10個目のレコードを抽出
SELECT C1, C2
  FROM TBL_A
 ORDER BY C1 OFFSET 5 ROWS FETCH FIRST 5 ROWS ONLY;

        C1 C2
---------- ----------
         5 REC5
         6 REC6
         7 REC7
         8 REC8
         9 REC9

※◎の5レコードを飛ばして★の部分のレコードを抽出している。
        C1 C2
---------- ----------
         1 REC1　　　　◎
         2 REC2　　　　◎
         3 REC3　　　　◎
         3 RECCHOFUKU  ◎
         4 REC4　　　　◎
         5 REC5 ★
         6 REC6 ★
         7 REC7 ★
         8 REC8 ★
         9 REC9 ★
        10 REC10
        11 REC11
```

下記のように~~3位~~3個目のレコードのみ抽出も可能やで彡(ﾟ)(ﾟ)

```sql
-- 3個目のみ抽出
SELECT C1, C2
  FROM TBL_A
 ORDER BY C1 OFFSET 2 ROWS FETCH FIRST 1 ROWS ONLY;

        C1 C2
---------- ----------
         3 REC3
```


上記例だと同ソートキー値の他レコードは出ていないんやけど、
ONLY ⇒ WITH TIES に変更すると同ソートキー値のレコードも抽出されるで彡(ﾟ)(ﾟ)

```sql
-- Top3(同順位含む)
SELECT C1, C2
  FROM TBL_A
 ORDER BY C1 FETCH FIRST 3 ROWS WITH TIES;

        C1 C2
---------- ----------
         1 REC1
         2 REC2
         3 REC3
         3 RECCHOFUKU

-- 3個目のみ抽出(同キーの他レコード含む)
SELECT C1, C2
  FROM TBL_A
 ORDER BY C1 OFFSET 2 ROWS FETCH FIRST 1 ROWS WITH TIES;

        C1 C2
---------- ----------
         3 REC3
         3 RECCHOFUKU
```

マニュアルも見てクレメンス彡(^)(^)

* Oracle Database SQL言語リファレンス 12cリリース1 (12.1) B71278-10
SELECT
row_limiting_clause
http://docs.oracle.com/cd/E57425_01/121/SQLRF/statements_10002.htm#BABHFGAA

 > row_limiting_clauseを使用すると、問合せから返される行数を制限できます。
 > オフセットと、返される行数または行数の割合を指定できます。
 > この句は、上位N番のレポートを実装するために使用できます。
 > 結果の一貫性を保つには、order_by_clauseを指定して、ソート順序を決定的にします。
ffmpegで画質を落としつつ動画の冒頭１分間を切り出し

ffmpegとにかく多機能で全部入り感あってすごいなと思いました。（小並感
動画とか音声に関する事なら何でも出来そう。

## 要件
1. 売りモノの動画から、サンプル動画として冒頭１分だけ切り出したい。
2. 転送量やストレージ使用増を考えて、サンプル動画の画質、音質は落とす。
3. １分で無理矢理ぶった切るので、少しでも違和感なく再生が終わる感じにフェードアウトしたい。
4. サンプル動画には、「この動画はサンプルです」、的な注意書きを表示したい。

## 使いかた
まず今回辿り着いたコマンドはこちら。こんなの絶対覚えてられない。明日には忘れる。
input.mp4から、要件に基づいた処理を行ってoutput.mp4を出力。なおinput.mp4は消えたりしないので安心。

```shell-session:console
ffmpeg -i input.mp4 -t 60 \
-b:v 512k -b:a 32k \
-vf "movie=its_sample.png [watermark];[in][watermark] overlay=main_w-overlay_w-40:main_h-overlay_h-40 [out],[out]fade=out:1740:60" \
-af afade=t=out:st=58:d=2 \
output.mp4
```

- -iは元ファイルの指定。
- -tは切り出したい秒数。今回は開始から60秒。 -ssオプションで、開始位置の指定も可能。`-t 60 -ss 30`だと開始30秒目から、60秒を切り出す。-ssの指定が無い場合は最初から。
- -b:vはビデオのビットレート指定。今回は512k。ファイルサイズと質のトレードオフなので、何パターンかやってみて調整。
- -b:aはオーディオのビットレート指定。今回は32k。こちらも要調整。
- -vfはビデオフィルタ。ffmpeg激ヤバポイント。サンプルですよテキスト（画像）を埋め込んだ後、開始から1740フレーム目から60フレームかけてフェードアウトしますよ。
- -afはオーディオフィルタ。開始から58秒目から2秒かけてフェードアウトしますよ。

## 所感
- フィルタすごい、やばい。
- ビデオフィルタもオーディオフィルタみたいに秒で指定できればいいのに。
`ffmpeg -i input.mp4`で、フレームレート調べて30fps、60秒だから1800フレーム、最後２秒でフェードアウトしたいから1740:60ね、と計算するのが面倒だった。もしくは、-1:60みたいに指定できればいいのに。

- オプションの指定順序によって動作が異なる？気をつけよう。

- フェードアウトするにあたって、もしフレームレートの違う動画が混在してたら困るから固定しといたろ、ついでにフレームレート落として更にファイルサイズ減らそう！と思って安易に`-r 10`を指定したら、動画と音声がずれてしまった。調べたらwikipediaで[こんなの](https://ja.wikipedia.org/wiki/FFmpeg#.E9.9F.B3.E3.82.BA.E3.83.AC.E5.95.8F.E9.A1.8C)出てきた。

## 参考
http://takuya-1st.hatenablog.jp/entry/2014/01/14/104752
http://fftest33.blog.fc2.com/blog-entry-80.html
http://d.hatena.ne.jp/zariganitosh/20150619/understand_ffmpeg
http://www.84kure.com/blog/2014/10/14/ffmpeg-%E5%8B%95%E7%94%BB%E3%81%AB%E9%80%8F%E3%81%8B%E3%81%97%E7%94%BB%E5%83%8F%E3%82%92%E5%85%A5%E3%82%8C%E3%82%8B%E3%81%AB%E3%81%AF/
migration 時にデータを操作するのは悪手か?

※ 2019/4/25 追記：別途 rake task を用意する派だったが、管理する環境が増えてスクリプトの実行漏れが発生するので [この記事](https://railsguides.net/change-data-in-migrations-like-a-boss/)で紹介されている [migration_data](https://github.com/ka8725/migration_data) という Gem が良さそうなので試してみたい。

## とりあえずの結論

* migration スクリプト内ではモデル独自のメソッド、アトリビュート等に依存した処理は書くべきでは無い
	* それらのメソッド、アトリビュートはDBの物理的な構造に関係無く変更されるもの
	* 将来それらを削除したり変更した際にmigrationが動かなくなる可能性がある
* どのメソッドが良くてどれがダメか判断が難しい場合、SQLを直に書くのもアリ
	* [ActiveRecordで生SQLを使いたいときに便利なメソッド達 - Qiita](http://qiita.com/yut_h1979/items/4cb3d9a3b3fc87ca0435)

## 発端

マイグレーションにより新しいカラムを追加するけど、その値をマイグレーションで入れるべきかについてプロジェクトで話が出たので、過去に見つけた以下のブログを読んで理解した内容をまとめてみる。

[Data Migrations in Rails](https://robots.thoughtbot.com/data-migrations-in-rails)


## migration でデータを操作するのがダメな理由

* db/migrate にずっと残り続ける、将来性に乏しい
  * 将来、クラスが変更になった際にマイグレーションが動かなくなる

        > [RailsでDBのデータ変更はどこに書く？ - komagataのブログ](http://docs.komagata.org/5038)
        > 「ふつうこうだよ」という話ではないのですが、migraitonの中でARのオブジェクトを使いすぎると困ることがあるのであまり使わないようにはしています。
        > たとえば1年後に、その属性やメソッドの無くなったとすると、そのタイミングで一からマイグレーションすると死亡する。という感じです。

	* ビジネスロジックと無関係なものがコードに残り続ける
	* ローカルの開発環境だと頻繁にDB作り直しするケースが多いがその場合にも同じ処理がなんども流れてムダ？
	
* db:migrate ではなく db:schema:load, db:reset の場合は実行されない
	* 後者は schema.rb (schema.sql) を単に実行しているから
	* そのような場合に期待した結果とならない場合もある
* デプロイとデータ更新が密接に結びつく
	* 大量のデータを更新しなければならないとしたらマイグレーションの実行に多くの時間がかかる
	* その間、アプリケーションが実行できずサービス停止する必要がある

## 代替案(migrationに書かない場合)

* テンポラリのrakeタスクを用意する
* seed.rb に書く

かな?



## 関連リンク

* [Data Migrations in Rails](https://robots.thoughtbot.com/data-migrations-in-rails)
* [RailsでDBのデータ変更はどこに書く？ - komagataのブログ](http://docs.komagata.org/5038)
* [Rails Best Practices - Isolating Seed Data](https://rails-bestpractices.com/posts/2010/07/24/isolating-seed-data/)
* [Change data in migrations like a boss – Rails Guides](http://railsguides.net/change-data-in-migrations-like-a-boss/)
* [SeedMigrations. Like schema migrations, but for your data - Harry's Engineering](http://engineering.harrys.com/2014/06/09/seed-migrations.html)


## ToDo

> [Railsのmigrationで生SQLを使う+パラメータを使う](https://techracho.bpsinc.jp/baba/2012_11_26/6414)
> migrationファイル内では、モデルクラスを使わないのが安全です。
これは、将来的に仕様変更やリファクタでそのモデルがなくなったりリネームされた際、rake db:migrate:resetが通らなくなるからです。

上記のケースについて現在のRailsでの挙動を確認する
Go | シングルクオートでは文字列を定義できない

# 問題

```go
package main

import (
  "fmt"
)

func main() {
  var word string = 'ABC'
  fmt.Println(word)
}

// # command-line-arguments
// ./single_quotes.go:8: missing '
// ./single_quotes.go:8: syntax error: unexpected BC at end of statement
// ./single_quotes.go:8: newline in character literal
```

# 理由

go でのシングルクオートは、Rune という 型を扱うらしい。
何か文字を渡すと int32 で Unicode Code Point にマッピングされるようだ。

```go
package main

import (
  "fmt"
)

func main() {
  var english_a rune = 'a'
  fmt.Println(english_a) // 97

  fmt.Println('b') // 98

  fmt.Println('あ') // 12354

  fmt.Println('い') // 12346
}

```

# 解決

文字列はダブルクオートで囲おう。

```go
package main

import (
  "fmt"
)

func main() {
  var word string = "ABC"
  fmt.Println(word) // ABC
}
```

# 参考

- http://stackoverflow.com/questions/34691045/cannot-assign-string-with-single-quote-in-golang
- http://stackoverflow.com/questions/19310700/what-is-a-rune








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
EMRのWebUIに踏み台経由のポートフォワードで接続する

EMRというか「プライベートサブネットに置かれた、ローカルホストからしか管理UIに接続できないミドルウェア」全般です。

特にEMRのマスターノードのWebUIに踏み台経由でアクセスしたいことがあるのですが、いつもポートフォワードの書き方を忘れるのでメモしておきます。

```
$ ssh-add -D
$ ssh-add ~/.ssh/login.pem
$ ssh -A -L 8888:localhost:18888 ec2-user@踏み台のIP
$ ssh    -L 18888:localhost:18080 hadoop@マスターノードのIP
```

18888だとか8888は適当に選んだ使っていなさそうなポートです。ここでは踏み台は ec2-userにしてますがこれは適宜環境に合わせて。

マスターノードへ接続したあと、ローカルのブラウザなどから http://localhost:8888 へアクセスすると、Hadoop のマスターノードのポート 18080 で起動している管理アプリケーションに接続することができます。便利ですね。