OmniAICreator/Qiita-1.07M huggingface dataset:
任意の文字列を含む行を色付けして出力するシェルコマンド

コマンドの出力内の任意の文字列を含む行を色付けしたいと思ったので、シェルコマンドでやってみた。

# コマンド

file.txt内の"hoge"を含む行を赤文字にして出力するシェルコマンドの例。

```bash
$ cat file.txt | sed -r "s/(.*hoge.*)/\x1b[38;5;9m\1\x1b[0m/g"
```

# 解説

### 色付け処理

`\x1b[38;5;9m`はこれ以後の文字列を赤色に変更するための特殊な文字列であり、`\x1b[0m`はこれ以後の文字列をデフォルトの色に戻す。

```bash
"\x1b[38;5;9m文字列\x1b[0m"
```

これを出力すると、赤色の「文字列」が出力される。

上記の文字列のうち`\xb1`はESCの16進数表記である。`38`のところを`48`にすると文字色ではなく、背景色を変更することができ、`9`を変更することで色を変更することができる。色のコードは`0~255`まで存在する。

この色付け処理について詳しく知りたい場合は、 https://misc.flogisoft.com/bash/tip_colors_and_formatting を参考にすると良い。

### 置換処理

`sed`コマンドは正規表現を用いて置換を行うシェルコマンドで、`"s/置換前文字列/置換後文字列/g"`と引数に渡すことで、置換を行う。

```bash
sed "s/置換前文字列/置換後文字列/g"
```

`.`は改行を除く任意の一文字を意味し、`*`は直前の文字を任意数繰り返すことを意味する。

なので、`.*hoge.*`は"hoge"の前後が任意の文字列となる文字列を示すこととなる。

`()`は置換後文字列内に存在する`\1`で参照するために必要。置換前文字列で`()`内の文字列にヒットした結果が`\1`に展開される。(このためには拡張正規表現を使用する必要がある)

すなわち、以下のシェルコマンドは何も置換が行われないことになる。

```bash
sed -r "s/(.*hoge.*)/\1/g"
```

これを用いると、任意の文字列の前後に、任意の文字列を挿入することができる。
例として、以下のシェルコマンドで置換前文字列の前後に"A"、"B"を挿入することができる。

```bash
sed -r "s/(.*hoge.*)/A\1B/g"
```

### 組み合わせると

よって、以上の機能を組み合わせることで、"hoge"を含む行の前後に色付け用の特殊な文字列を挿入することができ、文字色を赤色に変更することができる。

```bash
sed -r "s/(.*hoge.*)/\x1b[38;5;9m\1\x1b[0m/g"
```

# おまけ

色付けされた出力を`less`コマンドにただパイプしても色がつかない。
この場合は、オプションの`-R`をつけると良い。

```bash
$ cat file.txt | sed -r "s/(.*hoge.*)/\x1b[38;5;9m\1\x1b[0m/g" | less -R
```

# さいごに

パイプで入力を渡されたときのみ機能する、任意文字列を含む行のみを色付けして出力するための単純なシェルスクリプトを載せておく。第一引数で検索する文字列を指定し、第二引数で文字色を指定することができる。

```bash
#!/bin/bash

if [ -p /dev/stdin ]
then
  if [ "$1" = "" ]
  then
    cat -
    exit 0
  fi

  WORD=$1
  # Default color is red
  COLOR=9
  # Check the second argument. Is it number and 0 <= $2 <= 255?
  expr "$2" + 1 > /dev/null 2>&1
  if [ "$?" -lt "2" ] && [ "$2" -gt "-1" ] && [ "$2" -lt "256" ]
  then
    COLOR=$2
  fi
  cat - | sed -r "s/(.*${WORD}.*)/\x1b[38;5;${COLOR}m\1\x1b[0m/g"
fi
```

# 追記

以下の記事で、色付けするシェルコマンドをGo言語でコマンドラインツールとして作成してみた。
[「任意の文字列や行をハイライトするツールをGo言語で作成してみた」](https://qiita.com/x-color/items/bb4c4054083c1ef0b941)
ESP8266にBME280 をつないで温度、湿度、気圧測定

#BME280

## 測定の記録
測定のデータはAmbient にアップしています。

https://ambidata.io/ch/channel.html?id=10090

## 台風19号の記録
2019/10/14 追記
上陸前後の気圧の記録です。

![20191014.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58417/7c478362-913c-b5cd-ed7c-863988eb0377.jpeg)

## 3号機
2019/9/10 追記

- ベランダで使っていると、BME280 の端子が塩分をかぶってしまってなのか、白濁し湿度が測定できなくなります。
- ３号機を作っています。３号機のためにESP8266の基板を作りました。
- 設置する際に雨がかからないように、そして空気は通って温度、湿度が測定できるような環境がなかなか難しいです。

![IMG_3709.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58417/e8965e0d-2fd9-e1fd-e15f-efd5e27e57b9.jpeg)

## 1号機
2018/08/14 記載

夏休みということで、BME280搭載のモジュール
https://www.switch-science.com/catalog/2236/
を購入し動作させてみました。

Arduino に普通にI2Cでつなぐのであれば、ここにあるプログラムを使えば、難なく動作します。
https://github.com/SWITCHSCIENCE/BME280/tree/master/Arduino/BME280_I2C

## ESP-WROOM-02につなぐ

プログラムを書き込むために、USB変換モジュール
https://www.switch-science.com/catalog/343/
を使いました。

![8266-ondokei2.png](https://qiita-image-store.s3.amazonaws.com/0/58417/76121a8b-b8a0-9b38-2cc3-02e6d054e469.png)

![IMG_3445.JPG](https://qiita-image-store.s3.amazonaws.com/0/58417/ade72d43-b967-401b-663e-47a491a86a11.jpeg)

## プログラム書き込み

プログラムを書き込むためには、SW2をON すなわち、IO0 をLowとして、SW1 を押して、リセットをかけます。Flash からプログラムを動作させるには、SW2 をOFFとし、IO0 をHighとします。

## Deep Sleep Mode


Deep Sleep Modeを使いたいので、IO16 ( 16番 ) をリセットと接続しておきます。
setup の最後で以下の関数を呼ぶと、30秒に１回立ち上がります。

```setup()
ESP.deepSleep(3e7);          //Going into deep sleep for 30 seconds
```

## I2C の設定

上のサンプルプログラムのsetup で、  Wire.begin();　という箇所を

```setup()
Wire.begin(4, 14);
```

に書き換えれば、それでＯＫでした。
Docker で Nginx サーバーを立てる

VPS の Arch Linux に Nginx のサーバーを立てる方法です。

<ol>
<li>Docker のインストール</li>

Arch Linux

```bash
sudo pacman -S docker
```

Ubuntu 23.04

```bash
sudo apt install docker docker-compose
```

<li>Docker の起動</li>

ここからは、Ubuntu でも操作は同じです。

```bash
sudo systemctl start docker
```

<li>Nginx のインストールと起動</li>

```bash
sudo docker run --name some-nginx -d -p 8080:80 nginx
```

<li>イメージの確認</li>

```text
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              c82521676580        2 weeks ago         109MB
```

<li>Nginx が動いていることを確認</li>

```text
$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
dac02b07c2e4        nginx               "nginx -g 'daemon of…"   33 minutes ago      Up 33 minutes       0.0.0.0:8080->80/tcp   some-nginx
```

<li>ブラウザーで http://localhost:8080 にアクセス</li>

![docker_aug1301.png](https://qiita-image-store.s3.amazonaws.com/0/179446/7ff97293-a13c-3ac9-1acf-ef69bdfdf9b4.png)

<li>docker コマンドを通常ユーザーで実行できるようにする

 ユーザー　uchida で実行できるようにするには

```bash
sudo gpasswd -a uchida docker
```

システムの再起動が必要です。

<li>ssh でログインする</li>

```text
$ docker exec -it some-nginx bash
root@dac02b07c2e4:/#
```

<li>ログイン後 vim をインストールする</li>

```bash
apt update
apt install vim
```

<li>index.html を編集する</li>
日付を加えてみます。

```html:/usr/share/nginx/html/index.html
略
<p><em>Thank you for using nginx.</em></p>
<p>Aug/13/2018</p>
</body>
</html>
```

<li>ブラウザーでアクセス</li>

![docker_aug1302.png](https://qiita-image-store.s3.amazonaws.com/0/179446/001a5391-5898-5cc7-8533-0f7e237b2ec5.png)

</ol>

## 確認したバージョン

```text
$ docker --version
Docker version 28.0.1, build 068a01ea94
```

## コンテナーの停止と起動

```text
$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                   NAMES
0b643730642f   nginx     "/docker-entrypoint.…"   8 minutes ago   Up 2 minutes   0.0.0.0:8080->80/tcp, :::8080->80/tcp   some-nginx

$ docker stop 0b643730642f
0b643730642f

$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

$ docker start 0b643730642f
0b643730642f

$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                   NAMES
0b643730642f   nginx     "/docker-entrypoint.…"   9 minutes ago   Up 2 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp   some-nginx
```

## ベースになっている OS

```text
/# cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
```

## 参考ページ

[Docker: Ubuntu 24.04 にインストール](https://qiita.com/ekzemplaro/items/7715d3d1c4e267e15539)

## 関連ページ

[Docker で Apache2 サーバーを立てる](https://qiita.com/ekzemplaro/items/416bd10e34aa2a4c7503)
P"r"aying Manager ～節子、それマネジメントちゃう。オカルトや～

## はじめに

最近、社内外の多くのプロジェクトマネジメント実態を調べる機会に恵まれた。
その中で、面白いことに気がついた。

問題に直面して、原因を分析しなければ、対策も取ろうとしないマネージャ達。
彼らはマネジメントしていない。ただ祈ってるだけ。
つまり、**P"r"aying Manager** じゃね？と。

※Pray ・・・ 祈る

## Praying Managerの生態

### [ケース1] 進捗をPGが自力で回復してくれることを祈る

あるプロジェクトでは、3ヶ月の工期のうち、1ヶ月が経過したが、進捗が半月分しか出なかった。
つまりプロジェクトとしては破綻状態であるわけだ。

このことについてマネージャは、
> プロジェクトの最初は立ち上がりが悪く、進捗が出ないものなんです。
> 対策はいずれメンバのスピードが上がってくればという感じですね。

と回答し、なにも手を打たなかった。
（最終的には会社が介入して正常化を図った。）

### [ケース2] 要員のスキルが不十分だけど、なんとかやりきってくれることを祈る

あるプロジェクトでは、経験が必要な技術を用いる開発であるが、
組織内の要員の都合から、未経験者をメンバとすることになった。

そのことについて、リスクの通告と対策の検討を指示したところ、
> できないできないって言ってたら、何もできなくなる。
なんとかするのがメンバの仕事。

といってプロジェクトを強行。
（結果、進捗と品質に深刻な障害を発生させた。）

### [ケース3] 実現方法はわからないが、短期間でやってくれることを祈る

あるプロジェクトでは、これまで経験したことのないような開発が予定されていた。
マネージャはその技術的な実現方法がわからないが、"1人月"と設定していた。

なぜそれが1人月で実現可能なのかを問うと、
> 技術的なことはよくわからない。それはエンジニアの仕事。
> お客様は1人月分のコスト負担しかしたくないと言っているから、
> なんとか1人月でやってほしい。

と答えた。
（これは、組織内の最優秀なエンジニアがやりきった。）

## 彼らはなぜ祈るのか？

こういった祈りを、女神が聞き届けてくれることもある。
（つまりは何もしなくても運良くプロジェクトが回ったケースだが。）
しかしながら、非常に不確実なやり方である。

なぜ彼らが、原因の分析・対策という確実な手段ではなく、祈るのか？

以下、少なくとも2種類のタイプの人間を見たことがある。

### [タイプ1] 祈る以外の方法を知らない。好きで祈ってるのではなく、祈ることしかできない。

若手マネージャ、新任マネージャに多い。
問題があることはわかっているが、じゃあどうして良いかがわからない。
わからないから、ただ状況を受け入れ、「うまくいけば」と祈るタイプ。

スケジュール遅延時に、
それが成果物に問題があるなら、成果物に変更を加える、
リソースに問題があるならリソースにてこ入れする、
そもそも計画が無謀だったのなら計画を引き直す

こういった、状況別の対策を知らない、
遅延時にデスマで解決した以外の成功体験がないが故に、
効果的な対策ではなく、祈ってしまう。

※むちゃくちゃな仕事量をこなさざるを得なかった、
※リソースの追加や成果物の変更などが許されなかった
※いわゆる氷河期世代の現40代前後のマネージャにもこのタイプが多いかも。

### [タイプ2] 自分の仕事が、問題発見、問題解決であるとは思っていない。

マネージャの仕事とは上流であり、上流とは

* 要件を決めること
* 見積を書くこと
* スケジュールを書くこと
* メンバに仕事を分配すること

であって、下流の設計・製造・試験で起きた問題は、
役割分担としてメンバがやるべきだと思っているタイプ。

つまりマネージャを、
「プロジェクト目標を達成することに責任をもつ」者ではなく、
「上流担当者」と誤認しているケースである。

このタイプは、下流で発生するあらゆる問題とその解決にあまり興味がなく、
従って、「見てるだけ」「うまくいくことを祈ってる（社交辞令）」となってしまう。

## Praying Managerを撲滅するために

プロジェクトは失敗すると、会社の利益も社員の精神もごっそり削っていく。
プロジェクトの成功に寄与しない、Praying Managerは、可及的速やかに Manager にジョブチェンしてもらう必要がある。

ではどうすれば、Praying Managerを撲滅できるか。

とりあえず私は、以下の通りに動こうと思っている。

* 良くないマネージャの行動を、"Praying Manager"として定義して、  
ことある毎に、「おっ、Prayingお疲れ様ですｗ」とか煽りまくって周知し、  
問題を見える化する。
* マネージャがやるべき事を明確化し、組織として共通認識にする（役割誤認への対策）
* 問題の解決策をノウハウとして共有しつつ、実地で解決策を一緒に考える。  
つまりは教育する

これらの効果が出るのは、最低でも1年以上は掛かるだろうし、
苦労も多いだろうと思うけど、効果はもっと大きいはず。
是非取り組んでいきたい。

## 追記1

本投稿は、以前書いた ↓ の発展編というか、実装編というか、具体例になります。
[失敗・炎上に名前をつけることで、僕たちはもっと強く、生産的になれる。 \- Qiita](https://qiita.com/gakuri/items/7910299855ac16a7ca8c)

## 追記2

この言葉を思いついたとき、おれはなんて頭がいいんだ！と自画自賛してたけど、
すくなくとも、2009年にこの概念を提唱している人がいた。。。
http://d.hatena.ne.jp/segawabiki/20090827/1251377856

## 追記3

これ、あくまでプロジェクトにおけるマネージャの話で書きましたけど、
組織における部門長にも全く同じ事が言えるなと、書いてて思いました。
というか、プロジェクトよりもよっぽどPraying部門長のほうが、よっぽど人を不幸にできますね。。。
ansibleでplaybooks must be a list of playsが出た


## ansibleでimport_playbookを使ったときに出てきたエラー

```develop.yml
---
- import_playbook: develop-web.yml
```

```develop-web.yml
- hosts:
    - vagrant
  roles:
    - vagrant
    - php
```

で、develop-web.yml単体だったら動くのに、develop.ymlで`import_playbook`したらエラーになる。

```
ERROR! playbooks must be a list of plays
```

`---`が抜けてたから…。

```develop-web.yml
---
- hosts:
    - vagrant
  roles:
    - vagrant
    - php
```

これで動いた。
プロンプトが文字化け？したのを直す


## 困ったこと

ある日、Macのコマンドプロンプトを見ると、

```bash
43x233x87xxxx: ~ $
```

のようになっていた。43x233x87xxxxの部分は本来、mbpというホスト名が表示されているはずなのに。

>共有でホスト名をmbpとしています。

文字化けかな？と思い、いろいろ調べてみたところ、このプロンプトのホスト名は律儀？にネットワークで名前解決して、それを取得してきているらしい。
なので、マシンにきっちりホスト名が振られる環境下では「正式な」ホスト名となってしまうよう。

試しに、下記のようにすると、ホスト名が割り振られており、そのホスト名が取得されているようです。

```bash
hostname

43x233x87xxxx.ap45.ftth.ucom.ne.jp
```

## 解決方法

そもそものプロンプトの設定については[こちら](https://qiita.com/zaburo/items/9194cd9eb841dea897a0)を参考にしてください。

### 無視するか他のネットワークにつなぐ

まず、この現象はMacを接続しているネットワーク依存なので、他のネットワークに接続すると解決する。一時的な環境であれば無視してていいと思う。

### ローカルホスト名を見るように設定する

ネットワーク名ではなくローカルのホスト名を使うように設定すると解決できるよう。

#### 現状の設定確認

まず、現状の設定を確認してみます。\hがホスト名を表しています。

```bash
echo "$PS1"
\h: \W $
```

#### ローカルホスト名を取得して設定する設定

\hではなく、scutil --get LocalHostNameで取得した結果を利用するようにします。

```bash
export PS1=$(scutil --get LocalHostName)': \W $'

mbp: ~ $
```

期待通りmbpと表示されるようになりました。

まだまだ知らないことがたくさんあります。
Mac—クリップボードのテキストを正規表現でコンソールから直接置換する

「pbpaste と pbcopy を組み合わせれば簡単に編集できるじゃん」ってことに今日気づいた。

```sh
pbpaste | sed 's/Bob//g' | pbcopy
```
置換のためにエディタを開く必要なんてなかったんだ。



## シンプルな置換の例

```sh
echo "AliceBobCarol" | pbcopy && pbpaste | sed 's/Bob//g' | pbcopy && pbpaste
AliceCarol
```

## 正規表現での置換の例

Mac デフォルトの `sed` コマンドは貧弱なので、 `gsed` を入れておくこと。

```
$ brew install gnu-sed
```

```
$ echo "AliceAliceBobCarol" | pbcopy && pbpaste | gsed --regexp-extended 's/^(Alice)+//g' | pbcopy && pbpaste
BobCarol
```

## そして今

あなたはどんな場所にだってペーストできるんだぜ。

![image](https://user-images.githubusercontent.com/13635059/44063025-b8ebfc18-9f99-11e8-86a5-aa68330ed9dc.png)


## 注意

この方法だと、当たり前だが置換をミスるとクリップボードの中身が書き換わってしまう。

対策するにはクリップボードの履歴を見るようにしたり、一時記録ファイルを作ったり、コマンド化したりするのが良いかも知れない。(やりたい)

## あわせてオススメ

本題とは関係ないが、Alfredのクリップボード履歴はとっても素敵なクリップボードツールなので使ってみてはいかがだろう。

![image](https://user-images.githubusercontent.com/13635059/44063780-05f59070-9f9d-11e8-9d18-e80e38b81ba3.png)

## Versions

- Mac OS X High Sierra

## Links

- [Gist](https://gist.github.com/YumaInaura/32b6d6ba379d4a65d22c06e3f8d284c0)
- [Medium](https://medium.com/supersonic-generation/mac-replace-clipboard-text-with-regex-in-console-a41cf05ac29b)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Docker で Apache .htaccess の挙動を確認してみる

# まずは動かし方

```dockerfile
FROM php:7.2-apache
ENV COLUMNS="200"
RUN apt-get update; \
	apt-get install -y vim 
RUN a2enmod rewrite
```


```console:files
$ tree -a
.
├── .htaccess
├── Dockerfile
├── index.php
└── piyo
    ├── .htaccess
    ├── index.php
    ├── index2.php
    └── index3.php
```

上のような構成で、current directory に `index.php` とか `Dockerfile` とかを置いておきます。そして、以下の手順で進めます。


```console
// まずはビルド
$ docker build -t apache-study:v1 .

// つづいてラン
$ docker run -d -p 80:80 -v "$PWD":/var/www/html apache-study:v1

// コンテナが立っているはずなので確認
$ docker container ps
```

これで、 `localhost` とか `localhost/piyo/index.php` とかにアクセスが可能です。

# .htaccess サンプル

```
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^piyo/index.php$ /piyo/index3.php [R=302,L]
</IfModule>
```

# Dockerfile について補足

```dockerfile
FROM php:7.2-apache
ENV COLUMNS="200"
RUN apt-get update; \
	apt-get install -y vim 
RUN a2enmod rewrite
```

`COLUMNS` とか `vim` とかは別に必要ないです。が、コンテナ内でいろいろ作業したかったので、いれておきました。
今回は mod_rewrite モジュールが使いたかったので、

```dockerfile
RUN a2enmod rewrite
```

これは必須です。これで、mod_rewrite が使えるようになりました。

最初は、コンテナ内で作業をして、`/etc/init.d/apache2 restart` とかやろうとしたのですが、これするとそもそも apache のプロセス死んでコンテナ自体も死亡してしまうので、Dockerfile を作成して動かすアプローチに着地しました。


# 学びと参考

キャッシュがすごいので、動作確認は 301 じゃなくて 302 でやることにしました。
http://www-creators.com/archives/2013

.htaccess の挙動とか全然わかってないので、ちゃんと読みたいです。
https://murashun.jp/blog/20141229-01.html

- 深い階層にある .htaccess が優先される
- 同じファイル内の記述は先に書かれてるものから反映される
今さらだけどAlexaのカスタムスキルを作ってみた

今さらな備忘録。

# Alexaスキル始め
アカウントを用意し、公式ページのチュートリアルや動画を見つつ進めます。アカウント作成についてはこちらを参照。

[Alexaの知識がないところからスキルを作ってみた日記 その1](https://dev.classmethod.jp/voice-assistant/amazon-alexa/firststep-alexa-skil-develop1/)

## 作成するもの

「日付を伝えたら曜日を返してくれる」カスタムスキルを作ってみます。

## 呼び出し名の設定

実際にAmazon Echoに話しかけるための呼び出し名を設定します。今回は適当に「曜日確認」という呼び出し名にします。

![スクリーンショット 2018-08-13 15.24.04.png](https://qiita-image-store.s3.amazonaws.com/0/102769/0ced6a06-ea93-f98a-6b49-0e1fa11e5f3d.png)

## インテントの作成

次にインテントの作成をします。変数を利用して、最初にどんな日付でも受け付けられるようにします。```{date}``` 変数は日付形式を扱いたいので、「Amazon.DATE」をスロットタイプには指定します。こうすることで、Alexaが認識した```{date}``` を```YYYY-MM-DD``` の形式に変換して呼び出し先のパラメータとして渡してくれる様になります。

![スクリーンショット 2018-08-13 15.29.25.png](https://qiita-image-store.s3.amazonaws.com/0/102769/e01f34fc-5386-c0a9-5597-3f9f381df8b4.png)

## 呼び出し先Lambda関数の作成

作成してきたAlexaのスキルが呼び出す先のLambda関数を作成します。呼び出し元に「AlexaSkillKit」を指定して、中身を実装します。今回はPython3.6で簡単に実装しました。


```python
import datetime
import locale

def lambda_handler(event, context):
    intent = event['request']['intent']
    date_str = intent['slots']['date']['value']

    locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
    date = datetime.datetime.strptime(date_str, '%Y-%m-%d')

    res_str = date.strftime("%Y") + "年" + date.strftime("%m") + "月" + date.strftime("%d") + "日は、" + date.strftime("%A") + "です。"

    response = {
        'version': '1.0',
        'response': {
            'outputSpeech': {
                'type': 'PlainText',
                'text': res_str
            }
        }
    }
    return response
```

## エンドポイントの設定

Lambdaが呼び出せるようになったら、ARNを「デフォルトの地域」に入力します。

![スクリーンショット 2018-08-14 3.23.33_deco.png](https://qiita-image-store.s3.amazonaws.com/0/102769/ac8ee337-fe32-013d-3d20-e651c242c34f.png)

## テストしてみる

ここまでできればビルドが通るようになってますし、「テスト」をしてみます。

![スクリーンショット 2018-08-14 0.13.28.png](https://qiita-image-store.s3.amazonaws.com/0/102769/948539c2-f4f0-89c3-4dfa-cdbdfeb80450.png)

音声入力をしましたが、いい感じに解釈して返事を返してくれるようです。


# まとめ

Alexaのスキル開発をしたのは約2年ぶりなのですが（初めて触ったのは2016のre:Inventのときでした）、以前に比べてかなり使いやすくなってます。チュートリアルも動画も豊富なので、さっと始めるには親切なナビゲーションがあったのはありがたい限りです。
php-master-changes 2018-08-13

# 2018-08-13
## weltling: Update NEWS [ci skip]
- https://github.com/php/php-src/commit/859f7fce1f940b7ea44c32eafb36cd5e22d37176
- [先日の MessageFormatter::formatMessage() の修正](https://qiita.com/sj-i/items/5e05f677117e75927d18#weltling-fixed-bug-74484-messageformatterformatmessage-memory-corruption) の NEWS への追加

## TysonAndre: Fix arginfo for bzcompress
- https://github.com/php/php-src/commit/e20baee1366535f7758d8ac421821fd1e1f19e90
- ext/bz2 で [bzcompress()](http://php.net/manual/en/function.bzcompress.php) が 2 つの必須パラメータをとるよう [arginfo](https://stackoverflow.com/questions/14635111/how-to-make-zend-begin-arg-info-ex-control-number-of-arguments-passed-to-a-php) に書かれていたのを、実際と同様 1 つへ修正

## TysonAndre: Fix arginfo for tidy::__construct()
- https://github.com/php/php-src/commit/dcd4b321859cdf494cb85ac937ad6339121a8c29
- ext/tidy の [tidy::_construct()](http://php.net/manual/ja/tidy.construct.php) の arginfo で、必須パラメータが 4 つあるような書き方だったのを修正
- PHP 7.3 向けで arginfo が追加されていたものへの修正っぽいかな（Reflection の結果とか変わる）

## cmb69: [ci skip] Fix EXTENSIONS
- https://github.com/php/php-src/commit/7956722cfd96fdc244e9ed3dd13e162094be09cd
- ext/xmlwriter の過去のメンテナを誤って違う人にしてたのを修正
Pythonで画像をリサイズしてSCPする画像アップロード環境を構築

どうも！　

今日はPythonで画像をリサイズする環境を作ったので共有したいなと思います。

目次

* 実は意外に難しい画像リサイズ環境
* キャプチャした画像ファイルをサーバーに上げたい
* その時に画像のリサイズをしたい

実は意外に難しい画像リサイズ環境
====

一般的にはImageMagickを使用して画像のリサイズをするのですが、それのラッパーを見つけるのがちょっと大変でWANDというモジュールやPythonのPIL(pip install PILってやろうとしてエラーorz)というモジュールはインストールできませんでした。
そこでPillowというモジュールをインストールすることにしました

```python 

$ pip install Pillow

```

サーバーにあげるスクリプトはたったこれだけ！画面キャプチャにはMac付属のグラブを使用しています。

```resize.py
import glob
from PIL import Image
import os

#デスクトップからスクリーンキャプチャの画像ファイルを引っ張ってきます
os.system("mv ~/Desktop/*.jpeg ./")

basewidth = 500　#この値はお好みで！
l = glob.glob("./*.jpeg")
for file in l:
    img = Image.open(file)
    #width, height = img.size
    wpercent = (basewidth/float(img.size[0]))
    hsize = int((float(img.size[1])*float(wpercent)))
    img = img.resize((basewidth,hsize), Image.ANTIALIAS)#ここで画像のリサイズをします
    img.save(file)

#SCPを使ってアップロードします
os.system("scp -r ./*.jpeg <SSHのユーザー名>@<SSHのIP>:<アップロード先のパス>")
#終わったら綺麗に！
os.system("rm ./*.jpeg")

```

画像のサイズがこれでだいぶ小さくなります！

[導入される際はこちらのクラウドがオススメです！月＄2.5でSSD20GBと大変使いやすいです](https://www.vultr.com/?ref=7296351)

[ブログも細々とやってます！](http://shinnegishi1986.hatenablog.com/)


ご一読ありがとうございます！
gekko インストール on win10

# 概要
- 目的: gekkoをインストールして動作確認する
- 環境
    - windows10
    - Node v8.11
    - VSCode , powershell terminal
- 前提
    - windows BuildTools インストール済み
        - install windows BuildTools & TALib for node.js on windows10
        - https://qiita.com/ta1nakamura/items/a7e52359c80a3a8b6a79
- 参考サイト
    - Official
        - https://gekko.wizb.it/
        - https://github.com/askmike/gekko
        
# Install

```basah
git clone https://github.com/askmike/gekko.git
cd gekko
npm install --only=production
cd exchange
npm install --only=production
npm install tulind --only=production
```

Gekko UI起動
```
node gekko --ui
```

http://localhost:3000へアクセス
![image.png](https://qiita-image-store.s3.amazonaws.com/0/158724/1c866739-8932-f390-ce02-51b3252dd6c2.png)

これが出れば起動成功！
Oculus Goで招待されたPreview Appsを起動する方法


# はじめに

Oculusにはストア公開前にアルファ版とかベータ版を特定のユーザーに公開する機能があります。
Oculusに登録済みのメアドかOculusId(曖昧)に対して招待をしてもらうんですけど、特に通知が飛んでくる訳でもないので、どうやって起動するかというメモです。
(Qiitaに書くような内容じゃないかも)

ほぼRiftと同じでした。

# 起動方法

招待されたらOculus Goを被り、ナビゲーションからOculusストアを起動してください。
開けたら1番下までスクロールすると追加されていると思います。

![39075683_1489262454506549_2952175814201835520_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/55365/8f65e698-bb80-1365-49c2-64621d9b1f57.jpeg)

未確認ですが開発者モードはオンにする必要があるかと思います。
[Unity＋Oculus Go開発メモ - フレームシンセシス](https://framesynthesis.jp/tech/unity/oculusgo/#oculus-go%E3%82%92%E9%96%8B%E7%99%BA%E8%80%85%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AB%E3%81%99%E3%82%8B)


# おまけ：招待されているか確認する

ここからログインしたら確認できる。
https://secure.oculus.com/my/preview-apps

![FireShot Capture 3 - Oculus - https___secure.oculus.com_my_preview-apps.png](https://qiita-image-store.s3.amazonaws.com/0/55365/e70d4e8b-f8b1-67bd-a4be-fc48be75f61f.png)

#　参考

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Oculus HomeのStoreの中に&quot;My Preview Apps&quot;に追加され、インストールが可能となります。Storeの一番下の方に出ると思います <a href="https://t.co/IgP6tiDRGj">https://t.co/IgP6tiDRGj</a></p>&mdash; MuRo (@MuRo_CG) <a href="https://twitter.com/MuRo_CG/status/875184345245286401?ref_src=twsrc%5Etfw">2017年6月15日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


#　余談

クローズドに共有してFBしあえる仕組み良いですよね

関連: [OculusTouch対応アプリMikuTimeVRをPreview公開で育てている話 - Qiita](https://qiita.com/kidach1/items/0bed928d313bd9bd0462)
Visualforce上でAjax動作の備忘録

#Visualforce上でAjax動作の備忘録

###プログラム説明
VisualfroceからAjaxの呼び出しを確認するために簡単な画面を作成
左側側に取引先のNameの一覧を表示
左側に、Nameにマウスオーバさせた取引先の詳細情報を表示する
リファレンスのサンプルソースをちょっといじっただけ。

##ロジック
#####左側ロジック

* 標準リストコントローラを利用。
* recordSetVarで取引先の標準リストコントローラを指定し、DataTableで取引先の一覧を表示。
* outputPanelでAjaxの動作する領域を確保。
* actionSupportを利用して、オンマウスしたタイミングで、
* paramに、Onmouseoverで選択された取引先のid情報を格納する。
* reRenderでAjax要求の結果の更新先のIdを指定

#####右側ロジック

* actionStatusでAjaxの状況を表示。
* outputPanelでAjaxの結果を表示する領域を確保。idはactionSupportで指定したreRenderと同じ値とする。
* detailで取引先の詳細画面を表示。Subjectで表示対象のidを指定。



###ソース
```
<apex:page standardController="Account" recordSetVar="accounts" tabstyle="account" sidebar="false">
	<table width="100%">
        <tr>
            <!--左側　取引先の一覧-->
            <th width="30%">
    			<apex:pageBlock >
                    <apex:form >
                        <apex:pageBlockTable value="{!accounts}" var="a">
                            <apex:column >
                                <apex:outputPanel >
                                    <apex:actionSupport event="onmouseover" reRender="detail">
                                        <apex:param name="ac" value="{!a.id}"/>
                                    </apex:actionSupport>
                                    {!a.name}
                                </apex:outputPanel>
                            </apex:column>
                        </apex:pageBlockTable>
                    </apex:form>
                </apex:pageBlock>
            </th>
            <!--右側　詳細画面-->
            <th width="70%">
			    <apex:outputPanel id="detail">
                    <apex:actionStatus startText="リクセスト中">
                        <apex:facet name="stop">
                            <apex:detail subject="{!$CurrentPage.parameters.ac}" relatedList="false" title="false"/>
                        </apex:facet>
                    </apex:actionStatus>
                </apex:outputPanel>
            </th>                
        </tr>
    </table>
</apex:page>
```

##結果

* マウスオーバで詳細画面がでている。
* ロード時間が短いせいか、actionStatusで指定したメッセージは確認できず。
* ブラウザのデベロッパーツールで通信を見ると、取引先の名前にマウスオーバしたタイミングでPOSTでリクエストがちゃんと飛んでる見たい。
* Classic、LEX動作　共に正常に動作


>参考　Visualforce 開発者ガイド
>https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_quick_start_ajax.htm
Airflow webserver起動時にgunicorn_configが存在しないと怒られるときの対処法

`airflow webserver`実行時にエラーが出る

```:log
.
.
.
Error: 'airflow.www.gunicorn_config' doesn't exist
```

# 解決方法
以下のコマンドを実行してgunicornをアップデートする

`pip install --user --upgrade gunicorn`

# 参考
[AIRFLOW-1102](https://issues.apache.org/jira/browse/AIRFLOW-1102)
LINEAPIとGASを使って遊んでみた

# 雑文メーカー
自分がLINEで送信した内容がGSSのA列に一行ずつ入力されていく。

```gs:雑文メーカー.gs
// シートを取得
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1"); // 「シート1」はシート名

//使用する変数を設定
var PROPERTIES = PropertiesService.getScriptProperties();
var LINE_ACCESS_TOKEN = PROPERTIES.getProperty('LINE_ACCESS_TOKEN')
var LINE_END_POINT = "https://api.line.me/v2/bot/message/reply"
var reply_token;
var query;

function doPost(e){
if (typeof e === "undefined"){
 reply_token = ""
 query = "本"
} else{
  var json = JSON.parse(e.postData.contents);
  reply_token= json.events[0].replyToken;
  //送られたLINEメッセージを取得
  query = json.events[0].message.text;
}
　　Logger.log("検索キーワード"+query);
 writeGss(query);
 postBackToLine();
}

//GSSに受け取った内容を書き込む(A列の書き込みがされているセルの一つ下のセルに書き込む)
function writeGss(query){
  var values = sheet.getRange("A:A").getValues();
  for (var i = values.length - 1; i >= 0; i--) {
    if (values[i] != "") {
      break;
    }
  }
  var last_row = i + 2;
  sheet.getRange("A"+last_row).setValue(query);
}

//LINEに「書きこんだぜ！」と返事をする。
function postBackToLine(){
var messages = [{
 "type": "text",
 "text": "書きこんだぜ！"
}];
Logger.log(messages)
UrlFetchApp.fetch(LINE_END_POINT, {
 'headers': {
   'Content-Type': 'application/json; charset=UTF-8',
   'Authorization': 'Bearer ' + LINE_ACCESS_TOKEN,
 },
 'method': 'post',
 'payload': JSON.stringify({
   'replyToken': reply_token,
   'messages': messages,
 }),
});   
}
```
【React】renderでsetState()すると無限ループになる【React Native】

## 何が起きたか
render()内でsetState()を実行してしまい無限ループ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103475/3226d5c9-f76f-28bf-d730-e3933da02f5c.png)


[Calling setState in render causes infinite loop · Issue #5591 · facebook/react](https://github.com/facebook/react/issues/5591)

## ありがちなソース
ex) 親Componentから子Componentにmethodとvalueをpropsで渡し、子ComponentのonPressイベントでそのmethodを実行する


```jsx:BadMain.jsx

_onPress = (value) => {
  this.setState({ count: value })
}

render() {
  return( 
    <SubComponent onPress={_onPress} value={value} />
  );
}

```

```jsx:BadSub.jsx

const SubComponent = (props) => {
const { onPress, value } = props

  return (
    <TouchableOpacity onPress={onPress(value)}> 
    ...
    </TouchableOpacity>
  );
}
```

これをやっちゃうと

```
<TouchableOpacity onPress={onPress(value)}> 
```
が

```
<TouchableOpacity onPress={setState()}> 
```
と同義になってしまうので、stateの更新=>render=>stateの更新...と無限ルールにハマってしまいます。

## どうするか
render外でsetState()を含むmethodを実行する。

```jsx:GoodMain.jsx

_onPress = (value) => {
  this.setState({ count: value })
}

render() {
  return( 
    <SubComponent onPress={_onPress} value={value} />
  );
}

```

```jsx:GoodSub.jsx

const SubComponent = (props) => {
const { onPress, value } = props
const _onSubPress = () => {
  onPress(value);
}

  return (
    <TouchableOpacity onPress={_onSubPress)}> 
    ...
    </TouchableOpacity>
  );
}
```
記号「■」とメモ帳でQRコードを作成したら綺麗だった（自作font）

# フォント自作に挑戦
[(1)前編](https://qiita.com/good_kobe/items/7c19a0bc589fb44ee07b)
[(2)後編](https://qiita.com/good_kobe/items/e946eb5d8856ace3af1d)

# 自作フォントでQRコードを作ってみた
　最初の主旨と変わってきたが、思いのほか綺麗に表示されたQRコードが作成出来て、問題なく読めたので記載する。

## 入力元文字（■で構成）
```

■■■■■■■　　■　■■　■■■■■■■
■　　　　　■　■■　■　　■　　　　　■
■　■■■　■　■■　　■　■　■■■　■
■　■■■　■　　■　■　　■　■■■　■
■　■■■　■　■　　　■　■　■■■　■
■　　　　　■　■　　■■　■　　　　　■
■■■■■■■　■　■　■　■■■■■■■
　　　　　　　　■■■■■　
■■　■　　■■　■■　　　■■■　■■
　■■■■■　■■■■　　　■　　　　■
■　■　　■■　■　■　■■　　　■■
　　■　■■　　　■■■　　　　　■　　■
■　■　　　■■■　　　■　■　■　■■■
　　　　　　　　■■■■　　　■■■　■
■■■■■■■　■　■　　■　■　■■■■
■　　　　　■　　　■■■■　■■■
■　■■■　■　　■■■　　■■■　■■■
■　■■■　■　■　　■　　　　　■■■■
■　■■■　■　　■　　■　　　■　　　■
■　　　　　■　■　　　　■■　■　■　■
■■■■■■■　■■　■■　　　■■■　　

```
## メモ帳をキャプチャーして張付
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157498/8b4bc4fd-e84e-934a-8b1b-781c4061aad9.png)
HTML5+javascriptでEPUB３を作成する(JSZip編）


[「HTML5+javascriptを使ってブラウザでEPUB３を作成する」](https://qiita.com/99nyorituryo/items/68f4d67bfda5d8aab25d)の記事では、概略として簡略的にかいていたのを詳細に書いてみようと思う。
## JSライブラリの読み込み
JSZIPで圧縮したファイルを生成するには。最低限次のようにjszipとFileSaverを読み込む。

```html:indexhtml
<script type="text/javascript" src="js/jszip.min.js"></script>
<script type="text/javascript" src="js/FileSaver.js"></script>
```
## ZIPの生成
コンソールで、myscriptをコピーして実行すると。sample.txtの内容がsampleでzip圧縮したexample.zipのファイルが生成される。

```js:myscript

var zip = new JSZip();
zip.file("sample.txt", "sample");
zip.generateAsync({type:"blob"})
.then(function(content) {
    saveAs(content, "example.zip");
});
```
## クリックしたら実行するようにする

onclickでクリックしたら上記のzip生成スクリプトを実行するとする。最近は、onclickではなく、addEventListenerを使うのが一般的である。

```html:index.html
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8">
<script type="text/javascript" src="js/jszip.min.js"></script>
<script type="text/javascript" src="js/FileSaver.js"></script>
<script type="text/javascript" src="js/myscript.js"></script>
</head>
<body>
<button type="button" onclick="script()">
ファイルの生成
</button>
</body>
</html>
```

## テキストエリアの内容を書き込む
ここからさらに、テキストエリアから読み込んだテキストをsample.txt内に書き込んでzip圧縮することをやってみる。

index.htmlに次の内容を追加する

```html:index.html
<textarea id="textarea" rows="4" cols="40">ここにZIP圧縮する内容を書き込む</textarea>
```

myscript.jsを書き換える。

```js:myscrpt.js

var sample= document.getElementById("textarea").value
var zip = new JSZip();
zip.file("sample.txt", sample);
```

 これは、document.getElementByIdでIDがtextareaのテキストエリアの内容を読み込んでsampleに代入し。sampleの内容をsample.txtに書き込んでいる。


## 参考

[JSZIPの使い方（英語）](https://stuk.github.io/jszip/documentation/examples.html)
実際にクラスとインスタンスを使って書いてみる

#実践練習➀
商品：ドレス
価格：〇〇円(addTax関数を使用、5000*税金の値段を表示)
割引後：〇〇円(affterDiscountPrice関数を使用、1000値引で)

```Price.php
<?php>
namespace MDshop;//名前空間の設定

class Price{
   public $item;
   public function addTax($price){
   return $price*1.08;//税込み
}
public function discount($price,$reducePrice){
   return $price-$reducePrice;//値引き
```

```Item.php
<?php
Require"../Price.php";//外部ファイル読み込み
$dress=new\MDshop\Price();//新しいインスタンスを作る
$dress->item="ドレス";//itemにドレスを代入
echo "商品:"{$dress->item}<br>
     "価格:"{$dress->addTax(5000)}<br>
     "値引き"{$dress->discount(5000,1000)};
```
これでドレスについてのインスタンスが作成できた

#実践練習➁
名前：田中
年齢：20歳
性別：男
実装するメソッド
⇒改名する
⇒性転換する

```Human.php
namespace MDchallenge;
public $name;
public $age;
public $gender
class Human{
   public function changeName(afterName){
   $this->name=$afterName;
}
public function convertGender(){
   if($this->gender=="男性"){
     $this->gender="女性";
   }else{
     $this->gender="男性";
   }
 }
}
```

```tanaka.php
<?php
Require "../Human.php";
$tanaka=new\MDchallenge\Human();
     
   $tanaka->name="田中";
   $tanaka->age=20;
   $tanaka->gener="男性";

//改名する
$tanaka->changeName("佐藤");
//性転換する
$tanaka->convertGender();
```
これでうまく改名と性転換ができる

#メモ
クラスのあるphpファイルの名前は大文字にする
例：Price.php
react-native 使ったライブラリ




## Navigation 

### React Native Navigation

React Native NavigationはV2になっているもよう

[Home - React Native Navigation v2 - truly native navigation for iOS and Android](https://wix.github.io/react-native-navigation/v2/#/)



## その他

### react-native-splash-screen

[GitHub - crazycodeboy/react-native-splash-screen: A splash screen for react-native, hide when application loaded ,it works on iOS and Android.](https://github.com/crazycodeboy/react-native-splash-screen)








### CodePush

CodePushは便利そうだけど、運用コストが高め、RNとCodePushのバージョンアップに追従しないといけない。

[CodePush](https://microsoft.github.io/code-push/)

[GitHub - Microsoft/react-native-code-push: React Native module for CodePush](https://github.com/Microsoft/react-native-code-push)
React Native Navigation (V2)


2018/9/2現在


[React Native Navigation (V2) by Wix — Getting Started](https://medium.com/react-native-training/react-native-navigation-v2-by-wix-getting-started-7d647e944132)


[Installing - React Native Navigation v2 - truly native navigation for iOS and Android](https://wix.github.io/react-native-navigation/v2/#/docs/Installing)



## install
`npm install --save react-native-navigation@alpha`



##

すごく分かりにくいが、XCodeで設定をがんばってやる

[Installing - React Native Navigation v2 - truly native navigation for iOS and Android](https://wix.github.io/react-native-navigation/v2/#/docs/Installing)


`Link Binary With Libraries section add libReactNativeNavigation.a`
はすごく分かりにくい。＋を押してから`libReactNativeNavigation.a`をAddする


## index.js

```
import { Navigation } from "react-native-navigation";
import App from './App';


Navigation.registerComponent(`navigation.playground.WelcomeScreen`, () => App);

Navigation.events().registerAppLaunchedListener(() => {
  Navigation.setRoot({
    root: {
      component: {
        name: "navigation.playground.WelcomeScreen"
      }
    }
  });
});



```

これで実行
何も変わってないように見えるが、実はちゃんとNavigationされて表示されている。
React Native Navigation




### create app

`react-native init NaviTest`


### test

`react-native run-ios`




## lib install


### 1 Install react-native-navigation latest stable version.

`yarn add react-native-navigation@latest`


## 2 Add ReactNativeNavigation.xcodeproj 

以下をXCodeのライブラリに追加

./node_modules/react-native-navigation/ios/ReactNativeNavigation.xcodeproj


## 3 Build Phasesに追加

Build Phasesに追加

In Xcode, in Project Navigator (left pane), click on your project (top), then click on your target row (on the "project and targets list", which is on the left column of the right pane) and select the Build Phases tab (right pane). In the 

![スクリーンショット 2018-09-02 21.25.43.png](https://qiita-image-store.s3.amazonaws.com/0/49910/683d0c58-4771-e5ff-d65d-7baa47b025d1.png "スクリーンショット 2018-09-02 21.25.43.png")


## 4 Build Settings

Build Settingsを選択
Allを選んだのち、検索BOXに `Header Search` を入力　

Header Search Pathsの行をダブルクリック、表示された領域に以下を入力
`$(SRCROOT)/../node_modules/react-native-navigation/ios`

![スクリーンショット 2018-09-02 21.32.52.png](https://qiita-image-store.s3.amazonaws.com/0/49910/f633df6d-fda9-6a83-1324-bf4af04b140c.png "スクリーンショット 2018-09-02 21.32.52.png")



## 5 In Xcode, you will need to edit this file: AppDelegate.m

Replace @"index.ios" with @"index"

ここはすでになってれば必要ない





## ソース変更


### srcフォルダ作成
./src/app.js作成


```
import { Navigation } from 'react-native-navigation';

import { registerScreens } from './screens';

registerScreens(); // this is where you register all of your app's screens

// start the app
Navigation.startTabBasedApp({
  tabs: [
    {
      label: 'One',
      screen: 'example.FirstTabScreen', // this is a registered name for a screen
      icon: require('../img/one.png'),
      selectedIcon: require('../img/one_selected.png'), // iOS only
      title: 'Screen One'
    },
    {
      label: 'Two',
      screen: 'example.SecondTabScreen',
      icon: require('../img/two.png'),
      selectedIcon: require('../img/two_selected.png'), // iOS only
      title: 'Screen Two'
    }
  ]
});
```


### screensフォルダ作成
index.jsを作成

```
import { Navigation } from 'react-native-navigation';

import FirstTabScreen from './FirstTabScreen';
import SecondTabScreen from './SecondTabScreen';
import PushedScreen from './PushedScreen';

// register all screens of the app (including internal ones)
export function registerScreens() {
  Navigation.registerComponent('example.FirstTabScreen', () => FirstTabScreen);
  Navigation.registerComponent('example.SecondTabScreen', () => SecondTabScreen);
  Navigation.registerComponent('example.PushedScreen', () => PushedScreen);
}
```





# 結果

どうやっても落ちる
うまくいかなさすぎて諦めた


いつか再挑戦します。
MacでPythonの開発環境を構築する

##はじめに
Macには標準でPythonがインストールされていますが、
pyenvを使って複数のバージョン(2系や3系など)のPythonを
簡単に切り替えられるようにするために、
以下の手順に沿って必要なツールをインストールしたいと思います。

## Homebrewをインストールする
[Homebrew公式サイト](https://brew.sh/index_ja.html)からコマンドをコピーし、ターミナルに貼り付けて実行します。

```terminal
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

Homebrewがインストールできたか確認します。
以下の内容が表示されていれば問題ないでしょう。

```terminal
$ brew doctor
Your system is ready to brew.
```

## pyenvをインストールする
複数のPython環境に切り替えられるようにpyenvをインストールします。

```terminal
$ brew install pyenv
```

.bash_profileという設定ファイルに環境変数やinitコマンドを追加します。
もし.bash_profileが存在しない場合は、先に作成しておきましょう。

```terminal
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
```

phpenvインストール後に「brew doctor」を実行するとWarningが出る場合、
.bash_profileに以下のコマンドを追加し、
brewコマンドを使う時だけpyenv用のPATHが通らないようにしておきます。

```terminal
$ echo 'alias brew="env PATH=${PATH/${HOME}\/\.pyenv\/shims:/} brew"' >> ~/.bash_profile
```

設定を反映させるために、以下のコマンドを実行するか、ターミナルを再起動します。

```terminal
$ source ~/.bash_profile
```

## Pythonをインストールする
pyenvでインストール可能なPythonのバージョンを確認します。

```terminal
$ pyenv install --list
```

利用したいバージョンを選んでインストールします。

```terminal
$ pyenv install 3.6.5
```

インストール済みのPythonのバージョンを確認します。
デフォルトではシステム標準のバージョンが選択されている(「*」が付いている)はずです。

```terminal
$ pyenv versions
* system (set by /Users/[ユーザー名]/.pyenv/version)
  3.6.5
```

pyenvで利用したいPythonのバージョンを設定します。

```terminal
$ pyenv global 3.6.5  #システム全体で使いたい場合。
$ pyenv local 3.6.5  #カレントディレクトリだけで使いたい場合。
$ pyenv shell 3.6.5  #一時的に使いたい場合。ターミナルを閉じて再度開いた場合は無効化。
$ pyenv global system  #システム標準の状態に戻す。
```

再度「pyenv versions」を実行し、「3.6.5」が選択されていれば切り替え成功です。

```terminal
$ pyenv versions
  system
* 3.6.5 (set by /Users/[ユーザー名]/.pyenv/version)
```
【GAS】GmailAppに対するマニフェスト設定

## 概要
2018/09/01以降、スプレッドシートのGASでGmailApp.sendEmailを使うと以下のエラーが出る。
![スクリーンショット 2018-09-02 23.21.50.png](https://qiita-image-store.s3.amazonaws.com/0/33165/996b3f46-f0dd-f4c0-7f95-2314aff8a31b.png "スクリーンショット 2018-09-02 23.21.50.png")

これの対応方法をメモ程度にまとめました。

## マニフェストの確認
1. [ファイル]から[プロジェクトのプロパティ]を選択
![スクリーンショット 2018-09-02 23.25.05.png](https://qiita-image-store.s3.amazonaws.com/0/33165/fddcdd30-271f-df3c-5421-ab2db4a1eba4.png "スクリーンショット 2018-09-02 23.25.05.png")

1. [スコープ]を選択するとデフォルトで設定されているマニフェストが見える
※今回のエラーはここに必要なマニフェストが無いことで出ている
![スクリーンショット 2018-09-02 23.25.13.png](https://qiita-image-store.s3.amazonaws.com/0/33165/a6041ebf-5c41-6579-3179-b4d0c48f423b.png "スクリーンショット 2018-09-02 23.25.13.png")

## マニフェストの設定
1. [表示]から[マニフェストファイルの表示]を選択
![スクリーンショット 2018-09-02 23.30.15.png](https://qiita-image-store.s3.amazonaws.com/0/33165/38b5f3ec-94cd-50e0-e85a-fad115b473aa.png "スクリーンショット 2018-09-02 23.30.15.png")

1. マニフェストの追加
マニフェストファイルのappsscript.jsonはデフォルトでは以下のようになっている

```json:appsscript.json
{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER"
}
```

ここに`oauthScopes`を追記して、内容に既存の`https://www.googleapis.com/auth/script.send_mail`と`https://www.googleapis.com/auth/spreadsheets`を加えて`https://www.googleapis.com/auth/gmail.modify`を記述する

```json:appsscript.json
{
  "timeZone": "Asia/Tokyo",
  "oauthScopes": ["https://www.googleapis.com/auth/script.send_mail",
                  "https://www.googleapis.com/auth/spreadsheets",
                  "https://www.googleapis.com/auth/gmail.modify"
  ],
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER"
}
```

以上の対応で、GmailApp.sendEmailが動くようになりました。
スクリプト起動時にGmailへのアクセス許可を求められるので、それはOKしておいてください。

## まとめ
- いきなりの仕様変更で動かなくなったことには焦ったけど、GmailAppからMailAppに変えて対応は出来た。
- しかもメール配信速度はMailAppのが早い
- ただ放置が気持ち悪かったので、一応解決した感じ。
- また別のところで権限周りの問題が起きたときは、同対応で解決出来そう

## 参考記事
[Google Apps Scriptに追加されたマニフェストについて](https://qiita.com/tanaike/items/b3538e7550555ebb51f5)
RaspberryPi3の初期設定 

RaspberryPiの設定を今後のためにまとめておきます。
目次
>
1.RaspberryPiにOS（Raspbian）をインストール
　- 必要なもの
　- Raspbianのインストーラをダウンロード
　- microSDカードにコピーする
　- RaspberryPiへOSのインストール
2.パスワードの変更
3.タイムゾーンの変更
4.日本語のフォントをインストール　＆　日本語
5.言語の変更
6.emacsインストール

#１．RaspberryPiにOS（Raspbian）をインストール
###1.必要なもの
>
 - RaspberryPi
 - microSDカード
 - PC（インターネットがつかえるもの）
 - microSDカードのカードリーダー（PCについてない場合は必要）
 - USBマウス
 - USBキーボード
 - モニタ
 - USB電源
 - HDMI

USBマウスやUSBキーボードはAmazonで安いものを購入しました。
RaspberryPi3に関してはケーブルなど付属したものを購入すると細々揃える必要がなくて便利です！
###2.Raspbianのインストーラをダウンロード
以下のURLに接続するこのような画面に飛びます
<img width="680" alt="スクリーンショット 2018-09-02 17.08.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/285385/14fce07f-19c5-0e10-76cc-dfa17690ff34.png">

https://www.raspberrypi.org/downloads

ここでNOOBSをクリックすると以下の画面に飛ぶので青丸の部分をクリックし,ｚipファイルをダウンロードします。
<img width="988" alt="スクリーンショット 2018-09-02 17.10.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/285385/20d227f3-bf55-919c-241d-c7369b22cff3.png">

ダウンロードに時間がかかる場合がありますが、気長に待ってください。
ちなみにわたしは30分程度かかりました。

###3.microSDカードにコピーする
ダウンロードが済んだら、まずは、zipファイルを展開しましょう。
展開時にエラーが起きた場合はインストールからやり直すとうまくいきます。
うまく展開できたら、展開したすべてのファイルをmicroSDカードにコピーします
###4.RaspberryPiへOSのインストール
RaspberryPiにmicroSDを指し、起動させます。
しばらくするとインストールするOSの選択画面が表示されるので”Raspbian”にチェックを入れ、左上のinstallボタンをクリックします。
installが完了するとRaspbianのデスクトップが開きます。
#2.パスワードの変更
>
[パスワードのデフォルト]
 　　　ユーザー名：pi
　　　パスワード：raspberry

左上のメニューから「Preferences（設定）」->「RaspberryPiの設定」を選択

新しいパスワードを決めたら「change password」ボタンをクリックして変更する
#3.タイムゾーンの変更
左上のメニューから「Preferences（設定）」->「RaspberryPiの設定」を選択
「localisation」タブをクリックして「Set Timezone」ボタンをクリック。
>
「Area」->「Asia」
「Location」->「Tokyo」

に設定
#4.日本語のフォントをインストール
terminalに以下を入力し、日本語のフォントをインストールする
>
```
$ sudo apt-get update  //パッケージの更新
$ sudo apt-get install fonts-vlgothic　　//fontsのインストール
```

#5.言語の変更
左上のメニューから「Preferences（設定）」->「RaspberryPiの設定」を選択
「localisation」タブをクリックして「Set locale」ボタンをクリック。
>
「language」->「ja」
「Country」->「JP」
「Character Set」->「UTF-8」

変更を適用するためにアプリケーションを再起動

#6.emacsをインストール（必要なら）
>
```
$ sudo apt-get install emacs
```
でインストール可能！

#7.日本語入力できるようにする
>
```
$ sudo apt-get install ibus-mozc
```

Rebootしたら入力できるようになっている。


[参考]
RaspberryPiで学ぶ電子工作
Rでdropboxのデータをインポート

RでDropboxのデータリンクからデータを読み込みたいとき。

参照：https://stackoverflow.com/questions/31955995/how-to-download-file-any-form-from-dropbox-using-r


1. データのリンクを作成　https://www.dropbox.com/XXXXX/YYYY.zzz?dl=0
2. 最後のdl=0をraw=1に書き換える　https://www.dropbox.com/XXXXX/YYYY.zzz?raw=1
3. Rで読む

```R

temp <- tempfile()
download.file("https://www.dropbox.com/XXXXX/YYYY.zzz?raw=1",temp)
load(temp) #tempを読み込む。read_csv とか

```
UILabelへ簡単にグラデーションを適用する方法

## はじめに

人は誰しも，1度は理想と現実のギャップに苦しめられる。

例えば，UILabelにグラデーションを適用しようとした時などがそれに相当するだろう。

以下の2つの画像を見比べてみよう。理想は上だが，下が現実だ。

<img width="414" alt="Simulator Screen Shot - iPhone 8 Plus - 2018-09-02 at 22.33.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/195913/467e521a-091f-1073-920d-95e057e889c9.png">
<img width="414" alt="Simulator Screen Shot - iPhone 8 Plus - 2018-09-02 at 22.34.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/195913/72b51ff6-75e6-9d24-3436-4ee6fabab37c.png">

UIViewのグラデーションの知見，即ち`CAGradientLayer`をそのままUILabelに適用しようと考えた浅はかな人間がこの世には存在する。そう，筆者である。

こと人間に限ったことではないが，幸いにも人間には学習能力がある。余談だが筆者は大学時代学習について研究していた。
大学で学んだことを活かせない愚かな私に代わって，誠実で賢い諸君らはどうかこのような失態を犯さぬようここにレポートをまとめておく。役立つ機会が訪れることをここに願う。

## レポート

【結論】`UIView`にグラデーションを適用し，`UILabel`でマスクする。

```swift
let frame: CGRect = /* foo */
let view: UIView = UIView(frame: frame)
let label: UILabel = UILabel(frame: frame)

label.text = /* bar */
// ViewにLabelを追加する
view.addSubView(label)

// CAGradientLayerによるグラデーションの適用
let gradientLayer: CAGradientLayer = CAGradientLayer()
gradientLayer.frame = view.bounds
gradientLayer.colors = [
    /* UIColor */
]
// グラデーション方向の指定 (以下は縦方向)
gradientLayer.startPoint = CGPoint(x: 0.5, y: 0)
gradientLayer.endPoint = CGPoint(x: 0.5, y: 1.0)

// Viewに対してグラデーションを適用させる
view.layer.insertSublayer(self.gradientLayer, at: 0)

// ViewをLabelでマスクする
view.mask = label
```

以上。

## 参考

- [Quickly apply gradient colors to text in iOS](https://medium.com/@kgellci/quickly-apply-gradient-colors-to-text-in-ios-299f7639b514)

## 宣伝

[CiNiiのAPIクライアント](https://github.com/YutoMizutani/CiNiiKit) とか [iOSのソフトウェアアーキテクチャ知ってるやつ全部書いたやつ](https://github.com/YutoMizutani/architectures) [\[記事\]](https://qiita.com/YutoMizutani/items/260f684871b77732e18f) とか [心理学実験できるやつ](https://itunes.apple.com/jp/app/operantchamberapp/id1250835517?mt=8) とかやってます。
AWSのスペックの変更


## 本記事のターゲット
- AWSのスペックを変更したい

## スペック変更の仕方

### 手順1
AWSにログインして「EC2」リンクをクリック
![pic001.JPG](https://qiita-image-store.s3.amazonaws.com/0/248805/370cf568-a0a7-676e-903a-f02e8432ace7.jpeg)

### 手順2
左メニューの「インスタンス」をクリック
![pic002.JPG](https://qiita-image-store.s3.amazonaws.com/0/248805/7c4ba921-93dc-e767-257e-5995b10951b3.jpeg)

### 手順3
停止したいサーバーを右クリックして、インスタンス状態の停止を選択
インスタンスの停止を行っていないとスペックの停止ができないので注意！！！
![pic003.JPG](https://qiita-image-store.s3.amazonaws.com/0/248805/fcfd6ad9-60cc-443a-6cb2-72091aa017a5.jpeg)

### 手順4
インスタンスの設定→インスタンスの変更を選択
![pic004.JPG](https://qiita-image-store.s3.amazonaws.com/0/248805/1aba21d8-f609-99cf-f9f9-6678d540d8c2.jpeg)


### 手順5
変更したいスペックを選択
※ 無料枠のデフォルトは `t2.micro`
![pic005.JPG](https://qiita-image-store.s3.amazonaws.com/0/248805/c139a092-b777-8aba-d646-f8e1052fd0d4.jpeg)
【Android】Bitmapのリサイズ

# 基本
Bitmapのリサイズには``Bitmap#createScaledBitmap()``を使います。

* [Bitmap#createScaledBitmap()](https://developer.android.com/reference/android/graphics/Bitmap.html#createScaledBitmap(android.graphics.Bitmap,%20int,%20int,%20boolean))

|引数|型|説明|
|:--|:--|:--|
|src|Bitmap|リサイズ対象のBitmap|
|dstWidth|int|リサイズ後のBitmap幅|
|dstHeight|int|リサイズ後のBitmap高さ|
|filter|boolean|リサイズ時にフィルターを使用するか|

## How to use

例えばアスペクト比を保ったままViewに表示できる最大サイズにリサイズを行う場合はこうなります。

```java
// リサイズ前のBitmap
Bitmap beforeResizeBitmap;

// リサイズ比
double resizeScale;
// 横長画像の場合
if (beforeResizeBitmap.getWidth() >= beforeResizeBitmap.getHeight()) {
    resizeScale = (double) viewWidth / beforeResizeBitmap.getWidth();
}
// 縦長画像の場合
else {
    resizeScale = (double) viewHeight / beforeResizeBitmap.getHeight();
}
// リサイズ
Bitmap afterResizeBitmap = Bitmap.createScaledBitmap(beforeResizeBitmap,
        (int) (beforeResizeBitmap.getWidth() * resizeScale),
        (int) (beforeResizeBitmap.getHeight() * resizeScale),
        true);
```

# filterについて
第四引数のfilterは有効/無効どちらにするかで、場合によってはリサイズ後の画像に大きな違いが出てきます。

## 実験
以下の画像で縮小表示、拡大表示を行い、それぞれでfilterの有効/無効を試してみます。

**元画像**
![shiroha_and_umi.png](https://qiita-image-store.s3.amazonaws.com/0/235452/69dd9d55-365e-3919-6fb1-7b8fead294aa.png)

### 縮小
#### 等倍表示
![00_downScale_Original.png](https://qiita-image-store.s3.amazonaws.com/0/235452/1d29e99f-d509-f7e6-813a-7783c21dde65.png)

#### filter有効
![02_downScale_filterOn.png](https://qiita-image-store.s3.amazonaws.com/0/235452/cd30143a-0d39-af8c-40e8-81c1781eb21e.png)

#### filter無効
![01_downScale_filterOff.png](https://qiita-image-store.s3.amazonaws.com/0/235452/5a8a50c5-9edf-de58-539d-3f461d57dff1.png)

#### filter有効/無効のdiff
![downScale_diff.png](https://qiita-image-store.s3.amazonaws.com/0/235452/dbdfe32c-969e-35cc-c5b7-f4a6a81f807c.png)
※真っ黒のほど差分が少ない

#### 所感
縮小ではfilterを無効にするとジャギーがはっきりと表れる。

### 拡大
#### 等倍表示
![03_upScale_Original.png](https://qiita-image-store.s3.amazonaws.com/0/235452/04a41c67-aaa0-4420-60b9-998246dd1e32.png)

#### filter有効
![05_upScale_filterOn.png](https://qiita-image-store.s3.amazonaws.com/0/235452/e3d19521-ec1d-1410-006b-24a40f73967a.png)

#### filter無効
![04_upScale_filterOff.png](https://qiita-image-store.s3.amazonaws.com/0/235452/5b5a8b66-9065-05c5-baac-60b2142fb3ef.png)

#### filter有効/無効のdiff
![upScale_diff.png](https://qiita-image-store.s3.amazonaws.com/0/235452/8f33de2d-a55a-6952-1527-dc37f2928c99.png)
※真っ黒のほど差分が少ない

#### 所感
拡大においてもfilterを無効にするとジャギーが表れるが、縮小と比べるとジャギー感は小さい。

### まとめ的な何か
自分で拡縮を書かないならばfilterは有効にしておいた方が無難っぽい。
iosアプリ　ViewControllerのライフサイクル

##※初心者の自分用メモです。間違っていましたら、指摘していただけると嬉しいです。##


##ライフサイクル##
<dl>
<dt>init(coder:)</dt>
<dd>一度だけ呼ばれる。この時点ではviewControllerはインスタンス化されていない。バグの原因となるのであまりいじらない方が無難。</dd>
<dt>init(nibName:bundle):</dt>
<dd>nib fileからViewControllerを生成する際に使用。</dd>
<dt>loadView</dt>
<dd>インターフェイスをコードで生成する際にオーバーライド。</dd>
<dt>viewDidLoad</dt>
<dd>viewが生成された際にだけ一度だけ呼ばれる。呼び出された際には、全ての要素が配置についている。ユーザーが目にする前にデータを格納する。バックグラウンド処理の開始。通信など一度だけする際に。viewのboundsは定まっていない。</dd>
<dt>viewWillAppear</dt>
<dd>viewControllerが画面に出るたびに呼ばれる。viewControllerが表示されてなかった間の値の変化などを画面上に反映させるなど。アニメーションの開始。viewのboundsが定義されるが、orientationは適用されない。</dd>
<dt>viewWillLayoutSubViews</dt>
<dd>subViewが配置される際に呼ばれる。回転などレイアウトが変わる際に呼ばれる。AutoResizingなどを使わない場合、ここでsubViewを更新する。</dd>
<dt>viewDidLayoutSubViews</dt>
<dd>suvViewが配置された際に呼ばれる。</dd>
<dt>viewDidAppear</dt>
<dd>データの取得開始。</dd>
<dt>didReicieveMemoryWarning</dt>
<dd>メモリが逼迫した際に呼び出される。</dd>
<dt>viewWillDisappear</dt>
<dd>画面の遷移が始まり、元のviewControllerが画面から除かれる直前に呼ばれる。用途不明。</dd>
<dt>viewDidDisappear</dt>
<dd>元のviewControllerが画面から除かれた際に呼ばれる。通知の停止など。</dd>
<dt>deinit</dt>
<dd>viewがメモリーから削除される際に呼ばれる。ARCで解放されなかったviewControllerを手動で取り除く際に使用。</dd>
</dl>


また追記していきます。
簡易脳波計ブレインコンピュータインタフェース(BCI/BMI)に使えそうな分析手法

# はじめに
追記2018/9/17

ブレインコンピュータインタフェース(BCI/BMI)は、脳波を読み取り、周辺の機器に対し作用するインターフェースです。
昨今は簡易脳波計と呼ばれる、イヤホンのような手軽さで着脱可能な脳波計が登場したため
福祉関連のほかに、ゲームやエンターテイメント方面での活用が見込まれ、今後も発展が見込まれる技術だと感じています。

本記事および関連記事では簡易脳波計BCIに用いる、脳波をリアルタイムに分析可能な手法や信号処理について紹介していきたいと思います。

簡易脳波計によるBCI開発中の方々の助けになれば幸いです。

なお、紹介する手法は、脳波を周波数ベースで解析する技術を中心にしますので事象関連電位については省略します。

基本的なBCIについては以下の記事が参考になります。
https://qiita.com/shartsu/items/e0dbedd891a53a4eb139

# 今回紹介する手法一覧
・短時間フーリエ変換


# 短時間フーリエ変換（STFT）
時系列データを一定時間ごとに区切って、高速フーリエ変換を実行することで、一定時間の信号に含まれる周波数成分を分析する方法です。
この手法によって、ほぼリアルタイムで脳波を解析し、ある時間におけるα波やβ波といった成分を抽出することができます。
また、運動想起脳波は運動前のα波やβ波の変化によって検出できます。ただし、短時間フーリエ変換を一定時間ごとに行うだけだと、ノイズに埋もれている成分があり、BCIが誤作動することがあります。そこで、得られた周波数成分を加算平均するなどの工夫を合わせて行うことが重要になります。

STFTについて、詳しくは以下の記事が参考になります。
https://qiita.com/icoxfog417/items/d376200407e97ce29ee5

# 脳波解析における短時間フーリエ変換の利点
脳波は一般的に揺らぎが多い信号であるといわれ、多くのBCIでは「加算平均」を用いて揺らぎの影響を極力減らすように処理を行っています。事象関連電位のような外部刺激由来の脳波であれば、刺激をトリガとして計測した脳波を時系列で合わせて加算平均すれば良いですが、外部の刺激に依存しないBCIを構築しようとした場合は、加算平均の基準がありません。そこで、一度脳波を短時間フーリエ変換し、周波数スペクトルを求めることで位相情報を削ります。求めた周波数スペクトルを成分ごとに加算平均することで、揺らぎの問題を軽減することができます。これにより、外部刺激に依存しないBCIでも、揺らぎの影響を受けにくくすることができます。更に、筋電や眼電位の影響を軽減することにもつながります。


# 終わりに
次回は、脳波から新しい特徴量を見つける際の考え方や可視化について説明したいと思います。
今回は画像やグラフなどが説明できていないので、後程追記するかもしれません。

もし、「○○について記載してほしい」などご要望がありましたらコメントよろしくお願いいたします。