OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon Web Services 基礎からのネットワーク&サーバ構築のまとめ　Chapter1

[Amazon Web Services 基礎からのネットワーク&サーバ構築](https://www.amazon.co.jp/Amazon-Web-Services-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89/dp/4822237443/ref=sr_1_3?adgrpid=56125102274&hvadid=259468333147&hvdev=c&hvlocphy=1009303&hvnetw=g&hvpos=1t1&hvqmt=e&hvrand=11637141548601788067&hvtargid=kwd-301559774871&jp-ad-ap=0&keywords=aws+%E6%9B%B8%E7%B1%8D&qid=1555329053&s=gateway&sr=8-3)の個人的な学習記録として、この記事を書いています。問題があるようでしたら消します。

### 1-1 ネットワークとサーバーの知識を付けておくメリット
- 障害が起きた時に、どこで起きてるのか分かる
- 一人で色々できるようになる

### 1-2, 1-3 ネットワークとサーバーについて
#### サーバー
サーバーには用途別で色々種類がある。「Webサーバー」、「メールサーバー」、「データベースサーバー」などなど。その用途に合わせて、OSからソフトウェアをインストールする必要がある。

- WEBサーバー
    - Apache
    - nginx
- データベースサーバー
    - MySQL
    - PostgreSQL
- メールサーバー
    - Sendmail
    - Postfix

#### ネットワーク
##### 用語
 - TCP/IP：インターネットと接続する為のプロトコル。
 - IPアドレス：サーバーに振り当てるピリオドで区切られた4つの数字で住所と同じ役割。重複することはない。
 - DNSサーバー：ドメイン名とIPアドレスを関連付けてくれるサーバー。

#####公開されたネットワークと隠されたネットワーク
「パプリックサブネット」と呼ばれる公開されたネットワークと「プライベートネットワーク」と呼ばれるインターネットに直接接続しないネットワークがある。前者には見てもらう為のWebサーバー、後者には見られたくないDBサーバーを置く。

#####NAT
隠しておきたいけど、DBサーバーとやり取りする為にはインターネットと接続する必要がある。そんな時にNATを使うと、片方だけの接続ができるようになり、外から見られないで済む。

### 1-4 AWS
こいつのおかげで、物理的にサーバーとかルーターを用意しなくてもネットワーク、サーバーが構築できる。

####ネットワークとVPC
VPC = ネットワークの領域
EC2 = サーバー
サーバー1つをインスタンスと呼ぶ。

### 感想
1章を読んでみた感じ、ネットワークとサーバー、AWSを全く知らない人向けって感じでしたね。個人的には良い復習になった章でした。

[Chapter2](https://qiita.com/EtoKazuki/items/5f517ed6f747902f6e79)
AWS CLI の全てのコマンドをMFA認証必須にする

### AWS CLIでMFA認証を必須にする

AWS CLIはアクセスキーを使用して認証するのでアクセスキーが流出してしまうと
そのユーザの権限でなんでもできてしまう。権限を絞ることで被害を抑えることもできるが
AWS CLIでもMFAの認証を行うこともできる。

明示的な拒否のポリシーの方が強いのでMFA認証されるまでは全てのアクションが拒否されるが
認証後は全てのアクションが許可される。
AWS CLIでMFA認証するためのaws sts get-session-tokenを実行するのに必要な権限はない


```:policy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*"
        },
        {
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": false
                }
            }
        }
    ]
}
```

###認証方法
MFA認証するにはget-session-tokenでセッショントークンを取得して環境変数に入れる必要がある。

```:console
aws sts get-session-token --serial-number arn:aws:iam::アカウントID:mfa/ユーザ名 --token-code ワンタイムパスワード

{
    "Credentials": {
        "AccessKeyId": "xxxxxxxxxxxxxxxxxx",
        "SecretAccessKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "SessionToken": "xxxxxxxxxxxxxxxxxxxxxxxx", 
        "Expiration": "yyyy-mm-ddThh:MM:ssZ"
    }
}



```
Pythonでエクセルから条件付きCSV出力

## 経緯
最近参画していた案件でタイトル通りの機能が必要であったため。
作成した内容を抜粋。

## Github
https://github.com/biz-nakashima001/python_xlsx2csv

## 機能
- エンコード、改行コードを指定できる。
- スキップする行を指定できる。
- 文字列か数値か判断して、出力形式を分ける。
- 小数(パーセント)は桁数指定
- 結合セルもよしなに処理。

## ライブラリについて
当初は、エクセル上00.0%書式のところ、ロジック上で書式を読み取り判断する仕様だった為、
書式データも読み取り可能なpandas、openpyxlを検討した。

### 採用

[xlrd](https://github.com/python-excel/xlrd)

- 速かったから。2000行で４秒程度。20000行で40秒ぐらい
- 結合セルも補間して処理してくれるから。
- 書式読み取り不要になった為。

###  不採用
[pandas](https://github.com/pandas-dev/pandas)　

- エクセル良い取って、csv出力するだけにしたら、dataflameは機能過多で複雑に感じたから。

[openpyxl](https://github.com/chronossc/openpyxl)

- 重たかったから。2000行で１５秒。xlrdの約三倍。
  書式データを保持しているからか、初期読み込みに時間がかかる模様。
- 結合セルをよしなに処理してくれなかったから。

## ロジック詳細

### import

```
import xlrd
```

### エクセル読み取り
```
xls = xlrd.open_workbook(INPUT_XLSX)
sheet = xls.sheet_by_index(0)

rows = sheet.nrows # 行数 
cols = sheet.ncols # 列数

for r in range(0, rows):
    for c in range(0, cols):
        cell = sheet.cell(r,c)
```

```
cell.value # 値を取得
cell.ctype # 値のタイプを取得
```

##  CSV出力
### エンコード、改行コード

```
file = open(OUTPUT_CSV, 'w', encoding = ENCODE, newline = NEWLINE)
```
```
ENCODE =>
'utf_8_sig' # UTF8 BOM付き
'utf_8' # UTF8
```
```
NEWLINE =>
'\r\n' # CRLF
'\n' # LF
```

### 出力用関数

```
# 文字列出力 (""で囲む)
def writeStr(value):
    return '\"' + str(value) + '\"'

# 数値出力
def writeNum(value):
    return str(value)
```

### 文字列か否か

```
# 文字列の場合
if(cell.ctype == xlrd.XL_CELL_TEXT):
    writeStr(cell.value)
```

### 数値か否か

```
if(cell.ctype == xlrd.XL_CELL_NUMBER):
    if(cell.value.is_integer()):
      writeNum(int(cell.value))
    # 少数の時 第3位まで
    else:
      writeNum(round(cell.value, ROUND))        
```
```
# 許有少数桁
ROUND = 3
```

### 整数か否か

```
value.is_integer()
```




##　実施方法

```
python3 tocsv.py
```
Ubuntu 18.04で起動するときACPI errorが出たら

# 環境
- Ubuntu 18.04
- AsusのPC

# エラー
起動するときにこんなのがでる

```
[ 0.064522] ACPI Error: Method parse/execution failed \_SB.PCID.RPOB.PXSX, AE_NOT_FOUND (20170831/parse-550)
[ 0.066316] ACPI Error: [_SB.PCID.RPOB.PXSX], Namespace lookup failure, AE_NOT_FOUND (20170831/download2-191)
[ 0.066325] ACPI Error: AE_NOT_FOUND, During name lookup/catalog (20170831/psobject-252)
[ 0.246232] ACPI Exception: AE_NOT_FOUND. Evaluating _PRS (20170831/pci_link-176)
[ 0.246248] ACPI Exception: AE_NOT_FOUND. Evaluating _PRS (20170831/pci_link-176)
[ 0.246260] ACPI Exception: AE_NOT_FOUND. Evaluating _PRS (20170831/pci_link-176)
[ 0.246272] ACPI Exception: AE_NOT_FOUND. Evaluating _PRS (20170831/pci_link-176)
[ 0.246285] ACPI Exception: AE_NOT_FOUND. Evaluating _PRS (20170831/pci_link-176)
[ 0.246297] ACPI Exception: AE_NOT_FOUND. Evaluating _PRS (20170831/pci_link-176)
[ 0.246310] ACPI Exception: AE_NOT_FOUND. Evaluating _PRS (20170831/pci_link-176)
[ 0.246322] ACPI Exception: AE_NOT_FOUND. Evaluating _PRS (20170831/pci_link-176)
```

# 解決策
## 初回起動時
- Ubuntuを選択する画面でeを押す
- 参考のリンクのように編集
- ctrl + xで起動

## 永続化させる
参考のリンク参照

# 参考
https://askubuntu.com/questions/1040364/acpi-error-when-trying-to-make-dual-boot-with-ubuntu-18-04-and-windows-10
http://ubuntuguide.net/turn-off-acpi-ubuntu-grub2
環境構築初心者にもおすすめ！windowsでの環境構築

# Windows最大の壁、環境構築
最近、AIブームや競技プログラミングブーム（？）によりプログラミングを始めたいという人も増えていると思います。パソコンに詳しくない人に立ちはだかる最大の壁が環境構築、つまりプログラムを実行する環境を整えることです。
また、windowsでの環境構築は面倒くさいので嫌だなぁという人も多いと思います（Windowsにパッケージマネージャが無いからこういうことになる）
windowsマシンしか持っておらず、日々Microsoftの悪口を言っている人でも一瞬で環境構築が出来る方法を紹介します。


## C++でHello World!をする
今、windows上で最も楽に環境構築をする方法は[Scoop](https://scoop.sh/)を用いるものです（主観）
（ちなみにこの記事はScoopの宣伝です。）

1. Windowsキー+Rで「ファイル名を指定して実行」を開いて、"powershell"と打つ。謎の青い画面が出て来る（powershellが起動した）
2. 以下のコマンドを入力

```
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
iex (New-Object net.webclient).downloadstring('https://get.scoop.sh')
scoop install gcc
```

はい、c/c++のコンパイラがインストールされました。あとは適当なエディタでコードを書くだけです。個人的におすすめのvscodeをインストールしましょう。

```
scoop bucket add extras
scoop install vscode
```

後はディレクトリを移動して、test.cppというファイルでHello Worldしてみましょう(ファイル名は適当にTabキーを押していれば補完されます）

```
cd .\Documents\
code test.cpp
```

コードを書いたらコンパイルして実行してみましょう

```
g++ test.cpp
.\a.exe
```

無事世界に挨拶できました！！！

## Scoopについて
Windows上での環境構築は、

- GUIでの操作を要求されたり、
- どこにインストールされてるのかよく分からなかったり
- ソースからコンパイルするにもコンパイラがうまく入らなかったりコンパイルになかなか成功しなかったり
- PATHがおかしくなって訳がわからなくなったり
- 謎のdllを要求されたり
- 外部ライブラリの管理がめちゃくちゃになったり
- そういった煩わしさを解決するためのツールが色々あって結局どれを使えばいいか分からなかったり
- バージョンアップの方法も色々で混乱したり

して大変です（個人の感想です。）
Scoopを用いるとそういった面倒なこと無しに手軽に環境構築が出来て素晴らしい！

gitもpythonもrubyもvimも一瞬でインストールすることが出来て、Updateも一行で出来ます。
tar, curl, unrarなどといった便利ツールも簡単にインストールできる訳です。
筆者は一瞬で環境構築が出来たのが嬉しくてついついこんな記事を書いてしまいました。

[Githubのwiki](https://github.com/lukesampson/scoop/wiki)や、`scoop help`で見られる解説が分かりやすいので読めばすぐに使えるでしょう。
みなさんぜひ使ってみてくださいね～
バッチの引数にファイルパスを渡すと壊れるのな


# ファイル名破壊を回避するサブルーチン

以下の バッチサブルーチンは、引数を全てダブルクオーテーションで囲み直し、ファイル名の破壊を防ぐ。

```bat
:quote_args
  set __QUOTE_ARGS__=
  setlocal enabledelayedexpansion
  set "ARGS=%* "
  :next
  for %%a in (!ARGS!) do (
    if '%%a' == '"%%~a"' (
      set "BUFF=!BUFF! %%a"
      set "ARGS=!ARGS:*" =!"
      goto next
    )
    for %%b in ("!ARGS: =" "!") do ( 
      set "BUFF=!BUFF! %%b"
      set "ARGS=!ARGS:* =!"
      goto next
    )
  )
  endlocal & call set "__QUOTE_ARGS__=%BUFF:~1%"
  exit /b
```

使い方はそのまま既存のバッチに埋め込んで簡単に使用できる。

```bat
@echo off

rem 既存バッチ全体をサブルーチン化（main）して呼び直す
call :quote_args %*
call :main %__QUOTE_ARGS__%
:main

rem 既存バッチスクリプト本体
～
～
for %%a in (%*) do (
  echo %%a
)
～
～
exit /b

rem 引数処理サブルーチン埋め込み
:quote_args
  set __QUOTE_ARGS__=
～
～

```

こんな意味不明のコードを埋め込みたくなければ、そのまま外出しの BAT ファイルにして外部ライブラリとして呼び出してもよい。

```bat
@echo off

rem 外部ファイルのライブラリとして呼び出す
call .\quote_args.bat %*
call :main %__QUOTE_ARGS__%
:main

rem 既存バッチスクリプト本体
～
～
for %%a in (%*) do (
  echo %%a
)
～
～
```

既存バッチを編集することさえ避けたいのなら、逆に、ラッパーにして既存バッチを呼び出すことも可能だ。

```bat
@echo off

rem 既存 BAT に引数を渡しなおす
call :quote_args %*
call .\legacy.bat %__QUOTE_ARGS__%
exit /b

:quote_args
  set __QUOTE_ARGS__=
～
～
```

これで、バッチにファイルを**Drag & Drop**しても常に有効なフルパス名が引き渡せるようになる。

ただし一部使用できない記号（`%`,`!`,`&`,`^`）がある。

## 解説

解説はしない、腹が立つので。
Qiitaの皆さんはこういうくだらない事にかかずらってはなりませぬ。
有限体の可逆元全体は巡回群になることの証明


個人的な数学備忘録になります。以下の定理の証明を書いておきます。

[定理]

有限体の可逆元全体は巡回群となる。

（証明）

$G$を有限体の可逆元全体からなる群とする。また、$n=|G|, d|n$とする。

もし、$|a|=d$となる要素$a\in G$があったとすると,$a$で生成される$G$の部分群$H$を考えることができる。

すなわち、

```math
H=\left\{a^i \mid i \in \mathbb Z  \right\}
```

である。

ここで、

```math
\tilde H =\left\{x\mid 
x^d =1
\right\}
```

とおく。明らかに、$H \subset \tilde H$がいえる。

一方、$G$は体の部分集合であるので、方程式$x^d=1$の解はせいぜい$d$個しか存在しない。

よって

$$
d= | H| \geq |\tilde H|
$$

以上により、$H=\tilde H$がわかった。

ここで、$x^d=1$をみたす$x\in G$の個数を$\psi (d)$とする。これまでの考察より

$$
\psi (d)=0
\quad
\text{or}
\quad
 \psi (d)=\phi (d)
 $$
 がいえる。ここで$\phi(d)$はユークリッドの関数である。すなわち

 ```math
 \phi(d)=| \left\{z\in \mathbb N \cap [1,d]\mid gcd(d,z)=１ \right\}|
 ```

 である。

 $$
 \sum_{d\mid n}\psi(d)=\sum_{d\mid n}\phi(d)
 $$

 が成り立つ。すべての$d\mid n$に対して$\psi(d)\leq \phi(d)$であるから

 $$ \psi(d)=\phi(d) \quad \text{for all}\quad d\mid n
 $$

 がわかった。特に、$\psi(n)=\phi(n)＞０$であるから、位数が$n$である$G$の要素が存在する。よって、$G$は巡回群である。
Perlを初めて書いてみよう！

#Perlやってもらうから
ん？perl？？(すっとぼけ
perlなんて触ったことも無いけれど
まぁifやforさえ出来れば、プログラミングなんてちょちょいのちょいやから！！

##甘いんだよォ！！！
お前はperlを舐めてるッ！
perlのクセの強さに苦しむが良いッ！！

###perlの宣言
まずはperlを書き始める前にperlの宣言をしなくてはいけない。
perlのファイルの1行目にperlのパスを記述し
useでモジュールの読み込みをする。

```perl
#!/usr/local/bin/perl
use strict;
use warnings;
```
こんな感じで書いていく。
ちなみに`use strict;`は変数の宣言をしないと怒られるようになるモジュール
`use warnings;`はエラーを吐いてくれるようになるモジュール。

###変数を宣言する。

####変数の種類
perlには変数に種類がある。
$：スカラー変数（scalar variable）
@：アレイ変数（array variable）
%：ハッシュ変数（hash variable）
の三種あり、それぞれプレフィックスというものを頭につけなければならない。

####$：スカラー変数
いわゆる一般的な変数。
1つの値しか代入することが出来ない。

```perl
$suuzi = 123;
$mozi = "よんごーろく";

print $suuzi; #123
print $mozi; #よんごーろく
```

####@：アレイ変数。
いわゆる配列の変数。

```perl
@sosuu = (1,3,5,7,11,13,17);
@kudamono = ("りんご","みかん","れもん");

push(@sosuu,19); #最後に追加
unshift(@kudamono,("めろん","すいか")); #先頭に追加

shift(@sosuu); #先頭を削除
pop(@kudamono); #最後を削除

print @sosuu[3] #5
print @kudamono[1] #すいか
```

####%：ハッシュ変数
いわゆる連想配列の変数。
連想配列を宣言する時のプレフィックスは%
連想配列の中の1つを参照する時のプレフィックスは$であることに注意！

```perl
%risuto = ("やまだ"=>15,"たなか"=>22,"すずき"=>29);

$risuto{"やまもと"} = 36;

print $risuto{"やまだ"}; #15
print $risuto{"やまもと"}; #36
```

###if文
条件分岐であるif文の書き方は一般的なプログラミング言語と一緒
…でない時がある。

```perl
$banngou = 10;

#【A】
if($banngou == 10){
  print "当たり！";
}

#【B】
if($banngou eq 10){
  print "当たり！";
}
```
【A】のコードは色んな言語で見られるが
なんとperlでは【B】の書き方でも【A】と同じ結果を得られる。
比較演算子を文字で書くことが出来る。
現代を生きるプログラマーボーイ達は視覚的に理解できる`==`や`!=`を使うと思うが
レジェンドである強いプログラマーおじさん達は`eq`や`ne`と書くことがある。
ボーイ・アンド・ガールは狼狽えないように！

また

```perl
$banngou = 18;

if($banngou == 18){
  print "当たり！";
}else{
  print "ハズレ…";
}
```

のようにif文の条件に当てはまらない場合を書くことが出来る。
…が

```perl
$banngou = 24;

if($banngou == 24){
  print "当たり！";
}elsif($banngou >= 20){
  print "セカンドチャンス";
}else{
  print "ハズレ…";
}
```

のように他のプログラミング言語で使われる`elseif`や`eles if`は使えず
`elsif`と書かなければならない。
決してタイプミスなどと思わないように！

###for文
反復構文のfor文は他のプログラミング言語とほぼ同じ。

```perl
for(my $cnt = 0;$cnt < 10;$cnt++){
  print "カウント".$cnt."\n";
}
```

変数の初期化の際に`my`をつけて変数を宣言するとスコープを制限させることが出来る。
また、反復の現在の処理をスキップする`next`や
反復そのものの処理を終了する`last`が使える。

#編集後記
入社11日目。
初めてperl触ったので、忘れないようにメモ書き的な感じで。
なんというか、クセが強すぎる…
特にハッシュ変数とかマジでハマった。
なんで宣言する時は%で、参照する時は$やねん…
オレ用、tex数式の巻

オレ用、tex数式の巻・其壱

自分用でメモ程度なので言葉が稚拙です。稚拙です。

ち　せ　つ



align環境やsplit環境を用いても、うまく改行されない。
全部の=に&をつける。

改行は改行前の文章にすぐに\ \をする。
AWS CLI ローカルからS3へディレクトリ構造を保ちながらコピーする

bucketバケットに folder1/file1と folder2/file2をコピーする

```sh
$ tree
.
├── folder1
│   └── file1
└── folder2
    └── file2
```

```sh
$ find folder* -type f | xargs -I{} aws s3 cp {} s3://bucket/{}/ --recursive
```
RailsプロジェクトへのVue.js導入

Rails × Vueのセットアップ

導入方法は以下の4つが考えられそうだが今回は1.で導入

1. デフォルトのRailsプロジェクトの中にVue.jsを導入
2. APIモードのRailsプロジェクトの中にVue.jsを導入
3. RailsコンテナとVueのコンテナに分けてコンテナ同士で接続
4. Rails用サーバーとVue用のサーバーでそれぞれ構築して、エンドポイントで接続

```:Gemfile
gem "webpacker"
```

```
# gemのインストール
bundle install
# webpackerインストール
bin/rails webpacker:install
# コンパイル
bin/webpack
# vueインストール
bin/rails webpacker:install:vue
# Top作成
rails g controller Home index --no-assets --no-helper --no-test-framework
# vue読み込み
sed -ie '10i \    <%= javascript_pack_tag "hello_vue" %>' app/views/layouts/application.html.erb
```

- routeの書き換え

```ruby:config/routes.rb
Rails.application.routes.draw do
  root to: 'home#index'
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end
```

- localhostにアクセスしてhello worldを確認
  - http://localhost:3000

## 雑感
何も開発していないのに最初から色々1つのプロジェクトにたくさん入っちゃっている感
予測値の元（学習時の答えとして与えている値）について

# 標準化
当日から20本分の2時間足を見て、
その中の最大の値と最小の値で標準化する。

Y軸：USD/JPYレート
X軸：2時間ごとの時間

## 標準化前
![test1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/4851f444-0c84-c4fc-d1a9-64218722e4f2.png)

この場合、標準化すると以下となる。

## 標準化後
![test2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/2dcaa6c0-ebb8-9d95-412a-d3039497bd81.png)

数値は以下。

## 標準化前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/03e487c1-8c61-ab98-1970-86c7cc110159.png)

## 標準化後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/4e302dd6-86e8-7785-11fa-dade46d82506.png)

# 予測値の元（学習時の答えとして与えている値）の例
## 標準化前
ある日の17時の値：1120880
ある日の19時の値：1120510
差額：-370(円)
## 標準化後
ある日の17時の値：0.987643564356435
ある日の19時の値：0.952475247524752
差額：-0.03517←これが予測値の元（学習時の答えとして与えている値）

※値の幅が小さく学習しづらいため、
この標準化の差額を2～3倍した値を学習の答えとしている。
つまり、実際にはこの場合「-0.1055」となる。

上記はモデル最終層の活性化関数がlinearの時。
現在は、モデル最終層の活性化関数をsigmoidに変更しているので、
上記の値に+0.5している。

# 予測値の例
![014_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/73382ed2-4a8f-5a52-3b6d-a1ba79b757a9.png)
このように、0.4～0.6の幅で予測値を返してくる。
もっと極端に買・売を返してくるようにしたいのですが、
どうすればいいでしょう。
予測が外れる場合はリボンのような形になるイメージ。
予測があたりまくっていればV型になるイメージ。

# 補足
以下は学習を70回繰り返して学習データでpredictの出力をした場合の結果。
0.4～0.6は取引しないよう設定。
![069_131.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/af8f02ec-00c4-e571-bdb5-5b38f95c9a14.png)
JAVA_HOMEとPath

#JAVA_HOMEとPath
windowsでJavaのインストールをしないといけない時にネックになってくるのが**環境変数**。

#環境変数とは
Javaではバージョンごとフォルダに分かれて情報等が入っている。
そこまでの階層`/Library/Java/JavaVirtualachine/jdk{バージョン}/`をさすのはめんどくさいから、JAVA_HOMEとかPathという**環境変数**に入れて楽に扱おうというもの。

よく「Pathが通らない〜」というのは環境変数の中身が間違っていて目的の階層にいけない事

#JAVA_HOMEとPathの違い
どちらも環境変数である。
ただ、アプリケーションによって`JAVA_HOME`でJavaの情報を取得したり`Path`でJavaの情報を取得したりするので両方設定しておくといい。

以下設定情報。
なおJDK（Java）は`C:¥Program Files¥Java¥jdk1.8.0_101`にインストールされてるとします。
詳しい設定方法は[こちら](https://eng-entrance.com/java-install-env)。

##JAVA_HOME

```
JAVA_HOME = C:¥Program Files¥Java¥jdk1.8.0_101
```
JDKがインストールされているディレクトリを指定する

##Path

```
Path = C:¥Program Files¥Java¥jdk1.8.0_101¥bin
```
Javaのソースコードをコンパイルしたり実行したりするファイルが`¥bin`以下に入っているのでそこを指定。

#参考にさせていただいた記事
ありがとうございました。
[ちゃんとできてる？Javaの環境変数の設定方法](https://eng-entrance.com/java-install-env)
[PATHの設定及び環境変数JAVA_HOMEの設定](https://www.javadrive.jp/start/install/index4.html)
[JAVA_HOMEについて](https://qiita.com/Terry3/items/9a1a8f1b6de349cee5ef)
GoogleスプレッドシートのCONCATENATEの文字制限をGASを用いて突破する方法

# 問題
Google スプレッドシートの標準の関数CONCATENATE
https://support.google.com/docs/answer/3094123?hl=ja

文字列を結合してくれるものなのですが5万文字を超える場合はエラーがでて結合ができなくなる。
<img width="434" alt="スクリーンショット 2019-04-15 19.30.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4541/80dc8ca8-02ca-f450-fb3e-4c93b8fca0cc.png">

# 解決方法
今回はこれをGAS(Google App Script)を用いて解決する
GASを書くには以下のようにツール→スクリプトエディタでエディタで開く
<img width="305" alt="スクリーンショット 2019-04-15 19.32.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4541/90a0ce3b-48fb-b558-55d3-e7aa51c2ab7c.png">

コードはたったの5行！で今回はCONCATENATEを独自拡張したものなので関数名はCONCATENATE_EXTENSIONとしました。
<img width="760" alt="スクリーンショット 2019-04-15 19.34.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4541/ea8e5a64-28af-7de8-55d9-d2602dde15ee.png">
やってることは引数を取得してtextのsplit関数で結合しているのみです。

これを保存するとそのシートで CONCATENATE_EXTENSION(A1, A2) みたいにCONCATENATEと同じように使えて5万文字の制限がないものとして使える。

# まとめ
今回のCONCATENATE関数のようにGoogleスプレッドシートで制限がかかっているような関数でもGASを使って独自に(5行くらい)書けば便利な関数が使えるのでオススメです！
[Ｃ言語]リビルドしただけなのにUndefined reference エラーが出るぞ？[gcc/g++]

# リビルドしただけなのにUndefined reference エラー 

Ｃ言語だとよくみかけるUndefined referenceエラー。ようするに、定義のない関数や変数を呼び出していたりすると発生します。だいたいは”Undefined reference　**hogehoge**”となっていて「あー、hogehogeね。hogehoge」ってすぐ解決するんですが、今回はソースコードを変更してないのにこの問題に遭遇しました。

「なんやねん・・・"(-""-)"」

と困惑してましたが、まあ迷ったらひとまずGoogle先生に聞くのが世の常でして、、

ひとまず、検索

「Undefined reference っと　　つ[検索]　」

瞬殺でした。

どうもgccでビルドした共有ライブラリをg++使ってリンクしたことで起きていたようでした。オブジェクトファイル（この場合はsoファイルかな？）上では同じソースからでもgccとg++で異なる名前になるようで、g++から名前解決できていないということが原因でした。

# 解決策
extern "C"をつけて関数宣言するとのことです。

```cpp
#ifdef __cplusplus
extern "C"{
#endif /*__cplusplus */

  void hogehoge();

#ifdef __cplusplus
}
#endif /*__cplusplus */

```
[※4/25更新]　
[developer-kikikaikai](https://qiita.com/developer-kikikaikai)さんのコメントを受けてgccにも対応するためのプリプロセッサマクロによる処理を追加しました

もうちょっと書くと、
g++で関数を参照する際には関数名そのままではなく、ちょっとした文字列が付加されます（マングル処理と呼ぶらしい）。コンパイラに、Ｃで書かれてますよって明示的に示してあげることで「マングル処理しないで名前解決してね」ということを伝えているらしい。

なるほど解決。
Laravel/LumenでValidatorにモックを仕掛ける

## バリデーションにモックを仕掛ける

Laravel/LumenのValidatorクラスにはファサードが用意されています。ファサードには下記の説明にあるように最初からモックできるヘルパがあり、楽にモック化することができます。しかしValidatorに仕掛けるケースの記事がなかったので備忘録として。

> Laravelにはイベント、ジョブ、ファサードを最初からモックできるヘルパが準備されています。これらのヘルパは主にMockery上で動作する便利なレイヤーを提供しているので、複雑なMockeryのメソッドコールを自分で作成する必要はありません。

https://readouble.com/laravel/5.5/ja/mocking.html

### 実装
重要なのはバリデーションのmakeメソッドだけではなく、正常系確認用にあるpassesメソッドもつないで、返り値を設定することでバリデーションが実行される心配がなくなります。

```ExampleTest.php
        Validator::shouldReceive('make->passes')
            ->once()
            ->andReturn(true);

        $response = $this->json('GET', /example, $param);
```

### まとめ
今回はバリデーションでexistsルールを使ってテーブルに値があるか確認していて、APIのテスト時にはDBアクセスを避けたかったのでモックを利用してますが、他にも複雑なカスタムバリデーションなどを組んでいる時などにも良いと考えてます。(もちろん別途テストは必要)
jupyter notebookをPycharmで動かす


####前提
- 作業環境：Windows10
- 仮想環境：Annaconda
- Pycharmでの作業前にjupyter notebookを立ち上げる

---
####Pycharmに仮想環境を作成しInterpreterを設定する
Pycharmでプロジェクトを開いたところで、以下の様に設定

```
File > Settings > Project: Project Name > Project Interpreter > Show All > Add(+)
```

そうすると`Add Python Interpreter`が立ち上がるので、仮想環境を選択（Virtualenv, Conda等)し、`New Environment`にて以下の様に設定

- location : 仮想環境のディレクトリ `（\AppData\Local\Continuum\Anaconda3\envs\PJ）`
- Conda executable :  `\AppData\Local\Continuum\anaconda3\Scripts\conda.exe`

---
####Interpreterを選択する
プロジェクトファイルを開いた状態で以下により、Interpreterを選択する

```
Edit Configurations > Python interpreter: 作成したInterpreterを選択
```
---
####Jupyter Notebookを接続する
Pycharmで実際にjupyter notebookを使う際には、Pycharmとjupyter notebookがconnectされている必要があります

 - jupyter notebookを立ち上げる
 - `enter your Jupyter Notebook URL and authentication token` と表示されるので、URLとtokenを入力します。URLとtokenは`jupyter notebook list`で取得できます。

```
(nlp) C:\Dev\DL2>jupyter notebook list
Currently running servers:
http://localhost:8888/?token=token :: C:\Dev\DL2
```
`http://localhost:8888/?token=token`の箇所を入力

 - `Connecting to Jupyter Notebook Server` と表示され、Pycharmでjupyter notebookが使えるようになります。 

---
####気になる点

######jupyter notebookの常時立ち上げは必要か
Pycharmを立ち上げる度に起動と接続が必要だが、一度jupyter notebookにつながった後はjupyter notebookを停めても動く模様。もう少し検証して追記したいと思います。

<!--
先ずは `sys` と `import と from` から。
####Interpreterを作成する
>インタプリタや実行環境に関連した変数や関数がまとめられたライブラリ
引用元：[ライブラリ：sys](https://www.lifewithpython.com/2013/03/sys.html)

とのことで、`sys`に含まれている変数と関数は [sys --- システムパラメータと関数](https://docs.python.org/ja/3/library/sys.html) で確認できます。
例えば、`sys.path`でリスト形式で格納されている環境変数のPathを確認することができます。



```python.py
import sys
sys.path
```

<!--
```Javascript:fileName.js
'↑「言語名：ファイル名」と書いとくと言語に合わせて色を変えてくれるみたい。'
'Bash, C#(cs), C++(cpp), CSS, Diff, HTML, XML, Ini, Java, Javascript, PHP, Perl, Python, Ruby, SQL, 1C, AVR Assembler(avrasm), Apache, Axapta, CMake, DOS .bat(dos), Delphi, Django, Erlang, Erlang, REPL, Go, Haskell, Lisp, Lua, MEL, Nginx, Objective C(objectivec), Parser3, Python, profile, Scala, Smalltalk, TeX, VBScript, VHDL, Vala'
'ここだけソースがコードになってないけどごめんね(;´･ω･)'
'バッククオート(`)はSHIFT押しながら「@」キーを押す。'
'※キーボードによって違うので参考まで'
```
コメントアウトの練習

もう一度練習

「＊」か「＿」1個で*＿イタリック(斜体)＿*。2個で__太字__。

>「Code - コードの挿入」で使ったからこれも書いとかなきゃ(;´･ω･)
>こっちはソースがコードになってる方ね(;´･ω･)

-->
Visual Studio プロジェクトを不要なビルドせずデバッグする

Visual Studioのソリューションが大きくなると、デバッグ実行のとき、いちいち、ビルドが走ってしまって、遅く感じてしまうことはありませんか？

決定論的アセンブリを生成するように変更することで、コード変更がない場合、コンパイルがスキップされ、効率的にデバッグできます。

```xml
<Project>
  <PropertyGroup>
    <Deterministic>true</Deterministic>
  </PropertyGroup>
</Project>
```

Visual Studio 2019のプロジェクトテンプレートからは、デフォルトで`true`に設定されています。

参考：
[docs.microsoft.com / Docs / .NET / C# のガイド / 言語リファレンス / コンパイラ オプション / -deterministic](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/compiler-options/deterministic-compiler-option)
VSCodeの文字サイズを大きくor小さくしたい！for Mac

ことのはじまり

Visual Studio Codeの文字サイズを知らない間に小さくしてしまってもとに戻したい！
え、どうすればいいん？
多分フォントサイズを調整するショートカットがあるハズや！

## 文字サイズを小さくする
command（⌘） + マイナス（-）

## 文字サイズを大きくする
#### JISキーボード
command（⌘） + シフト（⇧） + プラス（+）
command（⌘） + シフト（⇧） + マイナス（-）

#### USキーボード
command（⌘） + プラス（+）

# なぜJISキーボードではcommand + shift + (プラス or マイナス) なのか？

こちらが参考のものです。
気分が乗ったら解説も書きます。

[Macで開発するなら抑えておくべきショートカットキーまとめ - Qiita](https://qiita.com/ryuichi1208/items/95b835b63c31d39c7629)
[コマンドキーと＋で拡大できません。縮小はできるのですが。 - Apple コミュニティー](https://discussionsjapan.apple.com/thread/10112033)
DockerfileのARGはFROMに対しても使える

よく考えれば当たり前なのかもしれないが最近気付いたのでメモ

ARGで処理系のバージョン等を設定しておいてFROMにそれを埋め込めばmulti-stage buildを使う時にバージョンを一元管理できたりと色々便利そう

```dockerfile
ARG RUBY_VERSION=2.6.2
ARG RAILS_ENV=production

FROM ruby:${RUBY_VERSION}-alpine AS node_modules
WORKDIR /opt/project
RUN apk add --no-cache --update nodejs yarn
ADD bin/yarn /opt/project/bin/
ADD package.json yarn.lock /opt/project/
ENV PATH=/opt/project/bin:${PATH}
RUN yarn install


FROM ruby:${RUBY_VERSION}-alpine AS bundle
WORKDIR /opt/project
RUN apk add --no-cache --update build-base mariadb-dev
ADD bin/bundle /opt/project/bin/
ADD .ruby-version .gemrc Gemfile Gemfile.lock /opt/project/
ENV PATH=/opt/project/bin:${PATH}
RUN \
if [ "${RAILS_ENV}" = "production" ]; then \
  bundle install --jobs 8 --without development test --deployment; \
else \
  bundle install --jobs 8 --without production --path vendor/bundle; \
fi


FROM ruby:${RUBY_VERSION}-alpine
WORKDIR /opt/project
RUN apk add --no-cache --update mariadb-dev tzdata nodejs yarn
COPY --from=bundle ${BUNDLE_APP_CONFIG} /opt/project/.bundle
COPY --from=bundle /opt/project/vendor/bundle /opt/project/vendor/bundle
COPY --from=node_modules /opt/project/node_modules /opt/project/node_modules
ADD . /opt/project/api
ENV RAILS_ENV=${RAILS_ENV}
ENV BUNDLE_APP_CONFIG=/opt/project/.bundle
ENV PATH=/opt/project/bin:${PATH}
ENV RAILS_SERVE_STATIC_FILES=true
RUN webpack
EXPOSE 3000
ENTRYPOINT ["rails"]
CMD ["server", "-b", "0.0.0.0"]
```
長押しボタンを作ってみた【円プログレス対応】

# はじめに

前回作成した記事の続きです。
[長押しボタンを作ってみた【初期実装】](https://qiita.com/ta__ho/items/585eac4e059a0d473c73)

# 今回やりたいこと

長押しボタンの進捗表現の方法として、ボタンの周りに進捗状況が表示されて、
ボタンの中心にカウントが表示されるようなやつを作りたいと思います。

<img width="56" alt="スクリーンショット 2019-04-15 11.03.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55871/1f4bddef-9129-8cc6-9203-3911ccb0d084.png">
※Fortniteより参照

# 作る

### 進捗の表示

ボタンの周りに進捗をつけるために調べた結果、 `conic-gradient` というのが使えることがわかりました。
[conic-gradient()
](https://developer.mozilla.org/ja/docs/Web/CSS/conic-gradient)

cssの関数らしく、特定の点を中心にグラデーションを表現できるようなものらしいです。

例えば、

``` conic-gradient.css
{
  width: 100px;
  height: 100px;
  border-radius: 50%;
  background: conic-gradient(red 90deg, green 90deg 180deg, yellow 180deg 270deg, blue 270deg 360deg);
}
```

こんな感じで指定すると、

<img width="122" alt="スクリーンショット 2019-04-15 11.15.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55871/48bd3476-ec03-2e81-ba44-d69d6246bd57.png">

こんな感じの円が表現できます。
なので、このcssの値をjavascriptで動的に変化させることで進捗を表現します。

```index.html
<script>
var LIMIT = 10000;
var progress = 0;
・・・
progress = progress + (360 / (LIMIT / 100));
var outerCircle = document.getElementById('outer-circle');
outerCircle.style.background = 'conic-gradient(red ' + progress + 'deg, white 0deg 360deg)';
</script>
```

javascript内で `conic-gradient` の値を動的に変化させてます。

### 残り時間の表示

円の中心に残り時間を表示させるために、カウントの処理を修正しました。

今まで `setInterval` を使ってカウントアップさせ、そのカウントを使っていましたが、
`setInterval` は、ブラウザ負荷などによって正確には指定した秒数毎に呼ばれないため、
時間を取得してそれを利用するように変更しました。

``` index.html
<script>
var LIMIT = 10000;
var INTERVAL = 100;
var button1 = document.getElementById('button1');
var sec = document.getElementById('sec');

・・・
var start = function () {
  startTime = new Date().getTime();
  if (!timer) {
    timer = setInterval(counter, INTERVAL);
  } 
}
・・・
var counter = function() {
  var now = new Date().getTime();
  var sec = document.getElementById('sec');
  sec.innerText = ((LIMIT - (now-startTime)) / 1000).toFixed(1);
  if (LIMIT < now-startTime) {
    sec.innerText = 'OK';
    clearInterval(timer);
    timer = 0;
    count = 0;
  }
}
</script>
```

# 完成

動画が貼れないので、リンクを置いておきます。
https://www.youtube.com/watch?v=nqjS81ull1k&feature=youtu.be

ソースコードは、以下にあります。
https://github.com/takuhou/smart-ui/blob/feature/circle-progress/index.html

結構ぬるぬる動きます。

今後の対応として、実は、 `conic-gradient` がchrome以外の他ブラウザでほぼ動かないので、ブラウザ対応をやります。
[Can I use](https://caniuse.com/#search=conic-gradient)

今回の記事で書いたプログラミングの様子をYoutube上にアップロードしておりますので、是非ご覧ください。
[【実況】長押しボタンをプログラミング【円ボタン対応】](https://www.youtube.com/watch?time_continue=619&v=EYjGnoTiIyg)
[えんじにぁ〜TV](https://www.youtube.com/channel/UCYCbtkuInmgpK0Hv3W2orEg?view_as=subscriber)
学習率の選択について

# 学習率

X軸：学習回数
Y軸：検証用データでの1取引当たりの平均利益

## 学習率：0.00001
![summary_20190415_130034.csv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/7d331a20-8212-9c30-1db5-b7ff397eb5a2.png)

## 学習率：0.00003
![summary_20190415_140334.csv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/77f8ffa1-0e1f-f279-4d18-6e651aa47a77.png)

## 学習率：0.0001
![summary_20190415_141512.csv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/2207e0ce-80b8-dc46-e0fc-b81f5403bf46.png)

## 学習率：0.0003
![summary_20190415_142653.csv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/88bb37c9-b3b0-e6a6-8d3f-b1257a8d4f35.png)

## 学習率：0.001
![summary_20190415_143818.csv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/89c12cc5-adbe-2655-f8af-7f0fa4f4bfdd.png)

## 学習率：0.003
![summary_20190415_144946.csv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/ada9a89b-00c8-7314-c200-5b967e0d1f6f.png)

学習率を0.003以上は同じ結果。

# predict

X軸：予測値
Y軸：利益
Z軸：予測値と利益の密度
以下の画像は、各学習率で30回学習し、
一番利益が出たイテレーションの結果。

### 運用方法
予測値が0.5以上の時、買
0.5未満の時、売

## 学習率：0.00001
イテレーション：25

![025_-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/f4d59879-0ec1-5c31-5f5d-1bbac29a9c8c.png)

## 学習率：0.00003
イテレーション：28

![028_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/b441ddd9-6c03-5cbc-9a53-eb21eb43da11.png)

## 学習率：0.0001
イテレーション：14

![014_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/effa6483-a1e6-1923-543e-f58fadf0d581.png)

## 学習率：0.0003
イテレーション：19

![019_74.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/b582d411-be80-74a3-30e0-4f7292a43bb7.png)

## 学習率：0.001
イテレーション：14

![014_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/6a2d30dd-eb1b-2df2-a200-a692fccb923d.png)

## 学習率：0.003
イテレーション：29

![029_-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240415/8b6650d4-8435-4bd1-769a-c58276b32e9c.png)
Macで公開鍵と秘密鍵を生成する方法


Macを使ってはじめて公開鍵と秘密鍵を生成したので、手順を書きます。
はじめての方は手順通りに進めれば鍵が生成できます。


# 対象者
- Macを利用している方
- はじめて秘密鍵と公開鍵を生成する方


# ①.sshディレクトリに移動

まずは、下記のコマンドを実行して鍵を入れるフォルダに移動します。

```
$cd ~/.ssh
```

もし、`/.ssh: No such file or directory` と怒られたら.sshディレクトリがないので作成してください。

次のコマンドでフォルダを作成します。

```
$mkdir ~/.ssh
```

# ②lsコマンドでこのディレクトリに何もないことを確認
lsコマンドでこのディレクトリに何もないことを確認します。

```
$ls
```
# ③鍵の生成

次に以下のコマンドで鍵を生成します。

```
$ssh-keygen -t rsa
```
実行すると以下の3つのことを聞かれます。


- 鍵ファイルを保存するフォルダの名前
- パスフレーズ
- パスフレーズ（確認用）

すべて Enterを押しても構いません。


```
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/(ここはユーザーの名前が入ります)/.ssh/id_rsa): <----- ここで鍵ファイルを保存するフォルダの名前を設定できます
Enter passphrase (empty for no passphrase): <----- パスフレーズ
Enter same passphrase again: <----- パスフレーズ（確認用）
Your identification has been saved in /Users/(ここはユーザーの名前が入ります)/.ssh/id_rsa.
Your public key has been saved in /Users/(ここはユーザーの名前が入ります)/.ssh/id_rsa.pub.
The key fingerprint is:
99:24:u0:8i:2d:34:e6:82:r5:89:41:p8:a7:58:1p:n2（ここにメールアドレスが入ります）.local
The key's randomart image is:
+---[RSA 2048]----+
|      . =+.+.    |
|     . + .+      |
|  . .   .. .     |
| o + o  o + .    |
|o . o o.SB ..+   |
|..     .+ +oo+o  |
|o .    . ..*=.o. |
|.o      . ..E+.o+|
|.           .+=o+|
+-----------------+

```

この後に下記のコマンドを入力して`~/.ssh`の中身をみてください。

```
$ls
```

すると次のような2つのファイルが作成されているのが確認できます。（先程、名前を設定していればそれが表示されます）

```
 id_rsa
 id_rsa.pub
```

`id_rsa`ファイルが秘密鍵ファイルです。
`id_rsa.pub`ファイルが公開鍵ファイルです。


生成した公開鍵の内容は次のコマンドで確認できます。

```
cat ~/.ssh/id_rsa.pub
```
direction:rtl; not(body) direction:initial

-demo https://codepen.io/gnjo/pen/wZrNaY
-左にスクロールを付ける。
-即文字方向を戻す。

```css
body{direction: rtl;}
*:not(body){direction: initial;}
body{margin:4rem auto;width:640px}

div{background-color:orange;height:200vh}
```
```html
<div>abcde</div>
```
[Unity] 複数のアセットから参照されているアセットを見つけるエディタ拡張

### 概要

Projectビューで選択中のアセットから共通して参照されているアセットを参照されている数が多い順にログに出力するスクリプト。

```cs
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;

public static class AssetUtility
{
    [MenuItem("Assets/GetCommonDependencies")]
    public static void GetCommonDependenciesInSelection()
    {
        var assetPaths = Selection.assetGUIDs.Select(guid => AssetDatabase.GUIDToAssetPath(guid)).Distinct();
        GetCommonDependencies(assetPaths);
    }

    public static void GetCommonDependencies(IEnumerable<string> assetPaths)
    {
        var dependencies = new List<string[]>();
        foreach (var assetPath in assetPaths)
        {
            dependencies.Add(AssetDatabase.GetDependencies(assetPath, true));
        }
        
        var assetPathCounts = new Dictionary<string, int>();

        foreach (var temp in dependencies)
        {
            foreach (var assetPath in temp)
            {
                int count;
                assetPathCounts.TryGetValue(assetPath, out count);
                assetPathCounts[assetPath] = count + 1;
            }
        }

        foreach (var kvp in assetPathCounts.OrderByDescending(kvp => kvp.Value))
        {
            if (kvp.Value > 1)
            {
                Debug.Log($"{kvp.Key}: {kvp.Value} references");
            }
        }
    }
}
```
Ubuntuローカル環境で教師データを作りたいからスワップ領域を50GB拡張した

最近終えたとある機械学習 (CNN, LSTM) のプロジェクトで30GBくらいの画像データをもとに教師データを作成、加工したのですが
私の社用PCはメモリ15GBだったのですぐ死んでしまっていました。
学習を回す以外にもかなりメモリ食うんですね。。
(このプロジェクトではクラウドサービスは使わず全てローカルでやってました。。)
そこで行ったことを自分の勉強用にまとめます。


## 実行環境
Linux (Ubuntu 14.06 LTS)
メモリ約15GB, もともと割り当てられていたスワップ領域 約2GB
CPU Core i7 x 8コア
ディスク容量は忘れましたが、少なくとも220GB以上はありました。

## 手順
### 50GBの”swapfile”という名のダミーファイルを作成

ディスク容量をよくご確認のうえコマンド叩いてくださいね。

```bash
$ fallocate -l 50G swapfile
```

### swapfileの権限をrootのみに変更
```bash
$ sudo chmod 600 /swapfile
```

#### (失敗: swap有効化を試みる)
いきなりswapfileがswapとして認識されるわけではない

```bash
$ sudo swapon /swapfile 
swapon: /swapfile: read swap header failed
```
### スワップ領域を割り当てる
```bash
$ sudo mkswap -f /swapfile 
Setting up swapspace version 1, size = 50 GiB (53687087104 bytes)
no label, UUID=（略）
```
### swapを有効化
エラーが出なかったから上手くいったぽい
`$ sudo swapon /swapfile`

### 実際のスワップ領域の容量を確認
```bash
$ free
              total        used        free      shared
...
```
とりあえず耐えられる程度にはなりました。

## 参考リンク
https://kazmax.zpp.jp/linux_beginner/mkswap.html
http://itengine.seesaa.net/article/441296089.html
https://yukiosugiyama.com/blog/post-2369/
https://gist.github.com/koudaiii/0ed6a8558aa297af463e
C++ Builder XE4 | 10.2 Tokyo > IDE > バージョンを知るマクロ > __CODEGEARC__(と__CODEGEARC_VERSION__) > 1632 : XE4と1840 : 10.2 Tokyo

```txt:動作環境
C++ Builder XE4
Rad Studio 10.2 Tokyo (Update 3)
```

### JSONのAPI

- [C++ Builder 10.2 Tokyo > JSON > W8111 非推奨のエンティティ '_fastcall TJSONObject::Size()' にアクセスしている (+Get()) > CountとPairs[]を使う (XE4から10.2Tokyoへの移行)](https://qiita.com/7of9/items/bada48662318be9cdcb3)

IDEのバージョンが変わると、実装も変更しないと警告が出るようになる。

### IDEのバージョン

IDEのバージョンはどうやって知るのか?
C++の場合。


- [定義済みマクロ](http://docwiki.embarcadero.com/RADStudio/Rio/ja/%E5%AE%9A%E7%BE%A9%E6%B8%88%E3%81%BF%E3%83%9E%E3%82%AF%E3%83%AD)

> `__CODEGEARC__`: バージョン番号

と

> `__CODEGEARC_VERSION__`: この内部マクロは、コンパイラのメジャー バージョン番号、マイナー バージョン番号、および内部番号をコード化した整数に展開されます。

### 実装例

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	String infmsg = __CODEGEARC__;

	ShowMessage(infmsg);
}
//---------------------------------------------------------------------------
```

### 実行例

- 1632 : XE4
- 1840 : 10.2 Tokyo

### マクロ判別の実装例 (ideone)

`__CODEGEARC__`マクロがIDEで定義されていると、それに基づきIDEのバージョンごとに実装を切替えはできる。

- https://ideone.com/wLjnzg

```cpp
    #include <iostream>
    using namespace std;
     
    #define __CODEGEARC__ (1632)
     
    int main() {
    #if __CODEGEARC__ == 1632
    	cout << "XE4" << endl;
    #endif
     
    #if __CODEGEARC__ == 1840
    	cout << "10.2 Tokyo" << endl;
    #endif
    	return 0;
    }
```

```stdout
XE4
```

### まとめ

- `__CODEGEARC__`を使うことで「XE4かそうでないか」は識別できそう
- `__CODEGEARC_VERSION__`を使うまでもないかな
- 実装切替えはできるが、「それは読みやすいコードなのか?」問題



### 参考

- [条件コンパイル](https://ja.cppreference.com/w/cpp/preprocessor/conditional) @ cppreference.com
    - `ABCD == 2`の確認、など
無料で作る集計Webページ！N予備校フォーラム名誉会員のシステムについて

<img width="582" alt="スクリーンショット 2019-04-15 16.49.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212903/59a633cf-9cd6-f044-ab76-e21debbd5c60.png">
こんにちはー！
[N予備校プログラミング入門コース](https://www.nnn.ed.nico/pages/programming/)、講師の **折原ダビデ竜** です。

[N予備校](https://www.nnn.ed.nico/)には勉強に躓（つまず）いた時などに質問を投稿することができる「[フォーラム](https://www.nnn.ed.nico/questions)」という最高すぎる機能があるのはご存知でしょうか。
ここでは日々たくさんの質問が投稿され、我々講師の方々などが返答しています。

### ですが！

これらの質問に答えることこそ、実は**すごく良い勉強**になるのです。
そして実際に回答してくださっている受講者の方もたくさんいらっしゃっいます。

### そこで！

- このフォーラムの質問に回答してくださっている受講者の方々を讃えたい！
- さらにより多くの受講者の方にも回答をしてみてもらいたい！

という気持ちが高ぶり

### そしてこの度！

**N予備校フォーラム名誉会員**（めいよかいいん） という称号が回答を多くして下さっている受講者に与えられるシステムを作成いたしました✨
https://progedu.github.io/forum-ranking/
![スクリーンショット 2019-04-15 17.19.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212903/e34ebfbf-65fb-8ddc-7681-6d2111e75e79.png)


## N予備校フォーラム名誉会員 について

N予備校のフォーラムに回答してくれている回数が多い方々を「フォーラム名誉会員」とし、
[フォーラム名誉会員のページ](https://progedu.github.io/forum-ranking/)に アカウント名・アイコン・フォーラム貢献数・コメント数 などが掲載され、**讃えられます！**

毎月更新される「月間フォーラム名誉会員」と全ての期間の「全期間フォーラム名誉会員」があり、日頃からフォーラムの質問に回答してくださっている方々に感謝の気持ちをお伝えしたく、作成いたしました。

こちらでも報告しています。
https://www.nnn.ed.nico/questions/10030

### なんと！

この集計ページは**全て無料**のサービスで作られています！

次に、どのようにしてこの [フォーラム名誉会員のページ](https://progedu.github.io/forum-ranking/) が作られているのかについても書いてみたいと思います。


## N予備校 フォーラム名誉会員のシステムについて

このフォーラム名誉会員のページは、[GitHub Pages](https://pages.github.com/) という**無料で** Webサイト を公開することができる GitHub の機能を使って**無料で**実現できています。
（GitHub Pages の使い方は [プログラミング入門コース](https://www.nnn.ed.nico/pages/programming/) で教えています。）

そして N予備校のフォーラムからデータを取得し、回答数などを集計するシステムは Node.js のプログラムで書かれ、[CircleCI](https://circleci.com/) にて毎朝４時に実行されることで毎日の集計を実現しています。
[CircleCI](https://circleci.com/) は、**無料**でもプログラムのテストを実行してくれるサービスで、集計を行うプログラムを test.js ファイルに記述し、これを定期実行してもらうことでデータの集計を実現しています。
（[CircleCI](https://circleci.com/) についても　[N予備校プログラミング入門コース](https://www.nnn.ed.nico/pages/programming/) で教えています。）

集計結果のデータですが、本来ならばデータベースを使いたかったのですが、まだそれほど大きなデータでも無いということから JSON ファイルに集計結果を書き出すようししました。

以上を図にするとこんな感じです。
![forumRankingSystem.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212903/ae6e8071-fcde-fd6f-4e10-5d4971bb63a0.png)

このようにして [GitHub](https://github.com/)（無料）、[GitHub Pages](https://pages.github.com/)（無料）、[CircleCI](https://circleci.com/)（無料）のみを使用した**無料の**集計ページを作ることができました。
みなさまの開発の参考になればと思います。

また、GitHub にソースコードも載せていますので、このシステムをより良くできるアイデアなどありましたら気軽に issue や プルリクエストを投稿してみてください。
GitHub の URL → https://github.com/progedu/forum-ranking

## 最後に

N予備校には勉強に詰まった時に質問を投稿できる「フォーラム」というシステムがあります。
質問に答えることもすごく良い勉強になりますので、困っている人がいたら助け合い、N予備校をより良い物にしていきましょう。

そして日頃からフォーラムの質問に回答してくださっている方々に感謝をお伝えしたいと思います。


以上、Quiita 初投稿でした🎉

![sugoi1_dqr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212903/fb824a6d-d4e2-3e6c-94e8-a9bfec64c518.png)
ちょいセキュアな環境で調査用にサーバログをGET

# 1. サーバに接続

```
ssh user@server_host
```

# 2. root権限でコピーしつつファイル名にタイムスタンプ付与＆所有権変更

```
sudo install -o user -g user /var/log/postgresql/postgresql.log ~/postgresql_`date "+%Y%m%d%H%M%S"`.log
```

# 3. ローカルからSCP

```
scp user@server_host:~/postgresql_*log ./
```
(メモ) CloudFormation StackSetsでIAM Policyを展開するときに、Policy記述内に展開先のアカウントIDを記載する方法

## 背景
CloudFormation StackSetsでIAM Policyを展開するとき、Policy記述内に展開先のアカウントIDを記載しないといけない場合にどうしようと一瞬考えたのでメモ。例えばResourceエレメントを使う場合はARNにリージョンやアカウントIDが入るため、展開先のアカウントごとに値が異なる。

## 解決策
単純にCloudFormationの擬似パラメータ(AWS::AccountIdとかAWS::Regionとか)を使えば良いだけだった。
これで展開先アカウント/リージョンの値に変換される。

```yaml:サンプル
AWSTemplateFormatVersion: "2010-09-09"
Resources: 
  TestPolicy:
    Type: AWS::IAM::ManagedPolicy
    Properties:
      ManagedPolicyName: TestPolicy
      Description: test policy
      Path: /
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          -
            Sid: DenyAdminRoleChange
            Effect: Deny
            Action: iam:*
            Resource: !Sub arn:aws:iam::${AWS::AccountId}:role/AdminRole
```

## 蛇足

IAM Boundaryの設定展開がきっかけでこれを考えていたが、最初に以下のようにWildcardを試してみたがうまくいかず。
特定のPermissions Boundaryを付与していないとRoleのCreateやらPolicyの付与ができないようにするステートメントのCondition句でアカウントIDをワイルドカードにした場合、適切なBoundaryを付与してもRole作成が拒否されてしまった。
これがなぜかは今の所不明。。。この書き方自体は問題ないはずだが。。。

```json:ステートメント例
<...snip...>
       {
            "Sid": "DenyCreateOrChangeRoleWithoutBoundary",
            "Effect": "Deny",
            "Action": [
                "iam:CreateRole",
                "iam:PutRolePolicy",
                "iam:DeleteRolePolicy",
                "iam:AttachRolePolicy",
                "iam:DetachRolePolicy",
                "iam:PutRolePermissionsBoundary"
            ],
            "Resource": "*",
            "Condition": {
                "StringNotEquals": {
                    "iam:PermissionsBoundary": "arn:aws:iam::*:policy/ExampleBoundaryPolicy"
                }
            }
        },
<...snip...>
```
GoでAmazon S3をKVSとして使う

# これはなに
永続化が必要なバイナリKVSとしてAmazon S3を使いたい場合があります。
セッションの取り回しや、`aws.WriteAtBuffer`やエラーがトリッキーなのでスニペットです。

2020-12追記:
S3に強い一貫性がサポートされましたね！

```golang
package s3store

import (
        "bytes"

        "github.com/aws/aws-sdk-go/aws"
        "github.com/aws/aws-sdk-go/aws/awserr"
        "github.com/aws/aws-sdk-go/aws/session"
        "github.com/aws/aws-sdk-go/service/s3"
        "github.com/aws/aws-sdk-go/service/s3/s3manager"
)

type S3Store struct {
        Bucket     string
        Uploader   *s3manager.Uploader
        Downloader *s3manager.Downloader
}

func NewS3Store(bucket, region string) (*S3Store, error) {
        s := new(S3Store)
        s.Bucket = bucket

        sess, err := session.NewSession(&aws.Config{
                Region: aws.String(region),
        })
        if err != nil {
                return nil, err
        }

        s.Uploader = s3manager.NewUploader(sess)
        s.Downloader = s3manager.NewDownloader(sess)

        return s, nil
}

func (s *S3Store) Set(key string, body []byte) (err error) {
        params := &s3manager.UploadInput{
                Bucket: aws.String(s.Bucket),
                Key:    aws.String(key),
                Body:   bytes.NewReader(body),
        }

        _, err = s.Uploader.Upload(params)
        return
}

func (s *S3Store) Get(key string) ([]byte, error) {
        buffer := aws.NewWriteAtBuffer([]byte{})

        _, err := s.Downloader.Download(buffer, &s3.GetObjectInput{
                Bucket: aws.String(s.Bucket),
                Key:    aws.String(key),
        })
        if err != nil {
                if aerr, ok := err.(awserr.Error); ok && aerr.Code() == "NoSuchKey" {
                        return nil, nil
                }
                return nil, err
        }

        return buffer.Bytes(), nil
}
```
無職3人でWebサービスを作ってみた #1 環境構築編

この度晴れて無職となった３名でWebサービスを作成したので、備忘録を兼ねてまとめていきます。
Qiita初投稿で拙いところもあると思いますが、ご容赦下さい。

Which開発にあたってのストーリーはこちら⇨ [Note](https://note.mu/unit303/n/n0d2ada773f67)

製作に約１ヶ月ほど掛かり、苦労したことも多かったです。
本章では環境構築の部分を書いていきます。
実装については[実装編](https://qiita.com/unit303/items/3b5215d36e498cee979e)をご覧下さい。

# 作ったもの

[Which](https://which303.com/)
2枚の画像からどちらかを選択するような簡単なアンケートを匿名で投稿できるエンタメサービス

![samplewhich.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398975/35b55017-0b14-d2a1-3eef-ceedac28f33d.gif)

# 使った技術

## インフラ
- VPS
  - [DreamHost](https://www.dreamhost.com/)を利用しています。
- [Firebase](https://firebase.google.com/)
  - アカウント管理・ストレージを利用しています。

## バックエンド
- Nuxt.js(express)
  - Nuxt.jsのserverMiddleWareを用いてAPIサーバとしても動かしています。

## フロントエンド
- Nuxt.js(Vue.js)
  - Web開発初心者なので、開発コストの低そうなNuxt.jsを選定しました。
  - その他色々なライブラリを使用しています。次章「実装編」にて説明します。

# 環境構築(VPS)
DreamHostを利用する上で、所々つまづいた部分を纏めていきます。

## VPS利用開始まで
- 色々と情報入力してサクッと利用開始！と思いきや…
![承認待ち通知メール](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398975/351a2593-075d-a100-ab9f-c181c7ccd831.png "mail")

なにやらアカウントが承認待ちになっている様子。
クレカの画像をアップロードする必要があるようなので、以下の手順でアップロード。

1. カードの頭と後ろ４桁を見えるように、中８桁を隠すようにしてクレカの画像を撮影
1. サポートから先ほどの画像をアップロード
  - What do you need help with?のドロップダウンから「Billing」を選択
<img width="1494" alt="スクリーンショット 2019-04-15 15.20.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398975/f6843932-2c65-6c9f-9d69-ae691dad07ea.png">

  - 連絡手段は「Submit ticket」を選択
<img width="1494" alt="kakou4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398975/8069af2f-3d77-b26c-7f58-ec157ab58854.png">

  - 画像だけアップロードしてSubmit!
<img width="1494" alt="kakou5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398975/7cb372af-15d1-2953-6a80-1085916302b5.png">

  - 後日(今回は８時間後)、以下のメールが来て、晴れて利用可能に！
<img width="1873" alt="kakou6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398975/0bdf67c3-6666-aeb7-115a-37b7095b64aa.png">

## ドメイン設定、MySQL設定
- DreamHostのGUIから簡単に設定でき、詰まることはなかったです。

## Nodeのインストール
- [公式の手順書](https://help.dreamhost.com/hc/en-us/articles/217185397-Node-js-overview)通りにnvmをインストールし、Nodeのインストールを行いました。

## ポートフォワーディング
- DreamHostのVPSはApacheかNginxのどちらか選択した方が既に動作している環境で、大元のconfigファイルから色々と設定することは無理なよう。
- 色々と調べたところ、DreamHostのGUIから設定できることが判明、以下のように設定
  - ADVANCED > Mongrel and Proxyページの下部から、飛ばしたいURLとポートを設定
  - Nuxt.jsのアプリケーションを８０００番台以降のポートで動作するように設定
<img width="1146" alt="スクリーンショット 2019-04-15 16.15.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398975/8bc00b69-b5c4-230b-3ebd-f178d7d4c2d7.png">

## 動作確認
アプリケーションが動くことが確認できたので、あとは実装のみ！ということで次章に続きます。
Windows10 Proに　Kubernetes環境を用意してその上でRancherを動かす

# tl;dr

RancherとかKubernetesとかよくわからないけど、とりあえずWindows上で試したいぜ
2019/4/15現在の作業ログ。

基本的に、[ここ](https://rancher.com/blog/2018/2018-05-18-how-to-run-rancher-2-0-on-your-desktop/)の手順に準じるが、Let's Encrpyt環境でないとコケるようなので？一部手順が違う。

## Docker for Windowsのインストール

[ここ](https://docs.docker.com/docker-for-windows/install/)をみてよしなにやってください。



## Kubernetesの有効化

Docker for Windowsがインストールしたら、おもむろにKubernetesを有効化し、
Show system containersにチェック入れておく。
![kubernete設定有効化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93812/8e2b7b68-60ea-4d4b-f086-44ae905ec9de.png)

あと、Rancherをいれるのに、それなりにスペック要するみたいなので、ちょっとリソースを増やしておく。てきとう。
![advance_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93812/da7c6e6c-1ccb-fb74-5a6f-d6aa277b0502.png)

## helmおよびtillerのインストール

インストールでhelmおよびtillerが必要なので、[こちら](https://github.com/helm/helm/)からバイナリを入手し、パスが通るところに置いておく。

## helmによる設定

PowerShellを開き、わしわしとコマンドをブチこむ。

~~~powershell
> helm init --service-account tiller --wait
> helm install stable/nginx-ingress --name ingress-nginx --namespace ingress-nginx --wait
> kubectl apply -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.7/deploy/manifests/00-crds.yaml
> kubectl create namespace cert-manager
> kubectl label namespace cert-manager certmanager.k8s.io/disable-validation=true
> helm repo add jetstack https://charts.jetstack.io
> helm repo update
> helm install --name cert-manager --namespace cert-manager --version v0.7.0 jetstack/cert-manager
> helm repo add rancher-latest https://releases.rancher.com/server-charts/latest
> helm install rancher-latest/rancher --name rancher --namespace cattle-system --set hostname=rancher.my.org --set ingress.tls.source=secret
~~~

## hostsを編集

~~~
127.0.0.1 rancher.my.org
~~~


## ブラウザでアクセスすると、Yay!

初期パスワードを求められたりした後、こんなのが見えたりする。
![rancher起動後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93812/6b813905-8676-3c07-f88e-912b1ff9e856.png)


なんだかうまくいっている。
yarn global add のインストール先を変更する


yarnを使ってた時にふとグローバルインストールの先を変更したくなったのでまとめました。

## yarnrcの編集による変更
1. .yarnrcをvimなどのエディターで開きます。
```bash
$ vi ~/.yarnrc
```
2. .yarnrcに以下のように追記することでインストール先を変更することができます。

```
prefix "　FilePath"
```

## コマンドによる変更
コマンドでも変更することができます。

```bash
$ yarn config set prefix 'FilePath'
```
or

```bash
$ yarn config set global-folder 'FilePath'
```

## 確認
```bash
$ yarn global dir
```
でグローバルパスが確認できます。
Android エミュレータ (AVD) で hosts による名前解決をさせるメモ

AVD にぱっと DNS で名前解決できない開発用とかのサーバーへの名前解決をさせるためのメモ。

まず方法としましては以下がぱっと浮かびます:

1. ローカルに Proxy サーバーを立ててそこを経由する
2. Chrome の Developer Tools の Remote Devices からポートフォワードする
3. `/etc/hosts` を設定する。

(1) ですが。まず、頻繁に変えるなら Proxy サーバーを立てて設定しておくと、変更時の反映が楽そうです。

(2) について。Chrome には Developer Tools にポートフォワード機能があり、
AVD 側の `localhost` の任意のポートを、
ホスト側からアクセスできる任意のポートにポートフォワードしてつなげることができます。

<img width="690" alt="Settings.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359439/f7b907c2-a768-581b-55ca-3600cc3875e5.png">

なので、この例では `localhost:9999` は `dev.api.org:80` につながるようになります。

ただ仮想ホストへのアクセスの場合は、
`Host` ヘッダーを自分で指定する必要があります。
(もしコードに変更を加えられるのであれば、Retrofit2 の `Interceptor` でヘッダーを指定するとかできますが、ちょっとめんどうですね)。

(3) の `/etc/hosts/` は、ホストと IP の対応を手軽に自分のマシン内で名前解決するのに便利ですね。今回はこれを使います:

## まず AVD を書き込み可能にする

```bash
${SDK_PATH}/emulator/emulator -writable-system -avd "${AVD_NAME}" &
```

`SDK_PATH` は Android SDK ホームへのパス。
mac だったら `${HOME}/Library/Android/sdk/` とかですね。

`AVD_NAME` は起動したい AVD の名前です。
スペースは `_` に置き換えます。
(例: `Pixel 2 XL API 28` → `Pixel_2_XL_API_28`)

これで AVD が書き込み可能で起動します。
(Play Store が有効だと無理っぽいです)。

## ホストの `hosts` を AVD に push する

```bash
cd ${PLATFORM_TOOLS}
./adb root
./adb remount
./adb pull /system/etc/hosts /tmp
cat /etc/hosts >> /tmp/hosts
./adb push /tmp/hosts /system/etc/hosts
```

で、今起動中の AVD に対して `adb` 経由で `hosts` を `push` します。
(`PLATFORM_TOOLS` は `${HOME}/Library/Android/sdk/platform-tools` とかです)

これで `hosts` での名前解決できるようになりました。