OmniAICreator/Qiita-1.07M huggingface dataset:
githubのmarkdown-cssをぶっこ抜く方法


githubのmarkdown用cssを使いたい！けどどこで拾ったらいいの？と疑問に思ったので調べてみました。

---


まず`github css`とググったらこんなリポジトリがヒットしました。

[sindresorhus/github\-markdown\-css: The minimal amount of CSS to replicate the GitHub Markdown style](https://github.com/sindresorhus/github-markdown-css)

ここに置いてある`github-markdown.css`というヤツがどうやらソレみたいです。さっそく見てみましょう。

```css
@font-face {
  font-family: octicons-link;
  src: url(data:font/woff;charset=utf-8;base6 //長いので以下省略
}

.markdown-body {
  -ms-text-size-adjust: 100%;
  -webkit-text-size-adjust: 100%;
  line-height: 1.5;
  color: #24292e;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
  font-size: 16px;
  line-height: 1.5;
  word-wrap: break-word;
}

.markdown-body .pl-c {
  color: #6a737d;
}

```

全てのセレクタが`.markdown`で始まっています。ちゃうねん、`body`とか`h1`とか書いてあるヤツが欲しいねん。

┐(´д｀)┌ﾔﾚﾔﾚ

と思いましたが全てに付いてるので話は簡単。適当なエディタを開いて`.markdown-`を空文字にall-replace(すべて置き換え)するだけでアッサリ作業終了です。cssゲットです。

---

そもそもこのリポジトリなんなの？とよく見てみると、製作者のsindresorhus氏が作った[generate\-github\-markdown\-css](https://github.com/sindresorhus/generate-github-markdown-css)という別のリポジトリがあります。  
ソースを読んでみると

- github.comのhtmlから\<link\>タグのhref=`*.css`をぶっこ抜く
- そこから`.markdown-body`のcssをぶっこ抜いてまとめる

ということをやっています。これを使って`github-markdown-css`を更新しているようです。


つまりgithubの仕様が変わらない限りは、実際に使われているcssが手に入るという事みたいです。

---

とは言ってもライセンス大丈夫なの？と思い調べてみました。  
まず、このsindresorhus氏の2つのリポジトリはMITライセンス。  
そしてgithubからlinkされている以下の2つもMITです。

[https://assets-cdn.github.com/assets/frameworks-c4bbb32afb602dcf8c75be0bc4c83014.css]()

[https://assets-cdn.github.com/assets/github-0c21e211e4fd150ac107ccf0fcf751e5.css]()

どうやらライセンス的にも問題なさそうです。

## まとめ

[https://raw\.githubusercontent\.com/sindresorhus/github\-markdown\-css/gh\-pages/github\-markdown\.css](https://raw.githubusercontent.com/sindresorhus/github-markdown-css/gh-pages/github-markdown.css)

1. ↑からコピペもしくはダウンロード
2. 適当なエディタで1を開き、`.markdown-`でfind、''(空文字)でreplace

現場からは以上です。(｀･ω･´)ゞ
lispでhtmlとかjavascriptを生成してみる 2回目

javascriptのif else文ファイル書き込みのcommon lispプログラム
(書きかけ...)

gist
https://gist.github.com/taroyanaka/98d93dc2f455133d1dd02aca899e5e4c#file-js-generate-lisp

環境
mac OS 10.12.6
SBCL 1.4.1

```common-lisp:js-generate.lisp
(setq lst (list "if(){}"))

(setq lst (list "if(){}" "else{}"))

(setq lst (list "if(){}" "else if(){}" "else{}"))

(setq lst (list "if(){}" "else if(){}" "else if(){}" "else{}"))


(defun add-to-tail (l x)   (reverse (cons x (reverse l))) )

(defun list-insert-at (lst index new-value)
  (let ((retval nil))
    (loop for i from 0 to (- (length lst) 1) do
      (when (= i index)
        (push new-value retval))
      (push (nth i lst) retval))
    (when (>= index (length lst))
      (push new-value retval))
    (nreverse retval)))

(list-insert-at lst 1 "else if(){}")

(defun cat (lst)
  (with-output-to-string (stream)  (dolist (char lst) (princ char stream)))
)

(cat lst)
```

参考
https://ja.wikibooks.org/wiki/Lisp/%E5%9F%BA%E6%9C%AC%E3%81%8B%E3%82%89%E3%81%95%E3%82%89%E3%81%AB%E4%B8%80%E6%AD%A9%E9%80%B2%E3%82%93%E3%81%A7/%E6%96%87%E5%AD%97%E5%88%97
https://stackoverflow.com/questions/4387570/in-common-lisp-how-can-i-insert-an-element-into-a-list-in-place
https://stackoverflow.com/questions/13359025/adding-to-the-end-of-list-in-lisp
[Unity] OVRLipSyncの口形素について

OVRLipSyncに付属のサンプルシーンより口形素を調査する。
デモラー向けのメモです。

MPEG4の口の形についてのサンプル
https://www.visagetechnologies.com/uploads/2012/08/MPEG-4FBAOverview.pdf

| Index | 口形素 | Demoシーンの口の形 | キズナアイの口の形 | Sample | 補足 |
|:-----------------:|:-----------------:|:------------------:|:------------------:|:------------------:|:------------------|
| 0 | sil | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/a4151d7f-92d8-b3ca-2b58-8695397a78eb.png) | | | 無音 |
| 1 | PP | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/f6cdbaec-4175-c558-d735-02c1037ad30c.png) | | Put, bed, mill | |
| 2 | FF | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/c00f76a5-ca91-40f4-555f-608391b2b98b.png) | | Far, voice | |
| 3 | TH | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/c203a05c-0c41-7a19-9467-5312ad47b1d6.png) | | Think, that | |
| 4 | DD | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/571de6fb-4261-30b5-2146-dbe7e8e58588.png) | | Tip, doll | |
| 5 | kk | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/24149d5d-e61f-a437-5d14-4fbc022a216e.png) | | Call, gas | |
| 6 | CH | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/d7925ce6-b583-9fe1-3648-7572067311b6.png) | | Chair, join, she | |
| 7 | SS | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/277829b9-9c5d-e708-ffcd-a9cdf3157abf.png) | | Sir, zeal | |
| 8 | nn | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/b2f7928f-f4e2-7fdf-d797-cc8399b847b6.png) | | Lot, not | |
| 9 | RR | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/aa11d493-8a29-22ca-f2d8-57131944727c.png) | | Red | |
| 10 | aa | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/5270ab12-3cfe-7590-a28c-96f83d84851c.png) | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/e50b2ff4-c3d2-eae8-618b-2cb9dc63822a.png) | Car, あ | |
| 11 | E | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/83090fc3-1c5d-c344-147c-8dbbfc96253d.png) | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/dc8ce559-c2f8-556f-036f-0f50e2e829d6.png) | Bed, え | |
| 12 | ih | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/2c912af6-3b67-9b58-7c3e-906d7770f7d8.png) | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/f2410cbb-7102-90e3-dcc4-333b1b173f87.png) | Tip, い | 上の歯と下の歯がくっついている |
| 13 | oh | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/c19f7056-4486-bacb-2c5a-d95d94d4aed8.png) | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/90bf0626-7f23-9a0d-a497-9c55291ab5b7.png) | Top, お | |
| 14 | ou | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/86b143ca-9a89-6298-1e89-9288aab5f938.png) | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/d20762b3-dea9-dbbe-dab9-1009a242b7ca.png) | book, う | |
firewall ダイレクトルール

■追加
〇優先度1番、172.16.50.146 80番ポートだけaccept
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -m state --state NEW -m tcp -p tcp -d 172.16.50.146 --dport 80 -j ACCEPT
〇優先度2番、172.16.50.0/24 80番ポートは、drop
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 2 -m state --state NEW -m tcp -p tcp -d 172.16.50.0/24 --dport 80 -j DROP

※オプションの--permanentをつけないとos再起動やサービス再起動した際に設定が削除される。
　逆に残したくない場合は、つけない。

■削除
firewall-cmd --permanent --direct --remove-rule ipv4 filter OUTPUT 1 -m state --state NEW -m tcp -p tcp -d 172.16.50.146 --dport 80 -j ACCEPT
firewall-cmd --permanent --direct --remove-rule ipv4 filter OUTPUT 2 -m state --state NEW -m tcp -p tcp -d 172.16.50.0/24 --dport 80 -j DROP

■yum通信だけ通したい場合
firewall-cmd --direct --remove-rule ipv4 filter OUTPUT 19 -m state --state NEW -p tcp -o eth1 -m multiport -d 10.253.250.0/24 --dport 80,443,4122,3128,^C80,8081,8009,28080,48080,10080,10443 -j ACCEPT

■ダイレクトルールを表示、確認する。
firewall-cmd --direct --get-all-rules

■firewalld停止
systemctl stop firewalld

■firewalld開始
systemctl start firewalld

■firewalldステータス確認
systemctl status firewalld
VSCodeのGo for Visual Studio Code 0.6.78が動作しなくなった時したこと

# はじめに

golangは趣味でやっていてVSCodeにも詳しくないので、より簡単な対処法ご存知の方いらっしゃったら教えていただきたいです。

## 環境

- macOS 10.13.4
- VSCode: 1.22.2
- Go for Visual Studio Code: 0.6.78

![スクリーンショット 2018-04-26 20.42.48.png](https://qiita-image-store.s3.amazonaws.com/0/6290/05f1b588-c522-347b-d8e5-dbcfff3a9fb5.png)


# 何が起きたか

久しぶりにGoを触ってみようと思いVSCodeでGoファイルを開いたところ、以前は有効になっていた補完機能や自動import機能、ジャンプ等が軒並み動作しなくなっていた。

[Visual Studio Code(vscode-go)のコード補完が効かなくなる](http://blog.y-yuki.net/entry/2017/09/08/173000)を参考に`gocode` アップデート`gocode close`を試したり
Go for Visual Studio Codeの再インストールをやってみたが動作しない。

この時、コマンドパレットの`Go: Install/Update Tools`を実行してみたら`command 'go.tools.install' not found`というエラーが出た。
`Go: Current GOPATH`を実行するとこちらも`command 'go.gopath' not found`とエラー。GOPATH設定しているのに...

# 一つ前VersionのGo for Visual Studio Codeをインストールする

Go for Visual Studio Codeの最新版（0.6.78）が壊れているのではないかと思い一つ前のVersionを入れてみることにした。

過去Versionの拡張機能をインストールする方法については[こちらのサイト](https://inocop.hatenablog.com/entry/2018/03/14/135252)を参考にさせていただきました。

## ファイルのダウンロード・インストール
```
Go for Visual Studio Code 0.6.77をダウンロードしたい場合

${publisher}      -> lukehoban  
${extension_name} -> go  
${version}        -> 0.6.77

https://lukehoban.gallery.vsassets.io/_apis/public/gallery/publisher/lukehoban/extension/go/0.6.77/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage
```
で、DLしたファイルを拡張子vsixにリネームして、コマンドパレットの`拡張機能:VSIXからのインストール`で選択してインストールする。

## 拡張機能の自動更新をオフにする

これを忘れるとVSCodeを再起動するとGo for Visual Studio Codeが最新になってしまうので設定しておく。

``` settings.json
"extensions.autoUpdate": false
```

## 必要なパッケージのインストール

コマンドパレットの`Go: Install/Update Tools`を実行する。
今度は正常に`gocode`や`gopkgs`などがインストールされて...

![スクリーンショット 2018-04-26 20.17.25.png](https://qiita-image-store.s3.amazonaws.com/0/6290/579b16c4-3927-bd02-4c20-746286c56405.png)

無事、補完やジャンプが動作するようになった！
結局、0.6.78がバグってるということなんだろうか。
capistrano3でrestartタスク

Capistranoの3.10でデプロイ後にサーバ(apache)を再起動させるためのタスクです。

``` config/deploy.rb
namespace :deploy do
  after :publishing, :restart

  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      execute :sudo, 'service apache2 restart'
    end
  end
end
```

どのバージョンからかは定かでないですが、 `cap install` してもタスクの定義が生成されなくなってしまっていて構築の手がかりがなくなっています。

[deploy:restart task not executing](https://github.com/capistrano/capistrano/issues/925)

上記は少し前のバージョンのテンプレートを参考にして実装しました。将来のバージョンでも正しく動くかは不明です…。

https://github.com/capistrano/capistrano/blob/4e6523e1f50707499cf75eb53dce37a89528a9b0/lib/capistrano/templates/deploy.rb.erb
ParallelQuery の列挙には foreach ではなく ForAll() を使いましょう

## 目的
１回１回の処理が重い列挙を速くしたい。  
こんなの。

```cs
var source = Enumerable.Range(0, 20);

var sw = Stopwatch.StartNew();
foreach (var i in source) {
    Fetch(i);
}
Console.WriteLine(sw.Elapsed);
// 00:00:02.0102643

void Fetch(int number) {
    // 重い処理。
    Thread.Sleep(100);
}
```
並列実行したら速そう。

## AsParallel() を付ける
```cs
foreach (var i in source.AsParallel()) {
    Fetch(i);
}
Console.WriteLine(sw.Elapsed);
// 00:00:02.0139477
```
あれ、遅い・・・

## foreach → ForAll() で列挙
```cs
source.AsParallel().ForAll(i => {
    Fetch(i);
});
Console.WriteLine(sw.Elapsed);
// 00:00:00.5032450
```
（サラマンダーより）速い！

`Parallel.ForEach()` も試してみる。

```cs
Parallel.ForEach(source, i => {
    Fetch(i);
});
Console.WriteLine(sw.Elapsed);
// 00:00:00.5017158
```
速い！

## 比較
BenchmarkDotNet はマルチスレッドのベンチマーク向けにデザインされていないけど、一応貼っておく。

```

BenchmarkDotNet=v0.10.14, OS=Windows 10.0.14393.2068 (1607/AnniversaryUpdate/Redstone1)
Intel Core i5-6200U CPU 2.30GHz (Skylake), 1 CPU, 4 logical and 2 physical cores
Frequency=2343751 Hz, Resolution=426.6665 ns, Timer=TSC
.NET Core SDK=2.1.104
  [Host] : .NET Core 2.0.6 (CoreCLR 4.6.26212.01, CoreFX 4.6.26212.01), 64bit RyuJIT
  Core   : .NET Core 2.0.6 (CoreCLR 4.6.26212.01, CoreFX 4.6.26212.01), 64bit RyuJIT

Job=Core  Runtime=Core  

```
|                Method |      Mean |     Error |    StdDev |    Median |       Min |       Max | Scaled | ScaledSD |   Gen 0 | Allocated |
|---------------------- |----------:|----------:|----------:|----------:|----------:|----------:|-------:|---------:|--------:|----------:|
|    Enumerable_foreach | 36.781 ms | 0.7284 ms | 0.6457 ms | 36.771 ms | 35.680 ms | 37.995 ms |   1.00 |     0.00 |       - |       0 B |
| ParallelQuery_foreach | 36.969 ms | 0.6525 ms | 0.6104 ms | 36.757 ms | 35.833 ms | 38.051 ms |   1.01 |     0.02 |       - |       0 B |
|  ParallelQuery_ForAll |  9.753 ms | 0.0826 ms | 0.0848 ms |  9.764 ms |  9.579 ms |  9.885 ms |   0.27 |     0.01 |       - |    3808 B |
|      Parallel_ForEach |  2.975 ms | 0.3545 ms | 1.0453 ms |  2.503 ms |  1.974 ms |  5.392 ms |   0.08 |     0.03 | 31.2500 |    5959 B |

ParallelQuery_ForAll の `Scaled` が Enumerable_foreach（ベースライン）の 1/4 になっていて、4つの論理コアをいい感じに使っている（Parallel_ForEach はなんかアレだけど）。



### ソースコード
https://gist.github.com/in-async/a77b12290dc48046034248af14b97b7d

## 総括
`ParallelQuery` を foreach で列挙しても [foreach 自体は並列実行されない](https://docs.microsoft.com/ja-jp/dotnet/standard/parallel-programming/introduction-to-plinq#the-forall-operator) ので、列挙の並列化が必要な時は `ForAll()` を使いましょう。

## 参照
- https://docs.microsoft.com/ja-jp/dotnet/standard/parallel-programming/introduction-to-plinq
- https://docs.microsoft.com/ja-jp/dotnet/standard/parallel-programming/potential-pitfalls-with-plinq#prefer-forall-to-foreach-when-it-is-possible
HerokuでRuby on Railsを動かすときに躓いたところ

## スペック
Windows10(PC)
ほぼ素人(本人)
## 環境構築
当初はRubyのインストール -> gem install rails の順で進めていたが、
rails server を打つと、謎のLoadErrorが起きて詰む。
mingw32関連のエラーっぽいのだが丸一日調べても解決できず…。
あきらめかけたその時に、Railsまで含めたインストーラーがあることを知る。
http://installrails.com 

こちらで試したところ5分で環境構築が完了する。
あの苦労は何だったのか…。

## Herokuへのコミット
2箇所修正が必要

### Gemfile

```
# Use sqlite3 as the database for Active Record
gem 'sqlite3'
```

↓HerokuはPostgreSQLで動いているので、本番(production)では、その対応が必要

```
# Use sqlite3 as the database for Active Record
# gem 'sqlite3'
gem 'sqlite3', group: [:development, :test]
gem 'pg', group: :production
```

### config/database.yml

＊ 事前にHeroku上で、PostgreSQLのアドオン(Heroku Postgres)を有効にしておく。

```
production:
 <<: *default
 database: db/production.sqlite3
```

↓以下のように設定する

```
production: 
# <<: *default
# database: db/production.sqlite3
  encoding: unicode
  adapter: postgresql
  username: username
  port: 5432
  host: hostname
  database: database
  password: password
```

username, hostname, port, database, passwordは、
Heroku configコマンドをたたくとDATABASE URLがわかるので、そこから判別する

> postgres://username:password@hostname:port/database

以上でOKでした :)
HerokuにPHPをVisualStudioCodeからデプロイしてみよう

「HerokuにPHPをSorceTreeからデプロイしてみよう」の環境
https://qiita.com/sanoh/items/2d45595273f3ac09a4d2
からSorceTreeを使わず、直接VisualStudioCodeからデプロイしてみましょう。

■VisuaiStuidoCode立ち上げ
---
![2018-04-26 (12).png](https://qiita-image-store.s3.amazonaws.com/0/122121/924bb608-a5f9-20fe-aa91-1a003d3b5272.png)
前回の index.php があることがわかります。
■ソースを少し変更
---
前回の index.php に少し手を加える
![2018-04-26 (13).png](https://qiita-image-store.s3.amazonaws.com/0/122121/cabe5b66-00fb-c711-98d7-4be727e39258.png)

```php:index.php
<?php
echo "Hello Heroku World!";
echo "VisualStudioCode";
?>
```
■Save
---
[すべて保存]を選択、もしくはショートカットの[Ctr+K S]をします。すると
![2018-04-26 (14).png](https://qiita-image-store.s3.amazonaws.com/0/122121/d1c0297f-8758-d502-2291-3d280bc022d9.png)
ソース管理のアイコンに　「1」という数字が表れます。
■すべてコミット
---
「ソース管理」のアイコンをクリックすると画面が切り替わるので。
![2018-04-26 (17).png](https://qiita-image-store.s3.amazonaws.com/0/122121/ca294f32-70f0-67b0-2edb-1017617d81e4.png)
「ソース管理：GIT」の下の入力欄にコメント（今回は「VS code push」にしてあります）
そして「・・・」をクリックすると、メニューが表れますので「すべてコミット」を選択してください。
■デプロイ
---
![2018-04-26 (19).png](https://qiita-image-store.s3.amazonaws.com/0/122121/aa0cf3a2-08aa-78ce-0d07-662e1d271c72.png)
「・・・」をクリックすると、メニューが表れますので「プッシュ」を選択するとデプロイされます

前回同様、HEROKUのURLを見て
![2018-04-26 (20).png](https://qiita-image-store.s3.amazonaws.com/0/122121/992742a0-c958-3e8b-93b1-1df95f2d9bfe.png)
なっていれば成功です。
Restyaboardをdocker-compose upした際の備忘録

# モチベーション

* なんとなくTrello以外の何かで看板がほしかったからです。
* Wekanはすでに社内で使用していたので違うのにチャレンジてみたかったです。よかったら使い続けて使えなさそうならWekanにしようと思ってます。

# 看板とは？

> to do -> do today -> doing -> done

のように作業の工程を看板に貼り付けて可視化するツールです。

## Reatyaboard

今回入れてみたツールです。

公式：[http://restya.com/board](http://restya.com/board)

まだアルファ版なようで不安定みたいです。
install/downloadのボタンを押すためにはメールアドレスのとうろくが必須になっています。

# 導入

## Dockerの場合

1. 公式からDownloadボタン（Docker）を押すとGitHubに飛ぶ。（この際にMailAddressの登録が必要）
1. Readmeの通りにする。

```
$ sudo git clone "githubのURL"
$ cd docker-restyaboard
$ sudo docker-compose up --build
```

__注意__  
Postgresqlを使用しており、そのデフォルトポート(5432)が使用できなければいけないようです。
また、publicからのアクセスを受け付けるのは1234ポートなので、これを変えるためにはちょっといじらなきゃいけないみたいです。

# 詰まったところ

## 1. Nginxのパーミッション

なんでか知らんがログインすらできなかった...
理由はnginxがログを吐き出す先のパーミッションがあってなかったかららしいです。
下記を`docker-entrypoint.sh`に追記して対処しました。

```
~~~ 省略 ~~~ # 多分記述はどこでもいいけど最初の方にやっておいた
  chmod 777 /usr/share/nginx/html -R
~~~ 省略 ~~~
```

## 2. phpのパーミッション？

上記を直したらURLはloginってリダイレクトされたけど、なんも描画されなかった...
ログを見ると、対象のPHPファイルに書き込めませんって出てたのですが、そもそもそのファイルが無かったので、なんとなくファイル作ったら動きました。
（おそらく変えなくても動くかもしれませんが、一応パーミッションとオーナーも変えておきました。）

```
# cd /usr/share/nginx/html/tmp/cache
# touch ./site_url_for_shell.php
# chmod 777 ./site_url_for_shell.php
# chown www-data:www-data ./site_url_for_shell.php


# cd /usr/share/nginx/html/tmp/cache
# touch ./client.php
# chmod 777 ./client.php
# chown www-data:www-data ./client.php
```

これで一応動きました。
細かい仕様感についてはまた余裕が出てきたら書いてみようと思います。
PostgreSQL・MySQLコマンド対照表

## これは何？
MySQL頭の人（わたし）がPosgreSQLのコマンドを覚えるために、リファレンス的に使うもの。
両方のコマンドを、使う時系列順に対照表で書く。

## PostgreSQL・MySQLコマンド対照表

| やりたいこと                   | MySQLのコマンド |PosgreSQLのコマンド   |
|:----------------------------|:------------------|:------------------|
|データベースに入る               |myql {DB_NAME}|  psql {DB_NAME}|
|ユーザーを指定してデータベースに入る|mysql -u {USER_NAME} {DB_NAME}|psql -U {USER_NAME} {DB_NAME}|
|データベース一覧表示             |SHOW DATABASES;|\l;|
|データベースの切り替え           |USE {DB_NAME};|\c {DB_NAME};|
|ユーザー一覧表示                |SELECT HOST, USER FROM mysql.user;|\du;|
|現在のユーザー(Role)を表示       |SELECT USER();|SELECT CURRENT_USER;|
|ユーザーの作成                  |CREATE USER '{USER_NAME}'@'{HOST_NAME}' IDENTIFIED BY '{PASSWORD}';||
|ユーザーに権限を付与する          |GRANT {権限} ON {レベル} TO {USER_NAME};|MySQLと同じ|
|ユーザーの権限を確認する          |SHOW GRANTS FOR '{USER_NAME}'@'{HOST_NAME}' ¥G;|\connect - {USER_NAME};|
|テーブル一覧表示                 |SHOW TABLE STATUS ¥G;|\d;|
|テーブルのスキーマの詳細を表示     |DESC {TABLE_NAME};|\d {TABLE_NAME};|
|テーブル名変更                   |ALTER TABLE {CURRENT_TABLE_NAME} RENAME TO {NEW_TABLE_NAME};|MySQLと同じ|
|データベースから出る              |quit|\q|


参考：
[MySQLの権限の種類と設定されている権限の確認](https://www.dbonline.jp/mysql/user/index5.html)
JavaScriptでCSVファイルを2次元配列に変換

JavaScriptでCSVファイルを2次元配列に変換する関数のサンプルです。
URLを引数に入れると2次元配列の形式で返ってきます。
数値に「"」がついている場合は、「"」を削除して値を格納します。

```getCsv.js
function getCsv(url){
  //CSVファイルを文字列で取得。
  var txt = new XMLHttpRequest();
  txt.open('get', url, false);
  txt.send();

  //改行ごとに配列化
  var arr = txt.responseText.split('\n');

  //1次元配列を2次元配列に変換
  var res = [];
  for(var i = 0; i < arr.length; i++){
    //空白行が出てきた時点で終了
    if(arr[i] == '') break;
    
    //","ごとに配列化
    res[i] = arr[i].split(',');

    for(var i2 = 0; i2 < res[i].length; i2++){
      //数字の場合は「"」を削除
      if(res[i][i2].match(/\-?\d+(.\d+)?(e[\+\-]d+)?/)){
        res[i][i2] = parseFloat(res[i][i2].replace('"', ''));
      }
    }
  }

  return res;
}
```
【Ruby on Rails】＝を使う代入関数。書き方とハマった部分書くけど、使い所わからん。

最近、代入関数を使いました。
んで、代入関数の使い方とハマった部分をまとめ。

ただ、使い所がイマイチわからなかったので、知ってる人いたらコメントとかしてもらえると嬉しいです。

代入関数は、代入演算子を利用して引数を渡せるってのがポイントだと思うんですよね。

代入関数を定義しましょう。

```hoge.rb

class Hoge
  attr_accessor :id
  
  def fuga=(num)
    @id = num + 100
  end  
end  
```

hogeクラスにfugaというメソッドを用意しました。
fuga=(num)と書くと代入関数を表します。
で、このfugaに代入演算子で引数を渡すと。

```rb

pry(main)> h = Hoge.new
=> #<Hoge:0x007ff1f80f6940>
pry(main)> h.fuga = 100
pry(main)> h.id
=> 200
```

ふ〜〜〜！！idが200になってる〜〜！！
これはこれで、使いやすい。



ってとこまでは、よかったんだ。
ハマったのはこれ。

```rb
[10] pry(main)> h.fuga = 500
=> 500
```

わかります？
h.fugaに500渡してるんだから戻り値600であってほしいんですよ？

```rb
def fuga=(num)
    @id = num + 100
end  
```
って定義してるわけですから。

この代入関数なんですが、戻り値は代入した値が返ってくるんですよね・・・・。
これで、idの値を確認すると

```rb
[11] pry(main)> h.id
=> 600
```

ちゃんと更新されてます。

これでハマった。。


とまぁ、代入関数に関して書きましたが、この代入関数の使い所が掴めてないのです。
SwiftからNSObjectのloadとinitializeを扱えるようにする

## まず始めに

Method Swizzlingを行う場合などに、Objective-CではNSObjectのsubclassで **[+(void)load](
https://developer.apple.com/documentation/objectivec/nsobject/1418815-load)** や **[+(void)initialize](https://developer.apple.com/documentation/objectivec/nsobject/1418639-initialize)** を利用していたかと思います。
しかしながらそれらのクラスメソッドは、SwiftからOverrideしようとすると下記のようなエラーになってしまいます。

<img width="725" alt="スクリーンショット 2018-04-26 18.12.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/60325/56c470d8-2560-f672-bd10-f13ced917a55.png">

<img width="802" alt="スクリーンショット 2018-04-26 18.13.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/60325/47aa09f1-edab-05d3-d88f-fce07f94e871.png">

## Swiftで扱えるようにするには

まずはObjective-Cで定義をします。Swiftで利用する際にextension内でoverrideをして使う形にするため

- **_RuntimeHandler** (Overrideするためのクラス)
- **RuntimeHandler** (_RuntimeHandlerを継承し、実際にSwiftで利用するクラス)

を定義します。

```objc:RuntimeHandler.h
@interface _RuntimeHandler: NSObject

+ (void)handleLoad;

+ (void)handleInitialize;

@end

@interface RuntimeHandler : _RuntimeHandler
@end
```

実装ファイル側では

- **_RuntimeHandler**にハンドリング用のクラスメッソドを実装
- **RuntimeHandler**では `+(void)load` と `+(void)initialize`を実装し、`_RuntimeHandler`に実装したメソッドを呼び出す

という実装をします。

```objc:RuntimeHandler.m
#import "RuntimeHandler.h"

@implementation _RuntimeHandler

+ (void)handleLoad {
    NSLog(@"Please override RuntimeHandler.handleLoad if you want to use");
}

+ (void)handleInitialize {
    NSLog(@"Please override RuntimeHandler.handleInitialize if you want to use");
}

@end

@implementation RuntimeHandler

+ (void)initialize {
    [super initialize];
    [self handleInitialize];
}

+ (void)load {
    [super load];
    [self handleLoad];
}

@end
```

## 実際に利用する

下記のような形で、Swiftから利用できるようになります。

```swift
extension RuntimeHandler {
    open override class func handleLoad() {
        print("did call handleLoad!")
    }

    open override class func handleInitialize() {
        print("did call handleInitialize!")
    }
}
```

## ちなみに

下記のように、Swift側でRuntimeHandlerを継承したクラスを実装したとしても、継承している_RuntimeHandlerの `+(void)load` と `+(void)initialize` が呼ばれないため、 `handleLoad`と`handleInitialize`も呼ばれません。

```swift
class Hoge: RuntimeHandler {
    open override class func handleLoad() {
        print("did call handleLoad!")
    }

    open override class func handleInitialize() {
        print("did call handleInitialize!")
    }
}
```
FirstVRでロケットパンチしてみた

さっそくFirstVRに慣れていこうと思いまして手とオブジェクトの連携をかねてロケットパンチをやることにしました。

##作り方
まずSDKのシーンFVR/Samples/Scenesの中のOutputViewerを開きます。
そしてHierarchyのMuscleSensorViewerとDebug Toolsを消します。

こんな感じの見た目になるはず。

<img width="1390" alt="スクリーンショット 2018-04-26 16.32.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/253416/7d0555d7-f767-3bd5-be7f-d9f95d67c19f.png">


そしてゾンビと手を入れてこんな感じ

<img width="1440" alt="スクリーンショット 2018-04-26 17.17.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/253416/7fd7959e-32ad-ec69-9a1e-6d506128945c.png">


次にSceneManagerのSampleViewManagerを開きます。上記の青枠をクリックしてください。

変数として
```public GameObject cube;```

こんな感じのが宣言されているのでとりあえず
```public GameObject Hand;```
とかにして

```
Start(){
	Hand = GameObject.Find(“Hand_right”);
}
```

とします。”Hand_right”の部分は適宜手に連動させたいオブジェクトの名前を入れてください。

次に適当にC#ファイルを作ります。ここではhandControlとします。

開いたらまずusing FVRlib;を書き、
FVRConnnection の変数を宣言しHierarchyにあるFVRオブジェクトのFVRConnectionコンポーネントを持ってきます。

以下の感じ、

```FVRConnection fvr;```
```fvr = GameObject.Find("FVR").GetComponent<FVRConnection> (); ```

次に一定以上の加速度があると腕が飛び出していくようにします。

なんとそんな加速度が閾値以上かどうかの判定を行うときに使えるfvr.accel.magnitudeっていう変数があるんです。
ちなみに飛ばすときはVector3型の変数をバッファとして用意してあげる必要があります。

以下のコードをFixedUpdateの中に入れます。

コードはこんな感じ

```
using System.Collections; 
using System.Collections.Generic; 
using UnityEngine;
 using FVRlib;

  public class handControl : MonoBehaviour {  	
    FVRConnection fvr; 	
    GameObject hand; 	
    Vector3 buffPosition;  	
    // Use this for initialization 	
    void Start () { 		
        fvr = GameObject.Find("FVR").GetComponent<FVRConnection>(); 
        hand = GameObject.Find ("Hand_right"); 	
    }  	
    void FixedUpdate(){ 		
        if fvr.accel.magnitude > 1.0f || Input.GetKey("z")) { 
            buffPosition = hand.transform.position; 	
            buffPosition.z += 1.0f; 			
            hand.transform.position = buffPosition; 		
        } 	
    }  	
}

```
これを動かしたいオブジェクト（今回はHand_right）にアタッチしてスマホで実行してみます。


こんな感じ
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">さっそくFirstVRでこんなん作ったww<a href="https://twitter.com/hashtag/FirstVR?src=hash&amp;ref_src=twsrc%5Etfw">#FirstVR</a> <a href="https://t.co/9QoSuM5a8P">pic.twitter.com/9QoSuM5a8P</a></p>&mdash; Satosh (@satosh28425184) <a href="https://twitter.com/satosh28425184/status/989443204893237248?ref_src=twsrc%5Etfw">2018年4月26日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 


次回は加速度を利用してものを投げるのをやってみます。
Mapped typeとConditional typeを使ってclass/interfaceのプロパティの型を変更するサンプル

以下のようなコードのContent型のプロパティから、OrFunction内の関数定義のみを取り除いた型（Union型の一部を取り除いた型）を作ることができます。

```main.ts
type OrFunction<T> = T | ((val: string) => T);
interface Content {
    id: string;
    id2?: number;
    key: OrFunction<string>;
    value?: OrFunction<boolean>;
    names?: Array<OrFunction<string>>;
    names2: Array<OrFunction<string>>;
    value2?: Array<Array<OrFunction<string>>>;
}
```

Conditional typesは再帰的定義ができないようなので、Arrayのネスト分の定義が必要になるのが惜しいですが、以下のような定義をしておくと

```sample.ts

type Plain<T> = { [P in keyof T]: ExcludeArray<T[P], (val: any) => any> };
type ExcludeArray<T, U> = T extends Array<infer R> ? Array<ExcludeArray2<R, U>> : Exclude<T, U>;
type ExcludeArray2<T, U> = T extends Array<infer R> ? Array<Exclude<R, U>> : Exclude<T, U>;

```

`Plain<Content>`は以下のような型になります。

```
{
    id: string;
    id2?: number;
    key: string;
    value?: boolean;
    names?: Array<string>;
    names2: Array<string>;
    value2?: Array<Array<string>>;
}
```

Mapped typesは一見難しそうですが、`{ [P in keyof T]: T[P] }`の基本的な形を覚えておけばOKです。
Conditional typesの導入とともに入った`Exclude`型は便利ですね。
Pythonで複数の値を入力する方法

#Pythonで複数の整数を入力する
「1 2 3」のようにスペースで区切って一気に複数の整数を入力させ、それを別々の変数に対応させたい　という場合の簡単な解決法を紹介しています。

#（まずは）Pythonでひとつの文字列を入力する方法
input()を使います。

```python
a=input()
print(a)
```
結果：
>apple
>apple

# Pythonでひとつの整数を入力する方法
input()を使い入力させ、intで整数に直します。

```python
a=int(input())
print(a)
```
結果：
>1
>1
  
#Pythonで複数の文字列を入力する方法
input()で入力した後、split()を使い、スペースの入ってる位置でaとbを区切ります。

```python
a,b=input().split()
print(a)
print(b)
```
結果：
>apple orange
>apple
>orange

# (本題)Pythonで複数の整数を入力する場合
input().split()までは文字列の場合と同じなのですが、整数に直すために　int(x) for x in を使います。

```python

a,b=(int(x) for x in input().split())
print(a)
print(b)
```
結果：
>1 2
>1 
>2

マップやループを使う方法より簡単だと思うのでぜひ使ってみてください。
Windows7 SP1でVagrantを使う

すんなりmacOSかLinux、Dockerを使えばいいのに、
あえてVagrantをWindows7 SP1で使ってみたよ！

VagrantとVirtual Boxのインストールは、みんないろいろ書いているので、省略。自分で探してね。

Windows7でvagrantを使うときに、一番苦労したのが
Powershellを使うことと、Powershellのバージョンアップ。

 - コマンドプロンプト（cmd.exe）ではなくて、パワーシェルを使う（powershell.exe）

Windows7のままだと、PowershellのVersionが2.0なのでVagrantでは使用できない。
Version3.0以上を推奨（される）。

###１．SP１かチェックする。
 - SP１をインストール

参考：https://support.microsoft.com/ja-jp/help/15090/windows-7-install-service-pack-1-sp1

###２．PowerShellのバージョンをチェックする。
 - $PSversionTable
   - で、「Version 2.0」と表示される

###３．.NET Framework 4.5あたりをインストール
 - PowerShellに使われているコアライブラリも一緒にUpdate

参考：https://qiita.com/busonx/items/acb54f852962426eb2ed

Windows7 SP1にPowerShell 3.0をインストールするには、
WMF(Windows Management Framework) をupdateする。

###４．PowerShellがVersion.3.0にアップデートされたか確認する。
 - $PSversionTable
   - で、「Version 3.0」と表示される

参考：https://qiita.com/busonx/items/9e88804e6b85432e827a


ここまでやってから、VagrantとVirtualBoxをインストールしよう！

※PowerShellのバージョンアップだけで、２～３時間かかるという不毛な作業なので覚悟しよう！

最近のVagrantは単純化されて、説明通りにコマンドを打てば
仮想マシンが起動する。。。。。わけねーｗ

おなじみのVagrantfileの編集

- 編集箇所１：
```config.vm.box = "base" を config.vm.box = "centos/7" に変更。```
※boxファイル名は、好きなboxを使えばいいんじゃないのかな？
Hash Corp.のBoxのBOX LIST
	⇒https://app.vagrantup.com/boxes/search


- 編集箇所２：
ネットワーク設定をコメントアウト
```config.vm.network "private_network", ip: "192.168.33.10"```
※プライベートネットワークが、一番便利。
  大勢が一斉に使うとIPが被るのでＤセグメントは、工夫しよう！
	  
- 編集箇所３：
母艦と仮想の共有フォルダの設定。これをやっておくと、ファイル転送無しで
ファイルの更新が可能だからやっておいた方がいいぞ。
```config.vm.synced_folder "./data", "/vagrant_data"```
※もとは"../data"になっているので、同じフォルダ内に収めるために、
		"./data"に変更する。もちろん別名でも可能。

-編集箇所４：
意外とみんなやらないのが最後の仮想マシンのメモリ設定。
```
config.vm.provider "virtualbox" do |vb|
  vb.memory = "1024"
end
```
これで一応、1024MBが確保できる。


###４．さあ、vagrant upを実行！

。。。。。。。エラーが出てるよぉ

```
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=1000,gid=1000 vagrant_data /vagrant_data

The error output from the command was:

mount: unknown filesystem type 'vboxsf'
```

共有フォルダがマウントできない。
Virtual Boxの仮想ディスクとのバージョンが異なるっぽい。

※上記のマウントコマンドをしても治りません。

参考：https://qiita.com/reflet/items/98fd548a6ef341f685bb

- 対策
「vagrant-vbguest」というプラグインをインストールして対応する。

で、
1.インストール
```$ vagrant plugin install vagrant-vbguest```
※すごく時間がかかるし、大量に関連するライブラリもインストールされる。

2. 実行
```$ vagrant vbguest```

3. 実行状況を確認
```
$ vagrant vbguest --status
GuestAdditions 5.0.16 running --- OK.
```
4.vagrantを再起動
```$ vagrant reload```

無事マウントでき、vagrantのゲストが利用可能に。

- しかし、Windows7 SP1のサポートが切れたけど、まだまだ使っているユーザが多いし、
面倒くさいね。

- そもそもWindows10でも面倒臭いので、仮想化環境をWindowsで作るのは手間がかかることかかること。

- やはりそこは、macOSが優れているんだよなぁ。。。
あとは、ちょっと前のPCにLinuxのデスクトップを入れて使うのが一番良いのかもｗ
旧コマンドから ip コマンドに移行

初めて使う人用にまとめました

# Ubuntu 14.04 あたりの操作　→ Ubuntu 18.04 あたりの操作



## ipconfig

 ↓ 

```

ip address
```


## ipconfig eth0:1 169.254.12.20

↓ 

```
ip address add 169.254.12.20 dev wlp3s0:1

```



## route

 ↓

```

 ip route
```

 ないし


```

 routel
```

## route add default gateway 192.168.0.1

 ↓

```

ip route add default via 192.168.0.1
```

## route del default
 ↓

```

 ip route del default
```


## ifup eth0 / ifdown eth0
↓

```
ip link set eth0 up / ip link set eth0 down

```
HerokuにPHPをSorceTreeからデプロイしてみよう

簡単に制御するための覚え書き
■HEROKUにアクセス
---
https://dashboard.heroku.com/apps
![2018-04-26.png](https://qiita-image-store.s3.amazonaws.com/0/122121/6a908fa8-2d6b-47d1-bfc4-f3b24d8c2b75.png)
[Create New App]を選択し、新しいAppを作成します。
（注意：ユーザ作成などは別なサイトを参考にしてください）
■App作成
---
![2018-04-26 (2).png](https://qiita-image-store.s3.amazonaws.com/0/122121/b08e1ee4-4105-2bc7-b7f1-b74c77052d36.png)
App Name のところに今回使用した名前を自分で決めて入力してください。
名前に問題なければ[Create app]のボタンが押せるようになります。
（注意：名前には大文字が使えないの注意してください）
■HEROKUのGitアクセス場所を知る
---
![2018-04-26 (3).png](https://qiita-image-store.s3.amazonaws.com/0/122121/0ac065fa-fab0-658f-065f-0413c822876c.png)
App作成が完了したあとに[Settings]を選択する事で、NameがApp作成時に指定した名前と同じものと確認できます。
（今回は 「test01php」 となっています）
そして[Heroku Git URL]という部分に書かれているのがHerokuのGitURLになりますので、それを覚えてください。
（今回は「https://git.heroku.com/test01php.git」になってます）
■SorceTreeにクーロン登録
---
SorceTreeを起動し[Clon]ボタンを選択してください。
以下のような画面になったら
![2018-04-26 (6).png](https://qiita-image-store.s3.amazonaws.com/0/122121/8d88c0d3-9662-d269-8711-43fb25c334ed.png)
Cloning is even easuer if you set up a remote accountの下の入力欄にHerokuのGitURLを書きます
（今回は「https://git.heroku.com/test01php.git」になってます）
その下の入力欄には、自分のローカルディレクトリを指定してください。
しばらくすると[クーロン]ボタンが押せるようになりますので、選択し作成してください。
■index.php作成
---
ローカルディレクトリに[index.php]を作成し中身は
```php:index.php
<?php
echo "Hello Heroku World!";
?>
```
な感じで作成し、コミット+プッシュをします。
![2018-04-26 (10).png](https://qiita-image-store.s3.amazonaws.com/0/122121/e2d43158-a1c0-8cc1-dd2b-464db4aa1324.png)

■PHPの動作確認
---
先ほど作成した、HEROKUの管理画面で[Domains and certificates]にかかれたURLがあります。
（今回は [https://test01php.herokuapp.com/]）
![2018-04-26 (3).png](https://qiita-image-store.s3.amazonaws.com/0/122121/8b1ffdf6-1e84-fb1a-a981-dbd7ba74bbfd.png)
実際このURLにアクセスしてみると

![2018-04-26 (11).png](https://qiita-image-store.s3.amazonaws.com/0/122121/3cff8ad8-11aa-f554-3201-ff58247f887d.png)

という画面が出て完成です。
XamarinでEntity Framework Coreを使ってAzureのSQL Databaseをいじる

# 概要
タイトル通り。

※ほぼ、[概要 - EF Core | Microsoft Docs](https://docs.microsoft.com/ja-jp/ef/core/)と同じです。

# Entity Frameworkってなに

> Ruby on RailsにおけるActiveRecord の .NETバージョン。O／Rマッパー。
[EntityFrameworkについて - Qiita](https://qiita.com/nakamurau1@github/items/eae0458039a09e6f0c34)

> EF Core はオブジェクト リレーショナル マッパー (O/RM) として機能します。これにより、.NET 開発者は .NET オブジェクトを使用してデータベースを操作できます。通常は開発者が記述する必要があるほとんどのデータ アクセス コードが不要になります。
[概要 - EF Core | Microsoft Docs](https://docs.microsoft.com/ja-jp/ef/core/)

アプリ上でSQLを生書きするなんて、気持ち悪いですよね。ナマガキはあたりますよ。

そんなときにすっきり書ける。

# 事前準備

## SQL Databaseの準備
Azure上でSQL Databaseを準備しましよう。

今回のサンプルで使うテーブルは以下の通り。

```sql
CREATE TABLE Users (
    id int PRIMARY KEY NOT NULL,
    mail text NOT NULL
)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/91558/a6fb1c00-d6df-3360-893c-3a22a665f349.png)


# プロジェクトの準備
Visual StudioでXamarin(今回はXamarin.Forms)の空のプロジェクトを作成します。

NuGetで以下を入れる。

- Microsoft.EntityFrameworkCore
- Microsoft.EntityFrameworkCore.SqlServer

# DBと同じようにクラスをつくる

以下のようにDBの構成に沿ったクラスをつくる。

フィールドの変数とかがDBと違うと正しく処理できないので、注意。

```cs:DBModel.cs
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Text;

namespace DBTest2
{
    class DBModel : DbContext
    {
        public DbSet<User> Users { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(@"{Azure Portalの該当SQLデータベースの接続文字列(ADO.NET(SQL認証))を入力}");
        }
    }
}
```

```cs:User.cs
using System;
using System.Collections.Generic;
using System.Text;

namespace DBTest2
{
    class User
    {
        public int id { get; set; }
        public string mail { get; set; }
    }
}
```

# データを追加して、データを取得してみる

とりあえずコンソールの出力を使って見てみます。

```cs:MainPage.xaml.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace DBTest2
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();

            using (var db = new DBModel())
            {
                db.Users.Add(new User { mail = "hoge@hoge.com", id = 1 });

                var count = db.SaveChanges();

                Debug.WriteLine("{0} records saved to database", count);

                foreach (var user in db.Users)
                {
                    Debug.WriteLine("{0}", user.mail);
                }
            }
        }
    }
}
```

# まとめ
以下を気を付ければできる。

- 必要なパッケージをちゃんといれる
- クラスのフィールドの変数をDBと同じ名前を使う
- ```optionsBuilder.UseSqlServer(@"{Azure Portalの該当SQLデータベースの接続文字列(ADO.NET(SQL認証))を入力}");```をちゃんと書く
Apacheのmod_proxyのコードを読んでみる(1)


# はじめに

コードを読もうと思ったキッカケは、mod_proxy_balancerでproxy先とWebSocket通信をするために、mod_rewriteを使ってURLを書き換えないと実現できなかったためです。

BalancerMemberディレクティブがhttpとwsの両方のプロトコルを同じproxy先で扱えるようになっていないため、なぜそのような振る舞いになるのか気になりました。

関連する実装で主要なところを一通り読んだので備忘録を兼ねて理解内容を記事にします。

時間が取れればmod_proxyだけでなく、mod_proxy_balancerやmod_proxy_wstunnelも整理して記事にする予定です。

我流で読み進めているので、理解内容に間違いなどありましたらご指摘ください。

## (参考情報)mod_proxy_balancerとmod_rewriteを使って実現する方法

https, wssの例ですが、http, wsに直して上手くいきました。

- https://stackoverflow.com/questions/37564692/apache-load-balance-tomcat-websocket

# コードリーディングの進め方

Apacheのモジュールのコードは初めて読むので、まずはApacheの全体のシーケンス(hookの呼ばれる順番など)を理解する必要があるだろうと考え、そこから始めました。

# 実行環境

- OS：CentOS 7.3
- Apache：v2.4.23

# 全体像の把握

## 全体シーケンス、各フェーズの役割

Apacheの処理の全体シーケンス、およびそれぞれのフェーズの役割については参考情報のページが理解するのに大変役立ちました。

私には、このページ以上に分かりやすく説明できないですし、Apacheモジュールのコードを読む、あるいはモジュール開発をする方は一読することをお勧めします。

フックの呼ばれる順番や、各フックの役割など大変参考になりました。

### 参考情報

- [フックから Apache の全体像を追う](http://d.hatena.ne.jp/dayflower/20081029/1225266220)


## mod_proxyに関わる各ファイルの説明

mod_proxyの実装は、私の環境では次の場所に格納されていました。

- httpd-2.4.23/modules/proxy

### 各ファイルの説明

| FileName  |Description |
|------------|:-------|
| mod_proxy.h   | mod_proxy及びその後段(mod_proxy_httpなど)を含めて必要な構造体などを定義したヘッダファイル|
| mod_proxy.c   | mod_proxyの本体の実装。詳細な処理は後段に委譲していたりする|
| mod_proxy_xxx.c   | mod_proxy本体から委譲される処理をする実装ファイル |

# 次回の予定

今回は大まかな全体像について説明したので、次回はmod_proxyの実装の理解内容に入っていこうと思っています。

- 次回： [Apacheのmod_proxyのコードを読んでみる(2)](https://qiita.com/tomluck/items/5483f28a73875f6c0454)
SourceTree のアカウント連携機能が悪さした時の対処法

# 現象
GitHub のとある organization で private なリポジトリを作成した時、 SourceTree 経由で clone ができない。なお、認証は SourceTree に GitHub のアカウントを連携させて行っており、先程の条件以外のリポジトリは clone できる状態である。

# 原因
SourceTree が何らかの悪さをしている？？
なぜ、 `organization で private なリポジトリ` という特定の条件でしか発生しないのかわからない。

# 解決策
SourceTree 経由の認証を削除し、標準の認証方法に切り替える。

1. `ssh-add -l` ssh-agent で登録された鍵を確認する。
2. `ssh-add -D` で鍵を全削除（複数ある場合は鍵を指定すること）
3. 対象の鍵が削除されていることを確認する
4. `ssh-keygen` で鍵を作成する
5. 鍵を GitHub に登録

```sh
> ssh-add -l
4096 SHA256:bz ... 9o  (RSA)

> ssh-add -D
All identities removed.

> ssh-add -l
The agent has no identities.

> cd ~/.ssh
> ssh-keygen
> cat id_rsa.pub
```

# 最後に
SourceTree のアカウント連携は使わないほうがいいかもしれません。
よく使う Git イディオムまとめ

# はじめに

開発をしていて使用することの多い Git のイディオムをまとめました。

この他に、[Learn Git Branching](https://learngitbranching.js.org/) というサイトで課題をこなしていくと、ブランチの概念がよく理解できます。

# イディオム

## すべての変更をステージする

```
$ git add .
```

## すべての変更をステージしてコミットする（1行コメントも入れる）

```
$ git commit -am "<comment>"
```

## ログを見る（差分付き）

```
$ git log -p
```

## ログを見る（変更したファイルのリスト付き）

```
$ git log --stat
```

`$ git log -p` の結果が長すぎるときに便利。

## 作業ディレクトリの差分を見る

```
$ git diff
```

## ステージングエリアの差分を見る

```
$ git diff --cached
```

## 変更したファイルを元に戻す

```
$ git co -- <file>
```

## 直近のコミットに現在のステージングエリアの変更を遡及的に加える（コメントも修正する）

```
$ git commit --amend
``` 
した後に、コメントを入力する。

## 作業ディレクトリとステージングエリアの変更をすべて取り消す

```
$ git reset --hard HEAD
```

## ひとつ前のコミットに戻る

```
$ git reset --hard HEAD^
```

## master ブランチにプッシュする

```
$ git push
```

## master 以外のブランチにプッシュする

```
$ git push origin <branch_name>
```

## 他のブランチを現在のブランチにマージして当該他のブランチを削除する



```
$ git branch`

* <current>
  <another>
```

```
$ git merge <another>
```

した後に、

```
$ git branch -d <another>
```

## 現在のブランチを他のブランチにリベースする

```
$ git branch

* <current>
  <another>
```

```
$ git rebase <another>
```

以上。
exiftoolを使って進んだ時間を戻す（動画の）

GoProで撮影した動画をPCに取り込むと、表示時間が9時間ズレる。
JPEGは問題ないが、MP4は9時間進んだ時間になるので時系列で動画と写真が並ばなくなる。

## 進んだ時間を戻す
exiftoolを使って動画ファイルのexif情報を書き換えちゃいましょう。
「UTC+9」の分だけ進んだ9時間をマイナスします。

```bash:exiftoolをインストール
brew install exiftool
```

```bash:exiftoolでexif書き換え
exiftool -overwrite_original_in_place -preserve -AllDates-=9 *.MP4
```

Windowsもexiftoolをインストールしてショートカットに同じような引数を与えればD&Dで動きそうだけど試してないので自己責任でどうぞ。
Geny motionのネットワークエラーは

Genymotionに、Instagramをインストールして、パソコンから投稿できるように試みていました。
一応Android４のバージョンでは設定していたのですが、今、作っているアプリの環境の事もあり、version６でも使えるようにしたかったのです。

久しぶりにネットで、Genymotionにgoogleplayをインストールする方法を確かめていました。

こちらの記事が、参考になると思います。
https://hep.eiz.jp/genymotion-google-play/

Genymotionを初めてダウンロードする人は、こちらの記事が参考になると思います。
https://mrkagerou.blogspot.jp/2017/08/genymotion-ver210-free.html

今日の午前中は、無事に使えていたのですが、午後になってバージョンアップの通知が出ました。
アップデートするためにファイルをダウンロードして、色々していました。
既に作っているバーチャルのドライブは互換性が無いので、アップデートするようにダイアログが出ました。
そのためアップデートしようとしたら、ログインできなくなってしまったのです。
![スクリーンショット 2018-04-26 17.08.15.png](https://qiita-image-store.s3.amazonaws.com/0/20977/017b1fdf-29ed-8a95-079b-a38499f30b23.png)

またハマってしまったかと思い、ネットで検索を始めました。
でも、結局原因を見つけることができませんでした。
何度かログインを試みていたら、ようやくログインできました。

どうやら本当に、ネットワークの問題だったようです。
fishでdigdagを使う(fish shellでdigdagを使って出るエラーの解消法)

# fishでdigdag使えない

普通にコマンド叩くと以下のようになります(MacOSX, 10.13.4)

```sh
% fish --version
fish, version 2.7.1

% digdag --version
Failed to execute process '/path/to/bin/digdag'. Reason:
exec: Exec format error
The file '/path/to/bin/digdag' is marked as an executable but could not be run by the operating system.
```

# 回避方法

## 1. `bash -c`

これはfishの解決方法とは言わないと思いますが・・・

```
%bash -c "digdag --version"
0.9.13
```

## 2. `java -jar /path/to/digdag`

こっちが正しい回避(?)方法です

```
%java -jar /Users/r.murakami/bin/digdag --version
0.9.13
```

~~ただjava実行してるだけ~~

## 参考

以下のdigdagのissueで案内されていました
https://github.com/treasure-data/digdag/issues/426#issuecomment-267206850
【初心者向け】Dockerの使い方が個人的に腑に落ちた。

pythonの環境を構築するために今まではdockerではなくanacondaの`conda create`コマンドを利用していた。
## 今までconda createで特に不自由してなかったが…
周りに`conda create`使っている人が少なかった。うちのラボだけなのか？と思ってしまった。
最近dockerが流行っているということで習得しようと考えた。

## 腑に落ちなかった点
conda createで十分じゃね？という感があった。
最近railsもやっているので言語依存ではない仮想環境について知りたかったので勉強することにした。

# 勘違いしていた点
## そもそもの使い方
[Docker導入のための、コンテナの利点を解説した説得資料](https://qiita.com/niisan-tokyo/items/88a53a1b4aa7ad60723e)、がめちゃめちゃわかりやすい。
condaしか使って来なかったのでそもそも環境自体をupdateして(別のimageとして)保存していくというフローの想像がつかなかった。
バージョンの異なるimageを用意して置くことでロールバックなどが容易にできるわけですね。

```
Dockerfile -(build)-> image -(run)-> container -(commit)-> image_2 -(run)-> container_2 ->...
```
imageに落とし込んだ段階でpushすれば共有が可能です。

## imageにcommitするのは環境だけではないということ
conda思想に侵されていたので、環境設定のみを記述するものだと勘違いしていた。
imageにcommitするのは環境だけではなくcontainer内のコードも含まれる。
よって、コードを書き換えつつ環境も書き換えつつ丸ごと保存できる。

## Dockerfileで共有する必要はないということ
完璧なDockerfileを用意して共有するのが普通なのかと思っていた。
今までここに記述したものがうまく動かず挫折していた。
先述の通り、docker imageをcommitして管理し、それをdockerhub上で管理すれば良い。サイズが大きくて重いんですけどね。
Dockerfileはベースとなる設定を書いておけば入れ忘れなどがなくなって便利なのは違いないです。

## Dockerfileの解釈
```docker
FROM python:3

RUN pip install pandas
```
今までFROMにはcentosやubuntuしか入れられないと思っていたが、ここは公式イメージを記入する部分であって、この例で言えばpython3の動くLinux環境(デフォでpipが使える)をベースにしているという意味だったのですね。自分がこれをもとにbuildした時はapt-getが使えてyumは使えませんでした。

```
$ cat /proc/version
Linux version 4.9.87-linuxkit-aufs (root@95fa5ec30613) (gcc version 6.4.0 (Alpine 6.4.0) ) #1 SMP Wed Mar 14 15:12:16 UTC 2018
```
# 個人的tips
## attachとexecの違い
[こちらの説明](https://qiita.com/RyoMa_0923/items/9b5d2c4a97205692a560)がとてもわかりやすいです。

# あとがき
dockerはコードも内部的に管理できるのでconda createよりも安全ですね。
ラボの先人たちの研究を引き継ぎたい後輩が現れた時に動く環境があることが非常に大事ですし、研究自体がラボのリソースなので残すメリットは非常に大きいです。早く導入しないとなぁ。
Project Euler 67「最大経路の和 その2」

Problem64～66は分からん過ぎて諦めた。

# Problem 67 「最大経路の和 その2」

以下の三角形の頂点から下まで移動するとき, その数値の合計の最大値は23になる.

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184817/16ec66ad-9a70-022d-592c-5fc2b726ff4a.png)
この例では 3 + 7 + 4 + 9 = 23

100列の三角形を含んでいる15Kのテキストファイル [triangle.txt](https://projecteuler.net/project/resources/p067_triangle.txt) の上から下まで最大合計を見つけよ.

注：これは, Problem 18のずっと難しいバージョンです. 
全部で299 通りの組み合わせがあるので, この問題を解決するためにすべてのルートをためすことは可能でありません！
あなたが毎秒1兆本の(1012)ルートをチェックすることができたとしても, 全てをチェックするために200億年以上かかるでしょう. 
解決するための効率的なアルゴリズムがあります. ;o)

```python
def hoge(path):
    numbers = open(path).read().strip().split('\n')
    numbers = [ x.split() for x in numbers ]
    numbers = [ [ int(m) for m in n ] for n in numbers ]
    numbers.reverse()
    for i, row in enumerate(numbers):
        if i + 1 == len(numbers):
            break
        row2 = numbers[i+1]
        numbers[i+1] = [ n + max(row[j:j+2]) for j, n in enumerate(row2) ]
    return numbers[-1][0]

print(hoge('p067_triangle.txt'))
```

Problem 18で書いたコードをほぼそのまんま流用しただけ。

三角形の下から上へ処理していくイメージ。
i行目（row）とi+1行目（row2）を取得し、i+1行目の各値に対して隣接するi行目の値の大きい方を加算していくと、最終的に頂点の値が最大値になる寸法。
インフラ屋さんの仕事

僕はインフラ屋さんじゃないんですが、自分でどこかでメモった情報が有用そうだったので記載しておきます。
変なところあったらご指摘下さい...

#`bootstrap`：インスタンスの起動
仮想環境の作成や立ち上げを行う。
クラウドだと、`AWS`や`GCP`のインスタンスや、
仮想環境だと、`VMware`や`VirtualBox`、
ツールだと、`Vagrant`や`Docker`などが該当する。

#`provisioning`：必要なソフトウェアのインストール
各種言語や、その他必要なツール群の初期インストール。
(ex: Pythonだと`pyenv`や、Rubyだと`rbenv`などを入れたり、ネットワーク系コマンドが使えるように`net-tools`を入れたり...)


#`configuration`：各種設定の管理
サーバの設定やインストール物の管理などを行う。
ツールだと、`Chef`や`Ansible`などが該当する。

#`clastering`：サーバのグループ化
クラスタリング。
可用性の向上や、処理速度の向上を目的とする。

クラスタリングには大きく分けて２種類存在する。

- HAクラスタ
	- 高可用を目的としている
	- 種類
		- フェールオーバー型
			- アクティブとスタンバイと用意しておき、アクティブが死んだら、スタンバイに切り替える構成
		- 負荷分散型
			- 1号機と2号機と用意しておき、ロードバランサによって処理を振り分ける構成(処理が集中しないので処理速度の向上にも繋がる)
- HPCクラスタ
	- 処理速度の向上を目的としている
	- ３つのノードに分かれている
		- ヘッダノード
			- クラスタ全体の管理や、クライアントとのやりとりを行う
		- 計算ノード
			- 計算処理を行う。複数用意し並行処理をする事で、処理速度の向上を図る
		- データノード
			- データベースとのやりとりを行う

ref: http://www.linuxacademy.ne.jp/lablog/infrastructure/308/

#`monitering`：監視・通知
負荷状況や不正アクセスなどの監視や通知を行う。
ツールだと、`Zabbix`や`Cacti`などが該当する。

#`operation`：定型運用作業やオーケストレーション
よく分からなかった...
上記の`provisioning`や`configuration`を自動化したり、障害発生時に担当者に連絡したりする事...??

#`deployment`：更新の配布やアプリケーションの配布
パッチ当てや、アプリケーションのデプロイなどを行う。
ツールだと、`Jenkins`などが該当する。

----

結構どころではないざっくりさで申し訳ないです...
変なところあったらご指摘下さい...(2回目)
AWS チュートリアルを順番にこなす

# 対象
AWS について学びたいけどどこから手を付ければいいの？という人。

# 何？
「この順番でチュートリアルを進めていけばいい感じに理解していくことができますよ」というインデックスです。

# 本編

## 1. IAM : 認証
AWS アカウントで色々なことをするための個別アカウント的なもの。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users_create.html#id_users_create_console

## 2. EC2 : 仮想サーバー
言わずもがなの仮想サーバー。
https://aws.amazon.com/jp/getting-started/tutorials/launch-a-virtual-machine/

## 3. VPC
自分のAWSアカウント専用の仮想ネットワーク空間
サブネット、セキュリティグループについてはちゃんと理解するべし。
ここを理解できると AWS を触る際の不安の 6 割は無くなる気がする(個人の感想)。
https://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/GettingStartedGuide/getting-started-ipv4.html

## 4. RDS
リレーショナルデータベース。
↓は MySQL でやってみる例。
https://aws.amazon.com/jp/getting-started/tutorials/create-mysql-db/

## 5. S3：ストレージ
ストレージ。データを置くことができる。
https://aws.amazon.com/jp/getting-started/tutorials/backup-files-to-amazon-s3/

## 6. DynamoDB：NoSQLデータベース
AWSのみで利用な NoSQL サービス
https://aws.amazon.com/jp/getting-started/tutorials/create-nosql-table/

## 7. ElastiCache：インメモリキャッシュ(Redis, Memcached)
インメモリDB.Redis と Memchached から選べる。
https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/UserGuide/GettingStarted.CreateCluster.html

↑のチュートリアルで作成後は、EC2に ssh 接続し、そこから↓のように接続してみると良い。

```sh
# telnetのインストール
$ sudo yum install -y telnet

# クラスターへ接続
$ telnet <エンドポイント> 6379
Trying 172.31.1.93...
Connected to test.ywlovm.0001.apne1.cache.amazonaws.com.
Escape character is '^]'.
set key1 hoge
+OK
get key1
hoge
quit
+OK
Connection closed by foreign host.
```

## 8. SQS：メッセージキュー
メッセージキューイングサービス
https://aws.amazon.com/jp/getting-started/tutorials/send-messages-distributed-applications/

なおメッセージの受信については、私は↓を参考に行った。
https://qiita.com/tcsh/items/7781fe238df82fc030d2


## 9. ELB : ロードバランサー
負荷分散するためのもの。
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/elb-getting-started.html

# これでもさっぱりわからん！という方は
基礎的なネットワークの知識をつけるのが先かもしれません。
{基本, 応用}情報の参考書を読んだり、マスタリングTCP/IP を読んだりするのがおすすめです。
個人的にはド初心者だと `3. VPC` が鬼門な気がします。
Djangoのフォームのテストではまった

Python 3.5.2
Django 2.0

Formのテストではまったので、忘れないうちにメモ。

---

以下のようなモデルとフォームがある

```python:models.py
class Bar(models.Model):
    baz = models.IntegerField()

class Foo(models.Model):
    bar = models.ForeignKey(Bar, on_delete=models.CASCADE)

class FooForm(forms.ModelForm):
    class Meta:
        model = Foo
        fields = '__all__'
```

以下のテストを実行すると失敗する。なぜか。

````python:tests.py
def test_form_validateion(self):
    bar = Bar.objects.create(baz=0)
    form = FooForm({'bar':bar},instance=bar)
    self.assertTrue(form.is_valid())

```

FooFormにbarの実体ではなくプライマリーキーを渡すとうまくいく

```
FooForm({'bar':bar.pk},instance=bar)
```
【Python】ビット演算で全探索

## はじめに
この記事は初心者競プロerが書いています。
もし間違っている所があれば、編集リクエスト又はコメントをお願いします。

## 想定読者
- ビット演算の雰囲気は分かるが、実装が分からい人

## 前提条件
- 論理積が何か分かる
- 10進数から2進数への変換が出来る


## ビット全探索とは
bit 全探索とは、n個の要素からなる集合 {0,1,・・・・,n-1} の部分集合をすべて調べ上げる手法のことです。

000(0)~111(8)を表示していきます。

```sample.py
#出力する値を入れる
ans = []

#左に3ビットシフト
for i in range(1 << 3):
    tmp = ""
    for j in range(3):
        # j番目が1か判定する
        if i & (1 << j):
            tmp += "1"
        else:
            tmp += "0"
    ans.append(tmp)
print(ans)


>>> ['000', '100', '010', '110', '001', '101', '011', '111']
```

これだけだとイマイチピンとこないので、Atcoderの問題を例に使い方を見ていきましょう。

## A - 高橋君とお肉（ABC029）

[こちら](https://atcoder.jp/contests/arc029/tasks/arc029_1)の問題を使用します。

### 考察
肉をどちらの機械で焼くのかを全て試します。
どういうパターンがあるのかを確認しましょう。

上の数字が肉の番号です。
〇が肉機器1で焼く、×が肉機器2で焼くことを表しています。
N=4の時は、全部で16パターン(2^4)あります。
![スクリーンショット 2022-08-27 164434.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169545/fb6ae2a1-77ca-2ad7-9819-d3785891bc9a.png)

### 実装


```arc_a.py
n = int(input())
t = [int(input()) for _ in range(n)]

ans = []
for bit in range(1 << n):
    # 一つ目の肉焼き器
    x = 0
    # 二つ目の肉焼き器
    y = 0
    for i in range(n):
        #一つ目の肉焼き器で焼く
        if bit & (1 << i):
            x += t[i]
        #二つ目の肉焼き器で焼く
        else:
            y += t[i]
    ans.append(max(x, y))
print(min(ans))

```
zshrcでsourceしたら&でエラーが出た・・・

# 概要

.vimrcで以下のコマンドを実行したらなんか以下のようなエラーが出たので調べてみた

```zsh:zsh
$ source .vimrc
/Users/oki.suguru/.vimrc:1: parse error near `&'
```

# そもそも対応していない

要約すると

- zshのsourceは.vimrcに対応していない
- .vimrcはvimを起動するたびに勝手に読むから、sourceしなくても良い。

って事らしい。なんだそれ・・・

# だけどそれってなんでだ？

よくわからん。そのうち調べる。