OmniAICreator/Qiita-1.07M huggingface dataset:
AndroidStudioにOpenCVを入れる

##環境
- Windows 7
- AndroidStudio 3.0
- OpenCV 3.1

##OpenCVをダウンロード
以下から「OpenCV-3.1.0-android-sdk.zip」をダウンロード。その後適当なフォルダに解凍。
[https://github.com/opencv/opencv/releases](https://github.com/opencv/opencv/releases)

```
C:\OpenCV-3.1.0-android-sdk
```

##OpenCVをプロジェクトにImport
プロジェクトを作成後、モジュールをImport
File →　New → Import Module

↓を指定
C:\OpenCV-3.1.0-android-sdk\OpenCV-android-sdk\sdk\java

↓このようになればOK。
![OpenCV.JPG](https://qiita-image-store.s3.amazonaws.com/0/256346/46b9f5d2-75be-bdfb-83ae-88b410c7d1f5.jpeg)

## コンパイルエラー対策
このままだとcompileSdkVersionが違うのでエラーになる。
Gradle Scripts → build.gradle(Module: openCVLibrary310)のcomplileSdkVersionをbuild.gradle(Module: app)と合わせる。
↓の場合はcompileSdkVersionを26にする。
![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/256346/0136ad11-1930-d230-7229-178159c899f1.jpeg)


![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/256346/ed6164c9-0cca-cb47-76d9-731a64dd0b90.jpeg)

## appからOpenCVを参照させる
↓からOpenCVのモジュールを選択。
File → Project Structure → app → Dependencies → + → Module dependency

## 共有ライブラリをプロジェクトに取り込む

↓のプロジェクトフォルダに「jnLibs」を作成。
AndroidStudioProjects\[プロジェクト名]\app\src\main\jniLibs（新規作成）

↓の中身を↑にコピー
C:\OpenCV-3.1.0-android-sdk\OpenCV-android-sdk\sdk\native\libs

## 動作確認
↓でOKになることを確認

```java:MainActivity.java
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if(OpenCVLoader.initDebug()){
            Log.i("Ok");
        }
    }
```
春の目覚め作戦 SpringMVC その２

#Spring-Scurityを取り扱う
###その1にspring-securityとやらを追加しました。
忘れないように_φ(･_･


何がなんだか状態ですが、世のサンプルを切り貼りしてなんとか動くようにしやした。
ここがキモみたいです。

```
    <http auto-config="true" >
        <!-- 認可の設定 -->
        <intercept-url pattern="/top*" access="hasAnyRole('ROLE_ADMIN', 'ROLE_USER')" />
        <intercept-url pattern="/admin*" access="hasRole('ROLE_ADMIN')" />
        <intercept-url pattern="/list*" access="hasRole('ROLE_ADMIN')" />
        <intercept-url pattern="/user*" access="hasRole('ROLE_USER')" />

        <!-- 権限なし時の遷移先 -->
        <access-denied-handler error-page="/403" />

        <!-- 認証のログイン処理 -->
        <form-login
            login-page="/"
            default-target-url="/top"
            authentication-failure-url="/error"
            login-processing-url="/j_spring_security_check"/>

        <!-- 認証のログアウト処理 -->
        <logout
            logout-url="/logout"
            logout-success-url="/"
            invalidate-session="true"/>
        <!-- anonymousユーザのROLE -->
        <anonymous granted-authority="ROLE_ANONYMOUS" />
    </http>
```

参考にさせて頂いたサンプルだと「security-context.xml」でID/パスワード認証してるんですが、その際にWebアプリとDBとで接続をしています。
まぁ、これは当然なんですが、ログイン後に再びWebアプリとDBとで接続する設定処理を「servlet-context.xml」に記載するとエラーがでました。内容は「さっきWebアプリとDB間で接続作ったから２つ目は作れないよぉ～(# ﾟДﾟ)ノ」って意味のようでした。
しかたないんで「__applicationContext.xml__」に共通で使うDB設定を作ったらすんなり動きました。

参考までDBはこんな感じで作りました。

```
CREATE TABLE `todo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `content` varchar(50) DEFAULT NULL,
  `done` tinyint(1) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8

CREATE TABLE `users` (
  `name` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  `authority` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
```

ソースはこちらです。
https://github.com/pugachev/TodoApp.git

一応動作確認用のサイトです。
http://ikefukurou.com/TodoApp/
初心者がMACにxamppを入れました！

web系のアルバイトをしているのに、開発環境を自分で作れない！
これはまずい。
でも、初心者でも簡単に環境構築ができる夢のアイテムがあるらしい。
その名もxampp！（実は専門学校の実習もxamppを使って行っています。）

そんなわけで、簡単設定でサクサク使えるらしいxamppを導入してみました。
自分のために、手順と詰まったポイントを忘れないように書き残します。
<h1>導入〜アクセスまで</h1>
https://qiita.com/h-sakano/items/77fb8367348aeb019209
ステキなまとめを参考にさせていただきました。

<h1>詰まった所</h1>
4時間くらい画面とにらめっこしていました。
<h2>DocumentRootの設定</h2>
htdocs内に作成したディレクトリをlocalhostとなるようにDocumentRootを設定します。
<h3>httpd.confの設定</h3>

```ruby:/opt/lampp/etc/httpd.conf
DocumentRoot "/opt/lampp/htdocs"
```

パスをどう書くのか分からず、悪戦苦闘していました。
Volumesに記載されているパスから書いたら動きました。
<h3>httpd-vhosts.confの設定</h3>

```ruby:/opt/lampp/etc/extra/httpd-vhosts.conf
<VirtualHost *:8081>
    DocumentRoot "/opt/lampp/htdocs"
    ServerName localhost
</VirtualHost>
```

DocumentRootには、httpd.confと同じものを入れます。
エラー場所として、ずっとhttpd.confが指されていたため気が付きませんでした。

<h2>ネットワーク設定</h2>
VirtualHostで指定したポート番号をAddするのですが……
Addするだけじゃだめです。
３つ全てEnableしましょう。（戒め）

<h2>最後に</h2>
これで動くようになりました。
深夜に設定を始めると論理的に物事が考えられなくなるので、夜型人間ではない限りやめたほうが良いことが分かりました（戒め）
次からは鼻をほじりながら設定できるようになりたい……。
Windows 10でCUDA 9.0がインストールできない（Visual Studio Integrationで失敗する）場合の対処方法

Windows 10にTensorflow環境を構築するため、CUDA 9.0をインストールしようとしたら、インストールが失敗してしまう・・
以下の方法でインストールできたので記録しておきます。

#問題
問題発生時の、私のPC環境です。

- Windows 10 Pro Version 1709
- Visual Studio Community 2015 Update 3
- Visual Studio Community 2017
- NVIDIA GeForce GTX 1080 Ti
- Intel HD Graphics 630 (on chip GPU 有効化）
- NVIDIA Latest driver 397.64 installed(397.64-desktop-win10-64bit-international-whql.exe)


VS2015及びVS2017は既にインストール済みの状況で、NVIDIAドライバは、391.24から397.64に、当日アップデートしました。
その後、CUDA 9.1のインストーラ（cuda_9.1.85_win10.exe）で「NVIDIA インストーラが失敗しました」となり、CUDAをインストールできない状態！
どうも、「Visual Studio Integration」という項目でエラーとなっているようでした。
※Tensorflowの要件がCUDA 9.0ということに気付いたので、途中で9.0に変更しました。
　画像は、9.1のものですが9.0でも同じ現象でした。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/100712/f4e1ca6c-bec6-405b-5a94-d114f7e53bf6.png)

#対処方法（やってみたこと）
[このサイト](https://devtalk.nvidia.com/default/topic/1033111/cuda-setup-and-installation/cuda-9-1-cannot-install-due-to-failed-visual-studio-integration/)の以下の記事を参考に、一旦全てのNVIDIA製品をアンインストール、アンインストール後、CUDA 9.0（cuda_9.0.176_win10.exe）がインストールできました。
※記事のSTEP.Bを実施しました。
※No.7,8は、私の環境では該当なしでした。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/100712/2631fc0f-6b69-719b-d59b-892fa6ab70d3.png)

詳しいことは分かりませんが、この問題はNVIDIAドライバとCUDAバージョンの整合性が起因してるのだと思います・・

※この対処後、Windows 10 Pro Version 1803にアップデートしました。CUDA 9.0を上書きでインストールしてみましたが、問題なくインストールできました。

#参考ページ
[CUDA 9.1 cannot install due to failed Visual Studio Integration](https://devtalk.nvidia.com/default/topic/1033111/cuda-setup-and-installation/cuda-9-1-cannot-install-due-to-failed-visual-studio-integration/)

以上
Arduino リングバッファー

Arduino ノリングバッファーライブラリを使用してみます。
ライブラリマネージャーでCircularBufferと検索してインストールします。:relaxed:

![image.png](https://qiita-image-store.s3.amazonaws.com/0/165672/3d0464f7-9536-dfdc-4bc0-7216f0c3f3ee.png)

公式マニュアルなどはここ↓
https://github.com/rlogiacco/CircularBuffer

<宣言>
CircularBuffer<int,5> buffer; // buffer capacity is 5

<データ書き込み>
・先頭に追加する関数　(最後尾のデータが押し出される。)
 buffer.unshift(1);

・最後尾に追加する関数　(先頭のデータが押し出される。)
 buffer.push(0);  

```書き込みsample.
CircularBuffer<int,5> buffer; // buffer capacity is 5

// all of the following return true
buffer.unshift(1); // [1] 
buffer.unshift(2); // [2,1]
buffer.unshift(3); // [3,2,1]
buffer.push(0);  // [3,2,1,0]
buffer.push(5);  // [3,2,1,0,5]

buffer.unshift(2);  // [2,3,2,1,0] returns false
buffer.unshift(10); // [10,2,3,2,1] returns false
buffer.push(-5);  // [2,3,2,1,-5] returns false
```

<データ読み込み>
・先頭読み込み
　buffer.first();
・最後尾読み込み
　buffer.last();
・最後尾データを取り出し。(最後尾のデータはなくなる)
　buffer.pop();
・先頭データを取り出し。(先頭のデータはなくなる)
　buffer.shift();
・指定場所のデータを読み出し
　buffer[0];

```読み込みsample.
CircularBuffer<char, 50> buffer; // ['a','b','c','d','e','f','g']

buffer.first(); // ['a','b','c','d','e','f','g'] returns 'a'
buffer.last(); // ['a','b','c','d','e','f','g'] returns 'g'
buffer.pop(); // ['a','b','c','d','e','f'] returns 'g'
buffer.pop(); // ['a','b','c','d','e'] returns 'f'
buffer.shift(); // ['b','c','d','e'] returns 'a'
buffer.shift(); // ['c','d','e'] returns 'b'
buffer[0]; // ['c','d','e'] returns 'c'
buffer[1]; // ['c','d','e'] returns 'd'
buffer[2]; // ['c','d','e'] returns 'e'

buffer[10]; // ['c','d','e'] returned value is unpredictable
buffer[15]; // ['c','d','e'] returned value is unpredictable
```

<その他>
isEmpty()
isFull()
available()
capacity() など
google colaboratory の cuda version, cudnn version

Google colaboratory には、nvcc が入っていないので、`nvcc -v` でバージョンチェックはできない。

* cuda は、`!nvcc --version`
* cudnn は`!ls -l /usr/lib/x86_64-linux-gnu/libcudnn.so*`
* ドライババージョン は`! ls /usr/lib64-nvidia/libcuda*`

を見ると分かる。

2019/02/15現在、cuda 10.0.130, cudnn 7.4.2、ドライババージョン 410.79

https://drive.google.com/file/d/1JhvRmCQroicxfd04y1B3nHioS-PghwXN/view?usp=sharing
Rails で作りたいもの

次の開発は、イベント管理システムとメールでのとウェーブをセットに承認システムです。
正直どちらも世間探せば、フリーでありそうなシステムですが、実際に使おうと言うものでなくやはり練習用でのものです。
メールでのやりとりを使いたいので、HerokuではなくさくらVPSをサーバーとして使いたいと思います。
VPSを一から使うのか再インストールするのかは考えます。
とろいので、一度アンインストールしてしまえば、二度と戻せないかもしれません(-_-)
イメージは、前素のPHPで作りかけていた<A HREF="http://titonet384.sakura.ne.jp/homepage/">もの（勿論、全部架空）</A>をもっとスマートで使いやすく、したいと思います。
でも、久々に見たけどたいへんそうだ。
プログラムの世界甘くない！
なるべくならscaffold（自動で土台を作ってくれるシステム）を使って楽に速く進めたいと思うのですが、どうでしょう。
かえってはまって時間がかかってしまうかもしれません。
プロは、scaffold使ってるだろうか?この辺り意見を頂ければありがたいです。

<A HREF="https://blooming-reef-85835.herokuapp.com/posts/index">マイブログ</A>
docker-compseでnginx構築

# docker-compseでnginx構築

## nginxのインストール

```
$ sudo mkdir /var/www
$ sudo mkdir /var/www/devops
$ sudo chown -R ec2-user:ec2-user /var/www/devops
$ cd /var/www/devops
$ mkdir nginx
$ sudo chown -R ec2-user:ec2-user nginx
$ touch docker-compose.yml
```

ymlファイルを編集します。

```rb:docker-compose.yml
version: '3'
services:
  web:
    image: nginx
    ports:
      - "80:80"
    volumes:
      - ./nginx/mysite.template:/etc/nginx/conf.d/mysite.template
    command: /bin/bash -c "envsubst < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
```

volumesで指定したconfを作成します。

```
$ mkdir nginx
$ vi nginx/mysite.template
```

```rb:mysite.template
server {
    listen 80 default;
    server_name _;
    root /var/www/html;
    charset utf-8;

    access_log off;
    error_log off;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
```

インストール＆起動します。

```
$ docker-compose up -d
```

## セキュリティグループを変更する
このままでは外部からのアクセスができないため、AWSコンソールでセキュリティグループの変更をしてHTTPポートを開放します。

1. AWSの「インスタンス」より、起動中インスタンスに表示されているセキュリティグループを選択します。
1. 「インバウンド」の「編集」ボタンをクリックし、タイプ「HTTP」を選択して保存します。
1. ブラウザから`http://[インスタンスのIPアドレス]`でアクセスします。


# 参考
https://docs.docker.com/samples/library/nginx/#using-environment-variables-in-nginx-configuration
Python > list > リスト要素を加算してPythonリストとして返す > 方法1.Numpy使用 | 方法2.Pythonのみでの実装

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
```

### 処理概要

- Pythonリストを使う関数がある
- ２つのリストを要素ごとに加算して、その関数で使いたい

### 方法1. Numpy使用

- Numpyとしてリストを要素ごとに加算
- Pythonリストとして返す
    - tolist()を使う

https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.ndarray.tolist.html

### code

```test_list_elemadd_180520.py
import numpy as np


def python_list_add(in1, in2):
	wrk = np.array(in1) + np.array(in2)
	return wrk.tolist()

org = [3, 1, 4]  # origin
pos = [2, 7, 1]

wrk = python_list_add(org, pos)

print(wrk)

```

```txt:run
$ python3 test_list_elemadd_180520.py 
[5, 8, 5]
```


### 方法2. Pythonのみでの実装

Numpyを使わずPythonのみでの実装について、@shiracamus さんの[コメント](https://qiita.com/7of9/items/5e6256dbfb330424a458/#comment-a6a3c66dee488ddc609a)の方法にて教えていただきました。

情報感謝です。

micoiPythonの環境ではNumpyがないという情報もありますね。
[音を1サンプル毎に扱う音響合成環境をPythonでつくる(2)](https://qiita.com/rrii/items/f7b9ee5fa0b902ae611c)
> なぜならPythonにはnumpyはあるけどmicroPythonには無いからです！
Mac で rename コマンドを使ってファイル名の先頭、末尾を一括変換する

## 背景

ファイルの中身がカンマ区切りのcsv形式のファイルなのに拡張子が付いていないため、Excelと関連付かず開けない。数百ファイルとあるため、手で `.csv` を付けることが面倒だったのでコマンドで置換する方法を探しました。

## 目的

ディレクトリ内のファイルすべてにprefixやsuffixを付けたい

## rename コマンドのインストール

```
$ brew install rename
```

## 例

### 基本

```
$ rename -s hello world *
```

`hello.txt` だったら `world.txt` みたいに置換します。

### ファイル名の先頭にprefixを付ける

```
$ rename 's/^/test_/' *
```

先頭に `test_` を追加します。

### ファイル名の末尾にsuffixを付ける

```
$ rename 's/$/.csv/' *
```

末尾に `.csv` を追加します。

### ファイル名の末尾から文字列を除去する

```
$ rename 's/.csv$//' *
```

末尾の `.csv` を削除する。

## 最後に

rename コマンドが超絶便利でした。
正規表現強い人はもっと色々できそう。

## 参考

- http://plasmasturm.org/code/rename
関数の例(戻り値、引数)

``` 
override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        showMessage(name: "太郎", age: 10)
        let name = getName()
        print(name) //太郎
        
    }

    func hogehoge3 (_ plusScore: Int) {
        let baseScore = 10
        let totalScore = baseScore + plusScore
        print(totalScore)
    }
    
    func hogehoge (_ array: [String]) {
        print(array)
    }
    
    
    func hogehoge2 (array: [String]) {
        print(array)
    }

    
    //戻り値がある関数
    func getName () -> String {
        let name = "太郎"
        return name
    }
    

    func showMessage (name: String, age: Int) {
        print("私の名前は\(name)です。年齢は\(age)才です")
        
    }
```
Gitってなにするの？

#Gitって？

ファイルの変更履歴を管理するシステムです。
（いつ誰がどのファイルに対してどんな修正をして～～）

よく業務ではソースコードを管理するような使い方が多いです。

#なんでソースの変更履歴を管理するの？

###まずはソースの変更履歴を管理しない例を見てみましょう。

例えばAさんのPCに「**index.html**」があります。
BさんのPCにも「**index.html**」があります。

・Aさんは「**index.html**」を修正しました。
・Bさんも「**index.html**」を修正しました。

・Aさんは「**index.html**」をサーバへアップロードしました。(①)
・もちろんBさんはAさんが先にサーバへアップロードしたことを知りません。何も知らずにBさんも「**index.html**」をサーバへアップロードしてしまいました。(②)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/257220/20c25c7f-67b5-e6b3-18cd-f9492a05066b.png)

お気づきでしょうか。
Aさんがせっかく修正してサーバへアップロードしたのに、Bさんがそれを上書きしてしまったのでAさんの修正分が消えてしまいました。

そんなこと業務中に起こったらおこおこですよね…
なのでこういうことが起こらないように、みんなでちゃんとファイルを管理しようねってことです。

この例では2人ですが、実際のプロジェクトで何十人もいた場合、誰が何を修正してるかなんて把握できないので気をつけようがないですよねｗ

Gitを利用することで、このような事態が起こらないようにできます。

#Gitの環境設定は？

詳しい環境設定についてはこの記事では省きます。
でも、インストールするだけだった気がします。

##必須

■Git For Windows
[https://git-scm.com/download/win](https://git-scm.com/download/win)

Windows上でGitを動作させるために必須です。
　これさえあれば動くはずです。

##必要であれば

※以下Windows上でGitを使いやすくするためのツールなので必須ではないです。
(が、初心者の方はどちらかを入れておいたほうがわかりやすいです。)

■Source Tree
https://ja.atlassian.com/software/sourcetree
綺麗なUIなので直観的でわかりやすくGitを操作できます。

■Tortoise Git
https://tortoisegit.org/
エクスプローラからGitを操作できるようになります。

#Gitって難しい？

Gitの他にもSVNやVSSといったソース管理システムもあります。
正直どれを使ってもソースは管理できます。

しかし勉強を進めるうちに、「SVNやVSSじゃだめだ、Gitってすげー」って思う時がくると思います。

今回は説明してませんが、Gitは「ローカルリポジトリがある」「ブランチという考え方がある」という2点がなかなか強いと個人的に思ってます。

その分Gitは学習コストも高いですが、慣れてくると面白いです。

#まとめ
今回は、Gitってなんだろう…という初歩的な内容を説明しました。

この記事では、ソース管理をしなかったら上書きされちゃう可能性があるという例を書きましたが、その他にも起こりうる問題点はたくさんあります。

業務でソースコードを管理するのは今は必須だと思います。
ユーザークラスの作り方例

```
class User {
    var name: String //名前
    var age: Int //年齢
    var prefecture: String //出身県
    var height: Int //身長
    
    init(name: String, age: Int, prefecture: String, height: Int ) {
        self.name = name
        self.age = age
        self.prefecture = prefecture
        self.height = height
        
    }

}
```
Raspberry Piとカメラを使って、データを書き込まずに画像をPOSTする方法 with OpenCV

# はじめに

現場でラズパイを使って画像データ収集するにあたり、少しでもmicroSDの寿命を伸ばしたいという願いから、可能な限りmicroSDへの書き込みを減らそうと思い、手順を調べたのでまとめます。

# ラズパイに必要なもの

1. 内蔵用カメラまたはUSBカメラ
1. Python3
1. OpenCV

# サーバーに必要なもの

1. HTTPサーバ
2. Ruby

# カメラによる撮影と画像の送信

カメラを取り付けたラズパイで以下のスクリプトを実行。

```/home/pi/post.py
#!/usr/bin/env python3

import cv2
import time
import requests

cap = cv2.VideoCapture(0)

cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)

time.sleep(1)
ret, frame = cap.read()

url = "http://xxx.xxx.xxx.xxx/upload.cgi"

files = {'imgData': cv2.imencode('.jpg', frame)[1].tobytes()}
res = requests.post(url, files=files)

cap.release()
```

# 画像データの受信

受信するサーバに以下のCGIスクリプトを設置して待機。

```upload.cgi
#!/usr/bin/env ruby

require "cgi"

formData = CGI.new

print "Content-type: text/html\n\n"

open("./data.jpg","wb") do |fh|
  fh.binmode
  fh.write formData['imgData'].read
end

puts "OK"
```

# 自動実行

カメラを取り付けたラズパイにて以下のコマンドを実行。

```
chmod a+x post.py
```

1分おきに自動実行するよう設定。

```
crontab -e
```

以下の一行を追加。

```
*/1 * * * * /home/pi/post.py
```

できた(^-^)
Linux mintにCUDA Toolkit 9.2を入れようとして詰まった話

先日，Linux mint 18.3（この記事では単にmintとよびます）にCUDA Toolkit 9.2をインストールしようとして，つまりました．

ここでは，同じ問題に詰まっている人のためのメモを残したいと思います．

# 基本的なこと
mintはUbuntuのフォークなので，[Version History](https://en.wikipedia.org/wiki/Linux_Mint_version_history)を見れば，現在のmintではどのバージョンのUbuntuが使われているのかわかります．ここを参考にすれば，今回使ったmint 18.3は，Ubuntu 16.04がベースになっていることがわかります． 

そして，該当のUbuntuバージョンと同じ手順で各種インストールをすれば，**基本的には**うまく行きます．

今回の場合，Ubuntuの問題なのか，mintの問題なのかわからず，右往左往しました．

# ドライバのインストール
Linux mintにドライバをインストールする方法は，２つあります．

- NVIDIAのホームページからダウンロードしてくる
- aptを使用してインストールする

上記の２つのどちらを使っても，私が実行した時点では390が適切なドライババージョンとしてインストールされました．

しかし，CUDAのパッケージは，最新版ドライバであるはずの「396」以上という依存情報をもっていたため，CUDA9.2をインストールできませんでした．

今回の問題は，ドライバのバージョンがリリース後に下がっており（396 -> 390），それに対してCUDAのリポジトリ情報が追随できていなかったことのようです．

# 解決
結局，[過去のドライバをダウンロードできるページ](http://www.nvidia.com/Download/Find.aspx?lang=en-us)から，リリース日では過去版にあたる，「396」を確認して，インストールしました．

この結果，

```
sudo apt install cuda
```
も通るようになり，無事現時点で最新版であるCUDA 9.2をインストールすることができました．

# おさらい
1. 必要なドライバの確認：自分がインストールしたいCUDAのバージョンに必要なドライバを[ここ](https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html)でチェック
2. 必要なドライバ以上のバージョンのドライバを[ここ](http://www.nvidia.com/Download/Find.aspx?lang=en-us)からダウンロードまたはaptを使用してインストール
3. [ここ](https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html)を参考にCUDAをインストール
4. [ここ](https://docs.nvidia.com/deeplearning/sdk/cudnn-install/#installcuda)を参考にcuDNNをインストール．Ubuntu/mintなら，dpkgを使って簡単にインストールできる．
ES6でのimport/export

## 概要
React+ReduxをやってみてES6でのimportとexportについて(今のところ関数だけ)学んだことのメモ．

## 実行環境
ES6はブラウザやJSエンジンによってサポートされている機能がまちまちのため，この記事では以下の環境(Node.jsのv9.11.1)を想定する.

```
$ node --version
v9.11.1
```
この環境では，以下のオプション(`--experimental-modules`)を付けることによってES6の機能を試すことができる．なお，注意点として，実行するファイルの拡張子は**.mjs**とすること．

```js
$node --experimental-modules main.mjs
```

## 基本
ES6では，ある関数が書いてあるファイルを別のファイルから利用する場合，その関数に`export`をつけて公開することができる．

```js:lib.mjs
export function hello() {
    console.log("Hello");
}

export function hello2() {
    console.log("Hello2");
}
```
そして，公開した関数を`import`によってインポートすることができる．
importでは，

```
import {importする関数名1,importする関数名2...} from '相対パス/ファイル名(拡張子なし)'
```
とする．


```js:main.mjs
import {hello, hello2} from './lib'
hello();
hello2();
```


実行結果

```
>node --experimental-modules main.mjs
(node:2761) ExperimentalWarning: The ESM module loader is experimental.
Hello
Hello2
```

## export default
1つのファイルで1つのモジュール(関数)をexportする場合，`default`キーワードをつけることが推奨されているらしい．

```js:lib2.mjs
export function hoge() {
    console.log("hoge");
}

export default function hello3() {
    console.log("Hello3");
}
```

これをインポートして使う

```js:main.mjs
import {hello, hello2} from './lib'
import hello3, {hoge} from './lib2'  /* hello3は{}はつけない */

hello();
hello2();
hello3();
hoge();
```

`default`をつけてexportした関数は，`{...}`なしでimportする．

実行結果

```
>node --experimental-modules main.mjs
(node:2824) ExperimentalWarning: The ESM module loader is experimental.
Hello
Hello2
Hello3
hoge
```

## anonymous関数のexport
ES6では，クロージャを定義してexportできる

```js:lib3.mjs
export default () => {
    console.log("anonymous func");
}
```

これらはインポート側で名前をつけてインポートする

```js:main.mjs
import {hello, hello2} from './lib'
import hello3, {hoge} from './lib2'
import {default as ano} from './lib3' /* lib2.mjsでexportした関数をanoとしてインポート */
hello();
hello2();
hello3();
hoge();
ano();
```

実行結果

```
>node --experimental-modules main.mjs
(node:2896) ExperimentalWarning: The ESM module loader is experimental.
Hello
Hello2
Hello3
hoge
anonymous func
```

## exportされた関数をまとめる
公開する関数が複数のファイルに分かれて多くなってくると，importするのが煩わしくなってくる．そこで，exportしている関数をまとめて1つのモジュールにすることができる．

```js:lib4.mjs
export default () => {
    console.log("anonymous func lib4");
}
```

```js:lib5.mjs
export default () => {
    console.log("anonymous func lib5");
}
```

lib4.mjsとlib5.mjsで公開されたファイルをまとめる．

```js:mmo.mjs
export {default as lib4} from './lib4';
export {default as lib5} from './lib5';
```

`mmo.mjs`というモジュールを作成しexportする．

これらをimportして使う．

```js:main.mjs
import {hello, hello2} from './lib'
import hello3, {hoge} from './lib2'
import {default as ano} from './lib3'
import * as mmo from './mmo'   /* mmoという名前でインポートする */


hello();
hello2();
hello3();
hoge();
ano();
console.log(mmo);
mmo.lib4();  /* モジュール名.関数名()として利用する */
mmo.lib5();
```

```
>node --experimental-modules main.mjs
(node:2946) ExperimentalWarning: The ESM module loader is experimental.
Hello
Hello2
Hello3
hoge
anonymous func
{ lib4: [Function: default], lib5: [Function: default] }
anonymous func lib4
anonymous func lib5
```

この例では，まず`mmo.mjs`の中で`lib4`, `lib5`でexportしたdefaultの関数に名前をつけ，さらに`mmo.mjs`ですべてインポートし，インポートした関数にはモジュール名.関数名としてアクセスする．

---
間違い等あればご指摘下さい．
可視化(3D) > GitHub > STL > Cubeの表示 > STL Writer使用

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
```

### 関連

[可視化(3D) > GitHub > STL > Cubeの表示 > STL Writer使用 > 方向によっては面が表示されない > 描画されない条件: 頂点が時計回り](https://qiita.com/7of9/items/f97dc75876c62fb0b586)

### STL Writerの使用

GitHubではSTLファイルをレンダリングする機能がある。
STLファイルを生成するツールとしてSTL Writerがある。そのコードは下記にある。
http://code.activestate.com/recipes/578246/

コードのexampleではGitHub上で正常にレンダリングされない。
その理由については上記のリンクで記載している。

正常にレンダリングされるコードをここに整理しておく。

### 手順

1. STL Writerのコードを取得
    - http://code.activestate.com/recipes/578246/
    - recipe-578246-1.py
2. STL Writerのコードをシンボリックリンク
    - `ln -fs recipe-578246-1.py STLWriter.py`
    - 理由: importする時にファイル名にマイナスがあるとできない
3. 下記のコードを実行してSTLファイルを作成
4. STLファイルをGitHubリポジトリにpushする


```test_make_cube_180520.py
import STLWriter as STLWR
# STLWriter
# code from
# http://code.activestate.com/recipes/578246/
# by Manfred Moitzi

def make_cubeGroup():
    def get_cube():
        # cube corner points
        s = 3.
        p1 = (0, 0, 0)
        p2 = (0, 0, s)
        p3 = (0, s, 0)
        p4 = (0, s, s)
        p5 = (s, 0, 0)
        p6 = (s, 0, s)
        p7 = (s, s, 0)
        p8 = (s, s, s)

        # define the 6 cube faces
        # faces just lists of 3 or 4 vertices
        #
        # [NOTE]
        # vertices must be defined [anticlockwise] to be seen on GitHub
        # otherwise, the face is not drawn
        #
        return [
            [p1, p3, p7, p5],  # bottom
            [p1, p5, p6, p2],  
            [p5, p7, p8, p6],
            [p7, p3, p4, p8],  # rear 
            [p1, p2, p4, p3],  # left            
            [p2, p6, p8, p4],
        ]

    OUT_FILE = 'cube_180520_t0950.stl'
    with open(OUT_FILE, 'wb') as fp:
        writer = STLWR.Binary_STL_Writer(fp)
        writer.add_faces(get_cube())
        writer.close()
    print('OUT:', OUT_FILE)

if __name__ == '__main__':
    make_cubeGroup()

```

### 実行結果


[cube_180520_t0950.stl @ GitHub](https://github.com/yasokada/test_STL_Writer_180520/blob/master/cube_180520_t0950.stl)
可視化(3D) > GitHub > STL > Cubeの表示 > STL Writer使用 > 方向によっては面が表示されない > 描画されない条件: 頂点が時計回り

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
```

### 処理概要

- PythonでSTLファイルを作成する
- STLファイルをGitHubの描画機能で描画する

形状情報を環境によらずに閲覧できるようにする方法の１つとしてGitHubを検討した。

### STL Writer

下記にあるSTL Writerを使用。

http://code.activestate.com/recipes/578246/

cube.stl
ファイルが生成される。

### GitHub

GitHubにリポジトリを作成し、cube.stlファイルを上げてみた。

[cube.stl @ GitHub](https://github.com/yasokada/test_STL_Writer_180520/blob/master/cube.stl)

### 方向によっては面が表示されない

下記のように、閲覧方向によっては面が表示されない。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/a1ed84d5-7157-d814-688e-236a0e4bcbc2.png)

STL Writerの実装の問題か、GitHubの描画の条件があるのか、未消化。

Normal方向の定義によっては、面が見えなくなるのかもしれない。

### 描画されない面の条件

下記の条件の時、面が描画されないようだ。

- 閲覧方向に対して、頂点の定義が「時計回り」順になっている時

底面の頂点定義順について、閲覧方向に対して「反時計回り」にしたところ、描画されるようになった。
[cube_t0913.stl @ GitHub](https://github.com/yasokada/test_STL_Writer_180520/blob/master/cube_t0913.stl)

```py
        # define the 6 cube faces
        # faces just lists of 3 or 4 vertices
        return [
            [p1, p3, p7, p5],
            #[p1, p5, p7, p3],
            [p1, p5, p6, p2],
            [p5, p7, p8, p6],
            [p7, p8, p4, p3],
            [p1, p3, p4, p2],
            [p2, p6, p8, p4],
        ]
```

### 左面と背面の修正

左面と背面も描画に失敗していたので、修正した (反時計回りにした)。

```py
        # define the 6 cube faces
        # faces just lists of 3 or 4 vertices
        return [
            [p1, p3, p7, p5],  # bottom
            #[p1, p5, p7, p3],
            [p1, p5, p6, p2],
            [p5, p7, p8, p6],
            [p7, p3, p4, p8],  # rear 
            #[p7, p8, p4, p3],  
            [p1, p2, p4, p3],  # left            
            #[p1, p3, p4, p2],
            [p2, p6, p8, p4],
        ]
```

[cube_t0928.stl @ GitHub](https://github.com/yasokada/test_STL_Writer_180520/blob/master/cube_t0928.stl)
化粧品アプリLIPSでも使われてるPageMenuを導入方法[Swift3][Swift4でも]

<img width="375" alt="IMG_7510.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/118756/cf34e51d-1891-e061-7507-a391e644950a.png">

LIPSでも使われているPageMenu


# PageMenuをCocoapodsでインストールするとエラーを吐く
Swift3以前のものがCocoapodsでは使用されています。そのためGithubからコピペする必要があります。[PageMenuのGithubファイルはこちら](https://github.com/PageMenu/PageMenu/tree/master/Classes)

## Swift Versionを3.3に落とす
Swift4には未だ対応してないため4のまま修正するより3.3にバージョンを落とす方が楽です。


```swift:PageMenuViewController.swift
class PageMenuViewController: UIViewController {

    var pageMenu: CAPSPageMenu?

    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //ストーリーボードのFavListTableViewControllerを取得する必要がある
        let vc1 = storyboard?.instantiateViewController(withIdentifier: "FavListTableViewController") as! FavListTableViewController
        let vc2 = storyboard?.instantiateViewController(withIdentifier: "FavListTableViewController") as! FavListTableViewController
        let vc3 = storyboard?.instantiateViewController(withIdentifier: "FavListTableViewController") as! FavListTableViewController
        let vc4 = storyboard?.instantiateViewController(withIdentifier: "FavListTableViewController") as! FavListTableViewController
        let vc5 = storyboard?.instantiateViewController(withIdentifier: "FavListTableViewController") as! FavListTableViewController
        
        //TableViewはViewControllerのViewのサブクラスなのでViewが生成されてからじゃないと作れない
        _ = vc1.view
        _ = vc2.view
        _ = vc3.view
        _ = vc4.view
        _ = vc5.view
        
        
        vc1.title = "リスト1"
        vc2.title = "リスト2"
        vc3.title = "リスト3"
        vc4.title = "リスト4"
        vc5.title = "リスト5"
        
        vc1.listNum = 1
        vc2.listNum = 2
        vc3.listNum = 3
        vc4.listNum = 4
        vc5.listNum = 5

        let parameters: [CAPSPageMenuOption] = [
            .menuItemSeparatorWidth(4.0),
            .useMenuLikeSegmentedControl(true),
            .menuItemSeparatorPercentageHeight(0.0)
        ]
        pageMenu = CAPSPageMenu(viewControllers: [vc1, vc2, vc3, vc4, vc5], frame: view.bounds, pageMenuOptions: parameters)
        view.addSubview(pageMenu!.view)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

//     PageMenuがNavigationBarと被らないように
    override func viewDidLayoutSubviews() {
        let naviHeight = UIApplication.shared.statusBarFrame.size.height + self.navigationController!.navigationBar.frame.height
        pageMenu!.view.frame = CGRect(x: 0.0, y: naviHeight, width: self.view.frame.width, height: self.view.frame.height - naviHeight)
        print(#function)
        
//        let tabHeight = self.tabBarController?.tabBar.frame.size.height
        
    }
}
```

僕の場合、ストーリーボードにUIViewControllerであるFavListTableViewControllerを配置し、それをStoryboard IDで取得しています。ViewControllerの規則としてUIViewControllerに置かれるUIKit部品は、UIViewが呼ばれてからでないと呼ばれません。僕のケースですとUITableViewを置いていました。

PageMenuのGithubドキュメントにあるようにタイトルやparametersを指定し、addSubViewしてあげます。
Processingについて少しだけ調べてみました。

先日、面白いプログラミング言語があるとを教えていただき気になっていたProcessingを試してみます。
#公式サイト＆ダウンロード
##公式サイト
https://processing.org/
公式サイトのトップには紹介のビデオがあります（英語）。最新バージョンは３なのですね。
陽気な紹介ビデオです。いいですね。エディタに新しく追加されたエラーチェック機能などをワクワク紹介してくれているのが良いです。２２分あるので最初は全部見るつもりはなかったのですが、結局見ました。楽しいは正義です。
Welcome to Processing 3
https://vimeo.com/140600280
##ダウンロード
https://processing.org/download/
OS（Windows/Linux/Mac）を選びダウンロードします。寄付のページが自動で表示されます。平行してzipファイルがダウンロードされますので、まずは解凍して作業をします。
#Processingとは
こちらのサイトがとても分かりやすくまとめられていました。
http://www.d-improvement.jp/learning/processing/class/about-processing.html
上記サイトより引用すると、Processing誕生の由来は
>プログラミングによる視覚的な表現（イメージの生成、アニメーション、インタラクション）の技法をやさしくするために生まれた。

とのことです。

また、筆者の方が大学の授業で使われていた資料も見られます。

#ファースト・インプレッション
プログラミングの学習や、シミュレーション、解析に便利そうな印象を受けました。
ダイクストラや各種ソートなどのアルゴリズムのシミュレーションもできるのでしょうか。

万有引用のシミュレーションについての記事
https://qiita.com/tobira-code/items/49553738a1ce89579fec

もし、プログラミングしつつ体験的にアルゴリズムを学ぶといった使い方ができたらいいなあというのが私の第一印象です。

多分、続く。

2018/05/20追記
【Processing3 入門】サンプル集
https://algorithm.joho.info/programming/processing/sample-code-p5/
Hyperのタブのタイトルを変更する@Windows

タブとしてコマンドプロンプト(cmd.exe)を使っている場合についてです。

ぐぐっても情報が無くて結構苦労しましたが、結局これでOKでした。

#タイトル変更
変更するタブのターミナル内で
`title 設定するタイトル名`
を実行
(titleコマンドはコマンドプロンプトのタイトルを変更するWindowsのコマンド)
自分で作ったDockerイメージを非公開環境にあげてみた

### 前提
- Docker Hubでアカウントを持っていること。※ここではユーザー名（username）として進めます。
- Dockerイメージを作成していること。※ここでは「original」というイメージを作成したとします。


### 環境
    - macOS High Sierra 10.13.2
    - Docker for Mac Version 17.12.0-ce-mac47
    - Docker Version 17.12.0-ce

# 本題
## 1.最新のレジストリをDocker Hubから取得
最新のバージョン[ここ](https://hub.docker.com/_/registry/)で確認し、
```$ docker pull registry:バージョン```で取ってきます。
2018/1/22現在では2.6.2が最新なので。。。

```
$ docker pull registry:2.6.2
  2.6.2: Pulling from library/registry
```


という具合になればOKです。
不安であれば```$ docker images```で自分が持っているイメージを確認できます。


```
$ docker images
  REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
  registry            2.6.2               d1fd7d86a825        12 days ago         33.3MB
```

という具合に出るかと思います。

## 2.取ってきたイメージを元にコンテナを作り、作ったコンテナを起動する
```docker run```コマンドで実行します。
これは```docker create```と```docker start```を同時に実行するという感覚の理解で良いかと思います。

```
$ docker run -d -p 5000:5000 --restart always --name registry registry:2.6.2
```
- -dオプション：コンテナをバックグラウンドで動かす
- -pオプション：外部からアクセスされるポート番号:コンテナ側のポート番号を指定しますよ
- --restart always：Dockerを終了した後、再度起動させた際にこのコンテナを自動的に起動したいよ
- --name：コンテナ名を定義しますよ

## 3.イメージをあげる前にタグ名をつける
自分で作成したイメージをあげる前にはタグ名をつける必要があるそうです。
ということで

```$ docker tag イメージID ユーザー名/リポジトリ名:タグ名```で実施します。
こんな感じ

```
$ docker tag 5fb username/orginal:1.0
```

```
$ docker images
  REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
  registry            2.6.2               d1fd7d86a825        12 days ago         33.3MB
  username/orginal    1.0                 5fbxxxxxxxxx        5 days ago          1.07GB
  orginal:1.0         latest              5fbxxxxxxxxx        5 days ago          1.07GB
```


## 4.Dockerイメージをあげる
```$ docker push ユーザー名/リポジトリ名:タグ名```で手順2で用意したコンテナにあげます。

```
$ docker push username/original:1.0
```

これで一応は完了です。

## 5.確認（pullしてみる）
ちゃんとあげられているか確認をしてみます。
※[ブラウザ](https://cloud.docker.com/)からも確認できます。
まず、手順3で作成したタグ名つきイメージを消します。

```
$ docker rmi username/orginal:1.0
```

```
$ docker images
  REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
  registry            2.6.2               d1fd7d86a825        12 days ago         33.3MB
  orginal:1.0         latest              5fbxxxxxxxxx        5 days ago          1.07GB
```

pullします。

```
$ docker pull username/orginal:1.0
```

```
$ docker images
  REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
  registry            2.6.2               d1fd7d86a825        12 days ago         33.3MB
  username/orginal    1.0                 5fbxxxxxxxxx        5 days ago          1.07GB
  orginal:1.0         latest              5fbxxxxxxxxx        5 days ago          1.07GB
```
AWS でLINE Bot開発（Amazon Api Gateway、Amazon Lambda、IAM、Node.js、Messaging API）

# 概要
AngelHack Tokyo2018に参加した折に、LINE BOTと触れ合う機会を得た。
[AWS と LINE を連携させてbotを作ってみよう・準備編](http://xp-cloud.jp/blog/2017/11/13/2345/)を参考に
環境構築から、おうむ返し→カルーセル表示まで挑戦した時の注意点を残します。

# 前提条件
以下の2つのアカウントの用意ができていること。

- LINEアカウント
- AWSのアカウント

※まだの場合は「LINE BOT 開発」とかでググれば出てきます。
LINEアカウントを作ったり、node.jsでbot本体を開発する方法は
[LINEのBot開発 超入門（前編） ゼロから応答ができるまで](https://qiita.com/nkjm/items/38808bbc97d6927837cd#%E6%AC%A1%E3%81%AE%E3%82%B9%E3%83%86%E3%83%83%E3%83%97)を参考にしてください。
[AWS と LINE を連携させてbotを作ってみよう・準備編](http://xp-cloud.jp/blog/2017/11/13/2345/)もとても参考にしたが、用意してくださっているコードのシングルクオートが全角になっている箇所があってエラーとなるので注意。


## 「node.js」のバージョンに注意

Lambdaで使用できる「Node.js」のバージョンが限られているため、対応バージョンをインストールする。
※今回は6.10.0

```
$ nodebrew install-binary v6.10.0
```

```
$ nodebrew use v6.10.0
use v6.10.0
```
## ファイルのアップロードに注意
Lambda Management ConsoleからLambda関数作成する際のファイルアップロード時、対象ファイルをそれぞれ「command + クリック」で選び、圧縮したものをあげるようにすること。
そうでないと「index.jsが見つかりません」と言ったメッセージが出てしまいます。

イメージこんな感じ
↓↓
<img width="684" alt="example.png" src="https://qiita-image-store.s3.amazonaws.com/0/177690/c987d42c-80dd-ece8-e0eb-b895545ebba8.png">
seleniumで連番のページに普段使用しているfirefoxのプロファイルでアクセス

* python3
* selenium (`apt install firefoxdriver python3-selenium`)
* firefox + [geckodriver](https://github.com/mozilla/geckodriver/releases)

```py:a.py
from selenium import webdriver
fp = webdriver.FirefoxProfile('/home/user1/.mozilla/firefox/zaxxxxxt.default')
browser = webdriver.Firefox(fp)

for i in range(500000):
   browser.get('https://どこかのページ/member/'+str(i)+'/')
   print (i)

browser.quit()
```

```sh:実行
python3 a.py
```
【mermaid.js】設計図をGitHub管理下に置く

設計図を伴う中規模以上の開発でまれによくあるのが次のような状況です。

- 担当者が何かしらのツールを使って設計図を書き、画像をアップロードする
- N回繰り返す:
    - 口頭で設計に関するレビューを受ける
    - 議事録を参照しながら設計図を更新し、画像を再アップロードする
- どの画像が最新だったのか、変更履歴がどうなのか分からなくなってくる
- 画像を作ってた担当者がいなくなり、画像のソースが失われる

これに対し、こうだったらいいな〜と前々から思ってたのは次のような状況です。

- 設計図の画像ではなくソースがGitHubに上がっている
    - 変更履歴も残っているし、変更箇所もすぐ分かる
- 設計のレビューは設計図のソースに対する行コメントを通じて行われる
- それでいて画像はブラウザ上で簡単に閲覧できる

というわけで作ってみました → [mermaid-for-github-chrome-extention](https://github.com/set0gut1/mermaid-for-github-chrome-extention)
mermaid.jsのコードを元にブラウザ上で図を描画するChrome拡張です。
GitHubとGistに対応してます。

マークダウンに言語を"mermaid"としてコードブロックを書いて（グラフ定義は[公式デモ](https://mermaidjs.github.io/demos.html)より引用）

```markdown
# Johnの起床シーケンス

- JohnはAliceからの通信をtriggerに起床します
- Johnは起床後、Bobに通知を送ります

```mermaid
sequenceDiagram
    participant Alice
    participant Bob
    Alice->>John: Hello John, how are you?
    loop Healthcheck
        John->>John: Fight against hypochondria
    end
    Note right of John: Rational thoughts<br/>prevail...
    John-->>Alice: Great!
    John->>Bob: How about you?
    Bob-->>John: Jolly good!
\```
```

ブラウザで開くと、コードブロック部分が描画された図に置き換わります。

![sequenceDiagram](https://qiita-image-store.s3.amazonaws.com/0/235355/9b9fe611-4d40-b4c1-bb03-0a0e8315596e.png)

つまり設計書と設計図をマークダウンで書いてプルリクエストを発行し、
それに対して行レビューをもらうという方式が可能になります。
変更履歴の管理は通常のソースコードと同様になります。

ハッピーシステムデザイン！！

-------

mermaid.js自体については次の記事が参考になります。

- [mermaid.jsが素晴らしいけどなかなか使ってる人見かけないので実例晒す](https://qiita.com/uzuki_aoba/items/a01f8b0b52ced69c8092)
- [簡単にガントチャートとかクラス図とか書けるやつ](https://qiita.com/rana_kualu/items/da394fd33ce019bf0ba7)
Javaで文字列に絵文字が含まれているか判定する

# いかにして絵文字を判定するか
絵文字，環境によって表示できなかったりして嫌ですよね💩
一旦文字コードを`EUC_JP`に変換して元に戻し，元の文字列と比較することで判定が可能です👍🏻

# 実装
```  isIncludeEmoji.java
public static boolean isIncludeEmoji(String str){
	try{
		byte[] bytes = str.getBytes("EUC_JP"); //EUC_JPでバイト配列に変換
		String newStr = new String(bytes, "EUC_JP"); //文字列に再変換
		return(!str.equals(newStr)); 
	}catch(UnsupportedEncodingException e){
		e.printStackTrace();
	}
	return true;
}
```

```サンプル.java
System.out.println(isIncludeEmoji("ひよこちゃん🐣")); //true
System.out.println(isIncludeEmoji("虚無")); //false
```

間違っていたら教えて頂けると幸いです🙏🏼
複数のXcodeを共存させている端末でnode.jsをインストールしたときのメモ

# 概要
旧式のXcode（8.3.3）と最新版9.3.1(2018/5/19時点)を共に入れている環境で「node.js」をインストールしようとしたときに、「Xcodeをアップデートしなさい」と言われた。
今後も出会う機会がありそうなのでメモを残します。

## 「nodebrew」をインストール
[Macにnode.jsをインストールする手順。](https://qiita.com/akakuro43/items/600e7e4695588ab2958d)を参考に「nodebrew」をインストールしようとした。
※「nodebrew」は「node.js」のバージョン管理をするものだそうです。

```
$ brew install nodebrew
Updating Homebrew...
Error: Your Xcode (8.3.3) is too outdated.
Please update to Xcode 9.3 (or delete it).
Xcode can be updated from the App Store.
```

すると上記のエラーが出た。
## Xcodeの向き先を変更
Xcodeプロジェクトを開くときのデフォルト設定は最新版の9.3.1であることは確認できていたため、
「Homebrewと連携している（という表現で正しい？？）Xcodeの向き先が違うのだろう」と推測し、以下で明示的に変更することを試みた。

```
$ sudo xcode-select -switch /Applications/Xcode.app
```

無事変更に成功したところで
## 再度「nodebrew」のインストールに挑戦

```
$ brew install nodebrew
・
・
・
Summary
🍺  /usr/local/Cellar/nodebrew/1.0.0: 8 files, 38.4KB, built in 3 seconds

$ nodebrew -v
nodebrew 1.0.0
・
・
・
```

インストールに成功したようです！！

## 「node.js」の最新版をインストール

```
$ nodebrew install-binary latest

Fetching: https://nodejs.org/dist/v10.1.0/node-v10.1.0-darwin-x64.tar.gz
Warning: Failed to create the file 
Warning: /Users/XXXXXXXXX/.nodebrew/src/v10.1.0/node-v10.1.0-darwin-x64.tar.gz
Warning: : No such file or directory
                                                                           0.0%
curl: (23) Failed writing body (0 != 1058)
download failed: https://nodejs.org/dist/v10.1.0/node-v10.1.0-darwin-x64.tar.gz
$ 

```
※注:xxxxxはみなさんのホームディレクトリ名
しかし、「そんなディレクトリは無い」的なことを言われる
## 無いものは作る
ということで、下記のコマンドを実行（恐らくこのままコピペでいけると思います）

```
$ mkdir -p ~/.nodebrew/src
```

## 再度「node.js」のインストールに挑戦

```
$ nodebrew install-binary latest
Fetching: https://nodejs.org/dist/v10.1.0/node-v10.1.0-darwin-x64.tar.gz
######################################################################## 100.0%
Installed successfully
```
これでいけました！

## バージョンを確認

```
$ nodebrew list
v10.1.0
```

## 使うバージョンを宣言

```
$ nodebrew use v10.1.0
use v10.1.0

```

## 実行パスを通してバージョン確認
※注:xxxxxはUserのホームディレクトリ名に **書き換えること**

```
$ echo 'export PATH=$PATH:/Users/xxxxx/.nodebrew/current/bin' >> ~/.bashrc
$ node -v
-bash: node: command not found
```

バージョン確認でエラーが出てしまった。
調べてみたところ、「.bashrc」が読めていないのが原因では無いか？とのこと。

## 「.bash_profile」に指示してあげる
```
$ vim ~/.bash_profile
```

と打つ。
するとvimが立ち上がるので（見た目はターミナルのままだけどvimの画面になる）、
「i」を押してinsert mode（入力できるモード）にする
以下のソースをコピペする

```
if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi
```

「esc」を押して「:wq」で保存し、ターミナルに戻る


## 改めてバージョン確認をする
ターミナルを再起動して

```
$ node -v
v10.1.0

```


## 補足　（npmのバージョンも確認しておく）


```
$ npm -v
5.6.0

```

以上です。
MATLAB csvファイル読み込み方法

#MATLA読み込むファイル名の指定

メモします

##1. csvread



```MATLAB
% folderPathという変数にフォルダのパスを代入
folderPath = ['C:\Users\userx\Documents\MATLAB'];
% fileNameという変数にフォルダの下にあるcsvファイル名を代入
fileName =  [folderPath '\' 'csvFileName' '.csv'];
% csvread関数を用いてreadFileという変数にcsvファイルの中身を代入
readFile = csvread(fileName);
```
絶望的な状況をTypeScriptとTypeORMが助けてくれた話

# 経緯
2年ぶりにWindows機を引っ張り出してきたのだが、不覚にもログインパスワードを忘れてしまっている。ありうるパターンを30ぐらい試してみたが一向にログインできる気配がない。途方にくれていたところ、大昔に自分のPCのパスワードをLINEを使って友人に送っていたことを思い出した。しめた、と思いLINEを開いてみたところ、件の送信記録は見つからない。これは、iPhoneを5から7に変更するときにとっておいた`Line.sqlite`のバックアップに残っているハズだ！

ということで`Line.sqlite`からLINEのメッセージログをサルベージする運びとなった。

生でSQLを書くよりかは、コードにした方が柔軟性があるだろうと思い、最近ご無沙汰になっているTypeScriptでサルベージスクリプトを書くことにした。

# 利用ライブラリ
TypeORMというORマッパーを利用してsqliteを掘る。型があって便利。
> （意訳） 他のしょぼいライブラリと違ってActive RecordパターンとData Mapperパターンを両方利用可能。だから、しゅごいクオリティの高い、疎結合で、スケールしまくる、メンテも余裕でできちゃう、アプリケーションが書けてやばたにえん。

http://typeorm.io/#/

# データ構造
今回、全てのデータにアクセスする必要はないので、必要なところのみをエンティティに記述する。こんな感じ。`ZMESSAGE`とかが実際のテーブル名 / カラム名。よくあるリレーションを張る。

```ts
import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from "typeorm"
import { User } from "./user"

@Entity("ZMESSAGE")
export class Message {
  @PrimaryGeneratedColumn({ name: "Z_PK" })
    id!: number

  @ManyToOne(type => User)
  @JoinColumn({ name: "ZSENDER", referencedColumnName: "id" })
    sender?: User

  @Column({ name: "ZTEXT" })
    text?: string
}
```

```ts
import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from "typeorm"
import { Message } from "./message"

@Entity("ZUSER")
export class User {
  @PrimaryGeneratedColumn({ name: "Z_PK" })
    id!: number

  @Column({ name: "ZNAME" })
    name?: string

  @OneToMany(type => Message, message => message.sender)
    messages?: Message[]
}
```

# 処理
データ構造をうつしたエンティティを書いたらこんな感じで利用する。

```ts
import { ConnectionOptions, createConnection } from "typeorm"
import { root } from "./paths"
import { User } from "./entity/user"
import { Message } from "./entity/message"

const options: ConnectionOptions = {
  type: "sqlite",
  database: `${root}/data/line.sqlite`,
  entities: [ User, Message ],
  logging: true
}

async function main () {
  const connection = await createConnection(options)
  const messageRepository = connection.getRepository(Message)
  const allMessages = await messageRepository.find()
  // メッセージを検索する
  allMessages.forEach((message: Message) => {
    const text = message.text
    if (!text) {
      return
    }
    if (text.match(/ape/)) {
      console.log(text)
    }
  })
  // メッセージと送信者を紐付ける
  const messages = await messageRepository
    .createQueryBuilder("ZMESSAGE")
    .leftJoinAndSelect("ZMESSAGE.sender", "ZUSER")
    .where("ZMESSAGE.Z_PK=:id")
    .setParameter("id", 3)
    .getMany()
  console.log(messages[0].sender)
}

main().catch(console.error)
```

# おわり（＾ω＾ ）
無事パスワードをサルベージして、ログインすることができました。ついでに、この記事を書いてある間に、RAIDのリビルドも終わって最高マジ卍

### 今回のコード全体
https://github.com/kentrino/typeorm-sqlite-example

### 苦情はコチラ
https://twitter.com/_kentrino
[python]隠しファイルをリストから除く

os.listdir() を使うと、引数で指定した```path```内のファイル一覧を出力できます。しかし隠しファイル（.DS_store等）も一緒に表示されてしまいます。
この隠しファイルを除去したいときは以下のようにしています。

```python
from os import listdir
fltr_list = [filename for filename in listdir(path) if not filename.startswith('.')]
```
この```fltr_list```の中に隠しファイルを除いたリストが格納されます。
Prism入門 その1

## はじめに

ある程度大きなGUIを持つソフトウェアを開発する場合、
開発を容易にするために何らかのデザインパターンに基づいて開発することが多いです。

ソフトウェアを開発する際に使用するデザインパターンとしては
MVC (Model-View-Controller)やMVVM (Model-View-ViewModel)などがあります。

当然、OSやプログラミング言語固有の機能のみで、これらのデザインパターンを実現できます。

ただ、何らかのフレームワークを使用するほうがデザインパターンを楽に実現できます。

PrismはXamarinでMVVMを実現するためのフレームワークです。

### MVVMについて

MVVMはModel, View, ViewModelの3層で構築されます。

それぞれの項目を簡単に説明すると、

- Model

GUIの描画には関係ないデータの読み書き、編集、保持等を行う層

- View

GUIを描画する層
ViewModelを参照する

- ViewModel

ViewがGUIの描画をするために必要な情報を保持、生成する層
Modelを参照する

と役割が分かれてます。

参照は一方方向のみで、ModelはViewModelを見ないし、ViewModelはViewを見ません。

お互いの役割を分離することで保守性を高めやすくします。

Xamarinでは、ViewはXamlとその拡張、ViewModelはXamlにバインディングされるインスタンス、Modelはそれ以外になります。

勘違いされやすい点としてModelは描画をしないだけで、描画に関係する情報を持っても問題ないということがあります。
例えば、ユーザーが設定した文字の色を保存したり読み込んだりする機能はModelが持ちます。
これらの情報を伝達するのがViewModelです。
当然、設定が固定されている場合、Viewに色の情報があっても問題ありません。

また、デザインパターンを正しく用いて開発する方法は小規模な開発には向かないことが多いです。
全体のソースコードが冗長であり、設計に従う必要もあるので、直接Viewに機能を書いたほうが早いです。
ただ、当然、ViewにModelのコードを書くとテストの自動化がしにくかったり、規模が大きくなるとコードが複雑化しがちです。
そのような問題が発生する規模の開発でフレームワークの力が発揮されます。

それでは、Prismの機能について説明していきます。

## BindableBase

xamlでクラスをバインドするのに便利な機能が予め実装されたクラスです。
xamlでバインドする場合、INotifyPropertyChangedで定義されたメソッドを実装する必要があります。
Prismを使用しない場合、各個人が独自で使いやすく実装することが多いです。
ただ、それでは使用方法が統一されてなく、他の人に理解されにくいという問題があります。
そこで、BindableBaseを使うことで個人に依存しないバインドのためのクラスを実現できます。

SetPropertyがBindableBaseで実装されているメソッドです。
他にもありますが、それは他のサイトを参照するようお願いします。

```
using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;

namespace prismSample.ViewModels
{
    public class MainPageViewModel : BindableBase, INavigationAware
    {
        private string _title;
        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }

        public MainPageViewModel()
        {

        }
    }
}
```

## ViewModelLocator.AutowireViewModel

PrismにはViewとViewModelを結びつける機能があります。
それがViewModelLocator.AutowireViewModelです。
クラス名に従って自動的にViewとViewModelを結びつけます。
例えば、```Prj.Views.SampleWindow```と```Prj.ViewModels.SampleWindowViewModel```がある場合、この2つを結びつけます。
xamlで下記のように定義することで有効になります。

### xaml

```
<?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms" 
prism:ViewModelLocator.AutowireViewModel="True" 
x:Class="prismSample.Views.MainPage" Title="MainPage">
    <StackLayout HorizontalOptions="Center" VerticalOptions="Center">
        <Label Text="{Binding Title}" />
    </StackLayout>
</ContentPage>
```

実はPrism6.2からデフォルトがTrueになったので、```assembly=Prism.Forms" ```さえ記述すれば動くはずですが分かりやすくするために全て明示してます。

当然、下記のようにBindingContextにViewModelのインスタンスを代入することで同じことを実現できます。
ただ、自動的にViewとViewModelが結びつくようにすると、必ず一対一でViewとViewModelが存在することを明示できて
他の開発者が理解しやすくなります。

```
using Xamarin.Forms;

namespace prismSample.Views
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();

            BindingContext = new ViewModels.MainPageViewModel();
        }
    }
}
```

## 最後に

どんどん色んな機能を説明していきます。
初めてAWS Lambda+API Gatewayをやってみてハマったポイント 返却JSON形式、CORS設定

ランタイムはNode.js。

LambdaとAPI Gatewayだけのシンプルなファンクションを作ろうとした。
DynamoDBとかS3とか使わないしハマるポイントとかないでしょって思ったけどやっぱりハマったのでメモ。

# 返却JSON形式
`return`でobjectを返すとJSONにしてくれるのだが、

```javascript
const responseData = {
    data: {
        foo: "bar"
    }
}
return data
```

こんな感じで書くとうまくいかない。

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-integration-settings-integration-response.html

公式ドキュメントによると、

```javascript
const responseData = {
    statusCode: "...",            // a valid HTTP status code
    headers: { 
        custom-header: "..."      // any API-specific custom header
    },
    body: "...",                  // a JSON string.
    isBase64Encoded:  true|false  // for binary support
}
```

この形式で書く必要がある。

```javascript
const responseData = {
    statusCode: "200",
    body: "foobar"
}
```

実際は最低これだけあれば動く。

なお、bodyの中身をネストさせたい場合は`JSON.stringify`で囲ってやる必要がある。

```javascript
const responseData = {
    statusCode: "200",
    body: JSON.stringify({
        foo: "bar"
    })
}
```

# CORS設定
最初、ブラウザのAPI Gatewayコンソールで設定しようと必死こいたが無理だった(たぶんやりようはあるんだろうけど)。

https://qiita.com/maaz118/items/e20b64f088fbead07206

試行錯誤と検索の果てにこの記事にたどり着く。
素直に返却JSONの`headers`に`Access-Control-Allow-Origin`を書いたら意図通りに動かせた。

```javascript
{
    statusCode: "...",
    headers: { 
        "Access-Control-Allow-Origin" : "*"
    },
    body: "..."
}
```