OmniAICreator/Qiita-1.07M huggingface dataset:
powershellでCSV等の区切り文字があるファイルの数値列の合計を計算する

あるファイルがあり、以下のような中身だったとします。
これの３列目の数値の合計を計算する方法を考えます。


aaaa,bbbb,200,cccc 
dddd,eeee,300,ffff 
gggg,hhhh,400,iiii 
jjjj,kkkk,500,llll 

linuxの場合は、awkを使って以下のように計算できます。 

```bash
# cat test1a.txt | awk -F, '{sum += $3} END {print sum}'
1400
```

powershellの場合は以下で3列目の合計が計算できます。

```ps1

Get-Content .\test3.txt | %{$sum += [int]$_.split(",")[2]};$sum
```

もしくは

```ps1
Import-Csv .\test3.txt -header(1..4) | Select-Object "3" | %{$sum += [int]$_.3};$sum
```

**パターン１の解説**
%はforeachのエイリアスです。
foreach中は``$_``に一行づつ代入されます。
まず各行は,で区切られているので、``split``で分割します。
分割した行は配列として扱われます。
配列でいうとカンマ区切りの３列目はインデックス[2]です。
``$sum``に``$_``を加算していき、最後に``$sum``を表示します。
``$_``はそのままだと文字列として扱われるため、[int]でキャストしています。
区切り文字がカンマ以外の場合は、splitでその区切り文字を指定すればすぐに応用できます。

コマンドライン上で計算する場合は、このパターン１のほうが覚えやすいと思います。


**パターン２の解説**
Import-CSVコマンドレットを使います。
このコマンドレットはCSV扱うためのものです。
デフォルトだと先頭行が列名として扱われてしまうため、-headerオプションで列名を作成しています。
select-object以降を消して実行すると以下の結果になります。
列ごとにオブジェクト化されるようです。

```ps1

PS E:\work> Import-Csv .\test3.txt -header(1..4)

1                             2                             3                             4
-                             -                             -                             -
aaaa                          bbbb                          200                           cccc
dddd                          eeee                          300                           ffff
gggg                          hhhh                          400                           iiii
jjjj                          kkkk                          500                           llll
```

Select-Objectで列名3を取得しています。

$_.3で計算しているのは、以下のためです。  

``%{$_ | GetMember}``の結果

```ps1
Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
3           NoteProperty System.String 3=200
```
``$_.Get-Tyep()``の結果

```ps1

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    PSCustomObject                           System.Object
```

つまり``$_``のままだとPSCustomObjectとして扱われるため、この中のプロパティである3に
実際の数値がString型で格納されているため参照しているわけです。

パターン２で使用するimport-csvはすべてのカラムをオブジェクトに入れてくれるので
powershellスクリプトなどで、どのカラムも計算対象・処理対象になる等の場合に使用する場合は便利だと思います。
コマンドライン上である列の値の合計だけ出したいときはパターン１の単純にsplitで区切るやり方が簡単かと思います。
Windows2012でVPN環境(L2TP)の構築 (3)


# 1. はじめに
　今回は、パブリッククラウド環境(SoftLayer)でのファイルサーバーを構築します。
 パブリック環境ですので、セキュリティ対策が重要です。
 Windows2012ファイアウォールを使用して、VPN(L2TP/IPsec)で接続したユーザーだけがファイルサーバーを利用できるように設定します。
 また、ウィルス対策はSoftLayerが無償で提供している「McAfee VirusScan Enterprise 」を使用します。
   
# 2. Windows2012ファイアーウォールの設定
  パブリックプロファイル(受信の規則)の、「ファイル共有」ポートを閉じます。

<strong>・NetBIOS名前サービス（UDP 137） 
・NetBIOSデータグラム・サービス(UDP 138) 
・NetBIOSセッション・サービス(TCP 139)
・ダイレクト・ホスティングSMBサービス(TCP 445) </strong>

![02.png](http://www.seahorse-inc.com/QIITA/W2012L2TP-3/02.png)

まずは、<font color="red">UDP 137 から</font>
![03.png](http://www.seahorse-inc.com/QIITA/W2012L2TP-3/03.png)
<font color="blue">「プライベート」チェック⇒「適用」⇒「OK」</font>

<font color="red">UDP 138</font>
![04.png](http://www.seahorse-inc.com/QIITA/W2012L2TP-3/04.png)
<font color="blue">「プライベート」チェック⇒「適用」⇒「OK」</font>

<font color="red">TCP139</font>
![05.png](http://www.seahorse-inc.com/QIITA/W2012L2TP-3/05.png)
<font color="blue">「プライベート」チェック⇒「適用」⇒「OK」</font>

<font color="red">TCP445</font>
![06.png](http://www.seahorse-inc.com/QIITA/W2012L2TP-3/06.png)
<font color="blue">「プライベート」チェック⇒「適用」⇒「OK」</font>

<font color="red">UDP445</font>
![07.png](http://www.seahorse-inc.com/QIITA/W2012L2TP-3/07.png)
<font color="blue">「プライベート」チェック⇒「適用」⇒「OK」</font>

これで、ファイル共有関連のパブリック/ドメインのポートを閉じたので、VPNからの接続でないと、ファイル共有サービスへはアクセスできません。


　VPN経由のファイルサーバー機能だけを使いますので、使わないサービスのポートも閉じましょう。

以上で、ファイアーウォールを用いた、セキュアなファイルサーバー設定が完了です。

# 3. おわりに
簡易ですが、ファイアーウォールとウィルス対策はできました。
念のために、ポートが閉じられているかnmapやZenmapで確認してください。

<a href="http://qiita.com/Mitsu-Murakita/items/6cf9dc310ded6a6795c7">
前回へ「Windows2012でVPN環境(L2TP)の構築 (2)」</a>
JavaScriptで作るクライアントでは、ローカルのテキストファイルにログが残せないことが判りました

クライアントサイドJavaScriptでログをテキストファイルに残す方法にはどんな方法があるのか調べてみました。結果、クライアントからサーバにログをPOST（しサーバ側でテキストファイルに保存）する方法が一般的であることが判りました。

クライアント自身にログを残す方法を優先的に探したのですが、既存のロギング・フレームワークにそんな方法は見当たりませんでした。やはり、という感触です。

## クライアント

ロギングはlog4javascriptを使いました。ログを保存するサーバは、localhost:3000を指定しました。今回はクライアント装置と同じ装置をサーバに見立てています。

```html:main.html
<!DOCTYPE html>
<html>
    <head>
        <title>Example</title>
        <script type="text/javascript" src="js/log4javascript.js"></script>
        <script>
            //<![CDATA[
            var log = log4javascript.getLogger();
            
            var ajaxAppender = new log4javascript.AjaxAppender("http://localhost:3000/");
            ajaxAppender.setThreshold(log4javascript.Level.ERROR);
            log.addAppender(ajaxAppender);
            
            function log4jsTest() {
                log.trace("トレース・メッセージです");
                log.debug("デバッグ・メッセージです");
                log.info("情報メッセージです");
                log.warn("警告メッセージです");
                log.error("エラー・メッセージです");
                log.fatal("致命的故障メッセージです");
            }
            //]]>
        </script>
    </head>
    <body>
        <input type="button" value="log4js Test" onclick="log4jsTest()"/>
    </body>
</html>
```

## サーバ

サーバサイドはJavaScriptでなくてもいいのですが、今回はNode.jsで書いてみました。テキストファイルへの書き出し処理は省略しています。

```javascript:server.js
var Hapi = require('hapi');

var server = new Hapi.Server();
server.connection({ port: 3000 });

server.route({
    method: ['PUT', 'POST'],
    path: '/',
    handler: function (request, reply) {
        console.log(request.payload.timestamp);
        console.log(request.payload.logger);
        console.log(request.payload.level);
        console.log(request.payload.message);
        console.log(request.payload.url);

        reply('I did something!');
    }
});

server.start(function () {
    console.log('Server running at:', server.info.uri);
});
~                     
```
Compass + Bootstrap + CakePHP


> この記事は別サイトにて、'14年6月に作成したものです。

### 環境

Ruby が入っているPC ( 自分はMac OS X)


### 実際にCompass を導入

`bundler`にて

`gem "compass"`にて導入

もしくは [公式サイト](http://compass-style.org/install/)にある通りコマンドを叩く。

```bash
$ sudo gem update --system
$ sudo gem install compass
```

インストール後、
CakePHPの`app/webroot`にて、

```bash
$ compass create ./
```

を実行し、`config.rb`ファイルを作る。


###  `config.rb`ファイルを編集

```rb:config.rb

require 'bootstrap-sass'

# Set this to the root of your project when deployed:
http_path = "/"
css_dir = "css"
sass_dir = "sass"
images_dir = "img"
javascripts_dir = "js"
relative_assets = true

```

```bash
$ compass compile .
```

### bootstrap-sassをインストール

_README.mdの `b. Compass without Rails`を参考に_

```bash    
$ sudo gem install bootstrap-sass
```

で`bootstrap-sass`をインストール。

その後、`compass create ./`で作成した`config.rb`ファイルに、
    
```ruby:config.rb
require 'bootstrap-sass'
```

を追加。

そして、

```bash
$ bundle exec compass install bootstrap
```


を実行。

    directory app/webroot/css/fonts/bootstrap/ 
    directory app/webroot/js/bootstrap/ 
       create sass/styles.scss 
       create sass/_variables.scss 
       create app/webroot/js/bootstrap/affix.js 
       create app/webroot/js/bootstrap/alert.js 
       create app/webroot/js/bootstrap/button.js 
       create app/webroot/js/bootstrap/carousel.js 
       create app/webroot/js/bootstrap/collapse.js 
       create app/webroot/js/bootstrap/dropdown.js 
       create app/webroot/js/bootstrap/modal.js 
       create app/webroot/js/bootstrap/popover.js 
       create app/webroot/js/bootstrap/scrollspy.js 
       create app/webroot/js/bootstrap/tab.js 
       create app/webroot/js/bootstrap/tooltip.js 
       create app/webroot/js/bootstrap/transition.js 
       create app/webroot/css/fonts/bootstrap/glyphicons-halflings-regular.eot 
       create app/webroot/css/fonts/bootstrap/glyphicons-halflings-regular.svg 
       create app/webroot/css/fonts/bootstrap/glyphicons-halflings-regular.ttf 
       create app/webroot/css/fonts/bootstrap/glyphicons-halflings-regular.woff 
       remove .sass-cache/ 
       remove app/webroot/css/ie.css 
       remove app/webroot/css/print.css 
       remove app/webroot/css/screen.css 
       create app/webroot/css/ie.css 
       create app/webroot/css/print.css 
       create app/webroot/css/screen.css 
       create app/webroot/css/styles.css 
    
    To import your new stylesheets add the following lines of HTML (or equivalent) to your webpage:
    <head>
      <link href="app/webroot/app/webroot/css/styles.css" rel="stylesheet" type="text/css" />
    </head>


最後に書かれたタグの通り、

```ctp
echo $this->Html->css("style");
```

とCakeのctpファイルに記述して完了！あとはガシガシコーディングするだけです。
Inno Setupのプログレスバーをスクリプトで動かす

Inno SetupはPascal言語で色々いじれて面白いのですが、インストール中の進捗を示すプログレスバーをスクリプトから動かせなくて苦労しました。単純に

```pascal
WizardForm.ProgressGauge.Position := 25;
```

とかやっても動いてくれません。

```pascal
WizardForm.ProgressGauge.Min := 0;
WizardForm.ProgressGauge.Max := 100;
WizardForm.ProgressGauge.Position := 25;
```
のように、``Min``、``Max``も同時に指定すると動いてくれます。
組合せ最適化 - 典型問題 - ジョブショップ問題

[典型問題と実行方法](0f6c1a4415d196e64314)

##ジョブショップ問題

与えられた$n$個のジョブ$V=\\{1,\dots,n\\}$を$m$台の機械で処理する。1つの機械では、同時に1つのジョブしか処理できない。全てのジョブの終了時間を最小にするスケジュールを求めよ。
どのジョブに対しても機械の処理順序が決まっている場合、フローショップ問題という。

##実行方法(2機械フローショップ問題の例)

```text:usage
Signature: two_machine_flowshop(p)
Docstring:
2機械フローショップ問題
    2台のフローショップ型のジョブスケジュールを求める(ジョンソン法)
入力
    p: (前工程処理時間, 後工程処理時間)の製品ごとのリスト
出力
    処理時間と処理順のリスト
```

```python:python
from ortoolpy import two_machine_flowshop
two_machine_flowshop([(4, 3), (3, 1), (1, 4)])
```

```text:結果
(9, [2, 0, 1])
```

```python:python
# pandas.DataFrame
from ortoolpy.optimization import TwoMachineFlowshop
TwoMachineFlowshop('data/flowshop.csv')[1]
```

<table>
  <thead>
    <tr>
      <th></th>
      <th>first</th>
      <th>second</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>2</th>
      <td>1</td>
      <td>4</td>
    </tr>
    <tr>
      <th>0</th>
      <td>4</td>
      <td>3</td>
    </tr>
    <tr>
      <th>1</th>
      <td>3</td>
      <td>1</td>
    </tr>
  </tbody>
</table>

##データ
- [data/flowshop.csv](https://www.dropbox.com/s/cd8xt6x07bnzii1/flowshop.csv)
GolangでAPIを叩く

#初めてのGolang

GolangでAPIサーバを書こうと思い手始めにライブドアのWeatherHacksのAPIを叩いてみました。

Jsonパースはいろいろ大変そうなので、今回はデータ取得まで。

###コード

```go
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"
)

func main() {
	values := url.Values{}
	values.Add("city", "400040")
	resp, err := http.Get("http://weather.livedoor.com/forecast/webservice/json/v1" + "?" + values.Encode())

	if err != nil {
		fmt.Println(err)
		return
	}

	defer resp.Body.Close()

	execute(resp)
}

func execute(response *http.Response) {
	body, err := ioutil.ReadAll(response.Body)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(body))
}
```

###結果

```json
{"pinpointLocations":[{"link":"http://weather.livedoor.com/area/forecast/4020200","name":"\u5927\u725f\u7530\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/4020300","name":"\u4e45\u7559\u7c73\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/4020700","name":"\u67f3\u5ddd\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/4021000","name":"\u516b\u5973\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/4021100","name":"\u7b51\u5f8c\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/4021200","name":"\u5927\u5ddd\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/4021600","name":"\u5c0f\u90e1\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/4022500","name":"\u3046\u304d\u306f\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/4022800","name":"\u671d\u5009\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/4022900","name":"\u307f\u3084\u307e\u5e02"},{"link":"http://weather.livedoor.com/area/forecast/4044700","name":"\u7b51\u524d\u753a"},{"link":"http://weather.livedoor.com/area/forecast/4044800","name":"\u6771\u5cf0\u6751"},{"link":"http://weather.livedoor.com/area/forecast/4050300","name":"\u5927\u5200\u6d17\u753a"},{"link":"http://weather.livedoor.com/area/forecast/4052200","name":"\u5927\u6728\u753a"},{"link":"http://weather.livedoor.com/area/forecast/4054400","name":"\u5e83\u5ddd\u753a"}]

以下略
```
組合せ最適化 - 典型問題 - 集合分割問題

[典型問題と実行方法](0f6c1a4415d196e64314)

##集合分割問題

集合$M=\\{1,\dots,m\\}$の$n$個の部分集合$S_j(\subseteq M), j \in N=\\{1,\dots,n\\}$に対してコスト$c_j$が与えられているとする。コストの総和が最小となる$M$の分割$X(\subseteq N)$を求めよ。分割は、部分集合の中に同じ要素があってはいけない。

##実行方法

```text:usage
Signature: set_partition(n, cand)
Docstring:
集合分割問題
入力
    n: 要素数
    cand: (重み, 部分集合)の候補リスト
出力
    選択された候補リストの番号リスト
```

```python:python
# CSVデータ
import pandas as pd
from ortoolpy import set_partition
ss = pd.read_csv('data/subset.csv')
g = ss.groupby('id')
set_partition(len(g), [(r.weight.iloc[0], r.element.tolist()) for _, r in g])
```

```text:結果
[2, 3]
```

![set.gif](https://qiita-image-store.s3.amazonaws.com/0/13955/c9756e6c-00ac-63ef-b908-a4821f66fb00.gif)

```python:python
# pandas.DataFrame
from ortoolpy.optimization import SetPartition
SetPartition('data/subset.csv')
```

<table>
  <thead>
    <tr>
      <th></th>
      <th>id</th>
      <th>weight</th>
      <th>element</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>4</th>
      <td>2</td>
      <td>1.0</td>
      <td>a</td>
    </tr>
    <tr>
      <th>5</th>
      <td>2</td>
      <td>NaN</td>
      <td>d</td>
    </tr>
    <tr>
      <th>6</th>
      <td>3</td>
      <td>3.0</td>
      <td>b</td>
    </tr>
    <tr>
      <th>7</th>
      <td>3</td>
      <td>NaN</td>
      <td>c</td>
    </tr>
  </tbody>
</table>

```python:python
# サンプルデータ
from ortoolpy import set_partition
set_partition(4, [(1, ('a', 'b')), (1, ('a', 'c')), (1, ('a', 'd')), (3, ('b', 'c'))])
```

```text:結果
[2, 3]
```

##データ
- [data/subset.csv](https://www.dropbox.com/s/lfr0wsxj6gc1vc4/subset.csv)
組合せ最適化 - 典型問題 - 集合被覆問題

[典型問題と実行方法](0f6c1a4415d196e64314)

##集合被覆問題

集合$M=\\{1,\dots,m\\}$の$n$個の部分集合$S_j(\subseteq M), j \in N=\\{1,\dots,n\\}$に対してコスト$c_j$が与えられているとする。コストの総和が最小となる$M$の被覆$X(\subseteq N)$を求めよ。被覆は、部分集合の中に同じ要素があってもよい。

##実行方法

```text:usage
Signature: set_covering(n, cand, is_partition=False)
Docstring:
集合被覆問題
入力
    n: 要素数
    cand: (重み, 部分集合)の候補リスト
出力
    選択された候補リストの番号リスト
```

```python:python
# CSVデータ
import pandas as pd
from ortoolpy import set_covering
ss = pd.read_csv('data/subset.csv')
g = ss.groupby('id')
set_covering(len(g), [(r.weight.iloc[0], r.element.tolist()) for _, r in g])
```

```text:結果
[0, 1, 2]
```

![set.gif](https://qiita-image-store.s3.amazonaws.com/0/13955/7e7da75b-1c85-d781-9732-0cab66151afc.gif)

```python:python
# pandas.DataFrame
from ortoolpy.optimization import SetCovering
SetCovering('data/subset.csv')
```

<table>
  <thead>
    <tr>
      <th></th>
      <th>id</th>
      <th>weight</th>
      <th>element</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0</td>
      <td>1.0</td>
      <td>a</td>
    </tr>
    <tr>
      <th>1</th>
      <td>0</td>
      <td>NaN</td>
      <td>b</td>
    </tr>
    <tr>
      <th>2</th>
      <td>1</td>
      <td>1.0</td>
      <td>a</td>
    </tr>
    <tr>
      <th>3</th>
      <td>1</td>
      <td>NaN</td>
      <td>c</td>
    </tr>
    <tr>
      <th>4</th>
      <td>2</td>
      <td>1.0</td>
      <td>a</td>
    </tr>
    <tr>
      <th>5</th>
      <td>2</td>
      <td>NaN</td>
      <td>d</td>
    </tr>
  </tbody>
</table>

```python:python
# サンプルデータ
from ortoolpy import set_covering
set_covering(4, [(1, ('a', 'b')), (1, ('a', 'c')), (1, ('a', 'd')), (3, ('b', 'c'))])
```

```text:結果
[0, 1, 2]
```

##データ
- [data/subset.csv](https://www.dropbox.com/s/lfr0wsxj6gc1vc4/subset.csv)
組合せ最適化 - 典型問題 - 巡回セールスマン問題

[典型問題と実行方法](0f6c1a4415d196e64314)
##巡回セールスマン問題
n個の点(都市)の集合$V$から構成されるグラフ$G=(V,E)$および各辺に対するコストが与えられているとき、全ての点を1回ずつ経由する巡回路で辺上の（距離などの）コストの和を最小にするものを求めよ。

##実行方法

```text:usage
Signature: tsp(nodes, dist=None, method=None)
Docstring:
巡回セールスマン問題
入力
    nodes: 点(dist未指定時は、座標)のリスト
    dist: (i,j)をキー、距離を値とした辞書
    method: 計算方法(ex. 'ortools')
出力
    距離と点番号リスト
```

```python:python
from ortoolpy import tsp
tsp([(2, 0), (1, 2), (0, 1), (3, 1), (2, 2)])[1]
```

```text:結果
[0, 2, 1, 4, 3]
```

```python:python
# pandas.DataFrame
from ortoolpy.optimization import Tsp
Tsp('data/node1.csv')[1]
```

<table>
  <thead>
    <tr>
      <th></th>
      <th>id</th>
      <th>x</th>
      <th>y</th>
      <th>demand</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0</td>
      <td>5</td>
      <td>1</td>
      <td>0</td>
    </tr>
    <tr>
      <th>3</th>
      <td>3</td>
      <td>1</td>
      <td>0</td>
      <td>1</td>
    </tr>
    <tr>
      <th>5</th>
      <td>5</td>
      <td>0</td>
      <td>4</td>
      <td>1</td>
    </tr>
    <tr>
      <th>2</th>
      <td>2</td>
      <td>1</td>
      <td>5</td>
      <td>1</td>
    </tr>
    <tr>
      <th>1</th>
      <td>1</td>
      <td>8</td>
      <td>5</td>
      <td>1</td>
    </tr>
    <tr>
      <th>4</th>
      <td>4</td>
      <td>8</td>
      <td>0</td>
      <td>1</td>
    </tr>
  </tbody>
</table>

### Google OR-Toolsのソルバーを使う方法

「`method='ortools'`」をつけると、 [Google OR-Tools](https://developers.google.com/optimization/) のソルバー（近似解法）を使います。

#### 注意

- `pip install ortools`で Google OR-Tools をインストールしてください。
- 距離行列（`dist`）の要素は整数にしてください。

```python:python
import numpy as np
from scipy.spatial import distance
from ortoolpy import tsp
np.random.seed(0)
nodes = np.random.rand(20, 2) * 1000  # 20都市
dist = distance.cdist(nodes, nodes).astype(int)  # 距離行列
print(tsp(nodes, dist, method='ortools'))  # 近似解法
print(tsp(nodes, dist))  # 厳密解法（参考）
```

コストの総和（4099）は、2行目の厳密解（4072.0）より大きくなっています。

```text:結果（コストの和と点番号のリスト）
(4099, [0, 11, 3, 6, 9, 10, 19, 4, 5, 18, 1, 14, 7, 17, 12, 8, 13, 15, 2, 16])
(4072.0, [0, 2, 16, 14, 7, 17, 12, 8, 13, 15, 11, 3, 6, 9, 10, 19, 4, 5, 1, 18])
```

##データ
- [data/node1.csv](https://www.dropbox.com/s/pbs3odp3fpiacny/node1.csv)
MySQLで重複する行を削除する

# ケース1：id以外の全カラムが一致する行があるとき、1個を残して削除する方法

例：

```
+----+-----------+-------+
| id | name      | price |
+----+-----------+-------+
|  1 | りんご    |   100 |
|  2 | りんご    |   200 |
|  3 | バナナ    |   250 |
|  4 | バナナ    |   250 |    ←削除したい
|  5 | ぶどう    |   100 |
|  6 | ぶどう    |   100 |    ←削除したい
|  7 | ぶどう    |   120 |
+----+-----------+-------+
```

削除するSQL：

``` 
DELETE FROM fruits WHERE id NOT IN (SELECT min_id from (SELECT MIN(id) AS min_id FROM fruits GROUP BY name, price) AS tmp);
```

実行後：

```
+----+-----------+-------+
| id | name      | price |
+----+-----------+-------+
|  1 | りんご    |   100 |
|  2 | りんご    |   200 |
|  3 | バナナ    |   250 |
|  5 | ぶどう    |   100 |
|  7 | ぶどう    |   120 |
+----+-----------+-------+
```

# ケース2：全てのカラムが一致する行があるとき、1個を除いて削除する方法

例：

```
+-----------+-------+
| name      | price |
+-----------+-------+
| りんご    |   100 |
| バナナ    |   200 |
| りんご    |   100 |    ←削除したい
| ぶどう    |   300 |
| ぶどう    |   300 |    ←削除したい
| ぶどう    |   300 |    ←削除したい
+-----------+-------+

create table fruits2 (name varchar(100), price int);
insert into fruits2 (name, price) values ('りんご', 100);
insert into fruits2 (name, price) values ('バナナ', 200);
insert into fruits2 (name, price) values ('りんご', 100);
insert into fruits2 (name, price) values ('ぶどう', 300);
insert into fruits2 (name, price) values ('ぶどう', 300);
insert into fruits2 (name, price) values ('ぶどう', 300);
```

テンポラリテーブルとSELECT DISTINCTを使うのがいいかもしれない。
削除するSQL：

```
CREATE TEMPORARY TABLE fruits2_tmp AS SELECT DISTINCT * FROM fruits2;
DELETE FROM fruits2;
INSERT INTO fruits2 SELECT * FROM fruits2_tmp;
DROP TABLE fruits2_tmp;
```

実行後：

```
+-----------+-------+
| name      | price |
+-----------+-------+
| りんご    |   100 |
| バナナ    |   200 |
| ぶどう    |   300 |
+-----------+-------+
```

もっといいやり方があったら教えて下さい。
OracleだとROWIDを使ってケース1と同じやり方ができるのだけど。


# ケース3：指定カラムが重複する行を削除する場合

例：priceが重複する行を削除したい

```
+------------+-------+
| name       | price |
+------------+-------+
| りんご1    |   100 |
| りんご2    |   100 |    ←削除したい
| りんご3    |   200 |
| りんご4    |   200 |    ←削除したい
| りんご5    |   200 |    ←削除したい
+------------+-------+

create table fruits3 (name varchar(100), price int);
insert into fruits3 (name, price) values ('りんご1', 100);
insert into fruits3 (name, price) values ('りんご2', 100);
insert into fruits3 (name, price) values ('りんご3', 200);
insert into fruits3 (name, price) values ('りんご4', 200);
insert into fruits3 (name, price) values ('りんご5', 200);
```

テンポラリテーブルとSELECT GROUP BYを使えばできる。

削除するSQL：

```
CREATE TEMPORARY TABLE fruits3_tmp AS SELECT MIN(name), price FROM fruits3 GROUP BY price;
DELETE FROM fruits3;
INSERT INTO fruits3 SELECT * FROM fruits3_tmp;
DROP TEMPORARY TABLE fruits3_tmp;
```

実行後：

```
+------------+-------+
| name       | price |
+------------+-------+
| りんご1    |   100 |
| りんご3    |   200 |
+------------+-------+
```
NGINX + php-fpm + wordpress (110: Connection timed out)

表示までにかなり時間がかかっていた為、久々にログを見たら下記のようなエラーが頻発

```lang:nginx-error.log
  [error] 18898#0: *7866945 upstream timed out (110: Connection timed out) while reading response header from upstream, client: xxx.xxx.xxx.xxx
```

エラーの出力は、タイムアウトの時間を伸ばせば軽減できた。

```lang:php.ini
    max_execution_time 300;
```

```lang:www.conf
    request_terminate_timeout 300;
```

```lang:nginx.conf
    fastcgi_read_timeout 300;
```

が、表示速度問題には全く関係ありません。

結果的には、使用していなかったプラグインが悪さをしてたので、プラグインを停止して解決。
[ConoHa API] PhoneGapでスマホアプリ化する

## PhoneGap (Cordova) をインストールする
以下のページを参考に、PhoneGap環境をインストールします。


[ハイブリッドアプリ開発といえばこれ！PhoneGap/Cordova事始め](https://html5experts.jp/fenomas/7672/)

また、Android / iOSのビルドのためにはそれぞれの開発環境が必要です。これが大変な場合はクラウドの「PhoneGap Build」を使用すると便利だそうです。


## 環境作成

それではサクッとスマホアプリ化します。

まずはプロジェクトを作成します。

```
$ cordova create ConoHa_cordova_sample
```

次にプラットフォームの追加を行います。

```
$ cd ConoHa_cordova_sample/
$ cordova platform add android
$ cordova platform add ios
```

Androidの実機をつないで以下のコマンドを実行すると端末上でサンプルアプリが起動します。

```
$ cordova run android
```

iOSは以下のとおりです。

```
$ npm install -g ios-sim
$ cordova run ios
```

こんな感じの画面です。

![ios01.png](https://qiita-image-store.s3.amazonaws.com/0/85105/dbfe7d44-0f01-71c6-ae8a-f0c726cc0787.png)


## 作成したコードを入れる

プロジェクトディレクトリ/www/ に今まで作成したhtmlを入れるとそのままスマホアプリとなります。早速先日作ったservers04.htmlをindex.htmlに入れ替えてみましょう。

そして "cordova run android" もしくは　"cordova run ios"を実行すると。。。

![ios02.png](https://qiita-image-store.s3.amazonaws.com/0/85105/b8c7d3e2-59ae-20cb-565f-2d70c628c04d.png)

なんにも手を加えずにブラウザ上と同じ動作が得られました！！


動作するコードは[ここ](https://github.com/OttyLab/Conoha_cordova_sample)にあります。


## 課題

スマホアプリ化して気づいたことが２点ほどあります。

1. リロードボタンがない
2. ユーザー名、パスワード等がハードコードされていて公開できない

ということで、今後はこの辺りを修正していきます。
CentOS6標準のgitでhttpからCloneしようとすると応答が無くなる

症状
------------------
CentOS6にyumでgitをインストールすると1.7.1とかなり古いVer.が入ります。
普通に使っている分には特に問題になりませんが、GitHubからcloneする際にhttpsではなく、httpを使うと応答が返ってこない問題があるため、注意が必要です。

### HTTPSは問題なく通る
```shell-session
[root@host1 git]# git --version
git version 1.7.1
[root@host1 tmp]# git clone https://github.com/bsmile/zabbix.git
Initialized empty Git repository in /tmp/zabbix/.git/
remote: Counting objects: 2846, done.
remote: Total 2846 (delta 0), reused 0 (delta 0), pack-reused 2846
Receiving objects: 100% (2846/2846), 544.23 KiB | 374 KiB/s, done.
Resolving deltas: 100% (1560/1560), done.
```

### HTTPだと応答が返ってこない
```shell-session
[root@host1 tmp]# git clone http://github.com/bsmile/zabbix.git
Initialized empty Git repository in /tmp/zabbix/.git/
止まる
```


原因
---------------------
~~素直にhttpsを使えば良い話ではありますが、~~折角なので調べてみました。
curlでgithub.comに問い合わせるとHTTPSにリダイレクトされている様子。ということで、gitリポジトリにある[Release note](https://github.com/git/git/tree/master/Documentation/RelNotes)を「redirect」でgrepしてみたところ、1.7.3.4にこんなのが。

```
* Smart HTTP transport used to incorrectly retry redirected POST  request with GET request.
```

折角なので複数Ver.を入れて実際に試してみました。

### 1.7.3.4の場合はHTTPでも正常に取得できる
```shell-session
[root@host1 git]# git --version
git version 1.7.3.4
[root@host1 tmp]# git clone http://github.com/bsmile/zabbix.git
Cloning into zabbix...
remote: Counting objects: 2846, done.
remote: Total 2846 (delta 0), reused 0 (delta 0), pack-reused 2846
Receiving objects: 100% (2846/2846), 544.23 KiB | 362 KiB/s, done.
Resolving deltas: 100% (1560/1560), done.
```

### 1.7.3.3の場合は応答が返ってこない
```shell-session
[root@host2 git]# git --version
git version 1.7.3.3
[root@host2 git]# git clone http://github.com/bsmile/zabbix.git
Cloning into zabbix...
止まる
```

ソースから入れている分には特に問題になりませんが、yumで入れた場合には覚えておくと嵌らずに済むかもしれませんね。
組合せ最適化 - 典型問題 - 最小費用流問題

[典型問題と実行方法](0f6c1a4415d196e64314)
##最小費用流問題
有向グラフ$G=(V,E)$において、各辺の容量と重みさらに節点の需要量が与えられたとき、各辺の容量を超過せずに各辺の流量に対する重みの総和が最小となるフローを求めよ。

- 各節点において、「流入量 - 流出量」は、需要量と等しい。
- 需要量が負の場合、供給量を表す。
- 全ての節点の需要量の和は0でなければいけない。

##実行方法

```text:usage
Signature: nx.min_cost_flow(G, demand='demand', capacity='capacity', weight='weight')
Docstring:
Return a minimum cost flow satisfying all demands in digraph G.

G is a digraph with edge costs and capacities and in which nodes
have demand, i.e., they want to send or receive some amount of
flow. A negative demand means that the node wants to send flow, a
positive demand means that the node want to receive flow. A flow on
the digraph G satisfies all demand if the net flow into each node
is equal to the demand of that node.
```

```python:python
# CSVデータ
import pandas as pd, networkx as nx
from ortoolpy import graph_from_table, networkx_draw
tbn = pd.read_csv('data/node0.csv')
tbe = pd.read_csv('data/edge0.csv')
g = graph_from_table(tbn, tbe, directed=True)[0]
result = nx.min_cost_flow(g)
for i, d in result.items():
    for j, f in d.items():
        if f: print((i, j), f)
```

```text:結果
(0, 1) 1
(0, 3) 1
(0, 4) 2
(4, 5) 1
```

```python:python
# pandas.DataFrame
from ortoolpy.optimization import MinCostFlow
MinCostFlow('data/node0.csv','data/edge0.csv')
```

<table>
  <thead>
    <tr>
      <th></th>
      <th>node1</th>
      <th>node2</th>
      <th>capacity</th>
      <th>weight</th>
      <th>flow</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0</td>
      <td>1</td>
      <td>2</td>
      <td>1</td>
      <td>1</td>
    </tr>
    <tr>
      <th>1</th>
      <td>0</td>
      <td>3</td>
      <td>2</td>
      <td>2</td>
      <td>1</td>
    </tr>
    <tr>
      <th>2</th>
      <td>0</td>
      <td>4</td>
      <td>2</td>
      <td>2</td>
      <td>2</td>
    </tr>
    <tr>
      <th>3</th>
      <td>4</td>
      <td>5</td>
      <td>2</td>
      <td>1</td>
      <td>1</td>
    </tr>
  </tbody>
</table>

```python:python
# 乱数データ
import networkx as nx
g = nx.fast_gnp_random_graph(8, 0.2, 1, True)
g.nodes[1]['demand'] = -2 # 供給
g.nodes[7]['demand'] = 2 # 需要
g.adj[2][7]['capacity'] = 1 # 容量
result = nx.min_cost_flow(g)
for i, d in result.items():
    for j, f in d.items():
        if f: print((i, j), f)
```

```text:結果
(1, 2) 2
(2, 3) 1
(2, 7) 1
(3, 7) 1
```

##データ
- [data/node0.csv](https://www.dropbox.com/s/7v4x2ypbgkj52vr/node0.csv)
- [data/edge0.csv](https://www.dropbox.com/s/2vryg0i2kb76mic/edge0.csv)
undefinedの性質

JavaScriptを使っていると、ほぼ確実にどこかで出くわすのが`undefined`です。この`undefined`ですが、いろいろと扱いに面倒な点があります。

# 前提
文章をわかりやすくするため、undefinedな「値」については、「Undefined値」というように大文字にして「値」を付けて書きます。一方で、識別子としてのものは`undefined`のように書きます。

# Undefined値となるもの
以下のようなものが、Undefined値を持つ・あるいは返すものです。もちろん、意図的にUndefined値を代入することもできます。

* 宣言だけで、何も代入されていない変数
* 実引数が渡されなかった、関数の仮引数
* `void 式`という形での、`void`演算子の実行結果
* `return`しなかった関数の返り値
* 存在しないプロパティへアクセスした場合の結果

## `undefined`という変数
じつは、`undefined`は**変数**です。ES3では`undefined`にUndefined値以外のものを代入できてしまったのですが、ES5ではグローバルな`undefined`は上書き不可となっています。ただし、ES5でもローカル変数として`undefined`を宣言することはできてしまうので、依然として注意が必要です。

確実にUndefined値が必要な場合、自分で何もしない変数・仮引数を用意する、あるいは`void`演算子を使う、という方法があります。

# Undefined値の特性
Undefined値は、以下のような特性を持っています。

```js:undefined.js

//何も代入しなければUndefined値
var u;

//文字列に変換すると「undefined」
console.log('' + u);

//数値に変換すると、NaN
console.log(u - 0);

//プロパティを参照しようとするとエラーになる
console.log(u.some_property);

// null == undefined
console.log(u == null);

// typeofを取ると「undefined」
console.log(typeof u);
```

なお、存在しないプロパティを参照しようとするとエラーになるのは、`null`とUndefined値だけに共通する性質です。
Zodiac FX

「手のひらOpenFlow hardware switch」な https://www.kickstarter.com/projects/northboundnetworks/zodiac-fx-the-worlds-smallest-openflow-sdn-switch をベータテスターで back したのですが、仲間を増やしたいので日本語で情報をまとめてみる。私視点で気になったポイントをピックアップ。

Linux + OVS ではない。

一番下周りは Atmel Software Framework を基本的には使っていて、Micrel KSZ8795 driver はスクラッチ。[FreeRTOS](http://www.freertos.org/)を動かして、3つのプロセスを動かす。スイッチングとOpenFlowとCLIの3つ。

4 ポートあるけど、コントローラとの接続に 1 ポート潰す感じになる予定。USB ポートは電源と CLI 用。ファームウェアも USB で流し込む。

VXLAN は、まだスコープに入っていない。

（追記）
改めてみたら、すっごい大事なことを書いていなくて、自分でも焦った。ちなみに現在は fund raise 成功して reward も配布済み、一般発売も現在行われていて、新機種も出るぐらいに進んでいます。

で、足りない情報というのは

Zodiac FX を入手すると、素朴に本体しか入っていません。解説の紙などは一切無い鬼仕様。使い方などの PDF やファームウェアは http://forums.northboundnetworks.com/ のフォーラムにあるので、そこから拾い出して使いましょう。
IE11でvwを使ったtransitionがうまくいかなかった

サンプルあります。
https://jsfiddle.net/lovalotta/mrnkq5fh/

問題は表題の通り。`left:0`から`left:10vw`に`transition`しようと試みたところ、IE11でのみトランジションが変な挙動でした。Chrome、Firefoxは問題なし。IE11の問題なのか、vwの仕様なのかは調べてないです。

解決法としては、`0(px)`から`10vw`にするのがいけなかったので、`0vw`から`10vw`にトランジションさせれば問題ないことがわかりました。おそらく同じ問題が`0vh`や、`0vmax`、`0vmin`でも起こると思われます。`0vh`から`10vmax`にトランジションするとどうなんだろうね！

いまMacから書いていてテストできてないので、同じように再現できるといいですね。
box-shadowをborder代わりに使う

サンプルあります → https://jsfiddle.net/lovalotta/2pu3ztmf/

![スクリーンショット 2015-07-10 22.42.47.png](https://qiita-image-store.s3.amazonaws.com/0/84193/d693d20f-6247-6b05-d069-8336b57a64c8.png)

`box-shadow`をあれこれ使うだけです。`border`を使うとwidthが増えたり、中身のwidthが減ったり面倒なことがありますが、そういうときに`outline`を使ったりしますよね。でもこれだと`border-radius`に対応してくれないので、丸いオブジェクトに対して使うのは気が引けます。

ということで`box-shadow`をぼかし0pxにして、拡大1pxなんかにすると、`outline`代わりになるかんじです。

```css
.foo{
  outline: 1px solid red;
}
.bar{
  box-shadow: 0 0 0 1px red;
  border-radius: 100%;
}
```

そんで、単純に`outline`のかわりにしてもつまらないので虹色にしてみました。以上です。
組合せ最適化 - 典型問題 - 最大流問題

[典型問題と実行方法](0f6c1a4415d196e64314)
##最大流問題
グラフ$G=(V,E)$の各辺$e_{ij}=(v_i,v_j)\in E$が容量$c_{ij}$をもつとき、始点$v_s \in V$(ソース)から終点$v_t \in V$(シンク)への総流量が最大となるフローを求めよ。

##実行方法

```text:usage
Signature: nx.maximum_flow(G, s, t, capacity='capacity', flow_func=None, **kwargs)
Docstring:
Find a maximum single-commodity flow.
```

```python:python
# CSVデータ
import pandas as pd, networkx as nx
from ortoolpy import graph_from_table, networkx_draw
tbn = pd.read_csv('data/node0.csv')
tbe = pd.read_csv('data/edge0.csv')
g = graph_from_table(tbn, tbe)[0]
t = nx.maximum_flow(g, 5, 2)
pos = networkx_draw(g)
nx.draw_networkx_edges(g, pos, width=3, edgelist
  =[(k1, k2) for k1, d in t[1].items() for k2, v in d.items() if v])
plt.show()
for i, d in t[1].items():
    for j, f in d.items():
        if f: print((i, j), f)
```

```text:結果
(0, 2) 2
(0, 3) 2
(1, 2) 2
(3, 2) 2
(4, 0) 2
(5, 0) 2
(5, 1) 2
(5, 4) 2
```

![mxf2.png](https://qiita-image-store.s3.amazonaws.com/0/13955/131972e8-ed5e-a074-0935-9221fea9dd2b.png)

```python:python
# pandas.DataFrame
from ortoolpy.optimization import MaximumFlow
MaximumFlow('data/edge0.csv', 5, 2)[1]
```

<table>
  <thead>
    <tr>
      <th></th>
      <th>node1</th>
      <th>node2</th>
      <th>capacity</th>
      <th>weight</th>
      <th>flow</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0</td>
      <td>2</td>
      <td>2</td>
      <td>4</td>
      <td>2</td>
    </tr>
    <tr>
      <th>1</th>
      <td>0</td>
      <td>3</td>
      <td>2</td>
      <td>2</td>
      <td>2</td>
    </tr>
    <tr>
      <th>2</th>
      <td>0</td>
      <td>4</td>
      <td>2</td>
      <td>2</td>
      <td>2</td>
    </tr>
    <tr>
      <th>3</th>
      <td>0</td>
      <td>5</td>
      <td>2</td>
      <td>4</td>
      <td>2</td>
    </tr>
    <tr>
      <th>4</th>
      <td>1</td>
      <td>2</td>
      <td>2</td>
      <td>5</td>
      <td>2</td>
    </tr>
    <tr>
      <th>5</th>
      <td>1</td>
      <td>5</td>
      <td>2</td>
      <td>5</td>
      <td>2</td>
    </tr>
    <tr>
      <th>6</th>
      <td>2</td>
      <td>3</td>
      <td>2</td>
      <td>3</td>
      <td>2</td>
    </tr>
    <tr>
      <th>7</th>
      <td>4</td>
      <td>5</td>
      <td>2</td>
      <td>1</td>
      <td>2</td>
    </tr>
  </tbody>
</table>

```python:python
# 乱数データ
import networkx as nx, matplotlib.pyplot as plt
from ortoolpy import networkx_draw
g = nx.random_graphs.fast_gnp_random_graph(10, 0.3, 1)
for i, j in g.edges():
    g.adj[i][j]['capacity'] = 1
t = nx.maximum_flow(g, 5, 6)
pos = networkx_draw(g, nx.spring_layout(g))
nx.draw_networkx_edges(g, pos, width=3, edgelist
  =[(k1, k2) for k1, d in t[1].items() for k2, v in d.items() if v])
plt.show()
```

![mxf.png](https://qiita-image-store.s3.amazonaws.com/0/13955/4017dbeb-c1a3-c104-1fbb-339495ddea01.png)

##データ
- [data/node0.csv](https://www.dropbox.com/s/7v4x2ypbgkj52vr/node0.csv)
- [data/edge0.csv](https://www.dropbox.com/s/2vryg0i2kb76mic/edge0.csv)
カスタムキーボードで端末の向きを判定

カスタムキーボードで端末の向きを判定するTIPS

カスタムキーボード内ではUIDevice のorientation の値がうまく使えないため、ちょっと工夫が必要。

```objc:isPortrait
// 端末の向き判定
-(BOOL)isPortrait{
    return ([UIScreen mainScreen].bounds.size.width < [UIScreen mainScreen].bounds.size.height);
}
```

上記メソッドをUIInputViewController を継承したクラス内に追加すれば端末の状態の判定が可能。


参考:[How to detect Orientation Change in Custom Keyboard Extension in iOS 8?](http://stackoverflow.com/questions/24166878/how-to-detect-orientation-change-in-custom-keyboard-extension-in-ios-8)
before_action :authenticate_user!, only: :searchの意味

```rb
class TopController < ReviewController
  before_action :authenticate_user!, only: :search

  def index
    @products = Product.order('id ASC').limit(20)

  end

  def search
    @products = Product.where('title LIKE(?)' , "%#{params[:keyword]}%").limit(20)

  end

  def entry
    @product = Product.find(entry_params[:id])
  end

  def post
    Review.create(create_params)
    redirect_to action: :index
  end

  private
  def search_params
    params.permit(:keyword)
  end

  def entry_params
    params.permit(:id)
  end

  def create_params
    params.permit(:nickname, :product_id, :rate, :review)
  end
end
```
#before_actionや:authenticate_user!の使い方
あるボタンを押した時、ログインしていなければ他の画面に映るということ実行したい。
そこで使えるのが、:authenticate_use!である。

```rb
  before_action :authenticate_user!, only: :search
```
　ここで意味しているのは、サーチの時にだけ、アクションの前にログインしているかチェックしろということである。:authenticate_user!は自動でログイン画面(session_user)に移動してしまう。
組合せ最適化 - 典型問題 - 最短路問題

[典型問題と実行方法](0f6c1a4415d196e64314)
##最短路問題
グラフ$G=(V,E)$の各辺$e_{ij}=(v_i,v_j)\in E$が重み$a_{ij}$をもつとき、始点$v_s \in V$から終点$v_t \in V$への路の中で最も重みの和の小さいものを求めよ。

##実行方法

```text:usage
Signature: nx.dijkstra_path(G, source, target, weight='weight')
Docstring:
Returns the shortest path from source to target in a weighted graph G.
```

```python:python
# CSVデータ
import pandas as pd, networkx as nx
from ortoolpy import graph_from_table
tbn = pd.read_csv('data/node0.csv')
tbe = pd.read_csv('data/edge0.csv')
g = graph_from_table(tbn, tbe)[0]
print(nx.dijkstra_path(g, 5, 2))
```

```text:結果
[5, 4, 0, 2]
```

```python:python
# pandas.DataFrame
from ortoolpy.optimization import DijkstraPath
DijkstraPath('data/edge0.csv', 5, 2)
```

<table>
  <thead>
    <tr>
      <th></th>
      <th>node1</th>
      <th>node2</th>
      <th>capacity</th>
      <th>weight</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>9</th>
      <td>4</td>
      <td>5</td>
      <td>2</td>
      <td>1</td>
    </tr>
    <tr>
      <th>3</th>
      <td>0</td>
      <td>4</td>
      <td>2</td>
      <td>2</td>
    </tr>
    <tr>
      <th>1</th>
      <td>0</td>
      <td>2</td>
      <td>2</td>
      <td>4</td>
    </tr>
  </tbody>
</table>

```python:python
# 乱数データ
import networkx as nx
g = nx.fast_gnp_random_graph(8, 0.26, 1)
print(nx.dijkstra_path(g, 0, 2))
```

```text:結果
[0, 1, 6, 3, 5, 2]
```

![dij.png](https://qiita-image-store.s3.amazonaws.com/0/13955/aa764c18-1ae4-3e91-c5f4-569723ce9fa5.png)


##データ
- [data/node0.csv](https://www.dropbox.com/s/7v4x2ypbgkj52vr/node0.csv)
- [data/edge0.csv](https://www.dropbox.com/s/2vryg0i2kb76mic/edge0.csv)
組合せ最適化 - 典型問題 - 最小頂点被覆問題

[典型問題と実行方法](0f6c1a4415d196e64314)
##最小頂点被覆問題
無向グラフ$G=(V, E)$において頂点被覆$C$のうち重みの和が最小のものを求めよ。

##実行方法

```text:usage
Signature: min_node_cover(g, weight='weight')
Docstring:
最小頂点被覆問題
入力
    g: グラフ
    weight: 重みの属性文字
出力
    頂点リスト
```

```python:python
# CSVデータ
import pandas as pd, networkx as nx, matplotlib.pyplot as plt
from ortoolpy import graph_from_table, networkx_draw, min_node_cover
tbn = pd.read_csv('data/node0.csv')
tbe = pd.read_csv('data/edge0.csv')
g = graph_from_table(tbn, tbe)[0]
t = min_node_cover(g)
pos = networkx_draw(g, node_color='white')
nx.draw_networkx_nodes(g, pos, nodelist=t)
plt.show()
print(t)
```

```text:結果
[0, 2, 3, 5]
```

![mnc2.png](https://qiita-image-store.s3.amazonaws.com/0/13955/7733b3a6-f0c9-2233-3491-3c5493e8bcc1.png)

```python:python
# 乱数データ
import networkx as nx, matplotlib.pyplot as plt
from ortoolpy import min_node_cover, networkx_draw
g = nx.random_graphs.fast_gnp_random_graph(10, 0.3, 1)
l = min_node_cover(g)
pos = networkx_draw(g, nx.spring_layout(g), node_color='white')
nx.draw_networkx_nodes(g, pos, nodelist=l)
plt.show()
```

![mnc.png](https://qiita-image-store.s3.amazonaws.com/0/13955/6d7cb12b-ab4e-1c69-33a4-5c1018f2364e.png)

##データ
- [data/node0.csv](https://www.dropbox.com/s/7v4x2ypbgkj52vr/node0.csv)
- [data/edge0.csv](https://www.dropbox.com/s/2vryg0i2kb76mic/edge0.csv)
.bat（バッチファイル）で、10進数→n(2~16)進数変換を眺める

　特に意味が無いプログラム…見てﾆﾔｯとして（？）終わります。
　挙動は、是非ご覧になって確かめてください()

```lang:code
@echo off
setlocal enabledelayedexpansion
set /a n=1,a=0
mode con:lines=16
:top
set /a a+=1
set n=1
for /l %%i in (2,1,16) do set an%%i=
:a
set /a n+=1
:b
set loop=0
set ac=%a%
:c
set /a loop+=1
if %ac% lss %n% set x%loop%=%ac%& goto d
set /a x%loop%=ac%%n
set /a ac/=n
goto c
:d
set str=0123456789ABCDEF
call call set x%loop%=%%%%str:~%%x%loop%%%,1%%%%
set an%n%=!an%n%!!x%loop%!
set /a loop-=1
if %loop% neq 0 goto d

if %n% neq 16 goto a
cls
for /l %%i in (2,1,16) do (
set echon=%%i
if %%i leq 9 set echon=0%%i
echo !echon!進数…!an%%i!
)
goto top
```
Android Data Binding Libraryでandroid:onClickにBind

最近じわじわと来ている、AndroidでMVVMライクな体験ができるライブラリ [Data Binding Library] (https://developer.android.com/intl/ja/tools/data-binding/guide.html)ですが、.NETのWPFっぽくonClickにOnClickListenerをBindしようとするとエラーがでるという現象に遭遇しました。

２つ解決策を見つけたので記しておきます。解決策①が簡単です。

#したいこと
```xml
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="@{viewModel.hogeCommand}"/>
```
ViewModel側

```java
public class ViewModel {

    public View.OnClickListener getHogeCommand() {
    
        return hogeCommand;
    }
}
```

##解決策①
android:onClickの代わりにandroid:onClickListenerを使う

```xml
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClickListener="@{viewModel.hogeCommand}"/>
```

##解決策②
[Renamed Setters](https://developer.android.com/intl/ja/tools/data-binding/guide.html#renamed_setters) を使う
ViewModel側

```java
@BindingMethods({
    @BindingMethod(type = Button.class,
                attribute = "android:onClick",
                method = "setOnClickListener")
})
public class ViewModel {

    @BindingMethod(type = Button.class,
                attribute = "android:onClick",
                method = "setOnClickListener")
    public View.OnClickListener getHogeCommand() {
    
        return hogeCommand;
    }
}
```
コマンドでのipa作成 〜 UnityProject

#はじめに
Unity5でPro版の機能かと思っていたバッチコマンドが使えた。

#実行環境
 + Mac OS X
 + Unity5系

#UnityProjectからコマンドで
`hogehoge`Projectから書き出す、

##UnityProjectのバッチファイル

置き場所はEditorの下に
![スクリーンショット 2015-07-10 20.52.57.png](https://qiita-image-store.s3.amazonaws.com/0/12362/d6351138-de3f-d063-7cd6-efe91007ba71.png)

内容はこちらの設定を使わせていただきました。
http://sassembla.github.io/Public/2013:01:31%2017-47-32/2013:01:31%2017-47-32.html

```csharp:BuildBatch.cs
using UnityEngine;
using UnityEditor;
using System.Collections;

public class Batch : MonoBehaviour {

	// build iOS app
	private static void BuildiOS(){
		Debug.Log ("///////////	build start	///////////");
		
		
		string [] scene = {
			"Scenes/mainScene.unity"
		};
		string dstDevice = "Device";
		string dstSimulator = "Simulator";

		BuildOptions opt = BuildOptions.SymlinkLibraries | 
			BuildOptions.Development | 
				BuildOptions.ConnectWithProfiler | 
				BuildOptions.AllowDebugging;

		// set cheched
		EditorUserBuildSettings.symlinkLibraries = true;
		EditorUserBuildSettings.development = true;

		//set Build-target : Device
		PlayerSettings.iOS.sdkVersion = iOSSdkVersion.DeviceSDK;

		//BUILD for device
		string errorMsg_Device = BuildPipeline.BuildPlayer(scene, dstDevice, BuildTarget.iOS, opt);
		
		if(string.IsNullOrEmpty(errorMsg_Device)){
			Debug.Log("///////////	device build succeeded ///////////");
		} else {
			Debug.Log("///////////	device build failure	 ///////////");
			Debug.LogError(errorMsg_Device);
		}
		
		//set Build-target : Simulator
		PlayerSettings.iOS.sdkVersion = iOSSdkVersion.SimulatorSDK;
		
		// BUILD for simulator
		string errorMsg_Simulator = BuildPipeline.BuildPlayer(scene, dstSimulator, BuildTarget.iOS, opt);
		if (string.IsNullOrEmpty(errorMsg_Simulator)){
			Debug.Log("///////////	simulator build succeeded ///////////");
		} else {
			Debug.Log("///////////	simulator build failure ///////////");
			Debug.LogError(errorMsg_Simulator);
		}
	
	}

}
```

##Terminalから
```
$ /Applications/Unity/Unity.app/Contents/MacOS/Unity -projectPath "~/work/unity/hogehoge/" -quit -executeMethod BatchBuild.BuildiOS -logFile ~/build.log; cat ~/build.log
```

##

#さいごに
UnityのBuildSettingsから変更をかけるでなくコードからバージョンなどを再指定出来る機能が
Free版でもできるのが非常にありがたいと思いました。
問題のあるコミットを特定する ( git bisect )

# 内容
* 基本的な使い方は他の記事を参照してください。
    * [git bisect で問題箇所を特定する] (http://qiita.com/usamik26/items/cce867b3b139ea5568a6)
* しかし、ビルドが失敗するなど、テストがそもそも失敗した時の対応がどこにもまとめられていないので  
サマリ的な要素も含めてまとめてみます。
    * ぶっちゃけ`git bisect skip`の紹介と、  
`git bisect run`時にskipをさせるために`125`を返すということの紹介だけ。

# 基本的な使い方
## 手動

1. 開始
    * 基本

        ```
        $ git bisect start
        $ git bisect bad <bad commit>
        $ git bisect good <good commit>
        ```
    * ワンライナ
        `git bisect start <bad commit> <good commit>`
* 自動で中間のコミットがチェックアウトされた状態になる
* 成否を入力
    * 成功 `git bisect good`
    * 失敗 `git bisect bad`
    * テスト不能 `git bisect skip`
* 2.に戻る
    * 特定したら`git show`した時のような見た目になる

### 入力を間違えた場合
1. `git bisect log > <temporary file name>`を適当なファイルに保存
* 入力を間違えたところ以降を削除する
    * 恐らく最後の2行(コメント部分と実行したコマンド)
    * 間違えてない部分はそのままでもいいかも？(**要検証**)
* `git bisect reset`で一旦終了
* `git bisect replay <temporary file name>`でログの内容を再実行

## 自動

1. テストスクリプトを書く
    * 終了コードによってテストの結果が判定される

        |終了コード|意味|
        |----|----|
        |0|成功|
        |1〜128(125を除く)|失敗|
        |125|テスト不能|
* テスト開始処理(手動の時と同じなので割愛)
* テスト実行
    `git bisect run <script>`
* 特定したら`git show`した時のような見た目になる

# 参考記事
* [git-bisect](http://git-scm.com/docs/git-bisect)
* [git bisect で問題箇所を特定する](http://qiita.com/usamik26/items/cce867b3b139ea5568a6)
deploy the MVMs of gae / go


MVMSのgae/goをdeployするには、dockerが必要だったり、標準のgaeとはapp.yamlの設定が違ったりするので、手順をメモしておく。
だいたい公式の [Document](https://cloud.google.com/appengine/docs/managed-vms/getting-started#install_docker) の通りだが、微妙にずれているところがあったりする。
特にgae/goはややこしいことになっている。

# deploy the MVMs of gae / go

## Step1 [Install the Google Cloud SDK](https://cloud.google.com/appengine/docs/managed-vms/getting-started#install_the_google_cloud_sdk)

gcloudそのもののinstall方法は [Document](https://cloud.google.com/sdk/#Quick_Start) を参照

``` sh
$ gcloud components update

$ gcloud components update app
```

## Step2 [Install Docker](https://cloud.google.com/appengine/docs/managed-vms/getting-started#install_docker)



brewなどを利用して、docker, boot2dockerをinstallする
versionは1.4.1以上が必要

```sh
$ boot2docker version
```

boot2dockerが使っているdockerのupdateも忘れずに

```sh
$ boot2docker stop
$ boot2docker delete
$ boot2docker download
$ boot2docker init
$ boot2docker start
$ $(boot2docker shellinit)
```

[Document](https://cloud.google.com/appengine/docs/managed-vms/getting-started#preload_the_standard_runtime_images) では、MVMs用のDocker imageを先にpullしておくように書いてあるが、今はここにImageが無くて、持ってこれない。
とりあえず、やらなくても大丈夫だった。

```sh
$ docker pull gcr.io/google_appengine/python-compat
$ docker pull gcr.io/google_appengine/java-compat
$ docker pull gcr.io/google_appengine/go-compat
```

## Step3 app.yaml

MVMsではapp.yamlからapplication, versionの項目が削除された。


```app.yaml
vm: true
runtime: go
api_version: go1

manual_scaling:
  instances: 1
vm_settings:
  machine_type: n1-standard-1
  apt_get_install: redis-server vim

handlers:
- url: /.*
  script: _go_app

```

## Step4 Test and Deploy

本当はgcloudでTestやDeployができるのだけど、goだけできないから、[appcfg.pyでdeploy](https://cloud.google.com/appengine/docs/managed-vms/sdk#deploy)します。

```sh
$ appcfg.py update -A <application_id> -V <version> --oauth2 <application_root>
```

localでのTestはどうやるのかなーと思って、適当に試してみたけど、動いてくれなかった・・・。

# Option

deployするとDockerfileが生成されるので、カスマイズはこれをいじれば良さそう

```
# Dockerfile extending the generic Go image with application files for a
# single application.
FROM gcr.io/google_appengine/golang

COPY . /go/src/app
RUN go-wrapper download
RUN go-wrapper install -tags appenginevm
```

# Resource

今回試したソースは [Github](https://github.com/sinmetal/gae-go-mvm) に置いてる
コマンドでのipa作成 〜 archiveファイルから

#はじめに
build環境の自動化を検討するにあたってコマンドのオプション込みの使い方を
コマンドの Usageから毎度調べるのですが、それでも迷う時があり現段階では備忘用です。

##archiveファイルからipaを抜き出し
```vim
$ xcodebuild -exportArchive -archivePath [アーカイブファイルのパス] -exportProvisioningProfile [import済みのprovisioing Fileを指定] -exportPath [拡張子ipa抜きのパス]
```

##provisining Fileの差し替え

```
-exportProvisioningProfile <profilename>
```

に差し替えるprovisioning Fileを指定する

#さいごに
CircleCIが止まったり、な時の手動ビルド実行用までかければ良いなと :walking:
組合せ最適化 - 典型問題 - 最大カット問題

[典型問題と実行方法](0f6c1a4415d196e64314)
##最大カット問題
無向グラフ$G=(V, E)$において、各辺$e_{ij}=(v_i,v_j)\in E$に非負の重み$w_{ij}$が付与されているとする。このとき、$\sum_{v_i \in V_1, v_j \in V_2}{w_{ij}}$を最大にする$V_1, V_2(=V \setminus V_1)$を求めよ。

##実行方法

```text:usage
Signature: maximum_cut(g, weight='weight')
Docstring:
最大カット問題
入力
    g: グラフ(node:weight)
    weight: 重みの属性文字
出力
    カットの重みの合計と片方の頂点番号リスト
```

```python:python
# CSVデータ
import pandas as pd, networkx as nx, matplotlib.pyplot as plt
from ortoolpy import graph_from_table, networkx_draw, maximum_cut
tbn = pd.read_csv('data/node0.csv')
tbe = pd.read_csv('data/edge0.csv')
g = graph_from_table(tbn, tbe)[0]
t = maximum_cut(g)
pos = networkx_draw(g, node_color='white')
nx.draw_networkx_nodes(g, pos, nodelist=t[1])
plt.show()
print(t)
```

```text:結果
(27.0, [2, 4, 5])
```

![mct2.png](https://qiita-image-store.s3.amazonaws.com/0/13955/975dc334-69af-d61e-83c4-40221fa9bdac.png)

```python:python
# pandas.DataFrame
from ortoolpy.optimization import MaximumCut
MaximumCut('data/node0.csv','data/edge0.csv')[1]
```

<table>
  <thead>
    <tr>
      <th></th>
      <th>id</th>
      <th>x</th>
      <th>y</th>
      <th>demand</th>
      <th>weight</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>2</th>
      <td>2</td>
      <td>10</td>
      <td>5</td>
      <td>0</td>
      <td>1</td>
    </tr>
    <tr>
      <th>4</th>
      <td>4</td>
      <td>2</td>
      <td>2</td>
      <td>1</td>
      <td>2</td>
    </tr>
    <tr>
      <th>5</th>
      <td>5</td>
      <td>0</td>
      <td>5</td>
      <td>1</td>
      <td>1</td>
    </tr>
  </tbody>
</table>

```python:python
# 乱数データ
import networkx as nx, matplotlib.pyplot as plt
from ortoolpy import networkx_draw
g = nx.random_graphs.fast_gnp_random_graph(10, 0.3, 4)
for i, j in g.edges():
    g.adj[i][j]['weight'] = 1
t = maximum_cut(g)
pos = networkx_draw(g, nx.spring_layout(g), node_color='white')
nx.draw_networkx_nodes(g, pos, nodelist=t[1])
plt.show()
```

![mct.png](https://qiita-image-store.s3.amazonaws.com/0/13955/6b136ffc-e9cc-2918-8b02-6a62085cb370.png)

##データ
- [data/node0.csv](https://www.dropbox.com/s/7v4x2ypbgkj52vr/node0.csv)
- [data/edge0.csv](https://www.dropbox.com/s/2vryg0i2kb76mic/edge0.csv)