OmniAICreator/Qiita-1.07M huggingface dataset:
twigでの定数アクセス方法

twigの定数アクセスの方法メモ

```
<?php

namespace AppBundle\Entity;


/**
 *  Test
 *
 */
class Test
{

    const HOGE = "hogehoge";

}
```
twig側
namespaceでの指定

```
{{ constant('AppBundle\\Entity\\Test::HOGE') }}
```

objectにアクセスの場合は第二引数にobjectを指定

```
{{ constant('HOGE',test) }}
```

参考
http://twig.sensiolabs.org/doc/tests/constant.html
Debian8(Jessie)にgcloudコマンドをインストールする

GoogleCloudSDKをDebian Jessieで使おうとして、普通にやったらちょっとハマったので書いておく。


[公式のドキュメント](https://cloud.google.com/sdk/downloads)を読むと、パッケージをダウンロードして展開してから `install.sh`を叩けばできそうなのだが、その途中で以下のようなエラーが出てしまう。

```
(gcloud.components.update) Failed to fetch component listing from server. Check your network settings and try again.
```

ちょっと調べたけどこれに対応するのは大変そうなので、上記の公式ドキュメントの下の方にある、aptでのインストールを行う。


### 準備

```
sudo apt-get update -y
sudo apt-get install -y apt-transport-https
```


あとはドキュメントの通りだが、`lsb_release`コマンドもデフォルトでは入っていないので、`lsb_release`コマンドは使わない。

### インストール

```
$ export CLOUD_SDK_REPO="cloud-sdk-jessie"
$ echo "deb https://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
$ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
$ sudo apt-get update && sudo apt-get install google-cloud-sdk
```

これで`gcloud`コマンドが使えるようになった。
digdagのtd.last_resultsの保存

以下、digdagのver.は0.8.21

困ったこと
=========

以下のようにtd>を2回呼び出すと、1回めの結果を保存しておいた変数が2回めの実行後に書き換わってしまう

```
!include : config.dig

+td1:
  td>: a.sql
  store_last_results: true
+group: # td結果を保存したいがためだけのグループ
  _export:
    result1: ${td.last_results.result1}
    result2: ${td.last_results.result2}
  +show_results1:
    echo>: result1=${result1}, result2=${result2}
  +td2:
    td>: b.sql
    store_last_results: true
  +show_results2:
    echo>: result1=${result1}, result2=${result2}
    # b.sqlの結果に書き換わってしまう
```

調べてわかったこと
================

以下に理由とworkaroundが書かれていた

* JavaScriptが参照のたびに実行される https://github.com/treasure-data/digdag/issues/351
    * JavaScriptはタスク開始時に実行される(_export時点では実行されない)
    * for_each>で先に実行しておくworkaroundがある
    * 驚かれる挙動だと思うので変えたいかも

解決
====

workaroundを適用すると以下になる

```
!include : config.dig

+td1:
  td>: a.sql
  store_last_results: true
+group: # td結果を保存したいがためだけのグループ
  for_each>:
    result1: ["${td.last_results.result1}"]
    result2: ["${td.last_results.result2}"]
  _do:
    +show_results1:
      echo>: result1=${result1}, result2=${result2}
    +td2:
      td>: b.sql
      store_last_results: true
    +show_results2:
      echo>: result1=${result1}, result2=${result2}
      # a.sqlの結果のまま
```
Slick3野郎の備忘録２

# Slick3野郎の備忘録２

[前回](http://qiita.com/uedashuhei/items/12767ab1ab4c4ba1f3e5)はSlick3の基本的な実装方法を紹介しました
今回は少し踏み込みます

## 解決したいこと

#### その１
アクションの中での条件分岐したい

#### その２
list(Seq)をforでぶん回しつつ
AutoIncrementなPrimarykeyをもつTalbleに一件登録登録しーの
そのreturningIdをつかって関連テーブルも同時に作成・更新しーの

さらには他の更新処理も一気にやるために、あれもこれもアクション合成したい
特にバッチ処理などではそんなクソみたいな場面はよくあると思います

## 方針

Await.result, Await.readyは使わない
全部を1トランザクションでやる
Slick3は一気に10,000件程度生SQLを投げると落ちると言うウワサは気にしない

## コード

```scala

  // サンプル用の変数
  val dummyByte = 1.toByte
  val dummyString = "dummy"
  val dummyByte = 1.toByte

  /**
   * アクション合成中での条件分岐例
   */
  def test(id: Long): DBIO[Unit] = {

    val action = for {

      // SampleTable を探す
      opt <- SampleTable.filter(_.id === row.id).result.headOption 

      // SampleTableがいたら実行する
      _ <- opt.fold[DBIO[Int]](DBIO.successful(1))(x =>

       // SampleTable を 無駄に複製してみる
        SampleTable += x 

      )

      // SampleTableがいたら実行する
      _ <- iPOp.fold[DBIO[Int]](DBIO.successful(1))(x =>

        //SampleTable の deleteFlg を 無駄に更新してみる
        SampleTable.filter(_.id === ip.id).update(ip.copy(deleteFlg = Some(false))))

    } yield ()
    action.transactionally
  }


  /**
   * イテレーションを使ってアクション合成
   */
  def test2(saveList: Seq[Long]) = {

    //　１件を処理する関数を定義
    def nested(saveId: Long) = {
      for {
        newId <- UserAccount returning UserAccount.map(_.id) += makeDummySampleTable1Row(saveId)
        _ <- InfluPassbook += makeDummySampleTable2Row(newId)
      }yield{}
    }

    // 普通にforyieldの結果でDBIO.sequenceを生成するアクションを定義
    val seqActions = DBIO.sequence(
      for(row <- saveList)yield{
        nested(row)
      }
    )

    // 実行
    db.run(seqActions.transactionally)

    // ちみにandThenを用いると　アクション合成 + アクション合成なんてのもサクッとできる
    //dbMain.run((seqActions andThen seqActions).transactionally)
  }

  private def makeSampleTable1(id: Long) = {
    SampleTable1Row(
       name = dummyString
      ,prisonerNumber = id
      ,prisonertype = Some(dummyByte)
      ,deleteFlg = Some(false)
    )
  }

  private def makeSampleTable2(id: Long) = {
    SampleTable2Row(
       makeSampleTable1Id = id
      ,cellType = dummyByte
      ,deleteFlg = Some(false)
    )
  }
```
Elasticsearchのquery周りのメモ

elasticsearchを使った検索でfull text queryの<code>simple_query_string</code>の書き方で検索結果が違ってきたので、メモ

# 環境
- ruby-2.3系
- elasticsearch2.3 (Amazon elasticsearch service)
- gem
    - elasticsearch-rails

# やったこと
検索処理をrubyのgemを使ってやる時、query dslの作成時に以下のように組み立てた。データには

```
let!(:entry1) { create(:entry, name: 'ほげほげ1年11月_テスト', description: 'ほげほ１年１１月_テストです。') }
let!(:entry2) { create(:entry, name: 'ほげほげ２年11月_テスト', description: 'ほげほげ２年１１月_テストです。あれから１年') }
```

といった感じのを作って、

```
simple_query_string:
  { query: "#{@params[:keyword]}",
    fields: ['name', 'description'],
    default_operator: 'and',
  }
```

<code>@params[:keyword]</code>に「ほげほげ1年11月_テスト」で検索した時、entry1だけヒットして欲しいところをentry2もヒットしてしまう。どうも「あれから１年」の1をと「ほげほげ」、「年１１月_テスト」等のため、検索にヒットしてしまうみたい。これだと検索精度が悪いので、[ここ](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html#_simple_query_string_syntax)と参考にして以下のように「""」で囲むようにする

```
simple_query_string:
  { query: "\"#{@params[:keyword]}\"",
    fields: ['name', 'description'],
    default_operator: 'and',
  }
```

これで検索すると「entry１」だけがヒットする
メモ: CentOS6.9 を virtualboxにインストール、日本語環境＋xfce4

## インストール

* centos6.9 x86_64で試した。
* CDからインストール後、rootでログイン。


```diff:/etc/sysconfig/network-scripts/ifcfg-eth0
- ONBOOT=no
+ ONBOOT=yes
```

```rb:xfce4
yum install -y epel-release
yum groupinstall "Japanese Support" Xfce
```

```diff:/etc/inittab
- id:3:initdefault:
+ id:5:initdefault:
```

```rb
# virtualbox guest additions
yum update -y
reboot

yum install -y kernel-devel kernel-headers gcc gcc-c++
mount /dev/cdrom /mnt
cd /mnt
./VBoxLinuxAdditions.run

# 一般ユーザ作成
export UNAME=ユーザ名
useradd $UNAME
gpasswd -a $UNAME wheel
gpasswd -a $UNAME vboxsf
visudo
```

* OS再起動後、仮想マシンのウィンドウサイズに応じて画面解像度が変わることを確認。

## 追加パッケージ

```bash:追加パッケージ
yum install -y \
 screen wget ack tig mutt \
 expect bash-completion w3m nkf \
 vim-enhanced vim-X11 \
 firefox ruby thunderbird \
 httpd \
 logwatch postfix-perl-scripts \
 vino
```

```bash:vino
vino-preferences
/usr/libexec/vino-server
```

## screenshot

```
yum install gnome-utils
gnome-screenshot -i
```

## docker-engine

* 32bitだとインストールできない。
* [Install Docker on CentOS - Docker](https://docs.docker.com/engine/installation/linux/centos/)

```rb
$ cat > docker.repo << EOF
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/6
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
```

```rb
sudo mv docker.repo /etc/yum.repos.d/
```

```rb
sudo yum install docker-engine
```

## Mozc

```bash:mozc(vinelinuxに感謝しつつ実行)
yum install -y protobuf qt qt-x11

export VINE=http://ftp.jaist.ac.jp/pub/Linux/Vine/Vine-6.5/x86_64/Vine/RPMS
yum install -y \
 $VINE/zinnia-0.06-3vl6.x86_64.rpm \
 $VINE/tegaki-zinnia-japanese-0.3-1vl6.noarch.rpm \
 $VINE/mozc-server-1.5.1090.102-1vl6.x86_64.rpm \
 $VINE/mozc-utils-gui-1.5.1090.102-1vl6.x86_64.rpm \
 $VINE/ibus-mozc-1.5.1090.102-1vl6.x86_64.rpm \
 $VINE/mozc-1.5.1090.102-1vl6.x86_64.rpm

ibus-setup
#ibus-daemon -drx
```

![mozc.PNG](https://qiita-image-store.s3.amazonaws.com/0/25728/6fa9880e-abf6-d00b-4c1d-279da2a72f07.png)
RGB画像をグレースケール変換する時の落とし穴

RGB24bitのカラー画像をグレースケール8bitの白黒濃淡画像に変換する場合、
多くの人が何かしらの係数を用いた変換式を利用するでしょう。

	byte value = (byte)(0.299 * R + 0.587 * G + 0.114 * B);
(係数は一例です)

この時、もし元画像自体がもともと8bitグレースケール画像で
たまたまファイル保存する時に(R == G == B)の24bit形式で保存されていたとしたらどうなるでしょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/24213/a26d61fb-6b15-2e74-4a65-f9b3cb246dae.png)

このグレースケール画像のヒストグラムは

![image](https://qiita-image-store.s3.amazonaws.com/0/24213/ed19348d-aa61-6cf2-b299-07cb26410e9a.png)

でしたが、一度RGB24bit形式で保存された後に上記の変換式で再度グレースケール変換されたら以下のようになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/24213/60853e80-3148-88a0-db25-ddc6bcc09002.png)

浮動小数点の演算誤差により画素値によっては元の値に戻らない場合があるため、ヒストグラムが変わってしまうのです！

	if (R == G && G == B)
	{
		return R;
	}
	else
	{
		byte value = (byte)(0.299 * R + 0.587 * G + 0.114 * B);
		return value;
	}

このようにすれば可逆変換ができます。

エンジニア生活四半世紀ですが、世の中には恐ろしい落とし穴があるものだな、と最近気が付きました(笑)。
db:migrateする際に更新されたER図を自動出力する


## やりたきこと
* 現状のModel定義からER図を自動生成する
* db:migrateする際にER図を自動更新する

## 環境
* Ruby: 2.3.1
* Rails: 5.0.0.1

## Modelの定義

サンプルとしてUserがGiftを持つtable構造を定義します。
図にすると下記の通りです。
![erd.png](https://qiita-image-store.s3.amazonaws.com/0/30233/0f2ed9f1-2327-1aeb-64ac-d7674adb23f5.png "erd.png")


```console
$ rails g model gift name:string
$ rails g model user name:string
$ rails g model user_gift user:references gift:references
```

```ruby:app/model/user.rb
class User < ApplicationRecord
  has_many :user_gift
  has_many :gift, through: :user_gift
end
```

```ruby:app/model/gift.rb
class Gift < ApplicationRecord
  has_many :user_gift
  has_many :user, through: :user_gift
end
```

```ruby:app/model/user_gift.rb
class UserGift < ApplicationRecord
  belongs_to :user # 自動生成
  belongs_to :gift # 自動生成
end
```

```console
$ rails db:migrate
```


## rails-erdの導入
[rails-erd](https://github.com/voormedia/rails-erd)はModel定義からER図を生成するためのGemです。

```Gemfile
group :development, :test do
  ...
  
  gem 'rails-erd'
  
  ...
end
```

```console
$ bundle install
```

この状態で、いったんER図を生成してみます。

```console
$ rails erd
```

プロジェクト直下に下図の内容の `erd.pdf` が出力されています🎉

![erd.png](https://qiita-image-store.s3.amazonaws.com/0/30233/001aca35-03b1-ba0b-48db-b24aad4e7eeb.png "erd.png")

## db:migrateの際にER図が更新されるようにする

db:migrateのafterをhookします。

```Rakefile
require_relative 'config/application'
Rails.application.load_tasks

Rake::Task['db:migrate'].enhance do
  Rake::Task['erd'].invoke
end
```

ただ、このままだとhookのタイミングの都合なのか、ActiveRecord::InternalMetadataとActiveRecord::SchemaMigrationも図に追加されてしまうので、excludeします。

```yaml:#{rails_root}/.erdconfig
exclude: 'ActiveRecord::InternalMetadata, ActiveRecord::SchemaMigration'
```

以上で、

```console
$ rails db:migrate
```

を実行したタイミングでER図を自動更新してくれるようになります。

せっかくなので、Itemを追加して試してみました。

```console
$ rails g model item name:string
$ rails g migration AddColumnToGift item:references

...
(省略) モデルの関連付け
...

$ rails db:migrate
```

`erd.pdf` の内容

![erd.png](https://qiita-image-store.s3.amazonaws.com/0/30233/2c021c69-b645-476c-43a3-9f88932a3876.png "erd.png")


ちゃんと自動で更新されています🎉

## 参考
http://qiita.com/kanpou_/items/74eca1846101e6db3387
http://qiita.com/fakestarbaby/items/b505bf4fc4103c998cf2
ディレクトリのpathを文字列として処理する

## 0. やりたいこと

例えば`/fizz/buzz/hip/hop`というpathだったとすると、

```bash
/fizz
/fizz/buzz
/fizz/buzz/hip
/fizz/buzz/hip/hop
```

こういう風にしたい。

要するに

`['a', 'b', 'c', 'd']`という配列を加工して`['a','ab','abc','abcd']`という配列を得たい。


##1. とりあえずできたけど他にもやり方があるような気がする

```rb
target = '/fizz/buzz/hip/hop'
tmparr = target.split("/").delete_if(&:empty?)
dir_array = tmparr.map.with_index { |x,i| (0..i).map {|t| ['/',tmparr[t]].join }.join }
p dir_array
#=> ['/fizz','/fizz/buzz','/fizz/buzz/hip','/fizz/buzz/hip/hop']
```

- `map.with_index`を利用

時間がかかったくせに今作ってるモジュールで結局この処理は使わなかった。備忘のため保存。
GitHubリポジトリにUnity Cloud Buildのビルドステータスバッジを表示するには


## はじめに
Unity Cloud BuildのビルドステータスをGitHubやその他のツールにバッジ表示するためのサービス（無料）を紹介したいと思います。

![Kobito.gjUeHF.png](https://qiita-image-store.s3.amazonaws.com/0/5879/f4264e5a-26d5-fb9d-e5c5-cdaccd9556d7.png "Kobito.gjUeHF.png")


## 前提
* Unity Cloud Buildの基本設定が完了していること
* Unityのバージョンは5.4.2f2で確認


## 手順
Unity Cloud Buildのページにアクセスし、プロジェクトIDを控えておきます。

![Kobito.9oXZDk.png](https://qiita-image-store.s3.amazonaws.com/0/5879/80d3012d-340c-0bd9-b02d-ffa23b291753.png "Kobito.9oXZDk.png")

「Notifications」内の「Add New Webhook」ボタンをクリックし、Webhookを追加します。

![Kobito.nLg4A9.png](https://qiita-image-store.s3.amazonaws.com/0/5879/ed12d826-7517-acbc-af00-f92338083642.png "Kobito.nLg4A9.png")

設定内容は以下の通りです。正しく設定されていることを確認し「Next: Save→」をクリックします。

| オプション | 設定内容 |
|--------------------|--------------------|
| URL | http://unitybuildbadge.azurewebsites.net/api/update |
| Content Type | application/json |
| Events | 全てにチェック |
| SSL Verify | OFF |

![Kobito.wICM1V.png](https://qiita-image-store.s3.amazonaws.com/0/5879/b6e505ff-f1a1-6895-fce0-e0936a6ae668.png "Kobito.wICM1V.png")

GitHubリポジトリのREADME.mdに以下を追記し、Unity Cloud Buildでビルドを開始します。[projectid]は最初の手順で確認したプロジェクトIDを指定します。

```
![Build Status](http://unitybuildbadge.azurewebsites.net/api/status/[projectid])
```

正しく設定されていれば、ビルドステータスを表すバッジが表示されるようになります。

![Kobito.gjUeHF.png](https://qiita-image-store.s3.amazonaws.com/0/5879/f4264e5a-26d5-fb9d-e5c5-cdaccd9556d7.png "Kobito.gjUeHF.png")


## 参考
* [Unity Build Badge Service (GitHub)](https://github.com/aodendaal/unitybuildbadgeservice)
* [Build status Badge Service available (Unityのフォーラム)](https://forum.unity3d.com/threads/build-status-badge-service-available.440326/)
技術英語 > Suffice it to say, I did not find xxx / It's not too much to say that ... / clue / read between the lines

@ Star Trek Voyager > INNOCENCE

調査から戻ったTuvokが

> <font color=red>Suffice it to say</font>, I did not find xxx

http://ejje.weblio.jp/content/Suffice+it+to+say+that
> …と言えば十分だ、(今は)…とだけ言っておこう

<hr>
関連して思い出したのは

It's not too much to say that ...

http://ejje.weblio.jp/content/It+is+not+too+much+to+say+that
> …と言っても差し支えない、…と言ってもよい、…といっても過言でない、…といっても言い過ぎではない

<hr>
言葉数の少ない仲間から情報を引き出すことに関連して

> clue 
http://ejje.weblio.jp/content/clue
> 手がかり、糸口

以下はいい時もあれば余計な時もあるかも

> read between the lines
http://eow.alc.co.jp/search?q=read%20between%20the%20lines
> 1. 行間を読む、言外の意味を読み取る、〔発言などの〕真意を理解する
Ubuntu 16.04 LTS、pyenvでanacondaのバージョン切換えする環境構築の初心者備忘録

後で忘れても良いように、pyenv の環境構築をメモっておくことにしました。

# 環境
・ Ubuntu 16.04

# pyenv インストール作業

参考URLに従って、以下を実施しました。

```
$ sudo apt install git
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
$ git clone https://github.com/yyuu/pyenv-pip-rehash.git ~/.pyenv/plugins/pyenv-pip-rehash

【~/.bashrc に追記】
　export PYENV_ROOT=$HOME/.pyenv
　export PATH=$PYENV_ROOT/bin:$PATH
　eval "$(pyenv init -)"
```

# pyenv から anaconda をインストール

```
$ pyenv install --list | grep anaconda
```
で、anaconda のバージョンを確認。バージョンが更新されてなかった時は、
下記を実行してローカルのリポジトリへ変更を反映した。

```
$ cd $(pyenv root)
$ git pull
```

バージョン確認後、下記のようにインストール実施。

```
$ pyenv install anaconda2-4.1.1
$ pyenv install anaconda3-4.1.1
```


# pyenv でバージョン切換え

```
$ pyenv global anaconda2-4.1.1
$ python --version
  Python 2.7.12 :: Anaconda 4.1.1 (64-bit)
$ pyenv global anaconda3-4.1.1
$ python --version
  pyenv global anaconda3-4.1.1
```
となり、切り換わっているっぽい。

# pyenv バージョン確認

```
$ pyenv versions
  system
  anaconda2-4.1.1
* anaconda3-4.1.1 (set by /home/hogehoge/.pyenv/version)
```
で、やっぱり切り換わっているっぽいことが確認できた。

# pyenv 自身のバージョンアップ作業

```
$ git clone git://github.com/yyuu/pyenv-update.git ~/.pyenv/plugins/pyenv-update
$ pyenv update
```

# 参考にさせて頂いたURL

http://keisanbutsuriya.hateblo.jp/entry/2015/03/21/183323

・ pyenv-pip-rehash プラグインのインストール

http://qiita.com/Kodaira_/items/feadfef9add468e3a85b

・ git clone の実行。

http://qiita.com/MasayaHayashi724/items/5096bf19fca347b4e56a

・ pyenv versions の実行。

http://qiita.com/SUZUKI_Masaya/items/7ba3fef9eb7c9603762a

・ anyenv 使ったほうが良かったのかな。。。
pathogen.vim をインストールする方法

pathogen.vim をインストールする方法をメモっとく。

Vim のプラグイン管理にはシンプルな pathogen.vim がいい。

# pathogen.vim のインストール

`pathogen.vim` ファイルを `~/.vim/autoload` ディレクトリに保存して、`execute pathogen#infect()` を `~/.vimrc` に追記するだけでインストール完了。

```shell-session
$ curl --create-dirs -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
$ echo 'execute pathogen#infect()' >> ~/.vimrc
```

# プラグインのインストール

プラグインは各プラグインのリポジトリから `~/.vim/bundle` ディレクトリにクローンしてくるだけでインストールできる。ここでは例として ctrlp.vim をインストールしてみる。

```shell-session
$ git clone https://github.com/ctrlpvim/ctrlp.vim.git ~/.vim/bundle/ctrlp.vim
```

# プラグインのアップデート

プラグインはリポジトリをクローンしてインストールしているので、プラグインのディレクトリ（ローカルリポジトリ）で `git pull` を実行するだけでアップデートできる。

```shell-session
$ cd ~/.vim/bundle/ctrlp.vim
$ git pull
```

---

この記事では pathogen.vim をインストールする方法について説明した。Vim 8.0 がリリースされてパッケージの仕組みが追加されたので、pathogen.vim は今後不要になっていきそうだね。
iPhoneのLEDライトをLピカさせよう！

## はじめに

**Lピカ** というように名前をしているのは、
**Lチカ** はLEDをチカチカ(エリーチカ！！)させるものなのでこういう名前にしました。

## 環境

- Xcode 8.1
- えるたそ (OS X El Capitan 10.11.6)
- iPhoneシステムエンジニア iOS10.1
- Swift 3.0.1

```bash
$ swift --version
Apple Swift version 3.0.1 (swiftlang-800.0.58.6 clang-800.0.42.1)
Target: x86_64-apple-macosx10.9
```

## サンプルコード

ボタンを押したらピカ〜っと光り、もう1回押すと消える

```swift:ViewController.swift
import UIKit
import AVFoundation

class ViewController: UIViewController {

	・・・
	
	@IBAction func pushFlash(_ sender: Any) {
        
        let avDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
        
        guard let device = avDevice else {
            return
        }
        if device.hasTorch {
            let torchOn = !device.isTorchActive
            do {
                try device.lockForConfiguration()
            } catch {
                return
            }
            device.torchMode = torchOn ? .on : .off
            device.unlockForConfiguration()
        }
    }
    
    ・・・
    
}
```

LEDライトといえど、カメラ的な分類になるのでしょう。
`AVFoundation` をインポートしなければならないらしいです。

## さいごに

これで寂しいクリスマスもiPhoneの温かい(ようで冷たい)LEDライトで温まって乗り切りましょう！
ETagヘッダにハッシュ値が付加されるリソースとの同一性確認には If-None-Match を使う。

## はじめに

　以前、[Amazon S3に何かをコピーするときに、すでに同じものをコピー済みかどうかをチェックするシェル関数](http://qiita.com/ykt68/items/2087bad87c81d7866643) という記事を上げましたが、リファクタして以下に行きつきました。

## If-None-Match を使えばスッキリ
　ETagでリソースのハッシュを返してくれるWEBサーバーならば、リクエストに比較対象のハッシュ値を指定した```If-None-Match```ヘッダを付加すると、WEBサーバー側にあるリソースのハッシュと同じであれば、```304 Not Modified```を返してくれる（はず）。これを使います。

```bash
#!/bin/bash
#
# get_status_If_None_Match
# 
# パラメータ：
#                                                                                                                                                                               
# $1: サーバーにあるものと同一かどうかを判定するファイルのパス
#     (例： /var/contents/sports/baseball/20160807-001.mov)
#
# $2: 上記のファイルがサーバーに上がっている場合のURL
#      (例：　http://hoge-journal.s3.amazonaws.com/sports/baseball/20160807-001.mov)
#
function get_status_If_None_Match() {

    curl -s -I -o /dev/null $2 \
        --header "If-None-Match: \"`openssl md5 $1 | awk '{print $2}'`\"" \
        -w '%{http_code}'

}
```

　この関数は、```$1```と```＄２```の状態をWEBサーバが適切に判断して、レスポンスのステータスコードに反映することを前提に、以下の値を出力することを想定しています。

| $1と＄２の状態 | 値 |
|:-----------------------------:|:-:|
|```$2```が示すリソースは```$1```で指定したファイルと同一 |304|
|```$2```が示すリソースは```$1```で指定したファイルと異なる。|200|
|```$2```で指定したリソースは存在しない。(ので使用不可)|404(403)|



## 使用例
[元記事](http://qiita.com/ykt68/items/2087bad87c81d7866643)の例にこの関数を使うとすると

```bash

if [ $((`get_status_If_None_Match ${FILE_PATH} ${S3_URL}`)) -ne 304 ]; then
  aws s3 cp ${FILE_PATH} ${S3_BUCKET_PATH} --acl public-read
fi
```

とすればよい。

## 参考

- wikipedia [HTTP ETag](https://ja.wikipedia.org/wiki/HTTP_ETag)


## 追記

以下の部分は、さらにコードを短くできる。

```bash
openssl md5 $1 | awk '{print $2}'
```

上記は、```md5```コマンドが使えるのなら、これを```-q```(quiet)オプションとともに使って、

```bash
md5 -q $1
```

で代替可能
HSPでマルチプロセス/共有メモリ

素のHSPでマルチスレッドはほぼできないのでexecでマルチプロセスを組み込む。
今回は[こちら](http://www.tvg.ne.jp/menyukko/cauldron/hmmemorymap.html)をお借りして共有メモリで値の取り交わしを行ってみた。
近いうちに面倒臭い部分すべて隠蔽してさらにモジュール化できたら面白そうだけど難しいかなぁ。

```cpp:
#packopt name "MPN"
#runtime "hsp3cl"
#include "MemoryMapModule.as"

*Entry
	//exeファイル位置
	#uselib "kernel32"
	#func GetModuleFileName "GetModuleFileNameA" int,int,int
	sdim fullExePath, 256
	GetModuleFileName,varptr(fullExePath),256
	ExeName=getpath(fullExePath,8)
	deli=", "	//区切り文字
	
	cmd=dir_cmdline
	//サブプロセスの判別
	if 0<=instr(cmd,,"$ProcesS$") {
		//関数の取得
		split cmd,"$PFuncID$",nul,PFuncID,paramStr
		ProcessFuncLoad
		//関数をコールバックで投げ込んで処理を任せる
		subProcess List@ProcessFunc(int(PFuncID))
	}
	else {
		main
	}
end

//プロセスに投げ込む関数
#module ProcessFunc
	#deffunc ProcessFuncLoad
		//ラベルリスト
		List=*delayWait
	return
	//gosubゲッター(引数)
	#define global params(%1=nul,%2=nul,%3=nul,%4=nul,%5=nul) split paramStr@,"$ParamS$",%1,%2,%3,%4,%5
	//gosubセッター(戻り値)
	#deffunc resolve var value
		returnValue@HSProcess=value
	return

*delayWait:params _wait,_PID
		await int(_wait)*10
		resolve _wait
	return
#global

//サブプロセスの処理用モジュール
#module HSProcess
	//共有メモリ作成定義
	count=0
	#define global memInt(%1,%2="") newmod PGate,MemoryMapModule,ExeName@+%2,256: Mmry_DupMemory PGate(count),%1:count++
	#define global memStr(%1,%2="") newmod PGate,MemoryMapModule,ExeName@+%2,256: Mmry_DupMemory PGate(count),%1,2:count++
	//一括プロセス起動
	#define global ProcessRuns(%1,%2) foreach %1: \
		exec ExeName@+" "+"$ProcesS$$PFuncID$"+%2+"$PFuncID$"+int(%1(cnt))+"$ParamS$"+cnt: \
	loop
	//プロセス待ち合わせ
	#define global ProcessAll(%1) repeat: if length(%1)=PCnt {break}: loop
	//String.Join
	#defcfunc joinStr array _array,str _deli
		_str=""
		foreach _array
			if cnt!=0:_str+=_deli
			_str+=_array(cnt)
		loop
	return _str

	//サブプロセス
	#deffunc subProcess var ProcessCall
		memInt PCnt,"PCnt"
		memStr PIDs,"PIDs"
		memStr PResult,"PResult"

		gosub ProcessCall
		Result=returnValue
		params ,PID
	
		if 0<PCnt {
			PResult=PResult+deli@
			PIDs=PIDs+deli@
		}
		PResult=PResult+str(Result)
		PIDs=PIDs+str(PID)
		PCnt++
	return
#global

//メインプロセス
#module Program
	#uselib "msvcrt"
	#func printf "printf" str

	#deffunc main
		printf("【MultiProcessExec】\n> ")
		//input _input,256,1
		_input="500 300 100 15 72 10"
		mes _input
		split _input," ",items
		memInt PCnt,"PCnt"
		memStr PIDs,"PIDs"
		memStr PResult,"PResult"

		ProcessRuns items,0
		ProcessAll items

		split PResult,deli@,sortResult
		mes "done!"
		mes joinStr(sortResult,deli@)

		input exit,,1
	return
#global
```
Automator の AppleScript で「Develop menu to use 'do JavaScript」というエラーが出たときの対処方法


![Kobito.Is68p3.png](https://qiita-image-store.s3.amazonaws.com/0/82372/d561e2fe-3e4d-3301-276d-eba6d42b2747.png "Kobito.Is68p3.png")

safariの「開発」メニューの「AppleEventからのJavaScriptを許可」にチェックが入っているか確認する

![Kobito.R4hb2b.png](https://qiita-image-store.s3.amazonaws.com/0/82372/785190b2-2b74-20fa-5e09-faa3bb643189.png "Kobito.R4hb2b.png")
MilkcocoaでPCからスマホ操作を取得する

## 最初に

簡単にリアルタイムなデータのやり取りを行えるサービス「Milkcocoa」で、PCからスマホ操作を取得するサンプルを作ってみました。

## サンプルの説明

以下のページをそれぞれスマホとPCから開いた状態でスマホをタッチするとPC側のページにポップアップで「Hello World!!」と表示されます。

## スマホ側

スマホ側は、タッチ動作を検知してメッセージをデータストアに送信します。
※ソース中の【app_id】にはMilkcocoaで作ったapp_id、【データストア名】には任意のデータストア名を入れます。

```html:sp.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>スマホ側</title>

  <!-- milkcocoa.jsの読み込み -->
  <script src="https://cdn.mlkcca.com/v2.0.0/milkcocoa.js"></script>
  <script>
    // milkcocoaオブジェクトを作成
    var milkcocoa = new MilkCocoa("【app_id】.mlkcca.com");
    // dataStoreオブジェクトを作成
    var datastore = milkcocoa.dataStore("【データストア名】");
  </script>

  <!-- 動作処理 -->
  <script>
    // タッチ動作を検知したら実行
    document.addEventListener("touchend", function(e) {
      alert("タッチしました")
      // データストアにデータを送信
      datastore.send({"message":"Hello World!!"}, function(err, sent){
        alert("送信完了");
      }, function(err) {
        alert("送信失敗");
      });
    });
  </script>
</head>
<body>
  <h1>スマホ側</h1>
</body>
</html>
```

## PC側

PC側は、データストアにメッセージが受信されたことを検知してそのメッセージをポップアップで表示します。
※【app_id】、【データストア名】にはスマホ側で指定した文字列と同じものを入れます。

```html:pc.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>PC側</title>

  <!-- milkcocoa.jsの読み込み -->
  <script src="https://cdn.mlkcca.com/v2.0.0/milkcocoa.js"></script>
  <script>
    // milkcocoaオブジェクトを作成
    var milkcocoa = new MilkCocoa("【app_id】.mlkcca.com");
    // dataStoreオブジェクトを作成
    var datastore = milkcocoa.dataStore("【データストア名】");
  </script>

  <!-- 動作処理 -->
  <script>
    // データストアへのデータ受信を監視、受信したら実行
    datastore.on("send", function(sent){
      // 受信したメッセージを表示
      alert(sent.value.message);
    });
  </script>
</head>
<body>
  <h1>PC側</h1>
</body>
</html>
```
Windows10起動時のAPC_INDEX_MISMATCHエラーの解消方法

#環境
　・PC　：　Surface Pro 4
　・主なインストール済みアプリケーション　：　Visual Studio 2015 Community

#事象
ウイルスバスタークラウドのインストール後の再起動時に、ブルースクリーンとなってWindows10が立ち上がらなくなる。（セーフモードは可）
エラーメッセージは以下のとおり。

#エラーメッセージ
問題が発生したため、PCを再起動する必要があります。
エラー情報を収集しています。自動的に再起動します。

この問題と可能な解決方法の詳細については、http://windows.com/stopcode を参照してください。
サポート担当者に連絡する場合は、この情報を伝えてください。
停止コード：APC_INDEX_MISMATCH
![IMG_0048.JPG](https://qiita-image-store.s3.amazonaws.com/0/136009/55342738-e4d2-b917-bd3e-1a313ad1feff.jpeg "APC_INDEX_MISMATCHエラー")

#原因
根本的な原因は不明。
ウイルスバスタークラウドが直接的な原因もしくはウイルスバスタークラウドと何らかの相性が悪く、上記現象が発生したのが濃厚？？

#解消方法

1. システムの復元
    ウイルスバスタークラウドをインストールする前にシステムの復元ポイントを作成した場合は、そのポイントまで戻せば元に戻ります。
    但し、ウイルスバスタークラウドを再度インストールし、再起動すればまた発生してしまいます。


1. TrendMicro社のテクニカルサポートに問い合わせする。
    私はこちらの方法で解決しました。
    上記事象について問い合わせしたところ、送付された修正モジュールを適用後、レジストリの変更などを行い、再起動にてブルースクリーンが発生しない状態となりました。

#その後
数日経ちましたが特に問題は発生していません。

#セーフモードでの対応
当エラーが発生した後、セーフモードでWindows10は立ち上がるため、セーフモードの状態でウイルスバスタークラウドのアンインストールを試してみました。
セーフモードの状態ではアンインストールできないとのメッセージが表示され、なぜかアンインストールできないという結果に。
私は諦めてしまいましたが、もし別な方法でアンインストールできるのであればシステムの復元によるリカバリは不要かもしれませんね。

#まとめ
当事象が発生してしまったら、何とかこの記事に辿り着き、問題を解消していただければと思います。
ブルースクリーンは焦りますよね(´･ω･｀)
UbuntuでRaspberry Pi Zero OTG SSH接続

raspberry pi zeroを購入し、以下のページを参考にケーブル1本でsshできるというものをやってみたときに躓いたことをメモ

[Raspberry Pi ZeroをUSBケーブル1本で遊ぶ](http://www.raspi.jp/2016/07/pizero-usb-otg/)

Windowsのノートパソコンを持ち歩いているので、Windowsからとりあえずつなげるようにしてみようということで、とりあえずつなぐことに成功した

しかし、研究室のパソコンでも繋げたいなと思いやってみたが少し問題が。研究室のパソコンはUbuntu16.04で、もちろんAvahi-daemonも動いているのですんなり行くかと思いきやうまく行かず...

いろいろ試したが、結局ネットの設定を変更する必要があったようだ

システム設定→ネットワーク→RPZのネットワークを選択→オプション→IPv4設定→方式(M)をローカルへのリンク専用に変更

たったこれだけとは...
rails: rake taskを使ってアフィリエイトリンク生成

#やりたいこと
取得してきたリンクをアフィリエイトリンクに変える。

#rake taskについて
<a href="http://qiita.com/mosson/items/9a9b0703ac4c76ebfd4e" target="_blank">Rakeタスクをつくる</a>を参考。

#taskとしてではなくmethodつくる
結論から言うと使い勝手の問題。methodを使えば他のmethodやtaskとも合わせて使えることができるから。

#セットアップ
```auto_item_create_module.rb
# app/lib

module AutoItemCreateModule
  def create_affi_link_of(shop_item_link)
    shop_item_link_id = shop_item_link.gsub("http://store.shopping.yahoo.co.jp/", "").gsub("/", "%2F")
    affi_url = "http://ck.jp.ap.valuecommerce.com/servlet/referral?sid=3285280&pid=884218179&vc_url=http%3A%2F%2Fstore.shopping.yahoo.co.jp%2F#{shop_item_link_id}"
    # ShopItem.update(url: affi_url)
    p affi_url
  end
end
```

```item.rake
# lib/tasks

require 'auto_item_create_module.rb'

Module.new do
  extend Rake::DSL
  extend self
  extend AutoItemCreateModule

  namespace :item do
    desc "test link affiliation task"
    task :test_affiliate_link => :environment do
      shop_item_links = [
        "http://store.shopping.yahoo.co.jp/ishibashi/80-313326490-3892.html", 
        "http://store.shopping.yahoo.co.jp/ishibashi/80-313326490-3894.html", 
        "http://store.shopping.yahoo.co.jp/ishibashi/80-313362200-0011.html"
      ]
      shop_item_links.each do |link|
        create_affi_link_of(link)
      end
    end
  end
end
```
【すぐできる】プルリクやコメントなどで画像を使うとき、読みやすくするちょっとしたアイデア

# はじめに
本日もプルリクエストお疲れさまです！
私もプルリクやらレビューやらコメントやら何やら、日常的に書いております。

またその中でイメージを伝えるためにスクリーンショットなど画像を埋め込む、という作業もよくされているかと思います。そこで今回は、見せ方を考えるだけで読みやすくなるかも！っと個人的に思ったことをまとめてみました。何かの参考にでもなれば幸いです。


# 画像にキャプションをつける
その画像が何を表しているのか。複数の画像があるときは特に効果的です。
が、容易に推測できる場合でも、明記した方が読みやすくなります。

## キャプションなし

![1.png](https://qiita-image-store.s3.amazonaws.com/0/58436/930287e9-34ab-ab56-ac32-a3c04c9a89d9.png)

## キャプションあり

`ドロップダウンのイメージ `
![1.png](https://qiita-image-store.s3.amazonaws.com/0/58436/930287e9-34ab-ab56-ac32-a3c04c9a89d9.png)


# キャプションには方向を表すマークをつける▼▲
この画像がどのキャプションかが明確に分かるように、▼や↓のように方向マークをつけるとさらに分かりやすくなります。一瞬でも迷うのは意外とストレスです。

## 方向マークなし
`ドロップダウンのイメージ `
![1.png](https://qiita-image-store.s3.amazonaws.com/0/58436/930287e9-34ab-ab56-ac32-a3c04c9a89d9.png)

## 方向マークあり
`▼ ドロップダウンのイメージ`
![1.png](https://qiita-image-store.s3.amazonaws.com/0/58436/930287e9-34ab-ab56-ac32-a3c04c9a89d9.png)

> キャプションを画像の上と下どちらにつけるかは、悩ましいかもしれません（詳しくは下記ページを参照）。
> [図のキャプションは下に、表のキャプションは上に書くのが原則。JISもある] (http://web-tan.forum.impressrd.jp/e/2015/10/27/21369)

# 画像に枠線をつける
テキストが多く含まれていたり、背景が白色だったり、ピンポイントにトリミングしたり...どこまでが画像かパッと見て分からなくなることがあります。その場合は枠線などで画像エリアを視覚的に表現すると親切です。

## どこまで画像なのか...
Aさん: 内容の確認をお願いします！

`▼ フォームのモックイメージ`
![a.png](https://qiita-image-store.s3.amazonaws.com/0/58436/76879c9b-f7ff-7d8b-c53a-2d79339f055f.png)


## 画像に枠をつけるだけで
Aさん: 内容の確認をお願いします！

`▼ フォームのモックイメージ`
![b.png](https://qiita-image-store.s3.amazonaws.com/0/58436/e52084e2-3c11-a78a-d139-e5d198c57087.png)


## どうやって枠をつける？
では枠線はどうやってつけるのが楽でしょうか。

1. `<style>` を使う（使えれば）
2. キャプチャするときに枠線を作る
3. 画像を加工する
4. マークダウンで無理やり再現する

1がベストですが、できないことも多いです。
2, 3はやや手間が掛かりますし、gifアニメなどは難しいです。
4は例えばtableの中に入れると再現できます（qiita, githubの場合）

| ![cap.gif](https://qiita-image-store.s3.amazonaws.com/0/58436/0e5d7a2a-c20c-b78f-1ffc-0f51bf0b084c.gif) |
|:---|
| ▲ フォームのモックイメージ |

```text.md
| 画像 |
|:---|
| ▲ フォームのモックイメージ |
```
```当然こんな感じのタグで出力されてしまいますが...html
<table>
  <thead>
    <tr>
      <th style="text-align: left">
        <a href="xxx.gif"><img src="xxx.gif"></a>
      </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">▲ フォームのモックイメージ</td>
    </tr>
  </tbody>
</table>
```

※ちなみにこれがベタ貼りだと
![cap.gif](https://qiita-image-store.s3.amazonaws.com/0/58436/0e5d7a2a-c20c-b78f-1ffc-0f51bf0b084c.gif)


# 比較できるものは並べる
**before/after** のように、それぞれ比較すると分かりやすくなるものは変更前のキャプチャも貼って、左右に並べると分かりやすいです。

`▼ 行の余白を少し広くしたイメージ`

| before | after |
|:---|:---|
| ![a.png](https://qiita-image-store.s3.amazonaws.com/0/58436/76879c9b-f7ff-7d8b-c53a-2d79339f055f.png) | ![c.png](https://qiita-image-store.s3.amazonaws.com/0/58436/6e79c5ec-51d4-1104-c1b1-982bf88c868c.png) |

> ただ画像が大きくて縮小されて見にくくなったり、逆に縦並びの方が良いこともあるので、ケースバイケースですね

# おわりに
以上、単純なものばかりですが、本文の分量が増えてくると意外と効いてくるかと思います。
他にもこんな工夫しているよ！とかあれば、ぜひ教えてください！
passPerPresetでbabel-runtimeがimport構文をお漏らしするバグに対処する覚え書き


下記のissueで上げられているバグで色々ハマった。
https://github.com/babel/babel/issues/2877

理由や内部構造までは深追いする気力が無かったが、解決がちょっと苦労したのでメモを残す。

# 問題点：`babel-runtime`と、`export * from 'xxx'`という構文を組み合わせた場合にうまくいかない

下記のようなコードとbabelrc設定で、importが露出するバグに見舞われた

**コード**

```index.js
export * from './hoge'
```
```hoge.js
export class hoge {
  state = { a: "b" }
}
```

**babelrc**

```js
{
  "comments": false,
  "plugins": [
    "transform-runtime",
    "transform-class-properties",
  ],
  "presets": [
    ["es2015", {"loose": true} ],
    "stage-3",
    "react"
  ]
}
```

**出力結果**

```js
 :
/* 0 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';

	import _Object$defineProperty from 'babel-runtime/core-js/object/define-property';
	import _Object$keys from 'babel-runtime/core-js/object/keys';
	exports.__esModule = true;

	var _hoge = __webpack_require__(1);

	_Object$keys(_hoge).forEach(function (key) {
  :
```

こんな感じでimportがおもらしされる。

# 解決方法：passPerPresetを多重化させて使う

色々試して、最終的にうまく行った設定が下記

```js
{
  "comments": false,
  "passPerPreset": true,
  "presets": [
    { "plugins": [ "transform-runtime"] },
    {
      "passPerPreset": false,
      "presets": [
        ["es2015", { "loose": true}],
        "stage-3",
        "react",
        { "plugins": [ "transform-class-properties" ] }, 
      ]
    }
  ]
}
```
* issue途中の[コメント](https://github.com/babel/babel/issues/2877#issuecomment-245402025)に書いてあったものでうまく行った
* passPerPresetを多重化させていて結構トリック的。
* `transform-class-properties`を組み合わせていたので更に混乱があったが、presetは逆順適応（[出典](https://babeljs.io/docs/plugins/#plugin-preset-ordering)）と気づいて、`transform-class-properties`を最後に持って行くことでうまくコンパイル出来た。
	* 一番最初に持ってきたりすると、構文エラーになる。


## その他実証メモ
* issueの[途中にあったコメント](https://github.com/babel/babel/issues/2877#issuecomment-245402025)にて、[transform-export-extensions](https://babeljs.io/docs/plugins/transform-export-extensions/)が足りないのでは？というのがあって混乱したが、上記のpluginは、`export * as ns from 'mod';`や`export v from 'mod';`という記法が対象で、`export * from 'xxx'`や`export {hoge} from './hoge'`という記法とは関係無かった（ややこしい）
* `export * from 'xxx'`という記法も、別段必須になるものでもないので、さっくりやめて素直な記法に書き直してしまうというのも一つの解決策
    * とはいえ[redom](https://github.com/pakastin/redom/blob/master/src/index.js)あたりではいい感じに多用されていたりするので、ちょっとそれだと名残惜しいかもしれない

###「エラーにはならないが、babel-runtimeの変換も行われない」というパターン

検証してたら見つけたパターン。
気づけない分、ちょっと注意が必要そう

#### その1. exportを{}にした変えたパターン

こんな感じでのexport利用

```index.js
export {hoge} from './hoge'
```

#### その2. 下記のように、全部一括でpassPerPresetした場合

途中まで「やったー！エラーでなくなったぞ！」とぬか喜びしていたconfig

```js
{
  // エラーにはならないが、babel-runtime変換されないbabelrc
  "comments": false,
  "passPerPreset": true,
  "presets": [
    {
      "plugins": [
        "transform-runtime",
        "transform-class-properties",
      ]
    },
    ["es2015", {"loose": true} ],
    "stage-3",
    "react"
  ]
}
```
extern をC++のライブラリから取り除く

ソースコードの保守性を改善するには、ライブラリの中に不自然な依存性をなくさなくてはならない。
そこで気づいたことをメモする。
たぶん、有名な本の有名な言い回しがあることだろうと思うのだが、とりあえず自分なりの表現で書いてみる。


###**原則:**
ライブラリとして使おうとするモジュールがある。そのモジュールの中に、モジュールの外のスコープの変数に対するexternの記述があってはならない。

externで宣言された変数の存在のために、そのモジュールの単体テストが困難になる。保守性が低下してしまう。だからライブラリとして使おうとする関数の中には、モジュールのスコープの外にある変数に対する参照があってはならない。

###**対策１：クラスのデータメンバーへの変更**
　クラスの中で使われている変数であったら、クラスのデータメンバーとして、その変数を使うように設計変更する。

```
extern std::string hoge;
```

とするよりは、
クラスのメソッドの中で値を設定し、それを参照するようにする。


```
void setHoge(std::string hoge){
    this->hoge=hoge;
}

```

そのようにすれば、クラスを使う側のコードにだけ、当初のhogeだけが記述されるようになる。

そうすることで、設計の不自然さがなくなる。


###**対策２：関数の引数を利用することで、モジュールの外に出す。**

関数の中でhogeというexternで宣言されている変数のはたしている役割を
void func1(double x);
だったものを
void func1(double x, std::string var);
として
func1(x, hoge);
として参照するようにする。

そうすると、モジュールの中のグローバルスコープで
extern std::string hoge;
とする必要はまったくなくなる。



この対策の記述が、あなたの抱えるソースコードの改善に役立つと幸いです。


付記：
 Doxygenを使うと、ヘッダファイルの依存関係をグラフ化できる。
依存性が奇妙な部分があれば、見つけやすい。
pythonで簡単なIRCクライアント

#IRCクライアント
pythonで簡単なIRCクライアントかきました。


```python:irc.py
#!/usr/bin/env python

import sys, socket, os


TARGET = "localhost"
PORT = 6667

BUF_SIZE = 1024


def irc_connect(irc_socket, target, port):
    irc_socket.connect((target, port))


def login(irc_server, nickname, username, realname, hostname = "hostname", servername = "*"):
    nick_message = "NICK " + nickname + "\n"
    user_message = "USER %s %s %s :%s\n" % (username, hostname, servername, realname)


    irc_server.send(nick_message)
    irc_server.send(user_message)


def join(irc_server, channel):
    join_message = "JOIN " + channel + "\n"

    irc_server.send(join_message)


def pong(irc_server, daemon, daemon2 = None):
    pong_message = "PONG %s %s" % (daemon, daemon2)
    pong_message += "\n"

    irc_server.send(pong_message)


def privmsg(irc_server, channel, text):
    privmsg_message = "PRIVMSG %s :%s\n" % (channel, text)

    irc_server.send(privmsg_message)


def quit(irc_server):
    None


def handle_privmsg(prefix, receiver, text):
    print ""
    print prefix + ">" + text
    print ""


def wait_message(irc_server):
    while(True):
        msg_buf = irc_server.recv(BUF_SIZE)
        msg_buf = msg_buf.strip()

        prefix = None
        if msg_buf[0] == ":":
            p = msg_buf.find(" ")
            prefix = msg_buf[1:p]
            msg_buf = msg_buf[(p + 1):]

        p = msg_buf.find(":")
        if p != -1:#has last param which starts with ":"
            last_param = msg_buf[(p + 1):]
            msg_buf = msg_buf[:p]
            msg_buf = msg_buf.strip()

        messages = msg_buf.split()

        command = messages[0]
        params = messages[1:]

        if command == "PING":
            pong(irc_server, params[0])
        elif command == "PRIVMSG":
            text = last_param
            receiver = ""

            for param in params:
                receiver = param


            handle_privmsg(prefix, receiver, text)


def client_interface(irc_server, channel, prompt = ">"):
    while(True):
        print prompt,
        line = raw_input()

        if line == "quit":
            quit(irc_server)
            sys.exit(0)

        privmsg(irc_server, channel, line)


def main():
    nickname = "nickhoge"
    username = "usr"
    realname = "realname"
    channel = "#test_channel"

    irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    irc_connect(irc, TARGET, PORT)

    login(irc, nickname, username, realname)

    join(irc, channel)

    pid = os.fork()

    if(pid == 0):#child
        wait_message(irc)
    else:
        client_interface(irc, channel)


if __name__ == "__main__":
    main()

```

#参考
https://tools.ietf.org/html/rfc1459#section-4.4.1
http://www.codereading.com/codereading/python/python-irc-client.html
素人の言語処理100本ノック:38


[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の挑戦記録です。環境はUbuntu 16.04 LTS ＋ Python 3.5.2 \:\: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧は[こちら](http://qiita.com/segavvy/items/fb50ba8097d59475f760)からどうぞ。

## 第4章: 形態素解析
>夏目漱石の小説『吾輩は猫である』の文章（neko.txt）をMeCabを使って形態素解析し，その結果をneko.txt.mecabというファイルに保存せよ．このファイルを用いて，以下の問に対応するプログラムを実装せよ．
>
>なお，問題37, 38, 39はmatplotlibもしくはGnuplotを用いるとよい．

###38. ヒストグラム
>単語の出現頻度のヒストグラム（横軸に出現頻度，縦軸に出現頻度をとる単語の種類数を棒グラフで表したもの）を描け．

####出来上がったコード：

```python:main.py
# coding: utf-8
import MeCab
from collections import Counter
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

fname = 'neko.txt'
fname_parsed = 'neko.txt.mecab'


def parse_neko():
	'''「吾輩は猫である」を形態素解析
	「吾輩は猫である」(neko.txt)を形態素解析してneko.txt.mecabに保存する
	'''

	with open(fname) as data_file, \
			open(fname_parsed, mode='w') as out_file:

		mecab = MeCab.Tagger()
		out_file.write(mecab.parse(data_file.read()))


def neco_lines():
	'''「吾輩は猫である」の形態素解析結果のジェネレータ
	「吾輩は猫である」の形態素解析結果を順次読み込んで、各形態素を
	・表層形（surface）
	・基本形（base）
	・品詞（pos）
	・品詞細分類1（pos1）
	の4つをキーとする辞書に格納し、1文ずつ、この辞書のリストとして返す

	戻り値：
	1文の各形態素を辞書化したリスト
	'''
	with open(fname_parsed) as file_parsed:

		morphemes = []
		for line in file_parsed:

			# 表層形はtab区切り、それ以外は','区切りでバラす
			cols = line.split('\t')
			if(len(cols) < 2):
				raise StopIteration		# 区切りがなければ終了
			res_cols = cols[1].split(',')

			# 辞書作成、リストに追加
			morpheme = {
				'surface': cols[0],
				'base': res_cols[6],
				'pos': res_cols[0],
				'pos1': res_cols[1]
			}
			morphemes.append(morpheme)

			# 品詞細分類1が'句点'なら文の終わりと判定
			if res_cols[1] == '句点':
				yield morphemes
				morphemes = []


# 形態素解析
parse_neko()

# Counterオブジェクトに単語をセット
word_counter = Counter()
for line in neco_lines():
	word_counter.update([morpheme['surface'] for morpheme in line])

# 全件取得
list_word = word_counter.most_common()

# 出現数のリスト取得
counts = list(zip(*list_word))[1]

# グラフで使うフォント情報(デフォルトのままでは日本語が表示できない)
fp = FontProperties(
	fname='/usr/share/fonts/truetype/takao-gothic/TakaoGothic.ttf'
)

# ヒストグラムのデータ指定
plt.hist(
	counts,				# データのリスト
	bins=20,			# ビンの数
	range=(1, 20))		# 値の範囲

# x軸の値の範囲の調整
plt.xlim(xmin=1, xmax=20)

# グラフのタイトル、ラベル指定
plt.title("38. ヒストグラム", fontproperties=fp)
plt.xlabel('出現頻度', fontproperties=fp)
plt.ylabel('単語の種類数', fontproperties=fp)

# グリッドを表示
plt.grid(axis='y')

# 表示
plt.show()
```

####実行結果：
![Kobito.g7pCrq.png](https://qiita-image-store.s3.amazonaws.com/0/139624/bda15ea2-f6ef-e06f-efc2-13afa2cc42c3.png "Kobito.g7pCrq.png")

###ヒストグラム
`parse_neko()`と`neco_lines()`、および`word_counter`を求める所までは[前問](http://qiita.com/segavvy/items/72863888e51fabd79295)と同じです。

ヒストグラムは、自分で階級ごとに集計したりせずに、値のリストを[`pyplot.hist()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.hist)へ渡すだけで作ってくれます。これは便利！

実際にグラフをいくつか書かせてみましたが、ほとんどの単語が出現頻度は20以下のことがわかりました。そのため、ヒストグラムの階級数は20（`bins=20`）に、また集計する値の範囲も1から20（`range=(1,20)`）にしています。

前問同様、x軸の範囲はデフォルトだと出現頻度0が入ってしまって空白ができるので、`pyplot.xlim()`で調整しました。

　
39本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。
<hr>

*実行結果には、[100本ノックで用いるコーパス・データ](http://www.cl.ecei.tohoku.ac.jp/nlp100/#data)で配布されているデータの一部が含まれます。この第4章で用いているデータは[青空文庫](http://www.aozora.gr.jp)で公開されている夏目漱石の長編小説『吾輩は猫である』が元になっています。*
JavaScriptの関数型言語風のライブラリmonet

undefinedとnullの扱いがめんどくさくてMaybeはできないのかと探したらmonetというライブラリがあった。
FunctionalJavaやScalazを参考に開発しているようでかなり使いやすそう。Maybe・Either・IO・Listなどなどがあるが今回はMaybeさえ使えればよかったのでこだけ紹介する。

インストールはnpmでいつものように。

```
$ npm install --save monet
```

次のような感じで使う。

```js
import monet from 'monet'

const m = monet.Maybe.fromNull(x)
const a = m.map( o => doSomething(o)).orJust(foo)
```

他の言語でMaybeやOptionalを使ったことがあればすぐにわかるだろう。


* https://cwmyers.github.io/monet.js/
巨大csvの整形を高速に行う便利パッケージ: NYSOL(MCMD)

# 大規模データの編集つらすぎ問題
最近仕事で10GB以上のcsvファイルを触っています。
唯一神Excelは100万行を超えるデータは扱えないため、スクリプト言語で適当なコードを書いてましたが、適当に書いたのでちょっとしたデータ整形をするだけでも死ぬほど時間がかかって辛いです。
処理の一部をsedやawkで置き換えて高速化を図るなど、涙ぐましい努力をしていましたが、NYSOL(MCMD)という神ツールの存在を知って膝から崩れ落ちたので共有します。

# NYSOL(MCMD)とは
*以降の記述ではNYSOL(MCMD)をMCMDと表記します*
csvデータの編集、抽出、統計量の算出などを行うコマンド群(70種類ぐらいある)です。
標準入力を受け取って標準出力に結果を表示するので、簡単にパイプで処理を繋げることができます。
さらにC++で書かれているため、とにかく早い(らしい)です。

# インストール
[公式ページのインストール手順](http://www.nysol.jp/install)を参照してください。
macなら.dmgを落としてきて実行するだけです。
windows版はないので、VirtualBox経由で使うのがオフィシャルな方法です。
最近ならwin10のbash on windowsという手もありますね！

# 使用例
data.csvの5行目から10行目までの日付(date)列をoutput.txtへ出力

```
mcut f=date < data.csv | mbest -q from=5 to=10 > output.txt
```

入力と出力はそれぞれi,oオプションで指定することもできます。

```
mcut f=date i=data.csv | mbest -q from=5 to=10 o=output.txt
```

すごい！！便利！！！！

# 逆引きMCMD
よく使いそうなユースケースをまとめてみました。
MCMDは統計量の算出なども含めて様々なコマンドを持っていますが、ここではcsv整形の用途に絞って紹介します。
input/outputオプションは全コマンド共通のため省略するので注意してください。

用途 | コマンド | 参考
---- | ------- | ---
各行を複製(同じ行が連続) | `mduprec n=2` | [mduprec レコードの複写](http://www.nysol.sakura.ne.jp/mcmd2/jp/sect-mduprec.html)
同一ファイルを複製して結合 | `mcat i=[file],[file],...` | [mcat 併合](http://www.nysol.sakura.ne.jp/mcmd2/jp/sect-mcat.html)
ヘッダを削除 | `sed -e '1d' [file]` | [指定行削除するコマンド(sed](http://takuya-1st.hatenablog.jp/entry/2014/08/07/012422)
ヘッダ付きのcsvを結合 | `mcat` | [mcat 併合](http://www.nysol.sakura.ne.jp/mcmd2/jp/sect-mcat.html)
指定した列を削除 | `mcut f=[col_name1], [col_name2] -r` | [mcut 項目の選択](http://www.nysol.sakura.ne.jp/mcmd2/jp/sect-mcut.html)
指定した列を抽出 | `mcut f=[col_name1], [col_name2]` | [mcut 項目の選択](http://www.nysol.sakura.ne.jp/mcmd2/jp/sect-mcut.html)
ヘッダを持たないcsvにヘッダを追加 | `mfldname -nfni n=[col_name1],[col_name2],...` | [mfldname 項目名の変更](http://www.nysol.sakura.ne.jp/mcmd2/jp/sect-mfldname.html)
特定の列名を変更 | `$ mfldname f=[before_col_name]:[after_col_name],...` | [mfldname 項目名の変更](http://www.nysol.sakura.ne.jp/mcmd2/jp/sect-mfldname.html)
指定した値の列を追加 | `msetstr v=[val] a=[new_col_name]` | [msetstr 文字列項目の追加](http://www.nysol.sakura.ne.jp/mcmd/jp/sect-msetstr.html)
指定した範囲の行を抽出 | `mbest -q from=[row_no] to=[row_no] ` | [mbest 指定行の選択](http://www.nysol.sakura.ne.jp/mcmd2/jp/sect-mbest.html)
処理の途中状態をファイルに出力 | `mtee o=[file]` | [mtee 複数ファイルへのコピー](http://www.nysol.sakura.ne.jp/mcmd2/jp/sect-mtee.html)

---
他にも便利な使い方を発見したら随時追加していきます！
Docker vオプションを試してみる

#はじめに
Dockerでコンテナーのファイルとかを
ローカルに保存したいって場面があったので、
vオプションをつかってみる！（初心者です！）
ホストのディレクトリをコンテナにマウントして、
データを共有するらしいが、、、
ちょっと動作確認。

#環境
Dockerはインストール済みということで。
foderaでやってます

cat /etc/redhat-release
->Fedora release 24 (Twenty Four)

#前提
1.ホスト側で使うディレクトリは、Dockerfileが置いているところからみて、もう一つ下の階層にします(testって名前のディレクトリにしようと思ってます。)。この時のホスト側で使うディレクトリのことを、「A」と名付けます！
2.同様にゲスト側で使うディレクトリは、「B」とよぶことにします。

#試すこと

AをBにマウントするので、
run時のAの状態がBの初期状態となっているはず。
そしてその後共有ディレクトリみたいな感じになっているはず
という確認。

```
1.Aにファイルがない状態で、

 1)build時にBにファイルをあらかじめ作る。
   ->あらかじめつくったBのファイルは消えているのか。
 2)Bにファイルを作成する
   ->Aにファイルは共有されているか
 3)Aにファイルを作成する
   ->Bにファイルは共有されているか

2.Aにファイルがある状態で、
  ゲストにディレクトリだけ作って、buildする
   ->Aのファイルが作られているか
```

#やります！
##まずは1のパターン
###Dockerfileの中身

```
FROM centos:7
RUN mkdir /v
RUN echo 'test' > /v/v.txt
```

※起動時に -v を使ってローカル側:コンテナ側の形で指定

```
cd Dockerfile置いているディレクトリ
mkdir test

#lsするとtestディレクトリがある状態で。。かつ、
#ls test しても、何もファイルは存在しない。
 
docker build -t a ./
docker run -it -v Dockerfile置いているディレクトリ/test:/v  --name ab a /bin/bash
```

ここで、

```
cd v
ls 
```

すると、ビルド時に作ったv.txtが消えている。
BはAにマウントされたっぽいので、1-1)は想定どおり。

次に、1-2)を試すために、コンテナ内で続けて

```
touch 12.txt
```
lsして12.txtが存在することを確認した後、exit

そしてhost側のtestの中をみると。。

```
ls test
```

おお、12.txtあるやん。というわけで、1-2)もOK
次にAに13.txtを作って(cd無駄な気もするが、、)

```
cd test
touch 13.txt
cd ..
```

コンテナに入ってvディレクトリの中をみる

```
docker start ab
docker exec -it ab /bin/bash
ls v
```
13.txtあった！というわけで1-3)もおk
exitしましょう

###削除して確認

```
docker rm ab -f
docker rmi a
```

```
docker images
docker ps -a
```
docker周りが、きれいになったところで、
testディレクトリも掃除、、

```
rm test/*
```
と、なんか怒られる。

```
remove write-protected regular empty file 'test/12.txt'? 
```

ls -lすると

```
-rw-r--r--. 1 root root 0 Nov 17 22:39 test/12.txt
```

なんかパーミッションがあれですね。。
ま、とりあえず削除して、2に進みます。

##2のパターン
###まずは、Aにファイル作成

```
touch test/2.txt
```

###Dockerfileの中身

```
FROM centos:7
RUN mkdir /v
```

```
docker build -t a ./
docker run -it -v Dockerfile置いているディレクトリ/test:/v  --name ab a /bin/bash
```

vをみると(ちなみに権限も確認してみる)

```
ls -l v
```

```
-rw-rw-r--. 1 1000 1000 0 Nov 17 13:58 2.txt
```

へ〜1000かと思いながら、
とりあえずAのファイルが入っているので、2もおっけー

#おわりに
-vオプション使うと、AをBにマウントできることが確認できました。
これから使っていこう。。。
てか、マニュアルみた方が早いということですね。。
おわり！

#わからなかったこと
-vオプションでホスト側のをゲスト側にマウントできるなら、
DockerfileでVOLUMEコマンドって使う場面あんの？っておもった。
-vオプションだけでたりるんじゃないのと。。

build時にゲスト側のディレクトリとかをホストに移したりってのは、
-vオプション使うんやったら無理っぽいから他に方法あるんやろな。。

参考
(5分で分かるDockerのキホン)
[http://www.ryuzee.com/contents/blog/6952]
MySQLとMariaDBの生成列対応

MySQLとMariaDBは相前後して生成列（Generated Column）の対応を行いました。

現在の対応状況を試してみました。

MySQL 5.7.12
生成列名 データ型 as ( 関数または計算式 ) [ virtual | stored ]
デフォルトはvirtualで省略できる。

virtualで生成した列（仮想列）に対してもINDEXの作成が可能。

制限事項
仮想インデックスの場合は以下の制限あり

１．主キーはいかなる仮想列も包含できない
２．仮想列と非仮想列の混在に対してはインデックスが生成できない
３．仮想列に空間あるいはフルテキストインデックスは生成できない
　　(この制限事項は今後解消される)
４．仮想インデックスは外部キーとして利用できない

MariaDB 10.2
生成列名 データ型 as ( 関数または計算式 ) [ virtual | stored | persistent ]

storedとpersistentの違いがよく分からない。たぶん同じ？

・仮想列(virtual）についてはindexを作成できない。
・現バージョン（10.2）だと原因は分からないがdate_format関数がエラーになる。文字列にcastしてsubstrをconcatすれば回避は可能。

MySQLの仮想列indexは記憶領域としては索引部分しか必要としない。ある意味関数indexに近い。
ただ、
select * from
とした場合はindexではなくその都度計算を行う模様。

生成列は仮想列でも実データ格納（stored)でもテーブル項目の一部（ただし、更新不可）なので
insert into テーブル名 values ( ... )
とは記述できない。生成列の除く項目リストをテーブル名の後に明示的に記述する必要がある。
insert into テーブル名 (col1,col2,col3,...) values ( ... )
これはMySQLでもMariaDBでも変わらず。

ここのあたりを面倒と考えるか、関数indexとして使え検索負荷の軽減を重視するか（一方で更新負荷も発生するが）というあたりのバランスをどう見るかというあたりかな。

余談
MySQLは次期バージョン8.0で再帰問合せ（共通表式）に対応するとのこと。（再帰を伴わない共通表式には5.6で対応）
MariaDBは10.2で再帰問合せに対応済み。ウインドウ関数にも対応している。一方で仮想列にindex作成できないという弱みもある。

MySQLがウインドウ関数対応を行うかは注目に値する。
以前のオラクル社の姿勢は「WEB向けRDBとして存在価値はある」ということだったと記憶しているが。
あと、ハッシュ結合に対応するかも興味深い。商用向けとは言えMySQL Clusterの位置づけなどをどうするかも含めオラクルとしても判断が難しいところだろう。
MariaDBは競合DBを抱えているわけではないのでその点では自由だ。MariaDBがフォークして、互いに差異をどう作るか問われる状況になってきた印象。
xl2tpdでL2TP接続（IPSecなし）する設定メモ

# 概要
Linux(Ubuntu)でL2TPサーバにL2TP接続する設定のメモ
ほとんど最下部の参考サイトの内容

# 環境
- サーバ
    - SoftEther VPN
- クライアント
    - Ubuntu 14.04
    - xl2tpd 1.3.6

# 設定
## サーバ

- SoftEtherの設定概要
    - 暗号化なしのL2TPサービスの起動
    - 仮想HUBのプロパティからユーザの作成
    - Secure NAT有効化

## クライアント
xl2tpdの設定（各々の詳細な項目の意味は未確認。。）

```xl2tpd.conf
# cat /etc/xl2tpd/xl2tpd.conf
[lac test]
lns = [IP Address]
require authentication = yes
pppoptfile = /etc/ppp/test.options.xl2tpd
require chap= yes
refuse pap = yes
ppp debug = yes
length bit = yes
```

```test.options.xl2tpd
# cat /etc/ppp/test.options.xl2tpd
name kure
noauth
crtscts
mtu 1410
mru 1410
nodefaultroute
lock
proxyarp
logfile /var/log/xl2tpd.conn-1.log
```

```file:chap-secrets
# cat /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
"[username]" * "[password]" *
```


# 動作確認

```
# service xl2tpd start
　★↓接続。このタイミングでPPPインターフェースが出来る
# echo "c test" > /var/run/xl2tpd/l2tp-control
　★↓ルーティング設定。この時点で通信可能
# route add -net 192.168.30.0 netmask 255.255.255.0 dev ppp0
　★↓これで切断
# echo "d test" > /var/run/xl2tpd/l2tp-control
```

# 雑感
L2TPつないだだけではVPNは呼ばないのだろうか

# 参考
[EZ-NET： CentOS 6.0 で L2TP-VPN に接続する](http://network.station.ez-net.jp/client/remote/vpn/l2tp-linux.asp)
HerokuでTempfileを使う

パスの指定と、ディレクトリを作成することがポイント。
まず、Tempfileのデフォルトパスでは作れないのでパスを指定して作ることにする
Herokuでは`tmp`もしくは`logs`にだけ書き込める

```Ruby
temp_file = Tempfile.new(prefix, Rails.root.join('tmp'))
```

さらに`Rails.root.join('tmp')`は自動で作成されないので、チェックしてない場合は作成する必要がある。

```Ruby
temp_dir = Rails.root.join('tmp')
Dir.mkdir(temp_dir) unless Dir.exists?(temp_dir)
```

## 参考
[No such file or directory error with ruby tempfile and heroku cedar | kulehandluke](http://kulehandluke.com/2012/08/no-such-file-or-directory-error-with-ruby-tempfile-and-heroku-cedar/)