OmniAICreator/Qiita-1.07M huggingface dataset:
PMBOKの知識エリアとプロセス


# PMBOK第5版の知識エリアとプロセス

PMBOKのプロセス定義は以下のようにたくさんあります。

| 知識エリア＼プロセス群 | 立ち上げプロセス群 | 計画プロセス群 | 実行プロセス群 | 監視・コントロールプロセス群 | 終結プロセス群 |
|:-----------:|:------------|:------------|:------------|:------------|:------------|
| プロジェクト統合マネジメント |[プロジェクト憲章作成](http://qiita.com/kenji-yokoi/items/e4f7a326b9c3f5bc7327)|[プロジェクトマネジメント計画書作成](http://qiita.com/kenji-yokoi/items/e6867b873a4062a1c354)|プロジェクト作業の指揮・マネジメント|プロジェクト作業の監視・コントロール<br/>統合変更管理|プロジェクトやフェーズの終結|
| プロジェクト・スコープ・マネジメント ||要求事項収集<br/>スコープ・マネジメント計画<br/>スコープ定義<br/>WBS作成||スコープ妥当性確認<br/>スコープコントロール||
| プロジェクト・タイム・マネジメント ||スケジュール・マネジメント計画<br/>アクティビティ定義<br/>アクティビティ順序設定<br/>アクティビティ資源見積<br/>アクティビティ所要時間見積スケジュール作成||スケジュール・コントロール||
| プロジェクト・コスト・マネジメント ||コスト・マネジメント計画<br/>コスト見積<br/>予算設定||コスト・コントロール||
| プロジェクト品質マネジメント ||品質マネジメント計画|品質保証|品質コントロール||
| プロジェクト人的資源マネジメント ||人的資源マネジメント計画|プロジェクト・チーム編成<br/>プロジェクト・チーム育成<br/>プロジェクト・チーム・マネジメント|||
| プロジェクト・コミュニケーション・マネジメント ||コミュニケーション・マネジメント計画|コミュニケーション・マネジメント|コミュニケーション・コントロール||
| プロジェクト・リスク・マネジメント ||リスクマネジメント計画<br/>リスク特定<br/>定性的リスク分析<br/>定量的リスク分析<br/>リスク対応計画||リスク・コントロール||
| プロジェクト調達マネジメント ||調達計画|調達実行|調達管理|調達終結|
| プロジェクト・ステークホルダー・マネジメント |[ステークホルダー特定](http://qiita.com/kenji-yokoi/items/25efd13889123e392998)|ステークホルダー・マネジメント計画|ステークホルダー・エンゲージメント・マネジメント|ステークホルダー・エンゲージメント・コントロール||

# 最適化の間違い

いつもこれだけの事をしていられないのはPMBOKもわかっていることですので、テーラリング(最適化)しようと言っています。ただ、「それじゃぁコスト・マネジメントを丸っとやめよう」という訳ではないと思います。
PMBOKはプロセスとして体系化しているだけで、その実現手段については自分たちで最適な手法を組み合わせる必要があります。そういったツールは日々新しいものが出てきますし、プロジェクトの要求が高ければ手の込んだツールを使う必要がありますし、短期で規模が小さければそれこそテキストの記述だけでも良いでしょう。
丸っとやめてしまうのは、それを考えないことになってしまいます。考えた結果、リスクが無いのでリスクマネジメントしませんっていう事ですよね。ただ、プロジェクトの流れは生モノなので監視や立ち戻ることも必要ですけどね。

# PMBOKのライフサイクル

PMBOKのそれぞれのプロセスはプロジェクト全体で一周分のライフサイクルではありません。
もちろん全体を流布する形で大きく一周としてのマネジメントがありますが、フェーズ毎にマネジメントを回す必要があります。終結プロセスで「プロジェクトや**フェーズの終結**」となっているのはフェーズ単位でイテレーションしようという意味です。大きなプロジェクトの中には小さなプロジェクトが存在するわけです。
「自工程完結」という言葉がありますが、後工程に回すときは、自分の工程で達成すべきことは達成していかなければいけません。

![cicle.png](https://qiita-image-store.s3.amazonaws.com/0/114529/ee53c52e-5891-4846-238b-4759ef36a74b.png)
React と Riot.js の書き方の比較

## はじめに

比較のために同じものを React と Riot.js で実装します。
table タグを生成し、3000行の内容を表示します。

## Riot.js

JSFiddle https://jsfiddle.net/ryohey/v5ytp918/

```js:main.js
// ここは共通

const data = []

for (var i = 0; i < 10000; i++) {
  data.push({
    name: `test data ${i}`,
    key: i
  })
}

// 

riot.mount('testtable', {rows: data, start: new Date})
```

```text:testtable.tag
<testtable>
  <table>
    <thead>
      <tr>
        <td>key</td>
        <td>name</td>
      </tr>
    </thead>
    <tbody>
      <tr each={opts.rows}>
        <td>{key}</td>
        <td>{name}</td>
      </tr>
    </tbody>
  </table>
  this.on("updated", () => {
      console.log(`${(new Date) - this.opts.start} millisec`)
  })
</testtable>
```

## React

JSFiddle https://jsfiddle.net/ryohey/rvLxnnyo/

```jsx:main.jsx
// ここは共通

const data = []

for (var i = 0; i < 10000; i++) {
  data.push({
    name: `test data ${i}`,
    key: i
  })
}

//

ReactDOM.render(
  <Table rows={data} start={new Date} />,
  document.getElementById('container')
)
```

```jsx:table.jsx
const Table = React.createClass({
  render: function() {
    const elements = this.props.rows.map(d =>
      <tr key={d.key}>
        <td>{d.key}</td>
        <td>{d.name}</td>
      </tr>
    )
    return <table>
      	<thead>
        <tr>
          <td>key</td>
          <td>name</td>
        </tr>
      	</thead>
        <tbody>
          {elements}
        </tbody>
      </table>
  },
  componentDidMount: function() {
    console.log(`${(new Date) - this.props.start} millisec`)
  }
})
```

## 書き方の比較

### Riot.js

#### データの受け渡し

`riot.mount('testtable', {rows: data, start: new Date})`
第二引数で渡します。

タグの中で `opts` として参照します。
(入れ子のカスタムタグの場合にはタグの属性として渡すこともできます)

#### ループ

`<tr each={opts.rows}>` でループを行います。

### React

#### データの受け渡し

`<Table rows={data} start={new Date} />`
タグの属性として渡します。

クラス内では `this.props` として参照します。

#### ループ

要素の配列を作ってタグの中に展開します。

```jsx
const elements = this.props.rows.map(d =>
  <tr key={d.key}>
    <td>{d.key}</td>
    <td>{d.name}</td>
  </tr>
)
...
render: function() {
...
<tbody>
  {elements}
</tbody>
```

## 実行速度

React: 2320 millisec
Riot.js: 2744 millisec

リロードするとまちまちの時間が出力されますが、概ね React の方が速いようです。
中身も含めてレンダリングが終わるまでの時間を調べるために、React は `componentDidMount` を、Riot.js は `updated` を使っています。(ちなみに `updated` は `mount` とほぼ同時でした)

## 所感

React.js と Riot はカスタムタグ (コンポーネント) を記述する場所の違いはありますが、`<table>` あたりのタグの書き方はどちらも素の HTML のように書くことができました。

ループ処理においては、Riot.js の方が直感的に記述できると思いました。

Riot.js は HTML を中心とした考え方なので、テンプレートを使ったことがあるデザイナーなどの方に馴染みやすく、React は js を中心とした考え方なのでエンジニア向きかなと思いました。

私自身は HTML 的な処理と見た目の分離の考え方に慣れていたので、JSX の書き方や props や state に馴染めず　React で作っていた趣味プロジェクトを Riot.js に移しましたが、今回できるだけ同じようにそれぞれ書いて比較したことで、わりと似た感じで書けることに気づき、綺麗に書けば保守性はどちらでもあまり変わらないと思いました。

実行速度に関しては、今回は最初のレンダリングの速度比較だけで、データ更新時の速度比較を行っていないのでまだ調査が必要だと思いました。ただ、React は props.key を使ってデータを識別できるので速そうな気がします。

## おわりに

どっちも2秒以上かかってるので、巨大なテーブルを表示するサイトはそもそもサーバーサイドレンダリングすべきかもしれません。
私は Electron でファイルを読み込んで表示するアプリを作ることが目的なので、どうしたらいいやら・・・
Javaのprivateフィールドのアクセス権について

# 疑問
equals()をオーバーライドした時に、
なぜ、引数のprivateフィールドを読めるのか？

```java:Food.java
public class Food {
    // ===privateなのに===
    private final Double TAX = 1.08;
    private String name;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Food)) return false;

        Food food = (Food) o;

        // ===引数oのprivateフィールドに直接アクセス出来るの？？===
        return name != null ? name.equals(food.name) : food.name == null; 
    }
}
```

**この疑問を実験してみました！！！！**

# 実験１：privateフィールドって本当にアクセスできないの？
他のクラスでアクセスしてみましたが、
こちらはコンパイルエラーなので、
しっかり**アクセスできません**でした。

```java:CompileError
public class OtherClass {
    public static void main(String[] args) {
        Food tomato = new Food("トマト", 7, 100);
        tomato.printInfo();

        tomato.name = "違う名前";
        System.out.println(tomato.name); //コンパイルエラー
    }
}

```

# 実験２：もしかしてequals()だけなのか？
同じクラスにmain()を作成し、実行してみた。
こちら**実行できた**ので、
どうやらequals()だけではないようです。

```java:Food.java
public class Food {
    private String name;

    public Food(String name) {
        this.name = name;
    }

    public static void main(String[] args) {
        Food tomato = new Food("トマト", 7, 100);

        tomato.name = "違う名前";
        System.out.println(tomato.name); //違う名前
    }
}
```

# 実験３：main()も特殊なメソッドだろうが(# ﾟДﾟ)
普通のメソッドでも
同様に**アクセスできました**

```java:Food.java
public class Food {
    private String name;

    public Food(String name) {
        this.name = name;
    }

    public void changeName(Food otherFood, String name) {
        otherFood.name = name;
    }

    public String getName() {
        return name;
    }
}
```
```java:OtherClass.java
public class OtherClass {
   public static void main(String[] args) {
        Food food = new Food("tomato");
        food.changeName(food, "違う名前");
        System.out.println(food.getName()); // 違う名前
    }
}
```


# 結論
他のインスタンスでも、同じクラス内ならprivate fieldでも読めるし、書き変えも可能みたいです。
これはそのクラスが持つmainでも普通のメソッドでも同じようです。

ただし、危険な臭いがするので、
equals()以外で他のインスタンスのprivateフィールドにアクセスするのは
やめた方が良さそうです。
suz-lab CentOSでUserDataを使用する時のメモ

こんにちは、ひろかずです。
suz-lab CentOSでインスタンス起動時にUsarDataに仕込んだスクリプト(Deep Securityを自分で有効化する)を実行させる際に、意外とハマったのでメモを残します。

#参考情報
かっぱさんのブログ：本事象を理解し、切り分ける上で非常に助けになりました。
[いまさらで恐縮ですが cloud-init について勉強する（1）](http://inokara.hateblo.jp/entry/2015/11/14/105727)

Developers.IO：こちらも非常に助かりました
[Amazon Linuxのcloud-initの動きについて調べてみた](http://dev.classmethod.jp/cloud/aws/probe-cloud-init/)

Developers.IO：よく纏まっていて、参考になります。
[cloud-initのデフォルト挙動を徹底的に調べてまとめてみた -結果ソースコードを読んだ-](http://dev.classmethod.jp/cloud/aws/cloud-init-cfg/)

#実行環境
suz-lab_centos-core-6.6-HVM (ami-e6c5c9e7)

#何が必要だったか
##ユーザ
`useradd syslog -g adm -s /sbin/nologin`

ユーザがないと、こんな感じに怒られます。

```
# less /var/log/cloud-init-output.log
:
Cloud-init v. 0.7.5 running 'init-local' at Fri, 22 Apr 2016 07:44:22 +0000. Up 948.21 seconds.
2016-04-22 16:44:22,057 - util.py[WARNING]: Unable to change the ownership of /var/log/cloud-init.log to user syslog, group adm
:
```

##cloud-initの起動順序
cloud-init関連の起動順序をAmazon Linuxと同じにしました。

▼ before

```
# ls -l /etc/rc3.d/ | grep cloud
lrwxrwxrwx  1 root root 22  4月 23 07:23 2016 K50cloud-config -> ../init.d/cloud-config
lrwxrwxrwx  1 root root 26  4月 23 07:23 2016 K50cloud-init-local -> ../init.d/cloud-init-local
lrwxrwxrwx  1 root root 21  4月 23 07:23 2016 S50cloud-final -> ../init.d/cloud-final
lrwxrwxrwx  1 root root 20  4月 23 07:23 2016 S50cloud-init -> ../init.d/cloud-init
```

▼ after

```
# ls -l /etc/rc3.d/ | grep cloud
lrwxrwxrwx  1 root root 26  4月 23 07:23 2016 S50cloud-init-local -> ../init.d/cloud-init-local
lrwxrwxrwx  1 root root 20  4月 23 07:23 2016 S51cloud-init -> ../init.d/cloud-init
lrwxrwxrwx  1 root root 22  4月 23 07:23 2016 S52cloud-config -> ../init.d/cloud-config
lrwxrwxrwx  1 root root 21  4月 23 07:23 2016 S98cloud-final -> ../init.d/cloud-final
```

今回はいろいろ勉強になりました。
筋トレ大好きな文系女学生のJava入門_カプセル化_privateとpublic

#はじめに
最近、バイト先や通ってる施設などでコミュニケーション取る機会が増えて嬉しいです :sob: :sob: 
「変わってる」とか「なんか面白いよね〜」といった言葉をよく言われます・・。笑
バイト始める以前は、家で何かして夕方からスポーツジム行くを毎日繰り返していたので、１日のうちに人と話すことが０の時もありました笑
なので、コミュニケーション取ることってマジでホンマに重要なんだな〜と心から強く思いました :heart: 

今回はアクセス制御privateとpublicについてです。
独学でやってるので、「これはJavaやっていくにあたって役に立つ知識だぞ！！」というのがあれば、コメントして頂けるととても嬉しいです :heart: :heart: 


##アクセス制御
Javaでは、メンバ（フィールドやメソッド）に対してアクセス制御の設定を行うことができる。
だけど、それぞれのメンバに「MuscleBoyクラス、MuscleGirlクラスからの利用は許す」「Proteinクラス、Trainerクラスからの利用は許す」のように細かく指定するのは面倒くさい！そこで、下の表にあるpublicやprivateといった***アクセス修飾子***をメンバの前で宣言することで、アクセス制御が可能になる :v: :grin: 

![スクリーンショット 2016-04-24 10.21.08 AM.png](https://qiita-image-store.s3.amazonaws.com/0/105719/98fd5853-9261-2ae0-8a19-7fac23ee2151.png)

>　　【フィールドのアクセス制御】
アクセス修飾子　フィールド宣言;

>　　【メソッドのアクセス修飾子】
アクセス修飾子　メソッド宣言{...}

###privateを利用
[筋トレ大好きな文系女学生のJava入門_カプセル化の目的＆メリット](http://qiita.com/amippy/items/6d2f56881801d1521a8c)では、筋肉ボーイのHPが-100になってしまう大変な事態が起こってしまった。そこで、他のクラスから筋肉ボーイのHPを変更されないようhpフィールドにprivate宣言をする。

```java
1 public class MuscleBoy{
2  private int hp;
3  String name;
4  static int money;
5
6  void sleep(){
7   this.hp = 100;
8   System.out.println(this.name + "は、寝て体力を回復した！！");
9  }
10}
```

hpフィールドにprivateを指定したため他のクラスでhpフィールドを変更した場合、「hpフィールドへはアクセスできない」というコンパイルエラーが発生する。
しかし！！筋肉ボーイのHPが一切変更することができなというわけでは***ない！***

privateなフィールドであっても、「this」を用いたsleepメソッドのように、同じクラスのメソッドからであればhpフィールドの値を変更することができるのだ :exclamation: 


####publicやpackage privateを利用

筋肉ボーイは生けた芸術作品である筋肉を鍛えることがお仕事であるため、いろいろなクラスから呼び出せるように、workOutメソッドにpublic宣言をする。

```java
1  public class MuscleBoy{
2    private int hp;
3    String name;
4    static int money;
5
6    void sleep(){....}
7
8    public void workOut(){
9      this.hp -= 10;
10     System.out.println(this.name + "は、筋トレをした！");
11     System.out.println("-10ポイントHPが減少した！");
12   }
13 }
```

sleepメソッドにはpublicを付けないままにしている。この場合、sleepメソッドはpackage privateを指定したとみなされ、同じパッケージに所属するクラスからのみ呼び出しが可能 :exclamation: :exclamation:
コマンドライン上で音声信号処理をやってみる


SPTK（Speech Signal Processing Toolkit）と言うコマンドライン上で音声信号処理ができるツールキットがあります。
約120個のコマンドが提供され、FFTやLPC分析など基本的な音声信号処理をコマンドの組み合わせで簡単に行うことができます。  
SPTKのMacへの導入手順と簡単な使い方をまとめました。

##導入手順

1. SPTKの[公式サイト](http://sp-tk.sourceforge.net/)からSPTK-3.9.tar.gzをダウンロードします。
2. ダウンロードしたフォルダ内で以下のコマンドを実行します。

```sh
tar xvzf SPTK-3.9.tar.gz
cd SPTK-3.9
./configure
make
sudo make install
```

3.特にエラーが出なければこれでインストール完了です。

##使い方
サンプルとして[公式サイト](http://sp-tk.sourceforge.net/)からダウンロードできるデータ(SPTKexamples-data-3.5.tar.gz)を使って簡単な使い方をまとめます。
この中のdata.shortが音声データです。ファイル形式はraw形式と言うもので、これは一般的なwavファイルからヘッダ情報を取り除いたものになっています。
raw形式の音声データはPraatなどのフリーソフトで再生することが出来ます。

###波形の表示
dmpコマンドで信号の振幅を出力できます。オプションで指定している「+s」は振幅ががshort型であることを表しています。

```sh
dmp +s data.short | less
```

波形のグラフ表示はgwaveコマンドで行います。
「-s」で指定したポイントから「-e」で指定したポイントまでを表示します。
「-i」で表示するグラフの行数を指定できます。

```sh
gwave +s data.short -s 100 -e 10000 -i 1 | xgr
```
CloudAtCostのDISKの遅さを少しでも早くする

## swapあまりさせなくする

```bash:/etc/sysctl.conf
vm.swappiness = 1
```

`sysctl -p`

## ext4のジャーナルをwritebackにする

* [CentOS ファイルシステム ( ext4 )](http://www.unix-power.net/linux/ext4.html)

* debian8の場合

```bash:/デバイスのwritebackを有効
tune2fs -o journal_data_writeback /dev/mapper/localhost--vg-root
```

```diff:/etc/fstab
- /dev/mapper/localhost--vg-root / ext4    errors=remount-ro 0       1
+ /dev/mapper/localhost--vg-root / ext4    errors=remount-ro,data=writeback,noatime,nobh,discard 0       1
```

* ubuntu14.04.1の場合

```bash:/デバイスのwritebackを有効
tune2fs -o journal_data_writeback /dev/mapper/CAC_VG-CAC_LV
```

```diff:/etc/fstab
- /dev/mapper/CAC_VG-CAC_LV / ext4    errors=remount-ro 0       1
+ /dev/mapper/CAC_VG-CAC_LV / ext4    errors=remount-ro,data=writeback,noatime,nobh,discard 0       1
```

* reboot

## tmpfsの活用

```diff:/etc/fstab
- /dev/mapper/localhost--vg-swap_1 none            swap    sw              0       0

+ tmpfs  /tmp  tmpfs  defaults,noatime  0  0
+ tmpfs  /var/tmp  tmpfs  defaults,noatime  0  0
+ tmpfs  /var/cache/apt/archives  tmpfs  defaults,noatime  0  0
```

## HPETをon

```diff:/etc/default/grub
- GRUB_CMDLINE_LINUX=""
+ GRUB_CMDLINE_LINUX="clocksource=hpet"
```

```bash:
update-grub2
```

## その他

```bash:diskベンチマーク
dd if=/dev/zero of=a.tmp bs=512M count=5 oflag=direct; rm a.tmp
```

```bash:preloadインストール
apt-get install preload
```

```bash:open-vm-tools-dkmsインストール
apt-get install open-vm-tools-dkms
```
Vagrant + Node.js + CentOS7 環境構築


少し時間が取れるようになったので、前から気になっていたNode.jsについて試してみようと思ったが、Vagrantのバージョンが古かったりで、環境構築に悪戦苦闘したのでそのメモ。

## 作業環境
■前提
VirtualBox, Vagrantインストール済み

■環境
OS:OSX10.10.5(Yosemite)
VirtualBox:4 → 5.0.18 (変更前忘れ) 
Vagrant:1.6 → 1.8.1
ゲストOS:CentOS7
Node.js:v5.11.0
nvm:0.31.0



## VirtualBox, Vagrantのバージョンアップ
NodejsからprivateIPでアクセスするため下記設定にする。(privateIPは任意)

```Vagrantfile
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos7.0"
  config.vm.network "forwarded_port", guest: 1337, host: 1337
  config.vm.network "private_network", ip: "192.168.33.11" 
end
```

ってのっけからエラーか。。。
Vagrantfileにprivate_network指定を外すとエラーなし。
デバイス関連でエラー、調べてみるとCentOS7よりアダプタ名がeth0からenp0s8などに変わっていたためであった。
(無理やり？)enp0s8でvagrant upする方法、バグ対応プラグインインストールしたが起動せず。
Vagrant入れたのがCentOS7リリースされる前だったからだなと思い、バージョンアップで解決。
バージョンアップ方法は、
各サイトより最新版ダウンロードし、インストールするのみです。
[[Qiita]Mac で vagrant をバージョンアップする](http://qiita.com/satoshi_iwashita/items/7791b9e2c64dd660a13d)を参考にさせて頂きました。



## nvmでNode.jsインストール
Node.jsのバージョン管理ツール。バージョンの切り替えするやつすね。rubyのrbenv版ですね。nvmを利用してNode.jsインストールします。
(nvm:Node Version Manager)

```cmd
$ vagrant up
$ vagrant ssh

−−仮想マシン−−
$ git clone https://github.com/creationix/nvm.git ~/.nvm
$ source ~/.nvm/nvm.sh
$ nvm help
$ nvm list-remote /* show Node.js version list */
　：
$ nvm install v5.11.0
$ nvm ls
->      v5.11.0
default -> v5.11.0
node -> stable (-> v5.11.0) (default)
stable -> 5.11 (-> v5.11.0) (default)
iojs -> N/A (default)

$ nvm alias default v0.10.26 /* default Node.js setting */

$ vi ~/.bash_profile

if [[ -s ~/.nvm/nvm.sh ]];
 then source ~/.nvm/nvm.sh
fi
```

[[Qiita]centos + node.js + npm + nvm インストール](http://qiita.com/akippiko/items/3708016fc43da088021c)を参考にさせて頂きました。


## Node.jsでhello world!

```cmd
$ node
> console.log("hello world!");
hello world!
```
ふむふむ。

## ブラウザからhello world!
仮想マシン上の適当な場所にhello.jsを配置。


```Javascript:hello.js
// HTTPパッケージを読み込み
var http = require('http');

// WebServerObjectを作成
var server = http.createServer();
// HTTP RequestがあったらdoRequestで処理
server.on('request', doRequest);
// リクエストを受け取るポートを指定
server.listen(1337);
console.log('Server running!');

// リクエストの処理
function doRequest(req, res) {
    // ヘッダー
    res.writeHead(200, {'Content-Type': 'text/plain'});
    // 出力
    res.write('hello world!\n');
    // 終了
    res.end();
}
```

```cmd
$ node hello
Server running!
```

これで待ち受け状態ね。

mac側ブラウザ 
192.168.33.11:1337 にアクセス不可。。。localhost:1337 ももちろんダメ。
おう！なにも反応しないやんけ。

## ブラウザからのアクセス不可対応


1, 仮想マシン側firewallの設定を無効にする。

```cmd
$ sudo systemctl stop firewalld
```


2, Vagrantfileのforwarded_portにidを指定する。
Vagrant側のサイトにidの利用について記載ないので、詳細は不明。
ただデフォルトでsshのportをforwardするのから重複してだめなのかな？
変更前
`config.vm.network "forwarded_port", guest: 1337, host: 1337`
変更後
`config.vm.network "forwarded_port", guest: 1337, host: 1337, id:"http"`

---
ブラウザからアクセス・・・

hello world!

表示！192.168.33.11:1337 も localhost:1337 もOKだったよ。

okidoki.
THETA Sを使ってYouTubeで360度ライブストリーミングする方法

#THETA UVC Blenderのセットアップ
下記のライブストリーミング用アプリから自分のPC環境に合わせたアプリをダウンロードして、セットアップします。
https://theta360.com/ja/support/download/

#ライブストリーミングエンコーダのセットアップ
YouTube推奨のライブストリーミングのいずれかをダウンロードして、セットアップします。僕はWirecast Playを使っています。
https://support.google.com/youtube/answer/2907883?hl=ja

#YouTubeでライブストリーミングのイベントを作成
1.YouTubeでログインし、「アップロード」ボタンをクリックした後に、ライブストリーミングの「始める」ボタンをクリックします。
![FireShot Capture 1 - アップロード - YouTube - https___www.youtube.com_upload.png](https://qiita-image-store.s3.amazonaws.com/0/91936/3bd5e8a6-dfc6-7625-d317-7ee11cfce98b.png)

2.ライブストリーミングのメニューを「今すぐ配信」から「イベント」に切り替えます。
![FireShot Capture 2 - ライブイベント - YouTube - https___www.youtube.com_my_live_events.png](https://qiita-image-store.s3.amazonaws.com/0/91936/6abf3aae-a424-eed4-23c5-21f8cd6572b9.png)

3.「新しいライブイベント」ボタンをクリックして、「基本情報」タブでタイトルや説明、開始時間を設定します。
![FireShot Capture 6 - ライブイベント - YouTube - https___www.youtube.com_my_live_events.png](https://qiita-image-store.s3.amazonaws.com/0/91936/b33211f9-efe1-d9d6-c9c7-66977df3ae7f.png)

4.「詳細設定」タブをクリックして、360°動画の 「このライブ ストリームは 360° です」のチェックをクリックします。
![FireShot Capture 3 - 新しいイベントを作成 - YouTube_ - https___www.youtube.com_my_live_events.png](https://qiita-image-store.s3.amazonaws.com/0/91936/09173f40-ec41-be97-220b-653b624af267.png)
![FireShot Capture 4 - 新しいイベントを作成 - YouTube_ - https___www.youtube.com_my_live_events.png](https://qiita-image-store.s3.amazonaws.com/0/91936/46b11824-2d47-9ef3-0edb-95ece12f8c30.png)


5.以上を完了後、「予定を作成」ボタンをクリックします。

#THETA Sをライブストリーミングモードで起動
THETA Sの「カメラ」ボタンを押しながら、「電源」ボタンを押し、ライブストリーミングモードで起動します。成功すると、THETA Sの前面に「Live」マークが点灯します。
https://theta360.com/ja/support/manual/s/content/streaming/streaming_01.html

#エンコーダーでライブストリーミングを配信
セットアップしたエンコーダーにTHETA Sを接続し、「THETA UVC Blender」をカメラとして追加します。
Wirecast Playでは「ストリーム」ボタンをクリックして、YouTubeアカウントを認証し、ライブストリーミングを開始します。

#360度ライブストリーミング例
こんな感じに公開されます。
https://youtu.be/lkUI7vH8BYs
npmの-gをローカルユーザのディレクトリで管理する

npmのアップデートなどで、よく`npm update -g npm`と`sudo`を付け忘れて実行してしまい、何故かnpmが使えなくなることが良くありました。

ここのところ、golangの`go get`コマンドを使うために、GOPATHを以下のように設定するよう、`.bashrc`に書いていました。

```bash:.bashrc
if [ -e $HOME/golang ];then
	export GOPATH=$HOME/golang
	export PATH=$GOPATH/bin:$PATH
fi
```

このようにgolangでは、外部ライブラリのディレクトリをユーザディレクトリに全て持つことができます。これと同じことを、npmでできないかと思い調べました。

* [config | npm Documentation](https://docs.npmjs.com/misc/config#prefix)

公式Documentによると`prefix`がそのようです。これを`/Users/yourname/npm`に設定します。

```
$ npm config edit
prefix=/Users/yourname/npm
```

`npm config edit`を使うと、`~/.npmrc`に設定を追加することができます。また、`$HOME/npm`は使えず、`~/npm`とすると自動で上記に書き換えられました。

また、`$home/npm/bin`へパスを通すようにします。

```:.bashrc
if [ -e $HOME/npm/bin ];then
	export PATH=$HOME/npm/bin:$PATH
fi
```

これで、npmをインストールします。`sudo`は付けません。

```
$ npm install -g npm
```

これで、npmコマンドのパスを確認すると、ユーザディレクトリになります。

```
$ which npm
/Users/yourname/npm/bin/npm
```

これで以後、`npm install -g packagename`に`sudo`を付ける必要はなくなりました。やったね。
HTML,CSS勉強メモ #20 ～絶対パスと相対パス～

ずっとレッスンの内容ばかり見ていたらすっかり忘れてました・・・

##**メモ**##

###それぞれの違い
<dl>
<dt>絶対パス</dt>
<dd>目的のファイルのアドレスを省略せずに全部書いて指定する方法</dd>
<dd>（例）link href="C:/Users/Desktop/bootstrap/css/bootstrap.min.css"</dd>
<dt>相対パス</dt>
<dd>現在のファイルから見て目的のファイルまでの道筋を書いて指定する方法</dd>
<dd>（例）link href="../bootstrap/css/bootstrap.min.css"</dd>
</dl>

###相対パスの指定方法

起点となるフォルダ   ｢.」
上位フォルダ       「..」
区切り記号　       「/」(スラッシュ) UNIX系のOS、「\」MS-DOSやWindows(日本語では｢￥｣も可)

レッスンと違うところにBootstrapを保存していて、指定方法を間違えていました。
また忘れるかもなのでメモっときます。
エンジニア（Vimmer）のためのiKnow!

【2017-08-19追記　現時点でも仕様は変わっていません。】

# 背景
英語学習で英語（語学）学習アプリ「[iKnow!](http://iknow.jp/home)」を利用しています。単語の学習を繰り返しさせてくれるのでかなり重宝しています。
私は基本的に英単語の学習に利用しています。
そして利用には基本スマホのアプリを利用するのですが、時折PCで作業をすることをもあります。
その際、キーボードだけで（できればカーソルキーを使わずに）利用したいなと思っていたら、ホームポジションから動かさなくても作業が完結できることを発見したので書きます。（ググったけど、同様の使い方を書いてる記事は見つからなかったので）

# 目的
* 「iKnow!」をキーボード（カーソルキー除く）だけで完結させる術を記載する

# 記載されているショートカットキー
![スクリーンショット 2016-04-24 8.43.07.png](https://qiita-image-store.s3.amazonaws.com/0/29764/860b9170-a3d4-396f-58e2-4bccf3d3b90b.png)
これだけだと、カーソルキーを使うのが比較的めんどくさい。。。

# 発見したキー
|キー|操作|
|---:|---|
|h|解答解説時に左へ移動<br>センテンス画面で左へ移動|
|j|下の選択肢を選択<br>センテンス画面を閉じる<br>センテンス画面で左へ切り替え|
|k|上の選択肢を選択<br>センテンス画面を開く<br>センテンス画面で右へ切り替え|
|l|解答解説時に左へ移動<br>センテンス画面で左へ移動|
|\<tab\>|解答解説時に右へ移動|
|\<shift\>+\<tab\>|解答解説時に左へ移動|

# 操作方法画像
## 選択肢
![selectAnswer.png](https://qiita-image-store.s3.amazonaws.com/0/29764/ed1828a7-497a-c202-d11c-9c2971e7a8f8.png)
## センテンス表示
![sentenceOperation.png](https://qiita-image-store.s3.amazonaws.com/0/29764/8e7a5b50-14f4-4b2d-e987-b7845cf063f3.png)
## 解説移動
![detailMoving.png](https://qiita-image-store.s3.amazonaws.com/0/29764/a51ec570-d57a-4994-2a1f-d3feaa626bc0.png)

# その他
発見次第、いろいろ追記していきます。
操作方法から分類するプロトタイプツール(概念メモ)

ざっくり自分のための分類。同じ型のものは良し悪しというよりそのチームに合ったものを使うと良い。コミュニケーションツールやテストの仕組みの有無はタイプ分類の対象に加えていません。

## ■ペーパープロトタイピング型
主に1枚絵に対して、アクション部のエリアを指定して画面を繋いでいく。PhotoshopやFireworksのようなデザインツールでホットスポットやスライスにリンク先を作るイメージに近い。
**アプリ例)** [InVision](https://www.invisionapp.com/)/[Prott](https://prottapp.com/ja/)/[CanvasFlip](https://www.canvasflip.com/index.php) などなど
他のツールとの連携が簡単で、位置が変わらなければ画像変更だけでデザイン変更に対応できる特徴(画像差し替えだけだからアクション部以外に内部でファイル内部品にインデックスをほとんど持たなくていいはず)
CanvasFlipは機能的には特殊でプロトタイプ上のヒートマップや利用解析が基本機能についている。

## ■オブジェクト型
オブジェクトと機能に関連はない。画面遷移の再現にアクションエリアを特別に指定する必要はない。Dreamweaverのリンクを画面遷移に対して行うイメージに近い。
**アプリ例)** [Adobe Xd](http://www.adobe.com/jp/products/experience-design.html)/[marvelapp](https://marvelapp.com/)
もし、今後フォームとかモーダルダイアログ表示とかに対応するならコンポーネント型-2に分類してみたオブジェクト-アクションに変わりそうな気が。それ以外の方法が想像できない…

## ■コンポーネント型
### 1)オブジェクト-機能(パーツの定まったワイヤフレームから発展していく型)
グリッドだとか入力フォームだとか既に出来上がったコンポーネント(機能)を貼り付けて配置していく。デザインツールとの行き来は多少困難。
**アプリ例)** [JustInmind](http://www.justinmind.com/)
MSのVisual StudioというかEclipseのあれと言おうかプログラマがあーみたことある！ってタイプ

### 2)オブジェクト-アクション
配置はデザインツールのように行い、そのオブジェクトに対してアクション(スワイプだとかスクロールだとか)をドラッグ＆ドロップなどして紐付ける。
**アプリ例)** [UXPin](https://www.uxpin.com/)/Adobe Director/[Pixate(Google)](http://www.pixate.com/)/[Principle](http://principleformac.com/)/[atomic](https://atomic.io/)/[protoPie]()
コンポーネント型との大きな違いはデザインと機能のひも付けのゆるさ。principleとAtomicはオブジェクト−アクションタイプでアニメーションをタイムラインで調整したい人向け
Visual Programming型もこれの発展と言えなくはない気はしてる。

## ■タイムライン型
マイクロインタラクションや遷移時アニメーションに主軸がありコレをタイムラインでコントロールする
**アプリ例)** [After Effects](https://www.adobe.com/jp/products/aftereffects.html)
Flashも使い方によってはこっちだけど、Flashをコレで使うなら他を使ったほうがいいのでは。学習はちと大変。

## ■ビジュアルプログラミング型
画面やオブジェクトのプロパティ変化をアクションやアニメーション機能をもつ複数のパネルでプログラミングする。
**アプリ例)** [Origami/Origami Studio](https://facebook.github.io/origami/)/[Neonto Studio](https://www.neonto.com/)など
書き出せるので多分手間をかけた分は回収できる。Neonto StudioはXcode/Android Studioに対して出力できる。
ただし学習曲線は…
[vvvv](https://vvvv.org/documentation/jp.propaganda)/[TouchDesigner](http://www.derivative.ca/)のような、本物のビジュアルプログラミングも転用できると思う。

## ■プログラミング型
実際に使える言語でのプロトタイプ。コストは高いけれどそのまま使える。
**アプリ例)** ネイティブ/Flash/HTML+JS
最初からクライマックス…もちろん学習曲線は…
facebook sdk 自分のプロフィール画像の取得方法(大きいサイズ)

#備忘録として書きます。

取得してくる画像サイズが50px×50pxで、
androidアプリで表示すると画像がとても荒くなって表示されてしまっていたので、
大きめの画像を取得してくる方法を探していました。

いろんなサイト回ってたけど下記みたいにURLにパラメータを付加してサイズを変更しているみたいな情報ばかり。

http://graph.facebook.com/hogehoge/picture?width=200&height=200
http://graph.facebook.com/hogehoge/picture?type=square

json形式で返ってくるURLと形式が違う。
jsonで渡されるURLのイメージは下記を参照してください。

p50x50でサイズが小さいとき
https://scontent.xx.fbcdn.net/hprofile-xal1/v/t1.0-1/p50x50/hogehoge・・・
p180x180でサイズが大きいとき
https://scontent.xx.fbcdn.net/hprofile-xal1/v/t1.0-1/p180x180/hogehoge・・・

※p50x50をp180x180に変更しただけでは、大きい画像は取得できませんのでご注意。

#解決策

parametersで取得してくるfieldsのpictureにtype(large)を指定してあげればOK！
イメージは下記を参照してください。また分かり難ところがあれば質問お願いします。

```
AccessToken accessToken = loginResult.getAccessToken();
GraphRequest request = GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback() {
    @Override
    public void onCompleted(JSONObject object, GraphResponse response) {

    }
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,gender,picture.type(large)");
request.setParameters(parameters);
request.executeAsync();
```

#参考URL
http://stackoverflow.com/questions/3341672/getting-the-real-facebook-profile-picture-url-from-graph-api
Kali Linux 2.0 を Virtualbox（Mac）に構築する

セキュリティ系の勉強会などだと、これを利用する事があるので忘備録代わりに。
作りやすさ＆潰しやすさを考えて、環境は Virtualbox を利用。



## 準備

Virtualboxのインストールは、各所で説明されているので省きます。

[Kali Linux の公式ページ](https://www.offensive-security.com/kali-linux-vmware-virtualbox-image-download/)にて、`Prebuilt Kali Linux VirtualBox Images` からイメージをダウンロードします。

![スクリーンショット 2016-04-23 14.54.42.png](https://qiita-image-store.s3.amazonaws.com/0/71365/02d5a485-b5a6-8ba9-9f15-d1c24c8ad590.png "スクリーンショット 2016-04-23 14.54.42.png")

## 構築
### インポート
イメージは `7z`形式なので解凍し、`ova`形式のファイルを確認します。

![スクリーンショット 2016-04-23 14.52.42.png](https://qiita-image-store.s3.amazonaws.com/0/71365/3f3cad7b-8be3-939d-98ee-2c1cbaf6cefe.png "スクリーンショット 2016-04-23 14.52.42.png")

Virtualboxを開き、[手順](https://docs.oracle.com/cd/E26217_01/E35194/html/qs-import-vm.html)を参考に、
メニューバーの `ファイル` > `アプライアンスのインポート` より、先ほどの`ova`形式のファイルを設定します。
念のため、`すべてのネットワークカードのMACアドレスを再初期化` はチェック入れておくのがオススメ。


![スクリーンショット 2016-04-23 15.02.26.png](https://qiita-image-store.s3.amazonaws.com/0/71365/d3acdb76-005c-5b59-b81d-54241d02727c.png "スクリーンショット 2016-04-23 15.02.26.png")

### ネットワーク
そのままだと、ネットワーク設定が`NAT`になっているため、他の端末を認識できません。
`設定` > `ネットワーク` > `アダプター1` > `割り当て` を `ブリッジアダプター` に変更します。
`名前`は接続したいポートを選択して、`ok`を押してください。
今回は無線で接続しているため `en0:Wi-Fi(AirPort)` を選択しました。

![スクリーンショット 2016-04-23 15.21.00.png](https://qiita-image-store.s3.amazonaws.com/0/71365/490aa745-e08f-1275-c59d-9c6313c9eb61.png "スクリーンショット 2016-04-23 15.21.00.png")

### ログイン

これでOSはいつでも使える状態になりました。
起動して、`root`ユーザでログインしてください。
デフォルトパスワード：`toor`

ターミナルを起動し、以下のコマンドを入力してださい。

```
# 正しいipアドレスが割り当てられているか確認
ip addr

# 新しいユーザを追加
# 例：useradd okusan
useradd [ユーザ名]

# 新しいユーザにパスワードを設定
passwd [ユーザ名]

# パッケージを最新版にアップデート
apt-get update

# ディストリビューションを最新版にアップグレード（かなり時間がかかるため、しなくてもいい）
apt-get -y dist-upgrade
reboot
```



参考：http://qiita.com/fkshom/items/53de3a9b9278cd524099

## 注意
### リソース
`64bit` のデフォルトだと、それなりに容量を食います。
メモリ：`2048MB`
ストレージ：`30GB`（初期容量は`8GB`くらい）

カツカツの環境の場合は、無理せず`32bit`で構築するか、諦めて `Kali Linux 32 bit Light` を `iso`インストーラから作成しましょう。

https://www.kali.org/downloads/


![スクリーンショット 2016-04-23 15.16.40.png](https://qiita-image-store.s3.amazonaws.com/0/71365/33e0f8f0-7e35-28c7-ef47-183fa503419d.png "スクリーンショット 2016-04-23 15.16.40.png")





### 無線接続
一番の問題点。

Mac の都合か、外部の無線ネットワークを「無線として認識させる」ことができませんでした…
無線のクラッキングを学びたかったため、これで全てが徒労に帰した感じです。

そういう用途で考えている方は、PCネットかインバースあたりで格安ラップトップを買ってくるしかないのか…

ご存知の方がおられれば教えていただきたいです。
ESLint が jQuery Foundation に参加したことについて

> 最近めっきり再生工場的な役割を担い始めているjQuery Foundationということで、そこの傘下に入るとなると、なんとなく嫌な予感がしなくもないですが…。
> From: http://mae.chab.in/archives/2874#post2874-4

ESLint が jQuery Foundation に参加することについて不安に思っているという意見をいくつか見ましたので、ESLint が jQuery Foundation に参加する理由を記した公式記事を抄訳することにしました。私の英語力はかなり低いので、編集リクエストをお待ちしています ~~(最後のフレーズよくわからなかった...)~~。

> 最後のところ @shuhei さんが訳してくれました! ありがとう!

結論だけ言うと、**ESLint の存続をより確実にするため**ということになります。
私たち開発チームは、将来、法的なトラブルがあった時に jQuery Foundation の助けを得られることを期待しています。それ以外の点は今までどおりです。

----

# [ESLint Joins the jQuery Foundation]

> 訳注: 記事中の "私" は、ESLint の創始者である Nicholas C. Zakas です。

私は、オープンソース プロジェクトが広く普及した場合、そのメンテナはプロジェクトの存続を保証する責任を負うと信じています。過去数年にわたって、私は重要なプロジェクトが様々なトラブルに遭遇したのを見てきました。YUI は突然開発終了し、Node.js は分裂し、Express は売却されました。私は、そのようなトラブルから ESLint を守るために何をすればいいのかを考え続けています。

今日、ESLint は、より確実な存続のために jQuery Foundation に参加します。jQuery Foundation には jQuery, Esprima, Lodash, Grunt といった素晴らしいプロジェクトが参加しています。私は ESLint がこれら JavaScript エコシステムにとって最も重要で影響力のあるプロジェクトたちと肩を並べることを誇りに思っています。

私は、ESLint が jQuery Foundation に参加することで、次のような保証を得られると考えています。

1. ESLint は私が離脱した後も存続します。私には ESLint プロジェクトから離脱する計画はありませんが、オープンソース ソフトウェアの歴史を見るに、オープンソース ソフトウェアの作者が最終的にプロジェクトを離れるのは一般的な出来事であるようです。John Resig は jQuery から離れ、Ryan Dahl は Node.js から離れました。私も同じ道を辿らない保証はありません。
2. ESLint が企業に売却されることはありません。Node.js や Express の事例が示したように、この種の関係は必ずしもうまくいくわけではありません。私は ESLint コミュニティがこの種の保証に値するので、ESLint に依存するのが安全かどうかに関する質問が無いのだと感じでいます。
3. ESLint プロジェクトは、開発のベスト プラクティスやオープンソースに関する法的なあれこれの変化に追従し続けます。

これらの保証が ESLint コミュニティの成長と繁栄に役立つことを願っています。

## 変わること

- **CLA** - ESLint は jQuery Foundation CLA を利用するようになります。あなたが過去に ESLint CLA に署名したことがあったとしても、次にプルリクエストを送信したときに jQuery Foundation CLA への署名を求められます。
- **Code of Conduct** (行動規範) - ESLint は jQuery Foundation Code of Conduct に従うようになります。ESLint は今までも jQuery Foundation Code of Conduct を元にした行動規範に従っていましたので、変化は殆どありません。唯一の変化は jQuery Foundation が行動規範を監視し、違反を処理するようになることです。
- **Legal** - jQuery Foundation は、ESLint のすべての法的側面を扱うようになります。彼らは ESLint の著作権保持者となり、ESLint と ESLint のロゴの商標登録を行います。

## 変わらないこと

上記以外のことは、何も変わりません。特に、

- ESLint 関連プロジェクトは、今までどおり GitHub の ESLint Organization にホストされます。
- ESLint チームは、今までどおり ESLint の開発とメンテナンスを続けます。
- ESLint チーム メンバーは、今までどおりです。

## 新しい始まり

ESLint が jQuery Foundation に参加することについて、あなたが私と同じようにワクワクしていることを願っています。私はこれが ESLint の生涯全体の中で重要なステップの一つだと考えています。このプロジェクトを現在のような成功に導いたのは ESLint コミュニティです。そして ESLint を jQuery Foundation に移行することは、このプロジェクトが現在もそして今後もずっとコミュニティのためのものであると言うための私なりの方法なのです。

– Nicholas

[ESLint Joins the jQuery Foundation]: http://eslint.org/blog/2016/04/eslint-joins-the-jquery-foundation
Gaidenを動かしてみた

sdkmanでインストール可能なパッケージ見て気になったので試してみた。

```
--------------------------------------------------------------------------------
Gaiden (1.0)                                       http://kobo.github.io/gaiden/

Gaiden is a tool that makes it easy to create documentation with Markdown.

                                                            $ sdk install gaiden
--------------------------------------------------------------------------------
```


# インストール

```
$ sdk i gaiden
```

sdkmanのインストールや使用方法は[こちら](http://qiita.com/ligun/items/6961918064dccbdac114)を参考に。

# 使ってみる

## プロジェクト作成

create-projectでプロジェクトを作成する。

```
$ gaiden create-project gaiden-test
```

ディレクトリ配下のファイルはこんな感じ。

```
$ cd gaiden-test 
$ ls -a
./  ../  README.md  config.groovy  gaidenw  gaidenw.bat  pages.groovy  wrapper/
```

## ドキュメント生成

```
$ gaiden build
```

buildディレクトリ配下に以下のようなファイルが作成される。

```
$ ls build 
css/  fonts/  index.html  js/
$ ls -R build 
build:
css/  fonts/  index.html  js/

build/css:
bootstrap.min.css  font-awesome.min.css  highlight.css	my.css	style.css

build/fonts:
FontAwesome.otf		 fontawesome-webfont.svg  fontawesome-webfont.woff	    glyphicons-halflings-regular.svg  glyphicons-halflings-regular.woff
fontawesome-webfont.eot  fontawesome-webfont.ttf  glyphicons-halflings-regular.eot  glyphicons-halflings-regular.ttf

build/js:
application.js	highlight.js  jquery-2.1.1.min.js  my.js
```

ブラウザで開いてみるとこんな感じのページが出来てる。

![gaiden.png](https://qiita-image-store.s3.amazonaws.com/0/6889/e1a50c63-4d56-5482-1892-1c193f033a5e.png)

## カスタマイズ・他

- 作成されるページはREADME.mdファイルから作成されるので、このファイルを編集してbuildする。
- 複数ファイルからページを作成したい場合、pages.groovyにファイルを追加する。
- タイトルを変更したい場合、config.groovyのtitleにタイトル名を設定する。
- gaiden watchを起動しておくと、README.mdの変更がリアルタイムでドキュメントに反映される。


# Reference

```
$ gaiden
Usage: gaiden [-v|--version] [--non-interactive] <command> [<args>]

  commands:
    gaiden build                          Build pages from page sources
    gaiden clean                          Clean the build directory
    gaiden create-project <project-name>  Create the project directory
    gaiden help [<command-name>]          Show help for a command
    gaiden install-theme <theme-name>     Install a theme resources into the project directory
    gaiden watch                          Watch the project files, build when files are changed
    gaiden wrapper                        Install wrapper resources

```

 http://kobo.github.io/gaiden/getting-started.html
技術英語 > When you [stop and think] about it this approach has a number of benefits.

@ Adam Taylor MicroZed Chronicles - Using the Zynq 101 [Kindle Edition]
No. 1430/2129

a system of moduleについて

> When you <font color=red>stop and think</font> about it this approach has a number of benefits.

http://eow.alc.co.jp/search?q=stop+and&ref=sa

<hr>
混同してしまうのが`stop + ing`

He stopped coding.

[You must stop coding, you must keep coding](http://bjk5.com/post/50847975319/you-must-stop-coding-you-must-keep-coding)

思いつきの覚え方としては`ingで現在進行形のものをstopする`、から`XXXするのをやめる`。
【Xcode】右と左を交互に表示する案内アプリをざくっと作る

## はじめに
独学でプログラミング学び始めて約1年、業務でプログラム書き始めて2ヶ月、Swift始めて１ヶ月のSwifterです。
ちょっと古いですが、ネットでこんな記事がありました。
[右か左かをランダムに表示するだけのiPadアプリに合計1億5000万円以上が支払われていた](http://gigazine.net/news/20160405-tsa-randomizer-cost-1-4-million/)
参考：GIGAGINE

俺に作らせてくれ！といいたいところです。ランダムではないですが、タップするたび矢印の向きが変わるアプリを15分でざくっと作りました。
[githubサンプル](https://github.com/elle68kew/Arrow)

![arrow.gif](https://qiita-image-store.s3.amazonaws.com/0/115590/ae843114-8674-87eb-bc88-f5f182547eef.gif)

## 手順
- 矢印画像を作る(SketchというAppがオススメです)
- imageViewを配置
- buttonを画面いっぱいに配置
- タップするたびに画像を入れ替える

## コード
こんな感じ

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var arrowImage: UIImageView!
    
    var isRight: Bool = true
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    @IBAction func changeArrow(sender: AnyObject) {
        if isRight {
            self.arrowImage.image = UIImage(named: "left.png")
            isRight = false
        } else {
            self.arrowImage.image = UIImage(named: "right.png")
            isRight = true
        }
    }

}
```

if文のところはもっと簡単に書けそうですがこれくらいの処理ならこんな感じでよいかと。
これで1億5000万プレイヤー間違いなし！
css transition でガクッとしてしまいうまくいかないとき


しょうもないことでハマりました…。
css transitionでアニメーションしようとしたが、どうにもガクガクしてしまいうまくイカなかった。

正確には、
absoluteのDOM要素のwidthを大きくした分、同時にleftとtopをマイナス値にすることで、中心点を維持したままDOM要素を大きくするアニメーションを実行しようとしたが…
なぜかwidthの増加アニメーションとleft,topの増加アニメーションが合わず、綺麗に拡大アニメーションを実行することができなかった。
（アニメーションがズレる、という表現が適切でしょうか？）


## 結論
変化させるプロパティは事前に設定しておかないとうまくアニメーションできないようです。

```なおすまえ、widthのアニメーションとleftのアニメーションが合わず、ガクガクする
	.test{
        display: block;
        position: absolute;
        width: 100%;
        height: 100%;
        -webkit-transition: .05s;
        -moz-transition: .05s;
        -o-transition: .05s;
    }
    .test:hover {
        width: 120%;
        left: -10%;
        top: -10%;
    }

```

```なおしたあと。ガクガクしない
	.test{
        display: block;
        position: absolute;
        width: 100%;
        height: 100%;
        top: 0px; /* 追加 */
        left: 0px; /* 追加 */
        -webkit-transition: .05s;
        -moz-transition: .05s;
        -o-transition: .05s;
    }
    .test:hover {
        width: 120%;
        left: -10%;
        top: -10%;
    }

```

知らなかった…。
PHPのエントリポイントの調べ方

PHPの巨大なレガシーWebサービスを扱っていると、一体どれが最初にアクセスされるPHPファイルなのかよく分からず、色々と困ったことにぶつかります。
そういった問題を解決するにあたり、僕が使った方法をまとめてみます。

アプリケーションの初期化を一元化したい、フレームワークを入れるために処理の流れを根本的に見直したい方々の助けになれれば幸いです。

## エントリポイントが分からない時の問題点
まず最初に、この問題によって困るポイントをまとめてみます。
以下の項目が思いつきました。

 * アプリケーションの初期化処理をどこに入れればいいのか分からない。
 * エントリポイントごとに初期化処理がバラバラ。
     * ビジネスロジック部分でどの初期化処理がされているのかを期待していいのか分からない。
     * 自動テスト実行時にどの初期化処理がされているべきか定義できない。
 * 公開/非公開ファイルの線引きが出来ない。
     * エントリポイントのみを公開ファイルにしたい。
 * フレームワークのようにアプリケーション内でルーティングするようにしたくても、ルーティング先のファイル（現エントリポイント）が分からなくて出来ない。

ビジネスロジック部分でどの初期化処理がされているのを期待していいのか分からない、というのが特に開発効率に影響を与えていると僕は思っています。
僕の関わっているWebサービスではどこでも利用できるとされているシングルトンオブジェクトがいくつかある（あまり良くないのですが・・・）のですが、その中には初期化が必要なものもいくつかあります。
で、そいつを「どこでも利用できるはず」と信じて共通ライブラリ的なクラスで使ってみると、エントリポイントによっては初期化されておらず、見事にエラーになったりしてサービスに影響が出たりします。

一般的なWebフレームワークは１個の公開ファイル内で初期化処理を行っているのでこんなことはないのですが、エントリポイントがバラバラだとそれが出来ないので、常にどこからアクセスされたのか？を意識しなくてはなりません。
これがまた、本当につらい・・・。

## エントリポイントを特定する方法を考える
上記問題を解決するためにエントリポイントを特定を始めたのですが、ひたすらソースやアクセスログを追うのはさすがに無理なので、もっと手っ取り早い方法がないか探していました。

そこで見つけたのが `$_SERVER['SCRIPT_NAME']`で、公式サイトによれば現在のスクリプトのパスがこの変数に入っています。
現在のスクリプトのパス、というのはカレントのファイルパス（＝`__FILE__`）という意味ではなく、 **最初に実行されたPHPファイル** が入っています。
`$_SERVER` ってApacheやNginxなどのWebサーバから提供される情報だと思っていたのですが、`$_SERVER['SCRIPT_NAME']`はクーロンやCLIからの実行時でもきちんと値が入っていて、常に取得できました。
こいつをログ収集し続ければ、いずれ全てのエントリポイントを特定することが出来ると考えました。

## $_SERVER['SCRIPT_NAME']をログ収集する
ログ収集するにもどうやってログに吐き出すか？という問題があるのですが、訳あってPHPプロセス終了時にログ出力したい理由がありました。
その理由は今回の本題とは全く関係ないので、ここでは触れません。

最終的にログ出力方法は[php.iniのauto_prepend_file](http://php.net/manual/ja/ini.core.php#ini.auto-prepend-file)と[register_shutdown_functionメソッド](http://php.net/manual/ja/function.register-shutdown-function.php)の合わせ技を採用しました。

auto_prepend_fileはPHPプロセス開始時に自動的にrequireするファイルを指定するディレクティブで、必ずログ出力処理が呼び出される保証が得られます。
`register_shutdown_function`メソッドはPHPプロセス終了時に自動的に呼び出すfunctionを登録するメソッドです。
ここに`$_SERVER['SCRIPT_NAME']`をログ出力するfunctionを登録しました。

「PHP実行後にログ出力したいなら[auto_append_file](http://php.net/manual/ja/ini.core.php#ini.auto-append-file)で良くね？」って話もあったんですが、こっちは`exit`メソッドで終了する場合には呼び出されないので採用しませんでした。`register_shutdown_function`メソッドは`exit`メソッドで終了する場合も呼び出されます。

## そんなこんなでエントリポイントが特定できるようになった

上記の対応をして無事にエントリポイントを全て特定することが出来ました。

ただそもそもの話、最初の問題点で挙がっていた共通の初期化処理したいなら、[php.iniのauto_prepend_file](http://php.net/manual/ja/ini.core.php#ini.auto-prepend-file)使うだけでいいんじゃない？
という考え方もあるのですが、それだとphp.iniを見ないと挙動の分からないアプリケーションとなってしまいます。
アプリの挙動はリポジトリを見るだけで把握できるのが理想だと思うので、特殊な理由が無い限りはなるべく使いたくはありません。
今回はログ収集で使ってしまいましたが、エントリポイント特定完了後はちゃんと削除しました。

また将来的にフレームワークを導入したいので、エントリポイントを一元化する必要が元々ありました。
そのためにもauto_prepend_fileによる解決を今回はしませんでした。
サービスプロバイダから入手したWSDLに記述されているサービスアドレスが実際のアドレスと異なるので調べた

サービスプロバイダから入手したWSDLに記述されているサービスアドレスが

```xml
  <soap:address location="http://localhost:8080/endpoint"/>
```

となっているため、このWSDLを使って作成したリクエスタではどこに接続すればいいのか決定できません。

まずはJAX-WSでのWebサービス構築方法について簡単に整理してみました。

####ボトムアップアプローチによるサービスプロバイダの作成
先にサービス実装クラス、引数/戻り値クラスを作成します。このクラスからツールによってWSDLやWebサービスコンポーネント内で必要となるクラス群を自動生成する方法です。

実際ににやってみました。まず、サービスプロバイダクラスWebService1を実装します。

```java
package webservice.provider;

import javax.jws.WebMethod;
import javax.jws.WebService;

import webservice.data.Parameter;
import webservice.data.Result;

@WebService
public class WebService1 {

    @WebMethod
    public Result service(Parameter parameter) {
        Result result = new Result();
        result.setName(parameter.getName());
        result.setValue(parameter.getValue());
        return result;
    }
}
```

できた実装クラスを指定して`wsgen`コマンドを実行してWSDLなどを生成します。

>
wsgen -cp bin -d output webservice.provider.WebService1

生成されたWSDLでは、サービスのURL(`soap:address`要素の`location`属性)は

```xml
  <service name="WebService1Service">
    <port name="WebService1Port" binding="tns:WebService1PortBinding">
      <soap:address location="REPLACE_WITH_ACTUAL_URL"/>
    </port>
  </service>
```
のようになっています。このWSDLを利用して作成したリクエスタはこのままでは実際のサービスに接続できないため、文字通り`REPLACE_WITH_ACTUAL_URL`の部分を置き換えて使用します。受領したWSDLに手を加えて利用するものではないという認識だったのですが正しくなかったようです。

何らかの方法でWSDLを作成した場合のデフォルトのURLが`http://localhost:8080/endpoint`となるのではないかと考えて`http://localhost:8080/endpoint`で検索したのですが有用な情報が得られませんでした。いっぽう`REPLACE_WITH_ACTUAL_URL`で検索するといろんな情報が得られました。この置き換えをantで実行するという書き込みがあったので参考にさせてもらいます。

```xml
  <replace file="${wsdl.file}" token="REPLACE_WITH_ACTUAL_URL" value="${endpoint.url}"/>
```

受領したWSDLの`location`がなぜ`http://localhost:8008/endpoint`となっているのか不明なのですが、アドレスURLは実際のものに置き換えて使えばよさそうですので、ビルド時に置き換えて利用する方法を採用する方向で検討しましょう。
AdobeAnimateCC の javascriptとの連動メモ



Adobe FlashがいつのまにやらAdobeAnimateとかいう名前に変わっており
さらにいつのまにやらHTML5+javascriptでの出力に対応していた。

Flash職人に生き残りの道が！と思って興奮しました。

まぁ私はFlashつかえないのですけども。

とにかく、Flashのノリで作ったアニメーションがHTML5+canvasjsで出力できるのでとにかくよくてとにかくすごいということ。

ここの動画を見るとよく分かる。
https://helpx.adobe.com/jp/animate/how-to/create-animations-motion-editor.html

さっそく触ってみて、アニメーションはつくれたものの、コードとの連携がイマイチわからん…。
createjs自体があまりわかっていないのですが…。

備忘録的に以下。
徐々に追加していきます。

## 任意のタイミングでjsのコードを実行

タイムラインの任意の場所で右クリックをしてjsを書くだけ。
簡単

「アクション」を選択

![image](https://qiita-image-store.s3.amazonaws.com/0/50872/90577f0d-98a0-116a-6e7e-15f9e1e01991.png)

かく

![image](https://qiita-image-store.s3.amazonaws.com/0/50872/4baaf694-b0c2-8e1f-4f61-40a879f9ef4e.png)
[python]__debug__についてのメモ

#メモ
＊ただのメモです
#\_\_debug\_\_
これは組み込み定数ひとつで、python実行の際に`-O`をつけると`False`、じゃなければ`True`となる定数。（これ、 大文字のオー,ゼロじゃない）

```debug_print.py
def debug_print(s):
    if not __debug__:
        print(s)
```
こんな感じで作ると、

```test.output
$ python -c '(__import__)("debug_print").debug_print(__debug__)'
$ python -O -c '(__import__)("debug_print").debug_print(__debug__)'
False
```

のように、`-O`オプションをつけた時だけprintされます。
Ubuntu14.04にGitlab8.2.0インストールと日本語化

## 準備

* Ubuntu 14.04 LTS 日本語版をインストール済みのVirtualBox  
[Ubuntuの日本語環境](https://www.ubuntulinux.jp/japanese)

## インストールと日本語化
基本的に公式サイトのインストール方法に則って進める。
https://about.gitlab.com/downloads/#ubuntu1404

1. インストールと必要な依存関係のある設定

    ```bash 
    sudo apt-get install curl openssh-server ca-certificates postfix
    ```
2. 過去パッケージのインストール
    apt-getでインストールする際にバージョンを指定する。
    今回は日本語化パッチが対応している8.2.0を指定する。

    ```
    curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
    sudo apt-get install gitlab-ce=8.2.0-ce.0
    ```

    もしバージョンがわからない場合は次のコマンドでバージョン名を確認する

    ```
    apt-cache policy gitlab-ce
    ```
3. 日本語化パッチの適用
    * 任意のフォルダへクローンする

        ```
        $ cd 
        $ git clone https://github.com/ksoichiro/gitlab-i18n-patch.git
        ```
    * パッチを適用する
        日本語化公式サイトのREADMEの通り実行する

        ```
        $ cd /opt/gitlab/embedded/service/gitlab-rails
        $ sudo patch -p1 < ~/gitlab-i18n-patch/patches/v8.2.0/app_ja.patch
        ```

4. GitLabを起動

    ```
    sudo gitlab-ctl reconfigure
    ```

5. ブラウザでGitLabへアクセスし、日本語化されていることを確認する
Electronで展示物用アプリケーションを作る際のテクニックまとめ

とあるプロジェクトでElectronを使った展示用インスタレーションアプリを作成したので、開発によって得られた展示物用アプリに仕上げるための知見とテクニックをまとめて紹介します。

## 仕様・前提
展示用アプリは通常のアプリと違い、一般ユーザにはアプリ以外の通常操作・こちらが規定した以外の操作をできないように設定することが重要です。大まかな仕様としては以下の通り。

* アプリの操作はタッチで行う
* 展示物専用で非公開アプリ
* ユーザにはアプリ以外の操作をさせない
* キーボードは外部接続し、展示員のみが操作できる想定

## アプリ以外の操作を無効化する
今回のアプリは展示専用のアプリケーションなので、ユーザにアプリ以外の操作をさせない。そのためMain Processでフルスクリーン化、フレームレス、kioskモードを設定します。

```javascript:main.js
mainWindow = new BrowserWindow({width: 600, height: 800, kiosk: true, 'fullscreen': true, 'frame': false});
```

### 参考
[Fullscreen on Mac still shows window title and kiosk mode not working #1054](https://github.com/electron/electron/issues/1054)


## 画面の拡大縮小をできないようにする
通常HTMLはviewportを設定しなければ表示の拡大縮小ができます。ただ展示アプリとして設置する場合、拡大縮小ができてしまうと都合が悪いので無効化する必要があります。当初はhtml側のviewport設定でzoomを禁止にすればいけると思っていましたが、それでは対応できません。Erectronの場合、webFrameという機能を有効化することで拡大縮小を無効化できます。なおwebFrameはMain Process でなく、Renderer Processで行うのでindex.htmlなどの表示用ファイルにコードを書き加える必要があります。

```html:index.html
<script>
var webFrame = require('electron').webFrame;
  webFrame.setZoomLevelLimits(1, 1);
</script>`
```

webFrameの詳しい設定については以下を参照。
[webFrame](https://github.com/electron/electron/blob/master/docs/api/web-frame.md)


##展示員だけがアプリを落とせるようにする機能を設定
展示員がアプリを終了できるようにします。kioskモードを有効化している場合、通常操作ではシャットダウンできないため、キーボードショートカットでアプリケーションをシャットダウンさせる機能を設定します。今回は`ctrl + q`に割り当てました。

```javascript:main.js
var appQuit = globalShortcut.register('ctrl+q', function() {
	mainWindow.close();
 	app.quit();
});
```

## アプリの設定画面を表示させる
getUserMediaでPCのカメラIDを取得、カメラ情報を設定...などを起動直後にさせるため、セッティング画面を作成する必要がありました。ただし、ユーザに設定画面を操作させたくないので、ショートカットキーで設定画面を表示させる仕組みを実装します。下記の記述では`ctrl + enter`を押すと、setting.htmlが表示されます。

```javascript:main.js
var cameraSetting = globalShortcut.register('ctrl+enter', function() {
	mainWindow.loadURL('file://' + __dirname + '/setting.html');
});
```

## その他

### WindowsとMacでレイアウトが微妙に変わることに注意
Electronでchromiumだし、WinとMacで見た目が大きく変わることはないだろう、とたかをくくっていましたが、実際はフォントサイズが微妙に変わってしまっていました。レイアウトをpx単位で精密に作る場合は、特に注意が必要です。
composerの"scripts"を使おう！

ちょっとしたTips。
珍しくもない情報だけど、なんだかあまり使われてないような気がするので・・・。

composerにはscriptsという仕組みがあって、composerで入れたパッケージを短いコマンドで手軽に実行出来たり、普段よく行う定型のコマンドを登録できます。

composer.jsonを以下のように書くと、

```json
{
    "scripts": {
        "test": [
            "phpunit"
        ]
    }
}
```

phpunitを以下のコマンドだけで実行できるようになります。

```shell-session
composer test
```

単純にコマンドが短くなって便利なのですが、

 * パッケージをチームで決めた共通のオプション指定で使わせる
 * パッケージに全く関係ないけど、開発中によく使うコマンド手順（キャッシュファイルを削除するなど）をチーム内で共有

など地味にチーム開発に貢献できるものだと思います。

```json
{
    "scripts": {
        "test": [
            "phpunit"
        ],
        "test-quiet": [
            "phpunit -d error_reporting=0"
        ],
        "cs": [
            "phpcs --standard=ruleset.xml --encoding=euc-jp"
        ],
        "cache-clear": [
            "rm -fr path/to/cache1",
            "rm -fr path/to/cache2"
        ]
    }
}
```

composerへPATHを通さないとcomposerコマンドを認識してくれないのでご注意です。PATHの通し方は散々あふれている情報なので触れません。

composer scriptsの公式のDocumentationはこちら。
https://getcomposer.org/doc/articles/scripts.md#scripts
React:Uglifyのデバッグ

この記事は**React**の**uglify**の**debug**を節目する。
普通のエラー：

    events.js:141 throw er; // Unhandled 'error' event ^ Error at new JS_Parse_Error
#１。デバッグ・ツール
 **Gulp-util**を使います。

    npm install gulp-util --save-dev
他のpackage.jsonの中にgulp-utilを追加すると`npm install`を使います。
	

    
#２。デバッグ方法
  

     var gutil = require('gulp-util');
     //code
     .pipe(uglify().on('error', gutil.log));

   **gulp**を実行する。
  エラーロッグは以下みたい：

      lineNumber: 15383,
      stack: 'Error\n
     
  **uglify**ラインをコメントアウトして、も一度 **gulp**を実行する。
  以下はエラー場所です：
<img width="429" alt="Screen Shot 2016-04-24 at 01.02.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/114590/5aaba160-f913-48b8-20c2-ced6d9fdfa83.png">

  この例の原因は**...o**fを使うするとuglifyできません、**in**を使うべきです。エラーによると原因が違いますが、エラーロッグをおかげで、デバッグできます。
Anrdroidで動画、音声の速度を変更して再生する


今までAndroidでは、動画や音声の速度変更ができなかった。
(ただしNDKでそういうものを作れば可能かも。あと音声に関してはAudioTrackでごにょごにょしてできるにはできたけど、音の高さが変わって意図しているスピードの変更にはならない。)
ちなみにiOSでは標準で用意されているAPIなので、Androidも簡単につくれるんでしょ？と言われては、それがですね、、、、といつも断っていた。

それがやっと6.0でスピードを変更することができるようになっていたのでご紹介。

本当に簡単でMediaPlayerに変えたいスピードを設定したPlaybackParamsをセットしてあげるだけ。

下記は2倍速の例。

```
PlaybackParams params = new PlaybackParams();
params.setSpeed(2.f);
mediaPlayer.setPlaybackParams(params);

```

これで動画も音声も変更できる。
Macのターミナルで簡単に画像処理できるsipsの使い方

#■ Macでsipsを使う
Macではターミナルで画像情報取得や簡単な画像処理ができる"sips"コマンドが使えます。ピクセルサイズやbit深度などの情報確認、リサイズやクロップ、フリップ、回転などの画像処理に手軽に使えて便利です。

#① 画像情報の確認
画像サイズ
```$ sips -g pixelWidth -g pixelHeight <imagefilepath>
```
画像フォーマット
```$ sips -g format <imagefilepath>
```
画像の全プロパティー
```$ sips -g all <imagefilepath>
```


#② 画像リサイズ
画像のアスペクト比を変えたくない場合は、
```$ sips -Z <pixelsWH> <imagefilepath>```   *リサイズして上書き*
```$ sips -Z <pixelsWH> <imagefilepath> -o <newimagefilepath>```   *リサイズして別名で保存*

例えば画像(img0001.png)を縦x横 256x256にリサイズして別名ファイル(img0001new.png)で保存たい場合は以下のようにします。
**sips -Z 256 img0001.png -o img0001new.png**

画像のアスペクト比が変わって良い場合は、
```$ sips -z <pixelsH> <pixelsW> <imagefilepath>
```

#③ 画像クロップ（切り出し）
```$ sips -c <pixelsH> <pixelsW> <imagefilepath>
```

#④ 画像フリップ
```$ sips -f horizontal <imagefilepath>```      *水平フリップ*
```$ sips -f vertical <imagefilepath>```　      *垂直フリップ*

#⑤ 画像回転
```$ sips -r <degreesCW> <imagefilepath>
```
例えば時計周りに90度回転させたい場合は、
**sips -r 90 img0001.png**

#⑥ 画像フォーマット変換
```$ sips -s format <format> <originalfilepath> -o <changedfilepath>
```
formatは、 jpeg | tiff | png | gif | jp2 | pict | bmp | qtif | psd | sgi | tga
例えばjpg画像(img.jpg)をpng画像(img.png)に変換したい場合は、
**sips -s format png img.jpg -o img.png**

#⑦ 画像パッディング（画枠付け）
```$ sips -p <pixelsH> <pixelsW> --padColor <hexcolor> <originalfilepath> -o <changedfilepath>
```
colorはHex指定で、White=FFFFFF、Red=FF0000、Default=Black=000000です。例えば元画像(300x300ピクセル)の周りに50ピクセル幅で緑色(Green255=00FF00)の画枠をつけたい場合は、
**sips -p 350 350 --padColor 00FF00 img0001.jpg -o img0001new.jpg**

何故かpngではcolorの指定が効きませんでした。

#より詳しい使い方
manで確認してください。
$ man sips
JR西日本の運行状況をPythonで取得

1_JR西日本の運行状況を取得
2_遅延のある路線を取得
3_出力
します。

[運行状況引用元]
http://trafficinfo.westjr.co.jp/list.html

xpathを使用してhtmlから運行状況のみ取得しています。
ここの処理でlxmlを使用しました。特に難しくもないのでスクレイピング練習用？にはちょうどいいかもしれません。
またユーザーエージェントにてアクセスする際にiPhoneに見せかけています。
引数として受け取るので自由に変更できます。
また、遅延が一本も無い状態だとreturnをせず(if body:であるから)そのまま関数は処理を終えます。

出力サンプル

```
[01時26分現在の運行状況]
中国エリア: 遅れ等が発生しています。
```
コード

```py:GET_JR_INFO.py
#coding: utf-8

import urllib2, lxml.html
from datetime import datetime
	
def GET_info(user_agent):
	headers = {'User-Agent': user_agent}
	root = lxml.html.fromstring(urllib2.urlopen(urllib2.Request("http://trafficinfo.westjr.co.jp/list.html", None, headers)).read())

	list_data = []
	list_data.append("[{}]".format("".join([i.text for i in root.xpath('//*[@id="contents"]/div[1]/h1')]).encode("utf-8")))
	for i in range(1, 7):
		path_status = '//*[@id="contents"]/div[2]/ul/li[%d]/span[3]' % i
		path_name = '//*[@id="contents"]/div[2]/ul/li[%d]/span[1]' % i
		if not "遅れの情報はありません。" in "".join([i.text for i in root.xpath(path_status)]).encode("utf-8"):
			body = "{}: {}".format(
				"".join([i.text for i in root.xpath(path_name)]).encode("utf-8"),
				"".join([i.text for i in root.xpath(path_status)]).encode("utf-8"))
			list_data.append(body)
	if body:
		return list_data

if __name__ == "__main__":
	print "\n".join(GET_info(
		user_agent="Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25"
		))
```