OmniAICreator/Qiita-1.07M huggingface dataset:
Daydream開発入門 その3(Unityエディタ上でシミュレート)

今回はUnityエディタ上でもシュミレート出来るようにします。
[前回](https://qiita.com/beaa/items/05b78a60929e2105dbe3)よりも簡易実行出来るため、こちらも設定しておくと開発スピードアップ間違いなしです！
(その2とその3の記事順番間違えた気がします...)

## 前提
記事 [その1](https://qiita.com/beaa/items/5cb55fd0473acde134a1) と [その2](https://qiita.com/beaa/items/05b78a60929e2105dbe3) で使用したプロジェクトを引き続き使っています

## ヘッドトラッキングをシュミレート
`GvrEditorEmulator`プレハブを追加するだけでOKです。
![スクリーンショット 2017-10-22 23.08.02.png](https://qiita-image-store.s3.amazonaws.com/0/112492/62e31f57-d7f8-9441-facc-09f0053caf6c.png)

操作方法は以下となります

- Alt + マウス移動 = 頭の回転
- Ctr + マウス移動 = 首の傾き

エディタのRunを押して実際に動かし確認してみましょう
![daydream-editor-emu.gif](https://qiita-image-store.s3.amazonaws.com/0/112492/9febe49c-0984-ae3f-c99d-13e2638d0b8a.gif)

## コントローラー操作をシュミレート
1. `GvrControllerMain`プレハブを追加
2. `GvrEventSystem`プレハブ追加
3. 空のオブジェクトを作成(名前はなんでも良いのですが、ここではPlayerにしておきます)
4. Playerオブジェクトの中に`Main Camera`を移動
5. `Main Camera`に`GvrPointerPhysicsRaycaster`スクリプトをアタッチ
![スクリーンショット 2017-10-22 23.32.15.png](https://qiita-image-store.s3.amazonaws.com/0/112492/4060b962-9ef3-5a55-0f5c-2175367c7ee1.png)

6. Playerオブジェクトの中に`GvrControllerPointer`を追加

Hierarchyが以下のようになっていればOKです
![スクリーンショット 2017-10-22 23.33.58.png](https://qiita-image-store.s3.amazonaws.com/0/112492/fab53b12-9f2a-04be-5da9-e5e3c0456857.png)

操作方法は以下となります

- Shift + マウス移動 = 手の動き
- Shift + 左クリック = ClickButton
- Shift + 右クリック = AppButton
- Shift + 中央クリック = HomeButton/Recenter

エディタのRunを押して実際に動かし確認してみましょう
![daydream-editor-controller-emu.gif](https://qiita-image-store.s3.amazonaws.com/0/112492/ff30c118-d28e-9a2b-22bc-7cd63e7cab6e.gif)
白い点が **Shift + マウス移動** の動きとなります
クリック系のイベントは実装していないため、今回は確認しておりません
(ちなみに...わかりやすさのためCubeの色を変更しています)

## 最後に
このシュミレートとInstant Previewを合わせて使えば、かなり効率的に開発出来るはずです！
次こそは簡単なゲームを作ってみます

間違っている箇所などありましたら指摘していただけると嬉しいです！
AnacondaとPythonの環境設定


これをdownlowadしてきて、install

```
Anaconda3-5.0.0-MacOSX-x86_64.pkg
```

zshを使っている人は注意が必要

```~/.bash_profile
export PATH="/Users/joji/anaconda3/bin:$PATH"
```

上記の内容をzshに書く

```~/.zshrc
export PATH="/Users/joji/anaconda3/bin:$PATH"
```

```~/.zshrc
source ~/.zshrc
```

Anacondaを軌道させる

Environments → Create → dialogが表示される。

![スクリーンショット 2017-10-22 23.44.15.png](https://qiita-image-store.s3.amazonaws.com/0/39073/4434ab25-2b06-6a48-1a0f-d083e59b4bd1.png "スクリーンショット 2017-10-22 23.44.15.png")

名前と使いたいpythonのversionを指定する。
今回はpython3.6とpython2.7を作成しました。
コンソールから確認

```bash
conda info -e
```

![スクリーンショット 2017-10-22 23.47.08.png](https://qiita-image-store.s3.amazonaws.com/0/39073/e3bc39f8-7712-78cb-2b10-d932dc72d590.png "スクリーンショット 2017-10-22 23.47.08.png")

####python2.7を使えることを確認

```bash
source activate python27
```

```bash
python --version
```

```shell-session
Python 2.7.14 :: Anaconda, Inc.
```

####python3.6を使えることを確認

```bash
source activate python36
```

```bash
python --version
```

```shell-session
Python 3.6.3 :: Anaconda, Inc.
```
あなたまだAlpineを使ってるんですか?

Dockerのimageを作るときにAlpineを使ってイメージサイズを小さくしてるよ！
なんて記事をたくさん見かけますが、チャンチャラおかしいですね。

まず下の実行結果を見てください。

```
ubuntu@instance-1:~$ docker run -t --rm hello:alpine /hello
hello, world
ubuntu@instance-1:~$ docker run -t --rm hello:scratch /hello
hello, world
```

`hello:alpine`、`hello:scratch` ともに`/hello`が同じように動いてますね?
名前から分かる通り`hello:alpine`はAlpineをベースにして作成したイメージです。
では、Imageのサイズを比較してみましょう。

```
ubuntu@instance-1:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello               scratch             0b6f9da6ef84        10 hours ago        3.12MB
hello               alpine              b8765dbaee21        3 minutes ago       7.08MB
```

`hello:alpine`のサイズは **倍以上** ですよ先生。
Alpineは **重い** ですねぇ...

さて、じゃあ`hello:scratch`はどう作っているのか。
の前に`hello:alpine`の作り方を見てみましょう。

```Dockerfile
FROM alpine:latest
MAINTAINER Yuuichi Fujioka

ADD hello hello

CMD ["/hello"]
```

普通に Alpineのイメージに`hello`を追加しているだけですね。よく見るやつです。

次に`hello:scratch`の作り方です。


```Dockerfile
FROM scratch
MAINTAINER Yuuichi Fujioka

ADD hello hello

CMD ["/hello"]
```

`hello:alpine`との差はベースイメージのみで、こちらは`scratch` を元にして作っているのです。
`scratch`には何も入っていないので、単純に`hello`の分しか容量を食わないのです。

なぜ`hello`しか入っていないイメージが動くのか?
それは実に単純な話で、`hello`がただの一つも外部ライブラリに依存していない、このファイル単一で実行可能なファイルだからなのです。

```
ubuntu@instance-1:~$ ldd hello
	not a dynamic executable
```

わかりましたか？Alpineなんてなくても動くイメージは作れるのです。
**あなたはまだAlpineを使ってるんですか？**

*備考1:*

このイメージの作り方だと起動中のコンテナの中でデバッグ等はできません。だってshも入ってないんですもの。
コンテナの中に入ってなんやかんやしたければAlpineなり何なりを使えば良いです。

*備考2:*

scratchイメージの詳しい説明はdocker storeのscratchのページやdocker-libratyのリポジトリにあります。

https://store.docker.com/images/scratch?tab=description

https://github.com/docker-library/docs/tree/master/scratch/

*備考3:*

どうでもいいですが、今回使った`hello`はGo言語で作ったものです。
https://github.com/yuuichi-fujioka/hello-world

シングルバイナリで動的ライブラリを使わない実行形式のファイルが簡単にできていいですね、Go。
Macの画面をスクリーンロックする方法

# はじめに
最近Macを使うことが多くなり、Windowsを使っていた時にはなかったキーボードのアイコンに戸惑っています。
しかもCapitanとSierraでスクリーンロック方法が違うので困りました。
この記事はMacでよく使うアイコン一覧とスリクーンロックの方法のメモ書きです。

## アイコン一覧

|アイコン|読み方|
|:---:|---|
|⌘|command|
|⇧|shift|
|⌥|option|
|⌃|control|
|⌫|delete|
|![100px-IEC5009_Standby_Symbol.svg.png](https://qiita-image-store.s3.amazonaws.com/0/61261/f27fe748-9b7a-f1fe-4ec8-6ff6e89bc7a7.png)|電源ボタン|
|⏏|メディア取り出しキー|
|⇪|caps lock|
|⎋|escape/esc|
|⌫|delete|

## ショートカットキーでスリープ

### ディスプレイだけスリープ

- control + Shift + ⏏(メディア取り出しキー)
- control + Shift + 電源ボタン

### 通常のスリープ

- command + option + ⏏(メディア取り出しキー)
- command + option + 電源ボタン

## キーチェーンアクセスでスリープ
1. アプリケーション > ユーティリティ > キーチェーンアクセス
2. キーチェーンアクセス > 環境設定
3. メニューバーにキーチェーンの状況を表示にチェックを入れる
4. 好きな時にメニューバーの南京錠（鍵）アイコンから「スクリーンをロック」

## ホットコーナーでスクリーンセーバを起動
手順3はお好みで「スクリーンセーバを開始する」を選んでも良い

1. システム環境変数 > デスクトップとスクリーンセーバ
2. 右下のホットコーナーをクリック
3. 好きなコーナーに「ディスプレイをスリープさせる」を設定
4. 好きな時にカーソルをコーナーに移動するとスリープする

## タッチバーでスクリーンロック
1. システム環境変数 > キーボード
2. コントロールストリップをカスタマイズ
3. ドラッグ・アンド・ドロップでカスタマイズ
Headless Chrome と Chromyを扱う Dockerfile

```Dockerfile:Dockerfile
FROM ubuntu:16.04

RUN apt-get update && apt-get install -y\
    wget\
    libappindicator1\
    nodejs\
    npm

# Chrome
RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb  # Chrome DL
RUN dpkg -i google-chrome-stable_current_amd64.deb; exit 0  # インストール試行、依存関係でエラーを吐くので一旦無視
RUN apt-get -fy install  # 依存関係を修復してインストール

# NodeJS
RUN npm cache clean
RUN npm install n -g  # nをインストール
RUN n stable  # stableのバージョンをインストール
RUN ln -sf /usr/local/bin/node /usr/bin/node  # node で呼べるようにする
RUN apt-get purge -y nodejs npm  # aptでインストールしていた古いNodeを削除
RUN npm install chromy
```

詰まったポイント

- Chromeインストールでエラー: exit 0で一旦そのまま進めて、再度修復してインストール
- NodeJSのバージョンが古くchromyが使えない: nでインストールし直し
プログラム生存確認のLチカ、ボタン一発でshutdownで、LCDなしでも簡単IoT化

# Overview

Raspberry Piで、自前IoTを作っていると、Linuxが故に、ちゃんとshutdownしたいが、SSHしたり、HDMI+Keyboardとかを使うのは面倒。

また、LCDがない場合でも、自分のプログラムなど特定のプログラムがちゃんと動いているかどうかを知りたい。

というわけで、作りました。

# まず、コア部分の説明 : プロセスの存在確認

```python
def isProcessExisting(command):
	found = False
	if os.path.exists(ProcessWatcher.PATH_PROC):
		pids = [pid for pid in os.listdir(ProcessWatcher.PATH_PROC) if pid.isdigit()]
		for pid in pids:
			try:
				cmd = open(os.path.join(ProcessWatcher.PATH_PROC, pid, "cmdline"), "rb").read()
				found |= (command in cmd)
				if found:
					break
			except IOError:
				continue

	return found
```

このようにして、指定されたコマンドを含むプロセスが存在するかどうかを確認します。

# 作ったもの

特定用途向けに作り込ずに、今回は、汎用化してありますので、configファイルでいろいろなシチュエーションに対応できるかと思います。

https://github.com/hidenorly/RPiStatusLedAndShutdownButton

```config.json
{
	"button_shutdown":{
		"port": 18,
		"pull-up": true,
		"active": false,
		"execute": "shutdown -h now",
		"timeout": 0
	},
	"button_reboot":{
		"port": 19,
		"pull-up": true,
		"active": false,
		"execute": "shutdown -r now",
		"timeout": 0
	},
	"process_apache2":{
		"port": 23,
		"active": true,
		"command": "apache2",
		"onFound": "",
		"onLost": "service restart apache2",
		"timeout": 0
	}
}
```

上のようにjsonファイルで、挙動を指定します。

上の例は、
* GPIO:18にスイッチを繋いで、Switchが押されたらGNDに落とす回路の場合に、 ```shutdown -h now``` を実行します(実際には押してから離した時)
* 同様に、19は、 ```shutdown -r now``` です
* ```apache2``` の実行ファイル名を含むprocessがいなくなった場合に、 ```service restart apache2``` を実行します。

# 考えられる利用例

* 一定電圧以下になったら、電源終了 (コンパレーターの結果をGPIに入れれば良い)
* ボタンを押したら、mail通知 ( ```echo hoge | mail hoge@hoge.com``` )
* 自分のプログラムが動いているかどうかをLEDで知る
PHP7.2をDockerで手軽に試す(Win/Mac)

Dockerは環境の再現性が強みというわけで、今回は[Docker For Windows](https://www.docker.com/docker-windows)と[Docker for Mac](https://www.docker.com/docker-mac)の両方で試しました。

たぶんLinux環境下ではMac(bash)と同じです。

## 環境

Windows (PowerShell)

```shell-session:PowerShell
> [System.Environment]::OSVersion

Platform ServicePack Version      VersionString
-------- ----------- -------      -------------
 Win32NT             10.0.16299.0 Microsoft Windows NT 10.0.16299.0

> docker --version
Docker version 17.09.0-ce, build afdb6d4
```

Mac(bash)

```shell-session:bash
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.11.6
BuildVersion:	15G31

$ docker --version
Docker version 17.06.2-ce, build cec0b72
```

## 構築

まずDockerfile を用意します。

```dockerfile:Dockerfile
FROM php:7.2-rc
WORKDIR /root
```

次にビルドします。

```console:PowerShell/bash
> docker build . --tag example_php_72rc
```

これで完成です。お疲れ様でした。

### 確認

イメージができているか確認します。

```shell-session:PowerShell
> docker images | Select-String example_php_72rc

example_php_72rc            latest              474bd1d2c30a        3 minutes ago       354MB
```

なお、Windows PowerShellにおける`Select-String` は、Mac/Linuxなら `grep` を使います。

```shell-session:bash
$ docker images | grep example_php_72rc
example_php_72rc               latest              75a229bbc39e        About a minute ago   354MB
```

いずれも、イメージができていることが確認できました。

`php --version` や `php --run 'echo phpinfo();'` を使ってPHPのバージョンを確認します。

```shell-session:PowerShell
> docker run --rm example_php_72rc php --version
PHP 7.2.0RC4 (cli) (built: Oct 12 2017 22:09:58) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0-dev, Copyright (c) 1998-2017 Zend Technologies
```

```shell-session:bash
$ docker run --rm example_php_72rc php --run 'echo phpinfo();' | grep 'PHP Version'
PHP Version => 7.2.0RC4
PHP Version => 7.2.0RC4
```

RC版7.2になっていることがわかります。

## 実行

ボリュームをマウントすれば、ファイルを実行できます。

index.phpを作成し、実行してみます。

```php:index.php
<?php
echo 'Hello, PHP7.2!';
```

Windows

```shell-session:PowerShell
> docker run --volume "$(pwd):/root" --rm example_php_72rc php index.php
Hello, PHP7.2!
```

Mac

```shell-session:bash
$ docker run --volume `pwd`:/root --rm example_php_72rc php index.php
Hello, PHP7.2!
```

LAMP等でWebサーバにするためにはもう少し手順を踏まないといけないのですが、ただプログラムを動かすだけならばここまで簡単に環境を用意することができます。
Pandasのデータラングリングの基礎 - ある列である値を持つ奴らだけのデータフレームを作る。-


#複数条件のものは|で繋げる。or or orという感じ。和集合。積集合にするときは&
dframe3=dframe2[dframe2['Diagnosis'].str.contains('GBM') | dframe2['Diagnosis'].str.contains('AA')  | dframe2['Diagnosis'].str.contains('DA') | dframe2['Diagnosis'].str.contains('OG') | dframe2['Diagnosis'].str.contains('AOG') | dframe2['Diagnosis'].str.contains('OA') | dframe2['Diagnosis'].str.contains('AOA') | dframe2['Diagnosis'].str.contains('GBMO') | dframe2['Diagnosis'].str.contains('AS') | dframe2['Diagnosis'].str.contains('HGG') | dframe2['Diagnosis'].str.contains('LGG') | dframe2['Diagnosis'].str.contains('AO')  ]
[React Native]react-navigationで二重遷移を防ぐ

## 追記(2018/12/13)

- react-navigation側でも二重遷移防止機能が実装されたためこの記事の対応が必要なのは一部のバージョンのみです。
- 詳細は[コメント欄の投稿](https://qiita.com/ozaki25/items/ec9ec9459b12453339cc#comment-8b852bee53af30e86312)をご参照下さい。

---

## 追記(2018/2/8)

~~- v1.0.0で二重遷移防止の機能が組み込まれたようです~~
~~- https://github.com/react-navigation/react-navigation/releases/tag/1.0.0~~

---

## 課題

- react-navigationで遷移ボタンを連打すると同じページに複数回遷移してしまう
- こんな感じ
    - ![double_tap.gif](https://qiita-image-store.s3.amazonaws.com/0/175213/0f50d475-d251-c281-f227-389e7124ff79.gif)

## 対応策

- 現在のページと遷移しようとしているページを比較して同一なら何も処理しないようにする
- react-navigationのgetStateForActionを拡張して処理を挟み込むx
- getStateForActionはページ遷移する直前に通るメソッド

## サンプル

```js:AppNavigator.js
import { StackNavigator } from 'react-navigation'
import SampleAScreen from '../containers/SampleAScreen'
import SampleBScreen from '../containers/SampleBScreen'
import SampleCScreen from '../containers/SampleCScreen'

const AppNavigator = StackNavigator({
  SampleA: { screen: SampleAScreen },
  SampleB: { screen: SampleBScreen },
  SampleC: { screen: SampleCScreen },
})

// 本来のgetStateForActionの定義を退避
const original = AppNavigator.router.getStateForAction;

AppNavigator.router.getStateForAction = (action, state) => {
  // stateがundefined -> 初期ページ
  // action.routeName -> 遷移先のページ名
  // state.routes[state.index].routeName -> 遷移元のページ名
  // 初期ページでなくて、遷移先と遷移元が同一なら何もしない
  if (state && action.routeName === state.routes[state.index].routeName) {
    return null;
  }
  // それ以外であれば通常通りの動作
  return original(action, state);
}

export default AppNavigator
```
Pandasのデータラングリングの基礎 - 行での条件付きの代入-

#条件入れて代入していくスタイルdframeの列column_AについてAAと入っているときBBに代入し直す場合
dframe[dframe['column_A'] =='AA']='BB'

追記）
これだとだdatafrmeの書換えなのでミスになる。
dframe.AA[dframe['column_A'] =='AA']='BB'
が正解。
EdgeRouter Xをnetmikoから操作する

EdgeRouter Xをnetmiko経由で操作してみます。

pipなどでnetmikoをインストールしたあと、pythonで以下のようなプログラムを記述します。

```python:python
from netmiko import ConnectHandler

obj_erx = {
    'username': 'ubnt',
    'ip': '192.168.1.1', 
    'verbose': True, 
    'port': 22, 
    'password': 'ubnt', 
    'device_type': 'vyos'
}

net_connect = ConnectHandler(**obj_erx)

print('\n$show configuration commands | match network\n')
output1 = net_connect.send_command('show configuration commands | match network')
print(output1)

config_commands = [ 
    'set protocols bgp 65001 network 10.10.0.2/32',
    'set protocols bgp 65001 network 10.10.0.3/32',
    'commit',
    'save',
    'exit'
]

output2 = net_connect.send_config_set(config_commands)
print(output2)

print('\n$show configuration commands | match network\n')
output3 = net_connect.send_command('show configuration commands | match network')
print(output3)
```

BGPのnetworkコマンドを2つ追加するプログラムです。

netmiko1.4.3以降はEdgeRouterに対応しており、device_typeに'ubiquiti_edge'と指定できるのですが、うまく動きませんでした。原因は調査中ですが、ひとまずdevice_typteに'vyos'と指定して動かしています。

実行結果は以下のようになります。

```
SSH connection established to 192.168.1.1:22
Interactive SSH session established

$show configuration commands | match network

set protocols bgp 65001 network 10.10.0.1/32
configure

[edit]
ubnt@ubnt1# set protocols bgp 65001 network 10.10.0.2/32
[edit]
ubnt@ubnt1# set protocols bgp 65001 network 10.10.0.3/32
[edit]
ubnt@ubnt1# commit
save
exit
[edit]
ubnt@ubnt1# save
Saving configuration to '/config/config.boot'...
Done
[edit]
ubnt@ubnt1# exit
exit
ubnt@ubnt1:~$ 

$show configuration commands | match network

set protocols bgp 65001 network 10.10.0.1/32
set protocols bgp 65001 network 10.10.0.2/32
set protocols bgp 65001 network 10.10.0.3/32
```

コンフィグ変更の前後で"show configuration commands ~ match network"というコマンドを実行しており、その出力結果に違いが出ていることがわかります。EdgeOSだけではなく、Vyatta, VyOSでも同様のプログラムでコンフィグ変更ができると思います。
【Python】int() 関数の注意点

**Python** では、*int()* 関数を使って、整数に変換する時に一つ注意点があります。以下の例をご参照ください。

```.py
>>> int(100)     #整数ー＞整数、OK
100
>>> int(100.0)   #浮動小数点ー＞整数、OK
100
>>> int('100')   #文字列（整数）ー＞整数、OK
100
>>> int('100.0') #文字列（浮動小数点）ー＞エラー
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '100.0'
```

回避策の一つとしては、以下の例がご参照できます。

```.py
>>> int(float('100.0'))
100
```

尚、*float()* には、このような問題はありません。

```.py
>>> float(100)
100.0
>>> float('100')
100.0
>>> float('100.0')
100.0
```
課題回答　HTML

#指示
http://tech-drill.in/questions/68
#解答
https://study-htmlcss-enzomari.c9users.io/sample.html

#解答経緯
まず、2行目 html lang="en" class= は見慣れず戸惑った。 
langは英語と予想できたが、今回の指示に本文はないため修正なし。
classは不要と思い削除した。
次に、注意②のヘッダー固定は学習した覚えがなくhttp://webnonotes.com/css/header_footer/
を参考にした。
width height colorを指定したのちに、yellowブロックをfloat:leftにするまではスムーズだったが、redブロックをfloat:rightとわざわざ書くこと、greenブロックをclear:bothにするまではかなりの時間を要してしまった。
今回の課題によりサイズ指定の重要さを理解することができた。また、floatの使い方が大きな課題だったように思うが、まだまだ練習不足に感じた。
Mac の要らないフォルダを削除してHDDを長生きさせる手順

## Abstract
MacBook Air の容量が3GBしかなかったので色々消したら12GBまで回復した。手順をメモとして残しておく。

## どのファイルがデータを食っているか？

```$ du -sh * | grep G ```
このコマンドをホームディレクトリから初めて、データ容量を1GB食ってるフォルダを次々に辿っていく。私の場合は ```~/Library/Containers```や rbenvやpyenv の使ってないバージョンに無駄なファイルが多かった。

大きなファイルで、必要がないと判断した場合は ```$ rm -rf Directory ``` などで消しましょう。
モノレポ運用時のexamplesの参照

## 12/14 追記
fileで参照するよりモノレポ管理下に置いた方が何十倍も便利でした。
その理由は3点あります。

1. 更新が楽
プロジェクトのルートで`yarn upgrade-interactive`を叩くとサンプルの依存を含めて更新できます。非常に簡単です。

1. 確認が楽
fileでの参照だと依存の依存の更新まで見ません。ですので、ライブラリを更新したのにexampleに反映されないことがあります。

1. package.jsonが素直
lernaによりバージョンが管理されているのでライブラリのバージョンが更新されるとサンプルのバージョンも追随して更新されます。よって、`file`などプロジェクトに依存している部分がなくなるので、常にサンプルのpackage.jsonがコピペ可能な状態になります。

考えられる反論としては、サンプルを入れると依存が増え開発時のインストール時間が長くなる等考えられますが、CIの時間を見るかぎり全く差はありませんでした。(むしろ時間帯によるズレが大きい)

## 方法

ルートの`package.json`に以下を追記します。

```package.json
  "workspaces": ["packages/*", "examples/*"],
```

**追記おわり**

---

lernaを使い、モノレポを運用時にexamples以下もそれぞれのpackageのバージョンに縛られずに運用できると便利です。
lernaの機能で何かできないかと思いましたが、ありませんでした。

しかし、よくよく考えてみるとpackage.jsonのdependencisは`file`という書き方で相対パスでパッケージを指定出来ます。

https://docs.npmjs.com/files/package.json#dependencies

```json
{ 
	"dependencies": {
		"foo": "file:../../pkgs/foo"
	}
}
```

ですので、examples以下が開発中のパッケージを参照するときは、上記のように対応することにしました。

参考までに、今開発しているs2sでは以下のように書いています。

https://github.com/akameco/s2s-plugins/blob/master/examples/shopping-cart/package.json#L27

```json
  "devDependencies": {
    "enzyme": "^3.0.0",
    "enzyme-adapter-react-16": "^1.0.2",
    "enzyme-to-json": "^3.1.4",
    "flow-bin": "^0.57.3",
    "react-test-renderer": "^16.0.0",
    "s2s": "*",
    "s2s-plugins-redux": "file:../../packages/s2s-plugins-redux"
  }
}
```

ここまで書いて思いましたが、別にモノレポに限った話ではないですね。
やや、モノレポそのものに惑わされた感じがします。
Androidでprivateなメソッドをテストする

`public`なメソッドは簡単にテストできますが、`private`なメソッドはどうするの？で意外と簡単でしたのでまとめました。

# 利用するツール
`public`なメソッドはMockitoでテストできますが、`private`はPowerMockitoを使います。

## PowerMockitoの設定を入れる
app/build.gradleに下記を追記します。

```lang:build.gradle
dependencies {
    testCompile 'org.powermock:powermock-module-junit4:1.6.2'
    testCompile 'org.powermock:powermock-api-mockito:1.6.2'
}
```

# テスト対象クラス
```java:SampleClass.java
public class SampleClass {
    private String str;

    public void setString(String str) {
        this.str = str;
    }

    public String getString() {
        return str;
    }

    private void privateMethod(String str) {
        this.str = str;
    }
}

```

# テストコード
```java:SampleClassTest.java
@RunWith(JUnit4.class)
public class SampleClassTest {
    SampleClass sampleClass;

    @Before
    public void setUp() {
        sampleClass = new SampleClass();
    }

    @Test
    public void TestGetString() {
        String testStr = "test";
        sampleClass.setString(testStr);
        assertEquals(testStr, sampleClass.getString());
    }

    @Test
    public void TestPrivateMethod() throws Exception {
        String testStr = "hoge";
        Method method = PowerMockito.method(sampleClass.getClass(), "privateMethod", String.class);
        method.invoke(sampleClass, testStr);

        assertEquals(testStr, sampleClass.getString());
    }
}
```
2つ目の`TestPrivateMethod`で`private`なクラスのテストをしています。

```
Method method = PowerMockito.method(sampleClass.getClass(), "privateMethod", String.class);
```

ここで`private`なメソッドは他のクラスからは見えないので、`PowerMockito`を使って無理やり`Method`を指定します。
第1引数に`private`メソッドを持っているクラス名、第２引数にテストしたいメソッド名、第3引数以降に「テストしたいメソッドに必要な引数」を指定します。
ちなみに`PowerMockito#method`の中身はこんな感じです。

```java:PowerMockito.java

    public static Method method(Class<?> declaringClass, String methodName, Class<?>... parameterTypes) {
        final Method method = WhiteboxImpl.findMethod(declaringClass, methodName, parameterTypes);
        WhiteboxImpl.throwExceptionIfMethodWasNotFound(declaringClass, methodName, method, (Object[]) parameterTypes);
        return method;
    }
```


最後に`method.invoke()`で実際にメソッドを実行し、結果をアサーションで確認します。

簡単ですが以上です。
VMware Fusion10でUSBを認識しない問題

VMware Fusion10にアップグレードしたら、USBを全く認識しなくなって困っていたけど解決したのでメモ。

以下のサイトが参考になります。

http://fanblogs.jp/macyarounanoka/archive/308/0
https://communities.vmware.com/thread/573018
https://communities.vmware.com/thread/573617

セキュリティの問題みたいで、mac側でVMwareのUSB関連の読み込みを阻止してるのが原因のよう。
なので、読み込みを『許可』することで正しく動作するようになります。
たぶん、次回のアップデートで解決されるだろうから細かく書きませんが、
上のサイトの方法を幾つか試してみれば解決するはず！！！

私は、
１．ゲストOSをすべてシャットダウン
２．VMを一度削除（ゴミ箱へ）
３．VMを再インストール
４．VMの設定画面の「USBとBluetooth」からUSBコントローラーを削除。
５．４のゲストOSを起動後、シャットダウン。
６．再度USBをコントローラーをインストール。
７．macOSのシステム環境設定の「セキュリティとプライバシー」画面の一般タブで
　　**「開発元"VMware, Inc."のシステムソフトウェアの読み込みがブロックされました。」**
　　が表示され、「許可」をすることでVMの設定画面「USBとBluetooth」にデバイス一覧が但しく表示され解決。

といった具合でした。セキュリティとプライバシー」画面で
**「開発元"VMware, Inc."のシステムソフトウェアの読み込みがブロックされました。」**
を表示できるかが肝になるかと。
nodejs aws-sdkでs3ファイルアップロード

#背景
node.jsでaws-sdkを利用してファイルのアップロードしようと思ったけど古い記事が多かったのでまとめさせていただきます。
正規なやつは下記を参照…
http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html

#最初に
下記の項目は飛ばさせていただきます…
 1. node.jsやらnpmやらのインストール
 2. awsのアカウント作成
 3. awsのs3のバケット作成

#やり方
##aws-sdkのインストール
```
 npm init
 npm install --save aws-sdk fs
```

##アクセスキーの取得
AWSの画面の右上の方の「アカウント名」をクリック＞「セキュリティ認証情報」を選択
<img width="216" alt="スクリーンショット 2017-10-22 21.27.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/89227/10566bea-9d83-c277-863a-7fce3b29fd75.png">

アクセスキーの項目で「新しいアクセスキーの作成」をクリックして作成
<img width="989" alt="スクリーンショット 2017-10-22 21.27.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/89227/bdd1ecb2-0445-5c9f-e33e-fb463091fdc1.png">

下記のようなファイルがダウンロード出来ます。

``` rootkey.csv
AWSAccessKeyId=xxxxxxxxxxxxxxxxxxxx
AWSSecretKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

これをこんな感じで変更して拡張子をjsonに変更

``` rootkey.json
{"accessKeyId": "xxxxxxxxxxxxxxxxxxxx",
 "secretAccessKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
```


##コーディング
上記のファイルをプロジェクトファイルに移動して…

``` javascript:index.js
var AWS = require('aws-sdk');
var fs  = require('fs');

AWS.config.loadFromPath('./rootkey.json');
AWS.config.update({region: 'リージョン名'});

var s3 = new AWS.S3();
var params = {
 Bucket: "バケット名",
 Key: "アップロード後のファイル名.jpg"
};
var v= fs.readFileSync("./アップロード対象ファイル名.jpg");
params.Body=v;
s3.putObject(params, function(err, data) {
  if (err) console.log(err, err.stack);
  else     console.log(data);
});
```
ROSのrosserialを使ってArduinoでLチカをする

##目的
ROSのrosserialを使ってArduinoでLチカをする。
ROSには、arduinoと通信を行うパッケージros-indigo-rosserial-arduinoが用意されており、
これでArduinoをROSノード化することができる。

##環境
  Ubuntu-14.04.1(x64)
  ROS:Indigo


##インストール
rosserialとrosserial-arduinoをapt-getでインストールする。

ROS Indigoの場合

```
 sudo apt-get install ros-indigo-rosserial-arduino
 sudo apt-get install ros-indigo-rosserial
```

ArduinoIDEをインストールする。
以下のページから、ArduinoIDEのLinux版をダウンロードして回答する。
https://www.arduino.cc/en/main/software

そして、Arduinoのライブラリにros_libを追加する。
ros_libはArduinoのlibrariesフォルダでmake_libraries.pyを実行することでインストールできる

ArduinoIDEのスケッチ→ライブラリをインクルード→ros_libがあればOK。

```
cd
mkdir dev
wget https://downloads.arduino.cc/arduino-1.8.5-linux64.tar.xz
tar Jxfv arduino-1.8.5-linux64.tar.xz 
 cd arduino-1.8.5/libraries/
rosrun rosserial_arduino make_libraries.py .
cd ..
./arduino
```

##デバイスファイルの設定
PCとArduinoをUSBで接続すると、/dev/ttyACM*のバイスファイルが生成される。
デバイスファイルに書き込み権限をつける。

ttyACM0の場合
```
sudo chmod 666 /dev/ttyACM0
```

##Lチカのテスト

ArduinoのDigital-11番ピンにLEDの足の長い端子を、GNDに足の短い端子を接続する。

![IMAGE.jpg](https://qiita-image-store.s3.amazonaws.com/0/73020/c2d2e4d6-f8fc-4d9d-5fec-8663ceb43902.jpeg)

ArduinoIDEで下記のソースを貼り付けて、
「スケッチ」→「検証・コンパイル」→「マイコンボードに書き込む」
11番ピンにつけたLEDがチカチカできていることを確認する。

test.ino

```
void setup() {
  pinMode(11, OUTPUT);  //A0
}

void loop() {
    digitalWrite(11,HIGH);
    delay(100);
    digitalWrite(11,LOW);
    delay(100);
}
```


##ROSからのTopicをSubscribeしてLチカのテスト

ArduinoIDEで下記のソースを貼り付けて、
「スケッチ」→「検証・コンパイル」→「マイコンボードに書き込む」

test_L_tika.ino

```

#include <ros.h>
#include <std_msgs/Empty.h>

ros::NodeHandle nh;

void messageCb( const std_msgs::Empty& toggle_msg) {
  digitalWrite(11, HIGH);
  delay(100);
  digitalWrite(11, LOW);
  delay(100);
}

ros::Subscriber<std_msgs::Empty> sub("toggle_led", &messageCb );

void setup(){
  pinMode(11, OUTPUT);
  digitalWrite(11, HIGH); 
  nh.initNode();
  nh.subscribe(sub);
}

void loop(){
  nh.spinOnce();
  delay(1);
}

```

下記のコマンドで、ROSを立ち上げ、rostopicで「toggle_led」をpublishする。
「toggle_led」を受けとると、arduinoはLチカを行う。

```
roscore
rosrun rosserial_python serial_node.py /dev/ttyUSB0
rostopic pub toggle_led std_msgs/Empty --once
```



##参考

http://wiki.ros.org/rosserial_arduino/Tutorials
VMware{code} Slackへの参加方法

VMwareのプログラミング Slackへの参加方法についてのメモです。

# VMware{code} slackに参加する方法

(1) 以下のサイトにアクセスして `Enter your email address` にメールアドレスを入力して `Request Invite` をクリックします。

[Become a Part of the VMware{code} Community](https://code.vmware.com/join)

(2) 上記で入力したアドレスに招待メールが届くので届いたメールの `Join Now` をクリックします。

(3) 後は登録を進めていけば完了 :smiley:
[openFrameworks][初心者]sinについて基礎から勉強してみよう！

#今回理解しながらつくるもの
<img width="1013" alt="スクリーンショット 2017-10-22 18.22.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/173252/6f52c634-a6b5-4d93-bfae-4b80474e7ec8.png">

アニメーションでsin波を描画してみる、というものを作ります。

#sinについて

sinはみなさん高校で勉強してきたと思います。
sinはそのまま使うとすると-1から1の範囲を行き来します。

|値|0|1|0|-1|0|
|:---|:---:|:---:|:---:|:---:|:---:|
|度数法|0°|90°|180°|270°|360°|
|弧度法|0πrad|0.5πrad|πrad|1.5πrad|2πrad|
|数値|0|1.5707|3.1415|4.7123|6.2831|

なのでメディアアートで繰り返す処理や曲線的な動きをつくりたい時、sinを使うとかなり便利になります。

#アニメーション基礎
もしopenframeworksのアニメーションの基礎がわかっていない人はyoppaさんのスライドみてください。
http://yoppa.org/tau_media16/6840.html

これを読んだらまず中心の横一直線を動く円を作ってみましょう。

##[問題]横一直線を動く円を作る

[解答]

```C++:ofApp.h
    float x = 0;
    float y = ofGetHeight()/2;
```

```C++:ofApp.cpp
#include "ofApp.h"
using namespace std;

//--------------------------------------------------------------
void ofApp::setup(){

　　　　　　　　//フレームレートを60に設定
    //(1秒間に60枚画面を変える) 
    ofSetFrameRate(60);
    //背景黒
    ofBackground(0, 0, 0);
    //塗りをリセットしないようにする(軌跡が描画されるようにする)
    ofSetBackgroundAuto(false);

}

//--------------------------------------------------------------
void ofApp::update(){

    x = x + 1;

}

//--------------------------------------------------------------
void ofApp::draw(){
    //白色に
    ofSetColor(255, 255, 255);
    ofDrawCircle(x, y, 3);

}

```

動きましたか？
横の動きができたので縦の動きも付け足してみましょう。

ただ、横の動きに関しては横一直線の等速直線運動ではxに足すのは1でいいですが、y座標はそうはいきません。上下させたいので定数ではなく、変わる数を足さなくてはなりません。

そしてその”変わる数”こそがsinをつかってだした数値なのです。
それではそのsinをつかっていい具合に上下させる数値を作って行きましょう。

#openframeworksのsinとは
openframeworksのsin関数には引数として、入るのは度数でもなく、πとかでもなく数値(3.14１５９２...とか)です。

sin(0) = 0　(0 = 0π)
sin(3.14)　= 1（3.14 ＝ π）
sin(6.28) = 0　(6.28 = 2π)
て感じです。

なので引数にはできたら小数点第２位くらいで常に変化し続ける(動かしたいから)値が必要です。それではまず常に変化し続ける値からです。

#sinを使う
常に変化し続ける値変数をつくってupdateの中で値を増やしていってを”作る”のもいいですがofGetFrameNum()というその時のフレームの値を常に取得し返してくれる関数があるので使用して行きましょう。

ofGetFrameNum()で取得した値をsinで変換してそれをofGetHeight()/2にまず足します。こういう感じですね。

```C++:ofApp.cpp
void ofApp::update(){
    
    x = x + 1;
    y = ofGetHeight()/2 + sin(ofGetFrameNum()）;

}
```

でもこれじゃ、なにがおこっているかまったくわからないですよね？
理由は、sinの振動はsinの（）の中の値が0~6.28で完結します。それが問題で、ofGetFrameNum()はフレーム数を取得します。

ちなみにこのプログラムではフレームレートは60/sと設定されているので1s間に１０回くらい上下します。意味わかんないですね。なのでofGetFrameNum()に０．０５くらいをかけてsinの中の値を小さくしましょう。

```C++:ofApp.cpp
void ofApp::update(){
    
    x = x + 1;
    y = ofGetHeight()/2 + sin(ofGetFrameNum() * 0.05）;

}
```

これでも全然わからないですよね。なんでかっていうとsinは-1~1までしか振動しないので、それくらいの動きされてもわからないんですよね。なので50でもかけましょう。それで完成です。

```C++:ofApp.cpp
void ofApp::update(){
    
    x = x + 1;
    y = ofGetHeight()/2 + (sin(ofGetFrameNum() * 0.05）　* 50);

}
```

以上です。

どうでしょう？openframeworksのsinの扱いについて少しわかったのではないでしょうか？一応githubであげておいたので共有しておきます。動くものがあるのとないのでは本当に違うと思います。僕もoF勉強中ですけど、githubにこんなのじゃなくてちゃんとすげー作品卍あげている人は神様だと思ってます。

[github]
https://github.com/hazamayuji/171021_sin

なにか不明点、違うところがあったらなんでもいうてくださいね！
ではでは。
いまさら始めるJava8 ～forEachとラムダ式～

Java9もリリースされたというのにまだJava8がよくわかってないのでまとめてみます。

## forEach()
Java8ではList,Map,配列等に `forEach()` メソッドが追加されました。
Java7以前は

```
for(String s : list) {
	System.out.println(s);
}
```
と3行も使っていた処理が

```
list.forEach(s -> System.out.println(s));
```
1行で書けるようになりました。

なぜこのように書けるのでしょうか。

## 関数型インタフェース
Java8では抽象メソッドを1つのみもつインタフェースを関数型インタフェースと呼び、ラムダ式で渡せるようになります

```ruby:FunctionalIf.java
@FunctionalInterface
public interface FunctionalIf {

	public String retStr(int number);
}
```

ただし、以下のメソッドは含まれていてもかまいません
・staticメソッド
・[Defaultメソッド](http://d.hatena.ne.jp/nowokay/20130610)
・java.lang.Objectのpublicメソッドのオーバーライド(toString()やequals())

`@FunctionalInterface`アノテーションを付けると条件を満たしていないときにコンパイルエラーになりますが、必須ではありません。

## ラムダ式
ラムダ式とは、Java8から導入された文法です。
以下の構文で関数型インタフェースを実装することができます

```
( 実装するメソッドの引数 ) -> { 処理 }
```

```
FunctionalIf func = (int num) -> { return num +" * 2 = " + num*2;};
```

これだけでもかなり簡潔に書けているのですが、さらに省略することができます。

### 実装するメソッドの引数が1つの場合、型と()を省略可能
```
FunctionalIf func = num -> { return num +" * 2 = " + num*2;};
```
引数が1つなので、``num``はint型と推論できます。

### 処理が単文の場合、returnと{}を省略可能
```
FunctionalIf func = num -> num +" * 2 = " + num*2;
```
単文なので、文の結果が出力と推論できます。

### ラムダ式の利用
最終的にこのような形式になりました

```
// ラムダ式で関数型インタフェースを実装
FunctionalIf func = num -> num +" * 2 = " + num*2;

// 実装したメソッドを利用
System.out.println(func.retStr(1));
System.out.println(func.retStr(2));
```
```ruby:実行結果
1 * 2 = 2
2 * 2 = 4
```

## ふたたび forEach()
Java8でのforEach()メソッドは、Iterableインタフェースのメソッド``default void forEach(Consumer<? super T> action)``を実装したクラスで使用できます。
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Iterable.html#forEach-java.util.function.Consumer-

引数の``Consumer``は``void accept(T t)``（何か引数を受け取り、値を返さない）をもつ関数型インタフェースです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/function/Consumer.html


```
list.forEach(s -> System.out.println(s));
```
とは、forEach()メソッドの引数に、``Consumer``の実装をラムダ式で渡していたのですね。

## ラムダ式利用時の注意点

### 変数のスコープ
ラムダ式の外側で宣言した変数は、ラムダ式の内側で参照することができます。
ただし、変更することはできません。

```
String str = " item";
list.forEach(s -> {
  System.out.println(s + str); // 参照可能
  // str = " changed";  // 変更はNG
});
```

また、変数の引数名にラムダ式の外側で宣言した変数を使うことはできません（コンパイルエラーになる）

### 変数名の制限
ラムダ式の引数の変数名に単一の `_`は使うことはできません。
EC2インスタンスにS3をマウントする


機械学習に使うデータをS3にまとめて保存しておき、インスタンスのストレージを使わない様にしたかったので、S3をマウントして使う事にしました。
安定性を考えてs3fsを使っていますが、goofysの方が早いらしいです。

# 条件
- Ubuntu 16.04
- s3fs-fuseを利用（goofysは安定性が微妙らしいため）
- IAM Role を利用（Key情報をEC2インスタンス内に保持する必要がないため）
  ※Roleを使用すればEC2 インスタンス起動時に IAM Role 選択するのみ


# 手順
１．S3 Bucket の準備
２．IAMロールの準備
３．s3fs-fuse のインストールと設定
４．マウントの自動化

※ １と２は**AWSコンソール画面**での操作
※ ３と４はインスタンスに**SSH接続**してから操作

## １．S3 bucketの準備

- バケット名：s3-bucket1-gpu
- リージョン：米国東部（バージニア北部）※マウントしたいEC2と同じリージョンにすること

※ひとまず上記以外の設定はデフォルトにしておく

## ２． IAMロールの準備
① 信頼関係
・ロールを利用するサービス：EC2
・ユースケースの選択：EC2

② アクセス制限
・ポリシー名：AmazonS3FullAccessを選択

③確認
・ロール名：access-s3-role
・ロールの説明：access to S3 FullAccess

そして作成したロールをインスタンスに割り当てる

![IAMロール1.png](https://qiita-image-store.s3.amazonaws.com/0/163518/5c18bb23-6786-b462-447e-f43f91e060d3.png)

S3をマウントしたいインスタンスが選択されていることを確認して作成したIAMロール「access-s3-role」を選択して適用する

![IAMロール2.png](https://qiita-image-store.s3.amazonaws.com/0/163518/004dd061-465c-8732-9739-e5c74e81deb0.png)

## ３．s3fs-fuse のインストール

まずgitなど必要なものをインストールする

```shell-session
$ sudo apt-get install automake autotools-dev g++ git libcurl4-gnutls-dev libfuse-dev libssl-dev libxml2-dev make pkg-config
```

そしてs3fsをgitからインストールする

```shell-session
$ git clone https://github.com/s3fs-fuse/s3fs-fuse.git
```

もろもろの設定（これでs3fsが /usr/local/bin 下におかれる）

```shell-session
$ cd s3fs-fuse
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
```

マウントポイントの作成
※root権限のディレクトリとして作成されるがマウント時にownerを設定するのでOK

```shell-session
$ sudo mkdir /mnt/s3
```

マウント時のownerのuid, gidを確認する

```shell-session
$ id ubuntu
uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),109(netdev),110(lxd)
```

マウントする

```
$ sudo s3fs s3-bucket1-gpu /mnt/s3 -o rw,allow_other,uid=1000,gid=1000,default_acl=public-read,iam_role=access-s3-role
# allow_other: root 以外（マウントしたユーザー以外）も利用可能とする
```

これでS3のbucketをインスタンスにマウントできた。しかし再起動するとマウントは解除されてしまうので、再起動しても自動マウントされるように設定しておく。

## ４．マウントの自動化

インスタンスを再起動しても自動でマウントされるように設定を行う。
/etc/rc.local にマウントコマンドを書き込んでおけば起動時に自動で実行してくれる。

```
$ sudo vi /etc/rc.local
```

以下の内容をrc.localに追記する

```
# s3fs mount
# umount /mnt/s3
s3fs s3-bucket1-gpu /mnt/s3 -o rw,allow_other,uid=1000,gid=1000,default_acl=public-read,iam_role=access-s3-role
```

これでインスタンスを再起動しても自動でマウントされる。
［Ｃ言語］２次元配列とポインタの配列の違い

転職して業務系のSE（Java）から組み込み系PGの見習いになったので、Ｃ言語の研修で聞いた内容で、今まで自分が知らなかった部分のメモとして書きます。
勉強中ですので、経験者の方のツッコミをお待ちしております。

# 2次元配列とポインタの配列の違い
2次元配列は1次元配列と同じように連続したメモリの領域を確保する。
ポインタの配列の場合、2次元目の配列（1次元目の配列が指す先）はメモリ上のどこかにあり、他の2次元目の配列とは連続している必要は無い。

また、2次元配列の場合、アドレスを保持しているのはarray[0][0]のアドレスだけであり、array[1][0]にアクセスするときは
&array[0][0]+1*(2次元目の配列の要素数)+0という式を使う。
そのため、2次元配列を関数の引数として渡すときには、関数側で2次元目の要素数を指定しておく必要がある。

```c:2次元配列を関数に渡す
// 2次元配列を渡すときは2次元目の要素数を確定させる必要がある。
void func1(int array[][5]) {
	array[1][0] = 1;	// *(array + (1*5) + 0) = 1;と同義
}

// 2次元目の要素数を引数に取れば、以下のような書き方もできる。
void func2(int num, array[][num]) {
}
```
Anacondaでnumpy, pandasをimportできなくなったら


せっかくの休日をこの問題のおかげで失うところだったので、同じような人が出ない様にメモ。
予想以上に日本語での情報が少なかったので。


【環境】
Windows10
Anaconda：5.0.0
Python：3.6.3
pycharm無料版（Jupyterだとなぜか問題なくいけた）


#問題

pycharmでいきなりnumpyが使えなくなった（importができない）
※pandas, scipyでも依存関係で同じ問題が出る可能性あり

【エラー文面】


```
   missing required dependencies 'numpy'
```



要はnumpyが見つからねえぞという問題なのだが、Anaconda様にnumpyがないはずがない。
参考にさせて頂いた記事は下記なのだが、自分はこれじゃ解決しなかった。

★anacondaでnumpyやscipyのインポートに失敗してしまうバグについて
https://qiita.com/marshi/items/a0f80c5aa3c37b0025d6#_reference-ad9a74bec672fd834dc6


自分の場合は、そもそもWindows/System32に上記URLに書いてあるようなファイルがなかった。WindowsにはAnacondaしか入れていないから。しかもpycharmではしっかりAnacondaのPythonを指定してるし、他のライブラリは問題なく使えるし、どういうこっちゃ？！状態。

##結局これで解決した


★scipyが突然読み込まれなくなった話
https://qiita.com/eqs/items/79620732946939c7e3d1


ありがとうQiita！

pandas,numpyでも同様の問題が出るので、こちらでも書き直した次第。
詳細の回復方法は下記の通り。

※StackOverFlowでは```conda install numpy```や```pip install numpy```で最新版をインストールすればイケるという外人さんの回答が多かったが、自分はそれじゃだめだった。

##復旧方法

http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy


上記URLから最新版のnumpyをダウンロードしてインストールするだけ。
ただ、拡張子が
```.whl```
なので、ダウンロード後にインストールする時にはWindowsならコマンドプロンプトかanacondapromptから、

```pip install "ファイル名.whl"```


でDONE!

自分の場合はこれでできました！
あー、結構時間食った。


【追記】
pymcをpipインストールした時、pymcライブラリが旧numpyを参照する仕様になっていたおかげか、Anaconda全体が旧numpyを参照する様になってしまい、再度同じ状況になりました。
これは```pip uninstall numpy```した後、再度最新のnumpyをインストールして解決しました。

が、やはり標準環境をいじるのこと自体が原因だと思い、仮想環境（virtualenv）を使うことにしました。
やっぱ環境を管理するって大事ですね。
［Ｃ言語］ポインタとしての文字列

転職して業務系のSE（Java）から組み込み系PGの見習いになったので、Ｃ言語の研修で聞いた内容で、今まで自分が知らなかった部分のメモとして書きます。
勉強中ですので、経験者の方のツッコミをお待ちしております。

## 関数の引数にポインタを使う
文字列はchar型の配列として定義される。
配列は、連続したメモリ領域の先頭のアドレスをポインタとして持っているので、文字列はそもそもポインタとして使える。

```c:関数の引数にポインタを使う
void print(char *str) {
	printf("%s\n", str);
}

int main(void) {
	char *pStr = "Hello";
	char arrStr[10] = "Hello";

	print(pStr);
	print(arrStr);

	return 0;
}
```

上記のプログラムでは、ポインタと配列をそれぞれ同じ関数に渡しているが、どちらも正常に「Hello」が出力される。
print関数の引数が配列``void print(char str[])``であっても、結果は同じになる。

## ポインタと配列で文字列を扱うときの違い
ポインタで文字列を定義するときは、一般に文字列リテラルで初期化する。
文字列リテラルは変更不可なので、読み取り専用領域（ROM）に確保される。
※ROMに領域が確保されるかどうかはコンパイラ（処理系）に依存する。

配列で文字列を扱うときは、初期化の書き方``char str[] = "String"``というのは、
配列の初期化``char str[] = {'S', 't', 'r', 'i', 'n', 'g', '\0'}``の略なので、文字列リテラルではなく変数として書込み可能領域（RAM）に格納される。

このことから、文字列リテラルで初期化したchar型のポインタに対して、文字列の編集をしようとすると、実行時にエラーとなる。
ただし、ポインタに対して新しい文字列リテラルを割り当てることはできる。この操作は配列ではできない。

```c:ポインタと配列の違い
int main(void) {
	char *pStr = "String";
	char arrStr[] = "String";	// 配列の初期化の簡略化

	pStr[0] = 's';	// ROMに対して書込みをしようとして実行時エラーとなる
	arrStr[0] = 's';	// RAMにあるので、実行時エラーにはならない

	pStr = "string";	// ポインタが付け換わるだけなので、エラーにはならない
				// ただし、最初の"String"はメモリに残り続ける
	arrStr = "string";	// 配列に新しい配列を入れることはできないのでコンパイルエラー

	return 0;
}
```

[2017/10/24 追記]
配列に対して文字列リテラルを代入する書き方は、関数の引数に対しては適用できる。これは関数の仮引数を配列として記述した場合は、その引数はポインタとして扱われるためである。

```c:関数の引数としての配列はポインタとして扱われる
void print(char str[]) {
	str = "String";	// コンパイルエラーにはならない
	printf("%s\n", str);
}
```
Xcode9のリモートリポジトリの設定方法

###Xcode9でリモートリポジトリ設定

Xcode9でリモートリポジトリの設定の方法が変わっているので、Qiitaに書こうかと思います。
最初は、メニューからリモートリポジトリを設定しようとしたんですが、リモートリポジトリを設定する項目がないんですよね。

<img width="1440" alt="スクリーンショット 2017-10-22 17.06.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/53172/fc2f085a-b877-6ac5-920a-0711d19d085a.png">

で、いろいろ調べた結果。
メニュー→Xcode→Preference→Accounts
で、githubのアカウントを設定できることがわかりました。

<img width="1440" alt="スクリーンショット 2017-10-22 20.10.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/53172/03840fdb-158f-73ae-4c85-0a4fcb3ab3a6.png">

そして、以下のように、githubのリモートリポジトリを作ることができます。

<img width="1440" alt="スクリーンショット 2017-10-22 20.29.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/53172/4a69c5e3-0e70-0793-37fa-7ecedb457018.png">

よろしければお役立てください。
AnsibleでRaspberry Piの環境を自動構築する

## 目的

Raspberry Piのセットアップを毎回やるのがめんどくさいので、Ansibleを使って初期セットアップをします。

ついでにWordPress環境も構築しています。


## 動作環境と準備

Raspberry Piは以下の環境を使用しています。

- 機体：Raspberry Pi 3 Model B
- ＯＳ：Raspbian STRETCH WITH DESKTOP(Release date:2017-09-07)

SDカードにOSイメージを書き込んだ際にbootフォルダにsshファイルを作成しておくと、
初期状態でSSHが有効になり、ディスプレイやキーボード無しでセットアップが可能です。

<img src="https://qiita-image-store.s3.amazonaws.com/0/199081/6f4d0261-9bd7-494f-51bf-b126d1d25875.png" height=50% width=50%>

詳細は以下のURLに記載されています。

https://www.raspberrypi.org/blog/a-security-update-for-raspbian-pixel/

## できること

- LOCALE設定（ja_JP.UTF-8）
- タイムゾーン設定(Asia/Tokyo)
- apt-get upgrade ＆ update
- Apache2インストール
- PHPインストール
- MySQLインストール
- WordPressインストール

## Ansibleの実行

今回作成したAnsibleのPlaybookをGithubに置いています。
このPlaybookを使って以下の手順でRaspberryの初期設定とWordPress環境が構築できます。

https://github.com/rednes/raspberry-ansible


---

1. Raspberry Piにssh接続するためにhostsにRaspberry PiのIPを追記してください。

    ```
    [raspberry-pi]
    XX.XX.XX.XX # set your environment
    ```

1. Ansibleのコマンドを実行して、SSHのパスワードを入力してください。SSH経由で環境構築が進みます。

    ```
    $ ansible-playbook site.yml -v --ask-pass -u pi
    ```

1. ついでに構築したWordPress環境のセットアップもします。

    ```
    http://(Raspberry PiのIPアドレス)/wordpress/wp-admin/setup-config.php
    ```

    ![STEP03.png](https://qiita-image-store.s3.amazonaws.com/0/199081/379b5def-1b83-8cfe-ebfd-a2c3a1f5a1af.png "STEP03.png")


1. WordPressの環境ができました。

    ![STEP04.png](https://qiita-image-store.s3.amazonaws.com/0/199081/d2ef2c65-50cc-9cdd-19b0-2bba0095ab2b.png "STEP04.png")


## 所感

ラズパイの動作性能が低いので初期状態から全てのインストールを実行すると2時間くらいかかりますのでやっぱり時間はかかります。けど、自動でできるから放置できるので楽にはなると思います。
【Qiita】初心者がMarkdown記法を使ってみた①

QiitaでMarkdown記法を使用して初投稿します。
備忘録として使用したMarkdownを残すことを目的としています。

#見出しの書き方
見出しを記載する際に使用するMarkdownは「#」を使用します。
見出しは最大6つまで指定することが可能なようです。

```text:記述例
#見出し1
##見出し2
###見出し3
####見出し4
#####見出し5
######見出し6
```

ちなみに見出し7以上を記載した場合は以下の結果となります。
「#」は6つ引いた数が表示されます。

```text:記述例
#######見出し7
##########見出し10
```

#######見出し7
##########見出し10

##箇条書きリストの書き方
リストの書き方は何種類かあり、「\*」「+」「-」「数字」でリストを記載できるます。
但し、「\*」「+」「-」「数字」の後ろはスペースをあけない場合は表示が上手くできないことがあるので注意が必要です。

+ 「\*」を使用した場合

> ```text:記述例
> * リスト１
> * リスト２
> * リスト３
> ```
>> * リスト１
>> * リスト２
>> * リスト３

+ 「+」を使用した場合

> ```text:記述例
> + リスト１
> + リスト２
> + リスト３
> ```
>> + リスト１
>> + リスト２
>> + リスト３

+ 「-」を使用した場合

> ```text:記述例
> - リスト１
> - リスト２
> - リスト３
> ```
>> - リスト１
>> - リスト２
>> - リスト３

+ 「数字」を使用した場合

> ```text:記述例
> 1. リスト１
> 1. リスト２
> 1. リスト３
> ```
>> 1. リスト１
>> 1. リスト２
>> 1. リスト３

+ 箇条書きネストの場合

ネストする場合は「\*」「+」「-」で記載すると下記のようにネスト表示が可能です。
> ```text:記述例
> * リスト１
>  + ネスト２
>      - ネスト２
> ```
>> * リスト１
>>  - ネスト１
>>      - ネスト２

+ 番号付きネストの場合

> ```text:記述例
>1. 番号付きリスト1
>    1. 番号付きリスト2
>        1. 番号付きリスト3
>        1. 番号付きリスト4
>    1. 番号付きリスト5
>1. 番号付きリスト6
> ```
>>1. 番号付きリスト1
>>    1. 番号付きリスト2
>>        1. 番号付きリスト3
>>        1. 番号付きリスト4
>>    1. 番号付きリスト5
>>1. 番号付きリスト6

#文字の装飾

+ 太字

> ```text:記述例
> 強調したい文字を**太字**で表示します。
> 強調したい文字を__太字__で表示します。
> ```
>> 強調したい文字を**太字**で表示します。
>> 強調したい文字を__太字__で表示します。

+ 取り消し線

> ```text:記述例
> 消したい文字を~~取り消し~~で囲みます。
> ```
>> 消したい文字を~~取り消し~~で囲みます。

+ 注釈

> ```text:本文の記述例
> この文章に注釈を記載します。[^1]
> この文章に注釈を記載します。[^^注釈]
> この文章に注釈を記載します。[^^^example]
> ```
> ```text:注釈の記述例
> [^1]: この文章は1つめの注釈です。
> [^^注釈]: この文章は2つめの注釈です。
> [^^^example]: この文章は3つめの注釈です。
> ```
>> この文章に注釈を記載します。[^1]
>> この文章に注釈を記載します。[^^注釈]
>> この文章に注釈を記載します。[^^^example]
>> ※注釈の位置は途中に記載していても記事の最後に記載されます。

[^1]: この文章は1つめの注釈です。
[^^注釈]: この文章は2つめの注釈です。
[^^^example]: この文章は3つめの注釈です。

* 水平線

数やスペースは関係なく水平線が表示できます。
> ```text:記述例
> ***
> * * *
> ---
> ----------
> ```
>> ***
>> * * *
>> ---
>> ----------

*　チェックボックス
チェックボックスにチェックするには編集権限を持つユーザが閲覧するとチェック可能となるようです。

> ```text:記述例
> - [x] チェックボックスオフ
> - [x] チェックボックスオン
> ```
>> + [ ] チェックボックスオフ
>> + [x] チェックボックスオン


#書いてみた感想

普段使いそうなMarkdownを記載してみました。
慣れるまで苦戦しそうな感じもありますが、慣れてしまえば簡単に書けるようになると感じました。
まだ始めたばかりなので、備忘録も含めてこれからも投稿を継続していきます。

#次回やりたいこと

今回は見出しや文字装飾にチャレンジしましたが、次回はテーブル作成とコード挿入の備忘録を投稿できればと考えています。
少しずつできることを増やしていけるように頑張ります。
ターミナルからweka を使用　--memo

#目的
wekaの機械学習ツールをターミナルから利用する。
#環境
OS: macOS Sierra(10.12.6)
weka: 3.6.10
java: 9.0.1

#wekaのpathを確認
weka.jar が置かれているpathを確認する。

```:terminal
$ pwd
/Applications/weka-3-8-1-oracle-jvm.app/Contents/Java
```
# XMeansの実行
clustering のXMeansを実行する。
<>で囲ってあるのは各自の環境に合わせて修正する。
※　javaをインストールしておくこと。

```
$ java -cp <path>weka.jar weka.clusterers.XMeans -t <fail.arff>
```
#K-means
-N <number> : クラスターの数
 
```
$java -cp <path>weka.jar weka.clusterers.SimpleKMeans -t <filename>.arff -N 2
```
rsyncでinodeの節約バックアップ （--link-destオプション）


## やりたいこと
rsyncで何日間分かのバックアップをとるときに、サーバのディスク容量(inode)とか節約したい

## 環境

#### サーバ構成
server01: データサーバ
server02: バックアップサーバ

#### 対象データ(server01)
```console:server01
$ ls -1 data
file1
file2
```

## 節約できてないやり方。

#### (1) ある日（10/22）のバックアップ
```console:server01
$ rsync -a data/ server02:~/data_20171022
```

```console:server02
$ ls -1 data_20171022/
file1
file2
```

#### (2) 次の日（10/23）のバックアップ
```console:server01
$ rsync -a data/ server02:~/data_20171023
```

```console:server02
$ ls -1 data_20171023/
file1
file2
```

バックアップできてるけど、inodeが22日と23日で違う

```console:server02
$ ls -1i data_2017102*/
data_20171022/:
923274 file1
923275 file2

data_20171023/:
923277 file1
923278 file2
```


## 節約できてるやり方。

#### (1) ある日（10/22）のバックアップ

※ここは同じ

```console:server01
$ rsync -a data/ server02:~/data_20171022
```

```console:server02
$ ls -1 data_20171022/
file1
file2
```

#### (2) 次の日（10/23）のバックアップ

※--link-destを使用

```console:server01
$rsync -a data/ server02:~/data_20171023 --link-dest=../data_20171022
```

```console:server02
$ ls -1 data_20171023/
file1
file2
```

inodeが22日と23日で同じになって節約できた

```console:server02
$ ls -1i data_2017102*/
data_20171022/:
1053235 file1
1053236 file2

data_20171023/:
1053235 file1
1053236 file2
```


### 備考
- --link-destはバックアップするディレクトリからの相対パス<br>
  →[追記] rsync対象が絶対パスなら--link-destに指定するパスは絶対ぱすでもいいような気もする。
- -aオプションを付けなくてはだめ。(具体的には-t) ←これがわからなくて嵌った。
styled-components デザインパターン

実際の現場で使えるstyled-componentsのデザインパターンを紹介します。
なお、styled-componentsのみで完結するパターンについて記述しており、他のライブラリと組み合わせるようなパターンについては紹介しません。
随時更新・追加していきます。

## :nail_care:  基本パターン

styled-componentsは、reactのコンポーネントに与えられたpropsを参照し、propsに応じてstyleを出し分けることが可能です。

```js
const Button = styled.button`
  background: ${props => props.primary ? 'palevioletred' : 'white'};
  color: ${props => props.primary ? 'white' : 'palevioletred'};

  font-size: 1em;
  margin: 1em;
  padding: 0.25em 1em;
  border: 2px solid palevioletred;
  border-radius: 3px;
`
```
公式サイトでも紹介されている基本的なやりかたですね。

でも実際のプロダクトでは、色々なUIパターンや例外が出てきたりとこんな簡単にはいきません。この記事では、styled-componentsをプロダクションコードで何度か使ってきた経験から、実際のUI実装で使えるデザインパターン的なものを紹介します。


## :nail_care: propsによって多くのプロパティが変わる時
primaryかどうかでbackground,color,padding…といくつものプロパティが変わるような場合です。
`css`関数を使うことで複数のプロパティが変わるパターンを楽に書けます。
※ただし、あまりに多くのプロパティが変わる場合は別コンポーネントとみなして分けることも考えましょう。

```js
const Button = styled.button`
  font-size: 1em;
  margin: 1em;
  border: 2px solid palevioletred;
  border-radius: 3px;

  ${props => props.primary ? css`
    background: 'palevioletred';
    color: 'white';
    padding: 0.5em 2em;
  ` : css`
    background: 'white';
    color: 'palevioletred';
    padding: 0.25em 1em;
  `}
`
```

## :nail_care: 例外パターンに対応する拡張
うまい具合にデザインシステムができてきたと思ったら、突然変異のような例外コンポーネントが出てくるときってありますよね。
そういうときは、例外に元のコンポーネントでは対応せず、使う場所でstyled.extendで拡張しましょう。

```js
import Button from '../atoms/Button'

const ExtendedButton = Button.extend`
  background: 'blue';
  padding : 3em;
  border-radius: 4px;
`

// StyledComponentクラスでない場合
const ExtendedButton = styled(Button)`
  background: 'blue';
  padding : 3em;
  border-radius: 4px;
`
```
なお、`extend`はStyledComponentクラスのインスタンスに対してしか使えないので、functionalコンポーネント等の場合は`styld(Button)`とすることで同様の拡張ができます。

## :nail_care: バリエーションが多い時
タグのようなコンポーネントは５色７色とバリエーションが多くなることがあると思います。
そのような場合、幾つかの解決方法があります。

### functionを作って切り出す
propsを受け取ってバリエーションを出し分ける関数を作る方法です。

```js
const Tag = styled.span`
  font-size: 1em;
  border: 1px solid #ddd;

  ${props => getTagColor(props)}
`

const getTagColor = props => {
  if (props.caseA) {
    return `
      color: red;
    `
  } else if (props.caseB) {
    return `
      color: blue;
    `
  } else if (props.caseC) {
    return `
      color: yellow;
    `
  }
}

// usage
<Tag caseA/>
<Tag caseB/>
<Tag caseC/>
```

### カラーパレットをオブジェクトとして定義する
propsに応じて影響するプロパティが１つに定まる場合、propsに対応するvalueを定義するオブジェクトをつくることでエレガントに書くことができます。

```js
const Tag = styled.span`
  font-size: 1em;
  border: 1px solid #ddd;
　　　　color: ${colors[props.type]};
`

const colors = {
  caseA: 'red',
  caseB: 'blue',
  caseC: 'yellow'
}

// usage
<Tag type='caseA'>
<Tag type='caseB'>
<Tag type='caseC'>
```

## :nail_care: 共通するスタイルをmixinで定義する
sassなどのmixinと同じようなことを `css`関数を使ってできます
ちなみに、styled-componentsチームでメンテナンスしている[polished](https://polished.js.org/)というライブラリはmixinそのものです。

```js
// 赤い下線を引くmixin
const underLine = styled.css`
  background: linear-gradient(transparent 50%, red 50%);
`

// usage
const Text = styled.p`
  font-size: 12px

  ${underLine()}
`
```
powershell csvファイルを読み込んでフォルダ作成

したいこと：
サーバの移行の際にデータコピーする準備として。
既存フォルダの一覧を作成して、それを基にフォルダ作成する
今回は自宅PCで試作

フォルダのみ検出してCSVファイルに書き出し
PS C:\Users\user\Desktop> Get-ChildItem -Recurse | where{$_.mode -match "d"} | Export-Csv result.csv -Encoding utf8
PS C:\Users\user\Desktop> cd ../

書き出したCSVファイルを元にフォルダを作成
PS C:\Users\user> Import-Csv c:\Users\user\Desktop\result.csv | ForEach-Object{mkdir $_.BaseName}
MapR on CentOS6.9/KVM(vagrant + libvirt plugin)

# MapR on CentOS6.9/KVM(vagrant + libvirt plugin)

## いきさつ

- https://qiita.com/bigt23/items/26f56b73df8996ede61b

こちらを参考にさせていただきました。

が、CentOS6 かつメモリも私のクライアントPCに乗ってる 8GB では足りない要件で構築する必要があったので、今回自分用に書き出してみました。

## 環境

- ホスト
    - Ubuntu14.04
    - メモリ 32GB
    - KVM
    - vagrant
    - NIC
        - br0 192.168.100.5
- ゲスト
    - CentOS6.9
    - メモリ 12GB (インストール時 必要であれば増やす)
    - Disk1 100G (vagrant の box は 40G 必要であれば増やす)
    - Disk2 200G
    - NIC
        - Bridge (ホストの br0 にブリッジさせます)

## 手順

### Vagrantfile

```
Vagrant.configure(2) do |config|
  config.vm.define :vm1 do |vm1|
    vm1.vm.box = "centos/6"
    vm1.vm.network :public_network, :dev => 'br0', :mode => 'bridge', :type => 'bridge'
#    vm1.vm.provision :shell, path: "bootstrap.sh"
    vm1.vm.provider :libvirt do |domain|
      domain.memory = 12288
      domain.cpus = 2
      domain.machine_virtual_size = 100
      domain.storage :file, :size => '200G'
    end
  end
end
```

### ゲスト起動

```
vagrant up ; vagrant ssh
```

### JDK インストール

- ここでインストールしなかった場合はインストーラ内で java-1.8.0 がインストールされました。
- 1.7 などを使いたい場合は先にインストールしておきます。

```
sudo yum -y update
sudo yum -y install java-1.7.0-openjdk-devel java-1.7.0-openjdk
```

### ホスト名設定

- 参照元記事にもありましたが名前解決は重要です。(インストーラで弾かれます。)

```
sudo vim /etc/hosts
sudo vim /etc/sysconfig/network
hostname -f
```
```shell-session:sample
192.168.100.171 mapr01.local mapr01

HOSTNAME=mapr01.local
```
```
vagrant reload ; vagrant ssh
```

### sudo 設定

- インストールの実行中に mapr ユーザが sudo 可能な必要があります。
- テスト環境ということもあるので mapr に NOPASSWORD で sudo 可能に設定しました。

```
sudo visudo

mapr	ALL=(ALL)	NOPASSWD: ALL
```

### 認証設定

- Web ブラウザ経由でインストールするのですが パスワード もしくは 鍵認証 で接続する必要があります。
- ゲスト上に authorized_keys を、ブラウザを起動するクライアント上に 秘密鍵(id_rsa) を準備します。
 
```
sudo su - mapr
vi .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
exit
```

### MapR インストーラ起動

```
sudo wget http://package.mapr.com/releases/installer/redhat/mapr-setup.sh -P /tmp
sudo bash /tmp/mapr-setup.sh -y
```

### MapR インストール

- mapr ユーザーに対して SSH認証 可能に設定したクライアントPCのWebブラウザを起動します。
- https://{IPAddress}:9443 名前解決させていたら https://{ホスト名}:9443 にアクセスします。
- あとはGUIでぽちぽち進めます。

### Install Addition

- フリーライセンスでインストールするには MapR にアカウント登録が必要です。
    - インストーラの途中で可能なので必要に応じて登録してください。
    - gmail などのフリーアドレスで可能かは試してません…
- インストールファイル群は割りとサイズが大きいので高速なインターネット環境で実施するのをおすすめします。

### Have fun :)