OmniAICreator/Qiita-1.07M huggingface dataset:
ストリーミングサーバーを10分で作る (ubuntu 24.04 + nginx)


新型コロナウィルスへの警戒感で、カンファレンスが中止されたりして、配信を試してみたいとの要望が出てきたため10分でさくっと生配信のためのストリーミングサーバーを作る方法を解説します。

（追記 24/12/4）意外とリクエスト数が多いので、最新環境に書き換えます。

# 環境

+ Ubuntu 24.04LTS

今回はさくっと作るので[Amazon Lightsail](https://aws.amazon.com/jp/lightsail/)を使いました。最低のインスタンスだと月額$5ですが、転送量1TBなので本格的に配信を考えると転送容量制限の緩い他VPSが良い気がします。

通常のUbuntu Server 24.04をインストールした環境でも良いかと思います。

# インストール

update & upgradeで最新まで上げておきます。

```
sudo apt update
sudo apt upgrade
```

~~nginxのレポジトリーを追加します。Officalじゃないので確認されるが[Enter]で進みます。~~

~~```sudo add-apt-repository ppa:nginx/stable```~~

nginxとrtspモジュールを追加するだけです。

```sudo apt install -y nginx libnginx-mod-rtmp```

インストールはなんとこれで完了です。

# 設定


+ rtmpの設定をnginx.confの末尾に追加します。

```sudo nano /etc/nginx/nginx.conf```

```/etc/nginx/nginx.conf
...
rtmp {
  server {
    listen 1935;
    chunk_size 4096;
    application live {
      live on;
      hls on;
      hls_path /var/www/html;
      hls_fragment 5s;
      hls_type live;
    }
  }
}
```

+ サービスリスタートします。

```sudo service nginx restart```

+ index.htmlにhtml5対応のビューワーの[video-js](https://videojs.com)を追加します。

{ip}をサーバーIPに、{key}をストリームキーに置き換えてください。

```sudo nano /var/www/html/index.html```

```/var/www/html/index.html
<!DOCTYPE html>
<html lang="en" class="">
<head>
  <link href="http://vjs.zencdn.net/7.6.6/video-js.css" rel="stylesheet">
  <script src="http://vjs.zencdn.net/7.6.6/video.js"></script>
</head>
<style type="text/css">
  #live {
    position: absolute;
    left: 0;
    top: 0;
    min-width: 100%;
    min-height: 100%;
    width: 100%;
    height: 100%;
    z-index: 1;
  }
</style>
<body>
  <video id="live" class="video-js vjs-default-skin" controls autoplay fullc preload="auto" data-setup='{}'>
    <source src="{key}.m3u8" type='application/x-mpegURL'>
    <source src="rtmp://{ip}:1935/live/{key}" type='rtmp/mp4'>
    <p class="vjs-no-js">Not Suppoted</p>
  </video>
</body>
</html>
```

# ファイアウォール

サーバーのファイアウォール設定がある場合には1935を開放します

<img width="765" alt="スクリーンショット 2020-03-02 20.08.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/682a97bb-9797-b45f-99da-aa56d28ed246.png">

# 配信設定

配信には[OBS](https://obsproject.com)などを使うと良いでしょう。

配信情報は以下のように設定します。
{ip}をサーバーIPに、{key}をストリームキーに置き換えてください。

配信先： rtmp://{ip}:1935/live
スリームキー： {key}

<img width="967" alt="スクリーンショット 2020-03-01 16.46.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/5fb8e30f-4ec4-f435-dd82-7df79048b3da.png">

これで配信サーバー構築完了です。お疲れ様でした。

# ぶつぶつ

30〜60秒程度の遅延があります（HLSなので遅い？）

安定性をとるならもちろん[Zoom Webiner](https://zoom.us/jp-jp/webinar.html)とかを使う方が良い気がしますが、自分でサーバーを構築してしまうのも勉強になるかと思います。どのくらいまで耐えられるかは不明ですが、CPU負荷をみるとそこそこ耐えれる気がします。

構築用スクリプトを使う方法は使っているバージョンが古いのでアップデートしようと思ったところ、バイナリーパッケージが入手できる方法があったので公開する事にしました。
GASでおうむ返しlinebotを作れません😭

takeiho.comを参考にしてすべてコピペして作ろうとしましたがいざできたと思って文字を打ったのですが既読だけが付き、動きません。コードは

var channel_access_token = "Messaging APIのアクセストークンを指定"
// ボットにメッセージ送信/フォロー/アンフォローした時の処理
function doPost(e) {
  var events = JSON.parse(e.postData.contents).events;
  events.forEach(function(event) {
    if(event.type == "message") {
      reply(event);
    } else if(event.type == "follow") {
      follow(event);
    } else if(event.type == "unfollow") {
      unFollow(event);
    }
 });
}

// 入力されたメッセージをおうむ返し
function reply(e) {
  var message = {
    "replyToken" : e.replyToken,
    "messages" : [
      {
        "type" : "text",
        "text" : ((e.message.type=="text") ? e.message.text : "Text以外は返せません・・・")
      }
    ]
  };
  var replyData = {
    "method" : "post",
    "headers" : {
      "Content-Type" : "application/json",
      "Authorization" : "Bearer " + channel_access_token
    },
    "payload" : JSON.stringify(message)
  };
  UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", replyData);
}

/* フォローされた時の処理 */
function follow(e) {
  
}

/* アンフォローされた時の処理 */
function unFollow(e){
  
}
です。
Webhook通信を利用するにし、応答メッセージは利用しないにしました。
反映されるのに時間がかかるのでしょうか?
Rでmacのcsvファイルを読み込んで走らせると ”xxxは不正なマルチバイト文字です ”エラーが発生する場合の対処法

#はじめに
Rでcsvを読み込むスクリプトを走らせていたのですが、以前問題なく動いていたスクリプトが、最近作成したcsvファイルを読み込んだ時に突然動かなくなり、そのトラブルシュートで2時間以上かかってしまいました。

#現象
現象は最近Office macをアップデートしてしまい、csvでファイルをCSV UTF-8形式で保存されても、文字化けが発生するようになりました。

![2020-03-02_18-48-45.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531038/5d486b5f-b498-e8ae-169d-930c90720f76.jpeg)


エラーメッセージが”xxxは不正なマルチバイト文字です ”というエラーなのですが、このエラーはコンソールに表示されるわけではなく、warning() を実行しないと表示されませんでした。

ちなみに、エラー発生時にRのコンソールには

```R
エラー: Stopping
 追加情報:  11 件の警告がありました (警告を見るには warnings() を使って下さい) 
```

と表示されていました。
こちらの警告メッセージに従ってコンソールで

```R
warnings()
```

を実行すれば、**xxxは不正なマルチバイト文字です** のエラーメッセージを確認することができたのですが、それを確認せずにスクリプトのデータフレームやcsvファイルを色々といじったりしていました。


#回避法

この問題は、以前の[Wordcloudの記事](https://qiita.com/TSeri/items/dd3205323dfd6b259435#csvに出力してexcelなどで確認)でも紹介したようにcsvの読み込み時に以下の通り　**fileEncoding="CP932"** をcsv読み込みのオプションに追加することで回避することができました。

``` R
, fileEncoding="CP932"
```

どのバージョンのmac用のExcelからこの仕様になったのか分かりませんが、2020年1月に同じ環境で作成したcsvファイルではこのようなことはなかったので、最近のアップデート（バージョン16.34 (20020900))で新たに発生した問題かなと思っています。

![2020-03-02_19-02-59.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531038/684e1666-8991-1e56-ba00-ccee9da9b03e.jpeg)


#教訓

トラブルシュートのほとんどの時間はエラーメッセージを確認せずにあぁでもない、こうでもないとcsvファイルやスクリプトをいじっていました。
エラーメッセージを確認してからは、以前の[Wordcloudでの経験](https://qiita.com/TSeri/items/dd3205323dfd6b259435#csvに出力してexcelなどで確認)があったので、10分もせずに対処法を見つけることができました。

まさかExcelのバージョンで発生なんてしないだろうという思い込みがあったのも原因の一つかと思います。

急がば回れの言葉通り、一手間かかりますがエラーメッセージや警告メッセージををちゃんと確認することが大事だな、と改めて痛感しました。
Rails の update_attribute はその時点で dirty な値を全てDBに保存する

# `update_attribute` で一つの属性値を変更しようとしたら、他の値も更新されてしまった

以下のような操作を行うと、 `update_attribute` は明示的に更新しようとしてない物も更新する。

```ruby
# attr_1 と attr_2 という属性を持つ以下のような SomeModel がある時、
some_model = SomeModel.find(42)
some_model.attr_1 # => nil
some_model.attr_2 # => nil

# attr_1 を dirty にする
some_modal.attr_1 = 'this is ditry column'

# とりあえず attr_2 だけ保存しようかな…
some_model.update_attribute(:attr_2, 'this is updated')
some_model.attr_2_in_database # => 'this is updated'

# !?
some_model.attr_1_in_database # => 'this is ditry column'
```

# Dirty な値が保存されるのは `update_attribute` の仕様です

[ActiveRecord::Persisitence#update_attribute](https://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-update_attribute)より引用(強調は引用者による):

> Updates a single attribute and saves the record. This is especially useful for boolean flags on existing records. Also note that
> 
> - Validation is skipped.
> - Callbacks are invoked.
> - updated_at/updated_on column is updated if that column is available.
> - **Updates all the attributes that are dirty in this object.**



翻訳(適当): 

> 単一の属性値を更新し、レコードに保存します。このメソッドは特にすでに存在しているレコードのbooleanのフラグ(の更新)にとって便利です。注意点は次の通り
>
> - バリデーションはスキップされます。
> - コールバックは実行されます。
> - update_at/update_on カラムがあれば更新されます。
> - **そのオブジェクトでdirtyな属性値は全て更新されます。**

# 実装を見てみる

なんか変な挙動だな…とおもったので実装を見てみる。

[activerecord/lib/active_record/persistence.rb より引用](https://github.com/rails/rails/blob/f33d52c95217212cbacc8d5e44b5a8e3cdc6f5b3/activerecord/lib/active_record/persistence.rb#L605-L611)

```ruby:activerecord/lib/active_record/persistence.rb
module ActiveRecord
  module Persistence
    # ...(中略)
    def update_attribute(name, value)
      name = name.to_s
      verify_readonly_attribute(name)
      public_send("#{name}=", value)

      save(validate: false)
    end
    # ...(後略)
  end
end
```


値をセットして `save` してるだけだった。 dirty な値が全部保存されてしまうのも納得の挙動だ。`update_attribute` は「単一の属性値をセットしたあとに `save` する」というショートハンドであって、**「単一の属性値を保存する」メソッドではない**と認識しておこう

# 付録(update_attributeの歴史)

メソッド名から想像される動作と実際の動作の違いが Rails のコードを全部読んだ人向けっぽいと思った。ライブラリとして小さかった昔からの名残ではないかと思い起源を調べてみた。するとやはり [GitHub の rails/rails の最初のコミット(2004-12-24)](https://github.com/rails/rails/tree/db045dbbf60b53dbe013ef25554fd013baf88134) から存在しており、動作もほぼ今と同じだった。

https://github.com/rails/rails/blob/db045dbbf6/activerecord/lib/active_record/base.rb#L709-L713 より引用(略は引用者による)

```ruby:activerecord/lib/active_record/base.rb
module ActiveRecord
  class Base
    public
      # ...(中略)
      # Updates a single attribute and saves the record. This is especially useful for boolean flags on existing records.
      def update_attribute(name, value)
        self[name] = value
        save
      end
      # ...(後略)
  end
end
```

今のドキュメントと見比べると、メソッドのコメントは今と全く同じで、注意書きが追加されている。同じような勘違いをする人が多いので注意書きが追加されてったのだろうか。
【jQuery】確認のダイヤログと言えば、jQueryのconfirm


削除処理の時などボタン１つで処理を行うのは危険です。
大切なデータがクリックミスなどで削除されてしまうと悲しいことになります
そこで出てくるのが確認のダイヤログです。
よく画面の上の方にポコっと出てくるあれです。
OKで処理を続ける、キャンセルで処理をやめて離脱する
そんな機能を実装してましょう。
実装方法は簡単です。

1. まず、jQueryを読み込みます
2. 次に、クリックした時に表示させたいボタン、リンクに対してIDを与えます。
3. そして、そのIDの要素がクリックされた時にダイヤログを表示させるメソッドを設定します。

以上の手順で進めていきましょう。

#jQueryを読み込みます
`<head>`内に以下のスクリプトを追記してjQueryをCDN形式で読み込みましょう

```html:<head>内
<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
```

#クリックした時に表示させたいボタン、リンクに対してIDを与えます。
下記が3つの種類のボタン、リンクの例です
どれでもできるので、どれか選んでやってください
大切なのはidを"btn"で設定したところです。
ちなみに、id要素はページに１つしか設定できないので3つ全部はできません
3つ表示する場合はid名を適当に変えてください

```html:
<button id="btn">絶対に押すなよ</button>
<a id="btn" href="https://qiita.com">絶対に押すなよ</a>
<form>
  <input id="btn" type="submit" value="絶対に押すなよ">
</form>
```

#IDの要素がクリックされた時にダイヤログを表示させるメソッドを設定します。
btn要素より下に記述してください。
Htmlは上から順に読み込まれるため、まだ要素ができていない状態でjQueyを読み込んでも
動かない時があります。
ページ下部に記述していると間違い無いです。

```html:
<script type="text/javascript">
  $('#delete-btn').click(function(){
    if(!confirm('押すなって言ったじゃないか！！')){
        /*　キャンセルの時の処理 */
        return false;
    }else{
        /*　OKの時の処理  今回は特に処理がないので空*/
    }
  });
</script>
```

これで実装は完了です。


##JavaScriptで書くとこんな感じです
jQueryで実装したコードを元のJavaScriptで書くと下記のようになります

```html:
<button id="btn">ボタン</button>
 
<script>
var btn = document.getElementById('btn');
 
btn.addEventListener('click', function() {
 
    window.confirm('押すなって言ったじゃないか！！');
 
})
</script>

```


以上です！！！
**ここまで読んでいただきありがとうございました！！
疑問、気になるところがございましたら、質問、コメントよろしくお願いします！！！**
【Rails】 Simple Covを使ってみる

テストカバレッジ計測ツール`Simple Cov`を使ってみます。

##導入方法
```rb:Gemfile
group :test do
  gem 'simplecov'
.
.
end
```
```terminal
$ bundle install
```
`spec_helper.rb`の末尾に以下の2行を追加。

```spec/spec_helper.rb
require 'simplecov'
SimpleCov.start 'rails'
```

`.gitignore`に`coverrage`ディレクトリを追加（すでにある場合は不要）

```:.gitignore
/coverage/
```

##使い方
テストを実行すると`/coverage`ディレクトリに解析結果が出力されます。

```terminal
$ bin/rspec
# テスト結果が並ぶ
.
.
.
Coverage report generated for RSpec to /Users/d0ne1s/sample_app/coverage. 224 / 778 LOC (28.79%) covered.
```

`coverage/index.html`をブラウザで開くと、解析結果を確認することができます。
<img width="1420" alt=" 2020-03-02 19.44.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244893/eefdb7bd-5d1c-edba-2847-f97a7df85b77.png">
【Github】コラボレータをリポジトリに招待する

年始まではリポジトリから
Settings → Collaborators & teams から招待だったと思うのですが？
Settings → Manage accesss に変わっていますね。

やり方は下記参照
[外部のコラボレータを Organization のリポジトリに追加する](https://help.github.com/ja/github/setting-up-and-managing-organizations-and-teams/adding-outside-collaborators-to-repositories-in-your-organization)

### 招待メールが届かない場合の確認例

これだけだと味気ないので、、、
上記方法で招待したのですが、先方から招待メールが来ないと連絡を受けました。
試しに他の人にも招待してみると、その人には無事メールが届いていました。

２人の違いは何だったかと言いますと、
既にOrganizationのOutside collaboratorsとして登録済みだったかどうかでした。

なので、結論としては定員オーバーでした。
Organization内のSettings → Billingから確認
見事に枠がなかったので、Edit → Add Seats より
1 new saetを追加。
無事招待できました！！！
本日の精進：累積和

[ABC122-C GeT AC](https://atcoder.jp/contests/abc122/tasks/abc122_c)
A,C,G,Tからなる文字列の指定された範囲において、"AC"という文字列が何回表れるかを答える問題。
文字列長が最大10^5、問題の数(調べる範囲の数)が最大10^5なので、愚直にやると間に合わない。
範囲指定の和ということで典型的な累積和、と思いきや、"AC"をひとセットで扱う必要があるため工夫が必要。
一つの正解は、「Cが右隣に来るようなAの個数を数える」こと。そうすれば、A単体と区別がつく。
この手法で実装する際は、累積和から区間和を計算する際の右端をずらさなければいけないため注意(コード中にコメントで付記)。
頭がこんがらがりまくりました。結局pdf解説見て実装。


```AC.py
N,Q = map(int,input().split())
S = input()
questions = [[i for i in map(int,input().split())] for j in range(Q)]
t = [0]*(N+1)
for i in range(N):
  t[i+1] = t[i] + (1 if S[i:i+2]=='AC' else 0)  
 
for q in questions:
  print(t[q[1]-1] - t[q[0]-1]) # 右端(q[1])を一つずらしている→"AC"の"A"のみが終端に現れる場合に対応
```
何と言うか、何となくは分かるしそうすれば上手くいくんだけど、いざ考えると凄く混乱します。
【Udemy Python3入門+応用】　25. 辞書型のメソッド

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**


##■辞書型のメソッド
#####◆`.keys`と`.values`
```
>>> d = {'x': 10, 'y': 20}
>>> d
{'x': 10, 'y': 20}
>>> d.keys()
dict_keys(['x', 'y'])
>>> d.values()
dict_values([10, 20])
```
`.keys`で辞書内のkeyを、
`.values`で辞書内のvalueを表示させることができる。


#####◆`.update`
```
>>> d = {'x': 10, 'y': 20}
>>> d2 = {'x':1000, 'z': 500}
>>> d.update(d2)
>>> d
{'x': 1000, 'y': 20, 'z': 500}
```
xの値は更新され、zの値は追加された。


#####◆`.get`と`.pop`
```
>>> d = {'x': 1000, 'y': 20, 'z': 500}
>>> d['x']
1000
```
もちろん、`[]`でkeyを指定するとそのkeyのvalueが返る。

```
>>> d = {'x': 1000, 'y': 20, 'z': 500}
>>> d.get('x')
1000
>>> d
{'x': 1000, 'y': 20, 'z': 500}
```
`.get`でkeyを指定すると、valueを取り出せる。
このとき`d`の中身は変わっていない。

```
>>> d = {'x': 1000, 'y': 20, 'z': 500}
>>> d.pop('x')
1000
>>> d
{'y': 20, 'z': 500}
```
`.pop`を使ってもvalueを取り出すことができるが、
`.get`とは異なり、取り出したデータは`d`からなくなる。


#####◆存在しないkeyを指定した場合
```
>>> d = {'x': 1000, 'y': 20, 'z': 500}
>>> d['a']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'a'
>>> d.get('a')
>>> n = d.get('a')
>>> type(n)
<class 'NoneType'>
```
`d['a']`とするとエラーとなってしまうが、
`d.get('a')`とした場合、`NoneType`となる。


#####◆`.clear`
```
>>> d = {'x': 1000, 'y': 20, 'z': 500}
>>> d.clear()
>>> d
{}
```
`.clear()`を使うと、辞書内のデータがすべて消去される。


#####◆`del`
```
>>> d = {'x': 1000, 'y': 20, 'z': 500}
>>> del d['x']
>>> d
{'y': 20, 'z': 500}
```
もちろん`del`も使用可能。


#####◆`in`
```
>>> d = {'x': 1000, 'y': 20, 'z': 500}
>>> 'x' in d
True
>>> 'a' in d
False
```
`'x' in d` で
"Does 'x' exist in d?"
となる。
ゴリラに喋らせるコマンドを作った

こんにちは、ゴリラです。

みなさん`cowsay`ってコマンド知っていますか？
牛を喋らせることができるコマンドですが、それのゴリラ版が欲しくて作ってみました

https://github.com/skanehira/gorillasay

![](https://camo.githubusercontent.com/99f06e7e79533e127ad59a9f3be6a9fa4fa795d5/68747470733a2f2f696d6775722e636f6d2f5a70776235756a2e706e67)

## 使い方
`gorillasay`に引数を渡すだけです。
スペースで改行されるので、改行したくない場合は`"`で囲ってあげてください。

## 使いみち
ぱっと思いつかないのですが、`CI`とかに組み込むと楽しいかなと思います。
HP Envy x360 13はとても良いものである、が

HP Envy x360 13に一目惚れして、下調べをせずに買ってしまった男の末路の話です。
本当はブログとかに書いたほうが良いと思うけど、ブログがないのでとりあえずこの場をお借りして書きます。


## 概要
このノートパソコンは、

* タッチスクリーン
* 指紋認証
* IPSパネル
* ベゼルレス
* めちゃくちゃ薄い
* 格好いい
* Windowsでの使用感がめちゃくちゃ良い

など、たくさんの魅力が詰まっている。

例えば、Windows限定ではあるが[^1]コンバーチブル、要はタブレットのように使えたりできるのだが、それに関してはめちゃくちゃ感動した。ペンなどがあれば、適当なアイデア出しや、メモを残しておきたいときにストレスなくさっと描ける。

[^1]: Linuxでも、ドライバーが出ていれば使える。

IPSパネルもすごくきれいで、画面が小さいにもかかわらず文字がすごくきれいに映る。これだけでもうテンション爆上がり。
ベゼルレスという点も良い。ただし少し想像とは違って、フタ枠とは別にある黒い縁がすこし太かったのが残念。

薄さがやばい。ちょっと大きい(太い)スマホより太いぐらいで、ほぼタブレットと同じような扱いをできる。
薄すぎて大丈夫かこれ？と思うレベルだった。

見た目が格好良い。スタイリッシュなデザインに、クールなロゴ。ノートパソコンにありがちな~~ダサい~~ロゴではない。


## ではなにがいけないの？

僕は、もともとプログラミング用のラップトップがほしいと思っていたので、Arch LinuxやDebianをいれようと思って買った。
のだが、どうやらフタのモジュールが特殊らしく、様々な方法(ドライバを入れたり、`acpid`をいじったり、GRUBをいじったり、カーネルパラメータをいじったり)を試しても結局フタを閉じてなにかをするというアクションを起こせなかった。
そもそも、`acpid`がなぜかフタの開閉を認識していなかった。

また、サスペンド(スリープ)をしてから、起き上がらないという問題もあった。これについてはなぜかわからないが、おそらくこれもハードウェア関係の問題かと思う。

これらは、どこかの情報サイトでも同じような症状を訴えている人がいた。


## まとめ
ノートパソコンとしてはかなり良い部類だと思った。Windowsをメインで使う人には、かなり優れたものじゃないかと思う。
しかし、Linuxを入れることを前提で買おうとしてる人にはおすすめしない。

なにか質問があれば、コメントはTwitterでお聞きいたします。
GPT2の日本語生成モデルを公開しています

今更感がありますが、「危険すぎる」と話題の文章生成AI「GPT-2」を、日本語Wikipedia全文コーパスで学習させたモデルを公開しています。

実はずいぶんと前にGitHubに公開したんですが、なかなか見て貰えないようなのでQiitaに投稿。

ひっそりと公開しても誰も気づかないのか、それとも需要が無いだけなのか。

https://github.com/tanreinama/gpt2-japanese
AMD RyzenにmacOS 10.15 CatalinaをOpenCoreでinstallする（その2）

（[その１](https://qiita.com/blueknight611jp/items/d6c6ae64381aac51ad45)より）

#config.plistを編集する前の準備
- ProperTreeを入手 https://github.com/corpnewt/ProperTree
- GenSMBIOSを入手 https://github.com/corpnewt/GenSMBIOS
- AMD Vanilla patchを入手 https://github.com/AMD-OSX/AMD_Vanilla/tree/opencore
    - Ryzenの場合は 17hを

# ProperTreeでOC/config.plistを編集
- ProperTreeはgit cloneしてchmod +xして実行可能にしておく
- ProperTreeを起動し /Volume/EFI/EFI/OC/config.plistを開く
- Command+Shift+Rで /Volume/EFI/EFI/OCを選択しsnapshotをとる
　　　　これにより準備したファイル・kextが自動的に記載される
- GenSMBIOSを起動し, MacPro6,1でSerialNoなど作成する。
- ProperTreeでPlatformInfoに作成した値を入れる
    - MLB 
    - SystemProductName
    - SystemSerialNumber
    - SystemUUID
- ProperTreeで Kernel/Patchを削除する。
- ProperTreeでAMD Vanillaの 17h patchを開き Kernel/Patchをコピーする
- PrpperTreeでconfig.plistのKernelにペーストする

# config.plistの微調整
- Kernel/Quirks/DummyPowerManagementをTrueに（これによりNullCPUPowerManagement.kextは不要になる）
- Misc/SecurityでRequireSignatureとRequireVaultをFalseに
- Misc/SecurityでScanPolicyを0に
- NVRAM/Addの boot-argsに npci=0x2000 を追加
- NVRAM/Addの prev-lang:kbd を 656e2d55533a30 に（こうしないとロシア語になる）
- UEFI/Quirksの ProvideConsoleGop を Trueに
- config.plistをsaveした終了
- config.plistをチェックする　https://opencore.slowgeek.com/　

# RestartしてUSB installerから起動する
これでinstallerが立ち上がれば成功です。
Windows+tf-nightly で「DLLが見つからない」エラーが出る件

少し前のバージョンからWindows上でtf-nightlyを更新したら、DLLが見つからないというエラーが出てプログラムが走らなくなった。

なんのDLLが見つからないのか何も出ないので、sysinternals(現MS傘下？)の Filemonを使って調べるといわゆるC++再頒布パッケージの最新版に含まれるDLLを探していて見つからないよう。
現在はVisual Studio2019の再頒布パッケージとなっているものをインストールしたところ、無事解決。

ナイトリーのリリースページでも特に「コンパイル環境変わった」とか一切ない気が…
ナイトリーだから使う側が察しろということなのか…

参考：最新のサポートされる Visual C++ のダウンロード
https://support.microsoft.com/ja-jp/help/2977003/the-latest-supported-visual-c-downloads
AWS EFSのストレージクラスの判別方法

# はじめに
Amazon Elastic File System (EFS) は、標準ストレージクラスと低頻度アクセスストレージクラスの2種類があります。が、コンソールからは判断出来なかったので確認方法をメモ。

# 判別方法
`ライフサイクルポリシー`が有効になっているかどうかがポイントです。
EFSのコンソール上でライフサイクルポリシーが有効になっていなければ標準ストレージクラスです。

逆にライフサイクルポリシーが有効になっていると必ず低頻度アクセスストレージクラスという訳ではなく、設定した日数アクセスされていないファイルが自動的に低頻度アクセスストレージクラスに送られます。

なので、ライフサイクルポリシーを有効にしてると両方使ってることになりますね。

# 参考文献

[Amazon Elastic File System の低頻度アクセスが 7 日間のライフサイクル管理ポリシーをサポートするようになりました](https://aws.amazon.com/jp/about-aws/whats-new/2019/11/amazon-elastic-file-system-infrequent-access-now-supports-7-day-lifecycle-management-policy/)
gcp ファイアウォール ルールにipを複数設定する簡単なやり方

gcpのコンソールからfirewall rulesのipを指定しようとすると1件ずつしか指定が出来ない。

辛いので、とりあえず1件だけ登録し、firewall rulesを作ったあとに下記のコマンドで一括登録出来る。
terraformでももちろん出来るが、コンソール使ってる人向け。

```
gcloud compute --project "プロジェクト" firewall-rules update ルール名 --source-ranges=xxx.xxx.xx.xx/xx,xxx.xxx.xx.xx/xx,xxx.xxx.xx.xx/xx
```
Herokuで使うコマンドを羅列する

個人用にメモる



```terminal
$ heroku create my-app-name
$ git push heroku master
$ heroku run rails db:migrate (--stage development)


$ heroku logs --tail

$ heroku config:set AWS_ACCESS_KEY=xxxxx
$ heroku config:set AWS_SECRET_KEY=yyyyy
```

# Railsのデプロイ

```terminal
# デプロイ前のアセット構築
$ heroku run rails assets:precompile ENV=production
```
classインスタンスのメソッドに対して分割代入をすると、メソッド内でのthisの参照が失われるので注意

知らずにちょっとハマったのでメモ。

ES6の分割代入を利用する際に、classのメソッドを分割代入するとthisへの参照が失われて、thisにundefinedがセットされてしまうようです。

そのため、メソッド内でthisを参照している場合エラーになります。


## 検証コード

```check.js
console.log("--- test_class");

class DummyClass {
  constructor() {
    this.key = "value";
  }

  method() {
    console.log(this.key);
  }
};

const test_class = () => {
  const instance = new DummyClass();

  // これは問題ない
  instance.method();

  // これはエラーになる
  const { method } = instance;
  method();
};

test_class();
```

## 結果

```bash
$ node check.js
--- test_class
value
~/check.js:9
    console.log(this.key);
                     ^

TypeError: Cannot read property 'key' of undefined
    at method (~/check.js:9:22)
    at test_class (~/check.js:19:3)
    at Object.<anonymous> (~/check.js:22:1)

$ node -v
v12.13.1
```

## 感想

利用していたライブラリから返ってきた結果に対して分割代入をしていて、上記のエラーに遭遇しました。

ライブラリが返す結果がプレーンなオブジェクトなのか、クラスのインスタンスなのかを意識していないとこういうエラーに遭遇するので中々厄介だなと思いました。

何でもかんでも分割代入すれば良いというものでは無いですね...。
LibreELEC(Kodi)でNetflixを見る

この前、LibreELEC(Kodi)でYoutubeのOAuth認証エラーで見られなくなった記事を書いた。
https://qiita.com/ksmndevelop/items/1347e59d642364f021e5

現在も問題なく視聴できているのでよい。

また、Amazon プライムビデオも見れるようにしてあるのでよい。(この間も言った)
![IMG_20200221_201453501.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543063/bda2222f-ce99-c970-d66a-c20eed6812bc.png)

まぁそんなことはさておき、
今回はNetflixをLibreELECで見たいなーと思ったので導入することにした。
導入はとても簡単。Amazon プライムビデオを入れる際と同じ。
#導入環境
・Raspberry Pi 4B (RAM 4G)
・LibreELEC 9.2.0 (Kodi v18.5)
#ネトフリ導入の経緯
・Amazon プライムビデオが1080p(FHD)で見れない → InputStream設定はしてあるのに720p？相当になっている
 ※Amazon プライムビデオをPCで見た際に高画質設定でも若干画質が荒いので元々画質は良くない？
・新型コロナウイルスでお家時間が増えそうなので、この機会にネトフリを契約してみようかなーと思ったため

YouTubeはInputStream通り、1080p(FHD)で見られる。
だが、Amazonプライムビデオは見苦しいほどの画質では無いが、FHDではない。
Amazonプライムビデオが1080p(FHD)で見れればネトフリをわざわざ契約してまでしなくてもいいのだが。
ちなみに、アプリで見る場合は問題なく1080p(FHD)？で見れている。
また、RaspberryPi 4 は4Kに対応したので4K(2160p)で出力できるが、エンコーディングがハードウェア的に難しいのであろう。
せっかくの大画面でFHDじゃないのは若干寂しい。
#導入

公式のフォーラムに書いてある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543063/5bc77247-1a1e-8437-387e-50895f436ba9.png)
https://forum.kodi.tv/showthread.php?tid=329767

1. レポジトリからZIPをダウンロード
https://github.com/castagnait/repository.castagnait/raw/master/repository.castagnait-1.0.0.zip

2. TeraTerm等SSHクライアントでダウンロードしたZIPをラズパイに送る
3. 送ったZIPをインストール
![screenshot002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543063/438caffb-b8a0-03d9-964d-fc1326a17095.png)
ホーム→アドオン→zipファイルからインストール→ZIP選択しインストール
4. レポジトリからNetflix Add-on をインストール
![screenshot003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543063/00a98580-24c9-2534-0a97-c37c8392b972.png)
ホーム→レポジトリからインストール→CastagnaIT Repository
![screenshot004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543063/57d6fd3f-07d3-4724-3b4e-4fc7c8a30831.png)
ビデオアドオン→Netflix
5. 再起動後Netflixを起動
起動するとメールアドレス・パスワード(暗証番号)が求められるので入力

これで見れるようになる。
#視聴
Amazonプライムビデオだと1080p(FHD)で見れなかった作品が、ネトフリだとFHDでキレイに見れる。
※InputStreamの設定は各自で調べること
ただ、アニメのラインナップはAmazonプライムビデオよりは少ないらしいが、私は少ないと感じなかった。
#まとめ
今回、Amazonプライムビデオが1080p(FHD)で見れずネトフリを契約して導入してみたが、納得のいく結果になった。最初、自宅のネット環境がADSLだから？とは思ったのだが、YouTubeはFHDで見れているためやはりAmazonプライムビデオ自体の画質だった。
だが、ネトフリはスタンダードプラン(FHD)でも月1200円するため、画質は若干落ちてもAmazonプライムビデオで良いだろう。プライム会員500円で速達・ビデオ・音楽は安い。
#最後に
ネトフリもアマプラも契約している限りは充実した生活。。
良い子のみんなはFireTV Stick買おう。
Discord.js v12がリリースされたので追加されたものを一部紹介

とうとうこの日が来ました。**Discord.js v12**がリリースされました。🎉
Discord.jsユーザーの9割はこの時を待ち望んでいたでしょう！ということでDiscord.jsの新機能というか、追加された一部分を紹介します。

# Discord.js とは

> Discord.jsは、Discord APIと簡単にやり取りできる強力なNode.jsモジュールです。
> https://discord.js.org/#/

## v12のリリースまでに凄く時間がかかっている。

このv12ですが結構前から開発が進んでいたものをリリースしたものです。**破壊的変更が大量**にあります。
v11のコードをそのまま動かすとほぼ確定でエラーが起きるでしょう。
**そしてこの記事を読んでも1割、いや1割以下しか理解したことにならないでしょう...**

## Node.jsのアップデートが必要

今回のv12リリースで、Node.jsのバージョンは**v12.x以降**となりました。`node -v`コマンドでNode.jsのバージョンを確認して必要なら[Node.jsの公式サイト](https://nodejs.org/ja/)からダウンロードして更新しましょう。

## 追加されたものの紹介

### Discord.jsのオブジェクトを自由に拡張できる - Structuresクラス

> 公式ドキュメント: https://discord.js.org/#/docs/main/stable/class/Structures

過去に[こちら](https://qiita.com/InkoHX/items/05a29c4881f5ee6455a0)の記事で書いてありますが改めて紹介します。

MessageやGuildなどのオブジェクトに、関数やプロパティを自由に追加することが可能になります。例えばユーザーのデータを取得するために一々モジュールをインポートしてー... なんてことも、これがあればユーザーオブジェクトからデータを取得して...ということができます。

注意点は、**Clientをインスタンス化する前に拡張の処理を済ませること**

#### コード

```js
const { Structures, Client } = require('discord.js')

Structures.extend('Guild', Base => class extends Base {
  getGuilds () {
    return this.client.guilds
  }
})

const bot = new Client()

bot.on('guildCreate', guild => {
  console.log(guild.getGuilds().cache.size)
})

bot.login()
```

使い道がよくわからない人のために実際にこの機能を使ったコードを[GitHub](https://github.com/InkoHX/discordjs-chat-level)に公開しておきました。

### Server Boostに対応 - Premium Guild

Server Boost(Nitro Boost)が使われているサーバーのレベルなどを取得できるようになりました。

#### Guild

| プロパティ | 返り値 | 説明 |
| ---------- | ----- | ---- |
| .premiumSubscriptionCount | number または undefined | サーバーをブーストしている人の人数 |
| .premiumTier | PremiumTier | ブーストのレベル（返り値の詳細は[こちら](#premiumtier)） |

##### PremiumTier

- 0 ブースト無し
- 1 ブーストレベル1
- 2 ブーストレベル2
- 3 ブーストレベル3

#### GuildMember

メンバーがいつサーバーをブーストしたかを取得することが可能です。

| プロパティ | 返り値 | 説明 |
| --------- | ------ | ---- |
| .premiumSince | Date または undefined | メンバーがブーストした時をDateオブジェクトで返します。|
| .premiumSinceTimestamp | number または undefined | メンバーがブーストした時を数値で返します。 |

### 画像形式やサイズを指定できるようになった。

`guild.iconURL`はプロパティでしたが、`guild.iconURL()`というメソッドに変更されました。
よって

```js
guild.iconURL({ format: 'png', dynamic: true, size: 1024 })
```

こういう書き方ができるようになり、画像形式、サイズの指定ができるようになったわけです。これで**webp形式の画像が表示できないiOS版Discord**の対応ができるというわけです。
ちなみにiOS版Discordに対応するためにはこのオプションにしておくといいです。

```js
guild.iconURL({ format: 'png', dynamic: true })
```

`dynamic`オプションが有効だと、アニメーション画像はGIF形式の画像URLを受け取り、それ以外はPNG形式の画像URLを受け取ります。（デフォルトだとwebp形式で受け取ります。）

`displayAvatarURL`や`avatarURL`、`splashURL`も同様のオプションが使用できます。

## v11からv12にするために

現在公式ガイドの翻訳が進んでいる。[こちら](https://guide.djs-jpn.tk/additional-info/changes-in-v12.html)のサイトを見るのが良いでしょう。今後この記事で詳しく書くかもしれません。

この記事が作成された日にリリースされたのでまだv12の情報はほとんど無いと思われます。もしv11からv12への移行で困っていることがあれば、日本語のコミュニティを活用したり、ドキュメントを見たほうがいいでしょう。

- [Discord.js Japan User Group](https://discord.gg/4tpD3TY)
- [Discord.js ドキュメント](https://discord.js.org/#/)

まだまだ更新していくのでストックしておくといいかも？
CSSをファイル内に入れ込んでMarkdownのプレビューを修正した

# 概要

メモやちょっとした書き物は，.mdファイルに書くのが便利。プレビューやpdf化はChromeの拡張機能（MarkDown Preview Plus Options）の利用が手っ取り早いです。で，Themesの中では「Github」が一番見やすいのだけど，

- コード部分の文字が小さい上，グレーっぽい文字になる

のが不満。コードがしっかり見えるようにしたいのに！
あと，ついでに

- 引用やコードがグレーっぽい文字になる

- h1，h2，h3タグのサイズの違いがわかりにくい

というのも変えたくて調べてやってみたのでメモ。

.css ファイルを作って読み込ませる形にするといいんだろうけど，よくわからない＆どこにおくのか（わかんなくなりそう）
，という問題があるのと，ちょっとの修正でよいので，カスタマイズするとこだけファイル内に書いてみることにしました。

# 方法

[ Markdownファイルの中にCSSを入れ込んでみた - Qiita](https://qiita.com/jumitaka/items/025fe18c73d348f854d2)
によると，styleにscoped属性っていうのがあって，`<style scoped></style>` を使って，この中にcssを書けばいいみたい。

githubのcssのコードをみて，変えたらよさそうなところをかえてみることにして，githubのcssについては
[githubのmarkdown-cssをぶっこ抜く方法 - Qiita](https://qiita.com/__mick/items/c80fab6c185a41882880)
を参考にしました。
https://github.com/sindresorhus/github-markdown-css に`github-markdown.css`があるけど，`.markdown-`で始まる形で記述されているので注意（ファイル内の`.markdown-`を空文字に置換すればいいらしい）。

# 加えたstyleタグ

コードの意味はよくわかってないのだけれど，`github-markdown.css`のコードを眺めて，関係ありそうなところをコピペして修正したのを使ってみました。コード部分の色とフォントサイズ，フォントの種類を変えたのと，引用部分の色，とh1タグとかの文字サイズを変更。以下のコードを.mdファイルの最後に書きました。

```
<style scoped>
body code {
  font-size: 120%;
  color: #1b1f23; 
  font-family:SFMono-Regular,Consolas, 'Courier New', monospace;
}

blockquote {
  color: #1b1f23;
}

body h1 {
  font-size: 2em;
}
body h2 {
  font-size: 1.4em;
}
body h3 {
  font-size: 1.15em;
}
body h4 {
  font-size: 1em;
}
 </style>

```

ChromeのMarkDown Preview Plus Options（Themesは「Github」）で見てみたら，コードがはっきり大きくなって，見やすくなってました。pdfへの印刷でもいい感じ。


#  メモ

以下にある「元」は`github-markdown.css`の記述です。ChromeのThemesの「Github」のとは少し違うみたい。

- 色はgithubのコードの中に出てくる黒っぽい色（`#1b1f23`）にした。（blockquoteは元は`#6a737d`）
- codeのfont-sizeは85%→120%にした。行内コードの文字も大きくなった。こっちはもともと小さくなってなかったので大きくなりすぎの感があるが，まあいいか，でとりあえずそのまま（よくわからないし）。
- codeのフォントはgithub-markdown.css`のを持ってきた。
- h1~h4の文字サイズは，github-markdown.css`では，2em，1.5em，1.25em，1em。h4はそのままなので，なくてもいいはず。
 
- （課題）ブロックコード内の`--`（`-`が2個以上連続）がある行が，元のグレーの色になった上，同じ行の以降の部分の文字（アルファベット）が斜体になった。ここも黒い色＆斜体でない形にしたかったのだけど，方法がわからず，そのまま。



# 参考にした・なりそうなページのまとめ


- [ Markdownファイルの中にCSSを入れ込んでみた - Qiita](https://qiita.com/jumitaka/items/025fe18c73d348f854d2)  
- [githubのmarkdown-cssをぶっこ抜く方法 - Qiita](https://qiita.com/__mick/items/c80fab6c185a41882880)  
- https://github.com/sindresorhus/github-markdown-css   ( GitHubのgithub-markdown-cssのリポジトリ)
- [MarkdownをGitHub風のPDFに変換する - Qiita](https://qiita.com/tkms0106/items/37c17c1a559611266d03:title)

- [スコープ付き CSS · vue-loader](https://vue-loader-v14.vuejs.org/ja/features/scoped-css.html:title)
Laravelクエリビルダmemo➀(集計関数)

laravelのクエリビルダの集計に関するメモです。


####やりたいこと
グループ化してから平均をとりたい。

####問題点
はじめはクエリビルダの集計関数のavg()で試みたのですがgraupBy()と併用できないのです。

####直接クエリを書く
そこで集計のところをサブクエリとして、selectRaw()で直接クエリを書いてから、graupBy()でグループ化します。

公式リファレンス
https://readouble.com/laravel/5.8/ja/queries.html?header=selectRaw

```php

$rating_avgs = Review::selectRaw('movie_id, AVG(rating) as rating_avg')->groupBy('movie_id')->get();
```
無事取得できました。

```
=> Illuminate\Database\Eloquent\Collection {#3141
     all: [
       App\Models\Review {#3132
         movie_id: 1,
         rating_avg: "3.0000",
       },
       App\Models\Review {#3135
         movie_id: 2,
         rating_avg: "4.0000",
       },
     ],
   }
```
movie_idも取得するのは、サブクエリをJOINするためです。

`avg()`だけでなく`count()`や`max()`なども同じような感じになると思います。
こういうところでlaravelの集計関数の限界を感じます。
C言語　EXC_BAD_ACCESSのエラーについて

このような書き方をするとエラー「__EXC_BAD_ACCESS__」が起きる。
ポインタのみ宣言して、メモリを確保していないからだ。
宣言したポインタにたまたまアドレスの形式の初期値が入っている場合、値が格納されてしまうケースがあるので更にややこしい。

```c
int main(void)
{
    char *name;
    name[0] = 'a';

    char *st;
    st[0] = 'a';

    return 0;
}
```


C言語では__初期値__がどのようになっているのか、も考慮しないとエラーが出る。

下記のように初期値を出力させてみるとエラーの原因が見えてくる。

```c

int main(void)
{

    char *a;
    char *b;
    char *c;
    char *d;
    char *e;

    printf("%p\n", a);
    printf("%p\n", b);
    printf("%p\n", c);
    printf("%p\n", d);
    printf("%p\n", e);

    return 0;
}
```



最初のaにはたまたま？アドレスが入っているが、以下の変数には__0x0__という値が入っていて、アドレスとして認識されない。
たまたまなのか、0x7ffeefbff5b8という値が入ってしまうのがCの厄介なところ。

```terminal
0x7ffeefbff5b8
0x0
0x0
0x0
0x0
```

##まとめ
ポインタを宣言したとき、初期値にアドレスが格納されるとは限らない。
Gitのリポジトリを履歴を保持したまま分割する

最初は１つのRailsプロジェクトだったのですが、
webpackerを外したことにより、フロントエンドとバックエンドと同じにしている理由もなくなり、
デプロイする工程においてはむしろ作業が増えるので、分割することにしました。
その時のメモです。
少しでも同じ課題を抱えている方の参考になれば。

## 分割したいプロジェクトをclone
分割用に別途プロジェクトを用意しましょう。
失敗してもリセットできるように念の為

```bash
git clone リポジトリURL
```

## プロジェクトから不要リソースを取り除く（コミット履歴も含めて）

git filter-branchコマンドで不要リソースを指定
例）バックエンドのリポジトリを作る場合はフロントエンドのリソースを指定する

```bash
# ファイル名の部分に「package.json frontend」といった感じにスペース区切りで記載していく ディレクトリも指定可
git filter-branch --tree-filter 'rm -rf ファイル名' -f --prune-empty
```

コミット履歴が多いと時間がかかります。
終わったらプロジェクトを見て指定したファイルが消えていることを確認しましょう

## 分割先の新リポジトリにPush

github等で新しいリポジトリを作成しましょう

```
git remote set-url origin 新リポジトリURL
git push origin master
```

これで指定したファイルを除いた形で新リポジトリに引っ越しができました。
これをバックエンドとフロントエンド両方やる形で無事分割ができました！
2月全体

##目標と結果##

##目標##

•午前試験でのマネジメント系、ストラテジ系の分野の2項目の理解度を深め、改めて問題を回答し、間違えた所の理解度を深めていく。
•独習ゼミのテストを活用しつつ、ポイントを押さえていくこと。
•勉強時間最低でも週の内10時間は確保すること。常に空いている時間、隙間時間で独習ゼミ又は過去問道場をやりこむこと。無駄な１日を過ごさないようにする。
##結果##
午前試験では、マネジメント系にもっと専念しなければならない。勉強時間は週5時間しか確保できなかった。
##月次報告##

１月全体
3月全体目標計画

##目標##
•春試験に合格すること。
•アルゴリズムに関しての理解度を深める。
•過去問道場を活用すること。
•参考資料に目を通す。特に表計算とアルゴリズムを集中的に。

##結果##
春試験はコロナのため中止になりました。
##振り返り##
アルゴリズムを重点的に取りくんだものの、出来ていなく諦めていたところがありました。
過去問道場の解説を見ていても、あまり理解できていない自分がいたため、時間はほぼないですが、どのような解き方をするかこの問題は何を伝えたいのか理解しつつ一つ一つ解いていきたいと思います。
##週次報告##
[3/1(20週目)](https://qiita.com/Comitakato0515/items/e61c8651a41b61c3fe04)
[3/9(21週目)](https://qiita.com/Comitakato0515/items/fd7ca301e289ebfe22e1)
[3/16(22週目)](https://qiita.com/Comitakato0515/items/93f54b3f7a0166cb9fc6)
[3/23(23週目)](https://qiita.com/Comitakato0515/items/5670493f6a186f953121)
GAN(Generative Adversarial Network) メモ

# GAN一般

* GAN
  - [(paper) Generative Adversarial Nets](https://arxiv.org/pdf/1406.2661.pdf)
  - [(Qiita) 今さら聞けないGAN](https://qiita.com/triwave33/items/1890ccc71fab6cbca87e)
  - [eriklindernoren/PyTorch-GAN](https://github.com/eriklindernoren/PyTorch-GAN)

* WGAN
  - [GAN — Wasserstein GAN & WGAN-GP](https://medium.com/@jonathan_hui/gan-wasserstein-gan-wgan-gp-6a1a2aa1b490)


# 画像生成

* Tasks
  - アニメ画像生成
     - [GANによる二次元美少女画像生成](https://medium.com/@crosssceneofwindff/gan%E3%81%AB%E3%82%88%E3%82%8B%E4%BA%8C%E6%AC%A1%E5%85%83%E7%BE%8E%E5%B0%91%E5%A5%B3%E7%94%BB%E5%83%8F%E7%94%9F%E6%88%90-33047bb586a0)
     - [続・GANによる二次元美少女画像生成](https://medium.com/@crosssceneofwindff/%E7%B6%9A-gan%E3%81%AB%E3%82%88%E3%82%8B%E4%BA%8C%E6%AC%A1%E5%85%83%E7%BE%8E%E5%B0%91%E5%A5%B3%E7%94%BB%E5%83%8F%E7%94%9F%E6%88%90-a32fbe808eb0)

# テキスト生成

* SeqGAN
  - [(paper) SeqGAN: Sequence Generative Adversarial Nets with Policy Gradient](https://arxiv.org/pdf/1609.05473.pdf)
  - [(公式TF実装)  LantaoYu/SeqGAN](https://github.com/LantaoYu/SeqGAN)

* TextGAN
  - [(paper) Adversarial Feature Matching for Text Generation](https://arxiv.org/pdf/1706.03850.pdf)
  - [(PT実装) TextGAN-PyTorch](https://github.com/williamSYSU/TextGAN-PyTorch)

* MaskGAN
  - [(paper) MaskGAN: Better Text Generation via Filling in the______](https://arxiv.org/pdf/1801.07736.pdf)
  - [(公式TF実装) tensorflow/models/research/maskgan](https://github.com/tensorflow/models/tree/master/research/maskgan)

* RelGAN
  - [(paper) RelGAN: Relational Generative Adversarial Networks For Text Generation](https://openreview.net/pdf?id=rJedV3R5tm)
  - [(公式TF実装) weilinie/RelGAN](https://github.com/weilinie/RelGAN)
  - [同名の画像に関するGAN](https://arxiv.org/abs/1908.07269)も存在するので注意。

* Tasks
  - 俳句生成
     - [(paper, 言語処理学会)Haiku Generation Using Deep Neural Networks](https://www.anlp.jp/proceedings/annual_meeting/2017/pdf_dir/B7-5.pdf)
     - [Generating Haiku with Deep Learning](https://towardsdatascience.com/generating-haiku-with-deep-learning-dbf5d18b4246)
基本情報20週目(3/1日)

##目標と結果##

##目標##
•アルゴリズムでの問題で読解力とコツを身に付ける。
•表計算の問題を解く。
•表計算を理解してから、問題集に挑戦。
##振り返り##

__TRY__

__KEEP__

__PROBLEM__

##次週 and more...##
[2/24](https://qiita.com/Comitakato0515/items/9fa954642ae998c8b93e)
基本情報19週目(2/24日)

##目標と結果##

##目標##

•アルゴリズムの勉強(理解度を深める)
•アルゴリズム理解した上で、過去問を解く。

##振り返り##
過去問をやってみたものの自力でまだ解ける力が身についていない。どのようにして解くという読解力、そしてコツなどを掴みたい。

__TRY__
一日1時間勉強
__KEEP__
空いている時間で過去問をやる。
__PROBLEM__
両立ができていない。
次週 and more...
RailsチュートリアルでGoogle Chromeから「パスワードを変更してください。パスワード情報が漏洩しました。」と警告を受けた

# 概要
Railsチュートリアルの7章でユーザー登録をするとChromeから次のような警告を受けてドキッとした。
<img width="1040" alt="画像1(Chromの警告画像)" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545044/db66ad55-3853-2d81-02d7-95a24d2ee26a.png">

# なぜこのような警告が出たのか
2019年12月に行われたChromeのアップデートでセキュリティが強化されたためこのような警告が出るようになったそうです。
警告の出る条件としては、「過去に漏洩したIDとパスワードの組み合わせを再度利用する」と警告が出るそうです。
Railsチュートリアルのパスワードなんて何十万回規模で使われているでしょうし警告が出るのもうなづけますね。

# 結論
そういうわけななので特に心配する必要は無いみたいです。
毎回出るので少し鬱陶しいですが...
ただし、普段利用しているサイトや新規登録の際にこの警告が出た場合にはすぐにパスワード変更やアカウントごと変更した方が良さそうですね。

# 参考
[パスワードが漏洩？Chromeで「パスワードを変更して下さい。サイトまたはアプリでのデータ侵害により～」と警告ポップアップが出る理由について](https://www.ouchiquest.com/entry/chrome-security-popup)
git pushした際のエラーrequested URL returned error: 403の解決方法

git hubに上げようとした際に下記のエラーが表示されました。


```
requested URL returned error: 403
```


##解決法

以下のコマンドをターミナルに入力します。

```
git remote set-url origin https://github.com/ユーザー名/アプリ名/.git
```

   https://github.com/ユーザー名/アプリ名/.git の部分には下記画像のURLを入力してあげます。





![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568461/e2b47033-5d09-af40-47ba-6521ee70cede.png)


そして、git push origin masterをします。

以上で完了です。
【Udemy Python3入門+応用】　24. 辞書型

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**


##■辞書型
#####◆登録
```
>>> d = {'x': 10, 'y': 20}
>>> d
{'x': 10, 'y': 20}
>>> type(d)
<class 'dict'>
```
`{}`で括ることで、辞書型となる。

#####◆呼び出し
```
>>> d = {'x': 10, 'y': 20}
>>> d['x']
10
>>> d['y']
20
```
`[]`を使うことで、辞書の中身を検索することができる。

<br>

##■新しい値に書き換える
```
>>> d = {'x': 10, 'y': 20}
>>> d['x'] = 100
>>> d
{'x': 100, 'y': 20}
```
指定したkeyの値を、新しい値に書き換えることができる。

<br>

##■新しいkeyを追加する
```
>>> d = {'x': 10, 'y': 20}
>>> d['z'] = 100
>>> d
{'x': 10, 'y': 20, 'z': 100}
```
新しいkeyを追加することもできる。

<br>

##■別の登録方法
```
>>> dict(a = 10, b = 20)
{'a': 10, 'b': 20}
>>> dict([('a', 10), ('b', 20)])
{'a': 10, 'b': 20}
```
参考まで。
deviseの使い方

##deviseの機能
deviseはユーザー管理機能を簡単に実装ためのgemです。
##deviseの使い方
まずGemfileの一番下に

```
gem 'devise'
```
を記述してターミナルで

```
$ bundle install
```
を実行します。
次にターミナルで

```
$ rails g devise:install
```
を実行すると
config/initializers/devise.rb
config/locales/devise.en.yml
が新規のファイルで作られます。
次はdeviseを利用する際のアカウントを作成します。そのためのUserモデルを新しく作成します。
作成するときは普段のmodel作成とは違い、deviseのモデルの作成用コマンドをターミナルで実行します。

````
$ rails g devise user
```
app/models/user.rb
db/migrate/20XXXXXXXXXXXX_devise_create_users.rb
test/fixtures/users.yml
test/models/user_test.rb
が新規のファイルが作られます。
また、自動的にroutes.rbに

```config/routes.rb
devise_for :users
```
が追加されます。上記の記述により、ログイン・新規登録で必要なルーティングが生成されます。
最後にターミナルで

```
$ rails db:migrate
```
を実行すればユーザー登録の機能が使えるようになります。
【Python】文字列全体を正規表現で検索して一致する文字列を全て取得する関数

文字列だけを取得したい場合は、re.findallで済みます。

```python:
target_text = "これまでに、人に感染する「コロナウイルス」は、７種類見つかっており、その中の一つが、昨年12月以降に問題となっている、いわゆる「新型コロナウイルス（SARS-CoV2）」です。 このうち、４種類のウイルスは、一般の風邪の原因の10～15％（流行期は35％）を占め、多くは軽症です。残りの２種類のウイルスは、2002年に発生した「重症急性呼吸器症候群（ＳＡＲＳ）」や2012年以降発生している「中東呼吸器症候群（ＭＥＲＳ）」です。 コロナウイルスはあらゆる動物に感染しますが、種類の違う他の動物に感染することは稀です。また、アルコール消毒（70％）などで感染力を失うことが知られています。"
keyword = "([0-9]+)"

results = re.findall(keyword, target_text)

# ['12', '2', '10', '15', '35', '2002', '2012', '70']
```



しかし、re.search()で取得できるmatchオブジェクトを全て取得したい場合に使える関数は用意されてません。
そこで、再帰的に文字列全体を検索する関数を書きます。

```python:
import re

def search_all(regrex, target, search_start_index=0, matches=None):

  if matches == None:
    matches = []

  match = re.search(regrex, target[search_start_index:])

  if match == None:
    return matches
  
  matches.append(match)
  
  return search_all(regrex, target, search_start_index + match.end() + 1, matches)
```

```python:
target_text = "これまでに、人に感染する「コロナウイルス」は、７種類見つかっており、その中の一つが、昨年12月以降に問題となっている、いわゆる「新型コロナウイルス（SARS-CoV2）」です。 このうち、４種類のウイルスは、一般の風邪の原因の10～15％（流行期は35％）を占め、多くは軽症です。残りの２種類のウイルスは、2002年に発生した「重症急性呼吸器症候群（ＳＡＲＳ）」や2012年以降発生している「中東呼吸器症候群（ＭＥＲＳ）」です。 コロナウイルスはあらゆる動物に感染しますが、種類の違う他の動物に感染することは稀です。また、アルコール消毒（70％）などで感染力を失うことが知られています。"
keyword = "([0-9]+)"

search_result_groups = search_all(keyword, target_text)

for item in search_result_groups:
  print(item.group())

# 12
# 2
# 10
# 15
# 35
# 2002
# 2012
# 70
```

## 追記
- コメントでre.findall()についてご指摘頂き追記/編集しました。ありがとうございます。
- コメントでデフォルト値を `matches=[]` と書くのはアンチパターンだとご指摘を頂き修正しました。ありがとうございます。
日付をYYYY-MM-DDの書式で返す関数 (JavaScript)

よく使うのでメモ

## Dateオブジェクトの戻り値を YYYY-MM-DD の書式に変換する関数

```formData.js
// 日付をYYYY-MM-DDの書式で返すメソッド
function formatDate(dt) {
  var y = dt.getFullYear();
  var m = ('00' + (dt.getMonth()+1)).slice(-2);
  var d = ('00' + dt.getDate()).slice(-2);
  return (y + '-' + m + '-' + d);
}
```

### 今日の日付を YYYY-MM-DDで取得する

```result.js
> formatDate(new Date());
'2020-03-02'
```


###注意点
- getMonth() は 0-11 を返す。0は1月、11が12月
- slice(-2) は、文字列の右から数えて2文字目までを抜き出す。正確には、右から 0, -1, -2 番目までを取り出し、3番目(-2)を含まないので、結局右から2文字になる。

## 応用

### n日後の日付を求める関数

```result.js

function getAfterNdays(n){
   var dt = new Date();
   dt.setDate(dt.getDate()+n);
   return formatDate(dt);
}
```

```node.js
> getAfterNdays(4);
'2020-03-06'
```

### 2つのYYYY-MM-DD形式の日付の差分(日数)を求める関数
```dateDiff.js
function getDateDiff(dateString1, dateString2) {
  // 日付を表す文字列から日付オブジェクトを生成
  var date1 = new Date(dateString1);
  var date2 = new Date(dateString2);
  // 2つの日付の差分（ミリ秒）を計算
  var msDiff  = date1.getTime() - date2.getTime();
  // 求めた差分（ミリ秒）を日付に変換
  // 差分÷(1000ミリ秒×60秒×60分×24時間)
  return Math.ceil(msDiff / (1000 * 60 * 60 *24));
}
```

```result.js
> getDateDiff("2020-03-10", "2020-03-05");
5
```
JavaScriptで文字列のハッシュ値を取得する

JavaScriptで文字列をハッシュ化する方法を探していた。
ライブラリを使わず、ブラウザだけでできないかなーと。

ようやく見つけたので記録に。

```js:ソースコード
async function sha256(text){
    const uint8  = new TextEncoder().encode(text)
    const digest = await crypto.subtle.digest('SHA-256', uint8)
    return Array.from(new Uint8Array(digest)).map(v => v.toString(16).padStart(2,'0')).join('')
}
```

```js:使い方
sha256('あいうえお').then(hash => console.log(hash))
// fdb481ea956fdb654afcc327cff9b626966b2abdabc3f3e6dbcb1667a888ed9a
```



参考： https://developer.mozilla.org/ja/docs/Web/API/SubtleCrypto/digest
[漏洞通告]jackson-2634/jackson-databind JNDI注入导致远程代码执行/官方更新白名单机制

### 漏洞描述
近日,亚信安全网络攻防实验室跟踪到`jackson-databind`更新了两个jndi注入的黑名单类,由`threedr3am`和`V1ZkRA`提交.官方同时更新安全机制,该安全机制为白名单思想,官方不再推荐使用`enableDefaultTyping`,而是推荐使用使用`activateDefaultTyping`设置可信的Java类满足业务需求.这一白名单机制,进一步保证了`jackson-databind`应用的安全性,同时不影响业务的灵活性.
### 漏洞编号
Jackson内部编号2634

### 漏洞威胁等级
中危

### 不受影响范围
jackson-databind  = 2.9.10.4
jackson-databind  >= 2.10.0(使用`enableDefaultTyping`和`activateDefaultTyping`设置可信类除外)

### 漏洞验证
这里选用2.10.2作为例子

原本代码如下
`mapper.enableDefaultTyping();`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/035a7f90-b4fa-9402-eef2-cedd61db3317.png)
可见官方已经不在推荐使用

新的用法为如下

```
PolymorphicTypeValidator ptv = BasicPolymorphicTypeValidator.builder().allowIfSubType(可信的类名.class).build();
mapper.activateDefaultTyping(ptv);
```

这里以2634中的`br.com.anteros.dbcp.AnterosDBCPConfig`举例

将原本的`mapper.enableDefaultTyping();`需要修改为如下两行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/bee0241f-dec4-e9ed-3d85-3f1ac44acfd7.png)

如果项目包中存在`br.com.anteros.dbcp.AnterosDBCPConfig`且开发者设置了`br.com.anteros.dbcp.AnterosDBCPConfig`为可信类,则将存在jndi注入隐患.

以下为两个黑名单类的演示(设置为可信类)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/4d6da605-9024-346a-bd71-2dde27170370.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/26040f31-5b41-e055-3c02-1132590c0d7c.png)

当然 Jackson的老兄弟fastjson同样受到两个黑名单类的影响

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/624d3e7f-3e9a-0248-0f1e-8a18b9b4c13b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/e8a4fb27-47b8-0678-0532-52bc0d054e0b.png)

### 修复建议
1.更新jackson-databind到最新版本
2.使用高版本JDK
### 时间轴
[0] 2020/03/02 Jackson官方发布更新
[1] 2020/03/02 亚信安全网络攻防实验室分析&复现该漏洞并发布漏洞通告

### Reference
https://medium.com/@cowtowncoder/on-jackson-cves-dont-panic-here-is-what-you-need-to-know-54cd0d6e8062
https://github.com/cowtowncoder/jackson-compat-minor/blob/db762a72da8c17befa4a14f90438858bbd498f3d/desc/cve-2634-ibatis-anteros.txt
【備忘録】jQueryでアニメーションをつける

#jQueryの備忘録

```sample.html
<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>sample</title>
    <link rel="stylesheet" href="style.css">
  </head>
  <body>
    <a class="btn" href="#" role="button">ボタン</a>
    <div></div>
    <div></div>
    <div></div>
    <script src="./main.js"></script>
    <script type="text/javascript">
    $(function(){
      $('.btn').click(function(){
        $("div").eq(0).fadeIn('slow');
        $("div").eq(1).show('slow');
        $("div").eq(2).slideDown('slow');
      })
    });
    </script>
  </body>
</html>
```
```style.css
@charset "UTF-8";
div{
    width:200px;
    height:200px;
    background:red;
    display:none;
}
```

【メモ】
・fade,show,slideDownの動きを比較
・eqメソッドを使用することで特定の位置にある要素を指定することができる。
dockerのイメージにexecする方法

dockerのイメージに直接`exec`したいときってありますよね？
普通だったら`container`にログインするために

```
docker exec -it COTAINER_NAME sh
```

見たくやると思うのですが、これをイメージでやる場合は

```
docker container run -it IMAGE_NAME sh
```
でいけます！
【Udemy Python3入門+応用】　23. タプルの使い所

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**


##■タプルの使い所
#####◆例
A、B、Cの中から2つ選んでもらうとする。

```python:multiple_choice
choose_two = ('A', 'B', 'C')

# 空のリストを用意
answer = []
# AとCを選択したとする
answer.append('A')
answer.append('C')

print('Choise from this.', choose_two)
print('Your answer is', answer)
```
```:result
Choise from this. ('A', 'B', 'C')
Your answer is ['A', 'C']
```
`choose_two`をリストで作ってしまうと、後から選択肢が書き換わってしまう恐れがある。
タプルにしておけば、間違って`choose_two`自体をいじるコードを書いたところでエラーとなるため、
バグの防止につながる。
Vue.jsで"this.〇〇 is undefined"と表示された話

#経緯

safariでweb開発をしている際に、コンソールにthis.func() is undefinedと表示されていてなんだこれは？となった時の話です。

「methods内にfunc()はちゃんと定義してあるしなあ・・・。」と、vue初心者の僕は何がいけないのかわからず、調べてみました。

# 例

簡単な例を用意しました。htmlとjsは以下の通りです。

```test.html
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
</head>
<body>
	<div id="app">
		<button @click="counter">クリック！</button>
		{{ num }}
	</div>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script src="test.js"></script>
</body>
</html>
```

```test.js
var app = new Vue({
	el: '#app',
	data:{
		num: 0
	},
	methods:{
		counter: function(){
			setInterval(function() {
				this.num += 1
			},1000)
		}
	}
})
```
![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459175/c1b5eae2-4d58-2d0c-f245-774cd70d30bb.png)
HTMLを表示するとこんな感じになります。

ボタンをクリックすると、ボタンの横の「0」が1秒ごとに1，2，3・・・と増えていきます（実際はエラーが出ます）

# 何がいけないのか

counter関数内の"this"が原因です。

このthisは、vueインスタンスのthisではなく、setIntervalのthis(window？)を指してしまっています。

# 対策
setInterval()を呼び出す前に、var th = this;というように記述しましょう。

変更後のjsファイルは以下のようになります。

```test.js
var app = new Vue({
	el: '#app',
	data:{
		num: 0
	},
	methods:{
		counter: function(){
			var th = this;
			setInterval(function() {
				th.num += 1
			},1000)
		}
	}
})
```

こうすることで、thはvueインスタンスのthisを格納することになるので、numが1ずつ足されます。
Chisel 本を手元でBuildする

ハードウェア記述言語Chiselの入門書「Digital Design with Chisel」はAmazonで買えます。電子版は無料でダウンロードできます。ソースコードもGithubで公開されています。多分Ubuntuだともっと簡単だと思いますが、手持ちのLinuxマシンがRHEL7.7しかなかったので少し面倒でした。なので面倒な部分をここに記録しておきます。

- URL http://www.imm.dtu.dk/~masca/chisel-book.html

## RHEL7.7 上でビルドする前の準備

ソースコードからPDFを生成するには、Java8,Scala,SBT,Pdflatex が必要です。

### Java 8

Java8はインストール済み

    $ java -version
    java version "1.8.0_241"
    Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
    Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode)

### Scala

いくつか方法があるが、ここではRPMファイルをとってきてインストール

    $ wget http://downloads.lightbend.com/scala/2.11.8/scala-2.11.8.rpm
    $ sudo yum install scala-2.11.8.rpm

### SBT

SBTのレポを追加してYumでインストール

    $ curl https://bintray.com/sbt/rpm/rpm | sudo tee /etc/yum.repos.d/bintray-sbt-rpm.repo
    $ sudo yum install sbt

## Latex

色々古いので、ディストロのLinuxは消す。

    $ sudo  yum erase texlive texlive*

最新版をCTANのスクリプトでインストール（結構時間がかかります）

    $ wget http://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz
    $ tar xvf install-tl-unx.tar.gz
    $ cd install-tl-20200301/
    $ sudo ./install-tl


## RHEL7.7 上でビルドする

以上で、準備ができたので、Chisel本のソースコードをCloneしてビルド

    $ git clone https://github.com/schoeberl/chisel-book.git
    $ cd chisel-book

だけど、一箇所修正が必要。

    diff --git a/figures/Makefile b/figures/Makefile
    index 3698ef5..8cf3b1c 100644
    --- a/figures/Makefile
    +++ b/figures/Makefile
    @@ -7,3 +7,4 @@ all:
            pdflatex ready_valid1.tex
            pdflatex ready_valid2.tex
            pdflatex ready_valid3.tex
    +       pdflatex tick_count_wave.tex


あとは Make一発でPDFができる（はず）

    $ make

以上。これでいつでも最新版を手元に！
sklearnで機械学習を楽しんでたらハマったところ

個人的にハマってしまったところの解決策集です。 


#max_iterがerrorになったとき
N予備校の機械学習コースで、breast_cancerのデータセットを使ってPerceptronで予測モデルを作るチュートリアルをやっていたときに出てきたエラーです。

学習を開始しようとすると、

```
ppn = Perceptron(max_iter=1000,random_state=42)
ppn.fit(X_train_std,y_train)
```

出てきたエラー

```
__init__() got an unexpected keyword argument 'max_iter'
```

代わりにn_iterを使うとerrorが出なくなりました。
n_iterは非推奨らしいので、他の回避方法がわかればアップデートします

#pandasのDataFrameが認識されなくなった件
mlxtendを入れた後,pandasがエラーを吐くようになって先に進めなくなった

```
cannot import name 'DataFrame'
```

ググってみると、conda update pandasをしろとの記事が。
やってみると、
```
Examining conflict for anaconda XXXXXXXXX python.app mlxtend scikit-learn certi/
```
(XXXは色々と変化していく)

どうもanacondaの中で、mlxtendを入れた影響でconflictしてるよう。
10分くらい経つと

```
Examining conflict for python pandas scikit-learn anaconda:  30%|▎| 3/10 [07:\
```

まだ何か解決中。。。
終了までになんやかんやで4０分経過しました

その後、jupyterで走ってるプログラムを一旦shutdownしてから、再度起動

すると問題なくRunしました
AWS EC2 + Amazon Linux2 + 初期設定やってみた メモ

やったことのまとめ

## OSの確認

ちゃんとAmazon Linux2 かな？

```
$ cat /etc/system-release

Amazon Linux release 2 (Karoo)
```

やったぜ！

## いろいろやるから管理者モードにしておく

```
$ sudo su
```

「$」が「#」になればOK

## パッケージのアップデート

```
# yum update -y
```

## パッケージの自動更新

```
# yum install -y yum-cron
```

よっしゃ！これで楽々自動更新だぜ！って思ってましたが
あらゆるシステムでお馴染みの不具合の発生っていうデメリットがあるらしい。

まぁ、個人用だし、最新でいいかな。

## タイムゾーンの更新

確認

```
# date
```

変更

```
# timedatectl set-timezone Asia/Tokyo
```

後々必要だなぁと思ったら随時追加していく。