OmniAICreator/Qiita-1.07M huggingface dataset:
c => this.input = c

## タイトルのコードは、Reactを勉強している時に見かけた文法

```
<input type="text" placeholder="TODOを入力..." ref={c => this.input = c} />
```

> {c => this.input = c}

なんやねん、この記述！何を意味しとるかさっぱりわからん。

以下の説明を見つけて納得

```
// functionを使った書き方
function(c) {
  this.input = c;
}

// アロー関数省略なし
(c) => {
  this.input = c;
}

// 引数が1つの場合は()省略可
c => {
  this.input = c;
}

// ブロックが一行の場合こういった書き方もする
c => this.input = c;
```

はえー、そういうことやったんか！
PHPで期間を求める(備忘録)

```index.php
function day_diff($date1,$date2){
	// 日付をUNIXタイムスタンプに変換
	$timestamp1 = strtotime($date1);
	$timestamp2 = strtotime($date2);

	// 何秒離れているかを計算
	$seconddiff = abs($timestamp2 - $timestamp1);

	// 日数に変換
	$daydiff = $seconddiff / (60 * 60 * 24);

	// 戻り値
	return $daydiff;
}

$term = day_diff('2016-10-01','2016-12-01');

```
Gitから無視されていると感じた時のためのメモ

# 概要
長い間携わってるプロジェクトで久々に触ったファイルが
いくらファイルを修正してもGitに認識されない。

無視されたのかな？悲しいな？と思った時のためのメモ

# 確認すること・対応方法

### 仲間はずれ一覧に入れられていないか

`.ignore`ファイルに投げ込まれていないか確認しよう。
入れられてたら、泣きながらリストから削除しよう。

```
git status --ignored
```

### ローカルでのみ追跡から逃れようとしてないか

過去の自分がやましいことをして、ローカルでのみ追跡から逃れようとしていた場合に確認するコマンド

`git ls-files -v | grep ^h`
または
`git ls-files -v | grep ^S`

過去の自分の過ちを認め、Gitに再度見つけてもらうコマンド


`git update-index --no-assume-unchanged [path]/[file]`
または
`git update-index --no-skip-worktree [path]/[file]`

#### 2つの違いは？

こちらがくわしいです
[既に git 管理しているファイルをあえて無視したい
GitGit4403](http://qiita.com/usamik26/items/56d0d3ba7a1300625f92)
AWS CloudWatch LogsにPHPのエラーを分割せずに送信する


サーバ内にエージェントを設定してCloudWatch Logsにログデータを送信する時、デフォルト設定だとPHPのStack Traceのような複数行に渡るエラーログが分割されてインデックスされます。
![スクリーンショット 2016-12-27 11.49.40.png](https://qiita-image-store.s3.amazonaws.com/0/23936/88f70618-f6e2-7775-0a70-3bb352d2930d.png "スクリーンショット 2016-12-27 11.49.40.png")


このままだとメトリクスフィルターの設定やElasticsearch経由でのkibanaでの解析が非常にやりにくいので、設定ファイルを以下のように編集しましょう。

```/var/awslogs/etc/awslogs.conf
[/var/log/php-fpm/www-error.log]
datetime_format = %d/%b/%Y:%H:%M:%S %z
file = /var/log/php-fpm/www-error.log
buffer_duration = 5000
multi_line_start_pattern = {datetime_format}
log_stream_name = /var/log/php-fpm/www-error.log
log_group_name = as-CWLogs-1UQVD70TU0QZR
```
![スクリーンショット 2016-12-27 11.50.49.png](https://qiita-image-store.s3.amazonaws.com/0/23936/56849632-b5e8-03c1-9c9e-d24fe8431fba.png "スクリーンショット 2016-12-27 11.50.49.png")


１つにまとまりました。


`multi_line_start_pattern = {datetime_format}`を足すことで、タイムスタンプを基準にログを分割して送信するようになります。（デフォルト値は「^[^\s]'」）
正規表現も使える様子ですので、リファレンスを見ながら必要に応じてカスタマイズしてみると良いかなと思います。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/AgentReference.html
Android productFlavorのメモ

## flavor毎に異なるソースコード/リソースファイルを使用する

```
$ tree app/src/

app/src/
├── androidTest
├── ko
│   ├── java
│   │   └── model
│   │       └── Greeter.java
│   └── res
├── main
│   ├── AndroidManifest.xml
│   ├── java
│   │   └── com
│   │       └── example
│   │           └── flavor
│   │               └── MainActivity.java
│   └── res
├── otsu
│   ├── java
│   │   └── model
│   │       └── Greeter.java
│   └── res
└── test
```

```build.gradle

android {
    ...

    productFlavors {
        ko {
            applicationIdSuffix ".ko"
        }
        otsu {
            applicationIdSuffix ".otsu"
        }
    }
    sourceSets {
        ko {
            java.srcDirs = ['src/ko/java']
            res.srcDirs = ['src/ko/res']
        }
        otsu {
            java.srcDirs = ['src/otsu/java']
            res.srcDirs = ['src/otsu/res']
        }
    }

    ...
}
```

### src/main/

```MainActivity.java
package com.example.flavor;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import com.example.nobu.flavor.R;

import model.Greeter;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView textView = (TextView) findViewById(R.id.message);
        textView.setText(Greeter.message());
    }
}
```

```activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:paddingBottom="@dimen/activity_vertical_margin"
        tools:context="com.example.flavor.MainActivity">

    <TextView
            android:id="@+id/message"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
</RelativeLayout>
```

### src/ko

```Greeter.java
package model;

public class Greeter {

    public static String message() {
        return "Hello, world";
    }
}
```

### src/otsu

```Greeter.java
package model;

public class Greeter {

    public static String message() {
        return "こんにちは、世界!!";
    }
}
```

### src/koを使ってbuild

```
$ ./gradrew assembleKo
```

### src/otsuを使ってbuild

```
$ ./gradrew assembleOtsu
```
javascriptとの$ってなに

JSに触ったばかりですが書いていてよく気になるのが`$`というサイン。個人的には何か関数や変数を宣言しているときによく使われているといった感覚。

<a href="http://blog.node.ws/?p=760" target="_blank">「頭が$で始まる JavaScript の変数名―jQuery の命名則でドルマークを使う意味・由来」</a>という記事には

>… \$ doesn’t have any special meaning in JavaScript—it’s treated just like a letter of the alphabet. It’s simply a popular convention in jQuery code to use the $ prefix as a reminder that the variable contains a reference to a jQuery object … 

>(簡訳)…JavaScriptにおいて「\$」はなんら特別の意味は持たない。\$はアルファベットの1字とまったく同様に扱われる。慣例的にjQueryのコードでは、ある変数がjQueryオブジェクトへの参照を代入する変数名であることをわかりやすくするため、$を接頭辞として使っているに過ぎない。(jQuery Cookbook P107)

>jQueryオブジェクトの参照を保持する変数であることをわかりやすくするため、$で始まる変数名にしているわけです。

と書かれています。要するに明瞭化を目的とした単なるサインなんですね。

>現在の JavaScript の変数名で使える文字は『基本ユニコード文字は使えるが、（いわゆる）1byte文字のうちの英数字、アンダースコア(_)、ドル記号($)を除く文字は例外的に使えない（変数の先頭ではさらに数字も使えない）』と理解するのが正しいようです
Lua 覚え書き

気付いたこと。ぶち当たったことをつらつらと・・

#ターゲットとしているLuaのバージョンに有効なコードを書かないとダメ
## テーブルのインデックス最大数を取得する
table.maxn() は Lua5.1 で追加されたものだけど、Lua 5.3.3 などで使用すると

　　[attempt to call a nil value (field 'maxn')] 

とエラーが出る。

(*).stackoverflow の投稿より
[Missing functions in Table Library in Lua](http://stackoverflow.com/questions/31432034/missing-functions-in-table-library-in-lua)
tensorflowのubuntu jupyter virtualbox環境構築

#はじめに
ネット上、いろんな説がありすぎて、簡単な方法はあるかを検討。
#対象のOS
ubuntu 16.04 LTSを選択。
#周りのパッケージをインストール
## Guest Additionをインストール
virtualboxのデバイスメニューからインストールできる。
## pipをインストール
ここを参考(https://www.tensorflow.org/get_started/os_setup)
`$ sudo apt-get install python-pip python-dev`
#tensorflowをインストール
`$ pip install tensorflow`
#jupyterをインストール
`$ sudo pip --no-cache-dir install ipykernel jupyter matplotlib sklearn hmmlearn && python -m ipykernel.kernelspec`
#tensorflowを確認
##jupyterを起動
`$ jupyter notebook`
firefoxが起動される。

![image](https://qiita-image-store.s3.amazonaws.com/0/156797/0303538b-a9d7-767b-704b-f254dc4c5c7b.png)
##tensorflowを実行
新しいnotebookを作成する。

![image](https://qiita-image-store.s3.amazonaws.com/0/156797/2341874b-d04f-899b-2324-0a9bf9664787.png)
tensorflowのコードを書いて実行する。ここを参考(https://www.tensorflow.org/get_started/)

![image](https://qiita-image-store.s3.amazonaws.com/0/156797/b71f99ee-72d9-e079-2f11-69f35f8d7a88.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/156797/7337a715-090f-c693-c9a2-72dffb226349.png)
#結語
caffeよりインストールが簡単。次はうまく遊ぶこと。
C# ファイル保存のためのXMLシリアライズ - はじめのいっぽ

# やりたかったこと
- 簡易ログビューワーにて、アプリケーション起動時に前回開いていたファイルを読み込みたい。
- ファイル名はアプリケーションのプロパティとして扱いたくない。(というか、Windowsに痕跡を残したくない)

# 独自データはシリアライズを
シリアライズって何となく敷居が高いイメージがありますが、一度手を出せば簡単です。
自分はど忘れしていたので、改めていちからシンプルであろうやり方を行ったのでそのメモです。

# ソースコード（※必要な部分のみ抜粋）
```csharp
using System.IO;
using System.Xml.Serialization;

public class RFile
{
    public string FileName { get; set; }
}
public partial class Form1 : Form
{
    //独自データのファイルは、実行時のフォルダに固定名称で r.xml としておく
    static readonly string fileName = $@"{Application.StartupPath}\r.xml";
    RFile rFile = null;
    
    private void Form1_Load(object sender, EventArgs e)
    {
        if (File.Exists(fileName))
        {
            //独自データ読込
            XmlSerializer s = new XmlSerializer(typeof(RFile));
            StreamReader sr = new StreamReader(fileName, new System.Text.UTF8Encoding(true));
            rFile = (RFile)s.Deserialize(sr);
            sr.Close();
            logReader.ReadStart(rFile.FileName);
        }
        else
            rFile = new RFile();
    }
    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        logReader.ReadStop();

        //独自データ保存
        XmlSerializer s = new XmlSerializer(typeof(RFile));
        StreamWriter sw = new StreamWriter(rFileName, false, new System.Text.UTF8Encoding(true));
        s.Serialize(sw, rFile);
        sw.Close();
    }
}
```

# 参考サイト
- [オブジェクトの内容をXMLファイルに保存、復元する: .NET Tips: C#, VB.NET](http://dobon.net/vb/dotnet/file/xmlserializer.html)

以上
awscliでAWS_ACCOUNT_IDを確認

今はこれで取れるらしい

```
$ aws sts get-caller-identity

{
    "Account": "xxxxxxxxx", 
    "UserId": "xxxxxxxxxxxxxxx", 
    "Arn": "arn:aws:iam::xxxxxxxx:user/katsut"
}
```


でもやってみたら最初エラーになった。
cliのバージョンを上げたら実行できた。

```
$ sudo pip install awscli --ignore-installed six
```


```
$ aws --version

aws-cli/1.11.33 Python/2.7.10 Darwin/15.6.0 botocore/1.4.90
```


kinesisのarnにaccountIdがついてしまうのでちょっと便利だった
[JAWS-UG CLI] ハンズオン用VPC環境の削除

ハンズオンで利用したVPCを削除する手順です。

前提条件
========


EC2への権限
-----------

EC2に対してフル権限があること。


#1 セキュリティグループの削除

http://qiita.com/tcsh/items/aa80fc4a5461c38ea865

#2 ルートテーブルの紐付け解除

http://qiita.com/tcsh/items/f7291e50acbc9d9e5e75

#3 ルートテーブルの削除

http://qiita.com/tcsh/items/1ab97e630ebaff2485e0

#4 サブネットの削除

http://qiita.com/tcsh/items/171d07392ea1f4292279

#5 IGWのデタッチ、削除

http://qiita.com/tcsh/items/81006ffe436df3b584ea

#6 VPCの削除

http://qiita.com/tcsh/items/7d3bedeca10f5e52c962


# 完了
ファイル形式 Structured Text と Lotus 1-2-3 (.wk4) のデータ構造

#はじめに
Lotus Notes のデータ書き出しと呼び出し（読み込み）で使用される「ファイルの種類」のうち２種のデータ構造（ファイルフォーマット）を少々まとめてみました。

#データ構造
##Structured Text
ノーツからのデータ書き出し時に、文字コード（日本語版は「デフォルト文字セット」にすると SHIFT JIS）と文書の区切り（「用紙送り」は、文字コード 12 (0x0C)）を指定できます。基本的に可読テキストになり、メモ帳などで読めます。

（例）
Address:  東京都新宿区新宿１－１－１ 新宿レジデンス１０１
Name:  山田 一郎
DepName:  営業
 
Address:  東京都豊島区池袋１－１－１
Name:  山田 華子
DepName:  総務,経理

###文書構造
文書の各フィールドデータが1行 (0x0D0A 区切り) ずつ連続して出力され、改行＋文書の区切り（書き出し時に指定。既定では 0x0C）＋改行、で文書が区切られます。ファイルの末尾（これ以上文書がない）には、さらに改行が入ります。ビューから書き出した場合、ビューの列ではなく、ビューに表示されている（または選択した）文書のフィールドデータが出力されます。

####文書区切り

<行データ> 0D 0A 0D 0A 0D 0A 0C 0D 0A <次の文書のフィールド名>

####ファイルの最後

<行データ> 0D 0A 0D 0A 0D 0A 0C 0D 0A 0D 0A

###フィールド構造
1フィールドは次のような1行（0x0D0A 区切り）の構造です。複数値の場合は区切り文字（カンマなら0x2C）、文字列の改行は 0x00 です。データ型情報はなく、対応するフィールドの属性によって解釈されるようです。

<フィールド名> + 0x3A + 0x20 + 0x20 + <値> + 0x0D + 0x0A

ちなみに値が空の場合は

<フィールド名> + 0x3A + 0x20 + 0x20 + 0x0D + 0x0A

になります。

##Lotus 1-2-3 (.wk4)
[Lotus 1-2-3](https://ja.wikipedia.org/wiki/Lotus_1-2-3/) を使っておられたことがある方は、PC98世代の方でしょうか...Lotus 1-2-3 は、Windows や Excel が流行する前の代表的な表計算ソフトで、グラフを描画できマクロも使えたらしく Excel の元祖のようなもののようです。.wk4 形式のファイルは、この Lotus 1-2-3 の保存ファイル形式のひとつです。
こちらに情報があります (Many thanks!!)

- [http://www.mettalogic.co.uk/tim/l123/l123r4.html](http://www.mettalogic.co.uk/tim/l123/l123r4.html)
- [http://www.mettalogic.co.uk/tim/l123/](http://www.mettalogic.co.uk/tim/l123/)

[IBM 公式ページ](http://www-01.ibm.com/support/docview.wss?uid=nas8N1018297) にも、ほんの少し紹介があります。
SwiftLintの直し方がよくわからなかったルールまとめるとこ

Xcode 8.2, Swift 3.0

## Legacy Constructor Violation: Swift constructors are preferred over legacy convenience functions. (legacy_constructor)

```swift
// ×
flowLayout.sectionInset = UIEdgeInsetsMake(0, 8, 8, 8)

// ◯
flowLayout.sectionInset = UIEdgeInsets(top: 0.0, left: 8.0, bottom: 8.0, right: 8.0)
```

別のインスタンス化方法があるのにレガシーな方法を使っている

## Implicit Getter Violation: Computed read-only properties should avoid using the get keyword. (implicit_getter)

```swift
// ×
var hoge: String {
    get {
        return "fuga"
    }
}

// ◯
var hoge: String {
    return "fuga"
}
```

参考 [http://stackoverflow.com/questions/40327125/in-swift-3-uiedgeinsetsmake-is-available](http://stackoverflow.com/questions/40327125/in-swift-3-uiedgeinsetsmake-is-available)
【翻訳】scikit-learn 0.18 チュートリアル 目次

http://scikit-learn.org/0.18/tutorial/index.html を google翻訳した
[User Guide はこちら](http://qiita.com/nazoking@github/items/267f2371757516f8c168)

---

# scikit-learnチュートリアル

## [scikit-learnによる機械学習の紹介](http://qiita.com/nazoking@github/items/ae16bd4d93464fbfa19b)

  - 機械学習：問題の設定
  - サンプルデータセットの読み込み
  - 学習と予測
  - モデルの永続性
  - 規約

## [科学的データ処理のための統計学習のチュートリアル](http://qiita.com/nazoking@github/items/051911b0062a0bf48dc3)

  - [統計学習：scikit-learnにおける設定と推定器オブジェクト](http://qiita.com/nazoking@github/items/9eaf3d573098f8b58526)
  - [教師あり学習：高次元の観測からの出力変数を予測する](http://qiita.com/nazoking@github/items/062e7f9149ed23c0e096)
  - [モデル選択：推定量とそのパラメータの選択](http://qiita.com/nazoking@github/items/1c5106a844084cd8539a)
  - [教師なし学習：データの表現を求める](http://qiita.com/nazoking@github/items/34c53758f79eae233b67)
  - [すべてを一緒に入れて](http://qiita.com/nazoking@github/items/ffc840037c31c0f37171)
  - [ヘルプの検索](http://qiita.com/nazoking@github/items/44df68d5a372517205f9)

## [テキストデータの操作](http://qiita.com/nazoking@github/items/033ca2d0f4c63ebc165e)

  - チュートリアルセットアップ
  - 20のニュースグループデータセットを読み込む
  - テキストファイルからの特徴の抽出
  - 分類器のトレーニング
  - パイプラインの構築
  - テストセットのパフォーマンスの評価
  - グリッド検索によるパラメータチューニング
  - 演習1：言語の識別
  - 演習2：映画レビューの感情分析
  - 演習3：CLIテキスト分類ユーティリティ
  - 次は

## [適切な推定器を選択する](http://qiita.com/nazoking@github/items/de71ad4e50ab79d998e2)

## [外部リソース、ビデオ、トーク](http://qiita.com/nazoking@github/items/8cdaee4f4b5e7a9a64ce)

  - 科学的なPythonを初めてお使いですか？
  - 外部チュートリアル
  - ビデオ

---
**メモ**

Doctestモード
上のチュートリアルのコード例は、python-console形式で書かれています。これらの例をIPythonで簡単に実行するには、次のようにします。

```
％doctest_mode
```

IPython-consoleにあります。 `>>>` を手動で削除することを心配することなく、例をコピーしてIPythonに直接貼り付けることができます。

---
[User Guide はこちら](http://qiita.com/nazoking@github/items/267f2371757516f8c168)

©2010 - 2016、scikit-learn developers（BSDライセンス）。
DockerコンテナでGulpを動かす

# 状況

- PHPのプロジェクトだが、Gulpを使ってCSSの圧縮をしている
- 開発環境はDockerで構築している
- コンテナのオーケストレーションにはDocker Composeを使っている

# ディレクトリ構成

多少省略しているが、こんな感じ。

```
app
|-- index.php
|-- gulpfile.js          <-- これ
|-- docker-compose.yml
`-- docker
     |-- db
     |   |-- Dockerfile
     |   `-- my.cnf
     |-- nodejs
     |   `-- Dockerfile  <-- これ
     `-- web
         `-- Dockerfile
```


# やったこと

アプリ側はこんな感じ

```php:index.php
<html>
  <head>
    <link type="text/css" rel="stylesheet" href="/assets/css/style.min.css">
  </head>
</html>
```

下記の`gulpfile.js`を作成
簡略化しているので動かないかも

```js:gulpfile.js
var gulp = require('gulp');
var $ = require('gulp-load-plugins')();

gulp.task('watch', function() {
  return gulp.src('./**/*.scss')
    .pipe($.plumber())
    .pipe($.sass())
    .pipe($.pleeease({
      autoprefixer: {
        browsers: ['last 2 versions', 'android >= 4', 'ios >= 8']
      },
      minifier: true,
    }))
    .pipe(gulp.dest('public/assets/css'));
});
```

下記の`Dockerfile`を作成

```sh:docker/nodejs/Dockerfile
FROM node:latest

RUN npm install -g gulp

WORKDIR /app
CMD gulp watch
```

`docker-compose.yml`に追記

```yaml:docker-compose.yml
web:
    build: ./docker/web
    links:
        - db
    volumes:
        - ./:/app
    ports:
        - "8000:8000"

db:
    build: ./docker/db
    environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: hoge
        MYSQL_USER: hoge
        MYSQL_PASSWORD: hoge
        
nodejs:
    build: ./docker/nodejs
    volumes:
        - ./:/app
```

`volumes`で、gulpからファイルが操作できるようにしている。

# 使い方

```sh
docker-compose up -d
```

するだけで、`gulp watch`が走る。

初回起動時だけ、`node_modules`を入れるために

```
docker-compose run nodejs npm install
```

をする必要があるかもしれない。
windowsでjavaのencodingを変更

UTF8のソースをコンパイルしたときにエンコーディングエラーが出たとき
javacコマンドに都度 `-Dfile.encoding=UTF8` を渡すなどでも良いが、環境変数で設定して固定してよいなら


`JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8`

JAVA_TOOL_OPTIONSに値をセットすることでも対応。

# 参考サイト

* http://qiita.com/jacobiz/items/3fd54c5b697104904176
* http://stackoverflow.com/questions/361975/setting-the-default-java-character-encoding
railsにbootstrapを一瞬で適用させる

### 1.Gemfileに下記を入力

```ruby:Gemfile
gem 'therubyracer'
gem 'less-rails' 
gem 'twitter-bootstrap-rails' 
```

### 2. gemをインストールする

```ruby:terminal
$ bundle install
```

### 3.bootstrap関連のファイルをインストールする

```ruby:terminal
$ rails g bootstrap:install less
```

### 4.CSSを適用する

HogeクラスにCSSを適用したい場合

```ruby:terminal
$ rails g bootstrap:themed Hoge
```

## 終了！

### bootstrapを適用させるとこうなる

<img width="1143" alt="bs.png" src="https://qiita-image-store.s3.amazonaws.com/0/137894/2a8c8ee2-e438-ebea-7e30-09be620009fd.png">
carbon-cache + pypy でパフォーマンス改善

# はじめに

Graphite環境のパフォーマンス改善のために、carbon-cacheにpypyを使ってみたいと思います。（[pypyとは？](https://ja.wikipedia.org/wiki/PyPy)）

# インストール

今回の環境はCentOS 6です。ビルドしても良いかと思いましたが、epelにパッケージがありました。必要なのは以下の2つ。yum installもしくは、rpm -ivh しましょう。

```
pypy-2.0.2-2.el6.x86_64.rpm
pypy-libs-2.0.2-2.el6.x86_64.rpm
```

# carbon-cacheの再起動

単に再起動するだけですが、PYTHONPATHを通す必要があります。

```
$ export PYTHONPATH=/usr/lib64/python2.6/site-packages

$ pypy
Python 2.7.3 (5acfe049a5b0cd0de158f62553a98f5ef364fd29, Aug 09 2016, 09:31:00)
[PyPy 2.0.2 with GCC 4.4.7 20120313 (Red Hat 4.4.7-17)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>> import sys
>>>> from pprint import pprint
>>>> pprint(sys.path)
['',
 '/usr/lib64/python2.6/site-packages',
 '/usr/lib64/pypy-2.0.2/lib_pypy/__extensions__',
 '/usr/lib64/pypy-2.0.2/lib_pypy',
 '/usr/lib64/pypy-2.0.2/lib-python/2.7',
 '/usr/lib64/pypy-2.0.2/lib-python/2.7/lib-tk',
 '/usr/lib64/pypy-2.0.2/lib-python/2.7/plat-linux2',
 '/usr/lib64/pypy-2.0.2/site-packages']
>>>>
```

PATHが通ることを確認したら、再起動します。

```
python carbon-cache.py stop
pypy carbon-cache.py start
```

virtualenv環境で起動すると、zope.interface が import できないとエラーをはいて起動できませんでした。
調べてみると、zopeがimportできないことに起因するようで、単に`__init__.py`が存在しないだけ（？）でした。
同様のエラーが出る場合は、以下のようにするとよいでしょう。

```
touch virtualenv/graphite/lib/python2.6/site-packages/zope/__init__.py
```

# 結果

リリース前後で比較して、メモリの使用率はあがりましたが、cpu使用率、平均更新時間は下がりました。

![carbon-cache.png](https://qiita-image-store.s3.amazonaws.com/0/130972/8649f3dd-5bf2-aabd-55ed-cb1d5b0fe171.png)


この環境は、それほど高負荷ではなく、1分/5分/15分ごとに数千メトリクスの更新で、平均すると1分で1000メトリクス程度の更新ですが、
微妙に改善していることがわかりました。この状態でしばらく運用してみたいと思います。
Cognos Analytics 導入 & サンプルセットアップ手順書

**Cognos Analyticsの導入およびGOSALESサンプルのセットアップ手順書です。**

Cognos Analytics の導入及びサンプルセットアップ手順となります。
Windows 1ノード上に、Cognos Analytics Server、Content Store用のDB2をセットアップする、All in Oneの構成を想定しています。

##目次
1 Windows環境の導入条件の確認(Cognos)
2 windows上での導入実施
3 Windows環境の導入後の設定
4 CognosConfigurationを起動する
5 ContentStore接続設定
6 ContentStore作成
7 CognosConfigurationからCognosサービスの開始
8 Cognos Analyticsポータルへのアクセス確認
9 サンプルパッケージ導入
10 スクリプトを利用したDB2へのサンプルデータベースの復元
11 サンプルデータソースの接続構成
12 サンプルレポートのインポート
13 サンプルレポートを実行する

##手順書リンク
http://www.slideshare.net/ShinsukeYamamoto/cognos-analytics-70456864
Bash on Ubuntu on Windows の日本語表示を英語に切り替える

Windows 10 で Anniversary Update から使えるようになった **Bash on Ubuntu on Windows**。しかしながら、日本語を表示するとそれに続く文字の位置がずれるなど、日本語対応がまだまだです。
以下は、特に日本語に拘りはない場合に、Bash on Ubuntu on Windowsの表示を英語にするための手順です。

# 手順

##1) 現在のロケールを確認します

```bash:
$ echo $LANG
ja_JP.UTF8
```

**en_US.UTF8**になっていたら、既に英語表示になっているはずです

##2) ロケールを英語(US)に変更します

```bash:
$ sudo update-locale LANG=en_US.UTF8
```

パスワードを聞かれたら、Bash on Ubuntu on Windows をインストールした際に指定したパスワードを入力します

##3) Bash on Ubuntu on Windows を再起動します
Nginxにsslを導入する。

以下はNginxにsslを導入するにあたり実施したことです。

## 環境
CentOS 6.8
nginx 1.10.2
RapidSSL

## Nginxにsslを導入する流れ
0. 秘密鍵の作成
0. CSR（証明書署名要求）の作成・提出
0. サーバ証明書と中間CA証明書の結合
0. 秘密鍵・結合証明書のインストール
0. SSLの評価計測

### 1.秘密鍵の作成

サーバにて下記のコマンドを実行し、秘密鍵を作成

```
openssl genrsa -out [秘密鍵ファイル名] 2048
```

### 2.CSR（証明書署名要求）の作成・提出

サーバにて下記のコマンドを実行し、CSRを作成

```
openssl req -new -key [秘密鍵ファイル名] -out [CSRファイル名]
```

いろいろ聞いてくるので、入力

```
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Osaka
Locality Name (eg, city) [Default City]:Naniwa-ku Osaka-shi
Organization Name (eg, company) [Default Company Ltd]:会社名
Organizational Unit Name (eg, section) []:会社部門名、サービス名等
Common Name (eg, your name or your server's hostname) []:サーバホスト名
Email Address []:未入力
A challenge password []:未入力
An optional company name []:未入力
```

SSLサーバー証明書販売代理店にCSR提出

### 3.サーバ証明書と中間CA証明書の結合

認証後、サーバ証明書と中間CA証明書を入手し、結合する

※中間CA証明書は基本的に認証局ホームページからダウンロードできる

```
cat [サーバ証明書] [中間CA証明書] > [結合ファイル]
```

※結合後、中身を確認して下記部分が改行されていること確認する

```
-----END RSA PRIVATE KEY-----
-----BEGIN RSA PRIVATE KEY-----
```

### 4.秘密鍵・結合証明書のインストール

結合ファイルと秘密鍵の権限・所有者の変更

```
sudo chown root:root [結合ファイル]
sudo chmod 400 [結合ファイル]
sudo chown root:root [秘密鍵]
sudo chmod 400 [秘密鍵]
```

Nginxの設定ファイルの修正

```
server {
    listen 443 ssl;
    ssl_certificate [結合ファイルのフルパス];
    ssl_certificate_key [秘密鍵のフルパス];
    ...
}
```

Nginxのリスタート

```
sudo /etc/init.d/nginx restart
```

一応iptablesを確認して443が有効になってるかも確認。

この時点でブラウザ等からhttpsにて接続可能か確認してください。

### 5.SSLの評価計測
下記サイトで、SSLセキュリティの評価計測を行えます。
https://www.ssllabs.com/ssltest/

## 参考
[ジーライブ](http://blog.geelive-inc.com/archives/101)
Android WearのonDataChangedは「本当にデータが変更されている場合に」呼ばれる

スマホ（handheld）とWearの間で簡単なデータ（文字列とか）をやり取りしたい場合には`DataItem`を使用します。
`DataItem`でのデータの受け取りは`WearableListenerService`の`onDataChanged`で可能ですが、その中でハマったのでメモ。

# スマホからデータを送る方法
DataMapにデータを格納して送信します。
今回は、`sendMessage`としてクラス化しました。

```java:MainActivity.java
private void sendMessage(String path, String key, String value){
    PutDataMapRequest mapRequest = PutDataMapRequest.create(path);
    mapRequest.getDataMap().putString(key, value + System.currentTimeMillis());　//※注意
    Wearable.DataApi.putDataItem(googleApiClient, mapRequest.asPutDataRequest());
}
```

## 注意（ここが重要）：データは「本当にデータが変更されている場合に」Wear側が受け取ってくれる
単純にデータを送りたい場合（例：同じvalueを送り続けたい場合）は、
上記のようにcurrentTimeMillisで現在時刻のミリ秒を付加すると、常に異なるデータを送信可能です。

同じことでハマっていて対処している人がいました。
[StackOverFlow-WearableListenerService, onDataChanged() is not called](http://stackoverflow.com/questions/25141046/wearablelistenerservice-ondatachanged-is-not-called)

# Wear側でデータを受け取る方法
スマホ側から送られたデータは下記のようにしてonDataChangedで受け取ります。

```java:WearMainActivity.java
@Override
public void onDataChanged(DataEventBuffer dataEventBuffer) {
    DataItem dataItem = dataEventBuffer.get(0).getDataItem();
    DataMap dataMap = DataMapItem.fromDataItem(dataItem).getDataMap();
    vibrate(dataMap.getString("hoge"));
}
```

結構ハマったので悩みました…
以上。
ショートカットを活用しよう - 1 - F2

# <kbd><kbd>F2</kbd></kbd> の効果
多くのアプリケーションにおて、<kbd><kbd>F2</kbd></kbd> は、現在フォーカスのある項目を編集状態にします。

例えば、次のようなシチュエーションです。

- エクスプローラの左ペインにある、ツリービューでのノード名の編集
- エクスプローラの右ペインにある、リストビューでのアイテム名の編集
- Excelなどでのセルの編集

あっここ編集したい。っと思ったら、まずは <kbd><kbd>F2</kbd></kbd> を押してみるのがいいです。

以上

|前回|方針|次回|
|:--|:--:|--:|
|(なし)|[記事の方針](http://qiita.com/rrryutaro/items/74d60a6e31ff149c5710)|[<kbd><kbd>Ctrl</kbd> + <kbd>Insert</kbd></kbd>](http://qiita.com/rrryutaro/items/dd475cc8500fbac3f9af)|
ショートカットを活用しよう - 0 - 記事の方針

# はじめに
## 方針
- 本記事はシリーズとしていきます
- ~~ネタが続くまで、1営業日に最低1記事程度~~ 変更(2017/02/01):（投稿できる日のみで）
- 1記事で、1ネタとして、1分程度で読めるもの
- 書くことがあれば雑学も掲載予定

## 用語の扱い
自分は次のようにとらえていますので、その意図で記事を書いていきます。

<dl>
<dt>ショートカット</dt>
<dd>機能を直接呼び出す操作の総称ととらえています。キーボード ＋ マウス操作などもです。</dd>
<dt>ショートカットキー</dt>
<dd>ショートカットを実行する</dd>
<dt>ホットキー</dt>
<dd>ショートカットキーと同義ととらえていますので、こちらの言葉は今後持ちません。</dd>
<dt>アクセラレータキー</dt>
<dd>メニュー項目など、&を付けた際に機能するキーです。ファイル(&F)などです。</dd>
<dt>アクセスキー</dt>
<dd>アクセラレータキーと同義ととらえていますので、こちらの言葉は今後持ちません。</dd>
</dl>

場所によっては正反対に解説されている場合もあるかと思いますのでご注意ください。
ただし、以下のように食い違っていたりで迷っていますので、今後改めると思います。

- [W31:アクセスキーとショートカットキーについて](https://support.microsoft.com/ja-jp/kb/406949)
- [アクセラレータ キーとショートカット キーの追加](https://msdn.microsoft.com/ja-jp/library/aa301635(v=vs.71).aspx)

## キーボード記号の表記方法について （追記：2017/02/01）
`<kbd>`タグを利用します。
例：<kbd>F2</kbd> （`<kbd>F2</kbd>`）
Windowsのロゴキーの表記は <kbd>Win</kbd> とします。

複数のキーを同時押しする場合、全体を`<kbd>`で囲い、さらに個々のキーを`<kbd>`で囲い、キーとキーの間は`+`を入れます。
例：<kbd><kbd>Ctrl</kbd> + <kbd>Insert</kbd></kbd> （`<kbd><kbd>Ctrl<kbd> + <kbd>Insert</kbd><kbd>`）

同時押しで <kbd>+</kbd> を押す場合は次のように表記します。
例：<kbd><kbd>Win</kbd> + <kbd>+</kbd></kbd> （`<kbd><kbd>Win<kbd> + <kbd>Insert</kbd><kbd>`）
現時点（2017/02/01）でのQiitaでの表示は次のように表示されます。
(イメージ)：![image](https://qiita-image-store.s3.amazonaws.com/0/156225/e2b12efc-0227-8c52-8d9f-5db30b4f49d9.png) 
この場合、`+`が続いて分かりづらいですが、個々のキーの部分は太字になっているので、一応違いがわかるかと思います。


以上

|前回|方針|次回|
|:--|:--:|--:|
|(なし)|(この記事)|[<kbd><kbd>F2</kbd></kbd>](http://qiita.com/rrryutaro/items/19a43e0af5686c75462f)|
Redmine の wiki に独自の記法を追加する方法

[haru_iida / redmine_wiki_extensions / ソース / — Bitbucket](https://bitbucket.org/haru_iida/redmine_wiki_extensions/src/855b84acd355?at=Rails4) を参考にした。
2 ファイルを追加するだけでわりと簡単にマクロを追加することができた。

## `lib/redmine_plugin_of_yours.rb` を作成

```bash
vi lib/redmine_plugin_of_yours.rb
```

```ruby
module RedminePluginOfYoursMacro
  Redmine::WikiFormatting::Macros.register do
    desc "redmine_plugin_of_yours" + "'\n\n" +
      " !{{redmine_plugin_of_yours(a)}}" + "'\n" +
      " !{{redmine_plugin_of_yours(a, b)}}"
    macro :redmine_plugin_of_yours do |obj, args|
      return "this is redmine_plugin_of_yours #{args}"
    end
  end
end
```


## `init.rb` に Dir::foreach 的なブロックを追加

```bash
vi init.rb
```

```ruby
## このブロック
Dir::foreach(File.join(File.dirname(__FILE__), 'lib')) do |file|
  next unless /\.rb$/ =~ file
  require file
end

Redmine::Plugin.register :redmine_plugin_of_yours do
  name 'Redmine Plugin Of Yours plugin'
  author 'Author name'
  description 'This is a plugin for Redmine'
  version '0.0.1'
  url 'http://example.com/path/to/plugin'
  author_url 'http://example.com/about'
end
```

## 結果

Wiki ページに下記のように書くと、

```
{{redmine_plugin_of_yours(this, is, a, test)}}
```

こんな感じで表示されるようになった。

![](https://i.gyazo.com/22bd9e74c29706619eec75851b395033.png)

## 関連リンク

* [docker-compose で構築した環境で redmine プラグインを開発しはじめる例](http://qiita.com/tily/items/8996831d0603c6ef1cfc)
(C#)Formが持っている子画面の数を取得する 

共通フォームをOwnerとして、複数のフォームを作成。
Ownerとして設定されている画面がどのフォームのOwnerとして設定されているかが知りたかった。

* 取得方法
```this.OwnedForms``` を用いて取得できました。  

* テストコード

```C#
using System.Windows.Forms;

namespace testFormApp
{
    public partial class TestForm : Form
    {
        public TestForm()
        {
            InitializeComponent();
            CreateChildren();
            OutputChidrenInfo();
        }

        private void CreateChildren()
        {
            Form c1 = new Form {Text = "this is c1"};
            Form c2 = new Form {Text = "this is c2"};
            Form c3 = new Form {Text = "this is c3"};

            c1.Owner = this;
            c2.Owner = this;
            c3.Owner = this;
        }

        private void OutputChidrenInfo()
        {
            // どれだけの画面からOwnerに指定されているか
            int form_num = this.OwnedForms.Length;

            MessageBox.Show("children form : " + form_num.ToString());
            // メッセージボックスに表示される結果
            // children form : 3

            Form[] form_info = this.OwnedForms;
            for (int i = 0; i < form_info.Length; i++)
            {
                MessageBox.Show(form_info[i].Text);
                // メッセージボックスに表示される結果
                // this is c1
                // this is c2
                // this is c3
            }
        }
    }
}
```

* 参考サイト  
    * [Form.OwnedForms プロパティ](https://msdn.microsoft.com/ja-jp/library/system.windows.forms.form.ownedforms(v=vs.110).aspx)
Cloud Storage Client Libraryを使ってGCS上のファイルをReadする

Cloud Storage Client Libraryを使ってGCS上のファイル内容を取得する際のメモ。
以下の例だとバケットを作る例しかなくて、Readする例がなかったのでAPIマニュアル見ながら作成。
https://cloud.google.com/storage/docs/reference/libraries

以下はGCS上に置いたAWSのクレデンシャル情報を読み込む例。

```
//Storageオブジェクトの生成
Storage storage = StorageOptions.getDefaultInstance().getService();

//Bucket名を設定
String bucketName = "{BUKET名}";

//オブジェクト名を設定
String blobName = "{ファイル名}";

//Bucket名とオブジェクト名を元にBlobIdを取得
BlobId blobId = BlobId.of(bucketName, blobName);

//Blobオブジェクトを生成
Blob blob = storage.get(blobId);

//Blobオブジェクトの内容を取得
byte[] content = blob.getContent(BlobSourceOption.generationMatch());

//CSV形式で記載してるのでsplitして各変数に格納
String credential[] = new String(content, "UTF-8").split(",", 0);
aws_key = credential[0];
aws_secret_key = credential[1];
```
Power BIでCognitive APIを使用して日本語を分析する方法（文字化け対策）

#ハマったところ
英語を分析する場合[このページ](https://community.powerbi.com/t5/Community-Blog/Text-Analytics-in-Power-BI-Extraction-of-key-phrases-from/ba-p/88487)の通りにすればOK。しかし日本語を分析しようとするとCognitive Serviceから返ってくる文字が文字化けしているので、少し変える必要がある。

#変えるところ
Cognitive Serviceを呼び出すクエリ

``` r
(Source) =>
let
    JsonRecords = Text.FromBinary(Json.FromValue(Source)),
    JsonRequest = "{""documents"": " & JsonRecords & "}",
 
    JsonContent = Text.ToBinary(JsonRequest, TextEncoding.Ascii),
    Response =
        Web.Contents("https://westus.api.cognitive.microsoft.com/text/analytics/v2.0/keyPhrases?",
            [
                Headers = [#"Ocp-Apim-Subscription-Key"= APIKey,
                           #"Content-Type"="application/json", Accept="application/json"],
                Content=JsonContent
            ]),
    JsonResponse = Json.Document(Response,1252)
in
    JsonResponse
```

の中の

```
JsonContent = Text.ToBinary(JsonRequest, TextEncoding.Ascii),

```
と

```
JsonResponse = Json.Document(Response,1252)
```

の２ヶ所を

```
JsonContent = Text.ToBinary(JsonRequest, TextEncoding.Utf8),

```
と

```
JsonResponse = Json.Document(Response,TextEncoding.Utf8)
```

のように変えるといけた。
JUCE 4.3.0以降でMulti Busプラグインを作成する

Producerで作成したProjectのProjet Settingsに{0,2}, {0,4}などと書いても思った通りには反映されないので、コードで対応する必要がある。

1. Producerで作成したProjectのProject SettingsでPlugin Channel Configurationsを空白(empty)にする。
2. AudioProcessorを継承したクラスのコンストラクタで下記のようにbusを足していく。この例ではMain Outの他にAux Outを追加。
3. isBusesLayoutSupported()をオーバーライドしてbusの有効性をチェックするコードを追加。

```cpp
SampleAudioProcessor::SampleAudioProcessor()
#ifndef JucePlugin_PreferredChannelConfigurations
     : AudioProcessor (BusesProperties()
                     #if ! JucePlugin_IsMidiEffect
                      #if ! JucePlugin_IsSynth
                       .withInput  ("Input",  AudioChannelSet::stereo(), true)
                      #endif
                       .withOutput ("Main Out", AudioChannelSet::stereo(), true)
                       .withOutput ("Aux Out",  AudioChannelSet::stereo(), true)
                     #endif
                       )
#endif
{
}

#ifndef JucePlugin_PreferredChannelConfigurations
bool SampleAudioProcessor::isBusesLayoutSupported (const BusesLayout& layouts) const
{
  #if JucePlugin_IsMidiEffect
    ignoreUnused (layouts);
    return true;
  #else
    // This is the place where you check if the layout is supported.
    // In this template code we only support mono or stereo.
    if (layouts.getChannelSet(false, 0) != AudioChannelSet::stereo())
        return false;

    if (layouts.outputBuses.size() == 2)
    {
        if (layouts.getChannelSet(false, 1) != AudioChannelSet::stereo())
            return false;
    }
    
    // This checks if the input layout matches the output layout
   #if ! JucePlugin_IsSynth
    if (layouts.getMainOutputChannelSet() != layouts.getMainInputChannelSet())
        return false;
   #endif

    return true;
  #endif
}
#endif
```

うまくできてればこのようになる。
<img width="534" alt="sample1.png" src="https://qiita-image-store.s3.amazonaws.com/0/107818/48f281cf-2176-0bde-81ff-3068e7a4c07c.png">

<img width="754" alt="sample2.png" src="https://qiita-image-store.s3.amazonaws.com/0/107818/0f2493a9-3333-eba8-1303-b4c93ead087a.png">

<img width="611" alt="sample3.png" src="https://qiita-image-store.s3.amazonaws.com/0/107818/4a1de2fa-9bf0-c12e-250e-f3c8efe1eba9.png">
cinstしたbison,flexでmrubyをビルドするには

# Chocolateyでbison,flexを入れる

```shell-session
cinst winflexbison
```

これで、bison,flexが入るが、コマンド名が

- win_bison.exe
- win_flex.exe

# 2024/12/27追記

以下の作業は最近のmrubyでは不要でした。
最近自作PCを新しくして、mrubyのビルドしてみましたが、
この作業をせずとも大丈夫でした。

この追記のために裏とりしたら、以下のリリースにてbisonが不要になったことを知りました。

- http://forum.mruby.org/download/index212.html


# 2024/12/27追記ここまで

このままだと、rakeでbisonが見つからずコケる。

# 環境変数YACCにbisonの名前を指定できる

VSのNativeコマンドプロンプトにて


```shell-session
set YACC=win_bison
rake
```

# 関連記事

- [chocolateyでインストールしたあとの話](http://abrakatabura.hatenablog.com/entry/2017/04/18/072150)
- [Windowsでmruby-http2を動かした](http://abrakatabura.hatenablog.com/entry/2017/01/24/121826)
- [WindowsでmrubyからGoで作ったライブラリを呼び出して、Webカメラの画像をコマンドプロンプトに表示した](http://abrakatabura.hatenablog.com/entry/2017/09/01/072123)
技術英語 > Here's another tiny Python program that selects [a television news cliche] from a Python list and prints it:

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 152 / 12833)

> Here's another tiny Python program that selects a television news cliche (eの上に[アクサンテーギュ](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%AD%E3%83%A5%E3%83%BC%E3%83%88%E3%83%BB%E3%82%A2%E3%82%AF%E3%82%BB%E3%83%B3%E3%83%88)が付く) from a Python list and prints it:

http://ejje.weblio.jp/content/clich%C3%A9
> 決まり文句.

意訳「以下はPythonリストからTVニュースの決まり文句を選択して出力する短いPythonプログラムです」
F# 文字列の探索　切り出し

#始めに
F#でListのFoldを使って文字列を探索＆切り出すロジックを書いてみました

#今回実装する関数の仕様
## 関数名
適当にexeと名付けています
## 関数の引数
###第一引数
探索対象の文字列から引数で指定した文字列を探します。
指定した文字列が見つかった場合、探索対象の文字列を指定した文字列から切り出します
指定した文字列が見つからなかった場合、ブランクを返します
###第二引数
探索対象の文字列から引数で指定した文字列を探します。
指定した文字列が見つかった場合、探索対象の文字列をそのまま返します
指定した文字列が見つからなかった場合、ブランクを返します

#ソース
```fsharp
module File5

type ParseResult={
    Str:string
    isStrFound:bool
}

let inquire (result:ParseResult) (x:string) (startStr:string) = 
    let tmpstr=result.Str+x
    match tmpstr.Length>=startStr.Length with
    |true  -> match tmpstr.StartsWith(startStr) with
              |true  -> {Str=tmpstr;isStrFound=result.isStrFound}
              |false -> {Str=tmpstr.Substring(1);isStrFound=result.isStrFound}
    |false -> {Str=tmpstr;isStrFound=result.isStrFound}

let inquire2 (conStr:string) (result:ParseResult) =
    match result.isStrFound with
    |true  -> result
    |false -> match result.Str.IndexOf(conStr) with
              | -1 -> result
              | _  -> {Str=result.Str;isStrFound=true}

let getTarget (startStr:string) (result:ParseResult) = 
    match result.isStrFound with
    |true -> match result.Str.Length > startStr.Length with
             |true  -> result.Str
             |false -> ""
    |false -> ""

//文字列をstringのリストにする
let toStringList (str:string)=(str.ToCharArray())|>Array.toSeq|>Seq.map string|>Seq.toList
//List.foldを使って引数で与えられた文字列のリストの中からstartStrで始まる文字列を切り出し
//findStrで指定した文字列が含まれている場合、文字列を返す処理を実行する
let exe2 strs startStr findStr= List.fold(fun xs x ->((inquire xs x startStr)|>inquire2 findStr)) {Str="";isStrFound=false} strs
//exe2を実行した結果をgetTarget関数を用いてフィルタリングをする
let exe targetstr startStr findStr =(exe2 (toStringList targetstr) startStr findStr) |> getTarget findStr

printfn "%s" (exe "ahttp://www.yahoo.co.jftp" "http" "yahoo") //http://www.yahoo.co.jftpが表示される
printfn "%s" (exe "ahtt://www.yahoo.co.jftp" "http" "yahoo")  //ブランクが表示される
printfn "%s" (exe "ahttp://www.yaho.co.jftp" "http" "yahoo")  //ブランクが表示される
```
PiwigoでFTPアップロードされたファイルを自動的に公開する

Piwigoは公開する画像をFTPアップロードで登録できるのだが、FTPでファイルを置いただけでは公開されず、管理画面から`クイックローカル同期`をする必要がある。
監視カメラが撮った写真をFTPに上げているものを見たいので、一々公開操作するのはメンドクサイ。
というわけで、公開する操作をアクセスログから拾って`curl`で投げたら行けた。

```bash:ftpApply.sh 
#! /bin/bash

curl -Ss 'http://localhost/photos/identification.php' -c /tmp/.piwigoCookie.txt
curl -Ss 'http://localhost/photos/identification.php' -c /tmp/.piwigoCookie.txt -b /tmp/.piwigoCookie.txt -XPOST -d 'username=admin_username&password=set_piwigo_admin_password&redirect=&login=%E9%80%81%E4%BF%A1'
curl -Ss 'http://localhost/photos/admin.php?page=site_update&site=1' -c /tmp/.piwigoCookie.txt -b /tmp/.piwigoCookie.txt -XPOST -d 'sync=files&display_info=1&add_to_caddie=1&privacy_level=0&sync_meta=&simulate=0&subcats-included=1&submit=%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E5%90%8C%E6%9C%9F'
```
そんでもって、こいつをcrontabに登録してあげる。

```bash:crontab
0,10,20,30,40,50 * * * * /home/piwigo/bin/ftpApply.sh 1>/dev/null
```
opensslでpem作ろうとしたらCan't read Password（iTerm2にて）


ひさしぶりに[houston](https://github.com/nomad/houston)からプッシュ通知を送ろうとしてpem作りで微妙にハマったのでメモ。

プッシュ通知を送るためにp12形式のAppleの証明書をpemに変換する手順が必要なのですが、houstonのReadmeどおりのコマンド打つと下記の通り。

```
$ openssl pkcs12 -in cert.p12 -out apple_push_notification.pem -nodes -clcerts
Enter Import Password:
Can't read Password
```

パスワードの有無も関係ないし、証明書作り直しても変わりありませんでした。

よくわからんのですが「iTerm2」にて作業してたのを「Terminal」に変えて同じコマンド打ったらうまくいきました。なんだろう・・・

これと関連あり？
https://gitlab.com/gnachman/iterm2/issues/5125


環境

```
OS X El Capitan : Version 10.11.6
iTerm : Build 3.0.13
Terminal : Version 2.6.1
OpenSSL : 1.0.2h
```
Windowsで、ファイルの関連付けがどうしてもできない時

*レジストリを変更する場合は、慎重に！*
(作業前にバックアップを取るなど。)

念のため。レジストリの編集は自己責任で。

#レジストリの確認
##MuiCacheに存在しないパスが登録されていないか、確認する。
場所：
HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\Shell\MuiCache
※Vista以降。(XPまでは場所が異なる)

キー:
(ソフトのパス)
※ここが、存在しないパスになっている事が多い。

値：
(REG_SZ) (ソフトのファイル名)

##対処法
キーを正しいパスに変更する、または、不要なキーを削除する。
レジストリ反映のため、再起動。

正しく設定できていれば、ファイルを右クリックした時に表示される「プログラムから開く」のリストに、(すでに関連付けしてある場合は)ソフトが表示されているはずです。

#レジストリで、他に関連する場所
##拡張子ごとの、「開く」への関連付け
(確認のみ。変更は不要です。)
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\ (拡張子)\OpenWithList
キー：
a など
値：
(REG_SZ) (ソフトのファイル名)
※パスではなくファイル名(パス無しで、~~.exeの部分のみ)。ある意味、これが原因・・

##その他
関連付けができないソフトがある場合は、
HKEY_CLASSES_ROOT配下で、そのソフト名を検索しましょう。

HKEY_CLASSES_ROOT\Applications\ (ソフトのファイル名)\shell\open\command
HKEY_CLASSES_ROOT\(拡張子などに応じた名前)_auto_file\shell\open\command
などに登録されているパスが間違っている場合があります。
(違っている場合は、必要に応じて、修正しましょう。)

ということで、今回は、プログラムにあまり関係なかったかも？
何かの役に立てば！
存在しないLANGを設定してしまった場合の見慣れないエラーに遭遇した。

OSを入れ直して 自分が作った shellscript を実行した時以下エラーが出た。

```bash:エラー抜粋
terminate called after throwing an instance of 'std::runtime_error'
  what():  locale::facet::_S_create_c_locale name not valid
```

```bash:a.sh
LANG=ja_JP.UTF-8
```

shellscript内に書いてあるこれが原因だった。
`locale -a`するとja_JP.UTF-8はまだ存在しなかった。(en_US.UTF-8ならある)
LANG指定する必要もなかったのでコメントアウトし解決。
「ガートナー、人工知能 (AI) に関する10の『よくある誤解』を発表」を読みまして、いいねが増えそうと思い、記事を書きまする。

[ガートナー、人工知能 (AI) に関する10の「よくある誤解」を発表](http://gartner.co.jp/press/html/pr20161222-01.html) には誤解の解説が2つしかないので残りの8つを私なりに書きまする。

# 誤解3 AIと呼ばれる単一のテクノロジが存在する。
人工知能学会の[「人工知能研究」](https://www.ai-gakkai.or.jp/whatsai/AIresearch.html)にあるように、人工知能を目指して多数の研究・技術分野があります。「AI」という単一の何かがあるわけではありません。今注目を浴びているディープラーニングは人工知能を目指す技術である機械学習の更に一つの技術です。

# 誤解4 AIを導入するとすぐに効果が出る。
問題設定を、どう的確に出来るかに依ります。囲碁のように勝ち負けがはっきりしているものであれば結果が分かりやすいですが、ビジネスにおいて結果が分かりやすいものは意外とありません。
例えば売上予測をすると問題設定が出来たとして高精度な予測が出来たとします（これ自体もなかなか難しいですが）。ただ、売上予測が出来ても必ずしも嬉しくないはずです。行いたいのは売上を向上することでしょう。予測の根拠は何かを探り、その変数を操作できるかどうかを探り、その操作に幾ら費用がかかるかを探り、と続けて行って費用に見合うだけの効果があるかと問うとなかなか満たされるものはありません。

# 誤解5 「教師なし学習」は教えなくてよいため「教師あり学習」よりも優れている。
教師なし学習と教師あり学習は根本から異なります。教師なしで出来るのは基本的には、似たものを見つけるクラスタリングか、多数の変数から重要な因子のみに削減する次元削減か、のどちらかです。教師あり学習で出来る回帰（予測）や分類（判別）は教師なし学習では出来ません。

# 誤解6 ディープ・ラーニングが最強である。
問題に依ります。誤解4にも関わりますが、例えば売上予測を精度良くディープラーニングで出来たとしましょう。で、売上向上を目指したいとなった時に何をどうしたら売上を上げられるのかディープ・ラーニングは答えてくれません。例えば重回帰分析で売上予測を行い
売上 = 1.5×営業訪問数 + ……
となったならば、営業訪問数を増やせば売上が上がると分かります。この問題設定であれば、ディープ・ラーニングよりも重回帰分析の方が優れています。

# 誤解7	アルゴリズムをコンピュータ言語のように選べる。
ここで言う「アルゴリズム」は分析手法のことだと思いますが、これも問題設定に依ります。選ぶというよりも、持っているデータと求めたい答えにより決まるというものです。

* 拙記事「[氷解！データ分析、機械学習手法ってたくさんあるけどいつどれを使えばよいのか](http://qiita.com/aokikenichi/items/688e66d10a944051039c)」
* [scikit-learn algorithm cheat-sheet](http://scikit-learn.org/stable/tutorial/machine_learning_map/)
* [Microsoft Azure Machine Learning Studio の機械学習アルゴリズム チート シート](https://docs.microsoft.com/ja-jp/azure/machine-learning/machine-learning-algorithm-cheat-sheet)

あたりが参考になるかと思います

# 誤解8	誰でもがすぐに使えるAIがある。
学習用のチュートリアル的なものとしていろいろありますが、問題解決できるようなすぐに使えるAIがあるわけではありません。また以前のように一からプログラムをすべて書かずともライブラリとしてあるいはAPIとして開発環境が整備されて敷居が下がっているのは事実ですが、「犬と猫の写真を見分けたら利益向上につながる」というあり得ない状況でもない限り、誰でもがすぐに使えるAIがある、とは言えません。

# 誤解9	AIとはソフトウェア技術である。
これは「ソフトウェア技術」の用語の捉え方にも寄るかとは思いますが。AIを実行するのに必須な技術の例示として「R, Python, Hadoop, Spark」のような挙げ方をされているのをよく見かけます。これは一面では正しいですが、否です。これらはただのツールであってこれらの使い方に慣れるのは必要条件に近いですが十分条件ではありません。AIの技術の中で、問題設定、データの準備、手法の選択、「R, Python, Hadoop, Spark」等での実装、……という一要素に過ぎません。この意味では「AIはソフトウェア技術である」というのは誤解（少なくとも誤解を招く）と思います。

# 誤解10 結局、AIは使い物にならないため意味がない。
AIはまだまだまだまだまだまだ発展途上です。
囲碁がプロに勝てて、音声認識が向上したとはいえ小学生でも出来る挨拶も的確にはできないAIを見るとキワモノ扱いしたくなるのかも知れませんね。コンピュータが得意分野と人間が特異な分野は異なります。
囲碁は実はコンピュータには「簡単」なのです。相手が考えていることは分からないにしても盤上に結果はすべて出ており、ルールも明確です。こういった、情報がすべて明かされ、ルールが明確なものはコンピュータは得意です。ただ計算量が膨大なため今まで解けなかったものが、莫大な計算量かつディープラーニング技術で今年大きなブレークスルーがありました。
ところが挨拶ひとつとってもルールがあるようで曖昧です。「こんにちは」だけならまだしも、目上目下、知人か他人か、好意を持って近づきたいか悪意とは言わずともスルーしたいか、によっても挨拶が異なってきますし、挨拶を越えた応対となると千差万別曖昧模糊としています。こういったものは人間は得意ですがコンピュータは苦手です。
裏返すと計算量は多くとも問題設定が明らかに出来るのであればAIは威力を発揮します。100万枚の写真を分類するなんて人間には拷問以前に不可能でしょうが、ディープラーニングを手にしたコンピュータはいとも簡単に解決します。

繰り返しますがAIはまだまだまだまだまだまだ発展途上です。適切な問題設定が出来れば超人的な解決能力を示しますが、問題設定があいまいならば小学生にも劣ります。そしてまだ、専門家の手に委ねないといけない状況です

AIとは、手のかかるそして将来有望な可愛い子です。
超小粒なVim プラグイン3つ

これはマイネットエンターテイメント Advent Calendar 19日目だったはずの記事です。

# 謝罪

何か作ろうと思いましたが手を動かせずに今に至ります。申し訳ありません。お詫びに拙作のVim プラグイン(どれも数行!)を置いておきます。

# 現在のバッファ以外のバッファを完全に削除する

[vim-wipeout-noncurrent-buffers](https://github.com/maeda-mynet/vim-wipeout-noncurrent-buffers)

`:WipeoutNoncurrentBuffers` で隠れ(hidden)バッファを削除します。[:bdelete](http://vim-jp.org/vimdoc-ja/windows.html#:bdelete) ではなく [:bwipe!](http://vim-jp.org/vimdoc-ja/windows.html#:bwipe) なので完全に、しかも強制的に削除されます。お気をつけください。
特にGVimでの作業中に無用なバッファが増えてきた場合などに使用したりしなかったりします。

# 選択範囲の全角カナ英数記号を半角に変換する

[vim-hankaku](https://github.com/maeda-mynet/vim-hankaku)

Visual モードで行を選択した状態で `:Hankaku` とすると、選択範囲内の全角カナ英数記号を半角に変換します。
UTF-8にのみ対応しています。ちなみにKaoriyaさん版Vimだと最初から[半角に変換するプラグイン](https://github.com/koron/vim-kaoriya/blob/master/kaoriya/vim/plugins/kaoriya/plugin/hz_ja.vim)が同梱されています。
そろそろ2017年だし半角カナとか見たくない。

# 選択範囲の行末の空白を削除する

[vim-remove-trailing-space](https://github.com/maeda-mynet/vim-remove-trailing-space)

Visual モードで行を選択した状態で `:RemoveTrailingSpace` とすると、選択範囲内の行末の空白(`\s`)を削除します。それだけです。

以上です。お納めください。
【未解決】vagrant 1.9.1でNo live threads left. Deadlock?というエラーメッセージが出力されvagrant upが失敗する

## はじめに
この記事のバグは私のほうで解決方法を発見出来ておりません。
もし同様の現象に陥って解決策をお持ちの方はコメントを頂けると嬉しいです。
私のほうでも解決方法が判明次第この記事を更新します。

## 発生している現象
vagrant 1.9.1で```vagrant up```を行うと以下のエラーメッセージが表示され正常に動作しません。

```text:エラーメッセージ
Bringing machine 'default' up with 'virtualbox' provider...
/opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/batch_action.rb:126:in `join': No live threads left. Deadlock? (fatal)
	from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/batch_action.rb:126:in `block in run'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/batch_action.rb:65:in `each'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/batch_action.rb:65:in `run'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/environment.rb:287:in `block (2 levels) in batch'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/environment.rb:282:in `tap'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/environment.rb:282:in `block in batch'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/environment.rb:281:in `synchronize'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/environment.rb:281:in `batch'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/plugins/commands/up/command.rb:88:in `execute'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/cli.rb:42:in `execute'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/environment.rb:308:in `cli'
	from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/bin/vagrant:127:in `<main>'
```

## 発生している環境
- ホストOS : MacOS Sierra 10.12.2
- ゲストOS : CentOS7 ※[こちらのBOXイメージ](https://atlas.hashicorp.com/centos/boxes/7)を利用
- VirtualBOX : 5.1.12
- Vagrant : 1.9.1

## 対処法（未解決の為、暫定）
[githubのissue](https://github.com/mitchellh/vagrant/issues/8125)を見ると同様の現象と思われる内容を発見しました。

2016-12-27現在は取り急ぎ[こちら](https://releases.hashicorp.com/vagrant/1.8.7/)より1.8.7をダウンロードしてダウングレードを行い利用しています。

※ちなみに1.9.0でも同様の現象が発生しました。
[githubのissue](https://github.com/mitchellh/vagrant/issues/8125)を見守りつつ解決策が分かり次第、恒久対応を行う方針とします。

2017-02-18 追記
[githubのissue](https://github.com/mitchellh/vagrant/issues/8125) はまだクローズされていませんが [公式サイト](https://www.vagrantup.com/docs/installation/uninstallation.html) に記載してあるアンインストールを行ってから再度インストールを行ったところ問題なく1.9.1で正常動作を確認出来ました。

なので、現時点での解決策は一度Vagrantをアンインストールしてから再度インストールを行うとなります。
RestTemplateに追加されたpatchForObjectはデフォ実装(HttpURLConnection使うやつ)だと実質使えません

Spring Framework 4.3.5より、`RestTemplate`に`patchForObject`メソッド(PATCHメソッドを使ってHTTP通信するためのメソッド)が追加されましたが、`RestTemplate`をデフォルト状態で使うと通信処理時にエラーになってしまいます :sweat_smile:
これは・・・デフォルト状態で使われるクラスが、JDK標準APIの`java.net.HttpURLConnection`だからです。知っている方もいると思いますが、`HttpURLConnection`はPATCHメソッドをサポートしてないのです・・・。

# PATCHを使う場合は？

PATCHメソッドをサポートしているOSSライブラリを使ってください！！

Spring Frameworkでは、以下のOSSライブラリをサポートしてます。

* Apache HttpComponents HttpClient
* OkHttp 3
* OkHttp 2
* Netty 4

上記のライブラリは全てPATCHメソッドをサポートしています。

# OSSライブラリを使うには？

以下の手順が必要になります。

1. pom.xmlなどに依存ライブラリとして追加する
2. `RestTemplate`にOSSライブラリに対応する`ClientHttpRequestFactory`の実装クラスをインジェクションする

```java:ClientHttpRequestFactoryのインジェクション例
@Bean
RestTemplate restTemplate() {
    HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
    return new RestTemplate(factory);
}
```

> **Note:**
>
> Spring Boot 1.4+上でRestTemplateを使う場合は、「[Spring Boot 1.4+でRestTemplate(HTTPクライアント)を使う](http://qiita.com/kazuki43zoo/items/7cf3c8ca4f6f2283cefb)」をご覧ください！！ Spring 1.4で追加された`RestTemplateBuilder`を使って`RestTemplate`を生成することで、上記手順の2を自動で解決してくれます。


# Spring Frameworkが提供しているClientHttpRequestFactoryの実装クラス

Spring Frameworkは、以下の実装クラスを提供してます。

| クラス名 | 説明 |
| ------- | ---- |
| `HttpComponentsClientHttpRequestFactory` | Apache HttpComponents HttpClientを使ってHTTP通信を行うための実装クラス |
| `OkHttp3ClientHttpRequestFactory` | OkHttp 3を使ってHTTP通信を行うための実装クラス |
| `OkHttpClientHttpRequestFactory` | OkHttp 2を使ってHTTP通信を行うための実装クラス |
| `Netty4ClientHttpRequestFactory` | Netty 4を使ってHTTP通信を行うための実装クラス |
| `SimpleClientHttpRequestFactory` | JDKのを`HttpURLConnection`を使ってHTTP通信を行うための実装クラス（デフォルト実装） |

# まとめ

PATCHメソッドを使ってREST API(Web API)にアクセスする必要がある場合は・・・OSSライブラリを使ってHTTP通信しましょう！！
【入門編】VirtualBox でホストOS(mac)から NAT 設定しているゲストOS(主にCentOS)へ SSH 接続する方法

VirtualBox にインストールした CentOS に、デフォルトのネットワーク設定の NAT のまま接続するのに少し苦労したので、書いときます。
特に CentOS7 インストール直後で eth0 のIP自動取得が無効になっていたので、それで繋がらなかった。

## バックグランドで動いているデーモン（ファイアウォール）を止める

### CentOS7 の場合

```
$ systemctl stop firewalld
$ systemctl disable firewalld
```

### CentOS6 の場合

```
chkconfig iptables off
chkconfig ip6tables off
service iptables stop
service ip6tables stop
```

## SELinux を無効にする

```/etc/selinux/config
SELINUX=disabled
```

SELINUX を `disabled` に書き換えて、ゲストOSを再起動する

## ipv6 を無効にする

### CentOS7 の場合
以下のファイルを作成し、以下のように記述

```/etc/sysctl.d/disable_ipv6.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
```

```
$ sysctl -p /etc/sysctl.d/disable_ipv6.conf
```

### CentOS6 の場合

```/etc/sysconfig/network
NETWORKING_IPV6=no
```

以下のファイルを作成し、以下のように記述

```/etc/modprobe.d/disable_ipv6.conf
options ipv6 disable=1
```

ip6tables は、最初で無効にしているので、 reboot する

## eth0 に IP アドレスを自動で割り当てられるようにする

### CentOS7 の場合

`nmcli device status` で eth0 のデバイス名を確認しておく

```bash
DEVICE  TYPE      STATE      CONNECTION
enp0s3  ethernet  disconnected  --
```

DEVICE の 項目の `enp0s3` は、各自の環境で異なる可能性があるので、


```bash
nmcli con mod enp0s3 connection.autoconnect "yes"
systemctl restart NetworkManager
systemctl restart network
```

### CentOS6 の場合

TODO

## ホストOS側でポートフォワーディングの設定をする

ゲストOSが起動していたら `shutdown -h now` する
VirtualBox のゲストOSの設定 > ネットワーク > 高度 > ポートフォワーディングから、"+"のアイコンをクリックして、
下記画面のように
![ポートフォワーディングの設定](https://qiita-image-store.s3.amazonaws.com/0/9467/27c25333-1ac0-ff45-00f7-7ebf67911c34.png)

|名前に|ssh(適当で良い)|
|:--:|:--:|
|ホストポート|10022|
|ゲストポート|22|
上記を設定したらゲストOSを起動する

## ローカルIP に SSH 接続する

`ssh -p 10022 root@127.0.0.1` で ssh 接続できる
`root`の箇所は、適宜作成したユーザを指定しても構わない
useradd で作成したユーザは、 `passwd ユーザ名` でログインパスワードを設定しておく
Macbook ProにTensorFlow GPUを入れられなかった

* 結論：GPUがNVIDIAじゃないと動かないよ！

![MacBook Pro 2016-12-27 01-31-55.jpg](https://qiita-image-store.s3.amazonaws.com/0/12309/3a0cbd09-33f7-8aac-0557-69d37415e9dd.jpeg)

* [公式](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/g3doc/get_started/os_setup.md#optional-setup-gpu-for-mac)を参考にCUDAやライブラリを入れる。ビルドもする。そしてdeviceQueryで止まる

```
$ ~/cuda-samples/bin/x86_64/darwin/release/deviceQuery
/Users/YourUesrName/cuda-samples/bin/x86_64/darwin/release/deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

cudaGetDeviceCount returned 35
-> CUDA driver version is insufficient for CUDA runtime version
Result = FAIL
```

* GPU強いWindowsのノートPC買おうかな
* GPUはCPUの20倍速いそう
* しかしCNNのサンプルで500ステップで十分な結果出るので、軽い確認には500ステップで正常動作確認しておいて、ちゃんとした20000ステップの学習をしたいときは外出する前に回しておいても、ひとまずはいい
* 本格的に回したいなら、NVIDIA GPUの乗っているPCを買おう