OmniAICreator/Qiita-1.07M huggingface dataset:
[HTTP] note of Text-based / Binary protocol

| | HTTP/1.x | HTTP/2 |
| --- | --- | --- |
| format | textual | binary |
| oriented | text strings | data structures |
| ex. 15 | ASCII for **char '1'**: 00110001<br />ASCII for **char '5'**: 00110101 | 00001111 |

### The Pros and Cons of Binary Protocols

> ASCII protocols are easy to inspect and get started with. However, they are not very efficient and are typically harder to implement correctly: optional whitespace, varying termination sequences, and other quirks make it hard to distinguish the protocol from the payload and lead to parsing and security errors. By contrast, while binary protocols may take more effort to get started with, they tend to lead to more performant, robust, and provably correct implementations.
HTTP/2 uses binary framing. As a result, you will need a tool that understands it to inspect and debug the protocol—e.g., Wireshark or equivalent. In practice, this is less of an issue than it seems, since you would have to use the same tools to inspect the encrypted TLS flows—which also rely on binary framing (see TLS Record Protocol)—carrying HTTP/1.x and HTTP/2 data. 

## Binary Framing
### HTTP/2 binary framing layer
<img src="https://hpbn.co/assets/diagrams/ae09920e853bee0b21be83f8e770ba01.svg" alt="Figure 12-1. HTTP/2 binary framing layer">
> The "layer" refers to a design choice to introduce a new optimized encoding mechanism between the socket interface and the higher HTTP API exposed to our applications: the HTTP semantics, such as verbs, methods, and headers, are unaffected, but the way they are encoded while in transit is what’s different. Unlike the newline delimited plaintext HTTP/1.x protocol, all HTTP/2 communication is split into smaller messages and frames, each of which is encoded in binary format.

### Common 9-byte frame header
<img src="https://hpbn.co/assets/diagrams/2a9b83c6b43e961a41a847c3227dcad2.svg" alt="Figure 12-7. Common 9-byte frame header">

- The 24-bit length field allows a single frame to carry up to bytes of data.
- The 8-bit type field determines the format and semantics of the frame.
- The 8-bit flags field communicates frame-type specific boolean flags.
- The 1-bit reserved field is always set to 0.
- The 31-bit stream identifier uniquely identifies the HTTP/2 stream.

> Technically, the length field allows payloads of up to 2\*\*24 bytes (~16MB) per frame. However, the HTTP/2 standard sets the default maximum payload size of DATA frames to 2\*\*14 bytes (~16KB) per frame and allows the client and server to negotiate the higher value. Bigger is not always better: smaller frame size enables efficient multiplexing and minimizes head-of-line blocking.

## ref.
- [binary protocols v. text protocols](https://stackoverflow.com/a/2645168/4436392)
- [HTTP/2](https://hpbn.co/http2/)
- [Head of Line blocking (HOL)](https://community.akamai.com/community/web-performance/blog/2017/08/10/how-does-http2-solve-the-head-of-line-blocking-hol-issue)
- [Head of Line Blocking - High Performance Web 2015](https://qiita.com/Jxck_/items/0dbdee585db3e21639a8)
Docker Compose で eZ Platform を起動する

なんだかんだとセットアップが手間な eZ Platform ですが、実は Docker Compose で手軽に起動できる YAML ファイルが用意されています。

通常のインストール手順は以下から参照してください。
https://qiita.com/tags/ezplatform

## 構築環境
* CentOS 7.4.1708 (minimal)
    * Docker 17.12.1
    * Docker Compose 1.19.0
        * Debian GNU/Linux 8 (jessie)
            - [eZ Platform 1.12.2](https://github.com/ezsystems/ezplatform/releases/tag/v1.12.2)
            - MariaDB 10.0.34
            - PHP 7.0.27
            - nginx 1.12.2

## Docker / Docker Compose
CentOS 7.4.1708 に Docker 17.12.1 と Docker Compose 1.19.0 をインストールします。

```bash
yum -y install epel-release && yum -y update && yum -y install yum-{axelget,plugin-rpm-warm-cache,utils} && \
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo && \
yum -y install docker-ce && systemctl start docker && systemctl enable $_ && \
curl -L $(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep download_url | grep 'Linux-x86_64"' | cut -d'"' -f4) \
 -o /usr/local/bin/docker-compose && chmod +x $_
```
## eZ Platform
[doc/docker/README.md](https://github.com/ezsystems/ezplatform/blob/master/doc/docker/README.md) に基づいてセットアップします。

```bash
ver=1.12.2 && \
curl -LO https://github.com/ezsystems/ezplatform/archive/v${ver}.tar.gz && \
tar xf v${ver}.tar.gz && chmod -R 777 ezplatform-${ver} && cd $_ && \
docker-compose -f doc/docker/install.yml up --abort-on-container-exit && \
docker-compose up -d --force-recreate && \
docker-compose ps
```

以上で http://192.168.56.101:8080/ でアクセスできるようになります。
ESP32で外付けDACを使う

#概要
トランジスタ技術(2017年11月号)の記事を見てh_nariさんの「[ESP32でI2S+DACを使う](https://qiita.com/h_nari/items/b52c525f0c5b35aaf692)」を知りました。
ちょうど、ヘッドフォンアンプを作成中だったので音源として使わせて頂いていましたが、CDくらいの音質が欲しかったため外付けDAC(PCM5102A)から音声を出力できるようにしました。

#サンプル・プログラム
ESP-IDFの開発環境でgitが使えたので初めてGithubでプログラムを公開しました。

・プログラム・ソース (GitHub)
[https://github.com/od1969/ESP32_bt_I2S/](https://github.com/od1969/ESP32_bt_I2S/)

#変更点
以下の2つの関数内を変更しました。
参考にしたのは[ESP-IDF Programming Guide I2Sのページ](http://esp-idf.readthedocs.io/en/latest/api-reference/peripherals/i2s.html)の記述です。

```c:i2sdac.c
void i2sdac_init()
{
  i2s_config_t i2s_config;
  
  static const i2s_pin_config_t pin_config = {
    .bck_io_num = 26,
    .ws_io_num = 25,
    .data_out_num = 27,
    .data_in_num = I2S_PIN_NO_CHANGE
  };
  
  
  i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER|I2S_MODE_TX);
  i2s_config.sample_rate = SAMPLE_RATE ;
  i2s_config.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT;
  i2s_config.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT;
  i2s_config.communication_format = I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB;
  i2s_config.dma_buf_count = DMA_BUF_COUNT;
  i2s_config.dma_buf_len = DMA_BUF_LEN; 
  i2s_config.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1;
  
  i2s_driver_install(I2S_NUM, &i2s_config, 0, NULL);
  i2s_set_pin(I2S_NUM, &pin_config);
  
}

void i2sdac_write(const uint8_t *data, uint32_t len)
{
  TickType_t delay = 50 / portTICK_PERIOD_MS;

  if(len % 8){
    ESP_LOGE(TAG,"unexpected data len:%u",len);
    return;
  }

  for(int i=0; i<len; i+= 4){
    uint16_t d[2];
    
    d[0] = data[i+0]|(data[i+1] << 8);
    d[1] = data[i+2]|(data[i+3] << 8);
    
    int n = i2s_push_sample(I2S_NUM, (const char *)d, delay);
    if(n < 0)
      ESP_LOGE(TAG, "i2s_write_bytes error:%d",n);
  }
}
```

#回路図
ESP32-DevKitCとRaspberry Pi用のPHAT DACをジャンパーワイヤーで接続しています。
![ESP32_DAC.jpg](https://qiita-image-store.s3.amazonaws.com/0/106409/8140d627-477f-dfe2-0927-16ded8e6b704.jpeg)

ESP32-DevKitC　→　PHAT DAC
5V　→　5V
GND　→　GND
IO26 →　BITCLOCK(GPIO18)
IO25 →　LRCLOCL(GPIO19)
IO27 →　DATAIN(GPIO20)

ESP32側はソフトウェアで変更可能です。

#開発環境
トランジスタ技術(2017年11月号)の記事及び以下のQiitaの記事を参考に開発環境を構築しました。
[ESP32(ESP-WROOM-32)でLチカ (WindowsでESP-IDF使用)](https://qiita.com/rukihena/items/d226972972a360fc2648)
[ESP-IDF の環境をWindows10につくる](https://qiita.com/zinziroge/items/e3e4663183d54cc689a7)

#注意点(2017/10/24時点)
最新のEspressif toolchain及びESP-IDFを使うと動かないみたいです。(延々ノイズが出る等。
Espressif toolchain([20170330版](https://dl.espressif.com/dl/esp32_win32_msys2_environment_and_toolchain-20170330.zip)),[ESP-IDF Release v2.1](https://github.com/espressif/esp-idf/releases/tag/v2.1)を使用した所うまく動きました。
3分で分かった気になる、Kubernetes とは？

マイクロサービスやDockerの話になるといつも出てくるのが、Kubernetes(クーバネティス)。

奥深そうな技術ではあるが、Kubernetesとは？をあさーく簡単にまとめてみた

## 概要

- Dockerコンテナをクラスタ化した際の運用ツールの１つ
- Googleが中心になって開発してる（Go + シェルスクリプト）
- 自動デプロイ、スケーリング、アプリ・コンテナの運用自動化ができる
- マイクロサービスと相性が良い
- 管理上の基本単位はPodという
  - Volume：記憶領域を共有するコンテナの集まり
   - Container
  - IP ADress
- 試すなら、GKE(Google Kubernetes Engine)を使うのが良さそう

↓こんな画面らしい
![](https://d33wubrfki0l68.cloudfront.net/e6bda94ebf94cc460db5cdc42bbfdb8f95f5f7ce/fd28b/images/docs/ui-dashboard.png)

↓8分くらいの動画。わかりやすいらしい（見てない）

[よい子のためのKubernetes絵本」動画](https://youtu.be/4ht22ReBjno)

## なぜ必要とされたのか？

- Dockerは、ホスト内のコンテナ同士はやりとりできるが、外側とのやりとりにNATが必要
- したがって、ホスト間の連携が煩雑になるため、容易にスケールアウトできない
- そこで出てきたのがKubernetes

## Kubernetesでできること

- 複数台のホストから構成される実行環境を、１台の実行環境のように扱うことができる
- 運用中のコンテナに不具合があってサービスがダウンした時に、状態変化を察知し、いい感じにしてくれる
  - 問題の発見に遅れる可能性があるかも
- Docker/Kubernetes環境でマイクロサービス化を推進すると、様々な部品を独立してデプロイ出来るようになる

### つまり

- アプリを迅速に予定通りにデプロイする
- 稼働中にアプリをスケールする（規模を大きくする）
 
## 構成要素

- マスター・コンポーネント
  - クラスタの制御を待ち受けるもの
  - クラスタ全体に関わる決定を行う
- ノード・コンポーネント
  - 全てのノードで実行される 

次はハンズオンをやりながら理解を深める予定

## 参考サイト

- [Docker（コンテナ型仮想化）と Kubernetes についての簡単な紹介](https://ubiteku.oinker.me/2017/02/21/docker-and-kubernetes-intro/)
- [今さら人に聞けない Kubernetes とは？](https://qiita.com/MahoTakara/items/85096f8b2632c802ab22)
3分で分かった気になる、Elasticsearchとは？ 

ログ解析等でよくElasticsearch+kibanaが使われているが、改めてElasticsearchとは？を簡単にまとめた。

## 概要

- Elastic社が開発している、スケーラビリティに優れた全文検索エンジン
- リアルタイムデータ分析、ログ解析、全文検索など様々な分析が可能になる
- ログ集約のLogstashやfluentd、可視化ツールのkibanaと一緒に使われることが多い
- 複数のデータベースを横断して検索することが、ごく当たり前の用途として提供されている

## RDBの違い

### RDB:
- データを安全に保管し、汎用的に利用するための機能が豊富
- データベースをドロップすることはなかなかない
- マスターとなるデータを半永久的に保管する

### Elasticsearch:
- 検索のパフォーマンスとスケーラビリティが強い
- 時間間隔でインデックスを区切ったりすることがよくある
- 不要になったインデックスは捨てる
- 分析や検索用のデータを保管する

### それぞれ呼び方の違い

|RDB|Elasticsearch|
|:--|:--|
|データベース|インデックス|
|テーブル|マッピングタイプ|
|カラム（列）|フィールド|
|レコード(行)|ドキュメント|

## 使い方の基礎

[第４回 Elasticsearch 入門 検索の基本中の基本](https://medium.com/hello-elasticsearch/%E7%AC%AC%EF%BC%94%E5%9B%9E-elasticsearch-%E5%85%A5%E9%96%80-%E6%A4%9C%E7%B4%A2%E3%81%AE%E5%9F%BA%E6%9C%AC%E4%B8%AD%E3%81%AE%E5%9F%BA%E6%9C%AC-36ebb85d0afe)

- サーチAPIを利用して様々な検索を行う
  - 検索やデータの投入、削除はJSON形式で指定することができる
- 本番環境の検索はエイリアス名を使う
  - 複数のインデックスに同じ名前のエイリアスを定義することができる
  - したがって、１つのエイリアスを指定するだけで複数のインデックスを検索できる
- ページング
  - sizeとfromを使う
  - size:１度の検索結果を取得する数をしている。デフォルトは１０
  - from:スキップする結果数を指定：デフォルトは０


## 検索のパワーをフル活用するなら

以下の知識が必要っぽい

- Mapping:フィールドの型や分析方法の設定
- Analysis：言語処理や正規化などのフィールドの値の加工について
- Query DSL：JSONフォーマットによる検索条件の組み立て

### 参考記事

- [Hello! Elasticsearch](https://medium.com/hello-elasticsearch)

- [データベースとしてのElasticsearch](https://qiita.com/rjkuro/items/95f71ad522226dc381c8)

- [elasticsearchを全文検索サーバとして活用するなら読んでおきたい、6つのブログ記事をピックアップ](http://y-ken.hatenablog.com/entry/essential-japanese-blogs-for-elasticsearch-study)
Screen コマンドによる Linux ターミナル共有

- 参考
  - みやすい概要 - https://mistymagich.wordpress.com/2011/11/08/multiuser_screen_command
  - multiuser mode 権限制御系操作 - http://aperiodic.net/screen/multiuser
- 概要
  - Screenコマンドを使うと、Linuxコンソールを複数ユーザセッション間で共有できます。
- ユースケース
  - Devチームのペアプログラミングよろしく、Opsチームにも部下育成やダブルチェックを兼ねて、Linuxサーバオペレーションを複数名で行う場合があります。そんな時は、物理コンソールに人が集まって行うのもよいですが、ターミナルのセッションをSSHで皆が共有できるScreenを使うと捗ります。
- 環境例
  - Debian Jessie +
  - 共有元ユーザ: parent
  - 共有先ユーザ: child

# 事前準備
- screen インストール

```bash:sudoer_console
sudoer@test:~$ sudo apt-get update && sudo apt-get install screen
```

- screen セッションを各ユーザで共有可能にする設定

```bash:sudoer_console
sudoer@test:~$ sudo chmod u+s /usr/bin/screen
sudoer@test:~$ sudo chmod 755 /var/run/screen
``` 

# セッション公開

- screen セッション share を立てる

```bash:parent_console
parent@test:~$ screen -S share
```

- childユーザへ share セッションを共有する

```bash:parent_console
parent@test:~$
(Ctrl+a) 
:multiuser on
Multiuser mode enabled
parent@test:~$
(Ctrl+a) 
:acladd child
parent@test:~$
```

# セッション参加
 
- parent ユーザが立てたscreenのセッション名を確認し、乗り込む

```bash:child_console
child@test:~$ screen -ls parent/
There is a suitable screen on:
        1448.share      (03/07/2017 10:49:09 AM)        (Multi, attached)
1 Socket in /var/run/screen/S-parent.
child@test:~$ screen -x parent/share
```
 
# ログアウトとデタッチの動作

  - parent ユーザが screen セッションとして起動されているloginセッションからログアウトする

```bash:parent_console
parent@test:~$ exit
[screen is terminating]
parent@test:~$
```

  - child ユーザが screen セッションとして起動されているloginセッションからログアウトする

```bash:child_console
parent@test:~$ exit
[screen is terminating]
child@test:~$
``` 
 
- parent ユーザが screen セッションshareをデタッチする


```bash:parent_console
parent@test:~$
(Ctrl+A) (d)
[detached from 1448.share]
parent@test:~$
```
 
- child ユーザが screen セッションshareをデタッチする

```bash:child_console
parent@test:~$
(Ctrl+A) (d)
[detached from 1448.share]
child@test:~$
```
【PHP構文理解度クイズ】このコードの中で構文エラーになる行はどこ？

10行からなる次のPHPコードを実行すると必ず「Parse error: syntax error」になるが、このエラーは何行目で発生するか？ なお、PHPのバージョンは7.1.8とする。

```php
<?php
$a = [1, 2, 3];
if (3 === count($a)) {
	foreach ($a as $x => $y):
		echo 'A','B','C' . $x;
		preg_match(/[0-9]+/, $y);
	endforeach;
} elseif ($b()()[0])
	return 2017-10-21;
PHP is a popular general-purpose scripting language
```
Raspberry pi とカメラモジュールを使った画像保存(とおまけに動画)

(作成日　2017/10/20)
いつか機械学習に使う用に、Raspberry piとカメラモジュールを使って画像撮影をできるようにしたので、メモ保存用に。

#画像保存

```python:camera.py
import time
import picamera

with picamera.PiCamera() as camera:
    camera.resolution = (1024,768)
    camera.start_preview()
    time.sleep(5)
    camera.capture('picture.jpg')
```

**MEMO** --------------------------------------------------
**1.解像度について**
`camera.resolution = (x,y)`の値を変えても解像度が変更できそうだが、[Picamera](https://picamera.readthedocs.io/en/release-1.13/index.html)公式のPageより`camera.capture('picture.jpg',resize=(300,300))`も使用可能


**2.OpenCVとの連携について**
OpenCVを使用する場合は、どうやらOpenCV objectで保存してくれるようにできるらしいのでこれも[Picamera](https://picamera.readthedocs.io/en/release-1.13/recipes2.html)を参考にする。

**3.設定できる値について**
[ラズパイHP](https://www.raspberrypi.org/documentation/usage/camera/python/README.md)によると他にも以下の設定ができるらしい(ちなみに、以下の値がDefault Value)

>camera.sharpness = 0
camera.contrast = 0
camera.brightness = 50
camera.saturation = 0
camera.ISO = 0
camera.video_stabilization = False
camera.exposure_compensation = 0
camera.exposure_mode = 'auto'
camera.meter_mode = 'average'
camera.awb_mode = 'auto'
camera.image_effect = 'none'
camera.color_effects = None
camera.rotation = 0
camera.hflip = False
camera.vflip = False
camera.crop = (0.0, 0.0, 1.0, 1.0)
>

_[ラズパイHP](https://www.raspberrypi.org/documentation/usage/camera/python/README.md)より引用_

#動画保存(ついでに）

```python:camera.py
import time
import picamera

camera = picamera.PiCamera()
camera.resolution = (640,480)

camera.start_preview()
time.sleep(2)

camera.start_recording('video.h264')
camera.wait_recording(5)

camera.stop_recording()
camera.stop_preview()

```

**MEMO** --------------------------------------------------
動画はコードのみ。一応これで記録できそう。
一発で Android を 再起動する USB ボタン を作ってみた

# Overview

家の中にAndroid deviceが増えてきました。

Androidは、Low memory killerとかにより、メモリーを一定量確保する仕組みがあり、常に使い続けていてもちゃんと動き続けくれます。

そうはいっても、ソフトウェア。たまに再起動してあげると、キビキビ動くのも事実。

設定→再起動とかするのも面倒なので、ボタン一発で再起動するボタンを作ってみた。

# 用意するもの

## ハードウェア

AtmelのATtiny85を搭載したDigiSparkは、V-USBを利用しているようで、ArduinoからUSB一発で焼くことができる (ISPなど不要).

ピンも少ないので、今回のような用途には非常に役に立ちます。

DigiSparkやその互換品 (ATtiny85などでAmazonとかでも売っています) [200円くらい。](https://www.amazon.co.jp/s/ref=nb_sb_noss_2?field-keywords=ATtiny85)

Pin2を、10kΩぐらい経由でTact SWが押されたときにGNDに落ちるようにします。

![IMG_5613.JPG](https://qiita-image-store.s3.amazonaws.com/0/100425/b248dbb2-3fa6-e054-58cb-e4a23e770f8a.jpeg)

![IMG_5614.JPG](https://qiita-image-store.s3.amazonaws.com/0/100425/d41a812b-6eb2-65ad-9a04-5695067112bc.jpeg)

## ソフトウェア

DigiSparkは、USB HIDを作るのに非常に適した環境を用意してくれています。

```
#include <DigiKeyboard.h>
```

しておけば、

```
#define KEY_DELETE 76

DigiKeyboard.update();
DigiKeyboard.sendKeyStroke(KEY_DELETE, MOD_ALT_LEFT | MOD_CONTROL_LEFT);
```

これだけで、Ctrl+Alt+Deleteを発行できます。

はい、そうです。Androidは、なんと、Ctrl+Alt+Delで再起動するのです。

というわけで、USB HID deviceを作って、これを送信してやろうというのが今回の試みです。

https://github.com/hidenorly/androidRebootSwitch

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

Happy Android Life!


# Appendix

* [DigiSpark Tutorial](http://digistump.com/wiki/digispark/tutorials/connecting)
* [Atmel technical reference](http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-2586-AVR-8-bit-Microcontroller-ATtiny25-ATtiny45-ATtiny85_Datasheet.pdf)
* [DigiKeyboard.h](https://github.com/digistump/DigisparkArduinoIntegration/blob/master/libraries/DigisparkKeyboard/DigiKeyboard.h)
MacBook (13-inch, Aluminum, Late 2008)にUbuntuLinuxを使用する際のAirMacの設定について

この記事では、MacBook (13-inch, Aluminum, Late 2008)にUbuntuLinuxを入れてWi-Fiを設定する際の注意事項について記載します。

まず、最初にMacに装着されているAirMacのファームウェアのバージョンを確認します。

![スクリーンショット 2017-10-21 23.11.52.png](https://qiita-image-store.s3.amazonaws.com/0/196241/6f2c11da-4876-02df-1f73-f19d76a68af9.png)

上記画像のように、「Broadcom BCM43xx 1.0」であれば、下記５つのdebファイルをインストールします。

libfakeroot_1.20-3
fakeroot_1.20-3
module-init-tools_15-0
dkms_2.2.0.3-1.1
bcmwl-kernel-source_6.30.223.248

ダウンロード元
https://packages.ubuntu.com/trusty/amd64/libfakeroot/download
https://packages.ubuntu.com/trusty/amd64/fakeroot/download
https://packages.ubuntu.com/uk/trusty/all/module-init-tools/download
https://packages.ubuntu.com/trusty-updates/all/dkms/download
https://packages.ubuntu.com/trusty-updates/amd64/bcmwl-kernel-source/download

インストールする際は、「端末(Terminal)」を立ち上げて下記コマンドを使用します。パッケージを入力する際、Terminalに慣れていない人は、debファイルをドラッグ＆ドラップでTerminalの中に移すと、ファイルが保存されているディレクトリ（保存場所）が入力されます。そのまま、エンターキーを押すと、パスワードの入力を求められますので、入力します。なお、パスワードは表示されないため、何も入力されていないと勘違いされる方がいますが、入力はされています。

sudo dpkg -i libfakeroot_1.20-3ubuntu2_amd64.deb
sudo dpkg -i fakeroot_1.20-3ubuntu2_amd64.deb
sudo dpkg -i module-init-tools_15-0ubuntu6_all.deb
sudo dpkg -i dkms_2.2.0.3-1.1ubuntu5.14.04.9_all.deb
sudo dpkg -i bcmwl-kernel-source_6.30.223.248+bdcom-0ubuntu0.2_amd64.deb

最後のbcmwl-kernel-source_6.30.223.248+bdcom-0ubuntu0.2_amd64.debをインストールした後、メニューにあるWi-Fiのマークを入力すると、SSID(Wi-Fi名)が表示されますので、接続します。

もし、debファイル中にエラーが発生する場合は、そのエラー内容をGoogleで検索すると、同じ問題にぶつかったことのある人がいるので、それを参照します。

上記内容は、

https://ottan.xyz/os-x-ubuntu-dual-boot-2-1236/

このページを参考にしておりますが、この手順をとった際、「dkms_2.2.0.3-1.1」をインストールしている最中に「module-init-tools」がインストールされていない為、エラーが発生しました。
Mac OSにXAMPP7.1.10-0のインストール・設定

久しぶりに企業HPを作成するにあたり、ローカル環境としてXAMPPを使用することにした。
以前のXAMPPとは結構勝手が変わってたので設定方法などをメモしておく。

例ではバーチャルホスト環境にポート8081でアクセスするようにしている。

# ダウンロード

[ここ](https://www.apachefriends.org/jp/index.html)からインストーラをダウンロード。
今回はOSX向けを選択。

323MBと結構なサイズなので気長にダウンロード完了を待つ。

# インストール

ダウンロードしたインストーラ(dmgファイル)を起動して、XAMPPのアイコンををアプリケーションフォルダにD&D。

インストールまでは特別他のアプリと変わったことは無い。

# VM起動

XAMPPを起動すると、幾つかの確認メッセージが出るのでOKを押し先に進んでいく。
XAMPPが起動したら`start`ボタンを押してしばらく待つとVMが起動する。

以前まではVMが起動するのではなく、直でWebサーバが起動してた気がする。
ここは改善されてて良い感じ。

# ボリュームのマウント

`Volumes`タブに移動して`Mount`を選択する。
そうするとローカルのボリュームがマウントされて、設定ファイルの編集などが可能となる。
`Explore`ボタンを押すとマウントされた場所が開く。

# ホームページソースの移動

`Explore`で開いたディレクトリの直下にある`htdocs`の中にディレクトリを作成し、その中にホームページのソースをぶち込む。
ここを後ほど`DocumentRoot`に設定する。
VM上でWebサーバを動かしているため、マウントされていない場所をDocumentRootに指定することはできない。

# Apacheの設定

とりあえずバーチャルホストの設定をする。
公式FAQによると、設定ファイルの場所は以下の通り。

> Where are the main XAMPP configuration files?
> The main XAMPP configuration files are located as follows:
> 
> Apache configuration file: /opt/lampp/etc/httpd.conf, /opt/lampp/etc/extra/httpd-xampp.conf
PHP configuration file: /opt/lampp/etc/php.ini
MySQL configuration file: /opt/lampp/etc/my.cnf
ProFTPD configuration file: /opt/lampp/etc/proftpd.conf

```/opt/lampp/etc/httpd.conf
Listen 80

# 以下を追加
Listen 8081

# コメントアウトを外す。
Include etc/extra/httpd-vhosts.conf
```

上記のようにListenするポートを追加し、

```/opt/lampp/etc/extra/httpd-vhosts.conf

# 下の2つの設定はコメントアウト
# <VirtualHost *:80>
#     ServerAdmin webmaster@dummy-host.example.com
#     DocumentRoot "/opt/lampp/docs/dummy-host.example.com"
#     ServerName dummy-host.example.com
#     ServerAlias www.dummy-host.example.com
#     ErrorLog "logs/dummy-host.example.com-error_log"
#     CustomLog "logs/dummy-host.example.com-access_log" common
# </VirtualHost>

# <VirtualHost *:80>
#     ServerAdmin webmaster@dummy-host2.example.com
#     DocumentRoot "/opt/lampp/docs/dummy-host2.example.com"
#     ServerName dummy-host2.example.com
#     ErrorLog "logs/dummy-host2.example.com-error_log"
#     CustomLog "logs/dummy-host2.example.com-access_log" common
# </VirtualHost>

# これを追加
<VirtualHost *:8081>
    DocumentRoot "/opt/lampp/htdocs/busbar-j"
    ServerName localhost
</VirtualHost>
```

# ネットワーク設定

`Network`タブに移動して`Add`ボタンを押し、
`LocalPort`、`RemotePort`をともに`8081`に設定する。
`Require Local`と`Over SSH`のチェックはとりあえず入れない。

# apache再起動

`Service`タブに移動し、Apacheを選択後`Restart`する。

# アクセス

localhost:8081にブラウザなどから接続すると、配置したホームページが表示される。
パソコンができない友人にIllustratorを教えた際のメモ

飲食店を経営している友人にIllustratorの使い方を教えてくれと言われた。
面白いのでメモを残しておく。
パソコンができないと聞いていたが本当にできない。なので色々と新鮮だった。
最終的な目標はメニュー表を修正すること。
##最初に
友人から連絡があり、メニュー表を作りたいから良い方法を教えてくれと言われた。
事情を聞いたらメニュー表は今までデザイナーに頼んでいたが、忙しくなって頼みにくくなったとのこと。
結構な頻度でメニューを直すので、できれば自分で修正したいと言われた。
運が良いことに、そのデザイナーは元データも渡してくれた。
色々と聞いて、Illustratorを購入して作るとの結論に達しました。
で、責任を持って教えることにした。

費用が月額1,000円かと思ってたら以外に高かった。
Illustratorは2,180円／月だった。

友人のパソコンも自分のパソコンもMacだ。
##友人がやりたいこと
漠然に説明すると元データを修正するくらい。
具体的には以下のこと。

- 価格を変更する
- メニューの一部を複製する
- 写真を挿入する
- 料理を切り抜く
- 文字を入れる
- 囲われている線を伸ばす

この中の「料理を切り抜く」は教育のコストがかかりそうなので、外注したらいいと伝えた。
Photoshopでも簡単にできるけど、Photoshopを教えることと月額費用が増えることを考えたらそうなった。
そのコストを飲食店に使った方がいい。
一応補足だけど、Illustratorを覚えることもそうじゃないか？と思ったけど、名刺やフライヤーの修正などもできたら外注コストが安くなるとの結論だった。
紹介したのは以下のサイト。使ったことがあるから以外に特に理由は無い。
[切り抜きjp](http://www.kirinuki.jp/)
##インストールできなかった
最初にIllustratorがインストールできなかった。
嘘かと思ったけど本当にできなかった。
『家に帰ってから契約しても大丈夫だよ。契約後に出てくる画面に沿って行けばインストールできるはず。』と言ったけどできなかった。これは自分も悪いんだけど。
2017/10/21の段階でIllustratorインストールしようとしたら『システム要件を満たしていません。』のような画面が出てきてた。スクリーンをカメラで撮ったものを見せてもらった。色々大変だったのでこちらにバトンタッチした。電話の説明だとさすがに無理そうだったので最終的に遠隔操作をした。
IllustratorはAdobe Creative Cloud　をインストールしてから、そこ経由でインストールするんだけどそれもさすがにわかりにくかったと思う。
ちなみにIllustratorの最新版は2018なのでインストールできた最新版は2018だったので、本当にシステム要件を満たしていなかったっぽい。
なので**最初にインストールのところも一緒にやってあげれば良かったと後悔した。**
あとその友人にはAdobeのヘルプのページがわかりにくい。
##Illustratorの前にパソコンの専門用語とか略称を教える
専門用語を教えておく。
専門用語とか略称とか伝えてたら、あとで説明が楽なのだから。
大げさなものではなくコピペとか超基礎なとこ。
コピペとかはコピー&ペーストも教えて元々の意味もちゃんと教える。コピーは複製して、『ペーストはそれを貼り付けることだよ。』とか。そうしないと『コピペして。』って言ってもコピーするだけで止まってしまうことがある。
cmdがコマンド、optionがオプション、とかも教える。一緒にその略されている記号も教える。
Option (⌥) ←こんなやつ
そうしないと初心者向けの本も読めないし、ネットの記事も読めないこともあるから。
初心者向けの本の最初に書いてあるけど、だいたい最初の方は飛ばして読んでしまうので・・・
以下は教えること

- コピペとかドラッグ&ドロップとか超基本のこと
- Option (⌥)などの読み方やそれに対する記号
- winとmacでショートカットが違うこと
- cmd+z　などの色々なソフトで共通してるショートカット
- フォントの意味とか
- 拡張子の意味とか
- aiとpdfの違いや分けている意味や理由とか
- マウスを使ってもらうこと。(さすがにトラックパッドでは作りにくい)
- フォルダの作る場所とか(これはCCでストレージがあるからそこに作ってもらう。共有できるから楽です。)

今後に続く・・・
Windows環境下でHeadless ChromeをPython3とSeleniumで動作させるキモ

#はじめに
過去、Windows環境下でSeleniumとかPhantomJSを使ってスクレイピングしてきたのですが、ここにきて、「Headless Chromeというのがあって、その影響でPhantomJSの開発はストップした」といったことを耳にしました。
「じゃあ、Headless Chromeとやらをいじってみないと。。。」ということで、私物のMacでやってみて、意外に簡単にできることが確認できました。
が、どうもWindows環境下でのHeadless Chromeの動作についての記事をネット上とかでも目にしないし、書籍も出ていないようだし、私の職場環境はWindowsがメインだったりするので、いずれやっておく必要があると思い、試してみたらうまくいったので、そのメモをしておきます。
ポイントは、直接、chrome.exeに--headlessとか--screenshotとやってもちゃんと動いてくれないようなので、そこで諦めるのではなく、**ChromeDriverをかませれば、Seleniumから制御可能になる**、という点かと。

#やってみたこと
Windows10のPCに以下のソフトをインストールしました。

1.[Google Chrome](https://www.google.co.jp/chrome/browser/desktop/index.html)　私が実際に試したモノは「バージョン: 62.0.3202.62（Official Build） （64 ビット）」です。
2.[Python3](https://www.python.org/)　私が実際に試しモノは「python-3.6.3-amd64」です。
3.[ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/downloads)　私が実際に試しモノは「ChromeDriver 2.33」です。

※2と3はパスを通しておくなり、格納してある場所をプログラム中で絶対パス指定して呼び出せるようにすること。
※Pythonのソースの文字コードは、UTF-8で書いておくこと。

Mac環境下で Python3 + Selenium + PhantomJS版のサンプルプログラム(ame-pjs.py)を作っていたので、これをWindows環境下でも動くようにしてみました。これはWindows環境下でも Selenium + PhantomJS な環境であれば、そのまま動作します。
「[東京アメッシュ](http://tokyo-ame.jwa.or.jp/)のスクリーンショットを撮る」という単純なモノです。
Webページに行ってスグにスクリーンショットを撮ろうとしても画像が表示しきれていないこともあるので、3秒待ってからスクリーンショットを撮るようにしています。

```ame-pjs.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import time
from selenium import webdriver

driver = webdriver.PhantomJS()

driver.get("http://tokyo-ame.jwa.or.jp/")

time.sleep(3)

driver.save_screenshot("ame-pjs.png")
```

これをHeadless Chrome版にしてみると、こうなります。

```ame-hc.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--window-size=1024,768')

driver = webdriver.Chrome(chrome_options=options)

driver.get("http://tokyo-ame.jwa.or.jp/")

time.sleep(3)

driver.save_screenshot("ame-hc.png")
```

というわけで、PhantomJS上でやっていたことをHeadless Chromeに移植してみると、ちょっとだけ行数が増えました。
が、こんな感じで移植そのものは難しくなさそうです。

#今後のこと
ここ最近のスクレイピング界隈は、Mac環境下かLinux環境下での動作を前提としているモノが多いようです。
とはいえ、昔ながらの会社組織ではまだまだWindows環境が主流だったり、Macの導入ができないケースもあったりするとかと思います。そういう会社組織に属している人が自動化をしたいと思ったときに参考になるものが何もない状況だと、そこから先に進めなくなってしまうため、自動化やスクレイピングの裾野を広げていくためにも、そのあたりのノウハウの共有が結構重要だと思ったりもしています。

#参考
・[How do I use Headless Chrome in Chrome 60 on Windows 10?](https://stackoverflow.com/questions/45364102/how-do-i-use-headless-chrome-in-chrome-60-on-windows-10)
・[WindowsでHeadless Chromeでスクレイピング](http://imabari.hateblo.jp/entry/2017/06/11/181303)
SSHポートフォワードを利用してGPUサーバを使う


機械学習に使うGPUサーバをAWS上のPrivateSubnetに置いているので、直接JupyterNotebookやTensorBoardを使う事はできません。
そこでSSHトンネルを作って外から接続できないGPUサーバへ踏み台サーバを経由して接続できるようにします。

## ローカルフォワード

ローカルフォワードは良く使われる方法で、通信を踏み台サーバ（ここではBastianサーバ）から別の宛先に転送する

**設定**

- 源ポート：19999（localhostで使用するポートを記載）
※空いているポートであれば何でもOK
- 送り先：10.0.0.24:19999（SSHサーバが転送する先を指定する）
※プライベートIPが10.0.0.24／JupyterNotebookで使うポートが19999（TensorBoardを使う時はポート：6006）
- ローカル／自動を選択


![1.png](https://qiita-image-store.s3.amazonaws.com/0/163518/49c3eb5b-a7fb-1ad0-0c23-f87ea9151265.png)

開くをクリックしてSSH接続を開始する

**手順**

まずGPUインスタンスに踏み台サーバより接続してJupyterNotebookを起動する

```
$ ssh GPU　#GPUインスタンスに接続
$ source activate TensorFlow-GPU　#Anacondaの仮想環境を起動
$ jupyter notebook　#JupyterNotebookを起動
```

以下のURLにブラウザで接続

```http

http://localhost:19999/?token=××××××××××××××××××××××　
```

これでlocalhostのポート：19999にブラウザから接続するとGPUサーバ（プライベートIP：10.0.0.24／ポート：19999）に転送されてブラウザからGPUサーバにあるJupyterNotebookやTensorBoardを使える

## 参考

[【SSH】ポートフォワーディングを使って作業が捗る putty編](https://altarf.net/computer/server_tips/387)
[SSHポートフォワード（SSHトンネル）【ローカル・リモート・ダイナミック総集編】](https://www2.filewo.net/wordpress/2014/08/05/ssh%E3%83%9D%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%AF%E3%83%BC%E3%83%89%EF%BC%88ssh%E3%83%88%E3%83%B3%E3%83%8D%E3%83%AB%EF%BC%89%E3%80%90%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%BB%E3%83%AA/)
JavaScriptを使わずにCSSだけで他要素のスタイルを変える方法

#概要
JavaScriptを使ったDOM操作のようなものをCSSのみで実現させる。
目指すは超軽量レスポンシブメニュー。
#実装
##簡単なコード
```css:CSS
#switch{
    display: none;
}
#change{
    width: 100px;
    height: 50px;
    background-color: lightgray;
}
#field{
    width: 100px;
    height: 100px;
    background-color: red;
}
#switch:checked ~ #field{
    background-color: blue;
}
```
```html:HTML
<body>
    <div id="wrap">
        <input type="checkbox" id="switch">
        <label for="switch">
           <div id="change">button</div>
        </label>  
        <div id="field"></div>
    </div>
</body>
```
##動作
buttonと書かれている灰色のエリアをクリックすると、下の四角の色が赤色もしくは青色に変わる。
![sample02.PNG](https://qiita-image-store.s3.amazonaws.com/0/205287/145c1aff-8d70-2ece-9a10-b3b15f46fece.png)![sample01.PNG](https://qiita-image-store.s3.amazonaws.com/0/205287/62f65529-fa4a-d046-b334-dc8fa4fd3974.png)
##仕組み
###labelを使用したチェックボックスの切り替え
キーとなるのは`<input type="checkbox">`と`<label>`である。
`<label>`に`for=(inputのid)`を指定すると、`<label>`内の要素をクリックすることで`<input type="checkbox">`のon/offを切り替えることが出来る。
###疑似クラス「:checked」
`:checked`は擬似クラスというものの一種だそうです。分類に関しては詳しくありませんので間違いがあるかもしれません。
使用方法を簡単に言えば、チェックボックスがONの場合のstyleを設定することが出来ます。
今回はこれを利用して**通常の`<div id="field">`は赤色**、**チェックが入った状態の`<input type="checkbox">`の弟である`<div id="field">`は青色**、という二パターンを記述しています。
##応用してレスポンシブメニューを作ってみる
[DEMO](http://mo2nabe.com/mycode/demo/mMenuDEMO.html)
[GitHub](https://github.com/motsu0/mMenu)でも公開しています。
##結論
素直にJavaScriptを使えば良いと思う。
頭の体操というか遊び目的でやってみると意外と楽しいかもしれません。
##参考サイト
[CSS3だけでクリックでアニメーションさせる | webOpixel](http://www.webopixel.net/html-css/505.html)
.htaccessで１つ上の階層に301リダイレクトしたい

WordPress等で、サーバー移行をした場合、
旧URL http://example1.com/wp/ から
新URL https://example2.com/ へリダイレクトしたい場合は、.htaccessに下記の記述をします。

```
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(example1.com)(:80)? [NC]
Redirect permanent /wp/ /
RewriteRule ^(.*) https://example2.com/$1 [R=301,L]
</IfModule>
```
Numba で並列処理ができることを知ったので．

# 本日は

Numba のドキュメントをぼーっと眺めているとprangeというfor loop を並列することができるそうねということをしりました．

# コード

```python

import random
from numba import jit, prange
import time


@jit(nopython=True, parallel=True)
def calc_pi(NUM):
    counter = 0
    for i in prange(NUM):
        x = random.random()
        y = random.random()
        if x*x+y*y < 1.0:
            counter += 1
    pi = 4.0*counter/NUM
    return pi


def main():
    NUM = 1000000000
    start = time.time()
    pi = calc_pi(NUM)
    end = time.time()
    print("pi, {}, elapsed={}".format(pi, end-start))

if __name__ == '__main__':
    main()
```

jitデコレータの引数として `parallel=True` をいれることと，`for i in range` のような通常のループを `for i in prange` とすることで並列処理をしてくれます．`parallel=True`のキーワードを有効にするには Numba のバージョンを0.34以上にする必要があるみたいですね．

- [1.9. Automatic parallelization with @jit](http://numba.pydata.org/numba-doc/0.35.0/user/parallel.html)
- [Parallel Range](http://numba.pydata.org/numba-doc/0.11/prange.html)

ちなみに手持ちのWindows環境で時間計測をすると2秒ほどで処理が終わりました．すごい！！！．Cythonで固めたOpenMPをつかうコードをするよりもパフォーマンスが良かったです．素晴らしい！
Daydream開発入門 その2(Instant Preview)

今回は `Instant Preview` を使いデバッグの効率化を図りたいと思います

Daydreamの環境設定が済んでいない方は[こちら](https://qiita.com/beaa/items/5cb55fd0473acde134a1)をご覧ください
`Instant Preview`はUnrealでも使えるらしいのですが、この記事は **Unity** を対象としています

## Instant Previewとは
- ビルド処理をスキップし即座に実行できるツール
- DaydreamアプリとUnityプラグインで構成されている
- `Full VR Preview mode` と `Controller-only mode` を切り替えられる

### Full VR Preview mode？
エディタの変更が実行しているDaydreamアプリに反映されます。頭の動作とコントローラーの動作を確認しながら開発することが可能となります

### Controller-only mode？
コントローラーの情報のみをゲームエンジンに送ります。コントローラーの動作のみを試したい場合はこちらを利用した方が効率が良いです

#### その他機能
- 解像度やレイテンシを最適化するためのカスタマイズ可能
- USB-CとWi-Fiの両方で実行可能

## 早速使ってみる
前提：[その1](https://qiita.com/beaa/items/5cb55fd0473acde134a1)で作成したプロジェクトを利用しています

1. `GvrInstantPreviewMain`プレハブをシーン階層に追加<br>
![スクリーンショット 2017-10-21 17.12.02.png](https://qiita-image-store.s3.amazonaws.com/0/112492/ba5f4d1a-270e-5932-7ee5-0cddce66b952.png)
2. 必要があれば`GvrInstantPreviewMain`のInstant Previewを設定(この記事では画像にある通りの設定で進めます)<br>
![スクリーンショット 2017-10-21 17.26.02.png](https://qiita-image-store.s3.amazonaws.com/0/112492/b319af30-5d9f-f9b0-3b68-93f4742e37f7.png)
<dl>
  <dt>Output Resolution</dt>
    <dd>ストリーミング解像度を設定</dd>
    <dd><strong>Big</strong>：2560 x 1440</dd>
    <dd><strong>Regular</strong>：1920 x 1080</dd>
    <dd><strong>WindowSized</strong>：ゲーム画面のスケール</dd>
  <dt>Multisample Count</dt>
    <dd>アンチエイリアスの設定</dd>
    <dd><strong>One</strong>はアンチエイリアス無効。値が高くなるにつれ高品質となる</dd>
  <dt>Bit Rate</dt>
    <dd>エンコーディングビットレートを設定</dd>
    <dd>低い値は低画質だが高いフレームレートで実行される</dd>
  <dt>Install Apk on Run</dt>
    <dd>エディタのRunでInstant PreviewのAndroidアプリをインストールするかどうか</dd>
  <dt>Instant Preview Apk</dt>
    <dd>Instant PreviewのAndroidアプリ</dd>
    <dd><strong>Install Apk on Run</strong>でチェックをつけておけばエディタのRun時にこのアプリが自動でインストールされる。チェックをつけずに`adb`コマンドで自らインストールすることも可能</dd>
</dl>
3. Daydream対応端末をUSBでPCと接続する
4. UnityエディタのRunを押し、しばらくするとアプリのプレビューが開始される
5. 実行の確認が出来たら、再度Runを押し一旦実行をやめる
6. 2.で設定した **Install Apk on Run** のチェックを外す(これを外さないと毎回Instant Previewアプリがインストールされます)
6. すぐに変更が確認できるか確かめるため、配置してあるCubeの位置を適当に変更する。(`y:2` とかでOKです)
7. 再度Runを押し、すぐに端末で動作確認できることを確認

す、すごい...！変更が反映されてる！
これで開発速度向上間違いなしや！！

ちなみに
`Full VR Preview mode`と`Controller-only mode`を切り替えるには、Unityエディタの一時停止を押します。すると端末側で設定変更画面になります。
そこで設定し、一時停止を解除すると設定が反映され再度実行されます

## おまけ ストリーミングのパフォーマンスを上げる
**Edit** > **Project Settings** > **Quality** を選択し、vsyncを無効にする
![スクリーンショット 2017-10-21 21.48.29.png](https://qiita-image-store.s3.amazonaws.com/0/112492/6313b672-89d1-e1e1-e880-5ef5db74a9ba.png)

### OSXでのパフォーマンス向上
OpenGLの代わりにMetalを使用する
**File** > **Build Settings** > **Settings for PC, Mac & Linux Standalone** > **Player Settings** > **Other Settings** > **Metal Editor Support.** にチェックを付ける
![スクリーンショット 2017-10-21 21.59.27.png](https://qiita-image-store.s3.amazonaws.com/0/112492/7f25eb94-ca6e-2167-d220-116947151665.png)

## 最後に
これでいい感じにDaydream開発が出来るようになったはずです
~~次回は簡単なゲームを作ってみたいと思います~~
[次回](https://qiita.com/beaa/items/aea0c6d669cf6c07bd63)はUnityエディタ上でシミュレートする方法の記事にしました

間違っている箇所などありましたら指摘していただけると嬉しいです！
composerのsort-packagesとは？

composer.jsonに`sort-packages`という設定が書かれているプロジェクトを見かけた。

```json:composer.json
{
    ...
    "config": {
        "sort-packages": true
    },
    ...
}
```

どういう設定なのか調べてみた。[公式のドキュメント](https://getcomposer.org/doc/06-config.md#sort-packages)によると、`sort-packages`はデフォルトでは`false`だが`true`にすると`composer require`コマンドを実行したときにcomposer.jsonをパッケージの名前順で整頓してくれるものとのこと。
Pythonによる数値計算入門-Part3

# はじめに
前稿では簡単な数値計算とグラフの出力方法について述べました。前稿のプログラムをみてみましょう。

```cos.py
import math, pylab    #①

steps = 200   #②
dtheta = 0.1

theta = [0.0]*steps    #③
cos = [0.0]*steps

for i in range(steps):    #④
    theta[i] = i*dtheta
    cos[i] = math.cos(theta[i])

print(theta)    #⑤
print(cos)

pylab.plot(theta, cos)    #⑥
pylab.show()
```

今回はこれにもう少しだけ手を加えて、陳腐なものから抜け出したいと思います。

# プログラムの改良
　前稿のプログラムでは、定義域と分割数を変数stepsおよびdthetaから決定しました。これらはあらかじめプログラム内に書き込まれています。そのため定義域や分割数を変えようと思ったときにわざわざプログラムを書き換えなければなりません。これはなかなか手間のかかる作業です。ここではこの手間を避けるために、コマンドプロンプトでプログラムを実行することで標準入力から値を代入することができるようなプログラムを書きたいと思います。標準入力から値をいろいろと変えることができるようになれば、プログラム内の変数を何度も変えて計算結果を次々に知ることが容易になります。標準入力とはコマンドプロンプトに値を入力することを言います。実際に書き換えてみましょう。

```cos2.py
import math, pylab

#①
steps = int(input('Enter number of steps    ===>>'))
dtheta = float(input('Enter step size [rad]   ===>>'))

#②
theta = [i*dtheta for i in range(steps)]
cos = [math.cos(x) for x in theta]

pylab.plot(theta, cos)
pylab.show()
```
 　書き換えた点は2ヶ所あります。一つはcos.pyの②にあたる部分をcos2.pyの①に、そしてもう一つはcospyの③と④にあたる部分をcos2.pyの②に書き換えました。
　今回の目的はcos2.pyの①にあります。標準入力から数値を入力するには標準モジュールにあるinput関数を用います。標準モジュールとはPythonに元からインストールされているモジュールだと思ってください。input関数が使われているプログラムを実行すると、input関数が呼び出された時点でユーザーの入力を待ち、入力があったら直ちにその値を格納して次のプロセスに移ります。input関数内には文字列を書き込むこともできます。cos2.pyではstepsにint型で数字を格納します。また、dthetaにはfloat型で数字を格納します。そのために型変換を行っています。そのままだとstr型になるはずです。
 次にcos2.pyの②について述べます。cos.pyの③ではリストをsteps分だけ作成します。そのあとcos.pyの④でfor文の繰り返しを用いて各計算値を角度リストとcos関数リストに格納します。これより角度リストに対するcos関数リストをプロットしてグラフが出来上がります。一方cos2.pyの②では内包表記という方法を用いています。この内包表記を使うことでcos.pyの③と④のプロセスと一行にまとめることができます。内包表記はfor文が短い場合に有効な手段ですが、for文が長い場合には可読性などの理由から内包表記の利用を避けるべきです。
#　最後に
　最後になりますが、プログラムを実行してみてください。コマンドプロンプトやみなさんがお使いの開発環境にinput関数内に書き込んだ文字列が表示されると思います。そこに200を入れてEnterを押してください。次に0.1を入れてEnterを押すと、グラフが出力されるはずです。Part2で出力した結果と同じであることが確認できるでしょう。これが済んだら、適当な数字を代入してみてください。定義域を広げてみたり、分割数を少なくしてみて遊んでみると面白いと思います。
D言語で、ある型がclassかどうか判別する

使う場面はあるはずなのに`std.traits`などには見つからず、次のようなコードを考えていたのですが、

```d
// 基底クラスを取得することができ、かつ基底クラスの中にObjectが含まれていればclass
template isClass(T)
{
    import std.traits : BaseTypeTuple;
    import std.meta : staticIndexOf;

    static if (__traits(compiles, BaseTypeTuple!T))
    	enum isClass = staticIndexOf!(Object, BaseTypeTuple!T) != -1;
    else
    	enum isClass = false;
}
```

これでOKです。

```d
is(C == class)
```

`class`の部分を変えることで、structやinterfaceであるかどうかも調べることができます。

参考: [D言語公式ドキュメント](https://dlang.org/spec/expression.html#IsExpression)
Windows Helloで「既に同じ指紋が別のアカウントに設定されています」のときの対処

Windows Helloで指紋認証を使っているドメインに参加しているPCを他のドメインに移動したときなど、新しいアカウントに指紋を登録しようとすると「既に同じ指紋が別のアカウントに設定されています」になって指紋を登録できません。
日本語で色々キーワードを指定して検索して見つかった情報を試してみても駄目だったので、英語で検索して見つかった情報でうまくいったのでそのときのメモです。

#指紋認証のアプリを削除
1. 「設定」画面を開き、［アプリ］をクリックします。
※Windows 10 Creators Update(Windows 10バージョン1703)より前を使用している場合は、［システム］をクリックします。
2.［アプリと機能］をクリックします。
3. 「Synaptics」で始まるアプリケーションを探します。
4. 見つかったアプリケーションをクリックして、[アンインストール]をクリックしてアンインストールします。
5. 「このソフトウェアをアンインストールすると、すべてのユーザー登録が削除されます。続行しますか？」が表示されたら「はい」をクリックします。
6. 再起動が要求されたら再起動します。

#指紋認証デバイスを削除
1.[デバイスマネージャー」を開き、[生体認証デバイス］下にある指紋認証デバイス「例：TouchChip Fingerprint Coprocessor (WBF advanced mode)」を削除します。
2.「ドライバを削除しますか？」と表示されたら「はい」をクリックします。

#指紋登録情報を削除
1. 「C:\Windows\System32\WinBioDatabase」の下にあるファイル名が GUIDで拡張子がDATのファイルを削除します。
2. 再起動します。

以上で指紋を登録できるようになります。

#参考にした情報
[マイクロソフトコミュニティ（米国）](https://answers.microsoft.com/en-us/windows/forum/windows_10-hello-winpc/windows-hello-fingerprint-has-already-been-set-up/6e4a365e-a9e5-43db-91bf-817d057de87a)
pyvmomiでServiceInstanceを取得する処理の抽象化メモ

pyvmomiのログイン処理(ServiceInstance取得)を直感的にしたくて抽象化したclassのメモです。

```python
#!/usr/bin/env python3
from pyVim.connect import SmartConnect, Disconnect
from pyVmomi import vim, vmodl
from getpass import getpass
import ssl
import atexit
import argparse

class login:
    """
    ログイン処理を抽象化したクラス
    """
    def __init__(self):
        self.username = ""
        self.password = ""
        self.host = ""

    def get_service_instance(self):
        """
        ServiceInstanceを取得するメソッド

        :rtype: class
        :return: pyVmomi.VmomiSupport.vim.ServiceInstance
        """
        # SSL証明書対策
        context = None
        if hasattr(ssl, '_create_unverified_context'):
            context = ssl._create_unverified_context()

        # ServiceInstanceを取得
        si = SmartConnect(host = self.host,
                          user = self.username,
                          pwd = self.password,
                          sslContext = context)

        # 処理完了時にvCenterから切断
        atexit.register(Disconnect, si)

        return si

def options():
    """ コマンドラインオプション設定

    :rtype: class
    :return: argparse.Namespace
    """
    parser = argparse.ArgumentParser(prog='',
                                     add_help=True,
                                     description='')
    parser.add_argument('--host', '-vc',
                        type=str, required=True,
                        help='vCenterのIP又はホスト名')
    parser.add_argument('--username', '-u',
                        type=str, default='administrator@vsphere.local',
                        help='vCenterのログインユーザー名(default:administrator@vsphere.local)')
    parser.add_argument('--password', '-p',
                        type=str,
                        help='vCenterのログインユーザーパスワード')
    args = parser.parse_args()

    if(not(args.password)):
        args.password = getpass()

    return args

if __name__ == '__main__':
    # オプションを取得
    args = options()

    # ログイン情報を設定
    login = login()
    login.username = args.username
    login.password = args.password
    login.host = args.host

    # ServiceInstanceを取得
    si = login.get_service_instance()

    # 処理を書いていく
```

例えば、VM一覧の名前を表示する場合は、こんな感じ。

```python
    # 処理を書いていく
    sc = si.content
    vms = sc.viewManager.CreateContainerView(sc.rootFolder,
                                             [vim.VirtualMachine],
                                             True)
    for vm in vms.view:
        print(vm.name)
```
setTimeoutでsetInterval

定義したメソッドを再帰呼び出しします。

## 例

```js
let _setInterval = (cb, time) => {
  setTimeout(() => {
    _setInterval(cb, time);
  }, time);
  cb();
}

// 呼び出し
_setInterval(() => {
  console.log('hoge');
}, 1000);
```
GPUありWindowsでTensorFlowを使う

tensorflowをGeForceを搭載したノートPCにインストールしてみます。
バージョンの依存関係がシビアでした。

PC
- VAIO
- Windows10 Pro 64bit
- NVIDIA GeForce GT 735M

Software
- CUDA Toolkit 8.0
- cnDNN v6.0
- python 3.5
- tensorflow-gpu(1.3.0-cp35m-win_amd64)

# nvidia-dockerはまだ使えない

2.0で使えるようになるようです。
https://github.com/NVIDIA/nvidia-docker/issues/429

# NVIDIAソフトウェアをインストール

すでにインストールされていれば不要です。
CUDA 9.0では動かないので、CUDA 8.0が必要です。
以下のディレクトリにcudnn64_6.dllがすでにあれば、cnDNNも入っています。
- C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0

入っていなければ、以下を見てがんばります。
https://www.tensorflow.org/install/install_windows

# pythonとtensorflowをインストール

古いpythonがあれば、アプリと機能で全部アンインストールしておきます。
anacondaを入れます。pythonは3.x系にします。
https://www.anaconda.com/download/

※ anacondaの簡単な使い方 - https://qiita.com/t2y/items/2a3eb58103e85d8064b6#conda-%E3%81%AE%E7%B0%A1%E5%8D%98%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9

tensorflowは3.5で動きますので、仮想環境をつくります。

```
conda create --name=tensorflow python=3.5
```

仮想環境に入ります。

```
activate tensorflow
```

tensorflowをインストールします。

```
pip install --ignore-installed --upgrade tensorflow-gpu
```

# テストする

pythonを実行し、Hello Worldで確認します。
importで失敗する場合は、バージョンが合っていない可能性があります。

```
$ python
```

以下を入力します。

```
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
```

以下が表示されます。

```
Hello, TensorFlow!
```

おしまい。
組織運営にかかわる自前記事のリスト

組織運営について書いている自前記事のリストを作成しました。

## 組織運営の関わるもの

- [優秀な技術者を追い出してしまう方法](https://qiita.com/nonbiri15/items/961543c6460432289a02)
- [若手エンジニアを不幸にしないための開発の「べからず」集](https://qiita.com/nonbiri15/items/80e75fbdc358d9144215)
- [若手エンジニアを不幸にしないための開発の「べからず」集 コーディング編](https://qiita.com/nonbiri15/items/6d05e9bfc5ecbdaaab92)
- [若手エンジニアを不幸にしないための開発の「べからず」集　テスト編](https://qiita.com/nonbiri15/items/340f06bc72e84cd871a8)
- [若手エンジニアを不幸にしないための開発の「べからず」集　組織運営編](https://qiita.com/nonbiri15/items/d6f06e9b53be343c0b61)
- [モグラたたき開発を卒業しよう](https://qiita.com/nonbiri15/items/d3eac4a6bfb8fc770c15)
- [モグラたたき開発を卒業しよう　対策編](https://qiita.com/nonbiri15/items/015494c7c624748a5974)
- [モグラたたき開発を卒業しよう　対策編　その２](https://qiita.com/nonbiri15/items/18337a5ad2d6bc4887e9)
- [モグラたたき開発になる理由](https://qiita.com/nonbiri15/items/21eb20fc9c5584a1217c#_reference-e7bf095ab6fd180d9621)
- [生きているタスク管理と古くなっているタスク管理](https://qiita.com/nonbiri15/items/3a54e762d29024cb42e5)
- [成功するプロジェクトに変えるために](https://qiita.com/nonbiri15/items/046f44e7076ca0585792)
- [マネジャーは自分の強みを何におくのか？](https://qiita.com/nonbiri15/items/5f7799935bb456a322a7)
- [開発チームを育てあげよう](https://qiita.com/nonbiri15/items/6659bdfec4dd6e79ac55)
vCenterのWebClientにChromeで接続したらFlashがクラッシュするワークアラウンド

「さぁ、検証するぞ！！」と意気込んで検証環境のvCenterを起動しChromeから接続したらFlashがcrash(Shockwave Flash has crashed)して画面が表示されない。

![](https://sky-joker.tech/wp-content/uploads/2017/10/c034127b9abd896feb8c016c2c31bcbf.png)

だめ元でvCenterを再起動してもやっぱり復旧せず。
Flash関連の問題にはいい加減うんざりしながら情報を検索してみると以下の情報がありました。

[“Shockwave Flash has crashed” workaround for vSphere Web (Flash) Client](http://www.virtuallyghetto.com/2017/10/shockwave-flash-has-crashed-workaround-for-vsphere-web-flash-client.html)

同じ事象だったので上記ワークアラウンドを試して見ました。

# 環境

| 項目    | 種類、バージョン |
|:--------|:-----------------|
| OS      | macOS Sierra     |
| Chrome  | 62.0.3202.62     |
| Flash   | 27.0.0.170       |
| vCenter | 6.5.0 4602587    |

# 古いFlashのダウンロード

以下サイトから今回の環境だと一つ前の `27.0.0.159` をダウンロードします。

[Archived Flash Player versions](https://helpx.adobe.com/flash-player/kb/archived-flash-player-versions.html)

# Flashの削除

Chromeのフラッシュを削除または移動します。
以下のディレクトリに保存されているFlashが対象です。

```bash
$ cd ~/Library/Application\ Support/Google/Chrome/PepperFlash/
$ mv 27.0.0.170 ~/Desktop
```

ダウンロードした `fp_27.0.0.159_archive.zip` を解凍します。
中にある `uninstall_flashplayer27_0r0_159_mac.dmg` を実行します。

# 古いFlashのインストール

ブラウザを(複数開いている場合は全て)閉じて `flashplayer27_0r0_159_macpep.dmg` を実行してインストールします。

# 動作確認

Chromeを起動してvCenterのWebClientにアクセスします。
ただ、Chromeだと自動でFlashのバージョンが上がってしまうかもしれないのでアップデートを無効化(アップデートバイナリをリネーム？)するかアップデートされたら `27.0.0.170` フォルダを削除して再起動するかの対応が必要になってくると思います。

# 今回の事象の根本的な原因

Flash `27.0.0.170` を使って他のブラウザでも試して見ましたがWebClientは正常に動作しませんでした。
どうも `27.0.0.170` に問題があるようです。
参考にしたサイトのコメントにも

> I had the same exact issue also with Firefox 56.0.1 and Adobe Flash 27.0.0.170. So it seems that the issue is with version 27.0.0.170 itself.

とあります。。。
Swift3のPlaygroundでnict.jpから時刻取得して表示する


秒のレベルで正確な時刻をiPhoneで確認する場合、117に電話するくらいしか思いつかなかったので
nict.jpのAPIを叩いてJSONで値を貰い表示できれば良いんじゃない?と思い実験してみました。

既に似たアプリはあるわけですが、自分で実装するための勉強と将来的なアプリ化構想のネタです。
[Time Signal （時報時計）](https://itunes.apple.com/jp/app/id343548584?mt=8&ign-mpt=uo%3D4)

## 元ネタ
APIを叩く部分は、以前Qiitaに掲載した[Swift3からAPIを叩いてJSONの値を取得する](https://qiita.com/nao007_smiley/items/b8df6222cfeb63c842d0)をベースにしています。

## ハマったポイント
私の理解が浅いor誤りがある等で幾つか悩んだ点を列記します。
もし表記内で認識に誤りがあれば、ご指摘をお願いします。
* パースした結果の値”st”をStringで変数"jsonStr"に格納しようとして、型が違うと怒られました。
* URLにアクセスする時、非同期処理となってしまい肝心の結果が取得出来ませんでした。
* PlaygroundでURLにアクセスさせる条件が分からず、何をやったらできるの!?と悩みました。
* いつになっても実行処理が終わらない問題

## ソース
下記コードはXcode Version 8.3.3 (8E3004b)で動作したことを確認しています。
iOS11対応等でUpdate済みの方は、動作が変わる可能性があります。ご了承下さい。

```Swift:Playground
//: Playground - noun: a place where people can play

import UIKit
// ↓の2行が無いと、URLにアクセスできません。
import Foundation
import PlaygroundSupport


var getJson: NSDictionary!

// APIで取得する値をDouble型にする必要があり、宣言時に型を指定し初期値を代入しました。
var jsonStr : Double = 0
let urlStr = "https://ntp-a1.nict.go.jp/cgi-bin/json"

// いつになっても実行が終わらない問題に対応させる為の処理の一部です。
var currentPage = PlaygroundPage.current

if let url = URL(string: urlStr) {
    let req = NSMutableURLRequest(url: url)
    req.httpMethod = "GET"
    let task = URLSession.shared.dataTask(with: req as URLRequest, completionHandler: { (data, resp, err) in
        print(resp!.url!)
        print(NSString(data: data!, encoding: String.Encoding.utf8.rawValue) as Any)
        
        // 受け取ったdataをJSONパース、エラーならcatchへジャンプ
        do {
            // dataをJSONパースし、変数"getJson"に格納
            getJson = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary
            
            jsonStr = (getJson["st"] as? Double)!
            // UNIX時間をNSDate形式に変換
            let date = Date(timeIntervalSince1970:jsonStr)
            
            // NSDateFormatterを使用して任意のフォーマットの日本標準時間に変換
            let outputFormat = DateFormatter()
            outputFormat.locale = Locale(identifier: "ja_JP")
            outputFormat.dateFormat = "yyyy/MM/dd HH:mm:ss"
            print(outputFormat.string(from: date))
            
            // いつになっても実行が終わらない問題に対応させる為の処理の一部です。
            currentPage.finishExecution()

        } catch {
            print ("json error")
            return
        }
    })
    task.resume()
}else{
    print("Cannot get data from URL:\(urlStr)")
}

// 非同期処理で終了を明示的に指定する設定
PlaygroundPage.current.needsIndefiniteExecution = true
// Failed to obtain sandbox extensionというエラー対策(キャッシュが悪さしている模様)
URLCache.shared = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)


```

## 将来的に
できれば良いなというレベルではありますが
* NTPで時刻を取得時、iOSとの差を表示
* NTPで定期的に時刻を取得(or手動取得)
* NTPだけでなく、GPSやiOSが持つ時刻情報も表示
といった機能を実装したいところです。要は時刻情報の正らしさをユーザが判断できるようにしたいです。
最終的に117に電話しなくても、正しい時刻を取得できるようになれば良いですね。


## 参考URL
* [日本標準時プロジェクト　https/http を介してアクセスされる場合](http://www.nict.go.jp/JST/http.html)
* [Objective-CとSwiftでのUNIX時間の変換](https://qiita.com/koishi/items/efe0d654d710daa7a563)

## Special Thanks
[@Ryuichirou](http://qiita.com/Ryuichirou)
ＰＩＣＡＸＥで始めよう！

日本Androidの会秋葉原支部ロボット部
関　昌充（Ｐ酒）
(この文書のライセンスはCC BY-NC 4.0です)

# Why? PICAXE

秋ロボ（日本Androidの会秋葉原支部ロボット部）では、Arduino互換機でワークショップを行っていましたが、なぜいま PICAXE か？

ちょっとしたハードウェアの入門としては、Arduinoが一般的になっているかと思いますが、ちょっと違った観点でPICAXEについて紹介させていただきます。

## （ａ）標準での開発環境でブロックプログラミングができる。
Ａｒｄｕｉｎｏでも「ＡｒｄｕＢｌｏｃｋ」を入れると「Ｓｃｒａｔｃｈ」みたいな感じでプログラミングができます。（秋ロボのＷＳでもやっていました。）
ＰＩＣＡＸＥ　Ｅｄｉｔｏｒだと、標準でＢｌｏｃｋｌｙとかフローチャートでもプログラミングができます。
このＢｌｏｃｋｌｙは、（経緯は良く解らないのですが）Ｇｏｏｇｌｅ　Ｂｌｏｃｋｌｙと同じようなものですので、次のステップアップにもいいと思います。
（https://developers.google.com/blockly/guides/get-started/web）

## （ｂ）チップ単体なら安い
最近は安いＡｒｄｕｉｎｏ互換機もあるのですが、１０個くらいまで？の製品なら、特に８ピンの「０８Ｍ２」であればＰＩＣＡＸＥの方が安くなるのではないかと思います。
「Ｉ２Ｃ」を使えば、Ｉ／Ｏやセンサーの拡張もできます。
# ＰＩＣＡＸＥで始めるために（最低限）必要なもの
## （ａ）ＰＩＣＡＸＥ
### （ｉ）８ピンＰＩＣ開発キット
http://akizukidenshi.com/catalog/g/gK-06627/
１ポートだけ、駆動用のトランジスタが入っていてＤＣモータを直接駆動できるので、最初の実験用にはお勧めします。
紙では付いていませんが、リンク先の「教本」の中の課題はプログラミングの学習用にもいいと思います。

[]( scale=0.6 )![](https://qiita-image-store.s3.amazonaws.com/0/195351/eb3d9deb-ccaf-5a78-f4b1-cb4fb1e8322f.png)

### （ｉｉ）ＰＩＣＡＸＥ－０８　プロトボード＋ブレッドボード
ちょっと加工（コネクタとブレッドボードの実装）が必要ですが、ちょっとした実験には使い勝手がいいと思います。

[]( scale=0.4 )![](https://qiita-image-store.s3.amazonaws.com/0/195351/5030e03e-41ef-82ce-bd0f-c6d931c4df96.png)

（※）プロトボードにはコネクタとブレッドボードは付いていません。
http://akizukidenshi.com/catalog/g/gK-06614/
### （ｉｉｉ）ブレッドボード＋プログラミング用コネクタ（写真にはありません。）
http://akizukidenshi.com/catalog/g/gM-06612/

ピン数が違うチップ毎にプログラム用のピンが微妙に違うので、注意が必要です。

[]( scale=0.6 )![](https://qiita-image-store.s3.amazonaws.com/0/195351/e8c6d145-d67e-9825-0415-2bf185bd1cc8.png)


## （ｂ）ダウンロードケーブル
ＵＳＢ接続のものは、こういうのですが、シリアルポートが付いている古いＰＣなら自作もできるかも知れません？ （自己責任で！）

[]( scale=0.3 )![](https://qiita-image-store.s3.amazonaws.com/0/195351/566c37b7-574a-183b-1c91-8a6db0fece39.png)

http://akizukidenshi.com/catalog/g/gM-06611/


## （ｃ）開発環境
###　（ｉ）ＰＩＣＡＸＥ　Ｅｄｉｔｏｒ
全部入りの開発環境で、ＢＡＳＩＣやフローチャート、Ｂｌｏｃｋｌｙでのプログラミングができます。
http://www.picaxe.com/Software/PICAXE/PICAXE-Editor-6/

###  （ｉｉ）Ｂｌｏｃｋｌｙ　Ｆｏｒ　ＰＩＣＡＸＥ　　　http://www.picaxe.com/Software/PICAXE/Blockly-for-PICAXE/
Windows，Mac，Linux　で使えるようです。

### （ｉｉｉ）スマホ
最終的にはＰＩＣＡＸＥにダウンロードするＰＣ環境が必要になりますが、Ｗｅｂ経由でスマホ向けのサービスもあります。
http://www.picaxe.com/Software

## （ｄ）パソコン
最終的にＰＩＣＡＸＥにダウンロードするためには、パソコン（Windows，Mac，Linux 、私はWindows系推奨）が必要になります。

# あった方がいいもの
##　（ａ）テスター（ほぼ必須）
電源がショートしていると、ＰＣ（ＵＳＢとか電源とか）を壊します。
特に、ちょっと慣れた頃が危ないです。（私もやったことがあります。）

[]( scale=0.4 )![](https://qiita-image-store.s3.amazonaws.com/0/195351/ccfdbaee-b69e-c88f-959b-888d11845f5b.png)

## （ｂ）オシロスコープかＯＳＣ
特に、入出力電圧や信号のタイミングを見たいときにオシロスコープがあった方がいいのですが、結構高いので、安価なＯＳＣでもいいと思います。

ＯＳＣ００１　ＰＣＢ　ＳＣＯＰＥ
http://akizukidenshi.com/catalog/g/gK-11841/
　
[]( scale=0.8 )![](https://qiita-image-store.s3.amazonaws.com/0/195351/456f276e-5a63-97e5-d558-457f56480af0.png)

この写真は、ピンソケットを半田付けした状態です。


# 次回予告
## （ａ）８ピンの「０８M2」でＩ２Ｃを使ってみる予定です。
Ｉ／Ｏの拡張（センサーの接続等）