OmniAICreator/Qiita-1.07M huggingface dataset:
楽をしようとしたら Gem install が失敗して遠まわりになった

新しく開発環境を作っていて、cocoapods をインストールしたかったのですぞ…。

# 忙しい人のための結論

- rbenv レスで gem を使おうとしていた
- homebrew で Ruby を入れて満足していた
- 足りないライブラリがあった
- rbenv 入れとくと色々楽なのでインストールして設定。
- 優勝（そりゃそうだ）

# ログ
`To see why this extension failed to compile,~`　って書いてあるライブラリが不在のようでした。
それ単体でいれようと思っても失敗します。えらい困りました。

```
$ sudo gem install cocoapods
Building native extensions. This could take a while...
ERROR:  Error installing cocoapods:
	ERROR: Failed to build gem native extension.

(略)

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /Library/Ruby/Gems/2.6.0/extensions/universal-darwin-19/2.6.0/ffi-1.15.5/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /Library/Ruby/Gems/2.6.0/gems/ffi-1.15.5 for inspection.
Results logged to /Library/Ruby/Gems/2.6.0/extensions/universal-darwin-19/2.6.0/ffi-1.15.5/gem_make.out
```
# 原因
Ruby のインストールを brew で済まして楽しようとしてた。
brew だとちょっと古かったりしてなにかと不便。

```
$ which ruby
/usr/bin/ruby
```

# rbenv インストール
[インストール方法](https://github.com/rbenv/rbenv#installation) は公式で確認。
(久しぶりに見たら update されていたので、ここでの手順は割愛。)

[バージョン指定方法](https://github.com/rbenv/rbenv#installing-ruby-versions) も要チェック。
(インストールだけで満足してよく忘れるので注意。)

# 本題 Gem
下記のコマンドを打って rbenv 配下にあればおｋ

```
$ gem env home
/Users/hoge/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0
```

あとは `gem install cocoapods` してみて成功したら無事終了。
Pythonでスクレイピング＆機械学習（プロ野球データをもとにHR数を予測）

# はじめに
今回、スクレイピングをして得たデータから、機械学習を行いHR数の予測を行った。その手順をここに残しておく。

# Target
スクレイピング＆機械学習の初学者。私自身初心者であるので、今回のスクリプト等は平易になっている。参考にしていただけると幸いである。

# 概要
####流れを時系列で確認する。
1. webページから、プロ野球の5年分のデータをスクレイピングする。（今回は、[プロ野球データFreak](https://baseball-data.com/)様のデータを使用した。）
2. スクレイピングしたデータをCSVファイルに保存する。
3. CSVファイルのデータを用い、HR数を予測する機械学習モデルを作る。

# データをスクレイピングし、各年ごとにCSVファイルに出力

```
import pandas as pd

da = []

for n in range(21, 16, -1):
    if n == 21:
        url = "https://baseball-data.com//stats/hitter-all/tpa-3.html"
    else:
        url = f"https://baseball-data.com/{n}//stats/hitter-all/tpa-3.html"
    da = pd.read_html(url, header=1)[0]
    np = pd.DataFrame(da)
    np_h = np.drop("順位", axis=1)
    np_h.to_csv(f"npb_h{n}.csv", index=False)

print(np_h)
```
pandasを用いてスクレイピングする。ここでは21~17年までの打者成績を取得している。urlは21年度のみ少々違っている為、このような処理になった。

.dropを使い、順位のデータを落としている。あとで盗塁のデータ等も落とすので、ここで不必要なデータをすべて削除しておくべきだった。

# データクレンジングを行う
```
import pandas as pd
import glob

csv_files = glob.glob('~/*.csv')
li = []
print(csv_files)
for f in csv_files:
    li.append(pd.read_csv(f))

print(li)
dd = pd.concat(li, ignore_index=True)
dd.to_csv("npb_h.csv", index=False)
```
各年のCSVファイルを一つに結合する。glob.globでディレクトリ内の.csvが付くファイルを取得している。

```
import pandas as pd

npb = pd.read_csv("npb_h.csv")

dr_npb = ["選手名", "チーム", "盗塁", "本塁打"]
npb_t = npb.drop(dr_npb, axis=1)
npb_hr = npb.loc[range(0, 289), "本塁打"]

npb_t.to_csv("npb_ht.csv", index=False)
npb_hr.to_csv("npb_htr.csv", index=False)
```
いらないデータを削除する。ここでは、選手名、チーム名、盗塁を落とし、目的変数である本塁打も落としている。そして、本塁打だけのデータを作成する。

# 機械学習を行う
```
from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split
import pandas as pd

hr_features = pd.read_csv("npb_ht.csv")
hr_target = pd.read_csv("npb_htr.csv")

x_train, x_test, y_train, y_test = train_test_split(hr_features, hr_target, test_size =0.25, random_state=0)

Lasso = Lasso(alpha=0.1, random_state=0)
Lasso.fit(x_train, y_train)

target_Lasso = Lasso.predict(x_test)
print(np.round(target_Lasso))
```
このコードで行った。今回は練習がてら行ったので、特に何も考えずLassoを用いて学習した。

# 結果
HR数の多少は、ある程度は判断できたが、精度は低かった。また、ホームラン数が負になる等、明らかにおかしい値も出た。
# おわりに
機械学習の練習を、プロ野球のデータを用いて行った。どのモデルがいいのか等、推敲はまだしていない。初学者がとりあえずプログラムを組むのに参考にしていただけると幸いである。
paramiko で known_hosts をちゃんと読む

# Paramiko でよく見かける `not found in known_hosts`

PythonでSSHによるリモート接続周りを自動化しようと思うと、paramiko を使うことが多いかと思いますが、
ほぼほぼこちらのエラーと遭遇するのではないでしょうか。

```
paramiko.ssh_exception.SSHException: Server ‘～～～～～’ not found in known_hosts
```
今回はこちらに対応してみます。

# 対応方法1

```python
with paramiko.SSHClient() as ssh:
    ssh.set_missing_host_key_policy(paramiko.WarningPolicy())
    ssh.connect(...)
    ...
```

よくある、無視しちゃえ、というやり方です。
Google先生に聞くと、こちらの方法がたくさん出ます。

今回は別の方法も見ていきます。

# 対応方法2

```python
with paramiko.SSHClient() as ssh:
    ssh.load_system_host_keys()
    ssh.connect(...)
    ...
```

システムのknown_hosts を読ませることで、known_hosts に記録されたホストに関してはエラーが起きずに実行できます。…ですが、自動的に実行しようと思うと、そもそも known_hosts にエントリが無いよ！という状態になりがちです。

そこで…paramiko を利用する前に、次のコマンドで known_hosts を作成します。

```Bash
touch ~/.ssh/known_hosts
ssh-keygen -R example.com
ssh-keyscan example.com
```

touch しているのは、初期状態だと known_hosts ファイルが無く、ssh-keygen がエラーとなるためです。
接続先のポートが標準ポート(22)じゃない場合は、次の通り。

```Bash
touch ~/.ssh/known_hosts
ssh-keygen -R [example.com]:10022
ssh-keyscan -p 10022 example.com
```

これで、エラーが発生しなくなります。

**注意**: 上記の方法は無条件に鍵を信じる動きであり、本質的には警告を無視するのと同等の行為です。安心できる接続先に対して利用しましょう。
【Git】rmコマンド と .gitignoreファイル を使い、Gitからファイルを途中除外する方法

# 目的
急にGit上から削除したいファイルができたときの対処法を学ぶこと


# この記事が必要なA君の話
あなたはToDoアプリの個人開発を始めました
Gitを使いバージョン管理もバッチリ行っています

**しかし！** 
開発から10日経ったある日、「機密情報が入ったテキストファイル(Secret.txt)をGit上にあげていたこと」に気づく

**やばい、Git上から消さないと。また、今後もずっとGit上へあげないようにしなければ。**
### → この記事の出番です



# 流れ
## ① : 対象ファイル(Secret.txt)を、現在のGit上から削除したい。(作業フォルダからは削除しない)

```ターミナル.app
git rm -r --cached Secret.txt
```

・`git rm -r --cached` によって、作業フォルダにファイル(Secret.txt)を残し、Git上からのみファイルを削除できる。

！ `gir rm Secret.txt`だと、作業フォルダからもファイル(Secret.txt)が削除される.


### ① を図で説明

**↓ ファイルの確認**
<img width = 500 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/eca86597-856c-93e7-97e9-d23d2afc3bbe.png">

**↓ コマンドでGit上からファイルを削除**
<img width = 600 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/332b5e25-7c88-21b2-df7e-cb84e703d39a.png">

**↓ Git上で削除されたことを確認**
<img width = 500 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/55af846b-1985-7f6f-b55a-a1137cc25f29.png">

**↓ フォルダ内にはファイルが残っていることを確認**
<img width = 500 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/eca86597-856c-93e7-97e9-d23d2afc3bbe.png">


## ② : 対象ファイル(Secret.txt)を、今後Git上にあげないようにする

```ターミナル.app
echo "Secret.txt" > .gitignore
```

・`.gitignore` にGit上へあげたくないファイル名を記載すると、次回の add からGitへあげられなくなる。.gitignore以下の階層全てのフォルダに、.gitignoreの効果が適応される。

・`echo "入力したい文字" > ファイル名` によって、ファイルと入力したい文字をセットで新規作成できる。

:::note warn
注意
.gitignoreを作成後は以下の「add」「commit」を実行してください

git add .
git commit -m "コミットメッセージ"
:::


### ② を図で説明

**↓ .gitignoreファイルを作成**
<img width = 500 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/34083d06-c200-a1a4-c317-986bfd39d2ec.png">

**↓ .gitignoreファイルの中身を確認**
<img width = 500 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/8eb27115-32cd-6135-7ddd-45a0d575333d.png">

**↓ add と commit **
<img width = 500 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/f1e45959-c3b8-9283-769b-aea73341ec08.png">



## ③ : 本当に対象ファイル(Secret.txt)がGit上へあがらないか確認

Secret.txt へ何か変更を加えて、`git status`で確認。

`git status` は、Gitの対象となるファイルの状態(add済みかどうかなど)を確認できる
そのため、git status を実行し、Secret.txtが表示されない場合は、Secret.txtがGit上へ上がることはない という意味になる。


###　③ を図で説明

**↓ Secret.txtに変更を加える**
<img width = 500 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/43895edd-f340-aca0-8803-d5179675d567.png">

**↓ Gitの対象になっていないか確認**
<img width = 500 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/8c8188ea-b631-ac5b-8f9b-dedb9419e044.png">

### OK!
strftimeメソッドの使い方

rubyシルバーを勉強していくなかで、strftimeメソッドについてわからなかったので、解説していこうとおもいます。

##strftimeメソッドとは
strftimeメソッドとは、Timeクラスのインスタンスメソッドなんです。
Timeクラスとは名前からも分かる通り、時刻を表すクラスです。

このメソッドをもし使わなかったら、どう時刻や日付を表現するのでしょうか(あくまで一例です)

```
date = DateTime.now
=> Tue, 01 Feb 2022 22:36:33 +0900
```
でも、フロント画面にこう表示されたら、ちょっとイケてないですよね。
そこで登場するのが、strftimeメソッドなんですね。

##実際に使ってみましょう

```
date = Datetime.now
date.strftime('%Y年%m月%d日')
=> "2022年02月01日"

date.strftime('%Y年%m月%d日%H時%M分')
=> "2022年02月01日22時52分"
```

他にも使えるフォーマット文字列があるので、[こちら](https://docs.ruby-lang.org/ja/latest/method/Time/i/strftime.html)の公式ドキュメントを参考にしてみてください

##実際に問題を解いてみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485775/8d17df5d-7e0f-4a00-c39f-f6079aac2a32.png)

###選択肢➀
%xは、%Dと同じなんです。じゃあ、%Dはどんな結果を出すかというと、%m/%d/%yを表現します。
%mは01~12で表し、日にちを表します。%dは、01~31で日付を表します。%yは西暦の下二桁を表します。今回の問題でいえば、15です。

これが正解になります。

###選択肢➁
%m/%d/%Yを見ていきましょう。%mは、日にちですね。01~12を表します。%dは01~31を表します。ここまでは正解なのですが、%Yがアウトです。
%Yは西暦を表すんです。今回の問題でいえば、2015を表します。
そのため、この問題では不正解です。

###選択肢➂
%mは、日にちですね。01~12を表します。%Dは「/月/日/年」を表現するので、この時点で、この選択肢は不正解ですね。%yは、西暦の下二桁を表します。今回の問題でいえば、15です。

###選択肢➃
%Mは、分を表すので、この時点で不正解になります。

以上より、この問題の選択肢は➀が正解です

以上です。何か間違いがございましたら、ご教示いただけますと幸いです。

【参考文献】

https://docs.ruby-lang.org/ja/latest/method/Time/i/strftime.html

https://pikawaka.com/rails/strftime
【Nuxt】vue-chartjsの読み込みに失敗する！

> TypeError: chart_js__WEBPACK_IMPORTED_MODULE_0__.default is not a constructor

こんなメッセージが出てくる。なんでやねん！グラフ出したいだけなんですけど？！

https://reffect.co.jp/vue/nuxt-js-vue-chartjs-easy-to-use
こことかを参考にやってんだけどなぁ・・・

なんでこう記事では簡単に導入できてんのに、自分のときはエラーが出るんだ～！！って毎回思うｗ

### 解決の際に参考したサイト
https://zenn.dev/kigi/scraps/f8c72302c0f84e
https://stackoverflow.com/questions/66940954/why-does-nuxt-give-me-this-error-with-vue-chartjs

### 解決策

####package.jsonのchart.jsのバージョンを2.9.4に書き換える
```json:package.json
"dependencies" : {
    "chart.js": "^2.9.4", //このバージョンに書き換える
...
    "vue-chartjs": "^3.4.0",
...
}
```

####.nuxtとnode_modulesとpackage-lock.jsonを削除

一旦上記のフォルダを削除

####node install を実行

```
$ node install
```

実行後にnode_modulesとpackege-lock.jsonが作成される

####yarn devを実行

```
$ yarn dev
```

このタイミングで.nuxtが作成される。

上記の手順で何故かうまくいきました。
どこが要だったのかよくわかりませんが、chart.jsのバージョンの変更は間違いなく必須だと思います。
副作用とコマンド・クエリ分離の原則 (CQS) について簡潔にまとめてみた

# プログラミングにおける副作用とは？

- 関数またはメソッドを実行した時に、オブジェクトの属性が変化すること
  - 例）メソッドのスコープ外の変数の値を変更している
    - この場合、時間とともに変数の値が変化し続ける → 毎回違う結果になる可能性が高い  
<br />
- 予期せぬエラーを発生させるリスクとなる
    - どこに影響があるか都度調査しなければならない  
<br />
- 副作用を防ぐには**参照透過性**を担保する必要がある
  - 参照透過性 = 同じ条件を与えれば必ず同じ結果が得られる
  - 他の機能に影響を与えない

### 副作用のコード例
```c#
    // 副作用の例
    // Add を実行するたびに得られる結果が変わってしまう
    int a = 1;
    public int Add(int b)
    {
        a = a + b;
        return a;
    }
```

# コマンド・クエリ分離の原則（CQS）

- 副作用を最小限に抑える設計原則
- メソッドがオブジェクトの状態を変更するのであれば、そのメソッドはコマンド
    - 値を返してはいけない
- メソッドが何らかの値を返すのであれば、そのメソッドはクエリ
    - オブジェクトの状態を変更してはいけない
- 状態を変更するメソッドと変更しないメソッドを明確に分ける → 非常に扱いやすくなる
  - 副作用によるリスクを局所化する

# 参考文献

https://python.ms/side-effect/#_1-%E5%89%AF%E4%BD%9C%E7%94%A8%E3%81%A8%E3%81%AF

https://rakusui.org/cqs/

https://blog.j5ik2o.me/entry/20110211/1297442876
GitHubでセキュリティアラートが出たときの対処法

Githubからメッセージが出た時にどのようにしたら良いのか自分なりに説明します。
#1.結論
下のように書き換える

```ruby:Gemfile
# Use Puma as the app server
gem "puma", ">= 5.5.1"
```
```terminal
$　bundle update
```
#2.アラートが出た原因
依存パッケージの脆弱性が理由です。
#3.補足（メモ用）
##3-1pumaとは
pumaとはRails用のアプリケーションサーバーです。
アプリケーションサーバーには次のような役割があります。
・webサーバーからリクエストを受け取ると、Railsアプリケーションに知らせる
・アプリケーションがリクエストを処理すると、そのレスポンスをwebサーバーに返す。
##3-2セキュリティアラートのメッセージの意味
「We found potential security vulnerabilities in your dependencies.」
　依存関係に潜在的なセキュリティの脆弱性が見つかりました。
##3-3 Dependabot
GitHubはリポジトリ内の脆弱な依存関係を検出したときに Dependabotのアラートを作成し、その内容をリポジトリのセキュリティタブに表示します。
メリットとしては
・依存関係をあげる手動のプルリクを抑制できる
・いくつもあるプロジェクトを定期的に人力で循環せずに済む
などが挙げられます。
#参考記事
[GitHub の Dependabot Alerts とは何か](https://zenn.dev/yuuhu04/articles/about-github-alert)
[GitHubでセキュリティ脆弱性のアラートが来てビビりながら対応した話]
(https://qiita.com/Nash-BETA/items/0d4e876cf9460778b985)
[GitHubで依存関係のセキュリティの脆弱性を指摘された]
(https://qiita.com/mzmz__02/items/c8f5337f2991ccdd5d4f)
[アプリケーションサーバーについての説明]
(https://ja.stackoverflow.com/questions/17813)
Macにmoshで接続する方法

Mac「で」moshを使いたい人は回れ右。
Mac上でmosh-serverを動かして、そこに接続したい人向け。

# 環境
- サーバ：Mac mini(M1), Monterey
- クライアント：iPad Pro 11-inch(1st generation), iPadOS 15.2.1, Blink(14.0.6)

Catalina以降のアプリケーションファイアウォールがあるOSなら同じ対応と思われる。

# 設定
## Mac側
公式HPの更新がCatalina以前で止まっており使えるか心配だが、[Homebrew版](https://formulae.brew.sh/formula/mosh)がちゃんと更新されているため使える・・・・・・んだけどCatalinaで導入されたアプリケーションファイアウォールが一筋縄でいかない。

1. `brew install mosh`
1. システム環境設定
1. セキュリティとプライバシー
1. ファイアウォール
1. ファイアウォールオプション
1. `opt/homebrew/Cellar/mosh/1.3.2_18/bin/mosh-server`の「外部からの接続を許可」
1. 「ダウンロードされた署名付きソフトウェアが・・・」にチェック

`mosh-server`の場所は各人の環境に合わせること。特に[1.3.2_18]の部分。
さらに次のスクリプトをMac上に作成しておく。これは[github](https://github.com/mobile-shell/mosh/issues/898)から持って来たもの。正直、ファイアウォールのon-off以外は機能してないから省略しても問題ないはず。

```firewall_switch.sh
# i recommend setting up the following alias first
alias firepower='sudo /usr/libexec/ApplicationFirewall/socketfilterfw'

# temporarily shut firewall off
firepower --setglobalstate off

# add symlinked location to firewall
firepower --add $(which mosh-server)
firepower --unblockapp $(which mosh-server)

# add homebrew location to firewall
firepower --add $(brew --prefix)/Cellar/mosh/1.3.2_2/bin/mosh-server
firepower --unblockapp $(brew --prefix)/Cellar/mosh/1.3.2_2/bin/mosh-server

# re-enable firewall
firepower --setglobalstate on
```

本来はこれだけで成功することが期待されるけど残念ながら後述の操作が必要。

## クライアント側
特になし。

# 接続方法
`mosh-server`が外部と通信できるようにするために一手間かける。
ちなみにファイアウォールを切ってしまえば何の問題もなく`mosh-server`と通信できることから、ファイアウォール周りの問題だと分かる。

1. クライアントからmosh接続を開始する
1. **UDPポートへ接続を試みてる間に**クライアントの新規タブもしくはMac側のターミナル上で先述の`firewall_switch.sh`を実行する
1. 一度接続に失敗する
1. 再びmosh接続を試みるとなぜか成功するようになってる！

`firewall_switch.sh`に関してはMacのシステム環境設定でファイアウォールをon-offで代用できたかもしれない。やる気がなくてちゃんと検証してない。
一度mosh接続できるようになると、Macを再起動するまではファイアウォールを弄る必要はない。

# 結論
Macもmoshサーバになる！
Windows > cmd > コンソールとファイルに出力する



# やりたいこと

WindowsでShellを実行する際に、コンソールで確認しつつ、結果をファイルに出力したい


# 結果

標準では、２つ同時（コンソール出力＆フィある出力）はできない模様

https://packpak.hatenablog.com/entry/2016/09/02/225015


ということから、Windowsでは、`safetee` というソフトを使う

https://www.vector.co.jp/soft/dos/util/se482246.html?ds


`safetee` ありがたい。
LPICレベル1の勉強方法

##自己紹介
工場で働きながらプログラミングの勉強をしています。
LPIC勉強前は基本的なLinuxコマンドしか分からなかったです。

##LPIC101の勉強をしようと思った理由
簡単なLinuxの基礎コマンドしかわからない状態だったので、
LPICの資格勉強でより体系的に学びたかったからです。
資格勉強で学んだことを活かし、Linuxサーバーの構築などを行う時に現場で活躍したいと思ったからです。

##勉強法
- Linux教科書 LPICレベル1 Version5.0対応の参考書を読む

- 参考書を一通り読んだ後、Ping-tの問題を解く

- 問題を全問解いた後、全問ヒット(問題に正解)にする
- 全問ヒットにした後、全問コンボ(問題を２回連続で正解)にする
- コマンド問題を一通り解く

##勉強期間
12/1~1/31の2ヶ月間です。
2ヶ月間だけLPICを勉強してLPICレベル1の資格を取得する予定でしたが、
勉強して1ヶ月後に受けたLPIC101の試験で470点を取り不合格になってしまい、2ヶ月で資格取得することが不可能だと感じました。
このままダラダラと勉強はしたくないと考え、資格取得を断念し、残りの時間をLPIC102の勉強にあてました。

##最後に
今後LPICレベル1の資格勉強をするときに参考になればと思います。
UselethMinerでのM1 Mac イーサリアムマイニング

# UselethMiner
Chainfire氏による[UselethMiner](https://github.com/Chainfire/UselethMiner)(注:UselessMinerではない)というCPUメインのイーサリアムマイナーを見つけたので、M1 Mac miniで試してみました。

ハッシュレートは4MH程度で消費電力はサンワのワットモニターで24W前後です。2022/2/1時点だと1日数円程度の利益にしかならないですが、以前解説した[XMRigでのRandomX CPU & KAWPOW GPUの併用](https://qiita.com/asfdrwe/items/53e7e10a47c43652ae5b)より効率的だと思います。

オープンソースではないのでどのように高速化しているかわからないのですが、[Chainfire氏のツイート](https://twitter.com/ChainfireXDA/status/1483359562220593155)によると、ARMv8の様々な命令を駆使することでM1 MaxではCPUだけでハッシュレートが10MH以上、MetalによるGPU活用を組み合わせると20MHまでいくようです。

## ダウンロードとインストール
2022/2/1時点で最新版は0.23です。

[こちら](https://github.com/Chainfire/UselethMiner/releases/tag/v0.23)から[uselethminer-0.23-macos-arm64.pkg](https://github.com/Chainfire/UselethMiner/releases/download/v0.23/uselethminer-0.23-macos-arm64.pkg)
をダウンロードしてください。

通常のパッケージ形式のインストーラなので、Finderからダウンロードしたファイルを開き、画面の指示に従い標準の場所にインストールしてください。`/usr/local/uselethminer/`にインストールされます。

## 実行
ランチャーからターミナルを起動してください。

[NiceHash Pool](https://www.nicehash.com/)を利用してマイニングする場合(ロケーション:usa-west)は、

```
$ /usr/local/uselethminer/uselethminer 
『NiceHashの自分の報酬ビットコインアドレス』.『NiceHashの自分のWorker名(何でもいい)』@daggerhashimoto.usa-west.nicehash.com:3353
```
で実行できます。

初回実行時は最初にベンチマークを実行したりDAGの処理を行うようなのでマイニング開始まで数分かかります。正しく実行できていればこんな感じでハッシュレートが表示されマイニングするはずです。

```
...
[2022-02-01 21:49:44][STATUS] CPU[ 4198003 h/s :: 32.03 GB/s ] 
```

### 2回目以降の実行
2回目以降はベンチマークの実行がなくDAGの処理が短時間で済むのですが、手元のM1 Mac miniだとなぜかハッシュレートが下がります。

```
[2022-02-01 21:54:07][STATUS] CPU[ 3325707 h/s :: 25.37 GB/s ] 
...
[2022-02-01 21:54:45][STATUS] CPU[ 2563810 h/s :: 19.56 GB/s ] 
```

uselethminerのデータやログは`~/.uselethminer`に保存されているので、

```
$ rm -rf ~/.uselethminer
```
を実行してuselethminerのデータを消せば、また初回のベンチマークの実行とDAGの処理によりマイニング開始まで時間がかかりますが、ハッシュレートは4MHに戻るはずです。

### GPUの利用
-fg metalオプションを付けて実行すればGPUを併用できるようですが、M1 Mac miniではsegmentation faultで落ちます。

```
zsh: segmentation fault  /usr/local/uselethminer/uselethminer  -fg metal
```

xmrigのKAWPOW GPUマイニングとの併用もうまく行きません。uselethminerとxmrigの両方がまともに動作しないです。

### その他の情報
細かいオプションは[README.md](https://github.com/Chainfire/UselethMiner/blob/master/README.md)を参照してください。-tでCPUの割り当てや最大CPU使用量の指定ができるようです。
QiitaのMarkdownパーサー変更にともなう、見出しについてのいろいろな書き方と注意点

## 記事投稿シリーズについて

QiitaでGitHub Flavored Markdown (以下GFM) に準拠したMarkdownパーサーが[ベータ版として公開されました！](https://blog.qiita.com/replace-markdown-parser-beta/)

[Qiitaアカウントによる説明記事](https://qiita.com/Qiita/items/e87ebe3138f62b0e8b58)にも書いてあるのですが、今までと記法が変わっている箇所があるので注意が必要です。
せっかく書いた記事の表示が崩れてしまうのは困るので、可能な限り防ぎたいと考えています！

そこで、記事を書く時に注意すべき記法などについて、Qiita運営から5日間に分けて10記事のシリーズで投稿することになりました！
少しでも皆様が執筆する際の助けになればと思います。

詳しくはQiitaアカウントによる説明記事に、投稿シリーズの説明や、他の記事一覧が載っていますのでぜひ他の記事も読んでみてください！

https://qiita.com/Qiita/items/e87ebe3138f62b0e8b58


## 基本の書き方
見出しを書くときの　基本形はこんな感じになります。🔽

```
# 見出し

## 見出し

### 見出し

#### 見出し

##### 見出し

###### 見出し
```

見え方はこんな感じです。🔽
![スクリーンショット 2022-02-02 15.20.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/9a902f2d-6e3e-7bd6-9eaf-04d5750b9336.png)
※ `###### 見出し` は`<h6>見出し</h6>`となりますが、フォントサイズやフォントウェイト等は、変わりません。

## 他の見出しの書き方
### `=`を使った見出しの書き方
`=`を使うと、**h1**を表現できます。
見出しの次の行に`=`を一個以上入力するとh1になります。
この書き方をすることで、改行を含む見出しにすることができます。

```
見出し
=
```

### `-`を使った見出しの書き方
`-`を使うと、**h2**を表現できます。
見出しの次の行に`-`を一個以上入力するとh2になります。
この書き方をすることで、改行を含む見出しにすることができます。

```
見出し
-
```


## _見出しで_ ~~使える~~ `Markdown` [記法](url) :qiita-fabicon: [^1]

### **ボールド**
```
### **ボールド**
```
見た目では区別はありませんが、ちゃんと`<strong>ボールド</strong>`となります。

### _イタリック_
```
### _イタリック_
```

### ~~打ち消し線~~
```
### ~~打ち消し線~~
```

### `コード` `#FFFFFF`
```
### `コード` `#FFFFFF`
```
色コード(RGB16進数表記)を入れてもちゃんと色が表示されました。

### [リンク](url)
```
### [リンク](url)
```

### 絵文字 :qiita-fabicon:
```
### 絵文字 :qiita-fabicon:
```
絵文字もちゃんと表示されました。
:lgtm: :xmas-tree: :edit-request: :xmas-wreath1: :file: :xmas-wreath2: :stock: :xmas-hat:

### 注釈[^2]
```
### 注釈[^2]
[^2]: 本文の語句や文章をとりあげてその意味を解説すること
```

### ![画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/5b725166-6a80-35f8-149c-680c4c3f09b7.png)
```
### ![画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/5b725166-6a80-35f8-149c-680c4c3f09b7.png)
```

### 見出しでは、使えないこと　
- note記法
- リスト
- チェックボックス
- 引用
- 水平線
- 表
- 数式
- リンクカード
- X(Twitter)埋め込み
- CodePen
- バックスラッシュでのMarkdown無効化



## 注意点
### `#`が7つ以上は見出しではなくなる
`#`の数で、H1〜H6を表現できますが、`#`を7つ重ねてると見出しではなくなります。

```
❌ #の数が多い
####### 見出し
```

### `#`の前に半角スペースがあっても見出しとして、読み取られる。
半角スペース3つまでは、見出しとして、読み取られるようです。

```
⭕️ #の前に半角スペースがある
 ###### 見出し
```

### `#`の後ろに半角スペースがないと見出しとして、読み取ってくれません。

```
❌ #の後ろに半角スペースがない
######見出し
```

## 最後に
他の記法についてもまた別の記事でまとめていますので、合わせて読んでみてください！
詳しくは[Qiitaアカウントによる説明記事](https://qiita.com/Qiita/items/e87ebe3138f62b0e8b58)をご覧ください！

---

↓記事投稿シリーズまとめ

https://qiita.com/Qiita/items/e87ebe3138f62b0e8b58

↓次の記事

https://qiita.com/kyntk/items/4fd09e6fb041edeac2d9



[^1]: Qiitaのfavicon
[^2]: 本文の語句や文章をとりあげてその意味を解説すること
【TypeScript】TypeScriptの基本的な型について

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

##TypeScriptの基本的な型について

###TypeScriptの型定義の方法
型を指定するためには、変数の後に`:`をつけ、その後ろに型を記述します。


###TypeScriptの基本的な型一覧
TypeScriptの方について基本的なものは以下の通りです。

```.ts:基本的な型一覧

// boolean
let bool: boolean = true;

// number 数値
let num: number = 10;

// string 文字列
let str: string = "ABC";
 
// Array 配列 （2通り）
// Arrayの後に配列の要素の型を記述する方法
let arr1: Array<number> = [0, 1, 2, 3];
// 配列の要素の型を記述し、その後ろに[]を記述する方法
let arr2: number[] = [0, 1, 2, 3];

// tuple （配列の要素の型を順番を含めて指定。）
let tuple: [number, string] = [4, "B"];

// any （どのような型を入れてもエラーが出ない。全ての型を許可。）
let any1: any = false

// void (関数が何も返していないことを示す。自動で予測されるため省略可能。）
const func1 = (): void => {
  const sample = "sample";
};

// null 
let null1: null = null;

// undefined
let undefined1: undefined = undefined;

// object
let obj1: object = {};
// オブジェクトの各プロパティの方を指定
let obj2: {　id: number, name: string } = {　id: 0, name: "田中"　};

```
LinuxでVSCodeの拡張機能 "Discord Presence" が機能しない問題

# はじめに
Discord PresenceはVSCodeの拡張機能です。
プログラミングをする方で、Discordも使っているという方であれば、フレンドのステータスに**Visual Studio Codeをプレイ中**と表示されているのを見たことがある方もいると思います。
ズバリこの拡張機能であれができます。
今回自分は記事のやり方で解決しましたが、もしかしたら解決しない方もいるかもしれません。
そのときはすみません。

https://marketplace.visualstudio.com/items?itemName=icrawl.discord-vscode

# 環境
- Linux(KDE neon 5.23.5)
- VSCode 1.63.2
- Discord Stable 112824 Host 0.0.16

# 問題
VSCodeに拡張機能をインストールしても正常に機能しません。
試しにVSCodeの再起動をしてみると、なにやら起動時に拡張機能で**Connect Error**が発生しているようです。
Discord側の原因かと思いDiscordも再起動してみましたが改善せず。

# 原因
**DiscordをFlatpak経由でインストールしていたのが原因でした。**
FlatpakはLinuxのソフトウェア(パッケージ)を管理するツールです。Ubuntuであれば、ソフトウェアセンターなどからアプリを検索したら、通常はFlatpakでインストールされるのではないでしょうか。
KDE neonもUbuntuベースなのでソフトウェアセンターがデフォルトで入っています。
ソフトウェアセンターはGUIですし、複数のソフトウェア(パッケージ)管理ツールを一元的に管理できるため、非常に便利に思っていたのですが、とんでもないところに落とし穴があるものですね。

# 解決策
**Discord公式からパッケージをダウンロードしてインストールすればよいです。**
どうやらDiscordは公式サイトで直接パッケージを配布しているようです。
なので、今回はこれを新たにインストールし直します。

https://discord.com/download

### 手順
言うまでもないですが念のため。
はじめに、ソフトウェアセンターを使って、Flatpak経由でインストールしたDiscordをアンインストールします。
次に、Discord公式の「Linux版をダウンロード」から、パッケージをダウンロードします(Ubuntuであれば.debでいいはず)。
最後に、ダウンロードしたdebパッケージを開いて、画面の指示に従いつつDiscordをインストールします。
**Done!**

# おわりに
Linuxに関する詳しい知識がないのでなんとも言えないのですが、パッケージ管理ツール(の依存関係など？)によるバグやエラーというのはたまに聞くことがあった気がします。
今回は直接的な原因とは言いにくい気もしますが、こんなこともあるのかと勉強になりました。
Linuxを使用している方で、**「プログラミング頑張ってるよ！」**とアピールしたい方は、ぜひDiscord Presenceを使ってみてください。

# 参考
https://github.com/iCrawl/discord-vscode/issues/77
React Nativeでビルドするときにerror code 65と言われる

###エラー内容

初期の頃は結構このエラーで何時間も食われてしまったのとたまに出てきてしまうので少しだけメモ。
下のエラーが`npx react-native run-ios`の時に出てくる。

```
error Failed to build iOS project. We ran "xcodebuild" command but it exited with error code 65. To debug build logs further, consider building your app with Xcode.app, by opening hogehoge.xcworkspace.
Command line invocation:
.....
```


###対処法
1. Xcodeを開く
1. 左側からプロジェクトを選択。
1. 中央にあるワークスペースのタブからSigning & Capabilities > Signing(Debug)にあるTeamを選択する。

![スクリーンショット 2022-02-01 22.26.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1789530/87210dca-d637-6f14-fd62-5b63cd641c92.png)
【github】privateリポジトリをazure上CentOSマシンからgit cloneする 

0.事象
-
リポジトリをpublicにするのが恥ずかしいので、privateに設定したが、
Azure上仮想マシン(centos)からgit cloneを実行するとエラーが発生する。

[xxx@xxx xxx]# git clone https://github.com/xxx/xxx.git
Cloning into 'xxx'...
Username for 'https://github.com': xxx
Password for 'https://xxx@github.com':
remote: Support for password authentication was removed on xxx, xxx. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
fatal: Authentication failed for 'https://github.com/xxx/xxx.git/'

1.環境
-
Azure環境OS:CentOS Linux release 7.9.2009 (Core)

2.解決策
-
github上で、cloneができる権限を付与したtokenの発行を行い、
パスワード入力の際にtokenを使用する。

1)githubのwebUI右上のアイコンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291965/6c1747eb-7080-8b63-08bc-035bc9cbb5cb.png)

2) settingsをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291965/dda58f72-2f94-ba2e-1434-b4a965e407a3.png)

3) 画面を少しスクロールして「Developer settings」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291965/b9a0f982-09a5-5c2f-039d-ee07160c8a61.png)

4) 「Personal access tokens」をクリックして、「Generate new token」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291965/a6ac233c-bd9a-b89a-7c39-7f7f86520783.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291965/a80deac9-5cc8-5394-8a26-6bbf28a56916.png)

5) 適当にNoteを入力、期間を選択し、「repo」にチェックを入れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291965/c7b2b7d1-8ce0-ab55-758b-84f3c2d94644.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291965/4cfbd524-4db1-e507-9190-161e8d7efae6.png)

6) 画面をスクロールし、Generate token をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291965/2a8db40d-b0fe-e979-50fe-71ba30c9426f.png)

7) 画面に長い文字列が表示されるので、それをテキスト等に保存しておく。

8) 仮想マシンにアクセスして、git cloneコマンドをたたいてユーザを入力したあと、
　パスワードが聞かれると思うので、そのタイミングで先ほどの長い文字列をペーストするとclone完了。

3.まとめ
-
github　difficult but useful
Ardupilot(アルジュパイロット)とは

#目次
[1.はじめに](#1-はじめに)
[2.アルジュパイロットとは](#2-アルジュパイロットとは)

#1. はじめに
色々な記事でArdupilotを見る事が増えて気になったので調べようと思った！

・[春原久徳さんの記事](https://www.drone.jp/column/2021070616000046984.html "春原久徳さんの記事")
`中国機体および中国製のフライトコントローラー搭載機体（事実上DJI機体やDJIのフライトコントローラー）の展開が役員会で通らなくなった。
`

・[ドローンによる安全な外壁調査を実現するシステムを開発](https://www.nedo.go.jp/news/press/AA5_101421.html "ドローンによる安全な外壁調査を実現するシステムを開発")の記事で、フライトコードにArdupilotを使用

・[無人機開発エンジニア育成の記事](https://drone-journal.impress.co.jp/docs/event/1182962.html "無人機開発エンジニア育成の記事")
`「ドローン活用は市場に流通している機体に大きく依存しており、流通している機体がDJI社製の空撮機が主流であること」を挙げた。より広範囲に活用されるためには空撮だけではない、各用途に応じて機体を構成できる「柔軟性」が求められる。
　そのような中、オープンソースのソフトウェアArduPilotでは、フライトコードのカスタマイズ、センサーやカメラなど様々な機器の接続、コンパニオンコンピュータを搭載した高度なAI処理の実装が可能である。さらに、いわゆるドローンに限らず、陸海空の多様な形状の機体に搭載することができる`

#2. アルジュパイロットとは
- オープンソースのソフト
    - 世界中のエンジニアが、新機体へのサポートやセンサー、Lidarなど周辺機器のドライバー開発、非GPS環境での測位の開発を行っている
- ArduPilotの柔軟性・拡張性によって、ドローン活用のフィールドは拡大すると期待されているらしい
    - 柔軟性(用途によって色々できる)
        - 壁点検などで距離センサーやカメラなどを接続
        - コンパニオンコンピュータを搭載してAI処理
    - 拡張性
        - 様々な機体に対応(垂直離陸機、車っぽいやつ、ボート、蜘蛛みたいなロボット)

理解できて色々触れるようになったら面白そう！
掲示板機能作成に苦戦した

### はじめに

今回は、ポートフォリオ作成中に苦戦した、掲示板機能について復習します。

###view

```
<h1>掲示板</h1>
<div class = "container">
  <div class="row">
    <%= will_paginate %>
    <% @microposts.each do |micropost| %>
      <div class="col-md-4">
        <div class="card box">
          <div class="card-body text-center">
　　　　　　　　　　　　　　　　　　　　　　　　↓このコードで苦戦しました
            <h4 class="card-title"><%= link_to micropost.user.name, user_path(micropost.user) %></h4>
            <p class="card-text"><%= micropost.content%></p>
            <%=time_ago_in_words(micropost.created_at)%>前
          </div>
        </div>
      </div>
    <%end%>
  </div> 
</div> 
```

###microposts_controller.rb

```
  def index
     @user = User.find_by(params[:id])
    　@microposts = Micropost.paginate(page: params[:page])  
  end
```

###ポイント
```
<h4 class="card-title"><%= link_to micropost.user.name, user_path(micropost.user) %></h4>
```
掲示版にどのユーザーがどの投稿をしたかを表示しようとしましたが、全く表示できなかった。

### 原因
非常に初歩的なミスでした。
マイクロポストコントローラーにユーザーのIDを取得する @user = User.find_by(params[:id])　を記述忘れしていました。

今後このようなミスがないように、コントローラーの記述をしっかりと確認していく癖をつけていきたいです。
HTML+JavaScript で Unicode 文字表

Unicode の何処にどんな文字が入っているのか確認するための HTML+JavaScript です。
文字をクリックすると、クリップボードにコピーします。

「The Unicode Standard, Version 14.0」を基に作成しています。

<p class="codepen" data-height="710" data-default-tab="result" data-slug-hash="ExeGXqR" data-user="ikiuo" style="height: 710; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ikiuo/pen/ExeGXqR">
  Unicode 文字表</a> by Ikiuo (<a href="https://codepen.io/ikiuo">@ikiuo</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

---

静的な HTML ではファイル サイズが巨大になってしまうため、JavaScript で動的にテーブルを生成します。

:::note info
各所をクリックした後にブラウザが暫く応答しないことがあります。
:::

https://github.com/ikiuo/dhtml-unicode-viewer
Ubuntu Server 20.04.3 LTS 構築#5 セキュリティ設定4-1

実施日:2022/01/18～
<<今回の内容>>
ウイルス定義更新の自動更新

前回はfreshclamを手動で更新していました。
更新するたびにfreshclamの動作を止めて更新をしないとエラーになってしまうようですので、
更新するたびに止める⇒更新⇒起動は手間だと感じました。
それなら、自動で更新をすれば良いと思いましたので、自動で更新をする設定をします。

自動で更新をするにはcrontabコマンドを使用する。

[コマンド]
crontab -e
⇒実行すると、crontabの設定ファイルが表示されるので、下記を追加登録します。

10 * * * * clamav /usr/bin/freshclam --quiet -l /var/log/clamav/freshclam.log

予定通りの時間になっても、何も起こりません。
どうやら、設定に誤りがあるようです。
freshclam.confの設定値に誤りがあるかと思い、設定ファイルを確認。
そもそも、設定ファイルを変更していないため、設定ファイルに誤りがあるとは思えず。
freshclam.conf内にはデフォルトで自動更新する回数を変更を変更できる箇所が
あるため、その設定値を変更すると、自動更新回数は指定回数分を変更できます。
ただし、今回はcrontabコマンドを使用しての自動更新の設定。
目的達成ではないので、crontabコマンドで自動更新が出来るまでやっていきたいと思います。
【競プロ/C++】2次元ベクタを潰してグラフライブラリを軒並み高速化

## 更新記録

2022 年 2 月 1 日 ： 投稿
2022 年 4 月 3 日 ： 用語「 CSR 形式」を使うように記事全体を改変

## 要約

$10^5$ 頂点以上の静的グラフの隣接リスト表現を **CSR** (Compressed Row Storage) **形式** で管理すると、ベクタのベクタに比べて利便性をほぼ失わず 100ms 程度の高速化、省メモリを達成できます。とてもおすすめです。

## 本文

競技プログラミングではかなりの頻度で頂点数が $10^5$ 以上の静的なグラフを扱います。このような場合、ほぼ必ず各頂点の隣接リストを作成します。このとき C++ の平易なプログラムでは `vector<vector<int>>` や `vector<int>[]` がよく用いられますが、これを $1$ 次元配列による表現に書き換えることで例えば 100 ミリ秒程度の高速化を見込めます。 `vector<int>` が定数個になるため、メモリ使用量も改善します。

`vector<vector<int>>` からの移行を考えると、辺重み無しの隣接リストのインターフェースは次のようになるでしょう。

- `(コンストラクタ)` ： 辺のリスト `vector<pair<int,int>>` や隣接リスト表現 `vector<vector<int>>` を主な入力とし、隣接リストを構築する。
- `operator[](int i)` ： 頂点 $i$ に隣接する頂点のリストを表すオブジェクトを返す。今回は `vector` を返せないので、代わりに `begin` , `end` を扱える別の構造体を返す。例えば、 `vector` のイテレータのペアを持ち、適切なインターフェースを実装した構造体を作る。
- `size()` ： 頂点数。

CSR 形式は、次の $2$ つの配列を持って上の機能を実現します。

- 長さ $n+1$ 、隣接リストを $n$ 個に分ける位置の情報
- 長さ $m$ （有向辺の個数）、隣接リスト本体

グラフアルゴリズムのライブラリ（競技でよく用いるアルゴリズムを予め用意したもの）に CSR 形式の構造を追加し、各ライブラリの入力をそれに変更します。

いままで `vector<vector<int>>` を使っていた場合でも暗黙の型変換によって新しいライブラリを自然に利用できます。さらに、なんとこの場合にも（冗長な変換にもかかわらず）高速化が望めます！！（ https://twitter.com/NachiaVivias/status/1484792651027468293 ）

一般に、 CSR 形式は疎な行列に対して用いられるものですが、グラフの隣接行列に適用すると上で紹介したものになります。

密な行列に対して使うことも考えられますが、検証をしていないので高速化の効果への言及を避けます。

## 既存の実装例

### AtCoder Library の強連結成分分解ライブラリ

https://github.com/atcoder/ac-library/blob/6c88a70c8f95fef575af354900d107fbd0db1a12/atcoder/internal_csr.hpp

インターフェースが `add_edge` なので私は気持ち悪いような気もしていましたが、内部で CSR 形式を使っていたのですね。

### Nyaan's Library

docs : https://nyaannyaan.github.io/library/graph/static-graph.hpp

https://github.com/NyaanNyaan/library/blob/94b151b067bdc6ed2876d6ab8e77c73d42f8fc06/graph/static-graph.hpp

いかにもそれ用のファイルがあります。また、説明のページでは、キャッシュミスが減ることが高速化の要因であることが述べられています。

## 効果

貼るだけならおそらく簡単だから各自のライブラリで試してみて

https://twitter.com/NachiaVivias/status/1484784177287667712
【Project Euler】Problem 68: 魔法5角リング

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 68. 魔法5角リング

原文 [Problem 68: Magic 5-gon ring](https://projecteuler.net/problem=68)

**問題の要約 図 １のような図形のマルに1~10の数字を入れで以下の条件を満たすもので答えの16桁が最大になるものを求めよ**

* 直線の3個のマルの数字の合計はすべて同じ
* 答えは、それぞれの3個の数字を外側から並べ、それをさらに外側の数の一番小さい数のものから時計回りに列挙したもので答えを表す。例えば図 2の3角魔法リングでは432:621:513となり、これが最大となる。

---
**【図 １】**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/e127c239-10fe-2d23-f024-2d976db58b53.png)
**【図 2】**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/e1107f25-53c4-08bd-181b-407fe76e73f7.png)
---

### 問題の考え方

なかなか、ややこしい問題なのでステップを踏んで考えて行きたいと思います。

1. 5角魔法リングでは二けたの10が含まれ、これが内側のリングにあると答えに2回現れるので17桁になってします。したがって10は外側にある。
1. 答えの16桁の最も大きい桁の数は外のリングの最小値、これを最大にするためには10以外の大きい数字「6,7,8,9」が外のリングに来て6が16桁の最初の数になる。
1. その6からなる3つの数の2番目が答えの16桁の2桁目になるので、内のリングの最大値5を選びます。
1. 外のリングが「6,7,8,9,10」、内のリングが「1,2,3,4,5」とすると16桁の合計は内のリングは2回登場するので(6+7+8+9+10)+2*(1+2+3+4+5)=70。したがって3つの数の和は14になる。
1. 6からなる3つの数の3つ目は14-6-5=3。すると内のリングの残りの3つは「1,3,4」
1. 内のリングの各辺の和は{4,5,6,7,8}にならなければならないので、「5,3,1,4,2」が来まり、外のリング「6,10,9,8,7」も来まる。
1. これを答えの16桁にすると653:1031:914:842:725になる。

というように解いていくとプログラムを書かなくても紙と鉛筆で答えが出せてしまいました。
【Project Euler】Problem 67: 経路の合計の最大値 （その２）

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 67. 経路の合計の最大値 （その２）

原文 [Problem 67: Maximum path sum II](https://projecteuler.net/problem=67)

**問題の要約：triangle.txtの100行のピラミッド型の数の上から下まで数字をたどった経路の合計の最大値を求めよ**

これは[Problem 18: 経路の合計の最大値 （その１）](https://qiita.com/masa0599/items/83727c4b158b7ca07a7c)の拡大版と言えます。アルゴリズムはProblem 18と同じで良いので。データを同様な配列に入れればプロクラムにはそのままでOKです。

```python 
for y in range(len(triarr)-2,-1,-1):
  for x in range(y+1):
    triarr[y][x] += max(triarr[y+1][x],triarr[y+1][x+1])
print(f"Answer: {triarr[0][0]}")
```

ファイルから読んで配列に入れるプロクラム。

```python
# show upload dialog
from google.colab import files
uploaded = files.upload()
#---- read numbers from file
f = open("p067_triangle.txt")
triNums = f.readlines()
f.close()
triarr = [list(map(int,row.split())) for row in triNums]
print(triarr[:20])
```

（開発環境：Google Colab）
レプリケーション遅延について調べてみた

## レプリケーションとは
DBサーバーのレプリカ(複製)を、複数持つことができる機能

## マスタースレーブ構成とは
主となるDBサーバーを`マスター(サーバー)`、レプリカを`スレーブ(サーバー)`という。
マスターとスレーブのセットを、`マスタースレーブ構成`という。
基本的には、`リアルタイムでマスターとスレーブは同期されている`
マスターとスレーブは `1:N` の関係にある。

### メリット
- マスターに障害が起きた時、スレーブを使うことができる。<br>
--> システムを止めることなく、高い可用性を実現することができる。

### デメリット
- DBサーバーを複数置くことになるので、DBサーバー台数分の料金がかかる。
- 常にマスターとスレーブは同期しているので、マスターに何か問題があると、その状態もスレーブに複製されてしまう

## レプリケーション遅延とは
レプリケーション遅延とは、マスターの状態をスレーブに同期するまでの時間が遅延してしまうこと。
例えば、レプリケーション遅延している時にマスターサーバーがダウンした際、マスターとスレーブの整合が取れなくなってしまう恐れがある。

## レプリケーション遅延回避策
- 巨大なSQLを流さないこと
  - 大量データを更新する場合は、N件ずつ分けて更新するようにする
- RDSやCloudSqlを使っている場合は、コンソールで負荷をみながら進めること
ERC1976: Standard Proxy Storage Slotsを理解する

## ERC1976

この記事では、[このコミット時点でのERC1976の記載](https://github.com/ethereum/EIPs/blob/b95ebb8270716799183ca5874df2a38fe5bee939/EIPS/eip-1967.md)を参照しています。

この段階ではステータスがreviewなので仕様が変更される可能性はあります。

## ERC1976の説明

ERC1976とはProxy Patternのコントラクトを実装する際に、Storage Contractの中でLogic Contractの中で定義されているslotと衝突しないように、特定のアドレスを保持するためのslotを定義する規格です。

Proxy Patternについての記事は別途作成予定です。

ドキュメント上では下記のアドレスについて言及されています。

- Logic contract address
- Beacon contract address
- Admin address

### Logic contract
実際のロジックが実装されているコントラクトです。Storage ContractはProxyはこのLogic Contractにdelegatecallを行うように実装します。

Logic contractのslotは下記のように定義されています。

```
// bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1))
0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc
```

### Beacon contract
ProxyのLogic Contractをまとめて管理するためのコントラクトです。一回のトランザクションでまとめてProxyのアップグレードを行いたい時に使用します。

Beacon contractのslotは下記のように定義されています。

```
// bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)
0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50
```

### Admin address
Proxyのアップグレードを行う権限を持ったアドレスです。

Admin addressのslotは下記のように定義されています。

```
// bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)
0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103
```

## ERC1976の具体的な実装
OpenZeppelinの実装です。

https://github.com/OpenZeppelin/openzeppelin-contracts/tree/e192fac2769386b7d4b61a3541073ab47bb7723a/contracts/proxy/ERC1967

## 実際にデプロイしたコントラクト
[こちらの記事](https://qiita.com/taijusanagi/items/34a73fb9f968d9148ad5)で実際にデプロイしたコントラクトを確認できます。
Mysql2::Error: Duplicate entry 'xxx' for key 'PRIMARY'  エラー解決方法

#エラーの概要

`Mysql2::Error: Duplicate entry '100018' for key 'PRIMARY'`と表示され、レコードを追加することができず、、
エラーメッセージから主キーが重複しているということは理解できたが、該当の主キーとは何なのか、、

そんな中、無事解決できたので備忘録としてまとめておきます。

結論から、`AUTO_INCREMENT`属性を該当テーブルの`id`に設定していたため、レコード作成時にMySQLが自動的に`id`番号を割り当てていたことによる重複が原因でした。

実装箇所をテストしていた際に、誤って操作したことによるものだと思われます、、反省。

##前提

- OS：MAC
- DB：MySQL
 - `TablePlus`を使用してDBデータを確認しています。

https://tableplus.com/



##1.`AUTO_INCREMENT`の値を確認する
取得する該当テーブルを指定してテーブルデータを確認してみました。

- TablePlusの操作
 - 左上の`SQL`をクリック
 - コマンドを入力し、`⌘ + Enter`で実行

```sql
-- 構文
SHOW TABLE STATUS LIKE ('テーブル名');

-- 出力コマンド
SHOW TABLE STATUS LIKE 'orders';
=> 100017
```

出力結果から`AUTO_INCREMENT`の値が`100017`であることが確認できました。

##2.最大値のレコードを取得

今回の場合、**PRIMARYキー**の`id`カラムの重複が原因のため、該当カラムの最大値レコード数を取得してみました。

```sql
SELECT MAX(id) FROM orders;
=> 100133
```

出力結果からテーブルに存在する1番最後のレコードの`id`が`100133`であることが確認できました。

本来なら、次に作成されるレコードの`id`には`100134`が付与されるのだが、どういうことか`id`に`100018`が付与されてしまい、「 重複してるー 」とエラーメッセージが表示されていたんですね、、


##3.次回レコード作成時の`AUTO_INCREMENT`の値を確認

TablePlusで確認することができます。

- TablePlusの操作
 - 左上の`items`をクリックし、該当テーブルを選択する。
 - 画面下にある`Structure`をクリックする。
 - 表示された`info`をクリックし、1番下までスクロールすると確認できます。

```sql
ENGINE=InnoDB AUTO_INCREMENT=100018 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='xxx';
```

確認したところ、`100018`と表示されており、本来は`100134`である必要があります。


##4.`AUTO_INCREMENT`の値を変更
最後に、正しい値を`ALTER`文で変更していきます。

```sql
ALTER TABLE orders AUTO_INCREMENT = 100134;
```
出力後

```sql
ENGINE=InnoDB AUTO_INCREMENT=100134 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='xxx';
```

先ほど TablePlus で確認した`AUTO_INCREMENT`の値が反映されていることが分かります。

その結果、無事新規レコードを作成することに成功！

##最後に
解決できたときの達成感って格別ですよね笑

##SHOW TABLE STATUS で 取得できるデータ

**【ストレージエンジンが`InnoDB`の場合】**

| 項目 |　　　　　　 情報 |
|:-:|:-|
| Name  | テーブル名  |
| Engine  | テーブルのストレージエンジン名  |
| Version  | テーブルの .frm file. のバージョン番号  |
| Row_format  |  レコードの保存形式 |
| Rows  | レコードの行数  |
| Avg_row_length  | レコードの平均行長  |
| Data_length  | クラスタ化されたインデックスに割り当てられるおおよその容量 (バイト単位)   |
|  Max_data_length |  未使用  |
| Index_length  |  クラスタ化されていないインデックスに割り当てられる領域の概算量 (バイト単位)  |
| Data_free  | 割り当てられているが、使用されていないバイト数  |
| Auto_increment  |  次のAUTO_INCREMENT値  |
| Create_time  | テーブル作成時刻  |
| Update_time  |  データファイルの最新更新時刻 |
|  Check_time |  最後にチェックされた時刻 |
|  Collation |  テーブルのデフォルトの照合 |
| Checksum  |  ライブチェックサム値  |
| Create_options  |  パーティションテーブルの partitioned が表示(CREATE TABLE で使用される追加のオプション) |
|  Comment | テーブルを作成時に使用されたコメント  |

https://dev.mysql.com/doc/refman/8.0/ja/show-table-status.html
横幅を最低●●pxはほしいけど文字数によって幅が広がるボタン

例えば少ない文字数でも最低240pxの幅は確保したいけど、文字数が多くなったときには横幅を変動させるようにしたいといった場合

ボタンのテキストをカスタムフィールドとかで出力するときとかに使えそうなのでメモ。

```html
<a href="" class="btn">詳細はこちら</a>
```
```css
.btn {
  min-width: 240px; /* 最低240pxを確保 */
  height: 40px;
  background: #999;
  border-radius: 4px;
  font-size: 18px;
  font-weight: bold;
  color: #fff;
  padding: 0 8px; /* テキストがキツキツにならないように */
/* ここから文字の中央寄せ */
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
```
![幅可変のボタン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552308/5bd620f1-7974-25a0-6e91-c102a5322ef2.png)
2番めのようにテキストが長くなっても幅が広がります。

●ボタンを中央寄せにしたいとき
↓
divタグとかで囲んで、text-align: center;

```html
<div class="btn-wrapper">
  <a href="" class="btn">詳細はこちら</a>
</div>
```
```css
.btn-wrapper {
  text-align: center;
}
.btn {
上の.btn同じ
}
```
Laravelでデータを扱う方法




![スクリーンショット 2022-01-19 16.58.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/770055/1cf839a3-6703-75b2-4cb8-ba028faa5b43.png)


##Collection
PHPの配列を拡張したもので、多数の専用メソッドがある(all, combine, countなど)。

1.  use App\Models\Owner;　を読み込み。
2.  例として、

```php
         $c_test = collect([
             'name' => 'てすと'
         ]);
```

返り値としてCollectionや、standardClassなどがある。



参考
https://readouble.com/laravel/8.x/ja/collections.html
https://techplay.jp/column/630


##QueryBuilder
SQLに近いかたちで、selectやwhereなどを使ってDBのデータを扱う。

1.  use Illuminate\Support\Facades\DB;　を読み込み。
2.  例として、

```php
$q_get = DB::table('テーブル名')->select('name', 'created_at')->get();
```
とすると、指定したテーブルからnameと作成日時のデータを取得することができる。

また、

```php
$q_first = DB::table('テーブル名')->select('name')->first();
```
とすると、指定したテーブルのカラムの1番目を取得することができる。

行全体が必要ない場合は、valueメソッドを使用してレコードから単一の値を抽出できる。

```php
$email = DB::table('users')->where('name', 'John')->value('email');
```

id列の値で単一の行を取得するには、findメソッドを使用する。

```php
//配列で取得
$user = DB::table('users')->find(3);
```




##Eloquent(モデル)
データ型が少し異なり、Illuminate\Database\Eloquent\Collectionとなり、SupportのCollectionを継承してさらに機能が増えている。Eloquentモデルを作っておけば、それを使ってQueryBuilderよりも簡単にデータを取得できる。例えば、

```php
$e_all = モデル名::all();
```
とすると、指定したモデル名のデータを全て取得することができる。



QueryBuilderとEloquentの違いについて
https://cloudsmith.co.jp/blog/backend/laravel/2021/06/1817294.html
[方策勾配定理] 論文を読む 2/1

* 論文へのリンク : https://proceedings.neurips.cc/paper/1999/file/464d828b85b0bed98e80ade0a5c43b0f-Paper.pdf
* 筆者・所属機関 : Richard S. Sutton et al., Policy Gradient Methods for Reinforcement Learning with
Function Approximation
* 投稿日付(yyyy/MM/dd) 
* 概要（一言まとめ） : 関数近似を用いた強化学習のための方策勾配定理に関する論文
* 新規性 : 
    * 今まで : 価値関数を近似→方策を決定
        * 決定論的なアプローチである。
        * 単純な方策でも収束しないことがある。(Sarsa,Q学習→MDPなど)
    * 本論文 : 方策が価値関数とは独立の近似器で表現され、方策パラメータに関する期待報酬の勾配を用いて更新する
* 手法の概要 : 
* コメント : 
    * 結果 : a version of
policy iteration with general differentiable function approximation is convergent to
a locally optimal policy.
* 関連情報
* 自分なりのアウトプット
* 気になった英単語・英語表現
    * function approximation:関数近似
    * theoretically intractable : 理論的に困難 
    * arbitrary : 任意
    * differentiable function　： 微分可能関数
    * proportional: 比例して
    * orthogonal:直交
中学2年生のみなさんへ。〈3/5〉数列「2022年共通テスト数学ⅡB第4問(1)(2)配点20点」sympyでア～セ、コード22行で。

(2022-02-11)〈1/3〉が長文になったので、分割しました。

https://qiita.com/mrrclb48z/items/47c091f5e368eabb3909

# sympyのわかる方へ

sympyのpiecewiseを使えば,3行で計算できると思いましたが、できませんでした。
教えて下さい。

# Pycharmで:「一定の手順に従って数学的に処理する(問題作成方針 )」に違反しているコード

以下がポイントでした。
自転車が歩行者に追いつく地点を,A点(xA,yA)としています。
(youtube「**福田の共通テスト直前演習です。2021年共通テストの問題4**」より)

コード22行より短くなる方法を教えてください。

(2022-02-11)

```python
from sympy import *
a,b = Function('a'),Function('b')
n   = symbols('n',integer=True)
var('xA yA t')
a1,b1={a(1):2},{b(1):2}
print("#ア　　",
    solve([Eq(yA-  0 ,1*(xA-  0) ),Eq(yA-0,2*(xA-  2 ))],[xA,yA])[xA])
ans=solve([Eq(yA-b(n),1*(xA-a(n))),Eq(yA-0,2*(xA-a(n)))],[xA,yA])
t=ans[xA]-a(n)
fa=a(n)+  t+1+  (b(n)+b(n))/2+  1
fb=b(n)+1*t+0+1*(b(n)+b(n))/2+1*1
bn=powsimp((rsolve(b(n+1)-fb                ,b(n),b1)))
an=powsimp((rsolve(a(n+1)-fa.subs({b(n):bn}),a(n),a1)))
print("#イウ　",an.subs({n:2}),",",bn.subs({n:2}) )
print("#エオ　",ans[xA]       ,",",ans[yA]       ," "* 6,",3 an+bn,4 2bn")
print("#カキ　",fa," "* 9,",an1=an+カ*bn+キ-----①")
print("#ク　　",fb," "*16,",bn1=   ３*bn+ク-----②")
print("#ケ　　",bn," "* 6,",bn=5/2*3**(n-1)  -1/2")
print("#コ　　",an," "* 2,",an=5/2*3**(n-1)+n-3/2")
m=int((solve(2*bn-300 <= 0,n).rhs))
print("#サ　　",m)
print("#シスセ",(an+bn).subs({n:m}))
#ア　　 4
#イウ　 8 , 7
#エオ　 a(n) + b(n) , 2*b(n)        ,3 an+bn,4 2bn
#カキ　 a(n) + 2*b(n) + 2           ,an1=an+カ*bn+キ-----①
#ク　　 3*b(n) + 1                  ,bn1=   ３*bn+ク-----②
#ケ　　 5*3**(n - 1)/2 - 1/2        ,bn=5/2*3**(n-1)  -1/2
#コ　　 5*3**(n - 1)/2 + n - 3/2    ,an=5/2*3**(n-1)+n-3/2
#サ　　 4
#シスセ 137
```

# Pycharmで:「一定の手順に従って数学的に処理する(問題作成方針 )」に準拠しているコード

(途中)



# 参考
リンク切れ
~~解説 ＜　共通テスト2022 数学ⅡB問題｜共通テスト解答速報2022｜予備校の東進~~

~~https://www.toshin.com/kyotsutest/data/646/sugaku-2b.pdf#page=12~~

sympy.solvers.recurr.rsolve(f, y, init=None)

https://omz-software.com/pythonista/sympy/modules/solvers/solvers.html#recurrence-equations





# 未定


https://www.youtube.com/watch?v=TsIBTHQLHCM

~~https://www.youtube.com/watch?v=UZuWS7k4yR8&t=5s~~
　
# つづく〈4/5〉へ
:::note info
https://qiita.com/mrrclb48z/items/2f0b10cbcc86495bcfa4
:::
ImageJでモザイク処理（粗視化）

プラグインなり標準コマンドなりにありそうなのに見つからなかったので自作した。

以下、ImageJ macroです。
`k`がモザイクの大きさです。

```
w = getWidth();
h = getHeight();
k = 50


for(x=0; x<w; x+=k){
	for(y=0; y<h; y+=k){
		sum = 0;
		for(i=0; i<k; i++){
			for(j=0; j<k; j++){
				sum = sum + getPixel(x+i,y+j);
			}
		}
		ave = sum/k/k;
		for(i=0; i<k; i++){
			for(j=0; j<k; j++){
				setPixel(x+i,y+j,ave);
			}
		}
	}
}

```
PDFファイルの内容をMicrosoft Wordファイルに貼り付ける方法の1例

#はじめに。こんな人にオススメ。
* PDF形式で配布された画像をMicrosoft Wordに貼り付けたい
* PDF形式で配布された文章をMicrosoft Wordに貼り付けたい
* 特別なソフトウェアを入れたくない

こんばんは。どこかの丘の上の大学生です。
コロナ禍により、私の大学でもリモート講義が行われています。そんな中、PDFファイルで配布された画像をレポートに貼り付けたい、という場面が出てきました。方法の1例をここにまとめました。手順を簡潔に述べると、PDFファイルをMicrosoft Wordで開きそれをコピペするというやり方です。

#背景
オンラインでpdf形式の画像が配布されました。この画像をレポートに貼り付ける必要がありました。
私はTeXでレポートを書いており、pdfの結合もTeXで処理しました。一方、Microsoft Wordでレポートを書かねばならない場合もあり得ます。この場合どのような手法をとり得るかを考えてみました。その1例をここに記します。

#方法
1. pdfファイルを右クリック
2. 「open with」をクリック
2. 「Choose another app」をクリック
![FKgbE11UYAMr2EA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259973/e1fc0cb3-d4c1-026a-2f5c-4381baa6739e.png)
2. 「Word」をクリック（Wordが表示されていない場合、「More apps」をクリックする必要があります）
![FKgbRh1UUAEm8uC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259973/cf2fc02d-1591-01fc-a3ed-3ff69688a415.png)
![FKgbL_qUcAcFNLQ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259973/d8608458-6ba3-88bd-ec90-ba7860848f7b.png)

これで、Microsoft Wordでpdfファイルを開くことができます。
あとは必要な部分をコピーし、レポート等に貼り付けます。

#最後に
以上、pdfファイルをwordに貼り付ける方法の1例を紹介しました。この方法には懸念事項があります。Wordで開いた時に文字や画像が崩れたり、化けたりすることがあるかもしれません。その場合は別な方法を試すことをおすすめします。
AtCoder Beginner Contest 057

##[A - Remaining Time](https://atcoder.jp/contests/abc057/tasks/abc057_a)

O(1)

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }
 
int main() {
    int A, B;
    cin >> A >> B;
 
    cout << (A + B) % 24 << endl;
 
    return 0;
}
```

##[B - Checkpoints](https://atcoder.jp/contests/abc057/tasks/abc057_b)

O(N)

```C++:C++
#include <bits/stdc++.h>

#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9

using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }

int main() {
    int N, M;
    cin >> N >> M;

    vector<P> A(N), B(M);
    rep(i, N) cin >> A[i].first >> A[i].second;
    rep(i, M) cin >> B[i].first >> B[i].second;

    rep(i, N){
        int ans=0;
        int res = 1000000009;
        rep(j, M){
            int d = abs(B[j].first - A[i].first) + abs(B[j].second - A[i].second);
            if(d < res){
                res = min(res, d);
                ans = j+1;
            }
        }
        cout << ans << endl;
    }

    return 0;
}
```

##[C - Digits in Multiplication](https://atcoder.jp/contests/abc057/tasks/abc057_c)

O(N)
Aを決めるとBが決まります。
桁数の大きい方を比較し、最小桁数を計測するので、１〜10^10までループを回さなくてもいいです。
i*i<=Nの条件でループします。

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }

int main() {
    ll N;
    cin >> N;

    ll ans = (1<<16)-1;
    for(ll i=1; i*i<=N; i++){
        if(N%i==0){
            ll a = max(i, N/i);
            ll cnt=0;
            while(a>0){
                a = a/10;
                cnt++;
            }
            ans = min(ans, cnt);
        }
    }
    cout << ans << endl;

    return 0;
} 
```
AKS はじめよう ツール


# TL;DR;
AKS始めよう！と思ったあなたに必要なツールをまとめてお届けします。

まずAzureなので、``az``
さらにkubernetesといえば、``kubectl``
localのdocker imageも操作できなきゃ駄目だよねということで、 ``docker``
おまけにパッケージ管理の ``helm``
全てひとつのdocker imageに詰め込みました。
スクリプト一発実行すれば、全てインストール済のDocker imageが作成され、さらにAzureにログイン済みの状態になります。
便利ですよー。

# 準備

以下のリポジトリをcloneしてください。

https://github.com/furu8ma/connect_aks

おもむろに connect_aks.shをエディタで開き、``SUBSCRIPTION``, ``CLUSTER`` , ``RESOURCE_GROUP`` を自分の環境に合わせて修正してください。ちなみに、CLUSTER,RESOURCE_GROUPは存在しなくてもかまいません。※その場合あとで作る必要あります。


```sh
# Your subscription.
SUBSCRIPTION=xxxxxxxxxxxxxxxxxxxxx
# Your Cluster name
CLUSTER=xxxxxxxxxxxxx
# Your resource group
RESOURCE_GROUP=xxxxxxxxxxxxxxx
```


# 開始

スクリプトを実行します。

```sh
./connect_aks.sh
```

初回のみDocker imageのビルドが走ります。
Docker image がビルドされた後、``az login``が実行されます。結果として、ブラウザでのログインを促されます。

```sh
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code XXXXXX to authenticate.
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74328/5cf113c5-241c-87b1-6d90-2ef9b7bcf0c9.png)

ターミナルに表示されている認証用コードを入力して次へ。
Azureへのログイン情報を入力するとAzure CLIにサインインするか確認されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74328/9a47ae8b-83cb-2650-5341-9049b2c08641.png)
続行すると認証されます。

これで、``az``,``docker``,``kubectl``, ``helm`` が使えるようになっています。



```sh
Welcome to fish, the friendly interactive shell
Type `help` for instructions on how to use fish
root@aks /work (main)# which az
/usr/bin/az
root@aks /work (main)# which docker
/usr/bin/docker
root@aks /work (main)# which kubectl
/usr/local/bin/kubectl
root@aks /work (main)# which helm
/usr/sbin/helm
```

**Let's enjoy AKS!**

ちなみにAKSは以下のあたりから始めるとよさそうです。

**チュートリアル:Azure Kubernetes Service (AKS) クラスターのデプロイ**
https://docs.microsoft.com/ja-jp/azure/aks/tutorial-kubernetes-deploy-cluster?tabs=azure-cli