OmniAICreator/Qiita-1.07M huggingface dataset:
yarnを使ってみた

# yarnを使ってみた

最近よく耳にする`yarn`とやらを使ってみた、その備忘録として。  

## yarnとは
Facebook,Exponent,Google,Tildeとの共同チームによって生まれた新しいパッケージマネージャ。  
`npm`との互換性があるので、既存の`package.json`はそのまま使える。

### Lockfile
ユーザやデバイス間でのライブラリのバージョン違いを無くす。  
`npm`の`shrinkwrap`に相当する機能。  

## インストール
```
$ npm install -g yarn
```
Macでhomebrewを使っているなら
```
$ brew update
$ brew install yarn
```
で、`.bash_profile`にPATHを通す。
```
export PATH="$HOME/.yarn/bin:$PATH"
```

## コマンド
|npm|yarn|
|:---|:---|
|(N/A)|`yarn install`|
|(N/A)|`yarn install --flat`|
|(N/A)|`yarn install -har`|
|(N/A)|`yarn install -no-lockfile`|
|(N/A)|`yarn install --pure-lockfile`|
|`npm install [package]`|`(N/A)`|
|`npm install --save [package]`|`yarn add [package]`|
|`npm install --save-dev [package]`|`yarn add [package] --dev`|
|(N/A)|`yarn add [package] --peer`|
|`npm install --save-optional [package]`|`yarn add [package] --optional`|
|`npm install --save-exact [package]`|`yarn add [package] --exact`|
|(N/A)|`yarn add [package] --tilde`|
|`npm install --global [package]`|`yarn global add [package]`|
|`npm uninstall [package]`|(N/A)|
|`npm uninstall --save [package]`|`yarn remove [package]`|
|`npm uninstall --save-dev [package]`|`yarn remove [package]`|
|(N/A)|`yarn upgrade [package]`|

optionについてはまだ調べきれていないが、基本的には`yarn add` or `yarn add -D`や`yarn remove`とかを使って行くことになりそう。
TensorFlowでimport Errorが起きる

# はじめに

TensorFlowをimportしようとしたところ、下記のエラーが生じ、import できませんでした。

```
ImportError: dlopen(/Users/xxx/lib/python2.7/site-packages/tensorflow/python/_pywrap_tensorflow.so, 10): no suitable image found. 
Did find:
	/Users/xxx/lib/python2.7/site-packages/tensorflow/python/_pywrap_tensorflow.so: unknown file type, first eight bytes: 0x7F 0x45 0x4C 0x46 0x02 0x01 0x01 0x03
```

# 原因と解決策

対応環境の異なるTensorFlowをインストールしておりました。
(Mac CPUに対して、GPU版をインストール)

TensorFlowを一度アンインストールした上で、再インストールすることで解決しました。

# 参考サイト

こちらを参考にしました。

参考：[Requiring tensorflow with Python 2.7.11 occurs ImportError](http://stackoverflow.com/questions/40034570/requiring-tensorflow-with-python-2-7-11-occurs-importerror)

ありがとうございました。
TD_SESSIONIZEを使うときはサブクエリを使え

Webアクセスログ解析に超絶便利なTreasureDataのHive UDFの`TD_SESSIONZE`ですが、使用する際には以下の前提があるので注意すること。
HiveQLがエラーになるわけではないが、狙ったようにセッションIDが付与されないので誤った集計結果になってしまいます。

* 引数に渡すカラムについて`DISTRIBUTE BY`、 `SORT BY`する**サブクエリの直後に**使用する

# `TD_SESSIONIZE`とは

同一アクセスと判断できるログに一意なセッションIDを付与してくれる関数。

```
string TD_SESSIONIZE(int/long unix_timestamp, int timeout, string sessionize_by)
```

* 第一引数：UNIX時刻
* 第二引数：同一セッションと判断する時間の範囲(単位は秒)
* 第三引数：同一セッションと判断するフィールド

[公式ドキュメント](https://docs.treasuredata.com/articles/udfs#tdsessionize)

## 具体例

サンプルで用意されているsample_datasetsのwww_accessテーブルを使って、
同じホスト（格納されているのはIPアドレス）からの１時間以内のアクセスを同じセッションとみなしたい場合、以下のように使います。

### 正しい使い方
```
SELECT 
  TD_SESSIONIZE(time,3600,host) AS session_id,
  TD_TIME_FORMAT(time,'yyyy-MM-dd HH:mm:ss','JST') AS access_time,
  host,
  path
FROM (
    SELECT 
      time,
      host,
      path
    FROM
      www_access
      DISTRIBUTE BY host
      SORT BY host,time
  ) t
```

結果には以下のようにセッションIDが付与されます。

| session_id | access_time | host | path |
|:-:|:-:|:-:|:-:|
| bb368f01-9198-4718-9df3-51baeff9fce1| 2014-10-04 05:39:00| 100.111.144.44|  /item/computers/4323|
| bb368f01-9198-4718-9df3-51baeff9fce1| 2014-10-04 06:11:08| 100.111.144.44|  /item/software/759|

ここで、重要なのが、
* `TD_SESSIONIZE`の第三引数に使いたいフィールドで`DISTRIBUTE BY`
* `TD_SESSIONIZE`の第三引数、第一引数に使いたいフィールドで`SORT BY`
をサブクエリで実行した後に`TD_SESSIONIZE`を計算させること。
**これは必須条件です。**

### 誤った使い方

以下のように`TD_SESSIONIZE`を`DISTRIBUTE BY`、 `SORT BY`と同じレベルで実行するのはダメです。

```
SELECT 
  TD_SESSIONIZE(
    time,
    3600,
    host
  ) AS session_id,
  TD_TIME_FORMAT(time,
    'yyyy-MM-dd HH:mm:ss',
    'JST') AS access_time,
  host,
  path,
  time
FROM www_access DISTRIBUTE BY host SORT BY host,time
```

HiveQLはエラーを出さずに正常終了するのですが、結果として

| session_id | access_time | host | path |
|:-:|:-:|:-:|:-:|
| 0f760fbe-4e7b-411a-b82d-4e44c0fd8cd8| 2014-10-04 05:39:00| 100.111.144.44|  /item/computers/4323|
| c2700830-f6e7-40af-9c78-4bc72eebba64| 2014-10-04 06:11:08| 100.111.144.44|  /item/software/759|

のように、同じセッションとみなしてほしい（＝同じホストで１時間以内のアクセス）レコードに異なるセッションIDが付与されてしまいます。

## 考察
落ち着いて考えると、それはそうだよなぁという感じ。
`DISTRIBUTE BY`も`SORT BY`もMapReduceにおいてReducerに集めるカラムのキー範囲や順番を制御するものです。
`TD_SESSIONIZE`を実装するなら、事前にセッションを判定するキーが一箇所に集約されていて、しかも時間の順番にソートされている前提で、上から順番にレコードを読んでIDを付与していくのが一番楽です。
なので、一度MapReduceでその条件でレコードをグループ分けかつソートし、２段目のMapReduceのMapperでそれぞれ`TD_SESSIONIZE`してもらうのが自然。

辛いのは、ドキュメントの説明が
>Similiar to TD_X_RANK, you need to ‘CLUSTER BY’ or ‘DISTRIBUTE BY’ the sessionize_by field, and sort by the unix_timestamp field.

となっていて、一見するとこの前提がわかりづらいこと。
`Similar to TD_X_RANK`とあるのでそちらの説明を見ると、
>You need to ‘CLUSTER BY’ or ‘ORDER BY’ within a sub query to use this feature. 

とあるので、霊感で気づくのが要求されます。。。

### 2016/10/17 追記
TreasureDataのサポート経由で報告したところ、すぐにドキュメントを修正してくれました！

>Similiar to TD_X_RANK, you need to CLUSTER BY or DISTRIBUTE BY the sessionize_by field, and SORT BY the unix_timestamp field within a sub query to use this feature. 



# まとめ
超絶便利な関数なので上記の点に気をつけて使いまくりましょう。
.htaccess でForce HTTPS が効かない時 - Apache と環境変数、ヘッダのパースについて

 
よくある記述。

````
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
````

これは実のところ一部サーバ環境で動かない。

`%{}`は環境変数をチェックする記述だが、一部サーバ構成では環境変数`HTTPS`に SSLの情報が入ってこない。

この手のサーバでは大抵ヘッダにhttpsを表すフラグが入ってたりするので、ヘッダを見に行くように設定を直さなければならない。


## Apacheの環境変数とヘッダ

厳密には`%{}`はサーバ変数をチェックするための記述。環境変数やヘッダのチェックには以下の様な記述が必要になる。

- `%{サーバ変数名}` サーバ変数を参照する。
- `%{ENV:環境変数名}` 環境変数を参照する。
- `%{HTTP:ヘッダ名}` HTTPリクエストヘッダを参照する。 

サーバ変数と環境変数の違いは以下を参照

http://software.fujitsu.com/jp/manual/manualfiles/M100003/B1WN9491/07Z201/ihsab/ihs00185.htm

## さくらサーバでのHTTPS強制

````
RewriteEngine On
RewriteCond %{ENV:HTTPS} !^on$
RewriteCond %{HTTP:X-Sakura-Forwarded-For} ^$
RewriteRule ^(.*)$ https://www.sample.com/$1 [R=301,L]
````
http://ja.stackoverflow.com/questions/26736/%E3%81%95%E3%81%8F%E3%82%89%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AEhtaccess%E3%81%A7https%E3%82%92%E6%A4%9C%E7%9F%A5%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF

## Heroku サーバでのHTTPS強制

````
##Force SSL 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
````

http://stackoverflow.com/questions/26489519/how-to-redirect-to-https-with-htaccess-on-heroku-cedar-stack
ruby 百分比语法

https://simpleror.wordpress.com/2009/03/15/q-q-w-w-x-r-s/

http://commandercoriander.net/blog/2014/11/09/a-multiline-string-cheatsheet-for-ruby/

https://github.com/ruby/ruby/blob/trunk/parse.y#L7585-L7635

所有乱七八糟的都在这
[Lazurite 920J #2] Lazurite IDEのインストール

Lazurite 920Jにはマイコンが内蔵されていて、C言語のプログラムを動かすことができます。
エディタ/コンパイラ/書き込みは、ロームから提供されているLazurite IDEというツールで行います。

#Lazurite IDEをダウンロード
ロームの[ダウンロードサイト](http://www.lapis-semi.com/lazurite-jp/download)から、Lazurite IDEをダウンロードします。
**インストーラ**と**Zipファイル版**の2種類ありますが、わたしはインストーラを使いました。

ファイルサイズは約85MB。このテのツールにしては、サイズが小さいです。
![0.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/b02d427f-a915-766c-bae6-70bb263a7abd.png)

がっ！
ダウンロードがメチャクチャ遅い。1~2Mbpsくらい。ダウンロード完了するのに10分くらいかかりました。

#Lazurite IDEをインストール
ロームのドキュメントサイトに、丁寧な[インストール手順](http://www.lapis-semi.com/lazurite-jp/contents/InstallGuide.html)があります。
> ダウンロードの手順も書いてありました。

ダウンロードしたファイルを実行して、**Next**を連打すれば、インストールできます。

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/6f375f44-fb6f-48bf-5a9a-b31fccf387cf.png)
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/255c9905-d983-2b21-86e1-d994e5d9acbf.png)
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/477dab81-e6c9-f59e-362c-95d512de97f5.png)
![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/1de73cd6-334f-85a5-8e16-e00229859ff3.png)

#ディスク使用量
222MBでした。
![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/1d2dc184-c874-65db-92a4-15ed7c4bbbce.png)
ウィキデータの紹介#1

# データ、情報、知識
ウィキデータとは何かを語る前にデータとは何かを考えてみましょう。データとは何なのか、とっさに答えられる人はさほど多くはないでしょう。その定義はJIS規格でいう「情報の表現であって、伝達、解釈または処理に適するように形式化され、再度情報として解釈できるもの」を始めいろいろありますが、ここでは「データとは物事に割り当てられた値」であると表現してみます。

例えば「松戸市の第9-10代市長」という物事は「松本清」という値を、「松戸市の人口」という物事は「485,616」(2016/6/1現在)という値を持っています。これが**データ**です。しかしこのデータは単に事実を表わしているだけで、これだけでは受験生やクイズが大好きという人以外にはあまり興味を惹くものではありません。データは複数の値を集計したり、他との関係性をたどったり比較したりすることができて初めて情報となります。

「松本清」について調べてみると「マツキヨ」の創始者であり、国内自治体で「すぐやる課」を初めて設置した人物であることが分かります。これが**情報**です。さらに「すぐやる課」を調べてその目的や長所短所を理解したとしたらそれは**知識**であり、自分が同じような状況に出会った時にその知識を活かせるかもしれません。

このようにデータをもとに情報、ひいては知識として活かすためにはデータを複数集めて**構造化**することが不可欠です。データを構造化することで、こういったことを人間が目や手でやらなくても、機械が自動的に処理することができます。つまり人力だと途方もなく時間が掛かったり、あるいは気づくことすらできなかったことまで機械が短時間でやってくれる可能性を秘めているということです。

# ウィキデータの概要（さわりだけ）
[ウィキデータ](https://www.wikidata.org/wiki/Wikidata:%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)は、ウィキメディア財団によるプロジェクトです。自由な、共同作業による、多言語の二次情報データベースであり、ウィキペディア、ウィキメディア・コモンズなどのウィキメディアのプロジェクトのためだけでなく、より広範囲に提供するために構造化データを収集しています。（[「ウィキデータ:はじめに」](https://www.wikidata.org/wiki/Wikidata:Introduction/ja)より,CC BY-SA 3.0）

[ウィキデータの紹介#2](http://qiita.com/higa4/items/f6ca788ee2b0d1dfb099)
【PHP覚書】ビルトインウェブサーバー

+ [ビルトインウェブサーバー](http://php.net/manual/ja/features.commandline.webserver.php)はPHP5.4.0から利用可
+ Apacheは入っていなので `.htaccess` などは利用不可

### **PHPのバージョンを確かめる**

```
$ php -v
```

### **現在のディレクトリに存在する、ディレクトリやファイルを表示**

```
$ ls
```

### **現在いるディレクトリまでのパスを表示**

```
$ pwd
```

### **別のディレクトリに移動する**

```
$ cd パス
```

### **ウェブサーバーの起動**

ルートにしたいディレクトリに移動してコマンドを入力すると起動
下記の場合は `http://localhost:8080/` にアクセスすると表示

```
$ php -S localhost:8080
```

### **ウェブサーバーの終了**

`control` + `C`
SwiftStudy DAY1

Swiftの勉強をはじめました。毎週進捗更新していきます。
基本的には自分のふり返り用

[開発環境]
MacbookAir2012Mid
Xcode7.3.1
Swift2

①今週実施した内容
▼参考書は、「詳細！Swift2 iPhoneアプリ開発入門ノート」を利用
・Chapter1　P.14〜
　Xcode（projectの作成・見方、simulator、Playground）
・Chapter2（基本シンタックス）
　出力関数print()、定数letと変数var、演算子（+,-,*,/）、インクリメント++、デクリメント--、論理演算子（&&、||、!）、比較演算子（>、<、>=、<=、==、!=）、代入演算子（=）、複合代入演算子（+=、-=、*=、/=、%=、&&=、||=）、三項演算子（？）、条件分岐（if文、switch文）、繰り返し処理（for文）
　※タプルは触りのみ
・Chapter3（関数、クロージャ）
　関数の定義方法、引数、戻り値の設定について。クロージャはよく分からん。
・Chapter5（配列 Array）
 配列は便利。定義したり、追加したり、削除したり値を取り出した。多次元配列は今回は扱わず。
・Chapter9（列挙型 enum）
　使い所が今のところまだわかっていない・・・


②つまづいた点/自分が課題（苦手）と感じる点
プログラミング字体のスキルはまだまだと感じる。たとえば、複数の条件を満たす結果を出力する際に、if文でネストにせずに、論理演算子をうまく使って書くといったことはまだまだできそうにない。
・クロージャの利用用途（関数との違い。要素がわけられる？）
　→次週以降とのこと
・課題をするにあたり、力技でも解けない問題がいくつかあった。

③ ②を克服するためのアクション
・問題をときまくる。かつ答え合わせのときに、答えがなぜそのようなコードになったかをセットで考える。一度書く。

④Tips
・[xcode] ブレイクポイントの外し方
　ブレイクポイントをエディタの外にドラッグ
・[ショートカット] コメントアウト
　cmd＋/
・[ショートカット] インデントの修正
　ctl+i
・[Code rule] 演算子の前後の空白
　→一方に空白を入れるなら統一する
　　◯ a = 1 + 2
　　☓ a = 1 +2
・[Code rule] _ でループカウンタの省略　単純なループであればこれでOK
・[Code rule]基本的に型を指定する
 let num:Int、 var colors:[String] etc.


⑤気づきなど
・ペース早いので、講義はきちんとついていく。あとから書籍よむ、コード書く等して復習の時間を取るスタイルで。
　→例えば、開始一時間前には近場のカフェでやる
・せっかく集まっているので、終了後一時間とかで（目的を持った）意見交換の場がつくれないか画策する

それではまた来週〜〜
CentOS7.2にPHP7.0.*をインストールする


# PHP5.6のインストール
## Yumのアップデート

```bash
$ sudo yum -y update
```

## 基本パッケージのインストール
```bash
$ sudo yum -y install httpd httpd-devel mysql mysql-devel mysql-server mysql_secure_installation openssl-devel curl-devel git zip unzip
```

## ImageMagic系のインストール
```bash
$ sudo yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm ImageMagick ImageMagick-devel
```

## rpmのインストール
```bash
$ sudo rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/7/x86_64/e/epel-release-7-8.noarch.rpm
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

最新のrepoはここからインストール
http://ftp.iij.ad.jp/pub/linux/fedora/epel/7/x86_64/e/
http://rpms.famillecollet.com/enterprise/

## PHP5.6.*のインストール
```bash
$ sudo yum install -y gcc bison libxml2 libxml2-devel openssl-devel libcurl-devel libjpeg-turbo-devel libpng-devel libmcrypt-devel readline-devel libtidy-devel libxslt-devel
$ sudo yum -y install --enablerepo=remi --enablerepo=remi-php56 php php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd php-phpunit-PHPUnit php-pecl-xdebug php-pecl-xhprof php-pdo
```

## 確認
```bash
$ php -v
```

# Apacheの設定
```bash
$ sudo vi /etc/httpd/conf/httpd.conf
```

以下を追記

```bash
# PHP7をインストールする場合は不要
LoadModule php5_module modules/libphp5.so

<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>
```

# PHP7.0.*をインストール手順
## 先程インストールしたPHP5.6を削除する

```bash
$ sudo yum remove php-*
```

## PHP7.0.*のインストール
```bash
$ sudo yum -y install --enablerepo=remi-php70 php php-mbstring php-pear php-fpm php-mcrypt php-devel php-xml php-pdo
```

## 確認
```bash
$ php -v
```
AzureのサービスでARRを構築する

## はじめに
Webアプリを運用するうえで結構な割合でリバースプロキシが必要になることがあると思います。そこで今回は、Azureのサービスの一つであるApplication GatewayでARRを構築する方法についてのお話です。 

## Application Gatewayについて
Application Gatewayは、マネージドなARRを提供してくれるサービスです。
オンプレミスのARRと比べると細かい部分の設定ができないなどの問題がありますが、URLリライトなどを行うためだけにWindows Serverをわざわざ立てるといったことをするのに比べると込み入ったことをしなければ非常に便利なサービスです。

## Application Gatewayを構築する
早速Application Gatewayを構築していきましょう。
基本的な機能はすべてポータルから構築できるので今回は、ポータルから構築します。

### インスタンスを構築する
とりあえずポータルからインスタンスを立ち上げましょう。
ポータルでApplicationで検索すると下図のようにApplication Gatewayが出てくるので選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/28367/feb0c219-d505-bab0-4357-3ede12dc8e4c.png)
選択すると、いろいろと情報を入れる画面が出るので下図のように適当に入力します。
Tierの部分がStandardとWAFとあります。
WAFを選択すると要するにWAFが入ります。
今回は、Standardを選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/28367/0f076552-e479-39c2-c1ca-04a6453196d3.png)
次にApplication Gatewayの細かい設定です。
VNETの設定とパブリックIPアドレスを作成して設定します。また、リスナー構成でHTTPかHTTPSを選択できます。
HTTPSを選択すると証明書のアップロードが必要なので、選択する場合は、事前に用意しておきましょう。
![image](https://qiita-image-store.s3.amazonaws.com/0/28367/c31c4833-58e0-2902-d792-bd475b023a60.png)
それぞれ設定したらOKを選択して作成します。
Application Gatewayは、立ち上がりに非常に時間がかかるので気長に待ちましょう。
作成が完了すると下記のような奴が出来上がります。
![image](https://qiita-image-store.s3.amazonaws.com/0/28367/9702e066-c7b9-74ac-b0ca-5b9d15ba4e4b.png)

Application Gatewayは、2016年10月16日現在作成時に検索して出てくるアイコンは青色のアイコンですが構築後にリソースグループの一覧などで出てくるアイコンが異なる(構築後は、緑色)ので注意しましょう。

### 入り口の設定をする
Application Gatewayが立ち上がったら、転送の設定を行います。
まずはじめに通信をリッスンする部分(リスナー)を設定します。これは、メニューのリスナーから下図のように設定します。
![image](https://qiita-image-store.s3.amazonaws.com/0/28367/9901c0e5-8de7-8cab-62c9-06852ed84933.png)
今回は、Basicの設定を選択します。
フロントエンドIP構成は、作成時に設定したIPがデフォルトで入ります。
ここで、どのIPのどのポートにどのプロトコルでリッスンするのかを定義します。
今回は、8080番にHTTPで通信を受け付けるようにします。

### バックエンドプールを作成する
次に最終的にルーティングされる先(バックエンドプール)の設定を作成します。
これの設定は、メニューのバックエンドプールから設定します。
下図のような感じで、FQDNかIPアドレスを入力します。
![image](https://qiita-image-store.s3.amazonaws.com/0/28367/8be60b2e-59a4-e99a-39fc-2e75718c013b.png)

これで、フロントエンドで受け付けた通信をリライトしてルーティングするルーティング先が定義されました。
あとは、これと先ほどのリスナーを紐づけます。

### リスナーとバックエンドプールを紐づける
最後に先ほど作成したものを紐づけて実際に転送されるように設定します。
これは、メニューのルールから設定します。
下図のようにリスナーとバックエンドプールとHTTP設定を指定してOKを選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/28367/ff079ee1-61fc-993d-7cb4-91f4442b1180.png)

これで、リスナーで受け付けた通信をバックエンドプールに流す設定が完了しました。
これでIPアドレスとポートの組み合わせでこのApplication Gatewayにアクセスして転送されれば成功です。

### 注意点
Application Gatewayで動いているARRは、ARR側の設定が悪いせいかWeb Appsへの転送がうまくできない問題があります。そのため、Web Appsへの接続は基本的に現状できない前提で考えてください。
また、設定を一か所変更するといったことでもほかのAzureのサービスと比べて更新に時間がかかるため、設定の更新を行う場合は、計画的に行いましょう。


## まとめ
今回は、手軽にARRを構築する方法を紹介しました。URLリライトや、セキュリティ向上のためのWAFなど、わざわざWindows Serverの設定を頑張らなくても行えるのは、非常に便利です。
また、Application GatewayでできないWeb Appsへの転送などを行いたい場合は、Cloud Serviceを使って構築をしたりするといいかと思います。
Artisanコマンドまとめ

# よく利用しそうなもの

## サーバを立ち上げる

``` shell:サーバを立ち上げる
% php artisan serve [--host=ホスト名] [--port=ポート番号]
```

## REPLで起動

``` shell:REPLで起動
% php artisan tinker
```

## 現在の動作環境を表示する

``` shell:現在の動作環境を表示する
% php artisan env
```

## ルート定義の一覧を表示

``` shell:ルート定義の一覧を表示
% php artisan route:list [--name=ルート名] [--path=パス]
```

# 利用頻度が低そうなもの

## コンパイル済みクラスファイルを削除

``` shell:コンパイル済みクラスファイルを削除
% php artisan clear-compiled
```

## 名前空間の変更

appフォルダ以下のPHPファイル名の上位名前空間、設定など必要なファイルが書き換えられる。

``` shell:名前空間の変更
% php artisan app:name 名前空間名
```

# APP_KEYの設定

--show オプションを指定すると、.envは変更せずに表示する。

``` shell:APP_KEYの設定
% php artisan key:generate [--show]
```
複数台のPCでmonodevelopのcodetemplateを共有する

複数のPCでmonodevelop使って作業をしていると
よく使うcodetemplateが設定されていないときがある
逐一設定するのがめんどくさいので設定場所を探してみた

windows8.1環境だと User\ユーザ名\AppData\Roaming\MonoDevelop-Unity-5.0\Snippets
以下に格納されている
Macは
Users/{username}/Library/Monodevelop-Unity-5.0/Snippets

このフォルダをコピペすればいける模様
MeCab(python)によるキーワード抜き出し


ここにExcelファイルがある。
とあるDBから出力されたもので、１行１レコード、一つのフィールドには文章が格納されている。
今回のお題は、このフィールド内の文章からよく使われるキーワードを抜き出して、キーワードごとに出現回数を数え、順位付けを行ってみよう、というもの。

入口と出口はWindowsのExcelファイルで、中間はMacで行う。

# 用意するもの
いつもの自分の環境で行う。

- Mac
- python
- MeCab
- nkf

後々pandasでデータ処理するつもりなので、utf-8にしたり、pandasを使ったりしている。


# 該当のxlsファイルからcsvに出力する
これはExcelのメニューから。
test.xls -> test.csv

# 文字コードをsjisからutf-8に変更する

```bash
$ nkf -g test.csv
Shift_JIS
$ nkf -w test.csv > test_utf8.csv
$ nkf -g test_utf8.csv
UTF-8
```


# pythonでcsvを読み込む

```python
import pandas as pd 

csv_file = 'test.csv'
df = pd.read_csv(csv_file, encoding='utf-8', header=1)
```



# 名詞、動詞ごとに分解してカウントする

## mecabのインストール

```bash
brew search mecab

pip search mecab
pip install mecab-python 
```

...
Successfully installed mecab-python-0.996
と出てOKぽい。
これで、python(2.x系)で使えるようになった。


```python
import MeCab

def count_word(df):
	e = df[u'コメント']
	dic_n = {}
	dic_v = {}
	m = MeCab.Tagger('-Ochasen')	# 出力をChasenモードにする
	
	for s in e:
		if type(s) != unicode:
			continue
		s8 = s.encode('utf-8')
		print s8
		node = m.parseToNode(s8)
		while node:
			word=node.feature.split(',')[0]
			key = node.surface
			if word=='名詞':
				dic = dic_n
				print "<", key, "> (n)"
			elif word=='動詞':
				dic = dic_v
				print "<", key, "> (v)"
			else:
				node = node.next
				continue
			if dic.has_key(key):
				dic[key] += 1
			else:
				dic[key] = 1
			node = node.next
	return dic_n, dic_v
```

# 出現回数に多い順に並べてcsvに書き出す(utf-8)

```python
import csv

def write_to_csv(dic, csv_file):
	f = open(csv_file, 'w')
	writer = csv.writer(f, lineterminator='\n')
	
	# Valueの値でソートする
	for k,v in sorted(dic.items(), key=lambda x:x[1], reverse=True):
		print k, v
		writer.writerow([k, v])
	f.close()

write_to_csv(dic_n, 'test_dic_n_utf8.csv')
write_to_csv(dic_v, 'test_dic_v_utf8.csv')
```


# sjisに変換する

```bash
$ nkf -g test_dic_n_utf8.csv 
UTF-8
$ nkf -s test_dic_n_utf8.csv > test_dic_n_sjis.csv
$ nkf -g test_dic_n_sjis.csv 
Shift_JIS
```

# xls形式に変換する
test_dic_n_sjis.csv をExcelで開いて、xlsで保存する。

おわり。





## 参考サイト
http://qiita.com/tstomoki/items/f17c04bd18699a6465be
http://qiita.com/ysk_1031/items/7f0cfb7e9e4c4b9129c9
http://salinger.github.io/blog/2013/01/17/1/ [^1]


[^1]: このサイトに注意点があったのでメモ。 ```MeCabでUnicode文字列を扱う場合は、一度エンコードする必要がある。この際、node = tagger.parseToNode(string.encode("utf-8"))とすると、stringがパース中にガベコレされてしまって、変な挙動になる場合があるので注意。このように一度変数に代入すれば問題ない。```
Twitter Kitで画像付き投稿をする

##まえがき
最近までTwitter4jを使用して、画像付き投稿をしていたのですがTwitter Kitを使った方が認証がスムーズそうだし、純正だし今後のためにも乗り換えるかぁああということで乗り換えました！
乗り換えてみて、画像付きで投稿するまでのフローが少し面倒なのと、ネットの情報が古いものしか見当たらなかったので今回投稿してみました。
*認証の流れは省いていますが、認証後でないと投稿はできませんのでお気をつけください。*

##投稿までの流れ

[POST media/upload](https://dev.twitter.com/rest/reference/post/media/upload)
まずこちらのAPIに画像のバイナリデータを送信し、media_id_stringの値を取得します。

```json:ExampleResult
{
  "media_id": 553639437322563584,
  "media_id_string": "553639437322563584",
  "size": 998865,
  "image": {
    "w": 2234,
    "h": 1873,
    "image_type": "image/jpeg"
  }
}
```

[POST statuses/update](https://dev.twitter.com/rest/reference/post/statuses/update)
そしてこちらのAPIに投稿文言と共に、先ほど取得したmedia_id_stringをPOSTすると画像付き投稿が可能になります！

##実装

R.drawable.XXXXの画像をバイナリに変換して、Tweetするまでの流れです。

```java
InputStream inputStream = getResources().openRawResource(R.drawable.XXXX);
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int bufRead;
while ((bufRead = inputStream.read(buffer)) != -1) {
    bout.write(buffer, 0, bufRead);
}
byte[] binary =bout.toByteArray();
Observable.fromEmitter(emitter ->
       TwitterCore.getInstance().getApiClient()
              .getMediaService()
              .upload(RequestBody.create(MediaType.parse("image/jpg"), binary), null, null)
              .enqueue(new Callback<Media>() {
                   @Override
                   public void success(Result<Media> result) {
                       emitter.onNext(result.data.mediaIdString);
                       emitter.onCompleted();
                   }

                   @Override
                   public void failure(TwitterException exception) {
                       emitter.onError(exception);
                   }
               }), Emitter.BackpressureMode.LATEST)
       .flatMap(mediaIdString -> Observable.fromEmitter(emitter ->
               TwitterCore.getInstance().getApiClient()
                          .getStatusesService()
                          .update(tweetContent.get(), null, false, null, null, null, false, null, (String) mediaIdString)
                          .enqueue(new Callback<Tweet>() {
                                 @Override
                                 public void success(Result<Tweet> result) {
                                     emitter.onNext(true);
                                     emitter.onCompleted();
                                 }

                                 @Override
                                 public void failure(TwitterException exception) {
                                     Timber.e(exception, "tweet upload %s", exception.getMessage());
                                     emitter.onError(exception);
                                 }
                }), Emitter.BackpressureMode.LATEST))
       .subscribeOn(Schedulers.newThread())
       .observeOn(AndroidSchedulers.mainThread())
       .subscribe(isSuccess -> {
                   /*do something*/
              },
              throwable -> {
                   /*do something*/
              });
```


雑ですみません、、以上です。
TensorFlow製音楽生成「Magenta」のLookBackRNNを試す

# はじめに
以前もMagentaを用いて、[サカナクションさんを学習させてみました](http://qiita.com/tackey/items/1295a0347a8b4cc30d46)が、今回はMagentaのモデルのうち、LookBack RNNを用いてみます。

Macだと学習が進まないため、今回はAWSのGPUインスタンス上で行っています。

AWS上での環境構築については下記をご参考いただければと思います。

参考：[AWSのGPUインスタンスでTensorFlow製音楽生成プロジェクト「Magenta」を動かす
](http://qiita.com/tackey/items/cfdcbaf72fd4b0e084fa)


# LookBackRNNとは
Magentaの学習モデルの1つです。
LookBackの名前の通り、ある音の1、2小節前と比較し、その音が繰り返されているものなのかどうか、という情報も踏まえた上で学習するモデルになっています。

参考：[Generating Long-Term Structure in Songs and Stories
](https://magenta.tensorflow.org/2016/07/15/lookback-rnn-attention-rnn/)



# 実施内容

下記のREAD ME通り、学習から音楽生成までを行いました。

参考：[Lookback RNN Train your own
](https://github.com/tensorflow/magenta/tree/master/magenta/models/lookback_rnn#train-your-own)


[学習用のMIDIファイル](http://qiita.com/tackey/items/1295a0347a8b4cc30d46#3-midi%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E9%85%8D%E7%BD%AE%E3%81%99%E3%82%8B%E8%A6%81midi%E6%A5%BD%E6%9B%B2)はサカナクションさんの
・アイデンティティ
・Aoi
・アルクアラウンド
・新宝島
・ミュージック
・夜の踊り子
を用いています。


MIDIファイルのEC2への送信、生成した音楽のダウンロードはこちらを参考に行いました。

参考：[EC2にファイルアップロード/ダウンロード](http://qiita.com/mikoto/items/4273cd35dce254727363)


学習には20000iterationsで10時間程度かかりました。


# 生成された音楽

LookBackRNNで作成したものがこちら。
[サンプル1](https://clyp.it/0ffm1hda)
[サンプル2](https://clyp.it/aq3qgx4e)
[サンプル3](https://clyp.it/grkga3ks)


以前[BasicRNNというモデルで作ったもの](http://qiita.com/tackey/items/1295a0347a8b4cc30d46#7-%E3%81%A7%E3%81%8D%E3%81%9F%E9%9F%B3%E6%A5%BD%E3%82%92%E8%81%B4%E3%81%8F)がこちら
[Magenta-fish-1](https://clyp.it/55yshauf)
[Magenta-fish-2](https://clyp.it/ygv2utae)
[Magenta-fish-3](https://clyp.it/xxulihra)


学習回数も異なるため、モデルの影響とは一概に言えませんが、今回の方がかなりサカナクションさんぽいなと感じました。
繰り返し部分があると、より音楽っぽさが出る気がします。
ただ、学習用楽曲数が6曲、iterations 20000回はoverfitting?してるような気も。


# おわりに

環境構築から楽曲生成まで、AWSで4000円ぐらいかかりました。
アルバム1枚分、安いものですね！

ありがとうございました。
Vagrant + rsync でエラー出た時の対処方法

#Vagrant + rsync
opensshをGitと一緒にインストールした環境で、
rsyncを使おうとしたらエラーが出た

この時、rsyncはcygwinでインストールしたのが悪かったらしい
git、openssh、rsyncをすべてcygwinでインストールしたら解消した。

これ以外の場合のエラー解消方法はググってください
VagrantでCentOS7.2の環境を用意する


### box追加

```Bash
$ vagrant box add centos72 <box URL *1>
```

*1 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box

### 仮想マシン起動

```Bash
$ cd ~ 
$ mkdir centos72
$ cd centos72
$ vagrant init centos72
$ vagrant up
```

### ログイン

```Bash
$ vagrant ssh
```
プロジェクト間で共通の変数を利用する方法

#はじめに
DataSpiderではいくつかの変数が用意されています。
すべてのプロジェクト・スクリプトで使用可能グローバル変数として「環境変数」がありますが、環境変数の変更にはDataSpider Serverの再起動が必要になります。
そこで再起動を行わなわず、変数をすべてのプロジェクト・スクリプトで利用できる方法をご紹介します。
※DataSpiderの[環境変数管理](https://dl.appresso.com/help/dss40/help/ja/studio/environment_variables.html)とは

#変数スクリプトの作成
その方法とは環境変数を利用せず、スクリプトを利用する方法になります。
1.空のスクリプトを用意します。ここでは`変数スクリプト`という名称にしています。
　![var_01.png](https://qiita-image-store.s3.amazonaws.com/0/35843/8cd124a5-5e43-64d4-4898-42a333ee43ba.png)

2.スクリプト変数を作成します。
　![var_02.png](https://qiita-image-store.s3.amazonaws.com/0/35843/d05e20f1-6243-2e6e-33f5-03d7bc912f33.png)

　型を指定します。
　![var_03.png](https://qiita-image-store.s3.amazonaws.com/0/35843/2ca96c3c-f175-3800-623a-f5b13fe90a48.png)

　次に以下の設定を行います。
　- `名前`　→　変数名になります。
　- `初期値`　→　設定したい値になります。
　- `スクリプト出力変数として使用する`にチェックを入れます。
　![var_04.png](https://qiita-image-store.s3.amazonaws.com/0/35843/a649ba45-8c6d-d5fc-7278-909ef6070482.png)

　あとは必要な数分スクリプト変数を作成し、上記と同様の設定を行います。
　ここでは`氏名`,`メールアドレス`,`住所`の変数を作成しました。
　![var_05.png](https://qiita-image-store.s3.amazonaws.com/0/35843/88d42153-d9e3-318b-f1a3-5e79d9baf3bf.png)

　以上で設定は完了です。呼び出して確認してみます。

#呼び出し確認
1.呼び出し用のスクリプトを新規に作成し、キャンバスに`スクリプト呼び出し`コンポーネントを配置します。
　![var_06.png](https://qiita-image-store.s3.amazonaws.com/0/35843/8d9808f6-c47c-247c-c3f3-cc3d5fc32370.png)

2.今回はサービスに登録していないので、`同じプロジェクトのスクリプト`から先程作成した`変数スクリプト`を選択します。
　![var_07.png](https://qiita-image-store.s3.amazonaws.com/0/35843/9008253c-2cc0-a6dd-45ce-ecefff3d1d10.png)

3.呼び出し確認用に変数`var`を作成し、`mapping`アイコンを配置します。
　![var_08.png](https://qiita-image-store.s3.amazonaws.com/0/35843/eda39ec8-7b50-275d-268b-9d5dcadb918d.png)

4.`mapping`の設定を開いて入力元の`コンポーネント変数`→`script`内に、先程設定した変数名があることを確認します。
　今回はテスト用に`名前`を変数`var`に設定してみます。
　![var_09.png](https://qiita-image-store.s3.amazonaws.com/0/35843/e6980d11-bfd1-928d-4685-4d29f28e57dc.png)

5.デバッグ実行を行います。
　![var_10.png](https://qiita-image-store.s3.amazonaws.com/0/35843/ccc7b1de-e032-96bd-b354-81dfde2ab5a6.png)

6.結果の確認。変数スクリプトの中で設定した値が、varに設定されていることがわかります。
　![var_11.png](https://qiita-image-store.s3.amazonaws.com/0/35843/2c4490fc-57f1-19a0-e2b2-041b0d13f470.png)

7.その他、各種コンポーネントの設定画面からも変数を呼び出し設定することができることを確認します。
　![var_13.png](https://qiita-image-store.s3.amazonaws.com/0/35843/bfe0a00a-ffce-1db7-8123-6163e21e74ed.png)

#最後に
- スクリプトをサービスに登録した場合は、`サーバに登録されたサービスのスクリプト`から対象の変数スクリプトを呼び出すように設定してください。
　![var_12.png](https://qiita-image-store.s3.amazonaws.com/0/35843/ce6cea25-8794-5639-e0d8-7f664a0be187.png)

これで再起動なく、すべてのスクリプト・プロジェクトで同一の変数を利用することができるようになりました。
componentsに登録した要素の初期化に関して

## 想定
* vue.js 2.0.1
* jqueryのライブラリを使うとき、elementをつかいたい。
* domが作成されるときだけで良い。
* domは後々に追加される。

そういうときに以下のやり方だとbutton要素が取れない

```js
new Vue({
  components: {
    hoge: {
      template: '<button>copy</button>',
      create: function() {
        //ここでbuttonが欲しい
        this.$el; // null
      },
      ready: function() {
        //ここでも取れない。というよりもこのメソッドが呼ばれない
      },
      attached: function() {
        //ここでも取れない。というよりもこのメソッドが呼ばれない
      }
    }
  }
})
```
そのため、transitionを使う。

```js
new Vue({
  components: {
    hoge: {
      template: '<transition v-on:before-enter="enter"><button>copy</button></transition>',
      methods: {
        enter: function(el) {
          el;//el = button
        }
      }
    }
  }
})
```

## もうちょっと具体的に
listにある要素に対して、clipboard.jsを使う場合。（dataの要素が最初から入っていた場合は動きません）

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue test</title>
	<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.js"></script>
	<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.0.1/vue.js"></script>
	<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.5.12/clipboard.min.js"></script>
    <script>
        $(function() {
            var vm = new Vue({
                el: '#test',
                data: {
                    items: []
                },
                created: function() {
                    setTimeout(function(v) {
                    v.items = [{
                        name: 'りんご',
                        subject: 'りんごですよ'
                    }, {
                        name: 'いちご',
                        subject: 'いちごですよ'
                    }]
                    }, 1000, this)
                },
                components: {
                    clipboard: {
                        props: ['message'],
                        data: function() {
                            return {
                            clipboard: null
                            };
                        },
                        template: '<transition v-on:before-enter="enter"><button v-bind:data-clipboard-text="message">copy {{message}}</button></transition>',
                        methods: {
                            enter: function(el) {
                            this.clipboard = new Clipboard(el); 
                            }
                        }
                    }
                }
            })
        })
    </script>
</head>
<body>
    <table id="test">
    <tbody>
        <tr v-for="item in items">
        <td>{{item.name}}</td>
        <td><clipboard :message="item.subject"/></td>
        </tr>
    </tbody>
    </table>
</body>
</html>
```

## 参考先
https://vuejs.org/guide/transitions.html
[Unity]Google Maps APIを使って現在地の地図を表示する



ポケモンGOのように現在地のマップを表示してみたいと思ったので、試しに作ってみました。

[Query-chanGO](https://github.com/JunSuzukiJapan/Query-chanGO)

単純にStatic Maps APIを呼び出して表示しているだけなので、詳しく知りたい方はソースコードをお読みください。
wordpressテーマの編集について助言いただきたいです

こんにちは。
CSSをいじったことがない初心者ですが、WPテーマ編集をしています。
さっそくつまずいています。。。

LIQUID LIGHTというテーマで、TOPロゴ（タイトル文字）の周囲の余白を縮めたいのですが
どうすればよいでしょうか？
ロゴの下の余白を縮めたいです・・・。

http://sub.lomo.jp/wp/liquid/
bashでテキストファイルを簡単に配列にする方法

# よくある配列の作り方

こんな感じの改行区切りのテキストファイルがある場合に

```text:test.txt
あいうえお
かきくけこ
さしすせそ
```

今まではこういうやり方で配列にしていた。

```bash

IFS=$'¥n' #区切り文字をここで変更している

list=(`cat test.txt`)

echo "COUNT=${#list[@]}"

```



# 割と一瞬で出来るシンプルな配列の作り方

xargを使う。

```bash

list=(`cat test.txt|xargs`)

echo "COUNT=${#list[@]}"

```

xargsは標準入力に渡されたリストを引数リストに変換してくれるコマンド。
必然的に配列の値リストにも置き換わるため、このような書き方の方がシンプルで良い。
pod install でライブラリの最新バージョンが入らないときの対処

トラブルシューティングのお手伝いで CocoaPods や TravisCI まわりに関して調べたので、その内容を記録しておく。

#CocoaPods とは

Swift や Object-C 開発で利用されるライブラリ管理ツール。
24000 以上のライブラリがリポジトリ上で管理されており、インターネット環境を通して登録ライブラリを簡単にインストールできる。
さらに、プロダクトに必要なライブラリやバージョンを明記したファイル（Podfile と呼ばれる）をリポジトリのルートディレクトリに配置しておくことで、開発環境の準備作業を自動化できる。
具体的には、CocoaPods が提供する pod コマンドを実行することで、ワンオペレーションで必要な依存ライブラリがインストールと、XCode のプロジェクトファイルの作成が実行される。

```
$ pod install
```

#CocoaPods のライブラリ管理

各ライブラリのメタ情報を管理するリポジトリは GitHub 上にホスティングされている。（https://github.com/CocoaPods/Specs）
/Specs/{ライブラリ名}/{バージョン番号} 以下に配置されている podspec ファイルに JSON 形式で記載されている。
例として、https://github.com/CocoaPods/Specs/blob/master/Specs/Nimble/5.0.0/Nimble.podspec.json を引用する。

```yaml:Nimble.podspec.json
{
  "name": "Nimble",
  "version": "5.0.0",
  "summary": "A Matcher Framework for Swift and Objective-C",
  "description": "Use Nimble to express the expected outcomes of Swift or Objective-C expressions. Inspired by Cedar.",
  "homepage": "https://github.com/Quick/Nimble",
  "license": {
    "type": "Apache 2.0",
    "file": "LICENSE.md"
  },
  "authors": "Quick Contributors",
  "platforms": {
    "ios": "8.0",
    "osx": "10.10",
    "tvos": "9.0"
  },
  "source": {
    "git": "https://github.com/Quick/Nimble.git",
    "tag": "v5.0.0"
  },
  "source_files": "Sources/**/**/*.{swift,h,m}",
  "private_header_files": "Sources/NimbleObjectiveC/CurrentTestCaseTracker.h",
  "exclude_files": "Sources/Nimble/Adapters/NonObjectiveC/*.swift",
  "weak_frameworks": "XCTest",
  "requires_arc": true,
  "pod_target_xcconfig": {
    "ENABLE_BITCODE": "NO",
    "OTHER_LDFLAGS": "-weak-lswiftXCTest",
    "FRAMEWORK_SEARCH_PATHS": "$(inherited) \"$(PLATFORM_DIR)/Developer/Library/Frameworks\""
  }
}
```

#CocoaPods 自体のバージョンはどう管理するの？
CocoaPods 自体は RubyGems 上で提供される Ruby ライブラリである。
なので、Ruby のライブラリ管理ツールである Bundler を使う方法が知られている。

http://qiita.com/AcaiBowl/items/f48f9d0f53f1448720ec

要点は以下の３つ。

- Bundler に読ませる設定はルートディレクトリの Gemfile に書く
- Gemfile はこんな風に書く

```:Gemfile
source "https://rubygems.org"
gem 'cocoapods', '1.0.1'
```

- Bundler を利かせるためには、pod コマンドを直接使わずに bundler コマンドを咬ませる。

```
$ bundle exec pod install
```

#どうして最新バージョンが入らないときがあるのか？

pod コマンドはライブラリのメタ情報をローカルにキャッシュする。
あるライブラリの新しいバージョンがリリースされたとしても、このキャッシュが古い情報のままインストールを実行すると、この新しいバージョンが見えない。
自分が担当したトラブルシューティングでは、TravisCI 上で発生していた。

#問題の対処法

pod repo update を実行することで、任意のタイミングでキャッシュを更新することが出来る。
リリース済みのバージョンであるにもかかわらず、Podfile 上で指定されたバージョンのライブラリが見つからない、もしくは最新のバージョンが入らない（Podfile 上でバージョンの指定がない場合には、そのライブラリの最新バージョンが取得される）場合には、これによって対処できるかもしれない。
TeXLive2016(とTexstudio)をWindows10にインストール

自分用メモ
#準備
インストールするドライブに**約15GB程度の空き**があることを確認する。
管理者権限をもつユーザーでログインしておく。

#TeXLiveをダウンロード
[http://ftp.jaist.ac.jp/pub/CTAN/systems/texlive/Images/](http://ftp.jaist.ac.jp/pub/CTAN/systems/texlive/Images/ "http://ftp.jaist.ac.jp/pub/CTAN/systems/texlive/Images/")
![Jaist.png](https://qiita-image-store.s3.amazonaws.com/0/144605/8a1f7242-2c73-37c1-3ce0-424bf9ccd3b3.png)

Jaistから最新のISOイメージをダウンロードする。
今回は20160523版をダウンロードした。
約3GBあるので別のことをしながらダウンロードしよう。

#TeXstudioをダウンロード

[http://www.texstudio.org/](http://www.texstudio.org/)
からダウンロード
![TeXstudioDL.png](https://qiita-image-store.s3.amazonaws.com/0/144605/0121d00b-ed2c-e5b8-98a2-2b6eb55792ad.png)

(リンクが切れている場合は"[https://sourceforge.net/projects/texstudio/?source=directory](https://sourceforge.net/projects/texstudio/?source=directory)"からダウンロード)


#インストール
WindowsUpdateが始まっている場合はそちらを先に終わらせる。
ここでおまじないとしてインターネットから切り離し、ウイルス対策ソフトを一時停止させる。**Kasperskyの場合は必ず"終了"させる**。

Windows10はISOファイルを読み込む機能を標準で備えている。
ダウンロードしたファイルをダブルクリックすると読み込まれる。
（ここで開けない場合はファイルを右クリック＞プログラムから開く＞エクスプローラーを順にクリック。）

するとDVDドライブとして読み込まれるので
"install-tl-advanced.bat"を管理者権限で実行する。

下から二番目"TeXWorksフロントエンドを導入"を切る(TeXstudioを導入**しない**場合は入)
さいごに"TeXLive"を導入をクリックしよう。
インストールには筆者のNVMeSSDでも45分かかったので暇な時間に行うことが吉。
![TexLiveSet.png](https://qiita-image-store.s3.amazonaws.com/0/144605/9213cb2b-661a-c7be-27ab-d7f312e04f7c.png)

#TeXLiveを設定
ここではTeXでつくる書類で使うフォントを設定する。
Windows10では游フォントまたはMSフォントが初めから使える。
コマンドプロンプトを管理者で実行し

游フォントの場合

```
kanji-config-updmap-sys yu-win
```

MSフォントの場合

```
kanji-config-updmap-sys ms
```

#TeXstudioをインストール
ダイアログにそってすすめる

#TeXstudioを設定

[https://texwiki.texjp.org/?TeXstudio%2F%E8%A8%AD%E5%AE%9A](https://texwiki.texjp.org/?TeXstudio%2F%E8%A8%AD%E5%AE%9A)
を参考に設定する。

#初めてのLaTeX
設定が終わったらこのソースを貼り付けて、F5を押してビルド&表示する。

```
\documentclass[a4j]{jsarticle}

%opening
\title{hoge}
\author{イロハウタ}

\begin{document}


\maketitle

色はにほへど　散りぬるを
我が世たれぞ　常ならむ
有為の奥山　　今日越えて
浅き夢見じ　　酔ひもせず

\end{document}
```

プロセスが正常終了し、このようにひらがなカタカナ漢字英字すべてPDFで表示されていたらすべてのインストールは成功である。日付はビルドした時の日付になる。
![PDF.png](https://qiita-image-store.s3.amazonaws.com/0/144605/ceaa9de1-16d6-fde4-8f7a-eca99109938c.png)

最後に再起動。
#まとめ
時間の余裕のあるときにインストールを始めよう。
Swift3へ移行する際のAlamofire周りの修正箇所

基本的には以下の移行ガイドに名前空間の変更などがまとまっています。
https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%204.0%20Migration%20Guide.md

## 名前空間の変更

- `Manager` => `SessionManager`
- `Request.TaskDelegate` => `TaskDelegate`
- `Request.DataTaskDelegate` => `DataTaskDelegate`
- `Request.DownloadTaskDelegate` => `DownloadTaskDelegate`
- `Request.UploadTaskDelegate` => `UploadTaskDelegate`

移行ガイドには書いていませんが、`Alamofire.Method`も変わっています。

- `Alamofire.Method` => `Alamofire.HTTPMethod`

また、`HTTPMethod`はenumのため、`.GET`や`.POST`は`.get`や`.post`という小文字表記に変更になっています。
Xcodeの自動変換ではこのあたりは対応されません・・。

## URLStringConvertible

`URLStringConvertible`は`URLConvertible`に改名され、中身も変わっています。

``` Swift
public protocol URLStringConvertible {
    var URLString: String { get }
}

public protocol URLConvertible {
    func asURL() throws -> URL
}
```

よって、`request`や`upload`に使われる`URLRequest`が順守しているプロトコルも`URLStringConvertible`から`URLConvertible`になりました。
このあたりも自クラスにて再定義していることがあれば対応が必要です。
Emacs 25.1 LANG Error


いつものように定期クリーンインストールをしてEmacsを使っていたら見知らぬエラーが出た。
HomebrewのEmacsを24.5から25.1にしたのが原因かもしれない。
(macOSは10.11)

```sh
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LC_ALL = (unset),
	LANG = "en_JP.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
```

## 対処

```el
;;(getenv "LANG")                       ; => "en_JP.UTF-8"
(setenv "LANG" "en_US.UTF-8")
```

とりあえず、これでエラーは消えた。
標準化のススメ

「天は人の上に人を造らず人の下に人を造らず」と言えり。

人は生まれながら平等であると言われているが、
現実には大きな差がある。それはなぜであろうか。
その理由は、標準化したか標準化しなかったかによるものである
#職場で発生しがちな様々な問題

◆え！辞めちゃうの？あれできる人材いたかな？
ベテランのYさんがやめちゃいました。あの作業できるのYさんだけだったのに...
これから、どうしよう？

◆PJ炎上したんで新規メンバがやってきた。チームルールを教える時間がない。
プロジェクトが炎上したんで、増員した。
だけどチーム内のルール明文化してなかった、既存メンバーの成果物と統一取れてない。
チーム内のルールを教える時間がとれない。成果物チェック時に自分で修正したほうが早い。

◆前のバージョンの問題が再発する！
レビューにて....
レビュアー「これって、前のバージョンでも指摘したよね？何でまた同じ事になってるの？」
レビューイ「すみません。修正します。（そんなこと言われたって、その時まだこのチームにいなかっんですけど、、、）」

**その問題、標準化で解決できるかもよ？**

#標準化とは？

>実在又は潜在の問題に関し、与えられた状況の下で最大限の秩序を実現するため、共通かつ繰返し使用するための取決めを確立する活動。（ISO/IECガイド2）
　自由に放置すれば多様化、複雑化、無秩序化する事柄を少数化、単純化、秩序化する行動。具体的には、様々な「もの」や「事柄」について、「品質・性能の確保」、「安全性の確保」、「互換性の確保」、「試験・評価方法の統一」等を目的に、一定の基準を定めること。

*出典：日本工業標準調査会ウェブサイト(https://www.jisc.go.jp/dictionary/index.html#50H04)*

標準化の例）無印良品
無印良品は2000ページにも及ぶ社内業務マニュアルMUJIGRAMを作成。仕事のスキルやノウハウを蓄積。2001年38億円の赤字から見事V字回復。


◆え！辞めちゃうの？あれできる人材いたかな？
→作業手順を標準化してあれば、引き継ぎがスムーズになります。

◆PJ炎上したんで新規メンバがやってきた。チームルールを教える時間がない。
→チーム内ルールを標準化してあれば、新規メンバにチーム内ルールを教える手間が削減できます。

◆前のバージョンの問題が再発する！
→前バージョンで受けた指摘の再発防止策を標準に反映していれば、再発しません。
　レビュー指摘、テストインシデントが発生したら、常に標準改定して再発防止（流入、流出）できないか、検討しましょう。　




#標準化に対する懸案と対策
##[問題]どこに書いてあるかわからない
［対策］
標準化のインデックス、全体体系図を（できれば最初の段階で）作成する。

##[問題]知りたいことが載っていない
［対策］
知りたい情報の記載がなければ追加する。


##[問題]どこに最新版があるかわからない
［対策］
標準化のインデックス、全体体系図に従って配置する。
ファイルを移動させる場合、元のフォルダのファイルを削除し、移動先へのショートカットを置く。


##[問題]情報が更新されてない
［対策］
標準メンテする工数を予めプロジェクト工数に含めて見積もる
標準化、カイゼン提案に報奨する制度を設ける
標準化する内容を絞り込む

##[問題]標準化メンテ工数、運用工数がかかる
[対策]
**費用対効果を検討したうえで標準化する。**
内容を絞り込む。必須で実行する項目と推進で実行する項目を分け、必須で実行する項目を優先してメンテする
定期的に見直し、投入工数に対して得られる効果が小さいものは、標準から削減する
自動化を行って投入工数を減らすことで、費用対効果のカイゼンを図る。
※社外事故の再発防止策で大量のチェックリストができて、工数圧迫している、標準が形骸化するとかありがちですね。

##[問題]メンバが頭を使わなくなる
[対策]
標準の背景、理由を理解し、不適当な標準があれば、改善提案する意識で作業する。
標準化に完成、完璧はない。標準に誤りが含まれている可能性はある。
オープンソースのような扱い。
標準を参照して作業を実行する側の自己責任。
押し付けや固定化された教条ではない
関係者の合意に基づく決め事であり、常時見直しが図られる
例外を許さない唯一絶対の決め事ではない

#標準化の４段階
#１）暗黙知から形式知へ
・勘や経験に頼らず技術伝承できるようにする

#２）基準をつくる
・うまくいく手順と方法を示す。業務を標準化する
・標準を示す：誰もができること
・幅を示す：「これだけはしやってください/やらないでください」のような幅を示す
・考え方を示す：抽象度の高い概念の示し方、その考えにいたる具体的な例示が必要

#３）基準を守れるようにする
・規則・規定、業務品質を守れているかどうかを評価する仕組みをつくる
・評価する仕組みを示す（チェックリスト、確認問題など）

#４）ベストパフォーマンスをつくる
・基準に段階を設けて、無理なくステップアップできるようにする
・よくできる人の仕事のやり方を標準にして、だれもが早くその方法を身に着けられるようにする

**標準化し、カイゼンしていくことで個人とチームが成長する**
**標準化は、「自分のした苦労を他人にさせない」、「他人の努力をムダにしない」心づかい**
CinderのGL/CameraPerspでwindowのresizeに対応する

## 問題
こういうのがあって

![image](https://qiita-image-store.s3.amazonaws.com/0/14845/5c9cb8c7-a60a-517c-b796-dd24dd88ec5e.png)

なにも考えずにWindowをresizeするとこうなる．

| そのまま視点 | 上から視点 |
| --- | --- |
| ![image](https://qiita-image-store.s3.amazonaws.com/0/14845/1776e390-5122-ff19-22ce-ba19c55f8de4.png) | ![image](https://qiita-image-store.s3.amazonaws.com/0/14845/c439ff1d-0b9f-341c-6e76-24dfe50115ff.png) |

上から見るとわかりやすい．


## 対処
- `cinder::app::App`にWindow resize時のコールバックが用意されてる
- `cinder::CameraPersp`にはCameraのAspectRatioを変更するメソッドがある

これらを利用する．

```cpp
class AwesomeApp : public App {
public:
  // snip.
  void resize() override;

private:
  // snip.

  CameraPersp camera_;
};

// snip.

void AwesomeApp::resize() {
  camera_.setAspectRatio(getWindow()->getAspectRatio());
}
```

| そのまま視点 | 上から視点 |
| --- | --- |
| ![image](https://qiita-image-store.s3.amazonaws.com/0/14845/1b8a774d-1dc3-8651-eccd-2dba1ef49319.png) | ![image](https://qiita-image-store.s3.amazonaws.com/0/14845/996feac7-b127-ef6f-3b02-d5a161fb4236.png) |


問題なさそう．
ruby 字符串过长了 不能写在一行

```bash
vagrant@precise64:~/data$ pry
[1] pry(main)> a = "lalalala" \
[1] pry(main)* "gagagag"
=> "lalalalagagagag"
[2] pry(main)> a
=> "lalalalagagagag"
```

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/enum.rb#L212-L215
vertex shader -> fragment shaderで整数型を渡す

`int`をそのまま`in`/`out`で渡そうとするとコンパイルエラーになる．

```glsl
// vertex shader
out int id;

void main() {
  // snip.
}
```

```glsl
// fragment shader
in int id;

void main() {
  // snip.
}
```

回避するには`out`と`in`の手前に`flat`をつけてあげる必要がある．

```diff
 // vertex shader
-out int id;
+flat out int id;

 void main() {
   // snip.
 }
```

```diff
 // fragment shader
-in int id;
+flat in int id;

 void main() {
   // snip.
 }
```

そもそも`int`を渡すこと自体があまりお行儀よくない気もするので，`struct`等に詰めたほういい気がしている．

## References
- [Passing integer from vertex to fragment shader?](https://www.opengl.org/discussion_boards/showthread.php/172809-Passing-integer-from-vertex-to-fragment-shader)
アーカイブページで現在のカテゴリー・タグ・タームを取得する

/*
	アーカイブページで現在のカテゴリー・タグ・タームを取得する
*/
function get_current_term(){

	$id;
	$tax_slug;

	if(is_category()){
		$tax_slug = "category";
		$id = get_query_var('cat');	
	}else if(is_tag()){
		$tax_slug = "post_tag";
		$id = get_query_var('tag_id');	
	}else if(is_tax()){
		$tax_slug = get_query_var('taxonomy');	
		$term_slug = get_query_var('term');	
		$term = get_term_by("slug",$term_slug,$tax_slug);
		$id = $term->term_id;
	}

	return get_term($id,$tax_slug);
}
OpenGL関数

関数解説

# glfwInit
	引数:
		無し
	解説:
		全ての glfw関数 を呼ぶ前に呼ぶ必要がある
		失敗すると GL_FALSE が返る
	
# glfwCreateWindow
	GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share);
	引数:
		width
		heghit
		title
		monitor:	フルスクリーンでなければNULL
		share:		他のウィンドウとリソース共有、しないならNULL	
	解説:
		ウィンドウを作成する
		開けなければNULLが返る

# glfwTerminate
	解説
		glfwInitが成功したあとは終了時にこの関数を呼ぶ事
		
# glfwMakeContextCurrent
	void glfwMakeContextCurrent(GLFWwindow* window);
	解説:
		引数 window に指定したハンドルのウィンドウのレンダリングコンテキストをカレント (処
		理対象) にします。レンダリングコンテキストは描画に用いられる情報で、ウィンドウごとに
		保持されます。図形の描画はこれをカレントに設定したウィンドウに対して行われます。
# glClearColor
	void glClearColor(GLclampf R, GLclampf G, GLclampf B, GLclampf A)
	解説:
		glClear(GL_COLOR_BUFFER_BIT)で塗り潰す背景色の色

# glfwWindowShouldClose
	int glfwWindowShouldClose(GLFWwindow *const window)	
	解説: windowが閉じているかどうか、閉じている場合は非0が返る
	
# glClear
	引数:
		ぬりつぶすバッファ
		GL_COLOR_BUFFER_BIT でカラーバッファを消す
		バッファは他に、デプスバッファ、ステンシルバッファがある
	解説:
		画面クリア
			
# glfwSwapBuffers
	引数: window
	解説: ダブルバッファリング、カラーバッファを入れ替える

# glfwWaitEvents
	void glfwWaitEvents(void)
	解説:
		マウスの操作などのイベントの発生を待ちます。イベントが発生したら、それを記録してプロ
		グラムの実行を再開します。この関数はメインのループ以外で実行すべきではありません。

# glfwPollEvents
	void glfwPollEvents(void)
	解説: 
		マウスの操作などのイベントを取り出し、それを記録します。この関数はプログラムを停止さ
		せないので、アニメーションのように連続して画面表示を更新する場合に使用します。
ターミナル(Curlコマンド)で連番のファイルをまとめてDLする方法


```
curl -O "http://example.com/[001-100].jpg"
```


連番の場合はダブルクォーテーションが必要
Oのオプションを使えば保存できます。
oの場合はファイル名を指定する。Oはそのファイル名のまま保存。

ファイル名が重複してしまう場合には小文字のoオプションを使って

```
curl -o test#1 "http://example.com/[001-100].jpg"
```

のようにすれば自動でファイル名が適用されます。
プログラミング初心者だけどPythonでデータ解析することになった人に

# ロードマップ

1. Pythonの文法の基本を抑える
1. ちょっとしたアルゴリズム書けるようになる
1. データ分析・科学計算ライブラリの基本を理解する
1. 業務・研究用のコードを書けるようになる


# Pythonの文法の基本を抑える
方法はいくらでもあるから、自分にあった方法を選ぶ。

- Web上のわかりやすそうな入門サイトを通読するのでもいいし
- 全然わからないのであれば、本一冊買っても損はない
- 最近は動画もある。英語の動画を視聴できるのなら、尚の事幅が広がる

いずれにせよ、むやみに時間をかける必要はなく、__全体像を掴む__だけでよい。
細かいことは実際にコードを書くときに__都度調べていく__ほうが身につきやすい。目的があるなら尚の事。
あとは__躓いた時にすぐ聞ける人__がいるとなおよい。そういう__先達がいるならば、その人のおすすめを聞く__と良い。

慣れてるならこういうまとめを観るだけでもいい
http://qiita.com/rohinomiya/items/aab6b16d1a470871713c

こんなのもあった
http://stat.biopapyrus.net/python/


# ちょっとしたアルゴリズム書けるようになる
プログラミングコンテストも本気でやると奥が深いが、今はそうではないので、入れ込み過ぎないこと。
__基本文法を確実に身につけ__て、ある程度__自分の頭でコードを考える__ことができるようになれればよい。

下のようなサイトの初級〜中級問題を解けるようにする。
http://kenkoooo.com/atcoder/
https://paiza.jp/challenges/
http://odz.sakura.ne.jp/projecteuler/


# データ分析・科学計算ライブラリの基本を理解する
jupyter, matplotlib, numpy, scipy, pandasの基本を一通りやっておいても、損ではないと思う。
必ずしもすべて使うわけではないだろうし、他に使うものもあるだろうから、__取捨選択は先達に聞くべし__。

よくおすすめされる本としては、オライリーの本がある。
本では（本に限らないが）情報が古いもの（Pythonのバージョン等に難がある）もあるので注意。
https://www.amazon.co.jp/dp/4873117488
https://www.amazon.co.jp/dp/4873116554


# 業務・研究用のコードを書けるようになる
これ以上はだいぶ専門性が出てくるので、会社・研究室の__先輩等に聞くしかない__。
__そもそもこんなものを読む前に、最初からそうすべきだったという説もある。__
esaで書いた記事をqiitaに自動投稿する

# <i class="fa fa-leaf"></i> 動機
個人的なドキュメント管理を esa で行っている。
技術的なドキュメントも esa で書いているが、そういう記事は Qiita に投稿したい。
でも、一度書いた記事をコピペして、 Qiita に再投稿するのはなんか面倒。。。
そこで、

- esa で Qiita に投稿したい記事を書く
- その記事が自動的に Qiita に投稿されて欲しい

# <i class="fa fa-terminal"></i> システム概要
- [esa](https://docs.esa.io/) で記事を書く
- esa の GitHub webhook が動き、 [GitHub](https://github.com/) リポジトリにコミットされる
- CI（[Circle CI](https://circleci.com/dashboard)） でスクリプトが走り、 [Qiita](http://qiita.com/) API を叩いて対象記事が投稿される

<img width="854.4" alt="esa_to_qiita.png (184.2 kB)" src="https://img.esa.io/uploads/production/attachments/3476/2016/10/16/10708/499e7e30-d7ad-4fbd-8285-f861ee5eb4d8.png">

# <i class="fa fa-cog"></i> 設定
## <i class="fa fa-github" aria-hidden="true"></i> 記事を管理する GitHub リポジトリを準備する
このリポジトリの役割はふたつ。
- esa で書いた記事を管理する
- Qiita への投稿スクリプトを管理する

### GitHub の access token を取得する
esa からのコミットを許可するため、 [GitHub - Personal access tokens](https://github.com/settings/tokens) から Personal access token を取得する

### Qiita の access token を取得する
Qiita に自動投稿するため、[Qiita - settings/applications](https://qiita.com/settings/applications) から、Personal access token を取得する

### Circle CI の設定を書く
- circle.yml を作成
- 実行するスクリプトを作成
- 投稿内容を作成するrubyスクリプト
- API を叩くスクリプト

設定についてはこちらのリポジトリに。
[tdrk18/esa-article](https://github.com/tdrk18/esa-article)

## <i class="fa fa-paw" aria-hidden="true"></i> esa の GitHub webhook を設定する
GitHub webhook の詳細は こちらの [公式ドキュメント](https://docs.esa.io/posts/176) をご覧ください。

- esa root category： ここで指定したカテゴリ以下の記事が GitHub にコミットされる
- repo： 上で作成したリポジトリを指定
- branch： コミットするブランチを指定
- output directory： リポジトリルートから、記事データが保存されるディレクトリ

## <i class="fa fa-pencil-square-o"></i> 記事を書く
上で指定した 「esa root category」以下に記事を作成・Ship It! するとコミット・CIが自動で実行されて、Qiitaに記事が投稿される。


# <i class="fa fa-sticky-note-o" aria-hidden="true"></i> その他
とりあえず自動投稿の部分しか書いてないので、記事の更新とかはできません。。
徐々に書いていこうと思ってます。。
iOS 10のSafariでuser-scalable=noが効かないので対策した - そもそも読み物サイトではない事例


iOS10のSafariでuser-scalable=noが効かなくなった。

画面一枚で、リモコンのような機能を提供するページを作っていたため、効かないのは大変困ってしまった。
利用中に画面が拡大したり、スクロールしてしまったりで、非常にユーザ体験が悪化してしまったのである。

解決の例の一つに下記で紹介されているものがある。
http://qiita.com/pekpek/items/d74e5758a36478fbc039

上記の解決方法でもよかったのだけど、その他のついでにブラウザのデフォルトの動作を止めるために以下のようなJavaScriptで対策した。

```javascript
document.documentElement.addEventListener('touchstart', function (e) {
  if (e.target.nodeName !== "INPUT") {
    e.preventDefault();
  }
}, true);
```

inputタグは使用していたため、inputタグ以外の動作を無視させました。
Yiエディタの設定ファイル(yi.hs)でhaskell-stackを使う

# Yiエディタの設定ファイル(yi.hs)でhaskell-stackを使う
yiはyiの起動時に、yi.hsが更新されていれば自動的にコンパイルを行います。  
でもこれ、デフォルトでシステムグローバルなghcが使われる(よね？)ので、
yi.hsをstack.yaml使って設定してるとシにます。


## 解決
```zsh:.zshrc
# aliasにすると補完がシぬのでfunction
function yi () {
    stack exec yi -- $@
}
```

！！！！(声にならない声)


## 参考
- [travitch/taffybar Allow building with stack](https://github.com/travitch/taffybar/issues/140)
[vim] 新たなfiletypeを定義する

vimrcに定義すればOK. 下記の例は.logという拡張子のファイルを"log"というファイルタイプで開くように定義している。
```autocmd BufRead,BufNewFile *.log setfiletype log```

なお，logというファイルタイプは事前にruntimepath (e,g, /usr/share/vim/vim74/syntax/下)にlog.vimで定義する必要がある。

Link : http://vim-jp.org/vimdoc-ja/filetype.html#new-filetype
SendGridのカテゴリ名をメソッド名を基に楽に設定する

[SendGridのgem](https://github.com/stephenb/sendgrid)を使っている場合、以下のようなコードを書くことでメールのタイトルをダッシュボード上のカテゴリとして使える。

``` Ruby
sendgrid_category :use_subject_lines
```

しかし、"Category Stats"上では日本語のカテゴリ名が表示されない。
問い合わせたところ、ASCII文字を使うことを強く推奨された。

> Categories must be in 7bit encoding using the US-ASCII character set. Even though the categories are passed in your emails, there will be issues when trying to look for them in the stats page. We strongly recommend using ASCII characters for categories.

ということで、代替案として`app/mailers/application_mailer.rb`あたりに以下を書いて、メソッド名を使うと1つ1つのメーラーにカテゴリ名を書かなくてよくなり便利です。

``` Ruby
def sendgrid_category_with_method_name
  caller_file_name = caller[0][%r{\/[^\/]+?\.rb\:}][1..-5]
  caller_method_name = caller[0][/`.*'/][1..-2]
  sendgrid_category "#{caller_file_name}:#{caller_method_name}"
end
```
<thead>があるけど、、、プロって使うの？？

テーブルタグを書くときに、theadタグ(テーブルヘッド)っていうのがあるみたいで。

んで、それって実際現場で書くの？？という疑問。

tableタグ(テーブル)で補完できないのかぁ？