OmniAICreator/Qiita-1.07M huggingface dataset:
プログラミングパラダイムとは？種類も紹介

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている@yuka_ponです。
プログラミングパラダイムを学ぼうと思い、[Programming Paradigms](http://cs.lmu.edu/~ray/notes/paradigms/) を参照しました。
ここから学んだことを整理したいと思います。
初めて学んだので、違う点や知っておくべきことがあればコメントしていただけると幸いです！

#プログラミングパラダイムとは
プログラミングパラダイムとは、プログラミングの考え方と記述方法の枠組みを規定するものです。
また、その考え方や記述方法にはいくつか種類があります。
それは、命令型言語(Imperative)、宣言型言語(Declarative)、構造化プログラミング(Structured)、手続き型言語(Procedural)、関数型言語(Functional)、オブジェクト指向言語(Object-Oriented)などです。
今回は、その中でもよく使われる言語を取り上げます。

##命令型言語
命令型言語(Imperative Programming)とは、命令（代入文）を繰り返し入力することで変数の値（「状態」）を変動させて計算をすることで、最も一般的なパラダイムとも言われています。
ここでの「計算」とは、**計算モデル**を指します。
**計算モデル**とは、コンピューターが行う計算を抽象的に考察した数学的枠組みのことです。
つまり、メモリからデータを読み取って演算を行い、結果をメモリに書き込むという動作をするという意味です。
そのため、演算の他にプログラムの解釈を変える**宣言文**やメモリへの書き込み、命令の順序を決める**制御文**といった命令をすることもできます。

##宣言的言語
宣言的言語(Declarative Programming)とは、プログラミング上での操作結果を示す処理を行う意味です。
命令型言語との違いは、結果を示す方法の処理を入力するかしないかに当たります。

##構造化プログラミング
構造化プログラミング(Structured Programming)とは、プログラムを機能や処理ごとにブロック別に分けて積み重ねた構造のことを指します。
そのため、処理を行うときはブロック単位を動作させて機能の追加や削除をするのです。
また、制御文を用いた命令型言語と一致するため、テキスト上の言語と機能的な言語は同じになるという特徴も持ちます。
そのため、とても見やすくさせるパラダイムとも言えます。
そして、**GOTO文**を排除させることもできます。
**GOTO文**とは、別のワープに移動させる機能を持っており主に[C++](https://www.sejuku.net/blog/27276)に利用されます。
しかし、GOTO文は制御を自由に変えられることから、入力内容を複雑にさせるときもあります。
この文を構造化プログラミングは排除できるということなのです。

##オブジェクト指向言語
オブジェクト指向言語(Object Oriented Programming、OOP)とは、プログラム上の計算対象をオブジェクト化（物体化）したもので、名前や属性（データ）、操作（メソッド）を自分自身で持ちます。
このとき、構造型プログラミングとの違いがわからないときが多々あります。
2つの違いは、構造型プログラミングは別々の型を作成するに対して、オブジェクト指向言語は**クラス**を作ってその中に**メソッド**などを構築します。
つまり、オブジェクト指向言語には**カプセル化**という重要な働きを発揮するのです。
**カプセル化**とは、関連するデータの集合体を操作する意味で、外部からの干渉から防止する役割を持っています。

構造化プログラミングとオブジェクト指向言語の違いについて詳しく知りたい方は[コチラ](https://qiita.com/shirogin/items/378919de18dcb5a26e32)。

##関数型言語
関数型言語(Functional Programming)とは、変数に値を代入するのではなく値を関数として処理するものです。
つまり、関数を組み合わせて表現する手法を指します。
しかし、同じ関数を用いても式に入力した内容を変えることで、異なった答えを導くことがあります。
これは、物体すなわち「答え」を予め指定するオブジェクト指向言語と大きく違う点です。
関数型言語はこのような「副作用」をなくすように処理します。

関数型言語について詳しく知りたい方は[コチラ](https://qiita.com/stkdev/items/5c021d4e5d54d56b927c)。

##論理型言語
論理型言語(Logic and Constraint Programming)とは、論理式を組み合わせて結論や答えを導くものです。
プログラム上で表現するために、事実や規則を使って「質問」を作成し、その「答え」を得るために論理推論を用いて計算する流れとなっています。
この流れに**Prolog**を利用するときが多いです。
**Prolog**とは、関数ではなく**関係**をベースに**述語**を使った記入方法です。
その**述語**は、事実と規則（プログラム）、質問、その解答という流れで記入します。
このように、自ら仮説を立てて結論を導くというイメージを持つと良いです。

#まとめ
このように、プログラミングパラダイムにはさまざまな種類があります。
しかし、100％同じパラダイムで実装できるわけではありません。
大半は関数型言語を用いても、必要に応じて別のパラダイムを使用するときもあります。
パラダイムは、使用別を意識する必要はあるみたいです。
Visual Studio Code (Windows版) でAngular+Bootstrap（その１．インストール編）

## はじめに
Angular + Bootstrap のサンプルプログラムをVisual Studio Codeで作ってみよう。
まずは、環境構築。

## 開発環境
Windows 10 Pro 1709(16299.192)
Visual Studio Code (Windows版) 1.31.1
Node.js 10.15.1
JSON Server 0.14.2
Angular CLI 7.3.1
Bootstrap 4.2.1

## 手順
１．Visual Studio Code (Windows版) のインストール
２．Node.jsのインストール
３．JSON Serverのインストール
４．Angular CLIのインストール


## １．Visual Studio Code (Windows版) のインストール
### URL

```
https://code.visualstudio.com/
```

#### 1. 「Download for Windows」クリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/71b89c85-1043-8462-8c27-130b17c76193.png)

#### 2. ダウンロードファイル「VSCodeUserSetup-x64-1.31.1.exe」クリック
ウィーザードの手順通り進める。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/50fe12ed-14d2-bc0a-448e-5a6be5faca05.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/d361b1d2-1603-008c-1d59-01a4f38d84e9.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/65c2f7c9-10b9-4bd3-cb05-a4dbbdea19b7.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/d404c704-4e2e-f549-fd4b-75a3dbeaeea7.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/522f8ba0-e753-3610-14f9-fa3f4546d42c.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/858108b7-4896-7cb0-16f5-9a9f76e8f8ad.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/245ba9ad-7b01-d5ba-f0d6-7b66d95c09ee.png)

## ２．Node.jsのインストール
### URL

```
https://code.visualstudio.com/
```
#### 1. ダウンロードバージョン「10.15.1 LTS」クリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/931b57c5-470a-31f6-4195-27ea92dccb0c.png)

#### 2. ダウンロードファイル「node-v10.15.1-x64.msi」クリック
ウィーザードの手順通り進める。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/163fd58d-d9fc-88dd-6da6-efb404074311.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/ab831c04-49f4-467d-2710-b3d78fa94985.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/c3ad7ce6-4823-1017-c20e-947fd5dbc0dc.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/722dbdad-d5fa-9886-2d38-c9bc05b28040.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/8bdc975c-8894-027a-8f7e-653ee8bdba65.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/62d119c4-4940-a519-ed7b-70d04e0d1a3d.png)

## ３．JSON Serverのインストール
### Terminalを開く

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/6f80f7b3-4a74-dec6-46aa-d3c382fde9f4.png)

### コマンド

```
npm install -g json-server
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/a99328fe-2c12-9421-d9f3-83abd7290f7c.png)

## ４．Angular CLI のインストール

### コマンド

```
npm install -g @angular/cli
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/9a306999-7efe-6e03-c79e-35a1f18e768f.png)
digdag server で UnknownHostException が発生したとき

# digdag の configファイル設定

```
$ vim /opt/digdag/digdag.conf
database.type = postgresql
database.user = digdag
database.password = <password>
database.host = <localhostとかRDSとか>_
database.port = 5432
database.database = digdag
```

host の末尾に `空白スペース(上記はアンスコ)` が入っていると `digdag server` コマンドを実行すると以下のエラーが発生する。

```
1) Error in custom provider, com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: Failed to initialize pool: The connection attempt failed.
  while locating io.digdag.core.database.DataSourceProvider
  at io.digdag.core.database.DatabaseModule.configure(DatabaseModule.java:23) (via modules: com.google.inject.util.Modules$OverrideModule -> io.digdag.core.database.DatabaseModule)

(略)

Caused by: com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: Failed to initialize pool: The connection attempt failed.
	at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:516)

(略)

Caused by: org.postgresql.util.PSQLException: The connection attempt failed.
	at org.postgresql.Driver$ConnectThread.getResult(Driver.java:358)

(略)

Caused by: java.net.UnknownHostException: <RDSのパラメータ>.ap-northeast-1.rds.amazonaws.com
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)

(略)
```

ホスト名は合っているのにエラーでコケてしまう。

`java.net.UnknownHostException: <RDSのパラメータ>.ap-northeast-1.rds.amazonaws.com` 

スペースが強調されないエディタだと、意外と気づけないですね。
BootStrap用のアイコン FontAwesomeの使い方

FontAwesomeの使い方をメモする

FontAwesomeを使うにはhtml上にFontAwesomeのリンクを貼り付ければ良い
下のリンクに記載方法があるので参照
https://centosinstall.com/design/bootstrap/icons

FontAwesomeのサイズ変更などはこちらが詳しく書いてある
https://saruwakakun.com/html-css/basic/font-awesome#san2

実際に使う時はこのチートシートを用いて使う
https://fontawesome.bootstrapcheatsheets.com/#
Swift MkMapViewで地図アプリ作成してみた（03）- 現在位置を地図の中心にする

#記事一覧
[Swift MkMapViewで地図アプリ作成してみた（記事一覧）](https://qiita.com/rain_00_00_09/items/3151b3faf2303fe78312)

#Viewのload時に地図を初期化する
1. 地図の初期化関数を作成する

    ```swift:地図の初期化関数
        func initMap() {
            // 縮尺を設定
            var region:MKCoordinateRegion = mapView.region
            region.span.latitudeDelta = 0.02
            region.span.longitudeDelta = 0.02
            mapView.setRegion(region,animated:true)
            
            // 現在位置表示の有効化
            mapView.showsUserLocation = true
            // 現在位置設定（デバイスの動きとしてこの時の一回だけ中心位置が現在位置で更新される）
            mapView.userTrackingMode = .follow
        }
    ```

    |設定値             |振る舞い　|
    |:--               |:-- |
    |.follow           |現在位置のみ更新する |
    |.followWithHeading|現在位置と方向（ヘディングアップ）を更新する |
    |.none             |更新しない |

2. Viewのload時に地図の初期化関数をCallする

    ```swift:Viewのload時に地図の初期化関すをCallする
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
            
            
            // 地図の初期化
            initMap()
        }
    ```

#現在位置が更新される度に地図の中心位置を変更する

1. 地図の中心位置の変更関数を作成する

    ```swift:地図の中心位置の更新関数
        func updateCurrentPos(_ coordinate:CLLocationCoordinate2D) {
            var region:MKCoordinateRegion = mapView.region
            region.center = coordinate
            mapView.setRegion(region,animated:true)
        }
    ```

2. 現在位置の更新時に地図の中心位置の変更関数をCallする

    ```swift:現在位置の更新時に地図の中心位置の変更関数をCallする
        // CLLocationManagerのdelegate：現在位置取得
        func locationManager(_ manager: CLLocationManager, didUpdateLocations locations:[CLLocation]) {
            updateCurrentPos((locations.last?.coordinate)!)
        }
    ```

3. ▶︎を押してPCシミュレータを起動する。
    <img width="335" alt="Device.png" src="https://qiita-image-store.s3.amazonaws.com/0/362635/f0335d60-5b09-57e6-71e5-a7b581bbae0e.png">


#補足

 - 以下の様にした方が現在位置更新がカクカクせずにスムーズになる。

    ```swift:補足
        // CLLocationManagerのdelegate：現在位置取得
        func locationManager(_ manager: CLLocationManager, didUpdateLocations locations:[CLLocation]) {
            // updateCurrentPos((locations.last?.coordinate)!)
            mapView.userTrackingMode = .follow
        }
    ```

#記事一覧
[Swift MkMapViewで地図アプリ作成してみた（記事一覧）](https://qiita.com/rain_00_00_09/items/3151b3faf2303fe78312)
OpenSSH形式の秘密鍵をPutty形式の秘密鍵に変換する

タイトルの通り、秘密鍵をOpenSSH → Puttyに変換します。

# 実行環境
Ubuntu

```
sudo apt install putty
```

Linuxの場合は各ディストリビューションがputtyをパッケージ化しています。

WindowsだとGUIで変換できるようなソフトウェアがあるようです。

# 実行

```
puttygen key_rsa.pem -O private -o key_rsa.ppk
```

PuttyからOpenSSHへ変換したい場合は、

```
puttygen key_rsa.ppk -O private -o key_rsa.pem
```

とするだけです。
Microsoft Partner Network 登録した後に購入できるアクションパック（約4万円）特典

Microsoft Partner Network に登録して、アクションパック、というものを数万円かけて購入すると、Office や、さまざまなMicrosoft製品が（開発目的？）であれば、１０分の１くらいの値段で使える、という噂を聞いたので、調べてみたいと思います。

まずはやり方はこの[マイクロソフトパートナーネットワークを知らない人って意外といるよねってことで](https://memobog.azurewebsites.net/2017/02/21/%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%BD%E3%83%95%E3%83%88%E3%83%91%E3%83%BC%E3%83%88%E3%83%8A%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%92%E7%9F%A5%E3%82%89%E3%81%AA/)　をチェック

> アクションパック
> 多分、コンピテンシーを取得できない、もしくは、そこまで必要ない企業向けのプランなんじゃないかなって思います。
> 
> \42,000円 で、約 360 万円分のバリューが買えるみたいです。
>  https://partner.microsoft.com/ja-jp/membership/action-pack

おお、なんだかすごいですね。上記をそのまま受け取ると、１０分の１どころか、86分の1ということになってしまいます。


ただ、このサイトを見ると、Action Pack を購入すると、次のような内容を提供する、信頼性の高いソフトウェア セットを活用できます。としか書いてなくて、肝心の中身がよくわかりません。サイトのやる気のなさを感じます。。

1. 顧客のニーズに自信を持って対応できる、専用サポート
2. すぐに使えるキャンペーンとガイダンスを提供するマーケティング リソース
3. 包括的なインサイトとビジネス プランニング ツール
4. クラウドに重点を置いたトレーニング


どうやら[このドキュメント](https://docs.microsoft.com/ja-jp/partner-center/manage-your-partner-network-benefits)をみてみると、この Action Pack というものは、Visual Studio Subscription相当の特典が自動的に付与されるようです。


[ダウンロードできるソフトウェアはどうすればわかりますか。](https://docs.microsoft.com/ja-jp/visualstudio/subscriptions/software-download-list)というページもあるのですが、いまいちはっきりと、中身が書いてあるわけでもなさそうな感じがします。。。

あまりにもお得な、Action Packが世の中に広まりすぎてしまうと、パートナー以外でも、この経路でソフトウェアライセンスをたくさん購入してしまい本来のお客さんがソフトウェアを買ってくれなくなってます。

ですので、もしかしたら、Microsoft はこのアクションパックをあまり広める気はないのかもしれません。

ただ、「お得　マイクロソフト アクションパック　一覧」といったキーワードで検索すると、たくさんの参考になるブログが出てきます。これらをみるとやはり購入した方がお得なのは間違いないようです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/60530/d31ea6d0-398a-c077-81cf-7122c76bdae3.png)

https://panda-assist.nagoya/%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F/%E8%B6%85%E3%81%8A%E5%BE%97%E3%80%80%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%BD%E3%83%95%E3%83%88-%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%91%E3%83%83%E3%82%AF/



![image.png](https://qiita-image-store.s3.amazonaws.com/0/60530/0843ed45-797a-216f-c709-57525c95a43b.png)
https://nonogiken.com/archives/99　


何を使うのか、特典のどこに魅力を感じるかというのは人それぞれなのですが、例えば、ソフトウェアがたくさん無料でつかえるだけでなく、Microsoft Azureが1年分、毎月無料で使える（Microsoft Azure月額11,500円）ので、約4万円以上の価値はありますね。




> 
> さらにさらに
> パートナー ニュースレター　の購読
> パートナー マーケティング センター　からの資料ダウンロード
> 製品サポート　10 インシデント
> 社内使用ライセンスのクラウド サービスとオンプレミス ソフトウェア　製品あたり 10 ライセンスまで
> Partner University　によりトレーニングの受講
> Microsoft Office 365 のデモ テナント
> Visual Studio Professional を 3 サブスクリプション
> mstep クラスルーム
> mstep オンライン のトレーニング受講も出来ます

具体的な特典のボリュームを一言で言うのは難しいのですが、
Visual Studio Professional ３サブスクリプション 、というところから推測するに、Azureは、1万円分を３本、これが1年分使えます。
Officeソフトも何をダウンロードするかはありますが、数本使えるようです。
複数のAppleIDの2ファクタ認証を１台のiOS端末+Macで行う方法

#開発用AppleIDの2ファクタ認証が必須に
2019年2月27日から、Appleの開発者アカウント（オーナーアカウント）に、２ファクタ認証が必須となります。
1つのMacと１つのiOSデバイスで、しかも開発者アカウントのAppleIDが普段のIDと同じ場合は何も問題はありませんが、普通は開発用のアカウントは普段使いのIDとは別のAppleIDになっていることでしょう。
対策として、Macで複数アカウントを作成してそれぞれ別のAppleIDでiCloudにログイン、ログインの度にそのアカウントに切り替えて認証しても良いのですが、Macが１台しかない場合に面倒だし多分無理かと思います？（認証中にログアウトして承認し、戻るとログイン画面はもう無い）
それに、Macではなく、できれば手持ちのiPhoneで２ファクタ認証したいところです。

#具体的な方法
ネットを漁って見つけたいくつのヒントを元に以下の方法で実現することができました。

###1.Macに新しいアカウントを追加

いつものMacのアカウントから、「システム環境設定」の「ユーザとグループ」で新しいMacのアカウントを追加します。
あとで消すので名前など何でも良いです。

###2.新しいアカウントでログイン

作成したアカウントでMacにログインします。
この時、iCloudのアカウントとして、２ファクタ認証に切り替えたい開発者アカウントを使用します。

###3.２ファクタ認証を有効へ

「システム環境設定」の「iCloud」から「２ファクタ認証の有効化」を選択します。
クレジットカード番号や、電話番号など必要に応じて適宜追加します。
電話番号宛にCMSが届くのでパスコードを入力します。

###3-2.別のデバイスでMacを承認してくださいというダイアログが出た場合

承認するデバイスがあれば良いのですがない場合、
「このiPhoneを承認できませんか？このiPhoneを別のデバイスから承認できない場合は、エンドツーエンドの暗号化データをリセットしてiCloudの設定を完了することができます。」
で、暗号化されたデータのリセットを行います。
（これで支障があるのか不明ですがやらないと進まないので・・・）

この時点で、このAppleIDの2ファクタ認証は有効になりますが、
そのまま、iPhoneの操作に移ります。

###4.iPhoneにアカウント追加

iPhoneの設定の「パスワードとアカウント」でiCloudとしてAppleIDを追加します。
2ファクタ認証が要求されるので、Macに表示された6桁の番号を入力します。
メール、連絡先、カレンダー、リマインダーのスイッチは全部OFFで良いです。

###5.MacのAppleIDをサインアウトしておく

**これが重要です。**
**MacのiCloud設定のAppleIDはサインアウトしてください。**

###6.Macのアカウントを削除

必須ではないですが、一時的に作成したMacのアカウントを削除しておきます。
更にアカウントを追加したい場合は、Macで別のIDでiCloudにサインインし、3-5の手順を行います。

#最後に
iPhoneの設定の「パスワードとアカウント」に追加したり、MacのiCloud設定にも追加すればよい
という話は見つけていたのですが、実際、アカウントをいちいち切り替えたりする必要もあったので
面倒だなと思っていましたが、2ファクタ有効後にMac側でiCloudをサインアウトすることで、
アカウント追加したiPhoneに承認コードが届くようになるというのは盲点でした。

もっと簡単にできる方法があっても良さそうですので、そのうち改善されるとは思いますが、
現状でできる方法ということで投稿させていただきました。
間違いや勘違いなどあればお知らせください！
AWS Batchを使ってみた感想

バッチで大量のデータを並列処理するのにどうかと思ってAWS Batchを試してみた。

# 感想

- けっこう使いやすい
    - ジョブを投入すると勝手にEC2インスタンスを立ち上げてくれる
    - ジョブが終わったら勝手にインスタンスを落としてくれる
    - 普段はインスタンス0台にしておくこともできる
    - Dockerイメージを更新したときもpushだけしておけば、それ以降開始されるジョブは新しいイメージを使ってくれる
    - マネジメントコンソールがまあまあ使いやすい
        - とは言うものの、改善の余地はまだまだある
            - 使われているコンピューティングリソースのモニタリング画面がない
            - インスタンスやコンテナが立ち上がらないときにエラーメッセージを表示してほしい
            - 配列ジョブのstatusが変？子ジョブはrunning等になっているのにpendingのまま
- 他のAWSサービスと比べると
    - バッチ処理ならECSを直に使うより良さそう
        - ECSでも一度セットアップしてしまえば運用の手間はそう変わらなそうだが、セットアップする手間が違う
    - しかしFargateを既に使っている人で、Fargateで済む仕事なら、あえてBatchを学ぶ必要もないと思う
    - DataPipelineよりはいいと思う（超大量データなどの場合は違うのかもしれないが…）
        - 参考 https://blog.albert2005.co.jp/2016/12/26/aws-data-pipeline-%E3%81%AE-%E7%A8%80%E3%81%AB%E3%82%88%E3%81%8F%E3%81%82%E3%82%8Bqa/)
    - [ここ](https://www.reddit.com/r/aws/comments/9syduu/how_does_aws_ecs_differ_from_aws_batch/)でAWSの社員が「ECSとBatchの違い」について答えている。場合によってはBatchはオーバーキルでFargateの方がいいとも
- 学習コストはそれほど高くない（DockerやEC2を使い慣れていれば）
- しかし制限が色々ある
    - 1キューのジョブ100万個
    - ジョブに渡せるパラメータサイズがけっこう小さい
    - 配列ジョブは1万個
    - SDKで一度に大量のジョブをsubmitしたら`Too Many Requests`になった
    - 立ち上がるインスタンスのタイプが高い。[t2シリーズを立ち上げるにはアンマネージドにする必要がある](https://qiita.com/iwase10moya/items/50971c12b5b5d01d8be5)。これではECSと比べて利点が減ってしまう…
- 配列ジョブは事前に何個のコンテナで並列実行するか決まっている場合に使えると思う
- **例えば100万件のデータがあるとき、100万個のジョブを作るのではなく、配列で100個のジョブ（コンテナ）を作っておいて、n番目のコンテナには`n mod 100`件目を処理させる**のが良いと思う
  - 一度開始したあとで並列度を上げたいというのは難しい
    - それをしたい場合はSQSに100万個のメッセージを入れて、コンテナにポーリングさせる。そうすればあとからジョブを増やすだけで並列度があがる。
        - ただしSQSの標準キューはメッセージの保持期限が最長14日なので、14日以内にバッチが終わらなければならない（それかメッセージをゆっくり投入しつづけるか）
padrinoでgmailにメール送信

padrinoでメールを送信する方法をざっくりメモ

#前提条件
・googleアカウントでアプリパスワードを発行していること
・action_mailerを導入済み

#コード例
```mail.rb
require 'action_mailer'

ActionMailer::Base.prepend_view_path File.expand_path('./app/views/mailers')
ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
  address: 'smtp.gmail.com',
  domain: 'gmail.com',
  port: 587,
  user_name: 'your_gmail_account',
  password: 'google_app_password',
  authentication: 'plain',
  enable_starttls_auto: true
}

class SampleMailer < ActionMailer::Base
  def template_example(inquiry)
    @inquiry = inquiry
    mail(
      to: 'hogehoge@gmail.com',
      from: 'test@example.net',
      subject: 'test', &:text
    )
  end
end
```

#説明

独自に設定が必要な箇所のみ説明


```mail.rb
ActionMailer::Base.prepend_view_path File.expand_path('./app/views/mailers')
```
メールテンプレートが配置されているディレクトリのパスを設定。
設定したディレクトリに存在するクラス名に応じたディレクトリから
メソッド名に応じたviewファイルを探し出す。

上のコードでは
`./app/views/mailers`
の配下に

```mail.rb
class SampleMailer < ActionMailer::Base
  def template_example(inquiry)
```

クラス名に対応したディレクトリ
`sample_mailer`を作成し

`sample_mailer`配下に
`template_example.text.erb`を作成する

````mail.rb
ActionMailer::Base.smtp_settings = 
```
`user_name`にgoogleアカウント名
`password`に発行したアプリパスワード
他はコピペでOK

```mail.rb
class SampleMailer < ActionMailer::Base
  def template_example(inquiry)
    @inquiry = inquiry
    mail(
      to: 'hogehoge@example.jp',
      from: 'test@example.net',
      subject: 'test', &:text
    )
  end
end
```
あとは`to:`に自分のメールアドレスを設定してやって
適当な箇所でインスタンス変数を渡してメソッドを使ってやれば
メールが送信されるはず。
Python + OpenCVでの画像サイズ取得方法


読み込んだ画像のサイズを取得する方法

```ruby:test.py
import sys,cv2

# 対象画像読み込み
img = cv2.imread("testImg.png",cv2.IMREAD_COLOR)

# 画像の大きさを取得
height, width, channels = img.shape[:3]
print("width: " + str(width))
print("height: " + str(height))
```

上記を実行すると、以下のように画像の幅と高さが出力される

```
width: 240
height: 240
```
99 PSiE [Problem 12]

# はじめに
[Ninety-nine Problems, Solved in Elm](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/) を毎日ふれることで､Elm に親しもうという『日記』です｡詳細は [99 PSiE [Problem 1]](https://qiita.com/seahal/items/36f176d68991231ee80a) をご覧ください｡

# 問題
Decompress the run-length encoded list generated in Problem 11.
(引用元：[Problem 12](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/p/p12.html))

# 成果物
```elm
import Html

type  RleCode a = Run Int a | Single a

-- my solution
rleDecode_ listOfRleCode = List.map fromRleCode listOfRleCode |> List.concat

fromRleCode rleCode =
    case rleCode of
        Run num b -> List.repeat num b
        Single b -> [b]

-- main = Html.text
--        <| Debug.toString
--        <| rleDecode
--        <| [Run 4 1, Single 2, Run 2 5, Single 2, Single 1]

-- Their solution
rleDecode listOfRleCode = List.concatMap fromRleCode listOfRleCode

-- answer check
main : Html.Html a
main =
    Html.text
        <| case test of
            0 ->
                "Your implementation passed all tests."
            1 ->
                "Your implementation failed one test."
            x ->
                "Your implementation failed " ++ Debug.toString x ++ " tests."


test : Int
test =
    List.length
        <| List.filter ((==) False)
            [ rleDecode [ Run 4 1, Single 2, Run 2 5, Single 2, Single 1 ]
                == [ 1, 1, 1, 1, 2, 5, 5, 2, 1 ]
            , rleDecode [ Run 4 1, Single 2, Run 2 5, Single 2, Single 1 ]
                == [ 1, 1, 1, 1, 2, 5, 5, 2, 1 ]
            , rleDecode [ Run 4 "1", Single "b", Run 2 "5", Single "2", Single "a" ]
                == [ "1", "1", "1", "1", "b", "5", "5", "2", "a" ]
            ]
```

# 正答例
=> [Problem 12 Solutions](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/s/s12.html) 

# コメント
へぇ～､List.concatMap ってこんな感じで使うのかー｡
【サーブレット】リスナーとフィルタ

<h1>リスナー</h1>

<h1>フィルタ</h1>
共通処理をまとめることができる
1つのサーブレットクラスに複数のフィルタを設定することが可能（これを**フィルタチェーン**と呼ぶ）

使用例）
・ログインしていることが前提のサーブレットクラスの場合、ログイン状態のチェックを行うフィルタを作成し、各サーブレットに設定することで、各サーブレットにログインチェックを行う処理を記述しなくて済む。
Gitのローカルブランチを削除して良い感じに整理したい

一括でローカルブランチを削除したいときに便利


## masterとdevelop以外を削除

```
git branch --merged | grep -vE '^\*|master$|develop$' | xargs -I % git branch -d %
```

## 特定の文字列を含むブランチを削除
```
git branch | grep <文字列> | xargs git branch -d
```
Python + OpenCVによるマスク画像の動的生成方法

マスク画像の生成を動的に生成する方法

下記では、100×100ピクセル画像に対し四角形のマスク範囲を描画している

```ruby:test.py
import cv2

# マスク用単一色画像を作成
height = 100 # 生成画像の高さ
width = 100 # 生成画像の幅
imgMask = np.full((height, width, 1), 1, dtype=np.uint8)

# マスク範囲を四角形で描画
boxFromX = 20 #マスク範囲開始位置 X座標
boxFromY = 40 #マスク範囲開始位置 Y座標
boxToX = 80 #マスク範囲終了位置 X座標
boxToY = 60 #マスク範囲終了位置 Y座標
cv2.rectangle(imgMask, (boxFromX, boxFromY), (boxToX, boxToY),(255), cv2.FILLED)

# マスク結果画像を保存
cv2.imwrite("testMaskImg.png", imgMask)
```

上記で生成されたマスク画像
![testMaskImg.png](https://qiita-image-store.s3.amazonaws.com/0/172093/a328f16f-119c-1183-ab97-b6585005364d.png)
Elixir~Enum総ざらい2回目~

#ここまでのあらまし

[Elixir~Enumまつり1回目~Enum.chunk_every、Enum.all?、Enum.any?、Enum.at~](https://qiita.com/kmizuno0211/items/718d3b13e4e7a7452529)
からはじめたように、[Elixir公式ドキュメント](https://hexdocs.pm/elixir/Enum.html#chunk_by/2) のEnumを総ざらいして、理解を深めていくことにします。
"Elixirでシンセサイザーをつくる"というわたしの中長期的目標のため、音楽的なメタファーが思いつくものは解説に付与します。
法則性がわからない関数に関してはその旨を記載します。
おおむね一週間弱ですべてのEnum関数を洗うのが目標です。

#Enum.at

```elixir
Enum.at([2, 4, 6], 0)
2

 Enum.at([2, 4, 6], 2)
6

Enum.at([2, 4, 6], 4)
nil
```

どうやらこれは、ゼロを起点にして（not1)、リストのn番目の値を返してくれる関数のようです。

#Enum.chunk_every

```elixir
Enum.chunk_every([1, 2, 3, 4, 5, 6], 2)
[[1, 2], [3, 4], [5, 6]]

 Enum.chunk_every([1, 2, 3, 4, 5, 6], 3, 2, :discard)
[[1, 2, 3], [3, 4, 5]]

 Enum.chunk_every([1, 2, 3, 4, 5, 6], 3, 2, [7])
[[1, 2, 3], [3, 4, 5], [5, 6, 7]]

Enum.chunk_every([1, 2, 3, 4], 3, 3, [])
[[1, 2, 3], [4]]

 Enum.chunk_every([1, 2, 3, 4], 10)
[[1, 2, 3, 4]]

Enum.chunk_every([1, 2, 3, 4, 5], 2, 3, [])
[[1, 2], [4, 5]]
```

一番上に関しては、リスト内の数字を2つごとに分けて出力しているように思います。
その下になっていくと法則性が徐々に分からなくなっていきます。

#Enum.chunk_while

```elixir
chunk_fun = fn item, acc ->
...>   if rem(item, 2) == 0 do
...>     {:cont, Enum.reverse([item | acc]), []}
...>   else
...>     {:cont, [item | acc]}
...>   end
...> end
iex> after_fun = fn
...>   [] -> {:cont, []}
...>   acc -> {:cont, Enum.reverse(acc), []}
...> end
iex> Enum.chunk_while(1..10, [], chunk_fun, after_fun)
[[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
```

全く分かりません。飛ばします。

#Enum.concat

```elixir

Enum.concat([1..3,4..6,7..9])
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Enum.concat([[1, [2], 3], [4], [5, 6]])   
[1, [2], 3, 4, 5, 6]
Enum.concat([[1, [2], 3],[ [4], [5, 6]]])
[1, [2], 3, [4], [5, 6]]
Enum.concat(1..3, 4..6)
[1, 2, 3, 4, 5, 6]
 Enum.concat([1, 2, 3], [4, 5, 6])
[1, 2, 3, 4, 5, 6]
```

リストのなかの数字を連番で出力、特別ひとつだけ[]で囲ってある要素だけ[]で囲って出力しているように思います。

#Enum.count

```Elixir
Enum.count([1, 2, 3])
3
```

これは簡単なようです。リストの中にある要素の数をあわせて出力しているようです。

```elixir
Enum.count([1, 2, 3, 4, 5], fn x -> rem(x, 2) == 0 end)
2
```
これは割ったらあまりがゼロになる要素の数として2を返しているようです。
（最初わからなかった...)

#Enum.dedup

```elixir
Enum.dedup([1, 2, 3, 3, 2, 1])
[1, 2, 3, 2, 1]

Enum.dedup([1, 1, 2, 2.0, :three, :three])
[1, 2, 2.0, :three]
```

リストの要素のなかで、重複するものを削って出力しているようです。

#dedup_by

```elixir
Enum.dedup_by([{1, :a}, {2, :b}, {2, :c}, {1, :a}], fn {x, _} -> x end)
[{1, :a}, {2, :b}, {1, :a}]

iex> Enum.dedup_by([5, 1, 2, 3, 2, 1], fn x -> x > 2 end)
[5, 1, 3, 2]
```

これもわかるようで法則性がわかりません...。


#ここまで

きょうはここまで！
いままで派手で注目に値する関数ばかり記事にしていたので、なかなか音楽的なメタファー（これは先生からの指令です)を入れ込むことが難しいですね、、
うまずたゆまず、頑張ります。
Kento Mizuno
【サーブレット】基本メソッド

<h1>doGet() メソッド</h1>
GETリクエスト時に実行される処理を記述する

<h1>doPost() メソッド</h1>
POSTリクエスト時に実行される処理を記述する

<h1>init() メソッド</h1>
サーブレットのインスタンス生成された直後（サーブレットに対する初回リクエスト時）に実行される処理を記述する

使用例）
・サーブレットで使用するクラスの初期化処理

<h1>destroy() メソッド</h1>
アプリケーションの終了時（アプリケーションサーバが停止するタイミング）で実行される処理を記述する
VS Code で Apex コードをオートフォーマットする方法

VS Code をしばらく使ってみて気づいたのですが、 実は Apex ファイルに対応したフォーマッターが無いらしいです。
<img width="431" alt="Screen Shot 2019-02-17 at 13.32.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/26378/5acb61e7-4508-461c-5947-296bcb3fd26a.png">
そこで、 Uncrustify という CLI と VS Code の Extension を使って、 Java ファイルとしてフォーマットさせる方法を試してみました。

##uncrustify をインストール
まずは、[Uncrustify](https://github.com/uncrustify/uncrustify) を `Homebrew` でインストールします。

```bash
$ brew install uncrustify
$ uncrustify -v
=> Uncrustify-0.68_f
```

続いて、VS Code に [vscode-uncrustify](https://github.com/LaurentTreguier/vscode-uncrustify) Extension をインストールします。
<img width="1182" alt="Screen_Shot_2019-02-17_at_13_45_40.png" src="https://qiita-image-store.s3.amazonaws.com/0/26378/e993f755-7986-dee2-359d-0319f92395d3.png">


VS Code を `Command + Shift + p > Reload Window` でリロードしておきます。

##uncrustify の設定
VS Code のコマンドで `uncrustify.cfg` を作成します。
`Command + Shift + p > Uncrustify: create default config file`

VS code のエクスプローラから uncrustify.cfg を開き以下を修正
<img width="1064" alt="Screen_Shot_2019-02-17_at_13_53_21.png" src="https://qiita-image-store.s3.amazonaws.com/0/26378/861e4e2e-5b62-ac31-6df6-6235d23edd4f.png">
その他の項目も以下の要領でお好みで編集しておきます。

| 項目             |値  |説明                    |
|-----------------|----|-----------------------|
| indent_with_tabs|0   |ハードスペース化           | 
| indent_columns  |4   |4 スペースでインデント      | 
| indent_class    |true|class 内のインデントを有効化| 


## VS Code の設定
`Command + ,` で設定を開き、 JSON エディタに切り替えてから以下を追加

```JSON
"uncrustify.langOverrides": {
    "apex": "JAVA",
    "apex-anon": "JAVA"
}
```

最後に `Command + Shift + p > Reload Window` で再度リロードすれば Apex ファイルでもフォーマッター使える様になります。


## 全てのプロジェクトで共通の設定
uncrustify.cfg はそのままではプロジェクト単位で適用されてしまうため、新規プロジェクトの作成時に毎回設定し直す必要があり面倒ですよね。そこで、これを全プロジェクト共通の設定としてしまいましょう。

まず上で作った uncrustify.cfg を適当なディレクトリ(今回は`~/.uncrustify/uncrustify.cfg`)にコピーしておきます。

そして、`Command + ,` で設定を開き JSON エディタに切り替えてから以下を追加します。

```JSON
"uncrustify.configPath.osx": "$HOME/.uncrustify/uncrustify.cfg",
```

再度 `Command + Shift + p > Reload Window` で再度リロードすれば全てのプロジェクトで Apex ファイルをフォーマットできるようになります。
【質問です】Python初心者ですがWebスレイピング覚えようとしてます。

Webスレイピングのコードをネット見ながら書いてますが、つまづいたので教えてください。
日経の株式・マーケットページから日経株価を定期的にスレイピングしCSVに保存するするコードを書いたのですが、毎時、毎分取得はできますが毎秒（もしくは毎５秒）でスレイピングする方法がわかりません。以下が毎分取得で書いたコードです。


while True:
        if datetime.now().second == 0:
            pass

    f = open('nikkei_heikin.csv', 'a')
    writer = csv.writer(f, lineterminator='\n')
    while datetime.now().second != 59:
        time.sleep(1)
    time.sleep(1)

    csv_list = []
    time_ = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
    csv_list.append(time_)

    url = "https://www.nikkei.com/markets/kabu/"
    html = urllib.request.urlopen(url)
    soup = BeautifulSoup(html, "html.parser")
    span = soup.find_all("span")
    nikkei_heikin = ""
    for tag in span:
        try:
            string_ = tag.get("class").pop(0)
            if string_ in "mkc-stock_prices":
                nikkei_heikin = tag.string
                break
        except:
            pass
    print(time_, nikkei_heikin)
    csv_list.append(nikkei_heikin)
    writer.writerow(csv_list)
    f.close()

if datetime.now().second == 0の0の部分を変更すればなんとかなるかと思いましたが知識及ばず、リストに５単位のIntを入れて渡せばできるんじゃないかと思いましたがだめでした。何か方法あれば教えていただけましたら幸いです。よろしくお願いします。
【Xamarin.Forms&Prism】ReactivePropertyの導入


#はじめに
Xamarin.Forms & PrismにReactivePropertyを追加する手順です。

#環境
* macOS 10.14 Mojave
* Visual Studio Community 2017 for MAC(7.7.4)
* Prism.Autofac.Forms(7.1.0.431)

#ReactivePropertyの追加
PCLプロジェクトを右クリックして[追加]-[NuGetパッケージの追加(P)...]をクリックします。

<img width="688" alt="スクリーンショット 2019-02-17 10.58.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/342629/25a86b68-04ef-ead0-1818-a703e7a0252e.png">

右上の検索キーワードに「reactive」と入力すると「ReactiveProperty」が出てくるので選択して「パッケージを追加」ボタンをクリックします。
**【注意】
だいぶスクロールしてようやく出てきます。
検索キーワードに「reactiveproperty」といれてもヒットしません。**
<img width="932" alt="スクリーンショット 2019-01-27 18.21.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/342629/7d09921a-9d04-8a69-49ee-933c91861e04.png">

追加されました。
<img width="487" alt="スクリーンショット 2019-02-17 11.02.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/342629/b1a9cb8c-c502-f5d2-e8b1-5d5f7ec37390.png">

#ビルド
まずはiOSプロジェクトから。

<img width="1049" alt="スクリーンショット 2019-02-17 11.08.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/342629/836397be-4f06-3da2-5daa-0fb29b6f6bd3.png">

成功しました。

次にAndroidプロジェクトです。

<img width="1049" alt="スクリーンショット 2019-02-17 11.08.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/342629/24c95c2a-0f91-0ba0-d7e8-b361dfd5a295.png">

ビルドエラーが出ましたー（泣

/Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1898,2): error XA2002: Can not resolve reference: `System.Threading.Tasks.Extensions`, referenced by `System.Reactive`. Please add a NuGet package or assembly reference for `System.Threading.Tasks.Extensions`, or remove the reference to `System.Reactive`.

対策はこちら。
https://qiita.com/ats_y/items/e7074dcbba036a6f6a72
AWSソリューションアーキテクトアソシエイトの模試を受けてみた

受験に向けた記録として残しておきます。

# これまでにやったこと
- 「Amazon Web Services 基礎からのネットワーク&サーバー構築」で簡単に構築を実践
- 「合格対策 AWS認定ソリューションアーキテクト - アソシエイト」で試験対策

# 受験結果
総合スコア:  56%

トピックレベルスコア:
1.0  Design Resilient Architectures: 88%
2.0  Define Performant Architectures: 28%
3.0  Specify Secure Applications and Architectures: 33%
4.0  Design Cost-Optimized Architectures: 50%
5.0  Define Operationally-Excellent Architectures: 100%

パフォーマンス、セキュリティに課題有。

# これからやること
- 対策本で「パフォーマンス」「セキュリティ」まわりを再勉強
- BlackBeltで苦手対策
Rails チュートリアル 第2章　windows10環境下での備忘録。

# 第二章で躓いたところ
##備忘録として残しておきたい。もし誰か初心者の役に立てれば幸い。
###2.2.1のusersへのアクセスで失敗した。
sqliteが原因のようだ。コマンドプロンプトからのインストールではなく、<https://www.sqlite.org/download.html>よりソースコードとPrecompiled Binaries for Windows　をダウンロードする。  
###node.jsをwindowsにインストール
上記を試し、
`#sqlite --version`
でインストールを確認したがそれでもusersへアクセスするとエラーメッセージが表示される。環境にnode.jsがインストールされていないためjavascriptが使えないためらしく、こちらもインストール後再起動したところ、無事usersにアクセスできた。

---
node.jsは普段から開発している人なら元から入っているのだろうから今までここで躓く人は多くないかもしれない。記しておく価値はあると思う。
applicarion.html.erbのapplication →　default　はエラーメッセージが変わるも解決せず。 
エラーコードを検索したところネット上で上記の解決法が書かれていたがうまくいかなかった

初投稿です。読みにくい点はお慈悲を。
【Xamarin.Forms&Prism】ReactiveProperty導入直後のAndroidプロジェクトでビルドエラー

#はじめに

Xamarin.Forms & Prosm.Autofac.FormsプロジェクトにReactivePropertyを追加してAndroidプロジェクトをビルドするとビルドエラーが出た。

/Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1898,2): error XA2002: Can not resolve reference: `System.Threading.Tasks.Extensions`, referenced by `System.Reactive`. Please add a NuGet package or assembly reference for `System.Threading.Tasks.Extensions`, or remove the reference to `System.Reactive`.

#環境
* macOS 10.14 Mojave
* Visual Studio Community 2017 for MAC(7.7.4)
* Prism.Autofac.Forms(7.1.0.431)
* ReactiveProperty(5.3.2)

#対策
既知の問題みたいです。

https://github.com/runceel/ReactiveProperty/issues/87
https://github.com/dotnet/reactive/issues/803

詳しくはわからないけど、「System.Threading.Tasks.Extensions.dllはバージョン4.4.0つかっとけ」ってことみたいなので、そのように設定していきます。

1. Androidプロジェクトを右クリックし、[追加]-[NuGetパッケージの追加(P)...]をクリックして「パッケージを追加」画面を開きます。
2. System.Threading.Tasks.Extensionsのバージョン4.4.0を追加します。
<img width="945" alt="スクリーンショット 2019-02-17 12.54.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/342629/884535b7-c45e-665d-4493-92f85bf7b543.png">
<img width="494" alt="スクリーンショット 2019-02-17 13.29.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/342629/24464de4-5514-bcda-7db2-b3b48b2c4533.png">
3. Androidプロジェクトをビルドします。
<img width="1126" alt="スクリーンショット 2019-02-17 13.38.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/342629/4375f19f-8245-a2ff-855f-a5808b245fcb.png">
警告は残りますが、とりあえずビルドできました。

#おまけ
AndroidプロジェクトのcsprojファイルにSystem.Threading.Tasks.Extensions.dllバージョン4.4.0を参照するように設定する方法もあるみたいです。
https://github.com/dotnet/reactive/issues/803#issuecomment-455383106
Macの場合は以下のようにItemGroup要素をルート（Project）要素配下に追加します。

```｛ソリューション名｝.Droid.csproj
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  ： 
 （略）
  ：
  <!-- ここから -->
  <ItemGroup>
    <Reference Include="System.Threading.Tasks.Extensions">
      <HintPath>$(HOME)/.nuget/packages/system.threading.tasks.extensions/4.4.0/lib/netstandard2.0/System.Threading.Tasks.Extensions.dll</HintPath>
    </Reference>
  </ItemGroup>
  <!-- ここまで -->
</Project>
```
Python + OpenCVによるマスク画像適用方法


OpenCVで画像に対しマスク画像を適用し特定範囲を任意の色にする

下記コードは、マスク画像黒部分を灰色で塗りつぶす

```ruby:test.py
import cv2

# マスク対象画像読み込み
img = cv2.imread("testImg.png",cv2.IMREAD_COLOR)

# マスク画像読み込み
imgMask = cv2.imread("testImgMask.png",cv2.IMREAD_GRAYSCALE)

# マスク画像合成
img[imgMask==0] = [128, 128, 128]  # マスク画像の明度 0 の画素を灰色（R:128 G:128 B:128）で塗りつぶす

# マスク結果画像を保存
cv2.imwrite("testDstImg.png", img)
```

マスク対象画像
![testImg.png](https://qiita-image-store.s3.amazonaws.com/0/172093/b79571a0-f70d-a469-e9a3-6988029712af.png)

マスク画像
![testImgMask.png](https://qiita-image-store.s3.amazonaws.com/0/172093/8b792f0f-4c74-250f-7d49-223e446c14ea.png)

マスク実施後画像
![testDstImg.png](https://qiita-image-store.s3.amazonaws.com/0/172093/c7fe50fd-a424-dee2-64c8-1769c0cdf5f0.png)
私が…………プログラミングを………する、あなたは……佐城雪美に………なる

# 概要
この記事を……見て…………私は………佐城雪美に…なろうと………思った。

オレ プログラム ウゴカス オマエ ゲンシジン ナル
https://qiita.com/Harusugi/items/f499e8707b36d0f570c4

# 環境
bash on windows
python3
janome

# やってること
str型で…………受け取った文を………構文解析して…………文節の……区切りっぽいと ころに………ランダムな数の…中点を…………打つ。
形態素解析エンジンは………今回は……janomeという…………ものを…………使った。

# ソース
適当に…importして………使って………。

```python
from janome.tokenizer import Tokenizer
from random import random

def yukimi_say(mystr):
    t = Tokenizer()
    
    result = ""
    
    for mytoken in t.tokenize(mystr):
        result += mytoken.surface
        
        if mytoken.part_of_speech[0:2]=="助詞" \
        or mytoken.part_of_speech[0:2]=="副詞":
            num_dots = int(4*random()+1.0)
            for i in range(num_dots):
                result = result + "…"

    return result
```

# 感想
やっつけで………作ったから…句読点の…………処理とか…………苦手。

要するに…………文節の…末尾に……中点を………入れたらいいので……もう少し……スマートな方法が……ありそう。

もう…………ちょっと…………ブラッシュアップするつもり。ふふっ。
Laravelでenvやgetenvで環境変数が読めない現象について

# はじめに
`Laravel`で、`.env`に`SOME_WORD`が存在するのにかかわらず、`env('SOME_WORD')`や`getenv('SOME_WORD')`で環境変数が読めない現象が発生し、解決に時間を要してしまったので、備忘録的に残しました。

# 現象について
`.env`に`SOME_WORD`が定義しておりましが、その変数が読めない事象に遭遇しました。
`env('SOME_WORD')` を実行すると `NULL`、`getenv('SOME_WORD')`を実行すると`false`がリターンする現象です。

# 解決方法について
`Stack Overflow`では、環境変数の定義に`SOME_WORD=SOME WORD`のようにスペースが含まれていると失敗するため、`SOME_WORD="SOME WORD"`とダブルクォート（"）で括ることで解決できるといった事例が多かったのですが、そちらに該当しませんでした。

他の解決方法として、下記コマンドを実行することで解決できるといった記載がありましたので、実行してみました。

```
# php artisan config:clear
# php artisan cache:clear
```

ここで、`php artisan cache:clear`を実行すると`Failed to clear cache. Make sure you have the appropriate permissions.`というエラーが発生しました。
更に調査したところ`mkdir -p storage/framework/cache/data`を実行すると解決できるという記載がありましたので、そのコマンドを実行後、改めて`php artisan cache:clear`を実行し、正常にコマンドが終了しました。

さて、問題の環境変数が読めない件ですが、上記を実施することで、正常に環境変数が読み込めるようになりました。
Linuxのテスト用シェル

# Tool
## stress
インストール
### RHEL6.9
```shell

wget http://ftp.riken.jp/Linux/dag/redhat/el6/en/x86_64/rpmforge/RPMS/stress-1.0.2-1.el6.rf.x86_64.rpm
rpm -ivh stress-1.0.2-1.el6.rf.x86_64.rpm 
```

# 独自シェル
## 時間のかかるシェルで戻り値ランダム(0～9)

```shell
#!/bin/sh

# syslogに開始ログを記載。タグにシェル名。STARTの後ろにPID
logger -i -t $0 START $$

# プロセスIDの最後の1文字をリターンコードにセット
RETURN_CODE=`echo $$|rev|cut -c 1-1`
logger -i -t $0 RETURN=$RETURN_CODE

# 処理メイン。時間のかかる処理
ping -c 10 localhost > /dev/null

# syslogに終了ログを記載。タグにシェル名。ENDの後ろにPID
logger -i  -t $0 END $$

# リターンコードを指定して終了
exit $RETURN_CODE

```

## 1つのファイルを連番で複数コピー

```shell
for i in 'seq -w 1 20`;do cp コピー元ファイル名.sh コピー先_$i.sh;done
```
AWS CLIからSSMパラメータストアへURLを保存する方法

# 背景
## パラメータストアにURLを保存しようとするとエラーになる
aws cli の ssm put-parameterコマンドで、valueにURL形式の文字列を保存しようとすると、以下のようなエラーになります。

```
$ aws ssm put-parameter --name /AppName/Env/Twitter/CallbackUrl --type String --value "http://127.0.0.1:8080/twitter-auth-callback" --description "CallbackURL for Twitter OAuth."

Error parsing parameter '--value': Unable to retrieve http://127.0.0.1:8080/twitter-auth-callback: Could not connect to the endpoint URL: "http://127.0.0.1:8080/twitter-auth-callback"
```

## マネジメントコンソールからは登録できる
上記と同じ内容のパラメータを、マネジメントコンソールから登録する場合は、問題なく登録できました。

# 解決方法
aws-cli の以下のissueのコメントに書いてくださっているものそのままなのですが、 --cli-input-json オプションを使用すると回避できました。
https://github.com/aws/aws-cli/issues/3076

上記のコマンドの場合は、--cli-input-json オプションを使用すると以下のようになります。

```
aws ssm put-parameter --cli-input-json '{"Name": "/AppName/Env/Twitter/CallbackUrl", "Type": "String",  "Value": "http://127.0.0.1:8080/twitter-auth-callback", "Description": "CallbackURL for Twitter OAuth."}'
```
Dividing template files for layout and content at Golang

## Environmnet
```
go version go1.11.5 linux/amd64
```

## Directory Structure

```bash
/go
 └ src/
   └ sample/
     └ main.go
     └ templates/
       └ layout.html
       └ top.html
```

## Source code

```main.go
package main

import(
        "html/template"
        "log"
        "net/http"
)

func handlerIndex(w http.ResponseWriter, req *http.Request) {

        t := template.Must(template.ParseFiles(
                "templates/layout.html",
                "templates/top.html",
        ))

        s := "world"
        e := t.ExecuteTemplate(w, "layout.html", s)
        if e != nil { log.Fatal(e) }
}

func main() {
        http.HandleFunc("/", handlerIndex)
        http.ListenAndServe(":8080", nil)
}
```

```templates/layout.html
<!DOCTYPE html>
<html>
        <body>
                {{ template "top.html" . }}
        </body>
</html>
```

```templates/top.html
Hello, {{ . }}.
```


## Build & Run

```bash
cd $GOPATH/src/sample/ && go run main.go
```

![スクリーンショット 2019-02-17 13.27.48.png](https://qiita-image-store.s3.amazonaws.com/0/256447/c56b5806-c68f-6269-ac88-1a785091a10a.png)
PythonのCIE DE2000計算速度比較

# みんな大好き速度比較

色差式CIE DE2000は、人間の知覚にかなり近い値を得られるが、そのかわり計算が重い。Pythonですぐに使えるパッケージ3つの速度を比較してみた。

- [scikit-image](https://scikit-image.org/)
- [colour-science](https://www.colour-science.org/)
- [colormath](https://github.com/gtaylor/python-colormath)

sRGBの[32,32,32]と[32,31,32]を比較する。3つとも色差関数が引数に取るのはL*a*b*なので、計算時間にはsRGB→L*a*b*の変換も含む。

```python
import numpy as np
import timeit

RGB1 = np.array([32,32,32],np.uint8)
RGB2 = np.array([32,31,32],np.uint8)

from skimage import color
def skimage_rgb2lab(rgb):
	return color.rgb2lab(rgb.reshape(1,1,3))
ski = timeit.timeit('color.deltaE_ciede2000(skimage_rgb2lab(RGB1), skimage_rgb2lab(RGB2))', globals=globals(), number=1000)
print(f'skimage.color: {ski} millisecond.')

from colormath.color_diff import delta_e_cie2000 as cm_delta_e_cie2000
from colormath.color_objects import sRGBColor as cm_sRGBColor, LabColor as cm_LabColor
from colormath.color_conversions import convert_color as cm_convert_color
def colormath_rgb2lab(rgb):
	return cm_convert_color(cm_sRGBColor(*(rgb / 255)), cm_LabColor, target_illuminant='d65')

cm = timeit.timeit('cm_delta_e_cie2000(colormath_rgb2lab(RGB1), colormath_rgb2lab(RGB2))', globals=globals(), number=1000)
print(f'colormath: {cm} millisecond.')

import colour as cs
cs_d65 = cs.ILLUMINANTS['CIE 1931 2 Degree Standard Observer']['D65']
def cs_rgb2lab(rgb):
	return cs.XYZ_to_Lab(cs.sRGB_to_XYZ(rgb / 255, chromatic_adaptation_method='Bradford', illuminant=cs_d65), illuminant=cs_d65)

colour_science = timeit.timeit('cs.difference.delta_E_CIE2000(cs_rgb2lab(RGB1), cs_rgb2lab(RGB2))', globals=globals(), number=1000)
print(colour-science: {colour_science} millisecond.')
```

# 結果

```
skimage.color: 0.306773 millisecond.
colormath: 0.29326620000000014 millisecond.
colour-science: 0.5313292000000001 millisecond.
```

わずかにcolormathが勝ったが、Numpy前提ではないパッケージなので、画像データだとscikit-imageが逆転すると思う。colour-scienceはCIECAM02に対応していたりと多機能なので、速度はダメらしい。
未解決の外部シンボル(参照)を定義していない静的ライブラリのオブジェクトファイルはリンクされない

## 概要
C++で書かれた、ある静的ライブラリの関数において、他のライブラリ等のどこにも定義されていない関数を呼び出していました。その静的ライブラリをリンクしている実行ファイル作成のためのビルドにおいて、リンクエラーが発生することなく成功していました。

リンクされている静的ライブラリ内で定義されていない関数を呼び出している場合、未解決の外部シンボルが残ったままとなり、リンクエラーになるのでは？と自分は思っていたのですが、間違いでした。

結論を言うと、未解決の参照を定義していない静的ライブラリのオブジェクトファイルはリンクされないということでした。

ソースコードを伴わない説明だと、分かり難いと思うので、以下に検証用の複数のケースのソースコードとその解説を載せます。検証にはClangを用いていますが、他のGCCやVC++等のコンパイラでも挙動としては変わりないと思われます。

## 検証

### ケース1

下記の2つのC++のソースコードがあります。

```cpp:main.cpp
#include <iostream>

int main()
{
    std::cout << "main()" << std::endl;

    return 0;
}
```

```cpp:hoge.cpp
void f();

void g()
{
    f();
}
```

hoge.cppの`f()`の定義は存在していません。

未解決の外部シンボルのリンクエラーの例として、普通にビルドしてみます。`g()`から呼び出している`f()`のシンボルが定義されておらず見つからないという、未解決の外部シンボルのリンクエラーになります。

```
$ clang++ -c main.cpp
$ clang++ -c hoge.cpp
$ clang++ main.o hoge.o
Undefined symbols for architecture x86_64:
  "f()", referenced from:
      g() in hoge.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

### ケース2

ケース1のmain.cppとhoge.cppを再び用います。hoge.cppから作成されるhoge.oをlibhoge.aという静的ライブラリに含めるようにし、下記のようにビルドしてみると、リンクエラーが発生することなく成功します。未解決の参照を定義していないhoge.oがリンクされないからです。

```
$ clang++ -c main.cpp
$ clang++ -c hoge.cpp
$ ar rcs libhoge.a hoge.o
$ clang++ main.o -L. -lhoge
```



実行結果は下記です。

```
$ ./a.out
main()
```

### ケース3
main.cppとhoge.cppのソースコードを少し修正し、main.cppの`main()`から呼び出す関数`h()`をhoge.cppに定義します。

```cpp:main.cpp
#include <iostream>

void h();

int main()
{
    std::cout << "main()" << std::endl;
    
    h();
    
    return 0;
}
```

```cpp:hoge.cpp
#include <iostream>

void f();

void g()
{
    f();
}

void h()
{
    std::cout << "h()" << std::endl;
}
```

ケース2と同じようにビルドすると、未解決の外部シンボルのリンクエラーが発生します。`h()`という未解決の参照をhoge.oが定義しており、hoge.oがリンクされたからです。

```
$ clang++ -c main.cpp
$ clang++ -c hoge.cpp
$ ar rcs libhoge.a hoge.o
$ clang++ main.o -L. -lhoge
Undefined symbols for architecture x86_64:
  "f()", referenced from:
      g() in libhoge.a(hoge.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```


### ケース4
ケース3おいてhoge.cpp内に定義した関数`h()`を新しく作成するhoge2.cppに移し、libhoge.aにhoge.cppとhoge2.cppのそれぞれから作成されるhoge.oとhoge2.oを含めます。

```cpp:main.cpp
#include <iostream>

void h();

int main()
{
    std::cout << "main()" << std::endl;
    
    h();
    
    return 0;
}
```

```cpp:hoge.cpp
void f();

void g()
{
    f();
}
```


```cpp:hoge2.cpp
#include <iostream>

void h()
{
    std::cout << "h()" << std::endl;
}
```

下記の手順で無事ビルドに成功しました。 

```
$ clang++ -c main.cpp
$ clang++ -c hoge.cpp
$ clang++ -c hoge2.cpp
$ ar rcs libhoge.a hoge.o hoge2.o
$ clang++ main.o -L. -lhoge
```

hoge2.oは未解決の参照が定義されているためリンクされますが、hoge.oはそうではないためリンクされないからです。同じ静的ライブラリの中に含まれていても、オブジェクトファイルによってリンクされるかされないかが変わってくるということですね。

実行結果は下記です。

```
$ ./a.out
main()
h()
```

## 参考文献
[静的ライブラリ (.a) の作成と利用](https://www.yunabe.jp/docs/static_library.html)
Node.jsで作ったライブラリをブラウザ上で使えるようにする

# <font color="#009250">この記事を書いたきっかけ</font>
Node.jsとかでライブラリ作りたいなと思いまして
基本は`npm`でインストールしてNode.js上で動作するだけでもいいけど
ブラウザ上で`script`タグで読み込むだけでも使えるようにもしたいな


つまり、こういうことをやりたい

```html:index.html
<script src="mylib.js"></script>
<script>
  MyLib.init();
</script>
```

あれ、でもNode.jsで作ったライブラリって
どうやってブラウザ上で使えるようにするんだろう。
普通に`window.<プロパティ>`にぶち込むだけ？

というのを調べてみたお話。

# <font color="#009250">この記事の結論</font>

現時点ではブラウザ上で動作してるってことをなんらかで判定しつつ
最終的に`window.<プロパティ>`にぶち込むのが安定という気がしました。

```js
const message = "Hello World";

if (typeof window  !== "undefined") {
  window.message = message;
}
```

あとは現在ECMAScriptに`globalThis`というものが試験実装されてるようなので
この先のどこかのタイミングでは`globalThis`に統一される事になる？という妄想をしています。

# <font color="#009250">普通のJavaScriptとscriptタグ</font>

```js:index.js
const message = "Hello World";
```

```html:index.html
<script src="index.js"></script>
<script>
  console.log(message);
</script>
```

```bash:console
Hello World
``` 

通常のjsは`index.js`で定義された`message`がそのファイルの外でも使える。

# <font color="#009250">scriptタグにtype=moduleを設定する</font>

`script`タグに`type="module"`を指定するとJavaScriptファイルがモジュールとして扱われ
ESModule仕様でimport/exportが使える。(一部ブラウザは非対応)

```js:index.js
const message = "Hello World";
```

```html:index.html
<script type="module" src="index.js"></script>
<script>
  console.log(message);
</script>
```

```:console
Uncaught ReferenceError: message is not defined
```

結果は`message`が定義されてないとエラーになる。
エラーになる原因は２つ。

## 1. モジュール内の変数はファイル内スコープである
モジュールの外で使うにはそもそも`export`しなきゃいけないし
使うときは`import`してやらないとだめ。  

## 2. `index.js`が読み込まれる前にconsole.logが実行されちゃう  
そもそも`console.log`のタイミングでまだ`index.js`がロードされてない。
(モジュールだと非同期読み込みになるから)

# <font color="#009250">HTML上で変数(message)を使えるようにする</font>

`index.js`の変数をどうやって`html`側で利用するか

## 実験 その１

`export`して`import`する

```js:index.js
const message = "Hello World";
export default message;
```

```html:index.html
<script type="module">
  import message from './index.js'; // ./とか.jsをちゃんと書かないと怒られた
  console.log(message);
</script>
```

```:console
Hello World
```

`type="module"`を指定し、Scriptをmoduleとして扱う事で`import`することができる。
(IE11が相変わらず対応してないが)

## 実験 その２
`window.message`に突っ込む

```js:index.js
const message = "Hello World";
window.message = message;
```

```html:index.html
<script type="module" src="index.js"></script>
<script>
  // 上記のスクリプトは非同期で読み込まれるので、ロード後に処理する
  window.onload = function() {
    console.log(message)
  }
</script>
```

```:console
Hello World
```

これは昔ながらの方法なので`type="module"`だろうと
昔ながらのJavaScriptだろうと
どっちでもいけるパターン。

# <font color="#009250">type="module"ってどうなの</font>

色々とあるけど、`type="module"`を実用化するにはあともう少しという気がします。
(もうIE11もなくなるっぽいし、古いブラウザやニッチなブラウザを捨てちゃえばいいんだよもうって思う)
最終的にこれに統一される日は早くきて欲しい。


Node.jsのモジュールがcommonjs(亜種)仕様だったり
Node.jsでも拡張子を`.mjs`にすればESModule構文使えるけど、`.mjs`で作るのも微妙だったり

結局はwebpackやらparcelやらxxxxxfyなど何らかのバンドラーでバンドルしちゃうのが安定かなぁ。
そしてバンドルするなら`type="module"も直近ではいらないという結論に落ち着く



# <font color="#009250">まとめ</font>

諸々の状況を鑑みると、Node.jsで作ったクラスなり関数なりを
HTML上で使えるようにするには

必要なものを`window.<プロパティ>`にぶち込んで公開する。
という方法でいいという結論に落ち着きました。
Ionic 4 のion-toolbarで、文字を中央に表示する

#タイトル通り、ion-toolbarで文字を中央に表示したい

ionic3のときも中央表示は苦労した覚えがあるが、今回もよくわからなかったので、結構調べてしまった。

備忘録のために記事にしておきます。


```ｈｔｍｌ
<ion-toolbar text-center>
```

のように、text-centerと書く。



追記

公式のCSS Utilitiesにも書かれていました。


CSS Utilities : https://ionicframework.com/docs/layout/css-utilities/
MP4BOX -infoの出力結果をパイプやリダイレクトでつなげる方法

# 概要

動画から字幕を抽出するツールを作るために、MP4BOXを使用しているのですが、動画のファイル情報を取得する際、 
```mp4box -info aaa.mp4``` 
とすると思います。この出力結果をパイプやリダイレクトでで次のコマンドに渡したい場合、 標準出力ではなく、標準エラー出力を使用します。

# 具体的な使用法

##誤
例：aaa.mp4のファイル情報をaaa.txtに書き込む
```mp4box -info aaa.mp4 > aaa.txt```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/362722/48a5eaa7-1971-cd2c-fb55-d2c4a5eb4766.png)
ファイルに書き込まれずにコマンドプロンプトに出力されてしまいました。

##正
標準出力ではなく、標準エラー出力をリダイレクトする
```mp4box -info aaa.mp4 2> aaa.txt```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/362722/bb79475b-8442-af40-1a98-ff72328bda58.png)
正しくaaa.txtにファイル情報が書き込まれました。

# まとめ
最初、標準エラー出力に出ていることが分からずに小一時間無駄にしました。
この方法はパイプでつなげる場合も同じですし、プログラムでコマンドプロンプトの実行結果を受け取る際にも同じことが言えます。参考になれば幸いです。
goでClean Architectureをやるときのvalidation

# validatonをどう書くか

```
handler
  ↓
usecase (usecase, input)
  ↓
domain (model, repository)
  ↑
infra
```
みたいな構造のWebアプリケーションを構築する場合、validationをどう書くかという話です。考慮する点としては、

1. validation ロジック(定義)をどこに書くか
2. validation をどこで実行するか

の２点を考えていく必要がある。
1. については

- usecase の中でも入力された値を使うので、そこでもvalidationをすると二度手間になる。
- usecase より下では理想的で「綺麗な」値だけを考えたい
- usecase 層のinputを構造体として定義している

あたりを考慮すると、usecase層のinput定義にロジックを記述するのがいいように思う。

2.については、「usecaseにvalidationしていない値を持ち込みたくない」という考えを推し進めるとhandlerで個別にやりたくなってくる。
ただusecaseの先頭でやるとエラーをまとめてcatchできるメリットがあって、コード的には収まりがいい。

# サンプルコード
上記の点を考慮したサンプルコードを以下のまとめる。サンプルコードではusecase層でvalidationを実行しつつ、handlerでやる場合もコメントアウトして併記している。
(色々端折ってます）

### handler

```golang
func GetPagingList(c *echo.Context) error {
	page, err := strconv.Atoi(ctx.QueryParam("page"))
	if err != nil {
		page = 1
	}
	perPage, err := strconv.Atoi(ctx.QueryParam("per_page"))
	if err != nil {
		perPage = 20
	}

	in := input.ListGet{
		UserID:  ctx.currentUserID,
		Page:    page,
		PerPage: perPage,
	}

	// handlerでvalidationするならここで
	//if err := in.Validate(); err != nil {
	//	return echo.NewHTTPError(http.StatusBadRequest, err.Error())
	//}

	list, err := usecase.GetList(in)
	if err != nil {
		switch err.(type) {
		case *errors.InvalidParameter:
			return echo.NewHTTPError(http.StatusBadRequest, err.Error())
		case *errors.NotFoundError:
			return echo.NewHTTPError(http.StatusNotFound, "not found")
		default:
			return echo.NewHTTPError(http.StatusInternalServerError, "internal server error")
		}
	}
}
```

### usecase.input
```golang
type ListGet struct {
	Page    int
	PerPage int
	UserID  int64
}

func (c *ListGet) Validate() error {
	if c.Page < 1 {
		return errors.NewInvalidParameter("page parameter must be upper 0")
	}
	if c.PerPage < 1 {
		return errors.NewInvalidParameter("per_page parameter must be upper 0")
	}
	if c.PerPage > 100 {
		return errors.NewInvalidParameter("per_page parameter must be under or equal 100")
	}

	return nil
}
```

### usecase
```golang
func GetList(in input.ListGet) (list *model.List, err error) {
	if err = in.Validate(); err != nil {
		return
	}

	// ~~ list 取得処理 ~~
}
```

# 最後に
サンプルにある`c.PerPage > 100`みたいなのって完全にドメインの知識だよね？というのはあって、ある程度仕方ないとはいえドメイン知識がusecaseに染み出してる感は否めません。
その辺りは「これはAPIの定義の話だ」と割り切ってしまえばそんなに違和感はないかもしれません。