OmniAICreator/Qiita-1.07M huggingface dataset:
kintoneでユーザー選択をルックアップ？する技

今回はユーザー選択をルックアップ？して、関連レコードに選択したユーザーに結びつくレコードを表示してみましょう。

実は標準のルックアップではユーザー選択フィールドを「コピー元のフィールド」として選択できません。

参考：kintoneヘルプ

https://jp.cybozu.help/k/ja/user/app_settings/form/lookup/set_lookup.html#lookup_set_lookup_30

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/b88ca943-c1e1-9ea8-41a6-5ca93c4377c3.png)

色々とやり方も考えられますが、今回はユーザー選択フィールドからcodeとnameを取得してやってみたいと思います。

# 出来上がりイメージ

![lookup.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/3a464625-04b1-4b77-0e8b-c8dbefea87ab.gif)



# アプリの準備

ユーザーマスタ、予定アプリ、呼び出す側のアプリの3種類を作ります。

## ユーザーマスタ

| フィールド種類 | フィールドコード | 備考 |
|:-:|:-:|:-:|
| ユーザー選択  |ユーザー選択   |   |
| 文字列(1行)  | code  | 重複禁止。グループフィールドで隠してみました|
| 文字列(1行)  | name  |  グループフィールドで隠してみました |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/200d8229-1e9a-dc31-0187-24e1213c67dc.png)

## 予定アプリ

| フィールド種類 | フィールドコード | 備考 |
|:-:|:-:|:-:|
| 日付|日付   |   |
| 文字列(1行)  | 内容  |  |
| ユーザー選択  |ユーザー選択   |   |
| 文字列(1行)  | code  | グループフィールドで隠してみました|
| 文字列(1行)  | name  | グループフィールドで隠してみました  |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/bf78bc8b-d11e-3592-6350-0c062427abe0.png)

## 呼び出し用アプリ

| フィールド種類 | フィールドコード | 備考 |
|:-:|:-:|:-:|
| ルックアップ|ルックアップ   | 設定後述  |
|  関連レコード一覧 | 関連レコード一覧  | 設定後述 |
| 文字列(1行)  | code | グループフィールドで隠してみました  |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/54194a53-67ef-29ad-1f7d-b69db66aa9da.png)

### ルックアップの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/9d86bce7-a190-2148-7d85-dcee68bb4aad.png)

### 関連レコード一覧の設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/4ea4f0cc-d037-d2f8-0409-24cf539a9578.png)

# JavaScript
ユーザーマスタと予定アプリに同じコードを設定します。

```js
kintone.events.on(
  ["app.record.create.submit", "app.record.edit.submit"],
  (event) => {
    event.record.code.value = event.record.ユーザー選択.value[0].code;
    event.record.name.value = event.record.ユーザー選択.value[0].name;
    return event;
  }
);
```

# まとめ
コードが数行で済むので、試しやすいカスタマイズかもしれません👀
また、ユーザーのユニークIDを別途用意してルックアップしてもいいかも？
【Spring Boot】実行直後に「code 0」で即終了してしまう

#プロジェクト作成直後、実行すると「code 0」で即終了してしまう
```:terminal
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.5.4)

//any logs
//any logs

Process finished with exit code 0
```

##解決した
build.gradleのspring-boot-starterをspring-boot-starter-webにしたら動いた。

```gradle:build.gradle
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
```
↑これを
↓こうしたら動いた。

```gradle:build.gradle
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
```
Pythonのラッパーとデコレータを使いこなしたい

## ラッパー
ラッパーには大まかに、以下の3つがある。
1. 引数を細工して元の関数を呼び出す
2. 元の関数を呼び出した後、結果に細工をする
3. 前後に処理を追加する


```py
import inspect

"""
Python ラッパーとデコレータ
"""
# 元の関数
def infected(COVID_19_flg):
    if COVID_19_flg:
        return 'infected'
    else:
        return 'uninfected'
    

# 1.引数を細工して元の関数を呼び出す
def wear_mask(func):
    def wrapper(COVID_19_flg):
        if COVID_19_flg:
            COVID_19_flg = False
        return func(COVID_19_flg)
    return wrapper
    
# 2.元の関数を呼び出した後、結果に細工をする
def passed_2weeks(func):
    def wrapper(COVID_19_flg):
        ret = func(COVID_19_flg)
        if ret == 'infected':
            ret = 'uninfected'
        return ret
    return wrapper

# 3.前後に処理を追加する
def output_log(func):
    def wrapper(*args, **kargs):
        print(f'### START {inspect.currentframe().f_code.co_name} ###')
        ret = func(*args, **kargs)
        print(f'### END {inspect.currentframe().f_code.co_name} ###')
        return ret
    return wrapper
    
COVID_19_flg = True

func_1 = wear_mask(infected)
print(func_1(COVID_19_flg)) # マスクしているのでuninfected

func_2 = passed_2weeks(infected) 
print(func_2(COVID_19_flg)) # 2週間経ったのでuninfected

func_3 = output_log(infected) 
print(func_3(COVID_19_flg)) # STARTとENDのログが出力

    
```

## デコレータ
デコレータはラッパーのコードの最後の部分に記載していた以下のような記述を簡単に行える。

```py
## ~~~~~~~~~~~~~~省略~~~~~~~~~~~~~
func_3 = output_log(infected)
## デコレータを使うと以下のようになる
@output_log
def infected(COVID_19_flg):
    if COVID_19_flg:
        return 'infected'
    else:
        return 'uninfected'
```

簡単に「hello!」とログを出力するだけのプログラムをデコレータをつかって考えてみると以下のようになる。

```py
def output_log(func):
    def wrapper(*args, **kargs):
        print(f'### START {inspect.currentframe().f_code.co_name} ###')
        ret = func(*args, **kargs)
        print(f'### END {inspect.currentframe().f_code.co_name} ###')
        return ret
    return wrapper

# デコレータ付き関数
@output_log
def print_hello():
    print('hello!')
```

今回は説明しないが、関数以外の引数を受け取るデコレータを作る場合、今回説明したものに加え、もう1階層上に「関数以外の引数を受け取る専用の高階関数」を作る必要が出てくる。
【メモ】Flutter の環境構築が完了するまでの行程をまとめた

# はじめに
参加予定の SPAJAM ではネイティブアプリでの出場がマストだったので、初ネイティブ開発を始めることになった。
Swift / Flutter / React Native で迷った結果、マルチプラットフォーム開発ができ、また動作が速いという点で Flutter を使うことに。

# Flutter インストール & パスを通す
[公式ドキュメント](https://flutter.dev/docs) の **Get Started** から、**mac OS** を選択、

**Get the Flutter SDK** から **flutter_macos_2.2.3-stable.zip** をダウンロードし、**Developers** ディレクトリに移動。

![スクリーンショット 2021-09-04 15.03.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748993/f2eed708-6a09-86ce-08cf-3cd871ade43e.png)

次にパスを通す。

例えばダウンロードした`flutter`内には、以下のように`dart`という実行ファイルがあるけれど、
![スクリーンショット 2021-09-04 15.09.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748993/f8587503-f536-52cc-5fdc-4159f274d0a5.png)
今の時点では、次にようにいちいち`dart`までのパスを指定して実行しなければならない。

```console
Developer/flutter/bin/dart
```

カレントディレクトリが変われば上のコマンドも変わるし、そもそもパスを毎回書くのも非現実的。

パスを通すことで、どのディレクトリにいても、実行ファイル名を指定するだけで実行ができるようになる。
パスを通す作業については、以下の記事がとてもわかりやすかった。

https://qiita.com/soarflat/items/09be6ab9cd91d366bf71

作業中、詰まったので別の記事にまとめた。

https://qiita.com/anko-taro/items/2ef0774b5a2f4ef8149d

色々やった結果、無事パスを通すことに成功。

```
which flutter
>> /Users/ユーザ名/Developer/flutter/bin/flutter
```

# `flutter doctor` で足りないものを確認
ターミナルから以下のコマンドを実行。

```
flutter doctor
```

**Java** が入ってないと言われたので、次の記事を参考に **Java** をインストール。

https://qiita.com/ninoko1995/items/d2976d9ca6951ed50520

**Android Studio** もないと言われたので、[こちら](https://developer.android.com/studio?hl=ja)からダウンロード。

# Android Studio で Flutter プロジェクトを作成
**Android Studio** をインストールし、**Plugins** で **Flutter**　をインストール。
![スクリーンショット 2021-09-04 15.41.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748993/5c78afa1-5d6b-1c71-8115-50a2f733d014.png)

再起動すると、次のように **Flutter Project** を作成できるようになった。
![スクリーンショット 2021-09-04 15.41.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748993/6e54d339-a2b4-901f-d1a8-64316abb79d2.png)
環境構築エラー対処：MySQLインストールエラー

##エラー内容：書き込み権限がありません。ownershipに変更するか、書き込み権限があることを確認してください。

```
Error: The following directories are not writable by your user:
/usr/local/lib/pkgconfig

You should change the ownership of these directories to your user.
  sudo chown -R $(whoami) /usr/local/lib/pkgconfig

And make sure that your user has write permission.
  chmod u+w /usr/local/lib/pkgconfig

```

##対処:ownershipを変更

```
　sudo chown -R sbn122 /usr/local/lib/pkgconfig

// fileに対してユーザーアクセス（u）に書き込み権限（w）を設定する
　sudo chmod u+w (file名)/usr/local/lib/pkgconfig

　brew install mysql
```
bootstrap btnがリロードしないと表示できない>>>三項演算子


<h2>三項演算子</h2>
<p>枠だけ色付きのボタン、編集/editページに行くと選択していたボタンが選択されない&リロードすると選択していたボタンが表示される</p>
<p>検証ページ見るとcheckedになっている</p>
```html:edit.html.erb
　<label class="btn btn-outline-success">
   <%= f.label :pink ,'ピンク' %><%= f.radio_button :color,"pink"%>
</label>
```

https://qiita.com/lasershow/items/160c854e4256ba596ec5


```html:edit.html.erb
<label class="btn btn-outline-success <%= @ostomy.color == 'pink' ? 'active' : '' %>">
   <%= f.label :pink, 'ピンク' %><%= f.radio_button :color,"pink"%>
</label>
```

```html:
bootstrapではフォーカスがあたったボタンには .active が適用される
   　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 条件式?    '式１'　:　'式２'
<%= @ostomy.color == 'pink' ? 'active' : '' %>
　
#if文を1文て書いている
if  @ostomy.color == 'pink'
  'active'
else
   ''
end
```
redux-observable Epic実行の流れを追ってみた

redux-observableの流れについてよく理解できていなかったのでまとめてみました。

##アクション定義

以下のような3つのアクションを定義

```redux/actions/session.js
export const fetchSession = () => {
  return {
    type: "FETCH_SESSION",
    payload: {}
  }
}

export const fetchFinishedSession = () => {
  return {
    type: "FETCH_FINISHED_SESSION",
    payload: {}
  }
}

export const signupSession = (email, password) => {
  return {
    type: "SIGNUP_SESSION",
    payload: { email, password }
  }
}
```

##stateの変更内容を以下のように定義

isFetchingのデフォルトはfalseで
FETCH_SESSIONが発火するとtrueに変更され
FETCH_FINISHED_SESSIONが発火するとfalseに戻る

※ここでの SIGNUP_SESSION はあくまで呼び出し専用の為、
変更内容は定義していない

```redux/reducers/session.js
const initialState = {
  isFetching: false,
}

export default function sessionReducer(
  state = initialState, action,
) {
  switch (action.type) {
   case types.FETCH_SESSION: {
      return { ...state, isFetching: true };
    }
   case types.FETCH_FINISHED_SESSION: {
      return { ...state, isFetching: false };
    }
    default:
      return state;
  }
}
```

##サインアップ時にfirebaseでアカウント登録されるように定義
```firebase.js
export const signup = (email, password) => {
  firebase.auth().createUserWithEmailAndPassword(email, password);
};
```


##ボタンを押してepicを走らせる
ボタンが押されたタイミングでアクションがdispatchされ
SIGNUP_SESSIONが発火する

```signUp.jsx
<button
  type="button"
  onClick={() => dispatch(signupSession(email, password))}
>
  ボタン
</button>
```

##epicに定義されている処理が走る

以下のような流れで処理が実行される
1.  SIGNUP_SESSIONが発火し、epicに定義されている処理が走る
2.  startWith(オペレータ)でFETCH_SESSIONを発火させて、isFetchingのstateをtrueに変更させる
3.  signup関数が呼び出され、firebaseにアカウントが作成される
4.  concatMapで複数アクション実行(上から addSession →  openModal →  fetchFinishedSessionと順に実行される)
fetchFinishedSessionが実行されたタイミングでisFetchingのstateをfalseに変更される


```redux/epics/session.js
const signupSessionEpic = (action$) =>
  action$.pipe(
    ofType(SIGNUP_SESSION),
    mergeMap((action) =>
      from(signup(action.payload.email, action.payload.password)).pipe(
        concatMap((response) => of(
          addSession(response),
          openModal(),
          fetchFinishedSession(),
        )),
        startWith(fetchSession()),
      )),
  );
```

##stateの変更を確認する
isFetchingの変更をuseEffectを使って見てみると、
以下画像のように
false →  true → false
と変更されている


```signUp.jsx
useEffect(() => {
  console.log(session.isFetching);
}, [session.isFetching]);
```

![スクリーンショット 2021-09-20 13.20.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483326/80e2512c-88ab-c357-a7c8-9d7c9ecf886b.png)

##参考記事
こちらの記事を参考にさせてもらいました。
https://qiita.com/Kontam/items/30a8b4806bf76fcaffc3
Elixirでネストした構造体を全部Mapに変換する方法

[Elixir Slack](https://elixir-slackin.herokuapp.com/)と[Elixir JP Slack](https://join.slack.com/t/elixirjp/shared_invite/zt-ae8m5bad-WW69GH1w4iuafm1tKNgd~w)を毎日眺めるのを日課にしています
そこでいろんなアイデアを得ることがあるのですが、今日は一つご紹介します

## やりたいこと

構造体とMapが深いネストで同居していている場合に、全てMapにしたい

## 架空の構造体

こういう構造体があったとします

```elixir
defmodule Hello, do: defstruct [:x]
```

## 最上階層のみを構造体からMapへ変換

```elixir
iex> s = %Hello{x: %Hello{x: 1}}

iex> Map.from_struct(s)
%{x: %Hello{x: 1}}
```

## ネスト構造の中のすべての構造体をMapへ変換

```elixir
defmodule Mnishiguchi.Map do
  def unstruct(%NaiveDateTime{} = encodable_struct), do: encodable_struct
  def unstruct(%DateTime{} = encodable_struct), do: encodable_struct
  def unstruct(%Time{} = encodable_struct), do: encodable_struct
  def unstruct(%Date{} = encodable_struct), do: encodable_struct

  def unstruct(struct_or_map) when is_map(struct_or_map) do
    struct_or_map
    |> Map.delete(:__struct__)
    |> Map.delete(:__meta__)
    |> Map.new(fn
      {k, v} when is_map(v) -> {k, unstruct(v)}
      {k, v} when is_list(v) -> {k, Enum.map(v, &unstruct/1)}
      kv -> kv
    end)
  end

  def unstruct(not_struct_or_map) do
    not_struct_or_map
  end
end

iex> s = %Hello{x: %Hello{x: %Hello{x: [%Hello{x: 1}, %Hello{x: %Hello{x: 1}}]}}}

iex> Mnishiguchi.Map.unstruct(s)
%{x: %{x: %{x: [%{x: 1}, %{x: %{x: 1}}]}}}
```

## Mapと構造体は若干異なる

ElixirのMapと構造体はほぼ同じなのですが、[挙動が若干異なります](https://elixir-lang.org/getting-started/structs.html#structs-are-bare-maps-underneath)

違いの一つに`Access behaviour`が挙げられます
構造体は`Access behaviour`を実装していないので、`[]`でアクセスしようとすると`UndefinedFunctionError`になります

```elixir
# Map
iex> m = %{x: 1}

iex> m.x
1

iex> m[:x]
1
```

```elixir
# 構造体
iex> s = %Hello{x: 1}

iex> s.x
1

iex> s[:x]
** (UndefinedFunctionError) function Hello.fetch/2 is undefined (Hello does not implement the Access behaviour)
    Hello.fetch(%Hello{x: 1}, :x)
    (elixir 1.12.2) lib/access.ex:285: Access.get/3
```
【Python】Windows環境でMeCabを使う

## 概要
WindowsのコンソールでインストールしたPythonに対してMeCabを使おうとしたときにつまづいたので
やり方をメモしておくことにしました。

## 前提条件
Pythonが既にインストールされていること。
インストールされているPythonのバージョンが3.xであること。

## MeCabの導入
下記のURLからMeCabの実行ファイルをダウンロードできるページへ移動する。
<a href="https://github.com/ikegami-yukino/mecab/releases/tag/v0.996">64bitの場合</a>
<a href="http://taku910.github.io/mecab/#download">32bitの場合</a>

その後、64bitの場合はmecab-0.996-64.exeのリンクをクリックしてダウンロードする。

インストールが終わった後、環境変数の編集”で"Path"を選択し、”編集”の"新規"で
MeCabのインストール先のパスを追加する。
詳細は、下記のURLを参照してください。
https://qiita.com/menon/items/f041b7c46543f38f78f7#anacondaのインストール

ここまで出来たら、コンソールに「mecab」と入力して文章を入力すると下記の結果が出力されます。
![Inked3PNG_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2056482/fe172682-1279-300e-fdda-fe59d792e8d3.jpeg)

## mecab-python3とMeCabの導入
参照していたサイトだと「mecab-python-windows」をインストールしていました。
が、自分が試したところエラーになって使えなかったため「mecab-python3」をインストールしました。

コンソールを開いて下記のコマンドを実行して「mecab-python3」と「MeCab」をインストールする。

```
pip install mecab-python3
pip install MeCab
```

## PythonでMeCabを実行
ここまで出来たらあとはPythonでMeCabを実行するだけです。

下記のソースを保存して実行すると

```py
import MeCab

print("文章は？")
CONTENT = input()

tagger = MeCab.Tagger()
parse = tagger.parse(CONTENT)

print(parse)
```

下記のようになります。
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2056482/421a39a1-87f6-c70e-5d4d-c4e912908ce3.png)

## ChaSen形式を追加
今の段階で"-Ochasen"で表示しようとするとエラーが出ます。
そのため、dicrcファイルにChaSenの形式を追加してあげる必要があります。

dicrcファイルはインストールしているPythonの開発環境によって違いますが
大体、インストールしたPythonのファイル配下のLib\site-packages\unidic_lite
にあると思います。

dicrcファイルを見つけたらメモ帳などのエディターで開いて下記の内容を追加してください。

```
; ChaSen
node-format-chasen = %m\t%f[7]\t%f[6]\t%F-[0,1,2,3]\t%f[4]\t%f[5]\n
unk-format-chasen  = %m\t%m\t%m\t%F-[0,1,2,3]\t\t\n
eos-format-chasen  = EOS\n
```

その他の形式については下記のURLを参照してください。
http://taku910.github.io/mecab/format.html

これで"-Ochasen"が使えるようになります。
【Java】Javaを基礎から固めてオブジェクト指向を身につける①

#目的

* DMMWEBCAPカリキュラムのアウトプット
* Javaを通してオブジェクト指向について知る

#実際の手順と実例
###1.オブジェクト指向とは

カリキュラムに入る前にオブジェクト指向が何かわからなかったので、そこから触れていきます。

カリキュラム内の定義だと下記の通り

> オブジェクト指向とは、拡張性や保守性の高いプログラムを書くための考え方です。
プログラムが大規模になると複雑になりすぎて、プログラムの追加や修正が難しくなります。オブジェクト指向プログラミングであれば、そのような問題に悩まずに、大規模なプログラムを作成できます。これもJavaが普及した１つの要因です。

それならオブジェクト指向は？と聞かれたら、
「拡張性や保守性の高いプログラムを書くための考え方です。」と
答えればいいのか！と思った矢先に、他の記事を見てみると、

> オブジェクト指向とは？その答えは１つじゃない！

という記事を発見。
開発工程によってオブジェクト指向の捉え方が違うらしい。

参照

https://products.sint.co.jp/topsic/blog/object-oriented

上記記事によると今までなんとなく使ってた「.」（ドット）も「の」って意味で使ってたのもオブジェクト指向の1つであると分りました。

それ以外にも、メソッドやクラス、継承といった用語は全部オブジェクト指向の用語であるとのことです。

他にも、様々な記事を拝見させて頂き、下記にオブジェクト指向の内容をまとめました。

* オブジェクト指向とは、拡張性や保守性の高いプログラムを書くための考え方
* プログラムを手順ではなくて、モノの作成と操作として見る考え方
* 「ある役割を持ったモノ」ごとにクラス（プログラム全体の設計図）を分割し、モノとモノとの関係性を定義していくことでシステムを作り上げようとするシステム構成の考え方
* ソフトウェア設計とプログラム記述の際に用いられる考え方
* オブジェクトとは、変数とメソッドをまとめたもの


ここまでで一番しっくりきた記事はこちらです。

https://eng-entrance.com/what-oop#i

この記事の中には、
オブジェクト指向に明確な説明はないとありました、、、、


なので結論としては、**ざっくりと雰囲気やイメージで理解する！**というところに至りました（長々書いたのにすみません、、、）


Javaを通して、Rubyを学んでいたときは知ったかぶりをしていた「オブジェクト指向」を意識しつつ勉強を行っていきます。

そのためには、読むだけでなく、実際にコードを書いていくことが大事だと思うので、
まずは書いて、その後Qiitaに投稿してアウトプットしていきます◎




###2.Javaの特徴

* コンパイル言語である（人間が書いたソースコードを機械が読み取ることができるように変換する作業）を行ってからプログラムを実行するもの）
*  大規模開発向き
*  プラットフォーム非依存
    *  MacでもWindowsでも使える


ここまでで第１章完了です！


#参考にさせて頂いた記事

* [「オブジェクト指向」とは？プログラミングに必要不可欠な要素を解説！](https://robo-done.com/blog/2021/04/doneship_object_oriented/)
* [初心者向けに徹底解説！オブジェクト指向とは？](https://eng-entrance.com/what-oop#i)
* [オブジェクト指向とは？初心者にも分かりやすく解説します！](https://products.sint.co.jp/topsic/blog/object-oriented)
docker備忘録

### docker コマンド

```
docker build <build contexts>
docker run <image>
docker ps
docker exec <container>
```

#### Dockerfile
FROM : ベースのDocker imageを指定する

RUN : コマンドを実行するレイヤーの作成(基本はパッケージ管理などに使用する)

* imageのレイヤー数を少なくすることを意識する
    * 最初のうちはRUNを複数使ってキャッシュで効率的にビルドする
* レイヤーを構成するのは、RUN,COPY,ADD
* コマンドを&&でつなげる、\(バックスラッシュ)でつなげる



CMD : デフォルトコマンドを指定する（レイヤーにならないコマンドの実行）
　　　→ENTRYPOINTを使用時はパラメタを記載する
ENTRYPOINT : CMDと同じ※上書きされたくないコマンドを記載する

COPY : build context内のファイルをコンテナに送ることができる

ADD : COPYとできることは同じだが、使い所は圧縮ファイルを送って解凍するとき



#### Docker Deamon 

####　ホストとコンテナの関係
*ファイルシステムのマウント* : -v <host/path>:<container/path>
*ファイルへのアクセス権限* : -u $(id -u):$(id -g)
*ポートを接続(ポートフォワード)* : -p <host_port>:<container_port>
*コンピュータリソースの上限* : --cpus <#PhysicalCPUs> --memory <byte>
*コンテナの詳細を表示* : docker inspect <containerId> | grep -i <target>

```
docker run -v ~/hoge:/hoge -p 3000:3000 -it <docker_image> bash
```
Low Shuffle Mergeのパブリックプレビュー

[Announcing Public Preview of Low Shuffle Merge \- The Databricks Blog](https://databricks.com/blog/2021/09/08/announcing-public-preview-of-low-shuffle-merge.html)の翻訳です

**大幅なコスト削減、劇的なMERGEの高速化**

本日、AWS、Azure、Google Cloud上の[Delta Lake](https://databricks.com/jp/product/delta-lake-on-databricks)においてLow Shuffle Mergeがパブリックプレビューになったことを嬉しく思います。

新たに改善されたMERGEアルゴリズムは、特定ファイルの小規模の行をアップデートする様な一般的なユースケースにおいて、お客様のコストを大幅に削減し、劇的な高速化を実現します。そして、次世代クエリーエンジン[Photon](https://qiita.com/taka_yayoi/items/a22a45dcda8ac1a42936)と組み合わせることで、Low Shuffle Mergeはお客様に対して、かつてないパフォーマンス改善、劇的にコストパフォーマンスが改善されたMERGEオペレーションを提供します。さらに、Low Shuffle Mergeは、すぐに優れた性能を提供できる様に既存のデータクラスタリングをメンテナンスするので、頻繁にデータに対してZ-Orderを実行する必要性が削減されます。

Low Shuffle Mergeは、更新された行と一緒に処理を行うのではなく、更新された行を分離され、より整流化された処理モードで処理することで、優れた性能を提供します。このため、シャッフルされるデータの総量が劇的に削減され、性能改善へと繋がります。Low Shuffle Mergeにおいては、ユーザーが`MERGE`オペレーションを行った後に`OPTIMIZE ZORDER BY`を再実行する必要がなくなります。すでに(`OPTIMIZE ZORDER BY`を用いて)ソートされたデータに対しては、Low Shuffle MergeはMERGEコマンドによって更新されないすべてのレコードにおけるソート順を維持します。この改善によって、時間と計算コストを劇的に削減します。

# 使い始めてみる

Low Shuffle Mergeは無料ですぐに利用できます。お使いのクラスターを[Databricks Runtime 9\.0](https://docs.databricks.com/release-notes/runtime/9.0.html)にバージョンアップし、以下のspark configurationを設定してください。

```
SET spark.databricks.delta.merge.enableLowShuffle = true;
```

DatabricksのUIのClustersページから最新のDatabricksランタイムにアップグレードすることができます([詳細](https://docs.databricks.com/clusters/configure.html#databricks-runtime))。ノートブックで`MERGE INTO`を実行する前に、上記設定、あるいは[クラスターレベル](https://docs.databricks.com/clusters/configure.html#spark-configuration)ですべてのMERGEコマンドに自動で設定が適用される様にすることで、Low Shuffle Mergerを有効化してください。この機能が年末にGAになった際には、最新のDBR(Databricks Runtime)にアップグレードすることで、デフォルトでこの機能は有効化されることになります。

コストを削減し、さらに性能を改善するためには、Photonの使用を強くお勧めします。Photonに関してはこちらの[記事](https://qiita.com/taka_yayoi/items/a22a45dcda8ac1a42936)を参照ください。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
世界レベルのプロダクトが集まるProduct Huntの紹介

#はじめに
こんなサイトがあるならもっと早く知りたかったので、共有します。

https://www.producthunt.com/

#どんな人向けのサイトか
- **個人開発**をしている人
- **ポートフォリオ**のネタを探している人
- **世界のプロダクト**がどのようなものか勉強したい人
- 世界ではどのようなプロダクトが流行るのか知りたい人
- 単純にいろいろなプロダクトを眺めて楽しみたい人
- **新しいもの**が好きな人

#紹介
**Product Hunt**はシリコンバレーで生まれた**世界最大のプロダクトのキュレーションサイト**です。WEBサイト、モバイルアプリ、ガジェットなどの新しいプロダクトが毎日世界中から投稿されています。投票によって順位１日ごとに決まり、その順位が高いとランキングに載ります。ランクング上位に載ると投資家などに知ってもらえるチャンスになるようです。![スクリーンショット 2021-09-20 15.22.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764771/991f547a-3068-dacf-74c0-10c33f80709c.png)

また、AI、マーケティング、デザインなどトピックごとにプロダクトを探すこともできるので、自分の興味のある分野のものを探すことができます。

![スクリーンショット 2021-09-20 15.25.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764771/e03297f1-402c-272e-058b-a257b5e4fa51.png)

各プロダクト紹介ページは動画や画像と簡単な紹介文から構成されているので、比較的簡単にそのプロダクトの機能を理解できます。![スクリーンショット 2021-09-20 15.30.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764771/018a2fb0-2d28-bea7-0383-43909a1ddeb4.png)

もしも英語が苦手で気が進まないと思っても[DeepL](https://www.deepl.com/ja/translator/l/en/ja)を使えば簡単に翻訳できます。

https://www.deepl.com/ja/translator/l/en/ja

上の画像の例↓

![スクリーンショット 2021-09-20 15.34.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764771/e9d2e914-acba-c5a1-47ce-6e08a493fbd9.png)


#終わりに
朝起きたらProduct Huntをチェックするのを習慣にしたら、自然と海外のプロダクトについて詳しくなることができると思います。今回はProduct Huntをプロダクトを探す目線で紹介しましたが、自分で作って投稿したいという方は下の記事に詳しい方法が載っていますのでどうぞ。

https://blog.producthunt.com/how-to-launch-on-product-hunt-7c1843e06399


#参考記事
日本人の方でも投稿している方がいるようです。中には良い勝負をしている人もいてすごいと思います。

https://zenn.dev/nice2have/articles/120b1df8fcea2a

https://jp.taishikato.com/posts/i-want-to-prove-that-japanese-can-compete-in-english-speaking-countries

https://blog.notsobad.jp/entry/2019/12/23/232807

https://blog.notsobad.jp/entry/bungo-search-product-hunt

https://crieit.net/posts/7

https://qiita.com/tommy19970714/items/535be23561782fa099b2

https://qiita.com/kanye__east/items/c74eb10890c8f2a704ea

https://qiita.com/marieooq/items/c1345eede76ff882eae8

https://qiita.com/kanye__east/items/6ce521d08ca3a870b73e
WSL2におけるkubernetes環境の構築

# はじめに
windowsにはWSL2（Windows Subsystem for Linux）というLinuxターミナルがありますが、こちらでkubernetsを構築する際の覚書に記事を投稿しております。そのため、不足している部分とかあるかと思いますので、その点に気をつけていただいて読んでいただければと思います。。

# 手順
1. WSL2を[公式サイト](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)の手順に基づきインストールする。
1. ディストリビューション（[Ubuntu](https://www.microsoft.com/ja-jp/p/ubuntu/9nblggh4msv6?activetab=pivot:overviewtab)）をMicrosoftStoreからインストール
1. ubuntuを起動し、アカウント名とパスワードを入力してアカウントを作成する
1. 以下のコマンドを実行してパッケージを更新する。

```bash
sudo apt update
sudo apt -y upgrade
sudo apt -y dist-upgrade
```

5.dockerに必要なパッケージをインストール  

```bash
sudo apt install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

 sudo mkdir -p /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

※）途中でGPG関連のエラーが発生した場合は、以下のURLを参照してみてください。
https://co.bsnws.net/article/140

6. dockerのインストール

```bash
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
```

7. dockerをroot権限なしで実行可能にする

```bash
sudo usermod -a -G docker $USER
```

8. dockerを起動する。

```bash
sudo service docker start 
```

9. dockerの動作確認

```bash
docker run hello-world
```

10. [asdf](http://asdf-vm.com/guide/getting-started.html#_1-install-dependencies)（minikube、kubectlのバージョン管理に使用、他にもpythonなどのプログラミング言語の管理が可能）を導入する。

```bash
sudo apt install -y curl git
git clone https://github.com/asdf-vm/asdf.git ~/.asdf
cat <<EOF >> ~/.bashrc

# asdf setting
. $HOME/.asdf/asdf.sh
. $HOME/.asdf/completions/asdf.bash
EOF
exec $SHELL -l
```

11. asdfにより、minikubeとkubectlをインストールする

```bash
# minikubeのインストール
asdf plugin-add minikube
asdf list-all minikube   # minikubeのバージョン一覧が出てくる
asdf install minikube (インストールしたいバージョン)
asdf global minikube (インストールしたいバージョン)
# kubectlのインストール
asdf plugin-add kubectl
asdf list-all kubectl   # kubectlのバージョン一覧が出てくる
asdf install kubectl (インストールしたいバージョン)
asdf global kubectl (インストールしたいバージョン)
```

12. minikubeをスタートさせ、kubectlのバージョンを確認

```bash
minikube start --vm-driver=docker
kubectl version
```

13. kubernetsの動作確認を[公式サイト](https://kubernetes.io/ja/docs/tutorials/_print/)に基づいて行う

# あとがき
こちらの手順を踏んで、もし何かエラーが発生するようでしたらコメントなどしていただけると、記事の修正の参考になりますので助かります…。
非機能要件と、性能チェックポイント

各資料を基にしたまとめ。

## 非機能要件とは

- 「性能問題」と言われたりする。では「性能問題」とは何か。
- 「性能問題」が発生する条件とは何か。
- その中でのプログラムの位置付け
- プログラムが備えるべき特性


## 基本

[非機能要求グレードご紹介～システム基盤における非機能要求の見える化ツール～](https://www.ipa.go.jp/files/000005076.pdf)
[システム構築の上流工程強化（非機能要求グレード）：IPA 独立行政法人 情報処理推進機構](https://www.ipa.go.jp/sec/softwareengineering/std/ent03-b.html)
[非機能要件 - Wikipedia](https://ja.wikipedia.org/wiki/%E9%9D%9E%E6%A9%9F%E8%83%BD%E8%A6%81%E4%BB%B6)
[Non-functional requirement - Wikipedia](https://en.wikipedia.org/wiki/Non-functional_requirement)





## 詳細

### DBアクセスおよびDBサーバーの問題
#### SQL文の発行回数

- 大原則：SQLを発行する回数は少ない方が良い。
- 保留や例外：どれくらい減らすのは有効で、どれくらい減らすのは無駄か。
- 実装レベルでSQL発行回数を減らす方法（結合、キャッシュ、etc.）を工夫する。

#### 個々のSQL文の改善

- 実行計画の検討
- バインド変数の利用

#### データモデリングとDB表

- 正規化の得失

#### DBリソースの取得と解放

- 解放漏れがあった場合の影響
- 解放漏れの探し方

### APサーバーの問題
#### 時間計算量と空間計算量のトレードオフに関わる問題

- GC概要
- 連続メモリ領域の要求
- トレードオフを招くambivalentなキャッシュ

#### トレードオフになりづらい計算量の改善

- ループ内処理の順序の最適化
- 文字列加算の抑制
- オブジェクト生成の抑制
- 適切なキャッシュ

#### トレードオフになりづらいメモリ使用量の抑制

- 適切なキャッシュ（immutableオブジェクト）
- オブジェクト生成の抑制（遅延生成など）
- ここでも正規化
- クラスの属性を減らす
- トレードオフになりづらいディスクI/Oの問題
    - 一時ファイル利用の得失
- 同期処理（synchronization）に関わる問題
- Tips
    - 文字列関連クラスの扱い（String、StringBuffer、equals()、hashCode()
etc.）
    - 参照の繋ぎ方に気をつけよう
    - 配列に気をつけよう
    - n^2の計算量を避ける手法。
    - 何でもかんでも配列やリストを利用するのではなく、Map（連想配列）を積極的に利用しよう。
    - Map（連想配列）のキーにStringを使うのは避けよう。
        - etc.

### プログラムのタイプごとに固有の問題

#### オンライン・リアルタイム処理（サーブレット等）

- オブジェクトの寿命と可視範囲：
- JVM（正確にはクラスローダー）に対応するオブジェクト
- HttpSessionに対応に対応するオブジェクト
- HttpRequestに対応に対応するオブジェクト
- ユーザーの挙動（性能低下 -> ログオフしない -> メモリ逼迫 ->
gc頻発、という悪循環）

#### いわゆるバッチ

- 実行時間とキュー詰まりの問題
- 通常のJavaバッチ
    - メモリリークの避け方

### トラブルシューティングやテストに使えるツール

- SQL監視ツール
- JVMプロファイラ
- OSリソース監視ツール
- 負荷テストツール
- heapdump、javacore、GCログ分析ツール

## 参考

[オラクルコンサルが語る！性能問題を防ぐ適切な性能テスト手法とボトルネック解析手法](http://www.oracle.com/technetwork/jp/ondemand/db-new/f-9-ats-1448394-ja.pdf)
[AWS システム構築 非機能要件ヒアリングシートを公開してみた | DevelopersIO](https://dev.classmethod.jp/articles/survey-non-functional-requirement/)

以上、参考になればさいわいです。
GASでOCR


```
function ocr(){
  
  var testOCR = DriveApp.getFolderById('フォルダID');
  //testOCRフォルダからpdfファイル取得
  var pdfFiles=testOCR.getFiles();
   
  while(pdfFiles.hasNext()){
     
    var pdfFile=pdfFiles.next();
    var fileName=pdfFile.getName();
 
    //作成するドキュメントの情報
    var resource={
      title: fileName, //ファイル名
      mineType: 'pdf'  //ファイルタイプ
    };
    //ファイルからBlobオブジェクト取得
    var data=pdfFile.getBlob();
  }
  
  //OCR有効化、ファイルID取得
  var fileId = Drive.Files.insert(resource, data, {ocr: true}).id;
  var newFile=DriveApp.getFileById(fileId);
 
  //ドキュメントファイルをtestOCRフォルダへ
  testOCR.addFile(newFile);
  DriveApp.getRootFolder().removeFile(newFile);

  var text = DocumentApp.openById(fileId).getBody().getText();
  var jaText = LanguageApp.translate(text, "en", "ja");
  Logger.log(jaText);

}
```
AWS サイトのhttps化の手順

既に　お名前.com等のレジストラにて取得した、ドメインのサイト構築にAWSを利用更に、HTTP化の手順を紹介します。
１、取得済みのドメインをレジストラのネームサーバーの設定（変更）にてAWSRoute53のコンソールにてホストゾーンを作成ネームサーバのを確認
参考
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/3ba02236-f8f9-d74b-1cab-b7989a38ee2d.png" width="60%">
結果のネームサーバをレジストラのネームサーバ設定にて変更する。
ns-1443.awsdns-52.org.
ns-1625.awsdns-11.co.uk.
ns-46.awsdns-05.com.
ns-691.awsdns-22.net.

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/aa26acb1-1b07-a933-d450-d4d1d4e31128.png">

![スクリーンショット 2021-09-21 3.34.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/1638342d-f81b-b51e-b73f-373ef8f32013.png)

![スクリーンショット 2021-09-21 3.34.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/8e764648-7c5d-4959-662d-634195295900.png)
各レジストラの操作にて実行。

２、証明書の発行
AWSのCertificate Managerにより証明書を発行し、
forEachの中で非同期処理を行う際、awaitやPromiseを使ってすべての作業が完了するまで待ちたい。

## はじめに ～ 非同期forEachは一斉に処理が始まる（並列処理？）

非同期処理とforEachについての簡単なプログラムを以下に示す

```javascript:sample.js
const array = [1, 2, 3, 4, 5]

array.forEach(n => {
    setTimeout(() => {
        console.log(`${n}秒待ちました。`)
    }, n*1000);
});
```

これを実行すると以下のように出力される。

```
1秒待ちました。
2秒待ちました。
3秒待ちました。
4秒待ちました。
5秒待ちました。
```

さて、この出力は1秒おきに1行ずつ表示されるため、5種類の ```setTimeout(() => {})``` が同時に実行されていることが分かる。（正確には同時ではないが）


## つまづいた点 ～ 処理が終わってないのにforEachがスルーされている？（←勘違い）

とりあえずforEachの後ろに出力を追記する。

```javascript:sample.js
const array = [1, 2, 3, 4, 5]

array.forEach(n => {
    setTimeout(() => {
        console.log(`${n}秒待ちました。`)
    }, n*1000);
});

console.log('forEach完了！')
```

出力はこうなる。

```
forEach完了！
1秒待ちました。
2秒待ちました。
3秒待ちました。
4秒待ちました。
5秒待ちました。
```

違う、そうじゃない、非同期処理が終わってから知らせてほしいんだと小一時間頭を悩ませた。
しかし実はこの出力、何も間違っていなかったのである。

今回のコードの場合、forEachのそれぞれのステップにおいて ```setTimeout(() => {})``` が実行された時、別の場所で「1秒待って出力」という処理は行われているが、そのforEachのステップ自体は完了している。
したがって、 ```forEach完了！``` は本当にforEachが終了したからこそ出力されたのだ。


## 解決に向けて ～ Promise.all の勉強

ではどうすればforEach内のすべての非同期処理が完了したことを検知することができるのか。

答えは ```Promice.all``` である。

5回分の非同期処理をPromiseを使って行い、すべてのPromiseが完了したことを ```Promice.all``` で検知することができる。
まず簡単な ```Promice.all``` を使ったコードを書いてみよう。

```sample2.js
const Promise1 = new Promise((resolve) => {
    setTimeout(() => {
        console.log(`1秒待ちました。`)
        resolve();
    }, 1000);
})

const Promise2 = new Promise((resolve) => {
    setTimeout(() => {
        console.log(`2秒待ちました。`)
        resolve();
    }, 2000);
})

Promise.all([Promise1, Promise2])
    .then(() => {
        console.log('Promise 2つとも完了')
    })
```

結果

```
1秒待ちました。
2秒待ちました。
Promise 2つとも完了
```

2つのPrimiseを用意し ```Promise.All``` に配列として渡すことで、 ```Promise.all``` は全て終わった後に ```.then``` の処理を実行する。

## 解決策 ～ Primises配列にpushしていく

では ```forEach``` で ```Promise.all``` を使うにはどう記述すればいいか？
私の場合はこうなった。

```sample.js
const array = [1, 2, 3, 4, 5]
var Promises = []

array.forEach(n => {
    Promises.push(
        new Promise((resolve) => {
            setTimeout(() => {
                console.log(`${n}秒待ちました。`)
                resolve();
            }, n*1000);
        })
    )
});

console.log('forEach完了！')

Promise.all(Promises)
    .then(() => {
        console.log('forEach(中の非同期処理も含めて)完了！')
    })
```

結果

```
forEach完了！
1秒待ちました。
2秒待ちました。
3秒待ちました。
4秒待ちました。
5秒待ちました。
forEach(中の非同期処理も含めて)完了！
```

## まとめ
なんだかたかがforEachのためにネスト深くなっちゃったけどやりたいことができたのでヨシ。

間違っている点、こうしたほうが良い点、根本的に別の方法があるよ～などございましたらコメントを頂けると幸いです。
整数配列と整数ターゲットが与えられた場合、2つの数値の合計がターゲットと同値になり、indexを返却する

####趣向
ターケットの値と配列の中のいずれかの値を足した数が同値の場合のindexを
返却する必要があり、結構悩みました。

####例
nums = [2,7,11,15], target = 9の場合[0,1]
nums = [3,2,4], target = 6の場合[1,2]
nums = [3,3], target = 6の場合[0,1]
nums = [3,0,3], target = 6の場合[0,2]

```python:python3
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        stay = {}
        for index, number in enumerate(nums):
            difference = target - number
            if difference in stay:
                return [stay[difference], index]
            else:
                stay[number] = index
```

結構悩みましたね^^;
これ以外の実装方法も色々とありそうですが、、これしか浮かびませんでした。
CentOS7へocsinventory-agentをインストール

##OCSInvebntory-agentをCentOS7へインストール
###インストール
```bash
wget https://rpm.ocsinventory-ng.org/ocsinventory-release-latest.el7.ocs.noarch.rpm
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

yum install epel-release-latest-7.noarch.rpm ocsinventory-release-latest.el7.ocs.noarch.rpm
yum install ocsinventory-agent
```
###設定変更
OCSInventory-serverへ向ける設定
・/etc/ocsinventory/ocsinventory-agent.cfg抜粋


```diff:
- local = /var/lib/ocsinventory-agent
+ #local = /var/lib/ocsinventory-agent　#コメントアウト
+ server = "http://[ocsinventory-server]/ocsinventory" #追記
```


・/etc/sysconfig/ocsinventory-agent抜粋

```diff:
# Mode, change to "cron" to activate
- OCSMODE[0]=none
+ OCSMODE[0]=cron #none→cronへ設定変更 
```
→コメントにもある通りOCSinventory-agentをAcitveにするためcronと設定する。

###OCSINventory-Serverとの通信
Cronによる毎時起動（cron.hourly）もしくは以下のコマンドを実行すると、OCSINventory-Serverへ通信をおこなう。


```bash
ocsinventory-agent
```

通信が行われると、OCSINventory-Server上にAgentをインストールしたサーバが自動的に登録される。
ラズパイにkali Linuxを入れてmacからリモートデスクトップをするまで

#項目
1. ラズパイに`kali linux`を入れる
1. リモートデスクトップを繋げたりする

#1. ラズパイに`kali linux`を入れる
## micro sdカードのフォーマット
https://www.sdcard.org/jp/downloads/formatter_4/

- 上記をインストール。
- sdカードをpcに接続
- 上記のフォーマッターを開いて`クイックフォーマット`

## `kali Linux`のダウンロード
https://www.kali.org/get-kali/#kali-virtual-machines

- 上記の`ARM`、その一番上にある`32bit`をダウンロード

https://itunes.apple.com/jp/app/the-unarchiver/id425424353?mt=12

- 上記をインストール
- インストール後、前述のダウンロードした物を右クリック -> このアプリケーションで開く -> `The Unarchiver`を選択

## sdカードへ`kali Linux`を移す

```bash:ターミナル
$ diskutil list
#ここでsdカードがちゃんと接続されているか確認

$ diskutil unmountDisk /dev/disk2
#sdカードのアンマウント
```
- 解凍した`kali`の情報を見る
- `場所の欄をコピー/名前と拡張子の欄にあるテキスト`、これらを適当にテキストエディタに貼り付けておく
- `sudo dd if=先ほど貼り付けたもの of=/dev/rdisk2 bs=1m` <- これを作成

```bash:ターミナル
$ sudo dd if=先ほど貼り付けたもの of=/dev/rdisk2 bs=1m
#10分ぐらいで終わる
```
- 終了後、ラズパイにsdカードを挿して起動

```bash:
user: kali
pass: kali
```
- これでログイン出来ればOK

# 2.リモートデスクトップを繋げたりする
## 一応macから接続する方法

```bash:ターミナル
$ ssh -l kali IPアドレス
```

## `vnc`で接続する準備

```bash:kaliのターミナル
$ sudo apt-get update

$ sudo apt-get install tightvncserver

$ tightvncserver
#この辺りで何回かパスワード設定を要求される

$ sudo apt-get install lxde

#もしかしたらsudo rm /tmp/.X1-lockするかも...

$ nano ~/.vnc/xstartup
```

- 下記に書き換え

```bash:~/.vnc/xstartup
#!/bin/sh

xrdb $HOME/.Xresources
xsetroot -solid grey
#x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#x-window-manager &
# Fix to make GNOME work
export XKL_XMODMAP_DISABLE=1
/etc/X11/Xsession
/usr/bin/startlxde
```

```bash:kaliターミナル
$ vncserver -geometry 1440x900 :1
```
- finderを開いて、`移動` -> `サーバへ接続` -> `vnc://ラズパイのIPアドレス:5901`
- パスワードは上で接続したのを入力
同じ名前のファイルをディレクトリに整理する

自分用メモ
# 状況
同じ名前で拡張子の違うファイルがたくさんある

```
.
├── hoge_20210828.pdf
├── hoge_20210828.tex
├── hoge_20210901.pdf
├── hoge_20210901.tex
├── hoge_20210903.pdf
├── hoge_20210903.tex
```
みたいな状況．これを，

```
.
├── hoge_20210828
│   ├── hoge_20210828.pdf
│   └── hoge_20210828.tex
├── hoge_20210901
│   ├── hoge_20210901.pdf
│   └── hoge_20210901.tex
├── hoge_20210903
│   ├── hoge_20210903.pdf
│   └── hoge_20210903.tex
```
にしたい．

#結論

```shell
ls|grep -e "tex" -e "pdf"|xargs -I{} sh -c 'FILE={}; mkdir -p ${FILE%.*}; mv $FILE ${FILE%.*}/$FILE;'
```

できた〜，もう少し綺麗にかけそうだけど，動いたのでヨシ！（教えてえらい人）
今年こそシェルスクリプト勉強するって言ってはやn年…今年こそは…

#参考

https://qiita.com/ritukiii/items/968f17f9c308743e85a7

https://qiita.com/hitode7456/items/6ba8e2d58f9b8db9de11

https://qiita.com/mriho/items/b30b3a33e8d2e25e94a8
python初心者はWordCloudで遊んでみたい3

#前回まで
前回はjanomeを使って色々やって遊んでた。やっぱり楽しい。
今回はWordCloudを使って多く使われている文字を可視化していく。　
#環境
Google Colaboratory
※WordCloudでGoogle Colabでやる場合、pipでインストールせずそのままできます。

#とりあえずやってみる
※sample.txtには、赤ずきんの英語版が書き込んであります。

```python
from wordcloud import WordCloud

f = open("sample.txt", "r", encoding="UTF-8")
text = f.read()

#オブジェクトを作成
wordcloud = WordCloud()
#（文字列）からwordcloudを作成
wordcloud.generate(text)
#画像を作成
wordcloud.to_file('wc1.png')
```

##実行結果
![wc1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2018163/40148f8d-d81e-ca03-64e3-d873c20f06ef.png)
しっかり、Redやgrandmathierなどが大きく表示されています。



※作成した画像はcontentの下に保存されています。
![スクリーンショット 2021-09-21 0.58.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2018163/7af0bc02-d9a0-bfc6-cb67-f85182b8f223.png)

#書式をいじくってみる
画像サイズや背景、文字の色などを変更することができます。

```python
from wordcloud import WordCloud

f = open("sample.txt", "r", encoding="UTF-8")
text = f.read()

wordcloud = WordCloud(background_color="white",
               colormap="summer",
               collocations=False)

wordcloud.generate(text)
wordcloud.to_file('wc2.png')
```

##実行結果
![wc2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2018163/d2136390-7309-9b25-b942-ef1a20da2032.png)
background_color : 背景色
colormap : 文字の色
collocations : 連語を分割して一つの単語にする

他にも、使用する単語の最大数、不要な単語を表示しない、表示する文字数を制限、などがある。
上記のやつ以外も割とあるがどれも使わなそう...

#まとめ
今回は、WordCloudを軽く触ってみた。物語だと出るだろうなって文字が出てくるが歌詞など、Twitterのツイートなどだとイメージが湧かないからとても面白そう。
次回は、一番つまずくと書かれていた日本語化をやっていく。
エクセル線形補完備忘録

備忘録　キーワード　SOC,Li-ion,線形補完

Sub hokan()
    
    Dim i, k, v, count As Long
    s = Range("E6:O7").Value
    
    For i = 1 To 11
    Cells(1, i).Value = s(2, i)
    Next i
    
    Dim Delta, Delta1, Delta_y, Delta_y1
    Dim x() As Integer
    Dim z(10000, 10000) As String
    z(1, 1) = s(1, 1)
    z(2, 1) = s(2, 1)
    count = 1
    
    
    For v = 1 To 4
        Delta = (s(1, 2) - s(1, 1)) / 4
        Delta1 = s(1, 1) + Delta * v
        z(1, v + 1) = Delta1
        Delta_y = (s(2, 2) - s(2, 1)) / 4
        Delta_y1 = s(2, 1) + Delta_y * v
        z(2, v + 1) = Delta_y1
        
    Next v
    For k = 2 To 10
        For v = 1 To 4
        Delta = (s(1, k + 1) - s(1, k)) / 4
        Delta1 = s(1, k) + Delta * v
        z(1, v + count * 4) = Delta1
        Delta_y = (s(2, k + 1) - s(2, k)) / 4
        Delta_y1 = s(2, k) + Delta_y * v
        z(2, v + count * 4) = Delta_y1
        Next v
        count = count + 1
    Next k
    
    For i = 1 To 50
    Cells(2, i).Value = z(1, i)
    Cells(3, i).Value = z(2, i)
    Next i
    
    
 
End Sub
Elixirのイメージで使われているOTPのバージョンを確認する。


```zsh
docker-compose run <container_app_name> bash
```

コンテナの中で下記のように確認します。

```bash
Creating phx_mysql_template_app_run ... done
bash-5.0# which erl
/usr/local/bin/erl
bash-5.0# cd /usr/local/bin/
bash-5.0# ls -l erl
lrwxrwxrwx    1 root     root            21 Dec 21  2020 erl -> ../lib/erlang/bin/erl
bash-5.0# cd ../lib/erlang/
bash-5.0# cat releases/
23/             RELEASES        RELEASES.src    start_erl.data  
bash-5.0# cat releases/23/OTP_VERSION 
23.2.1
```

使われているOTPのバージョンは`23.2.1`でした。
Chart.js 3系と2系のオプションの違い 2021/9/21

Chart.jsは2系と3系で大きくオプションが変わっているそうで、昔の記事からコードをコピペすると全然上手く動きません。
ということで、Chart.js3系を使ってみて2系からの違いをまとめていこうと思います！

基本は以下のドキュメントに記載されていますが、サンプルコードが無いので分かりづらい。
https://www.chartjs.org/docs/latest/getting-started/v3-migration.html

## fontSize
2系

```js
fontSize:20
```

3系

```js
font: {
  size: 20
}
```
## title
2系

```js
title: {
  display: true,
  text: "Chart Title",
}
```

3系
いくつかのオプションは`plugins`の中に入れるようになりました。

```js
plugins: {
  title: {
    display: true,
    text: "Chart Title",
  }
}
```

## legend 凡例
2系

```js
legend: {
  display: false
}
```

3系
いくつかのオプションは`plugins`の中に入れるようになりました。

```js
plugins: {
  legend: {
    display: false
  }
}
```

## scale
2系

```js
scale :{
  ticks: {
    beginAtZero: true,
    stepSize: 50,
    fontSize: 20,
  },
}
```

3系
scaleという設定値が削除され、scales[r]の形式で表されるようになったそうです。

```js
  scales: {
    r: {
      ticks: {
        beginAtZero: true,
        stepSize: 50,
        font: {
          size: 20,
        },
      },
    },
```
Rust初心者が躓いた単語のまとめ Part1 2021/09/21

Rustを学んでいく上で、分からなかった単語を調べたので備忘録として投稿です。
分からないことが沢山出てくるので、Part2に続く予定。分からないことが出るたびに、この投稿に追加していっても良いのですが、モチベーション的に記事が増えてく方が嬉しいので。

## cargo
Rustのビルドシステム兼パッケージマネージャ。
Rustを使う際にはこちらも必須となる。
以下コマンド例

```
//プロジェクトの作成。hello_world_projectフォルダ配下に必要なファイルが作られる。
cargo new hello_world_project

//プロジェクトのビルド。実行可能なファイルが作成される。target\debug配下にhello_world_project.exeが作られる。
cargo build
//ビルドしたファイルを実行する。
.\target\debug\hello_world_project.exe

//プロジェクトのビルドと実行を行う。実行可能なファイルがあり、ファイルが変更されてない場合はビルドは飛ばす。
cargo run

//コンパイル可能か確かめる
cargo check

//リリース用のビルドを行う。target\release配下に実行可能ファイルを作成する。最適化する関係で、コンパイルに時間がかかるため普段は使わない。
cargo build --release

//クレートをインストールする
cargo install cargo-edit
```

参考：　https://doc.rust-jp.rs/book-ja/ch01-03-hello-cargo.html
　


## クレート
英語表記はcrate。
他言語では一般的に、「ライブラリ」「パッケージ」と呼ばれるもの。
クレート追加は以下のようにcargoを用いて行う。

```
cargo install cargo-edit
```


## rustup
Rustプロジェクトが公式に提供しているインストーラーのこと。
Rustのツールチェーンをインストールする際に、rustupコマンドにてインストールできるようになる。
例えば以下のようなコマンドで、Cargo、rusttcなどをインストールする。

```
rustup component add rls rust-analysis rust-src
```

## Language Server
※Rust特有の話ではない
rustではRust Language Serverやrust-analyzerを使う。
2021現在では、rust-analyzerを使う方が良い様子。後述参考サイト。
Language Serverとは、VSCodeなどのIDEが提供しなくてはいけない「補完機能」や「型の表示」を行うためのプログラムのこと。
Language ServerにむけてLanguage Server Protocolで定められたJSON方式でリクエストを送れば、Language Serverから必要な情報が返ってくる。
何が良いかというと、IDEで補完機能などをサポートしたいとき、IDE固有に実装をする必要が無くなる。エディタはエディタとしての機能を追求すればよく、補完などの機能は外部のLanguage Serverに任せれば良いというわけだ。


参考：
　とても分かりやすいQiita記事：　https://qiita.com/atsushieno/items/ce31df9bd88e98eec5c4
　rustのデバッグについて載っているQiita記事（こちらでもrust-analyzer）：　https://qiita.com/legokichi/items/e2f807f70316a916f4be
　その他radditでrust-analyzerの方が良いと書かれている記事があったが、Qiitaでは何故か投稿に含められなかったので載せていない。
ABC136 C - Build Stairs に苦しめられた

https://atcoder.jp/contests/abc136/tasks/abc136_c

![abc136_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/cd5a4c51-93d2-e2d1-97d0-98b0d431f07f.png)
![abc136_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/69f757de-b64d-344a-5fda-dc6eaa99bd69.png)
![abc136_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/639f52e4-5e33-3ac1-709c-c92f580d9f2a.png)

サクッと、0,1,2,3,... と順番にやっていけば良くね？
そんな軽い気持ちが苦労の始まり。。

```BuildStairs_r0.py
n = int(input())
X = list(map(int,input().split()))
from sys import exit
 
for j in range(n-1):# O(10^5)
    if X[j] > X[j+1]:
        X[j] -=1
 
for k in range(n-1):# O(10^5)
    if X[k] > X[k+1]:
        print("No")
        exit()
print("Yes")
```

なぜ、WA かわからない。ググってみも皆、後ろから試してる。。。
そんな自分に、救いの手が。。

https://muhenkou.net/?p=7753

```test_case.py
#case1
4
1 2 2 1

#以下のケースも検討すべきだと思った。

#case2
4
1 3 3 2
```

上記をもとに再検討する。

```BuildStairs_r0.py
n = int(input())
X = list(map(int,input().split()))
from sys import exit
 
for j in range(n-1):# O(10^5)
    if X[j] > X[j+1]:#分岐条件
        X[j] -=1
    #前述の分岐条件を抜けたとしても、X[j] を下げないと
    #エッジケースを切り抜くことが出来ない。
    elif X[j-1] <= X[j]-1:
        X[j] -=1
 
for k in range(n-1):# O(10^5)
    if X[k] > X[k+1]:
        print("No")
        exit()
print("Yes")
```

とおった(泣)。。なんで駄目だったか。分かって嬉しい。。

***

あれから時間が経って、すっかり忘れた状態で再チャレンジ
汚いコードだったが通った。素直に嬉しい。

```abc136c.py
N = int(input())
H = list(map(int,input().split()))

#if 文で条件する場合、確実に分かることを少しずつ切り分けると
#整理しながら進めることが出来る。
                                       
REF = H[0]                             #Step1:比較する基準値、最初は H[0]
for i in range(N):                     
    if REF == H[i]:                    #Step2:基準値とH[i]が同じなら何もしなくて良い
        pass                           
    elif REF > H[i] and REF-H[i] > 1:  #Step3:基準値 > H[i] であり、かつ差分が 
        print("No")                    #      2以上なら手の施しようがない."No" として EXIT していい
        exit()                         
    elif H[i]-REF == 1:                #Step4:基準値とH[i]の差分が 1 なら引いておこう
        H[i] -= 1                      #      適当に見逃すと、コーナーケースを潰せない可能性が高い
    elif H[i]-REF > 1:                 #Step5:基準値とH[i]の差分が 2 以上なら、間違いなく
        H[i] -= 1                      #      H[i] -= 1 とした方がいい。じゃないと話が進まない(笑)
        REF = H[i]
#print(H)

for j in range(N-1):
    if H[j+1]-H[j]<0:
        print("No")
        exit()
print("Yes")
```
非同期関数のループ処理 - Part4（Promise.allを使用）

##他の処理方法との違い
Part1ではforEach + async/await、Part2ではforLoop + async/await、Part3ではforLoop + promise/thenメソッドを使いましたが、今回は、伝家の宝刀、Promise.all()を使用してテストします！

##ループ処理の内容
フェイク非同期関数（fakeDatabaseQuery）を作成し、その関数がpromiseオブジェクトをリターンする形にします。

また、ファンクションprocessArrayの中では、Array.prototype.map()を使用して、Promiseオブジェクトがアレイに詰め込まれた100回分の処理のひな型（const promises）を作り、それに対して、Promise.all()で100回分の処理を一気に行います。

その際、順番が変わらないので、ソートをかける必要はありません。

##まとめ
このような非同期関数をループ実行する場合、Promise.allを使ったsyntax（構文）は、シンプルかつ処理が高速ということで、最もおすすめな方法です。

##その他
下記のサンプルコードは、Node.js v14.15.5でテストしたものです。また、私が利用している環境（Ubuntu + Node.js）では、処理時間は115ms ~ 120msとなりました。

##サンプルコード

```JavaScript:
console.time();

//forLoopを使って、整数1~100が入っているarrayを作ります
let arrayN = [];
const arrayLength = 100;
for (let i = 0; i < arrayLength; i++) {
    arrayN.push(i+1);
}

//データベース検索を偽装したフェイク非同期関数
function fakeDatabaseQuery (index) {
    //ランダム関数により、2桁の整数を生成
    const elapse = Math.floor(Math.random() * 100);
    return new Promise(function(resolve, reject) {
        const result = {
            index:index,
            elapse:elapse
        }
        //setTimeoutを使い、意図的に遅延を作ります。
        setTimeout(() => resolve(result), elapse);
    });
}

async function processArray(array) {
    //mapを使って、100セットのプロミスオブジェクトが詰め込まれたアレイpromisesを作成
    const promises = array.map(fakeDatabaseQuery);
    //Promise.all()を使って、100セットの処理を同時に開始
    //awaitが効いているので、すべてfulfilledになってから、fakeSearchResultへ値を代入
    const fakeSearchResult = await Promise.all(promises);

    console.log('fakeSearchResult', fakeSearchResult);
    console.log('Done!');
    console.timeEnd();
}

processArray(arrayN);

```

https://qiita.com/soichirowada/items/894be5a2532b477c4b29

https://qiita.com/soichirowada/items/77d358ea64f85d21667b

https://qiita.com/soichirowada/items/7f0ad6c55075252ee012

https://qiita.com/soichirowada/items/263ee198c3d793be6f59
react-qr-readerをNext.jsで動かす方法

## そのままでは起動しない
react-qr-readerをNext.jsで動かそうとすると、次のエラーメッセージが表示されます。

```
ReferenceError: Blob is not defined
```

本記事では、このエラーを回避する方法を紹介します。

## 前提

```json
{
  "dependencies": {
    "next": "11.1.0",
    "react": "17.0.2",
    "react-dom": "17.0.2",
    "react-qr-reader": "^2.2.1"
  },
  "devDependencies": {
    "@types/node": "^16.7.1",
    "@types/react": "^17.0.19",
    "@types/react-qr-reader": "^2.1.4",
    "typescript": "^4.3.5"
  },
}
```


## react-qr-readerを動的にインポートする
Nextのdynamicを用いて動的インポートすることで解決できます。

```tsx
import QrReader from 'react-qr-reader'
```

　　　↓　書き換え

```tsx
import dynamic from 'next/dynamic'
const QrReader = dynamic(() => import('react-qr-reader'), { ssr: false })
```

## 参考文献
https://github.com/JodusNodus/react-qr-reader/issues/96
docxファイルをターミナルからコンバートする

# はじめに
大量のdocxファイルをtxtやhtmlに変換する場合、いちいちMSOfficeを使っていたら大変ですよね。
macOSやLinuxサーバで処理させたい時もあると思います。
macOSやLinuxのshellからコマンドでできればcronで処理もできるし、色々便利。
ここではLibreOfficeとunoconvを使った方法を紹介します。

# 動作確認環境
macOS BigSur(11.2)
Ubuntu 20.04

# unoconvのインストール
ユニバーサルオフィスコンバータ　unoconv
version 0.9.0
unoconv自体はpythonスクリプトのようです。

https://github.com/unoconv/unoconv

4年ぐらいメンテされていませんが動きます。

```sh:macの場合
$ brew install unoconv
```
```sh:linuxの場合
$ sudo apt-get install unoconv
```

# LibreOffice
version 7.2.1.2

https://ja.libreoffice.org/

macの場合はインストーラをダウンロードして、そのままインストールでOK。
Ubuntu20.04の場合はLibereOffice 6.4.7.2が最初からインストールされています。

↓ここの説明だと「LibreOfficeの新しいバージョンは現在Mac用のunoconvと互換性がなく、LibreOffice 4.2をインストールする必要があります」とありますが、macOS Big Surでは4.2がクラッシュしますので最新版の7.2をインストールしてください。

https://docs.moodle.org/3x/ja/%E3%83%A6%E3%83%8B%E3%83%90%E3%83%BC%E3%82%B5%E3%83%AB%E3%82%AA%E3%83%95%E3%82%A3%E3%82%B9%E3%82%B3%E3%83%B3%E3%83%90%E3%83%BC%E3%82%BF_(unoconv)

# unoconvコマンド
##### .docxを.txtに変換
```sh:shell
$ unoconv -f txt hoge.docx
```
##### .docxを.htmlに変換
```sh:shell
$ unoconv -f html hoge.docx
```
##### .docxを.pdfに変換
※pdfへも変換できますが、体裁がくずれます。

```sh:shell
$ unoconv -f pdf hoge.docx
```

rubyからはsystemコマンドで呼び出せます。

```sh:ruby
$ system("unoconv -f txt hoge.docx")
```
SQLで全称量化をHAVINGで表現する場合とNOT EXISTSで表現した場合の違い

## はじめに

今回、書くクエリ

**step1まで完了しているproject_idが欲しい**

2パターン書いていきます。

- 集合レベルの操作を行うという点で `EXISTS` と `HAVING` はわりと互換性があるそうです
- 比較して書いていきます

以下のような、工程管理プロジェクトテーブルがあるとします。

各工程の完了しているかどうかの列が `status` にあります。

| id  | project_id | step | status    |
| --- | ---------- | ---- | --------- |
| 1   | AA100      | 0    | completed |
| 2   | AA100      | 1    | stand-by  |
| 3   | AA100      | 2    | stand-by  |
| 4   | B200       | 0    | stand-by  |
| 5   | B200       | 1    | stand-by  |
| 6   | CS300      | 0    | completed |
| 7   | CS300      | 1    | completed |
| 8   | CS300      | 2    | stand-by  |
| 9   | CS300      | 3    | stand-by  |
| 10  | DY400      | 0    | completed |
| 11  | DY400      | 1    | completed |
| 12  | DY400      | 2    | completed |

Schema

```sql
CREATE TABLE projects (
  id INT NOT NULL PRIMARY KEY auto_increment,
  project_id TEXT,
  step INT,
  status TEXT
);
    
INSERT INTO projects VALUES
	(1, 'AA100', 0, 'completed'),
	(2, 'AA100', 1, 'stand-by'),
	(3, 'AA100', 2, 'stand-by'),
	(4, 'B200', 0, 'stand-by'),
	(5, 'B200', 1, 'stand-by'),
	(6, 'CS300', 0, 'completed'),
	(7, 'CS300', 1, 'completed'),
	(8, 'CS300', 2, 'stand-by'),
	(9, 'CS300', 3, 'stand-by'),
	(10, 'DY400', 0, 'completed'),
	(11, 'DY400', 1, 'completed'),
	(12, 'DY400', 2, 'completed');
```

## HAVINGを使った集合指向的なクエリ

### Query

```sql
SELECT project_id
FROM projects
GROUP BY project_id
HAVING COUNT(*) = SUM(CASE WHEN step <= 1 AND status = 'completed' THEN 1
                      WHEN step > 1 AND status = 'stand-by' THEN 1
                      ELSE 0 END)
```

各プロジェクトごと、

- stepが1以下で`completed`の行数
- stepが1より大きくてで`stand-by`の行数

を足した場合、グループ全体の行数と一致する。という感じで検索しています。

### Results

| project_id |
| ---------- |
| CS300      |

## NOT EXISTSを使った場合

まず、全称命題を書きます。

**全行（全プロジェクト）について肯定番号が1以下ならばcompletedで、1より大きければstand-byである**

これを`NOT EXISTS`で表現すれば、全称量化的なクエリになります。

### Query

```sql
SELECT *
FROM projects P1
WHERE NOT EXISTS (
	SELECT status
	FROM projects P2
	WHERE P1.project_id = P2.project_id
    AND status <> CASE WHEN step <= 1 THEN 'completed'
                                      ELSE 'stand-by' END);
```

### Results

| id  | project_id | step | status    |
| --- | ---------- | ---- | --------- |
| 6   | CS300      | 0    | completed |
| 7   | CS300      | 1    | completed |
| 8   | CS300      | 2    | stand-by  |
| 9   | CS300      | 3    | stand-by  |


### NOT EXISTSを使った場合

デメリット

- 意味がわかりにくい（二重否定なので）

メリット

- パフォーマンスがいい
    - 1行でも満たさない条件があればそこで検索を終了できるので
    - 結合条件でproject_id列のindexも利用できるので、さらに高速化が期待できる
- 結果に含められる情報量が多いこと
    - `HAVING`の方は集約されるのでproject_idしかわからない


以上です。

## 参照

https://www.amazon.co.jp/dp/4798157821/

96 - 98p

## アウトプット100本ノック実施中

https://qiita.com/ryosuketter/items/713474dbd009870e4103