OmniAICreator/Qiita-1.07M huggingface dataset:
React Nativeのviewpagerで現在のpageの位置を取得する(Androidのみ動作確認済み)

# やりたいこと
ReactNativeのviewpagerで現在のpageの位置(何番目のpageか)を把握。
https://github.com/react-native-community/react-native-viewpager

なぜやりたいかというと、viewpagerがdots(現在の位置が一目でわかる下部にある点)をAndroidではデフォルトでサポートしていなかったので自作しようとしたからです。

# 実装まで
ドキュメントを読んだところ
onPageSelected
というPropが使えそうと思ったので試しました。 
ただ、トップページには使用例がないので、サンプルを確認
https://github.com/react-native-community/react-native-viewpager/blob/master/example/ViewPagerExample.js

大抵ReactNativeのライブラリにはexampleのファイルがあります。

# 実装
簡素化しています。

```jsx
import ViewPager from '@react-native-community/viewpager';

onPageSelected = (e: PageSelectedEvent) => {
    this.setState({page_position: e.nativeEvent.position});
};

render(){
    return(
        <ViewPager style={style} initialPage={0} onPageSelected= 
            {this.onPageSelected.bind(this)}>
        </ViewPager>
    );
}
```

これでstateのpage_positionに現在のpage_idが代入されます。

# Dotsについて
ざっくりとした開発フロー
1. DotsをCSSで作成
2. CSSでdot_activeを作る
3. Dotsのリスト(配列)を作る(ページの数だけ)
4. stateが変更された時、3の配列のpositionのdotsをアクティブにする

DotsのCSS例(カラー部分は自由に)

```css
dot: {
    width: 8,
    height: 8,
    borderRadius: 8/2,
    backgroundColor: "#CCC",
    marginLeft: 5,
},
dot_active: {
    width: 8,
    height: 8,
    borderRadius: 8/2,
    backgroundColor: "#F00",
    marginLeft: 5,
}, 
```

配列を作る部分は省略

stateのpage_positionのみactiveにする

```jsx
renderDots(dots){
    active_key = this.state.page_position;
    dot_active = <View style={dot_active} key={active_key}></View>
    dots[active_key] = dot_active;
    return(dots);
}
```


もしReactNativeのAndroid開発で同じ悩みを持っている人の参考になればと！
[RPA]SikuliXの導入（メモのみ）

# ダウンロード
## OpenJDKのダウンロード
https://jdk.java.net/archive/

## SikuliXのダウンロード
https://raiman.github.io/SikuliX1/downloads.html

## Version 2.0.0	※2019/11/04時点での安定版最新
※Pythonを使用するなら下記1),2),3)をダウンロード
1) sikulix.jar						…統合開発環境
(上記ダウンロードページ上の表示) Download the ready to use sikulix.jar (SikuliX IDE)
2) sikulixapi.jar					本体
(上記ダウンロードページ上の表示) Download the ready to use sikulixapi.jar
3) jython-standalone-2.7.1.jar		…Pythonを実行するエンジン
(上記ダウンロードページ上の表示) The Jython interpreter 2.7.1 for python scripting (the default)
4) jruby-complete-9.2.0.0.jar		…Rubyを実行するエンジン
(上記ダウンロードページ上の表示) The JRuby interpreter 9.x for ruby scripting

※ 旧のVersion 1.1.4の場合も確認時点では同じファイル名

## インストール
※ダウンロードしたjarを全て同一ディレクトリに格納

# 実行
##実行方法1(ダブルクリック)
sikulix-2.0.0.jarをダブルクリック
※但し、上記で実行するとエラー時にエラーメッセージが表示されずいつまでも反応がないため、コマンドプロンプトから実行する。
※よくあるエラーは、JREを32/64bitを間違っているケース

##実行方法2(コマンドプロンプト)
cd C:\SikuliX
java -jar sikulix-2.0.0.jar
※jython-standalone-2.7.1.jar、jruby-complete-9.2.0.0.jarは自動で削除されるが正常な動作

※インストール先フォルダは%appdata%SikuliX
	配下の「Extensions」は拡張機能
※SikuliXの設定はレジストリの「HKEY_CURRENT_USER\Software\JavaSoft\Prefs\org\sikuli」に記述される。
　不具合で起動しなくなったときは、ここを削除し、再インストールを試す。

## 追加作業
### OCR機能を日本語化	不要。(実行しようとしたが、Version 2.0.0では配置先ディレクトリないため、一旦無視)
※OCR処理は必須ではない。画像の情報を読み取ってテキスト化したいときにだけ必須。

※内臓OCRは、Tesseract-OCRというオープンソースソフトであり、機械学習を使ってOCRを実現しているが、英語の学習データしか含まれていない。
Tesseract-OCRのtessdata ディレクトリより「jpn.traineddata」をダウンロードし、下記に配置
%appdata%\Sikulix\SikulixTesseract\tessdata
※%appdata%\Sikulixは起動まで作成されない
Pedestalでレスポンスの文字コードを任意に指定するだけのインターセプター

# 概要
Duct + PedestalでAPIサーバを作っていると、JSONを返すために[pedestal.http/json-body](https://github.com/pedestal/pedestal/blob/f0df4a5ac983fd4e7d0a4f667bffb0ad5938d56e/service/src/io/pedestal/http.clj#L115-L127)インターセプターを使いたくなる。

なおこのjson-bodyくん、親切にも `Content-Typeに文字コードUTF-8を指定している`ため、レスポンスが実際には **Shift-JISだとしても問答無用でUTF-8を指定して返す**。
日本語が文字化けする😇

考えあぐねた結果 `レスポンスのContent-Type部分で文字コードだけを狙い撃つように変えるインターセプター`を作った。色々アレな発想だが切羽詰まっていたので許してほしい。ごめんて。

※ 文字化け問題はJVMが原因だとわかったので、こっちでスッと解決できた => https://qiita.com/v2okimochi/items/40d0ebd2186657a44969




# ソースコード
たとえば `v2okimochi-api`という名前空間で `interceptors.clj`に当該処理を書いておき、これを呼び出して使う。

## インターセプター
```clojure:interceptors.clj
(ns v2okimochi-api.interceptors
  (:require [io.pedestal.interceptor.helpers :as interceptor]
            [ring.util.response :as ring-response]))

(defn set-charset
  "responseを任意の文字コードに変換する"
  [charset]
  (interceptor/on-response
   ::set-charset
   (fn [response]
     (let [content-type (get-in response [:headers "Content-Type"])]
       (cond

         ;; `charset=`以降を変換する
         (and (string? content-type)
              (re-matches #".*charset=.*" content-type))
         (->> (clojure.string/replace content-type #"(\.*charset=).*"
                                      (str "$1" charset))
              (ring-response/content-type response))

         ;; `Content-Type`に文字コード指定を追加する
         (string? content-type)
         (->> (str content-type ";charset=" charset)
              (ring-response/content-type response))

         ;; 文字コード指定で `Content-Type`を作る
         :else
         (ring-response/content-type response (str "charset=" charset)))))))
```

＼ ))))))) ／

## ルーティング
たとえばこうやって使う。

```clojure:routes.clj
(ns v2okimochi-api.routes
  (:require [integrant.core :as ig]
            [io.pedestal.http :as http]
            [io.pedestal.http.body-params :as body-params]
            [io.pedestal.http.route :as route]
            [v2okimochi-api.handler.sample-responses :as sample] ; これは自作
            [v2okimochi-api.interceptors :as interceptors])) ; これも自作

;; 文字列を変数に押し込んだだけです
(def charset-shift-jis "shift-jis")
(def charset-utf-8 "utf-8")

(defmethod ig/init-key ::routes
  [_ options]
  (let [common-interceptors [(interceptors/set-charset charset-shift-jis)
                             http/json-body]]
    #(route/expand-routes
      #{["/okimochi" :get
         (conj common-interceptors `sample/okimochi-response)]})))
```

- これはレスポンスをJSON変換して返すだけのやつ
- `set-charset`をjson-bodyの上に差し込むことで、JSON変換されたレスポンスの文字コード部分だけを変える（この場合はShift-JISになる）
- `set-charset`では `文字コードが既に指定されている場合`、 `Content-Typeはあるが文字コード指定が無い場合`、 `Content-Typeすら無い場合（たぶん）`に合わせて文字コードを狙い撃つ


# まとめ
- 文字コードを変えるだけ
- 頑張らなくても良かった（）
- インターセプターﾁｮｯﾄﾜｶｯﾀ
- 文字コード変換系、需要無いのかな。。。
クエリで Project Euler Problem 3

## 【お題】
[Problem 3](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%203 "Problem 3 - PukiWiki")。
> Problem 3 「最大の素因数」 †
> 13195 の素因数は 5, 7, 13, 29 である.
> 
> 600851475143 の素因数のうち最大のものを求めよ.

## 【環境】
| SQLServer | SQLCMD |
| ---- | ---- |
| 2017 | 14.0.1000.169 |
設定はデフォルト。

## 【クエリ】
普通に考えたら素因数分解だよな。というか、それ以外自分の頭では思いつかなかった。
実装例は以下。

```SQL
DECLARE @Num    DEC(12, 0) = 600851475143;

;WITH [CTE_Calc]([被除数], [除数], [剰余]) AS (
    SELECT
          @Num
        , 2
        , CONVERT(DEC(12, 0), @Num % 2)
    UNION ALL
    SELECT
          CONVERT(DEC(12, 0), [被除数])
        , [除数]
        , CONVERT(DEC(12, 0), [被除数] % [除数])
    FROM (
        SELECT
              IIF([剰余] = 0, [被除数] / [除数], [被除数])
            , IIF([剰余] = 0, [除数], [除数] + 1)
        FROM [CTE_Calc]
    )t([被除数], [除数])
    WHERE   [被除数] > 1
)
SELECT MAX([除数]) FROM [CTE_Calc]
WHERE   [剰余] = 0
OPTION (MAXRECURSION 0)
;
GO

-----------
       6857

(1 行処理されました)
```

しかも試し割り法。最も単純なアルゴリズムとされているので説明は不要だろう。
最初は 2 で割り続け、割り切れなかくなったら 3 で……と除数を増やしていくだけの簡単なお仕事。

対象の数値が 12桁と比較的大きいので処理時間が心配だったが、蓋を開けてみたら一瞬だった。これで良しとしますか。
先生出番です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/402b0220-cb43-9f28-517c-51229e2ee261.png" width=40%>
The hogeView outlet from the hugaViewController to the UIView is invalid. Outlets cannot be connected to repeating content. の対策

# 状況
```
The hogeView outlet from the hugaViewController to the UIView is invalid. Outlets cannot be connected to repeating content.
```

# 原因
VCの`cellとかcollectionView`の`delegate`の関数(つまり使いまわす系の関数)で
`cellとかcollectionView`の中にUI置いてVCと繋ぐ時に起きる

# 対策
コードでどうにかしたいならVCではなく
`cell`や`collectionView`を新たにswiftファイルを作成する
[ITミステリー]旅行から帰宅したらデスクトップPCのネットワーク接続ができなくなっていた

毎日自宅で使用しているため寝るときも電源を落とさないデスクトップPC。
2泊3日の旅行だったのでさすがにシャットダウンをして出かけました。

帰宅したその日は疲れていたのでPCの電源を入れることなく、スマホが自宅のWi-Fiに接続されていることを確認してちょっと動画閲覧やTwitterなどを見て就寝しました。

次の日、デスクトップPCを起動すると一切ネットワークに接続できなくなっていました...。

### 原因究明開始

スマホやノートPCがLANもインターネットもWi-Fi経由で接続できていたのでONUやルーターは正常だとわかりました。
LANケーブルの断線を疑い、デスクトップPCに接続されているLANケーブルを引き抜いてノートPCに挿し、接続可否を確認したところ接続可能でした。

デスクトップPCもスタンドアロンで正常に動いていたのでハード故障の可能性はないと踏みました。

### ネットワーク調査

ネットワークは専門外ですが無い知恵を絞って調査しました。

##### 自宅のネットワーク構成

| IP | コンピューター |
|:-:|:-:|
| 192.168.0.1 | ONU兼ルーター |
| 192.168.0.2 | デスクトップPC |
| DHCP | ノートPC, スマホ, ゲーム機 |

##### `ping`コマンド
Webアプリ開発をデスクトップPCで行ってスマホブラウザで動作確認することがあるのでデスクトップPCのIPアドレスだけ固定していました。

そこでノートPCを用いて`192.168.0.2`に対して`ping`コマンドを叩いてみます。結果は応答ありでした。

なのでデスクトップPCは少なくともLANには接続できていると考えていました。

##### `nbtstat`コマンド

デスクトップPCにはわかりやすいコンピューター名をつけています。なのでIPアドレスからコンピューター名を調べる方法をネットで見つけて試しました。

```
nbtstat -A 192.168.0.2
```
結果は設定しているコンピューター名を得ることができませんでした。

##### `ipconfig`コマンド

ノートPCにて`ipconfig`を実行してその瞬間のIPアドレスを確認して、デスクトップPCからそのIPアドレスに対して`ping`コマンドを実行しました。

結果は「要求がタイムアウトしました。」…。

デスクトップPCはLANにすら繋がっていないとそこで気づきました。

今度はデスクトップPCにて`ipconfig`コマンドを実行しました。
結果、デスクトップPCのIPアドレスが`169.254.253.180`(多分変動する値)に自動設定されていることがわかりました。

##### `ping`が届いた`192.168.0.2`の正体は一体…？

デスクトップPCには設定されていないのに`ping`が届く謎のアドレス`192.168.0.2`の正体を解明すべく、我々はAmazonの奥地へ向かった…。

わけではなくスマホにネットワーク管理アプリを入れているのを思い出しました。[Fing](https://play.google.com/store/apps/details?id=com.overlook.android.fing&hl=ja)というアプリです。
そのスマホが接続されているネットワークにほかに接続している端末の情報を一覧できます。

そこでIPアドレス一覧を確認し、`192.168.0.2`の正体を発見しました。

正体は、そのスマホだったのです。

### DHCPの罠

普段デスクトップPCの電源を落とさないため、DHCPによって`192.168.0.2`が他の端末に割り当てられることはありませんでした。
しかし、旅行のためデスクトップPCをシャットダウンして3日が経っていました。そして帰宅してデスクトップPCの電源を入れることなくスマホをWi-Fiに接続した結果、`192.168.0.2`がスマホに割り当てられてしまいました。

その後電源が入れられるデスクトップPCにはDHCPが設定されていないので`192.168.0.2`でネットワーク接続をしようとします。しかし`192.168.0.2`はすでに利用されているため、後から接続しようとしたデスクトップPCのほうがネットワークから遮断されることになってしまったのです。

今回の騒動(自分ひとり)で固定IPアドレスとDHCPが混在する場合は配布するIPアドレスのレンジを設定しなければならないという知見を得ました。

### 情報処理試験が役立ちました

IT関係の仕事をしていると情報処理試験が必要か否かの対立を何度も見かけることかと思います。
僕は基本情報、応用情報を経てDBスペシャリストを取得していますが、ネットワークに関してはスペシャリスト試験も受けていないし業務でも触れていません。

しかし、今回の自宅のネットワークがつながらない問題では基本情報、応用情報のネットワーク分野の知識が非常に役立ったと感じています。

案外わるないIPA！(ヤ〇イT〇ャツ屋〇ん)

<br/>
<br/>
それにしても今回の事案、そのまま基本情報の問題にしてくれてもいいと思う。
Windows + Leiningenで日本語の文字化けを起こす原因がJVMだった場合

# WindowsでClojureを使う際の文字化け
- Clojureと書くが…実はJVMの話だった（前置き）
- Windows10 + LeiningenでClojureのAPIを作っていると、 `文字コードUTF-8を指定しているはずなのに実際にはShift-JISのままになっていて日本語が文字化け`する
- DockerでMySQL DBを立てたりしてると `どっちに原因があるのか戸惑う`（余談）





# 原因がJVM optionsにある場合
今回はコレだった。WindowsでJVMを使っていると良くある？
（javaで起きている様子 https://teratail.com/questions/125729）

要するにJVMは、文字コードを指定しない場合は `環境変数などから得られた文字コード`を使うので、Windowsの場合はデフォルト文字コードである **例のShift-JIS**を選択してしまう…ということらしい。
参考 https://qiita.com/seraphy@github/items/98e2908b63af58ef0032

そんな状態を放置したまま、偶然 **API開発で `Pedestal`の `http`の `json-body`インターセプターを利用していたりする**と大ダメージを受ける

※ [pedestal.http/json-body](https://github.com/pedestal/pedestal/blob/f0df4a5ac983fd4e7d0a4f667bffb0ad5938d56e/service/src/io/pedestal/http.clj#L115-L127)はレスポンスをJSON変換するついでに `ちゃっかり文字コードをUTF-8指定している`ので、Shift-JISだろうが何だろうが問答無用でUTF-8として返してしまう（そして文字化けする😇）





# JVMの文字コード指定をしてどうにかする
Leiningenを使っている場合は、 `project.clj`にjvm-options `:jvm-opts`を追加することでJVM optionsを指定できる。
参考 https://stackoverflow.com/questions/25461955/leiningen-project-program-cant-output-non-ascii-string-in-windows

※ そしてこの参考リンクでは書き方が間違っている😇 
たとえば `:jvm-opts ["-Dfile.encoding" "UTF-8"]`と書こうとすると `java.nio.charset.IllegalCharsetNameException`を引き起こす。
正しくは **`:jvm-opts ["-Dfile.encoding=UTF-8"]`**

今回はJVMがUTF-8を使っていなかった（Shift-JISだった）ことが原因だったので、 `:jvm-opts ["-Dfile.encoding=UTF-8"]`を加えてファイルエンコーディングをUTF-8にすることで解決。





# まとめ
- `Shift-JISじゃね？`と思ったらJVMが原因のこともある
- Leiningenなら `project.clj`に `:jvm-opts ["-Dfile.encoding=UTF-8"]`追加

※ 別解として `~/.lein/profiles.clj` ([ドキュメント](https://github.com/technomancy/leiningen/blob/master/doc/PROFILES.md))に `{:user {:jvm-opts ["-Dfile.encoding=UTF-8"]}}`と書いても良さそう（自分1人で使ってチームメンバーに影響を与えない運用とかするならそっちのが良さそう）
SikuliXのclick関数を使いやすくする

# SikuliXのclick関数を使いやすくした

## click関数の問題点
click関数とsleep関数を並べていくとソースコードが長くなる
https://qiita.com/JINPLAYSGUITAR/items/0fdadac1ebb7e9289f2d

## 対応
自分で関数を用意する

### 機能概要
- 指定した画像をクリックすると指定した時間待つ
- 引数は画像と数値(秒数)とする
- 最速で画像の有無を判断する
- 画像が見つからない場合はループする
- 5回ループしたらエラーを返して終了する

### ソースコード
```python:pricone.py
#共通関数
def waitClick(cap, time):
    index = 0
    while 1:
        if exists(cap):
            click(cap)
            sleep(time)
            break
        index = index + 1
        if index == 5:
            print("error")
            click(cap) #エラー発生させる
            exit()

#呼出方法
waitClick("1571732207730.png", 5)
```

## 参考
https://sikulix-2014.readthedocs.io/en/latest/region.html#Region.click

おわり
AWS CDKをDocker環境で実行する方法

# 手順
dockerとdocker-composeがインストールされている環境で、以下の通り準備および実行します。

## 0. ディレクトリ構成
aws-cdk
- Dockerfile
- docker-compose.yml
- docker-compose-run.sh

**以下、aws-cdkディレクトリ内での作業となります。**

## 1. Dockerfileを作成
Pythonの公式コンテナイメージを使って、AWS CDK入りのコンテナイメージを作成します。
必要なコマンドをDockerfileに書き連ねていきます。
インストールされるAWS CDKはPython3対応です。

```Docker:Dockerfile
# the latest Python
FROM python:latest

# install the latest nodejs & npm
RUN apt update \
    && apt install -y nodejs \
       npm \
    && apt clean

# install the latest AWS CDK
RUN npm install -g aws-cdk \
    && pip3 install --upgrade aws-cdk.core
    
# install the latest AWSCLI
RUN pip3 install awscli --upgrade
```

## 2. docker-compose.ymlを作成
AWS CLIの認証情報を持つための、コンテナ側の環境変数を定義しておきます。
後にdocker-compose runを実行する時に、ホスト側の環境変数から渡すようにしています。
これは、不特定多数が使う可能性のあるコンテナイメージの構成情報と言えるdocker-compose.ymlそのものに、認証情報を埋め込まないための対策です。

```YAML:docker-compose.yml
version: '3'
services:
  aws-cdk:
    build:
      context: ./
      dockerfile: ./Dockerfile
    image: aws-cdk
    container_name: aws-cdk
    tty: true
    environment:
      AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
      AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
      AWS_DEFAULT_REGION: ${AWS_DEFAULT_REGION}
      AWS_DEFAULT_OUTPUT: ${AWS_DEFAULT_OUTPUT}
```

## 3. docker-compose buildを実行
docker-compose buildを実行すれば、コンテナイメージの出来上がりです。

```shell:bash
$ docker-compose build
(結果は省略)
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
aws-cdk             latest              6bf38dcfd3e6        27 minutes ago      1.16GB
python              latest              d6a7b0694364        2 weeks ago         932MB
```

## 4. docker-compose-run.shを作成
各自で払い出したAWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEYで<>ごと置き換えてください。
--rmはテスト用で入っていますが、お好みで外してください。
ここで指定したアクセスキーはdocker-compose runする時に渡されます。

```shell:docker-compose-run.sh
#!/bin/bash

export AWS_ACCESS_KEY_ID=<各自のAWS_ACCESS_KEY_ID>
export AWS_SECRET_ACCESS_KEY=<各自のAWS_SECRET_ACCESS_KEY>
export AWS_DEFAULT_REGION=ap-northeast-1
export AWS_DEFAULT_OUTPUT=json

docker-compose run --rm aws-cdk /bin/bash
```

注: gitに上げないようにしましょう。

## 5. docker-compose-run.shを実行
4.で作っておいた.shを使ってコンテナを起動します。

```shell:bash
$ ./docker-compose-run.sh
root@23c8612bfd7b:/# aws --version
aws-cli/1.16.272 Python/3.8.0 Linux/4.14.146-93.123.amzn1.x86_64 botocore/1.13.8
root@23c8612bfd7b:/# cdk --version
1.15.0 (build bdbe3aa)
```

簡単かつ少ない手順で、AWS CDKをコンテナで動かすことができました。
【Kotlin】ギャラリーから画像を選択して、ImageViewに表示する

公式サイトを参考に、ストレージ アクセス フレームワーク（SAF）を使用する。
[ストレージ アクセス フレームワークを使用してファイルを開く  |  Android Developers](https://developer.android.com/guide/topics/providers/document-provider?hl=ja)

コードはGitHubに載せています。
https://github.com/orimomo/picture-frame-app/tree/master

# 1. ギャラリーを表示する
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/8fdceaad-f371-9809-ed6c-ec26a2245896.png" width="320"/>

## コードと解説
```kotlin
    private fun selectPhoto() {
        val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
            addCategory(Intent.CATEGORY_OPENABLE)
            type = "image/*"
        }
        startActivityForResult(intent, READ_REQUEST_CODE)
    }

    companion object {
        private const val READ_REQUEST_CODE: Int = 42
    }
```

* アプリが`ACTION_OPEN_DOCUMENT`インテントを開始すると、ピッカーが起動し、条件に一致するすべてのドキュメント プロバイダが表示される
* カテゴリ（`CATEGORY_OPENABLE`）をインテントに追加すると、結果がフィルタリングされ、画像ファイルなどの開くことができるドキュメントのみが表示される
* typeを指定することで結果をさらにフィルタリングし、画像 MIME データタイプのドキュメントのみを表示される
    * MIMEとは？ → [Android で MIME Type 判別](https://blog.mopp.jp/2011/12/android-mime-type.html)

# 2. 選択された画像をImageViewに表示する
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/74d0e53f-dcec-eafc-ffd1-568172af352d.png" width="320"/>

## コードと解説

```kotlin
    override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
        super.onActivityResult(requestCode, resultCode, resultData)
        if (resultCode != RESULT_OK) {
            return
        }
        when (requestCode) {
            READ_REQUEST_CODE -> {
                try {
                    resultData?.data?.also { uri ->
                        val inputStream = contentResolver?.openInputStream(uri)
                        val image = BitmapFactory.decodeStream(inputStream)
                        val imageView = findViewById<ImageView>(R.id.imageView)
                        imageView.setImageBitmap(image)
                    }
                } catch (e: Exception) {
                    Toast.makeText(this, "エラーが発生しました", Toast.LENGTH_LONG).show()
                }
            }
        }
    }
```

* ユーザーがピッカーでドキュメントを選択すると、`onActivityResult()`が呼び出される
    * 第一引数`requestCode`は要求コードで、ギャラリーから戻ってきたことを識別する
    * 第二引数`resultCode`は結果コードで、操作が成功した場合`RESULT_OK`が、ユーザーがバックアウトしたり、何らかの理由で失敗したりした場合は`RESULT_CANCELED`が返る
    * 第三引数`resultData`は取得したデータで、選択したドキュメントを指すURIには`resultData.data`でアクセスできる
    * 参考：[startActivityForResultのrequestCodeを理解する - Qiita](https://qiita.com/kskso9/items/01c8bbb39355af9ec25e)
* 画像ファイルからBitmapを生成し、ImageViewにセットする
Selenium IDE

#Selenium IDE使ってみた
学生時代はUWSCという自動化ソフトを使っていたが、Seleniumが人気みたいなので、とりあえず適当に使ってみた

Seleniumの使用にはpythonもしくはrubyが必要そうだが、ブラウザのアドオンでできるIDEというのがあったので、そちらをインストール。検索すればヒットするので拡張機能を入れるだけで大丈夫。

使い方については、英語で説明してくれるので、感覚的にわかる印象。プログラムができない人でも、自分の操作を勝手に記述してくれるので問題ない。

UWSCはマウスカーソルの動きを主軸にしているが、IDEはブラウザの画像やタグを利用しているようだ。

一長一短だが、俺はUWSCのほうが好きだな
Elixirの基礎の学習ロードマップ

Elixirの勉強を始めたときにあったらよかったなと思う **「基礎の学習のロードマップ」** を書いてみます。

この記事の対象は以下のような方です。

- Elixirでアプリケーションをまだ書いたことがない
- Elixirの基礎を固めたい

# 基礎の学習のロードマップ

以下の順に学習を進めるのがよいと思います。

1. iex
1. パターンマッチ、組み込み型、モジュール、関数
1. リストからのEnum

上記の順序は[プログラミングElixir](https://shop.ohmsha.co.jp/shopdetail/000000004675/)の進め方と同じです。
なぜ、この順序で学習すると良いかを書いていきたいと思います。

## iex

学習は「試す、間違える、調べる、試す、成功する」を繰り返し行うことで強化されます。

よって、 **「簡単に試せる、簡単に調べられる」** がとても大事です。
そして、それができるのがiexです。よって、まずiexを使えるようになりましょう。

iexとはElixirのREPL(Read Eval Print Loop)です。
入力されたコードを **「読み込み(Read)、評価(Eval)し、結果をプリント(Print)し、繰り返し(Loop)」** ます。 

「これってどうなるんだろう？どういう意味だろう？」と思ったら、その場でぱっと入力して確認できます。

```elixir
iex(1)> 1+1
2
```

簡単に試せます。

### IExヘルパー h

次は簡単に調べる方法を紹介します。以下を入力してください。

~~~elixir
iex(2)> h
~~~

「h」はiexで最も重要な機能、IExヘルパーの「h」です。表示されたのはiexのドキュメントです。
分からないことがあったら、いつだって「h」で確認しましょう。

~~~elixir
iex(3)> h Enum # Enumモジュールのドキュメントが表示されます。
~~~

### h以外の抑えておくべきIExヘルパー

~~~elixir
iex(4)> i variable # 変数情報の表示
~~~

iexで試行しているときに変数の情報が見たくなったときに使えます。
組み込み型を学習するときに使ってみてください。

~~~elixir
iex(4)> c "module_name.ex" # モジュールファイルのコンパイル
iex(5)> r ModuleName # モジュールのリコンパイル
~~~

作成したモジュールをcでコンパイルして試し、間違いを見つけて修正したらrでリコンパイルして試す。
手返しよく試せるので効率が上がります。

## パターンマッチ、組み込み型、モジュール、関数

これは各自宿題！

Elixirでプログラミングをする上でリスト、Enumに習熟する必要があります。
そのためにはパターンマッチ、組み込み型、モジュール、関数を先に理解する必要があります。

リファレンスを読んで、iexで試して、調べて、学習しましょう。

- [プログラミングElixir](https://shop.ohmsha.co.jp/shopdetail/000000004675/)
- [https://hexdocs.pm/elixir/Kernel.html](https://hexdocs.pm/elixir/Kernel.html)
- [ElixirSchool](https://elixirschool.com/ja/)

[プログラミングElixir](https://shop.ohmsha.co.jp/shopdetail/000000004675/)はおすすめです。

## リスト、Enum

プログラミングとは「データを取り扱うロジックを作る」ことです。
そして、Elixirにおいてデータの取リ扱いで活躍するのがEnumモジュールです。

Enumをなんとなく理解して、なんとなく使うことはできると思います。
でも、思うようにデータ変換できなくて困ったことはありませんか？僕は今でもよくあります。

それはEnumモジュールを正しく理解していないことが原因のひとつかもしれません。
よって、基礎を固めるためにEnum、そしてその元となるリストを正しく理解することが大切です。

# 終わり

Elixirの基礎の学習ロードマップを書いてみました。
何となく使えるの先に進むためにちゃんと理解をすることが大切です。（自戒を込めて）

次はリストを使ってEnumモジュールを実装することでEnumの理解を深める **[作って学ぶEnumモジュール](https://qiita.com/pojiro/items/8865ccbde8a62174e52e)** を書く予定です。

**「いいね」よろしくお願いします！** :wink:
FrontISTRのインストールにautofistrを使用した時のメモ

###はじめに
Windows10, WSL(Ubuntu)環境にFrontISTRの環境をインストールしたく、自動ビルドツールのautofistrを使用しました。
第56回[FrontISTR研究会](https://www.frontistr.com/)より、後藤氏による「FrontISTRビルドツールの紹介」を参考に実行しました。
途中でうまくいかなかったところもあったのでメモを兼ねて。

###インストールの流れ

1. githubからautofistrをダウンロード。
2. FrontISTRをダウンロード。autofistrのディレクトリ直下にFrontISTRを配置。
3. Makefile.inに自分のインストール環境を記載。自分の場合は以下の通り。
4. makeと叩いてしばらく待ちます。わりかし時間かかります（>2,3時間くらい）。

Makefile.inの内容

```
# BUILD_TYPE: {RELEASE, DEBUG}
BUILD_TYPE = RELEASE

# COMPILER: {INTEL, GCC, FUJITSU}
COMPILER = GCC 

# MPI: {IMPI, OpenMPI, MPICH, FUJITSU}
MPI = OpenMPI

# DOWNLOAD_MPI (optional): {true, false}
DOWNLOAD_MPI = true

# BLASLAPACK: {MKL, OpenBLAS, ATLAS, FUJITSU, SYSTEM}
BLASLAPACK = OpenBLAS

# when BLASLAPACK==SYSTEM, BLASLIB and LAPACKLIB can be specified
# BLASLIB (optional): system BLAS lib (default: -lblas)
#BLASLIB = -lblas
# LAPACKLIB (optional): system LAPACK lib (default: -llapack)
#LAPACKLIB = -llapack
# SCALAPACKLIB (optional): system SCALAPACK lib (default: -lscalapack)
#SCALAPACKLIB = -lscalapack

# NJOBS (optional): number of parallel make jobs (default: 1)
NJOBS = 4

# misc. options
# Old style build with setup.sh instead of cmake
#fistrbuild = old
# Use metis4/parmetis3 instead of metis5/parmetis4
#metisversion = 4
```

ダウンロードはこちらから。
autfistr
https://github.com/kazuya-goto/autofistr
frontISTR
https://github.com/FrontISTR/FrontISTR

なお、以下注意のようです（前述資料より抜粋）。

---
使用する全ての外部パッケージのライセンス条件に同意していることを前提としています。
• 初めて利用するパッケージがある場合は、
• make extract を実行
（ダウンロードしたアーカイブを展開したところで止まる）
• 各パッケージのディレクトリにあるライセンス条件を確認
• 問題なければ make を実行

---

###エラーの概要
コンパイルの途中で、以下のエラーが出て停止しました。

```
common_file_compress.c:65:10: fatal error: zlib.h: No such file or directory
 #include "zlib.h"
          ^~~~~~~~
compilation terminated.
```

zlib.hを探せないらしい。zlibとは何ぞや？
→圧縮関係のやつかな？
　https://ja.wikipedia.org/wiki/Zlib

zlib自体の詳細はよく理解しませんでしたが、zlibがインストールされていない場合の解消法がちょうどあったので、参考に
https://embedded.hatenadiary.org/entry/20081101/p3
以下は、前記記事の内容になります。

---

```
$ sudo apt-get install apt-file
$ sudo apt-file update
$ apt-file search zlib.h
```
たくさんあるので、絞り込んで

```
$ apt-file search /usr/include/zlib.h
zlib1g-dev: /usr/include/zlib.h
```
zlib1g-devをインストール。

```
$ sudo apt-get install zlib1g-dev
```
---

インストール後に、再びmake。
そのまま、うまくインストールできたようです◎

###おわりに
FrontISTRのインストール、もちろんビルドツール使わずともできますが（下の記事とか）、やっぱり使うと楽でした。
この手のインストールのやつは、よくわからんエラーでつまずくことも多く、今回はそういったことがほとんど無かったので、非常にありがたかったです。
https://qiita.com/sakurano/items/4a45d6667344528dc93d
https://qiita.com/nqomorita/items/b347ac8171e60d6b6e55

以上です。
WEBrickの使い方メモ

# 前提
- 前提： Ruby 2.6

```sh:実行方法
# 本記事全般的に↓だけ
> ruby xxx.rb
```

# サンプル1
最も簡単な例。
アクセスするとNot Foundは返答される。

```ruby:test1.rb
require 'webrick'

server = WEBrick::HTTPServer.new(BindAddres: '0.0.0.0', Port: 9292)
server.start
```

# サンプル2

`WEBrick::HTTPServer` のコンストラクタのパラメータに `DocumentRoot` を追加。
Not Foundでは無いが、そのディレクトリ内の資材の一覧が表示される。
ちなみに同一ディレクトリに `index.html` があると `index.html` の中身が表示される。

```ruby:test2.rb
require 'webrick'

srv = WEBrick::HTTPServer.new(
  DocumentRoot: './',
  BindAddress: "0.0.0.0",
  Port: 9292,
)

srv.start
```

# サンプル3

`WEBrick::HTTPServer` インスタンスの `mount` メソッドを用いて特定のファイルを表示します。下記例では `WEBrick::HTTPServlet::FileHandler` クラスを用いています。 `index2.html` の中身が表示されます。
`mount` メソッドの第2引数はインスタンスではなくクラスのもよう。
https://docs.ruby-lang.org/ja/latest/class/WEBrick=3a=3aHTTPServer.html#I_MOUNT

つまり `WEBrick::HTTPServer` のインスタンスの `mount` メソッドの引数に `WEBrick::HTTPServlet::AbstractServlet` を継承したクラスを渡す。

```ruby:test3.rb
require 'webrick'

srv = WEBrick::HTTPServer.new(
  DocumentRoot: './',
  BindAddress: "0.0.0.0",
  Port: 9292,
)

srv.mount('/', WEBrick::HTTPServlet::FileHandler, 'index2.html')
srv.start
```

# サンプル4

自前のサーブレットを登録してみるサンプル。画面に `do_get` という文字列が表示される。

```ruby:test4.rb
require 'webrick'

srv = WEBrick::HTTPServer.new(
  BindAddress: "0.0.0.0",
  Port: 9292,
)

class KureServlet < WEBrick::HTTPServlet::AbstractServlet
  def do_GET(req, res)
    res.body = "do_GET"
  end
end

srv.mount("/", KureServlet)
srv.start
```

# サンプル5

自前のサーブレットをもう少し色々試したメモ。
コンストラクタをオーバーライドすると `mount` メソッドの第3引数で指定した内容を取得できる。
`service` メソッドをオーバーライドするとブラウザアクセス（http get）しても `do_GET` メソッドは呼び出されない。

```ruby:test5.rb

require 'webrick'

srv = WEBrick::HTTPServer.new(
  DocumentRoot: './',
  BindAddress: "0.0.0.0",
  Port: 9292,
)

class KureServlet < WEBrick::HTTPServlet::AbstractServlet

  def initialize(server, name)
    super(server, name)

    p "server: #{server}, #{server.class}" # <WEBrick::HTTPServer:0xxxxxxxxxx>, WEBrick::HTTPServer
    p "name: #{name}" # mount の第3パラメータ
  end

  def service(req, res)
    res.body = "service"
    p "service"
  end

  def do_GET(req, res)
    res.body = "do_GET"
    p "do_GET"
  end
end

# 第3引数には、第2引数のクラスのコンストラクタに指定するパラメータを入力する
srv.mount("/", KureServlet, "mount third param")
srv.start
```

# 参考

WEBrickを使うためのメモ - 再帰の反復blog https://lemniscus.hatenablog.com/entry/20090722/1248261257#httpserverhandler
【入門】vimを布教されたので最低限のコマンドを覚えてみた。

「GUIのエディターからvimに乗り換えたい....。でもコマンド多すぎて何から覚えれば...?」
そんな方の為に
乗り換えがスムーズになるナレッジ、コマンド等を簡潔にまとめました。
まとめたものはこちら。詳しい解説は表の下をご覧ください。

| 絶対に使うコマンド       |        |
|:-----------------|:------------------|
| i     　　        | インサートモードに切り替え |
| esc　    　      | ノーマルモードに切り替え |
| ctrl + [  (escと同じ)| ノーマルモードに切り替え |
| ctrl + 3  (escと同じ)|  ノーマルモードに切り替え |
| :     |  コマンドモードに切り替え |
| :w     | 編集を保存 |
| :q     |  vimを閉じる |
| :q!     |  変更を保存せずvimを閉じる |
| :wq または :x     |  保存して閉じる |



| 移動系のコマンド       |  (取り敢えず矢印でいいかなぁ)      |
|:-----------------|:------------------|
| h、j、k、l         |それぞれ左、下、上、右に移動  |
| 3j         |           3行下に移動 |
| 5h         |           5行左に移動 |
| :13         |           13行目に移動 |


まずはファイルの開き方。

```terminal
vim index.html
```

カレントディレクトリにindex.htmlがない場合は......勝手に作られます。
やっぱり作成しない、と思った際にはコマンドモードからq!で脱出しましょう！


次にファイルの編集方法。

vimには最初に覚えるモードとして、コマンドモードとインサートモードがあります。
vimを開いた直後、`i`コマンドでインサートモードに切り替わります。
GUIエディターと同じような感覚で編集出来るのはインサートモードですが、GUIで使うようなコマンドは.......全然用意されていません。

コマンドを使うときには、コマンドモードで。
上記のファイルの保存、保存せず終了を出来るようになったら、
dd(一行切り取り),yy(一行コピー),pp(ペースト)等の
便利なコマンドを使ってみましょう。

ここがvimをあまり使わない人がvimに対して苦手意識をもち、vimmerからしたら、「超便利」と思う理由になっています。

インサートモードとコマンドモードを上手に使い分けましょう！
Next.jsにstyled-componentsを導入

この記事は下記のことについて書きます。

- Next.jsにstyled-componentsの導入方法
- Next.jsのbodyにglobalなcssの設定方法

参考にした記事はこちらになります。

- [styled-componentsを使ったCSS設計](https://qiita.com/taneba/items/4547830b461d11a69a20)
- [これからのReactのスタイリングにはStyled Componentsが最高かもしれない](https://blog.spacemarket.com/code/introduce_styled_components/)
- [Global styles and layouts](https://github.com/zeit/next.js/wiki/Global-styles-and-layouts)

## styled-componentについて

「[これからのReactのスタイリングにはStyled Componentsが最高かもしれない](https://blog.spacemarket.com/code/introduce_styled_components/)」に書かれているとおりになります。

> cssの定義を、class属性を利用してカプセル化して再利用しやすいようにするための仕組みです。StyledComponentsもこの流れではありますが、外部cssファイルではなくjsxファイルに定義するためそのファイル内でReactコンポーネントとレイアウト定義がカプセル化され感覚的にとても扱いやすくなります。

外部ファイルのglobalで管理されたcssを適用するのではなく、scopedされたcomponentでcssを管理/適用するということですね。

## Next.jsにstyled-componentsの導入方法

`styled-components`をinstall

``` command
$ yarn add styled-components
```

componentのclassNammeをハッシュさせるために`babel-plugin-styled-components `をインストールして`.babelrc`に設定

``` command
$yarn add -D babel-plugin-styled-components
```

``` json:.babelrc
{ 
  "presets": ["next/babel"], 
  "plugins": [
      ["styled-components"]
   ]
}
```

これで実装ができるので`ｈ1`タグにstyleをあてる

``` javascript:TitleStyled.js
import React from 'react';
import styled from 'styled-components';

export const H1 = styled.h1`
  font-size: 1.2rem;
`;
```

``` javascript:Title.js
import React from 'react';
import { H1 } from './TitleStyled';

const H1Title = () => (
  <H1>
    hoge
  </H1>
);

export default H1Title;
```

## Next.jsのbodyにglobalなcssの設定方法

componentごとのstyleは`styled-components`でカプセル化させますが、globalなcssに`reset.css`を適用したいのでその設定方法になります。

- 公式サイトを参考に`<head>`タグの直下に指定
- TypeScriptで記述

``` javascript:Layout.tsx
import * as React from 'react';
import Head from 'next/head';
import LayoutStyled from "./LayoutStyled";

const Layout: React.FunctionComponent<LayoutProps> = ({ children}) => (
  <>
    <Head>
      <meta charSet="UTF-8" />
      <title>タイトル</title>
      <meta name="description" content="" />
      <meta name="keywords" content="" />
    </Head>
    <LayoutStyled />
    {children}
  </>
);

export default Layout;
```

``` javascript:LayoutStyled.js
import React from 'react';

const LayoutStyled = () => (
  <style jsx global>
    {
      `
        body {
          color: #1a1a1a;
          font-family: 'Hiragino Kaku Gothic ProN', 'メイリオ', sans-serif;
          font-size: 14px;
          line-height: 1.4;
        }
      `
    }
  </style>
);

export default LayoutStyled;
```

この記述だとTypeScriptで`style`って何？となるので、別ファイルで定義

``` error:error
Property 'jsx' does not exist on type 'DetailedHTMLProps<StyleHTMLAttributes<HTMLStyleElement>, HTMLStyleElement>'.
```

``` javascript:next-env.d.ts
import 'react';

declare module 'react' {
  interface StyleHTMLAttributes<T> extends React.HTMLAttributes<T> {
    jsx?: boolean;
    global?: boolean;
  }
}
```

以上になります。
【備忘録】rails g controller でcoffeeの代わりにjavascriptを生成する

### 前置き
CoffeeScriptを使う予定がない。でもJavaScriptは使いたい。

rails g controller --no-assetsして、ファイルを手動で作成して...
やらなんやらするのが面倒な人向け。


### 環境
Rails 5.0.7.2
ruby 2.3.3

### 編集内容
以下ファイル内でApplication下に記述
javascript_engineで設定します。

```ruby:config/application.rb
class Application < Rails::Application

  config.generators do |g|
    g.javascript_engine :js
  end

end
```
これで出来た！

[参考にした資料(StackOverFlow)](https://stackoverflow.com/questions/24232570/how-to-configure-rails-3-2-4-to-generate-js-instead-of-js-coffee-by-default)
Functional ComponentでもReact RouterのwithRouterを使う方法

React RouterのwithRouterを、Class ComponentではなくFunctional Componentで使用する方法についてまとめます。

## 環境
- react v16.10.1
- react-router-dom v5.1.2

## 結論

1. コンポーネント全体をwithRouterでラップし、引数としてpropsを渡す
1. props.history.push("url")で遷移する

```jsx
import React from 'react';
import { withRouter } from 'react-router-dom'

// コンポーネント全体をwithRouterでラップする
export const MyComponent = withRouter(props => {

    function handlePageMove() {
            // 遷移先のパスを設定
            props.history.push("/Home");
    }

    return (
        <>
            <button
                onClick={handlePageMove}
            >Go to Home!</button>
        </>
    );
});

```


## 補足
- 親コンポーネントがある場合でも、子コンポーネントだけラップしたらOK

```jsx
import React from 'react';
import { withRouter } from 'react-router-dom'

const MyComponent = withRouter(props => {
    // 上記と同じ
});

// 親コンポーネントはwithRouterでのラップは不要
export const ParentComponent = _ => {
    return (
        <>
            <MyComponent />
        </>
    );
}
```
JavaScript で diff (内部仕様についての補足３)

  2019/10/14 に投稿した[Javascript で diff (通信なし、ローカルで完結)](https://qiita.com/stonee/items/e2d88f07d08171b2816f)の内部仕様についての補足、その３です。
 [Javascript で diff (内部仕様についての補足)](https://qiita.com/stonee/items/8964e801f27cd9433e01)
 [Javascript で diff (内部仕様についての補足２)](https://qiita.com/stonee/items/62aebae3a4ee07c76601)

(2020/09/10) ソースの更新にあわせて記述を修正しました。

# Indent Heuristic

前回は、単語単位の差分についてなるべく意味の区切りで差分をとる方法を検討しましたが、行単位の差分についても、なるべく意味の区切りで差分をとる方法を検討します。
(今のところ、実験的な度合いが強いです……)

![インデント_対策なし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513949/f3999140-94b9-4966-c66b-f3f0abdfabfb.png)

何も対策しない状態で先頭から一致する行どうしを組み合わせていくと、上記のような差分が生成されることがあります。
そこで、普通に差分を生成した後、hunk(不一致部分のかたまり)の境界位置をずらすことが可能かどうかを調べることにします。
例題の場合、右ファイルの5行目と2行目は同一の内容なので、hunkの境界を「3-5行目」から「2-4行目」にずらすことができます。
ただし、「}」が1行だけの差分などは境界位置をずらすと不自然な差分になるので、行数が１行だけのhunkは、境界位置をずらさないにします。

![インデント_対策あり.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513949/b9f13330-449e-2feb-945d-46e03507cfd0.png)

diff_orz では、基本的に先頭から一致行の組み合わせを生成しているので、境界位置をずらす方向は後ろ向き(行番号の若いほう)のみです。
機能を無効にしたい場合は、DiffEngine.bIndentHeuristic を false に設定してください。


```js
const DiffEngine = {
	bIgnoreCase: false,
	flgIgnoreBlank: 1,	//0:compare 1:ignore change 2:ignore all
	bDetectMovedBlock: true,
	bIndentHeuristic: true,	//Indent Heuristic の有無
	bDetectSimilarLine: true,
	bWord: true,
	bSemanticCleanup: true

	//後略...
}

```
PostgreSQLでJSONデータを扱うには（徐々に追記していく予定）

最近、JSON型のデータの扱いを聞かれて、すぐに回答できなかったので少し使ってみる。（何なら今までJSON型、JSONB型のデータを扱ったDBと縁がなかったので、勉強をサボっていた（汗））

非効率なことをしていたら、ツッコミをください。

# 本書で書くこと

- JSONB型で格納されたデータを一つのJSON配列に結合するためのSQL
- （今後、徐々に追記していくつもり）

# 環境情報

- PostgreSQL 11

# 1. JSONB型で格納されたデータを一つのJSON配列に結合
## やりたいこと

- 任意の複数行に存在するJSON配列を一つのJSON配列にまとめる。

例として、以下のテーブル定義とデータが格納されたテーブルを使う。

```
postgres=# \d bar
                Table "public.bar"
 Column |  Type   | Collation | Nullable | Default 
--------+---------+-----------+----------+---------
 id     | integer |           |          | 
 value  | jsonb   |           |          | 

postgres=# select * from bar;
 id |                           value                            
----+------------------------------------------------------------
  2 | [{"sample11": "text01"}, {"sample12": "text02"}]
  2 | [{"sample13": "text03"}, {"sample14": {"memo": "text04"}}]
  1 | [{"sample01": "text01"}, {"sample02": "text02"}]
  1 | [{"sample03": "text03"}, {"sample04": "text04"}]
(4 rows)
```

## これでできそう

```
postgres=# WITH elements as (select jsonb_array_elements(value) as v  from bar where id =2) select to_jsonb(array_agg(v)) from elements;
                                                 to_jsonb                                                 
---------------------------------------------------------------------------------------------------------
 [{"sample11": "text01"},{"sample12": "text02"},{"sample13": "text03"},{"sample14": {"memo": "text04"}}]
(1 row)
```

1. まずは、複数レコードでJSON配列のデータが格納されているので、このJSON配列を`jsonb_array_elements()`でJSON値の集合に展開する。
2. 次に`array_agg()`で取得したJSON値の集合を配列として結合する。
3. このままだと、TEXT型のデータ（バックスラッシュでダブルクォートがエスケープされた形）になっているので、`to_json()`でJSONB型のデータとして出力する


ちなみに今回はJSONB型でやっているけど、もちろんJSON型でも問題ない。その場合は`json_array_elements(json)`, `to_json()`を使う必要がある。


これで、まとめたJSON配列新たなレコードとして登録したりもできる。

```
postgres=# WITH elements as (select jsonb_array_elements(value) as v  from bar where id =2) INSERT INTO bar(id, value) select 3, to_jsonb(array_ag
g(v)) from elements;
INSERT 0 1
postgres=# select * from bar;
 id |                                                   value                                                    
----+------------------------------------------------------------------------------------------------------------
  2 | [{"sample11": "text01"}, {"sample12": "text02"}]
  2 | [{"sample13": "text03"}, {"sample14": {"memo": "text04"}}]
  1 | [{"sample01": "text01"}, {"sample02": "text02"}]
  1 | [{"sample03": "text03"}, {"sample04": "text04"}]
  3 | [{"sample11": "text01"}, {"sample12": "text02"}, {"sample13": "text03"}, {"sample14": {"memo": "text04"}}]
(5 rows)
```

# 2. 未着手

今後、追記しよう。

おわり。
archlinuxでスタバとかのwifiに繋ぐ

macに疲れて最近linuxデスクトップ(archlinux)に乗り換えたばかりの初心者ですが、
ある程度使えるようになったのでmac感覚で外で使おうとしたら、セキュリティなしのSSIDが`wifi-menu`で表示されなくて困ったので経験談を投稿させていただきます。

# 結論

`wifi-menu`じゃなくて`nmcli`使いましょう

# 僕がやったこと

### `networkmanager`入れる

テザリングでやりました。
そんなに大きいパッケージじゃないので、テザリングでもちゃちゃっと終わります。

- `networkmanager`入れる

```sh
sudo pacman -S networkmanager
```

- 競合しそうなデーモン`netctl`止める(要否不明)

```sh
sudo systemctl stop `netctl`
```

- `networkmanager`のデーモン立ち上げる

```sh
sudo systemctl start NetworkManager
```

### `nmcli`でつなぐ


- ssid 一覧を表示して、つなぎたい`SSID`を検索

```sh
nmcli d wifi list
```

- 接続

```sh
nmcli d wifi connect <つなぎたいSSID>
```

- 自動で認証画面を表示してくれたりとかしないので、自分でブラウザ立ち上げて適当なサイトにアクセスすると、認証画面に飛ばされました。
- 終わり

-----

こう、なにかにつけて課題が出てくるのがarchlinuxの楽しいところですね。
最初に書きましたが、初心者なので僕がやったやり方が最善ではないと思いますが、この記事が少しでも誰かの時短につながれば幸いです。
Swift：macのIP Addressを取得する

# SandBoxありの場合

```swift:
import Network

func getIPAddress() {
    var address: String = ""
    var ifaddr: UnsafeMutablePointer<ifaddrs>?
    guard getifaddrs(&ifaddr) == 0 else { return }
    var ptr = ifaddr
    while ptr != nil {
        defer { ptr = ptr?.pointee.ifa_next }
        let interface = ptr?.pointee
        let addrFamily = interface?.ifa_addr.pointee.sa_family
        if addrFamily == UInt8(AF_INET) || addrFamily == UInt8(AF_INET6) {
            if String(cString: (interface?.ifa_name)!) == "en0" {
                var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))
                let res = getnameinfo(interface?.ifa_addr,
                                      socklen_t((interface?.ifa_addr.pointee.sa_len)!),
                                      &hostname,
                                      socklen_t(hostname.count),
                                      nil,
                                      socklen_t(0),
                                      NI_NUMERICHOST)
                if res == 0 {
                    let str = String(cString: hostname)
                    if isIPAddress(str) {
                        address = str
                    }
                }
            }
        }
    }
    freeifaddrs(ifaddr)
    Swift.print(address)
}

func isIPAddress(_ address: String) -> Bool {
    let pattern = "^[\\d.]+$"
    return address.range(of: pattern, options: .regularExpression,
                         range: nil, locale: .current) != nil
}
```

# SandBoxなしでいい場合

```swift
import Foundation

var ip: String {
    let process = Process()
    process.launchPath = "/usr/sbin/ipconfig"
    process.arguments = ["getifaddr", "en0"]
    
    let pipe = Pipe()
    process.standardOutput = pipe
    process.standardError = pipe
    process.launch()
    
    let data = pipe.fileHandleForReading.readDataToEndOfFile()
    return String(data: data, encoding: .utf8) ?? "No connection"
}
```

# 参照

- [How to get Ip address in swift](https://stackoverflow.com/questions/25626117/how-to-get-ip-address-in-swift)
- [Swift 3.0 の String の正規表現](https://qiita.com/lovee/items/d5f1ecfbff90ffd5b0e5)
LaravelでPOSTメソッドのテストをする

# 環境・前提
Laravel Framework 5.8.35

# 要件
api/contactsにキーがnameで、値がTest NameのデータをPOSTしてデータベースに格納されるかテストする

# 準備
phpunitの設定ファイルに以下を追記する

```phpunit.xml
<server name="DB_CONNECTION" value="sqlite"/>
<server name="DB_DATABASE" value=":memory:"/>
```

# 作成及び編集するファイル一覧
1. tests/Feature/ContactsTest.php
2. app/Contact.php
3. routes/api.php
4. app/Http/Controller/ContactsController.php
5. database/migrations/2019_11_04_041040_create_contacts_table.php



# 1. artisanコマンドでテストをつくる

```terminal
$ php artisan make:test ContactsTest
Test created successfully.
```
以下のように編集する

```tests/Feature/ContactsTest.php
<?php

namespace Tests\Feature;

use App\Contact;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;

class ContactsTest extends TestCase
{
    use RefreshDatabase;//マイグレーションが実行されテーブルが作成される
    public function test_a_contact_can_be_added(){
        $this->withoutExceptionHandling();//エラーが起きても例外処理をしない
        $this->post('/api/contacts', ['name'=>'Test Name']);
        $this->assertCount(1, Contact::all());
    }
}
```


# 2. ルートを定義する
以下のように編集する

```routes/api.php
<?php

Route::post('/contacts', 'ContactsController@store');
```

# 3. artisanコマンドでモデルをつくる
```terminal
$ php artisan make:model Contact
Model created successfully.
```

```app/Contact.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Contact extends Model
{
    protected $guarded = [];//複数代入時に代入を許可しない属性を配列で設定
}
```


# 4. artisanコマンドでコントローラーをつくる
```terminal
$ php artisan make:controller ContactsController
Controller created successfully.
```
以下のように編集する

```app/Http/Controller/ContactsController.php
<?php

namespace App\Http\Controllers;

use App\Contact;

class ContactsController extends Controller
{
    public function store()
    {
        Contact::create([
            'name'=> request('name')
        ]);
    }
}
```


# 5. artisanコマンドでマイグレーションをつくる
```terminal
$ php artisan make:migration CreateContactsTable
Created Migration: 2019_11_04_041040_create_contacts_table
```

```database/migrations/2019_11_04_041040_create_contacts_table.php
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateContactsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('contacts', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');//nameコラムを追加する
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('contacts');
    }
}
```



# テストを実行する
```
$ clear && vendor/bin/phpunit --filter test_a_contact_can_be_added
OK (1 test, 1 assertion)
```

# 参考
http://recipes.laravel.jp/recipe/1
https://qiita.com/kk_take/items/3e0639ed605f74c34619
https://udemy.benesse.co.jp/development/web/laravel-model.html
インストールしたはずのherokuが毎回消えるのはなぜ？

<h1>問題点</h1>

以下のコマンド(Railsチュートリアル1章参照)でherokuをcloud9にインストールしたはずが、

```
$ source <(curl -sL https://cdn.learnenough.com/heroku_install)
```

再びcloud9を立ち上げると、

```
$ heroku --version
bash: heroku: command not found
```

と表示される。（あれ？インストールしたはずなのに）

<h2>解決策</h2>
毎回一番上のコマンドでherokuを再インストールしても良いが、それは些か面倒臭い。

ターミナルでvi ~/.bashrcを実行し、一番下の行に

```
source $HOME/.profile > /dev/null
```

を追加し、保存(escを押してから:wqを入力してエンター)したら、ターミナルで

```
$ source ~/.bashrc
```

を実行。再びheroku --versionを実行したら、

```
$ heroku/7.33.3 linux-x64 node-v11.14.0
```

と無事herokuがインストール済みであることが確認できた。
（sourceはbashrcの変更を反映するコマンドなのだそうです。これで毎回herokuをインストールする手間が省けます。）
[MacOS] Fix mvim, code command not found for zsh

Open your `~/.zshrc` and `/usr/local/bin` path to `$PATH`

```bash
export PATH="/usr/local/bin:$PATH"
```

Link your app such as mvim and code(vscode) to `/usr/local/bin`

```bash
cd /usr/local/bin
ln -s /Applications/Visual Studio Code.app/Contents/Resources/app/bin/code code
ln -s /Applications/MacVim.app/Contents/bin/mvim mvim
```
Windows Visual Staudio Codo の Remote Development で WSLに接続しようとした時エラーが出た話

# 目的

- Windows Visual Staudio Codo の Remote Development で WSLに接続しようとした時にタイムアウトエラーの解決方法をまとめる。

# 経緯

1. WLS環境をリセットした。
1. 今までRemote Developmentで接続できていたWSL環境に接続しようとした。
1. 下記画像のエラーが出た。  
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/0b0ecf0e-1148-53ba-b981-7a501c601975.png)

# 解決方法

1. Visual Studio Codeを開き、「ファイル」 → 「基本設定」 → 「設定」 → 設定の検索窓に`remote`と入力する。
1. 下記画像のように設定項目`Remote.WSL:Debug`と`Remote.WSL > File Watchr: Poling`にチェックを入れる。  
![キャプチャsetting.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/d1748b46-37d1-cf14-4706-8e65eb9a8441.png)
1. 再度WSLに接続を試みたところ接続に成功した。
Linux コマンドやスクリプトの実行ログをファイルに記載する

# 目的

- Linuxのターミナルで実行するコマンドやスクリプトの出力を全て(標準出力と標準エラー出力)ファイルに記載する方法を知る。

# 書き方の例

- 下記にコマンドやスクリプトの実行ログをファイルに記載する処理を記載する。

```terminal
# 一つのコマンド、スクリプトの実行ログを一つのファイルに記載するとき
$ 実行ログを記載したいコマンド 2>&1 | tee ログを記載するファイル名

# 複数のコマンド、スクリプトの実行ログを一つのファイルにどんどん追記して期待するとき
$ 実行ログを記載したいコマンド 2>&1 | tee -a ログを記載するファイル名
```

# より具体的な例

- ① コマンド`$ echo "aaa"`の実行ログをファイル`result_a.txt`に保存する。
- ② コマンド`$ echo "bbb"`の実行ログをファイル`result_b.txt`に保存する。

```terminal
# ①の処理
$ echo "aaa" 2>&1 | tee result_a.txt

# ②の処理
$ echo "bbb" 2>&1 | tee result_b.txt
```
C# 初心者の自分用メモ：変数と定数について

注意！　あくまで自分用のメモですので分かりやすさは追求してないのであしからず！
#C# 変数と定数についてまとめました
C#に限らず、プログラミングのほとんど（全部？）にある変数と定数についてまとめました。

##変数とは
ざっくり言うと、「値に対して名前を付けることで、名前によって値を使えるようにする仕組み」のこと。
**変数の型 変数名;** で定義できます。
※「変数の型」と「変数名」の間は半角スペースになります。

```C#
// 例
void Start() {
  string say;
  say = "Hello World";
  Debug.Log(say);
}
```
これをUnity上のplayボタンを押せばConsole上に「Hello World」と表示されます。
![Hello World.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507634/7e98f8e9-5351-4f04-e476-7a508a110c5f.png)

ここで**"say"の値である"Hello World"を変えるだけで、出力される値を変更することができます。**

#定数とは
変数は値を変えるものを格納しますが、定数では「一度決めたら値を変更しないもの」を格納します。
変えたくないのに変えてしまったというミスを防ぐことができそうです。
定数は**const 定数の型 定数名;** で定義できます。
変数の定義の仕方に加えて、頭に**const**を加えるだけです。

```C#
// 例
void Start() {
  const string sayConst; // 変数と区別するためにsayの後ろにConstを加えました
  sayConst = "Hello World";
  Debug.Log(say);
}
```
これをUnity上で読み込むと、先ほどと同じように「Hello World」と表示されます。
変数のときと違うのは定数の値を変えられないことで、仮に変更した状態で出力しようとしたらエラーが発生します。

#変数と定数の省略形
**変数の型 変数名 = "---";**
**const 定数の型 定数名 = "---";**
というように定義する際にそのまま値を格納することもできます。

```C#
// 例
void Start() {
  string say = "Hello World";
  Debug.Log(say);

  const string sayConst = "Hello World2";
  Debug.Log(say);
}
```
これでもちゃんと出力されます。

変数と定数はどの言語でも出てくると思うので、ちゃんと押さえておきたいです。
Accept-Languageヘッダーの取りうる値について

[自分のブログ記事](https://nyamanaka.com/articles/109)要約

- 値の例: `ja,en-US;q=0.9,en;q=0.8`
- `ja` ,`en` , `US` = 言語タグ。[IANAレジストリ](https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry)の `Subtag` のどれか。複数のサブタグをハイフンでつなぐ。数値かアルファベットのみ。文字数は8文字以内とされる。小文字大文字は区別しない。サブタグはだいたい言語コードか国コードが入る
- `;q=[0〜1までの少数3桁までの値]` = 品質値。言語タグの後ろにつく。 `;q=` の部分は固定値、数値はドットか0か1
- 言語を指定しない場合は `*`

RFCなど参照している根拠はブログに全部まとめたのでそちらを
TypeScriptのclassは暗黙のうちにinterfaceを定義しているのと同義

TypeScriptの`class`は、2つの役割がある。

1. コンストラクタのシグネチャを定義をする
2. クラスのインスタンスの型をインターフェイスとして定義をする

`class`と`interface`の線引きが比較的明瞭な言語(JavaやPHPなど)からすると、前者はすんなり理解できるものだが、後者には意外性があるかもしれない。「`class`を書いたら、`interface`も書いたことになる」ということだからだ。

TypeScriptの`class`定義の振る舞いをひとつひとつ確認していこう。

ここに、2つの属性を持った`Rect`クラスの定義がある。

```typescript
class Rect {
  x: number = 0
  y: number = 0
}
```

`new クラス名`がコンパイルに通るのは、1つ目の「コンストラクタのシグネチャを定義をする」役割によるものである。これは、クラスを使ったことがある経験があれば、何の不思議もないだろう。

```typescript
const rect = new Rect()
```

2つ目の役割である「クラスのインスタンスの型をインターフェイスとして定義をする」ことは、TypeScriptの興味深い仕様だ。先の`class Rect`のコードの裏で、次のような型定義がなされている:

```typescript
interface Rect {
  x: number
  y: number
}
```

型アノテーションで`Rect`が使えるのは、そのためだ。次のコードは、`new Rect()`の戻り値が`Rect`型であることを表現した一文であるが、これ自体は別段不思議はないだろう:

```typescript
const rect: Rect = new Rect()
            ^^^^
```

これと似たようなコードではあるが、次のサンプルコードはTypeScriptらしさがより強く分かる。

```typescript
const rect: Rect = { x: 3, y: 3 }
                   ^^^^^^^^^^^^^^
```

`rect`は型アノテーションで`Rect`型であることを宣言しているが、その値は`Rect`クラスではない。あくまで、`Rect`インターフェイスを実装したオブジェクトである。このコードはコンパイルがちゃんと通る。

ここまでで、`Rect`がインターフェイスであることが分かったので、もっとインターフェイスさがよく分かる例を見ていこう。

`Rect`はインターフェイスなので、普通の`interface`と同様に、クラスで`implements`することも当然のようにできる。

```typescript
class Cube implements Rect {
           ^^^^^^^^^^
  x: number = 0
  y: number = 0
  z: number = 0
}

const rect: Rect = new Cube()
```

`extends`と違うところは、`Cube`が`Rect`を継承しているわけではないというところだ。


`Rect`はインターフェイスなので、普通の`interface`の親にすることができる:

```typescript
interface Cube extends Rect {
^^^^^^^^^      ^^^^^^^
  z: number
}

const cube: Cube = { x: 1, y: 2, z: 3 }
const rect: Rect = cube
```

`Rect`はインターフェイスなので、普通の`interface`同様にopen-endedの特徴も持っている。したがって、`class`を定義とは別に、クラスと同名の`interface`を定義することで、Declaration Mergingを発生させることもできる。

```typescript
class Rect {
    x: number = 0
    y: number = 0
}

// 追加のインターフェイス定義
interface Rect {
  area(): number
}
```

上のコードでは、`Rect`に追加で`area()`メソッドを定義している。

もちろん、これだけでは`area()`メソッドの実装が存在していないので、`Rect`クラスを`new`しただけの次のようなコードでは、コンパイルは通るものの当然ながらランタイムエラーになる。

```typescript
const rect = new Rect()
rect.area() // runtime error: Uncaught TypeError: rect.area is not a function
```

## 所感

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">TypeScriptのclass = インスタンスのインターフェイス定義 + コンストラクタの定義<br><br>「classを書くと、暗黙的にinterfaceも定義している」ということになる。<br><br>これは、他の言語からすると「意外さ」でもあると同時に、TypeScriptの柔軟さを高める要素でもあるような気がする。 <a href="https://t.co/kMSNZWCLmy">pic.twitter.com/kMSNZWCLmy</a></p>&mdash; suin❄️Terraformエンジニア募集中 (固定ツイ参照) (@suin) <a href="https://twitter.com/suin/status/1191267494326984704?ref_src=twsrc%5Etfw">November 4, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 参考文献

- [Classes · TypeScript](https://www.typescriptlang.org/docs/handbook/classes.html#using-a-class-as-an-interface)
Arduinoでモーター制御

下記記事に沿って行った時のメモ。
https://deviceplus.jp/hobby/entry011/

いろいろ躓いたが、なんとか動いた。

●Arduinoインストールでつまづいたところ
・ユーザーをグループ登録
ls -l /dev/ttyACM0
sudo usermod -a -G dialout kanako
・実行権限付与
sudo chmod a+rw /dev/ttyACM0

●これでいいか確かめること
・ダイオード…標準整流ダイオードのはず。オレンジ色の。もはや何かわからないが、一応動いている。帯があるほうがカソード
・トランジスタ…東芝、Ａ１０１５Ｙと書いてある。５０Ｖ１５０ｍＡなのか？

●迷ったことメモ
・ダイオードの向き
・トランジスタの向き
・LEDの向き

●次にやること
・プロペラではなく枝をモーターにとりつける
　…プロペラアダプターを購入せねば。枝に穴を開けるのもどうやろう・・・
・複数モーターの制御