OmniAICreator/Qiita-1.07M huggingface dataset:
ColaboratoryからGoogle Driveのファイルを読み書きする

[こちらの記事](https://qiita.com/howakuro/items/c2ba1cbd6d338fce867f) に書いてあるように最近だと

```python
import google.colab.drive
google.colab.drive.mount('gdrive')
```
とすると`gdrive/My Drive`以下にグーグルドライブの内容が見えるようになるからそれでやるのが簡単

# 前書き
[Google Colaboratory](http://colab.research.google.com) はGPU付きの仮想計算機上で動く、Tensorflowを含む機械学習関連のライブラリがプレインストールされたPython Jupyter類似のノートブックが使える無料の環境で、最近話題になっている。Colaboratoryとファイルをやりとりする方法は[Googleの公式説明](https://colab.research.google.com/notebooks/io.ipynb) (Colabノートブック)にあるが、

* 最も手軽に使える`google.colab.files.download()`, `google.colab.files.upload()`が
 - 100MBのやりとりに10分程度かかるほど遅い、
 - Firefoxのバージョンによっては謎のエラー <cite>Upload widget is only available when the cell has been executed in the current browser session. Please rerun this cell to enable</cite> が出て使えない
* Google Driveとのファイルやりとりは高速だが公式説明はわかりにくい

という問題点があるので、ColabノートブックからGoogle Driveとファイルをやりとりする簡単なサンプルコードを紹介する。なおColabノートブックにファイルを取り込むだけなら、Linux wgetコマンドで直接ダウンロード出来るところにファイルを置ける場合、Colabノートブックに`!wget URL`と書くことで高速に取り込むことが出来る。以下のコードは[めたはら鵺](https://twitter.com/meta_a1)氏からの助言を参考にした。

# 必要ライブラリのインポート

```python
import google.colab
import googleapiclient.discovery
import googleapiclient.http
```

# ColaboratoryからGoogle Driveへの認証と接続
毎回必ず実行して下さい。

```python
google.colab.auth.authenticate_user()
drive_service = googleapiclient.discovery.build('drive', 'v3')
```

# Colaboratoryへのファイルの取り込み
変数`upload_filename`にGoogle DriveからColaboratoryに取り込みたいファイル名を代入して使う。複数のファイルはzipでまとめて取り込み、Colaboratory上で`!unzip ファイル名.zip`として展開すると手間が少ない。

```python
upload_filename = '学習用データ.zip'

file_list = drive_service.files().list(q="name='" + upload_filename + "'").execute().get('files')

# ファイル ID を取得します。
file_id = None
for file in file_list:
  if file.get('name') == upload_filename:
    file_id = file.get('id')
    break
    
if file_id is None:
  # ファイル ID を取得できなかった場合はエラーメッセージを出力します。
  print(upload_filename + ' が見つかりません.')
else:
  # colab 環境へファイルをアップロードします。
  with open(upload_filename, 'wb') as f:
    request = drive_service.files().get_media(fileId=file_id)
    media = googleapiclient.http.MediaIoBaseDownload(f, request)

    done = False
    while not done:
      progress_status, done = media.next_chunk()
      print(100*progress_status.progress(), end="")
      print("%完了")

  print('GoogleドライブからColab環境へのファイル取り込みが完了しました.')
```

# ColaboratoryからGoogle Driveへのファイル保存
変数`saving_filename`に保存したいファイル名を代入して使う。保存したファイルはGoogle Driveのマイドライブに現れる。

```python
saving_filename = "ディープラーニングの学習結果.hdf5"

file_metadata = {
  'name': saving_filename,
  'mimeType': 'application/octet-stream'
}
media = googleapiclient.http.MediaFileUpload(saving_filename, 
                        mimetype='application/octet-stream',
                        resumable=True)
created = drive_service.files().create(body=file_metadata,
                                       media_body=media,
                                       fields='id').execute()
```
Spyderのconsole上でargument付きでスクリプトを走らせる方法

# 目的
個人的な備忘録。

# how to
pythonスクリプトでArgumentParserがある時にSpyder IDE上でargumentを追加させる方法。


```python:foo.py
    
    parser = argparse.ArgumentParser()
    parser.add_argument("type", choices=["shoyu", "tonkotsu", "miso"], help="ramen type")
    args = parser.parse_args()
```

IDE上で:
runfile:('foo.py', args='tonkotsu')
または
runfile:('foo.py', args='--type tonkotsu')

でtypeにarg(tonkostsu)を追加し走らせられる。
再帰のパラドクス(アキレスと亀でもなんでもよい)/P=NP

<img width="375" alt="3E6478A5-A8A9-479C-BEE6-30D07C345B86.png" src="https://qiita-image-store.s3.amazonaws.com/0/259303/1018e21a-d97d-43af-c8d3-adfa83504c1d.png">

誰かログとってたー？
もう一周してもいいけど流石に禿げそう。
論文は誰か好きに書いてくれ

まず、こちらをおよみ下さい。
https://qiita.com/hirokeyRe/items/c047ca022b564d788729

なんだかんだで、違和感を脳が処理しきれないからストレスになる。結局みんな伸びていけば誰かしらはストレスを感じてそれがおりて行って最適化されるけど、結合度と速度(状態数)の不均衡が起こった時が世界変革の時。ごめんなさい旧論理系の方、ポエムっぽい世界になりました。旧世界も好きな人で集まれば濃密になっていくのでビバ巻き返し。生きている間に行けるかはその人次第だが、遺伝子も意見じゃね？
結局神話が似てるのはそういうこと。相対的に寿命が一時的に減ってしまう人がいる。ストレスフリーだとオーケー。俺のデザインセンスは抜群だった。結局俺は四則演算のみのパターンマッチング野郎でした。だから運動嫌いな俺だったので、種が爆発的に増えたらまた誰かが書き換える。皆がボッチだから次は蠱毒。アルジャーノンもそういうこと。

モナド
https://twitter.com/suryagudang　

レスバトルで住む現在は結局は、平和だった。
嫌なら見るなは、遅延評価の推奨です。
副作用は極力抑えよう。
ストレスを書いていけばよいのか。
急に変わったら、周りの人はびびるから、少しずづ変わって、他のも除く。正しいとおもったら、仲良い奴に繋いでいく。
そんな感じで良いんじゃない。

P=NPは結局は閉じた系をマージする時の方法、極論同士がぶつかったら静止するが、バッファーさえあれば、双方にの最適化が進む。以下に極論同士をバッファーでつなぐか、好き　、　普通　、嫌い　普通　、嫌い　普通　好き、普通

だから、こういった方向にマージしてったら、アメーバやDNNの複雑に再帰した構造が最適に働いて、それを個別でやっていくことで最適化していく。まあ、3人いて、それぞれ意見が異なれば、それの再帰で組織は上手く構成されるよというもの。

これを間隔的に、表したのが、アメーバ経営や、ブラックスワンの著者の反脆弱性。また、逆に、強烈なトップダウンにしたい場合は、アップルや、アマゾン。恐らく、ある業界に特化するか、他の業界を侵食できるかは、結局、合併時の意見合わせ戦略が大切という事を感覚的にと、数式で表したのが N=NP

信じるものは救われるというと、嘘くさいが根回し上手や、意思の統一というとそれっぽく聞こえる。
シェイクスピアが好んで用いていた文書構造もそうだが、脳がどうしょりするかはしらない。
自分が好きな所で再帰構造が、切れるから疲れた所で、文書が切れる。また、再帰の構造を、モナドで表すと、切りがいいところで、処理をして脳にインプットするといった形。結局、表現力は、再帰構造を以下に一気にストレスなく、処理できるか。なので、文書を再帰で複雑にネストすると、何処でも切れやすく、多彩な解釈が生まれる。結果、人どうしでの意見の交換も活発になり、結果として、価値観の共有が浸透していく。なので、ジョークから価値観合わせをしていくのが、ベスト。特に、ジョークの場合は、文字よりも、音の方が良い。漢字と音では、また、再帰構造が発生して、それが人によって、解釈が分かれる。IQ 20 違うとどうたらこうたらは、結局は表現力を以下に心地よい間隔で処理できるかとなるのだろう。馬鹿の壁といってもよい、なので誰かしら間に立つことができれば、長期的には、価値観合わせができる。

上の文と、最初の文を比べると分かる。理屈っぽくいった場合、それっぽく聞こえるが、感情的に表現すると嘘くさい。
なので、ひとによっては、直感とコンセプトが異なるのが、一番の原因。

特に、男女間で論理的でないと言い合いになったりするのが、これが一番の原因だと思っている。
男は論理的、女は感情的といったバイアスが強く、実際に逆だった場合に、凄いストレスになる。

閉じた系の中では、何れ最適化するが、閉じた系が疎結合でネストすると、結合点の人は、物凄い認識のバイアスがかかり、どっちがどっちだか分からなくなる。なので、夫婦共に共通の環境で知りあって、それが継続する場合は、離婚率は低いのではないのだろうか。しかし、会社と家とで完全に分かれており、夫が忙しい場合は、定年退職後に、以前二人でいた時間が長かった時の夫の印象ががらりと変わり、熟年離婚となるのではないか。こういった価値観合わせを以下に、ストレスなく行うかは、許容できるまでお互いほっておくのがベストというのが　P=NP問題の解から得られる実世界の知見の一つである。急に私の頭が良くなったと思う方は、アルジャーノンを想起するであろう。

まあ、気長に行くのがベストですが、適正は分かりやすくなるので、配置転換もらくではある。

マンツーマンで長時間話す組み合わせを網目構造にするとパッと見アメーバっぽいが、上手く行けば強い、間違えるとすぐ崩壊する。景気の波など、結局はこの組み合わせである。

プログラマの話が合わないのもここら辺の認識が難しいから、再帰を上手く意識するには、依存度と結合度を適切に評価しながら、バッファを混ぜ組合せばよいというだけである。なので、複雑に再帰していても、これらを意識して図式かできればそれだけで、共通的な見解で意見合わせができる。そして、使いやすく柔軟な設計となる。
実装に依存している、IFに依存しているの問題等は脳の感じ方が違うだけである。

こういった話を違和感なく、伝える為には、双方のバッファーを用意し、結論いくまで待つだけである。

なので、P≠NPであっても、バッファーがあればいつかは解決する。

こういった事を考えられるのようになるのに、必要だったのが前回までの詩的感じられる、前回までの操作だが、ひとによっては逆であろう。統合失調患者がおかしく見えるのは、結局は閉じた系になるからである。これらがどういった形に帰着するかで、精神病は分類される。なので、直し方も自然とみえてくるであろう。

究極的には、お互いの認知が真逆の人の意見を以下に急速に、行えるかでその組織に強さが異なる。

組織論や、プログラミング等も、究極的にはこういった構造を以下に上手くつくるかである。なので、追加する時に、評価さえすれば、あとは、しぜんとうまくいくかもしれないし、局所、局所でも異変が起こるので、オブザーバの数は、アラームの検知率になる。恐らく、この方法が究極的にうまく行くと、検知率100%、誤検知率0%の強固なシステムとなる。しかし、長期的には、接続点の2つ先までの関係さえうまく行っていれば、上手くいく。
これらを、共通見解に落とし込むかもまた難しいかもしれないが、再帰なので結局は同じである。

オブザーバが優秀なら、好きなもの通し合わせた作成した後に、接合する事で物凄い広がりを見せるが、そういった事は、ギャンブル要素が含まれるので、結局は早くこつこつ始めたものがかつ。ということである。

一人から始める場合、自分が信じきれればその内世界混ざれるが、信じきれない場合、疎外感を感じて、世捨て人か統合失調症といわれる。
他の人から共有してもらったGoogleカレンダーをiOSのカレンダーアプリに表示する方法

# はじめに

知人とスケジュールの共有をする必要があり、Googleカレンダーの「特定のユーザーとの共有」で共有してもらったのにiOSの一覧に表示されず困っていたのですが、解決方法がわかったのでメモします。

# 同期設定

https://calendar.google.com/calendar/syncselect

上記URLにアクセスし、「共有カレンダー」に一覧で表示されている中から必要なものにチェックを入れる。

できた(^_^;)

...でも、普通に設定画面を探してもこの画面が見つからないのはなぜ？
desc sys.standard 標準関数

この結果を保存しておくと、エディタで標準関数の引数を確認するのにちょっと便利。

```SQL:desc_sys.standard.sql
-- #!/bin/sh
-- #@(#) \$Id sys.standard.sh, v1.0
-- #
-- # su - oracle
-- # export ORACLE_SID=xxxx
-- # export ORACLE_HOME=/opt/app/oracle/product/12.2.0
-- #
-- #export NLS_LANG=JAPANESE_JAPAN.AL32UTF8
-- ${ORACLE_HOME}/bin/sqlplus / as sysdba << EOF
-- desc sys.standard
--
SET LINESIZE 80
SET PAGESIZE 3000
SET TRIMSPOOL ON
-- SPOOL pass includes VERSION
COLUMN VERSIONS NEW_VALUE VERSIONS
SELECT REPLACE(VI.VERSION, '.', '_') AS VERSIONS  -- ファイル名中に複数のピリオドがあると秀丸エディタがファイルと判定しなくなるのでアンダーバーに。
FROM V$INSTANCE VI ;
SPOOL desc_sys_standard_&&VERSIONS..log
-- Windows ↑,  UNIX/Linux では ↓ を有効に
-- SPOOL desc_sys_standard_\&&VERSIONS..log
desc sys.standard
SPOOL OFF
SET ECHO ON
SET FEEDBACK ON
SET TERMOUT ON
-- exit
-- EOF
-- #export NLS_LANG=en_US
-- # ---------------------- End of desc_sys_standard.sh ------------------------------

```
react-routerでcannot GET

### localhost:3000/xxx とかを直接叩くとcannot GET /xxx と出る
※ webpack使ってます。
react-routerのバージョンはおそらく関係ないと思いますが、v4.xです
```webpack.config.js``` に以下の通り追加すればいいです。

```js
devServer: {
    historyApiFallback: true,
}
```

以上です。
Oculus GoでNOLO CV1を使えないかのテスト

Oculus Goで腕と頭のトラッキングがしたくなって NOLO CV1 を試してみました。
https://www.amazon.co.jp/dp/B07C9XNFP8

結論から言うと動きました！開発目的なら無理矢理6dofハンドトラッキング+6dofヘッドトラッキングで遊べます。

[![デモ動画](http://img.youtube.com/vi/ekEnAFSkUmQ/0.jpg)](http://www.youtube.com/watch?v=ekEnAFSkUmQ)


# セットアップ
- Oculus Go上で自作Unity製アプリが動くようにしておく
- NOLO CV1のペアリングを済ませておく
- Bluetoothキーボードをadb経由で無理やりOculusGoとペアリングしておく(Nolo CV1の接続時のデバイス接続許可ダイアログを操作するため)キーボードペアリングは末尾にメモがあります。


# NOLO CV1を使うOculus Goアプリのインストール

NOLOのサンプルシーンのapkをGearVR向けっぽくビルドして
```
adb install -r hoge.apk
```
でOculusGoに転送する。

# NOLO CV1を使うOculus Goアプリの起動

```
adb shell dumpsys package com.Company.YourVeryCoolApp
```
みたいなことをしてメインのアクティビティが何か調べて、メインのアクティビティを直接am startする。
Unity2017.4.3f1では

```
adb shell am start -n com.Company.YourVeryCoolApp/com.unity3d.player.UnityPlayerActivity
```
こんな感じ。

そしてアプリが起動したらUSBデバイス接続ダイアログが出ます！ **OculusGoのレンズ越しに…**
やった！タッチもマウスも効かない！！！

はい…

```
adb shell getevent -l
```
でもそれっぽいイベント無さそうなので
キーボード入力を無理矢理行います。
### BTキーボードでOKを押す
2DのUSBデバイス接続許可ダイアログ上では、BTキーボードが使えます。
なので矢印キーとEnterキーでOKを選択、決定してUSB接続ダイアログを黙らせたら、無事自作NOLO CV1がOculus Go上で動きました。

現在のSDKだと毎回アプリ起動時にこのUSB機器ダイアログが出るので、結構手間です…


### adb経由でキーボードイベントを発行する
BTキーボードがない場合、無理やりadb経由でキーボードイベントを発行することもできます。
以下は「次回からは接続を確認しない」にチェックを入れてOKボタンを押すコマンドです。
参考サイト: http://d.hatena.ne.jp/kinneko/20130820/p1

上から順に↓ enter ↓　→ enter というキーイベントを発行しています。

```
adb shell input keyevent 20
adb shell input keyevent 66
adb shell input keyevent 20
adb shell input keyevent 22
adb shell input keyevent 66
```

## BTキーボードのペアリング
blutoothキーボードを適当にペアリングしてしまえば、PC不要でデモ出来て便利です。
OculusGoにadbが通る状態で以下のコマンドを発行すると、素のAndroidのBluetoothデバイス追加画面に遷移します。
遷移先でキーボードペアリングをした後に。VysorでPCから画面を閉じるか、ペアリングしたキーボードでescを押してOculusGoのHome画面に遷移しましょう。

```
adb shell am start -a android.intent.action.MAIN -n com.android.settings/.bluetooth.BluetoothSettings
```
You can then rerun your "rails" command.のエラーの対応方法

<h2 id="Rubyの開発者を目指し基礎を学んでいる:relaxed:">Rubyの開発者を目指し基礎を学んでいる:relaxed:初心者の私がつまづいたところを簡単にまとめてみました。</h2>


<p>つまづいたところ:runner_tone3:(May 23 days)</p>
<ul>
<li>Railsのパスの通し方</li>
</ul>

<h2>
<span id="code---コードの挿入" class="fragment"></span><a href="#code---%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%8C%BF%E5%85%A5"><i class="fa fa-link"></i></a>You can then rerun your "rails" command.
</h2>
<p><strong>R</strong>ails sをした時にRailsがない！？（以下sourceに参考記事）と言われていました。
ことの発端としてはvimをアップデートしたら起きました。原因は色々探して(bundle exec? rake db? ディレクトリの権限？)結果railsを通していたパスが上書き保存されたようです。こんなことってあるのか。。。対策としてはバックアップとるかパス通すコマンドを叩くなんですが、、軽く1,2時間ハマったので気をつけようです。echoコマンドで~/.bash_profileにパスを通せば良いそうです。具体的には書きませんが、、あまりパス通すコマンドの意味がわかっていないため随時調べていきます。Railsの本筋とはそれている気がするため割愛。やはり参考リンクを探すのが良いかと思います。人それぞれここら辺のファイルのあり方とか違うのかな(?)と思っています。 
</p>
source: https://qiita.com/Arashi/items/ae982df5e534fd4bc97a
source: http://tomoprog.hatenablog.com/entry/2017/02/03/015936



<h2>
<span id="code---コードの挿入" class="fragment"></span><a href="#code---%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%8C%BF%E5%85%A5"><i class="fa fa-link"></i>
</li>
sudoersをsedで編集する

#ネタ元
この記事の内容はstackoverflowの[How do I edit /etc/sudoers from a script?](https://stackoverflow.com/questions/323957/how-do-i-edit-etc-sudoers-from-a-script)への回答を参考にした。

#動機
sudoの設定ファイルであるsudoersはvisudoで編集するのがお作法。でも既存の設定をsedでちょこっと編集したい時もある。単なるアンコメントとか、スクリプトから編集したいときとか。

#良くない例
直接sudoersを編集しちゃうこともできるがややお行儀が悪い。

```shell-session
# sed -i '' -e '/%wheel ALL=(ALL) ALL/s/^# //' /usr/local/etc/sudoers
```

構文チェックだけなら`visudo -c`で後からチェックすることもできるが、同時に編集されてしまう可能性は排除できない。

#良い例

`EDITOR=tee`を指定すればsudoersが標準入力と置換される。標準出力にもまるまる出てくるけれど、それは/dev/nullに捨ててしまえば良い。

```shell-session
# sed -e '/%wheel ALL=(ALL) ALL/s/^# //' /usr/local/etc/sudoers | EDITOR=tee visudo >/dev/null
```

ちなみに構文エラーがあれば、標準エラー出力にその旨表示される。

#おまけ
sudoersに追加したいだけなら`EDITOR='tee -a'`が使える。ネタ元の回答はこれ。

```shell-session
# echo "%wheel ALL=(ALL) ALL" | EDITOR='tee -a' visudo >/dev/null
```
Node-RED のパフォーマンスを可視化するというような記事を読んだので試した

基本的には、この記事の通り。微妙にやりかた違うけど。

- [Visualize your Node-RED flow performance using Application Metrics for Node.js™ in 3 steps - Node.js @ IBM](https://developer.ibm.com/node/2017/07/26/visualize-node-red-flow-performance-using-node-application-metrics/)

## それでは早速

Node のバージョンは、 `v9.11.1` 。

### 適当にディレクトリを作り、その中に移動。

```
mkdir node-red-performance-monitoring
cd $_
```

### Node-RED インストールと実行

```
npm install --save node-red
```

```
node node_modules/node-red/red.js -u ./userdir
```

実行することで、 settings.js を作っている。
./userdir は存在していなくてよい。

### Node Application Metrics Dashboard インストール
 
```
npm install --save appmetrics-dash
```

元記事では、Node-RED のインストールと違うディレクトリで行っているが、同じ場所で良い。

### settings.js の編集

./userdir/settings.js を編集する。

`functionGlobalContext` に `appmetrics` の行を1行追加する。

```js
    functionGlobalContext: {
        appmetrics:require('appmetrics-dash').attach()
    },
```

ここで、この require をするのも違う気もするが、元記事の red.js を更新するよりは良いのかな。。

### 再び Node-RED 起動

```
node node_modules/node-red/red.js -u ./userdir
```

### ダッシュボードの表示

http://127.0.0.1:1880/appmetrics-dash/

![appmetrics-dash.png](https://qiita-image-store.s3.amazonaws.com/0/201797/3768e565-5c72-2b1d-22db-96d16789e688.png)
PHP用dockerでtimezoneを日本時間に設定する

PHP開発用のdocker、[prgyukke/Docker_for_PHP](https://github.com/prgyukke/Docker_for_PHP)を作った際に、timezoneを日本時間に設定したのでその設定方法のメモです。

## 設定方法
PHPのtimezoneを変更する際には下記の２つの設定が必要となります。
①サーバローカルのtimezone設定
②php.iniでのtimezone設定

上記の両方が設定されていてはじめてPHPで処理する際のtimezoneが意図通り正しく変更されます。

### ①サーバローカルのtimezone設定
今回の場合、コンテナのtimezoneの設定方法となりますが、該当するコンテナのdockerfileに下記を記載してください。(コンテナのOS想定はubuntuです。)

```
ENV TZ Asia/Tokyo
RUN echo "${TZ}" > /etc/timezone \
   && dpkg-reconfigure -f noninteractive tzdata
```

### ②php.iniでのtimezone設定
PHPの設定ファイルである`php.ini`は予めこちらで用意し、コンテナにマウントしてあげることで設定をしましょう。
今回はデフォルト言語の日本語設定もしてしまいます。

php.ini

```
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
```


上記のphp.iniをPHP用のコンテナにマウントします。
下記をコンテナ用のdockerfileに記載してください。

```
ADD ./php.ini /usr/local/etc/php/php.ini
```

## まとめ
上記設定後、dockerを起動し`phpinfo()`で確認するとtimezoneが無事、`Asia/Tokyo`に設定されているのがわかります。

![e0fa7046b135d260a49e52fdadfca2f4.png](https://qiita-image-store.s3.amazonaws.com/0/167149/24052d0d-f3aa-dafd-422b-06f23324885b.png)

設定が変更されていない場合は、一度関連するコンテナを削除する、設定対象のコンテナが正しいかを確認するなどをお試しください。
文字列のリストを正規表現でフィルター

形態素解析を行った後の行程で、不要な文字列の要素をリストから削除したり、特定の文字列の要素のリストだけ抽出したりしたかったケースがあったので、その備忘録。

- 文字列のリストの場合

```python


import re

words = ["あかさたな","あかさ","あか","あ", "アカサタナ","アカサ","アカ", "ア", "あカさタな", "挨拶", "朝", "夜露死苦"]



# ひらがな一文字と二文字をリストから抽出

hiragana = [x for x in kana1 if re.match('[ぁ-ん]{1,2}$' , x)]

print (hiragana)

# ['あか', 'あ']



# カタカナ一文字と二文字をリストから除外

katakana = [x for x in kana1 if not re.match('[ァ-ヶ]{1,2}$' , x)]

print (katakana)

# ['あかさたな', 'あかさ', 'あか', 'あ', 'アカサタナ', 'アカサ', 'あカさタな', '挨拶', '朝', '夜露死苦']



# 漢字一文字と二文字をリストから抽出

kanji = [x for x in kana1 if re.match('[一-龠]{1,2}$' , x)]

print (kanji)

# ['挨拶', '朝']


```

- タプルのリストの場合

```python


import re

words = [("あかさたな", 5), ("あかさ", 9), ("あか", 3), ("あ", 5), ("アカサタナ", 6), ("アカサ", 7),("アカ", 2),("ア", 10),("あカさタな", 8)]



# タプルの一つ目の要素でフィルター（ひらがな一文字と二文字をリストから除外）して、一つ目の要素だけのリストを返したい。

filtered1 = [x for (x ,y) in words if not re.match('[ぁ-ん]{1,2}$' , x)]

print (filtered1)

# ['あかさたな', 'あかさ', 'アカサタナ', 'アカサ', 'アカ', 'ア', 'あカさタな']



# タプルの一つ目の要素でフィルター（ひらがな一〜三文字をリストから除外）して、タプルのリストを返したい。

filtered2 = [(x ,y) for (x ,y) in words if not re.match('[ぁ-ん]{1,3}$' , x)]

print (filtered2)

# [('あかさたな', 5), ('アカサタナ', 6), ('アカサ', 7), ('アカ', 2), ('ア', 10), ('あカさタな', 8)]

```
[Automatism]アプリ設計のパターン（機能設計）

<p>どうコードを記述するか？この問題に対するアプローチは様々だ。</p>

<p>書籍『Effective ○○』を参考にする。デザインパターンに乗っ取る。コーディング・ルールに従う。どれも有益だとは思うが、今回は、自分がアプリケーション・プログラマに転身した際に参考にした、『iOS開発に置けるパターンによるオートマティズム』を現在の環境で取り組んでみる事にした。</p>

<p>今回取り上げるのはアプリ設計のパターンだ。</p>

# 機能設計

<p>今回、この記事を執筆するにあたって過去の教科書的なプログラム開発技法の書籍を読み返してみて気がつくのは、機能設計に相当することがほとんど触れられていないことだ。どんなサービスを開発するのかはユーザの問題で、技術者はユーザからの要求をいかに文書化するかが需要。また、既存のユーザ作業を図にしていくか、制作するプログラムを処理の図にしていくことが主な関心となっていた。</p>

<p>そういう状況から、iPhoneアプリケーションの開発から始まった、幅広い意味のデザインがアプリケーションを製作するエンジニアに期待される状況に変わっていったのは、画期的なことだったのだろう。</p>

<p>そういう訳で機能設計についてはよく使われる図式のようなものなく、様々な図式の技法で育ってきたプログラマにとって不安に感じる部分なのだが、そんなものは不要ということなのだろう。</p>

<p>それではやってみよう。GTDのような個人のワークフローを管理するiOSアプリケーショの機能設計を行ってみる。まずは機能の列挙だ。</p>

<ul>
<li>個人のワークフローを管理する。
        <ul>
        <li>仕事を入力する。
                <ul>
                <li>名称</li>
                <li>期限</li>
                </ul>
        </li>
        <li>仕事のリストを並べ替える。</li>
        <li>仕事をするタイミングを伝える。
                <ul>
                <li>通知を表示する。</li>
                </ul>
        </li>
        <li>完了した仕事を済みにする。
                <ul>
                <li>指定されて仕事をリストから削除する。</li>
                </ul>
        </li>
        </ul>
</li>
</ul>

<p>このアプリではデータをバックアップするとか他機器と同期するとかを考えないと、通信の機能は使わないで実装できそう。通知はローカル通知でいけそうだ。</p>

【関連情報】
<a href="http://hmdt.jp/hmdtbooks/pg329.html">iOS開発に置けるパターンによるオートマティズム</a><br />
<a href="https://cocoa-kanto.connpass.com/">BUKURO.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="https://note.mu/mosa_media/m/me339a1d6e3f2">App Engineer Journal "猛者"</a><br />
<a href="https://mosa.connpass.com/">MOSA</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />
<a href="https://qiita.com/m_yukio">Qiita</a><br />
CircleCI1.0でphp-imagickをインストールしようとしてハマった話

ローカルでテストはとおっていたけれどもCircleCI(1.0)でテストが通らない。
調べてみるとimagickのクラスが見つからないというエラーが出ている。
あ、CircleCIにもImageMagickをインストールしないといけないのか、じゃあインストールするか、と軽い気持ちでCircleCIをいじってたら思っていたよりハマってしまったので備忘録としてメモ。

## imagickのインストール

テスト実行前に以下のコマンドを実行させます。

```
sudo apt-get update
sudo apt-get -y install imagemagick
yes | pecl install -f imagick
echo "extension = imagick.so" >> /opt/circleci/php/$(phpenv global)/etc/php.ini
```

imagemagickをインストール後、peclでimagickをインストールし、PHPで利用できるようにphp.iniを設定ファイルを追加します。

## 設定ファイル

最終的なcircle.ymlは以下のようになりました。
テスト実行前にimagickのセットアップを正しく行うことにより、
imagickに依存するテストも動作するようになります。

```circle.yml
machine:
  timezone: Asia/Tokyo
  php:
    version: 7.1.9
  environment:
    DB_HOST_TESTING: 127.0.0.1
    DB_DATABASE_TESTING: circle_test
    DB_USERNAME_TESTING: ubuntu
    DB_PASSWORD_TESTING: ''
 
database:
  override:
    - php path/to/artisan migrate --env=testing --database=testing
    - php path/to/artisan db:seed --env=testing --database=testing

dependencies:
  cache_directories:
    - path/to/.composer/cache
  pre:
    - composer config -g github-oauth.github.com $GITHUB_OAUTH_TOKEN
    - echo "memory_limit = 2048M" > /opt/circleci/php/$(phpenv global)/etc/conf.d/memory.ini 
  override:
# ここから重要
    - sudo apt-get update
    - sudo apt-get -y install imagemagick
    - yes | pecl install -f imagick
    - echo "extension = imagick.so" >> /opt/circleci/php/$(phpenv global)/etc/php.ini
# ここまで重要
    - composer install --dev --no-interaction --working-dir=path/to
    - composer dump-autoload --optimize --working-dir=path/to
test:
  override:
    - path/to/vendor/bin/phpunit -c path/to/phpunit.xml
```

CircleCI(1.0)でimagickに依存するプログラムがあった場合参考になれば幸いです:smiley:

## 参考

[PHP 7, Imagemagick and CircleCI
](https://stackoverflow.com/questions/43507828/php-7-imagemagick-and-circleci?rq=1)
SPAにありがちな更新処理を行うと404になっちゃう問題(VueとHeroku版)

初めてのQiita投稿になります。よろしくお願いします！

# Vue-cliでプロダクト作ったぞ！
Vueに限ったことではありませんが、私はよく何かしらシステムをデプロイする際はHerokuをよく使います。
簡単にデプロイできますしすでに色んな人が使っているので検索すれば何かしらやり方が見つかる。
そんな中、ちょっと困ったことが発生したので残しておきたいと思います。

## Vue-cliをHerokuへデプロイ
以下記事が参考になると思います。
http://heimusu.hatenablog.com/entry/2017/02/27/220000


これを読めばserver.jsでHeroku周りを管理してpackage.jsonで必要なライブラリ、実行コマンドを用意すればいいのがわかりますね(server.jsはProcfileみたいなもの)。

## HTML5 Historyモード

こいつです
https://router.vuejs.org/ja/essentials/history-mode.html


vue-routerを使っていると完全なSPAとして、ページのリロード無しにURL遷移したくなります。
そのため、modeをhistoryに変えて...ってひとは結構いると思います。

**しかし**
問題がありまして当然SPAのためindex.htmlしかありません。一応/hogeや/hoge/:idといったようにURL自体は存在します。ですが当然/hogeのようなURLで更新処理すると無いページのURLのためエラーが返ってきちゃうんですよね。

これを解消するためにはcatch-allフォールバックといって404はindex.htmlで全部受けとめてしまおうといった発想で対応します。
この設定を行うためサーバ側に処理を行うファイルを用意してあげます。例えばApache環境ならconfファイルや.htaccessに記述する感じですね(全くデプロイ経験がない人はApache conf ディレクティブとかでggるといいかもしれません)。


## HerokuにVueを上げる際の設定
ここからが本題です。
node.js環境でHerokuにデプロイ(express環境)するさいはこいつを使います。
https://github.com/bripkens/connect-history-api-fallback


vue-routerの公式も推奨しているので安心ですね。

以下変更点(上に上げたHerokuデプロイ記事を見ておくの推奨)
1.npmでまとめて必要なものをinstallする
package.json
```"postinstall": "npm install express connect-history-api-fallback"
```

2.server.jsの記述を変更
server.json
こちらを参考にしました！
https://forum.vuejs.org/t/how-do-i-implement-connect-history-api-fallback-`so-that-url-paths-redirect-to-index-html/10938/4

```
 var express = require('express');
 var app = express();
 var history = require('connect-history-api-fallback');

 app.use(history());

 app.use(express.static(__dirname));

 app.set('port', (process.env.PORT || 8080));
 app.listen(app.get('port'), () => {
 console.log('Derp is running at localhost: 8080');
 }); 
```

こいつらをdist内に入れてあとはgit push heroku masterとかで(おそらくsubtree使ってpushするのが大半だろうけど)デプロイすれば更新ボタンを押してもエラーにならない！
簡単でした！

### 参考まとめ
http://heimusu.hatenablog.com/entry/2017/02/27/220000
https://forum.vuejs.org/t/how-do-i-implement-connect-history-api-fallback-`so-that-url-paths-redirect-to-index-html/10938/4
Prism入門 その4 - IPageDialogService

## はじめに

Prism入門その4です。
今回はダイアログを表示します。
実行する方法はとても簡単で短いです。
しかし、MVVMとしては重要な要素が含まれています。

## IPageDialogService

ダイアログを表示するにはIPageDialogServiceを使用します。
ViewModelのクラスのコンストラクタの引数に```IPageDialogService pageDialogService```を指定します。
これを指定するとクラスのインスタンスが生成された時にIPageDialogServiceのインスタンスが自動的に生成されます。

ダイアログを表示するにはIPageDialogServiceのインスタンスのメソッドを実行するだけです。

クリックするとダイアログが表示されるサンプルです。

```
public DelegateCommand Clicked { get; private set; }

public MainPageViewModel(IPageDialogService pageDialogService)
{
    Clicked = new DelegateCommand(
        async () => {
            await pageDialogService.DisplayAlertAsync("Title", "Message.", "OK");
        }
    );
}

```

とても単純なサンプルですが重要です。

ダイアログのメソッドは普通のXamarinではViewに存在します。
イベントの処理の多くは、VMやMで発生します。
しかし、VMやMはVを参照してないため、Vのメソッドを呼ぶことはできません。

そこでDialogServiceのようなVのメソッドをVMで実行するためのクラスが存在します。
Vのメソッドを呼ぶ機能を持つクラスをVMに渡すことで、VMからのVの操作を実現しています。

これはVMからVの操作を行うための一つの方法です。
ユーザー自身も同じような処理を実装できますが、それは今度説明します。

## 最後に

ダイアログを通じて、MVVMでVMからVを操作する方法の一つを説明しました。
次もVMからVを操作する方法の説明をしたいと思います。
Pandocで.mdを.pdfに変換する環境構築（TeX無し）

# 概要
読書のレポートを電子化するにあたって、MarkdownをPDFにできる環境があると楽だと思い、やってみました。
大まかな流れは以下の通りです。今回はLateXは使っていません。
1. Chocolateyのインストール
2. Pandocのインストール
3. wkhtmltopdfのインストール
4. .mdファイルを.pdfファイルに変換する
# 環境
Windows10
Chocolatey 0.10.11
Pandoc 1.17.4.2
wkhtmltopdf 0.12.4
# Chocolateyのインストール
ChocolateyとはWindows用のパッケージマネージャソフトです。
コマンドプロンプトかPowerShellを管理者権限で起動し、https://chocolatey.org/install にあるコマンドを実行し、インストールします。

```P:PowerShell
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```

```P:cmd
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
```
# Pandocのインストール
Pandocとは、Markdownをはじめとする様々な形式のファイルを、これまた様々な形式（docx,LateX,HTML...）のファイルに変換してくれるソフトです。
Chocolateyのインストール後、以下のコマンドを実行し、インストールします。

```
cinst pandoc
```

# wkhtmltopdfのインストール
Pandocだけでは、PDF形式の出力はできません。
LateXと組み合わせるのがセオリーのようですが、今回は**wkhtmltopdf**というMarkdownやHTMLをPDFに直すツールを使います。
そして以下のコマンドを実行し、インストールします。

```
cinst wkhtmltopdf
```

# .mdファイルを.pdfファイルに変換する
今回は、Hoge.mdをHoge.pdfに変換します。
以下のコマンドを、対象のファイルがあるディレクトリ上で実行します。

```
pandoc Hoge.md -f markdown -t html5 -o Hoge.pdf
```

このコマンドは、
pandoc [変換元ファイル名] -from [変換元の形式] -to [フォーマット] -output [変換先のファイル名]
という構成です。
結果は以下のようなPDFになりました。
![スクリーンショット (66).png](https://qiita-image-store.s3.amazonaws.com/0/257348/b538fcb8-b9ff-743c-a622-1da99c4b901e.png)
# まとめ
パッケージマネージャでインストールするとバージョンが最新でない場合があるようです。しかし動作には特に支障はありませんでした。気になる方はインストーラをダウンロードしたほうがいいかも。
MarkdownをPDFに変換するのはこれで事足りますが、現在はVSCodeの拡張機能のほうが……。
ls時のディレクトリ背景を変更したい

vagrant sshした時、synced folderの背景色と文字色が嫌がらせしてくる:weary:
見やすいように変更したい。

## 変更前
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222199/da580095-f6a6-144e-f70f-2c1eb39f01f2.png)

## 変更後
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222199/04b34731-f7af-b381-875d-26b7c23f6e3a.png)


# 結論
.profileに下記追加

```bash:~/.profile
LS_COLORS=$LS_COLORS:'ow=30;42:' ; export LS_COLORS
```

`env | grep -i ls`するとよくわからん記号が並んでいた所に答えが書かれていました。
環境変数LS_COLORSでは`[filetype]=[text-style];[foreground-color];[background-color]`の指定が書かれています。
(promptを可愛くしようとした人なら見覚えがある、terminalでの色の記述方法と同じです。)

```bash
$vagrant@ubuntu ~ [Tue May 22|15:55:28]
(*'-') < env | grep -i ls
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36::ow=30;42:
_fzf_orig_completion_ls=complete -F %s ls #_longopt
```


お題の見難くなっているファイルタイプはディレクトリでowner:group-user以外も書き込み権限が付与されています。
そのファイルタイプに該当するLS_COLORSでのファイルタイプがow(other-writable) directoryになるので`ow=30(black);42(green)`に変更しました。


# 参考
- [StackExchange:What causes this green background in ls output?](https://unix.stackexchange.com/questions/94498/what-causes-this-green-background-in-ls-output)
pip version 10.0.0でImportError: cannot import name mainが発生する場合の対処法

# この記事について

pip 10.0.0.0を実行した際に、下記エラーが発生する場合の対処法を記載します。

```bash
$pip install hoge
Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    from pip import main
ImportError: cannot import name main
```

# 対処法
/usr/bin/pipを下記の通り修正します。

修正前

```python
from pip import main
if __name__ == '__main__':
    sys.exit(main())
```


修正後 (3箇所)

```python
from pip import __main__
if __name__ == '__main__':
    sys.exit(__main__._main())
```
めんどくさがり屋のためのユニットテスト

## Introduction
テストの重要性は言わずもがななんですが、結構書くの面倒なんですよね。。

そんな人のための即席ユニットテストの紹介です。
言語は何でも良いんですが、今回はpython(3)で書いていきます。

あと今回はユニットテストなのでプログラムはある程度関数orクラスに
分割されているものとします。

## Problem
例えば下のようなmain関数とfizz_buzz関数があるとします。

fizz_buzz関数は_start_ ~ _end_までfizz-buzzし、結果を文字列で返します。
main関数はfizz_buzz関数を使ってなにかややこしいことをします。

```python
def main():
    # do something with fizz_buzz
    s = fizz_buzz(10, 50)

def fizz_buzz(start, end):
    if start > end: return ""
    s = []
    for i in range(start, end+1):
        if i % 15 == 0:
            s.append("Fizz Buzz")
            continue
        if i % 3 == 0:
            s.append("Fizz")
            continue
        if i % 5 == 0:
            s.append("Buzz")
            continue
        else:
            s.append(str(i))
    return "\n".join(s)

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

簡単なプログラムなんですが、実際には動かしてみないとエラーやバグが入り込む可能性もあります。(endを含むかどうかとか)

しかし、main関数はややこしいことをいっぱいしているので、バグが有った際それがmainによるものかfizz_buzzによるものかが簡単にはわかりません。

## Method
そこで、ユニットテスト用の関数testを作り、下のようにします。

このスクリプトを実行するとtestの部分が実行され、mainは実行されません。
これで簡単なテストを行うことができます。
またtestの呼び出しをコメントアウトすれば通常どおりmainが実行できます。

テストの内容を追加したい場合はtest関数に継ぎ足せばOKですし、
テストをスキップしたい場合は段落ごとにコメントアウトすればOKです。
(Vimならvipで段落選択ができるので便利)

```python
def main():
    test() # テストしないときにはここだけコメントアウト
    # do something with fizz_buzz
    s = fizz_buzz(50)

def fizz_buzz(n):
    pass
    # 略

def test():

    s = fizz_buzz(3)
    expect = "1\n2\nFizz"
    print(s == expect)

    s = fizz_buzz(15, 15)
    expect = "Fizz Buzz"
    print(s == expect)

    s = fizz_buzz(16, 15)
    expect = ""
    print(s == expect)

    exit()

if __name__ == "__main__":
    main()
```
## Conclusion
ちょっとでも良いのでテストを書こう!
自分用AWS クラウドサービス活用資料集メモ Amazon Elastic Container Service編


#### [Amazon Elastic Container Service (ECS)](https://aws.amazon.com/jp/ecs/)

情報元: [20180220 AWS Black Belt Online Seminar - Amazon Container Services](https://www.slideshare.net/AmazonWebServicesJapan/20180214-aws-black-belt-online-seminar-amazon-container-services/AmazonWebServicesJapan/20180214-aws-black-belt-online-seminar-amazon-container-services)

* レジストリ: Amazon ECR
    * AWS IAMによりpullのみの権限やクロスアカンとアクセスも可能
    * ライフサイクルポリシーでイメージの自動クリーンアップ
* コントロールプレーン: Amazon ECS, Amazon EKS
* データプレーン: AWS Fargate
* Task: コンテナ群の実行単位
    * Task Definitionの情報から起動される
    * 1つ以上のコンテナを実行しているリソース (Task内のコンテナ群は同じホストで実行)
    * CPUとメモリの条件を指定する
    * IAM RoleをTaskごとに設定可能
* Service: ロングランニングアプリ用スケジューラ
    * Tasksの数を希望数に保つ
    * Task Definitionを新しくするとBlue/Greenデプロイ
    * メトリクスに応じてTask数のAuto Scalingも可能
* AWS VPCネットワークモード
    * VPC内の他のリソースへPrivate IPで通信可能
        * FargateではPublic IPの割当も可能
    * Task内のコンテナはlocalhostを共有（Link不要でアクセス化）
    * ENI（Security Group)をTask毎に設定可能
* その他
    * Amazon CloudWatch Logsと簡単に連携　
    * Amazon CloudWatch Eventsに各種イベントが流れる
    * EC2へのTask配置を柔軟に設定可能
    * Service Discovery by Route53
    * Target Trackingと連携可能
        * メトリクスに対してターゲットの値を設定すると、その値に近づくようにApplication Auto Scalingが自動的にServiceのDesiredCoundを調整
Raspberry PiでBokehを使おうとしたらエラーになった話

## この記事について…

普段はRaspberry Piとは無縁なプログラマだったんですが、斯く斯く然々で色々やってみることになりました。普段はWindowsしかいじらないのでLinuxは超初心者ですが、備忘録を兼ねて色々書こうと思います。
尚、2018/05/17現在 Raspbian Stretch Lite 2018-04-18リリースを使用しています。

## Bokehでエラー

センサーで取得したデータをグラフ化するという場面に遭遇した為、今回は[Bokeh](https://bokeh.pydata.org/en/latest/)ライブラリを使うことにしました。

```sh
pip3 install bokeh
```

を実行してインストール、User Guideに沿って

```python:python_file
  .
  .
from bokeh.plotting import figure, output_file, show
  .
  .
```

とコーディングして実行したところ、下記のエラーが発生。

```sh
Traceback (most recent call last):
  File "/home/pi/.local/lib/python3.5/site-packages/numpy/core/__init__.py", line 16, in <module>
    from . import multiarray
ImportError: libf77blas.so.3: cannot open shared object file: No such file or directory

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "main.py", line 18, in <module>
    from bokeh.plotting import figure, output_file, show
  File "/home/pi/.local/lib/python3.5/site-packages/bokeh/plotting/__init__.py", line 2, in <module>
    from ..document import Document; Document
  File "/home/pi/.local/lib/python3.5/site-packages/bokeh/document/__init__.py", line 7, in <module>
    from .document import Document ; Document
  File "/home/pi/.local/lib/python3.5/site-packages/bokeh/document/document.py", line 33, in <module>
    from ..core.json_encoder import serialize_json
  File "/home/pi/.local/lib/python3.5/site-packages/bokeh/core/json_encoder.py", line 45, in <module>
    import numpy as np
  File "/home/pi/.local/lib/python3.5/site-packages/numpy/__init__.py", line 142, in <module>
    from . import add_newdocs
  File "/home/pi/.local/lib/python3.5/site-packages/numpy/add_newdocs.py", line 13, in <module>
    from numpy.lib import add_newdoc
  File "/home/pi/.local/lib/python3.5/site-packages/numpy/lib/__init__.py", line 8, in <module>
    from .type_check import *
  File "/home/pi/.local/lib/python3.5/site-packages/numpy/lib/type_check.py", line 11, in <module>
    import numpy.core.numeric as _nx
  File "/home/pi/.local/lib/python3.5/site-packages/numpy/core/__init__.py", line 26, in <module>
    raise ImportError(msg)
ImportError:
Importing the multiarray numpy extension module failed.  Most
likely you are trying to import a failed build of numpy.
If you're working with a numpy git repo, try `git clean -xdf` (removes all
files not under version control).  Otherwise reinstall numpy.

Original error was: libf77blas.so.3: cannot open shared object file: No such file or directory
```

`libf77blas.so.3`ってなんじゃいと思ってググると、

```sh
sudo apt install libatlas-base-dev
```

してないんじゃない？みたいな話が[GitHub](https://github.com/Kitt-AI/snowboy/issues/262)にありました。
その通りに実行すると、無事にエラーは解消しました。
`libxxxxxxxx`系でエラーが出た場合は何らかのライブラリが未インストールじゃないか、真っ先に疑う癖をつけようと思います。


今回はQiitaの記事を参考にしながら「SPIとMCP3002を使用したアナログセンサーのデータ読み取り」＋「Bokehで読み取りしたデータの加工(HTML化)」＋「Flaskによる簡易Webサーバ構築」という構成を試しているので、また理解が深まったら投稿しようと思います。

> 参考
> Raspberry Piで計測したデータをグラフ化　全部のせPython（SQLite + Bokeh + Flask）で作るグラフアプリ
> https://qiita.com/Brutus/items/383acea6b2d294b45b6b
UiPath勉強三回目

#UiPathに触ってみる(2)


前回はInternet Explorerを開くプロジェクトの作成を行った。
今回は検索を行う処理を追加してみる。

起動するまでの処理は前回と同じように実施。

次に検索バーへの入力を自動化する。


DESIGNタブにある「Recording」を選択、
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/76e34c1a-0e59-3455-e203-c37cf5480e4d.png)


表示された一覧の中から「Web」をクリック。
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/fa9098df-c302-6026-99b8-51886b35e91b.png)

ここで、「Type」を選択すると前回と同様にデスクトップ上を選択できるようになる。検索バーをクリックすると下記のようなポップアップがでてくる。
![100.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/50911eb4-0e57-11ca-917c-fd79c4d47a5f.png)


ここで検索したい単語を入力し、「Enter」。


![101.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/91d13c77-43e2-e580-4ffe-81c37d84a919.png)


次に、検索ボタンをクリックする処理に対して自動化を行う。
引き続き表示されているレコーディングバーから「Click」を選択する。

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/fba72fb9-ecb3-014e-7c3f-c25ff1942b5e.png)


デスクトップ上を選択できるようになる。検索ボタンをクリック。


![103.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/62ed3638-4b29-08a2-9f25-9354503d1945.png)





再び、レコーディングバーが表示されるので、「Save & Exit」ボタンで保存する。

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/cccb9513-04e4-b3bc-7bcc-5db22a9ee395.png)


その状態で、DESIGNタブにある「Run」を実行。



![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/67dd091f-3d2b-4177-0a84-519f73363a1a.png)

Internet Explorerが起動し、「UiPath」を検索する処理が行われる。
Android開発、RGB、16進数、リソースファイルからの色の実装についてをまとめてみた

# Colorについて

Android開発でUIデザインをいじっていたときにハマってしまったので整理してみました。
16進数から色を指定したり、リソースファイルから指定できたりします。
iOSではリソースファイルみたいなものはないので概念を理解するのに時間がかかってしまった。
僕にとって厄介だったのはResourceファイルという概念でした。

## 色リソースからの設定(一番ハマるのでトップにしました)

Res(Resource)フォルダのcolor.xmlにキーを設定していれば使えるやり方。
実務でよく見られる方法。

```Resource.java
Resources res = getResources();
int chocolate_color = res.getColor(R.color.chocolate);

TextView text = new TextView(this);
text.setBackgroundColor(chocolate_color);

```

```color.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="chocolate">#d2691e</color>
</resources>

```

## #RGB形式 でのColorの設定

```Rgb.java
TextView tv = new TextView(this);
tv.setTextColor(Color.parseColor("#FF00C0"));

// "#FF_00_C0"
// RGB
```

parseColorのメソッドは
`public static int parseColor(String colorString)`
ということで引数が`String`型 、返り値は`int`型である。
Colorはどうやら、 `int color` というものらしい。

## ARGB形式でのColorの設定

```Argb.java
TextView tv = new TextView(this);
tv.setTextColor(Color.parseColor("#FF0F00C0"));

// "#FF_0F_00_C0"
// ARGB

```

## キーワード形式でのColorの設定

使えるキーワードは下のキーワード

`red`
`blue`
`green`
`black`
`white`
`gray`
`cyan`
`magenta`
`yellow`
`lightgraydarkgray`

```Word.java

TextView tv = new TextView(this);
tv.setTextColor(Color.parseColor("magenta"));

```

## Colorクラスからのデフォルト定数？

- `Color.BLACK`：黒
- `Color.BLUE`：青
- `Color.CYAN`：シアン
- `Color.DKGRAY`：ダークグレイ
- `Color.GRAY`：グレイ
- `Color.GREEN`：緑
- `Color.LTGRAY`：ライトグレイ
- `Color.MAGENTA`：マゼンタ
- `Color.RED`：赤
- `Color.TRANSPARENT`：透明
- `Color.WHITE`：白
- `Color.YELLOW`：黄色


## 16進数からintに変換してcolorを設定する方法(うる覚え)

```Intcolor.java
String white = "#ffffff";
int whiteInt = Color.parseColor(white);

TextView text = new TextView(this);
text.setBackgroundColor(whiteInt);
```

## 16進数文字列とバイト列を相互変換する方法

``` hex.java
public static String bin2hex(byte[] data) {
    StringBuffer sb = new StringBuffer();
    for (byte b : data) {
        String s = Integer.toHexString(0xff & b);
        if (s.length() == 1) {
            sb.append("0");
        }
        sb.append(s);
    }
    return sb.toString();
}

public static byte[] hex2bin(String hex) {
    byte[] bytes = new byte[hex.length() / 2];
    for (int index = 0; index < bytes.length; index++) {
        bytes[index] = (byte) Integer.parseInt(hex.substring(index * 2, (index + 1) * 2), 16);
    }
    return bytes;
}

```


これだけ押さえておけばこのページを見てすぐに色変換ができるようになるかなと思います。
Bashのfor文をワンライナーへ書き換える方法

`xargs`コマンドを用いて、Bashのfor文をワンライナーへ書き換える方法についてまとめてみます。

# xargsコマンドとは
標準入力からリストを読み込み、それをコマンドの引数として展開・実行するコマンドです。

# 改行区切りのリストを処理する場合
## 基本的な書き換え
以下のような処理があったとします。

```bash
for f in `ls`
do
   echo "Output:" ${f}
done
```

これを`xargs`コマンドを用いて書き換えると、以下のようになります。

```bash
ls | xargs -r -L 1 echo "Output:"
```

ここで、`-L`オプションはリストが__改行区切りである__という前提の元、コマンドに展開する引数の個数の最大値を指定しています。
さらに、`-r`オプションを指定することで、リストが空の場合にコマンドを実行しないようにしています。

## 引数を任意の位置に展開する場合
### 展開する引数が1個の場合
以下のように記述することで、引数を任意の位置に展開することができます。

```bash
ls | xargs -r -I @ echo "Output:" @
```

ここで、`-I`オプションは引数を表す文字列を指定しており、このオプションが指定された場合、自動的に`-L 1`も指定されたことになります。

### 展開する引数が2個以上の場合や展開する引数内で変数内置換を用いる場合
以下のように記述することで、引数を任意の位置に展開することができます。

```bash
ls | xargs -r -L 2 bash -c 'echo "Output:" ${0} ${1}'
```

この場合、`${0}`, `${1}` (`${0}`〜`${引数の個数の最大値-1}`) は引数の位置を表しており、`bash`コマンドを間に挟んでコマンドを実行しています。

# 改行区切りではないリストを処理する場合
## 基本的な書き換え
以下のような処理があったとします。

```bash
for s in "aaa" "iii"
do
   echo "Output:" ${s}
done
```

これを`xargs`コマンドを用いて書き換えると、以下のようになります。

```bash
echo "aaa" "iii" | xargs -r -n 1 echo "Output:"
```

ここで、`-n`オプションはリストが__改行区切りではない__という前提の元、コマンドに展開する引数の個数の最大値を指定しています。
さらに、`-r`オプションを指定することで、リストが空の場合にコマンドを実行しないようにしています。

## 引数を任意の位置に展開する場合
以下のように記述することで、引数を任意の位置に展開することができます。

```bash
echo "aaa" "iii" "uuu" "eee" | xargs -r -n 2 bash -c 'echo "Output:" ${0} ${1}'
```

この場合、`${0}`, `${1}` (`${0}`〜`${引数の個数の最大値-1}`) は引数の位置を表しており、`bash`コマンドを間に挟んでコマンドを実行しています。

# 並列化
以下のように`xargs`コマンドを用いると、for文で記述した場合には不可能であった並列化が可能になります。

```bash
echo "aaa" "iii" | xargs -r -n 1 -P 2 echo "Output:"
```

ここで、`-P`オプションはプロセス数の最大値を指定しています。

# 参考文献
* [xargs を使ってカジュアルに並列処理 - たごもりすメモ](https://tagomoris.hatenablog.com/entry/20110513/1305267021)
* [xargs のオプションいろいろ - Qiita](https://qiita.com/hitode7456/items/6ba8e2d58f9b8db9de11)
* [【 xargs 】コマンド――コマンドラインを作成して実行する：Linux基本コマンドTips（176） - ＠IT](http://www.atmarkit.co.jp/ait/articles/1801/19/news014.html)
* [xargsコマンドで覚えておきたい使い方・組み合わせ7個(+1個) | 俺的備忘録 〜なんかいろいろ〜](https://orebibou.com/2015/07/インフラエンジニアなら覚えておきたい『xargs』/#8)
* [bash 拡張的な変数展開に失敗します。 - 1 は成功するのに 2 が失敗するのは... - Yahoo!知恵袋](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1227556757)
Flask：おみくじ。。世界で一番簡単な画像転送Webアプリ♬

一番簡単なアプリは、もちろんHelloWorldだけど、。。。
ここでは、画像渡しの一番簡単なアプリ。。。おみくじを作ってみた。

今回は、
①定番のHelloWorld
②画像転送を利用したおみくじアプリ
を作ってみた。

【参考】
１．[公式のQuickstart](http://flask.pocoo.org/docs/1.0/quickstart/)
２．[Jinja2の使い方がわかるとFlaskを用いた開発がよりスマートになる](https://qiita.com/ryo2851/items/7ae5de21307d101b4759)
３．[Flaskでデータのラベリングサイトを作成する](https://qiita.com/habakan/items/45410cb0ce479c3a709d)

###【コード】
[MuAuan/Video-Stream](https://github.com/MuAuan/Video-Stream)

Flaskは一般的に以下のようなディレクトリ構成をとる。

```
flask_PJ
├── application.py　　：Flaskアプリ
|── templates
|   └── index.html 　 :表示用html
└── static            :画像ディレクトリ
    └── daikiti 
        └── daikiti.jpg 
        └── tyukiti.jpg 
        └── shokiti.jpg 
        └── suekiti.jpg 
        └── kyo.jpg 
        └── daikyo.jpg
        └── ....jpg
```

###HelloWorld
まず、Helloworld

```
flask_PJ
├── hello.py
|── templates
    └── index.html(省略) 
```
なんか動かないとつまらないので、経過時間を表示させました

```Hello.py
import flask
import time

app = flask.Flask(__name__)
start_time=time.time()

@app.route('/')  #http://localhost:5000/直下に以下表示
def index():
    return "Hello, World! Passed Time = "+str(int(time.time()-start_time))

if __name__ == '__main__':
    app.run(debug=True)
```
app.py:ここでは、hello.pyという名称にした
index.html:省略というか無くても表示できる
static:画像無し

@app.route('/')  ：localhost直下に表示を意味する
表示内容は、以下のとおり
return "Hello, World! Passed Time = "+str(int(time.time()-start_time))
因みに、start_timeはglobal変数としている

###おみくじ

```
flask_PJ
├── daikiti.py
|── templates
|   └── index.html 
└── static
    └── daikiti 
        └── daikiti.jpg 
        └── tyukiti.jpg 
        └── shokiti.jpg 
        └── suekiti.jpg 
        └── kyo.jpg 
        └── daikyo.jpg
        └── ....jpg
```
[daikiti.py](https://github.com/MuAuan/Video-Stream/blob/master/daikiti.py)：server側本体
[index.html](https://github.com/MuAuan/Video-Stream/blob/master/templates/index.html):ブラウザ用html
static配下：[画像配置(例)](https://github.com/MuAuan/Video-Stream/tree/master/daikiti)

```daikiti.py
from flask import Flask, render_template
import glob
from time import time

app = Flask(__name__)

@app.route("/")
def index():
    img_path = glob.glob("static/daikiti/*.jpg")
    return render_template('index.html', img=img_path[int(time()) % 9])
if __name__ == "__main__":
    app.debug = True
    app.run()
```
①img_path = glob.glob("static/daikiti/*.jpg"):daikitiディレクトリからjpg画像をまとめて取得
②これをrender_templateで時刻を９（枚あるので）で割って、その画像を渡しています。
③app.debug=True:デバッグモードで動かしています。Falseでも動きます。

```index.html
<!DOCTYPE html>
<html lang="jp">
<head>
    <meta charset="UTF-8">
    <title>おみくじサイト</title>
</head>
<body>
    <h1>今日のあなたの運勢</h1>
    <img src="{{ img }}" style="width: 300px;">
</body>
</html>
```
Reloadすれば、ひたすらおみくじが引けます。
そのうち、念願の大吉が。。。
###結果
・イメージは、こんなアプリができました！
![daikiti.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/332df95d-5f5c-c4dd-088e-7cea14cd6360.jpeg)
・RasPiでも動く♬

・静止画アップは出来た、あとカメラ画像の保存ができれば。。。Streaming配信も夢じゃない
zsh + preztoを使ってみる

とくに公式の手順と何ら変わりませんが、一箇所だけ詰まったのでメモ



zshのインストール 

```
sudo apt install -y zsh
```

zshのパスを確認(後で使います)

```
which zsh
```

私の場合は`/usr/bin/zsh`でした

zshを起動

```
zsh
```

※ 以下のようなメッセージが表示された場合は「q」を選択する。ここで自動で.zshrcとかを作られてしまうと、あとの手順で```File already exsists```と怒られる。

```
This is the Z Shell configuration function for new users,
zsh-newuser-install.
You are seeing this message because you have no zsh startup files
(the files .zshenv, .zprofile, .zshrc, .zlogin in the directory
~).  This function can help you with a few settings that should
make your use of the shell easier.

You can:

(q)  Quit and do nothing.  The function will be run again next time.

(0)  Exit, creating the file ~/.zshrc containing just a comment.
     That will prevent this function being run again.

(1)  Continue to the main menu.

(2)  Populate your ~/.zshrc with the configuration recommended
     by the system administrator and exit (you will need to edit
     the file by hand, if so desired).

--- Type one of the keys in parentheses ---
```

[Prezto](https://github.com/sorin-ionescu/prezto)をクローン

```
git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
```

設定ファイルなどを作ってもらうため、以下を実行

```
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
```

デフォルトのシェルを変更(パスワードを聞かれます)

```
chsh -s /usr/bin/zsh
```

再度ログインすると、切り替わります。

![zsh.png](https://qiita-image-store.s3.amazonaws.com/0/128395/0c90d3ca-ba44-acbf-9acf-369aff8b2a31.png)


あとはお好みのテーマをいれたりカスタマイズしてください。
.bashrcから環境変数など必要な設定を持ってくることも忘れずに。
Gradient Clipping の実装に関するメモ

##ポイント
* シンプルな数値計算で確認。

##サンプルコード
```python
  def loss(self, x, init_value):
    with tf.variable_scope('clip'):
      init_const = tf.constant_initializer(value = \
               init_value, dtype = tf.float32)
      w = tf.get_variable('w', shape = (), \
               initializer = init_const)
      var_list = tf.trainable_variables()
    return (w - x) ** 2, var_list
  
  def training(self, loss, var_list, learning_rate):
    optimizer = \
          tf.train.GradientDescentOptimizer( \ 
          learning_rate = learning_rate)
    
    # 1 using minimize
    #train_step = optimizer.minimize(loss)
    
    # 2 not using minimize 
    #grads_and_vars = optimizer.compute_gradients( \
    #         loss, var_list)
    #train_step = \
    #         optimizer.apply_gradients(grads_and_vars)
    
    # 3 gradient clipping
    grads_and_vars = optimizer.compute_gradients(loss, \
             var_list)
    clipped_grads_and_vars = [(tf.clip_by_value(grad, \
            clip_value_min = -3.0, clip_value_max = \
            3.0), var) for grad, var in grads_and_vars]
    train_step = \
             optimizer.apply_gradients( \ 
             clipped_grads_and_vars)
        
    return train_step, grads_and_vars, \
                     clipped_grads_and_vars
  
  def fit(self, x, init_value, learning_rate):
    
    tf.reset_default_graph()
   
    loss, var_list = self.loss(x, init_value)
    train_step, grads_and_vars, clipped_grads_and_vars \
       = self.training(loss, var_list, learning_rate)

    init = tf.global_variables_initializer()
    
    with tf.Session() as sess:
      sess.run(init)
      
      for i in range(5):
        temp_var = sess.run(grads_and_vars[0][1])
        temp_grad = sess.run(grads_and_vars[0][0])
        temp_clipped_var = \
              sess.run(clipped_grads_and_vars[0][1])
        temp_clipped_grad = \
              sess.run(clipped_grads_and_vars[0][0])
        temp_loss = sess.run(loss)
        
        print ('var: {0:.3f},  grad: {1:.3f}, \
           loss: {2:.3f}'.format(temp_clipped_var, \
           temp_clipped_grad, temp_loss))
        sess.run(train_step)

```

##数値計算例
入力：
x = 2.0
init_value = 0.0
learning_rate = 0.1

出力：
var: 0.000,  grad: -3.000,  loss: 4.000
var: 0.300,  grad: -3.000,  loss: 2.890
var: 0.600,  grad: -2.800,  loss: 1.960
var: 0.880,  grad: -2.240,  loss: 1.254
var: 1.104,  grad: -1.792,  loss: 0.803
Angularでテキスト検索のハイライト表示

Angularでテキストを表示しているエレメントに対して文字列検索を行い、一致する文字列部分をハイライト表示する。
####HTMLテンプレート側
検索文字列はinput要素と双方向バインドしておくと、文字列の入力にあわせてリアルタイムに反応してくれる。

```sample.html
<!-- 検索文字列を入力するinput要素 -->
<input id="key" type="text" [(ngModel)]="key">
<!-- 文字列を表示するdiv要素 -->
<div [innerHTML]=emphasis()></div>

```

####データ側
テキストのうち、キーワードに該当する部分のスタイルを"赤文字"かつ"太文字"でハイライト表示にする。
AngularでinnerHTMLを埋め込もうとするとサニタイズされてしまうので、DomSanitizerでSafeHtmlにしてから値を返すようにする。

```sample.ts

import { DomSanitizer, SafeHtml } from '@angular/platform-browser';

private target: string; //テキスト表示している文字列
private key: string; //検索キーワード

constructor(
  private sanitizer: DomSanitizer
) {}

private emphasis(): SafeHtml {
  const regexp = new RegExp(this.key , 'g');
  if (this.key !== '') {
    return this.sanitizer.bypassSecurityTrustHtml(
      target.replace(regexp, '<span style="color: #FF0000;font-weight: bold;">' + this.key + '</span>'));
  } else {
    return target;
  }
}
```

検索文字列を打ち込んでいくと、テキストの該当する部分が赤い太文字として強調される。