OmniAICreator/Qiita-1.07M huggingface dataset:
自作 WP-CLI コマンドでプロンプトを出す


WP-CLI の自作コマンドで例えばファイルを生成したい時に既存のファイルを上書きする？って聞きたいことがありますよね！？

そんな時は以下のような感じの行を追加する。

```php
$should_write_file = cli\confirm( 'Do you want to overwrite', false );
```

するとコマンドを実行した時に以下のような感じで `Yes` か `No` かを聞いてきます。

```sh
$ wp scaffold movefile 
Warning: File already exists.
Do you want to overwrite? [y/N]
```

`y` か `n` を入力してエンターすると、`$should_write_file` に `true` または `false` が格納されます。

それを判定して以下のようにファイルを生成するなりやめるなりします。

```php
global $wp_filesystem;
WP_Filesystem();
$wp_filesystem->put_contents( $filename, $contents )
```

## テストのやり方

WP-CLI では、Behat というツールを使ってテストするならわしになってて、そのテストは以下のように書きます。

```
Feature: Test that WP-CLI loads.


  Scenario: Overwrite Movefile by prompting yes
    Given a WP install
    And a Movefile file:
      """
      Hello
      """
    And a session file:
      """
      y
      """

    When I run `wp scaffold movefile < session`
    Then the return code should be 0
    And the Movefile file should exist
    And the Movefile file should contain:
      """
      local:
      """
    And STDOUT should contain:
      """
      Success:
      """

  Scenario: Don't overwrite Movefile
    Given a WP install
    And a Movefile file:
      """
      Hello
      """
    And a session file:
      """
      n
      """

    When I run `wp scaffold movefile < session`
    Then the return code should be 0
    And the Movefile file should exist
    And the Movefile file should contain:
      """
      Hello
      """
    And STDOUT should contain:
      """
      Success:
      """

```

この例では、2種類のテストをやってて、ひとつはプロンプトで `y` と入力した場合、もう一つは `n` と入力した場合で、あらかじめ置いてあるファイルの中のコンテンツを確認して、期待通りになっているかを見ています。

## 参考

* https://firegoby.jp/archives/5901
* https://firegoby.jp/archives/5960
* http://qiita.com/miya0001/items/e1477efd88e55a8cec88
* https://github.com/wp-cli/scaffold-package-command
WebページのタイトルとURLをワンクリックでコピーするBookmarklet

## やりたいこと

タイトル+URLをリンクの形式でコピーしたい。
各サービスでフォーマットがバラバラなのでいちいち覚えたくない。
あと、Ctrl+Cもめんどくさいので、bookmarkletを押すだけでClipboardにコピーしたい。

※2017-09-01: 実装、タイトル、説明内容を見直して修正しました。
※2021-03-27: 実装修正しました
※2022-02-21: Twitterのページで動作しない問題に対応しました
※2023-06-12: execCommandが非推奨なため、Clipboard APIで実装しなおしました

## 参考にさせてもらったページ

 - [JavaScript で指定したテキストをクリップボードへコピーする方法](http://jquery.nj-clucker.com/copy-text-to-clipboard/)
 - [javascript - Replace multiple characters in one replace call - Stack Overflow](http://stackoverflow.com/questions/16576983/replace-multiple-characters-in-one-replace-call)
 - [Clipboard API - Web APIs | MDN](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API)


## やったこと

こんな感じにしました。以下がベースとなるコードです。

```js
javascript:(() => {
  
  /* メイン処理 */    
  const main = () => {
    navigator.clipboard.writeText(getTitleAndUrlText());
  };
  
  /* URLとタイトル取得 */
  const getTitleAndUrlText = () => {
    let url = document.URL;
    let title = document.title;
    title = replaceStrings(title);    
    
    /* コピー後のフォーマットに加工した文字列を返す */
    return title + '\n' + url + '\n';
  };
  
  /* 各フォーマット向けにエスケープしたい文字列があればそれを定義して置換 */
  const replaceStrings = (text) => {
    const replacedStrings = {
      '(': '（',
      ')': '）',
      '[': '［',
      ']': '］',
    };
    for (let key in replacedStrings) {
      text = text.replaceAll(key, replacedStrings[key]);
    }
    return text;
  };

  main();
})()
```

このコードの

```js
    // コピー後のフォーマットに加工した文字列を返す
    return title + '\n' + url + '\n';
```

の部分を各サービスやマークアップ言語などのフォーマットに変更することで、ワンクリックでそのフォーマットの文字列をクリップボードにコピーできます。

## 使い方

1. 適当なページ（例えばGoogleとかでも良いです）のBookmarkを作る
2. そのBookmarkを編集し、URLの部分に上の「コード」をそのままコピペする。タイトルは分かりやすいように、「copyTitleUrl」とかつけておくと良いかもです。
3. タイトルとURLをコピーしたいURLをブラウザでひらき、２．で作ったBookmerkletを実行する

これで、先程の開いていたページのタイトルとURLがコピーされます。

## いろんなフォーマットでコピーしたい

各サービスやマークアップ言語のリンク形式の表現で、タイトルとURLをクリップボードにコピーするBookmarkletがほしい場合、↑のコードの「 `// コピー後のフォーマットに加工した文字列を返す` 」で返してる文字列を加工するといろんなフォーマットに対応できます。
いくつか使われそうなフォーマットの例を載せてきました。

### Normal（↑で示してるコードをそのまま使うとこれになります。）

**フォーマット**

```
ページタイトル
http://example.com
```




### Markdown（引用形式）

**フォーマット**

```
> ページタイトル  
> http://example.com  
```

`// コピー後のフォーマットに加工した文字列を返す` の次の行を以下に置き換えて使ってください。

```js
return '> ' + title + '  \n> ' + url + '  \n';
```



### Markdown（リンク形式）

**フォーマット**

```
- [ページタイトル](http://example.com)
```

`// コピー後のフォーマットに加工した文字列を返す` の次の行を以下に置き換えて使ってください。

```js
return '- [' + title + '](' + url + ')\n';
```



### Redmine

**フォーマット**

```
"タイトル":http://example.com
```

`// コピー後のフォーマットに加工した文字列を返す` の次の行を以下に置き換えて使ってください。

```js
return '"' + title + '":' + url + '\n';
```



### Backlog

**フォーマット**

```
[[タイトル:http://example.com]]
```

`// コピー後のフォーマットに加工した文字列を返す` の次の行を以下に置き換えて使ってください。

```js
return '[[' + title + ':' + url + ']]\n';
```




### DocComment

**フォーマット**

```
# @see タイトル http://example.com
```

`// コピー後のフォーマットに加工した文字列を返す` の次の行を以下に置き換えて使ってください。

```js
return '# @see ' + title + ' ' + url + '\n';
```
xcode8 Swift2.3 iOS バージョン10.11.6 でSimPholdersが使えない

#SimPholdersが使えない(相当よくわかってないので全然参考にはならないと思う）


SimPholdersが非活性になってて

どのディレクトリがiPhone7シュミレーターなのかわかりません

ちなみに、なんかライセンス番号を入力するか今すぐ正規品を買うか問われています



![スクリーンショット 2016-10-14 12.28.42.png](https://qiita-image-store.s3.amazonaws.com/0/135794/91093645-e155-3b11-de1e-eefc760d2bd6.png)


#コマンドで端末の番号を探す

```shell-session


xcrun simctl list

```



仕方がないので下記コマンドで

自分がどの端末を使ってるのか

シュミレーターを探します


![スクリーンショット 2016-10-14 12.33.08.png](https://qiita-image-store.s3.amazonaws.com/0/135794/0454c37b-5bfe-97b0-a2a3-017527901df6.png)
URLとかのクエリストリングをよしなに処理したい

URLのGETパラメータから何かしたり、検索したい条件としてGETパラメータを整形したりするときに、`&`だとか`?`だとか気にしながら文字列を連結するのにツラみを感じているあなたへ。

## 取得するとき
```
//location.search = '?hoge=2&bar=fuga';
var query = Query.parse(location.search);
console.log(query);
// {hoge:"2", bar: "fuga"}
```
## 生成するとき

```
var param = {hoge: 10, bar: "fuga"};
var api = '/api/v1/hoge?' + Query.stringify(param);
console.log(api);
// "/api/v1/hoge?hoge=10&bar=fuga";
```
## ソースコード

※ 環境にあわせてよしなに変換して使ってください。
※ 4年前の雑コードなのでリファクタリングもよしなに…。

```
var _ = require('underscore');

var Query = {
    parse: function (query) {
        var parts=  query.replace(/^\?/, '').split('&');
        var params = {};
        _.each(parts, function (value) {
            var part = value.split('=');

            params[part[0]] = part[1];
        });

        return params;
    },
    stringify : function (params) {
        return _.map(params, function (value, key) {
            return key + '=' + value;
        }).join('&');
    },
    parseFromURL: function(url) {
        var matched = url.match(/\?(.*?)#?$/);
        return !matched || !matched.length ? null : this.parse(matched[1]);
    }
};

module.exports = Query;
```
0かnilか空文字判定

APIの中で処理をするときにpostされた値に対して

- 数字が来たらtrue（intじゃなくて文字列の場合もある）
- 0かnilか空文字か数字じゃない文字列だったらfalse

みたいな条件をつくりたくなってしまったときに困ったメモ
（過去のAPIと今のAPIに差分があったりして都合が悪かったという背景）


# 空文字かnilか

これは

```rails
nil.present?	#=> false
''.present?	#=> false
```

なので `present?` を使えばよさそうだけど

# 当然文字列だとダメ

```rails
'a'.present?	#=> true
```


# 0がやっかい

```rails
0.present?	#=> true
```

なので困る

# bool値的には扱えない
rubyは

```rails
0 == true	#=> false
1 == true	#=> false
```

なのであてにならない

# to_i様様

`to_i` して `> 0` する

```rails
0.to_i > 0	#=> false
1.to_i > 0	#=> true
''.to_i > 0	#=> false
'a'.to_i > 0	#=> false
'1'.to_i > 0	#=> true
nil.to_i > 0	#=> false
```

苦肉の策っぽさある。

`'1a'`みたいな文字列が来たら`true`になるけどそれはもうそういう意図されたものだからOKという判断。


なんかもっとイケメソ（イケてるメソッド）あったら知りたい。
PyCharmでpythonを動かす(Windows)

## このドキュメントの目的
PyCharmをインストールし、pythonが動くことを確認する。

## 事前準備
1. pythonがインストール済みなこと

## 環境
Windows7　 64bit

## PyCharmのインストール

https://www.jetbrains.com/pycharm/download/#section=windows
PyCharmのダウンロードを行う。
pythonを動かすことが目的なのでCommunity版をダウンロード。

![図2.png](https://qiita-image-store.s3.amazonaws.com/0/144312/37a76a2f-35b6-932e-b901-e56168f0ca07.png)

ダウンロード完了後に、下図のインストーラを起動。
![図3.png](https://qiita-image-store.s3.amazonaws.com/0/144312/c0981102-ac4f-6f78-fb7f-3446b2a70a0a.png)

起動画面
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/144312/19b3fbe5-00c2-31e3-6473-10de56a32ce2.png)

設定ファイルの置き場所を聞かれる。そのまま進めて問題なし。
![図4.png](https://qiita-image-store.s3.amazonaws.com/0/144312/6eccdcaf-903d-619e-cef3-3152ecfaf46b.png)


Create associationsにチェックを入れる必要あり。拡張子「.py」をPyCharmが読み込んでくれる。
![図5.png](https://qiita-image-store.s3.amazonaws.com/0/144312/b376301e-0d56-cb6e-24ba-c5ff8822be12.png)

起動アイコンの置き場所を聞かれる。そのまま進めて問題なし。
![図6.png](https://qiita-image-store.s3.amazonaws.com/0/144312/3c8a501c-7e4e-6f88-f63d-23d041867d0b.png)

Finishでインストールが完了する。
![図11.png](https://qiita-image-store.s3.amazonaws.com/0/144312/ad74995d-d125-df97-d3f6-5f8e76d956fd.png)

## PyCharm内でpythonを動かす

デスクトップ上にアイコンが作成されないので Windowsキーから「JetBrains PyCharm Community Edition」で起動アイコンを検索し起動する。

起動画面。pythonファイルを扱う既存のパッケージがある場合は「Open」からパッケージを選択。
今回は、新しく作成するため「Create New Project」を選択。
![図7.png](https://qiita-image-store.s3.amazonaws.com/0/144312/b639bd3e-ebbe-1484-1295-507f3458fb97.png)

pythonファイル作成場所と用いるpythonを聞かれる。
今回はそのまま「untitled」で作成。
![図8.png](https://qiita-image-store.s3.amazonaws.com/0/144312/ae2d41f8-a21f-7f3c-642a-750aa22dd55d.png)

Create選択後、先ほど作成したフォルダが表示される。
![image](https://qiita-image-store.s3.amazonaws.com/0/144312/86c1dffb-4bc7-1ede-7253-3a7c2114ade2.png)

pythonファイルを作成するため、作成場所のフォルダ「untitled」を右クリックし
「New」→「Python File」を選択。
![図10.png](https://qiita-image-store.s3.amazonaws.com/0/144312/7f2cbd52-a033-7c20-4250-18d0d051d069.png)

ファイル名を決めてファイル作成。（今回はtest.py）
![図12.png](https://qiita-image-store.s3.amazonaws.com/0/144312/e31f4aaa-1ca4-06ad-7277-6c58aaa20c7f.png)

OK選択後、フォルダ下にtest.pyが作成され、画面右側で書き込めるようになった。
![図13.png](https://qiita-image-store.s3.amazonaws.com/0/144312/e82d6696-07a6-eaea-522e-4b1d2e7a6db3.png)

伝統のHello World構文
![図14.png](https://qiita-image-store.s3.amazonaws.com/0/144312/c4e8a388-ef96-f300-49c8-de68cbb379fa.png)

※2018/10/31 追記：[PythonでやるML Cycle1: Pythonに慣れる](https://qiita.com/kenji-kondo/items/44cf2f764c8facb9ae3b#_reference-6ed283e0ccc111fe9116)の記事にてご指摘いただきました。
上図のprint文はPython2系のものであり、Python3系ではエラーになります。
Python3系の場合は``print ('Hello World!')``と括弧をつけてください。
<br>

pythonを動かすには、画面上部の「Run」→「Run...」から起動したいファイルを
選択。
![図15.png](https://qiita-image-store.s3.amazonaws.com/0/144312/4636ea62-1aed-d1c6-139f-283cd2a00a8d.png)

画面下部に「Hello World!」が表示され、動いていることが確認できる。
![図16.png](https://qiita-image-store.s3.amazonaws.com/0/144312/385273f5-c0af-2d33-01e4-5660222e3b14.png)
Rails consoleでPOSTを投げる

# やりたいこと

1. APIなどのPOSTでリクエストを投げたときの動作をブラウザではなく、rails console上で確認したい。

# 手順

1. postのリクエストにCSRF対策として、authencity_tokenを含める必要がある
2. authencity_tokenをsessionメソッドから生成する
3. authencity_tokenを含めてリクエストをPOSTで送信する

```bash
$ rails c

app.get 'リクエストを実行するページのURL(ログインページとか検索ページとか)'
token = app.session[:_csrf_token]
=> 'XXXXXXXX'

# or

token = app.response.body.match(/<[^<]+authenticity_token[^>]+value="([^"]+)"[^>]+>/)[1]
=>'XXXXXXXXX'
# rails4の場合
app.post 'リクエストするAPIのURL' , {authencity_token: token, 'data': :data} 
Started POST "リクエストするAPIのURL" for 127.0.0.1 at 2016-10-14 11:12:50 +0900

# rails5の場合
app.post 'リクエストするAPIのURL' , params: {authencity_token: token, 'data': :data} 

#略

=> 200
```

200がレスポンスで返ってきたらOK

※ `app.get`でページ移動の処理をしないと`token = nil`になってしまってた。

# 追記
コメントでrails5の挙動についてアドバイス頂いたので、rails5での挙動についても記載しました。

なお、これを書いた当時はconsole上でhttpリクエスト投げようと思ってましたが、普通に `curl` コマンド、もしくは `http` コマンドが便利だし、GUIベースで確認するならPostManとか使うほうが色々設定できて便利だと思っています。
XIB上のUITableViewCell内に設置したUIButtonのイベントが発火しないことがあった

## tl;dr

* `UITableViewCell`の中の`UIButton`に`TouchUpInside`などのイベントを設定するとき
* ボタンをcontrol＋ドラッグでコードに連携する際のポップアップの`Object`で`File's owner`**ではなく**`customTableViewCell (名前は例)`を選択するとよい場合がありそう

## 環境

* macOS 11.12 sierra
* Xcode 8.0
* Swift 3.0

## 症状および対処法

<img width="536" alt="Screen Shot 2016-10-14 at 11.55.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/15144/ed19b191-a527-e794-8c31-1621367e0fcd.png">

xibファイルを新規作成し、上記のように`UITableViewCell`の中に`UIButton`があるようなカスタムセルを作りました。

<img width="477" alt="Screen Shot 2016-10-14 at 12.01.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/15144/19a28c81-7ed7-789b-9e0b-47c13d934481.png">

ここで、この`UIButton`とコードを連携する際に出てくるポップアップで、`Object`を`File's owner`にしていると、動作時にタップできませんでした。
私の場合、正しくは`customTableViewCell`を選択することでボタンのイベントが正しく発火しました。

`UIButton`のイベントが意図通りに発火しない場合、この周辺を確認してみるのがよさそうです。
C > float型のint型へのキャスト > 少数部分の扱い

http://ideone.com/49B9lH

```c
#include <stdio.h>
 
int main(void) {
	float a = 3.1;
	float b = 3.9;
 
	printf("%d\n", (int)a);
	printf("%d\n", (int)b);
 
	return 0;
}
```

```txt:結果
3
3
```

関連
http://www.motorwarp.com/koizumi/round_c.html
NAT Gateway利用時にTCPのコネクションが使えなくなる


http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/vpc-nat-gateway.html#nat-gateway-troubleshooting-timeout

上記のように、アイドル時間が5分以上継続すると接続がタイムアウトされてしまう。

接続をタイムアウトさせないようにするためには、TCP Keepaliveなどの利用を行うように言われている。

TCP KeepaliveはOS側で下記設定で確認することが出来る。

```
$ cat /proc/sys/net/ipv4/tcp_keepalive_time
7200

$ cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75

$ cat /proc/sys/net/ipv4/tcp_keepalive_probes
9
```

上記設定では、

* アイドル時間が7200秒（2時間）続いていた場合
* 75秒おきにキープアライブプローブを送信
* 9回まで送る

という設定になっている。
(多分OSデフォルト?)

そのため、TCPコネクションが死んでいると確認できるまでは、
7200 + 75 * 9 = 7875秒 かかる形となる。

OS標準でのTCP Keepaliveの設定は、`sysctl` とかで変更することも可能


プログラムからTCP Socketを利用する場合は、
基本的にTCP Keepaliveが無効なSocketとして作られることが多い模様。

そのため、プログラム内部で `setsockopt` などを使って設定することが必要そう。

rubyだと以下ページとかでSocketのオプションを見れる模様

http://ruby-doc.org/stdlib-1.9.3/libdoc/socket/rdoc/Socket/Option.html

この辺を参考にTCP Keepaliveを設定するとよさそう

https://makandracards.com/makandra/36345-sending-tcp-keepalives-in-ruby
cssで背景画像を暗くする

背景画像を画像を加工せずにCSSで加工する。

```ex.css

body:before {
  content: "";
  position: fixed;
  top: 0; bottom: 0; left: 0; right: 0; 
  background: rgba(0,0,0,0.5);
  pointer-events: none;
}

```
AndroidアプリでFirebaseへの移行

FirebaseはGoogleが2014年に買収したmBaas(アプリの認証、データベース)を提供するサービスで、facebookのParseに押され気味だったので知名度は今ひとつだった。2016年にGoogleのサービスがなぜかFirebase側に移って下の図のような大きいサービスに変貌。


![Android_プロジェクトに_Firebase_を追加する_ _ _Firebase.png](https://qiita-image-store.s3.amazonaws.com/0/99731/4f779927-4260-1707-9542-53b87f7754ad.png "Android_プロジェクトに_Firebase_を追加する_ _ _Firebase.png")

# アップデートの方法

AdMobとかAnalytics導入済みの人はどうやってアップデートするのか気になって探してみたところ、公式のガイドで解決しました。

https://firebase.google.com/support/guides/google-android
iOS UIViewの階層構造をprintする extension by Swift 3.0

隠れているUIViewを確認するための便利関数を自作

```swift:Utility.swift
import Funcation
import UIKit

extension UIWindow {
    func printSubviewHierarchy() {
        var tabs:String = ""
        printSubviews(subviews: self.subviews, tabs: &tabs)
    }
    
    private func printSubviews(subviews: [UIView], tabs:inout String) {
        tabs += " "
        for view in subviews {
            print(tabs + "\(view.self)")
            printSubviews(subviews: view.subviews, tabs: &tabs)
        }
        tabs.remove(at: tabs.index(before: tabs.endIndex))
    }
}
```

使用例

```swift:ViewController.swift
    @IBAction func tapped(_ sender: UIButton){
        self.view.window?.printSubviewHierarchy()
    }
```

結果表示例

***
```:DebugWindow
 <UILayoutContainerView: ...
  <UINavigationTransitionVIew: ...
    :
```
***
MVCモデルについて

#記事を移動しました。
https://zenn.dev/dd_sho/articles/36abe63831d909
今後は上記の記事で更新します。（2021/10/03）


MVCモデルについて整理したいと思い，いろいろ調べたのでその内容を記事にしたいと思います．

MVVMについても記事書いてみました。良ければ見てみてください。
[【iOS】MVVMについて](https://qiita.com/s_emoto/items/b000a5c076f3d6076972)
[【Android】MVVMについて](https://qiita.com/s_emoto/items/08e46b18f72c3b303b12)

# MVCモデルとは
役割ごとにModel, View, Controllerに分割してコーディングを行うモデル
それぞれの役割は，

- Model -->  システムの中でビジネスロジックを担当する

- View  -->  表示や入出力といった処理をする

- Controller  -->  ユーザーの入力に基づき，ModelとViewを制御する

概念図としては次の図１のようになる．
![MVCモデル図.png](https://qiita-image-store.s3.amazonaws.com/0/139470/200f787f-17ef-cbf9-3c7c-896acf7e3fba.png)
図１　MVCモデルの概念図
(出典：http://www.slideshare.net/MugeSo/mvc-14469802)

※上記の概念図は**iOS向けではなかったらしく**，次の記事をご参考にされることをオススメします．
http://qiita.com/lovee/items/5f55422f6b55d968bbdc
以下，この記事からの引用です．
「Model は本来一まとまりのデータ処理をする部品であって、その性質ゆえ内部が非常に複雑な実装が入ったりいろんなメソッドやプロパティがアクセス可能になってたりしており、一つだけでなく複数の View クラスの必要なデータを対応してるのが一般的です。そのため View が直接 Model 参照するということは、すなわち**View が自分が必要としないプロパティやメソッドのアクセスまでできてしまう**」

このような理由からViewがModelを直接参照するのはあまりよろしくないということでした．
# MVCモデルの処理の流れ
上記の内容を受けて，ユーザーからの入力があった場合の処理の流れを自分なりに図にしてみました．以下の図２です．
![MVCの処理の流れ.png](https://qiita-image-store.s3.amazonaws.com/0/139470/c65f3051-84ee-7e8a-8255-fd68272e6740.png)
図２　ユーザーからの入力があった場合のMVCモデルでの処理の流れ

私の理解としては，

- Model  -->  実際にデータの処理を行う

- View  -->  Modelの状態を表示する

- Controller  -->  ModelとViewに処理をお願いする

といったところです．MVCモデルを参考にする前と後で特に違いが出る点として，

- ControllerはModelとViewの操作だけを記述すれば良いため肥大化を避けることができる．

- Viewはもらった値を表示するのではなく，Modelを参照してModel内のデータの状態を表示する．

の２点が挙げられると感じました．
# MVCモデルの利点
1.機能毎に分割されているため，分業して作業を進めやすくなる(各人の得意な所に集中できる)
2.それぞれが独立しているので変更・修正があった場合にその影響を受けにくい


今回の記事は以上になります．
この記事を書くにあたって，MVCモデルについてもう一度調べたことで自分の中で整理ができました．

間違っている点や理解が不十分な点等，ご指摘いただければ幸いです．
SolrのScriptUpdateProcessorを利用し、Pythonでインデックスの前処理をする

参考：http://www.rondhuit.com/scriptupdateprocessor.html

記事はjavascriptの場合についてですが、
ここはjythonを使用しPythonによるフィールド登録のやり方をご紹介します。
ちなみに、環境はCentOS7でSolr6とManifoldCF2.4のバージョンを使用しています。

**1.solrconfig.xmlにupdateRequestProcessorChainを追加**

```xml:solrconfig.xml
...
<updateRequestProcessorChain name="script">
  <processor class="solr.StatelessScriptUpdateProcessorFactory">
    <str name="script">update-script.py</str>
  </processor>
  <processor class="solr.LogUpdateProcessorFactory" />
  <processor class="solr.RunUpdateProcessorFactory" />
</updateRequestProcessorChain>
...
```
solrconfig.xmlはsolr5以降以下の場所に配置されているようです。
<code>var/solr/data/`<corename>`/conf/solrconfig.xml</code>

**2.requestHandlerに上記定義したUpdateChainを指定**

```xml:solrconfig.xml
...
<requestHandler name="/update" class="solr.UpdateRequestHandler">    
  <lst name="defaults">
    <str name="update.chain">script</str>
  </lst>       
</requestHandler>
...
```
ManifoldCFでPDFやExcelをクロールする前提であれば、ExtractingRequestHandlerに、
RDBをクロールする場合は、DataImportHanlderに上記記述をそれぞれ追加する必要があります。

**3.update-script.pyのpython scriptを配置**
配置先: 
<code>var/solr/data/`<corename>`/conf/update-script.py</code>

Pythonでfieldを登録するには
<code>doc.setField("field_name","field_value")</code>
と書きます。scriptによる登録するfield_nameはあらかじめ「managed_schema.xml」に追加する必要があります。
同じ名前の登録があれば、solr側でマッピングしてくれます。
ちなみにすでに投入したインデックスを
<code>doc.getFieldValue("field_name")</code>
で取得できます。
スクリプトは実行されるたびに評価されるので、編集によってSolrを再起動する必要がありません。

**4.Jythonをインストール**
JavaVM上でpythonを動かすため、jythonを使います。下記リンクから入手

http://www.jython.org/downloads.html

Installer版ではなく、Standalone版が必要らしい。こんな具合でSolr側に置きます。

<code>var/solr/data/`<corename>`/lib/jython-standalone-2.X.X.jar</code>

**5.DBと連携する場合**
postgresDBからデータを取得する必要があったので、pythonからDBにアクセスためのJDBCが必要です。

https://jdbc.postgresql.org/download.html  からJDKとpostegresバージョンそれぞれマッチしたJDBCを入手し

<code>var/solr/data/`<corename>`/lib/postgresql-9.X-XXXX.jar</code>に配置

import文と接続の記述例

```python:update.script
from com.ziclix.python.sql import zxJDBC

DB_URL = "jdbc:postgresql://yourpostgreshost:port/dbname"
DB_USER = "postgres"
DB_PASS = "password"
DB_DRIVER = "org.postgresql.Driver"
connection = zxJDBC.connect(DB_URL, DB_USER, DB_PASS, DB_DRIVER)
```

のように配置します。

**6.外部ライブラリを参照する場合**

もし外部のライブラリをimportする場合、jython standalone版のjarを解凍し、
外部ライブラリ適切な場所（通常は/Lib）に配置した状態で再度jarにすればOK。もっといい方法があるかもしれませんが。。。



これで完了です。Manifoldcfでジョブを実行して確かめてください。Pythonスクリプトが正しく動かない場合は、多少面倒ですが、エラーログをみながら試行錯誤する必要があるかもしれません。
WordPress本体の翻訳をプラグインから差し替える


WordPress本体の翻訳をなんらかの都合で差し替えたいときは、以下のような感じ。

```php
add_filter( "gettext", function( $translations, $text, $domain ){
	if ( "default" === $domain && "Dashboard" === $text ) {
		return "まいど！";
	} else {
		return $translations;
	}
}, 10, 3 );
```

![](https://www.evernote.com/l/ABWM0LX42aRK1oVWzajdDZ5BOdhl1DSmFz8B/image.png)

`gettext` というフィルターフックを使って、差し替えることができます。

`"default" === $domain` という部分は WordPress 本体の翻訳ですよという意味で、この場合、たとえばプラグインやテーマに `Dashboard` という単語があってもそれはプラグインやテーマ側の翻訳が使用されます。

プラグインやテーマの翻訳を差し替えたいときは、ソースのどこかに `load_plugin_textdomain()` 等があるので、それの第一引数にある `textdomain` を使用してください。

## 独自の .mo を使って翻訳を差し替える

これはレアなケースですが、翻訳ファイルを丸ごと差し替えたいケースもあるかもしれません。また、WordPressにコントリビュートする過程の中で、まだコアにとりこまれておらずプラグインとして提供されている新機能の翻訳をテストしたいケースもあります。

そんな場合は以下のような感じ。

```php
load_plugin_textdomain(
	"rest-api",
	false,
	dirname( plugin_basename( __FILE__ ) ).'/languages'
);

add_filter( "gettext", "translate_rest_api", 10, 3 );

function translate_rest_api( $translations, $text, $domain ) {
	if ( "default" === $domain && translate( $text, "rest-api" ) ) {
		return translate( $text, "rest-api" );
	} else {
		return $translations;
	}
}
```

この例では `rest-api` という `textdomain` で翻訳ファイルを作成して、それで WordPress 本体の翻訳を上書きしています。

サンプルのプラグインはこちら。

https://github.com/miya0001/wp-api-i18n

## 注意

これらの方法は、WordPress 本体のオリジナルのテキストが変更された時に、それを追いかけないといけなくなりますので、末長くお付き合いする覚悟が必要ですからね！
さくらのVPSのディスク使用量を確認する

さくらのVPSのディスク容量をどれくらい使っているのかをLinuxコマンドを使って、調べてみました。

## dfコマンド
調べたいサーバーへ、ssh接続した後に、``` df -h ``` コマンドを実行する。

```
% df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda3       XXXG  X.XG  XXXG   X% /
tmpfs           XXXM     0  XXXM   0% /dev/shm
/dev/vda1       XXXM   XXM  XXXM  XX% /boot
```

### 使用内容情報

| 情報| 説明|
|:--|:--|
| Filesystem | ディスク |
| Size  | 合計サイズ  |
| Used  |  使用サイズ |
| Avail  |  使用可能なサイズ|
| Use%  |  ディスクの使用率|
|Mounted on  | マウント先 |

### コマンドオプション

| オプション| 説明|
|:--|:--|
| -a |すべてのファイル情報を表示(空のファイルも含め)|
| -i  | iノードの使用量を表示する  |
|-k  |  容量をKバイト単位表示|
| -t  |  ファイルの種別を指定|
|-x  |  表示しないファイル・システムを指定する|
|filename  | 指定したファイルが属しているディスク・ドライブの容量を表示 |
Amazon API Gateway - create API

GYAOのtsです。
我々のチームは、オールパブリッククラウドで、[Microservice Architecture](http://microservices.io/patterns/microservices.html)を採用した次期バックエンドを設計中です。

#必要性
よく言われることだが、コードは書いた分だけバグの可能性が上がるので、極力実績のあるOSS、数多のクラウドベンダーによって提供されるIaaS、PaaS、SaaSを使用して自前のコーディングを最小限にとどめたい。また、車輪の再発明もしたくない。その方針で設計、プロトタイピングをしているが、
今のところ、MicroserviceをRESTまたは、メッセージングで繋いでいく方向で検討中。

拡張性、メンテナンス性やモバイルやアプリ（MBaaS）のこと等も考えると、どうしてもGatewayが必要になってくると思う。
認証を一手に引き受けてくれるところも嬉しい。
以前のプロジェクト（よくある ちゃぶ台返しをくらって実現できなかったが）では

- [Kong](https://getkong.org/)

あたりをGKEで展開すればと考えていたが
Amazon API Gatewayを使ったことがなかったので、チーム全員で使ってみながら考えてみた。

# とりあえず使ってみる
とりあえずブリッジ的なAPIを作ってみる。
色々確認、モニタリングしながら使ってみたいので、ブリッジ先は[mockbin](http://mockbin.org/)。
モックAPIをGUIで作成して、モニタリングできる。
以前、ブリッジwebサービスを作ったときに使いました。
久々に使ったけどこれ便利だなぁ。

## create API
![Screenshot 2016-10-10 at 18.15.52.png](https://qiita-image-store.s3.amazonaws.com/0/114329/d0c8eaa3-742c-4ec6-7790-0589c0837baf.png)
こちらの Amazon API Gatewayから

![Screenshot 2016-10-11 at 00.24.07.png](https://qiita-image-store.s3.amazonaws.com/0/114329/bbf5b068-e3d5-f3b1-2d42-c8e4d05891a1.png)
リソース、メソッドの作成。

![Screenshot 2016-10-11 at 00.25.28.png](https://qiita-image-store.s3.amazonaws.com/0/114329/33de3d83-36ca-030a-2d06-1c324c708b00.png)
なかなか直感的。この図だけで説明がいらない。
直感的かどうかは、個人的にかなり重要視するポイントです。

![Screenshot 2016-10-11 at 00.26.30.png](https://qiita-image-store.s3.amazonaws.com/0/114329/90a9f357-10d5-112d-6a6d-f89a27ed8c4a.png)
「メソッドリクエスト」のパラメータセクション。
とりあえずfooというパラメータを定義してみる。
（キャッシュや、パラメータをバインドする必要があるときに使います。）

![Screenshot 2016-10-11 at 00.28.23.png](https://qiita-image-store.s3.amazonaws.com/0/114329/179458dd-3552-6190-2be7-ed80f7388f29.png)
「統合リクエスト」のパラメータセクション。
上で定義したfooが定義されているので、それをbarに変えてみる。

Gatewayにfoo=abcでリクエストすると、mockbinにはbar=abcでリクエストされる。

![Screenshot 2016-10-11 at 00.28.39.png](https://qiita-image-store.s3.amazonaws.com/0/114329/993bb7ae-0007-fa87-36d4-0241e25b3c47.png)

![Screenshot 2016-10-11 at 00.28.59.png](https://qiita-image-store.s3.amazonaws.com/0/114329/4ae7681b-a3cf-db37-a133-4559f1a9af87.png)
あとはDeployのみ。以上。

#所感
直感的で、使いやすい。
ただし、認証がかなり直感的ではない。幾つかあり、我々はIAM（ Identity and Access Management ）認証を使っていくのだが、、、、後々書きます。
認証部分はメンテナンスしていく上でわりと使用頻度が高いので、より直感的に簡単にしたい。（もちろん強固に）

もっと直感的なGatewayないかなと思っていたところ、Googleの営業の方より、[Apigee](https://apigee.com/)を教えてもらう。
これぞ求めていたものかも。。。
~~いじっているので、感想は後ほどシェアします。~~
[シェアはこちら](http://qiita.com/tstakano-yj/items/2a6c672990333795fcda#_reference-6844d80d811e9ec7fc04)です。
それでは。
俺の最弱のvagrant + ansible + rbenv + docker 環境

Macbookも使ってはいますが、業務の都合上俺がいつも持ち歩いてるのはこよなく愛するThinkpadです。

* Ubuntuのデュアルブート
* Ubuntu(GUI)のVirtualBox
* Docker for windows でdocker-compose

などいろいろ試しましたが、今のところこれに落ち着きました。

[vagrant-ansible-docker](https://github.com/TongTheDopeness/vagrant-ansible-docker)

Ansibleでdockerとrbenv環境を構築しています。

## 何が最弱か

構成自体も最弱かもしれませんが、何より__俺のAnsibleの知識__が最弱です。
もっと良い方法や記述法などがあれば、ツッコミいただけると幸いです。

## 俺の最弱のVagrant開発戦略

* プログラミング言語はdockerを使わない
  * rubyをdocker-compose経由で使う方法もありますが、bundle installなど色々面倒
* DBなどのミドルウェアはdocker-compose
    * プロジェクト毎にバージョンを変えたりしたい
    * プロジェクトでどのミドルウェアが使われているか、すぐにわかる
    * プロジェクト毎のメンバー間開発環境統一も最低限出来ている

### rbenv

[AnsibleとVagrantで開発環境を構築する](http://knowledge.sakura.ad.jp/tech/2882/)を参考にさせていただきました。


## あわせて読みたい

俺の最弱構成に最強に参考にさせていただいた記事です

[AnsibleからRubyをバージョン指定してインストールするだけのPlaybook(rbenv版)](http://qiita.com/joytomo/items/f58dd53708f976f26a87)
[Ansible と Vagrant を使って Rails 開発環境（Ubuntu + rbenv + MySQL5.6 + node.js）を構築する](http://qiita.com/katsuhiko/items/56935225754a90d58314)
ローカルの変更ファイルをリモートに転送する方法

開発環境がサーバにしかなくて困る:scream:
そんなとき！

ローカルの変更ファイルだけをtarで固めてリモートに転送できたら便利です。

##実装
①git status -uの結果がMのものだけをtmpファイルに書き出す。
②tmpファイルに書き出された変更ファイル名を表示する。

```
tmp file
------------
aaa.text
bbb.text
ccc.text
------------
Is this ok? yes/no
```

③表示されたファイルが意図したものである場合は場合はyes,意図したものでない場合はnoと入力する。
④noの場合は終了、yesの場合は実行するコマンドを表示して実行。

```
${KEY} = /home/key/
${DIR} =
${} =
※configで定義した場所に転送するようにする。

tar ｜ssh ...(実行コマンド)

finish!
```
Phoenixとかectoとかの備忘録

Phoenixとかectoとかの備忘録

## controllerでoptionalな引数を取る

```.ex
def create(conn, %{"name" => name, "password" => password} = params) do
  avatar_image = Map.get(params, "avatar_image", "default_image")

  # ...
end
```

## preloadされていない判定

`%Ecto.Association.NotLoaded{}` でマッチできる。

```.ex
case Map.get(model, assoc) do
  %Ecto.Association.NotLoaded{} ->
    false
  _ ->
    true
end
```

http://stackoverflow.com/questions/38047486/how-to-check-if-a-association-is-not-loaded

## テストコードでIEx.pry

一定時間以上停止してるとDBコネクションが切れるので、config/test.exsに設定を追加する。

```.exs
config :logger, :console, format: "[$level] $message\n", ownership_timeout: :infinity
```

テスト実行する時に `--trace` つける必要があるかも。

https://github.com/elixir-ecto/ecto/blob/master/lib/ecto/adapters/sql/sandbox.ex#L224

## mix task

configをmixtaskからでも参照できるようにする

```.ex
Mix.Task.run "app.start"
```

DB操作をできるようにする

```.ex
Repo.start_link()
```


## ectoで複数の変数

クエリで定義(`from hoge in query`)した変数を複数使いたいことがある。
`from [t, users_to_teams] in query` にようにする。

```.ex
defp get_all_for_member_count_order(query) do
  query = (from t in query,
    join: users_to_teams in assoc(t, :users_to_teams),
    group_by: t.id
  )
end

def get_all_by_asc_of_member_count(query) do
  #    ↓ ここをlistで定義する
  from [t, users_to_teams] in get_all_for_member_count_order(query), [
    order_by: [asc: count(users_to_teams.team_id)]
end
```

fromの後に二つ変数を用意しないと、意図しないデータからフィールドを参照しようとしてエラーになる。

```.ex
def get_all_by_asc_of_member_count(query) do
  #    ↓ 単体だと意図しないデータが入る可能性
  from users_to_teams in all_for_member_count_order(query), [
    order_by: [asc: count(users_to_teams.team_id)]
end 
```

```
** (Postgrex.Error) ERROR (undefined_column): column t0.team_id does not exist
```

## ややこしいやつ

Struct, Map, Tuple, List, Keyword List
http://elixir-lang.org/getting-started/keywords-and-maps.htm

```.ex
%Struct{}, %{k: 1}, {1, 2}, [key: 1], [1, 2]
```

## バージョン管理

asdf

http://qiita.com/yumatz/items/28cc7a000236510b71c2
-メモ-VirtualBox 他のPCからアクセス方法

環境

Windows 8.1
VirtualBox 4.3.10
VirtualBox の設定

    VirtualBox で作った環境の設定を開く
    ネットワークのポートフォワーディングを開く
    新規ルールを追加で 名前：任意、プロトコル：TCP、ホストポート：8080、ゲストポート：80 に設定

ファイアウォールの設定

    コントロールパネル → システムとセキュリティ → Windows ファイアウォール → 詳細設定
    受信の規則 → 新しい規則
    どの種類の規則を作成しますか？「ポート」
    「TCP」「特定のローカルポート：8080」
    「接続を許可する」
    「ドメイン」「プライベート」（必要なものにチェック）
    任意の名前を入力して完了

確認

環境を起動して他のPCやスマートフォンから「http://コンピューター名またはIPアドレス:8080/」にアクセス。
コンピューター名は設定コントラクトから「PC情報」を開いて「コンピューター名」の箇所。
IPアドレスは PowerShell またはコマンドプロンプトで ipconfig して「IPv4 アドレス」の箇所。


http://blog.snowcait.info/2014/04/21/access-virtualbox-from-other-pc/
CentOS 7.2にnumbaをインストールする

numbaを、condaで簡単にインストールできるところだが、諸般の事情もあってpipでインストールしてみた。以下はその手順。なお、Pythonは2.7を使用。

#1. cmakeのインストール
0. [https://cmake.org/download/](https://cmake.org/download/)から、cmake-3.7.0-rc1-Linux-x86_64.shをダウンロード
0. ダウンロード先(e.g. /home/ユーザ/download)にて、`sh cmake-3.7.0-rc1-Linux-x86_64.sh`
0. ディレクトリcmake-3.7.0-rc1-Linux-x86_64が作成され、その中にcmakeがインストールされる

#2. LLVMのインストール
0. [http://llvm.org/releases/download.html#3.8.1](http://llvm.org/releases/download.html#3.8.1)から、LLVM source codeをダウンロード
0. ダウンロード先(e.g. /home/ユーザ/download)にて、`tar xvfJ llvm-3.8.1.src.tar.xz`
0. `cd llvm-3.8.1.src`
0. `mkdir build`
0. `cd build`
0. `../../cmake-3.7.0-rc1-Linux-x86_64/bin/cmake ..`
0. `make`
0. `sudo make install`

#3. llvmliteのインストール
0. `su`
0. `export LLVM_CONFIG=/usr/local/bin/llvm-config`
0. `yum install libstdc++-static`
0. `pip install llvmlite`
0. `exit`

#4. numbaのインストール
0. `sudo pip install numba`

#5. numbaのテスト
0. [http://yutori-datascience.hatenablog.com/entry/2014/12/09/235628](http://yutori-datascience.hatenablog.com/entry/2014/12/09/235628)を参考にテストプログラムを作成、実行⇒正しく動いた!
フードデザート問題 - OR機関誌10月号より

# これなに
[OR学会](http://www.orsj.or.jp/)の機関誌10月号[「**学生たちのOR**」特集](http://www.orsj.or.jp/e-library/elcorsj.html#6110)から、適当に最適化の問題をピックアップしてPythonで解いてみたいと思います。
準備として、numpy, pulp, ortoolpy が必要です。環境構築は、[組合せ最適化を使おう](http://qiita.com/Tsutomu-KKE@github/items/bfbf4c185ed7004b5721#%E3%82%BD%E3%83%95%E3%83%88%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)を参考にしてください。

# フードデザート問題
論文「[長崎市におけるフードデザート問題の分析](http://www.orsj.or.jp/archive2/or61-10/or61_10_680.pdf)」の問題を使わせてもらいましょう。

> 全ての人が通えるように生鮮食料品店を配置し、配置数を最小化します。一般人は5000m以内に、高齢者は1500m以内でないと通えません。

# 考え方
[容量制約なし施設配置問題](http://qiita.com/Tsutomu-KKE@github/items/0cbd2e9a75ef0ecb3269)です。

# Pythonで解く
まず、ランダムなデータを作成します。

```py3:python
import numpy as np
from pulp import *
from ortoolpy import addvar, addvars

nc, n1, n2 = 4, 2, 2 # 候補点数、一般人地域数、高齢者地域数
np.random.seed(2)
dist1 = np.random.randint(4000, 6000, (nc, n1))
dist1 # 候補点から一般人地域への距離
>>>
array([[5192, 4527],
       [4493, 5608],
       [5558, 4299],
       [4466, 5099]])
```

```py3:python
dist2 = np.random.randint(1000, 2000, (nc, n1))
dist2 # 候補点から高齢者地域への距離
>>>
array([[1360, 1263],
       [1674, 1433],
       [1607, 1587],
       [1725, 1047]])
```

定式化して解きます。

```py3:python
m = LpProblem()
x = addvars(n, cat=LpBinary) # 変数
m += lpSum(x) # 目的関数
for i in range(n1):
    m += lpDot(dist1[i] <= 5000, x) >= 1 # 制約
for i in range(n2):
    m += lpDot(dist2[i] <= 1500, x) >= 1 # 制約
m.solve()
[int(value(v)) for v in x]
>>>
[1, 1, 0, 0]
```

以上
Apacheのログをカスタマイズ／重いログだけを抽出

Apacheのアクセスログに以下の情報を出力する方法と、取得したログから重いリクエストを取り出す例を示す。

- 処理にかかった時間
- ログイン中のユーザID
- ロードバランサ使用時の、実際のアクセス元のIP

##処理にかかった時間
LogFormatに%Dを付けるとリクエストにかかった時間がマイクロ秒単位で記録される。
%Tを付けるとリクエストを扱うのにかかった時間が秒単位で記録される。
ボトルネックの解析や、チューニング後の効果測定に便利だ。

出力可能な項目の一覧
https://httpd.apache.org/docs/2.2/ja/mod/mod_log_config.html

##ユーザIDなど
LogFormatに %{user_id}n login=%{login}n などと記述した上で、アプリケーション側からデータを渡す。

PHPであれば以下のように書けばよい。

    apache_note('user_id', getUserID());
    apache_note('login', getLogin());

##ロードバランサ使用時のアクセス元のIP
LogFormatに %{X-Forwarded-For} と記述すればよい。ロードバランサによってはフィールド名が異なる可能性もあるが、awsのELBではこれで動いているし、このフィールド名を使うことが推奨されているようだ。


##まとめ（コピペ用）
以下のような設定で、実行時間、ユーザID、ログインID、ロードバランサのIPアドレスを記録できます。
```
<IfModule log_config_module>
    LogFormat "%h %D %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" user_id=%{user_id}n login=%{login}n \"%{X-Forwarded-For}i\" " combined
    CustomLog "logs/access_log" combined
</IfModule>
```

###ログの例（一部抜粋）
以下のログでは、user_id=123456　login=y-nishimuraのユーザがリクエストを送信しており、処理に10msかかった事が分かる。先頭に記録されているIPアドレスは（210.xxx.yyy.zzz）はロードバランサのもので、ユーザのIPは111.xxx.yyy.zzzです。

    210.xxx.yyy.zzz 10157 - - [14/Oct/2016:10:09:15 +0900] "GET index.php?xxx=yyy HTTP/1.1" 200 8158 "http://example.com/index.php?xxx=zzz" "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko" user_id=123456 login=y-nishimura "111.xxx.yyy.zzz"

###ログの解析（重いやつを抽出）
awkを使うとレスポンスタイムが大きな行だけを簡単に取り出せる。

    awk '$2 >= 1000000' /var/log/httpd/access_log #1秒以上
    awk '$2 >= 10000000' /var/log/httpd/access_log #10秒以上
    awk '$2 >= 60000000' /var/log/httpd/access_log #1分以上
c++ builder / trap > 不正な浮動少数点演算 > 別の関数においてreturnしていない

```txt:動作環境
C++ Builder XE4
```

```Unit1.cpp
double __fastcall GetSomeValue1(int32_t bit)
{
    double res = 何かの関数()
}

double __fastcall GetSomeValue2(int32_t bit)
{
    double d0 = (double)bit;
    res = 何かの関数()
    return res;
}
```

上記のGetSomeValue2()の`double d0 = (double)bit;`において以下のエラーが出た。

> 不正な浮動少数点演算

doubleにキャストしているだけなのに。

色々試したところ、GetSomeValue1()において`return res;`がないことによる不具合だと分かった。

[関連Qiita記事](http://qiita.com/7of9/items/70c4faea3930704af9cc#float%E5%9E%8B%E9%96%A2%E6%95%B0%E3%81%ABreturn%E3%81%8C%E3%81%AA%E3%81%84%E6%99%82)

エラーが出たとき、該当行の前後を見ていたが、別の関数も見ないといけないとは。。。

> 反対に、このエラーが出た時は、関数のどこかでreturnを忘れている可能性がある。
最適計測プラン - OR機関誌10月号より

# これなに
[OR学会](http://www.orsj.or.jp/)の機関誌10月号[「**学生たちのOR**」特集](http://www.orsj.or.jp/e-library/elcorsj.html#6110)から、適当に最適化の問題をピックアップしてPythonで解いてみたいと思います。
準備として、pandas, pulp, ortoolpy が必要です。環境構築は、[組合せ最適化を使おう](http://qiita.com/Tsutomu-KKE@github/items/bfbf4c185ed7004b5721#%E3%82%BD%E3%83%95%E3%83%88%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)を参考にしてください。

# 最適計測プラン問題
論文「[ピラミッドの最適計測プランの作成](http://www.orsj.or.jp/archive2/or61-10/or61_10_648.pdf)」の問題を使わせてもらいましょう。

> 候補点に何台かのスキャナを設置して、レーザーでスキャンしデータを取得したい。スキャナ台数を最小にし、取得データ量を最大化せよ。

# 考え方
論文では、2段階で解いていますが、面倒なので、設置コストを10倍にして、1回で解くことにしましょう。

# Pythonで解く
まず、ランダムなデータを作成します。

```py3:python
import numpy as np
from pulp import *
from ortoolpy import addvar, addvars

n = 4 # 候補点数
np.random.seed(3)
a = np.random.rand(n, n).round(3)
a # データ量
>>>
array([[ 0.551,  0.708,  0.291,  0.511],
       [ 0.893,  0.896,  0.126,  0.207],
       [ 0.051,  0.441,  0.03 ,  0.457],
       [ 0.649,  0.278,  0.676,  0.591]])
```

```py3:python
d = np.random.randint(0, 2, (n, n))
d[np.diag_indices(n)] = 1
d # 計測可能性
>>>
array([[1, 1, 1, 0],
       [1, 1, 0, 1],
       [1, 0, 1, 1],
       [0, 1, 0, 1]])
```

定式化して解きます。

```py3:python
m = LpProblem()
x = addvars(n, cat=LpBinary) # 変数
m += lpSum(x)*10 - lpDot(a.sum(1), x) # 目的関数
for i in range(n):
    m += lpDot(d[:,i], x) >= 1 # 制約
m.solve()
[int(value(v)) for v in x]
>>>
[1, 0, 0, 1]
```

以上
救急車配置問題 - OR機関誌10月号より

# これなに
[OR学会](http://www.orsj.or.jp/)の機関誌10月号[「**学生たちのOR**」特集](http://www.orsj.or.jp/e-library/elcorsj.html#6110)から、適当に最適化の問題をピックアップしてPythonで解いてみたいと思います。
準備として、pandas, pulp, ortoolpy が必要です。環境構築は、[組合せ最適化を使おう](http://qiita.com/Tsutomu-KKE@github/items/bfbf4c185ed7004b5721#%E3%82%BD%E3%83%95%E3%83%88%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)を参考にしてください。

# 救急車配置問題
論文「[救急車再配置問題に対する遺伝的プログラミングを用いた効果的手法の設計](http://www.orsj.or.jp/archive2/or61-10/or61_10_644.pdf)」の問題を使わせてもらいましょう。
論文では、救急車再配置問題ですが、ここでは、救急車配置問題にします。

> 複数の地域に救急車を配置する。各地域には、配置可能な容量、需要量が定められる。また、移動は10分以内でないといけない。このとき、総移動時間を最小化せよ。

# 考え方
[p-メディアン問題](http://www.orsj.or.jp/~wiki/wiki/index.php/P-%E3%83%A1%E3%83%87%E3%82%A3%E3%82%A2%E3%83%B3%E5%95%8F%E9%A1%8C)なのでサクッと解きましょう。

# Pythonで解く
まず、ランダムなデータを作成します。

```py3:python
import numpy as np, pandas as pd
from pulp import *
from ortoolpy import addvar, addvars

n = 3 # 地域数
rn = range(n)
np.random.seed(2)
tm = (np.random.rand(n, n) * 20).round(0)
tm[np.diag_indices(n)] = 0
tm # 移動時間(分)
>>>
array([[  0.,   1.,  11.],
       [  9.,   0.,   7.],
       [  4.,  12.,   0.]])
```

```py3:python
cap = np.random.randint(2, 5, n)
cap # 容量
>>>
array([4, 2, 2])
```

```py3:python
dem = np.random.randint(2, 4, n)
dem # 需要
>>>
array([2, 3, 3])
```

変数表を作成します。このとき、移動時間が10分以上の変数は作成しないようにします。

```py3:python
a = pd.DataFrame(((i,j,dist[i,j]) for i in rn for j in rn
        if dist[i,j]<=10), columns=['From', 'To', 'Tm'])
a['Var'] = addvars(len(a))
a[:3]
```

<table>
  <thead>
    <tr>
      <th></th>
      <th>From</th>
      <th>To</th>
      <th>Tm</th>
      <th>Var</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0</td>
      <td>0</td>
      <td>0.0</td>
      <td>v1</td>
    </tr>
    <tr>
      <th>1</th>
      <td>0</td>
      <td>1</td>
      <td>1.0</td>
      <td>v2</td>
    </tr>
    <tr>
      <th>2</th>
      <td>1</td>
      <td>0</td>
      <td>9.0</td>
      <td>v3</td>
    </tr>
  </tbody>
</table>

定式化して解いてみましょう。

```py3:python
m = LpProblem()
m += lpDot(a.Tm, a.Var)
for i, t in a.groupby('From'):
    m += lpSum(t.Var) <= cap[i]
for i, t in a.groupby('To'):
    m += lpSum(t.Var) >= dem[i]
m.solve()
a['Val'] = a.Var.apply(value)
a[a.Val > 0]
```

<table>
  <thead>
    <tr>
      <th></th>
      <th>From</th>
      <th>To</th>
      <th>Tm</th>
      <th>Var</th>
      <th>Val</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0</td>
      <td>0</td>
      <td>0.0</td>
      <td>v1</td>
      <td>2.0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>0</td>
      <td>1</td>
      <td>1.0</td>
      <td>v2</td>
      <td>2.0</td>
    </tr>
    <tr>
      <th>3</th>
      <td>1</td>
      <td>1</td>
      <td>0.0</td>
      <td>v4</td>
      <td>1.0</td>
    </tr>
    <tr>
      <th>4</th>
      <td>1</td>
      <td>2</td>
      <td>7.0</td>
      <td>v5</td>
      <td>1.0</td>
    </tr>
    <tr>
      <th>6</th>
      <td>2</td>
      <td>2</td>
      <td>0.0</td>
      <td>v7</td>
      <td>2.0</td>
    </tr>
  </tbody>
</table>

以上
Yarn v0.15.1でプライベートリポジトリをインストールする方法

v0.16.0で普通にできるようになりました。
~~package.jsonに依存性のGit参照として`git+ssh`から始まるURLを書いた状態で、`yarn install`を行うと失敗します。
今後対応されるらしいですが、現状の対処方法がGitHubのissueにあったのでメモとして残しておきます。
ただし、この変更を行うと環境によっては`npm install`が失敗するようになるので、チーム全員Yarnに乗り換える必要があるかもしれません。~~

# 失敗するpackage.jsonの例

```json
{
  "name": "hoge",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "private-package": "git+ssh://git@host/user/private-repo.git"
  }
}
```

# 対処方法
## 1. 依存するリポジトリのURLを変更する
```diff
- git+ssh://git@host/user/private-repo.git 
+ ssh://host/user/private-repo.git
```

## 2. ~/.ssh/configに設定を追加する
```
Host bitbucket.org
    User git

Host github.com
    User git
```


# 参考
- https://github.com/yarnpkg/yarn/issues/513#issuecomment-253180666
UIKitのタブ移動を複数のタブに適用する方法

### 何がしたいか

これを見たら言わんとしていることが伝わるはず。伝われ。

http://codepen.io/qwe001/pen/bwKAXq

上のタブを押したときに、下のタブもあわせてタブ移動させたいってことです。
例えばモーダルウィンドウで、上部のタブを押すことで画面内の要素を表示/非表示することが出来るし、
下のほうにあるボタンを押しても同じことができるようにしたい、みたいなのってあるじゃないですか。

上のタブに uk-active クラスがついている時、下のタブの同様の要素にも uk-active クラスを付与する。
これをjQueryもjavascriptも使用せずに実現します。
使ったほうがもっと早いし、簡潔でわかりやすい気がしますが、
私にはそれを使ってはいけない事情があったので。茨の道です。

### 実装

```html
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/uikit/2.26.4/css/uikit.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/uikit/2.26.4/js/uikit.js"></script>
<div class="contents">
	<div class="header">
		<ul class="uk-tab" id="head-tabs" data-uk-switcher="{connect:'#id'}">
			<li class="uk-active">
				<a onclick="UIkit.switcher('#foot-tabs').show(0);">１つ目のタブ</a>
			</li>
			<li>
				<a onclick="UIkit.switcher('#foot-tabs').show(1);">２つ目のタブ</a>
			</li>
		</ul>
	</div>
	<div class="body">
		<ul id="id" class="uk-switcher">
			<li>
				<p>一つ目のコンテンツ</p>
			</li>
			<li>
				<p>二つ目のコンテンツ</p>
			</li>
		</ul>
	</div>
	<div class="footer">
		<ul class="uk-tab" id="foot-tabs" data-uk-switcher="{connect:'#id'}">
			<li class="uk-active">
				<a onclick="UIkit.switcher('#head-tabs').show(0);">１つ目のタブ</a>
			</li>
			<li>
				<a onclick="UIkit.switcher('#head-tabs').show(1);">２つ目のタブ</a>
			</li>
		</ul>
	</div>
</div>

```

### ポイント

タブ要素のaタグに次のようにonclickイベントを記述します。liタグとかに書いてもいいですけど

```html

<!-- ヘッダー部分の場合 -->
<a onclick="UIkit.switcher('#foot-tabs').show(0);">

<!-- フッダー部分の場合 -->
<a onclick="UIkit.switcher('#head-tabs').show(0);">

```

.show(0)というのが、data-uk-switcher属性のついている要素の、記述しているidに属する子要素の、最初の一つ目を示します。
.show(1)というのが、二つ目です。以上。

### おまけ

uk-switcher クラスのついた子要素は、iPhoneなどでスワイプするとタブ遷移します。
1番目のタブで右にスワイプすれば2番目のタブに切り替わる、逆もしかり。
これは uk-switcher クラスに uikit.css で
``` touch-action: cross-slide-y pinch-zoom double-tap-zoom; ```と書いてあるからです。

しかし、場合によってはスワイプ移動されるとむしろ困るケースってありますよね。
これを``` touch-action: none !important; ```などとしても、スワイプ動作を解除することはできません。
なので困った時はjQuery。以下のおまじないでスワイプをしないようにできます。
（これももしかするとUIKIT.jsだけで出来そうな気がする）

```html+js
<script src="https://code.jquery.com/jquery-1.12.4.js">
<script type="text/javascript">
  // 左右スワイプでタブが遷移するのを抑止
  $(window).load(function(){
      $('.uk-switcher').off('swipeRight swipeLeft');
  });
</script>
```
pythonでawsを弄りたい


環境

* MacOSX で弄りたい
* python2 と 3 がインストール済み
* pip もインストール済み


サンプル実行！

    $ python ./sample.py
	Traceback (most recent call last):
	  File "./sample.py", line 35, in <module>
	    import boto
	ImportError: No module named boto

あぁっと！
ライブラリインストール！

	$ pip install boto
	Collecting boto
	  Downloading boto-2.42.0-py2.py3-none-any.whl (1.3MB)
	    100% |████████████████████████████████| 	1.4MB 975kB/s
	Installing collected packages: boto
	Successfully installed boto-2.42.0

再びチャレンジ！

	$ python ./sample.py
	Traceback (most recent call last):
	  File "./sample.py", line 36, in <module>
	    import boto3
	ImportError: No module named boto3
	
あぁっと！
君たちはboto3をインストールしてもいい。


	$ pip install boto3
	Collecting boto3
	  Downloading boto3-1.4.1-py2.py3-none-any.whl (121kB)
	    100% |████████████████████████████████| 122kB 3.5MB/s
	Collecting botocore<1.5.0,>=1.4.1 (from boto3)
	  Downloading botocore-1.4.61-py2.py3-none-any.whl (2.7MB)
	    100% |████████████████████████████████| 2.7MB 501kB/s
	Collecting s3transfer<0.2.0,>=0.1.0 (from boto3)
	  Downloading s3transfer-0.1.8-py2.py3-none-any.whl (53kB)
	    100% |████████████████████████████████| 61kB 7.1MB/s
	Collecting jmespath<1.0.0,>=0.7.1 (from boto3)
	  Downloading jmespath-0.9.0-py2.py3-none-any.whl
	Collecting python-dateutil<3.0.0,>=2.1 (from botocore<1.5.0,>=1.4.1->boto3)
	  Downloading python_dateutil-2.5.3-py2.py3-none-any.whl (201kB)
	    100% |████████████████████████████████| 204kB 4.5MB/s
	Collecting docutils>=0.10 (from botocore<1.5.0,>=1.4.1->boto3)
	  Downloading docutils-0.12.tar.gz (1.6MB)
	    100% |████████████████████████████████| 1.6MB 866kB/s
	Collecting futures<4.0.0,>=2.2.0; python_version == "2.6" or python_version == "2.7" (from s3transfer<0.2.0,>=0.1.0->boto3)
	  Downloading futures-3.0.5-py2-none-any.whl
	Collecting six>=1.5 (from python-dateutil<3.0.0,>=2.1->botocore<1.5.0,>=1.4.1->boto3)
	  Downloading six-1.10.0-py2.py3-none-any.whl
	Installing collected packages: six, python-dateutil, docutils, jmespath, botocore, futures, s3transfer, boto3
	  Running setup.py install for docutils ... done
	Successfully installed boto3-1.4.1 botocore-1.4.61 docutils-0.12 futures-3.0.5 jmespath-0.9.0 python-dateutil-2.5.3 s3transfer-0.1.8 six-1.10.0

動いた！
【随時更新】Hexo まとめ（Node.js製のブログ型静的サイトジェネレーター）

個人的に静的サイトジェネレーターの中で、Hexoに興味があるので、まとめます。

随時、書き散らかして行きます。

---

# 公式

* [https://hexo.io/](https://hexo.io/)
* [公式ドキュメント](https://hexo.io/docs/)
* [Githubリポジトリ](https://github.com/hexojs/hexo)

# 概要と初歩
## インストール
```bash:bash
$ npm install -g hexo-cli
```

## ブログの初期構築（Setup）
```bash:bash
$ hexo init <folder>
$ cd <folder>
$ npm install
```

# デプロイ
## Github Pagesで運用する

* [所要時間3分!? Github PagesとHEXOで爆速ブログ構築してみよう！ | 株式会社LIG](https://liginc.co.jp/web/programming/server/104594)
* [静的ページジェネレータHexoで作成したブログをGitHub Pagesで公開する - Steel Dragon 14106](http://raimon49.github.io/2015/04/25/create-blog-with-hexo.html)
* [Hexo と GitHub Pages でブログ環境を構築して公開する - Qiita](http://qiita.com/bird_nitryn/items/5988a1efe47e0d47132b)

Github Pagesで運用する人が多いみたい。エンジニアさんが個人的なブログを書くのに手っ取り早いから喜ばれてるのだろうか。

## S3にデプロイ
* 
* [GitHub - nt3rp/hexo-deployer-s3: S3 deployer plugin for Hexo](https://github.com/nt3rp/hexo-deployer-s3)

# カスタマイズ
## sitemap.xml
* [GitHub - hexojs/hexo-generator-sitemap: Sitemap generator for Hexo.](https://github.com/hexojs/hexo-generator-sitemap)

## Youtube/ニコ動の埋め込み
* [GitHub - m80126colin/hexo-tag-owl: A tag about Hexo with media plug-in](https://github.com/m80126colin/hexo-tag-owl)

他にも、Vimeoや优酷にも対応しているとのこと。

## WordPressでいうところのカスタムポストタイプみたいなやつ

* [Custom Collections like Tags and Categories · Issue #938 · hexojs/hexo · GitHub](https://github.com/hexojs/hexo/issues/938)

特に複雑なことをする必要はないようだ。

## pubhubsubbub
* [GithubのWebhookでPubsubhubbubにPINGを送る方法 | Gazee](https://gazee.net/github/github-pubsubhubub-ping/)

GithubPagesでの運用に限定されるが、Webhookで出来るようだ。

## 関連記事
~~現状では、本文中のコンテンツを形態素解析して関連記事を生成する仕組みは望めない模様。タグの関連度ではかるのが現状のHexo流みたい。~~

2016年11月より、[hexo-related-popular-posts](https://www.npmjs.com/package/hexo-related-popular-posts)が形態素解析に対応したそうです。

* [関連記事を表示するHexoプラグインを作った | nkmk log](http://nkmk.github.io/blog/hexo-plugin-list-related-posts/)
* [Hexoで関連記事や人気記事を生成するプラグインを作った(hexo-related-popular-posts) - tea](https://tea3.github.io/p/hexo-related-popular-posts/)

# OGP
http://elleonard.github.io/nplus_doc/2016/11/26/engineering/ogp/
Atomのカーソルを丸くする styles.less

1. Atom メニューから「Stylesheet．．．」を開く
2. 下記のコードを末尾に追加し保存

```css:styles.less
atom-text-editor::shadow {
  .cursor {
    height: 10px !important;
    width: 10px !important;
    border: none;
    border-radius: 5px;
    margin-top: 6px;
    background-color: rgba(255, 255, 255, .9);
    box-shadow: 0px 0px 10px rgba(255, 255, 255, 1);
  }
}
```
技術英語 > with the statement "This page intentionally [left blank]." / I am open to your questions and comments

@ Code Complete (No. 14614 / 36077)

> with the statement "This page intentionally left blank."

This page <font color=red>is</font> intentionally left blank
が正しいような気がする。

意図的に空白にしている場合、上記の言い回しは使えそう。

<hr>
関連して思い出したのは

http://ejje.weblio.jp/content/be+open+to

> I am open to your questions and comments.

http://www.linguee.com/english-french/translation/i+am+open+to+your+questions.html

上記リンク先の右側のフランス語
> J'attends maintenant vos questions et vos commentaires. 

意訳「今、私はあなたの質問とコメントを待ってます。」

be open toのopenは
http://eow.alc.co.jp/search?q=open
> 【形】
> `11. 〔助言などを〕喜んで受け入れる、〔意見などに〕耳を傾ける

上記英語文の意訳としては
「質問やコメントを歓迎します」
もしくは
「質問やコメント受付中です」
Browserifyとwebpackで依存関係に対応したmakefile

この記事では、Browserifyとwebpackのビルドにmakefileを用い、依存関係に対応させてソース未編集時の不要な再バンドルをしない方法を紹介します。
makeはGNU Makeを利用しています。

なお、実用性を見出せないので9割程ネタです、こんな事も出来た程度で紹介します。

[GitHubのサンプルプロジェクトはこちら](https://github.com/wordijp/browserify-webpack-makefile-sample)


# 依存関係ファイルの取得方法

不要な再バンドルをさせない為には、バンドルファイルと依存関係のあるファイル(ソースファイル一式)が必要です、make時にこれらのtimestampを比較し、依存関係のあるファイルの方が新しければ再バンドルが必要と判断されて実行されます。

## C++では

古来より一般的なのがC・C++で-MMオプションを使って依存関係を取得し、dependファイルとして出力する方法です。

```cpp:main.cpp
#include "foo.h"
int main() {}
```

からは

```shell-session
$ gcc -MM main.cpp
main.o: main.cpp foo.h
```

という依存関係が取得できます、これを全.cppから取得すれば、各.cpp・h編集時に必要な.oだけリコンパイルされます。

## Browserify・webpackでは

ビルド後は成果物であるbundle.jsが直接出力されるので、それとの依存関係である.(t|j)s[x]一覧が必要です。
ソースディレクトリ内一覧を指定しても良いですが、ここでは必要な依存関係のあるファイルを取得して指定させます。


### Browserifyの場合

依存関係の取得には、module-depsを使います。

```shell-session
$ module-deps index.js
```

と実行すると必要なソースファイル・モジュールファイル情報がJSONとして出力されます、このJSONからファイルパス部分をパースすれば依存関係として利用できます。

ファイルパスはkey"file"に格納されています。

```json
[
  ...
  "file":"ここのファイルパス"
  ...
]
```

取得にはUNIXコマンドを利用します、

```shell-session
# json出力 | "file":".."部分を取り出す | ファイルパス部分を取り出す
$ module-deps index.js | grep -o '"file":"[^"]*"' | sed -e 's/.*:"\([^"]*\)"/ \1/g'
```

とすれば取得出来ますので、これをC・C++のdependファイルと同じフォーマットへと整えます。

```:dependファイル
bundle.js: 依存関係一覧
```


### webpackの場合

webpackの場合はwebpackにJSON出力用のオプションを指定します。

```shell-session
$ webpack --json
```

webpackのJSONでは、ファイルパスはkey"identifier"に格納されています。

```json
[
  ...
  "chunks": [
    ...
    "identifier": "ここのファイルパス",
    ...
  ]
  ...
  "modules": [
    ...
    "identifier": "ここのファイルパス",
    ...
  ]
]
```

webpackもUNIXコマンドにて

```shell-session
# json出力 | "file":".."部分を取り出す | ファイルパス部分を取り出す
$ webpack --json | grep -o '"identifier":[^"]*"[^"]*"' | sed -e 's/.*: "\([^"]*\)"/ \1/g'
```

と取得出来ますので、こちらもC・C++のdependファイルと同じフォーマットへと整えます。

```:dependファイル
bundle.js: 依存関係一覧
```


# make

上記の依存関係ファイル作成をdependタスクとしてmakefileへ登録・実行すれば、make時に必要時だけビルドされるようになります。

```shell-session
$ make depend
create depend file
$ make
browserify -o bundle.js index.js
$ make
make: Nothing to be done for 'all'.
```


# で、なんに使えるの？

僕にも分かりません(やってみたかっただけ！)。

フロントエンドのビルドなんて時間のかかるものでもないし、CIツールに導入して必要時だけ発火させるとかでしょうか、それでもbundleファイルをtrimしてhash値比較した方が確実だろうし、やっぱ使い道ないかも。


# 参考

[JavaScriptライブラリ/プロジェクトのファイルサイズの問題点を見つける方法#webpackを使っているプロジェクトで依存ツリーを見る](http://qiita.com/azu/items/7b54d614dc816780034a#webpack%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%A7%E4%BE%9D%E5%AD%98%E3%83%84%E3%83%AA%E3%83%BC%E3%82%92%E8%A6%8B%E3%82%8B)