OmniAICreator/Qiita-1.07M huggingface dataset:
PLYで簡単な言語をつくってみるよ１

#はじめに
## 背景
* 言語つくるの面白そうという興味
* LLVMに今興味を持っていて字句解析・構文解析は興味があった
* CもC++も書けなかったがpythonは触ったことがあった

##　PLYとは
* Pythonの字句解析/構文解析ライブラリ
* 以下をpythonで実装し、まとめたもの
    * 字句解析器lex
    * 構文解析器yacc


# 準備
## PLYのインストール
```
$ pip install ply
```
* python3・python2両方に対応してるっぽい
* python3.6では問題があるっぽい？githubのissueにそれっぽいことが...

## 今回実装するものを決める
* 変数
* コンソールを終了する関数
    * とりあえず名前はexitとする
* 文字をコンソールに表示する関数
    * とりあえずputとする
* コメントは#から
* タブ・スペースは無視する

# 実装
## 字句解析
* 今回作成したコードを以下に示す

```lex.py
import ply.lex as lex

tokens = (
  # Literals
  'ID',

  # Function
  'PUT', 'EXIT',
)

# Identifiers at var
t_ID = r'(?!put|exit)[A-Za-z_][A-Za-z0-9_]*'

# Function
t_PUT = r'put'
t_EXIT = r'exit'
# space is ignore

# space and tab is ignore
t_ignore = ' \t'

# comment  
t_ignore_COMMENT = r'\#.*'

# error handling
def t_error(t):
    print("不正な文字 '%s'" % t.value[0])
    t.lexer.skip(1)

#
lex.lex(debug=0)

```

* token = (  )
    * カッコの中に解析したい要素を
* 字句解析のルール
    * 正規表現で表す
    * 命名規則はt_トークン名
    * t_ignoreは文字列をスキップ
    * t_ignore_COMMENTはコメントを定義できる
    * t_errorはマッチしなかったとき呼び出される
    * lex.lex()でビルド
* 正規表現がよくわかっていないので割とごり押しになってます
    * 綺麗に正規表現で書けるようになりたい(勉強するする詐欺)

## 構文解析
以下に作成したコードを示す

```yacc.py
import ply.yacc as yacc
from lex import tokens
import sys

names = {}

# var (id)
def p_expr_id(p):
    'expr : ID'
    try:
        p[0] = names[p[1]]
    except LookupError:
        print('Undefine var name %s' %p)
        p[0] = 0

# exit function
def p_exit(p):
    'expr : EXIT'   
    print('See You!')
    sys.exit()

# empty
def p_empty(p):
    'empty :'
    pass

# syntax error
def p_error(p):
    print ('Syntax error in input %s' %p)

parser = yacc.yacc()

# Debug
def parse(data, debug=0):  
    return yacc.parse(data, debug=debug)
    
if __name__ == '__main__':  
    while True:
        try:
            s = input('>>> ')
        except EOFError:
            break
        if not s:
            continue
        result = parser.parse(s)
        print (result)
```

* names = {} 
    * 変数名と値を格納するためのdictionary
* p_expr_id
    * ID(p[1])を変数名としてexpr(p[0])に
    * 'expr : ID　は p[0]: p[1]で渡される
* p_exit
    * See You!と表示してコンソールを終了する
    * pythonのsys.exit()関数が使える
* Debug
    * 割愛

# 動かしてみる

実は変数を定義したが現状何もできない
できるのはexit関数を試すぐらいだ

実行は

```
$ python yacc.py
>>> exit
See You!
$
```

# おわりに
何となくそれっぽい画面になってexitで抜けれた
最後のほう説明がざつになってきた

# 参考にしたもの
[PythonでPPAP(ペンパイナッポーアッポーペン)をイメージしたオリジナル言語　「PPAPScript」を作ってみた](http://qiita.com/ryo-ma/items/f9d5a0845c5d3acd5d0b)， [ryo-ma](http://qiita.com/ryo-ma).
ベータ版Salesforce DXをセットアップしてみた

Salesforceの新しいビルド環境の「Salesforce DX」がオープンベータとして公開されました！
「Salesforce DX」のセットアップを行ってみました。

下記リンクより詳細が確認できます。
http://dev.classmethod.jp/devenv/salesforce-dx-setup/


次は「Salesforce DX」で新しく導入された「Scratch Org」を使ってアプリケーションを作成してみます。
Django Admin Site Tuning - 管理サイトのチューニング

# Overview

Djangoの管理サイトはレコードの編集など便利な機能が多いのだが
外部キーを使いまくったモデルを扱おうとすると途端にTimeOutを頻発させるようになる。

[こちら](http://qiita.com/hagino3000/items/418f6e61405cb1a271cf)を参考に設定してみたがDjango 1.11はもう少し簡単に設定できるようだったのでメモを残すことにした

## select_related

単にlist_select_related として書けばそれで良いらしい。

```
class testmodelAdmin(admin.ModelAdmin):
	list_select_related = (user, name)
```

## raw_id_fields

こちらも書くだけ。

```
class testmodelAdmin(admin.ModelAdmin):
    raw_id_fields = ('auto_check',) 
```

https://docs.djangoproject.com/en/1.11/ref/contrib/admin/

# 結果

レスポンスの違いなどを図ってみようと思ったが
とりあえずコードを書かなければならないので、後ほど追記します。
jedi-vimのポップアップの色設定

### .vimrcの設定

[Vim カラーチャート](http://www.calmar.ws/vim/256-xterm-24bit-rgb-color-chart.html)を参考に、ポップアップの背景をグレー、選択中背景をピンク、文字を黒にしてみた。

```
hi Pmenu ctermbg=8 ctermfg=0
hi PmenuSel ctermbg=13 ctermfg=0
```

文字どおり、

+  Pmenuがポップアップ
+  PmenuSelが選択中の候補
+  ctermbgが背景
+  ctermfgが文字色

### 参考
[Completion List is Pink](https://github.com/davidhalter/jedi-vim/issues/215)
[ruby]文字列の連番

参考：[知って得する！５５のRubyのトリビアな記法](http://melborne.github.io/2013/03/04/ruby-trivias-you-should-know-4/)

# succ(or next)を使う

与えられた文字列の規則に沿って、文字列を変えていってくれます。

```ruby
col = '@'
60.times.map { col = col.succ }
# => ["A", "B", "C", "D", "E", "F", "G", "H", "I", 
#"J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", 
#"T", "U", "V", "W", "X", "Y", "Z", "AA", "AB", "AC",
#"AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AK", 
#"AL", "AM", "AN", "AO", "AP", "AQ", "AR", "AS", #"AT",
# "AU", "AV", "AW", "AX", "AY", "AZ", "BA", "BB", 
#"BC", "BD", "BE", "BF", "BG", "BH"]
```

数と文字が混ざっていても次の文字列を出力してくれます。

```ruby
"abc123".succ
# => abc124
```

# Rangeクラスを使う

succと比べて、
末尾を決めてあげる必要はありますが、
Rangeでも同じような処理をできます。

```ruby
[*"a".."d"]
#=> ["a", "b", "c", "d"]
```

先頭と末尾で連続性が保てるものなら、
"a1"~"zz1"のようなものでも出力できます。

```ruby
[*"a1".."zz1"]
# =>
# ~省略~  
# "ap2",
# "ap3",
# "ap4",
# "ap5",
# "ap6",
# "ap7",
# "ap8",
# "ap9",
# "aq0",
# ~省略~
```

しかし、連続性がないものの場合は`[]`が帰ってきます。

```ruby
[*"a".."1"]
# => []
```
人狼知能用のクライアントをRubyで作ってみた

# はじめに
最近なにかと話題の人狼知能の、Ruby向けクライアントをgemにしてみました。
役割に必要なメソッドを埋める形で実装ができるようになっています。

人狼知能について詳しく知りたい方は、人狼知能の公式ページ( http://aiwolf.org/ )をご確認ください。

※今の所、人狼知能の主催者さんとこのgemには関係がありません。このクライアントに関する主催者さん方への質問はご遠慮ください。

# 導入
gemコマンドやGemfileに書くことで導入できます。

```bash
gem install aiwolf-client
```

```ruby
gem 'aiwolf-client'
```

# とりあえずの動かし方

サンプル実装として、何も考えていない無口な村人も作りました。
[Tei1988/aiwolf-player-sample-villager](https://github.com/Tei1988/aiwolf-player-sample-villager)

会話ではずーっと黙り、生きている村人から適当に投票します。
初日に吊るされそうな感じです。

これを動かことにします。

## 人狼知能のサーバを動かす
まずは、人狼知能のサーバを動かします。
Javaが必要になりますので、事前に導入しておいてください。
http://aiwolf.org/server から、人狼知能プラットフォームの最新版をダウンロードします。

展開するといろいろファイルが出てくるのですが、サーバを起動するには以下のシェルを実行します。

```bash
sh StartServer.sh &
```
（Windowsの場合は`StartServer.bat`をコマンドプロンプトやダブルクリックで実行できると思います。）

ウィンドウが出て来たら、**Connect**ボタンを押してください。

これで、**host**: 127.0.0.1, **port**: 10000でサーバが起動したはずです。

## 無口な村人を動かす

まずはクローンします。

```bash
git clone https://github.com/Tei1988/aiwolf-player-sample-villager.git
```

`bundle`します。`aiwolf`というコマンドを入れたいので、`--binstubs`もつけていますが、`bundle exec aiwolf`として読み替えていただいても構いません。

```bash
cd aiwolf-player-sample-villager
bundle install --binstubs
```

村人を人狼知能サーバに接続します。

```bash
bin/aiwolf execute -h 127.0.0.1 -p 10000 SampleVillager
```

実行すると、以下の様なログが出た後に、待機状態になります。

```
I, [2017-07-05T00:27:15.728357 #79467]  INFO -- : Connecting to 127.0.0.1:10000 with SampleVillager
```

サーバ側には、接続された旨が表示されているはずです。

## 人狼を始める

デフォルトの状態だと、15人でゲーム開始のため、残り14人を参加させなければ始められません。
残りの参加者は、ダウンロードしてきた人狼知能プラットフォームのサンプル実装を使わせてもらいましょう。

自分は以下のコマンドでばばばっと繋げちゃいます。ごめんなさい、Windowsで良い方法はわかりません…。

```bash
for N in `seq 1 14`; do sh StartClient.sh -h 127.0.0.1 -p 10000 -c org.aiwolf.sample.player.SampleRoleAssignPlayer & done;
```

15人揃ったので人狼知能のサーバの**Start Game**を押せるようになります。
押すと、人狼が始まります。

ゲームが終わると、人狼知能サーバからサンプル村人が切断されます。
結果は人狼知能サーバ側に、表示されているはずです。

# おわりに
これで人狼知能の裾野が広がればいいなぁと思います。

不具合はもちろん、ドキュメントやコードなどなど、いろいろいろ足りていないかと思いますので、PRなどなどお待ちしています :bow:
**aiwolf-client**のGithubのリポジトリは[Tei1988/aiwolf-client-ruby](https://github.com/Tei1988/aiwolf-client-ruby)です。
「vertical-align」を指定した場合と「valign」を指定した場合のChromeの開発ツールにおける表示の違い

知っている人には当たり前なこと、知らない人だと「えっ？」となります。
わたしは知らなくて「えっ？」となりました。

```html:sample.html
<html>
<head>
    <title>sample</title>
    <link rel="stylesheet" type="text/css" href="./css/style.css">
    <style type="text/css">
        .vertical_align_html {
            vertical-align: top;
        }
    </style>
</head>
<body>
    <table>
        <tr>
            <td class="vertical_align_html">HTMLに指定</td>
            <td class="vertical_align_css"><input type="text" value="CSSに指定"></td>
        </tr>
        <tr>
            <td valign="top">HTMLのタグに「valign」で指定</td>
            <td style="vertical-align: top;"><input type="text" value="HTMLのタグに「style」で指定"></td>
        </tr>
    </table>
</body>
</html>
```

```css:style.css
.vertical_align_css {
    vertical-align: top;
}
```

### HTMLのtdタグに「valign」を指定した場合の表示
この表示を見て「えっ？」となりました。
どこで指定されているかもわからず・・・「valign」の指定だと気がつくのに時間がかかりました。
![Screen Shot 2017-07-05 at 19.55.14.png](https://qiita-image-store.s3.amazonaws.com/0/159761/f8630951-5722-aa97-9a5d-0279b620ae46.png)


@T_sa さんから教えていただきました。「valign」はHTML5では廃止されているから使わないようにします。
> 注記: この属性は最新の標準仕様で廃止された (サポートされていない) ため、使用しないでください。代わりに CSS の vertical-align プロパティを使用してください。
> [td 要素 - HTML | MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/td#attr-valign)

### HTMLのstyleタグに「vertical-align」を指定した場合
![Screen Shot 2017-07-05 at 19.54.27.png](https://qiita-image-store.s3.amazonaws.com/0/159761/a5eb81bc-f966-7226-b7fd-c148781c380a.png)

### CSSに「vertical-align」を指定した場合
![Screen Shot 2017-07-05 at 19.54.50.png](https://qiita-image-store.s3.amazonaws.com/0/159761/a241d869-c130-5ffe-589a-b292b082e78d.png)

### HTMLのタグにstyle属性で「vertical-align」を指定した場合
![Screen Shot 2017-07-05 at 19.55.34.png](https://qiita-image-store.s3.amazonaws.com/0/159761/912ce9ec-bdb9-f529-6e94-9bbbcc93e88f.png)
Androidの回転をどう対応するか派閥リスト

色んな派閥があるのでまとめた。

※事例は実機で回転させた挙動からの推測。②は実は③のケースもあるかも。

# ①　縦固定でいいよ派

## やること

- マニフェストのActivityに以下を足すだけ

```xml:AndroidManifest.xml
android:screenOrientation="portrait"
```

## 利点

- 実装も楽だし、検証も楽。

## 欠点

- 横持ちで操作したいユーザーに不親切
- Android Nからマルチウィンドウがあるので、マルチウィンドウ対応をするなら結局画面の高さが短いケースは対応が必要
    - `ScrollView`でラップするなど

## 事例

- Airbnb, Uber


# ②　回転は許容するがActivityは再生成しないよ派

## やること

`configChanges`を指定する。これで回転時にActivityが破棄されなくなり、代わりに`onConfigurationChanged`が呼ばれるようになる。

```xml:AndroidManifest.xml
<activity
  android:name=".MainActivity"
  android:configChanges="keyboardHidden|screenSize|orientation"/>
```

画面はlandscapeでも表示できるように、大抵の人はレイアウトを`ScrollView`でラップしてるのではないだろうか。

## 利点

- まあまあ楽。
- 一応横持ちでも使える。

## 欠点

- 縦横で見た目の変わるビューの見た目は切り替わらない
    - 例
        - Toolbarは縦横でフォントの大きさが違うが、この方法だと回転時に切り替わってくれない
- 一部のUIライブラリは回転時にサイズ調整が上手く動かない
    - 例
        - Percent libraryでビューのwidthを画面の横幅、heightを横幅をベースにアスペクト比を指定してサイズを決めている場合、回転時にheightが新しいwidthにもとづいて更新されない
            - ConstraintLayoutなら調整される

## 事例

- Twitter, Evernote, LinkedIn

# ③　回転は許容するし、Activityも再生成するよ派

## やること

- Activityが破棄されて再生成されるので、回転の前後で状態をどうやって渡すかが肝になる。
    - 状態が渡せないと、ユーザーが入力中のテキストが消えたり、APIリクエストが中断されたりする
- 状態を保持する方法は色々ある
    - onSavedInstanceState / onRestoreInstanceStateで自分で実装する
    - [Icepick](https://github.com/frankiesardo/icepick)を使う
    - setRetainInstance(true)なFragmentを使う
    - Architecture componentの[ViewModel](https://developer.android.com/topic/libraries/architecture/viewmodel.html)を使う

## 利点

- 各ビューの見た目が回転時に調整されるので、UIが良くなる。
- 縦横でレイアウトを切り替えられる
    - `layout`と`layout-land`にそれぞれのレイアウトを用意する

## 欠点

- かなりめんどくさい。
    - 非同期処理（サーバーのAPIを叩くなど）の途中で回転が挟まった場合、どうするか？など。
        - Activityのライフサイクルより長いライフサイクルで管理する必要がある。Architecture componentのViewModelはまさにこのためにある。
- UIライブラリが回転時に状態を保持してくれるかは実装次第。
    - onSavedInstanceState / onRestoreInstanceStateで保存／復元してくれてればOK

## 事例

- Googleの各アプリ（Gmail, YouTubeなど）
Angular-CLIコマンドメモ

# はじめに
Angular-CLIに気づく前は必要なファイルを一から作って動かしたけど、
そんなことして良かったからまとめていく回。

# Angualr-CLI
大体これのお陰で解決した。
下記コマンドでインストール。

```shell
npm install -g angular-cli
```

# アプリの雛形を作る
下記コマンドを実行すると必要な物を一発で作ってくれた。

```shell
ng new 'プロジェクト名'
```

手打ちでパッケージなりフォルダなり作ってた自分は一体・・・ってなるくらいありがたかった。
動作に必要な物は揃っているはずなので、下記コマンドで実行してやるとサンプルページが上がるはず。

```shell
ng serve
```

できたファイルを書き換えるだけでもアプリになると思うけど、もうちょっと色々やってみようと思う。

## ng コマンドまとめ
自分用にコマンドをまとめておく。
基本的に`package.json`の`script`ってところに書いてあるから、直接叩くことは余り無いと思う。

### ng new
プロジェクト生成できる。
デフォルトでは`css`だが、`scss`を使いたい場合は下記のようにオプションをつける。

```sh
ng new scss-project --style=scss
```

routingをしたい場合は下記のようにする。

```sh
ng new routing-prohect　--routing
```

### ng serve
起動するときに使ったコマンド。
初期では、`npm start`って打ってもこいつが実行されるはず。
実行しておくだけで、ソースを勝手にビルド&勝手にデプロイしてくれる。
デプロイ先は開発用Webサーバ？のメモリに直接されている。

### ng build
ソースをビルドする。
ビルドした結果を実行可能プログラムとしてdistフォルダに出力される。
このdistフォルダをWebサーバに配置してやればはれてWebアプリが動くようになる。
本番用に最適化とか軽量化とかしたいときは下記のようなオプションをつける。

```sh
ng build --prod --aot
```

### ng test
テストランナーであるKarmaを使ったユニットテストを実行する。
テストFWはJasmineを使用している。
結果はcoverageに出てくる。
テストコードはJasmineの文法に則って書く。
`hoge.spec.ts`って書いてあるファイルがテストコード。

### ng e2e
e2e(End to End)のテストを行う。
Angularのe2eテストFWはprotractorが使われる。
Angular(角度)のテストFWをprotractor(分度器)って言ってるからAngular用のFWだと、どっかに書いてあった記憶。
e2eテストなので、バックエンド側と疎通できないとテスト失敗する。
だから、ちゃんとサーバも忘れず起動する。

# まとめ
自分なりに調べたことだから間違いがあるかも。
とりあえずAngular-CLIとても便利だと思ったところです。
これを元に色々作ってみようと思います。
(PHP)Laravelでマークダウンに対応させてみる

##はじめに
プログラミングの初心者ですが、面白いと思った機能を自分なりの形でアウトプットしていこうと思っています。よろしくお願いします。

今回のメインはマークダウンです。そのため、その他の機能(投稿機能など)の説明に関しては省かせていただきます。
##マークダウンとは
wikiやQuiitaのように、見出しやリストなどに対応し、見やすい投稿記事が作成できる機能です。

大雑把な説明ですが、知っていて損はないと思います。
それでは早速やっていきましょう！！

##マークダウンに対応する
まず、何もせず投稿するとどうなるのかを見て見ましょう。
<img width="1202" alt="スクリーンショット 2017-07-04 19.47.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/177058/e38d78a5-6b9d-4b1d-0e5a-7f62e84427ec.png">
この内容で投稿してみます。

<img width="724" alt="スクリーンショット 2017-07-04 19.47.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/177058/cc022b8e-b31a-8f2d-717c-6fc92a12da7f.png">
マークダウンにはなっておらず、そのまま表示されしまっています。
###マークダウンライブラリを導入！！
マークダウンのライブラリはたくさん存在します。今回は、私が使った中で一番やりやすかった「[cebe/markdown](https://github.com/cebe/markdown)」を使用します。

①composerでインストールする
```
$ composer require cebe/markdown
```
②パースをする

「[cebe/markdown](https://github.com/cebe/markdown)」の使い方を見てみると、

```github.com/cebe/markdownより
$parser = new \cebe\markdown\Markdown();
echo $parser->parse($markdown);
```
と書かれているので、これをお手本にしてパースを実装していきましょう。
モデル（Weicomeモデル)に投稿文(body)をパースするための`parse()`メソッドを追加します。

`use`でインポートして

```app/Welcome.php
use cebe\markdown\Markdown as Markdown; ←追加

class Welcome extends Model
{
```
`parse()`メソッドを追加します。

```app/Welcome.php
public function parse() {
        //newでインスタンスを作る
        $parser = new Markdown();
        //bodyをパースする
        return $parser->parse($this->body);
    }
```
さらにテンプレートからモデルの属性値として取得できるようにしておきます。
以下のようにすることで`mark_body`とするだけでマークダウンに対応した投稿文を取得できるようになります。

```app/Welcome.php
public function getMarkBodyAttribute() {
        return $this->parse();
    }
```
投稿詳細画面のテンプレートの該当箇所を変更します。

```resources/views/welcome/show.blade.php(修正前)
@extends('layouts.app')

@section('content')
<h1 class="text-muted">{{ $tweet->title }}</h1>
<div class="text-muted">
    {{ $tweet->body }}
</div>
@endsection
```
```resources/views/welcome/show.blade.php(修正後)
@extends('layouts.app')

@section('content')
<h1 class="text-muted">{{ $tweet->title }}</h1>
<div class="text-muted">
    {!! $tweet->mark_body !!}　←ここ！！
</div>
@endsection
```
※`{!! !!}`でHTMLをそのまま表示するようにしています。

プラウザで確認して見ましょう!!

<img width="679" alt="スクリーンショット 2017-07-04 22.09.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/177058/3a35ddd6-420b-a4bb-de6a-3c790232585f.png">
###マークダウンになっています！！完成です！！
##反省点
モデルを`tweet`にするなど、見る側がわかりやすい名前をつければよかったと思いました。
次からは、よりわかりやすい投稿を心がけます。
##ソースコード
githubにアップしてありますので、参考になればと思います。
https://github.com/mk2taiga/markdown_app
Qiitaの投稿ではtdタグにborder-topの装飾が付かない

# `thead`と`tbody`を使わない場合
<table>
    <tr>
        <th>ここはthです</th>
        <td>ここはtdです</td>
    </tr>
</table>


```html
<table>
    <tr>
        <th>ここはthです</th>
        <td>ここはtdです</td>
    </tr>
</table>
```
* F12で見ると`td`の`border-top`が装飾されていない





# `td`を`tbody`に入れた場合

<table>
    <tr>
        <tbody>
            <th>ここはthです</th>
            <td>ここはtdです</td>
        </tbody>
    </tr>
</table>

```
<table>
    <tr>
        <tbody>
            <th>ここはthです</th>
            <td>ここはtdです</td>
        </tbody>
    </tr>
</table>
```
* F12で見ると先ほどと同じように`td`の`border-top`が装飾されていない



# `td`を`thead`に入れた場合

<table>
    <tr>
        <thead>
            <th>ここはthです</th>
            <td>ここはtdです</td>
        </thead>
    </tr>
</table>

```
<table>
    <tr>
        <thead>
            <th>ここはthです</th>
            <td>ここはtdです</td>
        </thead>
    </tr>
</table>
```

* developper toolで`td`を確認してみると`.markdownContent thead td`として`border-top`が装飾されていた

```css
.markdownContent thead td, .markdownContent th {
    font-weight: 700;
    background-color: #fff;
    border-top: solid 1px #d9d9d9;
}
```



# 推測
* `.markdownContent thead td`ではなく`.markdownContent tbody td`に当てるべきところを間違えた？
Rでは量指定子を変えても正規表現の実行速度にほとんど影響しない

#はじめに

pythonでは

[【メモ】量指定子を変えると正規表現の実行速度が桁で変わる（仮）](http://qiita.com/okipow/items/3f0b173748b5802695ef)

という話があるので、Rでも試してみた。

-  `+`と`{1, }`  
-  `*`と`{0, }`  
-  `?`と`{0, 1}`  

を比較する。

結果としては`base::grep`も`stringr::str_detect`も大差ないか、`{m, n}`で指定する方が若干遅い。

残念。

#実験開始

##準備

```r
require(stringr)
require(microbenchmark)
require(knitr)

x <- 'bbbbbbbbbbbbbbbbbb'
```

##`base::grep`の場合

```r
kable(summary(microbenchmark(
  grep('b+', x),
  grep('b{1,}', x),
  grep('b*', x),
  grep('b{0,}', x),
  grep('b?', x),
  grep('b{0,1}', x)
)))
```

|expr              |   min|     lq|    mean| median|      uq|     max| neval|
|:-----------------|-----:|------:|-------:|------:|-------:|-------:|-----:|
|grep("b+", x)     | 4.790| 5.4740| 8.80653| 5.4750|  9.5795|  67.057|   100|
|grep("b{1,}", x)  | 4.790| 5.4740| 7.33539| 5.8165| 10.2640|  14.369|   100|
|grep("b*", x)     | 5.474| 5.4740| 7.52007| 6.1580|  7.1850|  34.213|   100|
|grep("b{0,}", x)  | 5.474| 5.4745| 9.04599| 6.1580| 10.2640| 116.322|   100|
|grep("b?", x)     | 4.790| 5.4740| 8.36862| 6.1580| 10.2640|  56.109|   100|
|grep("b{0,1}", x) | 5.474| 5.4740| 9.29229| 6.1580|  6.8430|  95.110|   100|

##`stringr::str_detect`の場合

```r
kable(summary(microbenchmark(
  str_detect(x, 'b+'),
  str_detect(x, 'b{1,}'),
  str_detect(x, 'b*'),
  str_detect(x, 'b{0,}'),
  str_detect(x, 'b?'),
  str_detect(x, 'b{0,1}')
)))
```

|expr                    |    min|      lq|     mean|  median|      uq|     max| neval|
|:-----------------------|------:|-------:|--------:|-------:|-------:|-------:|-----:|
|str_detect(x, "b+")     | 34.212| 36.2650| 51.34606| 37.6340| 60.5560| 216.222|   100|
|str_detect(x, "b{1,}")  | 35.581| 37.6340| 51.42818| 39.6870| 64.6615| 172.430|   100|
|str_detect(x, "b*")     | 34.896| 36.2655| 53.82303| 39.3445| 63.9770| 169.693|   100|
|str_detect(x, "b{0,}")  | 35.581| 37.6340| 54.09672| 46.1875| 66.3725| 110.164|   100|
|str_detect(x, "b?")     | 33.528| 34.8970| 54.08311| 41.7390| 59.8715| 460.498|   100|
|str_detect(x, "b{0,1}") | 34.212| 35.5810| 59.48179| 52.0030| 59.1875| 632.243|   100|


#感想

-  `{m, n}`の方が、明示的で分かりよいと思う
-  `grep`の方が速いのは意外だった
ActionBarの下にある影（dropshadow）が消えない！→試したら消えた設定

# ActionBarの下にある影（dropshadow）が消えない！

私が試して消えたのはこれ。
android.support.design.widget.AppBarLayout　に

`app:elevation="0dp"`

以上。            

（※動作バージョンとか未検証です）
pythonでスクレイピングしてみた

今回はBeautifulSoupを使っていきます。
python 3.6.0
BeautifulSoup 4.6.0

ドキュメントはコチラ
英語
http://www.crummy.com/software/BeautifulSoup/bs4/doc/

日本語
http://kondou.com/BS4/

##インストール
```
$ pip install beautifulsoup4
```


##とりまBeautifulSoupを実行
このページのデータを取ってきてh1タグの中身を表示するプログラムです。
https://pythonscraping.com/pages/page1.html

```python3
from urllib.request import urlopen
from bs4 import BeautifulSoup 
html=urlopen("https://pythonscraping.com/pages/page1.html")
bsobj=BeautifulSoup(html.read())

print(bsobj.h1)
```

このままでは、webページが見つからなかったり、予期せぬデータフォーマットでスクレイパーがエラーを吐いたりするので、例外処理を書いておくべきです。

##エラー対策

```python3
html=urlopen("https://pythonscraping.com/pages/page1.html")
```
この行はページが見つからないとエラーになってしまいます
なので、以下のように書き換えます。

```python3
try:
	html=urlopen("https://pythonscraping.com/pages/page1.html")
except: 
	print("ページが見つかりません")
```

またこの行でもエラーが起きる可能性があります

```python3
bsobj=BeautifulSoup(html.read())
```
このように書き換えました。

```python3
try:
    bsobj=BeautifulSoup(html.read())
    print(bsobj.h1)
except:
    print("error")
```

##目的のタグを見つける
find()とfindAll()を使うことで目的のタグを見つけることができます
次のコードは```<span class="green"></span>```内のテキストを表示します

```python3
span_list = bsobj.findAll("span",{"class":"green"})
```

class="green"だけでなくclass="red"も表示したい場合は次のように書き換えます。

```python3
span_list = bsobj.findAll("span",{"class":{"red","green"}})
```

##タグを取り除く

```python3
span_list = bsobj.findAll("span",{"class":"green"})
for i in span_list:
    print(i)
```
このコードでは```<span class="green"></span>```のテキストを表示しますがタグも一緒に表示されてしまいます
中のテキストだけ欲しい場合は次のように書き換える必要があります

```python3
#タグも一緒に表示
print(i)

#タグ無しで表示
print(i.get_text)
```
botに使われる技術（マルコフ連鎖とアノテーションについて）

勉強会の備忘録である前の記事、
[LINE Business Centerとapi.aiを使ってチャットボットを作る](http://qiita.com/salmonosushi/items/20310131b0423c408ea1)の続きです。
よく分からなかったから、飛ばした内容を自分の中で整理しました。

#マルコフ連鎖
* マルコフ連鎖とは

>マルコフ連鎖（マルコフれんさ、英: Markov chain）とは、確率過程の一種であるマルコフ過程のうち、とりうる状態が離散的（有限または可算）なもの（離散状態マルコフ過程）をいう。また特に、時間が離散的なもの（時刻は添え字で表される）を指すことが多い（他に連続時間マルコフ過程というものもあり、これは時刻が連続である）。マルコフ連鎖は、**未来の挙動が現在の値だけで決定され、過去の挙動と無関係である（マルコフ性）**。各時刻において起こる状態変化（遷移または推移）に関して、マルコフ連鎖は遷移確率が過去の状態によらず、現在の状態のみによる系列である。

(゜ω゜)？？
ちょっとよく分からなかったので、調べてみると個人的にここが分かりやすかったです。
[マルコフ連鎖でTwitter Botをつくりました](https://takuti.me/note/twitter-bot/)

* 例  

上記サイトに則って考えます。


以下の2つの文章があるとします。
（１）私はサーモンが好きです。
（２）私はサーモンが嫌いです。

この文章を、分かち書き（文章を小さい単位に区切る）すると、以下のようになります。

（１）私　は　サーモン　が　好き　です　。
（２）僕　は　サーモン　が　嫌い　だ　。

これを、3単語ごとにグループ分けします。

（１）
**(始まり)　私　は**
**私　は　サーモン**
**は　サーモン　が**
**サーモン　が　好き**
**が　好き　です**
**好き　です　。**
**です　。（終わり）**

(始まり)と(終わり)もカウントするみたいです。
(2)の文章も同じように、グループ分けします。

（２）
**(始まり)　僕　は**
**僕　は　サーモン**
**は　サーモン　が**
**サーモン　が　嫌い**
**が　嫌い　だ**
**嫌い　だ　。**
**だ　。（終わり）**

準備はここまで。
それでは、文章を作ります。

まず先頭に(始まり）のあるグループを探します。

**(始まり)　私　は** 
**(始まり)　僕　は** 

上の2つが選択肢となります。
ここでは、**(始まり)　私　は** を選んだとします。

最後が**「は」**で終わっているので、**「は」**から始まるグループを探します。

次に来るのは、
**は　サーモン　が** 
のグループしかないので、
**「私はサーモンが」** と、文章が続くことが決まります。

同じように続けていきます。
今**「が」**で終わっているので、次は**「が」**で始まるグループを探します。

**が　好き　です**
**が　嫌い　だ**

ここでは、**が　嫌い　だ** を選んだとします。
次に、「だ」で始まるものは、

**だ　。（終わり）**

しかありません。
（終わり）が来たので、ここで文章が終わります。
つまり、_「私はサーモンが嫌いだ。」_という文章が作られました！
生成できる文章は、上の文章含め4パターンになるということでしょうかね。

このように3つの単語のつながりを見て、次に出現する単語を決めるという方法を、**3階のマルコフ連鎖**というみたいです。



#アノテーション
* アノテーションとは  

>アノテーション（英語：annotation）とは、あるデータに対して関連する情報（メタデータ）を注釈として付与すること。


先ほどの文章で考えると、
私　は　サーモン　が　好き　です　。

私に「主語」という情報をつけたり、
サーモンに「食べ物」という情報をつける・・・ということだという認識です。

他にも「食べ物」という情報が注釈されている「お寿司」というデータがあるとしたら、
「私はお寿司が好きです。」という自然な文章が作れるようになるということでしょうか。





#まとめ、感想
以上を文章に当て込んで学習させることで、botの文章の精度がよくなるそうです。  

アノテーションはどのような情報をつけるというところまで、自分ですべて考えなければいけないのだろうか？そこも学習してくれるのかなあというちょっとした疑問が残りました。

これを調べている中で、マルコフ連鎖を用いてTwitterのbotを作るという記事が多かったです。
面白そうなので、私も今度試してみたいと思います。
おや？、Apache動いてるのにブラウザで見れない・・・と思ったら

# ※自分への備忘録です、手慣れた方には用のない話かもしれません

最近はCentOSでyumコマンドで環境構築するので、一昔前みたいにソースからコンパイルして環境構築することがなくなり、さくっと作れる反面、久々に作ると引っかかるところについて。

※VMwareでゲストマシン(CentOS7)を対象にすることを想定しています。

# あれ？、ブラウザで見れない？なぜ？
### サーバーとクライアント間のネットワークはつながっている？

・まず、ネットワーク的にお互い見えてる？（適時、アドレスは変えて）
$ ping 192.168.xxx.1

返事が返ってくれば、ネットワーク的にはつながっているはずだ。
返って来ない場合、VMwareの仮想マシンの設定とか、ちゃんとDHCPの設定とかを見直す

### クライアントから見て、そもそもポート空いてる？ 
※Windows10の場合、telnetが最初は使えないので以下のサイトを参考に使えるようにしておく
https://mumu.jpn.ph/forest/computer/2016/04/02/3084/
で、コマンドプロンプト開いて
C:\> telnet 接続先 ポート番号

このコマンドで80番ポートを叩いてTCPで80番に接続できるか確認する。
接続できた場合は黒い画面で止まる。
詳しいなら、ここでhttpのリクエスト文投げてみてもいい。

接続できないと、接続に失敗しましたと出る、つまり少なくともそのポートは空いて無い。

### じゃあ、ファイヤーウオール？
firewalld自動起動設定確認（CentOS7）
 #systemctl is-enabled firewalld
enabled

iptables自動起動設定確認（CentOS6）
 #systemctl is-enabled iptables
disabled

こいつが有効な場合は、停止させるか、許可を出すか。

・停止させる場合（上7、下6）
 # systemctl stop firewalld
 # systemctl stop iptables

・許可を出す場合
以下のサイトがまとまっててわかりやすい
http://qiita.com/miosee/items/0599baa3a01301265a43

※公開サーバーでは無効にしないで下さい。

### なんですと？、まだつながらない

その場合、憎いアイツ「SElinux」が悪さをしているに違いない。
※セキュリティ的に重要です、別に悪いものではない。

SELinuxの動作確認方法
 # getenforce

disabled：SELinuxを無効
enforcing：ポリシーに違反するアクセスに対し、ログに書き出して拒否(SELinuxは有効)
permissive：ポリシーに違反するアクセスに対し、ログに書き出して許可(SELinuxは無効)

ヒャア！！めんどくせえ、死にさらせ！！な場合
SELinuxを一時的に無効化
 # setenforce 0

そもそも起動しないようにする場合
 # vi /etc/selinux/config
で開いて、以下のように設定する。
SELINUX=disabled 

※公開サーバーでは無効にしないで下さい。

### これでもつながらない場合？
Apacheを5回くらい再起動したら、動いたこともある（原因不明）
 # service httpd restart

### それでもだめな場合
１．諦める
２．OS再インストール（何か壊したんだろう）
３．隣の席の人も巻き込む
４．向かいの席の人も巻き込む
５．隣の部屋の人も巻き込む

まあ、ここまでやってダメだったら、ダウンロードしたときのメディアになにか問題がある可能性もある。（過去にあった）
hostapdがNetworkManagerと干渉して動かない

hostapdが動かない。
エラーの内容から原因が類推できず、若干悩んだので、メモ。

# 環境
Ubuntu Desktop 16.04 64bit

# エラー
```shell-session
# hostapd  /etc/hostapd/hostapd.conf
nl80211: Could not configure driver mode
nl80211: deinit ifname=wlx001122334455 disabled_11b_rates=0
nl80211 driver initialization failed.
wlx001122334455: interface state UNINITIALIZED->DISABLED
wlx001122334455: AP-DISABLED
hostapd_free_hapd_data: Interface wlx001122334455 wasn't started
```

これじゃ原因がわからん。ググってもいまいち。
そこでデバッグオプション。

```shell-session
# hostapd -dd /etc/hostapd/hostapd.conf
:
nl80211: Failed to set interface 4 to mode 3: -16 (Device or resource busy)
:
nl80211: Failed to set interface 4 to mode 2: -16 (Device or resource busy)
```

なんか競合っぽい!

# ググる
色々出てくる。結局、NetworkManagerと干渉しているようだ。
詳細は[こちら](https://askubuntu.com/questions/472794/hostapd-error-nl80211-could-not-configure-driver-mode)や[こちら](https://wiki.archlinuxjp.org/index.php/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88)を参照。
またもArchWikiから発想をいただく。

# 解決策
1. NetworkManagerを完全に消し去る
2. NetworkManagerを止める
3. 該当NICをNetworkManagerの管理外にする

今回は2.で。

# NetworkManagerの止め方
[Ubuntu Community Help Wiki](https://help.ubuntu.com/community/NetworkManager#Stopping_and_Disabling_NetworkManager)によると、

```
sudo systemctl stop NetworkManager.service
sudo systemctl disable NetworkManager.service
```

がよさそう(Ubuntu 15.04以降)。

# おまけ: Ubuntuのsystemdとネットワーク設定
UbuntuでNetworkManagerを止めて`/etc/network/interfaces`を使う場合、systemd-networkdとの関係はどうなっているのだろう。

## systemd-networkd
`ps`で見ても、居ない。動いていないのだろう。

## networking.service

```/etc/systemd/system/network-online.target.wants/networking.service
ExecStart=/sbin/ifup -a --read-environment
```

などとある。これで`/etc/network/interfaces`が読まれているのだろうか。
逆に言うと、network-online.target は、ネットワークの設定が施された後の条件として使える、ということか。

## /etc/init.d/networking
init.dにもnetworkingは存在する。Ubuntu 16.04ではupstartは使われていないようだが、このディレクトリの使われ方は?

## 宿題
[ubuntu wiki](https://wiki.ubuntu.com/SystemdForUpstartUsers#How_to_identify_which_init_system_you_are_currently_booting_with)や[このへん](https://askubuntu.com/questions/867843/sysv-upstart-and-systemd-init-script-coexistence)を見て、お勉強。
あと、`NetworkManager`と`network-manager`の違いの調査。
Vivaldiでタブの上の微妙なスペースを消す方法

# はじめに

最近、メインのブラウザをChromeからVivaldiに変えました。
完全にChromeと置き換わったわけではありませんが、Chromeにはない機能や設定項目がたくさんあり、とても気に入りました。
ですが、タブの上に微妙なスペースが空いていることが気になっていました。(私は、タブを上に並べる設定にしています)
タブを切り替えるためにクリックしたと思ったらクリックできていなかったことが何度かありました。
なんとなく気になったので、設定項目を見直したらちゃんと直せたので設定方法を書いておきます。

# 設定項目

タブ → タブ表示 → ウィンドウ最大化時に、タブの隙間を詰める
これにチェックを入れます。
または、検索ボックスから「タブの隙間」とかで検索しても出てきます。

### これが…
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153517/78211d05-b919-d821-7a49-a295676d3345.png)
### こう
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153517/ba785334-10f8-07e2-9fb5-d0a3980c86a2.png)

# まとめ

**Vivaldiはいいぞ**
Rubyとブラック・ショールズ・モデルを使ってオプションのプレミアム価格を計算してみる

## 概要
大学の金融の授業でコール・オプションのプレミアムを算出しろと言われまして、
関数電卓を毎回叩くのも嫌だったので、Rubyで書いてみました。

[ブラック・ショールズ・モデル](http://www.findai.com/kouza/4009opt.html)

> ブラック・ショールズ・モデル（Ｂ＆Ｓモデル）は、ヨーロピアンタイプ（満期日にのみ行使可能なオプション）のオプション価格を計算するモデルです。

## 準備
標準正規分布を使うので、 `rubystats` をインストールします。

```sh
gem install rubystats
```

## 問題

「現時点で1000円の株式を1ヶ月後に1010円で買う権利」のオプション・プレミアムはいくらか。

### 条件

* [t]  期間 : 1　（ヶ月）
* [s1] 現時点での株価 : 1000 (円)
* [k]  権利行使価格 : 1010 (円)
* [i]  安全利子率　（無リスク利子率とも。）　: 0.01 (1%)
* [s]  ボラティリティ (株価収益率の標準偏差) : 0.2


## 計算

```rb:black_sholes.rb

require 'rubystats/normal_distribution'

include Math, Rubystats

# 期間 (xヶ月)
t = 1.0

# 現時点における株価
s1 = 1000.0

# 権利行使価格
k = 1010.0

# 安全利子率
i = 0.01

# ボラティリティ (株価収益率の標準偏差)
s = 0.2


# ブラックショールズモデルでは、変数は全て連続時間で表されているので、
# 安全利子率iを連続複利に変換する。　（いらないかも？）

i = log(1 + i)


# ブラックショールズモデルの公式に当てはめる

d1 = ((log(s1.fdiv(k)) + (i * t / 12.0)) / (s * sqrt(t / 12.0))) + (s * sqrt((t / 12.0)) / 2)
d2 = d1 - s * sqrt(t / 12.0)

# 標準正規分布の分布関数の -∞ から d までの面積を求める

norm = NormalDistribution.new(0, 1)
nd1 = norm.cdf(d1)
nd2 = norm.cdf(d2)

c = s1 * nd1 - k * exp(-i * (t / 12.0)) * nd2

puts c

```


## 結果

```sh
$ ruby black_sholes.rb

18.841852952877787

```

> 「現時点で1000円の株式を1ヶ月後に1010円で買う権利」のオプション・プレミアムはいくらか。

20円くらいじゃね？(｡ﾟ;艸;ﾟ)
raspberry Pi 1 デバイスドライバ

組み込みlinuxで必要となるデバイスドライバを作るため『ARMデバイスドライバープログラミング』という本を見て勉強しようと思った

2017.7.2現在では本の通り進めてもエラーが出て進むことが出来ない。以下の通り行うとエラーを解決できる

本の通りに行うと100ページのinsmodでエラーが出る。内容は
root@raspberrypi:/home/pi# insmod ssegled.ko
insmod: ERROR: could not insert module ssegled.ko: Device or resource busy
root@raspberrypi:/home/pi# dmesg | tail
[ 1045.453728] ssegled loading...
[ 1045.453773] request_mem_region failed.
[ 1045.457656] Can not use GPIO registers.　
である

エラーの内容を出版社に問い合わせたところエラーの原因はlinuxカーネルのバージョンが新しくなっているためであるとの回答があった。解決策として旧カーネルソースを使うことであるとの回答であった。

前提条件
RaspberryPi 1 model B+(SOCがSamsungのタイプのもの)
OSは2015-01-31-raspbian.img

注意点)raspberryPi 1 model B+ には2種類が存在している。種類というのはsocがSamsungのタイプとELPIDAのタイプである。正解のボードはSamsungのsocを搭載したraspberryPi 1 model B+ である。ELPIDAのraspberryPi 1 model B+は使うことが出来ない。その理由はfirmwareが新しくなったため古いraspbiangが起動できないためである。
補足として今日現在発売されているraspberryPi 1 model B+はELPIDAのタイプしか手に入らない。手に入れるにはオークション等で入手すること

![soc.jpg](https://qiita-image-store.s3.amazonaws.com/0/190551/5ad326ee-f17d-cc26-5c58-cda7bd4b90ce.jpeg)


まず最初にパソコンから旧バージョンのraspbianをダウンロードし、micro sdに焼きraspberryPiで起動する。旧バージョンを使う理由は本の内容が旧バージョンにしか対応していないためである。旧バージョンは「2015-01-31-raspbian.img」をダウンロードする。
RaspberryPiに挿入し起動する。繰り返しの説明になるがsocがELPIDAのraspberry Pi1 model B+では旧バージョンのraspbianが起動しないので注意すること

raspbianが起動し初期設定を終えたら$startxでxwindowを起動し端末を起動する

以下の通りコマンドを入力する
$sudo wget https://github.com/raspberrypi/linux/archive/rpi-3.18.y.tar.gz　//旧カーネルバージョンのカーネルソースをダウンロードする
$tar xfvz rpi-3.18.y.tar.gz　//展開する
$cd rpi-3.18.y 
$sudo apt-get install bc　//makeに必要なbcをインストールする
$sudo make bcmrpi_defconfig
$sudo make //makeに14時間くらい掛かった
$sudo make modules_install
$sudo cp arch/arm/boot/Image /boot/kernel.img　//ビルドしたカーネルをコピーする
$sudo reboot　//再起動する

あとは本の100ページのinsmodが本の内容通りになることを確認する

総括
最新のraspbianにはdevice treeという方式を採用したため本の内容が使えなくなった。著者の方に頑張って書いて頂きたいものである
『おもしろい』とは何か（２） @ゲームプログラマの小話[創作:エンタメ論] 

# 『おもしろい』とは何か（２）

『おもしろい』とは何か（１）の続きです。

前回は「おもしろいっていうのは感情が動くこと」というお話をしました。

今回は感情の動き方の個人差の話です。

## あなたにとって嬉しいことはみんなにとっても嬉しいこと？

唐突ですが、外食店で「いただきます」を言うことは恥ずかしい、といった内容のまとめ記事を最近読みました。店員さんに「ありがとうございます」と言うことも人によって賛否あるらしいですね。

どちらも感謝を表現する言葉で、賛成派の人にとっては温かい気持ちになる＝**和む**という感情の動きが発生、もしくはその人たちにとっては当たり前のことなので何も感情が動かない、というパターンが考えられます。一方で否定派の人には不快な気持ち＝**嫌悪**の感情の動きが発生します。

このことから、同じシチュエーションでも人によって感情の動き方が違うことがある、ということが考えられます。

> 補足：
> このエピソード自体は日常の風景の描写であってエンタメではありません。ですが、人の感情が動くという点で『おもしろい』を考える上で参考になる事例です。日常には感情の動かし方のヒントがたくさん転がっています。

## 町娘が働くことは褒められること？

もう１つ事例をお話します。

時代劇で病気の父と暮らす町娘が家事をしながら働いて生活費を稼ぐ、というテンプレ的な描写があります。そしてこういう描写の後にはだいたい町娘が悪者におそわれ、それを正義のヒーローが助けるといった展開が待っています。

家事もしながら仕事もする町娘、かわりそうだなぁという**同情**、偉いなぁという**尊敬**といった感情を視ている人は抱きます。そして、そんな町娘に悪さをする悪党には許せないという**嫌悪**感を抱き、そんな悪党をこらしめる正義のヒーローには**憧れ**や**感謝**の感情を抱くことになるでしょう。

この話を考えた脚本家さんもこういった感情の動きを考えて書いたと推測できます。

さてこの感情の動き方。視た人は全員同じ感情の動き方をするでしょうか？

少し昔の日本の高視聴率テレビ番組でこのような話の展開がみられることから、日本に住む多数の人はこの感情の動き方をすると考えられます。しかし、女性が人前に出て働いて生活費を稼ぐことを宗教上の理由などによって良いと考えない人がこの時代劇を視たときはどうでしょうか？

女性に対する**同情**・**尊敬**は**嫌悪**になり、その結果、悪党に対する**嫌悪**はなくなり、正義のヒーローに対しての**憧れ**や**感謝**もなくなってしまうかもしれません。

そしてこうなってしまうと脚本家さんが想定した感情の動き方とは大きく異なる結果となります。

## 感情も動き方は人それぞれ

外食店と時代劇の２つの事例を話しました。

この２つの例からお伝えしたかったことは**人は成長環境によって感情の動き方が異なる**ということです。

どういう人たちに育てられてきたのか、周りにどういう人たちがいたのか、どういう本やメディアに触れてきたのか、どういう宗教や文化のもと育ってきたのか、そういったありとあらゆる成長環境によって人の感じ方というのは変わります。

## まとめ

感情の動き方は成長環境によって人それぞれなんだよというお話をしました。

これを別の表現にすると、**あなたの考える『おもしろい』は全人類が『おもしろい』と思うものにはらない**とも言えます。エンタメを作る上でとても大切なことですのでぜひ覚えておいてください。

第３回へ続きます。

## おわり

リンク：[ゲームプログラマの小話-目次](http://www.10106.net/~hoboaki/wiki/index.php?%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E5%B0%8F%E8%A9%B1)
サーバ名何にする？

#サーバ名何にする？

上司からこんな事を言われたことがある方、いらっしゃるのではないでしょうか？
私も、以前社内にサーバを導入する業務についた時に、「・・・でサーバ名どうする？」と
よく聞かれた経験があります。

その度に、えーと・・・・ってなって、考えておきます！とは言ったものの
ピッタリフィットするものが、思いつかない！！！！

ってなことが結構あったので、実際の現場で使われていたものや
世の中の人がどのような形で名前付けしているのか調べてみました。
※サーバ名に限らずプロジェクト名、製品名、ActiveDirectoryのドメイン名などにも使えます。
**すみません。量は少ないため、こんなカテゴリあったよ。などあればご連絡頂ければ追記させて頂き、皆様のお役に立てるものにできればと思います。面白いやつも募集です（笑）**

##現場で見てきた名前

###1. 都市系
　ROMA（ローマ）、Madrid（マドリード）、Barcelona（バルセロナ）、
　Seattle（シアトル）、NewYork（ニューヨーク）、東京、福岡など

###2. 太陽系
　EARTH（地球）、MOON（月）、Jupiter（木星）、Venus（金星）、
　太陽（SUN）など

###3. 山系
　Fuji（富士山）、Everest（エベレスト）、Chomo（チョモランマ）
　Denali（デナリ）、Kilimanjaro（キリマンジャロ）など

###4. フルーツの名前
　Banana（バナナ）、Orange（オレンジ）までは見たことあります。

###5. ガンダムの名前
　Char（シャア）、Dom（ドム）など

###6. 面白かった系
　EVA（エヴァンゲリオン）
　お客さんが好きで、プロジェクト名がエヴァでした（笑）

##よく聞く名前（調査した分を含む）

###1.  ギリシャの神話系
　Zeus（ゼウス）、Hades（ハデス）、Artemis（アルテミス）、
　Poseidon（ポセイドン）など

###2.  ディズニーのキャラ系
　Alice（アリス）、Ariel（アリエル）、Yoda（ヨーダ）、
　Nimo（ニモ）、Woody（ウッディ）など

###3.  北欧神話系
　Oden（オーディン）、Odr（オーズ）、Ullr（ウル）など

###4.  クラシック作曲家
　Mozart（モーツァルト）、Bach（バッハ）、Chopin（ショパン）、
　Rachmaninoff（ラフマニノフ）など

##コメントにて教えて頂いたもの

###1. Red Had Linux のコードネーム
　Alhalla、Enigma、Shrike、Zoot、
　Apollo、Hedwigなど

###２. 順序性がある名前
　Anton（A）、Berta（B）、Casar（C）、
　Dora（D）、Emil（E）など

###３. 語呂が良い名前
　nas-a（ナサ）、nas-b（ナスビ）など

##結論
名前付けの際に、思いつきで決めるのもいいですが、「なんでこの名前なんですか？」って聞かれたときにやっぱり何かしら意味があって、納得できるものがある方が良いと思います。

##参考
１．サーバ名など、たくさんの名前が必要なときに使える「命名シリーズ」まとめ
http://masahiror.hatenadiary.jp/entry/20060904/naming_matome
GoogleComputeEngine上にサーバを立ててUNETを動かす

#環境
Unity5.6.2f1
Windows10 Home

#概要
GoogleComputeEngine（AWSのEC2のようなの）上で、Linuxサーバのインスタンスを作成し、UNETのサーバプログラムを動かし、マルチ対戦します

#GoogleComputeEngineの常時無料枠
以下のUrlに記載されています
https://cloud.google.com/free/docs/always-free-usage-limits
https://cloud.google.com/compute/pricing
USリージョンの「f1-micro」インスタンスが１つ無料とあるようです（バージニア州北部を除く）

#インスタンスの作成
以下のページで詳しく解説されています
<a href=https://blog.apar.jp/web/6966/#comment-27793>あぱーブログ</a>
「Compute Engine インスタンスの作成」まで進める
 コンソールで「外部IP 」を確認しておく。（例：104.198.168.72）

#GoogleCloudSDKのインストール
https://cloud.google.com/sdk/downloads?hl=ja
「対話型インストーラ」の記述に沿ってインストールします

#ログイン
すでにSDKをインストールしていて別のアカウントで使用していた場合、ログインが必要です
・「gcloud auth login」と入力
・アカウントを選択する

#サーバのポート開放
・「コマンドプロンプト」を開く
・「gcloud compute firewall-rules create VVV --allow tcp:0-10000,udp:0-10000」と打ち込みリターン
　VVVはルール名（例：unet）
　何番を開放すればよかったのかわからないので0から10000まで解放している
　コンソールの「VPCネットワーク」>「ファイヤーウォールルール」で確認できる
　　https://console.cloud.google.com/networking/firewalls/list?project=heroic-passkey-178708&tab=INGRESS
　
#UNETプログラムの用意
<a href=https://github.com/fukaken5050/TestMultiPlay/blob/master/TestMultiPlay.zip>ここ</a>にテスト用のUNETプログラムを用意しました
・「Download」を押してzipをダウンロード
・zip内に含まれる「Linux」内のものがサーバにアップするプログラム
・「WinApp」内のものはサーバと接続するクライアントプログラム、またはローカル確認用のサーバプログラムを兼ねる

#サーバにデプロイ(コピー）
・ダウンロードしたzipを展開する
・「コマンドプロンプト」を開き、「Linux」フォルダ内に移動する
・「gcloud compute copy-files \*.* XXX@YYY:」と打ち込みリターン
　XXXはユーザー名
　YYYはインスタンス名
 （例:gcloud compute copy-files \*.* fukaken5050@test-instance:）

#sshでサーバに接続
・「コマンドプロンプト」を開き、「Linux」フォルダ内に移動する
・「gcloud compute --project "AAA" ssh --zone "BBB" "XXX@YYY"」と打ち込みリターン
　AAAはプロジェクト名
　BBBはインスタンスのリージョン
　XXXはユーザー名
　YYYはVMインスタンス名
 （例:gcloud compute --project "testcomputeengine-171603" ssh --zone "us-central1-a" "fukaken5050@test-instance"）
　内部で「putty」が実行されてサーバのコマンドラインが入力できるようになる

#実行権限の付与
・「putty」上で「chmod u+x EEE」と打ち込みリターン
　EEEはプログラム名（例：chmod u+x server.x86_64）

#サーバプログラムの実行
・「putty」上で「nohup ./EEE -logFile server.log &」と打ち込みリターン
　EEEはプログラム名（例：nohup ./server.x86_64 -server -logFile server.log &）
　-serverはUNETプログラム内部で使用している独自のパラメータ
・「Ctrl+C」でプロンプトに戻る

#テスト用クライアントプログラムの実行
・ダウンロードしたzipを展開する
・「WinApp」>「test.exe」を実行する
・「接続先」に外部IPを入力する（例:104.198.168.72）
・「設定」を押す
・「クライアント」を押す
　サーバに接続される
・もう一つ「test.exe」を実行し、「クライアント」を押す
・片方は「募集」、もう一つは「参加」で対戦する

#プロセスの停止
・「putty」上で「ps x」と入力
　実行されているプロセス一覧が表示される
・「Kill XXX」と入力
　XXXはプロセスID

#プロセスを監視して再実行
サーバプログラムが落ちてしまった場合に、自動で再実行します

execServer.sh
・「nohup ./execServer.sh &」と入力

~~~sh
#!/bin/bash
while true
do
isAlive=`ps -ef | grep "server.x86_64" | grep -v grep | wc -l`
if [ $isAlive = 0 ]; then
echo "serverを実行します"
nohup ./server.x86_64 -server -logFile server.log &
fi
sleep 10
done
~~~
find で検索結果を検索対象パスからの相対パスで取得する

したいこと:

```shell-session
$ find hoge/fuga -name '*.txt'
hoge/fuga/000.txt
hoge/fuga/001.txt
hoge/fuga/subdir0/000.txt
hoge/fuga/subdir0/001.txt
hoge/fuga/subdir1/000.txt
hoge/fuga/subdir1/001.txt
```

なときに

```shell-session
000.txt
001.txt
subdir0/000.txt
subdir0/001.txt
subdir1/000.txt
subdir1/001.txt
```
がほしい．

汎用的なやりかたは，sed などで不要な部分を消す．末尾のバックスラッシュの有無に注意．

```shell-session
$ find hoge/fuga -name '*.txt' | sed 's|^hoge/fuga/||'
```

GNU 版 find の場合，`-printf` オプションを用いて，ヒットしたファイルパスから検索対象パスを除いた部分 (`%P`) を出力すればよい．

```shell-session
$ find hoge/fuga -name '*.txt' -printf '%P\n'
```

`-printf` オプションの書式指定子の詳細は [Man page of FIND](https://linuxjm.osdn.jp/html/GNU_findutils/man1/find.1.html) に挙げられている．ヒットしたファイルからいろんな情報を取得でき，<del>偏執的</del>便利そう．
【メモ】Laravelのbladeテンプレート内でリレーション先のレコード情報を取得出来ることに気づいたのでメモ

ModelなどからViewへモデルインスタンスを渡した後、そのモデルとリレーションしている別のモデルに紐づくレコード情報を取得出来ることに気づいたのでメモします。

usersテーブルと関連するordersテーブルがあるとする。

```php
$user= User::where('id',1)->first();

return view('prfile')->with('user',$user);
```

このように、ModelなどからviewにUserモデルのインスタンスを渡した場合、

```html
@foreach($user->orders as $order)
<span>{{ $order->product }}</span>
@endforeach
```

のようにbladeテンプレート上でリレーション先のordersテーブルのレコード情報を取得出来た。

以上。
putsメソッド、printメソッド、pメソッドの振る舞い

#はじめに
Ruby初学者です。putsメソッド、printメソッド、pメソッドの振る舞いが混乱したので、備忘録に書きました。

##それぞれのメソッドの大まかな違い
**printメソッド**
文字列を表示。
**putsメソッド**
文字列を表示。文字列の最後は必ず改行される。
**pメソッド**
オブジェクトの内容を表示。数値はそのまま表示され、文字列は""で囲んで表示される。文字列の最後は必ず改行される。

##変数

```ruby:ruby
x = 10
y = 20
z = 30
area = (x*y + y*z + z*x) * 2
```
こちらの変数を各メソッドで書き出します。

**printメソッド**

```ruby:ruby
print "表面積=", area, "\n"
```
```text:結果
表面積=2200
```

**putsメソッド**

```ruby:ruby
puts "表面積=#{area}"
```
```text:結果
表面積=2200
```
**pメソッド**

```ruby:ruby
p "表面積=", area
```
```text:結果
"表面積="
2200
```

##配列

```ruby:ruby
breakfast = ["米", "パン", "シリアル"]
```
こちらの配列を各メソッドで書き出します。

**printメソッド**

```ruby:ruby
print breakfast, "\n", breakfast[0], "\n", breakfast[1], "\n", breakfast[2]
```
```text:結果
["米", "パン", "シリアル"]
米
パン
シリアル
```

**putsメソッド**

```ruby:ruby
puts breakfast, breakfast[0], breakfast[1], breakfast[2]
```
```text:結果
米
パン
シリアル
米
パン
シリアル
```

**pメソッド**

```ruby:ruby
p breakfast, breakfast[0], breakfast[1], breakfast[2]
```
```text:結果
["米", "パン", "シリアル"]
"米"
"パン"
"シリアル"
```
観測値の誤差が既知な場合の密度推定したい……

#普通にヒストグラム&カーネル密度推定

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149890/f4db335c-3a9e-52f2-07e2-89d8cbbcb188.png)

#実際には各観測値はそれぞれに誤差を持つ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149890/44eea894-9221-aa6e-f84c-aa3a9c84ed67.png)

#誤差を考慮した密度推定はできないか？

##とりあえず，混合分布にしてみる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149890/0effe004-3a52-8a66-b489-feb40029ad3f.png)

中心極限定理めえ!!

##誤差がある程度小さいときはうまくいく

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149890/4b1d6a75-3f6e-bec0-8281-a5434a6e2519.png)

とはいえ，フツーに密度推定した方が分かりよい．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149890/1a10b0cb-539c-ee0b-3395-1a7c167433a8.png)

これは， ヒストグラムやカーネル密度が，各観測値の誤差が同程度で十分小さい場合の混合分布に近似されるためと考えられる．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149890/1e05e659-c742-7b3a-6db1-def88ca9254c.png)

そういう意味では， ヒストグラムやカーネル密度では過剰に分離して見えてしまっているわけか……．
どっち使うのがいいのだろう？

#今回使ったRコード

```r

require(ggplot2)

#misture normal distributions
dmnorm <- function(means, sigmas, groups = NA, x = NULL) {
  
  #set x
  if(is.null(x)) {
    x_min <- min(means - 3 * sigmas)
    x_max <- max(means + 3 * sigmas)
    x_by <- 10 ^ (round(log(x_max - x_min, 10)) - 4)
    x <- seq(x_min, x_max, x_by)
    rm(x_min, x_max, x_by)
  }
  
  #set groups  
  if(is.na(groups)) {
    groups <- as.character(means)
  } else if(length(groups) != length(means)) {
    stop('groups should be NA or a vector wit length equal to means')
  }
  
  groups <- unlist(lapply(c(groups, NA), rep, length(x)))
  
  #estimate each distributions
  each <- Map(function(means, sigmas, .x = x) dnorm(.x, means, sigmas), means, sigmas)
  
  #estimate mixture distributions
  mix <- rowSums(as.data.frame(each))
  
  #output data.frame
  data.frame(
    x = x,
    probability = c(unlist(each), mix) / sum(mix),
    group = groups
  )
  
}

#random number based on mixture normal distributions
rmnorm <- function(n, means, sigmas, prob = NULL, groups = NA) {
  n <- table(sample(x = length(means), size = n, replace = TRUE, prob = prob))
  unlist(Map(rnorm, n, means, sigmas))
}

#test
set.seed(123)
n <- 20
means <- rmnorm(n, c(100, 120), runif(n, 1, 5))
sigmas <- runif(n, 1, 15)
age <- dmnorm(means, sigmas) %>% mutate(facet = ifelse(is.na(group), 'mix', 'each'))

#each and mixture distributions
ggplot(age, aes(x = x, y = probability, color = group)) +
  geom_line() +
  theme(legend.position = 'none') +
  facet_grid(facet ~ ., scale = 'free')

#histograms and kernel densities
ggplot(as.data.frame(means), aes(x = means, y = ..density..)) +
  geom_histogram() +
  geom_density(color = 'blue')


```
Microsoft Azureでファイル管理をしたい(App Service Editor)

HoloLens開発に向けて、いろんな技術に触れています。全てが表面的な理解なまま進んでしまわないか怖いですが、とりあえず進まないわけにはいかないのでメモ。

#App Service Editor

確実にApp Serviceのポテンシャルを発揮させる使い方はしていないです。
##ねらい
App Service内に画像ファイル等を置いて、HoloLensからオンラインでデータ回収

##行き方
`ResourceGroups->アプリ名(App Service)->開発ツール->App Service Editor`

#ファイルを公開(public)にする

##置き場所
![Capture.png](https://qiita-image-store.s3.amazonaws.com/0/186209/e6d992ad-3ece-ea3a-8d26-98cb66118e6a.png)

エディターを開くと`WWWROOT`フォルダと`WORKING FILES`フォルダの2つがある。
`WWWROOT`フォルダにフォルダ名`public`で新規フォルダ作成。
publicフォルダ内に自分の扱いたいファイルを入れる。


##公開先
`http://アプリ名.azurewebsites.net/ファイル名`
(App Serviceが存在していればアプリ名は勝手に埋まります。)
Playボタンを押せば`http://アプリ名.azurewebsites.net`までは書いてくれるのであとは作ったファイル名を指定するだけ。

#結果
いろんなところからアクセス可能

#次
Unityを使ってこのデータを回収。
（2017年7月6日更新：[UnityでWWWを使って画像・テキスト(・動画)ファイルを読み込む](http://qiita.com/gshirato/items/8fb10f768d0ba2c2e365)）


#HoloLens開発記事一覧
[こちら](http://qiita.com/gshirato/items/6c026f2c67dc332f829b)から
音声合成APIをPHPで叩いてみたいでござるよ

# **Requestの中身について**

前回の記事「[音声合成を使ってみる](http://qiita.com/skanehira/items/e8418471a2c80212c3ac)」で紹介した

>AITalk® 声の職人®
>http://www.ai-j.jp/cloud/voice/

のリクエストは以下の様になっていた。

~~~html
callback=callback&speaker_id=1&text=%E4%BB%8A%E6%97%A5%E3%81%AE%E6%99%A9%E5%BE%A1%E9%A3%AF%E3%81%AF%E3%80%8C%E3%82%AB%E3%83%AC%E3%83%BC%E3%83%A9%E3%82%A4%E3%82%B9%E3%80%8D%E3%81%A7%E3%81%99%E3%80%82&ext=ogg&volume=1.0&speed=1&pitch=1&range=1&anger=0&sadness=0&joy=0&_=1498824369076
~~~

まとめると

|**パラメータ**|**意味**|
|:--|:--|
|callback|コールバック関数指定|
|speaker_id|使用したいキャラ|
|text|喋らせたい内容|
|ext|音声ファイルフォーマット(ogg,mp3,wav)|
|volume|音量？効かないからなくてもいい|
|speed|話しのスピード、1でOK|
|pitch|声の高さ、1でOK|
|range|強弱、1でOK|
|anger|怒り？効かないからなくてもいい|
|sadness|悲しさ?効かないからなくてもいい|
|joy|嬉しさ？聞かないからなくてもいい|

というわけで、効かないパラメータを除くとこんな感じになるかな。(見やすい様に改行しているが、実際は改行しない）

~~~html
allback=callback&
speaker_id=1&
text=%E4%BB%8A%E6%97%A5%E3%81%AE%E6%99%A9%E5%BE%A1%E9%A3%AF%E3%81%AF%E3%80%8C%E3%82%AB%E3%83%AC%E3%83%BC%E3%83%A9%E3%82%A4%E3%82%B9%E3%80%8D%E3%81%A7%E3%81%99%E3%80%82&
ext=ogg&
speed=1
~~~

そそ、念のためパラメータ同士は「&」でくっつけるよってのを伝えておく。

# **PHPでAPIを呼んでみる**
PHPはWEBアプリに特化した言語なので、WEBに関する便利な関数が多いのだ。
今回使う関数は「file_get_contents」と「http_build_query」と「stream_context_create」の3つ。

実際使ってみよ。

## sample.php
~~~php
// 喋らせたい文
$text = "今日の晩御飯はカレーです。";

// API
$api = 'http://cloud.ai-j.jp/demo/aitalk2webapi_nop.php';

// Requestのパラメータ生成
// 連想配列を渡せば、綺麗にパラメータを作ってくれる
// callback=callback&speaker_id=1&text=%E4%BB%8A%E6%97%A5%E3%81%AE%E6%99%A9%E5%BE%A1%E9%A3%AF%E3%81%AF%E3%82%AB%E3%83%AC%E3%83%BC%E3%81%A7%E3%81%99%E3%80%82&ext=ogg&speed=1
$content = http_build_query(array(
    'callback'=>'callback',
    'speaker_id'=>1,
    'text'=>$text,
    'ext'=>'ogg',
    'speed'=>1,
  )
);

// パラメータ等を指定
$option = array(
    'http'=>array(
        'method'=>'post',
        'header'=> "Content-type: application/x-www-form-urlencoded\r\n",
        'content'=> $content
    )
);

// APIの呼び出し
$response = file_get_contents($api,false,stream_context_create($option));


echo $response;
echo PHP_EOL;
~~~

## 実行結果
~~~shell-session
MacBookPro:Desktop skanehira$ php sample.php
callback({"url":"http:\/\/cloud.ai-j.jp\/demo\/tmp\/1_201707041002172097854661.ogg"})
MacBookPro:Desktop skanehira$
~~~

# **まとめ**
こんな感じでやればAPIの呼び出しできるよーっと。
本当は音声ファイルを再生したいけどPHPはそのような関数はないっぽいので諦めた（笑）

jsを使えば出来るみたいだけど、勉強も兼ねてそれはまたいつか違う記事で書くと思う。

次回はcurlを使用してGoogleカレンダーの情報を取得する記事を書くよ予定.
やったことがないので、勉強しながらの記事になると思うのでご容赦をm(_ _)m
Gogland で type が実装している interface をみる

## TL;DR
- type 名のところで `Command ＋ U` で実装インターフェース参照
- type 名のところで `Command ＋ I` でインターフェース実装

## Goal
あたりまえっちゃあたりまえなんだろうけどちゃんと使いこなしていなかったのでメモ。
Gogland で人のコードをみるときに、ある type が実装している interface をみたいなって思ったときに次のようにしたら快適だった。（もっといいやり方あるかな？）

## Usage
↓ type 名にカーソルあてて、 `Alt ＋ Enter` （Quick Fix 的なやつ）。
候補に `Go to interface` ってのがあるのでそれを選択。
ショートカットキー `Command ＋ U` （Mac）がアクション少なくて良いです。
※キー標準とはいじってるのでそれぞれのやつで。
さらにインターフェース名を選択すると、
インターフェース定義へジャンプできます。

![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/34022/7298b315-9b59-37bf-5d65-605a833441c5.gif)

## おまけ
たとえば net/http/server.go の Handler を実装する際は、
`Implement interface...` でインターフェース名を指定すると必要なメソッドが定義されます。
ショートカットキー `Command ＋ I` （Mac）です。

![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/34022/856fa59e-2cfd-b949-ee58-e04becd67b84.gif)

おわり。
【SalesForce】標準項目の横のドロップダウンを消す

こんにちは。
わたちゃんと申します。

今回はSalesForceのVisualForceによるカスタム画面作成についての小メモとなります。

カスタム画面を作成している時、ユーザの標準項目の横にドロップダウンが出ることがあります。
これを消すための記述として、以下の書き方で項目の間に書いてしまえば見えなくなります。

```html
<apex:inputField id="testValues" value="{!Columns.test1__c}" >
  <script type="text/javascript" language="javascript">
    document.getElementById('testPage:testForm:testPageBlock:testValues_mlktp').style.display = "none";
  </script>
</apex:inputField>
```

手順としましては

1.Chrome、FireFoxの開発者モード等で対象の項目のIDを探索・取得します。

2.document.getElementById()に取得したIDをセットします(mlktpとは非表示の対象となる項目IDです)。

3.非表示を行う要素として、style.displayにnoneを設定します。

4.対象項目の中にjavaScriptを埋め込む。

上や下に対象の記述をすると、ページ読み込み時に要素がない、と怒られるので、項目の要素を定義したあと、つまり項目の中側に書いたほうがいいのです。
Microsoft Office 2016 はプロダクトキーがわからなくても2台目にインストールできる

Microsoft [Office 2016](http://www.e-soft.net/products/detail/20)は2台までインストールできます。もちろん、インストールにはマイクロソフトアカウントとプロダクトキーが必要ですが、二台目のインストールはプロダクトキーがわからなくてもインストールができます。

##インストールする方法
今回はプロダクトキー無しでマイクロソフトアカウントだけでインストールする方法を説明します。
最初の1台にオフィスをインストール際、すでにオフィスソフトのプロダクトキーがマイクロソフトアカウントに紐付けられたから、二台目はプロダクトキーなしです。

1. マイクロソフトアカウントにアクセスします。

アドレスバーにoffice.comと入力して、オフィスのトップページから「マイアカウント」をクリックします。
![QQ截图20170704172106.png](https://qiita-image-store.s3.amazonaws.com/0/190450/8fc1f9a8-675a-ff20-0998-2fc11807cf09.png)

2.「インストール」ボタンをクリックします。
![QQ截图20170704172629.png](https://qiita-image-store.s3.amazonaws.com/0/190450/d40da0e8-8f78-2fb3-c18d-045f33c193bc.png)

3.「実行」を押します。
![office premium 6.png](https://qiita-image-store.s3.amazonaws.com/0/190450/8dfc6f9b-7318-11fc-fd99-afcfcf05e39a.png)

4.インストールが開始されます。
![office premium 7.png](https://qiita-image-store.s3.amazonaws.com/0/190450/7b85d6fb-1e69-60c6-29c9-88c38f2b881f.png)

5.インストールは20〜30分程度と思いますが、回線速度に依存しますので、時間は確定できません。
![05.png](https://qiita-image-store.s3.amazonaws.com/0/190450/8e5cce91-a5e5-81be-07c8-862269545e98.png)

6.完了したら、「すべてのプログラム」からExcelを選択します。ライセンス認証もされていますので、インストール完了です。
![QQ截图20170411105807.png](https://qiita-image-store.s3.amazonaws.com/0/190450/5c88c6c7-75a1-a903-7527-682907101131.png)
ノンパラメトリックベイズの実験

最近、Qiitaに登録させてもらった者です。
Qiitaを参考に現在、ノンパラメトリックベイズを勉強中なのですが、その一環として書籍、「続・わかりやすいパターン認識」の第12章のp266~270にあるノンパラメトリックベイズモデルの実験のクラスタリング法1の実験をp260~261にある「クラスタリング法1のアルゴリズム」に従って、実際にpythonで実装して確かめているのですが、p270の図12.1のlogvのグラフの繰り返し回数が1~10回あたりでlogvが急激に上昇している所が現在再現できなくて悩んでいます。この辺り、既にご経験されている方で、何かアドバイスいただけたらと思って投稿しました。
p261の式（12.16）で対数を取って、
logv = logP(s) + Σ(i=1~c){logG0(θi) + Σ(xk∈ωi)logp(xk|θi)}
となりますが、私の計算してみたものでは、
（１）logP(s)　減少傾向
（２）Σ(i=1~c)logG0(θi)　減少傾向
（３）Σ(i=1~c)Σ(xk∈ωi)logp(xk|θi)　-2400あたりでほぼ一定
となり急激に増加する箇所がほとんどありません。
logvの式ですが、最初は（２）のθiは各クラスタ毎の値なので、s= {s1,...,sn}でクラスタ分けされた座標の情報からθ=（μi, Λi）を計算していたのですが、ni=1個の場合、Σi=0で無限大になって計算できなかったり、ni=2個の場合もΛiの値が大きくなりすぎて計算できなくなってしまうので、現在は、（３）式のp(xk|θi)はp269の式（12.37）からサンプリングしたθiを使うようにしています。（２）の基底分布G0(θi)はサンプリングしたθiごとのG0(θi)を計算してそれを平均化した値を各クラスタ毎のG0(θi)として使っています。そうすると上に書いた（１）〜（３）のような状態になってしまいます。このあたりの計算方法がおそらくまずいと思うのですが、これらについて何かコメントいただければと思います。
現在、p261のStep4での(1)と(2)の条件下ではlogvは-2400あたりに張り付いてしまいます。逆にこの条件を無くすと、logvの値は減少していってしまいます。
RemoteWebDriverでステップ実行やタブオープンや便利機能を提供するChromeDriverTrait

# ChromeDriverTrait

https://github.com/prex-inc/ChromeDriverTrait

Facebook\WebDriver\Remote\RemoteWebDriver
によるブラウザテストをより便利にするクラスです。
RemoteWebDriverの基本的な使い方は、下記を参照ください。
http://qiita.com/zaburo/items/f11357170953a3c34b8f
https://facebook.github.io/php-webdriver/1.2.0/Facebook/WebDriver.html

# 主な機能

- 各テストをChromeのタブとして実行します
- 各テストの結果レポートをhtmlで書き出します
- 各テストのスクリーンショットをとります。縦に長いページも簡易的にスクロールして全画面取得します
- テストをステップ実行する機能があります
- テストを◯マイクロ秒止める機能があります


# 実行サンプル

サンプルを実行してみてください。

```
phpunit --colors path/to/tests/SampleTest.php
```

この結果、３つのブラウザテストが３つのChromeタブで実行され、その結果が4番目のタブにHTMLの形で出力されます。

![](https://i.gyazo.com/6ab1aaa33091ed54ddde8fe58ee35a96.png)


# ディレクトリ構成

```
etc/  
    debug.log   ...    
    debug.php   ...このファイルを編集することで、ブラウザテストをステップ実行できます。
    debug.sample.php  ...上記ファイルのサンプルです。
templates/  
    template.php  ...レポートはこの形式で生成されます。
temporary/  ...ファイルが書き出されます。定期的に削除してください。
tests/  
    SampleTest.php  ...テストのサンプルです
traits/  
    ChromeDriverTrait.php  ...テストを便利にするトレイトです
composer.json  
README.md  
```

# 特殊機能の使い方

## ステップ実行機能

テストメソッド中に、

```
$this->debug();
```

と記述すると、その場でテストが待機状態になります。
このとき、etc/debug.php（debug.sample.phpをコピーしてください）を編集して保存すると、その中身が実行されます。
これにより、ブラウザテスト動作をステップ実行して実験することができます。

## テストの時間待機機能

時間指定の待機は推奨されませんが、やはり便利です。このように記述できます。

```
//1.5秒待機
$this->driver->wait(100, 100)->until(self::sleep(1500));
```