OmniAICreator/Qiita-1.07M huggingface dataset:
【10分で環境構築】Purview Machine Learning Lineage Solution AcceleratorによるMLリネージ

## はじめに

Microsoftが公開している、Purview-Machine-Learning-Lineage-Solution-Acceleratorと、
私のほうで手順を簡易化した日本語版リポジトリをご紹介します。

`注意：10分は環境構築、初期設定までとなっており、後続のカタログのスキャン、ML処理の実行は4,50分かかります。`

## Purview Machine Learning Lineage Solution Accelerator

GUIでセットアップできるPurviewのリネージサポート対象はData Factory , Synapse Pipeline と双方で提供されるDataflowが中心となっています。

このとき、機械学習、データエンジニアリングで使用される、Python、Sparkをコード実行した場合にリネージが途切れるということが起こります。

こうしたカスタムコードでのデータ処理においても、PurviewのApache Atlas エンドポイントを使用してAPIを通じたリネージ登録が可能です。

下記のリポジトリで提供されるソリューションを使用すると、PurviewのApache Atlas エンドポイントを使用してカスタムアセットを登録することができます。

[Purview-Machine-Learning-Lineage-Solution-Accelerator](https://github.com/microsoft/Purview-Machine-Learning-Lineage-Solution-Accelerator/blob/main/README.md)

全体イメージ抜粋：

![](https://github.com/microsoft/Purview-Machine-Learning-Lineage-Solution-Accelerator/raw/main/Deployment/img/PurviewMLLineageIntroduction.PNG)

## 参考

Purview Machine Learning Lineage Solution Acceleratorで使用されている、Atlas エンドポイントをpythonから簡単に使用できるライブラリです。
Microsoftの方が公開されています。

[PyApacheAtlas](https://github.com/wjohnson/pyapacheatlas)

[pyapacheatlas · PyPI](https://pypi.org/project/pyapacheatlas/)


## 日本語版手順のリポジトリ紹介

### モチベーション

このソリューションアクセラレータ、ものすごく有用なんですが、手順が多いため（10stepくらい）、できる限りコード化して素早く環境をセットアップできないかと考えて、ちょうど勉強していたbicepを使いつつ[DataOps for the Modern Data Warehouse](https://github.com/Azure-Samples/modern-data-warehouse-dataops)を参考にして日本語版を作成しました。


### リポジトリ

以下の通りです。VSCodeのRemote Containerは本当に便利なのでこれを期に試してみてください。
[リンク](https://github.com/ryoma-nagata/Purview-Machine-Learning-Lineage-Solution-Accelerator)

また、なにかうまくいかない点などあったら指摘お願いします。


#### 主な変更
- Step 2. Purview Security Access を自動化
- Step 3. Azure Machine Learning Security Accessを自動化
- Step 4. Synapse Security Accessを自動化
- Step 5. Upload CreditRisk Sample Datasetを自動化
- Step 6. Register and scan uploaded data in Purviewをスキャン登録まで自動化
- Step 7. Upload Assets and Run Noteboksを自動化（一部不具合のため現在別方法で手動手順化


### 更新予定

- variable.json内でService Principal Secretを記載させる仕組みをKey Vaultに保持に変更
- ワークスペースパッケージの不具合改善後の修正反映
- Spark3.xでの構成

## pyapacheatlasのデバッグ方法参考

- help(対象)により、各種メソッドを確認できます。
- client.get_all_typedefs()によりPurviewとの疎通が確認できます
ミルククラウン解析（その１，アニメーション）

# 概要
オープンCAEシンポジウム2021のオープンCAEコンテスト2021に応募したミルククラウン解析の解析結果をコンテストが終了したので、順次公開します。

# アニメーション
上面視
![trangentTopView2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784513/af395186-846b-b733-698c-c4eea799ea7c.gif)

正面視
![trangentSideView2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784513/c05ef2ce-6f33-8647-ad26-3b3a84c923c7.gif)

斜視
![trangentBirdView2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784513/0317408a-5db5-edb0-ac5f-bac67e1c8655.gif)

次回は解析モデルおよび解析条件を投稿する予定です。
FreeBSD 公式サイトめぐり(2021年版)

## 公式*.freebsd.org を見よう(落とし穴注意）
迷ったらググって情報が探すことが多いですが、検索で引っかかった断片的情報をかき集めるより、公式サイトにあるまとまった情報を探ったほうが結局早いということも多いです。やはり「公式のここらあたりになんか書いてあったはず」というのを把握しておくのが大事ということです。
しかし歴史の長いOSなので、古いまま放置(特に日本語ドキュメント)されていたりといったことがありがちなので、そういった落とし穴に注意しつつ、こんな情報源がありますよという紹介を簡単に紹介していきます。

## 一般ユーザー向け
### 公式トップページ www.FreeBSD.org

http://www.FreeBSD.org

全ての基本です。ダウンロードページやドキュメントなどが集まっています。以下で紹介するサイトの多くも、基本的にはこのトップページから飛べるようになっています。
日本語翻訳版は 

http://www.FreeBSD.org/ja/

です。

### www.jp.freebsd.org (FreeBSD友の会)のページは無視
日本の FreeBSD ユーザーには昔からおなじみで、現在でも検索で上位に出てくる 

http://www.jp.freebsd.org

ですが、現在メンテされておりません。
情報も化石級に古いままで、リンクも切れまくった状態です。考古学的な意味でしか参照する意味がないので、現在の情報はwww.freebsd.orgの公式サイトを見てください。
くれぐれもここを見て

`FreeBSD は終わってしまったのか…… R.I.P. `:pray:

などと勘違いしないでください。


### 使い方はハンドブックで

FreeBSDの使い方の基礎を見るならこちら。基礎と言ってもかなり高度なことも書かれているので、迷ったらまず最初に目を通すべきドキュメントだと思います。

日本語版は

https://docs.freebsd.org/ja/books/handbook/


日本語版は英語版の翻訳なので、日本語版で釈然としない場合や古い場合もあるので、そういう場合は英語版を参照してください(ハンドブックは今はそこまで古くは無いと思いますが)。

英語版 

https://docs.freebsd.org/en/books/handbook/

### FAQ に疑問の回答があるかもしれない

わからないことはすでにFAQ（よくある質問集）に回答がまとめられているかもしれません。

https://docs.freebsd.org/en/books/faq/

FAQ の日本語版もありますが、古い状態のまま放置されているので英語版を参照してください。

### オンライン man ページはFreeBSD 以外のシステム(Linux, HP-UX, SunOS)も見られる

https://www.freebsd.org/cgi/man.cgi

オンラインでmanの検索ができるページ。各バージョンの FreeBSD のmanが見られるだけでなく、他のBSD(NetBSD, OpenBSD)やLinux(CentOS, SUSE, Debian)、HP-UX、Solaris(SunOS 5.10 = Solaris10まで)などのmanが見られる。「このコマンドは他OSでどういう動きなのかな？」みたいなことが容易に調べられて便利です。

### 現在進行系な情報が見られる wiki.freebsd.org

https://wiki.freebsd.org/

各ハードウェアやソフトウェアの対応状況や使いかたなど、ハンドブックより広範で進行中な内容が集まっています。

https://wiki.freebsd.org/arm/Raspberry%20Pi

では Raspberry Pi の対応状況やハマりどころのヒントとかが集められています。

https://wiki.freebsd.org/Graphics?highlight=%28%5CbCategoryPorts%5Cb%29

グラフィック対応のプロジェクトのページ。プロジェクトメンバーの紹介や、ドライバの設定方法、残っている問題点などがまとめられています。

### バグ報告
バグを見つけた時にバグ報告や、すでに報告されているバグの検索などは以下のbugzillaサイトで探してみましょう。

https://bugs.freebsd.org/bugzilla/query.cgi?format=advanced

### 意見交換

英語で参加しづらいですが、 以下の The FreeBSD forums が結構活発です。
同じようなことを悩んでる人も多いので、やりとりが参考になるかもしれません。

https://forums.freebsd.org/

## ちょっと開発者向け
私自身が FreeBSD 開発者というわけではないのですが、ユーザーとして中身を知りたい場合に参考になる所です。

### ソースリポジトリ参照

FreeBSDのソース管理は Subversion から git に移行しました。
ソースを取り込むには `git clone https://git.freebsd.org/src.git`すればいいのですが、ちょっとだけソースの中身を参照したいという場合は以下から。

ソースリポジトリの参照

https://cgit.freebsd.org/src/tree/

### ports の仕組みを知りたい

野良portsを作りたいとか、ちょこっと変えたバージョンを作りたいとか、portsをいじりたいときにはこのハンドブックを見れば、ports 特有の Makefile の書き方やmakeのターゲットなどが解説されています。最終的にFreeBSD公式 ports として取り込まれる要件などもわかります。

Porter's Handbook 英語版

https://docs.freebsd.org/en/books/porters-handbook/

日本語版（やや古め）

https://docs.freebsd.org/ja/books/porters-handbook/

### コードレビューの状況

FreeBSDでは修正パッチを作成したら、以下のPhabricatorサイトでコードレビューを受けてからマージされるという流れになっています。新しい機能や修正がどういう経緯で入ったのかがここを見ればわかるようになっています。

https://reviews.freebsd.org/

### 開発者ハンドブック

FreeBSD 開発者としての基本情報がこちら。
ガチ開発者じゃなくても、ベンチマーク取るときの注意点やカーネルダンプのとり方とか、部分的でも勉強になる所が多いです。

https://docs.freebsd.org/en/books/developers-handbook/

### まぁ色々書きましたが

とにかく www.ja.freebsd.org はスルーすることだけ覚えていただければ……。
仮想通貨botterのための論文検索のススメ

# はじめに
UKIです。
今回は論文検索の方法について紹介します。

# 論文検索の目的
まず、なぜ論文検索が必要か？ということを簡単に列挙します。

### 投資戦略を理論武装する
仮想通貨は新興的なプロダクトです。取引主体に占める個人投資家の割合が多く、非効率な取引が存在します。このため、既存の投資理論を持ち込むことで大きな利益を獲得できる場合があります。筆者がこれを感じたのが、マーケットメイク（高頻度取引）に関わる戦略でした。2018年頃の話ですが、株式戦略で体系の出来上がってきた板取引戦略の論文を活用することで、ボットの収益性を向上することができました。

また仮想通貨のプロダクトには金融商品としての設計が拙いものが存在します。通常の金融商品では考えられないようなrebateが設定してあり、デリバティブ戦略を組み合わせて正しく取引を行うことで低リスクで利益を獲得できたりします。

### 投資戦略のアイディアを探す
いくら優秀な人間でも、自分ひとりの考えのみに基づいて戦略構築や検証を行うと局所解に辿り着いてしまい、ブレイクスルーが難しくなることがあります。そんなときは他人のアイディアを参考にすべきです。
論文を読むことで単純な投資アイディアだけではなく、その過程における検証の道筋の建て方や、実際の検証に使う手法も学ぶことができ、自分の持ち札に加えることができます。

### 車輪の最発明を防ぐ
>車輪の再発明（しゃりんのさいはつめい、英: reinventing the wheel）とは、「広く受け入れられ確立されている技術や解決法を（知らずに、または意図的に無視して）再び一から作ること」を指すための慣用句（Weblio辞書より）

自分が閃いたアイディアはとても画期的で斬新なものに感じられると思います。しかし世の中は広いもので、自分の閃いたアイディアは必ずといっていいほどどこか他の誰かも閃いているものです。従って、論文検索によって先行事例の有無を確認すべきです。もしも先行事例があったとしても、それは他の誰かが自分の代わりに途中まで検証を行ってくれたものだとポジティブに捉えることができます。そこから先の探索へ進みましょう。


# 論文検索のやり方
[SSRN](https://www.ssrn.com/index.cfm/en/)を使います。早速サイトにアクセスしてみましょう。

### アカウントを作る
とりあえずアカウントは作っておきましょう。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562749/14691f50-82ba-f5a2-fc0b-4e6c8370f6f0.png)

### 検索する
Advanced Searchを使う方法がお勧めです。クリックしてください。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562749/d2dc1547-2848-1d1e-94a4-dffe1adeb9b1.png)

設定ですが、
(1)検索ワード
検索したいワードを入れます。複数のワードの場合はスペースを入れて入力してください。今回はcryptocurrencyを検索します。

(2)検索範囲
基本的には真ん中のTitle, Abstract & Keywordsでよいです。

(3)検索期間
仮想通貨界隈の変遷は激しいため、直近の論文に絞ることをお勧めします。ここでは直近2年を選択します。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562749/3d0dad3e-0190-38a4-b903-f4522e99cd90.png)

### 検索結果
直近2年で634件もヒットしました。並び順ですが、Download数の多いものから降順で表示されています。上に表示された論文ほどDownload数が多く、たくさんの人に参照されている、ということになります。TOP3の論文は、

- The Best Strategies for Inflationary Times  
（インフレ下における最適な投資戦略）
- Defi and the Future of Finance  
（Defiとファイナンスの未来）
- Tokenized: The Law of Non-Fungible Tokens and Unique Digital Property  
（トークン化: NFTとユニークなデジタル資産の法の在り方）

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562749/b735a019-b7de-f19a-e9c0-638bc623bb81.png)

### 興味ある論文をピックアップする
面白そうな論文が並んでますね！TOP50の中からさらに興味のあるものを1つ選んでみました。

[How Elon Musk's Twitter Activity Moves Cryptocurrency Markets](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3778844)
（イーロンのツイートがどのように仮想通貨市場を動かしたか）

こんなの研究して論文まで出す人がいるんですね！相棒のHohetoがイーロンボットを作っていましたが、自分でバックテストしなくても論文検索するだけで過去の収益性がどうだったか、確認できてしまいます。

![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562749/f1a59e75-2e06-97f6-2724-e6407b540eba.png)

### アブストラクトを読む
我々にはDeepLがあるので「英語が苦手」というセリフはもう使えません。Chromeの拡張機能がお勧めです。翻訳対象の文章を選択してワンクリックで、翻訳が完了します。

![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562749/8fa76fbe-9882-0376-6445-ca8052d892ee.png)


### 本文中のグラフを見る
あとは本文中のグラフだけは見ておきましょう。優れた論文には、一瞥で結論を言い表せるグラフが記載されていると思います（この論文のグラフはイマイチですね）

![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562749/dbec2bff-2531-fbb1-483f-682a1819b362.png)

# おわりに
いかがでしたか？やってみると非常に簡単だということが分かります。
論文検索は非常に地味な作業ですが、積み重ねていくうちに確実に自力が身につくと思います。
読者の皆様も「論文読んだマウント」取れるようになりましょう！
レッツ論文ライフ！
育児していたからこそエンジニアのお仕事に役立ったこと10選

日曜日だけどアドベントカレンダー。
敢えてだからこそ、子育てエンジニアはむしろ強いぞという点を10点書いてみたいと思います。

## Long, long ago.

自分がこどもを持つまで想像も及びませんでした。し、子育て1年目2年目くらいの頃は、「子育てエンジニア」の学びなんてポエム、ライフハック程度のことしか書けないな、と思っていました。あるいは「子育てエンジニア」が弱い存在だという誤解が残っていたのかもしれない。しかし。

## 育児がお仕事に役立ったこと10選

### 1. 時間の使い方に妥協をしなくなる

平日、日中の保育園がどれだけありがたいことか。2020年春の保育園休園時も経験しただけに、園や先生への感謝は計り知れなくなりました。また健康診断、予防接種、各種申請書類、保育園に小児科、、それにプラスしてお仕事しているんですから我々、それだけでも処理能力並外れている証拠ですよね。

[緊急事態宣言が解除されてリモートワークはどうなるのか - 2020年5月子連れ在宅記録 - Qiita](https://qiita.com/e99h2121/items/086822c3f74ebca75364)
[在宅勤務・在宅育児の両立でもやもやが起こる気持ちを図にした｜e99h2121/開発｜note](https://note.com/e99h2121/n/nb0a0122dffac)

### 2. 文書や資料に妥協をしなくなる

「自分が居ないと仕事が回らない状況」をあらゆる手で回避したいと考える結果、たどり着くシンプルな答えとして「文書を残す」「資料を残す」を常に意識するようになりました。当事者意識を持つことも強いです。結果こういう記事もそうですしあらゆる議事録から調査過程、開発ドキュメントなどなど。

[脱ExcelしたいMarkdownテンプレート目次 - Qiita](https://qiita.com/e99h2121/items/97168cad64ff40afb77d)

### 3. 自分より経験のない者の気持ちがわかる

当たり前なのですがチビッコたち、最初は何もできません。ウンチの出し方もわからない赤ちゃんに「おまえは赤ちゃんか！」と何度ツッコミを入れたことか。でもだからこそ彼・彼女らの気持ちが少しはわかるようになりました。結果、自分も育てられてきたんだよなと気づきました。ありがとう両親。当然お仕事でも、新人さんに対する見方が変わりました。これはまた別の日に書きます。

### 4. 部屋を机をデスクトップを片付けられる

いきなり実務的な話になりますが、部屋を片付けることの大事さにシンプルに気づきました。散らかってると踏む。イタイ。自分も怪我をする、チビッコも怪我をする。くわえる。事故る。工数がかかります。同様、PCのデスクトップもフォルダも、机周りも、片付いていることがいかに大事かが分かります。間違えて押す、実行する。もちろんソースコードもだな。


### 5. 健康に気をつけられる

こちらも少々似ていますが、やはり人間身体が資本です。元気で居ることが何より仕事にも好影響だし、気持ちも前向きで居られる秘訣です。チビッコ、保育園で風邪をもらう時はもらいます。そうすると必ず自分にも影響があります。コロナになって一層気が付きました。健康で居ることが仕事の資本です。


### 6. 機能のアイディアが生まれる

さて書いてきたようなことを考えると、どんどん解決したい物事のアイディアが増えます。引き出しも増えます。Alexaにお願いしたいこと、GASで自動化したいこと、保育園だとかちょっとした小児科通いももっとシステムで解決できたら良いのになと言うことありますよね。我々の力がなにか役立ったら良いのにななどとシステム屋さんの端くれとして思います。当事者だからこそ具体的にユースケースに気づけるというのも強い。以下子育てではないが、こういうこと。

https://twitter.com/tokyoossparty/status/1466955417720918025?s=21



### 7. リモートワークにこだわれる

そうした結果、次世代の働き方に敏感になります。これもコロナになった副産物と言ってはなんですが、DX Criteriaにも大きく章立てされているのですよね！もっと学びたい。

https://dxcriteria.cto-a.org/eb628a7972414473b6772cc3a2a28027

### 8. 記事が書ける

さてそうこうしていた結果書けるものが増えました。笑
[リモートワークの目次 2021.11 - Qiita](https://qiita.com/e99h2121/items/f5e9ddef0141fe00259b)


### 9. 生きているだけで自己肯定力が上がる

さらにとても些細なことなのですが一周回って、自分を、こどもを、皆を褒める力がつきました。それでもなにか言ってくるヒトや会社が居たらすすすっと距離を置けばいい、と割り切る勇気も持てました。
本当に、子育て中のパパママみんな神よ。書き溜めてきたメモを貼る

https://twitter.com/e99h2121/status/1447493046862422021?s=20

https://twitter.com/e99h2121/status/1456740109584257028?s=20

https://twitter.com/e99h2121/status/1410004047050919939?s=20

https://twitter.com/e99h2121/status/1448914220725063684?s=20



### 10. 結局、チームで動ける

と、見てきましたが自己肯定などによらず、仲間の話には非常に勇気づけられます。10選も書いてイソップ物語の「すっぱい葡萄」か、やっかみか、ルサンチマンでは？と思う方が居るなら、これらの記事を読んでそれでもそう思いますかだと思います。

https://agile-monster.com/blog/learning-from-parenting/

https://note.com/dora_e_m/n/n996c88c36f61

https://zenn.dev/akinari_ueda/articles/3ec81c9605e732cb7912

https://qiita.com/mgmgmogumi/items/39796757a2cc541b0829

https://adventar.org/calendars/6793

大変なことも当然あるし気分が浮き沈み、もちろんある。が、敢えてこれだけ役立つことあるぞと10選にしてみました。

## Now.

> 子育て1年目2年目くらいの頃は、「子育てエンジニア」の学びなんてポエム、ライフハック程度のことしか書けない

5年経ってみていま「そんなこと全くないぞ」という気持ちのほうが強いです。育児はチームワークだし、人間をモチベートして育てるという学びですね。


https://qiita.com/advent-calendar/2021/programming-education

以上です～。
わたしはなにをつくっているのか

# 1.
　<a href="https://qiita.com/advent-calendar/2021/personal-project">個人開発アドベントカレンダー 2021 </a>の8日目の記事。

# 2.
　振り返りができる日報アプリをつくっている。日々の記録を取るだけでなく、一週間とかそのあたりのスパンで昔作った目標に対して振り返る。そんなことをやりたい。

　やろうとしていることはそこまで難しくないはずだけれど、進捗が遅い。子供が寝てる時間しかPCに向き合えないためだったり、力不足だったりする。でも楽しい。

# 3.
　DBの設計はできて、だいたいの機能は実装できてきた。もうすぐバックエンドが終わる。テストもかかないといけない。

　そうやったらいよいよフロントのほうをつくる。わたしはデザインは得意ではないので考えないことにした。既存の枠組みをたくさん利用する。

# 4.
　サービス名は決めた。

# 5.
　コードはここにある。

　https://github.com/kyokucho1989/simple-record

# 6.
　つくっていると実装方法が分からないことが出てくる。それに対するアプローチを考えるのが楽しい。やりたいことを細分化して、言葉にしていく。そうやってもいいけど、案外ブラックボックスでもなんとかなる。Aを押したらAが出る。あるからある。

　どこまでブラックボックスを許すことができるか、とかいうのは少し難しい課題。

# 7.
　これからもやる
競技プロer に薦める バイオインフォマティクス技術者認定試験

# はじめに
google先生に`競技プログラミング`と尋ねると、`無駄`という検索候補を頂けるありがたい世界に住んでいる競技プロerの皆さん。

[バイオインフォマティクス技術者認定試験](https://www.jsbi.org/activity/nintei/) ってご存知ですか？
# バイオインフォマティクスって？
バイオって~~細菌~~最近は、新型コロナウイルス変異株がどうのとか農作物のゲノム情報がどうのと話題に事欠きませんね。

バイオ技術者は`ウェット`と`ドライ`に大別されるらしい。
## ウェット
ウェットは白衣を着てピペットと試験管を扱うイメージです。
興味のある方は、検索！ ~~[ピペット土方](https://www.google.com/search?q=%E3%83%94%E3%83%9A%E3%83%83%E3%83%88%E5%9C%9F%E6%96%B9)~~
## ドライ
ドライは軽装でパソコンをポチポチしているイメージです。
いわゆる IT ~~土方~~ 技術者です。

うっ、競技プロerに近い！

そのバイオサイエンスのドライ部分を受け持つのがバイオインフォマティクス
[バイオインフォマティクス -- Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%82%AA%E3%82%A4%E3%83%B3%E3%83%95%E3%82%A9%E3%83%9E%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9)
# バイオインフォマティクス技術者認定試験
以上より、バイオインフォマティクスは情報科学分野の比重が高く、認定試験では約4割がITの知識を問うものです。（当社調べ）
## 情報科学分野
```2019年試験問題改題.
マージソートの実行時間としてもっとも適当なものを選べ。
1    Θ(n)
2    Θ(nlogn)
3    Θ(n^2)
4    Θ(2^n)
```
ビッグオー記法って普段見ないですよね。
![20211204a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/1c7078af-4346-3e59-0650-358f3f2c27bb.png)
おっ、数え上げじゃないですか。
![20211204b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/3cdeb9eb-8875-f2a1-a358-75770e4bb4e8.png)
AtCoderにでてきそう。
![20211204c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/64d6ced0-ba2f-9cda-02d0-91caa17e859d.png)
正規表現ってことですよね。
![20211204d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/f9588134-36c1-19c6-1335-a2640b85fc5b.png)
みんな大好き二分探索木。
![20211204e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/a2a0fc11-3afa-5bd7-d856-72170c1b6b10.png)
動的計画法で`TLE`を回避しているんですね。
## 生命科学分野
[過去問](https://www.jsbi.org/activity/nintei/sankou_mondai_kako/) で確認してください。
# 試験について
2020年度より`CBT`試験となっており、受験しやすくなっています。
受験料 5,500円（税込）もそれほど高くなく、試験内容もいわゆる落とす系・絞る系の試験ではなく、人材を育成しようという雰囲気があります。

もちろん日本の公的な試験ですので、[闇](http://buu.blog.jp/archives/51217474.html) が無いわけではないと思いますが、ましな部類と思われます。
# まとめ
+ バイオインフォマティクス技術者認定試験について書きました
+ 受験したところ正答率70%でした
バグを責めても人は責めるな！信頼関係を崩さないバグチケットを書くための3ステップ

# チーム崩壊はふとしたきっかけから
「実装者とQAの対立」なんて言葉を耳にしたことはありませんか？
目的のために協力するのがチームのあるべき姿です。
しかし実装者とQAはしばしば信頼関係を失い、対立や無関心に陥りがちなようです。

時に**クレーム**や**果たし状**に化けてしまうバグチケットは、そんなチーム崩壊の一因になりがちです。
いやいや大袈裟な、と思うかもしれませんが、意図せず組織を傷つけるのがバグチケットの怖いところです。
LMのQAチームが気をつけていることを思い返し、**信頼関係を崩さずバグチケットを書くポイント**を3ステップでお伝えしようと思います。

※この記事ではあくまで信頼関係の話をします。
バグチケットを書く技術についてはいい記事がたくさんあるので、ぜひ探してみてください。

# Step1: 感情を取り除き、理性に絞る

テストに慣れていない場合、もしかしたらこんな感情に埋め尽くされているかもしれません。

喜: どうだ！こんな難しいバグを見つけてやったぞ！
怒: なんでこんなバグ出すんだ！もっと自分でも確認しろ！！
哀: このタイミングでバグが出たら納期に間に合わないよ...
楽: バグ出してバンバン指摘するの楽しいな〜！

そんな時は、バグチケットを書く前に一息ついて感情を整理しましょう。
文面で感情を伝えるのは難しく、ほとんどの場合に誤解を生みます。
バグチケットはあくまで理性的に記載しましょう。

感情に任せて筆を走らせるのはNGです。
どうしても伝えたい感情があるなら直接伝達しましょう。

# Step2: 事実と意見を分ける
感情を取り除き理性に絞っても、対立のタネが実はもうひとつあります。
それが**意見**です。

バグを見つけた時、こんなことを考えたことはありませんか？

- もっとこんな機能があればいいのに
- こう改善されるといいなぁ
- バグの原因は多分あれでしょ！

積極的な方ほど、バグを見つけるだけでなく意見や予測まで考えます。
しかし修正案などの意見を事実と混ぜて記載してしまうと、
読み手は事実と意見の境界がわからず、時に誤解につながります。

なのでまずは事実だけをまとめましょう。
意見や予測は、事実とは切り離されているとわかるように記載しましょう。

# Step3: チケットの渡し方にも配慮を
ステップ２まで来れば、あとはチケットを実装者に渡すだけです。
しかしここにも落とし穴があります。

- 口頭で感情が滲み出たり、
- 相手の余裕を超えた提案をしてしまったり...

せっかくチケットの質が高まっても、対面で誤解を生んでは元も子もありません。

とはいえバグチケットを渡すのは、テストを長くやっていても未だに難しいと感じます。
通知を自動化したり、実装者が自らチケット確認する時間を設けたりと、**チケットを口頭で渡す機会を減らす**方が楽に問題を解消できるかもしれません。

# バグを責めても人は責めるな
３つのステップに共通して大事なのは**バグを伝える目的を意識すること**です。
目的はあくまで顧客価値に向いているべきで、人を責めても問題は１つも解決しません。
顧客価値を下げるバグを責めることで、チームの信頼関係を守っていきましょう。

この記事は[モチベーションクラウドシリーズアドベントカレンダー2021](https://qiita.com/advent-calendar/2021/mcs)の5日目の記事です。
10年ぶりに情報処理技術者試験を受けて、変わったところ変わらないところ。おじさんも資格を取ると良いことある！

# 伝えたい事：おじさんこそ資格を取るべき！

## 問題（現状とあるべき姿とのギャップ）
おじさんは若者に、会社として必要な資格を「取れ！」と言ったり、「若いうちに取ったほうが良い！」とか言う。
しかし、言っているおじさん自身がその資格を取っていないことも多く、「言うだけ？」みたいな空気が流れる。

## 課題（ギャップを埋めるためにやるべきこと）
おじさんも資格を取る！おじさんもチャレンジしている姿を見せ続ける！


### おじさんの受験前の状況

- 入社20年以上
    - そのうち通信業界で7,8年程度
- 今も通信業界

ただ、おじさんになり、直接機器設定する機会は少なくなった。というかほぼ無い。

##### 10年以上前に以下資格を取得
- 2005年　ネットワークスペシャリスト
- 2009年　情報セキュリティスペシャリスト
    - セキュスペは苦戦した思い出だが、昔過ぎてどれくらい苦戦したか思い出せ無い。。

その後2011年にプロフェクトマネージャーを受けようとしたが、東日本大震災で延期。その後再受験せず。それ以降チャレンジから遠のく。。
2020年に約10年情報処理技術者試験を受けていない事実に気が付く。


### 10年ぶり受験を思い立ってから合格までの道のり

##### 2020年11月頃
- ふらっと立ち寄った書店で、一度断念したプロマネを受けることを決める！
- 「春4月」と記載されている以下問題集（紙）を購入
    - 「ALL IN ONE パーフェクトマスター プロジェクトマネージャ 2021年度 」

この時点でIPAのWEBサイトを見る意識無し。情報処理技術者試験を受けるなら、まずIPAのWEBサイトを見たほうが良い。
https://www.jitec.ipa.go.jp/

##### 2020年12月末
- コロナ渦の影響でスケジュールが変わり、春期試験にプロマネが無いことを知る。。
- しょうがないので「ITストラテジスト」に変更し、問題集（紙）を購入
    - 「2020年度版 ALL IN ONE パーフェクトマスター ITストラテジスト」

ITストラテジストはプロマネに近いという理由から「ITストラテジスト」を選択。


##### 2021年2月申込

##### 2021年4月受験　⇒合格
- 10年前と変わらず問題用紙を回収されないのは嬉しい
- 選択問題の回答は、その日の夜に分かる。
- 記述問題の合否は時間がかかる。2か月かかる。2ケ月は長い。10年前と変わらず合格発表遅い。。


その後秋期試験も申し込み、プロマネを受験。現在結果待ち。 ⇒合格！


### 勉強方法

- とにかく買った問題集1冊を全部やる。1冊をやるだけで十分。
    - 問題集はちゃんとしているので、1冊をじっくりやるのがおじさんに向いている！

「ALL IN ONE パーフェクトマスター」の問題集は私にはあってた。また紙の問題集を毎日持ち運ぶことで、情報処理技術者試験を常に意識しつつ、持ち運ぶことを無駄にしたくないので、「1日1問」程度でも毎日問題に触れるようにした。

- 午前Ⅱ　問題集の問題を解くだけで十分
- 午後Ⅰ　問題集を踏まえて1つ得意な分野を作る
    - コスト、品質、納期　etc
- 午後Ⅱ　問題集を踏まえて1つオリジナルのシナリオを作る
    - 過去問の解答を組み合わせてシナリオを作る
    - 1つ自分の軸を作ることが重要。その軸があれば派生で何とかなる。午後Ⅰの問題と答えを自分で作るイメージ。


- 午前Ⅰ
    - 今回買った問題集だけでなく、午前Ⅰの問題は別になっている問題集が多い。
    - 私はWEBや過去問で十分と思っていたが、6割ギリギリだった。

個人的には午前Ⅰが一番難しく感じる。幅広い分野、知らない内容は勘も当たらない。序盤の問題ムズイ、計算めんどい。
そのため、午前Ⅰ用の問題集を買うべき。なによりも午前Ⅰに不安があるとその後の試験に集中できない！
（午前Ⅰが6割未満だと、それ以降の答案は採点されない。「採点されないかも」と思いながら試験に臨むのはしんどい）

ただ「6割以上正解で合格」は、最近のベンダー資格やクラウド資格が「7、8割以上正解」という状況の中、ゆるい！6割以上正解は1冊の問題集を解くだけでいける！

また、セキュリティやIT関連は、毎回同じような問題が多いので点を取りやすい。


### 10年前との違い
##### 変わらない！10年ぶりに受験しても問題の内容はそれほど変わっていない！

- 選択問題は変わらない。
- 記述問題は今どきのクラウドやIoT等の話題もあるが、あくまでもそれは問題のシチュエーションで、問われている部分は変わらない。
    - 記述問題は自分の得意分野を選ぶ、もしくは得意分野に無理矢理よせる！



### おじさん目線の良かった点

- 周りに良い刺激を与えられる！
    - ちょっと「おっ」と思われる。
    - 「このおじさんやるな！」「負けてられない」と思われるのは嬉しい。
- 会社から報奨金を自分だけでなく、周りにも還元できる！
    - 当たり前だが、給料以外の収入は単純に嬉しく、次につながる。
    - 報奨金をネタに周りにおごることができる。報奨金だと思うと懐の痛みも少なく、コミュニケーションの活性化につながる！

- 単に以下、自分のためだけでも十分価値ある！
    - 知識の整理
    - 自分のレベルを測る一つの物差しとなる
    - またチャレンジしたくなる！
diskpart によるパーティション削除方法 

#diskpartを利用してパーティションを削除する方法を紹介します。

パーティションを結合したい時に「ディスクの管理」から「ボリュームの拡張」で拡張したいところですが、拡張したいパーティションと未割り当ての領域の間に別のパーティションがあると拡張できません。
隣接してれば拡張できるため、間のパーティションを削除したいところですが、回復パーティション等の特殊なシステム関連のパーティションは「コンピュータの管理」から削除ができません。
そのようなときは「diskpart」を使って削除します。

#####diskpartとは？
コマンドによってドライブの管理をするツールです。WIndowsに標準搭載されています。
https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/diskpart

#####手順 
1-1.Windowsの検索から”diskpart”と入力し、検索結果からdiskpartをクリックし、起動します。

1-2.diskpartが起動したら"list disk"と入力し「Enter」を押して、使用しているディスクの一覧を表示します。

1-3.ディスクの一覧が表示されたら削除したいパーティションがあるディスクの番号を確認し、"select disk X"と入力後、「Enter」を押します。（"X"は削除したいパーティションのあるディスクの番号）
※「ディスク X が選択されました」とコンソールに表示されればOK！
<img width="600"　alt="C__Windows_System32_diskpart.exe 2021_12_05 3_30_47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1888192/8dc477ee-87ca-d7aa-f15e-5f524f292976.png">
1-4."list partition"と入力後、「Enter」を押してパーティションの一覧が表示します。

1-5.削除したパーティションの番号を確認し、"select partition X"と入力し、「Enter」を押します。（"X"は削除したいパーティションの番号）
※「パーティション X が選択されました」とコンソールに表示されればOK！

～次のコマンドを実行すると削除されます。今一度削除してよいパーティションか確認しましょう～
1-6."delete partition override"と入力し、「Enter」を押します。
※正常に削除しました。と表示されればOKです。
<img width="600"　alt="C__Windows_System32_diskpart.exe 2021_12_05 3_49_40.png src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1888192/f04855f8-302c-0c56-fd18-f718f95ffe60.png">

以上です。
似た顔のFANZA女優を顔写真から検索出来るサンプルを用意するのに苦労した

この記事は [驚異のFANZA女優検索](https://fanza-actress-bust-search.azurewebsites.net/) Advent Calendar 2021 の 5 日目の記事です。

#URLを指定して顔検索出来るようにしたが、顔写真のURLを入力するのは手間がある
似た顔のFANZA女優をURLを指定して検索出来るようにした。ただ、この機能を使いたいというモチベーションがある人ならURLを入力して使ってくれると思うが、物見遊山で来てみた人はパッを顔検索したいが顔写真が思いつかない場合、わざわざタブをもう1個立ち上げて、誰か顔検索したい人の名前で顔写真を探して、そのURLをコピーして、戻ってそのURLを貼るというのはやらないかもしれない。ましてやそこまでやって元画像が何らかの原因で顔検索の対象とならなかった場合などは、もうその時点でやる気がなくなるのが大多数だと思う。

#サンプルを用意すれば、とりあえず顔検索を1回は使ってもらえる可能性は上がる
自分はそれなりに面白いと思った機能で、それなりにはこだわって、それなりにコストをかけて作った。で、あるからには当然多くの人に使ってほしい。１度使ってもらって気に入らないのはしょうがないとしても、１度も使わずにトラブルで使ってもらえないのは避けたい。トラブルを避けるためにも先ずサンプルがあればとりあえず使ってもらうことは出来る。だからいくつかのサンプル画像を用意しておくのは必須だと思った。サンプルを使って顔検索すればそれ自体がチュートリアルになる。これでやり方が分かって使ってくれる可能性は上がると思う。

#有名人をサンプルに使う
さてサンプルとして顔写真を用意するのであれば、最初に考えるのは有名人を並べておくのだと思う。特に人気女優や自分の好きなアイドルと似た顔のFANZA女優を検索できるのは面白そうだと思ってもらえると思う。ただここで大きな問題がある。女優の顔写真を置くのは法律的にどうなんだろうということだ。正直そんなサイトは一杯あると思う。例えばTwitterのアイコンに本人でもないので顔写真を使っている例なんてそれこそめちゃありそうだし。そういう人らをわざわざ糾弾したいとは思わないし、法律を守っていることが非常に大事だとも思ってない。が、自分的にNGとなっていることに関して避けられるなら避けたいという気持ちはある。ということで有名人をサンプルに使うのは止めた。

#フリー素材をサンプルに使う
次に考えたのは、フリー素材をサンプルに使うことだ。フリー素材のサイトは世の中に一杯あるが、顔写真が大きく映っている画像はそんなに多くない。その中でも人物の無料利用に関して、かなり良心的に公開してくれているサイトがある。それが[ぱくたそ](https://www.pakutaso.com/)だ。自分は知らなかったが、[モデルリリース](https://www.pakutaso.com/modelrelease.html)を読むとフリー素材であってすら人物は気軽に使うと問題になるケースもあるらしい。そういう意味でもこのサイトの素材を使うのは色々安心なので、[モデル](https://www.pakutaso.com/model.html)のページから何人ものモデル画像の写真をサンプルとして作ってみた。で、念のため[利用規約](https://www.pakutaso.com/userpolicy.html)を読み直してみた。すると禁止事項に気になる一文があった。これ自分のサイトに使うなら完全にアウトのやつだった。
> アダルト（R18）/風俗/性的描写/宗教/麻薬/ストライキ/デモ/反発団体/ドラッグ/ナイトサービス/出会い系サービス（婚活/マッチング/出合い系情報/インターネット異性紹介事業届出業者/その他、出会い系サービスと運営者が判断する場合）などの利用

今まで気づいていなかった、画像の利用に関して殆どのサイトでアダルトはNGだった。考えてみれば当然で利用規約の雛形を見てみても禁止事項にアダルトの表記は書いてある方が普通だ。そして多くの場合外すことにはデメリットしかない。わざわざそれを外すのは強い理由がいる。そうなると殆どのサイトの規約にアダルトNGて書いてあるのは当然のこととなる。つまり自分のサイトでは、ほどんどの無料画像は使えない。こうなってくると選択肢は激減する。

#ディープラーニングでサンプルを作る
色々調べているとディープラーニングを応用したGAN(敵対的生成ネットワーク)という技術により、存在しない人物の顔写真を作成できるサイト[Generated Photos](https://generated.photos/)というのがあった。[アイドル自動生成AIを開発](https://datagrid.co.jp/all/release/33/)とか、[ThisPersonDoesNotExist.com](https://thispersondoesnotexist.com/)というAIが架空の人物の写真を生成するサイトもある。こういう技術を使えばモデルリリースなんて考えなくて良いのでは？と思った。ただ、Generated Photosは無料で使えない。そして英語サイトだし、有料で購入した場合でもアダルトサイトで使えるはよく分かっていない。というかトラブった時とか日本のサイト以上に話がややこしくなるかなと思った。自分でゼロから作れないかなと思ったけれど結構ハードルは高めだ（少しずつ勉強はしているが）。仮に覚えたとしても時間はかかりそうだなと思った。

#作品をサンプルに使う
他のサイトの画像をサンプルに使うのは現実的に厳しい。そうなると自分のサイトの画像をサンプルに使うしかない。DMM Webサービスで取ってきた作品の画像であれば問題はない。そこで作品のパッケージをサンプルとして置こうと思って、どの作品を選ぶか精査していた。ここでポイントとして驚異のFANZA女優検索はアダルトサイトではあるが、TOPページは年齢認証の対象外にしている。そして今回の顔検索も対象外にしている。つまり、このページはアダルト表現のある画像は基本置けない。そうなるサンプル画像として使える作品が極端に少なくなる。そもそも9割方の作品の画像は服を着ていない。たまに着ていてもタイトルがNGだったりする例も多い。そういう意味で適切なサンプル画像はかなり少なかった。

#FANZA作品以外の動画のパッケージをサンプルに使う
少ないなりになんとか10作品を選んで、サンプルとして置いてみた時に突然思いついた。FANZAの作品はアダルト以外にもある。DMMにあるアイドルの作品であればDMM Webサービスで取得でき、それを自分のサイトに置くことは既にDMMに認められている。これなら何にも接触していないと思う。というわけで紆余曲折したが、最終的に[おすすめアイドル一覧](https://www.dmm.com/digital/idol/-/actor/)からピックアップしたアイドルの作品をサンプルとして並べた。これは作っている自分の年齢もあると思うが、 話題の注目アイドルは知っている人が殆どいなかったが、おすすめアイドルは知っている人も結構居たので、おすすめアイドルから選んでいる。使うユーザーによっては殆ど知らないということもあるとは思うけれどまあここは自分の好みということで。
リハビリとしてpythonでウラムの螺旋をつくったよ

#背景
しばらくpython触ってなかったし、ウラムの螺旋の描画をpythonでリハビリがてらやってみるか～
画像化とかまではやってなくて、cmdでウラムの螺旋を表示させるだけです。
#ウラムの螺旋とは
[ウラムの螺旋 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A6%E3%83%A9%E3%83%A0%E3%81%AE%E8%9E%BA%E6%97%8B)
詳しいことはwikiに書いてあるので、要約。
1から始まる数字を反時計回り螺旋状に並べていって素数だけを表示させると、なんとなく規則性の有りそうな模様っぽくなるよ。不思議だねというお話。
#環境
Python 3.9.9
sympy(素数判定がめんどくさかったので)
#本題

```python:run.py
from sympy import sieve

class Ulam():

	def input_data(self):
		self.n = int(input("螺旋の大きさ(n*n):"))

	def create_map(self):#マップ配列を0で初期化
		self.map = [[0 for j in range(self.n)] for i in range(self.n)]

	def print_data(self):#マップを表示
		for i in range(self.n):
			for j in range(self.n):
				print(self.map[i][j],"\t",end="")
			print()

	def init_map(self):#中心に1、メンバ変数にその座標を代入、
		odd_num = 0
		n_slash_2 = int(self.n/2)
		if self.n % 2 == 0:
			self.map[n_slash_2][n_slash_2-1] = 1
			self.current_point_i = n_slash_2
			self.current_point_j = n_slash_2 - 1
		else:
			self.map[n_slash_2][n_slash_2] = 1
			self.current_point_i = n_slash_2
			self.current_point_j = n_slash_2

	def spiral_adding(self):
		loop_num = 0#カレントループ回数
		progress_num = 1#進める数　上下処理後に1増える
		spiral_num = 1#螺旋の数字

		while True:
			loop_num += 1
			if spiral_num >= self.n * self.n:
				break

			if loop_num % 4 == 1:#右
				for _ in range(progress_num):
					if self.current_point_j >= self.n - 1:#次の螺旋に行かないように制御
						continue
					spiral_num += 1
					self.map[self.current_point_i][self.current_point_j + 1] = spiral_num
					self.current_point_j += 1
			if loop_num % 4 == 2:#上
				for _ in range(progress_num):
					spiral_num += 1
					self.map[self.current_point_i - 1][self.current_point_j] = spiral_num
					self.current_point_i -= 1
				progress_num += 1#上処理後に進む数を増やす
			if loop_num % 4 == 3:#左
				for _ in range(progress_num):
					spiral_num += 1
					self.map[self.current_point_i][self.current_point_j - 1] = spiral_num
					self.current_point_j -= 1
			if loop_num % 4 == 0:#下
				for _ in range(progress_num):
					spiral_num += 1
					self.map[self.current_point_i + 1][self.current_point_j] = spiral_num
					self.current_point_i += 1
				progress_num += 1#下処理後に進む数を増やす
	def print_ulam(self):#素数をアスタリスクに置き換えて表示
		for i in range(self.n):
			for j in range(self.n):
				if self.map[i][j] in sieve:
					print("* ",end="")
				else:
					print("  ",end="")
			print()

def main():
	ulam = Ulam()
	ulam.input_data()
	ulam.create_map()
	ulam.init_map()
	ulam.spiral_adding()
	ulam.print_ulam()
main()
```

なんとなくコメントが付いてるのでコメント読めば大体わかりますが、一応流れを説明。
ulam.input_data()で螺旋の大きさを入力させて、ulam.create_map()でその数だけゼロで初期化したマップ（二次元配列）を生成します。次にulam.init_map()で一番真ん中の値を1にして、ulam.spiral_adding()で数字の螺旋を生成。最後にulam.print_ulam()で素数だけアスタリスクに置き換えて表示。
すごくオブジェクト指向オブジェクト指向してるけど特に意味はないです。
#あとがき
ウラムの螺旋は、東野圭吾の危険なビーナスを読んでたら出てきて、作ってみたくなったので作りました。
螺旋の方向転換があんまりうまくかけなかったな～とか思った。ウラムの螺旋を作った人はたくさんいると思うので参考にしたいと思います。
cmdで表示するのはお手軽だけど、画像化までやったらいい感じになると思うのでやったほうがいいかもね。
Getopt::Longのスペルが覚えられない俺はとうとう覚える努力を放棄してラッパーを作った

# Getopt::Long − この便利だが悩ましいモジュール

[Getopt::Long](https://perldoc.perl.org/Getopt::Long)という便利なモジュールがある。

コマンドラインにおける`perl myscript.pl --input input.txt --output output.txt`みたいなパラメータの処理を宜しくやってくれるモジュールである。こいつを組み込んだだけで、なにか自作スクリプトのグレードが2段階ぐらい上がったような錯覚を覚える。俺はそういう錯覚が大好きである。したがって俺はこのモジュールの機能のことはとても気に入っている。

しかしその反面、俺はこのモジュールに非常に大きな不満を抱いている。
それは、大文字と小文字がごちゃごちゃ混在していることと、単数形と複数形がごちゃごちゃ混在していることだ。

![getoption.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383429/f372d2cc-3d3f-ed5f-45fc-0e5ef0cd0dd6.png)

もうね、スクリプトを組むたびに、あれ、getopt::Longだっけ？ Getopts::Longだっけ？ getOpt::Longだっけ？ と悩むわけですよ。

その状況を10年以上も続けて、どうやら俺は大文字と小文字の使い分けが超絶苦手であるとの事実を受け入れざるを得まいと悟ったわけだ[^uc]。
正しいスペルが覚えきれないし、さらにいえば俺はシフトキーと言うやつが大嫌いだ。getOpぐらいのところで指がつりそうになる。

もう全部小文字にしてくれ。あと単数形一択に変えてくれ。…と本家に頼み込んでも受け入れてはくれまいから、自分用のwrapperを作って解決することにした。

[^uc]: だから俺は[キャメルケース](https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%83%A1%E3%83%AB%E3%82%B1%E3%83%BC%E3%82%B9)だのパスカルケースだのといった邪悪な命名法は絶対使わない。

# 名付けて`arg.pm`

以下に示すコードを`arg.pm`として適切なディレクトリ[^inc]に放り込むと、スクリプト中で`use arg;`できるようになる。
そう。`use Getopt::Long;`という長ったらしいコードを打つ代わりに、`use arg;`で事足りるのである。素晴らしい！
さらに、`GetOptions(...`の代わりに`argv(...`または`arg(...`である。大文字フリー！ シンプル！ 快適！

[^inc]: `perl -le 'print for @INC'`すると表示されるディレクトリのいずれかである。
```
use strict;
use warnings;
use Getopt::Long;
use Data::Dumper;

sub argv{
  my(%x)=@_;
  my %opt; my @dl;
  foreach my $key (sort keys %x){
    my($key1, $desc) = $key=~/(\S+)?(?:\s*(.*))?/;
    my($k,$k2,$t)    = $key1=~/(([^=]+)(?:=(\S+))?)/;
    $opt{$key1}         = $x{$key};
    ($t) or       $t = "s";
    my $t2 = ($t eq 's')?'string'
            :($t eq 'i')?'integer'
            :($t eq 'f')?'floating point value':'';
    push(@dl, "--$k2:\ttype=$t2. $desc");
  }
  (defined $dl[0]) and (not defined $opt{help}) and $opt{help}=sub {print join("\n", @dl), "\n"; exit()};
  GetOptions(%opt);
}
*arg = *argv;
1;
```

## 使い方は簡単

Getoptions()のラッパーなので、基本的にこの関数の使い方に準拠する形でarg()を使うことになる。

```
arg(
  "input=s"  => \$input,
  "output=s" => \$output
);
```

## 簡易ヘルプ機能も追加

ここまでで済ませても良かったのだが、なにかプログラムを作ると機能拡張しないと気が済まない性格でして。コマンドラインオプションの使い方を簡易にユーザに知らしめる「ヘルプ機能」をつけてしまった。具体的には次のように使う。

```
arg(
  "input=s Input file name" => \$input,
  "output=s Output file name" => \$output
);
```

このように、Getopt::Long互換なパラメータ文字列の後ろに、スペースを挟んで当該オプションの説明を書くのだ。すると、arg()内の細工により、`--help`オプションが自動的に追加される（ただし、すでに明示的にhelpオプションが設定されている場合、この処理は抑止される）。

こんな感じで使える。

```
perl ~/work/testarg.pl --help
--input:	type=string. Input file name
--output:	type=string. Output file name
```
perldocを使うのが正道であるが、あれはちょっと大げさだからね。コマンドラインオプションの説明が一切示されないのも困るが、かといっていちいちperldocの独特の文法と格闘したくもない、という状況は少なくないと思う。そういうときにこの機能は便利であろうと考えている。
Bottomナビゲーションバーのiconを透明化したりテキストを隠す方法

##Bottomナビゲーションバーのiconを透明化する方法を書いていきます

東京でニートしてる仕事乞食です
プログラミングも記事投稿も初心者なんで
動物園で動物を憐れむかのように
見守ってください

Bottomナビゲーションバーはiconを入れないとエラーになるんですがiconを使いたくない場面もあると思います

そんな時に使えるのがこれ


```
bottomNavigationBar: BottomNavigationBar(
            onTap: (index) {},
            //icon　透明化
            //  selectedIconTheme: const IconThemeData(opacity: 0, size: 0),これと
              unselectedIconTheme: const IconThemeData(opacity: 0, size: 0),これ
          ),
```
これが
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475511/b813e328-9366-4291-1317-b90dbddbd374.png)
こう
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475511/a59ceb14-fba4-7923-b25f-7d7c6bc96816.png)

#非選択時にテキストを隠したい場合
```
bottomNavigationBar: BottomNavigationBar(
            onTap: (index) {},
            showSelectedLabels: true,選択しているタブのテキストの表示をtrue,falseで変える
            showUnselectedLabels: true,非選択時のタブのテキストの表示をtrue,falseで変える
          ),
```
非選択時のタブのテキストを消すコードを実際にやってみる

```
bottomNavigationBar: BottomNavigationBar(
            onTap: (index) {},
            showSelectedLabels: true,
            showUnselectedLabels: false,非選択時テキストの表示を隠す
          ),
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475511/21ab0c76-4092-0f1d-03c8-639b789f3247.png)

##最後にiconを隠すコードとテキストを隠すコードを合わして押されたテキストが飛び出てるように見えるようにしてみる


```
bottomNavigationBar: BottomNavigationBar(
            onTap: (index) {},
            //非選択時icon透明化
              unselectedIconTheme: const IconThemeData(opacity: 0, size: 0),非選択時のiconを透明化してサイズも0にする
            //タブのテキスト
            showSelectedLabels: true,選択時のテキストを表示
            showUnselectedLabels: false,非選択時のテキストを非表示
          ),
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475511/a1e324c3-bcc8-5b03-3184-bca1879fb15b.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475511/868b468a-621c-6fd8-2bdf-cc1d617f0ee0.png)

#終わり
初投稿で気づいた事

###多分教えるの向いてない
日常生活においても伝わってると思い込んで説明を省略しがち
まぁ気長に備忘録感覚で投稿励んでいきます

#~~ここまで見ていただいた方に感謝します~~
LINE+Electronで自作CommentScreen

![62b280daa87a497249288362293971bd.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539781/a0b8c473-2a4e-b989-7bfd-72120dfd566b.gif)

## はじめに
会社の勉強会での発表時にCommentScreenのアンケート機能を使おうとしたところ、
無料プランだとアンケートが1Roomにつき1つしか作れないと初めて知り、
なら自作してしまえ！とLINEを使って作ってみました。

## LINE
LINE側については、単純に受信したメッセージをWebsockで横流しするだけなので、
LINEBot作成経験ある人であれば5分もあれば余裕なレベルですね。

```main.js
const plotlib = require('nodeplotlib');
const line = require('@line/bot-sdk');
const express = require('express');
const app = express();
const http = require('http').Server(app);
const io = require('socket.io')(http);
const PORT = process.env.PORT || 3000;
const bodyParser = require('body-parser');
const message_function = require('./message.js');
app.use(bodyParser.json());
let _good = 0;
let _bad = 0;

// Line設定値
const config = {
    channelSecret: 'xxxxxxxxxxxxxxxxxxx',
    channelAccessToken: 'xxxxxxxxxxxxxxxxxxx'
};
const lineApiClient = new line.Client(config);

io.on('connection', function (socket) {
    console.log('接続確認');
});

// 動作確認用Get
app.get('/test', (req, res) => res.send('Hello World!(GET)'));

// WebhookFromLine
app.post('/msg', function (req, res) {
    console.log(req.body.events);

    if (req.body.events[0].type === 'message') {
        const { type, text } = req.body.events[0].message;
        if (type === 'text'){
            if (text === 'アンケート'){
                lineApiClient.broadcast(message_function.questionary());
            } else if (text === '好きに投票') {
                _good++;
            } else if (text === '嫌いに投票') {
                _bad++;
            } else if (text === '集計') {
                Totalization()
            } else {
                io.emit('msg', text);
            }
        }
    }
    res.status(200).json(req.body);
});

// アンケート集計
function Totalization() {
    const data  = [
        {
            type: "pie",
            values: [_good, _bad],
            labels: ["好き","嫌い"],
            textinfo: "label",
        },
    ];
    plotlib.plot(data);
}

http.listen(PORT, function () {
    console.log('server listening. Port:' + PORT);
});
```

### アンケート機能
Flex Messageでの回答フォームとNodePlotLibで集計結果を表示させるようにしました。
今回はとりあえずでtextの特定文言で発火するようにしましたが、発表者用リッチメニューを用意しておくと使い勝手が良さそうです。

![445d476ff5446c4fe68122316c2d3097.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539781/c9242155-dc69-efb1-7ee0-6592bff5f6c7.gif)
![2050bca134322162d701888a332a182f.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539781/446fced0-9b9e-80cc-7be9-3fb82576f139.gif)

## Electron
subscribeして取得した文言をチャットのように表示していくところまでは動作確認して、さてどうやって文字を流すのかなと調べたところ、
まったくドンピシャでやりたいことを説明してくれている記事があったのでこちらを参考させていただきました。
- [Slack + Electron + Socket.ioを使ってニコニコ動画風にメッセージを表示する](https://qiita.com/tonio0720/items/bd6362d27084738bbfe2)!

## さいごに
とりあえずアンケートの集計結果表示は改善したいなと感じております…。
コロナが落ち着いてオフラインでの発表の機会がまた増えてくるのであれば、発表者用のリッチメニューを作って、片手にスマホ持ったままワンタッチで操作できるので楽そうだなぁと感じました。
また参加者が普段CommentScreenを使ったことない場合、LINEの方がアンケート回答等が直観で操作できるのもメリットかなと思いました。
prologで四則演算とJavaScriptの文字列足し算を実装とかを書いてみる。

Prologは言語実装の実験するのに最高なので四則演算のインタプリタを作ってみますよ。

## モチベーション

なんか、youtubeの放送を見てて唐突にやる気が出た。面白いのだけど、低レイヤー勢にもPrologを使ってほしいと思ったんです。はい。
[自作ブラウザを拡張する作業配信 - JavaScriptインタプリタをつくる #low_layer_girls](https://www.youtube.com/watch?v=-Fcc6lQqF9Y)

## SWI-Prolog インストール

```bash
brew install swi-prolog
apt install swi-prolog
```

などでインストールできます。

## 構文:

```prolog
e ::= i | e+e | e-e | e*e | e/e. % 式
v ::= i. % 値
```

## 評価規則と実行

```prolog:eval.pl
eval(I,I):-integer(I),!.
eval(E1+E2,I):- eval(E1,I1),eval(E2,I2), I is I1+I2.
eval(E1-E2,I):- eval(E1,I1),eval(E2,I2), I is I1-I2.
eval(E1*E2,I):- eval(E1,I1),eval(E2,I2), I is I1*I2.
eval(E1/E2,I):- eval(E1,I1),eval(E2,I2), I is I1 div I2.
:- eval(1+2+3+4,R),writeln(R),R=10.
:- halt.
```

実行してみます。

```bash
$ swipl eval.pl
10
```

## 評価規則と実行(2)

PrologのアトムはLispのシンボルみたいなもので、JavaScriptの文字列の代わりにアトムを使って足し算の規則を追加してみたいと思います。

```prolog:eval.pl
eval(I,I):-integer(I),!.
eval(X,X):-atom(X),!.
eval(E1+E2,I):- eval(E1,I1),eval(E2,I2),!,
    (integer(I1),integer(I2)->I is I1+I2;format(atom(I),'~w~w',[I1,I2])).
eval(E1-E2,I):- eval(E1,I1),eval(E2,I2),I is I1-I2.
eval(E1*E2,I):- eval(E1,I1),eval(E2,I2),I is I1*I2.
eval(E1/E2,I):- eval(E1,I1),eval(E2,I2),I is I1 div I2.
:- eval('12'+34,R),writeln(R),R='1234'.
:- eval(12+34,R),writeln(R),R=46.
:- halt.
```

実行してみます:


```bash
$ swipl eval.pl
1234
46
```

できましたー。以上です。

## バックトラック使ってさらに美しく

```prolog:eval.pl
eval(E1+E2,I):- eval(E1,I1),eval(E2,I2),!,
    (integer(I1),integer(I2)->I is I1+I2;format(atom(I),'~w~w',[I1,I2])).
```
の規則はバックトラックを使うと以下のように分けてかけます:

```prolog:eval.pl
eval(E1+E2,I):- eval(E1,I1),eval(E2,I2),integer(I1),integer(I2),I is I1+I2.
eval(E1+E2,X):- eval(E1,V1),eval(E2,V2),format(atom(X),'~w~w',[V1,V2]).
```

こちらの規則の方が美しいですが、遅くなります。
美しいものには棘があるわけですよ。

## まとめ

さらっとPrologでJavaScriptっぽい四則演算の処理を書いてみました。慣れれば、5分くらいで書けると思うのでLTでサクッと書いてみてはいかがでしょうか？
Notionのシンプルテーブルで列や行を移動する

アルプ株式会社でエンジニアをしています、集約のエンティティ@pictinyです。
これは[Notion Advent Calendar 2021](https://qiita.com/advent-calendar/2021/notion) 4日目のエントリです。
3日目は[Notionでソシャゲを管理してみたら捗った話](https://qiita.com/kazuki_natu/items/65bd92e048303b0dc9fd)でした。

# シンプルテーブルの列の移動
シンプルテーブルの列を入れ替えたいことがあります。

シンプルテーブルの列のヘッダーの上部あたりをマウスオーバーするとブロックのメニューのような6つの点が表示されます。
この点をドラッグして左右に動かすと、列を移動させることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/59943e67-be91-caac-f7c7-dc4672ce00c8.png)

# シンプルテーブルの行の移動
行のヘッダーの左部あたりをマウスオーバーすると、同じように6つの点が表示されます。
この点をドラッグして上下に動かすと、行を移動させることができます。

![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/c2c6252e-4ba1-ee6b-0ca7-dfd748c6ee4c.png)

# まとめ
シンプルテーブルはマウスで簡単に整形できるので便利ですね。
改行だけでプログラムが書ける言語を作った

改行だけでプログラムが書ける言語を作ったので紹介します。チューリング完全です。

## 仕様

この言語の実態は Brainf*ck の命令の置き換えです。CR (Carriage Return) と LF (Line Feed) のいずれかの 3 つの組み合わせを 1 つの命令として解釈します。そのため名前を CRLF\*ck としました。

## 特徴

改行コード (CR, LF) のみでコードを記述されるため、ソースコードの見た目は真っ白になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1291112/37f4a3fc-c0e2-1fd6-edd8-2e1b21767143.png)

### 利点

- ソースコードの見た目がスッキリしている
    - エディタに背景画像を設定している場合、コードの可読性を下げる設定を行うことなく背景を楽しめる
- コード量を行数で測る人にマウントを取れる
    - Hello Worldでも500行を超えるがそもそも改行の概念が怪しい

### 欠点

- コードが~~見づらい~~見えない
- コードが非常に縦に長くなる傾向にある
- 改行コードが統一されるエディタでは編集が不可能
- 一般的なキーホードで入力が不可能

### Whitespace との比較

CRLF*ck と類似の言語に [Whitespace](https://ja.wikipedia.org/wiki/Whitespace) があり、この言語は Tab と Space, LF によってプログラムを記述します。主要な相違点は以下のようになります。

- **使用している文字**: Whitespace が Tab, Space, LF を使用するのに対し、CRLF*ck は CR, LF を用いる
    - CRLF*ck の方が使用している文字数が少ないため、より少ないキー数で記述が可能
    - Whitespaces のほうが平均命令語長が短い
- **命令の記述方法**: CRLF*ck が Brainf*ck をベースとしているのに対し、Whitespace は独自の命令記述方法を採用している
    - CRLF*ck のほうが学習コストが低い
    - Whitespace は定数リテラルや加減乗除などを扱うことができ、コードの記述が容易であり、より実行効率の良いコードを記述することができる
- **コメントの記述**
    - Whitespace はスペースが単体で命令であるためコメント内にスペースを用いることができない
    - CRLF*ck は改行以外自由に用いることができるため単一行のコメントを自由に記述できる
- **コードの美しさ**
    - どちらも一見何も見えないという点では同一
    - Whitespace は同じ行に Tab, Space が入り混じっている
    - Whitespace は任意の場所に改行を挿入できない
    - CRLF*ck はすべての行が 0 文字で統一されている

## まとめ

以上より CRLF*ck が機能性や学習コストの面で優れた言語であることがお分かりいただけたと思います。その一方でテキストによって記述された言語であるにも関わらず一般的な環境で入力が不可能である点など解決すべき点も存在します。

ちなみに友人には Whitespace より邪悪と言われました。~~でかい Enter キー買って左手で CR 、右手で LF を打てるようにしよう~~

ソースコードは [GitHub](https://github.com/Tsukina-7mochi/crlfuck) 上で MIT ライセンスで公開されています。
Proxmox VE 7でPCIeのパススルーをする(覚書)

ProxmoxVEでVM上のWindows10でNVEncを使う必要ができたのでGPUをパススルーした時の覚書。
個人でネット調べながらやったことなので参考程度に
ちなみに私自身はIntelのCPUでやっているのでAMDの人はごめんなさい自分で調べてみて。

##VT-Dの有効化
こればっかりはマザーのベンダーによって違うので何とも言えない。
そもそも使おうとしているマザーやCPUがVT-Dに対応しているかどうかを確認したほうがいい。

ついでにSATAのホットプラグをできるようにしておいた。サーバーとして使っているPCなので一応

##grubにIOMMUの記述を描く
まずはgrubを編集してintel VT-dを有効にする。

```
$nano /etc/default/grug
```

おそらく中には下記のようなことが書いてあるので


```
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet "
GRUB_CMDLINE_LINUX=""

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"
```


``GRUB_CMDLINE_LINUX_DEFAULT="quiet "``の行に``intel_iommu=on iommu=pt video=efifb:off``を追記する

```
#変更前
GRUB_CMDLINE_LINUX_DEFAULT="quiet "

#変更後
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt video=efifb:off"
```

###詳細
``intel_iommu=on``は言うまでもなくiommuを有効化する記述
``iommu=on``はLinux側からアクセスしないようにする記述
``video=efifb:off``はNvidiaのグラボでよく起きるError43を起きないようにするためのおまじない

##モジュールの記述
``/etc/modules``にひモジュールを書いていく

```
vfio
vfio_iommu_type1
vfio_pcie
vfio_virqfd
```

##ブラックリストに記述
``/etc/modprobe.d/``にLinuxから読み込まないモジュールを書いていく

```
blacklist pcspkr
blacklist radeon
blacklist nvidia
blacklist nvidiafb
blacklist amdgpu
blacklist vfio
```

ほかにもサウンドカードなどパススルーするにあたってLinuxに読み込んでほしくないモジュールを書いていく。

##grubの更新とinitramfsの再生成

```
#grubの更新
$update-grub

#initramfsの再生成
$update-initramfs -u
```

##終了
これで再起動した後web上のUIからPCIeのデバイスを追加したら起動できるはず
bitcoinjsでニーモニックコードの語数を変えて生成する

# はじめに

目新しさはないですが、ブロックチェーンプログラミング初心者向けにニーモニックコード(mnemonic code)のプログラミング入門など

# bitcoinjs

bitcoinjs-libはbitcoinjsの中のひとつのリポジトリでして、bitcoinjsの中に、bip39リポジトリがあります。

https://github.com/bitcoinjs/bip39

READMEで大体わかりますが、ランダムなニーモニックを生成してみましょう。

```getMnemonic.js
const bip39 = require('bip39');

function getMnemonic() {
    const mnemonic = bip39.generateMnemonic();
    return mnemonic;
}

const mnemonic = getMnemonic();

console.log(mnemonic);
```

↑こう書いて↓実行すると

```bash
node getMnemonic.js
```

```
outside picnic course town old below jewel upgrade cricket elephant mesh smart
```

12語で出力されます。ニーモニックを晒すのは危険です。この記事に書いてあるニーモニックは絶対に使わないでくださいね。

24語で出力したいときは、

```getMnemonic.js
const mnemonic = bip39.generateMnemonic(256);
```

と書いてあげましょう。

↓24語になりました。

```
biology welcome illegal crunch warm know oval physical meat cigar color air game impulse proud enroll worry brand nose spirit cart exclude ozone already
```
どうなっているかというと、bip39のソースを見てあげましょう。

https://github.com/bitcoinjs/bip39/blob/5faee2c17b2195f30b03cb125df68c20d7dd584b/src/index.js#L139#L146

```index.js
function generateMnemonic(strength, rng, wordlist) {
    strength = strength || 128;
    if (strength % 32 !== 0) {
        throw new TypeError(INVALID_ENTROPY);
    }
    rng = rng || randomBytes;
    return entropyToMnemonic(rng(strength / 8), wordlist);
}
```

generateMnemonicの引数の数値はエントロピーの強度なのですが、ルートシードのビット数になります。

128以上、32の倍数である必要があり、最小値の128ビットだと、ニーモニックは12語、
256ビットだとニーモニックは24語です。

なお、あまり使われないけど18語のニーモニックコードは192ビットを与えてあげます。

```getMnemonic.js
const mnemonic = bip39.generateMnemonic(192);
```

```
raw check shallow drastic decrease lake turtle sheriff garage impact glove tail true that huge ask stay join
```

なお、使えるビット数は128, 192, 256ビットの3つで、512ビットなどは使えません。

理由についてはどこかで深掘りしていきたいと思います。

今回はこの辺で。
Tcl whileクイズ!

Tclの不可解な挙動にハマって、しばらく悩んじゃったネタを使ってクイズやりま～す。

「え？全部答えいっしょやろ」と思ったあなた！
私と同じレベルですね ;-p

ちなみに私は第一問と第二問の違いを理解するのに1日半かかりました (^^;

この記事は「Tcl/Tk Advent Calendar 2021」の第三日目なのですが、当カレンダーが埋まることはまぁ無いので、クイズの回答は後日のネタにとっておきます(笑)

# 第一問: 以下の記述は無限ループである。〇か？✖か？エラーか？

```Tcl
set i -2
while {[incr i]} {
    puts $i
}
```

# 第二問: 以下の記述は無限ループである。〇か？✖か？エラーか？

```Tcl
set i -2
while [incr i] {
    puts $i
}
```

# 第三問: 以下の記述は無限ループである。〇か？✖か？エラーか？

```Tcl
set i -2
while "[incr i]" {
    puts $i
}
```

# 第四問: 以下の記述は無限ループである。〇か？✖か？エラーか？

```Tcl
set i -2
while \[incr i] {
    puts $i
}
```

# 第五問: 以下の記述は無限ループである。〇か？✖か？エラーか？

```Tcl
set i -2
while {\[incr i]} {
    puts $i
}
```

# 第六問: 以下の記述は無限ループである。〇か？✖か？エラーか？

```Tcl
set i -2
while "\[incr i]" {
    puts $i
}
```

# 第七問: 以下の記述は無限ループである。〇か？✖か？エラーか？

```Tcl
set i -2
set c {[incr i]}
while $c {
    puts $i
}
```

# 第八問: 以下の記述は無限ループである。〇か？✖か？エラーか？

```Tcl
set i -2
set c "[incr i]"
while $c {
    puts $i
}
```

# 第九問: 以下の記述は無限ループである。〇か？✖か？エラーか？

```Tcl
set i -2
set c {\[incr i]}
while $c {
    puts $i
}
```

# 第十問: 以下の記述は無限ループである。〇か？✖か？エラーか？

```Tcl
set i -2
set c "\[incr i]"
while $c {
    puts $i
}
```
Next.js + Apollo Client + Hasuraのテンプレート

## リポジトリのURL
https://github.com/sawasaki-narumi/next-template

## 構成要素
* TypeScript
* next.js(React フレームワーク)
* apollo/client(graphql クライアント)
* graphql-codegen(graphqlAPI を呼び出すコードを生成する)
* hasura(graphql サーバー)
* PostgresSQL(DB、graphql バックエンドとして使用)
* eslint(lintツール)
* prettier(コードフォーマッター)

## 初回準備
* `yarn install`
* `VS Code`に以下のextensionを追加
  1. ESLint
  2. Prettier

## 使い方
1. `yarn run dev`でnext.jsのサーバを起動
2. `docker-compose up`でhasuraとPostgresSQLを起動
3. `yarn hasura console --project hasura`でhasuraのGUIコンソールを起動

## TypeScript
* tsファイルの中で、`@`で`src/`以下にアクセスできる 
  * 例: `import hoge from "@/libs/hoge"`

## next.js
* `pages`ディレクトリを削除し、`src/pages`と`src/components`を追加

## VS Code
* 保存時にコード整形が行われる
対数を求めるプログラム

　僕は、数学が苦手なのでどうにかプログラムに計算をやらせたいと思い、今回は数学の中でも誰しも理解に苦しんだ「log(対数)」を求めるプログラムを作ってみました。

#ソースプログラム＆実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301718/d0843e2a-5e15-1219-551a-40eff29953d0.png)

　まず考えとしては、入力した実数になるまで何回２乗したのか、それが分かれば対数を求めれるのではないかと考えました。
　実行結果のとおり、４や１０２４といった２進数の場合では正常に動いているのですが、３や１０００といった対数を求めた時に小数点以下が出てしまう値では正確な数字がでませんでした。
　実行してみて、ループした回数を求めるプログラムなので整数以下は確かにでないと思いました。そもそも、対数とは普通の数で表すことができなかったから「log」という表し方ができたわけであって、それを回数で求めるには無理があるのではないかと考えてしまい、当主が途方に暮れていたのですが、調べたところ対数を求める関数があると知り、実行してみました。

#ソースプログラム＆実行結果＜改＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301718/8d8e32cc-8458-936e-4091-16092bd1f561.png)

　これはすごいですね。前よりもスマートですし、前のプログラムでは出なかった小数点以下の数字もしっかり表示されています。やはりプログラムは素晴らしいと思います。
　ですが、正直少し心残りがあります。確かにこのlog関数を使えば簡単に解くことはできますが、できれば前のプログラムの考え方のままどうにか小数点以下まで表示するプログラムを作りたかったのが本音です。しかし、それを表現する方法は僕の頭の中では思いつくことはできませんでした。そもそも、このプログラムでは対数の底を２とする答えしか求めることができませんし、logの前につく数字が出てきた時の対応ができていないなど、不備が沢山見受けられます。
　**なので、この投稿をみたプログラマーさんの中で我こそは作れるという方がいましたら、是非コメントしていただけると嬉しいです。**

#最後に
　アドベントカレンダーを通して、改めてプログラムの難しさと面白さを実感できました。今の自分は人に教えてもらうことしかできませんが、勉強を重ねて１人でもプログラムを組めるようなプログラマーになりたいです。なにより苦手な数学と向き合うことができたので良かったです。
ゲームで使う乱数をつくる

# はじめに
ゲームを作るとき、Ｎ個の自然数で重複しない乱数列を作りたい時がありますよね。
昔BASICで書いたものを思い出して、C言語で書いてみました。
高速でメモリ使用量も少ないシンプルなプログラムかと思います。

# サンプルコード
こんなコードで実現できます。

```getrands.c
#include    <stdlib.h>
#define     swap(type,a,b)   {type __tmp=a;a=b;b=__tmp;}

// 1～numまでの重複しない乱数を作る関数
void getrands(int *numbers, int num){
    int i, n;

    for( i=1; i<=num; i++ ){
        numbers[i] = i;
    }
    for( i=num; i>1; i-- ){
        n = rand() % i + 1;
        swap(int, numbers[i], numbers[n]);
    }
}
```
見たままですが、動作を説明すると
(1) 1～num の値を配列にセットする。
(2) i=num とする。
(3) 配列の i 番目の要素と i 以下の乱数番目の要素の中身を入れ替える。
(4) i を 1 つ小さくして、i が 1 より大きかったら (3)に戻る。
(5) i が 1 になったら終了。

例として num=75 の時に乱数が決まっていく様子を図１に示します。
numbers[75] から順に値を決めていき、最後に numbers[2] の値が決まれば終わりです。
i=2 に例示したように乱数 n と i が一致する場合もあります。
この時本来 swap は不要ですが、条件分岐は遅いことが多いので常に swap 動作するプログラムとしています。

**図１．乱数が決まっていく様子**
![getrands.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259516/d0c0d76a-0673-dbd7-612c-b2ac33cf9bea.jpeg)


**呼び出しプログラムの例**

```main.c
#include	<stdio.h>
#include	<time.h>
#define		RNDMAX	75
void getrands(int *numbers, int num);

int main(void){
	int	i, numbers[RNDMAX+1];

	srand((unsigned int)time(NULL));
	getrands(numbers, RNDMAX);
	for( i=1; i<=RNDMAX; i++ ){
		printf("%d%s", numbers[i], i==RNDMAX ? "\n" : ", ");
	}
	return	0;
}
```

**実行結果の例**

```
6, 11, 44, 60, 45, 20, 5, 69, 41, 15, 8, 63, 10, 9, 42, 19, 64, 39, 71, 23, 7, 73, 21, 35, 49, 50, 30, 74, 36, 27, 28, 62, 43, 38, 40, 70, 17, 24, 59, 47, 68, 33, 67, 13, 53, 55, 61, 37, 26, 1, 18, 25, 48, 54, 65, 29, 16, 3, 51, 31, 66, 22, 57, 12, 72, 14, 56, 32, 58, 52, 34, 46, 75, 2, 4
```
# 余談
学生時代にビンゴゲームを作る際に考えたアルゴリズムが元になっています。
ググってみると *[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%83%E3%82%B7%E3%83%A3%E3%83%BC%E2%80%93%E3%82%A4%E3%82%A7%E3%83%BC%E3%83%84%E3%81%AE%E3%82%B7%E3%83%A3%E3%83%83%E3%83%95%E3%83%AB)* に同じアルゴリズムが紹介されていました。「リチャード・ダステンフェルド」さんが1964年に紹介されたアルゴリズムと同じです。自分のは車輪の再発明ですね。
ところが、*Fisher–Yates shuffle* が先にあって、ダステンフェルドさんのはその改良とみなされるようです。シビアですね。特許なら別の特許として通りそうです。
こういう情報がググれるようになってからは自分でいちいち考えなくて済むようになりましたが、車輪の再発明と恐れずに自分で考えてから答え合わせのつもりでググるのも楽しいものですね。

#おわりに
頻繁に車輪の再発明される便利なアルゴリズムのご紹介でした。
リーチしやすさの向上に、また何かのヒントに一役買うことができたら幸いです。

### 免責事項
本記事の正確性については努力しておりますが、当方は利用者が当記事の情報を用いて行う一切の行為について何ら責任を負うものではありません。本記事の情報の利用、内容によって、利用者にいかなる損害、被害が生じても、著者は一切の責任を負いません。ご自身の責任においてご利用いただきますようお願いいたします。

### 商標について
本記事に掲載されている商品またはサービスなどの名称は、各社の商標または登録商標です。
【Rails】newメソッドとbuildメソッドの使い分け方【初学者の疑問点を簡潔に解説】

## はじめに
　本記事は、プログラミングの学習を始めて1ヶ月の初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## 今回の疑問点
　今回の疑問点は、

　　_`new`と`build`の使い分け_
　
　です。　

 　以前、フォロー/フォロワー機能の実装の際に出てきて`newメソッド`との使い分けについて疑問を抱きました。
　今回、調べて見てわかったことをまとめます。
## 疑問点についての解説

###結論
　インスタンスを生成するメソッドという点では共通しているが、モデルの関連付けの際には`build`を使用する。

###buildメソッドの記述方法
　モデルの関連付けの際に使用すると記載しましたが、アソシエーションの状況によって記述の仕方が異なるようです。

####アソシエーションが1対1の場合

```
@user = User.new
@card = @user.build_card
```
アソシエーションが1対1の場合には、`build_関連付けのメソッド名`と記述します。

####アソシエーションが1対1の場合
```
@user = User.new
@card = @user.build_card
```

####アソシエーションが1対多の場合
```
@user = User.new
@card = @user.cards.build
```
アソシエーションが1対多の場合には、`関連付けのメソッド名.build`と記述します。

####アソシエーションが1対多の場合
```
@user = User.new
@group = @user.groups.build
```
アソシエーションが1対多の場合には、1対多と同様に`関連付けのメソッド名.build`と記述します。


## まとめ
最後にポイントをまとめます。

- buildアクションはモデルの関連付けの際に使用する。
- buildアクションの記述方法は以下の通り。
 - アソシエーションが1対1：`build_関連付けのメソッド名`
 - アソシエーションが1対多又は多対多：`関連付けのメソッド名.build`