OmniAICreator/Qiita-1.07M huggingface dataset:
Azure DatabricksにSalesforce等のデータをJDBCで統合する

#はじめに

Azure DatabricksはSparkベースの解析プラットフォームで、Azure Blob、Azure Data Lake、Azure SQL Databasesといった、複数のソースから読み取ったデータをSparkで変換し、画期的なインサイトを得られます。

この記事では、Azure DatabricksからSalesforceにJDBCで接続する方法を記述します。
今回はSalesforceとの接続方法を取り上げますが、同じ手順で Eloqua、IBM Db2、Oracleやその他のデータソースにJDBCで接続できます。

#Salesforce用 DataDirect JDBCドライバをダウンロード＆インストールする

1.Salesforce JDBCドライバをAzure Databricksにアップロードする前に、ローカルコンピュータにDataDirect Salesforce JDBCドライバをまずインストールします。

2.DataDirect Salesforce JDBC ドライバを<a href="https://www.ashisuto.co.jp/datadirect/app_download/" target="_blank">こちら</a>からダウンロードしてください。

3.以下のコマンドをターミナルに入力するか、jarファイルのダブルクリックにて、ドライバをインストールします。

```console
java -jar PROGRESS_DATADIRECT_JDBC_SF_ALL.jar
```

4.対話型のjavaインストーラが起動しますので、ライセンス版、評価版にかかわらず、DataDirect for Salesforce JDBCドライバを任意の場所にインストールしてください。 

5.Salesforce JDBCドライバの他に、試用版として他のドライバも同フォルダに複数インストールされますので、他の接続先検証もできます。


#Salesforce JDBCドライバをAzure Databricksにアップロードする

1.Salesforce JDBCドライバをインストールしたフォルダに移動します。 フォルダのパスは以下の通りです。

```console
C:\Program Files\Progress\DataDirect\JDBC_60\lib\sforce.jar
```


2.［Clusters］に移動し、ワークロードを実行するクラスターを選択してください。
クラスター内で［Library］タブを開き、［Install New］をクリックします。 上記パスのSalesforceドライバを選択し、［Install］をクリックして、以下に示すようにドライバをクラスター内にインストールします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/40c051ca-05f9-233d-00ec-a66107ce81b9.png)


#Salesforceに接続する

1.新しいノートブックを開き、次のコードを実行してJDBCドライバがあるかどうか確認してください。

```console
Class.forName("com.ddtek.jdbc.sforce.SForceDriver")
```

2.以下のコードを実行してSalesforceに接続するためのJDBC URLを作成してください。コード内のユーザーネーム、パスワード、セキュリティトークン (任意) はご自分のものに置き換えてください。

```console
val jdbcHostname = "login.salesforce.com"
val jdbcSecurityToken = "Your Security Token"
 
// Create the JDBC URL without passing in the user and password parameters.
val jdbcUrl = s"jdbc:datadirect:sforce://${jdbcHostname};SecurityToken=${jdbcSecurityToken}"
 
// Create a Properties() object to hold the parameters.
import java.util.Properties
val connectionProperties = new Properties()
 
connectionProperties.put("user", "Your username")
connectionProperties.put("password", "Your password")
```

3.以下のコマンドを実行して、ドライバクラス名を設定します。


```console
val driverClass = "com.ddtek.jdbc.sforce.SForceDriver"
connectionProperties.setProperty("Driver",driverClass)
```


4.以下のコードを実行することで、Salesforceからデータの読み取りができるようになりました。以下に、Salesforceに接続して「Opportunity」テーブルのスキーマを印刷するコードの例を示します。 


```console
val opportunity_table = spark.read.jdbc(jdbcUrl, "Opportunity", connectionProperties)
opportunity_table.printSchema
```


5.まず、「Opportunity」テーブルの検索およびデータの印刷ができるようになります。

```console
display(opportunity_table.select("AMOUNT", "FISCALQUARTER").groupBy("FISCALQUARTER").avg("AMOUNT"))
```


6.これで、変換を適用するか、別のデータソースへ接続し、データを結合して変換を適用するかのいずれかができるようになりました。

Azure Databricksで接続できるデータソースの他に、Salesforce, Eloqua, IBM DB2, Oracleなど外部のデータソースを接続して、様々な場所に格納されたデータの統合分析ができるようになります。

これらのさまざまなデータソースには、DataDirect JDBCコネクタを使用することで接続が可能です。
igvメモリー設定

### 起こったこと
メモリー積み積みマシーンでメモリー不足エラーでファイルが開けないだと？？？？


## はじめに
DNAやRNAなどの核酸配列を読むマスィーンをシークエンサーを呼ぶ。
この内、10年以上前に実用化された、これまでのサンガーシークエンスなどでは
実現できなかった大量の配列を一気に読めるようになったシークエンサーを次世代シークエンさー、NGSと呼ぶ。
いつまで次世代やってんのというのはあるが、とりあえずNGSと呼ぶのさ。

で、NGSで吐き出された各種の配列情報は、アレヤコレヤの処理を経て、
例えば変異のリストや、例えば遺伝子産物の多寡のリストになっていく。

この中でよく出てくる中間ファイルにbamがある。
これは各種の配列情報に、然るべきアルゴリズムで位置情報を付与した後、
読み込み側道向上のためにバイナリ化したものである。
詳しくはこの辺を読もう。
http://array.cell-innovator.com/?p=3014

で、特定の遺伝子の、この領域について、アライメント、つまりそれぞれのリードに付与された位置情報を
視覚的に確認したいときには、それ用のビューワーが必要で、
その代表がigvである。
開発はおなじみの神様仏様Broad様である。

https://bi.biopapyrus.jp/rnaseq/mapping/igv/

で、ゲノム上の遺伝子の位置情報なんかを見るだけなら大したメモリー消費はしないんだけど、
例えば数十Gを超える巨大なBam(全エクソンや全ゲノムとかになるとこのレベル)を開こうとすると、メモリー不足で突然落ちたりする。
せめてエラーメッセージを吐けと思うんだけど、突然落ちる。
で、igvはjavaでうごいているので、物理メモリに余裕があるようであれば起動オプションの指定でなんとかなる。

## 解決策
igvの起動アイコンは、batファイルへのショートカットなのでここからbatファイルに至り、
javaの起動オプションを変更することで、一応メモリー不足問題に対応可能である。

### 起動アイコン
右クリック→その他→ファイルの場所を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676634/21ade5bf-85b9-c73d-e6b3-d16c6d89d202.png)


起動アイコンのフォルダが開かれる。
アイコンを右クリック→プロパティ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676634/cef30ed3-60d4-1380-1ada-e332f00805d9.png)


本命batファイルの場所が記載されている。
ワイの場合は

~~~
C:\Program Files\IGV_2.8.2\igv-launcher.bat
~~~

だった。バージョンが多少違うかもだが、他は大体同じじゃないかな？
適当なテキストエディタでそのファイルを開くと以下のような記載が。
このうち、下の赤四角が最大メモリーのオプションである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676634/c99c39f6-d454-3f8f-a85f-04cad3e2980c.png)

下は32Gまで使って良い、という設定にしたもの。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676634/f7ba3f5a-31a0-c649-fe0c-e4e4ea84907c.png)


あくまで設定の問題の場合。本格的にメモリー足りない場合はこれでは解決しない。
メモリーを足すか、たくさん積んだマシーンを使うかしよう。
Google Apps Script覚え書き

# 比較演算子 

比較演算子    |   意味
---|---- 
===|             等しい
!== |    等しくない
<   | 小さい
<=  | 以下
>=  | 以上
>   | 大きい


# 日付処理
JavaScriptとも微妙に違ってややこしい
https://www.relief.jp/docs/google-spreadsheet-gas-get-day.html
https://macprimary.white-doll.net/?p=304


---

# 関連ページ
- [Google Formへの入力があったら、Slackへ通知](https://qiita.com/kanonundgigue/items/9f517bed8119dce5070c)
【Nuxt.js】Nuxt文法編：fetch

🎈 この記事はWP専用です
https://wp.me/pc9NHC-vM


# 前置き

非同期通信に使えるfetchをご紹介🌟

APIからデータを取得する方法は2つ！
**fetch
asyncData**

2つの違いについても解説しました🎀👩‍🏫


⬇️asyncDataの記事はこちら
https://wp.me/pc9NHC-ut





# asyncDataとの違い

## 値のセット先が違う
**asyncData**：直接コンポーネントにセット
**fetch**：Vuexのstoreに格納📦


## 呼び出されるタイミングが違う
asyncData：インスタンス作成前
fetch：インスタンス作成後


> The Nuxt.js fetch hook is called after the component instance is created on the server-side: this is available inside it.

https://ja.nuxtjs.org/guides/features/data-fetching/


**【翻訳】**
Nuxt.jsフェッチフックは、
サーバー側でコンポーネントインスタンスが
作成された後に呼び出されます。
これは、その内部で使用できます。

違いはこれくらいです！
他はほとんど変わりません🌟


## 基本的にはasyncDataと同じ
### 使い方・書き方
asyncDataとほとんど一緒です👌
Promiseを返すか
async/awaitを使うかです💡
詳しい書き方はasyncDataの記事をご覧ください👀

### thisが使えない
thisを通してコンポーネントのインスタンスに
アクセスすることができません💥

### 使用箇所
pages内コンポーネントのみ使用可能





# fetch

## fetchとは

🎈 続きはWPでご覧ください👀
https://wp.me/pc9NHC-vM
降水量の単位換算

よくわすれるので覚書き。

# 降水量の単位換算
水の密度を$1 \mathrm{g/cm^3}$、蒸発熱を$2,500 \mathrm{kJ/kg}$とした場合、

```math
\begin{align}
1 \mathrm{[mm/day]} &= 1 \mathrm{[kg/m2/s]} \times (60 \times 60 \times 24 \mathrm{[s/day]}) / 1,000 \mathrm{[kg/m3]} \times 1,000 \mathrm{[mm]} \\
0.03456 \mathrm{[mm/day]} &=  1 \mathrm{[W/m^2]} \times (60 \times 60 \times 24 \mathrm{[s/day]}) / (2,500 \times 1,000 \mathrm{[J/kg]}) / 1,000 \mathrm{[kg/m^3]} \times 1,000 \mathrm{[mm]}
\end{align}
```

#ERA-interimの時間ステップ
ちょっとややこしい（なにも考えずにそのまま足してはいけない）
https://www.ecmwf.int/en/faq/what-are-steps-surface-daily-fields-era-interim
PythonでラズパイのCPU温度を測定する

Raspberry PiのCPU温度は`vcgencmd measure_temp`で取得できます。
モニタリング用に1秒ごと60回測定し、最後にその平均を表示するようにしました。

#### 追記
**軽量化した[改良版](https://qiita.com/genshibangou16/items/90021d4fb65577e954c9)を公開しました。**
情報を取得するモジュールを`subprocess`から`open`に変更して負荷を軽減しています。

#コード
使用言語はPython3.7です。
ラズパイではPythonと打つと標準ではPython2が出てきますが、3.7とは互換性がないのでエラーとにらめっこしないようお気を付けください。
え？そんなことするのは私だけですね。ハイ。
`sudo chmod a+x temp.py`で実行権限を付与して`./temp.py`とすれば動きます。

```python:temp.py
#!/usr/bin/python3.7

import subprocess
import time
import sys
import re

num = 60
ave = 0

print(subprocess.run('lsb_release -a', shell=True, encoding='utf-8', stdout=subprocess.PIPE).stdout)

try:
    while num > 0:
        temp = subprocess.run('vcgencmd measure_temp', shell=True, encoding='utf-8', stdout=subprocess.PIPE).stdout.split('=')
        freq = subprocess.run('vcgencmd measure_clock arm', shell=True, encoding='utf-8', stdout=subprocess.PIPE).stdout.split('=')
        volt = subprocess.run('vcgencmd measure_volts', shell=True, encoding='utf-8', stdout=subprocess.PIPE).stdout.split('=')

        temp = temp[1].replace('\n', '')
        freq = int(freq[1].replace('\n', '')) / 1000000000
        volt = volt[1].replace('\n', '')

        print('Temp: ' + temp + ', Freq: ' + f'{freq:.2f}' + 'GHz, Volt: ' + str(volt) + ' (' + str(num) + ')')

        ave += int(re.sub('\\D', '', temp))
        num -= 1
        time.sleep(1)
    print('Average: ' + f'{ave / 600:.1f}' + "'C (60s)")

except KeyboardInterrupt:
    sec = 60 - num
    print(' Aborted.\nAverage: ' + f'{ave / sec / 10:.1f}' + "'C (" + str(sec) + 's)')
    sys.exit()

```
#工夫したところ
夏休みの自由研究かよっていう見出しですがご容赦ください。
初心者なりに色々調べて書きました。
#####バージョン情報
~~めっちゃ要らないですが、~~最初にLinuxのバージョン情報を表示させてます。
ループ前の`print`の中にある`lsb_release -a`を書き換えれば好きなコマンドの実行結果を表示できます。
完全に自己満足です。
#####Subprocess
調べたところpythonからコマンドを実行するには`subprocess`が良いようです。
理由はよくわかりませんが長い物には巻かれろということで`subprocess`を使いました。
#####温度以外の値
温度だけではつまらないので（何が）、クロック周波数と動作電圧も表示するようにしました。
これが余計と思いきや見ていて結構面白いです。
私の環境では、意外と1.5GHzまでは使っていないですね。
#####KeyboardInterrupt
`Ctrl + C`でループを抜けられますがエラーが吐き出されてしまいます。
精神衛生上よろしくないということでループ処理を`try`で囲って`Ctrl + C`を`except KeyboardInterrupt`でキャッチしています。
こうすることでエラーも吐き出されませんし、抜けるときの処理も書き込むことができます。
#その他
- 変数`num`の`60`を変えれば測定する秒数を変えられます。
- 本ファイルを`/{hogehoge}`に置いて、`ln -s /{hogehoge}/temp.py /usr/bin/temp`とすれば任意のディレクトリで`temp`と打つだけで本プログラムを実行できます。
- 趣味グラマーの初投稿故にお見苦しい点が多々あるかと思いますが、ご容赦ください。
- 「プロ」グラマーの方、何かコメントがありましたら是非ビシバシとご指摘ください。
OpenCV、python、TensorFlowで物体検知を体験

Python3でOpenCV、TensorFlowを使った物体検知の体験した際の備忘録です。

#自分のPCの状態
私のmacにはpyenvでpythonは3.7.3が入っている状態です。virtualenvで仮想環境は作っていません。
Homebrewは入っています。
wgetが入っていない場合はターミナルから

```
brew install wget
```
でwgwtをインストールしておきます。


#OpenCVをインストール
OpenCVとはコンピューターで画像や動画を処理するのに必要な機能が実装されているライブラリです。(https://www.atmarkit.co.jp/ait/articles/1507/27/news154.html)

ターミナルで

```
brew install opencv
```

```
pip3 install opencv-python
```

こんな感じでカメラから映像を表示できるようです。
キーボードでqを押すと終了します。

```py

import cv2

cap = cv2.VideoCapture(0)

while(True):
    ret, frame = cap.read()
    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
```

#TensorFlowをインストール
TensorFlow(テンソルフロー)」とは、Googleが開発した機械学習のライブラリです。 

pipを更新して、tensorflowをインストールします。

```
pip install --upgrade pip
pip install tensorflow
```

よくわからなかったので、とりあえずtflite_runtimeもインストールしておきました。pytho3.7なので、下記のもの

```
pip3 install https://dl.google.com/coral/python/tflite_runtime-2.1.0.post1-cp37-cp37m-macosx_10_14_x86_64.whl
```


#物体検知を体験
https://qiita.com/deneimonmaru/items/159d318c29c98ff2030d
を参考にしてます。

物体検知のプログラムをダウンロードします。

```
git clone https://github.com/EdjeElectronics/TensorFlow-Lite-Object-Detection-on-Android-and-Raspberry-Pi.git
```

「TensorFlow-Lite-Object-Detection-on-Android-and-Raspberry-Pi」という長い名前のフォルダができます。フォルダ名が長いので、下記のコマンドで
**★1：フォルダ名を「object-detection」という名前に変更します**。

```
mv TensorFlow-Lite-Object-Detection-on-Android-and-Raspberry-Pi object-detection
```

「object-detection」フォルダの中に入ります。

```
cd object-detection
```

どなたかが学習してくれたモデルをダウンロードして、解凍します。
**★2：samplemodelに解凍されます（←「object-detection」フォルダの中に「samplemodel」フォルダが入っている状態：ここ大事）**

```
wget https://storage.googleapis.com/download.tensorflow.org/models/tflite/coco_ssd_mobilenet_v1_1.0_quant_2018_06_29.zip
```
```
unzip coco_ssd_mobilenet_v1_1.0_quant_2018_06_29.zip -d samplemodel
```


下記のコマンドを実行するとwebカメラから物体検知するプログラムが動き始めます。（立ち上がりまで少し待ちましょう）

```
python3 TFLite_detection_webcam.py --modeldir=samplemodel
```

次回実行する時もcdコマンドで「object-detection」フォルダの中に入らないと上記のプログラムは実行できないので、気をつけましょう。
ちなみにPyCharmから実行すると動きませんでした。
windowsでiverilog その61

#概要

windowsでiverilogやってみた。
遅いクロックを作る。

#サンプルコード

```
module osoi(input clk, input rst);
	reg [2:0] cnt = 0;
	reg up;
	wire clk2;
	assign clk2 = up;
	always @(posedge clk)
	begin
		if (cnt == 4)
		begin
			cnt <= 0;
			up <= 1;
		end
		else
		begin
			cnt <= cnt + 1;
			up <= 0;
		end
	end
	always @(posedge clk2)
	begin
	end
endmodule
```



以上。
Windows版のUE4のセーブデータはどこに出来るの？


UE4でゲームを作成するときに、実際にセーブデータってどこに出来るの？という件を調べたのでメモ。
Windowsの場合です。UE4のバージョンは4.22で調べましたが、4.25でも同じだと思います。
SteamやEpic Games Storeにゲームをリリースする際にクラウドセーブに対応する場合、実際に保存するフォルダがわからないと困りますよね。

# 結論

## エディタの場合
`プロジェクトフォルダ/Saved/SaveGames`

## パッケージビルドの場合

### Shipping以外

#### 作成されたパッケージの実行ファイルから起動した場合
`パッケージフォルダ/WindowsNoEditor/{プロジェクト名}/Saved/SaveGames`

#### Visual Studiosから実行した場合
`プロジェクトフォルダ/Saved/Coocked/WindowsNoEditor/{プロジェクト名}/Saved/SaveGames`

### Shippingビルド

`%USERPROFILE%\AppData\Local\{プロジェクト名}\Saved\SaveGames`

%USERPROFILE%はユーザーごとのドキュメントフォルダ、「ドキュメント」のひとつ上のフォルダです。
Explolerのアドレスバーに%USERPROFILE%と入力してEnterを押すとこのフォルダが開きます。

## もうすこし詳しく

要は開発中はプロジェクトフォルダのSavedに保存されますが、Shippingビルドしてゲームとしてリリースするバージョンではユーザーごとのフォルダに保存されます。

ここから応用編、Developmentでデバッグしながら実際のゲームと同じセーブデータを使用したい場合の方法。
起動時のオプションに "-SaveToUserDir"を指定してやると、Shippingビルドと同様にユーザーごとのフォルダがセーブデータのフォルダになります。

また、Savedというフォルダ名を変更したい場合は "-saveddirsuffix={追加フォルダ名}"というオプションを指定することで、Saved_{追加フォルダ名}というフォルダ名にすることができます。デバッグ時に対象セーブデータを切り替える場合などに使えそうです。

# まとめ
まあ、UE4のソースコードを見ればわかることですが、自分が忘れたときのために書いておきました。
【Rails入門】renderの使い方

# rendearの使い方

renderメソッドを用いることで、別のアクションを経由せずに、直接ビューを表示することができます。
**render("フォルダ名/ファイル名")**のように表示したいビューを指定します。
renderメソッドを使うと、redirect_toメソッドを使った場合と違い、そのアクション内で定義した@変数をビューでそのまま使うことができます。




```user_controller.rb
class UserController < ApplicationController
  def top
    @user = User.find_by(email: params[:email], password: params[:password])
    if @user

    else
      render ("home/signup")
    end

  end
end

```
GCP App Engine StorageのExcelファイル読込、内容変更、書込

# やりたいこと

<ol>
	<li>GCP StorageからExcelファイル読込</li>
	<li>Excel内容変更</li>
	<li>GCP StorageにExcelファイル書込</li>
	<li>ファイルダウンロード</ol></li>
</ol>

# Example

```python
# -*- coding: utf-8 -*-
import logging
from flask import render_template, Flask, Response
from google.cloud import storage
import openpyxl
from openpyxl.writer.excel import save_virtual_workbook
import io

app = Flask(__name__)

logging.getLogger().setLevel(logging.INFO)


@app.route('/applicationform/a0026', methods=['GET', 'POST'])
def a0026():
    client = storage.Client()
    bucket = client.get_bucket('★プロジェクト名★.appspot.com')
    blob = bucket.blob('a0025.xlsx')
    blob_io = io.BytesIO(blob.download_as_string())
    wb = openpyxl.load_workbook(blob_io, keep_vba=False)
    sheet = wb.get_sheet_by_name('★シート名★')
    sheet['K5'] = 'Test Test'
    save_data = save_virtual_workbook(wb)
    new_blob = bucket.blob('a0025_new.xlsx')
    new_blob.upload_from_string(save_data, content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
    res = Response(save_data, content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
    res.headers['Content-Disposition'] = 'attachment; filename="a0025_new.xlsx"'

    return res


if __name__ == '__main__':
    app.run(host='127.0.0.1', port=8080, debug=True)
```

## マクロ有のファイルの場合

**keep_vbaをTrueにする。**

```python
wb = openpyxl.load_workbook(blob_io, keep_vba=True)
```

**Content-Type「application/vnd.ms-excel.sheet.macroEnabled.12」に変更**

```python
new_blob.upload_from_string(save_data, content_type='application/vnd.ms-excel.sheet.macroEnabled.12')
res = Response(save_data, content_type='application/vnd.ms-excel.sheet.macroEnabled.12')
```

**拡張子変更**

```python
new_blob = bucket.blob('a0025_new.xlsm')
res.headers['Content-Disposition'] = 'attachment; filename="a0025_new.xlsm"'
```

#memo
<ul>
	<li>Excel処理はOpenPyXL使用</li>
</ul>
メモ

```python
c = [list(input()) for _ in range(h)]
```
..#
.#.
↓
[['.', '.', '#'], ['.', '#', '.']]


```python
def mcomb(n, k):
    if n == 0 and k == 0:
        return 1
    if n < k or k < 0:
        return 0
    return fac[n] * pow(fac[n - k], m - 2, m) * pow(fac[k], m - 2, m) % m

for i in range(1, S // 3 + 1):
    result += mcomb(S - i * 3 + i - 1, i - 1)
    result %= m
print(result)
```
数列の長さが n の時に S - 3×n を n 個に分配する場合分けの数
n種類のものから重複を許してr個選ぶ場合の数はnHr=n+r−1Cr通り.

##bit全検索
```python
#入力を受け取る
N, W = map(int, input().split())
a = list(map(int, input().split()))

#bitが2^n通りの部分集合全体を動きます
exist = False
for bit in range(2**N):
    #部分集合に含まれる要素の和
    sum_val = 0
    for i in range(N):
        #i番目の要素a[i]が部分集合に含まれるかどうか
        if bit & (1 << i):
            sum_val += a[i]

    #sum_valがWに一致するかどうか
    if sum_val == W:
        exist = True

if exist:
    print("Yes")
else:
    pritn("No")
```

```C++
#include <iostream>
#include <vector>
using namespace std;
int main(void){
    int n,w;
    cin >> n>>w;
    vector <int> a(n);
    for (int i=0;i<n;++i){
        cin >> a[i];
    }
    bool exist = false;
    for (int bit=0;bit<(1<<n);++bit){
        int sum = 0;
        for (int i=0;i<n;++i){
            if (bit & (1<<i)){
                sum += a[i];
            }
        }
        //cout << sum << endl;
        if (sum == w) exist=true;
    }
    if (exist) cout << "Yes" << endl;
    else cout << "No" << endl;
}
```
Webpackでurl-loaderでBase64エンコードしてバンドルした画像ファイルをThree.jsのテクスチャとして使用する

既存Wordpressサイトに埋め込まれるThree.jsのプログラムを作ってて、以前の納品時に画像ファイル（相対パスで指定してた）が読めなくて失敗したことがあったのでバンドルすることにした。

`webpack 画像ファイル バンドル`でググるとどうもurl-loaderというのを使うと良いらしい。

今度は`Webpack url-loader`でググると、css（やscss,sass）で使う場合や、HTMLのimg要素で使う場合の情報はたくさんヒットするが、Three.jsのテクスチとして使う場合の情報がなかなか見つからなかったのでまとめておく。

# TL;DR

### Webpack側
Webpack管理対象に画像ファイルを含める

```js:webpack.config.js
// 他の部分は省略
	module: {
		rules: [
			{
				test: /\.(gif|png|jpg)$/,
				loader: 'url-loader'
			}
		]
}
```

### 使用側
`Image`を介して読み込んだものを`THREE.Texture`に食わせる感じ

```ts
// @ts-ignore 
import imageData from "このファイルから画像ファイルへの相対パス"

const image = new Image()
const texture = new THREE.Texture(image)
image.onload = () => { texture.needsUpdate = true }
image.src = imageData
```

# ポイント
間違ってたら教えてください。。

- 画像ファイルはurl-loaderによってBase64文字列へエンコードされ、DataURLの形式でバンドル先jsに埋め込まれる。
- tsやjsでimportしている箇所はts-loaderやbabel-loaderによってDataURL（の取得処理）に変換される。  
（なので、小さめの画像を複数箇所で使う場合にurl-loaderは有効。）
- 画像ファイルのimportについての定義がないせいでimportはエラーを吐く（今回はts-ignoreした）  
[TypeScript未対応のモジュールをimportするときのエラー対策](https://qiita.com/ichironagata/items/58855c5108f2cbcd18b7)  
[TypeScript + Webpack でimport jpg](https://qiita.com/SierSetup/items/3a01dac27c877d5d46ae)
- requireでも取得できるが、文字列は`require(パス).default`で参照する必要がある。
- この場合、url-loaderをfile-loaderに変更すると動かなくなる。  
これは、`require(パス).default`がファイルのURLであることと、`image.src`がURL文字列を受けられないことが原因  
つまりimportは、渡されたものがファイルURLなら内容をフェッチし、DataURLならそのまま受け取る機能を持ってるということ？？？（よくわかってない）




## その他参考にした情報
[base64-as-texture-threejs.js](https://gist.github.com/emilio-martinez/d293ad7e6794cd2c954ee3c414e90173)
[webpackでcssとimageをバンドルする](https://qiita.com/koichirokamoto/items/1bdbee5dd5657012b5fa)
[img-loader, file-loader, url-loader, resolve-url-loader の違い](https://e-joint.jp/644/)
[How to use webpack file-loader with three.js?](https://stackoverflow.com/questions/57126769/how-to-use-webpack-file-loader-with-three-js)
[How to add an image file to Three.js using Base64 encoding](https://www.reddit.com/r/threejs/comments/f399lk/how_to_add_an_image_file_to_threejs_using_base64/)
Intellijの新機能 GitHubプルリクエスト機能 を試してみた

# 経緯

普段愛用している Intellij IDEAの、[2020.2の新機能](https://www.jetbrains.com/ja-jp/idea/whatsnew/)として

> IntelliJ IDEA 2020.2 では GitHub プルリクエストのレビューとマージを IDE 内から直接行うことが可能になりました。

とのことだったので、早速試してみました。

# 準備

* Intellij IDEAのバージョンを 2020.2に上げる
* `Preferences>VersionControl>GitHub` から、GitHubアカウントとの紐付けをする
* `View>Tool Windows>Pull Requests` を選択して、Tool Windows上に `Pull Request` を表示させる
* (任意) `VCS>Git>Create Pull Request` から、pullリクエストを作成する
<img width="480" alt="スクリーンショット 2020-07-31 15.05.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127631/4258f2b1-1bae-a979-bdad-6424d1a3f074.png">

# Intellij上でReviewしてみる

Pull RequestのTool Barを選択すると、先程作成したpullリクエストが表示されます。

<img width="1234" alt="スクリーンショット 2020-07-31 15.07.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127631/fa38923e-df5d-ef16-1b44-eb453f4021e4.png">

GitHubと同じように、Reviewコメントが書けます。
<img width="1310" alt="スクリーンショット 2020-07-31 15.08.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127631/b4ca29e6-f595-5df0-65d3-0daf6eb18232.png">
<img width="1314" alt="スクリーンショット 2020-07-31 15.09.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127631/d91ec9ca-cea0-fa61-f47d-666fdb748010.png">

さいごに、下のMergeボタンを押せばマージされるようです。
<img width="1216" alt="スクリーンショット 2020-07-31 15.15.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127631/f76721ae-1bd6-0972-697c-9b358e874622.png">

# まとめ

* わざわざブラウザを開かず、IntellijだけでReviewができました。
* レビューコメントのmarkdownプレビュー機能、画像添付ができませんでした。
    * ガッツリレビューするならGitHubを開き、指摘対応のようなさらっと見るだけでも良いような内容はIntellijという使い分けになるかなと思いました。
* mergeボタンを押しても(何故か)PRがマージされませんでした・・(PRのcloseはできました)

# 参考

公式が提供する機能紹介動画
https://youtu.be/lgZRMCpfYM4?t=806
読みやすく、簡略化されたコードを作る（HTML,CSS）


本記事は主にフロントエンド始めたての方向けになると思います。
自分自身フロントを始めて、2か月程度でまだまだ改善するところがあります。
今回デザインからコーディングする際のお話です。

#これを書こうと思ったきっかけ
理由は簡単で、HTML,CSSで使うクラス名の書き方に統一性がなく、コードも長かった為、色々な問題が起きたためです。
CSSのプロパティもある程度使いこなせていた為、その頃はとにかく早く作ろうと思い、コードの見やすさはあまり重要視せずにやってたと思います。

#起きた問題
・チームで作業する際、他の方が修正やコード追加するのが大変
・自分でも後から見直して、どこを修正していいか分からなくなる、修正に時間がかかる
・とにかく余計な時間がかかる

#原因
・HTML,CSSの設計でBEMを使うことになっていたが、正しく使えていなかった
・CSSで共通化を意識せず、一つ一つの要素をゼロから作成していた

※BEMとは、Block、Element、Modifierの略語です。Webサイトのコンポーネント化のためのフロントエンド設計方法のひとつで、厳格なclass名の命名ルールが特徴的な手法です。
https://tech-dig.jp/bem-css-html/

#改善・意識したこと
・見た目からCSSで共通化できるところを探し、なるべくゼロから作らないようにする。

例としてwebサイトをコーディングする際、↓のようなレイアウトがよくあると思います。
https://www.dentsusciencejam.com/
このコンテンツ内に様々なセクションがあり、ページ検証を行うと分かりますが、セクションごとのタイトル、本文、配置など同じクラスが使われており、多少違うものは、その要素にクラスを追加して上書きするような形になっています。

・クラス名などBEMを正しく使い、Sassの記述も見やすくする
まずは↓のように、使う命名を整理する。
https://qiita.com/manabuyasuda/items/dbb76ed36970bec95470

#結果
・コード量が非常に減った
　とある案件でのコーディングで、TOPページだけでも意識前後で半分以下になったと思います
・HTML、SASS（CSS)が見やすくなった
　何が、どういう要素かが一目で分かる（↓一例ですが、BEMは破綻しないように意識）

```
あるTOPページの業務内容セクション（例）
<section class="content-section service">
  <div class="content-section__inner">
    <div class="content-section__head">
      <div class="content-section__logo">
      </div>
      <h2 class="content-section__title">
        <div class="content-section__title--eng">SERVICE</div>
        <div class="content-section__title--jp">業務内容</div>
      </h2>
    </div>
    <div class="content-section__body">
      <article class="card">
        <div class="card__image"></div>
        <h2 class="card__title">業務内容（例）</h2>
        <div class="card__body">
          <div class="card__body--top">テスト本文</div>
          <div class="card__body--center">テスト本文</div>
          <div class="card__body--foot category">
            <div class="category__item">カテゴリーA</div>
            <div class="category__item">カテゴリーB</div>
            <div class="category__item">カテゴリーC</div>
            <div class="category__item">カテゴリーD</div>
          </div>
          <div class="card__body--link">
            <a href="#" class="arrow">詳しくみる</a>
          </div>
        </div>
      </article>
```
Sass(css)もBEMを正しく使えばこのようにまとめられます

```
//コンテンツ(共通)例
.content-section
  &__inner
    max-width: 1110px
    margin: 0 auto
  &__head
    display: flex
    justify-content: flex-start
  &__logo
    width: 60px
    height: 60px
  &__title
    margin-left: 15px
    &--eng
      color: #3E3838
      font-size: 38px
      font-weight: bold
    &--jp
      font-size: 20px
      font-weight: bold
  &__body
    font-weight: 500
    letter-spacing: 2px
    margin-top: 50px
    color: #FFFFFF
```

#まとめ

デザインどうりに反映していく事に意識がいき、コードの見やすさなど後回しになることがあると思いますが

Webサイトは修正、変更追加、メンテナンス作業など定期的に入ってきますので、チームで作業する際は、

他の方が見てもすぐに分かるように特に意識した方が良いと思います。

自分自身もっと良い書き方、まとめ方を取り入れていきたいと思ってます。

#参考サイト
CSSのクラス名を決めるときに使うリストをつくりました
https://qiita.com/manabuyasuda/items/dbb76ed36970bec95470
HTML・CSSの設計にBEMを取り入れてみよう！
https://tech-dig.jp/bem-css-html/
Docker 環境での Jest が遅すぎる問題

# Docker の問題

タイトルには Jest がと書いたが、Jest 自体はあまり関係なく、Docker のパフォーマンスに依存する問題のように思う。

# 環境

## Mac

```bash
$ system_profiler SPHardwareDataType
```

```yml
Hardware:
    Hardware Overview:
      Model Name: MacBook Pro
      Model Identifier: MacBookPro14,1
      Processor Name: Dual-Core Intel Core i7
      Processor Speed: 2.5 GHz
      Number of Processors: 1
      Total Number of Cores: 2
      L2 Cache (per Core): 256 KB
      L3 Cache: 4 MB
      Hyper-Threading Technology: Enabled
      Memory: 16 GB
      Boot ROM Version: 207.0.0.0.0
      SMC Version (system): 2.43f10
```

## Docker

### Docker Desktop for Mac

- Version: 2.3.0.4(46911)

### docker version

```bash
$ docker version
```

```yml
Client: Docker Engine - Community
 Version:           19.03.12
 API version:       1.40
 Go version:        go1.13.10
 Git commit:        48a66213fe
 Built:             Mon Jun 22 15:41:33 2020
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.12
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.10
  Git commit:       48a66213fe
  Built:            Mon Jun 22 15:49:27 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
```

# 改善前

ストレスの塊。
<img width="503" alt="test.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/912883f3-ffd5-a373-ed43-20dbc5ac088a.png">

# 改善後

まだ遅いが、改善前と比べれば…
<img width="524" alt="delegated-test.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/b5be1b84-a841-5208-84c4-45ab7408619f.png">

## やったこと

**volumes に delegated のオプションを追加した**

詳しくは: https://qiita.com/ysKey2/items/346c429ac8dfa0aed892

# Docker を使用しない場合

なんとかここに近づけたい。
<img width="510" alt="local.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/8b057a82-86e9-97c6-6c57-e245d698751c.png">


# さいごに

[DXを大幅に低下させるDocker for Macを捨ててMac最速のDocker環境を手に入れる](https://qiita.com/yuki_ycino/items/cb21cf91a39ddd61f484)
こっちも試してみたい
オラクルのexpdp/impdpについて

#目的
expとimpは公式に非推奨となり、expdp/impdpのパフォーマンスが比較的によいのため、
expdpとimpdpに変更して、
という、上司からの**「簡単」**な指示があった。

実際の作業で、expdp/impdpのメリットは全然体験できず、
デメリットしか記憶に残っていないので、この記事は同じようにexpdp/impdpを検討している人に参考になればと思う。

#コマンドのサンプル
```shell
expdp USER/Pass@DB directory=DATA_PUMP_DIR dumpfile=test01.dmp logfile=test01_exp.log tables=tbl01 reuse_dumpfiles=yes
```

```shell
impdp USER/Pass@DB directory=DATA_PUMP_DIR dumpfile=test01.dmp logfile=test01_imp.log table_exists_action=truncate query='where id=1'
```

#注意事項
expdpとimpdpの最大の変更はダンプファイルの場所であると思う。
（場合によっては厄介になる）
expではダンプファイルがクライアント側に保存されるが、
expdpではDB側に保存される。
**※具体的には、DBサーバに定義されているDIRECTORYというロジック場所に保存される。
　ネット上の共有フォルダなどを使用しない限り、DIRECTORYは基本的にDBサーバにある。**

簡単に言うと、
expは
①ダンプファイルを直接に指定の場所に作成、というone-stepであったが、
expdpは
①ダンプファイルをDB側に作成
②DBサーバからダンプファイルを取ってくる
のようなtwo-stepになった。

※impdpは逆に、ローカルからDBサーバにダンプファイルをコピーしてからインポートする必要がある。
　もしexpdpで作成したダンプファイルはそのまま使う場合（ダンプファイルがDBサーバのDIRECTORYに残っている）は、コピー作業が発生しないので、この場合のみはexp/impより便利になると思う。

このため、バックアップや移行など時に、expdpの抽出性能が上がっても、expと比べてDB側からクライアント側や保存したい場所にダンプファイルやexpのログをコピー・移動する作業が発生する。
特に、クライアント側はWindow、DBサーバはLinuxの場合は、ネット上でDIRECTORYの物理フォルダを共有したり、SMBを構築したり、（特に企業の場合）ADドメインに追加したり、色んな追加作業・知識が必要。

#余計な話
「抽出と取込の性能のみで判断」という前提があれば、expdp/impdpはよいかもしれないが、
作業は単純なものでなく、色んな状況を考えないといけない。
個人業務には影響少ないと考えられるが、会社や企業の作業にはやはり影響は大きい。
「ダンプファイルのコピーだけが増えるじゃない？」と言われるかもしれないが、
会社や企業でのファイルコピーに対して、
①各環境（Win・Linux・ActiveDirectoryなど）のユーザ・アカウント・権限の追加と変更
②抽出・取込変更後の動作確認
③抽出・取込変更前とのパフォーマンスの比較
④ログもDB側に出力されるため、ログの解析が必要な場合ログのコピーも必要になる
など色々作業が発生するので、十分の工数を予め確保したほうがよいと思う。
【初心者】Rubyの配列に対する繰り返し処理色々

# 実行環境
超基本的な内容なので、実行環境に左右されないと思いますが、一応明記しておきます。
OS : macOS Catalina ver10.15.5
Ruby : 2.7.1p83

## each

基本的な繰り返し処理。要素を一つづつ取り出して処理を行なっていく。
do ~ end で囲むのが基本。変数のスコープに注意。

```sample.rb
numbers = [1, 2, 4, 5, 6]

total = 0
numbers.each do |num|
  total += num
end
p total　# 18 

```

## map

配列を返してくれることが特徴。下記の処理は要素に10を足して出力している。
簡単な処理ならばdo ~ end の代わりに { }で記入可能。

```sample.rb
numbers = [1, 2, 4, 5, 6]

nuadd_num = numbers.map {|num| num + 10}

p add_num
# [11, 12, 14, 15, 16]

```

## select

処理内の判定に合致した値を配列として返している。

```sample.rb
numbers = [1, 2, 4, 5, 6]

numbers2 = numbers.select {|num| num % 2 == 0}

p numbers2
# [2, 4, 6]

```

## reject

処理内の判定に合致しない値を配列として返している。selectの逆。

```sample.rb
numbers = [1, 2, 4, 5, 6]

numbers2 = numbers.reject {|num| num % 2 == 0}

p numbers2
# [1, 5]

```

## inject
たたみ込み処理。num と i にそれぞれ要素が代入され処理を行なっていく。


```sample.rb
numbers = [1, 2, 4, 5, 6]

numbers2 = numbers.inject {|num, i| num + i}

# 1回目のループ num = 1, i = 2
# 2回目のループ num = 3, i = 4
# 3回目のループ num = 7, i = 5
# 4回目のループ num = 12, i = 6

p numbers2
# 18

```
仕事の共有化、引き継ぎの為に暗黙知を引き出すやり方について

仕事をチームで進めて行く場合に、**各自の暗黙知**の違いで残念な事が起こります。
現場を訪問していると「あたりまえでしょ！」・「常識でしょう！」の言葉を失敗や祖語があった時の議論でよく耳にします。
多様化の時代この「あたりまえでしょ！」・「常識でしょう！」は各自の暗黙知で共通にならない事が多く存在します。

**暗黙知とは**
・知識（とても範囲が広いですね）
・仕事の経験（仕事のプロセス）
・作業のやり方
・判断基準
・嗜好
・・・と色々と存在します。

**業務・仕事の引継ぎや、共有するときに、この暗黙知が邪魔をします。**
これまで、引継ぎや、共有するときには実施している者（経験者）が資料を作成して未経験者へ指導するのが通例でした。このやり方ですと、経験者の暗黙知と未経験者の暗黙知のギャップにより、正しく伝わらず残念な結果になっていました。
残念な事態にならぬように、経験者が未経験者へ一通り解説した後でこの図のやり方を参考にして引き継ぎを進めてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621379/def0ca71-d264-7749-2a19-774076231fe6.png)

こうすると、**相互の暗黙知のズレが分かり、****効率よく的確**に仕事の共有化や引継ぎを行うことができます。
CloudWatchEventsの変数と定数をAWS BatchのJobコマンドに渡したい

# やりたいこと
CloudWatchEvents(CWE)を使ってAWS BatchにJobを投入する。
JobコマンドではCWE動いた時の時刻と任意の定数を使いたい。
そのために必要なものを設定していく。

Jobコマンドでやりたいことのイメージ

```bash
$ exec --time {時刻} --target {定数}
```

## Jobコマンドで変数や定数を扱うために
CWE動いた時刻や任意の定数をコマンドで扱うために、CWEから値を受け取って扱う。
Jobでは受け取った値が特定のJSON形式でないと扱うことができず、コマンドで扱う際は特殊な書き方をする必要がある。

### Jobが扱える形式
Jobコマンドから扱えるのはJSON形式のParameters配下のプロパティのみ。
この形式を考慮してCWEのインプットの設定をする必要がある

```json
{
    "Parameters":{
        "time": "2015-11-11T21:29:54Z",
        "target": "01234"
    }
}
```

Parameters配下のプロパティでもオブジェクト形式だと扱えない。
そのためプログラムでオブジェクトや配列を扱いたい場合は、jsonを受け取ってプログラム内でパースする。

```json
{
    "Parameters":{
        "time": "2015-11-11T21:29:54Z",
        "targets": "{\"targets\":[\"01234\", \"56789\"]}"
    }
}
```


### Jobコマンドで受け取った値を呼び出すための設定をする
受け取った値は`Ref::パラメータ名`で呼び出すことができる。
ジョブ定義でコマンドの引数にパラメータが入るように設定しておく。

```bash
$ exec --time Ref::time --target Ref::target
```

## CWEの情報をターゲットに渡すために
CWEはターゲットに対して情報を渡すことができる。
渡す情報は以下の四種類がある。

- 一致したイベント
    - 時刻やアカウントIDなど、CWEがもつ変数
- 一致したイベントの一部
- 定数（JSON テキスト）
    - 任意の定数
- インプットトランスフォーマー
    - CWEがもつ変数と定数の両方を渡すことができる

今回は変数と定数の両方を渡すのでインプットトランスフォーマーを使う。

### インプットトランスフォーマーを設定する
インプットトランスフォーマーはマッピングとテンプレートの二種類を設定することでターゲットに定数を変数を混ぜた値を渡せるが、設定が面倒。

マッピングではCWEの変数をテンプレートで扱うために、変数と対応する名前を設定する。
テンプレートでは実際にターゲットに渡す情報を設定する。
どちらもJSON形式で指定する。

#### マッピング
変数`$.time`に対して、`mytime`と言う名前をつけている。

```json
{
    "mytime":"$.time"
}
```

#### テンプレート
JSONの形式で定数を表現する。
`<名前>`形式を使うことでマッピングで設定した変数を組み込むことができる。
変数を呼び出す際は<>を""で挟むと文字列として認識されてしまうため、""で挟んではいけない。

```json
{
    "Parameters":{
        "time": <mytime>,
        "target": "01234"
    }
}
```

#### ターゲットに渡される値
`<mytime>`の部分が実行時間に置き換わってターゲットに渡される

```json
{
    "Parameters":{
        "time": "2015-11-11T21:29:54Z",
        "target": "01234"
    }
}
```


# 別のアプローチ
別のアプローチなら面倒なインプットトランスフォーマーは不要だった、、、

## 定数をジョブ定義設定する
ジョブ定義のコマンドを以下のようにしておけば、CWEで定数を扱わなくなる。
変数だけなら面倒なインプットトランスフォーマーじゃなくて良い。

```bash
$ exec --time Ref::time --target "01234"
```

## 変数をコマンドから取得する
コマンドで動き出した時刻を取得すれば、CWEで変数を扱わなくなる。
定数だけなら面倒なインプットトランスフォーマーじゃなくて良い。

```bash
$ exec --time `date --iso-8601="minutes"` --target Ref::target
```
ウェブサイト作成用備忘録・１号：background-image の疑似アニメーション制御その１

日々の学習のアウトプットの為、自主学習の際に工夫した内容を記録していきます。

今回は background-image プロパティの疑似アニメーション制御について

background-image プロパティは transition プロパティや animation プロパティ等のアニメーション制御には対応していません。

そこで、自分なりに試行錯誤することで、疑似的なアニメーション制御に成功したので、その方法などを記録していきます。

###方法１：JavaScript の動的制御で画面を暗転させ、background-image を変更してから setTimeout() メソッドで画面の暗転を解除する

####記述例
HTML

```
<html>
  <body id="background" class="">
    <div id="hide_screen" class="none"></div>
    <button id="change_screen" class="" type="button">背景変更</button>
  </body>
</html>
```

CSS

```
body {
  margin: 0;
}

#hide_screen {
  min-height: 100%;
  min-width: 100%;
  background-color: #000;
  position: fixed;
  z-index: 2;
  transition: all .5s;
  -webkit-transition: all .5s;
}

#hide_screen.none {
  opacity: 0;
  pointer-events: none;
}

#background {
  background-image: url(背景画像１)
}

#background.change {
  background-image: url(背景画像２)
}

#change_screen {
  display: relative;
}
```

javascript

```
jQuery(document).ready(function(){

  $("#change_screen").click(function(){
    $("#hide_screen").removeClass("none");
    setTimeout(function(){
      $("#background").toggleClass("change");  
    },1000);
    setTimeout(function(){
      $("#hide_screen").addClass("none");
    },1000);
  });

});
```

####解説

１・背景色を黒に設定した空の div タグで画面全体を覆い隠す。

２・予めクラス none を設定し、透過処理の初期設定を行う。

３・背景変更ボタンをクリックすると、none クラスが解除され、画面全体が暗転する。

４・次に、setTimeout() で、最初に背景変更ボタンを押してから１秒後に toggleClass メソッドで body タグの change クラスを切り替え、画面暗転後に背景画像を変更する。

５・最後に setTimeout() で最初に背景変更ボタンを押してから２秒後に再び none クラスが追加され、画面の暗転が解除される。

今回はこれで以上になります。

あくまで自分用の備忘録ですが、他の方の参考になれば幸いです。
関数がデータになる感覚

ポエムです。
ちょっと前に感じた感覚的なことを、意味があるかどうかわかりませんが文章化してみます。

今golangを勉強しています。
普通に、匿名関数を作って型宣言もしていない変数にその関数を代入したりします。


「あれ? Elmって関数を変数に代入できなかったような」と前に試したときのこと思い出したのですが、やっぱデータだったので普通に代入できました。
という話です。

自分でも何を言っているのかよくわかりませんが、elm始めたての頃に「あれ? 代入できないんだ。まぁいいや」で通り過ぎたことのような気がします。
(その時何がしたかったのかは思い出せませんが)

```elm
type alias Product =
    { skills : List Skill
    , view : Html Msg
    }

hoge : Int -> Product
hoge x =
    { skills = [ Elm ]
    , view = text ("hoge" ++ String.fromInt x)
    }

products : List Product
products =
    [ productA
    , hoge 5
    , productB
    ]
```

なんかviewは関数だという先入観があって、それが薄まって視野が少し広がったような気がしました。

自分の前のコードを見ると、名前も`viewList`みたいにつけていました。
view関数が`view : Model -> Html Msg`このような感じなので、引数を受け取って仕事をさせる感覚があったのかもしれません。
(それ以前にviewは名詞?だし英語としておかしいと思いますが)
たぶん、どっちかというと`listView`ですよね。

やっぱ`viewEntry`とevanさんがしているのを見つけてしまいました。
迷います。
kotlin+SpringBootでCommandLineRunnerを使う

## はじめに
Java + SpringBootでコマンドラインアプリを作るためのHow to記事は
Qiitaにもいくつかありますが、こちらはkotlinでやった場合です。

## コード
main関数

``` SampleApplication.kt
@SpringBootApplication
class SampleApplication(val service: SampleService) : CommandLineRunner {
	override fun run(vararg args: String?) {
		// コマンドライン引数から取得
		val name = args[0]!!.toString()
		val mailAddress = args[1]!!.toString()
		service.profileRegister(name, mailAddress)
	}
}

fun main(args: Array<String>) {
	SpringApplication.run(SampleApplication::class.java, *args)
}
```

テストコード(JUnit5)でrunが動かないようにする設定。
これをやらないとテストコード実施時に、SampleApplicationのrunが動いてしまうようです。
アノテーション@ExtendWith、@ContextConfigurationにて定義します。


``` SampleServiceTest.kt
@ExtendWith(SpringExtension::class)
@ContextConfiguration(classes = [SampleServiceTest::class],
		initializers = [ConfigFileApplicationContextInitializer::class])
class SampleTest {
	@Autowired
	private lateinit var svc: SampleService

	@Test
	fun testProfileRegister() {
            val resp = svc.profileRegister("Taro Yamada", "xxxxx@example.com")
            assertThat(resp.name).isEqualTo("Taro Yamada")
            assertThat(resp.mailAddress).isEqualTo("xxxxx@example.com")
	}
}
```

## 参考(Javaの記事です)
Spring Bootで簡単なコマンドラインアプリケーションを作成してみる
https://reasonable-code.com/command-line-runner/

Spring Bootでコマンドラインアプリを作る時の注意点
https://qiita.com/tag1216/items/898348a7fc3465148bc8#comments

SpringBootでのJUnitでCommandLineRunnerが動くことの回避策
https://qiita.com/salkun/items/721125f0deec0a082504
Ruby: CouchDB のデータを削除 (Delete)

```rb:couch_delete.rb
#! /usr/bin/ruby
# -*- encoding: utf-8 -*-
#
#	couch_delete.rb
#
#					Jul/31/2020
#
# ---------------------------------------------------------------------
require 'faraday'
require 'json'
#
# ---------------------------------------------------------------------
STDERR.puts	"*** 開始 ***"
#
key_in = ARGV[0]
puts key_in

URL="http://localhost:5984/nagano/" + key_in
#
res = Faraday.get URL

puts	res.status

if res.status == 200 then
	json_str = res.body

	data_aa=JSON.parse(json_str)
#
	puts data_aa
	puts data_aa["_rev"]
#
	url_del = URL + "?rev=" + data_aa["_rev"]

	res = Faraday.delete url_del

	puts res.status
end

STDERR.puts	"*** 終了 ***"
# ---------------------------------------------------------------------
```

実行

```bash
./couch_delete.rb t2026
```
Docker コンテナ内でmatplotlibなどを使った画像表示されない場合の対処法

Docker コンテナ内でmatplotlib等で画像表示しようと思ったらこけたので記します
Ubuntu 16.04.6 LTS環境でやってます。

[問題点]
Docker run した後にコンテナに入り、matplotlibでplot.show()すると画像が何も表示されず、コマンドが終わる。
もしくは
>docker _tkinter.TclError: couldn't connect to display
>_tkinter.TclError: no display name and no $DISPLAY environment variable
>_tkinter.TclError: couldn't connect to display :0.0
みたいなエラーが出てくる。

[対処法]
①まずターミナルに以下のコマンドをうつ

```
$sudo apt-get install x11-xserver-utils
$xhost +
```

②docker run する時には以下をオプションにつける
`-v /tmp/.X11-unix:/tmp/.X11-unix`
`-e DISPLAY=unix$DISPLAY`

③もしmatplotlibがコンテナに入ってなかったらコンテナ起動後のインテラクティブモードで
```
pip install matplotlib
```

④ もしtkinterがコンテナに入っていなかったらコンテナ起動後のインテラクティブモードで
```
apt-get update
apt-get install python3-tk
```
なおpython3-tkをインストールする際、居住地域を答えるくだりがありました。

これでうまくコンテナ内でも画像表示されるようになりました。:family:
スクリーンリーダーでのAndroidアプリ開発_使用を見送ったNativeScript編

Flutterをがっつり使ってみようと思う前に少し興味がありNativeScriptを触っていました。
XMLとJavaScriptでネイティブアプリが作れるということでサンプルコードをいじっていました。
また調べていく中でプラグインでスクリーンリーダー(AndroidではTalkBack、iOsではVoiceOver)を制御できる物があることを知りました。
アプリを動かす上で画面表示されている内容を読み上げるだけでなく、強制的にアナウンスをさせたい場面があります。
たとえば画面の遷移中や読み込み中て時間がかかっているときなどはその旨のアナウンスがあるとユーザは状況がわかり安心します。
なのでこのプラグインにも魅力を感じていました。
(Flutterにもいくつか同様のライブラリはあるようです)
ですが、以下の問題がありNativeScriptの使用を止めることにしました。
私の学習が足りなかったところもあると思いますが、記録として残しておきます。

----------

## ボタンに対するテキストラベルの問題
ただのアイコンや画像のボタンではそれがとのような働きをするのかスクリーンリーダーではわかりません。
そのためHTMLのalt属性のようにテキストラベルを付加します。
しかしこれが反映しないボタンやラベルとボタンが分離してしまう物がありました。

## タップ動作の付確実さ
サンプルコードで確認しただけなので確実ではありませんが、
TalkBackを有効にした上で
リストのアイテムをタップして項目を表示することができませんでした。
NativeScriptは問題ありませんでしたが、AngularとTypeScriptでこの現象を確認しました。

## スクリーンリーダープラグインが動作しなかった
表題の通りです。
開発は続いているようでしたのでフィードバックはしてあります。
<a href="https://market.nativescript.org/plugins/nativescript-accessibility">Accessibility | NativeScript Marketplace</a>
Ruby: CouchDB のデータを更新 (Update)

```rb:couch_update.rb
#! /usr/bin/ruby
# -*- encoding: utf-8 -*-
#
#	couch_update.rb
#
#					Jul/31/2020
#
# ---------------------------------------------------------------------
require 'faraday'
require 'json'
require 'date'
#
# ---------------------------------------------------------------------
STDERR.puts	"*** 開始 ***"
#
key_in = ARGV[0]
population_in = ARGV[1].to_i
puts key_in,population_in

URL="http://localhost:5984/nagano/" + key_in
#
res = Faraday.get URL

puts	res.status

if res.status == 200 then
	json_str = res.body

	data_aa=JSON.parse(json_str)
#
	puts data_aa
	puts data_aa["_rev"]
	puts data_aa["name"]
#
	args = {}
	args["name"] = data_aa["name"]
	args["population"] = population_in
	args["date_mod"] = Date.today

	url_up = URL + "?rev=" + data_aa["_rev"]

	con = Faraday.new 
	res = con.put do |req|
		req.url url_up
		req.headers['Content-Type'] = 'application/json'
		req.body = JSON.pretty_generate(args)
	end

	puts res.status
end

STDERR.puts	"*** 終了 ***"
# ---------------------------------------------------------------------
```

実行

```bash
./couch_update.rb t2029 4213500
```
Ruby: CouchDB のデータを読む (Read)

```rb:couch_read.rb
#! /usr/bin/ruby
# -*- encoding: utf-8 -*-
#
#	couch_read.rb
#
#					Jul/31/2020
#
# ---------------------------------------------------------------------
require 'faraday'
require 'json'
#
# ---------------------------------------------------------------------
STDERR.puts	"*** 開始 ***"
#
URL="http://localhost:5984/nagano/_all_docs?include_docs=true"
#
res = Faraday.get URL

# puts	res.status

json_str = res.body

dict_data=JSON.parse(json_str)
#
dict_data['rows'].each {|value|
		doc = value["doc"]
		str_out = doc["_id"] + "\t" + doc['name'] + "\t" \
			+ doc["population"].to_s + "\t" + doc['date_mod']
		print(str_out,"\n")
	}
#
STDERR.puts	"*** 終了 ***"
# ---------------------------------------------------------------------
```

実行

```bash
./couch_read.rb
```
Ruby: CouchDB のデータを作成 (Create)

```rb:couch_create.rb
#! /usr/bin/ruby
# -*- encoding: utf-8 -*-
#
#	couch_create.rb
#
#					Jul/31/2020
#
# ---------------------------------------------------------------------
require 'faraday'
require 'json'
#
# ---------------------------------------------------------------------
def dict_append_proc (dict_aa,key,name,population,date_mod)
	unit = {}
	unit['name'] = name
	unit['population'] = population
	unit['date_mod'] = date_mod
	dict_aa[key] = unit
	return dict_aa
end

# ---------------------------------------------------------------------
def prepare_data_proc ()
dict_aa={}

dict_aa=dict_append_proc(dict_aa,'t2021',"長野",51847,"2006-3-19")
dict_aa=dict_append_proc(dict_aa,'t2022',"松本",23789,"2006-7-27")
dict_aa=dict_append_proc(dict_aa,'t2023',"上田",47251,"2006-2-8")
dict_aa=dict_append_proc(dict_aa,'t2024',"小諸",78623,"2006-1-22")
dict_aa=dict_append_proc(dict_aa,'t2025',"岡谷",91489,"2006-5-11")
dict_aa=dict_append_proc(dict_aa,'t2026',"塩尻",27915,"2006-4-17")
dict_aa=dict_append_proc(dict_aa,'t2027',"茅野",36972,"2006-9-18")
dict_aa=dict_append_proc(dict_aa,'t2028',"飯田",74921,"2006-8-15")
dict_aa=dict_append_proc(dict_aa,'t2029',"中野",81923,"2006-10-11")
dict_aa=dict_append_proc(dict_aa,'t2030',"諏訪",47598,"2006-9-12")
dict_aa=dict_append_proc(dict_aa,'t2031',"駒ヶ根",51738,"2006-7-22")
dict_aa=dict_append_proc(dict_aa,'t2032',"佐久",82514,"2006-8-17")
dict_aa=dict_append_proc(dict_aa,'t2033',"伊那",74361,"2006-12-29")
dict_aa=dict_append_proc(dict_aa,'t2034',"千曲",67293,"2006-10-18")

end
# ---------------------------------------------------------------------
STDERR.puts	"*** 開始 ***"
#

URL="http://localhost:5984/nagano"
#
res = Faraday.delete URL
puts	res.status

res = Faraday.put URL
puts	res.status

#
dict_aa=prepare_data_proc()
#
dict_aa.sort.each {|key, value|
	url_aa = URL + "/" + key
	puts url_aa
	con = Faraday.new 
	res = con.put do |req|
		req.url url_aa
		req.headers['Content-Type'] = 'application/json'
		req.body = JSON.pretty_generate(value)
	end
}

STDERR.puts	"*** 終了 ***"

# ---------------------------------------------------------------------
```

実行

```bash
./couch_create.rb
```
hamlのヘルパーメソッドの使用例

#link_toの使い方
link_toを使用する際、

```
link_to "テキスト","リンク先のパス"
```

などで使われることが多いが、テキスト等であればそこに表示したいテキストを記入すればよいが、ロゴを指定しないととなると少し書き方が変わってくる。

例えば
VScodeのimageの中に"logo.png"というロゴを入れてそれを指定する場合は

```
= link_to root_path do
  = image_tag src ="logo.png",size"140x40"
```

と記入してあげるとlogoを表示することができる。



#submitでのロゴの使い方

form_forなどでlogoボタンを使用する際、f.submitだとlogoが表示できず
例えばbutton_tagを利用すると

```
= button_tag type:'submit', class: 'submit_btn' do
  = icon('fas','search')
```

と使用することで、ロゴのボタンを使用することができる。
またこちらのロゴを使用する際はFontAwesomeをgemファイルからインストールする

```
gem 'font-awesome-sass'
```

こちらを入力してbundle install

またapplication.scssに

```
@import "font-awesome-sprockets";
@import "font-awesome";
```

を入力するのを忘れずに。
Javaの環境構築をしてhelloworldを出力する【初心者】

java未経験で入社して勉強したことを少しずつ残していきます。アウトプットは大事ですね。
超初心者が作ったので用語解説など多めです。なにかおかしな点などありましたらご指摘いただけますと幸いです。


#１．JDKのインストール

[こちら](https://www.oracle.com/jp/java/technologies/javase-downloads.html)からダウンロードできます。
ダウンロード手順や動作確認などは書かれている記事がたくさんあるのでここでは省略します。

####JDKってなに？
Java Development Kit（ジャヴァ・デベロップメント・キット）の略で、Javaの開発環境。
Javaを作ったり動かしたりするときに必要なあれやこれやが必要になりますが、それらがセットになった開発キットです。

#２．Eclipseのインストール
[こちら](https://www.eclipse.org/downloads/packages/)からダウンロードできます。
こちらも手順等は割愛します。

####eclipseってなに？
開発を効率的に行うための統合開発環境で、IDEとも呼ばれます。
ここで実際にコードを書いたりする作業スペースみたいなものです。

#３．helloworldをとにかく出してみる

せっかくJavaが使えるようになったのでとにかく書いてみましょう。

eclipseを開いて左上にファイルというのがあるのでそこから新しいプロジェクトを作成します。
file -> new -> Java Project の順でクリックし、名前を決めたらfinishで完了です。今回はhelloworldプロジェクトとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550109/aefb7a6f-b741-502e-0551-7fecf912c862.png)

srcにカーソルを合わせて右クリックしnew -> classよりHelloWordクラスを作ります。ここにコードを書いてみます。
(クラスなので１文字目は大文字でHelloWordとしてください。画像はミスです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550109/364be961-7e60-859f-32ef-10ef60ebe6e7.png)


コンソールに出力するコードを書きます。

```HelloWorld.java
package helloworld;

public class HelloWorld {
	public static void main(String args[]){
		System.out.println("HelloWorld");
		}
}
```
runで実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550109/00392386-ab0f-a8a2-8546-d76948df80fa.png)

無事に出力できました。



割愛した環境構築ですが参考サイトを載せておきます。
https://techacademy.jp/magazine/9039


次はgradleとspringを入れてみましょう
次　=> [eclipseにspring bootとgradleを追加する](https://qiita.com/kty000/items/f2f8cf3e48e01fcc3956)
Pythonのf文字(format済み文字列)

#### f文字(format済み文字列)について
まず、これはPython3.6からなので注意してください。
***
```Python
a = 20
s = "あなたは{}歳".format(a)
```
これはPython3.6から以下のように書けます。
```Python
a = 20
s = f"あなたは{s}歳"
```
文字列の先にfをくっつける
***
もちろん

```Python
a = 20
s = f"あなたは{s+2}歳"
```
中括弧内で計算や、Pythonのコードも書き込める。
Vite触ってみた

# Viteとは？

Vue.js生みの親Even You氏が開発したノーバンドルなビルドツールです。

従来のVueだと、[単一ファイルコンポーネント](https://jp.vuejs.org/v2/guide/single-file-components.html)`.vue`はwebpack等といったバンドラーでの処理が必要で、それが動作の低下を引き起こしてました。

ViteはネイティブESモジュールのインポートを介したバンドル不要のdevサーバーを持っており、従来の環境よりも高速な実行環境が提供されます。
また、ビルド環境も[rollup.js](https://rollupjs.org/guide/en/)をベースとしているのでこれも従来より高速となっているようです。

- [webpackとRollup：似て非なるもの
](https://postd.cc/webpack-and-rollup-the-same-but-different/)


## メリット

- バンドル処理がないため、初回起動、また開発中の更新処理が非常に高速です
- コードのコンパイルは変更された部分にのみ適用されます、従来は変更したらアプリ全体がバンドルされ、処理が終わるのを待つ必要がありました。大規模アプリでは大きな高速化が見込めます
- [HMR](https://zukucode.com/2017/04/vue-webpack-hmr.html)のパフォーマンスはモジュールの総数から切り離されるので、アプリの大きさに関係なく一貫した高速さを維持します


## デメリット
- 今現在はVue3.0のみに対応しています。Vue3.0に対応していないライブラリも使用はできません
- ESインポートは深い構造になるため、全体のリロードはバンドラーベースよりも遅くなる場合があります。しかしこれはローカル環境のみでのことで、コンパイル済みのファイルはメモリにキャッシュされるためページリロードにコンパイルコストはかかりません

[How and Why](https://github.com/vitejs/vite#how-and-why)


# Viteでプロジェクトを作ってみる

npm、yarn両方での使用が可能ですが、今回はnpmを使用します

```terminal
$ npm init vite-app <project-name>
```

これでプロジェクトの作成は完了です。
あとは依存するモジュールをインストールすれば起動ができます

```terminal
$ cd <project-name>
$ npm install
$ npm run dev
```
<img width="619" alt="スクリーンショット 2020-07-31 9.58.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349049/fd50a7f6-13d0-ce45-0f7f-71bb15f16a63.png">


# プロジェクトをビルドする

ビルドするにはNodeのバージョンを12以降にする必要があります

[Vite - zlib_1.brotliCompressSync is not a function](https://github.com/vitejs/vite/issues/542)

```
$ npm run build
```

# 構成

```

ディレクトリ構造はこのようになっています
.
├── node_modules
├── index.html
├── package-lock.json
├── package.json
├── public
│   └── favicon.ico
└── src
    ├── App.vue
    ├── assets
    │   └── logo.png
    ├── components
    │   └── HelloWorld.vue
    ├── index.css
    └── main.js
```

`index.html`以外は通常のvueプロジェクトの構成と変わりません。

```json:package.json
{
  "name": "vite-sample",
  "version": "0.0.0",
  "scripts": {
    "dev": "vite",
    "build": "vite build"
  },
  "dependencies": {
    "vue": "^3.0.0-rc.1"
  },
  "devDependencies": {
    "vite": "^1.0.0-rc.1",
    "@vue/compiler-sfc": "^3.0.0-rc.1"
  }
}
```

初期の依存モジュールは`vite`と`@vue/compiler-sfc`だけの非常にシンプルなものとなっており、起動も`vite`を通したものとなっています。

```html:index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <link rel="icon" href="/favicon.ico" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Vite App</title>
</head>
<body>
  <div id="app"></div>
  <script type="module" src="/src/main.js"></script>
</body>
</html>
```

viteで作ったプロジェクトは`index.html`から`main.js`をインポートしています。
main.js以降の流れは通常のvueと変わりません。

1. `index.html`から`module`タイプとして`main.js`をインポート
2. `main.js`内で`App.vue`を`createApp`し、`#app`(`id="app"`)としてマウント
3. `App.vue`から子コンポーネントなどをインポート

# 続き - ViteとVue CLIで作ったVue3プロジェクトのパフォーマンス比較

別記事で書きたいと思います