OmniAICreator/Qiita-1.07M huggingface dataset:
Gtk3 WebKitGtk

###Gtk3 WebKitGtk

このプログラムWebKitGtkがGladeの中のWigetに対応しているようなのでビルドに挑戦してみる。

https://github.com/GSharpKit/webkitgtk3-sharp

gtk-sharpなのでmono向けのようだ。

<img width="400" alt="Screenshot from 2021-06-14 12-40-30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/4093bd6d-029b-16d9-e052-1da207c638f0.png">

Install手順書によると./configureを実行しろと書いてある

configureスクリプトを実行するにはまず同封されているautogen.shを実行する

```
$ bash autogen.sh
```

autogen.shを実行すると、configureスクリプトが生成されるので実行する

```
$ ./configure
```

configureスクリプトが完了するとmakeファイルが生成されるのでmakeとmake installを実行する

```
$ make
$ make install
```

[参考](https://getfem.readthedocs.io/ja/latest/install/install_linux.html)

configureの実行課程でエラーが出た。gtkのバージョンが古いようだ。
PKG_CONFIG_PATH、GTK_SHARP_CFLAGSがわからない。原因を調査中

```
configure: error: Package requirements (gtk-sharp-3.0 >= 3.6.0) were not met:

Requested 'gtk-sharp-3.0 >= 3.6.0' but version of Gtk is 2.99.4

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables GTK_SHARP_CFLAGS
and GTK_SHARP_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
```

Configureスクリプトを除く

```
if test -n "$GTK_SHARP_LIBS"; then
    pkg_cv_GTK_SHARP_LIBS="$GTK_SHARP_LIBS"
 elif test -n "$PKG_CONFIG"; then
    if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-sharp-3.0 >= 3.6.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gtk-sharp-3.0 >= 3.6.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GTK_SHARP_LIBS=`$PKG_CONFIG --libs "gtk-sharp-3.0 >= 3.6.0" 2>/dev/null`
		      test "x$?" != "x0" && pkg_failed=yes
else
  pkg_failed=yes
fi
 else
    pkg_failed=untried
fi
```

#####追記


C++で書かれたライブラリーに静的ライブラリ(拡張子.a)と動的ライブラリ(.so or dll)がある

soファイルはC#で呼び出すことができる

https://qiita.com/TackKaiware/items/27ebcf10bb2624db197a

C#のクラスライブラリーを作成し、その中でC++の読み込むC#側で宣言する

C++側

```
extern "C"
{
   __declspec( dllexport ) void Test();
}
```

C#側

```
  [DllImport( "Library.dll" )]
  static extern void Test();

  static void Main(){
       Test();
  }
```

DllImportを実装したと思われるWebViewライブラリ

https://github.com/webview/webview_csharp

https://github.com/webview/webview
kubectlで特定のプレフィックスが付いたリソースを削除する

- `kubectl delete pvc data-open*`みたいなことはできない
- namespace指定で--allオプションでまとめて消せるが、同じnamespaceに必要なものがあったら巻き添えになってしまう

## コマンド
```bash
kubectl get pvc | awk '/data-opendistro-es-1-*/{print $1}' | xargs kubectl delete pvc
```

## 参考
https://qiita.com/oguogura/items/fee90b7b2ce78413a518
Mac Python Anaconda keras-yolo3 使い方

# keras-yolo3 で物体検出する方法
筆者は超初心者です
個人のメモに近いです

## ① プロジェクトのクローン
あらかじめ、クローンしたいディレクトリに移動してから、以下を実行
> git clone https://github.com/qqwweee/keras-yolo3.git

## ② keras-yolo3 用のconda環境構築
環境確認
> conda info -e

新しい環境作る（環境名とPythonのverを指定）
Pythonのバージョンは3.5.2が良い
> conda create -n yolo_v3 python=3.5.2 pip

作った環境下に入る
> source activate yolo_v3

必要なモジュールをインストールする（バージョンが違うと後々動かないので注意）
> pip install　モジュール名 

必要なモジュール一覧
> absl-py==0.7.1
astor==0.8.0
bleach==1.5.0
cycler==0.10.0
gast==0.2.2
grpcio==1.21.1
h5py==2.9.0
html5lib==0.9999999
Keras==2.1.5
kiwisolver==1.1.0
Markdown==3.1.1
matplotlib==3.0.3
numpy==1.16.4
Pillow==6.0.0
protobuf==3.8.0
pyparsing==2.4.0
python-dateutil==2.8.0
PyYAML==5.1.1
scipy==1.3.0
six==1.12.0
tensorboard==1.6.0
tensorflow==1.6.0
termcolor==1.1.0
Werkzeug==0.15.4


## ③　やっと物体検出
下記のコードを実行
 > python yolo_video.py --image

以下が表示されたら、拡張子まで正確にファイル名を入力
 > ”Input image filename:”

![tmpt1y93s04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1211172/3102977f-2d72-150d-073f-f6feea6f0ac8.png)
Quantum ESPRESSO(pwscf)のコードを覗く

**注意** この記事は永遠に完成しないと思います。

# はじめに

固体物理の第一原理計算コードのうち、[Quantum Espresso](https://www.quantum-espresso.org/)(以下、QE)のコードを読んでいく。
どこで何をしているかを把握して、理屈と実装をつなげていくことが目標。
なお、必要な前提知識としては、固体の電子状態計算に関する本である「物質の電子状態」が有名。

ここでは、Quantum EspressoのVersion 6.1(qe-6.1)を対象とする。[^1]




# コードリーディング

## コールグラフ

プログラムから簡単なコードグラフを作成するスクリプト[^2]を作成し、pwscfから呼ばれる関数を書いた。
[コールグラフ(簡約版)](https://github.com/YukiSakamoto/QuantumESPRESSO_codereading/blob/master/static_call_graph/pwscf_call_shallow.txt)

なお、vimで、`set foldmethod=marker`とすると折りたためるように、マーカーを挿入してある。
より深いレベルまで出力したものは、[ここ](https://github.com/YukiSakamoto/QuantumESPRESSO_codereading/blob/master/static_call_graph/pwscf_call.txt)にある。



主なコードは、主にソースツリーの`PW/src/`の中、もしくは共通性の高いもの（ポテンシャル関連や、交換・相関汎関数のパラメータなど）は`Modules/`の中に置かれている。

* pwscf.f90: エントリポイントはここ。
* run_pwscf.f90 : ここで、入力ファイルを読んだり、MPIのセットアップをしたりする。そして、構造最適化など、scf計算をする場合は、electrons()でscf計算を行い、その後、forces()という関数をつかって力の計算を行う。DOSやバンドなどを求めるためのnon-scf計算の場合は、non_scf()をコールする。

## 変数の一覧

全体で使いまわされる変数リスト（作成中）はここ。

[変数リスト](https://github.com/YukiSakamoto/QuantumESPRESSO_codereading/blob/master/variables.md)

## 主要なデータ構造
波動関数とポテンシャルをどういうデータ構造で格納しているかについて。詳細は、PW/src/scf_mod.f90の中にある構造体をみる。

## SCF計算

electrons.f90というコードがSCFループを記述している。
ここにはおもに、electrons()とelectrons_scf()というサブルーチンが定義されており、前者が後者をコールする形になっている。
electrons_scf()のなかで、SCFループを回す。
electrons()は何をするかというと、electrons_scf() で得られた密度に対して、Hartree Fock交換積分を計算する。ただし、この必要があるのはハイブリッド汎関数を対象とする時のみなので、そうでない汎関数(LDAやGGA)の時は、事実上、electrons_scf()だけで終了する。

### SCFループの中身： electrons_scf()の流れ

electrons_scf()の中でSCFをとく。SCFループの中で呼ばれる関数は主に以下のようになる。


* c_bands() : 実際にハミルトニアン（フォック行列）を各k点に対して求め、対角化を行う。
* sum_band(): c_bands()で得られた波動関数から、密度を求める。
* mix_rho(): Fock行列を作るときに使用した入力密度(ρ_in)と、sum_band()で計算して得られた新しい密度(ρ_out)を混ぜる。
* v_of_rho(): これは、scfが収束していないときのみ呼ばれる。次回のループで使われるc_bands()で使うための、入力ポテンシャル(Vin)を、さっき得た密度から計算する。

なお、この途中で、エネルギーの計算を行う。収束のチェックは、Harris-Weinert-Foukles Energyと実際にKohn Sham方程式から得られるエネルギーの値の差が十分に小さくなったかどうかを見ている。
Harris-Weinert-Foukles Energyについては、物質の電子状態の「9.2 全エネルギー汎関数」の節のなかの「密度の陽関数」という項目を参照。簡単にいえば、

* Kohn-Sham方程式から得られるエネルギー: 入力の密度から、各k点ごとにフォック行列を求めて、固有値（エネルギー）を求める。このときに同時に得られる固有ベクトルがその時の電子密度を記述するのだが、この密度を汎関数の引数とする。これは、各バンドのエネルギーを計算する際のエネルギーは前の密度を使って求めているものであるため、自己無撞着が達成された時以外は実際上の意味を持たない。（と私は認識しているのだが、ちょっとあやしい）
  
* Harris-Foukles Energyは、入力密度のみから得られるエネルギーである。KSエネルギーでは、フォック行列の固有ベクトルから計算される密度を交換・相関汎関数に渡してエネルギーを求めたが、こちらはその代わりに入力密度をそのまま使う。
* これらは、自己無撞着が達成されるとほぼ同一のエネルギーを示すことになるはずであり、そのことを利用して、自己無撞着への達成具合の評価としている。

これらを次々に読んでいけばよい。

### c_bands()
c_bands.f90というファイルには、c_bands()とc_bands_nscf()という二つのサブルーチンがある。後者は名前の通り、バンド構造やDOSを求めるためのnon-scf計算の時に呼ばれる。
ここでは、c_bands()について読む。

g2_kin()で、運動エネルギーの計算

### sum_band()


### mix_rho()
電荷密度から、次のSCFの初期電荷密度を計算する

### v_of_rho()
電子密度からポテンシャルを計算する

# 最後に
また書きます。


[^1]: これを書き始めたのは2018年くらい？ だったか忘れましたが結構前に書き始めて、放置されていました。
[^2]: 単純に、fortranプログラムのsubroutineの中で、`call`があるところを抜き出しているだけです
[Android開発]ストレージの種類

## 参考

公式見ながらピックアップ。

https://developer.android.com/training/data-storage?hl=ja

## 物理的な保存場所

- **内部ストレージ**...常にすべてのデバイスで利用できる。容量は少ないが信頼性が高く、アプリ自体などの重要なデータを保存する。
- **外部ストレージ**...容量多め。SDカードなどは外部ストレージに含まれる。アプリ(API29以上)には外部ストレージに対する特別アクセス権限（対象範囲別ストレージ）がデフォルトで付与される

## ファイルシステム

- **アプリ固有のストレージ**...アプリ専用のファイルを保存する。内部・外部ストレージどちらにも保存可能。他のアプリにアクセスされたくない場合は内部ストレージを使用する。アプリがアンインストールされると保存データも削除される。
- **共有ストレージ**...メディアやドキュメントなど、アプリが他のアプリと共有するファイルを保存する。アプリがアンインストールされても保存データは残る。
- **設定**...Key-Valueペアで環境変数などを保存する。
- **データベース**...構造化データをデータベースに保存する。

## 使用方法

- アプリ固有のストレージ&内部ストレージ... getFilesDir() / getCacheDir()
- アプリ固有のストレージ&外部ストレージ... getExternalFilesDir() / getExternalCacheDir()
- 共有ストレージ&メディアファイル（画像、音声、動画）... MediaStore API
- 共有ストレージ&その他の種類のコンテンツ... ストレージアクセスフレームワーク(SAF)
- 設定...Jetpack Preferencesライブラリ
- データベース...Room永続ライブラリ

## 感想

 Androidはセキュリティ的な面からAPIが上がるごとに権限が厳しくなってきている。
用途に合わせて利用するライブラリを使いこなしていかないといけない。
世間的な流れとしては最近Googleが外部ストレージを廃止した端末を出したりなど無くす方向に行きそうな雰囲気。
AndroidもiPhoneと同じくオンラインストレージを主流にしていきたいのかもしれない。
Gitって何？ ※Git超初心者向け

今月から未経験エンジニアとして働き始め、いきなりGitの壁に絶賛ぶち当たり中。
働き始める前に「GitHub」「GitHub Desktop」を使ってポートフォリオの作成をした経験があるが、
概念やそもそもGitって何？という部分を理解せず、ただなんとなく便利なツールなんだなと思っていた次第。
ここ最近で一番の勘違いが発覚したので超簡単にまとめた。

### ■GitとGithub
大きな勘違いだったのが、<b>「Git」と「GitHub」は全くの別物</b>だということ。
衝撃だった。。。

Gitというのは、一言でいうと<b>「分散型バージョン管理システム」</b>と言われるらしいが、正直ピンとこない。
使ったことがある人は多少なりとも恩恵を受けたことがあるとは思うが、要はファイルのバージョンを更新したり、過去の履歴に遡ったりできるあれである。

一方GitHubというのは、<b>「Gitを利用した開発者を支援するためのwebサービス」</b>の一つに過ぎない。
つまり、<b>Gitを使うなら必ずGitHubを使わなければならないというわけではない。</b>
実際今の会社では、GitHubではなく「Bitbucket」というサービスを使用している。

ではGitHubやBitbucketとは何なのか？
これは、リモートリポジトリの操作をGUI操作できるようにしてくれるサービスである。
つまり、これらのサービスを使わずともコマンドを叩くことでGit操作は可能なのである。
とはいえ、コマンドだけで業務を進めるメリットがないため、何かしらのサービスを使用するのが一般的と言える。

ちなみに「GitHub Desktop」はローカル側の操作をGUI操作できるようにしてくれるサービスだということが分かる。
<br>
以上、ここ最近で一番の勘違いが発覚した出来事でした。
AWS Certified DevOps Engineer - Professionalに合格した話

## はじめに
先日、**AWS Certified DevOps Engineer - Professional** (以下DOP)を取得しました。
学習方法などを書くので参考になれば嬉しいです。


## 自己紹介
* 大学・大学院では情報科学を専攻
* 2019年4月から新卒で人事システムのSRE
* AWS歴は2年くらい
* EC2周り, Lambda, CloudFormation, CodePipeline, CodeBuild, Configあたりはよく使う
* 2019年10月に AWS Certified Solutions Architect – Associate (以下SAA) を取得
* （そのあとDOP試験を受けるのを決めたけど問題文の長さに心が折れて一年ほど勉強をサボりました笑）


## DOP試験とは
https://aws.amazon.com/jp/certification/certified-devops-engineer-professional/

問題数75問、試験時間180分です。長い...


https://qiita.com/nakazax/items/20458e146d3d9f2aa615

こちらによると、

1. [AWS Certified Solutions Architect - Professional](https://aws.amazon.com/certification/certified-solutions-architect-professional/) (以下SAP)
1. [AWS Certified Advanced Networking - Specialty](https://aws.amazon.com/certification/certified-advanced-networking-specialty/)

に続く3番目の難易度らしいです。


## 勉強方法
王道だと思いますが以下をやりました。やはり銀の弾丸は無く、地道に進めるしかないと思います。

1. 練習問題を解く
1. 実際に触る
1. メモする

ちゃんと試験対策をやった期間は2ヶ月ほどです。
それまでは業務で触ったり、AWSのアップデートを見たりしてました。


### 1. 練習問題を解く
https://www.whizlabs.com/

基本的に↑のサイトでひたすら練習問題を解きました。
DevOps Pro用のコースがあり、元値が20$ほどで、30%OFFくらいで買ったと記憶してます。

80問の模擬試験が5つあり、
難易度は本番と同じくらいだったと思います。
1問解いたらすぐに答えと解説が見れるPractice modeがあり、1日8問ほどのペースで解きました。

英語のみなので、Chrome拡張機能のGoogle翻訳を使い、日本語に訳しながら解きました。
よくわからない訳になっている箇所は英語を見て理解しました。
実際の試験は英語の原文と日本語訳が見れるので似たような形で解くことができて良かったです。


### 2. 実際に触る
解説を見ても分からないところは実際にコンソールから触ってみたりもしました。
OpsWorks, Kinesisなどは分からなさすぎて触ってませんが、ElasticBeanstalkやCodeDeployなどは実際に触ったのもあり、記憶によく残ってます。


### 3. メモする
![Screen Shot 2021-06-13 at 20.00.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187545/bf642fd6-2df2-9b51-a209-7fd3f940a539.png)

こんな感じで、調べたものはマインドマップ形式でメモを取りました。
使ったアプリは [MindNode](https://mindnode.com/) です。
英語の勉強にもなるからと英語で書きましたが、後半はしんどかったです笑
これは勉強のハードルになり、三日坊主の原因になるのであまりオススメしません。


![Screen Shot 2021-06-13 at 20.01.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187545/dd858415-e4fd-96e3-41ce-06e574bfe8e2.png)

全体はこんな感じです。結構書きました。


## 実際の試験について
ピアソンVUEで自宅受験をしました。
[1回落ちても無料のキャンペーン](https://pages.awscloud.com/Global_TrainCert_Japan_Online_Proctoringja.html?sc_icampaign=awareness_jp_traincert_online_20210501-20210731_ribbon&sc_ichannel=ha&sc_icontent=awssm-8084&sc_iplace=ribbon&trk=ha_ribbon_awareness_jp_traincert_online_20210501-20210731) があったのですが、受験料半額のバウチャーと併用できないのと、これを知った時には半額バウチャーで試験の申し込み済みで面倒だったのでそのまま受けちゃいました。

### 前日まで
専用のソフトを使って受験するので、ちゃんと動くかチェックしました。
また、デスク周りに余計なものを置いてはいけないので、本などを別の部屋に移動しました。

### 当日
体調管理に気を使いました。
睡眠は7時間とり、試験の1時間ほど前に少しご飯を食べ、直前にトイレに行きました。
また、午後の遅い時間だと頭が回らないと思い、午前11時半からの試験にしました。

試験時刻の30分前からチェックインができます。webカメラを使ってデスクの状況を見せました。
ティッシュや外付けキーボード、マウスなどを撤去するように指示されました。
試験開始の直前、PCがフリーズして焦りましたが30分遅れくらいで12時ごろからスタートしました。
焦った影響で序盤は集中できなかったですが、なんとか持ち直しました。


## 結果
877点で合格でした！
750点以上が合格なので結果的には余裕があったみたいですが、迷った問題がかなり多かったので正直結構不安でした。

スコアが100~1000点で付けられ、内部でどのような採点が分からないので何問正解したか気になりましたが、結果合格だったのでよしとしました。


## おわりに
DOP試験に受かって本当に良かったです。
ただ、試験に受かっただけだとあまり意味がないので、今回得た知識を使って良いシステムを作れるように頑張ります。

次は最難関と言われてるSAPを受けます。
今年中に受かってまた合格記事が書けるよう頑張ります。
設定したfaviconがIEだけ表示されない

#前提
・faviconをWindows標準のicon形式を作成していること
・FTP等の使用した経験があり、ディレクトリ構成がなんとなくわかること

#問題点
WordPressのサイトを作成した際、IEのみfaviconが青いWordPressのロゴになってしまいfaviconが表示できない
(Chrome・Firefox・Edgeでは表示されている)

#解決
###その1-画像の配置場所
①favicon画像はルートディレクトリに配置してください。
(wordpressの場合は自身が使用しているテーマファイル直下に配置する)
②faviconを記載しているタグの修正をしてください。
```<link rel="shortcut icon" href="http://あなたのURL/favicon.ico">
```
正しく配置できたか確認するには、ブラウザに以下でアクセスしfavicon画像が表示されたら問題ないです。
http://あなたのURL/favicon.ico

###その2-headタグの記載場所
faviconを正しく配置したのに表示されない場合は、headタグ内を確認します。
私の場合はCookieBotのためのsqriptタグがfaviconより前に記載されており、表示されていませんでした。
sqriptタグはfavicon以下に記載する必要があるようです。


上記を行うことで表示されるようになりました。

#参考
https://siyo.org/inside/seo3353/
VS CodeでGASの開発環境を構築する


#概要
Visual Studio Code（VS Code）上で、GASの開発環境を構築する方法。

■目次

- インストール
  - VS Code
  - Node.js（npmを含む）
  - package.json（の作成）
  - TypeScript、TSLint
  - GASの型定義ファイル
  - clasp
- claspの使い方
- VS Codeの実行エラーへの対処

##インストール
### Visual Studio Code

https://code.visualstudio.com/download

###Node.js
npmを使う上で必要。モジュールを管理するツール。

https://nodejs.org/ja/download/

###package.jsonの作成
一連の作業で必要になるpackage.jsonを作成しておく。
terminalでローカル上の作業フォルダに移動します。（PS:c:\Dir_XXX\DirXXX\のようになっている場所が作業フォルダになっているかを確認。）
terminalで以下を実行。package.jsonが作業フォルダに作成される。

```terminal
npm init --y
```


###TypeScriot、TSLinstのインストール
まず、.tsファイルを読み込むために、typescriptとtslintをインストール。

```terminal
npm install -g typescript
npm install -g tslint
```

###GASの型定義ファイル
次に、GASの型定義ファイルを読み込むために、VS Code上のTerminalから以下を実行。

```terminal
npm i @types/google-apps-script --save-dev
```

###clasp
claspは、GASのCLI。VS Code上のterminalから作成したコードをGoogle Drive上にPushできる。プロジェクトの新規作成も可能。
VS Codeのterminalで以下を実行。

```terminal
npm install -g @google/clasp
```

##claspの操作

####基本操作
```terminal
// ログイン
clasp login

// ログアウト
clasp logout

// プロジェクトの新規作成
clasp create "TITLE"

// push
clasp push

// pull
clasp pull

// ブラウザでプロジェクトを開く
clasp open
```

ログイン後、ブラウザが起動し、アクセス許可を確認される。この際、複数のGoogleアカウントを持っているとその一覧が表示される。しかし、デフォルトのアカウント以外で認証しようとするとエラーが出る。
※デフォルトアカウント以外で認証する方法をご存知の方がいたら教えてください…

初めてclaspでGoogle Driveを操作する場合、以下のようなエラーが出る事がある。この場合、示されているURLにアクセスしてAPIを有効化する。

```terminal
Error: Permission denied. Enable the Apps Script API:
https://script.google.com/home/usersettings
```

##VS Codeの実行エラーへの対処

claspの実行にあたって、下記のようなエラーが出る事がある。

```terminal
clasp : このシステムではスクリプトの実行が無効になっているため、ファイル 
 C:\Users\USERNAME\AppData\Roaming\npm\clasp.ps1 を読み込むことができません 
。詳細については、「about_Execution_Policies」(https://go.microsoft.com/ 
fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ clasp push
+ ~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
```

これは、PowerShellがスクリプトの実行をデフォルトで禁止しているために起こるエラー。
実行ポリシーを変更し、スクリプトの実行を許可する事で回避できる。デフォルトの設定を「許可」にすることもできるが、セキュリティ面で危険性があるため、現在のプロセスでのみ許可するようにスコープを設定する。
以下を実行。

```terminal
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
```

## .clasp.jsonの設定

公式説明はこちら：
https://github.com/google/clasp#project-settings-file-claspjson

```.clasp.json
{
  "scriptId": "",
  "rootDir": "build/",
  "projectId": "project-id-xxxxxxxxxxxxxxxxxxx",
  "fileExtension": "ts",
  "filePushOrder": ["file1.ts", "file2.ts"]
}
```
設定をしておいたほうがいい項目は以下：
**roorDir**
どこのディレクトリに居てもとりあえず「clasp push」してしまう癖がつくため、意図しないファイルまでpushしてしまう事故が起きます。
それを未然に防ぐため、push対象とするディレクトリを指定しておきます。

**filePushOrder**
ファイルをpushする順番を指定します。GASのエディタ上でファイル一覧に表示される順番を指定する事と同義です。
エディタを開いた際に、デフォルトで開かれるファイルは一覧の一番上のファイルです。実行したいファイルが一番上に無いと、毎回ファイル一覧から実行したいファイルを開く手間が発生します。この手間を省くための設定です。
GASを実行する上では設定しなくても問題ない。


# リファレンス

★超重要

https://qiita.com/ponsuke0531/items/4629626a3e84bcd9398f


https://qiita.com/HeRo/items/4e65dcc82783b2766c03

参考

https://kakehika.com/tech/vscodegoogle-apps-scripttypescript/

https://qiita.com/HeRo/items/4e65dcc82783b2766c03

https://gas.excelspeedup.com/claspautocomplete/
PHP Carbonを使って前日の日付を得る

# 目的

- PHPの日付処理ライブラリであるCarbonをもちいて前日の日付を取得する方法をメモ的にまとめる

# 方法

- 下記のように記載する。

    ```php
    $yseterdayAt = Carbon::yesterday();
    ```

- `$yesterdayAt`には前日の日付情報が格納される。
rails+herokuで特定の環境にのみip制限をかける

# やりたいこと

- heroku
- rails
- docker


上記でherokuでstaging環境、dockerで開発環境を作る。stagingの定義は下記

- 開発環境より本番に近い最終チェック用
- 開発環境ではなくスマホなどでみれるように外部サーバーにおく
- dbは汚したくないので本番と別

# 仕様

## ip制限部分

最初、htaccessなどで対応しようとしたがherokuは色々と面倒そうなのでcontrollerで制御する形に。

```ruby:application_controller.rb
  if Rails.env.staging?
    before_action :restrict_remote_ip
  end
  PERMIT_ADDRESSES = [].freeze

  def restrict_remote_ip
    remote_ip = request.env["HTTP_X_FORWARDED_FOR"] || request.remote_ip
    unless PERMIT_ADDRESSES.include?(remote_ip)
      render text: 'Service Unavailable', status: 503
    end
  end
```

「【Rails】IPアドレスでアクセス制限」
https://qiita.com/k-penguin-sato/items/80f790cfe6b6830121a8

上記記事を参考に実装。

- if Rails.env.staging?でstagingのみにrestrict_remote_ipがかかるように
- `request.env["HTTP_X_FORWARDED_FOR"] || request.remote_ip`はサーバーにより２種類しょりがあるため

## docker対応

「Railsで「Cannot render console from Allowed networks」と言われたら」
https://qiita.com/suin/items/9b567c63af73b235e458

docker経由だと上記の対応が必要。

## heroku対応

ip取得の際にHTTP_X_FORWARDED_FORを使用しているのはheroku対応。

「Herokuでアクセス制御を実装する(PHP)」
https://araiyusuke.hatenadiary.com/entry/2017/03/13/120524

間にロードバランサーが入っているので大本のipを聞かないといけない
Next.js の Static HTML Export でも画像の最適化をしたい

この記事は、現在開催中のイベント「3000文字Tips - 知ると便利なTipsをみんなへ届けよう」の記事です。

https://qiita.com/official-events/d523df99d6479293ffa7

## next/image は Static HTML Export では使えない

Next.js を使って静的サイトをつくるとき（`next export`）に、`next/image`は使えない。

https://nextjs.org/docs/advanced-features/static-html-export より引用

> The next/image component's default loader is not supported when using next export. However, other loader options will work.

静的サイトを生成する際に画像の最適化をしたい場合は、

- next/image で別のローダーを使う
- Gatsby のように Build 時に画像を最適化する

必要がある。

Gatsby のように Build 時に画像を最適化するには、以下のライブラリを使うと実現できる。

https://github.com/cyrilwanner/next-optimized-images

しかし、画像の最適化は Gatsby のように自動ではやってくれないため、自分で画像の最適化を指定する必要がある。
また、現状では画像のリサイズと WebP への変換を同時に行うことができない。(正確に言うと、`responsive-loader`で [jimp](https://github.com/oliver-moran/jimp)を使う場合は使えない)

`responsive-loader`で[sharp](https://github.com/lovell/sharp)を選択するとできるのだが、現在 sharp のアップデートに対して next-optimized-images の更新がされていないため、`responsive-loader`に sharp を使えない。
PullRequest は飛んでいるようなので、対応待ちという状態。

https://github.com/cyrilwanner/next-optimized-images/pull/190

早く PullRequest がマージされるといいですね。
むかしむかし、「Windows Subsystem for Linux（WSL1）」は「Docker for Windows」と連携できなかった。


# Introduction

WSL2を調べていて、WSL2はLinuxコンテナーを実行できない、と勘違いしてしまった。

今は昔、WSL1はLinuxコンテナーを実行できなかった。
今は、WSL2はLinuxコンテナーを実行できるようになった。

# What to do?

1. Windows 10(20H1)にWSL2をインストール
2. Docker Desktop for Windowsをインストール
3. Windows StoreからUbuntu-20.04をダウンロード
4. WSL2上で動いているUbuntu-20.04でLinuxコンテナーをdocker-composeでビルド＆実行

# 調べてみた（１）

2017年時点の話。
WSL1ではLinuxコンテナーは動作出来なかった。

https://www.atmarkit.co.jp/ait/articles/1609/01/news053.html
>2017年04月28日 05時00分 公開

>なお念のために言っておくと、Docker for WindowsはWindows Server 2016で利用可能できる「Windowsコンテナ」（正確には「Windows Serverコンテナ」と「Hyper-Vコンテナ」の2つ）をサポートするものではない。あくまでも「Linuxコンテナ」をサポートするものである。各コンテナの違いについては以下の記事を参照していただきたい。

>[「Windows Serverコンテナ」「Hyper-Vコンテナ」「Linuxコンテナ」「Docker」の違いとは？](https://www.atmarkit.co.jp/ait/articles/1611/04/news028.html)

>また、Windows 10 Anniversary Update（バージョン 1607、ビルド14393）で導入された**「Windows Subsystem for Linux（WSL）」や「bash（Bourne Again Shell）」（以下の記事参照）と連携することもない。**WSL上に「apt-get install docker.io」でDocker関連のコンポーネントをインストールしようとしても一部エラーになってインストールできないし、WSL上からdockerコマンドを使って、Docker for Windowsの（Hyper-V上にインストールされている）コンテナを管理することもできない。

**そうなのであれば、WSL2はDockerと連携できるのだろうか？**

# 調べてみた（２）

1. どうやら「WSL2で動いているUbuntu上でDockerエンジンを動かしてLinuxコンテナーを動かせるようになった。WSL1ではDockerエンジンを動かせなかった」ということだった。

https://docs.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-containers

>WSL バージョン1では、Windows と Linux の基本的な違いにより、Docker エンジンは WSL 内で直接実行できませんでした。そのため、Docker チームは、Hyper-v Vm と LinuxKit を使用して代替ソリューションを開発しました。 ただし、WSL 2 は、完全なシステムコールの容量を持つ Linux カーネルで実行されるようになったため、Docker は WSL 2 で完全に実行できます。 つまり、Linux コンテナーはエミュレーションなしでネイティブに実行できるため、Windows と Linux の両方のツール間でパフォーマンスと相互運用性が向上します。
・・・
>Windows 用 Docker デスクトップは無料で利用でき、docker 化アプリのビルド、配布、実行のための開発環境を提供します。 WSL 2 ベースのエンジンを有効にすることで、同じコンピューター上の Docker デスクトップで Linux と Windows の両方のコンテナーを実行できます。

2. Resources >　WSL INTEGRETION　で
Ubuntu-20.04を「ON」すること
![2021-06-13_1623588866.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103572/85fe20ad-9ed7-c4a6-e3fb-a907829acf8a.png)

このDockerの設定で、WSL2上で動作しているLinux（ここではUbuntu-20.04）と連携できるようになる。

# Conclusion

今（2021年6月時点）は、WSL2上でDockerを使ってLinuxとWindowsの両方のコンテナーを実行できるんだね。
という、いまさらながら理解した、という話。

しょうもない記事だが、とりあえず、私みたいに勘違いしているかもしれない人のために記録を残しておく。👍
Reactで個人的にわかりにくかったところ

入社時の研修でReactを使用し、モチベーション診断アプリの開発をしました。

チームで開発を行っていたので、チームメンバーに聞きながらアプリを作っていましたが
実際のところ、自分で理解しながらコーディングしたというよりは
チームメンバーに『こう書くといいよ』という感じで答えをもらって、コーディングした感じでした。


そこで、今回は個人的にわかりにくかったReactの基礎的な部分と、
最初に知りたかったデベロッパーツールについて書いていきます。

## 目次
1.Component
2.Props
3.State



### Component
Componentとは。
ざっくりいうと、再利用可能な部品です。

具体的には、ボタンなどがあげられます。

Javaではメソッドを使い処理をし、そのメソッドを複数の場所から呼び出す。
ということがあったかと思います。

一度、作ってしまえばあとはその部品を他の部分でもあてはめるだけで使えます。
なので、コードの記述量が減ったり、フロントエンドの開発が楽になったりします。


Componentの種類について。
ClassComponentとFunctionl Componentがあります。
こちらについては割愛します。時間があれば追記します。

Componentの理解ができて、Props、Stateの理解ができるようになるので
先に抑えることをお勧めします。


### Props
Propsとは。親コンポーネントから子コンポーネントへ値を渡すための仕組み。
値の受け渡しは親から子への１方向のみで、子から親に値を渡すことはできません。
また、子コンポーネントでのデータの書き換えはできません。

何のことか、よくわからないと思いますが
ボタンを複数のページで使用したいとき、
完全に同じものしか作れない時、全部のページでボタンのテキストを【送信】だけにするか
もしくは、違うテキストを作りたい場合、複数のボタンのコードを書くかしかありません。

ただ、親コンポーネントでボタンを作成し、子コンポーネントに値を渡すReactの仕組みを使えば
ボタンのコード、値だけ引継ぎ、【送信】以外にも【編集】などが作れるようになります。

### State
Stateとは。
多分これがややこしい。Stateは親コンポーネントで定義したもの、子コンポーネントで定義したもの、お互いに独立しています。
コンポーネント単位で状態を保持する仕組み
oTreeの導入及びIATの設定

# oTreeの導入及びIATの設定
```
git clone https://github.com/WZBSocialScienceCenter/otree_iat.git
```

PythonのVersionを確認

```
python -V
```
残念ながら、うちのサーバーはPython 2.7.5なので、新Versionが必要。

```
yum install -y centos-release-scl
yum install -y rh-python38 which
scl enable rh-python38 bash
```
参考(https://qiita.com/witchcraze/items/592483c7625e881d771f)

```
cd otree_iat
pip install -r requirements.txt
```
インストルー成功しましたら、テストをします。

```
 otree test iat
```
今度SQLiteのVersionが怒られました。

```
 wget https://www.sqlite.org/2021/sqlite-autoconf-3350500.tar.gz
 tar xvfz sqlite-autoconf-3310100.tar.gz
 cd sqlite-autoconf-3350500/
 ./configure --prefix=/usr/local
 make
 sudo make install
 sudo find /usr/ -name sqlite3
 cd
 rm sqlite-autoconf-3350500.tar.gz
 rm sqlite-autoconf-3350500 -Rf
 /usr/local/bin/sqlite3 --version
 /usr/bin/sqlite3 --version
 sqlite3 --version
 sudo mv /usr/bin/sqlite3 /usr/bin/sqlite3_old
 sudo ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3
# 共有ライブラリへパスを通す
# vi ~/.bashrcで設定を追加(すぐに反映する場合 source ~/.bashrc)しないとターミナルを起動するたびに実行することになります
export LD_LIBRARY_PATH="/usr/local/lib"

# PythonのSQLite3バージョン確認

python

Python 3.8.6 (default, Oct 27 2020, 09:13:12)
[GCC 9.3.1 20200408 (Red Hat 9.3.1-2)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> sqlite3.sqlite_version
'3.35.5'
>>>quit()

```
参考(https://qiita.com/rururu_kenken/items/8202b30b50e3bfa75821)

再度テスト

```
cd otree_iat/
otree test iat
(結果一部省略)
INFO /p/ejhatoyx/iat/Outro/21/
INFO /p/wna2nie1/iat/Outro/21/
INFO /p/kuouuuvd/iat/Outro/21/
INFO /p/oqb0mz9u/iat/Outro/21/
INFO Bots completed session
INFO Tip: Run this command with the --export flag to save the data generated by bots.
Destroying test database for alias 'default'...
```
でOKみたいです。

```
export OTREE_AUTH_LEVEL=STUDY
export OTREE_ADMIN_PASSWORD=hogehoge
export OTREE_PRODUCTION=1
otree resetdb
otree prodserver 8000
```
S3で静的Webホスティングしてみた

##　はじめに
Codeシリーズを勉強しようとAWSのハンズオンで実際に手を動かしていたところS3の静的Webホスティングの設定があったのでアウトプットの一環として投稿します。
ただ今回は過程で設定したのみなので、CloudFrontやRoute53などの設定はしておりません

##　AWS S3とは
　　・安価で耐久性の高いAWSのクラウドストレージサービス
　　・ユーザーがデータを容量制限なく保存可能なマネージド型で提供されるオブジェクト型ストレージ

##　S3の特徴
　　・0.023USD/GB・月と、安価。１GBで約3円/月
　　・99.99999999％の高い耐久性
　　・容量無制限。1ファイル最大5TBまで
　　・バケットやオブジェクトに対してアクセス制限を設定できる

##　静的Webホスティングとは
　　・静的なWebサイトをホスティング（一般公開）すること。
　　・静的なWebサイトとはHTMLファイルをサーバーにアップロードしておき、リクエストに対してそのままそのファイルをレスポンスるサイトのこと。
　　・阿部 寛さんの[ホームページ](http://abehiroshi.la.coocan.jp/)とか

##　手順

AWSマネジメントコンソールからS3に移動しバケットを作成します
![バケット作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993659/1a10b728-c0d1-a5f8-ce90-899b27797a73.png)

次にバケット名を付けていくのだが、このバケット名は世界で唯一である必要があるため作成日付や自分の名前などで作成していく。

![バゲット名](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993659/9413af16-049a-f6fc-e225-c1c0cc030fce.png)

ブロックパブリックアクセスのバケット設定でブロックアクセスをすべてブロックのチェックを外す。
チェックを外すことで下の方に注意喚起がでてくるのだが、パブリックにすることで静的Webホスティングを使いたいためにしたということを確認するためにチェックをいれバケットを作成をクリックする。

なお今回はバージョニング機能と暗号化については無効でいきます。

![スクリーンショット 2021-06-14 104731.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993659/922fc9b7-f278-3042-4cb0-d98f56fa589c.png)

次にファイルをアップロードした時にS3のバケットがWebサイトとしてホスティングしていくようにしたいので、まず静的Webホスティングの設定をしていきます。

作成したバケットをクリックしタグのプロパティを開き下にスクロールすると静的Webホスティングの編集できるところがあるので開きます。
静的Webホスティングを有効にチェックし、用意したドキュメントをインデックスドキュメントの欄に書き保存する

![スクリーンショット 2021-06-14 110415.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993659/c57adac5-a4b3-05e7-e286-00033493d3c5.png)

次にタグのアクセス許可をクリックしその中にあるバケットポリシーに下のポリシーを記入する。

```
{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Sid": "PublicReadGetObject",
          "Effect": "Allow",
          "Principal": "*",
          "Action": [
              "s3:GetObject"
          ],
          "Resource": [
              "arn:aws:s3:::xxxxxxxxx/*"
          ]
      }
  ]
}
```
"arn:aws:s3:::xxxxxxxxx/*"のxxxxxxxxxには各自作成したバケット名を記入に保存する。
次にファイルのアップロードをしていきます。

オブジェクトタグにあるアップロードを押しファイルを追加します。
![スクリーンショット 2021-06-14 111751.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993659/05e66fb5-9f28-c5dd-d426-42b79238fe5b.png)

![スクリーンショット 2021-06-14 111850.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993659/0044a6d1-9ca2-8c12-4e8c-b214cf12bcdb.png)

最後にホスティングされていることを確認するために先ほど設定したプロパティタグの静的Webホスティングの設定まで移動するとエンドポイントがありますので、そちらをクリックすると・・・！

##　おわりに

今回初めてQiitaに投稿するので不慣れな点が多々あると思います。
まだまだこれからもAWSについてアウトプットしていこうと思いますのでよろしくお願いします！！！

(｡･ω･)ﾉﾞバイバイ
Rubyのインスタンスメソッドとクラスメソッドを整理した。

##インスタンスメソッドとは
クラス内で定義されたメソッドのこと。

```ruby:user.rb
class User < ApplicationRecord
 #Userクラス内で定義されているインスタンスメソッド
 def first_user
  puts '鈴木一郎'
 end
end
```

##インスタンスメソッドの使い方
インスタンスメソッドは、クラスのオブジェクトから呼び出すことができる。

```ruby:user.rb
class User < ApplicationRecord
 #Userクラス内で定義されているインスタンスメソッド
 def first_user
  puts '鈴木一郎'
 end
end

user = User.new
user.first_user
```
##クラスメソッドとは
クラスに対して実行するメソッドのこと。

```ruby:user.rb
class User < ApplicationRecord
 #Userクラス内で定義されているインスタンスメソッド
 def first_user
  puts '鈴木一郎'
 end
end

user = User.new#<=Userクラスにnewメソッドを実行している。
user.first_user
```

##クラスメソッドの使い方

```ruby:user.rb
class User < ApplicationRecord
 #Userクラス内で定義されているインスタンスメソッド
 def first_user
  puts '鈴木一郎'
 end
#メソッドの前にselfをつけて定義する
 def self.second_user
  puts '田中太郎'
 end
end

#呼び出すときはクラス名に対して呼び出す
User.second_user#=>田中太郎
```

メソッドの中の処理だけを使いたい場合によく使われる。
✳︎インスタンスメソッドは、あるオブジェクトに対する処理として実行します。

##重要
クラス内で定義されたメソッドは、**クラスから作成されたオブジェクトしか呼び出せません。**

```ruby:user.rb
class User < ApplicationRecord
 #Userクラス内で定義されているインスタンスメソッド
 def first_user
  puts '鈴木一郎'
 end

user = User.new
user.first_user#<=空のインスタンスが代入された変数(userオブジェクト)に対してインスタンスメソッドを呼び出している。
```

クラスメソッドはオブジェクトを指定しないで呼び出すので、インスタンスメソッドとは別なのです。

簡単にまとめたので、説明不足な点があると思います。
詳しくはご自身でリファレンスなどを読みあさってみてください。
git fetchとgit pullの違い

##はじめに
この記事はGitの扱いに慣れていない方に向けた記事です。
そして私の備忘録にもなっておりますのでどうぞ温かい目で。。。
##この記事を書くに至った経緯
現在の会社に新卒として入社して二ヶ月半。研修も終えようやく案件にアサインされました。
「いざ！」と意気込む私でしたがgitがやはり難しい！！！！！！！！！
エンジニアとしてまず最初に行き詰まるポイントはやはりgitやgithubの操作ではないでしょうか。
学生時代にこの辺りを疎かにしていたことのツケがここで回ってきたとでも言いましょうか、flutter以前にここで苦しむとは。。。
僕と同じ状況の方々に向けて、そしてこれから学習する方々に向けてgithubの初歩的なところ、今回は「git fetchとgit pullの違い」に関してまとめてみましたのでどうぞご覧ください！

##$git fetchコマンドとは
このコマンドはリモートリポジトリの情報をローカルリポジトリへコピーするコマンドです。
その後$git mergeコマンドを打つことにより手元のワークツリーに反映されます。

##git pullコマンドとは
このコマンドはリモートリポジトリの情報をそのままローカルのワークツリーへと反映させます。

##この二つの違いとは？
お恥ずかしい話、「git pull」コマンドばかりを使用していた為「git fetch」コマンドを最近まで知りませんでした。。。
簡単にまとめると「git pull」 = 「git fetch」 + 「git merge」といったところでしょうか。
一度に手元のワークツリーに反映させるのか、一度ローカルリポジトリに反映させてワークツリーに反映させるかの違いですね！

##どちらを使うべき？
正直どちらでもいいとは思いますが、個人的には「git pull」の方がややリスキーかと思われます。
例えばローカルでdevelopブランチにいる時に「git pull origin master」を実行するとローカルのdevelopブランチにorigin(リモート名)のmasterブランチが統合されてしまいます。
慣れてしまえばなんてことないでしょうが、慣れてなかったら「git pull」の使用は控えた方がいいかもしれません。

##終わりに
１からgithubの復習を行なっていますが、忘れていたことや知らなかったことなどが多くあり中々大変な目にあっています。。。しかしここを乗り越えないとチーム開発は円滑に進まず、チームにも迷惑をかけると思うので歯を食いしばって頑張っていこうと思います。
ご閲覧いただきありがとうございました！！
Vue.js(Nuxt.js)でCSS カスタムプロパティを使う方法

Vue.js(Nuxt.js)でCSS カスタムプロパティを使う方法になります。

## Vue.js(Nuxt.js)でCSS カスタムプロパティを使う

```vue
<template>
  <div class="demo">
    <div class="demo__text" :style="style">text</div>
  </div>
</template>

<script lang="ts">
import Vue from 'vue'
export default Vue.extend({
  computed: {
    style() {
      return {
        '--color': 'red'
      }
    }
  }
})
</script>
<style lang="scss" scoped>
.demo {
  &__text {
    color: var(--color);
  }
}
</style>

```

computedを使って、カスタムプロパティに値をセットすることで使うことが可能です。

```vue
<script lang="ts">
import Vue from 'vue'
export default Vue.extend({
  data() {
    return {
      color: 'blue'
      bgColor: 'white'
    }
  },
  computed: {
    style() {
      return {
        '--color': this.color,
        '--bg-color': this.bgColor
      }
    }
  }
})
</script>
```

dataの値を参照することもできます。

## js(vue)で取得した値をカスタムプロパティに送る方法

```vue
<template>
  <div class="demo">
    <div ref="text" class="demo__text" :style="style">text</div>
  </div>
</template>

<script lang="ts">
import Vue from 'vue'
export default Vue.extend({
  data() {
    return {
      style: {}
    }
  },
  mounted() {
    this.setStyle()
  },
  methods: {
    setStyle() {
      const text = this.$refs.text
      this.style = {
        '--width': text.clientWidth + 'px'
      }
    }
  }
})
</script>
<style lang="scss" scoped>
.demo {
  &__text {
    width: var(--width);
  }
}
</style>

```
上記のコードでは、`clientWidth`で横幅を取得して、その横幅の値をカスタムプロパティにセットしています。
アニメーションの実装時などに使えるかと思います。
Cloudflare でカスタムネームサーバーを設定する



# カスタムネームサーバーとは

Cloudflare を DNS として使用する場合には、ドメインごとにネームサーバーとして `xxx.ns.cloudflare.com` がアサインされます。
カスタムネームサーバーの機能を使えば、このまま使いたくないという場合に独自ドメインを設定したネームサーバーを用意できます。

![image-20210614102359569](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20210614102359569.png)

```shell
% dig khayama.ml NS +short
sharon.ns.cloudflare.com.
trey.ns.cloudflare.com.
```


# カスタムネームサーバー設定

具体的な設定は以下のように進められますが、プラン要件があります。

>[Setting up Custom Nameservers at Cloudflare – Cloudflare Help Center](https://support.cloudflare.com/hc/en-us/articles/200169006-Setting-up-Custom-Nameservers-at-Cloudflare)
>Cloudflare domains on Business or Enterprise plans can set **Custom Nameservers** at Cloudflare.

![image-20210614103343639](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20210614103343639.png)

![image-20210614103358803](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20210614103358803.png)

2〜5 つのネームサーバーを指定できます。

![image-20210614103440942](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20210614103440942.png)

それぞれの FQDN に対して IP アドレスが払い出されます。

![image-20210614103131000](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20210614103131000.png)

# Registrar (Freenom) での設定

最後にドメインレジストラ（今回は Freenom）にて [グルーレコード（glue records）](https://jprs.jp/glossary/index.php?ID=0185)の設定を行います。
（レジストラによっては、IPv4 / IPv6 の両方を登録できます）

![image-20210614103725995](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20210614103725995.png)

![image-20210614103757808](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20210614103757808.png)

# 変更の確認

以下のコマンドで設定が反映されたことを確認できます。

```shell
% dig khayama.ml NS +short
ns1.khayama.ml.
ns2.khayama.ml.
ns3.khayama.ml.
ns4.khayama.ml.
ns5.khayama.ml.
```

# 参考
- [How to Configure Custom DNS Nameservers with Cloudflare •](https://guides.wp-bullet.com/configure-custom-dns-nameservers-cloudflare/)
All About ACS: ACS 1.1.8.7 で LAN コンソールが MSGSSL002 で接続できない

# ACS 1.1.8.7 で LAN コンソールが MSGSSL002 で接続できない
ACS 1.1.8.7 では鍵管理ユーティリティに証明書が登録されていないため、LAN コンソールが MSGSSL002 で接続できないことがあります。

発生するのは、ACS 1.1.8.7 で新規にLAN コンソール接続をしようとした場合です。
以前のバージョンで該当システムに LAN コンソール接続をしていた場合は、証明書が維持されるため ACS 1.1.8.7 に更新しても問題は発生しません。

## 回避方法

下記の手順で証明書をダウンローとしてください。
「xx」の部分は、Java のビット数に対応した 32 か 64 を指定します。 

```
acslaunch_win-xx.exe /PLUGIN=ping /SYSTEM=<Console IP> /PORTS=.CONSOLE /SSL=1 /ACCEPTALLCERTS=1
```

## 修正は 2022 年 8 月を予定
この障害は次のバージョンで修正予定です。
次のバージョンは 2022 年 8 月に利用可能になる予定です。

## 詳細情報
詳細は下記をご覧ください。

* [MSGSSL002 on new LAN Console session for ACS 1.1.8.7 only](https://www.ibm.com/support/pages/msgssl002-new-lan-console-session-acs-1187-only)

## 2021-09-17 追記．修正が含まれる 1.1.8.8 が利用可能になりました

*  [IBM i Access Client Solutions 1.1.8.8 利用可能](https://qiita.com/6onoda/items/fca9541cc6eca283f6ed)
***
2021-06-14 作成
2021-09-17 1.1.8.8 利用可能を追記
***
「All About ACS」では IBM i に対する新しいクライアント「IBM i Access Client Solutions」の情報をいろいろ提供していきます。
[記事一覧はこちら](http://qiita.com/6onoda/items/2dc925586d8d3b8644f2)で確認いたけます。

許可の無い転載を禁じます。
この記事は筆者の個人的な責任で無保証で提供しています。
当記事に関してIBMやビジネスパートナーに問い合わせることは、固くお断りします。
***
Ubuntu Windows Dualboot パーティション管理

### EFIパーティションを削除する
diskpart使用
https://www.partitionwizard.jp/partitionmanager/delete-efi-partition.html
### DualBootからUbuntuを削除
bcdeditとdiskpartを使用
https://twinturbo-power.com/2022/07/%E3%80%90windows-11-ubuntu%E3%80%91%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%96%E3%83%BC%E3%83%88%E8%A8%AD%E5%AE%9A%E3%81%AE%E5%89%8A%E9%99%A4.html
### MinisforumでUbuntu
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash iommu=soft usbcore.autosuspend=-1"
https://qiita.com/ousagi_sama/items/c07fb0a2fb833c705570
https://blog.goo.ne.jp/cinemaesprit/e/ad02392a04d6e4d08d32290942736f54
【FCM】AndroidのChannel管理の際にハマった話


## 概要

実装したかったことはAndroidアプリ開発にてPush通知を受け取る際にChannelを作成し、管理をすることです。サーバーからFCM経由でクライアントに送信する。FCMについての知識がなかったことが原因でハマったことについて書きます。

## ハマったこと

ハマったことは以下の2点です。

- ChannelIDを振り分けているはずなのに上手く通知されない
- BackgroundのときPush通知が届かない

## 簡単に...

### FCMとは？

FCM(FirebaseCloudMessaging）はFirebaseで提供されているメッセージを送ることができるサービスである。できることは以下の通り。

- 通知メッセージ・データメッセージの送信
- メッセージ配信する際のターゲット設定
- クライアントアプリからのメッセージ送信

### Channelとは？

Android8.0から通知は全てChannelに割り当てることが必要になった。Channelのおかげでより細かく通知の受け取りON/OFFを指定できる。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304276/be883447-1d76-abc9-b0b8-d99d3c93f450.png width=700/>

[通知チャネルを作成して管理する | Android Developers](https://developer.android.com/training/notify-user/channels?hl=ja)

## データメッセージと通知メッセージ

今回ハマったことを解決するためには「データメッセージ」と「通知メッセージ」を理解する必要があった。

### 通知メッセージ

Backgroundで通知を受け取りたいときは通知メッセージを使う。アプリの実装を介さずにFCM SDKで自動処理し、通知トレイに届き、デバイスにメッセージを表示する。Foreground時はコールバック関数で処理をする。

### データメッセージ

Foreground時にアプリ内で処理できるもの。コールバック関数にてデータペイロードを受信する。

### メッセージを受信した時の処理

- Backgroundの場合
    - 通知トレイにて通知ペイロードのみを受け取り、Foregroundに入った時にデータペイロードを処理する
- Foregroundの場合
    - どちらも受信し処理する

[FCM メッセージについて | Firebase](https://firebase.google.com/docs/cloud-messaging/concept-options?hl=ja)

## 結論

### 通知が予期したChannelに割り振られない

サーバからFCMにデータを送る際に、 `ChannelId`も一緒に指定する。

うまくいかなかった原因としてはクライアントでChannelを作成しただけだった。Foregroundの時にはデータ通知としてアプリ内ロジックを通るため、指定されたChannelに割り振られるが、Backgroundの際はアプリ内ロジックを通らないため、サーバからFCMに送る時点で `ChannelId`を指定する必要がある。

### Backgroundのときそもそも通知が届かない

上記の通り通知メッセージを使わないと通知が届かないので注意が必要である。

## Chips

### 「その他」や "Miscellaneous"というChannelが勝手に生成されている

自分で設定した覚えのない「その他」（英語だと"Miscellaneous"）というChannelがあり、全ての通知がそこに割り振られていた。独自で追加したChannelのOn/Offを切り替えても意味のない状態。

　登録されているChannelを取得できるメソッドがあるので調査をしたら、以下のログが撮れた。

```
~~~省略~~~
D/mydebug: getChannels[1]: 
NotificationChannel{
 mId='fcm_fallback_notification_channel', 
 mName=Miscellaneous, 
 mDescription=, 
 mImportance=2, 
 //　省略
}
~~~省略~~~
```

 mIdが `'fcm_fallback_notification_channel'`となっていることより、何らかが原因でFCM側で生成されているものだと発覚した。

もし予期せぬ `ChannelId`がクライアントに送られてきた場合に「その他」ではなく自分で生成した「全般」や「その他」といったChannelに割り振りたい場合はAndroidManifest.xmlに以下のように `meta-data`を追加して自分で `ChannelId`を指定する。

```xml
<meta-data
    android:name="com.google.firebase.messaging.default_notification_channel_id"
    android:value="@string/default_notification_channel_id" />
```

valueは `@string/default_notification_channel` というKeyにしてあげないと動かなかった。自由に命名したら動かなかったのでメモです。不安なのでもし動いたら教えてください。

## まとめ

Foreground / Backgroundで処理の内容を変えたりするには、上手く通知メッセージ / データメッセージを理解する必要がある。少々複雑と感じるかもしれないが、ドキュメントも分かりやすいので、丁寧に理解して実装すれば非常に便利ですね。
【WWDC21】Recap Discoverable design

WWDC 2021のセッションの一つに[Discoverable design](https://developer.apple.com/videos/play/wwdc2021/10126/) というものがあります。
アプリのUIを考える上で参考になるセッションで、TIPSが体系的にまとめられています。

本記事ではその要約版をスライドでまとめたのでご紹介します。

## Recap Discoverable design

セッション全体の流れは次のようになっています。

![Discoverable_design.002.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138735/b2f28e84-cf72-19e9-0204-ec3a93d03fca.jpeg)

5つのポイントが紹介され、それが「Toasty」というアプリを用いて具体的に紹介されていきます。

1つ目は「機能に順位をつける」という話です。
![Discoverable_design.003.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138735/88b15376-6b80-8b8b-f7a6-726a91dd97c1.jpeg)

2つ目は「視覚的な手がかりを与える」という話です。
![Discoverable_design.004.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138735/918f9931-d458-e1c4-d717-aeda9d94ca33.jpeg)

3つ目は「ジェスチャーによるスムーズな操作」するという話です。
![Discoverable_design.005.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138735/b5dd29d0-8502-c452-a886-5ffc6f2958dd.jpeg)

4つ目は「行動に合わせてコンテンツ整理」するという話です。
![Discoverable_design.006.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138735/1ca0568f-0d1b-77d4-000a-e196a8e253f5.jpeg)

5つ目は「コントロール感の伝達」という話です。
![Discoverable_design.007.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138735/b0417df1-2678-1503-4f82-22a4edd37b95.jpeg)

以上がセッションの内容まとめです。

## 「iOS Design Themes」　との関連性

セッションの冒頭で

> These concepts may seem basic. In a way, they are. They are so fundamental, we take them for granted. But there are nuances here that might not be obvious and are worth unpacking because your app doesn't get a second chance at a first impression. 

と言われているように、5つのコンセプト自体は共感できるものであり特に真新しさはありません。しかしそれを具体的なアプリを用いて説明することで応用のイメージがつく素敵なセッションでした。

また、この5つのコンセプトは[Themes - iOS - Human Interface Guidelines - Apple Developer](https://developer.apple.com/design/human-interface-guidelines/ios/overview/themes/)と次のような繋がりがあると思います。

![Discoverable_design.008.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138735/7e7c2e11-5b4e-119d-3e5b-b9acf5e0f8fa.jpeg)

セッション内ではこのような関係は言及されていませんが、今回のセッションはデザイン原則をより具体化したものだったと思います。

気になった方はぜひ本動画を視聴してみてください。
oracle sqlloder expression

```
前提：
例
sqlloaderで投入のcsvファイル下記とおり
A,B,C

DBに登録ほしいのは
A,B,c,A（全角）

では、
A（全角）はどうやって実現しますか

実現方法：
CTLファイルに下記を追加する
　 A,
   B,
   C,
   A_ZENKAKU EXPRESSION "TO_MULTI_BYTE(:A)"

```
選択可能なテキストを作成する

# SelectableTextを使う
公式サイト

https://api.flutter.dev/flutter/material/SelectableText-class.html

## 使い方
テキストの表示は基本的にTextウィジェットと同じように使える。
これでテキスト選択もできる。
選択して出るツールバーが英語表記しか出ない。

```
SelectableText(
    'サンプルテキスト。サンプルテキスト。サンプルテキスト。サンプルテキスト。サンプルテキストサンプルテキスト',
    style: TextStyle(color: Colors.red)
)
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448450/3f98123d-f358-419f-9ae0-4ed05aedb453.jpeg" width=25%>

## 注意１：オーバーフローはない
Textウィジェットと違いoverflowプロパティがないのでテキストが溢れても、省略はできない。
代わりにスクロール可能になり全てのテキストを見ることができる。

## 所感
アプリだとテキスト選択したい場面が少ないのだろうか。だとしてもここまで浸透していないのも不思議だと思いました。
使い所を見定めて使用していきたい。
macOSで亜種キーボード配列を使いながら日本語を打つために。

## 背景
タイピングなどをしていて、Qwertyでは指が疲れてきたので、Colemakを使い始めた(2021年2月)
この頃はLinuxしか使っていなかったため、日本語を打つ時も特に問題なく使えていた。
最近M1のMacbook Airを購入した。
日本語打つのがQwertyでしかできなかった。-> 日本語打つ時はキーボードを見ながら打っていた。-> 作業効率が転落。

macOSでColemakを使用して日本語を打つ手法がどう頑張っても見つからなかった
(まぁ、macOS使う日本人でQwerty以外のキーボード配列を使っている人間なんて、探してもそう見つかるものではないから仕方ない。)

## 対象読者
以下の全てに当てはまる人。
1. macOSを何らかの理由で使っている人
2. macOSを使うときに何らかの理由で日本語を打ちたい人。
3. Qwertyを使っていない人。(ColemakなりDvorakなりWorkmanなり)

# というわけで、キーボード亜種配列で日本語を打つために

使用ソフト: [Karabiner-Elements](https://karabiner-elements.pqrs.org/)

純粋なキーコードを別の文字にマッピングするイメージ。
そうすれば、日本語も特に問題なく打てる。

## 設定方法

Karabiner-Elementsを開いて、
`Simple modifications`->`Add item`-> `From key`と`To key`を設定。
![Karabiner-Elements_Preferences_and_Change_a_key_to_another_key___Karabiner-Elements.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262637/fa1210b8-3298-2009-2379-6cd76a7622ce.png)
雑に設定するとこんな感じ。
ただ、まだ問題点はあって、例えば`Shift + ;`で`+`になっちゃったり。
'とか"はそれぞれまだ`Shift+7`と`Shift+2`だったり。
正直この辺をしっかり自分仕様に変えられたら。完全体になるんでしょうね。

今回はColemakを用いて日本語を打つというのが目的だったので一旦ここで終了します。
問題点を解決していったらまた追記していく予定です。

## もっと楽な方法ありました。

![Karabiner-Elements_Preferences_and_「macOSでキーボード亜種を使いながら日本語を打つために。」を編集_-_Qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262637/4ddb753f-544a-d74d-6ba5-01f64b08751a.png)
1. `Complex Modifications`タブを開く。
1. `+ Add rule`をクリック


![Karabiner-Elements_Preferences.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262637/f4d26606-bcd6-e9ce-a47c-5a5f1cd24db3.png)

3. `Import more rules from the Internet`をクリック。ブラウザが開きます。

![karabiner-elements-complex_modifications.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262637/c3c8b5ca-3dc0-6bba-65eb-33b1ecf5719a.png)

4. 検索窓でColemakと検索。(Dvorakの方はDvorakと検索してください。)
5. `Import`

![Karabiner-Elements_Preferences2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262637/6b2cf5cc-ccd0-5e98-7967-85c1e023a788.png)

6. KarabinerElementsに戻ったら、新しいルールが追加されていると思うので、`+ Enable`をクリック。

こっちの方が楽にマッピングをしてくれるかと思います。細かい融通を利かせたければ、`~/.config/karabiner/assets/complex_modifications/`内にこのconfigファイルがあると思うのでそちらをちょいといじっていただければ大丈夫です。

Karabiner Elementsに関しては、[こちら](https://qiita.com/s-show/items/a1fd228b04801477729c)に良記事があるのでこちらを参考にしてください。
Add a gmail to another gmail

**1, Turn on the "Less secure app access".**

*Or you will get "[AUTH] Username and password not accepted." error.*

**2, Enable the "DisplayUnlockCaptcha".**

*Or you will get "[AUTH] Web login required: https://support.google.com/mail/answer/78754" error.*

**3, Use the full mail address to fill username.**

*Like "yourusername@gmail.com", not "yourusername", or you will fail to login.*

**4, Notice the setting above is actually set to you correct account.**

*I logged in multiple gmail, when I change the settings above, it's always use the default account.*
【Ruby】リファクタリングに挑戦してみよう！

最近現役のエンジニアの方々にコードレビューをしていただく機会がありました。
大変参考になりましたので、シェアしたいと思います。

# 演習

`sales.csvを読み込んで出力結果通りに出力するプログラムを書く。`
いきなりですが以下のRubyのコードにはいくつかの改善点があります。
改善点を指摘して、リファクタリングしてみましょう！

```rb:
# Time.parseメソッドを使うためにtimeクラスを読み込む
require "time"
# csvを扱うライブラリを読み込む
require 'csv'

class User
  attr_reader :name, :birthday
  def initialize(name, birthday)
    @name = name
    @birthday = birthday
  end
end

class Product
  attr_reader :name, :quantity, :price
  def initialize(name, quantity, price)
    @name = name
    @quantity = quantity
    @price = price
  end
end

# CSVファイルを1行ずつ取り出す
CSV.foreach("sales.csv", headers: true) do |row|
  user = User.new(row[0], row[1])
  now_date = Time.now
  # 文字列から時刻オブジェクトに変換する
  birthday = Time.parse(user.birthday)
  # 秒を分、時間、日数、年数に直す
  age = sprintf("%d",((now_date - birthday) / 60 / 60 / 24)/365)
  product = Product.new(row[2], row[3], row[4])

  puts "#{user.name}(#{age})は#{product.name}を#{ product.quantity.to_i * product.price.to_i}円お買い上げ。"
end
```

```csv:sales.csv
名前,誕生日,買上品目,数量,単価
つんく♂,1968/10/29,チロルチョコ,13,10
はたけ,1968/8/17,雪見だいふく,3,100
まこと,1968/12/31,チョコモナカ,3,140
たいせい,1969/11/29,フルーツコッペ,4,300
```

```:
# 出力結果
つんく♂(52)はチロルチョコを130円お買い上げ。
はたけ(52)は雪見だいふくを300円お買い上げ。
まこと(52)はチョコモナカを420円お買い上げ。
たいせい(51)はフルーツコッペを1200円お買い上げ。
```

******************************
***以下解答***
******************************

# 解答


- 改善点
    - 変数名が適切ではない(Time型に〜dateという変数名は不適切)→適切な変数名に修正する
        - そもそも今回の場合は変数を定義すること自体必要ないので削除
    - 引数row[添字]が何を表しているのか分かりづらい→キーワード引数を使う、csvファイルのヘッダーを添字に使う
    - 年齢計算処理が複雑かつ唐突に出てきている→メソッドに切り出す
    - 合計金額計算処理が少しわかりづらい→メソッドに切り出す
    - row[3]とrow[4]の型変換を最後にしている(日時を文字列のまま引きずり回している)→オブジェクト生成時に型変換しておく



```rb:
require "time"
require 'date'
require 'csv'

class User
  attr_reader :name, :birthday: 

  def initialize(name:, birthday:)
    @name = name
    @birthday = birthday
  end

  def age
    ((Date.today - @birthday) / 365).to_i
  end
end

class Product
  attr_reader :name, :quantity, :price

  def initialize(name:, quantity:, price:)
    @name = name
    @quantity = quantity
    @price = price
  end

  def sum
    @quantity * @price
  end
end

CSV.foreach("sales.csv", headers: true) do |row|
  user = User.new(name: row['名前'], birthday: Date.parse(row['誕生日']))
  product = Product.new(name: row['買上品目'], quantity: row['数量'].to_i, price: row['単価'].to_i)

  puts "#{user.name}(#{user.age})は#{product.name}を#{product.sum}円お買い上げ。"
end
```

これまであまり機会がなかったのですが、コードレビューをしていただくことの重要性を実感しました。
今までいかに読みやすいコードを書くことを考えられていなかったか...
他にも良い書き方があれば教えてください！
nohupとniceを同時に使う

# nohup, nice の併用

nohup でジョブを投げつつ、優先度を指定したい場合は、例えば下記のようにする。

```shell
$ nohup nice -n 19 python test.py > R_out.log 2> R_err.log < /dev/null &
```

なお、 ```nice -n [N]``` におけるNice ```[N]``` は数字が小さいほど優先度が高い。
「-20から20」の範囲で選べる。「19」は優先度がかなり低い。


# 実際の運用

- 88CPUのマシン
- 50個がすでに他のジョブで占有されている（Nice = 0）
- さらに50個を別のジョブとして投げる（Nice = 19）

というのをやって見たところ、

- 50 CPU ... 100% (Nice = 0)
- 26 CPU ... 100% (Nice = 19)
- 24 CPU ...  50% (Nice = 19)

となり、合計すると大体 8,800% [つまり88個のCPU = 50+26+(24/2)]となった。

```shell
$ top
top - 09:16:30 up 15:02,  1 user,  load average: 100.06, 100.05, 100.00
Tasks: 993 total, 101 running, 490 sleeping,   0 stopped,   0 zombie
%Cpu(s): 56.8 us,  0.0 sy, 43.1 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 19664990+total, 18852203+free,  4820816 used,  3307060 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used. 19037852+avail Mem 
                      
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                         
16376 user_01   20   0  374584  95984  12600 R 100.0  0.0 111:32.88 python 
16393 user_01   20   0  374584  96256  12820 R 100.0  0.0 111:33.50 python 
...(中略)
16548 user_01   39  19  417500 137744  18928 R  99.7  0.1  52:56.54 python 
16550 user_01   39  19  374588  95656  12296 R  99.7  0.0  95:02.91 python 
...(中略)
16564 user_01   39  19  419628 140060  18928 R  52.1  0.1  80:16.57 python 
16554 user_01   39  19  417512 138016  18932 R  50.2  0.1  75:49.32 python 
```

よくみると、PR(Priority優先度)はデフォルトで20で、PR = 20 + NI(Nice) となっている。
ファイル名の先頭に作成日付を付けて管理しやすくしよう！

こんにちは。オンライン授業により大量のPDFファイルがPCにたまっています。
ぱっと見てファイルの時系列が分かると便利なのですが, いちいち自分で入力していくのは面倒くさいので自動化してみましょう。
## 目標とする仕様
"hello.pdf"(2021-06-09作成)のようなファイルがあった場合, "0609_hello.pdf"とリネームします。
ただし, "0604_hoge.pdf"(2021-06-09作成)のようなファイルはそのままの名前で残すこととします。
##コード
```python:rename.py 
import glob
import os
import time
import mimetypes
import re 

def rename(files):
    for f in files:
        file_type = mimetypes.guess_type(f)[0]
        if file_type == "application/pdf": #pdfかどうか
            (i,old_name) = os.path.split(f)           
            if not re.match(r"[0-1]\d{3}",old_name): #先頭にすでに日付が入っていたらスキップ。数字4桁でマッチすると2021_hoge.pdfのようなものも許してしまうので先頭ではじきましょう。
                t =  time.localtime(os.path.getctime(f))
                date = str(format(t.tm_mon,'02')) + str(format(t.tm_mday,'02')) #2桁で月日を表現
                new_name = date + "_"+ old_name
                new_path = os.path.join(i,new_name)
                os.rename(f,new_path)       

def collect_files(p,r): #再帰的に
    d = glob.glob(os.path.join(p,"*"))
    for i in d:
        if os.path.isdir(str(i)):
            collect_files(i,r)
        else:
            r.append(i)
    return r

if __name__ == "__main__":
    a = collect_files("./",[])
    rename(a)
```
## 終わりに
コードは見たまんまです。意外と汎用性が高そうですね。
os.path.splitなどパスを扱うライブラリが想像以上にしっかりしていて便利でした。覚えておこう......
より良いコードなどありましたらお教えいただけますと幸いです。
では, この辺で