OmniAICreator/Qiita-1.07M huggingface dataset:
CLIからBetaでのAPK配布を行う際の設定まとめ

# 概要

Fabric BetaのGraldeプラグインでAPKを配布する際に指定できる設定のメモです。

# Betaの利用開始

Betaを使用するためにはFabricのCrashlytics Kitが必要になります。以下を参考に設定してください。

- https://fabric.io/kits/android/crashlytics/install

また、Android Studio / IntelliJ 向けのFabricプラグインも用意されているのでこちらを使用することもできます。

- https://www.fabric.io/downloads/android

# Betaの設定の追加方法

以下のように配布したいBuildTypeやFlavorにプロパティを追加すればOKです。

```groovy
android {
    buildTypes {
    	release {
	    	ext.betaDistributionReleaseNotes="Release Notes for this build."
	    }
    }
}
```

実際に配布するには以下のコマンドを実行します。

```bash
./gradlew assembleRelease crashlyticsUploadDistributionRelease
```

# 各種設定

## Release Notes

配信されたAPK毎に表示されるRelease Notesの内容を設定できます。

```bash
ext.betaDistributionReleaseNotes="Release Notes for this build."
```

以下のように予め用意したテキストファイルの指定が可能です。

```bash
ext.betaDistributionReleaseNotesFilePath="path/to/release_notes.txt"
```

## Testers

APKを配布するテスターをメールアドレスで指定できます。複数指定する場合カンマで区切ります。

```bash
ext.betaDistributionEmails="BetaUser@yourcompany.com, BetaUser2@yourcompany.com"
```

また、以下のようにメールアドレスをまとめたテキストファイルの指定が可能です。

```bash
ext.betaDistributionEmailsFilePath="beta_distribution_emails.txt"
```

## Groups

APKの配布先をグループで指定します。複数のグループを指定する場合カンマで区切ります。

```bash
ext.betaDistributionGroupAliases="my-best-testers"
```

テキストファイルにまとめて指定する場合以下のようします。

```bash
ext.betaDistributionGroupAliasesFilePath="group_aliases.txt"
```

## Email Notifications

メールでのAPK配布通知をdisableにしたい場合以下のように指定します。

```bash
ext.betaDistributionNotifications=false
```

# コマンド実行時にBetaの設定を変更

Betaの各種設定をコマンド実行時に変更できると便利です。gradleコマンドを実行時に`-P`オプションを使うことでプロジェクトプロパティを指定できます。

```bash
./gradlew assembleRelease -PreleaseNotes="Hello World!" crashlyticsUploadDistributionRelease
```

この様に指定したプロパティはbuild.gradleから参照可能です。

```groovy
android {
    buildTypes {
    	release {
	    	ext.betaDistributionReleaseNotes = releaseNotes
	    }
    }
}
```

これでコマンド実行時に任意のリリースノートを指定できました。`releaseNotes`にデフォルト値を指定しておきたい場合、`gradle.properties`に予め定義しておきます。

```:gradle.properties
releaseNotes = "Default Release Notes"
```

Gradleには、他にも環境変数やシステムプロパティなどの方法でビルドにプロパティ値を渡すことができます。詳細は[こちら](http://gradle.monochromeroad.com/docs/userguide/tutorial_this_and_that.html)をご覧ください。

# 参考
- https://docs.fabric.io/android/beta/gradle.html
- http://gradle.monochromeroad.com/docs/userguide/tutorial_this_and_that.html
dotnet core でexeファイルを作成


```project.json
"frameworks": {
    "netcoreapp1.1": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "type": "default", # defaultに変更
          "version": "1.1.0"
        }
      },
      "imports": "dnxcore50"
    }
  },
  "runtimes": {
    "win10-x64":{} # buildするプラットフォームを追加
  }
```

```console
dotnet restore
```

targetを指定して、build

```console
dotnet build -r win10-x64 -c Release
```

できあがり。

これでいいのかわからないけどとりあえず.exeができた。
DatePeriodでハマる人がいるらしいので、for文で説明してみた


[PHPで日付をループする方法と罠](http://qiita.com/hirapi/items/c7556da46ed19783f2e6)のように、プログラミング初心者にはハマりやすい罠らしいです。for文で書き直してみたら多分そんなくだらないハマり方しなくなると思うので、書いておきますね。  
コードは、上記の記事のやつを勝手に拝借して、適当に修正してます。

```php
<?php
$start = new DateTime('2016-11-02');
$end = new DateTime('2016-11-08');
$interval = new DateInterval('P2D');

$period = new DatePeriod($start, $interval, $end);

foreach ($period as $date) {
    echo $date->format('Y-m-d').PHP_EOL;
    // $end の "2016-11-08" は出力されない
}
```

これを `for文` で書くと、こんな感じになります。

```php
<?php
$start = new DateTime('2016-11-02');
$end = new DateTime('2016-11-08');
$interval = new DateInterval('P2D');

for ($currentDate = $start; $currentDate < $end; $currentDate->add($interval)){
    echo $currentDate->format('Y-m-d').PHP_EOL;
    // $end が出力されない！！！＞＜
}
```

「`$current < $end;` って書いてるのに、**$endが含まれるわけねーじゃんｗｗｗ** 」と、すぐに気付けます。一目瞭然ですね。

## 
「for文の文2は `<=` を使うだろ常考ｗｗｗ」っていうツッコミを受けそうな気がしましたが、**範囲を表す場合は「包含-排他範囲」が基本です。** 
[`DatePeriod::__construct`の第３引数は`$end`](http://php.net/manual/ja/dateperiod.construct.php#refsect1-dateperiod.construct-parameters)なので、[`$end`自身を含めないのが一般的な解釈](http://d.hatena.ne.jp/asakichy/20140717/1405548313)でしょう。
homebrewでopenbr入れたもののqt関連でエラーが出る

macOS Sierraにて
brewでopencv openbrをインストール
早速openbrのTutorialを進めるものの
fatal: Failed to set br::Transform* br::IndependentTransform::transform toのエラー

理由は公式ではqt5.4.1が推奨されているが実際に使うqtのバージョンが高いため。
参考→https://github.com/biometrics/openbr/pull/486
てな訳でqt5.4.1を用意したいところだけどmacOS Sierraでは使えないそうな

じゃあopenbrのエラー吐いている部分を直したものをインストールしましょうっていう話
このページの通りにやればおk
https://gist.github.com/rmarscher/fd64fb192c8dce908a4d0227782e6fc9
Touch Bar 対応は available(macOS 10.12.1, *) では不十分

__追記__: 本件は __Xcode 8.1__ のときのもので、__Xcode 8.2__ 以降では Touch Bar 関連の availability は macOS 10.12.2 に変更になったためこの問題は解消されています。

---

CotEditor 開発でトラップを踏んだので知見の共有です。

NSTouchBar 関連の API は macOS 10.12.1 SDK 以降で使用でき、Swift では `#available(macOS 10.12.1, *)` を噛ませれば呼び出しできます。ところが、macOS 10.12.1 は実のところ複数のビルドが出回っており、一般的に出回っている初期のビルドには NSTouchBar が入っていないので、呼び出すとアプリケーションが死にます。しかも呼び出した途端即クラッシュではなく、じわじわと「ウインドウが出ない」などの不具合が出ます。

つまり、以下はコンパイルは通りますが不十分です。

```swift
// setup touchbar
if #available(macOS 10.12.1, *) {
    // NSTouchBar には触っていないが Touch Bar 関連の API なのでアウト
    NSApp.isAutomaticCustomizeTouchBarMenuItemEnabled = true
}
```

このように、ダサい方法でさらに本当に NSTouchBar があるかチェックする必要があります。

```swift
// setup touchbar
if #available(macOS 10.12.1, *), NSClassFromString("NSTouchBar") != nil {
    NSApp.isAutomaticCustomizeTouchBarMenuItemEnabled = true
}
```

ちなみに `makeTouchBar()` なんかは、そもそも Touch Bar に対応していないと呼び出されないので、`@available(macOS 10.12.1, *)` で十分です。ただし、そこで独自メソッドを用意して他のスコープから呼ぶときは注意しましょう。

```swift
@available(macOS 10.12.1, *)
extension DocumentViewController: NSTouchBarDelegate {
    
    override func makeTouchBar() -> NSTouchBar? {
        
        let touchBar = NSTouchBar()
        
        touchBar.delegate = self
        touchBar.customizationIdentifier = .touchBar
        // and other touchBar settings...
        
        return touchBar
    }


    func myOriginalMethodForTouchBar() {
        
        guard let touchBar = self.touchBar else { return }
        
        // nantara kantara
    }

}


extension DocumentViewController {

    func updateSomething() {
        
        // これの呼び出しも NSClassFromString("NSTouchBar") != nil を噛ませるべき
        if #available(macOS 10.12.1, *), NSClassFromString("NSTouchBar") != nil {
            self.myOriginalMethodForTouchBar()
        }
    }
}
```

Touch Bar を開発するような人は、Touch Bar 対応ビルドを入れていると思うので開発環境で問題が顕在化しません。注意が必要です。

これがビルド違いだなんて。本来なら Apple が macOS のバージョンナンバーを 10.12.2 にあげるべき案件だと思います。私はもう激おこ👹です。


### 追記

現在出ている Xcode 8.2 beta 2 では、Touch Bar 関連の API は NS_AVAILABLE_MAC(10_12_2)
 に変更になっているようです。そりゃそうだよな。ふがー 😡。


### 追記2

ちゃんと読めばランタイムチェックしろって Xcode 8.1 のリリースノートに書いてあります。

[Xcode 8.1 Release Notes](https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Introduction.html)

> - In Swift code, do an availability check for macOS 10.12.1, __and a runtime check__ for Touch Bar class availability. For example:
> ```NSClassFromString("NSTouchBar") != nil```
ブラウザでセレクション状態(反転中)のテキストをJavaScriptで取得する

```javascript
document.getSelection().toString();
```

へー
ちなみにPhantomJSでも使えた(CasperJSからだけど)

```coffeescript
selected = casper.evaluate -> document.getSelection().toString()
```

See also [Selection - Web APIs | MDN](https://developer.mozilla.org/en-US/docs/Web/API/Selection)
c++ builder XE4, 10.2 Tokyo > IDE > プロジェクトマネージャで該当ファイルに到達する > ファイル名を短時間に入力する / Mで始まるファイルを探索 > Mを入力し続ける

```txt:動作確認
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

ソース(cpp)が52ほどあるプロジェクトを開いているとする。
「プロジェクトマネージャ」ウィンドウで特定のファイル名のファイルに到達するにはどうするか。

今まではスクロールでファイル名を探していたが、「プロジェクトのソート順」を「変更した日付」にしていたりすると、ファイルを見つけるのが難しい。

別の方法を偶然見つけた。

- プロジェクトマネージャをクリック
- 短時間にファイル名の先頭から一部を入力
   - 例: hogehogeDraw.cppの場合、hogehogeでも
   - プロジェクトマネージャの下側に「検索: hogehoge」という表示がされ
   - そのファイルに到達する
  
試してみるものだ。

### Mで始まるファイルを探索

- プロジェクトマネージャをクリック
- 時間を置きながら`M`を入力し続ける
  - Mで始まるファイルに順番にフォーカスが移る
Qiita の「いいね」ボタンの位置は間違っている

Qiita に「いいね」機能が追加されましたね。
http://blog.qiita.com/post/153200849029/qiita-like-button

「ストック」ボタンが2つの意味をもつようになってしまったため、これを分離したという背景は理解できます。
しかし、「いいね」ボタンの実装方法に問題があります。

# 問題

例えばトップページで気になる記事タイトルを発見し、クリックすると以下のような画面に遷移します。
<img width="823" alt="スクリーンショット 2016-11-17 14.27.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/29815/7dd0d7c5-f6c8-94b8-20f6-73f9214ee2e3.png">
右側のスクロールバーを見ると、結構ボリュームのある記事のようですね。
右上には、実装されたてピカピカの「👍いいね」ボタンが誇らしげに、あなたに押されるのを今か今かと待っています。

しかし、まだ「はじめに」しか見えていないのに、「この記事いいね！気に入ったよ！投稿者さんありがとう！」という気持ちになれるでしょうか？
記事を下までスクロールし最後まで読んで、「タイトルで期待したとおりの素晴らしい記事だった！」という思いが生まれてはじめて「いいね」ボタンを押したくなるのではないでしょうか。

逆に「いいね」をもらった投稿者さんも、「ちゃんと記事を読んでないのに変なテンションで押しちゃった"いいね"なのではないだろうか・・・」と疑心暗鬼にならざるを得ないでしょう。

そうなると、「"いいね"って一体なんなんだろう」という雰囲気が Qiita 上に蔓延し、カッコイイ数式から導き出される Contribution の示す価値も揺るぎかねません。または、記事の内容に力を入れなくてもタイトルの付け方で「いいね」の数が上下することに皆が気づき、「いいね」をたくさんもらえるタイトルの付け方が確立していき、記事をちゃんと書くのはコスパが悪いと感じだし、タイトルだけ魅力的で中身がスカスカな記事で溢れる未来が訪れるかもしれません。「いいね」のためなら人はなんだってするのです。


# 解決方法

解決方法は簡単です。
右上の「いいね」ボタンをなくすだけです。
記事下部の「いいね」ボタンをさらに目立たせるとより良いかもしれません。
`.nav.tocTree_contents::after`あたりに置くのでも良いかもしれません。


まだ遅くはありません。
運営さんご検討よろしくお願いします。
GoogleChromeで"delete"が"戻る"機能のショートカットじゃなくなった件

## 問題の概要
お気付きの人も多い問題だと思います。
chromeがアップデートの際、deleteキーのショートカット"戻る"を排除しました。新しいショートカットは、(macだと)command + <-。
調べたところ、どうやら2016年夏、version52と共にこの仕様変更が行われたらしいです。
自分はこの問題に、たぶん、この変更から1ヶ月ほどで気付きました。何故なら片手（左手）ショートカッターだから。
後述しますが、この仕様変更は本気でUXをわかってないのでは！？と思える。

## まずは解決方法
で、とりあえず解決法の紹介です。
極めて簡単で、以下のエクステンションを追加して有効にするだけ。
[Go back with back space](https://chrome.google.com/webstore/detail/go-back-with-backspace/eekailopagacbcdloonjhbiecobagjci?hl=ja)
上記はGoogle公式が開発・管理している拡張機能のようです。

ちなみに、公式よりもいち早くこの問題に対処された神デベロッパーさんのものも紹介。
[Back to Backspace(GitHub)](https://github.com/j-delaney/back-to-backspace)
[Back to Backspace(Chromeウェブストア)](https://chrome.google.com/webstore/detail/back-to-backspace/cldokedgmomhbifmiiogjjkgffhcbaec?hl=ja)

## この問題に対しての私見
（この項目については、まとまり次第再掲したいと思います）
PHP の (multi)cURL でレスポンスを受け取る時にリクエストデータの内容を1件ずつ取得する方法

## この記事で何が分かるか

cURL を使って非同期で送信を行った後、「結果のレスポンスコードといっしょに、送ったデータを1件ずつデータベースに保存する」という案件がありました。


cURL のレスポンスには、ステータスコードや実行にかかった時間などが入っていますが、送信したデータまでは返ってきません。

この記事は、レスポンスの返却時に、送信データの情報を記録するための方法を解説しています。

なお、私は cURL マスターではありませんし、この記事の要点を解説するため、細かな設定は省いていますので、その点はご容赦下さい。
内容の意図が伝わらなければ、どうぞご指摘下さい。


## 問題は cURL の特殊な書き方？
curl_getinfo　を使えば、 レスポンスとして http_code(ステータスコード)を取得することができます。
が、マルチに（非同期で）処理を実行する場合は、先に送信する内容を設定し（ハンドラを設定し）、設定したハンドラを送信する分だけ追加し終わったあと、まとめて送信します。

何が言いたいのかというと、**「1件ずつ実行してその結果を得る」**、という使い方ができないということです。
非同期で一斉送信するから当然かも知れません。
が、「どんなパラメータを実行して、その結果がどうだったか」という結果が分かりにくいことは確かです。
送信前のデータをURL込みで別テーブルにひかえておき、あとでURLで結合して参照する…？ とんでもないですね。

レスポンスで送信先のURLは分かりますが、POSTした内容は分かりません。
そこで調査した結果、**ハンドラをキーとして使うことができる**ことを発見しました。

まずは、マルチ cURL の使い方から見ていきます。

### ① cURL ハンドルをマルチで作成（追加）する(curl_multi_add_handle)
作成したハンドルを後でまとめて（非同期で）使うため、配列に入れる前処理です。
ハンドルを作成して（たくわえて）、一気になげるというのが、非同期で通信する cURL の手順です。
この時、実行後の後処理でハンドルを1件ずつ閉じる必要があるため、作成したハンドルはまた別の配列に入れていきます。

```php
// マルチハンドラの初期化
$mh = curl_multi_init();
$timeout = 10;

// $json にはJSON文字列にしたデータが入っています

foreach($urlList as $url) {
 
    $ch = curl_init();
               
    curl_setopt($ch, CURLOPT_URL, $url);                // 送信するURL
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);     // 返り値を文字列で返す
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
    curl_setopt($ch, CURLOPT_POST, 1);        
       
    $chList[] = $ch; // ハンドルを後処理のため配列に入れておく
   
    // マルチ cURL ハンドルを作成
    curl_multi_add_handle($mh,$ch); 
}
```

### ② 実行(curl_multi_exec)

### ③ 結果を取得 もしくはハンドルを閉じていきます（ハンドルの配列を回して実行する）

```php
foreach($chList as $ch) {
    $resInfo = curl_getinfo($ch); // レスポンスを取得
    $res = $resInfo["http_code"] === 200 ? true : false;
    if($res === false){
        $res["url"] = $resInfo["url"];
    }
	curl_multi_remove_handle($mh, $ch);
}
```

問題は、③でレスポンスが返ってくるものの、送信に使った内容までは取得できないことです。



## 対応策

cURl のハンドラ（上記のソースでは$ch） はリソース型で、var_dump すると「Resource ID#3」といった一意の情報が取得できます。

そして、リソース型を int にすると、数値が取得できます。（上記だと「3」）。
ここで、勘のよい方はもう気づきましたね…。

ハンドラを一意のキーとして使えるなら、①の前処理と③の後処理で、$ch のハンドラを int で型変換すれば、
きちんとそのハンドラの情報として、情報の出し入れができるということです。

①　の最終行に以下を追加します。

```php
$result[(string)$ch] = $json;
```

③ はステータスコードを取得したあと、以下のようにして情報を取得しましょう。

```php
$res["send_data"] = $result[(string)$ch];
```

以上の方法をとれば、送信したデータに限らず、任意のデータをレスポンスとして受け取ることが可能です。


## 最後に
「どうしたらハンドラのデータとして見分けられるか」、と考えて、ハンドラそのものを配列の添え字として入れてみる、という乱暴なことをしたところ、「添え字が int じゃないよ」、とのエラーが返りました。
そして、エラーは返ったものの、データは正しく取得できたのです。

そこで、ハンドラを int に型変換すると、数値が取得でき、想定の動きになりました。
この数値はなんだ、と調べたところ、リソース型の番号であることが分かりました。なるほど、それなら一意の番号なので、キーになる、という結論です。

最初からリソース型の性質を熟知していれば、スムーズにこの結論に至ったかと思いますが、まさに、エラーに教えられました。

cURL は libcurl をベースにされているせいか、正直 PHP とは思えないほどややこしい使い方になっていると思います。
が、非同期でも通信できるので、便利なことに変わりはありません。
今回のリソース番号の気づきは、他の機会でも使うことができそうです。

なお、cURL にもっと上手な使い方があるのは分かっていますので、繰り返しますが、その点はご容赦下さい。

もっとシンプルにリクエストの値をレスポンス時に渡せる方法がありましたらぜひコメントをお願いいたします。
Chef-solo構築からapacheをインストール on Amazon Linux

##前提
- Amazon Linux AMI(ami-b953f2da)
- セキュリティグループのインバウンド:SSH22番、HTTP80番開いてること
- Chef-solo version :12.16.42

##Chef-soloのインストール流れ
まずインスタンスのパブリックIPにSSHで接続します。

###Chefのインストール
```
$ sudo su -
# curl -L http://www.opscode.com/chef/install.sh | sudo bash
(もしくは# gem install chef)
```

###リポジトリの作成
gitで作成するがgitが使えないのでgitインストール

```
# yum -y install git
# git clone git://github.com/opscode/chef-repo.git
```

###クックブック作成with knife
まずknifeの初期設定
いろいろ聞かれるけど全てデフォルトでEnter押せばおｋ

```
# knife configure
```

クックブック作成

```
# cd chef-repo
# knife cookbook create hello -o cookbooks
```

###default.rb(Rubyファイル)を編集
クックブックを作成したときにデフォルトでRubyファイルが
出来るのでそこを編集します。(まずはHello!!から)

```
# vi cookbooks/hello/recipes/default.rb
(ディレクトリそのまま)

#
# Cookbook Name:: hello
# Recipe:: default
#
# Copyright 2016, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
log "Hello!!"
```

###JSONファイルを作成する
Chef-soloを実行するときのレシピを書くJSONファイルをchef-repo直下に作成します。

```
# touch localhost.json
# vi localhost.json (JSONの中身に以下を記述します)

{
     "run_list" : [
         "recipe[hello]"
    ]
}
```

###PATHを通すRubyファイルを作成する
solo.rbの中身はhelloがあるディレクトリまでのPATHを設定します

```
# touch solo.rb
# vi solo.rb

file_cache_path "/tmp/chef-solo"
cookbook_path ["/root/chef-repo/cookbooks"]
```

##Chef-solo実行
以下のコマンドでChefの実行をします。
コマンドは環境に合わせてください(solo.rbとlocalhost.jsonがある場所による)

```
(ディレクトリはchef-repoのまま)
# chef-solo -c solo.rb -j ./localhost.json

Starting Chef Client, version 12.16.42
resolving cookbooks for run list: ["hello"]
Synchronizing Cookbooks:
  - hello (0.1.0)
Installing Cookbook Gems:
Compiling Cookbooks...
Converging 1 resources
Recipe: hello::default
  * log[Hello!!] action write


Running handlers:
Running handlers complete
Chef Client finished, 1/1 resources updated in 01 seconds
```
成功です。

##apacheのインストール
それじゃapacheをインストールしてみます。

###Rubyファイルの編集
先ほどHello!!と書いたファイル(default.rb)を開いて以下を追記します。

```
(ディレクトリはrecipes)
# vi default.rb

#
# Cookbook Name:: hello
# Recipe:: default
#
# Copyright 2016, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
log "Hello, Chef!"

package "httpd" do
  action :install
end
```

###実行
```
# cd chef-repo
# chef-solo -c solo.rb -j ./localhost.json

Starting Chef Client, version 12.16.42
resolving cookbooks for run list: ["hello"]
Synchronizing Cookbooks:
  - hello (0.1.0)
Installing Cookbook Gems:
Compiling Cookbooks...
Converging 2 resources
Recipe: hello::default
  * log[Hello, Chef!] action write

  * yum_package[httpd] action install
    - install version 2.2.31-1.8.amzn1 of package httpd

Running handlers:
Running handlers complete
Chef Client finished, 2/2 resources updated in 03 seconds
```
できた！

###apacheがインストールされてるか確認

```
(ディレクトリはchef-repo)
# httpd -v
Server version: Apache/2.2.31 (Unix)
Server built:   Jul 19 2016 00:11:31
```

###apache起動確認
apacheを起動させる

```
(ディレクトリはchef-repoのまま)
# service httpd start
Starting httpd:                                            [  OK  ]
```
インスタンスのパブリックIPでブラウザに接続して
apacheのテストページが表示されれば成功です。

##まとめ
Linuxでは簡単に出来る・・・(Windows Serverで成功したことないので)
djangoのQuerySetでorder_byした時、Noneを最後に持っていきたい

##経緯
一度DjangoQuerySet内で取得した要素をしっかりオーダーできたら便利だ。
だが、テーブルのpriorityカラムはNULL値も受け入れていて、普通にorder_by('priority')とかやってしまうと、NULLのものが一番先頭に来てしまう。一方で、仕様ではpriority=Noneは劣後ということになっている。
したがって、今までは、DQSで取得した後でsorted+lambdaを使って整列していた。

これを、やはりDQSで一気に実現してしまいたい…。

##解決法
DQSでextraを使う。
extraのselectを使うと、selectの結果を新しく命名した内容であたり外れ判定してくれる

```
# example
target_features = list(MFeature.objects.using('front')
                                               .select_related()
                                               .filter(is_active=Common.IS_ACTIVE_ON,
                                                       end_dt__gte=now,
                                                       start_dt__lte=now,
                                                       mfeaturetalent__is_active=Common.IS_ACTIVE_ON,
                                                       mfeaturetalent__talent__is_active=Common.IS_ACTIVE_ON)
                                               .values('id', 'title', 'detail', 'link_url', 'priority', 'start_dt',
                                                       'mfeaturetalent__title', 'mfeaturetalent__footnote',
                                                       'mfeaturetalent__link_url', 'mfeaturetalent__image_url',
                                                       'mfeaturetalent__talent__id', 'mfeaturetalent__talent__name',
                                                       'mfeaturetalent__talent__photo_ext', 'mfeaturetalent__rank')
                                               .extra(select={'priority_is_null': "m_feature.priority IS NULL"})
                                               .order_by('priority_is_null', 'priority', '-start_dt', 'mfeaturetalent__rank'))
```
ここではextraでpriority_is_nullという定義名に``m_feature.priority IS NULL``の判定が入る。そこで、それをorder_byの中に渡してやると、priorityのNULL判定が機能する。
###注意点
extra(select={})の中で、``m_feature.priority``とせずに、``priority``とだけにすると、``Django column 'priority' in order clause is ambiguous``というmysqlの警告が出る。
これは、上記のDQLでm_feature_talentをinner joinしているため、どのテーブルのpriorityかが明確じゃないことから起こるエラー。

##参考URL
[Django Order By Date, but have “None” at end?](http://stackoverflow.com/questions/7749216/django-order-by-date-but-have-none-at-end)
[QuerySet API リファレンス#extra](http://docs.djangoproject.jp/en/latest/ref/models/querysets.html#extra)
CircleCIで静的サイトのS3向け自動デプロイ


## 手順

1. ビルドタスクなど調整
2. S3とCircle CIの環境を整える
3. circle.yml を作成

## ビルドタスクなどを調整

gulpを叩きたいところだが、gulpコマンドのパスが…とか面倒なので、
npm run script で統一するほうが楽そう。

テスト実行時に `npm run test` が実行されるので、ココもエラーにならない形で修正を入れておく必要がある。

````:package.json
  ....
  "scripts": {
    "test": "echo \"PASSED: no test required\" && exit 0",
    "build": "gulp build"
  },
  ...
````

## S3環境のセットアップ

S3でバゲットを作成して、右のメニューから「静的ウェブサイトホスティング」を有効にする。

「アクセス許可」でバゲットポリシーの編集を選択し、以下のようなポリシーを設定。

````
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "PublicReadGetObject",
			"Effect": "Allow",
			"Principal": "*",
			"Action": [
				"s3:GetObject"
			],
			"Resource": [
				"arn:aws:s3:::mybucket-site/*"
			]
		}
	]
}
````

`mybucket-site`の記述は適宜自分で作成したバゲット名と置き換える。

## CircleCI環境のセットアップ

リポジトリを登録し、ProjectSetting より「AWS Permission」を選択

IAM で作成したユーザのIDとキーを登録しておく。 


## circle.ymlを作成

以下の様な形で node 環境向けの circle.yml を作成する。

````:circle.yml
machine:
  node:
    version: 6.1.0
dependencies:
  override:
    - npm install
    - npm run build
deployment:
  production:
    branch: master
    commands:
      - aws s3 sync public s3://mybucket-site/ --delete
````


利用可能なnode.jsのバージョンなどは以下を参考に

https://circleci.com/docs/build-image-trusty/#nodejs

## トラブルシュート

sassまわりで以下の様なエラーが出てコケるケースがある。

````
> webhooker@1.0.0 build /home/ubuntu/mysite
> gulp build

/home/ubuntu/mysite/node_modules/gulp-sass/node_modules/node-sass/lib/binding.js:15
      throw new Error(errors.missingBinary());
      ^

Error: Missing binding /home/ubuntu/mysite/node_modules/gulp-sass/node_modules/node-sass/vendor/linux-x64-48/binding.node
Node Sass could not find a binding for your current environment: Linux 64-bit with Node.js 6.x

Found bindings for the following environments:
  - Linux 64-bit with Node.js 4.x

````

https://github.com/sass/node-sass/issues/1585

npm cache clean など色々な対応がつぶやかれているが、

Circle CI の上の方にある、「Rebuild」のメニューから「Rebuild without cache」を選択すれば、以降のビルドはすんなり通るようになった。
#9 RubyWarrior Level9

RubyWarrior Level9の攻略
初級編は今回で最後となります。

#概要
最後のダンジョンは、「持てるスキルを全て使ってクリアしろ」とのこと。
全ての要素を余すことなく使わないと解けなさそうです。

#スクリプト
```
class Player
  def initialize()
    @health = 20
  end
  
  def play_turn(warrior)
    if warrior.feel.empty?
      if warrior.look.any? { |space| space.enemy? }
        if @health > warrior.health
          warrior.walk!
        else
          if warrior.health < 5
            warrior.rest!
          else
            warrior.shoot!
          end
        end
        
      else
        if @health > warrior.health
          warrior.walk!
        else
          if warrior.health < 15
            warrior.rest!
          else
            if warrior.feel.wall?
              warrior.pivot!
            else
              warrior.walk!
            end
          end
        end
      end
        
    else
      if warrior.feel.captive?
        warrior.rescue!
      else
        if warrior.feel.wall?
          warrior.pivot!
        else
          warrior.attack!
        end
      end
    end
    @health = warrior.health
  end
end
```

動くには動くのですが、また読みにくくなってしまいました...
中級以降はリーダブルコードを書くという課題を持ちながらやっていきます...

#解説
最後のダンジョンは全てのスキルを使わないと先に進めないようになっているので、Level8までやってこれた人ならスクリプトは問題なく書けると思います。
SQLServerをLinux Dockerで動かしてみる


# 概要

[Announcing SQL Server on Linux public preview, first preview of next release of SQL Server](https://blogs.technet.microsoft.com/dataplatforminsider/2016/11/16/announcing-sql-server-on-linux-public-preview-first-preview-of-next-release-of-sql-server/)

Linux版のパブリックプレビュー版が出たとのこと。
それにあわせてか、Dockerの公式イメージもDockerHubに公開されていたため、さっそく試してみましたよっと。

2016年11月17日現在の状況で書いています。

# 参照するべきサイト

Dockerで動かす際に、以下のサイトが参考になりました。

[Run the SQL Server Docker image on Linux, Mac, or Windows](https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup-docker)

# 実践

Dockerが動く環境は既にあるものとして進めます。
実行ユーザがdockerグループに入っていて、sudo が必要でない環境もあるかと思います。

## pull

まずは、pullしましょう。

```bash
 sudo docker pull microsoft/mssql-server-linux
```

## SQLServer起動

こいつ、動くぞ！と感動する前に、落ち着いてdocker runしましょう。

```bash
docker run -e 'ACCEPT_EULA=Y' \ 
           -e 'SA_PASSWORD=P@55w0rd' \
           -p 1433:1433 \
           -d \
           -v $(pwd):/var/opt/mssql/ \
           --name mssql \
           microsoft/mssql-server-linux
```

本家の記事にあるコマンドラインをそのままコピーすると、変な文字列が入っている場合があるので、貼り付けたあとは注意深く確認してください。

環境変数として、SQL認証のSAユーザに対するパスワードを設定していますが、パスワードは複雑である必要があります。

記事の下の方にこんなコメントがついてます。

> It's also worth noting that the docker image requires passwords to match the SQL Server password validation rules. If they don't, the docker image will stop after around 5 seconds with no warning. `P@55w0rd` is a great password, for what it's worth.

単純なパスワード文字列だと、バリデーションにひっかかって、5秒後ぐらいに警告もなく終了するよ、と。（たぶん）
なので、ここでは、Peschkajさんの助言に従って、P@55w0rdとしてみました。

-vオプションでデータやログを永続化するようにしておきます。

## 確認

このDockerイメージには、sqlcmdコマンドラインツールが入っていないようなので、SQLServer Management Studioから接続し、起動を確認します。
![MSSQL Management Studio0.png](https://qiita-image-store.s3.amazonaws.com/0/111676/5fbb9ea8-ac54-f929-b1ad-5b97d8f3ba0a.png)

### サーバのプロパティ画面

![MSSQL Management Studio.png](https://qiita-image-store.s3.amazonaws.com/0/111676/b1797c98-b538-a89e-9785-a6c0ae888d29.png)

### 接続の詳細画面

![MSSQL Management Studio2.png](https://qiita-image-store.s3.amazonaws.com/0/111676/bbf39b47-a09f-e168-81d8-32cc1cba80ec.png)


# 終わりに

いろんなテストデータを作ったり消したり、ある時点のデータで環境を構築したいといったことが、とても気軽にできる点が、とても良ろしい。

既定では、言語がEnglish(United States)、照合順序はSQL_Latin1_General_CP1_CI_ASとなっています。
言語が日本語、Japanese_CI_ASとなっているようなところから、データのインポート/エクスポートでデータをコピーするようなときは、先にデータベースを**言語、照合順序を指定して**、作成すると良いようです。

何も考えずにインポートしたら、日本語を含むnvarcharの列が化けて入ったりしました。
mitmproxy の証明書が切れたら

文字通り Man in the middleなので、偽証明書が命ですが、最初の起動から 2年ぐらいすると偽証明書が切れます。

![image](https://qiita-image-store.s3.amazonaws.com/0/28133/ac6fb6c7-020c-4a2d-58ca-ff85de2f3b14.png)

ということで、正しいやり方はよくわからないけど `rm ~/.mitmproxy/*` で証明書をががっとけして再起動したら新しいのが発行されました。で、ブラウザとかにインストールし直して okです。

本当は [ドキュメント](http://docs.mitmproxy.org/en/stable/certinstall.html#ca-and-cert-files) みて必要なファイルだけを消したほうがいい気がするけど、まあ、なんとかなったよってことで。
GroovyのmainメソッドをGroovyスクリプトから呼ぶ

# TL;DR

```groovy:script.groovy
@Grab("必要なものをごにょごにょ")

import package_name.class_name

package_name.class_name.main(args)
```

よく考えれば至極当然な話だった。思いつかなくて悔しい。

# 例：main側

```groovy:SomeClass.groovy
package some

class SomeClass {
  public static void main(String[] args) {
    /** 処理 */
  }

  static AnyType otherMethod() {
    /** 処理 */
  }
}
```

# 例：呼び出しスクリプト

```groovy:script.groovy
@Grab("必要なものをごにょごにょ")

import some.SomeClass

some.SomeClass.main(args)
```

mainメソッドをフルのネームスペースで呼び出すのがポイント(だと思う)。

# 参考
http://stackoverflow.com/questions/7567378/access-a-java-class-from-within-groovy
Xcode8+iOS10開発でNSLogの出力文字数が制限される問題

私はAPIからの戻り値などをXcodeのデバッグエリアに全文出力して確認していたんですが、Xcode8になってから1,000byte程度しか文字が出力されないようになって困っていました。

Xcode依存の問題かと思い色々と調べていましたが、原因はNSLogにあったようです。
（Xcode8 + Debug Area や Xcode8 + All Output lengthなどでは全くみつからなかった）


## 対策
printfを使う

■ iOS10 NSLog is limited to 1024 chars strings
http://stackoverflow.com/questions/39538320/ios10-nslog-is-limited-to-1024-chars-strings/

こちらで紹介されているように、以下のdefineでNSLogを置き換えるのが便利です。

```objc
#define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
```
ASP.NET Core(Dapper)でMySQLを使う


[以前](http://qiita.com/zaburo/items/a167c9ad94fcea625c56)、Entiry FrameworkでMySQLを利用する方法を書きましたが、仕事でDapperを使うかもしれないのメモ。使う理由は高速化。DapperだとADO.NETを利用するのとほぼかわらないとか。

##環境

* OS:El Capitan(Sierraでも問題なし）
* MySQL 5.5(MAMP付属のもの）
* .NET Coreは1.0（[ここからダウンロードしてインストール](https://www.microsoft.com/net/core#macos)）
* yo（テンプレート生成）

環境構築については私の記事もありますが、少々古いので[ここ](http://gooner.hateblo.jp/entry/2016/10/11/044948)が参考になるかと。

>なお、.NET Coreでは新たに提供されたdotnet newコマンドで基本的なテンプレートを作成可能です。詳しくは[こちら](http://qiita.com/mytk-k/items/63a1a381d47db2ff5f67)のサイトが参考になります。

##下準備

###MySQLにテーブルを作成する

今回はサンプルなので簡単なテーブルにします。なお、Entity Frameworkを利用するにはテーブルに主キーが必要なので定義しておきましょう。

membersというテーブルを作り、idとnameとemailのカラムを作ります。
サンプルデータもインサートしておきます。

```sql
#CREATE TABLE
create table members(
	id int primary key auto_increment,
	name varchar(32),
	email varchar(64)
);

#SAMPLE INSERT
insert into members(name,email) values('hoge','hoge@hoge.com');
insert into members(name,email) values('foo','foo@foo.com');
```

###yoでConsole Applicationテンプレートを生成

yo -> ASP.NET -> Console Applicationと選択し、テンプレートを生成します。
初期状態で下記３つのファイルが出来ているはずです。

>dotnet new コマンドでも生成可能です。

* .gitignore
* Program.cs
* project.json

必要なのは下記２つだけ。

###project.jsonの編集

project.jsonのdependenciesにPomeloを追加し、restoreします。
>以下、dependenciesだけ抜粋。

```diff
  "dependencies": {
    "Microsoft.NETCore.App": {
      "type": "platform",
      "version": "1.0.1"
    },
+    "Dapper": "1.50.2",
+   "MySqlConnector": "0.*"
  },
```
package.jsonを編集したら忘れずにrestoreし、必要なファイルを取得します。

```bash
dotnet restore
```

###Program.csを編集

今回はMemberクラスを作成しマップしましたが、マップしなくても値は取得できるようです。

```csharp
using System;
using Dapper;
using MySql.Data.MySqlClient;

namespace myapp2
{
    public class Program
    {

        //model
        public class Member
        {
            public int id {get; set;}
            public string name {get; set;}
            public string email {get; set;}
        }

        //Main
        public static void Main(string[] args)
        {
            using(var connection = new MySqlConnection("server=localhost;database=testdb;uid=root;pwd=root"))
            {
                connection.Open();

                //dapper
                var members = connection.Query<Member>("select * from members");

                foreach(var member in members)
                {
                    Console.WriteLine(member.name + " " + member.email);
                }
            }
        }
    }
}
```

###実行する

コーディングが完了したら実行します。

```bash
dotnet run

hoge hoge@hoge.com
foo foo@foo.com
```

うまくいったようです。
plotly: ggplotをanimationする

# ggplotを使ったアニメーションがplotlyで紹介されていました。

[こちらの記事](https://cpsievert.github.io/plotly_book/key-frame-animations.html)をみて、animationするplotをかけるようなので、書いてみました。開発中みたいなので、今後内容は代わるかもしれません。

先に、devtoolsやplotlyのinstallが必要なのでお済みでない方は、
> https://cpsievert.github.io/plotly_book/installation.html  

こちらをみてinstallしておいてください


```{R:plotly_animation}
#けっこう時間がかかる
devtools::install_github("ropensci/plotly#554")　
install.packages("gapminder")

#libraryとデータの読み込み
library(plotly)
data(gapminder, package = "gapminder")

#作図オブジェクト作成
gg <- ggplot(gapminder, aes(gdpPercap, lifeExp)) +
  geom_point(aes(size = pop, color = continent, frame = year, ids = country)) +
  scale_x_log10()

#警告:  Ignoring unknown aesthetics: frame, ids
#☝️warningがでてるよお兄さん

#作図
ggplotly(gg)
```

![Unknown.png](https://qiita-image-store.s3.amazonaws.com/0/57282/355dbadc-780a-7d62-6eed-f1e841466359.png)

スクリーンショットで恐縮ですがちゃんと動きました!! presentationに使えそうですね、自分の時系列データを動かしてみたいです。
Amazon LinuxにAjentiを入れる

入れたかっただけ。

AWSで使うならAjentiのAMIがあるので、それ使ったほうが楽。
http://amiage.com/apps/ajenti/

##使ったAMI
Amazon Linux AMI 2016.09.0 (HVM), SSD Volume Type - ami-0c11b26d

###インスタンス作成時の注意
セキュリティーグループの設定で、以下の内容を設定しておきましょう。

|タイプ|プロトコル|ポート範囲|送信元|
|:--|:--|:--|:--|
|カスタマイズTCPルール|TCP|8000|任意の場所：{自分のIP}|

8000を許可しておかないと、管理画面にアクセス出来ないのでご注意ください。

##Ajentiのインストール
CentOS系のインストール方法は[公式にも載ってる](http://support.ajenti.org/topics/1122-installing-on-centosrhel/)んですが、Amazon Linuxではこのやり方だけではエラーが出て起動しないので諸々調整します。

###パッケージのインストール
パッケージが不足している様子なので、インストールします。
ついでにyumとpipも最新版にしときます。

```
# yum update -y
# pip install --upgrade pip
# hash -r
# yum install gcc openssl-devel python-devel  openldap-devel -y
# pip install ajenti

```

##Ajentiのインストール
改めてAjentiインストールします。

```
# wget http://repo.ajenti.org/ajenti-repo-1.0-1.noarch.rpm 
# rpm -i ajenti-repo-1.0-1.noarch.rpm
# yum install ajenti -y
# service ajenti restart
```

##アクセスする
https://{YOUR_PUBLIC_IP}:8000
にアクセスして、以下が出ればOKです。お疲れ様でした。
ID:root
Pass:admin
でログインできますので、パスワードなどは変更しておきましょう。

![スクリーンショット 2016-11-17 13.44.16.png](https://qiita-image-store.s3.amazonaws.com/0/23936/6ee5c93f-5f4d-b85c-727a-0786f8a5a5e3.png "スクリーンショット 2016-11-17 13.44.16.png")


##この後試したいこと
- [Mautic](http://amiage.com/ja/apps/mautic-powered-by-amiage/)とか[WordPress](https://aws.amazon.com/marketplace/pp/B00LWHVJH8)とかの動いているサーバにインストールして、cronとかサーバ設定情報とかの管理を試したい。
- エージェントとか入れて他のサーバを管理する・・・みたいなことができないか試したい
- とりあえずもうちょっと使ってみたい
CakePHPのユーザー定義関数の呼び出し(コントローラ内の共通定数の宣言をなくす)

### 背景
コントローラーの処理は出来る限りシンプル・簡潔にしたかったものの、一つのコントローラー内の複数アクション内に同じ定数を宣言してsetしていたので解決したかった。

### やったこと
- /app/Config/　内に「const.php」を作成  
※ ファイル名はconstじゃなくて何でもOK
- 定義ファイルには以下のように記述

```/app/Config/const.php
<?php
//ユーザ定義定数
define("FOOBAR","テスト");
 
//配列
$config['fuga'] = ["a","b","c"];
 
//連想配列
$config['hoge'] = ["A"=>"あ", "B"=>"い", "C"=>"う",];
```
- /app/Config/bootstrap.php　に、次の記述を追加

```/app/Config/bootstrap.php
Configure::load("const");
```
- viewで以下のように記述し出力

```/app/View/Hoges/index.ctp
<?php
echo FOOBAR;  //テスト と表示される
 
$fuga = Configure::read("fuga");
echo $fuga[0];  //a と表示される
 
$hoge = Configure::read("hoge");
echo $hoge["A"];  //あ と表示される
```

### 感想
今回自分は、複数のマスタテーブルを作成してアソシエーションをすればすむものをこのように対処したけど、const.phpにまとめて定数宣言できるから、マスタデータとしても扱えるし使い勝手良いなと感じました。
view側で必要最低限の定数だけ読み込んで出力できるけど、View毎に定数読み込みを共通でさせてしまえば色々楽かもしれない。
コントローラーすっきりしてよかったー。
技術英語 > 中央に置く > 左右の / 上下の

C++ Builderで複数のTImageの位置調整を行う関数を実装中。

以下の関数名をどうするか

- 左右の中央に置く
- 上下の中央に置く

### delphi IDE

DelphiのIDEのメニューは以下のような表記をしている。

http://www.functionx.com/delphi/Lesson05.htm
> Horizontal > Centers
> Vertical > Centers

### Halfway across / Halfway down

別途、以下のような表記も見つけた。

http://www.cuiwenyuan.com/shanghai/post/web-english-salon-class-minutes-how-to-express-position.html
> B:At the Top,Halfway across
> F:Halfway down right

Halfway acrossで左右方向の中央。
Halfway downで上下方向の中央。

関数名として使った場合にすぐ意味が分かるかはわからない。

HorizontalCenters, VerticalCentersの方が意味がすぐに入る気がする。
[GAS] Google Apps Script でTwitter複数アカウントを使い分ける

# 概要
こちらの記事（[［GAS］Google Apps Scriptでツイートを投稿する](http://yoshiyuki-hirano.hatenablog.jp/entry/2015/10/13/010317)）で公開されている
Twitterライブラリを使う時、複数アカウントを使い分ける方法について情報共有します。
このライブラリはたいへん便利なのですが、別のスクリプトやプロジェクトを作成しても使用されるアカウントが共通で一つになってしまうという弱点があります。
ちょっと書き加えるだけで、複数のアカウントを使い分けることができるようになります。
# 実装
※上記の記事を参考にしてGASにライブラリを組み込んである前提です。
TwitterWebService: `MFE2ytR_vQqYfZ9VodecRE0qO0XQ_ydfb`
OAuth1: `1CXDCY5sqT9ph64fFwSzVtXnbjpSfWdRymafDrtIZ7Z_hwysTY7IIhi7s`

```JavaScript:コード.gs
'use strict';

// OAuth1認証用インスタンス
var twitter = TwitterWebService.getInstance(
  '***CONSUMER_KEY***',
  '***CONSUMER_SECRET***'
);

//OAuth1ライブラリを導入したうえで、getServiceを上書き
twitter.getService = function() {
  return OAuth1.createService('Twitter2')
    .setAccessTokenUrl('https://api.twitter.com/oauth/access_token')
    .setRequestTokenUrl('https://api.twitter.com/oauth/request_token')
    .setAuthorizationUrl('https://api.twitter.com/oauth/authorize')
    .setConsumerKey(twitter.consumer_key)
    .setConsumerSecret(twitter.consumer_secret)
    .setCallbackFunction('authCallback')
    .setPropertyStore(PropertiesService.getUserProperties())
}



// 認証を行う（必須）
function authorize() {
  twitter.authorize();
}

// 認証をリセット
function reset() {
  twitter.reset();
}

// 認証後のコールバック（必須）
function authCallback(request) {
  return twitter.authCallback(request);
}

function tweetTest(){
 postUpdateStatus('test'); 
}


```

重要なのはこの部分です。
`return OAuth1.createService('Twitter2')`
OAuthライブラリを読むと、ここで引数として与えるサービス名ごとに認証情報を保管するようになっています。この保管は、Googleアカウント単位で行われるため、スクリプトやプロジェクトを変えてもアカウント認証情報が共通になってしまうのです。
[TwitterWebService.gs](https://gist.github.com/YoshiyukiHirano/442bfe2dacbce7d7f5e7#file-twitterwebservice-gs)の中でこの引数が'Twitter'として固定文言で与えられているため、その部分だけを上書きしてサービスを初期化すれば、複数のアカウントを利用できるようになります。
なお、実際に使う際には**Twitter_taro**、**Twitter_jiro**のように、アカウント名をサービス名に含めてしまうと、管理しやすいのではないかと思います。
GithubのREADME.mdでセクションにリンクを貼る方法

# やりたいこと
同一ページ内の要素へのリンクを貼りたい。

```html
<div id="hoge">Jump to here</div>

<a href="#hoge">Jump</a>
```

# 解決策①
- divタグを書いてidつけちゃう。
- 僕は以前までこれやってました。

```
[Jump to Section1](#section1)

<div id="section1">
# Section1
    - hogehogehoge...
</div>
```

[結果]
> 
[Jump to Section1](#section1)
<div id="section1">
# Section1
    - hogehogehoge...
</div>



# 解決策②
- 自動で付けられるidを使う。
- `# Hoge` のようにセクションを書くと、セクション名がすべて小文字になった`#hoge`というidが自動で付与されるらしい。
- `# Hoge Fuga`のようなセクションの場合には区切りが`-`に変換されて`#hoge-fuga`というidが自動で付与されるらしい。

```
[Jump to Section2](#section2)
# Section2
    - fugafugafuga...
```

[結果]
> 
[Jump to Section2](#section2)
# Section2
    - fugafugafuga...


# 参考資料
- たまたまのぞいた他人のREADME.md
- これってどこかのReferenceに書いてありますか？
JavaScript でクリップボードに文字列をコピーさせる

[`document.execCommand('copy')`](https://developer.mozilla.org/ja/docs/Web/API/Document/execCommand) を使う。

# 例

雑にこんな感じ

```javascript
// elementはinput要素とか
function copy(element){

  // コピーさせたいテキストの選択
  element.focus();
  element.setSelectionRange(0, 9999);

  // クリップボードにコピー
  document.execCommand('copy');

  // コピーさせたいテキストの選択を解除
  element.blur();
}
```

`element.focus()`のとこ、特にスマホだと一瞬ソフトウェアキーボードが出てきてダサいです。多分もっといい方法がある

MDNの該当ページにもブラウザのサポート状況が書いてあるけど、スマホの対応は雑にこんな感じ。新しいブラウザだとだいたい使えるっぽい。

- iOS10 Safari 可
- iOS9 Safari 不可
- Android 標準ブラウザ 不可
- Android Chrome 可
- PhantomJS 不可

そのブラウザがコマンドを実行可能かは [`document.queryCommandSupported`](https://developer.mozilla.org/ja/docs/Web/API/document/queryCommandSupported) で判定可能。

```javascript
if (document.queryCommandSupported('copy')) {
  // コピーボタンを描画する処理とか
}
```

# 参考ページ

- https://developer.mozilla.org/ja/docs/Web/API/Document/execCommand
- https://developer.mozilla.org/ja/docs/Web/API/document/queryCommandSupported
- http://caniuse.com/#feat=document-execcommand
【Swift3.0】 CSVから読み込んで、配列にする

```Swift:Swift3.0
func csvToArray () {
   if let csvPath = Bundle.main.path(forResource: "ファイル名を記入", ofType: "csv") {
      do {
         let csvStr = try String(contentsOfFile:csvPath, encoding:String.Encoding.utf8)
         let csvArr = csvStr.components(separatedBy: .newlines)
         print(csvArr)
      } catch let error as NSError {
         print(error.localizedDescription)
      }
   }
}
```

改行を基に分割して配列にしています。

追記：ご指摘ありがとうございます
Slack公式アプリで直接DM画面が開けるように：URLスキームで起動するまでの手順

###2018年 追記
[リンクから直接Slackアプリのchannelを開く方法 - Qiita](https://qiita.com/yoshi-taka/items/9b681208b4ff3be279b7)
というより簡単な方法が追加されています。

---

2016年8月からSlackがURLスキームに対応しました。
`slack://open`
とすることで、Slackのアプリケーションを直接開けます。

しかし、各ユーザー、Channelへのリンクについては一工夫が必要です。
[解説ドキュメント](https://api.slack.com/docs/deep-linking)によれば、
例えばダイレクトメッセージの画面を開くには、
`slack://user?team={TEAM_ID}&id={USER_ID}`
と名前ではなく内部idを利用する必要があるためです。
このidはSlackのAPIを使わない限り取得は困難なため、
手順を解説します。

以下、ダイレクトメッセージの場合です。

## 1. テスト用API Tokenの取得
すでにSlackのAPI Tokenを取得していればこの手順は不要です。

SlackのAPIを実行できるよう、テスト用のtokenを取得します。
[このページ](https://api.slack.com/docs/oauth-test-tokens)から生成できます。
このtokenはあくまでSlack APIのテスト向けのため、botなどの本番運用に使いまわすことは避けたほうがよいです。

## 2. APIでUSER_IDとTEAM_IDを取得

### 自分自身の場合
以下のURLから取得できます
`https://slack.com/api/auth.test?token=your_token`

ブラウザ上でSlackにログインしている場合は、
[auth.test APIのテスト画面](https://api.slack.com/methods/auth.test/test)からも取得できます。

### 他人の場合

DM送受信済みの場合、`yourteam/direct-messages`のDMアーカイブからidを取得することができます。

APIを利用するなら以下のURLから全ユーザーの情報を取得できます。そこから絞り込んでください。
`https://slack.com/api/users.list?token=your_token` 

ブラウザ上でSlackにログインしている場合は、
[users.list APIのテスト画面](https://api.slack.com/methods/users.list/test)からも取得できます。

## 3. URL Schemeを組み立てる
`slack://user?team={TEAM_ID}&id={USER_ID}`
{}は実際のURLには不要です。念のため。

なお、ダイレクトメッセージ画面以外の画面を開いたり、検索結果を直接開いたりすることもできます。
[解説ドキュメント](https://api.slack.com/docs/deep-linking)と、[API一覧](https://api.slack.com/methods)をうまく利用してください。
Pymacs helloworld

~/Documents/elisp/test/Pymacs/helloworld.py
として以下のファイルを保存

```~/Documents/elisp/test/Pymacs/helloworld.py
# -*- coding: utf-8 -*-
from Pymacs import lisp

def hello():
    lisp.insert("Hello from Python!")

def hello2(l):
    return l[0]+"pypy123"

def hello3(l):
    return [l[0]+"12pypy123",l[1]+"bbb"]
```

elisp上で以下を実行

```pymacs-test-load.el
(eval-after-load "pymacs" 
'(add-to-list 'pymacs-load-path "~/Documents/elisp/test/Pymacs/"))

(pymacs-load "helloworld")
```

*scratch*
などで以下を実行


```pymacs-test-do.el
(helloworld-hello)

(helloworld-hello2 "aaa")
;;return "apypy123"

(helloworld-hello3 (list "aaa" "kkk"))
;;return  ("aaa12pypy123" "kkkbbb")
```
phpStormショートカットメモ

自分がよく使うphpStormのショートカットメモ

検索系
shift 二回押し search everywhere
いろんなところを一気に検索する。具体的には下記のところをまとめて検索する
ファイル名
 クラス名・メソッド名
 PhpStormのウインドウや機能
 設定(preference)の項目名
 定数・変数・HTMLのID/クラス・CSSのセレクタ

command + F
開いているファイル内の検索
command + R
開いているファイル内の置換

command + shift + F
指定ディレクトリ内の検索

command + shift + R
指定プロジェクト内の置換

command + K
ソースのコミットウィンドウを開く

command + shift + K
pushのウィンドウを開く

command + shift + /
選択している部分のコメントアウト
  htmlやコードの種別に判別してコメントアウトしてくれるので便利

control + option + I
選択部分の自動インデント

command + alt + L
コードフォーマット

command + n
Getter,Setter,PHPDocを挿入する

command + shift + e
直帰の編集ファイル一覧表示

alt + F7
メソッドが使われている場所を検索する

マウス
ホイールでドラック
column単位での選択

面倒くさがり屋だからというのもあるけど、
command + Kとcommand + shift + Kの組み合わせでのコミット & プッシュは楽で好き。
ジェネレータとyieldについて

#ジェネレータ関数とは
ジェネレータ関数は一度だけ値をreturnするのではなく、必要に応じて何度でも「yield(産出)」することができる関数のこと。

ジェネレータ関数が呼ばれると、反復処理が可能なオブジェクトを返す。
反復処理をするためにforeachなどと一緒に使用され、値が必要になるたびに PHP がジェネレータ関数を呼び出す。 
そして、ジェネレータが値をyieldした時点の状態を保存しておき、 次に値が必要になったときにはそこから再開できるようにする。

#yieldとは
ジェネレータ関数を使用するためのキーワードが**「yield」**。
yieldを実行すると、ジェネレーターを生成し現在の処理を中断したまま保持する事が出来る。

以下PHPマニュアルより抜粋

```php
<?php
function gen_one_to_three() {
    for ($i = 1; $i <= 3; $i++) {
        // yield を繰り返す間、$i の値が維持されることに注目しましょう
        yield $i;
    }
}

$generator = gen_one_to_three();
foreach ($generator as $value) {
    echo "$value\n";
}
?>

出力結果
1
2
3
```

ジェネレータは、呼び出されると最初のyield文までを実行して、yield文によって呼び出し元に値を返している。
その際PHPは、実行されたyield文の位置を保存しておき、次にそのジェネレータが呼び出されたときに、そのyield文の次の行から実行を再開している。

#ジェネレータの何が良いか
- イテレータが簡潔に書ける
- 不必要なメモリを使用しなくて済む

##具体例
1~10000までを出力する
###ジェネレータを使用しない

```php
foreach (range(1, 10000) as $val) {
    echo $val;
}
```
この場合、1万要素分のメモリが確保される。

###ジェネレータを使用する

```php
function countNum($limit) {
    for ($i = 1; $i <= $limit; ++$i) {
        yield $i;
    }
}
foreach (countNum(10000) as $val) {
   echo $val;
}
```

値をジェネレータから取得しているので、1万要素分のメモリが確保されない。
haproxy lua スーパーサーバー

Hi!

I wanted a way to run a [tailon](https://github.com/gvalkov/tailon) server in my docker images only when needed. That's what [superservers](https://en.wikipedia.org/wiki/Super-server) are for.

当社で基本的にdockerを使ってます。必要のときだけにtailonのサーバーを起動したかった。そのためにスパーサーバーって言うツールの種類があります。

[inetd](https://en.wikipedia.org/wiki/Inetd) was painful to use so I made a simple one with [HAProxy](http://www.arpalert.org/haproxy-lua.html) support for [lua](https://www.lua.org/docs.html) scripts.

普通のinetdがつい買いにくくてluaで自分のやつを作りました。

# Haproxy conf sample

```
global
  lua-load '/servers/haproxy/superserver.lua'

frontend tailon-frontend
  bind :9090
  tcp-request content set-var(txn.service_dir) str("/s6-supervised-servers/tailon")
  tcp-request content lua.extend-life
  default_backend tailon-backend

backend tailon-backend
server tailon-server localhost:9200
```

# Superserver code

```lua
superserver = {}
superserver.version = "0.0.1"

--
-- Configuration
--
superserver.lifetime = 60
superserver.healthcheck_period = 3
```

Servers stay alive for 60s.
We check every 3s. So 20 ticks before dying!

```lua
--
-- State
--
superserver.expiracy_map = {}
```

For each server we store the number of ticks until death here.

```lua
--
-- ~Constant~
--
superserver.ticks_by_lifetime = superserver.lifetime / superserver.healthcheck_period

--
-- Server killing loop
--
superserver.shinigami_task = function()
   while true do
      for service_dir, ticks_to_live in pairs(superserver.expiracy_map) do
         if ticks_to_live == 0 then
           -- do nothing
         elseif ticks_to_live == 1 then
            core.log(core.info, "killing service " .. service_dir)
            os.execute('s6-svc -d ' .. service_dir)
            superserver.expiracy_map[service_dir] = 0
         else
            superserver.expiracy_map[service_dir] = ticks_to_live - 1
         end
      end
      core.sleep(superserver.healthcheck_period)
   end
end
```
We use the wonderful [s6](http://skarnet.org/software/s6/) tool to start and stop our servers!

```lua
--
-- Server launching and life extension
--
superserver.extend_life_action = function(txn)
   -- core.log(core.info, "extend_life txn " .. txn)
   local service_dir = txn.get_var(txn, 'txn.service_dir')

   if service_dir then
      core.log(core.info, "extending life for service_dir " .. service_dir)
      local ticks_to_live = superserver.expiracy_map[service_dir] or 0

      if ticks_to_live == 0 then
         core.log(core.info, "starting service " .. service_dir)
         os.execute('s6-svc -u ' .. service_dir)
      end

      superserver.expiracy_map[service_dir] = superserver.ticks_by_lifetime
   else
     core.log(core.warning, "failed to extend life, service_dir var not set.")
   end
end

--
-- Register code in haproxy!
--
core.register_task(superserver.shinigami_task)
core.register_action('extend-life', {'tcp-req', 'tcp-res',
                                     'http-req', 'http-res'},
superserver.extend_life_action)
```
swipejsで動画を拡大、揺らす、回転

# はじめに。
Swipeは中島聡氏により開発されたオープンなコンテンツ・プラットフォームです。
画像を組み合わせたマンガ、動画、svgで書かれたvectorなどを表示、動作させることができます。マンガ、取扱説明書、プレゼンテーションツールなどなど、様々な用途で利用できます。

１回目「JavaScript版のSwipe Engine、swipejsを使う」はこちら。
http://qiita.com/isamua/items/5d40558fbed7f90b34e7

２回目「swipejsで画像のスライドショーを作成する」はこちら
http://qiita.com/isamua/items/5021c750b6e8383c82a6

３回目「swipejsのスライドショーでページめくりを変えて遊ぶ」はこちら
http://qiita.com/isamua/items/37cb69a1bd2eaa549d3f

4回目「swipejsで画像を動かして、次世代マンガを作る。」はこちら
http://qiita.com/isamua/items/291080fff9118ddfd628

５回目「swipejs timingでアニメーションを制御する」はこちら
http://qiita.com/isamua/items/85184662545ac0887a3d

６回目「swipejsで動画を再生。」はこちら
http://qiita.com/isamua/items/8667ea3fec0df002afe0

７回目「swipejsのスプライトを使ってキャラクターを歩かせる」はこちら
http://qiita.com/isamua/items/6bf0ab7180ef685e845a


# swipejsで動画を拡大、揺らす、回転

まずは完成品。動画を拡大、揺らす、回転ができます。PCのブラウザでみてください。iphoneなどもモバイルブラウザでは動画がブラウザで再生されません。

http://www.swipejs.net/sample8/sample1.html

swipeファイルはこちら。

```json
{
    "dimension":[1024,1024],
    "pages": [
        {
            "elements": [
		{"text":"video"}
            ]
        },
        {
            "elements": [
		{"video":"1.qt", "x":0, "y":0, "scale": 0.5, "to": { "scale": 2} }
            ]
        },
        {
	    "duration": 3,
            "elements": [
		{"video":"1.qt", "x":0, "y":0, "scale": 0.5, "loop": {"style":"vibrate","count":7} }
            ]
        },
        {
	    "duration": 3,
            "elements": [
		{"video":"1.qt", "x":0, "y":0, "scale": 0.5, "loop": {"style":"wiggle","count":10} }
            ]
        },
        {
	    "duration": 2,
            "elements": [
		{"video":"1.qt", "x":0, "y":0, "scale": 0.5, "to": {"rotate":90 }}
            ]
        }	
    ]
}
```

#解説

## 拡大
toでscaleを指定して、動画を拡大します

```json
		{"video":"1.qt", "x":0, "y":0, "scale": 0.5, "to": { "scale": 2} }
```

## 揺らす
loopでstyleをvibrateに指定して、動画を振動させます。countで7と指定しているので７回揺れます。

```json
		{"video":"1.qt", "x":0, "y":0, "scale": 0.5, "loop": {"style":"vibrate","count":7} }
```


## 小刻みに揺する
loopでstyleをwiggleに指定して、動画を小刻みに揺する。countで10と指定しているので10回揺れます。

```json
		{"video":"1.qt", "x":0, "y":0, "scale": 0.5, "loop": {"style":"wiggle","count":10} }
```

## 回転する
toでrotateを90に指定して、動画を回転させます。

```json
		{"video":"1.qt", "x":0, "y":0, "scale": 0.5, "to": {"rotate":90 }}
```

# まとめ

loopやtoはvideoだけでなくimgやtextなど、他のelementでも使えるので、今までサンプルを使って試してください。
CouchbaseServerを触ってみよう -Editionの違い-

CouchbaseServerを触ってみよう
2章 Couchbase EnterpriseEditionとCommunityEditionについて
======================================

この記事は、SoftwareDesign 2016年12月号(以下、SD誌)のKVS特集中のCouchbaseServer紹介記事に関する補足記事となります。
CouchbaseServerの簡単な紹介から、実際に手を動かして利用してみるところまでを対象としています。

Couchbaseサーバに関する公式のドキュメントは大量にあるのですが、バージョンが古いものも大量に残っていたり、リンク切れなどがあるため、まずざっくり触ってみたいというときに参考にして頂きたいと思います。
この記事はCouchbase4.5を元に記載しています。

[Indexはこちら](http://qiita.com/taruhachi/items/0f96a2f7da81383866df)

## EnterpriseEditionとCommunityEdition
CouchbaseにはEnterpriseEditionとCommunityEditionの2つの製品があります。
EnterpriseEditionを商用利用する場合であっても、クラスタ内のサーバが2ノードまでであれば無償で利用することが出来ます。
商用利用の場合、2ノードを超える場合は年間サポートライセンス契約を結ぶか、CommunityEditionを利用する必要があります。

![Edition_01.png](https://qiita-image-store.s3.amazonaws.com/0/38018/2a7f1192-7ebc-5802-0169-52ea658aa3d3.png)


### CommunityEditionの機能制限について
CommunityEditionの機能制限については以下のサイトに詳しいですが、その中で一部を抜粋します。(※1)
http://developer.couchbase.com/documentation/server/4.5/introduction/editions.html
(※1)こちら、ライセンス形態は随時変更されますので、特に商用利用をする際には最新のものを確認してください。

- XDCR時にフィルタリング機能を利用することが出来ない
- ラックゾーンアウェアネス機能(※2)を利用できない
- 差分データバックアップ機能の利用ができない
- セキュリティー周りの一部機能の利用制限
- N1QLの一部機能制限

この中で特に重要なのはラックゾーンアウェアネス機能になりますので、その機能の利用が必須かどうかがEditionを選定する際の判断材料となることが多いと思われます。

(※2) ラックゾーンアウェアネス機能とは、クラスタ内のノードを予め複数のグループに別れるようにタグ付けしておくことができる機能です。
Couchbaseはデータを冗長化するとき、各ノードに書き込まれたデータを必ず他のグループに含まれるノードにコピーします。
このグループ分けとして、サーバラックや、データセンター、AvailabilityZoneなどを利用することにより、それぞれの単位での障害が発生してもデータ欠損無くサービスを継続することが可能になります。
ldapのパスワードの有効期限を通知するためにリストを取得する検索フィルタ

備忘録です。
アカウントロック運用が始まる前に作られた有効期限を通知するスクリプトを修正する必要があったので。

パスワードをロックされてるユーザはpwdAccountLockedTimeがつくロックされてないとつかない。
http://blog.kichise.com/2012/03/openldap-ppolicy.html

これ↓超わかりやすいなと思いました。ldap検索フィルタ式の解説。
http://infolib.lotus.com/resources/portal/8.0.0/doc/ja_jp/PT800ACD001/admin/rbug_ldapfltrxprns.html

で、アンドで否定だと以下のような感じになるようでした。
`(&(属性名と比較演算子と値)(!(属性名と比較演算子と値)))`

ので、shadowLastChangeだけ拾ってたのをpwdAccountLockedTimeも追加する感じになおしました。

```
ldapsearch -x -LLL -D "検索可能なDN" \
-w ${LDAPPASS} \
-b "ou=People,dc=hoge,dc=example,dc=com" -s sub \
'(&(shadowLastChange=*)(!(pwdAccountLockedTime=*)))' uid shadowMax shadowLastChange mail
```

ダブルクォートで囲むと感嘆符(!)が展開されてそこで止まるのでシングルクォートになおしました。
あと期限きれたあと延々本人にメール行く部分(書いてないですが)を管理者に行くようになおしたりなども。

以上。

参考：
[ブログ ？？？ メモ ？？？: OpenLDAP ppolicy でロックされてるアカウントを検索](http://blog.kichise.com/2012/03/openldap-ppolicy.html)
[LDAP 検索フィルター式](http://infolib.lotus.com/resources/portal/8.0.0/doc/ja_jp/PT800ACD001/admin/rbug_ldapfltrxprns.html)
[man test](https://linuxjm.osdn.jp/html/GNU_sh-utils/man1/test.1.html)
[man mailx](https://linux.die.net/man/1/mailx)