OmniAICreator/Qiita-1.07M huggingface dataset:
PHPにおける配列のarray()と[]の違い

# 概要
PHP5.4以降で`array()`の短縮構文として`[]`を使えるようになったがどちらがいいのか、またその理由や両者の違いを説明します
### ググり方
`[]`は日本語では`角括弧`、英語では`square brackets`といいます

# 違い
**可読性**

可読性は正義です。他の言語(JSなど)では配列の宣言として`[]`を使っています。なので`array()`ではなく`[]`の方が他の言語をメインとして使っている人も理解しやすいです。
また、`array()`だとこれは関数なのか、言語構成要素なのかなど実装に不要なことを考えることがありますが、`[]`だとそれがなく、コーディングの際の認知負荷も下がります。

**速度**
速度が早くなるのかと期待していたのですがこちらの記事によると速度には違いがないそうです
https://blog.leko.jp/post/benchmark-with-syntax-and-language-structure/

# 結論
`[]`を使いましょう
### PHP5.4以前なのだが？？？
PHP7.1ですらEOL(2020/1/3時点)なのでバージョン対応しましょう

### 謝辞
皆さんありがとうございました。
https://teratail.com/questions/230678#reply-336548
PostgreSQLをmacに導入する時に詰まったのでメモ

# 環境
mac OS Catalina 10.15.2

# 手順
homebrewで導入する
`$brew install postgresql`

導入されているかを確認

```
$postgres

postgres does not know where to find the server configuration file.
You must specify the --config-file or -D invocation option or set the PGDATA environment variable.
```

↓

```
postgresは、サーバー構成ファイルの場所を知りません。
--config-fileまたは-D呼び出しオプションを指定するか、PGDATA環境変数を設定する必要があります。
```

とのことだった

[公式ドキュメント](https://wiki.postgresql.org/wiki/Homebrew)によると

```
This install the command line console (psql) as well as the server, 
if you'd like to create your own databases locally.
 Run the following to start the server and login to it (it basically sets up a single "admin" user with your username, so that's who you'll be logged in as.

$ brew services start postgresql
$ psql postgres
```

↓

```
独自のデータベースをローカルに作成する場合は、コマンドラインコンソール（psql）とサーバーをインストールします。
 次のコマンドを実行してサーバーを起動し、ログインします
（基本的には、ユーザー名で単一の「admin」ユーザーを設定しますので、ログインするユーザーになります。
```
とのことだったので記載されていたコマンドを試してみる

```
$brew services start postgresql

==> Tapping homebrew/services
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-services'...
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 14 (delta 0), reused 7 (delta 0), pack-reused 0
Unpacking objects: 100% (14/14), done.
Tapped 1 command (43 files, 59.3KB).
==> Successfully started `postgresql` (label: homebrew.mxcl.postgresql)
```

```
$psql postgres
psql (11.5)
Type "help" for help.

postgres=# \q
```

でつかえるようになった
composer updateでThe "https://repo.packagist.org/packages.json" file could not be downloaded...

`composer update` を実行するとこんなエラーが発生

```
The "https://repo.packagist.org/packages.json" file could not be downloaded: php_network_getaddresses: getaddrinfo failed: Name or service not known
failed to open stream: php_network_getaddresses: getaddrinfo failed: Name or service not known
https://repo.packagist.org could not be fully loaded, package information was loaded from the local cache and may be out of date
```

## 原因調査
何が原因なのかを、`composer diag` で調べる

```
vagrant@localhost repo]$ composer diag
Checking composer.json: OK
Checking platform settings: OK
Checking git settings: OK
Checking http connectivity to packagist: OK
Checking https connectivity to packagist: OK
Checking github.com rate limit: OK
Checking disk free space: OK
Checking pubkeys: FAIL
Missing pubkey for tags verification
Missing pubkey for dev verification
Run composer self-update --update-keys to set them up
Checking composer version: OK
Composer version: 1.9.1
PHP version: 7.3.12
PHP binary path: /usr/bin/php
```

Checking pubkeys がFAIL となっていて、`composer self-update --update-keys` を促されているので、促されるまま実行。

```
[vagrant@localhost repo]$ composer self-update --update-keys
Open https://composer.github.io/pubkeys.html to find the latest keys
Enter Dev / Snapshot Public Key (including lines with -----): 
```

途中、Snapshot PublicKeyと、Tags PublicKeyを聞かれるので、下記から`---BEGIN PUBLIC...`から`END PUBLIC KEY----`までコピーしてそれぞれ張り付ける。
https://composer.github.io/pubkeys.html

再度 `composer diag`　実行したら、all OK!
composer updateも成功しました。

## 参考にさせていただきました。
http://laravel.hatenablog.com/entry/2014/08/23/095124
https://teratail.com/questions/188872
SHFILEOPSTRUCT構造体はx86プラットフォームだと30バイト

タイトルだけだとなんのコッチャですが。

## P/Invokeでやりがちな誤り

C#などでP/Invokeの定義を記述すると下記のように書いてしまいたくなりますが、__x86プラットフォームでは32バイトになり誤り__です。([こちら](https://qiita.com/mima_ita/items/f84e187d60b63074927f)から引用)

```cs
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct SHFILEOPSTRUCT
{
    public IntPtr hwnd;
    [MarshalAs(UnmanagedType.U4)]
    public int wFunc;
    public string pFrom;
    public string pTo;
    public short fFlags;
    [MarshalAs(UnmanagedType.Bool)]
    public bool fAnyOperationsAborted;
    public IntPtr hNameMappings;
    public string lpszProgressTitle;
}
```

## ネイティブの定義
 
`SHFileOperation`関数で使用する`SHFILEOPSTRUCT`構造体は、shellapi.hで下記のように定義されています。

```c
typedef WORD FILEOP_FLAGS;

...

typedef struct _SHFILEOPSTRUCTA
{
    HWND            hwnd;
    UINT            wFunc;
    PCZZSTR         pFrom;
    PCZZSTR         pTo;
    FILEOP_FLAGS    fFlags;
    BOOL            fAnyOperationsAborted;
    LPVOID          hNameMappings;
    PCSTR           lpszProgressTitle; // only used if FOF_SIMPLEPROGRESS
} SHFILEOPSTRUCTA, *LPSHFILEOPSTRUCTA;
typedef struct _SHFILEOPSTRUCTW
{
    HWND            hwnd;
    UINT            wFunc;
    PCZZWSTR        pFrom;
    PCZZWSTR        pTo;
    FILEOP_FLAGS    fFlags;
    BOOL            fAnyOperationsAborted;
    LPVOID          hNameMappings;
    PCWSTR          lpszProgressTitle; // only used if FOF_SIMPLEPROGRESS
} SHFILEOPSTRUCTW, *LPSHFILEOPSTRUCTW;
```

`fFlags`以外は、ポインターか`int`になっているのがポイントです。

shellapi.hの先頭でpshpack1.hをincludeしているため、パッキングアラインメントが1バイトになり`fFlags`より後は4バイト境界には配置されず、x86プラットフォームだと30バイトになります。

```c
#if !defined(_WIN64)
#include <pshpack1.h>
#endif
...
```

前述のP/Invokeの定義では32バイトになるため、誤りということになります。
(`fFlags`より後を使用しなければ、実害はないと思います。)


## 対応方法

[pinvoke.netに記載がある通り](http://pinvoke.net/default.aspx/Structures.SHFILEOPSTRUCT)、Pack=1を設定したx86用と、Packを設定しないx64用を2つ定義し、プラットフォームを判別して使い分ける必要があります。

実装としては[dotnet/runtime](https://github.com/dotnet/runtime/blob/4f9ae42d861fcb4be2fcd5d3d55d5f227d30e723/src/libraries/Microsoft.VisualBasic.Core/src/Microsoft/VisualBasic/Helpers/NativeMethods.vb#L43)あたりを見れば参考になるでしょう。
【Control.Monad.Trans】(1) Identityモナド


[Haskell/Monad transformers](https://en.wikibooks.org/wiki/Haskell/Monad_transformers)
[A Gentle Introduction to Monad Transformers](https://github.com/kqr/gists/blob/master/articles/gentle-introduction-monad-transformers.md)
[モナドトランスフォーマー・ステップ・バイ・ステップ](http://bicycle1885.hatenablog.com/entry/2012/12/08/165236)

---

[【Control.Monad.Trans】(1) Identityモナド - Qiita](https://qiita.com/sand/items/e88b798d8783606071c5)
[【Control.Monad.Trans】(2) StateTモナド - Qiita](https://qiita.com/sand/items/802b8c4a8ae19f04102b)
[【Control.Monad.Trans】(3) ExceptTモナド - Qiita](https://qiita.com/sand/items/fe3c29560136803e8b11)
[【Control.Monad.Trans】(4) ReaderTモナド - Qiita](https://qiita.com/sand/items/93d6ba75b0c4e39ce295)
[【Control.Monad.Trans】(5) IOモナド - Qiita](https://qiita.com/sand/items/ee3c19c191c87c32f867)


Monad transformersを中心に、モナドの基本的な事項をまとめてみました。(1)～(5)までの連載で、Monad transformersを試行していきます。実際にはそれぞれの回でIdentity, StateT, ExceptT, ReaderT, IO モナドを積み重ねていく例題を示しています。

Monad transformersについては、以下のサイトが表向きは最新といわれるものでしょうが、中身はControl.Monad.Transの方をimportしたりしているので、説明の都合上、Control.Monad.Transを使います。
[mtl - Hackage - Haskell](https://hackage.haskell.org/package/mtl)



最初はIdentityモナドです。Identityモナドはモナドトランスフォーマーにおいてbaseモナドの役割を負うことが多いものです。ですから他のモナドを紹介する前に、最初に定義だけ紹介しておきます。

# 1. Identityモナドの定義


[Data.Functor.Identity](
http://hackage.haskell.org/package/base-4.12.0.0/docs/Data-Functor-Identity.html)

Identity型は以下のように定義されます。

```haskell:
newtype Identity a = Identity { runIdentity :: a }
```

Identityモナドは以下のようなシンプルなものです。

```haskell:
instance Monad Identity where
    return   = Identity
    m >>= k  = k (runIdentity m)
```


# 1-1 Identityモナドのfailについて

[Control.Monad](https://hackage.haskell.org/package/base-4.12.0.0/docs/Control-Monad.html
)  -- Identityにはfailの明示的な定義が無いから、デフォルトの定義を継承します。

```haskell:
class Applicative m => Monad m where
    ---
    fail        :: String -> m a
    fail s      = errorWithoutStackTrace s
```


今回は以上です。
簡単なカウントアプリを作ってみる

# 簡単なカウントアプリを作ってみる。
株式会社パーソンリンクにエンジニア未経験入社の高島です。入社して2ヶ月が経ちました。
今後は、保守・運用業務がメインになっていくのですが、業務以外でインプットできる分野を増やそうと思いました。社内ではvue.jsを扱えるエンジニアが多数在籍しています。今後、自分も開発業務に参画した際に幅広く対応できるように、まずはjavascriptにて簡単なカウントアプリを作ってみました。
アップボタンを押すと数字が１ずつ増え、ダウンボタンを押すと数字が１つずつ減っていくという簡単なものです。

```html
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .wrapper {
            text-align: center;
        }
    </style>
</head>

<body>
    <div class="wrapper">
        <h1>カウンターアプリ</h1>
        <div id='counter'>0</div>
        <button id='count-up'>アップ</button>
        <button id='ten-up'>10アップ</button>
        <button id='count-down'>ダウン</button>
        <button id="ten-down">10ダウン</button>
    </div>

    <script>
        let counter = document.getElementById('counter');
        let up = document.getElementById('count-up');
        let down = document.getElementById('count-down');
        let tu = document.getElementById('ten-up');
        let td = document.getElementById('ten-down');
        count = 0;

        up.addEventListener('click', function () {
            count = count + 1;
            counter.innerHTML = count;
        });

        tu.addEventListener('click', function () {
            count = count + 10;
            counter.innerHTML = count;
        });

        down.addEventListener('click', function () {
            count = count - 1;
            counter.innerHTML = count;
        });

        td.addEventListener('click', function () {
            count = count - 10;
            counter.innerHTML = count;
        });

    </script>
</body>

</html>
```
## 解説
wrapperクラス内に、id属性でcounter,count-up(ボタン),count-down(ボタン)を作成する。
counter,count-up,count-downをjavascriptで扱いやすくするため、

```js
let counter = document.getElementById('counter');
let up = document.getElementById('count-up');
let down = document.getElementById('count-down');
```
と記述する。

```js
document.getElementById('id名');
```
で、**引数にhtmlで記述したid名を指定することによって、要素を取得することができる。**

```js
up.addEventListener('click', function () {
            count = count + 1;
            counter.innerHTML = count;
        });

```
は、upという要素に対して、「クリック」というイベントが行われた時に、
countという要素に1をプラスする。
ただ1をプラスしていくだけだと画面上に表示されないので、

```js
counter.innerHTML = count;
```
とすることによって、htmlのid属性で記述したcounter内に、countを代入することができる。つまり、画面上に1をプラスした結果を表示することができる。

```js
対象要素.addEventListener(イベントの種類.function(){})
```

```js
 down.addEventListener(‘click’, function () {
            count = count - 1;
            counter.innerHTML = count;
        });
```
これも、upの時と同じで、downという要素に対して、「クリック」というイベントが行われた時に、countという要素から1をマイナスする。

完成形はこのようになります。
<img width="576" alt="922abfea70beee4d5b63c4df58121af5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499375/f6c97935-d124-7a24-6685-ff85b5a4aac3.png">
[Flutter] FlipCardを使ってカード型のWidgetを回転させてみる

## やりたいこと
カード型のWidgetをタップするといい具合にアニメーションつけて裏側を表示するように回転したい。

## 使用したライブラリ
[flip_card](https://pub.dev/packages/flip_card)

### pub get
1. pubspec.yamlに「flip_card: ^0.4.4」を追記して``` flutter pub get ```する
2. dartソースに```import 'package:flip_card/flip_card.dart';```を追記する

## 実装
``` dart
FlipCard(
  front: Card(...), // カード前面に表示するWidget
  back: Card(...), // カード背面に表示するWidget
  direction: FlipDirection.HORIZONTAL, // カード回転向き(HORIZONTAL:横<デフォルト>, VERTICAL:縦)
  flipOnTouch: true, // タッチ可否(true:カード部タップで回転する<デフォルト>, false:タップしても回転しない)
  speed: 500, // 回転スピード(500ミリ秒<デフォルト>)
  onFlip: () {}, // タップイベント
  onFlipDone: (isFront) {}, // タップイベント(前面かどうかbool値で判断できる) 
)
```

## サンプル
### 横回転
<img width="375" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143861/9a37d1ae-6003-7f21-cf13-b51320569884.gif">

### 縦回転
<img width="375" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143861/bd687ea1-ae43-04cb-adcc-d001b1aba5ef.gif">

## 実装サンプル
https://github.com/unbam/flip_card_sample

## (おまけ)カード部分をタップではなくアイコンなどの別Widgetをタップすると回転するようにしたい
GlobalKeyを設定してtoggleCardメソッドを実行する。

``` dart
final cardKey = GlobalKey<FlipCardState>();

FlipCard(
  key: cardKey, // キーを設定
  front: Card(
    child: IconButton(
      icon: Icon(Icons.compare_arrows),
      onPressed: () => cardKey.currentState.toggleCard(), // 回転イベント実行
    )
  )
)
```
Simulink API (4) Simulink APIを使う"目的"と前回の続き

# Simulink APIを取り上げる目的

Qiitaでは、Simulink APIに関する記事を少しずつアップしていこうと思っています。
その理由は以下の "目的" を満たすために必要な知識だと考えられるからです。

1. モデル設計・検証の自動化
2. モデル設計資産の管理の自動化

特に量産設計においては、要求に基づいたモデルが書けている(ロジックとして正しい)ことは大前提として、可読性、検証容易性、要求とのトレーサビリティ、モデルの再利用性、生成コードの効率など、様々な観点に配慮する必要があります。
それらを目で見て、手で対処していては、時間も掛かりますし、抜け漏れがどうしても発生します。そういった作業を効率的かつ、確実に実施するためのテクニックだと考えているからです。


# 前回の続き
[Simulink API(3)モデルの主要3要素](https://qiita.com/stozaki/items/c4e56c35eacd0f8a80a1) では、Simulinkモデル(以下モデル)を構成する主な3要素として、Block、Port、Lineを挙げました。

勿論、モデルには他にも様々な構成要素があります。Configuration、Data Dictonary、Simulink Data Object(SDO)、等など。
では何故、Block、Port、Lineを挙げたのか?というと、この3要素は相互に関係しており、この関係性を理解していると以下のようなポイントを抑えることができます。

1. モデルの構造をプログラムで把握できる。
2. 効率良くプロパティへアクセスできるようなプログラムが書ける。

では、その関係性を図で示したいと思います。
![API4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324583/ae2ed1b6-375e-ba89-ea49-57d4fa4862fd.png)

これは、モデルのブロックダイアグラムを見て頂ければ至極当然なのですが、Block⇒Port⇒Signal⇒Port⇒Block・・・となっているのが、そのままプロパティの関係性でも成立していることを表しています。
この関係性を利用することで、プログラム手順を考えていくことが出来るようになり、モデルの構造を把握し、効率良くプロパティへアクセスができるようになります。

# まとめ
1. [前回](https://qiita.com/stozaki/items/c4e56c35eacd0f8a80a1)説明したBlock、Port、Lineは各々が関係しあっている。
2. 1の関係性を理解することで、モデルの構造を把握し、効率良いプロパティアクセスが可能となります。

今後、もう少し基本をまとめてから、実例を挙げていきたいと思います。

## 補足
MATLAB R2018a以降では、ブロックの主要プロパティの取得コマンド例は、"プロパティインスペクター"から "Script Reference" として確認することができます。
![API6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324583/60389229-b9ee-05ab-951b-6a86fd1e2098.png)
boto3でEC2リソースへのタグ付けをDryRun実行すると必ず例外が発生する(DryRunOperation)

# 起こったこと
- boto3でEC2リソースへのタグ付けをDryRun実行したとき以下の例外が発生した。
- RDS等も同じことが起こるかは確認していません。

```
Traceback (most recent call last):
  File "main.py", line 29, in <module>
    Tags=[{'Key': 'isDefaultVpc', 'Value': 'true'}]
  File "/Users/Saori_/.anyenv/envs/pyenv/versions/3.7.3/lib/python3.7/site-packages/botocore/client.py", line 357, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/Users/Saori_/.anyenv/envs/pyenv/versions/3.7.3/lib/python3.7/site-packages/botocore/client.py", line 661, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (DryRunOperation) when calling the CreateTags operation: Request would have succeeded, but DryRun flag is set.
```

- 最後の行に注目
- 「リクエストは成功するだろうけどDryRunフラグが付いてるよ」

```
botocore.exceptions.ClientError: An error occurred (DryRunOperation) when calling the CreateTags operation: Request would have succeeded, but DryRun flag is set.
```

# なぜコケたか
- DryRunのリクエストを受けたEC2のAPIは、リクエストそのものが成功してもHTTPStatusCode:412を返す
- botocoreはAPIリクエストに対するレスポンスのHTTPStatusCodeが2xx以外だと例外が発生する仕様になっている

# 対処
- よしなに例外処理する

```:python3
import boto3
from botocore.exceptions import ClientError

try:
    boto3.client('ec2').create_tags(
        DryRun=True,
        Resources=['vpc-xxxxxxxx'],
        Tags=[{'Key': 'isDefaultVpc', 'Value': 'true'}]
    )
except ClientError as e:
    if 'DryRunOperation' != e.response['Error']['Code']:
        raise
```


ちなみに帰ってくるレスポンスの中身(e.response)は以下のようなものでした。

```
{'Error': {'Code': 'DryRunOperation', 'Message': 'Request would have succeeded, but DryRun flag is set.'}, 'ResponseMetadata': {'RequestId': 'hoge-703b-4928-9402-da2b5e9d2b5f', 'HTTPStatusCode': 412, 'HTTPHeaders': {'transfer-encoding': 'chunked', 'date': 'Fri, 03 Jan 2020 13:55:23 GMT', 'server': 'AmazonEC2'}, 'RetryAttempts': 0}}
```

# 参考リンク

- https://botocore.amazonaws.com/v1/documentation/api/latest/client_upgrades.html#error-handling
- まんま書いてありました。ありがたや↓
- [When a client sets test=True, the same class of error is raised as for a failure? #842](https://github.com/boto/botocore/issues/842)
UbuntuでSSD抹消（トリムを使う簡易版）

本来はSecure Eraseを使ったほうがよいのですが、トリムで簡単に消す方法です。Ubuntu19.10で動作確認をしています。

まず、SSDのIDを確認します。

```
ls -la /dev/disk/by-id
```

次にそのIDのSSDにFAT32の単一パーティションを作成して、トリムをかけます。

```
dev="/dev/disk/by-id/<ID>" &&
mnt="/mnt" &&
sudo sgdisk -Z "$dev" &&
sudo sgdisk -o -a 8 -n 1:40: -t 1:0700 "$dev" &&
sleep 1s &&
sudo mkfs.vfat -F 32 "${dev}-part1" &&
sudo mount "${dev}-part1" "$mnt" &&
sudo fstrim -v "$mnt" &&
sudo umount "$mnt"
```
pythonでMongoDB入門するときの設定

データ解析用によく使われているデータベースMongoDBの設定方法を記録しています。

# ダウンロード

ダウンロードリンク → https://www.mongodb.com/download-center/community

<br>

# インストールの設定
パスの設定は `C:\mongodb` に設定（`C:\Program Files` ではない）

インストールは  `Complete`ではなく `Custom` に設定、`Cドライブ`の下に新しいフォルダーを作る。↓
[![Image from Gyazo](https://i.gyazo.com/8f63c07e1db35f02941a00c343ff0c7d.png)](https://gyazo.com/8f63c07e1db35f02941a00c343ff0c7d)


インストールは約5分かかる。

インストールができたら、`C:\mongodb\data`フォルダーを作っておいてください。

<br>

# サーバーを起動する方法

`cd C:\mongodb\bin` でダイレクトリーを移動し、
(これからよく使う方は`C:\mongodb\bin`を環境係数に登録してもいいかもしれません)


データぱすの登録としてサーバーを起動する：
`mongod.exe --dbpath C:\mongodb\data`


以下の画面が出れば成功

[![Image from Gyazo](https://i.gyazo.com/800089d192ed90ab7481d29b1294d490.gif)](https://gyazo.com/800089d192ed90ab7481d29b1294d490)

よく失敗してしまう理由は`C:\mongodb\data`が作成されないからなどにあると思います。


<br>

# GUIでMongoDB の中身を確認する

MongoDB GUI の接続先は `mongodb://localhost:27017/` に設定する。（サーバーが立ち上げないとと当然エラーが発生）

( `mongodb:// ` は必要、Port番号`27017`はデフォルトの設定)


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

<br>

接続ができたら、データベーステーブルの画面が出れば成功。
（初めて起動するときはなにもないはずなので参考までにしてください）

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

<br>


# Python で試す

**Qiita** : [pythonでMongoDBを操作する](https://qiita.com/Syoitu/items/db192385a4b2e4884ed5#python%E3%81%A7mongodb%E3%82%92%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8B)はとてもわかりやすいので確認してみてください。

毎回Pythonで接続する前に、必ずサーバーを立ち上げておいてください。

<br>

# 参考

YouTube－MongoDB In 30 Minutes
https://www.youtube.com/watch?v=pWbMrx5rVBE

Qiita - pythonでMongoDB入門しようhttps://qiita.com/Syoitu/items/db192385a4b2e4884ed5#%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
PHP7.4の性能比較  一億回のループとDB500万件からの検索

#PHP7.4の性能比較を行ってみました。

現在契約しているレンタルサーバーのグレードをアップしようかなと思い、
ついでと言っては何ですが、どの程度性能が上がるかを確認するために、
PHPそれぞれのバージョンで性能を比較してみました。


比較対象としたバージョンは以下の通りです。
■5.6.40
■7.0.33
■7.1.31
■7.2.21
■7.3.9
■7.4.1

処理としてはPHPでは1億回の単純な足し算をfor文でぶん回す事と
DBはMarriaDBですが、インデックスが貼られていないテーブルから500万行より
適当な文字列の検索を行ってみました。

実行結果としてはこのような感じになりました。

|バージョン|php処理時間|MySQL処理時間|
|:--|--:|:--:|
|5.6.40|10.96秒|3.21秒|
|7.0.33|04.90秒|3.06秒|
|7.1.31|04.56秒|3.06秒|
|7.2.21|03.17秒|2.72秒|
|7.3.9|02.50秒|3.15秒|
|7.4.1|02.10秒|3.11秒|

この結果より導き出される事は以下三点です。

###DBの処理はPHPのバージョンに依存しない
処理時間の差については誤差の範囲です。
###5.X系はすぐにでも7.x系にかえましょう
雲泥の差です。
###7.x系は大差なしです。
確かにバージョンが上がるたびに処理速度が上がっています。
しかし、この処理はこのような計算です。
```
$j=0;
for ( $i = 0; $i < 100000000; $i++ ) {
$j=$j+$i;
}
```
何かコードを描く際に1億回ものループ処理を行うことって通常は無いですよね？
あっても100回～1000回程度だと思います。
コンマ何秒の世界を生きているわけではないのであれば無理してバージョンアップをする必要はないですね。
【Go】データベース操作

Goでデータベースを操作（CREATE・SELECT・UPDATE・DELETE・SELECT）する記述をメモします。

##CREATE文

```go
func main() {
	//DB接続
	DbConnection, _ := sql.Open("sqlite3", "./example.sql")
	defer DbConnection.Close()

	//CREATE文
	createCmd := `CREATE TABLE IF NOT EXISTS person(
				name STRING,
				age INT
			)`
	_, err := DbConnection.Exec(createCmd)
	if err != nil {
		log.Fatalln(err)
	}
}
```

##INSERT文
```go
	insertCmd := "INSERT INTO person (name, age) VALUES (?, ?)"
	_, err = DbConnection.Exec(insertCmd, "John", 20)
	if err != nil {
		log.Fatalln(err)
	}
```

##UPDATE文
```go
	updateCmd := "UPDATE person SET age = ? WHERE name = ?"
	_, err = DbConnection.Exec(updateCmd, 30, "John")
	if err != nil {
		log.Fatalln(err)
	}
```

##DELETE文
```go
	deleteCmd := "DELETE FROM person WHERE name = ?"
	_, err = DbConnection.Exec(deleteCmd, "John")
	if err != nil {
		log.Fatalln(err)
	}
```

##SELECT文(複数行) 
```go
var DbConnection *sql.DB

type Person struct {
	Name string
	Age  string
}

func main() {
	//DB接続
	DbConnection, _ := sql.Open("sqlite3", "./example.sql")
	defer DbConnection.Close()

	//この場合はテーブル名が固定の場合のSELECT文
	selectCmd := "SELECT * FROM person"

	//この場合はテーブル名を指定する場合のSELECT文
	tableName := "person"
	selectCmd := fmt.Sprintf("SELECT * FROM %s", tableName)
	
	//DBのデータを取得してStructに入れる
	rows, _ := DbConnection.Query(selectCmd)
	defer rows.Close()
	var people []Person
	for rows.Next() {
		var p Person
		err := rows.Scan(&p.Name, &p.Age)
		if err != nil {
			log.Fatalln(err)
		}
		people = append(people, p)
	}

	//Structから取り出して表示
	for _, p := range people {
		fmt.Println(p.Name, p.Age)
	}
}
```

##SELECT文(一行のみ)
```go
var DbConnection *sql.DB

type Person struct {
	Name string
	Age  string
}

func main() {
	//DB接続
	DbConnection, _ := sql.Open("sqlite3", "./example.sql")
	defer DbConnection.Close()

	//SELECT文
	oneSelectCmd := "SELECT * FROM person WHERE name = ?"
	row := DbConnection.QueryRow(oneSelectCmd, "John")
	var p Person
	err = row.Scan(&p.Name, &p.Age)
	if err != nil {
		if err == sql.ErrNoRows {
			log.Fatalln("No row")
		} else {
			log.Fatalln(err)
		}
		log.Fatalln(err)
	}
	//１行表示
	fmt.Println(p.Name, p.Age)
}
```
Rack入門 概念編 (1/3)

RailsやSinatraなどのRuby製Webフレームワークを利用されている方は、Rackというキーワードを一度は目にしたことがあるのではないでしょうか。

よく聞くけど詳しくは知らない、そんなやつがRackです。

今回は自分の知識の整理も兼ねて、Rackとは何ものなのかについて調べたメモを、ここに残します。長かったので、全3回に分割しています。

## 目次

1. [本記事] [Rack入門 概念編(1/3)](https://qiita.com/nishio-dens/items/e293f15856d849d3862b
)
1. [Rack入門 Rack Application編 (2/3)](https://qiita.com/nishio-dens/items/852d7604b34d20514a70)
1. [Rack入門 Rack Middleware編 (3/3)](https://qiita.com/nishio-dens/items/8011842f50995f46eafe)


## Rackとは何か。ひとことで

- Webアプリケーションサーバーとアプリケーションを接続するための標準化されたインターフェースのこと


## Rackとは何か。詳細

[Rackの公式リポジトリ](https://github.com/rack/rack)では、Rackは以下のように記載されています。

```
a modular Ruby webserver interface

訳) モジュール化されたRuby Webサーバーインターフェース
```

そして、 `Supported web servers` として PumaやUnicorn が上げられています。

このWebサーバーという表現はいろいろとややこしいので、本稿ではPuma/Unicornのことは **アプリケーションサーバー(アプリサーバー)** と呼びます。

Rackはなぜ必要なのか。その前に基本的な概念についておさらいします。

### アプリケーションサーバーとは

アプリケーションサーバーって、なんでしたでしょうか。
ここで一度振り返っておきます。

Webサーバー、アプリサーバーの代表的なソフトウェアは以下のとおりです。

- Webサーバー
  - nginx, apache など

- アプリケーションサーバー
  - Rubyでは Puma, Unicorn など
  - JavaではTomcat など


Webシステムの多くは、いわゆる3層アーキテクチャと呼ばれる構成で設計されており、Webサーバーとアプリサーバーは別に運用します。
以下のような概念図をよく目にするのではないでしょうか。


![rack01_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12701/9581ec30-caab-1706-4798-a3af1374db87.png)


DBサーバーについては、今回は関係ないので説明を割愛します。

別にこの構成に従わなくてもウェブシステムは運用できますが、システムの性能を引き出すために3層アーキテクチャを採用することが多いです。

#### Webサーバー

Webサーバーは、ユーザーからのリクエストを受け取り、処理結果をレスポンスとして返すソフトウェアのことです。

受け取ったリクエストはWebサーバー自身が処理することもありますし、そのまま処理をアプリサーバーに委譲することもあります。
静的なコンテンツ(画像やファイル)は、Webサーバーでデータを引っ張ってきて返すことが多いです。
ビジネスロジックはRubyなどで書いたアプリに処理を委譲して、処理結果をレスポンスとして返すことが多いです。

nginxなどのWebサーバーは、大量のアクセスが来ても素早く効率的にさばくための機構を持っています。
またSSL通信やデータを圧縮して返すなど、Webの面倒事を引き受けてくれるソフトウェアです。

#### アプリケーションサーバー

アプリサーバーは、アプリをあらかじめ起動しておき、リクエストが来たらすばやく処理をするためのサーバーです。

アプリサーバーがないと、どうなるでしょうか。

昔のWebシステムでは、アプリサーバーは立てませんでした。
CGI全盛期は、Webサーバーにリクエストが来た後、プログラムを都度起動していました。
リクエストのたびにプログラムの起動から始めるというのは、巨大なアプリケーションになればなるほど起動コストが無視できないですよね。

なので、あらかじめプログラムをメモリ上に読み込んでおき、アクセスが来たら処理を高速に返せるようアプリサーバーを用意します。

PumaやUnicornなどのアプリサーバーは、Webサーバーとしての最低限の機能も持っています。
Webサーバーを立てずにPumaだけでもシステムを運用できます。
ただ、大量のアクセスを効率的にさばくことはPuma単体ではできない(そこはWebサーバーの役割としている)ので、一般的には前段にWebサーバーを立ててリクエストを処理をします。


### Rackはどこで使われ、なぜ必要か

Rackはアプリサーバーとアプリ(Webフレームワーク)間のデータのやり取りに利用します。

PumaやUnicornといったアプリサーバーは、特定のアプリ専用(たとえばRails専用)というわけではなく、RackのプロトコルにしたがっているWebフレームワークであれば何でも利用できます。


![rack01_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12701/f473781f-7993-0610-21b6-874b8baeae24.png)


Rackに対応しているRuby製のフレームワークは、Railsの他にSinatra, Padrino, Hanamiなどがあります。

アプリサーバーとアプリ間の通信仕様を定めておく(=インターフェースの標準化をしておく)ことで、
**アプリサーバーとアプリケーションフレームワークの組み合わせを自由に変えることができます**。
Rails専用のアプリサーバーを作る、Sinatra専用のアプリサーバーを作るっていうのは大変ですよね。


アプリ・フレームワーク間の標準インターフェースを作るという流れは、PythonのWSGI(Web Server Gateway Interface)がはじめました。

PythonはもともとWebフレームワークとフレームワーク専用のアプリサーバーが乱立していましたが、WSGIはアプリとサーバーのその組み合わせを自由に変えられるよう標準インターフェースを定めました。
これにより、移植性の高いアプリサーバー/フレームワークを作ることができるようになりました。

Rackの細かいところはWSGIと異なりますが、このWSGIの影響を強く受けています。


## まとめ

- アプリサーバーとは、アプリをあらかじめ起動しておきレスポンスを高速に返すためのサーバー
- Rackはアプリサーバーとフレームワーク(アプリ)間のインターフェースを定めている
- Rackのプロトコルに従うことで、アプリサーバーとWebフレームワークの組み合わせを自由に変えることができる
【Rails】Strong Parameters


## Mass Assignment
複数のカラムをまとめて指定すること

``` user_controller.rb
user = User.new(email: "hoge@email.com", password: "hoge")
```

## Strong Parameters
許可されたカラムのみ使えるようにすること

* `require` 必須とする属性 なければ例外となる
* `permit` 許可する属性 全て揃ってなくとも良い

``` user_controller.rb
private
  def user_params
    params.require(:user).permit(:email, :password)
  end
```


## リンク
* [Strong Parameters - Railsガイド] (https://railsguides.jp/action_controller_overview.html#strong-parameters)
* [GitHub、Mass Assignment利用の脆弱性を突かれる] (https://www.infoq.com/jp/news/2012/03/GitHub-Compromised/)
2足歩行ロボットの製作2（Microbit、サーボモータ使用、歩行プログラム）

Microbitを使た2足歩行ロボットの前進歩行プログラムを作成しました。

・2足歩行のメカ部分についてはこちらを参照してください。
[2足歩行ロボットの製作1（Microbit、 サーボモータ使用）](https://qiita.com/Gyutan/items/62ceeb4464543b2ecaf2)
・サーボモータを動かすボードは、DFrobotのボードを用いました。
[Micro:bit Driver Expansion Board SKU:DFR0548](https://www.dfrobot.com/wiki/index.php/Micro:bit_Driver_Expansion_Board_SKU:DFR0548#More_Documents)

###2足歩行ロボット用　前進プログラム

モータの配置とボードへの接続端子は、下図の通りです。
![Servo_position2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165987/c2f55129-f673-23d8-5a55-7922cfc368ab.png)
※この図は、Draw.ioというフリーソフト（ブラウザーで動く）を用いています。（便利です。）
[draw.io](/https://www.draw.io/)
![syoki.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165987/08f71915-c5a0-ce97-4138-f50198bb8196.jpeg)


ロボットを前進させるには
（1）片方の足を傾け、重心を傾けた足の方に移動させます。
（2）腰を回転させ、浮いた方の足を前に出します。
（3）浮いた方の足を地面につけるために、傾けた足を元に戻します。
これを繰り返すことで前に進むことができます。

（1）の動作の写真
![f1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165987/61b35755-22f4-68ee-a35f-e1582d50125c.jpeg)
（2）の動作の写真
![f2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165987/b3a012c0-ff85-1c74-3c13-0ccbecb95113.jpeg)

（3）の動作の写真
![f3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165987/76e54121-798b-86fc-065d-53885cea2f53.jpeg)

Microbitで作成したプログラムは、半歩前に移動するプログラムです。上記の写真（3）では、左足が前に出た状態です。右足を半歩前に出して（1）と同じ状態（移動した後両足が前面揃った状態）になります。
左足から動かすプログラムと右足から動かすプログラムを作成しています。
![walk_foword.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165987/75addae8-cd53-dd4e-caaa-f54b31e7eec1.png)

###使い方
サーボモータを図に従って、ボードのS1からS4に接続します。
Aボタンを押すと前進します。

### プログラム概略説明
変数は7個あります。
ilF:初期左下足の値（S1）
iLL:初期左上足の値（S2）
iRF:初期右下足の値（S3）
iRL:初期右上足の値（S4）
前回の調整プログラムで調べた値を入れてください。これが原点になります。
slope:下足を傾ける角度
haba:腰（上足）を回転させる角度
wait:待機時間

`最初だけ`では、すべてのモータを基準位置に設定します。
rhwalk関数は、右足を最初に傾けて左足を半歩前に出し、つま先をそろえるプログラム。
lhwalk関数は、左足を最初に傾けて右足を半歩前に出し、つま先をそろえるプログラム。
Aボタンを押すことで、このプログラムを逐次実行します。
waitを大きくすることで、動作を確かめることができます。

#### rhwalk関数の詳細

（1）右下足（S3）を傾けて、重心を右足に乗せます。
（2）左下足（S1）を傾けて重心移動をサポートします。（傾きの2倍にしていますが、この動作はいらないかもしれません。）
（3）右上足（腰の部分を）（S4）回転させます。
（4）左上足（S2）を回転させただけ反対側に回転させ、左上足を正面に向くようにします。
（これ以降、モータの番号だけで説明します。）
（5）S1を初期位置に戻します。
（6）S2を初期位置に戻します。
ここまでで、左足が前進しているはずです。この次は反対側から動かします。	
（7）S1を傾けます。
（8）S3を2倍傾けて、重心移動をサポートします。（この動作は不要かもしれません）
（9）S2を初期位置に戻します。
（10）S4を初期位置に戻します。
（11）S3を初期位置に戻します。
（12）S1を初期位置に戻します。
これで、半歩進んで、つま先がそろった状態になります。
lhwalk関数はS1から傾けて、同じような動作を行うプログラムです。

1歩前に進む、右に曲がる、左に曲がる、後ろに下がる、横に移動するなどのプログラムを作っていきたいと思います。
【Unity】ARで何か表示してみようと思ったけど結局躓いて解決できなかった件【Vuforia】

#テスト環境
・PC:Windows10
・Unity 2019.2.5f1
・Unity 2018.1.9f2
・Vuforia 8.6.7
・Xperia Z3

#Vuforiaのインストールから諸々
ネットで色々なところから情報をかき集め、デベロッパー登録やらなんやらを済ませた。
参考にさせてもらった記事とか
https://xr-hub.com/archives/8508
http://pg-box.jp/blog/20140909/ar#AR-3
https://qiita.com/broken55/items/12144825ea1e8b8822b3

#躓いたこと
使ったことある人ならわかると思いますが、大体書いてあることはどこも一緒で、登録したらキー発行してここに入れましょうねーとか、ヒエラルキーはこうしましょうねーというところだったのでそこは迷わずできた。
どうしても解決できなかったのは、ARCameraを一つしかヒエラルキーに置いていないのに、twocameraなんちゃらーっていうエラーが出る。
調べてみると、カメラは一つしか使えませんみたいなエラーらしく、英語で質問しているページがあったので翻訳をして調べてみたが結局直し方まではたどり着けず…

Unity公式からサンプルが出ているっぽかったのでそれを流用して作ってしまおうかなとも思ったんですが、バージョン的に対応していないのか、いろんなバージョンでインポートしてもエラー吐きまくりとか…

技術力不足で解決に至りませんでした。

次はARKitとか使ってみようと思います。
解決策知っている人がいたら教えてください。
varとletの違いは２つある

##はじめに
「javascriptの変数宣言は"let"で行え！」と言われているので素直に従っていましたが、
改めてなぜ"var"を使わない方が良いかをまとめてみます。

###(1)letは変数の重複を許可しない

#####varで同名の変数を宣言してみます。

```var.js
var name = "hoge"
var name = "fuga"

console.log(name);
```
######\>>fuga

上書きされて二つ目の宣言の"fuga"が出力されました。


#####同じくletでも同名の変数を宣言してみます。

```let.js
var name = "hoge"
var name = "fuga"

console.log(name);
```
#####\>><font color="Red">Uncaught SyntaxError: Identifier 'name' has already been declared</font>

既に宣言済みだよとのエラーメッセージが出力されました。

#####※letは変数の再宣言ができないため、変数の重複が起こらないという利点があります。

###(2)letはブロックスコープを認識する。

大前提として、javascriptはブロックスコープを認識しません。

下記をご覧ください。

```var.js
if(true){
    var i = 5;
}

console.log(i);
```
######\>>5

JAVAやC#などのプログラミング言語を学習してきた方からすれば違和感を覚えるかもしれませんが、javascriptのvar命令はブロックスコープを認識しません。

そして、一般的にプログラミングのルールとして「スコープはできる限り限定すべき」というものがあります。そのルールに即した命令がlet命令です。

```let.js
if(true){
    let i = 5;
}

console.log(i);
```

#####\>><font color="Red">usestrit.html:11 Uncaught ReferenceError: i is not defined</font>

##まとめ
①変数の重複を防ぐため
②スコープの範囲を限定するため

上記2点を理由にvarよりletを使う方が好ましいです。

注）限定的にvarを使った方が良い場面もありますが、あまり登場しないのでとりあえずletを使う方が良いでしょう。
##参考
[改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで](https://www.amazon.co.jp/%E6%94%B9%E8%A8%82%E6%96%B0%E7%89%88JavaScript%E6%9C%AC%E6%A0%BC%E5%85%A5%E9%96%80-%E3%83%A2%E3%83%80%E3%83%B3%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%81%AB%E3%82%88%E3%82%8B%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E7%8F%BE%E5%A0%B4%E3%81%A7%E3%81%AE%E5%BF%9C%E7%94%A8%E3%81%BE%E3%81%A7-%E5%B1%B1%E7%94%B0-%E7%A5%A5%E5%AF%9B/dp/477418411X/ref=sr_1_1?adgrpid=60120324664&gclid=CjwKCAiA6bvwBRBbEiwAUER6JaEYiHw-Iq3uV1zlj3FOuuZV6Q2-Vq4-G9YW0I-Xar7OBBSWWRxstRoChN8QAvD_BwE&hvadid=338518119513&hvdev=c&hvlocphy=1009243&hvnetw=g&hvpos=1t1&hvqmt=e&hvrand=18227703692906044844&hvtargid=aud-759377471893%3Akwd-332716054270&hydadcr=27268_11561171&jp-ad-ap=0&keywords=javascript+%E6%9C%AC%E6%A0%BC%E5%85%A5%E9%96%80&qid=1578057550&sr=8-1)
【SQL】メモ5(ある順番で表示(ORDER BY)、結合(INNER JOIN))、結合(UNION)


##目的
SQL忘却防止

[メモ1](https://qiita.com/knowledge87sun/private/fd507c7734fae07b5aaf)で使用しているテーブルを引用。

##1.ある項目の順番で表示(SELECT ORDER BY)
__形式:__
*__SELECT 項目1,,,項目N FROM テーブル名 ORDER BY 項目1 表示順,,項目K 表示順__*

```sql
-- type0を基準に並べ替える
SELECT * FROM tbl_dino
 ORDER BY type0;
```
###実行結果

|id|dname0|type0|n_src1|type1|n_src2|type2|
|---|---|---|---|---|---|---|
|6|ティラノサウルス|epic|0||0||
|9|ノドパトサウルス|epic|4|rare|3|normal|
|12|ケントロサウルス|epic|0||0||
|14|ステゴケラトプス|epic|13|rare|2|normal|
|17|エルリコサウルス|epic|0||0||
|23|アンキロサウルス|epic|0||0||
|1|ベロキラプトル|normal|0||0||
|2|ステゴサウルス|normal|0||0||
|3|アパトサウルス|normal|0||0||
|10|ドラコレックス|normal|0||0||
|11|アンキロサウルス|normal|0||0||
|15|トリケラトプス|normal|0||0||
|18|イリタトル|normal|0||0||
|19|スコミムス|normal|0||0||
|4|ノドサウルス|rare|0||0||
|7|ユタラプトル|rare|0||0||
|13|トリケラトプス|rare|0||0||
|20|スコタトル|rare|19|normal|18|normal|
|8|インドミナスレックス|regend|6|epic|1|normal|
|16|ドラコケラトプス|regend|15|normal|10|normal|
|21|ステゴディアス|regend|9|epic|2|normal|
|24|アンキトロサウルス|regend|23|epic|12|epic|

##1-2.準備

```sql
-- 非ハイブリッド恐竜を定義
CREATE TEMPORARY TABLE tmp_nohibrid as
 SELECT T1.id,T1.type0,T1.dname0
 FROM tbl_dino T1
 WHERE T1.n_src1 = 0 AND T1.n_src2=0;
```
表示

|id|type0|dname0|
|---|---|---|
|1|normal|ベロキラプトル|
|2|normal|ステゴサウルス|
|3|normal|アパトサウルス|
|4|rare|ノドサウルス|
|6|epic|ティラノサウルス|
|7|rare|ユタラプトル|
|10|normal|ドラコレックス|
|11|normal|アンキロサウルス|
|12|epic|ケントロサウルス|
|13|rare|トリケラトプス|
|15|normal|トリケラトプス|
|17|epic|エルリコサウルス|
|18|normal|イリタトル|
|19|normal|スコミムス|
|23|epic|アンキロサウルス|

##2.テーブルの内部結合(INNER JOIN)

```sql
SELECT T1.id
,T1.dname0
,T1.type0
,T2.dname0 as dname1
,T1.type1
,T3.dname0 as dname2
,T1.type2
 FROM tbl_dino T1
 INNER JOIN tmp_nohibrid T2
 on T1.n_src1=T2.id
 INNER JOIN tmp_nohibrid T3
 on T1.n_src2=T3.id;
```
__実行結果__

生成元1と生成元2の恐竜名が表示。
数字で管理されている項目をユーザーにわかりやすく見せるために、
よく使うタイプのSQLかもしれない。

|id|dname0|type0|dname1|type1|dname2|type2|
|---|---|---|---|---|---|---|
|8|インドミナスレックス|regend|ティラノサウルス|epic|ベロキラプトル|normal|
|9|ノドパトサウルス|epic|ノドサウルス|rare|アパトサウルス|normal|
|14|ステゴケラトプス|epic|トリケラトプス|rare|ステゴサウルス|normal|
|16|ドラコケラトプス|regend|トリケラトプス|normal|ドラコレックス|normal|
|20|スコタトル|rare|スコミムス|normal|イリタトル|normal|
|24|アンキトロサウルス|regend|アンキロサウルス|epic|ケントロサウルス|epic|

###UNION(結合)
===>特徴は、2つのselect結果がお互いの情報を含まない集合であること

例：epicという種類を含む恐竜の種類を表示
１．非ハイブリッド種のepic
２．ハイブリッド種で、生成元がepic
この2種類のSQLを結合

```sql
SELECT * FROM tbl_dino
 WHERE type0='epic' AND n_src1=0 AND n_src2=0
 UNION
 SELECT * FROM tbl_dino
 WHERE type1='epic' or type2='epic'
 ORDER by n_src1,n_src2;
```
__実行結果__

|id|dname0|type0|dname1|type1|dname2|type2|
|---|---|---|---|---|---|---|
|6|ティラノサウルス|epic|0||0||
|12|ケントロサウルス|epic|0||0||
|17|エルリコサウルス|epic|0||0||
|23|アンキロサウルス|epic|0||0||
|8|インドミナスレックス|regend|6|epic|1|normal|
|21|ステゴディアス|regend|9|epic|2|normal|
|24|アンキトロサウルス|regend|23|epic|12|epic|
sort コマンドで大容量テキストをソートする

# 概要
テキストをソートする sort コマンド. 気軽に使えて優秀なコマンドだが, **大容量のデータに耐えられる** 点も魅力の一つである. 本稿ではこのポイントを紹介したい.

## 確認環境
以下の sort コマンドの挙動を Mac OS X 上で確認した. 本稿のコマンド例はすべて GNU coreutils sort を用いたものである.

- GNU coreutils 8.31
- 2.3-Apple

# 大容量のテキストをソートしてみる
sort コマンドは, かなり大容量のテキストを入力してもソートを完遂することができる. 完遂するという要件を満たすだけであれば, マシンスペックにほとんど依存しないことがポイントだ. 試しに大容量テキストをソートしてみよう. 以下に 10,000,000 レコードの乱雑なテキスト [^1] をソートする例を示す.

```shell
$ time (base64 /dev/urandom | head -n10000000 | sort > /dev/null)

real    7m42.519s
user    7m13.398s
sys     0m28.383s
```

やや時間はかかるが, 問題なくコマンド終了するはずだ. 同時にメモリ使用量をチェックしてみてもよい. 1000 万レコードのソートにも関わらず, 驚くほどメモリを使用しないことがわかるだろう.

多くのソート処理は事前にリストアップされたデータを前提としており, 空きメモリ量を上回るサイズのデータをソートすることはできない. 一方で sort コマンドは, **空きメモリ量の制限を上回るデータをソートできる** という大きなアドバンテージを持っている.

# 大容量データをソートすることの重要性
ソートされたデータに対するアルゴリズムは多い. [二分探索](https://ja.wikipedia.org/wiki/%E4%BA%8C%E5%88%86%E6%8E%A2%E7%B4%A2) は代表的な例だろう.

他によくある例として, 特定のキーによるグルーピングや, 複数データの結合が挙げられる. いずれも一度全データを展開したり, インデックスを作成したりといった前処理が必要そうに思えるが, 実は入力がキーでソートされていれば展開せずに逐次処理が可能だ. 特にデータの大容量化が著しい現代では重要なテクニックだろう.

ちなみに Python の例になるが, ソートされたデータを前提としたグルーピングは, 標準ライブラリの [itertools.groupby](https://docs.python.org/ja/3/library/itertools.html#itertools.groupby) に採用例がある. 結合処理の実装としては, 手前味噌で恐縮だが [reltools](https://github.com/ymoch/reltools) というパッケージを公開している.

# なぜ耐えられるのか？
ソートアルゴリズムに精通した読者ならお気づきかもしれないが, 大容量データに耐える秘密は [マージソート](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%82%B8%E3%82%BD%E3%83%BC%E3%83%88) を採用している点にある.

sort コマンドはメモリ上に一定サイズのバッファを持っている. バッファがいっぱいになるとバッファ中のデータをソートして, 一時ファイルとして出力する. 入力が完了すると, ソートされた一時ファイルを順にマージして, 最終的なソート結果を出力する. マージソートと一時ファイルを組み合わせ, メモリ使用量を限定する好例だ.

実際に大容量テキストをソートしながら一時ディレクトリ以下の様子を観察すると, イメージが持てるだろう.

```shell
$ ls -l ${TMPDIR:-/tmp}
```

# チューニング
実装系によってはバッファサイズの変更も可能で, 今回確認した環境では `-S` ないし `--buffer-size` オプションで変更可能だった. メモリを潤沢に利用できる環境では, 大きめの値を設定することで高速化が狙えるかもしれない [^2].

```shell
$ time (base64 /dev/urandom | head -n1000000 | sort > /dev/null)

real    0m37.897s
user    0m35.318s
sys     0m2.693s
$ time (base64 /dev/urandom | head -n1000000 | sort -S256M > /dev/null)

real    0m16.930s
user    0m59.136s
sys     0m0.232s
```

なお, 入力ファイルパスを指定してソートした場合, メモリ使用量が増加する代わりに一時ファイルを利用しにくくなり, 結果的に処理時間が短縮する結果を得られた. ファイル指定の場合は入力データサイズが予め分かるため, バッファサイズが暗黙的にチューニングされたのではないか, と推察している.

```shell
$ time (base64 /dev/urandom | head -n1000000 > large-text.txt)

real    0m2.533s
user    0m0.448s
sys     0m2.443s
$ time (sort large-text.txt > /dev/null)

real    0m17.172s
user    0m59.369s
sys     0m0.250s
```

「大容量」データをソートできると述べてきたが, 上記の実装を踏まえると, sort コマンドでソートできるデータ容量の限界値は, 一時ファイル出力先ストレージの空き容量がおおよその目安となる. 一時ファイルの出力先は `-T` ないし `--temporary-directory` オプションで変更可能だ. 高速なストレージが用意できる場合や, より大きい領域を利用したい場合は, 変更するとよいだろう.

# まとめ
sort コマンドは大容量テキストのソートが気軽にできる懐の深さを持ち, 現代の大容量テキスト処理に耐えうるポテンシャルを持っている. sort コマンドが利用できない環境においても, sort コマンドのアプローチを思い出すことができれば, 技術選択の引き出しも増えることだろう.

[^1]: 大容量データの生成処理は [LinuxやMacで任意のサイズの「テキスト」ファイルを作る方法](https://qiita.com/makopo/items/a224ebca1bccc5484a54) を参考にした.
[^2]: ストレージの利用がボトルネックになっている場合に限る. チューニングの鉄則は *予測するな, 計測せよ* である.
的外れな学習係数探し

# はじめに
程よい学習係数の値を大雑把に探してみた。
# 環境
- OS : Ubuntu18.04
- メモリ : 12GB
- CPU : 遅い←
- 隠れ層 : 1層
- 最適化アルゴリズム : 確率的勾配降下法(SGD)
- データ
 - 種類 : 画像  
 - 訓練データ数 : 60000
 - テストデータ数 : 10000
 - ミニバッチ数 : 100  
 
# 結果
1. 学習係数 : 0.001
![learning_late0.001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535913/d60c3489-c649-80a1-161f-a08b66b92143.png)
2. 学習係数 : 0.01
![learning_late0.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535913/4a2e0936-b98e-7cd5-4e0e-50f2effcc904.png)
3. 学習係数 : 0.1
![learning_late0.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535913/fbd5bf13-0f81-e3c3-353d-5a473d27167d.png)
4. 学習係数 : 1
![learning_late1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535913/5b069088-8d55-cc5e-94bc-696dce13847a.png)
5. 学習係数 : 10
![learning_late10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535913/91c957a7-5df5-2b95-8f10-5c2d3d128ab1.png)

# まとめ
今回は10の累乗で最適な学習係数を見積もった。
全体としてどれも2つのグラフが乖離していないので過学習はほとんど起きていないことがわかる。
パッと見た感じだと今回の場合、$\ 0.1,1\ $あたりが素早く漸近していて、精度も高い。
対して、$\ 0.001,10\ $あたりはひどいことになった。
学習係数次第で人工知能は天才にもまぬけにもなる。
cscの作法 その31 真理値表

#概要

cscの作法、調べてみた。
練習問題やってみた。

#練習問題

真理値表を表示せよ。

#写真

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/ffef3ea3-f287-8fdc-1dcb-e080e82d1910.png)



#サンプルコード


```
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Data.OleDb;
using System.Data;
using System.IO;
using System.Text;
using System.Collections.Generic;

class form1: Form {
	form1() {
		Text = "DataGridView";
		ClientSize = new Size(480, 300);
		DataGridView gd0 = new DataGridView();
		gd0.Location = new Point(50, 20);
		gd0.Width = 400;
		Controls.AddRange(new Control[] {
			gd0
		});
		gd0.ColumnCount = 3;
		gd0.Columns[0].HeaderText = "A";
		gd0.Columns[1].HeaderText = "B";
		gd0.Columns[2].HeaderText = "X";
		int a = 0;
		int b = 0;
		int x;
		x = a ^ b;
		gd0.Rows.Add(new object[] {
			a.ToString(),
			b.ToString(),
			x.ToString()
		});
		a = 1;
		x = a ^ b;
		gd0.Rows.Add(new object[] {
			a.ToString(),
			b.ToString(),
			x.ToString()
		});
		a = 0;
		b = 1;
		x = a ^ b;
		gd0.Rows.Add(new object[] {
			a.ToString(),
			b.ToString(),
			x.ToString()
		});
		a = 1;
		x = a ^ b;
		gd0.Rows.Add(new object[] {
			a.ToString(),
			b.ToString(),
			x.ToString()
		});
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}





```

以上。
ls コマンドの実行結果に不可視ファイル（隠しファイル）を含ませたい時

ls コマンドの実行結果に不可視ファイル（隠しファイル）を含ませたい時の備忘録。

## 「-A」オプションを使う

次のコマンドを実行することで、カレントディレクトリの不可視ファイルも表示される。

```sh
ls -A
```
VagrantでVirtual Box上に作ったゲストマシン（CentOS）の共有フォルダが同期しない

# 記事概要
[CentOS 7の公式のVagrant box](https://app.vagrantup.com/centos/boxes/7)から作ったVirtual Box上の仮想マシンにおいて、共有フォルダが同期されませんでした。原因と解決策について記します。

# 記事詳細
## 実行環境
`Windows 10 Home`
`Virtual Box 6.0.14`
`Vagrant 2.2.6`

## 原因
上記の環境において、共有フォルダが同期されない原因は、[CentOS 7の公式のVagrant box](https://app.vagrantup.com/centos/boxes/7)に[guest additions](https://www.virtualbox.org/manual/ch04.html)がインストールされていないことです。

**[guest additions](https://www.virtualbox.org/manual/ch04.html)とは、Virtual Boxのホストマシンとゲストマシンの連携を良くするためのツールです。**

`vagrant up`でゲストマシンを起動すると、以下のようなメッセージが表示されます。

```
==> default: Checking for guest additions in VM...
    default: No guest additions were detected on the base box for this VM! Guest    
    default: additions are required for forwarded ports, shared folders, host only  
    default: networking, and more. If SSH fails on this machine, please install     
    default: the guest additions and repackage the box to continue.
    default: 
    default: This is not an error message; everything may continue to work properly,
    default: in which case you may ignore this message.
```

共有フォルダが動作するには[guest additions](https://www.virtualbox.org/manual/ch04.html)が必要で、[CentOS 7の公式のVagrant box](https://app.vagrantup.com/centos/boxes/7)には、[guest additions](https://www.virtualbox.org/manual/ch04.html)がインストールされてないと書かれています。

ちなみに、[Ubuntu 18.04の公式のVagrant box](https://app.vagrantup.com/ubuntu/boxes/bionic64)は、[guest additions](https://www.virtualbox.org/manual/ch04.html)が最初からインストールされています。


### 解決策

以下の2つの作業を行うことで、共有フォルダが同期されるようになりました。

#### 【1】[vagrant-vbguest](https://github.com/dotless-de/vagrant-vbguest)プラグインのインストール

[vagrant-vbguest](https://github.com/dotless-de/vagrant-vbguest)プラグインをインストールします。
**[vagrant-vbguest](https://github.com/dotless-de/vagrant-vbguest)は、ホストマシンの[guest additions](https://www.virtualbox.org/manual/ch04.html)をゲストマシンに自動的にインストールしてくれるVagrantのプラグインです。**

インストールは、以下のコマンドを入力するだけです。

```
vagrant plugin install vagrant-vbguest
```

これで、**ゲストマシンの起動時に[guest additions](https://www.virtualbox.org/manual/ch04.html)が自動的にインストールされるようになりました。**

#### 【2】[共有フォルダ](https://www.vagrantup.com/docs/synced-folders/)のtypeの指定

共有フォルダのtypeをvirtualboxに指定します。
Vagrantfileに以下のような設定を記述することで、共有フォルダの**type**を指定できます（ホストマシンとゲストマシンのディレクトリの設定は自分の環境に合わせて下さい）。

```
config.vm.synced_folder ".", "/vagrant", type: "virtualbox"
```

通常、vagrantは最適なtypeを自動的に設定してくれます。
従って、通常はtypeを設定する必要はありません。

**しかし、今回の場合はtypeを明示的に設定する必要がありました。**

これで、**ゲストマシンの共有フォルダが同期されるようになりました。**
Ruby　クラス継承について　エンジニア戦記＃2

# 本日の積み上げ

★クラス継承とは★

あるクラスをもとにして新しいクラスをつくること

class B < A

A=親クラス　B＝子クラス
Bクラスをつくるにあたって１からすべてのインスタンス情報記載しなくてもよくなる

★変数インスタンスの追加★

クラスを継承したBについて独自の変数を下記のように追加できる

class B < A
  attr_accessor:変数

★オーバーライド★

親クラスにあるメソッドと同じ名前のメソッドを子クラスで定義すると、
メソッドを上書きすることができます。これをメソッドの「オーバーライド」と呼びます。

子クラスのインスタンスは、子クラスで定義したメソッドを優先して呼び出すようになっています。

【感想】

これまでは文法通りに表示されているかどうかの処理＝自己満足的な処理が多かったが
下記のような流れでユーザーとインタラクティブな動きのある処理がかけるようになってきた。

ユーザーに表示
ユーザー入力
その結果に応じた動きを表示

ウェブサービスの原理は上記３点で説明されうると思われるので
自分で手で書くことでそれに触れることができたのはとてもうれしいし、わくわくしてくる。
for文の continue break else

```py
players = ['勇者', '戦士', '魔法使い', '僧侶']
for player in players:
    print(player)
```

```:実行結果
勇者
戦士
魔法使い
僧侶
```

```py:無理やりwhile文で書くと
players = ['勇者', '戦士', '魔法使い', '僧侶']
i = 0
while i < len(players):
    print(players[i])
    i += 1
```

```py:else
players = ['勇者', '戦士', '魔法使い', '僧侶']
for player in players:
    print(player)
else:
    print('終了')
```

```:elseの実行結果
勇者
戦士
魔法使い
僧侶
終了
```

```py:break
players = ['勇者', '戦士', '魔法使い', '僧侶']
for player in players:
    if player == '魔法使い':
        break
    print(player)
else:
    print('終了')
```

```:breakの実行結果
勇者
戦士
```

while文の場合と同様に、
breakでループを抜けるとforループ全てから抜けてしまうので、
else以下は実行されない。

```py:continue
players = ['勇者', '戦士', '魔法使い', '僧侶']
for player in players:
    if player == '魔法使い':
        continue
    print(player)
else:
    print('終了')
```

```:contiuneの実行結果
勇者
戦士
僧侶
終了
```
PDFからWordへ

ドキュメントの流通を促進するために、多くの人がAdobe PDFファイルを使用することを選択します。PDFファイルは複数のデバイスと互換性があるため、非常に読みやすくなっていますが、ファイルの内容を変更する必要がある場合、より面倒です 。どのようにPDFをWordに変換しますか？次に、ファイルの内容を編集および変更しますか？Adobe PDFをMicrosoft Office Word（.doc、.docx）に変換する方法は？

Sanpdf – Microsoft Office Word（.doc、.docx）向けの無料で効率的なオンラインAdobe PDFツール。

1、Google Chromeを開いてSanpdfと入力すると、Sanpdfのホームが見つかります。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560346/4fee5668-9cae-54ee-8ac2-61f59ae14541.png)
2、ホームページで「pdf to word」を選択して、変換ページに入ります。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560346/345601cf-05ca-10eb-1abd-f2be195b02ab.png)
3.アップロードするAdobe PDFファイルを選択し、しばらく待ってから変換を完了します。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560346/cfc68601-6ab9-f569-1094-27c6b0ff54b8.png)
4、「ファイルのダウンロード」をクリックして、変換されたファイルを保存します。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560346/c6f6f0f1-1b33-aa27-4f97-ac2ac1776462.png)

Sanpdfツールには、オンラインで、無料で、効率的で、比較的包括的であるという利点があり、ユーザーのドキュメント変換とドキュメント処理のニーズを満たすことができます。

利点：
ツールをダウンロードする必要はありません。オンラインでのファイル形式の変換は簡単です。
2、簡単な操作、良い効果、sanpdfオンライン変換は非常に簡単な操作であるだけでなく、Adobe PDF変換の最高品質を保証します。
3、フル機能、Adobe PDFからMicrosoft Office Word（.doc、.docx）への変換をサポートするだけでなく、他の一般的なOfficeドキュメント形式も変換できます。
インターネット上で見られるドキュメントや資料のほとんどは、元のファイルにアップロードされ、保存のためにAdobe PDFファイルにアップロードされます。AdobePDFファイルは、あらゆるプリンターで正確な色と正確な印刷を保証します。 Adobe PDFは、オリジナルのすべての文字、色、画像を忠実に再現しますPDFからWordへの変換Adobe PDFをMicrosoft Office Word（.doc、.docx）に使用する場合は、Adobe PDF Converter-SanPDFをダウンロードすることをお勧めしますコンバーター：PDFをWordに、Adobe PDFをさまざまな形式に変換できます。AdobePDFからPPT、Adobe PDFからExcelなどを含みます。 Microsoft Office Word（.doc、.docx）オンラインへ。
準拠してないAMIを検知 AWS Config

https://dev.classmethod.jp/cloud/aws/automate-aws-config-remediation-action/
> 1. AWS Config の有効化
> 2. AMI を制限するAWS Config ルールを追加
> 3. 動作確認:管理コンソールから修復アクションを実行
> 4. Lambda 関数の作成
> 5. CloudWatch Events で AWS Config と Lambda の紐づけ
> 6. 動作確認:イベントドリブンに修復アクションを実行
おうちのネットワークトラブル

先月からいろいろおうちのネットワークトラブルに見舞われたので、ちょっと書き残しておきたいと思います。

我が家のネットワークは無線系を除きすべてZRouerでビルドされたFreeBSDを利用したモジュールで運用されています。

最近のThingSpeakの利用状況です。

![スクリーンショット 2020-01-03 19.25.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/9be8366d-faef-bee4-5bf0-ff79fb7b88a7.png)

まず12/11(この集計は日本時間ではないので、ちょっとずれます)にへっているのは[snmpの作り込み](https://qiita.com/yamori813/items/35819726871e1b596699)をしてEthernetSwitchを止めてしまったためでした。

そうしているうちに14日を境にデータ受信数が減りました。これはおそらくThingSpeakがサーバーメンテをして以前よりパフォーマンスが良くなったかサーバまでの距離が近くなったかで、以前はアクセスに8秒くらいかかっていたのが4秒になり、10秒のインターバールで処理していたのがThingSpeakのFree Accountのリミットの15秒間隔にひっかったため、アクセスは多くなっていたのですが、半分処理されない状態になったためでした。

3ヶ月くらい連続稼働していた蟹さんが、このサーバメンテのタイミングでハングアップしてしまっていました。理由は不明で再現も不可能です。WatchDogは入れてなかったので、入れていればハングアップはなかったかもしれません。

蟹さんのインターバルを20秒にして、[湿度センサーも付けて](https://qiita.com/yamori813/items/2fd2d5f7dd90f470322c)22日くらいに再開しました。

おうちのWiFiが極端に遅かったので、ついでにAPもハードオフで買ってきたルーターをメーカーの最終ファームウエアにアップデートして入れ替えてみました。

なぜかこれ以降蟹さんが極端に不安定になりました。最初の現象は定期的にLEDは点滅していたので、処理はとまってなかったようなのですが、まったくネットワークアクセスができない状態でした。DHCPサーバのログを見るとリクエストが来てレスポンスを返しているのに受け取っていないような状態になっているようでした。これはEthernetドライバを書いていた時も似たような状態があり、蟹さんに入っているEthernetSwitchの問題のように思われました。また止まってはいないようなのでWatchDogで対応するような問題でもないと考えました。

mruby on YABMで使っているlwIPの問題の可能性もあるので、BCM/mipsでも20秒インターバルでThingSpeakにアクセスするようにしてみました。こちらは問題は起きません。

仕方がないので、蟹さんをネットワークアクセス連続3回失敗したらリブートするようワークアラウンドを入れてみました。

とりあえず止まらないようになったのですが、リブートを不定期に繰り返していました。またなぜかそれまで3ヶ月間問題なかったブリッジもハングアップしたり、ホスト間のsnmpアクセスが失敗したりして、蟹さんだけでなくネットワーク全体が不安定になりました。

実は蟹さんに入れたワークアラウンドは問題を増やしていて、通常時でも3回の失敗が発生することがありました。（これはいつか調べたほうがいいような気もします）このことはBCM/mipsの方で確認できました。最初の問題が起きるかもしれないので念のため10回失敗でリブートにしてみました。

~~一番怪しWiFiルーターを元に戻したところ問題が起きなくなり12月始めの状態に戻りました。WiFiルーターはメーカー製のファームウエアをつかっていますが、ちょっと特殊な設定にしているのが影響しているのかもしれません。~~

~~普通に使ってれば問題ないのかもしれませんし、調査も困難な気がするので、他のWiFiルーターを使うなどの方法を考えてみたいと思います。~~

2020/2/18 現象はSwitchが飛んでしまうことはわかったが、いろいろ試してみたがいまだもって原因不明。気温の可能性を考えているが、外れているかもしれない。このメモの通りThingSpeakのサーバ入れ替え以来発生しているので、TLSが変わったなどで流れるデータが微妙に変わり、それが影響している可能性もあるのかもしれない。


2020/4/5 蟹さんの問題が気温が上がってきているのに、一向に治まる気配がないので、ネットワークを疑って、新サブネットを作ってそちらに移したところ問題が再現しなくななりました。どうも12月中旬にSNMPを利用するようになって、それかそれに関係したパケットが影響してたのではないかと思われます。

再起動の集計
![スクリーンショット 2020-04-06 10.17.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/2a07aa27-77a6-1038-f4ec-81b2d4056012.png)

考えられる可能性

* 特定のパケットに反応
* パケットのタイミング
* 複数のパケットの絡み

利用が少ないサブネットに移ってパケットが減って落ちにくくなってるだけかもしれません。:(
【Go】Sqlite3の利用方法

##1. Sqlite3のインストール

Windowsならば下記サイトよりSqliteをダウンロードします。
https://www.sqlite.org/download.html
「sqlite-tools-win32-x86-3300100.zip」をダウンロードしてインストールします。

Macならば、下記コマンドを実行してください。
```brew install sqlite```

##2. gccのインストール方法
sqliteはC言語で開発されているため、gccが必要です。

Windowsの場合、下記よりTDM-gccをダウンロードしてインストールします。
http://tdm-gcc.tdragon.net/download

Macならば、Xcodeをダウンロードしてインストール後、下記コマンドを実行してください。
```xcode-select --install```

これでgccが利用できるようになります。

##3. go-sqlite3を取得する
コマンドラインで次を実行します。
```go get github.com/mattn/go-sqlite3```
インストールするとGoでSqliteが利用できるようになります。

##4. Goでsqliteを利用する
```go
package main

import (
	"database/sql"

	_ "github.com/mattn/go-sqlite3"
)

var DbConnection *sql.DB

func main() {
	DbConnection, _ := sql.Open("sqlite3", "./example.sql") //接続開始（example.sqlに保存する）
	defer DbConnection.Close()                              //最後は確実にクローズする。

	//この下に、CREATE文　SELECT文　INSERT文 UPDATE文　DELETE文を記載する

}
```