OmniAICreator/Qiita-1.07M huggingface dataset:
RedmineのデータベースをMySQLからPostgreSQLへ移行した（補足）

# 目的（＋本記事の背景）

Redmine の Database を MySQL で運用していたのですが、
MySQL 5.6 以上や MariaDB には、 [Redmine Issue #19344](https://www.redmine.org/issues/19344) , [#19395](https://www.redmine.org/issues/19395) , [#17460](https://www.redmine.org/issues/17460) という不具合があるのと、
これらのチケットが数年も放置されている状況を踏まえて、
PostgreSQL に移行することにしました。

幸いにも、Qiita の記事 [『RedmineのデータベースをMySQLからPostgreSQLへ移行した』](https://qiita.com/ryouma_nagare/items/c4ba5298dd283333bb85) に、
目的とする内容の手順が書かれていたので、
記事の著者に感謝しつつ、記事の内容どおりに行ったのですが、
wiki の履歴が移行できなかったので、
対策した結果を以下に記します。

# 謝辞

[元記事](https://qiita.com/ryouma_nagare/items/c4ba5298dd283333bb85) の ryouma_nagare さんには**深く感謝申し上げます**。:bow_tone1:


# 内容

### 実施環境
- OS: Ubuntu 18.04.03 LTS
- Redmine: 3.4.6
- Ruby 2.4.9
- MySQL Server 5.7.27
- PostgreSQL Server 10.10

[元記事](https://qiita.com/ryouma_nagare/items/c4ba5298dd283333bb85) と同様に、
同一ホストで MySQL -> PostgreSQL へ migration します。

### 手順

[元記事](https://qiita.com/ryouma_nagare/items/c4ba5298dd283333bb85) のとおりです。

### 本題：遭遇した不具合

[元記事](https://qiita.com/ryouma_nagare/items/c4ba5298dd283333bb85) のとおりに実行したら、
以下のエラーメッセージが表示され、wiki の履歴が移行できていませんでした。

```text:error
org.embulk.exec.PartialExecutionException: java.lang.RuntimeException: org.postgresql.util.PSQLException: ERROR: invalid input syntax for type bytea
  場所: COPY wiki_content_versions_ ...
```


### 対策

[元記事](https://qiita.com/ryouma_nagare/items/c4ba5298dd283333bb85) の投稿者さんも留意点で書かれているように、
embulk は longblob や bytea などに対応していないので、
[元記事](https://qiita.com/ryouma_nagare/items/c4ba5298dd283333bb85) では、
wiki_content_versions テーブルの data カラム (MySQL では longblob型) を utf8 の string に変換し,
PostgreSQL に string 型 (PostgreSQLの wiki_content_versions テーブル内では bytea型) で
データをコピーしていましたが、
その部分を、以下のパッチのように変更しました。

```diff
%diff extra/wiki_content_versions.yml.liquid extra/wiki_content_versions.yml.liquid,orig
14c14
<            ,cast(data AS BINARY) as data
---
>            ,convert(data using utf8) as data
33c33
<     data: {value_type: byte}
---
>     data: {value_type: string}
```

この変更で、無事に履歴もコピーできました。
Vega解説 〜動的なグラフ〜

前回は[ここ](https://qiita.com/ihgs/items/87fda0cd39693bae44f3)

今回は、interactiveなグラフを書いていきます。

## カーソルを合わせた時に色を変える

バーチャートのバーにカーソルを合わせた時に赤色に変え、外すと青色に変えます。

![スクリーンショット 2019-10-13 23.49.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51316/9ae2bd92-1366-df0d-99bd-2147d85f5705.png)


[Vega Editorで開く](https://vega.github.io/editor/#/gist/54fcc244e57c652c3d4d227881fcdecc/04_barchart_hover.json)
[前回との差分](https://ihgs.github.io/online-diff/?diff=ihgs/54fcc244e57c652c3d4d227881fcdecc/raw/01_barchart_base.json...ihgs/54fcc244e57c652c3d4d227881fcdecc/raw/04_barchart_hover.json)

カーソルを合わせた時に色が変わるのは、 `encode` プロパティに`hover`を追加することで実現しています。
`hover` 属性で色を更新するだけだと、カーソルを外した時でも色が変わったままになりません。
そのため、`enter` プロパティにあった色の設定を、`update` に移動することで、変更を感知して色を戻るようにしています。


## カーソルを合わせた時にテキストを表示する

バーにカーソルを合わせた時に、バーの上に数字を表示します。
`signals` と `text` typeのMarkを追加することで実現します。

![スクリーンショット 2019-10-13 23.49.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51316/0e430bed-0412-fdb3-6198-7ba3fb680e47.png)



[Vega Editorで開く](https://vega.github.io/editor/#/gist/54fcc244e57c652c3d4d227881fcdecc/05_barchart_intractive.json)
[差分](https://ihgs.github.io/online-diff/?diff=ihgs/54fcc244e57c652c3d4d227881fcdecc/raw/04_barchart_hover.json...ihgs/54fcc244e57c652c3d4d227881fcdecc/raw/05_barchart_intractive.json)

`signals` を追加しています。これは、変数のようなもので動的に値を変更できます。
ここでは、`marks` の `rect` に対するイベントによって値を変更します。バーにカーソルを合わせた時に、合わせたバーのデータで`signals` の値をアップデートしています。これは、Vega EditorのSignal View Window で値が変わっていくことを確認できます。

![スクリーンショット 2019-10-13 23.52.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51316/095d782e-c0c9-586c-78f7-f65f2b96e35a.png)



なお、`rect` の代わりに、`name` で指定した値を直接指定することもできます。

```
"on": [
  {"events": "@layer_0:mouseover", "update": "datum"},
  {"events": "@layer_0:mouseout",  "update": "{}"}
]
```

これで、Vega Examples にある一番最初のBar Chart とほぼ一緒になります。



次回は、[時系列データ](https://qiita.com/ihgs/items/05e10b9f20faa002be18) です。
初学者がプログラミング学校に行って思った事

学校に行って思った事を参考になればとアウトプット

#ターゲット
1.プログラミングに興味がある人
2.プログラミング初学者
3.僕と同じようなジョブチェンジ希望者
4.28歳以上の方
5.最近のゲームが特に好き


#学校の環境
1.朝9時~
2.クラスの人数最初7人から現在5人
3.習得言語：Java,Jsp&Servlet,mySql,Html,Css,JavaScript,C#,Unity
4.先生は現役でありながらこの道20年(理大卒のCから始まり15~20言語ぐらい通ってるらしい)

#僕の経歴・スキル等
1.カメラマン（スチール、動画撮影から編集）:４年（独学スタート)
2.デザイナー:7年(独学スタート)
3.海外ステイ経験あり:英語は初級程度
4.Html&Css:5年(独学スタート)
5.理数系ではない
6.運転免許あり
7.麻雀歴20年

#何故学びたかったのか
そんな僕がアートディレクター職で東京にお呼ばれされ２年働いてましたが経営難に・・・。
色々ありゲームが得意で好きだからゲーム開発に関わりたい！

と能天気な考えから。。。

思い切ってプログラミングの学校に飛び込みました。

#残り一ヶ月半をを迎えて初学する前に最低限あった方が良いと思った知見

1.小学生算数（+,-,%,/)等
2.中学生レベルの英語
3.一般的な物理の法則(unity)
4.質問を伝えるコミュ力(国語力？)

普通でしたら通ってきてる基本的な一般常識ですが乏しい人も中には何人かいてここで時間を取られてたら更に習得率が遅くなるなと感じました。

#理解するために考えた方がいいと思った事

まずは学校の授業一本に絞る事だと思います。

僕の失敗談からアルバイトを入れまくってて、授業終わったらすぐアルバイトにいき、睡眠時間も減り、朝も食べれなくなって、授業時間はボーっともして来てて、結果中途半端に潰せてなく繋がらなくなるのでどんどん置いてかれます。。

飲み会で何度か中途半端になってるから一本に絞れと注意されてました。。

次々に色々な言語をやるので自分で何とかするしかなくなるので注意です。

後コピペでここ使えばいいじゃん！
って感じでやってる時がありましたが書かないと覚えられないと思うので書く事をお勧めします。

そして最終的に出来てるも出来てないも全ては自己責任論でしかないので人からは言われますが良いも悪いもないです。

これをどう感じるかです。

ただ皆進むスピードは違っていても、遅くても1マスずつ進めるならゴールに到達する原理は変わらないもんだと思います。

#初学者でも習得率が高い人

同じ初学者から初めたのに何でこんな理解できてるのって人はいました。
僕は普通に仲良くさせて貰っていたので教えて貰ったり、飲み会に行ったりする中でどういう考えをしてるか探ってました。

####イメージ的には授業を聞いただけで出来る人です。

彼は「小学の義務教育時代からそう行った習慣」をつけていてそこの特殊な脳が発達してる？
って事だと思いました。

これは真似しようにも出来ない事だなぁと思ってました。

しかし考え方を自分に落とし込む事はできるので、つまずいた時は彼にどういう考え方してますか？
ってよく聞いてました。

これ繰り返して行けば彼の考え方の一部ですが自分に刷り込む事ができ思考レベルも上がったような気はしています。

ただ自分が一番出来てないとか変なプライドとかよくわかりませんが、僕はどうやら誰かと競争してやってないように見られててみたいでお前は呑気だなーと言われてましたのでこの性格が良かったのでしょうか。。

どういう意味かはわかりませんが・・鬱にはならないだろうから頑張れと今は言われますww

#Java,C#,JavaScript,mySql,Unityは楽しいか・楽しくないか
Javaなんて最初は基本的なコンパイルエラーばかりで通らないから楽しさがよくわかりませんでした。
だからこそ繋がりだして理解できだすとどんどん楽しくなりだしました。

unityは毛色が少し違ってますがこちらも楽しいです。

学ぶ言語はどう言ったポジションを目指すかで変わってくるのでしょうが最初にJavaを学んだ事は凄く宝になった気がしました。

そこを元に色々と繋がり、考えていけていてたので今では先生様様でございます。
ただたまに問題を出せとか宿題が多かったりとか応用の応用の応用の問題には苦労しましたが力はつきました(笑

#学校自体は楽しいか・楽しくないか
僕はクラス中で「中」ぐらいで出来る方ではなかったと思いますが、別に関係なく先生ともクラスの仲間とも年齢関係なく飲みにもいきましたし、カラオケにもいき毎日楽しかったです。

#就職・転職

そうそうこれに尽きるので準備をしなければなりません。
僕がやってる事はGitにコードを乗せてるのとpaizaに登録とやった内容を色々な場所でアウトプットして行ってます。

他にも履歴書や職務経歴書の準備と転職サイトへの登録ぐらいですか。。
実際８社受けて６社受かりました。

もちろん受け答えと自己PRはそれなりにしたつもりです。

#フリーランスについて
発注側の目線や開発会社の社長の目線でのお話を聴く機会があり良い面も悪い面も深く知れました。
いつかはなってみたい願望もありますが。。。

#プログラミングに関わらず理解するために一番良いと思った事
聞いた事を更に喋る。。
もしくはその日のうちに人に教えるのがいい気もしました。
バージョン管理 git github 基礎

![github.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391854/4fc26cc3-b5d8-2b8a-db37-cdb991f142a1.png)

###はじめに
gitやgithubの基礎を学びましょう。
###gitの仕組み
・変更履歴を順々に記録できる
「いつ」「誰が」「なにを」変更履歴を記録でき、「メッセージ」をつけることができる
###リポジトリ
変更履歴を記録する場所。
###commit
個人リポジトリに変更履歴を記録
###push
共有リポジトリに変更を共有する
###pull
複数人での作業で共有リポジトリを個人リポジトリに取得すること
###github
コードを保管してくれるサービス。
オープンソース開発がしやすくなった。
###プルリクエスト
主に複数人開発でコミュニケーションを取りながら開発できる機能。
###gitのダウンロード
 [git公式](https://git-scm.com/downloads)
###既存プロジェクトをバージョン管理する

```
$ cd 管理したいディレクトリ
$ git init
$ ls -a
```
###基本的なワークフロー
1. ファイルの変更をステージングエリアへ追加する

```
$ git add ファイル名
```
2. ローカルリポジトリにコミットする

```
$ git commit
```
3. リモートリポジトリにプッシュする
まず、ブラウザでgithubへ移動し、リポジトリを作成します。
登録した画面の「…or push an existing repository from the command line」のコードをターミナルで実行します。

```
$ git remote add origin https://github.com/shinpei555/introgit.git
$ git push -u origin master
```
これでリモートリポジトリに反映することができました。
###変更をコミットする手順
1. ステージングエリアへ追加

```
指定したファイルのみを追加する
$ git add ファイル名
変更した全てのファイルを追加する
$ git add .
```
2. リポジトリにメッセージを付けてコミット

```
$ git status
$ git commit -v
※コミットメッセージを書く
1行目 変更内容の要約
2行目 空行
3行目 変更した理由
```
###わかりやすいコミットメッセージを書く
何を変更したのか他のメンバーに伝わりやすいようにする
1行目 変更内容の要約
2行目 空行
3行目 変更した理由
###変更履歴を確認する

```
$ git log
```
###gitlogのオプション

```
一行で表示する
$ git log --oneline
```

```
表示数
$ git log -n 3
```

###現在の状況を確認する

```
$ git status
```
###ファイルの変更差分を表示する
ローカルとステージングエリアの差分

```
$ git diff
```
###gitdiffオプション
 [忘れやすい人のための git diff チートシート](https://qiita.com/shibukk/items/8c9362a5bd399b9c56be)
###リモートリポジトリにpushする

```
$ git remote add origin githubのURL
```
または

```
$ git push origin master
```
###originとは
githubのリモートリポジトリのことです。
デフォルトと覚えておくとよいです。
###管理したくないファイルをgitの管理下から外す
.gitignoreを作成し、記述します。
どんなときに使うか。
自動生成されるファイルは不要な場合や特にパスワードが記載されているファイルはセキュリティ面で非常に危険なのでgitの管理下からはずしましょう。
詳しい記述方法については下記を参考にしてください。
 [.gitignoreの仕様詳解](https://qiita.com/anqooqie/items/110957797b3d5280c44f)
###コミットしてしまったファイルを管理から外す
一度コミットしてしまったファイルについては下記のコマンドを実行する必要があります。

```
ファイルも一緒に削除する場合
$ git rm ファイル名
```

```
ディレクトリも一緒に削除する場合
$ git rm -r ディレクトリ名
```

```
ファイルは残す場合
$ git rm --cached
```
###githubデスクトップ
こちらはmacOSで手軽に使えるアプリになります。
[GitHub Desktop](https://desktop.github.com/)
###git公式ドキュメント
[git公式](https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%81%AE%E8%A8%AD%E5%AE%9A)
TypeScript:覚えた知識を日々書き留める#2

VSCodeでプロジェクトを作る際、tscコマンドがなかなか認識されず、苦労しました。
完全ではないですが、一応うまくいった方法があるのでメモです。

1.空フォルダを作る

2.ターミナルで以下のコマンドを入力する
　`npm init`

3.ターミナルで以下のコマンドを入力する
  `npm install --save -dev typescript`

4.ターミナルで以下のコマンドを入力する
  `./node_modules/.bin/tsc.cmd --version`

5.ターミナルで以下のコマンドを入力する
　`./node_modules/.bin/tsc --init`

これで一応、バージョン確認やtscコマンドでのビルドができるようになりました。
なぜ、自分が作ったプロジェクトでは「tsc -v」等は認識してくれず毎回ディレクトリを書かなければいけないのかはまだわかっていません。今後の課題です。
COCOAPIのインストール方法

pipenv 使います. pipenv使ってない人は適当に ``pipenv`` を ``pip3`` や ``pip`` に置き換えて読んでください



以下のコマンドでとりあえずプロジェクトで使うライブラリを入れる

```
$ pipenv install
```

cocoapiインストールのためにcythonを入れる

```
$ pipenv install cython
```



以下のコマンドを順番に実行していってcocoapiをインストールする

```
git clone https://github.com/cocodataset/cocoapi.git
cd cocoapi/PythonAPI
make install
python setup.py install
```

終わり.
macOS CatalinaにSSHでアクセス

# はじめに

macOS CatalinaにSSHでアクセス

## LOG

![mac.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502524/068aa13c-7807-4e61-3655-38e2b09e407b.png)

共有でリモートログインを設定。

![ssh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502524/037376f6-70af-830b-fa61-b58790b063d9.png)

DHCPにしているので `ssh user@MB` でアクセスする事にする。
【Rails】RSpecによるテスト　1.テストの準備

## RSpecの準備
RSpecを利用してRailsアプリのテストコードを書いていく準備をします。

今回の準備では、RSpecだけでなくFactoryBotやFakerといったgemも同時に用意していきます。

#### Gemfileの編集
```Ruby:Gemfile
group :development, :test do
#省略
  gem 'rspec-rails'
  gem 'factory_bot_rails'
  gem 'rails-controller-testing'
  gem 'faker'
end
```
- rspec-rails  
    今回の要。RailsにてRSpecを使ってテストするのに必要です。
- factory_bot_rails  
    テスト用にダミーのインスタンスを作成するのに役立ちます。
- rails-controller-testing  
    Railsのコントローラーをテストするのに必要です。
    とはいえ少し古いものらしいです。新しいgemについては今後の記事で。
- faker  
    インスタンス作成の際、多様なダミーデータを投入できるようになります。

今後他のgemも必要になってくるかもしれません。
一旦はモデルとコントローラーの単体テストを想定して準備しています。

Gemfileの変更ができたら忘れずインストールします。

####ターミナルからbundle installの実行
```Ruby:ターミナル
$ bundle install
```

####RSpecの利用準備

```Ruby:ターミナル
$ rails g rspec:install
```

このコマンドで、下記のようにRSpecに関するファイルが生成されます。

```:ターミナル
    create  .rspec
    create  spec
    create  spec/spec_helper.rb
    create  spec/rails_helper.rb
```
生成された.rspecファイルに以下の文を追記します。

```Ruby:.rspec
--format documentation
```

この追記で、テスト結果の表示のされ方が変わってきます。

追記前:

```:ターミナル
......

Finished in 2.4 seconds (files took 2.02 seconds to load)
6 examples, 0 failures
```

追記後:

```:ターミナル
Message
  #create
    can save
      is valid with a message
      is valid with an image
      is valid with a message and an image
    can not save
      is invalid without a message and an image
      is invalid without a group
      is invalid without an user

Finished in 2.51 seconds (files took 3.65 seconds to load)
6 examples, 0 failures
```
このように、テスト結果の表示がかなり分かりやすくなります。
ターミナルからrspecを実行する際にオプションとして後ろに書き加えることもできますが、先にファイルに追記しておく方が楽かと思います。

####factory_botの書き方を省略
```Ruby:spec/rails_helper.rb
RSpec.configure do |config|
  #下の文を追加
  config.include FactoryBot::Syntax::Methods

end
```

こうすることで、factory_botでインスタンスを生成する記述が少し簡略化されます。 

---
次の記事ではモデル、コントローラーの単体テストについて書きたいと思います。
TypeScriptとAngular初心者が「ちょっとわかる」ためにお世話になってきたサイトまとめ

半年ほど前より、TypeScript/Angularを利用する業務に携わっています。
(メインはフロントエンドですがサーバーサイドやCLIツールの作成等でもTypeScriptを利用しています。)

TypeScriptもAngularも半年前に比べると「ちょっとわかる」くらいにはなってきたかと思いきや、最近は1周回って「全然わからん」期に入ってきました。Angular全然わからん。

しかし、ひとまず「ちょっとわかる」に至るまでの知識を整理するためにも、これまでお世話になってきた(そしてこれからもお世話になるであろう)蔵書、否、蔵サイトをまとめようと思います。
同じく初心者からTypeScriptやAngularを触ることになる人の参考になれば幸いです。

# お世話になってきたサイト

## Angular.io

[Angular.io](https://angular.io/) ([日本語版](https://angular.jp))

Angularの公式サイトです。
Get Startedや各種ガイド、API仕様に至るまで、Angularの情報について網羅されています。
日本語サイトもあって便利。

Angular自体がかなり重厚長大な世界観を有しているため、公式ドキュメントも分厚い参考書のような印象です。
例えば、「テンプレート上でifやforを使うにはどうすればいいのか？」みたいな初心者的で軽い疑問に対して、サイドメニューからすぐに答えに辿り着けない感じと言うんでしょうか。
Vue.jsやReact等の公式ドキュメントと比べるとそのあたりに設計思想の差を感じます。

初めは[チュートリアル](https://angular.io/tutorial)から始めて、重い話題は疑問に思ったらでいいかも。
(自分もチュートリアル以降はまだ把握できてない)

## Angular After Tutorial

[Angular After Tutorial](https://gitbook.lacolaco.net/angular-after-tutorial/)

Angular Japan User Groupオーガナイザーの @lacolaco さんによる、チュートリアルを終えた方に向けた設計指針の解説サイトです。
参考書チックな公式ドキュメントより実践的だし、分量も重くないのでとっつきやすいです。

その他、Angularについての質の高い日本語情報としてlacolacoさんの[ブログ](https://lacolaco.hatenablog.com/)等々もかなりお世話になっております。

## Angular Material

[Angular Material](https://material.angular.io/)

マテリアルデザインに沿ったAngularのコンポーネント集です。業務で利用しています。

コンポーネント自体も有用ですが、公式のコンポーネント実装として、ソースコードがかなり参考になります([GitHub](https://github.com/angular/components))。
ベースとなっているCDK (Component Dev Kit) を利用してコンポーネントを自作することもできます。

Angular Materialの公式サイト自体もAngular製([GitHub](https://github.com/angular/material.angular.io))であり、こちらもAngularの利用例としてかなり参考になります。

## Angular CLI

[Angular CLI](https://cli.angular.io/)

Angularの開発に使われる公式CLIツール。基本的にAngularでの開発にはCLIツールの利用が推奨されているはずなので、よっぽどのことがなければ`ng`コマンドを利用しているかと思います。

`ng`コマンドも有用ですが、TypeScriptによるCLIツールの実装としても参考になります([GitHub](https://github.com/angular/angular-cli))。
例えば、`ng generate`は外部のSchematicsを利用してコマンドを実行するような実装になっています。

## Angular アドベントカレンダー

[2018](https://qiita.com/advent-calendar/2018/angular)
[2017](https://qiita.com/advent-calendar/2017/angular)
[2016](https://qiita.com/advent-calendar/2016/angular)
[2015](https://qiita.com/advent-calendar/2015/angular2)

Angularについてのアドベントカレンダー。一応TypeScript版のAngularだけでなく旧AngularJSやDart版であるAngularDartも含んでいるようですが、TypeScript版の内容がほとんどかと。
AngularやRxJSのバージョンによって書き方が微妙に変わっているかもしれないので古い情報が今もどこまで通用するかは不明ですが、記事が書かれた年代がわかりやすい分気をつけやすいですね。

## Learn RxJS

[Learn RxJS](https://www.learnrxjs.io/)

Angularのコアとして用いられているRxJSについての解説サイト。
RxJSの公式ドキュメントに載っている矢印の図がいまいちピンとこない身としては、サンプルソースを元に各種パイプについて解説されているのでわかりやすい。
日本語化はされていないようですが、サンプルソースはシンプルなので問題ないかと。

## TypeScript Deep Dive

[TypeScript Deep Dive](https://basarat.gitbooks.io/typescript/) ([日本語版](https://typescript-jp.gitbook.io/deep-dive/))

TypeScriptの各種仕様についての解説サイトです。
特にTypeScriptの型周りの仕様についてわかりやすく解説されています。
TypeScriptの型システムは柔軟ゆえに複雑なこともできてしまうので、仕様は知りつつもなるべくシンプルに使いこなした方がいい気がしますね。

# 最後に

ここまで記事をまとめている中で、サイトによってはまだ全然読めてない部分があるということを再確認しました。
特にAngularの公式ドキュメントはまだまだ読み応えがありそうです。

ここで紹介したサイト以外にも、TypeScriptやAngularを完全に理解するためにオススメのサイトがあればぜひコメントお願いします！
How to install matio on Ubuntu16.04

### 1. Requirements
> Ubuntu16.04

### 2. Refference
> https://github.com/tbeu/matio

### 3. Install libtool, m4 and automake
```shell:
apt-get install libtool 
apt-get install m4 
apt-get install automake
```

### 4. Install matio
```shell:
git clone git://git.code.sf.net/p/matio/matio
cd matio
git submodule update --init  # for datasets used in unit tests
./autogen.sh
./configure
make
make check
make install
```

---------------------------------------------------
Thank you.
last-samurai
react-devtoolsがインストールに失敗する件

とりあえずこれ

```
$ npm install -g react-devtools
```
するとこう

```
npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules
npm ERR! path /usr/local/lib/node_modules
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access
npm ERR! Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
npm ERR!  { [Error: EACCES: permission denied, access '/usr/local/lib/node_modules']
npm ERR!   stack:
npm ERR!    'Error: EACCES: permission denied, access \'/usr/local/lib/node_modules\'',
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'access',
npm ERR!   path: '/usr/local/lib/node_modules' }
npm ERR! 
npm ERR! The operation was rejected by your operating system.
npm ERR! It is likely you do not have the permissions to access this file as the current user
npm ERR! 
npm ERR! If you believe this might be a permissions issue, please double-check the
npm ERR! permissions of the file and its containing directories, or try running
npm ERR! the command again as root/Administrator (though this is not recommended).

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/test/.npm/_logs/2019-10-13T14_15_26_192Z-debug.log
```

あーpermissionかーと思ってsudoつけてみる

```
$ sudo npm install -g react-devtools
Password:

/usr/local/bin/react-devtools -> /usr/local/lib/node_modules/react-devtools/bin.js

> electron@5.0.11 postinstall /usr/local/lib/node_modules/react-devtools/node_modules/electron
> node install.js

/usr/local/lib/node_modules/react-devtools/node_modules/electron/install.js:49
  throw err
  ^

Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/react-devtools/node_modules/electron/.electron'
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! electron@5.0.11 postinstall: `node install.js`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the electron@5.0.11 postinstall script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/test/.npm/_logs/2019-10-13T14_15_56_167Z-debug.log
```

ダメじゃん！
で色々ググった結果が

```
$ sudo npm install -g react-devtools --unsafe-perm=true

/usr/local/bin/react-devtools -> /usr/local/lib/node_modules/react-devtools/bin.js

> electron@5.0.11 postinstall /usr/local/lib/node_modules/react-devtools/node_modules/electron
> node install.js

Downloading tmp-16816-1-SHASUMS256.txt-5.0.11
[============================================>] 100.0% of 4.79 kB (4.79 kB/s)
+ react-devtools@4.2.0
added 233 packages from 157 contributors in 27.794s
```

これで解決　npmはroot以外でインストールするときにunsafe-permのパラメをtrueにしないといけないっぽい。

参考にさせていただいたサイト様
https://github.com/facebook/react-devtools/issues/741
http://esheep.doorblog.jp/archives/22432883.html
【Rails】Railsでのアプリケーションの作り方（環境構築編）

初稿　2019年10月13日


railsを使ったwebアプリケーションの作り方というか、流れを備忘録として残していきます。

#環境構築
以下の物を順に実行してインストールします。

##Command Line Tools
検索してapple developerからダウンロード。
もしくは、ターミナルで以下コマンドを実行

```
$ xcode-select --install
```

画面に沿って実行していく。
バージョンの選択になったら、自分のMacのOSのバージョンに合わせたものをインストールする

##そのほかののインストール
以降は、出ているコマンドをターミナルから、ホームディレクトリ上で実行していきます。

###Homebrewのインストール

```
$ cd #ホームディレクトリに移動
$ ruby -e  $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"  #コマンドを実行
```
実行中、ターミナルにちょいちょい指示が出てくるのでEnter押したり、Password入れたり実行してください。　Passwordは自分のマックのパスワードです。

Homebrewについてはこちら
[homebrewとは何者か。仕組みについて調べてみた](https://qiita.com/omega999/items/6f65217b81ad3fffe7e6)

###Homebrewがインストールされてエイルか確認

```
$brew -v
```
Homebrew 1.8.0とか出てくればOK

###Homebrewのアップデート

 Macのバージョンが10.11.1以上の場合は以下を実行して権限をまず変更。

```
$ sudo chown -R `whoami`:admin /usr/local/bin
```
その後こちらのコマンドを実行

```
$ brew update
```

###rbenv と ruby-buildのインストール

```
$ brew install rbenv ruby-build
```

ruby-buildによってRubyの色々なバージョンがインストールすることが可能になる

rbenvでRubyのバージョンを切り替えることが可能になる
[rbenvのドキュメントはこちら](https://github.com/rbenv/rbenv#upgrading-with-homebrew)

###rbenvのパスを通す
```
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
```

パスを通すことで、rbenvをどのディレクトリからも使用可能になる

###.bash_profileの読み込み

```
$ source ~/.bash_profile
```
書き込んだ設定を読み込み、有効にする

###readlineのインストール
ターミナルのirb上で日本語入力を可能にする

```
$ brew install readline
```

###readlineのパスを通す

```
$ brew link readline --force
```

###rbenvを利用してRubyをインストール

```
$ RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline)"
$ rbenv install 2.6.5  <--インストールしたいバージョンを指定する
```
今、どんなバージョンがリリースされているのかを確認する時は
→[こちら](https://www.ruby-lang.org/ja/downloads/)


###利用するRubyのバージョンを決める

```
$ rbenv global 2.6.5
```
デフォルトで使用するRubyのバージョンを決める時はrbenv global,
フォルダごとにバージョンを変更する場合は使用したいディレクトリで以下を実行

```
$ rbenv local 2.6.5
```

###Rubyのバーションを確認

```
$ ruby -v
```

###MySQLのインストール

```
$ brew install mysql@5.6
```

###MySQLの自動起動設定

```
$ mkdir ~/Library/LaunchAgents 
$ ln -sfv /usr/local/opt/mysql\@5.6/*.plist ~/Library/LaunchAgents

$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql\@5.6.plist 
```

###MySQLコマンドを実行できるようにする

```
#mysqlのコマンドを実行できるようにする
$ echo 'export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
#mysqlのコマンドが打てるか確認する
$ which mysql
#以下のように表示されれば成功
/usr/local/opt/mysql@5.6/bin/mysql
```

###bundlerのインストール

```
$ gem install bundler
```

bundlerとはgemのバージョン管理などをしてくれるgem

###Ruby on Railsのインストール

```
$ gem install rails --version='5.2.2.1'
```
Railsの最新バージョンの確認はこちら
https://rubyonrails.org/

2019.8にRails 6.0がリリースされています！


###rehashを実行

```
$ rbenv rehash
```

gemはrubyのバージョンごとにい個別に保管されていて、
rbenv rehashコマンドは、そのバージョンで利用しているgemのコマンドを使えるようにするのに必要なコマンド
gemコマンドでgemをインストールした時は必ず実行。

###Railsが入ったかどうかを確認
```
$ rails -v
```

以上で、一通りの環境構築ができたはずです！！




##補足

###インストールされているRubyを確認するコマンド

```
$ rbenv install --list
```

###最新のrbenvと一緒にRubyも最新のものを入れたい時

```
$ brew upgrade rbenv ruby-build
```
Laravelのマイグレーション時、a foreign key constraint failsになった時の対処


Laravelのマイグレーション実行時、以下のようなエラーが発生したときの対処。

```
$ php artisan migrate

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint
...
```

## マイグレーションの実行順に注意

外部キーの参照先テーブルがまだ作られていない場合エラーになってしまう。
マイグレーションの実行順は基本的にファイルの日付順になっている（例: __2014_10_12_000000___create_users_table ）ようなので、基本的にはファイルを作成する際、参照先のテーブルに対応するファイルから順に作成すれば問題ない。（ファイル名を変更することでも対応はできるようだが、実践的にはあまり好ましい方法ではないはず。）

また、同じような理由でシーディングを実行する際も、参照する先のレコードが存在しなければエラーになるようなので注意。

ここが間違っていないことを確認してなお同様のエラーが発生するため、色々調べたところ、次の部分を直すことで解決した。

## 型が一致しているかに注意

参照先と参照元の型が一致していないとエラーになる様子。ここが間違ってた。

```2014_10_12_000000_create_users_table.php
Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            ...
```

```2019_10_09_074995_create_posts_table.php
Schema::create('posts', function (Blueprint $table) {
            ...
            $table->unsignedInteger('user_id');
            ...
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            ...
```

参照先のusersテーブルの主キーは`bigIncrements()`を使用しているが、対応するpostsテーブルのuser_idには`unsignedInteger()`を使用しているため、BIGINTとINTEGERで型が一致せず、正常に動作しなかったらしい。

`unsignedInteger()`を`unsignedBigInteger()`に修正することで正常に動作した。

```2019_10_09_074995_create_posts_table.php
Schema::create('posts', function (Blueprint $table) {
            ...
            $table->unsignedBigInteger('user_id');
            ...
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            ...
```
【Mac】brew upgrade mavenでMavenを最新にアップデートする

記事内容はタイトルの通りです。
以下コマンドで`Maven`をアップデートできます。

```bash
brew upgrade maven
```

# 参考にさせていただいた記事
- [新しいmacにbrewを使ってjavaとmavenをインストールする \- Qiita](https://qiita.com/amemolee/items/6f33b8e321cc9395b0cf)
- [brewのupdateとupgradeの違い \- Qiita](https://qiita.com/okhrn/items/aa71b066a525456550c0)
【Vue.js】１番シンプルなToDoリスト

## まずは完成品 ✏️
<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="html,result" data-user="yuki-azuma" data-slug-hash="poogNwv" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="TodoList_Vue">
  <span>See the Pen <a href="https://codepen.io/yuki-azuma/pen/poogNwv">
  TodoList_Vue</a> by アズマックス (<a href="https://codepen.io/yuki-azuma">@yuki-azuma</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
　
　

## 機能要件 🤖
- テキストボックスに文字を入力して、addボタンを押すと下に入力した文字が表示される
- 表示された文字の左側に、チェックボックス、右側にdeleteボタンが表示される
- チェックボックスにチェックが入ると、Todoに取り消し線が入る
- deleteボタンが押されると、そのToDoが消える
- テキストボックスが空の場合は、addボタンを押しても何も追加されない
　
　

## スコープ外の機能 ❌
- ブラウザをリロードした場合のデータ保持機能
- 文字入力のバリデーション
　
　

## 作成のポイント🙋‍♂️
- **addボタンのクリックイベント**
   - ①：クリックされたら、addItemのfunctionが発動。入力した文字を配列(todos)に格納→格納した配列をView側で表示する（双方向バインディング）
   - ②：todoにvindされたnewItem(入力された文字列)とisDone(チェック状態）を格納
   - ③：vindされたtodos（配列）にtodoを格納する
   
```javascript

new Vue({
  // 省略
  data: {
    newItem: "",
    todos: []
  },

  methods: {
    // ①クリックで発動
    addItem: function() {
      // ②入力された文字列とチェック状態を格納 
      var todo = {
        item: this.newItem,
        isDone: false
      }
      // ③todosに格納
      this.todos.push(todo)
    // 以下省略
    }
  }
})
```
　 

- **deleteボタンのクリックイベント**
    - ①：クリックされたら、delItemのfunctionが発動。引数は、delが押されたtodosのindex番号を格納
    - ②：todosのindex番号に格納されているデータを削除する

```javascript
new Vue({
  // 省略
  data: {
    todos: []
  },
  methods: {
    // ①クリックで発動
    delItem: function(index) {
      // ②todosから該当のデータ（index番号のデータ）を削除する
      this.todos.splice(index, 1)
    }
  }
})

```
　

- **チェックボックスのチェック**
    - v-modelを使い、チェックが入ったらtrue、入っていない場合はfalseと切り替える
    - trueの場合は、v-bind classを使い、classを追加し、取り消し線を表示する

```html
<li v-for="(todo, index) in todos">
   <input type="checkbox" v-model="todo.isDone">
      <span v-bind:class="{done: todo.isDone}">{{ todo.item }}</span>
      <button v-on:click="delItem(index)">Delete</button>
</li>
```
　

## 感想 🍵
- 直感的でわかりやすい！
- これがコンポーネントとか複数Vueファイルにまたがってくると思うと・・・大変なんだろうなと思う
- それなくJavaScriptの基礎は覚えておかないと、全然頭に入ってこないなーと思う
- 次はコンポーネントを交えた何かを作ってみようかな。
ControllerとViewModelとのボタンタップのバインディングの試行錯誤

## 前置き

UIViewControllerとViewModelとをバインディングする正攻法の試行錯誤をメモしておく
結論は出てません

## パターン1

古来より伝わるIBAction
これだとPresenterの感じがする

```swift
class ViewModel {
    
    func buttonDidTap() {        
    }
    
}
```

```swift
class ViewController: UIViewController {
    
    let viewModel: ViewModel = ViewModel()
    
    @IBAction func buttonDidTap(_ sender: Any) {
        self.viewModel.buttonDidTap()
    }

}
```

## パターン2

ボタンから直接ViewModelのメソッドを呼び出す

```swift
class ViewModel {
    
    @objc func buttonDidTap(_ sender: Any) {
    }
    
}
```

```swift
class ViewController: UIViewController {

    let viewModel: ViewModel = ViewModel()
    
    @IBOutlet weak var button: UIButton! {
        didSet {
            self.button.addTarget(self.viewModel,
                                  action: #selector(buttonDidTap(_:)),
                                  for: UIControl.Event.touchUpInside)
        }
    }
    
}
```

## パターン3 RxSwift

RxSwiftを使ったバインド

```swift
import RxCocoa

class ViewModel {
    
    let buttonDidTap: PublishRelay<Void> = {
        let relay: PublishRelay<Void> = PublishRelay<Void>()
        relay.subscribe(onNext: {
        })
        return relay
    }()
    
}
```

```swift
import RxSwift

class ViewController: UIViewController {

    let viewModel: ViewModel = ViewModel()
    
    @IBOutlet weak var button: UIButton! {
        didSet {
            self.button.rx.tap.bind(to: self.viewModel.buttonDidTap)
        }
    }
    
}
```

## パターン4 ReactiveSwift

```swift
import ReactiveSwift
import ReactiveCocoa

class ViewModel {
    
    let buttonDidTap: CocoaAction<UIButton> = CocoaAction<UIButton>(Action<Void, Any, Never>(execute: {
        return .empty
    }))
    
}
```

```swift
import ReactiveCocoa

class ViewController: UIViewController {

    let viewModel: ViewModel = ViewModel()
    
    @IBOutlet weak var button: UIButton! {
        didSet {
            self.button.reactive.pressed = self.viewModel.buttonDidTap
        }
    }
    
}
```

## パターン5 RxSwift + Action

RxSwiftを使ったバインド

```swift
import Action
import RxCocoa

class ViewModel {

    let buttonDidTap = CompletableAction<Void> { _ in
        return Observable<Never>.empty().asCompletable()
    }
    
}
```

```swift
import Action
import RxSwift

class ViewController: UIViewController {

    let viewModel: ViewModel = ViewModel()
    
    @IBOutlet weak var button: UIControl! {
        didSet {
            self.button.rx.bind(
                to: self.viewModel.buttonDidTap,
                controlEvent: self.button.rx.controlEvent(UIControl.Event.touchUpInside),
                inputTransform: { _ in () }
            )
        }
    }
    
}
```
ubuntuでバージョンを指定してパッケージを取得

###madisonオプションを使いダウンロード可能なバージョンを確認

ubuntuでバージョンを指定してパッケージを取得する方法を紹介します。

バージョンを指定してパッケージを取得するにもどのバージョンを指定したら良いのか分からないのでは、始まりません。
まずはダウンロード可能なパッケージのバージョン一覧を確認します。

```terminal
sudo apt-cache madison バージョンの一覧を出したいパッケージ名
```

madisonをオプションを指定することでダウンロード可能なパッケージを一覧表示することができます。
### パッケージのダウンロード
それでは先程確認したバージョンを元にパッケージをダウンロードしましょう。

```terminal
sudo apt-get install パッケージ名=バージョン
```

=が肝ですね。
###例 docker-ceの場合

例としてdocker-ce のバージョンを確認して
バージョン指定を使ってパッケージを取得してます。

最初はダウンロード可能なdocker-ceのバージョン確認です。

```terminal
sudo apt-cache madison docker-ce
```

実行すると以下のようになります

```terminal
docker-ce | 5:19.03.3~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:19.03.3~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/test amd64 Packages
 docker-ce | 5:19.03.3~2.1.rc1-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/test amd64 Packages
 docker-ce | 5:19.03.3~1.2.beta2-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/test amd64 Packages
 docker-ce | 5:19.03.3~1.1.beta1-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/test amd64 Packages
 docker-ce | 5:19.03.2~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
...以下省略
```

先程確認したバージョンをもとにダウンロードしましょう。
今回はバージョンは5:19.03.3~3-0~ubuntu-bionicをダウンロードするとします。

```terminal
sudo apt-get install docker-ce=5:19.03.3~3-0~ubuntu-bionic
```

これでダウンロードできます！！

以上です。
ありがとうございました。
Ubuntu Server 18.04 LTSで無線LANとsshの設定をするまで

#概要
RaspberryPi3 B+にUbuntu Serverを入れた際のWiFiとsshの設定手順を備忘録として残しておく。

#環境
サーバー:RaspberryPi3 B+

```bash:サーバーOS
cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.2 LTS"
```

クライアント:Let's note CF-NX2

```bash:クライアントOS
cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"
```

#WiFiの設定
無線インターフェイス名を確認する。

```bash:ip_link
ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DORMANT group default qlen 1000
```

インターフェイスの設定ファイルを編集
設定ファイルは/etc/netplan/50-cloud-init.yaml に存在する。
IPアドレスを固定にする場合は以下を設定ファイルに追記する。
x.x.x.xは割り当てたいIPアドレス、y.y.y.yはルーターのIPアドレス

```bash:固定IPアドレス
wifis:
            インターフェイス名:
                    addresses: [x.x.x.x/24]
                    dhcp4: false
                    gateway4: y.y.y.y
                    nameservers:
                            addresses:
                            - y.y.y.y
                            search: []
                    access-points:
                        "SSID名":
                                 password: "パスワード"
    renderer: NetworkManager

```

固定IPアドレスを割り当てる必要がない場合は以下を設定ファイルに追記する。

```bash:DHCPオン
wifis:
            インターフェイス名:
                    dhcp4: true
                    access-points:
                        "SSID名":
                                 password: "パスワード"
    renderer: NetworkManager

```

NetworkManagerをインストール後、変更を反映させる。変更を反映後ip addr等でipアドレスを取得できているか確認を行う。

```bash:
sudo apt install network-manager
sudo netplan apply
```

#ssh設定
openssh serverをインストールする。

```bash:openssh
sudo apt install openssh-server
```

パスワード認証を禁止し、公開鍵認証のみにする。
設定ファイル(/etc/ssh/sshd_config)の56行目をyesからnoに変更する。
ssh serverを再起動する。

```bash
sudo systemctl restart ssh
```
クライアントPCで公開鍵と秘密鍵を生成後、公開鍵をサーバーに保存する。

```bash:クライアントPC
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (~/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in ~/.ssh/id_rsa.
Your public key has been saved in ~/.ssh/id_rsa.pub.
$ ssh-copy-id サーバー名@IPアドレス
$ exit
$ ssh サーバー名@IPアドレス
```
SQLAlchemyでPostgresにスキーマを作成しテーブル作成・操作を生SQLでやってみる

# はじめに
最近はデータ分析ばかりでデータベースはご無沙汰していたが（クソ面白くないので避けていたが), そうもいってられなくなったので真面目にやろうと思う。早速Pythonでよく使われるDBライブラリを調べたところSQLAlchemyがよさそうだ。OR Mapperだけでなく、生SQLの実行や、SQLの組み立て等も充実しており、この手のツールにありがちな「ガチガチで融通が利かない」ものではなさそうなところが気に入った。Django等でも使えるそうで、知っておいて損はないということで今後コミットしていく。

まずは生SQLでどれくらいのことができるか知りたかったため、今回はPostgresにスキーマを作成し、そのスキーマ上にテーブルを作成し、データの登録、更新、検索、削除等の操作を一通り確認した。その結果psycopg2で直接ゴリゴリ書くのと全く変わらずに生SQLを実行することができることが分かった。

# 環境
- Windows10
- Postgres 12
- Python 3.X
- SQLalchemy 1.3.6

# ソース
ソースは以下の通りである。見てもらえれば分かる思うので、説明は省略する。

```Test.py

from sqlalchemy.schema import CreateSchema
from sqlalchemy import *
from sqlalchemy.sql import text

def main():

    # データベース接続
    engine = create_engine("postgresql://kimisyo:kimisyo@localhost:5433/chemsyo")

    # コネクションを獲得
    conn = engine.connect()

    # スキーマを作成する
    if not conn.dialect.has_schema(conn, "common"):
        engine.execute(CreateSchema("common"))

    # 前回作成したテーブルを一旦削除しておく
    try:
        conn.execute("DROP TABLE common.all_data")
    except:
        pass

    # 作成したスキーマを参照するよう変更
    conn.execute("SET search_path TO common")

    # テーブルを作成する
    conn.execute("CREATE TABLE all_data(id INTEGER, name TEXT, data TEXT)")

    # トランザクションを開始する
    trans = conn.begin()

    # テーブルにデータを登録する
    sql = text("INSERT INTO all_data(id, name, data) VALUES (:id, :name, :data)")
    for i in range(1000):
        conn.execute(sql, id=i, name="name"+str(i), data="text"+str(i))

    # データを更新する
    sql = text("UPDATE all_data SET name=:name WHERE id = :id")
    for i in range(1000):
        conn.execute(sql, id=i, name="name_upd"+str(i), data="text"+str(i))

    # トランザクションを一旦commitする
    trans.commit()

    # データを検索する(1件)
    sql = text("SELECT name FROM all_data WHERE id = :id")
    result = conn.execute(sql, id=3)
    for row in result:
        print("name:{0}".format(row['name']))

    # データを検索する(like検索)
    sql = text("SELECT id, name FROM all_data WHERE name LIKE :keyword")
    result = conn.execute(sql, keyword="%33%") # "33"を部分一致として含むものを検索
    for row in result:
        print("id:{0}, name:{1}".format(row['id'], row['name']))

    # トランザクションを開始する
    trans = conn.begin()

    # データを削除する(全件)
    sql = text("DELETE FROM all_data")
    result = conn.execute(sql)

    # commitする
    trans.commit()

    # コネクションをクローズする
    conn.close()


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

# 今後の展望
今回は泥臭い使い方ができることが分かったため、今後は以下のようにもう少しエレガントな使い方を試してみたい。
- 複雑なクエリを、SQL組み立て機能を使ってエレガントに作成、実行する。
- SQLの実行ログを、エレガントに一元的に出力する。
- ソース上に記載したテーブル定義や、DBに作成済のテーブルから、OR-Mapper機能を用いてエレガントにテーブルの操作を行う。

柔軟かつエレガントであることが今後の変化に耐え抜くために重要なのだ。
macOS CatalinaにPHP 7.3をインストール（Home Brew）

# はじめに

Home Brewを利用してmacOS CatalinaにPHP7.3をインストール

## LOG

![mac.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502524/bda430e7-fc90-c879-4b62-a7aded21774a.png)

### インストール

```shell-session
% brew install php gnu-which
... 略
```

### 各種確認

```shell-session
% which php
/usr/local/bin/php

% php -v
PHP 7.3.10 (cli) (built: Sep 30 2019 19:59:57) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.10, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.10, Copyright (c) 1999-2018, by Zend Technologies

% openssl version
LibreSSL 2.8.3

% php -i | grep "SSL Version"                            
SSL Version => OpenSSL/1.1.1d
```

昨年起きていた、このあたりの問題は解決している模様。
[Installing PHP 7.2 using Homebrew on OSX using OpenSSL and not Apple’s Secure Transport for PHP’s curl module](https://medium.com/this-old-code/installing-php-7-2-bc779b23dce8)
国内で使えるIaaSプロバイダーの一覧・比較

#はじめに#
今までメインで使っていたIaaSから、別のIaaSへ移行しようとなったが、
現在どんなクラウドサービスがあるのか情報が散乱していたため、
日本で使えるIaaSを知る限りまとめてみた。

#IaaSとは#
![1_0z9Pqwn7ujypQ396wleJ1Q.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259343/ae5f12b0-dc16-799b-89d3-6f4dc746ba56.png)

画像は拾い物
IaaSとは、簡単に言えばハードウェアを自分で用意しなくても、
ほかの人と共用のサーバー上に、自分だけのVMを作ってリソースを間借りできるというもの。

企業のサービス運用から個人のサービス開発まで広く使われているサービス。

プロバイダーにより、ハードウェアとしての基本スペックやネットワークの速度、
パブリックIPの取り扱い方、追加ストレージの考え方など細かく異なる。

使いやすさや安心感は概ね使用料金に比例する。

この記事では個々のプロバイダーの比較というより、
こんな会社もやっているよ、という紹介のニュアンスで書いていきたい。

知っている、または調べていた範囲での記載なので、
「あの会社がない」などあればコメントで教えていただけると助かります。

#IaaSプロバイダー#
##AWS##
![amazon_web_services_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259343/df581185-1d9e-539a-fb03-314ad8c20e63.png)
「amazon web service」通称AWS 
知らない人はいないのではないかというほど有名なクラウドサービス。
多機能すぎてそれぞれを使いこなすには修行の末に職人にならなければいけないとか。
1年間の無料期間があるため、個人開発など遊びで使われることも多い

[公式ページ](https://aws.amazon.com/jp/)

AWSから機能を絞ってより使いやすくなった「AWS Lightsail」というのもある。
こちらは1か月ワンコインから使える

[公式ページ](https://aws.amazon.com/jp/lightsail/)

##Microsoft Azure##
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259343/c02d80c3-88b5-a80d-e2a8-715f7448ebd9.png)

Microsoftのクラウドサービス
モバイルで覇権を取れなかったため、
クラウドで世界一位になりたいとかいう噂
機器学習周りの機能に特に力を入れている
こちらも無料期間あり

[公式ページ](https://azure.microsoft.com/ja-jp/)

##GCP##
![20190108094205.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259343/cf0fa486-68c1-aaca-d8b2-e3bf6477f141.png)

「Google Cloud Platform」通称GCP
使った人によれば、Googleらしく素直に使いやすいとのこと
無料トライアルあり
[公式ページ](https://console.cloud.google.com/home/dashboard?project=animated-subset-220805&hl=ja&pli=1)

##Alibaba Cloud##
![cd22aab37d89dd190b13376630753190.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259343/17426c16-af75-f323-4f58-1a3f1c1621c8.png)
中国通販大手のアリババが展開するクラウドサービス
一部コアなファンがいる、らしい

[公式ページ](https://jp.alibabacloud.com/)

##ニフクラ##
富士通が運営する国産クラウドサービス

[公式ページ](https://pfs.nifcloud.com/)

##IDCF Cloud##
ソフトバンクグループのIDCフロンティアが運営するクラウドサービス

[公式ページ](https://www.idcf.jp/cloud/)

##NTT クラウド##
NTTのクラウド

[公式ページ](https://www.ntt.com/business/services/cloud/iaas/enterprise-cloud.html)

##IBM Cloud##
探偵の助手みたいなAIを使いたい場合はこちら

[公式ページ](https://www.ibm.com/jp-ja/cloud)

##Oracle Cloud##
個人的に強みがいまいちわからない

[公式ページ](https://www.oracle.com/jp/cloud/)

##さくらのクラウド##
老舗からかなんとなくの安心感

[公式ページ](https://cloud.sakura.ad.jp/)


##KAGOYA Cloud##
安い

[公式ページ](https://www.kagoya.jp/)


##楽天クラウド##
使いやすくはない

[公式ページ](https://cloud.rakuten.co.jp/iaas/ja/)

##freebit cloud##
Fortigateを使ってセキュリティが高いらしい

[公式ページ](https://cloud.freebit.com/)


#まとめ#
クラウドプロバイダーを選ぶときは要件と費用に気を付けましょう。
macOS CatalinaにChrome リモート デスクトップで接続する

# はじめに

macOS CatalinaにChrome リモート デスクトップで接続するできるように設定する。

## LOG

![mac.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502524/bda430e7-fc90-c879-4b62-a7aded21774a.png)

### インストール

[Chrome リモート デスクトップ](https://remotedesktop.google.com/access/)にアクセスしてなんやかんやインストールして進める。

![on.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502524/46f8b019-bb8b-32aa-ab7b-db14d1da699e.png)

上記画面で "オンにする" を押し下すと、下記注意メッセージが表示される。

![message.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502524/d2c02da5-405b-44c1-3b66-a10f4eda7b09.png)

"設定を開く" をクリックした先にはメッセージ内で指定されたファイル名は存在しない。
Web上では該当のsh名が表示されるスクリーンショットを確認したが、今回はそうならなかった模様。
なお、メッセージ内で指定されたshをFinderから指定しようにも、グレーアウトして選択できなかった。

ということで、一体何なのかわからない "sh" にチェックを付ける。

![conf1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502524/92d08ba4-9c04-193c-b8f5-806228298c56.png)

この状態で他端末から接続しても、画面がうまく表示できない。
"画面収録" でも "sh" にチェックを入れる。

![conf2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502524/03b3dc15-3e15-fc7a-4545-4a9bb2740361.png)

# おわりに

これにてWindows端末やAndroid端末からリモートで接続できるようになった。
非常に便利というわけではないが、何かの時に役立つかもしれない。
LAMP 環境で、ディスク利用率の監視通知がきたときの、原因ファイル特定までの手順まとめ

1年に数回はきます。たまに全く知らない環境の調査依頼もきます。
慣れすぎて、いつも経験則でやってましたが、最近記憶力が低下してきたので、いまのうちに一度まとめます。

奇抜な方法は使いません。段階を追って特定します。この方法で、原因（のファイル）が見つからなかったことはないです。

まずは、root 権限になります。rootでない場合、原因になっているディレクトリやファイルに辿り着けないことが多いからです。

```
$ su -

or

$ sudo -i
```

df でどのディスクが原因か確認します。

```
# df -h
```

対象のディスクの第一階層で、どのディレクトリがサイズが大きいかを確認します。多いのが、

- /var/log 以下の特定のログが肥大化している
- /var/lib/mysql 以下で特定スキームが肥大化していしている
- /var/www/html （ドキュメントルート）以下で、コンテンツファイル（画像やPDFなど）が増加している

といったパターンです。

```
# du -h --max-depth 1 <対象ディレクトリ>

# du -h --max-depth 1 /var/log/
# du -h --max-depth 1 /var/lib/mysql/
# du -h --max-depth 1 /var/www/html
```

目星がついたら、さらにディレクトリを1段階下げて、同じコマンドで確認するということを繰り返します。
ディレクトリまで辿り着いたら最後にどのファイルが多いかを特定します。

まずは、ls で ファイルのサイズが大きいもの順で表示する方法です。

```
# ls -lSh <対象ディレクトリ>
```

あとは、100MB以上のファイルを検索するfindもよく使います。

```
# cd <検索したいディレクトリ>
# find ./ -type f -size +10M | xargs ls -lh
```

最後に特定したファイルの処理ですが、これは、システムによるのかなとおもうので、適宜ですね。

```
消す
# rm <対象のファイル>

余裕のあるディスクに移動する
# mv <対象のファイル> <余裕のあるディスクのディレクトリ>

MySQLのテーブル最適化　※Deleteが多くデフラグしやすい場合に有効。時間がかかるので要注意※
> optimize table <サイズの多きいテーブル>
```
※ http://gihyo.jp/dev/serial/01/mysql-road-construction-news/0035

番外編で、「そっちかー」というのが、inode の利用制限のオーバーです。1年に一回ぐらいきます。
そのときは、下記です。

```
# df -ih
```
再帰関数についてpythonで書いた

###動的計画法・メモ化再帰
フィボナッチ数列

```python
# フィボナッチ数列
def fibo(n,memo):
  # ベースケース
  if n == 0:
    return 0
  elif n == -1:
    return 1
  # メモをチェック(既に計算済みなら答えをリターンする)
  if memo[n] != -1:
    return memo[n]
  # 答えをメモしながら再帰呼び出し
  memo[n] = fibo(n-1,memo) + fibo(n-2,memo)
  return memo[n]

# メモ用配列(-1は未計算であることを表す)
memo = [-1] * 50
for n in range(50):
  print(str(n) + "項目の値:" + str(fibo(n,memo)))
  
```

出力結果

```python
0項目の値:0
1項目の値:1
2項目の値:1
3項目の値:2
4項目の値:3
5項目の値:5
6項目の値:8
7項目の値:13
8項目の値:21
9項目の値:34
10項目の値:55
11項目の値:89
12項目の値:144
13項目の値:233
14項目の値:377
15項目の値:610
16項目の値:987
17項目の値:1597
18項目の値:2584
19項目の値:4181
20項目の値:6765
21項目の値:10946
22項目の値:17711
23項目の値:28657
24項目の値:46368
25項目の値:75025
26項目の値:121393
27項目の値:196418
28項目の値:317811
29項目の値:514229
30項目の値:832040
31項目の値:1346269
32項目の値:2178309
33項目の値:3524578
34項目の値:5702887
35項目の値:9227465
36項目の値:14930352
37項目の値:24157817
38項目の値:39088169
39項目の値:63245986
40項目の値:102334155
41項目の値:165580141
42項目の値:267914296
43項目の値:433494437
44項目の値:701408733
45項目の値:1134903170
46項目の値:1836311903
47項目の値:2971215073
48項目の値:4807526976
49項目の値:7778742049

```
Rの対話コンソールで最小2乗法を使った回帰分析

### はじめに
Rコンソールの対話プログラムで最小2乗法を使って1次関数を解くという変態的なことをしました。

今回は回帰直線を試すというもとで行うので事実とは異なりますが女子の平均身長が0歳から40歳まで伸び続けると仮定して分析を行っています:relaxed:
### 環境
R version3.4.4

###コード
XXはXの2乗　YYはYの2乗　EXはXの平均値　EYはYの平均値　EXYはX×Yの平均値　EX２はXの２乗の平均値　E2XはXの平均値の2乗を表します

```R
> age <- c(13,14,15,16,17)
> age
[1] 13 14 15 16 17
> height <-c(155,156.5,157.1,157.7,158)
> height
[1] 155.0 156.5 157.1 157.7 158.0
> XY<-age*height
> XY
[1] 2015.0 2191.0 2356.5 2523.2 2686.0
> XX<-age*age
> XX
[1] 169 196 225 256 289
> YY<-height*height
> YY
[1] 24025.00 24492.25 24680.41 24869.29 24964.00
> EXY<-mean(XY)
> EXY
[1] 2354.34
> EX<-mean(age)
> EX
[1] 15
> EY<-mean(height)
> EY
[1] 156.86
> EX2<-mean(XX)
> E2X<-EX*EX
> E2X
[1] 225
> EX2
[1] 227
> a<-(EXY-EX*EY)/(EX2-E2X)
> a
[1] 0.72
> b<-EY-a*EX
> b
[1] 146.06
> y<-function(x){return(a*x+b)}
> plot(y,0,40)
```


```math
y = 0.72x + 146.06
```

###得られた1次関数をグラフにすると...

![leastSquaresMethod.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470166/94afbc4a-3bc6-a9ad-cf9c-c4f0495abdf7.png)

横軸xが年齢縦軸yが身長です。成長によって身長が伸びるという相関関係が確認できたと思います。

```R
points(age, height)
```
Blazor(クライアントWebAssembly)で文字列に変数の値を埋め込む方法

#Blazor以外の場合
C#で文字列に対して単純に変数を埋め込むだけなら```$"{変数名}"```でいけますが、Listを回して埋め込もうとすると何かしらのライブラリを使用することになります。
で、何がいいのかと「c# テキストテンプレート」などで検索してみるとT4なんてものが引っ掛かりますが、使ってソースコードを生成するとか書いてるのでスルーします。（実はやりたいことが実現できるかもしれないけど、引っかかる使い道が今回の目的とは違うので多分無理なんだと判断しました）
で、asp.netや～coreでよく使うRazorをそもまま使えたらいいのにと思って検索したところ、[RazorEngine](https://github.com/Antaris/RazorEngine)がありその.NetCore版もあったので使ってみました。

```C#
var list = new List<string>
{
    "aaa",
    "bbb",
    "ccc",
};

var srcRazor =
@"## test02
@foreach(var item in @Model.list)
{
<text>
1. @item
</text>
}
";
var cpled = Engine.Razor.RunCompile(srcRazor, "key", null, new { list = list });

```

と、こんな感じであっさりと

```text
## test02
1. aaa
1. bbb
1. ccc  
```

と埋め込むことができました。
※.NetCore2.Xの場合はあっさりと動きましたが、.NetCore3.0の場合は途中でスリムにした際に色々と変わってしまったので動きませんが、先のソースコードから動くように書き換えたプロジェクトファイルをソリューションに混ぜて参照すれば解決するので問題ないよね。

#Blazorの場合
サーバーサイドで実行する場合はこれでも行けると思いますが、問題はクライアントサイドでの実行です。
今回やりたいことはBlazorのクライアントサイドでテンプレートを登録し、そこに対してサーバーから取得したデータを埋め込むという処理なので、ページ切り替えの際には同じテンプレートを使用したページの場合はデータだけ切り替えてクライアントサイドで出力文字列を生成する必要があります。※もっとも、毎回サーバーへポストして埋め込んでからクライアントへ戻すという処理でもいいのかもしれませんが、それだったらBlazor使う意味無いやんと思ったのであえてクライアントのWebAssembly内で値の埋め込みを行うとしています。
で、コンソールでのサンプルコードが動いたので気をよくしてBlazorのコードに埋め込むと・・・実行時エラーが起きてしまいました。で、頑張ってソースを追いかけたところ、値の埋め込み処理でテンポラリファイルを使用していることが判明しました。ただ、正直何やってるのかよくわからない感じだったのでテンポラリファイルを使用せずに埋め込みできるように変更可能かどうかも判断できず一旦諦めていました。

で、ついさっきもっぺんRazorEngineのオリジナルの方のissuesを見たら新しい話題が追加されていました[issues558](https://github.com/Antaris/RazorEngine/issues/558)。こいつを見ると「もう更新やめたっぽい？代替ってどない？」ってな内容で、それに対するコメントで「[#Script](https://sharpscript.net/)アルヨ」とあったので試してみました。以下はBlazorのテンプレートのindex.razorの中身を書き換えで確認しています

```C#:index.razor
@page "/"
@using ServiceStack.Script


<h1>MarkDownWiki</h1>

<p>@MkUp1</p>

@code
{
    MarkupString MkUp1 { get; set; }


    protected override void OnInitialized()
    {
        var title = "りすとだよ";
        var list = new List<string>
        {
            "aaa",
            "bbb",
            "ccc",
        };
        var context = new ScriptContext().Init();
        var inData = context.RenderScript(
        @"## {{title}}
        {{#each name in list}}
        1. {{name}}
        {{/each}}",
            new Dictionary<string, object> {
                ["title"] = title,
                ["list"] = list ,
            }
            );

        MkUp1 = new MarkupString(Markdig.Markdown.ToHtml(inData));
    }
}

```

無事値の埋め込みができました。

#蛇足
さらっと見てわかるとおり、テンプレートにMarkDownと値の埋め込みテンプレートを使用して出力するもので、感覚的にはwikiクローンっぽいものを出来るかな？と思って色々技術的に調べているところです。このテンプレートにDBから値を埋め込みたいってのは昔やってたブラウザゲームの攻略wikiで別ページのデータを埋め込んで使いまわすのをかなりやりまくっていて、1ページ内にincludexを100以上呼び出すといったやばい作りになっていました。レンタルwikiの管理人へお願いしてincludexのカスタマイズしてもらっていたのでやれた無茶だったんですが、その管理人さん、時々連絡が取れなくなることがあって別のwikiに移動しないとまずいって話が出たときにincludexが使えないところは論外といった感じで移転先に制限がかかってしまっていたのと、ページコメントの負荷がやばくて鯖落ちした時期があったのとでこういうデータの使いまわしがきくいい感じのwikiはつくれないかなぁと漠然と考えていたので気が向いたときにぼちぼちと調べていました。

ついさっき解決したばかりの走り書きなので体裁もきちんとできていませんが、Blazorはまだプレビュー版とはいえ.NetCore3.0がリリースされてから触る人が増えてきたようなので、何かしら同じようなことをしようとして詰まる人が出てくるのでは？と思って取り急ぎでうｐしました。
今日のトリビア VBAのConstステートメントは定数が使えるがVBScriptのConstステートメントでは使えない

#VBAとVBScriptのConstは微妙に異なる
VBAではConstで宣言した定数は次の定数の宣言時には定数として使える。しかしVBSCriptではそれができない。
##現象
###1.VBAの場合次のコードは成功する

```visualbasic
Option Explicit
    Const cnsA = "T"
    Const cnsB = cnsA & "-"
    Const cnsC = cnsB & "shirt"
Sub test()
    Debug.Print cnsC
End Sub
```

###2.VBSの場合次のコードは失敗する
Expected literal contant

```vb
Const cnsA = "T"
Const cnsB = cnsA & "-"
Const cnsC = cnsB & "shirts"
WScript.Echo cnsC
```

##原因
###VBAのConstは定数を使って定義できる
https://docs.microsoft.com/ja-jp/office/vba/language/concepts/getting-started/declaring-constants

expression 必須。 リテラル値、その他の<font color = "Red"><B>定数</B></font>、または、すべての算術演算子や論理演算子 (Is を除く) の任意の組み合わせを指定します。
###VBScript の場合は別の定数に依存する定数が作成できない。
[リテラル定数を指定してください。| 原因と対処](http://tooljp.com/language/VBScript/errorcode/VBScript-error-code-1045.html)
>エラー原因：
Const　で変数を"定数"として定義しましたが、変数が定数でありません。以下の例ではaは変数bに依存するため定数ではありません。

>【スクリプト】

>```vb
b=1
Const a = 1+b
```

この例からすると cnsBはConstで宣言した定数(cnsA)に依存することになり、エラーになると考えられる。


Expected literal contant
https://www.vbsedit.com/html/0be9852c-97bf-44a9-9980-7a597225b2f8.asp
You declared a constant, but assigned it a variable expression (a value that can change). Constants cannot contain runtime code.

###公式が紛らわしい
####VBAと変わらない書き方のようだが、このあとの注(Remark)がある。
expression
Required. Literal or other constant, or any combination that includes all arithmetic or logical operators except Is.

***You can't use variables, user-defined functions, or intrinsic VBScript functions (such as Chr) in constant declarations. By definition, they can't be constants. You also can't create a constant from any expression that involves an operator, that is, only simple constants are allowed.*** Constants declared in a Sub or Function procedure are local to that procedure. A constant declared outside a procedure is defined throughout the script in which it is declared. You can use constants anywhere you can use an expression. The following code illustrates the use of the Const statement:

定数宣言では、変数、ユーザー定義関数、または組み込みのVBScript関数（Chrなど）を使用できません。定義により、定数にすることはできません。また、演算子を含む式から定数を作成することはできません。つまり、単純な定数のみが許可されます。 


`Const cnsB = cnsA & "-"`は演算子を含むのと、By definition, they can't be constants. つまり定数を定義(definition)しているため、エラーになるようだ。
rails protected とprivateの備忘録


private

protectedともに、外部から情報を隠蔽したいときに使用する。

では何が違うか？
self.method名で呼べるかどうか。

```
 # protected
    puts protected_method #=> OK
    puts self.protected_method #=> OK
protectedはレシーバを付けれる
 # private
    puts private_method #=> OK
    puts self.private_method #=> NG
privateメソッドはselfをつけれない
privateは関数形式でしか呼び出せない。

```
簡単に結論は、
protectedは self.method名で呼べる
privateはself.method名で呼べない

でいいのかなと。

参考
https://morizyun.github.io/blog/protected-refinements-sendagaya.rb/
https://qiita.com/tbpgr/items/6f1c0c7b77218f74c63e