OmniAICreator/Qiita-1.07M huggingface dataset:
OSとは？Windows Mac Linuxの違いまとめ

#はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている<小栗>です。
「プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

##OSとは
OSとはOperating System（オペレーティングシステム）の略です。
キーボードやマウス・タッチパッドなどのデバイスによって入力された情報を、アプリケーションに伝え、またソフトウェアとハードウェアの連携を司る中枢的な役割を果たします。

#Windows Mac Linux のそれぞれの特徴

###Windows
マイクロソフト社が開発しいるOSで、世界で最も大きなシェアを誇っています。
特徴としては、インストールできるソフトウェアの数が多いこと、カスタム性が高いことなどがあげられます。
一方で、Unix系の開発がしにくいことや、Windowsの利用には料金がかかることは、MacやLinuxと比較するとデメリットとしてあげられます。

###Mac
MacOSはApple社が開発しているOSで、Windowsの次にシェア率が高いです。
Apple社の製品はスタイリッシュなデザインのものが多いのも特徴です。
また、Windowsと比べ、Unix系の開発に向いているためそのような言語を使用するエンジニアや、デザイナーには人気があります。

###Linux
WindowsやMac OSの根源といわれるOSで、見た目はMac OSにそっくりです。
また、WindowsとMac OSは料金がかかるのに対して、Linuxは無料でインストールできることも特徴です。
インストールできるソフトウェアが豊富な点や、OSをカスタマイズできる点も人気の理由です。
しかし、コマンド操作に慣れていないと操作がしづらいという難点もあります。
[JavaScript]配列をループで処理する４つの方法と注意点（for, forEach, for...of, for...in）


## 概要
JavaScriptで配列をループで処理する方法をまとめる。

## 環境

```
> node -v
v10.15.3
```

## 方法
### for

汎用性が高い。記述量は多め。

```javascript
const x = ['a', 'b', 'c']
for (let i = 0; i < x.length; i++) {
    console.log(`${i} : ${x[i]}`)
}
```

```
0 : a
1 : b
2 : c
```

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for

### forEach

値にしか興味がない場合。（n番目という情報は不要な場合）

```javascript
const x = ['a', 'b', 'c']
x.forEach(v => console.log(v))
```

```
a
b
c
```

次の点に気をつける。

> 例外を throw する以外の方法で、forEach() ループを止めることはできません。ループ中に中断することがある場合、forEach() メソッドは適切な方法ではありません。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Description

こういう場合は、forかfor...ofを使おう。


### for...of

配列の値が返される。forEachとよく似ている。

```javascript
const x = ['a', 'b', 'c']
for (let v of x) {
    console.log(v)
}
```

```
a
b
c
```


### for...in

配列の要素にアクセス可能な値が返される。
ただし、下記のような注意点があるため、forやforEachを使うのが良さそう。

> for...in はインデックスの順序が重要となる 配列 の繰り返しには使うぺきではありません。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for...in#Array_iteration_and_for...in

```javascript
const x = ['a', 'b', 'c']
for (let i in x) {
    console.log(`${i} : ${x[i]}`)
}
```

```
0 : a
1 : b
2 : c
```

stringが返るのが不思議な感じ。

```javascript
const x = ['a', 'b', 'c']
for (let i in x) {
    console.log(`${i} : ${typeof i}`)
}
```

```
0 : string
1 : string
2 : string
```

## 個人的まとめ
配列のインデックスと値がどちらも必要 => for
値だけ必要 => forEach もしくは、for...of
【Swift】 生体認証のやり方

生体認証を初めて実装したので、次に実装する際に忘れないよう備忘録。

##実装の準備

最初にLocalAuthenticationをimportする。

```Swift:BiometricsTest.swift
import LocalAuthentication
```

続いてinfo.plistの中に、

```
Privacy - Face ID Usage Description
```
を設定する。位置情報等と同じでPrivacyの使用目的が必要。

##実装
まずは、端末が生体認証に対応しているかどうかを確認する。

```Swift:BiometricsTest.swift
/// 生体認証が利用可能かどうか
func canUseBiometrics() -> Bool {
        
        let context = LAContext()
        var error: NSError? = nil
        
        let result = context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error)
        
        guard !result else { return true }
        
        if let error = error {
            // iOS11以降とそれ以前ではErrorのコード名が異なるため、場合分け
            if #available(iOS 11.0, *) {
                switch error.code {
                case LAError.biometryNotEnrolled.rawValue, LAError.biometryLockout.rawValue:
                    return true
                default:
                    return false
                }
            } else {
                switch error.code {
                case LAError.touchIDNotEnrolled.rawValue, LAError.touchIDLockout.rawValue:
                    return true
                default:
                    return false
                }
            }
        }
        return false
    }
```
注意するのは、指紋または顔認証が設定されていない場合falseが返ってくること。また、端末にPassCodeが設定されていない場合もfalseが返ってくる。

続いて、実際に生体認証を実行する

```Swift:BiometricsTest.swift
/// 生体認証を実行する
    func doBiometricsAuthentication() {
        let context = LAContext()
        
        // 生体認証を使う理由。空文字だと失敗扱いになるので、必ず文字を入れる
        let reason = "ロックを解除"
        
        context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: reason) { (success, evaluateError) in
            if success {
                print("Success!!")
            } else {
                guard let error = evaluateError as NSError? else {
                    print("Error")
                    return
                }
                print("\(error.code): \(error.localizedDescription)")
            }
        }
    }
```

以上で生体認証を使うことができる。

```Swift:BiometricsTest.swift
    @IBAction func actionBiometricsAuthentication(_ sender: Any) {
        if canUseBiometrics() {
            doBiometricsAuthentication()
        }
    }
```
【TeraTerm】ログ出力【マクロ】

前回[【TeraTerm】ターミナル接続の簡略化【マクロ】](https://qiita.com/god19/items/416d01ddcd0f8be53940 "【TeraTerm】ターミナル接続の簡略化【マクロ】")の続き。

## 【目的】
マクロで簡単ログ出力。
TeraTermマクロ学習。

## 【前提】
- 母艦はWindows
- 接続先の Pi は何でも
- ターミナルソフトは TeraTerm
- 個人使用（セキュリティより手軽さ重視）

## 【マクロ - 単体用】
```ttl:piz_with_log
ipAdr    = '192.168.11.112'	; piz
username = 'pi'
passwd   = 'raspberry'

logDir   = 'C:\log\'
hostname = 'rapberrypiz'
gettime timestr "%Y%m%d_%H%M%S"
sprintf2 filename '%s%s_%s_%s.log' logDir hostname username timestr

msg      = ipAdr
strconcat msg ':22 /ssh /auth=password /user='
strconcat msg username
strconcat msg ' /passwd='
strconcat msg passwd

connect msg

logopen filename 0 1
logwrite 'connect: '
logwrite msg
logwrite #13#10#13#10
```

変数の意味は以下。自分の環境に合わせて書き換えること。

| 変数      | 内容               |
| --------- | ----------------- |
| ipAdr     | 接続先IPアドレス   |
| username  | ログインユーザ名   |
| passwd    | ログインパスワード |
| logDir    | ログ出力フォルダ   |

## 【動作確認】
### 1. マクロダブルクリック実行
正常にログインができ、ログ出力ディレクトリにログファイルが生成されていること。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/a650b460-5584-715f-26c5-5ea33ee5bb89.png" width=90%>

失敗する場合、TeraTermメインメニュー[設定] - [その他の設定]で開く「Tera Term: その他の設定」ダイアログの「ログ」タブの赤枠の箇所を確認。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/ce4a0383-26f5-72cb-1056-a1014c0899ed.png" width=40%>
ここが設定されていると、マクロよりこの設定が優先されるそうなのでクリアすること。

### 2. ログファイル確認
ログファイルをサクラエディタ等で開こうとすると、以下のメッセージが表示されるが、これは正常動作。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/197e5f3e-36dc-0650-5bd1-1988d5cdff84.png" width=40%>
寧ろ、マクロがファイルを捕まえている正常動作の証拠。

ログファイルの中身を確認。正常に出力されていること。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/ccedbfa8-292f-f2ed-0d7e-33e2500e1c8e.png" width=80%>

## 【備考】
connect の前に logopen すると失敗する。
接続先複数台対応は前回の[【TeraTerm】ターミナル接続の簡略化【マクロ】](https://qiita.com/god19/items/416d01ddcd0f8be53940 "【TeraTerm】ターミナル接続の簡略化【マクロ】")を参考に。
LINE Notifyの使い方（PHPコードを例に）

※ 某案件でLINE Notifyを利用する必要があったのでテスト構築した際に調べたことを備忘録として保存．

# LINE Notifyとは

- LINE Notifyは，LINEの公式アカウント「LINE Notify」のこと．また，それを利用してユーザに通知を送る方法を指す．
- 公式アカウントとの違いは，自ら作ったアカウントで情報発信するわけではなく，ユーザからは，LINEが管理しているアカウントから情報が届いているように見えるところ．

# LINE Notifyを設定して通知が届くまで

## サービス登録

- [このURL](https://notify-bot.line.me/ja/)から所有するLINEアカウントでログイン．
- 右上のアカウント名が書かれてあるメニューから「登録サービス管理」を選択．
<img width="400" alt="LINE_Notify_Capture" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245540/b9753260-e39c-808c-aeae-b85165f98178.png">
- 「登録サービス管理(サービス提供者向け)」のページに遷移するので，「サービスを登録する」からサービス登録．
    - ［サービス名］は，通知に常に表示される．
    - それ以外の項目は，ユーザによる連携画面と，「連携済みサービス」一覧に表示される．
    - 「Callback URL」がいつ使われるのかについては後述．
- メールアドレスの認証が必要なので，そこまで出来たら画面上の「Client ID」「Client Secret」をメモる

## ユーザ連携

### 連携画面への遷移

- 以下のURLをGET実行することでLINE Notifyの連携画面に遷移する．

```
https://notify-bot.line.me/oauth/authorize?response_type=code&client_id=[Client ID]&redirect_uri=[Callback URL]&scope=notify&state=[CSRF Token]&response_mode=form_post
```
- ここで，Client IDはメモしたもの．
- Callback URLはサービス登録画面で指定したもの．LINE Notifyの連携画面はLINE管理なので，そこから自サービスに戻ってくるときにどのURLに遷移させたいかを指定する．
- CSRF TokenはCSRF対策のために用意するトークン．
- response_modeは任意のパラメータで，form_postを指定することで連携後のCallback URLへのリクエストがPOSTになる．このパラメータを付けなければGETになる．

注：response_modeは任意だが，CSRF Token（stateパラメータ）は必須．

### 連携画面からのCallback

- Callbackされる際に，Responseパラメータとしてcodeが含まれる．（これは一時code）
- このcodeを受け取ったら，以下のようにPOSTでリクエストを投げる．（PHPの例）

```
$query = http_build_query([
    "grant_type" => "authorization_code",
    "code" => [Callback時に受け取ったcode],
    "redirect_uri" => [Callback URL],
    "client_id" => [Client ID],
    "client_secret" => [Client Secret]
]);

$header = [
    "Content-Type: application/x-www-form-urlencoded",
    'Content-Length: ' . strlen($query)
];

$url = "https://notify-bot.line.me/oauth/token";

$options = [
    CURLOPT_RETURNTRANSFER  => true,
    CURLOPT_POST            => true,
    CURLOPT_HEADER          => true,
    CURLOPT_HTTPHEADER      => $header,
    CURLOPT_POSTFIELDS      => $query
];

$ch = curl_init($url);
curl_setopt_array($ch, $options);
$result = curl_exec($ch);
```

- 戻り値としてaccess_tokenを受け取れるので，保存しておく．

## 通知処理

- 以下のような感じで通知可能．

```
$query = http_build_query([
    "message" => [通知したい内容]
]);

$header = [
    "Content-Type: application/x-www-form-urlencoded",
    'Authorization: Bearer ' . [access_token],
    'Content-Length: ' . strlen($query)
];

$url = "https://notify-api.line.me/api/notify";

$options = [
    CURLOPT_RETURNTRANSFER  => true,
    CURLOPT_POST            => true,
    CURLOPT_HEADER          => true,
    CURLOPT_HTTPHEADER      => $header,
    CURLOPT_POSTFIELDS      => $query
];

$ch = curl_init($url);
curl_setopt_array($ch, $options);
$result = curl_exec($ch);
```

- 一通り確認したところ，改行とリンクの設置は可能．HTMLタグは使えないようだ．
- 画像添付なども可能だけれど，自分の用途では必要なかったので試してはいない．

# 補足

- 今回は通知のみ説明したが，他にも，access_tokenに紐づくユーザのstatusを表示したり，連携を解除するAPIが用意されている．
- また，Response Header情報には，あと何回APIの利用が可能なのかや，そのカウントがいつリセットされるのかについての情報が含まれている．

# 参考資料

- [LINE Notify API Document](https://notify-bot.line.me/doc/ja/)
ethers.js で Ethereum アカウントのトランザクション履歴を取得

- ethers.js で Ethereum アカウントのトランザクション履歴を取得するサンプルコードです。
- データのソースは etherscan.io のようです。

```js
// ethers.js をインポート
const ethers = require('ethers')

// 接続するネットワーク
let network = 'ropsten'

// Etherscan provider を取得
let etherscanProvider = new ethers.providers.EtherscanProvider(network)

// トランザクション履歴を取得するアドレス
let address = "0xfC12b50bD2D04d3754BfC1cFB6c303fb9EAcA118"

// トランザクション履歴を取得
etherscanProvider.getHistory(address).then((history) => {
    history.forEach((tx) => {
        console.log(tx);
    })
});
```

#Ref.
- https://scrapbox.io/a42/ethers.js_で_Ethereum_アカウントのトランザクション履歴を取得
- https://docs.ethers.io/ethers.js/html/cookbook-accounts.html#get-transaction-history
React Component について（React基礎講座3）

# はじめに

今回は、React Component について書きます。

# シリーズ

本記事はReact基礎講座のための連載になっています。気になる方のために、前の章は以下です。

[JSXで変数を展開させたい場合やアロー関数について（React基礎講座2） \- Qiita](https://qiita.com/ryosuketter/items/fd701acda3b367550f2f)

最初の記事は、以下です。

[Reactを使ってJSXの内容をレンダリングする（create\-react\-app）（React基礎講座1） \- Qiita](https://qiita.com/ryosuketter/items/dbac89f398787a1a73d4)

# コンポーネントとは

コンポートの概念は、関数と似ています。つまり、inputがあって、なんらかの処理をした結果を、Outputするパーツや部品のことをコンポーネントと言います。そして、このコンポーネントを組み合わせて、より大きなアプリケーションを構築します。

# シンタックス

まずは、通常の React Element を作成して、そして次に React Component を作成しましょう。

## React Element

```react
import React from "react";
import { render } from "react-dom";

const returnTxt = () => {
  return <p>sample txt</p>;
};

render(returnTxt(), document.getElementById("root"));
```

![スクリーンショット 2019-08-04 22.46.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14191/1b4e17e7-633d-5b2f-6699-fcfc61a03cbc.png)

では、これを React Component で書いてみましょう。

## React Component

定義する際は、いくつかルールがあります。

- const で宣言する場合や、renderの第1引数のJSXとして渡す際、文頭を大文字にします
- renderの第1引数のJSXとして渡す際、タグで囲みます（閉じタグも書く） 例: `<Tag />`

```react
import React from "react";
import { render } from "react-dom";

const ReturnTxt = () => {
  return <p>sample txt</p>;
};

render(<ReturnTxt />, document.getElementById("root"));
```

結果は同じになりますが、`React Component`が作成されている点が異なります。

では、話を進めて、`React Component`に何か値を渡してみましょう。

その場合は、renderの第1引数のJSXの中に `key="value"`的な感じで`React Component`に引数的な値を渡します。

```react:index.js
import React from "react";
import { render } from "react-dom";

const ReturnTxt = props => {
  return <h1>{props.title}</h1>;
};

render(<ReturnTxt title="My Blog" />, document.getElementById("root"));
```

![delicate-butterfly-nvry9_-_CodeSandbox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14191/4ade6288-5291-a42f-b95f-9c6f2a342559.png)

引数を複数渡すこともできます。

```react:index.js
import React from "react";
import { render } from "react-dom";

const ReturnTxt = props => {
  return (
    <div>
      <h1>{props.title}</h1>
      <p>{props.body}</p>
    </div>
  );
};

render(
  <ReturnTxt title="My Blog" body="hello, world" />,
  document.getElementById("root")
);
```

`React Component`の中で`props`をの中身をみてみましょう。

```js
console.log(props)
```

コンソールには、以下のように出力されます。

```txt
Object {title: "My Blog", body: "hello, world"}
    title: "My Blog"
    body: "hello, world"
```

`title`と`body`に、値が代入されているとわかります。

`props`として、受け取る以外の受け取り方もあります。先にコードを書いてみます。

```react:index.js
import React from "react";
import { render } from "react-dom";

const ReturnTxt = ({title, body}) => {
  return (
    <div>
      <h1>{title}</h1>
      <p>{body}</p>
    </div>
  );
};

render(
  <ReturnTxt title="My Blog" body="hello, world" />,
  document.getElementById("root")
);
```

何が違うかと言うと、アロー関数の引数を受け取る部分に、なみ括弧（ブレース）`｛ ｝`で受け取ることで、今回であれば `title` と `body` という変数にオブジェクトされた中身を入れて、直接この変数名で展開することができます。

`props`で書くより、上記のように何を受け取っているかわかるのがいいと思います。

# 参考

- 改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで | 山田 祥寛
Gitlabに画像を貼り付ける

## 課題

Gitlab上にTips共有のためにMarkdown形式でナレッジをためていたのですが、  
図を使いたい時はImageディレクトリを作ってそこに画像を配置し、Markdownの中でパスを指定して表示していました。

```bash-session
# ファイル構成
.
├── Image
│   └── Metabase_MySQL.png
└── Markdown
    └── 009_MetabaseとMySQL環境をDockerで作る.md
```

```Markdown
![SS1](../Image/Metabase_MySQL.png)  
```

しかし、個人用なら良かったのですが、共有している環境でこれをやってしまうと
pullした時にみんなのローカルに画像ファイルを大量に置くことになってしまうことに気がつきました。

## 解決策

### 参考

なんでもQiitaが教えてくれる。

* [GitHubでREADME.mdに画像を使用したい](https://qiita.com/lowg/items/06dd096e7ed1acce4b1e)

### Gitlabでも試す。

`課題`から`新規課題`を選択

![001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223761/1da8fcb4-f2de-06df-e01b-df85ee59068f.jpeg)


New Issueの画面が表示される

![002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223761/924915ee-2473-1554-079c-a10df1d3afa9.jpeg)

リンクを作りたいファイルをドラッグ＆ドロップ

![003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223761/9336fdf6-0d61-c31c-6b00-7797e865e095.jpeg)

リンクが作成されるので、これをMarkdownの中に記載すれば画像が表示されます。

![004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223761/69fe12e5-522a-90d2-c77a-8f895ea444a6.jpeg)
Mac標準機能のスクリーンショットの保存先とファイル名を変更する

## 設定変更背景

Macはアプリなど入れなくてもスクリーンショットを取得できるのですが、  
保存先がデフォルトでデスクトップであったり、  
ファイル名が日本語だったり、スペースが入っていたりで、コマンドラインから操作する時は面倒だったので  
設定変更をしました。

## 保存先

```bash-session
defaults write com.apple.screencapture location <ディレクトリのPATH>
killall SystemUIServer
```

## 保存先をデフォルトに戻す

```bash-session
defaults delete com.apple.screencapture location
killall SystemUIServer
```

## ファイル名の変更

OS X 10.11 El Capitanより追加されたセキュリティ機能、  
SIP（System Integrity Protection）によって/Systemの領域がガードされている。
rootユーザでも書き込みできないとのこと。
  
そのため以下のリンクのような手法では設定変更できません。  
(あれこれやれば設定できるけど)  
[Changing the default screenshot filename](https://apple.stackexchange.com/questions/27729/changing-the-default-screenshot-filename)
  
色々いじって変更してもよいが、いじって欲しくないところをいじるのはあまり好きではないので  
スクリプトで対応します。(原始的(笑))

```bash-session
defaults write com.apple.screencapture name <ファイル名>
killall SystemUIServer
```

## 設定の確認

```bash-session
defaults read com.apple.screencapture
{
    "include-date" = 1;
    "last-messagetrace-stamp" = "567529840.759799";
    location = "<ディレクトリPATH>";
    name = "<ファイル名>";
}
```

## スクリプトを作って置いておく

スクリーンショットをとると、以下のようにファイル名に空白が入るので  
空白をアンダーバーに変更するスクリプトを置いておきます。

```bash-session
ls -l
-rw-r--r--@ 1 xxxxxx  staff  2257995 12 29 01:33 <ファイル名> 2018-12-29 1.33.35.png

cat rename.sh
#!/bin/sh
for A in $(ls | grep " " | sed -e s/" "/_/g) ; do mv "$(echo $A | sed -e s/_/' '/g)" $A ; done
```

## 追記

ぶっちゃけスクリプト使わんかった(爆)
Mac環境で公開鍵、秘密鍵を作成する方法の備忘録

別にMacに限らずLinux環境であればできる手順ですが...

## 鍵の作成

```bash
$ cd ~/.ssh
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/xxxxxx/.ssh/id_rsa): #作成先確認
Enter passphrase (empty for no passphrase): #パスフレーズ入力
Enter same passphrase again:
Your identification has been saved in /Users/xxxxxx/.ssh/id_rsa.
Your public key has been saved in /Users/xxxxxx/.ssh/id_rsa.pub.
The key fingerprint is:

:
略
:

$ ls -l
total 16
-rw-------  1 xxxxxx  staff  1876 12 25 21:16 id_rsa
-rw-r--r--  1 xxxxxx  staff   403 12 25 21:16 id_rsa.pub
```

## 鍵を使った接続

```bash
ssh -l <USER> -i <作った秘密鍵> <IPアドレス>
```
Mac環境で画面を半分によせる。(Mac操作系のメモ)

Windowsユーザだと、ウインドウズキー+→  or ← で  
画面分割は色々できたのですが、Macではどのようにやるのか調べたのでメモ。

残念なことに標準だとショートカットの実装がないとのこと(画面のデザイン思想が違うんだろうなぁと)  
[ShiftIt](https://github.com/fikovnik/ShiftIt/releases)のようなアプリを入れて、そのような機能を実装するか、　  
標準で実装されている[Split Viewを](https://support.apple.com/ja-jp/HT204948)をGUIで使用するのが選択肢になりそうです。
(Split Viewはまだショートカットがないらしい。)　　

操作方法は画面左上の緑色のフルスクリーン表示ボタンを長押しして、右に配置するか、左に配置するかを決める感じでした。  
(フルスクリーンからだとできないので、一旦フルスクリーンを解除してから行う必要がある。)  
まぁせっかくフルスクリーンとか仮想デスクトップとかあるんだから、画面にごちゃごちゃ並べるんじゃないよってことかなとも思った。
PCを使い始めてからどれくらいたったか確認する方法

自分のPCっていつから使ってたっけ？を確認する方法(Windows 7)

1. Windowsキー + R で「ファイル名を指定して実行」のウィンドウを開く
2. 「cmd」 と入力して 「OK」を選択
3.  黒い画面(コマンドプロンプト)が起動するので、  以下のコマンドでメモ帳とかに書き出しちゃう。  
` systeminfo > systeminfo.txt`
4. コマンドプロンプトから今いるディレクトリを開く  
`start .`  
5. テキストで確認。「最初のインストール日付」の行にインストール日が書いてあります。  

ちなみになんでテキストに書いたかというと、  
コマンドプロンプトの表示が切れちゃったから。(原始的)  
他にも色々な情報が見れてちょっと楽しい。
SageMakerのhyperparametersでlist型の引数を渡す方法

以下の issue の通り、 `hyperparameters` の各要素は一度 `str` に変換されます。

https://github.com/aws/sagemaker-python-sdk/issues/613

ですので、文字列にしたリストを `list` 型に戻す必要があります。このとき、`json` ライブラリを使うことで簡単に戻すことができます。

```entrypoint.py
import json
import argparse

parser = argparse.ArgumentParser()
paresr.add_argument(
    '--listarg',
    type=lambda s: json.loads(s.replace("'", '"'))
)
```

変換するときに、シングルクォーテーションをダブルクォーテーションに置換しないとエラーが出てしまいます。

ちなみに、この方法で `dict` 型も引数として渡すことができます。
neovim + cocで型情報が出ない問題の対処法

※vim初心者の記事です
※詳細な原因はわかっていないため、不要な実施項目があるかもしれません

つい一昨日から[coc](https://github.com/neoclide/coc.nvim)を利用し始めたのだが、公式のスクリーンショットを見ると型情報が表示されているのに、自分のneovimには表示されていなかった

<img width="874" alt="スクリーンショット_2019-08-04_22_50_04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86632/6ffe108a-9f1b-0d5f-80a4-bf0389247a0a.png">
↑こんなやつ

いろいろ試してみたところ、表示できるようになったためメモしておく

## やったこと
- 
~/.config/nvim/init.vimの修正
 (2019/08/30更新)補完時の注釈型注釈表示には不要でした
- neovimを4.0にアップデート
- cocの最新版をインストール

## init.vimの修正

公式の例にあるように以下を設定する
`CocActionAsync('showSignatureHelp')`が型情報を呼び出す機能な気がする


```vimscript
augroup mygroup
  autocmd!
  " Setup formatexpr specified filetype(s).
  autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected')
  " Update signature help on jump placeholder
  autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')
augroup end
```

## neovimのアップデート
もともと3.8を利用していたが、coc利用者は皆4.0を利用していたのでアップデート

```bash
brew unlink neovim

#HEADからのインストールに必要
brew install luarocks

brew install --HEAD neovim
```

## 最新版のcocのインストール
以下を`~/.config/nvim/init.vim`に記載し`PlugUpdate`を実行

```vimscript
Plug 'neoclide/coc.nvim', {'do': 'yarn install --frozen-lockfile'}
```

ここまでやったら動くようになった。
iframeへの通信にはpostMessageを使おう

## iframeへの通信にはpostMessageを使おう
調べればわかることですが、iframeへの通信にはpostMessageを使うことができます。
公式ドキュメントを参考にするようにしましょう。
https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage

この記事が参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Flask-SQLAlchemyでモデルを作成した時に作られるテーブル名について

Qiita初めての投稿。

[KindleのFlask学習本](https://www.amazon.co.jp/Python%E3%81%A7Web%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E4%BD%9C%E3%82%8B-Python3-Flask%E3%81%A7%E4%BD%9C%E3%82%8BWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-%E4%B8%AD%E9%87%8E-%E4%BB%81-ebook/dp/B07C8KT3FS/ref=sr_1_4?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=flask&qid=1564927857&s=gateway&sr=8-4)を試していてはまった箇所。

チャプター7-6で、SQLAlchemyを使った以下のコードが出てくる。

``` class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), index=True, unique=True)
    description = db.Column(db.String(120), index=True, unique=True)
    user_image_url = db.Column(db.String(120), index=True, unique=True)
    def __repr__(self):
        return '<User %r>' % self.username
```
[※ここでデータベースを指定していない場合、クラス名が小文字でテーブル名になり作成されるらしい](https://flask-sqlalchemy.palletsprojects.com/en/2.x/models/)
本の通りに実行すると、Webアプリとしての動作は成功するのだが、実際にテーブルにデータが作成されているか見てみようと思い、

```select * from user;
```を実行するが、
``` postgres
(1 row)
```と表示されるだけ。

何故だろうと思ってたら
```select * from "user";
```とダブルクォーテーションで囲って実行したらちゃんとデータが表示された。

どうやらPostgresqlではテーブル名にuserが予約されていることが原因のようだ。だからSQLAlchemyのクラス名でUserを使ってしまうとこのようになる。ここではUser以外のクラス名を使うべきだったと思う。
Leanpub で Laravel 入門チュートリアルの電子書籍版を作りました。

![laravel-primer-book-cover.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100789/ac798664-7806-c4a5-90a5-dc457d49a251.png)

技術ブログに公開している『[入門 Laravel チュートリアル（全11回）](https://www.hypertextcandy.com/laravel-tutorial-introduction)』を、電子書籍版にまとめました :hugging: :tada:

書籍ページ :point_down:
https://leanpub.com/laravel-primer

[Leanpub](https://leanpub.com/) という電子書籍作成〜販売プラットフォームを利用しましたが、公開までのフローがかなりモダンで低ハードルでしたので、本の宣伝も兼ねて紹介したいと思います。

## Leanpub

![AwesomeScreenshot-leanpub-bookstore-book-2019-08-04_10_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100789/8d7c50c8-1fc3-8351-6df1-112160b846fe.png)

Leanpub は、電子書籍の作成から販売までを行えるプラットフォームです。

カナダのスタートアップらしく、テック系の書籍の取り扱いが多いです。そのためか、制作フローもデベロッパーフレンドリーになっています。

日本語の書籍はまだほとんど出版されていませんが、『[Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)』は結構知られているのではないでしょうか。

### 便利なところ

- Git でコンテンツを管理できる。
- Markdown で書いた内容が PDF / EPUB / MOBI 版として自動出力される。
- ボタン一つで公開、更新できる。
- 読者は通知された本の更新を無料でダウンロードできる。
- 収益は Paypal で受け取れる。
- 無料で始められる。

当初 Amazon から出そうと思ったのですが、ダイレクトパブリッシングの登録方法が少し煩雑だったのと、出版するコンテンツの生成方法（MOBI ファイルってどうやって作るの？）は結局自分で解決する必要がありそうだったので、二の足を踏んでいました。

Leanpub では以前本を買ったことがあって、どうやら出版・販売もできるらしいということで調べてみると、かなりハードルが低そうだったので、今回チャレンジしてみました。

なにより、書き慣れた Markdown が使えて、そこから PDF / EPUB / MOBI 版が自動出力されるというのに驚きました。

### 制作フロー

簡単に制作フローを紹介します。

(1)
まず Git リポジトリを作成します。以下のディレクトリ構成が必要です。

```
└─ /manuscript
    ├─ /resources
    │   └─ 画像など
    ├─ Book.txt
    ├─ chapter1.md
    ├─ chapter2.md
    └─ chapter3.md
```

`manuscript` というディレクトリにマークダウンファイルを書いていきます。
章ごとにファイルを作成します。ファイル名は任意です。

さらに `Book.txt` に章立てを定義します。単に章ごとにファイル名を並べるだけです。

```txt:Book.txt
chapter1.md
chapter2.md
chapter3.md
```

これだけで、マークダウン中の `h1` や `h2` を読み取り、目次を自動生成してくれます。

(2)
GitHub にリモートリポジトリを用意します。リポジトリは private で構いません。

Collaborators に Leanpub ユーザーを追加する必要があります。これにより、Leanpub 側で更新内容を取得できるようになります。

(3)
本の内容は Markua という独自記法のマークダウンで記述します。独自記法と言っても、ほとんど普通のマークダウンです。大きく違うところは生の HTML は使えないくらい。

書けたらリモートリポジトリにプッシュします。

(4)
プレビュー版は、Leanpub の管理画面からボタン一つで出力できます。
PDF / EPUB / MOBI 版がそれぞれ出力されます。

(5)
公開も、プレビューと同様にボタン一つです。
表示画像をアップしたり値段を決めたり紹介文を書いたりしてから、公開します。

いかがでしょうか。本当に公開まではこれだけでした。
**静的サイトジェネレーター**みたいなノリで電子書籍が出せてしまいました :metal:

もちろん、プラットフォームとしては Amazon の方が圧倒的にオーディエンスが多く広いでしょう。ただ、手軽さでは Leanpub に軍配が上がると思います。

（技術書は必ずしも広く一般にリーチする必要もないでしょうし…。）

エンジニアが情報発信をして対価を得るチャネルとしてもっと知られて、日本語のコンテンツも増えるといいなーと思うので、この記事で少し興味をもってもらえると嬉しいです。

そして、Web 開発者の皆さんは、こちらの本もぜひチェックしてください！
:closed_book: :point_right: https://leanpub.com/laravel-primer

以上です。
Macにmecabをインストールする

# MacにHomebrewの環境を整える

## Xcodeをインストール
ターミナルから `$ xcode-select --install` コマンドを発行すると
以下のようにインストールを要求される。

```shell:ターミナル
$ xcode-select --install
xcode-select: note: install requested for command line developer tools
```
同時にポップアップが出てくるので「インストール」を選択し利用規約に同意する。

```ruby:ターミナル
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

途中でEnterの入力、インストールユーザのOSパスワードの入力を求められる。

### Homebrewインストール完了確認
```shell:ターミナル
$ brew doctor
Your system is ready to brew.
```

# Homebrewを使ってMacにMeCabをインストールする
```shell:ターミナル
$ brew install mecab
```

### MacにMeCabを利用するために辞書をインストールする
```shell:ターミナル
$ brew install mecab-ipadic
```

### MacでMeCabを実行してみる
```shell:ターミナル
$ mecab
```
すると空白の行が出てくるのでそこに解析させたい文章なりを入力する。
例えば、「すもももももももものうち」と入力。

```
すもももももももものうち
すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS
```
上記のように解析結果が表示される。
IntelliJ IDEA環境構築メモ

# はじめに
　2018-19年の年末年始休暇中に、Kotlinを勉強。
さあ、Kotlinで開発するぞと意気込んで出社するも、
採用条件が厳しくなるから嫌だというマネージャーの一声で仕事で使えなくなった。
　今の現場では、Eclipseは重いからという理由で、IntelliJでの開発が強制。
現場のいいなりになり、自分の意見を主張できない。フリーランスも辛いよ。
　という訳で、IntelliJの環境構築のメモを残します。皆様のご参考になれば幸いです。

# Gradle
現場の責任者がmavenを使わない方針。馴染み深いmavenをお別れしてGradleを使うのに格闘中
https://gradle.org/install/

# IntelliJ IDEA Download URL
https://www.jetbrains.com/idea/download/#section=windows

# IntelliJ にインストールした Plagin
メニュー[File]-{Settings]-[Plugins]
- Java Extension Pack
- Spring Boot Extension Pack
- Lombok

# Lombokのための設定
Lombokを使うためには、設定を変更して下さいというメッセージが出力。

```
2019/07/30 5:07	Lombok Requires Annotation Processing
		Annotation processing seems to be disabled for the project "sample-javascript". But lombok is on classpath.
		For the lombok plugin to function correctly, please enable it under
		"Settings > Build > Compiler > Annotation Processors"
```
Docker+k8s勉強会に行ってきた話【JAZUG女子部×Java女子部】

JAZUG女子部×Java女子部コラボのDocker&Kubernetes勉強会にスタッフとして参加してきました！
Java女子部のイベントには何度か参加していたんですが、運営側での参加は今回が初めてです。せっかくなので参加レポを書いておきます。

#イベント概要
**【東京】【女性限定】【JAZUG女子部コラボ】Japan Tour in Summer: Java & k8s on Azure まつり by #てらだよしおがんばれ**
2019-08-03（土）10:00 - 17:00
日本マイクロソフト 31階roomA 
https://javajo.doorkeeper.jp/events/94041

講師：寺田佳央さん（https://twitter.com/yoshioterada）
ハッシュタグ：#てらだよしおまつり

#スケジュール
午前：Dockerについてのお勉強（座学）、ハンズオンのチーム分け
午後：Azure+Docker+Kubernetesのハンズオン（モブプロ）

#イベント準備
事前のスタッフ間のやり取りはSlack、FacebookMessengerでした。
当日スタッフは9:00に集合して会場設営やライブ配信の準備などをしていました。
（遠方から参加の方用にGoogleHangoutsでライブ配信したんですが、色々おぼつかなかったので今後のために勉強しておこうと思いました；；）

#午前の部
午前は座学でみんなでDockerについてお勉強。
参加者30人前後で、Docker使ったことあるのは半分以下くらい、Kubernetesは初めての方が大多数でした。
コンテナってなに？からKubernetesを使うとなにが嬉しいの？まで丁寧に教えてもらえました。

#午後の部　Azure×Docker×k8sハンズオン
午後は6人くらい×4チームに別れてAzureを使ったモブプロ形式のハンズオン。
Azureのアカウントを作るところからスタート。会場にチーム分の大きいモニターがなかったので、画面の共有にはTeamsを使っています。
Teamsでの画面共有初めてでしたが使いやすくて良かったです。ブラウザ版だと他人の画面を見ることはできるけど自分の画面を共有できないので、アプリ版が必要でした。

##レベル感
- Docker、Kubernetesはほとんどの参加者が未経験だったので大丈夫！
- Javaの知識もなくて大丈夫！
- 踏み台のLinuxサーバにssh接続してコマンド叩いたりファイル修正したりするので、Linuxは多少触ったことないと厳しいかも
- でも多少わからないことがあってもモブプロなのでチームの仲間が助けてくれる！大丈夫！

##内容
AzureにLinuxサーバを立てて、その中でDockerイメージを作る→Azureにプッシュする→Kubernetesでイメージを持ってきてアプリケーションを動かす、の流れでした。
チーム内で順番に操作者を回していきます。
Azureのクラウドシェルでssh使えるけど結構動作がもっさりしてたので、bashやTeraTermの方が快適でした。

資料や実際に動かしたシェル、アプリケーション等は寺田さんのGitHubのリポジトリからクローン。
https://github.com/yoshioterada/k8s-Azure-Container-Service-AKS--on-Azure

#感想
モブプロすごく楽しかった！
最初6人だと人数が多く感じたんですが、意外とコミュニケーションも取りやすいし、途中詰まっても誰かがフォローできるので良かったです。わからなくて置いていかれる人も出ませんでした。
コンテナのバージョンの切り替えとかさくさくできて楽しかった！Kubernetesで実行したアプリケーションに実際に外部IPでアクセスして、APIのレスポンスが帰ってきた時は女子6人でわいわい盛り上がりました 笑
1日だとかなりコンテンツがぎっちりで、途中シェルの内容とか流し読んでしまった部分もあったので、改めて復習したいと思います。

#イベント参加したい人！
2019/9/7(土)に開催のJAZUG9周年イベントでもDocker×Kubernetesのハンズオンを実施予定とのことです。てらだよしおまつりファイナル！
https://jazug.connpass.com/event/140843/

Java女子部の次回イベントは10月頃の開催予定ですので、そわそわお待ちください！私もそわそわ待ってます！
https://javajo.doorkeeper.jp/
ABC136反省会

# ABC136反省会



Cで2ミス、Dが間に合わず、終了10分後にAC

:sob:

戒めの意味で公開



## A

https://atcoder.jp/contests/abc136/submissions/6683489



## B

https://atcoder.jp/contests/abc136/submissions/6688327



## C

WA https://atcoder.jp/contests/abc136/submissions/6696185 

TLE https://atcoder.jp/contests/abc136/submissions/6698030

https://atcoder.jp/contests/abc136/submissions/6698654



このタイプ毎回TLEやらかすの学んでなさすぎ馬鹿



## D

https://atcoder.jp/contests/abc136/submissions/6712874

一発OKだけど実装遅すぎるし汚い





## C, Dのメモ

https://drive.google.com/open?id=1_89_8WNZ7tTYV5JmBzoOt1g4-_MsyH7H
Railsで本番サバーからDemoサバーにデータをコピーする

## Railsで本番サバーからDemoサバーにデータをコピーする (rake task)

今Railsプロジェクトを開発している、その時は本番サバーはドンドン新しいデータが登録している。そして同じデータをテストしたい時難しいと思います。したのコート使ってTerminalからデータをコピーができる。

```
# lib/tasks/db_pull.rake
namespace :db do
  desc 'Pull production db to development'
  task :pull => [:dump, :restore]

  task :dump do
    dumpfile = "#{Rails.root}/tmp/latest.dump"
    production = Rails.application.config.database_configuration['production']
    puts 'mysqldump on production database...'
    system "ssh user@server.tld 'mysqldump -u #{production['username']} --password=#{production['password']} -h #{production['host']} --add-drop-table --skip-lock-tables --verbose #{production['database']}' > #{dumpfile}"
    puts 'Done!'
  end

  task :restore do
    dev = Rails.application.config.database_configuration['development']
    abort 'Live db is not mysql' unless dev['adapter'] =~ /mysql/
    abort 'Missing live db config' if dev.blank?
    dumpfile = "#{Rails.root}/tmp/latest.dump"
    puts 'importing production database to development database...'
    system "mysql -h #{dev['host']} -u root #{dev['database']} < #{dumpfile}"
    puts 'Done!'
  end
end
```

```
rake db:pull
```

Reference: https://martinschurig.com/posts/2015/02/pulling-production-database-to-local-machine-rails-task/
AWS Client VPN でインターネットに出れるVPNを作る

いまさらEC2でOpenVPNサーバーなんて立てたくないんじゃ！という思いから調べたら作れました。こいつ、できるぞ....!!

# AWS Clinet VPNとは

AWS謹製のフルマネージドのVPNサービスです。OpenVPNです。

- [AWS Client VPN とは - AWS Client VPN](https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/what-is.html)

# VPC 内に入る Client VPN エンドポイントを作る

作例が多々あるので割愛。こんな感じで。普通に作るとこうなります。

- [[AWS]踏み台をワンチャンなくせる！？VPC接続にClient VPNを使ってみよう ｜ DevelopersIO](https://dev.classmethod.jp/cloud/aws/vpc-client-vpn/)
- [AWS Clinet VPNを分かりやすく解説してみる – サーバーワークスエンジニアブログ](http://blog.serverworks.co.jp/tech/2019/06/10/awsclientvpn/)

# VPC 内からインターネットに出る Client VPN エンドポイントを作る

Client VPNからインターネットに出るには

1. Client VPNに、インターネットに出れるようにしたサブネットを関連付ける
2. Client VPNに付けるセキュリティグループを、インバウンド/アウトバウンドの両方0.0.0.0/0に開放したものにする
3. Client VPNにの認証ルールを作る
4. Client VPNのルートテーブルに、宛先CIDR 0.0.0.0/0、関連付けたサブネット経由、のルートを作る

1,2は、VPCをいじってれば書くほどの話ではないと思います。

3,4が意味不なので補足します。

## Client VPNにの認証ルールを作る

これは自動では作られないので、VPC向けと、インターネット向けを作ってあげます。

<img width="773" alt="スクリーンショット 2019-08-04 22.11.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22947/f83ffada-70d9-1801-e6f6-9acc639d712b.png">

## Client VPNのルートテーブルに、宛先CIDR 0.0.0.0/0、関連付けたサブネット経由、のルートを作る

Client VPNにサブネットを関連付けると、Client VPNのルートテーブルには、VPCのCIDRへのルートが作られます。ここに加えて、宛先CIDRを0.0.0.0/0、経由サブネットをそれぞれとした、ルートを追加します。

<img width="856" alt="スクリーンショット 2019-08-04 22.15.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22947/bd53d9e5-c843-38f9-c37b-c0e04ae60801.png">

# 他、ハマりどころ

## 「クライアント設定のダウンロード」したファイルには、クライアント証明書のパスが書いてない

SoftetherVPNの感じだと、なんか諸々含まれたファイルを期待しちゃうでしょう。Tunnelblickのログを眺めても、まーわからなかった。

## クライアント証明書はひとつしか設定できない

差し替えは可能です。とはいえ、ひとつのみということは、退職者や紛失があると、利用者全員に差し替えてもらう必要があります。チームで利用してるなら、クライアント証明書ではなく、ActiveDirectoryで認証するのが、現実的な使い方だと思いました。

## Client VPNは、利用者ごとにつくるものではない

Client VPNの制限から、利用者ひとりにつきClient VPNを一個つくって、クライアント証明書で認証させていたら、一瞬で5個を使い果たしてしまいます。VPCにひとつ作り、ADで接続可能なサブネットを区切っていくのが、現実的な使い方だと思いました。
Apacheのアレをワンライナーで作成する

Apacheのデフォルトページのアレをコマンド一発で作成します。

```html:index.html
<html><body><h1>It works!</h1></body></html>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/c5ba7ca8-1b49-9d6c-1d98-43bc1c1aa40c.png)

```
$ echo '<html><body><h1>It works!</h1></body></html>' > index.html
```

適当なHTMLファイルが欲しいときなんかに使えます。
tensorflowjs グラフ描画　チュートリアル

tensorflow.jsでグラフの描画を行いました。

以下のページを写経しました。
https://codelabs.developers.google.com/codelabs/tfjs-training-regression/index.html?hl=ja#2


```html:index.html
<!DOCTYPE html>
<html>
<head>
    <title>TensorFlow.js Tutorial</title>
    <!-- Import TensorFlow.js -->
  <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.0.0/dist/tf.min.js"></script>
  <!-- Import tfjs-vis -->
  <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-vis@1.0.2/dist/tfjs-vis.umd.min.js"></script>

  <!-- Import the main script file -->
  <script src="script.js"></script>
</head>

</html>
```

```javascript:script.js
//Get the car data reduced to just the varibles we are interested
// and cleaned of missing data.

async function getData() {
    const carsDataReq = await fetch('https://storage.googleapis.com/tfjs-tutorials/carsData.json');
    const carsData = await carsDataReq.json();
    const cleaned = carsData.map(car => ({
        mpg: car.Miles_per_Gallon,
        horsepower: car.Horsepower,
    }))
    .filter(car => (car.mpg != null && car.horsepower != null));

    console.log(carsDataReq);
    //console.log(carsData);
    
    return cleaned;
}

async function run(){
    const data = await getData();
    const values = data.map(d => ({
        x: d.horsepower,
        y: d.mpg,
    }));

    tfvis.render.scatterplot(
        {name: 'Horsepower v MPG'},
        {values},
        {
            xLabel: 'Horsepower',
            yLabel: 'MPG',
            height: 300
        }
    );

}

document.addEventListener('DOMContentLoaded', run);
```
Ubuntu18.04　pure-ftpdバーチャルユーザーでハマったからメモ

Pure-ftpdバーチャルユーザーでアクセスできなくてめっちゃハマったのでメモ

#環境構築

パッケージ更新してpure-ftpdをインストール

```
# sudo apt update

# sudo apt -y install pure-ftpd
```
ディレクトリを設定ファイルがある場所まで移動（念のため）

```
# cd /etc/pure-ftpd
```
Anonymous禁止

```
# sudo echo "yes" > /etc/pure-ftpd/conf/NoAnonymous
```

Ubuntu環境におけるデータベース定義ファイルの場所の定義

```
# sudo echo "/etc/pure-ftpd/pureftpd.pdb" > /etc/pure-ftpd/conf/PureDB
```

PureDB ファイルのシンボリック リンクを以下のコマンドで作ります。（これやらなくてハマりました）

```
# sudo [ -e /etc/pure-ftpd/auth/60puredb ]  || sudo ln -s ../conf/PureDB /etc/pure-ftpd/auth/60puredb
```

Pure-FTPd を再起動して設定を読み込ませます。

```
# sudo systemctl -q is-active pure-ftpd && sudo systemctl restart pure-ftpd || sudo systemctl start pure-ftpd
```

システムのユーザーの追加

```
# sudo groupadd ftpgroup -g 1122
# sudo useradd ftpuser -u 1122 -g ftpgroup -d /dev/null -s /etc
```

#FTP公開用ディレクトリの作成

```
# sudo mkdir -p /home/sites/example.com/web
# sudo chown -R daemon:ftpgroup /home/sites/example.com/web
# sudo chmod -R 775 /home/sites/example.com
```
#バーチャルユーザの追加


作成するユーザ :hoge
許可するDir  :/home/sites/example.com

```
# pure-pw useradd hoge -m -u ftpuser -d /home/sites/example.com/
```
※パスワードはご自由に



>引用
https://www.compnet.jp/posts/2019-05-03T1700_%E4%BB%8A%E3%81%95%E3%82%89%E3%81%A0%E3%81%91%E3%81%A9FTP%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%E7%AB%8B%E3%81%A6%E3%81%9F.html

>http://tm.root-n.com/server:pure-ftpd:virtual_user

おわり
自分のためのemacsメモ

# はじめに
元々はライトなviユーザだが、今の実行環境がubuntuでpythonを扱うようになったので
emacsを使うようになった。そしてよくemacsでハマるのでメモを残す。

# 参考URL
大体はこれの中からよく使うやつを抜粋してる。
https://uguisu.skr.jp/Windows/emacs.html

# 実行環境
Ubuntu 16.04.6 LTS (Xenial Xerus)
Emacs 24.5.1

# emacsの設定ファイル置き場
~/.emacs.d/init.el

# 操作方法
## 起動・終了
### 起動
 $ emacs [ファイル名]
 例：emacs test.py
### ファイルを保存せず終了
 C-x, C-c
### ファイルを保存して終了
 C-x, C-s
### 一時中断してコンソールに戻る
　※ちょっと ls してファイル確認したいときとかに使う
　C-z
### 復帰する
　$ fg

## コピペ・削除
細かいコマンドのつなぎ技でできちゃう
### 行削除
　C-a ←行頭へ移動
　C-k ←現在位置から行末までを削除
### コピペ（1行だけの場合）
　※C-kは削除ではなく正確にはバッファに退避させている、が正確な表現なので張り付けることができる
　　…なのでこんなやり方ができる
　C-a
　C-k
　C-y
### コピペ（指定範囲の場合）
　※参考サイトとの説明よりも雑だけどこっちのほうが覚えやすいのであえて雑なままで。
　C-@　←開始位置をマーク
　M-w　←開始位置から現在位置までをコピーする
　C-y　←コピーした内容を張り付け

## カーソル移動
### 一行上がる
　C-p
### 一行下りる
　C-n
### 指定行にジャンプ
　M-x goto-line
### 検索
　C-s
  ※次の候補への移動は更にC-sを押せばOK
## その他
### その場でコマンド実行したいとき
M-! [コマンド]
例:M-! pwd　でカレントディレクトリの表示結果が下部のバナーに出力される

# オマケ：実行環境の確認方法

## ubuntuの場合

```
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.6 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.6 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial
```

## emacsの場合
※emacs起動時

```
M-x emacs-version
→　GNU Emacs 24.5.1 (x86_64-pc-linux-gnu, GTK+ Version 3.18.9) of 2017-09-20 on lcy01-07, modified by Debian
```
未経験が現場iOSアプリ開発で出会うRuby関連

どうもみなさんこんにちはiOS青二才です。


未経験でiOS開発現場に入ると、思いの外今まで頑張って技術をあげてきた`Swift`以外にも様々なものに出会い自分の知見・技術レンジが狭いことに気付きます。
現場に入る前も幅広く開発をしてる人は出会うことがあったり使用したりの経験があると思いますが、私はそんなことはなかったので、「あれ、rubyさん介入してるやんなんやこれ」ってなった物のメモをおきます。

## Ruby
* 日本産のスクリプト言語
* Webサイト制作に使用
* Webアプリ制作に使用
* スマホアプリ開発に使用
* サーバーサイド開発に使用


# まずiOSアプリ開発とRubyとの関係性と知る
色々と掘り下げる前に、iOSアプリ開発に置いての`Ruby`との関係性を知るべきだと思いました。
`Ruby`という言語の一部の特徴は上にあげたものたちですが、サーバーサイド側の処理を担うことが多々あります。
ここでまず一つ、「開発に置いてサーバー連携はrubyで、、、」という繋がり１が生まれます。
そしてMacにはデフォルトで`Ruby`が導入されているのですが、サーバー側処理とか個人開発で使わなきゃ出会いないよね、と思っていたのですがところがどっこい。実は触れてました。


以下で説明する`gem`ですが、実は`Cocoapods`をインストールする際に使用していたんですね。最近は既存のプロジェクトを改修したりすることばかりで、新規でインストールする機会を逃していたので完全に忘れていました。
よくよく調べてみると`Cocoapods`は`Ruby`で実装されているらしく、インストールは`Ruby`経由ということになります。


# ライブラリ / パッケージ
プロジェクトの`readme`をみると`gem install`とか`bundle install` とかそういうのを見かけることがあります。
調べてみると、`gem`とは`RubyGems`が公開している`Ruby`のパッケージ管理ツール。とかいろんなところで説明されています。正直、意味がすんなり入ってこなかったので調べました。
 
まずここで一つはっきりさせておきたいのが
**ライブラリ = パッケージ**
ということです。
初歩的なことかとは思いますが、新しいものを理解するときに事前に脳内にある知識と説明を照らし合わせたときに少しでも差異があると混乱を招きますので、この際にはっきりさせました。


iOS開発で使用する`Cocoapods` `Carthage`は`ライブラリ管理ツール`と認識していたので、パッケージ管理？また違うもの？っとなってしまったのでここで認識を共通化させたかった次第です。
以下の説明では、同等のものと認識してください。
なおここではライブラリという言葉で統一化します。


## Gem
- `RubyGems`が提供する`Ruby`用の`ライブラリ管理ツール`
* `Ruby`において`gem`とは`ライブラリのこと`（太郎さん、花子さんを人間と呼ぶ感じ）
* ターミナルにて`gem`コマンドで使用
* `gem`コマンドにてビルド、アップロード、ダウンロード、インストールを行う
* `gemfile` `gemfile.lock`というのが作成されるので、`gemfile`内にライブラリを記載して使用


まず`RubyGems`ですが、これはそもそもの`gem`を使用できる環境、または管理するシステムです。これを
`gem`を使用するにはまずそれ自体のインストールから始めます。丁寧なreadmeの場合はだいたいプロジェクトをビルドするまでのフローが書いてあると思いますので、それに従ってください。


こいつが`Swift`でいう`Cocoapods`などの管理ツールに該当するのではと思います。


参考
https://ja.wikipedia.org/wiki/RubyGems
https://qiita.com/sumyapp/items/5ec58bf3567e557c24d7


## bundler
`gem`の依存関係とバージョンを管理するためのツール。との説明が多いですがこの表現も紐解くと

- `bundler`も`gem`の一つ
* 複数の`gem`の使用の間で生まれる**gemA version1 と gemB version1**が上手く動作しない、というのを管理して解消してくれる。
* `gemfile` `gemfile.lock`に準拠して管理
* `gem`の管理をする `gem`、それが`bundler`


ということになります。`bundler`を入れましたら、基本的には`bundle install`など`bundler`を介して`gem`達のインストールを行うのが良いとされているようです。


参考
https://qiita.com/oshou/items/6283c2315dc7dd244aef
https://techacademy.jp/magazine/19840


## rbenv
`rbenv`は、複数の`Ruby`のバージョンを管理してくれて、かつプロジェクトごとの`Ruby`のバージョンを指定して使うことができるツールです。`Rubygems`がライブラリ管理ツールだとしたら、こちらはRuby管理ツールとでもいうんですかね。`Homebrew`などでインストールして使います。


`rbenv`で`Ruby`のバージョン操作等を行うことがあるかどうかわわかりませんが、だいたい`gem` `bundler`とセットで使用されていることが多いはずです。
ちなみ**アールベンブ**とか**アールビーエンブ**という呼び方をするそうです。


# まとめ
登場したのは以下のもの達

* `rbenv` - `Ruby`のバージョンを管理
* `gem(RubyGems)` - `Ruby`のライブラリ管理ツール
* `bundler` - `gem(ライブラリ)`の一つで、`gem`の相互性などの管理をする


iOSアプリ開発で`Ruby`を扱っていた場合ほぼほぼこれらを導入しているケースが多いのかなと思います。
`Ruby`も完璧にする！というのもまた先が長い話になるので、チーム開発規模のプロジェクトに介入する際は最低限入れておくべき部分かなと感じました。


という訳で、知見を広げるいい経験でした。ビルドの際、何かライブラリ系のエラーにエンカウントした場合はこの辺にも何か原因があるのでは、という発想をもてるようにもなったかと思うのでとてもいい機会だったと思います。
【JavaScript】nodebrew経由でNode.jsとnpmをアップデートする

以前にnodebrew経由でNode.jsをインストールしていたのですが、それをアップデートしました。

以下、昔書いた記事です。

[nodebrewでNode.jsをインストールする。](https://qiita.com/yukibe/items/bae442fa6314bd8f9d7a)

# Homebrew

最初にnodebrewを管理しているHomebrewをアップデートします。

```console
$ brew update
```

# Node.js

現在のバージョンを確認します。

```console
$ nodebrew list
v10.1.0

current: v10.1.0
```

アップデートします。

```console
$ nodebrew install-binary stable
```

再度確認すると、現在nodebrewで管理されているNode.jsのバージョンが増えました。

```console
$ nodebrew list
v10.1.0
v12.7.0

current: v10.1.0
```

安定版を使います。

```console
$ nodebrew use stable
use v12.7.0
```

バージョンの切り替えが確認できました。

```console
$ node -v
v12.7.0
```

# npm

現在のバージョンを確認します。

```console
$ npm -v
5.6.0
```

アップデートします。

```console
$ npm update -g npm
```

バージョンの切り替えが確認できました。

```console
$ npm -v
6.10.2
```

# 参考記事
Node.jsのアップデートはこちらの記事を参考にしました。
[nodebrewでNode.jsをアップデートする](https://qiita.com/Sr_Bangs/items/bda855068576905a441f)

こちらの記事で紹介されているNode.jsのバージョン管理ツールは``n``というツールです。
今回はnpmのアップデート部分のみ参考にさせていただきました。
[Node.jsとnpmをアップデートする方法](https://parashuto.com/rriver/tools/updating-node-js-and-npm)

各ツールの繋がりがとっても分かりやすく説明されています。
[npm とか bower とか一体何なんだよ！Javascript 界隈の文脈を理解しよう](https://qiita.com/megane42/items/2ab6ffd866c3f2fda066)
リスト表示部分でも特定位置のみにオブジェクトを表示する方法（FileMaker）

#はじめに
ファイルメーカーで繰り返し表示されるリスト表示部分でも
オブジェクトを決まった位置に表示させたい場合の対処方法です。
印刷レイアウト等で役立つと思います。

#リスト表示を使用する上での、繰り返し表示部分の問題点
通常、ファイルメーカのレイアウトは
・ヘッダ
・ボディ
・フッタ
等のパートで構成されています。

ここで、リスト表示を使用する場合ボディ部分に構成されたレイアウトは
レコードがあるだけ繰り返し表示されるわけですが
ここに設定した表示オブジェクトは繰り返しされた全てのボディに表示されてしまいます。
例えば、このレイアウトが印刷レイアウトだった場合に特定の位置に線を引きたい場合は
そのままでは特定位置のみの表示処理を実現することができません。

#対処方法
インスペクタの
「データ」→「動作」→「次の場合にオブジェクトを隠す」
の機能を使用します。

例えばボディの繰り返しが２番目の位置のみに
表示させたいオブジェクトがある場合
「データ」→「動作」→「次の場合にオブジェクトを隠す」
に以下のスクリプトを埋め込みます。

~~~
Get(レコード番号) ≠ 2
~~~

#事例
請求書の印刷レイアウトを作成して
封詰めの折り位置に印をつけたい。
折り位置がボディ部分にかかっており線を入れると繰り返し印刷されてしまう。
この場合はオブジェクトに
上の機能を使って適切な位置の繰り返し位置番号を設定することで
表示を制御することができます。
【初心者】SQLについて調べてみた。

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/)でインターンをしている**to-fu16**です。
今回は、データベース操作に必要なSQLについて調べてみました。

##データベースとは？
データベースとは、数値やテキストなどのデータを、追加や削除、検索がしやすいように、一定の形式で整理したデータの集まりです。
Excelの表のような形をしており、シートに当たるものを「テーブル」、行を「レコード」、列を「フィールド」と呼びます。

##SQLとは？
SQLとは、データベースを定義したり操作するためのデータベース言語のひとつです。
SQLを覚えることで、データの追加や削除、条件に合ったデータの取得などが容易に行えます。

###SQLの基礎
SQLには3種類の言語があります。

* データを操作するDML(データ操作言語)
* データを定義するDDL(データ定義言語)
* データへのアクセスを制限するDCL(データ制御言語)

この3種類の言語によってデータベースを活用します。

####DML(データ操作言語)

* SELECT : データの取得を行います
* INSERT : データの挿入を行います
* UPDATE : データの更新を行います
* DELETE : データの削除を行います


####DDL(データ定義言語)

* CREATE : データベースやテーブルを作成します
* DROP : データベースやテーブルを削除します
* ALTER : データベースやテーブルを変更します

####DCL(データ制御言語)

* GRANT : ユーザーに対して、データベース操作の権限を与えます
* REVOKE : GRANTで与えた権限を抹消します
* COMMIT : トランザクション処理を確定します
* ROLLBACK : トランザクション処理を抹消します

トランザクション処理とは、関連する一連の処理全体を一つの処理単位として管理する仕組みです。

#おわりに
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。
【Julia】Genを動かしてみた

最近こんなタイトル「MIT、確率的プログラミング言語「Gen」を開発」の記事をよく見るので
とりあえず環境を作ってみたお話。

PDLI 2019で発表された内容はこちら
https://youtu.be/DImI6l_0yiM

## 環境
macOS Mojave
julia version 1.1.1
Gen v0.3.1 #master (https://github.com/probcomp/Gen)
IJulia v1.19.0
PyPlot v2.8.1

Juliaの環境構築はこちらを参考に、
[Mac OS X(Mojave)にJulia環境を構築する[VSCode&notebook版]](https://murabitoleg.com/mac-julia/)

Genのインストール

```
$ julia
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.1.1 (2019-05-16)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |

julia>
```

「]」キーをターミナル上で押下すると下のように変わる

```
(v1.1) pkg>
```

Genのパッケージを追加

```
(v1.1) pkg> add https://github.com/probcomp/Gen
```

チュートリアルで使われているパッケージも追加

```
(v1.1) pkg> add PyPlot
```

環境が整ったのでチュートリアルのコードを実行
[Tutorial: Introduction to Modeling in Gen](https://probcomp.github.io/Gen/intro-to-modeling/Introduction%20to%20Modeling%20in%20Gen#julia-gen-jupyter)

実行して下のような警告が出ると思うので

```
┌ Warning: `getindex(o::PyObject, s::Symbol)` is deprecated in favor of dot overloading (`getproperty`) so elements should now be accessed as e.g. `o.s` instead of `o[:s]`.
```

こんな感じで修正

```
ax[:set_xlim]((xmin, xmax))
↓
ax.set_xlim((xmin, xmax))
```

セクション２ぐらいまでが動けば後は警告など出ることなくいけるので問題ないかと思います。
DB接続設定 Spring-Boot application.properties

# はじめに
直近の仕事で、Spring-Bootでアプリ開発を続けています。
application.properties にDB接続設定を記述する必要がある度にGoogleで検索しています。
直ぐに記事が見つかるので、差支えはないのですが、割と頻繁に使うので、自分の記事にも残すことにしました。（悲しいかな、年のためか覚えても直ぐに忘れてしまうのです。年齢は関係ない？！）

```properties
# MYSQL
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost/DB名
spring.datasource.username=ユーザー名
spring.datasource.password=パスワード
spring.jpa.database=MYSQL # JPAを使う場合は任意。なかったら自動判断
spring.jpa.hibernate.ddl-auto=update

# PostgreSQL
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/DB名
spring.datasource.username=ユーザー名
spring.datasource.password=パスワード

```

# 2019/12/08 追記
MyBatis で接続すると例外が発生。タイムゾーンの指定が必要。

```java
### Error querying database.  Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: The server time zone value '???? (?W????)' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
```

```properties
spring.datasource.url=jdbc:mysql://localhost/DB名?serverTimezone=JST
```

# References

- [MySQLに接続すると"java.sql.SQLException: The server time zone value"が出る](https://qiita.com/k_hoso/items/230e720b79317939da60)
laravelで外部ファイルを使用してcssを適用する手順

laravelでcssを適用する時に躓いたので、メモをします。

1. /public/css/にcssファイルを作成します。例としてstyles.cssという名前で作成したとします。

2. viewファイルに以下の一文を記述します。
`<link rel="stylesheet" href="{{ asset('css/styles.css') }}">`
httpsで表示するページなら、assetの部分がsecure_assetになります。
【Modding】Minecraftで重要なSideの概念

# はまったこと
`world.createExplosion()`を実行したときに、表示されていないが当たり判定だけが残っている、いわゆる**ゴーストブロック**現象が発生してしまった。いろいろ調べたところ、`Server`と`Client`という、**サイド**の概念がForgeには存在しているらしい。で、それぞれのサイドでプログラムが実行されていることが分かった。[こちら](https://mcforge.readthedocs.io/en/latest/concepts/sides/)のリファレンスを参考にした。

## サイドの種類について
大体の認識だと、クライアントというものはプレーヤーに影響するもので、サーバーというものはマルチプレイをするときに接続するものだという認識だろう。

さてここで、この二つのサイドのあいまいな点を解説していこう。

### 物理サーバー
物理サーバーというのは、よく*dedicated server*(専用サーバー)といわれるものだ。専用サーバーは`minecraft_server.jar`のような種類のプログラム全体のことで、操作できる画面を持たない。

### 物理クライアント
物理クライアントというのは、Minecraftをランチャーから起動するプログラム全体のことだ。ゲームの描画や画面操作などを担っているすべてのスレッドやプロセス、そしてサービスは物理クライアントの一部だといえる。
### 論理サーバー
論理サーバーはゲームの統括をする。モブのスポーン、天候、インベントリの更新、モブの知能など、ゲームの仕組みすべてを担っている。論理サーバーは物理サーバーの中にあるものだが、シングルプレイのときは物理クライアントの中で論理クライアントと一緒に実行することができる。これは`Server Thread`という名前で実行される。
### 論理クライアント
論理クライアントはプレーヤーからの入力を受け取って、それを論理サーバーに送信する役目を持っている。加えて論理クライアントは論理サーバーから情報を受け取り、その情報をプレーヤーが見えるように画面に表示する。これは、`Client Thread`という名前で実行される。

## サイドに合わせたプログラムの実行
### `world.isRemote`
この真偽値はどちらのサイドでプログラムが実行されているかを調べるものである。この真偽値で調べられるのは、**論理**サーバーか**論理**クライアントかどうかだ。論理クライアントだったら`true`を返し、論理サーバーだったら`false`を返す。これは、物理サーバーでは常に`false`を返すため、物理クライアントの論理サーバーと値が被っている。原則、それが物理サーバーか論理サーバーか、この値からではわからない。
この真偽値の使いどころは、ゲームのルールやそのほかの仕組みを実行したいときである。例えば、

- あるブロックに触れている間は、ずっとダメージを受け続ける
- ある機械に土を入れると、それをダイヤモンドに変える

などである。これらは`world.isRemote`の値が`false`の時に実行するべきだ。これらを論理クライアントで実行してしまうと、論理サーバーとの整合性が取れなくなり、軽いバグの場合、モブのゴースト現象や体力の不一致などが発生する。重いバグの場合はゲームがクラッシュしてしまうこともある。

### `getEffectiveSide`
`FMLCommonHandler.getEffectiveSide()`は何らかの理由によって、`world.isRemote`が使えない時に使われる。これはどっちのサイドかを、**推測**する。なぜ推測かというと、これはスレッドの名前(`Server Thread`もしくは`Client Thread`)から、どちらのサイドかを判断するからだ。`world`が使用可能の時は、できるだけ`world.isRemote`を使うようにして、これはその方法が使えないときの代替手段として使うべきだ。

# 解決
なるほど、どうやらワールドのブロックなどの管理をしているのは論理サーバーらしいから、論理クライアントと論理サーバーで`world.createExplosion()`を実行してしまうと、サーバーにあるブロック情報とクライアントにあるブロック情報が食い違ってしまうから、ゴーストブロック現象が起こるらしい。爆発で破壊するブロックはランダムで決めているから、クライアントでは破壊したことになっているブロックもサーバーでは爆発を免れているかもしれない。ここで、存在しないブロックに対する当たり判定が発生していたのだ。よって、この問題の解決方法は、

```Java
if (!world.isRemote)
    world.createExplosion(...);
```
となる。当たり判定やゴーストエンティティで悩んでいるModderは論理サーバーのみ、論理クライアントのみでの実行を一回試してみたら幸せになれるだろう。