OmniAICreator/Qiita-1.07M huggingface dataset:
Linuxを触り始めるにあたって初心者が気づくのに時間がかかったところメモ

#はじめに
最近、Linuxを本格的に勉強したくなったが、Windowsでのコマンド操作には慣れている自分が
Linuxを学ぶに当たってちょっと気づいたことなどを追記していこうと思う。

#DOS環境との違い
Windowsから、DOSに降り遊ぶのが好きな人だったので、考え方としてここがかなり参考になった。
[Linux Vs. MS-DOS (Yes, Seriously) - PCMech](https://www.pcmech.com/article/linux-vs-ms-dos-yes-seriously/)

#バックグラウンドプロセスの扱い方
以下のサイトが一番参考になった。特に「Important Commands」がまとまっていて便利。
[Multitasking from the Linux Command Line + Process Prioritization :: Chris Jean]( https://chrisjean.com/multitasking-from-the-linux-command-line-plus-process-prioritization/)

Ctrl + Zで後ろに下げたプロセスをfgで引っ張り出せることは知っていたが、
Ctrl + Zと、fg、bg、&、ジョブ番号の対応関係が頭のなかでばらばらになっていた。

実機で作業していると仮想コンソールの切り替えを使いがちだが、SSHで作業するときなどはこっちのほうが便利かもしれない。

#仮想コンソールの操作
Ctrl + Zで一時停止
Ctrl + CでBreak
Tabでコマンド補完
↑↓でコマンド履歴
は当たり前なので知っているが、

Shift + PageUp
Shift + PageDown
で仮想コンソール上の表示履歴をたどることができるのを知らなかった。
いっつも| moreを使っていた

他にも、
Ctrl + Rでコマンド履歴の検索
Ctrl + Aで行頭
Ctrl + Eで行末
Ctrl + uで行頭まで削除
Ctrl + kで行末まで削除
Ctrl + wで単語単位で削除
Ctrl + lで画面クリア (clearコマンドと同じ)

[作業が爆速になるターミナルのショートカットキーまとめbacchi.me]( https://bacchi.me/linux/terminal-tips/)
[＠IT：コンソールで画面をバックスクロールするには]( http://www.atmarkit.co.jp/flinux/rensai/linuxtips/606backscr.html)

#Screenコマンドめっちゃ便利
今までの苦労は何だったんだ...
やっぱりSSH経由で操作したほうが色々楽なのかなぁ、と思っていたら、これがあるとは。
シリアルポートに接続するアプリケーションだとばかり思っていた。

[Linux screenコマンド使い方 - Qiita](https://qiita.com/hnishi/items/3190f2901f88e2594a5f)

#素に近いLinux環境を触ってみる
ArchLinuxがwikiも環境も勉強になる。
[インストールガイド - ArchWiki]( https://wiki.archlinux.jp/index.php/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89)

MS-DOS環境の構築はやったことがあったので、それに近い、コマンドベースでの環境構築の仕方を知りたかった。
Ubuntuとかは「何も知らなくても使える」のが便利なのだが、表面をなでているだけな感じが強かったので、
Archのセットアップは「自分がやっている感」があり、とてもやりやすい。

インストールガイドとコマンドヘルプを参考にしていれば概ね扱えるが、それでも最初詰まるので、
(主に、パーティション操作と、grubのインストール)

以下のようなコマンド例を参考にすると良い。

[Arch Linuxで最も早くサーバー環境を立ち上げるまでの手順 : Arch Linuxのインストール](https://qiita.com/syui/items/7b2ccd01da14fd8f3209#arch-linux%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
[Arch Linuxを簡単インストール – 「楽しいさくらのクラウド」(17) | さくらのナレッジ](https://knowledge.sakura.ad.jp/6443/)

個人的に、パーティション操作はcfiskが一番分かりやすかった。

ちなみに、当たってくだけてで3回ほどやり直した。(ブートローダーぶっ壊したりなんだり)
初回はVirtual Boxでやるのが一番良いと思う。

#...
後々追記するかもしれません。
Eclipseでlog4jを使ってログ出力ができるように前準備をする。

この記事は、Eclipseでorg.apache.log4jパッケージを使用してログ出力ができるようにする為の前準備について記載したものです。

1.まずは、log4j パッケージ(ここではlog4j-1.2.17.zip) を以下のサイトからダウンロードします。
  http://www.apache.org/dyn/closer.cgi/logging/log4j/1.2.17/log4j-1.2.17.zip

2.log4j-1.2.17.zip ファイルを解凍して、log4j-1.2.17.jarファイルをプロジェクトの外部ライブラリに追加します。
  Eclipseの画面より
  + 該当するプロジェクトを右クリック->プロパティをクリック
  + Javaのビルド・パスをクリック->ライブラリ-(L)タブ->外部JARの追加
  + ファイル選択画面より、log4j-1.2.17.jar を開く
  + 適用して閉じるをクリック
　これで、プロジェクトで log4j を使ったログ出力ができる環境が整いました。

簡単なプロジェクトでログ出力されるかテストしてみます。
※上記で、外部JARが追加されていないと、org.apache.log4j.* のクラスが取り込めないのでその部分は大丈夫そうです。

package test.project;
import org.apache.log4j.Logger;
   
public class TestClass {
    public static void main(String[] args) {
        Logger logger = Logger.getLogger(TestClass.class.getName());
	// ログ出力
	logger.info("This is info.");
    }
}

実行すると、あれ、ログ出力されません。以下のエラーが出力されます。
log4j:WARN No appenders could be found for logger (test.project.TestClass).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
調べてみると、どうやら、このエラーは、test.project.TestClass でログ出力の設定が見つからないので、設定してくれというエラーのようです。
設定方法としては、プロパティファイル(log4j.properties)とXMLファイル(log4j.xml)で設定する方法があるので、今回は、XMLファイルを使用します。

3.log4j.xml ファイルを作成する。(作成場所は、ソースファイルと同じ場所)
デフォルトで < appender name="stdout" > ～　</ appender > の部分は、ネットにあったのでそのままパクリます。
< category name=*** > ～ </ category > の部分が新規に作成した定義です。*** はクラス名ではなく、パッケージ名(今回の場合、"test.project" になります。)

< ?xml version="1.0" encoding="UTF-8" ?>
< !DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
 < log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    < appender name="stdout" class="org.apache.log4j.ConsoleAppender">
        < param name="Target" value="System.out" />
        < layout class="org.apache.log4j.PatternLayout">
            < param name="ConversionPattern" value="%d{yyyy/MM/dd HH: mm:ss SSS} %5p %5t %c{1} - %m%n" />
        < /layout>
    < /appender>

  < category name="test.project" >
    < appender-ref ref="stdout" />
  < /category>

< /log4j:configuration >

これでまた実行してみます。あれ、また出ます。
log4j:WARN No appenders could be found for logger (test.project.TestClass).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
何でまだエラーになるんだ？といろいろ調べてみると、クラスパスが通っていない場所に log4j.xml がある為、見れていないようです。

public class TestClass {
    public static void main(String[] args) {
        Logger logger = Logger.getLogger(TestClass.class.getName());
        // 追加して確認<ここから>
        URL fileXmlUrl = Loader.getResource("log4j.xml");
        DOMConfigurator.configure(fileXmlUrl);     // <-- fileXmlUrl が null
        // 追加して確認<ここまで>
	// ログ出力
	logger.info("This is info.");
    }
}

4.log4j.xml ファイルの場所にクラスパスを設定する。
  + 該当するプロジェクトを右クリック->プロパティをクリック
  + Javaのビルド・パスをクリック->ライブラリ-(L)タブ->外部クラスフォルダの追加
  + 外部クラスフォルダーの選択->log4j.xmlがあるフォルダ(今回はsrcフォルダ)を選択->OKをクリック 
  + 適用して閉じるをクリック
　これで、プロジェクトで log4j を使ったログ出力ができる環境が整いました。

これでまず上で実行したソースを動かすと、null ではなく、値が入って取れてます。
次に追加した部分を削除して動かすと、今度はちゃんと動きますね。

2017/XX/XX 14:56:09 781  INFO  main TestClass - This is info.
UE4でVR空間にカノジョを錬金 16日目

[UE4でVR空間にカノジョを錬金する Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ue4vrgame-create) 16日目の記事です。

12/1～25日までに一人で、UE4を用いてサ○○レッスンとかVR○○ジョっぽいゲームを作って仮想彼女を生み出すことにチャレンジします。

今回は手を振るUIとアクションを作っていきたいと思います。
ゲームジャム中に思いついたのですが、結局実装できなかった機能です。

#手を振っているかどうかの実装

手を振っているかどうかを判定です。とりあえず雑に組みます。

Oculus RiftはHMDだけでなくOculus Touchの加速度も取れるので、何回か連続で横方向の加速度が取れれば手を振っていると判定するように実装します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/969bce7c-1099-56f7-272d-b69afe24ff8f.png)


左手
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/11355495-b071-84a8-9a07-85d91170617d.png)

右手
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/eb0e68b1-40ed-a7e3-3c9b-2625aa6e4812.png)

これで手に持ったOculusTouchを何回か振ると「手を振った」と判定できます。
加速度が取れるというのはいいですね。
GAE/Go1.8のcontext問題

# 問題

GAEのcontextを取得する際、[公式のサンプル](https://github.com/GoogleCloudPlatform/golang-samples/blob/master/docs/appengine/storage/app.go#L55)では以下のように取得しています。

```go
import "google.golang.org/appengine"

func handler(w http.ResponseWriter, r *http.Request) {
    ctx := appengine.NewContext(r)
}
```


しかしapiバージョンがgo1.8の場合は以下のようなエラーが出ると思います。

`appengine: NewContext passed an unknown http.Request`

これは、Go1.7で標準パッケージにcontextパッケージが追加されたことによる問題です。

# 解決策

以下のように[Context](https://golang.org/pkg/net/http/#Request.Context)メソッドを使用することで、リクエストにスコープされたコンテキストを取得することが出来ます。

```go
func handler(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context()
}
```
【Go】gorm のRecordNotFoundメソッドがsliceで結果を受け取ると必ずfalseになる

# gorm のRecordNotFoundがsliceで結果を受け取ると必ずfalseになる件
## 書いた経緯
GoのORMの一つであるgorm。
使っていて盛大にどハマりして、結局gormのソースを読むことになったのでその備忘
## RecordNotFoundって何奴？

gormの[リファレンス](https://godoc.org/github.com/jinzhu/gorm)を見ると以下の感じです。

```
func (s *DB) RecordNotFound() bool
RecordNotFound check if returning ErrRecordNotFound error
```

ふむふむ。文面だけ読むとレコードがないエラーがあるかをチェックするらしい。

実際にソースにすると以下です。

```go:main.go
type user struct {
	ID   int    `gorm:"column:id"`
	Name string `gorm:"column:name"`
}

func main(){

	db, _ := gorm.Open("mysql", "root@tcp(127.0.0.1:3306)/playground")
	result := user{}
	recordNotFound := db.Table("user").First(&result).RecordNotFound()
}
```
接続情報やらエラー処理やらを色々説明をすっ飛ばしますが、上記のように書けます
で、この場合は、レコードがないときはtrueを返してくれます

ちなみに,userテーブルの中身は空っぽでidとnameのカラムがあります。


## さて、本題
以下の時の結果は果たしてどうなるでしょうか？

```go:main.go
package main

import (
	"fmt"

	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

type user struct {
	ID   int    `gorm:"column:id"`
	Name string `gorm:"column:name"`
}

func main() {
	db, _ := gorm.Open("mysql", "root@tcp(127.0.0.1:3306)/playground")

	result := user{}
	recordNotFound := db.Table("user").First(&result).RecordNotFound()
	fmt.Print("structのとき=")
	fmt.Println(recordNotFound)

	resultSlice := []user{}
	recordNotFound = db.Table("user").First(&resultSlice).RecordNotFound()
	fmt.Print("sliceのとき=")
	fmt.Println(recordNotFound)

}

```

### 実行結果

```
$ go run main.go
recordNotFoundがstructのとき=true
recordNotFoundがsliceのとき=false
```

...実行結果が違う...だと。
そうです。slice型の時はRecordNotFoundエラーはなし。

gormのソースを見ると確かに,0件かつ、sliceでないときにエラーを格納しています。

```go:callback_query.go
//~~省略~~
	if err := rows.Err(); err != nil {
		scope.Err(err)
	} else if scope.db.RowsAffected == 0 && !isSlice {
		scope.Err(ErrRecordNotFound)
	}
//~~省略~~
```

## まとめ
結果があるかどうかを見たい時は

```
len(result) > 0
```

とする必要がある。


これに関する議論は[issues](https://github.com/jinzhu/gorm/issues/228)で語られており、
意識してこの形にしているみたいです。
ArangoDBご紹介

# ArangoDBとは
NoSQL + Graph + KVS を扱えるオープンソースデータベースです
(Three major NoSQL data models in one open-source database.)

サイトは
https://www.arangodb.com/

# 使用した経緯
とあるネットワークゲーム(もうサービス終了してるけど)のログサーバーとして当初はメジャーなMongoDBにしようとしたらしいけど、発注元からライセンス的にNGをもらった関係で調べた限りこれが良さそうってことでお伺いをかけてライセンス的に問題ないとのことで採用したらしい(更にその後MongoDBでもライセンス的には問題なかったらしいと分かるんだけど・・・)。
で、使用するのは決定したけど、諸々の理由でだれもログ周りを作業しなかったので仕方なく私が調べ始め＆色々調べるうちに私的にはとっつきやすかったので今回ご紹介。

# 今回紹介するところ
NoSQL + Graph + KVSのNoSQLの部分です(GraphおよびKVSは使わなかったので紹介できませんｗ)

# インデックス貼れます
データベースでもデータ検索の際インデックスないととても遅いのですが、ArangoDBでもインデックス作成できますのでデータ大量にあっても安心です(ただしメモリは当然いっぱい使いますｗ)

# WebInterface
ArangoDBインストールすると使えます。だいたいのことはできます(コレクション作成とかインデックス作成、データ追加などなど)
https://docs.arangodb.com/3.1/Manual/Administration/WebInterface/

# CURLでCRUD
CURLで操作することは無いと思いますが、できますよって言うことで下記を参考にしてください(下記にあるAQL部分もありますが)
https://www.arangodb.com/tutorials/arangodb-crud/

# AQLで操作する
## AQLとは
ArangoDB query languageの略、いわゆる一般的なDBで利用されるSQLみたいなものです。
SQLとの比較表があって分かりやすかった。

MongoDBとの文法比較
https://www.arangodb.com/tutorials/mongodb-to-arangodb-tutorial/
私的にはMongoDBの集計周りが非常にとっつきにくい感じなのでAQL素敵

SQLとAQL比較表は
https://www.arangodb.com/why-arangodb/sql-aql-comparison/
SQLの基本的なことはほぼほぼできるので安心(JOINもできるしGROUPもできるし安心倍増)

## AQLでデータ取得したい
CURLでも操作できますが、WebInetrfaceで実行できますし、ほぼほぼ何らかの言語上でログデータ取得時に使用するかと思います。私はWebInterfaceでちゃんとデータ取ってこれるAQL作成までしてから各プログラムにコピペしてました。

# 各言語でのドライバ
ほぼほぼメジャーどころの言語用のドライバが存在します
https://www.arangodb.com/arangodb-drivers/

# Fluentdとの連動
運用したのがログサーバーなので特定のところにログを吐き出してそれをFluentD経由でArangoDBにデータを突っ込んでおりました。
使用したFluentd Pluginは
https://github.com/tamtam180/fluent-plugin-arango
でした

# 本格運用で躓いたこと
## ファイルオープンに引っかかる
コレクションのジャーナルサイズをデフォルトのまま運用してた(32MBで１ファイル)ので、ファイルオープン数が多くなりLinuxでの制限に引っかかってしまいました。設定でファイルオープン数の値変更できたため対処はできたのですが、コレクションごとのジャーナルサイズをちゃんとしたほうが安心です
※ArangoDB2系では4096がデフォルトファイルオープン数だった気がしますが、3系からデフォルトでもかなり大きい値になってたはずなので気にすることはないかもしれません
## インデックス貼り
メモリ多く使ってしまいますので貼りまくりには注意。またArangoDBのインデックスにはskipindexとかhashindexとかありますので、適切なのを貼ってあげてください(私の場合はskipindexだけで事足りた)
またインデックスを貼ると、再起動時にインデックスデータ作成のため時間かかりますので注意する必要があります。
## CORS
ブラウザからJavaScriptでデータ取ってきたいときには気をつけましょう＆私が調べた限りでは起動時のオプションでしか設定できないようなので注意(もし再起動無しで設定できるなら教えて！！！)


# あとがき
## 勉強方法
チュートリアル制覇するのが手っ取り早いです(私もチュートリアル制覇して理解していきました)
https://www.arangodb.com/tutorials/

## 他に色々できます
レプリケーション
クラスター
Webアプリ(ArangoDBではFoxx Frameworkって言うらしい)
https://docs.arangodb.com/latest/Manual/Foxx/index.html
もできます

## 性能比較
https://www.arangodb.com/performance/

## Tシャツ欲しい
欲しい、とても欲しい。
https://www.arangodb.com/community-survey/
でアンケート答えるともらえるらしいけど、日本まで送ってくれるのかとか費用どうなるのかとか思って数年躊躇ｗ

# 余談
## どうしてアボカドのアイコンなの？？？
最初はAvocadoDBっていう名前だったんだけど、他のアボカド愛好家の法的問題を避けるためにメキシコ/グアテマラで「アランゴ」と呼ばれる品種に変えたようです・・・本当です！
https://www.arangodb.com/2012/05/avocadodb-become-arangodb/
Visual Studio | WPF > TCP > 応答がない場合のエラーのキャッチ > HResult == -2146232800 

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

### 概要

TCPクライアントソフトにて、下記の処理を行う。

1. サーバーに接続
2. コマンドを送信
3. 応答を受信
4. サーバーと切断

3の処理において、応答がない場合のエラー処理を検討した。

### エラー処理

以下のような処理となるようだ。

```c#
        private void ReceiveData(NetworkStream netStream)
        {
            // 1. rcvdは<CR><LF>付き
            byte[] ReceiveBytes = new byte[1024];

            string rcvd = string.Empty;
            try
            {
                int BytesReceived = netStream.Read(ReceiveBytes, 0, ReceiveBytes.Length);
                rcvd = Encoding.ASCII.GetString(ReceiveBytes, 0, BytesReceived);
            }
            catch(IOException exc)
            {
                if (exc.HResult == -2146232800) // Timeout
                {
                    // TODO: エラー処理
                    // MessageBox.Show("応答がありません");
                }
            }
            // 正常受信処理 (後略)
```

- IOException excでエラーをとらえる
- HResultが`-2146232800`の場合は受信失敗

`-2146232800`はマジックナンバーでない方がいいが、具体的に定義している情報は見つかっていない。


### 関連

- [Streaming input to System.Speech.Recognition.SpeechRecognitionEngine](https://stackoverflow.com/questions/1682902/streaming-input-to-system-speech-recognition-speechrecognitionengine/11813276)
    - マジックナンバーでエラーキャッチしている
- [web client losing connections](https://social.msdn.microsoft.com/Forums/vstudio/en-US/b4f9eb8d-3a25-40e7-a953-175daf0444ad/web-client-losing-connections?forum=csharpgeneral)
    - スタックトーレスの情報
オブジェクト初期化時のプロパティ名に「式」を使う

# プロパティ名に「式」を使う
JavaScript オブジェクトの初期化時のプロパティ名に「式」が使えます。

```javascript
const propertyName = "my-key";
const object = { [propertyName]: "Hello, computed property name" };

object["my-key"]; // => "Hello, computed property name"
```

オブジェクト初期化内のプロパティ名のブラケットで囲んだ中身が、 *式* として評価されます。よって以下のような定義も可能です。：

```javascript
const object = { ["key" + 1]: 1 };
object.key1; // => 1
```

**computed property names** という名前で仕様化されています。
ES6 以上が必要ですが 2017 年のブラウザーなら問題なく使えるでしょう。

## Iterable オブジェクトの構築

for 文などで列挙可能なオブジェクトを作る際に `Symbol.iterator` という定数で宣言されたキーを持たせる必要があります。
このときに computed property names が便利です。

```javascript
var log = '';
const iterable = {
  [Symbol.iterator]: () => {
    var i = 0;
    return {next: () => new Object({value: i += 2, done: i > 10, }), };
  },
};
for (let x of iterable) log += x + ' ';
log; // => 2 4 6 8 10
```

#参考情報

* [MDN: ECMAScript 2015 での新しい表記法](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Object_initializer#ECMAScript_2015_での新しい表記法)
* [MDN: Iteration protocols](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols)
import,exportの書き方について

「Code Grid」で書かれていたimportとexportの指定の書き方について参考になったので、備忘録も兼ねて書きたいと思います。

- [ES modules基礎知識
](https://app.codegrid.net/series/2017-es-modules)

## default exportsの書き方

### export default [関数]

``` javascript:export
export default function (world) {
  console.log('hello ' + world);
}
```

### import [変数名] from [import先のパス]

``` javascript:import
import test from './export';
test('world'); // hello world
```

### export default [class]

``` javascript:export
export default class {
  constructor() {}
  hello(world) {
    console.log('hello ' + world);
  }
}
```

### import [変数名] from [import先のパス]

``` javascript:import
import Test from './Export';
const test = new Test();
test.hello('world'); // hello world
```

## named exportsの書き方

### export [変数]

``` javascript:export
export const test = 'hello world';
```

### import { [exportで書いた変数] } from [import先のパス]

``` javascript:import
import { test } from './export';
console.log(test); // hello world
```

### import { [exportで書いた変数 as 任意の変数] }


``` javascript:import
import { test as Test } from './export';
console.log(Test); // hello world
```

### export [変数]

``` javascript:export
export const num1 = 1;
export const num2 = 2;
export const num3 = 3;
export const num4 = 4;
```

### import { [exportで書いた変数, exportで書いた変数, ...] } from [import先のパス]

``` javascript:import
import [ num1, num2, num3, num4 ]  from './export';
console.log(num1); // 1
console.log(num2); // 2
console.log(num3); // 3
console.log(num4); // 4
```

### 上記を1つの変数[Num]にまとめた書き方

``` javascript:import
import * as Num from './export';
console.log(Num.num1); // 1
console.log(Num.num2); // 2
console.log(Num.num3); // 3
console.log(Num.num4); // 4
```
【Raspberry Pi 3/3B+】CPU温度をチェックしてみよう

#温度取得
$ expr `cat /sys/class/thermal/thermal_zone0/temp` / 1000

もしくは

$ vcgencmd measure_temp

※2018/9/1追記：3B+ファンなしで計測。熱・・・
<img width="106" alt="スクリーンショット 2018-09-01 14.30.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/194284/e89ec1cb-81ad-bc4e-d53e-d422e130a814.png">


#FANの有無による温度差

・KuGi Raspberry Pi 3 Model B ケース
http://amzn.to/2jkPYgK

ファンなし：３７度

<img width="420" alt="スクリーンショット 2017-12-10 13.43.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/194284/6209ffe4-0d6e-4783-5d72-5313e30f9eed.png">

・Smraza Raspberry Pi 3 ケース ラズベリー・パイ3 Model B ケース
http://amzn.to/2ybEqOb

ファンあり：３０度

![iOS からアップロードされた画像 (3).jpg](https://qiita-image-store.s3.amazonaws.com/0/194284/ef4047e5-8f6f-1528-95ac-54f0a221311e.jpeg)

消費電力を考えるとどちらが良いかは人それぞれ。
【Raspberry Pi 3】高耐久MicroSDでサーバ構築

#24時間稼働向けのMicroSDカードで快適サーバライフ

Transcend 高耐久 microSDHCカード MLCフラッシュ搭載
http://amzn.to/2C0kOPZ

<img width="438" alt="スクリーンショット 2017-12-10 12.21.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/194284/54001201-f452-19b8-473f-b981df6c6193.png">

#swapを無効化 & RAMディスクの作成
参考ページ
https://curecode.jp/tech/raspberrypi-ramdisk/
初心者がKotlinでHelloWorldを書けるのか？

##初心者がKotlinでHelloWorldが書けるのか？
Androidアプリを作ってる素人なのです。
:santa_tone1:<ことりんってなんだろう
な素人なので頑張ってHelloWorldを書くことに挑戦します。

尚、アドベンドカレンダー
Geek Women Japan Advent Calendar 2017
https://qiita.com/advent-calendar/2017/geekwomenjapan
13日目です。よろしくお願いします。



##なんでKotlin？とかその辺の諸々経緯は👉
https://qiita.com/berukokoko/items/e7a1096e3b7a9ce28272
に書きました。
よくわかってないまま放置してしまっていたので、
改めてHelloWorldを書きたいと思います。

##とりあえず
お試しにこのサイトで書けます。とのこと。
https://try.kotlinlang.org/#/Examples/Hello,%20world!/Simplest%20version/Simplest%20version.kt

素晴らしい。早速サクッと書いてみます。

>fun main(args: Array<String>) {
    println("Hello, world!")
}

![スクリーンショット 2017-12-03 17.11.51.png](https://qiita-image-store.s3.amazonaws.com/0/148394/79f8602b-1876-361d-b864-4a3d3e32f383.png)

こんがり書けました。

感想
素人:santa_tone2:　<なんかJavaと違くね？

##実際にAndroidstudioでも書いてみたいと思います。
![スクリーンショット 2017-12-02 20.18.44.png](https://qiita-image-store.s3.amazonaws.com/0/148394/c633b536-172f-a920-a758-62fc3a119d0c.png)
:santa_tone2:あっ、魔法の変換機能発見。


![スクリーンショット 2017-12-03 15.54.30.png](https://qiita-image-store.s3.amazonaws.com/0/148394/94fc3bf6-e37d-e450-b90c-be461f6ac8f7.png)


![スクリーンショット 2017-12-03 15.55.02.png](https://qiita-image-store.s3.amazonaws.com/0/148394/c9cb8598-df1a-8cea-7680-f25a4a4f824e.png)

:santa_tone2:魔法使お。


ご覧ください！！
なんとKotlinへ生まれ変わりました！！！！！！！
![スクリーンショット 2017-12-03 17.31.41.png](https://qiita-image-store.s3.amazonaws.com/0/148394/faa261fc-5245-b6f2-e491-5030526aaec4.png)


:metal:やったね。

##Javaとの比較する。

KotlinのHelloWorld
>fun main(args: Array<String>) {
println("Hello, world!")
}



JavaのHelloWorld
>public class HelloWorld {
    public static void main (String[] args) {
        System.out.println("Hello World !!");
    }
}


#:rolling_eyes:Javaとの比較
Javaと何が違うのか？って話なのですが、調べてみました。

Kotlinスタートブック -新しいAndroidプログラミングhttps://www.amazon.co.jp/dp/4865940391/ref=cm_sw_r_tw_dp_U_x_ZollAbAP5TXKS 
赤べこ本を参考にさせていただきました:eyes:

###⒈クラスに属する必要がない。
Kotlinには、これだとJavaにはあるclass HelloWorld がないようです。
クラスというものに属さないで書くことができるようです。
なんだか不思議な感じがします。

###⒉関数定義はfun。
funと書けば、これは関数です、という意味で、関数を定義することができるようです。
「function」のfunだと思うのですが、これだと随分楽ですね。

###⒊型は変数名のあとに。
args: Array<String>の部分ですが、argsが変数のようで、<String>が型のようです。
（）の中仮引数に当たるところで型を宣言していますが、
Kotlinの場合は、後から型宣言が来るところが違います。

###⒋文末にセミコロンがいらない。
println("Hello, world!")
の後につけ忘れに見えるのですが、セミコロンがありません。
元々省略できたようです。


#Kotlinを書いてみて
:santa_tone1:＜なんてシンプルなんだ・・・((((; ﾟДﾟ))) と驚きました。
これだけ書きやすければ需要がありそうだなあ、とこれからに期待しています。
Hello, world以外にも勉強して書いていきたいと思います。
Goの俺的scaffoldはこれだ！2017年版

~~Boom Boom~~ Hello, gophers! Go書いてるかい！

# tl;dr

今年も色々、汚物に似た何かをGitHub上に吐き散らかしてきましたが、
来年はもうちょっとキレイな汚物にしようと考え、自分なりに **Goで何か作り始めるならここがスタート** という物をまとめてみようと思います。

# 実物

[go-init](https://github.com/kyoh86/go-init)というのを作って運用してます。
中には `init.sh` が入ってるので、 `init.sh ${OWNER} ${NAME}` とかすると、 `github.com/${OWNER}/${NAME}` で運用する前提のディレクトリが出来上がるので、 `git init` とかして遊ぶといいと思います。
本当はこいつをscaffoldingツールとして仕上げてこの記事を書きたかったんですが、時間切れです。
~~yeomanでいいじゃん~~

# 動機づけ

## 2017年私的プロジェクト振り返り

この2017年、なんやかんや自分なりに色々開発してきて、あれがねえな、これもねえなと思うたびにshell書く代わりぐらいのテンションでgolang書いてきました。

今年メンテしていた自分のリポジトリを雑に振り返ってみると…

* [ask](https://github.com/kyoh86/ask)
    * CLIでダイアログだすやーつ。Y/NとかStringとか取れちゃう。嬉しい！ ~~何番煎じだよ~~
* [deject](https://github.com/kyoh86/deject)
    * ローカルリポジトリ管理する君。dog fooding しちゃいるものの、将来性が見えない。 ~~何番煎じｄ~~
* [git-branches](https://github.com/kyoh86/git-branches)
    * `git-branch --list` 見にくいよ、fzfとかと繋げた時に見やすいの作ろ、と思ったやつ ~~`git-for-each-ref`でいいじゃん~~
* [git-prompt](https://github.com/kyoh86/git-prompt)
    * tmuxとか、zshのプロンプトにさ、gitの情報出したいじゃん
    * zshのvcs_infoはさ、スゲーはえーけど、情報足んないじゃん
    * shellでやってもいいけどさ、重いじゃん
そうだ、goでやろう。 **結構速いよ！**（当社比）
* [git-vertag](https://github.com/kyoh86/git-vertag)
    * segverタグ管理したいけど、`npm` 。俺のローカルに `node` がいくつ入ってると思ってるんだ。 ~~何番線~~
* [go-spdx](https://github.com/kyoh86/go-spdx)
    * [SPDX Licenses](https://spdx.org/licenses/)（`MIT+APSL-1.0`とか）パースしてやんよ！なんならLICENSE本文も出したるぜ！ ~~誰得~~
* [richgo](https://github.com/kyoh86/richgo)
    * go test 見にくいんじゃ！！FAIL を赤文字にしたらんかい！！ **スター結構もらったよ！ (^O^)**
* [xdg](https://github.com/kyoh86/xdg)
    * [XDG Base Directory Specification](https://specifications.freedesktop.org/basedir-spec/latest/) で示されるディレクトリの一覧を色々取得するやつ。
    * 仕様以上でも以下でもないのがなくて、しょうがなく作った。なんで無いの？ ~~誰もいらないかｒ~~
* [zshist](https://github.com/kyoh86/zshist)
    * zshのhistってなんでvimでいじると文字化けるの。馬鹿なの。と思ってdecode&encodeするやつ。shellでおｋ

まぁ誰得だったり、n番煎じだったり酷いですね。
それもこれも、僕が変に凝り性で、そうだアレ作ろ！と思ってから1週間経った頃にもまだ `.circle/config.yml` コネコネしてたりするからです。

## scaffoldingの目的

* 作りたいと思った瞬間、目的に集中できる状態を作りたい
* あわよくば、するっと go-awesome とか載りたい
    * Coverageなんてとってねえよ！CI？ハハッ！みたいな状態だとモチベ下がる。
    * go-awesome自体、雑多な寄せ集めみたいになってるけど、それでもやっぱり載ってるとさ！嬉しいじゃん！！

## 選択した物と動機（という名の感想）

* コマンドライン引数の処理は[kingpin](https://github.com/alecthomas/kingpin)最強
    * 若干やれることが多すぎるけど、取り回しがいい
* CIはなんだかんだ[CircleCI](https://circleci.com)がバランスいい
    * [Wercker](https://app.wercker.com)シャレオツ最強かと思ったけど、**漢気が足りない。**
* Coverageは[Codecov](https://codecov.io)が良さそう。Coverallsでもいいんだけど、ちょと見づらい
* LICENSEは何も考えずにMITでいい
* [goreleaser](https://github.com/goreleaser/goreleaser)で、マルチプラットフォーム対応のバイナリリリースも簡単に
    * homebrewに載せるのすら簡単。すばら
* Makefileはやっぱりあったほうがいい
    * [dep](https://github.com/golang/dep) だ [go-bindata](https://github.com/shuLhan/go-bindata) だと、golang周りのツール類が群雄割拠している
    * contributionのためのentrypointとして、タスクランナーはあったほうが優しみ
    * golang開発のタスクランナーにgulpとか持ち出すのナンセンス。Makefileでいい

# おわりに

これが永遠のベストだとは思わないですが、ひとまず今のところはこれでいいんじゃないかな、というところに落ち着きました。
これからgolangで何か作ろう、でも環境ちゃんと定めたいな、引っかかっちゃって先に進めないな、というgophersのお役に立てれば幸いです。

良きgophersライフを。
UE4でVR空間にカノジョを錬金 15日目

[UE4でVR空間にカノジョを錬金する Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ue4vrgame-create) 15日目の記事です。

12/1～25日までに一人で、UE4を用いてサ○○レッスンとかVR○○ジョっぽいゲームを作って仮想彼女を生み出すことにチャレンジします。

今回はうなずきUIが視界に入っているときのみ有効にするように修正します。

#今まで実装したうなずきUIの問題点

うなずきの判定はUIを見ていなくても可能なように実装しているため、視界外でうなずきのアクションをしてしまうと勝手にゲームが進んでしまい、ユーザーが混乱してしまうという問題点があります。
これを完全になくすのは難しい（例のゲームもそこの判定は極めて弱い）ので、視界に入ってうなずきアクションをしたときのみ、UIを入力したとみなすようにします。

#視界の判定

[こちらのAnswerHub](https://answers.unrealengine.com/questions/499508/%E3%82%A2%E3%82%AF%E3%82%BF%E3%83%BC%E3%81%8B%E3%82%AB%E3%83%A1%E3%83%A9%E3%81%AB%E6%98%A0%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E3%82%92%E5%88%A4%E5%88%A5%E3%81%97%E3%81%9F%E3%81%84.html)の回答内容をそのまま引用させていただきました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/8c0ecbdf-6ddf-7345-7fef-cb5e36cb7c93.png)

今回の実装では40度以内に入っていれば判定を有効にするように実装しています。

ついでに今まで実装したHMDアクション判定のマクロをいったん整理します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/cf64092a-0de3-f0b6-e4d2-38d118dadd75.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/83c7f19a-dfb8-22d9-70b4-d48f54d16291.png)

今回はここまでです。
Visual Studio > IDE > ショートカットを忘れたときの確認手順 > Ctrl+Q とキーワード入力

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community (以下VS)
Sublime Text 2
```

VSをたまに使っていてショートカットなどを忘れる。
(他のIDEのショートカットと混乱するということがある。Arduino IDEとかR StudioとかMatlabとかC++ Builderとか組込みのIDEとか）。

忘れたときに確認する最短手順は何か。

### 手順

1. Ctrl+Q
    - IDE右上の「[クイック起動](https://code.msdn.microsoft.com/windowsdesktop/vs2013tips-02-f0a0395a)」のテキストボックスにフォーカスが移動する
2. キーワード入力
    - 例: タスク
        - タスク一覧表示方法の確認(と実行)
            - TODOリスト
    - 例: コメント
        - コメントの設定と解除方法の確認(と実行)
    - 例: ブレーク
        - ブレークポイントの設定と解除方法の確認(と実行)
    - 例: 展開
        - コード領域の折り畳みと展開方法の確認(と実行)
    - 例: 開始
        - デバッグの開始方法の確認(と実行)
    - 例: パラメータ
        - パラメータヒント表示方法の確認(と実行)

キーワード自体は厳密に覚えなくても「だいたいこういう用語だろう」で入力して使う。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/7898392c-4a2a-c1f8-da28-247fd83f5576.png)
GitHubで人気のオープンソースTOP５ - Java編 🌟

12月4日〜11日の間に、GitHubで公開されているオープンソースの中で最もStarが付いたプロジェクトを紹介していきます🌟
今回はJavaを集めました。   

# No.1
#### Qihoo360 / XLearning
![logo.jpg](https://qiita-image-store.s3.amazonaws.com/0/200848/f521b2e6-50e5-3997-e177-6e35a131018d.jpeg)

Hadoop上のAI 
Star:794
https://github.com/Qihoo360/XLearning

# No.2
#### Blankj / awesome-java-leetcode
<img width="832" alt="スクリーンショット 2017-12-10 12.26.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/200848/5f87d130-26c3-3dc4-e3cd-5e97308f2791.png">
👑 Javaソリューションによるアルゴリズム
Star:1,993
https://github.com/Blankj/awesome-java-leetcode



# No.3  
#### uber / NullAway 
<img width="974" alt="image2-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/200848/f56def1d-dfbf-fd8e-984d-8253baaae390.png">

JavaコードのNullPointerExceptions（NPE）を排除するためのツール 
Star:1,124
https://github.com/uber/NullAway


# No.4  
#### iluwatar / java-design-patterns  
<img width="1154" alt="スクリーンショット 2017-12-10 12.41.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/200848/5342534e-2bda-25dc-019e-6d49567baf2a.png">

Javaで実装されたデザインパターン  
Star:27,382  
https://github.com/iluwatar/java-design-patterns
  
# No.5  
#### spring-projects / spring-boot  
<img width="865" alt="スクリーンショット 2017-12-10 12.42.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/200848/11fec255-f532-ab00-776c-0329972e77f2.png">

Spring Boot  
Star:18,521  
https://github.com/spring-projects/spring-boot
Windows10 の npm で -g オプション付きインストールする

## おしらせ（更新分）

2019/01/20 現在、Windows10 の npm を一般ユーザのコマンドプロンプトまたはPowerShellで`-g`インストールしてもエラーは出ません。下記の記事にある対策をする必要はなくなりました。

## あらまし

- Windows10 に npm をインストールしても、`-g` オプション付けたらエラーがでてインストールできないよ。
- わりとみんな困っているのに放置されている or 解決策が Google で引っかけられないよ。
- 解決できたので共有するよ。

## 手続き

1. node.js をインストールする。（本稿では省略）
1. スタートメニュー「Node.js」内の「Node.js command prompt」を右クリック→「その他」内の**「管理者として実行」**を選択する。
1. 開いたコマンドプロンプトで、`npm install -g {パッケージ名}` を実行する。

## 注意

- パッケージ依存関係が解決されていない場合もエラーが出ます。先に`npm update -g`をかけておきましょう。

## さいごに

本投稿では、コメント・編集リクエストをお待ちしております。**迷ったら、アクション起こすほうでお願いします:smile:**
俺はzshからxonshに乗り換えるぞ！ジョジョーーッ！


# zshからxonshに乗り越えるために
基本的にxonshは、source-zshを利用することで、zshの設定をある程度読み込むことができます。
しかし、zshで利用していたzの設定をうまく読み込めなかったので、xonshで書き換えてxonshをメインのshellとして利用することを目指します。

# zについて
過去のディレクトリの移動履歴をカウントするものです。
自分はzとpecoを使って、よく移動するディレクトリを選択し、移動するインターフェースを常時利用しており、これがないままのxonshの利用は快適ではありません。

> zshでzの結果をpecoって爆速でディレクトリ移動する

![z](https://camo.qiitausercontent.com/05d13e9189968ca82665a4995bd040e8669b9dae/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f33333436372f65323666343930652d313033382d323765622d343734332d6438326562656633383239382e676966)

> zは引数なしで実行した時，よく移動するディレクトリ順と，頻度の指標が表示されます

![z](https://camo.qiitausercontent.com/f7ec10f4e7e343b977899ecda6dcc14dfa5c6d9f/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f33333436372f31663864336337662d393137622d613433392d326164382d3966633633656335356230652e706e67)

参考: https://qiita.com/maxmellon/items/23325c22581e9187639e

# zをxonshで読み込んでみる
zの利用は、z.shをshellでsourceすることにより利用できる仕組みになっています。.zshrcでの設定は、下記の感じです。

```zsh:.zshrc
export _Z_CMD=z
. $(brew --prefix)/etc/profile.d/z.sh
```

xonshは外部のshellを読み込む機能があるため、xonshでz.shをsourceしてみましたが、うまく動作しないようです。

```zsh:a.sh
$ source-bash /usr/local/etc/profile.d/z.sh
$ z
xonsh: subprocess mode: command not found: _z
Did you mean one of the following?
    z:   Alias
    xz:  Command (/Users/htaguchi/.pyenv/versions/anaconda3-5.0.1/bin/xz)
    w:   Command (/usr/bin/w)
    [:   Command (/bin/[)
    cd:  Alias
$ _z
xonsh: subprocess mode: command not found: _z
Did you mean one of the following?
    z:   Alias
    xz:  Command (/Users/htaguchi/.pyenv/versions/anaconda3-5.0.1/bin/xz)
    w:   Command (/usr/bin/w)
    [:   Command (/bin/[)
    cd:  Alias
```

何かうまくsourceする方法がありそうですが、.xonshrcにてzと同等の機能を作成した方が、目的をすぐに達成できそうなので、今回はそちらの手法を試みます。


# zの書き換え
zで利用していた機能は、「よく移動するディレクトリ順と，頻度の指標の表示」でした。
そのため、zと同等の機能を得るために


1. ディレクトリ移動のタイミングで、カレントディレクトリのパスのログを落とす
2. カレントディレクトリのパスのログから、頻度順にパスを並び替える

の順番で実装を行っていこうと思います。

## 実装
xonshのチュートリアルを確認すると、関数に@events.on_chdirのデコレータを利用するだけで、ディレクトリ移動をフックできるようなので、これを利用します

参考: http://xon.sh/tutorial_events.html
    
```py3:.xonsh
from collections import Counter
from prompt_toolkit.keys import Keys

$DIR_HIST_PATH = "/Users/htaguchi/.dirhist"

"""
1. ディレクトリの移動タイミングで、カレントディレクトリのパスをファイルに保存
"""
@events.on_chdir
def add_to_file(olddir, newdir, **kw):
    with open($DIR_HIST_PATH[0], 'a') as dh:
        print(newdir, file=dh)

"""
2. パスの出現頻度を算出し、降順に並べる
"""
def z():
    lines = open($DIR_HIST_PATH[0]).read().rstrip("\n").split("\n")
    return("\n".join([p for p, c in Counter(lines).most_common()]))

"""
3. CTRL-F + CTRL-R のキーで関数を呼び出し
"""
@events.on_ptk_create
def custom_keybindings(bindings, **kw):
    handler = bindings.registry.add_binding

    @handler(Keys.ControlF, Keys.ControlR)
    def _z(event):
        selected = $(echo @(z()) | peco)
        cd_cmd = "cd " + selected.strip()
        event.current_buffer.insert_text(cd_cmd)
```

# まとめ
zの設定を乗り越えたので、これでxonshをメインのshellとして利用できそうです。
Pythonの資産を利用したshellの拡張がすぐできるのは、とても良いですね。
iOSのUIWebViewでYouTubeの動画をインライン再生する


## allowsInlineMediaPlaybackをTrueにする

`webView.allowsInlineMediaPlayback = true`

## ドキュメント
[allowsInlineMediaPlayback
] (https://developer.apple.com/documentation/uikit/uiwebview/1617960-allowsinlinemediaplayback)
GitPitchの使い方メモ

# GitPitchとは

Githubを利用してかんたんに、いい感じにスライドを作成することができるサービス

https://gitpitch.com/

# 使い方
リポジトリのルート直下に `PITCHME.md` というファイルを作成してそいつを編集するだけ。
あとはGithubにプッシュして `https://gitpitch.com/user/repo` を開くだけ。
 
細かい使い方は
https://github.com/gitpitch/gitpitch/wiki/
に書いてあるが、そこから少し抜粋。

## ディレクトリを分けたい

`---?include=<directory>/<filename>` 
をPITCHME.mdに記載すると別ディレクトリのMarkdownを取り込むことができる。

## そのディレクトリの中のものだけ表示したい

ブラウザで `https://gitpitch.com/<username>/<repo>?p=<directory>` みたいな感じに開けばOK
とするとそのディレクトリ内のPITCHME.mdだけを表示することができる。

# サンプル
https://gitpitch.com/FScoward/how-to-use-gitpitch
cesiumでmapserverを使う。

#概要
cesiumでmapserverを使ってみた。
mapserverは、山形県しかない。
タイルの指定が違うので、UrlTemplateImageryProviderでcustomTagsを使った。

#写真

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/995d4ecb-381e-6d23-8eff-ff60df89e542.png)

#サンプルコード

```
function fromPointToLatLng(x, y, z) {
    var max_zoom = Math.pow(2, z);
	var size = (1 << max_zoom) * 256;
    var lx = (x * 256 + 128) / max_zoom;
    var ly = (y * 256 + 128) / max_zoom;
	var	lat = (2 * Math.atan(Math.exp((ly - size / 2) / -(size / (2 * Math.PI)))) - (Math.PI / 2)) * (180 / Math.PI);
	var	lng = (lx - size / 2) * (360 / size);
    return {lat, lng};
}
var widget = new Cesium.CesiumWidget('cesiumContainer', {
    imageryProvider: new Cesium.UrlTemplateImageryProvider({
        url: "http://yumeblog.dip.jp/yb2g0.php?zoom={z}&long={lon}&lat={lat}",
        customTags: {
            lat: function(imageryProvider, x, y, level) {
                var ll = fromPointToLatLng(x, y, level);
                return ll.lat;
            },
            lon: function(imageryProvider, x, y, level) {
                var ll = fromPointToLatLng(x, y, level);
                return ll.lng;
            }
        }
    })
});
widget.camera.flyTo({
    destination: Cesium.Cartesian3.fromDegrees(140.0 + 0.4, 38.0 - 0.1, 20000.0),
    orientation: {
        heading: Cesium.Math.toRadians(-10.0),
        pitch: Cesium.Math.toRadians(-15.0),
        roll: 0.0
    }
});

```

#成果物
http://jsdo.it/ohisama1/qIAa

以上。
WindowsのIPアドレスを振り直す

* Windows7
  * 自動割り当て
* VirtualBox上のUbuntu
  * /etc/network/interfacesの設定で静的割り当て

Ubuntuで使うことにしているアドレスが運悪くWindowsにすでに振られているという状態が発生した。
Windows側にはなんでもいいからアドレス変わってもらうことにする。
コマンドプロンプトで以下のコマンドを入力。

```
> ipconfig /release
> ipconfig /renew
```
TensorFlow公式分類チュートリアルMNISTサンプルのネットワーク構造

こちらは[TensorFlow Advent Calendar 2017](https://qiita.com/advent-calendar/2017/tensorflow)の9日目の記事です。

---

最近、画像の分類方法に関して色々と調べています。

MNISTをはじめ沢山の分類処理サンプルがありますが、どれを使用したらいいかわからないということで、公開されているサンプルの構造をまとめようと思っていたのですが、結局時間切れとなり、一番初歩的なTensorFlowの公式チュートリアルの構造について書きました。

これだけだと何番煎じかわからないですね。今後AlexNetやGoogLeNet等の有名なモデルもまとめていきたいと考えています。

## 初心者向けMNIST分類サンプル

数字の認識なのでクラスの数は10、画像は28x28の1チャンネルです。

https://www.tensorflow.org/get_started/mnist/beginners

Softmaxの手法を学ぶための、非常に単純な構造のネットワークです。28 x 28の画像（784画素）それぞれの重みづけを調整することで、10種類（0~9）の分類を行う、という方法です。出力層のみという単純ですが、これだけのpythonコードで最適化が実現できるのは面白いです。


### エキスパート向けMNIST分類サンプル
https://www.tensorflow.org/get_started/mnist/pros

こちらは多少"ディープ"な構造を持つネットワークです。
* 畳みこみ層 1
* プーリング層 1
* 畳みこみ層 2
* プーリング層 2
* 全結合層 
* 出力層

以下、畳みこみ層とプーリング層はセットで"隠れ層"と呼んで1カウントとします。

TensorBoardで構造を可視化しました。便利ですね。

![2017-12-10 11.55.12.jpg](https://qiita-image-store.s3.amazonaws.com/0/77793/ae79f7e0-dba7-9430-ab63-9f020c55c941.jpeg)


## まとめ

ごめんなさい。これだけです。
学術的なものと産業利用とで興味の方向が違うためか、ネット上の情報をそのまま実運用に持って行くにはまだハードルが高いですね。学会や研究機関の発表ではネットワーク構造に関する提案が多い中、実際やってみるとより細かいパラメータ（ストライドやパディング、データセットの精度、前処理など）を変えるだけで数%程度はすぐに改善（改悪）したりします。しかもネットワークが巨大になるとそれだけ学習処理時間も増えます。結局のところ適用対象に合わせてのモデル選定、泥臭いパラメータチューニングが必要になるのでしょう。


## Reference

* MNIST For ML Beginners  |  TensorFlow : https://www.tensorflow.org/get_started/mnist/beginners
* Deep MNIST for Experts  |  TensorFlow : https://www.tensorflow.org/get_started/mnist/pros
* TensorFlow 畳み込みニューラルネットワークで手書き認識率99.2%の分類器を構築 - Qiita : https://qiita.com/haminiku/items/36982ae65a770565458d
* 定番のConvolutional Neural Networkをゼロから理解する - DeepAge : https://deepage.net/deep_learning/2016/11/07/convolutional_neural_network.html
* あらゆるデータを可視化するTensorBoard徹底入門 - DeepAge : https://deepage.net/tensorflow/2017/04/25/tensorboard.html
業務効率化の第一歩！時間管理ツールで業務時間の見える化！

[Ateam Hikkoshi Samurai Inc. Advent Calendar 2017](https://qiita.com/advent-calendar/2017/hikkoshi)　10日目です。
本日は[エイチーム引越し侍](http://hikkoshi.a-tm.co.jp/)のWebエンジニアの@umesourが担当します。

# はじめに
みなさん業務の効率化には何かしら取り組まれているかと思いますが、
各業務に自分がどのくらい時間を使っているか把握されていますか？
私は今年は[Toggl](https://www.toggl.com/)という無料ツールでの
業務時間の見える化を進めたのでご紹介したいと思います。

# 導入の経緯
入社して１年以上たち、チケットの開発以外もやらせていただくことや、
いろんな問い合わせをいただくことも増え、
「あれ、今日なんでこんなに開発が進まなかっんだっけ・・・？」
と感じる日が多くなってきました。
それまで私はメモでそれぞれのチケットにどのくらいの時間がかかったかを
ざっくりとした時間しており、
きちんと細かな時間が記録できるツールはないかなーと思っていました。

すると、社内でお子さんがいらっしゃる方が時短勤務の中、時間管理を徹底するために
このツールを使っていると知り、自分も始めてみることにしました。

#Togglの使い方
##入力画面
![www.toggl.com_app_timer (2).png](https://qiita-image-store.s3.amazonaws.com/0/93882/a6e33334-0934-b93d-ef34-5076d5e91f4d.png)
Togglの記録画面はこのようになっています。
一番上の欄にこれから行うことを入力し、右上のスタートボタンを押し、終わったら停止ボタンを押すだけ。
ボタンの押し忘れも多々有りますが、この開始時間・終了時間はあとから編集できるため、
私は何かやったあとに開始時間もまとめて入力してしまうことも多いです。

また、一度入力した作業をもう一度始める場合は、
再度入力しなくても、開始ボタンを押すだけで再開できます。

プロジェクトというものが設定でき（上の画像で言うと「開発」「ミーティング」と書いてる部分）
業務の分類ができます。

chromeの拡張もあるよ（[こちら](https://chrome.google.com/webstore/detail/toggl-button-productivity/oejgccbfbmkkpaidnkphaiaecficdnfn)）

##レポート画面
![www.toggl.com_app_reports_summary_2247956_period_thisWeek.png](https://qiita-image-store.s3.amazonaws.com/0/93882/e535c7ed-31b3-ed51-332e-72735ccc0420.png)
レポート画面では任意の期間の総作業時間と、
プロジェクト別の時間がわかりやすくグラフ化されています。
この画面を見るのが結構楽しかったりします。

#使ってみて
メリットに感じたのは下記の通りです。

- 何にどのくらい時間がかかってるのかがわかるようになる
- 今後の工数見積に活かしやすい
- 想定より時間が取られているものに対しての対策がとれる

デメリットは

- 慣れるまでめんどくさい
に尽きるかと思います。

#続けるためのコツ
他にも使い始めた方もいたのですが、続けられなかったという方もいらっしゃいました。
日記も家計簿も続かない、基本的には三日坊主の私が続けられたコツは以下のこと意識したからかなと思っています。
### 「はじめからすべて完璧に記録しようとしない」
使い始めは、時間を知りたいと思うものに絞って記録していきます。
忘れても気にしない。
あとから大体の時間を入力するのもありです。
そうやって始めて何日かすると、
repot画面を見るのが楽しくなってくるはず！
もっと細かく正確な時間を知りたいと思うようになり、
だんだん癖がついてきたら、細かい数分の単位の作業でもつけられるようになってくると思います。

#まとめ
業務の効率化を行うためには、まず何に時間を使っているのか正確に知ることからだと思います。
よろしければみなさんも使ってみてください。

#最後に
[Ateam Hikkoshi Samurai Inc. Advent Calendar 2017](https://qiita.com/advent-calendar/2017/hikkoshi)　10日目いかがでしたでしょうか。
明日は[エイチーム引越し侍](http://hikkoshi.a-tm.co.jp/)の@zwirkyが Dockerで作る最強の開発環境の作成に関する記事を書いてくれます。

# 追伸
株式会社エイチーム引越し侍では、一緒にサイト改善をしてくれるWebエンジニアを募集しています。エイチームグループのエンジニアとして働きたい！という方は是非、以下のリンクから応募してください。
皆様からのご応募、お待ちしております！！

> [エイチームグループ採用サイト（Web開発エンジニア職）](http://hikkoshi.a-tm.co.jp/recruit/request.php?ea=umesourqiita_12a56c1120b45341fd79)
LiveScript版FizzBuzz

ES2015 が登場して以降どうしても出番が減ってきている…という以前からそもそもマイナー感がある
 [LiveScript](http://livescript.net/) です。
自分も最近あまり書いていませんでしたのでなんだかちょっと新鮮です。

まずはシンプルに書いてみます。

```livescript
is-multiple-of = (n, m) -> n % m is 0
fizzbuzz = ->
  | it `is-multiple-of` 15 => \FizzBuzz
  | it `is-multiple-of` 3  => \Fizz
  | it `is-multiple-of` 5  => \Buzz
  | _                      => it + ''

[1 to 100]
  |> map fizzbuzz
  |> each console~log
```

次は [ES6でFizzBuzz](https://qiita.com/nassyemon/items/b84eb52a3a877884ed0a) のやり方を参考してやってみます。

```livescript
bind = (f, g) -> (n) -> f(n) ? g(n)
is-multiple-of = (n, m) -> n % m is 0

fizzbuzz = -> if it `is-multiple-of` 15 => \FizzBuzz
fizz     = -> if it `is-multiple-of` 3  => \Fizz
buzz     = -> if it `is-multiple-of` 5  => \Buzz
num      = (+ '')

[1 to 100]
  |> map (fold1 bind, [fizzbuzz, fizz, buzz, num])
  |> each console~log
```

最後はちょっと長いけど今の自分に思いつく範囲でワンライナー。

```livescript
[1 to 100]|>map((n)->(find (->it.0 n),[[(%15)>>(is 0),\Fizzbuzz] [(%3)>>(is 0),\Fizz] [(%5)>>(is 0),\Buzz]])?1 or n+'')|>each console~log
```

以上です。

FizzBuzz もたまに書くと楽しいですね。
Windows10にNorton Internet Securityが入っているとMacOSからリモートデスクトップ接続しなかった件

# 問題
久しぶりにMacOSからWindows10にリモートデスクトップ接続したら、以前は繋がっていた設定では接続しなくなりました。
最初に考えたのはIPアドレスが変わってしまったことです。PC名ではなくIPアドレス接続に設定していたからです。これは固定にしてることを確認しました。
Windows側のFirewall、リモートデスクトップ設定も確認。
最後に疑ったのが「Norton Internet Security」でした。

Windows 10 Pro 64bit バージョン：1709 ビルド：16299.64
Norton Internet Securityは、2017/12/10時点での最新版です。

# Norton Internet Securityの設定を確認

右上の「設定」をクリックして

![1.png](https://qiita-image-store.s3.amazonaws.com/0/37634/c114b22c-a5c9-020f-12c1-8f7e56cd7cdf.png)

「ファイアウォール」を選びます。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/37634/6e4fc0bd-332b-b3f7-df69-98c38405ce4e.png)

さらに「パブリックネットワークの例外」を選びます。
この時「パブリック」に引っかかったのですが、この時はスルーしました。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/37634/ec9e9db4-f0ad-d9ee-40e2-ce5919ec4868.png)

従来であれば下記のように「リモートデスクトップ接続」を例外にすればOKでした。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/37634/ab218c30-14cf-732b-7e88-a341072d9535.png)

# 原因

おそらく「ネットワークの信頼」が切り替わったせいではないかと思います。自分で設定を変えた記憶が全く無いので、ひょっとしたら「Norton Internet Security」のアップデートで勝手に切り替わってしまった可能性もあります。

結果としてネットワーク内でPCを発見することができなくなっていたようです。

# 対策

２つの方法がありまそうです。

## プライベートネットワークにする

１つ目はパブリックネットワークを、プライベートネットワークに切り替えることです。

「設定」画面で「ネットワークの信頼」を選択します。すると下記のような画面が現れるのでこれを
「パブリック」を「プライベート」に変更します。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/37634/7704f8cd-8da8-5aa0-8d59-43f90f847e39.png)

![6.png](https://qiita-image-store.s3.amazonaws.com/0/37634/676dcc7d-a14f-2bd9-6b12-ee2cb3197b11.png)

## 「ネットワークの発見」を有効化する

２つ目は、「パブリック」のまま「パブリックネットワークの例外」で「ネットワークの発見」を選択することです。

![スクリーンショット 2017-12-10 11.05.24.png](https://qiita-image-store.s3.amazonaws.com/0/37634/5f306b71-64aa-e3cb-2492-0c2deeeab8d3.png)

これによってセキュリティレベルを「パブリック」に保ったままリモートデスクトップ接続が可能になりました。個人的にはこちらの方がおすすめじゃないかと思います。

休みの日を数時間費やしてしまったので、他に困っている人がいるかもしれないと思い投稿してみました。。。
Chrome拡張機能開発 覚書

#一から開発してみる場合
作業用のフォルダを作って次のファイルを置いて、拡張機能のページでデベロッパーモードにして、パッケージ化されていない拡張機能を読み込む...]で読込ます事で、自分用の拡張機能の開発をスタートする

```json:manifest.json
{
    "manifest_version": 2,
    "name": "Hoge",
    "version": "0.0.0.1"
}
```
[Google Chrome 拡張機能の開発 - 8 - (2017年12月)1年ぶりなのでもう一度はじめの一歩 - Qiita](https://qiita.com/rrryutaro/items/e6b98a0354d67c481a93)
</div>

#既にあるものをいじってみる場合
以下のパスからいじってみたい拡張機能を作業用のフォルダにコピーして、拡張機能のページでデベロッパーモードにして、パッケージ化されていない拡張機能を読み込む...]で読込ます。

```
%UserProfile%\AppData\Local\Google\Chrome\User Data\Default\Extensions
```
</div>

#アクションを追加する
次を追加してリロード後、アイコンをクリックすると"ほげ"が表示される。

```json:manifest.json
    "browser_action": {
        "default_popup": "hoge.html"
    }
```

```html:hoge.html
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>ほげ</title>
<style></style>
</head>
<body>
<p>ほげ</p>
</body>
</html>
```
</div>

#バックグラウンド処理を追加する
次を追加してしてリロードすると、アラートで"ほげ"が表示される。

```json:manifest.json
   "background": {
      "page": "bk.html"
   }
```

```html:bk.html
<!doctype html>
<html>
<head>
<title>ほげ</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<script src="bk.js"></script>
</head>
<body>
</body>
</html>
```

```javascript:bk.js
alert("ほげ");
```
</div>

#コンテキストメニューを追加する
次を追加・修正してリロード後、右クリックするとメニューに"ほげ"が表示される。
拡張機能の管理ページで[ビューを検証:]の欄にある"bk.html"のリンクをクリックすると、デベロッパーツールが表示される。
コンテキストメニューの"ほげ"をクリックすれば、コンソールに"ほげ"が表示される。

```json:manifest.json
   "permissions": [ "contextMenus" ]
```

```javascript:bk.js
chrome.contextMenus.create({title: "ほげ", id: "Hoge", contexts: ["all"], onclick: info=>{
	console.log("ほげ");
}});
```
</div>

#コンテキストメニューの階層化
`bk.js`を次のように修正。コンテキストメニューが[ほげ1].[ほげ2].[ほげ3]となる。

```javascript:bk.js
chrome.contextMenus.create({title: "ほげ1", id: "Hoge1", contexts: ["all"]});

chrome.contextMenus.create({title: "ほげ2", id: "Hoge2", parentId: "Hoge1", contexts: ["all"]});

chrome.contextMenus.create({title: "ほげ3", id: "Hoge3", parentId: "Hoge2", contexts: ["all"], onclick: info=>{
	console.log("ほげ");
}});
```
</div>

#表示中のページにスクリプトを埋め込む
次を追加してしてリロード後、任意のページを開くか再読込するとコンソールにタイトルが出力される。

```json:manifest.json
	"content_scripts": [
		{
			"matches": [ "<all_urls>" ],
			"js" : [ "cs.js" ],
			"run_at": "document_end",
			"all_frames": true
		}
	]
```
<details><summary>パラメーターについて</summary><div>

|パラメーター|必須有無|説明|
|:--|:-:|:--|
|matches|必須|パターンを使って一致するURLでコンテンツスクリプトを有効にする。<br>設定例:<br>`"matches": [ "<all_urls>" ]`|
|js|必須|cssかjsどちらかが必須。<br>埋め込むスクリプトファイルを指定する<br>設定例:<br>`"js": [ "jquery-3.1.1.min.js", "contentscripts.js" ]`|
|run_at|任意|コンテンツスクリプトを実行するタイミングを指定する。<br>とりあえず、DOM要素を読み込んだ後の`document_end`を指定することにしておく。<br>設定例:<br>`"run_at": "document_end"`|
|all_frames|任意|対象をフレーム全てとするかの指定。<br>設定例:<br>`"all_frames": true`|

【参考にした情報】

- [Chrome機能拡張のコンテンツスクリプトについて | OXY NOTES](http://oxynotes.com/?p=8960)
</div></details>

```javascript:cs.js
window.onload = ()=>{
	console.log(document.title);
};
```

#公開方法
[Chrome Extension を作って公開する - Qiita](https://qiita.com/sqrtxx/items/19fd2114430e9e1fb57f)

既に公開していれば
[デベロッパー ダッシュボード - Chrome ウェブストア](https://chrome.google.com/webstore/developer/dashboard)
【Raspberry Pi 3】ファイル共有（Mac編）

#MacからRasberry Piのファイルにアクセスする手順

・RPにNetatalkインストール
（Apple Filing Protocol対応）

　sudo apt-get install netatalk

・Mac設定
　Finderメニュ
　　「移動」 -> 「サーバへ接続…」選択

　afp://（RPのプライベートIPアドレス）を入力して接続

　名前とパスワード（デフォルトはpiとraspberry）を入力して接続

Finderにディスクがマウントされます。
Zipファイルの中身を書き換える

zipファイルに含まれているテキストファイルの一部を書き換える必要があったので、プログラムを作成してみた。

C#のサンプルプログラム

```c#
using System.IO;
using System.IO.Compression;
using System.Text;

class MyZipFile
{
    public static void Run()
    {
        string path = "Test.zip";
        string name = "Test.txt";
        using (ZipArchive a = ZipFile.Open(path, ZipArchiveMode.Update))
        {
            ZipArchiveEntry e = a.GetEntry(name);
            if (e == null)
            {
                Console.WriteLine("file not found, {0}", name);
                return;
            }
            StreamReader sr = new StreamReader(e.Open(), Encoding.GetEncoding("shift_jis"));
            string s0 = sr.ReadToEnd();
            sr.Dispose();

            string s1 = s0.Replace("Japanese", "English");

            StreamWriter sw = new StreamWriter(e.Open(), Encoding.GetEncoding("shift_jis"));
            sw.Write(s1);
            sw.Dispose();
        }
    }
}
```

PowerShellのサンプルプログラム

```powershell
Add-Type -AssemblyName System.IO.Compression.FileSystem

using namespace System.IO; using namespace System.Text; using namespace System.IO.Compression

Class MyZipFile
{
    static [int] Run($path, $name)
    {
        if(!(Test-Path $path)) {
            Write-Host "zip file not found, $path"
            return 1
        }
        $a = [ZipFile]::Open($path, "Update")
        $e = $a.GetEntry($name)
        if($e -eq $null) {
            Write-Host "file not found, $name"
            $a.Dispose()
            return 1
        }

        $sr = New-Object StreamReader($e.Open(), [Encoding]::GetEncoding("shift_jis"))
        $s0 = $sr.ReadToEnd()
        $sr.Dispose()

        $s1 = $s0.Replace("Japanese", "English")

        $sw = New-Object StreamWriter($e.Open(), [Encoding]::GetEncoding("shift_jis"))
        $sw.Write($s1)
        $sw.Dispose()

        $a.Dispose()
        return 0
    }
}

$path = "Test.zip"
$name = "Test.txt"

$r = [MyZipFile]::Run($path, $name)
```

`using namespace`を一行に記述しないと何故か最終行のみ有効となる。不具合かも。
OSはWindows 10 Home 64-bit。

```
PS C:\tools> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.15063.729
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.15063.729
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
```
Docker Composeのインストール (Getting Startedの手順)


docker-composeをインストールして動かしてみる。

手順は公式サイトのインストール手順とGetting Startedに従う。
https://docs.docker.com/compose/install/
https://docs.docker.com/compose/gettingstarted/


# 環境
"Ubuntu"
VERSION="14.04.5 LTS, Trusty Tahr"

# インストール

```bash
$ sudo curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
docker-compose version 1.17.1, build 6d101fb
```
docker-composeのバージョンは、下記からLatest Releaseのものを使用する。
https://github.com/docker/compose/tags


# docker-composeを動かす

流れとしては、

1. コンテナ内で動くpythonアプリを作成する (app.py)
1. Docker build時に必要なpythonモジュールを列挙したファイルを作成しておく (requirements.txt)
1. Flaskアプリをコンテナ内に読み込んで実行するDockerfileを作成する
    1. pythonイメージをベースにする
    1. build時Dockerfileと同一ディレクトリを /code として追加する
    1. ワークディレクトリを /codeにする
    1. ビルド時に取り込んだrequirements.txtに列挙されたモジュールをpip installする
    2. ビルド時に取り込んだapp.pyを実行する
1. docker-compose.ymlを作成する
    2. webとredisのサービスを作成する
    3. webサービスはDockerfileのビルドをポートマッピングを5000:5000として行う
    4. redisサービスは、redisのイメージを使用する
1. docker-composeを実行する 

## セットアップを行う

### プロジェクトディレクトリを作成する

```bash
$ mkdir composetest
$ cd composetest/
```

### docker起動後に動かすアプリを作成する

#### app.pyをプロジェクトディレクトリのルートに作成する

```python
from flask import Flask
from redis import Redis

app = Flask(__name__)
redis = Redis(host='redis', port=6379)

@app.route('/')
def hello():
    count = redis.incr('hits')
    return 'Hello World! I have been seen {} times.\n'.format(count)

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)
```

### requirements.txt を作成する

Dockerfileのビルド時にpip installするモジュールを列挙しておく

```
flask
redis
```

## Dockerfileの作成

```docker
FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
```

## docker-compose.ymlを作成する

```yaml
version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"
```

## Composeを使って、ビルドしてアプリを動かす

```bash
$ docker-compose up
```

## ホストから接続確認

```bash
$ curl http://localhost:5000/
```
Python2.x ゆるふわ環境構築 for Windows

Macだと普通はターミナルからpythonと唱えると入っているバージョンが実行されて便利なんですが、Windowsはインストールからしないといけないらしい。

BootCampでMacにWindows10を入れたので環境設定していきます。
この手の記事はたくさんあるので需要ないけど。

参考にさせていただいたサイト
https://www.pythonweb.jp

１．公式からインストーラをダウンロードする
コマンドプロンプトで簡単にやる方法に慣れたい(願望)

２．ディレクトリを指定しインストール
今回はCドライブの下にpgというフォルダーを作成して、その中にインストール。

３．コマンドプロンプトでカレントディレクトリに移動

自分の場合はBootCampなので下記になってる。
<img width="322" alt="003.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/216857/ab3db7fb-391b-9591-ab6b-cd609d74ea43.png">

CD ../../pgと実行
（カレントディレクトリで上の上の階層のpgフォルダに移動）

C:¥pg> 
となればOK

４．pythonと入力し実行
<img width="586" alt="004.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/216857/7b0365ec-1a89-c432-496d-90a0abe3e43a.png">

とりあえずOK

>>>print "HELLO WORLD"
HELLO WORLD

セミコロン要らないんだっけ確か。

環境変数の指定はシステムのプロパティから一番下の２つを指定しときました。意味わかってない。

<img width="370" alt="005.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/216857/11d5e078-48c0-23a4-c849-724759d8aa13.png">


つづく