OmniAICreator/Qiita-1.07M huggingface dataset:
python-kabusapiの使い方

# 概要

[前回](https://qiita.com/shirasublue/items/16ff9d1fea54b0ef648e)、kabuステーション®API - REST API用のPythonラッパーを作成したが、簡易的な使用方法を述べる。
また、実際に自分が保有中銘柄や注文中銘柄の確認で使用しているコードを記載する。

Github 参照: https://github.com/shirasublue/python-kabusapi

# 環境

- Windows 10
- Python 3.8.5 ( Microsoft Store からインストール )

# 大まかなフロー

## 通常の場合

1. `kabusapi` をインポートする。
2. `Context` で初期設定を行う。
3. 煮るなり焼くなりする。

## 複数のプログラムを同時実行する場合

1. 同様
2. `Context` の初期設定で、最初に立ち上げた他のプログラムから取得した`token`を指定する。
3. 煮るなり焼くなりする。

# サンプルコード

### インポート・トークン取得

```python
import kabusapi
api = kabusapi.Context('localhost', '18080', 'hogehoge')
```

ちなみに、`Context` の引数のデフォルト値は

```python
hostname='localhost',
port=18080,
password=None,
token=None,
```
となっているため、通常の使い方では以下のようにパスワードのみ指定すれば本番環境に接続できる。

```python
api = kabusapi.Context(password='hogehoge')
```
また、kabuステーションAPIでは、トークンを取得する度・または起動する度にトークンが変更される。
他プログラムで`token`が取得されている場合は、以下のようにして設定可能である。

```python
api = kabusapi.Context(token='fugafuga')
```

トークンを確認するには、`api.token` を参照すればよい。

```python

print(api.token)
```


### 保有中の銘柄表示

```python

positions = api.positions()

positions = sorted(positions, key=lambda x: x['Symbol'])  # 銘柄コード順にソート

print('コード　銘柄　　　　　　　　　平均取得価格　　　　　保有数　　　　　現在値　　　 　　 損益')
for position in positions:
    profit_loss = position['ProfitLoss']
    if profit_loss == None:
        profit_loss = '---'

    print("{}\t{:11.7}\t{:>10}\t{:>10}\t{:>10}\t{:>10}".format(
        position['Symbol'],
        position['SymbolName'],
        position['Price'],
        position['LeavesQty'],
        position['CurrentPrice'],
        profit_loss))
```

### 注文中の銘柄表示

```python
orders = api.orders()

print('コード　銘柄　　　　　　　　　　　注文価格　　　　　注文数　 　　　 現在値　　　　　　期限')
for order in orders:
    state = order['State']
    if state >= 4:  # 1,2,3: 待機,処理中,処理済
        continue

    price = order['Price']
    if price == 0.0:
        price = '成行  '

    side = order['Side']
    if side == '2':
        side = '買'
    elif side == '1':
        side = '売'

    board = api.board(symbol=order['Symbol'], exchange=1)
    current_price = board["CurrentPrice"]
    if current_price == None:
        current_price = "---"

    print("{}\t{:11.7}\t{:>10}/{:<}\t{:>10}\t{:>10}\t{:>10}".format(
        order['Symbol'],
        order['SymbolName'],
        price,
        side,
        order['OrderQty'],
        current_price,
        order['ExpireDay'],
        ))

```

# 関連記事

- 次回：[kabuステーション®API - PUSH API用にPythonラッパーをアップデートした](https://qiita.com/shirasublue/items/f51986f39dd8a3bf8310)
- 前回：[kabuステーション®API - REST API用のPythonラッパーをつくってみた](https://qiita.com/shirasublue/items/16ff9d1fea54b0ef648e)
【チェックディジット】モジュラス11 ウエイト2~9を求める

## チェックディジットとは
データがおかしくないかを確かめるために使う。元データに追加される数字や記号

## モジュラスとは

>係数のこと。 チェックデジット計算の際、この用語が使われる
引用：[モジュラスとは何？ Weblio辞書](https://www.weblio.jp/content/%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%A9%E3%82%B9)

## モジュラス11 ウエイト2～9の計算方法

例：`00010001000700`

|数値|0|0|0|1|0|0|0|1|0|0|0|7|0|0|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|係数|7|6|5|4|3|2|9|8|7|6|5|4|3|2|
|積|0|0|0|4|0|0|0|8|0|0|0|28|0|0|

**積の合計**：4+8+28 = 40
**余り**：40 / 11 = 3 余り 7

上記より
**チェックディジット**：11 - 7 = 4

## 参考
- [[メモ] 各種チェックデジットの計算方法](https://qiita.com/yoshi389111/items/00ca7b3ed9ceac904cde)
[Google Cloud] Docker入門

gcloudのコマンドラインツールへたどり着くまで省略します。

##アクティブのアカウント名をリストアップする
```
gcloud auth list
```
出力：

```
Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
```

##プロジェクトIDをリストアップする

```
gcloud config list project
```
出力:

```
[core]
project = <project_ID>
```

## Hello the world

```
docker run hello-world
```

## Docker imagesでDockerhubから`pull`したコンテナイメージを確認する

```
docker images
```
出力

```
REPOSITORY     TAG      IMAGE ID       CREATED       SIZE
hello-world    latest   XXXXXXXXX      X days ago    X.XX kB
```

## 起動中のコンテナ一覧を表示させる
```
docker ps
```
`-a`を入れると、起動されていないコンテナも表示される。

# Build
##ディレクトリを作成する
```
mkdir test && cd test
```

## Dockerfileを作成する（省略）
## アプリのソースコードファイルを作成する（省略）

##　イメージをビルドする
```
docker build -t [image name]:0.1 .
```
`-t`はイメージ名とタグ名をマッピングさせます。`name:tag`
`tag`名を定義しなければ、デフォルトで`latest`として記録されます。

# Run
```
docker run -p 4000:80 --name my-app [image name]:0.1
```
`--name`でコンテナ名を命名することができます。

## コンテナを`stop`と`rm`する
```
docker stop my-app && docker rm my-app
```

## コンテナをバックグラウンドで動かせる
```
docker run -p 4000:80 --name my-app -d [image name]:0.1
```
`-d`を使います。

```
docker logs [container_id]
```
コンテナのログを確認したい場合、上記コマンドを実行します。`container_id`の開始数文字でそのコンテナを特定できれば、すべてのidを入力する必要がありません。

##　ソースコードを修正し、タグをバージョンアップ
```
docker build -t [image name]:0.2 .
```

```
docker run -p 8080:80 --name my-app-2 -d [image name]:0.2
```

```
curl http://localhost:8080
```
コンテナが正しく構築できたか確認します。

#　デバッグ

```
docker logs -f [container_id]
```
コンテナを動かしながら、ログを確認したい場合、`-f`を使います。

#　Publish
##　Google Container Registryへ自作したイメージをプッシュする
[hostname]= gcr.io
[project-id]= your project's ID
[image]= your image name
[tag]= any string tag of your choice. If unspecified, it defaults to "latest".

```
gcloud config list project
```
プロジェクトIDを調べます。

```
docker tag [image name]:0.2 gcr.io/[project-id]/[image name]:0.2
```
イメージをTagします。

```
docker push gcr.io/[project-id]/[image name]:0.2
```
gcrへイメージをプッシュします。

`Navigation menu` > `Container Registry`にてプッシュされたイメージを確認することができます。また、`http://gcr.io/[project-id]/[image name]`でも確認することができます。

```
docker stop $(docker ps -q)
docker rm $(docker ps -aq)
```
開発環境の中のコンテナを停止させ、削除することができます。

```
docker rmi [image name]:0.2 gcr.io/[project-id]/[image name] [image name]:0.1
docker rmi [image name]:[tag]
docker rmi $(docker images -aq)
docker images
```
子イメージを削除した後、親イメージを削除します。

```
docker pull gcr.io/[project-id]/[image name]:0.2
docker run -p 4000:80 -d gcr.io/[project-id]/[image name]:0.2
curl http://localhost:4000
```
再度開発環境でコンテナを起動したい場合、gcrにてストアしたイメージを`docker pull`し、`docker run`します。
ポインタの理解のためのアドレスの考え方

##前書き
本稿は初学者から、ポインタの理解があいまいで困っている人に向けた文章である。
玄人、ポインタの理解はもう大丈夫という人には退屈であろうし、突っ込みたくなる点が多々あると思われるのでUターンしてほしい。(筆者は臆病なのでそういうの怖いのだ。)
理解していただけたら次へどぞ

##アドレスの理解
例えば、「以下のような変数のアドレスを表してほしい」と言われたときにパッと書けるだろうか？

```c
/*定義*/
//char型の変数c
char c;
```

答えは以下のようになる。

```c
/*char型の変数cのアドレス*/
 &c
```
なんだそれだけのこと答えさせたかったのかと思うだろう。もちろんそれだけのことだ。
char型のcという変数のアドレスを表したいときには&cと書けばよいのだ。

では、任意にアドレスを設定できないのだろうか？


##アドレスを変数で表す意味
__アドレスはメモリ中での住所である。__
たとえるなら、&cの場所にcさんの持つ変数の内容が住んでいる。

現実では、住所は他人が__勝手に変えたりしたら危ない__。東京都の住所がすべて北海道の住所と置き換わってしまったら大変なことになる。
これがメモリの中でも起こっている。勝手に住所を変な場所に指定されてしまったら困るのだ。

そんなわけで、__変数のアドレスはあらかじめ&(変数名)のように形が決まっている__のである。これなら書いてる間におかしな住所になることもない。

##アドレスとポインタの関係性
ここからがポインタの重要性にかかわる話だと思う。

アドレスを示す方法が分かったが、アドレスをそのまま持ち運ぶのはいささかアンパサンド書くのがめんどくさい。
アドレスを格納するための変数を定義したほうがよさそうだ。
　ここでポインタが登場する。

```c
/*定義*/
//char型の変数c
//char型のポインタ変数c_p
char c;
char *c_p;

/*操作*/
//ポインタ変数c_pに変数cのアドレスを格納
c_p = &c;
```

先ほど定義したchar型の変数cに加えて、char型のポインタ変数c_pを定義した。また、c_pの値としてcのアドレスを格納させている。これで&cと書かなくてもc_pと書けばcのアドレスを示すことができる。

ここで覚えていてほしい。あくまで__ポインタ変数自体は変数のアドレスを格納するための変数__なのだ。

ひょっとすると、既習の人の中ではこのあたりで
> 「*c_pとc_pの違いってなんだ？」

と疑問に思った人もいたのではないだろうか。

__それこそがポインタの落とし穴なのだ。__

先ほど、メモリのアドレスの場所には変数の持つ値が住んでいると書いた。つまり、メモリがわかれば住んでいる人がわかるのだ。

__なら、アドレスだけで内容を扱うことができるようにしよう！__

これがポインタの本質であり、落とし穴の最大のポイントだ。
ポインタ変数自体はアドレスを格納するが、その値も触れる機能を付け足したという点が混乱をもたらした。

__アドレスの内容__を扱うために、__ポインタ変数__と__ポインタ変数のさす内容__の違いを明確に書かなくてはいけない。
以下に示すように、アドレスとその中身を__明確に(??)__分けたのだ。

```c
/*定義*/
//char型の変数c
//char型のポインタ変数c_p
char c;
char *c_p;

/*操作*/
//ポインタ変数c_pに変数cのアドレスを格納
c_p = &c;
//??????
*c_p = 'A';

printf("%c", c);
```

前半は先ほどと変わらない。

が、そのあと。*c_p = 'A'としている。
これは先ほど言った通り、__アドレスのさす先の変数の内容__を書き換える操作をしているのだ。
__これが一番ややこしい。__

つまり、__ポインタ変数の定義に用いたアスタリスク__が、ポインタ変数のさすアドレスの内容を使うときにも用いられている。
これでは混乱するのも無理はない。

ちなみに先ほどのコードの出力結果は、以下のようになるだろう。

```c
A
```
なぜなら、*c_pはc_pの指すアドレスの内容を表している。つまり、cのことだ。

```c
*c_p = 'A';
//と書くことは
c = 'A';
```
と書くこととほとんど意味が変わらない。

##ここまでのまとめ
1. 変数のアドレスは__&(変数名)__で表す。
2. ポインタ変数の定義は以下のように表す。

```
(型名) *(任意のポインタ変数の名前);
```
3.__ポインタ変数の指すアドレスの内容__を指すときは以下のように表す。
 
```
 *(任意のポインタ変数の名前);
```


##感想
あまり、初学者の意見をくみ取った記事の書き方ができているとは思えないが、今回はいったんここで止めようと思う。
疑問を持った時はできるだけコメントなどで聞いてほしい。
答えうる範囲で答えていきたい。意義や疑問、修正点もぜひいただければと思う。

~~今後配列とアドレス、ポインタの関係もかけたらと思う(と言って自分の首を絞める)~~
Nginx が生まれた理由と利用例 C10K問題、イベント駆動、プロキシ、リバースプロキシ

# はじめに
今回は以下の内容で、Nginxについて詳しく触れたいと思います。

- C10K問題
- プロキシとリバースプロキシ

[【YouTube動画】C10K問題、イベント駆動、プロキシ、リバースプロキシについて](https://youtu.be/0hRh3ze2AJk)
[![C10K問題、イベント駆動、プロキシ、リバースプロキシについて](https://img.youtube.com/vi/0hRh3ze2AJk/0.jpg)](https://www.youtube.com/watch?v=0hRh3ze2AJk)


# C10K問題とイベント駆動
C10K問題のCはClient、10Kは10,000の略です。
1台のサーバーに1万台のクライアントがアクセスしたとき、処理が重くなるという問題です。

これはApatchでは解決が難しく、Nginxで解決できた問題です。

## ApatchとNginx
Apatchでは、マルチプロセスを採用しており、1コネクションに対し1プロセスを割り当てます。
そのためプロセスが増えていくと、使用できるメモリが減っていくので、処理が重くなります。

Nginxでは、イベント駆動を採用しており、クライアントの接続を1プロセスとして扱います。
1プロセスで多数のクライアント接続を扱うために、ノンブロッキングIOや非同期IOを使用しています。

この辺りは動画で詳しく説明しているので、ぜひ確認してみてください！


# プロキシとリバースプロキシ
Nginxはプロキシサーバーやリバースプロキシとしても利用できます。

プロキシサーバーは、クライアント複数、サーバー1つという構成で、外部からのアクセス制限や検閲などに使用できます。

リバースプロキシはクライアント1つ、サーバー複数という構成で、アクセス分散やキャッシュなどに使用できます。


# まとめ
今回、NginxとC10K問題の関係、プロキシとリバースプロキシの違いについて説明しました。

何か間違いや指摘がありましたら、コメントよろしくお願いします。

[twitter](https://twitter.com/yassun_youtuber)や[youtube](https://www.youtube.com/channel/UCajrdoGzHzDogrNrLYYmGsg/featured?view_as=public)でのコメントもお待ちしています！
[multipart/form-data][MIME]マルチパート？なにそれ？

## はじめに

先日Expressでファイルダウンロードを処理する際に「マルチパートはー」と会話に出てきてついていけなかったので調査しました。その備忘録です。

## ざっくりとマルチパートって？

`multipart/form-data`のことだそうです。
いわゆる`MIME TYPE`の一つで、HTTPヘッダーの`Content-Type`に入れて使うことが多そうですね。
主な活用シートとしてはexcelファイルなどをアップロードするときに使うそうです。

## MIME TYPEって？

[MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types)から引用すると

>メディアタイプ (別名 Multipurpose Internet Mail Extensions または MIME タイプ) は、文書、ファイル、またはバイト列の性質や形式を示す標準です。 IETF の RFC 6838 で定義され、標準化されています。

のように定義されています。ようするにデータの型のような認識ですかね。ちなみに`マイムタイプ`と呼ぶそうです。(ミメだと思ってた。。。)

MEME TYPEの形式は

`タイプ/サブタイプ`の形式になっており、 `タイプ`や`サブタイプ`のみで構成されることはありません。
ex) application/json

## multipart/form-data

[MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types)から引用すると

>multipart/form-data タイプは、入力済みの HTML フォーム の内容をブラウザーからサーバーに送信するときに使用することができます。

>これはマルチパート文書形式として複数の部分から成り、境界 (二重ダッシュ -- で始まる文字列) によって区切られます。それぞれの部分は固有のエンティティであり、固有の HTTP ヘッダーとして Content-Disposition やファイルアップロードのフィールドには Content-Type を持ちます。

このMIME TYPEはHTMLフォームからデータを送る際に使い。複数データをいっぺんに送ることが可能ということですね。
また、データそれぞれにMIMEを指定することができるそうです。

リクエストは以下のようになるそうです。

```
Content-Type: multipart/form-data; boundary=aBoundaryString
(マルチパート文書全体に関連付けられる、他のヘッダー)

--aBoundaryString
Content-Disposition: form-data; name="myFile"; filename="img.jpg"
Content-Type: image/jpeg

(データ)
--aBoundaryString
Content-Disposition: form-data; name="myField"

(データ)
--aBoundaryString
(サブパート)
--aBoundaryString--
```

`--aaBoundaryString`はデータの境界を表しており、リクエストごとに変わります。
(サブパート)と書いてある部分はContent-typeなどとデータのまとまりを表しています。

### おわりに

別の記事でExpressを使って具体的に説明できるようなもの作ってみたいと思います。
LINE WORKS URL Scheme の URL 生成ツールを作ってみた

# LINE WORKS URL Scheme の URL 生成ツール
[CodePen](https://codepen.io/shotamaco/pen/xxOKWNj)を使って、[LINE WORKS URL Scheme](https://developers.worksmobile.com/jp/document/10017001?lang=ja) を生成するツールを作ってみました。

<p class="codepen" data-height="653" data-theme-id="light" data-default-tab="result" data-user="shotamaco" data-slug-hash="xxOKWNj" style="height: 653px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="LINE WORKS URL Scheme">
  <span>See the Pen <a href="https://codepen.io/shotamaco/pen/xxOKWNj">
  LINE WORKS URL Scheme</a> by shotamaco (<a href="https://codepen.io/shotamaco">@shotamaco</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 使い方

## モバイル
モバイルのブラウザー（Chromeでテスト済み）で[CodePen](https://codepen.io/shotamaco/pen/xxOKWNj) を開いて頂き、パラメータを設定後、Go ボタンをクリックして下さい。（もちろんこのページでも動作します）
LINE WORKS が起動して、パラメータの値が反映されます。

## PC
モバイルだと入力が面倒な場合があるかと思います。その場合は、PCのブラウザーでパラメータを設定して頂き、ツールが生成した URL をコピーしてトークで送信し、送信した URL をクリックするとパラメータの値が反映された LINE WORKS の画面が表示されます。

#Link
  * [LINE WORKS Developers](https://developers.worksmobile.com/)
  * [LINE WORKS ガイド（全般）](https://guide.worksmobile.com/)
  * [LINE WORKS ガイド（管理者画面）](https://guide.worksmobile.com/admin/)
  * [LINE WORKS コミュニティ](https://community.worksmobile.com/)
  * [LINE WORKS ヘルプセンター](https://help.worksmobile.com/)
  * [LINE WORKS Blog](https://line.worksmobile.com/jp/blog/)
  * [さわってわかったLINE WORKS](https://ascii.jp/elem/000/001/955/1955720/)
zsh: command not found: 〇〇を爆速で解決しちゃいませんか？


どうもこんにちは、

今回は、amplifyの環境構築の際に詰まったので
その解決方法をシェアさせてもらいます！

<dl>
  <dt>環境</dt>
<br/>
  <dd>Mac</dd>
  <dd> zsh</dd>
</dl>

ionicとAngularの環境構築の際にも使えたので、
どこでも使える技だと思います。


まず普通に

```
npm install -g @aws-amplify/cli
```

```
amplify -v                     
zsh: command not found: amplify
```
まぁ。ここでできたらつまらないですよね。（強がり）

###次にターミナル、Macの再起動！


これでも駄目だったので

###Node　npm入れ直す

そして、、、！

```
sudo npm install -g @aws-amplify/cli
```
これなら行けたっしょ。

```
amplify -v                     
zsh: command not found: amplify
```

うわっ、デジャブやん。。（軽く震え,,）


他にも色々試したのですが、日が暮れるのですっ飛ばして結論。

```
alias amplify="/Users/user/.npm-global/lib/node_modules/@aws-amplify/cli/bin/amplify"
```

インストールした時に出てきたpathを指定してaliasするだけ！
zsh: command not found: 〇〇エラーを爆速で解決。


どうもこんにちは、

今回は、amplifyの環境構築の際に詰まったので
その解決方法をシェアさせてもらいます！

<dl>
  <dt>環境</dt>
<br/>
  <dd>Mac</dd>
  <dd> zsh</dd>
</dl>

ionicとAngularの環境構築の際にも使えたので、
どこでも使える技だと思います。


まず普通に

```
npm install -g @aws-amplify/cli
```

```
amplify -v                     
zsh: command not found: amplify
```
まぁ。ここでできたらつまらないですよね。（強がり）

###次にターミナル、Macの再起動！


これでも駄目だったので

###Node　npm入れ直す

そして、、、！

```
sudo npm install -g @aws-amplify/cli
```
これなら行けたっしょ。

```
amplify -v                     
zsh: command not found: amplify
```

うわっ、デジャブやん。。（軽く震え）


他にも色々試したのですが、日が暮れるのですっ飛ばして結論。

```
alias amplify="/Users/user/.npm-global/lib/node_modules/@aws-amplify/cli/bin/amplify"
```

インストールした時に出てきたpathを指定してaliasするだけ！
Python パッケージをローカルから PyPI にアップロードするときの設定

現在は CI/CD の一環で GitHub Actions にデプロイメントを設定するのが
ベストプラクティスと思われます。

- [Publishing package distribution releases using GitHub Actions CI/CD workflows — Python Packaging User Guide](https://packaging.python.org/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/)
- [pypi-publish · Actions · GitHub Marketplace](https://github.com/marketplace/actions/pypi-publish)

こちらの方法はテストやトラブルの回避策としてメモを残しています。

## 手順

1.
.pypirc (PyPi のアカウント設定ファイル) を ~/ に配置します。
内容は以下の通りです:

```ini
[pypirc]
servers =
    pypi
    testpypi
[pypi]
repository: https://upload.pypi.org/legacy/
username: __token__
password: (API token)
[testpypi]
repository: https://test.pypi.org/legacy/
username: __token__
password: (API token)
```

※ (API token) を PyPI と Test PyPI それぞれで発行した API token に置き換えましょう。


2.
Twine がインストールされた仮想環境の中で以下のコマンドを実行します。

```console
twine upload --repository pypi dist/*
```

参考: [Uploading the distribution archives | Packaging Python Projects — Python Packaging User Guide](https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives)

## Pipenv のショートカットに登録する場合

Pipfile に以下のように登録しておくと便利です。

```ini
[scripts]
clear = "rm -rf yamldataclassconfig.egg-info/* build/* dist/*"
build = "python setup.py sdist bdist_wheel"
deploy = "twine upload --repository pypi dist/*"
```

そして、以下のようにコマンドを実行します。

```
pipenv run clear
pipenv run build
pipenv run deploy
```
C言語　freeBSD内のmemmove関数の実装3つ

freeBSD内のmemmoveの実装を見つつ、memmoveを自作しています。
memmove関数が複数定義されていました。

freeBSD内はすべて同じコーディング規約が適応されていると勝手に思い込んでいたのですが、書き方にばらつきがあり、興味深かったので、メモとして残して起きます。

[freebsd/freebsd: FreeBSD src tree (read-only mirror)](https://github.com/freebsd/freebsd)


## sys/contrib/xz-embedded/linux/lib/decompress_unxz.c

```c
void *memmove(void *dest, const void *src, size_t size)
{
	uint8_t *d = dest;
	const uint8_t *s = src;
	size_t i;

	if (d < s) {
		for (i = 0; i < size; ++i)
			d[i] = s[i];
	} else if (d > s) {
		i = size;
		while (i-- > 0)
			d[i] = s[i];
	}

	return dest;
}
```

## crypto/heimdal/lib/roken/memmove.c

```c
ROKEN_LIB_FUNCTION void* ROKEN_LIB_CALL
memmove(void *s1, const void *s2, size_t n)
{
  char *s=(char*)s2, *d=(char*)s1;

  if(d > s){
    s+=n-1;
    d+=n-1;
    while(n){
      *d--=*s--;
      n--;
    }
  }else if(d < s)
    while(n){
      *d++=*s++;
      n--;
    }
  return s1;
}
```


## contrib/unbound/compat/memmove.c

```c
void *memmove(void *dest, const void *src, size_t n)
{
	uint8_t* from = (uint8_t*) src;
	uint8_t* to = (uint8_t*) dest;

	if (from == to || n == 0)
		return dest;
	if (to > from && to-from < (int)n) {
		/* to overlaps with from */
		/*  <from......>         */
		/*         <to........>  */
		/* copy in reverse, to avoid overwriting from */
		int i;
		for(i=n-1; i>=0; i--)
			to[i] = from[i];
		return dest;
	}
	if (from > to && from-to < (int)n) {
		/* to overlaps with from */
		/*        <from......>   */
		/*  <to........>         */
		/* copy forwards, to avoid overwriting from */
		size_t i;
		for(i=0; i<n; i++)
			to[i] = from[i];
		return dest;
	}
	memcpy(dest, src, n);
	return dest;
}
```
Docker環境のPythonで日本語を使用できるように

# 環境

OS：Windows10 Home 1909
Docker：Docker Toolbox
Docker バージョン：19.03.12

# 注意点

恥ずかしながらDockerをJupyter環境整備で初めて使用して、Dockerについてあまり知りませんでした。自戒の念も込めて記載しておきます。※ docker-compose.ymlを使用

Docker imageはDockerfileを基に構築されます。Docker imageを一度`build`した際はキャッシュが作成されます。キャッシュとは簡単に言えば、2回目以降の読込を高速化するものです。このキャッシュがあると、`build`の際に優先的に用いられてしまいます。そのため、Dockerfileを更新した際は`docker-compose build --no-cache`でキャッシュを使用しない`build`をしましょう。

キャッシュを使用しない`build`ですので、ものによってはかなり時間が掛かることもありますので、ご注意ください。

# Dockerfile

```Dockerfile
FROM jupyter/datascience-notebook
RUN pip install --upgrade pip
RUN pip install jupyterlab
RUN jupyter serverextension enable --py jupyterlab

RUN curl -L  "https://moji.or.jp/wp-content/ipafont/IPAexfont/IPAexfont00401.zip" > font.zip
RUN unzip font.zip
RUN cp IPAexfont00401/ipaexg.ttf /opt/conda/lib/python3.8/site-packages/matplotlib/mpl-data/fonts/ttf/ipaexg.ttf
RUN echo "font.family : IPAexGothic" >>  /opt/conda/lib/python3.8/site-packages/matplotlib/mpl-data/matplotlibrc
RUN rm -r ./.cache
```

# 使用方法

Windows環境では、Docker Quickstart Terminalで実行してください。

[Dockerfile](#dockerfile)に記載してあるDockerfileとDockerfileに対応したdocker-compose.ymlがあるディレクトリに`cd`で移動し、下記コマンドを実行します（[注意点](#注意点)もご確認ください）。

```Docker
docker-compose build
docker-compose up -d
```

docker-compose.ymlでtoken値を設定していない(空値は「設定している」とします)場合は、TerminalにURLが出力されていると思います(e.g. http://127.0.0.1:8888/?token=... )。そのtoken値も含めて任意のブラウザでアクセスすればJupyterが使えるようになっているハズです。

※ token値を空値で設定してある場合は、http://192.168.99.100:8888 (windows) でアクセスできます。macは http://localhost:8888

# 確認方法

Jupyterが使用できたら、下記をPythonで実行します。

```Python
import matplotlib
import matplotlib.pyplot as plt
plt.figure()
plt.title('あ - A')
plt.ylabel('い - i')
plt.xlabel('う - Uu')
```

その結果、下の画像のように出力されていれば日本語が使えるようになっています！
![日本語グラフ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674330/c6f721e6-6f6e-2569-c6b9-a59bb235bfd5.png)
お疲れさまでした！

# おわりに

Anaconda環境から卒業して、ついにDocker環境に移行するぞ！と意気込んだのはよかったものの、Dockerは初めてで、データ分析系統の知識しかなかったのでIT知識は詳しくなく、何度も躓きました。実はこの日本語を使えるようにするのも1度諦めました。

また、最近の記事はmac環境ばかりでwindows環境の記事を探すのも一苦労です。ただそのwindows環境の記事も時間経過で環境が変わり、そのままのコードを打ち込んでも動いてくれないこともままあります。それらのコードを改良するのも楽しいですが、初学者のときは難しいですね...。

# 参考記事

1. [JupyterのDockerイメージで日本語が使えるように、Dockerfileを書いた](https://qiita.com/nassy20/items/f67c3ce196558b14dfca)
2. [docker-compose 'up' とか 'build' とか 'start' とかの違いを理解できていなかったのでまとめてみた](https://qiita.com/tegnike/items/bcdcee0320e11a928d46)
10/1時点 記事まとめ

10/1時点での月間トレンド（+α）から気になった記事をピックアップしました。

### 生産性など
1年以上かけて生産性倍増＋成長し続けるチームになった施策を全部公開
https://qiita.com/kojimadev/items/4b28f801863cf4e8f0da

### デザイン
画面をデザインするということ
https://qiita.com/megumu-u/items/73b728ad1d381717d731

モバイルアプリにおけるUIデザイン
https://qiita.com/mark_1975M/items/eabdd95ac1de64e4fe1b

### アイデア
ポートフォリオや個人開発で使えそうなアイデア
https://qiita.com/MasatoraAtarashi/items/eec4642fe1e6ce79304d

### VSCode
過去の自分に教えなければならないVSCodeのショートカット
https://qiita.com/rana_kualu/items/ea78200036fc80dce0a9

1分でも早く仕事を終わらせるためにVSCodeにできること
https://qiita.com/EaE/items/4ca1b35396eba682a86f

### Flutter
Flutter 1.22 リリース情報
https://qiita.com/sankentou/items/def595b4786c822df72b

### iOS
iOS14対応をまとめてみた
https://qiita.com/OkamotoHaru/items/5b2d2dd8d71f6edef777

### ストック数ランキング
Qiita週間ストック数ランキング【自動更新】
https://qiita.com/kai_kou/items/180a91fd88dbbbd746f6

### 競馬
機械学習で競馬の回収率100%超えを達成した話
https://qiita.com/Mshimia/items/6c54d82b3792925b8199
migrationfile書き方

index: テーブルの中の特定のカラムを複製し検索を早めるためにあるんだとか。

references: t.references :userでuser_idカラムを作成し、user_idにインデックスを貼る。(外部キー制約は付けられない)

foreign_key: true: 外部キー制約を貼る。存在しないUserのidがuser_idに登録されるのを防ぐ。親テーブルのレコードを消しちゃうミス防止。

add_foreign_key(:articles, :users)はインデックスが無い場合、インデックスを貼る、ある場合は使い回す。なので、外部キー制約を付ける→インデックスを貼るという順番はだめ。

rails g model article body:text user:references とすると

```migrationfile.rb
class CreateArticles < ActiveRecord::Migration[5.2]
  def change
    create_table :articles do |t|
      t.text :body
      t.references :user, foreign_key: true

      t.timestamps
    end
  end
end
```
Docker Toolbox の Docker を localhost としてアクセスできるようにする

## 目的
Docker Toolbox の Docker に `http://localhost:8888` でアクセスできるようにしたい

## 手法
VirtualBox の ポートフォワーディングを使う。
例えば、ローカルホストの8888番ポートへの接続を VM の80番ポートにフォワーディング。

## 手順
* Oracle VM VirtualBox マネージャーを開く
* Docker Toolbox の仮想マシンを右クリックしてコンテキストメニューを表示
* 表示されたコンテキストメニューで`設定`を表示
* 表示された`設定`画面の左メニューで`ネットワーク`を選択
* 表示された`ネットワーク`画面の`アダプター1`タブの`高度`設定内の`ポートフォワーディング`を表示
* 表示された`ポートフォワーディング`画面で新しいルールを追加

追加例）

|名前 | プロトコル |ホストIP |ホストポート |ゲストIP|ゲストポート|
|---|---|---|---|---|---|
|Rule 1|TCP  |（空白）  |8888|（空白）|80|
vueでbuildしたものをコピーしてくるのが面倒なときに

vue.jsは、`npm run serve`すればとりあえず作成したものを表示してくれます。
しかし、開発環境によっては、ビルドして指定のディレクトリにおかないと外部との接続ができないことがあるので、ビルドして確認したいときってありませんか？？

でも、ちょっと変えただけなのに、`npm run build`してできたdistディレクトリの中身を、わざわざ別なところに毎回移動しなきゃいけないのって手間ですよね。
そんなときは、シンボリックリンクを作ってやるとうまくいきます。
公開しているディレクトリに直接ファイルを置くのではなく、そのディレクトリからリンクを貼ってやって、他のディレクトリにおいてあるファイルを読み込むという形です。

例えば公開しているディレクトリが`/var/www/html/nginx/publish/website`、
開発に使用しているディレクトリが`/home/oogaki/dev/website`だとすると、
これまではビルドしてできた`/home/oogaki/dev/website/dist`内のファイルを、`/var/www/html/nginx/publish/website`にコピーしていました。

しかし`/var/www/html/nginx/publish/website`ディレクトリを削除して、以下のようにすると手間がなくなります。

```
cd /var/www/html/nginx/publish/
ln -s /home/oogaki/dev/website/dist website
```

これで、`/var/www/html/nginx/publish/website`で読み込まれる内容が`/home/oogaki/dev/website/dist`の中身になってくれます。

lnコマンドを使用していますが、指定の仕方は、

```
ln -s リンク先のパス リンク名
```

という形です。
そもそもnginxなどサーバー設定で読み込むディレクトリを変えてしまうというのも一つの手ですが、サーバー設定はいじりたくないという時にはシンボリックリンクを使うと便利という話でした。
fontawesome5 free版 のアイコンを css :before, :after で挿入

`<i class="fas fa-address-card"></i>` を `:before` で表示
https://fontawesome.com/icons/address-card?style=solid

```css
div:before{
    content    : "\f2bb";
    font-family: 'Font Awesome 5 Free';
    font-weight: 900;
}
```
`font-weight` を付けないとアイコンが表示されないところがハマりどころ
THETA に固定IPアドレスを付与する（が残念だった件）

# この記事について
特殊な事例だと思いますが、THETAをクライアントモード(以下CLモード)で使用する際に固定のIPアドレスを付与させる方法がないかと思い、調べてみました。

なお、今回は対象は THETA V としています。
試していませんが Z1 でも同じだと思います。
S/SC/SC2 はそもそもCLモードという概念がないので対象外です。

# THETAに固定のIPアドレスを付与する
やり方は2つあるかと思います。　

1. Wi-Fiルーターに設定する
2. THETAに設定する

1 については、ルーターによくある機能で、MACアドレスごとに固定IPアドレスを紐付ける機能があるかと思います。
今回はこの方法はあえて使わず、2 の方法で試してみます。

## APIを使ってTHETAに固定IPアドレスを付与する
THETAのAPIリファレンスを確認すると、以下のようなAPIがあります。
https://api.ricoh/docs/theta-web-api-v2.1/commands/camera._set_access_point/

Wi-Fiのアクセスポイントを設定するAPIで、固定IPアドレスの設定もできるようです。
ということで、試してみます。

### 設定してみる
THETAをAPモードに設定し、PCからTHETAのWi-Fiに接続します。
その後、以下のコマンド(API)を叩いてみます。
(なお、以下は例です。実際にはパラメータには適切な値を設定します。)

```bash
$ curl -v -XPOST -H 'content-type:application/json' \
http://192.168.1.1/osc/commands/execute -d '
{
  "name":"camera._setAccessPoint", 
  "parameters": {
    "ssid": "hogehoge",
    "ssidStealth": false,
    "security": "WPA/WPA2 PSK",
    "password": "fugafuga",
    "connectionPriority": 3,
    "ipAddressAllocation": "static",
    "ipAddress": "192.168.1.250",
    "subnetMask": "255.255.255.0",
    "defaultGateway": "192.168.1.1"
  }
}
'
```
実行後、`{"name":"camera._setAccessPoint","state":"done"}` と表示されたら設定OKです。

### 確認してみる
THETAをCLモードに設定してみます。
THETAのWi-FiのLEDが緑の点灯になったらOKです。

THETAをPCとUSB接続して、`adb shell` で内部にアクセスして確認してみます。

```bash
# ここはPCのshellです
$ adb shell
```

`ip`コマンドでIPアドレスを見てみます。

```sh
# これ以下はTHETA(Android)のShellです
$ ip a s wlan0
# 設定した固定IPアドレスが表示される
```
無事、設定した固定IPアドレスが付与されたようです。
ちょっと動作確認してみます。

```sh
$ ping 8.8.8.8
# 問題なさそう。

$ ping www.google.com
# 名前解決できず...

$ getprop | grep dns 
［net.dns1]:[]
# dns設定されていない...
```

ということで、IPアドレスは固定できたのですが、DNSの設定ができていないようです。
THETAのAPIではDNSを設定するパラメータは存在せず、どうやら詰みのようです。

# まとめ
- THETAのAPIから固定IPアドレスは設定できるが、DNS設定ができず、激しくイマイチ。
- THETAのIPアドレスを固定したい場合は、素直にルーターの機能を使おう。
Xcode12でのタブ挙動を以前の設定に切り替える

# 概要
Xcode12からタブの挙動が変わりました。
[Window Tab] と更にその下に一段タブが表示される、タブの中に更にタブがあるという動作になり、
それ以前のXcodeのタブ操作に慣れているエンジニアには使いづらい状態となりました。
本記事ではタブの挙動設定を切り替える方法を記載しています。

# タブ挙動設定の切り替え方法
Xcodeメニュー内の
[Preferences] -> [Navigation] -> [Navigation Style]を
 [Open in Tabs] から [Open in Place] に変更する。
また、それ以外の細かな設定はそれ以下の設定を任意で変更する(上記設定を変更すると自動で変わる)
![Qiita用.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165931/63b14b88-cbe4-1fee-bd25-3c335b5a6938.png)

# さいごに
基本的にはApple様の仕様変更に追随していくのが良いかとは思いますが、
個人的にCmd+Tabで開いたタブをCmd+Wで一発で閉じれないあたりが許容出来ずに変更しました。
誰かの参考になれば幸いです。
（備忘録）MySQLとPostgreSQLのコマンド比較

## やりたいこと
最近ポスグレ使い始めたので学習のため投稿

## 環境
(PostgreSQL) 9.6.14

## コマンド一覧

|| MySQL| PostgreSQL|
|-----------:|:------------:|:------------:|
|起動 (terminal)|mysql|psql|
|終了|exit|\q|
|データベース一覧|SHOW DATABASES;|\l|
|テーブルとビューの一覧|SHOW TABLES;|\d|
|テーブルの一覧|?|\dt|
|ビューの一覧|?|\dv|
|バージョン確認 (terminal)|mysql --version|psql --version|
Couldn’t find the element to insert the template. Make sure your `data-association-insertion-*` on `link_to_add_association` is correct.

railsでcocoonを使って複数のフィールド追加を試みていたところタイトルのエラーが発生


```
.nested-items
```

を追加しておらず、どこにフォームを入れて良いかjs側が理解していないことが問題でした

### 参考記事
なし
Nuxt.js(SPA)+Firebaseでのデバッグ操作をバッチファイルで簡略化[MacOS]

# 問題定義：毎回のコマンドライン入力の煩雑さ
＊解決策を早く知りたい方は次のセクションに移動してください😍
Nuxt.jsのSPAモードを使う時は次のようにデバッグできます

```
npm run build
npm run generate
npm run start
```

ただ、これとFirebaseを組み合わせてデバッグ環境をlocalhostに構築するには
npm run startの代わりに次が必要です

```
firebase serve --only hosting
```
(--only hostingはFirebaseでHosting以外のサービスをCLIで管理しているときに、
Hostingだけ実行するようにするためのものです)

すなわち、まとめるとファイルの書き換えごとに次を実行しなければなりません

```
npm run build
npm run generate
firebase serve --only hosting
```

仮にセミコロンで一行にまとめて、次のように毎回コピペして実行したとしても手間です


```
npm run build;npm run generate;firebase serve --only hosting
```
同じことを繰り返していてはしまいに気が狂ってしまいます。
こうした反復処理は時間がかかるものの、集中力を低下させ、開発のモチベーションを下げる要因となります。

# 解決策：.commandファイルにビルドのコマンドを入力し、これをデバッグ時に開く

## .commandファイルの作成
vscodeで以下のようなファイルをNuxtのディレクトリに作成しましょう（vscodeでない人は各自のやり方で作成してください）

```
code build.command
```

```:build.command
cd `dirname $0`;
npm run build;
npm run generate;
firebase serve --only hosting;
```

一行目の　cd `dirname $0`;　は
build.commandが保存されているディレクトリ、すなわち、nuxtのディレクトリをcwdに設定するための記述です

## .commandファイルの権限設定
このままでは十分な権限が与えられていませんので権限設定をしましょう

###権限確認
権限の確認をしてみましょう

```
ls -l build.command
```

次のように表示されると、権限が十分に与えられていないことを意味します

>-rw-r--r-- ...

###権限設定
以下を入力して権限を設定しましょう

```
chmod u+x build.command
```


再度以下で権限の確認をしてみましょう

```
ls -l build.command
```
>-rwxr--r--@ ...

このような結果となれば成功です

##デバッグ方法

デバッグをしたいときは毎回CLIに以下を打ち込むだけです

```
open build.command
```
ビルドから生成、そしてlocalhostでのデバッグが一貫して行えます
1000本ノックのようにコマンドを叩きまくる下積み時代とはおさらばです！

# 参照リソース

@TatsuyaOGth 様、参照させていただきました。ありがとうございます。
「Macでバッチ（command）ファイルを作る方法」
https://qiita.com/TatsuyaOGth/items/f15bfa9aeb68d8ecfc67

# プログラマーには"Laziness"が必要

Perlの作者のLarry Wallによると以下の３要素がプログラマにとって重要だといいます：

```
1.Laziness
2.Impatience
3.Hubris
```

開発やデバッグの環境でさえ、なるべく楽に作業ができる方法をこれからも模索していきたいものです
自動化や業務効率化の記事を書いていきますので、よかったらご覧ください！
それでは、ここまでお読みいただき、ありがとうございました。

大学生エンジニア　山岡幹太
頑張って理解する"Fragments: Rebuilding the Internals"

# はじめに
この記事は「[Fragments: Rebuilding the Internals](https://medium.com/androiddevelopers/fragments-rebuilding-the-internals-61913f8bf48e)」の内容を、自分が理解できるように翻訳したりメモしたりした備忘録です。

# 概要
`FragmentManager`の内部実装が変わった。
`FragmentStateManager`について説明されている。

# 本文

### Androidフレームワークの方のFragmentを使ってはいけない
Androidフレームワークの方の`Fragment`は、Android 10 で非推奨になった。
絶対にAndroidXの方を使う。

### Fragment 1.3.0-alpha08 で FragmentManagerの重要なところが（内部的に）作り直された
`FragmentManager`が直接扱っていたロジックを、内部クラスで置き換えた。
その内部クラスが`FragmentStateManager`である。
（個人的には内部クラスに切り出されたというイメージ🤔）

`FragmentStateManager`ができて何が嬉しいのか
* ロジックが簡単になった
* テストしやすくなった
* メンテナンスしやすくなった

Note: `Fragment 1.3.0-alpha08` にバージョンアップしたら、VRT（ビジュアルリグレッションテスト）に気をつけよう。

### FragmentStateManager が担っていること
* Fragmentのライフサイクルに応じた遷移
* アニメーションとトランジションの実行
* 延期されたトランザクションの処理

💡💡💡
1つの`FragmentManager`が複数のバックスタックを持てるようになった。
（Fragmentのライフサイクルが簡単になったともある）

### FragmentManager’s moveToState()
`Activity`が`CREATED`,`STARTED`,`RESUMED`に移動すると、`FragmentManager`はそれらの変更を`Fragment`に送る。
これが`moveToState()`の役割である。
`moveToState()`は単純ではなく、ネストしている全てのFragmentの状態を判断するためのロジックはたくさんある。
この`moveToState()`のロジックを1つにまとめて簡単にするため、`FragmentStateManager`が誕生した。

それぞれの`Fragment`は`FragmentStateManager`に紐づいていて、`FragmentManager`は直接`Fragment`とやりとりするのではなく、`FragmentStateManager`をやりとりするようになる。

この役割分担によって、それぞれの`Fragment`の状態を判断するためのロジックを1つに集約することができるメソッドを作ることができた。
それが`computeExpectedState()`である。

98% の場合、ホスト/親フラグメントと同じ状態になる。
裏を返せば、2% でホスト/親フラグメントと違う状態になる。

🤔🤔🤔
しかし、正しい状態を判断する方法がない場合に遭遇したらしい。

### Postponed fragments

いろいろ翻訳したりメモしたりしたが、保存し忘れて消えました🙃
遅延されたFragmentを扱う時にいろいろバグあり、それを修正したそうです。

### Working at the container level

コンテナレベルで、`Fragment`のイン/アウトのアニメーションをする時に問題が起こる。

`Fragment`はいくかのアニメーションシステムをサポートしている。

* The old and busted framework Animation API
* The framework Animator API
* The framework Transition API (only API 21+, also pretty busted)
* The AndroidX Transition API

これらをまとめて操作できるクラスを作って、`SpecialEffectsController`と命名した。
`SpecialEffectsController`はコンテナに1つだけある。
つまり、一番上に追加されたフラグメントが延期されると、コンテナ全体が延期されます。

`FragmentManager`内に散らばっていたアニメーションのロジックを`DefaultSpecialEffectsController`にまとめことができた。

### So what does a ‘new state manager’ mean

`FragmentManager`の内部を分割することで、それぞれのレイヤーのロジックを簡単にすることができた。

* `FragmentManager`は、すべてのフラグメントに適用される状態のみを持っている。
* `FragmentStateManager`は、フラグメントレベルの状態を管理する。
* `SpecialEffectsController`はコンテナレベルで状態を管理する。

### Should I expect behavior changes?

これまでのFragmentの振る舞いが変わってしまいますか？
→変わらない
（大事そうなところだけ抜粋）
アニメーションやトランジションが完了するまで、その`Fragment`の状態は`STARTED`のままになる。

### What if I do see behavior changes?

これまでのFragmentの振る舞いが変わったらどうすればいい？

`Fragment 1.3.0-alpha08`から、デフォルトで`FragmentStateManager`が動作する。
`FragmentStateManager`のせいで振る舞いが変わっているか調査しましょう。
以下のコードで`FragmentStateManager`を無効にできる。

```kotlin
FragmentManager.enableNewStateManager(false)
```
git clone の仕方

```
git clone https://github.com/XXXXX
```

https～のところは、レポジトリのURL
例は、https:// プロトコルだけど、他にも git:// か user@server:path/to/repo.git　のようなSSHトランスファープロトコルを使うこともある。

```
git clone https://github.com/XXXXX Name
```

Nameのところは任意で、そのレポジトリのフォルダー名をつけることができる。Nameの場合は、Nameというレポジトリのフォルダーができる。
【Linux】ユーザーがログインした日を知りたい

lastコマンドで、最近ログインしたユーザーが確認できる。
grep によって特定のユーザーがどの日時にログインしたか確認することができる。

```
# last | grep ユーザー名
```

「最後にログインした日」だけを知りたい場合は lastlog コマンドを使う。
こちらも grep で特定ユーザーを抽出できる。

```
# lastlog | grep ユーザー名
```
neo4jでsandbox その9

#概要

neo4jでsandboxやってみた。
movielens、やってみた。

#データ投入

```
CREATE CONSTRAINT ON (m:Movie) ASSERT m.id IS UNIQUE;
CREATE CONSTRAINT ON (u:User) ASSERT u.id IS UNIQUE;
CREATE CONSTRAINT ON (g:Genre) ASSERT g.name IS UNIQUE;

LOAD CSV WITH HEADERS FROM "https://gist.github.com/ohisama/7d84faeae0568eaacfe68ba071006d36/raw/2dff86684bc09fb8be10227f2b46b0bfbf10f5ce/movies.csv" AS line
WITH line, SPLIT(line.genres, "|") AS Genres
CREATE (m:Movie {id:TOINTEGER(line.movieId), title:line.title})
WITH Genres
UNWIND RANGE(0, SIZE(Genres) - 1) as i
MERGE (g:Genre {name:UPPER(Genres[i])})
CREATE (m)-[r:GENRE {position:i + 1}]->(g);

LOAD CSV WITH HEADERS FROM "https://github.com/tkcsdvd/neo4j-movielens/raw/master/ingestion/data/tags.csv" AS line
WITH line
MATCH (m:Movie {id:TOINTEGER(line.movieId)})
MERGE (u:User {id:TOINTEGER(line.userId)})
CREATE (u)-[r:TAG {tag:line.tag}]->(m);

LOAD CSV WITH HEADERS FROM "https://github.com/tkcsdvd/neo4j-movielens/raw/master/ingestion/data/ratings.csv" AS line
WITH line
MATCH (m:Movie {id:TOINTEGER(line.movieId)})
MATCH (u:User {id:TOINTEGER(line.userId)})
CREATE (u)-[r:RATING {rating:TOFLOAT(line.rating)}]->(m);


```

#データ確認

```
MATCH (n) 
RETURN count(*);

MATCH ()-[r]-() 
RETURN count(r)


```

以上。
Deniteでctags検索のSourceを作ってみる


Deniteに移行した時点から、ctags検索に不満があり
https://qiita.com/hisawa/items/3498951e84eac77ac890

fzfなどを使ってみましたが、nvimに移行してからctags検索だけfloatingではないのが気になってました。
https://qiita.com/hisawa/items/fc5300a526cb926aef08

探してもDeniteでctagsを検索する方法がみつからなかったので
Deniteのsourceを自作して、ctags検索ができるようにしました。
https://github.com/hsawaji/denite-ctags

DeniteのSourceを初めて作ったので、メモを残しておきます。

## 準備

まずはDeniteのhelpをみます。

```vim
:help denite-create-source
```

> rplugin/python3/denite/source/**/*.py.

にファイルを置くと、Sourceとして読み込まれると書いてあります。
すでに実装されている他のSourceを参考に、最低限`__init__`と`gather_candidates`があれば動きそうなのがわかりました。

ここで簡単に動きを検証してみました。

```python:test.py
from .base import Base
from denite import util

class Source(Base):
    def __init__(self, vim: util.Nvim) -> None:
        super().__init__(vim)
        self.name = 'test'
        self.kind = 'file'

    def gather_candidates(self, context: util.UserContext) -> util.Candidates:
        return [
            {'word' : 'hoge'},
            {'word' : 'fuga'}
        ]
```

```vim
:Denite test
=> hoge
   fuga
```
`gather_candidates`で返した配列が表示されるようになりました。
これで、後はctagsの候補を返してやれば完了するはず。。

# ctagsの候補を表示する

vimには`taglist`というタグの検索結果を返してくれるやつがあるのでそれを使います。

```
:help taglist
```

既存のtag.pyをみると

- `__init__`で`vim`をインスタンス変数に入れる
- `self.vim.call('command', '引数')`で呼び出す

とすれば行けそうです。

今回は`taglist`なので

```pyton
self.vim.call('taglist', 'word')
```
を追加しました。
ここまでで、こんなソースになります。

```python
from .base import Base
from denite import util

class Source(Base):
    def __init__(self, vim: util.Nvim) -> None:
        super().__init__(vim)
        self.name = 'test'
        self.kind = 'file'
        self.vim = vim

    def gather_candidates(self, context: util.UserContext) -> util.Candidates:
        taglist = self.vim.call('taglist', context['args'][0])
        return [ {'word' : t['cmd']} for t in taglist]

```

下記のようにして`hogehoge`を検索します。

```vim
:Denite test:hogehoge
```

## 候補先に飛ぶ

Deniteのhelpを見ると

```vim
:help denite-kind-file
```

`action__path`と`action__pattern`があれば目的地に飛べる感じがします。

それらを追加したソースがこちら。
`taglist['cmd']`には正規表現のように`/^`と`$/`が入っていたので`re.sub`で削除しています。

```python
import re

from .base import Base
from denite import util

class Source(Base):
    def __init__(self, vim: util.Nvim) -> None:
        super().__init__(vim)
        self.name = 'test'
        self.kind = 'file'
        self.vim = vim

    def gather_candidates(self, context: util.UserContext) -> util.Candidates:
        taglist = self.vim.call('taglist', context['args'][0])
        return [ {
            'word' : t['cmd'],
            'action__path' : t['filename'],
            'action__pattern' : re.sub('\/\^|\$\/', '', t['cmd'])
            } for t in taglist]
```

ここまでほとんど完成です。
以上のソースの見た目などを調整したものが[denite-ctags](https://github.com/hsawaji/denite-ctags)になります。

## まとめ

Deniteのsourceを初めて作りましたが、簡単に作れることがわかりました。
ドキュメントや既存ソースがわかりやすかったので、それを参考に作ると良いと思います。
耐火金庫をハック

ネットの世界でもセキュリティは大切ですが、元祖おうちのセキュリティの耐火金庫をハックして見ました。

対象は開いている状態で番号が分からなくなった金庫です。

閉まった状態で番号が分からない金庫は業者さんにお願いするしかないと思います。

扉の裏蓋を開けるとこのようなメカがあります。

![IMG_20201007_103059.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/33b2e70a-7a84-0357-e4aa-b171cce2a754.jpeg)

左の円盤は四枚が重なっています。すべての円盤の切りかきが右にそろうと鍵で開けられる仕組みになっています。ダイアルを右に四回以上回すと一番奥の円盤が回るようになります。一番奥の円盤の切りかきが右になる位置を探します。見つかったら次に、左にダイアルを回して、手前の円盤の切りかきが同じように右になる位置を探します。二つ目も重なったら右回りにダイヤルを回して、手前の円盤も合わせます。最後に左回りに回して、一番手前の円盤の切りかきがあってすべての切りかきが合わさると、鍵で金庫が開けられるようになります。

円盤がダイアルといっしょに動くようになると重みが変わると思われ、それを調べていくと、閉じたまま番号が分からなくなった金庫も開けられるのかもしれません。

この金庫は番号が簡単には変えられない脆弱性がありますが、番号と鍵の二つの要素で認証しているので、番号だけで認証される某ネット決済よりもセキュリティレベルが高いかもしれません。
PayPayの開発者向けツール「PayPay for Developers」を試してみる

自社で運営しているECサイトやアプリの支払いにPayPayを導入できる開発者向けツール「PayPay for Developers」が2020年7月にリリースされました。

sandbox環境で支払いが完了するところまで、試してみたいと思います。

# PayPay for Developersに登録

まずはPayPay for Developersに登録します。
https://developer.paypay.ne.jp/

登録が完了すると、APIキーとテストユーザーが用意されます。

# PayPay OPA SDKのインストール
今回はCentOS 7でPython3.6と、pip3.6がインストールされている環境で作業します。

```
pip3.6 install paypayopa
```
PayPay OPA SDKのバージョンは0.6.0がインストールされました。
# QRコードの発行

PayPayアプリまたは、Webページで決済ができるウェブペイメントの実装方式を使って決済のQRコードを発行します。
"merchant_payment_id"に、ユニークな値を入れてリクエストします。

```python
import paypayopa

client = paypayopa.Client(auth=(API_KEY, API_SECRET), production_mode=False)

request = {
    "merchantPaymentId": "merchant_payment_id",
    "codeType": "ORDER_QR",
    "redirectUrl": "http://www.example.com/success",
    "redirectType":"WEB_LINK",
    "orderDescription":"Example - Mune Cake shop",
    "orderItems": [{
        "name": "Moon cake",
        "category": "pasteries",
        "quantity": 1,
        "productId": "67678",
        "unitPrice": {
            "amount": 1,
            "currency": "JPY"
        }
    }],
    "amount": {
        "amount": 1,
        "currency": "JPY"
    },
}

response = client.Code.create_qr_code(request)
print(response)
```

レスポンスが返ってきます。

```
{
  "resultInfo": {
    "code": "string",
    "message": "string",
    "codeId": "string"
  },
  "data": {
    "codeId": "string",
    "url": "string",
    :
    省略
    :
    "redirectUrl": "string",
    "redirectType": "WEB_LINK",
    :
    省略
    :
  }
}
```

レスポンスのurlにスマホでアクセスするとPayPayを起動するか尋ねられます。
※ PayPayがインストールされていない場合は、支払い用のWebページが開きます。
![image0_trim.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278715/19a23df9-e645-c8f5-2bd8-3aa2f8a86554.jpeg)
PayPayを起動して支払いを完了すると、3秒後自動でWebブラウザに戻ってredirectUrl（支払い完了ページなど）にリダイレクトされます。

これで支払いが完了しました。

PayPayアプリのテストユーザーのログイン方法はこちらを参考にしてください。
https://paypay.ne.jp/developers-faq/sandbox_environment/post-43/

# 支払い確認

支払いが完了したか調べるのにはGet Payment Detailsを使います。
先ほどの"merchant_payment_id"を使ってリクエストします。

```python
import paypayopa

client = paypayopa.Client(auth=(API_KEY, API_SECRET), production_mode=False)

response = client.Payment.get_payment_details("merchant_payment_id")
print(response)
```
レスポンスのcodeに"SUCCESS"が返ってくれば支払い完了です。

```
{
  "resultInfo": {
    "code": "string",
    "message": "string",
    "codeId": "string"
  }
}
```

# 今後

最終的にはECサイトの支払い方法でPayPayが選べるようにしたいと思っています。

このようなイメージです。

1. スマホのWebブラウザでECサイトにアクセス
1. ECサイトで商品を購入するボタンを押下
1. PayPayアプリが起動
1. PayPayアプリで支払い
1. 支払い完了後、自動でWebブラウザに戻る
1. ECサイトで支払い完了ページを表示

本番で使うには、加盟店の申し込みをする必要があります。

sandbox環境はPayPay for Developersに登録すれば試せるので、興味がある方はお試しください。
閏年を含めた月ごとの日数を求めるプログラム

【概要】
----------------------------------------
<b>1.結論</b>

<b>2.どのようにプログラミングするのか</b>

<b>3.開発環境</b>




1.結論
----------------------------------------
<b>2月だけ4,100,400の剰余(%)で条件式に当てはめたメソッドを作り、年月の入力と年月日を出力</b>する！
<br>
2.どのようにプログラミングするのか
----------------------------------------

```ruby
def get_days_leap_year(year, month)
  each_month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] #---❶
  if month == 2
    if year % 4 == 0
      if year % 100 == 0 && year % 400 != 0　#---❷
        days = 28
      else
        days = 29
      end
    else
      days = 28　#---❸
    end
  else
    days = each_month_days[month - 1]　#---❹
  end

  return days　#---❺
end

puts "年を入力してください："
year = gets.to_i
puts "月を入力してください："
month = gets.to_i　#---❻

days = get_days(year, month)
puts "#{year}年#{month}月は#{days}日間あります"　#---❼
```

❶：ここでは1~12月の日数を配列に入れています。2月は28日にしているのは閏年以外は28日だからです。条件式で28日か29日を選別していきますし、条件式で何も当てはまらなかった場合に28日になるようにしています。

❷：4で割り切れる＝閏年、100で割り切れる＝閏年ではない、400で割り切れる0＝閏年というふうに決まっています。”もし2月の場合”で”もし4で割り切れる場合”の条件式をそれぞれ作りました。そうした方がわかりやすく、一つの条件式も複雑にならないので小分けしました。”100で割り切れるかつ、400で割り切れない”部分はまとめて条件式に記載し、当てはまる場合は28日、当てはまらない場合(=400で割り切れる)は29日になります。閏年を判別する際に"4,100,400"なのかはネットで検索すると詳しく書いてあるのでこちらでは省きます。

❸：そもそも4で割り切れない場合は閏年でないのでその条件に対しても28日のプログラムをコーディングします。

❹：配列特有の”0”から番号が始まるので配列を取得する際は、呼び出したい月に対して”月-1”することで配列は該当の月の日数を呼び出せます。(ex:1月であれば、31日になるので、[1(月)-1]で[0]になりeach_month_days[0]なので31が取得できます。

❺：get_days_leap_yearメソッドは日数を出したいメソッドなので、戻り値はdaysです。

❻：入力したい”年”と”月”です。これらがget_days_leap_yearメソッドの仮引数となります。

❼：❻で使用した年月を式展開し、get_days_leap_yearメソッドの日数も#{days}で式展開しています。

<br>
3.開発環境
---------------------------------------
Ruby 2.6.5</br>
Rails 6.0.3.3</br>
Visual Studio Code 1.49.2</br>
<br>
OpenCVインストール時のbuildが終わらない問題の解決法(PEP517)

## OpenCVインストール時にインストールが終わらない問題
```:実行コマンド
pip install opencv-python
```


```:出力
Building wheels for collected packages: opencv-python
  Building wheel for opencv-python (PEP 517) ... -
```

# 原因と解決法
openCV-Pythonの古いバージョンはwheelのコンパイルを必要としないため、ここで止まってしまう。
pipのバージョンが古いため起きる問題であるため、`pip install --upgrade pip`を実行した後、
再度opencvをインストールする事で解決する。
pip、rubygemsおよびcomposerでのcompatible release指定方法

pipでは`pip install 'pip==0.0.2'`、rubygemsでは`gem install rubysl -v '=0.0.2'`、php composerでは`composer require monolog/monolog:=0.0.2`のように、バージョンを指定することができる[^1][^2]。演算子はほぼ共通だが、一つだけ異なる演算子がある。pipでは"Compatible release"、rubygemsでは"Pessimistic version constraint"、composerでは"Next Significant Release Operators"と呼ばれている演算子である。

pipでは`~=`、rubygemsでは`~>`、composerでは`~`[^3]を用いる。

例えば0.0.2から0.0.9まで[^4]をインストール対象としたい場合、以下のように記述すれば良い。

- pip: `pip install 'pip~=0.0.2'`
- rubygems: `gem install rubysl -v '~>0.0.2'`
- composer: `composer require monolog/monolog:~0.0.2`

references

- https://www.python.org/dev/peps/pep-0440/#compatible-release
- https://guides.rubygems.org/patterns/#pessimistic_version_constraint
- https://getcomposer.org/doc/articles/versions.md#tilde-version-range-

----

まあ、Pythonの記法が未だに覚えられないだけなんですが。composerはついでに調べた。

----

[^1]: rubygemsとcomposerでは等号は不要です
[^2]: 迷惑をかけないよう、存在しないバージョン番号を用いています。もしexample.comのような名前空間があるならぜひ教えてください(編集リクエスト歓迎)。
[^3]: `^`という演算子もありますが、今回の目的的には`~`ですね
[^4]: 正確には0.1未満なので0.0.10とかも含みますが…。
xlrd.biffh.XLRDError: Unsupported format, or corrupt file: Expected BOF record;

- 環境
    - Windows10 Pro バージョン1909
    - Python 3.8.5
    - Pandas 1.0.5

# 事象 : PandasでExcelファイルを読み込もうとしたら怒られた
PythonでExcelファイルを読み込むコードを作ってPyInstallerでexeファイルにしてディレクトリを変えてコマンドプロンプトで実行したら怒られた。

```bash
> my-code.exe
処理を開始しました。
Traceback (most recent call last):
  File "my-code.py", line 256, in <module>
  File "my-code.py", line 218, in check_files
  File "pandas\io\excel\_base.py", line 304, in read_excel
  File "pandas\io\excel\_base.py", line 824, in __init__
  File "pandas\io\excel\_xlrd.py", line 21, in __init__
  File "pandas\io\excel\_base.py", line 353, in __init__
  File "pandas\io\excel\_xlrd.py", line 36, in load_workbook
  File "xlrd\__init__.py", line 148, in open_workbook
  File "xlrd\book.py", line 92, in open_workbook_xls
  File "xlrd\book.py", line 1278, in getbof
  File "xlrd\book.py", line 1272, in bof_error
xlrd.biffh.XLRDError: Unsupported format, or corrupt file: Expected BOF record; found b'\t\x92\x86\x88\xe4 \x90^'
[12704] Failed to execute script my-code
```

```py:my-code.py
import pandas as pd

def check_files():
    # Excelファイルを読み込む
    book = pd.read_excel(excel_file, sheet_name=None, header=None)
```

# 原因 : ごみファイルがあるから
Excelファイルを開いたときにできる`~$`で始まるファイルが残っていた・・・
Excelファイルを閉じても残るときがある・・・エクスプローラーで見えなかったが`dir`コマンドで見えた・・・

```bash
> dir data\
# ...省略...
2020/10/07  10:30               165 ~$処理対象のExcel.xlsm
```

## 対応 : ごみファイルを消す
```bash
# ごみファイルを削除する
> cd data\
> del "~$処理対象のExcel.xlsm"

# ごみがなくなったら動いた
> cd ../
> my-code.exe
処理を開始しました。
処理が終了しました。
```
PHP開発環境を理解しながら構築！③

#はじめに
[前回](https://qiita.com/kyo_suke/items/e6646662e70c5833bb9b)まででローカル環境でPHPを書く環境を整えたので、今回からは実際にPHPを書いてブラウザに表示する方法を忘れないようにまとめていきたいと思います。
###やること
　・PHPを書いてみる
　・ブラウザで入力内容確認
###環境
　・Windows10 64bit
　・XAMPP v3.2.4
　・Apache v2.4.46
　・PHP v7.4.10

##XAMPPを使ってPHPをブラウザで表示
　では早速PHPを書く前に、テスト用HTMLを書いていきましょう。XAMPPやVsCodeをなにそれ？って方は[前回](https://qiita.com/kyo_suke/items/e6646662e70c5833bb9b)の記事をお読みください。
　大丈夫だよーって方はXAMPPの<strong>Apache</strong>を起動してからお読みください！
##①テスト用PHPファイルの作成
###ドキュメントルート
　ドキュメントルートとはWeb上に公開することのできるディレクトリのルートのことです。公開したいディレクトリのパスを設定するとそのディレクトリ配下のファイルへ全てアクセスが可能になります。

　しかし、初心者がいきなりディレクトリ公開するのはセキュリティ面で非常にリスキーなので今回は設定せず、ローカル(自分のPC上だけ)で書いていけるように設定は飛ばします！

###XAMPPのディレクトリ
　XAMPPのディレクトリはインストール時指定をしていなければ`C:\xampp`に作成されています。
そしてドキュメントルートは`C:\xampp\htdocs`となります。要するに`htdocs`内にhtmlやPHPファイルを配置していけばブラウザに表示されるということです。

　index.phpにはXAMPPの設定でlocalhostにアクセスしたら、`index`と名前がつくファイルに自動的にアクセスするよーという処理(リダイレクト)がされており、
`http://localhost/`にアクセスすると、自動的にURLは`http://localhost/index.php`となり、`C:\xampp\htdocs\index.php`が開き、XAMPPのダッシュボードが表示されるようになっています。

###VSCode上でhtdocsを開く
　VScode内でXAMPPのドキュメントルートを開いて作業をしやすくしちゃいましょう。
VSCodeを開いて`File`メニューの`Open Folder…`からXAMPPのhtdocsを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666516/d721d8b4-af54-1c67-531b-ddb3c761c65f.png)

無事に開けると左側にhtdocsのディレクトリが表示されます。
先ほど説明したindex.phpもちゃんとありますね。試しに開いてみるとdashboardページが表示されるようにPHPが書かれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666516/ea613542-427b-3c2e-1d00-dcc5a7d8c4bd.png)
しかし今回は新たなテスト用PHPファイルを作成したいのでこのPHPファイルは削除しちゃいましょう。
index.phpを選択してDeleteで削除できます。
(内容を全部消しちゃって書き換える方法でも大丈夫です)

それではテスト用のPHPファイルを作成します。
メニューバーの`New File`を選択して新しいファイルを作りましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666516/c8856d92-03ee-b646-2ffd-92823f3a7f29.png)

すると`Untitled-1`という名無しファイルができます。
そのまま`Ctrl + S(上書き保存)`すると名前を付けて保存することができますので、ファイル名は`index.php`で保存します。ここで名前が違うとうまく表示されなくなってしまうので気を付けましょう。

これでPHPファイルは完成です。
##②PHP記述してWEBブラウザで確認
　PHPのファイルができたので早速PHPを記述して記述内容をWebブラウザで確認してみましょう。
###PHPを書く
　今回は確認さえできればいいので、お決まりの`HELLO WORLD`を表示させちゃいましょう。
下記のコードを`index.php`に記述しちゃいましょう。

```php:index.php
<?php
 echo "HELLO WORLD";
?>
```

記述したら`Ctrl + S`で上書き保存して、Webブラウザで`http://localhost/`にアクセスすると…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666516/03be59fc-3325-6c01-8db2-47cc5cd9c071.png)

しっかり表示出来ているのが確認できました！お疲れ様でした！
index.phpの内容を変えて、更新したらしっかりと内容が変わっていることを確認してみてください！

#まとめ
　今回でローカル環境でPHPを書ける環境を構築しました。とはいっても初期構築のやり方も言語一つとっても様々なので、自分の環境にあったやり方を見つけましょう。その際に一つ一つ理解していると構築しやすくなります。

次はLaravelの導入方法を書こうと思ったのですがこの方がわかりやすくまとめているのでこちらをどうぞ！！！(一部内容被っております)
 
→[初心者による投稿機能付き掲示板の作成](https://qiita.com/patapataxppp/items/024e5e6668970a53a9b4)

初歩的な内容でしたが、ここまでお読みいただいてありがとうございました！
File Managerでデータを書き込む、読み出す、削除する

iOSのファイル・ディレクトリにデータを保存・削除する方法です。
![directory-structure-computer-icons-mbox-file-system-png-favpng-PTiJThPRJLFFyTW2S74P2Eb0D.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/fcaeeac3-71da-34db-f3da-c2ab3dfdb38e.jpeg)
ディレクトリにはローカルURLでアクセスします。


#保存

###１、保存用の宛先URLを作る
DirectoryのURLを検索して、FileのURLをつけたしています。

```swift

guard let url = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("savingImage.jpeg") else { return }
// データに合わせて拡張子を設定してください（例では.jpeg）
print(url)
```

この時点では、宛先URLが作られただけで、コンテンツ・データは保存されていません。
プリントしたURLはこんな感じです。
>file:///var/mobile/Containers/Data/Application/D0C84E1A-DEA6-4D58-8335-C6B075309E95/Library/Document/savingImage.jpeg

/Document/ までがディレクトリURLで、そのあとの savingImage.jpeg は,
付け加えたファイル用URL部分です。

*引数の説明*

```swift
for: SearchPathDirectory // ディレクトリの種類。検索する一番下位。
    .documentDirectory // ホームディレクトリ　（/Document）
    .cachesDirectory // （Library/Caches）
    ... // まだいっぱいある。存在してかつアクセス可能なディレクトリを与えないとnilが返ってくる。

in: SearchPathDomainMask // ディレクトリパスの一番上位の分岐（多分）。.userDomainMaskしか使ったことない。
    .userDomainMask // 現在の使用ユーザーのホームディレクトリ (~/)
    .localDomainMask // ユーザーアカウント関係なく利用できる
    .networkDomainMask // ネットワーク上で利用可能なアイテムをインストールする場所 (/network)
    .systemDomainMask // Appleが提供するシステムファイルのディレクトリ（/System）
    .allDomainMask // 全てのドメインを検索できる
appropriateFor: URL // 多分一時ディレクトリの場所を特定するために与えるファイルURL。よくわかっていないのでいつもnil
create: Bool 宛先URLが存在しない場合、新たに作るか
```

###２、データを書き込む
１、で作った宛先URLに書き込みます。

```swift
let data = uiImage.jpegData(compressionQuality: 1.0)
do {
    try data?.write(to: url)
} catch let error {
    print(error)
}
```
Data型にしてしまえば、.writeで書き込めます。

#読み出し

###１、ディレクトリ内にあるコンテンツの検索
目的のディレクトリのURLを検索して、中身を表示します。

```swift

guard let url = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) else { return } // 検索するだけなので、createはfalse

do {
    let urls = try FileManager.default.contentsOfDirectory(at:url, includingPropertiesForKeys: nil)
    print(urls)
} catch let error {
    print(error)
}
```
>[file:///private/var/mobile/Containers/Data/Application/95DFCDD1-1D89-4976-9A1F-0FD27DD3F72B/Library/Document/0.jpeg]

###２、データを取得

```swift

guard let url = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("savingImage.jpeg") else { return } // 検索するだけなので、createはfalse

do {
    let readData = try Data(contentsOf: url)
    let readImage = UIImage(data: readData)
} catch let error {
    print(error)
}
```

#削除

```swift
guard let url = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("savingImage.jpeg") else { return } // 検索するだけなので、createはfalse

do {
    try FileManager.default.removeItem(at: url)
} catch let error {
    print(error)
}
```
🐣
****
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)