OmniAICreator/Qiita-1.07M huggingface dataset:
gitで起きたエラーの解決法

#今回起こったこと
railsチュートリアルをやっている最中にgit commitしようとしたら
思わぬエラーが発生した。

```
*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got '○@○Air2.(none)')
```
要はあなたは誰ですか状態だったらしい。
gitの初期設定ができてないみたい。。(以前に何回かcommitしてるのだが。。。)

##解決策
エラー文を見れば分かる通り、gitに自分を分からせるために
gitに登録しているアドレスと、ユーザーネームを指定してあげればいい。
ターミナルで以下を実行
```
$git config --global user.email ここに自分のアドレス
$git config --global user.name ここに自分の名前
```

アドレスと名前の部分は""が無くても大丈夫みたい。

とりあえずこれで再度pushしてみると
いけました！！！
WebAssembly binary encoding version 0x1

この記事は以下の理由により https://ukyo.github.io/wasm-usui-book/webroot/binary-format.html で管理することにしました。内容は同じです。

* MarkdownとRe:VIEWファイルを2重に管理するのが面倒
* Markdownのテーブル記法で表示が一部崩れる
IDE、 ATA、SATA, SCSI、iSCSI、FC、SASの体系を絵に書いてみる

現在はAppleを始め各社 NVMe という規格を使ったストレージディスクを使用する時代が到来しつつあります。
しかし、ストレージ専門にやってきた方と話すと、「昔はね。」という言葉の次に、IDE、 ATA、SATA, SCSI、iSCSI、FC、SAS などの言葉がでてきます。
これらの用語に対してなんとなくの理解で、ここまで来てしまいましたが、とある機会がありまして、これらの用語を絵で表してみました。

![storage classification (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/142884/cee8ab23-98c9-310e-61c3-7e895d6c4eec.jpeg)

---
Reference

https://users.miraclelinux.com/technet/document/linux/training/1_3_1.html
http://www.atmarkit.co.jp/fsys/special/001iasvr_basic/iasvr_basic09.html
http://www.fujitsu.com/jp/products/computing/storage/lib-f/tech/interface/sas/
http://www.pc-master.jp/jisaku/ide-sata.html
Railsの環境変数設定

twitterとかAWSのAPIのkeyを外部の人間にばれないようにgithubにあげたいと思ったので調べたら、どうやら「環境変数」なるものを使ってkeyを隠すことができるらしいです。


##元のコード
```yaml:secrets.yml
default_twitter:
  twitter_api_key: "hogehogehogehoge"
  twitter_api_secret: "foobarfoobar"
```

このままgithubにあげようものなら、keyが世界中の方々にhello,worldしてしまう。
そこで「環境変数」の出番というわけです。

##環境変数の設定方法
```bash
# export 変数名 = "keyの中身"
$export TWITTER_API_KEY="hogehogehogehoge"
```
これで設定できる。ちなみに確認したい場合は、


```bash
# env | grep 変数名
$env | grep TWITTER_API_KEY
```
grepしてあげると見つかる。

##設定した環境変数を使う時
```yaml:secret.yml
default_twitter:
  twitter_api_key: <%= ENV["TWITTER_API_KEY"] %>
  twitter_api_secret: <%= ENV["TWITTER_SECRET_KEY"] %>
```

環境変数からハッシュの値を持ってきてあげる旨を書いてあげる。

備忘録で書いてみました。アドバイスありましたらご指摘お願いします。
Docker for Macで立てたコンテナから、ホストOSで動いているAPIサーバーにアクセスする方法

# 状況
* Docker for Macを使っている（Docker version 1.13.0）
* ホストOSのローカル環境でRails製のAPIサーバーを動かしている（以下、APIサーバーと呼ぶ）
* Dockerコンテナ内で別のRailsアプリが動いており、このRailsアプリからホストOSで動いているAPIサーバーのAPIにアクセスしたい（以下、コンテナAと呼ぶ）
* コンテナAからAPIサーバーにcurlでアクセスできれば良いので、curlでアクセスできるようにしたい

| - | エンドポイント |
| --- | --- |
| APIサーバー | http://localhost:3000/items/ |
| コンテナAのRailsアプリ | ホストOSでは http://localhost:3001/ (コンテナ内では http://localhost:3000/ ) |

何も考えずにコンテナAからcurlでAPIのエンドポイントにアクセスすると、当然ですがコンテナAのRailsアプリのコンテンツが返されます。

```
$ curl http://localhost:3000/items/
```

じゃあどうすれば良いのか？

# 解決方法
ホストOSのAPIサーバーにアクセスするには、ホストOSのIPアドレスを指定する必要があります。
しかし、コンテナA内でlocalhostと指定するとコンテナA自身を指定することになります。
それではどのIPアドレスを指定するかというと、ホストOS側で独自のIPアドレスを設定する必要があります。

## 独自IPアドレスの設定方法
### ホストOSにて
ifconfigコマンドを使います。
ifconfigはネットワーク・インタフェースの参照・設定・起動・停止などを行うコマンドです。
以下のようにlo0に対してipの設定を行います。

#### ところでlo0とは
lo0はloopback（ループバック）のことです。

[マスタリングTCP/IP入門編](https://www.amazon.co.jp/%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0TCP-IP-%E5%85%A5%E9%96%80%E7%B7%A8-%E7%AC%AC5%E7%89%88-%E7%AB%B9%E4%B8%8B/dp/4274068765)より
> ループバックアドレス
同じコンピュータ内部のプログラム間で通信したい場合に利用されるのがループバックアドレスです。ループバックアドレスとしては127.0.0.1というIPアドレスが使われます。この127.0.0.1と同じ意味で、localhostというホスト名も利用されます。このアドレスを利用した場合、パケットはネットワークには流れません。

ホストOSにて```$ ifconfig lo0```とすると```inet 127.0.0.1 netmask 0xff000000```とあるように、ここで127.0.0.1（localhost）が設定されていることがわかります。

#### ここから設定
話を戻して、ここから設定に入ります。
[こちら](https://docs.docker.com/docker-for-mac/networking/)の「I want to connect from a container to a service on the host」を参考にし、独自のIPアドレスを設定します。

```
$ sudo ifconfig lo0 alias 10.200.10.1/24
```

ifconfigで確認します。

```
$ ifconfig lo0
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
	options=3<RXCSUM,TXCSUM>
	inet6 ::1 prefixlen 128
	inet 127.0.0.1 netmask 0xff000000
	inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
	inet 10.200.10.1 netmask 0xffffff00 <-- ここの行が追加された -->
	nd6 options=1<PERFORMNUD>
```

以下の設定が追加されていればOKです。

```
	inet 10.200.10.1 netmask 0xffffff00
```

#### コンテナAにて
以下のようにcurlを実行するとAPIにアクセスできるはずです。

```
$ curl http://10.200.10.1:3000/items/
```

これで、コンテナAからホストOSのAPIサーバーにアクセスできるようになりました。

※ちなみにここで設定した独自IPアドレスの設定は、Macを再起動するとリセットされるので、再起動時は毎回手で設定し直す必要があります。さすがに面倒くさいので、Macの起動時に自動的に設定する方法を探すとログインフックという仕組みがありましたので、設定しておくと便利だと思います（[MacOSXのログインフック設定](http://qiita.com/HanaeKae/items/7ea571590d2fc7d46d6b)）。

# 補足（独自のドメインを設定している場合）
ホストOSのlocalhostに対して、/etc/hostsで独自のドメインを設定している場合です。
例えば、localhostにlocal-hoge.comというホスト名でアクセスできるように設定しているとします。

コンテナAにて以下のコマンドを実行すると、

```
$ curl http://local-hoge.com/items/
curl: (6) Couldn't resolve host 'local-hoge.com'
```

となりホストの解決ができません。

そこでコンテナAの/etc/hostsに以下のような設定を追加するとホストの解決ができるようになり、アクセスできるようになります。

```
$ vi /etc/hosts

（以下を追記）
10.200.10.1 local-hoge.com
```

またはコンテナ起動時（docker run時）に以下のようにオプションを指定すると追加できます。

```
--add-host=local-hoge.com
```

Docker Composeを使っているなら、docker-compose.ymlに以下のように指定すると追加できます。

```
extra_hosts:
  - local-hoge.com
```
[参考](https://docs.docker.com/compose/compose-file/#extrahosts)
リフレクションを使ったクラス、構造体の値のコピー

# 目的
クラス、構造体間で名前が一致しているものをコピーしたい。
いちいちコピーコンストラクタ等を書きたくないから。
速度等を気にする場合はしっかりと書くべきだけど
そうじゃないやつ向け

# ソース
早速ソース。
基本的にはフィールドとプロパティを列挙して名前が一致したものに値を入れるだけ。
構造体の場合は値が反映されないので一旦ValueType において終わったら戻す必要あり。
実際には構造体とクラスで別々の関数にする必要あり。

※2017/2/7追記
@muro さんのご指摘の通り参照渡しですので使い方には注意を。
※2017/2/8追記
DeepCopyしたい場合は@muro さんのコメントを参考にしてください。


```csharp

static public void CopyToData<T1, T2>(T1 source, T2 dest)
// where T2 : struct//これがないとValueType vt = dest;ができない。
{
    var destType = dest.GetType();
    var sourceType = source.GetType();
    //構造体の場合はValueTypeにいったん置き換えないと値が更新されない。
    //ValueType vt = dest;
    //構造体の場合は以下のdestをvtに置き換えが必要


　　//お互いのフィールドとプロパティを列挙して名前が一致したものコピーする
    foreach (var destProperty in destType.GetProperties())
    {
        foreach (var sourceProprty in sourceType.GetProperties().Where(v => v.Name==destProperty.Name))
        {
            destProperty.SetValue(dest, sourceProprty.GetValue(source));
        }
        foreach (var sourceField in sourceType.GetFields().Where(v => v.Name==destProperty.Name))
        {
            destProperty.SetValue(dest, sourceField.GetValue(source));
        }
    }

    foreach (var destField in destType.GetFields())
    {
        foreach (var sourceProperty in sourceType.GetProperties().Where(v => v.Name==destField.Name))
        {
            destField.SetValue(dest, sourceProperty.GetValue(source));
        }
        foreach (var sourceField in sourceType.GetFields().Where(v => v.Name==destField.Name))
        {
            destField.SetValue(dest, sourceField.GetValue(source));
        }
   }

    //以下のはまた構造体のときに必要
    //構造体に戻す
    //dest = (T2)vt;
}

```

名前の一致しかとっていないので型が違うとダメになる
その場合は名前と一緒に「FieldType」も比較してあげるとよい
[Ruby Silver対策]試験範囲メソッドチートシート作ってみた(Array)

# Ruby Silver対策　試験範囲メソッドチートシート

[[Ruby Silver対策]試験範囲メソッドチートシート作ってみた(String)](http://qiita.com/UltraBirdTech/items/5ae3ce20fd77f2cf4a35) の続き

次にArray。

~~やる気が残っていれば~~来週あたりHashのチートシート作る。

## Array No.1
<img width="564" alt="RubySilver_array_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/99413/7367b130-23ed-c5d5-540c-4b18f7d273e2.png">

## Array No.2 
<img width="564" alt="RubySilver_array_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/99413/bcfa1803-ddee-80b7-6f94-4a36e1d0fd1b.png">
[Ruby Silver対策]試験範囲メソッドチートシート作ってみた(String)

# Ruby Silver対策　試験範囲メソッドチートシート

自分用に勉強がてらチートシートを作ってみた。
公式の教科書も2.1に対応したものがなかったので自分で挙動を確認して作成。

とりあえずStringをまとめたもの。

## 参考
[Ruby公式資格教科書](http://gihyo.jp/book/2012/978-4-7741-5001-7)
[パーフェクトRuby](http://gihyo.jp/book/2013/978-4-7741-5879-2)

## String No.1
<img width="552" alt="RubySilver_string_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/99413/6691ac60-5d4e-7d43-cc37-da23f83fbf47.png">

## String No.2
<img width="552" alt="RubySilver_string_02.png" src="https://qiita-image-store.s3.amazonaws.com/0/99413/1244dbb8-e32b-231e-de1f-8cc70b74949f.png">
Python3でwebサーバーにtest.pyが反映されません。

プログラミング初心者です。

ローカル環境にpythonのコードを反映させようとしているのですが、python のソースコードがそのまま反映されてしまいます。


$ python3 -m http.server 8000

をタイプした後、

http://localhost:8000/cgi-bin/

に接続すると反映されております。

しかし

http://localhost:8000/cgi-bin/test.py

に移行しようとした途端、htmlに反映されず、test.pyのコードがそのまま表示されてしまいます。

解決策をいただけると助かります。
よろしくお願い致します。
JSX用の If文コンポーネントを作ったらすごく便利だった

ReactのJSXには直接条件式を書くことはできないので、ある要素の表示を条件で切り替えるときには、埋め込み式の中で条件分岐を書かないといけません。

以下の例は、タブで表示画面を切り替える画面のために実装していたコードです。あまり見やすくありません。

```js
{
  app.pageIs(5) ?
    (
      <div>
        <SupportMethodComponent app={app} support_method={data.support_method} />
        <StudentSupporterComponent app={app} student_supporter={data.student_supporter} />
      </div>
    ) : null
}

{
  app.pageIs(6) ?
    (
      <div>
        <StudentOtherActivityComponent app={app} other_activity={data.other_activity} />
        <PlanAfterGraduationComponent app={app} studying={data.studying} />
      </div>
    ) : null
}
```

他にいいやりかたがないか悩んでたんですが、表示を切り替えるためのIf文みたいに使えるコンポーネントを実装してみたところ、かなり見通しが良いコードに置き換えることができました。

以下が作ったコンポーネントです。

```js
import React from 'react';

class IfComponent extends React.Component {
  render() {
    const {cond, children} = this.props;

    if (cond) {
      return (
        <div>
          {children}
        </div>
      );
    } else {
      return null;
    }
  }
}

IfComponent.propTypes = {
  cond: React.PropTypes.bool
};

export default IfComponent;
```


このコンポーネントを使って上のJSXを置き換えてみます。

```js
<If cond={app.pageIs(5)}>
  <SupportMethodComponent app={app} support_method={data.support_method} />
  <StudentSupporterComponent app={app} student_supporter={data.student_supporter} />
</If>

<If cond={app.pageIs(6)}>
  <StudentOtherActivityComponent app={app} other_activity={data.other_activity} />
  <PlanAfterGraduationComponent app={app} studying={data.studying} />
</If>

```

かなり見通しが良くなりました。

単純なコンポーネントですがすごく便利です。
同じ問題でお悩みでしたら、ぜひ試してみてください。
Three.jsでハイポリ化、ローポリ化。

#概要
Three.jsでハイポリ化、ローポリ化して見た。
自分の知ってるアルゴリズムは、subdivisionとcollapse edgeだが、Threeのアルゴリズムは、不明。
知ってる方、教えて。

#写真
![p.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/b72d6857-4cc1-b3c4-90a1-04e67a3794b3.jpeg)

#ハイポリ化
成果物
http://jsdo.it/ohisama1/41cZ

#ローポリ化
成果物
http://jsdo.it/ohisama1/MiCw
OrangePi PC2 imageをBaidu Cloudからdownloadする


[OrangePiの公式imageのdownload](http://www.orangepi.org/downloadresources/)の保存場所は、Google DriveとBaidu Cloudの2つがあるのですが、私の持っているOrangePi PC2のimageはGoogle Driveに保存しているのは1つのみ、ほとんど、Baidu Cloudからdownloadする必要があります。

しかし、Baidu Cloudからimageをdownloadするには、Baiduアカウントが必要なようです。


Baiduアカウントの作成方法は下記を参考にしました。
http://pochiru.com/web_services/baidu_signup/


電話番号として、日本の番号を登録できそうでしたが、認証用のコードを受信することができなかったので、無料のSMSサービスで、米国の電話番号を取得しました。
米国の番号取得は、上記で紹介されているTalkatoneではうまくいかなったので、[textPlus](http://www.textplus.com/)を利用しました。
業務用Scalaのコツ(コツっていうか、嫌われないための心得っていうか)

# 1.型推論は便利だが、横着しないで、ドキュメントを書いているつもりで、できるだけ色んなところに型を明示しておく。
何かあった時、対応してくれるのがScala使いとは限らないわけで、そんな緊急事態の時に、「関数型言語、知らないの？　一から勉強して。さ〜て、この変数の型は何かなぁ〜？」みたいなソースを残しておいたら、確実に**その組織を**Scala嫌いにしてしまうことになる。
# 2.英語を覚えたての中坊がルー大柴みたいな喋り方してると鬱陶しいのと同じで、関数型言語的機能をバリバリ使った書き方は個人用に留めておいて、**業務用には**BetterJavaで我慢しておく。
でないと、誰も話を聞いてくれなくなる。
「Scala使い≒ルー大柴」的な風評も望ましくない。
実際、「一時の勢いがなくなって、消えかけてる」判定受け始めてる気がする(そもそも、勢いがあったのか？　って言われたらアレだが)。
というか、そういう話題になって、肩身の狭い思いをしたことがある(とはいえ、xxxxxxxよりは……ゲフンゲフン)。
# 3.UnitTestは極力Javaで書いておく(少なくとも、Java利用者が読める程度のBetterJavaで)。
どこで何してるか、外からわかれば、せめてもの救いになるので。
「へ〜、これ、Scalaではこんな書き方できるんだ」的な感想を持ってもらえるようなソースを書けたら、利用者も増えるかも。

# 不本意とはいえ、嫌われたら終わりなのである。
構成員全員がScala使いで、採用基準もScala使いっていうなら別として、そんな環境、稀有なわけで。
運用・保守をナメんなよ、って言われます。

# あと、Scalaバリバリでお願いします、みたいな言葉は信じちゃダメだ。
99%裏切られるから。


# 残りの1%は？ って？
それは、生きていくための希望。
Dockerfileに書けるPHP Extensionsメモ

Dockerfileを使ってPHPのイメージをbuildする際、

```Dockerfile:Dockerfile
RUN docker-php-ext-install pdo
```

などとすれば、PHPのExtensionsが導入出来ます。

さてじゃあここで追加出来るExtensionsって何ぞや、と思っていたら、
Dockerfileのビルドエラー時に一覧が出てきたので、備忘録的に記録。

```
Possible values for ext-name:
bcmath bz2 calendar ctype curl dba dom enchant exif fileinfo filter ftp gd gettext gmp hash iconv imap interbase intl json ldap mbstring mcrypt mysqli oci8 odbc opcache pcntl pdo pdo_dblib pdo_firebird pdo_mysql pdo_oci pdo_odbc pdo_pgsql pdo_sqlite pgsql phar posix pspell readline recode reflection session shmop simplexml snmp soap sockets spl standard sysvmsg sysvsem sysvshm tidy tokenizer wddx xml xmlreader xmlrpc xmlwriter xsl zip
```

PECL Extensions系(memcachedやredis、xdebugなど)はここには含まれないみたいなので、
[DockerHubの公式PHPイメージのページ](https://hub.docker.com/_/php/)の通りに、別途記載が必要なようです。
facebook の友達数の推移、投稿数の推移を API を使わずに取得する

# 概要
facebook の友達数や投稿数などを、API を使わずに取得、加工する。

# 方法

1. facebook の「Facebookデータをダウンロード」機能で全データをダウンロードする。
1. awk でごにょごにょして csv とかに加工する。
2. 表計算ソフトでごにょごにょしてグラフを作ったりする。

# まずは友達数の推移を得てみる

```bash:fbdice.sh
#!/bin/bash
basedir=/mnt/virya/Downloads/facebook-takeyukikojima
htmldir=${basedir}/html
awk -v today=20170131 -f friends.awk ${htmldir}/friends.htm
# end of file
```

```awk:friends.awk
BEGIN {
    RS = ">";
    caps["友達"] = "friends";
    caps["Sent Friend Requests"] = "sentRequests";
    caps["友達リクエストを受信しました"] = "recievedRequests";
    caps["Deleted Friend Requests"] = "deletedRequests";
    caps["削除した友達"] = "deleted";
    caps["ファン:"] = "fan";
    caps["Friend Peer Group"] = "group";
    if (today != "") {
        today_year  = substr(today, 1, 4);
        today_month = substr(today, 5, 2);
        today_day   = substr(today, 7, 2);
    }
}

match($0, /^(.+)<\/h2$/, a) {
    caption = caps[a[1]];
    delete m; m[caption] = 1;
    next;
}

m["friends"] {
    if (! parseNameAndDay($0)) next;
    piars[name]++;
    from[name] = date;
    next;
}

m["sentRequests"] {
    if (! match($0, /^(.+) <\/li$/, a)) next;
    name = a[1];
    piars[name]++;
    sent[name]++;
    next;
}

m["recievedRequests"] {
    if (! parseNameAndDay($0)) next;
    piars[name]++;
    received[name] = date;
    next;
}

m["deleted"] {
    if (! parseNameAndDay($0)) next;
    piars[name]++;
    deleted[name] = date;
    next;
}

END {
    OFS = ",";
    for (name in piars) {
        print name, from[name], sent[name], received[name], deleted[name];
    }
}

function parseNameAndDay(line) {
    if (! match(line, /^(.+) \((.+)\)<\/li$/, a)) return 0;
    name = a[1];
    date = a[2];
    if (date == "今日") {
        date = today_year "/" today_month "/" today_day;
    } else if (match(date, /^(([0-9]+)年)?([0-9]+)月([0-9]+)日$/, d)) {;
        date = (d[2] == "" ? today_year : d[2]) "/" d[3] "/" d[4];
    } else {
        date = "**" date;
    }
    return 1;
}

# end of file
```

## 作ってみた友達数推移グラフ
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/64927/bcf2326f-fae3-3da6-b7db-bff10c8be1e6.png)

# そのうち、投稿数の経時推移グラフも
[Rails] jbuilderでAPIを作っていて定義済み関数と同じ名前のキーを登録したい場合

当たり前といえば当たり前の話ですが・・・
jbuilderってこんな感じで簡略化して書けるので
いつもこう書いていました。

```show.jbuilder
json.success true
json.users @users
```

見た目スッキリするので便利なんですが
問題は定義済みのメソッドと同じキーでのセットができないということ

しかも物によってはエラーもでないので意外と原因究明に時間を要しました。

ちなみに自分の場合は"call"というキーを登録しようとしたときに発生

```show.jbuilder
json.success true
json.call @call
```

```出力
{success: true}
```

セットしたはずのcallというキーと値がない・・・！
jbuilderにはcallなんてメソッドもあるんですね。

http://www.rubydoc.info/github/rails/jbuilder/Jbuilder:call


そういう時にそなえて、やはりsetメソッドを使ったほうがいいのかと思った今日このごろでした。

```show.jbuilder
json.set! :success, true
json.set! :call, @call
```
小技）プロファイルの項目セキュリティ設定を一括チェックする（または外す）

# 概要

Salesforceでオブジェクトのメタデータをデプロイした際に、追加したカスタム項目の項目セキュリティがデフォルトで**オフ**になっている。
例えばテスト用に大量のカスタム項目をデプロイした際に、それらの項目をすべて**オン**にするとなると･･･途方に暮れることがあります。（500項目とか･･･）
そんな時にちょっとした小技で一気にそれらをオンまたオフにすることができます。

＊注意･･･当方法はWinter'17時点で有効なもので、今後のアップデートで変更される可能性もありますので、あらかじめご了承ください

# 方法

お使いのブラウザの開発者コンソールで以下のコマンドを入力する


## Classicの場合

### 初期ユーザインターフェイスの場合
```
// readonlyCol・・・参照アクセス権
// displayedCol・・・編集アクセス権
var targetClass = "readonlyCol";
// オフにしたい場合は、false
// オンにしたい場合は、true
var isChecked = false;

Array.prototype.forEach.call(document.querySelectorAll("."+targetClass+ " input"), function(node) {
    node.checked = isChecked;
});
```

### 拡張プロファイルユーザインターフェースの場合

```
// fls_read_ck・・・参照アクセス権
// fls_edit_ck・・・編集アクセス権
var targetId = "fls_read_ck";
// オフにしたい場合は、false
// オンにしたい場合は、true
var isChecked = true;

Array.prototype.forEach.call(document.querySelectorAll("input[id*=" + targetId + "]"), function(node) {
    node.checked = isChecked;
});
```



## Lightning Experience(LEX)の場合

LEXの場合は、下記のコマンド以外に一度ブラウザのセレクター選択機能で要素を選択する必要があります。（原因は読み込み？）

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/30522/df336186-4955-436c-8d03-22c362034dfb.png)


```
// fls_read_ck・・・参照アクセス権
// fls_edit_ck・・・編集アクセス権
var targetId = "fls_read_ck";
// オフにしたい場合は、false
// オンにしたい場合は、true
var isChecked = true;

Array.prototype.forEach.call(document.querySelectorAll("input[id*=" + targetId + "]"), function(node) {
    node.checked = isChecked;
});
```
GitHubのコントリビューターとコラボレーターについて

よく混乱するので。

## コントリビューター(Contributor)

そのプロジェクトに対して、外部から貢献する（している）人たちです。
そのプロジェクトのリポジトリ、そのものに対して、pushしたり、mergeしたりといった権限は持っていません。
そのプロジェクトに対して、修正を反映したい場合には、そのプロジェクトをForkして修正し、Pull Requestを行うといった手順を踏む必要があります。


## コラボレーター(Collaborator)

そのプロジェクトのコアな開発者たちです。
そのプロジェクトのリポジトリ、そのものに対して、pushしたり、mergeしたりといった権限を持っています。
また、そのプロジェクト自体に対する変更権限を有します。

コントリビューターはコラボレーターに対して、Forkしたプロジェクトの修正ブランチをPull Requestを介して、マージして貰うといったフローになります。
【Wordpress】月別アーカイブを相対パスで出力する

月別アーカイブは、これで出力できる

<pre>
 wp_get_archives( );
</pre>


でも、これだと絶対パスで出力されるので、変数化してこうする。

<pre>

$args = array(
'format'=> 'option',
'echo' => 0 //☆ここがポイント
);
$list = wp_get_archives( $args );
$replace = str_replace('http://xxxxxx', '', $list); 
echo $replace

</pre>

☆の部分がないと、$listの部分で絶対パスの状態で書き出されてしまう。
bash で条件判定組みたい時


参考 http://shellscript.sunone.me/if_and_test.html

bash職人じゃなくてもたまには bash のワンライナーくらい書かなきゃいけないときってのがある。

デプロイ用に一行のコマンドを指定したい時、なんかはまさにそれだ。

composer のpostinstall とか npm run script とか…

## bash で条件判定を組みたい時

bash で条件判定を組みたい時にはいくつかパターンが有る。

- if 文を使う
- test コマンドと `&&` を使う
- `[ ]` 記法と `&&` を使う

１行で何かしらの処理を表現しようとする時、多分２番めや３番めの記法が一番綺麗で楽だったりする。

環境変数 `$APP_DEBUG` を元に処理の切り分けを行いたいときなど以下のようにかける。

````
[ $APP_DEBUG ] && echo "this is debug mode!"
[ $APP_DEBUG ] || echo "this is production mode!"
```` 

単純に処理を実行させるだけならコレでも全然問題無いのだが、実際コレをCIのデプロイツールなどと組み合わせると、終了コードが1になるとかでビルドがコケるケールが出てくる。

こうした場合は、多少冗長でも if を使った記法を使うほうが良さそう。

````
if [ $APP_DEBUG ]   ; then npm run build:dev ;fi
if [ ! $APP_DEBUG ] ; then npm run build:production; fi
````
jsファイル中のconsole出力をminify時に削除する

# 結論
`UglifyJS2` の `drop_console` オプション付き実行で可能。


# やりたいこと
`javascript`ファイル中にある、開発用の`console.log`その他のconsole出力をリリース版では抑制したい。


# 課題
- 手動でconsoleを削除、はやらない
- 目的のためにconsoleのラッパーを書いたり、JavaScriptライブラリを使わない
    - 手間/依存関係を増やさない


# 方法
javascript向けのMinifierでconsole関連を削除する機能があるはず、と思って探したらCLIのMinifier
ツールである [UglifyJS2](https://github.com/mishoo/UglifyJS2) に目的の機能があった。
実行時の `drop_console` オプション(defaultは`false`)を有効にすることでconsole関連が削除される。

## コマンド
```
uglifyjs <input js file> --compress drop_console=true --mangle -o <js.min file>
```

## 実行例
```js:console.js
const message = "hogehoge";
console.log(message);
console.info("info");
console.warn("warn");
alert(message);
console.error("error");
```

↑に対して `drop_console` オプションを有効にして上述のコマンドを実行する。

```
uglifyjs console.js --compress drop_console=true --mangle -o console.min.js
WARN: Dropping side-effect-free statement [console.js:2,0]
WARN: Dropping side-effect-free statement [console.js:3,0]
WARN: Dropping side-effect-free statement [console.js:4,0]
WARN: Dropping side-effect-free statement [console.js:6,0]
const message="hogehoge";alert(message);
```

出力の `console.min.js` は以下のようなる。

```js:console.min.js
const message="hogehoge";alert(message);
```

期待通りconsole関連が削除されている。
「全てのページにコメントフォーム」を改造してみた

htmlで作成されたページに簡単にコメントフォームを挿入できるできるツールが紹介されているページがあったのでダウンロードして設置してみたら、う〜っ文字化け

http://www.inetagency.net/doc/comment/3/

文字化け自体は簡単に解消できたが、
-  スクリプト類をルートに設置するので、そのまま利用するとルートのパーミッションを777にする仕様はどうかと思う。
- コメント投稿をメールで通知する機能がほしい
- コメントの改行が反映しない。

などがあったので、phpなどほとんど知らないが、一応自分的には使えそうなレベルまで改造した。

sample:
http://qitailang.small.jp/webtech/commentbox/commentform_sample.html

解説：
http://qitailang.small.jp/webtech/commentbox/commentform.html
《JavaScript》CSSアニメーションが終わったタイミングを補足する

CSSの`transition`プロパティ と`@keyframe`を利用した手軽なアニメーションは、実装することがおおいです。

これらのアニメーションが終わったタイミングを補足して、そのあと何かしたいときのスクリプトです。
以下のコードは、jQueryに依存してます。


```js

var transitionEnd = 'oTransitionEnd mozTransitionEnd webkitTransitionEnd transitionend',
    animationEnd = 'webkitAnimationEnd oanimationend msAnimationEnd animationend',
    $yourElement = $('#elememt');

$yourElement.on(transitionEnd, function() {
  $(this).addClass('is-transition-end');  // transition の終了後の処理
});
$yourElement.on(animationEnd, function() {
  $(this).addClass('is-animation-end');  // keyframe animation の終了後の処理
});

```

`transition`が終わったよ、`@keyframe`終わったよ、ということを表すキーワードを変数に格納して`.on()`に渡しています。

ぼくはいつもこのキーワードをスクリプトの最初に、変数に格納するようにして使い回しています。



おわります。
今更ながらmacでTensorFlowを使ってみるための環境構築をしたので自分用メモ

# 環境
- Mac OS X El Capitan 10.11.3
- エディタ　Atom

# Python
## Python 3.6.0 + pyenv-virtualenv
[Python3なTensorFlow環境構築 (Macとpyenv virtualenv)](http://qiita.com/hatapu/items/054dbab03607c47cb84f) を参考に設定。以下変更点

**tensorflow のインポートの前に pyenv環境に入る必要がある**

```
$ pyenv activate
```

**インポートするパッケージはeasy_installに任せた。**
MACはGPUがあったが、CPUのみのパッケージがインポートされた。

```
$ pip install tensorflow
```
# Atomでの実行
[platformio-ide-terminal](https://atom.io/packages/platformio-ide-terminal) を利用

```
$ pyenv activate
$ python test.py 
``` 

で実行できた。
# 課題
linter-pylint でスタイルチェックしようとしたが import のところで怒られる。
色々やってだめだったので　スタイルチェックを　flake8でやっている。
Pythonも触り始めたばかりなのでまだよくわかっていない。
少しずつやっていく。
CSSのメタ言語

CSSのメタ言語について簡単に調べたのでまとめてみました。

## 例えば？
次の４つのメタ言語が検索で出てきました。GitHubでは、Less, Sass, Stylus, Hssの順でStarされているようです。[Google Trends](https://www.google.com/trends/explore?cat=5&date=2008-01-01%202017-01-31&q=less%20css,sass%20less,stylus%20css,hss%20css)でも調べてみたのですが同じ順検索されているようです。

- [Less](http://lesscss.org/) - [Github](https://github.com/less/less.js) 14,408 Stars
- [Sass](http://sass-lang.com/) - [Github](https://github.com/sass/sass) 9,240 Stars
- [Stylus](http://stylus-lang.com/) - [Github](https://github.com/stylus/stylus) 7,774 Stars
- [Hss](http://ncannasse.fr/projects/hss) - [Github](https://github.com/ncannasse/hss) 15 Stars

## 違いは？
個人的に気になった違いのみです。少なすぎますね...詳細は、公式HPやGithubをお願いします。Hssはあまり利用されていないようなので割愛します。

|| Less | Sass / SCSS | Stylus |
|---|:---:|:---:|:---:|
| クライアント上でCSSへ変換 | ○ | × / × | × |
| インデント記法 | × | ○ / × | ○ |

### Less
クライアント上でもCSSへ変換できるところが他の２つとの大きな違い。事前にサーバ上で変換を忘れて古いままのCSSを配布してるなんてことがなくなるのかな...一方で、中括弧やセミコロンの省略ができない。この省略できないのは個人的に痒いところです。また、サンプルコードを見る限り文法のラーニングコストが一番高そうかなと思います。しかし、Google TrendsとGithub上ではLessが一番なので、注目度が一番高いのは間違いなしですね。

### Sass / SCSS
Ruby on RailsではデフォルトでSassが設定されています。Lessと比較すると文法が分かりやすく、私はとっつき易さを感じました。Github上では、Stylusより少しStar数が多い感じです。SCSSは、2010年Sass3から新たに採用された記法です。SCSSではインデント記法が廃止されCSS3互換文法になりました。

### Stylus
LessとSassより後発です。Nodejs製で、ExpressやPugと同じ人が開発したようで、それらと親和性高く設計されているのではないでしょうか。そのため、Nodejs+Express+Pug+Stylusの組み合わせで開発すると幸せになるのかもしれません。気になるのは、Less、Saas、Stylusという順の中で、今後どうなっていくかということです。Google Trendsでもあまり検索されていないようですし...

## 参考
- [Stylus入門したときのまとめ](http://qiita.com/morishitter/items/b9a2d78c79c3c07de776)
- [Stylus入門](http://qiita.com/kubotak/items/18abd6eba7e3daaba054)
MAMPを使ってDrupal開発したいとおもってくだらないことに苦戦していた僕の話

**この記事の文章はわりとふざけてます。おこな人ごめちょ**

# 管理画面にいこうとしたら404エラーになるそこの君、この記事を見ればもう安心だ
正直僕はこんなくだらないことに２度も挫折しかけていたのかとため息が出てしまったよ　HAHAHA

解決法は一番下に書いておくから、時間がない人は飛ばして見ておくれ
時間がある人は僕のくだらない話を読んで笑ってやってくれ
君が笑ってくれたら僕はそれでいいんだ

**概要**

+ なぜDrupalをやろうと思ったのか
+ 実際にやってできなかったこと
+ 解決法

----

## なぜDrupalをやろうと思ったのか
CMSといえばWordpressっていうくらい日本ではWordpressが流行ってる
いろんな企業で使われるし僕は今まで「Wordpress以外のCMS使うとかｗｗｗねーわｗｗｗ」って思ってた
Wordpressをいじりはじめてはや4年色々出来るようになった、クライアントからの少し難しい要件もこなせるようになった。
仕事をしていく上でWordpressで困ることが特になくなってしまった。で、
**もっと別のことにチャレンジしたい** と思ってCMSについていろいろ調べてたらDrupalと出会った。

そう、Drupalという存在はつい最近知ったのさ！お恥ずかしいことにね！
「わたしが Drupal を選ぶのは「なんでもできる」から」とまで書いてある
なるほど、じゃあ 
### Drupalを使って絶滅危惧種のクロアシネコを絶滅危惧種から外されるくらい繁殖させよう
と考えたんだ。
なんでもできるって書いてあるからにはきっと出来るはず。
とりあえずDLしてMAMPで起動しよう

## 実際にやって出来なかった経緯
まず僕はDrupal公式サイトからZIPファイルをDL
ZIPファイルを解凍したファイルの中に表示されているものを **全て**
`document/site_test/Drupal`
に突っ込んだ。
MAMP PROにdrupal.homeというhostsを追加しMAMP PROを起動
MAMP PROを起動しMySQLに`drupal`というデータベースを作成し
Drupalのセットアップ画面に移動する
問題なくインストールが完了し、Drupalのトップページが表示された
「よーし、あとはカスタマイズしていくだけだね」
上のコンテンツというボタンをポチー

### Not Found

＾＾おいふざくんなインスコできただろ
更新ボタンポチ

### Not Found

＾＾なんでできねんだよ
更新ボタンポチ

### Not Found

Google先生に聞いた
「Drupal MAMP」
ざっと見た感じみんな問題なくインストール出来てる
あと大体日本語じゃない文章だから僕わからない
PHPの設定を見直したり、ApacheからNginxに変えたり
いろいろやった。

### Not Found

「Wordpressちゃんがいればいいんもん！Drupalちゃんなんてしらない！」
諦めた

〜翌日〜

やっぱり諦めきれない！僕はクロアシネコを飼いたい
そんな思いがあってかとある記事に出会う
そのサイトは英語だが.htaccessというキーワードがあった
「.htaccess・・・ん？そんなファイルないぞ？」
「あれ、たしかあのファイルって不可視ファイルだったよな・・・」
「・・・あ、僕のPC不可視ファイル非表示になってるヮラ」


## 解決法
解凍したファイルの中には「不可視ファイル」が入っていて、僕はそれを
`document/site_test/Drupal`に入れていなかった。
ファインダーでは不可視ファイルを非表示にしたままだったからね

不可視ファイルを表示するコマンド(ターミナルで操作)
`defaults write com.apple.finder AppleShowAllFiles -boolean true`
Finder再起動
`killall Finder`

表示された.htaccessなど.から始まるファイルも含め全て`document/site_test/Drupal`に突っ込む

MAMP PRO を起動してブラウザで表示すると今までの苦労は何だったのかと言うくらいきれいに映るよ！


## 最後に
これでクロアシネコの繁殖させるための準備ができた
近い将来、僕は絶滅危惧種から外されたクロアシネコをペットにしていることだろう。

Drupalを使えるあまりの嬉しさにパパパッと書いたので誤字とかあったら教えていただけると幸いです。
また、現在クロアシネコは絶滅危惧種です　飼えません。クロアシネコのように黒い足で小さくてヒョウ柄でかわいい猫ちゃんいたら教えてください
Azure CLIインストール＆ログイン（Mac版）

# Azure CLI インストール

1.Mac版のCLIをインストールします。
　http://aka.ms/mac-azure-cli
　※インストール方法は他にもありますが、今回はインストーラーを活用します。

2.ダウンロードしたdmgファイルを実行します。

3.ファイルを実行して、Install Command Line Interfaceを実行します。

4.Microsoft Azure SDKのポップアップが表示されるので完了させる。
　※これでインストールは完了です。


# Azure CLI ログイン

1.ターミナルを開いて下記コマンドを打ち込みます。

```shell-session
$ azure login # パスコードが表示されます。
To sign in, use a web browser to open the page https://aka.ms/devicelogin and enter the code "パスコード表示" to authenticate.
```


2.表示されたパスコードを下記のURLにアクセスして入力します。
　https://aka.ms/devicelogin

3.パスコードを入力するとアカウント選択画面が表示され、選択するとログイン完了です。

4.ターミナルに戻ると下記のログが表示されています。
　<code>login command OK</code>

Windows版
http://qiita.com/witamo/items/9ca2ab2134e309891f55
[Rails]form_forで一括保存したい時に気をつけたいこと

##やりたいこと

form_forを使ってchat_groupのnameと、chat_groupに所属するuserを一括で保存したい。
*２つ目のf.text_fieldに入力すると、インクリメンタルサーチでユーザーが表示される仕様

##モデル

```chat_group.rb
has_many :group_users
has_many :users, through: :group_users
has_many :messages
accepts_nested_attributes_for :group_users
```

```user.rb
has_many :messages
has_many :group_users
has_many :chat_groups, through: :group_users
```

```group_user.rb
belongs_to :chat_group
belongs_to :user
```

*chat_groupとuserは多対多の関係、中間テーブルにgroup_user

##ビュー（失敗）
```app/views/chat_groups/new.html.haml
= form_for(@chat_group) do |f|
  .chat-group-form__field.clearfix
    .chat-group-form__field--left
      = f.label :name, "グループ名", class: "chat-group-form__label"
    .chat-group-form__field--right
      = f.text_field :name, class: "chat-group-form__input", placeholder: "グループ名を入力してください"
  .chat-group-form__field.clearfix
    .chat-group-form__field--left
      .chat-group-form__label チャットメンバーを追加
    .chat-group-form__field--right
      = f.text_field :name, type: "text", placeholder: "追加したいユーザー名を入力してください", id: "keyword", class: "chat-group-form__input"

//userテーブルにnameカラムがあるので上記を試してみた。
//しかしf.text_field :nameが被ってしまい、上手くいかない（2つ目に入力されたものがグループ名になってしまう）
```

##失敗その２
```app/views/chat_groups/new.html.haml
= form_for(@chat_group) do |f|
  .chat-group-form__field.clearfix
    .chat-group-form__field--left
      = f.label :name, "グループ名", class: "chat-group-form__label"
    .chat-group-form__field--right
      = f.text_field :users, class: "chat-group-form__input", placeholder: "グループ名を入力してください"
  .chat-group-form__field.clearfix
    .chat-group-form__field--left
      .chat-group-form__label チャットメンバーを追加
    .chat-group-form__field--right
      = f.text_field :group_users, type: "text", placeholder: "追加したいユーザー名を入力してください", id: "keyword", class: "chat-group-form__input"

//:nameを：group_usersに変更。するとplaceholderにこんなメッセージが。。。
//#<User::ActiveRecord_Associations_CollectionProxy:0x007fcde18421a8>
```

##解決策：value: ""を書き加える

```app/views/chat_groups/new.html.haml
= form_for(@chat_group) do |f|
  .chat-group-form__field.clearfix
    .chat-group-form__field--left
      = f.label :name, "グループ名", class: "chat-group-form__label"
    .chat-group-form__field--right
      = f.text_field :users, class: "chat-group-form__input", placeholder: "グループ名を入力してください"
  .chat-group-form__field.clearfix
    .chat-group-form__field--left
      .chat-group-form__label チャットメンバーを追加
    .chat-group-form__field--right
      = f.text_field :group_users, value: "", type: "text", placeholder: "追加したいユーザー名を入力してください", id: "keyword", class: "chat-group-form__input"
```

##振り返り
モデルに記載したaccepts_nested_attributes_for :group_usersを完全に忘れていた。
f.~と一緒に使われるvalue, nameなどの意味を考えていきたい。
フォームに直接入力して保存するタイプであればfields_forが使えそう。
Amazon Dash ButtonをハックしてSalesforceに登録してみた

次のアーキテクチャでやってみました。
Amazon Dash Button → Python(Scapy) → Rails → Salesforce

【資料はこちら】
http://www.slideshare.net/hiroyukimiyaji50/amazon-dash-buttonsalesforce

　
RailsからSalesforceへは、[databasedotcom](https://github.com/heroku/databasedotcom)を利用していますが、[restforce](https://github.com/ejholmes/restforce)を使った方が良さそうです。
[databasedotcom](https://github.com/heroku/databasedotcom)では、Rails上のテーブル：UserとSalesforceのユーザ情報：Userが被ってしまい競合が起きてしまいました。
本来は[databasedotcom](https://github.com/heroku/databasedotcom)側が名前空間を切ってあれば、テーブル名が同じでも競合することはないはずですが。。。
良いコード書くきっかけを与えたい。

#経緯
ソースコードの書き方は、人によってそれぞれだけれども、良い書き方が存在する。このことに関して言えば、コードコンプリートやコードリファクタリングをはじめとして、たくさん書籍が出ている。

一方、上記のような書籍に触れるタイミングは個人次第のため、自己流でプログラミングをしている人が圧倒的に多い。
少なくとも、常駐先で色んなプログラマのコードを見てきたけど、10人中、まともなのは1～2人程度で、その他は論外という印象だった。

ここでいう論外とは、例えば以下のようなもの。
1. レガシーコードばかり。
　 例えば、クラスは使用せず配列を使用したり、変数宣言は全部先頭だったり。
2. 数値のキャストは何も考えずに文字列にしてからパースする。
　　DBから取得したint型をint.Parse(dbValue.ToString())など。
3. 同じようなコードのメソッド化は考えない。

他にもたくさんあるけど、レガシーコードは必ず見かける。
この手の書き方はソースコードレビューで指摘しても別の箇所で発生し、直らないことが多い。

20代の頃から意識して、よい書き方を考えていかないと、どうにもならない。
一方、書籍を読むのが面倒な人が多く、そういう人には、何かきっかけを与えたい。

ということで実際に業務で遭遇した例を元に、どう書くか定期的に挙げる予定。
意見をいただけるとありがたい。コードは[別の記事](http://qiita.com/csharpisthebest/items/99af9136883f139ad70f)に。

[目次](http://qiita.com/csharpisthebest/items/57f27a33085f01211166)

#いろいろな意見をいただいた上でのまとめ 2017/09/10 追記
この記事をきっかけに、様々な方に意見をいただいた。それらを踏まえた上でどうするべきかをまとめてみた。

##コーディング規約が守れない場合の対処
規約が守れないプログラマが多数のプロジェクトの場合、規約からはずすことも検討する。例えばbool型の変数名について、「名詞句や形容詞句などを使用すると読みやすい。」という主観的な規約は馴染みの無いプログラマが守るのは困難である。
この規約を守ることに時間を費やすよりは、そもそも別の重要なことに時間を割きたい。
結局、プロジェクトとして守るべき規約なのか、一般的に守るべき規約なのかが重要だと思う。

##実装にばらつきが出るような処理のコードについて
実装者によってばらつきが出るようなコードが存在する。[ややこしい条件分岐](http://qiita.com/csharpisthebest/items/99af9136883f139ad70f)が良い例。
このような場合、実装方法をコーディング規約で強制するのではなく、管理テーブルを使用した共通処理化を行うなど、そもそも実装させないことを考える方が効果的である。
基本設計の段階で実装難易度は見えてくるはずなので、難易度が高い部分を洗い出し、共通処理化などに時間を割いた方が良い。

##「良いコード書くきっかけを与えたい」の記事について
どういう実装をするべきかを考える点では使用できるが、あくまで各プログラマにきっかけを与えるにとどめる。
私の場合、どちらかと言えばコメントいただく内容の方が記事の趣旨からずれるとしても重要だったりする。そういう意味で、自分のコードを見直すきっかけになっている。
Macでカタカナを入力モードの選択肢から消す方法

久しぶりに設定するのに、ググってもすぐ出てこなかったので。

システム環境設定=>キーボード=>入力ソース=>入力モードのカタカナのチェックを外す

<img width="660" alt="kill-katakana.png" src="https://qiita-image-store.s3.amazonaws.com/0/153437/0b5efb39-69cf-b77b-70bb-9afb7e941878.png">
EGitが使いづらい3つの理由

Eclipse Git(以下、EGit)はEclipse上から使うことができるGitプラグインです。
しかし、正直言って使いづらいです。
私は(Windowsなので)TortoiseGitを使っています。
SorceTreeも使ってみたんですが、Windowsだと右クリックメニューからいろいろ操作できるTortoiseGitのほうが使いやすいです。
TortoiseGitは置いといて、今回はEGitがなぜ使いづらいのかについて考えてみました。
あくまで主観なので、EGitを使いこなせている人にとっては使いづらい点ではないかもしれません。
現状のEGitについてですので今後のアップデートで改善されていくかもしれません。
というか、Eclipse上からGit使えるのは楽なので改善してほしい・・・。


# hookがうまく動かない
gitでは、hookという機能があります。
これは、gitのイベント(コミット、プッシュなど)と連動して各種コマンド(gitコマンドではなくOSのコマンド)を実行させることができる機能です。
.git/hooksの中にコマンドを記述したファイルを配置することで、各種イベント発生時にコマンドが実行されます。
これを使うことで、例えばコミットのタイミングでJenkinsを実行して自動テストを走らせる、などのことができます。

しかし、EGitではファイルを配置しても実行されないものがあります(ちゃんと動くものもあるようです)。
EGitは独自にGitの各処理を実装してるっぽいので、hookの実装は今後の更新待ちって感じかと思います。

# コマンドがわかりづらい
コマンドがいまいち元々のGit用語やコマンドと合っていなかったり、変なところにあったりしてわかりづらいです。

例えば、フェッチ/プッシュはEGitでは「アップストリームにフェッチ/プッシュ」という名前になっています。

![image](https://qiita-image-store.s3.amazonaws.com/0/115996/31ce164a-0fa6-65e0-17bc-a3f55aad1c63.png)

確かに各ブランチの上流ブランチをアップストリームと呼ぶので間違ってはないです。
でも「リモートにフェッチ/プッシュ」や単に「フェッチ/プッシュ」だけの方が分かり易いなあと思います。

あとは、「変更前に戻す」というコマンドが「チーム」ではなく「置換」の中のコマンドで行います。

![image](https://qiita-image-store.s3.amazonaws.com/0/115996/da3dca27-81dc-9ca0-a3fc-37d1c2e206f9.png)

Git関連のコマンドはできるだけまとめてほしいので、「チーム」のところに一緒に入っていてくれたほうが分かり易いなあ。

# マージツールが使いづらい
EGitのマージツールはこんな感じです。

![image](https://qiita-image-store.s3.amazonaws.com/0/115996/c2cf9b60-e652-0786-29fc-3cf2e183734c.png)

左側がローカル、右側が(競合した)リモートの内容です。
基本手には、右側から適用したい部分を選択して左側に持ってくる、すなわちローカルを書き換えることで最終的なファイルにしていきます。

一方、TortoiseGitのマージツールはこんな感じ。

![image](https://qiita-image-store.s3.amazonaws.com/0/115996/ac56d942-0229-aa2e-979e-ce88e3876cea.png)

両方の元の内容を表示した上でそれぞれどちらの差分を使うかどうか決めていくことができます。
これに関してはどっちが使いやすいかは人によるかと。

# まとめ
EGitが使いづらい点をまとめてみました。
既にEGitになれている人ならともかく、今から使い始めようとしている人ならTortoiseGitをお勧めします。
まあ、GUI使ってると対応するコマンドがないときも多いので、いざというときにはコマンドを使えるようになっておくのも大事ですね。
Bluemix IBMコンテナ ibmnodeが起動しない件

次の図にあるIBM Bluemix コンテナーの中で、ibmnode を作成しても起動しません。なぜなら、このibmnode イメージは、テンプレートにするために作られたイメージなので、単独で起動するように作られていないからです。

![スクリーンショット 2017-02-05 13.37.54.png](https://qiita-image-store.s3.amazonaws.com/0/42829/b2f399b9-8920-63e3-e4a3-cfccc96e0fee.png)

このibmnodeをテンプレートとして、Dockerイメージを作成する方法は、[IBM Containers のリポジトリにイメージを登録する](http://qiita.com/MahoTakara/items/bc8a7c18110fb0999634) に手順を作成しました。
YUM WHATPROVIDESのすすめ

# Yum whatprovidesの紹介
yumで特定のパッケージを検索するとき、yum searchやyum listは有名ですが、yum whatprovidesというコマンドもあります。

例えばlibyamlを検索するとき、それぞれこんな感じで実行できます。

```
yum search libyaml

yum list libyaml

yum whatprovides libyaml
```

**yum search libyaml**
![2017-02-05_yum1.png](https://qiita-image-store.s3.amazonaws.com/0/55384/36c85d35-ed3c-c15a-9531-bc54b7dfeb72.png)

**yum list libyaml**
![2017-02-05_yum2.png](https://qiita-image-store.s3.amazonaws.com/0/55384/c9840541-7895-f1b3-3808-d554f3e5b869.png)


**yum whatprovides libyaml**
![2017-02-05_yum3.png](https://qiita-image-store.s3.amazonaws.com/0/55384/c11f8fe7-7cce-b681-9456-f726a7c93225.png)


更にyum whatprovidesはファイルがどのパッケージからインストールされるのかを検索することも可能です。


```
yum whatprovides '*lib64/libyaml-0.so.2'
```

![2017-02-05_yum4.png](https://qiita-image-store.s3.amazonaws.com/0/55384/f2639344-cabd-3c80-ff68-eab8f8896413.png)


CentOS・RHELでyumでの構築時に依存パッケージをみつからなくて困ったとき、yum whatprovidesはとても重宝します。


参考URL：
http://yum.baseurl.org/wiki/YumCommands
[Ruby]配列をマージ・結合する

## 配列を結合する（`+`, `concat`）
```irb
>> a = ["ruby", "paython", "perl"]
=> ["ruby", "paython", "perl"]
>> b = ["paython", "perl", "php"]
=> ["paython", "perl", "php"]
>> a + b
=> ["ruby", "paython", "perl", "paython", "perl", "php"]
>> a.concat(b)
=> ["ruby", "paython", "perl", "paython", "perl", "php"]
```

## 配列をマージする（`|`, `uniq`）
`|`を使う。

```irb
>> a = ["ruby", "paython", "perl"]
=> ["ruby", "paython", "perl"]
>> b = ["paython", "perl", "php"]
=> ["paython", "perl", "php"]
>> a | b
=> ["ruby", "paython", "perl", "php"]
```
uniqメソッドを使ってもできる。

```irb
>> a = ["ruby", "paython", "perl"]
=> ["ruby", "paython", "perl"]
>> b = ["paython", "perl", "php"]
=> ["paython", "perl", "php"]
>> (a + b).uniq
=> ["ruby", "paython", "perl", "php"]
```

`|`を使った書き方のほうが良さそうです。
オフラインリアルタイムどう書く E11 の ruby と python による実装例

問題 : http://nabetani.sakura.ne.jp/hena/orde11tredis/
実装リンク集 : http://qiita.com/Nabetani/items/10b2ccc28301e44e09e6


まずはrubyの実装。


```ruby
def each_item(n, list)
  yield( list )
  (2..(n/2)).each do |x|
    next unless n % x==0
    each_item( x+1, list+[x+1] ){ |y| yield(y) }
  end
end

def dist(a,b)
  a.size+b.size - 2*(0..Float::INFINITY).find{ |x| a[x] != b[x] }
end

def impl( root, a, b )
  as=[]
  bs=[]
  each_item(root,[root]){ |x|
    as<<x if x.last==a
    bs<<x if x.last==b
  }
  as.inject(Float::INFINITY) do |d0, ai|
    bs.inject(d0) do |d1, bi|
      d1=[d1, dist(ai,bi)].min
    end
  end
end

def solve( src )
  impl( *src.split(/\D+/).map(&:to_i) ).to_s
end

DATA.map{ |line|
  num, src, expected = line.split( /\s+/ )
  actual = solve( src )
  ok = actual==expected
  puts [ num, ( ok ? "ok" : "**NG**" ), src, actual, expected ].join( " " )
  ok
}.all?.tap{ |x| p( x ? "all okay!" : "something wrong!!" ) }

__END__
0 50:6,3  1
1 98:5,11 4
2 1000:33,20  7
```

約数の求め方は、手抜きで O(n)。

* ツリーを辿りながら、気になるノードからルートまでのパスを記録する。
* 記録したパスを比較すると距離がわかる

という作戦。距離は、ルートから自分までのリストを比較するとわかる。

`each_item` の周辺がなんとなく気に入らないんだけど、まあ仕方ない。
まだ `yield` というかブロック引数のメソッドを自分で定義することに慣れていない。

で。
これを python に移植したのが下記：

```python3
import re

def each_item(n,list) :
  yield( list )
  for x in range( 2, n//2+1 ) :
    if n % x == 0 :
      for item in each_item( x+1, list + [x+1] ):
        yield(item)

def dist(a,b):
  n=0
  while n<len(a) and n<len(b) and a[n]==b[n]:
    n+=1
  return len(a) + len(b) - 2*n


def impl( root, a, b ) :
  a_s=[]
  b_s=[]
  for item in each_item(root, [root]) :
    if item[-1]==a:
      a_s.append( item )
    if item[-1]==b:
      b_s.append( item )
  d=1e100
  for a in a_s:
    for b in b_s:
      d = min( d, dist(a,b) )
  return d

def solve( src ):
  root, a, b = [ int(x) for x in re.split( "\\D", src ) ]
  return "%d" % ( impl( root, a, b ) )

def test( src, expected ):
  actual = solve( src )
  ok= ( actual==expected )
  print( "%s : %s -> %s ( %s )" % ( ("ok" if ok else "**NG**"), src, actual, expected ) )

test( "50:6,3", "1" )
test( "98:5,11", "4" )
test( "1000:33,20", "7" )
```

生まれて初めて python の yield を使っていろいろ戸惑ったんだけど、同じ感じになった。
仕事の進め方についての個人的まとめ

#この記事を書いた理由#
ITとはちょっと外れてしまいますが、自分の仕事のやり方を固めていくために教えられたこと、考えたことを記載していきます。

#仕事の段取り#

絵と手順書と表で仕事を掴んでいきます。
<font color="Red">まとまったら、メールで送って、自分の言葉で上司に説明してみよう!
自分がどこまで分かっていて、どこが分かっていないのか分かれば後は分からないとこを聞くだけ。
これでもう仕事の半分は終わりです。
これが出来ていないまま、作業を進めると立往生して、上司から激怒されるぞ!</font>
ここまでやらないと、あるいはやらなくても何を自分がやるか具体的にを理解してないと仕事は出来ない!

仕事の流れ

|流れ| 事項       |       説明|
|:-----------------|:-----------------|:------------------|
|↓|目的・概要のヒアリング|目的・概要・背景が分からないと、実施することも分からないため|
|↓|概要イメージ図の書き起こし|背景・目的・概要を実施することがずれていないかまっさきに図解して確認|
|↓|QA表作成|疑問点があったら、書き込み|
|↓|納期のヒアリング|いつまでに終わらせればいいか|
|↓|相談先のヒアリング|問題や詰まったら、誰に相談するか|
|↓|用語の調査|ヒアリング、資料調査||
|↓|仕様調査|ソース、DBレイアウト、仕様書を基に処理の流れを調査||
|↓|仕様イメージ図の詳細化|仕様調査をもとにして、処理の流れを詳細に図示する||
|↓|作業イメージ図の書き起こし|概要イメージ図・仕様イメージ図から考える。||
|↓|TODOリスト|具体的な手順のこと。作業イメージ図から考える。<font color="Red">まず、大まかに考え、細分化していく。なぜなぜで自分が分かるとこまで掘り下げる。<br>開発環境と公開環境で作業を行う場合、基本的に作業手順を同じにすること。環境ごとに違う作業手順の場合、一発勝負になり、リスクが上がる</font>|
|↓|インプット・アウトプットの整理|要るものを図に起こして、上司に確認を取る|
|↓|チェックリスト(観点)の整理|作業がきちんと終わっているかを確認する表のこと。<br>データ変更:確認箇所>全体と任意の一つを確認。確認点>変更箇所が変わっていること。変更していない箇所が変わっていないこと|
|↓|リカバリー方法の考案|データの場合、戻せることが第一。なにはともあれ、バックアップ|
|↓|工数|それぞれのTODOに時間を振って行く。<font color="Red">工数を出すためには初回作業が必要</font>|
|↓|WBSの作成|工数をスケジュールに割り振る|
|↓|作業|手順に無い問題、詰まったら上司に伺う。QA表に記載|
|↓|チェック/テスト|チェックリストに基づき、作業がきちんと終わっているかを確認する|
|↓|中間レビュー|ある程度形になったら、見てもらう。早ければ早いほどよい。|
|↓|反映|早ければ早いほどよい。|
|↓|提出|-|

あると便利なもの

| 事項       |       説明|
|:-----------------|:------------------|
|問い合わせ表|1箇所にまとめておけば便利|
|工数表|工数を出すのを短縮できる|
|問題対応表|問題が起こったときの対処法を記録するもの。次回、問題が起こっても安心|
|QA表|上司への質問表|

#理解切り分け表#

どこまで分かっているの?と聞かれる前にセルフチェックしてみよう!

| 事項       |       説明|
|:-----------------|:------------------|
|目的・概要・背景|ゴールが分からないと間違った方向に行ったり、余計なことをしてしまう|
|概要イメージ図|目的が分かっていても、なにが欲しいのか考えつかない状態|
|仕様イメージ図|該当の仕様を把握しておかなければ、質問に答えられない|
|作業イメージ図|どうやって実現するか分からない状態|
|大まかなTODO|分からなければ、作業イメージ図から分かっていないことになる。イメージ図を実現させるためになぜなぜで考えよう|
|具体的なタスク|自分でできるタスクに落とせていない。あるいは思いつかない状態。思い切って助けを求めよう|
|チェックリスト|作業後になにをチェックすれば分かっていないということは、<br>何を自分がしようとしているかつかめていない状態。思い切って助けを求めよう|

詰まるようなら、何が問題なのか


| 現象       |       原因 |    対応策    |
|:-----------------|:------------------|:------------------|
|思ったより時間がかかる|時間がかかった部分をメモしておき、再度見積もる|
| 具体的な手順に落とし込めない|実は何も分かっていない |やり方を聞く|
| 成果物のイメージができない  |実は何も分かっていない |何が要るかを聞く       |
| ずれたことをしてしまう  |自分が分かるところまで聞けていない。分からないところをなんとなくやっている。 |分かるまで聞く。分からなかったら聞く。中間レビューを挟む       |
| どれくらいで終わるか答えられない|細分化したタスクの時間を積み上げていない |タスクを積み上げた時間を答える       |
|口頭指示をうまくこなせない|作業指示に漏れがあり、認識違いがある|緊急の場合以外は、事後確認点までをエクセルシートに書き出して、作業許可を貰う|
|どこまで分かっているか分からない|どこまで分かっているかを切り分けできていない|理解切り分け表を使ってみる|
|自分がどこまで進めているか進捗が分からない|TODOリスト、工数が出せていない|TODOリスト、工数を出す|
|品質が悪い|自己流でやっている|確立された方法、教えられたことを忠実に実行する。言われたことを最低限こなす|

##参考##
[職場での知恵と工夫](http://www.nhk.or.jp/heart-net/hattatsu-otona/survive/device.html)
Azure CLIインストール＆ログイン（Windows版）

# Azure CLI インストール
１．まずは、自分のWindows端末にAzure CLIのツールをインストールしましょう。
http://aka.ms/webpi-azure-cli

２．ダウンロードしたmsiファイルを実行します。
３．内容に同意したら、最後Finishして完了です。

# ログイン確認（対話式）
４－１－１．コマンドプロンプト、もしくはPower Shellを起動して、次のコマンドを実行してみましょう。
` > azure login`
※ 9桁のパスコードが表示されます。
※ Azure CLIを初めて利用する時、英語で使用状況についての情報収集をしてよいか確認するメッセージが表示されます。 参加は任意らしいです。 
４－１－２．ブラウザでhttps://aka.ms/devicelogin にアクセスして、表示されたパスコードを入力するとログイン成功です。（途中MSアカウントの選択もあります。まだMSアカウントを作成していない人は、アカウントを取得してください）
![AzureCLI01.png](https://qiita-image-store.s3.amazonaws.com/0/109620/aa782b8c-5414-6598-43d6-dac42b99c53a.png)

# ログイン確認（やや対話式）
４－２－１．コマンドプロンプト、もしくはPower Shellを起動して、次のコマンドを実行してみましょう。
`> azure login -u <MSアカウントのアドレス>`
４－２－２．入力後、パスワードを求められます。
`password:`
５．ログインに成功すると以下の文字が表示されます。

```
+
info:    login command OK
```

# サブスクリプション情報の確認
次のコマンドを叩くことで、アカウントに紐付くサブスクリプション情報を確認することが出来ます。
`> azure account list`

# 既定のサブスクリプションを変更
サブスクリプション情報を確認すると、current 列がtrue になっているものが既定のサブスクリプションとなっています。変更してみましょう。
`> azure account set <サブスクリプションName> or <サブスクリプションID>`
Kinect v2でモーションキャプチャしfbxファイルにする

#やったこと
Kinectv2を使ってモーションキャプチャをし，Unityちゃんを動かすまで．
Unityのアセットストアで公開されている有償アセットを使用します．

#使用した環境
- windows 10 Pro
- CPU それなりのクアッドコア
- GPU ありきたりなグラフィックカード
- Unity 5.5.1
- Kinect v2 (Kinect SDK v2)

#下準備
KinectはPCで認識された状態にする．
（下の画像のような状態だとOK）

![qii01.PNG](https://qiita-image-store.s3.amazonaws.com/0/161850/ff2e4a46-4290-84b7-73f3-225b210a9d6b.png)

以下のURLにアクセスしアセットを購入＆ダウンロードする．
https://www.assetstore.unity3d.com/jp/#!/content/51090

ダウンロードが終わったら，Unityの3Dプロジェクトにインポートする．
![qii02.PNG](https://qiita-image-store.s3.amazonaws.com/0/161850/42b06228-6e5d-946d-436a-619417db32d8.png)
(右下のImportを押せばOK)

#モーションキャプチャ

インポートが終わるとプロジェクトのアセットフォルダにいくつかファイルが読み込まれる．ここのKinectMocapFbx->MocapFbxAnimatorシーンを選択する．
![qii03.PNG](https://qiita-image-store.s3.amazonaws.com/0/161850/52f9ca46-69c0-9f71-2910-8b3fd6e3a129.png)

シーンが読み込まれたら，KinectがPCで認識されていることを確認しシーンを再生する．

![qii04.PNG](https://qiita-image-store.s3.amazonaws.com/0/161850/18d7015f-5ab1-c534-ae56-87dcd199771c.png)

ここでKinectの前に立つと，そのボーン情報が左のアバターに反映される．モーションキャプチャを開始したいときはスペースキーを押す．Kinectの音声認識が使える環境なら「Record」と発言しても開始できるらしい（未検証）．

同様に，モーションキャプチャを止める時もスペースキーを押す．

記録されたアニメーションはKinectMocapFbx->Models->UChar1.fbxに保存されている．もう1度モーションキャプチャをすると，このfbxファイルにアニメーションが上書きされるので注意．

![qii05.PNG](https://qiita-image-store.s3.amazonaws.com/0/161850/8b9f9cf1-22da-ba5c-ff0b-5894c3de0b84.png)

#実際にほかのモデルでアニメーションを動かす
とりあえずUnityちゃんを動かしてみよう．適当にUnityちゃんのAssetをインポートする．

先ほどのUChar1のRigはGenericでUnityちゃんのRigはHumanoidなので，UChar1のRigをHumanoidに変更する．変更した後はApplyを押す必要がある．

![qii06.PNG](https://qiita-image-store.s3.amazonaws.com/0/161850/04a39d50-13d9-fdf1-6bc5-2958a190dfa7.png)

アニメーションのファイルはfbxの中に格納されているので，取り出す必要がある．UChar1.fbxの中のKinectMocap.animが記録したアニメーションファイルに該当する．KinectMocapを選択して Ctl(Command) + D でアニメーションファイルをfbxから取り出すことができる．

![qii07.PNG](https://qiita-image-store.s3.amazonaws.com/0/161850/042b577d-5e97-c337-4382-4cae237f036e.png)

取り出したアニメーションファイルをhierarchyのunitychanにドラッグアンドドロップする．すると，Animatorが自動生成され，下の画像のような状態になる．

![qii08.PNG](https://qiita-image-store.s3.amazonaws.com/0/161850/12544917-167a-173d-2cda-b88a0a4155ea.png)

これでシーンを再生すると先ほど記録したアニメーションが再生される．

![qii09.PNG](https://qiita-image-store.s3.amazonaws.com/0/161850/b108e5c5-3f1e-9298-af51-7ae73a0df5b1.png)

#まとめ
Kinect v2でモーションキャプチャをしたいという気持ちでアセットストアを眺めていたら良いのを見つけた．価格は$10と既存のKinectモーションキャプチャよりもかなり安く，おススメできる．

このコンテンツは，[ユニティちゃんライセンス条項](http://unity-chan.com/contents/license_jp/) のもとに提供されています．

![imageLicenseLogo.png](https://qiita-image-store.s3.amazonaws.com/0/161850/82a497dd-2e9a-acac-4a16-e175169630e7.png)
PHP バージョンのシェア率

PHP のバージョンのシェアについて調べた。[^w3techs]

[^w3techs]: [Usage Statistics and Market Share of PHP for Websites, February 2017](https://w3techs.com/technologies/details/pl-php/all/all)

シェアの順番は 5.3 (24%), 5.4 (24%), 5.6 (21%), 5.5 (18%), 5.2 (9%), 7.0 (3%) となっている。

![PHPバージョンのシェア](https://qiita-image-store.s3.amazonaws.com/0/15175/096d23af-24c9-96fb-4e57-91963892a8ec.png)

バージョン|シェア
:-:|--:
PHP 7.1|0.10%
**PHP 7.0**|**2.70%**
**PHP 5.6**|**20.97%**
**PHP 5.5**|**17.60%**
**PHP 5.4**|**23.86%**
**PHP 5.3**|**24.05%**
**PHP 5.2**|**9.04%**
PHP 5.1|0.58%
PHP 5.0|0.10%以下
PHP 4.4|0.78%
PHP 4.3|0.20%
PHP 4.2|0.01%
PHP 4.0|0.003%
PHP 3.x|0.1%以下



メジャーバージョンごとのシェアだったのでマイナーバージョンごとになるように計算したが、だらだら手動計算したので間違ってたらすまん。
fuse: bad mount point が発生した時の対処

sshfsでリモートのディレクトリをローカルにマウントしてIDEを利用しています。
fuse: bad mount point が発生したのでその時の対処を記録しておきます。
すでに対応方法の説明をされている方がおられたのでそちらを参考にしました。
参考）[fuse: bad mount pointが起きたときは](http://hideack.hatenablog.com/entry/2012/09/29/101926)

#発生時
sshfsでリモートのディレクトリをローカルにマウントしようとして以下のコマンドを実行しました。
>$ sshfs kuser@192.168.56.2:/var/www/html/ ./mountdir
>fuse: bad mount point `./mountdir': Input/output error

マウントできずにエラーが発生。

#対応
まず状況を確認。
>$ ps uax | grep sshfs
>  1931   0.0  0.0  2668556    648   ??  Ss   金01PM   0:21.35 sshfs kuser@192.168.56.2:/var/www/html/ ./mountdir
>  7227   0.0  0.0  2434852    812 s000  S+   12:20PM   0:00.00 grep sshfs

プロセスを殺す。
>$ kill -9 1931


ひとまずこれで再マウントできるようになりました。
もし、この方法の問題点やより良い方法をご存知の方がいらっしゃいましたらご意見いただければと思います。

**追記**

上記の操作を行った後に
>$ sshfs kuser@192.168.56.2:/var/www/html/ ./mountdir
>mount_osxfusefs: mount point /Users/kuser/mountdir is itself on a OSXFUSE volume

となっていつまでも上手くマウントできなくなってしまうことがあったので、このときの対処法について

まずアンマウントできるかどうか
>$ umount mountdir
umount(/Users/kuser/mountdir): Resource busy -- try 'diskutil unmount'

ダメだったときに説明の通り実行

>$ diskutil umount mountdir
Unmount failed for mountdir

やはりダメだったときに強制的にアンマウント

>$ umount -f mountdir
>$ sshfs kuser@192.168.56.2:/var/www/html/ ./mountdir
kuser@192.168.56.2's password: 

上手くいきました。
Amazon Alexa 事始め



はじめに
---

2016年の年末あたりからAmazon Alexaの記事をよく見かける気がします。Amazon Echoが人気だったり、所謂、各種IoTに実装されてスマートホームのハブになるんじゃないかと言われています。

各種IoTに実装されれば、ハードウェアの部分は各社が実装してくれるわけです。ソフトウェアからリアル世界の何かを操作できると楽しいだろうっということで最近諸々調査しているのでまとめていきたいと思います。

Amazon Alexaとは
----

ざっくり言うと多分こういう事だと思います。

音声で指示 => Alaxaで解析してテキストに変換 => 処理 => 音声等で回答

iPhoneにあるSiriをイメージしてもらえると分かりやすいと思います。
Amazonは「音声入力は第三の入力デバイスだ！（キーボード => タップ（スマートフォン） => 音声）」っと言っています。

Alaxaで遊ぶには
---

残念ながらAmazon Echoは日本ではまだ販売されていません。そして、日本語での音声入力にも未対応です。
でもカタコトの英語とWebサービスまたはiPhoneのアプリがあれば遊ぶことはできそうです。

Alexa Skill Testing Tool - Echosim.io（Web）
https://echosim.io/

Ally - for Alaxa Voice Sevices（iOSアプリ）
https://itunes.apple.com/jp/app/ally-for-alexa-voice-services/id1195730692?mt=8

Adtra = for Alexa Voice Services（iOSアプリ）
https://itunes.apple.com/jp/app/astra-for-alexa-voice-services/id1173026689?mt=8

アプリを入れてAmazonにログインするとAlaxaが体験できます。
「What's time?」とか「What's today's data?」と聞いてみると時間や日付を返答してくれます。

まとめ
-----

これで基本のAlexa機能は試せそうです。
Amazon.comのアカウントしか試せないっという記事を見かけましたが、2016年2月時点で、日本のAmazonアカウントでも試せている気がします。
そして、承認したアプリの解除方法が分からないです。。。ご存じの方教えてください。

参考
---
Amazon Alexaの基礎知識 ｜ Developers.IO
http://dev.classmethod.jp/cloud/aws/amazon-alexa-basic-knowledge/

AWS Lambdaを使ってAmazon Echoに機能追加してみた ｜ Developers.IO
http://dev.classmethod.jp/etc/alexa-skill-with-lambda-sample/

Amazon Echo (Alexa)の設定方法&管理画面をおさらいする #reinvent ｜ Developers.IO
http://dev.classmethod.jp/cloud/aws/introduction-to-amazon-echo-alexa/

iPhoneでAmazon Alexaを簡単体験！「Astra」を使ってみよう ｜ Developers.IO http://dev.classmethod.jp/cloud/aws/amazon-alexa-using-astra/
Data.IniをつかってINIファイルを読み書き

Data.Iniを使ってINIファイルを読み書きするサンプルプログラムを書きました。Haskellを始めたばかりです。

https://github.com/ghbae/ini

・なんだか手間のかかったコードになっている
・INIファイル内の余計なものは捨て去る

ということで、ほとんど使い物にはならないです。
Data.Iniを利用する場合の参考程度でしょうか...