OmniAICreator/Qiita-1.07M huggingface dataset:
新卒SEの備忘録 【MySQL 基礎編】

#【MySQL 基礎編】

新人研修時のMySQLのメモです。

#基本4大ステートメント
##１、SELECT文　テーブルの列名を指定
　SELECT 列名 FROM テーブル名 

##２、INSERT文　テーブルの指定列に、データを追加
　INSERT INTO テーブル名 (列名1, 列名2, ...) VALUES (値1, 値2, ...)

##３、UPDATE文　テーブルの指定列に、更新したい値を指定
　UPDATE テーブル名 SET 列名1=値1, 列名2=値2, ... (WHERE 条件式)
　WHERE句で特定の行を指定できる。　

##４、DELETE文　テーブルの指定した条件のデータを削除
　DELETE FROM テーブル名 (WHERE 条件式)
　WHERE句がない場合、全レコードのデータが削除されるので注意。


##基本文法
###・内部結合　(INNER) JOIN　テーブル名　ON
　結合した2つのテーブルを比較して、結合条件に一致したレコードのみを返す。

###・外部結合　LEFT, RIGHT (OUTER) JOIN　テーブル名　ON
　指定したテーブルに関して、結合条件が一致してもしなくてもレコードを返す。
　・LEFT(OUTER)JOIN　　(FROMの後に書かれたテーブルデータだけを取得)
　・RIGHT(OUTER)JOIN  　(JOINの後に書かれたテーブルデータだけを取得)

###・グループ化　GROUP BY 
　SELECT文のデータを取得時に、指定したカラム名の値を基準にグループ化する。

###・並び替える　ORDER BY
　SELECT文のデータを昇順や降順に並び変える。

###・データ取得条件を設定　HAVING
　GROUP BY句で取得したデータに関して、取得条件を設定する。

###・データの重複したものを除く　DISTINCT
　SELECT文の重複しているデータを除外する。

###・MySQLの日付形式指定　DATE_FORMAT
　yyyy/mm/dd など日付表示形式を設定する際に使用する。

###・MySQLの現在、未来、過去の内容
　now(0)→現在日時
　curdate( )-1, curdate( )+0, curdate( )+1 → 昨日、今日、明日


###・該当する要素を抽出する　IN　
　複数の一致するかの条件判定をまとめて行うために使用する。
　サブクエリで使う。

###・日付など指定　EXTRACT
　該当する日付を指定する。　
　例）EXTRACT MONTH FROM 処理日や月

###・データの存在をチェック　EXISTS
　データの存在をチェックする時に使用する。
　サブクエリで使う。

###・MySQLの和集合　UNION
　複数テーブルを同時に取得する場合に使用する。
　(重複行取得する場合は、UNION　ALLを使用)

###・文字列操作（連結）　CONCAT
　文字列を結合する時に使用する。

###・文字列操作（部分削除）　LEFT（xxx,3）
　文字列の左から、3文字のみ表示させる。

###・文字列操作（部分置換）　REPLACE（xxx,'□□□','△△△'）
　文字列□□□を△△△に置換する場合に使用する。
仮想マシンでChromeOSを動かす

# CloudReady

- CloudReadyはChromiumOSから派生したOS
- VMWare用のイメージは配布されている
  - 2020/8/29現在、VirtualBoxでは動かない（2019/12くらいまではVirualBoxでも動いていたのかも）  
```
CloudReady will not work with Virtualbox as a host-application due to graphics incompatibilities
```
- 手順
  - VMWare用のイメージをダウンロード  
https://cloudreadykb.neverware.com/s/article/Download-CloudReady-Image-For-VMware
  - VMWareaで「仮想マシンを開く」でダウンロードしたovaファイルを指定する
- 参考
  - https://cloud-work.jp/windows_pc/chromiumos/virtual_chromiumos/

# ChromiumOS

- ChromiumOSのVitualBox用のビルドは2017年9月版の60.0.3112.114が最後となっている
  - https://github.com/crosbuilder/CustomBuilds/releases/tag/R60-9592.96.2017_09_20_2221
- 基本的にはこちらのページに従う  
https://note.com/moli9ma/n/n5d3270ba90e7
- 手順
  - VirtualBox用のカスタムビルドをディスクイメージをダウンロードする R60-9592.96.2017_09_20_2221.vdi.zip
  - VirtualBoxでLinux 64bit用の仮想マシンを作る
  - 仮想マシンのディスクイメージとして上記ファイルを展開したvdiファイルを指定する
  - 設定/システム/マザーボード/EFI有効化のチェックは外す
  - 設定/システム/プロセッサ/PAE/NXを有効化のチェックはつける
  - 設定/ディスプレイ/スクリーン/グラフィックスコントローラでVBoxVGAを選ぶ（VMSVGAでは起動できなかった）
  - 起動後、「入力」メニューから「マウス統合」を外す
【Rails】テーブルにカラムを追加する際、キャメルケース以外で記載したらどうなるの？


#マイグレーションに新カラムを追加したい#
●Railsに「devise」gemをインストールし、ログイン機能を作成。
●サインアップ時に、元々テーブルにはなかった「ニックネーム機能」（カラム）を作成・追加したい。


```ruby:qiita.rb
#　定義
rails g migration Addカラム名To追加先テーブル名　追加するカラム名：型
#　例
rails g migration AddNicknameToUsers nickname:string
```

ターミナルで、上記コマンドを実行すると、マイグレーションに新しいカラムを追加する事ができます。

そこで以下の2つの疑問を感じました。

#疑問１：Addカラム名To追加先テーブル名の「カラム名」と「テーブル名」を大文字にしなかったら（キャメルケースにしなかったら）どうなるの？

***結果***
**マイグレーションファイルは作成されるもののSequelPro上のカラムはうまく生成されなかった。**

【ターミナル上】

hogehoge % rails g migration AddnicknameTousers nickname:string
Running via Spring preloader in process 40102
      invoke  active_record
      create    db/migrate/20200829125120_addnickname_tousers.rb
hogehoge % rails db:migrate
== 20200829125120 AddnicknameTousers: migrating ===============================
== 20200829125120 AddnicknameTousers: migrated (0.0000s) ======================


```ruby:20200829125120_addnickname_tousers.rb
class AddnicknameTousers < ActiveRecord::Migration[6.0]
  def change　　#カラムの追加が出来ていない
  end
end
```



#疑問２：Addカラム名To追加先テーブル名をスネークケースにしたらどうなるの？
***結果***
**同じように作成できた。**

【ターミナル上】
hogehoge % rails g migration Add_nickname_To_users nickname:string
Running via Spring preloader in process 40241
      invoke  active_record
      create    db/migrate/20200829125501_add_nickname_to_users.rb
hogehoge % rails db:migrate
== 20200829125501 AddNicknameToUsers: migrating ==============================
-- add_column(:users, :nickname, :string)
   -> 0.0229s
== 20200829125501 AddNicknameToUsers: migrated (0.0230s) =====================

```ruby:20200829125501_add_nickname_to_users.rb
class AddNicknameToUsers < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :nickname, :string  #カラムの追加が出来た！
  end
end
```


以上です。
間違いなどありましたら、ご指摘いただけると嬉しいです。
SAP CPのCloud Foundry環境におけるXSUAAサービスプランの差異

この記事は #chillSAP の #夏の自由研究2020 29日目の記事として執筆しています。

#はじめに
SAP CP上でアプリケーションを作成する際にセキュリティに関する設定は避けて通れません。細かいことはさておき、CF環境におけるXSUAAサービスプランの差異の一部を確認します。

#XSUAAのサービスプランについて
現在（2020/08/29）、SAPはトライアル環境であるか否かに関係なく5つのサービスプランを提供しています。eu10環境でもjp10環境でも変わりません。
![serviceplans.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167695/092ad715-7eb6-7107-038e-04689fe0c574.png)



[Jeffreyの記事](https://blogs.sap.com/2020/08/20/demystifying-xsuaa-in-sap-cloud-foundry/)によれば、90%のケースでこのサービスプランは**application**で十分だろうとされています。

この90%という値が妥当か否か、私個人の関心の観点から簡単に確認しました。

#確認方法
XSUAAの各サービスプランのインスタンスを用意し、Authorization code flow用のOAuth登録でJWTを取得します。JWTはclient credentialで取得し、そのscopeを覗いてみます。この確認方法をとる都合で、確認対象となるサービスプランはapplication、brokerおよびapiaccessの3つに今回は絞られています。

#確認結果
それぞれのサービスプランでは以下のscopeが含まれていました。

| application | broker | apiaccess |
|---|---|---|
| uaa.resource | uaa.resource | xs_user.write, uaa.resource, xs_authorization.read, xs_idp.write, xs_user.read, xs_idp.read, xs_authorization.write|

#90%の妥当性
以上の確認結果から、“90%の場合でapplicationプラン”はおおよそ直感的に妥当に思えます。
uaa.resourceがあれば、リソースサーバとしての機能は実行することができます。したがってapplicationプランを選択すれば、確かに多くのビジネスアプリケーションにおいてサービスプロバイダ（のエントリーポイントに結び付けられるアプリケーション）として役目を果たすことができます。これはbrokerプランも同様です。

一方で、apiaccessプランには文字通りapiにアクセスするための権限が含まれています。これによりアプリケーションそのものがSAP CPの外にあったとしても、サービスキーを保持していればAuthorization and Trust ManagementのAPIを触れます。（サービスキーをSAP CPの外に露出させるようにアプリケーションを用意することはセキュリティ上あまりないと思いますが...）また、これらの権限があることによってUAAテナントの設定をアップデートすることも可能になるため、X-Frame-Optionsなどの値を変更することもできるようになります。残り10%のアプリケーションにはこのようなサービスプランを利用する必要もありそうです。

#その他
質問やコメントなどがあればお待ちしております。
twitter-omniauthのgemでつくるTwitterログイン機能のあるあるエラー4選とその対処法

Ruby On RailsでTwitterログインによるユーザー管理機能を実装するときのあるあるエラー4選とその対処法です。

# 環境
- mac OS Catalina 10.15.6
- Ruby 2.6.3
- Rails 6.0.3.2
 
# メールアドレス認証
ユーザー管理機能のベースにはdeviseのgemを使います。
Twitterログイン機能の作成にはomniauth-twitterのgemを使います。

```ruby:Gemfile
gem 'devise' 
gem 'omniauth' 
gem 'omniauth-twitter'
```

```
bundle install
```

参考：
[deviseで新規登録時にメールを送る](https://qiita.com/nekononeko_53/items/0af968c9617e404c45a1)
[RailsにDevise+OmniAuthでユーザ認証を実装する手順](https://qiita.com/zenizh/items/94aec2d94a2b4e9a1d0b)

# エラー1: サインアップしようとするとエラーが出る 
```
NameError in Devise::RegistrationsController#create\_ \_undefined local variable or method \`confirmed\_at' for #User: Did you mean? confirmed?
```

## 解決法
Userモデルに#confirmableのカラムを足す

```ruby:user.rb
devise :confirmable
```

# エラー2： Missing host to link to!が出る
```
Missing host to link to! Please provide the :host parameter, set default\_url\_options\[:host\], or set :only\_path to true\_ 
```

## 解決法
config > environment > development.rbでhostのurlを指定する

```ruby:/config/environments/development.rb
  host = 'samplehost'
  Rails.application.routes.default_url_options[:host] = host
```

参考：[RailsでMissing host to link to!が出たときに。model内でURL組み立てる場合の設定](https://qiita.com/daik/items/41a9bc8dec5ccec37f40)

# エラー3: 新規登録/ログインボタンの押下後に、またdeviseのログイン画面が表示される（ログインページに戻ってしまう）
ユーザー情報をDBに登録できていないことによるエラーです。
# 解決法

1. emailアドレスを自動で設定する処理を入れる   
参考：[Devise内でomniauthのtwitter認証が完了してもレコードが格納されない](https://teratail.com/questions/66716)
2. emailアドレスをそもそも無視する  
参考: [persist?がfalseになる原因。](https://teratail.com/questions/54276)  
3. devise.rbから :validatable を削除する などのパターンがある。   
参考：[devise/omniauth login with twitter - validation failed: email can't be blank](https://stackoverflow.com/questions/10374827/devise-omniauth-login-with-twitter-validation-failed-email-cant-be-blank) 

1がおすすめ。

# エラー4: ユーザーIDが取得できない
```
undefined method \`id' for nil:NilClass 
```

エラー原因：ログインできておらず、ユーザーIDがnullになっている 
参考：[undefined method `id' for nil:NilClassについて](https://teratail.com/questions/67514)

## 解決法
current_userに値があるかどうかチェックする
AWS Lambda python「デプロイパッケージが大きすぎてインラインコード編集を有効にできません」の回避方法

AWS Lambda を python で書いています。パッケージを入れてZIPでアップロードすると、「デプロイパッケージが大きすぎてインラインコード編集を有効にできません」と出て、インラインコード編集が使えません。
これを回避する方法を紹介します。パッケージを別にして AWS Lambda レイヤーに登録します。
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/1430b86d-a15a-ff1e-64c5-e38f6f6829af.png)

# 方法

## 1. python パッケージをフォルダにまとめます

```
pip install xxx -t ./python/
```
上記のように書くとpythonというフォルダにパッケージがまとまります。

## 2. AWS Lambda レイヤーにアップロード

![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/9ac43478-bfae-d86d-19d2-ed5ee35c81c9.png)
先ほどの python フォルダを ZIP にしてアップロードします。

## 3. AWS Lambda 関数でレイヤーを選択

![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/b4df758d-8b7b-a9a3-4a43-ee77caf2af40.png)
先ほどのレイヤーを選択します。これで Lambda はメインの python ファイルのみでOKです。

# あとがき
今回の記事は短いですが以上です。インラインコード編集は超便利です。私は2年間ローカルで書いてZIPファイルをアップロードしていました。もっと早く気付けばよかったです。
【Git】リポジトリを追加する方法

備忘録として

ローカルに作成したディレクトリをgitにあげたいとき、
リポジトリを追加したいときに。

#まずはgit remote add
```
$ git remote add origin [リポジトリurl]
```
#じゃあ早速pushしてみるが...
`git remote add `のコマンドを実行したことでリポジトリが追加されて、これで`git add .`から`git commit`ができた

じゃあさっそくpullしてみると以下のエラーが

```bash
 ! [rejected]master -> master (fetch first)
error: failed to push some refs to 'https://github.com/yktk435/configure.git'
```

[GitHubへのpushが「fetch first」と表示されてrejectedとなったときの対処](https://wonderful-tereshkova-38f91d.netlify.app/GitHub%E3%81%B8%E3%81%AEpush%E3%81%8C%E3%80%8Cfetch%20first%E3%80%8D%E3%81%A8%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%A6rejected%E3%81%A8%E3%81%AA%E3%81%A3%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AE%E5%AF%BE%E5%87%A6/)によると、リモートリポジトリで変更した内容がローカルに反映されていないことが原因だという。

リモートリポジトリとローカルリポジトリを一致させるために`fetch`をしたあとに
`push`してみる

##またエラー
```bash
 ! [rejected]master -> master (non-fast-forward)
```
よくわからないけど[『 ! [rejected] master -> master (non-fast-forward) 』のせいでpushできねぇッ!!](https://qiita.com/Hiroki-IT/items/1671514eb659880e5bef)を参考にすると、`merge`で解決できるようで,素直に以下を実行

```
$ git merge --allow-unrelated-histories
```

###しかしエラー

```bash
fatal: No remote for the current branch.
```
gitでpullスべきブランチがわからないらしい

後ろに`origin/master`を付ける必要があった

```
$ git merge --allow-unrelated-histories origin/master
```
###更にエラー
```bash
CONFLICT (add/add): Merge conflict in README.md
Auto-merging README.md
Automatic merge failed; fix conflicts and then commit the result.
```
コンフリクトを起こしてるってさ

`git status`を見るとこうなった

```bash
$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)
	both added:      README.md

no changes added to commit (use "git add" and/or "git commit -a")
```
addしといいているからaddする
その後はコミットからpushまですんなりと行けた。
【非エンジニア 医療卸営業職】潰瘍性大腸炎が去年(2019)の日本消化器学会でどんな発表があったのか?

#### 医療業界の営業職は学会の動向なども気になるので演題集等や抄録集を見る機会も多いのですが読むには骨が折れます。
#### 学会Webサイトに　テキストやcsvで置いてあれば便利なのですが大抵はPDFファイルなので pdftotext は大変重宝すます。
#### 非エンジニアの営業職ですが どなたかの参考になれば...。
#### 環境: Debian Buster

#### 今回は 安倍首相 辞任の理由となった 「潰瘍性大腸炎」が 昨年の日本消化器学会の演題でどんな発表があったのかみてみます。
#### まず、去年(2019)の日本消化器学会 「一般演題(口演)」を拾ってくる。

```wget http://www.med-gakkai.org/jsge2019/pro/data/pro_13.pdf```

#### 発表プログラムは 複数ページの pdfファイルなので pdftotext でテキストを抽出、改ページ ^L を -nopgbrk で無視し、grep で関連しそうな単語でフィルターをかけて、csvファイルに書き出してみます。

```pdftotext -nopgbrk pro_13.pdf  - | grep "クローン病\|潰瘍性大腸炎\|UC\|IBD" | sed 's/ /,/1' > daityouen.csv```

#### 下の例だと 出力 をvisidata に渡しています。

```pdftotext -nopgbrk pro_13.pdf - | grep "クローン病\|潰瘍性大腸炎\|UC\|IBD" | sed 's/ /,/2' | vd --header=0 -d,```

#### 病院名、疾患名、個人名のリストがあれば grep -f list.txt で自由に抽出できます。(VisiData だけでも上の処理はできるのですが...。)

#### お役所のデータもそうだけど 医療系も使えるデータとしてでなく「閲覧目的」のデータで二次利用し難いので pdftotext コマンドや grep sed が重宝します。

#### 自分はデータの下処理には csvkit、VisiData 、適当なシェルスクリプト、分析&視覚化には jyupyterlab を使っていますがまたの機会に...。(書きたいけど超長くなりそう...。)
golangの基本的なこと

# Basic variable types

* bool
* signed integer: int int8 int16 int 32 int64
* unsigned integer: unint unit8 unit16 unit32 unit64 unitptr
* byte (alias for uint8)
* run (unicode point, alias for int32)
* float32 float64
* complex64 complex128

# integer comparison

| Type | Description |
|:---|:---|
| int unit uintptr | at least 32 bit based on OS (32 bit on 32 bit OS, 64 bit on 64 bit OS   |
| int8  | `-128 ~ 127` ($ -2^7$ ~ $2^7-1$)|
| unit8  | `0 ~ 255`  (0 ~ $2^8-1$)|
| int16  | `-32768 ~ 32767` |
| unit16  | `0 ~ 65535`  |


_(if there is no any special reason, int should be used when we need a number)_

* byte = unit8 (these types are to differentiate byte and number)

# Get the biggest number of a type

| Type | Go syntax | Meaning|
|:--|:--|:--|
| unint64  |  1<<64 - 1 | 2^64 - 1 |
| unint8  | 1<<8 - 1  | 2^8 - 1 = 255 |

## How it works?

```go
big = 1 << 100 // shift a 1 bit left 100 places <=> 2^100
small = big >> 99 // it right again 99 places <=> 2^-99, so we end up with 1<<1, or 2
```
https://tour.golang.org/basics/16


# Type conversion

```golang

var i int = 42
var f float = float64(i)
var u int = unint(f)

// same as
i := 42
f := float64(i)
u := uint(f)
```

# init() function

* init() is called after package variable declaration
* each package may have multiple init()
* order of calling init() (in case of multiple init) is un-guaranteed

# main() function

main() is called after all init() are run
CSSでダークモード時のスタイルを指定する

`prefers-color-scheme: dark`の中にダークモード時のスタイルを記述する

```css
@charset "UTF-8";

body {
    color: #333;
}

/* ダークモード */
@media (prefers-color-scheme: dark) {
    body {
        background: #333;
        color: #fff;
    }
}
```


https://caniuse.com/#feat=mdn-css_at-rules_media_prefers-color-scheme


## その他
2020年8月時点でIEは未対応
https://caniuse.com/#feat=mdn-css_at-rules_media_prefers-color-scheme

`@media (prefers-color-scheme: light)` もある
https://developer.mozilla.org/ja/docs/Web/CSS/@media/prefers-color-scheme
UnityでPythonの処理を非同期で実行した後にC#処理を行う

#やりたいこと
UnityでPython処理→C#処理の順で実行したい
#この記事を書いた理由
Pythonで書いたチャットシステムをUnityで動かそうとするとC#のProcessという処理が必要になる。
しかし、Processで重い処理を同期的に行うとUnityが固まってしまう！
Processで非同期処理を行うとPythonの処理の後にC#の処理が実行できない！

#実現方法

```C#
//出力されたデータを保存する変数
private StringBuilder output = new StringBuilder();

public void Python()
    {   
        //新規プロセスの立ち上げ 
        var p = new Process();
        //プロセスの設定
        p.StartInfo.FileName = pyExePath; //Pythonファイルの場所
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.CreateNoWindow = true;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.Arguments = pyCodePath; //実行するファイル名
        p.StartInfo.StandardOutputEncoding = Encoding.GetEncoding("shift_jis"); //Pythonの出力結果をshift-jisに変換

        //イベントハンドラの設定
        //pythonから出力があるたびに呼び出される
        p.OutputDataReceived += new DataReceivedEventHandler((sender, e) =>
        {
            string str = e.Data;

            if (!String.IsNullOrEmpty(str))
            {
                UnityEngine.Debug.Log(str);
                output.Append(str+"\n");
            }

        });
        p.Start();

        UnityEngine.Debug.Log("プロセス実行中に非同期で開始されます");


    }

    void Update()
    {
        if(output.Length != 0){
            UnityEngine.Debug.Log("プロセスが完了した後実行されます");
            output.Length = 0 ;
        }
    }
}
```

#簡単な解説
Processを行う関数内に次の処理を書くとどうしてもうまくいかないため、Processで得られるPythonからの出力結果が得られたらUpdate関数で実行するという方法をとることでPython→C#というようにできました。
【Github】一人擬似チーム開発の練習

# はじめに

参考にさせていただいた記事等はこちら
https://qiita.com/hikaru_/items/dc875b27a515f9ee9284

https://qiita.com/gold-kou/items/7f6a3b46e2781b0dd4a0



#この記事ですること
####【目的】
issue作成　→　branch作成　→ プルリク　→ マージ
という一連の作業を一人で行う。

####【開発環境】
筆者（プログラミング始めて６２日目。git、githubについて初歩的な知識はあるレベル）
MacBook Pro
cloud9
Github

#下調べ
####【ぐぐる】
　キーワードは「github、一人擬似チーム開発、プルリク、マージ」を組み合わせる。
　今回は、主にqiitaで検索しました。

#作業開始

####【作業の流れ】
　・issue作成
　・リモートリポジトリのクローン作成
　・作業ブランチ作成
　・作業終了後から、リモートリポジトリにpushするまで
　・プルリクエスト作成
　・merge

####【issue作成】
１、githubにサインインします。

２、作業を行うファイルに入り、issue（画面左上）をクリックします。

[![Image from Gyazo](https://i.gyazo.com/1ab16e421166dc8aaa55c2fcc81d77a5.png)](https://gyazo.com/1ab16e421166dc8aaa55c2fcc81d77a5)


３、New issueボタンをクリックします。
[![Image from Gyazo](https://i.gyazo.com/45b919a82eed8bbf8f7e5e215090ddef.png)](https://gyazo.com/45b919a82eed8bbf8f7e5e215090ddef)

４、issueのタイトルと内容を設定します。
書いたら、「submit new issue」ボタンを押します。

[![Image from Gyazo](https://i.gyazo.com/c8fe9f31bd4b0aeb13974d43e98e6a21.png)](https://gyazo.com/c8fe9f31bd4b0aeb13974d43e98e6a21)

これでissue作成は終了！

####【リモートリポジトリのクローン作成】
作業するファイルを、githubから、自分のワークスペースにコピーして持ってきます。

１、codeを押し下げし、urlをコピーします。

[![Image from Gyazo](https://i.gyazo.com/b471b0a1a0e78470f1f56608fdf1af72.png)](https://gyazo.com/b471b0a1a0e78470f1f56608fdf1af72)


２、コピーしたurlを使って、ターミナル上で以下のコマンドを実行します。


```
git clone url
```


これで、ワークスペースに、リモートリポジトリと同じファイルのクローンができているはず！


####【作業ブランチ作成】
今回の作業を行う前に、作業ブランチをきります。
作業ブランチ名は「re_file_name」にしました。

```
$ git branch re_file_name
```


まだmasterブランチのままなので、ここからre_file_nameブランチに移動します。


```
$ git branch re_file_name
Switched to branch 're_file_name'
```

移動したら、issueに沿ってファイル名の変更を行います。

####【作業終了後から、リモートリポジトリにpushするまで】

１、差分を確認します。
「差分」とは、ざっくり言うと、新しいファイルと古いファイルの違いや修正部分のこと。
ここでは自分が修正した部分が間違いないか（ファイル名の変更ができているか）を確認しています。

```
$ git status
```

２、ステージングを行います。

ステージング方法にはいくつか種類がありますが、ここでは全てのファイル、ディレクトリを一気にステージングするコマンドを使います。
ファイル名を変更するという作業しか行っていないので、コミットする作業を選ぶ必要もないため、全部ステージングで良いかと。


```
$ git add .    
```

３、ステージングした変更箇所を、コミットします。

```
$ git commit -m 'コミット名'
```

コミット名は今回は 're_file_name'としました。


４、リモートリポジトリにpushします。

```
$ git push origin ブランチ名
```

####【プルリクエスト作成】

ここで一旦githubに行き、プルリクの作成を行います。
こんな感じで、プルリクが作成できるような表示になっているはずです。

[![Image from Gyazo](https://i.gyazo.com/2179723c0bc2bd36f30018b24a50d2d3.png)](https://gyazo.com/2179723c0bc2bd36f30018b24a50d2d3)


１、compare & pull requestボタンを押して、プルリク作成画面に移動します。

２、プルリク作成画面でコメントを書きます。
今回は上司に確認をとるイメージで、コメントを書いてみました。


[![Image from Gyazo](https://i.gyazo.com/2f95a2caedfc572584e64e4ae037bc9b.png)](https://gyazo.com/2f95a2caedfc572584e64e4ae037bc9b)

３、create pull requestボタンを押します。

####【merge】

今度は上司になったつもりで、プルリクされたファイルを確認します（割愛）。

１、merge pull requestを実行します。

[![Image from Gyazo](https://i.gyazo.com/69432a3d4a6e6c380be0a86593080867.png)](https://gyazo.com/69432a3d4a6e6c380be0a86593080867)

２、confirm merge ボタンを押します。

[![Image from Gyazo](https://i.gyazo.com/599b30b47b79364d52d3b7ca6f4e67ca.png)](https://gyazo.com/599b30b47b79364d52d3b7ca6f4e67ca)


#作業完了

今回一人作業なのに結構コンフリクトが起きたので、次回は一人コンフリクトの起こし方と、解消方法を書いてみたいと思います。
PythonとNumbaで数値計算を高速化するときの知見

研究でPythonプログラムの高速化のためにNumbaを使用しました．
実装にあたって，いろいろエラーが出てつまずいたので，その知見をサンプルとして共有します．

私の場合ですが，ルンゲクッタ法を使う粒子群最適化法の計算が，約2000秒→約60秒と33倍の高速化になりました．

**※注意※**
- Numbaの基本的な使い方は参考文献を参照してください．
- すべての使用例では，nopythonモードである```njit```を使用しています．
- Numbaは引数や戻り値の型を指定しなくても動作する場合がありますが，ここではすべて指定することを前提とします．

## 1. 環境
```sh
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.2
BuildVersion:	19C57

$ python -V
Python 3.8.5

$ pip freeze
numba==0.51.0
numpy==1.19.1
```

Numbaは以下のコマンドでインストール出来ます．

```sh
$ pip install numba
```

## 2. 使用例

### 2-1. 関数内で```np.empty```を使用する

numbaを使用する場合，関数内で```np.empty```を使用するとエラーが出ることがあります．
その場合，以下のように型を指定するとうまく動作しました．

```python:main.py
import numpy as np
from numba import njit

@njit("f8[:,:]()")
def func():
    x = np.empty((1, 2), dtype=np.float64)
    return x

print(func())
```

### 2-2. 複数の戻り値を返す

複数の戻り値を返す場合，```Tuple((i8, i8))```のように書きます．
カッコが２重になっていることに注意が必要です．

```python:main.py
import numpy as np
from numba import njit

@njit("Tuple((i8, i8))(i8, i8)")
def func(x, y):
    return x, y

print(func(1, 2))

```

### 2-3. 多次元のリストを扱う

Numbaで多次元のリストを扱う場合，```f8[:,:]```のように書きます．
2次元だからコロンが２つというわけではなくて，何次元でも２つでいいようです．

```python:main.py
import numpy as np
from numba import njit

@njit("f8[:,:](f8[:,:])")
def func(x):
    return x ** 2

x = np.random.rand(5, 5)
print(func(x))
```

## 3. 終わり

Pythonの高速化はCythonやJuliaなど色々な方法がありますが，デコレーターを書くだけのNumbaによる方法は一番簡単なものだと思います．

クラスやジェネレーターが使えないなどの制約はありますが，ボトルネックを局所的に高速化するやり方であれば，比較的容易に実装できるものだと感じました．

## 4. 参考文献

- [numbaによるfor文の高速化とjitの引数](https://qiita.com/nabenabe0928/items/a02964d8b48619b1e348)
- [Python高速化　Numba入門　その2] (https://www.google.com/search?q=numba+int&oq=numba+int&aqs=chrome..69i57j0l7.1922j0j1&sourceid=chrome&ie=UTF-8)
- [How to use np.empty inside numba compiled function; Error message “All templates rejected”
](https://stackoverflow.com/questions/51106618/how-to-use-np-empty-inside-numba-compiled-function-error-message-all-templates)
スクロール可能な画面でViewを下に配置する

# はじめに

スクロール可能な画面で下に配置されているViewを、画面に余裕があれば、画面いっぱいに使ってViewを配置するようなレイアウトの実装方法。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506759/a6f31519-da84-88bb-5dcf-74eb7c90edd4.gif">

# 実装方法

```xml
<ScrollView
    ...
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    >

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >

        <TextView
            ...
            android:id="@+id/text_view"
            app:layout_constraintBottom_toTopOf="@id/button"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_chainStyle="spread_inside"
            />

        <Button
            ...
            android:id="@+id/button"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toBottomOf="@id/text_view"
            />
    </androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
```

## fillViewport

`fillViewport`を設定することで、ScrollView内のレイアウトを拡大して画面いっぱいに表示できる。

```xml
<ScrollView
    ...
    android:fillViewport="true"
    />
```

## spread_inside

下に配置するViewと上のViewにChainStyleを指定することで、Viewを画面端に寄せられる。
具体的には、上のViewの`layout_constraintBottom_toTopOf`に下のView、`layout_constraintVertical_chainStyle`に`spread_inside`を設定する。
また、下のViewの`layout_constraintTop_toBottomOf`に上のViewを設定する。

```xml
        <TextView
            ...
            android:id="@+id/text_view"
            app:layout_constraintBottom_toTopOf="@id/button"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_chainStyle="spread_inside"
            />

        <Button
            ...
            android:id="@+id/button"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toBottomOf="@id/text_view"
            />
```
PHPにおけるアロー演算子

#プログラミングの勉強日記
2020年8月29日
アロー演算子(`->`の記号)の使い方をまとめる。

#アロー演算子とは
　上でも述べたが、`->`の記号のことをアロー演算子という。アロー演算子は左辺にクラスのインスタンスを、右辺に左辺のクラスが持つプロパティやメソッドを指定してプロパティへのアクセス・メソッドの呼び出しをする。

#書き方
　アロー演算子の使用例は以下のようになる。

```php
// インスタンスが持つプロパティであるプロパティ名にアクセス
$instance->プロパティ;
// インスタンスが持つメソッドであるメソッドの呼び出し
$instance->メソッド();
```

　具体的に以下の例では、「sports」というクラスの中にある「$basketball」という変数にアクセスして値を取り出す。

```php
class Sports {
  $basketball = "バスケ"
  $baseball = "野球"
  $soccer = "サッカー"
}
fruit->$basketball //野球
```

#DataTimeクラスを用いて日付を取り出す
　DataTimeクラスから日付を所定のフォーマットとして取り出す。DataTimeクラスに日時やタイムゾーンが格納されている。

```php
// DateTimeクラスで現在の日時を取得し変数に格納
$date = new DateTime();
 
// その変数からformatを使って日時を出力
echo $date->format('Y年m月d日');

// 出力結果
// 2020年8月29日
```

#具体例
　クラス名やプロパティ名、メソッド名、メソッド内の処理などを指定してアロー演算子の使い方をまとめる。
　プロパティとして`name`を持ち、メソッドとして`introduceSports`を持つスポーツクラス`Sports`を定義する。

```php
// スポーツクラス
class Sports {
  // 名前
  $name;
  
  // コンストラクタでインスタンス生成時に名前を設定する
  function __construct($name) {
    $this->name = $name;
  }

  // 好きなスポーツを紹介する
  function introduceSports() {
    echo "好きなスポーツは". $this->name ."です".PHP_EOL;
  }  
}

// スポーツの名前が「バスケットボール」のスポーツクラスのインスタンスを生成
$basketball = new Sports("バスケットボール");

// 名前にアクセスして確認する
echo $basketball->$name.PHP_EOL;  //バスケットボール

// 紹介のメソッドを呼び出す
$basketball->instoduceSports(); //好きなスポーツはバスケットボールです
```

#参考文献
[PHPでアロー演算子を使う方法【初心者向け】](https://techacademy.jp/magazine/19296)
[PHPのアロー演算子（->）をできるだけ分かりやすく](https://www.flatflag.nir87.com/arrow-249)
Linux (ファイルとディレクトリについて)

こちらでは<b>ファイル</b>と<b>ディレクトリ</b>について解説を行います。
ファイルは皆さん知ってますかね？
Excelファイルとかwordファイルとか、ものすごく簡単に言うとデータの塊がファイルです。

ディレクトリは聞いた事ありますか？
Mac使っている人は聞いた事があるかもしれませんね。Windowsだと聞かないですよね。
ディレクトリはフォルダと考えてください。
フォルダは複数のファイル・フォルダをまとめているものです。フォルダの中にフォルダ、、？となるかもしれませんが、、
たとえば、2020年フォルダの中で1月分・2月分でファイルを分けたい時に、2020年フォルダの中にさらに1月フォルダ(1月分のファイルがまとまっているもの)・2月フォルダ(2月分のファイルがまとまっているもの)を作成していると考えて頂くとわかりやすいと思います。


さて、本題へ
ターミナル上で実際にファイルの確認を行いましょう。

その前に、、useraddコマンドを使用してnekoユーザーを作成しておきましょう。
-m(--create-home)オプションをつけて、ホームディレクトリも作成しましょう。(ホームディレクトリは簡単に言うと、nekoユーザーがファイル作成したり出来るプライベートルームと思ってください。他のディレクトリだと権限がないと、ファイルも作れないので)

```
［root@localhost ］# useradd -m neko
```

<font color=red>
<h1>ls</h1>
</font>
lsコマンドをターミナル上に入力してください。
ファイルの一覧が表示されます。何も出てこなければ、ファイルが存在していない事になります。

```
[neko@localhost ~]$ ls
tyu-ru.txt  nabe.txt
``` 

上記の場合はtyu-ru.txtとnabe.txtのファイルが存在していますね。
<font color=red><b>touch</b></font>コマンドを使って、mike-nekoファイルを作成しましょう。

```
[neko@localhost ~]$ touch mike-neko.txt
```

もう一回ファイルを確認しましょう。

```
[neko@localhost ~]$ ls
tyu-ru.txt  nabe.txt  mike-neko.txt
```

完成しましたね。
余談ですが、lsはLiSt filesの略です。Linuxでは、英語を省略した名前のコマンドがよく見られます。コマンドを覚える際に、この考え方を身につけておくと役に立ちます。

<font color=red>
<h1>cp</h1>
</font>

作成したmike-nekoファイルのコピーし、kuro-nekoファイルを作成します。<font color=red><b>cp</b></font>コマンドを使用します。


```
[neko@localhost ~]$  cp mike-neko.txt kuro-neko.txt
```

lsコマンドでファイルのコピーが上手く出来ているかの確認を行いましょう。

```
[neko@localhost ~]$ ls
tyu-ru.txt  nabe.txt  mike-neko.txt  kuro-neko.txt
```

上手くできていましたか？

<font color=red>
<h1>mv</h1>
</font>

ファイルの名の変更を行いましょう。<font color=red><b>mv</b></font>コマンドを使用します。
<font color=red><b>mv</b></font>は、ファイルの移動の際に使用する機会が多いです。
kuro-nekoファイルをsiro-nekoファイルに変更しましょう。

```
[neko@localhost ~]$ mv kuro-neko.txt siro-neko.txt
```

では、変更を確認しましょう。

```
[neko@localhost ~]$ ls
tyu-ru.txt  nabe.txt  mike-neko.txt  siro-neko.txt
```

変更されてますね。

<font color=red>
<h1>rm</h1>
</font>

ファイルの削除を行いましょう。<font color=red><b>rm</b></font>コマンドを使用します。
tyu-ru.txtファイルの削除を行います。

```
[neko@localhost ~]$ rm　tyu-ru.txt
```

さあ、確認です。

```
[neko@localhost ~]$ ls
nabe.txt  mike-neko.txt  siro-neko.txt
```

どうでしょうか？


今回はこの辺にしておきましょう。
<font color=red>
<ul type="circle">
<li>ls</li>
<li>touch</li>
<li>cp</li>
<li>mv</li>
<li>rm</li>
</ul>
</font>

コマンドを覚えましょうね。

<a href="https://qiita.com/larcmiya/items/10d3cd16bc6bcfecfa8c">続く</a>
[イーロンマスク] Neuralinkの最新情報まとめ

日本時間8月29日午前7時に、NeuralinkによるプレゼンテーションがYouTubeのライブ配信で行われました。
[Neuralink Progress Update, Summer 2020](https://www.youtube.com/watch?v=DVvmgjBL74w&feature=youtu.be)

![129.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/83cfe015-a2e9-d64f-8a5a-458bc3bc65be.jpeg)

## 今回プレゼンテーションを行った目的

Neuralinkで働いてくれる技術者を募るため

## プレゼン内容要約

新しい脳インターフェイス「LINK V0.9」を発表。

昨年の発表の時とは形がかなり変わっている。
（左が昨年。右が今回のデバイス）

![130.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/70ca1933-2e82-5706-ca6e-3de76b198a47.jpeg)

![131.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/fe6e71b0-50be-fce0-457b-2d749a47dbd4.jpeg)

↓実物
![8c0d02c0-e9a5-11ea-bbf9-7687e2c8cb8c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/b1cb6dd1-33da-f604-bb39-321ff12b7b53.jpeg)

- 脳に1024本の電極が接続される
- 頭蓋骨に穴を開け、そこにスッポリ収まるように埋め込まれる

![EgiuNjcUcAEgt9L.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/437f8d46-f244-67f3-37e6-b0566515bfbb.png)


![132.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/ad4f83f2-98ce-da99-1dcf-21b1dbe68a9e.jpeg)

↓自動手術するロボット「V2」

![a05fb050-e9a6-11ea-bfef-29a4f3d18ae3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/759626b4-0fe6-7183-d742-ffa8bf0193fc.png)


- 全身麻酔は必要なし
- 頭の中に埋め込むため外からは全く目立たない
- 不要になれば取り外し可能(健康状態に問題なし)
- デバイスはBluetoothでスマホアプリなどと接続できる
- ワイヤレス充電可能(一晩でフル充電)
- バッテリー持続時間は丸一日
- デバイスの価格は1000ドル(10万6000円)

#### デモ

Linkを埋め込んだブタによるデモが行われた。
ブタが鼻で何かに接触したことを検出して、それを音声で再生し、波の動きをディスプレイに表示させた。

![neuralink-12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/445a1a6a-60e0-0ef6-928c-a776a4a77914.jpeg)

今回のデモではデータの読み取りしか行わなかったが、今後は読み取りと書き込みの両機能を提供していく。

#### 脳とAIを繋ぐことで役立つこと

記憶喪失や脳卒中、様々な依存症に至るまで、神経学的問題の解決に役立つ。
他にも心臓発作などの発生を警告したり、普段の健康状態の監視にも使える。

#### Neuralinkが実現したいこと

人の脳とAIを融合すること。
地球全体の人々の意志を結集してコントロールできるような世界が到来すること。

#### 質疑応答(Q&A)

Q:テスラをテレパシーで呼び出すことはできますか？
A:可能です。

Q:ゲームに使用できますか？
A:おそらくまだです。

Q:思い出を保存して再生できますか？
A:メモリーをダウンロード/バックアップしたり、ロボット本体にアップロード/復元したり、必要に応じて再度再生したりすることもできます。

Q:脳の深層部で解決で解決できることは何ですか？Neuralinkの最初の応用例は？
A：うつ病のような中毒性の不安から失明や難聴、全麻痺に至るまで解決できます。初の試みは、片麻痺や四肢麻痺の人を対象にしています。「コンピュータと電話を操作できる」と思うだけで操作する。最終的には歩行能力を回復させることができます。

Q: ニューラルリンクの究極の目標を達成するために解決すべき最も困難な問題は何ですか？
A: スレッドとワイヤー。材料科学の問題では、スレッドを何十年も長持ちさせることが主要な問題の1つ。絶縁層は薄くても劣化しないように頑丈なものが必要です。「炭化ケイ素」はおそらく最高の材料です。

Q どのくらい薄いのですか？
A: サブミクロンの厚さ

Q:デバイスのセキュリティはどうなっていますか？
A:脳内データとのやりとりの多くが適切に暗号化されています。

# 最後に

冒頭の方でも書きましたが、今回プレゼンを行った理由はNeuralinkで働いてくれる技術者を募るためであるので、是非興味を持った方はNeuralinkで働くことを検討してみてはいかがでしょうか。

※以下、Neuralinkの公式ページからジョブボードに飛べます。
[Neuralink.com](https://neuralink.com/)
新卒SEの備忘録 【Java 基礎編】

#はじめに。

私は、今年4月に新卒でSES企業に入社しました。
現在は、大手SIerにて客先常駐をし、経済産業省の補助事業であるプロジェクトに参画しています。

業務用PCには、自分の個人アカウントなどをログインすることが出来ません。
自分のメモを見ることが出来ないので、Qiitaだと検索して見れるので投稿しました。

#【Java 基礎編】

新人研修時のJavaのメモです。

##・順次、分岐、繰り返し

####どんなに複雑なプログラムでも、順次・分岐・繰り返しの3つの制御構造を組み合わせれば作成可能（構造的定理）

for文は、単純な反復処理に向いている。繰り返し回数が決まっている時など。
while文、複雑な処理が必要な反復処理に向いている。

・for文　繰り返し
　①初期化処理　　int i =0;
　②繰り返し条件　　i < 10;
　③繰り返し時処理　i++

・while文　繰り返し（～の間は）
→制御構文の構成要素
　[条件式]　　分岐条件や繰り返しを続ける条件を示した式
　[ブロック]　分岐や繰り返しで実行する一連の文の集まり

・switch文　各caseに対応した処理
　case １; (～の場合)
　case ２; (～の場合)
　case ３; (～の場合)

・break文　繰り返しを中断する際に使用（switch文には必須）

・continue文　break文のように繰り返しの中断はしない。（次の処理へスキップ）

※文字列の比較は、文字列型の変数.equals(比較相手の文字列)

##・配列

####データ構造とは、データの集まりをコンピュータープログラムで扱いやすいように一定の形式で格納したもの。
「配列」はその代表である。同一種類のデータを並べて順に格納するデータ構造。
メモリ上の番地を参照しているため、「参照型」という。

参照型は、具体的な値がなく、newして、インスタンスへのポインタ（メモリ上のアドレス）を参照値として代入する。

（プリミティブ型は、全て小文字で始まる。参照型と違ってメソッドを持たない。
メモリに直接書き込まれる具体的なデータ値（数値や文字）を代入することができる。）

・配列変数の作成（宣言）

```java
//要素の型 [ ]　配列変数名　= new 要素の型 [ ];

int[] score = new int[5];
```

・配列forループ（指定した条件で繰り返し処理を実行する場合に使用される。）

```java
public class Main {
  public static void main(String[] args) {
    int[] score = {1,2,3,4,5};              
    for (int i = 0; i < score.length; i++){  //配列名.lengthで要素数を得る。
      System.out.println(score);
    }
  }
}
```

・拡張for文（通常のfor文のように、一部の要素を取り出す処理はできない、）

```java
public class Main {
  public static void main(String[] args) {
    int[] score = {1,2,3,4,5};
    for (int value : score){                 //ループが1周すると、次要素がvalueに入る。
      System.out.println(value);
    }
  }
}
```

##・メソッド

####メソッドとは、複数の文をまとめて、それを1つの処理として名前を付けたもの。部品の最小単位。
→mainメソッド内の処理を複数のメソッドに分割して、各処理を担当させる。
　例）上司（mainメソッド）が、部下（その他のメソッド）に仕事を振る。

Javaプログラムは、 main から動き出す。

・メソッドのメリット
　①プログラムの見通しが良くなり、全体を把握しやすい。
　②機能単位に記述するため、修正範囲を限定できる。
　③同じ処理を1つのメソッドにまとめることで、作業効率が上がる。

・メソッドの呼び出し
　メソッド名（引数リスト）

```java
//例） hello();　helloメソッドを呼び出す

public class Main {
  public static void main(String[] args) {
    System.out.println("メソッドを呼び出します。");
    hello();
    System.out.println("メソッドが呼び終わりました。");
  }
  public static void hello() {
    System.out.println("こんにちは");
  }
}

/*実行結果
メソッドを呼び出します。
こんにちは
メソッドが呼び出しが終わりました。
*/
```

※メソッドを呼び出す時に、（）の中に値を入れると、その値が引数として呼び出される側のメソッドに渡される。　
（何も渡さない時も"（）"は絶対に書く必要がある。→　"（）"は、何も渡さないことを表している。）

・オーバーロード（多重定義）とは、同じ名前のメソッドを定義すること。
→仮引数の個数か型が異なる場合は、有効
　引数は同じで、戻り値の型だけが異なる場合は、無効

・送る側と受け取る側、どちらも引数と呼ばれるが、細かく分けることもできる。
　送る側の引数　→　実引数（argument）
　受け取り側の引数　→　仮引数（parameter）

#おわりに。

客先常駐のSEは、肩身の狭い思いをすることもあります。
私は、いまの業務を一生懸命こなしつつ、Javaをしっかり学んでいこうと思います！

#参考
[スッキリわかるJava入門 第3版 (スッキリシリーズ)]
(https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BJava%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1%E6%B8%85%E5%96%AC/dp/4295007803/ref=zg_bs_515820_1?_encoding=UTF8&psc=1&refRID=VVG291GHWRA9V6TW57NE/)

とてもお世話になりました。
Javaの基礎、オブジェクト指向の入門に最適です。
Mac コマンド集

# Macで特定のアプリのダークモードをオフにする方法

参考URL：https://note.com/wecken/n/ncbd7715e863c

アプリIDを調べる

```
$ osascript -e 'id of app "Notes"'
com.apple.Notes
```

例外フラグを立てて再起動

```
$ defaults write com.apple.Notes NSRequiresAquaSystemAppearance -bool yes
```

※ダークモードに戻す

```
$ defaults delete com.apple.Notes NSRequiresAquaSystemAppearance
```

# PDF結合

```
/System/Library/Automator/Combine\ PDF\ Pages.action/Contents/Resources/join.py  --output output.pdf input1.pdf input2.pdf
```
【Nuxt.js】コンポーネントシステムの基本的な使い方（props）【勉強６】

# はじめに

自分が勉強した内容のまとめなので、正確性は保証しません。

[こちらのサイト](https://moneyhack.tech/10-nuxt/)にcodesandboxを埋め込んでいます。

実際の振る舞いを見ながらコードの確認ができるので非常に便利です。

https://moneyhack.tech/10-nuxt/

シンプルにcodesandboxめちゃくちゃおすすめなので、気になる方使ってみてください。

# コンポーネントシステムについて

これまではページのみで様々なプロジェクトを作成してきました。

ここからはコンポーネントシステムを含めたプロジェクトの作成

コンポーネントシステムは 再利用性を意識したプロジェクトにおいて重要な抽象概念です。

「小さく、自己完結的で、（多くの場合）再利用可能なコンポーネント」を組み合わせることで、

中・大規模アプリケーションをきれいに、わかりやすく構築することが可能になります。

アプリケーションのインターフェイスについて考えてみると、

ほぼすべてのタイプのインターフェイスはコンポーネントツリーとして抽象化することができます。

![components.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367854/bf5a38b9-6d92-657e-e27e-caf09b58fe16.png)

# シンプルなコンポーネント利用

簡単なコンポーネント利用のプロジェクトを[こちらのサイト](https://moneyhack.tech/10-nuxt/)で作成しました。

実物を見ながらコードのほうも確認できます。

ここからはコードの解説です。

**・＜script＞内でのコンポーネントの呼び出し処理**

処理としては２つです。

コンポーネントのインポート処理

    import todoItem from "~/components/todoItem.vue";

利用コンポーネントの宣言処理

```
components: {
    todoItem
  }
```

これで＜template＞内で自由にコンポーネントを利用することができます。

**・＜template＞内でのコンポーネント呼び出し処理**

こちらもシンプルなコードで呼び出すことができます。

    <todoItem></todoItem>

上記のコードにより、todoItem.vueの中身を利用することができます。

# コンポーネントにデータを渡す（props）

propsとは、親（page or component）から子（component）にデータを渡す仕組みです。

こちらも実物を見ながらコードを確認していきましょう。

https://moneyhack.tech/10-nuxt/

今回注目していただきたいのは次の２つのコードです。

・親（page）からpropsを設定するコード（index.vue）

    <todoItem todoText="This is a props todo"></todoItem>

・子（component）がpropsを受け取るコード（todoItem.vue）

    props: ["todoText"]

propsでデータを渡すこと自体はさほど難しくないかと思われます。

実際にプロジェクトを作成していく中で難しいのは、propsをどう使っていくのかです。

# コンポーネントを少しだけ変えてループで使いまわす（propsとループ）

同一コンポーネントをループ処理で使いまわします。

こちらも実物を見ながら確認していきましょう。

https://moneyhack.tech/10-nuxt/

注目していただきたいのは次のコードです。

    <todoItem v-for="item in groceryList" v-bind:todo="item" v-bind:key="item.id"></todoItem>

コンポーネント呼び出しのコードだけで、ループ処理まで実現できてしまいます。

# propsのオプション

詳しい使い方はここでは省略しますが、propsには次のようなオプション機能が存在します。

・type – データの種類の指定（String,Number,Boolean）

・require – 必須かどうかを指定

・default – 初期値の指定。値が入っていなければdefaultの値が採用される

# おわりに

簡単にですが、基本的なコンポーネントの使い方について紹介しました。

コンポーネントを上手に使えば、まとまったコードを記載することができます。

どの単位でコンポーネントを分割するのかを考え、有効的にコンポーネントを利用していきましょう。

お疲れ様でした。
【JavaScript】要素の取得方法をまとめてみた！

### はじめに
JavaScriptで要素の取得方法についてよく忘れてしまうので備忘録としてまとめてみました。一部jQueryを用いた要素の取得方法についても記載しています。


#### ID名を指定して取得する。

- document.getElementById();  


<b>HTML</b>

```
 id = "js-exsample"
```

<b>javaScript</b>

```
document.getElementById('js-exsample');
```
 

#### タグ名を指定して取得する。

- document.getElementsByTagName();

- element.getElementsByTagName();
 

<b>HTML</b>

```
<li>Sample2</li>
```

<b>javaScript</b>

```
document.getElementsByTagName('li');
```
 

#### クラス名を指定して取得する。

- document.getElementsByClassName();

- element.getElementsByClassName();
 

<b>HTML</b>

```
class="js-exsample"
```

<b>javaScript</b>

```
 document.getElementsByClassName('js-exsample');
```
 

#### 要素のname属性をもとに要素を取得する。

- document.getElementsByName();
 

<b>HTML</b>

```
<p>さんぷる<p>
```

<b>javaScript</b>

```
 document.getElementsByName('p');
```
 

#### 子要素を取得する。

- .children('セレクタ')

<b>HTML</b>

```
<div id="parent">

     <p>さんぷる<p>

</div>
```

<b>jQuery</b>

```
$('#parent').children('p');
```
 

#### 子要素の要素を含む子孫要素から取得する。

- .find('セレクタ')
 

<b>HTML</b>

```
<div id="parent">

     <p>さんぷる</p>

     <div id="child">

          <image class="image" src="sample.jpg"/>

     </div>

</div>
```

<b>jQuery</b>

```
$('#parent').find('.image');
```
 

#### 子要素のうちn番目を取得する。

<b>HTML</b>

```
<div id="parent">

     <p>さんぷる1</p>

     <p>さんぷる2</p>

     <p>さんぷる3</p>

</div>
```

<b>jQuery</b>


最初を取得する

```
$('#parent p:first')
```
 

最後を取得する

```
$('#parent p:last')
```
 
2つ目を取得する

```
$('#parent p:nth-child(2)')
```
```
$('p').eq(1)
```
```
$('p:eq(1)')
```

※HTMLで要素が追加や削除された場合に順番が変更されるので注意！classを付与して値を取得する方がよいかも。
ふたつのスプレッドシートをひとつに合体する

# これは何
ふたつのスプレッドシートを、ひとつのスプレッドシートに合体する処理です。
より正確には、A・Bふたつのスプレッドシート内のシート郡を、新しく「C」というスプレッドシートに全コピーしています。
※UIからやるには数が多すぎる場合などに

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/2e61c97b-fadf-230a-0c20-2cdc4b6aba96.png)



# コード
▼こんなかんじにURLを指定して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/35755ded-6ac6-8283-6c44-7f8e3fa9c89a.png)

▼こんなスクリプトを実行

```javascript

function combine_ss(){

  const ss_this = SpreadsheetApp.getActiveSpreadsheet();
  const ss_combine_url = ss_this.getRange("B1").getValue();
  const ss_sheet01_url = ss_this.getRange("B2").getValue();
  const ss_sheet02_url = ss_this.getRange("B3").getValue();

  const ss_combine = SpreadsheetApp.openByUrl(ss_combine_url);
  const ss_sheet01 = SpreadsheetApp.openByUrl(ss_sheet01_url);
  const ss_sheet02 = SpreadsheetApp.openByUrl(ss_sheet02_url);

  //シート合体
  indiv_sheet_conbime(ss_combine, ss_sheet01);
  indiv_sheet_conbime(ss_combine, ss_sheet02);

}


function indiv_sheet_conbime(ss_combine, ss_target){

  const sheet_list = ss_target.getSheets();

  for(var i=0; i < sheet_list.length; i++) {
  
    // シートと名前を取得
    const sheet_target = sheet_list[i];
    const sheet_target_name = sheet_target.getSheetName();
  
    const sheet_copied = sheet_target.copyTo(ss_combine);
    sheet_copied.setName(sheet_target_name);

  }

}

```
※スプレッドシート指定部分をループさせたりしたら、なんぼでも行けるとは思いますが、わりと時間がかるので起動時間には注意してください。

# 参考
【GAS】スプレッドシート内の全シートへのリンク一覧を作る - Qiita https://qiita.com/okNirvy/items/d1a2f4918cff8e63dcac
【Python3エンジニア認定基礎試験】受験・合格体験記

# はじめに
Python3エンジニア認定基礎試験を受験し、合格しました。
合格のための勉強法や受験して思ったことをまとめていきたいと思います。


# そもそもPython3エンジニア認定基礎試験って？
[一般社団法人Pythonエンジニア育成推進協会](https://www.pythonic-exam.com/pythonic)が実施している民間資格試験です。
「Pythonic」（Pythonらしい簡潔で読みやすいコードを書こう、という思想）の理解促進を目標の1つとしています。
[2019年7月時点で受験者数が5000人を超え](https://www.pythonic-exam.com/archives/news/python5000)、現在は受験者数は1万人に迫るそうです。

受験方式はCBTで全国の試験センターでいつでも受験でき、受験料は1万円(税別)。

# 筆者のレベル
* プログラミング歴3ヶ月
* paiza、progate、Udemyで基礎を勉強した程度
* DjangoでWebアプリを1つ作成
* 実務未経験

# 出題範囲
オライリー・ジャパン「Pythonチュートリアル 第3版」とされていますが、
内容は[Python3公式チュートリアル](https://docs.python.org/ja/3/tutorial/)と__全く同じ__らしいので紙媒体にこだわりがないなら不要です。
私はチュートリアルを参考に勉強しました。


# 勉強方法
1. まずチュートリアルを一通り読む。
1. 認定スクールである[Prime Strategy](https://study.prime-strategy.co.jp/)と[DIVE INTO EXAM](https://exam.diveintocode.jp/exam)の模試を受験する。
1. 理解できていないところがわかるのでチュートリアルやGoogle先生で調べる。
1. 調べた内容をまとめてEvernoteに残しておく。

2〜4を繰り返し勉強しました。

# 勉強期間
試験のために集中して勉強したのは丸一週間程度。
時間にして15時間程度でした。

# 受験して思ったこと
実際受験してみてどうだったか？
## 難易度は？
もともと初学者向けの資格というのもあり、正直簡単でした。
というか、模試が優秀すぎるというか、__模試のほうがちょっと難しい__くらいだったので少し拍子抜けでした。
__模試と全く同じ問題が出た__りもしたので、模試を中心に勉強するのがおすすめです。

## 良かった点
* 自分が使ったことがないコードやその仕組みを知ることができた
* 普段意識していないPythonのデータ構造など体系的な部分を理解することができた
* 試験を意識することで短期間で集中して勉強できた
* 未経験だけどちゃんと勉強してまっせ、という箔が付いた(と、思いたい)

## 悪かった点
* 正直受験料11000円は高いよね・・・
* 資格の価値が未知なのでコスパとしてはどうだったのか
* 試験結果が点数しか出ないのでどこの問題を間違えたのかわからない

# ちなみに
Python3エンジニア認定基礎試験かデータ分析試験に合格し、合格体験記を応募すると、公式~~ネタ~~グッズが貰えます。
こういう~~しょうもない~~ものが結構好きなのでこれがちょっと欲しかったというのもあります。

# おわりに
なんだかんだ言ってとても勉強になったので個人的には受験して良かったな、と思っています。
初学者の方には勉強するきっかけにもなるのでおすすめです。
一方である程度経験がある方にはあえて受ける理由はあまりないのかな、と思います。(資格手当が出る会社もあるそうなのでその場合は推奨)
出題範囲が自分の目指すところと一致しているので次はデータ分析試験合格を目標に勉強していきたいと思います。
PYNQ > Pmod VGA > Verilog HDL:VGA出力(gradation.v) > VGA HDMI変換で表示できなかったが、VGAモニタでは表示できていた

```txt:動作環境
PYNQ-Z1
Windows 10 Pro v1909
Vivado v2019.1
Pmod VGA
```

### 概要

- [FPGAプログラミング大全 Xilinx編 ](https://www.shuwasystem.co.jp/book/9784798047539.html)
   - VGA出力のVerilog-HDLコードが紹介されている
- 上記にあるPYNQ用のverilog-HDLファイルをソースに読込み、XDCファイルを設定してProgram FPGAしたがVGA出力されない
    - VGA出力の確認にはVGA HDMI変換を用いて、HDMIモニタに出力していたが、表示されなかった
- VGAモニタに出力するようにすると、表示されるようになった

### 使用機材

- [VGA HDMI 変換アダプタ Lemorele VGA HDM I変換](https://www.amazon.co.jp/gp/product/B07CHZGW9L/ref=ppx_od_dt_b_asin_title_s00?ie=UTF8&psc=1)
    - PCのVGAからHDMIへ変換されることは確認した
- [Pmod VGA](http://akizukidenshi.com/catalog/g/gM-12386/)
    - [ピンの割り当て](https://reference.digilentinc.com/reference/pmod/pmodvga/reference-manual)
- VGAモニタ
    - 17インチの10年前のLGのモニタ


### 実行手順

1. Vivado v2019.1で新規プロジェクト作成
2. FPGAプログラミング大全 Xilinx編の[サポートページ](https://www.shuwasystem.co.jp/support/7980html/4753.html)にあるPYNQ-Z1.zipの`PYNQ-Z1\gradation_PmodVGA\HDL`にある4つのファイルをプロジェクトに追加
    - gradation.v
    - pckgen.v
    - syncgen.v
    - vga_param.h
3. PYNQ-Z1.zipの`PYNQ_constraints_PmodVGA.xdc`の内容を制約として追加する。使用する設定すべての行のコメントをアンコメントする
4. bitstream生成
5. PROGRAM AND DEBUG > Open Hardware ManagerにてProgram Deviceを実施する


## 結果

### 表示されない < VGA HDMI変換の場合

VGA HDMI変換をした場合、HDMIモニタに表示されなかった。

### 表示された < VGAモニタの場合

VGAモニタに接続を変更するとカラーパターンが表示された。

![c6ce081cb899c87e.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/10b11e22-e2f2-44a2-3def-bcfef6e3b9d5.jpeg)


## IP化してBlock Designで使用

gradation.v関連をIP化して、Block Designで使用してみた。
CLKはMake ExternalしてH16 (125MHz: CLK125)を割り当てした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/220db6bb-f900-ff4f-9284-1ff7e2172cec.png)

これでもVGAモニタに出力することを確認した。


### 関連

- [ZYBO / IP > Clock Divider > IP作成したClock Dividerを使ってFCL_CLK0(100MHz)を1Hzに分周してみた](https://qiita.com/7of9/items/0687d2cffc470b83d38c)

### 次 > A memory mapped VGA controller for ZedBoard.

- [ angmouzakitis /ZedBoard-AXI-VGA ](https://github.com/angmouzakitis/ZedBoard-AXI-VGA)

これをPYNQ用に使えれば、使い勝手があがりそう。
A2019 - Currency Converterを使ってみる

#A2019 - Currency Converterを使ってみた。
昨年リリースされたA2019用のボットやデジタルワーカー、パッケージが徐々に増えてきている気がします。
そこで、海外企業との受発注処理時や、海外出張した後の清算時に使えそうな、通貨レート変換パッケージを見つけましたので使ってみました。 

##A2019 - Currency Converterの入手
Bot Storeから入手します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/475956bc-ed49-5751-7e8f-825d2b42e0a2.png)

Currency Converterで検索してください。（英語のサイトだとキーワード検索が効きます。）
A2019の場合は、v11の時に様にzipでダウンロードは出来ず、下記の様な手順となります。
1. Bot Storeで利用しているControl RoomのURLを指定する。
2. 利用しているControl Roomから、Bot Storeにログインする。
3. Currency Converterが表示されていますので、ダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/979fa15b-5645-384e-0eca-a04d133e3d67.png)

##A2019 - Currency Converterの使い方

ダウンロードしたものは、Bot Storeフォルダ配下に入ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/e80bf91b-5f9e-6ad1-a478-20b10cc0ea27.png)

フォルダを展開するとこんな感じ。
インプットアウトプット変数が設定されているタスクボットと、それを利用したデモタスクボットになってます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/51691575-9bed-d488-29d8-84623723ba4f.png)

下記、デモタスクボットの内容です。
インプットとして、変換前後の通貨コードと、変換する通貨量の指定になっています。
そして、結果としてはディクショナリ形式となっていて、nOutputAmountというキーで変換後の通貨量が取得できることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/41ddbdc1-2739-67a3-2158-ad8fec8f06df.png)

##独自ボットからの呼び出し

こんな感じで組んでみました。
ディクショナリの内容がそのまま見たかったので、JavaFXという野良パッケージ？に含まれるアクションで表示させています。
通貨レートの指定は大文字にする必要があるようでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/6e1fa0f3-da48-749a-15bd-607b634a54ba.png)

実行結果はこんな感じ。
うん今日現在の通貨は確かにこんな感じですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/ce870ec8-ea21-6c7e-d734-b745aed12d19.png)

#ちなみに・・・
内容としては、REST Webサービスを利用して変換しているようですね。
使用しているサイトはhttps://api.exchangeratesapi.io。
OANDAとかのAPIで日時指定できるとさらに便利ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/8b800c5b-f7e1-a556-a34d-13ea92b24261.png)
NVIDIA FleX for Unity (1.0 BETA)をインポートするとエラーが出て使えない問題を解決した話

<h2>前提条件</h2>
この記事の解決方法は、NVIDIA FleX for UnityをUnityにインポートしたときに、以下のエラーが発生する場合にのみ有効です。
Microsoft Visual Studio が導入してあることを前提に書きます。
<h2>エラーメッセージ</h2>

```
Assets\NVIDIA\Flex\Auxiliary\_auxFlexDrawFluid.cs(123,21): error CS0619: 'Graphics.DrawProcedural(MeshTopology, int, int)' is obsolete: 'Method DrawProcedural has been deprecated. Use Graphics.DrawProceduralNow instead. (UnityUpgradable) -> DrawProceduralNow(*)'
```

```
Assets\NVIDIA\Flex\Auxiliary\_auxFlexDrawFluid.cs(131,21): error CS0619: 'Graphics.DrawProcedural(MeshTopology, int, int)' is obsolete: 'Method DrawProcedural has been deprecated. Use Graphics.DrawProceduralNow instead. (UnityUpgradable) -> DrawProceduralNow(*)'
```

<h2>解決方法</h2>
1. Unityのコンソールウィンドウ(コンソールタブ)を開きます。
2. 上記のエラーの項目をダブルクリック。
3. Visual Studioが問題のファイルを読み込む。
4. 問題のコードの一部を以下のように変更する。

<h4>修正前</h4>

```
Graphics.DrawProcedural(MeshTopology.Points, m_indexBuffer.count);
```

![スクリーンショット (109).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700063/875a93f9-000e-1600-5dbe-9d67d8e0ddb9.png)
<h4>修正後</h4>

```
Graphics.DrawProceduralNow(MeshTopology.Points, m_indexBuffer.count);
```

![スクリーンショット (110).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700063/228c4a9f-2aa8-aeaa-3751-935deb5a4558.png)

要するにGraphics.DrawProceduralにNowをつけて
Graphics.DrawProceduralNow　にしてます。
5. キーボードのCtrlキーを押しながらSキーを押して保存する。(Ctrl + S)
6. Unityに戻ったら自動で正常にインポートされてます!
「知っている」のレベルについて

先日、会社の若手社員くんとの間でこのようなやり取りがありました。
※うちの部署は経理です。そもそもIT知識のレベルが低過ぎるというつっこみは大目に見てやってください。

自分「若手くん、打ち合わせしようか。」
若手「わかりました」
ーーー（打ち合わせ中）ーーー
若手「（パソコンのデータをスクリーンに写しながら）このようになっています。」
自分「（あ、Excelとブラウザの切り替えをマウスでやってる）」
自分「若手くん、その画面の切り替え、Alt + tabでできるよ。」
若手「知ってます。」
自分「そ、そうか。」

若手くんは比較的やる気があり、平均的な社員よりいろいろ勉強もしています。
そんな若手くんとのやり取りでどこが問題かというと、若手くんはWindowsのショートカットを知っているけれども使っていないという部分です。

# ■「知っている」のレベルについて
「知っている」は、レベルによって大きな差があります。
自分の感覚で勝手に知ってるレベルの表を作ってみました。

|  知ってるレベル | どのくらい |
| :------------ | :----- |
|Level.0|知らない|
|Level.1|知っている（でも使っていない）|
|Level.2|知っている（意識して使っている）|
|Level.3|無意識（無意識レベルまで擦り込まれているため、知ってるとか知らないとか意識してない）|

前述の若手くんのAlt + Tabは、知ってるLevel.1だったわけです。
でも、使っていないので知っていることによる時間の節約効果は０です。
言ってしまえば、効果で見た場合は全然知らない状態と何ら変わらないわけです。

先程の知ってるレベルの表に効果を付け足すと、下記のようになります。
（効果の数字は、説明のための個人的なイメージです。）

|  知ってるレベル | どのくらい | 効果 |
| :----- | :----- | -----:|
|Level.0|知らない|0|
|Level.1|知っている（でも使っていない）|0|
|Level.2|知っている（意識して使っている）|50|
|Level.3|無意識|100|

# ■まとめ
今まで、自分も知識をつけたいと思っていろいろ勉強してきました。
しかし、浅い知識は視野を広めるという効果はありますが、実際の成果物として効果を残すことは難しいです。
広く世界を知りつつ、自分の業務に関係する知識については繰り返し自分の脳ミソに擦り込み、無意識レベルにまで落とし込んでいくことが必要だなーと思います。
若いうちはとかく目に見えやすい成果を手っ取り早く求めがちですが、浅く広く知っておくべきものと、じっくり腰を据えて身につけるべきものを見極めて、学習時間に対する費用（時間）対効果を高めてもらいたいと思います。

以上、終わり。
EmbyをDockerで運用する

前回：[DockerでGhost](https://qiita.com/F_clef/items/f0587bd69f12f8ef29a7)
これはそろそろDockerを使えるようになりたい筆者の試行錯誤の軌跡です。

# EmbyをDockerに移行
前回はブログサービスのGhostをコンテナに移行しました。
![Untitled(9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227222/dc06edf1-6030-b183-b7c2-4853790d785e.png)


今回はVMサーバアプリケーションのうち、メディアサーバーであるEmbyをDockerで運用します。
![Untitled(10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227222/7c7a5cc5-7032-dab9-8061-54d633feaa75.png)

# コンテナ
イメージは[公式がメンテしているイメージ](https://hub.docker.com/r/emby/embyserver)があるのでそれを利用します。
もともと特に設定せずに使っていたので、メディアボリュームをマウントしただけです。

```yml:docker-compose.yml抜粋
media:
    image: emby/embyserver:latest
    restart: always
    volumes:
        - /home/fclef/docker/server/media/config:/config
        - /mnt/a:/mnt # VMでもマウントしていたメディアボリューム
```

さすが公式がメンテしてるだけあって、サクッと動きました。

# リバースプロキシ
Embyはサブドメインではなく、ルート下に配備します。
このイメージは8096ポートでEmbyを配信します。

```nginx:ドメイン.conf抜粋
    location /media/ {
        rewrite ^/media(.*)$ $1 break;
        include /etc/nginx/params/proxy_params;
        proxy_pass http://media:8096;
    }
```


以上です。
今までで一番ラクな移行でした。
次回はついに、Web SocketやDjangoといったPython製アプリケーションを移植します。
ついにDockerfileを記述することになりそうです。
次回：[Python製WebアプリケーションをDockerで運用する](https://qiita.com/F_clef/items/c5181091ce181902a5c6)
Arduino UnoにESP8266をつないでWiFi通信する方法と簡単な注意点

# はじめに
がWiFiやBluetoothがつかえるESP32がIoTデバイスをつくるときによく使われます。
しかし、Arduino UnoでもWiFi通信したい時があるはずです。
そんな時は有線LANに接続するイーサネットシールドがありますが、Arduino UnoにWiFiのみ接続可能なESP8266をつなぐと安価にWiFi通信できます。

実際にインタネットにある情報を参考にしながらWiFi接続を試してみて、ハマってしまったポイントを踏まえ、簡単に上記を説明したいと思います。

# 注意するところ
- **使用する3端子レギュレータによって、GND、入出力ピンの配置がことなっているのでデータシートを確認しましょう。**

# 必要な部品

- [Arduino Uno](https://www.switch-science.com/catalog/789/) 1個
- [ESP8266](https://www.switch-science.com/catalog/2341/)　1個
- [三端子レギュレータ　３．３Ｖ５００ｍＡ　ＮＪＵ７２２３Ｆ３３](http://akizukidenshi.com/catalog/g/gI-00432/)　1個 - ESP8266を動作させる電圧（3.3V）をつくるため。
- [電解コンデンサ 35V 47µF](http://akizukidenshi.com/catalog/g/gP-03120/)　1個
- [セラミックコンデンサ 50V 0.1µF](http://akizukidenshi.com/catalog/g/gP-00090/)　1個
- [抵抗 10kΩ](http://akizukidenshi.com/catalog/g/gR-25103/) 3本

# 回路

配線は下記の通りです。

![arduinouno_esp8266_ブレッドボード2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212276/0d930e7e-8deb-fc46-35d2-f7297ec74068.png)

# プログラム

```c++
#include "ESP8266.h"
#include <SoftwareSerial.h>

#define SSID "SSIDをかく"
#define PASSWORD "パスワードをかく"

int n = 0;

SoftwareSerial mySerial(11, 3);  //RX, TX
ESP8266 wifi(mySerial);

//初期設定
void setup(void)
{
  Serial.begin(115200);

  if (wifi.setOprToStationSoftAP()) {
    Serial.println("to station ok");
  } else {
    Serial.println("to station error");
  }

  if (wifi.joinAP(SSID, PASSWORD)) {
    Serial.println("connect success");
  } else {
    Serial.println("connect error");
  }

  if (wifi.disableMUX()) {
    Serial.println("disable mux success");
  } else {
    Serial.println("disable mux error");
  } 
}

void loop(void)
{
//何か処理を書く
 }
```

# 終わりに
8ビット双方向ロジックレベル変換モジュールをつかうと、さらに動作が安定するようです。
そちらも試してみたいと思います。