OmniAICreator/Qiita-1.07M huggingface dataset:
xamppが立ち上がらない・・

# XAMPPが立ち上がらない…どうしよう

## 概要
ということで
自分のPC内で開発をしようと思ったときに、Xamppが立ち上がらなくて非常に困ったことがありました。
ぐぐっても記事がなかったので備忘録として、まとめます。


### エラー内容
以下現象の画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45687/1a5efdc1-e4d0-7f35-119b-4361a47577bd.png)

え？なになに？
□□□□□□□□□□□□エラーメッセージ□□□□□□□□□□□□□□□□□□□□
Error: Apache shutdown unexpectedly.
This may be due to a blocked port, missing dependencies, 
improper privileges, a crash, or a shutdown by another method.
Press the Logs button to view error logs and check
the Windows Event Viewer for more clues
If you need more help, copy and post this
entire log window on the forums
□□□□□□□□□□□□エラーメッセージ□□□□□□□□□□□□□□□□□□□□

・・・？
日本語でおけ！

□□□□□□□□□□□□エラーメッセージ□□□□□□□□□□□□□□□□□□□□
エラー：Apacheが予期せずシャットダウンしました。
これは、ポートのブロック、依存関係の欠落、
不適切な特権、クラッシュ、または別の方法によるシャットダウン。
[ログ]ボタンを押してエラーログを表示し、確認します
より多くの手がかりのためのWindowsイベントビューア
さらにサポートが必要な場合は、これをコピーして投稿してください
フォーラムのログウィンドウ全体
□□□□□□□□□□□□エラーメッセージ□□□□□□□□□□□□□□□□□□□□

### ポートの確認
え？？ポートの問題！？

早速、コマンドプロンプトでコマンドをたたいてみるが
80番ポート使っているアプリケーションはいない
ちなみ調べるコマンドは

netstat

上記をたたいて調べてください。


うーん・・
どうしよう・・・


なになにWindowsイベントビューアを見ろと・・・

### Windowsイベントビューア
見てみました・・
関係ないエラーを見て、
心が折れそうになったが今はXamppちゃん救出しなきゃ！

ということで次はどうしようと持ったのですが…。

ログ的な物はないか？
と思ってたのですが
あ！

### Apacheのエラーログ確認

なんかのヒントがないかと思ってアパッチのエラーログを見てみました。
□□□□□□□□□□□□エラーメッセージ□□□□□□□□□□□□□□□□□□□□
[Tue Feb 11 13:24:30.934170 2020] [mpm_winnt:notice] [pid 3036:tid 228] AH00428: Parent: child process 4044 exited with status 3221225477 -- Restarting.
AH00526: Syntax error on line 244 of C:/xampp/apache/conf/httpd.conf:
DocumentRoot must be a directory
□□□□□□□□□□□□エラーメッセージ□□□□□□□□□□□□□□□□□□□□

・・・？
日本語でおけ！

□□□□□□□□□□□□エラーメッセージ□□□□□□□□□□□□□□□□□□□□
[2月11日火曜日13：24：30.934170 2020] [mpm_winnt：通知] [pid 3036：tid 228] AH00428：親：子プロセス4044がステータス3221225477-Restartingで終了しました。
AH00526：Cの244行目の構文エラー：/xampp/apache/conf/httpd.conf：
DocumentRootはディレクトリでなければなりません
□□□□□□□□□□□□エラーメッセージ□□□□□□□□□□□□□□□□□□□□


DocumentRoot系のエラー？
あれ触ってないけどなぁ・・

httpd.conf
の244行目でこけてるのかー
見てみよう・・・！

対象行の表示
DocumentRoot "C:/xampp/htdocs"

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45687/ce7493d4-38a0-bf47-c4b0-d83ca4a96544.png)

**あ゛あ゛あ゛あ゛あ゛！！！**
ボンミスです…。
htdocsのファイルを名前変更して
ドキュメントルートが無いからApache起動でけへんねん
というエラーでした・・・

htdocsを作成して
再度「Start」を押す！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45687/a9ce8f20-1e96-34c0-8666-1721358d846f.png)

無事起動しました～
AWS試験対策（①基礎知識）

#　はじめに
ここは、AWSの知識を自分なりにアウトプットする場です。
自分用メモなので人に見られるのは恥ずかしいですが、インプットばかりではいけないと思いたち、作成した次第。
主に試験対策であります。2月中にSAA取得が目標。先輩に負けん。
3月からは試験対策というよりは、Dockerとか触って、自分の備忘録として積み立てていく予定。
予定なのでまだ確定ではないですが。qiitaで色々見て、楽しそうとか流行ってるとかそういう技術を見つけたらそっちを触るかも。初心者おすすめなものを教えて下さい。
「ここ違うよ！」とか「ここはこう覚えると試験楽だよ！」とか「これはこれの構築を目標に一回手を動かして試してみたほうがいいよ！」とか、あれば教えてくれると励みになります。

また、qiita初心者のため、最初の方は見出しとか色々見にくいと思います。。。
次第に編集技術も見についていくと思うので暖かい目で見守ってください。（スマホから更新しにくい…）
そもそも誰も見てない説もありますが自分用メモなのでそれでも全然いいや。体裁汚くて載せれない〜〜ってうだうだやるより、汚くてもいいからとにかくアウトプットして覚えたほうがいいという考え。

ほぼ参考書書き写しかもしれないけど自分なりの言葉で説明できるところ、できないところが分かって自分の理解度が把握に繋がると思いやってます。すでにもっと読みやすい記事があるからと言ってやめてたらいつまでもアウトプットできないことに気づいた。

本題に入ります。
①なのでまずは基礎の基礎から。

##　アベイラビリティゾーン
AZと略される。（かっこいい）データセンターそのものや、近隣DCの集まり。
特徴:他のAZに火災や地震など、物理的な障害が発生しても、影響ない場所に各AZが存在してる。

##　リージョン
アベイラビリティゾーンを地域ごとにまとめたもの。国内では東京リージョンがある。大阪もあるけど成約ありなのでメインは東京。

##　エッジロケーション
コンテンツキャッシュとかDNSサービスとかセキュリティの機能を提供するDC？
100箇所以上あるらしい
イメージとしては、AmazonがDCにDNSサーバたてて、それをサービスとして貸し出してるみたいな感じ（憶測で言ってるので違ったらアレ）

可用性を英語でアベイラビリティっていうらしい
直訳で可用性ゾーンってその名の通り、可用性欲しかったら2つのAZにまたがって冗長化するべき
これがマルチAZ配置
AZ1とAZ2にそれぞれインスタンスたてて、Amazonのロードバランサーで負荷分散させたらそれたけで可用性高め。なんと簡単な。


##　AWSマネジメントコンソール
AWSにログインして、実際にいじるところ
インスタンス立てたければEC2クリックして新しいインスタンス選んでOS選べば建てれる。構築したことない初心者にもやさしいね！

これのコマンドライン版もある。AWS CLI（そのままやん）
やることは一緒だからCUIがいいかGUIがいいかくらいの違いしかないと思う。なれてる方でいいんじゃね（適当）

##　AWS SDK
ソフトウェア開発キット。プログラミングするときに使うらしいけど使ったことないしよくわかんない、確認してみねば

##　AWSサポート
4つのプランがある。
ベーシック、開発者、ビジネス、エンタープライズ。後のほうが高いけどサポート充実してる。

ベーシックは無料なのでできることは限られてる。しかし、ベーシックでも掲示板、請求の相談、製品FAQ、サービスダッシュボード（？）、AWSサービスの上限緩和申請ができる
この上限緩和、めちゃくちゃ大事。
VPCの数とか、IAMユーザーの数とか、制限があるらしいんだけど、それを超えることができる。

開発者から上は技術の問い合わせができる。
開発者はメールで営業日のみ対応だが、ビジネスとエンプラは24365対応してくれるらしい。しかも電話やチャットもある。格差社会。
返信スピードも違うらしい。開発者は最短12時間。ビジネスなら1時間。エンプラは15分。格差社会。

ビジネスより上はtrusted advisorってのが使える。
要するに、今の環境を分析して、もっとこうしたほうがいいよ！って言ってくれる。アドバイザー。
ベストプラクティスは5つあって、コスト最適化、パフォーマンス、セキュリティ、耐障害性、サービスの制限に分かれてる。

エンプラのみ、TAMってのがつく。運用のサポートをしてくれる、いわばコンシェルジュ的な？
他のプランより月額が高いので大企業メインらしい。


##　well-architected framework
W-Aって言うらしい。要するに今設計してるシステムや、これから設計するシステムがイケてるかイケてないか、5つの柱から考えてくれるらしい。
trusted advisorに似てね？？あっちはリアルタイムだし観点がちがうってこと？
こっちは運用上の優秀性、セキュリティ、信頼性、パフォーマンス効率、コスト最適化…ってほぼ同じやんけ！
違う点あったら教えて下さい…まあどっちも試験の重要度は低そうだし関係ないな！（フラグ）

第一章はここまで！
CI/CD on AWS ハンズオン勉強会に参加してきた

MarkingCloudさん主催の勉強会 [明日から職場で業務改善！CI/CD on AWS ハンズオン](https://markingcloud.connpass.com/event/162795/) の参加レポートです。

１時間のハンズオンでCI/CDってすごい！ 便利！ と実感できる内容でした:smile:

# 勉強会の概要

全体の流れはこんな感じです。

- コミュニティの説明
- 参加者同士の自己紹介
- ハンズオン（１時間）
- 懇親会

## MarkingCloudとは？

[MarkingCloud - connpass](https://markingcloud.connpass.com/)

クラウド関連の勉強会を開催されている団体です。
初心者向けのハンズオンを色々なテーマで企画してくださっています。

## どんな人が参加しているの？

筆者が交流させていただいた範囲だけでも、

- 初心者から仕事でAWSの他のサービスを使っている人、独学で勉強中の人まで
- Web系エンジニアからクラウドNGなお堅い業界の方まで

いろいろな方が参加されていました。
普段の業務とは違う分野の方のお話を聞けるのも面白いです。

## 勉強会のゴール

AWSでCI/CDを実現することじゃないの？　と思いますが、さらに一歩踏み込んで

主催者様「**明日、職場で上司にCI/CDの必要性を訴えましょう！！**」

とのことでした。
実際に上司を説得した方はいたのでしょうか？ :eyes:

# ハンズオン

ブログ用にメモをとりたかったのですが、ついていくのに必死で無理でした…

[当日の資料](https://docs.google.com/presentation/d/1ACKG5i1r73LS8qaeqwz4_LrXRhfW4uIVwQleFMpdnVM/edit?usp=sharing) を眺めつつ、復習がてら書いていきます。

## 作るシステムの概要


<img width="467" alt="AWS 2020-02-11 144027.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233131/f96c6ca6-c3df-c7be-46ab-9ff4cd510f7f.png">

[当日の資料](https://docs.google.com/presentation/d/1ACKG5i1r73LS8qaeqwz4_LrXRhfW4uIVwQleFMpdnVM/edit?usp=sharing) から画像を拝借しました。

CodeCommitにソースコードをコミットすると、CodeBuildで自動ビルドされ、Lamdaにデプロイされる…という仕組みを作ります。

## IAMユーザーを作成する

[IAM = AWS Identity and Access Management](https://aws.amazon.com/jp/iam/)

AWSの各サービスを使うために、ルートユーザーとしてサインインする以外にIAMユーザーとして認証する方法があるようです。
各IAMユーザーごとに、必要なサービスのみのアクセス権限を付与できるようです。

ここでは、後でCodeCommitにプッシュする用のユーザー＆認証情報を作成します。

## CI/CDの各パーツを作成する

時間の関係上、ここではAWSのCloudFormationを使って自動で作成してしまいます。
主催者様側で用意してくださっているテンプレートファイルを使います。

何が起きているのか分からないうちに、あっという間にできてしまいます。

## コードをコミット～自動ビルド・自動デプロイ

上記で作成済みのCodeCommitのリポジトリをクローンしてきて、用意してくださっているコードをコミット＆プッシュします。
最初に作成したIAMユーザーの認証情報を使います。
（クローンで詰まる人が多発していました…。一度パスワードを間違えると、間違った認証情報が記憶されてしまってうまくいかないようです。）

無事プッシュできると、自動でビルド＆デプロイされていきます…！　これは便利！
しかし時間は割とかかります。

## 出来上がったLambdaの関数を実行してみる

コードをコミットしただけでよく分からないけど関数が出来上がっていました！

コードを適当に変更して再度コミットしてみると、勝手に反映されてくれます。
（ここでも時間はかかりますが…）

ある程度遊んだら、今作ったものたちは削除しておきます。
せっかく作ったばかりなのに勿体ないですが、余計な料金が発生してしまうので…。

# 感想
- EC2しか触ったことなかったけど、こんなこともできるんだ！
- ハンズオンはかなりさくさく進むので、初心者は要復習
- 懇親会で普段聞けない話を聞けるのが楽しい

これからも予定が合って枠が余っている時は参加していきたいです:smile:

次回イベントの予定も公開されていました↓
[新しい技術に触れてみる！Firebaseで「お問い合わせフォーム」作成ハンズオン](https://markingcloud.connpass.com/event/166256/)
WindowsからUbuntuにSSH接続してGUIを使う

# はじめに
Ubuntuの入ったPCにWindowsからSSH接続したとき、GUIも使えたら最高だなと思って調べたので、まとめておきます。
ただ、なぜか途中でウィンドウが固まったりとやや不安定です。

# 手順
#### VcXsrvをインストール
https://sourceforge.net/projects/vcxsrv/ からインストール

#### Tera Termをインストール
https://ja.osdn.net/projects/ttssh2/ からインストール

#### Teta Termの設定
1. Tera Termを起動
2. `Setup` > `SSH Forwarding` > `Display remote X applications on local X server` にチェックを入れる
3. `Setup` > `Save setup` からTeraterm.iniに現在の設定を上書き保存する

#### いざ接続
1. VcXsrvを起動させる
2. Tera Termを再起動
3. Tera Termを起動させ　`ファイル` > `新しい接続` のホストに、接続先PCのIPアドレスを入力
4. 接続先PCにSSHログイン

#### テスト
`nautilus`などのGUIアプリケーションが動けばOK！

参考サイト：https://kamino.hatenablog.com/entry/docker_gui
reqwestで取得するデータのエンコードを指定する

[reqwest](https://github.com/seanmonstar/reqwest)で適当なURLからページのコンテンツを取得する場合、以下のようなコードを実装するかと思います。

```rs
use reqwest;

#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
    let body = reqwest::get("https://example.com")
        .await?
        .text()
        .await?;
    println!("{}", body);

    return Ok(());
}
```

このコードの中で取得したコンテンツを文字列に変換する処理は `text()` 関数によって行われています。
これはHTTPレスポンスヘッダーのContent-Typeにcharsetの指定がある場合はそのcharsetでデコードし、そうでなければUTF-８でデコードを行います。

世の多くのWEBコンテンツはUTF-8でエンコーディングされていますので多くのケースで問題にはならないのですが、
例えばContent-Typeにcharsetの指定がなく、コンテンツがUTF-8以外の文字エンコードを利用している場合、取得したコンテンツは文字化けするという問題が発生します。

`text()` の実装を覗いてみると以下のようになっていることが確認出来ます。

```rs
pub async fn text(self) -> crate::Result<String> {
    self.text_with_charset("utf-8").await
}
```

どうやら `text_with_charset()` 関数に変換する文字コードを渡すことで任意の文字エンコードにすることができるようです。
つまり、UTF-8以外のページを取得する場合は、 `text()` 関数ではなく、 `text_with_charset()` 関数を利用して適当な文字コードを指定すれば良さそうです。

```rs
let body = reqwest::get("https://example.com")
    .await?
    .text_with_charset("euc-jp") // EUC-JPの場合
    .await?;
println!("{}", body);
```

ちなみに、 `text_with_charset()` の実装内で先に書いた「HTTPレスポンスヘッダーにcharsetの指定がある場合はそのcharsetでデコードし、そうでなければUTF-８でデコードを行う」という実装がされています。
なお、文字のデコードには [encoding_rs](https://github.com/hsivonen/encoding_rs) を利用して行われています。
MySQL Access denied for user 'root'@'localhost' の対応

### MySQLでエラーが出てハマったのでその対応。

まずは権限なしで立ち上げられるように設定

```
$ mysqld_safe --skip-grant-tables &
[1] 11541
2020-02-11T04:59:48.6NZ mysqld_safe Logging to '/usr/local/var/mysql/***
2020-02-11T04:59:48.6NZ mysqld_safe Starting mysqld daemon with databases from /usr/local/var/mysql
```

MySQLにログイン

```
$ mysql -u root
```

`root@localhost` のユーザーを一旦削除してから作り直し、全ての権限を与える。

```
mysql> DROP USER root@localhost;
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE USER 'root'@'localhost' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost';
Query OK, 0 rows affected (0.00 sec)
```

その後、下記コマンドを打つとパスワードを求められるので、パスワードを入れてログインできればOK！

```
$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
```
GitHubのWikiをよしなに移行したい話

## はじめに
githubで管理されているコードやナレッジを引継き，新しいリポジトリを作ろうとした際にWikiの移行のつまづいたので備忘録です

## GitHubのWikiの移行
基本的に新しくWikiを作りWikiのみのリポジトリを```git clone```します．
```https```のバージョンはあったのですが```ssh```のバージョンがなかったので載せときます．
#### ```ssh```におけるWikiの```git clone```

```bash
git clone git@github.com:[User or Organizations Name]/[Repository Name].wiki.git
```

#### 例示

```bash
git clone git@github.com:EniwaSentaiToshiking/2020-base.wiki.git
```

``` clone ```ができてからは基本的に``` git ```の使い方と変わらないので割愛します．
よしなに``` add，commit，push ```してください

### さいごに
Wikiをそもそも```ssh```で``` clone ```できること知らなかった・・・
あと中身は全部MarkDown形式なので他のツールとの相性も良さそうですね！
これで変にWikiの移行で```https```だから```UserName```と```Password```を聞かれてえ！？って迷うことはなくなるでしょう(2敗)

この頃よしなにを多用する癖がついてきた・・・
apt-get updateで「ターゲット〜は〜で複数回設定されています」と表示されるときの対処方法

# 環境
OS：Ubuntu 18.04 LTS

# 手順
下記コマンドで開いたファイルの中身を`#`でコメントアウト

```
sudo gedit /etc/apt/sources.list.d/google.list
```
【Swift】SequenceとIteratorProtocolでfor-inですべてのデータを取り出すサンプル

SequenceとIteratorProtocolを使ってfor-inですべてのデータを取り出す書き方のサンプルです。

```swift:SequenceとIteratorProtocolのサンプル
class T {
    var n = 1;
    init(_ n: Int) {
        self.n = n
    }
}

class C: Sequence, IteratorProtocol {
    typealias Element = T
    var ta = [T](repeating: T(1), count: 100)
    var i = 0
    
    func next() -> T? {
        guard i < ta.count else {
            i = 0
            return nil
        }
        let r = ta[i]
        i += 1
        return r
    }
}

var c = C()
for e in c {
    print(e.n)
}
```
Ubuntu 18.04でDockが表示されないときの対処方法

# はじめに
Ubuntu 18.04を使っていて、起動時にDock（画面左のバー、アプリケーションアイコンが並んでいるところ）が表示されないということが多々起きます。

なかなか治らなくて苦労していたのですが、やっと見つけた対処方法が拍子抜けするほど簡単だったので、記事にしておきます。

# 方法1
`alt`+`F2`を押す

![Screenshot from 2020-02-11 14-34-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477282/d6177819-bf57-1895-8b7e-fa775d43026e.png)

出てきた画面に`r`と入力して`Enter`


# 方法2
gnome-tweak-toolをインストール

```
sudo apt install -y gnome-tweak-tool
```

拡張機能 > Ubuntu dockをオンに変更
月の日数の求め方

# 月の日数の求め方
#### むかし書き溜めたVBAのTips

https://gist.github.com/wheeliechamp/123af4b6ae061b128ae2849330871279

月の日数を調べるには、翌月の初日の前日が調べたい月の最終日となることを利用して調べる（C6の日付の月の日数を表示する）。

Private Sub CommandButton1_Click()
　MsgBox Day(DateSerial(Year(Range("C6")), Month(Range("C6")) + 1, 0))
End Sub
GASのV8ではFusionTablesの依存設定消しとこう

##何が起きたか
意気揚々とGASのエンジンを意気揚々とRhinoからV8に変えてみたところ、トリガー設定してる定期ロジックが軒並みコケてやんの！

##エラー内容
「サービス（fusiontables v2）が見つかりません」

該当ロジックはスプレッドシートとかGoogleカレンダーから情報引いてくるだけなので、FusionTablesなんて使ってないハズなんだが・・・？
とか思ってると、過去にFusionTablesを導入してたプロジェクトであることを思い出す。

FusionTables自体はとうの昔に廃止されてたけど、コードはそのまま残ってた。

##対処
appsscript.jsonにFusionTablesの依存設定(dependencies)が入ってるのでそれを消す。

```json:これを
{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
    "enabledAdvancedServices": [{
      "userSymbol": "Gmail",
      "serviceId": "gmail",
      "version": "v1"
    }, {
      "userSymbol": "FusionTables",
      "serviceId": "fusiontables",
      "version": "v2"
    }],
    "libraries": [{
      "userSymbol": "createHTMLDraftInGmail",
      "libraryId": "1Q2wtH6ZHe-1RSMyExp9zKdzFrwPNPxyXIKMwsfFFZqMdkc0uUNTIvbRv",
      "version": "1"
    }]
  },
  "webapp": {
    "access": "ANYONE_ANONYMOUS",
    "executeAs": "USER_DEPLOYING"
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}
```


```json:こうじゃ
{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
    "enabledAdvancedServices": [{
      "userSymbol": "Gmail",
      "serviceId": "gmail",
      "version": "v1"
    }],
    "libraries": [{
      "userSymbol": "createHTMLDraftInGmail",
      "libraryId": "1Q2wtH6ZHe-1RSMyExp9zKdzFrwPNPxyXIKMwsfFFZqMdkc0uUNTIvbRv",
      "version": "1"
    }]
  },
  "webapp": {
    "access": "ANYONE_ANONYMOUS",
    "executeAs": "USER_DEPLOYING"
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}
```

なお、Rhinoのままだと定義が残ってても大丈夫な模様。

もしかしたら他にもいらん定義残ってるかもナァ
SSH接続でGUIを使いたい

# SSH接続される側（ホスト側）の設定
これはGUIに対応させるのとは関係なく、SSH接続するために必要な設定です。
すでにSSH接続している方は不要です。

#### 必要なパッケージのインストール
```
sudo apt-get install aptitude && \
sudo aptitude install ssh
```

#### 設定ファイルを開く
```
sudo gedit /etc/ssh/sshd_config
```
#### 設定の変更
`*#PermitRootLogin prohibit-password*`の上に`PermitRootLogin no`を追加

#### 再起動
設定を反映するために（たぶん）必要

# SSH接続時のコマンド
`-Y`オプションと`-C`オプションを追加するだけです。

```
ssh -YC [ユーザー名]@[コンピューター名 or IPアドレス]
```

#### -Yの意味
X11 Forwarding（X11転送）させる

#### -Cの意味
データを圧縮して転送させる

# X11 Forwardingのトラブルシューティング
```
X11 connection rejected because of wrong authentication.
Unable to init server: Could not connect: Connection refused
```
上記エラーが出たときは、ホスト側で

```
sudo rm -r /home/[USERNAME]/.Xauthority
```
を行い、再起動

※USERNAMEはご自身のユーザー名に置き換えてください
AtCoder Beginner Contest 154 に参加してみた

## はじめに
僕はpython初学者です。同じ初学者に馴染みやすい？？簡単なコードを提供するとともにもっとこうした方がいいなど改善点があったら教えてほしいです。


### ABC154A Remaining Balls


```python

s, t = input().split()
a, b = map(int, input().split())
u = input()
if u == s:
    a -= 1
elif u == t:
    b -= 1
print("{} {}".format(a, b))

```

### ABC154B I miss you...

listから.joinしなくても　”x”*a だけでいけるのか...

```python

s = input()
a = len(s)

l = ["x"] * a
print("".join(l))

```

### ABC154C Distinct or Not

この問題はset()使って一発だった...

```python

n = int(input())
a = set(map(int, input().split()))
l = len(a)
if l == n:
    print("YES")
else:
    print("NO")

```

### ABC154D Dice in Line

期待値の計算が （1＋pi)/2 で求められることに気づかず、いちいち1からpiまでの合計を出してしまった

```python

n, k = map(int, input().split())
p = list(map(int, input().split()))

sum1 = []
kitai_list = []
ans = 0
base = 0
a = 0

for i in range(max(p) + 1):
    a += i + 1
    sum1.append(a)

for i in range(k):
    kitai = sum1[p[i] - 1] / (p[i])
    kitai_list.append(kitai)
    base += kitai

ans = base

for i in range(1, n):
    if i + k - 1 >= n:
        break
    else:
        kitai = sum1[p[i + k - 1] - 1] / (p[i + k - 1])
        kitai_list.append(kitai)
        base = base - kitai_list[i - 1] + kitai
        if ans < base:
            ans = base

print(ans)

```

### ABC154E Almost Everywhere Zero
これは諦め〜　どなたか解法を教えてください（ ;  ; ）


### ABC154F Many Many Paths

わかってたけどTLE.あと、なぜかREもでてた。なぜだろう？
AC出てた人はmodを使ってたけどよくわかりませんでした...
教えてください！！

```python

r1, c1, r2, c2 = map(int, input().split())
r1 += 1
c1 += 1
r2 += 1
c2 += 1
m = [[1] * r2]
l=[1]
l1=[0]*(r2-1)
l.append(l1)
l = [[0] * r2 for _ in range(c2 - 1)]
m.extend(l)
for i in range(c2):
    m[i][0] = 1
ans = 0
for i in range(1, c2):
    for j in range(1, r2):
        m[i][j] = m[i][j - 1] + m[i - 1][j]
        if r1 - 1 <= j <= r2 - 1 and c1 - 1 <= i <= c2 - 1:
            ans += m[i][j]
print(ans % (10 ** 9 + 7))

```
Ubuntu 18.04のおすすめ設定

# はじめに
Ubuntu 16.04から18.04に乗り換えて、いくつか不便に感じた点を改善する方法を紹介します

# 設定手順
## Ubuntu 17以前のフォントに戻す
個人的にUbuntu 18のフォントは見づらく、VS Codeでプログラムを書いたりするときに見づらかったので、Ubuntu 17以前のフォントに戻しました。

```
sudo apt install 'fonts-takao-*'
```
参考サイト：https://linuxfan.info/ubuntu-18-04-change-ja-font

## 閉じるボタンを左上に変更
Ubuntu 16.04との大きな違いの一つに、閉じるボタンの位置が右上にあることが挙げられます。
私は、Windowsと同じ右上のほうが便利だと感じたのでそのままにしましたが、不便な方は下記設定で左上に変更できます。

```
sudo apt install -y gnome-tweaks && \
gsettings set org.gnome.desktop.wm.preferences button-layout 'close,minimize,maximize:' 
```

元に戻す場合は下記コマンドを入力

```
gsettings reset org.gnome.desktop.wm.preferences button-layout 
```
参考サイト：https://sicklylife.hatenablog.com/entry/2018/11/13/183424

## 上のバーに日付を表示
デフォルトだと時刻しか表示されず、不便だったため

```
sudo apt install -y gnome-tweaks && \
gsettings set org.gnome.desktop.interface clock-show-date true
```
参考サイト：https://linuxfan.info/gnome-shell-clock-show-date
Google Edge TPUヘルスケア業界ソリューション

患者から医療提供者まで、ローカルAIは、より正確な診断を可能にし、事故を防ぎ、コンプライアンスを改善することにより、医療費の削減に役立ちます。 また、エッジデバイスは、医療インフラが限られているため、医療が不十分な人々にも医療を拡大できます。

####患者ケア

大規模な病院では、治療中の患者は常に医師や看護師よりも多く、1：1の監視は不可能です。

ML対応のカメラとセンサーを使用すると、転倒、動きの欠如、その他の種類の行動など、選択したイベントについて医療スタッフに警告することができます。

CoralはローカルAIを提供するため、機密データがデバイスから出ることはなく、重要なアラートのみが出て、患者のプライバシーを損なわずにケアを改善します。

####より正確な診断

医用画像は、診断する医師がいるよりもはるかに多くの画像を作成します。 今後数年間で、画像分類モデルは、医師ががんから脳卒中までのすべてをより迅速かつ正確に診断するのに役立ちます。

これらのモデルは、人間の目では識別できない色合いとパターンを検出する機能と、疾患の結果に関する歴史的知識を組み合わせています。 彼らは、医療専門家が見逃したかもしれない兆候をキャッチするのを助けることができます。

ローカルAIを備えたデバイスはフィルターとしても機能し、医師がスキャンとイメージングの重要な部分を深く掘り下げ、時間をより効率的に使用できるようにします。

####低コストの診断

失明は、世界中の5億人の糖尿病患者にとって非常に現実的な可能性です。今日、失明の原因となる糖尿病性網膜症のスクリーニングは専門医のみが行うことができます。

Coralは、眼球の内側の画像をキャプチャし、市販のハードウェアでローカルに推論を実行する診断デバイスの構築に使用できます。つまり、プライマリケアクリニックはこれらの重要なスクリーニングを実施し、それらを必要とする患者にとってよりアクセスしやすくすることができます。

####家庭内処方コンプライアンス

高齢者ケアの重要な要素の1つは、薬をスケジュールどおりに摂取することです。実際、見逃した薬の年間費用は、米国だけで最大3,000億ドルと見積もられています。

ポーズや視線の検出など、複数のAIモデルを実行することにより、mdash;薬の認識さえも-サンゴ対応の在宅デバイスは、薬を服用するように患者に思い出させるだけでなく、医師が設定したスケジュールで処方用量を調剤し、コンプライアンスを確保できます。

さらに、継続的な活動の監視により、病気の検出と予防が可能になり、その一方で人々がその場で加齢することができます。

Google Coral製品に興味がある場合は、Googleグローバルディストリビューター、[Gravitylink](https://store.gravitylink.com/global)へようこそ.
![alt](https://1.bp.blogspot.com/-YR5hB3S-gTk/XkIrTp3h2YI/AAAAAAAAAH8/9tyUuSKpAUcoq0Psp4jph_1tu8hPz12hgCLcBGAsYHQ/s640/%25E6%25AD%25A3%25E6%2596%25B9%25E5%25BD%25A2%25E6%25B5%25B7%25E6%258A%25A5.jpg)
ブログはじめました( *´艸｀)

初めまして！
組み込み系システム開発の検証を担当しているKEITA＠アンディです

半年前くらいから、エンジニア駆け出しからプロのエンジニアになるために
テストに関する事にノリと勢いで取り組んできました( *´艸｀)

学ぶだけでなく、学んだことを発信して自分のスキルとするために
ブログを勢いで始めました！

イベントレポートや自分自身の取り組みについてゆるく発信していきます！
良かったら覗いていってください！(*_*)
Ubuntuの便利な設定集

# はじめに
個人的に便利だと思っている設定をまとめました

# 環境
OS：Ubuntu 18.04 LTS

# 便利設定集
## ホームフォルダの英語化
日本語名だとターミナル上で移動しにくいので必須

```
LANG=C xdg-user-dirs-gtk-update
```
ただし、ファイルの入っているフォルダは残るため、手動でファイルをコピペする必要があります。

参考サイト：https://qiita.com/taiko19xx/items/d1a001bfc25245b91354

## apt-getサーバーを日本に変更
これをするだけで`apt-get update`や`apt-get upgrade`がかなり早くなります（日本在住の方限定）

```
sudo sed -i.bak -e "s%http://[^ ]\+%http://ftp.jaist.ac.jp/pub/Linux/ubuntu/%g" /etc/apt/sources.list
```
参考サイト：https://qiita.com/fkshom/items/53de3a9b9278cd524099


## UbuntuとWindowsで時計がずれないようにする
デュアルブート環境で、Ubuntuを起動したあとWindowsを起動させると、時計が真夜中になっていたりする問題の解決策です。

```
sudo timedatectl set-local-rtc true
```



## exFATに対応させる
exFAT形式でフォーマットされたUSBメモリなどを使用するための追加パッケージです。

```
sudo apt-get install -y exfat-fuse exfat-utils
```
参考サイト：https://qiita.com/KHashimura/items/be39b76a86dbabfae96f


## 4Kディスプレイのスケーリング
Ubuntu18.04だとスケーリングを100%か200%にしかできなく、ちょうどいい設定ができないが、この方法なら150%とかに設定可能。

```
gsettings set org.gnome.desktop.interface text-scaling-factor 1.5
```
参考サイト：http://uozias.hatenablog.com/entry/2018/06/12/Ubuntu_18.04_ディスプレイスケーリング



## 仮想デスクトップをWindowsキー＋矢印キーに変更
シングルディスプレイで仮想デスクトップを切り替えたいときに便利な設定。
1. アプリケーション一覧で`キーボード`と検索
2. キーボードの設定パネルに入る
3. `Move to workspace above`を`Winodws`+`↑`に変更
4. `Move to workspace below`を`Winodws`+`↓`に変更


参考：https://sicklylife.jp/ubuntu/1804/help/keyboard-shortcuts-set.html
[GAE][Rails]Mysql2::Error::ConnectionError

# 事象

```
---------- CONNECT CLOUDSQL ----------
cloud_sql_proxy is running.

---------- EXECUTE COMMAND ----------
bundle exec rake db:migrate RAILS_ENV=production
rake aborted!
Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/Users/cloudsql/[INSTANCE_NAME]' (2)
/app/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `connect'
```

なおMac Catalinaではルートディレクトリにフォルダを生成することはできないため`/Users/cloudsql`でソケットを作成しました。

# 確認したこと

## コンソールから確認

```
mysql -u ailab-development -p -S /Users/cloudsql/protean-brook-259301:asia-northeast1:ailab-development
```

接続できました

## エラー内容の確認
[こちらの記事](https://saton2.hatenablog.com/entry/2018/10/16/200616)によりますと

```
Can't connect to local MySQL server through socket '/Users/cloudsql/[INSTANCE_NAME]' (2) ←
```

の(2)が

```
OS error code   2:  No such file or directory
```

とのことです

# やったこと

やっぱり`/Users/cloudsql`でdatabase.ymlを作成したのが失敗でした。

```
# [START mysql_settings]
mysql_settings: &mysql_settings
  adapter: mysql2
  encoding: utf8
  pool: 5
  timeout: 5000
  username: "[USERNAME]"
  password: "[PASSWORD]"
  database: "[DATABASE]"
  socket: "/cloudsql/[SOCKET名]"　#/Users/cloudsql/[SOCKET名]から変更
# [END mysql_settings]

production:
  <<: *mysql_settings
```


# 備考
 - ()の中身まで調べましょう
 - catalinaで`/cloudsql`が作れないからローカルで動作確認ができない...?
Cloud Functions for Firebase の関数をスケジューラから定期的に呼び出す簡単な方法

## イントロ

Cloud Functions をスケジューラから呼び出す方法について。

以前 [Cloud Functions for Firebase の関数をスケジューラから定期的に呼び出す](https://qiita.com/masatomix/items/b40a2c604319e52df4bf) という記事で、Cloud Functions for Firebaseを定期的に呼び出すのに、

- ``functions.pubsub.topic('testTopic').onPublish(message => {..処理..})`` という関数をつくって
- gcloud のコマンドで、testTopicにPublishする処理をスケジュール登録

する方法を書きましたが、そのつづき。


## もっと簡単に設定出来るようになってた(初めからあった？？)

最近みたら、[関数のスケジュール設定](https://firebase.google.com/docs/functions/schedule-functions?hl=ja) にもっとシンプルな方法が。

まず以下は前回のやりかたです。

```typescript:前回
function want_to_execute() {
  console.log('実行したいロジック!')
}

export const helloPubSub = functions.pubsub
.topic('testTopic').onPublish(message => {
  want_to_execute()
})
```

として、具体的なスケジュールは別途で登録していました。


コレを

```typescript:今回
function want_to_execute() {
  console.log('実行したいロジック!')
}

export const helloPubSub = functions.pubsub
  .schedule('0 */1 * * *')
  .timeZone('Asia/Tokyo')
  .onRun(async context => {
    want_to_execute()
  })
```

というように、スケジュール指定とタイムゾーンを直接記述できるようです。簡単ですね。。
ちなみにココでOwn Codingしちゃっても、のちほど画面上で変更可能です。

さてデプロイして確認してみましょう。

```console
$ npm run deploy
```

画面で確認してみると ``firebase-schedule-checkLicensePubSub-us-central1`` というTopic待ちの関数がたしかに登録されています。

![00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/618c0b1e-bfab-94cc-47c2-d427f25fa51f.png)

スケジューラは、そのTopicにPublishするようにスケジュール設定されていますね。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/688e7d80-716b-bf56-fe4c-f4f6af00d019.png)


一応Topicをみてみると
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/d565db39-aaae-0a7a-3ac4-3a57cb417c31.png)

このようにウラではTopicが自動作成されていました。ようするに既存の方式と同じ方式です。
つまりスケジュール情報をコード上に書く方法は、既存の書き方の syntactic sugar ってことがわかりました。。

おつかれさまでしたー。

### 参考 ちなみにコード上で関数のregionとかも指定出来た

備忘です。

```typescript
export const helloPubSub = functions.pubsub.region('asia-northeast1')  ←ココ
  .schedule('0 */1 * * *')
  .timeZone('Asia/Tokyo')
  .onRun(async context => {
    want_to_execute()
  })
```

こんな感じに関数の稼働するregion指定なども可能でした。



## 関連リンク

- [Cloud Functions for Firebase の関数をスケジューラから定期的に呼び出す](https://qiita.com/masatomix/items/b40a2c604319e52df4bf)
- [関数のスケジュール設定](https://firebase.google.com/docs/functions/schedule-functions?hl=ja)
デュアルブートの優先順位・grub2の待機時間変更

# 環境
WindowsとUbuntuのデュアルブート

# 設定手順
## デュアルブートの優先順位変更
#### Windowsの起動ディスク名を確認
```
gedit /boot/grub/grub.cfg
```
`windows`で検索し、起動ディスク名をコピー(`Windows 10 (loader) (on /dev/sda1)`的なやつ)

#### grub2の設定ファイルを開く
```
sudo gedit /etc/default/grub
```

#### 設定ファイルを変更
`GRUB_DEFAUL=0`を`GRUB_DEFAULT=[上でコピーした起動ディスク名]`に変更

#### 変更を反映する
```
sudo update-grub
```

## gurb2の待機時間変更

#### grub2の設定ファイルを開く
```
sudo gedit /etc/default/grub
```

#### 設定ファイルを変更
`GRUB_DEFAUL=0`を`GRUB_DEFAULT=’Windows 10 (loader) (on /dev/sda1)’`に変更

#### 変更を反映する
```
sudo update-grub
```
Cloud Dataflow SQL眺めてみた

* 使ってみた・ドキュメント眺めただけです
* Cloud Dataflow SQLはアルファです（2020/02時点）

# Cloud Dataflow SQLとは
* BigQueryのUIから、Cloud Dataflowジョブを作成する機能です
* SQLを書くだけで、Pub/Sub・BigQuery・Cloud Storageのデータを組み合わせて、BigQueryのテーブルに書き出せます（※）
* 内部的には[Beam SQL](https://beam.apache.org/documentation/dsls/sql/overview/)で処理しているらしいです
 
※ チュートリアルはPub/SubとBigQueryのJOINですが、[リファレンス](https://cloud.google.com/dataflow/docs/reference/sql/streaming-extensions?hl=en#window_requirements_when_joining_two_unbounded_sources
)ではPub/Subのメッセージ同士のJOINをしています

# 使ってみる
[チュートリアル](https://cloud.google.com/dataflow/docs/guides/sql/dataflow-sql-ui-walkthrough?hl=ja)では、以下の作業を行います：

1. BigQueryのテーブル作成・データ登録（通常のBigQueryで使う時と同じです）
2. [Data Catalog](https://cloud.google.com/data-catalog/?hl=ja)に、Pub/Subメッセージの情報を登録
3. BigQuery UIから、Pub/SubトピックをDataflowソースとして登録
4. BigQuery UIから、SQLを実行
5. Pub/Subメッセージをpublish

Dataflowジョブの開始時にサブスクリプションが作られ、そこからメッセージがpullされます。ジョブ実行前にpublishされたメッセージは無視されるので、気をつけませう。


# 制限
現時点で、結構[制限](https://cloud.google.com/dataflow/docs/guides/sql/dataflow-sql-intro?hl=en)があります。

* [読み込みはPub/Sub・BigQuery・GCS、書き込みはBigQueryだけ](https://cloud.google.com/dataflow/docs/guides/sql/data-sources-destinations?hl=en)
    *  （日本語版ドキュメントだとGCSの記載はないですが、英語版だと可能とあります）
    * 普通のBeam/Dataflowは[より多くのサービス](https://beam.apache.org/documentation/io/built-in/)と接続（S3とかDatastoreとか）出来ます
* GCSファイルはヘッダーありのCSVのみ
* Pub/SubメッセージはJSON、かつスキーマが事前定義されている
* Dataflow workerのスケールのコントロールは出来ない
   * 上限設定出来ないのは怖いかも
* Dataflow jobをdrain出来ない
 * ただし、Dataflow画面からはdrain選べ、停止も出来ます‥保証してないという意味？

出来ないとは書いていないが、出来なさそうな点

* 書き出し先のデータセット・テーブル名は固定？
 * Beam/Dataflowでは、メッセージの中身に応じて書き込み先を変更することが出来ます（[Dynamic Destination](https://beam.apache.org/releases/javadoc/2.15.0/org/apache/beam/sdk/io/gcp/bigquery/DynamicDestinations.html)という機能）


# SQL
[Dataflow SQL](https://cloud.google.com/dataflow/docs/reference/sql?hl=ja)は、BigQueryと同じくZetaSQLをベースとしていますが、いくつか違いがあるようです。

* なんとなく高度そうな関数は、Dataflow SQLにはない
 * JSON_EXTRACTとかMD5とか
 * Dataflow SQLで使える関数はリファレンスに記載があります
  * [文字列系] (https://cloud.google.com/dataflow/docs/reference/sql/string_functions?hl=en)
  * [数学系（MOD,CEIL,CEILING,FLOORだけ）](https://cloud.google.com/dataflow/docs/reference/sql/mathematical_functions?hl=en)
  * [aggregate系(AVG,COUNT,MAX,MIN,SUN)](https://cloud.google.com/dataflow/docs/reference/sql/aggregate_functions?hl=en) 
* Dataflow SQLでは、[データソースの種類を明示する必要がある](https://cloud.google.com/dataflow/docs/guides/sql/data-sources-destinations?hl=ja)
 * 「bigquery.table.テーブル名」みたいな感じ
* Dataflow SQLでは、Streamingの[ウィンドウ設定がある](https://cloud.google.com/dataflow/docs/reference/sql/streaming-extensions?hl=ja)
 *  Pub/SubデータをGroup Byする時に必要？
 * 「Data that arrives later is dropped.」
【Rails】投稿とユーザーの紐付け（一対多）のメモ

#経緯
現在ポートフォリオ用に「book memory phrase」というアプリを作っています。
自分が印象に残ったフレーズを引用した書籍とともに紹介して本との出会いを作る場です。

そこでユーザーと投稿の紐付けを行って、誰がどの投稿をしたか一覧で見れるような機能を実装したのですが、has_manyやbelongs_toなど学ぶことが多かったのでアウトプットしとこうと思います。

#投稿したユーザーid
まずはデータベース上のidを紐付ける必要があります。

今回の場合だと、**UserテーブルのidをPostテーブルに突っ込んで、誰の投稿かわかるようにします。**

最初からこの機能は実装する気でいたので、Postテーブルを作る時点でidカラムとは別にuser_idカラムを作り、投稿する際にユーザーのidを突っ込めるようにしてました。

その辺については以前書いた[【Rails】railsブログサイトの練習で躓いたところメモ](https://qiita.com/soehina/items/ba5c4ca3c8291938669a)にも載せていますのでそちらを参考にしてもらえたらと思います。

#Modelの設定
idが突っ込めたら次は紐付けです。これはModelで設定します。

##has_many
has_manyは一対多の多の方です。
ユーザー１に対して投稿は多数あるので、ユーザーモデルにhas_manyを記述します。

```user.rb
has_many :posts, dependent: :destroy, foreign_key: :post_user_id
```
投稿は複数あるので複数系にしてください。

ちなみにdependent: :destroyはユーザーが削除されたら自動的に投稿も削除されるという優秀な機能です。

##belongs_to
次は一対多の一の方、ユーザーの紐付けです。

```post.rb
belongs_to:user

def user
   return User.find_by(id: self.user_id)
end
```
一の方はbelongs_toで紐付けられます。
また、userメソッドをモデルで定義しておけば汎用性が高くなるので書いときます。

#Controllerの設定
私はuser_showというページで該当ユーザーの投稿一覧を表示したかったので、コントローラーに以下のように記述しました。

```home_controller.rb
before_action :set_post, only[:user_show, :edit, :update, :destroy]

#省略

#@userにモデルで定義したuserメソッドを@post.userで代入
#@postsに@userの投稿を全て代入
def user_show
   @user = @post.user
   @posts = @user.posts
end

#省略

private
#Post.find_by(id: params[:id])はよく使うので定義しといてbefore_actionで反映。
def set_post
   @post = Post.find_by(id: params[:id])
end
```
これでコントローラーの準備は整いました。

#Viewの設定
コントローラーで作った@postsをeach文で回してあげれば一覧が確認できます。

```erb:user_show.html.erb
<% @posts.each do |post| %>
   <div class="book-img col-lg-4 col-md-6 col-sm-12 center-block mx-auto">
      <div class="box">
         <div class="image-box">
            <h5><%= post.phrase %></h5>
            <p class="name">
               <span>投稿者&ensp;&ensp;</span><%= link_to("#{post.post_user}", "/home/#{post.id}/user_show")%>
            </p>
            <img src='<%= post.book_image %>' class="img-fluid d-block">
         </div>
         <div>
            <p class="title">
               『<%= post.title %>』
            </p>
            <p class="author">
               著者　<%= post.author %>
            </p>
            <p>★ おすすめポイント</p>
            <p class="content">
               <%= post.content%>
               <% if user_signed_in? && current_user.id == post.user_id %>
                  <span class="edit-delete">
                  <%=link_to("編集" , "/home/#{post.id}/edit",class:"text-muted") %>
                  <%=link_to("削除" , "/home/#{post.id}/destroy",method: :post,class:"text-muted") %>
                  </span>
               <% end %>
            </p>
         </div>
      </div>
   </div>
<% end %>
```

#まとめ
投稿の紐付けは必須機能ですが、結構躓くところでもあると思います。

かく言う私も何度も躓いたのですがSQLを勉強したら結構スッと入ってこれました。
イメージって大事ですね。

もしこの記事が誰かの助けになれたら幸いです。
ではでは。
reCAPTCHAのサイトを毎日自動スクレイピングする (1/7: python環境構築)

RPAによる業務改善をするプロジェクトに参加していたのですが…
RPAツールが**あまりにも高額(720万円/年)**だったため、pythonで置き換えました。
そのときの仕事をまとめたものです。


# 要件

### 概要
- とあるサイトにログインし、`特定ワード`で検索した結果をダウンロードし、データを取得します。
- INPUTとなる`特定ワード`はAmazonS3に毎日置かれます。
- 取得したデータを整形し、S3上の別位置に置くことがOUTPUTとなります。
- なお、サイトの会社に連絡し、スクレイピングの許可はいただいています。

### 難点
- その特定サイトにはログイン時にreCAPTCHAが仕込まれています（！）
- その特定サイトではAnglarJSが使われています
- ダウンロードするときには、クリックをしなければなりません
- 毎日実行できるようにしなければなりません


### 技術選定
（かなり試行錯誤したのですが）結論だけ書くと、下記のようになりました。
なかなか大変だった…

- pythonのseleniumを使ってデータを取得
- 「2captcha」というサービスを使ってreCAPTCHAを突破
- Dockerコンテナ化。Xvfbを使って仮想ディスプレイを立ち上げ、アプリを実行
- AWS batchを使って毎日起動させる


# Story

下記のような流れで開発していきました。

1. python環境構築
2. サイトのスクレイピング機構を作る
3. ダウンロードしたファイル(xls)を加工し、最終成果物(csv)を作成するようにする
4. S3からのファイルダウンロード / S3へのファイルアップロードをつくる
5. 2captchaを実装
6. Dockerコンテナで起動できるようにする
7. AWS batchに登録

それぞれのページでQiitaは分けようかと思います。

# 1.環境構築

まずは通常のpython環境の構築です！

今回は `python3.6.3` を使います。ターミナルはデフォルトの `bash` です。
今後 複数のバージョンのpythonを使いたくなることを考え、`pyenv` と `pyenv-virtualenv` を使って専用のpython環境を作ろうと思います。

### pyenvのインストール

```bash
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
```

続いて、python3.6をインストール

```bash
pyenv install 3.6.3
```

### pyenv-virtualenvのインストール

必要なのかどうかよくわかっていないのですが、誰かが良いと言っていたので pyenv-virtualenvも入れます。

```bash
git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
```

そして今回のためのvirtualenvを作成。

```bash
pyenv virtualenv 3.6.3 myproject
```

### ディレクトリの作成

今回のプロジェクトで使うディレクトリを準備しておきます。
（このへんも本当は試行錯誤しながら変えていったのですが）

```bash
mkdir myproject
cd myproject
pyenv local myproject
```

この`myproject`以下に、下記のようにフォルダとファイルを準備します。

```この時点でのソース構造
├── app
│   ├── drivers          seleniumドライバーを置く
│   └── source           
│       └── scraping.py  処理
└── tmp
    ├── files
    │   └── download     スクレイピングでダウンロードしたファイルを置く
    └── logs             ログ(seleniumログなど)
```

続きはこちら。
https://qiita.com/kamyu1201@github/items/a07c7d175c051b8ab4c0
GPUを搭載したPCにUbuntuとGPUドライバーをインストール

# はじめに
これまでのべ数十台のPCにUbuntuをインストールしてきたShunmo17です。数々の方法を試してきましたが、個人的に「これが一番簡単な方法だ」と思う方法を紹介します。

# 環境
#### 下記GPUで動作確認
- GeForce RTX 2080 SUPER
- GeForce RTX 2080Ti
- GeForce GTX 1080Ti
- GeForce GTX 1060 Max-Q
- GeForce GTX 1060
- GeForce GTX 980

# インストール手順
## まずは起動させる（黒画面になり、起動しない場合のみ）
1. GRUB2（紫色の選択画面）で`e`を押す
2. `quiet plash`を`nomodeset`に書き換える
3. `F10`を押す

## Ubuntuのインストール
画面の指示に従っていけばインストールできると思います。
インストールが終わったら再起動。

#### 再起動後、ログインループや黒画面になる場合
1. GRUB2（紫色の選択画面）で`e`を押す
2. `quiet plash`を`nomodeset`に書き換える
3. `F10`を押す

## GPUドライバのインストール
#### grubの設定を書き換え
```
sudo gedit /etc/default/grub
```

`GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"`を
`GRUB_CMDLINE_LINUX_DEFAULT="quiet pci=nomsi nomodeset"`
に書き換え
※Ubuntu 20.04 LTSでは`splash`を消さないとログインループに陥りました。

```
sudo update-grub
```

#### 準備
```
sudo apt-get update && sudo apt-get upgrade
```

#### リポジトリの追加
```
sudo add-apt-repository ppa:graphics-drivers/ppa && sudo apt-get update
```

#### インストール可能なGPUドライバ一覧を表示
```
ubuntu-drivers devices
```

#### GPUドライバをインストール
どれをインストールするかは、環境や使用ソフトの依存関係などで決めるてください。
私はDockerを使用しているので、依存関係は無視し、最新より1つ古いものをインストールしています。

```
sudo apt-get install -y nvidia-***
```

#### 再起動
```
reboot
```

参考サイト：https://qiita.com/min9813/items/90a1ef62b3dc37d0cc33

# アンインストール手順
#### インストール済みドライバの確認
```
dpkg -l | grep nvidia
````

#### アンインストール
```
sudo apt-get remove nvidia* && sudo apt autoremove
```
情報処理安全確保支援士の登録変更

登録内容が変わるかも！と思って確認してみました。

###申請書類
https://www.ipa.go.jp/siensi/formlist.html

※フォーマットが更新に可能性がなる可能性があります。
2020年2月11日時点では、「連絡先等変更届出書」「登録事項等公開届出書」に氏名とともに自宅住所の記載が必要になっていました。2019年10月時点ではなかったと記憶。（他の届出書は確認してません。）

###連絡先等変更届出書
支援士の自宅住所、電子メールアドレス、勤務先等の連絡先を変更する場合に提出する書類です。手数料はかからないようです。簡易書留で送付する必要があります。

###登録事項変更届出書
登録証に記載された氏名、生年月日の変更が必要となった場合には「登録事項変更届出書」と手数料900円が必要！！！　よっぽどのおまぬけさんか、ほとんどの場合罪なく婚姻等の理由で名字が変更になった人にしか発生しない処理ですよね。

###登録の反映
メールアドレスは発送の翌日に確認メールが来ました。
IT未経験が約4ヶ月でJava SE8 Goldに合格するまで

##簡単な自己紹介
- 元理科教員
- 2019年4月から転職しITの道へ
- Mission：4ヶ月の研修期間でJava SE8 Goldを取得する

その際に実践した勉強方法などの記録です。
初心忘るべからず。

##Hello World!!
最初に触れたのはProgateでした。一週間くらいでJavaレッスンを一通り終えて、コマンドプロンプトでコンパイルすることを覚えたところで資格勉強を本格スタートしました。

使用した教材はいわゆる紫本と黒本（問題集）、と少し白本。
試験範囲を網羅している本は他に選択肢がないので、初めてプログラミング言語に触れる初心者は紫本＋黒本がスタンダードかと思います。

当初の計画は紫本を一通り読んで、黒本を解いていくつもりでした。
が、オブジェクト指向の章で大ハマりしたので、専門の書籍を読んだりもしました。
『Javaのオブジェクト指向がゼッタイにわかる本』
https://www.shuwasystem.co.jp/book/9784798050485.html

##Java Silver合格までの学習方法
- 動きがわからない部分はコードを自分で書く

　実際に自力で動かしてみると少し時間はかかっても理解が深められました。
　コンストラクタの動き、継承関係とメソッドのオーバーライドなど、自分でコードを変えてみながら実行してみることで格段に理解しやすくなりました。

- まとめノートは作らない

　綺麗にまとめられたノート、まず見ません。

- 思考整理メモはOK

　インクリメントや配列の操作の流れを追うときなど、考えを書き出して整理するノートは使いました。
　試験でもメモありなので大いに利用しましょう。

- ５分考えてわからなければ解答を見る

　時間をかけても出ないものは出ません。

- 間違えた問題の原因を２つに分類

　理解していないのか、覚えていないのかによって対処を変えました。
　理解が浅いものは紫本のみでなくネットで調べたりコードを書いて深堀り。
　覚えていない、暗記すべきものはGoogleドキュメントにまとめておき、通勤時間、寝る前のスキマ時間にスマホで見られるようにしました。

- Googleスプレッドシートに黒本模試の解答を記録、備考欄にその時の思考をメモっておく

　何をどう間違えたのか忘れがちなので、備忘録を残しました。

- 人にその用語を説明できるか？

　最強のアウトプットは人に説明することです。

理解することを中心に紫本を読み、コードをきちんと追えるようになってきた後に、紫本と黒本の巻末の模擬試験を2回ずつ実戦形式で実施。苦手な配列のところだけ白本を解きました。
黒本模試は直前で8割程度で、2019年5月22日 Java SE8 Silver正答率75%で合格。


##金の沼
Silver取得後1週間で息抜き課題のコンソールアプリを作成しました。
（じゃんけんアプリ、ガチャアプリ）
よくある題材のようですが、ここで初めて制作物を試行錯誤の末に完成させたことでモチベアップ。

その後6月からGoldの学習に着手する時に先輩方から、
「Goldは暗記が多くて大変」、「金の沼へようこそ」と言われていたので戦々恐々。
教材はSilver同様、紫本、黒本、ちょっと白本です。

実際のところ、Goldで覚えるべきことはSilverの3倍くらいあります。
さらにGoldの問題は、メソッドの名前と引数まで覚えていることが前提でないと解答までたどり着けないものも多く、Silverよりもきっちり覚える必要がありました。

元々暗記が苦手で、さらに単純にすべて暗記するのはしんどい量なので、次のことを意識しました。

- 英語の意味と機能と引数、戻り値を対応させて覚える

　関数型インターフェースの名称とメソッド名と機能をセットにする
　Function<T,R>：関数
　　・・・R apply T：Tを適用してRを返す

　Consumer<T>：消費者
　　・・・accept：(Tを)受け入れる(＝消費するので戻り値なし)
　など。

- 覚える時間を確保して一気に覚える

　集中できる時間、土日や寝る前にまとめた暗記用ドキュメントで覚える

- 知らないメソッドはリファレンスを読む

　公式説明書が一番確実で勉強になり、資格試験に限らず利用できるように


しっかり暗記した分だけコードもしっかり追えるようになり、最初に黒本模試を解いた時は4割程度でしたが徐々に正答率は上がり、黒本では内容が薄く苦手なコレクション、並行処理の章のみ白本で補強しました。
直前の模試は8割程度で、結果2019年8月7日に72%で合格しました！


入り口として資格を取得するミッションでしたが、新しい技術を勉強し続けていく姿勢を忘れずに研鑽を積み重ねていきます。
ABC 154 D Perlの恩返し

#はじめに
おっ、ABC 154やっとるな。
[D - Dice in Line](https://atcoder.jp/contests/abc154/tasks/abc154_d)、Perlで問いたろ。
#Perl
提出っ

```main.pl
#!/usr/bin/perl

use strict;
use warnings;

my ($n, $k);
{
    my $in = <STDIN>;
    ($n, $k) = split(" ", $in);
}
my @p;
{
    my $in = <STDIN>;
    @p = split(" ", $in);
}
my $sum = 0;
for (my $i=0; $i<$k; $i++)
{
    $sum += $p[$i];
}
my $max = $sum;
if ($n>$k)
{
    for (my $i=0; $i<$n-$k+1; $i++)
    {
        $sum = $sum - $p[$i] + $p[$i+$k];
        $max = $sum if $max < $sum;
    }
}
$max = ($max + $k) / 2;
print "$max\n";
```
|<font color="LimeGreen">AC</font>|
|:-----:|
どやっ
java でも問いたろっ
#java
そりゃ

```main.java
import java.util.*;

class Main {
    public static void main(String[] args) {
        final Scanner sc = new Scanner(System.in);
        final int N = Integer.parseInt(sc.next());
        final int K = Integer.parseInt(sc.next());
        final int P[] = new int[N];
        for (int i = 0; i < N; i++) {
            P[i] = Integer.parseInt(sc.next());
        }
        sc.close();

        int sum = 0;
        for (int i = 0; i < K; i++) {
            sum += P[i];
        }
        int max = sum;
        if (N > K) {
            for (int i = 0; i < N - K + 1; i++) {
                sum = sum - P[i] + P[i + K];
                if (sum > max) {
                    max = sum;
                }
            }
        }
        double d = (max + K) / 2.0;

        System.out.println(d);
    }
}
```
```
java.lang.ArrayIndexOutOfBoundsException
```
ぐぬぬ
#まとめ
```
誤    for (my $i=0; $i<$n-$k+1; $i++)
正    for (my $i=0; $i<$n-$k; $i++)
```
+ Perl の場合、未定義値undefは数値として比較された場合「0」として扱われる
+ java や ruby の場合、例外が発生する
+ c の場合、しれっととんでもない数値を返す

参照したサイト
[undef関数 - 未定義値 - Perl入門ゼミ - Perlゼミのプログラミング ...](https://tutorial.perlzemi.com/blog/20100220126425.html)
Azureで”Server is not configured to allow ipv6 connections.”に苦しめられた話

※2020/02/11時点の話です。

Azure Database for PostgreSQLでタイトルにあるメッセージに苦しめられた話。

接続元のVMが属するサブネットにサービスエンドポイント"Microsoft.Sql"を設定した上で、事前に構築しておいたPostgreSQLに接続しようとしたところ、

<font color="blue"><b>"Server is not configured to allow ipv6 connections."</b></font>

発生…。

最初はpsqlで接続したときに発生したのですが、ダメもとでjdbc接続を試みても同じメッセージが出て接続不可。


その後いろいろ調べた結果（※1）、<font color="red"><b>Basicインスタンスだから発生していた問題</b></font>と分かりました。
汎用目的やメモリ最適化のインスタンスであれば、このような問題は起きません。

他の検証目的のために、とりあえず作成していたBasicインスタンスを利用したのが徒となりました。
時間を返せ～。（苦笑）

---
以下、余談になります。

<b>余談1</b>
　※1ですが、サービスエンドポイントがダメならプライベートエンドポイントならどうだろうと試そうとしたのがきっかけ。
　Basicインスタンス相手だとプライベートエンドポイントは作成すら不可だったことから、Basicインスタンスだからダメなのかも、という思いに至り始めました。

<b>余談2</b>
　インスタンス構築→削除を何度か実施したのですが、ファイアウォールの設定変更を忘れたり、"Azureサービスへのアクセスを許可"を忘れたりで、何度も「接続できない、何故だ！？」と焦りました。
　ちなみに、"Azureサービスへのアクセス許可"を忘れていると、接続を試みたときに"Client from Azure Virtual Networks is not allowed to access the server."が出ます。

 ※2020/02/14追記
　サブネット側にMicrosort.Sqlのサービスエンドポイントを設定した場合のPostgreSQL側の設定ですが、"Azureサービスへのアクセス許可"ではなく、"仮想ネットワーク規則"でアクセスを許可したいサービスエンドポイントを含むサブネットを許可する形がよさそうです。
　
　https://docs.microsoft.com/ja-jp/azure/postgresql/concepts-data-access-and-security-vnet

<b>余談3</b>
　制限については以下にちゃんと書いてありますね。
　https://docs.microsoft.com/ja-jp/azure/postgresql/concepts-limits

　発生したメッセージから調べてしまったので、原因の特定に至るまでに時間がかかってしまいました。

　<font color="red"><b>公式ドキュメントはちゃんと読まないと!!</b></font>
型でも実装でも使えるサブセットレコードのフィールド一覧

ある型のレコードを格納しているデータベースから、その一部のフィールドだけに絞って取得したときの型。例えばこんな感じのことをするとき。

```sql
SELECT id, name FROM users
```

ここでいう `id, name` をどう持つかという話です。

サブセットを抜き出すのは [`Pick` という utility type](https://www.typescriptlang.org/docs/handbook/utility-types.html#picktk) を使ってやれます。

やれるんだけど、必要なフィールドの一覧は型だけじゃなくて実装の方でもクエリに乗せるとかで使うじゃないですか。同じものを2度書くのは不具合の素なので、実装コードから取ってきて型へ反映させるようにしたいですね。

そんなわけで、こんな感じでやれます。

```ts
import mongodb from 'mongodb';

const db: mongodb.Db;

// 元のレコード
type User = {
  id: number;
  name: string;
  email: string;
  imageUrl: string;
}

// 抜き出すフィールドの一覧
// （これを型でも実装でも使う）
const fields = Object.freez({
  id: 1,
  name: 1,
});

// サブセット
type UserListItem = Pick<User, keyof typeof fields>
// 結果 => {
//   id: number;
//   name: string;
// }

// 取る
const coll = db.collection<User>('users');
const query = {};
const users = await coll.find<UserListItem>(query, fields).toArray();

// 取れたぜ
users.forEach((user) => {
  console.log('User', user); // { id, name }
});
```

`typeof` で実装から型へ変換して、`keyof` で `id: 1` のうちキー `'id'` を得ます。加えて `Pick` のタイミングで `fields` の内容が `User` の一部であることも確認できて良い感じです。

めでたい。

で、ここから未解決ゾーンです。

まあ動いてるんですが、不満なのは対象のフィールドをオブジェクトで持っている点。たまたま MongoDB 的には `1` が意味を持つのでそれはそれで良いんですけど、これを文字列の配列みたいなのにできないでしょうか。

こんな感じで。

```ts
const fields = [
  'id',
  'name',
] as const;
```

ここから文字列を抜き出して union type 作って `Pick` に与えるのができなかった。`infer` なんかでどうにかならないですかね。ちなみに一度オブジェクトで作ってから配列化、みたいなのはあんまりやりたくないです。

誰か教えてください。
WSLでRuby on Railsの環境構築

##やること
- windowsでUbuntuを使えるようにする
- Rubyのインストール
- Railsのインストール
- DBのインストール

##windowsでUbuntuを使えるようにする
Ubuntuの入れ方については既に多くの記事がでているので省略します。

Ubuntuを立ち上げたら、ユーザ名とパスワードを入れます。
その後、パッケージを最新にするため下記のコマンドを以下のコマンドを実行してください。

```
sudo apt update
sudo apt upgrade -y
```

##Rubyのインストール
Rubyをインストールする前にバージョン管理のために、rbenvをインストールします。
下記のコマンドを実行してください

```
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc　//パス設定と初期化
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
```

ここで一旦終了し再び立ち上げ、下記のコマンドを入力しバージョンが返ってきたらokです。

```
rbenv -v
```
`ruby-build`のセットアップとパッケージのインストールをします。

```
git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
sudo apt-get install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm5 libgdbm-dev
```
ここからRubyのインストールです。

```
rbenv install 2.6.5
rbenv global 2.6.5 
ruby -v
which ruby
```
 `ruby -v`を実行して返ってきたらokです。

さらに、gemのアップデートとbundlerのインストールもしておきます。

```
gem update
gem install bundler
```

##Railsのインストール

```
gem install rails -v 6.0.2
rails -v
```
ここでもバージョンが返ってきたらokです。

後に必要となるnode.jsもここでインストールしておきます。

```
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - //バージョンは最新のものを選択してください。
sudo apt install nodejs
```

##DBのインストール

下記のコマンドを実行してください。

```
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ 18.04.4 -pgdg main" >/etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt update
sudo apt install postgresql
psql -V
```
バージョンが返ってきたらokです。

Postgresqlを起動します。

```
sudo service postgresql start
sudo su postgres -c 'createuser -s ユーザ名'
psql postgres
```
\qを入れて終了します。
下記のコマンドで「pg」が利用するパッケージをインストールしておきます。

```
sudo apt install libpd-dev
```

##参考文献
- [WindowsでWSL、Ubuntu、Rubyをインストール](https://qiita.com/tsukamoto/items/6e9a181b6e0defc27a39)
- [Ubuntu でapt を使用してNode.js をインストールする3 つの方法(Ubuntu 15.04, Ubuntu 14.04.2 LTS)](https://qiita.com/TsutomuNakamura/items/7a8362efefde6bc3c68b)
- [Linux downloads (Ubuntu) ](https://www.postgresql.org/download/linux/ubuntu/)
OpenCL を使って　ガウスぼかしをする(その１)

### OpenCL

OpenCL（Open Computing Language）は、マルチコアCPUやGPU などによる異種混在の計算資源において、
並列コンピューティングのためのクロスプラットフォームなAPIである。

[wikipedia : OpenCL](https://ja.wikipedia.org/wiki/OpenCL)


### ガウスぼかし

ガウスぼかしは、重みづけ平滑化の１つである。
重みづけにガウス関数（ガウスカーネル）を使用する

ガウス関数は、下記の数式で表現される。

```math
G\left( x \right) = \dfrac {1}{ \sqrt { 2 \pi \sigma} } \mathrm{e}^{ - \dfrac {x^{2}}{ 2 \sigma^{2} } }
```
 
図示すると 釣鐘型になる。
図はwikipedia　より引用。
![Normal_Distribution.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/f6710bc4-003a-85f5-ac08-ba53df05d4d3.png)

ガウスぼかしは、輪郭の特徴を残してぼかしを行う。
ガウスぼかしは、ガウスカーネルの大きさが大きく標準偏差 σが大きいほどぼかしの効果が顕著である。
図はwikipedia　より引用。
![Cappadocia_Gaussian_Blur.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/83a6a53c-9255-b3bd-047a-5951fa3f67c5.png)

[wikipedia : ガウシアンぼかし](https://ja.wikipedia.org/wiki/%E3%82%AC%E3%82%A6%E3%82%B7%E3%82%A2%E3%83%B3%E3%81%BC%E3%81%8B%E3%81%97)

[wikipedia : ガウス関数](https://ja.wikipedia.org/wiki/%E3%82%AC%E3%82%A6%E3%82%B9%E9%96%A2%E6%95%B0)

### ガウスぼかしのサンプルコード

github に公開されているものを試す。
https://github.com/bgaster/opencl-book-samples/tree/master/src/Chapter_8/ImageFilter2D

このサンプルでは、ガウスカーネルの大きさは 3x３ である。

```math
 \frac{1}{16}
 \left[
    \begin{array}{ccc}
      1 & 2 & 1 \\
      2 & 4 & 2 \\
      1 & 2 & 1
    \end{array}
  \right]
```

この大きさでは、ぼかしの効果は微小で、画像を拡大して、やっとぼかしの効果がわかる。
![comparison_3x3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/030447b5-f14e-caf1-f7fe-cc2f94b834fb.png)

サンプルを少し修正して、macOS で実行できるものを Github に公開した。
https://github.com/ohwada/MAC_cpp_Samples/tree/master/OpenCL-ImageFilter2D

### ガウスカーネルの大きさを変更する

下記の記事の  5x5 を試す

```math
 \frac{1}{273}
 \left[
    \begin{array}{ccccc}
      1 & 4 & 7 & 4 & 1 \\
      4 & 16 & 26 & 16 & 4 \\
      7 & 26 & 42 & 26 & 7 \\
      4 & 16 & 26 & 16 & 4 \\
      1 & 4 & 7 & 4 & 1 \\
    \end{array}
  \right]
```

[Gaussian Smoothing](https://homepages.inf.ed.ac.uk/rbf/HIPR2/gsmooth.htm)

ガウスカーネルの部分を置き換える。

```gaussian_filter.cl
// 3x3
    float kernelWeights[9] = { 1.0f, 2.0f, 1.0f,
                               2.0f, 4.0f, 2.0f,
                               1.0f, 2.0f, 1.0f };
// 5x5
    float kernelWeights[25] = 
        { 1.0f, 4.0f, 7.0f, 4.0f, 1.0f,
          4.0f, 16.0f, 26.0f, 16.0f, 4.0f,
          7.0f, 26.0f, 41.0f, 26.0f, 7.0f,
           4.0f, 16.0f, 26.0f, 16.0f, 4.0f,
           1.0f, 4.0f, 7.0f, 4.0f, 1.0f };
```

結果は、3x３と大差なかった
![comparison_5x5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/6104ad0a-0736-811f-3899-394a65ce3ac8.png)


もっと大きなものについては、その２に続く。
https://qiita.com/ohwada/items/435afc3df419d29439f3
🌏【Chrome】svg画像がブロックされたときはsanitizeする

## 環境

Google Chrome バージョン: 79.0.3945.130（Official Build）

## やりたいこと

imgタグでsvgを表示したいが、chromeで下記エラーとなり表示されない

```
Cross-Origin Read Blocking (CORB) blocked cross-origin response https://hogehoge/fuga.svg with MIME type text/plain. See https://www.chromestatus.com/feature/5629709824032768 for more details.
```

↓

See https://www.chromestatus.com/feature/5629709824032768 https://www.chromestatus.com/feature/5629709824032768 とあるので内容確認

```
Cross-Origin Read Blocking (CORB) is an algorithm that can identify and block dubious cross-origin resource loads in web browsers before they reach the web page. CORB reduces the risk of leaking sensitive data by keeping it further from cross-origin web pages. In most browsers, it keeps such data out of untrusted script execution contexts. In browsers with Site Isolation, it can keep such data out of untrusted renderer processes entirely, helping even against side channel attacks like Spectre.
```
→疑わしいcross-origin resource （オリジン間リソース）をブロックするセキュリティがChrome73から実装されている様子

## やったこと

パラメータにsanitize=trueを追加する

```md
<img width="148px" src="https://hogehoge/fuga.svg">
```

↓

```md
<img width="148px" src="https://hogehoge/fuga.svg?sanitize=true">
```
UbuntuでNVIDIA GPUのファン制御（マルチGPU対応）

# 動機
研究用にGPUを複数枚搭載したPCを組み立てたのですが、GPUが外排気仕様ということもあり、GPU温度が高かったため、GPUファンの回転数を手動で上げてみました。

# 環境
## 環境1
CPU：Ryzen 9 3900X
RAM：DDR4 64 GB（32 GB x 2）
GPU：GeForce GTX 1080Ti x 2
OS：Ubuntu 18.04 LTS

## 環境2
CPU：Core i9 10980XE
RAM：DDR4 128 GB（32 GB x 4）
GPU：GeForce RTC 2080Ti x 3
OS：Ubuntu 20.04 LTS

# 方法
## ファン制御の有効化

```
sudo nvidia-xconfig -a --allow-empty-initial-configuration --cool-bits=31
```

## 【マルチGPUの場合のみ】画面出力のための設定
画面出力をするには、映像出力ケーブルを接続しているGPUを `/etc/X11/xorg.conf` 内のDevice0にする必要があります。
nvidia-smi等の使用率でディスプレイが何番目のGPUに刺さっているか確認し、Device0のPCIバス番号を映像出力ケーブルを接続しているGPUのPCIバス番号に変更してください。
※`nvidia-smi` で表示されるPCIバス番号は16進数ですが、`xorg.conf` 内で記述するPCIバス番号は10進数です。

```
sudo vim /etc/X11/xorg.conf
```
このファイルを編集する。

## 再起動
```
sudo reboot
```

## 再起動後
```
nvidia-settings
```

※SSH接続経由で設定する場合

```
ssh -XYC <USER NAME>@<HOST IP>
```

```
nvidia-settings -c :0
```
各GPUの`Thermal settings`で`Enable GPU Fan Settings`にチェックを入れることで、
ファンの回転数を変更できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477282/90ad20f8-527d-c51c-17d7-66a1b4a0f0f7.png)


# 画面出力しなくなったときの対処法
GPUのファンをいじる場合、X11 Windowの設定ファイルをいじるため、失敗すると再起動後画面が表示されません。ただ、CUIは生きているので、下記方法で復活できます。

#### CUIモードへ切り替え
`Ctrl`+`Alt`+`F2`

#### ログイン
ユーザー名 → パスワードの順で入力すればログインできます

#### X11 Windowの設定ファイルを削除
```
sudo rm /etc/X11/xorg.conf
```
```
reboot
```

# 参考サイト
http://geraniums.hatenablog.com/entry/2018/01/23/165704
https://qiita.com/tttamaki/items/e40d98981d3bffeddccb
MDMの問題でAzure ADにサインインできない

「お客様の組織のMDM利用規約のURLに接続できないようです」

または
サービスエラーコード80180018

がでて、Azure ADに接続できず2時間ハマったので報告です。

原因はおそらくIntuneのライセンスがないということ。
従来のOffice365 基盤に一部Microsoft365を導入した際に、何らかの設定が変わったか？


【修正方法】
1．Azure ADポータルから、モビリティ→Intuneを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96158/999c1fad-a378-e470-da9c-7f31a8571177.png)

2．MDM/MAMユーザースコープをなしに設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96158/762b171f-9211-e17b-f545-9e6c1906c664.png)

3．参加させようとしていたデバイスを再起動

以上です。