OmniAICreator/Qiita-1.07M huggingface dataset:
Authentication with Google Cloud Platform in CircleCI


[https://circleci.com/docs/google-auth](https://circleci.com/docs/google-auth)の翻訳。[Testing with Google Cloud Test Lab](http://qiita.com/Horie1024/items/0eb13b09d88129de8ea0)で説明されていた内容のうち、CircleCIからCloud Test Labでのテストを実行する上で必要になる認証について。

# 概要

`gcloud`コマンドラインツール使いアプリをGoogle Cloud Platformにデプロイする前に、`gcloud`コマンドラインツールに適切な権限を与えるための認証が必要になります。したがって、JSON Service Accountを作成する必要があります。このService Accountは、base64でエンコードしCircleCIの環境変数へ追加します。追加した環境変数はあなたのビルドスクリプトでJSONファイルにデコードし、それをgcloudツールの認証に使用します。認証後、gcloudツールをあなたのGCPプロジェクトの操作に利用できます。

# JSON Service Accountの作成とダウンロード
Service Accountをダウンロードするには、この[リンク](https://console.developers.google.com/apis/credentials/serviceaccountkey?project=_)をクリックします。もしくは[https://console.developers.google.com/](https://console.developers.google.com/)へアクセスし、左側のメニューから'API Managaer'を選択し、'認証情報'から'認証情報を作成'、そして'サービスアカウントキー'を選択します。

![gcp_circle_ci1.png](https://qiita-image-store.s3.amazonaws.com/0/43438/2babc512-d901-51c1-f8df-90b328ffddad.png "gcp_circle_ci1.png")

サービスアカウントを選択できるので、既存のものを選択するか、名前とサービスアカウントIDを入力して新規作成します。そしてキーのタイプに'JSON'を選択し'作成'をクリックするとJSONファイルがダウンロードされます。

![gcp_circle_ci2.png](https://qiita-image-store.s3.amazonaws.com/0/43438/e15a237f-7854-910b-1217-348ceea1148b.png "gcp_circle_ci2.png")

Service Accountは認証情報であり、あなたの代わりにプロジェクトを操作できるということを心に留めておき、その扱いには十分注意してください。

# CircleCIへのサービスアカウントの追加

Service Accountを作成後、その次のステップは、それをあなたのCircleCIのビルド環境の環境変数へ登録することです。まず最初にService Accountをbase64でエンコードします。LinuxやOS Xであれば以下のように入力してください。

```bash
base64 <your-service-account.json>
```

そして、コマンドの実行結果をコピーしてください。Windowsユーザーは恐らく`certutil`を使う必要があります。

JSON Service Accountをエンコードした値をコピーし、CircleCIのプロジェクトから右上にある'Project Settings'をクリックし、それから左側の'Environment variables'をクリックしてください。NameにCLIENT_SECRET、valueにコピーしたエンコード済みのJSON Service Accountの値をペーストし、'Save variables'をクリックします。これでCircleCIのビルドからService Accountへアクセスできるようになりました。

# gcloudツールの認証へのサービスアカウントの使用

エンコードしたサービスアカウントを環境変数に追加したと思いますが、次のステップではそれをデコードし、ビルドスクリプトから使用できるようにします。そして、gcloudツールの認証に使用します。以下はその例です。

```bash
echo $CLIENT_SECRET | base64 --decode > ${HOME}/client-secret.json
```

このデコードされたsecretは、client-secret.jsonに保存されます。次に、gcloudのコマンドでアカウントを認証します。最初にgcloudツールをアップデートするのは良い方法ですが、あなたのプロジェクトをsetするのを忘れないでください。

```bash
gcloud --quiet components update
gcloud auth activate-service-account --key-file ${HOME}/client-secret.json
gcloud config set project $GCLOUD_PROJECT
```

# セキュリティについての考慮
サービスアカウントをCircleCIの環境変数に追加した瞬間からそのビルド環境は認証情報を含み、もしそれが盗まれたのならあなたのプロジェクトを危険にさらす可能性があります。例として、誰かがあなたのプロジェクトのに対して認証情報のprint、もしくはgcloudツールを使った悪意のある行為を行うための変更のPRを作成するかもしれません。幸いなことにCircleCIはPull Requestsで環境変数を設定するようなUIを提供していません。このトピックについては[こちら](https://circleci.com/docs/fork-pr-builds)をご覧ください。
エクスプローラで開いているフォルダをConEmu上のnyagosで開く

# 経緯

エクスプローラで開いているフォルダをnyagosで開きたくなった

<blockquote class="twitter-tweet" data-lang="en-gb"><p lang="ja" dir="ltr">エクスプローラで開いているフォルダを conemu 経由で nyagos で開きたいんだが、いい方法ないかのう。できればキーボードでやりたい。</p>&mdash; 44Hi5@英語勉強中 (@bamchoh) <a href="https://twitter.com/bamchoh/status/712595230587883520">23 March 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# 気合いを入れて調べてみた

作者様よりリプライを頂いたので、気合いを入れて調べてみた。

[ここらへん](http://conemu.github.io/en/ConEmuArgs.html) を見ると `-Dir` とか `-new_console` とかあるので、ここらへんをうまく使えば行けそう？

## 試す

コマンドプロンプトで以下を実行(実行場所はConEmuがインストールされているフォルダ、{nyagos}はConEmuで設定しているTask名)
```
$ ConEmu.exe /dir %CD% /cmd {nyagos} -new_console
```

起動したっぽい!!
![image](https://qiita-image-store.s3.amazonaws.com/0/12550/92230512-f773-729b-c63a-e47c65d84a7c.png)

# バッチファイル化

パスの通っている場所にさっきのコマンドを記述したバッチファイルを置きます。
(`%CONEMU_PATH%` は実際のパスに置き換えてください。もちろん環境変数として登録してもかまいません)

```bat:sh.bat
%CONEMU_PATH%\ConEmu.exe /dir %CD% /cmd {nyagos} -new_console
```

# エクスプローラから起動

[Windows7でエクスプローラーのアドレス バーからパスが通ったプログラムが実行できる](http://sprint-life.hatenablog.com/entry/2014/09/07/145858) らしいので、これを応用してキーボードで起動してみましょう。

## 任意のフォルダを選択

![image](https://qiita-image-store.s3.amazonaws.com/0/12550/30fadb36-c489-dcc4-53a4-38e4ed2a4bdb.png)

## おもむろに `Alt + D`

![image](https://qiita-image-store.s3.amazonaws.com/0/12550/e8fc927a-cad7-0971-5ee1-2ebc461a1cdc.png)

## さっきのバッチファイルの頭文字`sh`を入力

![image](https://qiita-image-store.s3.amazonaws.com/0/12550/bbcc60b6-845c-b697-1871-8128201491f7.png)

## ッターーン!!(Enterキーをたたく音)

![image](https://qiita-image-store.s3.amazonaws.com/0/12550/1ef0e091-14fe-8abd-54e4-cf51a4fd4c32.png)

開きました!!
私はConEmuをシングルモードで動作させているので、新しいウィンドウでは開かず、既に開いているConEmuに新しいタブで開きます。

# まとめ＋課題

エクスプローラで開いているフォルダをConEmu上のnyagosで開くための方法をまとめました。また、キーボードで開く方法も紹介しました。
課題としては、`Alt+D`を押すのがつらみなので、どうにかならないかなぁと思っています。

併せて、こちらもどうぞ
http://qiita.com/bamchoh/items/42b85cba00bbc87a1141
Swift 2.2の新機能: SE-0011: 付属型を宣言するための typealias キーワードを associatedtype に置き換える

[SE-0011: 付属型を宣言するための typealias キーワードを associatedtype に置き換える](https://github.com/apple/swift-evolution/blob/master/proposals/0011-replace-typealias-associated.md) です。
これは非常に単純な話。ツッコミお待ちしています。
原文に従ってこの訳は [Apache License 2.0](https://github.com/apple/swift-evolution/blob/master/LICENSE.txt) とします。

# 付属型を宣言するための `typealias` キーワードを `associatedtype` に置き換える

* 提案: [SE-0011](https://github.com/apple/swift-evolution/blob/master/proposals/0011-replace-typealias-associated.md)
* 著者: [Loïc Lecrenier](https://github.com/loiclec)
* ステータス: **Swift 2.2 に向けて受理された** ([Bug](https://bugs.swift.org/browse/SR-511))
* レビューマネージャ: [Doug Gregor](https://github.com/DougGregor)

## はじめに

現在 `typealias` キーワードは 2 種類の型を宣言するために使われています。

1. タイプエイリアス (既存の型の別名)
2. 付属型 (プロトコルの一部として使われる型のプレースホルダの名前)

これら 2 種類の宣言は異なるものであり、別個のキーワードを使うべきです。これにより違いが強調され、付属型の使用を取り巻く混乱が幾らか減るでしょう。

提案する新しいキーワードは `associatedtype` です。

## 動機

`typealias` を関連型を宣言するために再利用することは様々な混乱を引き起こします。

1. プロトコルの中の `typealias` は他の場所での `typealias` と違う意味を持つことがはっきりしません。
2. 初心者に付属型の存在を隠してしまいます。結果として間違った理解のコードを書いてしまいます。
3. プロトコルの中では具体的なタイプエイリアスが禁止されていることがはっきりしません。

特に、**2 + 3** のせいでプログラマは

```swift
protocol Prot {
    typealias Container : SequenceType
    typealias Element = Container.Generator.Element
}
```

というコードを `Element` は `Container.Generator.Element` のタイプエイリアスではなく、`Contaner.Generator.Element` をデフォルトとする新しい付属型と気づかずに書いてしまいます。

しかし、このコード

```swift
protocol Prot {
    typealias Container : SequenceType
}
extension Prot {
    typealias Element = Container.Generator.Element
}
```

は `Element` を `Container.Generator.Element` のタイプエリアスであると宣言します。

言語が持っているこれらの非常に細かい部分のために、理解するには注意深い検討が必要になります。

## 提案手法

付属型を宣言する目的において、`typealias` キーワードを `associatedtype` で置き換えます。

これにより上で述べた問題が解決します:

1. `typealias` はもう型の別名を宣言するためだけに使用できます。
2. 初心者はもうプロトコルを作成するために付属型について学ぶことを避けては通れません。
3. プロトコルの中で型の別名を作ろうとするとエラーメッセージを表示できるようになります。

以前のコードスニペットで示した混乱もなくなります。

```swift
protocol Prot {
    associatedtype Container : SequenceType
    typealias Element = Container.Generator.Element // error: cannot declare type alias inside protocol, use protocol extension instead
}
```

```swift
protocol Prot {
    associatedtype Container : SequenceType
}
extension Prot {
    typealias Element = Container.Generator.Element
}
```

他のキーワードを使いことも検討しました: `type`, `associated`, `requiredtype`, `placeholdertype`, …

## 提案手法

付属型を宣言する目的において、Swift 2.2 で `associatedtype` を導入して `typealias` を廃止予定とし、Swift 3 で `typealias` を完全に取り除くことを提案します。

## 既存のコードへの影響

単純に 1 つのキーワードを別のものに置き換えるだけなので、`associatedtype` への移行は既存のコードを壊す危険なしに簡単に自動化できるでしょう。

## メーリングリスト

- [Original](https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20151130/000470.html)
- [Alternative Keywords](https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20151214/003551.html)
本物のiOSエンジニアになるための8か条

なんとなくタイトルが浮かんだので、書くぞ！
新人プログラマは毎朝復唱しよう！

# 1: 書いて書いて書きまくれ！
冗談ではない
会社で4時間しかコードを書く時間がなかったら、家に帰って4時間コードを書こう！
会社で8時間コードを書いたら、家に帰って4時間コードを書こう！

# 2: 読んで読んで読みまくれ！
人のコードを読もう！
OSSを使う時は、サンプルコードとReadmeだけで満足せずに、コードを読もう！

- どんなコードが読みやすく、メンテナンスしやすいのか
- どう書けばシンプルに実装できるのか

# 3: まず、公式ドキュメント
Qiitaは公式ドキュメントではない！
何度でも言うぞ！Qiitaは公式ドキュメントではない！

- 公式の"〜プログラミングガイド"はしっかり読む
- WWDCのあとは、API Diffを読む
- The Swift Programming Languageを読む
- 公式でない記事は、更新日を確認する癖をつける

# 4: WWDCのセッション
WWDCのセッションを見よう
Appleが何を考えてAPIを提供しているのか、理解が深まる

- [asciiwwdc](http://asciiwwdc.com/)にはtranscriptが揃っている
- 2015年からは公式のtranscriptが用意されている

# 5: iOS SDKを知る
UIKitは、かなり良いフレームワークです。

GUIのアプリケーションを実装するというのはつまり、階層になったオブジェクトを組み立て、操作することです。
レイアウト、レンダリング、イベントハンドリング、ヒットテスト、ViewController
それぞれ異なる役割を持った階層がUIKitではどのように実装されているのか、イメージできるようになると簡単です

- 似たような仕組みを作るなら、どう実装するかイメージしてみる
- 他のプラットフォームではどのような実装になっているのか知る

# 6: ハードウェアを知る
ソフトウェアはハードウェアと無縁ではいられません
タッチスクリーンから受け取ったイベントが、アプリケーションに伝わり、レンダリング結果が毎フレーム表示されるまでをイメージしよう

- 自分が書いているコードは、CPUとGPUでどのように処理されるのか
- ネットワークやディスクの距離感

# 7: 人間を知る
GUIを開発するエンジニアは、端末ではなく人間をハックするものだと心得ましょう。
実際の処理を1ms短縮する前に、人間の認知を100ms早めるトライをするということです。

- [インタフェースデザインの心理学 ―ウェブやアプリに新たな視点をもたらす100の指針](http://www.amazon.co.jp/gp/product/4873115574/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4873115574&linkCode=as2&tag=hayashi311-22)はエンジニアにも分りやすく面白い本でした

# 8: 知らざるを知らずと為す

ユーザーは考えた通りに動きませんし、Appleは容赦なくOSとハードウェアを更新します。
あなたの考えた最高のアプリは糞ですし、Appleに対する淡い期待は裏切られます。

- 初期開発時はユーザーの事など何も知らないということを肝に銘じましょう
- アプリの運用とは、ユーザーを知る過程です
  - 初期開発の何倍もの作業が発生します
- Appleにきっと大丈夫は通用しません。高い代償を払うことになります。
  - その昔、iPhoneの画面サイズは3.5インチ固定だと信じられていました
- 依存関係を減らし、局所的に改修しやすく実装する

アプリに限らずですが、変化に強いソフトウェアを作りましょうということです


----

ビールを飲みながら書き始めた記事ですが、だんだん眠くなってきたのがお分かりいただけるでしょうか。
最初に思いついたタイトルは10か条でした。
Automatorを使わずにWindowsのファイルパスをMacのパスに変換して自動で開く方法

# 概要

[シェルスクリプトのみでMacとWindowsのファイルパスを相互変換する方法(Macユーザ向け)
](http://qiita.com/odacoh/items/14844b79f7fcf5bef97e)の続きです。

Windowsユーザが多い職場などで、
エクセルなど資料のWindows用ファイルパスをスカイプなどで渡された際に、
さらにそれがsmbサーバなど共有フォルダにおいてあるファイルの場合、
わざわざsmb://から始まるmac用のファイルパスに変換し、
そしてFinderを開き、Command+Kで、「サーバへ接続」を表示し、
そこの入力フォームにパスを入力して開くような機会が多々あります（あります？）

その作業をshellscriptを利用して簡単にしようという試みです。
「WinからMacにファイルパスを変換」までは、ひとまず実用に耐えそうな方法を
上記のリンク記事に載せていますが、
さらに変換したファイルパスを自動でオープンする、
というところまでできるようにしたのでメモを残します。

なお、前回の記事にもありますが、Automatorを利用して実現する素晴らしい方法は
ググると見つかりますが、ここではAutomatorは使わずに実現します。

# WinからMacへファイルパスを変換し、自動でオープンする方法
[手順]
#### 1. スクリプトを用意する

```
#!/bin/bash
# クリップボードに格納されたファルパスをwinからmacへ置換して再びクリップボード>
へ格納
pbpaste | sed -E 's/\\+/smb:\/\//' | sed -E 's/\\/\//g' | tr -d '\n' | pbcopy

# 格納したファイルパスをopenコマンドで開く
VAR=`pbpaste`
open $VAR
```
##### 解説
ファイルパスを変換してクリップボードに変換するまでは[前回の記事](http://qiita.com/odacoh/items/14844b79f7fcf5bef97e)と同じ
そこからさらに`バッククオート`を利用して変数に格納
その変数を引数にしてopenコマンドで開くようにした
なお、一度変数に格納して、とかたぶんかなり回り道してると思う

#### 2.用意したスクリプトをFinderなど、コンソール以外からも実行できるようにする 
[.sh]を[.command]という拡張子に変更し、実行権限をつけることで実現できる

[Macでバッチ（command）ファイルを作る方法](http://qiita.com/TatsuyaOGth/items/f15bfa9aeb68d8ecfc67)

#### 3.コマンド実行後に、コンソールを閉じる設定を行う
2.の方法ではデフォルトではコマンド実行時にコンソールが立ち上がり、
処理実行後もウィンドウは開いたままで邪魔になる
以下記事を参考に環境設定で自動で閉じるように設定が可能

[ターミナルで exit したときにウィンドウを閉じる](http://d.hatena.ne.jp/ocs/20111010/1318209350)

# ひとこと
標準出力を変数に格納するバッククオートとか、openコマンドとか普通に知らなかったので勉強になった
色々応用できそう

# 参考
[シェルスクリプトのみでMacとWindowsのファイルパスを相互変換する方法(Macユーザ向け)](http://qiita.com/odacoh/items/14844b79f7fcf5bef97e)
[コマンド/open](http://macwiki.osdn.jp/wiki/index.php/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/open)
[標準出力のみを変数に設定する](http://shellscript.sunone.me/variable.html#標準出力のみを変数に設定する:c3ef366b6eeacfc84a575070894cd3bd)
[Macでバッチ（command）ファイルを作る方法](http://qiita.com/TatsuyaOGth/items/f15bfa9aeb68d8ecfc67)
Rubyで素数を求める

## Rubyの練習がてらに素数判定のプログラムを書いた。

### 1から1000までの整数から素数を求める

```ruby:PrimeJudging
primeNumbers = []
(1..1000).each do |i|
  next if i == 1

  if i == 2
    primeNumbers.push(i)
    next
  end

  judge = true
  primeNumbers.each do |number|
      if i % number == 0
        judge = false
        break
      end
  end

  primeNumbers.push(i) if judge

end
puts primeNumbers
```
## 結果
```text:Result
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
101
103
107
109
113
127
131
137
139
149
151
157
163
167
173
179
181
191
193
197
199
211
223
227
229
233
239
241
251
257
263
269
271
277
281
283
293
307
311
313
317
331
337
347
349
353
359
367
373
379
383
389
397
401
409
419
421
431
433
439
443
449
457
461
463
467
479
487
491
499
503
509
521
523
541
547
557
563
569
571
577
587
593
599
601
607
613
617
619
631
641
643
647
653
659
661
673
677
683
691
701
709
719
727
733
739
743
751
757
761
769
773
787
797
809
811
821
823
827
829
839
853
857
859
863
877
881
883
887
907
911
919
929
937
941
947
953
967
971
977
983
991
997
```
## 追記
## 素数判定のメソッド1
```ruby:Method1
def isPrime(i)
  # 1は素数ではない
  return false if i == 1

  # 2は素数
  return true if i == 2

  primeNumbers = [2]
  judge = true

  # 入力値より小さい素数の集合を求めながら、入力値が素数であるか判定する
  (3..i).each do |j|
      judge = true
      primeNumbers.each do |number|
          if j % number == 0
            judge = false
            break
          end
      end
      primeNumbers.push(j) if judge
  end

  return judge
end
```
## 追記
## 素数判定のメソッド2
```ruby:Method2
def isPrime2(i)
  # 1は素数ではない
  return false if i == 1

  # 2は素数
  return true if i == 2

  judge = true
  (2..i).each do |j|
      # root i までで十分
      break if j > i**0.5 
      if i % j == 0
            judge = false
            break
      end
   end
   return judge   
end
```
iOSアプリのアイコンと起動画面の更新をRakefileを使って自動化する


[昨日からの続き](http://qiita.com/ongaeshi/items/1b205b9226ad087d2614)で、PictRubyのレポジトリの中に組み込んで1コマンドで更新できるようにした。

```
$ cd ~/Document/PictRuby
$ cd Tools/Icon
$ rake
ruby s9icongen.rb icon.png
    29x29: icons/Icon-29.png
    58x58: icons/Icon-29@2x.png
    87x87: icons/Icon-29@3x.png
    40x40: icons/Icon-40.png
    80x80: icons/Icon-40@2x.png
  120x120: icons/Icon-40@3x.png
  120x120: icons/Icon-60@2x.png
  180x180: icons/Icon-60@3x.png
    76x76: icons/Icon-76.png
  152x152: icons/Icon-76@2x.png
  120x120: icons/Icon-120.png
  512x512: icons/iTunesArtwork
1024x1024: icons/iTunesArtwork@2x
ruby s9splashgen.rb splash.png universal
  320x480(2x) ->   640x960: screens/Default@2x~iphone.png
  320x568(2x) ->  640x1136: screens/Default-568h@2x~iphone.png
  375x667(2x) ->  750x1334: screens/Default-667h@2x~iphone.png
  414x736(3x) -> 1242x2208: screens/Default-736h@3x~iphone.png
 768x1024(1x) ->  768x1024: screens/Default-Portrait~ipad.png
 1024x768(1x) ->  1024x768: screens/Default-Landscape~ipad.png
 768x1024(2x) -> 1536x2048: screens/Default-Portrait@2x~ipad.png
 1024x768(2x) -> 2048x1536: screens/Default-Landscape@2x~ipad.png
```

これで気軽にアイコンと起動画面を調整できるようになった。`PictRuby/Tools/Icon`以下をコピーすれば他の環境でも使えると思います。

- [PictRuby/Tools/Icon at master · ongaeshi/PictRuby](https://github.com/ongaeshi/PictRuby/tree/master/Tools/Icon)
swiftをubuntuでコード補完・シンタックスカラーリングしてみる

## 概要
Swiftがオープンソースになりましたね(今更)

Macであればswiftを書くときに、
Xcodeや、またはvimでもSourceKittenを使ったりして、オムニ補完を使うことが可能かと思います。

しかし、現状Linuxでは、Jetbrainsの有償IDEであるCLionぐらいしかオムニ補完ができるエディタ・IDEがないようです。

なんとかvimや他のエディタでもできるようにならないか、というのが事の発端で、
とりあえず僕の環境(Ubuntu 15.10)でオムニ補完っぽいことができるようになった、というお話です。
ついでにシンタックスカラーリングも簡単にできそうだったのでそっちもやってみました。

## やり方
SourceKittenで使われているらしいSourceKitも一緒にオープンソースになっており、
こっちを使っても良かったのですが、ビルドするためにある程度調査が必要そうだったので、
今回はswiftをビルドすると一緒についてくる`swift-ide-test`を使いました。
`build/Ninja-ReleaseAssert/swift-linux-{arch}/bin`にswiftコンパイラなんかと一緒に入ってます。
swiftのAPIにはIDE的な機能を提供するものが用意されています。
今回使った`swift-ide-test`はそのフロントエンド的なものみたいですね。
コード補完以外にもカラーリングの機能があったり、興味深かったです。

## 実際にコード補完してみる

まずは補完したいコードを用意してみましょう。コード補完したい状況を想定して、`gree`で止めてあります。
こいつを適当な名前で保存しておきましょう。

```swift
func greet(name:String) {
  print("Hello, \(name)!!")
}

func greetDmy(dmy:Int) {}

gre
```

さて、では実際にやってみましょう...!

```
$ ./swift-ide-test -repl-code-completion -source-filename=./test.swift
```

出力はこんな感じでした！！

```
Begin completions
greet(name: String) -> Void
greetDmy(dmy: Int) -> Void
End completions
```
いい感じですね！！

`-repl-code-completion`を指定すると、入力の最後を基準に補完してくれるみたいです。
しかし、「ファイルの途中で使いたい」という場合が大半なのではないでしょうか。

そういう場合に使うのが`-code-completion`モードです。
では、実際にやってみます。

テスト用ファイルの内容は以下になります。

```swift
class Greeter {
    func greet(name:String) {
        print("Hello, \(name)!")
    }
}

var greeter = Greeter()
greeter.#^GREETER_METHOD^#

```

`code-completion`モードの場合、補完したい場所に`#^HOGE^#`のような形式でcompletion tokenを仕込む必要がありました。
これについて最初わからなくて悩んだのですが、swiftには`swift-ide-test`のテストが付属しており、難なく解決しました...

```
$ ./swift-ide-test -code-completion -source-filename ./test.swift -code-completion-token=GREETER_METHOD
```

結果は以下のようになりました。

```
found code completion token GREETER_METHOD at offset 120
found code completion token GREETER_METHOD at offset 120
Begin completions, 1 items
Decl[InstanceMethod]/CurrNominal:   greet({#(name): String#})[#Void#]; name=greet(name: String)
End completions
```
Greeterクラスのインスタンスメソッドがしっかり補完されています！！

## おまけ:シンタックスカラーリングをやってみる
`code completion`モードで使用したファイルを用いて、シンタックスカラーリングをやってみたいと思います。
今回は補完を使う必要はないので、メソッド呼び出しを最後まで記述しています。

```
class Greeter {
    func greet(name:String) {
        print("Hello, \(name)!")
    }
}

var greeter = Greeter()
greeter.greet("musou1500")
```

シンタックスカラーリングは以下で行うことができます

```
$ ./swift-ide-test -syntax-coloring -source-filename=./test.swift
<kw>class</kw> Greeter {
    <kw>func</kw> greet(name:<type>String</type>) {
        print(<str>"Hello, </str>\<anchor>(</anchor>name<anchor>)</anchor><str>!"</str>)
    }
}

<kw>var</kw> greeter = Greeter()
greeter.greet(<str>"musou1500"</str>)
```

それぞれのキーワードがマークアップされているのがわかるかと思います！！

## 今後について
今回、swiftに付属していたテスト用のプログラムを叩きましたが、最終的にはswift側で用意されているIDE機能を提供するAPIや、
SourceKitなどを用いて、AtomやVimなどのエディタのプラグインを作ることができれば、と思っております。
Docker公式RedmineからMySQLコンテナに接続失敗した場合の対処

Docker公式RedmineでMySQLを接続したら失敗したので、その備忘録。

エラー内容
Mysql2::Error: Access denied for user 'root'@'172.17.0.4' (using password: NO)

前回の学び[http://qiita.com/chikin14niwa/items/ed61e41b0fafa84ee871] でMySQLコンテナをリンクすると環境変数が引き継がれることはわかっているので、using password: NOと出るのはおかしい。
docker-entrypoint.shを読み、mysql用に以下の環境変数があることがわかった。
設定可能なシステム変数は以下の変数

* MYSQL_ENV_MYSQL_USER
* MYSQL_ENV_MYSQL_PASSWORD
* MYSQL_ENV_MYSQL_DATABASE

用途は以下の通り

| 環境変数名 | 利用用途 | 未設定の場合 |
|:---------:|:--------:|:-----------:|
| MYSQL_ENV_MYSQL_USER | データベースのユーザ名 | root |
| MYSQL_ENV_MYSQL_PASSWORD | データベースのパスワード | 環境変数MYSQL_ENV_MYSQL_ROOT_PASSWORDの値。 |
| MYSQL_ENV_MYSQL_DATABASE | データベース名 | 環境変数MYSQL_ENV_MYSQL_USERの値。未設定の場合redmineが使用される。 |


結局以下の手順で対応

1. MySQLにデータベースを作成する。
2. 1で作成したデータベースを使用できるユーザを作成する。
3. docker runでredmineを起動するときに環境変数に MYSQL_ENV_MYSQL_USER, MYSQL_ENV_MYSQL_PASSWORD, MYSQL_ENV_MYSQL_DATABASEを指定する。

無事起動しました。
ActionCont.recoverWithをなおす

# はじめに

[ActionCont.recoverWithを作る](http://qiita.com/yyu/items/7b37b9a8ffca80c5ce96)では、`ActionCont.recoverWith`という次のような型を持つメソッドを作った。

```scala
def recoverWith[A](actionCont: ActionCont[A])(pf: PartialFunction[Throwable, ActionCont[A]])(implicit ec: ExecutionContext): ActionCont[A]
```

しかし、この関数には致命的な問題点があったので、この記事ではその問題点に関する説明と、回避するための方法について解説する。

# `ActionCont.recoverWith`の問題点

現在の`ActionCont.recoverWith`は次のように実装されている。

```scala
def fakeRun[A](actionCont: ActionCont[A])(implicit ec: ExecutionContext): Future[Result] =
  actionCont.run(value => Future.successful(Results.Ok))

def recoverWith[A](actionCont: ActionCont[A])(pf: PartialFunction[Throwable, ActionCont[A]])(implicit ec: ExecutionContext): ActionCont[A] =
  fromFuture(fakeRun(actionCont).map(_ => actionCont).recover(pf)).flatten
```

端的に述べると、`ActionCont.recoverWith`は後の継続を繰り返し呼ばないように配慮したが、`fakeRun`により、`ActionCont.recoverWith`に入力されたActionContを2回呼び出してしまう。前回の記事で出したような副作用がないような例であると問題がなく見えるが、副作用を入れた次のような例を作ると簡単に壊れてしまう[^contT]。

```scala
import scalaz.std.scalaFuture._

def add(x: Int, y: Int): ActionCont[Int] = ActionCont(k => k(x + y))

def sideEffect(): ActionCont[Unit] =
  ActionCont { k =>
    println("side effect")
    k(())
  }

val x = ActionCont.recoverWith(for {
  a <- add(1, 2)
  b <- sideEffect()
} yield
  Results.Ok("")
) {
  case _ =>
    ActionCont.successful(Results.Forbidden(""))
}

x.run_
```

[^contT]: この例ではActionContの実装に[Scalaz](https://github.com/scalaz/scalaz)の`IndexedContT`を使っているが、本質的な違いはない。

実行すると次のように、関数`sideEffect`で生成したActionContが2回実行されていることが分かる。

```
side effect
side effect
```

# 副作用に対して安全な`ActionCont.recoverWith`

次のように実装する。

```scala
def recoverWith[A](actionCont: ActionCont[A])(pf: PartialFunction[Throwable, ActionCont[A]])(implicit ec: ExecutionContext): ActionCont[A] = {
  class ResultContainer(val value: A) extends Result(header = ResponseHeader(200), body = Enumerator.empty)

  fromFuture(actionCont.run(value => Future.successful(new ResultContainer(value))).map {
    case r: ResultContainer => ActionCont[A](k => k(r.value))
    case r                  => ActionCont.result[A](Future.successful(r))
  }.recover(pf)).flatten
}
```

`run`は実行した場合は結果の型であるPlayの`Result`しか返すことができない。しかし、このようにまず`Result`型のサブタイプ`ResultContainer`を作っておき、それに継続を入れて、最後に`map`で値を取り出している。しかし、例えば`ActionCont.result`など継続を途中で破棄するような操作が行われている場合、我々が作った`ResultContainer`が返ってこない場合がある。そこでパターンマッチを用いて、継続が途中で破棄されるような場合はそのまま`ActionCont.result`で継続を破棄する。
以前の実装では実行して得られる値が`Future[Result]`という、`ActionCont.fakeRun`で適当に入力した使い物にならない値であったが、今回は`Future[A]`という入力されたActionContが次のActionContに渡すべき値（主作用）が手に入る。入力されたActionContはこの時点で既に実行された後なので、もう一度実行はせず、さきほど得られた値を次に渡すような最小のActionContを生成して返すことにする。
このようにすることで、もし入力されたActionContの中に副作用があったとしても、一度しか実行されないので問題とならないだろう。

# まとめ

このように、副作用を持つようなActionContに対しても安全にリカバーできるようになった。この記事を読んで、より良い実装を思いついた方は気軽にコメントして欲しい。
Swift 2.2で警告が出るようになった後置インクリメントをdeferに置き換える

Swift 2.2から`++`や`--`を使っていると警告が出るようになりました。

[SE-0004 Remove the ++ and -- operators](https://github.com/apple/swift-evolution/blob/master/proposals/0004-remove-pre-post-inc-decrement.md)

`++`は変数の前に書くか後ろに書くかで挙動が変わるし、もうみんな使わないよね？ということらしいです。

```swift
var x = 0
print(x++) // 0
print(x)   // 1
print(++x) // 2
```

確かに最近使わなくなったよなぁと思っていたら、自作ライブラリの[JSONRPCKit](https://github.com/bricklife/JSONRPCKit)で使ってました＼(^o^)／

[NumberIdentifierGenerator.swift](https://github.com/bricklife/JSONRPCKit/blob/31c9584bde96ff5d590c90e67e5af9e15d77926d/JSONRPCKit/NumberIdentifierGenerator.swift)

```swift
public class NumberIdentifierGenerator: RequestIdentifierGenerator {
    
    private var currentIdentifier = 1
    
    public func next() -> RequestIdentifier {
        return .NumberIdentifier(currentIdentifier++) // ←ココ
    }
}
```

なるほど、現在の値を使って`return`した後にインクリメントしたかったようです。

これは`defer`の出番ですね！

```swift
    public func next() -> RequestIdentifier {
        defer {
            currentIdentifier += 1
        }

        return .NumberIdentifier(currentIdentifier)
    }
```

これで解決！

・・・

でも、たぶん実際にはこうやって直すと思います。ごめんよ、`defer`…。

```swift
public class NumberIdentifierGenerator: RequestIdentifierGenerator {
    
    private var currentIdentifier = 0
    
    public func next() -> RequestIdentifier {
        currentIdentifier += 1
        return .NumberIdentifier(currentIdentifier)
    }
}
```
ローカルPCにログイン中ユーザーの、Microsoftアカウントの CID を取得するPowerShellスクリプト




```
$item = Get-Item "HKCU:\Software\Microsoft\IdentityCRL\UserExtendedProperties"
$item.GetSubKeyNames() | select @{ name = "MS Account"; Expression = {$_} }, @{ name = "CID"; Expression = { $item.OpenSubKey($_).GetValue("cid") } }
```
上記で取得したCIDを使い、以下のパスを指定することでExplorerからOneDriveにアクセス可能。(WebDAV接続)
https://d.docs.live.net/{CID} 

普通にOneDriveクライアントで接続すると同期してしまうのが、この方法だと同期しないクラウドストレージとして使える。

ついでに、ネットワークドライブに接続するスクリプト

```
$cid         = "{MicrosoftアカウントのCID}"
$DriveLetter = "X"
$net = New-Object -ComObject WScript.Network
$net.MapNetworkDrive("{0}:" -f $DriveLetter, "\\d.docs.live.net@SSL\$cid", $false)
```

マップされたドライブのラベルが既定でCIDになってしまうので、それも見栄えのよいラベルに変えたい。

以下未検証＞
``$shell = New-Object -ComObject Shell.Application``
``$shell.NameSpace( "{0}:\" -f $DriveLetter ).Self.Name = "尾根ドライブ"``
とか
``$drive = Get-WmiObject -Class win32_volume -Filter ("DriveLetter = '{0}:'" -f $DriveLetter)``
``Set-WmiInstance -input $drive -Arguments @{ Label = "尾根ドライブ"}``
とか
コンテンツエディターWebパーツを追加するサーバーサイドコード(C#)


```csharp
// コンテンツエディタWebパーツ生成
Microsoft.SharePoint.WebPartPages.ContentEditorWebPart cewp
    = new Microsoft.SharePoint.WebPartPages.ContentEditorWebPart();

// コンテンツに流し込むXMLエレメントを生成
XmlElement contentP = (new XmlDocument()).CreateElement("p");

// コンテンツの設定
contentP.InnerText = "コンテンツエディタの中に書き出したいコンテンツ";
cewp.Content = contentP;

// Webパーツマネージャーを取得
using (SPLimitedWebPartManager ltdWebPartMgr = spWeb.GetLimitedWebPartManager(spFileUrl, PersonalizationScope.Shared))
{
    // Webパーツを追加
    ltdWebPartMgr.AddWebPart(cewp, strZoneId, intZoneIndex);
    // Webパーツの設定を保存
    ltdWebPartMgr.SaveChanges(cewp);
}
```
書評 - Swift+Core DataによるiOSアプリプログラミング


<a  href="http://www.amazon.co.jp/gp/product/4839954887/ref=as_li_ss_il?ie=UTF8&camp=247&creative=7399&creativeASIN=4839954887&linkCode=as2&tag=myb0f-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4839954887&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=myb0f-22" ></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=myb0f-22&l=as2&o=9&a=4839954887" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
<a  href="http://www.amazon.co.jp/gp/product/4839954887/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4839954887&linkCode=as2&tag=myb0f-22">Swift+Core DataによるiOSアプリプログラミング</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=myb0f-22&l=as2&o=9&a=4839954887" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

先日発売になりました「Swift+Core DataによるiOSアプリプログラミング」をいただきましたので、遅ればせながらレビューを書きたいと思います。

本書は全12章から構成されています。1章はCore Dataの概要、2章はiOSアプリでのUI実装の基本として、UIKitからStoryboard、Auto Layout、テーブルビューの解説、3章はCore Dataの仕組みと概念の解説となっており、これらを踏まえた4章〜9章が、本書のおよそ半分200ページを割いて書籍管理アプリを例としたチュートリアルになっています。

このチュートリアルがよくできていて、Core Dataの基礎からUIとの連携、データモデルのマイグレーション（！）、そしてデータの編集へと、章を追うごとにCore Dataへの理解が深まりつつ同時にアプリが完成へ近づいていくという構成になっています。
つまり、本書に沿ってチュートリアルを進めると実用的なiOSアプリが1本実装できてしまうという、なんとも太っ腹な一冊です。

10章以降は応用編として、効率的な実装方法やパフォーマンスの向上、テスト・デバッグやiCloudとの連携について書かれています。中でも11-4「PlaygroundとCore Data」ではそのタイトルの通り、PlaygroundでCore Dataを使う方法が解説されており、ちょっと遊んでみる用途にも良いのではないでしょうか。

本書のソースコードはSwift 2.1で書かれていますが、Swiftそのものに関する解説はありません。Swiftの入門には向きませんが、Core Dataを使ったiOSアプリの標準的な設計や実装が学べる良い書籍だと思います。
[concrete5.6] ローカルで作成したDesigner Content Proのブロックを本番へ移行する


## とても便利なDesigner Content Pro
Designer Content Pro（以下、DCP）は、concrete5でコンテンツを編集・レイアウトするための機能であるブロックを自分で拡張できるプラグインです。

これを利用することで、独自の入力フォームを持ったブロック（カスタムブロック）を作成することができます。

さらにカスタムブロックを作るために必要なプログラミングの量をほぼ無くしてくれるので、HTMLによる表現部分だけに集中することができ、デザイナーの画面作成やなクライアントの運用をサポートすることができます。

## 使い方・カスタマイズの参考
* [Designer Content Proアドオンの紹介](http://notnil-creative.com/blog/archives/2841)
* [Designer Content Proで作るナビゲーションブロック](http://notnil-creative.com/blog/archives/2956)
* [concrete5 の超便利アドオン Designer Content を極める！](http://www.slideshare.net/katz515/concrete5-designercontent)
* [Designer Contentで作ったブロックを使いまわす | immature](http://immature.01kawa.com/php/concrete5/designer-content/)

## 本番稼動しながらDCPブロックへ入れ替えたい
テスト環境でブロックを作って入れ込んでしまうと、本番環境でまた作成しなおさなくてはなりません。データベースのダンプで入れ替えても良いのですが、並行して稼働したい場合だと難航します。

メンテナンス時間を長くとっての移行はなるべく避けたいところです。

concrete5は下書き保存で変更後のプレビューができるので、本番サーバーは現状を維持しながら編集を進められます。

ローカルではブロックの動作のみ確認し、中身は本番サーバー上で入力して公開すれば、メンテナンス時間をかなり短縮できます。

テーマファイルには、ブロック化する前の内容を静的に埋め込んでおいて、そこに編集エリアを併記します。ブロックの追加と中身の入れ込みも、下書き状態であればログインユーザー以外には見えません。

内容がOKとなった段階で、静的に埋め込んだ部分を削除したテーマファイルを反映し、下書きを公開すれば入れ替えがスムーズです。

## ブロックタイプを追加すると自動生成されるファイル群
* /blocks/[block_hanle]/view.php
* /packages/designer_content_pro_blocks/blocks/[block_handle]/
	* tools/edit_repeating_item.php
	* add.php
	* controller.php
	* db.xml
	* edit.php
	* view.php

ブロックタイプを追加した時点で、後述のインストールが自動で行われます。その際、データベース上の**BlockTypes**テーブルにブロックタイプについてのレコードが追加されます。
## ブロックのインストール、アンインストール、削除
DCPで作成したブロックは、いつでもインストールとアンインストールができます。
### インストール
自動生成されたファイルのうち、重要なのは**db.xml**です。インストール時にブロックハンドルのアンダースコアをキャメルケースにした名前で、ブロック用のテーブルをデータベース上に作成します。

テーブルの名前はブロックハンドルが**test_block**だとすると、**btTestBlock**となります。

テーブル定義が**db.xml**で管理されることで、データベース上でテーブル編集など直接操作を行う必要がありません。

### アンインストール
ページ内で作成したブロックを使用している場合はそれらも削除されてしまうので注意が必要です。

作成したブロックをアンインストールしても、テーブルや自動生成されたファイルは消えません。

### 削除
削除すると以下の内容が削除されます。
1. /blocks/[block_hanle]/view.php
2. /packages/designer_content_pro_blocks/blocks/[block_handle]
3. **BlockTypes**テーブルからブロックタイプのレコード


## 移行の手順
1. DCPをインストール済みとして、自動生成されたファイルを本番サーバーへ同じディレクトリ構成でアップロードします。
2. 管理画面からDCPのページへ移動すると、アップロードしたブロックがインストール待ちの状態で表示されます
3. インストールをクリックします
4. ページの編集エリアにブロックを追加しようとすると、DCPで作成したブロックが一覧に表示されています
SVProgressHUDの動きが変わっているのでご注意を

#はじめに

下記メソッドの表示時間が変わってました。

showInfoWithStatus
showSuccessWithStatus
showErrorWithStatus
showImage

#コード
MINがMAXとなっています。

```lang:変更前
- (NSTimeInterval)displayDurationForString:(NSString*)string {
    return MIN((float)string.length*0.06 + 0.5, 5.0);
}
```

```lang:変更後
+ (NSTimeInterval)displayDurationForString:(NSString*)string {
    return MAX((float)string.length * 0.06 + 0.5, [self sharedView].minimumDismissTimeInterval);
}
```

#表示時間の計算方法

##今までの表示時間
- 表示する文字列が75文字以内 → 表示文字列の文字数 * 0.06 + 0.5
- 表示する文字列が75文字以上 → 5.0

ex)完了を表示させていた場合 → 2 * 0.06 + 0.5 = 0.62

##最新版の表示時間
- 表示する文字列が75文字以内 → 5.0
- 表示する文字列が75文字以上 → 表示文字列の文字数 * 0.06 + 0.5

ex)完了を表示させていた場合 → 5.0

##最新版に更新すると
完了を表示させていた場合、今までは0.62秒間表示されていましたが、更新すると5秒間表示されるようになります。

※開発者の方に確認したところ、意図した動きだと連絡がありました。不具合ではないようです。

#前と同じ動きにするには
下記を追加してください。
最小時間を指定できるようになっていました。
```SVProgressHUD.setMinimumDismissTimeInterval(0)
```

##表示時間
- 表示する文字列が75文字以内 → 表示文字列の文字数 * 0.06 + 0.5
- 表示する文字列が75文字以上 → 表示文字列の文字数 * 0.06 + 0.5 　(今までは5.0でした)

正確に言うと75文字を超えた場合は前と動きが変わりますが、
そういう場合はあまりない(むしろ75文字超える場合は5秒以上表示した方が良い？)かと思うので
気にしなくて良いかと思います。

#まとめ
SVProgressHUD.setMinimumDismissTimeInterval(0)を指定してください。
気付かずリリースして、想定外の動きとなってしまわないように周知できたらとこの記事を書きました。
sortコマンドで指定した列で数字順で並び替える（桁区切りの数字も可能）

#sortの使い方
sortはテキストファイルを指定した列で並び替えるコマンドです。
複数の列で並び替えることも可能です。

例えば以下のようなファイルがあるとします。

```
tanaka 333
suzuki 99
sato 111
sasaki 222
```

2列目の降順で並び替える場合はこのように実行します。

```
$ sort -r -n -k 2,2 ファイル名
```

# オプション説明
`-r` を指定すると、降順でソートします。
`-n` を指定すると、数字の順番でソートします。 つけないとアルファベット順になってしまい、
上記の場合、`99` のほうが `333` よりも大きいと判断されてしまうので注意しましょう。
桁区切りされた数字であっても可能です。
`-k` で並び替える列を指定します。2,3のように書くと、2列目と3列目の複合で並び替えが可能です。
H27年秋期 基本情報技術者 午後問12 解説 設問1

```
MAIN    START
        LD     GR0,A          ; GR0 ← A
        LAD    GR1,B          ; GR1 ← Bのアドレス
        LD     GR2,=10        ; GR2 ← n
        LAD    GR3,C          ; GR3 ← Cのアドレス
        CALL   BITINS
        RET
A       DC     #5E96
B       DC     #EF18
C       DS     2

BITINS  START
        RPUSH
        LD     GR6,=16
        SUBA   GR6,GR2        ; GR6 ← シフト数
        LD     GR1,0,GR1      ; GR1 ← ビット列 B
        LD     GR4,GR1        ; GR4 ← ビット列 B
        LD     GR5,GR0        ; GR5 ← ビット列 A
        SRL    GR1,0,GR6
        SLL    GR1,0,GR6      ; GR1 ← ビット列 B の左 n ビット(b1)
        SLL    GR4,0,GR2
        SRL    GR4,0,GR2      ; GR4 ← ビット列 B の右(16-n)ビット(b2)
        SRL    GR0,0,GR2      ; GR0 ← ビット列 A の左(16-n) ビット(a1)
        SLL    GR5,0,GR6      ; GR5 ← ビット列 A の右 n ビット(a2)
        OR     GR1,GR0        ; C1 ← b1+a1
        OR     GR4,GR5        ; C2 ← a2+b2
        ST     GR1,0,GR3
        ST     GR4,1,GR3
        RPOP
        RET
        END
```
A:a1,a2 → 00a1,a200
B:b1,b2 → b100,00b2
C:c1,c2 = b1a1,a2b2
b1,a2:n桁
b2,a1:(16-n)桁
PDFLibNetをExcelから召喚してみる


PDFをAdobe ReaderのOLEオートメーション経由でExcelのワークシートに自動貼り付けするようにしてみたところ、「画像の解像度が低くて使い物にならない」とクレームを貰ったので。

# 準備

* .NET Framework 4.0環境

* [Excel-DNA](http://excel-dna.net/)一式
   ExcelDna.xllは作成するdnaファイル名に合わせてPdfRender.xllにリネームしておく。

* PDFLibNet.dll
  流通してるのは2.0用ですが、幸いなことに[CubePDF Utility](http://www.cube-soft.jp/cubepdfutility/)に4.0でコンパイルされたdllが含まれているので、CubePDF Utilityのインストールフォルダから拝借。

※Adobe AcrobatもVisual Studioもなしで使えるのがポイント

# 呪文

以下をテキストエディタで作成して、上記のxllと同じフォルダに置いておくこと。

```csharp:PdfRender.dna
<DnaLibrary RuntimeVersion="v4.0" Name="PdfLibNet" Description="PdfRender" Language="CS">
<Reference Path="System.Drawing.dll"/>
<Reference Path="System.Windows.Forms.dll"/>
<Reference Path="PDFLibNet.dll" />
<![CDATA[

using System;
using System.Drawing;
using System.Windows.Forms;
using PDFLibNet;
using ExcelDna.Integration;

public class PdfTest
{
	[ExcelCommand(MenuName = "PdfRender", MenuText = "Paste PDF to selection")]
    public static void PdfRender(string fname, int page, int dpi)
    {
    	dynamic Excel = ExcelDnaUtil.Application;
    	
    	var doc = new PDFLibNet.PDFWrapper();
    	doc.LoadPDF(fname);
    	
    	System.Drawing.Image img = RenderPage(doc, page, dpi);
    	Clipboard.SetImage(img);
    	
    	img.Dispose();
        doc.Dispose();
    }
    
    private static System.Drawing.Image RenderPage(PDFLibNet.PDFWrapper doc, int page, int dpi)
    {
    	doc.CurrentPage = page;
    	doc.CurrentX = 0;
    	doc.CurrentY = 0;
    	
    	doc.RenderDPI = dpi;
    	
    	using (var box = new PictureBox())
    	{
    		doc.RenderPage(box.Handle);
    		
	    	var buffer = new Bitmap(doc.PageWidth, doc.PageHeight);
	    	doc.ClientBounds = new Rectangle(0, 0, doc.PageWidth, doc.PageHeight);
	    	using (var g = Graphics.FromImage(buffer))
	    	{
	    		var hdc = g.GetHdc();
	    		try
	    		{
	    			doc.DrawPageHDC(hdc);
	    		}
	    		finally
	    		{
	    			g.ReleaseHdc();
	    		}
	    	}
	    	return buffer;
	    }
    }
}

]]>
</DnaLibrary>
```

https://gist.github.com/acknpop/19f65651138cb34c042e

# 詠唱

ワークブックにPdfRender.xllをドラッグ＆ドロップし、「このアドインをこのセッションに限り有効にする」を選択しておく。

## Excel VBAからの呼び出し

```vbnet
    ' filename: PDFをフルパスで指定
    ' page:     表示したいページ
    ' dpi:      DPIを指定
    Application.Run "PdfRender", filename, page, dpi
    ActiveSheet.Paste ' クリップボード経由で貼り付け
```

ペーストした直後はセレクトされたShapeなので、Selectionを使ってサイズ変更などのオペレーションも容易です。

クリップボード経由の貼り付けなので、メモリ不足には注意されたし。
BoneCPによるコネクション取得時のリトライ設定

# はじめに

某プロダクトが内部でBoneCPを使用しているのですが、ごくたまにプロダクトの再起動時にJDBCコネクションの取得に失敗してしまうことがあったため、BoneCP側で自動リトライができないか調べてみました。

**なお、新規にBoneCPを使おうと考えている方は、現在は[HikariCP](http://brettwooldridge.github.io/HikariCP/)を検討した方がよいです。BoneCPの作者自身もBoneCPは今は非推奨でHikariCPをすすめています。**

# 確認したバージョン

BoneCP 0.7.1.RELEASE

# 関係するBoneCPのオプション

結論から言うと、下記のBoneCPのオプションが関係してきます。

| 項目 | 設定値の型 | 説明 |
|-----------|------------|------------|
| acquireRetryAttempts|int型|リトライ回数を設定する。|
| acquireRetryDelayInMs|long型|接続失敗後の次のリトライ実行までの待機時間をミリ秒で設定する。|
| lazyInit|boolean型|`true`に設定すると、アプリケーションから`getConnection`するまでプールは空で初期化する。デフォルトは`false`となっており、[BoneCPの初期化処理で最初に`getConnection`を行う](https://github.com/wwadge/bonecp/blob/0.7.1.RELEASE/bonecp/src/main/java/com/jolbox/bonecp/BoneCP.java#L303-L319)。|

最初の2つのオプションを設定するだけで一見よさそうに見えますが、ポイントは最後の`lazyInit`オプションです。これを`true`に設定しないと、BoneCPの初期化時に`getConnection`で接続エラーになってもリトライされません。**`acquireRetryAttempts`と`acquireRetryDelayInMs`の設定は無視されます**。[ソースを見れば一目瞭然で、初期化時の最初の`getConnection`時はハードコードでこの2つの設定値を`0`に設定しています](https://github.com/wwadge/bonecp/blob/0.7.1.RELEASE/bonecp/src/main/java/com/jolbox/bonecp/BoneCP.java#L299-L300)。

幸いにも、`lazyInit`を`true`に設定することでBoneCP初期化時の`getConnection`をスキップすることができます。これにより、1発目の`getConnection`もリトライ対象にすることができるわけです。
RailsでSidekiqをCapistranoでAWSにデプロイする

# 概要
RailsでSidekiqをCapistranoでAWSにデプロイする。

# 準備
## アプリ
### Gemfileにcapistrano-sidekiqを追加
```ruby:Gemfile
gem 'capistrano-sidekiq'
```

### Capfileに設定を追加
```ruby:Capfile
require 'capistrano/sidekiq'
require 'capistrano/sidekiq/monit' #to require monit tasks # Only for capistrano3
```

### deploy.rbに設定を追加
```ruby:config/deploy.rb
set :sidekiq_monit_conf_dir, '/etc/monit.d'
```

## サーバ
### visudoを実行してアプリ実行ユーザがパスワード不用でsudoを実行できるようにする
```sh:visudo
## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL
app     ALL=(ALL)       NOPASSWD: ALL
```

### monitをインストール
```sh
sudo yum install -y monit
```

### monitを自動起動にする
```sh
sudo chkconfig monit on
```

### /etc/monit.confの以下の部分のコメントアウトを外す
```sh:/etc/monit.conf
set httpd port 2812 and
   use address localhost  # only accept connection from localhost
   allow localhost
```

# デプロイ実行
```sh
bundle exec cap staging deploy
```
underscoreコードリーディング（times）



underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##timesとは


###[underscorejs.orgのtimes](http://underscorejs.org/#times)

こんな説明。
>####_.times(n, iteratee, [context]) 
>Invokes the given iteratee function n times. 
>Each invocation of iteratee is called with an index argument. 
>Produces an array of the returned values. 
>Note: this example uses the chaining syntax.



```javascript
_(3).times(function(n){ genie.grantWishNumber(n); });
```

------------- 
与えられたiterateeをn回数繰り返し呼び出します。
それぞれのiterateeは、indexのargumentと一緒に呼び出されます。
返される値を元にarrayが作られます。
注記：この例はメソッドチェーンを使っています。

###[underscore.times](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1313)
コード的にはこのあたり。

```javascript
 // Run a function **n** times.
  _.times = function(n, iteratee, context) {
    var accum = Array(Math.max(0, n));
    iteratee = optimizeCb(iteratee, context, 1);
    for (var i = 0; i < n; i++) accum[i] = iteratee(i);
    return accum;
  };

```

accumにnの個数分の空の配列を定義する。
iterateeにoptimizeCbの結果を格納する。


for文でi=0からnまで1ずつ回す。iterateeにiを代入し、結果をacuumのi番目に代入する。
その後、accumを返す。
npmパッケージ非公開化問題の巻き添えを食らっているかチェックする

Node.js界隈が騒然としている

- [I’ve Just Liberated My Modules — Medium](https://medium.com/@azerbike/i-ve-just-liberated-my-modules-9045c06be67c#.ak4np3i50)
- [npm パッケージの unpublish に関するゴタゴタの大まかなまとめ - ヤルキデナイズド](http://uasi.hatenablog.com/entry/2016/03/23/215308)
- [【意訳】たった今、npmのパッケージを解放しました。 - Qiita](http://qiita.com/chuck0523/items/ee23293f2645d40cb317)

の件ですが、[azer氏が非公開化したパッケージに依存しているかどうかチェックするスクリプト](https://gist.github.com/y13i/e6d43a57548d7af3cfea)を作ったので、どうぞご利用ください。

```shell-session
$ node --eval "$(curl -fsSL https://gist.githubusercontent.com/y13i/e6d43a57548d7af3cfea/raw/1f3e034c68f09498f086cb425b450d57c9816ac7/check_azer.js)"
```

を `node_modules` があるディレクトリで実行するとチェック可能です。

運悪く該当パッケージがあった場合、[GitHubのrepoを指定する方法](https://docs.npmjs.com/files/package.json#github-urls) があります。azer氏自身も言及している通り、[氏のGitHubのリポジトリ](https://github.com/azer?tab=repositories)を直接参照すれば良いでしょう。
crontabでパス関連が辛い・・・。よし、その場しのぎしよう

cronはフルパス指定しないといけない。
プログラムファイル中の記述もフルパスじゃないといけない。
できればそうした方がいいのだけれど、ちょっとその場しのぎしたい。

## bashオプションを使って実行しよう

ログインシェルに `bash` を使っているとします。

`crontab -e` なので、ユーザー名指定オプションはないものとします。

```
* * * * * /path/to/command
```

上記のプログラムをこうします。

```
* * * * * /bin/bash -lc 'command'
```

いつもシェルで叩いているようにコマンドが叩けるねやったね！
プログラムを実行した時もPATH関連でトラブらないよやったね！

## デメリット

これ、あくまでその場しのぎ。
自分のローカルマシン上に設定するのはいいけど、サーバーにやるのはあまり良くないです。
`.bashrc` 等が何度も実行されることになるので、実行コストは増大します。
注意して利用しよう。
EC-CUBE 2系のインストールでmysqlのエラーが出た


ちょっとEC-CUBE 2系を使ってみたくなったのでインストールを実行してみたら
DBの接続設定後の次の画面で以下のエラーが出た。

mysqlは5.7.9
ec-cubeは2.13.5

```
Fatal error: DB処理でエラーが発生しました。 SQL: [SET SESSION storage_engine = InnoDB] MDB2 Error: unknown error _doQuery: [Error message: Could not execute statement] [Last executed query: PREPARE mdb2_statement_mysql_1b92dgf5ds8728fdsc229e74bdd0fcf FROM 'SET SESSION storage_engine = InnoDB'] [Native code: 1193] [Native message: Unknown system variable 'storage_engine'] in /home/hogehoge/data/class/SC_Query.php on line 1095
```

`SET SESSION storage_engine = InnoDB`の実行時に以下のエラーで実行できないよう

```
[Native message: Unknown system variable 'storage_engine']
```

多分mysql5.7からは上記の設定がなくなってるみたい。
インストールプログラムをトレースして以下の部分を修正して解決。

`/data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php`の363行目

```
$objQuery->exec('SET SESSION storage_engine = InnoDB');
↓
$objQuery->exec('SET SESSION default_storage_engine = InnoDB');
```

というかmysql5.7ならデフォルトのエンジンはInnoDBだった気がする。
key-valueオブジェクトの配列をオブジェクト型に変化する

# はじめに
とあるシステム開発をしていたら、以下に示すようなデータ変換をしたくなりました。

```js
// 変換前
[
  {
    key: 'hp',
    value: 1000
  },
  {
    key: 'power',
    value: 800
  },
  {
    key: 'defense',
    value: 500
  },
]

// 変換後
{
  hp: 1000,
  power: 800,
  defense: 500
}
```

検索の仕方が悪かったのか、中々それっぽいサンプルに出会えずにいました。なので、自分で考えたら何とか思いついたので、備忘録代わりに記事を書くことにしました。

# 実際のコード

```js
let param = [
  {key: 'hp', value: 1000},
  {key: 'power', value: 800},
  {key: 'defense', value: 500}
];

let convertArrayToObj = R.pipe(
 // (1) map処理
　　R.map((item)=>({[item.key]:  item.value})),
　　// (2) reduce処理
　　R.reduce(R.merge, {})
);

convertArrayToObj(param);
```

[ramda](http://ramdajs.com/0.19.1/index.html)で書いてみました。[ここ](http://goo.gl/Ckg5UZ)で実際に動かすこともできます。



# 簡単な解説
(1)map処理
まずはmap処理でparamを以下のように変換します。

```js
[{hp: 1000}, {power: 800}, {defense: 500}]
```

(2)reduce処理
次にreduceで配列を一つにまとめています。reduceとは配列の中をすべて足すなど、配列を一つにまとめる計算をする処理のことです。例えば、数字配列をすべて足し算する場合は

```js
let array = [1,2,3,4,5];
R.reduce(R.add, 0, array);
```

となります。R.reduceの初めの引数にはどのような一つにまとめるかの処理を、２つ目の引数には初期値を設定しています。上記コードではR.mergeと書きましたが、これはオブジェクト同士を合成するという意味です。例えば、

```js
R.merge({hp: 1000}, {power: 800})
```

と書くと

```js
{
  hp: 1000,
  power: 800
}
```

となります。これですべての配列を一つにまとめてオブジェクトにすることができるようになります。

# 終わりに
これだけ書くにも、結構疲れるもんですね。こう言うのって人に説明するのが難しい。
tmux 2.2をソースビルドしてインストールした話

![ss-tmux2.png](https://qiita-image-store.s3.amazonaws.com/0/43608/237987d7-5cf2-40ce-ceed-1b536382ef67.png)
tmuxずっと使いたくてせっかくだから最新版入れたいなってなったので
自宅サーバに入れるまでのお話

# 導入環境
- Ubuntu14.04

UbuntuなのでLinux mintで導入した記事を参考にしました


# 必要パッケージの追加

>$ sudo apt-get install libevent-dev automake libncurses5-dev

とりあえずこれだけあればインストールまでできた


# gitからソースをcloneする
>
$ git clone https://github.com/tmux/tmux.git


# tmux の　インストール
>
$ sudo autogen.sh
$ sudo ./configure
$ sudo make
$ sudo make install


# バージョン確認
>
$ tmux -V
tmux 2.2

#おつかれさまでした
途中でパッケージ足りなかったり色々あったけど
無事インストールはできたので良かったです。
少しずつTmuxなれようと思います。
ありがとうございました。

#　参考
- [Linux Mint - tmux 2.1 のインストール（by ソースビルド）！ - mk ...](http://www.mk-mode.com/octopress/2015/08/03/linux-mint-tmux-installation-by-src/)
- [Can't exec "aclocal": No such file or directoryの対処法 - Qiita](http://qiita.com/DQNEO/items/11d6056547cab0632901)
- [Debian Lennyにtmuxをインストールする。 - 目の前に僕らの道 ...](http://masasuzu.hatenablog.jp/entry/2013/01/15/221632)
Go言語:「インタフェースへのポインタ」ではまった

#前書き

Go とデザインパターンの並行勉強がてら、Builder パターンを書いてみたらちょっと詰まったので覚書き。
外部パッケージに定義したインタフェースを実装してみたらうまく動かなかったので、インタフェースとポインタについて調べてみた。


#Builder パターン

足したり引いたりするだけの、GoF Builder の最低限の実装（だと思う）。
NewDirector でインスタンスを生成し、Construct で実行。

``` builder.go
package builder

type builder interface {
  Add(num float64)
  Sub(num float64)
  GetResult() string
}

type Director struct {
  builder builder
}

func NewDirector(b builder) Director {
  d := Director{b}
  return d
}

func (d *Director) Construct() {
  b := d.builder
  b.Add(100)
  b.Sub(50)
  b.Add(100)
}

```

builder パッケージを main.go で実装し、Director で実行結果を得る。
SumBuilder は Builder インタフェースを実装した実体。

``` main.go
package main

import (
  "fmt"
  "strconv"
  "./builder"
)

type Director builder.Director

type SumBuilder struct {
  sum float64
}

func NewSumBuilder() *SumBuilder {
  s := &SumBuilder{0}
  return s
}

func (s *SumBuilder) Add(num float64) {
  s.sum += num
}

func (s *SumBuilder) Sub(num float64) {
  s.sum -= num
}

func (s *SumBuilder) GetResult() string {
  sumStr := strconv.FormatFloat(s.sum, 'g', 8, 64)
  return "Sum: " + sumStr + "."
}


func main() {
  sumbuilder := NewSumBuilder()
  director := builder.NewDirector(sumbuilder)
  director.Construct()

  str := sumbuilder.GetResult()
  fmt.Printf("%v\n", str)
}
```

実行するとちゃんと Sum: 150 が出力される。


# 躓きポイント

前述の builder.go は修正後のコード。修正前はこんな感じ。

``` builder.go(修正前)

/* 省略 */

type Director struct {
  builder *builder
}

func NewDirector(b *builder) *Director {
  d := &Director{b}
  return d
}

func (d *Director) Construct() {
  b := *d.builder
  b.Add(100)
  b.Sub(50)
  b.Add(100)
}

```

ポイントは Director がメンバで持っている builder インタフェースをポインタで持っていたこと。
どうやらインタフェースのポインタはインタフェースとしての機能を持てないということらしい。
つまりインタフェースの機能を実装した実体のポインタを渡してもインタフェースとしては振る舞えないので意味がない、ということだ。


# 結論
結局のところは、ポインタについてもっとちゃんと考えましょうね、というお話でした。


# 参考
Go言語のインターフェイスとポインタについての小実験
http://d.hatena.ne.jp/eel3/20140915/1410788174
「OpenCV for Unity」Assetのインポートサイズを削減する方法

#Assetをフルサイズでインポートするとプロジェクトサイズが大変なことになる

多くのプラットフォームに対応している「**[OpenCV for Unity](https://assetstore.unity.com/packages/tools/integration/opencv-for-unity-21088) (https://assetstore.unity.com/packages/tools/integration/opencv-for-unity-21088)**」Assetですが、その代償としてAsset全体のファイルサイズがとても大きいです。

#解決方法
作成するアプリのUnityプロジェクトに必要のないファイルをインポートしないことで、プロジェクトフォルダのファイルサイズを大幅に削減することが出来ます。

具体的にはパッケージのインポート時に以下の事をします。

- **~~同梱されている旧バージョンのZipファイルをインポートしない（280MBの削減）~~**[^1]
- **使用しないプラットフォームのPluginファイルをインポートしない（30～700MBの削減）**

![QiitaOpenCV_asset_size_redu.jpg](https://qiita-image-store.s3.amazonaws.com/0/28558/91640c82-5ec8-b04e-1361-d5deca7f6985.jpeg)
（iOSプラットフォームのPluginファイルサイズが特に大きいので、必要が無い場合は必ず除外したほうがいい）
（Macプラットフォームの対応が必要ない場合はPlugins/opencvforunity.bundleを除外する）
（サイズ削減にはあまり効果ないが、不要ならSampleフォルダやReadMe.pdfもインポートから除外する）

もちろんインポートした後からでもProjectウインドウから削除することで同様の効果を得られます。
とりあえず必要最小限の構成でインポートしておいて、必要に応じて特定のプラットフォームのPluginファイルを追加インポートすればいいと思います。




# 関連記事
[UnityでOpenCVを利用した顔検出・画像処理アプリ事始め](http://qiita.com/utibenkei/items/fb93623a7ccaabb342f2)
[UnityでOpenCVを利用した顔検出・画像処理アプリ事始め2 サンプルコード詳解](http://qiita.com/utibenkei/items/290e83d2c50cdadbcb2d)
「OpenCV for Unity」Assetのインポートサイズを削減する方法
[UnityでOpneCVを利用した動画再生をしてみた](http://qiita.com/utibenkei/items/aaaa6cf5b470aa4f69d5)
[UnityでOpneCVを利用したハコスコVR体験](http://qiita.com/utibenkei/items/a9c4e96a395666f9bf54)
開発環境でVimとtmuxをおすすめする理由


新人プログラマ応援タグができたということで開発環境について少し書いてみました。

## 対象者
新人Web系の開発者


## なぜVimを勧めるのか
どのエディタを使ったらいいかと聞かれるとVimと即答します。
最近だとAtomやSublime Textを使っている人も多いと思いますが、Vimをおすすめします。

どのエディタが使いやすいかというのは、宗教問題という比喩があるように闇が深い問題になっており人それぞれだと思います。私はVimを使いやすいから勧めるわけではありません。

***Vimを勧める理由は、サーバで作業するようになったときにスムーズに作業が進めれるためです。***

インフラエンジニアでない限り、始めの方(1年目)はサーバに入って作業することはほとんどないと思います。しかし、早い人では開発がなんとなくできるようになったぐらいからサーバで作業することが出てくると思います。サーバでファイルを編集する際に使うのは、ほとんどの場合vi(Vim)です。その際に普段から使っていないと操作が独特なため、四苦八苦してしまいます。
サーバで作業する際に四苦八苦しないように日頃からVimを使っておくことをおすすめします。

※ただ、開発環境でVimを使うときは自分好みにカスタマイズして使うので、サーバで作業するときに使う初期設定のままのviは使いづらいとは思ってしまいます。

## なぜ開発環境でtmuxを使うのか
結論から言うとこちらも
***サーバで作業するようになったときにスムーズに作業が進められるためです。***

tmuxとは、仮想端末ソフトです。１つの端末から複数の端末を起動できます。また、attach、detach機能があり、端末の状態を保存できます。例えば、通常、SSH接続している際にネットワークが切れてしまうと作業内容が消えてしまいます。しかし、tmuxを使っていれば、接続が切れた際に状態を保存しておいてくれるため、ネットワークが復旧したあとにattachをすると元の状態に戻ってくれます。また、実行に一晩中かかるよう処理を実行する際、端末を閉じると処理が終了されてしまいますが、detachを使うと状態を保存したまま端末を閉じることができます。

そのためサーバで作業をする際、仮想端末ソフトはほぼ必須だと思います。

同じようなソフトでscreenがあります。機能自体はほとんど変わりませんが、tmuxの方が活発に開発されており、使っている人が多い印象です。そのため、tmuxをおすすめします。

その他に仮想端末ソフトを使うと端末の切り替えがスムーズにできます。最近の端末はタブ機能があるので、端末の切り替えをスムーズにできますが、タブ機能の切り替えより仮想端末ソフト使って切り替えた方が早く、ホームポジションから手離さなくてもよくなります。また、画面の分割も簡単にできます。

## まとめ
サーバに入ったときと同じような環境で開発するとなにかと役立ちます！！
しかし、２つともにキーバインドを覚えるのが少し大変なため頑張って！！
Swift 2.2 の新機能: SE-0014: AnySequence.init に制約を与える

今回は [SE-0014: AnySequence.init に制約を与える](https://github.com/apple/swift-evolution/blob/master/proposals/0014-constrained-AnySequence.md) です。Swift のシーケンスの実装を理解していないのでだいぶ怪しいです...
ツッコミお待ちしています。
原文に従ってこの訳は [Apache License 2.0](https://github.com/apple/swift-evolution/blob/master/LICENSE.txt) とします。

# SE-0014: AnySequence.init に制約を与える

* 提案: [SE-0014](https://github.com/apple/swift-evolution/blob/master/proposals/0014-constrained-AnySequence.md)
* 著者: [Max Moiseev](https://github.com/moiseev)
* ステータス: **Swift 2.2 に向けて受理された** ([Bug](https://bugs.swift.org/browse/SR-474))
* レビューマネージャ: [Doug Gregor](https://github.com/DougGregor)

## はじめに

`AnySequence` がその子孫にあたる型に呼び出しをデリゲートできるよう、イニシャライザは追加の制約を持つべきです。

## 動機

現在のところ `AnySequence` は `SequenceType` プロトコルのメソッドに対する呼び出しをその子孫にあたる型を持つシーケンスにデリゲートしません。この結果、必要に応じてその場で動的にダウンキャストすることになります(`SequenceType.dropFirst` または `SequenceType.prefix` のデフォルトの実装を見てください)。さらに、こちらの方がより重要ですが、デリゲーション無しでは `SequenceType` のメソッドをカスタマイズした実装は無視されてしまうでしょう。

## 提案手法

[このプルリクエスト](https://github.com/apple/swift/pull/220)にある実装を見てください。

この種のデリゲーションを実現するには `_SequenceBox` はもとのシーケンスだけではなく `SubSequence` も 'ラップ' する必要があります。するとこのような宣言は:

~~~~Swift
internal class _SequenceBox<S : SequenceType>
    : _AnySequenceBox<S.Generator.Element> { ... }
~~~~

このようになるでしょう:

~~~~Swift
internal class _SequenceBox<
  S : SequenceType
  where
    S.SubSequence : SequenceType,
    S.SubSequence.Generator.Element == S.Generator.Element,
    S.SubSequence.SubSequence == S.SubSequence
> : _AnySequenceBox<S.Generator.Element> { ... }
~~~~

次に `AnySequence.init` には以下のような制約がつくことになるでしょう。

変更前:

~~~~Swift
public struct AnySequence<Element> : SequenceType {
  public init<
    S: SequenceType
    where
      S.Generator.Element == Element
  >(_ base: S) { ... }
}
~~~~

変更後:

~~~~Swift
public struct AnySequence<Element> : SequenceType {
  public init<
    S: SequenceType
    where
      S.Generator.Element == Element,
      S.SubSequence : SequenceType,
      S.SubSequence.Generator.Element == Element,
      S.SubSequence.SubSequence == S.SubSequence
  >(_ base: S) { ... }
}
~~~~

私たちは全ての `SequenceType` の実装がこれらの制約を最初から満たしていてほしいと思います。するとこれらの制約は実際のところ `SequenceType` プロトコル自体に適用されるべきなのです(現在のところそれは不可能なのですが)。技術的には `S.SubSequence.SubSequence == S.SubSequence` は必ずしも必要ではないという点は触れておく価値があります。これは同じ型を要素に持つシーケンスは全てこの制約を満たしているからです。しかし現在のところそれを表現する方法はありません。

## 既存のコードに対する影響

全ての `SequenceType` プロトコルに準拠する組み込み型は基本的に (`SubSequence.SubSequence == SubSequence`) という関係を持つように作られるので、新しい制約が影響を与えることはありません。サードパーティーのコレクションも、もしデフォルトの `SubSequence` (例えば `Slice`)を使っていたとしても問題ないはずです。カスタムの `SubSequence` を持つ型はそのプロトコルに準拠しなくなるかもしれません。