OmniAICreator/Qiita-1.07M huggingface dataset:
テストサーバーで起きたPermission denied (publickey)の対処

**そもそもsshとは**
 - SSH(Secure SHell)による暗号化通信を利用してホストに接続します。これにより、実行コマンド及び、ログイン時のユーザ名やパスワードが暗号化されてホストへ送られるようになります。 (IT専科)
http://www.itsenka.com/contents/development/unix-linux/ssh.html

テスト環境をいじる必要があり、sshを利用する機会がありました。ただ、ガッツリ、permission deniedで引っかかってしまったので、その備忘録です。多段sshした結果、agent forwardができてないことが原因でした。

## Permission deniedになるまでの経緯
テスト環境に入るために、
**本番サーバーにssh -> テストサーバーにssh -> コマンド実行**
という流れが必要でした。
そのため、

```
$ ssh hoge@000.000.0.000 
$ password入力
// 本番サーバーに接続
$ ssh -p ポート番号 hoge@000.000.0.000 -A
$ password入力
// テストサーバーに接続
// コマンド実行
```
という順序です。実は、**この段階で既に間違っていました。**
というのも、1行目に

```
$ ssh hoge@000.000.0.000 
```
と、**本番サーバー**に対して **-A オプション**を付けておりませんでした。ここからは、どうやって-Aオプションが無いことに気づくかという話になります。

## ローカルと本番での差異

今回の分かりづらい点として、
**ローカル**だと

```
$ ssh -T hogehoge.jp
Hi ! You've successfully authenticated, but Backlog does not provide shell access.
```
と表記されるのに対し
**本番サーバー -> テストサーバー**にアクセスした際、

```
$ ssh -T hogehoge.jp
Permission denied (publickey).
```
となってしまうことです。ローカルでは通っているのに、本番で通らないのはなぜ？となってしまっています。
更に言えば、**本番サーバーをいじる必要が今回なかった為、テストサーバーにだけ注意がいってしまう**のです。
**多段sshをする際には、十分気をつけていきたい**ところです。

また、~/.ssh/configの記述も

```~/.ssh/config
Host @hoge.jp
  User hoge
  IdentityFile ~/.ssh/id_rsa_hogehoge
  HostName hoge.jp
  StrictHostKeyChecking no
```
と、別段気に留める部分もない為、時間がかかってしまいました。

## テストサーバーでdeniedなら、本番サーバーを疑う

色々と試行錯誤していたところ

```
$ ssh hoge@000.000.0.000 
$ password入力
// 本番サーバーに接続
$ ssh -T hogehoge.jp
Permission denied (publickey).
```
と、**本番サーバーの時点で Permission deniedになっていた**ことが判明。
「あぁ・・」と納得して、

```
$ ssh hoge@000.000.0.000 
```
の部分を

```
$ ssh hoge@000.000.0.000 -A
```
とオプションを付けることで、解決できました。

## 所感
普段、クライアントサイドをいじっていて、中々サーバー側を触る機会が少ないので、今回四苦八苦ながら良い経験でした。多段構成でsshを渡すときには、オプションを付けることを忘れないようにしたい。

## 参考
[ssh-agentの基本](https://qiita.com/yudoufu/items/82f752807893c63f06db)
$('input[value="aaa"]') は「"aaa"と入力されたinput要素」ではない

かなり驚いたので初めて記事を書きます。

# だめな例
"aaa"と入力されたinput要素のvalue属性を表示するプログラムのつもり。(つまり"aaa"が返ってくるはず)

```html:HTML
<input type="text" name="phrase">
```

```javascript:JavaScript
const check = () =>{
   const target = $('input[value="aaa"]');
   console.log(target.val());
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601799/96cf80f3-f823-91cf-dae0-31e3c40ec411.png)
"aaa"と入力して、consoleで`check();`を呼び出すと当然"aaa"...ではなく`undefined`

# 原因
どうやら[こちら](https://stackoverflow.com/questions/34063628/why-jquery-selector-by-value-not-work-in-case-of-dynamic-change)によると、
>If you are changing value dynamically it wouldn't get selected by attribute selector. 

この属性セレクタは**ユーザーによって動的に変更された値**に対しては使えないそうです。[^1]  

>Attribute selector will not check the dom node's **value property** it only targets the **element's attribute**

_この属性セレクタは、**その要素の属性のみ**を対象とし、**ノードのvalueプロパティ**はチェックされません。_[^1]  



[^1]: もちろん、元から`input`に`value="aaa"`と指定されているものをセレクタで見つける際には使えます。また、ブラウザのデバッグツールを使って後から属性を追加した場合も同様。ポイントは**動的かどうか**というより**属性として与えられているかどうか**みたいですね。

# 解決策
filterを使いましょう。[^3]  


```html:HTML
<input type="text" name="phrase">
```


```javascript:JavaScript
const check = () =>{
   const target = $('input').filter(function() {
       return this.value == "aaa"
   });
   console.log(target.val());
}
```
[^3]: ここでアロー関数で書こうとするとコケます。詳しくは"js アロー関数 this"。  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601799/96cf80f3-f823-91cf-dae0-31e3c40ec411.png)
"aaa"と入力して、consoleで`check();`を呼び出すと..."aaa"！！


# 参考
[javascript - Why Jquery selector by 'value' not work in case of dynamic change - Stack Overflow](https://stackoverflow.com/questions/34063628/why-jquery-selector-by-value-not-work-in-case-of-dynamic-change)
【Laravel】エラーメッセージの日本語版をコマンドでインストール

## エラーメッセージを簡単インストールで設定する
バリデーションやauth認証の際のエラーメッセージはデフォルトで英語表記となっていますが、コマンドで簡単に日本語版のエラーメッセージをインストールすることができます。

https://readouble.com/laravel/7.x/ja/auth-php.html
参考ページ

`auth.php`、`passwords.php`、`pagination.php`、`validation.php`の４日本語ファイルをまとめてインストールするコマンドは以下の通りです。プロジェクトルートに移動してコマンド入力してください。

```php
php -r "copy('https://readouble.com/laravel/7.x/ja/install-ja-lang-files.php', 'install-ja-lang.php');"
php -f install-ja-lang.php
php -r "unlink('install-ja-lang.php');"
```
未経験エンジニアはこんなポートフォリオを作ってみてはどうか②〜PDF出力編〜


今回は前回同様に未経験エンジニアがポートフォリオを作るにあたってこんな機能を取り入れたらどうかなって思うものを一つ紹介したいと思います。

僕が実務を経験した中で

「あ、この技術は未経験のうちに習得できそうだな」

と思ったものを提案していくので、難易度的にもそんなに難しくはないはずです。

Youtubeに同じ内容の動画を掲載しているので興味がある人は観てください

[未経験エンジニアはこんなポートフォリオを作ってみてはどうか②〜PDF出力編〜。]
(https://youtu.be/mfnwutjZbAQ)
<img width="213" alt="スクリーンショット 2020-08-11 0.59.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521937/d29e214d-e37d-6bf6-4952-339c069cef1d.png">

あと、
[【実体験をもとに】30歳未経験から独学4ヶ月でバックエンドエンジニアとしてWeb系自社開発企業へ転職するまでのロードマップ](https://qiita.com/WATARU_GP01/items/7e534e08f9f583d15775)
という記事も書いてますので是非

では今回の内容はこんな感じ。

・機能紹介〜PDF出力〜
・意外とポートフォリオに取り入れている人は少ない
・なぜ取り入れておいた方が良いか
・導入するためには
・まとめ

##◾️機能紹介〜PDF出力〜
今回はPDF出力ですね

これは何をするのかパッと聞いて分かるとは思うのですが、目的としてはシステムの持つデータをきれいにまとめてPDFファイルとして出力するという事です。

だいたい皆さん「PDFファイルで出力」って動作はしたことあると思います。
（めちゃくちゃメジャーな機能ですからね。）

##◾️意外とポートフォリオに取り入れている人は少ない

僕の感覚ではあリますが、機能自体のメジャーさのわりに意外とポートフォリオに取り入れている人が少ない気がします。

何でそうなるのかっていうと、僕が見てきた限りですが多くの方が作成するポートフォリオって対個人を想定したアプリだからですね。

感覚的に７〜８割のポートフォリオが 
「インスタグタムのようにユーザーが写真をつけて何かを投稿するとか個人が何かしら情報発信をする系」
って感じでした。

※投稿する何かっていうのはアプリの趣旨に依存しますが、例えば景色・動物・食べ物・趣味とかですね。

こういったアプリにおいてはあんまりPDF出力って必要にならないことが多いのでこの機能を追加していない人が多いと思います。

##◾️なぜ取り入れておいた方が良いか

世の中には対企業を想定したアプリを開発する企業がたくさんあるわけです。例えば経費の申請アプリとかタスクの管理アプリもそうですね。
特にベンチャー企業とかはこういったアプリを積極的に使う傾向がありますし、僕の勤務先も使っています。

対企業を想定したアプリになってくると、こういったデータの吐き出し機能はほぼ必須級かなと個人的には思いますし絶対にあって損はない機能って感じです。

だいたいどこの会社でも「見積書」とか「報告用の資料」とかでシステム内のデータを使う事は多いですからね。

今後対企業向けアプリを開発する企業の選考を受ける可能性もあるので、そういったアプリでよく使用されるPDF出力機能はとりあえずポートフォリオに入れておこうって事です。

例えば自分が作ったポートフォリオがインスタグラムみたいなものなら、投稿された日にちとか付けられたタグとかでデータを集計してPDFで出力する機能をつけると良いのではないかな〜って思います。

「6/20(土)　投稿数100」 
「未経験タグ：投稿数 20、エンジニアタグ：投稿数10」

とかですね。
先の話ですが、JsやjQueryを使ってグラフ化できれば完璧です。

いきなり企業向けを想定したポートフォリオを作るのもなかなかハードルが高いものだと思うので個人向けアプリに導入するくらいでいいと思います。

そんなポートフォリオを携えて面接の時に

「自分のポートフォリオにはあまり必要ない機能かとは思いましたが、エンジニアとして仕事をしていく上でPDF出力機能はいつか必ず必要になるかと思ったので学習目的で取り入れました」

なんて言えれば

「お、こいつはちゃんと先のことも考えてる」

って思ってもらえますし、あまりないとは思いますが仮に選考を受けた企業の開発ツールがまだブラッシュアップされていなくてPDF出力機能が必要なデータに対して完備されていなければ

「御社のツールのOOのデータを管理しやすくするため、僕が入社したらPDF機能つけます」

みたいなことを言えれば、それが必要と判断されるかどうかはともかく未経験エンジニアの口から出てくる内容として上等なんじゃないでしょうか。

##◾️導入するためには

詳しい解説は行わないのですが、Ruby on Railsを使っている方であればwicked_pdfというgemを使用すればそこそこ簡単に導入できると思います。

このgemはインストール・初期設定・フォーマット用のHTMLを作成・controllerに４行くらい記述するくらいでとりあえず実装できます。
参考資料もたくさんあるので使い方はググればすぐ見つかるのも良いですね。

PDFを作成するだけではあんまり意味がないので、ダウンロードもできるよう設定するのも忘れないようにしましょう。
やり方はめちゃくちゃ簡単なので、Railsを使用されてる方なら「wicked_pdf 　send_data」とかで調べればすぐ見つかると思います。

前に紹介したwheneverよりは難易度が上がりますが、未経験の方でも十分実装できると思うのでぜひ調べてみてください。

◾️まとめ

今回はポートフォリオに追加する機能としてPDF出力機能を紹介しました。
紹介したのはPDFでしたが、CSVで出力する機能を実装しても全然構わないと思います。
ただCSVの方がちょっと難易度が高いです。

未経験エンジニアのポートフォリオというのは選考で使われるものだと思いますので、追加する機能に関してはより相手にヒットしやすいものをチョイスした方がいいと思います。

いかに自分が興味を持って取り入れたものでも相手から
「へーそうなんだよくわかんないけどがんばったね乙」
と思われるのはもったいないですよね。

なので「今後自分がどんな会社の選考を受けることになってゆくのか」を考えて、その会社で使っていると思われる機能を自分のポートフォリオに盛り込むのが一番手っ取り早いんじゃないかっていうのが僕の見解です。

今後もそういった観点で僕なりにお勧めの機能を紹介していきたいと思います。

はい、ということで今回は以上です。
未経験エンジニアはこんなポートフォリオを作ってみてはどうか① 〜バッチ処理〜

こんにちは〜。どうもわてぃるです

今回は未経験エンジニアがポートフォリオを作るにあたってこんな機能を取り入れたらどうかなって思うものを一つ紹介したいと思います。

Youtubeに同じ内容の動画を載せているので是非観てください
[未経験エンジニアはこんなポートフォリオを作ってみてはどうか① 〜バッチ処理〜](https://youtu.be/d-FmgeEzAfU)
<img width="215" alt="スクリーンショット 2020-08-11 0.52.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521937/bb2faab1-c8e5-b0e5-0536-491f69db4fc9.png">

あと、
[【実体験をもとに】30歳未経験から独学4ヶ月でバックエンドエンジニアとしてWeb系自社開発企業へ転職するまでのロードマップ](https://qiita.com/WATARU_GP01/items/7e534e08f9f583d15775)
という記事も書いてますので是非

内容はこんな感じ。

・趣旨
・機能の紹介〜バッチ処理〜


##◾️趣旨
僕が以前に公開した動画では「ツイッターの簡単なクローンアプリではポートフォリオとして不十分」といったお話をしました。

単純に「ユーザー登録・ログイン・投稿機能をバリデーションなど駆使して不備なく動かす」程度のアプリではなく、どんどん追加機能を増やして開発への関心と自走力をアピールしないとダメよね。ってお話ですね。

ただそこで「じゃあ具体的に"簡単なクローン"から抜け出すにはどうすればいいの？」って思われる方も多いかと思います。

僕の場合はDockerなどを利用してインフラ面で肉付けしましたが、やはりパッと目につきやすく分かりやすいのは「アプリで出来ることを増やす」だと思います。

あれやこれやといろんな機能がついているアプリの方が非エンジニアが見たときのインパクトも強い

「どんどん新しい機能を取り入れていくぜー！」という姿勢が見える点からもベンチャー企業みたいなガンガン前に進んでいく企業からのウケも良いんじゃないかなーって感じです。

なので少しでも肉付けアイデアの提供になるように
・出来るだけ未経験の方でも独力で実装できる機能
・僕が少しの実務経験を経て有効だなーと感じたもの
を紹介していこうと思います。

##◾️機能の紹介〜バッチ処理〜
今回のお題はバッチ処理です。 

これは何かと言うと、自分の定めたメソッドを定期的に実行してもらう機能ですね。

以前Twitter APIの使用をお勧めしたのでそれに関わる例を挙げますと

まずは「毎日朝９時に"おはよう"と自動でツイートする機能」からスタート
後々「定期的に自分のツイートのアナリティクスを取得・表示する機能」

なんかを実装すればそれでもうTwitter運用ツールとして成り立つアプリになります。

バッチ処理はどんなアプリでも活用できる汎用性の高い機能なので、開発スキルを身につけておいて損はないでしょう。

そもそもプログラミングはあらゆる行動をシステムによって自動化することにより皆さんの工数を減らすというのが本質の一つ

「毎日xx時にこの処理をする」というシステムを開発しポートフォリオに取り込んで
面接では「定期的に処理を実行する工数の削減をしました」なんて言えれば良いアピールになるのではないでしょうか。



どのように導入するのか詳しい解説はしませんが、Railsアプリであればwheneverというgemを使えば簡単に導入できます。

インストールしたうえで専用ファイルに記入
アプリを設置したサーバー上で設定を反映するコマンドを実行する

それだけで簡単にバッチ処理が実装できる代物なので、かなりオススメです。

「whenever gem」と検索すればすぐに導入方法がヒットするので参考にしつつ実践してみてください。

記事の短さから、いかに導入が簡単なのかわかっていただけると思います。

whenever自体は本当はcronというもののファイルを書きやすくするためのgemでしかないので、導入した後はcronについても調べて背景を知っておくと良いと思います。

はいこんな感じでProgateなどの学習ツールが終わりポートフォリオ作りに取り掛かっている方に向けて追加機能やコンセプトなどの提案をしていこうと思いますので気になるものがあったなら調べて実装してみてください。
プログラミングを始めるにあたり購入すべきもの4つ


今回はこれからプログラミング学習を始める方と今勉強中だよって方に購入をオススメするものを４つ紹介したいと思います。

Youtubeに同じ内容の動画を掲載しているので興味がある人は観てください

[【実体験を元に】プログラマーを目指す際に4つ買っておこう！という提案。<img width="204" alt="スクリーンショット 2020-08-11 0.47.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521937/165880d7-3d5e-e054-0f43-50245abf1503.png">
](https://youtu.be/N0ECxZL9miU)

あと、
[【実体験をもとに】30歳未経験から独学4ヶ月でバックエンドエンジニアとしてWeb系自社開発企業へ転職するまでのロードマップ](https://qiita.com/WATARU_GP01/items/7e534e08f9f583d15775)
という記事も書いてますので是非


話を戻しまして、僕自身が「マジで早めにこれ買っとけばよかった〜」って後悔したものがあったので、それを紹介したくて書いてます

駆け出しのエンジニアさんは是非早めに購入した方がいいものもあるので参考にしてください。

最初に全部あげちゃうとこんな感じです。
◾️キーボード　←重要
◾️モニター　←重要
◾️ノートPC(スペック)
◾️スピーカー


##◾️キーボード
これホントにさっさと買えばよかったと後悔してます。
ほとんどの方がプログラミングを学び始めるにあたってノートPCを買うと思いますが

ノートPCのキーボードってめちゃくちゃ肩が凝る。

幅が狭いので脇を締めた状態で何時間も作業してると肩の違和感がとんでもないことになります

僕も前職ではPC触って仕事してたんですけど、プログラミングをやるとタイピングしてる時間が増えるので塵も積もってコリになるって感じです。

これはやばいと思って買ったのがセパレートタイプのキーボード
<img width="401" alt="スクリーンショット 2020-08-11 0.31.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521937/03d88c59-e367-8a9e-8566-cc42d8ab8d4b.png">


これなら左右に肩を広げて作業ができるので肩こりしにくいっていう優れものです。

別にセパレートじゃなくてもいいんですが、できればエルゴノミクスキーボードは買っておいた方が絶対に良いです。

ここは効率にもつながる部分なので、あんまりお金を惜しまず投資した方が良いと思います。

##モニター
これもさっきのキーボードと同じで、ノートPCのモニターだと不十分なので購入をお勧めします。

まずノートPCでは画面の大きさが足りない。
作業してると資料を見てる画面とエディター画面、ターミナル、AWSコンソールなどなどいろんな画面を開いてるので、デュアルディスプレイでの運用がお勧め

さらにノートPCの画面を見ていると視線が落ちてうつむいた状態になるので、肩こりの原因になってしまう

僕の場合は家にあった１万円くらいのゲーミングモニターを代用してます

モニターならなんでも良いと思いますが、健康のためにも効率のためにも絶対に購入した方が良いです！
<img width="345" alt="スクリーンショット 2020-08-11 0.33.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521937/a80218cc-1b25-abac-44da-51bf7a846eea.png">

##◾️ノートPC（とスペック）
絶対にMacっていう話はどこでも言われてるんで割愛します。

僕が使っているMacBook proのスペック
プロセッサ　1.4 GHz Intel Core i5
メモリ　8 GB
サイズ 13インチ
価格１５万円ほど 

会社から支給されているMacBook proはプロセッサが2.4GHz

ホントにこれから始めます。って人は
「プログラミング動かすだけならスペックは必要ない」
ということを聞いて「MacBook Airでもいいかな」って思うかもですが、個人的にはProをお勧めします。

僕自身Airを使ったことがないのになんでそんなこと言うかっていうと、今紹介したスペックのパソコンでも結構負荷がかかってるなと思うことがあるからです

確かにただRubyを動かすだけなら全然不可もないんですが、Docker使うときに結構な勢いで「うーー〜ー」ってうめき声をあげて頑張ってます。
けっこうキテます。

さらに知り合いのAirがそういった重い処理をしてないのに動作が鈍くなっているところを見ると、「いつかは絶対Proに買い換えるよね」っていうのが僕の見解です。


##◾️スピーカー
これはおまけみたいなものなんですが、長時間PCとにらめっこするにあたって作業用BGMを流すのはお勧めです。

このときスマホやPCスピーカーでは十分な満足度を得られないのでスピーカーを買ったほうが良。

僕はウーファーのついたシステムを使っていますが、１万円程度のスピーカーでも十分です。

リラックスする音楽や気分が上がる音楽をYoutubeで流しながら作業すると効率も上がるので是非買いましょう！

ちなみに僕は大好きなFinal Fantasyやドラゴンクエストの作業用BGMを流して仕事に望んでいます。



以上がプログラミングを始めるに当たって購入をお勧めしたいアイテムでした。

特にキーボードとモニターに関しては健康面で想像以上に影響してくるものなので、絶対にお勧めしたいものです。

資金を有効に使って効率よく作業ができる環境を作っていきましょう！
[Git GitHub] インストール・使用方法

◆今回学習したこと。
・エンジニアはチームでの開発が多いので、WEB上にコードの情報やアプリケーションの過程、修正、変更できるサービスであるGit Hubを今後たくさん使うんだろうなと、、、学びました。

・最初ローカルリポジトリの変更ができなくて、叫びそうになりました。
がなんとか自力で解決。（私が学習している深夜は、スクールのエンターが活動していないでエラーは自力で解除）
なんやかんやで、リモートリポジトリに反映成功。
今日のカリキュラムはここまで、寝ます。

追伸
今週はGit Hubのカリキュラムなので言語を学びたい私としては要点を抑えつつ早く次のカリキュラムに行けるように頑張ります。
【Python3】文字列の除去(strip,lstrip,rstrip)で気をつけること

# stripを使った文字列の除去
紹介内容
1. 変数に代入する場合
2. 文字列の順番

## 1. 変数に代入する場合
pythonである文字列を除去する方法で，以下の操作があります．

- <b>strip</b> : 文字列の先頭および末尾部分を除去したコピーを返す
- <b>lstrip</b> : 文字列の先頭の文字を除去したコピーを返す
- <b>rstrip</b> : 文字列の末尾の文字を除去したコピーを返す

大事なのは「<b>コピーを返す</b>」という部分．
コピーをそのまま出力(print)した場合と，変数に代入してから出力する場合で，結果が異なることに注意する．

### strip
文字列の先頭および末尾部分を除去したコピーを返す

```Python
# そのまま出力
a="abcdaeadcba"
print(a.strip("a"))
## 出力
### "bcdaeadcb"

# 代入してから出力
b="abcdedcba"
bs=b.strip("a")
print(bs)
## 出力
### "bcdedcb"

```

### lstrip
文字列の先頭の文字を除去したコピーを返す

```Python
# そのまま出力
a="abcdaeadcba"
print(a.lstrip("a"))
## 出力
### "bcdaeadcba"

# 代入してから出力
b="abcdedcba"
bs=b.lstrip("a")
print(bs)
## 出力
### "bcdedcb"

```

### rstrip
文字列の末尾の文字を除去したコピーを返す

```Python
# そのまま出力
a="abcdedcba"
print(a.rstrip("a"))
## 出力
### "bcdaeadcba"

# 代入してから出力
b="abcdedcba"
bs=b.rstrip("a")
print(bs)
## 出力
### "bcdedcb"

```

## 2. 文字列の順番
文字列「www.example.com」から「example」以外を除去する場合，以下のような書き方がある．

```Python
# パターン1
print('www.example.com'.strip('www.').strip(".com"))
## 出力
### "example"

# パターン2
print('www.example.com'.strip('cmowz.'))
## 出力
### "example"
```

stripで除去する文字列を指定する場合，引数は「<b>文字列集合</b>」として扱われる．
そのためパターン2では，"www.example.com" 内に含まれる"cmowz."という6種類の文字列が除去される．


## 参考
https://docs.python.org/ja/3/library/stdtypes.html?highlight=strip
ルート権限の無いCentOSにGCCを野良ビルドする

# はじめに
root権限の無いCentOS7.3＆GCC-4.8.5の環境で色々試行するため，とりあえず新しいGCC-9.3.0を自分のhomeディレクトリ内に野良ビルドしたいと思います。

# 準備
GCC、GMP、MPFR、MPCを以下からそれぞれダウンロードしておきます。
- https://gcc.gnu.org/
- https://gmplib.org/
- https://www.mpfr.org/
- http://www.multiprecision.org/

今回用いたバージョンは，gcc-9.3.0，gmp-6.1.2，mpfr-4.1.0，mpc-1.1.0です。現時点でgmp-6.2.0が最新版の様ですが，エラーが生じ~~て面倒なので，~~たため1つ前のバージョンを用いました。[古いGCCだとgmp-6.2.0でエラーが生じるようです。](https://www.hi-matic.org/diary/?20200205)

# ビルドとインストール
共有で使用している環境なので，できるだけ自身のhome内で完結できる様にするため，とりあえずtoolsというディレクトリを作り，その中にインストールしていきたいと思います。

最初に，ダウンロードしたgccを解凍し，gcc_workという作業用ディレクトリに名前を変更します。
次に，gcc_work内にgmp，mpfr，mpcというディレクトリ名で，それぞれ解凍したものを保存しておきます。
gcc_work内にbuildディレクトリを作成＆移動し，configure，make，make installを行います。

```
tar Jxfv gcc-9.3.0.tar.xz
mv gcc-9.3.0 gcc_work

tar xfv gmp-6.1.2.tar.bz2
mv gmp-6.1.2 ~/tools/gcc_work/gmp

tar Jxfv mpfr-4.1.0.tar.xz
mv mpfr-4.1.0 ~/tools/gcc_work/mpfr

tar xzf mpc-1.1.0.tar.gz
mv mpc-1.1.0 ~/tools/gcc_work/mpc

cd gcc_work
mkdir build
cd build

../configure --prefix=$HOME/tools/gcc-9.3.0 --enable-languages=c,c++,fortran --disable-multilib
make -j 12
make install
```
今回は，C，C++，Fortranを使用するので，configureのオプションは上記のようにしました。元のGCCと使い分けのため，インストール完了後に$HOME/binを作成し，後ろに93を付けてシンボリックリンクを作成します。

```
cd ~/bin/
ln -s ~/tools/gcc-9.3.0/bin/gcc gcc93
ln -s ~/tools/gcc-9.3.0/bin/g++ g++93
ln -s ~/tools/gcc-9.3.0/bin/gfortran gfortran93
```
また，以下を.bash_profileへ追記しました。

```
export PATH=$PATH:$HOME/.local/bin:$HOME/bin
export LD_LIBRARY_PATH=$HOME/tools/gcc-9.3.0/lib64:$LD_LIBRARY_PATH
```
以上で，取りあえずGCC-9.3.0が動くようになりました。
selfとは

#selfとは
オブジェクトそのもの。メソッドの中では、そのメソッドが属しているインスタンスをselfという名前の擬似変数で参照できる。他の言語でいうthis。
#selfの特徴
メソッドの中で、レシーバを省略したメソッド呼び出しが行われた時は、selfがレシーバとなる。
レシーバは省略できる場合には省略することが多い。
#使い方
```
class Numbers
  attr_accessor :number
  def set_number
    self.number = 30 #このクラスのnumberを呼んだ時に30を入れておく
  end
end

num1 = Numbers.new
num1.set_number
num1.number # => 30
```
Office365 Message Encryption を用いて gmail でメールを受け取った場合の画面。

# この記事は
Office 365 Message Encryption を用いて、保護されたメールを gmail など外部メールで受信すると、
gmail や yahoo といった (O365から見て) 外部の認証プロバイダでの認証、もしくはワンタイム パスコードによる文章の閲覧が可能となります。

これは Exchange Online により提供される機能です。

# 具体的な画面の例
## 受信時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94849/094fd322-dde4-641f-f25b-848a49bf0f8f.png)

## 開封時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94849/69db992b-71ef-8c30-3bfc-f9639061812c.png)
Railsアプリを5.1.7→6.0.3.2(最新版)にアップデートしてみた

#プログラミングの勉強日記
2020年8月11日　Progate Lv.226
Railsのバージョンが古いままアプリを作成したので最新版にアップデートしてみた。

#方法

##1. Gemfileのrailsを書きかえGemfileをアップデートする

```:Gemfile
#変更前
gem 'rails', '~> 5.1.7'

#変更後
gem 'rails'
```

```:ターミナル
$ bundle update
```

##2. [重要]routes.rbなどを上書きしないようにする！！

```:ターミナル
rails app:update
```

##3. bootsnapをGemfileに追記する
 rails 5.2.0から`bootsnap`のGemが必要になったのでGemfileを追記しインストールする

```:Gemfile
gem 'bootsnap'
```

```:ターミナル
$ bundle install
```

##4. サーバーを動かして確認

```:ターミナル
$ rails s
```

#はまったこと
　2番の動作を飛ばしてしまったため、routes.rbの中が書きかえられてしまいルーティングエラーになってしまった。幸い別のフォルダでアプリのバックアップ？をとっていたので、routes.rbを書きかえる（もとに戻す）ことができた。
　アプリを更新するときは、注意事項をよく確認して、バックアップをとることが望ましい。
[Oracle Cloud] Autonomous Database で、AWR Report ・AWR SQL Report を出力してみる

# はじめに

Autonomous Database で、AWR レポートと、AWR SQL レポートを取得する方法を紹介します。概要を説明すると、AWR レポートは、Oracle Database インスタンス全体に関わる性能レポートです。AWR SQL レポートは、SQL クエリーとしての性能レポートです。

Autonomous で自律的にパフォーマンスが向上するものの、どういった SQL にどれくらいの時間が掛かっていて、それがどんな実行計画で処理されているかは気になるはずです。

今回は、Oracle SQL Developer をつかって取得する方法を紹介します。



# Oracle SQL Developer で接続方法

[こちら](https://qiita.com/sugimount/items/134e4fb98c514f922149) で接続方法を紹介しています。Wallet ファイルを、読み込むことで接続が出来ます。



# AWR Report

Autonomous Database へ接続出来ている状態から、VIew → DBA を選択します。

![1597054428344.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/3276f543-910d-99ed-4f9b-13d914b7588e.png)



Performance → AWR → AWR Report Viewer を選択します。

![1597071055548.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/9bdfb549-6296-941a-c845-6027250af168.png)



Browse を選択すると、AWR Snapshot の一覧から選べるため、そこから AWR Report を出力する2点のSnapshot を選択します。この開始と終了の間の期間に関するレポートとなります。Snapshot を選択したあとに、実行ボタンを押します。

![1597071147574.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/498fc94c-4799-b11a-7bf0-9b111e003990.png)



AWR Report が生成されます。

![1597071187718.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/4cba6372-cc85-87ba-e7fc-122bd411690f.png)



時間の掛かっているSQLの Top10位が含まれています。

![1597071297396.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/60b51d81-1b27-bc29-f006-ae567f7ffd19.png)



AWR Snapshot は一定時間お気に消えるので、後でじっくり読みたい場合は、HTML として保存すると良いです。フロッピーボタンから保存できます。

![1597071355277.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/c68828dd-f721-9448-04d4-f0f20c587768.png)



# Deference Report Viwer

2 個の AWR Report を比較することが出来ます。サービス開始当初の時に性能で問題が無かった時の AWR Report と、現在性能問題が発生しているときの AWR Report を比較することも出来ます。正常時と異常時を比較することで、何がどれくらい変わったのかを簡単に解析が出来るため、便利な機能です。

今回は紹介にとどめておきます。

![1597071495744.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/7a59321d-8b63-0cfb-f59d-d4df676c9588.png)



# AWR SQL Report

SQL単体での性能を解析するための、AWR SQL Report です。Performance → AWR → SQL Report Viewer を選択します。

![1597054496619.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/edf3af52-da8b-fe0e-e102-ac64d3dfdb73.png)



AWR Report を実行したときの Snapshot の ID と、実行時間が長くて詳細を確認したい SQL の SQL ID を入力します。その後、実行ボタンを押します。

![1597071795295.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/a4a18dc6-e9ee-a34f-8297-ad921da28eff.png)



過去、SQL を実行したときの実行計画や、実行計画で予測した取得行数などを確認できます。

![1597071871106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/b64bb81d-1818-972b-d4df-824ead0e8856.png)
QiitaのContributionはどうやったら上がるのか

QiitaのContribution計算方法が変わりました。
現時点ではユーザが新旧どちらのContributionを表示するか選択できるようです。
新しい計算方法についてはQiita公式の記事がとてもわかりやすいので、そちらを参照してください。
（@t13801206 さんコメントありがとうございました。 ）

* [Contributionとは](https://help.qiita.com/ja/articles/qiita-contribution)
* [Contribution計算に含める項目を追加します](https://blog.qiita.com/add-items-for-calculating-contribution/)


以下は、旧方式についての記事になります。

# はじめに
最近、Qiitaの投稿を頑張りだしたので、せっかくやるなら**Contributionの定義**や、**Contributionはどうやったら上がるのか**についても仕組みをちゃんと理解しようと思い、ちょっと調べてみました。

# Contributionの定義

以下、Qiita公式の記事から引用となりますが、Contributionは以下のように定義されていました。

https://help.qiita.com/ja/articles/qiita-contribution
>Contribution (コントリビューション) とは貢献度を意味し、投稿した記事がLGTMされることや編集リクエストが受け入れられた記事がその後LGTMされることで数値が上がっていきます。また、コメントに対してLGTMされることによっても数値は上がります。 編集リクエストによる貢献は投稿した記事の貢献の10分の1とし、10を最大とします。 コメントによる貢献は投稿した記事の貢献の2分の1とし、上限はありません。 

以下のQiita公式の記事でContributionやLGTMについて詳しく書かれているので、興味がある方はこちらにも目を通してみてください。

* [投稿記事やコメントに「いいね」できるようになりました（Contributionの算定基準も変わります）](https://blog.qiita.com/153200849029-2/)[^1]
* [Qiitaの「いいね」が「LGTM」に変わります](https://blog.qiita.com/like-to-lgtm/)

[^1]: 「いいね」が「LGTM」に変わるより前の古い記事ですが、Contributionの算定基準変更の記事はこれしか見つからなかったので、引き続きこの算定基準が利用されていると認識しています :thinking: 教えて中の人 :raised_hand: 

# Contributionはどうやったら上がるのか

先程の内容を簡単な表にしました。

| Contributionが上がるLGTM対象| Contributionの上昇値<br/>（1LGTMあたり）|上限値|
|:-:|:-:|:-:|
|自分が投稿した記事|1|なし||
|自分が書いたコメント|0.5|なし||
|編集リクエストを送信した記事[^2]|0.1|10|

[^2]: **編集リクエストを送った後に増えたLGTM数**が対象になります。

**Contributionを上げたい**のであれば、**正攻法でちゃんと良い記事を投稿していく**のが良さそうですね :thumbsup: 
次点としては、**記事への良いコメント**を心がけると良さそうです。

ちなみに、**LGTMされずにストックだけされた場合はContributionは上がらない**ようでした。
ストックされるような記事は貢献度が高い気がするので、何かしら上がっても良いのでは？と思い、少し調べたところ、当時の @mono0926 さんの記事 - [Qiitaの「いいね」について思うこと](https://qiita.com/mono0926/items/bea86a60977287c0e361) - でも同じ内容について言及されていました。 
記事の内容だけではなく、コメント欄での @mono0926 さん、 @koher さん、 @7of9 さんの意見交換も興味深かったです。

> Contribution への影響
>
> 大体良いと思いましたが、ストックだけされた時に、Contributionが全く変わらないのはどうかなと思いました。
> ストックされるような記事は貢献度高いのでは？
> 個人的には、現状の仕様を元に以下のようにする予定ですが、やはりストックがContributionへの影響度ゼロというのは違和感あります。
https://qiita.com/mono0926/items/bea86a60977287c0e361#contribution-への影響



# Contributionが上がった理由を確認する方法

**Contributions 履歴**を確認する事で、**Contributionの数値が上がった理由**を確認できます。
Qiitaのトップページや、マイページに表示されている自分のContributionsをクリックすることで、**Contributions 履歴**を表示することができます。
![contribution.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63892/96bdbdb2-1c2b-897f-656e-2eea189fb2c8.png)

確認してみると上述したように、自分が**投稿した記事**だけではなく、

* 編集リクエストを送信した記事
* 他の方の記事に書いたコメント

といったものへのLGTMによっても、Contributionの数値が上がっていることがわかります。
![contribution_up.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63892/ab184f25-4f3a-a8c0-8093-948045e74f88.png)

# 参考情報
* [Contributionとは](https://help.qiita.com/ja/articles/qiita-contribution)
* [投稿記事やコメントに「いいね」できるようになりました（Contributionの算定基準も変わります）](https://blog.qiita.com/153200849029-2/)
* [Qiitaの「いいね」が「LGTM」に変わります](https://blog.qiita.com/like-to-lgtm/)
* [Qiitaの「いいね」について思うこと](https://qiita.com/mono0926/items/bea86a60977287c0e361)
AIP クライアントのリセット方法(トラブルシューティング)

# この記事は
Azure Information Protection (AIP) の分類と保護 では、AIP のクライアントソフトウェアと併せて利用する方法があります。

ほかにも Office のバージョン 1910 以降では、内蔵された秘密度ラベル クライアント を利用する方法もあります。

まず、AIP クライアントが想定通り動作しない、動きがおかしい といった場合は、トラブルシューティングとして、設定のリセットが有効です。

# リセット方法
1. 任意のファイル上で右クリックし、[分類して保護する]  を選択します。
2. AIP Client を起動し、[ヘルプとフィードバック] を選択します。
3. [設定のリセット] を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94849/96686abc-ad0b-a3f3-e909-68ee7904aa23.png)
GCPLBのマネージドSSL証明書にGlobalSignが加わっていた話

便利ですよね、GCPLBのマネージドSSL。試験環境では大いに利用させてもらってます。
Let's Encryptで作成されているとばかり思っていたのですが(実際これまではそうでした)、ある時、GlobalSignで作成されていることに気がつきました。

|Let's Encrypt|GlobalSign|
|:---|:---|
|![LetsEncrypt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8075/f2df1e29-f739-85f9-62c0-4b0b518c652c.png)|![GlobalSign.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8075/05be06df-e888-3ffb-0485-8511bf56a3b9.png)|

### マネージド証明書のCAは選択指定OK
調べてみると、ドキュメントに記載がありました。[^1]

>#### Google マネージド証明書への署名が許可されている CA の指定
>DNS サーバー ソフトウェアで、Google マネージド証明書への署名を許可する CA を指定します。pki.goog、letsencrypt.org、またはその両方を選択できます。

### pki.goog とは？

`pki.goog` は、Googleが自社用に運営するルート認証局「Google Trust Services」のことで、 https://pki.goog/ にアクセスすると確認できます(知らなかったのですが、2017年にGlobalSignの認証局R2/R4を買収していたそうです。[^2])。

### 認証局にどちらを利用するのか決められるの？
こちらもドキュメントに記載があります。

>DNS サーバーソフトウェアで、Google マネージド証明書への署名を許可する CA を指定します。pki.goog、>letsencrypt.org、またはその両方を選択できます。

つまり、DNSサーバーで認証局を指定するCAAレコードを登録しておけば良いわけです。

```
test.example IN CAA 0 issue "letsencrypt.org"
test.example IN CAA 0 issue "pki.goog"
```

片方だけ、例えば `letsencrypt.org` だけ登録しておくと、そちらのみを認証局として利用します。
CAAレコードに両方を登録 or 未登録の場合は、どちらを使うかはGoogleが勝手に選択するようです。

### 差はあるの？
サポートに聞いたところ、どちらの認証局を利用しても、費用(無料)や制約に違いはないとのこと。
どちらの証明書の有効期間も3ヶ月でした。

### まとめ
* GCPLBのマネージドSSL証明書は現在、Let's Encrypt と GlobalSign の2種類がある。
* 特に指定をしなければ、どちらかにするかはGoogleが選択する。
* 指定したい場合は、DNSサーバーにCAAレコードを登録する。ただし、両方登録しておくのがベター

[^1]: https://cloud.google.com/load-balancing/docs/ssl-certificates/google-managed-certs?hl=ja#renewal
[^2]: https://rms.ne.jp/digital-certificate-news/googletrustservices
最初の n 個の素数の総積プラス 1 が素数かどうか


# 1

素数が無限に存在することは古代ギリシャで既に知られていた。
紀元前に編纂された『<ruby>原論<rt>ストイケイア</ruby>』には以下のような感じの証明が書かれているとか。

素数が 3 個しか無いとしよう。これを $p$, $q$, $r$ とする。
$pqr+1$ は $p$, $q$, $r$ のどれで割っても $1$ が余る。
これは素数が $p$, $q$, $r$ だけという仮定に反する。
（この論法は素数が 4 個でも 5 個でも同様。つまり，素数が有限個と仮定すれば必ず矛盾が導かれる）

背理法（仮定 A から矛盾を導いて A の否定を証明する論法）を使っている。
中学でこの証明に出会ったときちょっとした感動を覚えた。
背理法がカッコよかったし，「全素数の総積プラス 1」という単純な式から実に簡単に矛盾を引き出したところが見事だと思った。

# 2

同じ頃「大きな素数探し」というテーマがあることを知った。
電子計算機の進歩とともに，手計算では到底見出せないような巨大な素数が次々見つかり，何年にどこの誰がどんな素数を見つけた，というような一覧表が作られているのも何かで見た。

# 3

私のような素人は，『原論』の件の証明を思い出して，ついこんな間違ったことを考えついてしまう。

見つかった素数を全部掛け合わせて 1 を足せば簡単に巨大素数が得られるじゃん！

もちろんそんなはずはない。
有限個との仮定から，その総積プラス 1 がどれでも割り切れない，という事態が導かれただけのことだ。実際には素数は無限にあり，そこから有限個の素数をとり出して掛け合わせて 1 を足したからといって，それが素数になるとは限らない。

# 4

しかしだよ？
$n$ 個の素数の総積に 1 を足した数は，少なくともそれらの素数では割り切れない。だから，ある意味「割り切りにくい数」であるとはいえるのではないか。
もっと言えば，そいつらの中にけっこう素数があるんじゃないか？

エラトステネスの<ruby>篩<rt>ふるい</ruby>を考えると，合成数を排除するには小さい素数の倍数を排除すると効率が良さそうな気がする。

それゆえ，素数を小さい順に並べて，最初の $n$ 個を取り，それらの総積に 1 を足して試すのがよさそう。

# 5

まず，最初の素数 $2$ を取り上げる。
これに $1$ を足した $3$ は素数だ。

次。
$2\cdot3+1=7$ は素数。いいね。

$2\cdot3\cdot5+1=31$ も素数。うーん，いい調子。

$2\cdot3\cdot5\cdot7+1=211$ はどうだ？
$11$ でも $13$ でも割り切れないのはすぐに分かる。$17^2$ は $211$ を越えてしまうから試す必要もない。
素数と分かった。んー，なんか話がうま過ぎない？
ここまで，手計算でがんばった。

$2\cdot3\cdot5\cdot7\cdot11+1=2311$ はどうだ？
手計算は諦めた。そう難しくはないが，計算間違いをしないという自信が無い。

ここでターミナルに

```
irb -r prime
```

と打つ。
これで，Ruby の対話環境が起動し，素数ライブラリーである `prime` が読み込まれた状態になる。

そして，

```irb
irb(main):001:0> 2311.prime?
=> true
```

おおー，これも素数か！
（ある整数が素数であることは [Integer#prime?](https://docs.ruby-lang.org/ja/2.7.0/method/Integer/i/prime=3f.html) で確認できる）

まさかこんなにうまく素数ばかり出てくるとは思わなかった。

# 6

ではプログラムで組織的に調べてみよう。
Ruby で以下のように書く。

```rb
require "prime"

1.step do |n|
  m = Prime.take(n).inject(:*) + 1
  puts "%3d %s %d" % [n, (m.prime? ? "o" : "x"), m]
end
```

このプログラムは止まるように書いていない。形式上は無限に調べ続けるようになっている。

`Prime.take(n)` で最初の `n` 個の素数の配列が得られる。

`inject(:*)` でその総積が得られる。

そして，

* `n` の値
* 素数かどうか（素数なら `o`，そうでないなら `x`）
* 「総積プラス 1」の値

とを並べて表示するだけ。

# 7

結果は以下のようであった。

```
  1 o 3
  2 o 7
  3 o 31
  4 o 211
  5 o 2311
  6 x 30031
  7 x 510511
  8 x 9699691
  9 x 223092871
 10 x 6469693231
 11 o 200560490131
 12 x 7420738134811
 13 x 304250263527211
 14 x 13082761331670031
 15 x 614889782588491411
 16 x 32589158477190044731
 17 x 1922760350154212639071
 18 x 117288381359406970983271
```

$n ＝ 18$ までは一気に進むが，そこから先はいつまで経っても進まない。

$n = 5$ までは素数だったのに，そのあとは合成数が続く。うーむ残念。

$n = 11$ でようやくまた素数が現れたと思ったら，またまた合成数が続いていく。

「けっこうな割合で素数が含まれているのでは」と思ったのはやはり幻想だったか。
ログ管理とは？

#ログ管理とは？

- サーバー管理者がログ(データの履歴)の情報を収集して管理すること。

- ログにはトラブルが発生した形跡が何かしら残されていることが多い。その為サーバーの管理者は、何かトラブルが起こった時に平常時のログと比較をすることで、問題点を洗い出し、解決へと導くことができる。

#2種類のログ

ログは大きく分けて以下の２つに分類できる。

1. **失敗しているログ**
ex) アクセス権限のないユーザーがアクセスした形跡


2. **成功しているログ**
ex) アクセス権限があるユーザがアクセスした形跡

**※管理者が絶対にチェックしなければいけないのは、「権限のあるユーザーがアクセスに失敗しているログ」や「権限のないユーザーがアクセスに成功しているログ」といった`想定から外れた存在してはいけないログ`である。**

#実際にログ管理でやること

どのようなログがあるかを把握した上で、以下の３点に取り組む

1. **ログを残す**

2. **有事の際にログを解析・分析する**

3. **ログの記録をもとに、現状把握や将来予測を行う**
RMS の権限設定について

# この記事は
AIP や ADRMS で利用される権限設定は、旧来より下位互換性のために定義されているものもあり、
一部不明瞭な点や分かりにくい点があるのも事実です。
ここでは、細かい事項もありますが、まとめていきたいと思います。

[https://docs.microsoft.com/ja-jp/azure/information-protection/configure-usage-rights]
(https://docs.microsoft.com/ja-jp/azure/information-protection/configure-usage-rights)

# AIP クライアントの保護設定と、他ユーザーの権限の対応
|【AIPクライアント】でのアクセス許可の選択|閲覧|編集|コピー|印刷|保存|エクスポート|プログラムを利用して文章にアクセスする|フルコントロール|
|:-----:|:---------|:---------|:---------|:---------|:---------|:---------|:---------|:---------|
|自分のみ|×|×|×|×|×|×|×|×|
|共同所有者(すべてのアクセス許可)|〇|〇|〇|〇|〇|〇|〇|〇|
|共同作成者(表示、編集、コピー、印刷)|〇|〇|〇|〇|〇|×|〇|×|
|レビュー担当者(表示、編集)|〇|〇|×|×|〇|×|〇|×|
|閲覧者(表示のみ)|〇|×|×|×|×|×|〇|×|

# 権限名と、保護設定名の対応
|権限名|保護設定名|
|:-----------:|:-----------------|
|閲覧|VIEW|
|編集|DOCEDIT|
|コピー|EXTRACT|
|印刷|PRINT|
|保存|EDIT|
|エクスポート|EXPORT|
|プログラムを利用して文章にアクセスする|OBJMODEL|
|フルコントロール|OWNER|

# 各権限の補足
## 各権限の動作について
各権限でどのように動作するかは、アプリケーションの実装に依存します。
つまり、アプリケーションの実装方式によっては、権限と厳密に合致しない動作に至る場合があります。
これは、製品によって動作の一貫性が保証されていないことを示しています。

## 保存とエクスポートについて
- 保存は、現在の保護形式のまま、編集したファイルを書き出すことを意味します。
- エクスポートは、保護を解除して、ファイルを書き出すことを意味します。
- 例えば、Office ファイルをPDFに出力する動作は 「エクスポート」 が該当します。

## VIEWRIGHTSDATA・EDITRIGHTSDATA
下位互換性のため存在します。AIP / Office では実装されていません。

## コピーについて
コピーはコンテンツの複製を制御を制限します。この複製にはスクリーンキャプチャや、画面共有なども含まれます。
そのため、例えば画面共有などを行うと、共有先に対して真っ黒な画面が表示されることがあります。
@(インスタンス変数)とは

#@変数とは
アットマークで始まる変数は「インスタンス変数」と呼ばれ、自クラスやサブクラスから参照できる。
#インスタンスとは
インスタンスは何らかの具体的なモノ、動いている、動かせる、出現する、消滅するモノである。クラスを雛形として作られる。
「たこ焼き機がクラスでたこ焼きがインスタンス」
pyinstaller: error: argument --add-binary: invalid add_data_or_binary value:が出たときの対処法

Selenium WebDriverを使用しているpythonスクリプトをpyinstallerで実行ファイル（exe）に変換する場合、デフォルトだと実行ファイルにWebDriverが含まれないため、--add-binaryオプションを使用して下記の様なコマンドを実行する必要があります。

```
pyinstaller ./main.py --onefile --noconsole --add-binary "WebDriver格納先パス;実行ファイル保存先パス"
```



ところが、Unix環境（MacOSX含む）で上記を実行すると、下記のようなエラーメッセージが出力され、実行不可となってしまうことがあります。

```エラーメッセージ
pyinstaller: error: argument --add-binary: invalid add_data_or_binary value: 'WebDriver格納先パス;実行ファイル保存先パス'
```

下記サイトで調べてみたところ、--add-binaryで指定するパスのセミコロン(;)になっている箇所をコロン（:）に置き換えてあげればOKのようです。
試しにこれで実行してみたらうまくいきました。

https://github.com/pyinstaller/pyinstaller/issues/3968

```
pyinstaller ./main.py --onefile --noconsole --add-binary "WebDriver格納先パス:実行ファイル保存先パス"
```

自分はMac OS Xの環境で実行してたら今回の事象に遭遇しました。
結構解決まで手こずったので、同じ事象で悩んでいる方の助けになれば幸いです。
[GitHub Actions]GitHubにタグを作ったら自動的に.NETクラスライブラリのNuGetパッケージを公開する

## やりたいこと

ちょっとしたNETクラスライブラリをNuGetで公開したいのですが、バージョン番号の管理がちょっと面倒です。
(NuGetのバージョンと、アセンブリのバージョンと、gitのタグは合わせほうがいいです。)

やり方は色々とありますが、この記事ではなるべくシンプルに、GitHubにプッシュしたタグ(v1.0.1)をトリガーに、NuGetのpublishまでを自動的に行うようにGitHub Actionsを設定するようにしました。

## 事前準備

1. [NuGet](https://www.nuget.org/)でAPI Keyを作成しておく。
2. ビルドする対象のプロジェクトの*Settings* -> *Secrets* に、`NUGET_API_KEY`という名前でNuGetのAPIキーを設定しておく。
3. `.csproj`ファイルのパッケージに関する設定は、Versionを除いて適切に設定しておく。

## GitHub Actions

下記のファイルをリポジトリに追加します。

```yaml:.github/workflows/release.yml 
name: .NET Core

on:
  push:
    tags:
      - 'v*'

jobs:
  build:

    runs-on: ubuntu-latest
    env:
      DOTNET_NOLOGO: true

    steps:
    - uses: actions/checkout@v2

    - name: Setup .NET Core
      uses: actions/setup-dotnet@v1
      with:
        dotnet-version: 3.1.x

    - name: Install dependencies
      run: dotnet restore

    - name: Build
      run: dotnet build --configuration Release --no-restore -p:Version=${GITHUB_REF/refs\/tags\/v/}

    - name: Packaging
      run: dotnet pack --include-symbols --configuration Release --no-build --output nupkgs -p:PackageVersion=${GITHUB_REF/refs\/tags\/v/}

    - name: Nuget Push
      run:  dotnet nuget push nupkgs/*.nupkg -k ${{ secrets.NUGET_API_KEY }}  -s https://api.nuget.org/v3/index.json
```

GitHubのReleaseにもアップロードするなら、もう少し手直しが必要です。

### 簡単な解説
- `v`で始まるタグがpushされた時に実行されます。
- Windowsだとビルドが遅いのでOSはubuntuにしてます。
- dotnetバージョンは、マイナーバージョンの指定が面倒なので`3.1.x`にしてます。
- `${GITHUB_REF/refs\/tags\/v/}`は、タグ名の`refs/tags/v1.0.1`を`1.0.1`に置き換えます。
- `dotnet build`コマンドの`-p:Version=`でアセンブリのバージョンを指定しています。
- `dotnet nuget push`コマンドの`-p:PackageVersion=`でNuGetのパッケージのバージョンを指定しています。
- Testは別のActionsで実行する想定です。
「Lightning - Procedural Lightning」について紹介

この記事は「[Unityアセット真夏のアドベントカレンダー 2020](http://assetstore.info/eventandcontest/adventcalendar/summer-advent-calendar-2020/)」の、11日目の記事になります

昨日は[すしさん](https://twitter.com/mamesiva64)の「[夏なので洞窟を掘って探検したい](https://alpacatech.hateblo.jp/entry/20200810)」でした
明日は[Jaol-Industryさん](https://www.jaol-industry.com/)の「え！！５分で３８言語対応を！？　できらあっ！【AutoLocalization】」です

# はじめに
今回はライティングエフェクトのアセットの紹介です
[Lightning - Procedural Lightning - AAA Quality, Performance and Sound. Dozens of Prefabs. 2D + 3D.](https://assetstore.unity.com/packages/tools/particles-effects/lightning-procedural-lightning-aaa-quality-performance-and-sound-34217?utm_source=twitter&utm_medium=social&utm_campaign=jp-advent-calendar-summer)

Lightning - Procedural Lightning - は色んなライティングエフェクトを実現できるアセットです。カスタマイズは簡単、レンダリングはGPUで完結、性能低いモバイルデバイスをサポートするタイプもいくつがあります


# 基本的な使い方

[公式の紹介動画](https://www.youtube.com/watch?time_continue=10&v=jt-VjZRK-r4&feature=emb_logo)

コーティングは要らなくて、基本的にStart Point、End Pointとアセット用意してるプレハブを設置すれば、後は設定をカスタマイズするだけです

Lightning - Procedural Lightning - は色んなライティングエフェクトを実現できるですが、ここは個人よく使ってる「LightningBoltPrefabHDR」で紹介させていただきます

###### ◾️ LightningBoltPrefabHDR：
<img width="423" alt="スクリーンショット 2020-08-08 16.01.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269852/95afdf54-6839-ca2c-896e-52fd6157ef21.png">

###### ◾️ LightningBoltPrefabHDRの中身：
Start Point、End Poinの２つObjectだけ、シンプルです
<img width="432" alt="スクリーンショット 2020-08-08 16.05.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269852/c74d2942-e483-f09c-718e-113bf7727bce.png">

###### ◾️ Play：
Start Point、End PoinのPostion調整して、
UnityをPlayするとデフォルトのライティングが現れます
![Aug-08-2020 16-30-51.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269852/2207ae6d-ccd2-c631-ff6c-62607d7d0880.gif)


引き継ぎ、ライティングの色、マテリアルと次のライティングの待機時間を好きに調整します

###### ◾️ 色、マテリアル
<img width="388" alt="スクリーンショット 2020-08-08 16.31.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269852/fa370b8b-3082-20d2-3908-fcd4e7e3c81b.png">

###### ◾️ サイズなどカスタマイズ
<img width="394" alt="スクリーンショット 2020-08-08 16.32.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269852/86ea27e6-bce1-fae9-fab3-6471c95e88b4.png">

ここでは待機時間とライティングの色だけ編集しました
自作ゲームの話になりますが、嵐や天気大荒れなどの背景ではよくこの感じで使います
操作シンプル、しかも速い！
![Aug-08-2020 16-44-42.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269852/0a3a2436-5e7d-0883-c413-471a92cdb115.gif)



# 終わりに
同じ作者も無料のライティングアセットがあります
[Lightning Bolt Effect for Unity](https://assetstore.unity.com/packages/tools/particles-effects/lightning-bolt-effect-for-unity-59471)

[Lightning - Procedural Lightning - AAA Quality, Performance and Sound. Dozens of Prefabs. 2D + 3D.](https://assetstore.unity.com/packages/tools/particles-effects/lightning-procedural-lightning-aaa-quality-performance-and-sound-34217?utm_source=twitter&utm_medium=social&utm_campaign=jp-advent-calendar-summer)は少し高めなアセットですが、個人的に「色んなライティングエフェクトがあり」、「コーティングは要らなくて、使い方法とカスタマイズは簡単」この２点に魅了されてこのアセットを購入しました

「[Unityアセット真夏のアドベントカレンダー 2020](http://assetstore.info/eventandcontest/adventcalendar/summer-advent-calendar-2020/)」の、11日目の記事は以上になります
LocustでWebサイトの性能測定をする(とりあえずDockerで動かしてみた編)

# はじめに
Webサイトの性能測定といえばJMeterが定番な感じだが、そもそもなかなか起動させるまでの道のりが長くて学習コスト的にアレだったので、シナリオがPythonでお手軽に書けるという噂のLocustを使ってみた。

今回は、EC2でDockerでインストールしてとりあえず動かすところまで。
ちなみに、t2.microでは動作が不安定なので、t3.mediumくらいで起動すると良い感じであった。

# Dockerのインストール
これはもう定番の手順だけど一応書いておく。

```:yumの最新化
$ sudo yum update -y
```
```:Dockerのインストール
$ sudo yum install -y docker
```
```:Dockerの開始
$ sudo service docker start
```
```:ec2-userをdockerグループに追加
$ sudo usermod -a -G docker ec2-user
```

ここで1回ログアウトして再ログイン(セッションを作り直さないと設定が反映されない)。

```:Dockerの起動確認
$ docker info
```

↓こんな感じで標準出力されればOK。ダメならDockerが起動してないとかなんとかといったメッセージが出る。

```
Client:
 Debug Mode: false

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
(以下略)
```

```:docker-composeインストールのためにユーザ変更
$ sudo -i
```

```:docker-composeを拾ってきてインストール(バージョンは適宜変更する)
# curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
```
```:パーミッション変更
# chmod +x /usr/local/bin/docker-compose
```
```:戻る
# exit
```

これでDockerの仕様準備完了！簡単！

# Locustの動くコンテナを作る
以下のようにDockerfileを書こう。
Pythonを動く環境を作って、locustをインストールして、ローカルのlocustfile.pyをコピーして起動！
ファイルはlocustfile.py固定になってしまうので、適宜変更したらリロードして起動する。

```Dockerfile:Dockerfile
FROM python

RUN pip install locust

WORKDIR /locust
COPY ./locustfile.py .

CMD ["locust"]

```

これを、docker-compose.yml で設定して```docker-compose up```する。

```YAML:docker-compose.yml
version: '3'
services:
  locust:
    build: .
    ports:
      - "8089:8089"
```

だがちょっと待て。肝心のlocustfile.pyが無いと起動しない。
以下が起動のための最低セットだ。

```Python:locustfile.py
from locust import HttpUser, task, between

class QuickstartUser(HttpUser):
    wait_time = between(1, 1)

    @task
    def get_contents(self):
        self.client.get("/test-contents.html")
```

ちなみに、wait_time の属性には以下の3種類が設定可能だ。詳細は(公式のドキュメント)[https://docs.locust.io/en/stable/api.html#module-locust.wait_time]を参照。
小数点以下の値も設定可能。

- **between(min_wait, max_wait)**: トラフィック投入後にmin_wait~max_waitの範囲でwaitを入れる
- **constant(wait_time)**: トラフィック投入後に固定の秒数でwaitを入れる
- **constant_pacing(wait_time)**: トラフィック投入後、wait_time に合う時間分 wait を入れる。安定して負荷をかけたい場合はこの設定

試験対象のホストにはtest-contents.htmlを置いておこう。

さて、これで```docker-compose up```したら、EC2に8089でHTTP接続する。

# いざ、動かす！
HTTP接続すると、以下のように設定画面が出る。

![キャプチャ4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/b9acb138-377f-394e-6509-834e7cb7dc64.png)

接続ユーザ数と、ユーザ生成/秒と、ホスト名だ。
ホスト名の後ろに、locustfile.pyを付けてアクセスするイメージだ。

適当に値を入れて起動すると、

![キャプチャ5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/82ec8393-4a37-34f4-fe14-8a39ec40961e.png)

といった感じで負荷状況が表示される。

さらに、Chartsを選択すると、

![キャプチャ6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/b20709d0-23e7-c868-af9f-7b9da94ba5a7.png)

グラフも見られるぞ！

「Download Data」からこのグラフのネタが取れるかと思いきや、取れたcsvにはこの情報は含まれていなかった。なぜ……。

ということで、まずは性能測定の足掛かりができた！

# 追記
グラフの元ネタの数値はダウンロードできなかったが、グラフ右上の
![キャプチャ7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/628d028a-a608-2882-1669-ed39a0d6b7eb.png)
このボタンから、グラフのPNG画像はダウンロードできることが分かった。便利！
AWS CodeDeploy で Auto Scaling グループ に複数のターゲットグループを紐づける

お疲れ様です。
タイトルの通り備忘録です。
どこかの記事を参考にしたと思ったのですが、見つからなかったので知っている方がいれば教えてください🙇‍♂️

# 用意するもの
- appspec.yml
- 紐づけ処理用のシェルスクリプト（before_allow_traffic.sh）

以上

# appspec.yml
このファイルは、デプロイを管理するために CodeDeploy によって使用されるファイルです。

```appspec.yml
version: 0.0
os: linux
...中略...
hooks:
  BeforeAllowTraffic:
    - location: scripts/before_allow_traffic.sh
      timeout: 300
      runas: root
```

トラフィックを許可する処理で before_allow_traffic.sh を実行します。

# before_allow_traffic.sh
スクリプト内にTODOコメントが書いてありますが、
ターゲットグループを直接指定しています。
もしオリジナルのAuto Scalingグループから取得する方法があれば教えてください🙇‍♂️

```before_allow_traffic.sh
#!/usr/bin/env bash

# Blue/Greenデプロイ時にAutoScalingGroupのターゲットグループが空になるので、引き継ぐ
query "TargetGroups[*].TargetGroupArn" --output text)
autoscalingGroupName=$(aws deploy get-deployment --deployment-id ${DEPLOYMENT_ID} --query "deploymentInfo.targetInstances.autoScalingGroups" --output text)

if [[ "$autoscalingGroupName" != "None" ]]
then
  # TODO ターゲットグループは直接指定ではなくオリジナルから取りたい
  if [[ "${DEPLOYMENT_GROUP_NAME}" == "***DEPLOYMENT_GROUP_NAME***" ]]
  then
    aws autoscaling attach-load-balancer-target-groups --auto-scaling-group-name "$autoscalingGroupName" --target-group-arns "arn:aws:elasticloadbalancing:ap-northeast-1:**********:targetgroup/***TARGET_GROUP_NAME***/*********" "arn:aws:elasticloadbalancing:ap-northeast-1:**********:targetgroup/***TARGET_GROUP_NAME***/*********"
  fi
fi

```
Office の保護テンプレートを更新するには

# この記事は
AIP や AD-RMS では RMS の仕組みを使って IRM (文章の権限管理や保護) を実現します。
RMS では 保護テンプレート と呼ばれる保護設定を用いて、文章の保護を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94849/63fd4738-136a-87e3-5ee7-e229e548bb6f.png)

# 保護テンプレートの更新間隔
下記の公開情報にあるように、利用するサービスによって更新間隔は異なります。
[https://docs.microsoft.com/ja-jp/azure/information-protection/refresh-templates](https://docs.microsoft.com/ja-jp/azure/information-protection/refresh-templates)

特に Office の保護テンプレートは更新間隔が7日間であり、なかなか更新されづらいです。
特にテストなど、明示的に更新する場合は下記の手段を用いるのが手っ取り早いです。

1. 下記のレジストリを削除する
HKEY_CURRENT_USER\software\classes\local Settings\Software\Microsoft\MSIPC\< MicrosoftRMS_FQDN> テンプレート\<user_alias>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94849/279e54d6-4ed6-e42a-58d0-d391c349699c.png)
2. 下記のテンプレート フォルダからテンプレートを削除する。
%localappdata%\microsoft\msipc\templates
3. Office を再起動する。
ShellScriptでやっちまったので備忘録

#今回の失敗
　先日、shellscriptを書いていて、動いているコードをそのまま別のシェルに移植したら。。。
サーバから何もかもが消えた。。。orz
どうやら、「rm -rf /」を行った模様。
原因は、rmを行いたい変数の中に/しか入っていなかったことだった。

#これからどうするか
　以下のように変数内にアルファベット、または数字が入っていることを確認し削除を行う
if [[ "${変数名}" =~ [a-zA-Z0-9].* ]]; then
　rm -rf ${変数名}
fi
Rock64にSoftEther VPNをインストールのメモ

## SoftEther VPNのダウンロード元
https://www.softether-download.com/ja.aspx

SoftEther VPN (Freeware) -> Source Code of SoftEther VPN -> tar.gz package -> Any

```
tar -zxvf softether-src-*-*.tar.gz 
```

## ビルド方法

https://www.labohyt.net/blog/server/post-2209/
https://qiita.com/Shachihoko/items/543eea4c95153c719224

```bash
$ sudo apt install libreadline-dev libssl-dev libncurses-dev libz-dev
```

`-m64`は削除(新しいビルドでは必要ない)

`src/Cedar/Server.c`を編集

Makefileのインストールするディレクトリは書き換える

## systemdについて
https://qiita.com/kumasun/items/6fd9ddafc8ea6278f088

## ポート
UDP 500
UDP 4500
UIColorをアレンジしてみよう！！

いつも使っているUIColorをアレンジしてみたくないですか？？　基本的にswiftのコードではRGBを設定して色を設定しています。

##ファイルを作る
swiftファイルで以下のような設定をする

```swift:UIColorExtension.swift
import UIKit

extension UIColor{
    static func rgb(r:CGFloat,g:CGFloat,b:CGFloat) -> UIColor{
        return self.init(red: r/255, green: g/255, blue: b/255, alpha: 1.0)
    }
}
```
##こんな風に使うここができる！！

LabelをMain.storyboardにおきViewController.swiftと紐付けをする。名前はkeyakiName(完全に個人的な趣味でごめんなさい)で設置をする

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        keyakiName.text = "欅坂46"
        keyakiName.textAlignment = .center
        keyakiName.textColor = UIColor.rgb(r: 185, g: 223, b: 144)
    }
    @IBOutlet weak var keyakiName: UILabel!
}

```

<img width="300" alt="Simulator Screen Shot - iPhone 11 - 2020-08-10 at 23.19.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679508/0e733844-7940-481b-e408-b0f5f533479e.png">
こいう感じで応用することができます！！
是非このスキルを使ってみてください
【Python】データサイエンス100本ノック（構造化データ加工編） 024 解説

- データサイエンス100本ノックをやりきる会を作りました🎉
- こちらの[Slack招待URL](https://join.slack.com/t/data-science-100nocks/shared_invite/zt-gfncg9vm-8W8b3UrDg8R~TKaqUkQpgw)からご参加ください！！
- ぜひ一緒に励まし合いながら、データサイエンス100本ノックをやり切りたいと思っています！

##Youtube
[動画解説](https://youtu.be/d5jqQYlt9vw)もしています。

##問題
P-024: レシート明細データフレーム（df_receipt）に対し、顧客ID（customer_id）ごとに最も新しい売上日（sales_ymd）を求め、10件表示せよ。

##解答
```:コード
df_receipt.groupby('customer_id').sales_ymd.max().reset_index().head(10)
```

##出力
|  | customer_id | sales_ymd |
|--:|:--|--:|
| 0 | CS001113000004 | 20190308 |
| 1 | CS001114000005 | 20190731 |
| 2 | CS001115000010 | 20190405 |
| 3 | CS001205000004 | 20190625 |
| 4 | CS001205000006 | 20190224 |
| 5 | CS001211000025 | 20190322 |
| 6 | CS001212000027 | 20170127 |
| 7 | CS001212000031 | 20180906 |
| 8 | CS001212000046 | 20170811 |
| 9 | CS001212000070 | 20191018 |

##解説
・PandasのDataFrame/Seriesにて、同じ値を持つデータをまとめて処理し、同じ値を持つデータの合計や平均を確認したい時に使用します。
・**'groupby'は、同じ値や文字列を持つデータをまとめて、それぞれの同じ値や文字列に対して、共通の操作を（合計や平均）行いたい時に使います。**
・**'.sales_ymd.max()'は、'.sales_ymd'の最大値（=最も新しい売上日）を表示させます。**
・**'.reset_index()'は、'groupby'によってバラバラになったインデックス番号を0始まりの連番に振り直す操作を行いたい時に使います。**

※以下のコードでも、同じ結果を出力します（'.agg'を用いた場合）

```:コード
df_receipt.groupby('customer_id').agg({'sales_ymd':'max'}).reset_index().head(10)
```
"画像"で掲載される接触確認アプリ（COCOA）の利用状況を解析する / Tesseract

#厚生労働省から”画像”で発表されるCOCOAの利用状況を解析するProgramの構築
##はじめに
- 私自身、接触確認アプリ(COCOA)のダウンロード数と陽性登録数の推移をグラフでまとめている。毎日18:00頃に公式サイトを訪れデータをGoogle Sheetに書き込み、グラフ作成をするという作業をしていた。
- しかし、この手間が大変になってきたため、単純作業を自動化できないかと思ったのがきっかけである。
- 厚生労働省から掲載される情報はテキストが画像化されており、このデータを自動解析できれば全体の自動化も可能だろうと思い、試しに制作した。

---
厚生労働省 COCOA特設サイト(8/11現在)
![厚生労働省cocoa](https://user-images.githubusercontent.com/34627350/89846089-399a4400-dbbb-11ea-9fe5-86793e39f2b9.png)


##今回のポイント
- 掲載される情報は、テキストデータで掲載されていないため、画像を取得し文字認識（OCR）をする必要があった。そこで、OCRツールの候補に挙がったのが「GCP Cloud Vision」及び「**Tesseract**」である。

- 今回は、TesseractがPythonでPyOCRのライブラリを用いることで手軽に利用できるとあったため、こちらを採用し、認識精度についても検証していく。今後はCloudVisionも利用してみて、双方の文字認識の精度についても検討したい。

##実装した機能（すべてPythonで構築）
- スクレイピング機能
- OCR機能
- データ抽出機能
- Googleスプレッドシートへのデータ書き込み機能
- Googleスプレッドシートで作成されたグラフの画像取得機能(Tweet用素材)
- TwitterへCOCOAの利用状況をグラフを添付し投稿する機能(API未取得の為、動作未確認)

**スクレイピング機能に関して**
　本プロジェクトは厚生労働省のrobot.txt（<https://www.mhlw.go.jp/robots.txt>）によるクローラ許可範囲や，[利用規約・リンク・著作権等](https://www.mhlw.go.jp/chosakuken/index.html)の規約に則り制作している。
　アクセス先サーバへの負担軽減やDoS状態を防ぐため，スクレイピングプログラムは公式情報が更新される時間帯(17:00-18:30)のみ作動させている。この時間帯の中で，プログラムは作動し，更新が確認されるまで再アクセスを行う。再アクセスのリトライ間隔は余裕を持たせた「５分」に設定している。

##Tesseractとは
>多様なオペレーティングシステム上で動作するオープンソースソフトウェアであり、Apache License 2.0 の下で配布されている。文字認識を行うライブラリと、それを用いたコマンドラインインターフェイスを持つ。バージョン4.0からは、従来の認識エンジンに加え、LSTMベースのニューラルネットワークによる認識エンジンが搭載されている。開発元:Google
--wikipediaより

##実行したOCRの結果
- OCR処理前（サイトから取得した画像）
![cocoa_info_0810.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277011/05683e2c-8919-11f8-a877-2f0aeb070048.png)
- OCR処理後

```
接触確認アプリは、iOS・Androidともに、現在、「1.1.2」を配布しています。
古いバージョンのアプブリをご利用の方は、App StoreまたはGoogle Playから「接触確
認アプリ」を検索いただき、 アップデートをお願いします。

ダウンロード数は、8月7日17:00現在、合計で約1.205万件です。

・iOS、Android両方の合計の数になります。

・ダウンロード後に削除し、再度ダウンロードした場合は、複数回カウントされる場
合があります。

陽性登録件数は、8月7日17:00現在、合計で165件です。
```
##OCRの認識精度は高く安定
誤字は、2行目の「アプリ」を「アプブリ」と認識している点のみ。そのため、データを抽出する際のダウンロード数や、陽性登録数のデータ抽出には支障がないことが分かった。複数枚のOCR処理を行ったが、かなり安定しておりデータ抽出は正確に行われていた。

##まとめ
- 本システムは、Twitter投稿機能以外については正常に動作しており、データ抽出からグラフの自動作成などにより、更新作業の簡素化を実現することができた。
- 現在は、ツイートの投稿のみ手作業となっている。
- 課題として今後は、TwitterAPI交付後にツイート機能も稼働させて、解析から情報発信まで自動化させたいと考えている。

---
Google Sheetより自動取得した、ダウンロード数と陽性登録数の推移のグラフ
![sheet_date0810](https://user-images.githubusercontent.com/34627350/89763552-ba126380-db2d-11ea-8f75-0ad5d2d800d6.png)

※誤った記述が存在する可能性があります。ご注意ください。

##本プロジェクトの詳細について
- **GitHub** <https://github.com/Unagi2/cocoa-getinfo>

##出典・参考リンク
- 厚生労働省特設サイト「新型コロナウイルス接触確認アプリ（COCOA) COVID-19 Contact-Confirming Application」

    <https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/cocoa_00138.html>
- Tesseractの導入や使い方について

    <https://rightcode.co.jp/blog/information-technology/python-tesseract-image-processing-ocr>
EC-CUBE4のインストーラで任意のデータベースが選べなくてハマった話

[EC-CUBE 4.0 開発者向けドキュメントサイト インストール方法](https://doc4.ec-cube.net/quickstart_install)

公式ドキュメントにあるインストール方法の内、EC-CUBEのWEBインストーラからデータベース設定を行う際の備忘録です。
※本記事は筆者がハマった箇所のみの説明になりますので一から環境構築を行う際は公式ドキュメント等を参照ください。

----
- windows10
- PHP7.3
- PostgreSQL10.x系

上記条件でEC-CUBEのローカル開発環境を作成するため、[2.ComposerからWebインストーラでインストールする](https://doc4.ec-cube.net/quickstart_install#2composer%E3%81%8B%E3%82%89web%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%A9%E3%81%A7%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8Bv)の方法で環境構築を進めていたところ、![スクリーンショット 2020-08-10 22.48.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318198/eea2f147-9a12-553a-d9b2-5eaf4f204adc.png)

データベースの選択肢がMySQLしかない？
以前に自宅PCで環境を作った時はそんなことなかったはずなのですが・・・

しばらくググったりEC-CUBEのフォーラムを調べて回って同じような事情が起きていないか確認したものの同様の例は見当たらず。

----
### 解決方法

結論から先に書くと、
原因は使用しているPHPの設定でpdo_pgsqlが無効になっていたためでした。
php.iniを編集しpdo_pgsqlを有効にして再度データベース設定画面を表示したところ、
無事postgreSQLを選択、データベースの初期設定を行うことができました。

ちなみに上記に気づいたきっかけは、ググってもググってもそれらしい情報が出てこず万策尽きかけた時に、
そういえばこの画面でDBの種類選択して、何の値を送ってるんだろ？と思いchromeのDevToolで確認したところ・・

![スクリーンショット 2020-08-10 22.57.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318198/e2b60c50-36c0-90d3-3373-746f1dd59a8d.png)

value値にpdo_mysqlと設定してあることに気づき、iniファイルを見直してみたら案の定・・・という感じでした。

### 追記：システム要件

これも後になって気づいたのですが、EC-CUBEの公式ドキュメントの中に[こんなものが](https://doc4.ec-cube.net/quickstart_requirement)。

> pgsql / mysqli (利用するデータベースに合わせること)
> pdo_pgsql / pdo_mysql / pdo_sqlite (利用するデータベースに合わせること)

PHPライブラリの項目に上記が必須であることが明記されています。
手順を進める前にphpinfo()なりphp -mなり使用して確認しておけばこんなことで何時間も時間を溶かすことにはならなかった・・・
rails tutorial 第1章

#はじめに

独学で[rails tutorial](https://railstutorial.jp/)を進めていく過程を投稿していきます。

進めていく上でわからなかった単語、詰まったエラーなどに触れています。

個人の学習のアウトプットなので間違いなどあればご指摘ください。

初めての投稿なので読みにくいところも多々あるかと思いますがご容赦ください。


#第一章　ゼロからデプロイまで

##1.2.2 Railsをインストールする

Q..yarmなるもののインストール指示されたがいったい何だろう
A..JavaScriptソフトウェアの依存関係を管理するプログラムらしい(javascriptのパッケージマネージャ―)


##1.3.1 Bundler

エラー発生!!

bundle install時に早速エラーに遭遇しました。

遭遇したエラー

```

[!] There was an error parsing `Gemfile`: Illformed requirement ["-> 3.2.1"]. Bundler cannot continue.

 #  from C:/environment/hello_app/Gemfile:36
 #  -------------------------------------------
 #  # Windows does not include zoneinfo files, so bundle the tzinfo-data gem
 >  gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
 #  source 'https://rubygems.org'
 #  -------------------------------------------

```

解決
 
```
 #  from 
C:/environment/hello_app/Gemfile:36
↑にインストールに失敗した箇所が表示されているのでそこを修正
```

##1.4 Gitによるバージョン管理


余談
ブランチの名前を間違えてしまったが簡単に変更できました。
git branch -m 変更したい名前


#終わりに
そこまで躓くポイントはありませんでした。

参考文献
[Ruby on Rails Tutorial](https://railstutorial.jp/)