OmniAICreator/Qiita-1.07M huggingface dataset:
≡ を × にアニメーションするハンバーガーメニュー（ちょっと汎用性ある用）

<i class="fa fa-exclamation-triangle"></i> このハンバーガーはメニュー開閉のトリガーを想定したものですが、メニューの開閉については記していません。

## <i class="fa fa-play-circle" aria-hidden="true"></i> DEMO

![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/82699/ed5e7048-ccc2-2f7a-c2db-16fa06013b10.gif "demo.gif")

#### codepenあります
https://codepen.io/mtmtkzm/pen/GEyJww

## <i class="fa fa-file-code-o"></i> HTML

まあ、普通。

```html
<a class="hamburger">
  <span class="hamburger-item"></span>
  <span class="hamburger-item"></span>
  <span class="hamburger-item"></span>
</a>
```

## <i class="fa fa-file-text-o"></i> SCSS

ほんのすこし汎用性のある感じに、変数にサイズを持たせてみました。

```scss
$validArea:    50px; // タップ可能エリアの一辺の長さ
$menuBarWidth: 19px; // バンズ（or肉）の幅
$menuBarHeight: 2px; // バンズ（or肉）の高さ
$menuBarGap:    6px; // バンズと肉の隙間

.hamburger {
  position: relative;
  top: 0;
  left: 0;
  display: block;
  width: $validArea;
  height: $validArea;
  &.is-open {
    .hamburger-item {
      &:nth-child(1) {
        transform: translateY(0px) rotate(45deg);
      }
      &:nth-child(2) {
        transform: translateX( $menuBarWidth / 2 );
        opacity: 0;
      }
      &:nth-child(3) {
        transform: translateY(0px) rotate(-45deg);
      }
    }
  }
}

.hamburger-item {
  position: absolute;
  display: block;
  width: $menuBarWidth;
  height: $menuBarHeight;
  top: ( $validArea - $menuBarHeight ) / 2;
  left: 0;
  right: 0;
  margin: auto;
  background-color: #000;
  transition: .2s ease-out;
  &:nth-child(1) {
    transform: translateY(-$menuBarGap);
  }
  &:nth-child(2) {}
  &:nth-child(3) {
    transform: translateY($menuBarGap);
  }
}
```

## <i class="fa fa-cog"></i> その他
あとは、JavaScriptを使い `.hamburger` に `.is-open` というclassを付け外ししてやりましょう<i class="fa fa-hand-paper-o"></i>
Ubuntu13.04にjavaがインストールできない


背景

http://qiita.com/TsutomuNakamura/items/f12fdf0a8502e634584d

に従って、ubuntu 13.04(raring)にjava8を入れる




１．apt-get updateを実行すると以下のエラー

```
前略

エラー http://extras.ubuntu.com raring/main Sources
  404  Not Found
エラー http://extras.ubuntu.com raring/main i386 Packages
  404  Not Found
無視 http://old-releases.ubuntu.com raring/main Translation-ja_JP
無視 http://old-releases.ubuntu.com raring/multiverse Translation-ja_JP
無視 http://old-releases.ubuntu.com raring/restricted Translation-ja_JP
無視 http://old-releases.ubuntu.com raring/universe Translation-ja_JP
W: http://extras.ubuntu.com/ubuntu/dists/raring/main/source/Sources の取得に失敗しました  404  Not Found

W: http://extras.ubuntu.com/ubuntu/dists/raring/main/binary-i386/Packages の取得に失敗しました  404  Not Found

E: いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。
```

◇解決方法
http://ask.xmodulo.com/404-not-found-error-apt-get-update-ubuntu.html
より

```
#deb http://extras.ubuntu.com/ubuntu raring main
#deb-src http://extras.ubuntu.com/ubuntu raring main
```

２．add-apt-repository ppa:webupd8team/javaを実行すると以下のエラー

```
PPA (https://launchpad.net/api/1.0/~webupd8team/+archive/java)にアクセスできなかったため情報を取得できませんでした。インターネット接続を確認してください。
```

◇解決方法
http://dragstar.hatenablog.com/entry/2015/03/21/130333
より
環境変数にhttp_proxyなどを設定して、

```
sudo -E add-apt-repository ppa:webupd8team/java
```

３．ppa:webupd8team/javaを入れようとすると、以下のメッセージが出る

```
Oracle Java (JDK) Installer (automatically downloads and installs Oracle JDK7 / JDK8 / JDK9). There are no actual Java files in this PPA.
```

http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html
によるとubuntu 13.04はサポートされていない

→pptから入れるのは断念

https://askubuntu.com/questions/56104/how-can-i-install-sun-oracles-proprietary-java-jdk-6-7-8-or-jre

のThe manual wayに従って、Oracleのサイトからjava8を落としてきてインストールすることにする
Ude.NetStandard を利用したテキストエンコーディングの判別

テキストファイルを読み込む際に、テキストエンコーディングを判別する。

前提
-----
NuGet で、[Ude.NetStandard](https://www.nuget.org/packages/Ude.NetStandard/) をプロジェクトにインストールしておく。
Ude.NetStandard は Mozilla Universal Charset Detector の .NET 移植版。

ほかにも [NUniversalCharDet](https://www.nuget.org/packages/NUniversalCharDet/) というのがあるけれど、同じ作者さんで新しいほうを採用。

パッケージマネージャからだと以下でインストール。

```
PM> Install-Package Ude.NetStandard
```

ちなみにボクはマウスでぽちぽししました。


コード
-----

```csharp
static string detectCharset(Stream stream)
{
    var charsetDetector = new Ude.CharsetDetector();
    //charsetDetector.Reset();
    charsetDetector.Feed(stream);
    charsetDetector.DataEnd();

    return charsetDetector.Charset;
}

```

stream が進んでしまうのをもとに戻していないので、実際に stream を読む前に巻き戻さないといけない。

バイト配列を食わせていきたかったら、以下。

```csharp
static string detectCharset(Stream stream)
{
    var buf = new byte[1024];
    var charsetDetector = new Ude.CharsetDetector();
    //charsetDetector.Reset();
    do {
        int readsize = stream.Read(buf, 0, buf.Length);
        if (readsize == 0) {
            break;
        }
        charsetDetector.Feed(buf, 0, buf.Length);
    } while (charsetDetector.IsDone() == false);
    charsetDetector.DataEnd();

    return charsetDetector.Charset;
}

```



# ほかにも

- [C#で高精度なテキストファイル文字コード自動判別（2014年版） - hnx8 開発室](http://d.hatena.ne.jp/hnx8/20140824/1408844344)
- [文字コードを判別する - DOBON.NET](https://dobon.net/vb/dotnet/string/detectcode.html)
Rubyがむずかしい話

https://megurorb.connpass.com/event/55107/
Meguro.rb #2 でのLT資料です。



-------


だれこれ :cat:
==========

![pocke.png](https://qiita-image-store.s3.amazonaws.com/0/33922/f2285c81-41f5-369d-dd6f-8b2b00f55bf6.png)



- Pocke
- Actcat inc. / Engineer
- Twitter: [@p_ck_](https://twitter.com/p_ck_)
- GitHub: [@pocke](https://github.com/pocke)




-----



本題: Ruby はむずかしい :gem: 
==========

お前は自分で書いた Ruby コードの構造を理解しているのか？ :thinking: 

------

例題1) 何を出力するでしょうか
------

```ruby
print(% % %%%%)
```

(Syntax Highlight に騙されるな！)


---


こたえ :white_flower: 
------

出力されるのは`%`

```ruby
# 等しい構造のコード例
print('%' % '')
```


```bash
# 実際には改行は出力されない
$ ruby -e 'print(% % %%%%)'
%
$ ruby -e "print('%' % '')"
%
```

------


Twitter でアンケートを取ったら、サイコロの方が優秀だった :game_die: 


<blockquote class="twitter-tweet" data-lang="en-gb"><p lang="ja" dir="ltr">[アンケートになっています]<br>以下のRubyコードは何を出力するでしょうか<br>print(% % %%%%)</p>&mdash; Pocke (@p_ck_) <a href="https://twitter.com/p_ck_/status/841113905619386368">13 March 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

人間が Ruby を書くより、鉛筆転がして書いたほうがマシ

----


例題2) 単純な URL は Ruby のコード :earth_asia: 
-----

```ruby
http://example.com
```

(Syntax Highlight はウソをついている)


```bash
$ ruby -c -e 'http://example.com'
Syntax OK
```

------

こたえ :100: 
--------

例えば、こんな感じのコードを仕込めば実行できる :runner: 

```ruby
class Symbol
  def /(right)
    "Hello, #{right}!"
  end
end

def example
  Struct.new(:com).new('Ruby')
end

def http(arg)
  p arg
end

http://example.com # => "Hello, Ruby!"
```

----


例題3) 実際に RSpec であった例 :muscle: 
------


```ruby
it 'changes foo' do
  expect { subject }.to change { foo.hoge }
    .and change { foo.fuga }
    .and change { foo.poyo }
    .and change { foo.piyo }
end
```

スマートに見えるけど、これはどういう構造？？

(いい感じに書く方法があったら教えて下さい…)


-------

こたえ) 同じ構造のコード :ok_hand:
------

```ruby
expect { subject }.to(
  change { foo.hoge }.and(
    change { foo.fuga }.and(
      change { foo.poyo }.and(
        change { foo.piyo }
      )
    )
  )
)
```

------



Ruby はむずかしい！！！
=======


では、むずかしい Ruby と戦うにはどうしたらいいか :punch: :punch: :punch:




-----


Bacon Cannon 🥓 :gun: 
======


> An online Ruby parser. Support multiple Ruby versions, and multiple parsers(Ripper and Parser gem).
> https://bacon-cannon.herokuapp.com



参考リンク

- Ruby 用オンラインパーサーを作っている http://pocke.hatenablog.com/entry/2017/04/08/214225
- Bacon Cannon のアーキテクチャ http://pocke.hatenablog.com/entry/2017/04/10/141643

-------

DEMO
------


https://bacon-cannon.herokuapp.com/


------

まとめ
-----

- Ruby はむずかしい
    - Syntax Highlight に惑わされてはいけない
- Bacon Cannon を使えばむずかしい Ruby のコードを理解する手助けになる



ご清聴ありがとうございました
【Atom】使ってるパッケージ【メモ】

Atomはパッケージが豊富で非常に偉いです。
よく利用してるパッケージのメモ。

##file-icons
ファイルにアイコンを設定できる。

例：PHPだったらぞうさん。
![86.PNG](https://qiita-image-store.s3.amazonaws.com/0/151404/bdac6654-eb7d-feaf-fedb-5f6a8dc74313.png)

##open-recent
メニューバーのファイル => Open Recent
から、最近利用したファイルやプロジェクトフォルダを開ける。

##less-than-slash
HTMLタグの閉じタグを、スラッシュまで入力した時点で補完してくれる

![anigif.gif](https://qiita-image-store.s3.amazonaws.com/0/151404/e0893ae9-96aa-59e4-9613-3decc2686251.gif)

##browser-plus

ブラウザをエディタのタブとして開ける。
~~ながら作業が捗る~~
リファレンス等を横目にプログラムを書ける。

![91.PNG](https://qiita-image-store.s3.amazonaws.com/0/151404/68c5806f-90c8-56ab-b2ae-3662b2a28680.png)

##symbols-tree-view
開いてるファイル内のクラス・関数・変数の一覧を表示。
クリックで、その場所までスクロールしてくれる。

![92.PNG](https://qiita-image-store.s3.amazonaws.com/0/151404/72090937-2043-b346-bbfb-4ff6b9a33afc.png)


とりあえず、こんなところまで。
phpenvの自分用オプション

最近PHPをビルドし直したりしてたのでメモ。

# インストールオプションの指定

`default_configuration_options`や`definitions`での指定は行わず、`CONFIGURE_OPTS`に設定してインストールするようにした。

postgresqlとintl,apcuを有効にしてインストールしています。

```shell-session
$ anyenv update
$ CONFIGURE_OPTS="--with-pgsql=$(brew --prefix postgresql) --with-pdo-pgsql=$(brew --prefix postgresql) --enable-intl --enable-apcu" phpenv install 7.2.9
```

今まではバージョンごとに`definitions`に定義していたけど、[anyenv updateしたときにコンフリクト](http://qiita.com/chihiro-adachi/items/d75e4155c2328f3c4808)する時があるのと、毎回追加するのが面倒になってきたので。

# iniファイルの設置

```php.ini
date.timezone = Asia/Tokyo
memory_limit = -1
```
を毎回書いているので、`after-install.d`で放り込むようにした。

以下のようなシェルを、`~/.anyenv/envs/phpenv/plugins/php-build/share/php-build/after-install.d`においておくと、インストール完了後に実行してくれる。

```create_custom_ini.sh
#!/usr/bin/env bash

echo "date.timezone = Asia/Tokyo" > $PREFIX/etc/conf.d/custom.ini
echo "memory_limit = -1" >>  $PREFIX/etc/conf.d/custom.ini
```

実行されると、`After Install Trigger`みたいなログがでてきます。

```php
[xdebug] : Cleaning up.
[Info] : Enabling Opcache...
[Info] : Done
[After Install Trigger] : create_custom_ini.sh
[Info] : The Log File is not empty, but the Build did not fail. Maybe just 
warnings got logged. You can review the log in /tmp/php-build.7.1.4.20170420184805.log
[Success] : Built 7.1.4 successfully.
```

# 参考
以下が非常に参考になりました。ありがとうございます。
- [phpenvのPHPインストール時のオプションメモ](http://qiita.com/k1LoW/items/6dba8cb565fcd3925afd)
- [php-build をカスタマイズして使う - y_uti のブログ](http://y-uti.hatenablog.jp/entry/2015/12/11/091058)
[Ruby] 数値・日付時間のformat

# 数値
roundは四捨五入されて表示される。

```ruby
1.234567.round    # => 1  （Fixnum）
1.234567.round(2) # => 1.23  (Float)
1.234567.round(3) # => 1.235  (Float)
```
sprintfを使うと、0埋めでの表示となる。

```ruby
sprintf("%.2f", 1.234) # => "1.23"
sprintf("%.3f", 1.234) # => "1.234"
sprintf("%.6f", 1.234) # => "1.234000"

# %dにすると
sprintf("%.6d", 1.234) # => "000001"

# 他の書き方
format('%.6f', 1.234)  # => "1.234000"
puts '%.6f' % 1.234     # =  "1.234000"
```
# 日付時間

```ruby
time = Time.new(2017, 1, 1, 12, 30, 45)
time.strftime("%Y年 %m月 %d日") # => "2017年 01月 01日"
time.strftime("%Y年 %m月 %d日, %H:%M:%S") # => "2017年 01月 01日, 12:30:45"
```
よく使うもの（個人的まとめ）

| フォーマット文字列 | 出力形式 |
|:--|:--|
| %A | 曜日の名称(Sunday, Monday, ...) |
| %a | 曜日の省略名(Sun, Mon, ...) |
| %B | 月の名称(January, February, ...) |
| %b | 月の省略名(Jan, Feb, ...) |
| %d | 日(01-31) |
| %H | 24時間制の時(00-23) |
| %I | 12時間制の時(01-12) |
| %M | 分(00-59) |
| %S | 秒(00-60) (60はうるう秒) |
| %Y | 西暦を表す数 |
| %y | 西暦の下2桁(00-99) |
| %p | 午前または午後(AM,PM) |

あんまり使わない

| フォーマット文字列 | 出力形式 |
|:--|:--|
| %c | 日付と時刻（"Sun Jan  1 12:30:45 2017"） |
| %X | 時刻（"12:30:45"） |
| %x | 日時（"01/01/17"） |
| %m | 月を表す数字(01-12) |
| %j | 年中の通算日(001-366) |
| %U | 週を表す数。最初の日曜日が第1週の始まり(00-53) |
| %W | 週を表す数。最初の月曜日が第1週の始まり(00-53) |
| %w | 曜日を表す数。日曜日が0(0-6) |
| %Z | タイムゾーン（"JST", ...） |
| %% | パーセント文字 | 






# 参考リンク
http://railsdoc.com/references/strftime
http://qiita.com/tksmaru/items/0f9283d0c5f0ee716f2f
Kinesis Firehose から Amazon ElasticSearch Service（以下es）へstreamした indexの削除運用 


### esのindexはRBDでいうdatabaseというのはよく書かれているが、
> パーティショニングできるdatabaseという感想

実際のindex名は `hoge-index-2017-04-20` という風に年月日を入れることが出来き、
この年月日は削除する対象としてを指定できる
  
## Kinesis Firehoseからesにデータをstreamする際
 Kinesis Firehoseの設定画面は下記のような設定がある
![Amazon_Kinesis_Firehose.png](https://qiita-image-store.s3.amazonaws.com/0/210/36560f27-173a-40d2-943b-52000de9f3d2.png "Amazon_Kinesis_Firehose.png")

 `index rotation*` で OneMonthにするとindex名にプラスして `-年-月` を入れてくれる
 
## esのindex削除運用
 Elasticさん的には [Curator](https://www.elastic.co/guide/en/elasticsearch/client/curator/current/index.html) を提供してくれているので使うのが吉
 
 もっと簡単に過去のindexを削除したいのであれば
 > $ curl -Xdelete https://your-elasticsearch-domain/hoge-index-yyyy-mm-dd
 
 をJenkinsに仕込んで/dayで実行してもよさそう


## 参考URL
[Curator 3 で Amazon Elasticsearch Service を扱う](http://kakakakakku.hatenablog.com/entry/2016/09/13/221832)
[curator で Kibana 用の elasticsearch のインデックスを定期的に削除する](http://qiita.com/hakobera/items/48e15c4bb4cc8110c495)
BluemixからNode-REDを使おうとするとセキュリティ設定をするか問われる件について

#はじめに
Mac環境から[Bluemix](https://console.ng.bluemix.net/)にログインしNode-RED Starterを使おうとしたらセキュリティ設定しろやーと言われたので、どうってことないけれど、覚書をまとめておく。
![スクリーンショット 2017-04-20 18.42.26.png](https://qiita-image-store.s3.amazonaws.com/0/141025/53a8359e-8779-790c-9a47-cee930962f04.png)

#セキュリティ設定のご案内
Node-REDを立ち上げると、フローにたどり着く前に一度、下の画像のように
・セキュリティ設定をすべし
・諸々の追加可能なNodeを知るべし
と案内を受けるようになりました。
今回はそのうち「セキュリティ設定」に関する画面のみご案内します。

![スクリーンショット 2017-04-20 18.45.25.png](https://qiita-image-store.s3.amazonaws.com/0/141025/b6ae15d5-2a1c-7a31-a82c-c5d4614806a0.png)

##閲覧者の制限
上の設定だと、閲覧者をUserNameとPasswordを知っている人のみに制限できます。
下の設定だと、閲覧者を制限せずにフローを開放することができます。
![スクリーンショット 2017-04-20 18.38.46.png](https://qiita-image-store.s3.amazonaws.com/0/141025/450c313f-bb93-7019-4e24-93b0be8f5981.png)

上の選択肢を選んだ場合、Node-REDのフローを見ようとすると、下の画像のようにUsernameとPasswordを入力する画面が出てきます。これを入力しなければフローを見ることができません。
先ほどの画面で設定したUsernameとPasswordを入力します。
![スクリーンショット 2017-04-20 18.40.33.png](https://qiita-image-store.s3.amazonaws.com/0/141025/e718a544-844e-d01a-d136-1e83de53bb6f.png)

##Node-REDのインストールを終える前に
最初にセキュリティ設定をしなくても、変えたくなったらいつでも変えてね？という案内を受けます。
ここはひとまずは何も気にせず「Finish」を押して設定を終えて構いません。
![スクリーンショット 2017-04-20 18.39.43.png](https://qiita-image-store.s3.amazonaws.com/0/141025/7f661d05-2d88-e3bc-8ae3-9bcdaa07198d.png)

どういうことかというと、Node-REDを使う際、Bluemix側で左のメニューから「ランタイム」真ん中のメニューから「環境変数」を選ぶと、下の方に「ユーザー定義」という欄があるのです。実はここから、ここまで案内したセキュリティ設定と同様のことができるのです。
先ほどの最後の画面はそういう案内です。
![スクリーンショット 2017-04-20 19.06.38.png](https://qiita-image-store.s3.amazonaws.com/0/141025/f4fb441b-6260-b7c9-98bc-c14fdc9ad699.png)

ここの「名前」のところに
NODE_RED_USERNAME/NODE_RED_PASSWORDを打ち、保存を押し、Node-REDを再始動すると、UsernameやPasswordを確認する画面が出て来るようになります。
（再始動はBluemix上のNode-REDの名前が書かれた欄の右の矢印でできます）
UsernameやPasswordに入力するのは、ユーザー定義の「値」のところに入力した文字列です。
![スクリーンショット 2017-04-20 19.08.52.png](https://qiita-image-store.s3.amazonaws.com/0/141025/60a3ddea-9bd0-eb50-bad0-3eb43fd9ab20.png)

##※デプロイ権限の制限
上のUsername/Passwordの設定の下にあるチェックボックスにチェックを入れると、誰でもUsernameやPasswordなしに閲覧はできますがデプロイすることができなくなります。そう、自分でさえも。
もしもデプロイをしたい場合は、上の「デプロイ」と書いてある右の人型のアイコンをクリックし、最初に入力したUsernameとPasswordを入力してログインしてからデプロイすることが必要となります。
多分これが、ユーザー定義のNODE_RED_USER_ACCESSに当たるものなんだろうけど、自分はユーザー定義を使ってデプロイ制限をするのはうまくできませんでした。
![スクリーンショット 2017-04-20 18.57.06.png](https://qiita-image-store.s3.amazonaws.com/0/141025/49feadf3-e49c-3342-64dc-bf3fa9bff87d.png)

というわけで以上です。
お疲れ様でした！
PHP 大容量ファイルをダウンロードする方法

WEBで見れる管理画面でたくさんデータをダウンロードしたいって要件から作った話です。
そもそも、いくつまでファイルでかくなるとか要件になかったはずだし、改修しなくても数万件くらいは出来るんだからよくね??ちょっとだけ思った。
バッファしない作りだから、適当にlimit offsetすればいい感じに出来るはーず

# 対象読者 or 環境
PHP初心者、Linux系

# 最終的にどーなったか
```php:download.php
<?php
$date = date("YmdHis");
$filename = "${date}.csv";
header('Content-Disposition: inline; filename=' . basename($filename));
header('Content-Type: application/csv');

$headers = [
    "ID",
    "NAME",
    "TEXT",
];
ob_end_clean();
ob_start();
echo join(",", $headers)."\n";
flush();
ob_flush();

$id = "id";
$name = "name";
$text = "text";
for ($i = 0; $i < 10; $i++) {
    $contents = [
        $id,
        $name,
        $text,
    ];
    echo join(",", $contents)."\n";
    flush();
    ob_flush();
    sleep(1);
}
return;
```

# 参考
- [参考にしたWebサイト](http://every-rating.com/php/php.html)


# あとがき
今回使ってたフレームワークでは、関数終了時自動でsetcookie()呼ばれてしまっていて、header返しやがってうざかった。
それに時間かかった。それだけ
ReactNavite 開発に Atom を使う


最近 ReactNative (RN) 開発で Atom を使い出した(Atom歴1ヶ月強)のだけど、ほぼほぼ不満無く開発出来ているので、使っているパッケージの紹介。

# Nuclide は使わなかった

facebook がオフィシャルで用意している RN 用IDE、Nuclide。Atom のパッケージ各種を同梱している。最初に使ってみたが、よく解らない項目が増えすぎたので、使うのをやめた…。

- https://nuclide.io/

# React.js サポート

React の様々な機能、autocomplete, JSX 対応等々サポートしてくれる。

- https://orktes.github.io/atom-react/


# import-js で import 文の自動補完

- http://qiita.com/hotchpotch/items/1661f05e709e2cf61313

プロジェクトで書いているコンポーネントが増えていくと必須。無いとつらい。
    
# ESLint によるチェック

RN で書き方を統一するために、eslint を使ってるため、それを Atom 上に反映する。

- https://atom.io/packages/linter
- https://atom.io/packages/linter-eslint

![スクリーンショット 2017-04-20 16.21.02.png](https://qiita-image-store.s3.amazonaws.com/0/5330/29730007-dbdb-b4ec-52c7-13eb66ff2894.png "スクリーンショット 2017-04-20 16.21.02.png")

なお eslint のルールは色々あるが、airbnb の eslint のルール(eslint-config-airbnb)を一部変更しつつ使っている。

- https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb
                                           
## eslint --fix の自動適用
           

eslint は --fix オプションで、可能なら自動でソースコードをルールにあわせて修正してくれる。それをファイル保
存時やキーボードショートカットで自動でやってくれるのが pretter-atom。

- https://atom.io/packages/prettier-atom


# flowtype による型チェック

RN プロジェクトでは、flow で型チェックをしてるので、それを Atom の UI に反映してくれるパッケージを入れる。

![スクリーンショット 2017-04-20 16.45.29.png](https://qiita-image-store.s3.amazonaws.com/0/5330/c425cb68-9d04-656f-acbe-99afb5d80dc9.png "スクリーンショット 2017-04-20 16.45.29.png")


flow のプラグインは linter-flow 含めいくつかあるが、その中でも flow-ide が安定しており、かつ用途にあっていた。

- https://github.com/steelbrain/flow-ide

プロジェクトルートに .flowconfig があると、自動で適用される。

# 定義されているソースコードに飛ぶ

js-hyperclick というパッケージを入れる事で、マウスクリックで定義されているソースコードへ飛ぶことができる。またキーボードショートカットで hyperclick:confirm-cursor を定義し呼び出しても OK。

- https://atom.io/packages/js-hyperclick

# その他

Vimmer なので vim-mode-plus 関連いろいろ。普通の人は入れなくて良い。

- https://atom.io/packages/vim-mode-plus
- https://atom.io/packages/vim-mode-plus-ex-mode
  - :w 癖でしちゃうので 
- https://atom.io/packages/vim-mode-clipboard-plus
  - clipboard-plus を vim-mode(-plus) からうまく扱う 
- https://atom.io/packages/open-this
  - vim における `g f`
- https://atom.io/packages/toggle
  - true / false などを toggle する
- https://atom.io/packages/close-all-errors
  - キーボードからエラーダイアログを閉じる

vim-mode-plus は、Atom の機能とうまく結合しつつ、vim のキーバインドで操作できて素晴らしい。いろいろな IDE の vim ライクに操作出来る機能を使ってきたけど、その中でも一番心地良い挙動をしていて、vim-mode-plus があるから Atom 自体の操作も全然苦ではない、と言える。


# 所感

RN は babel の設定や watchman によるファイルチェックからの自動トランスパイル等々は初期設定でよしなにやってくれるので、エディタ上で明示的にトランスパイルする必要が無いし、またログの表示は Chrome のコンソール上に出るため、Atom で頑張ってやらなくても良いことが多くて、今のところいい感じに Atom で開発出来ている。

ちょっと残念なところが、いわゆるリファクタリングブラウザの機能、ファイル名やクラス名、メソッド名変更時の一括置換がなく、原始的な文字列置換で行わなくてはならない(解決方法があれば知りたい)。ただ、その機能は VSCode にも<del> WebStorm にも</del><ins>((修正)WebStorm にはありました)</ins>無いので、Atom に対しての不満というわけではない。

ただ、jscodeshift というのを facebook が開発しているようだし、それを利用した refactoring-codemods という実装もある( import 文の置換ぐらいの機能だけど )ので、リファクタリングブラウザ関連は今後に期待…！

> jscodeshift is a toolkit for running codemods over multiple JS files.

- https://github.com/facebook/jscodeshift
- https://github.com/jurassix/refactoring-codemods
rails 5.1 babel-preset-env "Missing class properties transform" の回避

#rails5.1でreactを書いていてこういうエラーが出る場合
<img width="560" alt="1__bin_webpack-dev-server__node_.png" src="https://qiita-image-store.s3.amazonaws.com/0/16757/02218ae1-1561-2c19-2589-137be818cefa.png">

#解決方法
<img width="323" alt="dalmatian__Git_.png" src="https://qiita-image-store.s3.amazonaws.com/0/16757/f2bd6664-b1d2-882d-abdd-170aee1df935.png">

`stage-0`、`stage-1`または`stage-2`を`config/loaders/react.js`に入れる


#なぜこれで直るのか？

rails5.1ではデフォルトで [babel-preset-env](https://github.com/babel/babel-preset-env)を使用していて、書かれているように[stage-0](http://babeljs.io/docs/plugins/preset-stage-0/)、[stage-1](http://babeljs.io/docs/plugins/preset-stage-1/)、[stage-2](http://babeljs.io/docs/plugins/preset-stage-2/)..のようなpluginは含まれない。

> It won't include stage-x plugins. env will support all plugins in what we consider the latest version of Javascript (by matching what we do in babel-preset-latest).

プラグインは実験的なものも多く、stageが上がるほどより洗練されて行っている
**stage-0 > stage-1 > ...**
つまりdeprecatedなpluginはstageが`0`に行くほど多い

<img width="367" alt="Stage_2_preset_·_Babel.png" src="https://qiita-image-store.s3.amazonaws.com/0/16757/44e1dba5-6b32-2ebf-8a65-61e3e901b195.png">

今回問題の`SyntaxError: Missing class properties transform.`はtransform-class-propertiesが入っていない事が問題で、これは`stage-2`に含まれており、それ以前のstageにも含まれている（要は`0`と`1`）

だから結果として適切な`stage-x`を入れるとコンパイルエラーが無くなる


##babel-preset-env
参考： http://qiita.com/ryuone/items/13f5d450c3865709ba10

この問題の解決方法を探す間に`.babelrc`を簡単に書く[サイト](https://brigand.github.io/config-wizard/?babelrc)を見つけたので紹介

QA方式で.babelrcとnpm、yarnのインストールコマンドラインが表示される
<img width="620" alt="_babelrc_-_Config_Wizard.png" src="https://qiita-image-store.s3.amazonaws.com/0/16757/a7842a26-c101-b368-3f59-e9c4056749fa.png">
[MySQL]ロック/トランザクションのイメージを掴もう


# はじめに
ロックとトランザクションについてめちゃくちゃ噛み砕いてまとめてみました。私も深いとこまではまだまだ勉強不足ですが、イメージは伝わるようにまとめてみました。まずは雰囲気を掴みたい！という人向けです。

# ロックとトランザクションについてイメージを掴みましょう
## なんで必要なの？
複数人が同時に同じデータを見たり(SELECT)、更新したり(UPDATE)したとします。
そうすると、Aさんが見ている間にBさんが更新しちゃったり、Aさんが削除したデータをBさんが更新しようとしちゃったりと、困ったことが起きる感じしますよね。
それを解決するのが、「ロック」と「トランザクション」です。

## 「ロック」についてちょっと詳しく
### ざっくり言うと
自分がそのデータを見たり変更したりしている時、他の人には操作させないぞ！鍵をかけちゃうぞ！っていうものです。
自分のやりたいことが終わったらロック解除するからちょっと待ってて！っていう感じです。
ロックには **「READ LOCK」**(読み込みのためのロック) と **「WRITE LOCK」** (書き込みのためのロック)の2種類があります。

### READ LOCK (読み込みのためのロック)
いま私が見ています！(SELECT)
他の人は見てもいいよ！(SELECT:<font color="Blue">○</font>)
でも変更はしないでね！(UPDATE, DELETE...etc:<font color="Red">×</font>)
っていう感じです。
### WRITE LOCK (書き込みのためのロック)
いま私が変更しています！(UPDATE, DELETE...etc)
他の人は見ないでね！(SELECT:<font color="Red">×</font>)
変更もしないでね！(UPDATE, DELETE...etc:<font color="Red">×</font>)
っていう感じです。


## 「トランザクション」についてちょっと詳しく
### ざっくり言うと
連続してデータ操作をいくつか行う時、その一連の操作をまとめることができ、そのまとまりを「トランザクション」と呼びます。
そして、トランザクション(一連の操作)ごとに **確定** や **取り消し** ができます。
### それの何がいいの？
*以下の場面を考えてみましょう*

・AさんからBさんに、口座を通して10万円振込むとします
・その時にはまず、Aさんの口座から<font color="Red">-10万円</font>というデータ操作(<font color="Red">①</font>)をします
・次に、Bさんの口座に<font color="Blue">+10万円</font>というデータ操作(<font color="Blue">②</font>)をします
・この時に、<font color="Red">①</font>は行われたのに<font color="Blue">②</font>が行われないと、大変なことになってしまいます。10万円がどこかに行ってしまいますね。

*こんな時にトランザクションの機能が役に立つ！*

・ここで<font color="Red">①</font>と<font color="Blue">②</font>をトランザクションとしてまとめると...
・<font color="Red">①</font><font color="Blue">②</font>両方の操作が完了してから、トランザクション全体を **「確定」** することが出来ます
・もし<font color="Blue">②</font>だけ完了しなかったら、トランザクション全体を **「取り消し」** たり出来ます。

*これのおかげでデータ操作の矛盾を防ぐことが容易になります！*

### 実際にトランザクションを制御してみよう
#### 1.autocommitの無効化
autocommitというものが有効になっていると、全てのデータ操作が1つのトランザクションとなってしまいます。

~~自分でトランザクションを制御するには、autocommitを無効にする必要があります。~~　(4/21 編集)
↑この考えは、勘違いでした。autocommitが有効になっていてもトランザクションを制御することは出来ます。
この記事([MySQLのAUTOCOMMIT（オートコミット）覚え書き](https://open-groove.net/mysql/autocommit/))がとても分かりやすいです。

まずは、autocommitが現在どうなってるか確認しましょう。

```
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
1 row in set (0.00 sec)
```

有効になっているので、無効化してあげましょう。

```
set autocommit=0;
```

#### 2.トランザクションの開始
トランザクションを開始します！と宣言しましょう。

```
start transaction;
```

#### 3.データ操作
さっきの話でいう、-10万円したり+10万円したりですね。
このトランザクションで行いたいことをしてあげましょう。

#### 4-1.確定
このデータ操作でOK！って思ったら、確定しましょう。

```
commit;
```

####4-2.取り消し
このデータ操作やっぱりやめた！って思ったら、取り消しましょう。

```
rollback;
```

# まとめ
こんな感じに概念をざっくりと理解すれば、あとは実際に使いながら覚えていけるんじゃないかなと思っています。
RailsアプリケーションをHerokuで動かす時の環境変数設定方法


https://murmuring-woodland-50630.herokuapp.com/?utf8=%E2%9C%93&keyword=Rails

どや！ってことで、初心者がWebアプリケーションを作ってみました。

出た当初こりゃやべーと食いついた「Kindle Unlimited」ですが、何が対象なのか全くわからないって悩みがあったので、作ってみました。

色々やりたいことはあるけど、最低限はできたのでHerokuにアップしてみました。

で、本題ですが困ったのが`Amazon`の`KEY`は本番環境だとどうするんだって思って調べてみました。

結論としては、環境変数に設定してそれを読み込むように修正します。

# アプリ側
```Ruby
require_relative 'application'

Rails.application.initialize!

Amazon::Ecs.options = {
      :associate_tag =>     'opiyopiyopiyo',
      :AWS_access_key_id => ENV["AMAZON_KEY_ID"],
      :AWS_secret_key =>    ENV["AMAZON_SECRET_KEY"]
}
```
# Heroku側
こちらはターミナルからもできるそうなんだけど、Herokuの画面からやりました。
初心者はGUIの方が分かりやすいです。

1. Herokuにログイン https://dashboard.heroku.com/
2. 対象のアプリケーションを選択 https://dashboard.heroku.com/apps/piyopiyo-app
3. Settingsタブをクリック
4. Config Variables行の横にあるボタン「Reveal Config Vars」をクリック
5. 「KEY」と「VALUE」を入力して保存(Add)する

　　※アプリ側で設定した「AMAZON_KEY_ID」と「AMAZON_SECRET_KEY」をKEYにする。

<br>
これで完成です！
ノンプログラミングで機械学習サービスが作りたい! WebAPI編

# 今回の内容
[ノンプログラミングで機械学習サービスが作りたい! テキスト分類編](http://qiita.com/shuukei-imas-cg/items/ea501e62970b309ceea4)の第2弾です。機械学習の分類結果をWebAPIから利用できるようにします。

この段階になるとさすがにノンプログラミングというわけにはいかず、早くもタイトル詐欺くさくなってきましたが、60行ちょっとのコードですので読み解くのは難しくないと思います。

ソースはhttps://github.com/shuukei-imas-cg/imas_cg_words で公開しています。


# 使用するフレームワーク、ソフトウェアについて
## Falcon
[Falcon](https://falconframework.org/)はバックエンド用途の非常に高速でミニマルなWebフレームワークです。[公式サイト](https://falconframework.org/)に掲載されているベンチマークによれば、Python用webフレームワークとして定番のFlask(0.11.1)に対して9倍のパフォーマンスを発揮するとあります。
今回はせっかくなのでcythonizeを行い、より高速に動作するようにセットアップします。

## Gunicorn
[Gunicorn](http://gunicorn.org/)はFalconでも推奨されているシンプルで高速なWSGI Webサーバです。
WSGIはWeb Server Gateway Interfaceの略で、WebサーバとWebフレームワークの標準化されたインタフェース定義です。これに従っていれば、好きなWebサーバとWebアプリケーション(フレームワーク)の組み合わせで利用可能です。


# サンプル実行手順

~~~
cd imas_cg_words/ (前回記事でcloneしたディレクトリ)
git pull

# Gunicorn, cythonをインストールする
pip install cython gunicorn
# Cコンパイラでfalconをコンパイルしつつインストール
pip install --no-binary :all: falcon 

# localhostでwebapiサーバを起動
cd webapi/
python server.py &
# クエリ
curl http://localhost:8080/imas_cg-words/v1/predict/妄想
[
    {
        "score": 1.2635555267333984,
        "name:": "喜多日菜子"
    },
    {
        "score": -0.9001807570457458,
        "name:": "棟方愛海"
    },
    {
        "score": -1.0048713684082031,
        "name:": "浅利七海"
    }
]
~~~
curlでクエリを投げて上記のように表示されれば正常に動作しています。
任意のテキストをHTTP GETメソッドで受け取り、その分類結果をJSON形式で返します。

## 外部から利用可能なWebAPIとして公開する場合
外部からもアクセス可能なWebAPIとして公開する場合、simple_serverでは力不足ですので、以下のようにGunicornを用います。
Gunicornから起動する場合、config.py内で設定したIPアドレスとポート番号は無視され、コマンドラインオプションで指定した値が優先されることに注意します。

~~~
gunicorn -b (IPアドレス):(ポート番号) server:api &
# ワーカ数やログファイルを指定する場合
gunicorn -w 4 -b (IPアドレス):(ポート番号) --access-logfile log/access.log --error-logfile log/error.log server:api &
~~~

IPアドレスには外部から参照可能なIPアドレスを指定してください。


# 解説
webapi/server.pyの内容を解説していきます。

まずFalconのインスタンスを生成し、URIのパスにクラスPredictSerifを割り当てるルーティングの設定を行います。{words}の部分は任意の値を取り、その内容は変数としてクラスや関数に渡されます。

```
# Add route
api = falcon.API()
api.add_route('/imas_cg-words/v1/predict/{words}', PredictSerif())
```

PredictSerifではHTTP GETメソッド時の挙動を定義します。関数predictの中身は[前回](http://qiita.com/shuukei-imas-cg/items/ea501e62970b309ceea4)作成したものとほぼ同様です。
その返り値をJSON形式に変換し、WebAPIの出力として表示させています。

_add_headersは幾つかのHTTPヘッダを追加しています。次回の記事で、JavaScriptを用いたSPAからこのWebAPIにアクセスするため、とりあえずCORSを許可する設定を行っています。

```
class PredictSerif(object):
    def on_get(self, req, resp, words):
        result = predict(words)
        json_out = json.dumps(result, indent=4, ensure_ascii=False)
        _add_headers(resp)
        resp.body = json_out
        resp.status = falcon.HTTP_200
        logging.info("predict {0} {1}".format(req.remote_addr, words.decode('utf-8')))
```

json.dumpsのindent=4は可読性のために設定してあります。本番では削除しても良いでしょう。


# 次回
これで機械学習の分類機能をWebAPIとして利用できるようになりました。次回は、このWebAPIを利用するフロントエンドをVue.jsで作成します。


# 最後に(重要)
もしこの記事を気に入っていただけたら、あなたが「いい」と思った分だけ、[アイドルマスターシンデレラガールズ](http://www.mbga.jp/_game_intro?game_id=12008305)で2018年4月頃に開催されると思われる「第7回シンデレラガール総選挙」で喜多日菜子に投票してください。
MySQLで早く巨大データを更新する方法

#やること
100万件データを取得して、指定のテーブルに追加します。存在しているレコードを項目を更新する、存在しないレコードを新規追加します。

#前提
更新したいテーブルのサイズは11.6GB、レコード数は5000万件です。

`SELECT ... FOR INSERT INTO ON DUPLICATE KEY UPDATE`
とlimit offsetで1000件ずつ必要な情報を取得してテーブルに`INSERT INTO ON DUPLICATE KEY UPDATE`を検証しましたけど、結局遅いです。`LOAD DATA INFILE`で早そうで検証しました。

##まずレコードを全部取得してCSVファイルに書き込む

```ruby:
SELECT name, id
 INTO OUTFILE '/var/lib/mysql-files/result.csv'
 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
 LINES TERMINATED BY '\r\n'
 FROM test
```
**注意：INTO OUTFILEのファイル名が存在したら、エラーになります。**

##CSVファイルをテーブルにLOADする
LOAD DATA INFILEはON DUPLICATE KEY UPDATEがサポートされないですが、LOAD DATA INFILE REPLACEがサポートされます。

###LOAD DATA INFILE REPLACE

```ruby:
LOAD DATA INFILE '/var/lib/mysql-files/result.csv' REPLACE INTO TABLE result_table
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"'
(name, id, tel, mail);
```
↓

```ruby:
Query OK, 2365032 rows affected (6 min 0.14 sec)
Records: 1182516  Deleted: 1182516  Skipped: 0  Warnings: 0
```
遅い。
原因は：replaceは、キーが重複した場合、その古い行は新しい行が挿入される前に削除されるので、INSERT ON DUPLICATE KEY UPDATE より遅い。

###LOAD DATA INFILE with ON DUPLICATE KEY UPDATE
* temporaryテーブル作成

```ruby:
CREATE TEMPORARY TABLE temporary_table
(
  `seq` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `id` int(11) unsigned NOT NULL,
  `name` varchar(255) NOT NULL,
  ...
  PRIMARY KEY (`seq`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
```
余計なindexなど全部いりません。

**注意**

```ruby:
CREATE TEMPORARY TABLE temporary_table `LIKE` test
```
も作成できますが、もしテーブルtestがロックされたら、LIKEで作成できません。

* CSVファイルをTEMPORARYテーブルにLOAD

```ruby:
LOAD DATA INFILE '/var/lib/mysql-files/result.csv'
INTO TABLE temporary_table
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(id, name ...);

Query OK, 1182516 rows affected (5.42 sec)
Records: 1182516  Deleted: 0  Skipped: 0  Warnings: 0
```

* TEMPORARYテーブルのデータを目的テーブルに追加方法①

```ruby:
INSERT INTO result_table (`id`, `name`...)
SELECT * FROM temporary_table
ON DUPLICATE KEY UPDATE name = VALUES(name);

Query OK, 2364762 rows affected (43.54 sec)
Records: 1182516  Duplicates: 1182381  Warnings: 0
```

* TEMPORARYテーブルのデータを目的テーブルに追加方法②
TEMPORARYテーブルのseqを活用して1000件ずつselectして目的テーブルに追加

```ruby:
INSERT INTO result_table (`id`, `name`...)
SELECT * FROM temporary_table
WHERE seq > 'offset_start'
AND seq <= 'offset_end'
ON DUPLICATE KEY UPDATE name = VALUES(name);

totoal time: 35.23 sec
```
上記でテーブルロックも解消できるし、速度は一番早いです。

##まとめ
MySQLで巨大データを追加してON DUPLICATE KEY UPDATEの場合、`INSERT INTO ON DUPLICATE KEY UPDATE` より`LOAD DATA INFILE`を活用したほうが早いです。

| 実装方法       |       実装時間 |
|:-----------------|------------------:|
| SELECT ... FOR INSERT INTO ON DUPLICATE KEY UPDATE            |              1分55秒 |
| limit offsetでINSERT INTO ON DUPLICATE KEY UPDATE           |            10分 |
| LOAD DATA INFILE REPLACE             |              6分14秒 |
| LOAD DATA INFILE with ON DUPLICATE KEY UPDATE               |                35.23秒 |
Mathematicaデータ保存＆プログラミングまとめ

# この記事のまとめ

- ~~自分~~あまり詳しくない人のためのまとめ
- 計算したデータを文字列（テキストファイル）に保存して再利用できるようにする
- 取得したデータの取り扱い
- その他（細々としたメモ）

Mathematicaは記法や用語が一般的なプログラミング言語と異なり、機能はあるのにヘルプを検索してもなかなか見つからなくて大変なので書き残しておく。

# データの保存と読み出し
## データを保存する
```example.nb
SetDirectory[NotebookDirectory[]]; (* これをやっておくとノートがある場所からの相対パスで記述できる *)
data = List[hogehoge]; (* 今回はリスト・行列形式のデータを作成したとする *)
Export["data.txt",data];
```
**ファイル名やディレクトリパスに文字色を設定すると「存在しません」となって保存できないので注意。**

単純な数値リストだけでなく、スタイルを指定したグラフデータ（RegionPlotなど）も保存できるので、計算に時間がかかるものは書き出し→読み出し作業を行う方が再現する際に楽になる。（グラフデータの場合も下のReadListで読み出せる。）

### 動的なファイル名をつける
```example.nb
filepath = TemplateApply["data/````_``.txt", {"foo",1,0.2*10}]
(* filepath = "data/foo1_2..txt" *)
Export[filepath,data];
```
ファイル名にドットが2つ並ぶのは、TemplateApply内で拡張子として記述した`.txt`のドットと、0.2を10倍した時の近似値を表すドット（`2.`）のせい。

参考→https://www.wolfram.com/language/fast-introduction-for-programmers/ja/strings/

## データを取得する
```example.nb
list = ReadList["data.txt"]; (* 既にリスト・行列形式の場合 *)
datapoints = Length[list] (* 要素数を取得しておくとプログラミングで便利 *)
```

# リスト操作
## n個の空要素（リスト）を持つリストの作成
```example.nb
list = Table[{}, {n, 1, 10}]; (* この例では10個 *)
```
`list = {{}, {}, {}, {}, {}, {}, {}, {}, {}, {}} `となる

## データを表示する
```example.nb
list = { (* 例のために明示したが上記の取得したものをそのまま使える *)
    {{a,b},{c,d}} (* {{a,b},c}のように要素数が違っても良い *)
    {{A,B},{C,D}}
  };
list[[1]] (* {{a,b},{c,d}} *)
list[[1,1]] (* {a,b} *)
list[[1,1]][[1]] (* a, list[[1,1,1]]でも良い *)
```

## データを絞り込む
```example.nb
newlist = {};
shiborikomi[i_] := Module[{x}, (* この関数では内部変数は必要ない *)
   If[list[[i, 1]][[1]] == 1, (* 条件 *)
     AppendTo[newlist, list[[i, 2]]]; (* 処理 *)
     ];
   ];
For[i = 1, i <= datapoints, i++, shiborikomi[i]]
ListPlot[newlist]
```

本当はcsvとかにも保存できるし、ImportとかToExpressionという関数もあるので、より効率を求めるならドキュメントを読もう。

# プログラミングTIPS

PHPなどと比較的近い。

- 返り値のある関数を作りたい場合はModuleの中にReturn  
ちなみに何でも返せるようだ。引数（`hoge_`）に他の関数からの返り値（なんでも良い）を取ることもできる。

```example.nb
getSolution[hoge_] := Module[{val},
  solution = (* 処理 *);
  Return[solution]
  ]
```

- `Break[]`や`Continue[]`もある。`[]`を忘れないようにする
- 関数の引数は複数定義しても、Module内で使っていなければ省略してもエラーなく動く。重い処理を一時的に切って回したい時に便利。
- `Share[]`を適宜挟むことでメモリを解放できる
- 代入を`=`ではなく`:=`にしておくと、後から変数の値を変更しても、関数を定義し直さなくても良い
- PHPのin_arrayに相当するのは[MemberQ](http://reference.wolfram.com/language/ref/MemberQ.html)
- **関数内の変数とグローバル変数の名前が同じだと思わぬバグを生じるので注意する**

- `Do[]`と`Switch[]`を組み合わせると、連動して変更されるパラメータ（特に観測値）を代入するのに都合が良い（例では`i=gen`だが、切り替えられれば何でも良い）

```example.nb
Do[
 Switch[i,
   0, gen = 0; mass = 0;,
   1, gen = 1; mass = 0.05;,
   2, gen = 2; mass = 0.05;,
   3, gen = 3; mass = 0.1;
   ];
 , {i, 0, 3}]
```
Ubuntu 16.04 で root ユーザー以外でも docker コマンドを使えるようにする

タイトルの通り。apt でインストールした Docker が root ユーザーでしか叩けなかったので、一般ユーザーで叩くための方法を調べました。


検証環境
----
```sh
$ cat /etc/issue
Ubuntu 16.04.1 LTS \n \l

$ docker version
Client:
 Version:      17.03.1-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Mon Mar 27 17:14:09 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.03.1-ce
 API version:  1.27 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Mon Mar 27 17:14:09 2017
 OS/Arch:      linux/amd64
 Experimental: false
```


チュートリアル
----
```sh
# docker グループにユーザーを追加
sudo gpasswd -a $(whoami) docker

# docker.sock にグループ書き込み権限を付与
sudo chgrp docker /var/run/docker.sock

# Docker daemon を再起動します。
sudo service docker restart
```

現在ログイン中のユーザーを追加した場合、一旦ログアウトしないと反映されないようです。再ログインしてください。

これで docker コマンドが非 root ユーザーでも実行できます。

```sh
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
...
```

参考
----
- [How can I use docker without sudo? - Ask Ubuntu](https://askubuntu.com/questions/477551/how-can-i-use-docker-without-sudo)
[メモ]Zabbix2.2～3.0 便利リンク




### Zabbixエージェント 

#### サポートされているアイテムキー

- zabbix2.2
  - https://www.zabbix.com/documentation/2.2/jp/manual/config/items/itemtypes/zabbix_agent 
  

- zabbix2.4
  - https://www.zabbix.com/documentation/2.4/manual/config/items/itemtypes/zabbix_agent
  

- zabbix3.0
  - https://www.zabbix.com/documentation/3.0/manual/config/items/itemtypes/zabbix_agent
  
#### サポートされているトリガー関数

- zabbix2.2
  - https://www.zabbix.com/documentation/2.2/jp/manual/appendix/triggers/functions


- zabbix2.4
  - https://www.zabbix.com/documentation/2.4/manual/appendix/triggers/functions


- zabbix3.0
  - https://www.zabbix.com/documentation/3.0/manual/appendix/triggers/functions
  
#### サポートされているマクロ（場所別）

- zabbix2.2
  - https://www.zabbix.com/documentation/2.2/jp/manual/appendix/macros/supported_by_location


- zabbix2.4
  - https://www.zabbix.com/documentation/2.4/manual/appendix/macros/supported_by_location


- zabbix3.0
  - https://www.zabbix.com/documentation/3.0/manual/appendix/macros/supported_by_location

### リポジトリ
※2017/04/20現在

- zabbix2.2
  - http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm



- zabbix2.4
  - centos6
     - http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm
  - centos7
     - http://repo.zabbix.com/zabbix/2.4/rhel/7/x86_64/zabbix-release-2.4-1.el7.noarch.rpm


- zabbix3.0
  - centos6
     - http://repo.zabbix.com/zabbix/3.0/rhel/6/x86_64/zabbix-release-3.0-1.el6.noarch.rpm
  - centos7
     - http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm

### リリースノート

- http://www.zabbix.com/jp/rn3.2.3

### 読み物

- Kodai's Blog
  - http://kodai74.blogspot.jp/search/label/Zabbix
リリースビルドがtransformClassesAndResourcesWithProguardForReleaseの時点で失敗する問題


```
Warning: Exception while processing task java.io.IOException: java.lang.IllegalArgumentException: Overflow of unsigned short value [66077]
:app:transformClassesAndResourcesWithProguardForRelease FAILED
```

こういうのが出てきちゃう方向け。

### 2017.6.1追記

Gradle Plugin for Android v3.0.0-alpha2ではProguard v5.3.3が採用されていることを確認しました。

tldr;
----------

* Proguard v5.3.3で直ってるよ
* Gradle Plugin for Android v2.3.1やv2.4.0-alpha6にはProguard v5.3.2が入ってるから、問題にぶち当たった人は自分で設定してv5.3.3に上げてね

原因
----------

16bitっぽい話なのでmultidexの問題なのかなと思ってしばらく調べていたのですが、どうやら素直にタスク名のとおりにProguardの問題として見ればよかったようです。

同様の問題がProguardのIssueに報告されていました。

* [ProGuard Java Optimizer and Obfuscator / Bugs / #638 crash in transformClassesAndResourcesWithProguardForRelease](https://sourceforge.net/p/proguard/bugs/638/)

本筋の議論が行われていたのは#623のほうだったようです。

* [ProGuard Java Optimizer and Obfuscator / Bugs / #623 5.3 optimization fails with NullPointerException](https://sourceforge.net/p/proguard/bugs/623/)

既にパッチのやりとりも終わり、修正版のProguard v5.3.3ではこの問題は起こらなくなっています。

ここで問題が。

```bash:buildEnvironment
$ ./gradlew buildEnvironment
...
:buildEnvironment

------------------------------------------------------------
Root project
------------------------------------------------------------

classpath
+--- com.android.tools.build:gradle:2.3.1
|    \--- com.android.tools.build:gradle-core:2.3.1
|         +--- com.android.tools.build:builder:2.3.1
...
|         +--- net.sf.proguard:proguard-gradle:5.3.2
|         |    \--- net.sf.proguard:proguard-base:5.3.2
```

僕らの手元にはProguard 5.3.3が無い・・・！

Gradle Plugin for Android v2.4.0-alpha6でもProguardのバージョンは同じだったので、たぶんしばらくこのままでしょう。

Proguard 5.3.3を導入する
----------

ないなら入れましょう。

```gradle:$PROJECT_ROOT/build.gradle
buildscript {
    ...
    configurations.all {
        resolutionStrategy {
            force 'net.sf.proguard:proguard-gradle:5.3.3'
        }
    }
}
```

参考： [How to upgrade ProGuard for Android? - Stack Overflow](http://stackoverflow.com/questions/42493683/how-to-upgrade-proguard-for-android)
NSDate-EscortをSwift化(一部) (一応Swiftの日付操作ライブラリとしても使えます)

NSDate-Escort（Objective-CのNSDate型拡張ライブラリ)をSwiftのDate型拡張ライブラリとして書き直しました。
Swift3に移行する際に一時的な処置として使ってみてください。
※一応Swiftの日付操作ライブラリとしても使えますがメソッド名とかは変えたほうが良さげですね。

github: https://github.com/azu/NSDate-Escort

```swift:
import Foundation

extension Date {
    fileprivate var calendar: Calendar! {
        return Calendar.current
    }
    
    var seconds: Int {
        return self.calendar.component(.second, from: self)
    }
    
    var minute: Int {
        return self.calendar.component(.minute, from: self)
    }
    
    var hour: Int {
        return self.calendar.component(.hour, from: self)
    }
    
    var day: Int {
        return self.calendar.component(.day, from: self)
    }
    
    var month: Int {
        return self.calendar.component(.month, from: self)
    }
    
    var week: Int {
        return self.calendar.component(.weekOfMonth, from: self)
    }
    
    var weekday: Int {
        return self.calendar.component(.weekday, from: self)
    }
    
    var year: Int {
        return self.calendar.component(.year, from: self)
    }
}

extension Date {
    func isToday() -> Bool {
        return self.calendar.isDateInToday(self)
    }
    
    func isEqualToDate(_ date: Date) -> Bool {
        return self == date
    }
    
    func isEarlierThanDate(_ date: Date) -> Bool {
        return self < date
    }
    
    func isLaterThanDate(_ date: Date) -> Bool {
        return self > date
    }
    
    func isEarlierThanOrEqualDate(_ date: Date) -> Bool {
        return self < date || self == date
    }
    
    func isLaterThanOrEqualDate(_ date: Date) -> Bool {
        return self > date || self == date
    }
}

extension Date {
    func dateAtStartOfDay() -> Date {
        return self.calendar.startOfDay(for: self)
    }
    
    func dateAtEndOfDay() -> Date {
        var components = DateComponents()
        components.day = 1
        components.second = -1
        return self.calendar.date(byAdding: components, to: self.dateAtStartOfDay())!
    }
    
    func dateByAddingDays(_ day: Int) -> Date {
        return self.calendar.date(byAdding: .day, value: day, to: self)!
    }
    
    func dateByAddingHours(_ hour: Int) -> Date {
        return self.calendar.date(byAdding: .hour, value: hour, to: self)!
    }
    
    func dateByAddingMinutes(_ minute: Int) -> Date {
        return self.calendar.date(byAdding: .minute, value: minute, to: self)!
    }
    
    func addingMinutes(_ minute: Int) -> Date {
        return self.dateByAddingMinutes(minute)
    }
}

```

#参考
http://stackoverflow.com/questions/13324633/nsdate-beginning-of-day-and-end-of-day
https://developer.apple.com/reference/foundation/calendar
http://qiita.com/kouchi67/items/39341d5e78778b532536
http://qiita.com/mishimay/items/8d67b583dc6809b2baf5
[memo] Asterisk 資料

# Astarisk general link : Asterisk 一般 Link
* [asterisk org](http://www.asterisk.org/)
* [Asterisk wikipedia日本語] (https://ja.wikipedia.org/wiki/Asterisk_(PBX))
* [Asterisk wikipedia English](https://en.wikipedia.org/wiki/Asterisk_(PBX))
* [voip-info (コニュニティページ)] (http://www.voip-info.jp)

# Abstract : 概要
* Developer(s)	Digium
* Stable release	
 - 14.4.0 (7 April 2017; 13 days ago[1]) [±]
 - 13.15.0 (7 April 2017; 13 days ago[2]) [±]
* Preview release	
 - 14.4.0-rc3 (April 5, 2017; 15 days ago) [±]
 - 13.15.0-rc3 (April 5, 2017; 15 days ago) [±]
* Written in : C
* Operating system : Cross-platform
* Type : Voice over Internet Protocol
* License : GNU General Public License / Proprietary
* Website : www.asterisk.org


# How to Install
* -------- FreeBPX on CentOS 6 ----------
* [[freebpx.org] FreeBPX & Asterisk13 on CentoOS6](https://wiki.freepbx.org/display/FOP/Installing+FreePBX+13+on+CentOS+6#InstallingFreePBX13onCentOS6-CompileandInstalljansson)
* -------- Astersiks 13 on CentOS 6 ---------
* [[asterisk.org(eng)] Installing Asterisk From Source](https://wiki.asterisk.org/wiki/display/AST/Installing+Asterisk+From+Source)
* [[vip-info(jp)] Asterisk13](http://www.voip-info.jp/index.php/Asterisk_13) 
* [How to Install Asterisk 13 and PJSIP on CentOS 6](http://blogs.digium.com/2015/02/24/install-asterisk-13-pjsip-centos-6/) 
* --------- AWS ---------------------
* [[giik-tips] asterisk on aws (asterisk 11)](http://www.geek-tips.com/2015/01/11/asterisk-on-aws-linux/)

* [[qiita] AWS上にAsteriskサーバ構築して内線電話環境つくってみよう (astrisk 1.8 ) ](http://qiita.com/ganezasan/items/05b16a2254f066f6bbdc )

* --------- CentOS 7 ---------------------
* [CentOS7にAstriskのインストールから内線構築まで](http://senoway.hatenablog.com/entry/2015/01/09/182618)
* [CENTOS7にASTERISK13その1](https://zzaj.net/?p=1156)
[ubuntu] Dockerイメージのタイムゾーンを設定する


こんにちはsekitakaです。

DockerコンテナのタイムゾーンをAsia/Tokyoにしたかったのですが、だいぶハマりました。
最終的にイメージの作成時点でタイムゾーンを設定する方法をとりました。
以下をDockerfileに追記することでタイムゾーンを設定できました。

```Dockerfile
# タイムゾーンの変更
ENV TZ Asia/Tokyo
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
```

ぐぐると色々と方法が出てきましたが、この方法が私の環境で動いた唯一の方法です。
おそらくホストとゲストのOSなどにも依存すると思います。

# 確認した環境
Host: OS X
Guest: ubuntu 16.04
MySQLクライアントを快適に使う設定

MySQLを快適に使うために設定していることをつらつらと書いていきます。
皆さんの素敵なMySQLライフと自分の備忘録的な意味も込めて。

# ~/.my.cnfの設定をさらしてみる
```
$ cat ~/.my.cnf
[client]
host=localhost
port=3306
user={ログインID}
password={ログインPWD}
prompt=mysql [\\U \\d] > 
pager=grcat ~/.grcat | less -RSFXin

[mysqldump]
user={ログインID}
password={ログインPWD}
```

# 各パラメーターの説明
## `host` `port` `user` `password`
パラメーター名そのままだがこの設定を行うことで下記のコマンドを省略できます

```.my.cnf未設定
$ mysql -h localhost -P 3306 -u {ログインID} -p db_name
```
```.my.cnf設定
$ mysql db_name
```

RDSの長いホスト名とかパスワードを覚えておく必要がないのでサクっと接続できるようになります。
違うファイル名で別の接続情報を用意しておき読み込ませることもできます。 `mysql --defaults-file=~/.db02.my.cnf`
`~/.my.cnf` はデフォルトで読み込まれるファイルです。

## `prompt`
接続後に表示されるプロンプトを変更できます。
デフォルトで `mysql>` と表示されるこやつです。
`\U` はログインユーザー、 `\d` でuseしているDB名を表示できます。
`prompt=mysql [\\U \\d] >` だと `mysql [root@localhost db_name] >` のように表示される。

日時やコマンドの実行回数なども表示できたりする。詳細は下記。
https://dev.mysql.com/doc/refman/5.6/en/mysql-commands.html

ちなみに接続後に `prompt mysql [\U \d] >` と入力しても設定される。
`mysql>` に戻したい場合は `prompt` とだけ入力するとデフォルトに戻る。


## `pager`
これはselectしたときの表示方法を設定してる。
取得件数が多くなるとコンソールのバッファ行数を超えちゃって最初のほうがみれない！というときに便利です。

`grcat ~/.grcat` の部分は検索結果に色付けする設定をしています（後述）
`less -RSFXin` の部分で lessコマンドでselect結果を表示します。
オプションの詳細は割愛。下記みてね。
https://dev.mysql.com/doc/refman/5.6/en/mysql-commands.html


ちなみに接続後に `pager less -RSFXin` と入力して設定もできる。
ファイルに出力する場合は `pager cat > /tmp/result.txt` と入力。便利です。
元の標準出力の表示に戻す場合は `nopager` と入力すればOK。

## grcat
### grcのインストール
centos使っているのですがyumで見つからなかったのでソースコードを取得してインストールしました。

```
wget https://repository.hybris.com/repo/pool/main/g/grc/grc_1.5.tar.gz
tar xzvf grc_1.5.tar.gz
cd grc_1.5
sudo ./install.sh
```
### .grcatの作成
https://github.com/nitso/colour-mysql-console をそのまま利用させていただきました。

# そのほか便利なコマンド
|コマンド|説明|
|:------------|:------------------------------------------|
|\\e          |エディタでsql作成できる                      |
|\\G          |取得結果を縦表示。                           |
|\\c          |sql入力中で間違えたときになかったことにできる。|
|\\q          |sql入力中でも終了できる。ctrl + cと同じ       |
|\\s          |現在のサーバー情報表示                       |
|\\! {command}|mysqlコンソールでlinuxコマンドたたける        |
|\\. {file}   |外部sqlファイル読み込める                    |

# 参考にさせていただいページ
https://dev.mysql.com/doc/refman/5.7/en/mysql-commands.html
https://github.com/nitso/colour-mysql-console
http://sawara.me/mysql/2324/

いかがだったでしょうか。
日々仕事で使っていますがすげー便利だけど知らなかった！っていうものがいっぱいあります。
見ていただいた方のMySQLが便利になると嬉しい限りです。
こんな便利なのもあるんだぜ！って情報もお待ちしております。
[android] DialogFragment内のwebViewが表示されない問題 

## 概要
webViewを表示するDialogFragmentでなぜか7系の端末だけwebView内に画面が表示されない現象が起こった。

4系、5系、6系では表示でき、
onPageStarted()もonPageFinished()も呼ばれている。

エラーとかは特になし。。。


##解決策
原因は不明だそうですが、解決方法は見つかりました。
[
android dialogFragment “sometimes” not showing webview](http://stackoverflow.com/questions/13274988/android-dialogfragment-sometimes-not-showing-webview)

DialogFragmentのwebViewの親のViewをLinearLayoutからFrameLayoutに変更することできちんと表示されるようになりました。
AWS SQSの各設定値の意味 & Ansibleの書式

## 概要
AWS SQSの各設定値の意味と、Ansibleの書き方です。

## 設定値
<img width="778" alt="47f65646afce1836703bd3b19ce5092d.png" src="https://qiita-image-store.s3.amazonaws.com/0/105936/0c0d15f1-dc30-4562-61f0-7c4d45457bd4.png">

| 項目 | 設定内容 |
| --- | --- |
| デフォルトの可視性タイムアウト(Default Visibility Timeout) | キューのメッセージは、自動では削除されない。<br>そのため、メッセージ取得バッチ（Lambdaなど）が複数ある場合、それぞれが同一のメッセージを取得してしまう可能性がある。<br>これを回避するために、あるバッチからメッセージが取得されたら、他のバッチからメッセージが取得できないように、一定時間メッセージを非表示にする時間の設定。デフォルト30秒。 |
| メッセージ保持期間(Message Retention Period) | メッセージ保持期間 |
| 最大メッセージサイズ(Maximum Message Size) | 1メッセージの最大サイズ |
| 配信遅延(Delivery Delay) | メッセージが登録された後、Lambdaなどのバッチがメッセージが取得できるようになるまでの時間。<br>可視性タイムアウトが、メッセージ取得後なのに対し、こちらはキューに登録後、一定時間メッセージを非表示にする。 |
| メッセージ受信待機時間(Receive Message Wait time) | ロングポーリングの時間。Lambdaなどのバッチがメッセージを取得しに行った時にキューが空だった場合、ここで設定された時間だけ、キューにメッセージが入ってくるのを待つ。 |
| 再処理ポリシーの使用 | 下記の機能を使う場合はチェック |
| デッドレターキュー(Dead Letter Queue) | 処理に失敗したキューを退避させる、別のSQSのキュー名（ベットSQSキューの作成が必要） |
| 最大受信数(Maximum Receives) | リトライ回数 |

## Ansibleの書式

```yaml:main.yml
- name: sqs
  become_user: '{{ username }}'
  sqs_queue:
    # キューの名前
    name: 'my_sqs'
    # リージョン
    region: 'ap-northeast-1'
    # デフォルトの可視性タイムアウト
    default_visibility_timeout: 30
    # メッセージ保持期間
    message_retention_period: '{{ 86400 * 4 }}'
    # 最大メッセージサイズ
    maximum_message_size: 204800
    # 配信遅延
    delivery_delay: 0
    # メッセージ受信待機時間
    receive_message_wait_time: 0
    # 再処理ポリシーの使用
    redrive_policy:
      # 最大受信数
      maxReceiveCount: 2
      # デッドレターキュー
      deadLetterTargetArn: 'arn:aws:sqs:ap-northeast-1:{{ account_id }}:my_sqs_dlq'
```

## 参考
[AWS　SQS(Amazon Simple Queue Service)の使い方](http://qiita.com/iron-breaker/items/0b2f8c20e7527b5aa552#queue%E3%82%92%E4%BD%9C%E6%88%90)
[【AWS】SQSをただただ触ってみただけの話](http://blog.nikuniku.me/entry/2015/12/23/141000)
[SQSのロングポーリング機能を試してみた](https://cloudpack.media/472)
ブラウザの言語設定🌐をチェックしたいな😐

## 質問🙋

🇬🇧🇺🇸と🇫🇷のホームページ🖥️を作ったんだけど、
見にくる人👥にあわせて、ブラウザの言語設定🌐から切り替えられないかな🤔
モバイル端末📱からできると最高なんだけど😀

## 回答👨‍⚕️

このコード📝でブラウザの言語設定🌐がわかるよ😊

```js
var userLang = navigator.language || navigator.userLanguage;
alert("ブラウザの言語設定🌐は、" + userLang + "です💡");
```

がんばってね😉