OmniAICreator/Qiita-1.07M huggingface dataset:
AOJトライに関する知識知見の記録共有：Volume0-0055

# タスク概要

Sequence

https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0055
 
# コード実装例
TIPS

1. 例外処理含む評価パターンを追加
1. 計算誤差比較例を追加

```Python
import pprint, sys, time

def core(arg, adv=True, n_item=10):
    a = arg[0]
    s = arg[1] if len(arg) >= 2 else 0
    if adv:
        d = pow(3, int(n_item / 2))
        odds = [d / pow(3, i) * pow(2, i) for i in range(int((n_item + 1) / 2))]
        evens = [2 * d / pow(3, i) * pow(2, i) for i in range(int(n_item / 2))]
        r = (sum(odds + evens) * a) / d
    else:
        cnst = 3 * (1 - pow(2 / 3, int(n_item / 2))) / (1 - 2 / 3) + pow(1 / 3, int(n_item / 2))
        r = a * cnst
    ret = [r, abs(r - s)]
    return ret

def app(*args):
    ret = []
    for arg in args:
        s = []
        for adv in [True, False]:
            st = time.time()
            try:
                r = core(arg, adv=adv)
            except Exception as e:
                r = e
            s.append([adv, round(time.time() - st, 6), r])
        ret.append([arg, s])
    return ret

print(sys.version)
pprint.pprint(app(
    # basic examples
    [1.0, 7.81481481],
    [2.0, 15.62962963],
    [3.0, 23.44444444],
    # additional examples
    [-1.0],
    # exceptional examples
    "例外入力"
))
```

# 実行結果
各種補足情報出力（入力値FB、デバッグログ等）含む

```Python
3.8.10 (default, Jun  2 2021, 10:49:15) 
[GCC 9.4.0]
[[[1.0, 7.81481481],
  [[True, 1.5e-05, [7.814814814814815, 4.814815213194379e-09]],
   [False, 1.9e-05, [7.818930041152263, 0.004115231152263199]]]],
 [[2.0, 15.62962963],
  [[True, 8e-06, [15.62962962962963, 3.703704010149522e-10]],
   [False, 1e-06, [15.637860082304526, 0.00823045230452557]]]],
 [[3.0, 23.44444444],
  [[True, 7e-06, [23.444444444444443, 4.444441259465748e-09]],
   [False, 2e-06, [23.456790123456788, 0.012345683456786105]]]],
 [[-1.0],
  [[True, 1.1e-05, [-7.814814814814815, 7.814814814814815]],
   [False, 2e-06, [-7.818930041152263, 7.818930041152263]]]],
 ['例外入力',
  [[True,
    1.3e-05,
    TypeError("can't multiply sequence by non-int of type 'float'")],
   [False,
    4e-06,
    TypeError("can't multiply sequence by non-int of type 'float'")]]]]
```

# 補遺
残課題（Pull Request絶賛募集中！）

1. 実行速度の改善（枝刈り、データ構造の見直し等）
閏秒（leap seconds）

こんにちは。
閏秒履歴情報を glibc （最新版）から得てみました。

* この方法では 2008年以前のみが得られるようです。

```console
$ ./leapseconds.sh
Leap    2008    Dec     31      23:59:60        +       S
Leap    2005    Dec     31      23:59:60        +       S
Leap    1998    Dec     31      23:59:60        +       S
Leap    1997    Jun     30      23:59:60        +       S
Leap    1995    Dec     31      23:59:60        +       S
Leap    1994    Jun     30      23:59:60        +       S
Leap    1993    Jun     30      23:59:60        +       S
Leap    1992    Jun     30      23:59:60        +       S
Leap    1990    Dec     31      23:59:60        +       S
Leap    1989    Dec     31      23:59:60        +       S
Leap    1987    Dec     31      23:59:60        +       S
Leap    1985    Jun     30      23:59:60        +       S
Leap    1983    Jun     30      23:59:60        +       S
Leap    1982    Jun     30      23:59:60        +       S
Leap    1981    Jun     30      23:59:60        +       S
Leap    1979    Dec     31      23:59:60        +       S
Leap    1978    Dec     31      23:59:60        +       S
Leap    1977    Dec     31      23:59:60        +       S
Leap    1976    Dec     31      23:59:60        +       S
Leap    1975    Dec     31      23:59:60        +       S
Leap    1974    Dec     31      23:59:60        +       S
Leap    1973    Dec     31      23:59:60        +       S
Leap    1972    Dec     31      23:59:60        +       S
Leap    1972    Jun     30      23:59:60        +       S
```

```leapseconds.sh
#!/bin/sh
GLIBCV=2.34
GLIBC=glibc-$GLIBCV
GLIBCTAR=$GLIBC.tar.xz

cd "$(mktemp -d)" || exit
wget http://ftp.gnu.org/gnu/glibc/$GLIBCTAR 2> /dev/null
tar -Jxf $GLIBCTAR
grep ^Leap "$GLIBC"/timezone/leapseconds | tac
```

#### 最新補足
最新までを補足・追加しますと：

```console
Leap    2016    Dec     31      23:59:60        +       S
Leap    2015    Jun     30      23:59:60        +       S
Leap    2012    Jun     30      23:59:60        +       S
```
【初心者】プログラミングを大学で初めて学んでぶち当たった壁

大学で初めてプログラミングという世界を知りました。1年半勉強してきて思った感想として、「難しい」が真っ先に出てきます。

入学時は、パソコンをまともに使うのも初めてでした。

わからないことだらけで、記憶がリセットされて人生をもう一度生きなおしている感覚がしました。

この記事ではProcessingという初学者向けのプログラミング言語を学んで気づいた、「ここが特に難しかったな～」と思う点を挙げていこうと思います。これからプログラミングを学ぶ方の参考になれば幸いです。

ここでは、Processingを学んで感じた主な問題を挙げていきます。



##processingをインストール、翌日には消えてる

大学１年の春学期はprocessingというプログラミング言語を使って授業を受けました。（Javaを簡単にしたようなモノ）

しかし、インストールした翌日、PC上のどこにもprocessing.exeがない。

動揺したが、質問する場所も人もいない。家族は全員パソコンに疎いので聞くこともできませんでした。

yahoo知恵袋でアカウントを作り、初めての質問。

どうやら、セキュリティソフトがprocessing.exeを違法なアプリであると勘違いして削除してしまったらしい。

セキュリティソフトの除外設定をすると、ようやく治りました。

##エラーとの闘い
ようやくprocessingを使えるようになったはいいものの、そこからはプログラミング学習という死闘が待ち受けていました。

エラーは英文で書かれており、中々馴染めませんでした。

````
Syntax error, unexpected end of method
ArrayIndexOutOfBoundsException: 6
"VariableDeclarators" でエラー
Not expecting symbol 0x3000, which is IDEOGRPHIC SPACE.
Type mismatch, "float" does not match with "int"
NullPointerException
This method must return a result type of ...
その他色々
````

これらは翻訳して読めれば良いものの、下のような理不尽なエラーもありました。


![picture_pc_3cc4368b7bee61af0077bcfb0ced7d33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727635/be2e60b4-9c10-c652-9380-c71a65372ce6.png)

####セミコロンならつけてるだろ！！！！！！！

####そして何で"）"に波線がついている？？！！


エラーメッセージの内容と実際のエラーが違うことがよくありました。

実はこのエラー、8行目に全角スペースが入っています。

全角スペースを使ってしまった時は毎回、このエラーに苦しめられました。

（全角入力の状態でも、shift+spaceで半角スペースを打てるみたいです）


##クラスの理解

クラス（オブジェクト指向）の概念については何度同じ授業動画を見ても、何度資料を見返しても、何度ノートにまとめても、何度実際にプログラムを作ってみても、中々理解できませんでした（多分今でも理解できてない）。

授業でも、クラスを使った課題については提出期日までの1週間、毎日作業をしてやっとできたものもあります…

これからもモノを作って、クラスが理解できる日が来ることを待ちます…


##カタカナ文字との格闘

エディタ、コンソール、デバッグ、コンパイル、オブジェクト、ディレクトリ、メンバ…

入学当初はこれらカタカナ文字が授業資料に羅列されているのを見て、**「日本語で書け！日本語で！！」**と今でも感じながら勉強しています。

忘れる度にネットで調べる始末。


##StringとCharの違い

Stringは「”」で囲み、Charは「’」で囲むという決まり（？）

これに気づかず、同じエラーに数日ハマり続けていました。



#終わりに

以上。思い出したらまた書き足します。

そもそもプログラミングがうまい、天才と呼ばれている人達はこんな問題にハマるのでしょうか？
自分のプログラミングへの適性のなさを感じます…

ありがとうございました。
Ethereum の History Expiry について

# History Expiry とは？

Ethereum のノードが、トランザクション、ブロック、イベントログなどの最新1年のデータのみを保存するというアイデア。

これにより、コードの複雑さが軽減され、ノードのストレージ要件が軽減され、より分散化への道が開かれる。

# History Expiry 関連の提案

2 つの提案がある。これらは排他的なものではなく、両方とも実施可能。

- Eth 2 マージ後、数ヶ月〜1年でマージ前の PoW チェーンのダウンロード/提供を停止する
- 最新1年のデータのみを保存する（[EIP-4444](https://eips.ethereum.org/EIPS/eip-4444)）

# History Expiry 提案の背景

Ethereum クライアントは現在、チェーンの検証に必要のない 275 GB の履歴データを保存している。その数は、年間約 140 GB の割合で増加している。

履歴データの使用法は 2 つある：

- 同期
    - 完全同期： ジェネシスから、すべてのブロックをダウンロードし、チェーンの先頭に到達するまで実行する
    - ステートの同期： ヘッダーのみを同期し、最新のブロックのステートをダウンロードする
- ユーザーのリクエスト

どちらの場合も、クライアントは P2P ネットワークを介して履歴データを要求する。この信頼モデルでは、ジェネシス・ステートを信頼し、他のすべてを完全に検証するか、PoW チェック（検証するためのハッシュ値）で検証する。

PoS ではこれが変わる。ロングレンジ攻撃を避けるため、「WS（Weak Subjectivity）チェックポイント」が作成される。WSチェックポイントを使うと、クライアントは、P2P ネットワークを介して履歴データを要求するブートストラップ的な手順をスキップできる。これで同期のための古い履歴データは不要となる。

古い履歴データを要求するユーザーのリクエストについては、外部のプロトロルなどによって解決できる。

# History Expiry 導入後、古いデータを保存するエンティティは？

- Etherscan などのブロックエクスプローラー
- [The Graph](https://thegraph.com/) のような外部プロトコル
- [The Portal Network](https://github.com/ethereum/portal-network-specs) のようなサブプロトコル
- ボランティアノード

Etherscan などのブロックエクスプローラや、The Graph などの外部プロトコルは、それぞれのビジネスモデルを考えると、過去のデータを表示することに金銭的なインセンティブがあるかもしれない。
The Portal Network のような内部プロトコルは、ノードが全履歴の小さな部分を保持することを容易にする。
また、一部のボランティアノードは、純粋な利他主義から全履歴データを保持することがある。

# これらエンティティの潜在的なインセンティブは？

- 外部の報酬
- プロトコル内の報酬
- 利他主義（他人の幸福や利益を図ることをまず第一とする考え方）
- 評判

新しいブロック報酬などのプロトコル内の報酬は、完全な履歴データを持つノードを実行するユーザーにインセンティブを与えるように設計されている場合がある。
Dapps から支払われる外部の報酬は、The Graph のようなインデクサーのインセンティブになる可能性がある。また、例えば、そのようなノードを実行する人に与えられるユニークな NFT / バッジ など、評判が機能する場合もある。
純粋な利他主義から、これらのノードを実行するユーザーもいるかもしれない。

注：これらのインセンティブメカニズムはすべて、まだ研究中である。最終的な結果は、コミュニティの貢献によってもたらされるだろう。

# 参考
- https://twitter.com/etherscan/status/1468595219734175759?s=20
- https://www.reddit.com/r/ethereum/comments/qzvsfq/impromptu_technical_ama_on_history_expiry/
- https://twitter.com/lightclients/status/1462576121153654785
リリースに当たりQAが担保すべきこと

#はじめに
[こちらの記事](https://qiita.com/gomez_te/items/a93ca86af0d39d34ff20)でも触れられていますが、
スマートフォンゲームをリリースするにあたり
QA担当者は**リリースして問題ない品質であると保証する**ことが必要です。
今回私は2つのプロダクトリリースに関わりましたが、
それぞれQAとしての状況や、残課題を可視化してリリース承認者に報告する機会がありました。
実際に報告の形式や相手などは会社により様々だと思いますが、
**QAが守らなくてはならないこと、伝えなくてはならないこと**
は共通だと思うので、その点について詳しく記載してみようと思います。
これからアプリのリリースを控えているQA担当者の参考になれば幸いです。
#定量的な報告内容
紹介した記事で記載されていますが、以下の三つは報告が必要です。

| 報告内容    　| 詳細                     | 
|:----------|:--------------------------------|
| **テストケースの実行状況** | **予定していたテストケースが完了している。またはその目途が立っている　　　　　　　　　**|
| **不具合のオープン・クローズ件数状況** | **発生不具合がすべて解決している。またはその目途が立っている**|
| **直近の不具合検知状況** | **アプリの品質が安定しており、新規不具合が発生していない**|
これらがすべてOKであれば、基本的には**アプリをリリースして問題ない品質**であると言えます。
以降でそれぞれの内容の詳細に触れていきたいと思います。


#1.テストケースの実行状況
既にケースが完了している状況での報告ができればその旨を伝えるだけで良いですが、
実際には**テストが完了していない状況で、完了目途が立っていることを示す**場合が多いです。
その際にどのような内容を示すのが良いかの実例をお見せします。
**※グラフ上の各種数値はダミーの値です**
![20211220_140047.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541207/e0337274-c1b3-9f6d-5700-5a2c03106d81.png)

上のグラフでは既に着地済みですが、途中の場合は青の実績が途中の状況で提出する形になります。
大切なのは、**完了見積もりのグラフを示し、それに対する実績**を示すことです。

見積もり通りもしくはそれを上回るペースで進捗していれば特に問題ありませんが
遅れている場合は、**着地目途を出し直し、それでもリリースには問題がないことを示す**
または、遅れることが問題の場合、**見込み通りに着地させるためのリカバリプランを提出する**
必要があります。

遅延の原因次第ですが、例えば以下のようなリカバリプランを検討し、プロダクトと認識合わせの上説明します。
・テスト人員の増員
・深夜/週末のテスト稼働
・不具合修正を行うエンジニアの増員/稼働増を相談
・リリーススケジュールのリスケ提案


#2.不具合のオープン・クローズ状況
こちらも、すべての不具合が完了していれば特にエビデンスは不要かもしれませんが、
実際は不具合が残った状態でその解決目途を示すケースが多いです。
具体的にどのように報告しているかの一例を示します。
**※グラフ上の各種数値はダミーの値です**
![20211220_142542.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541207/9612b944-e168-ea26-d527-f8d2e1d5d21c.png)
ここで示すべきは**発生した不具合が解決する目途が立っていること**になります。
またもう一点、**残存している不具合のうちリスクが高いものはどのくらいあるか**も必要です。
**高リスクの不具合が残っている = 修正に時間がかかり影響範囲が大きな不具合が残っている**
ということになるため低リスクな不具合が複数あるよりも注意が必要となります。

すべて解決する目途が立っていれば問題はないですが、
リリース時に不具合が残存する可能性がある場合、対策を示す必要があります。
・不具合修正を行うエンジニアの増員/稼働増を相談
・残不具合の内訳を示して修正しなくてもリスクが低いことを示す（プロダクトと合意が必要）
・リリーススケジュールのリスケ提案

#3.直近の不具合検知状況
仮に今発生している不具合がすべて解決しても、アプリに不具合が残存している可能性はあります。
可能性をゼロにすることはできませんが、リスクを減らしそれを示すことはできます。
具体的には以下のようなグラフを提示しました。
**※グラフ上の各種数値はダミーの値です**
![20211220_141557.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541207/106419fe-f9c6-ed77-67e0-37783860f3c3.png)
こちらはリリース承認の会議まで、日々どのくらいの不具合が検知されたかを示したグラフです。
このグラフを作成するためには**デイリーで全機能をチェックし、発生不具合を記録する**必要があります。
デイリーの全機能チェックを探索的に行うことにより潜在しているバグを掘り出して品質を高めつつ、
**日々の検知不具合数を可視化することにより定量的に品質を示すことができます。**
このグラフの表示上ではまだ品質は安定しているとは言い難いですが、
**不具合数が減少した状態が一定期間継続すれば、アプリにおける不具合リスクは低い状況になっている**と言えます。

ただし、このグラフを示すためには**原則ビルド更新がない状態であることが前提になります**（不具合修正や影響のない更新を除く）。
更新が入っている状況だと新たな不具合が混入する可能性があり、品質の可視化ができる状況ではないからです。
測定期間を考慮すると、**リリースの二、三週間程度前には大きな更新が入らない状況になっている必要があります。**



#まとめ
今回紹介したものは、あくまで最低限このあたりのデータはあったほうが良いよ、というものなので、
プロダクトの状況、会社や承認者に合わせて内容は随時追加してもらうと良いかと思います。
最初でも触れた通り、大切なことは、果たしてこのアプリをリリースして大丈夫なのか？　という、
**承認者の疑問や不安を解消し、正しい状況とリスクを伝えることです。**

定性的な情報だけだとリスクを正常に判断できない可能性があるため、
定量的な情報を提供し、客観的に品質状況を判断ができる状況をつくることが大切です。
結果、関係者が納得した状況でのリリースにつながり、トラブルも起こりづらくなっていくので、
リリース時の報告の参考にしていただければと思います。
環境構築の素人がRailsの環境をWIndows11PCに作ってみた

この記事はエイチーム引越し侍 / エイチームコネクトの社員による、[Ateam Hikkoshi samurai Inc.× Ateam Connect Inc. Advent Calendar 2021](https://qiita.com/advent-calendar/2021/hikkoshizamurai-connect) 20日目の記事です。

# はじめに
僕は環境構築が素人なphperです。
そんな僕がそろそろRuby on Railsでも覚えようかなと思い立ち、環境を用意した中で、環境構築をよくわかっていない素人だからこそ簡単な事にハマってしまいました。
そんな悲しみを1人でも減らすため、僕と同じような素人が何となく環境を作る事ができるようにお手伝いできたら幸いです。

# 調べるにあたっての不安
まず環境構築をしようと調べる中で、Windows11での環境構築に関する記事はあまり見つからないのではないでしょうか？
リリースされてから、まだそれほど期間もたっていないので当然といえば当然ですね。
でも安心してください！
僕がやってみた所感なのですが、先人がWindows10用に書いてくれた記事はそのままWindows11でも適応する事ができます！
これをお知らせる事がこの記事の最大の目的だと言っても過言ではありません！
とは言えもちろん事項から作業手順を記載させて頂きます。

# Step1 RubyのDL＆インストール
### DL
https://rubyinstaller.org/downloads/
まずは上記サイトからRubyInstallerのDLしてきます。
**WITH DEVKIT**から自分の環境に合わせたものを選択する必要があるのですが、Ruby+Devkit 2.6.9-1 (x64) を選択する事をオススメします。
ここで僕は最初、迂闊にも最新バージョンを選択してしまった為、後々後悔する事となりました...
### インストール
DLしたexeファイルを起動し、特に拘りがなければ規約に同意してデフォルト設定のまま進んでいけば下記のようなウィンドウが立ち上がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107966/4297959a-9270-5e5b-d681-9f584a695e2f.png)
`1,2,3`を入力してENTER、その後しばらく待つともう一度入力を求められるので再度ENTERを押せがウィンドウは閉じます。

# Step2 Ruby on Railsのインストール
```cmd:コマンドプロンプト
C:¥Users¥XXXX> gem install rails -v "5.2.6"
```

まずはコマンドプロンプトを立ち上げ、上記コマンドでインストールできます。
本記事ではバージョンを5.2.6に指定していますが、各々で入れたいバージョンを指定してください。
ここで注意が必要で、Step1でインストールしたRubyのバージョンとRailsのバージョンがあっていないと後々サーバーを立ち上げることができません。
もし本記事の通り5.2.6をインストールするのであれば、Rubyは必ず2.6系をインストールしてください。
でないとStep5がうまくいかず泣くことになります。
（特に僕のような手探りの方）

# Step3 Railsアプリケーションの作成
```cmd:コマンドプロンプト
C:¥Users¥XXXX> rails new sample -G
```
続いて上記コマンドでRailsアプリケーションを作成します。
*sample*の所が任意で命名する事ができるアプリケーション名となりますので、好きな名前を付けてください。

# Step4 sqlite3のインストール
```cmd:コマンドプロンプト
C:¥Users¥XXXX> cd sample
C:¥Users¥XXXX¥sample>ridk exec pacman -S mingw-w64-x86_64-sqlite3
　～略～
:: インストールを行いますか？ [Y/n]Y
　～略～

C:¥Users¥XXXX¥sample>bundle install
```
`cd`でStep3で作成されたアプリケーションのディレクトリまで移動し、sqlite3をインストールします。

# Step5 Railsサーバーを立ち上げる
```cmd:コマンドプロンプト
C:¥Users¥XXXX¥sample>rails s
```

`rails s`で立ち上げます。
（停止はCtrl＋C）
これで入力待機状態になれば立ち上げ成功です。
ブラウザから`localhost:3000`を開き、下記ページが開く事ができれば最低限の環境構築が完了です。
お疲れ様でした！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107966/bed3cbeb-9388-5789-9bbf-9d889f9d437c.png)

# まとめ
Step5まで無事たどり着けた僕と同じ初心者の皆様。
お疲れ様でした！
初心者にありがちなスタートラインにすら立てない悲しみを乗り越えることはできましたでしょうか？
もし新たな分野への挑戦の手助けになれましたら幸いです。

# 明日
[Ateam Hikkoshi samurai Inc.× Ateam Connect Inc. Advent Calendar 2021](https://qiita.com/advent-calendar/2021/hikkoshizamurai-connect) 20日目の記事は、いかがでしたでしょうか。
明日は @nao_70 が何かについて書いてくれるようです。
おたのしみに！
Vue 3でBootstrap(≠BootstrapVue)を使用するときのJavaScriptによるModal制御

ちょっと悩んだところがあったのでメモ。

### やりたいこと

Vue3でBootstrap5を使用し、Modalを実装する。
Vue3対応のBootstrapVueはまだ0.1.0(2021/12/18現在)なので使用しない。
単純なボタンクリック以外でもモーダルを非表示にしたいので、JavaScriptで非表示を制御したい。

### 諸々のバージョン

```
 @popperjs/core@2.11.0
 bootstrap@5.1.3
 vue@3.2.22
```

### 実装方法

bootstrap.Modalの`show()`と`hide()`を使用する。
https://getbootstrap.jp/docs/5.0/components/modal/#methods
非表示だけでなく、表示の方もJavaScriptで制御する。

### 悩んだところ

当初、モーダルの表示は`data-bs-toggle`と`data-bs-target`の属性を指定し、モーダルを非表示にする際にだけ上記のメソッド`hide()`を使おうとしていたが、`hide()`が機能しなかった。

#### 原因

Bootstrapのドキュメントのこの部分について理解に誤りがあった。

```
var myModal = new bootstrap.Modal(document.getElementById('myModal'), options)
```

たとえばdata-bs-targetで実装した`myModal`を表示させた状態で、上記のようにModalのインスタンスを作成しても、その時点での表示の状態などはインスタンスのプロパティ内に反映されない。

具体的には、Modelのコンストラクタ内で、引数のエレメントに関係なく、__Shownというプロパティがfalseの状態で初期化される。

```
class Modal extends BaseComponent {
  constructor(element, config) {
    super(element, config)

    this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)
    this._backdrop = this._initializeBackDrop()
    this._focustrap = this._initializeFocusTrap()
    this._isShown = false
    this._isTransitioning = false
    this._scrollBar = new ScrollBarHelper()
  }
```
https://github.com/twbs/bootstrap/blob/c2db7108c2ed45273fd4c9eb9155847153fe1512/js/src/modal.js#L64

__Shownがfalseの場合、`hide()`は何もせずにreturnするような実装になっている。

```
 hide() {
    if (!this._isShown || this._isTransitioning) {
      return;
    }
(以下略)
```
https://github.com/twbs/bootstrap/blob/c2db7108c2ed45273fd4c9eb9155847153fe1512/js/src/modal.js#L121

なので、表示させるときも`show()`を使ってJavaScriptで表示させてやって、
非表示にするときはそのインスタンスに対して`hide()`を呼び出すという実装が必要。

### 所感

結局こうやって自分でJavaScript書かなきゃいけない部分が増えていって最終的にごちゃごちゃしそう。
理想トランスの電力が一致する理由

# 概要
タイトル通りです

http://ayumi.cava.jp/audio/pctube/node23.html

こちらに、理想トランスの基本が乗っています。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/d54ebe52-ff89-bf8f-dcf5-0403705a9d6e.png)


```math
e_1 i_1 = e_2 i_2
```
となる理由を説明します。

# 証明

```math
\begin{eqnarray}
V_{1} = L_1 \frac{di_1}{dt} + kL_{12} \frac{di_2}{dt}\\
V_{2} = L_2 \frac{di_2}{dt} + kL_{12} \frac{di_1}{dt}\\
\end{eqnarray}
```

となる。
理想トランスの場合$k=1$

$V_{1}$に$i_1$
$V_{2}$に$i_2$
を掛ける

```math
\begin{eqnarray}
V_{1}i_1 = L_1 \frac{di_1}{dt}i_1 + kL_{12} \frac{di_2}{dt}i_1\\
V_{2}i_2 = L_2 \frac{di_2}{dt}i_2 + kL_{12} \frac{di_1}{dt}i_2\\
\end{eqnarray}
```

ここで、$i_1,i_2$は$sin$波であると考える。その場合

```math
\begin{eqnarray}
\frac{di_1}{dt}i_1 = A^2 cos(wt) sin(wt)\\
\frac{di_2}{dt}i_2 = A^2 cos(wt) sin(wt)\\
\frac{di_1}{dt}i_2 = A^2 cos(wt)^2 \\
\frac{di_2}{dt}i_1 = A^2 cos(wt)^2 \\
\end{eqnarray}
```
といえる。交流の電力を考える場合、周期$T$で積分する。この際

```math
\begin{eqnarray}
  cos \times sin = 0\\
cos \times cos = \frac{1}{2}T
\end{eqnarray}
```
になることを覚えているだろうか
このことを使うと

```math
\begin{eqnarray}
\frac{di_1}{dt}i_1 = A^2 cos(wt) sin(wt) -> 0\\
\frac{di_2}{dt}i_2 = A^2 cos(wt) sin(wt) -> 0\\
\frac{di_1}{dt}i_2 = A^2 cos(wt)^2 -> \frac{A^2}{2}\\
\frac{di_2}{dt}i_1 = A^2 cos(wt)^2 -> \frac{A^2}{2}\\
\end{eqnarray}
```
となることがわかるだろう。

つまり

```math
\frac{di_1}{dt}i_2 = \frac{di_2}{dt}i_1
```

もとの式に戻すと

```math
V_{1}i_1 =  V_{2}i_2 
```
になるのである。

（追記）
「$i_1,i_2$は$sin$波であると考える。」としたが、$i_1,i_2$に位相差があれば成立しないのでは？


# まとめ

二次側の電流は、一次側の$\frac{1}{n}$倍
二次側の電圧は、一次側のは$n$倍
一次側から見た時の負荷抵抗は$\frac{1}{n^2}$倍

### 証明

```math
V_{1}i_1 =  V_{2}i_2 
```
より

```math
\begin{eqnarray}
\frac{V_{1}}{V_{2}} = \frac{i_2}{i_1} = \frac{1}{n}\\
(V = N \frac{d\Phi}{dt} は常に成立しているため)\\
\therefore i_2 = \frac{1}{n} i_1\\
\therefore V_{2}  = n V_{1}\\
R= \frac{V_{2}}{i_2} = n^2 \frac{V_{1}}{i_1}\\
\end{eqnarray}
```

一次側から見た時の負荷抵抗というのは$ \frac{V_{1}}{i_1}$のことなので

```math
 \frac{V_{1}}{i_1} = \frac{1}{n^2} R
```
となり、n二乗分の1になります。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/f354e5ea-5ca8-936d-9984-600c59828e6a.png)



# 例
一次側から見たとか、考えるときに引っ掛かったので、メモを残します

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/307bd555-f916-f583-8dda-9408eb8f71af.png)

等価抵抗を求めて、電流電圧を計算し、元の回路に戻して、電流電圧に変換できます。
Houdiniでバリエーション作成！

##はじめに
大学2年生のぼっしーです。記事を書くのは今回が初めてですが、頑張って書きます。よろしくお願いします！

今回記事にするのは「Takeを使ったバリエーション作成」です。これは私がシュミレーション制作中に実装したかったものです。日ごろからお世話になっているSideFX社の方にご教授いただいたので、みなさまに共有します！

##Takeによるバリエーション作成とは
**右上にあるこれです。**
こちらに異なるパラメータを設定した複数のシーンを作成し、瞬時に切り替えることが出来ます。
![rapture_20211218212540.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389849/bfbf548a-14ef-a2e9-1c9d-d4bfaab2a356.jpeg)
例を出すと、BigとSideがTakeとして作成したものです。Mainはいつもいじっている普通のシーンです。
![スクリーンショット 2021-12-18 213555.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389849/6d526486-752a-68ef-2879-2e32726fcd87.jpeg)
Bigにすると (大きい爆破!) 
![rapture_20211218214740.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389849/9319fdc1-810f-faec-f1f5-fef831ee486e.jpeg)
Sideにすると (横向きの爆破!)
![rapture_20211218214603.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389849/f4c72f11-753e-545e-ef6f-d1ac5241891c.jpeg)
このように一瞬でシーンを切り替えることが出来ます。

##やり方
簡単です。新しいシーンを作成して、パラメータを変更するだけです。
####①新しいシーン(Take)を作成する
2つやり方があります。
・TabをTakeListに切り替えて、AddTakeをする
・右上のプルダウンからNewTakeをする

作成したときはtake1となっているので、名前を変更したいときはTakeListからtake1をダブルクリックで出来ます。
![rapture_20211218220128.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389849/345f88a8-fbd8-72a0-3797-2080d86072dc.jpeg)
TakeListが無い方はこちらのやり方で追加できます。
![スクリーンショット 2021-12-18 220813.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389849/1492c1eb-067b-17cb-9780-4f965d2094e9.jpeg)
####②パラメータを変更する
パラメータが薄暗くなっていて何も変更することが出来ないと思います。右上のプルダウンからAutoTakeにチェックを入れることで変更が可能になります。**パラメータを変更した後は必ずAutoTakeのチェックを外しましょう。**
![スクリーンショット 2021-12-18 221607.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389849/ad6e7cc0-0e32-02e1-ec6a-d97822f15463.jpeg)

#おわりに
Takeを使えばhipファイルを分けなくても複数の見た目のシーンを作成することが出来ます。
初めての投稿で拙い文章ですが、最後まで読んでいただきありがとうございました！
TPI NEXT🄬ってアレに似てるね

### はじめに

はじめまして。つみきです。
今少しずつTPI NEXT🄬についての勉強を進めているので、TPI NEXTについて簡単な紹介と、私なりの理解についてお話します。

一言でいうと[この本](https://www.trifoglio.co.jp/user_data/tpi_next.php)を読んでね、になるのですが、まずは一般的なお話をします。


### 想定読者

**TPI NEXT🄬って何？**
**TPI NEXT🄬について何も知らない！**という方向けです。

### TPI NEXT🄬とは

> TPI NEXT は、BDTPI（Business Driven TPI：ビジネス主導の TPI）を基本モデルとし て利用することでテストプロセスの成熟度を判断するための標準であり、テストプロセス成 熟度の評価とそれに基づく改善の２つの枠組みを定めている。
引用元：https://www.ipa.go.jp/files/000057625.pdf

Googleで検索すると、IPAの情報が出てきたので引用しました。

具体的には、Sogeti社のチェックフォーマットとマニュアルがあるので、それでチェックをしてみるとイメージが付きやすいかなと思います。
[sogeti社のサイト](http://www.tmap.net/tpi-downloads)
フォーマットを入手したら、「All Checkpoints」シートのチェックポイントにY/Nで回答すると、テストプロセスの可視化が行えます。
可視化した結果をもとにした、改善の優先度がわかります

なお、以下の16のキーエリアについて、4段階で結果を判定出来ます。
#### キーエリア
- 利害関係者のコミットメント
- 関与の度合い
- テスト戦略
- テスト組織
- コミュニケーション
- 報告
- テストプロセス管理
- 見積もりと計画
- メトリクス
- 欠陥管理
- テストウェア管理
- 手法の実践
- テスト担当者のプロ意識
- テストケース設計
- テストツール
- テスト環境

#### キーエリア
- 初期レベル
- コントロールレベル
- 効率化レベル
- 最適化レベル

### TPI NEXT🄬はテストプロセスの健康診断

このあたりを私が最初に勉強した時に思った感想が「**健康診断みたいだな**」でした。

健康診断っておおよそどの会社でも以下のような流れで行われると思います。

1. 問診
1. 身長体重測定、各種検査
1. 結果連絡
1. 不健康なら治療やら体質改善やら(メタボならダイエットとかね…)
1. 必要に応じて再検査  

この検査の部分がまさにチェックの工程だなと。そしてその結果を受けてテストプロセスを見直し、改善する。健康診断ぽくないですか？
健康診断でも、アスリートとシステムエンジニアでは**求める基準**が異なります。

全組織に対して一律の診断を行うのではなく、初めにヒアリングを行い組織の求める方向性に応じてキーエリアの重みを変更することで、より適切な改善策を導きだせるようにしものが、TPI NEXT🄬です。

そして、肝臓の数値が悪いという事実が結果として現れたとして、**再診断をするか、生活面を改善するか**などは結局当人次第です。
誰かにやらされる改善ではなく、**自分がやりたい、やらなくては**ということに意志を持ち行動計画を立てて、実践できるのがTPI NEXT🄬の強みかなと思いました。

### 終わりに

とりとめもなく話しましたが、TPI NEXT🄬っていうなんだか馴染みのないもの、と思うとちょっと警戒してしまいますが、健康診断だと思うと年に1回は受けなきゃ、という気になりませんか？

チェックリストを付けるだけなら難しくないですし、弊社でも「[テストプロセス改善ネクスト](https://www.veriserve.co.jp/service/detail/tpi-next.html)」というサービスを扱っています。
よろしければページを見てみてください。
DockerでのLaravel環境構築で、DBに接続できない(Connection refused)

Dockerでlaravelの環境構築を行なったときに解決に時間がかかって苦しんだことを書き留めます。

## 事象
Connection refused のエラーでDBに接続できない。

```
# php artisan migrate

   Illuminate\Database\QueryException  : SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = test_db and table_name = TEST_MIGRATIONS and table_type = 'BASE TABLE')
```

DBのコンテナは正常に動いているし、

```
# docker-compose -f docker-compose.test.yml ps
    Name                   Command               State                          Ports
------------------------------------------------------------------------------------------------------------
mysql           docker-entrypoint.sh mysql ...   Up      0.0.0.0:3306->3306/tcp,:::3306->3306/tcp, 33060/tcp
php8.0-apache   /usr/sbin/httpd -DFOREGROUND     Up      0.0.0.0:80->80/tcp,:::80->80/tcp
phpmyadmin      /docker-entrypoint.sh apac ...   Up      0.0.0.0:8888->80/tcp,:::8888->80/tcp
```

DBに直接接続も可能でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/920605/786c3001-ab8c-004f-d94f-13fcf59d5bfa.png)

## 解決
調べてみると、
Laravel側 の.env の DB_HOST には、
docker-compose の services: に定義したDBコンテナのサービス名を設定する必要があるとのこと。

```&#x20;.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=test_db
DB_USERNAME=test_user
DB_PASSWORD=test_pass
```
↓

```&#x20;.env
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=test_db
DB_USERNAME=test_user
DB_PASSWORD=test_pass
```

上記の通り修正し、LaravelからDBに接続できました。

ローカルPCからのDB接続時と同じように、
127.0.0.1 でポートを指定すれば接続できると思い込んでいたため、気づくのに時間がかかりました…。
Dockerでは、コンテナ間の通信をコンテナのサービス名で行なうようです。
レトロ風なゲームが作りたいって！？

#初めに
今回は、3Dゲームを作るにあたって見た目は重要なので、今回はレトロ風ゲームを作成するためにレトロっぽく見えるゲームの作り方について解説しようと思います。

#目次
>1.レトロ風にする
 2.ブラウン管みたいにする

#1.レトロ風にする
レトロ風にするにあたって今回はこのアセット？GitHhubを紹介しようと思います。
https://github.com/oxysoft/RetroSuite3D
↑これを落としてUnityにインポートします。
![スクリーンショット 2021-12-18 22.12.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866543/19a4a841-b5ce-814f-cd47-0ced5e8c0812.png)
インポートするとこの画像のようにすくりぷとが５つあるのでそれを一旦Cameraに全てインポートします。
(時々他のと干渉してバグるのでそこは注意したほうがいいです。)
一つ一つ解説すると
[Dither]は画面に全体的にノイズ的なものをかけるスクリプトです。
[Posterize]はRGBの色の割合的なものを調節するスクリプトです。
[RetroPixelMax]は色を指定することでその色だけでゲームの見た目を変えてくれるスクリプトです。
[RetroPixelPalette]はよくわかりませんｗ
[RetroSize]これは画面の解像度を変更するスクリプトです。

###試しに使ってみた。
文章であーだこーだ言われてもわからないと思うので、実際に試してみたもんを例としてあげます。
![スクリーンショット 2021-12-18 22.17.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866543/cc5701aa-1d64-9260-1f3c-db0dea09968a.png)
今回はこの二つのスクリプトを使いました。
![スクリーンショット 2021-12-18 22.18.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866543/1189ad6d-2a03-ad2c-c4ce-aca258c07bf8.png)
実際に今作ってるゲームになりますが、このような見た目になります。
かなりレトロ感が出ていていいと思います！

#2.ブラウン管みたいにする
次にレトロ感を出すと言ったらブラウン管風ということで、ブラウン管のように見せるスクリプトを紹介します。
これはGitHubではなく、スクリプトをコピペするか自分で記述するしかないので、頑張ってください！
http://wordpress.notargs.com/blog/blog/2016/01/09/unity3d%E3%83%96%E3%83%A9%E3%82%A6%E3%83%B3%E7%AE%A1%E9%A2%A8%E3%82%B7%E3%82%A7%E3%83%BC%E3%83%80%E3%83%BC%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%9F/

一つ一つ説明すると
[NoiseX]は色が乱れるのを再現することができます。
[Rgb Noise]は横一直線にかかるノイズを再現することができます。
[Sin Noise Scale]はよくわかりません。
[Sin Noise Width]は横に画面が引っ張られる感じで乱れるのを再現できます。
[Sin Noise Offset]は値を動かすと横に画面がスライドします。
[Offset]はXとYの値を調節すると画面がスライドします。
[Scan Line Tail]は画面にかかる黒い帯状のものが上から下になるやつの大きさを調節できます。
[Scan Line Speed]は上で解説したものの移動速度を調節できます。

###実際に適用してみた。![スクリーンショット 2021-12-18 22.28.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866543/ef6245aa-9713-261b-3dae-52ee48d096cf.png)

こんな感じになります。値は忘れてしまったので自分で頑張って調節してください！
Canvasのテキストに適用したい場合はCanvasの設定のレンダーモードをカメラに切り替えれば適用されます。

#最後に
今回はレトロゲーを作る上で知っておいたほうがいいものについて解説しました。
ぜひ参考にしてみてください！
ProtoPediaのストーリーにURLからコンテンツの埋込をできるようにした話

初期のころからProtoPediaを使っていた人はお気づきかと思いますが、昔のProtoPediaでは作品登録のストーリーにURLを入力しても「**コンテンツの埋込**」ができずに、URLがそのまま表示されておました。

やっぱりサービスとして、Twitterとかスライドサービスのリンクをよくブログとかで見るように「**コンテンツの埋込**」ができるようにしてほしい。

そんな要望もあり、コンテンツの埋込対応を2021年7月ごろに対応致しました。

# コンテンツの埋込対応
でも実際にコンテンツをブログカードなどに変換するにしても、対応したいサービスは数も多くそんなにやれるの？って考えてしまいます。

### 対応したいサービスとか

* Twitter
* YouTube
* SlideShare
* SpeakerDeck
* CodePen
* 等々

なにか外部サービスを利用できないかとみつけたのが、[Iframely](https://iframely.com/)というサービスで、自分の作っている他の[サービス](https://chroco.ooo/)でも利用していたりします。

https://iframely.com/

Iframelyは実は[オープンソース](https://github.com/itteco/iframely)でも公開をしており、今回はそちらを使っています。

![SoWkIImgAStDuU9wtBJ-SVFAnqrB7ZSjUjoy-N5pXuAkdPr2G55-INv0Qafc8XU22PRnJ2jAp4tDgUI2CGYenxI0YyiXDIy5Q3i0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/07092431-b8b9-101b-2cbf-7add45545246.png)

Iframelyのオープンソースをサーバに配置して、ProtoPediaから内部的に呼び出しを行うことで、クライアント側で表示されたときにURLを自動変換するように利用しています。

# こんな風に表示されたりします

* Twitterの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/3b8bf9bd-64ae-32c8-0a3a-93718c622619.png)

* SlideShareの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/45f74028-4709-d334-8dfc-5e81ffd79811.png)

実際のところ、どのサービスが対応しているのか？というのは約1900サービスあるのですが、正直試してみないとわかりません。
なので、以下の場所からURLチェックをしてみるとよいかと思います。

https://iframely.com/embed

また、対応していなくても以下の場所からサービスの対応を申請すると対応してもらえたりするので、一度試してみるとよいかもしれません。

https://iframely.com/qa/request

うまく申請が通ると自分で作ったサービスとかもリッチコンテンツとして対応できるようになったりします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/1ddba773-04c4-8ea6-4632-3434673c45d0.png)
※[自サービスに埋め込みコード対応をする方法](https://qiita.com/blue_islands/items/33ee08bc73652893c413)

# 最後に
ProtoPediaをより良くするために少しずつですが、メンテナンスとか改修とかしています。
何かこうして欲しいとかの要望がありましたら[こちら](https://docs.google.com/forms/d/e/1FAIpQLSfebxxJBL_1131Yc-nmNN1IDIgihUVqR-4xAHNaLlOUFEdeCw/viewform)からお知られしていただければと思います。
AWS Transcribe を利用して動画から音声のテキストを抽出する

これは [AWS Advent Calendar 2021 の19日目](v) の記事です。

仕事でAWS Transcribe を利用する機会があったため、メモがてら記述しておきます。

## AWS Transcribe とは

AWSが提供するテキスト抽出サービス。動画、音声ファイルから、テキストデータを抽出する。
Google でいう Web Speech API っぽいサービス。


## 動画から音声を抽出する

今回は、[Wikimediaのクリエイティブ・コモンズの動画データ](https://commons.wikimedia.org/wiki/File:The_Impact_of_Wikipedia_Poongothai_Balasubramanian.webm)を利用してみます。


![スクリーンショット 2021-12-18 21.52.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83767/0a1e4b03-3164-1791-f2dd-cc38a314036f.png)


動画をS3バケットにアップロード
![S3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83767/dace2a66-22aa-8136-e42c-7aeb4a29855f.jpeg)

Transcribe でプロジェクトを作成し、S3内の動画を選択する。


![スクリーンショット 2021-12-18 22.02.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83767/32991b57-6c8c-d11d-378f-64d38999d0e0.png)


オプション設定画面。いろいろな抽出条件を設定できる。

複数人が会話に参加している場合 [Audio Identification] - [Speaker Identification] で、人数を指定すると、人数ごとに音声データを分別してテキストデータにする。１人しかいない場合、この設定は使えない。


![スクリーンショット 2021-12-18 22.06.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83767/08395513-5225-1564-5aeb-88197c216ad5.png)

そのほか、音声認識終了後にS3から動画データを削除する、特定の単語を結果から削除する、などの設定ができる。

設定を全て行い、job をスタートし、コンプリートするとデータの抽出が完了。

![スクリーンショット 2021-12-18 22.12.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83767/a6d10909-08ca-070b-8f06-0d8ad2a6b404.png)

実際に抽出したテキストデータが取得できる。

![スクリーンショット 2021-12-18 22.15.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83767/85b788aa-9a13-b32c-c228-812e61704473.png)


## 実際に利用した感想

自分は海外ユーザーインタビューの、１時間ほどの動画の文字起こしに使ってみました。
S3に格納する必要はありますが、AWSのコンソールからSaaSサービスのように利用できました。

もちろんAPIも存在するので、ウェブアプリなどのインターフェースを作れば、オリジナルの文字起こしアプリが作成できる。

使い道が多そうなサービスです。
スマートコントラクト開発のための学習教材を紹介します

こんにちは、[TechCommitアドベントカレンダー2021](https://qiita.com/advent-calendar/2021/tech-commit) の20日目を担当する nawoo です。

私は、もともとWindowsソフト開発の仕事をしており、プログラミング言語はDelphiやC#を使っていました。数年前にその仕事をやめたあとも趣味の一つとしてプログラミングを続け、自分専用のソフトを開発したり、気になったプログラミング言語を学んだりしています。

今年(2021年)7月頃にTechCommitを知って入会し、同時にブロックチェーンプログラミングの勉強をはじめました。仮想通貨への投資やDeFiの利用などは以前から行っていましたが、その裏側で何が行われているのかをきちんと理解したいと思ったのがきっかけです。

その後、LootというNFTを知って「自分でもこんなNFTを作ってみたい」という具体的な目標に変わったことで、学習のモチベーションがぐんと上がりました。

この記事では、私が使ってきたスマートコントラクト開発のための学習教材を紹介しますので、参考にしてもらえれば幸いです。


## 1. ビットコインとブロックチェーン
https://www.amazon.co.jp/dp/4757103670

まず、そもそもブロックチェーンとは何かを理解するためにこの本を読みました。
Bitcoinのブロックチェーンの仕組みについてとても詳しく説明されていて、「ブロックがチェーン状につながっているんでしょ」ぐらいの認識だったのが、具体的なブロックの構造、どうして改ざんできないのか、マイニングとは何をしているのか、、、といったことを理解できるようになりました。

スマートコントラクト開発というとEthereumが中心ですが、それでもまず最初にBitcoinを理解することは重要だと思います。

ただ、この本は2016年出版なので、内容が古く、Segwitやライトニングといった情報については書かれていません。原題は Mastering Bitcoin で、英語版の最新版はこちらでも読めます。（私はまだ読んでいませんが、そのうち読みたいです。)
https://github.com/bitcoinbook/bitcoinbook#chapters

:point_right:  `この本はじっくり時間をかけて読みましょう。`

## 2. マスタリング・イーサリアム
https://www.amazon.co.jp/dp/4873118964

上の本と同じ作者が書いたEthereumの本です。
内容は、Ethereumについて詳細に解説するというよりは、概要を紹介する程度に留められています。Bitcoinとの違い、EVMとは何か、コントラクトとは何か、、、といったことをざっくりと理解することができます。
Solidity言語についても1章を使って説明がありますが、これだけでマスターするのは難しいので、他の教材で学ぶ必要があります。

こちらは2019年出版ですが、Ethereum/Solidityは進化が速いので、やはり内容は古くなっている部分があります。

:point_right:  `この本はざーっと読んで次に行きましょう。`


## 3. SolidityとEthereumによる実践スマートコントラクト開発

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

こちらは、実際に手を動かしてスマートコントラクト開発を進めていく本です。
Truffleという開発環境を使って、Solidityでスマートコントラクトを書いてデプロイし、さらにはReactでフロントエンドの開発まで進むので、スマートコントラクト開発の一通りの流れを知るにはちょうどいい本です。

2021年1月出版と比較的新しい本です。ただ、プログラミング本あるあるですが、本に書かれているとおりにやっているのにエラーが出ることがありました。また、作っているスマートコントラクトが個人的にはあまり面白くなかったので、最初は本の通りにコードを書いて動かしていましたが、途中から流し読みしてしまいました。

:point_right:  `エラーが出ても気にせず飛ばして進めましょう。`


## その後

この3冊を読んだ後は、実際に簡単なスマートコントラクトを書いてみてデプロイする、その過程でわからないことをネットで調べていく、という学習方法に切り替えました。


Solidityは進化が早いので、ネット記事などはすぐに内容が古くなってしまいます。英語ですがSolidityの公式ドキュメントをチェックするのが確実です。
https://docs.soliditylang.org/en/latest/


その他、私が参考にしたサイトはこちらです。

### PolygonでNFTを発行してみよう【前編・後編】 (※有料)
https://hashhub-research.com/articles/2021-08-29-try-mint-nft-on-polygon-opensea

https://hashhub-research.com/articles/2021-09-14-try-mint-nft-by-yourself

Truffleを使ってPolygonネットワークでLootのようなNFTを作成するための記事＋動画です。
HashHub Research有料会員向けの記事ですが、私はこれを見るために有料会員になりました。(今はまた無料会員に戻りましたが💧)
独学ではデプロイまでたどり着けなかったのですが、この動画を見て初めてNFTを公開できました。


### イーサリアムnavi
https://ethereumnavi.com/

Ethereum,Solidity,NFTなどに関する情報サイトです。開発者向けの情報も多く、特にSolidityや勉強会の記事は役に立ちました。
Discordもあって質問や情報交換もできます。私も参加しています。


### ブロックアカデミー
https://www.youtube.com/channel/UCIgqYzCG6Fk1JbR2O7XF_lA/playlists

YouTubeでSolidity学習やdApp開発の動画を配信しています。dApp開発についてはなかなか日本語での教材が少ないので貴重です。


## 最後に

以上、私が使ってきた教材の紹介でした。
学習を継続するために、平日の夜はできるだけTechCommitのもくもく会に参加するようにしています。また、学習内容はブログにまとめています。ぜひ一度ご覧ください。

https://nawoo.hateblo.jp/


最後までお読みいただきありがとうございました。
どうぞ良いお年をお迎えください。
iSHを使ってiPadでC言語開発

# はじめに
この記事は[東京高専プロコンゼミ① Advent Calendar 2021](https://adventar.org/calendars/6568)の18日目の記事です．

# きっかけ
**なにもしてないのにぱそこんがこわれた**
どうやらSSDを認識していないらしく，WindowsやLinuxの再インストールもできない状況．

学校のプログラミングの課題をiPadでやろうと試みるお話です．
家に帰ればデスクトップPCがあるので，とりあえずCを書いて実行できればOKといった感じです．

# 実行環境
* iPad（第8世代）Wi-Fiモデル
    * iPad OS 15.1
    * iSH バージョン1.2.2

Bluetooth接続の外付けキーボードがあるとすごく便利です．

# iPadでLinuxを使う
iSHというアプリを[AppStore](https://apps.apple.com/jp/app/ish-shell/id1436902243 "「iSH Shell」をApp Storeで")でインストールします．Alpine Linuxのエミュレータらしい．
ちなみにiPhoneでも使えるようですが，持っていないので試していません．


# C言語を書く
## 各種パッケージのインストール
「apk」というパッケージマネージャを使用してGCCをインストールします．

```shell
$ apk add gcc
```
エディタにはVimを使います．インストールの要領は同じ．

```shell
$ apk add vim
```
CLI版のEmacsも使えるようです．

<details><summary>apkが使えなかった場合</summary><div>
今は使えるみたいですが，使えなかった場合は以下のコマンドでapkをインストールします

```shell
$ wget -qO- http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86/apk-tools-static-2.10.5-r1.apk | tar -xz sbin/apk.static && ./sbin/apk.static add apk-tools && rm sbin/apk.static && rmdir sbin 2> /dev/null
```
</div></details>
## C言語を書いて実行する
「hello.c」を作成し，Vimで編集します．

```shell
$ touch hello.c
$ vim hello.c
```
とりあえず「Hello World!」と出力するプログラムを書きます．

```c:hello.c
#include <stdio.h>

int main() {
    printf("Hello World!\n");
    return 0;
}
```
コンパイル&実行

```shell
$ gcc hello.c
$ ./a.out
```
![IMG_0026.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2169636/a163a66a-4ad3-3476-e6a9-0aae0c01240e.png)


こんな感じ．

実際の開発では何かしらの影響が出るかもしれませんが，授業の課題ぐらいならこれでいけます（おそらく）．

# おまけ
<dl>
<dt>tmux</dt><dd>
ぱっと試した感じ使えます．使い込んだらまた違うかもしれませんが．
</dd>
<dt>Git</dt><dd>
使えます．
「openssh」をインストールすればsshで接続することもできます．</dd>
<dt>Python</dt><dd>
簡単なコードの実行は可能です．
ただvenvやpipがやたら重いです．
</dd>
<dt>Rust</dt><dd>
公式のインストールコマンドではインストールができません．<br>
cargoやrustcはインストールできますが，コマンドを使うと「Illegal instruction」と言われてコンパイルできません．<br>
ちょっと調べた感じ一筋縄ではいかなそうだったので断念しました．
</dd>
<dt>Ruby</dt><dd>
Rubyのインストールはできますが，実行はやたらと重いです．
rbenvは使えないです．
</dd>
<dt>GUI</dt><dd>
xrdpを使ってLinuxのデスクトップ環境を使用できないかチャレンジ中です．
</dd>
</dl>

# 参考文献
[iSH公式サイト](https://ish.app)
[iPadで動くLinuxエミュレーター「iSH」がすごいと私の中で話題に - Qiita](https://qiita.com/minorin22/items/b26ef9d650eb05896b51#code-server%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
リモート(lldb)でiPhone端末に接続してデバッグすることはできるか

### ある日浮かんだアイディア
LLDBのマニュアルには`Remote Debugging`について説明している部分があります。
![スクリーンショット 2021-12-18 18.03.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142904/9989fa0f-17e2-7b54-f676-e5afe508559f.png)
そして最近`ish shell`や`a-shell`など、iPhoneデバイス上でjailbreakしなくても「コマンド実行環境」を簡単に用意できるようになっていることから

##### もしかしたらリモートでiPhone端末に接続してデバッグすることができるかもしれない

と思いました。ここで「セキュリティー的にそんなことが出来るわけがない」と思った方もいるでしょう。この記事を書いている自分もそう思いましたが直接やってみて確認したかったので、検証してみました。
結論を先にお伝えしますと

##### 予想通りjailbreakしないとできません
lldbはリモートデバッグ機能を提供していますが「iOSのセキュリティー・権限」の問題をjailbreakなしでは解決できないので、iPhone端末で動いているアプリのプロセスにAttachすることができません。（そもそもAttach以前にアクセスすらできない）

ここからは検証の手順と流れを共有します。

##### iphone端末側
①iPhone端末に`debugserver`のバイナリをcopyする
※バイナリのパス（MacOS 12.0.1）
``` /Library/Developer/CommandLineTools/Library/PrivateFrameworks/LLDB.framework/Versions/A/Resources/debugserver```
②ターゲットのプロセスを起動する（デバッグ対象）
③`debugserver`でip,port, Attach対象を指定して実行する（Attach対象は②で起動したプロセス）```
$debugserver ip:port --attach=[ターゲット]
```
##### mac側
④lldbを実行する```
$lldb
```⑤platformのプラグインを指定する```
(lldb) platform select remote-ios```
⑥iPhone端末側のデバッグサーバにアクセスする```
(lldb) process connect connect://[iPhoneのIP]:[③で指定したポート]
```

#### 問題と解決
（解決）iPhone端末のコマンド実行環境
→今回は`iSH Shell`というiPhone向けアプリをインストールして使いました。

（解決）iPhone端末で実行可能な`debugserver`バイナリを用意する
→Universalバイナリを`lipo`を使って対象の端末アーキテクチャに合わせました(arm64e）

（解決）`debugserver`のバイナリをiPhone端末にCopyして、コマンドでアクセスできるようにする
→こちらは`iSH Shell`のFile Brawsing機能とiPhoneの「File」アプリで解決しました。

（★未解決）用意したコマンド実行環境からiPhone端末で実行中のプロセスにアクセスする
→これが解決できないとそもそもデバッグ対象のプロセスにlldbからAttachができないので、どうしようもなかったです。
（jailbreakをすればroot権限の問題やアクセス範囲の課題も解決できます）

#### まとめ
lldbを利用したリモードデバッグはiPhone端末ではjailbreakなしでは難しいです。
ただMac-to-Macでのリモートデバッグは可能ですので興味のある方はチャレンジしてみてください。
ペル型方程式をsympyのdiop_DNで解く

### ペル型方程式
以下の形の2次不定方程式をペル方程式(Pell's equation)と呼びますが、</br>
 $\displaystyle \large \ \ \ \  x^2-Dy^2=1$</br>
今回は一歩進んで右辺が$N$のペル型方程式(Pell-like equation)をの解を生成するプログラムをpythonのsympyを使って書きました。
<center>$\displaystyle \large \ \ \ \  x^2-Dy^2=N$</center></br>
</br>
手順は以下の通りです。</br>

1. diop_DNで基本解を求める
2. $N=1$の最小解を漸化式の係数とする
3. 係数Matrixを基本解に掛けて解を生成していく

### 1. diop_DNで基本解を求める
以下を例題を解きます。diop_DNに$D=8, N=56$を与えて呼ぶだけですね。diop_DNの説明は[こちら(英文)](https://docs.sympy.org/latest/modules/solvers/diophantine.html#diop-dn)
$\displaystyle \large \ \ \  x^2-8y^2=56$</br>

```python 
import sympy
from sympy.solvers.diophantine.diophantine import diop_DN
D, N = 8, 56
xylist = diop_DN(D,N)
print(xylist)
# [(-8, 1), (8, 1)]
```
簡単に2つの基本解$(-8, 1),\ (8, 1)$が求まります。

### 2. N=1の最小解を漸化式の係数とする
同様にN=1にして最小解$(3,1)$が求まります。

```python 
D, N = 8, 1
(u,v) = diop_DN(D,N)[0]
print((u,v))
# (3, 1)
```
ここから他の整数解は英語版Wikipediaの[Generalized Pell's equation](https://en.wikipedia.org/wiki/Pell%27s_equation#Generalized_Pell's_equation)に書いてあるように以下の漸化式で生成できます。

$\displaystyle  \large \ \ \ \ x_{n+1}+y_{n+1}\sqrt d = (x_n+y_n\sqrt d)(u+v\sqrt d)$</br>

行列で表すと

$\displaystyle  \begin{pmatrix} x_{n+1} \\\ y_{n+1}\end{pmatrix} =\begin{pmatrix} u & vD \\\ v & u\end{pmatrix}\begin{pmatrix} x_{n} \\\ y_{n}\end{pmatrix} $

となるのでこの行列を掛けていけば無限に解を生成することができます。上の例では行列をAとすると以下のようになります。

<center>$A =\begin{pmatrix} 3 & 1 \times 8 \\\ 1 & 3\end{pmatrix}$</center>

### 3. 係数Matrixを基本解に掛けて解を生成していく

例えば基本解の(8,1)に$A$を掛けると$(32,11)$となり、やはり$x^2-8y^2=56$</br>の解となることが確認できます。

$\displaystyle \ \ \ \  \begin{pmatrix} 3 & 8 \\\ 1 & 3\end{pmatrix} \times \begin{pmatrix} 8 \\\ 1\end{pmatrix} =  \begin{pmatrix} 32 \\\ 11\end{pmatrix} $

これを繰り返して解を生成していくプログラムは以下のようになります。yieldを使っているのでnextを使って好きなだけ解を生成して行けます。

```python
def pelEq(D,N):
  # (u,v): solution to x**2-D*y**2=1
  (u,v) = diop_DN(D, 1)[0]  
  # Matrix to generate other solution
  A = sympy.Matrix([[u, v*D], [v, u]]) 
  # List of fundamental solutions 
  xyl = [sympy.Matrix([[x1], [y1]]) for (x1, y1) in diop_DN(D, N)]

  while True:
    yield [(xy[0],xy[1]) for xy in xyl]
    for i in range(len(xyl)):
      xyl[i] = A * xyl[i]

D, N = 8, 56
ansPelEq = pelEq(D, N)
for i in range(10):
  xylist = next(ansPelEq)
  print(xylist)
# [(-8, 1), (8, 1)]
# [(-16, -5), (32, 11)]
# [(-88, -31), (184, 65)]
# [(-512, -181), (1072, 379)]
# [(-2984, -1055), (6248, 2209)]
# [(-17392, -6149), (36416, 12875)]
# [(-101368, -35839), (212248, 75041)]
# [(-590816, -208885), (1237072, 437371)]
# [(-3443528, -1217471), (7210184, 2549185)]
# [(-20070352, -7095941), (42024032, 14857739)]
```
結果は、最初の呼び出しで基本解を、後はその基本解の各々に係数Matrixを掛けたものになります。値がマイナスの物もありますが式の性質状、絶対値を取った物も解です。基本解がたくさんある場合などは生成された解は必ずしも値の小さい順になっているとは限らないので必要に応じてソートする必要があります。
Dash for mac 向けに Optuna ドキュメントの docset 変換を自動化してみた

（更新：2021-12-22）Optuna のドキュメントが Dash アプリ内から直接ダウンロードできるようになりました！

# 0. はじめに

コードを書く時にドキュメントを参照することは多々あると思うのですが、こんな経験をしたことはないでしょうか？

「ドキュメントを見たいけどにネットに繋げない...」
「ググっても見たいドキュメントに辿り着くまでに時間がかかる...」

この記事ではそんな時に役立つ Dash for mac というアプリと、Optuna のドキュメントをこのアプリ用に変換する作業を自動化した話をご紹介します。

# 1. Dash for mac とは？

Dash for mac はオフラインでドキュメントの検索・閲覧ができる mac 用アプリです。

https://kapeli.com/dash

**オフラインで検索ができる** という部分が重要で、読みたいドキュメントに辿り着くまでの時間をかなり削減できます。

実際の操作例が以下になります。グローバルショートカットでどこからでも呼び出せるのも推しポイントです。

![dash-demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170782/e6be945b-a0d7-254b-7278-7e7505c580fa.gif)


Dash を使ってドキュメントを閲覧するためには、ドキュメントを docset というフォーマットに変換されている必要があります。

デフォルトでかなり多くのドキュメントがサポートされている他、他のユーザーが変換したものを共有する仕組みもあるので、有名なライブラリはある程度網羅されています。

自分が探した範囲では Dash 用の Optuna ドキュメントは提供されていなかったので、それなら自分で作ろう！というのがこの取り組みの始まりでした。

ちなみに、このアプリは **$29.99** とややお高めですが、（たしか）一ヶ月くらいの無料トライアル期間もあるのでぜひ一度試してみて下さい！

# 2. Optuna とは？
Optuna はブラックボックス最適化向けのオープンソースのソフトウェアです。

https://github.com/optuna/optuna

最もポピュラーな使い方は、機械学習モデルのハイパーパラメータ最適化だと思いますが、自分好みのコーヒーの淹れ方を探すために活用されている方もいらっしゃいます。

https://www.mattari-benkyo-note.com/2021/04/01/coffee-tuning-202104/

# 3. Optuna ドキュメントの docset への変換
Sphinx で生成される HTML ドキュメントの場合、[doc2dash](https://github.com/hynek/doc2dash) というモジュールを使うと簡単に変換できます。

今回は自動化ということで、**「Optuna の最新リリースがあったら docset に変換しそれを自分のレポジトリに push する」**という作業を GitHub Actions で実行しました。コピペするにはやや長くなってしまうので、興味のある方は以下のリンクからご参照下さい。

https://github.com/29Takuya/dash-docset-optuna/blob/main/.github/workflows/docset.yml

この workflow は、以下の３つの job で構成されています。

- `fetch` Optuna の最新リリースを GitHub API 経由で取得 & 自分のリポジトリのバージョンを取得
- `build` 最新リリースが自分のバージョンより新しければ HTML ドキュメントを生成
- `docset` HTML ドキュメントを docset に変換 -> 自分のリポジトリにバージョン情報を併せて push 

Github Actions の [schedule トリガー](https://docs.github.com/en/actions/learn-github-actions/events-that-trigger-workflows#scheduled-events) を使うことで、一日に一回、上のフローを実行するように設定しています。
 
## 3.1 参考情報

Optuna の HTML ドキュメントを生成する部分は公式レポジトリの workflow を参考にしました。
https://github.com/optuna/optuna/blob/master/.github/workflows/sphinx-build.yml

それ以外のロジック（どうやってバージョン情報を取得・保持するかなど）はこちらのリポジトリを参考にしました。
今回の目的と同様、AWS-CLI のドキュメントを docset 自動変換する workflow を組んでいらっしゃる方です。
https://github.com/roberth-k/dash-docset-aws-cli


# 4. Dash で Optuna のドキュメントを参照するには（更新：2021-12-22）
上の方法で生成した docset が [Dash 公式の User Contribution レポジトリ](https://github.com/Kapeli/Dash-User-Contributions) にマージされました 🎉

これにより、Dash のアプリ内から直接ドキュメントのインストールが可能になります。`Dash > Preferences > Downloads` の検索バーで "Optuna" と入力すると、ダウンロード可能なドキュメントが表示されるので、`Download` ボタンを押せばOKです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170782/5e39cc72-f539-0302-f16b-00e8bd61c61b.png)

以下のように、Dash アプリから Optuna のドキュメントを参照できるようになりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170782/e8f68d45-98d9-dd01-8a0e-5115c7d8a4b2.png)

今回は手動で User Contribution レポジトリへの PR 作成を行いましたが、このあたりも半自動化できると嬉しいなと思っています。

本記事は以上となります。
最後までご覧頂き、ありがとうございました！
[Jetpack Compose] 複数のComposableを簡単にColumnなどでwrapするショートカット

Jetpack ComposeでAndroid開発をするとき、複数のText ComposableをColumnで囲うなどよくあると思います。

Android Studioには、このような時に便利なショートカット**Surround with widget**があります。

## Surround with widget

例えば以下のような構成のComposableがあるとします

```kotlin
@Composable
fun MessageCard(msg: Message) {
    Text(text = msg.author)
    Text(text = msg.body)
}
```

これを、以下のようにColumnでwrapしたいとします。

```kotlin
@Composable
fun MessageCard(msg: Message) {
    Column {
        Text(text = msg.author)
        Text(text = msg.body)
    }
}
```

2つのText ComposableをカットしてColumnの中に貼り付けて。。。というのは面倒なので、以下のようにショートカットを使います。

![MyVideoGif3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214755/52d68514-0cc8-488d-6301-a81f75868590.gif)

wrapしたいComposableをハイライトしてバルブアイコンを選択すると"Surround with widget"という項目があります。
その中に、Container, Row, Columnの3つが用意されているのでいずれかを選ぶことで簡単にwrapすることができます。

Have a nice compose !!
SECCON CTF 2021 WriteUp

# 概要

※書きかけです。
本記事は、先日2021/12/11～12で行われたSECCON CTF 2021のWriteUp、もとい復習記事となります。

結果は惨敗で、Welcome問題以外解けませんでした････

https://score.azure.noc.seccon.jp/

# 環境
Windows + Kalilinux
プログラムはすべてPython3

# welcome
```
Welcome to SECCON CTF 2021!

The flag is posted at Discord Server
```

Discodeサーバーに記載がありました。
開始しですぐにサーバーが落ちたので、ギリギリで送信できて良かった･･･

```
SECCON CTF 2021 is started!!
the FLAG of welcome: SECCON{https://www.google.cat/search?q=1M%20JPY%20to%20USD}
Good luck!
```

# crypto
## pppp 
```
Great research on witch has made it possible to split and duplicate messages.
```

``

## 

# misc

# web

# reversing

# pwnable


# 所感

# 他の方々のWriteUp

https://nanimokangaeteinai.hateblo.jp/entry/2021/12/14/223037
M1(pro)でpod installができない時の処方箋💊

##🚀はじめに
先日M1Proチップ搭載のMacを調達したのですが、そこでcocoaPodsのインストールができなく結構苦戦してしまい貴重な休日の勉強時間を削られてしまったので、
同じようなエラーが出ている人がサクッと開発に取り組めるようにこの記事を執筆します。

##💥発生したエラー
エラーは全てのライブラリをインストールする時に現れるわけではなく、インストールできないライブラリとできるライブラリが存在したので余計解決を拗らせました。
実際に出たログはこちらです。

```
[!] Oh no, an error occurred.

Search for existing GitHub issues similar to yours:
https://github.com/CocoaPods/CocoaPods/search?q=xx

If none exists, create a ticket, with the template displayed above, on:
https://github.com/CocoaPods/CocoaPods/issues/new

Be sure to first read the contributing guide for details on how to properly submit a ticket:
https://github.com/CocoaPods/CocoaPods/blob/master/CONTRIBUTING.md

Don't forget to anonymize any private data!

Looking for related issues on cocoapods/cocoapods...
Searching for inspections failed: undefined method `map' for nil:NilClass

```

こんな感じです。
こちらの解決方法はこの方の記事がとても参考になりますでの、ご参照ください。

https://zenn.dev/akeome/articles/2433d792db022835c7e7


##💥今回解決していくメインエラー

しかし、こちらの記事の最後の`pod install`を実行するとエラーが出て正常にインストールが走ることはありませんでした。
ログがこちらです。

```
[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details: https://www.ruby-lang.org/bugreport.html

[IMPORTANT]
Don't forget to include the Crash Report log file under
DiagnosticReports directory in bug reports.
```

原因は詳しいことは分かりませんでしたが
rbenvで落としたバージョンが原因ようでしたので同じようなIssueを報告していた方がいたようなので参考にさせていただきました。


https://github.com/CocoaPods/CocoaPods/issues/9907#issuecomment-764697189

```
arch -x86_64 sudo gem install cocoapods
arch -x86_64 sudo gem install ffi
arch -x86_64 pod install
```
こちらで解決できました🦊
M1が直接的に関係しているのか分かりませんでしたがIntelチップでは発生しなかったのでおそらく何がが引っかかったのでしょう。。
Dockerコンテナを使ってJupyterノートブック上でSynapseMLが使える環境をササっと作ろう！

# 概要
SynapseMLを使いたいけど、どうやって環境を作ればよいかわからなかったので、Dockerを使って環境構築する方法を試してみました！


#作業前の環境
- Windows 10 Home
- Docker Desktopがインストール済み

# SynapseML環境構築開始！
## 手順
手順はたったの5つ。

1. Dockerイメージの取得
1. Dockerコンテナの起動
1. Jupyterノートブックの起動
1. ブラウザでJupyterノートブックにアクセス
1. ライブラリのインポート

## 1. Dockerイメージの取得
まずは、Dockerイメージの取得から始める。
MicrosoftのSynapseMLのサイトにDockerイメージに関する情報がある。
[Using the SynapseML Docker Image](https://microsoft.github.io/SynapseML/docs/reference/docker/)

WSL UbuntuやPowershellを開いて、Dockerイメージをプルする。

```bash
docker pull mcr.microsoft.com/mmlspark/release:0.9.4
```

以下のコマンドで、Dockerイメージがローカルにプルできていることを確認する。

```bash
docker images
```


## 2. Dockerコンテナの起動
Dockerイメージが存在していることを確認できたので、イメージを元にコンテナを起動する。

```bash
docker run -it --rm -p 127.0.0.1:80:8888 -v ~/myfiles:/notebooks/myfiles mcr.microsoft.com/mmlspark/release:0.9.4
```

`docker run`コマンドのオプション説明はこちらのサイトを参照。
[Using the SynapseML Docker Image](https://microsoft.github.io/SynapseML/docs/reference/docker/)

以下のようなTTYが表示されればOK。

```bash
root@c19xxxxxxx:/notebooks#
```

作成したJupyterノートブックファイルは以下のローカルフォルダに格納される。
`~/myfiles`

機械学習で利用する入力データ（トレーニング用データ、テスト用データ）をコンテナ起動前に保存しておくと読み込みできる。以下は~/myfiles配下にtitanic/train.csvを保存した場合のデータ読込み例。

```python
import pyspark

spark = pyspark.sql.SparkSession.builder.appName("MyApp") \
  .config("spark.jars.packages", "com.microsoft.azure:synapseml_2.12:0.9.4") \
  .config("spark.jars.repositories", "https://mmlspark.azureedge.net/maven") \
  .getOrCreate()

train_data = spark.read.format("csv").load(
    "/notebooks/myfiles/titanic/train.csv"
)
```

## 3. Jupyterノートブックの起動
Jupyter notebookを起動する。

```bash
/notebooks# jupyter notebook
```

## 4. ブラウザでJupyterノートブックにアクセス
Jupyterノートブックを起動した状態で、Chromeなどのブラウザから`http://localhost`にアクセスすると、Jupyterノートブックが利用できる。

## 5. ライブラリのインポート
Jupyterノートブック上でPySparkとSynapseMLのライブラリをインポートする。
[SynapseML Installation](https://microsoft.github.io/SynapseML/docs/getting_started/installation/)

```python
import pyspark

spark = pyspark.sql.SparkSession.builder.appName("MyApp") \
  .config("spark.jars.packages", "com.microsoft.azure:synapseml_2.12:0.9.4") \
  .config("spark.jars.repositories", "https://mmlspark.azureedge.net/maven") \
  .getOrCreate()

import synapse.ml
```

あとは好きにSynapseMLを使ってコードを書きましょう。

お疲れ様でした✨
WebArena Indigo 環境設定4）時間設定の変更

WebArena Indigo 環境設定3）他のサーバとのssh接続
https://qiita.com/naga_kt/items/eadb6cb39f7f2fc2216d
の続き。

　デフォルト設定のままではUTC時間である。

~~~linux
$date
Wed Dec 15 23:42:06 UTC 2021
~~~

　不便なのでJSTに変えておく。
　ここでUTC時間なのはdateだけでなくて、cronもUTC時間で動いている。同時に変える必要がある。

## タイムゾーンの変更(CentOS7/RockyLinux8)

　時間設定の変更は以下のようにして行なう。/etc/localtimeのリンク先を変えることで、タイムゾーンを変更すればいい。

~~~linux
$su
Password:
#cd /etc/
#ls -lrt localtime
lrwxrwxrwx. 1 root root 25 Oct  5  2018 localtime -> ../usr/share/zoneinfo/UTC
#ln -sf  /usr/share/zoneinfo/Asia/Tokyo localtime
#ls -lrt localtime
lrwxrwxrwx. 1 root root 30 Dec 16 08:54 localtime -> /usr/share/zoneinfo/Asia/Tokyo
#date
Thu Dec 16 08:54:29 JST 2021
~~~


## タイムゾーンの変更(Ubuntu20.04LTS)

　Ubuntuでは以下のように行う。

~~~linux
$su
Password:
#cd /etc/
#ls -lrt localtime
lrwxrwxrwx 1 root root 27 Apr  9 06:07 localtime -> /usr/share/zoneinfo/Etc/UTC
# timedatectl set-timezone Asia/Tokyo
#ls -lrt localtime
lrwxrwxrwx 1 root root 30 Apr 12 11:33 localtime -> /usr/share/zoneinfo/Asia/Tokyo
#date
Tue Apr 12 11:33:54 JST 2022
~~~


## cronの時間設定の変更(CentOS7/RockyLinux8)

　以下も行なってcornの時間設定も変更する。

~~~linux
#service crond restart
Redirecting to /bin/systemctl restart crond.service
#service rsyslog restart
Redirecting to /bin/systemctl restart rsyslog.service
~~~

　cronのログは/var/log/cronに吐き出されているが、crondだけでなく、rsyslogも再起動することで、ログにJSTで吐き出されるのを確認することができる。

## cronの時間設定の変更(Ubuntu20.04LTS)

　Ubuntuでは以下のように行う。

~~~linux
# systemctl restart cron.service
# systemctl restart rsyslog.service
~~~

---

WebArena Indigo 環境設定5）プロセス最大値の変更
https://qiita.com/naga_kt/items/49d04303c26d2a612529
に続く。

---

### 参考記事

CentOS
Amazon Linuxでタイムゾーンを変更してcronの実行時刻にも反映させる
https://qiita.com/owlbeck/items/b8379971890edb755cac

CentOS
Cronがutcで動いてる場合に
http://yoshitsugufujii.github.io/blog/2016/02/03/change-crons-timezone/

Ubuntu
Ubuntu 20.04 LTSでタイムゾーンを変更する方法
https://viasnake.com/ubuntu-20-04-lts-change-timezone-cli/

Ubuntu
Ubuntu-Server 20.04でcron jobが動かない
https://qiita.com/higebobo/items/684bbb6a69702fc8b58b