OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScript の Date 型を扱うときに気をつけること

# 日付の形式

## 状況

例えば JavaScript で `new Date("2013-07-08 20:38:08")` とすると以下のようにブラウザごとでバラバラの結果が返ってきます：

:frowning: **Chrome, Opera, Vivaldi**:

```console
// 地方時
> new Date("2013-07-08 20:38:08")
< Mon Jul 08 2013 20:38:08 GMT+0900 (JST)
```

:anguished: **Firefox**:

```console
// 協定世界時
> new Date("2013-07-08 20:38:08");
< Date 2013-07-08T03:00:00.000Z
```

:scream: **Safari**:

```console
> new Date("2013-07-08 20:38:08")
< Invalid Date = $1
```

## 原因

このように invliad になってしまう原因としては [new Date() is working in Chrome but not Firefox | StackOverlow](http://stackoverflow.com/questions/3257460/new-date-is-working-in-chrome-but-not-firefox) で以下のように書かれている通りです：

> the EMCAScript specification requires exactly one date format (i.e., YYYY-MM-DDTHH:\mm:\ss.sssZ) but custom date formats may be freely supported by an implementation: "If the String does not conform to that [ECMAScript-defined] format the function may fall back to any implementation-specific heuristics or implementation-specific date formats." Chrome and FF simply have different "implementation-specific date formats."

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15 ECMAScript の仕様では `YYYY-MM-DDTHH:mm:ss.sssZ` つまり ISO 8601 方式しか定義されていません。その他のフォーマットについてはブラウザに依存しているので先ほどのようにバラバラの結果になります。

## 処理方法チートシート

API にもよりますが取得した値が `2013-07-08 20:38:08` といった形式の場合以下のようなメソッドで修正する：

```js
// MySQL から返ってくる日付の値を ISO 8601 に変換
function replaceDate(dateStr) {
  const regexp = /^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9])(?:( [0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/;
  return dateStr.replace(regexp, (match, year, month, day, hour, minutes, seconds) => {
    return `${year}-${month}-${ day}T${hour}:${minutes}:${seconds}.000+09:00`;
  });
}
```

## 参照

* [Dateは地雷原 | Qiita](http://qiita.com/jkr_2255/items/304b6326c7fc54e0aaa2)
* [JavaScript の Date は罠が多すぎる | Qiita](http://qiita.com/labocho/items/5fbaa0491b67221419b4)
* [Regex to check for valid MySQL datetime formata](https://coderwall.com/p/jmarug/regex-to-check-for-valid-mysql-datetime-format)
* [Date | MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)
* [3/14/2012 blog from danvk Comparing FF/IE/Chrome on Parsing Date Strings](http://dygraphs.com/date-formats.html)
.satにもいろいろある : Solidworksで出力した.satファイルがFusion360で開けない理由

#環境
この記事では、
- Windows OS 7のSolidworks 2015
- MAC OS X Yosemite 10.10.5 のFusion 360
を使っています。

#説明
.satの規格にはバージョンがある
詳しくはこちら -> https://en.wikipedia.org/wiki/ACIS

http://www.cadjapan.com/topics/3dcad/140822_data.html
によると、SolidWorksは、R22までの(つまりR22 or older).satファイルのインポートができるが、エクスポートする際のバージョンはR22固定である。

そして、http://forums.autodesk.com/t5/design-validate-document/sat-import-versions/td-p/6228474
によると、Fusion 360が扱えるのは7.0 or olderバージョンらしい。

ここで、7.0よりもR22という規格が新しいってことが問題になる。
という訳で、Solidworksで出力した.satファイルはFusion360で開けない模様。

#対処
追加情報として、nativeのSolidWorksファイルはFusion 360でも開けるようである。
よって、Solidworksで編集をした場合は.satに書き出すのではなく、SolidWorksの形式のままにしておき、それを後でFusion 360で読み込んだ上で.satに書き出す、という方法をひとまず提案しときます。

#おまけ：中間データについて
異なる3D CAD同士でデータをやりとりする場合、IGESやSTEPというフォーマット(拡張子)のファイルを使う。 = 中間フォーマット。SATもそのうちひとつ。
以前はIGESが中間ファイルとして最も有名でしたが、**ISOの標準規格であるSTEPが規格され、IGESよりSTEPがより利用されているようです。** (->http://d-engineer.com/3dcad/filegokan.html)

また、ポリゴンからIGESやSTEPデータを作ることはできない。
無理やり変換しても、空のファイルができるだけ。
なので、一度CAD面に変換する作業が必要。

DXF, OBJ, STLなどはそれぞれ互換性が無い造形用のフォーマットなので、注意。
RubyOnRailsでViewに表示させる文字数を制限する方法

RailsのViewで投稿文章を表示させるときに、本文が長すぎるとレイアウトがダサくなるので、`truncate`ビューヘルパーを使って表示する最大文字数を制限する。


| タイトル1 | タイトル2 |
|:-:|:-:|
|  すっきりとしているのに |------------------文字数が多いとめっちゃめちゃめちゃめちゃダサク感じるとき-------------------------------------------------------------------------------------------   |

#VIVA TRUNCATE

truncateを使って書いてみると！？

```ruby:top.html.erb
  <% @notes.each do |note| %>
        <p class="card-text"><%= note.body %></p>
        <p class="card-text"><%= truncate(note.body, :length => 10) %></p>
  <% end %>
```

あら、素敵。Lengthで指定した文字数に収まりました。（はみ出た文字は「...」と表示されます)

| タイトル1 | タイトル2 |
|:-:|:-:|
|  これですっきり！！！ |　指定字数内に収まるよ...   |
[After Effects]特定の座標の色を調べる[JavaScript]

特定の座標の色を変数に入れようと思ったけど、直接取得するような関数が見つからなかったので作成。
# ExtendScript Toolkit
AdobeのアプリケーションをJavaScriptで自動化するためのツール。
アプリケーションのメニューバーからAfterEffectsCC2015の場合、「ファイル」->「スクリプト」->「スクリプトエディタを開く」
でExtendScript Toolkitを開いて、そこにスクリプトを書き込んで実行可能。

## 内容
スポイトのような機能を持った関数が見つからないので、平面レイヤーを一時的に追加して、そこに「塗り」エフェクトを追加。追加したエフェクトにエクスプレッションを追加してそこにsampleImageで座標の色を取得して平面レイヤーにその色を適用。その適用された色を値として出力するという、かなり遠回りな方法をとった。

>この辺のページを参考にしました。
>https://www.wgn.co.jp/store/blog/item-1436.html
>https://forums.adobe.com/thread/1902410

```js:AfterEffects
function getLayerPositionColor(argumentCompName,argumentLayerName,argumentPositionArray){
///コンポジションを特定
var targetComp;
for(var i=1;i<=app.project.numItems;i++){
    if(argumentCompName==app.project.item(i).name){
        targetComp = app.project.item(i);
    }
}
///仮の作業用平面を作成。
var target = targetComp.layers.addSolid([0, 0, 0], "getLayerPositionColorBox", 2, 2, 1.0);
///「塗り」エフェクトの追加
var addColorControl = target.Effects.addProperty("塗り");
///エクスプレッションの記載内容の文字列作成
var expr = "thisComp.layer(\""+argumentLayerName+"\").sampleImage(["+String(argumentPositionArray)+"], [.5, .5]);";
///アニメーション->エクスプレッションを追加
addColorControl.property("カラー").expressionEnabled = true;
addColorControl.property("カラー").expression = expr;
///結果のデータを取得
var values = addColorControl.property("カラー").value;
target.remove();
return values;
}


///使用例
var rgb;
rgb = getLayerPositionColor("対象のコンポジション","レイヤー名",[10,10]);
///getLayerPositionColor("対象のコンポジション","レイヤー名",[X座標,Y座標]);
$.writeln(rgb);

```
Elasticsearchで"not_analyze"と"analyze"2つのフィールドを格納する

Elasticsearchはデフォルトで文字列を要素解析して格納する。
例えば、URL情報を格納するケースでURL文字列が要素解析されてしまうと正しく集計できないため、
通常は要素解析されないよう"not_analyzed"を指定することが多いと思われる。

一方で、"not_analyzed"とした場合、KibanaでVisualizeする時にURLに含まれる
特定の文字列で部分一致検索が上手く効かなくなる事象が確認されている。

そこで、URL文字列をそのままの状態で正しく集計をしつつ、部分一致検索も出来るよう、
"not_analyzed"と"analyzed"の2つのフィールドをElasticsearchに格納する手法を紹介する。

## 動作を確認したバージョン

- Elasticsearch: 2.3.2
- Logstash: 2.2.2
- Kibana: 4.5.0

## やり方

下記の様なテンプレートを用意してElasticsearchに対してPUTする。

```
PUT _template/sample
{
  "template": "sample-*",
  "mappings": {
    "_default_": {
      "properties": {
        "hoge": {
          ...
        }
        "url": {
          "type": "string",
          "fields" : {
            "raw" : {
              "type" : "string",
              "index" : "not_analyzed"
            }
          }
        },
        "fuga": {
          ...
        }
      }
    }
  }
}
```

上記のテンプレートを適用すると、下記２つのフィールドがindexに作られる。

- "analyzed"である"url"
- "not_analyzed"である"url.raw"

## 注意点

"not_analyzed"である"url.raw"は隠しフィールドであり、
KibanaのDiscoverメニューからindex選択しても表示されない。
下図の"Hide Missing Fields"チェックボックスのチェックを外し、
隠しフィールドを表示するよう変更を行う必要がある。

![kibana-setting.png](https://qiita-image-store.s3.amazonaws.com/0/73181/d5d29c80-8d6f-35b4-9498-da189378e8ca.png)
非同期処理 Promise

#Promiseパターンのイメージ
丸パクリ メモ

「私(＝非同期的に値を返す関数)は確かにあなた(＝呼び出し元の関数)に呼ばれたので、呼ばれた証(＝プロミスオブジェクト)を返しておきます。結果は、計算が終了し次第、その証を持っている人(＝呼び出し元の関数)にお知らせします」
というイメージ。
食堂やクリーニング屋さんなどに行ったとき、お金を払って一旦引き換えチケットをもらい、後で商品を取りに行く、という状況をイメージするとわかりやすいでしょう。

#参考
https://www.htmlhifive.com/conts/web/view/study-room/async-programming-with-deferred
サイトのページ数を調べる

#サイトのページ数を調べる

ページ数が少ないサイトだったら
人力で調査することも可能でしょうが、
数十を超えたあたりからもうめんどくさい。

##クローラを使う

e-word先生から転載。



------

クローラ 【 crawler 】
　クローラとは、全文検索型サーチエンジンの検索データベースを作成するために、世界中のありとあらゆるWebページを回収するプログラム。

http://e-words.jp/w/%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%A9.html

------


**ページ内のリンクを辿って、他のページに行って**
**さらに、そのページのリンクから別のページへ行って･･･**
**って繰り返してくれるソフトです。**たぶん。おそらく。

サイトマップを作るとか、孤立してるページを見つけるとか出来るらしい。

~~スパイダー 【 spider 】　とも呼ぶらしいです。~~
**どうも、厳密にはクローラとスパイダーは別物らしい。**
詳しくは、おまけで。

今回、使用したクローラ

* **Website Explorer**

* **WildShark SEO Spider**

クローラでサイトの URL 一覧を生成して
そこからページ数を調べるという戦略。

##使用方法

**ページ数を調べたいサイトのトップのURLを入力するだけ。以上。**

二つのソフトをあげた理由としては

* Website Explorer は日本語でわかりやすく、設定も豊富そう

* WildShark SEO Spider はフィルタに正規表現を使用できるので、うまく使えれば便利そう

という完全なる主観。

どちらも URL 一覧を Excel に出力できるので
出力してから整理すればいいのかもしれない。

##おまけ　クローラとスパイダーの違い

検索エンジンの５つのプログラム - スパイダーとクローラって別物？
http://www.seojuku.info/seoblog/searchengine/20070111095317.html
によれば

**クローラ : ページのリンクを追跡**
**スパイダー : ウェブページをダウンロード**

とのことです。

そもそも、クロールという単語は 「這い回る」「ハイハイする」などの意味らしいです。

なので、
**クローラ → ハイハイして、ページをたどっていくソフト**
**スパイダー → たどって行って、絡め取って持って帰ってくるソフト**
っていうイメージなのかな。
なるほど、わからん。
【Docker】gitlabとpostgreSQLの繋ぎこみで少し引っかかったのでメモ

# gitlabとpostgreSQLの繋ぎこみで少し引っかかったのでメモ

![rancher-docker.png](https://qiita-image-store.s3.amazonaws.com/0/62822/bd972e9f-77eb-8fdd-b7fa-9490095c5e1a.png)


## 環境
- [RancherOS上でDockerが動いてる](http://qiita.com/okasho1010/items/da52b4dc12221feca55c)
- RancherOS(0.4.4)
- Docker version(1.10.3)
- gitlab(8.8.3)
- postgresql(9.4-8)


- **gitlabはLDAP認証は使わない**でメールでアカウントを発行している

## (1)gitlabコンテナがUnhealthyだなぁー

```
6/9/2016 3:15:29 PMConfiguring gitlab::lfs...
6/9/2016 3:15:29 PMConfiguring gitlab::project_features...
6/9/2016 3:15:29 PMConfiguring gitlab::smtp_settings...
6/9/2016 3:15:30 PMConfiguring gitlab::oauth...
6/9/2016 3:15:30 PMConfiguring gitlab::ldap...
6/9/2016 3:15:30 PMConfiguring gitlab::backups...
6/9/2016 3:15:30 PMConfiguring gitlab::backups::schedule...
6/9/2016 3:15:30 PMConfiguring gitlab-shell...
6/9/2016 3:15:31 PMConfiguring nginx...
6/9/2016 3:15:31 PMConfiguring nginx::gitlab...
6/9/2016 3:15:31 PMMigrating database...
6/9/2016 3:15:46 PMrake aborted!
6/9/2016 3:15:46 PMStandardError: An error has occurred, all later migrations canceled:
6/9/2016 3:15:46 PM
6/9/2016 3:15:46 PMYou must enable the pg_trgm extension. You can do so by running "CREATE EXTENSION pg_trgm;" as a PostgreSQL super user, this must be done for every GitLab database. For more information see http://www.postgresql.org/docs/current/static/sql-createextension.html/home/git/gitlab/db/migrate/20160226114608_add_trigram_indexes_for_searching.rb:10:in `up'
```


#### この最後の ``` CREATE EXTENSION pg_trgm; ``` ができてないらしい

#### postgresqlのコンテナでエラーを確認してみる

```
6/9/2016 3:13:58 PMERROR:  permission denied to create extension "pg_trgm"
6/9/2016 3:13:58 PMHINT:  Must be superuser to create this extension.
6/9/2016 3:13:58 PMSTATEMENT:  CREATE EXTENSION IF NOT EXISTS "pg_trgm"
```
#### どうやらsuperuserじゃないと、無理とか言ってる

##### 応急的にpostgresユーザーでCREATE EXTENSIONして対処した

```
$ sudo -u postgres psql -d gitlabhq_production -c "CREATE EXTENSION pg_trgm;"
```

#### これでコンテナは安定した


## (2)gitlabのadmin権限のユーザーでログインできない

+ 普通のgitlabならこれで行けるらしい
    + user: ```root```
    + pass: ```5iveL!fe```


+ postgreSQLに入ってユーザー確認

```
$ psql -U postgres -d {databasename}

psql=>select * from users;

・・・0 row ・・・
```

####どうやらsetupが必要らしい

```
$ sudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production GITLAB_ROOT_PASSWORD=yourpassword GITLAB_ROOT_EMAIL=youremail
```


####これでadmin権限のあるgitlab userができた
Cocos2d-x v3.xアプリでiOS(IPv6)やAndroid(OpenSSL)の問題に対応する

古めのCocos2d-x（俺が試したのはv3.3）使っているアプリって、ここ最近Googleから「こんな古いOpenSSL使ってるのはもうだめだよ」と言われたり、Appleから「IPv6使えないアプリなんてだめだよ」と言われてるはず。

Cocos2d-xまるごと入れ替えるのも面倒だし、楽な方法ないかな、と悩んでいたところで、本家から情報。

[IPV6-ONLY NETWORKS NOW SUPPORTED.](http://blog.cocos2d-x.org/2016/05/ipv6-only-networks-now-supported/)

素晴らしい。
外部ライブラリをv3-deps-94に更新したcocos2d-xディレクトリから、curlのprebuilt（libcurl.a/libcrypto.a/libssl.a)、およびwebsocketsのprebuilt(libwebsockets.a)を持ってきてビルドしなおせば更新完了。

これでAppleとGoogleどちらの要求にも対応できる。

iOSアプリがIPv6対応しているかどうかは
[Supporting IPv6 DNS64/NAT64 Networks](https://developer.apple.com/library/mac/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html)
ここに書いてある方法で検証。

AndroidアプリのOpenSSL問題については、
`unzip -p Xxx.apk  | strings | grep OpenSSL`
でAPKに埋め込まれているOpenSSLバージョンをチェック。
v3-deps-94だと1.0.2gになるようだ。
Recurrent Convolutional NNでテキスト分類

機械学習でテキスト分類をできないかと調べたところ、2種類の手法が提案されていました。

* [CNNによるテキスト分類](https://speakerdeck.com/tkengo/cnnniyorutekisutofen-lei)
* [RNNで文書分類（Text Classification）](http://blog.livedoor.jp/tak_tak0/archives/52289652.html)

前者の手法は既にTensorFlowによる実装があったのと、直接Chainerで記述できなかった(covolution_2dではx軸固定の畳み込みができない)ので、後者を実装してみました。

https://github.com/knok/rcnn-text-classification

## 追記

この記事を書いた当時はフィルタの幅と入力行列の幅を同じにしたとき、0除算例外が出てしまっていたのですが、今は問題なくできるようになっていました。自分が試した頃は確かversion 1.6あたりだったと思います。

ChainerによるCNN実装例がQiitaにもあります。

* [【Chainer】畳み込みニューラルネットワークによる文書分類]( http://qiita.com/ichiroex/items/f225f6d8eceb6796cc7e)

こちらの実装では、単語埋め込み表現をword2vecで既に学習させたものを利用していますが、links.EmbedIDを用いて単語埋め込み表現を同時に学習することもできます。

分類に用いる特徴量としては、こちらの方が多いので性能はより高いのではないかと思います(未検証)。

# 使い方

データセットを用意します。https://github.com/knok/rcnn-text-classification/blob/master/data.txt のようなCSVで1行ごとに本文,(ラベル番号)を記述してください。

出来上がったデータを用いて訓練をします。

```shell-session
$ python train.py train data.txt
```

訓練が終わったら、評価してみてください。

```shell-session
$ python train.py eval '今日はいい天気'
[[ 4.75943899 -5.7807641 ]]
hyp: 0
$ python train.py eval '帰りたい'
[[-5.44445753  6.04835653]]
hyp: 1
```

# コードについて

もともとはseq2seqで対話モデルを作ろうとしていて、データをTwitterから収集していたのですが、その時に訓練データとして適切・不適切なものを機械的にやりたいという目的で実装しました。なので、単語単位ではなく文字単位で処理をしています。それでも、だいたい望むような結果は得られています。

適当に書いたので、今のところミニバッチに対応していません。また、max poolingにchainer.function.maximumを使っているため、chainer 1.9.0以降が必要です。小さな関数なので、それ以前のバージョンのchainerでもhttps://github.com/pfnet/chainer/blob/v1.9.0/chainer/functions/math/maximum.py からコードを拝借すれば動くと思います。

# 元論文
[Recurrent convolutional neural networks for text classification](http://dl.acm.org/citation.cfm?id=2886636)
Siwei Lai, Liheng Xu, Kang Liu, Jun Zhao, Chinese Academy of Sciences, China
AAAI. 2015.

# blog
http://blog.daionet.gr.jp/knok/2016/06/09/recurrent-convolutional-neural-networks-for-text-classification/
Google Directions APIでルート情報を取得して、アプリでルートを描画するときの参考


# API


- [Google Maps Directions API](https://developers.google.com/maps/documentation/directions/intro)

# iOS(Swift)

- [A Swift Tutorial for Google Maps SDK](http://www.appcoda.com/google-maps-api-tutorial/)
- [Swift iOS google Map, path to coordinate](http://stackoverflow.com/questions/28784034/swift-ios-google-map-path-to-coordinate)

# Android
JavaScriptでCloudFrontにドメインを割り当てる（AWS SDK）

[JavaScriptでEIPとドメインを関連付ける](http://qiita.com/motchi0214/items/51666ae04ec5efcf7848)の続きです。
上の記事と同じ手順で、ホステッドゾーンIDを取得してからレコードセットを追加します。

```
var AWS = require('aws-sdk');

var cdn = "YOUR_CLOUDFRONT_DOMAIN";
var domain = "YOUR_DOMAIN";
addRecordSet( domain, cdn );

function addRecordSet( domain, cdn ) {
  var params = {
    DNSName: cdn,
    MaxItems: '1'
  };
  var route53 = new AWS.Route53({
    apiVersion: '2014-05-15',
    accessKeyId: "ACCESS_KEY_ID",
    secretAccessKey: "SECRET_ACCESS_KEY",
    region: "REGION"
  });
  route53.listHostedZonesByName(params).promise().then(
	(data) =>  {
      console.log('Find Your Domain.');
	  return data;
  }).then( (data) => {
	console.log('Upsert Your Domain.');
	var HostedZoneId = data.HostedZones[0].Id;
	HostedZoneId = HostedZoneId.split('/')[2];

	var params = {
	  ChangeBatch: {
	    Changes: [
	      {
	        Action: 'UPSERT',
	        ResourceRecordSet: {
	          Name: data.DNSName + '.',
	          Type: 'A',
			  AliasTarget: {
				  DNSName: cdn,
				  EvaluateTargetHealth: true,
				  HostedZoneId: "Z2FDTNDATAQYW2"
				},
	        }
	      }
	    ],
	  },
	  HostedZoneId: HostedZoneId
	};
	return route53.changeResourceRecordSets(params).promise();
  }).then( (data) => {
	console.log(data);
  }).catch( (err) => {
	  console.log('Fail to add domain');
	  console.log(err);
	  //context.fail(err);
  });
}

```

AliasTargetのHostedZoneIdはリソースによって固定値になります。
CloudFrontは"Z2FDTNDATAQYW2"を入れておきましょう。

##成功した場合の戻り値
```
{ ChangeInfo: 
   { Id: '/change/C2PCQEAEVXLDCZ',
     Status: 'PENDING',
     SubmittedAt: Thu Jun 09 2016 15:54:53 GMT+0900 (JST) } }
```
iOSアプリの申請に必要なスクリーンショットサイズ



## iOSアプリの申請に必要なスクリーンショットサイズ
### 現在 2016年6月時点
全て必要なわけではありません。
開発したアプリによってインストール可能な端末に対応したスクリーンショットを求められます

各対応端末ごとに、以下のいずれかのサイズ1枚以上

| 3.5インチ端末用 |4インチ端末用 | 4.7インチ端末用 | 5.5インチ端末用 |
|:-----------:|:------------:|:------------:|:------------:|
| 640 x 920 | 640 x 1096 | 750 x 1334 | 1242 x 2208|
| 640 x 960 | 640 x 1136 | 1334 x 750 | 2208 x 1242|
| 960 x 600 | 1136 x 600 |
| 960 x 640 | 1136 x 640 | 


| iPad用 |iPad Pro |
|:-----------:|:------------:|
| 1024 x 748 | 2048 x 2732 |
| 1024 x 768 | 2732 x 2048 |
| 2048 x 1496 |
| 2048 x 1536 |
| 768 x 1004 |
| 768 x 1024 |
| 1536 x 2008 |
| 1536 x 2048 |
Macのvirtualenvでgexiv2を使えるようにする

# 追記

2016/8/31現在、私の環境では下記の方法でセットアップすることができない状態です。動作確認の段階で、

```bash
ImportError: When using gi.repository you must not import static modules like "gobject".
```

という例外が発生します。原因は不明です。

# 私の環境

* MacOS 10.11.5
* Python 2.7.6

# virtualenvを作成する

* 今回は~/test/envに作成したとします。

```bash
cd ~/test
virtualenv env
```

# pygobject、exiv2、gexiv2をインストールする

```bash
brew install pygobject3
brew install exiv2
brew install gexiv2
```

# virtualenvとリンク

```bash
cd ~/test/env/lib/python2.7/site-packages
ln -s /usr/local/lib/python2.7/site-packages/gi gi
```

# テストする

```py
import gi
gi.require_version('GExiv2', '0.10')
from gi.repository import GExiv2
metadata = GExiv2.Metadata()
```

以上です。
T-SQLで月の日数（月最終日）を取得する

ある月の日数を取得したい場合は、月の最終日を取得すればよいので

```sql
SELECT DAY(EOMONTH(DATEFROMPARTS(2016,2,1)))
-- result 29
```

### 参考
- [日付と時刻のデータ型および関数 (Transact-SQL)](https://msdn.microsoft.com/ja-jp/library/ms186724%28v=sql.120%29.aspx)
- [EOMONTH (月の最終日取得)](https://msdn.microsoft.com/ja-jp/library/hh213228%28v=sql.120%29.aspx)
brewでインストールしたMySQLのパスワードを紛失してリセットした話

# <i class="fa fa-meh-o"></i> はじめに
MySQLのパスワードを紛失しました :))))))

# <i class="fa fa-frown-o"></i> 公式のやりかたでうまく行きませんでした
MySQL公式によると次のやり方で出来るそうで下がうまく行きませんでした。



> MySQL 5.7.6 and later:
> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';
> MySQL 5.7.5 and earlier:
> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MyNewPass');
> http://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html

要約するとmysql起動時に特定のSQLを実行するようにしてパスワードをリセットしましょう、ということでした。

Mac OS Xのbrewでは`mysql.server`という起動スクリプトで色々とできるのでそちらから設定しました。

```bash
$ mysql.server --init-file=/path/to/init.sql
```

しかしながら動きません :(

#<i class="fa fa-smile-o"><i> データベースのクリア
しょうが無いのでデータベースを飛ばしてでもリセットすることに染ました。
以前はデータDIR(datadir)を消して`mysql_install_db`を実行すれば良かったのですが、最近はうまく行かないようです。

```bash
$ rm -rf /usr/local/var/mysql

$ mysql_install_db                  
2016-06-09 14:46:02 [WARNING] mysql_install_db is deprecated. Please consider switching to mysqld --initialize
2016-06-09 14:46:02 [ERROR]   The data directory needs to be specified.
```

どうやら最近は`mysqld --initialize`を利用するようです。

```bash
$ mysqld --initialize                                       ⏎ master
中略
2016-06-09T05:46:11.831427Z 1 [Note] A temporary password is generated for root@localhost: 0tPB.HpR6+++
```

ちゃんとうまく行きました。

しかしながらここで発行されるパスワードは一般に使うことが出来ず、必ずリセットしなければ成らないようです。(MySQLWorkbenchなどでこのパスワードで接続をしようとすると弾かれちゃいます<i class="fa fa-frown-o"></i>)

```bash
$ mysql -u root -p
Enter Password:
mysql > alter user 'root'@'localhost' identified by 'password';
```

ここで新しいパスワードを設定するとうまくいけました。

やったね！
TensorFlowでk-meansを組んでみた話

ソースは [gist](https://gist.github.com/YusukeSuzuki/1edea01b457158905102b6f0965bef7a) にもある。

目的
---

- TensorFlowは線形代数APIを多く備えていてニューラルネットワーク専用フレームワークではないということを確認する。
- TensorFlow初心者であるためお手本なしでグラフを組む練習

作ったもの
---

- 複数回試行などを実装しないシンプルなk-means
- 重心の異なるサンプルを生成してクラスタリングする練習コード
- メジャーなライブラリの実装のような工夫をしていないので綺麗にクラスタが分かれることはあまりない


わかったこと、困ったこと
---

- tf.nn 系のチュートリアルだとVariableの更新は自動で行われるが tf.nn から離れると自前で行わないといけない（今回だと重心の更新）
- `Tensor.assin()` で更新できるとドキュメントにはあったがうまく動かなかった。今回はイテレーションごとに `placeholder` に値を渡した。
- map関数的なオペレーションがないため余計なメモリを食うコードになった。 `distance_map` あたり。「n次元目の要素ごとにfを適用する」というようなことを綺麗に書くAPIが増えてほしい。
- 要素ごとに何かする関係で `reshape` を多用することになった。行列演算では当たり前なのかもしれないがパズルのようで面白かった。

質問、指摘、意見、アドバイスはコメント欄からよろしくお願いします。

```py3
import tensorflow as tf
import numpy as np
import sys

# simple k-means clustering with tensorflow
# this is my practice code for tensorflow graph coding

# parameters

K_SIZE = 5

SAMPLE_SIZE = 10000
SAMPLES_COV = [[5,0],[0,5]]
SAMPLES_MEAN_PARAM = 100

# create samples and initial centers

sample_list = []

for i in range(K_SIZE):
    random_center = (SAMPLES_MEAN_PARAM * np.random.random_sample(2) - SAMPLES_MEAN_PARAM / 2).astype(np.float32)
    sample_list.append(np.random.multivariate_normal(random_center, SAMPLES_COV, [SAMPLE_SIZE, 2]).astype(np.float32))

samples_data = np.reshape(sample_list,[-1,2])
np.random.shuffle(samples_data)
center_list = samples_data[0:5]
centers_data = np.reshape(center_list,[-1,2])

# make tensorflow graph

samples = tf.Variable(samples_data)
centers = tf.placeholder(tf.float32)

centers_map = tf.tile(centers, [samples_data.shape[0],1])
centers_map = tf.reshape(centers_map,[samples_data.shape[0] * K_SIZE, 2])

samples_map = tf.tile(samples, [1,K_SIZE])
samples_map = tf.reshape(samples_map,[samples_data.shape[0] * K_SIZE, 2])

distance_map = tf.sub(centers_map, samples_map)
distance_map = tf.pow(distance_map, [2])
distance_map = tf.reduce_sum(distance_map, 1)
distance_map = tf.reshape(distance_map, [-1, K_SIZE])

labels = tf.to_int32(tf.argmin(distance_map, 1))

# centers update iteration

init = tf.initialize_all_variables()
sess = tf.InteractiveSession()
sess.run(init)

updated_samples_list = tf.dynamic_partition(samples, labels, K_SIZE)
updated_centers = tf.concat(0,[tf.reduce_mean(t,0) for t in updated_samples_list])
updated_centers = tf.reshape(updated_centers, [-1,2])

for i in range(100):
    centers_data = sess.run(updated_centers, feed_dict={centers:centers_data})

labeled_samples = sess.run(updated_samples_list, feed_dict={centers: centers_data})

# output clustered samples with gnuplot points format

index = 0
command = 'plot '

for s in labeled_samples:
    if not len(s):
        continue

    command = command + ' "out.txt" using 1:2 index {0} with points,'.format(index)
    index = index + 1

    for p in s:
        print('{0} {1}'.format(p[0],p[1]))
    print('')
    print('')

# output plot command to stderr

print(command[0:-1], file=sys.stderr)

sess.close()
```
ssi有効化

#ssi有効化設定
ssiが有効化せず、htmlファイル内のinclude virtual記述でヘッダやフッダがインクルードされなかった。

#httpd.confに追加
```
LoadModule include_module modules/mod_include.so

'<'Directory /var/www/>www以下全てに適応させる
  Options Includes FollowSymLinks
  AllowOverride none
  Require all granted
  AddType text/html .html
  AddOutputFilter INCLUDES .html
'<'/Directory>
```
上から、

* LoadModule include_module modules/mod_include.so（インクルードモジュールを読み込ませる。）
* Options Includes FollowSymLinks（シンボリックリンクの有効化。シンボリックリンクが設定されている場合apacheはそれを辿る。）
* AllowOverride none（.htaccessファイルでは何も設定できない※Allはhtaccessファイルの設定が全て有効化される。）
* Require all granted（アクセス許可の設定）
以前の書き方は、
```Order allow,deny
Allow from all```
だったのが、apache2.4からは、
```Require all granted```
の一文のみ。
こんな基本的な設定方法もかわっている。
* AddType text/html .html（mimeタイプの追加。）
* AddOutputFilter INCLUDES .html（インクルードを有効化することによってssiが有効化される。）

これでssiが有効化し、ヘッダフッダが出現した。
【WordPress】カスタムタクソノミーを自作し、自作したカスタム投稿タイプに適用させる

#【WordPress】カスタムタクソノミーを自作し、自作したカスタム投稿タイプに適用させる

***カスタム投稿タイプを自作したが、それだけだと実用においては不便なのでカスタムタクソノミーを作成し、利便性をアップさせる。今回もプラグインなどは使わずに自作。WordPRessがデフォルトで持っている、カテゴリー、タグも使用できるが、サイトが拡張していったりすると整合性が取れなくなりそうなので、カスタム投稿タイプにはカスタムタクソノミーを適用させるのが良さそう。***

・まず[カスタム投稿タイプを作成](http://qiita.com/pman-maru/items/18e95c775f5fbadfdeb6)する。

・例のごとくfunction.phpにフックを追加し、カスタムタクソノミーを作成。

```lang:function.php
<?php

〜〜省略〜〜

//======================================================================
// カスタムタクソノミーを作成
//======================================================================
function self_made_taxonomies() {
	// 自作カテゴリーを作成
	register_taxonomy( 'self_made_cat',
		array( 'self_made' ),
		array(
			'label'            => '自作したカテゴリー', //表示名
			'show_ui'           => true, //管理画面に表示するか
			'show_admin_column' => true, //管理画面の一覧に表示するか
			'show_in_nav_menus' => true, //カスタムメニューの作成画面で表示するか
			'hierarchical'      => true, //階層構造を持たせるか（持たせるとカテゴリー扱い）
		)
	);
	// 自作タグを作成
	register_taxonomy( 'self_made_tag',
		array( 'self_made' ),
		array(
			'labels'       => '自作したタグ', //表示名
			'show_ui'      => true, //管理画面に表示するか
			'hierarchical' => false, //階層構造を持たせるか（持たせないとタグ扱い）
		)
	);
}
add_action( 'init', 'self_made_taxonomies', 0 );
```

自作した関数（self_made_taxonomies）の中で[register_taxonomy](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/register_taxonomy)の引数に必要な項目を設定するだけで、自作カスタムタクソノミーが作成出来ます。カスタム投稿タイプと同じような作りで方で簡単です。

・カスタムタクソノミー作成前
<img width="476" alt="before_taxo.png" src="https://qiita-image-store.s3.amazonaws.com/0/97158/14a921e4-2f1a-cc44-3350-bc62386e2cb6.png">



・カスタム投稿タイプ作成後
<img width="391" alt="after_taxo.png" src="https://qiita-image-store.s3.amazonaws.com/0/97158/b8f2e3d6-07a0-c7a0-911c-48b1f3ce79d2.png">

カスタム投稿メニューに「自作カテゴリー」、「自作タグ」というメニューが追加されています！


使い方は、WordPressデフォルトのカテゴリー、タグと同様な感じです。

プラグインで出来ることも自作してみると仕組みが色々わかって面白いですね！
たくさんのExcel97-2003(xls)ファイルをExcel2007以降(xlsx)ファイルに変換する方法（Mac用）

_以下はExcelを同時に開き変換して閉じる作業を自動化します。ファイル数によってはExcelが落ちてしまうので気をつけて下さい。だいたい100ファイルくらいで落ちます。_

# はじめに
この方法はMacのExcel 2010とAutomatorでやりました。WindowsだとVBやC#かバッチファイルでなんとかなるんだと思います。

# 経緯
たくさんのxlsファイルがありました。そのファイルの中から画像を抜き出したいと思いました。
色々と調べてみるとどうやらxlsxは拡張子zipに変えるだけでzip解凍できフォルダの中に画像があるとのこと。

それではこのxlsファイルをxlsxファイルにすればよいのですが、ファイルが約800ファイル近くあり、一つずつ手作業でExcelで開いてxlsxに変更して「名前を付けて保存」を繰り返すのは想像するだけでしんどかったので、Macに付属するAutomatorの活用を考えました。

# Automatorの設定
1. Automatorを起動してApplicationを選択する。
<img width="1412" alt="Screen Shot 2016-06-09 at 14.10.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/81960/0b0cec0f-18fe-894b-0781-e5253f34e65b.png">

</br>
2. Finderから「Get Specified Finder Items」(特定のファインダーアイテムを取得)をドラッグアンドドロップ
<img width="1410" alt="Screen Shot 2016-06-09 at 14.11.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/81960/80ac79ed-9cc2-c2ab-586c-fbdbf66f2931.png">


</br>
3. Actionの上の検索キーにexcelと入力して「Convert Format of Excel Files」（Excelファイルのフォーマットを変換）を見つけてドラッグアンドドロップ 
<img width="1412" alt="Screen Shot 2016-06-09 at 14.12.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/81960/ea3dd8c0-bb00-0b78-a92d-f4fcc9762920.png">

4.Automatorを保存します。（念のため）

5.変換したい xlsファイルをドラッグアンドドロップします。

6.右上のRunボタンをクリックします。
CentOS 5.5 を新規にインストールする

検証等の諸般の事情で CentOS 5.5 などの古いバージョンをインストールする必要が出た際の手順と注意事項について。

## ISOイメージのダウンロード
公式のダウンロードページからだと5系の最新の5.11しかダウンロードできない。
https://wiki.centos.org/Download
http://isoredirect.centos.org/centos/5/isos/x86_64/

Archived Versions の下部にある Archived Tree の Tree リンクからダウンロードURL一覧が分かる。
https://wiki.centos.org/Download#line-96
http://vault.centos.org/5.5/isos/x86_64/CentOS-5.5-x86_64-netinstall.iso
USAかEuropeしかアーカイブがないようだ。日本時間22時頃だとEuropeの方が速かった。
上記URLから遷移しても結局ルートからディレクトリーを選び直しになるという。

### 最終的なダウンロードURL
USA:
http://archive.kernel.org/centos-vault/5.5/isos/x86_64/
http://mirror.symnds.com/distributions/CentOS-vault/5.5/isos/x86_64/
http://bay.uchicago.edu/centos-vault/5.5/isos/x86_64/
Europe:
http://mirror.nsc.liu.se/centos-store/5.5/isos/x86_64/
**※32ビット(i386)を選択する場合、最大メモリが4GBまでしか対応していないので、仮想環境で構築する際などメモリ設定に注意。**
32ビットのまま4GBより大きいメモリ環境で利用したい場合は PAE カーネルを利用することで64GB（実質16GB[^pae]）まで利用可能になる。`yum install kernel-PAE` など。（@iwaim@githubさんの指摘により追記）

[^pae]: http://pori-pory.blogspot.jp/2010/02/blog-post_24.html

### 国内ミラー
上記正規ルートでは確認できないが、 JAISTにミラーが構築されているらしい。（@iwaim@githubさんからの情報）
http://ftp.jaist.ac.jp/pub/Linux/CentOS-vault/
ここからたどるとISOファイルもより短時間でダウンロードできるだろう。
http://ftp.jaist.ac.jp/pub/Linux/CentOS-vault/5.5/isos/x86_64/


## インストール
### VirtualBox 
### インストール
Enterを押さないと開始されない。

Web site name: `vault.centos.org`
CentOS directory: `/5.5/os/x86_64`

`Retrieving images/stage2.img...` のメッセージが表示されてからしばらく動かないが、データをダウンロードしているので、不安な場合はリソースモニター等で転送状況を確認するといいだろう。
ASP.NET 自作DLL作成方法

①プロジェクト「クラスライブラリ」作成

②クラスなどコーディング
※自分で「参照の追加」が必要
　system.Web
　System.Drawing

③ビルドしてbinフォルダのdllを参照元から読み込む。

【自作DLLデバッグ方法】
クラスライブラリプロジェクトのプロパティを開く
→デバッグを選択
→debugの「ネイティブコードのデバッグを有効にする」を選択
→debugをビルドし生成されたdllを参照元プロジェクトで読み込む。
→参照元プロジェクトをデバッグ。dll利用する箇所のコードにブレークポイントをおいて、ステップイン。

※参照元プロジェクトにてlog4net設定が必要。
　今回作成したFileUploadのdllはlog4netでログ出力処理を行っているが
　出力先の設定はクラスライブラリ側ではおこなっていない。
　ローカルデバッグで参照元プロジェクトでのlog4net設定が利用され、
　参照dllにてログ出力処理が行われたことを確認。
［XCode］［ダイアログ］Could not launch "project名" 対応方法

##Could not launch "project名" 対応方法

原因は、自分の持っている実機に申請しようとしているようなものです。

PROJECT
TARGETS
Build Settings -> Code Signing -> Code Signing Identity

iOS Developer：開発用 か　iOS Distribution：申請用　（各々の証明書の名前の時もあります。）

この部分を iOS Developer:開発用にすると解決できると思います。

 
たまに起きるんですよね。
急いでいたりするとね。

## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/
Docker のストレージドライバー関係を調べるときによる見るページ

# 概要

ファイルシステムの選択とかするときに、いくつかよく見るページがあるが、毎回探すのが大変なので、まとめたい。

# まとめ

overlayとか使うなら、組み合わせとかもみれるし、パフォーマンスについても書いてあるのでよい。
他にも何かあった気がするが、最初のとっかかりとしてはこれですんでいるかもしれない。


## 公式ドキュメント

* [Select a storage driver](https://docs.docker.com/engine/userguide/storagedriver/selectadriver/)

## 公式ドキュメント日本語訳

* [ストレージ・ドライバの選択 — Docker-docs-ja 1.11.0 ドキュメント](http://docs.docker.jp/engine/userguide/storagedriver/selectadriver.html)

## github での最先端

* [docker/docs/userguide/storagedriver at master · docker/docker](https://github.com/docker/docker/tree/master/docs/userguide/storagedriver)


### 参考、ファイルシステムごとの d_type のサポートについて

http://man7.org/linux/man-pages/man3/readdir.3.html

日本語訳

https://linuxjm.osdn.jp/html/LDP_man-pages/man3/readdir.3.html

### 参考、kernel.org のファイルシステム関連

* [Kernel.org git repositories](http://git.kernel.org/cgit)
LVMで既存のPVとLVを拡張する

# やりたいこと #
LVM環境下でディスク容量を追加する場合、PV追加してVGへ新PVを参加させるのが通常のやり方だが、今回はroot領域を増やすため、PVを増やしたくないという理由から、既存のPVとLVを拡張し、新たなPVの追加をせずにLVを拡張した。


# 方法 #
**※拡張したいPVがディスクの最終パーティションのときのみ有効**
**<変数>記述は環境に合わせて読み替え**

## １. 既存のディスク容量を追加する ##

    ・VMだと容量割り当ての追加＆スナップショット全削除
    ・物理だと大容量ディスクへクローン交換

## ２. レスキューCDから起動 ##

    ・BIOSの起動デバイス優先順位に注意

## ３. パーティション編集 ##

```
[~]# fdisk /dev/<拡張したいディスク>
コマンド (m でヘルプ): 以下コマンドを順に入力
d [Enter] ※領域の削除
<最終パーティション番号> [Enter] ※ 領域の選択

p [Enter] ※領域の表示

n [Enter] ※領域の作成
p [Enter]
<最終パーティション番号> [Enter]
First sector: [Enter]
Last sector: [Enter]

p [Enter] ※領域の表示

t [Enter] ※領域のシステムID変更
2 [Enter]
8e [Enter] ※Linux LVM

w [Enter] ※書き込み

[~]# exit
```

## ４. 普通に起動

    ・レスキューCDを取り出す
    ・普通に起動する

## ５. PV のオンラインリサイズ

```
# pvdisplay　　　　　                  ※pv確認
# pvresize <最終パーティションのPV名>  ※pvリサイズ
# pvdisplay　　　　　                  ※pvリサイズ後の確認
```

## ６. LVの拡張

```
# pvdisplay　　　　                  　※Free PEの確認
# lvextend -l <割り当てたいPE数> <拡張したいLV>
```

## ７. ファイルシステムのオンラインリサイズ

```
# resize2fs /dev/<拡張したいLV>        ※ext4の場合
# xfs_growfs /dev/<拡張したいLV>       ※xfsの場合
```
centos7にgo-ethereumをインストールする

# centos7にgethをインストールする

## golangのインストール

```
sudo yum install -y epel-release
sudo yum install -y golang gmp-devel git
```

## gethのコンパイル

```
git clone https://github.com/ethereum/go-ethereum
cd go-ethereum
make geth
sudo cp build/bin/geth /usr/local/bin
```

## 初回起動

```
geth --fast
```

## データディレクトリ

```
ls ~/.ethereum/
```

## 永続化

```:/etc/systemd/system/geth.service
[Unit]
Description=go-ethereum
After=syslog.target network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/geth　--rpc　--rpcaddr　"localhost"　--rpcport　"8545" --rpcapi　"eth,net,web3"
WorkingDirectory=/home/centos
KillMode=process
Restart=always
User=centos
Group=centos

[Install]
WantedBy=multi-user.target
```

## 起動・終了

```
sudo systemctl start geth
sudo systemctl stop geth
```
ansibleでcomposerをインストール

```yml
- name: install composer
  become: true
  shell: curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin && mv /usr/bin/composer.phar /usr/bin/composer
         creates=/usr/bin/composer
```

シェルで`|`を使いたい場合はcommandモジュールじゃなくてshellモジュールを使うのか
React: Validation

#1.react-validation-mixinを使用

    npm install react-validation-mixin

他のpackage.jsonの中にgulp-utilを追加するとnpm installを使用

    "react-validation-mixin":"5.3.x"

(最新バージョンで、**joi-validation-strategy**と一緒使う)
#2.使う
##使い方
**validatorTypesの定義**

    validatorTypes = {
      username: Joi.string().alphanum().min(3).max(30).required().label('Username'),
      password: Joi.string().regex(/[a-zA-Z0-9]{3,30}/).label('Password')
    }

**バリデーション**

    getValidationMessages: function(field){
      var err_msg = [];
      if (!this.isValid(field)) {
              err_msg.push("...");
            }  
     ...
    }

**レンダリング**

    this.renderHelpText(this.getValidationMessages('password'))

##古いバージョン/ES5
import validation from 'react-validation-mixin'

    var UserLogin = React.createClass({
    mixin: [validation],
    
    validatorTypes = {
          username: Joi.string().alphanum().min(3).max(30).required().label('Username'),
          password: Joi.string().regex(/[a-zA-Z0-9]{3,30}/).label('Password')
    },
    ...
    getValidationMessages: function(field){
          ...
          if (!this.isValid(field)) {
          ...
    })

##最新バージョン/ES6

    import validation from 'react-validation-mixin'
    import strategy from 'joi-validation-strategy'
    class UserLogin extends Component {
    constructor(props) {
        super(props);
        this.validatorTypes = {
          username: Joi.string().alphanum().min(3).max(30).required().label('Username'),
          password: Joi.string().regex(/[a-zA-Z0-9]{3,30}/).label('Password')
        };
      }
    getValidationMessages: function(field){
          ...
          if (!this.props.isValid(field)) {
          ...
    }
    export default validation(strategy)(UserLogin)
Xcodeが開かなくなってヤバイ時の備忘録


```bash
ps aux | grep Xcode
```

```bash
kill -9 24413
```

とかで、Xcodeの怪しいプロセスを消す

あとは再起動、SMCリセットとかやったら治った
https://support.apple.com/ja-jp/HT201295
【PHP】PHP7でAPCuを動かす

# まずはじめに

## PHP7はどうやって入れたの?

前提として、PHP7はこちらを参照して入れました。
http://qiita.com/qiita-kurara/items/7f4619c04e5fee212147

# peclが使えるようにする

```
[root@test-web ~]# yum install php70w-pear httpd-devel
```

# peclを使ってAPCuをインストール

```
[root@test-web ~]# pecl install APCu
```

# php.iniを編集

APCuをインストールすると、以下のようなメッセージが表示される。

```
configuration option "php_ini" is not set to php.ini location
You should add "extension=apcu.so" to php.ini
[root@test-web ~]#
```

php.iniに"extension=apcu.so"を追加する。

```
[root@test-web ~]# vi /etc/php.ini
```

## 番外編:php.iniの探し方

php --iniコマンドで、一番上に書かれているphp.iniが読まれている。
今回の場合は'/etc/php.ini'が該当する

```
[root@test-web ~]# php --ini
Configuration File (php.ini) Path: /etc
Loaded Configuration File:         /etc/php.ini
Scan for additional .ini files in: /etc/php.d
Additional .ini files parsed:      /etc/php.d/bz2.ini,
/etc/php.d/calendar.ini,
/etc/php.d/ctype.ini,
...
/etc/php.d/curl.ini,

[root@test-web ~]# 
```

# php -i　で確認

apcuの表示が出てくればOK

```
[root@test-web ~]# php -i | grep 'apc'
apcu
apc.coredump_unmap => Off => Off
apc.enable_cli => Off => Off
apc.enabled => On => On
apc.entries_hint => 4096 => 4096
apc.gc_ttl => 3600 => 3600
apc.mmap_file_mask => no value => no value
apc.preload_path => no value => no value
apc.serializer => php => php
apc.shm_segments => 1 => 1
apc.shm_size => 32M => 32M
apc.slam_defense => On => On
apc.smart => 0 => 0
apc.ttl => 0 => 0
apc.use_request_time => On => On
apc.writable => /tmp => /tmp
[root@test-web ~]# 
```

# httpdプロセスの再起動

```
[root@test-web ~]# /etc/init.d/httpd restart   
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
[root@test-web ~]# 
```
【PHP】PHP7でmemcachedを動かす

# まずはじめに

## PHP7はどうやって入れたの?

前提として、PHP7はこちらを参照して入れました。
http://qiita.com/qiita-kurara/items/7f4619c04e5fee212147

## 参考にしたページ

「php7 memcached」でググると先人の方々が既にPHP7でmemcachedを動かすやり方についてまとめてくださっています。
http://blog.webmemo.red/linux/php7-memcached-extension-install/
http://dqn.sakusakutto.jp/2015/07/php7_trap.html

そのため、以上のページをご覧になってエラーが出ずに順調に設定ができ、phpinfo()で以下表示が出さえすればこの先は読まなくて大丈夫です。

<img width="993" alt="スクリーンショット 2016-06-09 12.05.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/57635/767b46e5-2469-3f5d-0d36-cc79941c8017.png">


こちらでは、「この先ぶつかるかもしれない問題リスト」を以下にまとめておきました。

# この先ぶつかるかもしれない問題リスト

## php-memcachedの"./configure"で引っかかる

### エラー1

```
checking for zlib location... configure: error: memcached support requires ZLIB. Use --with-zlib-dir=<DIR> to specify the prefix where ZLIB headers and library are located
```

**ZLIBないっすよ。**と怒られています。
このエラーが出た時は以下コマンドで解決

```
yum install zlib-devel
```

### エラー2

```
configure: error: no, libmemcached sasl support is not enabled. Run configure with --disable-memcached-sasl to disable this check
```

> Run configure with --disable-memcached-sasl

言われたとおりにコマンドを実行してみましょう。

```
./configure --disable-memcached-sasl
```

## php-memcachedのmakeで引っかかる

"make" でエラーが発生

```
/usr/local/src/php-memcached/php_libmemcached_compat.h:56: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'php_memcached_instance_st'
```

この場合、yumで入れたlibmemcachedのバージョンが低くて引っかかっているようです。
(参考 : http://qiita.com/wata727/items/927ae072ccefe9e3de8c)
→ **入れなおしましょう。**

```
[root@test-web php-memcached]# yum remove libmemcached
[root@test-web php-memcached]# cd /url/local/src
[root@test-web src]# wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
```

ちなみにここでwgetないよって言われたらwget入れてあげてください。

```
[root@test-web src]# yum install wget
```

気を取り直して以下コマンドでlibmemcachedを入れなおします。

```
[root@test-web src]# tar -zxvf libmemcached-1.0.18.tar.gz
[root@test-web src]# cd libmemcached-1.0.18
[root@test-web src]# ./configure --without-memcached && make && make install
```

## memcached.soが読み込めなくて引っかかる

/usr/lib64/php/modules/にmemcached.soが読み込めない時はこんなエラーが出てきます。

```
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/memcached.so' - /usr/lib64/php/modules/memcached.so: cannot open shared object file: No such file or directory in Unknown on line 0
```

この時はphp.iniの設定が足りない可能性があります。
詳しくはこちらを参照 http://qiita.com/nnmr/items/778c3e9c4dbb7fb25a73
mpdfで利用するfontをライブラリ外から指定する方法

mpdf version6.1環境を前提に記載します。

phpからhtmlをpdfに変換するライブラリとしてmpdfがあります。
歴史のあるライブラリのようなので、まだ利用されている方もいらっしゃると思います。
歴史があるだけあってコードを見てもムムムッってなりますね。
mpdf.phpだけで3万行以上あります。

さて表題の件ですがネットを見るとmpdf内のconfigファイルを直接編集する方法が出て来ます。
Composer経由でライブラリ管理した場合、一般的にvenderディレクトリはバージョン管理外に指定すると思いますので、上記以外の対応が必要になってきます。

以下の方法で対応が可能でした。

```php
// フォントを探す際に_MPDF_SYSTEM_TTFONTSが優先して適用される。
// 外部から指定可能とするために未定義となっている。
define('_MPDF_SYSTEM_TTFONTS', APPPATH."ttfont/");
// CSSで利用するフォント名称
$JpFontName = 'ipapgothic';

// 日本語・中国語・韓国語を強制的に有効化
// ver6ではコンストラクタ内で'aCJK'が指定されていれば、useAdobeCJKが有効なる
$mpdf = new mPDF('ja+aCJK');

// fontのの指定を行います。
// setFontDataとかmethodで定義されていないのでmpdfのコンストラクタ内で実行しているfont設定処理も併せて実行します。
$mpdf->fontdata[$JpFontName] = array(
    'R' => 'ipapgothic.ttf',
);
$mpdf->available_unifonts[] = $JpFontName;
$mpdf->default_available_fonts[] = $JpFontName;

// 日本語の場合、以下の指定をしないと文字化けします。
// 以下の英語のコメントがあるので、下の解説と併せると不要に見えますが指定しておきます。
//----------------------------------------------------------------------------------------------
// Add fonts to this array if they contain characters in the SIP or SMP Unicode planes
// but you do not require them. This allows a more efficient form of subsetting to be used.
//----------------------------------------------------------------------------------------------
// BMP：基本多言語面（Basic Multilingual Plane）
// 　・現在よく使われている欧米のアルファベットやCJK漢字コードなどが割り当てられている。最初のUnicode規格で制定されていた領域
// 　・この面のコードは16bit以内で表現できるため、コード効率がよい
// SMP：追加多言語面（Supplementary Multilingual Plane）
// 　・現在ではあまり使われていない古代の文字や、顔文字などの記号類を収容
// SIP：追加漢字面（Supplementary Ideographic Plane）
//　・人名でしか使わないような、使用頻度の低い漢字などを収容
//----------------------------------------------------------------------------------------------
$mpdf->BMPonly[] = $JpFontName;

$mpdf->SetDefaultFont($JpFontName);
```
「異常検知と変化検知」第7章 方向データの異常検知

# 7.1 方向データの確率分布

## 方向データとは
長さ1に規格化されたM次元ベクトル。方向だけに情報がある。
<img width="247" alt="b.png" src="https://qiita-image-store.s3.amazonaws.com/0/32243/0be2d838-b862-eb94-973f-daac3ed8b1cb.png">


## フォン・ミーゼス・フィッシャー分布

$M(x|\mu, \kappa) = \frac{\kappa^{M/2-1}}{(2\pi)^{M/2}I_{M/2-1}(\kappa)} exp(\kappa\mu^{T}x)$

* 平均方向$\mu$
* 集中度$\kappa$
* 第1種変形ベッセル関数$I_{\alpha}(\kappa)$

<img width="246" alt="a.png" src="https://qiita-image-store.s3.amazonaws.com/0/32243/ab34509f-a93f-c1bf-6126-d4324c0f848b.png">


# 7.2 平均方向の最尤推定

分布のパラメータのうち、平均方向をデータから推定する。（集中度$\kappa$は直接求めない。）

## 尤度

$L(\mu, \kappa|D) = ln\Pi_{n=1}^{N}c_{M}(\kappa)exp(\kappa\mu^Tx^{(n)}) = \sum_{n=1}^{N}(lnc_{M}(\kappa) + \kappa\mu^Tx^{(n)})$

## 最尤推定
尤度$L$を最大化する平均方向ベクトル$\mu$を求める。

拘束条件 $\mu^T\mu = 1$をラグランジュ係数で取り込んでを解くと

$\hat{\mu} = \frac{m}{\sqrt{m^Tm}}$

$ m \equiv \frac{1}{N}\sum_{n=1}^{N}x^{(n)}$

結果は、データ平均ベクトルを長さ1に規格化したもの

#7.3 方向データの異常度とその確率分布

## 異常度の定義

データ$x'$の異常度 

$a(x') = 1- μ^Tx'$

平均方向ベクトル$\mu$との距離を、内積を用いて表現。

## 異常度の確率分布

結論：異常度$a$の確率分布はχ二乗分布となる

$M(\mu, \kappa)$に従う$x'$がある時、異常度$a$の分布は

$p(a) = \int_{S_M}dx\delta(a-(1-\mu^Tx)) C_M(\kappa)exp(\kappa\mu^Tx)$

$u=\cos\theta_1$を用いて置換積分し、$a\ll1$を用いると

$p(a)\propto a^{(M-1)/2-1}exp(-\kappa a)$

これは、自由度$M-1$, スケール因子$1/2\kappa$のχ二乗分布

# 7.4 積率法によるχ二乗分布の当てはめ

χ二乗分布のパラメータ $m, s$を、データから推定する。

$m, s$のχ二乗分布の1次・2次モーメントは

$\<a\> = \int_0^{\infty}a\chi^2(a|m,s)da = ms$

$\<a^2\> = \int_0^{\infty}a^2\chi^2(a|m,s)da = m(m+2)s^2 $

データから求めた以下のaの1次・2次モーメントをこれらと等置して、$m, s$を求める

$\<a\> = \frac{1}{N}\sum_{n=1}^{N}a^{(n)}$

$\<a^2\> = \frac{1}{N}\sum_{n=1}^{N}a^{(n)^2}$

求めた$\hat{m}_{mo}$は一般にMよりも小さい事が多く、データの有効次元と解釈できる。
AWS LambdaからS3にbase64encodeの画像ファイルを保存

何回もこのソース書いてる気がするから、自分のメモ用に。
書いたタイミングではjpegだけしか必要なかったため、jpegチェックをいれてある。
外部依存モジュールなしで、Lambda codeで動作。
Node.js 4.3をRuntimeに。

エラー処理ちょっと直しました。

```node.js
var aws = require('aws-sdk');

var s3 = new aws.S3({ apiVersion: '2006-03-01', region: '{aws-region}' });
var BUCKET_NAME = '{BUCKET_NAME}';
var DIRECTORY_PATH = '{SAVE_DIRECTORY}'

exports.handler = function(event, context) {

    var fileName = '/' + event.name + '.jpg';
    console.log('bucket:', BUCKET_NAME, 'file-path:', fileName);

    var imageBuffer = decodeBase64Image(event.image, context);
    console.log(imageBuffer);

    var params = {Bucket: BUCKET_NAME, Key: DIRECTORY_PATH + fileName, ContentType: imageBuffer.type, Body: imageBuffer.data};

    s3.putObject(params, function(err, data) {
        if (err) {
            console.log(err);
            context.fail('Image upload failed. file=' + DIRECTORY_PATH +  fileName);
        } 
        context.succeed('Image upload success. file=' + DIRECTORY_PATH +  fileName);
    });
};

function decodeBase64Image(dataString, context) {
    var matches = dataString.match(/^data:([A-Za-z-+\/]+);base64,(.+)$/),
    response = {};

    if (matches.length !== 3) {
        context.fail('Invalid input string');
    }

    response.type = matches[1];
    if (matches[1] != 'image/jpeg') {
        context.fail('image file is not jpeg format.');
    }
    response.data = new Buffer(matches[2], 'base64');

    return response;
}
```
validationエラーを起こした入力欄にcssを適用したい場合


エラーを起こした入力欄はclass属性が`field_with_errors`のdivタグで囲まれる。

CSSで`div.field_with_errors`にデザインを記述すれば、エラーを起こした入力欄にCSSを適用できる。

```css
div.field_with_errors {
}
lpic 304-200受けた人のメモ

[はじめに]

lpic level2を取得してから5年のリミット目前に
level3を受けないと崖っぷちになった人の学習メモです
仮想化だけでも網羅しておこうとメモをまとめました
lpic 304-150 は簡単と言われていたので
lpic 304-200になっても余裕かましてたら1回落ちました
lpic 304-150の問題集及びサイト情報はむしろ混乱するので気を付けましょう
技術はすすんでおりますね
無事リミット前に受かりました。

[参考リンク集]
サイト：
http://www.lpi.or.jp/lpic3/range/range304.shtml
https://www.lpi.org/study-resources/lpic-3-304-exam-objectives/
http://lpi.universe-network.net/doku.php?id=wiki:certification:lpic304
http://wiki.lpi.org/wiki/LPIC-304_Objectives_V2

問題集：
http://book.impress.co.jp/books/1115101132

[備忘録]

<150じゃたらなかった知識>

* IaaS(削除しておくもの：秘密鍵、機密データ)
* Pacemaker（スプリットブレイン）
* xl
* xenstore-ls
* XAPI
* コンテナ型仮想化
* qemuモニタ(Ctrl+Alt+2)change
* virsh detach-disk DOMAIN TARGET 
* qemu-kvm -boot
* gfs2のジャーナルファイルは何個？
* qemu-img qcow2という仮想マシン拡張子
* xenの完全仮想化の設定値 builder = 'hvm'
* kvmでも完全仮想化できるようになってた

<お約束ででた>

* cpu flags
* kvmのkernelモジュール名
* Xenのautostart
* Xenでの仮想マシン停止、強制停止コマンド（xlで出題されてパニックった）

<でた>

* OpenVZのコマンド名
* xentop

1.仮想化
1.1.概念

* ホストOS型
 * VM Workstation
 * virtualBox
* ハイパーバイザー型
 * Xen
 * VM ESXi
 * Hyper-V
* コンテナ型
 * LXC
 * OpenVZ
 * Docker
* 完全仮想化
 * cpuflg
 * スーパーバイザコール
* 準仮想化
 * kernel変更する
 * ハイパーバイザコール
* メリット
 * 複製移動が容易
 * 運用管理の手間を削減
* デメリット 
 * 性能劣化がある
 * 運用管理者のスキル
* 移行(migration)
 * P2V
 * V2V

1.2.Xen

* ハイパーバイザー型
* /etc/xen/xl.conf
* Domain-0(管理OS)
 * dom0_mem
 * vif1.0 
* Domain-U(ゲストOS)
 * フロントエンド
* xen_memo0 はブートローダに設定

1.3.KVM

* qemuが必須
* virshも使う
* kvm-intel.ko/kvm-amd.ko
* 完全仮想もできるようになったからね
よく忘れる正規表現　

たまに使うけど忘れちゃうので、メモ代わり。

5を含まない文字列を抽出する正規表現
^(?!.*5).*
5を含む文字列を抽出する正規表現
.*(?=5).*
1,2,4,5,6,7,8,9を含む文字列を抽出する正規表現
.*(?=[1,2,4,5,6,7,8,9]).*\r\n
Sinatra(Padrino)でredirectした時のステータスコードは2種類ある（302, 303）

# はじめに

ユーザからのリクエストに対する応答としてredirectでページ遷移させたい場合がある。Padrinoでリダイレクトした際の、コントローラから帰ってくるステータスコードをテストしていたのだが、redirectしたときのステータスコードが2種類あって困ったので調べた。

仕様としてドキュメントに明示されているかどうかはよくわからなかった。少なくとも[README](http://www.rubydoc.info/gems/sinatra#Browser_Redirect)にはステータスコードについての記述は特に無いように見える。

#実際の処理

Padrinoのリダイレクト処理の実体はSinatraのものを使っているようだ。以下の`redirect`メソッドはGithubの[Sinatraリポジトリ](https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb)より引用。

```sinatra/base.rb
    # Halt processing and redirect to the URI provided.
    def redirect(uri, *args)
      if env['HTTP_VERSION'] == 'HTTP/1.1' and env["REQUEST_METHOD"] != 'GET'
        status 303
      else
        status 302
      end

      # According to RFC 2616 section 14.30, "the field value consists of a
      # single absolute URI"
      response['Location'] = uri(uri.to_s, settings.absolute_redirects?, settings.prefixed_redirects?)
      halt(*args)
    end
```

# 結論

* HTTP/1.1であり、かつMETHODが`GET`以外であれば`303`
* 上記以外なら`302`
統計まとめその1 度数分布表



統計の本を眺めていると多くの本が度数分布表から始まる。
最初のころは、楽勝じゃんこんなの。
と考えていた時期もあったが、勉強していくうちに結局この考えに行きつくんだな
ってくらい重要だったので整理の意味でも度数分布表（ヒストグラム）についてまとめてみようと思う。

#1.度数分布表
観測されたデータを階級ごとに分けて表形式にしたもの

ex.
50人の身長を階級別に表にした場合

| 身長(階級) | 人数 | 相対度数 |
|:-----------|------------:|:------------:|
| 145～150   |        10 |     0.2     |
| 150～155   |      30 |      0.6  |
| 155～160   |        10 |     0.2     |

階級の決め方は色々議論があるが、まずはこうゆう表を作るところから。
145～150の身長の人が10人で割合が0.2(10/50=0.2)です。という表。
相対度数が後に確率として扱われることになる。

##1.1度数分布表からの平均値

    平均値＝階級値その1 * 相対度数その1 + ・・・・
    
    階級値=(階級の下限 + 階級の上限)/2
    ※今回は範囲（ｘｘｘｘ～▲▲▲▲）があるので、上記のような算出を行います。
      範囲が無い場合は、階級をそのまま階級値として利用する
    
実際の計算

    平均値={((145+150)/2) * 0.2} + {((150+155)/2) + 0.6} + {((155+160)/2) + 0.2}
    ⇒
    {147.5 * 0.2 } + {152.5 * 0.6} + {157.5 * 0.2} 
    ⇒
    {29.5}+{91.5}+{31.5}=152.5

となる。

一人一人の身長がわからないのに、平均なんて出せるの？というところは統計学のご愛嬌。
統計学はある程度誤差はOKとするところがあります。ただ、上記で算出された152.5は
一人一人の身長がわかっていてそこから平均をとった値と、そんなに違いはないそうな。

##1.2度数分布からの標準偏差
平均値と同様に、標準偏差も求めることができる。

    分散=(平均値-階級値その1) * 相対度数その1 + (平均値-階級値その2) * 相対度数その2 + ・・・
    標準偏差=sqrt(分散)
    
    分散=(152.5-147.5)^2 * 0.2 + (152.5-152.5)^2 * 0.6 + (152.5-157.5)^2 * 0.2 = 計算は省略
    
※分散、標準偏差については以下にも記載
http://qiita.com/yuki_saito_/items/dbbf1bf18879b3b248f0

##1.3表としてまとめる意義
①見やすい
②整理しやすい
③計算しやすい
データを見るときはまず整理からといったところな気がする。

こんな表から、正規分布だなんだとなっていくので、不思議な気分。
次回は正規分布周りをまとめてみようと思う（多分）。