OmniAICreator/Qiita-1.07M huggingface dataset:
Mac の JXA で現在のデスクトップの壁紙を変更する

最近は作業環境の自動化を細々と進めています。

AppleScript は何度読んでも読めないので JXA は非常にありがたいのですが、ちょっと込み入ったことをすると所望の動作をどう書けばいいか分からなくて、勉強の必要性を感じます。スクリプトエディタのヘルプがそっけなさすぎて分からないし、検索して出てきたものが AppleScript だと JXA に翻訳して読めない…。

前置きはこのくらいにしておきつつ、今回はデスクトップの壁紙を変更する方法です。これも AppleScript での方法はよくひっかかるのですが、JXA で書かれた例をあまり見なかったので記事を書くことにしました。

# JXA で現在のデスクトップの壁紙を変更

`System Events` がカギです。私は最初 `Finder` の配下なのかなと思って無駄にヘルプを読み漁ってしまいました。

```js
var se = Application("System Events");
var path = "/Library/Desktop Pictures/Yosemite 5.jpg";
se.currentDesktop.picture.set(path);
```

`osascript` のインタラクティブモードで上記を入力してみると良いでしょう。

```js
$ osascript -i -l JavaScript
```

現在フォーカスがあたっているデスクトップの壁紙を指定されたパスのもので変更します。

AppleScript の場合は、ここは `POSIX` 云々で変換して…とありますが、JXA のこの場合はそのまま渡してもよいようです。

# コマンドライン引数で指定された画像ファイルで現在のデスクトップ壁紙を変更

シェバン行に `osascript` を書くことで実行ファイルとすることもできます。

```
#!/usr/bin/osascript -l JavaScript

function run (arg) {
    var se = Application("System Events");
    if ( arg.length == 1 ) {
        se.currentDesktop.picture.set(arg[0]);
    }
}
```

C言語の `main` 関数のように、`run` 関数を書いておくとコマンドライン引数を上記の例のように受け取れます。

# Bash とハイブリッドにする

もっとも、Bash の知識がそこそこあって、それを援用すると効率的である場合には、ハイブリッドのようなスクリプトを書くのも悪くないかなと思っています（パフォーマンスがことさら要求されることではないので）。

```bash:macgui
#!/bin/bash
set -o errexit

ARG1="$1"
shift

JSRUN="osascript -l JavaScript"

function dispatch_wallpaper {
    local path="$1"
    if [ -n "$path" -a ! -f "$path" ] ; then
        echo "\"$path\" is not found" >&2
        exit 1
    fi
    shift
    $JSRUN <<EOF
var path = "$path";
var se = Application("System Events");
se.currentDesktop.picture.get();
if ( path ) {
    se.currentDesktop.picture.set(path);
}
EOF
}

###
### main
###

if type "dispatch_$ARG1" &>/dev/null ; then
    dispatch_$ARG1 "$@" 2>&1
else
    echo "Usage:"
    COMMAND_LIST=$( grep "^function dispatch_" $0| sed -e 's/function  *dispatch_//' -e 's/ .*//' )
    echo "  $(basename $0) [$COMMAND_LIST]"
fi
```

このようなスクリプトを書いておくと、 `dispatch_` で始まる名前の Bash 関数をサブコマンドで選ぶことができるので便利かもしれません。

```shell-session
$ macgui wallpaper "/Library/Desktop Pictures//Yosemite 5.jpg"
```

---

現在のデスクトップ以外のデスクトップを対象としたり、応用的な部分は気が向いたら追記していきます。こんな感じでできたよという方は、コメントなどでアドバイスしていただければ取り込んでいきたいなと思っています。
Drupal8 入門の入門（BasicAuthモジュール）

## BasicAuth(basic_authモジュール)での認証フロー

core/modules/basic_auth/src/Authentication/Provider/BasicAuth.php
> floodにIPでのBasic認証失敗が許容内か問い合わせ
>> Userを取得
>>> floodに該当UserでのBasic認証失敗が許容内か問い合わせ
>>> ※{uid}_{IPアドレス}のキーでfloodに登録されている
>>> ※(uid_onlyが有効(初期値：無効)になっているときは{uid}のみのキーで登録されている)
>>>>    User認証を実行
>>>>        →成功：UserEntityを返却
>>>>        →失敗：floodに失敗を登録

### 設定yml
core/modules/user/config/install/user.flood.yml

 - IP：イベントに対して、1時間に50回の失敗まで許容
 - USER：イベントに対して、6時間に5回の失敗まで許容
 
> ※今回の例でのイベントは「basic_auth.failed_login_ip」

なぜ「flood=洪水」という名前なのか気になったので調べてみたらそういう事かと納得。
http://e-words.jp/w/%E3%83%95%E3%83%A9%E3%83%83%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0.html

## routing.ymlでのbasic_authの設定例

```:yml
mymodule.some.route:
  path: '/hello/drupal'
  defaults:
    _controller: '\Drupal\mymodule\Controller\HelloController::hello'
  options:
    _auth: ['basic_auth']
  requirements:
    _permission: 'access content'
    _method: 'GET'
```
> 上記例ではUserに付随する情報（RoleやPermission）を指定していないのであまり意味はない。

## 参考
- [Protecting Your Drupal 8 Resources](https://www.drupalwatchdog.com/volume-4/issue-2/protecting-your-drupal-8-resources)
OAuthモジュールもあるらしい。

- [Structure of routes](https://www.drupal.org/node/2092643)
routing.ymlの書き方などについて
[Rails] Markdown形式で入力できるようにしてみた（シンタックスハイライトも対応）

railsでmarkdown形式でmarkdown形式で入力した文字列を表示できるようにしてみました．
シンタックスハイライト（言語ごとに表示を合わせる）にも対応させました．

## 環境
```ruby:Gemfile
source 'https://rubygems.org'

gem 'rails', '4.2.6'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0', group: :doc
gem 'redcarpet', '~> 2.3.0'        #markdown
gem 'coderay'

group :development, :test do
  gem 'sqlite3'
  gem 'byebug'
  gem 'pry-rails'
end

group :development do
  gem 'web-console', '~> 2.0'
  gem 'spring'
end
```

## gemを追加する
```ruby:Gemfile
gem 'redcarpet', '~> 2.3.0'
gem 'coderay'
```
[redcarpet](https://github.com/vmg/redcarpet)はマークダウン形式に対応させるgemです．
[coderay](https://github.com/rubychan/coderay)はシンタックスハイライトに対応させるためのgemです．
追加したら `bundle install` する．

## ヘルパー追加
```ruby:application_helper.rb
module ApplicationHelper
	require "redcarpet"
	require "coderay"
	
	class HTMLwithCoderay < Redcarpet::Render::HTML
		def block_code(code, language)
			language = language.split(':')[0]
			
			case language.to_s
			when 'rb'
				lang = 'ruby'
			when 'yml'
				lang = 'yaml'
			when 'css'
				lang = 'css'
			when 'html'
				lang = 'html'
			when ''
				lang = 'md'
			else
				lang = language
			end
			
			CodeRay.scan(code, lang).div
		end
	end
	
	def markdown(text)
		html_render = HTMLwithCoderay.new(filter_html: true, hard_wrap: true)
		options = {
			autolink: true,
			space_after_headers: true,
			no_intra_emphasis: true,
			fenced_code_blocks: true,
			tables: true,
			hard_wrap: true,
			xhtml: true,
			lax_html_blocks: true,
			strikethrough: true
		}
		markdown = Redcarpet::Markdown.new(html_render, options)
		markdown.render(text)
	end
end
```

## scaffoldで使ってみる

```logos:Terminal
$ rails g scaffold Article title:string body:text
```
```logos:Terminal
$ rake db:migrate
```

表示に `<%= markdown(@article.body).html_safe %>` を追加する．

```erb:show.html.erb
<p id="notice"><%= notice %></p>

<p>
  <strong>Title:</strong>
  <%= @article.title %>
</p>

<p>
  <%= markdown(@article.body).html_safe %>
</p>

<%= link_to 'Edit', edit_article_path(@article) %> |
<%= link_to 'Back', articles_path %>
```

scaffoldで作成したアプリを `rails s` で動かす．
http://localhost:3000/articles/new でデータを作成または，
http://localhost:3000/articles/1/edit でデータを編集する．
![スクリーンショット 2016-06-26 18.52.17.png](https://qiita-image-store.s3.amazonaws.com/0/121224/87411800-ede5-b76c-f3e2-907a6afedfe0.png)

http://localhost:3000/articles/1 で表示を確認する．
![スクリーンショット 2016-06-26 18.52.26.png](https://qiita-image-store.s3.amazonaws.com/0/121224/7f1bc356-cb8c-8b86-1c92-f8a5b7f72933.png)

## マークダウンの記法は次の記事を見るとわかりやすいです！
http://qiita.com/Qiita/items/c686397e4a0f4f11683d

## 参考
http://chmod.tech/?p=621
http://qiita.com/usutani/items/3651c7146f44592b00e5
Capybaraでブラウザのウィンドウサイズをモニタに合わせて自動最大化する方法

SeleniumにはWindowを最大化するAPIとして`Capybara.page.driver.browser.manage.window.maximize`が存在していますが、問題点としてChromeとFirefoxで最大化時の幅が異なるという問題点があります。Chromeはページが十分に見える幅まで最大化するのに対して、Firefoxは画面いっぱいに最大化します。

従って、クロスブラウザでウィンドウ幅を均一にするには、同じ`window`オブジェクトに生えている`resize_to`メソッドを使うことになります。このメソッドは`resize_to(幅, 高さ)`を数値で指定するので、ここに画面の大きさを入れてあげればいいわけです。

以下のコードはRSpecで画面幅を最大1024とし、それよりモニタが小さい場合、モニタの幅に合わせるようにしたコードです。モニタの幅や高さの算出はJavaScriptをブラウザに実行させています。

```rb:spec_helper.rb
require 'capybara'

RSpec.configure do |config|
  max_window_width = 1024
  config.before(:all) do
    screen_height = Capybara.page.execute_script("return screen.height;")
    screen_width = Capybara.page.execute_script("return screen.width;")
    screen_width = [screen_width, max_window_width].min
    Capybara.page.driver.browser.manage.window.move_to(0, 0)
    Capybara.page.driver.browser.manage.window.resize_to(screen_width, screen_height)
  end
end
```

最大幅を設定している理由は、最近のモニタは幅が1640だったりとウェブページとしては広すぎることもあるため、ウェブページとして広すぎない幅にするために設定しています。
Visual Studio の Image Watch プラグインで std::vector を使う

# 概要

画像処理プログラミングをする際の超便利なプラグインとして、デバッグ中のメモリを画像表示してくれる Image Watch プラグインがあります。

[Image Watch プラグイン](https://visualstudiogallery.msdn.microsoft.com/e682d542-7ef3-402c-b857-bbfba714f78d)
![alt](http://research.microsoft.com/en-us/um/redmond/groups/ivm/imagewatchhelp/screenshot.png)

このプラグインはデフォルトで OpenCV の Mat や IplImage を表示してくれますが、
カスタム Visualizer ファイルを作成することで自作クラスを画像表示に対応させることもできます。

この記事では std::vector を使った自作画像クラスの Visualizer の作成法について解説します。
Visual Studio のバージョンは 2015 です。

# 方法

画像表示させたいクラスがこんな感じだとします。

```cpp
class MyImage
{
  //! 幅
  int width;

  //! 高さ
  int height;

  //! 画素データ
  std::vector<int> rgbData;
};
```

メンバ変数 rgbData の各要素 (4バイト) には、先頭3バイトに BGR の順番で色情報が入っていて、4バイト目は使用されない仕様です。

このクラスの画像表示をするためには、このクラスに対応した Visualizer ファイルというものを作成し、所定の場所に保存する必要があります。

### Visualizer ファイルの作成

Visual Studio 2015 をインストール済みであればログイン中のユーザのドキュメントフォルダ下に Visual Studio 2015\Visualizers というフォルダが作成されているかと思います。まずそれを開きます。

[ユーザプロファイル]\Documents\Visual Studio 2015\Visualizers

このフォルダに新規ファイルを追加します。ファイル名はなんでもよいですが例えば "myImage" にします。拡張子は必ず ".natvis" にします。

### Visualizer ファイルの編集

メモ帳で "myImage.natvis" を開いて以下のように編集します。

```xml:myImage.natvis
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1" MenuName="Add to Image Watch"/>

  <!-- MyImage def -->
  <Type Name="MyImage">
    <UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1" />
  </Type>

  <Type Name="MyImage">
    <Expand>
      <Synthetic Name="[type]">
        <DisplayString>UINT8</DisplayString>
      </Synthetic>
      <Synthetic Name="[channels]">
        <DisplayString>RGB</DisplayString>
      </Synthetic>
      <Item Name="[width]">width</Item>
      <Item Name="[height]">height</Item>
      <!-- buffer address of std::vector -->
      <Item Name="[data]">((rgbData._Mypair)._Myval2)._Myfirst</Item>
      <Item Name="[stride]">4*width</Item>
    </Expand>
  </Type>

</AutoVisualizer>
```

- Type タグの Name には自作クラス名 (MyImage) を書きます。
- type 属性には1チャンネルのとる値の範囲を入れます（たぶん）。この場合 0-255 なので UINT8 にします。
- channels 属性にはチャンネル数を入れます。この場合 RGB です（もしくは 3 でも大丈夫です）。
- width, height 属性には画像の幅、高さを保存しているメンバ変数名を入れます
- stride 属性には画像一行のバイト数を入れます。この場合 width x 4  バイトです（4 は sizeof(int) から）。
- data 属性には画像のバッファの先頭ポインタを指定します。 &rgbData[0] と書きたくなりますがこの書き方は Visualizer では解釈しれくれないので ((rgbData._Mypair)._Myval2)._Myfirst と書き下す必要がありました。

myImage.natvis を上記の形で保存して Visual Studio を再起動するとデバッグ中にメモリの状態を画像として確認できるようになります。Image Watch ウィンドウの表示は「表示」メニューからできます。

テンプレートクラスの画像表示など全般的な使い方は [Image Watch Help](http://research.microsoft.com/en-us/um/redmond/groups/ivm/imagewatchhelp/imagewatchhelp.htm) に書かれています。
Githubのsshで何故かPermission denied (publickey)となる場合の設定メモ

ちょっと詳しい理由はわからないんですが、特定の端末だけ以下の様なエラーがでてpush/clone等ができない時がありました。

```
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

その場合は以下のようにしたら直りました。

```bash
$ eval "$(ssh-agent -s)"
$ ssh-add ~/.ssh/id_rsa # github用のssh-keyへのパス
```

[github Permission denied って急に言われました(´・ω・`) - rochefort's blog](http://rochefort.hatenablog.com/entry/2014/07/08/073000)
[Generating a new SSH key and adding it to the ssh-agent - User Documentation](https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/)
Arduinoに自作のデバウンスを組み込んでみた

[DebounceFunc for Arduino](http://qiita.com/ttatsf/items/510761700a1eaa01982c)で作ってはみたもののあまり出番がなかったのですが、とうとう実戦に投入する機会が訪れました。
![P_20160614_204036.jpg](https://qiita-image-store.s3.amazonaws.com/0/61597/db44b3d7-9b5f-4c85-b0e6-294c89caba8e.jpeg)

下矢印だけのUSBキーボードです。
doctorMXという舞台照明のソフトでシーンを送るのに使います。

```cpp
#include <DebounceFunc.h>
#include <Keyboard.h>

const int BUTTON_PIN = 12;	//ボタンを12番ピンに設定
const int LED_PIN = 13;
IsFALLING isFalling(50);	//関数オブジェクトをデバウンスタイム=50msで生成。
IsRISING isRising(50);		//

void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  pinMode(LED_PIN,OUTPUT);
  digitalWrite(LED_PIN,LOW);
  Keyboard.begin();  
}

void loop(){
  const int RAW_DATA = digitalRead(BUTTON_PIN);  //ボタンを読む
  if( isFalling(RAW_DATA) ) {					//状態がFALLING(1 -> 0)なら
        Keyboard.press(KEY_DOWN_ARROW);				//下矢印を押す
        digitalWrite(LED_PIN,HIGH);					//LED点灯
  }
  if( isRising(RAW_DATA) ) {					//状態がRISING(0 -> 1)なら
        Keyboard.releaseAll();						//キーを離す
        digitalWrite(LED_PIN,LOW);					//LED消灯
  }
}
```


ちなみにオブジェクト指向のライブラリだと[RBD_Button](http://robotsbigdata.com/docs-arduino-button.html)というのが使いやすいです。最近まで使っていました。
同じことをやろうとするとこうなります。

```cpp
#include <RBD_Timer.h>
#include <RBD_Button.h>
#include <Keyboard.h>

const int LED_PIN = 13;
RBD::Button button(12);		//12番ピンでButtonオブジェクトを生成

void setup() {
  pinMode(LED_PIN,OUTPUT);
  digitalWrite(LED_PIN,LOW);
  button.setDebounceTimeout(50);		// デバウンスタイムを50msに設定
  Keyboard.begin();  
}

void loop(){
  if( button.onPressed() ) {				//ボタンが押されたら
        Keyboard.press(KEY_DOWN_ARROW);			//下矢印を押す
        digitalWrite(LED_PIN,HIGH);				//LED点灯
  }
  if( button.onReleased() ) {				//ボタンが離されたら
        Keyboard.releaseAll();					//キーを離す
        digitalWrite(LED_PIN,LOW);				//LED消灯
  }
}
```
Ubuntu16.04にnpm / Node.js v6.xをインストール

Ubuntuにnpm / Node.js v6.x をインストールする方法メモ。

基本的に以下の手順に従う。

[Installing Node.js via package manager | Node.js](https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions)

# インストール

```bash:npmインストール
$ sudo apt-get install -y build-essential

$ curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
$ sudo apt-get install -y nodejs
```

```bash:バージョン確認
$ npm --version
3.9.5
$ node --version
v6.2.2

```

# プロキシ設定

[[Node.js] npm の proxy と registry 設定 - Qiita](http://qiita.com/LightSpeedC/items/b273735e909bd381bcf1)

# 参考
[Node.js v6.0 (Current) がリリースされました。 - from scratch](http://yosuke-furukawa.hatenablog.com/entry/2016/04/27/110027)
[RSpec] Validationの注意

Userモデルでmailフィルドはユニークフィルドです。

```rb
class User
  include Mongoid::Document
  field :name
  field :mail
  validate :unique_mail
  
  def unique_mail
    # do something
  end
end
```

CompanyモデルでUserとhas_manyアソシエーションがあります。

```rb
class Company
  include Mongoid::Document
  field :name
  has_many :users
end
```

##テストケース

```rb
let(:user) {create :user, name: "user", mail: "user@mail.com"}
let(:another_user) {create :user, name: "another user", mail: "user@mail.com"}
let(:company) {create :company}

context "when company has 2 users" do
  it "equal 2" do
    company.users = [user, another_user]
    expect(company.users).to eq 2
  end
end
```

Failureが出てきた

```cmake
     Failure/Error: expect(company.users.count).to eq 2

       expected: 2
            got: 1

       (compared using ==)
```
もっと分析する
bindingを設定して、いくつかCmdを試します。

```rb
  it "equal 2" do
    company.users = [user, another_user]
    binding.pry
    expect(company.users).to eq 2
    end
  end
```

```cmake
company.users.to_a
[#<User _id: 576f951e4e677507e1ff0000, created_at: 2016-06-26 08:41:02 UTC, updated_at: 2016-06-26 08:41:02 UTC, company_id: BSON::ObjectId('576f951e4e677507e1040100'), name: "user", mail: "user@mail.com">,
 #<User _id: 576f951e4e677507e17e0100, created_at: 2016-06-26 08:41:02 UTC, updated_at: 2016-06-26 08:41:02 UTC, company_id: BSON::ObjectId('576f951e4e677507e1040100'), name: "another user", mail: "user@mail.com">]

company.users.count
1
```
なんにこれ？
もっともっと分析してみます。

```rb
user = company.users.first
user.save 
#=> false
user.errros
# @messages={:メールは=>["別の顧客に使われています。"]}
```
これは原因です。
なぜならRSpecにUserが保存できないですが、エーラーも出て来なかった。なかなか原因を見つけられません。
ミリオンライブ！アイドル判定器を作った

アイドルマスター ミリオンライブ！[^1]のゲーム内テキストを利用して機械学習を行う、発言アイドル判定器を作りました。

### Jubatusのセットアップ
[Jubatus](http://jubat.us/ja/)は「オンライン機械学習向け分散処理フレームワーク」です。今回は「オンライン」も「分散処理」も必要ないのですが、以前触った時に簡単に使える印象を持ったので、今回も使いました。
Docker HubにMeCabモジュール付きのJubatusがあったので、ありがたく利用させてもらいます。
[https://hub.docker.com/r/keisato/jubatus-mecab/](https://hub.docker.com/r/keisato/jubatus-mecab/)

``` shell
$ docker pull keisato/jubatus-mecab
$ docker run -d -p 9199:9199 --name jubatus-mecab keisato/jubatus-mecab
```

### 学習・判定
JubatusのRubyクライアントを使います。
イベント20回分ぐらいのアイドルフィーチャリング[^2]のテキストを学習データとして利用します。
アイドルのIDでタグ付けして、テキストだけ突っ込めば、MeCabモジュールのおかげでいい感じに学習してくれます。べんり。
テスト用テキストには、美也さん[^3]のあいさつを使用しました。

#### ソース
[classifier.rb](https://gist.github.com/gomao9/cd0889436e6ed7ea2589a90b7f5b9007)

#### 実行・出力
``` shell
$ ruby classifier.rb train
$ ruby classifier.rb test                                                                                                                                                                                                 (git)-[master]
"う～ん…この衣装、小さくて頭が入らないですね～。…あ、私のじゃないんですか～。"
美也    :0.42
朋花    :0.30
麗花    :0.29

"プロデューサーさん、もっと笑顔でど～んって待ち構えましょう～。焦ってもお仕事はこないです～。"
美也    :0.69
翼      :0.57
朋花    :0.31

"今日はレッスンよりみんなでお散歩しましょ～。"
美也    :0.38
翼      :0.35
朋花    :0.22

"あ…っ！　突然ですけど、私、お天気おねえさんのお仕事がやりたいです～。"
美也    :0.41
未来    :0.31
桃子    :0.21

"えぇ～？　今の話…アイドルのことを話してたんですか～？"
静香    :0.22
亜利沙  :0.20
志保    :0.16

"なんとーもうこんな時間ですか？　びっくりですね～。"
美也    :0.53
あずさ  :0.26
未来    :0.20

"今日はオーディションですか～？　もちろん覚えてましたよ～。"
美也    :0.44
あずさ  :0.27
翼      :0.17

"早口言葉も得意ですよ～。ゆっくり丁寧に喋れば、絶対にカミませんから～。"
美也    :0.81
朋花    :0.30
美奈子  :0.24

"今日は一日、発声練習に集中しますね～。ノドが渇くから、たくさんお水を用意しないと…！"
美也    :0.39
のり子  :0.27
あずさ  :0.21

"私もウデには覚えがあるので、社長が相手でも負けませんよ？　なんの話って…将棋の話ですよ～。"
美也    :0.42
紗代子  :0.21
奈緒    :0.21

"プロデューサーさんにサンドイッチを作ってきましたよ～美味しいですか？"
美也    :0.37
美奈子  :0.24
麗花    :0.20

"プロデューサーさん、私、トークの役に立つ小話をたくさん集めたので、今日はトークの練習しましょう～。"
美也    :0.54
朋花    :0.27
まつり  :0.21

"私がTVに映る時は、隣で一緒にみてくださいね～。"
朋花    :0.26
未来    :0.21
美也    :0.20

"今日はちょっとヒマですね～。プロデューサーさんも、こっちでゆっくりお茶でも飲みませんか？"
美也    :0.51
雪歩    :0.32
翼      :0.20

"もう～、プロデューサーさんのお話はちゃ～んと聞いてますよ？　昨日の時代劇の話で…違いましたか～。"
美也    :0.66
未来    :0.36
恵美    :0.34

"美希ちゃんのお昼寝を見ていると、私もなんだか…プロデューサーさん肩かしてください…Zzz。"
風花    :0.23
麗花    :0.23
美也    :0.23
```

### 所感
* 最初はRuby製の機械学習フレームワークを使ってやろうとしてたけど、機械学習の基礎知識が足りなくて断念。
* Jubatusは知識がなくてもデータ突っ込むだけでなんとなく使える（使えた気になる）ので良い感じ。
* 結果を見る限り、それなりの精度が出てるので実用性あるんじゃないかな。
* 似てるアイドルとか、誤判定しやすいアイドルも調べたい。

---

[^1]: [公式サイト](http://bandainamcoent.co.jp/cs/list/idolmaster/million_live/)
[^2]: ゲーム内イベントで読むことができる、ごく短いエピソード。1つのイベントで、アイドル全員にそれぞれ10個ずつほど見られるので、学習データとして使いやすかった。
[^3]: [宮尾美也](http://dic.pixiv.net/a/%E5%AE%AE%E5%B0%BE%E7%BE%8E%E4%B9%9F)さん。かわいい。
node-inspectorなしでNode.jsをデバッグする

Node.jsをデバッグする時は「node-inspector」を使うことが多いです

[node-inspector](https://www.npmjs.com/package/node-inspector)

~~ですが、「node-nightly」版を使うと「node-inspector」なしでデバッグすることが可能です！~~
v6.3.0で標準実装されました！(2016/07/07追記)

# 準備

## ダウンロード

「node-nightly」版を落としてきます

[https://nodejs.org/download/nightly/v7.0.0-nightly20160621ecc48a154d/]

↑ここに環境ごとのバイナリファイルがあるのでダウンロードします

## 解凍

```
tar zxvf node-v7.0.0-nightly20160621ecc48a154d-darwin-x64.tar.gz
```

解凍したら、binフォルダに実行ファイルがあるので、適当な場所にコピーします

# サンプルプログラム

今回は、expressを使った簡単なサンプルプログラムを用意します  

## インストール

```
npm init -y
npm install -S express
```

## ソース

```app.js
const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('Hello, World!');
});

app.listen(3000);
```

# デバッグ

Nightly版の場合は

```
node-nightly --inspect --debug-brk app.js
```

v6.3.0が入ってる方は

```
node --inspect --debug-brk app.js
```

「--inspect」フラグを付けることでデバッグが可能です
実行時に最初の行で止めたい場合は、「--debug-brk」フラグを付けると止まります

実行すると、↓このように表示されるので

<img width="1108" alt="スクリーンショット 2016-06-26 17.07.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/54850/8ec53ff1-af4f-1fdb-06e1-5bd4b0209e29.png">


「chrome-devtools://...」の部分をコピーしChromeで開きます
そうすると↓このように最初の行で止まった状態になるので、任意の場所にブレイクポイントを貼ります

<img width="686" alt="スクリーンショット 2016-06-26 17.13.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/54850/d1b7d45a-56a1-3950-1133-807b090fd4af.png">


今回は、「 http://localhost:3000 」にリクエストが来たら止まるようにしました

「 http://localhost:3000 」にアクセスしてみると↓このようにブレイクポイントで止まり
変数の中身などが確認できます

<img width="1029" alt="スクリーンショット 2016-06-26 17.27.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/54850/29d6e156-2ec0-915a-1b0f-b83a0719ca4c.png">
linuxコマンドでよく出てくる、【再帰的】とは、、、

linuxコマンドを使用していてなんとなくのレベルで使用していたコマンドで、「再帰的な検索が可能」と表現されているコマンドがあり、なんとなくの理解だったので調べた。

まず、あるコマンドは「ディレクトリ内に存在するものに一つ一つに対して処理をする」という前提をもとに動作する。

そして、再帰的オプションをつけた場合のそのコマンドの動作は、

__まず、ディレクトリ内に存在するものに一つ一つに対して処理をする。
その際、その一つがディレクトリだったら、、、
そのディレクトリ内に存在するものに一つ一つに対して処理をする。
その際、その一つがディレクトリだったら、、、
そのディレクトリ内に存在するものに一つ一つに対して処理をする。
その際、...__

という処理になる。

再帰によってすべてのディレクトリを処理できるのは階層ディレクトリファイルシステムが再帰構造の一つである木構造を基本にしているからだとか、そのた数学的意味とかを考えずとも、説明しようとしたら説明の中に説明が再登場するのをもって「再帰的に」と書くのだと理解するほうがいい。
ナップザック問題をHaskellで解いてみる

[Python ナップザック問題を分枝限定法( branch and bound )で解く](http://qiita.com/shizuma/items/b0752fd4cd39583d7e54)を読んで、問題は理解できたけど、アルゴリズムはさっぱりでした。
でも、Haskellならきっと答えを教えてくれる、とやってみたのでメモ。

```haskell
--問題(元記事より引用)
2*x1 + 3*x2 + 5*x3 + 6*x4 <= 9
xi = 0 or 1 (i = 1, 2, 3, 4)

上記条件の下で
4*x1 + 5*x2 + 12*x3 + 14*x4
を最大にする( x1, x2, x3, x4 )を分枝限定法を用いて求めよ。
```

分枝限定法っていうのは分からなかったので、申し訳ありませんがスルーさせてもらって、

+ 容量条件を満たす個数のリストと、そのときの価値とのタプルのリストを作り、
+ その中から、最大の価値を持つ要素のリストを求める

てな感じで。総当たりです。
リスト内包表記ってのをなるべく使ってみました。

```haskell
maxElem cs c ps = [ x | x <- ys
                    , snd x == (maximum $ map snd ys ) 
                	]
    where
        ys = availables cs c ps

availables cs c ps = [ (xs, sumZipProd xs ps ) |  xs <- ys
                                            , (sumZipProd xs cs ) <= c
                    ]
    where
        ys = [ [y0, y1, y2, y3] | y0 <- zs
                                , y1 <- zs
                                , y2 <- zs
                                , y3 <- zs
            ]
        zs = [0, 1]
        sumZipProd xs ys = sum $ zipWith (*) xs ys

main = print $ maxElem  [2, 3, 5, 6] 9 [4, 5, 12, 14]
```

```haskell
--実行結果
[([0,1,0,1],19)]
```

ベタな感じですが、答えは出ました。


+ リストの扱い方
+ 賢いアルゴリズム


について、もっと良い方法があれば教えていただけると有り難いです。
VisualStudioのコード追加で簡単にテンプレートを作る方法

初めての投稿が、まさかの設定系の記事になるとは思いもしませんでしたけど、地味に困ったので備忘録的に書いておこうとかと思います。

VisualStudio2013/2015で使える設定かと思います。（2012以前は調べてないので分かりません）

.hや.cppを追加する際に、中身が既に書かれているファイルテンプレートの作成方法です。<b>（項目テンプレートではありません）</b>

普段通り追加するヘッダファイルなどが
![新しい項目の追加.jpg](https://qiita-image-store.s3.amazonaws.com/0/17893/911f828b-3885-2b34-6192-551f95bc5c3e.jpeg)

こんな状態でファイル追加できる。
![ファイルテンプレート.jpg](https://qiita-image-store.s3.amazonaws.com/0/17893/d1448038-1617-a06c-2aa8-a827e6843264.jpeg)


設定は非常に簡単。
まず、 <b>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcprojectitems\</b> にアクセス。

ディレクトリ内にある <b>hfile.h</b> と <b>newc++file.cpp</b> がありますね？
この中身を自由に書き換えるだけで、デフォルトで追加するヘッダとC++に、テンプレートを設定することができます。

以上、これだけの記事になります。




...何故、この記事を書いたかというと、自分は以前にこの設定を行って、現在その設定を書き換えたいと思ったときに何処のファイルを編集すればいいか忘れてしまったのです。

そのおかげで、探索時間や調べる時間（意外と記事がなかった...）を消費してしまい、ようやく編集ファイル対象を見つけたので、ここで共有しようと思った所存です。

項目テンプレートの記事はいっぱいあるんですけどね。


一つ注意なのは、あくまで最初の書式だけをテンプレート設定できる方法なので、C++ファイルをBOM付きで～など、ファイル内の文字エンコードなどをデフォルトで変えたい場合は、残念ながら今回の方法では出来ません。

項目テンプレートでググると、書式もエンコードもそのままテンプレートとして保存できる仕組みがあるので、そちらを使うと良いでしょう。
![新しい項目_項目テンプレート.jpg](https://qiita-image-store.s3.amazonaws.com/0/17893/72d3ce40-94ca-3888-53ab-ceac41000480.jpeg)
（↑.cpp.cppとかアホみたいにならないことに注意してください）


折角、初記事も投稿したのでこれからプログラムテクニックで何か思いついたり、あまり共有されていないことがあったら書いていこうかなと思います。

お疲れ様でした。
visual studio code を使ってみて


という名の投稿テスト。Kobitoから投稿したらどんな感じだろうか？というテスト要素を多く含んでおります。

* visual studio code HP : https://www.visualstudio.com/ja-jp/products/code-vs.aspx

## 特徴

* electron製
* 軽い！とは言えないと思うが、surface pro 4 とかそれなりのメモリがあるマシン(8GB位)とかであれば問題なく動作する
* v1.0 からメニューが日本語化されて、非エンジニアな方でも扱いやすくなってる…と思う
* F1からメニューを呼び出してキーボード入力だけで大抵の操作が可能
* gitの基本的な操作(pull push commit add)程度であればvscode内のキーボードショートカットとかで解決する
    * rebase,fetch,merge,cherry pickをかちょっと立て込んでる操作であれば v1.2から導入されたコンソール機能でフォローすればいい、と個人的には考えてます。
    * GIt for windows : https://git-for-windows.github.io/
* 中身がnode.jsで書かれており、node.jsの開発に限ってはデバッグも含め最適みたいですね


## 拡張機能

拡張機能系も徐々にそろってきてはいるが、「これサイコー！！」な拡張機能はまだない感じ。インストールはF1で呼び出して
「ext install [拡張機能名]」
でインストールできるので、楽ちんではあるんですけどね。
ということで、とりあえずはく使っている拡張機能

### Prettify JSON

* https://marketplace.visualstudio.com/items?itemName=mohsen1.prettify-json
* jsonのフォーマットを整えてくれるextension。
* F1でメニュー呼び出して、「JSON」と入力するとこの機能が呼び出せるので実行。(shift+crtl+pでも呼び出せるらしいが、使ってません)
* ただし、「項目が1つのところも3行に分けて整える」とか、融通が利かない為、最初の1回だけ、この拡張機能でフォーマットを整えて使うというパターンが多いですね…
* 最近よくある「JSONで設定書くプロダクト」(hashicorp の packerとかAWSのcloudformationやcli用のjson設定とか)で、利用させてもらっています。

### Cloudformation

* https://marketplace.visualstudio.com/items?itemName=aws-scripting-guy.cform
* Cloudformation用のテンプレート補佐をしてくれるExtension。
* cloudformation用に役立つはず…と思ってはいるが、常識実感がわかないですね…エラーをフォローしてくれるわけでもないので。


## 個人的な感想

* macな方はvisual studio codeに魅力を感じるか？と考えてみると、「やっぱりatomとかsublime text 3とかにしておけば？」というのが正直な感想です。
* とはいえ、仕事でこれを使っているのは事実だったりするんですが、使い続けている理由は「windowsを開発しているMSが開発しているので、windowsとの相性を一番に考えるだろう」という期待がかなり込められています。まぁ、atomやsublime textをwindowsで動かすと重くて使えないレベル、というのもあるけどね。
    * kobitoは軽めなんだけど、いつまでver 1.5.0 で止めるつもりだ！
* アップデートもwindows上でやる分にはwindowsの流儀にのっとってやるので、結構楽ちんだったりします。

* V1.2 辺りからコンソール機能も加わって、かなり使いやすくなった感じはあります。(ただコンソール機能に日本語表示関連のバグがあったりしますが)、win10 anniversary updateのbashなんかと連携出来たら、かなりいい感じになるのではないでしょうか。(bash.exeが指定出来たら、理論上は実現可能な筈です)

* 情報関連ですが、有益なレベルとなると、実際の所、TIPS系はMS系のエバンジェリストの方のブログから入手することが殆どです。

* 個人的には vscode だけだとすべてのフォローができないので、下記環境も併せて整えておくことをお勧めします。今度手順がまとめられたら上げておきますか…
    * git 操作をPowershellで実行する環境 : 
        * Posh-gitの導入 :https://github.com/dahlbyk/posh-git 
            * 導入だけだとプロンプトがつらいので、プロンプトの改造が必要
    * powershell 上 で 日本語が扱える cui-vim環境を整える
        * これを済ませておくと、gitの commit message に使われるvimに日本語入力がスムーズになるのでお勧めします。
        * windowsで日本語vimとなると、kaoriaさん以外知らなかったりはする…まぁ、機能的には満足しているので、導入部分が楽になると人に勧められるレベルなんですがね。
            * Vim — KaoriYa http://www.kaoriya.net/software/vim/
[デザインパターン] Object pooling

#はじめに: Object poolingって何？

Object pooling の目的は複数のオブジェクトを作成と破壊することを防ぐ
作成したオブジェクトを削除しないで、再利用します。
#なぜObject pollingにしますか
Objectを作成することと削除することはつまりメモリを割り当てること（allocate memory）とメモリを割り当て取り消すことだ（deallocate memory）。
このような動作を複数実行したら、パフォーマンスは遅くになります。
削除するかわりに、再利用します。
#Object pollingを実装
##デザインパターン
1. ローディングステートにいくつかObjectをリストで作成する
2. Objectを使いたいときに、新しいObjectを作らないで、作成したリストからObjectを取得する
3. Objectを使わない（Disable）ときに、Objectを削除しないで、Disableステートをアサインして、リストにプッシュする。
4. リストが空でしたばあいは、新しいObjectを作成して、リストにプッシュする。
![poolinh.png](https://qiita-image-store.s3.amazonaws.com/0/121276/b7e71810-a855-a57f-c000-3615eb7d6159.png)

##実装

```csharp
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class ObjectPoller : MonoBehaviour {

    //singleton
 //   public static ObjectPoller poller;
    public GameObject pollObject;
    public int polledAmount = 20 ;
    public List<GameObject> pollList;
    public bool isAllowIncrease =true;

    void Awake() {
       // poller = this;
    }
	// Use this for initialization
	void Start () {
        pollList = new List<GameObject>();
        //setting for pollList object
        for (int i = 0; i < polledAmount; i++) {
            GameObject gameObject = (GameObject)Instantiate(pollObject);
            gameObject.SetActive(false);
            pollList.Add(gameObject);
        }
	}

    public GameObject getPollObject() {
        for (int i = 0; i < pollList.Count; i++) {
            if (!pollList[i].activeInHierarchy) {
                pollList[i].SetActive(true);
                Debug.Log(i);
                return pollList[i];
            }
        }
        if (isAllowIncrease) {
            GameObject gameObject = (GameObject)Instantiate(pollObject);
            pollList.Add(gameObject);
            return gameObject;
        }
        return null;
    }
}
node.jsのプロセス・マネージャー(PM)とデプロイツール


## プロセス・マネージャーの利用

node.jsをインストールした際にバンドルされるnodeコマンドでは、プロセスの監視は行われず、異常終了すると落ちたままになってしまいます。

```
$ node /<path>/app.js 
```

運用環境では、サービスが停止してしまうので、nodeプロセスを監視し、必要であれば再起動する必要があります。
これらの管理を行ってくれるのが、プロセス・マネージャーです。

* プロセスが異常終了した際に再起動する
* リソース利用率などを表示する
* クラスタリングの制御

また、PMによっては、デプロイをサポートしているものもあります。


| 	 | PM | ローリングリスタート | 起動スクリプト | ログローテーション | デプロイツール | リモートデプロイ | クラスタリング |
|:-----------|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|
| [forever](https://github.com/foreverjs/forever) | ○ | × | × | × | × | × | × |
| [PM2](http://pm2.keymetrics.io/) | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
| [StrongLoop ProcessManager](http://strong-pm.io/) | ○ | ○ | ○ | ○ | ○ | ○ | ○ |

* forever
 * PMのみ
 * 起動スクリプトは、[initd-forever](https://www.npmjs.com/package/initd-forever) などで別途用意する必要がある
 * デプロイに関しても、[Capistrano](http://capistranorb.com/)などのツールを利用する必要がある
* PM2
 * PM、リソースモニター、デプロイツールなど一通り揃っている
 * 最近、複数台のサーバーへのデプロイも可能になる
 * [シンボリックリンク](http://pm2.keymetrics.io/docs/tutorials/capistrano-like-deployments)を利用したデプロイも検討中（graceful？ローリング？リスタートを考えると難しそう）
* StrongLoop ProcessManager
 * [LoopBack](http://loopback.io/)フレームワーク用のPM



所感としては、 *forever* だと機能不足。
*StrongLoop ProcessManager* だと、シンプルなserver.jsアプリケーションや、Expressフレームワークを利用したアプリケーションでは、大げさすぎる。
2〜3台のサーバーで運用するのであれば、 *PM2* が程よいのではないかと思います。




## Tips
### 開発環境用PM
* [hotnode](https://www.npmjs.com/package/hotnode)
 * 開発環境用であれば、JSファイルを変更すると自動的にリロードを行ってくれるhotnodeが便利です。
 * ただし、htmlファイルなど、静的なファイルを編集しても、リロードはされません。（監視しているのは、JSファイルだけのよう）
Jenkinsとはなんぞや？


![jenkins (1).png](https://qiita-image-store.s3.amazonaws.com/0/20635/e71dfc3c-f378-db00-3b5a-dc79bdce0c18.png)


## Jenkinsとは？
Javaで書かれたオープンソース継続的インテグレーションツール
（英：Continuous[継続した] Integration[結合]）である。

## 継続的インテグレーションツールとは？
継続的インテグレーションとは、ソフトウェア開発において、ビルドやテストを頻繁に繰り返し行なうことにより問題を早期に発見し、開発の効率化・省力化や納期の短縮を図る手法。 特に、専用のツールを用いてこのプロセスを自動化あるいは半自動化し、効率的に実施する方式。

## 導入する目的は？
開発の効率化・省力化や納期の短縮を図るため。


## 導入〜使ってみる参考サイト
[Jenkins入門【2.0対応】 － オープンソースCIツール](http://www.buildinsider.net/enterprise/jenkins/001)
vue.jsで簡易AND検索フォーム

`filterBy`を使えば、ある程度は良い感じで作れるんですが、AND検索の実装にはカスタムフィルターの実装が必要だったので、メモしておきます。

[demo in jsfiddle](https://jsfiddle.net/akiho/65skn28j/)

```html:html
<div id="app">
  <input type="text" v-model="searchQuery">
  <ul>
    <li v-for="l in filteredView">
      <h2>{{l.id}}</h2>
      <p>{{l.description}}</p>
    </li>
  </ul>
  <div v-show="filteredView.length==0">
    no result
  </div>
</div>
```

```js:js
var app = new Vue ({

	el: '#app',

	data: {
		searchQuery: '',
		list: testData
	},

	computed: {

    filteredView() {
      return this.list.filter( l => {
        return this.searchQuery.toLowerCase()
          .split(/\s+/)
          .map( q => l.id.toLowerCase().indexOf(q) > -1 || l.description.toLowerCase().indexOf(q) > -1 )
          .every( result => result === true )
      })
    }
  }

})
```

## 解説

`.toLowerCase()`で、小文字に揃えて、
`.split(/\s+/)`で、検索文字列を、１つ以上の空白で区切られた配列にして、
`.map( q => l.id.toLowerCase().indexOf(q) > -1 || l.description.toLowerCase().indexOf(q) > -1 )`で、リストの中の検索をかけたいkeyを指定して全てチェックして、
`.every( result => result === true )`で、全ての検索文字列にhitしたリストだけtrueに。

## 終わり。
ざっとですいません。
取り急ぎメモです。
vagrantをwin10環境でやってみたトラブルシューティング

#下記の記事にしたがいました。

http://qiita.com/TakashiOshikawa/items/d2fb48d59e9e316af9a2
簡潔で一番下にコマンド集もあってとても素敵なサイトです。

#自分の環境
![image](https://qiita-image-store.s3.amazonaws.com/0/131131/7ddcea61-f81c-b2d0-e740-8d38b186b80a.png)

※つい最近win7⇒win10にアップデートしたら起動のたびに再起動させられます。（未解決）

#トラブルシューティング的なTips
##add box 失敗

こんなんでました。後でもう一回やったら普通にできたので通信環境のせいかと推測。

C:\Users\hoge\DevEnv\centos>vagrant box add centos6.5 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'centos6.5' (v0) for provider:
    box: Downloading: https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
    box: Progress: 26% (Rate: 0curl:/s, Estimated time remaining: 0:16:57)
An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again.

SSL read: error:00000000:lib(0):func(0):reason(0), errno 10054

##Virtual box再インストール
dockerのインストール時のチェックボックスつけて一緒にインストールしたVirtualBoxだと
こんなんが出ました。参考サイトを見て最新版を再インストール。

==> default: Setting the name of the VM: centos_default_1466907933145_18778
==> default: Clearing any previously set network interfaces...
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["hostonlyif", "create"]

Stderr: 0%...
Progress state: E_INVALIDARG
VBoxManage.exe: error: Failed to create the host-only adapter
VBoxManage.exe: error: Assertion failed: [!aInterfaceName.isEmpty()] at 'F:\tinderbox\win-5.0\src\VBox\Main\src-server\HostNetworkInterfaceImpl.cpp' (74) in long __cdecl HostNetworkInterface::init(class com::Bstr,class com::Bstr,class com::Guid,enum __MIDL___MIDL_itf_VirtualBox_0000_0000_0036).
VBoxManage.exe: error: Please contact the product vendor!
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component HostNetworkInterfaceWrap, interface IHostNetworkInterface
VBoxManage.exe: error: Context: "enum RTEXITCODE __cdecl handleCreate(struct HandlerArg *)" at line 71 of file VBoxManageHostonly.cpp

参考サイト：
http://d.hatena.ne.jp/kobarn/20150805
http://qiita.com/ShotaKameyama/items/1f39791092f57c5046bc
ことはじめ

とにかく面倒なことはやりたくないのに、ソフトウェアエンジニアって
基本的にそうできるものかと思ってたのに、やることは車輪の再開発ばかりに思えるのでどこかへ行ってしまいたい。

最近色んな便利ツールができてきて素晴らしい。
全部自動化したい。仕事したくないという理由でグロースハックに
取り組もうと思う。何か矛盾を感じるけれども。
記事をプアな英語で書いたら嫌がられるのだろうけどそのうちそうしたい。
sublime textで打ち間違い矯正ギブス

# こういうコードを書いてしまうのです

railsのコードを書くときに、こういう打ち間違いをしてしまうことがあります

```
# bin/rails destory model hoge
Error: Command 'destory' not recognized
```

この例はすぐ気づくし、'rails d model...'と省略形を使えばいいのであんま困らないのですが、こっちの例が最悪でした。

![untitled_—_dengen_map.png](https://qiita-image-store.s3.amazonaws.com/0/30743/39ac5d7b-2e20-3413-687f-a56c11e29d6b.png)

successじゃなくてsuCess、destroyじゃなくてdeSTORYになっていますが、この位置で誤記してしまうと、発見の難しい謎の挙動になって余計な時間を消費してしまいます。

過去何回かこのミスをやらかしていて我慢できなくなったので、エンジニアらしく対処することにしました。


# TrailingSpaces

 [TrailingSpaces](https://github.com/SublimeText/TrailingSpaces)は文末の余計なスペースを通知するためのプラグインです。
文末スペースは [RuboCop](https://github.com/pderichs/sublime_rubocop) が指摘してくれるので、本来の用途では人気がないのですが、[全角文字を強調表示](http://www.thinkingsalad.com/technology/sublime-multibyte-highlight)するなど、本来の用途以外で便利に使われるパッケージです。



PackageManagerからインストールして、UserSettingsを開きます。

![it__destroy_a_data__do.png](https://qiita-image-store.s3.amazonaws.com/0/30743/f879e7e2-dd75-faa7-9288-627ca72ebf21.png)
![Trailing_Spaces_and_Package_Settings_and_Preferences_and__and_Menubar.png](https://qiita-image-store.s3.amazonaws.com/0/30743/62ad1e3c-efa6-6a23-2dff-5cca0beac8df.png)

こんな感じで強調表示を設定すれば
```
{
"trailing_spaces_regexp": "　|destory|sucess|"
}
```

![it__destroy_a_data__do_—_dengen_map.png](https://qiita-image-store.s3.amazonaws.com/0/30743/127db6e5-98b4-1a88-53ec-322151d7da61.png)


誤記をした時強調表示されるので、すぐに気づくことができるようになります。
【解決済】全く同じ処理のはずだが、For 文では動作するのにFor Each文では何故か動作しない

VB.NETで構造体の配列を使用しています。配列の各要素のメンバを初期化するコードを書いていたら、For文を使用してループを回した時と、For Each文を使用してループを回した時では結果が変わることに気づきました。「あれ？ループ方法の違いだけで同じ処理を行っているはずなのに何で？？」と思ったのでここに記します。

## 構造体の定義
```vbnet
Public Structure TestStructure

    Dim member As ArrayList

    Public Sub Initialize()
        member = New ArrayList()
        For i As Integer = 0 To 2
            member.Add("hoge")
        Next
    End Sub

End Structure
```
構造体の中身はこんな感じです。

## (1)　For文でループさせる場合
```vbnet
    Private testArrayA(4) As TestStructure

    Private Sub forButton_Click(sender As System.Object, e As System.EventArgs) Handles forButton.Click

        For i As Integer = 0 To testArrayA.Length - 1
            testArrayA(i).Initialize()
        Next

        checkData(testArrayA)
    End Sub
```
For文で構造体のメンバを一つずつ初期化するループはこうです。

## (2)　For Each文でループさせる場合
```vbnet
    Private testArrayB(4) As TestStructure

    Private Sub forNextButton_Click(sender As System.Object, e As System.EventArgs) Handles forNextButton.Click

        For Each test As TestStructure In testArrayB
            test.Initialize()
        Next

        checkData(testArrayB)
    End Sub
```
For Each文で構造体のメンバを一つずつ初期化するループはこうです。

## 構造体に入った値の確認用関数
```vbnet
    Private Sub checkData(target As TestStructure())
        For Each test As TestStructure In target
            With test
                System.Diagnostics.Debug.WriteLine("member(0):{0} member(1):{1} member(2):{2}", .member(0), .member(1), .member(2))
            End With
        Next
    End Sub
```
単純に構造体を一つ一つ取り出してメンバの値を出力するだけです。
では、このcheckData関数を使用して、(1)For文 と(2)For Each文の結果を確認してみるとどうなるでしょう？

## (1)　For 文の結果
![ForForEach160626_01.png](https://qiita-image-store.s3.amazonaws.com/0/81499/f6764a78-b36f-c91c-864a-64889c0e0d8e.png)
ちゃんと構造体の初期化ができているのが分かります。


## (2)　For Each 文の結果
![ForForEach160626_02.PNG](https://qiita-image-store.s3.amazonaws.com/0/81499/73c6bacd-efb4-2c31-c1cd-f4cf64c15a15.png)
あれ？(1)と違ってNullReferenceExceptionが発生してしまいました。
**同じ処理を行ってるはずなのに何で！？！？**

とりあえずFor Eachでは初期化がうまくいかないのでFor文に変更してプログラムは実装できたのですが、なぜこうなるのか分からないので気持ち悪いです。
**誰か原因が分かる人、教えてください。**

ソースが欲しい方は[こちら](https://github.com/nulluo/VBForEachTest.git)からダウンロードできます
alerterはterminal-notifierでは不可能なアクション付き通知を出せるコマンドラインツール

macOSには通知センターがあり、Objective-Cを始めAppleScriptで通知を出すことができます。これらの言語以外で通知を出すとなると、Objective-Cで書かれたコマンドラインツール[terminal-notifier]を経由するようにすることが一般的です。

# terminal-notifierで出来ること・出来ないこと

通知を出すだけであれば、terminal-notifierで十分です。

```bash
terminal-notifier -message "デプロイの準備ができました"
```

<img width="353" alt="terminal-notifier -message デプロイの準備ができました.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/7cd0b36c-9832-79a2-d777-3381cf18b508.png">

URLを開いたり、コマンドを実行することもできます。

```bash
terminal-notifier -message "Googleを開く" -open "https://www.google.com"
terminal-notifier -message "デスクトップを開く" -execute "open ~/Desktop"
```

terminal-notifierでできないことがあるとしたら、通知にアクションをつけることです。例えば、通知に「はい」「いいえ」のボタンをつけることや、返信メッセージを入力できるようにするなどです。

# 通知にアクションを付けられるalerter

[alerter]はterminal-notifierの類似コマンドラインツールで、macOSの通知を送信します。OS X 10.8以降をサポートしています。通知を送信できるだけでなく、通知が閉じられるまでプログラムをブロックし、通知がどのように閉じられたかを標準出力で返す機能があります。

alerterで表示した通知は閉じられるまで表示され続けるという点は、terminal-notifierのデフォルトの挙動と異なります。したがって、通知にアクションを付け、その結果を踏まえてプログラムの処理を行ないたい場合は、alerterを活用すると便利です。

## alerterの特徴

alerterには下記のような特徴があり、細かくオプションで設定することができます。

* 通知にアイコン・タイトル・サブタイトル・画像がセットできる
* 通知の返信ダイアログにユーザが入力した文字列を取得できる
* タイムアウトを設定できる
* 閉じるボタンの文言を変更できる
* アクションボタンの文言を変更できる
* 通知音を設定できる
* 通知イベント(closed, timeout, replied, activatedなど)を文字列もしくはJSON形式で出力する
* SIGINT, SIGTERMで通知を閉じる



## alerterのインストール

alerterのインストールは[GitHubのリリースページ](https://github.com/vjeantet/alerter/releases)からzipファイルをダウンロードし、解凍して出てきた実行ファイル`alerter`を`~/bin`などに配置します。HomeBrewでのインストールはまだできないようです。

## alerterで通知にアクションをつけるサンプル

alerterにはさまざまなオプションがあり、ほぼ全てのオプションを指定したものが次のサンプルになります。

```bash
alerter -title "Jenkins" \
        -subtitle "Success" \
        -message "ビルド #23 が完了しました。" \
        -appIcon "https://qiita-image-store.s3.amazonaws.com/0/889/0b79d39d-0979-abe7-0429-fb0807c6a65a.png" \
        -closeLabel "今すぐデプロイ" \
        -dropdownLabel "オプション" \
        -actions "1時間後,明日,何もしない" \
        -json
```

<img width="341" alt="Screen Shot 2016-06-26 at 14.17.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/a5134db7-cf1d-3ba9-c0b8-078d48f318f4.png">

```json:「今すぐデプロイ」を押したときの出力
{
  "deliveredAt" : "2016-06-26 14:21:47 +0900",
  "activationType" : "closed",
  "activationAt" : "2016-06-26 14:21:50 +0900",
  "activationValue" : "今すぐデプロイ"
}
```

## alerterで通知に返信機能をつけるサンプル

`-reply`オプションを指定すると、通知に対して返信メッセージを入力できるようになります。ただし、`-reply`は`-actions`と組み合わせることはできません。

```bash
alerter -message "Hello!" \
        -reply \
        -json
```

<img width="353" alt="Screen Shot 2016-06-26 at 14.30.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/61bd00f1-9ab3-5356-219f-158c555f6ecb.png">


```json:出力
{
  "deliveredAt" : "2016-06-26 14:30:09 +0900",
  "activationType" : "replied",
  "activationAt" : "2016-06-26 14:30:39 +0900",
  "activationValue" : "Hello!!"
}
```


## おわり

プログラムから通知を上げるには、terminal-notifierで十分なことが多いですが、通知にアクションを持たせたいときはalerterを使ってみると良いかもしれません。



[terminal-notifier]: https://github.com/julienXX/terminal-notifier
[alerter]: https://github.com/vjeantet/alerter
Swift 世代の排他制御

Update: 関連する記事のリンクを追加しました。
> Swift 3 世代の排他制御
> http://qiita.com/codelynx/items/56ce2f91cd3f4f409aeb


今回は Swift で排他制御が必要になった時の TIPS を紹介したいと思います。

[Objective-C時代の古き良き排他制御](#Objective-C時代の古き良き排他制御)
[GCDを使った排他制御](#GCDを使った排他制御)
[NSLock と defer を使った排他制御](#NSLock と defer を使った排他制御)

## Objective-C時代の古き良き排他制御

Objective-C の時代に排他制御のコードを書いた人は `@synchronized` をよく使ったと思います。簡単な構文で手軽に排他制御できていたので重宝していたかと思います。

```.objc
// Objective-C 時代の排他制御

- (NSData *)readDataRange:(NSRange)range
{
	@synchronized(self) {
		// 排他制御したいコード
	}
}

- (void)writeData:(NSData *)data range:(NSRange)range
{
	@synchronized(self) {
		// 排他制御したいコード
	}
}
```

## GCDを使った排他制御

Swift でプログラミングを書き始めてスレッド間で排他制御が必要になると、`@synchronized` を懐かしく思いますが、ない袖は振れません。そこで、GCD の `DISPATCH_QUEUE_SERIAL` を使った排他制御がよく紹介されています。このオプションで作成したキューで実行されるコードは、一つづつ順次実行されるので、複数のスレッド間で排他制御を実現する事ができます。また、`dispatch_async()` ではなく `dispatch_sync()` を使えば、呼び出し側のスレッドはクロージャの実行が完了するまで待たされています。

```.swift
// GCD を使った排他制御

let queue = dispatch_queue_create("com.app.name", DISPATCH_QUEUE_SERIAL)!

dispatch_sync(queue, {
		// 排他制御したいコード
})

dispatch_sync(queue) {
		// 排他制御したいコード
}
```

問題もあります。戻り値があるような関数やメソッドの場合は、GCD のクロージャー（ブロック）内から戻り値を戻す事が出来ないので、以下のような書き方はできません。

```.swift
func readDataRange(range: NSRange) -> NSData? {
	dispatch_sync(queue) {
		let data = // ...
		return data // error
	}
	return nil
}
```

## NSLock と defer を使った排他制御

そこで、Swift 2 から追加された。`defer` と `@synchronized` 以前から存在していた `NSLock` を組み合わせると、意外といい感じで排他制御ができるようになったので紹介したいと思います。

`NSLock` は `@synchronized` が登場する以前から存在していた古典的なセマフォです。排他制御を始めたい時点で `lock()` を呼び出し、排他制御を必要とする処理が終わったところで `unlock()` を呼び出します。

あるスレッドが `lock()` してる間に、別のスレッドが 同`NSLock` を `lock()` しようとすると、そのスレッドはブロックされ待たされる事になります。その間に先のスレッドが `unlock()` を呼べば、待たされていたスレッドのうち一つだけが、ブロック状態を解除され、排他制御を必要とする処理を行う事ができます。

`NSLock`を `lock()` できたスレッドは `unlock()` を必ず呼び出されなくてはなりません。`if` 文や `switch` 文で複雑になった分岐の先に `return` 文がある場合は特に要注意です。一つでも、`unlock()` を忘れて `return` するパターンがあると、開かずの扉ができてしまいます。Objective-C の `@synchronized` を懐かしむのは、スコープを抜けた時に unlock と同等の事をしてくれるので、比較的安心して使う事が出来たからです。

Swift 2.0 では `defer` 文が追加されて、同様の処理が書きやすくなりました。以下の例のように、`NSLock` を `self.lock.lock()` する直後（直前でもいいのですが）に `defer { self.lock.unlock() } ` と書いておけば、どこかで不意に `return` されたとしても、スコープを抜けた時に `unlock()` が呼ばれるので、開かずの扉をうっかり作ってしまうリスクを回避する事ができます。

```.swift
class MyObject {
	let lock = NSLock()
	
	// ...
	
	func readDataRange(range: Range<Int>) -> NSData? {
		self.lock.lock()
		defer { self.lock.unlock() }  // unlock を保証
		
		let data = // 読み込み処理
		return data
	}

	func writeData(data: NSData, range: Range<Int>) {
		self.lock.lock()
		defer { self.lock.unlock() }  // unlock を保証

		// 書き込み処理
	}
}
```

もちろん処理が複雑になると、lock した状態で、さらに別のメソッドを呼び出して、そこで同じ `NSLock` を lock しようとするとデッドロックになったりと、油断は禁物です。

と、ここまで書いてから、そういえば GCD にも `dispatch_semaphore_t` があったなと思いつつもまぁいい事とします。

［環境表示］

```.log
Apple Swift version 2.2 (swiftlang-703.0.18.1 clang-703.0.29)
Xcode 7.3 (7D175)
```
2つのdocker-compose間で疎通させる

合ってるかわからんけど一応できたのでメモ。

## やりたいこと

* ローカルのはなし
* php-fpm / nginx 周りのフロントっぽいあたりがいる docker-compose
* mysql / redis 周りのバックっぽいあたりがいる docker-compose の2つを用意
* それぞれを起動させる
* front から back に接続する

## やったこと

いろいろやったけどとりあえず以下の方法でつながった。何か間違ってる気はする。もっといい方法が知りたい。

```
$ docker network create datastore-network
```

とりあえずこれで適当なネットワーク( driver:bridge, scope:local )を作成する。

それぞれの docker-compose.yml で datastore-network に対して設定する。
※volumesなどの設定は省略してますので、実際は適当に書いてください

```yaml:backend
version: '2'
services:
  database:
    image: mariadb:10
    networks:
      outside:
        aliases:
          - database
networks:
  outside:
    external:
      name: datastore-network
```

```yaml:frontend
version: '2'
services:
  php:
    build: ./php
    external_links:
      - database
    networks:
      - outside
      - frontend-tier

networks:
  frontend-tier:
    driver: bridge
  outside:
    external:
      name: datastore-network
```

こんな感じにして、 front も back も datastore-network につながってる感じになれたので、phpからは `database:3306` に対して接続することができました。

いやぁでもマジこれで合ってるか全然自身ない。何かもっといい感じにexternal_links貼れるんじゃないかなって気がすごいする。けどわかんない。
CodeIgniterのコントローラを通しての画像出力がうまくいかない場合 (FW使う場合ありがちかも)

画像のパスを直接見せたくないとかいう場合にたまにやる

PHPで普通にやるとこんな感じ

```php
public funtion image() {
        header('Content-type: image/jpeg');
        readfile("/path/to/file");
}
```

CodeIgniter 使う場合は、こんな感じだとWebで見つけてやってみるも出ない

```php
public funtion image() {
        $image_file = "/path/to/file";
        $this->output->set_content_type(get_mime_by_extension($image_file));
        $this->output->set_output(file_get_contents($image_file));
}
```

環境によるのかも知れませんが、最初はどっちでやっても
画像が壊れてるとか、文字になって出たりとか散々試行錯誤・・・

ブラウザでHTTPレスポンスヘッダを見ると text/html になってるし・・・
あ、昔、他のPHP FWこれでハマったことを思い出した。

```php
ob_clean();
```

これです。
この関数は、出力バッファの内容を消去します。だそうです。

```php
public funtion image() {
        ob_clean();  // ← 最初にやる
        $image_file = "/path/to/file";
        $this->output->set_content_type(get_mime_by_extension($image_file));
        $this->output->set_output(file_get_contents($image_file));
}
```

これで出ました。

ちなみにCodeIgniterの出力クラスのページには、そうしろという記述は何も無い。
画像のデータ出力する前に何かしら出てるとうまくいかないようです。

フレームワーク使うときにはありがちなのか、そうじゃないのかよくわからないけど
知ってると良いのかもしれない、もしくは常識なのか
intが2のべき乗か求める方法。そしてUnityのバグ

# 2のべき乗をもとめるメソッドの挙動を追ってみよう

次のメソッド`IsPowerOfTwo`は2のべき乗を求めるためのメソッドなのですが、処理をすぐに頭で終えるでしょうか？

```csharp:
bool IsPowerOfTwo(int num)
{
    return (num & (num - 1)) == 0;
}
```

`&`は、bitごとのAnd演算を行う演算子です。32bitの2の補数表現で表した二進数で上記の処理を考えてみましょう。

numが1のとき、

* `00000000000000000000000000000001` <- 1 の4bitの2の補数表現
* `00000000000000000000000000000000` <- 1 - 1 = 0 の32bitの2の補数表現
* 上記二つをビット演算でAndすると結果は`0`
* 結果、IsPowerOfTwoは`true`となる

numが4のとき、

* `00000000000000000000000000000100` <- 4 の4bitの2の補数表現
* `00000000000000000000000000000011` <- 4 - 1 = 3 の32bitの2の補数表現
* 上記二つをビット演算でAndすると結果は`0`
* 結果、IsPowerOfTwoは`true`となる


numが32のとき、

* `00000000000000000000000000100000` <- 32 の4bitの2の補数表現
* `00000000000000000000000000011111` <- 32 - 1 = 31 の32bitの2の補数表現
* 上記二つをビット演算でAndすると結果は`0`
* 結果、IsPowerOfTwoは`true`となる

numが31のとき、

* `00000000000000000000000000011111` <- 31 の4bitの2の補数表現
* `00000000000000000000000000011110` <- 31 - 1 = 30 の32bitの2の補数表現
* 上記二つをビット演算でAndすると結果は`1`
* 結果、IsPowerOfTwoは`false`となる

処理を追うことができたでしょうか？

このようにbitごとのAnd演算を活用して、`IsPowerOfTwo`メソッドはint型の数値が2のべき乗かどうか調べています。

さて、残念ながら`IsPowerOfTwo`では、落とし穴があります。気づきましたか？


# 正しくないIsPowerOfTwo

`IsPowerOfTwo`の落とし穴は、2のべき乗でない`0`と`int.MinValue`でも`true`を返してしまうということです。

0は2のべき乗ではありませんね。

32bitの2の補数表現で、numが`0`の時を考えてみましょう。

numが0のとき、

* `00000000000000000000000000000000` <- 0 の4bitの2の補数表現
* `11111111111111111111111111111111` <- 0 - 1 = -1 の32bitの2の補数表現
* 上記二つをビット演算でAndすると結果は`0`
* 結果、IsPowerOfTwoは`true`となる

このように0は2のべき乗でないのに、`true`を返してしまいます。

同様に、numがint.MinValue(=-2,147,483,648)のときを示します。

* `10000000000000000000000000000000` <- int.MinValue(=-2,147,483,648) の4bitの2の補数表現
* `01111111111111111111111111111111` <- オーバーフローが起きる、int.MinValue(=-2,147,483,648) - 1 = int.MaxValue(=2,147, 483,647) の32bitの2の補数表現
* 上記二つをビット演算でAndすると結果は`0`
* 結果、IsPowerOfTwoは`true`となる

このように2のべき乗を求める計算のつもりだった、次のコードは

```csharp:
bool IsPowerOfTwo(int num)
{
    return (num & (num - 1)) == 0;
}
```

`0`と`int.MinValue`で`true`を返すので、正しいメソッドではありません。

正しくは、次のようにする必要があります。

```csharp:
bool IsPowerOfTwo(int num)
{
    if(num <= 0) {
        return false;
    } else {
        return (num & (num - 1)) == 0;
    }
}
```

# Unityでのバグ


Unityには、[Mathf.IsPowerOfTwo](http://docs.unity3d.com/ja/current/ScriptReference/Mathf.IsPowerOfTwo.html)という引数にとったintが2のべき乗かどうか調べるメソッドがあります。

残念ながらこのメソッドは、2のべき乗でない`0`と`int.MinValue`でも`true`を返してしまいます。
このMathf.IsPowerOfTwoメソッドは外部で実装されていて、IL Viewerでその実装を確認することはできないのですが、本投稿で示した次のような実装がされている可能性があります。
そのため、このような正しくなっていない挙動となっている可能性があります。

```csharp:
bool IsPowerOfTwo(int num)
{
    return (num & (num - 1)) == 0;
}
```

`IsPowerOfTwo`メソッドを使う機会があり、0を引数に渡すことがある場合は、特に注意が必要ですね。

# 参考

* [[WebGL][OpenGL]2の累乗(べき乗)であるかどうかをシンプルなプログラムでチェック](http://d.hatena.ne.jp/nakamura001/20101129/1291047003)
JavaScriptでメモ帳を作る

## 目的
* localStorageを利用し、全体像を理解する

## 結果
![Untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/33543/0942517b-8f57-8aff-a7d1-37c54b878c3c.gif)

## 全体のコード
```js

(() => {

'use strict';

let formArea    = document.getElementById('form-area');
let textArea    = document.getElementById('text-area');
let saveBtn     = document.getElementById('save-button');
let rmvBtn      = document.getElementById('remove-button');
let textData    = textArea.value;
let storageData = localStorage.getItem('data');

window.onload = () => {
  if(!textArea.value) {
    let parseData = JSON.parse(storageData);
    textArea.value = parseData;
  }
}

const saveText = () => {
  event.preventDefault();
  textData = textArea.value;
  return textData;
};

const sendStorage = () => {
  saveText();
  console.log(textData);
  localStorage.setItem('data', JSON.stringify(textData));
};

const removeText = () => {
  textArea.value = '';
  localStorage.removeItem('data', JSON.stringify(textData));
};

saveBtn.addEventListener('click', sendStorage, false);
rmvBtn.addEventListener('click', removeText, false);

})();


```

## 保存する関数について
まずはHTMLのbuttonの機能を停止する必要があります。(仕様上、buttonを押すとブラウザリロードされるため)

```js
event.preventDefault(); // buttonの機能を停止
```

次にtextareaに入力された値を変数に格納し、他の関数で使いまわせるように戻り値にします。

```js
textData = textArea.value;
return textData;
```

localStorageに送る関数を用意し、中で呼び出します。
またlocalSrorageは保存できる値が文字列のみのため、変換する必要があるのでその処理を加えます。

```js
saveText(); // 戻り値を受け取る
console.log(textData); // 受け取れているか確認
localStorage.setItem('data', JSON.stringify(textData)); // 文字列に変換
```

## 保持する関数
localStorage内のデータを受け取り、それをtextAreaの入力欄に出力します。
そうすることでブラウザをリロードしても、値は保持されたまま表示されるようになります。
また、そのまま出力すると文字列データのまま、つまり "" がついたままになるので、
JSON.parseを用いることでオブジェクトに変換することが出来ます。

```js

window.onload = () => {
  if(!textArea.value) {
    let parseData = JSON.parse(storageData);
    textArea.value = parseData;
  }
}

```

## 削除する関数
removeItemでlocalStorage内のデータを削除します。
またボタンが押された時にvalue = ''と空にすることで
入力欄の文字を削除します。

```js

textArea.value = '';
localStorage.removeItem('data', JSON.stringify(textData));

```

## まとめ
localStorageは半永久的にデータを保持することができるので、
これを利用してTODOアプリやログインフォームといった、
データを保持したい状況では有効に利用できます。