OmniAICreator/Qiita-1.07M huggingface dataset:
Puppet Boltを使って複数台のサーバにPuppet Agentをインストールする

[Puppet Bolt](https://puppet.com/products/puppet-bolt)はタスク実行ツールです。 Puppetのタスクやマニフェストを実行することができます。

# 環境
- **Puppet Boltのインストール先OS** : macOS Mojave 10.14.2
- **Puppet Agentのインストール先OS** : CentOS 7(3.10.0-957.1.3.el7.x86_64)
- **Puppet Boltのバージョン** : 1.11.0

# 手順
Boltをインストールします。

```
$ brew cask install puppetlabs/puppet/puppet-bolt
```

helpを確認します。

```
$ bolt
Usage: bolt <subcommand> <action> [options]

Available subcommands:
  bolt command run <command>       Run a command remotely
  bolt file upload <src> <dest>    Upload a local file
  bolt script run <script>         Upload a local script and run it remotely
  bolt task show                   Show list of available tasks
  bolt task show <task>            Show documentation for task
  bolt task run <task> [params]    Run a Puppet task
  bolt plan show                   Show list of available plans
  bolt plan show <plan>            Show details for plan
  bolt plan run <plan> [params]    Run a Puppet task plan
  bolt apply <manifest>            Apply Puppet manifest code
  bolt puppetfile install          Install modules from a Puppetfile into a Boltdir
```

実行可能なPuppetのタスクを確認します。

```
$ bolt task show
facts                    Gather system facts
package                  Manage and inspect the state of packages
puppet_agent::install    Install the Puppet agent package
puppet_agent::version    Get the version of the Puppet agent package installed. Returns nothing if none present.
puppet_conf              Inspect puppet agent configuration settings
reboot                   Reboots a machine
reboot::last_boot_time   Gets the last boot time of a Linux or Windows system
service                  Manage and inspect the state of services
```

ホストbolt-1,bolt-2,bolt-3,bolt-4にPuppetのAgentをインストールします。-uで指定するユーザでホストにsshログインできることが前提です。

```
$ bolt task run puppet_agent::install -n bolt-1,bolt-2,bolt-3,bolt-4 --run-as root -u hisashi_yamaguchi
--省略--
Successful on 4 nodes: bolt-1,bolt-2,bolt-3,bolt-4
Ran on 4 nodes in 31.71 seconds
```

Successful on 4 nodes: bolt-1,bolt-2,bolt-3,bolt-4が表示されていれば成功です。

```
$ bolt command run 'puppet --version' -n bolt-1,bolt-2,bolt-3,bolt-4 -u hisashi_yamaguchi
Started on bolt-1...
Started on bolt-2...
Started on bolt-3...
Started on bolt-4...
Finished on bolt-4:
  STDOUT:
    6.3.0
Finished on bolt-1:
  STDOUT:
    6.3.0
Finished on bolt-3:
  STDOUT:
    6.3.0
Finished on bolt-2:
  STDOUT:
    6.3.0
Successful on 4 nodes: bolt-1,bolt-2,bolt-3,bolt-4
Ran on 4 nodes in 3.70 seconds
```
特定のURLにクエリを追加する〜注意点と個人的見解〜

## はじめに

特定のURLのみクエリを追加する処理を実装したのですが、意外に考慮することが多かったのでまとめました。
:boy:の箇所は __私の個人的見解です__ 。

## 処理内容

例として、`https://example.com` というURLにアクセスする場合のみ `example=1` というクエリを追加する処理を実装することにします。

## URL比較の考慮事項

特定のURLかどうか判定するために考慮すべき内容です。

### 大文字・小文字を区別するか

例
https://Example.com

大文字と小文字が異なる場合に同一のURLとみなすかどうかです。

:boy:
大文字・小文字を区別せず、同一のURLとみなします。
∵大文字・小文字が異なっても同一のページにアクセスされるため

### 末尾スラッシュの有無を区別するか

例
https://example.com/

末尾にスラッシュ `/` が付いている場合に同一のURLとみなすかどうかです。

:boy:
基本的には末尾にスラッシュがあるか異なっても、同一のURLとみなします。
∵ ~~大文字・小文字と同様、同一のページにアクセスされるため~~
　→Webサイトによっては異なるページにアクセスされる可能性も0ではありませんでした。
　　ただ、基本的には同一のページにアクセスされるようにしているWebサイトがほとんどです。


### 同一ドメインでページが異なるのを区別するか

例
https://example.com/test

:boy:
こちらはクエリを追加する状況によりますが、基本的には異なるURLとみなします。
∵異なるページにアクセスされるため

異なるURLとみなす場合、ドメインだけで判断しないよう注意が必要です。

### クエリを除いて判定するか

例
https://example.com?foo=1&bar=2

:boy:
クエリの内容が異なっても同一とみなすかは、クエリを追加する状況によります。
比較に手間がかかるため、問題なければ異なるURLとみなします。

同一のURLとみなす場合、対象クエリがすでに追加されていないか注意が必要です。

### ページ内リンクを除いて判定するか

例
https://example.com#test

:boy:
ページ内リンクが異なっても同一とみなすかは、クエリを追加する状況によります。
比較に手間がかかるため、問題なければ異なるURLとみなします。

### プロトコルを区別するか

例
http://example.com

:boy:
HTTP or HTTPSとプロトコルが異なっても同一とみなすかは、クエリを追加する状況によります。
比較に手間がかかるため、問題なければ異なるURLとみなします。

## クエリ追加の考慮事項

URLが一致と判断したあと、クエリを追加する場合に考慮すべき内容です。

### 他にクエリが付いている

例
https://example.com?foo=1&bar=2

:boy:
文字列ベースでクエリを追加すると、先頭に `?` と `&` のどちらを付けるかの判定に手間がかかります。
言語仕様でURLオブジェクトにクエリを追加する処理がある場合、そちらを活用すべきです。

### すでに対象クエリが付いている

例
https://example.com?example=1

:boy:
まず、クエリの大文字・小文字が異なっても、同一クエリとみなします。
上書きするかそのままにするかは、クエリを追加する状況によります。
クエリを上書きする場合、同じクエリを複数追加しないよう注意が必要です。

### 対象クエリに追加する値に問題がある

:boy:
対象クエリに追加する値が存在しない、または不整合がある場合、どうするかは状況によります。
クエリを追加せずにそのままURLにアクセスするか、エラーを発生させるかのどちらかが考えられます。

## まとめ

上記の内容を表にまとめました。

__URL比較の考慮事項__

|説明|URLの例|
|:--|:--|
|通常|https://example.com|
|大文字が混ざっている|https://Example.com|
|末尾に `/` が付いている|https://example.com/|
|同一ドメインでページが異なる|https://example.com/test|
|クエリが付いている|https://example.com?foo=1&bar=2|
|ページ内リンクが付いている|https://example.com#test|
|HTTPプロトコルになっている|http://example.com|

__クエリ追加の考慮事項__

|説明|URLの例|
|:--|:--|
|他にクエリが付いている|https://example.com?foo=1&bar=2|
|すでに対象クエリが付いている|https://example.com?example=1|
|対象クエリに追加する値に問題がある|-|

## おわりに

URLを細かく扱ったことはなかったので、考慮事項の洗い出しに苦戦しました。
他にも考慮すべき内容がありましたら、コメントなどでご指摘いただけると嬉しいです:relaxed:
DjangoGirls Extentsion の参考記事

DjangoGirls Extentsion の参考記事については
この記事が参考になります。

1.DjangoGirlsのDraft・Delete機能の追加編
https://nikkie-ftnext.hatenablog.com/entry/2018/11/24/225615

2.DjangoGirlsのログイン・ログアウト機能の追加編
https://nikkie-ftnext.hatenablog.com/entry/2018/11/26/232818

3 DjangoGirlsのコメント機能の追加編
https://nikkie-ftnext.hatenablog.com/entry/2018/12/30/135438
VisualStudioのXAMLデザイナを拡張する 2.右クリックでGridのColumnを追加編

VisualStudioのXAMLデザイナ拡張第二回です。
今回はGridの列追加を、Grid上で右クリックしたらできるようなサンプルです。
# 環境
Visual Studio Community 2017
.NET Framework 4.7.1
# 実装イメージ
![2019-02-22 (2).png](https://qiita-image-store.s3.amazonaws.com/0/123548/38f2e4a4-5607-6ab5-5528-8a0e674eb781.png)
こんな感じでGridを右クリックするとコンテキストメニューに"Column追加"というメニューが出てきて、クリックすればColumnDefinitionが追加されるといった感じです。

#1.下準備
今回拡張対象となるCustomGridの作成、デザイン時のMetadata用のアセンブリの作成、IProvideAttributeTable継承クラスの作成は[前回](https://qiita.com/aya_ceso/items/9174e5a56830aeb54025)を参照してください。

#2.FeatureProviderを作る
今回はコンテキストメニューを拡張するのでPrimarySelectionContextMenuProvider継承クラスで作ります。
前回よりもさらに単純で、追加したMenuActionが実行されたらColumnDefinitionsプロパティを取得してColumnDefinitionを追加しているだけです。

```C#:CustomContextMenuProvider.cs
namespace CustomControl.VisualStudio.Design
{
    class CustomContextMenuProvider : PrimarySelectionContextMenuProvider
    {
        public CustomContextMenuProvider()
        {
            MenuAction action = new MenuAction("Column追加");
            action.Execute += (sender, e) =>
            {
                ModelItem item = e.Selection.PrimarySelection;

                ColumnDefinitionCollection collection = item.Properties["ColumnDefinitions"].ComputedValue as ColumnDefinitionCollection;
                collection.Add(new ColumnDefinition());
            };
            this.Items.Add(action);
        }
    }
}
```

#3.XAMLデザイナで確認する
ここも前回の手順を確認してください。
これでやってみるとわかると思うんですけどうまく動かないんですよね。
画面上だと追加されるんですけど、XAMLに反映されないです。Collectionなので変更通知がXAMLのコードエディタに行かないんですかね。
鋭意調査中です。直せたら更新します。
S3にアップロードされたShift_JISのCSVファイルをRubyで読み込む方法

以下のようにするとS3からcsvファイルを取得できます。

```ruby
client = Aws::S3::Client.new(
  region: xxx,
  access_key_id: xxx,
  secret_access_key: xxxx
)
file = client.get_object(bucket: xxx, key: xxx)
csv = CSV.parse(file.body.read)
```

しかし、shift-jisで作成されたcsvファイルを読み込もうとすると以下のようなエラーがでました。

```
ArgumentError: invalid byte sequence in UTF-8
```

エンコードを指定することで解決しました。

```diff 
client = Aws::S3::Client.new(
  region: xxx,
  access_key_id: xxx,
  secret_access_key: xxxx
)
file = client.get_object(bucket: xxx, key: xxx)
- csv = CSV.parse(file.body.read)
+ csv = CSV.parse(file.body.read.encode("UTF-8", invalid: :replace))
```

参考: <a href="https://ref.xaio.jp/ruby/classes/string/encode" target="_blank">encode, encode! (String)</a>
FirebaseAuthでのエラーハンドリング

FirebaseAuthのエラーハンドリングについてあまり記事がまとまってなかったのでメモ :nerd: 

各APIでどんなエラーが返ってくるのかはここを見ればわかります :point_down: 
[Firebase iOS Auth エラーの処理  \|  Firebase](https://firebase.google.com/docs/auth/ios/errors?hl=ja)

下記の通りにやろうとしたらいろいろ名前が変わっててエラったので対応。
[ios \- Reading Firebase Auth Error Thrown \(Firebase 3\.x and Swift\) \- Stack Overflow](https://stackoverflow.com/questions/37449919/reading-firebase-auth-error-thrown-firebase-3-x-and-swift)

具体的には、

- `FIRAuthErrorCode` -> `AuthErrorCode`のリネーム
- switch文でのcase表記の変更

などをしています :bulb: 

環境
---
swift 4
Firebase/Auth (5.14.0)


コード
---

```swift
Auth.auth().createUser(withEmail: email, password: password) { (user, error) in
    if error == nil {
        // do something
    } else {
        if let errCode = AuthErrorCode(rawValue: error!._code) {
            switch errCode {
            case .invalidEmail:
                // メールアドレスの形式が違います。
            case .emailAlreadyInUse:
                // このメールアドレスはすでに使われています。
            case .weakPassword:
                // パスワードは6文字以上で入力してください。
            default:
                // エラーが起きました。\nしばらくしてから再度お試しください。
            }
        }
    }
}
```

以上です :hugging: 

参考
---
- [Firebase iOS Auth エラーの処理  \|  Firebase](https://firebase.google.com/docs/auth/ios/errors?hl=ja)
- [FirebaseAuth Framework Reference  \|  Firebase](https://firebase.google.com/docs/reference/ios/firebaseauth/api/reference/Enums/FIRAuthErrorCode)
- [ios \- Reading Firebase Auth Error Thrown \(Firebase 3\.x and Swift\) \- Stack Overflow](https://stackoverflow.com/questions/37449919/reading-firebase-auth-error-thrown-firebase-3-x-and-swift)
- [quickstart\-ios/authentication/AuthenticationExampleSwift at cedd9a1dc16b50554cb0da247b1b65a7a228f6ff · firebase/quickstart\-ios](https://github.com/firebase/quickstart-ios/tree/cedd9a1dc16b50554cb0da247b1b65a7a228f6ff/authentication/AuthenticationExampleSwift)
小ネタ: Word docxパッケージ内の特定ファイルだけを7zコマンドで展開／更新する

前提知識: [Word docxファイルの中身を探検する - Office Open XML ざっくり入門 - Qiita](https://qiita.com/sky_y/items/2ab80adfb7a998e47239)

※ 本当は小ネタを書きたかったけど、前提知識が大きくなりすぎたので上記記事に書きました。

## 何がやりたいか

通常、Wordファイル `foo.docx` の中身を**MS Wordなしで**編集するには、

- zipファイルとして展開する
- XMLファイルを編集する（or アセットファイルを更新する）
- zipファイルとして圧縮する

という手順を踏む必要があります。

かなり面倒なので、これを簡略化する方法を探していました。

## 見つけた方法: `7z` コマンド (p7zip)で操作する

既にdocxのディレクトリ構造が既知で、特定ファイルだけを編集すればいいと分かっていると仮定します。
（補足 2019-03-03: `foo.docx` のパッケージ内のディレクトリ構造は `$ 7z l foo.docx` で確認できます。）

具体的には、 `foo.docx`のパッケージ内にある`word/document.xml` を狙い撃ちで編集したい、としましょう。

1. `word/document.xml` だけを展開する
    - `$ 7z x -y foo.docx word/document.xml`
2. XMLを書き換える (sedなどで) 
    - `$ sed "s/<w:tblStyle w:val=\"TableNormal\"/<w:tblStyle w:val=\"BlueTableStyle\"/g" word\document.xml > word/document2.xml`
    - `$ cp word/document2.xml word/document.xml`
3. word/document.xml だけを元のdocxファイルに戻す
    - `$ 7z u -y foo.docx word/document.xml`

元ネタ: [Custom styles for ODT (and maybe LaTeX and RST) writers · Issue #2106 · jgm/pandoc](https://github.com/jgm/pandoc/issues/2106)


## 補足: `7z`コマンドについて

※ あまり詳しくないので、間違っていたらご指摘ください。

- `7z x`: 展開 (eXtract with full paths)
    - アーカイブ内のディレクトリを維持したまま展開する
    - [Debian Linuxで7zファイルを圧縮・解凍する / p7zipの使い方 -- ぺけみさお](https://www.xmisao.com/2014/09/25/debian-linux-extract-7z.html)
    - [x (Extract with full paths) command](https://sevenzip.osdn.jp/chm/cmdline/commands/extract_full.htm)
- `7z u`: 更新 (Update)
    - 既にファイルが存在する場合は、ファイルを追加せずそのまま上書きする
    - [u (Update) command](https://sevenzip.osdn.jp/chm/cmdline/commands/update.htm)

「7zip」は元々Windows用のアーカイバで、それをPOSIXシステム（Unixなど）向けに移植したのがが「p7zip」とのこと。

対応フォーマットは下記。

> The program supports 7z (that implements LZMA compression algorithm), ZIP, CAB, ARJ, GZIP, BZIP2, TAR, CPIO, RPM and DEB formats. 

(macOS版 p7zipの`man 7z`より)

`7z`のみかと思っていましたが、`zip`や`tar.gz`なども扱えるようです。

## インストール (macOS)

```
$ brew install p7zip
```

以上です。
プログラム歴一ヶ月が作るTwitterBot

ドットインストールの「PHPでツイッターボットを作ろう」
https://dotinstall.com/lessons/twitter_bot_php_v2
を参考にTwitterBotを作ったのでどなたかの参考になればと思い記事を作成します。
流れとしては

１：TwitterのDEVアカウントを取得
２：composerダウンロード
３：packagistからTwitterOAuthダウンロード

となります。



##１：TwitterのDEVアカウントを取得
https://developer.twitter.com/
<img width="1440" alt="スクリーンショット 2019-02-22 16.06.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/365406/83ef8e66-7da9-a8ab-6db6-6ac4873803a4.png">
右上のAppsより、cretate an app を選択。
<img width="1440" alt="スクリーンショット 2019-02-22 16.08.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/365406/acebf586-2735-17ad-e03a-98e71ed32577.png">
ここが少し面倒で、
メール認証や電話番号認証、Botの利用目的なんかを英語でつらつらと入力しないといけません。

入力が済むと、settingの画面にうつるので

```config.php
<?php
define('API_KEY','j8XR3JzJHju477tRiBVrrN');
define('API_SECRET','xsrRLHevHMQ3YJcySWtWjoglbDM1l2AW2SBZqsg8Xehmuam2');
define('ACCESS_TOKEN','10985054778126336-FveS3mX91JcrjEJtJpfkze4Q688c7x');
define('ACCESS_SECRET','VVdgw27wpeXRNWcYVcGyhLGJvcNxWSdBvruahwDCzpj');
?>
```
のように、API_KEY,API_SECRET,ACCESS_TOKEN,ACCESS_SECRETをそれぞれ定数として保存しておきましょう。

##２：composerダウンロード
composerと検索して、Getting Startへ。
https://getcomposer.org/
<img width="1440" alt="スクリーンショット 2019-02-22 16.40.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/365406/99ad2624-ffd6-9860-4a66-07646d3333d5.png">
<img width="1440" alt="スクリーンショット 2019-02-22 16.40.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/365406/5a2a8137-6576-88b1-07d8-92bd64840543.png">
3,Installation - Linux / Unix / macOSをクリックし、表示されるコマンドを作業するディレクトリ下で実行します。
https://webbibouroku.com/Blog/Article/php-composer-setup
↑こちらなんかはとてもわかりやすいです。

##３：packagistからTwitterOAuthダウンロード
TwitterOAuthはpackagistで取得できるので、search packagies...でtwitterと検索します。
https://packagist.org/
<img width="1440" alt="スクリーンショット 2019-02-22 16.52.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/365406/40073e73-ffce-f778-c979-f064af62a6e9.png">
<img width="1440" alt="スクリーンショット 2019-02-22 16.52.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/365406/6d1d43dc-125a-222e-90eb-95e4eac0a9c8.png">
TwitterOAuthをクリックしhomepageを開くとインストールの仕方が書いてあるのでその通りしていきましょう。
<img width="1440" alt="スクリーンショット 2019-02-22 16.55.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/365406/d3344311-b8a4-593f-7755-95db2031973f.png">
ここまで行くとあとはphpファイルの中でコードをうっていきます。

```bot.php
<?php
require_once(__DIR__ . '/config.php');
use Abraham\TwitterOAuth\TwitterOAuth;

$connection = new TwitterOAuth(
  API_KEY,
  API_SECRET,
  ACCESS_TOKEN,
  ACCESS_SECRET);
```

このような感じにすると、twitterと連携してBotとして機能するのでいろいろな操作が可能になるので完成です！
備忘録 : C++Builder 6 とDelphi 6 の 使用許諾 FAQ 記事

もうかなり古いバージョンである C++Builder 6、そして無償版があった Delphi 6
当然古い製品なので、現在の Windows 10 では動作検証などされていない (未来の OS に対する動作検証なんてできませんから)
[Vista で UAC (User Account Control - ユーザーアカウント制御) が導入](https://support.microsoft.com/ja-jp/help/922708/how-to-use-user-account-control-uac-in-windows-vista)され、特定のフォルダやレジストリのアクセスに対して権限が必要になったんだよってことも、未来のことなので当然知らないし、対応も行われていない
でも動いちゃうから Windows 10 上にインストールして使っている人もいる

よくあるのが Windows 10 の大型アップデートで、使用許諾の画面が出てしまうというお話
そんなときには

- [C++Builder 6 の使用許諾 FAQ](http://support.embarcadero.com/article/33579)
- [Delphi 6 の使用許諾 FAQ](http://support.embarcadero.com/article/33580)

にある「使用許諾コードの取得が完了したのに製品が起動できずに再度ウィザードが起動してしまう」の項に従って対応するといいですよ
alexaのサンプルアプリを３分で設定する

# 概要
alexaスキルで色々試してみたい。
雛形のサンプルアプリを量産して、改造を加えていきたい。
というわけで、デプロイまでの初期構築をできるだけ簡単に行う方法をまとめます。

手動でやるとブラウザを行ったり来たりでちょっと大変。

- alexaのdeveloperコンソールでスキルを作成
- awsのコンソールでlambdaを作成
- alexaのコンソールに戻って、lambdaの設定を追加


# 利用するコマンド
- serverless framework (1.38.0)
- awscli (1.16.100)
- jq 

# 手順
### 準備

[Alexa Skills Kit開発者コンソール](https://developer.amazon.com/alexa/console/ask) でスキルの作成を行い、Skill IDをコピーしておく。

```
$ export SKILL_NAME=testtest
$ export ALEXA_SKILL_ID="amzn1.ask.skill.xxxxx"
```

### プロジェクト作成
[宇宙の豆知識（日本語）](https://github.com/alexa/skill-sample-nodejs-fact/tree/ja-JP) を少し修正したテンプレートを利用。

```
// プロジェクトの作成
$ ask new --skill-name $SKILL_NAME --url https://github.com/tekutoo/skill-sample-nodejs-fact.git
$ cd $SKILL_NAME

// Skill IDを置換
$ find . -name '*config' -o -name '*serverless.yml' | xargs sed -i "" -e "s/__ALEXA_SKILL_ID__/$ALEXA_SKILL_ID/g"

// lambdaをデプロイ
$ cd lambda/custom
$ sls deploy

// lambdaのARNを取得 && 置換
$ cd -
$ export LAMBDA_ARN=`aws lambda get-function --function-name skill-sample-nodejs-fact-dev-main --region ap-northeast-1 | jq .Configuration.FunctionArn -r`
$ find . -name 'skill.json' | xargs sed -i "" -e "s/ask-custom-$SKILL_NAME-default/$LAMBDA_ARN/g"

// alexa skillをデプロイ
$ ask deploy
```

### 動作確認
```
$ ask simulate -l 'ja-JP' -t '宇宙の豆知識を開いて'
```

# 参考文献
https://qiita.com/snaka/items/d0349892cb4faa8f4646

# その他
スキルの作成も `$ ask api create-skill -f skill.json` でできるようですが、あらかじめlambdaを用意しておかないといけないさそうで、ここだけは手動でやってます。
オリジナルKdB(科目検索)を作ってみよう -1- Node.jsセットアップ編

# 何をやるのか
「筑波大学で使われている科目検索システムの**KdB**を自分の手元でも簡単に作ってしまおう！」
「(サーバ側の)**javascript**の勉強をするぞ！」
「まずは簡単な**アプリケーション**を作っていくぞ！」
ということで、KdBのような実際のWEBアプリケーションをサクッと作ろうという記事です。今回の記事だけでは完結しませんが、最終的には作ったWEBアプリケーションを公開するところまで書いていきたいと思います！
※**Node.js**の基本のキを知ることを目的とします。
<img width="1241" alt="スクリーンショット 2019-02-22 16.11.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/245014/3d0c6b57-d3a9-1be1-4166-f9068a2f9771.png">

# 記事を読む前に
開発環境ですがMacOSやUbuntuといったUnix系OSを前提に話を進めていきます。Windows環境でも開発することはできますが、この記事では取り扱いません。あらかじめご了承ください。

### この記事での開発環境
- MacOS 10.14.3
- Visual Studio Code 1.31.1
- Node.js LTS 10.15.1

# まずは開発環境を整えよう
まずはNode.jsの公式サイト( https://nodejs.org/en/ )から、Node.jsをダウンロードしましょう。
Nodeは偶数バージョンが安定版(LTS版)、奇数バージョンが最新版となっており、最新版では動作が安定しない可能性があるので、今回の開発では安定版である左側の方をダウンロードします。

<img width="1440" alt="スクリーンショット 2019-02-22 16.21.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/245014/e1dbb9bf-cced-6788-388a-a5a53717d31f.png">

ダウンロードしたものを開いたら、基本的には指示に従っていくだけで問題なくインストールできると思います。

<img width="732" alt="スクリーンショット 2019-02-22 16.31.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/245014/901ed3af-daf9-7a88-722c-e00ed32a5f85.png">

これでNode.jsとnpmがインストールできました！ターミナルで確認してみましょう！

```shell
$ node --version
v10.15.1
$ npm --version
6.4.1
```

ちゃんとインストールできてますね。もしインストールできていないようなら他の記事などを参考にインストールしてみてください。個人的には[Homebrew](https://brew.sh/index_ja)やnodebrew, nvmなどを使うと色々便利なのでオススメです。※参考記事を載せておきます※

- https://qiita.com/sinmetal/items/154e81823f386279b33c
- https://qiita.com/sansaisoba/items/242a8ba95bf70ba179d3



# Node.jsでHello World!!
ますは作業ディレクトリを作ります。

```shell
$ mkdir myKdb
$ cd myKdb
```

そしたら次のようなファイルを作ります

```javascript:index.js
console.log("Hello, World!!");
```

これにてHello Worldの準備は完了です！(嘘みたいに簡単ですが、Hello,WorldならこれだけでOK)
ターミナルで次のコマンドを打ってみましょう！！

```shell
$ node index.js
Hello, World!!
$ #ちゃんと表示された！！
```

# これにてNode.js入門完了です！
実際のアプリケーションは何百行と書きますが、実際には環境を整える方が大変だったりするので最も難関な部分を突破したといっても過言ではありません。ここまで難なくできれば次の作業もスムーズにいけると思います！

## 今回のあとがき
「ほんとにこれだけで入門できたの？」って思った人は**nvm**や**nodebrew**,**Docker**などを使って機器やOSに依存しない環境構築をするといいかもです(後々楽になるので)。このシリーズの範疇を余裕で超えるので書きませんが、興味のある方は実際に触ってみてください。

次回は実際にKdBの情報をもとにエンヤコラとやっていきたいと思います。
ここまで読んでくださってありがとうございました！
次回の記事でお待ちしております！

次の記事 → [オリジナルKdB(科目検索)を作ってみよう -2- パース編](https://qiita.com/tkkrr/items/d8a87b4f598b1b107266)
[Web3.js]発火したイベントをフィルターかけて取得する方法

簡単ですが、ちょっとだけ実装に手間取ったのでメモがわりに残しておきます。

環境
Solidity version: 0.5.0
Truffle version: 5.0.1
Web3.js version: 1.0.0

SolidityはEventというフロントエンドでコントラクトを監視する機能がついてます。
つまりブロックチェーン上（Solidity, コントラクト）で何か起きたらフロントエンド（ブラウザ）でそれを察知するという形です。
さらにindexedというmodifierを使うことで、フィルタリングしてある条件の時だけイベントを取得する様にできます。

とりあえずコード書いていきます。

```javascript:Sample.sol
contract Sample{
   uint testData;
   event SetData(address indexed from, uint indexed data);

   function set(uint _data) public {
       data = _data
       emit SetData(msg.sender, data);
   }
}
```
後々フィルターをかけたい条件にはindexedというmodifierをつけてください。これをつけないと、フィルタリングできません。

```javascript:sample.js
    var sampleInstance = instance_set // sampleInstance: コントラクトのインスタンス
    var account = account_set // account: 今ログインしているアカウント

    var dataSetEvent = sampleInstance.Sample({from: account},{fromBlock:1, toBlock: "latest"});

    dataSetEvent.watch((error, result) => {
                  console.log(result);
              });
```
まずはイベントが登録されてるコントラクトのインスタンスを取得します。`instance_set`はテキトーに入れた変数なので、`App.contracts.Sample.deployed().then()`みたいな形でインスタンスを取得してください。同様に`account_set`とテキトーに書きましたが正しい手段で現在のアカウントを取得します。この辺は本筋から離れるので省略して書きました。すみません。

`sampleInstance`というコントラクトのインスタンスから`Sample`イベントを呼び出します。そして第一引数に検索条件、第二引数に検索するブロック範囲を入力します。今回は1番目のブロックから最新のブロックで条件入力してますが、適宜必要なブロック範囲を入力してください。ブロック範囲に関しては入力しないと正しい値が返ってきませんでした。

第一引数は入力しなくても値は返ってきます。上記のコードで`from: account`を入力せずに空白にするとブロック番号1から最新のブロックまでで発火したSampleイベント全てが返ってきます。

取得した`dataSetEvent`を監視するために`.watch`メソッドを使います。
`result`にはイベントに関するログが入っていて、その一部には引数であるfromやdataが入っています。

こんな感じです。何か間違っていたらコメント頂けると幸いです。
簡単なパララックスを世界最速で実装

パララックスという表現をご存知でしょうか。視差効果を利用してwebページを魅力的にしてくれます。

## デモ
http://www.webdesignleaves.com/samples/jQuery/parallax/css_pallarax0.html

こちらの実装はここにまとまっています。
http://www.webdesignleaves.com/wp/jquery/604/

でもこれ結構複雑なんですよね。僕はバリバリのエンジニアではないしここまでしっかり実装する機会もないから簡単にやりたいなーと思っていてその方法を見つけたので紹介します。

## 世界最速のパララックス実装方法

`background-attachment: fixed;`というものを使います。
具体的にはこんな感じ。かなり雑なデモですのでご了承ください。
[デモ](https://ryosuke310.github.io/parallax/)

```html
<div class="parallax">
  <div class="parallax__content">
    <!--parallaxの中身はなんでもOK-->
　 </div>
</div>

```

```css
.parallax{
    background-image: url("hoge/hoge.hoge");
    background-attachment: fixed;
}
```

要はパララックスを適用させたい範囲の背景を`background-image`で指定してあげて（多分-imageをつけないと適用されない）`background-attachment: fixed;`を適用させてあげればできます。

## まとめ

他の実装も試して手の凝ったパララックスも作りたいなと思います。
Laravel チートシート シーダー 編

# php artisan

### 作成
```
php artisan make:seeder BookTableSeeder
```

### 中身
```php
class BookTableSeeder extends Seeder
{
    public function run()
    {
        // 一度リセット
        DB::table('books')->delete();

        // 配列インサート
        DB::table('books')->insert([
            'name'     => "安全なWebアプリケーションの作り方",
            'author'   => "徳丸 浩",
            'price'    => "3456",
        ]);

        // モデルで
        $book         = new Book();
        $book->name   = '安全なWebアプリケーションの作り方';
        $book->author = '徳丸 浩';
        $book->save();
    }
}
```

### 実行
```
php artisan db:seed --class=BookTableSeeder
```
S3+CircleCIでWebページをテスト用に公開する

# 概要

- 以下のようなことがしたくて、簡易に実現したので、その方法をメモ的に載せておきます。

# やりたいこと

- 静的なwebページを作成している途中で社内で内容をレビューしたい
    - が、作成中なのでインターネット上に公開はしたくない
    - が、簡易にやりたいので、認証つけたり大げさなことはやりたくない
    - そもそも静的ファイルなのでサーバとか用意したくない。。
- これらを全て自動化したい
    - 手動でサーバにアップとかヤダ

# 解決策

- webページ(htmlファイル)はS3でホスティングする
- CircleCIつかって自動でファイルをS3にアップする
    - このままでも良いけど、なるべくひと目に触れさせたくないので分かりづらいURLで公開する
- URLが分かりづらいものなので、slackに都度URLを通知するようにする

![circleciによるS3へのファイルアップロード.png](https://qiita-image-store.s3.amazonaws.com/0/51778/1d38a713-9cca-0242-cd42-a922f35d0ceb.png)

# S3の設定

- S3を使った静的ページのホスティングについての設定方法は各所に情報がありますので、そちらを参考にしてください。:bow_tone1:
    - [AWS S3で静的Webページをホスティングする](https://qiita.com/dogwood008/items/a92abae789f4b0466f38)
    - [AWS S3で静的ウェブサイトをホスティングする](https://qiita.com/sungwoo/items/2e49c3008a04e48581ed)

# 分かりづらいURL？

- ある程度の長さがあって被らない文字列で、規則性がなければなんでも良いのですが、今回は現在時刻をキーにしたMD5ハッシュ値を利用することにしました。
- 出力したMD5ハッシュ値でディレクトリを作ってそこにファイルを入れてS3にアップするようにします。
- このようなURLになる想定です。
    - http://＊＊＊＊＊＊＊＊.amazonaws.com/[ハッシュ値]/


# CircleCI設定

- 上記に加えて、最新のファイルのURLが何かがわからなくなってしまうので、S3にアップし終わったらSlackにURLを通知するようにしました。
- config.ymlは以下のようになります。

```yml

version: 2.1
orbs:
  aws-s3: circleci/aws-s3@1.0.0
  slack: circleci/slack@1.0.0
jobs:
  deploy:
    docker:
      - image: 'circleci/python:3.6'
    steps:
      - checkout
      - run:
          name: make deploy directory
          command: |
            DIR_NAME=$(./script/md5_hash)
            mkdir -p "build/${DIR_NAME}"
            cp -pR ./public/* "./build/${DIR_NAME}"
            echo "export DEPLOY_DIR_NAME=${DIR_NAME}" >> $BASH_ENV
      - aws-s3/copy:
          from: "./build"
          to: ${S3_BUCKET_URL}
          arguments: |
            --acl public-read --recursive
      - slack/notify:
          message: "URL: ${SITE_URL}/${DEPLOY_DIR_NAME}"
workflows:
  version: 2
  deploy-s3:
    jobs:
      - deploy:
          context: deploy
```

- S3へのアップとSlackへの通知にはCircleCI Orbsを利用しています。
    - [circleci/aws-s3](https://circleci.com/orbs/registry/orb/circleci/aws-s3)
    - [circleci/slack](https://circleci.com/orbs/registry/orb/circleci/slack)
- 環境変数については以下のようになります。事前にCircleCI側に設定しておきます。
    - **S3_BUCKET_URL**
        - アップするS3のバケット名
    - **SITE_URL**
        - S3のバケットをホスティング設定したときのURL
- これとは別に利用しているCircleCI Orbsで必要な環境変数もあるので確認しておいてください。(AWSのキー設定やSlackのWeb hook URL)
- md5_hashというスクリプトを作ってハッシュ値を生成しています。
    - aws-cliを利用していることもありpythonで簡易に作りました。

```python

#!/usr/bin/env python

import hashlib
import time

def main():
    now = time.time()
    print(hashlib.md5(str(now).encode()).hexdigest())

if __name__ == '__main__':
    main()
```

# 試してみる

- 早速CircleCIに関連付けたgithubリポジトリにファイルを追加したpushしてみましょう。
- こんな感じで指定したバケットにディレクトリが生成されてファイルがアップされています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/51778/57876546-0c34-1fb2-b238-b2442e455b0a.png)

- ファイルのアップロードが完了するとSlackに以下のようにURLの通知が来ます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/51778/6bff6175-18d0-e5e0-9ce9-c8f31206e01a.png)

# まとめ

- とくに問題も無く簡易に実現できました
- 本当は認証をつけるとかの対応が必要なんだとは思いますが、知っている人以外はぼほ分からないURLってことでOKかなと。
- pushするたびにS3にディレクトリが増えちゃうじゃんとか、そうゆうことは言わないでください。。。
JSXでHTMLのようにタグ補完をできるようにする[Atom]

## はじめに
Reactに入門して約1ヶ月が経ちました。
[こちらの記事](https://qiita.com/katsutakashima/items/dfd781faeb0764088da2)でも書きましたが、JSXを使うとHTMLと似たように書けるためとても書きやすいです。
しかし、HTMLでは``tab``を使うと補完機能が使えるのに対し、JSXではその補完機能が使えません。
なので今回は、``apm``を使ってJSXでも補完機能を使えるようにしました。
テキストエディタは``Atom``です。

## 1. apm install emment
```
$ apm install emmet
```
apmとを使って、``emmet``というパッケージをインストールします。
#### apmとは
apmとはAtomのパッケージマネージャーです。

## 2. keymap.csonを書き換える
Atomに戻って``Atom => keymap``から``keymap.csonファイル``を開いて、以下のコードをペースとします。

**拡張子が``.jsx``のファイルの場合**

```keymap.cson
'atom-text-editor[data-grammar="source js jsx"]':
  'tab': 'emmet:expand-abbreviation-with-tab'
```


**拡張子が``.js``のファイルの場合**

```keymap.cson
'atom-text-editor[data-grammar="source js"]':
  'tab': 'emmet:expand-abbreviation-with-tab'
```
これで、Atomをリロード(``comand + option + control + L``)すると
JSXでも、HTMLのようなタグ補完ができるようになります。

## 参考
[Atomでjsxを扱う時に設定すると便利なやつ](https://qiita.com/ksyunnnn/items/e424d37a225adef466ae)
Update - select使用 - サブクエリ使用

ランボー怒りのサブクエリ

## updateできんが

実行結果予想：updTbl.koumoku1 に、[名字***名前]が各行に入る

```sql:update-select
update updTbl
set updTbl.koumoku1 = (
  select concat(A,'***',B)
    from(
      select myoji as A,namae as B
      from(
        select  as myoji, as namae
         from updTbl
      )
   )
)
```
実行結果：エラー「サブクエリは複数の値を返しました。」
は？？？
## updateできるようにした
複数行出力すると怒られるので、innerJoinで結合するようにした　原理はよくわからない
実行結果予想：updTbl.koumoku1 に、[名字***名前]が各行に入る

```sql:update-inner_join-select
update updTbl
set updTbl.koumoku1 = x.rename
from updTbl
inner join
(
  select concat(A,'***',B) as rename
  ,cd /*innerJoinするのに必要なsyain_cd*/
    from(
      select myoji as A
             ,namae as B
             ,cd 
      from(
        select substring(fullname,a,b) as myoji
               ,substring(fullname,x,y) as namae
               ,syain_cd as cd
         from updTbl
      )
   )
)as x
on updTbl.syain_cd = x.cd /*使用するDBは同じだけど別テーブル扱いの為join設定*/

```
実行結果：updTbl.koumoku1 に、[名字***名前]が各行に入る
やったネ
Git基本コマンド一覧


# リポジトリの作成
```terminal
$ git init
```

# ステージング
```terminal
// ファイル指定してステージング
$ git add ファイル名

// 全てのファイルをステージング
$ git add .
```

# コミットする
```terminal
$ git commit -m "メッセージ"

// addとcommitを同時に行いメッセージを残す
$ git commit -am "メッセージ" 
```

# 直前のコミットを取り消し
```terminal
$ git reset --hard HEAD^
```

# 登録したリモートにファイルをアップロードする
```terminal
$ git push origin main
```

# リモートからファイルをダウンロード
```terminal
$ git pull origin main 
```

# 変更したファイルを確認する
```terminal
$ git status 
```
どのファイルがaddされたか確認できます。
(緑になっていればaddされていて、赤になっていればaddされていない。)

# 変更内容を確認する
```terminal
$ git diff 
```

# コミット履歴を表示する 
```terminal
$ git log
```
自分や他人のコミットを確認できます。

# コミット履歴、変更内容を表示する
```terminal
$ git log -p 
```

# ブランチの一覧表示
```terminal
$ git branch
```

# 新しいブランチを作成する      
```terminal         
$ git branch ブランチ名
```

# ブランチを移動する
```terminal
$ git checkout ブランチ名
```

# ブランチをマージさせる
```terminal
$ git merge ブランチ名
```

# マージ取り消す
```terminal
$ git merge --abort
```

# ブランチを削除する
```terminal
$ git branch -d ブランチ名 
```

# 設定の確認
```terminal
$ git config -l
```

# 共有リポジトリの作成
```terminal
$ git init - -bare
```
AWS Systems Manager パラメータストアで設定したパラメータをawscliで取得する

```
$ aws ssm get-parameters --names foo bar
{
    "InvalidParameters": [], 
    "Parameters": [
        {
            "Name": "foo", 
            "LastModifiedDate": 1543198303.726, 
            "Value": "fuga", 
            "Version": 1, 
            "Type": "String", 
            "ARN": "arn:aws:ssm:ap-northeast-1:11111111:parameter/foo"
        }, 
        {
            "Name": "bar", 
            "LastModifiedDate": 1543197464.381, 
            "Value": "hoge", 
            "Version": 1, 
            "Type": "String", 
            "ARN": "arn:aws:ssm:ap-northeast-1:11111111:parameter/bar"
        }
    ]
}
```

これで、fooとbarが取れる。
SecureStringの時は`--with-decryption`のオプションを渡すと人間でも読めるようにしてくれます。
`--qeury`や`jq`を使っていい感じに使いやすいように整形するといいでしょう。
MattermostのXcode(ios版)のエラーbinary's bundle identifier is not prefixed

OSSのSlackみたいなチャットMattermostのmobile版をios(xcode)でビルドしようとした際のエラー。

正直、Signing-Provisioning ProfileでのTeamのエラーの方が大変だった。

記事はこちら

どちらもデータ共有の部分で上手くやり取り出来ない類のエラーだった。Matter mostのプロジェクトには3つターゲットがあるが、このデータ共有のエラー。

#エラー内容
Mattermost mobile のX codeビルド時のエラーで


「Embedded binary's bundle identifier is not prefixed
 with the parent app's bundle identifier.」

*エラー内にparentゴニョゴニョとあります。すいません事後の執筆のために[parent ~]以降は
記録忘れです。

#対応方法

Mattermostプロジェクトから、3つのTargetsを確認。

<img width="1388" alt=" 2019-02-22 14.51.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/345335/a46be3c4-5abb-abdf-7e6b-26366792e63c.png">

<img width="1211" alt="2019-02-22 14.51.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/345335/7fba883e-871d-6a2b-8706-b3ebcb47a1bf.png">

確認・修正するのは、
- Mattermost 
- MattermostShare
のターゲット

タブ[General]→Identity内の

### [Bundle Identity]

を修正する必要がある。理解しなくてもいいひとは下記で対応

||Mattermost|MattermostShare|
|:---|:---:|--:|
|修正前|com.XXX.mattermost|com.YYY.mattermost|
|修正後|com.XXX.mattermost|com.XXX.mattermost.YYY|

#エラーの意味

要は、MattermostShareがMattermostを親に持っていないといけないのでPrefixとしての記載が必要とのこと。


## About prefix
「CIDR表記」と同じ意味。

つまり
「198.51.100.xxx/24」のようにIPアドレスとサブネットマスクを同時に表現する書き方のこと
正規表現がわからない！！（たすけてJSの偉い人）

#正規表現がわからない！！

以下のコードを書いてみたら、ダイアログが表示されないことに気付いた。
正規表現リテラルを「var ptn=/\\\\/g;」にすればダイアログ表示できるのに、なぜだ（　＾ω＾）・・・

```javascript:何故かダイアログが表示されない
orig=" \\ ";
var ptn=/\b\\\b/g;
var flag=orig.match(ptn);
if(flag!=null){
    alert('match');
}
```

#結論：だれかおしえてたすけて！
django forms.save(commit = False)の役割について

forms.save(commit = False)の役割について

下記の記事がイメージをつかむのに
分かりやすかった
https://narito.ninja/blog/detail/37/

ちなみにTutorialはこちら
http://djangoproject.jp/doc/ja/1.0/topics/forms/modelforms.html
[C++] A easy way to check bits of int

In c++ we can use bit set to check the binary formation of a int value.

```c++
int a = -1;
std::bitset<32> b(a);
cout << b << endl;
```

The output

```
11111111111111111111111111111111
```


We also can loop every bits and output it.

```c++
void binary_formation(int x) {
    for (int i = 31; i >= 0; --i) {
        cout << (((1 << i) & x) ? 1 : 0);
    }
    cout << endl;
}
```
【Googleスプレッドシート】複数の条件に一致するレコードごとに連番を振る

一般的に使うケースはあまり無いかもしれません。
ですが、ゲーム開発でデータ管理をしようと自分はよく使います。

##こんな表でモンスターを管理したい
| Name | Id | Attribution | Rank | Serial |
|:--|--:|--:|--:|--:|
| Slime | 100 | 1 | 1 | 0 |
| Mermaid | 101 | 1 | 1 | 1 |
| Slime | 102 | 1 | 1 | 2 |
| Alligator | 103 | 1 | 2 | 0 |
| Lizardman | 104 | 1 | 2 | 1 |
| Merman | 105 | 1 | 2 | 2 |
| Blue Demon | 106 | 1 | 3 | 0 |
| Shark Man | 107 | 1 | 3 | 1 |
| Sea Dragon | 108 | 1 | 3 | 2 |
| Goblin | 200 | 2 | 1 | 0 |
| Pumpkin head | 201 | 2 | 1 | 1 |
| Fire Lizard | 202 | 2 | 1 | 2 |
| Red Demon | 203 | 2 | 2 | 0 |
| Dragon Puppy | 204 | 2 | 2 | 1 |
| Goblin Sherman | 205 | 2 | 2 | 2 |

| カラム名 | 説明 |
|:--|:--|
| Name | モンスターの名前 |
| Id | 一意な値 |
| Attribution | 属性 |
| Rank | ランク |
| Serial | 属性、ランクごとの連番 |

※条件付き書式で色付けたりすると見やすい
![image.png](https://qiita-image-store.s3.amazonaws.com/0/237014/fd95d938-2525-4047-a6ea-9995c2c69ee0.png)

##IdとかSerialを自動で振りたい
開発中だとモンスターのレコードを増やしたり減らしたり、属性やランクを変更したり、が何度も発生します。

その都度IdやSerialを手動で振り直すのは面倒です。そこで、スプレッドシートの関数を使って自動で振られるようにします。

##Idの振り方（条件ごとに連番）
Idの採番ルールは、百の位が属性、十の位以外が連番なります。
なので、属性ごとに連番が振られるように関数を使います。

使えるのは```COUNTIF(範囲, 条件)```です。
[公式ドキュメント](https://support.google.com/docs/answer/3093480?hl=ja)

今回のケースではC2セルに次の関数を入れて使います。
```=COUNTIF(C$2:C2,C2)+C2*100-1```
範囲の開始を1行目のレコードで固定にするため、```C$2```を開始として、終了を自分のセル```C2```にしているのがポイントです。
1の位が0から始まって欲しいので最後に-1をしてます。

##Serialの振り方（複数条件ごとに連番）
Serialの採番ルールは、属性とランクが同じモンスターごとに連番になります。
今度は複数の条件を見る必要があるので、```COUNTIF(範囲, 条件)```は使えません。

代わりに```COUNTIFS(条件範囲1, 条件1, [条件範囲2, 条件2, ...])```を使います。
[公式ドキュメント](https://support.google.com/docs/answer/3256550?hl=ja)

今回のケースではC2セルに次の関数を入れて使います。
```=COUNTIFS(C$2:C2,C2,D$2:D2,D2)-1```
まず条件範囲1, 条件1には、Idと同じようにC列Attributionを設定します。
次に、条件範囲2と条件2を設定します。
D列でも範囲の開始を1行目のレコードで固定にするため、```D$2```を開始として、終了を自分のセル```D2```にしているのがポイントです。
1の位が0から始まって欲しいので最後に-1をしてます。

これで貼り付けたスクリーンショットのような表が完成します。

##注意点
１．レコードの順番を入れ替えるとズレる
条件のセル位置はズレるのに範囲（条件範囲）のセル位置は変わらないため、数値がズレてしまいます。データを編集後、ゲームに流し込む前には一度正しい関数を貼り付け直す必要があります。

２．リリース後はIdを変えない
当然の話ですが、リリース後にIdを変えるとプレイヤーのデータが不整合を起こす可能性があります。

今回のようにモンスターだとあまり問題がないかもしれませんが、プレイヤーが所有するアイテムや装備品だと持ち物が入れ替わるため非常にまずいです（データの持ち方によります）。
モンスターを仲間にできるシステムがあると装備品と同様の問題が発生します。

動的なId採番はあくまで開発中の仕組みと割り切って活用しましょう。
paperclipの使い方

##初めに
ここでは画像のアップロード機能を実装するためのgemの紹介をします。

##paperclipをインストール
まずはimagemagickが無いと何も始まらないのでこれをインストールする。

```:ターミナル
brew install imagemagick
```

```:Gemfile
gem ‘paperclip'
```

```
$ bundle
```


##画像用のカラムを追加
今回はユーザーのプロフ画像に使用したいのでUserモデルを使う。

```:ターミナル
$ rails g paperclip user avatar

# userはモデル名
# avatarは追加したいカラム名
```

このコマンドを使うとavatar以外にavatarのfile名や画像を追加した日など４つ程のカラムが作成される。


##Userモデル

```:user.rb
class User < ActiveRecord::Base
  has_attached_file :avatar, 
              styles: { medium: "300x300>", thumb: "100x100>" }, 
         default_url: "/images/:style/missing.png"
  
  validates_attachment_content_type :avatar, content_type: /\Aimage\/.*\z/
end
```
・has_attached_fileは画像のサイズやデフォルト画像、画像ファイルの保存先などを設定するオプション

・ validates_attachment_content_typeは画像の種類のバリデーションを設定するオプション


##確認してみる
```
$ rails c

# ユーザーモデルのインスタンスを生成
> user = User.new

# avatarの設定
> user.avatar = File.new("app/assets/images/画像ファイル名", "r")

# 設定されているか確認
> p user.avatar
```
qsubして、雑にジョブが終わるまで待つ

# 概要

何かのジョブを投げるスクリプトなり、コマンドがあって、
それの実行を待ちたいとき、いろいろな方法があるとおもうが、
一つの例。

# まとめ

いくつかあるので、それぞれスクリプト例をあげてみる。

## ほかに、自分のジョブがなくてただまつだけ

共有計算機であれば、自分のidのジョブだけとかいろいろあるとおもいますが、
今回のは、たんに、`qstat` の結果だけを利用する。



ジョブのスクリプト

```bash:some_jobs_script.sh
#!/bin/bash
sleep 30
```

ジョブを投げてそれを待つスクリプト

```bash:wait.sh
#!/bin/bash


function waitfunction() {
  while :
  do
    RET=$(qstat | wc -l)
    if [ $RET -eq 0 ]; then
      return
    else
      echo "Sleep 5sec"
      sleep 5
    fi
  done
}

echo "Start"
qsub  some_jobs_script.sh
waitfunction
echo "Done"
```

## qstatで出力される特定の文字列がなくなるのを待つ。

ジョブに名前がついていればそれで待つこともできる。
注意点としては、ジョブの名前が長い場合、qstatで出てくるかは、確認する

以下のスクリプトは、

```bash:wait_qsub_by_name.sh
#!/bin/bash


function waitfunction_by_jobname() {
  while :
  do
    RET=$(qstat | grep $1 | wc -l)
    if [ $RET -eq 0 ]; then
      return
    else
      echo "Sleep 60sec"
      sleep 60
    fi
  done
}

#
echo "Start"
# 最初の引数($1)の名前がでてこなくなるまで待つ
waitfunction_by_jobname $1
echo "Done"
```

### 使い方例

```
大量のジョブを投げるこのときに、接頭辞などでJOBNAMEをつける。
./wait_qsub_by_name.sh JOBNAME
``

## TODO 特定のjobidをまつ

qsubしたときに、ジョブのIDがわかれば、それをまつことができるのではないか？
linuxコマンドで出てくる「再帰的」という言葉について調べてみた

# そもそもなんで「再帰的」という言葉につまづいた？

### 指定フォルダ配下を再帰検索

```
find [検索対象フォルダのパス] -type f -name "*[検索したい文字列]*"
```
上記のようなコマンドを使う機会があり「ん・・・？再帰的ってなんだ？」となった。

# 再帰的とは？

>再帰的定義（Recursive Definition）は、再帰的な定義、すなわち、あるものを定義するにあたってそれ自身を定義に含むものを言う。 無限後退を避けるため、定義に含まれる「それ自身」はよく定義されていなければならない。 同義語として帰納的定義（Inductive Definition）がある。

[wiki:再帰的](https://ja.wikipedia.org/wiki/%E5%86%8D%E5%B8%B0%E7%9A%84%E5%AE%9A%E7%BE%A9)

むちゃくちゃむずかしく書かれている・・・。
もっと簡単な訳はないか探してみたらこちらの訳が参考になった。

>「ディレクトリ内に存在するものに一つ一つに対して処理をする」

[再帰的ってどんな意味？](http://blog.livedoor.jp/engineercollege/archives/46559976.html)


初心者エンジニアが自分なりに咀嚼してみると（意訳だけど）
>上司の責任は、部下の責任だぞ！

みたいな感じでいいんじゃないかな。(おい)


# lsコマンドを使って「再帰的」を実現してみる。

まず、testディレクトリにtest2ディレクトリが含まれている状況を作る。

```
vagrant@localhost:~/room$ mkdir test
vagrant@localhost:~/room$ ls
test
vagrant@localhost:~/room$ cd test/
vagrant@localhost:~/room/test$ mkdir test2
```

次に、以下のlsコマンドを使って再帰的な状況を実現する。
このコマンドを実行した時、指定したディレクトリの中を再帰的（つまり、ディレクトリの中に含まれるディレクトリにも処理を適用させる）に表示させる動作をする。

```
$ ls -R test
# ちなみに、この「-Rオプション」は【再帰的に】の意味のリカーシブ(recursive)の略。
vagrant@localhost:~/room$ ls -R test/
test/:
test2
```

無事、testディレクトリの中身のtest2ディレクトリにもlsコマンドを適応＝再帰的にできました！！
Windowsのコマンドライン 


#停止中のプログラムをバックグラウンドの状態で再開
```
bg
```
#指定したファイルから特定のフィールドを抜き出したい場合に使用
```
cut
```
# デバイス間でディスク内容のコピーを行ったり、ブートディスクの作成に使用
```
dd (dataset definition)
```

#  ファイルシステムについて、使用領域と空き領域のサイズを表示
```
df (disk free)
```
# DNSサーバーに対して問い合わせを行い、その結果を表示する
```
dig (domain information groper) 
```
# 環境変数の表示
```
env
```

# ファイル内のすべてのタブ文字をスペース文字に変換
```
expand
```

# 環境変数を設定するためにしよう
```
export
```

# シェルにテキストファイルの最初の数行を表示
```
head
```

# コマンドの実行履歴の表示
```
history
```

# IPアドレスを表示
```
ifconfig
```

# 現在のシェルで実行中のバックグラウンドタスクの表示
```
jobs
```

# ファイルやディレクトリの情報を表示
```
ls (list segments)
```

# ファイル内の各行の先頭に行番号を表示
```
nl (number lines of file)
```

# 実行中のプロセスがログアウト後も実行を継続する
```
nohup (no hungup) 
```

# ファイルの内容を8進数や16進数で表示
```
od (octal dump)
```

# すでに実行中のプロセスの優先度を変更
```
renice
```

# 指定したファイルをコマンドに従って処理し、標準出力へ出力
```
sed (stream editor) 
```

# シェルのオプションを設定、定義済みのシェル変数と環境の一覧を表示
```
set
```

#  複数のファイルをまとめて1つのファイル(アーカイブ)を作成、アーカイブからファイルを取り出す時に使用
```
tar (tape file archieves)
```

# 目的のホストまでのネットワーク経路を表示する
```
traceroute
```

# コマンドの実行結果を標準出力とファイルへの出力の両方を実行
```
tee
```

# カーネルバージョンやマシンハードウェア名などのシステムの情報を表示するコマンド
```
uname (user name) 
```

# 作成した変数を削除
```
unset
```
[Unity] Shaderで四角い穴を開ける

UnityでShaderを使って四角い穴を開けたい…。
丸い穴を開ける記事は見つけたけど、四角が見当たらなかったので作りました。
べた塗りしか対応してないので、テクスチャ込みなのはまた今度。

# 環境
Unity 2017.2

# Shader
``` BoxMask.shader
Shader "Custom/BoxMask" {
	Properties {
		_BoxSize("Box Size", Vector) = (1.0, 1.0, 0.0, 0.0)
		_BoxPos("Box Pos", Vector) = (0.5, 0.5, 1.0, 1.0)
		_Color ("Color", Color) = (0.0,0.0,0.0,1.0)
	}
	
	SubShader {
		Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
		
		ZWrite Off
		Blend SrcAlpha OneMinusSrcAlpha 
	
		Pass {
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
				
			#include "UnityCG.cginc"
			
			fixed4 _BoxSize;
			fixed4 _BoxPos;
			fixed4 _Color;
		
			struct v2f {
				float4 pos : POSITION;
				float2 uv : TEXCOORD0;
			};
			
			v2f vert (appdata_base v)
			{
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				o.uv = float2(v.texcoord.x, v.texcoord.y);
				return o;
			}
			
			half4  frag (v2f i) : COLOR
			{
				half4 col = _Color;
				fixed4 pos = i.pos;

				if(	pos.x < _BoxPos.x + (_BoxSize.x / 2) && 
					pos.x > _BoxPos.x - (_BoxSize.x / 2) && 
					pos.y < _BoxPos.y + (_BoxSize.y / 2) && 
					pos.y > _BoxPos.y - (_BoxSize.y / 2))
					{
						clip(-1.0);
					}

				return col;
			}
			ENDCG
		}
	}
}
```

# 結果
背景が白で、黒い半透明の真ん中に四角い穴を開けてみる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/322717/fc3f2836-0ec6-6520-85f9-9465190f024c.png)

スマホゲームのチュートリアルとかで「ここに注目して！」みたいな時に使えるんじゃないかな？
AWS Linux2 LAMP環境作成手順～簡単版

１、Amazon Linux2をインストールする
```略```
２、SUに切り替える
```sudo su -```
３、タイムゾーンを変更する
```timedatectl set-timezone Asia/Tokyo```
４、Amazon Linux Extras リポジトリの有効化
```amazon-linux-extras list```
５、表示したmariadbをインストールする
```amazon-linux-extras install lamp-mariadb10.2-php7.2```
６、Apacheをインストールする
```yum -y install httpd-devel mod_ssl zlib-devel```
７、PHPをインストールする
```yum -y install php php-devel php-pdo php-mysqlnd php-mbstring php-gd```
８、MariaDBをインストールする
```yum -y install mariadb-devel mariadb-server```
９、PHPの設定
```vim /etc/php.ini```
expose_php = On
　↓
expose_php = Off
 
;date.timezone =
　↓
date.timezone = 'Asia/Tokyo'
１０、WordPressをインストールする
```cd /var/www/html
wget https://ja.wordpress.org/wordpress-4.9.7-ja.tar.gz
tar xvf wordpress-x.x.x-ja.tar.gz
chown -R apache:apache .```
１１、MariaDBの起動と自動起動設定
```systemctl start mariadb```
```systemctl enable mariadb```
１２、Wordpress用のデータベースとユーザーを作成する
```mysql```
```MariaDB [(none)]> create database wordpress default character set utf8;```
```MariaDB [(none)]> grant all on wordpress.* to wordpress@localhost identified by 'password';```
```MariaDB [(none)]> flush privileges;```
１３、Apacheの起動と自動起動設定
```systemctl start httpd```
```systemctl enable httpd```
１４、WordPressの初期設定
```略```

※.参照文章
①https://blog.apar.jp/web/9185/
②https://qiita.com/cherubim1111/items/4a89856e743f287c599f
Amazon Sumerianのスクリプト上でアセットからリソースをロードする

例えば、[MeshData - Documentation](https://content.sumerian.amazonaws.com/engine/latest/docs/MeshData.html)のEXAMPLEにあるようにentityを動的に生成してAssetsに存在するスクリプトを設定する場合は以下のようなコードでいける。

```javascript
ctx.world.loader.loadInstance("3d730bb27ff944eba3610f223f3bff84.script").then((script) => {
    var scriptComponent = new sumerian.ScriptComponent();
    scriptComponent.addScript(script);
    quadEntity.setComponent(scriptComponent);
}).catch(e => {
    console.log("failed to load script");
    console.log(e);
});
```

* quadEntityは動的に生成したentity
* 3d730bb27ff944eba3610f223f3bff84.scriptはアセットのIDでアセットにあるスクリプトのインスペクターのIDから確認可能
![sumerianassetsid.PNG](https://qiita-image-store.s3.amazonaws.com/0/16768/1507a9b3-f59e-7500-2a47-e7335bfbeb48.png)

# シーンの発行について

シーンを発行してから気づいたけどエンティティとして存在しないアセットはロードできなさそう。
正式な対応方法はわからないけど、シーンに空エンティティ追加して対象のアセットを追加しておくなどしないといけない感じ。
ビルドツールについて


#ビルドツールとは
* デプロイまでにする作業は実際「要求された実行環境で動作できる形式にアプリケーションやライブラリを組み立てる」ことをしている、これをビルドという。※作業としてコンパイルとか外部ライブラリのリンクとか、静的解析とか、テストとか
* またビルドという言葉には広義的な意味で「定型的な作業を行うこと」という意味がある。今回は広義的な意味でなく上記の要求された環境で動作するよう組み立てる意味でビルドを使う。　

#ビルドの進化の流れ
1. 人力ビルド
    * 大きなコードだとコンパイルや静的解析に時間かかるので、ジュニアなメンバにビルド作業させることが多かった
    * リリースのたびに手作業でコマンド打っているのは、運用的にも品質的にもまずい。そのため2のビルドスクリプトへ
2. ビルドスクリプト
    * ビルド作業で実行するコマンドをシェルスクリプトやコマンドファイルにまとめて、それを叩く。
    * しかし、コードのコンパイルはできてるのに、テストコード間違ってもっかいコードもコンパイルするとか無駄なので、ビルドスクリプトでは対応できない処理を3のビルドツールで解決
3. ビルドツール
    * ビルドスクリプトの処理を分割して、前の処理結果に応じて次の処理を実行するかをプログラムできるようにした。
    * ライブラリの依存関係の管理。これに特化した「パッケージマネージャー」てのがある。javascriptのnpmやRubyのRubyGemsとか
    * タスクのインプットとなるファイルを監視して、変更があったら自動的にタスクを実行する。GruntのwatchやGradleのcontinuous build
4. 継続的インテグレーション（CI）※ここから4,5はビルドツールを使ったうえで、さらに品質高めたいみたいな場合
    * 継続的にアプリケーションのビルドをして、自動テストを回し、常に出荷可能なアプリケーションをビルドし続けよう、というプラクティス。
5. 継続的デリバリー、または継続的デプロイメント
    * CIが細かく回ったら、常に最新のプロダクトを自動的にリリースできるような仕組みを作ることもできる。これを継続的デリバリーや継続的デプロイメントという。

#ビルドツール:いろんなビルドツールの紹介
* GNU Make :ビルドツールの草分け。C C++のビルドで使える。

* Ant
    * 特徴
        * javaむけ
        * ビルドファイル名のデフォルトはbuild.xml
    * メリット
        * antもjavaでかいてるから、マルチプラットフォームでいける
        * eclipseに標準なので、インクリメンタルビルド
        * インクリメンタルビルド:変更部分だけのビルド
    * デメリット
        * xmlで記述なので、ビルドファイルの可読性が低い→Mavenでも変わらず、、Gradleで解決！
        * 宣言的にビルドスクリプトを書くみたいで、スクリプト書きにくい→Mavenで解決？
* Maven
    * 特徴
        * antにかわるもの！？
        * pom.xmlでプロジェクト構造を定義
        * ライブラリ依存解決！
        * ライブラリ依存解決する意味でのMavenと、ビルドツールの意味でのMaven。どっちで文脈として使われてるか気をつける。※それくらいライブラリ依存解決に活躍してるとことか！、
    * メリット
        * ライブラリ依存管理と「セントラルリポジトリ」を編み出した
        * プロジェクト構造に規約を持ち込むことで、antよりビルドスクリプトの記述がスッキリした。
    * デメリット
        * 以前、ビルドファイルがxml
        * スクリプトはスッキリしてもやはり、宣言的で、規約に縛られて、書きにくい
* Gradle
    * 特徴
        * これまでのビルドツールのいいとこどり
        * ビルドスクリプト名のデフォルトはbuild.gradle
        * c c++ object-c のサポートもある（Google Testing Frameworkてのを標準サポートしてる。）
            * Google Testing Framework:c++のより良いテストができる
        * Android Studioでデフォルト
    * メリット
        * xmlから解放、Groovyを使ってる
            * Groovy scriptで記述してる？いまは省略、成長したら！
        * Mavenリポジトリによるライブラリ依存解決が可能
        * マルチプロジェクトサポート
        * ビルドツール自体にプラグイン機構が組み込まれている。独自拡張ができる
        * これまでのツールと違い、各開発者が自分の環境にツールのインストールをする必要が無くなった。Gradleはスタンダロンで動作可能な実行ファイルを簡単に配布可能。※外部からライブラリをダウンしなくてよい
    * デメリット
        * DSLの理解が必要
            * DSL:domain specific language
                * 特定の用途に特化した、コンピュータ言語。
        * 遅いらしい、Antと同じくらい
* Bazel
    * 元Googleのツール、クックパッドプログで取り上げられ、注目されたらしい
* Grunt
    * javascriptむけ
    * ビルドツールやりタスクランナーといわれる
    * ビルドスクリプト名はGruntfile。JSONで記述する。
* Gulp
    * javascriptむけ
    * Gruntの対抗
    * Node.jsと相性いいみたい
* SBT
    * Scalaむけ
    * ビルドスクリプト名はbuild.sbt

#まとめ
FirebaseでDatabaseのルールがなぜかリセットされてしまうときの凡ミス

# 現象
[Vue.js＋Firebaseで認証付きチャット | 基礎から学ぶ Vue.js](https://cr-vue.mio3io.com/tutorials/firebase.html) を参考にVueとFirebaseを初めて触っていたのですが、
Databaseにルールを記載してもいつの間にか元に戻ってしまっていました。

# 解決
自分のプロジェクト内にある`database.rules.json`にルールを記載しましょう。

# 詳細
[Vue.js＋Firebaseで認証付きチャット | 基礎から学ぶ Vue.js](https://cr-vue.mio3io.com/tutorials/firebase.html) の「Firebase のルールの定義」という章で、ログインしているユーザーであれば、チャットの読み書きができるようにするルールが紹介されておりました。

>
```ruby:RealtimeDatabase
{
  "rules": {
    // デフォルトの読み書きはすべて拒否
    ".read": false,
    ".write": false,
    "message": {
      ".read": "auth != null", // 読み込みは認証が必要
      ".write": "auth != null" // 書き込みは認証が必要
    }
  }
}
```

して、こちらのルールをfirebaseのDatabaseに記述したところチャットがちゃんと動きました！∩( ・ω・)∩ばんじゃーい
と思ったのも束の間、他の作業をしていたらいつの間にかチャットがうまく動かんやんけ……と思って見直したところ、書いたはずのルールがリセットされているではありませんか。

```ruby:RealtimeDatabase
{
  "rules": {
    ".read": false,
    ".write": false
  }
}
```

**なんでや。**

## 答えはいつも公式にある
[データベース ルールを使ってみる &nbsp;|&nbsp; Firebase Realtime Database](https://firebase.google.com/docs/database/security/quickstart)
>注: Firebase CLI を使用してセキュリティ ルールをデプロイすると、Firebase コンソールにある既存のルールが、プロジェクト ディレクトリで定義したルールで上書きされます。そのため、Firebase コンソールでセキュリティ ルールを定義または編集する場合は、必ずプロジェクト ディレクトリで定義したルールも更新してください。

これよ～これ

## プロジェクト内のルールも更新しよう
プロジェクト作成時にファイル名の指定などを特にしてなければ、`database.rules.json`がルールを定義しているファイルです。
そこにDatabaseに書いたルールと同じものを書いてデプロイすればちゃんと更新されます。
（つまりはFirebase consoleで定義したルールを、デプロイするたびに自ら初期化していたということですから、愚かのキワミですアッー！）

ちなルールを書いたファイルの場所は`firebase.json`に記載してあります。

```ruby:firebase.json
{
  "database": {
    "rules": "database.rules.json"　←ここです
  },
  省略・・・
}

```


おしまい
denite.nvim + ag な file/rec の設定をさらに爆速にする

# はじめのはじめに
この記事は `denite.nvim + ag` と銘打ってありますが、おそらく他のファイル列挙ツール（`ripgrep` など）とも連携できると思います。

# はじめに

vim 使ってますか？
僕は IntelliJ を試したりをしたけど、やっぱり vim になりました。
PHP を書く時だけは未だに PHPStorm ですが。。。

今回はすでに高速な denite.nvim の file/rec を爆速にする設定を紹介します。

# 対象読者

- 頭の悪いファイル数なプロジェクトで file/rec が遅くて困っている
- denite.nvim を使っている
- denite.nvim の matcher/ignore_globs を設定している
  - してないならしましょう！

# 設定

普通はこう設定していると思います。（ドキュメントにも書いてあるし！）

```viml
" file/rec に ag を設定
call denite#custom#var('file/rec', 'command', ['ag', '--follow', '--nocolor', '--nogroup', '-g', ''])

" 特定ディレクトリをリスティングしない
call denite#custom#filter('matcher/ignore_globs', 'ignore_globs', ['.git', '.svn', 'node_modules'])
```

この設定では「一度 ag で列挙してからフィルタで非表示にする」という状態です。
メンタルモデルとしてはわかりやすいのですが、端的にいうとエコじゃないです。
下記の設定に変えたところ爆速になりました。

```viml
let s:ignore_globs = ['.git', '.svn', 'node_modules']

" そもそも ag のレベルで検索対象からはずす
call denite#custom#var('file/rec', 'command', [
      \ 'ag',
      \ '--follow',
      \ ] + map(deepcopy(s:ignore_globs), { k, v -> '--ignore=' . v }) + [
      \ '--nocolor',
      \ '--nogroup',
      \ '-g',
      \ ''
      \ ])

" matcher/ignore_globs 以外のお好みの matcher を指定する
call denite#custom#source('file/rec', 'matchers', ['matcher/substring'])

" 他のソース向けに ignore_globs 自体は初期化
call denite#custom#filter('matcher/ignore_globs', 'ignore_globs', s:ignore_globs)
```

# 終わりに
こういう tips を定期的に投げていこう運動やってます。
Dockerコマンド一覧

## バージョンの確認
```
docker version
```

## Dockerfileを元にイメージを取得後コンテナの作成を行う

```
docker-compose build   
```

## コンテナの起動
```
docker-compose up
docker-compose up -d (バックグラウンドで起動)
```
## コンテナを全停止する。
```
docker stop $(docker ps -q)
```
## コンテナのプロセスの確認

```
docker-compose ps
docker ps -a
```

## 起動中のDocker コンテナのシェルに入る
```
docker exec -it コンテナのID bash 
```
## 立ち上がっているコンテナに入る
```
docker-compose exec app bash 
```
外部モジュールをimportすると、「Unable to import 'module-name' pylint(import error)」と表示される

pythonでのコーディング中、標準モジュールはimportされるのに、pipで追加したモジュールはimport errorが発生する事象が発生しました。

pipで確認してもインストールされていて、コード自体も正常に実行できます。

<img width="535" alt="スクリーンショット 2019-02-22 13.51.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/89429/db85e89f-76c4-11ae-47c6-60f35f052dc4.png">

## 環境

* python 3.6.4(pyenv使用)
* VS Code

## 原因

いろいろ調べてみたら、VSCodeの`.vscode/setting.json`で設定されているpythonと、pyenvのpythonが違っていたために起こったエラーのようでした。

```.vscode/setting.json
{
    "python.pythonPath": "/usr/local/bin/python3"
}
```

```bash
$ which python
/Users/dynamonda/.pyenv/shims/python
```

## 対処法

`.vscode/setting.json`の`pythonPath`をpyenvのものに変更します。

```.vscode/setting.json
{
    // "python.pythonPath": "/usr/local/bin/python3"
    "python.pythonPath": "/Users/dynamonda/.pyenv/shims/python"
}
```

これでimport errorが発生しなくなりました。
Ruby　学習　基本（case 条件分岐）

#はじめに
Rubyの学習を始めました。学んだことを忘れないように備忘録として残しています。

##　case 条件分岐

```ruby

signal = gets.chomp # gets キーボードで入力した文字列を収録
                    #　gets.chomp 改行を解除
 case signal
 when "red"
   puts "Stop!"
 when "green"
   puts "go!"
 when "yellow"
   puts "caution!"
 else
   puts "wrong signal!"
 end


```
【Rails】 DBのcolumnをstringからintegerにする方法

Railsでchange_columnを使用し、string→integerにする時につまったのでメモ

```ruby:
...
  def up
    change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'
  end
  
  def down
    change_column :table_name, :column_name, :string
  end
...
```