OmniAICreator/Qiita-1.07M huggingface dataset:
Integration 概要

#1.俯瞰図
- **Integration 分類**
 - Inbound（Salesforceはservice providerとする）
 - Outbound（外部サービスを呼び出す）
- **実現方法**
 - Salesforce API(標準&カスタム)
 - AppExchange
 - iPaaS

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/a18b0a39-ffda-24dc-d039-fee7fcd86249.png)

#2.Rest API
- RESTはRepresentational State Transferの略です。
- JSON または XML をサポートする（デフォルトはJSON です）
- 認証：OAuth 2.0またはセッションID

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/193f7c78-1920-dcd0-5308-12d7bc6e54d3.png)

#3.SOAP API
- SOAPはSimpleObject Access Protocolの略です。
- XMLのみサポート。
- 認証：OAuth 2.0またはセッションID
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/63107a93-6aba-d653-4d08-5f54d3d86754.png)

#4.どの API を使用するか?
[Salesforce Lightning プラットフォーム API の概要](https://trailhead.salesforce.com/ja/content/learn/modules/api_basics/api_basics_overview)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/7546ad8a-b225-83ed-1624-ad260799a82f.png)

#5.APEX Callout
- Apexコードから外部WebサービスとAPIを呼び出すこと。
- Calloutの２つ方法
 - Rest Callout
 - Soap Callout

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/62020cbc-f31c-f9ab-70e9-0ff37ed799ad.png)

**非同期 Apex Callout**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/50048b61-9137-f5cf-ecc7-c6063d593941.png)

**リモートサイトの設定**

リモートサイトの URL を入力します。すべての Sコントロール、カスタムボタンの JavaScript OnClick コマンド、APEX、AJAX プロキシ呼び出しが、Salesforce.com からこの Web アドレスにアクセスできるようになります。

認証の部分は、別途実装必要があります。
※ https://help.salesforce.com/articleView?id=configuring_remoteproxy.htm&type=5

**指定ログイン情報**

コールアウトエンドポイントの URL と、Salesforce がリモートシステムにコールアウトを実行するために必要な認証設定を指定します。

「指定ログイン情報」を設定すると、「リモートサイトの設定」は省略できます。
※ https://help.salesforce.com/articleView?id=named_credentials_about.htm&type=5

#6.Salesforce Connect
Salesforce Connect とは、Salesforce 組織外に保存されているデータの表示、検索、変更を可能にするフレームワークです。

次の条件を該当する場合は、Salesforce Connect を使用することをお勧めします。
- 大量のデータがあり、Salesforce 組織にコピーしたくない。
- 常に少量のデータが必要である。
- 最新データをリアルタイムでアクセスする必要がある。
- 外部システムに保存するデータは、 Salesforce 組織で表示または処理したい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/c8904db1-8107-1798-0305-f588d20eacc3.png)

**外部オブジェクト VS カスタムオブジェクト**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/94cc56ec-955b-d174-dd1e-6db57ab81d49.png)

#7.Heroku Integration
- HerokuはAWSの上に構築されたクラウドプラットフォームです。
- Heroku Connectは、SalesforceとHeroku PostgreSQLデータベース間の双方向データ同期できます。
- ポイント＆クリックでセットアップが簡単です。

[Salesforce と Heroku のインテグレーション](https://trailhead.salesforce.com/ja/content/learn/modules/salesforce_heroku_integration)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/dbd0abb8-9b7a-303a-b6b4-51c17a11540a.png)

#8.iPaaS and Integration Platform
iPaaS（ Integration platform as a service ）は、クラウドIntegrationの世界で勢いを増しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/bb8ffe62-0098-1b78-0c74-abe5a8444889.png)

**Typically, these clouds based tools offer**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/03aa6cbd-f5fe-e87d-a374-aebf1fe0e149.png)
【ns2-2.35】をUbuntu16.04にインストールする時のエラーの解決

こんにちは
これが初投稿となります．

#この記事について
ns2-2.35をクリーンなUbuntu16.04にインストールする際に起こりうるエラーについての忘備録です．
基本的にエラーメッセージを理解することができれば，この記事は必要ないでしょう．
初めてNS2やUbuntuに触れる人向けかもしれません．

＃Ubuntu 10.04でも確認しました．

#起こりうる３つのエラー
インストールコマンドを叩くと，パッケージ不足起因のエラーが２つ，コードの間違い起因のエラーが１つ起こりうる．

- パッケージ不足
    - libx11が無い
    - xorgが無い
- コードの間違い

## libx11が無い

###エラーログ

```
./ns-allinone-2.35/tk8.5.10/unix/../generic/tk.h:76:23: fatal error: X11/Xlib.h: そのようなファイルやディレクトリはありません
compilation terminated.
make: *** [tk3d.o] エラー 1
tk8.5.10 make failed! Exiting ...
For problems with Tcl/Tk see http://www.scriptics.com
```

###解決策
libx11をインストールする．
ターミナルを開き，下記コマンドを実行する．
apt-getが使えない場合は，代わりにaptを使用する．

```
$sudo apt-get install libx11-dev
```

##xorgが無い

###エラーログ

```
checking for X11 header files
can't find X includes
otcl-1.14 configuration failed! Exiting ...
Please check http://www.isi.edu/nsnam/ns/ns-problems.html
```

###解決策
xorgをインストールする．
ターミナルを開き，下記コマンドを実行する．

```
$sudo apt-get install xorg-dev
```

##コードの間違い
公式サイトで配布されているNS2のパッケージは，コードが１箇所間違ったまま配布されているため，修正する必要がある．

###エラーログ

```
linkstate/ls.cc:396:28: required from here
linkstate/ls.h:137:20: error: ‘erase’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
linkstate/ls.h:137:20: note: declarations in dependent base ‘std::map, std::allocator<std::pair > >’ are not found by unqualified lookup
linkstate/ls.h:137:20: note: use ‘this->erase’ instead
make: *** [linkstate/ls.o] エラー 1
Ns make failed!
See http://www.isi.edu/nsnam/ns/ns-problems.html for problems
```

###解決策
ソースコードの修正を行う．

ns-allinone-2.35/ns-2.35/linkstateにあるls.hをテキストエディタで開く．
137行目付近の

```error:修正前
void eraseAll() { erase(baseMap::begin(), baseMap::end()); }
```
のeraceの前に
***this->***
を挿入する．

```error:修正後
void eraseAll() { this->erase(baseMap::begin(), baseMap::end()); }
```

#最後に
使い慣れてくるとエラーメッセージの意味もすぐにわかるようになりますが，初めてインストールする時には困ったものでした．
【Memo】機械学習に必要な統計

### 用語

||意味|
|:--|--:|
|Mean|平均|
|Medium|中央値|
|Mode|最頻値|
|Population|母集団|
|Sample|母集団から一部取り出したもの|

- **IQR**(四分位範囲) = 前半Medium - 後半Medium
    - データの散らばりの程度を表す
    - Q1: 第１四分位点
    - Q2: 第2四分位点
    - Q3: 第3四分位点

- 平均

```math
\mu=\frac{\sum_{i=1}^{n}x_i}{n}
```

- 母集団分散(population variance)

```math
\sigma{^2}=\frac{\sum_{i=1}^{n}(x_i-\mu)^2)}{n}
```

- 母集団標準偏差(population standard deviation)

```math
\sigma=\sqrt{\sigma^2}
```
- 不偏分散(unbiased sample variance)

```math
s^2=\frac{\sum_{i=1}^{n}(x_i-\mu)^2)}{n-1}
```
- Sample標準偏差(sample standard deviation)

```math
s=\sqrt{s^2}
```

- 外れ値
    - < Q1 - 1.5 * IQR
    - > Q3 + 1.5 * IQR

- Zスコア
    - 平均から何個分の標準偏差を離れているのか

```math
 Z = \frac{score - \mu}{\sigma} 
```

### 正規分布

| Rage             |       　 割合 |
|:-----------------|-------------:|
|           $\pm$1σ|           64%|
|           $\pm$2σ|           95%|
|           $\pm$3σ|         99.7%|

### 相関関係 （散布図から読み取れる）、相関係数
####相関関係

- 線形関係
    - 強い正/負の線形関係
    - 弱い正/負の線形関係
- 非線形関係
- 相関関係なし

####相関係数(correlation coefficient)

- x, yに対して線をどれぐらい綺麗に引けるかを表す
- 式

```math
s_x=\frac{\sum_{i=1}^{n}(x_i-\bar{x})^2)}{n} \\
s_y=\frac{\sum_{i=1}^{n}(y_i-\bar{y})^2)}{n} \\
s_{xy}=\frac{\sum_{i=1}^{n}(x_i-\bar{x})(y_i-\bar{y})}{n} \\
r(相関係数) = \frac{s_{xy}}{s_{x}s_{y}} 　\\
```

### その他
- Numpyで**相関関係**の求め方

```
np.cov(x, y, ddof=0)[0][1]
```

### 参考 
- [codexa 統計 入門](https://student.codexa.net/contents/view/51)
- [エクセルでの正規分布の計算](http://www.ipc.shimane-u.ac.jp/food/kobayasi/normdist%20by%20excel.htm)
- [標準正規分布表](https://www.koka.ac.jp/morigiwa/sjs/standard_normal_distribution.htm)
社内ネットワーク内のNASからWindowsサーバーの定期バックアップをする

# 初投稿

ずっとQiitaはROM専だったがギョームの幅がRにとどまらなくなり、備忘録が欲しくなったのでQiita記事で記録することにした。

# やりたいこと

最近[Synlogy社のNASを立てた](https://www.synology.com/ja-jp/products/DS218+)。こいつがなかなか優秀で、linuxベースで動いてくれるので、実質サーバー立てたみたいな状況になってる。そんな最中大ボスから
>これまで手動でバックアップしてたWindowsサーバーの共有フォルダ、NASにバックアップしてくれない？

と依頼される。
やりかたは知らないけど、ま～できそうだな～と引き受けたものの、少々苦戦した。苦戦の結果、やったことは以下。

- WindowsサーバーのIPアドレスを調べる
- LinuxからWindowsサーバーをマウントする
- ファイル同期シェルスクリプトを作成し、スケジューリングする

# やりかた

## IPアドレスを調べる

Windowsだと「ネットワーク」から共有フォルダをぽちぽちすると簡単にアクセスできてしまうが、こいつのIPアドレスを調べるのに一手間必要だった。

ホームネットワークに接続されているWindowsマシンのコマンドプロンプトから

```
C:\Users\user>nbstat -a <ホスト名>
```
することでIPアドレスを調べることができた。
え？管理者に聞けって？こんなことでいちいち情報システム部門に問い合わせて変な目で見られたくないし、なによりレスポンス遅いもん。

## SMB接続をためす

Linuxから`samba-client`なるものを使う。入って無ければ事前にyumでもaptでも使ってinstalすべし。まずsynology NASのLinuxはyumどころかaptすら入っていないので自社のLinuxサーバー（計算用）を使って入ってみる。

```
smbclient '\\<IPアドレス>\..\<共有フォルダディレクトリ>' -U <host>\\<username>%<password>
```

とやると

```
Domain=[*****] OS=[SpinStream2] Server=[Windows 2000 Lan Manager]
smb: \> 
```

無事に入れた！
こんにちは。Windows 2000 Lan Managerさん。君の名はWindows 2000 Lan Managerだったんだね。

その後synology NASの方から入ってみよう！としたが、なぜかread-onlyになってしまって全くSMBできなかった。[synologyのサポート](https://www.synology.com/ja-jp/knowledgebase/DSM/help/FileStation/mountremotevolume)を読むと、一回マウントしてからrsyncするのが正攻法みたいなのでsmbでログインするのはやめた。

## DSMのUIからマウント設定する

[さっきのsynologyのサポートページ](https://www.synology.com/ja-jp/knowledgebase/DSM/help/FileStation/mountremotevolume)を見るとDSMからマウント設定できることが分かった。のでやってみたらすんなりマウントできてしまった。File Station→ツール→リモートフォルダをマウント→CIFS 共有フォルダにて、ユーザーアカウント等入力。ユーザーアカウントでは`<domain>\<username>`でドメイン指定可能。

## rsyncする

Puttyを使ってsynology NASのLinuxにssh接続する。

```
ssh <username>@10.x.x.x:/volume1
```

その後rsync

```
rsync -av //volume1/<マウントしたリモートディレクトリ>/<syncしたいフォルダ>/ //volume1/<sync先>/
```

これでコピーが始まってくれた！わーい。

## rsyncをスケジューリングする

DSMのコントロコールパネル→タスクスケジューラーではユーザー指定のコマンドをスケジューリングすることができる。毎日レベルで同期して欲しいと言われたので、差分ファイルだけ変更するような形でrsyncすることにした。rsyncの細かい使い方は[@nagaisさんの記事](https://qiita.com/nagais/items/7403411b4aa193d0fa0d)がウルトラ参考になった。

```
#!/bin/sh

rsync --checksum -av //volume1/<マウントしたリモートディレクトリ>/<syncしたいフォルダ>/ //volume1/<sync先>/
```

上の内容を書き込んだシェルスクリプトを適当な場所に放り込み、DSM側でタスクスケジュール設定。**これで完成！**

#感想

Linux初心者な上に接続プロトコルとかさっぱりで半日かかってしまった。とはいえ、SMB接続とかの接続プロトコルが結構勉強になった。でも頻繁にやるようなことでもなさそうだし、すぐ忘れると思う。
Laravelでaxiosを使ってPOSTしようとすると419エラー

## 起きていたこと
Laravelを使っていてVueのメソッド中からPOSTしようとすると419エラー(TokenMismatchException)が発生し、コントローラ中の処理を動かせませんでした。

↓のサイトなどを見つつ、
https://labor.ewigleere.net/2019/01/31/axios-session-cors/

``` hoge.blade.php
　　　・・・　略　・・・
var axiosPost = axios.create({
    xsrfHeaderName: 'X-CSRF-Token',
    withCredentials: true
})
axiosPost.post([URL], [送信データ])
　　　・・・　略　・・・
```
とかやってみたりしたのですがうまくいかず・・・。

## 対処
結局、xsrfHeaderNameには、X-CSRF-TOKENではなく、X-XSRF-TOKENを、または、xsrfCookieNameにXSRF-TOKENをセットします。
withCredentialsはどちらもtrueです。

``` hoge.blade.php
　　　・・・　略　・・・
var axiosPost = axios.create({
    xsrfHeaderName: "X-XSRF-TOKEN",
    withCredentials: true
})
axiosPost.post([URL], [送信データ])
　　　・・・　略　・・・
```

または、

``` hoge.blade.php
　　　・・・　略　・・・
var axiosPost = axios.create({
    xsrfCookieName: "XSRF-TOKEN",
    withCredentials: true
})
axiosPost.post([URL], [送信データ])
　　　・・・　略　・・・
```

LaravelのヘルプにはX-XSRF-TOKENは勝手にセットされるみたいな書き方に見えるのですが、自分の環境では上のように明示的に指定してあげないとセットされないようでした。まあ動くようになったので良いのですが、いまいちよくわかりません・・・。
Cloud9にAuthをインストールする

Cloud9にAuthをインストールする方法です。

1.pear list -a で Auth がインストールされているか確認する

`$ pear list -a`

2.ここでpear install -a Authとしてしまうとエラーになるので、先に下記コマンドを実行する。

`$ sudo yum install php56-devel`
`$ sudo pear channel-update pear.php.net`

3. Authをインストールする

`$ sudo pear install -a Auth`
Visual Studio 2019でワークロードを再表示する方法

#Caution
この記事は備忘録です。
2019/07/11現在
　
##環境
・Visual Studio 2019
（2017verも同様）
　
##ワークロード再表示方法
１．スタートのアプリ項目内、Visual Studio Installerをクリック
<img width="168" alt="スタート_アプリ_キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427246/1127a739-d1cc-075c-716c-f68ed1778eed.png">
　
２．ユーザーアカウント制御画面が表示されるので、「はい」を押下
　
３．Visual Stdio Installer画面のインストール済みタブ内「変更」を押下
<img width="582" alt="visual studio ワークロード再表示.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427246/79be42dd-819c-e6c2-affe-a14f6402324f.png">

４．ワークロード、個別のコンポーネント、言語パック、インストールの場所　画面が表示される
<img width="575" alt="ワークロード.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427246/4bf45bc0-4c91-f29e-6bb1-114f5e97dc53.png">

fin.
nncでsin

#概要

nncでsin学習してみた。

#csvをアップロードする。

nnc_uploaderでアップロードする。


#プロジェクトを作る。
sinで作る。datasetをセットする。

#モデルを作る。

in 1 out 1 relu huber

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/d309fa81-59d4-5127-d045-98842df94ca1.png)


#学習する。
300epoc 20batch adam

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/ea2a2fe7-2a03-1e90-a3bc-76c619e47cfc.png)


#nnbをダウンロードする。

result.nnb

以上。
nncでfizzbuzz

#概要

nncでfizzbuzz学習してみた。

#csvをアップロードする。

nnc_uploaderでアップロードする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5ac6e0f4-0f7c-26e4-0b76-53e62fa36013.png)


#プロジェクトを作る。

fizzbuzzで作る。datasetをセットする。

#モデルを作る。

in 7 out 4 relu huber

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/63f1cf3e-2d10-25bd-bde4-60f8bbb23d83.png)


#学習する。

200epoc 20batch adam

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c98120a7-f097-050f-4baa-255c133da852.png)

#nnbをダウンロードする。

result.nnb

以上。
OS別のライブラリ拡張子まとめ

OSごとのライブラリのタイプについてざっくりしりたいなと思って調べたのでそのメモです。
知らなくてすごく困ったことはないのですが、まいど知識があいまいなことにモヤモヤしていました。

###OS別のライブラリ拡張子
|                  |静的リンク |動的リンク|動的ロード|
|:-----------------|------------------:|:------------------:|:------------------:|
|macOS| `*.a` | `*.dylib` | `*.bundle` or `*.so` |
|Linux系| `*.a` | `*.so` | `*.so` |
|Windows| `*.lib` | `*.dll` | `*.dll` |


#### 静的リンク
コンパイル時に実行ファイルに組み込まれる。

####動的リンク
実行ファイル起動時に組み込まれる。なのでそのライブラリが見つからないと起動できない。

####動的ロード
プログラム上でそのライブラリを読み込むタイミングでロードされる。
（処理が終わったら毎度解放するのだろうか？）
なので、ライブラリがなくてもその部分が実行されるまでは動く。

####速度
静的リンク　＞　動的リンク　＞　動的ロード
そりゃそうですね。

####その他メモ
- macOSとLinux系のライブラリは拡張子が同じものもある（ `*.a`, `*.so` )が、互換性はない。
- macOSの動的ロードの拡張子、Appleとしては `*.bundle`を使ってほしいが、linuxからの移植だったりすると互換性のため`*.so`が使われることもしばしばあるという記述を見た。
　 互換性ゆうても、バイナリ自体は違うので、使用するプログラム側でOS別に読み込むライブラリ名を切り替えなくてよいとかそうゆう意味かな。
- windowsはやっぱり独自路線だなあ。
plunkerでnncのcsvを作る。

#概要

plunkerでnncのcsvを作ってみた。
fizzbuzzとsinを作ってみた。

#成果物

https://embed.plnkr.co/s3QlaRv7kDywfc3z840x/

#サンプルコード

```
var csv = "x_0,x_1,x_2,x_3,x_4,x_5,x_6,y_0,y_1,y_2,y_3\n";
for (var i = 0; i < 101; i++)
{
  var a = (i >> 6) % 2;
  var b = (i >> 5) % 2;
  var c = (i >> 4) % 2;
  var d = (i >> 3) % 2;
  var e = (i >> 2) % 2;
  var f = (i >> 1) % 2;
  var g = i % 2;
  csv += a + ", " + b + ", " + c + ", " + d + ", " + e + ", " + f + ", " + g + ", ";
  if (i % 15 == 0)
  {
      csv += "0, 0, 0, 1";
  }
  else if (i % 5 == 0)
  {
    csv += "0, 0, 1, 0";
  }
  else if (i % 3 == 0)
  {
    csv += "0, 1, 0, 0";
  }
  else
  {
    csv += "1, 0, 0, 0";
  }
  csv += "\n";
}
document.getElementById("koko").value = csv;
```

#成果物

https://embed.plnkr.co/TI3UC21ya3na8Ve0ZPUa/

#サンプルコード

```
var csv = "x_0,y_0\n";
for (var i = 0; i < 51; i++)
{
  var radian = -Math.PI + Math.PI * 2.0 * i / 50;
  csv += radian.toFixed(8);
  csv += ", ";
  csv += Math.sin(radian).toFixed(8);
  csv += "\n";
}
document.getElementById("koko").value = csv;
```

以上。
自分の成長を後押ししてくれる言葉・プログラミングしているときに大事にしている言葉　10選

## はじめに
- IT業界にいると、**「現状維持は、後退だ」** なんて言われてしまうことがあります。
- 自分の成長や進歩が必要と思い、常に「何かにチャレンジするぞ」、「いろんなことを取り入れるぞ」、と思ってはいても、思うようにいかない、もしくは、怠けたい自分もいることも確かです。

ということで、自分自身、常に頭に置いておきたい言葉を備忘としてまとめておきたいと思います。

## 自分の成長

### ①努力は義務ではない、権利である。その権利に限度はない。

> 熱意を持って目的に向かってぶつかっていくことを「努力」と言う。

という言葉もあります。成長には努力が必要だと思います。その努力の意味を思い出させてくれます。

### ②消費者ではなく、生産者(創造者)になろう。

> 批評家になるな、常に批判される側にいろ。 

という言葉も同じ意味を持っていると思います。**どんなにヘッポコなプログラムでもアプリでも、もしくは、別のなにかであっても、「使って文句を言う側」よりも、「作成して文句を言われる側」のほうが幸せなのだ！**、と思います。

### ③やるなら決めよ、決めたら迷うな。

やるぞ！と決めて何かをやり始めてから、迷うこと、ありますよね。。こんなことしてて意味あるかな？とか。もちろん間違った、と思ったらすぐに軌道修正することは重要だと思いますが、一定期間は「迷わず進む」というのが大事だと思います。

### ④やってしまったことの後悔は日々小さくなるが、やらなかったことの後悔は日々大きくなる。

> リスクをとらないことが最大のリスク

という言葉もあります。すごく有名な言葉だと思います。人生1度きりですので、とにかくやってみよう！です。


### ⑤いまの時代、必要なのは「没頭力」です。

いろいろなものがそろっている時代、自分の成長には、（他人に理解されなくても）何かに対して、おもしろいと感じ、それに没頭すること、没頭できる力が一番強いのかもしれません。そんな本もありますね。
【参考本】[没頭力 「なんかつまらない」を解決する技術 吉田尚記(Amazon)](https://www.amazon.co.jp/dp/B079Z4SLM4/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

## プログラミング関連

### ①プログラミングを極めるのは難しいが習得は簡単である

IT業界に身を置いて、何度か見かけた言葉です。習得という言葉の定義にもよりますが、これを信じて日々精進です。

### ②練習では自分が一番下手。試合では、自分が一番上手。

学生時代に部活をやっているときに、「練習しているときは、自分が一番下手だと思い、ひたむきに練習しろ。試合では、この中で俺が一番うまいと思って、自信も持っていけ」と言われ、この言葉が印象に残りました。

>**コーディングをしている時は、自分ならできる、できるに決まっている、と思え。**
>**テスト・デバッグをしてる時は、自分はヘッポコだから絶対ミスをしているはずだ、と思え。**

この言葉もどこかで出会いましたが、この2重人格はとても大事だと思っています。


### ③バグがあっても、人は死にません

「これから書くプログラムが動かなくても（バグがあっても）飛行機は落ちません」新人のときにプログラミング言語の基礎学習をはじめるにあたり、一番最初に先輩が言っていた言葉で、いい感じに肩の力が抜けたのを覚えています。もちろん、社会インフラのプログラムを書いているような方々には、当てはまらないとは思いますが、自分には言い聞かせています。


### ④（良い意味でも悪い意味でも）プログラムは書かれたとおりにしか動かない

これも、何度か見かけた言葉です。何回見直してもコードに間違いがない、でも意図どおりに動かない。ということはプログラムを書いたことがあるすべての人が経験していることだと思います。そのときは、この言葉を思い出し粘り強く。。

### ⑤美はシンプルさに宿る

> メイヤーの法則
>「事態を複雑にするのは単純な仕事だが、単純にするのは複雑な作業である」という法則。削ぎ落とす、というのは実に難しい。1を100にするのは難しくないけど、100を1にして洗練させるのは至難の技。

という法則もあります。これはプログラムに関してだけではないとは思います。何事も複雑にすることは簡単でも、シンプルにすることは難しい。難しいので、美を追求していく姿勢が大切なのだと思います。

## まとめ
- これまで出会ってきた言葉の中で、特に大事にしていることをセレクトしました。どこで出会ったか覚えていないのもあり、出典は明記しておりません。ご了承下さい。
- 自分自身に言い聞かせるという意味でまとめましたが、何かヒントになることがあれば幸いです。

## 参考URL
- [技術系の名言まとめ++(Qiita)](https://qiita.com/kkyouhei/items/38ba41fb6b877f160e99)
Cloud9にIAMユーザーで作成した環境に 管理者ユーザーを招待する

IAMユーザーで作成した環境にrootユーザーを招待する方法です。

1.環境の右上にあるShareボタンをクリック
![2019-07-12_12h23_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12035/8feff10e-b986-f7a4-608c-e87fce6f843c.png)

2.Invite Membersのボックスに下記のように入力する
`arn:aws:iam::123456789012:root`
※123456789012はAWSアカウントIDに置き換えてください
![2019-07-12_12h24_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12035/e92d74df-895e-704a-6e5d-4cfa2ca676e1.png)

3.Inviteボタンをクリックする
Rails6 のちょい足しな新機能を試す52（ActiveStorage::Blob#key編）

# はじめに

Rails 6 に追加されそうな新機能を試す第52段。 今回は、 `ActiveStorage::Blob#key` 編です。
Rails 6 では、`ActiveStorage::Blob#key` に英大文字が含まれないようになりました。
ファイル名の大文字と小文字を区別しないファイルシステムを持つOSの場合に意図せずファイルを上書きしてしまうリスクがあったため、小文字のみになりました。

Ruby 2.6.3, Rails 6.0.0.rc1, Rails 5.2.3 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。

```shell
$ rails --version
Rails 6.0.0.rc1
```

# 準備

今回は、 [Rails6 のちょい足しな新機能を試す15（Active Storage編）](https://qiita.com/suketa/items/2daad87d8c22737f5582) を元にして作業を進めます。

# show ページを修正する

show ページで、 `ActiveStorage::Blob#key` を表示します。また key の長さも表示します。

```erb:app/views/users/show.html.erb
...
  <strong>Avatar:</strong>
  <% if @user.avatar.attached? %>
    <%= image_tag @user.avatar %>
    <p>
      ActiveStorage::Blob#key: <%= @user.avatar.blob.key %>
      (length: <%= @user.avatar.blob.key.length %>)
    </p>
  <% end %>
  ...
```

# ユーザー登録して確認する

ブラウザからユーザーを登録します。
登録後、詳細画面 (show) のページには、以下のように `ActiveStorage::Blob#key` の値が表示されます。
英大文字は1つも使われていません。

> ActiveStorage::Blob#key: 98rskgwoz3q9awb8wdahgjq7yit9 (length: 28)

また、 `storage` ディレクトリを確認するとファイルも key の値と同じであることがわかります。
(動作確認は、Alpine Linux v3.9 を使っています。)

```shell
$ find storage -type f
storage/.keep
storage/98/rs/98rskgwoz3q9awb8wdahgjq7yit9
```

# Rails 5 では

Rails 5 では、英大文字と英小文字が混ざってます。key の長さは24文字になっていて、Rails 6 より4文字短いことがわかります。

> ActiveStorage::Blob#key: oEoWaNiyeUpLCg3deVEwrT6P (length: 24)

`storage` ディレクトリのファイルも大文字小文字が混ざってます。

```shell
$ find storage -type f
storage/.keep
storage/oE/oW/oEoWaNiyeUpLCg3deVEwrT6P
```

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try052_active_storage_blob_keys


# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Make ActiveStorage::Blob keys lowercase](https://github.com/rails/rails/pull/34818)
Windows スクリーンセーバー起動の回避スクリプト

Windows スクリーンセーバーが強制的に設定されてしまう環境で、回避対策を考えて、手軽に利用できるvbsスクリプトを作ってみました。

１．メモ帳を開き、下記ソースを貼り付けます。

```vb:nosleep.vbs
Option Explicit
dim i, WshShell
set WshShell = WScript.CreateObject("WScript.Shell")
i = 0
do
    i = i + 1
    WshShell.SendKeys "^"                    ' Ctrl key
    WScript.Sleep 60*1000                    ' 60s
    WScript.StdOut.Write "."
    if i mod 60 = 0 then WScript.Echo Now    ' 60m
loop while i < 12 * 60                       ' 12h
```

２．「nosleep.vbs」としてどこかに保存します。

３．デスクトップにショートカットを作成し、リンク先に書きコマンドを貼り付けて、保存します。

```cfc
cscript.exe <２の保存場所>\nosleep.vbs
```

###タスクバーから姿を隠す

上記スクリプトを実行すると、タスクバーに表示されてしまいます。
これを気になったら、スクリプトをもう一個作成します。

４．メモ帳を開き、下記ソースを貼り付けます。

```vb:hiderun.vbs
Option Explicit
Const vbHide = 0
Dim objWShell, strCmd, i
strCmd = "cmd /c"
for i = 0 to WScript.Arguments.Length - 1
    strCmd = strCmd & " " & WScript.Arguments.Item(i) & ""
next
Set objWShell = CreateObject("WScript.Shell")
WScript.Echo strCmd
objWShell.Run strCmd, vbHide, False
Set objWShell = Nothing
```

５．「hiderun.vbs」としてどこかに保存します。

６．デスクトップにショートカットを作成し、リンク先に書きコマンドを貼り付けて、保存します。

```cfc
cscript.exe <５の保存場所>\hiderun.vbs cscript <２の保存場所>\nosleep.vbs
```

(^-^)
Sublime Text で特定ファイルやディレクトリを除外して Grep 検索する

Sublime Text で特定ファイルやディレクトリを除外して Grep 検索する時の書き方です。

---
Grep 検索画面を表示させる。

```
Command キー（⌘） + Shift キー（⇧） + F
```

Find : に、検索したい文字列を入力
Where :に、検索したいディレクトリを入力

---

例 1）
「書類」の「src」ディレクトリ内の文字列、「container」を検索

Find : 

```
container
```
Where :

```
/Users/user-name/Documents/src/
```

---

例 2）

「書類」の「src」ディレクトリ内で、「sass」ディレクトリ以外の文字列、「container」を検索

Find : 

```
container
```
Where :

```
/Users/user-name/Documents/src/, -*/sass/*
```

---

例 3）
「書類」の「src」ディレクトリ内で、「sass」ディレクトリ以外で、全ての「.css」ファイル以外からの文字列「container」を検索

Find : 

```
container
```
Where :

```
/Users/user-name/Documents/src/, -*/sass/*, -*.css
```

---

さらに条件を付け加えたい場合は「,」区切りで追記する。
Gridsomeのコンポーネントでpage-queryを使うとエラーが出る

Jamstack界隈でお熱くなってきているGridsomeやってます。
初めはNuxt.jsに挑戦していたのですが、WordPressで言う所のカスタムポストタイプの様なものを作るのが面倒臭かったので、Gridsomeに鞍替えしてきました。
というわけで、早速今日嵌ったお題。
### コンポーネントでpage-queryを使うとエラーが出る
こんなコードをコンポーネント下で動かそうとしていましたが、エラーで止まってしまいます。

```html
<template>
  <div>
    <template v-for="({ node },index) in $page.allPropertyRecord.edges">
      {{ index }} {{ node.page_title }}
    </template>
  </div>
</template>

<page-query>
  query Properties ($page: Int) {
    allPropertyRecord (perPage: 5, page: $page) @paginate {
      pageInfo {
        totalPages
        currentPage
      }
      edges {
        node {
          page_title
          description
        }
      }
    }
  }
</page-query>
```

エラーのメッセージはこんな感じ。

```
vue.runtime.esm.js?2b0e:619 [Vue warn]: Error in render: "TypeError: Cannot read property 'allPropertyRecord' of null"
```

他のサイトで同じ様な事をやっても、無事動くのになんなんだろう。[ここ](https://gridsome.org/docs/querying-data/)をよく読んでみると、

* PagesとTemplatesは\<page-query>を使いましょう。
* Components内では\<static-query>を使いましょう。

早速手直しして、pageをそのままstaticに置き換えしたらすんなりと動いてくれました。

```html
<template>
  <div>
    <template v-for="({ node },index) in $static.allPropertyRecord.edges">
      {{ index }} {{ node.page_title }}
    </template>
  </div>
</template>

<static-query>
  query Properties ($static: Int) {
    allPropertyRecord (perPage: 5, page: $static) @paginate {
      pageInfo {
        totalPages
        currentPage
      }
      edges {
        node {
          page_title
          description
        }
      }
    }
  }
</static-query>
```

これで1日潰れた。かと言って、他に何やっていたのかと考えると、大してロクな事をしていなかっただろうから、これでよかったのかもしれない。
DEMデータの解像度を上げる裏技

DEMデータの解像度が粗い場合に、QGISを使って無理やり解像度を上げる方法を紹介します。当然ですが、精度が上がるわけではないのであくまでも「裏技」です。

10mメッシュのDEMを縮尺2000分1ぐらいで表示するとこんな感じにメッシュがはっきり見えてしまいます。画像ならジャギーが出てい状態です。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/ad5fe0fc-4d3c-93e9-1e08-394ff3a15220.png)

## サンプリング用のベクタポイントを作成する
ベクタ→調査ツール→規則的な点群
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/b852b011-21ec-5054-02f4-9bff6814afc0.png)


- 入力範囲　→　ベクタポイントを作成する領域を指定
- ポイント数/間隔　→　領域の広さによりますが、10（m）にしておくのが無難です。
- 「ポイント間隔を使う」　→　チェック
- 実行をクリック
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/40c775d5-dc50-2776-47da-08050bd7726c.png)

作成するポイントの数が多いとかなり時間がかかります。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/4e80ba26-441f-bc5c-65f8-5da1362df7c6.png)

指定領域に10m間隔のベクタポイントが作成されました。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/0815d394-2f02-15dd-2d45-4526c8b25717.png)

## ポイントサンプリングツールで標高値を付値する
ポイントサンプリングツールプラグインがインストールされていない場合は、プラグイン→プラグインの管理とインストールからインストールしてください。

プラグイン　→　Analyses　→　Point Sampling Tool
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/c21d9dd9-5841-fab3-d5b3-6449f94ff00f.png)

- Layer containing sampling point　→　ベクタポイント
- Layer with fields/bands to get values from　→　DEM
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/0a603b60-3f5e-fe7b-b702-efdc2ec984a8.png)

ベクタポイントにDEMカラムが新設されて標高値が付値されます。
![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/46df2e00-567b-a982-1974-ce4ec70f1260.png)

## プロセッシングツールのヒートマップを使う
プロセッシング→ツールボックス
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/03dce043-eb3a-7ece-69a4-3877e4937cf2.png)

ヒートマップ（カーネル密度推定）
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/5bb0951f-92d6-6b1c-91b0-b8d90b40d23d.png)

- ポイントレイヤ　→　標高値を付値したベクタポイントを指定
- 半径　→　大きい方が滑らか。30mぐらいを指定
- ピクセルサイズ　→　メッシュサイズ。画像では0.1mメッシュ
- Weight from field　→　DEMカラムを指定
- Karnel shape　→　Triweight
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/6f0c414d-b108-0918-4a42-b3333470cb94.png)

## こんなのができます
緑色のところが0.1mメッシュのDEMデータです。
周囲のグレー部分が元の10mメッシュ。
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/51eb51ad-4fbf-545f-1d39-a960620f50ea.png)

## まとめ
おわかりのように、新たに作成したDEMデータは単なる劣化コピーなので地図データとしては何の意味もありません。ここで紹介した手法は画像処理の一種と考えていただければ良いと思います。この手法で作成したデータを流通させることは厳に慎むべきといえます。
screenresolution で Macbook Retina の解像度を調整して負荷を下げる

(2019/8/21追記 運用してみましたが結局負荷に関しては大した効果はなかったです。)

# tl;dr

- 古い MacBook Retina の解像度を標準以外にすると描画負荷が上がってそう（パフォーマンスが下がる）
- 普段は画面を広く使いたいので、普段は `screenresolution` で等倍、Retina 表示にしたい場合は手動で切り替えるようにした
- 今のところブラウザのスクロールなどのもっさり感が軽減した（気がする）

# 本文

## MacBook Retina の挙動がもっさりしてる

手持ちの MacBook 15-inch Retina 2012 の挙動がなんだかもっさりしてる
CPUやメモリのスペックがそこまで低いわけではないので、Retina解像度が影響してるんじゃないかと思い調査したら以下のような記事を見つけた

iMac 5KのRetinaディスプレイの快適な使い方を考える
https://blog.hisway306.jp/entry/2015/05/14/233000

> で、疑似解像度が下がれば下がるほど結果は良くなるかと思えば、標準の2560 x 1440ピクセルが一番良いという結果になりました。これが本当だとすれば、チューニングの問題なのか、スケーリング比率の問題なのか分かりませんが、パフォーマンスという点では標準解像度が一番良いということになります。

実際に標準解像度で試してみることにした

## screenresolution

(参考) MacBookPro Retinaの画面の表示解像度を2880x1800で使用する
https://blog.monophile.net/posts/20171117_mac_screen_resolution.html

```bash
$ brew install screenresolution

$ screenresolution list
2017-11-06 21:39:31.127 screenresolution[60103:1500111] starting screenresolution argv=screenresolution list
Available Modes on Display 0
  2880x1800x32@0       	1440x900x32@0        	2560x1600x32@0
  2048x1280x32@0       	1024x768x32@0        	800x600x32@0
  640x480x32@0         	1680x1050x32@0       	1280x800x32@0

$ screenresolution set 2560x1600x32@0
2017-11-06 21:44:26.646 screenresolution[60555:1507546] starting screenresolution argv=screenresolution set 2560x1600x32@0 skip skip skip
2017-11-06 21:44:26.650 screenresolution[60555:1507546] set mode on display 0 to 2560x1600x32@0
```

これで標準解像度になった

## 使用感

- 標準解像度にしてから、キーボードの入力とかウィンドウを動かしたりブラウザをスクロールしたりといった動作にもっさりを感じることが少なくなった（気がする）
- 文字とかはとても小さくなってしまったけど、ブラウザはデフォルトで問題なさそう
- ターミナルやエディタはフォントサイズを 14px 〜 16px にすることで対応

<br>

しばらくこれで様子を見てみます
Railsのerbのeach内でVueのComponentを使いたい

## やりたいこと

記事の一覧を表示させて、各記事ごとにいいねボタンのVueComponentを設置したい

## 最初考えた方法
```erb:top.html.erb
<% @articles.each do |article| %>
  <h1><%= article.title %></h1>
  <p><%= article.description[1, 80] %></p>

  <!-- 記事の個数分のVueインスタンスを作成しなくてはいけないじゃまいか... -->
  <like-button-component></like-button-component>
<% end %>
```

## こんな感じでかきました

```erb:top.html.erb
<!-- eachの外側をdivでくくって全体をVueインスタンスにした -->
<div id="articles-wrapper"> <!-- ←追加 -->
  <% @articles.each do |article| %>
    <h1><%= article.title %></h1>
    <p><%= article.description[1, 80] %></p>

    <!-- いいねボタンのcomponent -->
    <like-button-component></like-button-component>
  <% end %>
</div> <!-- ←追加 -->

<script src="js/main.js"></script>
```

```js:main.js
import SocialButtons from './components/SocialButtons.vue';
import Vue from 'vue';

new Vue({
  el: '#articles-wrapper',
  components: { SocialButtons },
});
```



## さいごに

今回SEOの観点から記事の内容などのメインコンテンツはサーバーからhtmlの状態で返したいとの要望がありこのような方法をとりました。こんな感じでVueのテンプレート部分を記述されたHTMLそのまま使うこともできるのが勉強になりました！
【PostgreSQL】PostgreSQLのメモリについて勉強していろいろわかったこと

# はじめに
PostgreSQLのメモリについて調べたときのメモです。

# 内容
## PostgreSQLのメモリについてあまり知らない・・・
大別すると、PostgreSQLで使用するメモリは「共有メモリ」「バックエンドプロセスで確保されるプロセスメモリ」の二つらしい。

主に以下のページを参考にしました。
**とても勉強になるのでぜひ！**
- http://www.nminoru.jp/~nminoru/postgresql/pg-table-and-block-structure.html#block-and-page
- https://gihyo.jp/dev/feature/01/dex_postgresql/0002?page=2
- https://qiita.com/Brutus/items/972dcfb0abc3ef561ba0


### 共有バッファ(shared_buffers)
※厳密には、共有バッファメモリは4つに分かれているらしく詳しくは以下
https://gihyo.jp/dev/feature/01/dex_postgresql/0002?page=2


- 共有バッファ派、テーブルやインデックスのデータをページ単位でキャッシュ
- PostgreSQL インスタンス(=※データベースクラスタ)毎に確保されるバッファで、postgresql.conf の中の shared_buffers オプションでそのサイズが指定される
- 共有バッファは，shared_buffersの項目で値を設定でき、デフォルト値は32MB
- 共有メモリバッファを介してデータを読み取ることによってディスクに直接アクセスする回数を減らして読み取り性能を向上させることができる
→データアクセス時にデータベースファイルをページ単位でメモリ上に展開しているから
- 共有バッファが大きければええやんって感じるが、メモリ領域を圧迫して、※ディスクスワップの発生によって性能を低下させる
- 目安としてメモリを1GB以上搭載したサーバの場合、搭載メモリ量の25％程度を設定するのが推奨
→　「見積りサイズ = サーバのメモリ容量 * 25 / 100」



### プロセスメモリの作業メモリ(work_mem)
※厳密には、プロセスメモリは3つに分かれているらしく詳しくは以下
https://gihyo.jp/dev/feature/01/dex_postgresql/0002?page=2

- 作業メモリは，クエリの実行時にソートやハッシュテーブルの利用のために使われる領域
- サービス開始当初はwork_memの値が小さくても取り扱うデータも小さいため問題にならなかったものが，サービスの成長とともに取り扱うデータサイズが大きくなり，ソートの際にメモリからあふれることがある
→このようなことを防ぐため，work_memの値は適切にチューニングする必要がありますし，スワップを監視する必要がある
→「(OSの実メモリ - shared_buffers) / max_connections」を超えないように設定する。
- work_memはクライアント同時接続数に比例し、さらにその数倍の物理メモリを消費
→ よって、メモリ不足からスワップが発生しかえって性能が悪くなるため、注意が必要


### 参考
・http://www.nminoru.jp/~nminoru/postgresql/pg-table-and-block-structure.html#block-and-page
・https://qiita.com/Brutus/items/972dcfb0abc3ef561ba0


## 以下用語知らなかったものを書きます。
恥ずかしいですが、上記の文章を読んでいて自分が知らなかったワードを列挙します。

### データベース・クラスタって？
#### 内容
データベース構築の基本は、1つのサーバーに1つのデータベースを構築し、運用すること。
しかし、1つのデータベースを複数のサーバー（仮想サーバーを含む）にまたがって構築するケースが増えてきた。
理由として、1つのサーバーだけでは実現がむずかしい「高可用性・並列処理・性能向上」があるから。性能向上だけ想像しにくいと思うので、以下。

<性能向上について>
データベースのユーザー数が膨大になることは、Web系のアプリケーションではよく見られます。大規模なWebアプリケーションの場合、1つのデータベースのコピーを作り、データベースの参照はこのコピーに対して行うようにすることで、ユーザー数の増大にも対応できるようになります。

ただし、データベース・クラスタに似たものとして、複数の異なるデータベース同士を連携させたシステムがあり、「DBLink」や「SQL/MED」との混同に注意する。

#### 参考
https://thinkit.co.jp/story/2010/10/05/1784


### ディスクスワップって？

**「ディスクにスワップしていくんだろ。」程度の認識でもっと深く説明してくださいと言われたら、完全にアウトだったので調べました。**

#### 内容
コンピューターの処理はメモリ上で行われるが、対象のデータが大きい場合は、当面使用する予定の無い部分をHDDに退避し、空いた空間に必要なデータを配置して続行される。このメモリとHDDでファイルを交換することを、ディスクスワップとか単にスワップと言う。

#### 参考
https://121ware.com/support/pc/yougo/07_t_g/t_g71.htm



## 所感
スワップが発生しだしたら、メモリぶち上げるだけじゃなく、work_mem値やshared_buffers値を見直してみるのも手ですね。
あと、インデックステーブルを再生成するとか。（以下）

```
CREATE INDEX CONCURRENTLY new_idx ON table1(col1, col2, col3);
```
メモ: UiPath Studio Community Edition を起動してみた

## 準備

* https://www.uipath.com/ja/developers/community-edition-download

にアクセスし、名前とメールアドレスを入力し続行。

ダウンロード

![スクリーンショット_2019-07-12_11-39-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/fdb13788-fca2-893a-01c9-7eb681b8b03e.png)

### セットアップ

`UiPathStudioSetup.exe` を実行

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/85f6ac31-9ab3-6bfd-e084-250d70c53645.png)

何も入力は求められない。
4分くらい待つと、以下画面にかわる。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/534cae8c-5da7-0ce2-5a0a-cc177011a5a5.png)

### 起動

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/811174b4-d2f5-4c75-94df-2aa4e21f4e48.png)

一番上の「Community Editionのアクティベーション」をクリック。
メールアドレスを入力し、「自動」を選択し続行

![スクリーンショット_2019-07-12_11-45-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/81140497-cd12-db10-9453-8f34d5022657.png)

プロセスをクリック

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/996946e8-862c-1fc4-c14a-5ace96d860b8.png)

作成。3分くらいまつ。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/886a494c-5e96-ce2a-2f4f-553f0af1ca44.png)


![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/383a3865-30c2-38d4-6a96-e07d8fe2a30d.png)

### UiPath Studio の画面

* 動作が重いので、遅いマシンでは覚悟。

![スクリーンショット_2019-07-12_11-52-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/ef6f04a4-6f9f-f0c7-da2b-cbfede5050d2.png)
【React+TypeScript】Function Componentで省略可能propsの省略した場合の値を型安全に指定する

https://github.com/microsoft/TypeScript/issues/27425#issuecomment-478004521

こんな問題がありますが、結論としては、回避策として「名前のついた型を指定しない」のが楽です。

リンク先から引用。

```javascript
const MyComponent = (props: { name: string, telephone: string }) => {
  ...
}

MyComponent.defaultProps = { telephone: "222-333-4444" }

// Works - good
const test = <MyComponent name="Hulk Hogan" />

// Doesn't work - missing name, good
const test = <MyComponent />
```
python IDLE 使ってみた （簡易IDE）

前の投稿のコメントでIDLEってのがあるよと教えてもらったのでさっそく使ってみました。
@shiracamus さんありがとうございます。

# IDLE起動

Windows10のイメージですが、pythonをインストールすると既に存在しますのでWindowsメニューから起動できます。
![idle_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/6aca59a2-80fd-22f4-5354-a87a09a5246e.png)

起動するとREPLのウィンドウが表示されます。
![idle_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/ff421770-5840-8edf-3923-73767a590ebc.png)

もちろんインタラクティブモードを楽しんでくれてもOKです。
![idle_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/36c548a3-d7ac-106e-f5e8-aaeab7d7fb90.png)

# 簡易IDE使ってみる

### ファイル編集

ウィンドウのメニューからFileを作成したりFileを開いたりすると簡易IDEみたいなのが起動します。（別ウィンドウ）
![idle_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/83379a04-c834-1bfa-1bfb-3f048152fa1e.png)

File -> New Fileしたときのイメージ
![idle_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/a73386dd-0a6b-dfd6-1437-576953aa12b6.png)

関数の説明も出てきてなかなか親切です。
![idle_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/63f385f1-0e49-ae8d-5d89-c21d64858efc.png)

試しに日本語と韓国語と中国語（簡体字）を出力してみます。
![idle_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/fc52fe1d-f906-80c1-30b6-b87d6c01e61b.png)

pyファイルとして保存
![idle_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/f760be55-dced-1f13-da10-49434c7cf3ad.png)

### 実行

実行は「F5」かメニューからRun -> Run Module
![idle_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/76377cb1-d319-1a42-4d65-38b6aada6c0d.png)

実行結果
![idle_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/382de2ab-1d20-62a5-e010-c3b1f74e9824.png)

### コード補完

ドットを入力すると関数の一覧も出てきます。（ちょびっと時間かかるけど）
![idle_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/8d911a4a-e4a9-2d8d-99c3-09fa09ac78a0.png)

お試しにこれも実行
![idle_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/c3110603-6054-cbc3-4cdb-da7e1979406b.png)

実行結果
![idle_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/e436b984-a1d8-de27-9266-6b9fb3d0cf53.png)

# 感想

関数の説明やコード補完として関数一覧が出るのはありがたいですね。
公式ドキュメントによると学習用とのことでデバッグ機能とかはまだ実験的のようですが、
学習の上では十分に使えると思います。
デバッグはprintで頑張ればいいし。
apipie-rails で multipart/form-data を扱う

4年ほど乗っている5万円のクロスバイクのオーバーホールに本体代くらいの費用がかかりそうなのでいっそロードバイクに買い換えようか悩んでいるstreampackチームのminsuです。

## やりたいこと
rails APIへ次のようなformを送ったときに、
apipie-railsのcustom validatorを設定してformのfileタイプをパラメーターとして扱えるようにします。

```html:
<form method="post" action="xxxx" enctype="multipart/form-data">
  <p>画像ファイル<input type="file" name="imagefile" accept="image/*"></p>
  <p><input type="submit" value="送信する"></p>
</form>
```


apipie-railsgem
https://github.com/Apipie/apipie-rails

apipie-railsは、railsの REST API向けのドキュメント生成のためのツールで、
次のようにアクションごとにエラーコードやパラメーターがドキュメント表示できます。
![ss1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399734/b79932f7-bcc6-669b-8ed4-07d5588d09c1.png)

## バリデーター
コードを記載するとドキュメント側に反映されるとともに、
apipie-railsがリクエストパラメータをチェックしてドキュメントで指定した以外のフォーマットの場合にバリデーションエラーを返すという機能が付いています。
バリデーターは型の指定や配列、ハッシュなどapipie側で使いやすいものがすでに用意されているのですが、formのfileタイプに対応できるバリデーターはありません。

## カスタムバリデーター
しかし、apipieでは独自にバリデーターを設定することができるのでformのfileタイプを扱えるカスタムバリデーターを実装していきましょう。
https://github.com/Apipie/apipie-rails#adding-custom-validator

カスタムバリデーターは initializars で設定できるため、
config/initializars/apipie_validators.rb を作成して次のclassを設定します。

```ruby:apipie_validators.rb
class UploadedFileValidator < Apipie::Validator::BaseValidator

  def validate(value)
    value.is_a?(ActionDispatch::Http::UploadedFile)
  end

  def self.build(param_description, argument, options, block)
    self.new param_description if argument == :uploadedfile
  end

  def description
    'Must be a valid file'
  end

end
```
そしてapipieでパラメーターの記述で、さっきカスタムバリデーターで設定した :uploadedfile を指定してあげるとバリデーションチェックで ActionDispatch::Http::UploadedFile クラスなのかをチェックしてくれるようになります。

```ruby:
   param :imagefile, :uploadedfile, :required => true ,:desc => "Need to set a new user image file in form-data"
```
これでapipie-railsでformのfileタイプが扱えるようになりました。

## おまけ
カスタムバリデーターを作らなくても次のようにパラメーターに直接 ActionDispatch::Http::UploadedFile クラスを指定することでも同じようなことができるのですが

```ruby:
   param :imagefile, ActionDispatch::Http::UploadedFile, :required => true ,:desc => "Need to set a new user image file in form-data"
```

ドキュメントの記述がこのように

![ss2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399734/2cf191b5-610b-1db1-df1e-4cf14625b0b9.png)

`Must be a ActionDispatch::Http::UploadedFile`となるので、ドキュメントを読む側がなんのこっちゃになりそうです。
UbuntuのEmacs上でラズパイの開発ができるようにした


ラズパイはネットワーク環境とセルフコンパイル環境があるので、gitかなんかでファイル共有して、キーボード繋いでmakeすればいいじゃんと思ってました。この前、開発チームの同僚に話を聞いてみるとクロスコンパイルしてますと言われて、せっかくなので僕もクロスコンパイル+Emacsで閉じる環境を作ってみました。

ラズパイはRaspberry Pi 3 Model B+、ホスト環境はUbuntu VERSION="18.04.2 LTS (Bionic Beaver)"です。

# クロスコンパイル環境の作成
こちらの記事をそのまま実行すれば開発環境ができます。

[!x86_64のUbuntuでC/C++のソースコードをARM/ARM64用にクロスコンパイルしてQEMUで実行する方法のまとめ](https://qiita.com/tetsu_koba/items/9bdcb59f912efbff3128)

Ubuntu上でapt install一発です。
```
sudo apt install g++-arm-linux-gnueabihf
```
  
記事のとおりに作業をして hello_arm (ARM用バイナリファイル）を作りました。
ホスト環境でmakeflieを作っておけば、EmacsからM-x compileでコンパイルできます。

# ラズパイの設定
sshで入れるようにして、新しいユーザーを作ります。
ターミナルからsshコマンドでログインできることを確認してください。

# Emacsの設定
## trampで入れるようにする。
init.elにラズパイのipアドレスとユーザー名、開始ディレクトリを指定してssh接続をする関数を書きます。

```lisp
(defun raspi ()
  (interactive)
  (find-file "/ssh:natu@192.168.1.5:/home/natu"))
```
これで、M-x raspiでsshログインできます。

## diredでファイルを転送する。
diredのコピー先を、もう一つ開いているdiredのディレクトリに設定します。これもinit.elに書いておきましょう。

```lisp
(setq dired-dwim-target t)
```

<img width="570" alt="dired.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327/03e7a8c3-a08d-bd3d-1f49-696a64cf0e21.png">

これで、ssh接続したローカルと、ホストの両方をdiredで開き、ホスト側で上で作ったhello_arm（ARM用実行バイナリ）を選んでCを押すと、ファイルがラズパイに転送されます。

## eshellでファイルを実行する
これ、知らない人多いんですけど、trampでsshし接続先のディレクトリを開いた状態でeshell実行すると、接続先のシェルとして実行できます。仕組みはよく分かっていません。

<img width="258" alt="eshell.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327/7c77fd17-a767-6152-bc3d-f91a796b3dd3.png">
eshellからラズパイ上の実行ファイルを実行しています。

# 最後に
UbuntuのEmacs上でコーディング、コンパイル、ファイル転送、ラズパイ上での実行まで行えるようになりました。やりました。
Text::CSVでCSVファイルをハッシュリファレンスとして読み込む

メモというかスニペットとして。こんな感じかな。

* `$csv->getline($in)`で1行目を読み込む。
* 読み込んだ1行目をカラムラベル行とみなして、`$csv->column_names(@$columns);`でセットする。
* `$csv->getline_hr_all($in, 1);`で引数指定した`1`行飛ばして2行目以降をハッシュリファレンスとして読み込む。

ログ出力には`Log::Minimal`の`debugf()`と`warnf()`を使用。

~~~
use 5.006;
use strict;
use warnings;
use utf8;
use Encode::Locale;
use Encode;

use Text::CSV_XS;
use Log::Minimal;
local $Log::Minimal::AUTODUMP = 1;

my $file = 'mydata.csv';
my @rows = &read_csv($file);

sub read_csv {
	my $file = shift;
	die "incorrect file specified: '$file'" unless (defined($file) && $file =~ /\S/ && -f $file);

	my $csv = Text::CSV_XS->new ({ binary => 1 });
	debugf("reading '%S'", $file);
	open my $in, "<", $file || (warnf($!) && return());

	my $columns = $csv->getline($in) || (warnf("Can't read columns line.") && return ());
	scalar(@$columns) || (warnf("No columns in first line.") && return ());
	$csv->column_names(@$columns);

	my $rows = $csv->getline_hr_all($in, 1);
	debugf("%d rows found.", scalar(@$rows));

	close $in;
	return @$rows;
}
【備忘録】mac版　mariaDBのいろいろ

#mariaDBのインストール
```
$brew install mariadb
```

#mariaDBのアンインストール
```
$brew uninstall mariadb
```

###注意！
`brew uninstall mariadb`だけでは、`/usr/local/var/mysql`は残ったままなので、こちらは*手動で消さないと*変な設定が残ってしまうみたい。

#mariaDBの起動
```
$mysql.server start
```

#mariaDBの停止
```
$mysql.server stop
```

#mariaDBをセーフモードで起動
```
$mysql.server start --skip-grant-tables
```

#mariaDBにログイン
パスワード付きの場合

```
$mysql -u ユーザー名 -p
Enter password: 
```

#データベース一覧表示
```
MariaDB [(none)]> show databases;
```

#データベース選択
```
MariaDB [(none)]> use データベース名;
```
MySQLでinformation_schemaから外部キー参照を確認する時のメモ

外部キーの一覧を見たい、でもテーブルの定義を１個１個見ていくのは面倒。
そんな時にinformation_schemaから制約を取得できるので自分用メモ。

## table_constraints

MySQLで外部キーをはっているテーブルを調査するのに使える

~~~
select * from `information_schema`.table_constraints
where
table_schema = "{スキーマ名}" and
constraint_type="FOREIGN KEY"
;
~~~

## key_column_usage

特定のテーブルへの外部キーをはってあるテーブルの一覧を取得できる

~~~
select * from information_schema.key_column_usage
where
  constraint_schema='{スキーマ名}' and
  referenced_table_name='table_name'
;
~~~
【自分用メモ】iOSの開発メモ

## 開発全般
### 既存ソースの実行時のメモ
- Bundle Identifierの変更
- carthageの実行

(例)

```console
$ carthage bootstrap --platform iOS --no-binaries
```


## UI

### UIPresentationController
* AlertDialogっぽいのを簡単に作れる
UIAlertViewControllerは簡単にダイアログを作れるが、自由度が低い.  
具体的には、UITextFieldくらいしか追加できない（https://developer.apple.com/documentation/uikit/uialertcontroller/1620093-addtextfield）.  
また、SubViewの追加は禁止されている(https://developer.apple.com/documentation/uikit/uialertcontroller 黄色のImpoertantの箇所).  
細かいカスタマイズをするなら、UIPresentatinControllerを使うのがよさそう.  

* [iOS] UIPresentationControllerを使用してカスタムダイアログを実装する
  * https://dev.classmethod.jp/smartphone/ios-custom-dialog-with-uipresentationcontroller/
  * コピペコピペでだいたいいい感じに作れる

* 【Swift4】UIBlurEffectを使ってぼかし効果を追加する
  * https://qiita.com/siropaca/items/056719c7a717c1281c6b#extralight
  * ぼかしを仕込むといい感じ。土台のViewを透明にして、UIEffectViewの背景色をWhite、alpha=0.8くらい


## 定数・変数
### Objective-C

* Objective-Cで定数を定義する
  * https://qiita.com/sushichop/items/bd0a19faa3028c7de0bb
* C言語のグローバル変数とexternについて
  * https://fa11enprince.hatenablog.com/entry/2016/01/10/052009


## リソース管理

### File
#### FileManager
* FileManager
  * https://developer.apple.com/documentation/foundation/filemanager

#### ディレクトリ構成とか
* iOSアプリのファイル保存について
  * https://qiita.com/nnsnodnb/items/13642c4a8d55641f893e

#### ダウンロード&保存
* 【Swift4】URL先の画像をアプリ内に保存＆ロードする
  * https://qiita.com/orimomo/items/a22ab921decd41df7dfa

### オンデマンドリソース

#### オンデマンドリソースでiOSアプリを軽くする
* https://qiita.com/kukimo/items/39a0eeb40626a4cd364f


## LocalAuthentication
* 公式
  * https://developer.apple.com/documentation/localauthentication

### Face ID / Touch Id
* iOSのFace ID, Touch IDを使用したログイン機能を設計する
  * https://www.l08084.com/entry/2018/06/02/195341

* iOSのFace ID, Touch IDを使用したログイン機能を設計する - Part2
  * https://www.l08084.com/entry/2018/06/16/192746

* UDIDとUUID
  * https://takerpg.hatenablog.jp/entry/20120509/1336519138


## 配布方法
* iOSライセンス＆配布方法まとめ
  * https://qiita.com/isaac-otao/items/126bced83d9af86c7ce5
* 一般公開（App Store）のほか、評価用配布（AdHoc）と、組織内配布（In-House）がある
* Adhoc/In-Houseのインストールサイトは、httpsサーバを利用する必要がある
  * https://qiita.com/HIkaruSato/items/851ba853892916fabe26 
  * https://www.lancork.net/2014/03/ios71-enterprise-inhouse-ssl-required/

## テスト
* iOS アプリの Unit Test - Objective-C 編
  * https://qiita.com/s-harada/items/f7d57966a5bf9d53038e 

## その他
### .plist
* 「.plistファイル」とは何か？（ざっくり）
  * https://qiita.com/hp0me/items/b619680611fd6667273f

* 読み込み（swift）

```swift
var filePath = NSBundle.mainBundle().pathForResource("test.plist", ofType: nil )
var dic = NSDictionary(contentsOfFile: filePath!)
```

### NS
* NS = NeXTStep

### code snipetts
* 【iOS、Swift】コードスニペット（ Xcode Swift Code Snippets）
  * https://qiita.com/yyokii/items/cbc9025551ae0a70abdc
  * https://github.com/burczyk/XcodeSwiftSnippets

### UITextViewへのリンクの埋め込み
* 【Swift4】UITextViewの中のURLリンクを自動的にハイパーリンク化する
  * https://iceblue.tech/【Swift4】UITextViewの中のURLリンクを自動的にハイパーリンク/

### HyperLink表示

#### URLをそのままリンク化する場合
* 【Swift4】UITextViewの中のURLリンクを自動的にハイパーリンク化する
  * https://iceblue.tech/【swift4】uitextviewの中のurlリンクを自動的にハイパーリンク/

#### \<a\>タグを使う方法
* swiftでHTMLからNSAttributedStringを作る方法
  * https://qiita.com/saku/items/031eb456345630cf8bd4
VBAからREST APIをコールする

#はじめに

以前、VBAからAWS AuroraにMySQLドライバから接続するという記事を書いたのですが、実際に現場でやろうとしたらMySQLドライバ入れるのにVisualStudioの依存関係があり、先方からドライバ入れたくないと言われてしまった。（めんどー、VSぐらいいれてよ。）

ということで、クライアントに依存しない形で通信するためにREST APIでの通信方式を調べたのメモしておく。

###コード

使うライブラリとメソッドは以下。
`Set httpReq = CreateObject("MSXML2.XMLHTTP")
httpReq.Open "GET", URL, False
httpReq.Send
`

```vb

Sub apicall(var_int) 'var_intが引数として渡ってくる。

    '変数宣言
    Dim httpReq As Object
    Dim URL As Variant
    'リクエストセット
    Set httpReq = CreateObject("MSXML2.XMLHTTP")
    'GETでURLセット
    URL = "http://xxx.com/api.php?id=" & var_int
    httpReq.Open "GET", URL, False
    'リクエスト
    httpReq.Send
    Set httpReq = Nothing
     
End Sub
```

#おわりに

今回はIaasサーバにphp配置して、そこからDBへのインサート処理を行いました。SELECTとかだと使い勝手がわるいかもですが、参照画面ぐらいならつくってもいいかもですね。

それではご査収ください～
SORACOM Napterをcliから使ってみる

# SORACOM Napterとは

2019/7/2に発表されたSORACOMの新サービスで、SORACOM Air SIMの挿さっているデバイスに、簡単にリモートからセキュアなアクセスできるようになります。

WEBコンソールからsshする手順は[公式ドキュメント](https://dev.soracom.io/jp/start/napter_ssh/)にありますので、同じことをcliからやってみます。

# cliのセットアップ

soracom cliのセットアップはここでは省略しますが、バージョン0.4.5以上にしてください。

```bash
%soracom version
SORACOM API client v0.4.5
```

# jsonを準備

以下の内容をnapter.jsonに保存します。

```json
{
	"destination": {
		"imsi": "アクセス先のIMSI",
		"port": 22
	},
	"duration": 1800,
	"tlsRequired": false
}
```

アクセス元を指定していない場合、cliを実行したマシンのグローバルIPアドレスが自動的に設定されます。
アクセス元を明記する場合はこんな感じで。

```json
{
	"destination": {
		"imsi": "アクセス先のIMSI",
		"port": 22
	},
	"duration": 1800,
        "source": {
                "ipRanges":[
                       "x.x.x.x/x"
                ]
        },
	"tlsRequired": false
}
```

# 接続してみる

では、さっそくやってみましょう。

```bash
%soracom port-mappings create --body @napter.json
{
	"createdTime": **********,
	"destination": {
		"imsi": "**************",
		"port": 22
	},
	"duration": 1800,
	"endpoint": "**********:*****",
	"expired": false,
	"expiredTime": *******,
	"hostname": "******.napter.soracom.io",
	"imsi": "***************",
	"ipAddress": "*****",
	"operatorId": "*****",
	"port": ****,
	"source": {
		"ipRanges": [
			"******"
		]
	},
	"tlsRequired": false
}
```

できました！
あとはこの情報に従って、

```bash
%ssh -p portの値 ユーザ名@ipAddressの値
```

でアクセスできます。

# 後片付け

終わったら削除しましょう。

```bash
%soracm port-mappings delete --port portの値 --ip-address ipAddressの値
```

で削除されます。

# まとめ

Napterはお手軽かつセキュアにオンデマンドなリモートアクセスを提供してくれる素晴らしいサービスです。
cliで操作すると、シェルスクリプトなどにも組み込めて便利ですね。
サーバー構築(CentOS 編)

#あらすじ
サーバー構築について教えてもらえることになったので備忘録として残すことにした。
初めは先輩が設定したものが多分に含まれてますので、何か間違えてたらご報告ください。
#今回使ったもの
###物理サーバー
使ってないサーバーを使わせてもらいました。あるいはOSの入っていないPCとかでもいいと思います。
###OS
今回はCentOSを使い,CD/DVDでインストールします。

#OSをCD/DVDからインストールする

ではまずOSからインストールしてみましょう。しかしOSがない状態だと普段通りにCD/DVDを読み込んでくれない(デスクトップの概念すらない)ので、起動時にCD/DVDからアクセスする動きが必要になります。どうするかというとBIOSを使います。
##BIOS
　PC起動時に特定のキーを入力し続けると開く画面、UEFIの場合は全体的に赤く、それ以外は全体的に青いのが特徴。
ここでCD/DVDの優先順位を一番にあげ、起動時に読みこむことができます。
PCによって異なるので詳細は参考文献へどうぞ。

##CentOS
※OSインストール前にネットに繋いでおけばIPアドレスが設定されて楽になるそうです。
読み込みが成功したら画面が変わります。選択肢が複数出ると思いますが[Install CentOS 7]みたいなものを選んでいいです。テストしてからインストールするか否かの話だけですので。
次に母国語を選択します。
次に出てくる画面で一番大事だと思うのがインストール先で、OSのインストール先を決定したり、空き領域を分割することができます。
これに関しては、今回はインストール先の空き領域を確保し、自動的構成のパーティション構成を設定すれば問題ないはず。
一から構築するならこれで十分なのでインストールの開始を押しましょう。
IPアドレスはメモっておいてください。
インストール中にユーザーとパスワードの作成画面が出るので作っておきましょう。

##インストール完了
再起動が発生するのでしばらく待機し、ライセンスの同意が求められるので、
「1」を押してエンター。「2」を押してエンター。
「c」を押してエンター。「c」を押してエンターの順でOK。
ターミナルの画面になるのでrootユーザーで登録したパスワードをいれてログインできれば完了。


これでサーバーにOSのインストールを入れることができました。次からは他のPCからでもIPアドレスがわかっていればターミナルのssh接続でリモート操作することができるようになります。

次回　[ファイアーウォール編](https://qiita.com/PAmatsuti/items/eedc483eb9aa6c76b053)



#参考文献
[CD/DVDから起動する方法](http://jisaku-pc.net/hddnavi/power_05.html)
[【初心者でもわかる】Linux CentOSのインストール方法まとめ](https://eng-entrance.com/linux-centos-install)
JSON.stringifyでDateの時間が変わらないようにする

# Dateの時間が変わる

```javascript:JavaScript
new Date();
```

結果は
Fri Jul 12 2019 <font color="red">10</font>:00:00 GMT+0900 (日本標準時)


```javascript:JavaScript
JSON.stringify({"now": new Date()});
```

結果は
"{"now":"2019-07-12T<font color="red">01</font>:00:00.000Z"}"

１０時から１時に変わって困った :disappointed_relieved:
JSON.stringifyでも日本時間にしたい。


# なぜDateが変わるのか

```javascript:JavaScript
new Date().toJSON();
```

結果は
"2019-07-12T<font color="red">01</font>:00:00.000Z"

`Date.prototype.toJSON`が原因らしい。

`Date.prototype.toJSON`を上書きすればいいらしいが標準クラスを上書きしたくない。


# JSON.stringifyのreplacerを使う

```javascript:JavaScript
JSON.stringify({"now": new Date()}, function(key, value) {
   if (this[key] instanceof Date) {
      return this[key].toString();
   }
   return value;
});
```

結果は
"{"now":"Fri Jul 12 2019 <font color="red">10</font>:00:00 GMT+0900 (日本標準時)"}"
となり、日本時間にできた :relaxed:

`JSON.stringify`の構文は
> JSON.stringify(value[, <font color="red">replacer</font>[, space]])


# Thanks

[How to JSON stringify a javascript Date and preserve timezone - Stack Overflow](https://stackoverflow.com/questions/31096130/how-to-json-stringify-a-javascript-date-and-preserve-timezone)

解法のアイデアはネタ元からだが日本語で書くことに意味があるのだ :sunglasses:
Haskellメモ

## コメント

### 単一行

```haskell
-- コメント
```

### 複数行

```haskell
{-
複数行での
コメント
-}
```


# GHC

## ソースファイルをコンパイルして実行する

`main`を定義する必要あり。

```haskell
$ ghc --make foo.hs
```

[10.1. Using GHC — Glasgow Haskell Compiler 8.6.5 User's Guide](https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/using.html)


## インタプリタ

### インタプリタを終わらせる

`:quit` or `:q`

```haskell
prelude > :quit
Leaving GHCi.
```

### ソースファイルをインタプリタに渡して起動する

```haskell
$ ghci foo.hs
```

# Reference

[Haskell超入門 Part.1](https://www.slideshare.net/nabe256/haskell-part1#)

[［入門］関数プログラミング―質の高いコードをすばやく直感的に書ける！](https://gihyo.jp/dev/feature/01/functional-prog)