OmniAICreator/Qiita-1.07M huggingface dataset:
TypeScript 1.8 のString literal typesでReactのPropを静的検証

先月末に TypeScript 1.8 Betaがリリースされましたが、新機能である[String literal types](https://github.com/Microsoft/TypeScript/pull/5185)がReactのProp検証に役立ちそうなので軽く紹介。

※なお、TypeScript 1.8 Betaの変更点については、[TypeScript 1.8.0-beta 変更点](http://qiita.com/vvakame/items/31f5c45ff49de67d5634) を参照すると良いです。

# React.PropTypes.oneOfによる検証

まずはTypeScriptではなくReact自身が持っているPropTypesによる検証をおさらい。

[React公式ドキュメント](https://facebook.github.io/react/docs/reusable-components.html#prop-validation)にあるように、ReactではコンポーネントにPropTypesを定義することでPropsとして渡された値の検証をすることができます。その中に、`React.PropTypes.oneOf(['News', 'Photos'])`みたいな定義をして、**いずれかの値が設定されているかどうかをチェック**することができます。

実際に使われている例として、[Bootstrap3](getbootstrap.com)をReactコンポーネント化した[react-bootstrap](http://react-bootstrap.github.io/)の[Buttonコンポーネントのtype属性](https://github.com/react-bootstrap/react-bootstrap/blob/0f3ee3e1aff6901befabf38dd84cfa1f3d2ab344/src/Button.js#L31)があります。type属性には`button, reset, submit`のいずれかを設定していないと検証で引っかかります。

```js:正しい
      <Button type="submit">送信</Button>
```

```js:検証エラー
      <Button type="hoge">送信</Button>
```

ただし、React自身のPropTypesによる検証では実行時にチェックされる仕組みになっており、検証結果はブラウザのコンソールに下記のように出力されます。**実際に動かしてみないと間違っているかどうか分からない**わけです。

```basn
warning.js:45 Warning: Failed propType: Invalid prop `type` of value `hoge` supplied to `Button`, expected one of ["button","reset","submit"]. Check the render method of `App`.
```

# TypeScriptのString literal typesによる検証

では次にTypeScriptを使った検証。

[String literal types](https://github.com/Microsoft/TypeScript/pull/5185)を使うと、string型限定ではありますが、前述の`React.PropTypes.oneOf`で行っていたチェックをTypeScriptのコンパイル時に行うことができるようになります。さらに、Visual Studio Codeなどのエディタの支援機能も利用できます。

## 例

DefinitelyTypedで公開されている[react-bootstrapの型定義](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/3f0168b531ebb9248db49550856713fedc81c714/react-bootstrap/react-bootstrap.d.ts)ではまだ[type属性は単なるstring型として定義](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/3f0168b531ebb9248db49550856713fedc81c714/react-bootstrap/react-bootstrap.d.ts#L30)されています。これを下記のように[String literal types](https://github.com/Microsoft/TypeScript/pull/5185)を使用した定義に変更してみます。

```ts:react-bootstrap.d.ts
        type?: 'button' | 'reset' | 'submit';
```

これで先程の検証エラーの例、`<Button type="hoge">送信</Button>`をコンパイルすると、、、

```bash:tsc実行結果
$ tsc
src/App.tsx(22,25): error TS2322: Type '"hoge"' is not assignable to type '"button" | "reset" | "submit"'.
  Type '"hoge"' is not assignable to type '"submit"'.
```

と、**動かさなくても静的にチェック**してくれます！


## Visual Studio Codeでのリアルタイム検証

エディタにVisual Studio Codeを使うと、リアルタイムに検出してくれるのでさらに捗ります、Suggestionで値の候補まで出してくれるともっと嬉しいですが、エラーメッセージ中に使える値が表示されますのでこれでも十分うれしいかと。

![Visual Studio Codeによる検出](https://qiita-image-store.s3.amazonaws.com/0/35233/ddf44590-cdd5-4fce-025e-048c95685cf9.png)

なお、現状はVisual Studio Codeにデフォルトで組み込まれているTypeScriptを使わないように`File > Preferences > User Settings`で`typescript.tsdk`を変更する必要があります(でないとString literal typesを認識できずエラーとなります)。

```json:settings.json
	// Specifies the folder path containing the tsserver and lib*.d.ts files to use.
	"typescript.tsdk": ".../node_modules/typescript/lib",
```
Deploygateでテスターを追加後、テストアプリをアップロード

Deploygateでテスターを追加し、Deploygateにテストアプリをアップするまでのメモです。
新しくテスターを追加する場合に手順を忘れてしまう事があるので…

（細かな設定は、場合により異なるものになると思います）

1.
https://developer.apple.com/account/ios/device/
右上（All Devicesの右）の＋ボタンから
「Register Device」を選択・入力
→Continueボタンをクリックして進める

2.
https://developer.apple.com/account/ios/profile/
今回対象となるアプリを選択
→Editボタンをクリック
→Devicesで追加（追加するテスターを探してチェックボックスをオン）
→Generateボタンをクリックして進める
→Downloadボタンからダウンロードしたファイルをダブルクリック。

3.
Xcodeで、Product→Archive
　Export→「Save for Ad Hoc Development」
　→「Export one app for all compatible devices」
　→そのままでNextで進める

4.
ipファイルを、アップロード
https://deploygate.com/
→ダッシュボード→（アプリ名）をクリック
→真ん中あたりにある緑色の「アップロード」ボタンから、先ほどXcodeで作成したipaファイルをアップロード

また、
右側のテスターに「ユーザ名 or Email」を入力し、テスターを追加

ーーーーー

最後のテスターの追加をしなかったために、テストユーザーが追加されずに困った時があったような記憶が…
ここも追加しましょう。
ElectronのWebviewでhttpなコンテンツを読みこませてmixed contentになってしまう問題への対応

ElectronのWebviewでhttpsなページを表示させつつ、そのコンテンツ内でhttpなアイコンや画像などをロードさせたい場合があります。

しかし、そのままでは

```

Mixed Content: The page at 'https://hoge.example.com/hoge/' was loaded over HTTPS, but requested an insecure font 'http://fuga.httpsite.jp/image.jpg'. This content should also be served over HTTPS.

```

というようにmixed Contentなエラーが出てしまい表示が出来ません。JSなども同様ですね。

セキュリティ上正しい挙動ですが、どうしてもやりたい場合は以下のように設定します。
レンダラプロセス側でweb-frameを取得し、registerURLSchemeAsSecureでスキーマを指定します。

```js

var webFrame = require('web-frame');
webFrame.registerURLSchemeAsSecure('http');

```


このようにすることで、Secureなものとして登録できるようなので、ロードできるようになります。
このregisterURLSchemeAsSecureはelectron-prebuiltが0.33.8では使用できず、0.36.7では使えるようになっていました。
PNGを扱えるImageMagickをクロスコンパイルするには

# PNGを扱えるImageMagickをクロスコンパイルするには

pkg-configが必要だった。

ホスト側にホスト用のpkg-configを入れて、
PKG_CONFIG_PATHをターゲットの.pcの格納されているパスに設定するもしくは、
ターゲット用のpkg-configを別途入れる。

```bash
apt-get install -y pkg-config
```

```bash
apt-get install -y mingw-w64-tools --no-install-recommends
```

pkg-configがないと、configure時にPNGを有効にしたMakefileが
作られない。

# 注意

libpngは事前にクロスコンパイルして、クロスコンパイル環境に入れて
おく必要がある。

# 関連投稿

- [クロスコンパイルしてwindows用のOpenCVライブラリを作る - Qiita](https://qiita.com/kjunichi/items/60a14d73fab2b41cc6bc)
- [Dockerを使ってクロスコンパイルしてmrubyのワンバイナリを作成してみた - Qiita](https://qiita.com/kjunichi/items/72305db2397930b16803)

# 関連記事

- [外部のライブラリに依存するmrbgemを使ってもmruby-cliでワンバイナリを作成できるようにした](http://abrakatabura.hatenablog.com/entry/2016/02/14/144922)
PowerShellでJSON配列を逆転させる

# 概要

ファイル内のJSON配列を逆転させ、別ファイルに出力するPowerShellスクリプトを作ってみました。ポイントは、PowerShellのJSON関連コマンドレットとUnicodeエスケープに対する処理でしょうか。

# スクリプト

```ps1:Reverse-JsonArray.ps1
Param([string]$from, [string]$to)
$data = (Get-Content $from -Raw -Encoding UTF8 | ConvertFrom-Json)
$data = $data[($data.length-1)..0]
[Regex]::Unescape((ConvertTo-Json $data)) | Set-Content -Path $to -Encoding UTF8
```

## 使い方

```ps1
PS > Reverse-JsonArray.ps1 -from input.json -to output.json
```

入出力共にUTF8に設定してあるので、他のエンコーディングを利用する場合はその辺いじってくださいな。

### 入力例

```json:input.json
[
    {
        "group": 1,
        "leader": "souji",
        "leader_jp": "総司"
    },
    {
        "group": 2,
        "leader": "shinpachi",
        "leader_jp": "新八"
    },
    {
        "group": 3,
        "leader": "hajime",
        "leader_jp": "一"
    },
    {
        "group": 4,
        "leader": "chuji",
        "leader_jp": "忠司"
    },
    {
        "group": 5,
        "leader": "kanryusai",
        "leader_jp": "観柳斎"
    },
    {
        "group": 6,
        "leader": "genzaburo",
        "leader_jp": "源三郎"
    },
    {
        "group": 7,
        "leader": "sanjuro",
        "leader_jp": "三十郎"
    },
    {
        "group": 8,
        "leader": "heisuke",
        "leader_jp": "平助"
    },
    {
        "group": 9,
        "leader": "mikisaburo",
        "leader_jp": "三樹三郎"
    },
    {
        "group": 10,
        "leader": "sanosuke",
        "leader_jp": "左之助"
    },
    {
        "memo": "<>&#/,."
    }
]
```

### 出力

```json:output.json
[
    {
        "memo":  "<>&#/,."
    },
    {
        "group":  10,
        "leader":  "sanosuke",
        "leader_jp":  "左之助"
    },
    {
        "group":  9,
        "leader":  "mikisaburo",
        "leader_jp":  "三樹三郎"
    },
    {
        "group":  8,
        "leader":  "heisuke",
        "leader_jp":  "平助"
    },
    {
        "group":  7,
        "leader":  "sanjuro",
        "leader_jp":  "三十郎"
    },
    {
        "group":  6,
        "leader":  "genzaburo",
        "leader_jp":  "源三郎"
    },
    {
        "group":  5,
        "leader":  "kanryusai",
        "leader_jp":  "観柳斎"
    },
    {
        "group":  4,
        "leader":  "chuji",
        "leader_jp":  "忠司"
    },
    {
        "group":  3,
        "leader":  "hajime",
        "leader_jp":  "一"
    },
    {
        "group":  2,
        "leader":  "shinpachi",
        "leader_jp":  "新八"
    },
    {
        "group":  1,
        "leader":  "souji",
        "leader_jp":  "総司"
    }
]
```

# 解説

PowerShellのJSON関連コマンドレットが便利、ということで作ってみました。ConvertFrom-JsonやConvertTo-JsonでJSON<->オブジェクト変換が一発でできるのは(・∀・)ｲｲﾈ!!
ちなみに、最後の行で.NETライブラリの```Regex.Unescape```を使っていますが、これがないと```memo```の値がこんな↓になってしまいます。

```json:
    {
        "memo":  "\u003c\u003e\u0026#/,."
    }
```

こんな具合に、一部の記号がUnicodeエスケープされて出力されます。出力後のJSONを純粋にデータとして扱う場合、むしろこちらの方がセキュリティ面から考えるといいと思います。が、自分の場合は出力後のJSONを人が読めるものにする必要があったため、Unicodeエスケープを解除しています。
Scheme のすゝめ1

#泥沼へ向かふ
あれこれと、勉強するにあたって知らない分野だと色んな物の基礎知識が必要になり、一個一個調べていくと、必ず脱線する俺。

http://qiita.com/kirishima677/items/82198a304d121d201cc2
の記事を上げていたんだけど、関数型言語自体に興味が湧き、関数型言語のパラダイムについてあれこれ読みふけっていたら、そういえばこんな本もあったなあと思い、注文したら、そういえばこの本は例文がScheme（関数型言語）だなと思い、調べ始めたのが泥沼の始まりだった。

この本
http://www.amazon.co.jp/gp/product/4798135984/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1

というわけで、Schemeを手軽に始めるにあたって、どれが一番楽か調べたところ、出てくる文献がどれも古かったので、これも何かの縁と思い記事を書いてる。

処理系自体星の数ほどあると言われているので、古くても勉強に十分で楽な方法をとることにした。

最新の系統がいいのなら、Gaucheがいいと思う。

あの本読むのなら処理系なんかどれでもいいので、使いやすそうなのからチョイスすればいいと思う。

#ダウンロードして、インストール

http://plt-scheme.org/
ここから、PLT Schemeをダウンロードする

![image](https://qiita-image-store.s3.amazonaws.com/0/113470/2548c1d9-b6f9-1888-f9f7-b214e2a99d27.png)

それぞれの環境に合わせて落としてくるよろし。

インストーラーついてくるので、その辺は割愛します。（解説はWindows版で行います）

#設定

まず起動させましょう。
Windowsだと、PLT Schemeの中のDrSchemeを起動させます。

![image](https://qiita-image-store.s3.amazonaws.com/0/113470/7d5c2d7d-2c5c-dbe0-f389-9bd63ae4d416.png)

##日本語化
Helpのところから「DrSchemeを日本語で使う」を選択して再起動しましょう。

##処理系の選択
LanguageのところからChooce Languageを選び、今回は「R5RS」を選択します。

![image](https://qiita-image-store.s3.amazonaws.com/0/113470/2c0d238a-1f55-8bdb-6e64-bff3713ac8fb.png)

「OK」を押します。

#サンプルコードを動かす

設定が終わったところで、さっくりと動かしてみましょうか。

```lang:sample_code
(+ 1 2)
(cons 1 (cons 2 3))
```
上の段に打ち込んだら「実行」を押せば動作する

以下のように表示されたら、ちゃんと動作してると思います。

![image](https://qiita-image-store.s3.amazonaws.com/0/113470/2ad51290-4ba1-2b28-7839-422787b4c344.png)

R5RSの処理系は古いですが、ネット上のサンプルコードを動かしてみて学習には十分だと判断しました。
興味のある方は、Gaucheとか最新の処理系を入れてみるのいいかもしれません。
Windowsだと入れるのがめんどくさい可能性があるので、試すならLinuxがいいと思います。

次回は、気力が有ったら、ちゃんとしたサンプルでも書きます。
たぶんきっと、メイビー・・・
Intel Edisonにvimをインストールする


## はじめに

EdisonにはBusyBox版のviが入ってますが、nodeのコードを編集するときは構文ハイライトや慣れた編集操作が使える普通のvimが欲しくなります。

非公式のレポジトリを利用するとopkgコマンドからvimパッケージをインストールすることができます。

## 手順

`/etc/opkg/base-feeds.conf`にリポジトリを追加します。

```/etc/opkg/base-feeds.conf
src/gz all http://repo.opkg.net/edison/repo/all
src/gz edison http://repo.opkg.net/edison/repo/edison
src/gz core2-32 http://repo.opkg.net/edison/repo/core2-32
```

`opkg update`を実行します。

```sh
# opkg update
```

*注意: "opkg upgrade"はrootfsをまるっと書き換えるようなので実行しないこと。パッケージのアップグレードはパッケージごとに"opkg install <packagename>"を実行する。*


vimをインストールします。

```sh
# opkg install vim
Installing vim (7.4.481-r0) on root.
Downloading http://repo.opkg.net/edison/repo/core2-32/vim_7.4.481-r0_core2-32.ipk.
package vim suggests installing diffutils
Installing vim-help (7.4.481-r0) on root.
Downloading http://repo.opkg.net/edison/repo/core2-32/vim-help_7.4.481-r0_core2-32.ipk.
Installing vim-syntax (7.4.481-r0) on root.
Downloading http://repo.opkg.net/edison/repo/core2-32/vim-syntax_7.4.481-r0_core2-32.ipk.
Installing vim-common (7.4.481-r0) on root.
Downloading http://repo.opkg.net/edison/repo/core2-32/vim-common_7.4.481-r0_core2-32.ipk.
Installing vim-tutor (7.4.481-r0) on root.
Downloading http://repo.opkg.net/edison/repo/core2-32/vim-tutor_7.4.481-r0_core2-32.ipk.
Installing vim-vimrc (7.4.481-r0) on root.
Downloading http://repo.opkg.net/edison/repo/core2-32/vim-vimrc_7.4.481-r0_core2-32.ipk.
Configuring vim-syntax.
Configuring vim-common.
Configuring vim-vimrc.
Configuring vim-help.
Configuring vim-tutor.
Configuring vim.
update-alternatives: Linking //bin/vi to /usr/bin/vim
```

これでvimが使えるようになります。

`opkg install git`でgitも入るので、`vim-plug`が使えるようになるかも。

## 参考

[橋本商会 » Intel Edisonにopkgで色々インストールした](http://shokai.org/blog/archives/10061)

[AlexT's Galileo & Edison pages](http://alextgalileo.altervista.org/edison-package-repo-configuration-instructions.html)
コンテスト・ハッカソンにおけるアイデア発案の効率化について

#はじめに
各種コンテストやハッカソンに参加する際に覚えておくと良いアイデアの出し方、効率化の方法をまとめておきます。
この記事は個人的なメモに近いです。そのうちしっかり整理します。
できればアイデア出しは複数人で行うほうが好ましいです。

##アイデア出しの手法について
自分はよくマインドマップを用いてアイデア出しを行っています。
マインドマップとは、1枚の紙の上に表現したい概念（テーマ）をキーワードやイメージで中央に描き、そこから放射状に連想するキーワードやイメージを繋げていき、発想を広げていくものです。（http://mindmap.ainest.com/howto/5101　より引用）

下記の画像ではテーマを「星」として発送を広げています。
知り合いのマインドマップの画像をお借りしました。
![11112955_821958891253686_6601516174791458415_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/71388/6dd37d8e-4437-da9c-021b-16825f7845f8.jpeg)


ある程度まで広がったら、次はこれを元にアイデア出しを行います。
大切なことは**あまり関係のないもの同士をくっつけて考える**ことです。
例えばキーワードの「モアイ」「寿司」でアイデアを考えて、モアイの口から永遠とお寿司が流れてくるアプリという訳のわからないアイデアが生まれたりします。
そういうふざけた発想から良いアイデアが閃くことが多いです。
突発的な発想をできる事がマインドマップの面白さだと感じています。

##アイデアを考えている時に大事な事
箇条書きで書いていきます。
・複数人でアイデア出しを行うこと
・相手の意見を最初から否定しないこと
・どんなしょうもないアイデアでも口に出してみる事、相手がそこから閃く場合有り
・あまり考え込まずにどんどん話し合う、会話を重視すること
・作りたいものを考えてから、どうやって開発するか考えること
・長引いてきたら時間制限を設けて、あまりダラダラと考えすぎないようにする

##考え方を少し変えてみる
考え方を少し変えてみることも大切な事です。
例としては
・スマホを振ると画面上で雪が降るアプリがあったとする。
　スマホを振り続ける事で実は手首のトレーニングにもなっていた！

・絶景が綺麗に撮れるカメラのアプリがあったとする。
　シャッターを押すと、自動的にその地点を登録する仕組みにする。
　登録された地点からはほぼ確実に絶景が見える→絶景MAPが勝手に出来上がる。
 　(もちろんユーザーの許可が必要)
など、実は違う活用法もあります！みたいなのは良いと思います。
##ある程度アイデアが出てきたら
次はアイデアを形作る段階です。
たくさん出てきたアイデアから良いと思ったものをいくつか用意します。
・一言で言うとどんなシステムか
・対象者は誰か
・システムはどのように開発するのか
・そのシステムを使うメリットは何か
を明確にする事でアイデアを形作りしやすくなります。
リーンキャンバスを用いる事でより具体的にアイデアを形作る事もできます。
##コンテストに向けて
コンテストに向けてのアイデア出しで重要なポイントは、**どのように社会貢献やビジネスにつなげていくか**だと個人的に思っています。
後は、何かをすると人や家族、地域が繋がっていくシステムも面白いと思います。

例えば、子供が何かを始めるとおじいちゃんやおばあちゃんがそれに興味を持ち始めます。
そうすると、そのおじいちゃん達を支えるために両親も参加、家族が一体となっていく仕組みが出来上がったりします。
##最後に
最近、Skepeで診療できるサービスが始まったみたいです。
ちょっと発想を変えてみるだけで世の中がどんどん便利になっていきます。
そのような考え方を大切にしていきたいです。
[AAAI16実況配信] Best Paper Award: Bidirectional Search that is Guaranteed to Meet in the Middle

みなさんお久しぶりです。

![2016-02-14 08.53.38.jpg](https://qiita-image-store.s3.amazonaws.com/0/6090/b9ca3593-ab37-fa43-2d7a-92d8aa851b0c.jpeg)

発表のためにAAAI-16に来ています。知らない人も多いかと思いますが、IJCAIとならび、AIの国際学会で最も難関と言われる学会です。個人的には自分もA*の改善論文でPaper Award 密かに狙っていたのですが、Bidirectional Search 論文に取られてしまいました。自分の論文の内容はこんどまた書きます。自分の発表は昨日終わりました。

# **AAAI-16 Best Paper Award** [Bidirectional Search that is Guaranteed to Meet in the Middle.](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiQhtTcy_zKAhVW2WMKHR2LA9oQFggcMAA&url=https%3A%2F%2Fwebdocs.cs.ualberta.ca%2F~holte%2FPublications%2FMM-AAAI2016.pdf&usg=AFQjCNG8aFn6MlbhPr99kW5lm5RVHGF_6A&sig2=i7tLhUtb6tEOCNCEH946Ww) *Holte, Felner, Sharon, Sturtevant*


朝ごはんのあとに思いつきで書いてるだけなので、そんなにくわしくは書きません。

この論文は、探索ノードを$n$として、OPENリストのソートに以下の値を用いる MM (Meet in the Middle) というアルゴリズムを提案しました。

```math
pr(n) = \max ( g(n)+h(n) ,\; 2g(n) )
```

$g(n)+h(n)$ は A* の $f$ 値と同じ定義です。
超シンプルですが、これを用いることで、以前書いた ProveOptimality の必要がないBidirectional Searchを実現することができます。つまり、Bidirectional Searchとしては初めて、A*と同様に、最初に見つかった解がそのまま最適解であることが保証されるアルゴリズムです。

最初に提案されて50年もたっていまさらかよと思われるかもしれません(というか自分も同感です)が、まあ「人気が落ちてしまった分野が再発見されて研究が進む」というのはよくあることですね。

以前の記事にも書いたように、Bidi Search は Brute ForceではA*より強く、Strong Heuristicsでは A*に負けるのでした。この性質はMMでも引き継がれます。

特に、MMのうち、A*に対するDijkstra Search, つまり $h=0$ のケースを $MM_0$ と呼ぶことにします。すると、 $MM_0$ は Dijkstraよりもかなり早く探索を終えることができます。

![Screenshot from 2016-02-16 08:39:15.png](https://qiita-image-store.s3.amazonaws.com/0/6090/6066e740-8fcd-160c-de53-86e776eb30b7.png)

Brute-ForceだとUni-BS(Unidirectional Brute Force = dijkstra) よりも $MM_0$ がはるかに早いですね。一方、おそらくGAP-3からGAP-1になるにつれてより正確なヒューリスティック関数を用いているのだと思います。正確なヒューリスティックがあればA*が早く、不正確だとやはりMMが早いようです。

追記: なお、 MM-2g は $\max(f+g, 2g)$ の $2g$ をなくして、$f$ のみを用いる普通のBidi Searchにしたもののようです。これだと、ProveOptimalityが必要になることで、必要な探索ノード数が増えていることがわかります。

以上、アリゾナ、フェニックスからお届けしました。ちなみに日中は29度とかになって暑いですが、朝は気持ちいいです。

![2016-02-12 08.18.00.jpg](https://qiita-image-store.s3.amazonaws.com/0/6090/b8a5959c-4c03-816a-7062-b53f34eb5923.jpeg)

PS. あっ、記念写真です。

![2016-02-14 14.05.41.jpg](https://qiita-image-store.s3.amazonaws.com/0/6090/ff21a076-c5be-d29a-7a2e-be11968765be.jpeg)
[Linux][shell][top] topコマンドの実行コマンド欄を省略せずに全て表示する

標題の件。`-c` オプションを使用する。

`-b` でバッチモードで実行
`-n 1` で１回のみ実行

```
# 通常の場合
$ top -b -n 1
top - 00:18:14 up 31 min,  2 users,  load average: 0.10, 0.06, 0.12
Tasks: 184 total,   2 running, 182 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.2 us,  1.4 sy,  0.2 ni, 96.1 id,  1.0 wa,  0.0 hi,  0.1 si,  0.0 st
KiB Mem:   4048016 total,  1701140 used,  2346876 free,   260588 buffers
KiB Swap:  2095100 total,        0 used,  2095100 free.   761484 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
28249 koaralo+  20   0   29960   1536   1092 R   6.2  0.0   0:00.02 top
    1 root      20   0   33896   3216   1488 S   0.0  0.1   0:01.34 init
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kthreadd
    3 root      20   0       0      0      0 S   0.0  0.0   0:00.39 ksoftirqd/0
    4 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0
    5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H
    6 root      20   0       0      0      0 S   0.0  0.0   0:00.06 kworker/u8:0
    7 root      20   0       0      0      0 S   0.0  0.0   0:03.92 rcu_sched
    8 root      20   0       0      0      0 S   0.0  0.0   0:03.22 rcuos/0
<後略>

# -c オプションを着けて実行コマンド欄をフルで表示する
$ top -c -b -n 1
top - 00:26:27 up 40 min,  2 users,  load average: 0.01, 0.10, 0.15
Tasks: 187 total,   1 running, 186 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.2 us,  1.4 sy,  0.2 ni, 96.4 id,  0.8 wa,  0.0 hi,  0.1 si,  0.0 st
KiB Mem:   4048016 total,  1705068 used,  2342948 free,   261048 buffers
KiB Swap:  2095100 total,        0 used,  2095100 free.   767520 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 1358 root      20   0  442100 104932  21176 S  12.1  2.6   0:23.11 /usr/bin/X -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
  865 mongodb   20   0  382052  44228   6872 S   6.1  1.1   0:57.36 /usr/bin/mongod --config /etc/mongodb.conf
 2093 koaralo+  20   0 1351844  74600  37068 S   6.1  1.8   0:29.32 compiz
 2350 koaralo+  20   0   32908   2520   1392 S   6.1  0.1   0:23.72 tmux
    1 root      20   0   33896   3216   1488 S   0.0  0.1   0:01.34 /sbin/init
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.00 [kthreadd]
    3 root      20   0       0      0      0 S   0.0  0.0   0:00.40 [ksoftirqd/0]
    4 root      20   0       0      0      0 S   0.0  0.0   0:00.00 [kworker/0:0]
    5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [kworker/0:0H]
    6 root      20   0       0      0      0 S   0.0  0.0   0:00.06 [kworker/u8:0]
    7 root      20   0       0      0      0 S   0.0  0.0   0:04.69 [rcu_sched]
    8 root      20   0       0      0      0 S   0.0  0.0   0:03.82 [rcuos/0]
<後略>
```
underscoreコードリーディング（extend）



underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##extendとは


###[underscorejs.orgのextend](http://underscorejs.org/#extend)

こんな説明。
>####_.extend(destination, *sources) 
>Copy all of the properties in the source objects over to the destination object, and return the destination object.
>It's in-order, so the last source will override properties of the same name in previous arguments.

```javascript
_.extend({name: 'moe'}, {age: 50});
=> {name: 'moe', age: 50}

```

------------- 

sourceのobjectsのプロパティをdestinationのオブジェクト（のプロパティ）に上書きコピーして、destinationのオブジェクトを返します。
前にあったargumentsと同じ名前の場合、最後のsourceで上書きされる仕様です。


###[underscore.extend](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1005)
コード的にはこのあたり。

```javascript
 // Extend a given object with all the properties in passed-in object(s).
  _.extend = createAssigner(_.allKeys);

```

createAssignerに_.allKeysを渡している。


[createAssigner](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L98)は以下

```javascript
  // An internal function for creating assigner functions.
  var createAssigner = function(keysFunc, undefinedOnly) {
    return function(obj) {
      var length = arguments.length;
      if (length < 2 || obj == null) return obj;
      for (var index = 1; index < length; index++) {
        var source = arguments[index],
            keys = keysFunc(source),
            l = keys.length;
        for (var i = 0; i < l; i++) {
          var key = keys[i];
          if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];
        }
      }
      return obj;
    };
  };
```

返り値は関数。引数はobj。
lengthにargumentsのlengthを格納する。
lengthが2以下またはobjがnullだった場合、objを返す（追加するものがない/objがない）
for文で1からlengthまで回す。
index番目のargumentsをsourceに格納する。
keysにkeysFunc(ここだとallKeys)にsourceを渡す（例だと{age: 50}）
lにkeysのlengthを渡す
for文でi=0からlまで回す
keysのi番目をkeyに入れる。
undefinedOnlyが存在しないかつobjのkey番目がvoid 0ではなければ、objのkey番目にsourceのkey番目（例だとage:50の50)を代入する

for文の処理が全て終わったあとにobjを返す。
Gitリポジトリの総サイズを取得する方法のまとめ

# TL;DR
Gitリポジトリの総サイズを取得する方法のまとめ。

# git >= 1.8.3 以上の場合
[`git count-objects`](https://git-scm.com/docs/git-count-objects) を使用する

```bash:
$ git gc
$ git count-objects -vH
```

```shell-session:実行例
$ git count-objects -vH
count: 77
size: 308.00 KiB
in-pack: 238
packs: 1
size-pack: 45.85 KiB
prune-packable: 0
garbage: 0
size-garbage: 0 bytes

```

# git < 1.8.3 の場合
[`git count-objects`](https://git-scm.com/docs/git-count-objects) は使用できないので `git bundle create tmp.bundle --all` を使用する

```bash
$ git gc
$ git bundle create tmp.bundle --all
$ du -sh tmp.bundle
```

```shell-session:実行例
$ git bundle create tmp.bundle --all
Counting objects: 314, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (131/131), done.
Writing objects: 100% (314/314), 45.90 KiB | 0 bytes/s, done.
Total 314 (delta 153), reused 314 (delta 153)

$ du -sh tmp.bundle
48K     tmp.bundle
```

# 参考
[Git - git-count-objects Documentation](https://git-scm.com/docs/git-count-objects)
[filesize - Find size of git repo - Stack Overflow](http://stackoverflow.com/questions/8185276/find-size-of-git-repo)
Macからssh接続時にロケール関連のエラーが発生する場合


## 現象

- MacOSX Terminal から ssh で繋いだ時に、以下のようなロケール関連のエラーが出ることがある

```
can't set the locale; make sure $LC_* and $LANG are correct
```


## 解決方法

- 結論から言えば、Terminal のメニューから、[Preferences...]を開き、[Profiles]-[Advanced]タブの [Set locale environment variables on startup] をオフにすれば良い


## 原因

1. Terminal の上記オプションがオンになっていると、Terminal 起動時に、`LC_CTYPE="UTF-8"`がセットされる
2. Mac 側の /etc/ssh/ssh_config で `SendEnv LANG LC_*` になっていると、ssh接続時にこの環境変数 LC_CTYPE がサーバ側に送られる
3. サーバ側の /etc/ssh/sshd_config で `AcceptEnv LANG LC_*` になっていると、クライアント側から送られた LC_CTYPE が接続先でも受け入れられ、有効になる
4. "UTF-8"なんてロケールないよ！って怒られる

このため、原因1 の元を断てば、エラーは起こらなくなります。
CentOS 6.x で Remi's RPM リポジトリを利用する

## 実現したいこと

CentOS 6.x で Remi's RPM リポジトリを利用できるように設定する

## 実現方法および解決方法

Remi's RPM リポジトリを利用するための証明書のインポートと設定ファイルを記述する

## 実行コマンド

```
$ mkdir -p ~/tmp/remi.yum
$ cd ~/tmp/remi.yum/
$ wget http://rpms.remirepo.net/RPM-GPG-KEY-remi

# 証明書をインポート
$ sudo rpm --import RPM-GPG-KEY-remi

$ cd /etc/yum.repos.d/
$ sudo wget http://rpms.remirepo.net/fedora/remi.repo

# 設定ファイルの修正
# yumコマンドでenablerepoオプションでリポジトリを指定しないと
# Remi's RPM リポジトリをインストールできないようにする
$ sudo sed -i 's/enabled=1/enabled=0/' remi.repo

$ yum --enablerepo=remi list
```

## 情報源

http://blog.remirepo.net/pages/Config-en
http://blog.remirepo.net/pages/English-FAQ

## 補足

* http://blog.remirepo.net/pages/English-FAQ
* Remi's RPM リポジトリを利用する前に上記のURLを閲覧して利用するかどうかを判断したほうがよい
ネットワークトラブルの切り分け手順

1. 有線接続の場合、LANケーブルが接続されているか確認する！
2. ルーターやスイッチなどネットワーク機器の電源が入っていることを確認する！
3. PCのTCP/IP設定をifconfigで確認する！
4. デフォルトゲートウェイ(ルーター)と通信できるかをpingで確認する！
5. DNSサーバーによる名前解決ができるかをnslookupで確認する！
6. GoogleやYahooなどインターネット上の特定のサーバと通信できるかをpingで確認する！
Unity3D-簡単なゲームを作りながら学ぼう⑤

#スペースバーをクリックしたらミサイルが発射できるようにします。
>Input情報を確認します（Edit->Project Settings->Input）。「Jump」という名前でSpaceが定義されています。この名前をスクリプトで使います。
![47.PNG](https://qiita-image-store.s3.amazonaws.com/0/108475/2ddf11af-4e38-5025-1a67-dd60b50dbb91.png)

>飛行機とミサイルをつなぐときに生成したMissileShootファイルを編集します。
```
using UnityEngine;
using System.Collections;

public class shootMissile : MonoBehaviour {

    public GameObject missile;  //Inspectorから設定できる

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {

        //Jump(Space Barを押したときの処理
	    if (Input.GetButtonDown("Jump"))
        {
            //ミサイルインスタンスを飛行機の位置と回転情報をベースに生成。
            Instantiate(missile, transform.position, transform.rotation);

        }
	}
}
```

>ゲームを実行してみます。ミサイルは表示されてないですが、左のHierachyにMissile(Clone)が追加されています。
![48.PNG](https://qiita-image-store.s3.amazonaws.com/0/108475/96c3cc29-6a28-4a4c-148b-3644dcd25f98.png)

>これは飛行機と同じ位置に生成したので見えないだけです。ミサイルの位置を変更して見えるようにスクリプトを追加しましょう。
>Assets/ScriptsにmissileMoveの名前でスクリプトを追加します。
追加したスクリプトをミサイルPrefebに追加します。Missileを選択してInspectorからAdd Componentボタンをクリックします。検索画面からmissileMoveを入力すると追加できます。

![49.PNG](https://qiita-image-store.s3.amazonaws.com/0/108475/d41c9de1-5d28-c8e0-729c-d704abe40e60.png)

>missileMoveスクリプト修正

```
public class missileMove : MonoBehaviour {

    public float speed = 10f;
	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
        //前進（Z方向）
        transform.Translate(0, 0, speed * Time.deltaTime);
	}
}

```
>これでミサイルが発射できるようになりました。

![50.png](https://qiita-image-store.s3.amazonaws.com/0/108475/b40ef2f8-b8f7-991a-4758-4febe347e92c.png)


次回は敵飛行機を作ってミサイルが当たった時の処理をやります。
ノードの再起動を跨いだPIDの衝突について

ノードの名前を変えずに再起動した場合に、再起動前に他のノードに送信済みの古い`pid()`や`reference()`が、再起動後に生成された新しいものと衝突しないかが気になったので少し調べてみた。

-----

Erlangがノード間通信の際に使用するシリアライズ形式(外部形式)に関する[ドキュメント(External Term Format)](http://erlang.org/doc/apps/erts/erl_ext_dist.html)を見てみると、`pid()`や`port()`、`reference()`といったID系の型には、最後に一バイトの__Creation__フィールドといったものが存在していることが分かる (ただし領域な範囲はその中の2bitのみ)。

例えば`pid()`の外部形式をバイナリ表記で示すと`<<Tag:8, NodeName:N, Id:32, Serial:32, Creation:8>>`となる。

このフィールドの値はノードが再接続する度に(?)インクリメントされ、冒頭に書いたような再起動等に纏わる衝突問題を回避するための使用される模様。

実際に試してみる。

```erlang
$ erl -sname master@localhsot

% 別ノードを起動
> {ok, _} = slave:start_link(localhost, slave).
> nodes().
[slave@localhost]

% slave@localhost上でプロセスを起動してPIDを取得する
> P0 = spawn(slave@localhost, fun () -> ok end).
<7227.41.0>

% ノード停止
> ok = slave:stop(slave@localhost).
> nodes().
[]

% 上記の流れを関数化
> RemotePid = fun () ->
                  {ok, _} = slave:start(localhost, slave),
                  P = spawn(slave@localhost, fun () -> ok end),
                  ok = slave:stop(slave@localhost),
                  P
              end.

% 再起動後のslave@localhost上のプロセスのPIDを取得
> P1 = RemotePid().
<7227.41.0>

% P0 と P1 は見た目上は同一だが、実態は異なる
> P0 =:= P1.
false

% `term_to_binary/1`を適用してみると`Creation(末尾1byte)`の値が異なっていることが分かる
> term_to_binary(P0).
<<131,103,100,0,15,115,108,97,118,101,64,108,111,99,97,
108,104,111,115,116,0,0,0,41,0,0,0,0,1>>
> term_to_binary(P1).
<<131,103,100,0,15,115,108,97,118,101,64,108,111,99,97,
108,104,111,115,116,0,0,0,41,0,0,0,0,2>>

% もう三回再起動してみる
> P2 = RemotePid().
> P3 = RemotePid().
> P4 = RemotePid().

% P0と比較: 2bit分しかないので五回目で一周している
> [P0 =:= P || P <- [P1, P2, P3, P4]].
[false, false, false, true].

> term_to_binary(P4).
<<131,103,100,0,15,115,108,97,118,101,64,108,111,99,97,
108,104,111,115,116,0,0,0,41,0,0,0,0,1>>
```
__Creation__が2bit分しか使われないのは若干心もとなくはあるけど、基本的にPIDの衝突(偶然の一致)が問題になりそうなのはノード起動直後に生成された一時プロセスくらい(長命なプロセスは大抵linkやmonitorで監視が行われノードダウン時に一緒に破棄される)だと思うので、よほど頻繁にノード再起動を行うようなケースでもなければあまり実害はなさそう。
(永続的に保持されるような`reference()`がもしある場合には気を付ける必要があるかもしれない)
Arduinoでインラインアセンブラ

単純な足し算をする。RdとRsが足し算され、結果はRdに格納される。

```c:addvalue.ino

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  
  int val1 = 2,val2 = 3; 
  
  __asm__(
    "add %[Rd],%[Rs]"
    :[Rd] "=r" (val1)
    :[Rs] "r" (val2)
  );
  Serial.print("addvalue = ");
  Serial.println(val1);
}

void loop() {
  // put your main code here, to run repeatedly:
}


```
Camundaの開発環境構築手順をItamaeで書いてみた

Itamaeの練習がてらに、ディベロッパーフレンドリーなBPMプラットフォーム「[Camunda](https://camunda.org/)」の開発環境構築手順を書いてみました。デフォルトのDBはh2ですが、MySQLに接続するように変更しています。

## 処理内容

下記の作業を行っています。

#### install.rb

- Camunda, Tomcat, MySQL, JDBC Driver のダウンロード・解凍

```sh
$ itamae local --node-json camunda-7.4.json install.rb
```

#### setup.rb

- Tomcatのserver.xmlを編集してMySQLに接続する
- Tomcatのtomcat-users.xmlを編集してTomcatユーザーを登録する
- データベースのセットアップ

```sh
$ itamae local --node-json camunda-7.4.json setup.rb
```

#### start.rb

- Tomcat (Camunda) の起動

```sh
$ itamae local --node-json camunda-7.4.json start.rb
```

#### stop.rb

- Tomcat (Camunda) の停止

```sh
$ itamae local --node-json camunda-7.4.json stop.rb
```

## 環境

- Mac OS X El Capitan Version 10.11.3
- Ruby 2.2.2p95
- Itamae v1.9.3

## コード

- [https://github.com/mas178/camunda-env](https://github.com/mas178/camunda-env)
QAACをAudacityから使ってm4a(aac)書き出しする

# 初めに

音楽編集ソフトでフリーと言ったら真っ先にAudacityが浮かぶと思います。ちょちょっと編集して書きだすのに便利ですよね。

ところでデフォルトのm4a書き出し(aac)がFFmpeg(しかも古いやつ)を使ったもので、これはちょっと不満です。どうせならqaacとかNeroAacEncで書き出したいですよね？

今回は私がAviUtlを使っていて、rigayaさんのx264guiExのauo_setupでqaacがついてくるからちょうど持っている、というただそれだけの理由で、qaacを使います。NeroAacEncでも手順は同じです。

# その前にqaacのコマンドラインオプションを確認しようか

基本は

```
qaac $mode --ignorelength -o $file_name
```

です。``$mode``の部分はざっと5パターンですね。

|              | $mode_cmd     |
|--------------|------------------------|
| ABR(AAC)     | ``-q 2 --abr $rate``       |
| ABR(HE-AAC)  | ``-q 2 --he --abr $rate``  |
| CVBR(AAC)    | ``-q 2 --cvbr $rate``      |
| CVBR(HE-AAC) | ``-q 2 --he --cvbr $rate`` |
| TVBR(AAC)    | **``-q 2 --tvbr $cmd``**   |

私はx264guiExのデフォルトがTVBRなのでいつもそれ使っています。で、これの``$cmd``ってのがさっぱり直感的じゃないです。

| target bitrate | $cmd |
|----------------|------|
| 300            | 127  |
| 250            | 118  |
| 230            | 109  |
| 210            | 100  |
| 190            | 91   |
| 160            | 82   |
| 145            | 73   |
| 130            | 63   |
| 110            | 54   |
| 100            | 45   |
| 90             | 36   |
| 80             | 27   |
| 70             | 18   |
| 50             | 9    |
| 40             | 0    |


# 下準備

コマンドラインが長くならないように、qaac.exeのある場所にPATHを通しておくといいと思います。

私の場合は
``C:\program1\aviutl100\exe_files``
にPATHを通しています。

# ではAudacityから書きだそう

![image](https://qiita-image-store.s3.amazonaws.com/0/94177/427ee79c-278e-2754-461e-f9d0063decd2.png)

基本的に画像通りです。パイプがなにかわかっていれば何も難しくないですね。

```
qaac           -q 2 --tvbr 91 --ignorelength -                                -o "%f"
[実行ファイル名][TVBR 190kbps～でエンコード]   [標準入力にパイプされたものを受ける] [出力]
```
AzureのWebAppsでサーバー構築、接続まで

#はじめに
AzureのWebAppsを用いたサーバー構築方法とFTP設定の発行、接続方法を説明します。
個人的につまずいてしまった部分があるのでメモとして投稿しておきます( '-' )

##Azureポータルでサーバー構築
Azureポータルにログインし、AppService→追加で下記の画面が開きます。
AppServiceの名前、サブスクリプションなどを入力し作成を選択。
ここではサンプルとしてAppService名を「testserver0000」としています。

<img width="735" alt="スクリーンショット 2016-02-16 21.09.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/71388/8f7b1f36-70b7-5cd6-67d0-116551baf469.png">

##FTPの発行について
サーバー構築後、設定→デプロイ資格情報で下記の画面を開きます。
デプロイユーザ名とパスワードを設定し保存を選択。

<img width="868" alt="スクリーンショット 2016-02-16 22.28.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/71388/9d9e3072-e6c1-a317-186b-a1a0c7d51d1d.png">



保存が完了後、サーバーの管理画面で発行プロファイルのダウンロードを選択します。
<img width="588" alt="スクリーンショット 2016-02-16 21.27.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/71388/a4eb156a-4e15-7927-43a1-a1ecf0932ec8.png">


##発行プロファイルのダウンロード完了後
ダウンロードした発行プロファイルをテキストエディタで開きます。
プロファイル情報が1行に纏められているので適当に改行して見やすくします。

下記画像の**publishUrl**がFTPホスト名
**userName**の＄以下がユーザー名（ここではtestserver0000）
**userPWD**がパスワードを表しています。
<img width="895" alt="スクリーンショット 2016-02-16 21.51.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/71388/fc739ab9-1b21-4668-a53c-c9f57b1f4730.png">

これらを用いる事でFTPクライアントからAzureサーバーへ接続を行うことができます。

##おわりに
発行プロファイルの存在に気付かず、FTP発行時に設定したユーザー名とパスワードでサーバーへ接続できるとずっと勘違いしていました・・・
つらみです(´・ω・`)
Scalaの等値比較演算子は何故nullチェックが出来るのか

Scalaの等値比較演算子は何故nullチェックが出来るのか

# はじめに
```NullCheck.scala
val a:AnyRef = null
if (a == null) {
	println("a is null")
} else {
	println("a is not null")
}
```
Scalaにおいて、`==`は等値比較を実施するものですが、等値比較演算子でnullチェックを行えるのは何故でしょう？


というのは、上記をJavaに翻訳してみると

``` NullCheck.java
Object a = null;
if (a.equals(null)) {
// -> Exception in thread "main" java.lang.NullPointerException
	System.out.println("a is null");
} else {
	System.out.println("a is not null");
}
```

のようになるため、`a.equals(null)`を実行した際に`NullPointerExceptin`が発生します。Scalaは何故エラーにならないのでしょう？

# 調査結果

結論から言うと、`==`の使用方法により３パターンのバイトコードが作成され、上手く動いてくれます。

## パターン1 `==`の右辺がnullの場合

元のScalaのコードを機械語翻訳して、比較処理をしている場所を抜粋します。

``` NullCheck
     3  astore_2 [a]
     4  aload_2 [a]
     5  ifnonnull 19
```

`if (a == null)`が`ifnonnull`に翻訳されてます。`==`の右辺がnullの時、`ifnotnull`という専用のコードを実行するようになってます。頭良い。

## パターン２　右辺がnullと判断できない場合

ちなみに右辺がコンパイル時点でnullと判断出来ない場合、

``` NullCheck.scala
val a:AnyRef = null
val theNull:AnyRef = null
if (a == theNull) {
	println("a is null")
} else {
	println("a is not null")
}
```

↓

``` 
     8  aload_2 [a]
     9  aload_3 [theNull]
    10  invokestatic scala.runtime.BoxesRunTime.equals(java.lang.Object, java.lang.Object) : boolean [20]
    13  ifeq 27
```

`a == theNull`は`scala.runtime.BoxesRunTime.equals(java.lang.Object, java.lang.Object)`の呼び出しに変換されます。

そこでこのメソッドは何かと言うと、

``` BoxesRuntime.java
    public static boolean equals(Object x, Object y) {
        if (x == y) return true;
        return equals2(x, y);
    }

    public static boolean equals2(Object x, Object y) {
        if (x instanceof java.lang.Number)
            return equalsNumObject((java.lang.Number)x, y);
        if (x instanceof java.lang.Character)
            return equalsCharObject((java.lang.Character)x, y);
        if (x == null)
            return y == null;

        return x.equals(y);
    }
```

となっています。一度nullチェックをした後に、equalsを呼び出して等値比較を呼び出しているようです。頭良い。


## パターン３ `==`をオーバーロードした場合

ここで疑問に思うのが`==`をオーバーロードしたケースです。こうなるとBoxesRunTime.equalsが使えません。

``` A.scala
class A {
	def ==(that: A) = true
}
```

``` NullCheck.scala
val a:A = null
if (a == null) {
// -> Exception in thread "main" java.lang.NullPointerException
	println("a is null")
} else {
	println("a is not null")
}
```
比較した瞬間に例外が発生します。


どのようなコードが吐かれているかと言うと。

```
     7  aconst_null
     8  invokevirtual nullcheck.A.$eq$eq(nullcheck.A) : boolean [20]
    11  ifeq 25
```

BoxesRunTime.equalsを経由せずに`A#==`を呼び出すため、例外が発生します。
そのため、`==`をオーバーロードしたオブジェクトは簡単にはnullチェックが出来なくなりそうです。

# 結び
普通はOptionを使います。
Visual Studio 2015で後から機能を追加でインストールする方法

# 0. 前置き
Visual Studioをインストールする際に、「標準」でインストールしてしまい、欲しい機能が不足していることってありますよね（私は、UWPアプリを作成しようとして機能が入っていないことに気付きました）。その時にどのように機能を追加するかをまとめておきます。


**バージョン情報**

|name|ver.|
|:--|:---:|
|Visual Studio|2015 Update1|

# 1. 手順
**1.「プログラムと機能」を開く**
「プログラムと機能」を開き、Visual Studioを探し出して、右クリック、「変更」をクリック。
![1-1.JPG](https://qiita-image-store.s3.amazonaws.com/0/34410/191717da-e32d-2512-9df8-7edcecae7811.jpeg)

**2.対象の機能を追加**
インストーラーが立ち上がったら、「変更」をクリック
![1-2.JPG](https://qiita-image-store.s3.amazonaws.com/0/34410/982aa003-f595-66cb-cd85-c5b8bf0ca6a4.jpeg)

入れたい機能を選択し、
![1-3.JPG](https://qiita-image-store.s3.amazonaws.com/0/34410/a3b47e94-e77c-1e8d-9148-c47517e47f8f.jpeg)

更新を押します。
![1-5.JPG](https://qiita-image-store.s3.amazonaws.com/0/34410/38a3cce9-a0b9-9a3b-3ccc-ddb26cb31e5f.jpeg)

これでOKです。
しぶとく生き残る、いにしえのタグ

# Web 2.0よりも前の世界
まだNetscape Navigatorがブラウザのシェアを握っていた頃…

「iモード」が時代の先端だった頃…

CSS 1.0すらブラウザ互換が取れなかった頃…

そんな時代には、HTMLであらゆる表現のディテールを書き込むほかありませんでした。ページは`<table>`でレイアウトして、フォント調整には`<b>`、`<i>`、`<u>`[^1]や`<font>`といったタグを使っていました。

もちろんJavaScriptもまともに使えるような状況ではなかったのですが、そんな中で用意された、動きのある要素が`<marquee>`でした。

# 懐かしの風景
マーキーでカクカクと流れてくる文字は、独特の風情を持ったものだったと、（そんなものがなくなった今になってみれば）思うかもしれません。ただ、画像なんかをマーキーにされた日には、たまったものではなかったでしょう。

HTML5にももちろん取り込まれることのなかった`<marquee>`ですが、意外なことに現代のブラウザにおいても、機能自体は残されています。いちおう[MDNにも解説ページがあって](https://developer.mozilla.org/ja/docs/Web/HTML/Element/marquee)、実際に`<marquee>`タグで書かれたものを見ることもできます。

…あれっ？

Google Chromeから実際の挙動を見てみると、なんと**ものすごくスムーズに流れています**。あの「カクカクした」感じは、どこにもありませんでした。なお、FirefoxやIE、Safariといったブラウザではカクカクが健在でした。

# CSS3…にならず
このマーキーですが、一度CSS3の機能として提案されたこともあります（[W3C](https://www.w3.org/TR/2014/NOTE-css3-marquee-20141014/)）。ただ、「CSSアニメーションがあるのにいらないだろ」という話になって、結局規格化されることなく終了しています。

# マーキーとXSS
普段使うはずもないこんなタグをどうして思い出したのかと言えば、別件で調べ物をしている過程で、たまたま「`<marquee>`でXSSを行った」という記述を見かけたことでした[^2]。

Qiitaもそうですが、ユーザー入力としてHTMLを受け入れるような構造にするときには、XSSなど不適切なものを防ぐ必要があります。ただ、ここでブラックリスト方式をとっていると、この`<marquee>`のような古いタグや、逆に新規制定されたもの、さらには特定のブラウザだけバグなり仕様なりで通してしまうものなど、あらゆるものを防ぎ切るには不十分だということは明らかです。**ホワイトリスト**方式でないとどうしようもないな、ということは再認識できました。

[^1]: これら3つについては、（場面は限定されるものの）HTML5において新たな意味が与えられ、正式な要素として復権を果たしています。
[^2]: いちおう確認してみましたが、Qiitaは`<marquee>`タグそのものを弾いてしまうので、もちろんXSSにたどり着くことはありませんでした。
port や rvm など昔に活用してたコマンドを使用不可に

多くの方がご存じであろう方法ですが、 alias を設定しました。これだけで、大惨事が防げたことがあります。

```~/.zshrc
alias rvm='echo "You may want to use rbenv!"'
alias port='echo "You may want to use brew!"'
```

# 理由
私は macports は brew に、rvm は rbenv に乗り換えました。しかし、うっかり長く馴染んだコマンドをタイプしてしまっていました。とくに移ってしばらくたったときにやりがちでした。パッケージシステムを同時に使うと競合することもあります。この方法では port や rvm をインストールすることはできませんが、うっかり実行してしまうことは避けられます。

# 探している方法

```
brew install rvm
```
を失敗させる方法を探しています。zsh の correct でできないかとおもったのですが、よく分かりません。
Qiita > 0x10 > 10行のテーブルを挿入 > 3x2 > 3列2行のテーブルを挿入するmarkdownが挿入される

先ほど別の記事を書いている途中におかしな動作に遭遇した。

やったこと

- 0x10 を入力
- [テーブルを挿入]と表示され、Enter
- テーブルが挿入された

0x10 とした場合は、10行のテーブルテンプレートが作成されるようだ。

3列にするにはどうするのだろうか。

このUIの問題は挿入されたテーブルをCtrl+zでなくせないことだろう。
0x110 などしたら、自分で110行消さないといけない。

| 1 | 0 |
|:-:|:-:|
|   |   |
|   |   |
|   |   |
|   |   |
|   |   |
|   |   |
|   |   |
|   |   |
|   |   |
|   |   |

## v0.2
(2016/02/17追記)

わかった。

`3x2`と入力すると以下となる。

| 1 | 2 | 3 |
|:-:|:-:|:-:|
|   |   |   |
|   |   |   |

上記の入力が16進のバイナリコード(0x10)入力時にも有効となってしまうようだ。
ちょっと混乱するが、テーブルを簡易的に実装できるこの機能は重宝する。今後よく使いそうだ。


<hr>
(2016/08/12追記)

0x5や5x0のように片方が0の場合は「テーブルを挿入」が表示されなくなっています。

使い勝手がまた良くなりました。
スタバで top でドヤ顔しているMacユーザはもう古い。これからは htop だ！

# htop とは

top の強化版。top にはない様々な機能があり、子プロセスごとまとめて選択して任意のシグナルを送ることができたりとにかくステキ。

top よりもカラフルかつスタイリッシュな見た目で、top 以上にスタバで「こいつなんかすごいことやってる感」を出すことができ、コマンドラインに馴染みのないユーザにも人気（本当に人気かどうかは知らない）。

htop
http://hisham.hm/htop/

# インストール

RedHat系は epelリポジトリに RPM がある。

```bash
yum install --enablerepo=epel htop
```

Macユーザも brew でインストール可能。

```bash
brew install htop
```

Debian系

```bash
apt-get install htop 
```

それ以外はこちらを参考に。バイナリではなくソースで入れてもOK。
http://hisham.hm/htop/index.php?page=downloads

# htop の使い方

#### マウス操作
- プロセスをクリックして選択したり、`F1-10`に割り当てられている htop の機能も画面下の機能名をダブルクリックして選択することができる。htop の`F1-10`の機能を呼び出すには `option`キーを押しながら `F`キーを押す（キーボードの設定によっては`fn`も押す）。

#### プロセスの選択
- `Space`もしくは`c`で行う。色がついているプロセスは選択されている状態となる。`c`は選択したプロセスの子プロセスも選択する。一度選択したプロセスの解除は`Space`で行う。

#### 検索と絞り込み
- `/`でプロセスの検索ができる。検索してヒットしたプロセスのみを表示したい人は`/`ではなく `\`の Filter機能を使うべし。

#### プロセスのツリー表示の切り替え
- `t`でプロセスのツリー表示の有効/無効を切り替えることができる。

#### プロセスのソート
- もちろん top でもソートはできるが htop では`>`で左側にウィンドウが出現し方向キーで簡単にソートできる。top のソートはいちいち画面が切り替わるのが面倒って人にはありがたい。

#### プロセスに任意のシグナルを簡単に送ることができる
- これが一番便利かも。`k`でどのシグナルを送るか選択するウィンドウが左側に出現し選択しているプロセスに対して好きなシグナルを送ることができる。TERM を送ってプロセスを終了するのも htop からできる。もうプロセスID調べて kill, killall 叩いたりする必要なんてない。

#### プロセスの優先度を変更
- `[`で選択しているプロセスの nice値をインクリメント、`]`でデクリメントできる。※ nice値を減らす（優先度を上げる）ことは root しかできない。

#### 特定のユーザのプロセスだけを表示する
- `u`を押すと左側にウィンドウが出現し、どのユーザのプロセスだけ表示するか選択できる。

#### htop の終了
- htop の終了は`ctl + c`か、`q`か、`F10`。

#### ヘルプの表示
- `h`でヘルプ。他の細かい使い方はヘルプを参考に。

`F2`で設定とかいじれるのでカスタマイズして自分が使いやすいようにするともっといいですね。

※ ちなみにスターバックスでMacをドヤ顔で開く人を「ドヤラー」、その行為を「ドヤリング」と言うらしいです。
I2C > AQM0802 > Instruction Write operation / Data Write operation > 0x40, 0x00

@exabugs さんのコードを元に勉強中。
http://qiita.com/exabugs/items/9d1b66aa1d22805afbc8

```
uint8_t CONTROLL[] = {
  0x00, // Command
  0x40, // Data
};
```
をようやく理解した。

http://akizukidenshi.com/download/ds/xiamen/AQM0802.pdf
にある2ページ目の「データとコマンドのWRITE方法」を参照。

その項目の下の図にどういうビット列を送信するのかが書かれている。
その図の中央にcontrol byteというのがあり、以下のように記載されている。

```
| Co | Rs | 0 | 0 | 0 | 0 | 0 | 0 |
```

Coに0か1を入れることで、以下を示すことになる。

- １: それ以降にも文字が続く
- 0 : 最後の文字

Rsについては

|RS|R/W||
|:---:|:---:|:---:|
|L|L|Instruction Write opearation|
|H|L|Data Write operation|

という記載が図の下の方にある。

ということで、仮に１つのデータだけ送る場合はCo=0となり、

- Instruction Write operation 
  - `| Co=0 | Rs=1 | 0 | 0 | 0 | 0 | 0 | 0 |`
  - = 0x40
- Data Write operation 
  - `| Co=0 | Rs=0 | 0 | 0 | 0 | 0 | 0 | 0 |`
  - = 0x00

ということらしい。
Macで複数デスクトップ利用時・移動時に極力ホームポジションを崩さないための設定集

Macの複数デスクトップ機能...初めて使った時はかなり感動したのを覚えています。

しかし、使っていくうちにもっと効率化したい！もっと楽をしたい！と思うようになりました。

そんなMacの複数デスクトップ機能をより使いやすくするためのTipsです。

## 前提条件

紹介の前に、前提条件を示しておきます。

多分ほとんどの人は大丈夫だと思うので、見出しを見て大丈夫そうだったら飛ばしてください。

### 前提1：US配列を使っている

自分の環境がMacのUS配列なので･･･。

### 前提2：BetterTouchToolが入っている

BetterTouchToolが入っていない人はまずインストールしましょう。

```sh
$ brew cask install bettertouchtool
```

有料化しましたが、以下の記事を参考にすると安く済むそうです。自分は（そんなの知らずに）普通に買いました。

- [BetterTouchToolが有料化したがBTT Remoteがあれば無料で使える](http://hitoriblog.com/?p=34863)

（一応、BettetTouchToolなしでできるものもありますが、できないものもあるので入れておいたほうがいいと思います。）

### 前提3：caps lock を controlにしている

この設定の存在を知らずに、まだ設定していない人は今すぐ設定したほうがいいと思います。いろいろなショートカットを使うのがかなり楽になります。自分はもう元からあるcontrolキーは使っていません。

`システム環境設定 -> キーボード -> 修飾キー`から変えられます。

ただ、設定していない他人のMacを触るためにあえて設定していない人もいると思いますが...。


## 設定一覧

それでは、設定を紹介していきます。重要度が高そうなものから順番にしています。

### 複数デスクトップの切り替え（`control + ;`,  `control + '`）

複数デスクトップの画面切り替えは通常`control + ←`、 `control + →`ですが、これだとホームポジションからかなり離れてしまうため困っていました。

そこで`command + shift + h`、 `command + shift + l`や`contorol + h`、`contorol + l`などにしていたこともあったのですが、どうしても何らかのショートカットとバッティングしてしまったため、やめてしまいました。

特に、`contorol + h`、`contorol + l`はコマンドライン利用時に困ってしまうため、打ちやすくていいかな〜と思ったのですがすぐにやめました（`contorol + h`はカーソルの左側の文字を削除、`contorol + l`は画面のクリア）。

いろいろ考えた結果、`;`、`'`はcontrolとバッティングすることがないのでは？と思い、試しに設定してみました。すると、ホームポジションから手を動かさずに画面を切り替えられるようになったので、かなり重宝しています:smile:

#### 設定方法

これだけ少し設定方法がややこしい（面倒）なので、設定方法を具体的に示しておきます。

1. Macの`システム環境設定 -> キーボード -> ショートカットタブ -> Mission Control` で左の操作スペースに移動、右のスペース操作に移動を`^;`, `^;`に変更

2. BettetTouchToolでキーボードショートカットに`^←`, `^→`をMove Left a Space、Move right a Space として追加

### ウィンドウ自体をとなりのデスクトップに移動（`control + shift + h`, `control + shift + l`）

１つのデスクトップにウィンドウが集まりすぎた時や、なんとなくウィンドウを移動したい時に使えます。

`control + shift + h`, `control + shift + l`にしていると、自分は他のショートカットとバッティングしませんでした。

BettetTouchToolでMove Window One Space/Desktop Left(Right)を設定すればOKです。

### ウィンドウを別のモニタに移動（`control + /`）

ディアルディスプレイにしたときに、ウィンドウを移動させるのが面倒だな〜と思い、調べて見つけた設定です。

これは必ずしも`control + /`でなくてもいいと思いますが、バッティングしないのでとりあえずこれにしています。

他の候補としては、`control + 使わない数字キー`でしょうか？

BettetTouchToolでMove Window to Next MonitorとすればOKです。

### ウィンドウのリサイズ（`control + 数字キー`）

これはやっている方も多そうですね。というか、`control + 数字`だとバッティングする方も多いかもしれません...。

自分は`command + 数字`だと困ることが多かったので、`control + 数字`を設定しています。

設定しているのは

- `^1` Maximize Window Left (ウィンドウを左半分に最大化)
- `^2` Maximize Window Right (ウィンドウを右半分に最大化)
- `^3` Maximize Window (ウィンドウを最大化)
- `^4` Center Window (ウィンドウを中央に移動)
- `^5` Maximize Window to Top Half (ウィンドウを上半分に最大化)
- `^9` Restore old Window Size (ウィンドウを大きさを変える１つ前の大きさに戻す)

の６つです。どの数字キーに何を割り当てるかは、好みでいいと思います。

（今気づきましたが、複数デスクトップあまり関係ないですね...。）

## さいごに

どうでしたか？自分は今のところ、この設定で複数デスクトップまわりの操作は満足しています。

ただ、複数デスクトップ自体を追加するショートカットが設定できていないのは少し心残りです（`control + ↑`の後、`option`で✕マークがすぐ表示されるくらいしか知りません）。

複数デスクトップ自体を簡単に追加する方法や、もし他にも何かいい感じの設定があれば教えて下さい〜:smile:
Today's polymer element [paper-toast]


第４回目は **paper-toast** です。

## What is paper-toast

paper-toastはユーザー通知に使えるElementです。
`opne`か`show`を呼ぶとトースターから飛び出す食パンの様に画面下からフェードインして表示されます。
画面下に控えめに表示されるため、ユーザーの操作を阻害する可能性が低くく簡易的な通知をすることを可能にします。

## Example

### サンプルコード
```html:element-paper-toast.html
<dom-module id="element-toast">
  <link rel="import" href="bower_components/paper-button/paper-button.html">
  <link rel="import" href="bower_components/paper-toast/paper-toast.html">
  <template>
    <style is="custom-style">
      .container {
        padding: 10px;
        margin: 0;
      }
      .container > div {
        padding: 15px;
        margin: 5px;
        background-color: white;
        min-height: 20px;
      }
    </style>
    <div class="container">
      <!-- normal toast -->
      <paper-button raised on-click="openToast">Open Toast</paper-button>
      <paper-toast id="toast" text="toast..">
        <paper-button onclick="toast.toggle()">CLOSE</paper-button>
      </paper-toast>

      <!-- long toast -->
      <paper-button raised on-click="showLongToast">Show Long Toast</paper-button>
      <paper-toast id="long_toast" text="Long Toast duration: 5000ms" duration="5000"></paper-toast>
    </div>
  </template>
  <script>
    Polymer({
      is: 'element-toast',
      openToast: function () {
        this.$.toast.open();
      },
      showLongToast: function () {
        this.$.long_toast.show();
      }
    });
  </script>
</dom-module>
```

### サンプル結果
![demo.png](https://qiita-image-store.s3.amazonaws.com/0/112299/69511722-2d3f-7250-125e-d2c171a0e325.png "demo.png")

WebPushなんかと組み合わせて使うとネイティブアプリのような通知が使えていいんじゃないかと思います。

paper-toastとは関係ありませんが、
polymerのデモに適したwebサービスを探しています。。
JSBinだとLibraryの対応はしているのですが、バージョンが古くてちょっと厳しいなあと。
いいサービスがあればコメントいただけると嬉しいです。よろしくお願いします。
正規表現を使ってCPUを100%にする

Google Chromeのコンソールを開いて以下を実行する。すると処理が終わらなくてChromeがCPU100%を使う。
```/(0+)+1/.test('000000000000000000000000000000000000000000000000000000');
```

これを見つけたとき、なんとなく得意になってchroniumのissueで報告したんだけど、

> You know what also leads to freeze? An endless loop, or recursive fibonacci with a large argument.
Using regexp doesn't mean the runtime complexity magically goes away, and regexp is not always the right tool.
What you are observing is commonly known as backtracking hell. Yes, there are ways to solve pathological cases, at the cost of added complexity and performance penalty elsewhere.
https://code.google.com/p/chromium/issues/detail?id=544123

と言われた。カオから血が出るほど恥ずかった。ちなみにFirefoxも100%になる（「スクリプトの実行を中断するか」と聞かれる）。Safariはfalseをすぐに返してくる。Node.jsでも100%になる。

この事象は、文字列中のURLを取得するために、https://mathiasbynens.be/demo/url-regex に列挙されている一番網羅的な diegoperini のを使ってみたときに見つけたんだけど、そのときのコードが下記のようなもの（現在サイトに載っている正規表現は問題ない）。

```
/(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))/
```

ビジュアライズ版
http://regexper.com/#%2F(%3F%3A(%3F%3A(%3F%3Ahttps%3F%7Cftp)%3A)%3F%5C%2F%5C%2F)(%3F%3A%5CS%2B(%3F%3A%3A%5CS*)%3F%40)%3F(%3F%3A(%3F!(%3F%3A10%7C127)(%3F%3A%5C.%5Cd%7B1%2C3%7D)%7B3%7D)(%3F!(%3F%3A169%5C.254%7C192%5C.168)(%3F%3A%5C.%5Cd%7B1%2C3%7D)%7B2%7D)(%3F!172%5C.(%3F%3A1%5B6-9%5D%7C2%5Cd%7C3%5B0-1%5D)(%3F%3A%5C.%5Cd%7B1%2C3%7D)%7B2%7D)(%3F%3A%5B1-9%5D%5Cd%3F%7C1%5Cd%5Cd%7C2%5B01%5D%5Cd%7C22%5B0-3%5D)(%3F%3A%5C.(%3F%3A1%3F%5Cd%7B1%2C2%7D%7C2%5B0-4%5D%5Cd%7C25%5B0-5%5D))%7B2%7D(%3F%3A%5C.(%3F%3A%5B1-9%5D%5Cd%3F%7C1%5Cd%5Cd%7C2%5B0-4%5D%5Cd%7C25%5B0-4%5D))%7C(%3F%3A(%3F%3A%5Ba-z%5Cu00a1-%5Cuffff0-9%5D%2B-%3F)*%5Ba-z%5Cu00a1-%5Cuffff0-9%5D%2B)(%3F%3A%5C.(%3F%3A%5Ba-z%5Cu00a1-%5Cuffff0-9%5D%2B-%3F)*%5Ba-z%5Cu00a1-%5Cuffff0-9%5D%2B)*(%3F%3A%5C.(%3F%3A%5Ba-z%5Cu00a1-%5Cuffff%5D%7B2%2C%7D)))%2F

複雑。だがそれがいい。しかしこれだとたとえば「//123456789012345678901234567890123456789012345678901234」みたいな文字列がくると正規表現の実行が終わらなくなる...そして正規表現が複雑すぎるがゆえに現象を把握するのにかなり時間を要してしまった。なぜオレはあんなムダな時間を...

なので、いまは stephenhay ```@^(https?|ftp)://[^\s/$.?#].[^\s]*$@iS``` のシンプルで網羅性も良いのを参考にしている。

正規表現の術に頼りすぎるとイザナミのループから抜け出せなくなるということがわかった。シンプル大事。理解しないで使うの危ない（でもオレはあきらめの悪い男...）。
以前に実行したコマンドをもう一度すばやく実行する方法

コマンドラインで作業していると、以前に実行したコマンドをもう一度実行したい状況がよくあります。`ls`などの短いコマンドであればそのまま入力すれば良いですが、長いコマンドを毎回入力するのは大変です。Unix ではコマンドライン上で `ctrl+r` で以前のコマンドを検索することができますが、関連するコマンド履歴を一覧でざざっと表示したいときやコマンド名称の一部しか覚えていないときなどは少々不便です。

# 以前に実行したコマンドを一覧で表示
以前に入力したコマンドの文字列の一部にでも該当するコマンドを一覧で一気に表示するには以下のコマンドが便利です。

`$ history | grep コマンド名の一部`

たとえば、以前に `sudo apachectl restart` を実行したとします。このときに `history | grep apache` と入力すればこのコマンドが表示されます。ここで便利な点として、コマンド名をすべて入力する必要がないということです。つまり、`apachectl`コマンドを仮に忘れてしまっても "apache に関連する何か" ということだけ覚えておけばコマンド履歴から見つけることができます。また、入力したコマンドの一部にその文字列が入っていれば良いので、`history | grep ファイル名` と入力すればそのファイルに対して操作したコマンド一覧を引っ張ってくることもできます。

# ヒットしたコマンドを実行
実行したいコマンドがヒットしたら、`!`のあとにヒストリー番号を入力すればいちいち同じコマンドを入力しなくても良いので便利です。たとえば、`history | grep apache` と入力して、`337 sudo apachectl restart` と出てきたら、`!337` と入力することでそのコマンドが実行できます。

# エイリアスの設定
しかしコマンド履歴を調べるたびに `history | grep` を入力するのはめんどうですよね？そんなときにはこれをエイリアスに設定してしまいましょう。ホームディレクトリの下にある `.bashrc`(zsh の場合は `.zshrc`)に以下のエイリアスを設定して読みこめば OK！

```shell:.bashrc
alias hg='history | grep'
```

入力したら保存して、`.bashrc`(`.zshrc`)再読み込みをします。

`$ source .bashrc` (zsh の場合は `.zshrc`)

これで、`history | grep コマンド名の一部` の代わりに `hg コマンド名の一部` と入力するだけで検索できるようになりました！

# まとめ
- `history | grep コマンド名の一部` でコマンド履歴からコマンド検索
- `!(ヒストリー番号)` でそのコマンドを実行
- `.bashrc`(`zshrc`)にエイリアスとして `hg` を設定しておくと便利
Array.prototype.sliceを使う

備忘録
JavaScriptを学び始め、書籍「パーフェクトJavaScript」にこの様な記載があったのでメモ

.getElementsByTagName　で取得したものをそのまま利用するよりも、
Arrayに変換したものをひっぱってくる方がパフォーマンス良い。
取得する要素数が多い時なんかに違いが出てくる。
※IE8以前ではエラーになる

JavaScriptを書いている人なら当たり前の事かも知れないですが。