OmniAICreator/Qiita-1.07M huggingface dataset:
feedparserのエラーハンドリング周り

# TL;DR

* `feedparser.parse()`の結果は返り値の`bozo`を見るのが一番手っ取り早い。0の時だけパース成功
* パース成功してなければ`bozo_execption`を見ておけば良い

# 動機

```pycon
>>> import feedparser
>>> 
>>> resp1 = feedparser.parse('http://qiita.com/tags/python/feed')
>>> type(resp1)
<class 'feedparser.FeedParserDict'>
>>> 
>>> resp2 = feedparser.parse('http://qiita.com/tags/python1/feed')
>>> type(resp2)
<class 'feedparser.FeedParserDict'>
```

`feedparser.parse()`は、指定したURLがなんであれ`feedparser.FeedParserDict`を返します。
それだとちょっと不便なので、ちょっとこの中身を少しみてみることにしました。

# 調べてみるもの

## 変数情報

| 変数名 | URL |    |
|:-----:|:----|:---|
| resp1 | http://qiita.com/tags/python/feed  | 普通のRSSフィード |
| resp2 | http://qiitta.com/tags/python      | RSSフィードではない |
| resp3 | http://qiita.com/tags/python1/feed | 200以外のステータスコード |
| resp4 | http://qiitta.com/tags/python/feed | 存在しないドメイン |

## 対象

* FeedParserDictのキー
    * 共通するキーは何か？


# 調べてみる

## キーを調べる

```pycon
>>> resp1.keys()
dict_keys(['bozo', 'encoding', 'status', 'etag', 'href', 'entries', 'version', 'namespaces', 'feed', 'headers'])
>>> 
>>> resp2.keys()
dict_keys(['bozo', 'encoding', 'status', 'bozo_exception', 'etag', 'href', 'entries', 'version', 'namespaces', 'feed', 'headers'])
>>> 
>>> resp3.keys()
dict_keys(['bozo', 'encoding', 'bozo_exception', 'status', 'href', 'entries', 'version', 'namespaces', 'feed', 'headers'])
>>> 
>>> resp4.keys()
dict_keys(['bozo', 'entries', 'feed', 'bozo_exception'])
>>> 
```

思いのほか、保持しているキーがバラバラです。`bozo`, `entries`のみが共通しています。

### 共通しているキーの中身

```pycon
>>> resp1.bozo
0
>>> resp1.entries
[{'summary': '<p>第８章ではグラフィカルモデルについて説明されています。グラフィカルモデルとは、確率変数やモデルのパラメータなどの関係を図式的に表現する方法です
# 略
}]
>>> 
>>> resp2.bozo
1
>>> resp2.version
''
>>> resp2.entries
[]
>>>
>>> resp3.bozo
1
>>> resp3.version
''
>>> resp3.entries
[]
>>>
>>> resp4.bozo
1
>>> resp4.entries
[]
>>>
```

この時点で、**`bozo`が0の時のみ、RSSフィードとしてパースに成功した**とみることができます。

本来の主目的だけ見ればこれでほぼほぼ完了なのですが、もうちょっと掘り下げます。


## パース失敗勢の構造を見る

パースに成功している結果については何も考えずに`entries`いじってればいいので、ここから先はパース失敗のエラーハンドリングを目的に、どんな情報が取れるかを見にいこうと思います。

### bozo_exception の存在

resp1,resp2を比較すると、どちらもリクエストに成功はしているからか、`status`や`headers`などのHTTPっぽいキーが見て取れます。
そんな中、resp2のみに存在するキーがありました。それが`bozo_exception`です。

```pycon
>>> resp2.bozo_exception
SAXParseException('undefined entity',)
```

そのまんまなメッセージが入っていました。これを見れば概ね問題なさそうです。

```pycon:resp3,resp4
>>> resp3.bozo_exception
NonXMLContentType('text/html; charset=utf-8 is not an XML media type',)
>>>
>>> resp4.bozo_exception
URLError(gaierror(8, 'nodename nor servname provided, or not known'),)
>>>
```

他のrespも見るとこんな感じ。中の文字列だけ出すのが面倒なのが欠点。
あと、`resp3`は`404 Not Found`にも関わらず、パースしようとしているので、statusもあるなら合わせて見るのがよさげです。
ETロボコンプロジェクトを円滑にすすめるために②

# あらすじ

[ETロボコンプロジェクトを円滑にすすめるために①][]を読め

[ETロボコンプロジェクトを円滑にすすめるために①]: http://qiita.com/erutaso/items/323ca6f89c97b161d83d

# 地区大会をどのように迎えるのか

地区大会までにやるべきことは単純である。

* 競技規約を満たすシステムを作る
* それの説明をA3サイズ5枚の資料にまとめる
* 当日遅刻しないように前日は早く寝る

以上。これ以外にやることはない。
しかし、多くのチームが途中で道を逸れてしまいやるべきことが出来ていない。

なぜだろうか？
本記事ではプロジェクトの計画と遂行の方法について説明しようと思う。

# すべてのプロジェクトには明確なゴールが必要である

前記事では、情報収集をする必要性を説いた。
しかし、それだけではプロジェクトを進めてはいけない。
プロジェクトの達成基準（＝ゴール）をチームで合意しなければならないのだ。

長く過酷な道のりを楽にするための情報が揃っても、どこに向かっていけば良いのかがわからなければ宝の持ち腐れだ。

情報を無駄なく活用するためのポイントを明確にするため、ゴールを定めよう。
プロジェクトの計画段階に使う手法の中で、比較的簡単に使えるODSCという手法を紹介しよう。

# 目的・成果物・達成基準がすべての鍵

プロジェクトの目的・成果物・達成基準が曖昧だと、収集した情報をいつ使えばよいのかわからなくなる。
そこで、チームメンバ全員で模造紙の前に集まり、以下の項目を決定しよう。

* 目的（Objectives）

何のためにETロボコンに参加するのかという目的を挙げよう。
モデルベース開発を経験するため、プロジェクトマネジメントの経験をするためでもいい。
就職活動のため、社内表彰されるためでもいい。

利己的であれなんであれ、「これだけは譲れない」というこだわりを挙げるといいだろう。
それがあなたの原動力となる。

* 成果物（Deliverables）

目的の果てに生まれるものはなんだろう？
ETロボコンにおいては、モデル、ソースコードが主だが、ここは目的によって増減する。
就職活動のためなら内定だし、社内表彰のためなら社長賞などが考えられる。

または、エンジニアとして成長した自分でもいいしモデルベース開発の経験なんかもいいだろう。
この場においての成果物とは、目に見えなくてもいいが確かに存在するものを挙げていこう。
この成果物無くして目的を達成したとは言えないものを考えよう。

* 達成基準（Success Criteria）

ここで必要なのは達成できたかできていないかという定量的かつ明確な線引である。
○×△という中途半端な評価ではダメだ。○か×しかない基準を挙げよう。
しかし、だからといって厳しいものでなくてもいい。むしろ、ここは和気あいあいと挙げていく必要がある。

ETロボコンにおいては、モデルを5枚書き上げる、地区大会までにメンバが欠けないなどがあるだろう。
しかし、実行委員を唸らせる、上司に褒められる、教授に差し入れをもらうなど、あなたが面白いと思うものでも良い。

要は、目的を達成するためのチェックポイントの位置づけで活用して欲しい。

# ODSCが決まったら行動を決めよう

チームの目的が決まり、なんだか楽しくなってきてもまだ待って欲しい。
目的と達成基準、今まで集めた情報を使ってクリティカルパスを図化してもらいたい。

例えば、目的が就職活動のためで、成果物を内定、達成基準を企業の採用担当の目にとまることだとしよう。
だとすると、どのような行動を取らなければならないか？

全300チームを超える中で「うちの会社に来てもらいたい！」と思わせるにはどうすればよいか？
あの会社は何を生業としているのか？求めている人材像は？
まずは声をかけるべきだろうか？模擬レースなんか企画したら食いつくのではないか？

ここで事前に調査した情報が役に立ち、行動を決めることができる。
例として就職活動をあげたが、これは他のOSDCについても同様である。

目的達成のためのクリティカルなパスを洗い出すことで、スケジュールを立てることができる。
そのスケジュールで期日までに成果物をアウトプット出来ない場合、不明瞭な部分があるということだ。
それは継続して情報収集を行い、やるべきことを煮詰めていく必要がある。

目的・成果物・達成基準を決め、行動と情報の活用ポイントを明確にする。
これさえ決まれば、途中で障害が起きても別の手段が思いつくだろう。

あとは走り始めるだけだ。

# とは言っても見直しは必要

計画は唯一絶対の解ではない。
継続的な見直しが必要になる。

有名なもので言えばWBS、カンバンなどがある。
当初立てたスケジュールに対して現状はどうなっているかを定期的に見直さなければ、気がつけば断崖絶壁にたたされていることもある。
頻度は週に一回、朝の10分ほどでいい。それを継続するだけでプロジェクトは驚くほどまっすぐ進むだろう。

WBS、カンバンについてはGoogleで検索すると山の方に情報が出てくるため、本記事では割愛する。

# 最後に

本記事は、ETロボコンの地区大会までのマネジメントについて説明した。
計画についてが主だったが、これをやるだけでやらなくていい作業、やらなければならない作業が明確となる。
毎週朝の10分でTODO DOING DONEを共有するだけで、作業の進捗具合が露わになるだろう。

言葉にすると単純ではあるが簡単ではない。
しかし、ぜひ実践してみて欲しい。驚きと発見があなたを待っているだろう。

もちろん、継続して他チームとのコンタクトやメーリングリストの活用は行って欲しい。

次の記事では、チャンピオンシップ大会までにやることについて説明しよう。
コレクションをキーにして、別のコレクションから要素を取り出す方法

初投稿です。

練習兼自分用のメモとして書いていきます。

内容はコレクションをキーにして、別のコレクションから要素を取り出すだけです。

---

下記のコレクションを用意しました。
keyListを検索キーとして、listから要素の取り出しを試みます。
結果はresultに格納します。

            //検索対象コレクション
            List<string> list = new List<string>();

            list.Add("kinoko");
            list.Add("shimeji");
            list.Add("takenoko");
            list.Add("nameko");
            list.Add("eringi");

            //検索キーコレクション
            List<string> keyList = new List<string>();

            keyList.Add("shimeji");
            keyList.Add("eringi");

            //検索結果格納用コレクション
            List<string> result = new List<string>();



①多重ループで取り出す

とにかく簡単にやるなら。


            List<string> result = new List<string>();

            foreach(string line in list)
            {
                foreach(string key in keyList)
                {
                    if(line == key)
                    {
                        result.Add(line);
                    }
                }
            }

②LINQで取り出す

シンプルに書けます。後から見やすいのもGood。

            result = list.Where(x => keyList.Contains(x)).ToList();

基本的に②の方法を使って、うまくいかない場合は①を使う、でいいのではないでしょうか。

---

おまけ①不一致の要素を取り出す

検索キーにヒットしない要素を取り出すには、Exceptメソッドを使用します。

            result = list.Except<string>(keyList.AsEnumerable<string>()).ToList();


---
おまけ②コレクションを要素として持つコレクションを検索対象にする。

コレクションを要素として持つコレクションから要素を取り出すには、SelectManyを使用します。

            List<string> child1 = new List<string>();

            child1.Add("kinoko");
            child1.Add("shimeji");
            child1.Add("takenoko");

            List<string> child2 = new List<string>();

            child2.Add("nametake");
            child2.Add("kikurage");
            child2.Add("bunashimeji");

            List<string> child3 = new List<string>();

            child3.Add("tengu");
            child3.Add("eringi");
            child3.Add("shitake");
            
            List<List<string>> parent = new List<List<string>>();

            parent.Add(child1);
            parent.Add(child2);
            parent.Add(child3);

            result = parent.SelectMany(x => x).Where(x => keyList.Contains(x)).ToList();
使い捨てwindows環境を整える

# 使い捨てWindows環境？
Windows7時代からひっそり（？）存在していた神機能VHDブートを使い、テンプレートVHDを作りVHDをコピーしまくって使い捨て環境を整えましょうってお話。
もちろんWindows10だけどWindows7以降ならVHD対応してるから行けると思う
# 環境
ホスト
* Windows10 Pro
ゲスト
* Windows10 Pro
#テンプレートVHDの作成
1. VHDを作成、フォーマット。
2. Windows10インストールの画面に行く。
3. Shift+F10でコマンドプロンプト→Diskpart
4. ```select vdisk file=****.VHDX```
5. ```attach vdisk```
6. VHDにWindows10をインストール
7. 初期設定（ブラウザとか）

#VHDのコピー
ホストOSに戻りVHDファイルをコピーします。
まずコピー元の登録を削除

```
bcdedit /delete {******}
```
あとは

```
bcdedit /copy {current} /d "Windows10-1"
bcdedit /set {******} device vhd=[C:]\VHD\windows10-1.vhdx
bcdedit /set {******} osdevice vhd=[C:]\VHD\windows10-1.vhdx
```
コピーしたVHDをBootLoaderに登録します

複数登録まだしてないからわかんないけどuuidの被りとか問題ないのかな？
選択画面ではまだマウントはしてないからおそらく大丈夫だと思うけど…
やったら追記します。
CentOS7でVIA系のNICが認識しない場合の対処方法

# 概要
CentOS7では、古いネットワークインターフェースカード(以下NIC)のドライバをサポートしなくなったため、PCによってはインストール時にNICを認識しない場合があります。
自分の環境ではRealtekのオンボードは認識したのですが、VIAのNICを認識しませんでしたので、対応方法を記します。
なお、nVidiaのnForceチップセット系の場合は、以下の方が解説されています。
[CentOS7でnForce系のネットワークインタフェースが認識しない場合の対処方法](http://www.gun-soft.com/wordpress/?p=174)

# 状況確認
## デバイス状態の確認
`nmcli device`コマンドで、認識されているインターフェースを確認します。

```shell-session
$ nmcli device
DEVICE  TYPE      STATE        CONNECTION
eno1    ethernet  connected    eno1
lo      loopback  unmanaged    --
```

ここで、存在するNICの数だけ表示されているか確認します。(loopbackを除く)

## 物理NIC存在確認
`lspci`コマンドで、物理的にPCにNICが挿ささっていることを確認します。

```shell-session
$ lspci|grep Ethernet
03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 06)
04:07.0 Ethernet controller: VIA Technologies, Inc. VT6120/VT6121/VT6122 Gigabit Ethernet Adapter (rev 11)
```
これで、物理的には挿ささっているのに、OSが認識していないことが判明しました。

# 対応
## rpmの入手
NICごとに、対応するrpmをダウンロードします。
VIAの場合は以下です。
http://elrepo.org/linux/elrepo/el7/x86_64/RPMS/kmod-via-velocity-1.15-1.el7.elrepo.x86_64.rpm
先述のURLにあるように、nForce系の場合は以下です。
http://elrepo.org/linux/elrepo/el7/x86_64/RPMS/kmod-forcedeth-0.64-1.el7.elrepo.x86_64.rpm
## インストール
入手したrpmをインストールします。

```shell-session
$ rpm -ivh kmod-via-velocity-1.15-1.el7.elrepo.x86_64.rpm
```
`nmcli device`コマンドで確認し、それでも認識しないようでしたら再起動してから`nmcli device`を再度実行しましょう。
新規デバイスが表示されれば成功です。
enchant.jsのボタンを使う時のお決まりごと

#はじめに

enchant.jsを子供が勉強中で、質問されたのですが、
すぐに答えを出せなくて、いろいろ見比べていくとボロボロ異なるところがあり、
さらに調べると、「ちゃんと書いてるやん」ってことでしたので、記録しておこうかと。

#参考元

[enchant.js plugin](http://enchantjs.com/ja/resource-ja/plugins/)のui.enchant.js

#利用サービス

[code.9leap](http://code.9leap.net/)

#問題

新規プロジェクトで作成したコード内にボタンオブジェクトを生成して、実行するとエラーが発生してました。
（ブラウザのコンソールに表示）

```
Uncaught ReferenceError: Button is not defined
```

#原因

UI部品のクラスを定義したプラグインが追加されていなかったからです。
ということで、UI部品を搭載したJSファイルを読み込んでおく必要があり、
それと４つの画像素材が必要になります。

#対策

簡単ではありますが、[code.9leap](http://code.9leap.net/)を使った対処方法を書きます。

(1) index.htmlを選択して、次のコードをheadタグの中に入れる

```
　　　　　　<script src='/static/enchant.js-latest/plugins/ui.enchant.js'></script>
```

　ちなみに、code.9leapを使わない場合は、URL形式にしないといけないので、ご注意を。

```
    <script src='http://coderun.9leap.net/static/enchant.js-latest/plugins/ui.enchant.js'></script>
```

(2)[Add Resource]ボタンを押して、以下の４つの画像素材を追加する

- pad.png
- apad.png
- icon0.png
- font0.png

これでOKです。

この後、[main.js]にボタンを生成するコードを書くだけです。

```
enchant();
window.onload = function() {
    var game = new Game(320,320);
    game.onload = function() {
        var button = new Button("ボタン", "light");
        button.tag = "ボタン";
        button.width = 260;
        button.height = 30;
        button.moveTo(15,240);
        game.rootScene.addChild(button);
    }
    //ゲームの開始
    game.start();
}
```

実行した結果を画像で添付します。

<img width="982" alt="スクリーンショット 2016-12-26 0.45.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/105220/4e7d7ba0-724d-b619-a9f5-de271cfdb8a5.png">

なにかの足しになればと。
YAMLでAnsibleのインベントリファイルを書く

(2017-01-03 : 変数の値にシークエンスやディクショナリを書けることに気付いたので修正)

---

[Ansibleの2017年を眺めておこう](http://qiita.com/t_nakayama0714/items/4500fcf533ab020e9f18)を読んだけど、Ansibleのインベントリファイルは実は2.1以降YAMLで書けるという事実はきっとまだほとんど知られていないに違いない。

そりゃまあ、ドキュメントに書いてないしな。

---

というわけでソースがドキュメントだ。

まず、lib/ansible/inventory/dir.pyを見るとYAMLで書いたインベントリファイルの拡張子はlib/ansible/constants.pyのYAML_FILENAME_EXTENSIONSに定義されているもののうちのどれかである必要がある。
つまり、拡張子なし、yml、yaml、jsonのうちのどれかである必要がある。

lib/ansible/inventory/yaml.pyを見ると、以下のようなフォーマットで記述する必要がある。

```yaml
(グループ1):
  hosts:
    (ホストa):
      (ホストaに適用する変数A): (Aの値)
      (ホストaに適用する変数B):
      - (Bの値1)
      - (Bの値2)
    (ホストb):
      (ホストbに適用する変数A): (Aの値)
      (ホストbに適用する変数B):
      - (Bの値1)
      - (Bの値2)
  vars:
    (グループ1のすべてのホストに適用する変数C): (Cの値)
    (グループ1のすべてのホストに適用する変数D):
    - (Dの値1)
    - (Dの値2)
  children:
    (子とするグループ2):
    (子とするグループ3):
(グループ2):
  hosts:
    (以下、省略)
```

* ini（に似た何か）形式で書くインベントリファイルと違い、グループ名を省略してホスト名だけを書くことはできないようだ。
* 各グループの子要素にできるのはhostsかvarsかchildrenだけ。各ホストはグループの子要素にできずhostsの子要素にする必要がある。
* childrenに書くべきものはただのグループ名のリストであるが、シークエンスではなく値を空にしたディクショナリで記述する必要がある。
* varsや各ホストの変数の値としてスカラーだけでなくシークエンスやディクショナリを記述できる。この点、ini（に似た何か）形式より優秀。
* 試した限りでは、ホストに[1:9]のような繰り返しや(ホスト名):(ポート番号)のような記述も特に問題はなく想定通りに動作する。

**2017-01-17追記**：ini（に似た何か）形式だと暗黙的にすべてのグループがallグループのchildとなっていたが、YAML形式だとそうならない。バグだと思われるので報告した。
**2017-03-29追記**：本件、2.2.2で修正されたことを確認した。
https://github.com/ansible/ansible/issues/20252

**2017-04-17追記**：2.3.0にてallグループにホストが追加されず常に空となるバグがある。すでに修正済みなので2.3.1では直っているだろう。この修正が2.3ブランチにマージされたのは2.3.0リリースの翌日くらいだった模様。
**2017-06-03追記**：本件、2.3.1で修正されたことを確認した。
https://github.com/ansible/ansible/pull/23366

例として、[前回の記事](http://qiita.com/yunano/items/8f1db93dc34f7aeeb469)で使ったインベントリファイルをYAMLで書き直すと以下のようになる。

```yaml:windows.hosts.yml
local_windows:
  hosts:
    local_windows:
  vars:
    ansible_host: localhost
    ansible_user: (ユーザ名)
    ansible_password: (パスワード)
    ansible_port: 5986
    ansible_connection: winrm
    ansible_winrm_server_cert_validation: ignore
```

また、JSONはYAMLの一種なので、JSONで書いても構わない。

```json:windows.hosts.json
{
  "local_windows" : {
    "hosts" : {
      "local_windows" : ""
    },
    "vars" : {
      "ansible_host" : "localhost",
      "ansible_user" : "(ユーザ名)",
      "ansible_password" : "(パスワード)",
      "ansible_port" : "5986",
      "ansible_connection" : "winrm",
      "ansible_winrm_server_cert_validation" : "ignore"
    }
  }
}
```
今日からはじめるVisual Studio Code設定


これは[Visual Studio Code Advent Calendar 2016](http://qiita.com/advent-calendar/2016/vscode)の25日目の記事です(間に合わなかった……)。
自分も拡張機能を作って記事にしたかったところですが、案の定クリスマスには時間が取れず断念。最終日にアレですが、エディタ定番の設定ファイル晒しをします。

アップデートのたびにいくつか設定が追加され、最近出たバージョン1.8では[設定の検索や変更補助が便利になっている](https://code.visualstudio.com/updates/v1_8#_settings)ので、既に使い込んでいる人もこの機会に見直してみてはいかがでしょうか。
設定項目の解説は、設定画面の左ペイン「規定の設定」にコメントで書かれているほか、右ペインでも設定にフォーカスをあてるとポップアップで表示されます。

```json:settings.json
{
  // フォントファミリー(お好みで)
  "editor.fontFamily": "'Source Han Code JP', Menlo, Monaco, 'Courier New', monospace",
  // フォントサイズ(お好みで)
  "editor.fontSize": 14,
  // (お好みで)スペース2個インデントの言語を触ることが多いので
  "editor.tabSize": 2,
  // ウインドウ幅で折り返す
  "editor.wrappingColumn": 0,
  // 自動フォーマットする
  "editor.formatOnType": true,
  // カーソルがにゅるっと点滅する
  "editor.cursorBlinking": "smooth",
  // ホワイトスペースを表示する。ただし単語間の単一スペースは表示しない
  "editor.renderWhitespace": "boundary",
  // 制御文字を表示する
  "editor.renderControlCharacters": true,
  // インデントガイド(インデントに沿って縦線を表示)
  "editor.renderIndentGuides": true,
  // 現在行をガターを含めてハイライトするので視認性が上がる
  "editor.renderLineHighlight": "all",
  // 差分を横に並べて表示ではなく行内に表示する
  "diffEditor.renderSideBySide": false,

  // Quick Openで開いたファイルはプレビューにしない方が使いやすい
  "workbench.editor.enablePreviewFromQuickOpen": false,

  // codeコマンドで(ディレクトリではなく)ファイルを開いたときは、既に開いているウインドウがあればそこに表示する
  "window.openFilesInNewWindow": false,
  // 再起動時に開いていたウインドウをすべて復元する
  "window.reopenFolders": "all",
  // タイトルバーにファイルのフルパスを表示する
  "window.showFullPath": true,

  // 余分なホワイトスペースを削除
  "files.trimTrailingWhitespace": true,
  // ファイルの末尾は改行で終わらせる
  "files.insertFinalNewline": true,
  // ファイルを自動保存
  "files.autoSave": "afterDelay",
  // 「ファイル モニタリングから除外するファイル パスの glob パターンを構成します。この設定を変更すると、再起動が必要になります。始動時に Code が消費する CPU 時間が多い場合は、大規模なフォルダーを除外して初期ロードを減らせます。」
  // とのこと。vendorには大抵外部ライブラリが入っているので追加で指定している
  "files.watcherExclude": {
    "**/.git/objects/**": true,
    "**/node_modules/**": true,
    "**/vendor/**": true
  },

  // 検索(Quick Open含む)から除外するファイルを指定。エクスプローラーには表示される
  // files.excludeはエクスプローラーからも検索からも除外され、完全にないものとして扱われる http://qiita.com/shimoju/items/f64a0a7f0baa9cfafd4b
  "search.exclude": {
    "**/node_modules": true,
    "**/bower_components": true,
    "**/bundle": true,
    "**/composer": true,
    "**/tmp": true,
    "**/.tmp": true
  },

  // 拡張機能を自動更新
  "extensions.autoUpdate": true,

  // 「端末の開始時にロケール変数を設定するかどうかを制御します。OS X では既定で true になり、その他のプラットフォームでは false です。」
  // とのことだが、自分のMacではうまく設定されず日本語が文字化けしてしまうのでfalseに
  "terminal.integrated.setLocaleVariables": false
}
```

コメントなし版は[gist](https://gist.github.com/shimoju/ce63c9a071780c50667f5669a8cf35a6)にアップしています。
reptyrで動作中のプロセスを別のptyにアタッチする


sshでログイン
↓
vimでファイル編集
↓
ssh切れる
↓
ssh再度ログイン
↓
再びvimでファイル編集しようとすると、.swpファイルがある
↓
psで確認すると、サーバ側でsshのセッション残ったまま

こういう状態で、既にクライアント側を終了してしまったsshのセッションで起動しているvimを、いま開いているsshのセッションから横取りしたい。
こういうときは`reptyr`を使えばいいみたい。

インストール

```bash
apt-get install reptyr
```

vimを横取りする

```bash
ps aux |grep vim  # 既に起動中のvimのpidを調べる
reptyr -s 調べたpid
```

参考: http://blog.daionet.gr.jp/knok/2014/10/31/reptyr/
素人の言語処理100本ノック:55


[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の挑戦記録です。環境はUbuntu 16.04 LTS ＋ Python 3.5.2 \:\: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧は[こちら](http://qiita.com/segavvy/items/fb50ba8097d59475f760)からどうぞ。

## 第6章: 英語テキストの処理
>英語のテキスト（nlp.txt）に対して，以下の処理を実行せよ．

###55. 固有表現抽出
>入力文中の人名をすべて抜き出せ．

####出来上がったコード：

```python:main.py
# coding: utf-8
import os
import subprocess
import xml.etree.ElementTree as ET

fname = 'nlp.txt'
fname_parsed = 'nlp.txt.xml'


def parse_nlp():
	'''nlp.txtをStanford Core NLPで解析しxmlファイルへ出力
	すでに結果ファイルが存在する場合は実行しない
	'''
	if not os.path.exists(fname_parsed):

		# StanfordCoreNLP実行、標準エラーはparse.outへ出力
		subprocess.run(
			'java -cp "/usr/local/lib/stanford-corenlp-full-2016-10-31/*"'
			' -Xmx2g'
			' edu.stanford.nlp.pipeline.StanfordCoreNLP'
			' -annotators tokenize,ssplit,pos,lemma,ner,parse,dcoref'
			' -file ' + fname + ' 2>parse.out',
			shell=True,		# shellで実行
			check=True		# エラーチェックあり
		)


# nlp.txtを解析
parse_nlp()

# 解析結果のxmlをパース
root = ET.parse(fname_parsed)

# tokenの抽出
for token in root.iterfind(
	'./document/sentences/sentence/tokens/token[NER="PERSON"]'
):
	print(token.findtext('word'))
```

####実行結果：

```console:端末：先頭部分
Alan
Turing
Joseph
Weizenbaum
MARGIE
Schank
Wilensky
Meehan
Lehnert
Carbonell
Lehnert
Racter
Jabberwacky
Moore
```

###人名の抽出
Stanford Core NLPには、[Stanford Named Entity Recognizer (NER)](http://nlp.stanford.edu/software/CRF-NER.html)という固有表現を解析する仕組みがあり、xmlファイルにはその結果が`<NER>`タグで出力されています。`<NER>`タグの値は「PERSON」、「ORGANIZATION」、「LOCATION」などになるそうです。
今回は前問のコードをベースに、`<NER>`タグが「PERSON」の`<token>`タグだけを抽出するように変更しました。


###XPathの利用
XPathは、XML内の任意の部分を指定するための言語です。今回はこれを利用しました。
XPathはかなり複雑な言語らしく、Pythonでも一部しかサポートしていません。ただそのおかげで、[サポートされている XPath 構文]
(http://docs.python.jp/3/library/xml.etree.elementtree.html#supported-xpath-s)の解説はシンプルです。これを見れば、Pythonで使えるXPathの構文はだいたい把握できるかと思います。

今回は[Element.iterfind()](http://docs.python.jp/3/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.iterfind)で、XPathを指定しました。指定しているXPathの意味は、「`<NER>`タグの値が`PERSON`である`/document/sentences/sentence/tokens/token`タグ」です。
なお、[前問](http://qiita.com/segavvy/items/4d55805352089332828e)の`<token>`タグの抽出は途中の階層を指定していない乱暴なものだったので、今回はきっちり指定してみました。

　
56本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。
<hr>

*実行結果には、[100本ノックで用いるコーパス・データ](http://www.cl.ecei.tohoku.ac.jp/nlp100/#data)で配布されているデータの一部が含まれます。この第6章で用いているデータのライセンスは[クリエイティブ・コモンズ 表示-継承 3.0 非移植](https://creativecommons.org/licenses/by-sa/3.0/legalcode)（[日本語訳](https://creativecommons.org/licenses/by-sa/3.0/deed.ja)）です。*
ffmpegを使ったgifの作り方をちょっと詳しく解説してみる

# はじめに
gifアニメって面白いですよね. 
LGTM用にgifアニメを使って感情を表現したり，ふざけてみたり :hamster: :hamster: 
他にプルリクで成果物をgifアニメとして貼っておくとどんなものなのか伝わりやすいので，よく作ってます.
さて，ここではいつもどんな風に作っているかまとめていきたいと思います．

手順としては
1. 作りたいアニメーション用の動画ファイルを作成
2. `ffmpeg`コマンドで変換
でなにか味気ないけど終了！

1.の動画ファイル作成では，自分はMacを使っているのでQuickTimeの新規画面収録で取りたい範囲を指定してmp4ファイルを作成している． 
次に`ffmpeg`コマンドをつかうのだけど，まずは導入方法から入っていきましょう．

# ffmpegコマンド導入
これをたたくだけ．

```
$ brew install ffmpeg
```

# 使い方
コマンドのテンプレートは以下．

```
$ ffmpeg -i input.mp4 -vf scale=width:height -r rate output.gif
```

オプション|説明
:--|:--
-i| 入力ファイルのパス
-vf scale| video optionでfiltergraphにscaleを使う
-r| フレームレート指定

filtergraphを挟むことで， デコードとエンコードの間に処理を挟むことができるようだ．
サイズを調節したいので， scale filter利用する．
`-vf scale=320:240`とすることで， 320×240サイズの画像ができる.
また，アスペクト比を維持したい場合は， `-vf scale=320:-1`の様にwidthかheightのどちらかを`-1`に指定することで可能だ．
(※詳しくは[wiki:Scaling (resizing) with ffmpeg](https://trac.ffmpeg.org/wiki/Scaling%20(resizing)%20with%20ffmpeg)を参照してみてください．)

出力ファイルの形式はoutputファイルの拡張子から推測して判断されるので，gifにしたい場合は`.gif`をつけるだけでOK. 
`-f`オプションをつけることで，強制的に指定することもできる． (※参考:[Main-options](https://ffmpeg.org/ffmpeg.html#Main-options))

最後にいつも叩いているコマンドをサンプルとして載せておきます.

```
$ ffmpeg -i input.mp4 -vf scale=250:-1 -r 10 output.gif
```

# 参考
[ffmpeg Documentation](https://ffmpeg.org/ffmpeg.html)
とにかく発信すればいいと思う。ただし、自分の言葉で。

# どうでもいい話

最終日にポエムを書くことにしたのはいいけれど、今年書いた Advent Calendar のいくつかは結果的にポエムになってしまったので、あえて「ポエム Advent Calendar」というくくりで何かを書くのは難しい・・・。

# 以下本題

## たったの 2 いいねの記事

[私が Qiita に初めて投稿した記事](http://qiita.com/mdstoy/items/c3a06a42ab6fb22d4c82)は恥ずかしながら Qiita 上ではたったの 2 いいねしかもらっていないのですが、その記事のコメントと追記を見ていただくとわかる通り Vim でおなじみ香り屋の KoRoN 氏に拾われていたりします。私の記事が日本の Vim 界の停滞を防いだかもしれません。
と、冗談はさておき、たまたまこの例は、私のような末端の職業プログラマでも名前を知っている KoRoN 氏が登場人物でありブログの記事にも引用していただいているのでやたら大きい話のように見えるかもしれませんが、いいねしてくれた方や KoRoN 氏以外にも、この記事が役に立ったという方がいるかもしれませんしいないかもしれないわけです。実際、自分が思っている以上に自分の記事は Twitter などで言及されていたりしますし。[^1]

[^1]: "by @mdstoy on @Qiita" が付くツイートは通知が来るからすぐ補足できるのですが、付かないタイプのツイートもあってそっちはエゴサーチしないと補足できないことについ最近気がつきました・・・

あ、Vim 繋がりでいえば、「あ・・・ありのまま今起こった事を話すぜ！俺は[今年の Vim (その2) Advent Calendar](http://qiita.com/mdstoy/items/94702e20b7c15a8bc1ee) で vimtutor の typo を指摘したと思ったら、朝起きたらマージされていた。な・・・何を（以下略）」などという超常現象にも遭遇しました。こっちは typo の指摘だけですけど本当に Vim に貢献していますね。[^2]

[^2]: とはいえ、そんな大きなプロダクトに pull request する機会を逃してちょっと後悔したので、次の機会があったらせっかくなので自分で pull request したいと思います。

## 自分の言葉で、理解したことを

今私が思うのは、自分が理解したことを自分の言葉で発信できれば、それは何らかの意味を持つからどんどんやればいいんじゃないかということです。「理解したこと」とは、完全じゃなくてもいいし必ずしも全てが正しくなくてもいいのです。最初の例がまさにそうだと思います。私の記事は、障害に対する完全な対応ではなかったけれど、いいねはほとんどもらえなかったけれど、助かったと言ってくれる人はいたわけです。
だからみんな怖がらずに発信したらいいと思うのです。[^3]

[^3]: 怖がらずに済むだけの知識や主張は最低限必要ですけどね

## 自分の主張がない記事はどうかと思います

一方で、Qiita はいわゆる SN 比的なもの[^4]が猛烈に低いと感じているのも確かです。上記の主張と矛盾しているような気もしますが、なんなんでしょうね？
チラシの裏的というか、入門書の一節をただ写しただけのようなものはたぶんきっと要らないですね。

[^4]: SN 比はなにか違うような気もする。なんといえばいいのだろうか？
新卒のうちに身につけたい職業に対する目標

#はじめに

[Advent Calender2016 新人エンジニア](http://qiita.com/advent-calendar/2016/freshman_engineer)に寄稿させていただきました。

社会人3年目の@SatouRyouです。
もうすぐ、3年目も終了しもうすぐ4年目に突入する状態で、新卒というには怪しいですが、
カレンダーが空いていたので投稿致しました。

#タイトルについて
目標とかっこよく書いていますが、ここに当たる言葉は正直難しいです。

人によっては目標であったり、原点であったり、心情であったり、動機であったりビジョンであったりと違うと思います。
(記事内では「目標」と致します。微妙に違う感がありますが。)

自己啓発系の本をいくらか読みましたが、割とバラバラでした。

結論としては、以下の事を説明できればいいと思っています。

「あなたが、職業としてエンジニアを選択した理由はなんでしょうか」

#私の目標
私の上記への答えは、以下になります。

「世の中のエンジニア人口の増加に貢献する」

この答えを見つけたのは、2年目の終わり頃になります。

プライベートでちょっとしたことがあり、その際になぜ自分はエンジニアをしているんだろう、
世の中には様々な職業があり、お金を稼ぐのであればもっと簡単な方法があるのにと考えていた時期がありました。

そして、一応自分の中で納得できる答えが上記となりました。

#目標がある上でのメリット

##一貫性のある行動
信頼できない人の条件の一つに「発言に一貫性がない」があげられると思います。
しかし、目標を元に考え行動発言をすることで、少なからず、発言に一貫性が生まれます。

また、やるかやらないかで悩んだ際に、だいたいはやった方がいいですが、
その後押しに、この目標が役にたちます。

このアドベントカレンダーに登録した行為も、
新卒用のカレンダーはせっかくなら埋まっていた方が、書いた人も達成感が出て、
新卒の方々に貢献できるのではないかと考えたからです。

また、やらない際もなんとなくやらないよりも、この信念に反するからやらないと決断できた方が、
精神衛生上いいのではないかと思います。

##周りが応援してくれる
目標があるのならば、周りに周知した方がいいと思います。

上司がその目標を知っていれば、会社の目標と照らし合わせ、
両方にとって利のある短期目標を設定してくれる可能性があります。

また、振られるタスク自体も、目標が分かっていれば、
関連したものを優先的に降ってくれる可能性があります。

また、上司以外も、目標を知っていれば、それに関する情報を教えてくれる可能性があります。
私も、後輩や同期でこういうことを勉強したいという方がいれば、それに関する書籍を貸したり、
セミナーに誘ったりといったことを行なっています。

##マッチした会社を見つけやすい
それぞれの会社には文化が存在し、最近では技術力よりも、
文化にマッチする人材やビジョンに共感できる人材を重視しているという声を聞きます。

その際に、会社の文化と一致しているかという判断に、
目標は役に立つのではと考えています。

##学習する上で効率的
ただ漠然と勉強するよりは、明確な目標を設定した方が学習は捗ると思います。

今の目標を達成する上で、どのような内容をどのようなスパンで学習すればいいか、
先輩にも相談することで、明確にできると思います。

#目標がある上でのデメリット
##会社や上司とぶつかる可能性
目標を設定できた場合に、その目標が会社の文化やビジョンとマッチしない可能性がありし、
その際に今までは感じることがなかったストレスを受ける可能性があります。

##限度を認識する
目標を元に自らを奮い立たせることができますが、人間なので限界があります。

上記の理由でアドベントカレンダーに登録しましたが、
現時点では三つ空きがあり、すべて埋めるべきだったかもしれませんが、
そこまでネタがないので諦めました。

また、目標に他者が絡んでいる場合、他者を強制させることはできないので、
あくまできっかけを与える程度に抑えるべきではないかと考えます。

#目標を持つ上での注意点
目標は持って欲しいものの、それに固執しないで欲しいというのがあります。

何故ならば、今設定した目標は今の状況から考え出されたものであり、特にIT業界は移り変わりが早いので、昔立てた目標に固執すると、高確率で置いていかれる可能性があります。

ですので、矛盾するかもしれませんが、目標を常に持ち続けて欲しいものの、
柔軟に変更し続けて欲しいです。

#終わりに
私は、上記の目標を持つことで、特に教育面で今まで以上に頑張ることができました。

仕事で疲れている時も、この目標を達成するならもう一踏ん張りするべきと、
自らを奮い立たせて、フォローを行なったりすることもありました(少々大げさですが)。

若干、胡散臭い精神論的な話になってしまい、
言葉の定義もかなり曖昧な感じになってしまいましたが、
上記の質問には答えられるようにして置いた方がいいと思います。

入社時の面接で質問はされているとは思いますが、
入社してからは目線や視野が変わっているので、見える景色が違うと思います。

ベストなのは、もう一度履歴書、職務経歴書を書いてみることだと思いますが、
目標を設定してみることをお勧めします。

ポエムカレンダーに投稿するべき内容かと思いましたが、
新人のうちに身につけておくといい内容かつ実感していることなので、こちらのカレンダーに寄稿致しました。
Rails Girls が終わってからも、Rails Girlsですよ！

この記事は、[Rails Girls Japan Advent Calendar 2016 最終日](https://qiita.com/advent-calendar/2016/railsgirlsjapan)の記事です。
クリスマスですよー！ケーキ食べましたかー？

## と、本題の前に、ざっくり自己紹介。
Rails Girls Nagoya 1st〜3rdのオーガナイザー@yadaitaです。
関西圏で開催されているRails Girlsでは、コーチとしてお手伝いをしていることが多いです。
・・・あ、あと、くまモン好きです。（←これ、重要。）

## Rails Girls が終わった後で・・・
### Rails Girlsやりました！
私の場合は、プログラミングって怖くないよ、楽しいよ、というのを共有したい、というのがそもそもRails Girlsのオーガナイザーに名乗りをあげるキッカケでした。
「やりたい」という思いだけで、右も左もわからない私は、歴代のRails Girlsオーガナイザーや、Ruby東海のメンバーに助けられ、無事にRails Girlsを開催することができました！

・・・普通の物語なら、ここで「めでたし、めでたし・・・」というところです。
が、実は、Rails Girlsは、終わってからが、本番だと個人的には思っています。

### Rails Girls卒業生にとってのその後の活動の場！
Nagoyaでは、「Rails Girls Nagoya more!」として、Rails Girls終了後も、卒業生が継続的に活動ができる、卒業生が繋がれる場を作りました。Tokyoで既に開催されているものを真似っこしてはじめてみました。
（Nagoyaの場合は、いつもお菓子を食べていて、茶話会的要素が強めですが…）
せっかくRails Girlsでプログラミングに触れたのに、それだけで終わりではもったいないよね、というのが場をつくるキッカケでもあります。
この活動の場は、2014年〜約2年続いています。
少数ではありますが、継続して参加して繋がっているメンバーがいて、最低限の場の役割は果たせているかな？と思っています。これからも、Rails Girlsの卒業生が、ブランクがあったとしてもいつでも戻れる場として機能できるといいなーと思っています。

#### Rails Girlsをもっと他の地域へ！
もともと、私自身が「RailsGirlsをやってみたい」と思ってTokyo 3rdのコーチ募集に応募、いろいろとお世話になったことから、「私の住んでいるところでもやってみたい！」という話を受けたら、微力ながら開催のハードルを下げるお手伝いをしています。
（例えば、Nagoyaの場合だと、スタッフや見学でRails Girlsそのものの雰囲気を見てもらったり、開催に必要なことのざっくり説明など、あとは、実際に開催時にコーチとして、応援に駆けつける、など。）
個人的にはもっと、いろんな地域で開かれるといいなあと思っております。
もし、私もやってみたい！という人がいたら、是非お声がけをー。

## 最後に・・・
直近のRails Girlsのご案内です。
現時点(2016/12/25時点)で以下の２箇所での開催が予定されています。
2017年3月3-4日：松江
2017年3月10-11日：北九州

もちろん、これからまた「やりたい！」と手をあげたオーガナイザーがいれば
各地で開催されることになります。是非定期的に
http://railsgirls.jp/events/
をチェックしてみてください！

コーチ・スタッフとしてお手伝いしてみたい方はもちろん、プログラミングに
興味を持っている女性が周囲にいましたら参加をすすめてみてください！
タスク公開術

#はじめに

[Advent Calender2016](http://qiita.com/advent-calendar/2016/freshman_engineer) 新人エンジニア に寄稿させていただきました。

社会人3年目の@SatouRyouです。
もうすぐ、3年目も終了しもうすぐ4年目に突入する状態で、新卒というには怪しいですが、
カレンダーが空いていたので入社した頃の話を投稿致しました。

投稿に至るモチベーションは[21日目](http://qiita.com/SatouRyou/items/28f2cd004226acbb2e76)に軽く記載致します。

#タスク公開術について

特段難しいことはなく、タスクや仕事に関する自分が持っている情報をどんどん公開していく仕事方法です。

これは、特別意識して始めたことではありませんでした。
単に、自分が社内ではお喋りな方で(同期に言わせると自分がいないと会社が少し静かになるそう)、
何かあると上司にすぐ話すようにしていただけでした(意識していませんが、割と大きな声で)。

これは、入社した時からやっていただったのですが、少し前から意外と効果のあることだったと、
気がついたので、投稿しました。

#とりあえず報連相が完璧になる。
何かあると、とりあえず話をしていたので、報連相はできていました。

#スケジュールのズレに気づいてもらえる。
入社からしばらくの間は、見積もりも甘く、スケジュールとずれることがありました。

しかし、何かあったら話を指定たので、こちらがやばい状況になると上司が察してくださり、
最初のうちはサポートをしてくださることもありました。

しばらくたつと、こちらがスケジュールにズレが生じている際は、
それをそれとなく伝え、こちらに気づかせるいうにしてくださりました。

#タスクの重複がなくなる。
お客様から、直接仕事をふられたり、社内の人からヘルプをされたりと、
何かと差込が多い状態で働いていました。

しかし、そんな時も上司にとりあえずそのことを公開し、
元々のスケジュールをリスケしていただいたり、依頼された仕事を別の人に振ったりと、
していただきました。

上司に相談しなかった場合、こちらの首が回らなくなってしまう可能性があったので、
本当に助かりました。

#チーム全体に情報が伝わる。
どうやら、私が喋る際の声は少し大きいようで、上司と話していると、
だいたい周囲にそのことは伝わります。

すると、技術的にわからない点を相談していたりすると、チーム内の聞こえていた人が、
助言をしてくださったりと、助けていただける場面がいくつかありました。

また、それとなく話をしたことは覚えているようで、他の人がヘルプを求めている時に、
その対応と似たことはSatouRyouさんが以前やっていましたと、自然と情報共有ができていました。

#注意点
・あまり何でもかんでも話すと、信頼されなくなる場合があるので注意
　(特にメンターをやっている場合のプライベートな話)

・あまり大きな声で喋ると迷惑です。
　チャットがある場合はそこで発言した方が喉にも優しいです。

#大事なこと
とりあえず、何かあったら話をしましょう。

大きな声でなくても、チャットツールでpublicで投稿すれば、
自動的に大きな声になります(便利です)。

良い上司なら、とりあえず付き合ってくれると思います。
さらに信頼関係も築けるので一石二鳥です。

#公開するなら
何回か書いていますが、タスクを公開するなら、チャットを使用するとお手軽です。
何かあったら書くでいいのでチャットに書き込みましょう。

分報という仕組みがあればベストです。
なければ上司に相談してみましょう。

#転職時の引継ぎが楽(2017/03/16追記)
もう一点、メリットがありまして、
今回転職を行うことになりまして、それに伴い引継ぎを行っています。

その際に、上記のように連携をしていたおかげで、自分しかできない仕事がほぼなくなっていました。
(例外は、新人教育やメンタリング、レビューなど)

ですので、タスクを公開し続けると転職時に楽になります。
WebAudioAPIとGrimoire.jsを組み合わせて遊ぶ

今回は**Web Audio API**とGrimoire.jsを組み合わせて遊んでみました。最近はGrimoire.jsと他のWebの技術を組み合わせて面白い表現ができないか考えています。

![](https://gyazo.com/de98314792bc78cea00b7c267fd608b1.gif)

WebAudioAPIでmp3音源の波形を取得してみました。gifだと、音がないのでいささか地味ですが、このような表現もGrimoire.jsなら簡単に作成できます。

以下はほとんどWebAudioAPIを使用するためのコードですが、下部にGrimoire.jsのAPIに取得した音源の波形の値を入れています。

WebAudioAPIに関する基本的なことは下記の記事等を参考にさせていただきました。
http://qiita.com/soarflat/items/b60649195c16c7a43868

```js
gr(function() {
    var d = new Date();
    var source, animationId;
    var audioContext = new AudioContext;
    var fileReader = new FileReader;
    var analyser = audioContext.createAnalyser();
    analyser.fftSize = 128;
    analyser.connect(audioContext.destination);
    fileReader.onload = function() {
        audioContext.decodeAudioData(fileReader.result, function(buffer) {
            if (source) {
                source.stop();
                cancelAnimationFrame(animationId);
            }
            source = audioContext.createBufferSource();
            source.buffer = buffer;
            source.connect(analyser);
            source.start(0);
            animationId = requestAnimationFrame(render);
        });
    };
    document.getElementById('file').addEventListener('change', function(e) {
        fileReader.readAsArrayBuffer(e.target.files[0]);
    });
    const $$ = gr("#main");
    render = function() {
        var spectrums = new Uint8Array(analyser.frequencyBinCount);
        analyser.getByteFrequencyData(spectrums);
        for (var i = 1; i <= spectrums.length; i++) {
            $$("#mesh-" + i}).setAttribute("position", `${i/5},${spectrums[i-1]/100},0`);
        }
        animationId = requestAnimationFrame(render);
    };
});
```

WebGLの表現と他の技術を組み合わせてみると、表現の幅が広がることだと思います。この他にも面白い表現を探して共有できればいいですね。
初めてのプログラミングで社内の経費精算管理ツールをつくってみる（まで）#4

##前回からの続き

プログラム未経験者のディレクターがきちんと動くプログラムをつくるまでのお話し、第4回目です。
各画面の構成と画面遷移図をつくる、の回になります。




##画面の構成と画面遷移図（と機能の洗い出し）

###ログインページ（メンバー&管理者用）

![スライド01.jpg](https://quad.qiita.com/files/a5d6dd1c-02ed-fbb6-4865-c3e796232b83.jpeg "スライド01.jpg")

メンバー、管理者問わずこの画面からスタート。
ID、PASSWORDを入力してログインしたら次のページへ。


＜機能＞

* ログインができる
 - 事前に会員登録が必要
 - メンバーと管理者の権限を分ける
 - 会員の権限に合わせて表示させるページを分ける

* ID、PASSWORDが間違っていた場合エラーメッセージを表示する（追加）



###経費入力ページ（メンバー）

![スライド02.jpg](https://quad.qiita.com/files/6ab30140-ce54-9146-e0f3-30f8a1c4606c.jpeg "スライド02.jpg")

入力されたIDがメンバーだった場合このページを表示。

＜機能＞

* ログイン後は未提出の月のシートを表示させる（追加）
* 左右の「＜」「＞」をクリックすると前後の月にシートが切り替わる（追加）
* 各項目の入力、登録ができる
	* 登録した項目の修正ができる
	* 修正した項目の更新ができる
* 各項目に入力制限を持たせる（追加）
	- date カレンダーから日付を選択（追加）
	- expense item プルダウンで選択（追加）
	- price 半角数字のみ入力できるよう制限（追加）
	- note 制限なし（追加）
* 登録した内容を管理者側に提出できる
	- 「提出」ボタンがクリックされたらslackで管理者に通知が届く（追加）
	- 一度提出した月のシートは編集できないようにする（追加） 
	- 管理者に差戻しされた場合のみ編集可に戻す（追加）

けっこう追加が出てきますねぇ。。

###経費入力ページ（管理者用）

![スライド03.jpg](https://quad.qiita.com/files/a7eb2eb3-306b-6a45-46db-936ecfd28e1b.jpeg "スライド03.jpg")

入力されたIDが管理者だった場合このページを表示。

＜機能＞

* 「管理者ページ」をクリックすると管理者用のページへ遷移（追加）
* その他の機能はメンバー用と同様

###経費確認ページ（管理者用）

![スライド04.jpg](https://quad.qiita.com/files/616b5619-a4b5-db8a-83c4-8ceede7f415d.jpeg "スライド04.jpg")



＜機能＞

* 提出された内容を確認できる
	- ページ上部でメンバー毎に「立替交通費」「立替経費」「合計」を計算し表示する（追加）
	- ページ下部で全ての項目を表示させる
* 提出された内容を差し戻しできる
	- ページ上部で「差戻し」ボタンをクリックすると該当メンバーに差し戻された通知がslackで届く（追加）
* 提出された内容を修正できる（削除）
	- 修正はメンバーに差戻しするため不要


構成を作ることで具体的なイメージができました。
追加の機能がだいぶ出てきましたが。。（不要な機能も発見）

何を作るかは見えて来たので、次はどんな言語でどうつくるかを考えないと。（ようやく）

##終わりに
###次回に向けて
という訳で、言語を決めてどうつくるかを考えます。

###雑感
現在、23:50。
クリスマスとAdvent Calendarが終わりますね。。

Advent Calendarは終わりますがQiitaへの投稿はこのプログラムが完成するまで続けて行こうと思います。

引き続きどうぞ宜しくお願いいたします。
Slackのemojiをドラッグ＆ドロップで追加できるアプリをGolangで作った

2019/07/07追記 結構前からSlackの仕様が変更されて動作しない状態となっております m(_ _)m 修正中です

この記事は[Slack その2 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/slack2 "Slack その2 Advent Calendar 2016")の25日目の記事です。
なんとか間に合いました・・・。

追記：バグを修正しました。
128px x 128px以下の画像でも正常に追加できるようになりました。

追記：gifとアニメgifに対応しました。
ただし、リサイズ後でも64KBを超えてしまうとアップロードに失敗します。

追記：予定とは全然関係なく複数ファイルのアップロードと複数チームへの同時アップロードに対応しました。

#はじめに
以前にSlackのemojiの引っ越しを作り、emojiをアップロードするためのノウハウが出来たので、それを応用してemojiの追加をドラッグ＆ドロップで出来たら便利なのでは、と思い作りました。
実は以前Rubyでも書いたのですが、記事に出来ておらず・・・^^;
[前回の記事](http://qiita.com/from_Unknown/items/48810ce575b29322e6a0 "Slackのemojiを別のTeamに引っ越しするスクリプトをGoで書き直してみた")でも書いたとおり、Rubyで作ったスクリプトは環境作成が0からだと大変なので、環境作成がいらないGoで書き直しました。

#ソースとダウンロード先
[slack_emoji_uploader_go](https://github.com/from-unknown/slack_emoji_uploader_go "slack_emoji_uploader_go")

Release内にビルドしたモジュールを入れてあります。
WindowsとMacでzipファイルを分けたので、必要なファイルをダウンロードしてください。

なお、対応ファイルはjpgとpngとgif形式です。
~~gifも対応しようとしたのですが、現時点では色がおかしくなってしまうので再度調べて対応します・・・。~~
↑対応しました。

#使い方
使い方は簡単です。

環境のセットアップは必要ありません。
emoji_conf.txtに必要な情報を記入してください。

**引っ越し先の情報**

+ Slack team URL
+ Slackにログインするためのメールアドレス
+ Slackにログインするためのパスワード

全て記入できたら以下手順で実行してください。
**注：emojiの名前はドラッグ＆ドロップした画像のファイル名の拡張子を除いた名前となります。**

**Macの場合**

1. Terminalを開く
2. cdコマンドでフォルダまで移動
3. ```chmod +x slack_emoji_uploader.sh```でslack_emoji_uploader.shに実行権限を付与

実行時：

1. ```upload```に画像をドラッグ＆ドロップする

**Windowsの場合**

1. ```upload.bat```に画像をドラッグ＆ドロップする

**注意：**
**SlackのAPIやカスタマイズ甩ページに繋がりにくい時があり、失敗する時があるようです。**
**失敗した時は時間をおいて再度試してください。**

#どんなことをやっているのか
Slackへのアップロードは前回の引っ越しで出来ているため、今回のポイントは以下の2点です。

+ 画像のリサイズ
+ ドラッグ＆ドロップ対応

画像のリサイズはこちらの記事を参考にしました。
[uploadされた写真をリサイズする方法](http://qiita.com/BOPsemi/items/df8cb87491ec16aa5bf0 "uploadされた写真をリサイズする方法")
[nfnt/resize](https://github.com/nfnt/resize)というライブラリを使用しています。

ドラッグ＆ドロップ対応はMacが中々うまくいかなくて、色々試した結果、下記の記事の方法でうまくいきました。
[Automator のシェルスクリプトで $0 を取得する](http://d.hatena.ne.jp/nokiya/20120302/1330659396 "Automator のシェルスクリプトで $0 を取得する")
Windowsはバッチファイルで簡単に出来たのですがね・・・。

#作った感想
Windowsはバッチファイルで簡単に出来たのですが、Macでドラッグ＆ドロップが中々出来なくて大分時間がかかりました。
~~あと、今回はなんとかアニメgifに対応しようと頑張ったのですが、うまくいかず・・・。~~
~~次回のアップデートに持ち越しとなりました。~~
対応しました！
結構苦戦しましたがなんとかなりました。
今回の経験でアニメgifの仕組みなどを少し知ることが出来ました。
gifアニメって2枚目以降は差分しか情報を持ってないんですね・・・。

今後追加予定の項目です。

+ リサイズした画像を消す処理
+ emojiの名前のチェック
+ ファイルサイズのチェック
+ アップロード失敗時のエラーメッセージをログに残す
+ Readmeをきちんと書く

では、良いSlackライフを！
Bluemixと連動するEC-CUBEプラグイン

#概要
先日、IBMユーザー研究会でU研ハッカソン「Try and Challenge！」というイベントが開催されました。弊社チームも参加させて頂き、その際にBluemix & DevOpsで開発したソリューションをご紹介します。

ECサイトでは膨大なデータが蓄積されていきますが、必要なデータを自力で分析していくのは大変です。これをBluemix・WATSONを使用して集計と分析を行い結果を可視化することができるようにしたものが今回開発した「データ分析マイクロサービス」です。

データ分析を行うことで、次にとるべき手段がわかり売り上げの拡大、コストの削減、収益の向上といった成果につなげることができるようになります。
#開発に至った背景
- ITの進化により、膨大なデータが自動的に日々、蓄積されている。
- 蓄積されたデータには企業が活動をしていく中で有用な情報や知識が潜んでいる。
- データを集めるだけではなく分析することで新たな価値を作りだすことができる。

      **シンプルに実用的なデータ分析ができるサービスを提供したい**
#課題とニーズ
- データが膨大で必要なデータがわからない。

- 適切なデータの分析方法がわからない。

- 必要なデータを簡単に効率的に分析したい。
#解決策
- BlueMixを用いて分かりやすく、シンプルで実用的なデータ分析を実現する。

- Watsonを利用して効率よくデータの分析を行う。

- 分析した結果を可視化し、データを使いやすくする。

　　　　**Bluemix & Watsonを使用してのデータ分析のアプリケーション開発を行う**
#システム構成
- ECサイト(EC-CUBE)をサービスの対象としてBluemix・Watsonと連携を行う。

- Bluemix nodejs を使用して開発する。

- DevOpsサービスにてgit管理する。

- DataConnect、WatsonAPI その他Bluemixで用意されているカタログを利用して機能の拡張ができる。
- データ取り込み機能
- データを登録（DB,csv,tsv,等のデータ形式）
- データのクレンジング

- データ出力機能
- Bluemix上で可視化
- フォーマットして取得(REST形式)
- 外部機能と連携(ECサイト、モバイル、デスクトップアプリケーション等)
![image](https://qiita-image-store.s3.amazonaws.com/0/59865/03d020b1-514a-f272-f8d3-1261bc2be3dd.png)
#EC-CUBE プラグイン機能
- 最終イメージは管理画面でグラフ表示できるようにする。
- 管理画面よりデータをbluemixへpost,データ登録
- 管理画面よりデータ取得、グラフ化して表示する
- noderedにアクセスしてデータを取得するイメージ 
- REST形式でアクセスできるように
#得られる効果
- データの集計と分析が手軽にできる。

- 簡単に分析結果を可視化することができる。

- ECサイトの運営を効率的に行うことができる。
#分析対象データ
- 商品別売上金額 
- 商品別販売数量 
- 顧客別売上金額 
- 顧客別販売数量 
- 年代別売上金額
- 年代別販売数量
などなど
- 売上データ
- 商品名
- 顧客名
- 年齢
- 住所
- 性別
- 金額
- 購入数
- 購入時期
など
上記に対してABC分析を実施する
#ビジネスモデル
- 売り上げデータを分析することで、売れ行きの変化や一緒に売れている商品がわかり、商品構成のヒントになり、コストの削減や顧客単価の向上につながる。

- 顧客データの分析をすることで、顧客の趣向がわかり、顧客の次の行動を予測したマーケティングが可能となり収益につながる。

　　　**データ分析を行うことで、次に取るべき手段がわかり成果につなげることができる**
Stereoscopic4Dの紹介

# Stereoscopic4D

遅くなってしまいましたが、サイエンスアゴラで発表した内容とほぼ同一のもの(有料アセット等を外したもの)をMITライセンスのもとで公開しました！

https://github.com/scienceagora4dim/Stereoscopic4D

## デモシーン

[Stereoscopic4D/Assets/Stereoscopic4D/Demo/Scenes](https://github.com/scienceagora4dim/Stereoscopic4D/tree/master/Assets/Stereoscopic4D/Demo/Scenes)ディレクトリにデモシーンが用意されています。Science AGORA 2016で発表したものを簡略化したシーンとなっています。

![Screen Shot 2016-12-25 at 23.45.25.png](https://qiita-image-store.s3.amazonaws.com/0/3735/79dcf905-a52c-e3a8-9260-d95f927ec5d0.png)

デモシーンでは、超立方体の表示と、ゲームパッドなどによる回転をテストすることができます。十字キーやキーボードのA・D・W・Sキーなどで通常の3次元での回転を行うことができ、`Fire1`ボタン(トリガーなど)を押下したまま回転をすると、W軸も変化する回転を行えます。

超立方体の座標やサイズについては、`Tesseract`ゲームオブジェクトの`Transform 4D`コンポーネントの各パラメーターで設定可能です。

Oculus・Viveには対応済み(のはず……)のため、それぞれのHMDで見ることで4次元立体視を体験できるようになっています。4次元立体視の度合いは、`Stereoscopic4dCamera`ゲームオブジェクトの`Squint factor`で調整可能です。値はデフォルトで1に設定されており、値を大きくするほどW軸による視差が強調されます。

## 基本的な構成

基本的な構成は[本アドベントカレンダー7日目](http://qiita.com/outlandkarasu@github/items/0a1617a9bb8073fa8e40)に紹介した通りとなっています。一般公開向けに、多少マイナーチェンジが行われています。

### マイナーチェンジ内容

* 4次元オブジェクトのファイル形式を、独自のtxt形式からjson形式に変更した。
    * 独自のパーサーなどは不要になったため削除
* パラメーター名などを整理した。
* Assetパッケージとして再利用しやすい形にまとめた。

### Asset構成

* [Stereoscopic4D/Assets/Stereoscopic4D/Scripts](https://github.com/scienceagora4dim/Stereoscopic4D/tree/master/Assets/Stereoscopic4D/Scripts)
    * Camera4D.cs
        * カメラに4次元立体視のOn/Off機能を持たせるためのスクリプト。
    * HyperObject.cs
        * JSONファイルから4次元オブジェクトのメッシュを生成するためのスクリプト。
    * HyperObjectController.cs
        * 4次元描画を行うゲームオブジェクトのためのスクリプト。
    * Transform4D.cs
        * ゲームオブジェクトに4次元座標を持たせるためのスクリプト。
* [Stereoscopic4D/Assets/Stereoscopic4D/Shaders](https://github.com/scienceagora4dim/Stereoscopic4D/tree/master/Assets/Stereoscopic4D/Shaders)
    * 4次元描画のためのシェーダー

## まとめ

今後も何か要望などがあれば随時取り込んでいきます。この年末年始のお休みに4次元世界に触れてみてください!
eZ Pubilsh レガシーコードの利用方法

https://doc.ez.no/display/EZP/Legacy+code+and+features

## レガシーモード
eZ Publish 5.x の管理画面はレガシーコードのままなので、レガシーモードで実行されています。

* Symfonyカーネルを通して実行されるため、Symfony サービスはレガシースタックからアクセス可能。
* デフォルトのルーターを無効にします（標準のSymfonyルートはこのモードでは動作しません）
* UrlAliasRouterを無効にします。したがって、ViewControllerはバイパスされます。
* レガシーモードは HttpCache 機構を使用しないのでパフォーマンスが低下します。

### Symfonyのルートを有効にする

```yaml
ez_publish_legacy:
    # Routes that are allowed when legacy_mode is true.
    # Must be routes identifiers (e.g. "my_route_name").
    # Can be a prefix, so that all routes beginning with given prefix will be taken into account.
    legacy_aware_routes: ["my_route_name", "my_route_prefix_"]
```

## レガシーテンプレートのインクルード
古いテンプレート（.tpl）を新しいテンプレートにインクルードすることが可能です。

```jinja
{# Twig template #}
{# Following code will include my/old_template.tpl, exposing $someVar variable in it #}
{% include "design:my/old_template.tpl" with {"someVar": "someValue"} %}
```

または、ezpublish_legacyフォルダに相対的なパスでレガシーテンプレートを含める場合は、次のようにします。

```jinja
{# Following code will include ezpublish_legacyextension/my_legacy_extension/design/standard/templates/my_old_template.tpl, exposing $someVar variable in it #}
{% include "file:extension/my_legacy_extension/design/standard/templates/my_old_template.tpl" with {"someVar": "someValue"} %}
```

## レガシーコードの実行
```php
<?php
// Declare use statements for the classes you may need
use eZINI;
 
// Inside a controller extending eZ\Bundle\EzPublishCoreBundle\Controller
$settingName = 'MySetting';
$test = array( 'oneValue', 'anotherValue' );
$myLegacySetting = $this->getLegacyKernel()->runCallback(
    function () use ( $settingName, $test )
    {
        // Here you can reuse $settingName and $test variables inside the legacy context
        $ini = eZINI::instance( 'someconfig.ini' );
        return $ini->variable( 'SomeSection', $settingName );
    }
);
```

## レガシーモジュール
### フォールバックとサブリクエストのルーティング
```
{{ render( url( 'ez_legacy', {'module_uri': '/content/view/sitemap/2'} ) ) }}
```

### レガシーでのeZ Publish 5とSymfonyの機能の使用
```
// From a legacy module or any PHP code running in legacy context.
$container = ezpKernel::instance()->getServiceContainer();
 
/** @var $repository \eZ\Publish\API\Repository\Repository */
$repository = $container->get( 'ezpublish.api.repository' );
/** @var $logger \Symfony\Component\HttpKernel\Log\LoggerInterface|\Psr\Log\LoggerInterface */
// PSR LoggerInterface is used in eZ Publish 5.1 / Symfony 2.2
$logger = $container->get( 'logger' );
```
Unity2D ～貫通床の実装～

#はじめに
スマブラとかにある下からすり抜けられる床が欲しくなりました。

↓こういうやつ
![maxresdefault.jpg](https://qiita-image-store.s3.amazonaws.com/0/156510/9dc79634-537f-2199-723a-4a37828d99e9.jpeg)

#実装
プレーヤーと床のどちらにもscript書きます
##プレーヤー側オブジェクト
（事前にキャラ作って当たり判定追加してるしてるって前提）

プレーヤーのInspectorのTagをPlayerに変更

![shgdfsdh.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/5d26f526-b535-ab04-45a7-a930e9816bc2.png)


プレーヤーにColliderを追加し、接触判定を上3/4に覆いかぶせるように設定します。
追加したColliderのIs TriggerをOnにします。

↓こんな感じ
![gardfgarg.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/3431210f-29d5-2ec8-cd59-389ae5725738.png)

![tryyysy.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/d67f60bd-8df9-12ea-5bed-52b2de88058c.png)


##床側オブジェクト
床を作成してColliderを追加し、接触判定の下3/4に覆いかぶせるように設定します。
追加したColliderのIs TriggerをOnにします。

↓こんな感じ
![grdgagreg.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/6283025c-a134-b434-f587-c1ebf7a7f21d.png)

![tthshsh.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/c8e3728f-82af-dd9d-5232-4454ee829a7d.png)

##床側スクリプト作成
以下を床のオブジェクトに引っ付けましょう

```csharp
public class PassFloor : MonoBehaviour {

    bool setPass;
    BoxCollider2D colliderOfPass;

	// Use this for initialization
	void Start () {
        colliderOfPass = GetComponent<BoxCollider2D>();
	}
	
	// Update is called once per frame
	void Update () {
        
        if (setPass)
        {
            colliderOfPass.enabled = false;
        }
        if (!setPass)
        {
            colliderOfPass.enabled = true;
        }
	}

    //プレイヤーのIsTriggerがOnの側のコリジョンが床のIsTriggerがOnの側のコリジョンと接触している時
    void OnTriggerStay2D(Collider2D col)
    {
        if (col.gameObject.tag == "Player")
        {
            setPass = true;
        }
    }

    void OnTriggerExit2D(Collider2D col)
    {
        if (col.gameObject.tag == "Player")
        {
            setPass = false;
        }
    }
}
```

↓こんな感じです
![sgshhh.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/26ddf68a-4811-95eb-223d-a6eb73428396.png)


##実際の動き
IsTrrigerがOnになっている部分は物理的接触は発生しませんが、
IsTriggerをOnにしているColliderが接触するとOnTrigger...が読み込まれます。
事前に設定したbool変数をOnにして、その間は床のColliderの接触判定を切るって感じです

コンポーネントの読み込み仕様上、colliderOfPass = GetComponent<BoxCollider2D>();で読み込むコンポーネントはBoxCollider2Dが複数ある場合Inspectorの上側から読み込まれるのでIsTrigerがOnになっているコンポーネントは下に配置しましょうね。

これ二人プレイとかを考慮すると駄目な実装ですね・・・
二人プレイを考えたらどういう実装が良いんでしょうね
ETロボコンプロジェクトを円滑にすすめるために①

# 自己紹介

* ETロボコンに4年位関わってる
* 学生、社会人、実行委員と別々の立場で参加したことがある
* 私の正体に感づいている人がいると思うが今回は有益な情報のみ記載するので安心して欲しい

# 今回のAdvent Calendarを見た感想

技術的な工夫やモデルを書く上でのアドバイスが多くて良いと思う。
特にEV3という新しい環境において役立つ情報が多い。

# そんな中で私が伝えたいこと

ETロボコンはプロジェクトである。それは学生でも社会人でも個人でも同じである。
莫大な時間（工数）と体力を消費しながら遂行するものではない。計画的に進められるべきものである。
つまり、テクニカルな手段の前に、見直しておかなければならないことがプロジェクトのマネジメントである。

Advent Calendarが4個余っているので、勉強会まで、地区大会まで、チャンピオンシップ大会まで、チャンピオンシップ大会後の4個に分けてETロボコンをより楽にすすめる方法を伝授しようと思う。

# 常連組織でもメンバは初心者

ETロボコンで常に上位にいる組織（学校、会社）はいる。
しかし、多くのチームの構成は毎年同じではない。サポータになっているとは思うが、実働部隊ではないはずだ。

ではなぜ毎年良い成績を出せるのだろうか？
過去最高の頑張りをしたのにも関わらず良い成績を収められなかった人とチャンピオンシップ大会の壇上で笑顔を浮かべている人の違いはなんだろうか？

私の過去の経験を踏まえて、来年度の参加者に向けてアドバイスをしようと思う。

# 情報収集に制限はない

過去に参加したことがある人やプログラミングに自信がある人に限って、情報収集を怠るケースをよく見る。
また、学校や会社から参加しなさいと言われて渋々参加している人なんかもそうだ。

しかし、ETロボコンの昨年度と今年度は同じだろうか？使用するハードウェアは？プラットフォームは？提出するモデルの形式は？会場の場所は？郵送の宛先は？

ほんの少しでも不確定なことがあるなら、独自勉強会や技術教育に参加すべきだ。
ただAPIをコールしてモータを回転させるだけではない。技術的な相談からETロボコンでやらないといけないことまで相談に乗ってくれる黄色いTシャツを来た実行委員が待ち構えているだろう。

もちろん、移動費の問題や予定が合わないことがあるだろう。
そういうときは他チームへコンタクトを取ったり、メーリングリストで質問するべきだ。
知らぬことは恥ではない。成長の伸びしろである。

わからないことは調べる、聞く。不安なところは相談する。
これはETロボコンに限らず、人間社会で生きていく上でもっとも重要なことである。

求めよ。さらば与えられん。

私がETロボコン参加者だった時は、GoogleでETロボコンのキーワードに引っかかる資料を片っ端から調べていた。
また、勉強会・懇親会にも参加してネタの仕入れも行った。
楽をするために多くの苦労をしたが、ゴールを明確にしないまま動き始めるよりは随分楽だったと思う。

やらなくていいことはやらない。やらなければならないことは手短に。

有限なリソースの中で渋ってはいけないものは準備である。

# 何を収集していいかわからない人へ

ETロボコンに初めて参加し、右も左も分からない人は少なくない。
過去のノウハウもなければ周りに有識者がいない場合もある。

そんな人はまずETロボコンの動画を見ると良いだろう。
2輪で倒立走行しているレゴブロックのおもちゃが走っている映像を見ることが出来るはずだ。

あなたが作り上げるものはそれだ。
布の上で黒い線の上を走り、時には木の板に登って回転し、物体を華麗に避けながら動くそれを作るのだ。
そして、それがどのようなシステムなのか、どのような原理で動いているかをA3サイズ5枚の紙に説明するのだ。

さあ、作って説明するのに必要なものはなにがある？
必要なハードウェアは？ソフトウェアを動かす環境は？どんな言語で動いてるの？いつどんなイベントがあるの？いつまでに何を作らないといけないの？どのようなフォーマットで説明すればいいの？

参加者登録をすると、[ETロボコンのHP][]の参加者ページから過去の参加者の資料を得ることが出来る。
動画と合わせて、何を説明しているのかサンプルにするといい。
しかし、あくまでサンプルであり過去のものである。あなたが作るものとは異なっている。
ただし、あなたが作りたいものの一助にはなるはずだ。

[ETロボコンのHP]: http://www.etrobo.jp

# 最後に

本記事は、ETロボコン初心者向けに必要最低限の心構えを伝える位置づけである。
次の記事では、地区大会までにやることやマネジメントについて説明しよう。
eZ Publish 5.x 標準フィールドタイプ一覧


https://doc.ez.no/display/EZP/FieldTypes+reference

フィールドタイプ|説明|検索対象
---|---|---
Author	|Field type used to store a list of authors, consisting of author name, and author email.	|No.
BinaryFile	|Field type used to store a file.	|Yes.
Checkbox	|Field type which stores boolean values.	|Yes.
Country	This field type stores country names as a string.	|Yes.
DateAndTime	Field type used to store a full date including time information.	|Yes.
Date	|Field type used to store a date information.	|Yes.
EmailAddress	This field type is used to validate and store an email address.	|Yes.
Float	|Field type used to validate and store a decimal value.	|No.
Image	|Field type used to validate and store an image.	|No.
Integer	|Field type which validates and stores an integer value.	|Yes.
ISBN	|Handles International Standard Book Number (ISBN) in 10-digit or 13-digit format.	|Yes.
Keyword	|Field type used to store keywords.	|No.
MapLocation	|Field type used to store map coordinates.	|Yes, with MapLocationDistance criterion.
Matrix	|Available via community Bundle: https://github.com/ezcommunity/EzMatrixFieldTypeBundle	 
Media	|Validates and stores a media file.	|No.
Null	|This field type is used for fallback for missing field types and for testing purposes.	|No.
Page	|Field type used to manage display zones and blocks in a page (formerly known as eZ Flow datatype).	|No.
Price	|Available via community Bundle: https://github.com/ezcommunity/EzPriceBundle	 
Rating	|Field type which stores a rating.	|No.
Relation	|Field type which validates and stores a relation to a content item.	|Yes, with both Field and FieldRelation criterions.
RelationList	|Field type that validates and stores a list of relations to content items.	|Yes, with FieldRelation criterion.
Selection	|Field type which validates and stores a single selection or multiple choices from a list of options.	|Yes.
Selection2	|Available via community Bundle: https://github.com/netgen/NetgenEnhancedSelectionBundle	 
Tags	|Available via community Bundle: https://github.com/netgen/TagsBundle	 
TextBlock	|Validates and stores a larger block of text.	|No.
TextLine	|This field type validates and stores a single line of text.	|Yes.
Time	|Field type used to store a time information.	|Yes.
Url	|Field type used to store an URL / address.	|No.
User	|Field type that validates and stores information about a user.	|No.
XmlText	|Field type that validates and stores multiple lines of formatted text..	|Yes.
shellの仕組み

#bashのコマンド整形
bushは受け付けた文字列を直接OSに渡さず，まずbash自身が文字列を解釈

変数の展開の例

```
$ echo $LANG
en_US.UTF-8
```

bashによる解釈が済んだコマンド文字列を表示してから実行

```
$ sh -x -c "echo $LANG"
+ echo en_US.UTF-8
en_US.UTF-8
```

#コマンド呼び出しとは，サブプロセスの生成
pstreeコマンドそのものは，bashというプロセスの子プロセス
つまり，シェルからのコマンド呼び出しはすべてbashの子プロセスの生成

親プロセスから子プロセスに変数を渡すには環境変数利用

- シェル変数:サブプロセスでは無効
- 環境変数:サブプロセスでも有効

http://language-and-engineering.hatenablog.jp/entry/20110617/p1
eZ Publish 5.x の小技

## eZ Publish 4.x モジュール経由で Symfony サービスを呼び出す
```php
$Module = $Params['Module'];
$Result = array();
 
$container = ezpKernel::instance()->getServiceContainer();
/** @var \Acme\TestBundle\Controller\AdminController $controller */
$controller = $container->get( 'my.admin.controller' );
$Result['content'] = $controller->myAdminAction( 'blabla' )->getContent();
```

詳細はこちら: https://gist.github.com/lolautruche/5694727

## サイトアクセスから設定を取得
```php
$configResolver = $this->container->get( 'ezpublish.config.resolver' );
$rootLocationId = $configResolver->getParameter( 'content.tree_root.location_id' );
```