OmniAICreator/Qiita-1.07M huggingface dataset:
WSL2/Ubuntu20.04 で docker を初期起動するときに起動できない問題の解決

新しいマシンに、WSL2/Ubuntu20.04 をインストールして、docker を起動するとエラーは出ないけど、起動しない。
おかしいなと思って、`sudo dockerd` で起動してみると下記のエラーが出ていた


```bash
WARN[2021-08-05T14:59:17.371395300-07:00] grpc: addrConn.createTransport failed to connect to {unix:///var/run/docker/containerd/containerd.sock  <nil> 0 <nil>}. Err :connection error: desc = "transport: Error while dialing dial unix:///var/run/docker/containerd/containerd.sock: timeout". Reconnecting...  module=grpc
failed to start daemon: Error initializing network controller: error obtaining controller instance: failed to create NAT chain DOCKER: iptables failed: iptables -t nat -N DOCKER: iptables v1.8.4 (legacy): can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
```

これは、２つの理由で起こっているっぽい。Dockerが想定するIPテーブルがこのバージョンのOSでサポートされていないので、設定を変更するひつようがある。

```bash
$ sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
$ sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
$ sudo update-alternatives --config iptables
There are 2 choices for the alternative iptables (providing /usr/sbin/iptables).

  Selection    Path                       Priority   Status
------------------------------------------------------------
  0            /usr/sbin/iptables-legacy   20        auto mode
* 1            /usr/sbin/iptables-legacy   20        manual mode
  2            /usr/sbin/iptables-nft      10        manual mode

Press <enter> to keep the current choice[*], or type selection number: 
```

しかしこれを実施しても、権限がないとおこられてしまう。私は、まずdockerをBridgeモードで起動する。下記のファイルを書き換えると、IPテーブルを無効にして、Bridgeで上がるようになる。ただし、それも権限不足でうまくいかない。


```bash
/etc/docker$ cat daemon.json 
{
        "iptables": false
}
```

どうするかというと、コマンドプロンプトをアドミンモードで起動してそこで、WSL2を起動する。具体的にはbashコマンドで起動する。そこで、`sudo dockerd` を実行すればよい。
すると、Bridgeが作られる。権限がWindows側というのが驚きだが、もしかすると、Bridgeモードでなくても、iptable でも設定を変えて、Windows側のAdminモードで実行すればよかったのかもしれない。最初の１回の初期化の際のみ必要なので、２回目以降の起動では必要ないみたい。

# Resource
https://github.com/Microsoft/WSL/issues/767
[コピペ出来る！]GKEをターミナルから操作するまでの手順


# 概要
ここではGoogleCloudのGKEを操作するために、手元のターミナルから操作するために必要な手順をコピペで出来るようにしました。

# 前提
- プロジェクト名: hoge
- 環境: development

として解説します。上記は追加したい環境にあわせてください。


## IAMに追加してもらう
まずは権利を持っている人にIAMに追加してもらいましょう！

してもらったら見れるか確認: https://console.cloud.google.com/home/dashboard?project=hoge

## Gcloudコマンドのインストール

```bash
# インストール
$ brew install cask google-cloud-sdk
```

## Gcloud コマンドのパスを通す

```bash
source "/opt/homebrew/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/completion.zsh.inc"
source "/opt/homebrew/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.zsh.inc"
```

## gcloudコマンドでログイン

```bash
$ gcloud init
```
**プロジェクトの紐付けるために数字の入力を求められるが次の行でやるのでCtrl-Cで一旦抜ける**

## Gcloudとアカウントの紐付け

```bash
$ gcloud config set project hoge
```


以上です。

## kubeletのインストール

```bash
$ gcloud components install kubectl
```

## kubeletに紐付け

```bash
$ gcloud container clusters get-credentials development --zone=asia-northeast1
```


## ちゃんと繋がっているかの確認
```
$ kubectl get pods
```


### おまけ

簡単にpodを操作出来る便利ツール

https://github.com/derailed/k9s

```bash
# インストール
$ brew install k9s
# 起動
$ k9s
```

以上です。
【Ruby on Rails】kaminariを使用してページング機能を実装する方法


#対象者

* 一覧ページにページング機能を作りたい方


#目的

* kaminariをインストールしてページング機能を作成すること

#実際の手順と実例
###1.Gemを導入
Gemfileの最終行に以下のgemを導入

```
:

:

gem 'kaminari','~> 1.2.1'
```
その後**bundle install**を実行する


###2.kaminariの設定ファイルを作成

以下のコマンドを実行する

```
$ rails g kaminari:config
```

最後にkaminariがページャで利用するテンプレートを作成します。

```
$ rails g kaminari:views default
```


###3.ViewとControllerへ追加する
本の投稿を行うサイトを例にあげます。
書き方は下記の通りです。


```books/index.html.erb
<% @books.each do |book| %>

:
:

<% end %>

<%= paginate @books %>
```

続いてControllerの記述を変更します。

変更前

````books_controller.rb
def index
　@books = Book.all
end
````

変更後

````books_controller.rb
def index
　@books = Book.page(params[:page]).reverse_order
end
````

これで実装完了です！

ちなみに私としては下記の記述の方好みです。

````books_controller.rb
def index
　@books = Book.page(params[:page]).per(5)
end
````

最後のper(数字)だと表示したいページ数を設定できて便利です！



#参照

>[Kaminariの使い方 まとめ - 猫Rails](https://nekorails.hatenablog.com/entry/2018/10/15/005146)


####投稿者コメント

最後の行書きたいがために記事にしました笑
参照させて頂いた記事がとてもわかり易いです。

####My Profile
プログラミング学習歴３ヶ月目のアカウントです！
プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。
また、プログラミング初学者の方にわかりやすく、簡潔にまとめて情報共有できればと考えています。
もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。
classicに切り替えると、解決できるトレイルヘッド

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)

なんでだろうねぇ。

[Hi](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Br7OfSAJ)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/91ca2d35-139d-40f9-8942-5cf24eadcf7e.png)


# Health Cloud Superbadge Challenge 10
[Health Cloud Superbadge Challenge 10](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000BrKBNSA3)


Figured it out, Shipping records can only be seen in Classic

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)

and remote monitoring  seemed to magically appear after I logged in and I had

Under care observations:

I added the Care Metrics and Care Metric Targets
And

I added the Remote Reporting Charts to the Account page.

# Can't find multi-select  picklist on the Opportunity object
[Customize a Salesforce Object - Create Picklist Trail head](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000C6Trt)


# 何故か保存できないようです

[Sharing Rules isn't letting me save](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Ch824SAB)

# Fiscal Year Start Month change not updating in Playground

組織全体の会計年度はプレイグランドでも本番でもクラッシクで保存するみたいです。

[Fiscal Year Start Month change not updating in Playground](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Bst4bSAB)

# Could not find a file named 'Get Cloudy Consulting Logo'.

[Configure an Email Letterhead and Template](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000FxAP9SAN)

# トレイルヘッドでないですが...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/20e2593f-3a9f-88bc-7bd9-67ad97e6dbb6.png)

[Hello, I am trying add permissions sets in a permission set group and I'm getting this error message, any ideas on how to fix? Thanks!](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000DdGbhSAF)

# Sales Rep Win Rate

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e71c0fd2-8ead-ddd7-4f66-80b16c25abf4.png)

さて、これが私がしたことです！同じ問題に直面したので、salesforce classicに行き、Trailheadの指示に従って、Sales Rep Win Rateのチャートを再編集して保存しました（基本的にclassicに切り替えて、レポートを再度保存しました）。どのようにしかしそれは働いた。

# アカウントの連絡先関係を削除できません トレイルヘッドでない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/eb65a9be-ecb4-759d-d85b-3eefe46cd1b8.png)

[アカウントの連絡先関係を削除できません])(https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000G5yHB)

# Lightningでは出来ない、制限

+ [ロングテキストエリアフィールドは、LEXでは読み取り専用ですが、クラシックでは読み取り専用ではありません](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000H1OEW)
+ [クラシックの制限ルール](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HDLuG)
コマンドラインでAndroidアプリをビルドして起動し直す

```bash
export APPLICATION_ID=com.example.myapplication
./gradlew assembleDebug; adb install -r app/build/outputs/apk/debug/app-debug.apk; adb shell am force-stop $APPLICATION_ID; adb shell monkey -p $APPLICATION_ID -c android.intent.category.LAUNCHER 1
```

たまにAndroid Studioのことが信じられなくなることがあって、そういう時はコマンドラインで一通りやりたくなる。アプリを起動する時に、Acitivityを指定する必要があるのかなと思ってたけど、monkeyというコマンドがあるのを知らなかった。
初学者向け Laravel6デバッグ方法

# Laravel6 初心者デバッグまとめ

## 概要

Laravelを使った初めての開発でデバッグに使用した方法をまとめます。

動作環境：Laravel6

## デバッグバーの導入

デバッグバーでは、Queriesで発行されているSQLの確認ができたり、ViewsでBladeのファイルを確認できたりします。リクエスト情報も確認できるので、テストコードを書かずにすぐに確認できるのが便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440462/4297ee14-d49a-53ca-16f3-d7f600617dff.png)


```php
$ composer require barryvdh/laravel-debugbar --dev
```

設定ファイル

.env

```php
// オン
APP_DEBUG=false
// オフ
APP_DEBUG=true
```

※.envを編集して設定が変わっていなかったらキャッシュを削除する

```php
php artisan config:cache
```

## デバッグに使う関数（PHP）

### dump()

シンプルに中身だけを表示する


```php
$test = array(1,2,3,4)
dump($test)

// 結果
array:4 [
 0 => 1
 1 => 2
 2 => 3
 3 => 4
]
```

### var_dump()

```php
$test = array(1,2,3,'あ','い','う')
var_dump($test)

// 結果
array(6) {
 [0]=> int(1)
 [1]=> int(2)
 [2]=> int(3)
 [3]=> string(3) "あ"
 [4]=> string(3) "い"
 [5]=> string(3) "う"
}
```
変数の型まですべて出力される。HTML側に出力されるため、ログには出すことができない。

### var_export()
```php
Log::info(var_export($test, true));
```
HTML側には何も表示されない。
ログに出力される。

### varの使い分け
ログに出力したいかどうかで使い分ける

||var_dump|var_export|
|:---:|:---:|:---:|
|出力|HTML|ログファイル|
|リダイレクト|✕|○|
ログにファイル出力することで、リダイレクトする場合でもデバッグが出来るメリットがある。

## Laravelのヘルパー関数
Laravelフレームワークが用意している便利な関数。
自分で作成することも出来る。
PHP単体では動作しない。

### dd()
基本的にdump()と同じ。
dumpと違い呼び出すと処理が止まる。

明確にどこでエラーが出ているかがわからないときに使うと一個ずつ検証できて便利。

ddはシンプル

```php
$test = array(1,2,3,4);
dd($test);
```
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440462/e9935c4a-123f-0353-f5e8-bccc3afc4d4c.png)

### ddd()
dddも呼び出すと処理が止まる。
dddは()の中身以外の情報も見ることが出来る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440462/ab71f795-cd9f-58b9-b4b1-5b029c7fca0a.png)

|Stack trace|Request|App|User|Context|Debug|
|:---:|:---:|:---:|:---:|:---:|:---:|
|処理の順番|リクエストの情報|実行したメソッド情報|ログイン中のユーザー情報|config系の情報|ddd()の中身|
ddd()は処理の全体を一発で見ることが出来るので便利

## ログの出力

ファサードで出力

上に行くほど重要度が高

```php
use Illuminate\Support\Facades\Log;

Log::emergency('emergency');
Log::alert('alert');
Log::critical('critical');
Log::error('error');
Log::warning('warning');
Log::notice('notice');
Log::info('info');
Log::debug('debug');

// 結果（ログファイル）
local.EMERGENCY: emergency
local.ALERT: alert
local.CRITICAL: critical
local.ERROR: error
local.WARNING: warning
local.NOTICE: notice
local.INFO: info
local.DEBUG: debug
```

設定ファイル
config/logging.php
ログファサードを使用してログファイルに出力することで、var_exportと同様に、HTMLに表示する必要がないので、リダイレクトした場合でもデバッグが出来る。

## まとめ

Laravelの開発で使ったデバッグ方法をまとめました。


### 参考記事

https://zenn.dev/shimotaroo/articles/738d8e01796bc9
https://techblog.recochoku.jp/5438

[https://reffect.co.jp/laravel/laravel-logging-setting](https://reffect.co.jp/laravel/laravel-logging-setting)

デバッグバー導入

[https://qiita.com/rf_p/items/8d25b25b712a52390657](https://qiita.com/rf_p/items/8d25b25b712a52390657)
データインポートウィザードの事例

# データインポートウィザードを使用して、アカウントと連絡先を一括更新します
https://help.salesforce.com/articleView?id=000325739&type=1&mode=1

更新ファイルを作成し、データインポートウィザードを使用して組織にインポートすることにより、**複数のアカウントと連絡先を同時に変更します。**

**注**：同じ名前のアカウントまたは連絡先がある場合、インポートによって誤ったレコードが更新される可能性があります。このプロセスを使用する前に、アカウント名と連絡先名が一意であることを確認してください。

1.  [レポート]タブから、更新するアカウントまたは連絡先レコードのレポートを実行します（更新する必要のある列をすべて含めます）。
2. レポートをExcelにエクスポートし、オブジェクトについて以下にリストされているすべての一意の識別子を含めます（詳細については、レポートのエクスポートを参照 してください）
 + **取引先**：アプリケーションに表示されているとおりのアカウントID、アカウント名、およびアカウントサイト。
 + **取引先責任者**：連絡先ID、電子メール、連絡先名（最初と最後）、アカウント名、およびアカウントサイト。
3. エクスポートされたレポートをExcelで開き、[レコード所有者]、[アカウント名]、[アカウントサイト]、または[連絡先名]フィールドを除き、更新が必要な各レコードのフィールド値を変更します（各行はレコード、各列はフィールドです）。これらのフィールドを編集すると、重複するアカウントまたは連絡先が作成されます。
4. 変更内容をコンマ区切り値（.csv）ファイルとしてExcelに保存します。
5. Salesforceで：からセットアップ、入力したデータのインポートウィザードをでクイック検索]をクリックし、ボックス データのインポートウィザードを
6. [起動ウィザード]をクリックします。
7. 「どのような種類のデータをインポートしていますか？」の下にあります。取引先と取引先責任者をクリックします。
8. 何をしたいですか？」の下 目的のアクションを選択します。
 + 複数のレコードタイプがある場合、インポートごとに1つのレコードタイプのレコードのみをインポートできます。データインポートウィザードでレコードタイプを選択できないを参照してください。
 + フィールドをマッピングするときに、マッピングするフィールドをすでに選択している場合がありますが、「マッピング」するオプションはポップアップウィンドウに表示されません。この場合、ブラウザのページ設定をズームアウトして、マッピングボタンが表示されるようにします。
9. 既存の取引先を更新する場合は、[既存のレコード を更新する]を選択し、[既存のアカウント情報を更新する]も選択されていることを確認し ます 。 
10. 「取引先責任者を一致させる」と「アカウントを一致させる」の基準を選択します。

# データインポートウィザードを使用して、連絡先レコードのアカウントを一括更新します
https://help.salesforce.com/articleView?id=000331172&mode=1&type=1
講義用のフォルダをまとめて作成する[python]

#フォルダーを再帰的に作りたい
いままでは新学期になるたびに講義ファイルをまとめるフォルダーを作っておりました。
大した労力じゃないかもしれないけど、地味に大変だから何とかしたい！
#コード
フォルダーを作りたい場所で動かすと出来上がり。
はじめに一番上になるフォルダーの名前を決めることができます。
曜日や時限数は調整してみてください。

```python:foldermaker.py
import os

week = ('1_Monday', '2_Tuesday', '3_Wednesday', '4_Thursday', '5_Fliday')
period = ('1', '2', '3', '4', '5')

title = input('input folder name...')

for w in week:
    for p in period:
        os.makedirs(title + '/' + w + '/' + p)
```
#参考

https://note.nkmk.me/python-os-mkdir-makedirs/
Crystal で AtCoder (Log #6)

#Easy_8

https://atcoder.jp/contests/abc086/tasks/abc086_b

２つの数字の10進法表記を結合した数が平方数かどうか。

# 文字列を結合する`join`

`join`はいくつかの文字列を結合するメソッド。通常は文字列の配列がオブジェクトだがそれに限らない模様。
`join(", ")`などとセパレータを指定することができる。

```crystal:join_example.cr
ary = ["a", "bc", "def"]
p! ary.join # => "abcdef"
p! ary.join(',') # => "a,bc,def"
p! ary.join(", ") # => "a, bc, def"
```

# `Math`モジュール

数学的な関数は`Math`モジュール[^1]の中にある。libm?
定数は`Math::C`の形。πなら`Math::PI`。
関数は`Math.f`の形。平方根なら`Math.sqrt(x)`。引数は整数でも小数でもよいが、結果は小数になるので`.to_i`をつければ丸め値になる。丸め値の自乗が元の数値になれば平方数。

```crystal:abc086_b.rs
x = read_line.split.join.to_i
y = Math.sqrt(x).to_i
puts x == y * y ? "Yes" : "No"
```

# Easy_9

https://atcoder.jp/contests/abc074/tasks/abc074_b

$x_i$それぞれについて、$0$と$K$のうち近いほうからの距離の２倍の和をとる。

## `Enumerable#min`, `Enumerable#sum`

`min(x, y)`のような引数から最小値を得る関数は`Math`モジュールにあった。

`Array#map{|x| Math.min(x, k-x)}`で数列$\\{x_i\\}$を数列$\\{min(x_i,k-x_i)\\}$に変換して、`Enumerable#sum`で和をとる。

```crystal:abc074_b.cr
n = read_line.to_i
k = read_line.to_i
ans = read_line.split.map(&.to_i).map{|x| 2 * Math.min(x, k-x)}.sum
puts ans
```
## `sum(&)`

実は`Enumerable`の各要素にメソッドを適用してから和をとる構文もある。

```crystal:abc074_b.cr
n = read_line.to_i
k = read_line.to_i
ans = read_line.split.map(&.to_i).sum{|x| 2 * Math.min(x, k-x)}
puts ans
```

# Easy_10

https://atcoder.jp/contests/abc088/tasks/abc088_b

貪欲法。カードを降順に並べ替えたら、$a_1-a_2+a_3-a_4+...+(-1)^{N-1}a_N$が解になる。

## `sort`, `sort!`, `reverse`, `reverse!`

`sort`は配列を昇順に並べ変える。$O(NlogN)$であろう。

`reverse`は配列を逆順に並べ変える。$O(N)$であろう。

どちらも`!`なしと`!`ありがある。`!`なしは配列を新たに生成して返す、関数的なメソッド。`!`ありは元の配列を書き換える、手続き的なメソッド。
`a.sort.reverse↩︎`とか書くとaをソートして逆順にしたものを生成して捨てておきながらaは変わらないので計算機が報われない。
`new_a = a.sort.reverse↩︎`ならよいけど。

## `Iterator#cycle`

`Iterator#cycle`はオブジェクトを無限回繰り返すイテレータ(`Iterable`)を返す。`{1, -1}.cycle`だと$1,-1,1,-1,...$。

無限回繰り返すのだが、イテレータなのであらかじめ無限個の数列を生成するのでなく、lazyに必要な分だけ生成する。`a.zip({1, -1}.cycle)`だと、`a`と等しい長さだけ生成する。

```crystal:abc088_b.cr
n = read_line
a = read_line.split.map(&.to_i).sort!.reverse!
ans = a.zip({1,-1}.cycle).sum{|x, y| x*y}
puts ans
```

[^1]: https://crystal-lang.org/api/master/Math.html
【Rails】URL直打ち対策

忘備録として残します。

**URL直打ち**とは、アドレスバーにURLを直接打ち込むことです。
直打ちを禁止しないと、だれでもプロフィールや投稿内容を編集できてしまうので対策しておきましょう。

## posts_controller.rb
直打ちをさせたくないコントローラーを開き、`before_action`で、特定のアクションの直打ちを制限します。

```ruby:app/controllers/posts_controller.rb
class PostsController < ApplicationController
  before_action :authenticate_user!
  before_action :correct_post,only: [:show, :edit] #追記

  def show
    @post = Post.find(params[:id])
  end

  def edit
    @post = Post.find(params[:id])
  end

  private

 # ここから追記
  def correct_post
    @post = Post.find(params[:id])
    unless @post.user.id == current_user.id
      redirect_to root_path  #直打ちした時リダイレクトするパスを指定
    end
  end
 # ここまで
end

```
【Rails】toastrでフラッシュメッセージを表示

ポートフォリオを作成中、手軽にフラッシュメッセージをおしゃれにしたくて
何か便利なGemないかなと探していたら`toastr`というものがあったので、導入しました。
jQuery導入が前提です。


##Gemの追加

まず、Gemをインストール

```ruby:Gemfile
gem 'toastr'
```

```
bundle install
```
`toastr`を`JavaScript`と`Sass`に読み込ませます。

```javascript:assets/javascripts/application.js
// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, or any plugin's
// vendor/assets/javascripts directory can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// compiled file. JavaScript code in this file should be added after the last require_* statement.
//
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
// about supported directives.
//
//= require rails-ujs
//= require activestorage
//= require turbolinks
//= require jquery
//= require jquery3
//= require jquery_ujs
//= require popper
//= require bootstrap
//= require data-confirm-modal
//= require toastr #追加
//= require_tree .
```

```sass:app/assets/stylesheets/application.scss
@import "toastr"; #追加
```

## 実装
application.html.erbに記述します。

```ruby:app/views/layouts/application.html.erb
<% if flash.any? %>
  <script type="text/javascript">
    <% flash.each do |key, value| %>
      <% key = "success" if key == "notice" %>
      <% key = "error" if key == "alert" %>
      toastr['<%= key %>']('<%= value %>');
    <% end %>
  </script>
<% end %>
```

私はDeviseを使用しているので、フラッシュメッセージのシンボルは`:notice`と`:alert`です。
ですが、toastrのメソッドは`success`と`error`なので、**`notice`を`success`に、`alert`を`error`に**変換してあげましょう。
toastrは他にも`warning`や`info`のメソッドがあります。 
メソッドによって色が変わるので可愛いです！

![aa86aec839ba4af2e3aa0e4a6a8ed89d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/752214/d2940afd-51da-c126-be76-aa31ffc36ceb.png)
![3eab0142edef9164c0b02f9ef09ff95e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/752214/12395312-376a-62c0-0219-7cddaa849381.png)

こんな感じで表示されました！
【競プロ典型90問】002の解説（python）

## 概要
[競プロ典型90問](https://atcoder.jp/contests/typical90)の解説記事です。
解説の画像を見ても分からない（~~理解力が足りない~~）ことが多々あったので、後で解き直した際に確認できるようまとめました。

※順次、全ての問題の解説記事を挙げていく予定です。
※★５以上の問題は難易度的に後回しにしているため、投稿時期が遅くなる可能性があります。（~~代わりに丁寧に解説してくれる方いたらぜひお願いします~~）

## [問題002-Encyclopedia of Parentheses](https://atcoder.jp/contests/typical90/tasks/typical90_b)

### 問題概要
長さNの「正しい」カッコ列を辞書順で出力する。
正しいとは、
- ()のペアが揃っている。
- 右から見て行った時に、"("より")"の方が多くなってはいけない
- ()以外の文字列が含まれてはいけない

### 制約

```math

1 <= N <= 20 \\
Nは整数

```

### 解き方

Nが小さく、文字列のシンプルさから、工夫して全探索で求められそう。
一応、同じものを含んだ並び替えで全パターン列挙することも考えたが、パターンが最大で $20!$ となってしまうため、
しんどそう。（厳密には、$20!/(10!*10!)$）

そこで今回は、
1. "(" を1, ")" を0とみなして、ビット全探索
2. １で出てきた文字列において "(" より先に ")" が多く出現しないか確認
といった流れで実装していく。

１に関して、0か1かの２通り × N文字 なので、$O(2^N)$の計算量。
（ビット全探索に関しては[こちら](https://qiita.com/wihan23/items/be2e70bbeea66bb3be85)）

2に関して、N文字を左から検索するだけなので、$O(N)$。

2^Nのパターンにおいて、N回の検索を行うので、
合計で$O(N*2^N)$。これは、10^7のオーダーになるので、十分に間に合う。

![参考画像](https://raw.githubusercontent.com/E869120/kyopro_educational_90/main/editorial/002.jpg "公式解説画像")

引用元：[競プロ典型90問 Github](https://github.com/E869120/kyopro_educational_90)

### 実装

```python:answer.py

# 入力の受け取り
N = int(input())

# カッコ列を格納する配列
pare = []

# ビット全探索
for i in range(1 << N):

# 1の時 "(" を、0の時 ")" を文字列に追加していく
  l = ""
  for j in range(N):
    if i >> j & 1:
      l += "("
    else:
      l += ")"

# 文字列の長さがNの時のみ、左から検索する。その時cntで"("と")"の出現回数を計算する。cntが0より小さくならなかった＋cntが0(出現回数が等しかった)文字列のみをpareに格納する
  if len(l) == N:
    cnt = 0
    flag = True
    for k in range(N):
      if l[k] == "(":
        cnt += 1
      else:
        cnt -= 1
      if cnt < 0:
        flag = False
    if flag and cnt == 0:
      pare.append(l)

# pareを辞書順にソート、順番に出力する
pare.sort()

for i in range(len(pare)):
  print(pare[i])

```

※ちなみに、上記のコードは、Pythonで提出するとTLEになり、pypyだとACになります。
やたらと長い配列や再起関数を用いる場合を除いては、pypyの方が基本的に早いので、提出はpypyがおすすめです。
[参考記事](https://qiita.com/OKCH3COOH/items/f0c5c4681bc30dddf7f4)

## 最後に
問題の解説を読んでも他の人のコードを見てもさっぱり分からないという方の
力に少しでもなれれば幸いです。
コードの改善点やその他、ご意見などあれば、気軽にコメントください。

ここまでお読みいただきありがとうございました。
iPhone,iPadのppi対応表

#ppiとは

ppi（ピーピーアイ）とは、pixels per inchの略で、ディスプレイやビットマップ画像における解像度を示す単位である。別名画素密度 (pixel density) とも呼ばれる。

[ppi - Wikipedia](https://ja.wikipedia.org/wiki/Ppi)

あまりないとは思いますがレイアウトを物理サイズで何センチにしたいなどと言うとき機種によってppiを使用して計算します。

# 表

|機種名              |ppi　　　　　　　　　　|
|:------------------|:------------------|
|iPhone 1st         |163
|iPhone 3G          |163
|iPhone 3GS         |163
|iPhone 4           |326
|iPhone 4S          |326
|iPhone 5           |326
|iPhone 5C          |326
|iPhone 5S          |326
|iPhone SE          |326
|iPhone 6           |326
|iPhone 6 Plus     |401
|iPhone 6S          |326
|iPhone 6S Plus     |401
|iPhone 7           |326
|iPhone 7 Plus     |401
|iPhone 8           |326
|iPhone 8 Plus     |401
|iPhone SE 2nd      |326
|iPhone X      |458
|iPhone XS      |458
|iPhone XS Max      |458
|iPhone XR      |326
|iPhone 11      |326
|iPhone 11 Pro      |458
|iPhone 11 Pro Max      |458
|iPhone 12      |401
|iPhone 12 Pro      |401
|iPhone 12 Mini      |476
|iPhone 12 Pro Max     |458
|iPod Touch       |163
|iPod Touch 2nd       |163
|iPod Touch 3rd      |163
|iPod Touch 4th      |326
|iPod Touch 5th      |326
|iPad       |132
|iPad 3G       |132
|iPad 2nd      |132
|iPad 3rd       |264
|iPad 4th       |264
|iPad 5th       |264
|iPad 6th       |264
|iPad 7th       |264
|iPad 8th       |264
|iPad Mini       |163
|iPad Mini Retina      |326
|iPad Mini Retina CN     |326
|iPad Mini 3rd     |326
|iPad Mini 4th     |326
|iPad Mini 5th     |326
|iPad Air       |264
|iPad Air 2nd      |264
|iPad Air 3rd      |264
|iPad Air 4th      |264
|iPad Pro 9.7 inch       |264
|iPad Pro 10.5 inch       |264
|iPad Pro 11 inch       |264
|iPad Pro 12.9 inch       |264
|iPad Pro 2nd 11 inch       |264
|iPad Pro 2nd 12.9 inch       |264
|iPad Pro 3th 11 inch       |264
|iPad Pro 3th 12.9 inch       |264
|iPad Pro 4th 12.9 inch       |264
|iPad Pro 5th 12.9 inch       |264

#最後に
自分用にまとめてみましたが、間違いなどありましたらコメント/リクエストお願いします。
ServiceNowでインシデントのSLA違反レポートを作成する

incident-taskでのSLA違反レポートを作成する
## レポートの作成
reports > create new
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/9942ac81-ebe3-921c-b1a1-51eb16321ac1.png)
 
設定値は以下
Report name..breached Incident
Source type..Data source
Data source..Tasks.Breached.SLA
Nextをクリックすると、様々なレコードが確認できる。
ここでINCIDENT似関連するレコードだけにしたいのでソート条件を加える。
Task Starts with INC
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/b87c9130-7614-19b1-ebb5-85fc91d1dc97.png)
SLA違反の状況を確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/211f4858-593c-47bc-4ec3-8947158c6321.png)
Runでレポートをpublishできる
Optiver Realized Volatility Predict 走り書き



与えられた10分間の観測データを使い、10分後のRealized Volatilityを予測するコンペ 
Optiver Realized Volatility Predictにて知っておくべき周辺知識をまとめた。
## Realized Volatilityとは
__ボラティリティの推定値の一種__
ボラティリティは資産価格の変動度合いを表し、この指標が高い商品は高リスクと判定できる。
Realized Volatilityは、高頻度データによる株価リターンを使用し、日時換算したボラティリティを指す。 
ごちゃごちゃ書いているが、要は日中に観測されたリターンの2乗を観測回数分足して、 
日時換算したものがRealized Volatility 
定義式はt日の観測回数i回のRVが下記式
$$
    RV_t = \sum_{i=1}^{n}r^2_{-1+i/n}\quad
$$
$\lim_{n \to \infty}RV_t$が一日単位で観測された累積ボラティリティと  一致していることが示されているので、
観測回数を増やせば増やすほど真のボラティリティに近づく。
なお、一般的なボラティリティ自体は$dS_{t}=\mu S_{t}\, dt+\sigma S_{t}\, dB_{t} $
におけるシグマを指すようです。（Wikipedia定義） 
名前がややこしいが、あくまでRVは統計量なので平均値の仲間のようなもの（と思っている）  
## 今回のコンペにおけるRealized Volatility  
上記は金融工学におけるやや厳格なRealized Volatilityを記載した。
今回のコンペでは金融知識を持たないKagglerに配慮し、もっとシンプルなRealized Volatilityの定義が用いられている。 
本題に入る前に、下準備とし市場の流動性と株式評価の上で重要なOrder book statisticsとLog Returnについて確認する。 

+ bid/ask spread
+ Weighted averaged price
+ Log Return

### bid/ask spread
原文
>As different stocks trade on different level on the market
we take the ratio of best offer price and best bid price to calculate the bid-ask spread.

異なる水準の株価のトレードをする際の__最高買値__と__最安売値__の比であり、以下で定義される。  
$$
   BidAskSpread=BestOffer/BestBid-1
$$

株の流動性の1つの指標として用いられようで、これが1に近いと取引費用は小さく 
流動性が高くなります。（つまりボラは低い）

### Weighted averaged price
読んで字のごとく重みづけされた平均価格。定義見たほうが早い

$$
\frac{WAP=BidPrice*AskSize+AskPrice*BidSize}{BidSize+AskSize}
$$

Realized Volatilityを計算する上での価格はこれを用いるので、 
関数化必須

### Log returns
異なる時系列の株価を比較するときに、logを使うと計算が楽になります（あたりまえ体操）
$$
   r_{t_1,t_2} = \log(\frac{S_{t_2}}{S_{t_1}})
$$

### Realized Volatility 
ようやくRealized Volatilityの定義に入る。 
年単位で正規化された株のログリターンの、年換算標準偏差がVolatility
WAPによって定義された株価$S_t$をログリターンにぶち込み、 
各tにおける二乗和の平方根を取った値σこそ、今回求めるRealized Volatility
$$
   σ = \sqrt{\sum_{t}r^2_{t-1,t}}
$$
頑張ってこれを予測していきましょう
## 終わりに 
### RMSPEについて
指標としてはRMSPE（Root Mean Squared Percentage Error）が使われる。 
誤差を正解値で割った値の二乗の平均の平方根（長い） 
RMSPEを0に近づけていくことがコンペの目標だが、RMSPEだからと言って留意すべきことは特段なさそう
特徴量の検討方法について考察できたら追記します。

## 参考文献
Kaggleのチュートリアル
https://www.kaggle.com/jiashenliu/introduction-to-financial-concepts-and-data 
高頻度データによるボラティリティの推定：Realized Volatilityのサーベイと日本の株価指数および株価指数先物の実証分析 
https://www1.econ.hit-u.ac.jp/finmodel/pdf-2/2014-7Wakaki.pdf 
Realized volatility のショックの影響力についての検証 
https://www.imes.boj.or.jp/research/papers/japanese/07-J-14.pdf
新規プロジェクトの作成や初期設定について

##概要
新規プロジェクトを作成するときのコマンドと手順をおさらいしましょう。

##新規プロジェクトの作成
２通りのコマンドがあります。
※ここではプロジェクト名をsrcとしています。

##バーションを指定せずに作成
```terminal
laravel new src
```

##バージョンを指定して作成
```terminal
composer create-project --prefer-dist laravel/laravel src "6.*"
```

##初期設定
###タイムゾーンの変更
```config/app.php
'timezone' => 'UTC',
// UTCをAsia/Tokyoに変更
'timezone' => 'Asia/Tokyo',
```

###言語の変更
localとfallback_localの２箇所で設定がありますが、falllback_localは該当言語が見つからない場合の言語なので、enのままにしておきます。
また、**resources\lang**にjaの設定が保存されているフォルダとja.jsonファイルが必要になります。
ja.jsonが他言語記述の略になるため、使用しない場合は不要です。
GitHubのLaravel-lang/langにソースがあります。

```config/app.php
'local' => 'en',
// enをにja変更
'local' => 'ja',
```

##遷移先の変更
デフォルトの設定で書きますが、ここはコントローラーからの変更なので使い方次第にはなります。

###新規登録後の遷移先
RegisterController.phpから編集します。

```RegisterController.php
protected $redirectTo = '/home';
```

###ログイン後の遷移先
loginController.phpから編集します。

```loginController.php
protected $redirectTo = '/home';
```

##データベースの設定
初期設定がMysqlなので、Mysqlを使用する場合は.envファイルを変更するだけです。
以下の部分に該当する変更箇所を書き換えればOKです。

```.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
```
動作についてはmigrateコマンドでテーブルが作成されたかで確認します。

```terminal
php artisan migrate
```

##フロントエンドパッケージとauth機能
bootstrap, vue.js, reactがインストールできます。

###パッケージをまとめてインストールする場合
bootstrapとvue.jsをまとめてインストールできる。
この時、バージョンの指定がないとエラーになる。
laravel6.xはlaravel/ulの1.xが対応しているらしい。

```terminal
composer require laravel/ul "1.*"
```

###個別にインストールする場合
個別にインストールする場合は、引数に--authを指定することで、ログイン/ユーザー登録スカフォールド（auth関連ファイル）を生成します。

```terminale
// ファイルを生成
php artisan ui bootstrap
php artisan ui vue
php artisan ui react
```

###auth関連のファイルを生成
インストールしたフロントエンドパッケージに合わせて生成します。
laravel/uiでインストールした場合はvueだけでOKです。

```terminal
php artisan ui bootstrap --auth
php artisan ui vue --auth
php artisan ui react --auth
```

###npmのインストールと実行
フロントエンド開発に必須な依存パッケージです。
Nodeのダウンロードとインストールが必要です。

```terminal
npm install && npm run dev
```
補足

```
npm run dev // 開発用にビルド
npm run watch // 常時ビルド
npm run prod // 本番用にビルド
```
4GBのGPUメモリで、DiscoGANを動かしてみた。

# はじめに

https://github.com/eriklindernoren/PyTorch-GAN
に、沢山のGANがある。

このgithubのコードは、非常に簡単に動作させることができる。

# DiscoGANを動かしてみた

以下が基本コマンド。

```
python discogan.py --dataset_name edges2shoes
```

これは、メモリが足りないと出ない！！！
素直に、動いてくれた。

## 注意事項

```
bash download_pix2pix_dataset.sh edges2shoes
```

は、NGになるよう。
⇒⇒ http://efrosgans.eecs.berkeley.edu/pix2pix/datasets/
単に、ぐぐって、上記等のでいいのかな。。。と思い、アドレスを変更した。




# 動作結果
非力なPCなので、epochを極端に小さくした。2とか3にした。
まだ、全然という感じですが。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635156/240b1c71-975e-468b-6ca5-6954ba3d2563.png)


# コメント
特にありません。
このgithubは、お勧めーーーー。
連想配列からキーと値を指定して抽出する

データベースからレコードを取得した際、大体は以下のような二次元の連想配列である。
この時、あるキーにおいて指定の値を持つものを抽出したいことがある。


```php:元データ
$array = [
    0 => ['id' => 1, 'blood' => 'A', 'name' => 'yamada'],
    1 => ['id' => 2, 'blood' => 'B', 'name' => 'tanaka'],
    2 => ['id' => 3, 'blood' => 'O', 'name' => 'satake'],
    3 => ['id' => 4, 'blood' => 'B', 'name' => 'murata'],
    4 => ['id' => 5, 'blood' => 'B', 'name' => 'takeda']
];
```

例えば、キー `blood` の値が `B` のものを抽出する場合は以下。[^1]

```php:
$new_array = array_filter($array, fn($a) => $a['blood'] === 'B');

print_r($new_array);
```

```php:結果
Array
(
    [0] => Array
        (
            [id] => 2
            [blood] => B
            [name] => tanaka
        )

    [1] => Array
        (
            [id] => 4
            [blood] => B
            [name] => murata
        )

    [2] => Array
        (
            [id] => 5
            [blood] => B
            [name] => takeda
        )
)
```

[^1]: コメントにて、より簡潔な記述を教えていただきましたので修正しました。
EC2-Classic とは

## 勉強前イメージ

終了するって言ってたけど・・・・
そもそもEC2のoldバージョン？
インスタンスタイプ的な話？

## 調査

### EC2-Classic とは

1つのIPのみでアサインされた単一のネットワーク内で稼働するインスタンス環境で、
EC2が出来た2006年から存在する環境です。
2013年12月4日以降はリクエストしない限り利用できない様になっており、廃止予定になっております。

### 廃止について

2021年10月30日にアクティブなEC2-Classic環境がないAWSアカウントに関しては
EC2-Classicを無効化、リザーブドインスタンスの販売の停止。
2022年8月15日には、全移行措置を完了予定になっております。

## 勉強後イメージ

今のEC2はVPCの中にあるって感じだけど
EC2-Classicは一つIPを持って一つの空間って感じする。。。
もう廃止らしいし、みたことないけど。。

## 参考

- [AWS、「EC2-Classic」を終了へ](https://japan.zdnet.com/article/35174657/)
- [AWSが「EC2-Classic」を廃止へ](https://article.auone.jp/detail/1/3/7/48_7_r_20210729_1627534993224926)
logic pro Xで曲を出力したらなんか音量が小さかった話

# 出会した問題
logic pro XでDTMをやっております
かなり音量調整にこだわって調整して出力したらなんか音量が小さくておかしいなと思った

# 解決方法
![スクリーンショット 2021-08-05 23.58.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855735/bd294e8d-5e6d-5520-5776-d8804598dfb4.png)
この画面の左下のノーマライズのとこをオフにする（デフォルトではオン）
このノーマライズがオンの状態だと、音量が最大のものを0に合わせて音量を小さくしてしまう
オフにすることで、logic proで聞いた音量と同じになる
docker buildx を proxy 環境で実施する

# これは何?

[docker buildx](https://matsuand.github.io/docs.docker.jp.onthefly/buildx/working-with-buildx/) を proxy 環境化で行う方法です。

2021/8/5現在、[Docker Desktop for Windows の proxy 設定](https://qiita.com/2fbCvmiYKX/items/c6aab333364af25fd924) に記載した設定は, buildx に引き継がれません。たぶん。

# 結論

proxy が `http://hogehoge.com:8080` の環境で、 カレントディレクトリの `Dockerfile` を使って `piyo` ビルドすると以下のようになります。

```
docker buildx create --use --driver-opt env.http_proxy=http://hogehoge.com:8080 --driver-opt env.http_proxy=http://hogehoge.com:8080
docker buildx build --build-arg http_proxy=http://hogehoge.com:8080 --build-arg https_proxy=http://hogehoge.com:8080 -t piyo .
```

Windows の Docker version 20.10.7 で, `--platform linux/arm64` 向けビルドで動作確認しました. 
ビルドは、この記事の設定でできますが、 private registry への push はできません。。。
[Buildx don't push image on private registry](https://github.com/docker/buildx/issues/455)

# 詳細

buildx は, moby が配布する builder image を使って docker image をビルドします. この builder image は proxy 設定がなされておらず、また host の proxy が反映されません。そのため、`docker buildx build` を実行すると image の pull で proxy が使われません。

[buildx new builder do not use proxy settings of default docker daemon](https://github.com/docker/buildx/issues/136) での議論をみると、 `--driver-opt` で builder の環境変数を設定できるので、これを使います。

また、`Dockerfile` に記載している RUN コマンドは、ビルド対象の docker image コンテナの環境のうえ、HOST の設定が引き継がれないので、 builder image の設定は反映されません。ですので、 buildx build で `--build-arg` を使って proxy 設定をします。

# 雑感

builder image 独自にあつらえれば、build の引数無しでいけると思います。 private registry への push も、認証情報を独自 builder image に入れ込めば大丈夫と思います。

具体的には、builder image の `/root/.docker/config.json` に proxy を入れれば良いと思います。 認証情報も入れられれば、 private registry に push できる気もします。

# 参考

- [buildx new builder do not use proxy settings of default docker daemon](https://github.com/docker/buildx/issues/136)
- [Buildx don't push image on private registry](https://github.com/docker/buildx/issues/455)
- [プロキシ環境下でdocker image buildしたい](https://qiita.com/charon/items/d8365d610343d64d598e)
A5コミック約200ページの裁断と600dpi PNGスキャンを合わせて1冊あたり3分24秒で実施した手法

#1. はじめに

画質を下げないために600dpi PNGでADFスキャンしつつ、人間系を含めた処理速度を追求する手法です。
参考にする場合には、原稿を500枚セットできるADFスキャナ1台と、もう1台以上スキャナが必要です。
当方は下記の機器で行っています。

- Canon DR-X10C カラー担当
- Canon DR-X10C グレースケール担当
- 富士通 fi-7700S(フラットベッド部を使用) 
- DURODEX 200DX(裁断機)

PCはスキャナの数だけ必要なので、3台使用します。
スキャン対象と担当スキャナは下記の通りです。

- 表紙カバー：DR-X10Cカラー担当
- カラーページ：DR-X10Cカラー担当
- カバー裏(厚紙部分)：fi-7700Sフラットベッド部
- 本文：DR-X10Cグレースケール担当

帯は後回しにしています。原稿ガイドを動かすのに時間がかかるので。
スキャン結果の組み合わせとチェックとフォルダ名のリネームも後でまとめて行います。(寝っ転がりながらのんびりと)

この手順だと、スキャン完了待ちでぼーっとすることがなく、1人で常に何らかの作業をしています。

表紙カバー、カラーページ、本文の順番でDR-X10Cにセットして、もう片方のDR-X10Cにもセットしてと1冊ずつ交互にセットするよりも、スキャナ設定の切り替えが減るのと複数冊連続により、早くスキャンできます。

スキャナの設定は下記のページに記載しています。
[自炊(本のスキャン)向けスキャナ設定 - Qiita](https://qiita.com/mayo00/items/7a2e85b3afd67c9439d0)

同人誌のスキャンは下記のページに書いています。
[同人誌のまとめ裁断、まとめスキャン - Qiita](https://qiita.com/mayo00/items/efc1e91c8ce1131be38d)

#2. 手順

本の厚紙部分を剥がして本文を裁断して、本文を1～3冊分まとめてDR-X10Cグレースケール担当にセットしてスキャンします。
うちのスキャナの場合、グレースケールスキャンだと縦線はほとんど発生しないので、スキャン中はほとんど見ません。

その間に、表紙カバー(片面)とカラーページ(両面)をDR-X10Cカラー担当でスキャンします。
カラーページでは緑や紫等の線がたまに出るため、スキャン時に確認しながらスキャンします。

手が空いたら、次にスキャンする本を1～3冊裁断します。
DR-X10Cグレースケール担当のスキャンが終了したら、次の本をセットしてスキャンします。

さらに手が空いたら、厚紙部分をfi-7700Sのフラットベッドでスキャンします。
黒色原稿押さえパッドを使用してサイズ・傾き自動認識でスキャンするので、原稿を適当に置けます。

以上の繰り返しです。

#3. 裁断

200DX 1回で裁断できる厚さの本はそのまま裁断、入らない厚さの本はサバ折りしてそのまま突っ込んで半分裁断、その後もう半分を裁断する手抜き裁断をしています。
きれいに裁断する場合は、サバ折りした背表紙側からカッターで切るのが良いです。

#4. 実績

1時間35分で28冊、裁断とスキャン。1冊あたり3分24秒。かなり速いです。

#5. 縦線発生率

28冊スキャンで、カラー2ページで縦線(緑色っぽい目立つ線とわずかな黒っぽい線)が発生しました。

清掃は緑色の線が出たときに一度行ったのみ。
再スキャンの際、清掃せずにスキャンしても縦線が消えることがあります。また出ることもあります。

この28冊と別の時に、グレースケールでも黒い縦線や白い縦線が出たことがあります。10冊に1ページ程度。

#6. 表紙カバーのスキャンについて補足

ジャンプコミックスサイズの表紙カバーは広げてもA3に収まるため、A3フラットベッドスキャナでスキャンしています。
B6本の表紙カバーはA3に収まったり収まらなかったりで、収まらないものはADFの長尺モードでスキャンしています。
A5本の表紙カバーはA3に収まらないのでADFの長尺モードです。

300～500枚セットできる重量級ADFスキャナで表紙カバーをスキャンすると、真っ平らにスキャンされて綺麗です。
予め折り目を平らにする必要はありません。
A4小型機のADFでスキャンすると、しわが目立ちます。

#7. 帯のスキャン

帯の長さは表紙カバーと同じなので、フラットベッドでスキャンするかADFでスキャンするかは表紙カバーに準じます。
ADFでスキャンする時に、原稿ガイドを帯の幅まで狭めます。
原稿ガイドの最小幅よりも幅が狭い帯は、原稿ガイドの片側に寄せてスキャンします。原稿サイズ自動認識でスキャンすれば中央でなくても問題ありません。
さらに幅が狭くて片側に寄せると給紙失敗する場合には、中央に置いてスキャンします。

#8. DR-X10Cについて

ジャンク品のDR-X10Cを1台、動作未確認品で動かなかったDR-X10Cを2台入手して訪問修理からの引き取り修理を何度か依頼しましたが、結構直ります。
動作確認済み中古で動かなかった2台と合わせて、5台とも修理を経て動作しています。
但し、1台はカラースキャン時の色が若干変で、これは修理でも直りませんでした。
1台はカラースキャン時にごくわずかな縦線が1箇所入ります。
3台は快調です。
複数台同時に訪問修理に出すと、訪問料金税込13,200円が、1回分で済みます。

#9. 使用PC

PC性能は大して必要ありません。10年前のPC 2台でDR-X10Cを使っているわりに、フラットベッドだけ最近のPCで妙に性能が高いです。もっと性能が低いWindowsタブレットに入れ替えるかもしれません。

DR-X10Cカラー担当：NEC Express 5800/S70タイプRB いわゆる鼻毛鯖 Pentium G6950(2.8GHz、2コア2スレッド)、メモリ8GB、Windows 10
DR-X10Cグレースケール担当：自作PC Core i7-920(初代i7、2.66GHz、4コア8スレッド)、メモリ16GB、Windows 10
fi-7700S：Lenovo ThinkCentre M75q-1 Ryzen 5 3400GE(3.3GHz、4コア8スレッド)、メモリ16GB、Windows 10

#10. フォルダ名のリネーム
フォルダ名のリネームには下記のブックマークレットを使います。(自作)
[GoogleのISBN検索結果から著者名とタイトルを取得するブックマークレット GetAuthorTitle - Qiita](https://qiita.com/mayo00/items/4cfba983de23b0b56369)
[国立国会図書館オンラインのISBN検索結果から著者名とタイトルを取得するブックマークレット GetAuthorTitleNDL - Qiita](https://qiita.com/mayo00/items/0f3e57b76c3df5fcd04b)
Rails session

##環境
Rails　6.1.3
##session
session・・sessionはページを移動してもユーザー情報を保持し続ける。sessionに代入された値は、ブラウザに保存されブラウザはそれ以降のアドレスでsessionの値をRailsに送信する。

###例
ログイン時
ブラウザ＞ログイン＞Rails
　　　　　　session[:user_id]=1（session[:user_id]に1を代入）
　　　　　　user_id=1という情報をブラウザに保存させる
　　　　　　　ブラウザにuser_id=1の情報を渡す

それ以降のアドレス
ブラウザ　　　　　　　　　　　　　　　　　　　Rails
sessionの値をRailsに送信する。　　　　session[:user_id]=1を取得

```users_controller.rb
def create
@user=User.new(...)
if @user.save
session[:user_id]=@user.id
```
解説
usersコントローラーのcreateアクション内で作成したユーザーのidをsession[:user_id]に代入。
ユーザー登録が成功したユーザーがそのままログイン状態になる。
###書き方
session[:user_id]=@user.id（user_idがキー値）
@userに代入した値がブラウザに保存
特定したユーザーのidを代入することで、ログインユーザーの情報を保持することができる。
コマンドプロンプトにて一箇所にパスを通してその中にショートカット(?)を置き実行したい

windowsにてコマンドプロンプトにてサクラエディタに対してパスを渡して開く　という動作を行いたかったのですが
サクラエディタのexeが入っているディレクトリにパスを通す
というのが実行ファイルごとにいろんなディレクトリにパスを通すというのが何か引っかかったので、一つのディレクトリにパスを通して、そこにexeのショートカットを置くことで解決できないかな？

とふと思いショートカットをおいたのですが細かいところでうまく行かず少し悩んだので記事に残そうと思いました。

↑　各ディレクトリにパスを通せば済む話ですし、このやり方で運用するのが適切かどうかは知りません。参考までに「へ～」と思って見ていただけたら幸いです。

## try1 シンプルにショートカットを置いてみた

exeのショートカットを置いてみましたがうまいことコマンドプロンプトから実行ができませんでした。

**原因** 

見た目上は拡張子は表示されていませんでしたがファイルパスとしては `sakura.lnk`となっています。

パスを通しているものを実行するときに拡張子を省略する場合は
環境変数のPATHEXTに拡張子の登録を行っているもののみ省略を行うことができるようになっていた

## try2 PATHEXTに.lnkを追加し再度チャレンジ

引数で渡した相対パスでのファイルが開かれるのではなく、ショートカット先のexeのディレクトリからの相対パスとして評価された
（絶対パスで渡せば問題なく開かれる）

**原因**

たぶんショートカットだとそうなるのかな？と思います
ということで他の方法を模索

## try3 batにしてパスをもらい渡してみよう

```bat
"C:\programs\sakura\sakura.exe" "%1"
```

開けた！！
が、コマンドプロンプトがサクラエディタを閉じるまで待たされる・・

## try4 startを使う

コマンドの待ちを行うかどうかというのがcallかstartかで違うらしい。startを使えばいいとのこと

=> うまく行かない（エクスプローラが立ちあがり別のコマンドプロンプトも開かれた）

https://orangeclover.hatenablog.com/entry/20090814/1250261637

をみると`start ""`とあえて第一引数に`""`を入れると良いとのこと

## try5 `start ""` 

うまく開かれた！！

が、あとはコマンドプロンプトに開いたファイルパスが表示されるため`@echo off`にてコメント出力を切る

## 結論

ショートカットではなくbatファイルならできました。

```bat
@echo off
start "" "C:\programs\sakura\sakura.exe" "%1"
```

これでうまく行きました :smile: 

本来は普通にパスをそれぞれ通すべき　なのかとは思いますが、この機会にbatファイルのお勉強になったのでこれはこれで良し！
iperf3でスループット測定

#GbEスイッチに接続した端末のスループット
[iperf3]("http://software.es.net/iperf/")で同じスイッチに接続している同じネットワークにいる端末間のスループットを測定します。
使い方やインストール方法は数多くのサイト、ページがあるので割愛します。

#サーバ側(Windows10 192.168.2.3)
```
C:\Program Files (x86)\iperf-3.1.3>iperf3 -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from 192.168.2.6, port 49226
[  5] local 192.168.2.3 port 5201 connected to 192.168.2.6 port 49228
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-1.00   sec   113 MBytes   946 Mbits/sec
[  5]   1.00-2.00   sec   113 MBytes   949 Mbits/sec
[  5]   2.00-3.00   sec   113 MBytes   949 Mbits/sec
[  5]   3.00-4.00   sec   113 MBytes   949 Mbits/sec
[  5]   4.00-5.00   sec   113 MBytes   949 Mbits/sec
[  5]   5.00-6.00   sec   113 MBytes   949 Mbits/sec
[  5]   6.00-7.00   sec   113 MBytes   949 Mbits/sec
[  5]   7.00-8.00   sec   113 MBytes   949 Mbits/sec
[  5]   8.00-9.00   sec   113 MBytes   949 Mbits/sec
[  5]   9.00-10.00  sec   113 MBytes   949 Mbits/sec
[  5]  10.00-10.00  sec   346 KBytes   939 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-10.00  sec  0.00 Bytes  0.00 bits/sec                  sender
[  5]   0.00-10.00  sec  1.11 GBytes   949 Mbits/sec                  receiver
```

#クライアント側(Ubuntu 20.04LTS 192.168.2.6)
```
mgr206@Alpha8086:~$ iperf3 -c 192.168.2.3
Connecting to host 192.168.2.3, port 5201
[  5] local 192.168.2.6 port 49228 connected to 192.168.2.3 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec   114 MBytes   958 Mbits/sec    0    210 KBytes
[  5]   1.00-2.00   sec   113 MBytes   949 Mbits/sec    0    210 KBytes
[  5]   2.00-3.00   sec   113 MBytes   949 Mbits/sec    0    210 KBytes
[  5]   3.00-4.00   sec   113 MBytes   949 Mbits/sec    0    210 KBytes
[  5]   4.00-5.00   sec   113 MBytes   949 Mbits/sec    0    210 KBytes
[  5]   5.00-6.00   sec   113 MBytes   949 Mbits/sec    0    210 KBytes
[  5]   6.00-7.00   sec   113 MBytes   949 Mbits/sec    0    210 KBytes
[  5]   7.00-8.00   sec   113 MBytes   949 Mbits/sec    0    210 KBytes
[  5]   8.00-9.00   sec   113 MBytes   949 Mbits/sec    0    210 KBytes
[  5]   9.00-10.00  sec   113 MBytes   950 Mbits/sec    0    210 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  1.11 GBytes   950 Mbits/sec    0             sender
[  5]   0.00-10.00  sec  1.11 GBytes   949 Mbits/sec                  receiver

iperf Done.
```
#結果
約950Mbpsでした。
iperf3の測定か大きいファイルの転送をしない限り1Gbpsの帯域を使うこと無いのでは、と思いました。
Rustにおける代入（let, mut）

動的型付け言語ばっかやりすぎてよくわからなくなったのでメモ。Python楽なんだけどもうあきたよぉ。

# mutを使って再代入
いわゆるプログラミングでの _代入_ はこれに当たるかと。
rustではmutをつけることによって代入が可能になる。（言い換えればデフォルトでは再代入ができない。）
<b>型の一致が必須である。<b>

```rust:main.rs
fn main()
{
    
    let mut x = 10;
    x = x + 10;
    // この時のxは同じ変数
    println!("{}", x);
    // 出力結果： 20
}
```


# letを使ってシャドーイング（覆い隠す）
letを使うと同じ変数名を使いまわすことができる。 <b>これには型の一致は求められない。<b> 

letはただ変数を宣言するときに使うイメージで行けそう。


```rust:main.rs
fn main()
{
    
    let x = 10;
    let x = x + 10;
    // この時のxは名前は同じであるが別物
    println!("{}", x);
    // 出力結果：20
}
```

このように整数型から文字列に代わっても大丈夫。

```rust:main.rs
fn main()
{
    
    let x = 10;
    let x = "10";
    // 型が一致していなくてもコンパイルが通る
    println!("{}", x);
    // 出力結果：10
}
```


#参考
https://doc.rust-jp.rs/book-ja/ch03-01-variables-and-mutability.html
pyenvでPythonのバージョンを切り替えられない場合の対処法

対処前

```
 % python --version
Python 2.7.16
```

対処方法
pyenv initを実行

```
% pyenv init

# (The below instructions are intended for common
# shell setups. See the README for more guidance
# if they don't apply and/or don't work for you.)

# Add pyenv executable to PATH and
# enable shims by adding the following
# to ~/.profile and ~/.zprofile:

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"

# Load pyenv into the shell by adding
# the following to ~/.zshrc:

eval "$(pyenv init -)"

# Make sure to restart your entire logon session
# for changes to profile files to take effect.
```
次にzprofileを開き、

```
 % open ~/.zprofile 
```
下記を記入

```
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
```
次にzshrc を開く

```
% open ~/.zshrc  
```
下記を記入

```
eval "$(pyenv init -)"
```
次に下記を実行し、保存すると

```
% source ~/.zprofile    
% source ~/.zshrc  
```
改善された

```
% pyenv global 3.9.6
% python --version  
Python 3.9.6
```

ただし、

```
 % open ~/.zprofile   
The file /Users/yuuki/.zprofile does not exist.
```
の場合

```
% echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zprofile
% echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zprofile
% echo 'eval "$(pyenv init -)"' >> ~/.zprofile
```
Slack 허들(Huddle) 기능

![썸네일_허들.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/42de5cf3-741c-9538-2bdc-76aa262fb675.png)
## TL;DR
> 최근 Slack에 허들(Huddle) 기능이 추가되었습니다.
> 클럽하우스 앱과 유사하며, 슬랙콜과 비교하면 이해가 쉽습니다.
> ※ 아쉽지만 현재는 Slack **유료버전**에서만 지원됩니다.

|기능|슬랙콜|허들콜|
|:-----------:|:------------:|:------------:|
|컨셉|비디오콜 (다소 무겁)|보이스톡 (가볍게)|
|사용 제한|무료+유료 (무료는 1:1 만 가능)|유료|
|인원 제한|15명|50명|
|시간 제한|-|무제한 (Idle 상태 25분 경과시, 자동종료)|
|경과 시간 표시|가능|불가능|
|웹캠|가능|불가능|

## 허들(Huddle) 기본 동작
1. 채널 or DM(Direct Message)을 찍고, (왼쪽 하단) 허들 기능을 on/off 할 수 있습니다.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/c35285b5-f700-c710-d2dd-45a273802a52.png)

2. 허들에 참여하고 있다면 헤드폰 이모지가 노출됩니다.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/8ecab172-5ffc-90a0-70ad-bdbb26c87f60.png)

3. 허들 on 상태 및 복수 참여자 표시가 됩니다.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/da8f4871-5e19-c2a1-7ad7-c1f61bfd8f15.png)

4. 슬랙콜처럼 화면공유, 함께그리기가 제공됩니다. 
기본은 작은 화면으로 제공되며 작은 화면을 클릭하면 큰 화면으로 전환 됩니다.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/2a3f1ca3-c222-b96f-ced7-ec8337b90378.png)

5. 캡션기능도 제공합니다. 목소리를 실시간 자막으로 바꿔줍니다. 
다만 현재는 영어만 제공 됩니다.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/0c0a78fe-5797-2467-a380-6639d2d3d386.png)

아직 허들콜 참여인원 수 확인이 불가하거나, 함께그리기 펜이 지워지지 않는 등의 몇가지 버그가 있습니다.

## 참고
- https://slack.com/help/articles/4402059015315-Introducing-Slack-Huddles-a-new-way-to-have-live-audio-discussions
本番環境でよく使うコマンドまとめ

RailsアプリケーションをAWSでデプロイした際、コマンドを何度も調べていたのでまとめました。（自分用メモです）
随時更新していく予定です！

## 前提条件
- OS：Linux(CentOS)
- 言語：HTML,CSS,JavaScript,Ruby,SQL
- フレームワーク：Ruby on Rails
- IDE：Cloud9
- Webサーバー：Nginx
- アプリケーションサーバー：Puma
- データベース：MySQL

## コマンドまとめ
#### cloud9のターミナルからEC2へSSHでログイン

```
$ ssh -i ~/.ssh/キー名.pem ec2-user@IPアドレス
```
#### Pumaの起動

```
# EC2のアプリケーション上で実行
$ rails s -e production
```

#### Pumaの停止

```
# EC2のアプリケーション上で実行
$ kill $(cat tmp/pids/puma.pid)

# 自動起動設定をしている場合はsudoをつける
$ sudo kill $(cat tmp/pids/puma.pid)
```

#### Gemファイルのインストール

```
$ bundle install --path vendor/bundle --without test development
```

#### プリコンパイル

```
$ bundle exec rails assets:precompile RAILS_ENV=production
```

#### マイグレート

```
$ bundle exec rails db:migrate RAILS_ENV=production
```

#### 本番環境でのエラーログの確認

```
# EC2アプリケーションのlogディレクトリに移動して実行
$ cat production.log

# 行数を指定して表示
$ tail -n 行数 production.log
```

#### MySQLへ接続

```
# EC2のホームディレクトリで実行
$ mysql -u マスタユーザ名 -p -h エンドポイント
```

#### Nginxのアプリケーション名.confファイルの編集

```
# EC2のアプリケーション上で実行
$ sudo vi /etc/nginx/conf.d/アプリケーション名.conf
```

#### Nginxの再起動

```
# EC2のアプリケーション上で実行
$ sudo systemctl restart nginx
```

#### Cloud9から秘密鍵をEC2サーバーに送る

```
#Cloud9のアプリケーション上で実行
$ scp -i ~/.ssh/キー名.pem ~/.ssh/id_rsa ec2-user@IPアドレス:.ssh/id_rsa
```
Crystal で AtCoder (Log #5)

# Easy_6

https://atcoder.jp/contests/panasonic2020/tasks/panasonic2020_b

```crystal:WA.cr
def div_ceil(x, y)
  (x+y-1)//y
end

h, w = read_line.split.map(&.to_i)
puts div_ceil(x*y, 2)
```

間違いが２つある。
間違い1つめはsampleで発覚する。sample_3でCEになる。

```
Unhandled exception: Arithmetic overflow (OverflowError)
```

オーバーフローを指摘してくれるのはありがたい。

## 64ビット整数

Crystalの整数型はデフォルトでは符号付き32ビット(`Int32`)。
今回の制約だと最大で$10^{18}$くらいになるのでオーバーフローした。
64ビット整数`Int64`を利用する必要がある。標準入力から受け取った文字列を数値に変換するのに`to_i`でなく`to_i64`を使用すればよい。

## コーナーケース、３項演算子

間違い２つめはコーナーケース。

$H=1$または$W=1$のときの場合分けが必要。
`if`文で十分だが、３項演算子を使用してみる。
`cond ? A : B`で、`cond`を評価して真なら`A`、偽なら`B`が値となる。
真か偽かを示すのには`bool`型である必要はない。
`false`、`nil`、ヌルポインタの時が偽で、それ以外が真。

## AC例

```crystal:panasonic2020_b.cr
def div_ceil(x, y)
  (x+y-1)//y
end

h, w = read_line.split.map(&.to_i64)
puts h == 1 || w == 1 ? 1 : div_ceil(h*w, 2)
```

# Easy_7

https://atcoder.jp/contests/abc157/tasks/abc157_b

ビンゴカードと出た数が与えられるので、ビンゴかどうかを答える。
「やるだけ」ではあるが、ビンゴが８通りあるので面倒。冗長にコーディングすれば何にしても出来るが、ミスのもと。

## 配列の構成

ビンゴカードの数字が3x3で与えられているが、面倒なので長さ9の配列として読みこむ。
`Array + Array`で2つの配列を結合することが出来る。便利そうだが、$O(1)$ではないだろう。

なお、`Array << elem`で、配列の最後に1つ要素を追加できる。これは多分$O(1)$だが、非常に長い配列を構成するときはリアロケーションで時間をロスするので、capacityを指定してコンストラクトするのが良いだろう。

```crystal
a = Array(Int32).new # 要素が全てInt32の新規行列を長さ0で作成
a = [] of Int32 # 上と同じ意味
a = Array(Int32).new(initial_capacity: 100000) # 今は長さ0だが100000までは対応できるようにメモリを確保
a = Array.new(size: 5, value: 10) # => [10, 10, 10, 10, 10]
b = [1, 2, 3]; c = [4, 5, 6]
puts b+c # => [1, 2, 3, 4, 5, 6]
```

ビンゴカードに書かれている数字を長さ9の配列に格納したあと、ビンゴとなる数字の組み合わせを1つ1つ試す。必要な3つの数が全部あらわれている組み合わせが1つでもあればビンゴ、そうでなければビンゴでない。

タプル`{a, b, c}`をブロックで受け取るときは、`|x, y, z|`の形で受け取れる。
`A && B && C`はABC全て真の時に真、そうでなければ偽だが、Aが偽ならBCは評価しない。Aが真でもBが偽ならCは評価しない。論理式の評価法としては100%正しいが、副作用を伴う式を置く時は留意が必要。
`x ||= y`はxが偽(`false`, `nil`, ヌルポインタ)の時にはyを評価して返す。そうでなければxは真なのでxを返し、yは評価しない。

```crystal:abc157_b
a = [] of Int32
3.times {a += read_line.split.map(&.to_i)}
n = read_line.to_i
b = Array.new(101, false)
n.times {b[read_line.to_i] = true}

bingo = [{0, 1, 2}, {3, 4, 5}, {6, 7, 8},
         {0, 3, 6}, {1, 4, 7}, {2, 5, 8},
         {0, 4, 8}, {2, 4, 6}]

flag = false
bingo.each do |x, y, z|
	flag ||= b[a[x]] && b[a[y]] && b[a[z]]
end

puts flag ? "Yes" : "No"
```
AtCoderログ：0056 - 問題セットのまとめ

AtCoder の鍛錬では、ウェブや本などでアルゴリズムを学ぶことも必要ですが、それ以上に問題を実際に解くことは重要です。あるテーマに沿って集められた問題の集まりを問題セットと呼ぶことにします。この記事では AtCoder に関する主な問題セットをまとめてみたいと思います。

# 学習用問題セットと演習用問題セット

問題セットを大別すると、学習用問題セットと演習用問題セットに分けられます。

学習用問題セットとは、その名の通りある領域を学習することを目的にしており、あらかじめどのようなアルゴリズムを身につけるべきかがわかっていることが多いです。学習者はあらかじめアルゴリズムを学習しておくことで、その分野を効率的に学習することが可能になります。

これに対して演習用問題セットとは、どのようなアルゴリズムを使えば良いかがわからない状態で問題に取り組むことで、実践的な解法を身につけることを目的としています。AtCoder の ABC や ARC の過去問は、まさに演習用の問題セットです。

# 学習用問題セット
それでは学習用問題セットの例を挙げていきます。

## [AtCoder に登録したら次にやること](https://qiita.com/drken/items/fd4e5e3630d0f5859067)
(おそらく)最も有名な問題セットです。まずはここに紹介されている10問を解くことで、AtCoderの雰囲気と、初級者に求められるスキルを学ぶことが出来ます。

## [AtCoder 版！蟻本 (初級編)](https://qiita.com/drken/items/e77685614f3c6bf86f44)
プログラムコンテストの教科書として有名な「[プログラミングコンテストチャレンジブック [第2版] (通称 蟻本)](https://book.mynavi.jp/ec/products/detail/id=22672)」がカバーしている内容を、AtCoder などの過去問によって習得するための問題セットです。蟻本ありきに記述もありますが、蟻本を持っていなくても学習可能な内容になっています。[初級編](https://qiita.com/drken/items/e77685614f3c6bf86f44)以外にも、[中級編](https://qiita.com/drken/items/2f56925972c1d34e05d8)、[上級編](https://qiita.com/drken/items/9b311d553aa434bb26e4)、[発展的トピック編](https://qiita.com/drken/items/0de3d205690d92307b7c)が用意されています。

## [Educational DP Contest](https://atcoder.jp/contests/dp)
DP (動的計画法) の習得を目的としたコンテストの過去問です。DP を用いて解く問題が26問用意されています。

## [レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【初級編：競プロを始めよう】](https://qiita.com/e869120/items/f1c6f98364d1443148b3)
単なる問題セットだけではなく、AtCoderとは何かから始まり、どうやって参加するか、どうやって学習するか、などが総合的に紹介されています。2021年に公開されたため、AtCoderの最近の出題傾向に沿っているように思います。[初級編](https://qiita.com/e869120/items/f1c6f98364d1443148b3)では茶色コーダー、[中級編](https://qiita.com/e869120/items/eb50fdaece12be418faa)では水色コーダー、[上級編](https://qiita.com/e869120/items/acba3dd8649d913102b5)では橙色コーダーになることを目標としています。

# 演習用問題セット
## [AtCoder Problems Boot-camp for Beginners](https://kenkoooo.com/atcoder/#/training/Boot%20camp%20for%20Beginners/1)
[AtCoder Problems](https://kenkoooo.com/atcoder/#/table/) は、AtCoder の過去問を学習するためのさまざまなデータを表示分析するサイトです。Beginners 向けの問題セットとして、[Boot-camp for Beginners](https://kenkoooo.com/atcoder/#/training/Boot%20camp%20for%20Beginners/1) が掲載されています。問題セットには Easy, Midium, Hard の3段階があり、各100問ずつが紹介されています。

なお、[AtCoder Problems](https://kenkoooo.com/atcoder/#/table/) では、有志が作った問題セットを解くことも可能です。

## [競プロ典型 90 問](https://atcoder.jp/contests/typical90)
AtCoderの典型問題を習得するための問題セットで、オリジナル問題が掲載されています。

#まとめ
AtCoder の鍛錬で有用な問題セットをまとめました。何かの参考になればうれしいです。