OmniAICreator/Qiita-1.07M huggingface dataset:
npm install で shasum check failed が表示される

# 問題

`npm install` すると `shasum check failed for ...` が表示される。

## 出力例

```
$ npm i -D nyc
npm ERR! Darwin 15.4.0
npm ERR! argv "/Users/bouzuya/.nodebrew/node/v6.1.0/bin/node" "/Users/bouzuya/.nodebrew/current/bin/npm" "i" "-D" "nyc"
npm ERR! node v6.1.0
npm ERR! npm  v3.8.6

npm ERR! shasum check failed for /var/folders/fw/6jrx0r2s6215zd_l8rf6b96c0000gn/T/npm-842-2e3583c5/registry.npmjs.org/nyc/-/nyc-6.6.1.tgz
npm ERR! Expected: 2f6014610a57070021c4c067e9b9e330a23ac6a7
npm ERR! Actual:   17d1dec8ff60d022f8958b29f75ab468fa5c8444
npm ERR! From:     https://registry.npmjs.org/nyc/-/nyc-6.6.1.tgz
npm ERR! 
npm ERR! If you need help, you may report this error at:
npm ERR!     <https://github.com/npm/npm/issues>

npm ERR! Please include the following file with any support request:
npm ERR!     /Users/bouzuya/.ghq/github.com/bouzuya/time-keeper-js/npm-debug.log
```

## 他の例

おそらく次の Issue と同じもの。

https://github.com/npm/npm/issues/2701

# 解決策

正しい解決策なのかは分からないが、`rm -rf ~/.npm/ ` で解決した。
RouteValueDictionaryクラスで匿名型を辞書に変換する


匿名型のオブジェクトを受け取るメソッドを書く必要があって、objectで受け取るとプロパティにアクセスするにはリフレクション使わないといけないのかな、だとしたら面倒だなぁと思ってたら、`system.web.routing`にある`RouteValueDictionary`を使うと簡単に`IDictionary<string, object>`に変換できると知ったのでメモ。

使い方は、`RouteValueDictionary`のコンストラクタに匿名型のオブジェクトを渡すだけ。簡単。

[MSDN:RouteValueDictionary クラス](https://msdn.microsoft.com/ja-jp/library/system.web.routing.routevaluedictionary(v=vs.110).aspx)

```csharp

	using System;
	using System.Web.Routing;
	
    class Program
    {
        // 匿名型のオブジェクトを受け取り、辞書に変換する
        static void Func(object anonymousObj)
        {
            var dict = new RouteValueDictionary(anonymousObj);
            foreach (var kv in dict)
            {
                Console.WriteLine($"{kv.Key} => {kv.Value}");
            }
        }

        static void Main(string[] args)
        {
            Func(new { item1 = "aaa", item2 = 123 });
            Console.ReadLine();
        }
    }
    
```
[ERROR] `/sbin/mount.vboxsf: mounting failed with the error: No such device`

こんなエラー。

```
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device
```

vagrant のプラグイン`vagrant-vbguest`をインストール。

```
vagrant plugin install vagrant-vbguest
```

後はvagrantを再起動すると、OK!

# 参考サイト

http://kashewnuts.bitbucket.org/2013/08/25/vagrantvbguest.html

http://qiita.com/DriftwoodJP/items/742a605286f295306363
非vimmerもこれだけは覚えていてほしいvimコマンドシリーズ 第一弾【di*, da*系】

#なにこれ
「普段はvim使ってないけど、サーバ上ではvimです。」っていう人向けのvimコマンド集です。
特にpluginを入れなくても使える機能になります。

# di*, da*系
*に書いたものの中身を消します。

##実践
###di

```py3
if __name__ == '__main__':
    print('HelloWor|ld!') # |の位置がカーソルだと思ってください…
```

di'(シングルクォート)と入力　　

```py3
if __name__ == '__main__':
    print('|') # |の位置がカーソルだと思ってください…
```
このように'の中身が消えます。

###da

```py3
if __name__ == '__main__':
    print('HelloWor|ld!') # |の位置がカーソルだと思ってください…
```

da'(シングルクォート)と入力　　

```py3
if __name__ == '__main__':
    print(|) # |の位置がカーソルだと思ってください…
```
このように'ごと中身が消えます。

## ちなみに
今回はdi', da'だけ例を出しましたが、　　

```
di(  // (の中身を消す
di{  // {の中身を消す
di[  // [の中身を消す
di<  // <の中身を消す
di"  // "の中身を消す
dit  // (これだけ特殊)HTMLのタグの中身を消す
da(  // (ごと中身を消す
da{  // {ごと中身を消す
da[  // [ごと中身を消す
da<  // <ごと中身を消す
da"  // "ごと中身を消す
dat  // (これだけ特殊)HTMLごとタグの中身を消す
```
というように組み合わせは多数存在して、大体の囲み系の構文はデフォルトでサポートしています(rubyのブロック構文の||だけ未対応を確認中)

#まとめ
di*, da*系のコマンドを使いこなすと、ぐっとvimを使えてる感が高くなるので試して見てください！
GPUのメモリ使用率の確認方法（Windows）

#GPUメモリの使用率するソフト

chainerでディープラーニングを試しているとGPUメモリの使用量を確認したくなることがあります。
タスクマネージャーみたいな感じグラフで推移が見たいと思って探していると、
ELSAより便利なソフトが出ていました。

ELSA System Graph

http://www.elsa-jp.co.jp/products/products-top/graphicsboard/geforce/gpu_manager/elsa_system_graph/

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/109458/974182ac-99f6-0295-c640-8f9d71d71a0d.png)

Windows 7 professional
GeForce　GTX 970　にて確認



#jupyterから確認（2016.11.06 追記）

別PCに計算させている場合に上記の方法ではわからないので、jupyterから簡易的にみる方法

計算側のPCの環境変数Pathに
```C:\Program Files\NVIDIA Corporation\NVSMI```
を追加しておく。

jupyter上で
```!nvidia-smi```
にて以下のようなテキストが出力されます


![image](https://qiita-image-store.s3.amazonaws.com/0/109458/4e52e949-e71c-4d9e-a7d7-3510cae326d5.png)
CMD.EXE TIPS

# What is this?
カスタマーの環境下では、Software Installを厳しく制限されていて、msysやcygwinを導入できない場合があります。
CMD.EXE(MS-DOS)のCapabilityを知っておくと役に立つ場面が、時折あります。

とくにWindows7proでは純DOS時代より拡張されている様ですので、意外と色々できますね・・・の、自分用備忘録。

# 計算してみる
## 0x87F + 2014 っていくつ?
```

C:\> set /a 0x87F + 2014
4189
```

# 変数展開
## `C:\oraora\hogehoge.txt` の .txt を .bin に変えたい
```

C:\> set APATH="C:\oraora\hogehoge.txt"

C:\> echo %APATH:.txt=.bin%
"C:\oraora\hogehoge.bin"

```
**※見つかった.txtは全て変換されてしまうことに注意！**

# 組み込み変数
* `%CD%` 現在のディレクトリがフルパスで入っている


# Forによる繰り返し(Consoleから)
```

C:\> for %i in (*.txt) do echo %i

```
AWS のコスト例（個人利用）

個人で AWS (Amazon Web Service) を利用していますが、1年間の無料期間後、有料に移行して半年後のコスト例です。

EC2 は t2.micro (1CPU,MEM 1GB, DISK 8GB) です。EC2 以外には S3 を利用していますが、ほとんど料金がかかっていません。

6月の予測が 12.57ドル になっていますが、ふつうはこれを超えることはなくて、たいてい 10ドル も行かないと思います。
円高が進んでいるので、負担も少なくなっています。


![AWS_Cost1.png](https://qiita-image-store.s3.amazonaws.com/0/62802/657493d5-5a52-1aa4-522f-4588cd1febb2.png)


S3 の料金は下の通り、すごく安いので大きなファイルは S3 に置いて EC2 はよく使うものや高速なアクセスが必要なものだけにして節約しています。

![AWS_Cost2.png](https://qiita-image-store.s3.amazonaws.com/0/62802/2d081dca-4dd4-f39b-850b-f1d91917e994.png)
クラスのメソッド内でプロファイルをする

# 背景

http://docs.python.jp/2/library/profile.html を見て、cProfile.run() でプロファイルできるんだと思ってクラスのメソッド内で使うと `NameError: name 'self' is not defined` のエラーになってしまう。

```py
import cProfile

class MyClass(object):
    def someFunc(self):
        cProfile.run("self.anotherFunc()")

    def anotherFunc(self):
        pass

if __name__ == '__main__':
    m = MyClass()
    m.someFunc()
```

2度はまったので3度目はまる前にメモしとく。

# 解決方法

runctx を使うとよい

```py
import cProfile

class MyClass(object):
    def someFunc(self):
        cProfile.runctx("self.anotherFunc()", globals(), locals())

    def anotherFunc(self):
        pass

if __name__ == '__main__':
    m = MyClass()
    m.someFunc()
```

http://stackoverflow.com/questions/4492535/profiling-a-method-of-a-class-in-python-using-cprofile を参考にした
Rでサーミスタ

#概要
Rでサーミスタをグラフ化してみた。
#サンプルコード
```
y <- function(d) {
	15000.0 * d / (5.0 - d)
}
plot(y, 0, 5)
```
#写真
![g0.png](https://qiita-image-store.s3.amazonaws.com/0/18104/d4a17d0c-e351-4ec8-825f-39649dbbf762.png)

#サンプルコード
```
y <- function(t) {
	1 / (0.001129148 + (0.000234125 + (0.0000000876741 * log(t) * log(t))) * log(t)) - 273.15
}
plot(y, 500, 15000)

```
#写真
![g1.png](https://qiita-image-store.s3.amazonaws.com/0/18104/1f077b34-fbfd-59ff-9643-4081cbafde16.png)

#サンプルコード
```
y <- function(d) {
	t = 15000.0 * d / (5.0 - d)
	1 / (0.001129148 + (0.000234125 + (0.0000000876741 * log(t) * log(t))) * log(t)) - 273.15
}
plot(y, 0.5, 4.5)
```
#写真
![g2.png](https://qiita-image-store.s3.amazonaws.com/0/18104/ab33ce01-3543-d93b-e24b-a4f034f59dff.png)
クラス定数(static final変数)およびインスタンス定数(final変数)の初期化

例：

```java
public class Sample {
    // クラス定数 (static final変数)
    static final int A = 365;
    static final int B;

    // クラス変数 (static変数)
    static int c;

    // インスタンス定数 (final変数)
    final int D = 24;
    final int E;

    // インスタンス変数
    int f;

    static {
        // コンパイルエラー: 初期化済定数の再初期化はできない
        // A = 0;
        // staticイニシャライザ内であればクラス定数の初期化が可能
        B = 366;
        c = 4;
    }

    Sample() {
        // コンパイルエラー: 初期化済定数の再初期化はできない
        // D = 0;
        // コンストラクタ内であればインスタンス定数の初期化が可能
        E = 60;
	// インスタンス変数への代入は当然可能
        f = 7;
	// クラス変数への代入も可能
        c = 100;
    }

    public static void main(String args[]) {
        Sample sample = new Sample();
    }
}
```

* クラス定数(static final変数)の初期化は宣言時、あるいはstaticイニシャライザ内で可能（クラスロード時に呼び出されるため）
* インスタンス定数(final変数)の初期化は宣言時、あるいはコン*ストラクタ内で可能
* 宣言時に定数を初期化し、加えて再度初期化を行うとコンパイルエラー（初期化の重複）
Gmailに複数アカウントを作ってもいいのか

Gmailで複数アカウントを作っている人は珍しくない印象ですが、これはGoogleが認めている使い方なのか、気になったので調べてみました。

[Gmail Program Policie](https://www.google.com/intl/en_us/mail/help/program_policies.html)に、次のような文章が見つかります。

> The Creation and Use of Multiple Gmail Accounts
>
> Don’t create or use multiple accounts to abuse Google policies, bypass Gmail account limitations, circumvent filters, or otherwise subvert restrictions placed on your account. (For example, if you’ve been blocked by another user or have had your Gmail account disabled due to abuse, don’t create a replacement account that engages in similar activity.)
> 
> You’re also not allowed to create Gmail accounts by automated means or buy, sell, trade, or re-sell Gmail accounts to others.

以下、拙訳。

> 複数Gmailアカウントの作成と利用
> 
> 以下の目的で複数のGmailアカウントを作成したり利用したりすることはできません：Googleポリシーを不正利用する・Gmailアカウントの制限を回避する・フィルタの裏をかく・その他あなたのアカウントに対する制約を外す（たとえばあなたが別のユーザーにブロックされていたり、不正利用によりアカウントが凍結されたりした場合に、同じ目的で代わりのアカウントを作ることはできません）
>
> 自動的な方法（訳注：ボットでの大量取得などを想定しているのでしょう）でGmailアカウントを作ることも禁止されています。また、Gmailアカウントの売買・交換・再販も禁止されています。

常識的な使い方をしている限り、複数アカウントを取っても規約上は問題なさそうですね。

もっとも、Gmailの場合は`foo+bar@gmail.com`のように`+`を使えばメールアドレスを無限に作れるので、複数アカウントが必要になることは少ないように思います。
Qiita始めました


今更だけどQiita始めてみたので、kobitoの使用感テストも兼ねて初投稿してみる

つか、Markdownあんまり知らないです

# 見出しー
最初#のあとにすぐ文字をつなげて、見出しにならないって悩んでたのは秘密

### シンタックスハイライト
```javascript:javascript
$('#hoge').css('display', 'block');
var moge = "hana";
if (moge == "hanage") { 
    return "deteru";
}
true;
false;
```

```php:php
function hoge($moge = 'hanage') {
    if($moge == 'hanage') {
        // コメント
        print('deteru');
    } else {
        print('detenai');
    }
}
```
```vbnet:vb
Public Function Hoge(ByVal moge As Integer)
    ' コメント
    Return moge & "!"
End Function
```
```csharp:C#
var hoge = "moge";
// コメント
if (hoge == "moge") {
    Console.WriteLIne(hoge);
}
```
なるほど、シンタックスハイライトは簡単だ

```ex:exってなに？
# コメント
case {:ok, "hogemoge"} do
    {:ok, result} -> IO.puts(result)
    _ -> IO.puts("mumumu")
end

foo = fn(a) -> a + a end
```
~~Elixirはまだないのかな？~~
kobitoだと効いてないみたいだけど、投稿してみたらこれがElixirっぽい！


# そんなわけで
まったり勉強メモ中心でやっていきます
Syntax highlighting to Digdag file in Atom

先週[Digdag](http://www.digdag.io/)がTreasureDataからOSSとして公開されました。

詳細は[digdag.io](http://www.digdag.io/)に記載してあるのですが、Digdagではworkflowをコードで記述し、バージョン管理できるようにするのがひとつの目的です。そのためworkflowの定義は`*.dig`ファイルにyamlのようなフォーマットで記述します。

# Syntax highlighting in Atom

この定義ファイルを[Atom](http://atom.io/)で書こうと思ったのですが当然のことながら`*.dig`というファイルをAtomは知らないので以下のように真っ白で、syntax errorのようなものが出てきてしまいました。

<img width="422" alt="Screen Shot 2016-06-18 at 07.54.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/7129/649f0dd3-ebc8-301e-0044-0fd28812a3ba.png">

ちょっとこれだと寂しいので[language-digdag](https://github.com/Lewuathe/language-digdag)という`*.dig`ファイルをsyntax highlightingしてくれるAtom packageを作成しました。

[language-digdag](https://atom.io/packages/language-digdag)

インストールは

```
$ apm install language-digdag
```

かCmd+Shift+Pで`Install Packages and Themes`から検索していれることができます。
これを入れると例えば（僕の環境では）下記のようになります。

<img width="373" alt="Screen Shot 2016-06-18 at 07.59.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/7129/2ba7c690-1b8b-4e0d-50b3-012a8a774ceb.png">

一応[digdag.io](http://www.digdag.io)を見て予約後とかhighlightできるようにしたのですが何か見落としあれば教えてください。
めざせpythonライブラリマスター （60）colourettu

#【ライブラリ説明】
　色に関する関数ライブラリ

#【プログラム】
```py
# -*- coding: utf-8 -*-

import colourettu

c1 = colourettu.colour()
c2 = colourettu.colour("#eee")
c3 = colourettu.colour("#456bda")
c4 = colourettu.colour([3, 56, 129])
c5 = colourettu.colour((63, 199, 233))
c6 = colourettu.colour([0.242, 0.434, 0.165], normalized_rgb=True)

all_colours = [c1, c2, c3, c4, c5, c6]
p2 = colourettu.palette()
p2.from_list(all_colours)
p2.to_image('p1.png', max_width=360, vertical=False)
```

#【結果】
![p2.png](https://qiita-image-store.s3.amazonaws.com/0/121997/33eb75b4-be06-fce1-8a9c-156dc921944b.png)

#【参考サイト】
　[pypi](https://pypi.python.org/pypi/colourettu/1.1.0)
　[github](https://github.com/minchinweb/colourettu)
　[document](http://minchin.ca/colourettu/index.html)
arduinoでmap関数

#概要
arduinoのmap関数が便利そうなので、テストしてみた。
#コード
```
long map(long x, long in_min, long in_max, long out_min, long out_max) 
{
  	return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
```
#サンプルコード
```
void setup()
{
	Serial.begin(115200);
	Serial.println("ok");
	long ans;
	ans = map(300, 200, 500, 0, 100);
	Serial.print("map(300, 200, 500, 0, 100) = ");
	Serial.println(ans);
	ans = map(600, 200, 500, 0, 100);
	Serial.print("map(600, 200, 500, 0, 100) = ");
	Serial.println(ans);
	ans = map(100, 200, 500, 0, 100);
	Serial.print("map(100, 200, 500, 0, 100) = ");
	Serial.println(ans);
	ans = map(300, 200, 500, -400, 0);
	Serial.print("map(300, 200, 500, -400, 0) = ");
	Serial.println(ans);
	ans = map(600, 200, 500, 0, 100);
	ans = constrain(ans, 0, 100);
	Serial.print("map2(600, 200, 500, 0, 100) = ");
	Serial.println(ans);
	ans = map(100, 200, 500, 0, 100);
	ans = constrain(ans, 0, 100);
	Serial.print("map2(100, 200, 500, 0, 100) = ");
	Serial.println(ans);
	
}
void loop()
{
}
```
#結果
![map.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/fa1b1cb3-b833-8853-405e-c64ef0429e84.jpeg)
技術英語 > in the [seemingly] endless ocean / seemingly impossible feats / ostensibly

@ LOE > June 6, 2003
http://loe.org/shows/shows.html?programID=03-P13-00023
>  in the seemingly endless ocean

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

> seemingly impossible feats

一見不可能な離れ技

@ アメリカ口語教本 上級用 by William L. Clark

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

http://ejje.weblio.jp/content/ostensibly
> 表面上(は)

他にもsuperficiallyやat a glanceなどもあったりするが使い分けは未消化。
EntityFrameworkメモ ツール編

# EntityFrameworkメモ ツール編

とりあえず見つけたのでメモ
おいおい試していくつもり

[LLBLGen Pro](http://www.llblgen.com/)
Free版あり
制限：Max. of 8 entities per project.

[Entity Developer](https://www.devart.com/entitydeveloper/)
Express版あり
制限：does not allow customization of code templates and is limited to 10 entities in the project.

2016/06/22に補足
EntityFramework Reverse POCO Generatorってのも見つけた

[EntityFramework Reverse POCO Generator](https://visualstudiogallery.msdn.microsoft.com/ee4fcff9-0c4c-4179-afd9-7a2fb90f5838)
Licensed under the Apache License, Version 2.0
めざせNode.jsライブラリマスター （15）colors

#【ライブラリ説明】
　コンソールの色を変更

#【プログラム】
```js
var colors = require('colors');

console.log('hello'.green);
console.log('i like cake and pies'.underline.red);
console.log('inverse the color'.inverse);
console.log('OMG Rainbows!'.rainbow);
console.log('Run the trap'.trap);
```

#【結果】
<img width="196" alt="color.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/ec6b5a22-633d-00c7-22a6-97657ffea5ca.png">

#【参考サイト】
　[npm](https://www.npmjs.com/package/colors)
　[github](https://github.com/Marak/colors.js)
css　ヘッダー上部の空白を消す

何も指定していなくてもデフォルトでmarginが指定されているのでmarginを消す。

html,body{margin:0px;}

これをcssに書くだけ。


自分はヘッダー上部の空白が気になったのでこう検索する人がいるんじゃないかと思ってタイトルはヘッダー上部の空白を消すにしてありますが、
もちろん、上記の指定では上下左右全部のデフォルトのmarginが0になります。
os.Exit()はDefer functionの実行を待たない問題への対処

Goで`os.Exit()`と`defer f()`を両方使う場合を何度も調べている気がするので覚書。
おなじ関数内でこれらを使うと、`defer`が実行されない。別関数に分離すべき。

# 具体例
[os.Exit()はDefer functionの実行を待たない - harukasan | Qiita](http://qiita.com/harukasan/items/586d6c042191a378b2e7)
でも書かれているが

```go
package main

import "os"

func test() {
	println("hello in test.")
}

func main() {
	println("hello in main.")
	defer test()

	println("pre-exit in main.")
	os.Exit(0)
}
/** OUTPUT **
hello in main.
pre-exit in main.  <-- defer test()が実行されていないで終わる
*/
```

ということが起こる。
例えばファイルのクローズなどの処理を`defer`に書き、おなじ関数内で`os.Exit()`すると意図した終了処理が行われない。

公式ドキュメントによると、

> Go言語のdeferステートメントは、deferを実行した関数がリターンする直前に、指定した関数の呼び出しが行われるようにスケジューリングします。

とのことなので、関数を分けてしまえば良い。

```go
package main

import "os"

func test() {
	defer func() {
		println("defer in test.")
	}()
	println("hello in test.")
}

func main() {
	println("hello in main.")
	test()

	println("pre-exit in main.")
	os.Exit(0)
}
/** OUTPUT **
hello in main.
hello in test.
defer in test.
pre-exit in main.
*/
```

よくあるコマンドコンソールアプリの構造だと以下のような感じにする。

```
github.com/umanoda/hoge
├── cmd
│   └── hoge
│       └── main.go   : package main
└── hoge.go           : package hoge
```

```go:github.com/umanoda/hoge/hoge.go
package hoge

type Hoge struct{
  :
}

func New() Hoge{
	h := Hoge{../* etc.. */..}
	return h
}

// errorインターフェースの実装
func (h *Hoge) Error() string{
	return "hogeeeeeeeee!!"
}

func (h *Hoge) Run() (*Hoge, error){
	/*
	   : 処理
	*/
	defer func(){...}() //クローズなどの処理
	// 正常終了
	return h, nil

	// 異常終了
	return h, h
}
```

```go:github.com/umanoda/hoge/cmd/hoge/main.go
package main
import (
	"fmt"
	"os"
	"github.com/umanoda/hoge/hoge"
)

func main(){
	h = hoge.New()
        _, err := h.Run()
	if err != nil {
		// 異常終了
		fmt.Println("error: ", err)
		os.Exit(1)  // h.ErrorCode()を実装するとかはお好きに
	}
	os.Exit(0) // 正常終了
}
```


# 検証環境

```
$ go version
go version go1.6.2 linux/amd64
```
おそらく誰も見ていないであろうが、Pascalの構文についてまとめたい

### この記事を書こうと思った理由
大学院の試験がどのようなものかチラリとみてみたところ、なんとPascalによるアルゴリズムの記述があるではありませんか。
全く知らない&資料も何を参考にすればいいかわからない、そんな環境で正しいであろうことを推測してこの記事にまとめることにします。
新しいことがわかり次第、どんどん内容を追加していきます。

### 実行環境
整えられませんでした！！！

### Syntax
#### Declaration(変数の宣言)
Pascalではプログラムの作法に則って、先にプログラム中に登場する変数の型を宣言しておくのが決まりみたいです。

```Pascal
var
  foo: integer;
  bar: real;
```

#### Assignment(代入)
Pascalの場合、他の多くのプログラミング言語と違って、代入には":="を用いるようです。

```Pascal
foo := 100;
```

#### While loop(while文)
Pascalのwhile文は実行される処理の内容をbegin~end;の間に記述するようです。

```Pascal
while i <= 10 do
  begin
  sum := sum + Array[i];
  i := i + 1;
  end;
```

#### プログラムの記述のルール
手続きの形式は以下のようになっています。

```Pascal
program getTotal;
(変数の宣言区)
begin
(処理)
end.
```

変数の宣言区では、上述のDeclarationのように記述し、それらの変数を用いて行いたい処理はbegin~end.の行間に記述するようですね。
Pascalにユニークなのは手続きについての記述の終了にはend.を付加するところなんかでしょうか。
ピリオドをうっかり忘れてしまうと動かないみたいです。

### 感想
僕らがまだ生まれていないような時代に教材として扱われていたプログラミング言語には、現代のプログラミングを良化すべく再認識するべきことがたくさんあると感じました。
例えばプログラム中にある程度変数の宣言区と処理の記述を分けて、きちんと登場人物紹介をしておくことはプログラムが膨大になっていくにつれて見通しを良いものにしてくれます。他にも型をはっきりと宣言しておくことで意図しない型変換が起こらず、きっちりとした値の運用が可能になります。
私のような文系プログラマにとっては、このようなレガシーはプログラムの構造を教えてくれる重要な教材に思えます。
まさしく温故知新。今後も他に何かあれば追記していきます。
OS X El CapitanでVirtualBoxを使ってUbuntuを動かす直前まで・・・

#環境
- OS X 10.11.4
- VirtualBox 5.0.22
- Ubuntu 14.04 LTS 64bit

#準備
##VirtualBoxのインストール
1. [ここ](https://www.virtualbox.org/wiki/Downloads)からVirtualBoxをダウンロード
2. ダウンロードしたdmgファイルを開き、中の「VirtualBox.pkg」をダブルクリック
3. Applicationフォルダに「VirtualBox.app」が作られる。

##Ubuntuのダウンロード
1. [ここ](http://www.ubuntulinux.jp/download/ja-remix)からUbuntuをダウンロード。今回は14.04 LTSの64bitを選択。

# VirtualBox上に仮想マシンを作る
1. 新規を押して仮想マシンを作る。![start](https://s3.amazonaws.com/f.cl.ly/items/1t2o2W0M3O411A3W3c0w/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202016-06-18%202.14.49.png)
2. 次に、名前欄は適当に記入。タイプはLinux、バージョンはUbuntu(64-bit)を選択 ![config](http://cl.ly/231s1p2p1B2G/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202016-06-18%202.26.52.png)
3. 次のメモリサイズは768MB以上（今回は1GB）![config2](http://cl.ly/2T1L0e1n2v2t/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202016-06-18%202.26.59.png)
4. 今回は仮想ハードディスクを作成する（8GB）![config3](http://cl.ly/211S3g2n2B2e/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202016-06-18%202.27.03.png)
5. ハードディスクのファイルタイプは、他の仮想ソフトウェアで使う予定がないのでVDIを選択
6. 物理ハードディスクにあるストレージは、今回は可変サイズを選択
7. ファイルの名前とサイズも任意で設定
8. 完了 ![finish](http://cl.ly/240R2B2m1l0I/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202016-06-18%202.34.18.png)


# Ubuntuの設定
1. マネージャー画面（上図）の設定を押す
2. ストレージタブを選択し、「コントローラー:IDE」下の「空」を選択し、図の赤丸のディスクアイコンをクリックし、準備でダウンロードしたIOSファイルを選択する　![emp](http://cl.ly/313N0u1X1v31/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202016-06-18%202.47.38.png)



# 起動
1. マネージャー画面の起動ボタンをクリック
2. このような画面がでれば大体OK ![ok](http://cl.ly/2p3w3u0G0I1A/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202016-06-18%202.57.05.png)
Redux + React + ES6 の簡単アプリを作成する①(Redux編)

# 背景

* Reactにも慣れが出てきたので、次はFluxのデータフローについて学ぼうと思った。
* Fluxの詳しいデータフローに関しては、公式サイトや別の記事を参考に。
* Fluxのフレームワークとしては、頭1つ抜けているReduxを選定した。
* ReactとReduxの連携部分で多少はまったのでメモ。

![687474703a2f2f692e696d6775722e636f6d2f4a65567164514d2e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/129216/fff46595-e1a3-826e-ca68-847fa0567b2a.png)


# 学習内容

* Flux(Reduxベース)の基本的な考え方。
* Flux(Reduxベース)のデータフローと登場人物。
* Fluxでよくみる図。
<img width="1116" alt="flux.png" src="https://qiita-image-store.s3.amazonaws.com/0/129216/0e12670f-14ce-77b1-76f1-7c8722e2078b.png">


# 概要

入力した内容がそのまま出力されるだけのアプリ。
state管理をReduxのみで行う。

![react-redux.gif](https://qiita-image-store.s3.amazonaws.com/0/129216/97915324-27ba-b532-3a39-c99807d8a49c.gif)

# Action

ActionはActionCreatorという純粋な関数である。
ActionCreatorはActionオブジェクトを返し、Store(※後述)のdispatch関数に引数として渡される事でStoreにEmit出来る。

``` js:src/actions/FormActions.jsx

const SEND = 'SEND';

export default {
  send(value) {
    return {
      type: SEND,
      value
    };
  }
} ;
```

ActionCreatorの返り値は、Actionオブジェクトとなり、dispatchの対象となる。
ReducerでどのActionかを判別するために、typeプロパティは必須で指定する。

# Reducer

ActionがStoreにdispatchされたら、Reducerが発火。
現在のstateとdispatchされてきたActionを元に新しいstateを発行する。

``` js:src/reducers/FormReducer.jsx
const formReducer = (state, action) => {
  switch (action.type) {
    case 'SEND':
      return (
        Object.assign({}, state, {
          value: action.value
        })
      );
    default:
      return state;
  }
};

export default formReducer;
```

Reducerは複数定義可能な関数であるが、最終的にStoreが作られる際に渡されるReducerは1つだけである。
複数作成したReducerは1つにまとめる必要がある。
Object.assignを使っているのは、ReduxはReducerで引数として渡された現在のstateとの差分を元に新しくstateを作成します。
Reduxの考え方(Fluxの考え方)として、既存のstateを書き換える事はしません。
あくまでも、新規でstateを作成する為に、Object.assignを利用します。

```js:src/reducers/AppReducer.jsx
import formReducer from './FormReducer';

const reducers = formReducer;

export default reducers;
```

先程作成したFormReducerと、ReduxのcombineReducers関数を呼び出し、複数のReducerを結合する事が可能。
今回は1つのReducerで処理する為、そのままexportしている。
(今回はReducerを複数に分ける必要もありませんが、一応分けます。)

# Store

Storeはstateを管理する単純なオブジェクトである。
Reactの様にどこでも宣言できるだけではなく、1つのアプリケーションにつきStoreは1つである。
ReduxのcreateStore関数に、Reducerを渡す事でStoreが作成される。


# 終わり

Redux自体はAction->Reducer->Storeの単純な流れに過ぎない。
(Reactのstate管理を奪い取るイメージ)
次回はReact+Reduxの連携を試してみる。
KEN_ALL.CSV (郵便番号検索)の落とし穴

[KEN_ALL.CSV の話題](http://togetter.com/li/352382) でやたら盛り上がってるから... というわけでもないけれど, 仕事絡みで調べる機会があったので, まとめてみました.

### 2行に跨がってる

[KEN_ALL.CSV] [1] の悪名高き「2行に跨がっている」データの一部です. しかも, 勝手に省略されてたりします.

<pre>
028-5102 岩手県岩手郡葛巻町葛巻（第４０地割「５７番地１２５、１７６を除く」～第４５地割）
826-0043 福岡県田川市奈良(青葉町､大浦､会社町､霞ケ丘､後藤寺西団地､後藤寺東団地､希望ケ丘､松の木､三井後藤寺､緑町､月見ケ丘)
</pre>

### 同じ郵便番号で別の都道府県

郵便番号では都道府県を特定できません...

<pre>
498-0000 三重県桑名郡木曽岬町, 愛知県弥富市
618-0000 大阪府三島郡島本町, 京都府乙訓郡大山崎町
871-0000 大分県中津市, 福岡県築上郡吉富町
</pre>

### 重複データ

これは同じ住所が2行ある郵便番号. 残しておいてもあまり意味は無いと思うんですけど, 直せないんですかね.

<pre>
581-0027 大阪府八尾市八尾木
673-0012 兵庫県明石市和坂
</pre>

### 長い住所

並ぶと圧巻ですね!
これらの住所, KEN_ALL.CSV には「京都府京都市上京区上塔之段町」といった, 「通り」を省略した住所が登録されています.
しかし,以下のような「通り」を含めた住所が正式のようです.
また, 「町名」が「通り」を跨いでいたりして前方一致で検索できなかったりする技術屋泣かせの住所です.
宅配便などでも, 町名だけでは判断できず, 「通り」がわからないと配達できないこともあるみたいです.

<pre>
602-8303 京都府京都市上京区寺之内通千本東入１丁目下る姥ケ寺之前町
602-8413 京都府京都市上京区大宮通寺之内下る東入２丁目大北小路東町
602-0834 京都府京都市上京区寺町通今出川下る１筋目西入大原口突抜町
602-0861 京都府京都市上京区河原町通丸太町上る２筋目西入新烏丸頭町
602-0833 京都府京都市上京区寺町通今出川下る１筋目西入真如堂突抜町
602-0898 京都府京都市上京区烏丸通寺之内上る１筋目西入相国寺門前町
602-0898 京都府京都市上京区烏丸通寺之内上る２丁目東入相国寺門前町
602-0898 京都府京都市上京区烏丸通寺之内上る２筋目東入相国寺門前町
602-0898 京都府京都市上京区烏丸通寺之内上る東入１筋目相国寺門前町
602-0898 京都府京都市上京区烏丸通寺之内上る東入２丁目相国寺門前町
602-0898 京都府京都市上京区烏丸通寺之内上る東入２筋目相国寺門前町
602-0898 京都府京都市上京区烏丸通寺之内上る東入３丁目相国寺門前町
602-0097 京都府京都市上京区大宮通寺之内上る４丁目西裏西若宮北半町
602-0097 京都府京都市上京区大宮通寺之内上る５丁目西入西若宮北半町
602-0097 京都府京都市上京区大宮通寺之内上る５丁目西裏西若宮北半町
602-0096 京都府京都市上京区大宮通寺之内上る４丁目西入西若宮南半町
602-0096 京都府京都市上京区大宮通寺之内上る４丁目西裏西若宮南半町
602-8387 京都府京都市上京区今小路通七本松西入２丁目上る東今小路町
602-8387 京都府京都市上京区今小路通七本松西入下る２丁目東今小路町
602-0806 京都府京都市上京区寺町通上立売上る２筋目西入上る藪之下町
605-0032 京都府京都市東山区三条通白川橋東４丁目黒谷道西入柚之木町
600-8257 京都府京都市下京区岩上通木津屋橋下る３丁目西入三軒替地町
602-0813 京都府京都市上京区今出川通寺町１筋西入上る２丁目上神輿町
605-0015 京都府京都市東山区三条通南裏二筋目白川筋西入二丁目南側南木之元町
602-0898 京都府京都市上京区今出川通烏丸東入上る二筋目東入下る相国寺門前町
605-0014 京都府京都市東山区三条通南裏二筋目白川筋西入二丁目北側北木之元町
602-0815 京都府京都市上京区寺町通今出川上る一丁目西入三筋目上る上塔之段町
</pre>

### 同じ町に複数の郵便番号

京都市中京区亀屋町の住所は, 2行に跨っている上に複数の郵便番号にも跨がってます...
住所自動入力などでも, 正確に入力されず, 結局入力し直す羽目になったりすることも.

<pre>
京都市中京区亀屋町

604-0094 （釜座通竹屋町下る、釜座通夷川上る、夷川通釜座西入、夷川通釜座東入、夷川通西洞院東入、夷川通新町西入）
604-0811 （堺町通夷川下る、堺町通二条上る、夷川通堺町西入、夷川通堺町東入）
604-0865 （竹屋町通烏丸西入、竹屋町通両替町東入、竹屋町通両替町西入、竹屋町通室町東入、両替町通室町下る）
604-0941 （御幸町通御池上る、御幸町通押小路下る、御幸町通押小路西入、御幸町通押小路東入、押小路通寺町西入、御池通御幸町西入、御池通御幸町東入）
604-8253 （蛸薬師通堀川東入、堀川通蛸薬師下る、蛸薬師通油小路西入）
</pre>


### こんな素晴しい parser もあります

https://github.com/yappo/p5-Parse-JapanesePostalCode

### よりよい UX を提供するために

多くの開発者が KEN_ALL.CSV の問題に取り組んで、多くの郵便番号検索 API がリリースされています。
しかし、前出の京都の一部の住所のように、郵便番号のみでは的確に住所入力できない場合があるのも事実です。

実は、町・字、丁目までを収録された住所マスタが[国土地理協会より販売](http://kokudo.or.jp/master/001.html)されています。
このような、町・字、丁目まで収録したデータベースと、郵便番号検索を的確に組み合わせることによって、さらに高いレベルのユーザーエクスペリエンスを提供できると思います。

  [1]: http://www.post.japanpost.jp/zipcode/download.html "オリジナルの KEN_ALL.CSV はこちらからダウンロードできます"

### こちらも参考に

- [郵便番号や市区町村データを取り扱うときにはまったこと](http://qiita.com/khirose/items/3a121656425fac7bb820)
なんだ、Windowsでも環境変数設定してコマンド実行できるんじゃん！

いやいや、今日まで気が付きませんでした。
よくGo言語のクロスコンパイルの方法で

```bash
GOOS=linux GOARCH=amd64 go build
```

なのを見ますが、Windowsでこの手のやり方があるを知らず

```bash
set GOOS=linux
set GOARCH=amd64
go build
```

と実行していました。

しかし！MSYSなどに入ってる`env`を使えば、これが出来ることを知りました。
こんな感じです

```bash
C:/MSYS/bin/env.exe GOOS=linux GOARCH=amd64 go build
```

他にもGit for windowsの`TERM`問題も解決です。

```lua:.nyagos
nyagos.alias.git = function(args)
    nyagos.exec('env TERM=msys git ' .. table.concat(args['rawargs'], ' '))
end
```

(GitでTERMがmsysじゃないとpager起動時にWarning出たり、
かといって常にTERM=msysにしておくと
sshでサーバにつないだ時に表示が乱れたりしていて困っていました)

まぁ知ってる人は知ってるんでしょうが、
個人的にはコレを知り、かなり便利になりました！
C言語で｢pがcを指す｣のpは何？

pは変数です。ただし、変数のアドレスを格納する変数です。ポインタとも呼ばれます。

# 当たり前じゃないの．．．？
たとえば，配列名aとポインタpaと比べてみましょう。

* ポインタは変数です。``pa=a`` や ``pa++`` は意味のある演算です。
* 配列名は変数ではありません。``a=pa`` や ``a++`` のような構文は正しくありません。

ポインタへのポインタが許されることもポインタが変数であることの理解が必要です。下の方にある例を見て下さい。

# 根拠
[K&R,5.1 Pointers and Addresses] に以下の記述があります。

> The unary operator & gives the address of an object, so the statement
>  p = &c;
> assigns the address of c to the variable p, and p is said to ``point to'' c.

[2,6.2.1 識別子の有効範囲]に以下の記述があります。

> 識別子は，次のいずれか一つを表す。
> - オブジェクト
> ...

「ポインタは変数のアドレスを格納する変数」 [K&R,5 Pointers and Arrays]とあります。。

> A pointer is a variable that contains the address of a variable.

# 告白します。よく分かっていないこと．．．

以下の表現は正しいのかよく分かっていません。
1. アドレスはcを指す[^1]。
2. 識別子pはcを指す。（もしくは識別子の意味での変数pについて、「変数pはcを指す」。）
3. ポインタ変数。

[^1]: この表現の使用例：「アドレス（が指すメモリ領域）」@ http://www.eidos.ic.i.u-tokyo.ac.jp/~tau/lecture/mini_python/gen/slides/6-gc.pdf 「アドレスが指す値」@ https://xythos.tokyo-ct.ac.jp/web/j/usr/kosaka/for_students/CIntro/extension/alloc2d.html , 「アドレスが指す先の変数」@http://www.ss.cs.meiji.ac.jp/CCP054.html

私は、代わりに以下の表現を用いるようにします。
1. cのアドレスの値は（16進数表記で）0x00...である。cはこのアドレスを（属性として）**もつ**[^3]。（（pがcを指す場合）pはアドレス値0x00...を**もつ**。）
2. 識別子pで**表される**（が**参照する**）変数（配列の要素，オブジェクト）がcを指す[^2]。
3. ポインタ。もしくは、変数。

[^3]: 「変数がアドレスをもつ」という表現について。[K&R2J]の「5.3ポインタと配列」に「配列名のパラメータはポインタ，すなわちアドレスをもつ変数である。」という表現がある。また[K&R]には「the address of a variable」という表現が繰り返しでてくる。このofは帰属を表す前置詞であり、アドレスは変数の属性・性質なのではないかと解釈している。ただし，変数は必ずしもアドレスを（属性として）もつとは限らない。これについては、[謎の表現P2．「ポインタはある記憶域を指し示す」](http://qiita.com/tetsuo_jp/items/d6cc5bd4bbe6ec0312be#%E8%AC%8E%E3%81%AE%E8%A1%A8%E7%8F%BEp2%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%AF%E3%81%82%E3%82%8B%E8%A8%98%E6%86%B6%E5%9F%9F%E3%82%92%E6%8C%87%E3%81%97%E7%A4%BA%E3%81%99)も参考にして下さい。

[^2]: 参考文献[2]に次のような説明がある。「識別子は，次のいずれか一つを表す。オブジェクト，関数，構造体[中略]。同一の識別子であっても，プログラム内の異なる位置では異なる実体を表すことがある。」

# 例
## 例1
｢pがcを指す｣のcがポインタであっても構わないです。次のコードではxを指すqは変数であり、qを指すqqも変数です。

```c
char x;
char *q;
char **qq;

q = &x;
qq = &q;
```

一部を下のように取り出してもう一度見てみましょう。qがもつアドレス値を定めていない（もしくはqが指す変数を定めていない）のにqqがqを指せるのはなぜかという疑問を持つ人に少なからずあったことがあります。｢pがcを指す｣のcは変数であればよく、qはポインタであり、ここでいうポインタは変数ですからcになることができます。qは型"char型へのポインタ"を格納できる変数であるのです。

```c
char *q;
char **qq;

qq = &q;
```

## 例2
次のコードは「pがpを指す」例です。自身を指すポインタであり、一見理解するのが難しいように思えます。

```c
void *p;
p = &p;
```

pは型"void型へのポインタ"をもちます。&pは型"void型へのポインタへのポインタ"をもちます。型void *は汎用ポインタ(generic pointer)であり，キャストなしに別の型のポインタに代入することができます。根拠としては、[K&R,5.4 Address Arithmeticの末尾]に以下のような記述があります。

> It is not legal to add two pointers, or to multiply or divide or shift or mask them, or to add float or double to them, or even, except for void *, to assign a pointer of one type to a pointer of another type without a cast.

# 参考文献

[K&R] Kernighan, B. W. and D. M. Ritchie (1988). The C Programming Lnaguage.
[K&R2J] Kernighan, B. W., Ritchie, D. M., 石田晴久(訳). (1989). プログラミング言語C (第2版): 共立出版.
[2] JIS X 3010:2003 プログラム言語C
Windowsのセットアップメモ～まともなシェル環境を求めて

最近新しいWindows laptop(HP Spectre 13)を購入しました。そのセットアップの記録をつけておきます。

# そもそもなぜWindowsか

確かに、MacはUnix環境がそのまま使えて、terminal emulatorもcmd.exeに比べるとはるかにまともです。
しかしながらMacのパッケージマネージャはどれも微妙というか、結局POSIX環境を根こそぎ入れることになってしまってアレです。
さらにまあ当たり前ではあるんですが、未だにやっぱりハードウェアの対応状況がよろしくないという点も考慮すべきです。
あと最近Macはしょうもないデバイスが多くて、ガジェット好きとしては微妙な感じが否めないのもあります。

一方でじゃあUbuntuでも入れればいいじゃんっていうのもそのとおりなのですが、省電力機能を絞っていくのが大変そうなイメージがあります。まあバッテリ時間にして1時間くらいしか変わらないでしょうが、やっぱりちょっと悲しい。あと固有の機能が全然使えない可能性があるのも、特に新しいデバイスではきついです。

ということで、やっぱりなんだかんだでWindowsなのです。

# 結局シェル環境はどうするのがいいか

昔もなんか[メモ書き](http://qiita.com/__cooper/items/d52e9e4077d29bbcce94)をしたのですが、正直結構アレなことをしていまして、やっぱりCtrl-Lとかがイマイチちゃんと動かなかったりします。というか多分これはConEmuのバージョンとかの問題だったりするような気もしますが。

じゃあどうするのがいいのかという話なんですが、今回いろいろやってみて、手動で入れたMSYS2+chocolateyで入れたConEmu、という組み合わせが手間を最小化しつつ環境がまともになる方法だと思います。また、Pythonとかは全部MSYS上に入れちゃうのがラクです。どうせすぐbash on Ubuntu on Windowsが来るので、あんまりゴテゴテさせないような気もしますし…。

以下そのメモなど。

# Chocolatey

Windowsのパッケージマネージャ、chocolateyを使うと、かなりの手順を自動化できます。その一方で、自動化*できない*もの、あるいは単純にchocolateyを*使わない方がよい*ものもありました。どれがどうとかは結構非自明なので、一応書き留めておきます。

# 自動化できないもの

## TeXlive

そもそもパッケージが無いっぽいです。なぜ…。
インストーラを[ここ](https://www.tug.org/texlive/)から入れます。大学のネットワークからやったんですが、適切なミラーを選ばないと無限に時間がかかります。

## Gimp

なんか単にchocolateyがコケた

# 使わないほうがよさそうなもの

## MSYS2

入ることには入るのですが、スタートアップメニューからMSYSと打ち込んでも候補に出てこなかったり、あるいはConEmuがMSYSの存在を認識してくれないなどの問題があります。手動で[ここ](https://msys2.github.io/)から持ってきて入れるのがいいです。

## Google日本語入力

chocolateyで入るっぽいですがパッケージが古かったので手動で入れました

# packages.config

私のpackages.configを晒しておきます。ご参考まで。

```packages.config:xml
<?xml version="1.0"?>
<packages>
  <package id="GoogleChrome" />
  <package id="Firefox" />
  <package id="texstudio" />
  <package id="dropbox" />
  <package id="msys2" />
  <package id="xming" />
  <package id="conemu" />
  <package id="Thunderbird" />
  <package id="skype" />
  <package id="rapidee" />
  <package id="winrar" />
  <package id="vlc" />
  <package id="notepadplusplus" />
  <package id="tightvnc" />

  <package id="jdk8" />
  <package id="android-sdk" />
  <package id="androidstudio" />
  <package id="VisualStudio2015Community" />
  <package id="xamarin-visualstudio" />
  <package id="VisualStudioCode" />

  <package id="apktool" />
  <package id="javadecompiler-gui" />
  <package id="ilspy" />
  <package id="audacity" />
  <package id="wireshark" />
  <package id="procexp" />
  <package id="paint.net" />
</packages>
```
Gitter APIを試してみよう

## はじめに

Gitterを使っているのですが、指定したルームの指定した日付の1日分のメッセージをまとめて確認できると便利かと思いGitter APIを試してみました。

指定したルームのメッセージを取得するところまではできたのですが、指定した日付の1日分のメッセージをまとめて取得することはできませんでした。

しかし、その代わりになりそうな機能はありました。

今回はGitter APIを簡単に紹介したいと思います。

## ログイン＆アクセストークン取得

APIを使うためにはアクセストークンが必要になります。このアクセストークンを取得するためにログインします。

[Welcome | Gitter Developer Program](https://developer.gitter.im/)

アプリ連携でログインするので、GitHubのアカウントかTwitterのアカウントのどちらかが必要になります。

ログインするとアクセストークンが表示されたページに移動します。

## ログインユーザーを取得

まず、簡単そうなログインユーザーの情報を取得してみます。

[User Resource | Gitter Developer Program](https://developer.gitter.im/docs/user-resource)

下記のようなURLをブラウザのアドレスバーに入力して取得してみます。

```
https://api.gitter.im/v1/user?access_token=アクセストークン
```

アクセストークンが間違えていなければブラウザにレスポンスが表示されます。

## ルーム一覧を取得

次に、ログインユーザーがjoinしているルームの一覧を取得してみます。

[Rooms Resource | Gitter Developer Program](https://developer.gitter.im/docs/rooms-resource)

下記のようなURLをブラウザのアドレスバーに入力して取得してみます。

```
https://api.gitter.im/v1/rooms?access_token=アクセストークン
```

こちらもアクセストークンが間違えていなければブラウザにレスポンスが表示されます。

リンク先のドキュメントを確認すると、idがルームIDだと分かります。

このルームIDでルームを指定することができます。

## 指定したルームのメッセージを取得

試しにルームIDで指定したルームのメッセージを取得してみます。

[Rest Api | Gitter Developer Program](https://developer.gitter.im/docs/rest-api)

下記のようなURLをブラウザのアドレスバーに入力して取得してみます。

```
https://api.gitter.im/v1/rooms/54b63a2bdb8155e6700ea37f/chatMessages?access_token=アクセストークン
```

リンク先のドキュメントにある`:roomId`をルームIDに置き換えています。

## 指定したメッセージID後のメッセージを5件取得

最後に、指定したメッセージID後のメッセージを5件取得する例を紹介します。

[Messages Resource | Gitter Developer Program](https://developer.gitter.im/docs/messages-resource)

下記のようなURLをブラウザのアドレスバーに入力して取得してみます。

```
https://api.gitter.im/v1/rooms/54b63a2bdb8155e6700ea37f/chatMessages?access_token=アクセストークン&afterId=5760ab757a851b587e6ed0b0&limit=5
```

リンク先のドキュメントを確認すると、idがメッセージIDだと分かります。

`afterId`にメッセージIDを指定して、`limit`に取得する件数を指定します。

この機能を使えば50件づつメッセージを読んでいくことができます。

## まとめ

Gitter APIを紹介しました。1日分のメッセージを取得することは少し難しそうですが、まとめてメッセージを取得したり、その続きのメッセージを取得したりすることができました。
Ext.data.Model の状態フラグと同期について

Ext JS の Ext.data.Model の状態フラグと同期についてメモっとく。まずはモデル単体での状態フラグの変化と同期動作が大事なんじゃないかと。

# 状態フラグ

モデルのインスタンスの基本的な状態フラグは下表のとおり。全フラグが `false` のときは「インスタンスが同期されている状態」になる。

<table>
<tr><th>状態フラグ</th><th>説明</th></tr>
<tr><td>phantom</td><td>作成されたインスタンスが同期されていない状態</td></tr>
<tr><td>dirty</td><td>変更されたインスタンスが同期されていない状態</td></tr>
<tr><td>dropped</td><td>削除されたインスタンスが同期されていない状態</td></tr>
<tr><td>erased</td><td>削除されたインスタンスが同期されている状態</td></tr>
</table>

# 状態フラグの変化と同期動作

モデルのインスタンスは大抵下記のメソッドで操作することになるので、その場合に状態フラグの変化と同期動作を覚えておけばいい。

<table>
<tr><th>メソッド</th><th>条件</th><th>状態フラグの変化</th><th>同期動作</th><th>説明</th></tr>
<tr><td>(new)</td><td>-</td><td>phantom: true</td><td>-</td><td>インスタンスを作成すると phantom になる。</td></tr>
<tr><td>load</td><td>-</td><td>-</td><td>READ (GET)</td><td>インスタンスを読込すると「全フラグが false」になる。</td></tr>
<tr><td>set</td><td>-</td><td>dirty: true</td><td>-</td><td>インスタンスを変更すると dirty になる。</td></tr>
<tr><td rowspan="2">drop</td><td>phantom: true</td><td>dropped: true<br>erased: true</td><td rowspan="2">-</td><td>作成されて同期されていないインスタンスを削除すると dropped & erased になる。</td></tr>
<tr><td>phantom: false</td><td>dropped: true</td><td>インスタンスを削除すると dropped になる。</td></tr>
<tr><td rowspan="3">save</td><td>phantom: true</td><td>phantom: false<br>dirty: false</td><td>CREATE (POST)</td><td>作成されて同期されていないインスタンスが同期されている状態になる。</td></tr>
<tr><td>phantom: false<br>dirty: true</td><td>dirty: false</td><td>UPDATE (PUT)</td><td>変更されて同期されていないインスタンスが同期されている状態になる。</td></tr>
<tr><td>dropped: true</td><td>erased: true</td><td>DELETE (DELETE)</td><td>削除されて同期されていないインスタンスが同期されている状態になる。</td></tr>
<tr><td rowspan="2">erase</td><td>phantom: true</td><td rowspan="2">dropped: true<br>erased: true</td><td>-</td><td rowspan="2">drop と save を連続実行するのと同じになる。</td></tr>
<tr><td>phantom: false</td><td>DELETE (DELETE)</td></tr>
</table>
Golangの[]byteを初期化するときにintを変数で含めたい

```go
i := 1
b := []byte{0x00, 0x01, i}
```

とすると

```shell-session
$ go build
cannot use i (type int) as type byte in append
```

と怒られる。どうやら型がだめらしい。

```go
i := 1
b := []byte{0x00, 0x01, uint8(i)}
```

とすれば大丈夫。


なにこれ地味にはまった。。。
Vagrant関連ファイルの保存パスを変更する


Vagrantを利用する場合、下記のファイル群がファイルシステムに保存されます。

* VagrantのBoxファイル
* VirtualBoxのイメージファイル　※仮想環境プロバイダにVirtualBoxを利用した場合

これらを外部ドライブなど、デフォルトとは異なるパスに保存する方法を紹介します。

## VagrantのBoxファイル

環境変数`VAGRANT_HOME`に、Boxファイルを保存するパスを指定します。
※`vagrant box add`する前に実行してください

### Mac

```bash
export VAGRANT_HOME=/Volumes/SSD/vagrant/Vagrant.d
```

### Windows

システム環境変数に、Boxファイルを保存するパスを指定します。
※ユーザ環境変数に指定した場合に動作するかは未確認

```:dos
VAGRANT_HOME=/Volumes/SSD/vagrant/Vagrant.d
```

## VirtualBoxのイメージファイル

環境変数や`Vagrantfile`で指定する方法が見つからなかったため、VirtualBoxの設定を変更します。
※`vagrant up`する前に実行してください

1. VirtualBox＞環境設定
1. 一般＞デフォルトの仮想マシンフォルダ＝/Volumes/SSD/vagrant/VirtualBox VMs

![スクリーンショット 2016-06-17 22.30.12.png](https://qiita-image-store.s3.amazonaws.com/0/74102/8d686cda-5466-36bb-0c8c-eb67eae826f1.png "スクリーンショット 2016-06-17 22.30.12.png")
メソッド引数をfinalで宣言


見ての通り、引数への代入を行えなくする。

```java
public class Sample {
    public static void main(String args[]) {
        Sample sample = new Sample();
        sample.test("AAA");
    }

    public void test(final String s) {
        s = "XXX";
        System.out.println(s);
    }
}
```

結果：コンパイルエラー

『リファクタリング』の「パラメータへの代入の除去」を読んでいても思ったけど、この辺り普段の開発（PHP）ではあまり意識していないから気をつけないと……。
【スマホ対応】画像を可変で上下左右中央配置＆領域いっぱい表示する

スマホにも対応してます。
CSSのプロパティ `object-fit` がAndroid4系の機種によっては挙動が怪しいので注意😓

[DEMOはこちら - jsfiddle](https://jsfiddle.net/Ltftpkzh/)

```html:HTML
<div class="image">
  <img src="http://placekitten.com/600/300" width="100%" height="auto" alt="">
</div>
```

```scss:SCSS
  .image {
    position: relative;
		overflow: hidden;
		box-sizing: border-box;
		height: 0;
        width: 50%;
		padding-bottom: 40%;

		&:before {
			content: "\0020";
			display: block;
			padding-top: 100%;
		}

		img {
			display: block;
			position: absolute;
			top: 0;
			left: 0;
			width: 100%;
			height: 100%;
			object-fit: cover;
			object-position: center;
		}
	}
````

もっといい方法あったら教えて下さい😀
ありがとうございました🌟
RustでDirectX12を使う

安全性、速度、並行性の3つのゴールにフォーカスしたシステムプログラミング言語Rust[^1]でDirectX陣営のLow-overhead APIとして新たに(けっこう前に)策定されたDirectX12を動かします。(とりあえずメモ的な)
Rustはまだまだ初心者なので間違ってたりもっとよくできたりする点があるかもしれませんが暖かい目で見てやってください。

## 環境

rustcはバージョン1.9.0を使用します。あと、たぶんWindows SDKが入ってるなら入ってると思いますがDebugging Tools for Windows(windbg)も入れておきましょう。D言語を一緒に入れてる人はパスの関係でコマンドラインでwindbgを起動するとD言語付属のやつが起動してしまうかもしれないのでファイル名を変えておくといいと思います。
追記: rustcはMSVC ABIのほうを使用すると安心かと思います。GNU ABI(MinGW環境)でももしかしたら動いてくれるかもしれませんが、そもそもMinGWにはd3d12.libが同梱されていないのでちょっと準備が大変かと思います。

## Crates

今回使用するクレートは以下の通りです。

```toml:Cargo.toml
[dependencies]
winapi = "0.2.7"
kernel32-sys = "0.2.2"
user32-sys = "0.2.0"
d3d12-sys = "0.2.0"
dxgi-sys = "0.2.0"
dxguid-sys = "0.2.0"
d3dcompiler-sys = "0.2.0"
widestring = "0.2.0"
```

D3DCompilerがワイド文字列を要求してくるのでwidestringがないとめちゃくちゃつらいです(たしか標準ライブラリだけでもできなくはないはずですけど)

## 引っかかり点
コード本体はほとんどC++と同じように書けるのですが、いくつか引っかかり点があるので書いておきます。

#### D3D12_GRAPHICS_PIPELINE_DESC::RTVFormats

最初は`RTVFormats: [DXGI_FORMAT_R8G8B8A8_UNORM; 8]`で一括して初期化していたのですが、どうやら使われない`RTVFormats`の要素(インデックス番号>=`NumRenderTargets`となるような要素)は絶対に`DXGI_FORMAT_UNKNOWN`を指定しないとダメらしいです。地道に初期化しましょう。

#### 頂点入力レイアウトの要素のSemanticNameについて(というか、すべての文字列指定についての注意)

~~明示的にstatic領域に置くようにしないとダメです~~`ID3D12Device::CreateGraphicsPipelineState`から制御が返るまでに文字列オブジェクトが生存している必要があるので、べた書きじゃなくて一回ローカル変数を経由するようにする必要があります。普通に

```rust
D3D12_INPUT_ELEMENT_DESC { SemanticName: CString::new("POSITION").unwrap().as_ptr(), .. (省略) }
```

でいいんじゃないかと思いますが、`CString::new("POSITION").unwrap()`が一時オブジェクトなのでこの式が終了すると文字列含めオブジェクトが解放されるみたいでメモリ領域が破壊されます(運が良ければ生きています。たぶん)。正しくはこう

```rust
let sn_pos = CString::new("POSITION").unwrap();
...
D3D12_INPUT_ELEMENT_DESC { SemanticName: sn_pos.as_ptr(), .. (省略) }
```

あるいはコメントで教えていただきましたが、`as_ptr`の代わりに`into_raw`を使うと直接書けます(メモリリークの心配がありますが、アプリケーション終了時にOSか言語処理系が使用済みメモリを回収してくれるはず(たぶん)なのでここではそこまで神経質になる必要もないかなと思います)。

```rust
D3D12_INPUT_ELEMENT_DESC { SemanticName: CString::new("POSITION").unwrap().into_raw(), .. (省略) }
```

~~C/C++/DだとCString::newの引数は(この書き方だと)そのままstatic領域に格納されたはずなので引っかかりやすい点だと思います。~~

[^1]: https://doc.rust-lang.org/book/README.html
左右可変・中央固定の3カラム レイアウト

こんなかんじでいけます。
ナビゲーションのデザインなどに使えるかと思います。

[DEMOはこちら - jsfiddle](https://jsfiddle.net/12ny8570/5/?utm_source=website&utm_medium=embed&utm_campaign=12ny8570)

```html:HTML
<div class="bg">
  <div class="wrapper">
    <div class="inner">
      <ul>
        <li>menu</li>
        <li>menu</li>
        <li>menu</li>
      </ul>
    </div>
  </div>
</div>
```

```scss:SCSS
.bg {
  position: relative;
  width: 100%;
  height: 200px;
  background: url(http://p-hold.com/400/01553b) no-repeat;
  background-size: cover;
}

.wrapper {
  position: relative;
  display: table;
  width: 100%;
  .inner {
    display: table-row;
    &:before,
    &:after {
      content: "\0020";
      display: table-cell;
      width: auto;
      background-color: #999999;
    }
    > ul {
      display: table-cell;
      width: 300px;
      li {
        display: inline-block;
        float: left;
        box-sizing: border-box;
        width: 100px;
        padding: 20px 0;
        text-align: center;
        background-color: #ccc;
        &:nth-child(2n) {
          background: transparent;
        }
      }
    }
  }
}
```

もっといい方法があったら教えて下さい 😀
ありがとうございました🌟
CoreDataのcom.apple.CoreData.ConcurrencyDebug 1オプション指定時の怪しい挙動

**再現方法がわかったので追記しました(2016/06/21)**

CoreDataにおいて、並列処理違反時に例外を吐いてくれる、`-com.apple.CoreData.ConcurrencyDebug 1`というデバッグオプションがあります。
http://qiita.com/hongmhoon/items/606a352b1e96dfb0bec5#デバッグこれが重要

ただしこのオプション、コード上は問題ないはずなのに誤って例外を吐いてしまうケースがあります。

### 再現例

例えば以下のようなコードがあったとします。

```objc
[privateContext performBlock:^{
    NSEntityDescription* entADesc = [NSEntityDescription entityForName:@"EntityA" inManagedObjectContext:privateContext];
    EntityA* entA = [[EntityA alloc] initWithEntity:entADesc insertIntoManagedObjectContext:privateContext];
    entA.foo = @"aaa";

    [privateContext save:&error];

    NSManagedObjectContext* parentContext = privateContext.parentContext;
    [parentContext performBlock:^{
        [parentContext save:&error];
    }];
}];

//fetch EntityB (asyn on main context)    
[mainContext performBlock:^{
    NSFetchRequest* req = [NSFetchRequest fetchRequestWithEntityName:@"EntityB"];
    NSArray* results = [mainContext executeFetchRequest:req error:&error];
}];

//fetch EntityA (asyn on main context)
[mainContext performBlock:^{
    NSFetchRequest* req = [NSFetchRequest fetchRequestWithEntityName:@"EntityA"];
    req.fetchBatchSize = 20;　//(1)
    req.predicate = [NSPredicate predicateWithFormat:@"foo = %@", @"wwww"]; //(2)
    NSArray* results = [mainContext executeFetchRequest:req error:&error];  //(3)
}];
```

このコードを`com.apple.CoreData.ConcurrencyDebug`オプション付きで実行すると、`//(3)` の行でなぜか違反を検知して、例外が発生してしまいます。

やや複雑ですがやっていることは、

```
- RootSaving Context ( private queue) 
 - Main Context ( main queue )
 - Private Context (private queue) 
```
このようなコンテキストの親子関係があり、各context上で`EntityA`、`EntityB`をinsertしたりfetchしたりしているだけです。

さらに謎なのが

```objc
    req.fetchBatchSize = 20;　//(1)
    req.predicate = [NSPredicate predicateWithFormat:@"foo = %@", @"wwww"]; //(2)
```
このどちらかの行をコメントアウトすれば違反は発生しなくなります。あきらかに`com.apple.CoreData.ConcurrencyDebug`オプションのバグっぽいですよね。

この件については現在Appleに問い合わせ中です。
https://openradar.appspot.com/radar?id=4944086339420160

ちなみに、iOS8.4の時代にも同様の報告があったようです。この不具合？が現在もまだ続いているのでしょうか・・。
http://stackoverflow.com/questions/29741359/coredata-multithreading-violation-debugging

プログラミングミスを防止するためにも有用なオプションなので、ぜひ正しく動くようになってほしいものです。
Mac OS Xのターミナル上でWi-Fiの設定を追加・削除する

定期的にパスワードが変更になるWi-Fi環境の場合、記憶済みのパスワードを削除したあとに新しいパスワードを登録する作業をやるのが結構面倒くさい。

調べたところ、ターミナルから設定を追加／削除できるコマンドがあった。新しいパスワードを取得して設定を書き換えるまでスクリプト化できて大変便利。

### 古いWi-Fi設定の削除

```bash
$ networksetup -removepreferredwirelessnetwork en0 SSID_OF_NETWORK
```

### 新しいWi-Fi設定の追加

```bash
$ networksetup -addpreferredwirelessnetworkatindex en0 SSID_OF_NETWORK INDEX_NUMBER SECURITY_OF_WIRELESS_NETWORK WIRELESS_NETWORK_PASSPHRASE
```

- INDEX_NUMBER: 優先度を整数で指定する。"0"が優先度最高で、リストの先頭にくることになる
- SECURITY_OF_WIRELESS_NETWORK: いずれかを指定
    - OPEN
    - WEP
    - WPA
    - WPA2
    - WPAE
    - WPA2E

### 参考
- [How to manage Wi-Fi with Terminal commands on OS X](http://www.techrepublic.com/article/pro-tip-manage-wi-fi-with-terminal-commands-on-os-x/)
- [Pushing Wireless Networks Out](http://krypted.com/tag/addpreferredwirelessnetworkatindex/)
wordpressの関数をシングル、ダブルクオーテーション内で使用する際のポイント

自分用にメモ。

bloginfoを使って次の記事のリンク画像を取得する際、get_bloginfo内部のダブルクオーテーションとその外のシングルクオーテーションがかぶってしまった。


```php

<?php next_post_link("%link",'<img src="get_bloginfo("url")/img/single/right-arrow-button.png" />') ?>
                
```

そこで、関数部分をシングルクオーテーションで括り、さらにピリオドを両側に記入することで正常に表示された。

```php

<?php next_post_link("%link",'<img src="' . get_bloginfo("url") . '/img/single/right-arrow-button.png" />') ?>
                
```
:cdoと:cfdo - Quickfixの各項目に対してコマンドを実行するVimの便利コマンド

Vim使いの紳士淑女の皆様、こんにちは。

今回はとっても便利な`:cdo`と`:cfdo`コマンドについて紹介します。
バージョン7.4.858で追加されたこれらのコマンドですが、とっても便利なのです（2回目）。

日本語で紹介している記事があまり見当たらなかったため、この記事を書いてみることにしました。

# どういう場面で使うか
皆さんはVimを使っている時、プロジェクト全体のファイルを検索し、一括置換したいと思ったことがありませんか？
「`:args`でファイルを追加して、`:argdo`で置換コマンド実行して～」とやってもいいのですが、`:cdo`と`:cfdo`コマンドを使えば簡単に実行できます。

# 必要な予備知識
これらのコマンドを使う前に、vimgrepとQuickfixについて知っておく必要があります。既にQiitaに素晴らしい紹介記事がありますので説明はそちらに譲ります。
[vimgrepとQuickfix知らないVimmerはちょっとこっち来い](http://qiita.com/yuku_t/items/0c1aff03949cb1b8fe6b)

# 使い方
では実際の使い方です。

まず`:cd`などでプロジェクトのトップディレクトリへ移動します。そのあと
`:vimgrep /hoge/ **/*.cpp | cw`
といった具合に、vimgrepで検索し、その結果をQuickfixに表示します。
そこからが`:cdo`と`:cfdo`の出番です。タイトルにも書きましたが、これらのコマンドはQuickfixの項目に対してコマンドを実行するというコマンドなのです。そこで、substituteコマンドとupdateコマンドを組み合わせて
`:cdo %s/hoge/hige/ge | update`
とやってやれば、Quickfixの全項目に対して置換を実行したあと保存してくれます。同時に保存をしたくない場合は、`:set hidden`後に先ほどのコマンドを` | update`なしで実行するなどがいいかと思います（`:set hidden`していないと、ファイルの移動の際、「変更があるのに保存してねーぞ」と怒られます）。

どうでしょう、とっても便利ではないでしょうか。
僕は試してないですが、[ack.vim](https://github.com/mileszs/ack.vim)などと一緒に使うとさらに便利になるようです。

# :cdoと:cfdoの違い
最後に、`:cdo`と`:cfdo`の違いですが、コマンド実行後、`:cdo`は次のQuickfixの項目に移るのに対し、`:cfdo`ではQuickfixの次のファイルの最初の項目に移ります。置換の場合は`:cdo`を使っておけば間違いはないかと思います。

# 参考リンク
- [Project-wide find and replace](http://vimcasts.org/episodes/project-wide-find-and-replace/)
- [名著「実践Vim (Practical Vim) 」の第2版は何が変わったのか？ | The Brews](http://thebrews.info/%E5%90%8D%E8%91%97%E3%80%8C%E5%AE%9F%E8%B7%B5vim-practical-vim-%E3%80%8D%E3%81%AE%E7%AC%AC2%E7%89%88%E3%81%AF%E4%BD%95%E3%81%8C%E5%A4%89%E3%82%8F%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B%EF%BC%9F/)
- [Vim's new :cdo command](https://chrisarcand.com/vims-new-cdo-command/)
【WordPress】カスタム投稿タイプにサブメニューを追加する

#【WordPress】カスタム投稿タイプにサブメニューを追加する

***自作したカスタム投稿タイプにサブメニューを追加してみる。***

・まず[カスタム投稿タイプを作成](http://qiita.com/pman-maru/items/18e95c775f5fbadfdeb6)する。

・例のごとくfunction.phpにフックを追加し、関数を読み込み、サブメニューを作成。
サブメニューを作成する関数は、add_submenu_page()（[関数の詳細はこちら](https://wpdocs.osdn.jp/%E7%AE%A1%E7%90%86%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%AE%E8%BF%BD%E5%8A%A0#.E3.82.B5.E3.83.96.E3.83.AC.E3.83.99.E3.83.AB.E3.83.A1.E3.83.8B.E3.83.A5.E3.83.BC)）です。

```lang:function.php
<?php

〜〜省略〜〜

//======================================================================
// サブメニューを自作
//======================================================================
function add_sub_menu() {
	add_submenu_page('edit.php?post_type=self_made', 'サブメニュー', 'サブメニュー', 8,'self_sub', 'display_sub_menu');
}
add_action( 'admin_menu', 'add_sub_menu' );
function display_sub_menu() {
	//任意の処理
}
```



・サブメニュー作成前
<img width="438" alt="sub前.png" src="https://qiita-image-store.s3.amazonaws.com/0/97158/0eddda20-1258-5588-8559-ec21e8a8b30f.png">




・サブメニュー作成後
<img width="415" alt="sub後.png" src="https://qiita-image-store.s3.amazonaws.com/0/97158/df79939d-68d0-beae-fd73-02087e4039a9.png">


カスタム投稿メニューに「サブメニュー」というメニューが追加されています！
vimの置換でjavascriptのfunctionをアロー演算子にした時のコマンド

* ファンクション内にthisを使用している場合は動きが変わる可能性があるので注意が必要
* 名前付きのファンクションは対応していません

```vim:function置換するコマンド
:%s/function\s*(\([ ,a-zA-Z]*\))\s*{/(\1) => {/gc
```

```text:Before
var a = function () {console.log("hello")};
var b = function (foo){console.log("hello")};
var c = function(foo, bar){console.log("hello")};
```

```text:After
var a = () => {console.log("hello")};
var b = (foo) => {console.log("hello")};
var c = (foo, bar) => {console.log("hello")};
```