OmniAICreator/Qiita-1.07M huggingface dataset:
【JS:filterメソッド】重複した要素のある配列から、重複した要素のみを一つだけ取り出す

#filterを使ってみる
filterメソッドとは？
コールバック関数を書いて、特定の配列から条件を満たす、新しい配列を作成する。

```sample.js
arr1.filter(コールバック関数) {
  return // 条件 ;
}
```

filterは3つの引数を設定できます。

今回の、条件を満たす配列を作成するためには引数を3つ使います。

```sample.js
arr1.filter(配列の要素の値, 配列要素のインデックス番号, 要素の入った配列そのもの) {}
```

#例）数字の配列から重複する数字を取り除いた数字を取り出す

```sample.js
let arr1 = [1,2,2,3,3,3,4,5,6,6];
let arr2 = arr1.filter(function(val, i, arr) {
  return arr.indexOf(val) === i;
});

console.log(arr2); // [1, 2, 3, 4, 5, 6]
```

```arr.indexOf(val) === i;```がtrueのものを順番に取り出して配列にしていく。

・```indexOf(val)```は、配列に入っている要素で初めて出てくる要素のindex番号を返しています。

console.logで確認してみると。

```sample.js
let arr1 = [1,2,2,3,3,3,4,5,6,6];
let arr2 = arr1.filter(function(val, i, arr) {
  console.log(arr.indexOf(val)); // 0 1 1 3 3 3 6 7 8 8
  console.log(arr.indexOf(val)===i); 
// true true false true false false true true true false
});
```

つまり、1という要素が配列に複数入っている場合、最初のindex番号の1だけ取り出すため、重複した数字の取り除いた配列が出来上がります。

#【本題】重複した要素のある配列から、重複した要素のみを一つだけ取り出す
```sample.js
let arr1 = [1,2,2,3,3,3,4,5,6,6];
let arr2 = arr1.filter(function(val, i, arr) {
  return arr.indexOf(val) === i && i !== arr.lastIndexOf(val);
});

console.log(arr2); // [2, 3, 6]
```

・```i !== arr.lastIndexOf(val)```
ここでも何が行われているのかわからないのでconsole.logで確認してみる。

```sample.js
let arr1 = [1,2,2,3,3,3,4,5,6,6];
let arr2 = arr1.filter(function(val, i, arr) {
  console.log(arr.lastIndexOf(val)); // 0 2 2 5 5 5 6 7 9 9
  console.log(i !== arr.lastIndexOf(val));
  // false true false true true false false false true false
});
```

・```lastIndexOf(val)```：indexOf(val)とは違って、配列に入っている要素で**最後**に出てくる要素のindex番号を返しています。

・```i !== arr.lastIndexOf(val)```
→最後のindex番号以外でtrueを満たすもの。

最後に、

```arr.indexOf(val) === i && i !== arr.lastIndexOf(val);```
で、&&を使用することで、重複した要素のある配列から、重複した要素のみを一つだけ取り出します

#参考
・[JavaScriptで配列の重複を除去する](https://uxmilk.jp/38863)
・[配列の重複をはじく、もしくは重複を取り出す](https://qiita.com/cocottejs/items/7afe6d5f27ee7c36c61f)
Praatで出力したcsvを利用してRで統計分析しようとしたら欠損値で引っかかった話

#はじめに
Praatで推定した音響特徴量の推定結果(csvファイル）をRでt検定を行なったら，数値以外のデータ（欠損値）が含まれていると怒られてしまった．
csvファイルにある欠損値(--undefined--)という文字列をRで欠損値として扱えるNAにシェルを使って変換したら解決できたので，備忘録として書いておきます．

#環境
macOS Catalina(10.15.6)
R 3.6.3
Praat 6.1.12

#発生した問題
csvファイルに特定の文字列が含まれているせいで，Rで以下のようなエラーが発生しt検定が行えませんでした．

Error in var(x) (tTest.R#33): Calling var(x) on a factor x is defunct.
  Use something like 'all(duplicated(x)[-1L])' to test for a constant vector.

どうも引数xが無効だと言われている．
csvのデータを眺めたところ，何箇所か数値ではなく--undefined--という文字列になっており，これが悪さをしているようだった．

#解決方法
###R側
Rではt.testの末尾に，欠損値を無視するオプション rm.na = TRUE　を追加

```t.test_example
t.test(dfX, dfY, var.equal = F, na.rm = TRUE)
```

###Praatのcsv側
Praatで音響特徴が推定できなかった場合，--undefined--という文字列がセルに書き込まれる．
この文字列がR側で欠損値として扱えず，文字列と判断されたためエラーを起こしていた．

この--undefined--をNAという文字列に変換することで解決しました．
pythonでプログラムを書こうと思ったが，macではシェルの方が便利ということでシェルで書き換えました．

```
sed -i 'fileName.bak' 's/--undefined--/NA/g' fileName.csv
```
ちなみに，macの場合はsed -i を使う際にバックアップファイルを作成する必要があるらしい．
バックアップがいらない場合は，'fileName.bak'を''にすれば良い．

-i オプションで元のファイルにそのまま上書きができる．

#おわりに
シェルを使うことで，csvに含まれる特定の文字列を別の文字列に一括変換するという便利な方法とR側のtテストで欠損値を無視するオプションを追加することで解決をした．同様の問題で統計分析が行えない，手動で全ての値を置き換えた等していた人の助けになれば嬉しく思います．

Qiitaへの初投稿で，Markdown記法にも不慣れなため見辛い点もあるかと思いますが，ミスやもっと良い方法があるよという方は気軽に教えていただけると幸いです．

#参考文献
sedについては，以下のサイトを参考にしました．
眠る猫の頁,"sedでファイルを上書き保存,"
http://www.dab.hi-ho.ne.jp/sasa/biboroku/unix/sed-i.html
railsでhamlを使えるようにする


## 背景
railsのチーム開発でhamlを使っていたが便利だったので個人開発でもを使いたくなったので試しに使えるようにしました。

## やった事

### 1. gemをインストール
使用するgem
① `haml-rails` <= hamlを使えるようにするgem
② `erb2haml` <= erbファイルをhamlに一括変換してくれるgem

1.1 Gemfileに以下を追加

``` 
# Gemfile
 gem 'haml-rails'
 gem 'erb2haml'
```

1.2 `bundle install` を実行

### 2. erbファイルをhamlへ変換

`rake haml:replace_erbs` をコンソールで実行する。
※dockerで実行する場合は一度buildし直してから実行するとうまく動いた。
すると以下のようにコンソールに表示されて、hamlへファイルが変換される。


```
user@samole:/myapp# bundle exec  rake haml:replace_erbs
Looking for ERB files to convert to Haml...
Converting: app/views/hellos/index.html.erb... Done!
Removing: app/views/hellos/index.html.erb... Removed!
```

### 3.再起動
2.の段階でブラウザ表示してみるとエラーが出てしまう.

![スクリーンショット 2020-09-21 14.31.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139714/22b0361c-19f1-8844-af2f-f98ff741757c.png)
このエラーは`rails s`でサーバを再起動すると解消されました。


### 4. erb2haml を削除
`erb2haml`はもう使わないのでGemfileから削除でOK.


 ```
#Gemfile から以下を削除
gem 'erb2haml'
```
【備忘録】CSVファイルの緯度・経度をもとに、対象範囲のデータ抽出及びメッシュコードの付加を行うスクリプトを作成しました。 

# 目的
CSVファイルの緯度・経度をもとに、対象範囲のデータ抽出及びメッシュコードの付加を行うスクリプトを作成しました。

# 前提条件
- Windows10
- Python3がインストール済みであること。
- pandas、[jismesh](https://pypi.org/project/jismesh/)等の各種ライブラリーがインストール済みであること。
- jismeshは、緯度経度からメッシュコードを求めることができるPythonのライブラリーになります。
- 入力するcsvファイルは、下記の記事で出力した高解像度ナウキャストデータ（csvファイル）を使用しています。

[【備忘録】grib2形式のデータをcsvファイルに変換するスクリプトを作成しました](https://qiita.com/syanseto/items/d51d8956c4709d1d2a7f)

- 入力するcsvファイル
- 5、6列目が経度、緯度、7列目が降水量の数値になります。
![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_205045_ccbdb00a-4927-32b6-4a24-72c7589f6f40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205045/f1fabe19-ff4a-511d-226b-3466e72aacd4.png)

# 実行
- 入力フォルダ（csvファイルは複数存在する想定）及び出力CSVファイルを指定してください。
- データを抽出する対象範囲を緯度、経度で指定してください（y1、y2、x1、x2）。
- 本記事では、関東圏を対象範囲としています。
- Pythonスクリプトを実行してください。

```python:highres_nowcast_add_meshcode.py
# -*- coding: utf-8 -*-
import os
import glob
import csv
import pandas as pd
import pprint
import calendar
import jismesh.utils as ju

# 出力ファイルの指定
output_csvfile = "./out/highres_nowcast_anl_kanto.csv"

# 対象範囲の設定
y1 = 37.29166666666667
y2 = 34.04166666666667
x1 = 140.9375
x2 = 137.0625

#出力ファイルオープン
with open(output_csvfile, 'a', encoding='utf-8', newline="") as f:

    # フォルダ内の全csvファイルのパスを取得
    All_Files = glob.glob('./data/*.csv')
    pprint.pprint (All_Files)

    # csvファイル数分ループ処理
    for file in All_Files:
        # データをリストに格納
        df = pd.read_csv(file, header=None, encoding='utf-8')
        print(u'データフレームに格納処理終了')
        
        #カラム名を付ける
        df.columns = ["time_s_utc","time_f_utc","sign","surface","lon","lat","rain"]
        
        print("---データ抽出前---")

        # 最初の5個の値を表示する
        print(df.head(5))

        # 各列のdtypeを見る
        print(df.dtypes)

        # 行と列の個数をとる
        print(df.shape)
        
        # 対象範囲のデータを抽出
        df_kt = df[(df["lon"]>x2) & (df["lon"]<x1) & (df["lat"]>y2) & (df["lat"]<y1)]

        # 5次メッシュコード追加
        df_kt['meshcode'] = ju.to_meshcode(df_kt.lat, df_kt.lon, 5)

        print("---データ抽出後---")

        # 最初の5個の値を表示する
        print(df_kt.head(5))

        # 各列のdtypeを見る
        print(df_kt.dtypes)

        # 行と列の個数をとる
        print(df_kt.shape)

        # 出力CSVファイルに書き込む
        df_kt.to_csv(f, index=False)

    print(u'処理終了')
```
# 出力結果の図化
出力したcsvファイル（5次メッシュごとの5分間降水量）と[5次メッシュのシェープファイル](https://www.e-stat.go.jp/gis/statmap-search?type=2)をもとに、[QGIS](https://www.qgis.org/ja/site/forusers/download.html)で図化します。

![EiUsTC_VkAAhpwr.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205045/7699ea0e-bad7-97fd-a91e-13dfa5cf0ade.jpeg)
bashでよく使うコマンドを載せておく

beatbox4108が、bashでよく使うコマンドと、使い方を載せておきます。
[]は、特に何もなければ、任意であることを示します。
#ユーザー関係
##sudo
`sudo [オプション] コマンド`
###sudoのオプション
| オプション | 説明 |
|:-:|:-:|
| -b | バックグラウンドで実行します。 |
| -k | パスワード保持時間を無効化します。 |
| -l | 許可、拒否されているコマンドをリストします。 |
| -s | 環境変数SHELLが設定されている場合は、そのシェルを利用します。 |
| -H | コマンドを実行するユーザーの環境変数HOMEを設定します。 |
| -S | 標準入力からパスワードを読み込みます。 |
| -s | コマンドの代わりにシェルを実行します。 |
| -p プロンプト | 指定したプロンプトを使用します。 |
| -u ユーザー名・ID | ユーザーを指定します。 |

sudoコマンドを使えば、他のユーザーとして、コマンドを実行できます。
ユーザーを指定しないと、管理者を指定したのと同じになります。
ディストリビューションにもよりますが、デフォルトで15分間、sudoをパスワードなしで使えます。
##tree
次のリンクを参考にしてください
[treeコマンド](https://qiita.com/Nyanzou/items/5546d11402e1c2beecf3 "tree")
Rubyの備忘録（キー・バリューの取得）


# Rubyの備忘録（キー・バリューの取得）

ハッシュに含まれるキーやバリューの取得には
予め用意されているメソッドがある。


＜keysメソッドとvaluesメソッド＞
オブジェクト.keys
オブジェクト.values

```ruby:qiita.rb
puts hash.keys
puts hash.values
```

これだと、ハッシュに含まれるすべてのキーやバリューが出力される。

{A: "a"}というハッシュがあるとして、
Aというキーを取り出したいときは、Aと対になる値aを（）の中に入れる。
逆にaという値を取り出したいときは、aと対になるキーAを()の中に入れる。

```ruby:qiita.rb
hash = { ringo: "apple", mikan: "orange", ichigo: "Strawberry" }

puts hash.key("apple") 
#「ringo: "apple"」の値である"apple"から、キーであるringo:を取得
puts hash.values_at(:ringo) 
# 「ringo: "apple"」のキーである":ringo"から、値である"apple"を取得

```
配列のように番号で取り出すことはできないんだろうか。
つづく。


参考サイト
https://www.javadrive.jp/ruby/hash/index8.html
https://qiita.com/kidach1/items/651b5b5580be40ad047e
個人事業主がMicrosoft Partner Networkを登録するまでの道のり

# Microsoft Partner Networkに関して
- mstepなど独自のトレーニングが受けれます。Azureの資格試験のコンテンツを学習したくて取得を考える
- また、アクションパックを購入するとAzure月100$、VisualStudio、O365E3等が安い料金で手に入れることが可能である。
- MPNは法人のみだと思ったら個人事業主も可能でした。

# 準備
- 必要なもの屋号を決めて、屋号にそったドメインの取得とメールアドレス。
- 開業届（写し）
- ドメイン取得時の請求書

# 申し込む
1. [https://partner.microsoft.com/ja-jp/](https://partner.microsoft.com/ja-jp/)　でパートナーになるを選択して登録を行います。
2. メールアドレスの登録や所在地の登録を行います。
3. 雇用の確認というところでエラーとなります。個人事業主だからだと思いますが。サポートリクエストを切ります。
4. サポートに雇用の確認でエラーとなったのでどうすればいいか確認するとここで、ドメインの請求書と開業届を添付します。
5. サポートから確認OKとなって半日ぐらいで、ステータスが更新されます。

# 注意事項というか愚痴
- ドメイン取得時の請求書、Microsoft 365 Business Standard経由でドメインをとったので、請求書がなかったから、お名前に移行してその時請求書を添付した。
- 開業届の写しが厄介で、開業時にもらっておいて取っておけばよかったんですが、それをしていないと税務署に行って申請して、３週間まって、再度税務署に取りに行く（現物は税務署にあるのだが）なぜか、開示請求はできて、スマホで写真を撮らせてもらえました。しかしスマホのものはMS的にはNGらしく、３週間かかってしまいました。
ゲーム機創世記　第１章

![god](https://2.bp.blogspot.com/-y2bo0WxJCiU/V4-O0nuVH0I/AAAAAAAA8Zc/lxv7lgGGBY49qw7jBMhMkQpH-sC1qfn3ACLcB/s800/internet_god.png)

はじめに神はLSIでゲーム機を創造された。

プログラムはなく、ボタン入力に対するトランジスタのロジックだけが用いられた。多くは液晶に描かれたキャラクターの表示・非表示を切り替えることでゲームとした。

次第に時計や計算機の機能を持つものもあらわれた。
神はこれをみて良しとされた。

次に神はRAMとVRAMを創造された。
これによってテレビに画面を映すゲームが生まれた。

まだフレームバッファはなく、VDPと呼ばれるLSIが描画を行った。

RAMにはプログラムが、VRAMには画面に表示する素材が置かれた。

テレビは走査線と呼ばれる横ラインを基準として描画が行われ、VDPはこれに合わせて1ラインごとに画面を描画した。

VRAMは8x8,16x16等のブロックに分けられ、それらのブロックを置く位置をVDPに指定することで画像が得られた。

また神は、8x8等の単位でしか場所を指定できない画像とは別に、任意の位置に8x8,16x16等のサイズのキャラクターを置くことができるスプライトも創造された。

スプライトもライン表示のバッファによって描かれたが、バッファに収まらないスプライトは表示されなかった。

神はスプライトを描く順番を毎回変更することで、バッファに収まらないスプライトも表示することを考えた。こうしてスプライトのちらつきが生まれた。

神はこれを見て言われた、「フレームバッファあれ」。
すると画面の1ドットがゲーム内の1ドットに対応するようになった。
これにより自由な図形が描けるようになった。ポリゴンの誕生である。

また神は、ポリゴンに必要な小数点の演算を並列して行うことができるベクトル計算機を作られた。

このころ整数の演算よりも小数の演算のほうが速くなった。
「確率は256分の1単位で提示するように」と言われていた企画の民は突然「確率は0～１の少数で出すように」と言われることとなり大いに混乱した。

しかしまだデプスバッファはなかった。図形は次々と上書きができるだけで、すでに描かれた図形に一部が隠れるようなものは描けなかった。

そこで神は描画前にポリゴンを距離でソートされた。
ポリゴンを画面奥から手前へと順に描くことにより、描画される絵の破綻を最小限に抑えることができた。

神はまた言われた、「デプスバッファあれ」。そのようになった。
画面の1ドットごとに距離の値を持つことができるようになり、不透明なポリゴンはソートを気にせず描けるようになった。

また頂点やテクスチャはキャッシュされ、種類によって順に描画することでますます高速で高精細な絵を表示できるようになった。
神は見て、良しとされた。

これが今に続く物語の、そのはじまりである。
【Eclipse】インデントを2に変更する

#環境
Eclipse Version: Photon Release (4.8.0)
Mac macOS Catalina バージョン 10.15.6

#インデントを2に変更
####手順
1. 環境設定を開く（⌘,)
2. java>コードスタイル>フォーマッター>編集>インデント>タブサイズ
3. 4になっているところを2にして「OK」「適応して閉じる」


####環境設定を開く
Eclipseの画面をアクティブにしている状態でショートカット「⌘,」で環境設定を開くことができる

####インデントの設定画面まで進む

![設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/10849ade-d7b4-4911-2e3e-9f78430acc06.png)

####インデントの数字を変更
![_Pleiades__カスタム___プロファイル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/3e1b71e2-94e3-f98d-b5cc-1a4f45db4975.png)
【小ネタ】さっそく、ジブリの画像をダウンロードする(Elixir)

# はじめに
- @mine820 さんの[【小ネタ】さっそく、ジブリの画像をダウンロードする](https://qiita.com/mine820/items/e2561cbdd1904069fa09)を拝見しまして、私は[Elixir](https://elixir-lang.org/)でやってみました

# 0. プロジェクトの作成
```
$ mix new ghibli_download
$ cd ghibli_download
```

# 1. [HTTPoison](https://github.com/edgurgel/httpoison)の導入

```elixir:mix.exs
  defp deps do
    [
      {:httpoison, "~> 1.6"}
    ]
  end
```

```
$ mix deps.get
```
- 依存関係の解決

# 2. ソースコードを書く

```elixir:lib/ghibli_download.ex
defmodule GhibliDownload do
  @works ~W{marnie kaguyahime kazetachinu kokurikozaka karigurashi ponyo ged chihiro}
  @url_base "http://www.ghibli.jp/gallery"
  @ext ".jpg"
  @local_base "#{System.user_home()}/memo/ghibli"

  def run do
    @works
    |> Enum.flat_map(&urls(&1, 50))
    |> Enum.map(fn {url, file_name} ->
      IO.puts(url)
      download(url, file_name)
      Process.sleep(1000 * 20)
    end)
  end

  defp urls(work, num) do
    1..num
    |> Enum.map(&{"#{@url_base}/#{file_name(work, &1)}", file_name(work, &1)})
  end

  defp file_name(work, num) do
    "#{work}#{Integer.to_string(num) |> String.pad_leading(3, "0")}#{@ext}"
  end

  defp download(url, file_name) do
    HTTPoison.get!(url)
    |> Map.get(:body)
    |> (fn content -> File.write("#{@local_base}/#{file_name}", content) end).()
  end
end
```

- 1を"001"にするのってどうやってやるのだろうか？　は[In Elixir, how do you format numbers with string interpolation](https://stackoverflow.com/questions/34357812/in-elixir-how-do-you-format-numbers-with-string-interpolation)を参考にしました
- [String.pad_leading/3](https://hexdocs.pm/elixir/String.html#pad_leading/3)

# 3. 実行

```elixir
$ iex -S mix

iex> GhibliDownload.run
```

- 息継ぎをいれたので2時間半くらい放っておけば終わっていることでしょう

# Wrapping Up
- Enjoy [ジブリ](http://www.ghibli.jp/) !!! :qiita-fabicon::qiita-fabicon::qiita-fabicon: 
- Enjoy [Elixir](https://elixir-lang.org/) !!! :lgtm::lgtm::lgtm:
python3の入門 #3 import文を使って高度な計算をやってみる

こんにちは、beatbox4108と申します。
今回は、__import文__を使った_高度な計算_について書きたいと思います。
#そもそもimport文は、どんなもの?
__import文__を使えば、ほかのpythonファイル(.py .pyw)を、実行できます。
##import文の種類
`import モジュール名`:
`モジュール名`として、pythonファイルで参照できます。
`import モジュール名 as 参照名`:
`参照名`として、pythonファイルで参照できます。
`from モジュール名 import 関数名`:
指定した関数をimportします。
`from モジュール名 import *`:
`モジュール名`内のすべての関数をimportします。
##早速高度な計算をする。
pythonの標準ライブラリに、mathモジュールがあるので、importして、使ってみたいと思います。
こんな感じで書いてください。

```main.py
import math as m
print("円周率:",m.pi)#3.141592653589793
print("3.5の切り上げ:",m.ceil(3.5))#4
print("3.5の切り下げ:",m.floor(3.5))#3
print("3の5乗:",m.pow(3,5))#243.0(mathモジュールの累乗は、float型で返されます。 ビルトインのpow関数、**演算子も使えます。)
print("180度をラジアンにする:",m.radians(180))#3.141592653589793
print("180ラジアンを角度にする:",m.degrees(3.141592653589793))#180.0
print("sin 100:",m.sin(100),",cos 100:",m.cos(100),",tan 100",m.tan(100))
#sin 100: -0.5063656411097588 ,cos 100: 0.8623188722876839 ,tan 100 -0.5872139151569291
print("9の平方根",m.sqrt(9))#3
```
...しっかりできてますね。
次に、算術演算子の表を一回も載せてなかったので載せたいと思います。
##算術演算子の表
| 演算子 | 機能 | 例 | 説明 |
|:-:|:-:|:-:|:-:|
| +(単項プラス演算子) | 正の数 | +x | 正の数を指定する。符号を追加しても変わらない。 |
| -(単項マイナス演算子) | 符号反転 | -x | aの値の符号を反転する。 |
| + | 足し算 | x + y | xにyを足す。 |
| - | 引き算 | x - y | xからyを引く。 |
| * | 掛け算 | x * y | xにyをかける。 |
| / | 割り算 | x / y | xをyで割る。 |
| // | 整数の割り算(式に小数が含まれると、float型になることがある。) | x // y | xをyで割った結果から小数を切り捨てる。 |
| ** | 乗数 | x**y | xのy乗を求める。 |
| % | 剰余 | x % y | xをyで割った余りを求める |



今回は、これで終わりたいと思います。次回をお楽しみに!
[目次に移動](https://qiita.com/beatbox4108/items/d2de1fb16e0f2b5edb18 "mokuji")
vagrant upが実行できないとき

vagrant upで起動しようとしてもできないときがありました。

```
$vagrant up
```



エラー内容
>A Vagrant environment or target machine is required to run this command. Run `vagrant init` to create a new Vagrant environment. Or, get an ID of a target machine from `vagrant global-status` to run
this command on. A final option is to change to a directory with a Vagrantfile and to try again.



解決策

```
$cd homestead 
$vagrant up
```


Homesteadを使ってlaravelの環境構築していたのですが、 Homesteadに移動していなかったので起動できなかったです。。。
Ruby 配列やハッシュオブジェクトについてのざっくりメモ

Rubyの配列やハッシュオブジェクトについてのメモです。
配列の基礎的なことは、知っているのでruby特有の書き方をメモしていきたいと思います。

配列に要素を追加するとき

```ruby
num = ["one"]
num << "two"
p num  # ["one", "two"]

```

ハッシュを使っての、キーと値の定義

```ruby
numKey = { one: 1, two: 2 }
p numKey  # {:one=>1, :two=>2}
p numKey[:two]  # 2
```
%記法で配列の定義

```ruby
# numbers = ["one", "two", "three"] 同じ意味
numbers = %W( one two three )
p numbers  # ["one", "two", "three"]
```
配列の中の要素を一つずつ取り出す

```ruby
%w[one two three].each do |num|
    p num
end
# "one"
# "two"
# "three"
```
元の配列に値を追加して、新しい配列を返す。

```ruby
nums = %w[one two three four].map{ |num| "数字: #{num}" }
p nums  # ["数字: one", "数字: two", "数字: three", "数字: four"]
```
なんで一人だけ精度高いの？(リーク)

こんにちは．

先日，とあるコンペに参加していた時，1位:0.99 2位:0.48 3位:0.47 4位:0.45みたいな
リーダーボードを見つけてしまったんです．

何も知らなかった私は，
「とんでもない人がいる，これはやばすぎやろ!?」
なんて思っていたのですが，調べているうちに「リーク」という言葉が目に入ってきました．

そこで今回は，リークについて２つメモ程度に残しておこうかなと思い本記事を書きました．
(気を付けたいのは2つ目です)


# 1: 予測する際にかなり使える情報が漏れている場合

これは，英語のleakと同じ意味です．
本来なら説明変数として与えられた「"A"と"B"から"D"を予測する」べきであるのにも
関わらず，
何らかによって「"A"と"B"に加えて"C"の情報も漏れている状況で"D"を予測する」，という状況です．

具体的に言うと，「"品揃え"と"曜日別販促"から"店舗の売り上げ"を予想する」べきであるのにも関わらず，
「"品揃え"と"曜日別販促"に加えて"その日の天候情報"から"店舗の売り上げ"を予想する」みたいな感じです．

前者よりも圧倒的に後者の方が精度が高そうですよね？

予測する際にかなり使える情報が漏れている場合とはこのことを言います．


# 2: バリデーションデータの設定を間違える場合

これは時系列データを扱う時に発生するものです．
そもそも時系列データは扱う時に注意が必要です．

例えばの話になりますが，与えられたデータが4月から11月で，12月分を予測する場合
4月から10月のデータで11月を予測するモデルを作ります．
これをランダムに設定(学習データにも11月分が入ったまま)しておくと，
11月分を予測する際に学習データに含まれている11月分のデータも参考にしてしまうため，
実際の評価よりも高精度になってしまいます．

バリデーションデータの設定を間違える場合はこのことを言います．

バリデーションデータの設定を間違えるとバリデーションのスコアは高いにも関わらず，テストデータのスコアが低くなってしまうので，気を付けないといけませんね．
Maxで音の波の加算合成（AM）

#前の記事
[MaxでMIDI鍵を弾く強さによって音の大きさが変わるポリフォニックシンセサイザーを](https://qiita.com/waokitsune/items/058fc313e8e5b40e9ecb)

#バージョン
Version 8.1.5（9359645）（64-bit windows）

#加算合成を試してみよう
ただの正弦波やノコギリ波じゃ単調すぎ…(´・ω・`)
ということで、音の波を加算合成してもう少し複雑な音を出してみようと思った次第。

音の大きさを別の音の波で揺らす（=AM）をやってみます。

**\*~** オブジェクトで加算合成ができるっ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c880ca67-7c26-ce3b-2698-5aad40c2e47b.png)
あんまり低すぎる周波数にすると、すっごい低音が鳴ってスピーカーを傷める場合があるかもしれないので注意。
加算合成『する側』『される側』ってあんまり正確な言い方じゃないけど、あたいがイメージしやすいのであえてそういうコメントにしてます。

参考サイトさん https://yoppa.org/sbaw09/535.html

#組み合わせて好きな音を作るのじゃ
エンベロープで変化を付けた上で加算合成してみましたっす。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/82e5392d-e8eb-67a6-ed90-f666f3f7942d.png)
**s** オブジェクトと**r** オブジェクトを使うと紐がごちゃごちゃにならずに便利。
send（送る）とreceive（受け取る）の略とらえるとわかりやすいっ！（送受信する名前は任意）

でも、あんまりsとrを使い過ぎない方がいいかも。。複雑になるようなら別パッチャー化！（一つ一つの部品は小さく分かりやすく）

他にもいろいろ応用があると思いまっする。

* 和音を出せるようにしてみたり（単音の音の強弱を付ければさらに面白い）
* 鍵盤を強く弾くほど1オクターブ上の音の影響を大きくしてみたり
* キーボード番号が低いほど基本の音の影響を大きくしてみたり
* 短形波、ノコギリ波を使ってみたり

などなど…。

#次の記事
[Maxで音の高さを別の音の波で揺らす（FM）](https://qiita.com/waokitsune/items/a293a45fb7046d0c76c7)
画像アップロード掲示板 エラー処理

エラー処理の実装方法

```
$errors = array();
if(!strlen($body)) {
$errors[] = 'ひとことを入力してください';
}elseif(mb_strlen($body) > 200) {
$errors[] = 'ひとことは200文字以内で入力してください';
}
if(!is_uploaded_file($_FILES["upimg"]["tmp_name"])) {
$errors[] = '画像を選択してください'; }


if(count($errors) === 0) {
$uploads_dir = '/var/www/application/images/'; $tmp_name = $_FILES["upimg"]["tmp_name"];
$name = basename($_FILES["upimg"]["name"]); move_uploaded_file($tmp_name, $uploads_dir.$name);
chmod($uploads_dir.$name, 0677); $user = $this->session->get('user');
$this->db_manager->get('Status')->insert($user['id'], $body); $this->db_manager->get('Uploaders')->insert($user['user_name']);
return $this->redirect('/'); }
```






コード説明

```
$errors = array();
```
> 配列で$errorsに渡してあげる




```
if(!strlen($body)) {
$errors[] = 'ひとことを入力してください';
}elseif(mb_strlen($body) > 200) {
$errors[] = 'ひとことは200文字以内で入力してください'; }
if(!is_uploaded_file($_FILES["upimg"]["tmp_name"])) { $errors[] = '画像を選択してください';
}
```
> もし$body(投稿内容)が空であれば、「ひとことを入力してください」と表示し、投稿
内容が200文字以上の場合は「ひとことは200文字以内で入力してください」と表示す る。もしアップロードされた画像がなかったら、「画像を選択してください」と表示する。



```
if(count($errors) === 0) {
$uploads_dir = '/var/www/application/images/'; $tmp_name = $_FILES["upimg"]["tmp_name"];
$name = basename($_FILES["upimg"]["name"]);
move_uploaded_file($tmp_name, $uploads_dir.$name);
chmod($uploads_dir.$name, 0677); }
```


> もしエラーがゼロであれば、画像を保存する 
・アップロードした画像を保存するためのディレクトリを指定 
・サーバーに一時保管するためのファイル名
(upimgというのは、inputで自分が指定した名前を入れる)
・ファイル名
・ アップロードした画像をtmp_nameから$uploads_dirに移動 
・画像ファイルのアクセス権限を指定






エラー処理の書く場所に注意したい。
私は、エラー処理は正しく書けていたが、プログラムの書く場所を間違っていたため、正
しく反映されなかった。
プログラムは上から下に順番に実行されていくことをよく頭に入れておく。
git add コマンドの使い方

```
$ git add .
```


このコマンドを打つと、コミット前に自分が修正したファイルを一時的に保存しておくことができます。

addの後ろにある「.」を付けることで、例えば修正したファイルが3つあれば、 全て保存することができる。

5つのファイルを修正して、そのうち2つだけコミットしたいときなどは、
「git add ファイル名」にすれば、指定したファイルのみ保存することができる。
iOS14 CoreGraphics 描画互換問題


開発アプリのiOS14の動作検証をしている時に、CoreGraphics の描画に互換性の問題がある事を発見したので、ここに記録しておくことにします。第三者が確認できるように、サンプルプロジェクトへのリンクも貼っておく事にします。

以下のように、iOS13とiOS14 では描画結果に違いがある場合があります。どちらも不透明度付きで一筆書きで書かれていますが、結果に違いがある事が窺えます。

## iOS 13
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65634/aea9fd56-bbbe-8fe6-5092-893668ce0cad.png" width="300"/>

## iOS14
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65634/a9737ab3-ffd1-9b3f-fe92-176b5662108c.png"width="300"/>


## 検証用プロジェクト
http://electricwoods.com/download/T2020-09-CG.zip
VSCodeのRemoteSSHでX11転送できない！ (macOS)

# はじめに
- サーバ側のコードをいじるのにVimを使わなくても良いようにしたかったのでVSCodeのRemoteSSHを使おうとした時の話です。
- Terminal等からSSHは正常に接続でき、X11転送も問題なくできている前提の話です。
- 力技で解決したので、知見やベストプラクティスがあればご教授いただきたいです！
- めんどくさいのでX11に関してはVSCodeを使わないことにしました。

#追記2020/12/19
RemoteSSHのバージョンを0.49にダウングレードしたらX11転送してくれました！めでたしめでたし

#困ったこと: リモート側のグラフをローカルに表示したいのにX11転送されない！
例えば、gnuplotを描画してみると...

```
Terminal type set to 'qt'
gnuplot> p sin(x)
QXcbConnection: Could not connect to display localhost:10.0
Could not connect to existing gnuplot_qt. Starting a new one.
QXcbConnection: Could not connect to display localhost:10.0

Warning: slow font initializationgnuplot> 
```

となり、出力されません。これは困りました...
研究で使用しているので、グラフが見れないと全く使い物になりません。

#結論: TerminalからもSSHし、VSCodeからのSSHでDISPLAY変数を合わせる
非常にめんどくさいですが、DISPLAY変数を通常のSSHに無理やり合わせましょう。
DISPLAY変数はSSHを繋いだ順に登録されるので、
1. VSCode: localhost:10.0
2. Terminal: localhost:11.0
のようになっているはずです。逆の順で繋げば逆になると思います。
なので、VSCodeTerminalで

```
export DISPLAY=localhost:11.0
```
とすると正しくX11転送されます。
.bashrcにexportを書いておき、毎回正しく繋げばexportする必要はないと思いますが、ズレるしそんなのに気を使うのはちょっとアホらしい...
![スクリーンショット 2020-09-21 12.46.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319002/c73974e4-261e-2106-58c0-6569d8f9e55a.png)



#おわりに
VSCodeからグラフの描画をするのはめんど〜くさいので、描画だけTerminal上でバックグラウンド立ち上げしておくのが良いと思いました。
こうすればできるよ！等ありましたら教えていただけると嬉しいです。。。
【Java】文字列と文字列の比較をする時の注意点

# 結論：Javaで変数に格納した文字列を比較する時はequals()を使おう。

### やりたい事

- String str1 = "hoge"
- String str2 = "hoge"
- str1とstr2が等しい時はif文の処理に入れる

### 参考

> 文字列と文字列の比較
https://www.javadrive.jp/start/string/index4.html

> 【Java入門】文字列(String)を比較する方法(「==」と「equals」)
https://www.sejuku.net/blog/14621

### 変数に数値を代入して比較する場合

```java
int num = 10

if (num == 10) {
　System.out.println("numは10です。");
} else {
　System.out.println("numは10ではありません。");
}
```

この式では、変数numに格納しているのは10なので処理結果は

``` java
numは10です。
```

### 変数に文字列型を代入して比較する場合

```java
String str1 = "hoge"
String str2 = "hoge"

if (str1 == str2) {
　System.out.println("str1とstr2は同じです。");
} else {
　System.out.println("str1とstr2は違います。");
}
```

この式では変数str1と変数str2は同じ文字列hogeが格納されているので処理結果は「str1とstr2は同じです。」と返ってくると思っていました。

```java
str1とstr2は違います。
```
。。。!?ほげ!?なんで!?
ここでドツボにはまり、300回くらいデバックしました。

### 文字列がメモリ上で格納されている場所が一緒かどうか比較するメソッド「==」

「==」で比較しても違う文字列として扱われてしまいます。これはJavaの参照といいます

文字列は生成されるとメモリ上に文字列を保存しておくための場所(領域)が確保されます。その確保した「場所」をhogeは保持しています

つまり値を変数に保存しているわけではなく、場所を覚えておきhogeを使う際にその場所をたどって値を引っ張り出してくるという仕組みになっています

この参照という仕組みがあるため「==」で比較した場合、文字列の値が一緒かどうかではなく文字列がメモリ上で格納されている場所が一緒かどうかという比較になります

同じメモリ領域に保存されていれば`true`そうでなければ`false`を返します
先程の式でいうと、str1とstr2は違うメモリ領域に保存されている為、`false`を返します


### equals()メソッドを使って文字列を比較する

```java
String str1 = "hoge"
String str2 = "hoge"

if (str1.equals(str2)) {
　System.out.println("str1とstr2は同じです。");
} else {
　System.out.println("str1とstr2は違います。");
}
```

処理結果

```java
str1とstr2は同じです。
```

想定していた結果が返ってきました。

ちなみにrubyで書くと「==」でも同じ結果が返ってきます

```ruby
str1 = "hoge"
str2 = "hoge"

if str1 == str2  then
 puts "str1とstr2は同じです。"
else
 puts "str1とstr2は違います。"
end

# => str1とstr2は同じです。
```

### まとめ

rubyやJavaScriptを使っている時は`数値型`も`文字列型`も「==」を使って比較できるのでJavaでも疑いなくプログラムを書いていましたが、Javaは違うんですねー

画面に穴が空くくらい文法ミスが無いかチェックしましたが、「参照」を知らないと私みたく余計な時間を使うので注意しましょう

##### おわり
勉強日誌16日目

昨日は予定があって記事書いてたのに投稿忘れてました。

今日も予定あるので午前中のうちの進めたいと思います。

正答率　79％　(79)

ServerLayout
Xサーバーで管理する入出力デバイスの組み合わせ

InputDevice
キーボードやマウスなどの入出力デバイス

/etc/X11/xorg.conf
Xサーバーの設定ファイル

Monitor
モニターのタイプ

正答率　69％　(62)

SPICE
4画面までのマルチモニタやネットワーク経由でVNCサポートしていない多くの機能をサポートしている画面転送プロトコル

startx
xinit
~/.xinitrc
/etc/X11/xinit/xinitrc
ランレベル3からX　Window Systemを起動する際に実行するスクリプトを順に

XDMCP
ネットワーク上にあるリモートホストにグラフィカルログインする際に

/etc/X11/xdm/xdm-config
ディスプレイマネージャ「XDM」の設定ファイル
D&DでGIFフォルダをまとめて動画ファイルに変換する!!(Windows向け)


※GIFのみ入っているフォルダを対象としています。

まずはffmpegをダウンロードしましょう。
例えば以下のサイトであればビルド済みのものが手に入ります。(releaseなどの下のリンク)
必要なのはbinフォルダ内にあるffmpeg.exeだけなので任意フォルダに解凍して保存します。
https://www.gyan.dev/ffmpeg/builds/

次に、メモ帳を開いて以下をすべてコピーして
先ほどダウンロードしたffmpegと同じフォルダに "あなたの好みの名前.vbs" で保存してください。
なお、初期設定ではデスクトップにファイルが保存されます。
一番上にあるsaveFolderの部分をC:\Videos\など適宜打ち替えてください。

```vb
 rem 最終出力するフォルダ名を入力してください(末尾は必ず\で)-----
  Dim saveFolder
  saveFolder = "%systemdrive%\Users\%username%\Desktop\"

rem ffmpegのコマンドです--------------------------------------------
   Dim ffmpegArgments,encoderArgments,destExtension
   ffmpegArgments = "-movflags faststart -pix_fmt yuv420p -vf ""scale=trunc(iw/2)*2:trunc(ih/2)*2"""
   encoderArgments = "-vcodec libx265 -preset slow -crf 24"
   destExtension = "mp4"

rem  ここから下は多分変更しなくていいです--------------------------
   Dim arg,fso,folder,wshell,thisfolder,file
   arg=WScript.Arguments(0)
    
   Set fso= CreateObject("Scripting.FileSystemObject")
   Set folder = fso.getFolder(arg)
   Set wshell = CreateObject("WScript.Shell")
   thisFolder = fso.getParentFolderName(WScript.ScriptFullName)

  For Each file in folder.files
        str = thisFolder & "\ffmpeg.exe -i " & file.Path &  " " & _
                 ffmpegArgments  &  " " &  _
                 encoderArgments  &  " " &  _
                 saveFolder  & fso.GetbaseName(file) & destExtension
       wshell.run str,true,true
   Next 

  Set folder = Nothing
  Set fso = Nothing
  Set wshell = Nothing
```

保存したvbsファイルに、gifが入ったフォルダをドラッグ&ドロップすることで saveFolderにmp4ファイルに変換して保存されます。
また、Sendtoフォルダにショートカットを入れることで、フォルダを右クリックから送るで変換出来ます。
sendtoフォルダはwindowsキーとRを同時押しして、 Shell:sendto と入力してEnterを押下することで開けます。

初期設定では x265のslowプリセットで変換を行っているため、速度を重視する場合は上の方にあるencoderArgmentsを
encoderArgments = "-vcodec libx265 -preset fast -crf 24"
などとしてください。
h264で出力したい場合は
encoderArgments = "-vcodec libx264 -preset fast -crf 24"
などで対応します。
書籍「Go言語でつくるインタプリタ」の進行で躓いたところ

# はじめに
書籍「Go言語でつくるインタプリタ」を進めていたところ、序盤（1.3節）から躓いたので解決方法をメモしておこうと思います。
なお、go言語の開発で本来とるべき構成などとは異なっている可能性がありますが、あくまでこの書籍をすすめるための対処となりますのでご了承ください。

# 1章3節でビルド結果が違う
1.3節をすすめていると、テストコードのビルドの際に紙面では「New関数が定義されていないのでエラーが発生する」、という段取りのはずが

```cmd:想定
# monkey/lexer [monkey/lexer.test]
lexer\lexer_test.go:28:7: undefined: New
FAIL    monkey/lexer [build failed]
FAIL
```
テストコードの中で指定している「パッケージ"monkey/token"が見つからない」と出たところで異常に気づきました。

```cmd:実際
lexer\lexer_test.go:6:2: cannot find package "monkey/token" in any of:
        c:\go\src\monkey\token (from $GOROOT)
        C:\Users\Hoge\go\src\monkey\token (from $GOPATH)
FAIL    _/C_/Users/Hoge/source/repos/monkey/lexer [setup failed]
FAIL
```

# そもそもgoのパスを通していなかった。
自作したモジュールを使用してコーディングを進めていくので、そのモジュールまでのパスが通っていなければいけないはずですが、golangのインストールの際に設定される環境変数GOPATHをそのままにしていました。

# パスに\srcが付け足される。
エラーメッセージの展開後パスから、プロジェクトのソースコードはsrcフォルダの下にあることが想定されていることがわかりました。（パスとモジュール指定の間に\srcが挿入されて展開されるため、見つからない、というエラーになる）
多分goのリファレンスからきちんと入っていればこのようなことは起こらなかったのでしょうが、当のインタプリタ書籍から入ったので全くわかりませんでした。

# 対処
結論として、以下のようにフォルダ構成と環境変数を設定することで書籍の内容進行に対応しました。

## フォルダ構造
以下のような構造に修正しました。

```
\Users\UserName\source\repos\
monkey\
  + src\
    + monkey\      (<- 「go test位置」)
      + lexer\
      | + lexer_test.go
      | + (lexer.go)
      | 
      + token\
        + token.go
```

（筆者はVisual Studioのプロジェクトフォルダの生成場所の法則によせて、\Users\UserName\source\repos\フォルダの下に各プロジェクトのフォルダを作成しています。）


## 環境変数
環境変数の`GOPATH`に以下を追加しました。

```
%USERPROFILE%\source\repos\monkey  # USERPROFILEは \Users\Hogeに展開される
```

# go test（テスト実行）コマンドを通すには
書籍どおりのテストコード実行を行うには`monkey\`プロジェクトフォルダの`src\monkey\`にフォルダ移動してからになります。
（上図のフォルダ構成の 「go test位置」）

```cmd:想定通り
C:\Users\Hoge\source\repos\monkey\src\monkey>go test ./lexer
# monkey/lexer [monkey/lexer.test]
lexer\lexer_test.go:28:7: undefined: New
FAIL    monkey/lexer [build failed]
FAIL
```


# まとめ
以下の様に対処して、「Go言語でつくるインタプリタ」1.3節をいなしました。

+ フォルダ構成の見直し
+ 環境変数の追加
+ go test実行時のフォルダ位置

以上です。
jsGridでよく使うページ操作の一覧

#はじめに
よく使ったページ操作の一覧をまとめました。

# 現在のページインデックスを取得
```
// 現在のページインデックスを取得
var pageIndex = $("#grid").jsGrid("option", "pageIndex");
```

#特定のページを開く
指定したインデックスのページを開きます。
`pageIndex`は、開くページの1から始まるインデックスです。値は`1～総ページ数`の範囲である必要があります。

```
// 最後のページを開く
// pageCountにはデフォルトでページ総数が入ります
$("#jsGrid").jsGrid("openPage", "pageCount");
```

#グリッドのフィルタリング
グリッドをフィルタリングして、該当のデータがあれば特定の処理を実施できる。
今回は、グリッドをフィールド「名前」を「Otto Clay」でフィルタリングしている。

```
// グリッドのフィルタリング
$("#grid").jsGrid("search", { Name: "Otto Clay" }).done(function() {
    console.log("Otto Clayが見つかりました！");
});
```
![2020-09-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554111/2a6e277d-2721-81e7-e3c1-7875d176f7f5.png)

#参考
[Documentation - jsGrid](http://js-grid.com/docs/)
MYSQL ランダムデータ生成

#日付
```
UPDATE `inquiry`  SET `regist_date` = concat(date_format(date_add(date('2016-09-21'), interval (rand() * 365 * 4) day), '%Y-%m-%d'), ' ', cast(time(sec_to_time(ceil((rand() * 86400)))) as char));
```
例）2016-09-21から4年分

UPDATE user_data SET image_path=REPLACE(image_path, "/img/", "/") WHERE id=8;
Anaconda環境でWARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.が出てpipが動かない

anaconda環境でpipが

```
WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")
```
のエラー吐いて動かない問題
以下の順番でPATHを通すと治った

```
(install root)
(install root)/Library/mingw-w64/bin
(install root)/Library/usr/bin
(install root)/Library/bin
(install root)/Scripts
(install root)/bin
(install root)/condabin
```
Anacondaに付属のSSLのライブラリが読みこまれないのが原因らしく以下で治ったが、
PATHをいじることで環境が壊れる可能性があるため、"activation"を推奨しているようだ
https://conda.io/projects/conda/en/latest/user-guide/troubleshooting.html#condahttperror-http-000-connection-failed
連想配列のキーをtypeで定義したら、Object.keys()の型はasで明示（TypeScript）

TypeScriptで、以下のような感じに連想配列のキーをtypeで定義すると、使用されるキーが限定されます。考慮する生活費(LivingCost)の費目が固定されていい感じです。

```
export type LivingCostTypes =
  | 'house'
  | 'food'
  | 'energy'

export type LivingCost = {
　[key in LivingCostTypes]: number
}
```

さて、この生活費の合計を求めたくなったとき、Object.keysでループしたくなります。しかし、`Object.keys(livingCost)`と書くだけでは費目としてどんなstringが来るか不明なのでエラーになります。

```
export function getLivingCostTotal(livingCost: LivingCost): number {
  let cost = 0
  Object.keys(livingCost).forEach(v => {
    cost += livingCost[v]
  }, 0)
  return cost
}
```

```
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'LivingCost'.
  No index signature with a parameter of type 'string' was found on type 'LivingCost'.ts(7053)
```

このときは、Object.keysの中身をasで明示してあげるとエラーが解消されます。

```
export function getLivingCostTotal(livingCost: LivingCost): number {
  let cost = 0
  const keys = Object.keys(livingCost) as LivingCostTypes[]
  keys.forEach(v => {
    cost += livingCost[v]
  }, 0)
  return cost
}
```
【自分用メモ】DockerイメージをGitHub Packagesにpushする方法

こちらを参考にさせて頂きました。
[個人アクセストークンを使用する - GitHub Docs](https://docs.github.com/ja/github/authenticating-to-github/creating-a-personal-access-token)
[GitHub Packagesで利用するために Docker を設定する - GitHub Docs](https://docs.github.com/ja/packages/using-github-packages-with-your-projects-ecosystem/configuring-docker-for-use-with-github-packages)

#目的
単純にGitHub Packagesを試したかっただけです。

#方法
公式と同じ方法です。


- はじめに[こちら](https://docs.github.com/ja/github/authenticating-to-github/creating-a-personal-access-token)を参照し、アクセストークンを入手する。




- 入手したアクセストークンを例えばTOKEN.txtという名前でテキストファイルを作成し記入する。



- TOKEN.txtを任意の場所に保存する。(私はC:\Users\ユーザ名\Dockerfileの中に保存しました。)

#docker login
- cat TOKEN.txt | docker login https://docker.pkg.github.com -u USERNAME --password-stdin


#タグ付け
- docker tag IMAGE_ID docker.pkg.github.com/OWNER/REPOSITORY/IMAGE_NAME:VERSION

#dockerイメージをビルド
- docker build -t docker.pkg.github.com/OWNER/REPOSITORY/IMAGE_NAME:VERSION PATH

#イメージを公開
- docker push docker.pkg.github.com/OWNER/REPOSITORY/IMAGE_NAME:VERSION
laravelのマイグレーションでテーブル作成

1「php artisan make:migration create_flights_table」
  こちらのコマンドを打ってマイグレーションを作成します。

2 create_flights_table.php ファイルが作成されてることを確認します。

3 そのファイルの中身を見てみると、upメソッドとdownメソッドがあります。   upメソッドは、新規作成するテーブルの中身を書いていきます。
downメソッドは、マイグレーションを元に戻す時に実行されます。特に何か弄る必 要はないです。

```
public function up() {
Schema::create('flights', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('airline');
            $table->timestamps();
        });
}
```



4 さっそくカラムを追加していきましょう。追加の仕方は、画像にある通りです。



Laravelでは、主キーである“ id ” に対してbigIncrementsというカラムタイプを指定してあげる必要があります。外部キーを設置する場合は、unsignedBigInteger を指定してあげます。



5 カラムが追加できたら、「php artisan migrate」でマイグレーションが実行され、 テーブルが作成されます。
入力した引数に対して、複数の戻り値を返したい

【概要】
----------------------------------------
<b>1.結論</b>

<b>2.どのように記述するか</b>

<b>3.ここから学んだこと</b>



1.結論
----------------------------------------
<b>変数を複数用意し、returnで複数用意</b>すること！

2.どのように記述するか
----------------------------------------

```ruby:
def calculation(num)
 no1 = (num + 100) * 100
 no2 = (num + 10) * 200
  return no1,no2
end

num = gets_to.i
a,b = calculation(num)
```
上記のようにすると変数を複数用意(➡︎a,b)して、returnで複数用意(➡︎no1,no2)しました。そうすると、入力した引数(➡︎num)に対して、複数の戻り値(➡︎no1,no2)を返すことがきます。注意点としては変数は複数個用意した分の個数（左辺）分だけ代入する個数分を用意しないと"nil"になります。

参考にしたURL:
<a href="https://qiita.com/18sasaki/items/1f73616f13d174b1bcb2">戻り値が複数ある場合の変数代入</a>
<br>

3.ここから学んだこと
----------------------------------------
変数を複数代入できることは知っていましたが、変数の代入の仕方でもこんなに種類があると思いませんでした。
下記URLから多重代入のことについて載せておきます！

参考にしたURL:
<a href="https://qiita.com/yancya/items/c557864f307d429bbde4">Rubyの多重代入あれこれまとめ</a>
<br>
ハイブリッド授業用 ヘッドセット音声をZoomと教室に

社会がCOVID-19を理解し始めた中で、大学でも新学期が始まってきている今日この頃です。筆者の非常勤先を含む多くの大学では、教室とオンラインのリアルタイム同時開講をする所謂ハイブリッド授業の需要が高まっていることだと思います。そこで今回はWindowsの基本システムだけで、Zoomを使ったハイブリッド授業向けの音声システムの構築方法を紹介します。

~~※執筆段階では、実際の教室での音声テストができていません。今週の授業の際にテストし、追記します。~~

####準備するもの
* Windowsの入ったPC
* USBまたはBlueTooth接続のヘッドセット
* Zoom（WebEXやTeams、Skypeでも同様のことはできるだろうと思います）

####想定環境
* 教室にPCからの音声入力ができるスピーカー設置済み

####手順
1. ヘッドセットと教室のスピーカーをPCに接続します。
2. Zoomミーティングを立ち上げます。（本番用である必要はありません）
3. Zoomの音声テストを立ち上げ、教室のスピーカーにつながっているデバイスを探します。（下図）
![Zoom_SoundSet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264339/0b186aa5-1d72-889c-e92d-00da561feee9.png)
4. 同様にヘッドセットのスピーカーとマイクも探します。Zoomにはヘッドセットのスピーカーとマイクを設定します。
5. サウンドの設定を開きます。「コントロールパネル＞ハードウェアとサウンド＞サウンド」または「設定＞システム＞サウンド＞（関連設定内）サウンドコントロールパネル」より立ち上がります。
6. サウンドの設定の「録音」タブよりヘッドセットのマイクを選び、プロパティを開きます（下図左）。開かれた「マイクのプロパティ」の「聴く」タブを選択し、「このデバイスを聴く」にチェックを入れ、その下のプルダウンメニューより教室のスピーカーにつながっているデバイスを選択して、「OK」を押します。
![SoundSetup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264339/1b51e4b6-2f9c-fe10-f96b-c960fb7f56bc.png)

以上で、マイクの音声が教室とZoomのどちらにも流れる様になります。
授業後は手順６の「このデバイスを聴く」のチェックボックスを外してください。

####心配事
教室のスピーカーの音量や位置によってはハウリングが起こるかもしれません。また、スピーカーから流れる声にタイムラグがあった場合、話しにくい可能性があります。
（少し遅れた自分の声を聴きながらの発言は非常に困難です＜経験談）

####(追記) 音質について
実際の教室で使ってみました。スピーカーの音量が大きすぎるとハウリングを起こしましたが、適度な音量・音質で使用できました。タイムラグも気が付きませんでした。何より、自分がヘッドセットをしているので、スピーカーからの音があまり気になりません。また、学生からも特にクレームはありませんでした。

---
P.S. 新しい形態での授業構築の一助になれば幸いです。
404エラーが出る原因とは

404とは、”存在しないページを表示させようとしている状態” のことです。


原因は2つあります。
・ URLに指定している変数が渡されてないこと
・ 表示しようとしてるページのURL自体が定義されてないこと


これらを確認することで、どこでミスってるのかを探せるといいです。
【オブジェクト指向】懐疑派の私が使ってみると

# はじめに

（対象言語：ＰＨＰ）

まず私は、オブジェクト指向の信者ではありません。

逆に（逆なのか？）、関数(function)やグローバル変数の多用派です。
オブジェクト指向は便利なら使ってみようか、という程度です。

そんな私がオブジェクト指向を取り入れてみて、便利さを評価しました。
（既存のフレームワークではなく、すべて私の手作りクラスです。）


| 種類 | 評価 |
|:----|:---:|
| ログ出力            | ◎  |
| 日時計算            | ◎  |
| 画面操作            | ○   |
| セッション           | △  |
| データアクセス(PDO)  | ○   |
| データそのもの(RDB)  | ×   |

# ログ出力 ◎

ログには色んな種類があります。
・デバッグログ
・エラーログ
・アクセスログ

例えばこれらを関数のみで作ると、少し面倒です。
ログ１種類ならともかく、上記のように複数のログを管理するとなると、
配列で状態管理しなければなりません。
それよりは、インスタンスで分けたほうが便利でした。

# 日時計算 ◎

「日時計算なら元々 [DateTimeクラス](https://www.php.net/manual/ja/class.datetime) があるじゃないか」
と言われそうですが、その DateTimeクラスを内包して作りました。
（ただし継承はしていません。）

たとえば日時フォーマット出力（メソッド）で、年は `'Y'` だっけ `'y'` だっけ？
時間は `'H'` だっけ `'h'` だっけ？ と いちいち迷うんですよ。
なのでその方法は継承せず、よく使うフォーマットをあらかじめ洗い出して、
数値の定数を引数で渡すことでフォーマット出力するメソッドを作ったりしました。

ただし関数と併用しています。
例えばデータベースから取得した日時 `(2020-09-20 12:34:56)` は文字列なので、
それをいちいちインスタンスにする手間を省くため、文字列を直接 関数に渡して、
内部でインスタンスにして処理する方法も用意しています。これも便利です。

# 画面操作 ○

画面操作に必要な諸々をカプセル化したものです。

・表示対象データのキー
・次画面の行き先
・戻り画面
・データの最終更新日時
・ワンタイムトークン
・ページネーション情報
などなど

以前はこれらを画面毎にグローバル変数に保持していましたが、
クラス化でだいぶ すっきりしました。

# セッション管理 △

作っては見たけど、メリットは感じませんでした。
単に `session_start()` や `session_destroy()` をするだけだし、
そもそも複数のインスタンスを作る必要もありません。

クラス化せず単なる共通関数でよかったかも。

# データアクセス（ＰＤＯ）○

ほぼ[ＰＤＯ](https://www.php.net/manual/ja/class.pdo)ですが、ＰＤＯは直接 操作せず
それを内包した手作りクラスで、データベースにアクセスするようにしました。

日時計算クラスと同じく、親クラス（ＰＤＯ）は継承していません。
理由は後述します。

# データそのもの（ＲＤＢ） ×

データアクセスはクラス化できても、
データそのもの（ＲＤＢ）はクラス化できません。

変数を直接 取得後、変数を直接 参照したほうがよいです。
（システムの種類にもよるのでしょうが。）

私の作っているものは、テーブルが１００以上あります。
これらをテーブル毎に いちいちクラス化していたら、
さらにカラムごとにゲッターセッターを作っていたら、いつまで経っても終わりません。
（ＰＤＯで連想配列でデータ取得するだけで十分です。）

インターフェイス的なものを作るにしても、共通関数で十分です。

# まとめ

日時計算やＰＤＯがそうなのですが、
親クラスの継承はせず、それを隠蔽して、機能を制限して使っています。

というのも、親クラスは往々にして、以下の特徴があるからです。
・全世界の人に使ってもらうため、汎用的に作られている。
・よって細かい（使わない）機能が多くなりがち。

私は必要最低限の範囲で、オブジェクト指向を利用したいと思います。
URLについて

"URLとは何か？"

Webサイトは言わば百科事典のように、色んな情報がカテゴライズされており、階層構造 になっています。

「店舗詳細→メニュー一覧→メニュー詳細」
というように詳しい情報を見たい場合は見た い情報を階層的に指定します。

例えば、店舗ID:105にあるメニューID:3000の詳細な情報に対して何らかの操作をしたいとなった場合、URLは以下のようにするとわかりやすいです。

/shops/105/menus/3000 
このとき、情報を取得したい場合は、HTTPメソッドとしてGETが使われます。 

↑は一例で、他のサイトを見てみると
Retty : https://retty.me/area/PRE13/ARE1/SUB101/100001472413/photos/?kind=3
東京新宿にあるとある店舗の内観の写真一覧を見たい場合は、

     area → 地域指定
     PRE13 → 東京都を指定
     ARE1 → おそらく新宿エリア      
     SUB101 → 新宿東口/歌舞伎町エリア、らしい  
     100001472413 → 店舗ID      
     photos → 写真一覧
     kind=3 → 写真の種類を指定(3が内観らしい)
といった感じになってます。 

一番最初にareaとした場合はその後都道府県、大エリア、小エリア、と指定するURL構造 になっていて、店舗IDを指定したあとは、さらなる詳細情報を見る際には photos(写真一覧)だったり、 menu(メニュー/コース)を指定してするようにしているみたいです。




"HTTPメソッドとは?"

例えば、私たちがAmazonでショッピングする際に、まずやることとしては、

「Amazonのショッピングサイトにアクセスすること」ですよね。 


このときに、コンピューターの内部ではどんな処理が行われているかというと... 
クライアント(Webブラウザ)がサーバーに対して、以下のようなやりとりがあります。

クライアント:「Amazonのショッピングサイトがみたいので、ページの情報をください~」
サーバー:「はい、少々お待ちください」

このとき、ページの情報を取得するためにはGETメソッドが使われます。 

他にも、HTTPメソッドにはGET以外にも
・POST = 情報を新規登録をする
・PUT  = 情報を更新
・DELETE = 情報を削除があります。


4つのメソッドがありますが、一般的に使われているのは、GETとPOSTだけでいろんな 操作が行われています。

・GET = 情報を取得
・PUT = 情報を更新(新規登録や削除も含む)
【SwiftUI】テキストの左寄せ・中央揃え・右寄せを混在させる

SwiftUIでテキストの左寄せ・中央揃え・右寄せを混在させる方法です。
最初はやり方が分からず、この方法を見つけるまでに時間がかかってしまいました...

## やり方

まず、一番外側のVStackに"alignment: .center"を指定します。（指定しない場合は無条件でcenterになるので、指定しなくてもOKです。）

左寄せの場合は、TextをHStackで囲み、Textの後にSpacerを追加します。
右寄せの場合も、TextをHStackで囲み、Textの前にSpacerを追加します。

以上！

```swift:ContentView.swift

struct ContentView: View {

    var body: some View {
        
        VStack(alignment: .center) {
            
            // 左寄せ
            HStack {
                Text("左寄せ")
                Spacer()
            }
            
            // 中央揃え
            Text("中央揃え")
            
            // 右寄せ
            HStack {
                Spacer()
                Text("右寄せ")
            }
            
        }.padding()
        
    }
}
```
<img width="400" alt="CompletedImage" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362782/45e5d8c7-10e8-7293-a9a2-a74aaf19b21d.png">


このようなレイアウトも楽々です。
<img width="400" alt="CompletedImage" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362782/5773c576-2784-ed16-f963-ac5f2e69ef1c.png">
Serverless Framework + TypeScript のプロジェクトを IntelliJでデバッグ

[こちらの記事(vscode)](https://dev.classmethod.jp/articles/vscode-typescript-debug/) の IntelliJ版

# 前提

- `sls create -t aws-nodejs-typescript -n [project name]` にてプロジェクトを作成済
- intelliJで、 ↑で作ったプロジェクトを開いておく

# デバッグ設定

![Run_Debug_Configurations.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34165/73892054-45f3-6c9f-fd6a-ef54183dc80c.jpeg)

↓のようにブレークポイントで止まることが確認できる

![editor.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34165/9b13ff76-4a33-0f0a-9c31-f406d09afe8c.jpeg)
【凡人向け】AWS認定ソリューションアーキテクト・アソシエイト　合格体験記

#▶この記事の対象者◀
この記事は凡人向けです！

#筆者のスペック
####▶業界歴
　　　2年目

####▶資格
　　　なし

####▶経験のあるサービス
　　　RDSAurora　DynamoDB　Redshift　Lambda　Glue　CloudWatch

####▶学習期間
　　　100時間程度(週5時間・半年ぐらい)

#受験のきっかけ
業務の中でAWSを利用していましたが、AWSがまったくわからなかったので学習を始めました。
学習するならついでに資格取得も挑戦してみようと思って受験しました。

#結果
１回目は不合格になりました。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497721/103d19bc-e9d0-0de7-433f-2a0e20e04590.png)

**2週間後にリベンジして合格できました！！**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497721/d102351c-ddc4-b0b3-2f11-b3a0fedf514b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497721/f46d15fb-d3a0-fc31-d001-681fe9772631.png)

#学習方法
####▶qiitaでAWSSAAに関する記事を読みまくる
どんな学習方法があるか調査しました。
1ヵ月で取得した方や1週間で取得する方も居ましたが、
**私と同じ様な凡人は3ヵ月～半年かけて勉強していきましょう。**

####▶王道の学習サービスをフル活用
⭐[徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書 徹底攻略シリーズ](https://www.amazon.co.jp/dp/B07M7S9GDL/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
￥2,200~2,500
平日の通勤時間、昼休憩時間に2週ぐらいしました！
AWSのサービスに関する**基礎知識からベストプラクティスまで網羅しています！**
模擬試験も付いているのでこれだけで合格できる方も居るかもしれません。
私はAWSの知識が無かったので、この本で基礎部分を学ぶことが出来ました！
例：リージョン、AZ、VPC、ELBなど

この本で学習する注意点としては最新のAWSバージョンに対応できない部分です。
AWSは頻繁に仕様が変わるため、
**「この本ではできないと記載があったのに今はできるよ！」**とかあります。
例：Lambda→RDSは諸事情によりアンチパターンだったが、RDSProxyの登場で改善された。


⭐[これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）](https://www.udemy.com/course/aws-associate/)
￥12,000　**←頻繁にセール価格になり、80~90% OFFで購入できます！**
AWSSAA対策で１番人気の教材だと思います！
ハンズオン形式でAWSサービスの利用方法を学べるため、**実務経験がない方にもオススメです！**
こちらも模擬試験が3回分付属している為、とても優良です。

私は60%ぐらいまで行いました。
AWSの触り方を手取り足取り教えてくれるので、初学者でも安心です！
AWSは有料サービスですが、講師の方が課金が発生しそうな部分は注意してくれるので、
**知らないうちに沢山の請求が来ちゃった！！**ってことにはならないと思います。

⭐[【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/course/aws-knan/)
￥3,600
模擬試験が6回分セットの教材です！
高難易度と書いてありますが、本試験では**こちらの教材と同レベルの問題がバンバン出ます！**

私はこちらをメインで行っていました。
1回目はめちゃくちゃ難しいので合格ライン突破するのは難しいと思います。
※逆に初見で合格ライン突破できる方は本試験に挑戦してもいいかもしれません。。。

**オススメの学習方法**
・1週目
試験　→　すべて見直し(正解も自分の考え方があっていたか確認)　→　次の試験
・2週目、3週目
試験　→　不正解だけ見直し　→　次の試験

ベストは2週目で合格ラインを超え、**3週目で80~90%**であれば本試験合格の確率は高いです。

⭐[AWS WEB問題集で学習しよう](https://aws.koiwaclub.com/)
￥4,280(税抜き)　**←プラチナプラン**
こちらも問題集となります！
SAAだけでなくSAP、DVPなどの認定試験の問題もあるのでとても優良です。
プランはいろいろあるので用途に合ったものを選びましょう。

問題は随時追加されているので、後半の問題は必ず解いておきましょう！

こちらの問題集は難易度も高いですが、なにより**問題文が本試験に近いです！**
Udemyの問題文は本試験と違うので、こちらで本試験に近い問題文で対策することをオススメします！

また、問題は一問一答形式ですぐに見直しが出来るところもいいですね。
**空いた時間にできるのでとても便利です！**


####▶BlackBeltで知識を深める
⭐[AWS サービス別資料](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)
無料
BlackBeltと呼ばれているAWS公式の資料群です。
こちらはSAA対策だけでなく、**AWSを利用する上でいつでも活用できるとても優良の資料たちです。**

サービス別に資料がまとめられていて、サービスの概要からベストプラクティスまで網羅されています！

私は通勤時間などの隙間時間に目を通していました。
資料もとても見やすく、面白いと感じれる資料でした！


#最後に
本試験はとても難しかったです。
130分の試験時間があるので、60分ぐらいで一回解き終わると思いますが、
すべて見直しすることをオススメします！
見直しの中で「これじゃなくてこれじゃね？」って解答が複数ありました。
見直しをしていなければ不合格になっていたかもしれません。。。
なんとか合格できたので一安心です(笑)

合格したことでAWSに関する知識に自信もつきましたし、
**業務の中でも勉強したことはとても活かされていると実感しています！**

現在はアソシエイト3冠を目標にSOAを勉強中です！

みなさんもAWSを勉強して素敵なAWSライフを送りましょう！
Emacs で Go の開発パッケージを入れられない Not found, Failed to verify signature の解決方法 (Ubuntu 18.04) 

タイトルが長い。

emacsで package-install が上手くできなかった方向けです。
以下の参考のブログの、「必要な go パッケージの導入」まで行っている事が前提です。

# 参考
https://qiita.com/bussorenre/items/3e80e59d517db8aebf46

# Emacs のバージョン確認
```
emacs --version
```
バージョンが26以上の方は次の作業をする必要はありません。

25以下の方はバージョンアップする必要があります。
(解る方は、鍵を取得して更新する方法もあります)

# Emacs のバージョンアップ
Emacs の package-install ではバージョンが古いと署名鍵が一致しない場合があるようです。
この場合、パッケージを管理しているレポジトリに接続できません。

新しいバージョンのEmacsを使うことでこの問題を解決できます。

```
sudo add-apt-repository ppa:kelleyk/emacs
sudo apt update
sudo apt install emacs26
```
emacsの最新版インストールしましょう。
現在27まであるようなので、お好みで。

```
sudo apt remove --autoremove emacs25*
```
古いEmacsを削除します。
`emacs25*`に指定するバージョンは、一番最初に確認した値に合わせて変更してください。

# Init.elをいじる
init.elを書き換えている方は、そのファイルを変更します。
init.el自体書いた覚えのない人は、以下に新たにファイルを作ります。

```
cd ~/.emacs.d/
vim init.el
```

先頭に以下の文を追加します。
既に書かれていた場合は、この作業は不要です。

```
(package-initialize)
(setq package-archives
      '(("gnu" . "http://elpa.gnu.org/packages/")
        ("melpa" . "http://melpa.org/packages/")
        ("org" . "http://orgmode.org/elpa/")))
```

今回導入するパッケージは、melpaと呼ばれるリポジトリに登録されています。
デフォルトでは接続しないため、接続先として設定してあげる必要がありました。

# package-install
パッケージリストを更新しておきましょう。
Emacsを起動して以下を実行します。

```
M-x package-refresh-contents
```

M-xが何かわからない方は、取り合えず `Alt+x`を押すと良いと思います。
具体的には、以下の手順を踏みます。

- emacsを起動する
- `Alt+x`(M-x)を押す
- 下の方に`M-x `と出るので、`package-refresh-contents`と入力してEnter

続いて以下のコマンドを打ちます

```
M-x package-install flycheck
M-x package-install company-go
```

- `Alt+x`(M-x)を押す
- 下の方に`M-x `と出るので、`package-install`と入力してEnter
- `Install package: `と出るので、`flycheck`と入力してEnter
- `company-go`についても同様

# 最後に
先ほどinit.elを作成した場所と同じところに`golang-conf.el`という名前のファイルを作成します。
内容は、[参考](https://qiita.com/bussorenre/items/3e80e59d517db8aebf46#emacs-%E3%81%AE%E8%A8%AD%E5%AE%9A)に書いてあるサイトを参照してください。

お疲れ様でした！
上手く設定できていれば、Goのファイルを開くとシンタックスハイライトがついているはずです。
phx.newする時にUUIDを使うように指定する。

```
mix phx.new default_uuid_project --binary-id
```



__参考関連__

* [Ectoでprimary keyにUUIDを使う](https://scrapbox.io/alchemists/Ecto%E3%81%A7primary_key%E3%81%ABUUID%E3%82%92%E4%BD%BF%E3%81%86)


* [How to: use UUIDs as Primary Keys in Elixir/Phoenix](https://medium.com/flatiron-labs/how-to-use-uuids-as-primary-keys-in-elixir-phoenix-f0583ca10d29)
Python3のSubprocess.run()をCGIスクリプトで使う

## 現象

以下のコードを書き、拡張子を`.cgi`として、`/usr/lib/cgi-bin`に保存する。

```python

import subprocess
print('Content-type: text/html¥n')

print(subprocess.run('hostname'))
```

ブラウザからこのCGIスクリプトにアクセスすると、`500 Internal Server Error`が返ってくる。

Apacheのログでは、

```
malformed header from script
```

と出力される。

## 原因と解決方法

`subprocess.run()`は、何も指定しないと標準出力に結果を出力しない。

>デフォルトでは、標準出力や標準エラー出力を捕捉しません。捕捉したい場合は stdout または/および stderr 引数に PIPE を渡してください。

https://docs.python.org/ja/3.5/library/subprocess.html

引数`stdout`に`subprocess.PIPE`を指定すると標準出力に結果を出力する。
`subprocess.run()'をCGIスクリプトで使うときは以下のようにする。

```python
result = subprocess.run('hostname', stdout=subprocess.PIPE)
print(result.stdout)
【クラス分類】VGG16を調べてわかった事

SSDを勉強しようとしてたら、VGG16が出てきて分からなかったので、調べた事をまとめて見た。
結論として、画像を1000(任意)クラスに分類するモデルなんだなって事がわかった！

Deep Learningって画像とか見ただけじゃ、何を意味してるかピンとこないけど、理解すればそんなに難しくないのねって毎回思う。いつか画像見ただけで分かるようになりたい。


<h1>ネットワークの概要</h1>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/603e6fab-f091-135b-09b8-5c4a63bfaf3b.png)

1. 224(W)x224(H)x3(C)をConvoliton層で畳み込みMaxPooling層で画像サイズを半分にしながら、特徴を抽出していく。


2. 1を繰り返す事で、7(W)x7(H)x512(C)のFeature Mapが出来上がる。


3. 512個の特徴と7x7の画像をFully Connected層を用いて4096個の特徴を持つ1x1の画像に変換する。


4. さらに、4096個の特徴を持つ1x1の画像をFully Connected層により1000個のクラスの確率を持つ1x1の画像に変換する。(4096個の特徴が任意のクラスの確率にどの程度関係あるかは、重みによって決まる)


5. 最後にsoftmaxによって、1000個の確率の合計値が1になるように正規化する。


6. 一番確率の高いクラスを画像のクラスとして出力する事が出来る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/c5b8f22d-509a-b323-7374-0a2cd20d41df.png)






<h1>参考文献</h1>
https://arxiv.org/pdf/1409.1556.pdf
http://www.sanko-shoko.net/note.php?id=pyk1
https://newtechnologylifestyle.net/vgg16originalpicture/
JupyterHub（TLJH） on EC2 の立て方と設定メモ

JupyterHub（TLJH） on EC2 の各種備忘録

# JupyterHubとTLJH

- マルチユーザ利用のJupyterNotebookをサポートするJupyterHub
- セットアップ方法は2種類
    - Kubernetes+HELMデプロイ（大規模用）
    - TLJH：The Littlest Jupyter Hub on VMデプロイ（小規模用）
- https://jupyter.org/hub
- https://tljh.jupyter.org/en/latest/

# TLJH

小規模向け（users ～ 100）簡易実装のThe Littlest Jupyter Hub

## セットアップ

- 各種環境のオフィシャルセットアップ方法がある
    - Installing on Digital Ocean
    - Installing on OVH
    - Installing on Jetstream
    - Installing on Google Cloud
    - Installing on Amazon Web Services
    - Installing on Azure
    - Installing on your own server
- AWS版は、ubuntuベースのEC2で、セットアップスクリプトを仕掛けて起動するだけ
- https://tljh.jupyter.org/en/latest/install/amazon.html

<img width=500 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/b79d206d-24f6-ab36-5908-0d1d8d2b6ca9.png>

## パスワード変更方法

- 以下URLで変更可能

http://[IP]/hub/auth/change-password

参考）
https://github.com/jupyterhub/the-littlest-jupyterhub/issues/481

<img width=500 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/73e7b6de-e338-8748-5c9f-72daeae942b6.png>

## ユーザだけTerminalを無効化する方法

- `jupyter_notebook_config.py`ファイルで制御できる
- 手順
    - ①`jupyter notebook --generate-config`で`jupyter_notebook_config.py`作成
    - ②adminユーザの~home/.jupyter/に`jupyter_notebook_config.py`が作成されるので、`# c.NotebookApp.terminals_enabled = True` の`#`を削除して有効化
    - ③このファイルを`/opt/tljh/user/etc/jupyter/`にコピーして、コピー先の方だけ`c.NotebookApp.terminals_enabled = False`に変更（元の方はそのまま）
    - ④Jupyterのサーバを再起動（コントロールパネルから Stop My Server → Start My Serverする）
    
- 再起動されたユーザ用Notebookは、最新のconfigが読み込まれて、下記のように「Terminals Unavailable」となる
- adminなど個別設定にしたい場合は、個々のホームにファイルを置いて`~/.jupyter/jupyter_notebook_config.py`の設定で上書きされる

<img width=300 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/eb286a48-cf7d-a264-69e6-efc3bb717f60.png>


参考）
https://github.com/jupyterhub/the-littlest-jupyterhub/issues/373