OmniAICreator/Qiita-1.07M huggingface dataset:
gulpからgruntのタスクを直接実行する


## やりたいこと

* grunt向けにしか提供されていないタスクをgulpから実行したい (つらい)
	* 例: ElectronアプリのWindows版インストーラをつくる [grunt-electron-installer](https://github.com/atom/grunt-electron-installer))

## やり方1 - gulp-grunt

[gulp-grunt](https://github.com/gratimax/gulp-grunt) という、gruntタスクをgulpから実行できるようにするツールを使う。

`Gruntfile.js` は別に用意する。

```js:gulpfile.js
require("gulp-grunt")(gulp);

gulp.task("some-task", ["grunt-<gruntのタスク名>"]);
```


## やり方2 - gruntのAPIを直接叩く

gruntのAPIをgulpfile内で直接叩いてタスクを実行する。
こちらのほうが自由度が高い。

```js:gulpfile.js
var gulp = require("gulp");

grunt.task.init = function() {};

// Gruntfile.jsっぽいこと
grunt.initConfig({
  // タスク設定...
});
grunt.loadNpmTasks("<npmのタスク>");

gulp.task("some-task", function (done) {
  grunt.tasks(["<gruntのタスク名>"], {}, done);
});
```

## 参考

* [node.js - Running grunt task with api, without command line - Stack Overflow](http://stackoverflow.com/questions/16564064/running-grunt-task-with-api-without-command-line)
Jupiterにclingカーネルをインストール


# clingkernel

本家のインストール
https://github.com/minrk/clingkernel
ではgit cloneの説明がないので？？だった．

```bash:ダウンロード・インストール
git clone https://github.com/minrk/clingkernel.git
cd clingkernel/
sudo jupyter-kernelspec-2.7 install --user cling
```

（上記では`jupyter-kernelspec-2.7`はmacportsのコマンド．）

# cling

その前にCling自体をインストールする必要がある．

```bash:
mkdir $HOME/cling
cd $HOME/cling
wget https://raw.githubusercontent.com/karies/cling-all-in-one/master/clone.sh
sh ./clone.sh
```

これでclingが`$HOME/cling/inst/bin/`にインストールされる．

```bash:.bash_profileにかく
export PATH="$PATH:$HOEM/cling/inst/bin/"
```
自然言語処理100本ノック 第1章 準備運動(前半)


東北大学 乾・岡崎研究室のWebページにて公開されている「[自然言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/#)」を解いていこうと思うので、その記録としてまとめる。


## <i class="fa fa-leaf"></i> 00. 文字列の逆順
> 文字列"stressed"の文字を逆に（末尾から先頭に向かって）並べた文字列を得よ．

指定された文字列を逆順で表示すれば良い。
キーワードは「Extended Slices」。

```python
# -*- coding: utf-8 -*-
__author__ = 'todoroki'

string = "stressed"
print string[::-1]
#=> desserts
```

ポイントは ``[::-1]``。
文字列の反転を取得するときはこう書けばいいと覚えておくのもありだと思う。
どうしてこうなるかは、[python公式ドキュメントの該当部分](https://docs.python.org/3/whatsnew/2.3.html?highlight=extend%20slice#extended-slices)を見るとわかるけど、ここでは説明を割愛する。

## <i class="fa fa-leaf"></i> 01. 「パタトクカシーー」
> 「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ．

これも「Extended Slices」で解ける。

```python
# -*- coding: utf-8 -*-
__author__ = 'todoroki'

string = u"パタトクカシーー"
print string[::2]
#=> パトカー
```

文字列の先頭から末尾まで2文字刻みでスライスして表示している。

## <i class="fa fa-leaf"></i> 02. 「パトカー」＋「タクシー」＝「パタトクカシーー」
> 「パトカー」＋「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ．

この問題は「zip」関数を利用する。

```python
# -*- coding: utf-8 -*-
__author__ = 'todoroki'

string1 = u"パトカー"
string2 = u"タクシー"
ans = u""

for a, b in zip(string1, string2):
    ans += a + b
print ans
#=> パタトクカシーー
```
zip関数はそれぞれのシーケンスのi番目の要素をタプルとして返す関数であるので、zip関数を利用することで2つのシーケンスオブジェクトを並行して扱うことができる。


## <i class="fa fa-leaf"></i> 03. 円周率
> "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."という文を単語に分解し，各単語の（アルファベットの）文字数を先頭から出現順に並べたリストを作成せよ．

```python
# -*- coding: utf-8 -*-
__author__ = 'todoroki'

string = 'Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.'
ans = []

for s in string.split():
    s = s.replace(",", "").replace(".", "")
    ans.append(len(s))
print ans
#=> [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]
```

指定した文字で対象をスライスする ``split()`` メソッドを利用。
何も指定しない場合は空白区切りが適用される。
``,`` や ``.`` が邪魔なので置換してから文字数を数える。


## <i class="fa fa-leaf"></i> 04. 元素記号
> "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."という文を単語に分解し，1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字，それ以外の単語は先頭に2文字を取り出し，取り出した文字列から単語の位置（先頭から何番目の単語か）への連想配列（辞書型もしくはマップ型）を作成せよ．

```python
# -*- coding: utf-8 -*-
__author__ = 'todoroki'

string = 'Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.'
index = [1, 5, 6, 7, 8, 9, 15, 16, 19]
ans = {}
for i, s in enumerate(string.split(), 1):
    if i in index:
        ans[s[0]] = i
    else:
        ans[s[0:2]] = i
print ans
#=> {'Be': 4, 'C': 6, 'B': 5, 'Ca': 20, 'F': 9, 'S': 16, 'H': 1, 'K': 19, 'Al': 13, 'Mi': 12, 'Ne': 10, 'O': 8, 'Li': 3, 'P': 15, 'Si': 14, 'Ar': 18, 'Na': 11, 'N': 7, 'Cl': 17, 'He': 2}
```

指定された単語に関してはスライスで2文字取り出す。
enumerate関数の第2引数を指定することでカウンタの開始値を指定可能(python2.6からの機能らしい[[参照]](http://docs.python.jp/2/library/functions.html#enumerate))。

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
pepperを数日触って気づいたこと

・プロジェクトフォルダ内に.gitフォルダを作るとプロジェクトが壊れる
https://community.aldebaran.com/ja/forum/git-%E3%81%A7%E3%81%AE-choregraphe-%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E7%AE%A1%E7%90%86-1333

※追記予定
processingでPDF書き出し

Processingではスケッチの内容をPDFとして書き出すことができます。
setup()関数でbeginRecordを実行して、保存したいところでendRecordを
実行すればいいのですが、書き出されたイメージの色がおかしくなる場合が
あります。その場合はcolorModeを設定する前にbeginrecordを実行する
ことで解消されます。

~~~java

void setup () {
    size (640, 480);
    beginRecord (PDF, "test.pdf");
    colorMode (HSB, 256);
}
 
void draw () {
    ellipse (random (width), random (height), 10, 10);
}
 
void mousePressed () {
    endRecord ();
    exit ();
}

~~~
構文のnestを深くしたく無い時の[if not] or [unless]的な書き方

メモ代わりに。
swift勉強中に以下の様なサンプルコードが出てきたのだが、構文のnestを深くしたくなかった。

```
# ViewController内のコードと思って頂ければ。

func hoge() {
    if let number = Int(hogeTextField.text!) =  {
      print(number)
      // ここに色々処理   
    }
}
```

ので[if not] or [unless]的な書き方が無いか検索したら`guard statement`というのが出てきた。
これを使えば以下の用に書ける。

```
# ViewController内のコードと思って頂ければ。

func hoge() {
    guard let number = Int(hogeTextField.text!) else {
        return
    }
    
    print(number) // ブロックの外でもちゃんと使用可能
    // ここに色々処理  
}
```

便利！
python忘備録

# モデルのfield名を取得する方法

```
from django.db import models
class hoge(models.Model):
  hoge_id = models.IntegerField()
  hoge_text = models.CharField()
```
と定義されているクラスのフィールド名を取得する場合

```
field_names = [field.name for field in hoge._meta.fields]
```

これで取って来れる。
wgetを使って200 OKが返るかを判定

wgetのスパイダーモードを使って、その結果に200 OKが含まれるかをgrep -cで判定。

```
result=`wget --spider -nv [URL] 2>&1 | grep -c '200 OK'`
if [ ${result} -ne 1 ]; then
  echo "[URL] is down."
  exit 1
fi
```

別のやり方としては$?でgrepの返り値をとるパターン。

```
wget --spider -nv [URL] 2>&1 | grep '200 OK'
result=$?
if [ ${result} -ne 0 ]; then
  echo "[URL] is down."
  exit 1
fi
```

参考サイト

http://ameblo.jp/archive-redo-blog/entry-10384794114.html

http://ameblo.jp/pclindesk/entry-10192327404.html

http://qiita.com/yamao2253/items/05adf89f39c1a6862147

http://d.hatena.ne.jp/sasaplus1/20120621/1340207996
MySQL文の中でechoのようなことをしたい

MySQL内から.sqlファイルなどを読み込んだ場合、途中の処理がわかりやすいようにechoのような表示をさせたい。

## SELECTで表示

```
mysql> SELECT 'hoge';
+------+
| hoge |
+------+
| hoge |
+------+
1 row in set (0.00 sec)
```
うーん、見栄えが悪い。
列名の非表示には「-N」、枠線の非表示にはDB接続時に「-s」オプションをつけなくてはならないみたい。

```
shell $ mysql -s -N ～
mysql> SELECT 'hoge';
hoge
```

これで文字のそのまま出力はできるようになったけど、今後テーブルいじるとこの表示になって見にくい・・。
MySQL内で起動オプションの切り替えができたらいいのに。

# シェルから表示
万策尽きたので、MySQL内から直接シェルのechoコマンドを実行してみる。

```
mysql> \! echo hoge
hoge
```

できた。文字をそのまま表示させたいときはこれぐらいしかない模様。
他にもないのかな？
jQuery.cookieでcookieを削除する際の注意

jquery.cookieを使ってcookieを削除する際にうまくいかなかったのでメモ

```js

var name = "keshitaicookiemei";
$.removeCookie(name);
$.cookie(name, null);
$.cookie(name, {expires: -1, path: '/'});//←これはだめ
$.cookie(name,"",{expires:-1});
$.cookie(name,"",{path:"/",expires:-1});//←パスをドメイン全部にしている場合や、上ではうまく消えない場合
```
Sublime Text2 > コメント行でも入力補完を表示する > Ctrl+Space 

```txt:動作確認
Sublime Text2 on Windows 7pro
```

cppのコーディングでの話。

すでに `kTag_preLoad` というキーワードをソースで使っているとする。

```
kTag
```
コメント行でない入力では、上記を入力した段階で補完候補として `kTag_preLoad`などが表示され、選択可能となる。

一方で、コメント行では`kTag`まで入力しても補完候補が表示されない。

```
// kTag
```

コメント行でも、Ctrl+Spaceを押すことで補完候補が表示される。
コメントの時に補完ができなく不便だったが解決した。
Safari, Chromeで右クリックのメニューからリンク先URLを取得するAutomatorワークフロー

Chrome Canaryでwebページを見ている時に、リンク先をCanaryではなく通常版のChromeで開きたい案件が発生した
右クリックのサービスの中に「URLを開く」というものがあり、それでいけるかと思っていたのだが選択した文字列をそのまま規定のブラウザに送るというクソ仕様だった
([http://fuga.com/](http://hoge.com/)みたいになってると http://fuga.com/ に飛ばされる！)


そこで自作のサービスでなんとかしようと思い色々やって下記のコードに落ち着いた
JavaScriptでワークフロー書けるとか全然知らなかった（そもそもAutomatorすら触ったことなかったけど）
そしてそっからさらにブラウザで任意のJavaScriptを実行できるなんて・・・

```js:苦労の結晶.js
function run(input, parameters) {
	
	var app = Application("Google Chrome Canary");
    app.includeStandardAdditions = true;
	
	var url = app.windows[0].activeTab.execute({
		javascript: 'window.getSelection().anchorNode.parentNode.href'
	});

	return url;
}
```

### 最終的にこんな感じ

<img width="740" alt="スクリーンショット 2015-10-29 16.23.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/90613/5c65ab8f-cedc-4fff-baab-d79409b1fa80.png">

あんまり需要ありそうには思えないけど備忘録も兼ねて

# [2015/10/30 13:00 追記]

Safariでやろうと思ったらちょっとコード違った

```js:Safari
function run(input, parameters) {

    var app = Application("Safari");
    app.includeStandardAdditions = true;

    var url = app.doJavaScript('window.getSelection().anchorNode.parentNode.href',{
        in: app.windows[0].currentTab
    });

    return url;
}
```
git cloneしたら、403Forbidden出てclone出来ない時の回避法

**環境情報**
OS：CentOS6.4
git version：1.7.1

#### git cloneしてみたら、こんなエラーが返ってきた

```
$ git clone https://ghe.org/test/hogehoge.git
error: The requested URL returned error: 403 Forbidden while accessing
```

**なぜに(ﾟдﾟ)！とりあえず、原因調査してみる（NW的な問題かもしれないので）**

#### DNSが引けないか確認の為、nslookupしてみる
```
$ nslookup ghe.org
Non-authoritative answer:
Name:	ghe.org
Address: 11.11.111.111
```
**うーん、普通に引けてる(´・ω・｀)**

#### 443空いてるか確認の為、telnetしてみる
```
$ telnet ghe.org 443
Trying xx:xxxx::xxxx:xxxx...
Connected to ghe.org.
Escape character is '^]'.
```
**ポートも開いてますなー(ヽ´ω`)**

#### crulもしてみる
```
curl https://ghe.org/test/hogehoge.git
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>
```
**301なんでとりあえず問題なし**
**ググってみたら、1.7系で同じような現象の人がいる(´；ω；｀)**

#### 回避策を参考に、こんな感じにURLの前にユーザ名@を付けてみた

``` 
$ git clone https://test-user@ghe.org/test/hogehoge.git
Initialized empty Git repository in /root/test/.git/
Password:
remote: Counting objects: 74, done.
remote: Total 74 (delta 0), reused 0 (delta 0), pack-reused 74
Unpacking objects: 100% (74/74), done.
```
**おっパスワード聞かれて、普通にできたヽ(^o^)丿**



##### とりあえず、バージョンによるものか切り分けるために社内レポにあった1.8系入れてみる

```
$ git version
git version 1.8.3.1
```

#### もう一回cloneしてみる
```
$ git clone https://ghe.org/test/hogehoge.git
Cloning into 'hogehoge'...
Username for 'https://ghe.org': test-user
Password for 'https://test-user@ghe.org':
remote: Counting objects: 74, done.
remote: Total 74 (delta 0), reused 0 (delta 0), pack-reused 74
Unpacking objects: 100% (74/74), done.
```

**普通に出来たンゴ(ﾟдﾟ)！**
**どうやら、gitのバージョンによるものらしい...**
とりあえずは、**URLの前にユーザ名@**ってするか、
バージョンを**1.8系**にアップデートする感じで回避できそうです(｀･ω･´)ゞ
mac MySQL ターミナル 自動起動

ターミナルを立ち上げるたびに、

```
$ mysql.server start
```

と入力するのがめんどくさいので、自動起動の方法を記す。

MySQLはhomebrewでインストール。

```
$ brew update
$ brew install mysql
```

インストールが完了したら、

```
To have launchd start mysql at login:
  ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents
Then to load mysql now:
  launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
```

と表示されるが、こちらは使わずに、launchctlのマネージャーに`homebrew-services`を使用する。

公式サイトはこちら。
https://github.com/Homebrew/homebrew-services

READMEに従ってインストール。

```
$ brew tap homebrew/services
```

MySQLを自動起動にする。

```
$ brew services start mysql

==> Successfully started `mysql` (label: homebrew.mxcl.mysql)
```

これだけ。

自動起動を止めたい時は、

```
$ brew services stop mysql

Stopping `mysql`... (might take a while)
==> Successfully stopped `mysql` (label: homebrew.mxcl.mysql)
```

一覧を取得したい。

```
$ brew services list

Name       Status  User   Plist
mysql      started ------ /Users/------/Library/LaunchAgents/homebrew.mxcl.mysql.plist
postgresql started ------ /Users/------/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
```

以上。
DockerHub上のFluentd Official Imageを使ってとにかくコンテナを作って動かしてみたい人のためのメモ

#0. 前書き
タイトルの通りです。
DockerHub上のfluent/fluentdの通りですが、メモとして。
https://hub.docker.com/r/fluent/fluentd/

以降ではDockerのホストを動かす環境を”ホスト”と記述しています。
また、確認のため、ホスト側でfluent-catコマンドを使います。
入っていない場合は入れときましょう。

#1. ホストでDockerを導入
これはご利用の環境にあわせてDocker公式の通りに。
https://docs.docker.com/installation/

#2. ホスト上の/dataフォルダへの権限付与
/dataフォルダをコンテナ内にマッピングし、fluentdの書き込み先とするため、書き込めるようにしときます。とりえあず777。

```
$ sudo mkdir /data
$ sudo chmod 777 /data
```

#3. どーん
ホスト上でdocker run します。

```
$ sudo docker run -d -p 24224:24224 -v /data:/fluentd/log fluent/fluentd
```

起動しているか確認しときましょう。

```
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
57e6c6b5a2f4        fluent/fluentd      "/bin/sh -c 'exec flu"   13 seconds ago      Up 11 seconds       0.0.0.0:24224->24224/tcp   distracted_hoover
```

いいですね。

で、実際の動作。
デフォルトのfluent.confでは、docker.*以外のタグのついたデータは、ホスト上の/dataディレクトリにdata.日付.モニョモニョ.logとして記録されます。

実際データを投げつけて確認してみましょう。
前書きのとおり、ホストにfluentdが導入されている前提ですので、fluent-catを使います。
データを投げつける前は/dataには何もないはずです。

```
$ ls /data
$ echo '{"subject":"hello"}' | fluent-cat test
$ ls /data
data.20151029.b52338685a663e9e7.log  data.log
$ cat /data/data.20151029.b52338685a663e9e7.log
20151029T062739+0000	test	{"subject":"hello"}
```

いいですね！


#4. その他
ふーんと思ったところで、オリジナルのfluent.confを使いたいとか、fluentdの起動オプションの指定とか、ディレクトリのマップを変えたいとか、ポートを変えたいとかなったら、改めて公式読めばいいんじゃないでしょうか。
https://hub.docker.com/r/fluent/fluentd/

おしまい。
Bashで複数の変数を一度に代入したときの挙動の確認

bashで一行で複数変数の代入を行った場合の処理順に関して、後ろの代入処理で、それより前に代入した変数の値が使えるのかな？というとても些細な事の確認をしたメモ。

# 確認作業
結論としては、前の代入から順番に行われるので、後ろの代入で前の変数の値が使えることが分かった。

以下、確認作業。

```console:
$ #既存の変数値の紛れがないよう、リセットしておく
$ a= b=

$ #これでbにaの内容が入るか？
$ a=hoge b=$a

$ #入った！
$ echo $a $b
hoge hoge
```

↓つまり変数のスワップとかはこういう風に書ける。

```console:
$ a=foo b=bar
$ t=$a $a=$b $b=$t
$ echo $a $b
bar foo
```

↓ちなみに配列変数の一発代入リテラルでこんな感じの変態記述は出来ないようだｗ

```console:
$ a=() b= #リセット
$ a=(foo [1]=${a[0]} baz) b=${a[0]}

$ #ふたつ目の値が a[0] と同じ foo になるかな？と思ったけどこれは無理のようだ
$ for i in "${!a[@]}"; do echo "a[$i] is '${a[$i]}'"; done
a[0] is 'foo'
a[1] is ''
a[2] is 'baz'

$ #なお単に前で代入した配列変数の値を使ってるだけなので、bには期待通りのa[0]の値が入っている
$ echo $b
foo
```

# 使いみち?

IFSを一時的に保存して後で戻したいときに、バックアップ用変数とIFSの更新が一発でできるとちょっと嬉しいなって思ったので。確認したくなった次第。

```bash:つまりこんな事をしたかったんだが、問題なく出来ることが分かった。
func() {
  local IFS0=$IFS IFS=$'\n'
  # do something with custom IFS
  IFS=$IFS0
  # do other
}
```

細かすぎて普通の人にはどうでもよいことだと思う(^^;
Qiita投稿の文字数をカウントするブックマークレット

Qiita投稿の編集画面に、投稿本文の文字数をカウントして表示してくれるChrome用のブックマークレットです。


## ブックマークレット


```js
const counter = $("<small id=\"char_counter\">").prependTo(".editorFooter");
const preview = $(".js-preview");
function update() {
	const all = preview.text().replace(/\s/g, "").length;
	const text = preview.children().filter(":not(.code-frame)").text().replace(/\s/g, "").length;
	counter.text(all + "文字 (テキスト: " + text + "文字)");
}
(new MutationObserver(update)).observe(preview[0], { childList: true});
update();
```

## サンプル

<img width="669" alt="「Qiita投稿の文字数をカウントするブックマークレット」を編集_-_Qiita.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/79ae3d49-6d35-b356-fb4a-2349ab863bd4.png">
Backlogの更新をHubot経由でSlackに通知する

# 1.概要
- Backlogの更新をHubot経由でSlackに通知する
- 通知対象
    + 課題の作成
    + 更新(コメント追加、ステータス変更...)
    + 課題のお知らせ追加
    + Subversionコミット
    + Wiki(作成、更新、削除)

# 2.動機
- [Bitbucketの通知Bot](http://qiita.com/t_mimura/items/cc7f319cc0f7698c2617)は作ったので、せっかくだからBacklogも作っちゃおう
- [参考にさせてもらったBot](http://qiita.com/yo-iida/items/c69fe7b6afb2c082b822)を自分用に改修したかった

# 3.導入方法
## 前提
- Hubot => Slackの連携はできている(ping -> pongができればok)
    + [backlog→hubot→slack連携](http://qiita.com/yo-iida/items/c69fe7b6afb2c082b822)がわかりやすいと思うので参考にしてください
 
## npm導入
- hubotディレクトリ内(binとかpackage.jsonがあるとこ)で下記コマンド

```shell-session
npm install backlog2slack --save
```
- `external-scripts.json` に下記を追加する

```json:external-scripts.json
"backlog2slack"
```

## Backlogのwebhook設定
- Tilteは適当にわかりやすいものを入力 例)「slack_notification」
- URLには以下を設定する

```
{hubot_url}/backlog2slack

例）http:example.com:8080/backlog2slack
```
- **通知してほしい項目のみ** 選択する  
※~~課題関係の更新にしか対応していません(要望があったら追加するかも)~~SVN・Wiki追加対応


## 通知先指定(2つの方法)

- Getパラメータでの指定(**優先**)
`http:example.com:8080/backlog2slack?destination=backlog-notification-channel`
`http:example.com:8080/backlog2slack?destination=t_mimura`

- 環境変数での指定
`export HUBOT_BACKLOG2SLACK_DESTINATION = "backlog-notification-channel"`
`export HUBOT_BACKLOG2SLACK_DESTINATION = "private-kosokoso-heya"`

通知先(destination)はCHANNEL, PRIVATE_GROUP, DM(user_name)に対応している

# 4.通知例
<img width="627" alt="backlog.png" src="https://qiita-image-store.s3.amazonaws.com/0/72388/bda7b8fa-3394-db0f-5569-53d67542f292.png">

# 5.オプション
## 色の指定方法
|Action|Type|defaultColor|
|:-----|:--:|:----------:|
|課題の追加|warning|オレンジ|
|コメント追加|good|Green|
|お知らせ追加|good|Green|
|課題の更新|good|Green|

- Getパラメータでの指定(**優先**)   
`http:example.com:8080/backlog2slack?good_color=000000`  
`http:example.com:8080/backlog2slack?warning_color=ff0000&danger_color=f0f`

※　colorに `#` は含めない
ダメな例)`.../backlog2slack?warning_color=ff0000&danger_color=#f0f`

- 環境変数での指定  
`export HUBOT_BACKLOG2SLACK_GOOD_COLOR = "000"`  
`export HUBOT_BACKLOG2SLACK_WARNING_COLOR = "ffff00"`

# 6.雑多
- Slack通知の整形や通知情報の追加などは継続的に続ける予定
    + ~~Subversion対応(リビジョン詳細へのリンク程度)~~ 対応済
- [Github](https://github.com/mito5525/backlog2slack)へのPR歓迎です
- 今後の課題として、Backlog-Slack間のユーザー名の差異をどうやって吸収するか
    + 対応マップをJSONで書いておくくらいしか思いつかない
    + Slackの `Highlight Words` にBacklogのユーザ名を追加すればとりあえずOK?

# 6.参考/利用したURL
- [backlog→hubot→slack連携](http://qiita.com/yo-iida/items/c69fe7b6afb2c082b822)
- [SlackAPI](https://api.slack.com/docs/attachments)
- [Backlog webhook](http://developer.nulab-inc.com/ja/docs/backlog/api/2/get-activities)
OS X のブートボリューム名を取得する

Terminal (コマンドライン) で OS X の boot volume のパーティション名（ボリュームラベル）を取得する方法。

ググっても出てこなかったのでメモ。
そもそもググらずともみんな理解している内容ってことなのかな。

```sh
$ diskutil info / | grep 'Volume Name' | awk -F: '{gsub(/^ +/, "", $2); print $2}'
```

もっとスマートな方法があってもいいような気がするんだけど。
FluentHandler for Monolog

## Dependencies ##

- PHP >= 5.3.0
- [Monolog](http://github.com/Seldaek/monolog) == 1.17.2
- [fluent-logger-php](http://github.com/fluent/fluent-logger-php) == v1.0.0

```php:FluentHandler.php
use Monolog\Logger;
use Monolog\Handler\AbstractProcessingHandler;

use Fluent\Logger\Entity;
use Fluent\Logger\FluentLogger;

class FluentHandler extends AbstractProcessingHandler
{
    protected $logger;

    public function __construct($host = FluentLogger::DEFAULT_ADDRESS,
                                $port = FluentLogger::DEFAULT_LISTEN_PORT,
                                $level = Logger::DEBUG,
                                $bubble = true)
    {

        parent::__construct($level, $bubble);
        $this->logger = new FluentLogger($host, $port);
    }

    /**
     * {@inheritdoc}
     */
    protected function write(array $record)
    {
        $tag  = $record['channel'] . '.' . strtolower($record['level_name']);
        $time = $record['datetime']->getTimestamp();

        $data = $record['context'];
        $data['message'] = $record['message'];

        $entity = new Entity($tag, $data, $time);
        $this->logger->post2($entity);
    }
}
```

```php:index.php
$autoload = include realpath(__DIR__ . '/vendor/autoload.php');

use Monolog\Logger;

include realpath(__DIR__ . '/FluentHandler.php');

$log = new Logger('fluentd.test');
$log->pushHandler(new FluentHandler("unix:///var/run/td-agent/td-agent.sock"));
$log->warning('message', array("from"=>"userA", "to"=>"userB"));

```
MySQLレプリケーション設定メモ


5.6にて

## Slaveを1から作成する場合

### 事前準備

Masterでbinログが出力されるようになっていること
MasterとSlave候補でそれぞれ異なるserver-idが設定されていること

```:my.cnf
[mysqld]
log_bin = /path/to/mysql-bin
server-id = <server-id>
```

### Master作業

```sql
-- レプリケーション用ユーザーの作成
GRANT REPLICATION SLAVE ON *.* TO repl@192.168.33.102 IDENTIFIED BY 'replpass';

-- 更新ロック
FLUSH TABLES WITH READ LOCK;

-- FLUSH TABLES WITH READ LOCKが実行されたことを確認
SHOW PROCESSLIST;

-- Key_blocks_not_flushedが0であることを確認
SHOW STATUS LIKE 'Key_blocks_not_flushed';

-- InnoDBの場合、Log sequence numberがLog flushed up toと等しいことを確認
SHOW ENGINE INNODB STATUS\G
```

データベースのコピーを取る

```bash
cd /var/lib/mysql

# InnoDBの場合ibdata1も含む
tar cvf targetdb.tar targetdb ibdata1

# scp等でtarをSlave候補に送る
```

```sql
-- binログのファイル名と、Positionを控える
SHOW MASTER STATUS\G

-- ロック解除
UNLOCK TABLES;
```

### Slave候補作業

```bash
# tarを展開。パーミッション要チェック
cd /var/lib/mysql
mv /path/to/targetdb.tar .
tar xfv targetdb.tar
```

mysqld再起動して、

```sql
CHANGE MASTER TO
  MASTER_HOST='192.168.33.101',
  MASTER_USER='repl',    
  MASTER_PASSWORD='replpass',
  MASTER_LOG_FILE='mysql-bin.000009', -- 控えたbinログファイル名
  MASTER_LOG_POS=540; -- 控えたPosition

START SLAVE;

-- 問題なくレプリケーションしているか確認
SHOW SLAVE STATUS;
```

## 既存Slaveから新たにSlaveを作成する場合

「Slaveを1から作成する場合」と同じく事前準備をする

### Master作業

```sql
-- レプリケーション用ユーザーの作成
GRANT REPLICATION SLAVE ON *.* TO repl@192.168.33.103 IDENTIFIED BY 'replpass';
```

### 既存Slaveでの作業

```sql
-- IO_THREADを停止する
STOP SLAVE IO_THREAD;

-- Read_Master_Log_PosとExec_Master_Log_Posが同一になるまで待つ
-- Master_Log_File、Read_Master_Log_Posの値を控えておく
SHOW SLAVE STATUS\G

-- Key_blocks_not_flushedが0であることを確認
SHOW STATUS LIKE 'Key_blocks_not_flushed';

-- InnoDBの場合、Log sequence numberがLog flushed up toと等しいことを確認
SHOW ENGINE INNODB STATUS\G

```

データベースのコピーを取る

```bash
cd /var/lib/mysql

# InnoDBの場合ibdata1も含む
tar cvf targetdb.tar targetdb ibdata1

# scp等でtarをSlave候補に送る
```

```sql
-- レプリを再開する
START SLAVE;

-- 問題なくレプリケーションしているか確認
SHOW SLAVE STATUS;
```

### Slave候補作業

```bash
# tarを展開。パーミッション要チェック
cd /var/lib/mysql
mv /path/to/targetdb.tar .
tar xfv targetdb.tar
```

mysqld再起動して、

```sql
CHANGE MASTER TO
  MASTER_HOST='192.168.33.101',
  MASTER_USER='repl',    
  MASTER_PASSWORD='replpass',
  MASTER_LOG_FILE='mysql-bin.000009', -- 控えたbinログファイル名
  MASTER_LOG_POS=787; -- 控えたPosition

START SLAVE;

-- 問題なくレプリケーションしているか確認
SHOW SLAVE STATUS;
```
Xcodeでビルドしたアーカイブのお掃除

ほんとすぐ忘れるので…。これやっておかないとPCのディスクがあっという間にビルドしたアーカイヴでパンパンになります。

Window -> Organizer
を選択すると以下のような画面が出てくるので、ここから不要なアーカイヴを右クリック→Delete Archive.. で削除できます
![image](https://qiita-image-store.s3.amazonaws.com/0/57477/37a5a8dd-2b4d-b134-324c-deb1e6f2aff0.png)
jbuilder使用時にlayoutが適応されないときの対処法

Rails4からjsonを吐き出すとき、[jbuilder](https://github.com/rails/jbuilder)を使うと便利です。
jsonを吐くとき、すべてのレスポンスを一定の形式に収めるようにすることがあると思いますが、その際はlayoutを指定することで通常のテンプレートと同じように使うことができます。
ref. [Jbuilder で 共通パラメータを付与したい時は Layout を使うといいかも](http://vimtaku.github.io/blog/2014/03/28/jbuilder-layout/)

この際、renderメソッドでlayoutを指定することができますが、以下のようにしてしまうとlayoutがうまく適応されません。

```rb
render json: {hoge: "hoge"}, layout: "fuga"
```

このような場合、以下のようにすると動くようになります。(若干気持ち悪いですが)

```rb
render text: {hoge: "hoge"}.to_json, layout: "fuga"
```


参考: [Render json with layout](https://github.com/rails/jbuilder/issues/235)
Sublime Text 3のGitプラグインで、日本語コミットできるようにする


Sublime Text3で、Gitのプラグインを利用するとSublime Textからコミットができて非常に便利です。

ただ、日本語ではコミットできません。

以下はその場合の対処法です。

1. 以下のフォルダをコピー
 
 ```
/Users/"YOURNAME"/Library/Application Support/Sublime Text 3/Installed Packages/Git.sublime-package
```
2. 以下のディレクトリ配下にはりつけ

 ```
/Users/"YOURNAME"/Library/Application Support/Sublime Text 3/Packages
```

3. 名前を変更

 Git.sublime-package -> Git.zip

4. 同じディレクトリ内で解凍し、Git.zipは削除
5. 解凍したGitディレクトリ内のCommit.py以外は全て削除
6. Commit.pyを開き、124行目当たりを以下の通り変更

```python
self.message_file = message_file
        # and actually commit
        with open(message_file.name, 'r', encoding='utf-8') as fp: #ここでUTF-8を指定
             self.run_command(['git', 'commit', '-F', '-', self.extra_options],
             self.commit_done, working_dir=self.working_dir, stdin=fp.read())
```
[PHP] GoogleAnalyticsでデバイスごとのPV数を取得しよう

備忘録
PV数とはいってもパソコンからなのか、スマホからなのかも気になる所。
というとこで、PHPからGoogleAnalyticsのPV数を取得する際に、PV数をデバイスごとに分けてみましょう。

## サンプル
サンプルではPC/モバイル/タブレットごとのPV数を日付別/順で取得しています。
### コード
基本は「[[PHP]GoogleAnalyticsからPV数を取得するまで](http://qiita.com/tutida/items/13ecf0cfd5e2af01e8a9) 」を参照
上記のサンプルプログラムの`$option`を以下のように編集  

```php
//メトリクス：取得するデータ ga:pageviewsはPV数
$metrics = "ga:pageviews";

//オプション
$option = [
    "dimensions" => 'ga:date, ga:deviceCategory', //ディメンション：区切り 日付/デバイスで分ける
    "max-results" => 10000, //最大取得件数 10000がAPIの上限
    "sort" => "ga:date", //ソート 日付順
];
```

### 結果
こんな感じに、desktop/mobile/tabletごとに取得可能

```php
array(
        (int) 0 => array(
                (int) 0 => '20151024',
                (int) 1 => 'desktop',
                (int) 2 => '62'
        ),
        (int) 1 => array(
                (int) 0 => '20151024',
                (int) 1 => 'mobile',
                (int) 2 => '220'
        ),
        (int) 2 => array(
                (int) 0 => '20151024',
                (int) 1 => 'tablet',
                (int) 2 => '36'
        ),
        (int) 3 => array(
                (int) 0 => '20151025',
                (int) 1 => 'desktop',
                (int) 2 => '87'
        ),
        (int) 4 => array(
                (int) 0 => '20151025',
                (int) 1 => 'mobile',
                (int) 2 => '289'
        ),
        (int) 5 => array(
                (int) 0 => '20151025',
                (int) 1 => 'tablet',
                (int) 2 => '32'
        )
)
```

## メトリクス/ディメンション
メトリクスは取得をしたい値を設定。
ディメンションは取得した値の区切りを設定します。

今回の場合：デバイスごとの日別PV数
取得する値は「 PV数」
PV数の区切り方「デバイス」と「日数」となり上記のサンプルのようになる

### Dimensions & Metrics Explorer
https://developers.google.com/analytics/devguides/reporting/core/dimsmets  
ここでどんなディメンションやメトリクスがあるのか調べることが出来ます。
モバイル系の何かを取得したいときには検索窓に「Mobile」とかいれると関連するもろもろが出てきます。
### Query Explorer
https://ga-dev-tools.appspot.com/query-explorer/
GoogleAnalyticsを利用しているアカウントでアクセスをすると、Web上でお試しでクエリーを走らせることが出来ます。
コードで実行する前にこちらで検証できるので楽。
シェルスクリプトでファイルの更新日時がＮ時間前かチェックする

# stat を使う

`stat` でファイルの更新日時を取得して `date` の現在日時と比較する

```sh
[ $(( $(date +%s)0 - $(stat -c %Y FILE)0 )) -gt $((60 * 60 * 4)) ]
```

`$(stat -c %Y FILE)0` の最後の 0 はファイルが存在しなかったとき用。


# find を使う

`find` の `-mmin` で更新日時で検索する。

```sh
[ "$(find FILE -mmin -$((60*4)) | wc -l)" -eq 0 ]
```

# 動作確認

上の2つを関数にする。

```sh
function f1()
{
  [ $(( $(date +%s)0 - $(stat -c %Y "$1")0 )) -gt $((60 * 60 * 4)) ]
}

function f2()
{
  [ "$(find "$1" -mmin -$((60*4)) | wc -l)" -eq 0 ]
}
```

確認のためのファイルを作成。

```sh
touch -d "now"     01.txt
touch -d "-6 hour" 02.txt

ll 01.txt 02.txt 
#=> -rw-r--r-- 1 ngyuki wheel 0 Oct 29 14:45 01.txt
#=> -rw-r--r-- 1 ngyuki wheel 0 Oct 29 08:45 02.txt
```

試してみる。

```sh
f1 01.txt && echo old || echo new
#=> new

f1 02.txt && echo old || echo new
#=> old

f1 03.txt && echo old || echo new
#=> stat: cannot stat ‘03.txt’: No such file or directory
#=> old

f2 01.txt && echo old || echo new
#=> new

f2 02.txt && echo old || echo new
#=> old

f2 03.txt && echo old || echo new
#=> find: ‘03.txt’: No such file or directory
#=> old
```
OpenCVを使う時のメモ（ライブラリ関係）

opencvを入れるときにlibやらdllやらdylibやら，毎回忘れたり説明するのがややこしくてたまらないのでメモを残す．

1. ヘッダーファイル(.h)
関数定義されているファイル．ビルドするときにわかっている必要があるので，追加のインクルードディレクトリにヘッダファイルのフォルダ（opencv2フォルダがみえるところ）を指定しておく．MacではHeader search pathに指定する．

2. ライブラリファイル(.lib)
OpenCVを使う上ではリンク用のファイル．Windows環境でビルドするときに，使っている関数がどのdllファイルにあるのかを示してくれる．ビルドするときにlibファイルの場所とどれを使うかはわかっている必要があるので，visual studioでは追加のライブラリディレクトリとしてライブラリの入っている場所を指定し，追加の依存ファイルに使うライブラリを追加しておく．pragmaを使う方法もある．

3. ダイナミックリンクライブラリ(.dll)
Windows環境でプログラムを走らせる場合，このdllファイルにopencvの機能が入っているので，exe単体では動かない（静的リンクという動かす方法もあるが，ファイルサイズが大きくなる）．よって実行時に場所がわかっている必要があるので，環境変数にdllファイルが有る場所を指定するのが一般的．一応実行ファイルと同じフォルダにdllを置いても動く．

4. Macでのダイナミックリンクライブラリ(.dylib)
libファイルの役割も兼ねている感じがする．Xcodeではビルド時にLibrary search pathにこのファイルを含むフォルダが指定され，さらにLink Binary with Librariesに使うライブラリが登録されていないといけない．
optperseのヘルプの編集


optperseにデフォルトで提供されているヘルプの編集方法について
ネット等で調べると、下記のようなサンプルが多くヒットする。

```sample1.rb
require 'optparse'

option={}
OptionParser.new do |opt|
  opt.on('-a', 'comment')	 {|v| option[:a] = v}
  opt.on('-b VAL', 'VALは必須') {|v| option[:b] = v}
  opt.on('--cd [VAL]', 'VALは無くてもいい') {|v| option[:c] = v}
  
  opt.parse!(ARGV)
end
p option
```
```bash
$ ruby sample1.rb -a -b a --cd
{:a=>true, :b=>"a", :cd=>nil}

$ ruby sample1.rb -h
    -a                               comment
    -b VAL                         VALは必須
        --cd [VAL]                 VALは無くてもいい
```

これでもいいんだけど、やっぱりgetoptを使って簡単にヘルプを表示したい！
ということで、色々探してたら見つかった。

```sample2.rb
require 'optparse'

option = OptionParser.new do |opt|
  opt.on '-a', 'comment'
  opt.on '-b VAL', 'VALは必須'
  opt.on '--cd [VAL]', 'VALは無くてもいい'
end.getopts
p option
```
```bash
$ ruby sample2.rb -a -b a --cd
{"a"=>true, "b"=>"a", "cd"=>nil}

$ ruby sample2.rb -h
    -a                               comment
    -b VAL                         VALは必須
        --cd [VAL]                 VALは無くてもいい
```

うーん、簡単にかけてるような、あんまり変わらないような...

参考にさせて頂いたサイト
http://apehuci-kitaitimakoto.sqale.jp/apehuci/?date=20120802
pytestメモ

前回の投稿でタグにpytestと書いておきながら「pytest使ってます」しか書いてなかったので、忘備録的なものを。

# 準備
```
pip install pytest
pip install pytest-django
pip install pytest-pythonpath
```

あとはpytest用のsettingsファイルを作成。

# 基本
test_hoge.pyというファイルを作成して

```lang:test_hoge.py
import pytest

@pytest.mark.django_db(transaction=True)
def test_hoge(self):
  result = foo.get_money(id=1)
  assert result == 100
```
そして
```
py.test test_hoge.py --create-db（もしくは--reuse-db）
```
でテストを実行。ファイル名でなく、ディレクトリを指定するとそのディレクトリ内のテストすべてを実行します。
メソッド名の「test_」を取るとそのテストは実行しません。

# よく使うもの
テスト用のファイルに記述されているテストすべてに対して、実行する前にこのsetup()が行われます。
よくやるのはユーザ作成とか、テストの前準備の処理。
## setup()
```
def setup(self):
  hoge()
```

## teardown()
各テストの終了時に実行する処理を記述します。
setup()でマスタデータをテスト用のデータに置き換えてテストをした場合、元に戻す処理を入れてます。

```
def teardown():
  foo()
```

## pytest.raises(Exception)
例外がきちんと発生しているかチェックするときに使います。
Exceptionが発生すればテストは正常結果が返ります。

```lang:hoge.py
[テスト対象]
class Hoge():
  def foo(id):
    try:
      return ItemMaster.get(id)
    except DoesNotExist:
      raise IllegalIdError
```
```lang:test_hoge.py
import pytest
import IllegalIdError

@pytest.mark.django_db(transaction=True)
def test_foo():
  with pytest.raises(IllegalIdError):
    Hoge.foo(-100000)
```

## pytest.mark.skipif("条件")
条件を指定してテストをスキップさせます。
テストを実行した際にスキップされると結果に「s」が表示されるので、メソッド名の「test_」を取って実行させないよりも「テストが行われなかった」というのが分かりやすいです。

```lang:test_hoge.py
@pytest.mark.skipif("True")
def test_hoge(self):
  assert is_hoo(id=1)
```
↑この場合は必ずスキップされます。
Git リモートブランチをcheckoutする

よく忘れるので備忘録

#リモートリポジトリのclone

```sh
 # git clone git@host:hoge/hoge.git
 # git branch
 * master
```

#リモートブランチのcheckout

リモートブランチの確認

```sh
 # git branch -r
 origin/HEAD -> origin/master
 origin/develop
 origin/master
```

リモートブランチのcheckout

```sh
 # git checkout -b develop origin/develop
 # git branch
 * develop
   master
```

でdevelopブランチがcheckoutできる。
UniRxのCreateを使う


`Observable.Create<T>`ではobserverが渡ってくるので、それを使って柔軟にStreamを発火させる。
戻り値にDisposableが必要なので`Disposable.Create(~)`でDisposableを作成し返している。

```lang:Create
		var createStream = Observable.Create<int> (observer => {
			observer.OnNext (0);
			observer.OnCompleted ();
			return Disposable.Create (() => {
				print ("Dipose");
			});
		});

		createStream.Subscribe (hoge => print ("test1:" + hoge));



```
config.ruで色々やってるrackアプリケーションをrspecでうまくテストする

# 概要
config.ru内で色々設定している場合、単純にrackアプリケーションのインスタンスを作成してもうまく動作しないときは`Rack::Builder.parse_file`を使おう

# config.ru
```ruby:config.ru
use Rack::Reloader
use AppLog, logger
use Rack::CommonLogger, logger
use Rack::Config do |env|
  env['fugafuga.app_dir'] = File.dirname(__FILE__) #この辺りが設定されない
end

map '/hogehoge' do #ここも設定されない
  run hogehoge::fuga.new
end

map '/foobar' do #ここも設定されない
  run foobar::Server.new
end
```
# 通常のパターン

```ruby:specfile.rb
describe 'テスト'
  def app
    @app ||= MainApp #rackアプリケーションのインスタンス
  end
.
.
.
end
```

# Rack::Builder.parse_fileを使う

```ruby:specfile.rb
describe 'テスト'
  APPS = Rack::Builder.parse_file(File.expand_path("#{File.dirname(__FILE__)}/../config.ru")) #config.ruへのパス

  def app
    APPS.first #APPS[0](=APPS.first)→rackアプリケーションのインスタンス
  end
.
.
.
end
```
UniRxのFromCoroutineを使う


`Observable.FromCoroutine`は`OnNext,OnError,OnCompleted`のstreamの発火をIEnumerator側に任せます。
IEnumerator側では、コルーチンを使って時間軸を自由に進めながら柔軟に発火することができる。


```lang:FromCoroutineのtest
void Start ()
	{
		
		Observable.FromCoroutine <int> (observer => Test1 (observer))
			.Subscribe (hoge => print ("hoge:" + hoge), () => print ("OnCompleted"));
	}

	//引数にIObserver。observerを使って自由にOnNext,OnError,OnCompleteを発火させることができる
	IEnumerator Test1 (IObserver<int> observer)
	{
		//任意のタイミングでOnNext発火！
		observer.OnNext (0);
		//コルーチンを使うことも簡単
		yield return new WaitForSeconds (1);
		observer.OnNext (1);
		yield return new WaitForSeconds (1);
		observer.OnNext (2);
		yield return new WaitForSeconds (1);
		observer.OnCompleted ();
	}
```
モデルに hashメソッドを定義すると update出来なくなる


小ネタですが、けっこうな時間はまったので、メモです。

こんな感じのエラーが出ました。

```
TypeError (no implicit conversion of String into Integer):
  app/controllers/hoges_controller.rb:59:in `block in update'
  app/controllers/hoges_controller.rb:58:in `update'
```

rails console でも Hogeのインスタンスで、updateが出来なくなっていました。
saveは出来るのでさっぱり？？？です。
結局、変更箇所をちょっとずつ戻しながら原因を特定しました。
犯人はこれでした。

```ruby:app/models/hoge.rb
class Hoge < ActiveRecord::Base
  # (中略)
  
  def hash
    # hashとsaltを切り分けて hash返すような機能を実装してた
  end
end
```

Object#hash を上書きしてしまったが故の、謎のエラー発生だったのでした。
メソッド名を変更して無事解決しました。
Simple Map でレスポンシブ化する方法

## 地図を簡単に表示できる Simple Map プラグイン

WordPress でお店のサイトとか作ってると、Google Map で地図を表示させたいことが多々あります。
そんな時、Simple Map プラグインを使うと、以下のようなショートコードで簡単に地図を表示させることができて非常に便利です。

> [map addr="東京都千代田区千代田1-1"]皇居[/map]

- [WordPress › Simple Map « WordPress Plugins](https://ja.wordpress.org/plugins/simple-map/)
- [Simple Map – 超簡単＆スマフォ対応のGoogle Map | Firegoby](https://firegoby.jp/wp/simple-map)

## レスポンシブ化されない？

ただこのプラグイン、作者様のサイトではレスポンシブ対応となってるのですが、そのままの大きさで表示されることがあります。
使ってるテーマにもよるんでしょうけど。。

そんな時は、テーマの style.css に以下のコードを追加するとうまくレスポンシブ化されて表示されるようになります。

```css:style.css
.simplemap {
  max-width: 100%;
}
```

- [Simple Mapプラグインを使用した場合マップのズームアイコンが表示されない | BizVektor-Forum](http://forum.bizvektor.com/forums/topic/simple-map%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3%e3%82%92%e4%bd%bf%e7%94%a8%e3%81%97%e3%81%9f%e5%a0%b4%e5%90%88%e3%83%9e%e3%83%83%e3%83%97%e3%81%ae%e3%82%ba%e3%83%bc%e3%83%a0%e3%82%a2%e3%82%a4/)
- [レスポンシブWEBデザインの基本　max-widthで中央揃えレイアウト | スマートフォン＆モバイルEC事例ノウハウ集｜モバイルファーストラボ](http://www.aiship.jp/knowhow/archives/16724)

お困りの方がいればお試しあれ。
UniRxのObservable.FromEventを使う

忘れないようにメモ
Observable.FromEventはEventをStreamに変換してObservableを返す。

```lang:FromEventの一番単純なやつ(Action)
event Action OnClickEvent;//引数・戻り値のない単純なAction

Observable.FromEvent (
	h => OnClickEvent += h,//Eventに登録するだけ
	h => OnClickEvent -= h)//Eventに解除するだけ
	.Subscribe (_ => print ("hoge"));//Eventが発火した時に OnNextされる
```

```lang:FromEventのAction<int>引数あり
event Action<int> OnClickCountEvent;

Observable.FromEvent<int> (//ジェネリックで引数の型を指定
	h => OnClickCountEvent += h,//Eventに登録するだけ
	h => OnClickCountEvent -= h)//Eventに解除するだけ
	.Subscribe (count => print ("ClickCount:" + count));//OnNextにintが来るのでSubscribeで受け取れる
```

```lang:FromEventのAction<int>引数あり
event Action<int> OnClickCountEvent;

Observable.FromEvent<int> (//ジェネリックで引数の型を指定
	h => OnClickCountEvent += h,//Eventに登録するだけ
	h => OnClickCountEvent -= h)//Eventに解除するだけ
	.Subscribe (count => print ("ClickCount:" + count));//OnNextにintが来るのでSubscribeで受け取れる
```

```lang:FromEventの独自Eventの場合
public delegate void OnComplate (string msg);
public event OnComplate onComplateEvent;

Observable.FromEvent<OnComplate,string> (//ジェネリック<1,2>となる。1にEventの型を、2に引数の型を入れる
	//h => msg => h (msg),//丁寧に書くとこう
	h => h.Invoke,//これでも大丈夫
	h => onComplateEvent += h,//Eventに登録するだけ
	h => onComplateEvent -= h)//Eventに解除するだけ
	.Subscribe (x => print ("OnComplateCallback:" + x));//ジェネリックの2で指定した型が来るのでSubscribeで受け取る
```
Unityの機嫌が悪くなった時の対処

急にUnityEditor上で以下のようなログが出始める。なんのことだかさっぱり。

```
Asset '/Applications/Unity4.6.8p4/Unity.app/Contents/UnityExtensions/Unity/GUISystem/4.6.8/UnityEngine.UI.dll' is in timestamps but is not known in guidmapper...
```

![image](https://qiita-image-store.s3.amazonaws.com/0/57477/69a3bd5e-dbd9-fff4-f83e-d801ecd013d5.png)


http://issuetracker.unity3d.com/issues/unityengine-dot-ui-dot-dll-is-in-timestamps-but-is-not-known-in-guidmapper-dot-dot-dot-1

上記の中で触れられているように、Assets->Reimport Allを実行してみる(20分近くかかります。なんならUnityが落ちますが、再度立ち上げなおせば処理が再実行されます)。

![image](https://qiita-image-store.s3.amazonaws.com/0/57477/23389627-019f-7aee-9874-a541f3cae7a9.png)

これ以外に、Unityを停止させた状態で プロジェクト直下にある Library配下のファイルを全て消す事でも同様の処理が行われるものと思われます(但し、この方法だとswitch platformしていた環境がPC Mac & Standaloneにもどってしまいます)。

これですっきり解決。
なのですが、なぜ機嫌を悪くされたのかは不明なので、再発したらもう一度調査してみる事にします。
(おそらく、git pull などで巨大なマージが走り、Assets配下が一気に書き換わりすぎて事故った、みたいなケースなのかな…と思ってます。普段はgit pullする際にUnity落としたりしてないのですが、大きめの更新が走る事がわかっている場合は一旦Unityを落としてからgit pullした方がいいかもしれませんね)
Macでコマンド一発でメモリ解放を行う方法


`purge`というコマンドがあります。しかし、そのままではパスワード入力が必要です。ということで、`/etc/sudoers`を編集しましょう。`visudo`で編集したほうが安全です。

```bash:/etc/sudoers
%admin ALL=(ALL) NOPASSWD: /usr/sbin/purge
```

これで、メモリ解放も一発ですね。
Twieetをリアルタイムで取得、形態素解析集計




前提:sbtとscalaが使用できる状態



#### $WORK/build.sbtの設定

``` scala:build.sbt
name := "spark-streaming-twitter"

version := "0.0.1"

scalaVersion := "2.11.7"

organization := "org.test"

scalacOptions ++= Seq("-Xlint", "-deprecation", "-unchecked", "-feature")

updateOptions := updateOptions.value.withCachedResolution(true)

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-streaming" % "1.3.1" % "provided",
  "org.apache.spark" %% "spark-streaming-twitter" % "1.3.1" exclude("org.spark-project.spark", "unused"),
  "org.apache.lucene" % "lucene-analyzers-common" % "5.2.1",
  "org.apache.lucene" % "lucene-analyzers-kuromoji" % "5.2.1"
)
```

#### $WORK/src/main/resources/twitter4j.propertiesの設定

``` scala:twitter4j.properties
oauth.consumerKey=xxxxxxxx
oauth.consumerSecret=xxxxxxxx
oauth.accessToken=xxxxxxxx
oauth.accessTokenSecret=xxxxxxxx
```

#### $WORK/src/main/scala/org/test/spark/spark-streaming-twitter.scalaの設定

``` scala:spark-streaming-twitter.scala
package org.test.spark

import org.apache.lucene.analysis.ja.JapaneseAnalyzer
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute
import org.apache.spark.SparkConf
import org.apache.spark.streaming.twitter.TwitterUtils
import org.apache.spark.streaming.{Durations, StreamingContext}

object TwitterStreaming {
  def main(args: Array[String]): Unit = {
    //sparkconf 設定
    val conf = new SparkConf().setAppName("Twitter Streaming")
    // sparkstreamcontext設定
    val ssc = new StreamingContext(conf, Durations.minutes(1L))
    val filter = if (args.isEmpty) Nil else args.toList
    val stream = TwitterUtils.createStream(ssc, None, filter)

    stream
      //flatMap->stream内の要素を調べてstreamに返す
      .flatMap { status =>
      val text = status.getText

      val analyzer = new JapaneseAnalyzer
      val tokenStream = analyzer.tokenStream("", text)
      val charAttr = tokenStream.addAttribute(classOf[CharTermAttribute])

      //resetメソッドを呼んだ後に、incrementTokenメソッドでTokenを読み進めていく
      tokenStream.reset()

      try {
        Iterator
          .continually(tokenStream.incrementToken())
          .takeWhile(identity)
          .map(_ => charAttr.toString)
          .toVector
      } finally {
        tokenStream.end()
        tokenStream.close()
      }
    }
      .map(word => (word, 1))
      .reduceByKey((a, b) => a + b)
      .saveAsTextFiles("log/twitter")

    ssc.start()
    ssc.awaitTermination()
  }
}

```

#### $WORK/project/plugin.sbtを設定する

``` scala:plugin.sbt
logLevel := Level.Warn

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.13.0")
```

#### jarファイル作成

```
sbt assembly
```

#### 実行

```
spark-submit --class org.test.spark.TwitterStreaming target/scala-2.11/spark-streaming-twitter-assembly-0.0.1.jar 
```

#### 終了

```
control+cで強制終了
```

#### logの保存場所
$WORK/log/twitter-[unixtime]

#### 形態素解析結果+count

```
(墓地,1)
(オール,1)
(tweet,5)
(金賞,2)
(クッキ,1)
(超,4)
(役割,1)
(洋書,2)
(コピペ,1)
(かんぱ,2)

```

[参考URL](http://d.hatena.ne.jp/Kazuhira/20150819/1439997051)
実体の無い Property を定義する

という呼び名が正しいのか不明ですが。

はい
====

こういうことが出来ます。

```kotlin:
object O {
    var x: String = "x"
    var y: String
    set(value: String) {
        privY = value
    }
    get() {
        return privY
    }
    private var privY: String = "y"
}
```

y の setter/getter 内で field を使っていないので、y に実体は無く実質 privY の setter/getter として機能させることが出来ます。実体が無いので初期値も不要です、というより set/get 内で field を使っていないので初期値が定義出来ないと言われます。賢い…。

何が嬉しいか
==========

そもそもは [Kotpref](https://github.com/chibatching/Kotpref) というライブラリを使おうとしており、これは README にあるようにシンプルな感じで Android の `SharedPreferences` を扱うことが出来ます。

ところで `SharedPreferences` の読み書きを行う前に処理を行いたい場合が出て来たんですが、Delegated Properties を用いている場合は自前の Setter/Getter が定義出来ず[^1]、その為にメソッドを定義するのもイケてないので色々やってたらいい感じになりました。これは Base64 encode/decode をする例です。

```kotlin:
object O: KotprefModel() {
    var b: Bitmap
    set(bitmap: Bitmap) {
        val bos = ByteArrayOutputStream()
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos)
        val byteArray = bos.toByteArray()
        realP = Base64.encodeToString(byteArray, Base64.DEFAULT)
    }
    get() {
        val byteArray = Base64.decode(realP, Base64.DEFAULT)
        return BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size)
    }

    private var realB by stringPrefVar()
}
// // // //

O.b = Bitmap(…)
val bitmap: Bitmap = O.b
```

結局余分な Property が増えることにはなるので何を持って綺麗と言うかは好みが分かれると思いますが、set/get 内で field を使わない場合にいい感じに賢く解釈してくれたのが嬉しくて勢いで記事を書いたというのが本質です。あと独自メソッドを使わなくても Property ライクに参照、代入っぽく kotlin っぽく扱えるのがいいですね。

強い人達が適切な方法をコメントしてくれることを願って、この記事は以上とします。

[^1]: 多分やる方法がありそうなんですが見付けきれませんでした。
私がいまやっているデータ分析の現状を雑に書く、成功と失敗について

昼休みに15分で雑に書く
現状の確認。
ヤマなしオチなし意味なし

# 前振り
最近データ計測と分析で「先行指標、遅行指標」と「現象と指標の時差」が一段落した。
そこで次の取り組みに移った。
施策単位で「この施策は狙い通りに有効に機能したか、予想外の正負の効果を出していないか」を観測できるようにしている。

# 指標の変え方
施策単位で観測方向が違うので指標も施策単位で変える。
例えばプレイ頻度を上げる施策ならログイン頻度の回数や間隔時間を見る
「この機能にハマったか、興味を示したか」なら最初の３回と５回目〜１０回目の１回のプレイ時間を見る。


# 問題は精度
ユーザーデータをちゃんと計測できている場合はそれなりにまともな解析データの結果が出るようになった。
問題は精度である。

精度が80%ぐらいの監視対象のユーザー動向を拾えていればまともな解析データが出る。
(なおパーセンテージは感覚値)
60%でも「とりあえず大きくは外れてはいないだろう」という解析データが出る。
問題はそれ以下が多いこと。

収穫逓減の法則が働くので精度100%は目指さない。
広域監視するアノーマリー対策のカナリア検知の方でカバーする。

# バンドの分け方
精度を４つのバンドに分類して解析している。
### 精度70%~100%のバンド ：
かなり信頼できる
ユーザーの動向を正確に把握し、どこでハマったか、どこでマインドが変わったか、どこでモチベーションを持ったか、どこで離脱したかなどほしい情報が正確に取れる。

### 精度50%~70%のバンド ：
大きくは外れない
ユーザーの動向を粗く把握できる。取りこぼしもある。
はまった場所や特徴的な動きを見せる場所がどこかのアタリは付けられる。
問い合わせやエゴサーチなどからの補強で次の改善に役立てられる。

### 精度30%~50%のバンド ：
参考情報程度
ユーザーの動きを部分的に検知できる。取りこぼしが多いので観測不能部分は仮説で補うしかない。
仮説に基づいて次回の観測ソナーポイントの投下や埋め込みを行う。
仮説は複数たつし、外すので次回まともなデータが取れるかは不明。
部分情報をプロダクトデザイナーに渡して仮説の参考にしたりすることはできる。

### 精度 0%~30%のバンド ：
全く役に立たない。
ただ一つ分かっているのは「この仮説と計測方法は誤っていた」ことだけ。
実際に施策は投下されているので、ユーザーにはなんらかの正負の効果を発揮しているが、それがなにか分からない。
問い合わせやエゴサーチなどから片鱗はわかるが、基本的に「何者かがいる暗闇の部屋を歩き回っている状態」なのでリスクが高いし早急な対応が必要なこともある。
ユーザー動向を掴む「ログイン間隔」や「課金率」などに大きな動きがなくても、他の指標の純粋性を汚すので、そこから分離するために動きは掴みたい。
例外的に「いまの技術では計測できない。しかしこの施策は打ちたい」というケースも存在する。

このバンドへの対応策としてはプロダクトデザイナーのリソースを厚く振ればチェック可能だが、逼迫気味のプロダクトデザイナーのリソースを食うためそれなりに厄介。

# 現状
### 低精度
最後の「精度 0%~30%のバンド」が一番厄介で１割程度の施策で発生する。
改善できてようやく１割なので、それなりにつらい。
プロダクトデザイナーの時間を食いつぶしているので改善したい。
あるいはコストを抑えてリスク対策できればそれでもいい気はする。

### 高精度
「精度70%~100%のバンド」を２割程度出せるようにした。
明確に現状がわかるので、次の施策を打つ時の計画作りの「照明弾」として有効に機能している。

### 中精度
「精度30%~50%のバンド」「精度50%~70%のバンド」が７割。
UXの動きを知る参考情報として機能するので、このままでもありがたいが、より高い精度でほしい。
ただし、精度を上げるにはコストがかかるので、データ分析の技量向上によるコストパフォーマンスの向上を狙いたい。
ユーザー量が増えればデータ量も増えて、自然と精度が上がるというケースがあり、現状でユーザー数は順調に増えているので、それを狙いたいという意識もそれなりにある。
BackWPup の最新版で日本語化する方法

## 最新版では日本語化されなくなった BackWPup

BackWPup という非常に便利なプラグインがあります。
「毎日午前３時にDBだけバックアップしたい！」というような要望を、管理画面からポチポチ設定するだけでやってくれる優秀な子です。

- [WordPress › BackWPup Free - WordPress Backup Plugin « WordPress Plugins](https://ja.wordpress.org/plugins/backwpup/)
- [BackWPupでWordPressを定期的にバックアップする | いわしブログ](http://wind-mill.co.jp/iwashiblog/2015/02/wordpress-backup-backwpup/)

そんな優秀な BackWPup ですが、最新版の 3.2.1 では日本語化ファイルが削除されて使いづらくなってしまいました。

でも実は削除された言語ファイルの復元方法が用意されてるので、改めて日本語化して使うことが可能なのです。

## 言語ファイルは別の場所にあり

BackWPup のリリースノートを見ると、しっかりと書いてあります。

- [WordPress › BackWPup Free - WordPress Backup Plugin « WordPress Plugins](https://ja.wordpress.org/plugins/backwpup/changelog/)

```bash
Version 3.2.1
■ Fixed: open basedir check
■ Fixed: Change Zip creation back to use lower resources
■ Fixed: Deletion of backup files on Dropbrox not refreshes
■ Fixed: Delete 'doing_cron' transient before job starts
■ Added: Support for new Amazon S3 storage type 'Standard-Infrequent Access'
■ Added: Support for MYSQL_CLIENT_FLAGS
■ Updated: AWS SDK to Version 2.8.21 (PHP 5.3.3+)
■ Removed: SIGCONT,SIGCHLD,SIGALRM form signal handler
■ Free Removed: Bundled translations. Will be now come from
  https://translate.wordpress.org/projects/wp-plugins/backwpup
■ Pro Updated: Google SDK to Version 1.1.4
```

BackWPup には Free版と Pro版とがあるのですが、どうやら Free版で最初から導入されてた英語以外の言語ファイルが全て削除されたようですね。
自分は Pro版を導入してないのでわかりませんが、英語以外の言語ファイルが欲しければ Pro版にするか自分で用意しろってことみたいです。

言語ファイルのためだけに Pro版にするつもりもないので、リリースノートに書かれてるリンク先から日本語ファイルだけ持ってくることにします。

- [WordPress › BackWPup Free - WordPress Backup Plugin < GlotPress](https://translate.wordpress.org/projects/wp-plugins/backwpup)

上記のリンク先から Stable (latest release) → Japanese と進み、一番下のプルダウンから .po と .mo をそれぞれ Export してファイルを保存します。

その後、保存したファイル名を以下のように変更します。

|変更前|変更後|
|:-:|:-:|
|wp-plugins-backwpup-stable-ja.po|backwpup-ja.po|
|wp-plugins-backwpup-stable-ja.mo|backwpup-ja.mo|

最後に、名前を変更した２つのファイルを以下のフォルダにコピーします。

> $WP_HOME/wp-content/languages/plugins

- [WordPressの翻訳用のファイルがどうやって読み込まれているのかを調べてみた | Shinichi Nishikawa's](http://nskw-style.com/2014/wordpress/code-stealing/loading-translation-files.html)

これで BackWPup の管理画面が日本語化されてるはずです。
簡単ですね。

## BackWPup が更新されても大丈夫

余談ですが、言語ファイルとプラグインの保存場所が異なるので、BackWPup が更新されても日本語化ファイルが削除されるようなことはありません。
新しい設定項目が追加された場合はそこだけ英語になるでしょうけど、、その時は同じ手順で言語ファイルの方も更新してあげましょう。
月極課金への変更手段が無くなっている件

時間課金の仮想サーバーは、通信無料枠が付いていないので、アクセス数が増えたら通信量が増えていくから、月額に変えて無料枠を適用して、コスト節約したい。

以前は、ポータルのサーバー構成変更画面に、月極課金への一発切換えボタンがあったのに、今はポータルの何処を探しても、それが見つからない。 

そこで、チケットに問い合わせてみたら、以下の回答が来た。

![スクリーンショット 2015-10-29 12.43.32.png](https://qiita-image-store.s3.amazonaws.com/0/42829/8180ccdb-4998-8b15-4346-e10743a16d79.png)


テンプレート・イメージを取って、キャンセルして、月額で再注文してくれとの事だ。

一発切換えボタンの良い所は、同じIPアドレスが維持されて、テンプレートを取得しなくても良かったのだけど。。。

しかし、この廃止された切換え機能は、冗長な機能とも言えるけどね〜 (￢_￢) フーン
ソフトのメンテに行き詰まったのかね。。。
ActiveAdmin でのモデルの追加方法 (基本)

# 前提

- ActiveAdmin 本体がインストール ( rails generate ) できている状態。

# 手順

Rails のモデルを作る。

```
rails generate model book title:string author:string
```

データを作る。

```
rake db:migrate
```

ActiveAdmin のリソースを作る。

```
rails generate active_admin:resource book
```

Rails サーバーを起動する。

```
rails server
```

そしてブラウザ ( http://localhost:3000/admin/books/new ) からデータを新規登録しようとすると。。。

例外発生！

***ActiveModel::ForbiddenAttributesError in Admin::BooksController#create***

Create 出来ない。

# 解決

あとは ActiveAdmin のリソースファイルで、permit_params を指定すること！　これだけ。

```rb:app/admin/book.rb
ActiveAdmin.register Book do
  permit_params :title, :author
end
```



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
よりわかりやすいJenkinsメールを目指して

# よりわかりやすいJenkinsメールを目指して

Jenkinsが飛ばすメールを整理して
ユーザーが今すぐやらなければいけない問題が発生したのか
後でやればいいものなのか、メールで問題解決への足がかりは得られたのかを重視したメールを目指した際のメモです。

## 入れておいたほうが良いプラグイン

失敗や成功時にメールの内容を変えたりしたい、ビルドログ等をメール内容に自動で記載して欲しい等といった場合は
Ext-Emailというプラグインを入れるとその辺の機能をJenkinsに追加してくれます。
[Email Extension Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Email-ext+plugin)

## 基本的な考え方
1. メールソフトで機械的にグループしやすいもの
2. 問題の緊急度　【緊急】＞【重要】＞【なるべく】＞【後で】を明確にする
3. 中身については、失敗したジョブの案内、コミット履歴、ログパーサへのリンク、ビルドログを載せる

## サブジェクト
1. メール分配用に先頭に【$(ProjectName)_執事】タグを入れる
2. 緊急度をJIRAを例に指定　【緊急】【重要】【なるべく】【あとで】
3. 成功か失敗か別の物なのかを指定　【成功】【失敗】【警告】【定期報告】
4. 補足

といった形にします。

サブジェクトの例をいくつか提示
<pre>
優先度:緊急　ステータス:失敗 補足:x64Developビルド
【$(ProjectName)_執事】【緊急】【失敗】x64Developビルドに失敗しました
</pre>
<pre>
優先度:重要　ステータス:失敗 補足:3Dモデルのエクスポート
【$(ProjectName)_執事】【重要】【失敗】3Dモデルのエクスポートに失敗しました
</pre>
<pre>
優先度：なるべく　ステータス：警告　補足：CppCheckの確認が必要
【$(ProjectName)_執事】【なるべく】【警告】CppCheckのエラーが発生しました、確認をお願いします
</pre>
<pre>
優先度：あとで　ステータス：定期報告　補足：掃除
【$(ProjectName)_執事】【あとで】【定期報告】掃除日です。
</pre>
## 本文
ビルドや自動テストなどの内容はログパーサプラグインで分割して見やすくしているので
ジョブのページではなくログパーサプラグインが出力したページへのリンクを張り
受信者が問題の確認を1手でも短くできるようにします。
※CppCheckPluginなどが生成したページがあるならそのページへのリンクを張る。

本文の例をいくつか提示します。
<pre>
[ログパーサページがあるJobからのメール本文]
$PROJECT_NAME
${BUILD_URL}parsed_console/

前回の成功ビルド以降に更新されたファイル
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
${CHANGES_SINCE_LAST_SUCCESS}

ビルドログ
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
${BUILD_LOG}
</pre>
<pre>
[ログパーサページが無いJobからのメール本文]
$PROJECT_NAME
${BUILD_URL}console/

前回の成功ビルド以降に更新されたファイル
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
${CHANGES_SINCE_LAST_SUCCESS}

ビルドログ
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
${BUILD_LOG}
</pre>
<pre>
[CppCheckPluginを利用したJobからのメール本文]
$PROJECT_NAME
${BUILD_URL}cppcheckResult/

前回の成功ビルド以降に更新されたファイル
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
${CHANGES_SINCE_LAST_SUCCESS}

ビルドログ
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
${BUILD_LOG}
</pre>
Emacsのcsharp-modeの処理が遅くて困っている場合の対処法

# 対処療法

以下を追加．

```el
(setq csharp-want-imenu nil)
```

# Emacsが固まる．．

C#のソースコードが1500行を超えたあたりから

* 急激にスクロールが遅くなる
* 入力がすぐ反映されない

ようになってきた（常に遅いわけではない）．

このままでは気持ちよくコードが書けないので困ったな．．

# 既知の問題のようだ

csharp-modeのソースコードのコメントより．
https://github.com/josteink/csharp-mode/blob/master/csharp-mode.el#L113

意識して使ったことはないと思うが，imenuという機能に関する問題らしい．

`csharp-want-imenu`を`nil`にすることで無効化できると書かれている．
https://github.com/josteink/csharp-mode/blob/master/csharp-mode.el#L101