OmniAICreator/Qiita-1.07M huggingface dataset:
albumentationsのpipインストール時に生じたopencv-python-headless buildエラーの解消法

## albumentationsインストール時のエラー
albumentationsをpip installする際に下記のエラーが発生。

```:error内容
Traceback (most recent call last):
  File "/opt/pyenv/versions/3.9.9/lib/python3.9/site-packages/pip/_vendor/pep517/in_process/_in_process.py", line 349, in <module>
    main()
  File "/opt/pyenv/versions/3.9.9/lib/python3.9/site-packages/pip/_vendor/pep517/in_process/_in_process.py", line 331, in main
    json_out['return_val'] = hook(**hook_input['kwargs'])
  File "/opt/pyenv/versions/3.9.9/lib/python3.9/site-packages/pip/_vendor/pep517/in_process/_in_process.py", line 248, in build_wheel
    return _build_backend().build_wheel(wheel_directory, config_settings,
  File "/tmp/pip-build-env-awj8sday/overlay/lib/python3.9/site-packages/setuptools/build_meta.py", line 244, in build_wheel
    return self._build_with_temp_dir(['bdist_wheel'], '.whl',
  File "/tmp/pip-build-env-awj8sday/overlay/lib/python3.9/site-packages/setuptools/build_meta.py", line 229, in _build_with_temp_dir
    self.run_setup()
  File "/tmp/pip-build-env-awj8sday/overlay/lib/python3.9/site-packages/setuptools/build_meta.py", line 281, in run_setup
    super(_BuildMetaLegacyBackend,
  File "/tmp/pip-build-env-awj8sday/overlay/lib/python3.9/site-packages/setuptools/build_meta.py", line 174, in run_setup
    exec(compile(code, __file__, 'exec'), locals())
  File "setup.py", line 462, in <module>
    main()
  File "setup.py", line 222, in main
    skbuild.setup(
  File "/tmp/pip-build-env-awj8sday/overlay/lib/python3.9/site-packages/skbuild/setuptools_wrap.py", line 676, in setup
    _classify_installed_files(
  File "setup.py", line 402, in _classify_installed_files_override
    return (cls.wraps._classify_installed_files)(
TypeError: _classify_installed_files() got an unexpected keyword argument 'cmake_install_dir'
Building wheel for opencv-python-headless (PEP 517): finished with status 'error'
ERROR: Failed building wheel for opencv-python-headless
Failed to build opencv-python-headless
ERROR: Failed to build one or more wheels
```

## 解決策
```
pip3 install git+https://github.com/opencv/opencv-python
pip install -U albumentations --no-binary qudida,albumentations
```
と依存ライブラリであるopencv-pythonをインストールしたのちに、  
再度albumentationsをこれらの依存パッケージなしでインストールすると解決。
内包表記に入門する【Python】

# やりたいこと
- 内包表記について、以下のことを調べる。
    - どんな書き方をするか
    - どんな種類があるか
    - 応用例

# そもそも「内包表記」(comprehensions)とは
- [公式ドキュメント](https://docs.python.org/ja/3/reference/expressions.html#displays-for-lists-sets-and-dictionaries)より
    - `ループ処理とフィルター処理の組み合わせを用いた計算結果`


# 内包表記の書き方
色々ありますが、どれも基本的には
```py
hoge = [変数を使った式 for 変数 in イテラブルオブジェクト]
```
という文法になります。（↑はリスト内包表記の例なので、囲む記号に`[]`を使用）

# 内包表記の種類

| 種別 | 囲む記号 |  例 | ←で作られたもの | 
| --- | --- | --- | --- | 
| リスト内包表記 | [] | [x for x in range(3)] | [0, 1, 2] |
| 集合内包表記 | {} | {x*2 for x in range(3)} | {0, 2, 4} |
| 辞書内包表記 | {} | {x: x**2 for x in range(3,6)} | {3: 9, 4: 16, 5: 25} |
| ジェネレータ式 | () | (x for x in range(3)) | generator object | 


## リスト内包表記
内包表記を使わない場合
```py
sample_list = []
for x in range(3):
    sample_list.append(x)  # [0, 1, 2]
```
内包表記を使った場合
```py
sample_list = [x for x in range(3)]  # [0, 1, 2]
```

## 集合内包表記
内包表記を使わない場合
```py
sample_set = set()
for x in range(3):
    sample_set.add(x)  # {0, 1, 2}
```
内包表記を使った場合
```py
sample_set = {x for x in range(3)}  # {0, 1, 2}
```


## 辞書内包表記
内包表記を使わない場合
```py
exponentiation_dict = {}
for k in range(5):
    exponentiation_dict['2の{}乗'.format(k)] = 2 ** k
# {'2の0乗': 1, '2の1乗': 2, '2の2乗': 4, '2の3乗': 8, '2の4乗': 16}
```
内包表記を使った場合
```py
exponentiation_dict = {"2の{}乗".format(i): 2 ** i for i in range(5)}
# {'2の0乗': 1, '2の1乗': 2, '2の2乗': 4, '2の3乗': 8, '2の4乗': 16}
```


## ジェネレータ式

内包表記を使わない場合（ジェネレータ関数定義）
```py
def sample_generator_before():
    for x in range(3):
        yield x

g = sample_generator_before()
print(g.__next__())  # 0
print(g.__next__())  # 1
print(g.__next__())  # 2
print(g.__next__())  # StopIteration
```
内包表記を使った場合
```py
g = (x for x in range(3))
print(g.__next__())  # 0
print(g.__next__())  # 1
print(g.__next__())  # 2
print(g.__next__())  # StopIteration
```


# 応用

### ifを使う
リスト内包表記を使わない場合
```py
sample_even_list = []
for x in range(10):
    if x % 2 == 0:
        sample_even_list.append(x)
```
リスト内包表記を使った場合
```py
sample_even_list = [x for x in range(10) if x % 2 == 0]  # [0, 2, 4, 6, 8]
```
### 複数のリストから辞書を作る
リスト内包表記を使わない場合
```py
name_list = ['Tom', 'Mike', 'Emma']
age_list = [5, 7, 3]

sample_dict = {}

for name, age in zip(name_list, age_list):
    sample_dict[name] = age

# {'Tom': 5, 'Mike': 7, 'Emma': 3}
```

リスト内包表記を使った場合
```py
name_list = ['Tom', 'Mike', 'Emma']
age_list = [5, 7, 3]

sample_dict = {name: age for name, age in zip(name_list, age_list)}

# {'Tom': 5, 'Mike': 7, 'Emma': 3}
```


# 参考URL
- [公式ドキュメント　6.2.4. リスト、集合、辞書の表示](https://docs.python.org/ja/3/reference/expressions.html#displays-for-lists-sets-and-dictionaries)
- [ジェネレーター式と内包表記を使ってみよう](https://atmarkit.itmedia.co.jp/ait/articles/1610/14/news035.html)
PHPでオブジェクト指向を使ってブラックジャックを開発してみた

# 概要
[独学エンジニア](https://dokugaku-engineer.com/ "独学エンジニア") さんで課題となっていたブラックジャック作成に取り組みました。
[Git Hub](https://github.com/remioakiaki/Blackjack2 "Blackjack2")にソース公開しております。 


# ルール
```
ブラックジャックはカジノで行われるカードゲームの一種です。
1〜13までの数が書かれたカード52枚を使ってゲームが行われます。
ルールは次の通りです。

・ 実行開始時、ディーラーとプレイヤー全員に２枚ずつカードが配られる。
・ 参加できるプレイヤーは3名（ディーラー含めて合計4名までとする）。
・ 自分のカードの合計値が21に近づくよう、カードを追加するか、追加しないかを決める
・ プレイヤーはカードの合計値が21を超えない限り、好きなだけカードを追加できる
・ ディーラーはカードの合計値が17を超えるまでカードを追加する

各カードの点数は次のように決まっています。
・ 2から9までは、書かれている数の通りの点数
・ 10,J,Q,Kは10点
・ Aは1点あるいは11点として、手の点数が最大となる方で数える

```
# アピールポイント
2人でプレイする場合と3人以上でプレイする場合には勝者の判定の仕方が変わるのでGameMaster.phpとGameMaster.phpを継承したGameMasterOverTwoPlayer.phpを作成することで対応しました。勝者判定のメソッドをオーバーライドしています。


# あわせて行った学習内容
- PHPUnit
- PHP_CodeSniffer
- PHPMD
- PHPStan

# 感想
最初はどこから手をつけていいのかわからず難しかったです。Xdebugでデバッグしながら、プロパティがどのように設定されていくのかわかったくらいから徐々に感覚がつかめてきました。2022年のGWはほぼこれに費やしましたが、まとまった時間で学習を進めることができてよかったです。
[独学エンジニア](https://dokugaku-engineer.com/,"独学エンジニア") さんでは、このブラックジャックの開発以外にも、きれいにコードを書くために必要なことがたくさん学べます。真偽値を返すためにメソッドを書いて、何をしようとしているのかわかりやすくする、ということは今まで意識したことがありませんでした（宣伝を依頼されているわけではございません）。
フレームワークの使い方が学べるプログラミング講座は多いですが、PHPの、しかもオブジェクト指向が学べるプログラミング講座はなかなか少ないのではないでしょうか。おすすめです。
オブジェクト指向を超ザックリ説明してみた( ᐛ )

<h2>はじめに</h2>
備忘以外で投稿するのは初めてなので、お手柔らかに(´・ω・`)<br>
プログラミングを勉強してまず最初に躓くのがオブジェクト指向だと思います。<br>
そこまでは単純にコードを書いてコンソールで動かしてって感じだと思うんですが、
オブジェクト指向から急に<br>
「えっ？はっ？どういう事？？」ってなる人が多いと思います。<br>
かくいう私も「オブジェクト指向の全容を完璧に理解しているのか？」って聞かれると、自身を持って「任せとき！」とは言い難いので、今回は自分の認識のズレを見つける目的もあって記事を書いています。<br>
<b><font color="FF0000">※筆者はJavaをメインにしているので、Java視点での記載をします。</font></b>

<h1>オブジェクト指向ってなぁに？</h1>
まぁぶっちゃけて言ってしまうと、<br>
<b><font color="FF0000">オブジェクト指向なんてなくてもプログラムは書けますし動かせます( ﾟДﾟ)</font></b><br>
「じゃあいらんやんｗ」って言われてしまうかもしれませんが、実際にプロジェクトで多人数でプログラムを書いたりする時にとても大事になってきますし、設計思想とかにも繋がるので理解して損はないかと。<br>
まぁ所謂考え方の1つです。<br><br>
前置きが長くなりましたが、説明していきます。<br>
簡単に言うと実際に現実にある物と同じ様にプログラムを扱いましょうって事なんです。<br>
イメージしやすいものだと、ゲームのキャラとかでしょうか？<br>
今回は人のキャラを題材にして説明していきます。<br>

<h2>プログラムを人として扱う？？</h2>
<b>▼一般的に人は何を持っていますか？</b><br>
人は<b><font color="FF0000">名前、性別、血液型</font></b>を持っています。<br>
<b>▼人は何が出来ますか？</b><br>
人は<b><font color="FF0000">歩けるし、走れるし、眠れます</font></b>。<br><br>

これをHumanクラスとしてプログラムにすると、
```java:Human.java
public class Human(){
  /** 名前 */
  String name;
  /** 性別 */
  String gender;
  /** 血液型 */
  String blood;
  
  /** 歩く */
  public void walk() {
    System.out.println(name + "は歩いた");
  }
  /** 走る */
  public void run() {
    System.out.println(name + "は走った");
  }
  /** 眠る */
  public void sleep() {
    System.out.println(name + "は眠った");
  }

}
```
<p>このように定義してあげる事で、このプログラムを<b>「人」</b>として扱えるようになります。<br>
じゃあ「人」と言っても世界に○億人程いるわけでして…<br></p>
適当に別クラスを作って<br>

```java:Test.java
public class World() {
  public static void main(String[] args) {
    // 太郎が産まれたイメージ
    Human taro = new Human();
    // 太郎と命名されるイメージ
    taro.name =  "太郎";
    // 太郎が歩くイメージ
    taro.walk();

    // 同じように
    // 次郎が産まれたイメージ
    Human jiro = new Human();
    // 次郎と命名されるイメージ
    jiro.name = "次郎";
    // 次郎が走るイメージ
    jiro.run();
  }
}
```
<p>実行すると…</p>

```コンソール.
　　太郎は歩いた
　　次郎は走った
```
<p>まぁ本当にこんな感じでザックリと神になった気分で現実に存在するものとしての認識をつけて扱えるよ～って事なんです。<br>
人をものって思ってるわけじゃありませんよ…<br>ʅ（◞‿◟）ʃ<br>
他にもインターフェースを使って多態性とかって考え方とかあるけど、それはまた別の機会に。</p>


<h2>最後に</h2>
書いてみて改めてオブジェクト指向の説明って文章だとちょっと伝わりずらいんです…<br>
本当に色々なプログラム書いて慣れてってのが一番の近道だと思うので、初めてから全部理解しようとせずにザックリとイメージを持っておいてもらう方が混乱しないでいいかなと思いました。<br>
DjangoのSettings.py、DATABESESの値に MariaDBの設定を埋め込んでみた

# DjangoでRaspberryPiにインストールしたMariaDBを使いたい
Settings.pyにIDやパスワードをベタ書きにしてもよかったのだが、平文のパスワードをプログラム上に置きたくなかったのと、別のブログラムでもそれを共用していたので、Yaml形式のConfigファイルを生成し、プログラムとは別の場所に保存して使い回すことにした。
## Yamlファイルの中身
以下はyaml形式のConfigファイル
```python
#config.yaml
auth_info:
  ID: hoge_user # ここに任意のユーザー名
  password: xxxxxxx # ここに任意のパスワード
db_server:
  host: 192.168.x.x # ここにRaspberryPiのIPアドレス
  port: 3306
  db_name: db_name 
  charset: utf8mb4
  ENGINE: django.db.backends.mysql
```
hostであるRaspberryPiのIPアドレスははコンソール上ででip rと打ち込めばでてきます。
pyyamlが必要になるので`pip install pyyaml`は必要があれば実行してください。

## Configを読み出すプログラム


```python
# config_reader.py
import yaml

def read_yaml():
    with open(r'/~任意のディレクトリ~/config.yml','r') as yaml_file:
        yml = dict(yaml.load(yaml_file, Loader=yaml.SafeLoader))
        return yml
```
このconfig_reader.pyをプロジェクトフォルダのutilityディレクトリに入れてSettings.pyで読み出す。

## Settings.pyの途中でConfig_readerを呼び出し、Dict型データをconfig.yamlから抽出し設定に反映させる
なお、MariaDBをDjangoで使うにはmysqlclientが必要ですので、各自`pip install mysqlclient`は必要であれば実行してください。
```python
# settings.pypy
"""
Django settings for stocks_db project.

Generated by 'django-admin startproject' using Django 4.0.3.

For more information on this file, see
https://docs.djangoproject.com/en/4.0/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/4.0/ref/settings/
"""
from pathlib import Path
import sys

CURRENT_DIR = str(Path(__file__).resolve().parent) + '\..'
sys.path.append(CURRENT_DIR)

import utility.config_reader

# ～　中略　～

yml = utility.config_reader.read_yaml()
DATABASES = {
    'default': {
        'ENGINE'   : yml['db_server']['ENGINE'],
        'NAME'     : yml['db_server']['db_name'],
        'USER'     : yml['auth_info']['ID'],
        'PASSWORD' : yml['auth_info']['password'],
        'HOST'     : yml['db_server']['host'],
        'PORT'     : yml['db_server']['port'],
    }
}
```

## 参考にした記事
[DjangoでMySQLを使うためには](https://qiita.com/kanazawa1226/items/e222604943c500801746)
デバックするときに考えていること

趣味での電子工作でコードを書くとき、デバックで心掛けていることをまとめます。

デバックの理論と実践には下記のような手順を示されています。
その手順を基に、私が実際に取り組む際に、考えていることをまとめて見たいと思います。

> デバッグにおける7つの手順(TRAFFIC)
Track:問題をデータベースに記録する。 
Reproduce:障害を再現する 
Automate:テストケースの自動化と単純化を行う 
Find:感染源の疑いがある箇所を見つける 
Focus:感染源の疑いが最も高い箇所に着目する
・ 既知の感染
・ 状態、コード、入力にある原因
・ 異常な挙動
・ あやしいコード
Isolate:感染の連鎖を分離する 
Correct:欠陥を修正する

# 1.問題をデータベースに記録する。
デバックした際にはまった部分は、Qiitaにまとめるようにしています。これは、同じことをもう一回した際に、同じことでよくはまることが多いため、書くようにしています。ただ、詳細に書きすぎると、本来やりたかった作業ができなくなるため、自分が再現できる範囲で書くようにしています。そうやってハードルを下げることで、記録するようにしています。もし、質問があれば、より詳しく書いたりすればいいかなと今は思って書いています。

# 2.障害を再現する 
再現するかどうかで問題点を探していきます。再現性が多いかどうかで、プログラム起因かそれ以外かを切り分けます。プログラムだと修正すればなんとかなりますが、それ以外、例えば、通信起因でエラーが出たり出なかったりする場合だと、ハード起因の部分もあるので修正する難易度も上がってきます。

# 3.テストケースの自動化と単純化を行う 
私は、jupyterを使ってpythonのコードを書くことが多いです。デバック時に走行してエラーが発生した場合、そのエラーをヒントに、プログラムを単純化します。プログラムは、作り込んでくると複雑になり、何をしているのかを追いづらくなります。また、走行時間もかかってしまうので、単純化をして検証できる環境を作ります。テストケースの自動化については、それほど手間のかかるコードを作ってないので、考えたことはないですが、検証するのに前作ったコードを組み込んでテストすることは、たまに行います。

# 4.感染源の疑いがある箇所を見つける、感染源の疑いが最も高い箇所に着目する
感染源の疑いがある場所を見つけるのは、エラーを確認することから始めます。基本的にpython出てているようなエラーは、誰か同じようなエラーを出している場合が多いです。実行したいことを考え、そのワード + エラーなどで検索をかけて最も感染源の高い場所を特定していきます。私は、よく動作するプログラムをベースとして保存しておき、エラーで止まったものの差分を確認してあやしいところを絞っていきます。
このとき、なるべく感染源がどういった動きでエラーとなったのか、仮説を立てるようにしています。深掘りをしてみることで、プログラムとハードの動きを理解していきたいためです。私は、正しいかどうかは置いといて、この仮説を立てれるようになることが、難しいことでもあるのですが、楽しいことでもあると思っています。続けていくと、いい推測ができるようになってくるのではないかと考えています。

# 5.感染の連鎖を分離する
4と一緒に考えています。5を考えるのは、再現性が低い場合に意識します。再現性がある場合、構文間違いや変数に異常値が入っていることが多いので、print文で変数を確認することで分かってきます。再現性が低い場合、値がおかしいことよりもフローを疑うことがよくあります。通信処理に時間がかかり不定期になってしまっているとか、配線がよくないとか、そういった観点で、確認できそうな変数を調べ、原因となる箇所を絞っていきます。このとき、プログラムで何をしているかを、コメントアウトを追加して記述するようにしています。そうすることで、どこがおかしかったかを分かるようにするためです。

# 6.欠陥を修正する
欠陥を修正します。このときに、大切にしていることは、この欠陥がプログラムのキーポイントとなることだということを思い出せるようにしています。リファクタリングしてシンプルに記述したり、行間を分かるようにしたり、コメントを追加して次見ても分かるようにしたり、qiitaに投稿しておくようにしています。

以上、簡単にまとめて見ました。
ご参考になれば、幸いです。
github 超基本

git hubの学習のために初歩的な使い方を載せます。
最近reactの勉強を始め、製作したものをgitにあげてと言われたのですが、存在は知っているけど使い方がいまいちわからない。
まずGithubにログインします。
https://github.com/new
次にrepository nameを入力します。
ソースコードを公開する場合はPublic,しない場合はPrivateにします。
最後に、リポジトリの中にあらかじめREADMEファイルを作成しておく場合は「Initialize this repository with a README」にチェックを入れます。
.gitignoreやlicenseについては後で追加や変更ができるので、Noneを選択します。

項目の入力が終わるとCreate repositoryをクリックすると、リポジトリの完成です。

次はmacのターミナルで行います。

```
mkdir study //今回はstudyというディレクトリを使用します
cd study    //studyディレクトリに移動します
git init    //Gitリポジトリを新たに作成するコマンド
git status //現在の状態を見ます
```
結果は以下のようになります
```
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	.gitignore
	README.md
	package-lock.json
	package.json
	public/
	src/
```
先ほど作成したファイルをローカルリポジトリに追加します。
```
git add .
```
addの後ろに.をつけると一括で選択できるらしい。

次に、インデックスに追加されたファイルをコミットします。
```
git commit -m "add new folder" //""中はメッセージ
```
これですべてのファイルがコミット済みの状態になりました
```
On branch master
nothing to commit, working tree clean
```
次に、リモートリポジトリに反映させるため前に、リモートリポジトリの情報を追加します。
Githubでリポジトリを作成した際に表示されたアドレスをコピーします。
```
git remote add origin コピーしたアドレス
```
ローカルリポジトリの変更を、GitHub上にあるリモートリポジトリに反映させるため、以下のコマンドを実行します。
```
git push origin master
```
これで、Githubへプッシュしてリモートリポジトリへ反映させることができました。
【Github】リリースを取り消し

メモです。

### リリース取り消し

Github でRelease したものを取り消して修正を加えたい場合。


こちらにあるとおりでした。
https://akinov.hatenablog.com/entry/2020/10/20/172457

Github である origin にある tag 1.0.0 を、ローカルから消します。

```
$ git push --delete origin 1.0.0
```

リリースは削除され、draft release の状態になります。

### リリース

そもそもですが。

https://docs.github.com/ja/repositories/releasing-projects-on-github/about-releases
Dockerfile内のCMDで指定したコマンドがうまく動かない時の対処法【備忘録】


Dockerfileを記述する際に、
CMDコマンドの記述においてつまづいた点があったため、
備忘録を残す。


```docker:Dockerfile(NG例)
CMD ["cd", "apps/"]
CMD ["python3", "main.py"]

```
CMDでpythonのコードを実行するコマンドを記載する際に、
main.pyが含まれるディレクトリにcdで移動する必要があったとする。

その際にcdコマンドをCMDで渡しても、ディレクトリの移動が反映されない。

そんなとき、下記のようにすると解決する。


```docker:Dockerfile(OK例)
WORKDIR ["apps/"]
CMD ["python3", "main.py"]
```
[Android] Roomを使ってローカルDatabaseにデータを保存してみた

## 背景
データ永続化するニーズが出てきたので、ローカルDBにデータを保存して、サーバーと常に同期するようにした

### 技術背景
- Kotlin: 1.6.20
- KSP: 1.6.20-1.0.5
- Android Studio: BumbleBee

## Roomとは
> Room 永続ライブラリは SQLite 全体に抽象化レイヤを提供することで、データベースへのより安定したアクセスを可能にし、SQLite を最大限に活用できるようにします。

[Room  \|  Android デベロッパー  \|  Android Developers](https://developer.android.com/jetpack/androidx/releases/room?hl=ja)

## Setup Room
- kaptは非推奨になったため、kspを使いました。
    - [Using kapt \| Kotlin](https://kotlinlang.org/docs/kapt.html)
    - [Kotlin Symbol Processing API \| Kotlin](https://kotlinlang.org/docs/ksp-overview.html)

- build.gradle

```gradle
buildscript {
    ext {
        // sdk and tools
        compileSdkVersion = 31
        minSdkVersion = 25
        targetSdkVersion = 31

        // app dependencies
        kotlinVersion = '1.6.20'
        roomVersion = '2.4.2'
    }
```

- settings.gradle

```gradle
pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
    }
    plugins {
        id("com.google.devtools.ksp") version "1.6.20-1.0.5"
    }
}
```

kspのバージョンはこちらを参照しました：[Maven Repository: com\.google\.devtools\.ksp](https://mvnrepository.com/artifact/com.google.devtools.ksp)
settings.gradleに`pluginManagement`を書いた理由はこちら：[gradle pluginManagement \{\} ブロックとは](https://zenn.dev/aa/articles/4ee69840056ac4#pluginmanagement-%7B%7D-%E3%81%AF-plugin%7B%7D-%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B)

- app/build.gradle

```gradle
plugins {
    id 'com.google.devtools.ksp'
}

implementation("androidx.room:room-runtime:$rootProject.roomVersion")
annotationProcessor("androidx.room:room-compiler:$rootProject.roomVersion")
ksp("androidx.room:room-compiler:$rootProject.roomVersion")
```

## テーブル作成


To be continued...


## エラー
```
Plugin [id: 'com.google.devtools.ksp'] was not found in any of the following sources:
```

↑のsettings.gradleに`pluginManagement`を設定すれば解決するはずです。
Docker で Python の実行環境を作る

# ディレクトリ構成

```./src/test.py``` が Docker の環境で実行させたいプログラムです。

```
.
├── Dockerfile
├── Makefile
├── docker-compose.yml
├── requirements.txt
└── src
    └── test.py
```

# Dockerfile

```dockerfile:Dockerfile
FROM python:3
USER root
WORKDIR /root/src/
ADD requirements.txt /root/src/
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
```

# docker-compose.yml

```yaml:docker-compose.yml
version: '3'
services:
  python3:
    build: .
    container_name: 'python3'
    tty: true
    volumes:
      - ./src:/root/src
```

# requirements.txt

使いたいパッケージを列挙します。

```text:requirements.txt
numpy
matplotlib
```

# コマンド

次の３つのコマンドでテストプログラムが実行できます。

```bash
$ docker-compose build
$ docker-compose up -d
$ docker exec -it python3 python test.py
```

# Makefile

Docker 周りのコマンドは長ったらしいので、make で簡略化します。

```:Makefile
all:
	docker exec -it python3 python test.py
build:
	docker-compose build --no-cache
install:
	docker-compose build
up:
	docker-compose up -d
ps:
	docker-compose ps
version:
	docker exec -it python3 python --version
down:
	docker-compose down
bash:
	docker-compose exec python3 bash
```
仮想通貨ライブラリ ccxt

# 仮想通貨ライブラリ ccxt

Node.jsを使う機会があったので、そのまま仮想通貨自動取引Botを自作することにしました。今回は軽く板情報取得までの流れを掲載します。


## そもそもccxtとは
ccxtは、**様々な仮想通貨取引所のAPIをまとめたライブラリ**です。
ccxtについては様々な記事で詳しく紹介されているのでそちらを参照してください。
今回はJavaScriptでccxtを使ってみたので、サンプルソースを掲載します。
取引所はBitflyerを利用しているので、その他の取引所を利用している場合はソースが異なる場合があります。

## 1. ccxtライブラリの導入
Node.jsでは、パッケージ管理システムのnpmを利用してライブラリの導入を行います。
今回はccxtのライブラリを使用するので、導入する際は以下のコマンドを打ちます。

```console
  npm install ccxt
```

## 2. ライブラリを読み込む
以下はソースコードに記述するものになります。

```javascript
  const ccxt = require('ccxt');
```

## 3. ccxtクラスのインスタンスを生成する
ccxtクラスを使用するためのインスタンスを生成します。

```javascript
  // bitflyer
  const bitflyer = new ccxt.bitflyer({
    apiKey: "取引所のAPIキー",
    secret: "APIシークレットキー"
  });
```

## 4. 取引所の板情報を取得する
Bitflyerの取引所から板情報を取得するメソッドを使ってみました。
注意しなければならないのが、ループ処理などではJavaScriptの非同期処理を待つ必要があります。
楽なのでasync/awaitでPromiseを制御することにします。

```javascript
  (async ()=>{
    while (true) {
      tick = await bitflyer.fetchTicker('FX_BTC_JPY');
    }
  })();
```

## コード
まとめるとこのようなコードになります

```javascript
  const ccxt = require('ccxt');

  // bitflyer
  const bitflyer = new ccxt.bitflyer({
    apiKey: "取引所のAPIキー",
    secret: "APIシークレットキー"
  });

  (async ()=>{
    while (true) {
      tick = await bitflyer.fetchTicker('FX_BTC_JPY');
    }
  })();
```
資格試験の勉強


はじめましてモリモリです。

只今司法試験の勉強真っ只中。
勉強期間の思い出として手軽に始められるQiitaでブログ書いていきます。

今日は勉強仲間からとても良い情報があり、人生を大きく左右するかもしれない一年に突入しそうな気配。


司法試験の勉強をはじめましてまだ2年だが、独学だけでは到底合格できそうにないと最近実家してきた。

同時期くらいに勉強をはじめた仲間と情報交換をしていたらとんでもない通信講座を見つけてしまった。

なんでも受講生の合格率が全国平均の何倍もあるらしい。

胸躍りググってみたが情報はたしかだった。

しかも割引率がえぐい。

”
現在アガルートの司法試験・予備試験対策講座では、様々なクーポン・セールが開催中です。

割引率も大きくこの機会を逃してしまうとかなり大きな違いがあるため、ぜひお見逃しなく！

【2023年合格目標】カリキュラム早期申込価格
セール名	【2023年合格目標】カリキュラム早期申込価格
割引額	30%OFF
期間	2022年6月30日　16:00まで
対象講座	・【2023年合格目標】予備試験１年合格カリキュラム
・【2023年合格目標】論文基礎力養成カリキュラム
・【2023年合格目標】法科大学院入試専願カリキュラム（関東圏／関西圏）

"


引用：https://shikakuhiroba.net/school/55026


友人と二人して受講を決意した。

合格すれば全額返金。
必ず来年合格してみせる。
Next.js でクライアントでのみコードを実行したい

Next.js にて DOM を使って要素サイズを計測してから配置を決めたかったものの、SSR時に `document.~` が実行されてエラーになってしまうため、メモ

```typescript
const [isClient, setClient] = useState(false);
useEffect(() => {
  setClient(true);
}, []);

if (isClient) {
  // CSR時のみ実行
} else {
  // SSR時のみ実行
}
```

巷には `typeof window !== 'undefined'` での条件分岐を促す文献も見られたのですが、React18 からは **Error: Hydration failed because the initial UI does not match what was rendered on the server.**（意：クライアントでレンダリングされた初期UIがSSRのそれと一致しないよ）のエラーが表示されるようになったらしいので、上記の方法が堅実かと思います。
極力短時間でAZ-900(Azure Fundamentals)に合格する

## はじめに
職場で取得必須とのことで、Azure Fundamentals(AZ-900)資格を受験することに。
Azureの基礎を覚えて理解した上で、極力時間をかけずに合格したかった為、10時間以内で合格した方法を記載します。

## AZ-900(Microsoft Azure Fundamentals)とは
Azure資格の中で最も基本的な資格で、以下出題範囲になります。
* クラウドのコンセプトに関する説明
* コアAzureサービスに関する説明
* Azureのコア ソリューションと管理ツールに関する説明
* 一般的なセキュリティおよびネットワークセキュリティ機能に関する説明
* ID、ガバナンス、プライバシー、およびコンプライアンス機能に関する説明
* Azureの料金とサポートに関する説明

## 勉強方法
1. 「[合格対策Microsoft認定AZ-900:Microsoft Azure Fundamentalsテキスト＆問題集](https://www.amazon.co.jp/dp/B0872LVYD6/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)」を一読。問題も一度解く。
ポイント：試験範囲と基礎知識を大まかに理解すること（完全に覚えなくてよい）


2. 「[【AZ-900】Microsoft Azure Fundamentals 勉強アプリ](https://simple-was-best.com/az-900)」を３回解く。
    ポイント：わからなくてもすぐに次の問題に進む。わからないサービス・用語はすぐネット検索。

1の対策本は2時間、2のWeb問題集は5時間くらいで実施しました。
また2の問題内のサービスについて以下名称で試験に出てくるので注意が必要です。
* Azure Secirty Centerは、現在Microsoft Defender for Cloudというサービス名。
* Azure Advanced Threat Protectionは、現在Microsoft Defenderfor Identityというサービス名

## 受験
* 極力集中した環境で受験したく、テストセンターでの試験を選択
* 問題は3つか4つの選択肢から選ぶ形式と、はい or いいえで選ぶ形式が多いです
* 20分ほどで解き終わる為、見返すことも可能です

## 結果、振り返り
700/1000点で合格とのことですが、857点でした。以下振り返りです。
* 使用したWeb問題集は全く同じ問題は出題されないものの、似た問題や覚えた知識で答えられる問題が多いように感じた。
* 以下のような前提のある方であれば問題なく短時間で合格可能だと思います。
    * Saas/Paas/Iaasやハイブリッドクラウド等、クラウドの基本用語については問題ない
    * 何か１つパブリッククラウドの実務経験がある
    * 何か１つパブリッククラウドの資格取得経験がある
    * 仮想マシン、VNetなどAzureの基本サービスは把握 or 試したことがある



バッジ、認定証も送られてきます。パチパチパチ👏
![スクリーンショット 2022-05-16 20.32.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/d6c386b3-a2ac-db14-ce08-0597942a545d.png)
サクラエディタの設定を他のPCへコピーする

サクラエディタの設定を他のPCで行う場合、
通常は手作業で設定することになるかと思います。
いちいち設定するのが面倒なので、設定をコピーするバッチを書いてみました。

# バッチ実行の前の準備
まず、
登録してある各言語で使用するキーワード、ルール、ヘルプなどのファイル
についてはユーザープロファイル配下のパスには配置しないよう設定を変更しておきます。
コピー元とコピー先のPCでログオンしているユーザーが異なっていた場合、都度修正を行うのを避けるためです。
※コピー元とコピー先のPCでログオンしているユーザーが同じであれば変更不要です。
　ただし、ユーザープロファイルのフォルダー名が同一である必要があります。

そして、下記ファイルを1つのフォルダーにまとめておきます。
* 登録してある各言語で使用するキーワード、ルール、ヘルプなどのファイル
* プラグインのフォルダー(%appdata%\sakura\のpluginsフォルダー)
* sakura.iniファイル(%appdata%\sakuraにあります)
* サクラエディタのインストーラーをsakura_install.exeの名前にして配置

sakura.iniファイルを編集します。
[Grep]の個所までは下記内容に書き換えます。
元のファイルには開いたファイルの履歴などが残っているので、それを消すために行います。

```ini:sakura.ini
[MRU]
_ExceptMRU_Counts=0
_MRUFOLDER_Counts=0
_MRU_Counts=0

[Keys]
_REPLACEKEY_Counts=0
_SEARCHKEY_Counts=0

[Grep]
GREPFILE[00]=*.*
_GREPEXCLUDEFILE_Counts=0
_GREPEXCLUDEFOLDER_Counts=0
_GREPFILE_Counts=1
_GREPFOLDER_Counts=0
```

また、未インストールPCにてコマンドプロンプトなどで次コマンドを実行し、サクラエディタを仮でインストールを行います。
このとき、現行でインストールされているのと同じ設定にてインストールを実施します。
このコマンドでカレントディレクトリに作成されたsakura.infを上記フォルダーに配置します。
※sakura.infを絶対パスで記載すればフォルダー指定が可能です。
このsakura.infはインストール時の設定内容が書かれたファイルで、
この後実行するバッチではサイレントインストール時にこのファイルを読み込ませて設定を行っています。
```bat:仮インストール
akura_install.exe /saveinf="sakura.inf"
```

# バッチ
これで準備が完了しましたので、
バッチの実行となります。
下記バッチを各種ファイルをまとめたフォルダーに配置し、
そのフォルダーごとインストール先PCに持って行ってバッチを実行します。
なお、このバッチはサクラエディタがインストールされていたら一度アンインストールを行い、
再度インストールしなおしをするため、タスクバーとかにピン留めされていた場合は消えてしまい、再度設定が必要になります。

```bat:設定コピー
@echo off

rem 管理者権限強制実行
whoami /priv | find "SeDebugPrivilege" > nul
if %errorlevel% neq 0 (
  @powershell start-process %~0 -verb runas
  exit
)

rem バッチのあるフォルダーへ移動
cd /d %~dp0

rem インストールされていた場合はいったんアンインストール
if exist "C:\Program Files (x86)\sakura\unins000.exe" (
  "C:\Program Files (x86)\sakura\unins000.exe" /SILENT
)

echo.
echo サクラエディタインストール
rem インストールファイルはsakura_install.exe固定
start /wait /b sakura_install.exe /SP- /SILENT /norestart /LOADINF="sakura.inf"
rem 設定ファイルコピー
rem 新規インストールの場合sakuraフォルダー作成
if not exist %appdata%\sakura (
  mkdir %appdata%\sakura
)
copy /y sakura.ini %appdata%\sakura
mkdir %appdata%\sakura\plugins
xcopy plugins %appdata%\sakura\plugins /e /y /h
rem デフォルトにコピーすることで新たに作成したユーザーにも適用されるようにする 
mkdir C:\Users\Default\AppData\Roaming\sakura
copy /y sakura.ini C:\Users\Default\AppData\Roaming\sakura
mkdir C:\Users\Default\AppData\Roaming\sakura\plugins
xcopy plugins C:\Users\Default\AppData\Roaming\sakura\plugins /e /y /h

rem キーワード、ルール、ヘルプなどのファイルの数だけ記載する
rem 例：copy /y tmp.kwd c:\tmp
copy /y キーワード、ルール、ヘルプなどのファイル 配置するパス
```

# おわりに
もしもサクラエディタの設定を変更した場合はsakura.iniを変更するだけでOKとなります。
VirtualBoxをCUIで操作する

# VirtualBoxをCUIで操作する

私がよく使っているコマンドについてメモしておきます。
チートシート代わりに使おうと思っています。

## 環境

Windows10, VirtualBox, コマンドプロンプトとかCUI

環境変数にVBoxManage.exeの配置先のディレクトリを加えてパスを通してあります。
配置先は大抵`C:\Program Files\Oracle\VirtualBox`とかです。

## 動機

VirtualBoxはGUIにダークテーマが無くて目が疲れます。
あと同じ操作を何度も繰り返しているならマウスでポチポチよりコマンド使った方が楽です。

## 個人的頻用コマンド

### 仮想マシンのリストを表示する

ここで取得した名前やUUIDを、後述するコマンド内で用います。

#### 登録済みの仮想マシンのリストを表示する

`VBoxManage list vms`

#### 起動している仮想マシンのリストを表示する

`VBoxManage list -l runningvms`

### 起動する

`VBoxManage startvm <仮想マシンの名前>`

#### ヘッドレス起動する

`VBoxManage startvm <仮想マシンの名前> --type headless`

### 電源を落とす
＊ACPIシャットダウンではないので注意。マシンの電力供給を突然断つようなことをする。

`VBoxManage controlvm <仮想マシンの名前> poweroff --type headless`

### スナップショット

#### スナップショットを撮る

`VBoxManage snapshot <仮想マシンの名前orUUID> take <snapshot-name> [--description=description] [--live] [--uniquename Number,Timestamp,Space,Force]`

#### スナップショットをリストア(復元)する

`VBoxManage snapshot <仮想マシンの名前orUUID> restore <snapshot-name>`

#### 起動しているマシンの派生元であるスナップショットをリストアする

`VBoxManage snapshot <仮想マシンの名前orUUID> restorecurrent`

下記の状況でこのコマンド使ったらsnapshot1にリストア(復元)されます
```
snapshot0
 |- snapshot1
     |- 最新の状態のマシン
```
## 参考リンク

[virtualbox公式ユーザーマニュアル第八章](https://www.virtualbox.org/manual/ch08.html)

## あとがき

使うコマンド増えてきたら、適当に追加していくかもしれません。
DBの基礎的な事柄1(データモデル〜SQL)

## 本記事について

本記事は自分が学んだ基礎的な知識を`メモ書きの要領`で記述していく形式になります
読者の方にとって、本記事における何らかのキーワードが調べ物の手助けになれば良いと思い、Qiita上に記事として公開します

## データベースの必要性

- システム間でデータ共有
- 一元管理(整合性を保つ)
- バックアップと復旧

## データモデルの種類

- ツリー型
  - ツリー構造
  - 親 -< 子
- ネットワーク型
  - 親 >< 子
- リレーショナル
  - 表形式
- オブジェクト型
  - データを１つのオブジェクトとして管理
  - 画像・音声・動画など多様な形式のデータを纏めて管理することに適している
- XML型
  - XMLで表現した文書やデータをそのまま階層構造で格納でき、それらを自由に検索・抽出できる
- NoSQL
  - ACID特性に縛られない
  - 多種多様なデータを保存できるので変更に対する対応力が高い
  - 一元管理する必要がないデータを分散化し、処理スピードを向上させることができる
  - データの堅牢性に期待はできない
    - カラム指向性
      - Cassandra: Twitterの書き込みデータ
      - Hbase: Facebook,LINEのメッセージ機能  
    - ドキュメント指向型
      - MongoDB: McAfeeのセキュリティデータ
    - キーバリュー型
      - Riak: Yahooのキーワード検索
    - グラフ指向型
      - Neo4j: Ciscoのネットワーク監視

## RDB

### 特徴

- ２次元の表形式でデータを管理
- 表間にリレーションを定義することができる
- 関連を利用してデータを定義することで、効率的なデータ管理が可能になる

### リレーション

- データを関連する項目で２次元の表形式にまとめたもの

### 主キー(PRIMARY KEY)

- デーブル内で、そのレコードが一意(ユニーク)なものであることを示すカラムのこと
- そのため主キーの値が同じレコードは複数存在しないことが保証される(一意性制約)
- 複数のカラムを合わせて主キーにすることもできる
- 基本的にはテーブル毎にプライマリキーが作成される

### 外部キー(FOREIGN KEY)

- 他のテーブルのプライマリキーを参照しているカラム
- そのため外部キーの値が、参照するテーブルに存在する必要がある(参照整合性制約)
- 外部キーの値は参照しているテーブルのカラムに存在する値、またはNULLでなければならない

## SQL

### 概要

- Structured Query Language
- データベースにアクセスするための言語
- ISOやJISによって標準化されているため、特定のDBMSに依存しない(ただ方言のようなものはある)

### 種類

- DML(Data Manipulation Language)
  - 格納されているデータの検索・変更・追加・削除するための操作
    - select
    - insert
    - update
    - delete(where句で削除するデータを指定可能な上、コミットしていなければrollback可能)
    - merge(レコードのマージ)
- DDL(Definition)
  - データを格納する表の作成や削除、データにアクセスできるユーザーの定義を行うための操作
    - create
    - alter
    - drop(表内オブジェクト=表構造の全削除)
    - rename
    - truncate(デーブルの切り捨て = 表内データの全削除)(高速だがrollback不可)
- DCL(Control)
  - データベースに対するアクセス制御を行うための操作
    - grant
    - revoke
  - トランザクションの制御を行う操作
    - commit
    - rollback
    - savepoint
      - 例えばストアドプロシージャ(トランザクションをDBMSに保存したもの。SQLインジェクションの対策や、量が増えすぎなければレスポンスの改善に繋がる。ストアドファンクションとの違いは、プロシージャは戻り値がなく、ファンクションには戻り値がある点)を構成する複数のファンクションをsavepointで分割することによって、１つのファンクションが失敗しても簡単にデータのリストア・リカバリ・再実行を行うことができる

## 制約

- not null
- unique (nullはok)
- check
- primary key(not null && unique)
- foreign key

## 続き

https://qiita.com/akitika/items/3e1dbfb8d14fcb468d2d
OpenLiteSpeedのあるサーバーでLetsEncrypt証明書の更新エラー

OpenLiteSpeedの動いているサーバーで、Let's Encryptの更新が出来ない問題が発生したので、解決までの備忘録です。

```
$ /usr/bin/certbot renew
Cert is due for renewal, auto-renewing...
Plugins selected: Authenticator standalone, Installer None
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
Renewing an existing certificate for a.example.com
Performing the following challenges:
http-01 challenge for a.example.com
Cleaning up challenges
Failed to renew certificate a.example.com with error: Problem binding to port 80: Could not bind to IPv4 or IPv6.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
All renewals failed. The following certificates could not be renewed:
  /etc/letsencrypt/live/a.example.com/fullchain.pem (failure)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 renew failure(s), 0 parse failure(s)
```

LiteSpeedがポート80を使っていたので、それが原因だった模様。

```
$ sudo lsof -i :80
COMMAND     PID   USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
litespeed 21038   root   28u  IPv4 29001210      0t0  TCP *:webcache (LISTEN)
litespeed 21038   root   29u  IPv4 29001211      0t0  TCP *:webcache (LISTEN)
litespeed 21038   root   30u  IPv4 29001212      0t0  TCP *:webcache (LISTEN)
litespeed 21038   root   31u  IPv4 29001213      0t0  TCP *:webcache (LISTEN)
litespeed 21038   root   32u  IPv4 29001214      0t0  TCP *:webcache (LISTEN)
litespeed 21038   root   33u  IPv4 29001215      0t0  TCP *:webcache (LISTEN)
litespeed 21042 nobody   28u  IPv4 29001210      0t0  TCP *:webcache (LISTEN)
litespeed 21043 nobody   29u  IPv4 29001211      0t0  TCP *:webcache (LISTEN)
litespeed 21044 nobody   30u  IPv4 29001212      0t0  TCP *:webcache (LISTEN)
litespeed 21045 nobody   31u  IPv4 29001213      0t0  TCP *:webcache (LISTEN)
litespeed 21046 nobody   32u  IPv4 29001214      0t0  TCP *:webcache (LISTEN)
litespeed 21047 nobody   33u  IPv4 29001215      0t0  TCP *:webcache (LISTEN)
```

LiteSpeedの管理画面から、HTTPListenerのPortを 80 -> 8080 に変更し、再起動。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56624/646e40c2-8def-1020-a498-63bf1bb76e8a.png)

ポート80が無くなるかチェック。

```
$ sudo lsof -i :80
```

ポート80を使っているタスクを止めてみるとか。

```
$ sudo kill -9 $(sudo lsof -t -i:80)
```

駄目だったら、コマンドラインからLiteSpeedを止めてみる。

```
$ /usr/local/lsws/bin/lswsctrl stop
```

改めて renew してみる。

```
$ /usr/bin/certbot renew
```

うまく更新できたら、LiteSpeedを再起動。

```
$ /usr/local/lsws/bin/lswsctrl restart
```
Power BI DAX関数 Format関数で日本語の曜日を取得

めちゃ小さいTipsであり、Docs読めば対処方法もわかるものですが、覚書として。

まず曜日はFormat関数で出せます。
`FORMAT(<value>, <format_string>[, <locale_name>])`

こちらの記事が検索するとすぐ出てきますね。
[Power BI 勉強帳：日付（カレンダー）テーブル](https://qiita.com/y-komuro/items/de3e2cb3dea129260079)
>なお、日本語の曜日名は、、リファレンスには載ってないですが、FORMAT関数の「aaa」で表せました。

` FORMAT([Date],"aaa")`

しかし最近レポートを作成したところこの書き方だと変換されなくなっていました。
(文字列として"aaa"がそのまま出力される)


# パラメーターlocale_nameが必要になったっぽい
Format関数の第3パラメーター "locale_name" に "ja" を記述すると、日本語の曜日が返ってきます

` FORMAT([Date],"aaa","ja")`

# 大事な追記

Power BI MVP たる [Takeshi Kagata](https://twitter.com/PowerBIxyz?s=20&t=f0O_nSGOmXoaJLl99wGXvw) (@PowerBIxyz) さんがTwitterでコメントをくださいましたので、転記させていただきます。ありがとうございます！

https://twitter.com/PowerBIxyz/status/1526166294252269568?s=20&t=p_f6PJhxITzJh0qnJkAu-w

今回の事象はPower BI Desktop のバージョンによるものだとのことで…
アップデート周りのキャッチアップをさぼっていたツケが溜まってきているなと反省した次第でした。(日記)
Qiitaの投稿用のテンプレート

# はじめに
マークダウンの記入が慣れていないので、自分用にテンプレートを作った。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [メモの投稿](#Chapter1)
1. [問題解決の投稿](#Chapter2)
1. [環境構築ログ](#Chapter3)
1. [よく使う項目](#Chapter4)


<!-- 各チャプター -->
<a id="#Chapter1"></a>
# メモの投稿
~~~
# はじめに
<!-- 概要 -->

# 目次

1. [Chapter1](#Chapter1)
1. [Chapter2](#Chapter2)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# Chapter1

<a id="#Chapter2"></a>
# Chapter2

<a id="#reference"></a>
# 参考文献
- [リンクテキスト](URL)
- [リンクテキスト](URL)
~~~

<a id="#Chapter2"></a>
# 問題解決の投稿
~~~
# 環境
- Jetson NX Xavier
- Ubuntu 18.04
- ROS2 FOXY
# エラー内容
# 原因
# 改善策

## 参考にした記事
[URL](https)

~~~

<a id="#Chapter3"></a>
# 環境構築ログ
~~~
# 環境
- Jetson NX Xavier
- Ubuntu 18.04
- ROS2 FOXY
# やりたい事
# インストール方法
# 確認方法

## 参考にした記事
[URL](https)

~~~


<a id="#Chapter4"></a>
# よく使うコマンド

```言語名:ファイル名.拡張子
コードブロック
```
~~~
```言語名:ファイル名.拡張子
コードブロック
```
~~~

`インライン表示`
~~~
`インライン表示`
~~~

>引用文
~~~
>引用文
~~~

[リンクテキスト](URL)
~~~
[リンクテキスト](URL)
~~~
| No |    内容     |    備考    |
|---:|-------------|------------|
| 1  |             |            |
| 2  |             |            |
~~~
| No |    内容     |    備考    |
|---:|-------------|------------|
| 1  |             |            |
| 2  |             |            |
~~~
- [ ] チェックボックス 1
- [ ] チェックボックス 2
- [x] チェックボックス 3
~~~
- [ ] チェックボックス 1
- [ ] チェックボックス 2
- [x] チェックボックス 3
~~~
# 見出し大
~~~
# 見出し大
~~~
## 見出し中
~~~
## 見出し中
~~~
### 見出し小
~~~
### 見出し小
~~~

**強調**
~~~
**強調**
~~~


- リスト 1
- リスト 2
    - リスト 2-1
~~~
- リスト 1
- リスト 2
    - リスト 2-1
~~~
READMEに目次を作成してみた（doctoc）

# 概要
[doctoc](https://github.com/thlorenz/doctoc)を利用して、READMEで目次を作成する。

# ゴール
![スクリーンショット 2022-05-16 19.11.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948673/a74cab6d-5614-9d27-1335-af9308784991.png)

# 対象読者
**「READMEを書いているときに、見出し要素に応じた目次をめちゃめちゃ簡単に作りたい」**
と少しでも思った方

## 前提
環境構築：**Docker**
バージョン管理：**Github**
**Markdown**を利用します。

# 内容
準備→作成手順の順番で説明します。

## 準備
READMEで、以下のように記載します。

```
# 目次1
## 目次1-1
...内容

# 目次2
## 目次2-1
...内容
```

## 目次を作成する手順
#### 1. npmインストールを行う
```npm install -g doctoc```を実行
#### 2. READMEを改修
README内の「目次」に規定のコメントアウトを追加
```
# 目次
<!-- START doctoc -->
<!-- END doctoc -->

# 目次1
## 目次1-1
...内容

# 目次2
## 目次2-1
...内容
```

#### 3. コマンドを実行
CLIで
#### dockerの場合
```
docker run --rm -it -v $(pwd):/usr/src jorgeandrada/doctoc --github
```
pwd...以下の部分は
```
/Users/user名/ディレクトリ名:/usr/src jorgeandrada/doctoc　--github
```
のように記載します。

#### ローカル環境の場合
```
doctoc README.md --github
```
を実行。

色々処理が流れるので、エディタなどでREADMEを確認すると...
![スクリーンショット 2022-05-16 19.39.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948673/3961f778-95d0-8604-b3e0-9991e7f2c537.png)
のように、目次を生成してくれます！！

#### おまけ
VScodeでプレビューを見る方法（Mac）
```
Cmd + Shift + V
```

# まとめ
目次があるREADMEは読みやすい。

# 参考
https://tsunokawa.hatenablog.com/entry/2016/04/21/144537

https://qiita.com/natsumo/items/6d0f9e82d11084f7b4d5
技術と思いやりはトレードオフ。30代でWebエンジニアに転身。

## 本記事を書くに至って
- Webエンジニアとして、2年目を終える今、ステップアップをしたいと考えています。
- 公務員として10年以上勤務しました。その後、エンジニアになりたい気持ちが大きくなり転職を決心。

## エンジニアとしてのキャリア
- フロントエンジニアを極めたいという気持ちが強いです。AWS、GCPなどのクラウドにも興味津々。
- 元々は組み込み系のエンジニアでした。フィールドエンジニアとして、工場や開発現場の調整役を行うことが多かったです。
- 自社案件を行うにつれて技術が伸びた。

## 現状に対して
- Webエンジニアとしては、キャリアが2年未満とまだまだ浅いと感じています。
- 一つの技術を突き抜けて身につけたいと感じており、日々勉強の毎日です。

## スキル伸ばすためにしていること
- IPコンテンツの製作
    - アニメコンテンツを作っています。
    - チームの中では、スケジュール管理などを担当しています。
- ITスキルのインプット
    - Amazon kindle umlimited
    - Udemyで動画視聴しながらインプット

## 最近、エンジニアの方と話した印象
- エンジニアになったことにより、面接でお話ししていただけるようにはなった。
- 技術レベルでいうと、PaizaのDレベルがまともにできない。ここに、エンジニアとしての正しいキャリアを積んでこなかったことに気づきました。
- 今後は、スキルアップを図りながら、マネジメント方面に進みたいと考えています。

## 兎にも角にもアウトプット
- 今までは、とにかくインプットすることに注力していました。
- これからは、量を意識してアウトプットを多くしていきたいと思います。

## 直近で作りたいもの
- WordPressで自分のDJサイトを作成する。
- Vue.jsでポートフォリオサイトを作成する。

## スキルアップで行っていること
- エンジニアととにかく話す。
- paiza解きまくる。
- aws　セッションなど、動画形式のレクチャーに触れる。
- メモを鬼のようにとる。やり方は、メモの魔力を基本としている。
Everyday AIを現実のものに：DataikuはGartnerⓇのデータサイエンスと機械学習プラットフォームのマーケット・ガイドレポートに掲載されました


ガートナー社は、データサイエンス＆機械学習プラットフォーム市場に関する、2つの個別のマーケット・ガイドのレポートをリリースしました。[^1]

- The Market Guide for DSML Engineering Platforms
- The Market Guide for Multipersona Data Science and Machine Learning Platforms

**Dataikuは、上記の2022年のマーケット・ガイドレポートの両方において、代表的なベンダーの1社としてとしてリストされたことを、ここにご報告します。**
[*→Gartner Market Guide for Data Science & ML Platforms(英語)を読む*](https://pages.dataiku.com/gartner-market-guides-dsml-platforms)

![600x300 for Blog (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196881/3a55990c-fb82-ae4e-e528-2b06e433f1c6.png)


## Dataiku：フルコードからノーコードまで、Everyday AIをすべての人に
ガートナー社は、The Market Guide for DSML Engineering Platformsで、次のように述べています。 

「多くのプラットフォームは、 マルチペルソナとエンジニアリングのDSMLプラットフォームの両方のカテゴリに分類されます。これらは通常、ドメインの専門家や市民データサイエンティストが予測分析タスクに取り組むことができるようにローコードインターフェースを提供しますが、専門家が人手により、あるいは自動的に生成されたMLモデルを、基本的な監視機能を備えたサービスとしてデプロイできるコーディング環境も含みます。」 [^2]

![KITCHEN.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196881/3aa9ada5-c90c-0bcd-c759-9ba92ce26ea9.png)


Dataikuは、上記の理由により、**両方**のマーケット・ガイドレポートに掲載されているベンダーの1つであると考えます。データサイエンス＆機械学習プラットフォームのガートナーマジック・クアドラントの2年連続のリーダー（2020年および2021年）の1社として、Dataikuは以下により、成功を可能にします。

- すべての人がアクセスできる、使いやすいコラボレーションインターフェース
- 効率的なエンドツーエンドのパイプラインにより、ユーザーが1週間でAIアプリケーションを作成できるような、合理化された価値
- AIを設計および管理するための、集約され、グローバルな全社的ソリューションとしての展開。チームに柔軟性を与え、グローバルな監視が可能

そうです、フルコードで作業することを好む技術専門家でも、ビジネスサイドでローコードまたはノーコードで作業する場合でも、Dataikuは、分析とAIをより幅広いユーザーベース -開発者から利用者まで- が利用できるように設計されているのです。




<br>


## Gartner Market Guideレポートの全文を読む
最新のデータサイエンス＆機械学習プラットフォーム市場について知るために、"The Market Guide for Multipersona Data Science and Machine Learning Platforms"と"The Market Guide for DSML Engineering Platforms"の両レポートをこちらよりお読みいただけます。
[**→レポートを無料で読む**](https://pages.dataiku.com/gartner-market-guides-dsml-platforms)

<br>
<br>


[^1]: Gartner, Market Guide for Multipersona Data Science and Machine Learning Platforms, Pieter den Hamer, Carlie Idoine, et al. 2 May 2022.
Gartner, Market Guide for DSML Engineering Platforms, Afraz Jaffri, Erick Brethenoux, et al. 2 May 2022.
この図表は、Gartner, Inc.がリサーチの一部として公開したものであり、文書全体のコンテクストにおいて評価されるべきものです。オリジナルの Gartner ドキュメントは、リクエストにより Dataikuからご提供することが可能です。
Gartner は、Gartner リサーチの発行物に掲載された特定のベンダー、製品またはサービスを推奨するものではありません。
また、最高のレーティング又はその他の評価を得たベンダーのみを選択するようにテクノロジーユーザ ーに助言するものではありません。Gartner リサーチの発行物は、Gartner リサーチの見解を表したものであり、事実を表現したものではありません。
Gartner は、明示または黙示を問わず、本リサーチの商品性や特定目的への 適合性を含め、一切の責任を負うものではありません。
GARTNERおよびMagic Quadrantは、Gartner Inc.または関連会社の米国およびその他の国における登録商標およびサービ スマークであり、同社の許可に基づいて使用しています。All rights reserved. 

[^2]: *Gartner - Market Guide for DSML Engineering Platforms - Afraz Jaffri, Erick Bretnehous, et al. 2 May 2022*


原文：[*Making Everyday AI a Reality: Dataiku Cited in 2022 Gartner® Market Guide Reports for Data Science & ML Platforms*](https://blog.dataiku.com/dataiku-cited-gartner-2022-data-science-ml-market-guides)
Slackでコードにシンタックスハイライトを付ける方法

さっき知った。
もっと早く知りたかった…

## バージョン
4.25.2 64-bit

## やり方

ショートカットを開く

![スクリーンショット1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392337/e053e48b-cd3f-83f2-c721-75671c48c8e8.png)

スニペットで検索して、「テキストのスニペットを作成する」を選択

![スクリーンショット2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392337/8ff01824-fe36-39ab-9681-5987f0918e3c.png)

タイプと内容を入力してスニペットを作成する

![スクリーンショット3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392337/358c9bb3-7f2f-08b9-f71c-1b1ed2f4478c.png)

出来上がり！

![スクリーンショット4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392337/d11265e4-db78-65ae-0162-c089313c9f67.png)



## 参考
https://slack.com/intl/ja-jp/help/articles/204145658-Slack-%E3%81%A7%E3%82%B3%E3%83%BC%E3%83%89%E3%82%B9%E3%83%8B%E3%83%9A%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%BE%E3%81%9F%E3%81%AF%E3%83%9A%E3%83%BC%E3%82%B9%E3%83%88%E3%81%99%E3%82%8B
rubyの基本文法１

# rubyの基本文法

Rubyのプログラムファイルは、拡張子「.rb」で作成する。
```ruby:qiita.rb
puts 'Hello world.'
```

## メソッド（関数）とは
何らかの処理をさせる命令
上記のコードを例にするとputsの部分
## 引数
関数の後ろに続く記述
メソッドに渡す値を記述する
putsメソッドの引数'Hello, World.'によって、「Hello, World.」という文字列が出力されます。
文字列は、ダブルクォーテーション（"）またはシングルクォーテーション（'）で囲む必要がある。
上記のコードを例にするとHello worldの部分

## ターミナルで結果を表示させてみる
`＄　ruby 記述したファイル名`
![スクリーンショット 2022-05-16 17.43.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280943/5ce43089-5092-af53-0b79-5b0272106d78.png)

## 文字列型（String）と整数型（Integer）
ダブルクォーテーション（"）で囲ったものは、文字列型として扱われる。
囲っていないものは、整数型として扱われる。
```ruby:qiita.rb
puts 4 + 2
puts "4 + 2"
puts "4" + "2"
```
![スクリーンショット 2022-05-16 18.06.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280943/0460f2e8-6b29-337b-f6f4-07a2086a8bdb.png)
文字列型同士が+でつながれた場合、その文字列型を「結合する」処理が行われる。
```ruby:qiita.rb
puts "I" + "am" + "Kazu"
```
文字列が接続された状態になる。

## 文字列型、整数型の型変換
### 何故、型を変換するのか
型が違うもの同士でを足す事ができないため
※単位を合わせるようなイメージで認識しています。
```ruby:qiita.rb
puts "Kazuの年齢は" + ２３ + "です"
```
![スクリーンショット 2022-05-17 16.35.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280943/d158d36f-d905-5499-eb99-6591b2e27279.png)

整数型から文字列型に勝手に変換することはありませんとエラーが表示されてしまう。

### to_s （整数型→文字列型へ変換）
to_sは、整数型から文字列型に変換するメソッド
```ruby:qiita.rb
puts "Kazuの年齢は" + ２３.to_s + "です"
```
![スクリーンショット 2022-05-16 18.55.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280943/34458a69-c8f8-2332-8fbe-413c8dbadda3.png)
しっかりと表示されるようになりました。

### to_i （文字列型→整数型へ変換）
to_iは、to_sとは逆に文字列型から整数型に変換するメソッド
```ruby:qiita.rb
puts 100 + "200".to_i
```
![スクリーンショット 2022-05-16 19.01.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280943/3340df99-c3a4-dbc2-e1eb-e5f2f68c23b1.png)
しっかりと表示されるようになりました。

## 参考文献
Ruby初心者：putsについて
https://qiita.com/hirooza68/items/987fe89da3650d0616a4

今さら聞けない！Rubyとは【初心者向け】｜現役エンジニアが解説
https://techacademy.jp/magazine/6959

Rubyのputsメソッドの使い方を現役エンジニアが解説【初心者向け】
https://techacademy.jp/magazine/19937
シェルスクリプト実行中に一時的に別のフォルダに移動し何かをしたい場合はどうするか（サブシェル SubShellを使う）

かっこ() でサブシェルを実行できます。この中で、一時的に別のフォルダに移動し、何かコマンドを実行させ、終わったら元のフォルダに戻ってくることができます。

```
$ pwd
/hoge
$ (cd /fuga && pwd)
/fuga
$ pwd
/hoge
```


参考

[Temporarily change current working directory in bash to run a command [duplicate]](https://stackoverflow.com/questions/10382141/temporarily-change-current-working-directory-in-bash-to-run-a-command)
AppServiceの接続文字列に騙されるな！

# やりたいこと

環境変数として参照できるように、データベースの接続文字列をApp Serviceに設定したい。

# 簡単やん！

## Azure Portalの設定

[App Service]-[構成]-[接続文字列]からちょちょいのちょいやん！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/edac8bb6-b608-b96a-5f82-27bc2f8fc6e6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/6feb797f-56ac-e29b-ada7-772b3b51b202.png)


## ファイルでの記述

んで、こうしてやればええんやろ

```js
// javascriptの例
process.env.DATABASE_URL
```

# 参照できない

`DATABASE_URL`が見つからない旨のエラーが出てアプリが落ちてしまう。

## なぜか

公式ドキュメントを見ると、AppServiceに設定する接続文字列について以下の記述があります。

https://docs.microsoft.com/ja-jp/azure/app-service/configure-common?tabs=portal#configure-connection-strings

>実行時に、接続文字列は、前に次の接続の種類が付加された環境変数として使用できます。
SQLServer: SQLCONNSTR_
MySQL: MYSQLCONNSTR_
SQLAzure: SQLAZURECONNSTR_
カスタム: CUSTOMCONNSTR_
PostgreSQL: POSTGRESQLCONNSTR_

選択した種類に応じて、キーの頭に特定の文字列が付与されてたからです。

## 解決策

だから、さっきの`DATABASE_URL`は、選択したDB種類が「SQLAzure」なので、こうしないといけなかったんです。

```js
process.env.SQLAZURECONNSTR_DATABASE_URL
```

`.NET`系はうまいことやってくれる(ことが多い)みたいですが、JavaとかNodeとかだと、気を遣って書式をAzureに合わせてあげないといけません。

# おわりに

僕はアプリケーション設定に登録する派です。
KaiCoTrackerっていう、トラッキング知ってる？

# 0.対象読者
 ##### 生物学者 　or　農学者
  運動量を定量的に表したい方に特におすすめ。[DeepLabCut](http://www.mackenziemathislab.org/deeplabcut)(トラッキング界のスタンダード)も良いけど、幼虫にはちょっと。DeepLabCutは処理が重いから、長い動画に向かない。。。
 ##### トラッキング
　YoLoとか物体検知って夢がありますよ。でも、物体検出のモデルから、速度、移動距離出すのって骨が折れますよね。以前、YoLov3でそんなことやっていましたが、途中で挫けました。

# 1.KaicoTrackerとは？
　[KaicoTracker](https://www.biorxiv.org/content/10.1101/2022.05.10.491283v1)は、疋田 弘之(京都大化学研究所)、勝間進(東京大学)氏らによって開発されたカイコのトラッキングの技術です。論文が投稿されたのが2022年5月10日なので、新しく出た技術のようです(2022/05/16現在)。使われているアルゴルズムは、k近傍法という古典的な手法でカイコのトラッキングをしています。

# 2.概論
コードは[GitHub](https://github.com/H-Hikida/KaicoTracker)に公開されています。Githubで、ファイルを落としていただき、以下を実行！
```command
cd KaicoTracker
python3 KaicoTracker.py --input test.avi --autoCrop 4 5
```

これで、出来るはずなのですが、私の環境では出来ませんでした(WebGLがどうとか)。JupyterLab上で実行すると…
```
!python3 KaicoTracker.py --input test.avi --autoCrop 4 5
```
上手くいきました！
![stdout_pointed_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001770/a3b459e9-ad34-fa1a-2865-684d3ba0ac54.gif)

このように追跡してくれます。追跡の結果は、id、total_distance	median_speed、median_duration、frequencyなどと自動で色々返してくれます。
![stdout_positions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001770/6d5716a0-1511-b181-6b91-6a643d66fedf.png)
このようないい感じのグラフが自動で生成されます。

pandasで整形したもの。毎日、カイコをトラッキングして運動量を調べたら面白そう。
![20220516-174844.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001770/2f44744e-1098-4f02-bfe8-576ea4080f87.jpeg)

# 今、家でカイコを飼ってるんです。
農学部で、実習の一環で現在、我が家にカイコがおります。今は、たまごです。ラズパイで定点観測し、動画にして、それをKaicoTrackerで色々見てみようと思います。
初めてのrobocopyで起きたこと

### こんにちは！E-kan株式会社の吉田です！

先日、オンプレサーバー廃止に伴うデータ移行の為にrobocopyを行ったのですが
その時に起きたことをいくつか備忘録的に残しておこうと思います。
内容的には初歩レベルだと思いますがご容赦を…。
![2499816_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656687/9e1923d0-d63f-be9d-4b82-e4f7c00e6fea.jpeg)
なおコピー元のOSはWindowsServer2008 R2です。

### 1.コピー先にrobocopyしたフォルダが表示されない
コピー先にフォルダを作成せずにCドライブを丸ごとrobocopyを実行した結果、完了後に確認してもフォルダが作成されておらず、今度は予めコピー先にフォルダを作成してから実行したにも関わらず実行中、実行後にフォルダ内を確認してもコピーされたファイル等が存在しない状態。

解決方法：フォルダーオプションにて「保護されたオペレーティングシステムファイルを表示しない（推奨）」にチェックが入っていたため。チェックを外すとコピーされたドライブフォルダが表示された。（隠しファイルの表示にチェックが入っていてもこの設定を変えないと表示されない）

### 2.robocopy実行中にコピーのループが発生する
途中までは問題なく実行されていたがログを確認していると急に「AppDate～（以下特定のファイル名のあと再度AppDate～を繰り返す）」が表示されてコピーが進まなくなる。

解決方法：「/XJ」コマンドをつけると問題なくコピーが進む。



こんなところでしょうか…。

まだ作業が残っているのでまたなにかあれば残していこうとおもいます。
ネットワーク管理

## ネットワーク管理
<b><font color = blue>SDN</font>とは、ソフトウェアにより、ネットワーク機器を集中的に制御して、ネットワークの構成や設定を動的に変更する技術の総称。
これを実現する技術が<font color = blue>Openflow</font>。ネットワーク機器の内部にある「経路制御機能」と「データ転送機能」を論理的に分離し、コントローラで、データ転送機能を持つネットワーク機器を集中的に制御するアーキテクチャ。
## インターネットの応用
### URL
<b>Web上で取得したいWebページなどの情報源を示すための表記方法。
詳しくは

https://qiita.com/Un-s/items/8dd1dd63a7a5a80c920e
### CGI
<b>Webブラウザからの要求に対して、Webサーバが外部のプログラムを呼び出し、その結果をHTTPを介してWebブラウザに返す仕組み。

![tcpip47b.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/83f1feef-198a-bb55-41ae-2f9c2d6279bf.gif)
### MIME
<b>電子メールの規格を拡張して、さまざまな形式を扱えるようにした規格。
これに暗号化と署名をする仕組みを加えた規格が<font color = blue>S/MIME</font>。
### メールヘッダ
<b>SMTPでメールを送信する際、メール本文のデータに加えて付加されるさまざまな制御情報。
## 回線に関する計算
<b>通信速度の単位である<font color = blue>bps</font>は、1秒あたりに転送されるビット数を表す。
Ambertoolsの「residuegen」についてのメモ

Ambertools22のマニュアルより。

以下はDeepLによる訳。


>修飾されたアミノ酸やヌクレオチドを調製するのは骨が折れる。複雑なのは、残基は自由に動く分子ではなく、通常は両末端に余分な原子でキャップされる必要があることです。単一コンフォメーションで部分電荷を推定できる「単純な」系では、 前述の prepgen プログラムで「-m」フラグを使用して、 最終的な残基の中にどの原子を残すかを指定します。**residuegen は入力ファイルを読み込んで、 一連の antechamber プログラムを適用し、 prepi フォーマットの残基トポロジーを生成する**もので、 より複雑な環境では residuetopology の生成を容易にします。このプログラムは、アミノ酸、核酸、その他の高分子のアミノ酸的トポロジーの生成にも適用できます。以下に例を示し、入力ファイルのファイル形式についても説明する。

どうやら

* gaussian計算からRESP電荷を計算する
* 取り除くキャップ原子を指定できる
* 上記を行った上でprep(prepi?)フォーマットの残基トポロジーファイルを出力

ということをやるのがresiduegenっぽいですね。
prepgenよりも複雑なことができるみたい。

使い方はインプットを作成した後、

```
$ residuegen ala.input
```

などとします。
で、そのインプット例ですが、

```python
#INPUT_FILE: structure file in ac format, generated from a Gaussian output
INPUT_FILE ala.ac
#CONF_NUM: Number of conformations utilized
CONF_NUM 2
#ESP_FILE: esp file generated from gaussian output with 'espgen'
# for multiple conformations, cat all CONF_NUM esp files onto ESP_FILE
ESP_FILE ala.esp
#SEP_BOND: bonds that separate residue and caps, input in a format of
# (Atom_Name1 Atom_Name2), where Atom_Name1 belongs to residue and
# Atom_Name2 belongs to a cap; must show up no more than two times
SEP_BOND N1 C2
SEP_BOND C5 N2
#NET_CHARGE: net charge of the residue
NET_CHARGE 0
#ATOM_CHARGE: predefined atom charge, input in a format of
# (Atom_Name Partial_Charge); can show up multiple times.
ATOM_CHARGE N1 -0.4175
ATOM_CHARGE H4 0.2719
ATOM_CHARGE C5 0.5973
ATOM_CHARGE O2 -0.5679
#PREP_FILE: prep file name
PREP_FILE: ala.prep
#RESIDUE_FILE_NAME: residue file name in PREP_FILE
RESIDUE_FILE_NAME: ala.res
#RESIDUE_SYMBOL: residue symbol in PREP_FILE
RESIDUE_SYMBOL: ALA
```

使うためには

* gaussian計算を実行し、esp,acファイルを作成
* inputに各種ファイルやN,C末端の境目、全体の電荷、指定したい原子電荷、アウトプットとなるprepファイル名、残基名を記入
* residuegenを実行

となるわけですね。

（P.S.）
すみませんが、詳しい使い方は解読中です。