OmniAICreator/Qiita-1.07M huggingface dataset:
シュッと実行する

　Rust のコードをシュッと実行したいときがあります。この「シュッと」には、一つのファイルで完結したい、Shebang とか書きたい、ライブラリも利用したい、などの気持ちが込められていて、cargo-script というプラグインがそれらを解決します。

- [DanielKeep/cargo-script: Cargo script subcommand - GitHub](https://github.com/DanielKeep/cargo-script)

## インストールする

　しました。

```shell-session
$ cargo install cargo-script
```
```shell-session
$ cargo script --version
cargo-script 0.1.5
```

```shell-session
$ run-cargo-script --version
cargo-script 0.1.5
```

## 実行する

　いくつかの方法があります。

式を評価する。

```shell-session
$ cargo script -e 'println!("sugoi!")'
   Compiling expr v0.1.0 (file:///Users/woxtu/.cargo/.cargo/script-cache/expr-cecc8cdbd4a5813e)
    Finished release [optimized] target(s) in 1.0 secs
sugoi!
()
```

ファイルを渡して実行する。

```rust:sugoi.rs
fn main() {
  println!("sugoi!")
}
```
```shell-session
$ cargo script sugoi
   Compiling sugoi v0.1.0 (file:///Users/woxtu/.cargo/.cargo/script-cache/file-sugoi-63e1f1239355abaa)
    Finished release [optimized] target(s) in 2.66 secs
sugoi!
...
```

ファイルに権限を付与して実行する。

```rust:sugoi.rs
#!/usr/bin/env run-cargo-script

fn main() {
  println!("sugoi!")
}
```
```shell-session
$ chmod +x sugoi.rs
$ ./sugoi.rs
   Compiling sugoi v0.1.0 (file:///Users/woxtu/.cargo/.cargo/script-cache/file-sugoi-63e1f1239355abaa)
    Finished release [optimized] target(s) in 0.17 secs
sugoi!
```

出力を見ると、裏で人間の代わりにプロジェクトをつくるなどしている様子がわかります。

## 依存する

　ファイルを "Cargoified" して利用したいライブラリを指定します。

```rust:sugoi.crs
//! ```cargo
//! [dependencies]
//! rand = "0.3"
//! ```

extern crate rand;

use rand::distributions::{IndependentSample, Range};

fn main() {
  let range = Range::new(1, 10);
  let mut rng = rand::thread_rng();
  let count = range.ind_sample(&mut rng);

  println!("sugoi{}", vec!("!"; count).concat())
}
```
```shell-session
$ cargo script sugoi
   Compiling libc v0.2.17
   Compiling rand v0.3.14
   Compiling sugoi v0.1.0 (file:///Users/woxtu/.cargo/.cargo/script-cache/file-sugoi-c415f45777c10429)
    Finished release [optimized] target(s) in 5.99 secs
sugoi!!!!!!!
```

もっと雑に書きたいんだ私はという人のための書式もあります。

```rust:sugoi.crs
// cargo-deps: rand="0.3"

extern crate rand;

use rand::distributions::{IndependentSample, Range};

fn main() {
  let range = Range::new(1, 10);
  let mut rng = rand::thread_rng();
  let count = range.ind_sample(&mut rng);

  println!("sugoi{}", vec!("!"; count).concat())
}
```

バージョンを指定しない。

```rust
// cargo-deps: rand
```

複数のライブラリを使いたい。

```rust
// cargo-deps: rand, regex
```

元々のモチベーションを考えると、これくらいが良さそう。

## やっていく

　シュッとやっていきましょう。
プロパティファイルからプレースホルダを用いてインジェクションするのに詰まった

プロパティファイルから値を読み込んで、それを使うことって往々にしてあると思います。
自分もやってみるかって思って実装してみたんですけど、プレースホルダがうまく機能しなくて泣いてました。

# プレースホルダ
xmlでconfig書いてると自動で有効化されるらしいですが、
Javaでconfig書いてると明示的に書いてあげないとだめらしいですね。

```java:AppConfig
package jp.co.~~.~~.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;

@Configuration
@EnableAspectJAutoProxy
@PropertySource("classpath:application.properties")
// コントローラ配下以外をスキャン
@ComponentScan(basePackages = "jp.co.~~.~~", excludeFilters = @Filter(type = FilterType.REGEX, pattern = "^jp\\.co\\.~~\\.~~\\.web\\.controller.*$"))
public class AppConfig {

    /**
     * 
     * プレースホルダーの登録
     * これを明示的に書かないとプロパティのプレースホルダーが使えない
     * 
     * @return
     */
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

}
```

これをbean定義しないと

```java:こうなる
    @Value("${database.password}")
    String password;

    System.out.println(password); // ${database.password}って出力される
```
MacOSX(10.11.xx)にPythonライブラリTRML2PDFを導入する

PythonでPDF生成をするライブラリであるTRML2PDFの導入で少しつまずいたのでメモ。

環境：
MacOSX(10.11.6 El Capitane)
Python2.7.x（都合によりpyenv環境）

pip及びhomebrew導入済み

## 最終的にやったこと
```
# jpegを扱うライブラリ
brew install jpeg

# Pythonの画像処理ライブラリ
pip install pillow

# PythonのPDF生成ライブラリ
pip install trml2pdf
```
でOKです。
## TRML2PDFのインストール
以下を参照。
TRML2PDF
https://github.com/romanlv/trml2pdf/

READMEに書いてある通り、
```
pip install trml2pdf
```
としたら、
```
ValueError: jpeg is required unless explicitly disabled using --disable-jpeg, aborting
```
となってしまった。明示的にjpegをdisableなオプションを付けろとのこと。
もう少し読むと、TRML2PDFを使うには、Pillowというライブラリが必要なのでそれをインストールしている最中にエラーが起きている。

## Pillowのインストール

```
pip install pillow
...
ValueError: jpeg is required unless explicitly disabled using --disable-jpeg, aborting
```
Pillowのインストール中にエラー起きてるのだから、当たり前のように同じエラーが出る。ともあれやはりPillowのインストールが失敗していることが原因であることはわかりました。

調べるとPillowでjpegを扱おうとする時はlibjpegというjpegのエンコード・デコードを行うライブラリが必要とのこと。ほう。
https://ja.wikipedia.org/wiki/Libjpeg


homebrewでlibjepgをインストール
```
brew install jpeg
```
再度pipでPillowをインストール
```
pip install pillow
```
再度pipでTRML2PDFをインストール
```
pip install trml2pdf
```

インタープリタからでよいのでインポートしてみましょう。

```
python

Python 2.7.2 (default, Nov 25 2016, 09:30:37) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

>>> import trml2pdf
>>>
```

よさそうですね！
Rspecの勉強02

##前回
[Rspecの勉強0１](http://qiita.com/ko8@github/items/5b598744ea1d32a3545b)

##参考サイト
[はじめてのRSpec - まずテスト書いてからコード書くシンプルなチュートリアル](http://qiita.com/luckypool/items/e3662170033347510c3c)

##Rspecを身に付けるまでにすること
1、Rspec、TDDって何？
2、sampleコードを真似て書いてみる。コードの理解と雰囲気を掴む(参考サイトを参照)
3、自分で考えてRspecを書いてみる

##OUT PUT（１〜２が目的）
[はじめてのRSpec - まずテスト書いてからコード書くシンプルなチュートリアル](http://qiita.com/luckypool/items/e3662170033347510c3c)


```ruby:dog_spec.rb
equire "spec_helper"
require "dog"

describe Dog do
  it "is named 'Pochi'" do
    dog = Dog.new
    expect(dog.name).to eq 'Pochi'
  end

  it "has fangs" do
    dog = Dog.new
    expect(dog.fangs).to eq 2
  end

  it "is alived" do
    dog = Dog.new
    expect(dog).to be_alived
  end
end
```

```ruby:dog.rb
class Dog
  attr_accessor :name, :fangs

  def initialize(name="Pochi")
    @name = name
    @fangs = 2
  end

  def alived?
    true
  end
end
```

##次回
3を実施していく。
cakephpで開発する際に配列を組み替える便利なクラスHash

WithOne AdventCalendar 2日目の記事です。

ここ最近cakephpで実装することが多くなりその中で配列を組み替えることが増えたのでその時に便利なHashクラスについて簡単に説明しようと思います。
間違っている部分がありましたら指摘していただけると助かります。

## Hashクラスとは
配列を組み替える上で非常に便利なクラスです。
多次元配列など複雑な配列を条件付きで組み換えや値取得を行うことができます。
使用マニュアルは下記を参照
http://book.cakephp.org/2.0/ja/core-utility-libraries/hash.html

## 例として使用する配列
下記のような配列を使って使用例を説明します。

```
$user_list = array(
	'User' => array(
		array(
			'id' => '1',
			'name' => '田中',
			'age' => '15',
			'group' => array(
				'group_id' => '1',
				'group_name' => '田中グループ'
			)
		),
		array(
			'id' => '2',
			'name' => '山田',
			'age' => '17',
			'group' => array(
				'group_id' => '2',
				'group_name' => '山田グループ'
			)
		),
		array(
			'id' => '3',
			'name' => '佐藤',
			'age' => '15',
			'group' => array(
				'group_id' => '3',
				'group_name' => '佐藤グループ'
			)
		),
		array(
			'id' => '4',
			'name' => '田中',
			'age' => '16',
			'group' => array(
				'group_id' => '1',
				'group_name' => '田中グループ'
			)
		)
	)
);
```

## 基本的な使用例
例えばユーザーデータが配列として複数格納されている$user_listという配列から格納されているユーザー名のみを取得したい場合は下記の通り

```
$result = Hash::extract($user_list, 'User.{n}.name');
```

Userやnameは配列のkeyを指します。{n}は数値keyを意味します。それぞれ「.」でつないで書きます。


$resultの出力結果は下記の通りになります。

```
Array
(
    [0] => 田中
    [1] => 山田
    [2] => 佐藤
    [3] => 田中
)
```

## 配列の並べ替え
グループ名でグルーピングして配列のkeyをidとしてユーザー名をまとめたい場合は下記の通り

```
$result = Hash::combine($user_list, 'User.{n}.id', 'User.{n}.name', 'User.{n}.group.group_name');
```

$resultの出力結果は下記の通りになります。

```
Array
(
    [田中グループ] => Array
        (
            [1] => 田中
            [4] => 田中
        )

    [山田グループ] => Array
        (
            [2] => 山田
        )

    [佐藤グループ] => Array
        (
            [3] => 佐藤
        )

)
```

## 条件付き取得を行う
年齢が15歳のユーザー情報のみ取得したい場合は下記の通り

```
$result = Hash::extract($user_list, 'User.{n}[age=15]');
```
条件を指定する場合[条件をつける対象key名=条件]の形で書きます。

$resultの出力結果は下記の通りになります。

```
Array
(
    [0] => Array
        (
            [id] => 1
            [name] => 田中
            [age] => 15
            [group] => Array
                (
                    [group_id] => 1
                    [group_name] => 田中グループ
                )

        )

    [1] => Array
        (
            [id] => 3
            [name] => 佐藤
            [age] => 15
            [group] => Array
                (
                    [group_id] => 3
                    [group_name] => 佐藤グループ
                )

        )

)
```

使用できる条件式は=、!=、>、<、>=、<=の6種です。

##最後に
今回紹介したメソッドはextractとcombineだけでしたがほかにも値の追加のみを行うものや条件に合致したものだけ削除するものなどまだまだ便利な機能がたくさんあります。
今後cakephpを使用する機会がありましたら是非活用してみてください。
Arch Linuxで固定IPを簡単に設定する

あまり情報がなかったので、メモしておく。

# 想定している環境

- 有線LAN。ただし無線でもあまり変わらないはず。
- `Netctl`を使う。これが一番簡単。
- DHCPで既にネットにはつなげている。

# 手順

## Netctlの設定ファイルを作成

Interface名は`ip a`コマンドの出力を見て確認する。
自分の場合は`enp2s0`だった。

`sudo vim /etc/netctl/enp2s0`

```bash:/etc/netctl/enp2s0
Description='A basic static ethernet connection'
Interface=enp2s0
Connection=ethernet
IP=static
Address=('192.168.25.219')
Gateway='192.168.24.254'
DNS=('192.168.4.10', '192.168.4.12')
```

## DHCPCDの停止

```bash
sudo systemctl stop dhcpcd.service
sudo systemctl disable dhcpcd.service
```

## Netctlを自動起動

```bash
sudo systemctl start netctl.service
sudo systemctl enable netctl.service

sudo systemctl start netctl@enp2s0
sudo systemctl enable netctl@enp2s0
```

# 参考

https://wiki.archlinuxjp.org/index.php/Netctl
VR ：Amazon职位

The Role:
Be responsible for designing, implementing, and maintaining VR engine technology.
Collaborate with world class designers and artists to solve real-world problems and empower content creators.
Write a lot of performant, highly maintainable code.
Drive design and architecture decisions that result in strong balance of performance, flexibility, and maintainability.
Basic Qualifications 
Bachelor's degree in Computer Science or Computer Engineering (or equivalent) experience.
5+ years of professional software engineering experience, working on multi-discipline teams.
At least 1 released real-time 3D game or application.
Strong computer science fundamentals in design, algorithms, and data structures.
Strong 3D math skills.
Advanced software engineering skills, including the ability to write performant, maintainable, and robust code in C++.
Good communication skills and ability to work effectively on shared projects with designers, artists, testers, and other developers.
Preferred Qualifications 
Multiple shipped real-time 3D PC/Console titles.
Expertise in shader languages.
Deep experience with graphics performance profiling and optimization.
1+ year VR development experience
Lumberyard, Unity, Unreal, CryEngine or other 3D game engine development experience.
Security Release Go 1.7.4 and 1.6.4

たぶん後で[ブログ](http://text.baldanders.info/)にも上げるけど，覚書として。

----

数日前から[予告](https://groups.google.com/forum/#!topic/golang-announce/YOqTqcJtiJI)されていたが， [Go 言語]の 1.7.4 と 1.6.4 がリリースされた。

- [[security] Go 1.7.4 and Go 1.6.4 are released](https://groups.google.com/forum/#!topic/golang-announce/2lP5z9i9ySY)

セキュリティ脆弱性を含むので（特に Web 関連で [Go 言語]を使ってる方は）必ずアップデートすること。
なお，特に理由がない限り 1.7 系を使うことをお勧めする。

ひとつは [`crypto/x509`] パケージに関するもの

- [Change If681c514: crypto/x509: read Darwin trust settings for root CAs | go-review.googlesource Code Review](https://go-review.googlesource.com/#/c/33721/)
- [crypto/x509: honor OS X certificate trust settings · Issue #18141 · golang/go](https://github.com/golang/go/issues/18141)

もうひとつは [`net/http`] パッケージに関するものだ。

- [Change Ib394655b: net/http: multipart ReadForm close file after copy | go-review.googlesource Code Review](https://go-review.googlesource.com/#/c/30410/)
- [net/http: backport "multipart ReadForm close file after copy" to 1.7 · Issue #17965 · golang/go](https://github.com/golang/go/issues/17965)

CVE 番号とかはまだ付いてないのかな？

そうそう。
1.8 ベータ版も登場している。

- [Go 1.8 Beta 1 is released](https://groups.google.com/forum/#!topic/golang-announce/Wgv6NGcntlQ)
- [Go 1.8 Release Notes - The Go Programming Language](https://beta.golang.org/doc/go1.8)

`GOPATH` 環境変数にデフォルト値ができたらしい。
あと `go bug` コマンドってなんだ？

[Go 言語]: https://golang.org/ "The Go Programming Language"
[`crypto/x509`]: https://golang.org/pkg/crypto/x509/ "x509 - The Go Programming Language"
[`net/http`]: https://golang.org/pkg/net/http/ "http - The Go Programming Language"
Visual Studio for Mac Previewをアンインストールする

#事の発端
Visual Studio for Mac リリースの報を受け、テンションが上がってしまったのか寝ぼけていたのか定かではないですが、誤って持ち運び用のMacBook Air (SSD 128GB)にインストールしてしまいました。
結果、SSDが容量不足に陥ったのでアンインストールの必要に迫られました:frowning2:

手順を調べてみましたが、Xamarinのアンインストール方法はあるもののVisual Studio for Mac については見つからなかったのでまとめてみました。

#削除したもの
以下のディレクトリ、ファイルを削除しました。
くれぐれもバックアップはお忘れ無きよう:wink:

```
sudo rm -rf /Applications/Visual\ Studio.app
sudo rm -rf /Applications/Xamarin\ Profiler.app
sudo rm -rf /Applications/Xamarin\ Workbooks.app

sudo rm -rf /Developer/MonoTouch
sudo rm -rf /Developer/MonoAndroid

sudo rm -rf /Library/Frameworks/Mono.framework
sudo rm -rf /Library/Frameworks/Xamarin.Mac.framework
sudo rm -rf /Library/Frameworks/Xamarin.Interactive.framework
sudo rm -rf /Library/Frameworks/Xamarin.Android.framework
sudo rm -rf /Library/Frameworks/Xamarin.iOS.framework

sudo rm -rf ~/Library/Caches/VisualStudio
sudo rm -rf ~/Library/Caches/com.microsoft.visual-studio
sudo rm -rf ~/Library/Caches/com.xamarin.fontconfig

sudo rm -rf ~/Library/Logs/VisualStudio

sudo rm -rf ~/Library/Preferences/VisualStudio
sudo rm -rf ~/Library/Preferences/Xamarin
sudo rm -rf ~/Library/Preferences/com.microsoft.visual-studio.plist

sudo rm -rf ~/Library/VisualStudio
sudo rm -rf ~/Library/Saved\ Application\ State/com.microsoft.visual-studio.savedState
sudo rm -rf ~/Library/Application\ Support/XamarinStudio-6.0
sudo rm -rf ~/Library/Developer/Xamarin
```

#結果

空き容量がおよそ**11GB**増えました:hugging:
インストールサイズがおよそ10GBだと記憶しているのでおそらくきれいに消えたんじゃないかと考えられます。(消しすぎだったりして:fearful:)

```bash:削除前
$ df -g /
Filesystem    1G-blocks Used Available Capacity  iused   ifree %iused  Mounted on
/dev/disk0s2        112   98        13    89% 25900776 3511592   88%   /
```

```bash:削除後
$ df -g /
Filesystem   1G-blocks Used Available Capacity  iused   ifree %iused  Mounted on
/dev/disk0s2       112   87        24    79% 23008217 6404151   78%   /
```

#最後に
削除は自己責任でお願いいたします。
私が調べたもので検証などは行っていませんので、過不足あればコメントいただけるとうれしいです。
私の環境では削除しても特に問題なく動いています。

# 参考にさせていただいた記事
* [How to uninstall Visual Studio for Mac Preview version?](https://social.msdn.microsoft.com/Forums/en-US/c4e2953c-2e4e-440f-b3f8-3964eb64ae13/how-to-uninstall-visual-studio-for-mac-preview-version?forum=visualstudiogeneral)
* [Xamarin Studio をアンインストールして Visual Studio for Mac(Preview) をインストールする](http://qiita.com/amay077/items/a22c77db0d0e2c4d75b7#_reference-cb30c88bc1b56eb81ef9)
運用系の担当者が関係ありそうなQiitaのAdvent Calendarをまとめてみる

運用系のslackでまとめカレンダー欲しいと言われたので、1人の需要があれば30人の需要もあるだろうとみて記録しておきます。

※この記事はQiitaのカレンダーのみです。

# Vuls

脆弱性診断に今後食い込んでくるであろうツール。

> 脆弱性スキャナVulsに関することなら、なんでもOKです！
> ・Github https://github.com/future-architect/vuls

http://qiita.com/advent-calendar/2016/vuls

# なんでもセキュリティ

OpenSSLツライ話とか聞けるのではないかと(希望)。

http://qiita.com/advent-calendar/2016/security

# NetOpsCoding

ネットワーク運用自動化の話とのこと。

> ソフトウェアからのネットワーク機器操作によってネットワーク運用の自動化を志す人達のAdvent Calendarです

> ネットワークをソフトウェアから触ることに関する話であればどんな簡単な話題でもOKです。初心者でも気兼ねなく参加してください。

http://qiita.com/advent-calendar/2016/netopscoding

# さくらインターネット 
インターネット業界の動向が見れそう(希望)。

> 昨年に引き続き、今年もなかのひとが中心に、開発環境、フロントエンド、サーバ、インフラ、IoT などなど、さくらインターネットに関する様々な話題を投稿していきます！

http://qiita.com/advent-calendar/2016/sakura
http://qiita.com/advent-calendar/2016/sakura2

# サーバレスアーキテクチャ
おそらく今後流行るだろうアーキテクチャなので見守ろうかと。

> サーバレスはインフラに限らず、アプリ開発やオペレーションを含めたパラダイムシフトと言えます。
> 去年、一昨年はサーバレスのキーコンポーネントであるAWS Lambda縛りのAdvent Calendarをやったのですが今年はAWS Lambda以外のAWSサービスも含めて、改めて「サーバレス」というキーワードでのAdvent Calendarを実施します！
> フロントエンド開発者、サーバサイド開発者、インフラエンジニアのすべてを幸せにするサーバレスなネタをお願いします！

http://qiita.com/advent-calendar/2016/serverless
http://qiita.com/advent-calendar/2016/serverless2

# Linux
投稿予定者のコメントを拝見したところ、コアな話が多そうなので選んだ。

> Tips、Linux Kernel、ディストリビューション、デスクトップ等々、Linuxに関することを書いていきましょう。

http://qiita.com/advent-calendar/2016/linux

# Ansible
運用自動化ツールの有名どころとして。

> 今年でAnsible Adventも4回目になると思います。
> みなさんの投稿楽しみです！

http://qiita.com/advent-calendar/2016/ansible

# Zabbix
監視ツールの有名どころとして。

http://qiita.com/advent-calendar/2016/zabbix

# チャットボット
運用補助に使えそうだなと。

> チャットボット(Bot, ChatBot)、今年盛り上がりましたね〜！

> みなさん、どんなボットつくってます？
> つくるならどのフレームワークがオススメですか？

> そのほか、こんなチャットボット良いよ！
> チャットボット情報まとめてみた！
> 2016年にチャットボットでやった事のふりかえり！などなど…

> チャットボットについての話題ならどんな事でも歓迎です、ぜひぜひ語りましょう！

http://qiita.com/advent-calendar/2016/chatbot

# Tech Score Blog
ツールを含めた細かいTipsが見れそうなので。

> TECHSCORE BLOG で行う Advent Calendar です。
> テーマを絞らず複数の執筆者が各々書きたい内容を書いていきます！

http://qiita.com/advent-calendar/2016/techscore

# KUSANAGI
WordPressに苦しんでいる人も多いのではと思いチョイス。

> 超高速WordPress仮想マシン「KUSANAGI」に関することなら何でもおｋなアドベントカレンダーです。

http://qiita.com/advent-calendar/2016/kusanagi

# おうちはっく
便利にしたい！

> おうちをより便利に使うために、ガジェットやサービスを組み合わせたり、工夫や努力を注ぎ込んだおうちハックを紹介するAdvent Calendarです。自身のおうちハック事例の紹介の他、おうちハックに使えそうな技術の紹介や、どこかで見つけた良いおうちハックの紹介なども歓迎します。参加登録は誰でも歓迎です！

http://qiita.com/advent-calendar/2016/ouch-hack
Pepperとの会話：Dialogの変数による聞き取り精度について

Pepperとの会話のやり取りの中で情報を収集をするためにChoregrapheでのDialogBOXにて実装を試みました。しかしこのとき、Pepperの”一般販売モデル”と”Pepper for Biz”での挙動の違いがあることに気づき内容をまとめてみました。

#実施内容
ChoregrapheのDialogボックスで人がしゃべりかけた内容をPepperがオウム返しするアプリを作りました。

###実装したPepper
1.  Pepper for Biz（NAOqi 2.4.3.28）
2.  一般販売モデル（NAOqi 2.4.3.28）


###Choregrapheで作成した会話のやりとり
<pre>
topic: ~x_test()
language: jpj

u:(_*)%開始 繰り返します。$1 ですか？
 u1:(はい)  ありがとう、確認しました。$onStopped=1
 u1:(いいえ)^goto(開始) もう一度、お願いします。 
</pre>


#####（想定する会話）
人間：今日はいい天気ですね
Pepper：繰り返します。今日はいい天気ですねですか？
人間：いいえ
Pepper：もう一度、お願いします。
人間：隣の客はよく柿食う客だ
Pepper：繰り返します。隣の客はよく柿食う客だですか？
人間：はい
Pepper：ありがとう、確認しました。


#実施結果
###1.  Pepper for Biz
Choregrapheのダイアログウインドウより
>人間：<...> (48.06%)
人間：今日はいい天気ですね (92.625%)
ロボット：繰り返します。今日はいい天気ですねですか   ？
人間：<...> いいえ <...> (69.26%)
ロボット：もう一度、  お願いします   。
人間：<...> (47.92%)
人間：隣の客はよく柿食う客だ (95.1778%)
ロボット：繰り返します。隣の客はよく柿食う客だですか   ？
人間：<...> はい <...> (74.21%)
ロボット：ありがとう、確認しました   。


###2.  一般販売モデル
Choregrapheのダイアログウインドウより
>人間：<...> (47.97%)　　←「今日はいい天気ですね」と言う
人間：<...> (47.92%)　　←「今日はいい天気ですね」と言う
人間：<...> (48.21%)　　←「山」と言う
人間：ダイアログから入力しました (100%)　　←Choregrapheより入力
ロボット：繰り返します。ダイアログから入力しましたですか   ？
人間：はい (100%)　　←Choregrapheより入力
ロボット：ありがとう、確認しました   。


Pepper for Bizでは、想定通りの会話を行うことができました。

しかし、一般販売モデルでは、期待する結果は得られませんでした。
ここで一般販売モデルのPepperとのやりとりを解説します。
>まず、私は「今日はいい天気ですね」と話かけました。
するとPepperは、ブルーの目のままピポッ!っと音を鳴らし反応しません。
さらにもう一度、「今日はいい天気ですね」と話しかけました。
同様に反応しません。そこで私はもっと短い言葉「山」、「海」と話しかけましたが変わらず反応しませんでした。
今度は、Choregrapheのダイアログウインドウから直接「ダイアログから入力しました」と入力すると、Pepperはその言葉を受け取り反応を返してきました。再びChoregrapheから「はい」と答え会話は終了しました。


#まとめ
今回はPepperとの会話の中で名前を聞き出し、Pepperに名前を呼ばせるという単純なアプリを作ろうとしていました。一般販売モデルも発売当初に、いろいろなサンプルアプリを試していたときには、これらの会話も普通にできていたように記憶しています。
一般販売モデルでも普通に会話（言葉）を聞き取れるようにできないものでしょうか？
どなたか解決策をご存じの方、また、Pepper for　Bizは大丈夫な仕様であると言い切れるのか？何か情報をお持ちの方は教えていただけると助かります。
Rspecの勉強01

##参考サイト
[エッ、今さら！？練習問題と具体的コード例によるTDD超入門。](http://paiza.hatenablog.com/entry/2014/09/04/%E3%82%A8%E3%83%83%E3%80%81%E4%BB%8A%E3%81%95%E3%82%89%EF%BC%81%EF%BC%9F%E7%B7%B4%E7%BF%92%E5%95%8F%E9%A1%8C%E3%81%A8%E5%85%B7%E4%BD%93%E7%9A%84%E3%82%B3%E3%83%BC%E3%83%89%E4%BE%8B%E3%81%AB%E3%82%88)

##Rspecを身に付けるまでにすること
1、Rspec、TDDって何？
2、sampleコードを真似て書いてみる。コードの理解と雰囲気を掴む(参考サイトを参照)
3、自分で考えてRspecを書いてみる

##OUT PUT（１〜２が目的）
[エッ、今さら！？練習問題と具体的コード例によるTDD超入門。](http://paiza.hatenablog.com/entry/2014/09/04/%E3%82%A8%E3%83%83%E3%80%81%E4%BB%8A%E3%81%95%E3%82%89%EF%BC%81%EF%BC%9F%E7%B7%B4%E7%BF%92%E5%95%8F%E9%A1%8C%E3%81%A8%E5%85%B7%E4%BD%93%E7%9A%84%E3%82%B3%E3%83%BC%E3%83%89%E4%BE%8B%E3%81%AB%E3%82%88)


```ruby:unagi_spec.rb
require './unagi.rb'

 describe Unagi do
   describe '#initialize' do
     it '指定した座席数のゼロ配列が確保される' do
       expect(Unagi.new(3).seats).to eq [0, 0, 0]
     end
   end

   describe '#seating' do
     it '「長テーブルの座席番号」と「お客さんの人数」を指定すると「座席にお客さんが配置される」' do
       unagi = Unagi.new(5)
       unagi.seating(1, 3)
       expect(unagi.seats).to eq [1, 1, 1, 0, 0]
     end

     it '長テーブルの最初と最後の席をまたぐ場合、最初の席から配置される' do
       unagi = Unagi.new(5)
       # 5番目の席から3人座る
       unagi.seating(5, 3)
       expect(unagi.seats).to eq [1, 1, 0, 0, 1]
     end

     it '座席に他のお客さんが配置されている場合、座席の状態は変化しない' do
       unagi = Unagi.new(5)
       unagi.seating(2, 3)
       expect(unagi.seats).to eq [0, 1, 1, 1, 0]
       unagi.seating(4, 2)
       expect(unagi.seats).to eq [0, 1, 1, 1, 0]
     end
   end

  describe '#count' do
    it '座席に着席しているお客さんの人数を返却する' do
      unagi = Unagi.new(5)
      unagi.seating(1, 1)
      expect(unagi.count).to eq 1
      unagi.seating(2, 1)
      expect(unagi.count).to eq 2
      unagi.seating(3, 1)
      expect(unagi.count).to eq 3
      unagi.seating(3, 1)
      expect(unagi.count).to eq 3
      unagi.seating(4, 1)
      expect(unagi.count).to eq 4
      unagi.seating(5, 1)
      expect(unagi.count).to eq 5
    end
  end
end
```

```ruby:unagi.rb
class Unagi
   attr_reader :seats

   def initialize(seat_count)
     @seats = Array.new(seat_count, 0)
   end

   def seating(seat_number, people_count)
     s = seat_number - 1
     people_count.times do
       return if @seats[s] == 1
       s += 1
       s = 0 if @seats.size <= s
     end

     s = seat_number - 1
     people_count.times do
       @seats[s] = 1
       s += 1
       # インデックスが配列の最後を超えると最初に戻る
       s = 0 if @seats.size <= s
     end
   end

  def count
    @seats.select{ |s| s == 1 }.count
  end
end
```

##次回
もうすこし１〜２を理解したいので、sample codeを模写しながら書く
マークダウン実験


##ヘッダ
# ＃
## ＃＃
### ＃＃＃

## コード
\`\`\`:php:hogehoge.php
protected function hogehgoe() {
    echo("hogehoge");
}
\`\`\`

```php:hogehoge.php
protected function hogehoge() {
    echo("hogehoge");
}
```
\`a=b\`
`a=b`

## 列挙と番号付き列挙
列挙(直前に一行空白が必要）

\* アスタリスク
\+ プラス記号
\- マイナス記号

* アスタリスク
  * 空白を２つ付けたアスタリスク
  + プラス
      +  空白を４つ付けたプラス
+ プラス記号
- マイナス記号

番号付き

1. "1."
  1.  空白を２つつけた数字
  2.  
2. "2."
3. "3."

(途中に文字が入ると連番がリセットされるので連番にしたい場合前の番号の次の番号を振る）
4. テスト
5. ｔｅｓｔ

## 文字修飾
\*斜め\* : *斜め*
\_斜めその2\_：_斜め_
\*\*太字\*\*：**太字**
\_\_太字その２\_\_：__太字__
\~\~打ち消し線\~\~：~~打ち消し線~~
>  \> 引用
>> \>\> 二重引用

- [ ] ： ー [ ] チェックボックス(前後に空白行が必要)
- [x] ： － [x] チェックされたチェックボックス

## 水平線
\_\_\_
___
\-\-\-
---
\*\*\*
***

## よくわからないが\<p\>で囲ってみた
\<p\>ほげほげ\</p\> ：<p>ほげほげ</p>

##  リンク
URL直書き：http://www.google.com
\<http://www.google.com\>： <http://www.google.com>
\[グーグル\]\(http://www.google.com\)： [グーグル](http://www.google.com)
\[グーグル\]\(http://www.google.com "グーグルへのリンク"\)： [グーグル](http://www.google.com "グーグルへのリンク")

##  画像
\!\[cat\]\(http://icon.nimg.jp/channel/ch2585253.jpg?1480460782\)： ![cat](http://icon.nimg.jp/channel/ch2585253.jpg?1480460782)
\!\[cat\]\(http://icon.nimg.jp/channel/ch2585253.jpg?1480460782 "ネコ画像"\)： ![cat](http://icon.nimg.jp/channel/ch2585253.jpg?1480460782 "ネコ画像")
\[cat_img\]:http://icon.nimg.jp/channel/ch2585253.jpg?1480460782 "ネコ画像"

#### 画像参照
[cat_img]:http://icon.nimg.jp/channel/ch2585253.jpg?1480460782 "ネコ画像"
\!\[cat_img\] \!\[cat_img\]
![cat_img] ![cat_img]

##  テーブル
\|列１|列2|
\|---|---|
\|何か|\[グーグル\]\(http://www.google.com\)|
\|\`a = b\`| \*\*hogehoge\*\*|
\|\!\[cat\]\(http://icon.nimg.jp/channel/ch2585253.jpg?1480460782 "ネコ画像"\)|\*test\*|

|列１|列2|
|---|---|
|何か|[グーグル](http://www.google.com)|
|`a = b`| **hogehoge**|
|![cat](http://icon.nimg.jp/channel/ch2585253.jpg?1480460782 "ネコ画像")|*test*|
ユーザ追加備忘

sudoersへの追加をよく忘れるので定型化。
難しいことは何も書いていません。ただの備忘録です。

```
useradd whouser
mkdir /home/whouser/.ssh
echo "ssh-rsa AAAAB3NzaC1......." > /home/whouser/.ssh/authorized_keys
chown whouser:whouser -R /home/whouser/.ssh
chmod 0700 /home/whouser/.ssh
chmod 0600 /home/whouser/.ssh/authorized_keys

passwd whouser

visudo
```
mochaの非同期テストがタイムアウトになる（Error: timeout of xxxxms exceeded.）

テストケースが `正` でないと失敗とも判別せず、タイムアウトとして処理されてしまう

# タイムアウトった例

テストケースが正でないので、タイムアウト

```js
it('recieve the error of too mush messages', done => {
    client.push(to, messages).catch(err => {
        err.status.should.to.equal(500); // 実際には400が返ってきている
        done();
    });
});
```

# タイムアウトらなかった例

テストケースが正なので、ちゃんと `done` が動いた？（実装追ってないから分からん）

```js
it('recieve the error of too mush messages', done => {
    client.push(to, messages).catch(err => {
        err.status.should.to.equal(400); // 実際には400が返ってきている
        done();
    });
});
```
DjangoのSQL文

分かりやすい、Django勉強資料を追加する
http://thinkami.hatenablog.com/entry/2015/09/04/235841

Django モデルの作成
http://docs.djangoproject.jp/en/latest/topics/db/models.html

複雑な連結
http://y0m0r.hateblo.jp/entry/20120601/1338552629


http://www.highpin.cn/job/h2172229.html
Azureを使っていて思った、思っていること

この記事は [Microsoft Azure2 Advent Calendar](http://qiita.com/advent-calendar/2016/microsoft-azure2) 2日目の記事です



Azureを色々さわってみて思った事、思っている事を
いいなと思った部分ともうちょっと良くなればいいなという部分について書いていきます。
また内容は個人的な意見ですので鵜呑みにしないでください、むしろ間違っているという疑いを
持って読んでいただくのが良いと思います。
そして大した内容ではないです。

## 良いと思った部分

### 1.思っていた以上に簡単
これまでクラウドサービスは知ってはいたものの、実際に使った事はなかったので難しいイメージでしたが、
実際に使ってみると割りとなんとかなるなって感じでした。
AWSもそうなんですがまずポータルサイトが日本語対応してくれている事は非常に助かります。
英語があまり得意ではないので日本語だとものすごく安心します。

インフラの知識がなくてもwebアプリケーションのサーバをポータル上のみで作成でき、デプロイに関してもGitHubリポジトリと連携させてpushするだけで完了するので最高です！

### 2.サポートセンターの方の対応が最高！！！
わからない事があってサポートセンターに質問した時のご対応が非常に素晴らしいです。
完全に主観になりますが、メールでの対応に加えて電話での対応もしていただき丁寧にサポートしてくれます。
対応後もこまめに連絡してくださり、上手いこといっているのか？いっていなければこちらの状況をヒアリングし改善案を提案いただくなど本当にありがたかったです。

## もう少し改善してほしい、困った部分

### 1.情報が(AWSに比べて)少ない

みなさんがどう感じておられるかはわからないですが、ちょっとしたことを調べる時でも本当に情報が少なく、ヘボエンジニアの私は困る事が多いです。
以下Qiitaでの比較ですがAWSとAzureタグで検索した場合の情報量の比較です。

#### Azure

![スクリーンショット 2016-12-02 9.35.09.png](https://qiita-image-store.s3.amazonaws.com/0/61480/910405db-944b-a8a8-79b7-53439f328224.png "スクリーンショット 2016-12-02 9.35.09.png")

#### AWS

![スクリーンショット 2016-12-02 9.34.52.png](https://qiita-image-store.s3.amazonaws.com/0/61480/a027bcb4-1213-02aa-d3e6-18b3d2712af2.png "スクリーンショット 2016-12-02 9.34.52.png")

投稿数については約10倍、タグのフォロー数については約6倍の差があります、全然違いますね。


### 2.なぜ？

なんでこんなに少ないの？と思いサービス開始日時を調べてみました。

### サービス開始日時
#### Azure
2010年1月
#### AWS
2006年7月

Azureの方が4年も遅いんですね、単純に情報量の差が出てくるのもあるのかもしれません。

### シェア

「azure aws share」で検索してみたんですが、調べ方が悪いのか最近の情報で数値化されたものを見つけられませんでしたが、現状はAWSが圧倒的なようです。

ただ、Azureのシェアもどんどん伸びてきているようなのでこれから情報もどんどん増えてくるだろうと期待していますし、自分自身もどんどん発信していければと思います。


## おわりに
つまらない内容でしたが読んでいただいた方のAzureを使うきっかけに少しでもなれば幸いです。
時間がなかった(←言い訳)のでちゃんとまとめたものをどこかで記事にしたいです。

また、記事を書いてる時点で明日の登録者がいないのでネタがあれば3日目も何か書きます。
Crystalとnasmで作った静的リンクライブラリをリンクする

こんにちは、Crystal界のわるいオタクです。

Crystalみたいな低レイヤを直に触れる言語だとちょくちょくインラインアセンブラを触りたくなることもあるかと思いますが、 `OutputOperands` に複数指定しようとするとなんだか構文エラーになってしまいます。

```
% crystal inlineasm.cr
Syntax error in inlineasm.cr:5: expecting token ')', not ':'

       : "={eax}"(low), "={edx}"(high)
```

しょうがないのでassemblyを書いてリンクすることで回避する方法でやってみましょう。C言語で書いた静的リンクライブラリでも同じようにできるはずです。

環境は

```console
% cat /proc/version
Linux version 3.10.0-229.14.1.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) ) #1 SMP Tue Sep 15 15:05:51 UTC 2015
% lsb_release -ds
"CentOS Linux release 7.1.1503 (Core) "
% crystal --version
Crystal 0.20.0 [b0cc6f7] (2016-11-22)
```

というかんじです。

まずAssembly側のコードを用意してやります。題材はrdtsc命令にします。

```nasm
bits 64

global get_rdtsc

section .text

        ;; fun get_rdtsc(Void*)
get_rdtsc:
        rdtsc
        mov [rdi], eax
        mov [rdi + 4], edx
        ret
```

静的リンクライブラリを作りましょう。私の環境はLinuxなので `nasm -f elf64 -o rdtsc.o rdtsc.asm` && `ar r librdtsc.a rdtsc.o` という形で作っておきます。

次にcrystal側のコードです。

```rb
@[Link("rdtsc")]
lib LibRDTSC
  fun rdtsc = get_rdtsc(Void*)
end

zero = 0_u64
start = pointerof(zero)
LibRDTSC.rdtsc(start)
puts start.value
sleep(1)
fin = pointerof(zero)
LibRDTSC.rdtsc(fin)
puts fin.value
```

`@Link(hoge)` を指定するとリンカに `-lhoge` を渡してくれます。 (ドキュメント: https://crystal-lang.org/docs/syntax_and_semantics/c_bindings/lib.html)

```console
$ crystal build --link-flags -L`pwd` rdtsc.cr
```

なんだかよくわからないけどちゃんと動いてるようにみえます。やったぜ。

```
% ./rdtsc
24892339598719468
24892342269338124
```
python で R のデータセットを使いたい

`The pandas.rpy module is deprecated and will be removed in a future version. We refer to external packages like rpy2.`
らしいので、`rpy2` を使うといいっぽい。

`pip install rpy2` で入る。


```py:ipython
In [1]: from rpy2.robjects import pandas2ri

# これをやると rpy2.robjects.vectors.DataFrame から pandas.core.frame.DataFrame に変換してくれる
In [2]: pandas2ri.activate()

In [3]: from rpy2.robjects import r

In [10]: r["iris"].head(10)
Out[10]:
    Sepal.Length  Sepal.Width  Petal.Length  Petal.Width Species
1            5.1          3.5           1.4          0.2  setosa
2            4.9          3.0           1.4          0.2  setosa
3            4.7          3.2           1.3          0.2  setosa
4            4.6          3.1           1.5          0.2  setosa
5            5.0          3.6           1.4          0.2  setosa
6            5.4          3.9           1.7          0.4  setosa
7            4.6          3.4           1.4          0.3  setosa
8            5.0          3.4           1.5          0.2  setosa
9            4.4          2.9           1.4          0.2  setosa
10           4.9          3.1           1.5          0.1  setosa

In [11]: type(r["iris"])
Out[11]: pandas.core.frame.DataFrame

In [12]: type(r["Titanic"])
Out[12]: numpy.ndarray
```

# 参考
http://pandas.pydata.org/pandas-docs/stable/r_interface.html#updating-your-code-to-use-rpy2-functions

# 追記@2016/12/5

[rpy2](http://rpy2.bitbucket.org/) が

```
Installing should be as easy* as
pip install rpy2
(*: except on Windows)
```

とかサラッと無慈悲なので [PypeR](http://www.webarray.org/softwares/PypeR/) 使う方法もあるみたいだけど、2012で止まってる気がするけど大丈夫なんだろうか。
Go入門してみた

最近は色んなツールがどんどんGoで開発されてますよね。
Netflixの[ChaosMonkey](https://github.com/Netflix/chaosmonkey)など、既存ツールをGoで書き直す事例もあるようです。

いまどきの言語には珍しく、かなりシンプルな機能しかないGoですが、なぜこんなに流行っているのか確かめるために触ってみました。

その際気になったことなどのまとめです。

## Go環境

- `go version go1.7.3 darwin/amd64`

## パッケージ管理

GoにはRubyGemsやMaven的なライブラリの中央管理リポジトリがありません。
かわりに、GithubやBitbucketなどのGitホスティングサービスがその役割を果たします。

### go get
ライブラリを使う際は、`go get github.com/user/repo`を実行することで、`$GOPATH/src/github.com/user/repo`にリポジトリがcloneされ、コード上では`import github.com/user/repo/package`で参照できるようになります。

### vendoring
`go get`だと、goプロジェクトごとに別のバージョンのライブラリを使い分けることができません。

Go 1.6以降では、goプロジェクト内の`vendor`ディレクトリがimportの探索パスに入るため、
`git submodule`などで`vendor/github.com/user/repo`にリポジトリを置くことで、バージョンを固定できます。例: https://github.com/ocadaruma/go-javactl

## Maybe

Goには、HaskellでいうMaybe / ScalaでいうOption的なものがありません。
例えば「必須でない設定項目」など、存在しないかもしれない値を表現する際は、ポインタ型で持っておくか、zero valueとの比較を行うケースが多いようです。

```go
// ポインタの例
type MySQLConfig struct {
	Host string
	User string
	Password string
	Port *int
}

func connect(config MySQLConfig) {
	port := 3306
	if config.Port != nil { port = *config.Port }

	// ...
}
```

```go
// zero valueの例
type MySQLConfig struct {
	Host string
	User string
	Password string
	Port int
}

func Connect(config MySQLConfig) {
	port := 3306
	if config.Port != 0 { port = config.Port }

	// ...
}
```

zero valueとnilを分ける必要がない（zero valueが有効な値でない）場合は、素直にzero valueとの比較にするのがよさそうです。

## Named return valuesと早期リターンの組み合わせ

Goには例外機構がありません。

失敗する可能性のある関数は`(返り値の型, error)`というタプルを返すのが慣習です。

失敗する可能性のある関数を複数呼び出しす場合、Named return valuesで返り値を宣言しておき、失敗した時点で`return`するパターンをよく見かけます。

```go
func Prepare() (err error) {
	err = os.MkdirAll("logs", 0744)
	if err != nil { return }

	err = os.MkdirAll("working", 0744)
	if err != nil { return }

	err = os.Remove(".tmp_file")
	if err != nil { return }

	// ...
}
```

## まとめ

- 言語機能が少なくて、いろいろと困る
  - 反面、魔術の余地が少なく、人の書いたコードが読める（良い）
linuxでファイルを手軽に暗号化、復号化する

#linuxでファイルを手軽に暗号化、復号化する
linuxで手軽に使用できるopensslを使用して暗号化、復号化してみます。

##暗号化
opensslのenc -eを使用します。

```lang:具体例
openssl enc -e -aes-256-cbc -salt -k パスワード -in 暗号化したいファイル -out 暗号化した後のファイル


-e : 暗号化
-aes-256-cbc : AES暗号、256ビット、CBCモード
-salt : saltを使用してバイナリからの憶測を困難に（鍵を生成する際にランダムな値を使用するようにする）
-k : パスワード。このパスワードを用いて復号化します。
-in : 暗号化対象のファイルパス
-out : 暗号化後のファイルパス
```

##復号化
opensslのenc -dを使用します。

```lang:具体例
openssl enc -d -aes-256-cbc -salt -k 暗号化指定時のパスワード -in 復号化したいファイルパス -out 復号化後のファイルパス

-d : 復号化
-aes-256-cbc : AES暗号、256ビット、CBCモード
-salt : slatを使用してバイナリからの憶測を困難に（鍵を生成する際にランダムな値を使用するようにする）
-k : パスワード。暗号化の時に指定したパスワードを指定します。
-in : 復号化したいファイルパス
-out : 復号化後のファイルパス
```

##応用編
標準出力を暗号化するといった事もできます。
zip圧縮時にファイルを一旦作成せずに、暗号化ファイルを作成するといった用途などに便利。

```lang:/home/hogeフォルダを圧縮、暗号化します。
tar cz -C /home hoge | openssl enc -e -aes-256-cbc -salt -k パスワード -out hoge.aes
```

以上
プライベートモード時のLocalStorageの挙動と判定

プライベートモード時は、LocalStorageが全く使えないと思っていたが、ブラウザによって挙動が違かったのでまとめてみた。

| ブラウザ（プライベートモード） | 使用可否|
|:-----------|:------------|
|PC Chrome |○|
|PC Safari |☓|
|iOS Safari |☓|
|Android Chrome|○|

と、SafariとChromeで対応が違うので注意。

## プライベートモード時のLocalStorage使用可能かどうか判定方法

### NG例
以下だと、プライベートモード時でもグローバルに定義されているので`true`になってしまう。

```js
if('localStorage' in window){
    alert('✅LocalStorage使えるよ');
}
```

### こうするべき
try-catch文でやるのが正解。

```js
try {
    localStorage.test = 'hoge';
    alert('✅LocalStorage使えるよ');
} catch(e) {
    alert('❌LocalStorage使えない');
    console.error(e);
}
```
ownCloud と Windowsタブレット を使ったペーパーレス会議システム

ownCloud Japan Advent Calendar 2016 - Qiita
http://qiita.com/advent-calendar/2016/owncloudjp
の2日目です。

今年、ownCloud と Windowsタブレット をつかったペーパーレス会議システムを構築させていただきました。
簡単な構成ですが、気に入って頂けてるのではないかと思います。

ownCloud は、Windowsファイルサーバーのファイルの更新を検知するのがあまり早くないので、
弊社スタイルズの秘伝のタレを使わせて頂きました。

# 1. Windowsタブレットを使ったペーパーレス会議システム
# 2. これまでの会議での紙の利用の問題点
当然ですが、以下のような問題があります。

1. 印刷代、紙代の費用がかかる。
2. 書類の保管、管理が必要
3. 変更時の差し替えが大変
4. 配布にも工数が発生する。

# 3. そこで以下のようなペーパーレス会議システムを構築しました。
- WindowsタブレットにownCloud Desktopクライアントをインストールして常駐させる。
- ownCloudサーバーがWindowsファイルサーバーを常時監視。
- サーバー上のファイルが更新されたら、デスクトップアプリでファイルを同期してファイルを配布。

![image](https://qiita-image-store.s3.amazonaws.com/0/15176/2c835b00-c1ad-66c7-e6d3-81904144b846.png)

# 4. ファイルが同期されるフロー

## 4-1. 担当者がファイルをアップロード 

![image](https://qiita-image-store.s3.amazonaws.com/0/15176/f7ce9693-b585-a285-62e5-9a0d63517461.png)

## 4-2. ownCloudからファイルサーバーをチェックし、新たなファイルが追加されたら、ownCloud側にファイルを登録 

![image](https://qiita-image-store.s3.amazonaws.com/0/15176/a59faa45-08d3-f416-2417-8c4961d83602.png)

## 4-3. ownCloudデスクトップアプリが ownCloudサーバーと同期して、追加されたファイルを転送保存

![image](https://qiita-image-store.s3.amazonaws.com/0/15176/5bb62c55-c9cb-1e5d-55ab-2fec5e8e4fb3.png)

# 5. 注意点：ownCloud ファイル同期スピード

ownCloud Community Edition は、Windows ファイルサーバー Notificationを受け取る機能がありません 
(ownCloud Enterprise Editionはあります)。

その為、Windowsファイルサーバーにファイルをアップロードしても、ownCloudはそれを知ることができません。Windowsファイルサーバーにファイルが置かれたのにownCloud側でWindowsタブレット側に同期することができません。
もしくは、同期に時間がかかります(弊社調べで3～5分)。

それを避けるために、ownCloud側で対応しました。
.NETのVersionクラスで1.0と1.0.0を比較しようとして嵌った

そもそものバージョン情報に関する規約でそうなってるのかもしれないけどちょっと面白かったのでメモ

```csharp
using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var v1 = new Version("1.0");
            var v2 = new Version("1.0.0");
            var v3 = new Version("1.0");

            Console.WriteLine(v1.CompareTo(v2));
            Console.WriteLine(v2.CompareTo(v1));
            Console.WriteLine(v1.CompareTo(v3));
            Console.Read();
        }
    }
}
```

`Version.CompareTo`は、引数として渡されたバージョンよりも自身のほうが新しければ1, 同じであれば0, 古ければ-1を返すようになっているので、出力として期待していたのは

```
0
0
0
```

だった
しかし、実際の出力は

```
-1
1
0
```

となっていたので、0であってもBuildがついているほうが新しいと判定されるらしい
変数の中身を出力してみると

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/47597/32cfb08c-50fa-d579-9c2e-fea3a6f99387.png)

v1では指定していないはずのBuildの部分が-1になっていた
なので、実質`v1 = 1.0.-1`と`v2 = 1.0.0`の比較になるのでv2のほうが新しいと判定されている様子
hashireというコマンドをelectronで作りました。

この記事は [Electron Advent Calendar 2016](http://qiita.com/advent-calendar/2016/electron) 2日目の記事です。

---

electronで何か作ろうと思い、
"hashire"というコマンドを作りました。
(といってもだいぶむかしに作ったのでバージョンは古いですが)

# 何？

元気がなくなったときに、ももクロの「走れ！」の動画を見てテンションを上げるためのツールです。

# インストール方法

```shell-session:
$ npm install -g hashire
```

# 使い方

ターミナルで

```shell-session:
$ hashire
```

と打つだけです。

# ソースコード

https://github.com/sassy/hashire

# しくみ

ほんとうにただelectronでYouTubeを再生させてるだけです。

```js:main.js
  mainWindow = new BrowserWindow({
    width: 640,
    height: 390,
    frame: false
  });
```

でframeをfalseにしてフレームを消しています。

YouTubeの再生には、Youtube iframe APIを使っていますが、
動画の再生が終了したときは、

```js:index.html
function onPlayerStateChange(event) {
  if (event.data == YT.PlayerState.ENDED) {
    var ipc = require('electron').ipcRenderer;
    ipc.send('close');
  }
}
```

でIPC通信でmainプロセスにcloseのメッセージを送って、

```js:main.js
ipcMain.on('close', (event, arg) => {
  app.quit();
});
```

でアプリを終了させています。

時間もかからずこのようなツールがつくれるなんてelectronは便利ですね！

-----
明日は @k-kobayashi さんの記事です。
書籍「機械学習と深層学習」のソースコードをRubyに書き換えてみる（neuron.c編）

# はじめに

書籍「[機械学習と深層学習](https://www.amazon.co.jp/gp/product/4274218872/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4274218872&linkCode=as2&tag=howtouseexcel-22)」を購入して勉強していたら、C言語で書いてあるプログラムが簡単そうだったので、Rubyで書き換えてみることにしました。

ちなみに、書籍で紹介されているソースコードは以下のURLからダウンロード可能です。

http://www.ohmsha.co.jp/data/link/978-4-274-21887-3/

# neuron.c

第4章 ニューラルネット
4.1 ニューラルネットワークの基礎

上記のneuron.cをRubyで書き換えてみました。
なお、完全に同一ではありませんので悪しからず。

```rb:neuron.rb
# ライブラリの読込
include Math

# 定数の定義
$maxinputno = 100

# 学習データの読み込み
def getdata()

  e = [
    [0.0,0.0],
    [0.0,1.0],
    [1.0,0.0],
    [1.0,1.0]
  ]
  
  return e
  
end

# 順方向の計算
def forward(w, e)
  
  u = 0.0
  i = 0
  
  e.each do |val|
    u += val * w[i]
    i += 1
  end
  
  u -= w[i]
  return f(u)

end

# 重みの初期化
def initw(n_of_row)
  
  w = Array.new(n_of_row + 1)
  
  w[0] = 1.0
  w[1] = 1.0
  w[2] = 1.5
  
  return w
  
end

# 伝達関数
def f(u)
  
  x = 0.0
  
  if u >= 0.0
    x = 1.0
  else
    x = 0.0
  end
  
  return x
  #return 1.0 / (1.0 + exp(-u))
  
end

# メインプログラム

e = getdata()
w = initw(e[0].length)

n_of_e = e.length

puts "データの個数:#{n_of_e}"

o = 0.0

e.each do |vals|
  o = forward(w, vals)
  puts "入力: #{vals}, 出力: #{o}"
end
```

# 実行

```sh:
$ ruby neuron.rb
データの個数:4
入力: [0.0, 0.0], 出力: 0.0
入力: [0.0, 1.0], 出力: 0.0
入力: [1.0, 0.0], 出力: 0.0
入力: [1.0, 1.0], 出力: 1.0
```

できた！
bash on Windowsでfabricの導入と動作確認

bash on WindowsからRaspberryPiに同時デプロイするためにfabricを導入しました。
動作確認まで行いましたので、記載していきます。

# bash on Windowsにfabricをインストール
## easy_installをインストール
`$ sudo apt-get install python-setuptools`
## Python のヘッダファイルのインストール
これをやらずに進むとエラーがでる

```
pythonのversionが2.X.Xの場合
$ sudo apt-get install python-dev

pythonのversionが3.X.Xの場合(多分)
$ sudo apt-get install python3-dev
```
## fabricをインストール
`$ sudo easy_install fabric`

## バージョン確認
`$ fab -V`

# 動作確認
2台のRaspberryPiからenv.hostを取得し色を分けて表示とファイル送信をやってみました。

## fabfile.pyを作成する
`$ vim fabfile.py`

```py:fabfile.py
#coding:utf-8
from fabric.api import env, run, cd, lcd, put
from fabric.colors import green, magenta
from fabric.decorators import parallel

# SSHのIDとPW
env.user = "ID"
env.password = "PW"

# env用関数
def all():
  env.hosts = ["192.168.11.10","192.168.11.11"]
def green01():
  env.hosts = ["192.168.11.10"]
def blue01():
  env.hosts = ["192.168.11.11"]

# 並列実行
# env.hostが192.168.11.10の時緑でそれ以外はマゼンタで表示
@parallel(pool_size=2)
def getEnvHost():
  if env.host == '192.168.11.10':
    print green(env.host)
  else:
    print magenta(env.host)

# 同じPATHに保存
def copySamePath(path):
  put(path, path)
```

## 実行
### 2台からenv.hostを取得する
`$ fab all -f fabfile.py getEnvHost`
### 1台(192.168.11.10)に作ったfabfile.pyを送信してみる
`$ fab green01 -f fabfile.py copySamePath:'/home/pi/fabfile.py'`


env.hostsも実行時に動的にかえられるのでめっちゃ便利だ。。
C# in AWS lambda

# よっしゃC#やろうぜ
## 環境
Windows10
AWS-CLI設定済み(Admin権限持ってる)
Bash on Windows


## インストール
nodejs
入ってる人は飛ばしてください。入ってなければ
https://nodejs.org/ja/download/package-manager/#debian-and-ubuntu-based-linux-distributions-debian-ubuntu-linux
を参考に

```
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
sudo apt-get install -y nodejs npm
```

## dotnet-core
https://www.microsoft.com/net/core
1.0をインストールしてください。現時点では1.0用に作られているのでmigrateしてやるぜ！って方以外はとりあえず試すだけなら1.0でやったほうが早いです。

## aws-lambda-dotnet
https://github.com/aws/aws-lambda-dotnet
これにの通り

`npm install -g yo generator-aws-lambda-dotnet`

で完了

## プロジェクトの作成
適当なワークディレクトリに移動してyoコマンドを実行します

`yo aws-lambda-dotnet`

質問はEmpty Functionを選んでそれ以外は適当に。

## restore+test+deploy+execute!
作成されたプロジェクトのsrc/Readme.mdにすべて書いていますのでこの通りに進めます。
ここからはBoWではなくコマンドプロンプトで作業しています
(dotnetコマンドをWindows版入れたのが失敗だったっぽい？Linux版ちゃんと入れればBoWでできそう)

まずはプロジェクトルートでdotnet restore

```
cd "EmptyFunction"
dotnet restore
```

ユニットテストを実行して

```
cd "EmptyFunction/test/EmptyFunction.Tests"
dotnet test
```


問題なければデプロイ！
最初このテストがdotnet core 1.1を使っていたのでエラーが出てmigrateとかしてました。1.0入れたほうが早いです。

```
cd "EmptyFunction/src/EmptyFunction"
dotnet lambda deploy-function
```

デプロイが成功したらlambdaのマネジメントコンソールから当該ファンクションを選択して[Test]

`"hogehoge"`

というJSONデータを渡して結果がHOGEHOGEと帰ってくるはず！やったぜ！


![CsharpLambda.PNG](https://qiita-image-store.s3.amazonaws.com/0/44786/ac70547a-9e8d-b54f-6522-10035dd3e237.png)
ゼロからphp7環境構築 - 3.サンプルアプリ作成(laravel5)

前回: [ゼロからphp7環境構築 - 2.Appサーバー設定](http://qiita.com/th_/items/8c2d930965e1583f5e52)

# 概要
laravel5でサンプルアプリケーションを作成し、DBアクセスを行います。
手間を省くためにチュートリアルのtask管理アプリを使用。
git cloneするだけでサクッと確認できて便利です。

* vagrant up
* サンプルアプリ作成
* DocumentRoot変更

# vagrant up

```
cd C:\HashiCorp\Vagrant\work\testProject\appserver
vagrant up
```

192.168.33.11 (vagrant / vagrant) へssh接続
(DBサーバーの起動も忘れずに)

# サンプルアプリ作成

laravel5のチュートリアルを参考に、task管理アプリを作成します

```
cd
git clone https://github.com/laravel/quickstart-basic quickstart
cd quickstart
composer install
```

DB接続設定

```
vim .env
```
編集内容
```
DB_HOST=192.168.33.21
DB_DATABASE=test
DB_USERNAME=root
DB_PASSWORD=vagrant
```

テーブル作成

```
php artisan migrate
```

取り消す場合

```
php artisan migrate:reset
```

>参考
> [larave5でタスクリストを作る](https://readouble.com/laravel/5.2/ja/quickstart.html)

## DocumentRoot変更

```
sudo vim /etc/httpd/conf/httpd.conf
```

■119行目
DocumentRoot "/home/vagrant"
↓
DocumentRoot "/home/vagrant/quickstart/public"

■124行目
Directory "/home/vagrant"
↓
Directory "/home/vagrant/quickstart/public"

■131行目
Directory "/home/vagrant"
↓
Directory "/home/vagrant/quickstart/public"

再起動

```
sudo systemctl restart httpd.service
```

http://192.168.33.11/ 表示確認
登録・削除ができることを確認してください

気になる人はDBサーバーに接続して登録したデータを確認してみましょう

```bash
mysql -h 192.168.33.21 -uroot -p
```
参考: [Appサーバーで接続確認](http://qiita.com/th_/items/8c2d930965e1583f5e52)

## おまけ

### ハマリポイント解説
事象： http://192.168.33.11/ で表示はされるが登録がうまくいかない。php artisan serve で起動するとちゃんと登録できる

原因：[ゼロからphp7環境構築 - 2.Appサーバー設定](http://qiita.com/th_/items/8c2d930965e1583f5e52) のhttpd.confの設定変更の際、ArrowOverrideの変更もれ

***
前回: [ゼロからphp7環境構築 - 2.Appサーバー設定](http://qiita.com/th_/items/8c2d930965e1583f5e52)
Gitlabとslack連携

# slack設定
1. slackにログインする。
2. チーム名をクリックして「Apps & integrations」を選択する。
3.  開いた画面の右上「build」をクリックする。
4. 「Something just for my team」をクリックする。
5. 「Incoming WebHooks」をクリックする。
6. Gitlabの更新を表示させたいチャンネルを設定して、「Add Incoming WebHooks itegration」をクリックする。
7. WebhookURLをコピーする。

# Gitlab設定
1. 連携したいプロジェクトのページを開いて右上（歯車マーク）を選択し、Servicesをクリックする。
2. 下のほうにあるslackをクリックする。
3. Activeにチェックを入れて、webhookの欄にslackでコピーしたURLを記述し、Saveボタンをクリックする。

# はまったこと
Proxy配下のGitLab環境からWebhookが飛ばない。

【対応】
/etc/gitlab/gitlab.rbに設定を追加。

```/etc/gitlab/gitlab.rb
gitlab_rails['env'] = {
 "http_proxy"=>"http://XX.XX.XX.XX:8080",
 "https_proxy"=>"https://XX.XX.XX.XX:8080"
}
```

※OSの場合、環境変数にhttp_proxy・https_proxy を設定すればproxyが利用されるが
　Gitlabは環境変数をみないので要注意。
Description Templates

[GitLab Advent Calendar 2016](http://qiita.com/advent-calendar/2016/gitlab) 2日目の記事です。

GitLabのCI/CD回りの機能は非常に強力です。しかしCI/CD以外にも目立たないですが非常に便利な機能をたくさん持っています。そんな機能を少しづつですが紹介していきます。

本日は`Description Templates`についてです。

## Description Templatesとは

GitLabを使っている方の多くはGitHubも併せて使われているかと思います。`Description Templates`はGitHubの`Issue and Pull Request templates`に当たります。つまりIssueやMergeRequestのDescriptionに記載する内容のテンプレートを定義できる機能です。

`GitLab 8.11`から使用可能です。

実際の業務でIssueやMergeRequestの記述内容がバラバラになってしまったり、必要な情報が書かれてなくて困ったことはありませんか？新人さんだとそもそも何を書いてよいか分からない、といった方もいるかと思います。

そんな時にテンプレートが用意されていれば、担当者ごとの記述レベルや内容の差をかなり小さくすることができます。

機能についてはGitHubと少しだけ違うので作り方と合わせて見ていきましょう。

## 作り方

### .gitlabディレクトリを作成する

まずはプロジェクトのルートディレクトリに`.gitlab`ディレクトリを作成します。ここはGitHubとほとんど同じですね。

![gitlab-directory.png](https://qiita-image-store.s3.amazonaws.com/0/151841/ed88853d-77e6-6985-3ea8-941a505b46b4.png)

### issue_templates、merge_request_templatesディレクトリを作成する

次に先ほど作成した.gitlabディレクトリ内に`issue_templates`ディレクトリと`merge_request_templates`ディレクトリを作成してください。

![templates-directory.png](https://qiita-image-store.s3.amazonaws.com/0/151841/5160e931-0954-cf43-61aa-8446e22980fc.png)

GitLabではIssue用のテンプレートとMergeRequest用のテンプレートを別々のディレクトリで管理します。またテンプレートは一つだけでなく、複数作成することができます。用途に合わせてテンプレートを準備しておけば、いろいろ捗ります。

### templateファイルを作成する

最後にtempleteファイルを作成します。Issue用のtemplateファイルはissue_templatesディレクトリへ、MergeRequest用のtemplateファイルはmerge_request_templatesディレクトリに作成してください。

templeteファイルはMarkDownファイル(.md)が使用できます。ファイル名は任意です。`bug.md`や`enhancement.md`など選ぶときにどのテンプレートを選択すればよいかわかりやすい名前にしておきましょう。

![templates-files.png](https://qiita-image-store.s3.amazonaws.com/0/151841/f938b2a5-ee73-4467-693c-17b857d6b7b8.png)

作り方は以上です。

## 使ってみよう

では実際に使ってみましょう。

Issueの新規作成画面に行くとTitleを入力する項目のすぐ左にtemplate選択用のセレクトボックスが表示されているはずです。その中から目的のtemplateファイルを選択してください。

選択するとtemplateファイルの内容がDescriptionに転記されるかと思います。あとは内容を追記していくだけです。

![select-template.png](https://qiita-image-store.s3.amazonaws.com/0/151841/254c63ef-9b4d-c167-6e1c-8f0ebb56552a.png)


![selected-template.png](https://qiita-image-store.s3.amazonaws.com/0/151841/988b4af6-59b3-9163-eba3-1c38a9d9efdb.png)


MergeRequestの新規作成画面に行っても同じようにTitle横のセレクトボックスからtemplateファイルを選択することができます。

##　最後に

Description Templatesの導入は非常に簡単ですが、効果はとても高いかと思います。こういった機能をどんどん使って効率的に作業を進めていきたいものですね。
werckerでパッケージのインストールに失敗したときの対処法

# 結論

恒久的な解決策ではないが，問題が発生したときにキャッシュを削除することで回復可能である．

キャッシュの削除は，各アプリケーションの設定から行う．

（注１）使用してるboxが異なる場合，回復しない可能性もある
（注２）`install-packages`ステップのみを使っていれば，そもそも問題が起きない可能性はある

# 突然，パッケージのインストールに失敗するようになる

ある日からパッケージのインストールに失敗するようになった．おかしい．．昨日まではこんなところで問題は発生していなかったのだけども．．

再実行を試みるも，やはり失敗する．しかも，常に同じパッケージのインストールで失敗する．

ちなみに，このアプリケーションの実行環境は以下の通り．

* box
    * ubuntu:16.04
* パッケージ管理
    * apt

パッケージのインストールは`install-packages`ステップではなく，別途用意したスクリプトを使って行っている．バージョンの関係などで，aptを使わずにインストールする必要があるソフトウェアがあり，これらもまとめてインストールするためだ．

`apt-get -qq update`を`apt-get -q update`に修正し，パッケージ情報が期待通りに更新されていることも確認した．

万策尽きて，werckerのサイト内をうろうろしていたところ，Options画面にCacheの文字を見つけた．駄目元でキャッシュを削除してみたところ，問題が発生しなくなった．

# 解決方法は？

ひとまず問題が発生した場合の回復方法はわかったが，そもそもなぜ問題が発生するのかがわかっていない．

[キャッシュの説明](http://devcenter.wercker.com/docs/pipelines/wercker-cache)を見る限りでは，aptは対象外のように見える．自作のインストール用スクリプトにて`npm i`を実行しているが，`npm-install`ステップを使っていないので関係ないと思われる．現象からの推測だが，おそらくここに書かれているもの以外にもキャッシュ対象になっているものがあり，これにaptのキャッシュが含まれているのではないか．

これ以上はwerckerのスタッフに直接聞いてみるしかないようだ．

あと試していないこととしては，以下のようなものが考えられる．

* ビルドの最終ステップで`apt-get clean`してみる
    * 説明によると，最後に成功したビルドからキャッシュをコピーしてくるらしいので
CloudFunctions http triggerでLINE Notifyにメッセージをおくる

# TL;DR
- GCP のCloudFunctionsでLINE NotifyのAPIをキックする
- slackのOutgoing Webhooksに登録するとslackの通知をLINEに転送できるようになる

# 準備

## gcloudコマンド
```gcloud components install alpha```

## デプロイ先の gs のbucket
``` gsutil mb -p PROJECT_ID gs://BUCKET_NAME ```

# 実装
## npm package

```shell-session

npm init
npm install config --save
npm instlal request --save
```

## script

```index.js
/**
 * HTTP Cloud Function.
 *
 * @param {Object} req Cloud Function request context.
 * @param {Object} res Cloud Function response context.
 */

var request = require('request');
var config = require('config');
var lineConfigAccessToken = config.Line.access_token;

exports.sendLineNotify = function sendLineNotify (req, res) {
  var options = {
    url: 'https://notify-api.line.me/api/notify',
    method: 'POST',
    headers: {
      'Content-Type':'application/x-www-form-urlencoded',
      'Authorization': 'Bearer ' + lineConfigAccessToken,
    },
    form: { message : `${req.body.text}` }
  };
  // request LINE Notify
  request(options, recallback);

  function recallback(error, response, body) {
    if (error == true) {
      console.log(body);
    }
  }

  res.send('ok');
};
```

## config
- LINE Notifyのaccess_tokenを取得して config/production.jsonに記述する

```config/production.json
{
  "Line": {
    "access_token": "ACCESS_TOKEN"
  }
}
```

# deploy

```shell-session

-> % gcloud alpha functions deploy FUNCTION_NAME --stage-bucket BUCKET_NAME --trigger-http

Copying file:///var/folders/rt/gg6z17_51z3_l4jf7rtmgvc00000gn/T/tmpGwi1cH/fun.zip [Content-Type=application/zip]...
- [1 files][  1.1 MiB/  1.1 MiB]
Operation completed over 1 objects/1.1 MiB.
Waiting for operation to finish...done.
availableMemoryMb: 256
entryPoint: FUNCTION_NAME
gcsUrl: gs://BUCKET_NAME/us-central1-FUCNTIONNAME-xxxxxxxxxxx.zip
httpsTrigger:
  url: https://us-central1-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME
latestOperation: operations/d3d3LXRrbnprLWNvbS91cy1jZW50cmFsMS9zZW5kTGluZU5vdGlmeS9PNEV0ZHFlZ3dRaw
name: projects/PROJECT_ID/locations/us-central1/functions/FUNCTION_NAME
status: READY
timeout: 60s
```

# test call
- deployのときに表示された triggerの urlに対してcurlで POST Request

```shell-session
curl -X POST https://us-central1-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME -H "Content-Type:application/json" --data '{"text":"from gcf text message"}'
```

# Ref
- https://cloud.google.com/functions/