OmniAICreator/Qiita-1.07M huggingface dataset:
RuboCopのrake taskを使う

## <i class='fa fa-wrench'></i> デフォルト
デフォルトの設定で利用してみます。

```ruby:Rakefile
require 'bundler/gem_tasks'
require 'rubocop/rake_task'
RuboCop::RakeTask.new
task default: :spec
```

* 設定前

```sh
$ rake -T
rake build                 # Build sample-0.1.0.gem into the pkg directory
rake clean                 # Remove any temporary products
rake clobber               # Remove any generated files
rake install               # Build and install sample-0.1.0.gem into system gems
rake install:local         # Build and install sample-0.1.0.gem into system gems without network access
rake release[remote]       # Create tag v0.1.0 and build and push sample-0.1.0.gem to Rubygems
```

* 設定後

```sh
$ rake -T
rake build                 # Build sample-0.1.0.gem into the pkg directory
rake clean                 # Remove any temporary products
rake clobber               # Remove any generated files
rake install               # Build and install sample-0.1.0.gem into system gems
rake install:local         # Build and install sample-0.1.0.gem into system gems without network access
rake release[remote]       # Create tag v0.1.0 and build and push sample-0.1.0.gem to Rubygems
rake rubocop               # Run RuboCop
rake rubocop:auto_correct  # Auto-correct RuboCop offenses
```

rubocop と rubocop:auto_correct が追加された

* 実行結果

```sh
$ rake rubocop
Running RuboCop...
Inspecting 6 files
..C..C

Offenses:

# RuboCop comment
                                                                                ^^^^^^^^^^^^^^^^^^^^^^^^
lib/sample.rb:3:1: C: Missing top-level module documentation comment.
module Sample
^^^^^^

# 中略

6 files inspected, 7 offenses detected
RuboCop failed!
```

## <i class='fa fa-wrench'></i> HTMLフォーマットを指定
HTMLフォーマットで利用してみます。

```ruby:Rakefile
require 'bundler/gem_tasks'
require 'rubocop/rake_task'
RuboCop::RakeTask.new do |r|
  r.formatters = ['html']
end

task default: :spec
```

* 実行結果

```sch
$ rake rubocop
Running RuboCop...
<!DOCTYPE html>
<html>
  <head>
    <meta charset='UTF-8' />

中略

    <footer>
      Generated by <a href="https://github.com/bbatsov/rubocop">RuboCop</a>
      <span class="version">0.43.0</span>
    </footer>
  </body>
</html>
RuboCop failed!
```

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* [bbatsov/rubocop - GitHub](https://github.com/bbatsov/rubocop)
GD Library extension not available with this PHP installationのエラーが出たときの対処法

intervention/imageを使って画像のアップロード機能をつけていくとき、以下のエラーが出ました。

```
NotSupportedException in Driver.php line 16:
GD Library extension not available with this PHP installation.
```

このエラーの解決策を書いていきます。

## 1. GDをPHPに有効化する

gdをPHPで有効化するために
`phpbrew ext install gd`
でgd拡張がインストールできます。

これで、解決できることもありますが、自分の場合jpegの画像を保存しようとすると以下のエラーが出ました。

```
FatalErrorException in Decoder.php line 32:
Call to undefined function Intervention\Image\Gd\imagecreatefromjpeg()
```

そこで、次の解決策を書いていきます。

## 2. gd拡張をjpegを扱うオプションをつけてインストール

まず、gd拡張を一度アンインストールします。
`phpbrew ext clean gd`

次に、gd拡張をjpegを扱うオプションをつけてインストールします。
`phpbrew ext install gd -- --with-jpeg-dir=/usr/local/Cellar/`

すると、jpegの画像でも保存できるようになりました。

## 3. そもそもgdをPHPで有効化できない

`phpbrew ext install gd` のコマンドをうつと、以下のようなエラーが出た場合...

```
Error: Command failed: phpize > /Users/username/.phpbrew/build/php-5.6.23/ext/gd/build.log 2>&1 returns:
```

まずは、`/Users/username/.phpbrew/build/php-5.6.23/ext/gd `の中身を見てあげる
次に `phpize` のコマンドを打つ

```
$ cd /Users/username/.phpbrew/build/php-5.6.23/ext/gd
$ phpize
```

そうすると、ターミナルに以下のように表示された。

```
 Configuring for:
 PHP Api Version:         20041225
 Zend Module Api No:      20060613
 Zend Extension Api No:   220060519

Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.
```

`Please check your autoconf installation` と書いてあるので、
autoconfをインストールしてあげる

```
$ brew install autoconf
```

これで、 `phpbrew ext install gd` のコマンドを使うことができました。
Facebook Share Dialog で画像やビデオをシェア(iOS9, swift2.3) [2016年10月]

# Facebook SDK で画像やビデオをシェアで困った
Facebook SDK に『アセットのURL』を渡さないといけませんが、ALAsset は iOS 9 で廃止になり、iOS 8 から使用が推奨されている PHAsset では URL が取れなくて困りました。
こちらのとりあえずの解決方法をメモしておきます。
※デザインにこだわりがない場合は、UIActivityViewController を使うのが簡単です。

# PHAsset から URL を生成
localIdentifier を使います。

``` some-code.swift

// asset の URL は、以下の書式
// assets-library://asset/asset.<type>?id=<localIdentifier(36文字)>&ext=<type>
// type は以下の識別子
// video : MOV
// jpg : JPG
// png : PNG

let asset:PHAsset = "<共有したいAsset。カメラロールなどに保存してあること>"
let identifier = asset.localIdentifier
let id = identifier.substringToIndex(identifier.startIndex.advancedBy(36))
let url = "assets-library://asset/asset.MOV?id=\(id)&ext=MOV"
```

# info.plist に、[assets-library] を登録
登録しないと、assets-library でコケます。

``` info.plist
LSApplicationQueriesSchemes
 item(?) : assets-library
```

# あとは普通にシェア

``` some-code.swift(つづき)

let video = FBSDKShareVideo()
let content = FBSDKShareVideoContent()

video.videoURL = NSURL(string: url) // 上で求めた asset URL
content.video = video

// dialog.mode を設定する必要があるかもしれないのでインスタンス化してますが、
// ナシでも動きました。
let dialog = FBSDKShareDialog()
dialog.delegate = nil
dialog.shareContent = content
dialog.fromViewController = self
dialog.show()

```

以上です。
Gulpでpngquantを使ってPNGの減色＆軽量化

# gulp + gulp-imagemin + imagemin-pngquant の組み合わせ

gulp-imagemin だけでは PNG がいまいち小さくならない。メタ情報を削除するだけで減色はしていないようです。

というわけで ImageAlphaなどでも使われている pngquant をgulpでも使っちゃう便利モジュールが imagemin-pngquant です。名前からわかるように gulp-imagemin と組み合わせて使います。

※この記事はすでに gulp を使っている人を対象としています。

## インストール
```
npm install -g gulp-imagemin
npm install -g imagemin-pngquant
```

いろんなプロジェクトで使うのでグローバルインストールしちゃってます。

## gulpfile.js の書き方

```js:
var path = {
  module : '/usr/local/lib/node_modules/',
  src : "",
  dist : "../"
}
var image_src = path.src + 'img/*.{png,jpg,gif,svg}';
var image_dist = path.src + 'img/optimize/';

var imagemin = require(path.module + 'gulp-imagemin');
var pngquant = require(path.module + 'imagemin-pngquant');

gulp.task("imagemin", function(){
    gulp.src( image_src )
    .pipe(imagemin(
        [pngquant({quality: '40-70', speed: 1})]
    ))
    .pipe(gulp.dest( image_dist ));
});
```

### 動かない書き方
実は imagemin-pngquant を使うまですごい悩みました。というのも gulp-imagemin の構文が古い（？）情報ばかりだったのです。

検索して出てくる情報では下記のように「use」を使っていますが、 2016.10現在のバージョンでは動きませんでした。

```js:
gulp.task("imagemin", function(){
    gulp.src( image_src )
    .pipe(imagemin({
        use:[pngquant({quality: '40-70', speed: 1})]
    }))
    .pipe(gulp.dest( image_dist ));
});
```

## pngquant は余計なガンマ情報を付加する

pngquant で減色するとなぜか画像が暗くなることがあります。原因は pngquant が余計なガンマ情報を付加するからだそうです。

最後にもう一度 gulp-imagemin を実行することでその情報を削除できます。それを反映させたものが下記のコードになります。

```js:
var path = {
  module : '/usr/local/lib/node_modules/',
  src : "",
  dist : "../"
}
var image_src = path.src + 'img/*.{png,jpg,gif,svg}';
var image_dist = path.src + 'img/optimize/';

var imagemin = require(path.module + 'gulp-imagemin');
var pngquant = require(path.module + 'imagemin-pngquant');

gulp.task("imagemin", function(){
    gulp.src( image_src )
    .pipe(imagemin(
        [pngquant({quality: '65-80', speed: 1})]
    ))
    .pipe(imagemin()) // ←追加
    .pipe(gulp.dest( image_dist ));
});
```

参考：[【Gulp】pngquantで圧縮した画像がMacで暗くなる場合の対処法](http://taneppa.net/gulp_pq_warning/)
OpenCV3.1をcontribを含めてbuildするための情報

まず OpenCV.org の情報


OpenCV3.1 [Installation in Linux](http://docs.opencv.org/3.1.0/d7/d9f/tutorial_linux_install.html)

まず、上記の公式の情報をもとに、Required Packagesが既にそろっているのかをチェックしましょう。


github [opencv/opencv_contrib](https://github.com/opencv/opencv_contrib)
github [Repository for OpenCV's extra modules](https://github.com/opencv/opencv_contrib/blob/master/README.md) の中にHow to build OpenCV with extra modules　と書かれています。

```
$ cd <opencv_build_directory>
$ cmake -DOPENCV_EXTRA_MODULES_PATH=<opencv_contrib>/modules <opencv_source_directory>
$ make -j5
```

どうやら、よくやる間違い。
ここでの\<opencv_source_directory\>にsources ではなくsources/modules　を指定してしまう間違い。
正しくは、sourcesのディレクトリを指定します。
そうすることで
sources/CMakeLists.txt
がcmake　コマンドに渡されます。


[OpenCV3.0とopencv_contribをubuntuに入れた作業メモ](http://qiita.com/iwata-n@github/items/6ae7e430e8008be29377)


###**Raspberry Pi　の情報**
 なお、contribが不要な場合には、自力でbuildする必要はなく、apt-get　で目的のバージョンがインストールできないか試してみてください。　
 $ sudo apt-get install libopencv-dev


　自力でbuildする際に苦労しがちなのがffmpegの関連の部分です。

- [Installing OpenCV on a Raspberry Pi](https://robertcastle.com/2014/02/installing-opencv-on-a-raspberry-pi/)

- [Raspberry Pi 2 で OpenCV 3.1.0 + contrib 3.1.0 をビルドした]
(https://iwaki2009.blogspot.jp/2015/12/raspberry-pi-2-opencv-310-contrib-310.html)



###**Jetsonの情報**
- Youtube [NVIDIA Jetson OpenCV Tutorials - Episode 0](https://www.youtube.com/watch?v=gvmP0WRVUxI)

- [NVIDIA Jetson TX1でOpenCV3をビルドする](http://qiita.com/furushchev/items/53df07a4796646b02eb9)

- [Jetson/Installing OpenCV](https://github.com/opencv/opencv_contrib)



- [OpenCV 3.1 compilation on TX1 - let's collect the "definitive" CMake settings!](https://devtalk.nvidia.com/default/topic/965134/jetson-tx1/opencv-3-1-compilation-on-tx1-lets-collect-the-quot-definitive-quot-cmake-settings-/)


###**Cross compilation for ARM based Linux systems**
RaspberryPi や　JetsonなどのARMベースのコンパイルを行うときには
次のURLを参考にしよう。
http://docs.opencv.org/3.1.0/d0/d76/tutorial_arm_crosscompile_with_cmake.html

###**BeagleBoard**
- [ECE597 OpenCV on the BeagleBoard](http://elinux.org/ECE597_OpenCV_on_the_BeagleBoard)



###**Windows VisualStudio**
[OpenCV3.1をcontribを含めてbuild](https://blog.negativemind.com/2016/05/27/build-opencv-3-1-with-contrib-module-on-win-10-pro-visual-studio-2015/)

>先ほどダウンロードしたOpenCV3.1本体のソースコードをCMakeで開き、設定していく。
OPENCV_EXTRA_MODULE_PATHに先ほどダウンロードしたopencv_contrib内の”module”ディレクトリまでのパスを入力。
NcFTP for Windows使ってみた


仕事で[NcFTP](http://www.ncftp.com/)のWindows版を使ってみたのでメモ

###ダウンロード

[Software Download](http://www.ncftp.com/download/)のページから[NcFTP Client 3.2.5 for Microsoft Windows](ftp://ftp.ncftp.com/ncftp/binaries/Setup%20NcFTP%203.2.5.msi)をダウンロード

###インストール

ダウンロードしたmsiを実行
ウィザードにそってインストールする

####確認

コマンドプロンプトを起動してインストールされていることを確認する

```
> ncftp
NcFTP 3.2.5 (Jan 17, 2011) by Mike Gleason (http://www.NcFTP.com/contact/).
ncftp>
```

###ncftpget

コマンドラインでファイルの取得ができるユーティリティ

[ncftpget(1) manual page](http://www.ncftp.com/ncftp/doc/ncftpget.html)

指定の方法は
<code>ローカルディレクトリ</code> <code>リモートファイル</code>

```
C:\Users\probook>ncftpget -u <username> -p <password> <hostname or ip> . TARGET.CSV
TARGET.CSV:                                        84.00 B     2.63 kB/s
```

↑この例は"."(カレントディレクトリ)に"TARGET.CSV"をダウンロードする

<code>-E</code>オプションを付けるとアクティブモードになる
firewallが有効になっていると警告が出る
アクセスを許可すれば普通にダウンロードが始まる

![security.png](https://qiita-image-store.s3.amazonaws.com/0/9369/c0aec1c1-129f-2652-26cc-808585eb2b59.png "security.png")

###ncftpput

コマンドラインでファイルの取得ができるユーティリティ

[ncftpput(1) manual page](http://www.ncftp.com/ncftp/doc/ncftpput.html)

指定の方法は
<code>リモートディレクトリ</code> <code>ローカルファイル</code>

```
C:\Users\probook>ncftpput -u <username> -p <password> <hostname or ip> UPLOADDIR test.txt
test.txt:                                               12.00 B   384.62 B/s
```

<code>-E</code>オプションでアクティブモードに対応できる
Chrome を ⌘+Q で閉じちゃうのつらい！


## これを有効にすると強い

![スクリーンショット_2016-10-21_22_34_28.png](https://qiita-image-store.s3.amazonaws.com/0/69007/ab45efff-e2ef-b035-ad9e-577eca180f99.png "スクリーンショット_2016-10-21_22_34_28.png")

## 結果

⌘ + Q


![スクリーンショット 2016-10-21 22.44.24.png](https://qiita-image-store.s3.amazonaws.com/0/69007/2199911d-301e-a1e8-8060-d29df3799c05.png "スクリーンショット 2016-10-21 22.44.24.png")

強い
Gmailに来た特定のメールを読んでカレンダーにイベント登録するGASスクリプト

こういう処理をたまに書きたくなった時のための備忘録。

具体的には、某オンライン英会話スクールでレッスンを予約すると受付完了メールが届くので、これを勝手に（5分おきに）読んでGoogle Calendarにイベントとして登録するためのスクリプト。

レッスンを予約すると

```
aaaaaa 様

いつも◯◯◯◯◯◯をご利用いただき、ありがとうございます。
下記のとおり、予約レッスンを承りました。

------------------------------------------------------
講師名：Xxxxxx
ご予約日：2016年10月20日(木)
開始時間：06:00
------------------------------------------------------

...
```

みたいなメールが届くので、これを適宜Google Calendarにぶち込みたい。
（もしかして今のGmail/Google Calendarってこんな事しなくても勝手にやってくれたりする？）

## スクリプト（Google Apps Script）の編集

https://script.google.com/ でスクリプトを編集。
（↑今までGoogle Spreadsheetに紐付いたスクリプトしか書いたことがなかったから新鮮）

プロジェクト名は適当につける。（英会話ヘルパーとか。後でアクセス許可を求められた時に自分のものだと気づける名前がいい）
ファイル名はどうでもいい。reservation_mail_to_calendar.gs にしてるけど。


```reservation_mail_to_calendar.gs
//
// Gmailに来た予約受付完了メールを読んでカレンダーに登録する
//
function reservation_mail_to_calendar() {
  var expected_subject = '予約レッスン・受付完了のお知らせ';
  var sender_email_address = 'xxxxxx@xxxxxx.xxx';
  var calendar_name = '英会話';
  var lesson_duration = 25; // minutes

  var threads = GmailApp.search('subject:' + expected_subject + ' from:' + sender_email_address + ' is:unread', 0, 500);
  for (var i=0; i<threads.length; ++i) {
    var msgs = threads[i].getMessages();
    for (var j=0; j<msgs.length; ++j) {
      var msg = msgs[j];
      // if (!msg.isUnread()) continue; // これは効かない
      if (msg.isStarred()) continue;

      var body = msg.getPlainBody();
      var lines = body.split('\r\n');

      var teacher_name = lines[6].slice(4);
      var lesson_start_str = lines[7].slice(5,9) + '/' + lines[7].slice(10,12) + '/' + lines[7].slice(13,15) + ' ' + lines[8].slice(5) + ' +0900';
      var lesson_start = new Date(lesson_start_str);
      var lesson_end = new Date(lesson_start.valueOf() + lesson_duration*60*1000);

      var event_title = teacher_name + '予約';
      var event_details = '予約レッスン(' + teacher_name + ')';
      
      var cal = CalendarApp.getCalendarsByName(calendar_name)[0];
      cal.createEvent(event_title, lesson_start, lesson_end, {description: event_details});

      msg.markRead();
      msg.star();
      msg.refresh();
    }
  }
}
```

// GASの`new Date(日付文字列)`はISO-8601の日付文字列にフル対応してくれているわけではない事に注意。
// →参考：[Google Apps Scriptの日付文字列の変換](http://imabari.hateblo.jp/entry/2015/06/15/115047)

件名が同じメールは１つのスレッドにまとめられてしまって未読管理が意図通りに行かない（同じイベントがいくつも立ってしまう！）ので、カレンダーに登録済みのメッセージにはstarを付けて識別している。

スクリプトを実行すると、GmailとGoogle Calendarそれぞれについてアクセス許可が求められるので適宜許可する。

## Google Calendar側の準備
Google Calendar側に、それ用のカレンダー（ここでは「英会話」という名前にしている）を用意しておくこと

## 適当な間隔のトリガーを設定して自動運行。
リソース＞現在のプロジェクトのトリガー、で「新しいトリガーを追加」。関数`reservation_mail_to_calendar`を、時間主導型の分タイマーで5分ごとに実行。

## 参考
- [Google Apps Script Reference](https://developers.google.com/apps-script/reference/gmail/gmail-message)
- [Google Apps Script Tutorial](http://www.googleappsscript.org/calendar-services/create-calendar-events-by-submitting-form)
- [【GAS】新たな問い合わせメールをGmailで取得しスプレッドシートに随時追加する](http://tonari-it.com/gas-add-contact-mail/)
- [Gmailで受信した内容をスプレッドシートに転記する〜！](http://shirokuma.hatenadiary.com/entry/2014/09/07/224611)
Ruby でwebスクレイピング (未完)

あるwebサービスから情報を取る必要があったが、400件ほどありスクレイピングのほうが早いと思ったのでrubyでスクレイピングして情報を取ってきてcsvファイルで出力するアプリを作っていく。

# mechanizeのインストール

ruby のgemなので

```
gem install mechanize
```

ここから実際にプログラムを書いていく。

http://www.rakumachi.jp/info_seminar/

こちらのページをスクレイピングしていきます。

tableにある文字列を取ってきます。

といっても簡単ですね

適当にrbファイルを作って
mechanizeをrequireします。

```scraping.rb
require 'mechanize'

agent = Mechanize.new
page = agent.get("http://www.rakumachi.jp/info_seminar/")
elements = page.search('table')
elements.each do |element|
  puts element.inner_text
end
```
Mechanize.newでmechanizeのインスタンスを生成

page = agent.get("url")でurl先のhtml情報を取得しています。

searchメソッドは指定要素を取ってきています。

inner_text でタグの中身だけを取ってきます。

これを実行するとデータが取り出せました！

次はcsvファイルにまとめていきますが...

一旦休憩！

参考　http://qiita.com/shizuma/items/d04facaa732f606f00ff
ウィキデータの紹介#5

プロパティの探し方には、前回挙げた以外にも以下のような方法があります。
# プロパティ一覧を参照する
[ウィキデータ:プロパティの一覧](https://www.wikidata.org/wiki/Wikidata:List_of_properties/ja)には人物、組織といった大まかな分類ごとによく使うプロパティの一覧があります。また、こちらではプロパティ専用の検索窓もあり、頭に「p: 」を付けなくてもプロパティを検索できます。
# ショーケースを参考にする
プロパティが充実していて他のモデルになるような項目が[Wikidata:ショーケース項目](https://www.wikidata.org/wiki/Wikidata:Showcase_items/ja)にまとめられています。こちらも人物、作品といったカテゴリごとにまとまっています。
# 類似の項目のプロパティを真似る
文化の違いがあるので、やはり海外の事例よりは対象物が国内のもので、充実した記載のある項目が非常に参考になります。ただ、その事例を見つけるのが結構大変なので、そうした事例が増えていくと良いなと思います。
# [「適用プロパティ候補」](https://www.wikidata.org/wiki/Property:P1963)プロパティを充実させて共有する
このプロパティを使うと、ある分類に対して、適用対象となりそうなプロパティの候補を登録できます。これがあると類似項目の文を充実させる際に非常に参考になりますので、みんなで充実させて行けると良いと思います。
例えば[「神社」](https://www.wikidata.org/wiki/Q845945)という分類に相当する項目には現在以下のようなものが登録されています。

![神社   Wikidata.png](https://qiita-image-store.s3.amazonaws.com/0/35320/08fc3072-1e2f-84fa-1c01-9a3187a9fad2.png)

自分の町の◯◯神社など具体的な神社の項目を充実させる際にはこれらのプロパティを使えば良いことが分かります。こういった部分をみんなで追加して行けると良いと思います。

# 項目のメンバーシップとプロパティ
技術的な話はあまりよく分かっていないのでここまで避けてきたのですが、分類のあたりの説明をしておかないと混乱しそうなので頑張って説明してみます :) 間違いなどありましたらコメント頂ければ幸いです。
（詳細は[「Help:基本特性」](https://www.wikidata.org/wiki/Help:Basic_membership_properties/ja)参照）

世の中の物事や概念には包摂関係、親子関係など複雑な階層構造があります。ウィキデータの項目もよくみるとフラットな構造ではなく、実世界にある項目間の複雑な関係を表現できるようになっています。

## 分類
分類という言葉は割と一般的に使われる用語なのですが、ウィキデータの日本語訳では重要な意味を持つプロパティとして使われているので、どちらの文脈で使われているのか注意が必要です。
クラスとインスタンスはオブジェクト指向プラグラミングではお馴染みの概念ですが、よく型紙と実例の関係で説明されます。例えば神社というクラスに対して松戸神社という実例（インスタンス）が存在する、といった関係です。
ウィキデータのプロパティとして使われている「分類」は、英語では「instance of」となっており、まさにこのクラスとインスタンスの関係性を示すためのものです。日本語の文法と英語の文法では記述したり修飾する順番が逆になることが多いので分かりにくいのですが、分類を直訳的に言い換えれば
・「インスタンス項目（松戸神社）」に対して
・「以下の実例（instance of ）」「クラス項目（神社）」という文を追加する
といった使い方になります。

くどいようですが、英語では後ろから修飾するので
松戸神社<-instance of<-神社（松戸神社は神社のインスタンス（実例））
となりますが、自然な日本語は前から修飾するので
松戸神社->分類->神社（松戸神社は分類では神社）
とスムーズに日本語として読めるように逆方向の修飾となるような訳語が充てられています。当初これがわからずに随分悩みました。。

このように、項目とひとくくりにしているものも全てがフラットな構造ではなくて、クラスとインスタンスに分けられるものが存在します。実世界では単純な２階層にとどまらずさらに複雑です。

また、その項目がクラス（神社）であれば、インスタンス（松戸神社）とは違って抽象的な存在であり、「所在地」や「電話番号」といったプロパティを持ちません。

## 上位クラス
「上位クラス」プロパティは英語では「subclass of」であり、クラス間の親子関係を表します。例えば
・「神社」という項目に対して
・「上位クラス」「建築物」という文を追加する
のように使います。
上述の「分類」プロパティはインスタンスに相当する項目から見てクラスに相当する項目を指し示すためのものなので、クラスや上位クラスの項目である神社や建築物には分類プロパティを設定しません。

## 以下の一部分
「以下の一部分」プロパティは英語では「part of」であり、インスタンス間およびクラス間の包含関係を表します。例えば
・「西郷隆盛像」という項目に
・「以下の一部分」「上野恩賜公園」という文を追加する
のように使います。

これらのインスタンスやクラスに相当する項目についてはそれらの関係性をよく把握した上で適切なプロパティを付けていく必要があります。まぁ、最初はインスタンスに相当する項目を中心に編集していればさほど悩まなくても大丈夫です。

[ウィキデータの紹介#4](http://qiita.com/higa4/items/e07768c96ac66b72f792) | [ウィキデータの紹介#6](http://qiita.com/higa4/items/f050d68e52039a2a607b)
VBAで特定の文字が含まれているのかの確認方法の処理速度比較

# 測定条件
+ 実行環境：Windows 10 Pro 64bit / Microsoft Excel 2016 64bit
+ 検索文字列：2文字目が"b"、残りが"a"からなる10万文字の文字列 "abaaa....a"
+ ループ回数：1万回
+ 時間測定方法：VBAのTimer関数を用いた簡易計測


# 測定結果
|方法|時間（秒）|
|:---|---:|
|InStr関数|0.141|
|InStrRev関数| 4.352|
|Like演算子| 0.000|
|正規表現（事前バインド）|  0.008|
|正規表現（実行時バインド）| 0.141|
|Replace関数 |1.563|


# 使用したコード


```vbnet
Sub 特定の1文字検索速度ベンチマーク()
'要参照設定"Microsoft VBScript Regular Expression 5.5"
    
    '条件
        '検索文字列 この中から"b"を探す
        Dim tgtTxt As String
        Let tgtTxt = "ab" & VBA.String$(99998, "a")
        
        'ループ回数
        Const LOOP_CNT& = 10000
    
    
    '準備
        '事前バインディング正規表現
        Dim earlyBindRegExp As RegExp
        Set earlyBindRegExp = New RegExp
        Let earlyBindRegExp.Pattern = "b"
        
        '実行時バインディング正規表現
        Dim lateBindRegExp As Object
        Set lateBindRegExp = New RegExp
        Let lateBindRegExp.Pattern = "b"
        
        '計測とかループ用
        Dim st!, i&, result As Boolean
        Const MY_FORMAT$ = "0.000"
    
    '----------------------------------------------------------
    
    'Instr
    Let st = Timer
    For i = 1 To LOOP_CNT
        Let result = (VBA.InStr(1, tgtTxt, "b") <> 0)
    Next i
    Debug.Print "InStr", VBA.Format$(Timer - st, MY_FORMAT)
    
    '----------------------------------------------------------
    
    'InstrRev
    Let st = Timer
    For i = 1 To LOOP_CNT
        Let result = (VBA.InStrRev(tgtTxt, "b") <> 0)
    Next i
    Debug.Print "InStrRev", VBA.Format$(Timer - st, MY_FORMAT)
    
    '----------------------------------------------------------
    
    'Like演算子
    Let st = Timer
    For i = 1 To LOOP_CNT
        Let result = (tgtTxt Like "*b*")
    Next i
    Debug.Print "Like", VBA.Format$(Timer - st, MY_FORMAT)
    
    '----------------------------------------------------------
    
    '事前バインディング正規表現
    Let st = Timer
    For i = 1 To LOOP_CNT
        Let result = earlyBindRegExp.Test(tgtTxt)
    Next i
    Debug.Print "EarlyRegExp", VBA.Format$(Timer - st, MY_FORMAT)
    
    '----------------------------------------------------------
    
    '実行時バインディング正規表現
    Let st = Timer
    For i = 1 To LOOP_CNT
        Let result = lateBindRegExp.Test(tgtTxt)
    Next i
    Debug.Print "LateRegExp", VBA.Format$(Timer - st, MY_FORMAT)
    
    '----------------------------------------------------------
    
    'Replace
    Let st = Timer
    For i = 1 To LOOP_CNT
        Let result = (VBA.Len(tgtTxt) <> VBA.Len(VBA.Replace(tgtTxt, "b", "")))
    Next i
    Debug.Print "Replace", VBA.Format$(Timer - st, MY_FORMAT)
   
End Sub
```
# わかったこと
参照設定等の手間を考えるとLike演算子が扱いやすく、出来ることもそれなりに多いので優秀。
（ただしWin7 64bit Excel 2010 32bitの環境ではInStrの方が早かった記憶があるので環境によっては変化するかも）

InStr/InStrRev関数は該当文字が見つかった時点で処理を終了している。
Implementing functional languages を頑張って読む.16日目

# 16日目
(大嘘)

## Applying a supercombinator
忘れてたので読み直した.
15日目に書いたことに間違いを見つけたので正しい理解を得る.

> envで環境を渡す.いわゆるシャドウイングを出来るようにするのと,変数を見つけられるようにする.

間違い.
このCore Language にはグローバル環境しか無いので,単に変数の検索を行うための環境を渡す.

>arg_bindingsはgetargsとarg_namesで引数の名前と実体との束縛関係を作る.
>getargsの実装は,補助関数のget_argがわかってないからわからん.

わかった.
NScがスタックトップに有るとき,スタックはこのようになっている.
例えば,`f 1 2`という式がスタックトップにあったとすると,

```
Heap>| Addr | Node      | +=========+  stack bottom
     |    : |   :       | | Addr  2 | <-----  @
     |    2 | NAp  5 xx | +---------+        / \
     |    : |   :       | | Addr  5 | <---  @   2
     |    5 | NAp 13 yy | +---------+      / \
     |    : |   :       | | Addr 13 | <-- f   1
     |   13 | NSc ..... | +---------+  stack top
```

となっているので,`hLookup heap addr`でheapからaddrが指してるNodeを探し,(そのNodeはNApのはずなので,)NApのarg側を返す関数がget_arg.
これをstackにmapすれば,スタック上の各NApに対してargのaddrが入っているリストが手に入る,ということをやるのがgetargs.
このgetargsと仮引数のリストarg_namesをzip2すれば,仮引数と置換先の実引数の対応表が作られるので,これをarg_bindingsとする.


> 適用の時はe1とe2についてそれぞれ再帰的にinstantiateする.
>まず,e1,すなわち適用される側の式についてinstantiateして,新しいヒープと簡約結果を得る,その後,その> ヒープに対してe2,すなわち適用する側の式をinstantiateすれば,最終結果のヒープと簡約結果が得られる.
> このヒープに対してこれらの簡約結果を乗っけたものが最終結果となる.

間違い.
まずe1をinstantiateし,その後e2をinstantiateする.heap1などの依存関係を見ればわかる.

**2.3.5を読み直した**
Gitを使った開発で初心者が絶対まちがえるbranchのあれこれ

初心者がGitを使った複数人での開発で間違えがちな箇所を、とくにbranchに絞ってメモします。
Gitを使って複数人での開発を始める人でとりあえず注意するべきところだけ教えて、という人は
#「鍵かっこでかこまれた部分」
だけ真面目に読みましょう。そこを気をつければ、とりあえずミスは防げる確率が高くなるとおもいます。
間違えるだろうな、と思う箇所が増え次第更新していきます。

#0 コマンド
branchをあれこれするときに使う主要コマンドはこちら
####branchを確認
```
git branch
```
####新しいbranchをつくる
```
git branch branch名
```
####branch間で移動
```
git checkout 移動先のbranch名
```

#1「masterにcommitせず自分でbranchを作ってそこにcommitしていく」
ローカルで作業をしているときmasterにcommitするのは駄目です。
自分でbranchを新しく作りましょう。

#2「branchをつくるときは必ずmasterにいるときにやる(masterから直接branchを作る)」
自分が作ったbranchにいるときに新しいbranchを作ると、masterから分かれたbranchAからわかれたbranchBをつくった、ということになってしまうかもしれません。
その状態でmergeしようとPull Requestを出すとコンフリクトをしてしまうことがあり、面倒なことになります。
そうならないためにもとりあえず最初はmasterにいるときにあたらしくbranchを作れば間違いがないと思います。
OpenLDAPでActive Directoryに対してPass-Through 認証する

OpenLDAPを認証に使っているが一部のユーザーはActive Directory(以降、AD)に問い合わせて認証を行いたいケースが出てきたので、OpenLDAPのPass-Through認証について調べてみた。

# 前提となる環境
* CentOS 6.7 (64bit)
* OpenLDAP 2.4.40 ※yumでインストール

# 方式
OpenLDAPでは認証処理をSASLに委譲できるとのこと。SASLはSimple Authentication and Security Layeの略で、認証のフレームワークの1つ。CentOSだと`saslauthd`というデーモンサービスを起動し、こいつに認証を任せることができる。
さらに、このSASLの中で外部のADなどのLDAPサーバーに対して認証をさらに委譲することができるようになっている。
つまり、OpenLDAP --> SASL --> AD という経路でPass-Through認証が実現できる。

# 設定方法

## saslauthdの設定

yumでサクッとインストール。

```bash
yum install cyrus-sasl cyrus-sasl-ldap
```

`/etc/sysconfig/saslauthd`を開き`saslauthd`の起動オプションを設定する。SASLでLDAP認証を使うように設定する。

```text:/etc/sysconfig/saslauthd
MECH=ldap
FLAGS="-r"
```

`/etc/saslauthd.conf`を新規に作成し、ADへの接続設定を行う。`ldap_filter`の内容はAD側ではどの属性を認証IDとするかによって変わってくる。

```text:/etc/saslauthd.conf
ldap_servers: ldap://yourad.org
ldap_search_base: dc=yourad,dc=org
ldap_filter: (cn=%u)
ldap_bind_dn: cn=Manager,ou=users,dc=yourad,dc=org
ldap_password: secret
```

設定後、`saslauthd`の自動起動を有効にしつつ起動。

```bash
chkconfig saslauthd on
service saslauthd start
```

## saslauthdのテスト

`saslauthd`経由でADに認証できるか`testsaslauthd`コマンドを使って試すことができる。設定が正しければADのアカウントで処理成功となるので確認しておく。

```bash
testsaslauthd -u foo -p mypass
0: OK "Success."
```

## SASLの設定

`/etc/sasl2/slapd.conf`を新規に作成し、OpenLDAPの認証を`saslauthd`に任せるようにする。

```text:/etc/sasl2/slapd.conf
mech_list: plain
pwcheck_method: saslauthd
saslauthd_path: /var/run/saslauthd/mux
```

設定後、OpenLDAPを再起動する。

```bash
service slapd restart
```

##  Pass-Through を行うユーザーの登録

OpenLDAPに下記のようなLDIFを作成してユーザーを登録する。
ポイントは `userpassword: {SASL}foo` の部分。こうすると、このユーザーでbindしようとするとSASLを利用して`saslauthd`経由でADに`foo`で検索され、AD側でbindされるようになる。この時使われる検索フィルタが先の`ldap_filter: (cn=%u)`の設定になる。この例だと、`cn=foo`でADを検索して存在すればAD側でbindが行われることになる。

```text:user.ldif
dn: cn=foo,ou=users,dc=example,dc=com
objectclass: inetorgperson
cn: foo
userpassword: {SASL}foo
givenname: foo
sn: somebodyson
mail: foo@example.com
```

#  実行

`ldapwhoami`コマンドで試す。`-w mypass`のパスワードはADに格納されているパスワードだが、Pass-Through認証が行われてAD側で処理され結果が返ってきている。

```bash
ldapwhoami -x -D cn=foo,ou=users,dc=example,dc=com -w mypass
dn:cn=foo,ou=users,dc=example,dc=com
```


# 参考サイト
* [OpenLDAP Software 2.4 Administrator's Guide - 14.5. Pass-Through authentication](http://www.openldap.org/doc/admin24/security.html#Pass-Through%20authentication)
* [Delegate OpenLDAP authentication to AD on CentOS](https://gauvain.pocentek.net/docs/openldap-delegate-auth/)
* [Configuring a Basic OpenLDAP Passthrough](http://systhread.net/texts/201601ldappassthru.php)
Unity Cloud Buildのビルド結果をSlackに通知するには


## 前提条件
* 既に通知先のSlackチームを作成済みであること
* Unity Cloud Buildの基本設定が完了していること

## 設定方法
プロジェクトのCloud Buildのページにある「Notifications」タブをクリックします。
![Kobito.xkKPmb.png](https://qiita-image-store.s3.amazonaws.com/0/5879/9b5ea5b8-525b-5688-f23e-6cf8f2d60ec5.png "Kobito.xkKPmb.png")


「Add to Slack」ボタンをクリックします。
![Kobito.ne8GZE.png](https://qiita-image-store.s3.amazonaws.com/0/5879/16a25bf8-86e2-5025-e54b-6e56ba142033.png "Kobito.ne8GZE.png")


Slackのページに遷移したら通知対象のteamのドメインを入力し「Continue」ボタンをクリックします。
![Kobito.HWX6vG.png](https://qiita-image-store.s3.amazonaws.com/0/5879/8d33adff-8524-1586-8346-429947d7c766.png "Kobito.HWX6vG.png")


続けてメールアドレス、パスワードを入力し「Sign in」ボタンをクリックします。
![Kobito.twJ0t7.png](https://qiita-image-store.s3.amazonaws.com/0/5879/76f02104-5aa2-6146-eb2f-30dad9b2bfbf.png "Kobito.twJ0t7.png")


通知先のチャンネル名を選択し「Authorize」ボタンをクリックします。
ここでは取り急ぎ「#general」チャンネルを指定します。
チャンネル名は適宜読み替えてください。
![Kobito.4D7NhH.png](https://qiita-image-store.s3.amazonaws.com/0/5879/edf8e111-cec0-f3a8-18e0-33db1e15bdfb.png "Kobito.4D7NhH.png")


「Next: Save →」をクリックします。
なお、サポートされている通知イベントは以下の通りです。
必要に応じて調整するようにしましょう。

| イベント | トリガ条件 |
|--------------------|--------------------|
| ProjectBuildQueued    | ビルドがキューに入ったとき |
| ProjectBuildStarted   | ビルドが開始されたとき |
| ProjectBuildRestarted |	 内部エラーが発生し、ジョブがリスタートされたとき |
| ProjectBuildSuccess   | ビルドが正常終了したとき |
| ProjectBuildFailure   | ビルドが異常終了したとき |
| ProjectBuildCanceled  | 実行中のビルドがキャンセルされたとき |
![Kobito.vdbtcT.png](https://qiita-image-store.s3.amazonaws.com/0/5879/ee316321-6db0-c679-de49-411fbbf181f7.png "Kobito.vdbtcT.png")



画面右上の「ビルド開始」ボタンをクリックするとビルドが開始されます。
![Kobito.pC4ilK.png](https://qiita-image-store.s3.amazonaws.com/0/5879/a8f76b75-c378-61c9-9138-d842218b2b64.png "Kobito.pC4ilK.png")


正しく設定されていれば、以下のようにSlackに通知されます。
![Kobito.ls51mv.png](https://qiita-image-store.s3.amazonaws.com/0/5879/8fb536f2-c21f-e297-061b-23c2f73c553e.png "Kobito.ls51mv.png")

## 参考
[WEBHOOKS AND SLACK NOTIFICATIONS IN UNITY CLOUD BUILD](https://blogs.unity3d.com/jp/2016/09/07/webhooks-and-slack-notifications-in-unity-cloud-build/ "WEBHOOKS AND SLACK NOTIFICATIONS IN UNITY CLOUD BUILD")
Safariでvideoタグを使用した際に上下に余白が出る際にチェックすること

動画埋め込みをしたHPを作成した際、Safariブラウザでvideoの上下に余白が出てしまった際の対処に関するメモ。

videoタグのオプションを見たところ、中に"autobuffer"属性が含まれていることが原因でした。

```ex.html
<video class="header-home" src="top_movie.mp4" autoplay autobuffer></video>
```

autobuffer属性は一部ブラウザでは廃止されているとのことです。
https://developer.mozilla.org/ja/docs/Web/HTML/Element/video
RxSwiftでイベントを定期的にまとめる

#ユースケース

連打するアプリがあったとして、連打数を毎回サーバーに送ると死ぬので5秒に一回だけ送信したい。とか

#コード


```swift
struct TapEvent {
  var createdAt = Date()
}

var tapEventBuffer = PublishSubject<TapEvent>()

tapEventBuffer.buffer(timeSpan: 5.0, count: 10, scheduler: MainScheduler.instance)
              .filter({ $0.count > 0 }).subscribe(onNext: { (events) in
      print(events.count)
}).addDisposableTo(rx_disposeBag)

func tap() {
  tapEventBuffer.on(.next(TapEvent()))
}

```

#解説

`var tapEventBuffer = PublishSubject<TapEvent>()`

タップイベントを受け付けるところ

`buffer(timeSpan: 5.0, count: 10, scheduler: MainScheduler.instance)`

* timeSpan: 何秒ごとにイベントをまとめるのか
* count: このカウント数を超えるとまとめられる
* scheduler: よくわからない、どのスレッドの流れを見るかとかかな

`filter({ $0.count > 0 })`

5秒毎に空のイベントが来ちゃうのでフィルタする

`tapEventBuffer.on(.next(TapEvent()))`

タップイベントを送る

----

これってcount無限とかないのかな
Mac OSXでapache benchが動かない時の対処。apr_socket_connect(): Operation already in progress


## 現象

ApacheBenchが起動後に「apr_socket_connect(): Operation already in progress」ですぐ落ちる。

## 環境

OS X El Capitan 10.11.6

## エラーメッセージ

```
16:42:16 ~/  $ ab -n 100000 -c 1000  http://xxxxxxxx.elb.amazonaws.com/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking  xxxxxxxx.elb.amazonaws.com/ (be patient)
Send request failed!

Test aborted after 10 failures

apr_socket_connect(): Operation already in progress (37)

```

## 対応、Apacheのバージョンアップ


### 現在のhttpdのunlink

```
  $ brew unlink homebrew/apache/httpd22
Unlinking /usr/local/Cellar/httpd22/2.2.31... 30 symlinks removed

```

### httpd24のインストール

Apache/2.4.23にバージョンアップ

```
$ brew install httpd24
==> Installing httpd24 from homebrew/apache
==> Installing dependencies for homebrew/apache/httpd24: apr, apr-util
==> Installing homebrew/apache/httpd24 dependency: apr

・・・
  apachectl start
==> Summary
🍺  /usr/local/Cellar/httpd24/2.4.23_2: 210 files, 4.2M

```

## 成功

```
  $ ab -n 100000 -c 1000 -r http://xxxxxxxx.elb.amazonaws.com/
This is ApacheBench, Version 2.3 <$Revision: 1748469 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking xxxxxxxx.elb.amazonaws.com/ (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requests


Server Software:        Apache/2.4.23
Server Hostname:        xxxxxxxx.elb.amazonaws.com/
Server Port:            80

Document Path:          /
Document Length:        319 bytes

Concurrency Level:      1000
Time taken for tests:   69.517 seconds
Complete requests:      100000
Failed requests:        32
   (Connect: 0, Receive: 0, Length: 32, Exceptions: 0)
Non-2xx responses:      32
Total transferred:      56484160 bytes
HTML transferred:       31889792 bytes
Requests per second:    1438.49 [#/sec] (mean)
Time per request:       695.172 [ms] (mean)
Time per request:       0.695 [ms] (mean, across all concurrent requests)
Transfer rate:          793.48 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:      162  281  79.3    271    1752
Processing:   165  392 132.4    373    3166
Waiting:      165  391 132.2    373    3166
Total:        352  673 172.0    647    4550

Percentage of the requests served within a certain time (ms)
  50%    647
  66%    718
  75%    756
  80%    774
  90%    814
  95%    848
  98%    960
  99%   1122
 100%   4550 (longest request)
```
python / netCDF > nc.variables[]でのデータ読込 / データサイズ確認

```txt:動作環境
CentOS 6.5
```

複数のNetCDFファイルの数値を比較する予定。
環境の違いにより、浮動小数点の値が微妙に変わる可能性がある。
グラフで表示したいかと思う。

pythonでnetCDF4を読み取る例が見つかった。
参考1 http://qiita.com/okadate/items/954574a95545b06ca257
参考2 http://qiita.com/AnchorBlues/items/2dd18c1e9587c8f495bc

以下を実装してみた。
.shapeで読込んだdataのサイズが分かるようだ。

```read_nc.py
import netCDF4

nc = netCDF4.Dataset('sample.nc', 'r')
dim_we = len(nc.dimensions['west_east'])
dim_sn = len(nc.dimensions['south_north'])

data = nc.variables['CONC'][:]
nc.close()

print data.shape

print 'dim_we=',dim_we
print 'dim_sn=',dim_sn
```

```txt:結果
$ python read_nc.py 
(24, 1, 1, 3, 65, 82)
dim_we= 82
dim_sn= 65
```

24: 時間の次元
3: top, bottom
65: south north
82: west east

残りの1,1は未消化。
phpredisを導入した環境におけるlaravel5のRedis設定


laravel5でRedisを扱うときにハマったのでメモとして残します。

### 前準備

composerでpredis/predisをインストールします。

```
$ composer require predis/predis
```

### database.phpの編集
以下ではredisサーバはインストールしてあり，起動済みとします．

database.phpにredisの設定をする項目があるので，環境に合わせて設定しますが，デフォルトでRedisを動作させている場合はそのままの設定でかまいません．

```php:database.php
'redis' => [
    
    'cluster' => false,
    
    'default' => [
        'host' => '127.0.0.1',
        'port' => 6379,
        'database' => 0,
    ],
],
``` 

次にコントローラに以下の記述を追加します．

```php:RedisController.php
<?php namespace App\Http\Controllers;

use Illuminate\Support\Facades\Redis;

use App\Http\Requests;
use App\Http\Controllers\Controller;

use Illuminate\Http\Request;

class RedisController extends Controller {

	/**
	 * Display a listing of the resource.
	 *
	 * @return Response
	 */
	public function index()
	{
		//
		$redis = \Illuminate\Support\Facades\Redis::connection();

		$result = $redis->get('keys');

		return $result;
	}
}
```

ここで

```php
use Illuminate\Support\Facades\Redis;
```

はphpredisを導入していない場合は，

```php
use Redis;
```

で良いのですが，どうやらlaravel5のドキュメントに記述してあるように，

>注意： PECLでRedis PHP拡張をインストールしている場合、config/app.phpファイルのRedisエイリアスをリネームする必要があります。

という設定をするべきなのですが，おそらくlaravelで使うredisのクラスの読み込みとphpredisの読み込みが同時に起こってしまうためにエラーを吐くので，Redisエイリアスをリネームしてもよかったのですが，直接laravelのクラスを指定しました．

また，

```php
$redis = Redis::connection();
```

が本来の記述の仕方ですが，

```php
use Illuminate\Support\Facades\Redis;
```

に合わせて

```php
$redis = \Illuminate\Support\Facades\Redis::connection();
```

としました．

これで無事にRedisの値を取得することができました．
aws apigateway get-export で An error occurred () when calling the GetExport operation: Invalid stage identifier specified というエラーが返ってくる

AWS CLIでAPI Gatewayのget-exportでハマったのでメモ

## ハマったこと
Swagger用のYAMLファイルをエクスポートしようとしたところ、以下のようなエラーが発生。

```
$ aws apigateway get-export \
  --rest-api-id xxxxxxxxxx \
  --stage-name prod \
  --export-type swagger \
  --accepts application/yaml swagger.yaml \

An error occurred () when calling the GetExport operation: Invalid stage identifier specified
```

## 原因
リージョンの設定が間違っていた。

テスト用に作ったため、~/.aws/configで設定していた東京リージョンとは異なるバージニアリージョンにAPI Gatewayを作成していた。

## 解決方法
~/.aws/configを直しても良いけど、今回のエクスポートに限ってリージョンを指定したいので、regionオプションを使用する。

```
$ aws apigateway get-export \
  --rest-api-id xxxxxxxxxx \
  --stage-name prod \
  --export-type swagger \
  --accepts application/yaml swagger.yaml \
  --region us-east-1
{
    "contentType": "application/octet-stream",
    "contentDisposition": "attachment; filename=\"swagger_2016-10-21T10:49:03Z.yaml\""
}
```

OK。
型の反変と共変は、何故書き込みと読み込みに対応するのか

型のvarianceは型の情報のみ持つ時、「アップキャストは可能だがダウンキャストは原則不可能」ということから使い分けが出来る。

## アップキャストは可能だがダウンキャストは原則不可能

```scala
case class Life(age: Int)
case class Animal(age: Int, size: String) extends Life(age)
case class Human(age: Int, size: String, language: String) extends Animal(age, size)
```

という継承関係を考える。

AnimalもHumanも、ageをパラメタとして持っているため、Lifeを読み出すことは出来る。
しかしながら、LifeからAnimalを読み出そうと思ったら、sizeおよびlanguageが足らないため(型情報のみからでは)不可

```
Animal ---> Life    OK
Life   -X-> Animal  NG
```

矢印は型の変換を表す。
具体的な情報を抽象的な情報に落とすことは出来るが、逆は出来ない。



高校の集合論の記法で書くと、それぞれの集合に対して

```
Human ⊂ Animal ⊂ Life
```

の関係が成り立つ。


## 反変と共変、型の変換元と変換先

上で見た関係より、暗黙的に変換可能な型の関係としては

```
(具体的) Human ---> Animal ---> Life (抽象的)
```

となる。


### 共変

ここで StringなりJsonなり適当なリソースから型`T`の値を読み込む `Read[T]` を仮定する。

このとき、
`Read[Human]`は`Human`が得られるが、

```
Human ---> Animal
```

より、 `Read[Human]` は(変換することで) `Animal` も得ることが出来るため、
`Read[Animal]`でもあることがわかる。

よって

```
Read[Human] ⊂ Read[Animal]
```

したがって、
継承関係

```
Read[Human] ⊂ Read[Animal] ⊂ Read[Life]
```

が存在する。

これは

```
Human ⊂ Animal ⊂ Life
```

と同じ向きの継承関係となっている(共変)

### 反変

ここで StringなりJsonなり適当なリソースへ型`T`の値を書き込む `Write[T]` があったとする。
このとき、
`Write[Life]`は`Life`を書き込める。

しかし、

```
Animal ---> Life
```

より、 `Write[Life]` は(変換することで) `Animal` も書き込むことが出来るため、
`Write[Animal]` でもある。


したがって、
継承関係

```
Write[Human] ⊃ Write[Animal] ⊃ Write[Life]
```

が存在する。


これは

```
Human ⊂ Animal ⊂ Life
```

と逆向きの継承関係となっている(反変)


## まとめ

以上のように、管理している型から別のものに書き込む際は反変、読み込む場合は共変関係が成り立つ。
そしてそれは型内部でアップキャストは可能だがダウンキャストは原則不可能という関係から導くことが出来る。
python / netCDF / CentOS 6.8 > ImportError: No module named netCDF4 > sudo yum install netcdf4-python.x86_64

```txt:動作環境
CentOS 6.8
Python 2.6.6
```

## 症状

```read_nc.py
import netCDF4
```

上記を実行した時に以下のエラーが出た。

```
$ python read_nc.py 
Traceback (most recent call last):
  File "read_nc.py", line 1, in <module>
    import netCDF4
ImportError: No module named netCDF4
```

## 対策

以下のように関連パッケージをインストールする。

```
sudo yum install netcdf4-python.x86_64
```
ウィンドウの横幅に合わせてYouTubeの動画を載せる方法

HTMLやCSSを用いホームページなどを制作する際、
動画をウィンドウの横幅に合わせて（縦横比の維持のため、縦幅は適切な値に自動でリサイズします）表示させます。

今回はYouTube上にアップロードされている動画を例にとっておりますが、その他の手法で動画を表示させる場合も同様の手順にて実装できます。

まず、YouTubeの動画から取得してきたHTML用のリンク（埋め込みコード）がこちらです。

```
<iframe width="560" height="315" src="https://www.youtube.com/embed/~~~~~~~~" frameborder="0" allowfullscreen></iframe>
```

そして、HTMLの方では下記のように動画の埋め込みコードをで囲みます。
これは、CSSにてスタイルをあてるために行なっています。

```
<div id="video">
    <iframe width="560" height="315" src="https://www.youtube.com/embed/~~~~~~~~" frameborder="0" allowfullscreen></iframe>
</div>
```

次に、CSSでは下記のように記述します。

```
#video {
    position: relative;
    padding-top: 56.25%;
}

#video iframe{
    height: 100%;
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
}
```

前者は```<div> ~~~~~~ </div>```に対して、後者は中身にある埋め込みコードに対してスタイルをあてています。

ちなみにYouTubeの場合、以下のように動画のURLの直後にオプションをつけるとスタイリッシュな感じになります。


```
?rel=0&autoplay=1&controls=0&showinfo=0&start=20
```

それぞれのオプションは、

```rel=0 //動画が終了後、関連動画を表示しない```
```autoplay=1 //動画を自動で再生する```
```controls=0 //プレーヤーのスクロールバーを表示しない```
```showinfo=0 //動画のタイトルやプレーヤーの操作を表示しない```
```start=100 //動画を100秒目から再生する```

以上です。

当記事が、どなたかの一助となれば幸いです。
ハッカソンでDataSpiderを使って開発をする

#はじめに
DataSpiderは各種APIへの接続を容易にし、独自のAPIをノンコーディングで実装できるデータ連携ソフトウェアです。
ハッカソンではAWS上にDataSpiderインスタンスを立て提供させていただいています。
ご利用いただくには`Silverlightランタイムをインストール可能なブラウザ`が必要になります。

開場にいるサポート担当から以下の情報を提供いたしますので、`http://<IPアドレス>:<ポート番号>/WebStudio/`へアクセスしてください。
- IPアドレス
- ポート番号
- ユーザ
- パスワード

#開発クライアントにログインする
##Studio for Webを使う
1.上記URLへブラウザでアクセスし、ユーザ、パスワードを入力します。
　![image](https://qiita-image-store.s3.amazonaws.com/0/35843/94f7c44e-d835-f29b-9df6-fe92c25b08b6.png)

2.Studio for Webの画面が表示されます。
　![image](https://qiita-image-store.s3.amazonaws.com/0/35843/e2396602-0d53-7e16-e332-6e56dd1bd4d3.png)

#連携処理を作成する
0.概要
処理の最小単位は`スクリプト`で、そのスクリプトが複数集まったものが`プロジェクト`になります。
作成した処理を外部から呼び出したいとき、プロジェクトを`サービス`に登録し、`トリガー`と紐付けて外部のアプリケーションから利用することになります。
![image](https://qiita-image-store.s3.amazonaws.com/0/35843/f8fcf06d-6ddc-2436-ea33-51a3a94d819e.png)

1.スクリプトの器となる`プロジェクト`を作成します。
　- `新しいプロジェクト`をクリックして`プロジェクト`、`スクリプト`に名前をつけて完了します。
　![image](https://qiita-image-store.s3.amazonaws.com/0/35843/d41c297f-821f-1107-4d42-3e4116d53f70.png)

　- デザイナが表示されますのであとは`ツールパレット`から必要なコンポーネントをドラッグ＆ドロップで配置して開発をしていきます。
　![image](https://qiita-image-store.s3.amazonaws.com/0/35843/01e77294-577f-f2b4-d37d-e327449b5226.png)
 
#データをアップロードする
処理を作成する上で必要になってくるファイルはDataSpiderのエクスプローラからアップロードすることができます。
1.メニューバーの`エクスプローラ`をクリック
　![image](https://qiita-image-store.s3.amazonaws.com/0/35843/58b40459-efde-8433-1580-88a4066af20f.png)
 
2.エクスプローラ画面が表示されるので、アップロードしたいディレクトリを選択して右クリックで`ローカルからアップロード`を選択します。
　![image](https://qiita-image-store.s3.amazonaws.com/0/35843/ebf127e1-b9e6-c9af-c86c-767b7bced351.png)
　※`data`ディレクトリはファイル選択時に最初に表示されるディレクトリになるのでこちらに配置するのが便利です。

#テスト実行を行う
1. 処理の作成ができたら実行してみましょう。
　実行方法にはサーバサイドで実行されるものと、デバッグログを出力させながら実行させるモードがあります。
　開発時には`デバッグモード`を利用しましょう。

　![image](https://qiita-image-store.s3.amazonaws.com/0/35843/49b51b2e-e0ab-b9a5-7794-b4db0c3df7a8.png)<br>

　赤で囲んだボタンが`デバッグ実行ボタン`になります。
　その横にあるボタンはサーバサイドでの実行になるため、画面上にはログが表示されません。

2. 実行ログの確認にはいくつか種類がありますので必要に応じてタブを切り替えながら確認します。
 ![image](https://qiita-image-store.s3.amazonaws.com/0/35843/9821c8ab-2a14-9677-80dd-c255de8b715b.png)


#その他
##リモートデスクトップからStudio for Desktopを使う
- AWSの環境にリモートデスクトップでログインして利用いただき、インストール版の開発クライアント`Studio for Desktop`のご利用も可能ですので、サポートスタップにお気軽にお声がけください。

##評価版をダウンロードして利用する
- こちら『[評価版申し込み](https://his.hulft.com/appressocs/customer/applyFlow/)』からご自身の端末にダウンロードいただくことが可能です。
- 但し、ダウンロードには時間がかかりますのでご注意ください。
Nokogiri(Ruby)の使い方 - Rubyでクローラーを作る -

# Nokogiri
```rb:sample01.rb
require 'nokogiri'
require 'open-uri'

URL = ARGV[0]
doc = Nokogiri::HTML(open(URL))

p doc
```

実行する

```bash
$ ruby anemone.rb http://www.example.com/
```

注） ```http://www.example.com/``` には任意のURLを入力してください。
　　サイトによってはクローリングに時間がかかるのでご注意ください。

---

## メソッド

| メソッド | 概要 |
|:-:|:-:|:-:|
| title | titleを取得（文字列） |
| at_css | CSS検索（セレクター）で最初に一致した要素を取得 | 
| css | CSS検索（セレクター）で一致した要素を全て、ノードで取得 |
| inner_html | 指定した要素（タグ）内のHTMLを返す。 |
| content, inner_text, text, to_str | 指定した要素（タグ）内の文字を返す。（タグは除外） |
| to_s, to_html | 要素全体を返す。 |

---

### メソッドの使用例

```rb:sample02.rb
# -*- coding: utf-8 -*-
require 'nokogiri'
require 'open-uri'

URL = ARGV[0]
doc = Nokogiri::HTML(open(URL))

# title表示
puts doc.title

# ul(tag) を取得（最初に一致したulのブロック）
ul = doc.at_css('ul')

# html表示（ulタグ含む）
puts ul.to_html


# html表示（ulタグ除く）
puts ul.inner_html


# htmlを除外したテキスト表示
puts ul.text

```

---

# 参考サイト

http://www.nokogiri.org/tutorials/parsing_an_html_xml_document.html
Atomエディタでファイルを保存するだけでファイル蛾物故割れるときの対処法

# TL;DR

改行コードを揃えてから保存しよう．


# 環境

- Windows 10
- Atom ~1.11.2
  - このバージョン以前でもファイルによってはなってた
- パッケージはもう色々とガンガン入れちゃってる

もしかしたらどれかのパッケージが悪さしているのかもと考えたけれど，探すのも大変そうだしなんとかならないかな～とか思っていました．

# 現象

Atomエディタを使用していて，ファイルを**開いて保存する**だけでなんだか記述がめちゃめちゃになるときがあります．

記述がめちゃめちゃになるとは，こんな感じになります．

![](https://gist.githubusercontent.com/shyazusa/716df0e0cfa4ae1478f7b990964b561f/raw/17372bf05e41f015e38b23cb798f403160701c5b/create3.gif)

このめちゃめちゃになる前に一旦戻して，もう一度保存するとめちゃめちゃのなり方が変わります．
今までは，これを何度か繰り返してめちゃめちゃになる範囲をせばめて，めちゃめちゃにならなくなったら保存したりして対処してました．

# 対処法

改行コードを変更してから保存するようにします．
以下手順を試してみて下さい．

1. `Ctrl + Shift + P`
2. `Line Ending Selector: Show` (下のキャプチャでは`lineen`と入力して選択してます)
3. 好きな改行コードを選択
4. 保存

![](https://gist.githubusercontent.com/shyazusa/716df0e0cfa4ae1478f7b990964b561f/raw/17372bf05e41f015e38b23cb798f403160701c5b/create4.gif)

ファイルが壊れなくなった!!

もしも同じ現象で悩んでいる方がいれば一度試してみて下さい．
django の QueryDict に配列パラメータ転送の話

Django サービス `B` が `A` から受け取ったパラメータをなんの修正もしなくて、そのまま別サービス `C` に転送するプログラムを作ってます。

あるパターンで、もしそのパラメータは配列のであれば、配列全体ではなく、最後の要素のみサービスCに転送される不具合がありました。

修正前のソース：

```py
>>> qd = QueryDict('egg=1&egg=2&p=3')
>>> response = requests.get('http://localhost:12345/', params=qd)
```

サービス `C` に請求先のURLは `/?p=3\u0026egg=2` 、が一つになりました。

調べたところ、`QueryDict` とPythonの `dict` は大きい違いがあります。 `QueryDict` をそのまま `dict` として渡されると、すべてのパラーメタは一つの値になります。中には `QueryDict.get()` メソードが使われるようです。

```py
>>> qd.get('egg')
u'2'
>>> qd.getlist('egg')
[u'1', u'2']
```

`QueryDict` は `dict()` メソードがありますが、想定と違い動きが出でいました。

```py
>>> qd.dict()
{u'p': u'3', u'egg': u'2'}
```

最後に、この方法を見つかりました。

```py
>>> dict(qd.iterlists())
{u'p': [u'3'], u'egg': [u'1', u'2']}
```

修正後のプログラムはこのように：

```py
>>> response = requests.get('http://localhost:12345/', params=dict(qd.iterlists()))
```

今回にサービス `C` は正しく `/?p=3\u0026egg=1\u0026egg=2` のように、`egg` は配列の形で転送されました。
tmux > ペインを最大化するには @ CentOS6.8 > tmux v1.8以降のインストールが必要

```txt:動作環境
CentOS 6.8
tmux 1.6-3.el6
```

tmuxを使っているうちに、ペイン分割したものを1つのペインにしたい時がある (テキストコピペ時など)。

以下の記事では`C-b z`でいいとのこと。
http://qiita.com/k2nakamura/items/d011472c63025ef6c32e

試したところv1.6では効果がなかった。

上記記事のリンク先を見るとtmux 1.8以降で使える機能のようだ。

CentOS 6.5でtmux 1.8をインストールする記事は以下に見つけた。
http://ptan.info/archives/587#.WAnipPmLSUk

<hr>
(追記 2016/10/22)
Ubuntu 14.04 LTSにインストールされたtmuxでは上記の機能が使える。

インストールされているのはtmux 1.8-5
Proxy環境下でのVagrant設定

# Proxy環境下でvagrant upを行うメモ

## 環境
Windows 10 Pro 64bit
Vagrant 1.8.5

## 1. vagrant-proxyconfプラグインをインストール

[vagrant-proxyconf](https://github.com/tmatilai/vagrant-proxyconf)
ゲストOSへの環境変数設定（HTTP_PROXY, http_proxy, HTTPS_PROXY, https_proxy）
apt, yum, gitなどなどのプロキシ設定を行ってくれるプラグイン。

```shell-session
> set http_proxy=http://{proxy_ip}:{proxy_port}
> set https_proxy=http://{proxy_ip}:{proxy_port}

> vagrant plugin install vagrant-proxyconf
````
http_proxy, https_proxyはvagrantのプラグインインストールのGemで必要


## 2. Vagrantfileの編集と実行

```rb:Vagrantfile
Vagrant.configure(2) do |config|
    # ～省略～

    # プロキシ設定
    if Vagrant.has_plugin?("vagrant-proxyconf")
        config.proxy.http     = "http://{proxy_ip}:{proxy_port}"
        config.proxy.https    = "http://{proxy_ip}:{proxy_port}"
        config.proxy.no_proxy = "localhost,127.0.0.1"
    end
end
```

```shell-session
> vagrant up
```

## (おまけ) プロキシ設定を環境変数から読む

```rb:Vagrantfile
Vagrant.configure(2) do |config|
    # ～省略～

    # プロキシ設定
    if Vagrant.has_plugin?("vagrant-proxyconf") && ENV['PROXY_URL']
        puts '- Proxy Setting ----------------------------------'
        puts ENV['PROXY_URL']
        config.proxy.http     = ENV['PROXY_URL']
        config.proxy.https    = ENV['PROXY_URL']
        config.proxy.no_proxy = "localhost,127.0.0.1"
        puts '--------------------------------------------------'
    end
end
```

```shell-session
> set PROXY_URL=http://{proxy_ip}:{proxy_port}
> vagrant up
```

※`PROXY_URL`に設定する値はダブルクォート(")つけない。
つけるとaptとかの設定ファイル(/etc/apt/apt.conf.d/01proxy)でシンタックスエラーになってしまう。
XGBoost を Windows でビルドする

#はじめに
タイトルの通り XGBoost を Windows でビルドしたときの手順（2016年10月）です。正直、結構めんどくさかったので Linux でやったほうがよいと思います。環境は以下。

- Windows 2012 R2 64bit
- Anaconda3 4.2.1
- XGBoost 0.6


#準備するもの
##Chocolatey
Chocolatey というのは Windows のパッケージマネージャです。
なくても別に何とかなるのですが、あると何かと便利なので導入しておきます。

https://chocolatey.org/install

インストールは上記にもある通り、コマンドプロンプトにワンライナーをコピペ。

```
@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
```

##MSYS2
Chocolatey を使って MSYS2 をインストールします。

```
choco install -y msys2
```

MSYS2 は C:\tools\msys64 にインストールされます。


##Git と MinGW64
MSYS2 を起動し、MSYS2 のパッケージマネージャである pacman コマンドを使って Git と MinGW64 をインストールします。既に Git Windows などが入っている場合は、あらためて Git をインストールする必要はありません。

```
pacman -S git mingw-w64-x86_64-toolchain
```

#ビルド作業
引き続き MSYS2 での作業になります。XGBoost のリポジトリをクローンしましょう。

```
git clone --recursive https://github.com/dmlc/xgboost
...
cd xgboost
git submodule init
git submodule update
```

make コマンドと g++ コマンドを使えるように、パスを通してエイリアス設定します。
そして MinGW64 用の makefile をコピって make 実行！ 

```
export PATH=${PATH}:/c/tools/msys64/mingw64/bin
alias make=mingw32-make.exe
cp make/mingw64.mk config.mk
make -j4
```

#インストール
ビルドが終わったら Anaconda Prompt からインストールします。

```
cd C:\tools\msys64\home\Administrator\xgboost\python-package
python setup.py install
```

#確認
MinGW64 にパスが通っていないと Dynamic Link に失敗するので気をつけましょう。
環境変数 Path に MinGW64 の bin ディレクトリを追加しておけば OK です！

![image](https://qiita-image-store.s3.amazonaws.com/0/79374/47d6c20f-a867-2bf9-ddb2-7fcf79407d45.png)

IPython か何かからインポートしてみて、エラーが出なければ成功です！お疲れ様でした！

![image](https://qiita-image-store.s3.amazonaws.com/0/79374/dad8e7a3-431d-85ca-ab0a-952a898da851.png)
CSVファイルをmecab, nattoで形態素解析

### CSVファイルのmecab, nattoによる形態素解析

下記投稿と同様、標準ライブラリcsvでCSVファイルが読めない問題が発生し、openメソッドを使ってやりました。
http://qiita.com/kinushu/items/46567bcb1a31e2721c92

```ruby:morpho.rb
require "mecab"
require "natto"
require "pp"
results = []
open("test.csv", encoding: "Shift_JIS:UTF-8") do |f|
  f.each_line do |line|
    nm = Natto::MeCab.new
    nm.parse(line) do |n|
      s = n.surface ? n.surface : "-"
      results << s
    end
  end
end
words_and_count = []
results.uniq.map do |word|
  words_and_count[words_and_count.size] = ["#{word}", "#{results.grep(word).count}"] if word
end
pp words_and_count.sort_by {|word_and_count| word_and_count[1].to_i}.reverse
```