OmniAICreator/Qiita-1.07M huggingface dataset:
WAA02

##データ解析基礎論 a weekly assignment B04
####WAA02
[課題内容](http://peach.l.chiba-u.ac.jp/course_folder/waa02.pdf)

~~~R
# データのinput
dat <- read.csv("http://peach.l.chiba-u.ac.jp/course_folder/waa02.csv")
head(dat)

# figure1
par(mfrow=c(1,1))
plot(dat$condition,dat$blood.pressure,col = c("skyblue","moccasin","chocolate1"),
     ylab = "blood pressure",main ="Effect of medicine on Blood pressure")
~~~
![RplotWAA02.1.png](https://qiita-image-store.s3.amazonaws.com/0/210627/eeb8a61d-b112-003c-b5d9-2bd35937640d.png)


~~~R
# figure2
install.packages("gplots")
library(gplots)
means <- tapply(dat$blood.pressure, dat$condition, mean)
sds <- tapply(dat$blood.pressure, dat$condition, sd)
ns <- tapply(dat$blood.pressure, dat$condition, length)
sems = sds/sqrt(ns)  #standard error (of the mean)
barplot2(means, plot.ci=T,
         ci.l = means - sems,
         ci.u = means + sems,
         ylim = c(60,160),
         names.arg = c("Control","Medicine A","Mecidine B"),
         col = c("skyblue","moccasin","chocolate1"),
         xpd = F,
         ylab = "blood pressure",
         xlab = "condition")
~~~
![RplotWAA02.2.png](https://qiita-image-store.s3.amazonaws.com/0/210627/3d014e64-89f6-daed-a019-71df82e4bd41.png)

~~~R
# figure3
![RplotWAA02.2](/Users/kaede/Pictures/RplotWAA02.2.png)# Densityのみの表示
plot(dens.control,col = 'blue', xlim = c(60,160),ylim = c(0,0.03),
     main ="Effect of medicine on Blood pressure",lwd = 2,
     xlab = "blood pressure",ylab = 'density')
lines(dens.medicineA,col = 'navajowhite2',lwd = 2)
lines(dens.medicineB,col = 'chocolate',lwd = 2)
legend("topleft", c('control','medicineA','medicineB'), 
       col=c('blue','navajowhite2','chocolate'),cex = 1,lwd = 2)
~~~
![Rplot04WAA02.3.png](https://qiita-image-store.s3.amazonaws.com/0/210627/b7274528-15f6-8428-97b0-911e7bc66234.png)



~~~R
# figure4
par(mfrow=c(3,1))  #3,1に分割
# control plot
control <- dat[dat$condition == "control",]
hist(control$blood.pressure,col = "skyblue",
     ylab = "blood pressure",main ="Effect of medicine on Blood pressure",
     xlab = "",xlim = c(60,160),probability = T)
dens.control <- density(control$blood.pressure)
lines(dens.control,col = "blue") 
text(70, 0.020, 'Control',cex=2,col = "black")

# medicineA plot
medicineA <- dat[dat$condition == "medicine A",]
hist(medicineA$blood.pressure,col = "moccasin",
     ylab = "blood pressure",main ="Effect of medicine on Blood pressure",
     xlab = "",xlim = c(60,160),probability = T)
dens.medicineA <- density(medicineA$blood.pressure)
lines(dens.medicineA,col = "navajowhite2")
text(70, 0.025, 'Medicine A',cex=2,col = "black")

# medicineB plot
medicineB <- dat[dat$condition == "medicine B",]
hist(medicineB$blood.pressure,col = "chocolate1",
     ylab = "blood pressure",main ="Effect of medicine on Blood pressure",
     xlab = "",xlim = c(60,160),probability = T)
dens.medicineB <- density(medicineB$blood.pressure)
lines(dens.medicineB,col = "chocolate")
text(70, 0.025, 'Medicine B',cex=2,col = "black")
~~~
![Rplot04WAA02.4.png](https://qiita-image-store.s3.amazonaws.com/0/210627/c15a9f79-2bb8-92a2-928e-707f7fb099bd.png)
RAD Studio, C++Builder, Delphi の ISO ダウンロードサイトのまとめ (2007以降)

cc.embarcadero.com 上の RAD Studio, C++Builder, Delphi バージョン 2007 以降 の ISO ダウンロード先のまとめです。インストールの際はシリアル番号が必要です。製品ライセンスを購入して過去バージョンを入手・インストールする場合は [RAD Studio, C++Builder, Delphi 旧バージョンライセンスの入手手順](https://qiita.com/CYonezawa/items/7e371c03ed44ea554ed2) の方法でシリアル番号を入手してください。

XE8 以降は Update / Release バージョンを使用するには、アップデートサブスクリプションの加入が必要です。ご注意ください。

またダウンロードのサイズが大きいので、ダウンロード後はハッシュ値を確認するのを忘れずに。

###10.3 Rio
- [RAD Studio / C++Builder / Delphi 10.3 Rio Release 3](https://cc.embarcadero.com/item/30896)　(アップデートサブスクリプションが有効の場合のみ使用可能)
- [RAD Studio / C++Builder / Delphi 10.3 Rio Release 2](https://cc.embarcadero.com/item/30882)　(アップデートサブスクリプションが有効の場合のみ使用可能)
- [RAD Studio / C++Builder / Delphi 10.3 Rio Release 1](https://cc.embarcadero.com/item/30876)　(アップデートサブスクリプションが有効の場合のみ使用可能)
- [RAD Studio / C++Builder / Delphi 10.3 Rio](https://cc.embarcadero.com/item/30865)

###10.2 Tokyo
-  [RAD Studio / C++Builder / Delphi 10.2 Tokyo Release 3 Inline ISO] (https://cc.embarcadero.com/item/30842)　Release 3 以降に公開されたパッチが含まれているもの (アップデートサブスクリプションが有効の場合のみ使用可能)
-  [RAD Studio / C++Builder / Delphi 10.2 Tokyo Release 3](https://cc.embarcadero.com/item/30823)　(アップデートサブスクリプションが有効の場合のみ使用可能)
-  [RAD Studio / C++Builder / Delphi 10.2 Tokyo Release 2](https://cc.embarcadero.com/item/30809)　(アップデートサブスクリプションが有効の場合のみ使用可能)
-  [RAD Studio / C++Builder / Delphi 10.2 Tokyo Release 1](http://cc.embarcadero.com/Item/30786)　(アップデートサブスクリプションが有効の場合のみ使用可能)
-  [RAD Studio / C++Builder / Delphi 10.2 Tokyo](http://cc.embarcadero.com/item/30725)

###10.1 Berlin
- [RAD Studio / C++Builder / Delphi 10.1 Berlin Update 2](http://cc.embarcadero.com/Item/30653) (アップデートサブスクリプションが有効の場合のみ使用可能)
- [RAD Studio / C++Builder / Delphi 10.1 Berlin Update 1](http://cc.embarcadero.com/Item/30614) (アップデートサブスクリプションが有効の場合のみ使用可能)
- [RAD Studio / C++Builder / Delphi 10.1 Berlin](http://cc.embarcadero.com/Item/30514) 

###10 Seattle
- [RAD Studio / C++Builder / Delphi 10 Seattle Update 1](http://cc.embarcadero.com/Item/30446) (アップデートサブスクリプションが有効の場合のみ使用可能)
- [RAD Studio / C++Builder / Delphi 10 Seattle](http://cc.embarcadero.com/Item/30352)

###XE8
- [RAD Studio / C++Builder / Delphi XE8 Update 1](http://cc.embarcadero.com/Item/30285) (アップデートサブスクリプションが有効の場合のみ使用可能)
- [RAD Studio / C++Builder / Delphi XE8](http://cc.embarcadero.com/Item/30172)

###XE7 - 2007
- [RAD Studio / C++Builder / Delphi XE7](http://cc.embarcadero.com/Item/29934)
- [RAD Studio / C++Builder / Delphi XE6](http://cc.embarcadero.com/Item/29821)
- [RAD Studio / C++Builder / Delphi XE5](http://cc.embarcadero.com/item/29544)
- [RAD Studio / C++Builder / Delphi XE4](http://cc.embarcadero.com/item/29392)
- [RAD Studio / C++Builder / Delphi XE3](http://cc.embarcadero.com/item/28985)
- [RAD Studio / C++Builder / Delphi XE2](http://cc.embarcadero.com/item/28479)
- [RAD Studio / C++Builder / Delphi XE](http://cc.embarcadero.com/Item/27985)
- [RAD Studio / C++Builder / Delphi 2010](http://cc.embarcadero.com/item/27192)
- [RAD Studio / C++Builder / Delphi 2009](http://cc.embarcadero.com/item/26308)
- [RAD Studio / C++Builder / Delphi 2007](http://cc.embarcadero.com/item/25015)
Visual Studio Tools for AI

Visual Studio Tools for AIは、Deep Learning / AIソリューションを構築、テスト、および展開するための拡張機能です。これはAzure Machine Learningとシームレスに統合されており、異なるコンピューティングターゲットに透過的にデータ準備やモデルトレーニングジョブを提出するなど、堅牢な実験機能を提供します。さらに、カスタムメトリックと実行履歴の追跡をサポートし、データサイエンスの再現性と監査を可能にします。エンタープライズ対応のコラボレーションにより、他の人とプロジェクトで安全に作業できます。

#サポートされているVisual Studio

Visual Studio Tools for AIは、Visual Studio 2017および2015の両方で動作します。
コミュニティ、プロフェッショナルおよびエンタープライズエディションがサポートされています。

この拡張機能は、Visual Studio Marketplace上で2つのVS 2017およびVS 2015パッケージでホストされています。

https://marketplace.visualstudio.com/items?itemName=ms-toolsai.vstoolsai-vs2017
Ansible で yum module が動かなくなった


特定のホストだけ yum module が動かなくなってて困ってた

```bash:local
$ ansible HOST002 -i hosts/hosts-dir/ -m yum -a "name=vim" -C
HOST002 | FAILED! => {
    "changed": false,
    "failed": true,
    "msg": "python2 bindings for rpm are needed for this module. python2 yum module is needed for this  module"
}
```

調べても「yum ないんじゃね？（on Ubuntu）」ばかりで途方にくれていたが、結局 pyenv で入れた python を指定してしまっていただけだった。

```bash:local
$ ansible remote-servers -i hosts/hosts-dir/ -m shell -b -a "python --version"
HOST003 | SUCCESS | rc=0 >>　←動いてるほう
Python 2.6.6

HOST002 | SUCCESS | rc=0 >>　←動かないほう
Python 2.7.11

```


過去の自分がヤンチャした形跡


```bash:remote
$ sudo ls -l /usr/bin/python
lrwxrwxrwx 1 root root 29  9月 21 12:15 2017 /usr/bin/python -> /usr/local/pyenv/shims/python
```


これをシステムデフォルトの python (python 2.6.6) に戻したら動いた

```bash:remote
$ sudo cp /usr/bin/python2.6 /usr/bin/python
```

```bash:local
$ ansible HOST002 -i hosts/hosts-dir/ -m yum -a "name=vim" -C
HOST002 | SUCCESS => {
    "changed": false,
    "msg": "",
    "rc": 0,
    "results": [
        "vim-enhanced-2:7.2.411-1.8.el6.x86_64 providing vim is already installed"
    ]
}
```

多分 pyenv で入れた python でも yum に繋がるようにできれば解決するんだろうけど、どうすればいいのかはよく分からないままだった……
それか Ansible で起動される python のパスを直接指定できれば解決するか
Markdown記法でコード挿入時に、拡張子がないファイル名を反映させる方法

地味にわからなかったので、記事書いてみました


#Markdownコード記述の基本的な使い方
バッククォート(`)三つを記述した行を間に挟むことでコードを挿入出来る


\```（任意）ここにコード元のファイル名を書く
ここにコードを書く

\```

　↓　のようになる

```ファイル名.rb
ここにコードを書く
```

#拡張子があるファイルのコードの場合

``` application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
end
```

ファイル名の拡張子を認識し、色を自動的に変えてくれる

#拡張子がないファイルのコードの場合

しかし、Gemfileなど拡張子名がない場合、ファイル名が出てこない

\```Gemfile
gem "rails", "~> 6.1.4.1"

\```
　↓

```Gemfile
gem "rails", "~> 6.1.4.1"
```


ファイル名の前に「:」を入れてあげると、反映してくれる

\```:Gemfile
gem "rails", "~> 6.1.4.1"

\```
　↓

```:Gemfile
gem "rails", "~> 6.1.4.1"
```
javascript 学習メモ

clickされたlistNumが一番上のListNumに移動する

```javascript
  var languageList = document.getElementById('id取得');
  var langElement = languageList.querySelectorAll('element取得');

  var path = location.pathname.replace("/1111111/","");
//replaceでurlの変えていますが、配列に変えて取得したい文字列を取得するのも可能です。
  var Add = path.replace("/","");

  var play = function(){
    $("body").addClass(Add);
    i = "";
    for(var i = 0;i < langElement.length; i++){
      elementsClass = langElement[i].getAttribute('class');
      element = langElement[i];

      if(Add === elementsClass){
        text = element.textContent;
        mainTitle.innerHTML = "<p class='" + elementsClass + "'>" + text +"</p>";
        mainTitle.appendChild(element);
      }
    }
    mainTitle.removeChild(mainTitle.lastChild);
  }
  play();

````
Chrome Headless - 1

Phantom.js seems dead, with a lot of holes not filled.
I have to find a replacement, so I am trying Chrome Headless now.

# Install Google Chrome on Debian
Note, the following commands work only in Debian 8. 
Debian 7 is not supported as a result of test.

````bash
# https://askubuntu.com/questions/79280/how-to-install-chrome-browser-properly-via-command-line
sudo apt-get install libxss1 libappindicator1 libindicator7
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i google-chrome*.deb  
```

Might show "errors", fixed by next line. 

```bash
sudo apt-get install -f
````

Then run the dpkg again.

# Try to Run

````bash
google-chrome --headless --disable-gpu --hide-scrollbars --screenshot https://sinri.cc
# [1116/113036.776865:INFO:headless_shell.cc(503)] Written to file screenshot.png.
````
Go で型を抽象的に扱うには

# はじめに

* GAE/Go + Datastore 向けの汎用レポジトリライブラリみたいなものを作ってみて Go で型を抽象的に扱うコードをいくらか書いたのでまとめてみる。

# Go で型を抽象的に扱うには

* Go では reflect と interface を使って型を抽象的に扱うことができる
* Go で型を抽象的に扱う時に出てくる登場人物としては、抽象的に値を扱うことができる `reflect.Value` と抽象的に型を扱うことができる `reflect.Type` と任意の値を扱うことができる `interface{}` がある
* ここで Go の値（便宜的に `Go value` と表記）とそれぞれの登場人物の相関図とそれぞれの操作を表すコードを記載する

![golang-reflect.jpg](https://qiita-image-store.s3.amazonaws.com/0/17778/f49bbe2d-cb28-cd93-0ed2-b7945488678b.jpeg)

```go
package main

import (
	"reflect"
	"log"
)

func main() {
	// 1. Go value から reflect.Value へ変換する
	gv := 1
	rv := reflect.ValueOf(gv)
	p("ValueOf.", rv)

	// 2. reflect.Value から Go value へ変換する
	//    Int, Float, String など組み込みの型のみ関数が用意されている
	gv2 := rv.Int()
	p("Int.", gv2)

	// 3. reflect.Value から interface{} へ変換する
	i := rv.Interface()
	p("interface{}.", i)

	// 4. interface{} から Go value へ変換する
	//    Type Assertion を使う
	if gv, ok := i.(int); ok {
		p("Go value.", gv)
	}

	// 5. Go value から reflect.Type を取得する
	rt := reflect.TypeOf(gv)
	p("Type.", rt)

	// 6. reflect.Value から reflect.Type を取得する
	rt = rv.Type()
	p("Type.", rt)

	// 7. reflect.Type から任意の型の reflect.Value を作成する
	// []int の reflect.Type を作成する
	srt := reflect.SliceOf(rt)
	// []int の reflect.Value を作成する
	srv := reflect.MakeSlice(srt, 0, 0)
	// []int の reflect.Value に append する
	srv = reflect.Append(srv, reflect.ValueOf(100), reflect.ValueOf(200))
	// reflect.Value を interface{} に変換して Go value に変換する
	if s, ok := srv.Interface().([]int); ok {
		p("MakeSlice.", s)
	}
}

func p(prefix string, val interface{}) {
	rt := reflect.TypeOf(val)
	log.Printf(prefix + "\nvalue: %+v, type: %+v, kind: %+v", val, rt, rt.Kind())
}
```

* Play ground での実行はこちら https://play.golang.org/p/akK9ho9swL

# 型を抽象的に扱うといえば Generics

* Go には Generics はないが Generics がなくても何とかなる部分とやっぱりあると嬉しい部分も見えてきた。

## Generics がなくても何とかなる部分

* interface{} を使えば任意の値を扱うことができる。
* reflect.Type を使えば型のメタデータにアクセスして型に合わせた柔軟な処理を記述できる。

## やっぱり Generics があると嬉しい部分

* interface{} から Go value への変換（上記の図の 4 の部分）でどうしても具体的な型が必要になるのでここだけ抽象化できずにライブラリなんかにまとめることができない。
* reflect.Type で型チェックをする場合、実行時に行われるため型安全ではなくなる。

### 型アサーションが抽象化できない問題への対応

* 諦めて型アサーションする
* 型アサーションをするラッパーを都度実装する

### 型チェックが実行時に行われる問題への対応

* 型安全にするなら[ダックタイピング](https://mattn.kaoriya.net/software/lang/go/20170309201506.htm)で
  * インターフェイスに合わせた実装が必要なので気軽には扱えない
  * ライブラリで扱うならありかも

## Generics は必要か？

* あると便利で、なくてもある程度はできるのがわかってきた。
* ダックタイピングを利用すれば型安全にある程度のことはできる。
* しかし気軽に利用できるような何かがあると嬉しいので、この部分が Go は筋力が必要と言われる部分。
* 型アサーションが reflect.Type でできるとか reflect 内で Go value へのキャストまでできるようになれば、個人的には十分な気がしている。
javascript URLからクエリを取得し、クラスとして扱ったり、イベント時に使用する

URLからクエリを取得し、クラスとして扱ったり、イベント時に使用する

```javascript
var query = window.location.search.replace("?page=" , "");

var advName = [
  {
    "name" : "1111111"
  },
  {
    "name" : "2222222"
  },
  {
    "name" : "333333333"
  },
  {
    "name" : "444444444"
  },
  {
    "name" : "5555555555"
  }
];

var advTitle = function(){
  situation = "page-" + query;
	val = $("#" + situation).index(".advBox li");//jQuery使用
	document.title = advName[val].name;
}
advTitle();

window.onload = function(){
  $(advBg).addClass(situation);//jQuery使用
  val = $(this).index(".advBox li");//jQuery使用
    var charaClick = function(){
       i = "";
       for(var i = 0; i < Selector.length; i++){
         Selector[i].addEventListener('click', function(e) {
           val = $(this).index(".advBox li");//jQuery使用
           getAttr = this.getAttribute('id');
           advBg.setAttribute("class", getAttr);
           replace = getAttr.replace("page-" , "");
         },false);
       }
     }
     charaClick();
};

```
Rails Tutorial (v.5.1) ハマりポイント 1章 1.3.1項

#この記事はなに
Rails Tutorial (v.5.1) をテキスト通りに進めていた中で、ハマったところの対処メモです。2017.11.16時点。
開発環境はcloud9。
今チュートリアルをやっているくらいなので、Rails初心者です。

#1.3.1 Bundler
##先に結論
bundle update 大事。
##ハマったポイント
Gemfileを指示通りに修正し、bundle install したところ、以下のエラーが発生。

```ruby:console
user:~/workspace/hello_app (master) $ bundle install
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
Fetching gem metadata from https://rubygems.org/.........
Fetching gem metadata from https://rubygems.org/.
You have requested:
  listen = 3.0.8

The bundle currently has listen locked at 3.1.5.
Try running `bundle update listen`

If you are updating multiple gems in your Gemfile at once,
try passing them all to `bundle update`

```

listen locked at 3.1.5 と記載されているので、それに従ってGemfileを修正。

```ruby:Gemfile
  gem 'listen', '3.1.5'
```

そして、再度 bundle install実行。

```ruby:console
user:~/workspace/hello_app (master) $ bundle install
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
Fetching gem metadata from https://rubygems.org/.........
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies...
Bundler could not find compatible versions for gem "activesupport":
  In snapshot (Gemfile.lock):
    activesupport (= 5.1.4)

  In Gemfile:
    rails (= 5.1.2) was resolved to 5.1.2, which depends on
      activesupport (= 5.1.2)

    coffee-rails (= 4.2.2) was resolved to 4.2.2, which depends on
      railties (>= 4.0.0) was resolved to 5.1.4, which depends on
        activesupport (= 5.1.4)

Running `bundle update` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.
```

listenに関するエラーはなくなりましたが、activesupportとrailtiesのバージョンが、依存関係でエラーに。
ここもGemfileを直します、、、と思いましたが、依存関係がコンフリクトしてますね。
rails 5.1.2 -> active support 5.1.2
coffee-rails 4.2.2 -> railties 5.1.4 -> active support 5.1.4

どっちのactivesupportを使えばいいんだ。

よく見ると、エラーメッセージに Running `bundle update` (中略) may resolve the conflict. と書いてあります。

実際に試したところ、うまく解決できました。

```ruby:console
user:~/workspace/hello_app (master) $ bundle update
(中略)
Bundle updated!
user:~/workspace/hello_app (master) $ bundle install
(中略)
Bundle complete! 16 Gemfile dependencies, 70 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
```
localhostでMySQLが起動しない（Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)）

どうやら調べてみると、この事例が結構多いようなので、自分の事例を共有。

ある日突然、アプリケーションをlocalhostで開くとエラーが出ました。

```
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```

心当たりがなさすぎて、ぐぐったところ、どうやらmysql.sockというMySQLへ接続するためのファイルが消えてしまっているようで、もう一度然るべき場所に作ってやらないといけないっぽい。

まずは下のコマンドを打ち込んでから...

```
$sudo touch /tmp/mysql.sock
```

MySQLを再起動。

```
$sudo mysql.server restart
```

これで行けたかと思いアプリケーションを起動すると...

```
Can't connect to local MySQL server through socket '/tmp/mysql.sock'(38)
```

相変わらずエラーが出ていて、末尾の(2)が(38)に変わっただけ。
なぜじゃ...

作ったsockファイルのディレクトリがおかしい可能性があるので、下記のコマンドでちゃんとtmp下にファイルをしまってあげる。

```
$sudo chown mysql:mysql /tmp
```

またまた、MySQLを再起動。
すると、またダメ。。。

```
$sudo mysql.server restart
ERROR! MySQL server PID file could not be found!
Starting MySQL
.. ERROR! The server quit without updating PID file (/usr/local/var/mysql/XXXX-on-MacBook.local.pid).
```

これもグーグル先生に聞いてみた。
どうやらファイルのあるディレクトリに対する権限が無いのがいけないらしい。

なので、権限を付与する。

```
sudo chown -R _mysql:_mysql /usr/local/var/mysql
```

泣きの3回目、MySQLを再起動すると...

```
$sudo mysql.server restart
Starting MySQL
.. SUCCESS! 
```

キタ！
これでローカル環境でアプリをイジイジすることができます。

<b>結論：原因は環境によって色々なパターンが有るため、エラーログをちゃんと読んで理解するの大事</b>

#参考
　mysqlが起動できない（Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)）
（https://qiita.com/carotene512/items/e00076fe3990b9178cc0）

　mysql起動で「The server quit without updating PID file」
（https://qiita.com/mogetarou/items/e34ca51d3756d55d7800）
Go-langをUbuntu14.04.4 LTSに導入する

最近Goを触り始めました。比較的古いUbuntuにapt-getでgoを入れようとすると、apt-get updateしても
バージョンが古くて面倒なことになったので、最新バージョンを入れるやり方を備忘録として記しておきます。

以下のことは公式に基本書いてあります。

# 公式から最新版をダウンロード
安定の公式。
[Downloads - The Go Programming Language](https://golang.org/dl/) にアクセスします。

Stable versionsを見ます。

現時点（2017/11/16）で最新の安定バージョンは1.9.2でした。
OS: Linux, Arch x86-64の項目（go1.9.2.linux-amd64.tar.gz）が該当するソースです。これを落とす必要があります。

リンク先は以下のようになっていました。
https://redirector.gvt1.com/edgedl/go/go1.9.2.linux-amd64.tar.gz

Ubuntu上で以下のコマンドを打ちます。（場所はどこでもOK）

```bash
# ファイル名はバージョンに合わせて適宜変える
wget https://redirector.gvt1.com/edgedl/go/go1.9.2.linux-amd64.tar.gz 
tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz 
```

/usr/localに解凍し、以下のようにPATHを設定するだけでインストールできます。

# PATHの追加
コマンドライン上で「go」を打てばgoが実行されるようにできます。
以下のコマンドを打って.bashrcにPATHを追加します。
あるいは、自分で.bashrcをvimで開いて手動で書いてもOKです。

```bash
export PATH=$PATH:/usr/local/go/bin
```

# 各種確認
以下のコマンドでバージョンを確認できます。

```bash
go version　#=> go version go1.9.2 linux/amd64
```

PATH、GOPATH（go getするときの基準フォルダ）が設定されているかなどを確認できます。仮想環境に入れたので出力例ではvagrantなんて出てきています。

```bash
go env

#=>
GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/vagrant/go"
GORACE=""
GOROOT="/usr/local/go"
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build385802317=/tmp/go-build -gno-record-gcc-switches"
CXX="g++"
CGO_ENABLED="1"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
```

# 複数のgoプロジェクトを動かすときは……
予めシェルに以下のように書いておけば、その都度GOPATHを変更し、go getできます。

```bash
export GOPATH=$(pwd)
go get
```
Cocos2d-xのサーバー通信方法(JSON+PHP+MySQL) Part3

前回の[Part1](https://qiita.com/708QBT/items/f1c8d1d83d277cf19fe8)、[Part2](https://qiita.com/708QBT/items/f1c8d1d83d277cf19fe8)の続き

#今回の内容
データベースのデータ受信

#手順
part1、part2でやった手順とほとんど同じ

1.JSON作成(いらない場合有)

2.JSONをリクエストURL(PHP)に送信

3.PHPからサーバーのデータを取得しJSON形式で送信元に送信

4.Cocos2d-xでデータを受信、必要な形式に展開

#JSON作成
[Part1 ~JSONの作成~ 参照](https://qiita.com/708QBT/items/f1c8d1d83d277cf19fe8)
>obj.insert(std::make_pair("playerNo", picojson::value(StringUtils::format("%i", 1))));

データベースのテーブルデータ一部(プレイヤーのデータ)だけ欲しい場合、ユーザー認証させたい場合はJSONを作る
今回は[playerNo]を送信しユーザーデータを取得する

#JSONをリクエストURL(PHP)に送信
[Part1 ~HTTPリクエスト~ 参照](https://qiita.com/708QBT/items/f1c8d1d83d277cf19fe8)

```cpp:sample.cpp
#include "network/HttpRequest.h"
#include "network/HttpClient.h"

//How to use
auto request = new cocos2d::network::HttpRequest();
    
request->setUrl("リクエストURL");
request->setRequestType(cocos2d::network::HttpRequest::Type::POST);
request->setTag("setInsert");
request->setResponseCallback([=](cocos2d::network::HttpClient* client, cocos2d::network::HttpResponse* response){
//データ受信、必要な形式展開に重要なところ
    if (response->isSucceed()) {
        //送信成功時の処理

    }else {
        //送信失敗時の処理
 
    }
//ここまで重要
});

picojson::object obj;
obj.insert(std::make_pair("playerNo", picojson::value(StringUtils::format("%i", 1))));
    
picojson::value val(obj);
std::string json = val.serialize();
    
request->setRequestData(json.c_str(), json.length());

auto httpClient = cocos2d::network::HttpClient::getInstance();
httpClient->enableCookies(nullptr);
httpClient->send(request);
request->release();

```

前回と同様にリクエストURLにはサーバーにアップロードしたphpのパスを記述
>request->setUrl("https://~/sample.php");

#Part4
次回は[PHP処理とデータの受信処理](https://qiita.com/708QBT/items/d78dc06c186b1f1d130c)
Parquet, CSV, Pandas DataFrameをPyArrow経由で相互変換する

ローカルだけで列指向ファイルを扱うために PyArrow を使う。
オプション等は記載していないので必要に応じてドキュメントを読むこと。

# インストール
```shell-session
$ pip install pandas pyarrow
```

# 事前準備
```python
import pyarrow as pa
import pyarrow.parquet as pq
import pandas as pd
```

# CSVからParquetへの変換
CSV -> DataFrame -> Arrow Table -> Parquet というフローで書き出す。

```py3
# CSV -> DataFrame
df = pd.read_csv('/path/to/file.csv')

# DataFrame -> Arrow Table
table = pa.Table.from_pandas(df)

# Arrow Table -> Parquet
pq.write_table(table, '/path/to/file.pq')
```

# Parquetの読み出しとDataFrameへのロード

```py3
# Parquet -> Arrow Table
table2 = pq.read_table('/path/to/file.pq')

# Arrow Table -> DataFrame
df2 = table.to_pandas()
```

# 圧縮オプション
`snappy`, `gzip`, `brotli`, `none` が選択可能。デフォルトは `snappy`。

```py3
# brotli で圧縮して出力
pq.write_table(table, '/path/to/file-brotli.pq', compression='brotli')
```

## 圧縮率の比較
データによりけりなのでなんともいえないが、テストデータのCSVファイル(21,196行)だと以下のような結果になった。

| ファイルフォーマット | 圧縮形式 | サイズ(KB) | 備考 |
|:--|:--|--:|:--|
|CSV   |なし   |3154   |元データ   |
|CSV   |zip   |327   |zipコマンドで圧縮しただけ   |
|Parquet   |なし   |811   |   |
|Parquet   |Snappy   |540   |PyArrowのデフォルト   |
|Parquet   |GZip   |370   |   |
|Parquet   |Brotli   |345   |   |

Snappyは圧縮率を犠牲にして圧縮・展開速度を重視した形式で、Hadoop等の大規模データ基盤ではデファクトで活用されている形式であるが、ローカルPCだけでの利用を想定するならそこまで大規模なデータになることはないので、圧縮率重視のGZipやBrotliでもいい気がする。


# 参考

Using PyArrow with Pandas: https://arrow.apache.org/docs/python/pandas.html
Reading and Writing the Apache Parquet Format: https://arrow.apache.org/docs/python/parquet.html
VS2017 C#単体テストでテストエクスプローラーに一覧が表示されなくなったとき

結論：`MSTest.TestAdapter`、`MSTest.TestFramework`パッケージを最新版にアップデートする。

VisualStudio 2017から、製品のアップデートがコンスタントに行われるようになった関係からか、C# の 単体テストプロジェクトでのテスト一覧が表示されない現象が発生しました。

まっさらなテストエクスプローラーの図
> ![image.png](https://qiita-image-store.s3.amazonaws.com/0/2883/98ee2571-12e9-51ec-ff75-534f65ba4d07.png)

クリーン、リビルド、プロジェクトのリロード、nugetパッケージのローカルコピーをFalse、いろいろやってみた結果、上記の2パッケージがバージョンアップしていて、アップデートしたところ解決されました。

1.18 から 1.20 にアップデートしたら解決。
> ![image.png](https://qiita-image-store.s3.amazonaws.com/0/2883/5ca7698d-ffda-7d47-7b71-cec22570cd82.png)

公式には、
> テストが表示されない場合は、使用するテスト フレームワークにテスト エクスプローラーを接続するためのアダプターがインストールされていることを確認してください。 詳細については、「テスト エクスプローラーでさまざまなテスト フレームワークを使用する」を参照してください。
[クイック スタート: テスト エクスプローラーによるテスト駆動開発](https://msdn.microsoft.com/ja-jp/library/hh212233.aspx)

とありましたが、テストエクスプローラーは、テストフレームワークとアダプターのバージョンにも影響を受けることがわかりました。
フロントエンドエンジニアが使いそうなPhotoshopのショートカットキーを毎日一個ずつ追加していく

log代わりにQiitaにでもまとめようと思います。環境はMacです。

## 最初からあるやつ
`v` : 選択
`i` : スポイト
`⌘+Shift+j` : 選択範囲をカットしたレイヤー
`option+ドラッグ` : レイヤー複製して移動
`⌘ + option + shift + f` : レイヤー検索
`⌘+option+c` : キャンバスサイズ
`⌘+option+i` : 画像解像度
`⌘+Shift+e`: 表示レイヤーを結合
`⌘+,` : レイヤーを非表示
`option+]` レイヤーパネルの1個上のレイヤーを選択
`option+[` レイヤーパネルの1個下のレイヤーを選択

## 自分で設定したやつ
`⌘+Ctl+t` : トリミング
`⌘+Ctl+a` : レイヤー名の変更
`⌘+Ctl+s` : スマートオブジェクトに変換
`⌘+Ctl+c` : レイヤースタイルをコピー
`⌘+Ctl+v` : レイヤースタイルをペースト
Windows 用 Electron アプリを、環境を汚染せずに最速で開発し配布する方法

> 2017/11/17 変更
> Electron Releases ページの体裁が変わったのでそれに合わせて変更しました。
>

1. [Electron Releases](https://electron.atom.io/releases/) で、インストールしたい Electron のバージョンの、右端についているアイコン<img src="https://assets-cdn.github.com/images/modules/logos_page/GitHub-Mark.png" width="40">をクリックする。通常は最新版でOK。


1. github の Releases ページにジャンプするので、Downloads の中から
  electron-v●-win32-ia32.zip をダウンロードする。 
 （●部分はバージョン）
  なお、x64 がよいなら x64 でもよい。  

1. ダウンロードしたファイルを、適当なフォルダ（以下「作業フォルダ」という」）に展開する。

1. 作業フォルダの中にある resources フォルダの中に app というフォルダを新規作成する。

1. [electron-quick-start](https://github.com/electron/electron-quick-start) で配布されているファイルをすべてダウンロードし、上記 app フォルダの中にコピーする。  

1. app フォルダの中の index.html や main.js を自分好みに変更する。

1. 作業フォルダの中にある electron.exe を実行して動作確認。

1. 作業フォルダを zip などでまとめ、「electron.exe を実行してね」と念を押す。もちろん、Inno Setup などでインストラーを作成してあげればより親切である。  

以上です。
iOS実機でLaunchScreenの画像が出ない（Xcode9 & Swift3）

#事象
Xcode９、 Swift3
シミュレーターやXcode内では、
LauchScreen.storyboardに設定している
UIImageの画像が表示されている（xcassetsに設定した画像）。
実機でビルドすると表示がされない問題（どのOSバージョンでも）。

アンインストールしてインストールしてもダメでした。

ちなみにプロジェクト設定のGeneral内、LaunchImageの方は
LauchScreenが設定されていない時のみ使用されます。

#結論
実機側の再起動で表示されるようになった。
おそらく内部で何らかのキャッシュをしている様子。
アンインストールしただけでは、消えないキャッシュがあるのかも。
heroku コマンド一覧

# 概要
herokuでよく使用するコマンドを一覧としてまとめました。

# コマンド一覧
## 環境変数
- 一覧

```
$ heroku config
=== xxxxxx Config Vars
LANG:                     en_US.UTF-8
RACK_ENV:                 test
RAILS_ENV:                test
```

- 設定

```
$ heroku config:set RACK_ENV=test　--app "xxxxxx"
Setting RACK_ENV and restarting ⬢ xxxxxx... done, v10
RACK_ENV: test
```

- 削除

```
$ heroku config:unset RACK_ENV
Unsetting RACK_ENV and restarting ⬢ xxxxxxx... done, v12
```

## アプリの操作
- 一覧

```
$ heroku apps
=== example@example.com Apps
xxxxxxxxxx

```

- 作成

```
$ heroku create
Creating app... done, stack is cedar-14
https://xxxxxxxxxx.herokuapp.com/ | https://git.heroku.com/xxxxxxxxxx.git
```

- 削除

```
$ heroku apps:destroy -app xxxxxxxxxx
```
gitのサブコマンドとしてfishの関数を呼び出す

`git-subcommand`という名前の実行ファイルをパスの通ったディレクトリに置いておくと

```sh
$ git subcommand
```

のようにハイフンなしで実行できるらしい．

参考
- [便利な「git-サブコマンド」を作成する](https://qiita.com/b4b4r07/items/6b76a5f969231e5e9748)
- [オレオレ Git サブコマンドを作る](http://blog.kyanny.me/entry/2012/04/28/040717)
- [gitのサブコマンドを自分で作る](http://ton-up.net/technote/2013/12/12/git-subcommand/)


でもfish shellだと，スクリプトファイルを作るよりも関数を書いて済ましてしまうことが多い．

なので，`git-`で始まる関数を書いたとき，それを`git`のサブコマンドとして実行するようなラッパーを書いてみました.

```sh:git.fish
function git
    set -l subcommand "git-$argv[1]"

    if functions -q $subcommand
        set -e argv[1]
        eval $subcommand $argv
    else
        command git $argv
    end
end
```
これで例えば`git-package`というfish関数を定義すると`git package`のようにサブコマンドとして呼び出せます．便利！
lua 5.1 for Windows で shebang もどき

- [インタプリタ無改造！ Lua on Windows で shebang](https://qiita.com/hymkor/items/4f0c1d4c3f1fa76d8e4c)

上記の方法は、ラベルがある Lua 5.2 以降でしか使えなかった。

GopherLua など、最も普及した「lua 5.1」で shebang（バッチファイルにスクリプトを埋め込んで、インタプリタ名の入力を省く）を書くには次のように、ワンライナー中にスクリプトの３行目以降をロードするコードを書く方法がある。

```
@lua5.1.exe -e "_,_,b=io.input([[%~f0]]):read('*l','*l','*a');assert(loadstring('\n'..b,[[%~f0]]))()"
@exit /b %ERRORLEVEL%

print('ahaha')
```

一応、エラー時の行番号もずれない（評価する前に頭に `\n\n` を追加して、読み飛ばた文の行位置の調整をしている）
CakePHP2以前は複合主キーに対応していない件

CakePHP2以前のバージョンでは、複合主キーに対応していません。

#回避策
・もし可能であれば、新しいフレームワーク（CakePHP3など）を利用してください。

・もし可能であれば、テーブルの構成を変更してください。
　[サロゲートキーを追加するのが2系時代の一番の解法とのこと。](https://ja.stackoverflow.com/questions/31446/cakephp2-9-%E8%A4%87%E5%90%88%E3%83%A6%E3%83%8B%E3%83%BC%E3%82%AF%E3%82%AD%E3%83%BC%E8%A8%AD%E5%AE%9A%E6%99%82%E3%81%AEsaveall%E3%81%AE%E6%8C%99%E5%8B%95)

・updateAllで保存する
　updateAllなら主キー以外で保存できるため。

・queryでやっちゃう

#現象
複合主キーを持つテーブルを更新しようとすると、
以下のような予期しない動作が起こります。

例では、company_idとmember_idが主キーのテーブルで、
Modelのprimary_keyにmember_idが定義されている場合を示しています。

### saveする時に、同じ主キーの片方を持つレコードがupdateされる

例）C社のmemberとして `1001` さんをsaveしたかったのに

| company_id(PK) | member_id(PK) |
|:---------------|--------------:|
|               S|           1001|

↓ S社のレコードがupdateされてしまう

| company_id(PK) | member_id(PK) |
|:---------------|--------------:|
|               C|           1001|

```sql:実行SQL
SELECT COUNT(*) AS `count` FROM `db`.`company_members` AS `CompanyMembers`   WHERE `CompanyMembers`.`member_id` = 1001

UPDATE `db`.`company_members` SET `member_id` = 1001, `company_id` = `C`   WHERE `db`.`company_members`.`member_id` = 1001
```

### deleteする時に、同じ主キーの片方を持つレコードがdeleteされる

例）C社のmember `1001` さんをdeleteしたかったのに

| company_id(PK) | member_id(PK) |
|:---------------|--------------:|
|               S|           1001|
|               C|           1001|

↓ S社のレコードがdeleteされてしまう

| company_id(PK) | member_id(PK) |
|:---------------|--------------:|

```sql:実行SQL
SELECT COUNT(*) AS `count` FROM `db`.`company_members` AS `CompanyMembers`   WHERE `CompanyMembers`.`member_id` = 1001

DELETE `CompanyMembers` FROM `db`.`company_members` AS `CompanyMembers`   WHERE `CompanyMembers`.`member_id` = (1001)
```
Custom Vision Service + CoreMLで寿司分類

#はじめに
とあるコンテストに向けて[後輩](https://qiita.com/AK-10)と寿司判別するアプリを作りました。
(後輩が特に頑張ってくれて、素材作成は別の後輩に頑張ってもらいました。)

このアプリ実現のために使ったもののノウハウ「Custom Vision Serviceを用いてcoreML用のmlmodelを作成、iOSで推論を行い結果を出力させる」をまとめたかったので、ここにまとめます。


#学習データの取得
私たちの所属する団体のメンバーが某大手回転寿司チェーン店に行ったタイミングで寿司の写真を撮ってもらいました。
開発メンバーとも食べに行って撮ったりもしました。
それだけでは勿論足りないので、Webからも画像を収集しました。
そこらへんの話は本件と関係が薄いのでここには書きませんが、ggると沢山情報が出てきます。


#Custom Vision Serviceで寿司を学習
[Custom Vision Service - Microsoft Azure](https://azure.microsoft.com/ja-jp/services/cognitive-services/custom-vision-service/)
こちらにアクセスし「はじめる」を押して、サインインします。  

  
<img width="1438" alt="スクリーンショット 2017-11-15 17.31.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/156509/1ea61f6c-8743-b625-9fe8-96fe2e90936c.png">
するとこんな感じの画面に遷移するかと思います。
私のやつは既にプロジェクトがありますが、初期状態ではまっさらだと思います。
ここで「New Project」をクリック。


<img width="1435" alt="スクリーンショット 2017-11-15 17.35.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/156509/12a2b8e0-948f-22e7-63e0-37e141b40ad6.png">
このように適当な情報を入れてプロジェクトを作ります。
このときDomainsの項目は**General(compact)**を選択しておいてください。


<img width="1437" alt="スクリーンショット 2017-11-15 17.38.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/156509/e7cf8f2e-fdcf-5ac5-ed05-3d0ded0001fb.png">
するとこのような画面に遷移します。
後は真ん中の「Add images」ボタンを押して、画像を追加していくだけです。
本当に簡単ですね。ビックリします。


<img width="1437" alt="スクリーンショット 2017-11-15 17.42.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/156509/55140ae9-c92b-34d3-995c-7490713360c4.png">
例えばマグロの握りを追加するときはこんな感じで画像+タグをセットしてUploadボタンを押すだけです。


<img width="1434" alt="スクリーンショット 2017-11-15 17.44.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/156509/68558b70-b295-8e6a-3df8-753305fa6196.png">
無事に終了するとこんな感じに飯テロ画面が完成します。
早くこんな食べ物を沢山食べられる大人になりたいと思いました。


無料枠で学習できる画像の枚数が1000枚だったので、今回は20種類の寿司ネタに対して50枚ずつ画像を集めました。
(今考えると少ない気がするけれど、そこは今回置いておきます。)

全ての画像をタグ付きでアップロードができれば、後は上にある緑色の「Train」を押すと学習が始まります。

学習が終わったらパフォーマンスを確認してみましょう。


<img width="1438" alt="スクリーンショット 2017-11-15 17.50.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/156509/4d8f0522-ae11-a473-8cbd-c8903dc06692.png">
再現率が若干悪いですが、あれだけの枚数でここまでの精度がでました。
本当にすごいですね。

後は、このPERFORMANCEタブの「Export」を押すと


<img width="1440" alt="スクリーンショット 2017-11-15 17.55.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/156509/c57ed73c-f911-0116-92ed-af5447dde22d.png">
こんな感じで、CoreMLのmlmodelとして学習モデルを吐き出せます。


#CoreMLで推論
[こちらの記事](http://tech.wonderpla.net/entry/2017/10/03/150000)がとてもわかりやすくて参考にさせてもらいました。
書いてある手順に従って、モデルを読み込み、推論のプログラムを自分たちのアプリに上手く組み合わせることでコンテストに向けたアプリを作りました。
(この記事のことを簡単に試すのなら上記の記事のプログラムだけで動くと思います。)


#実行結果
上記の記事のプログラムで作成したモデルから無事に寿司ネタを推論ができているかの確認です。![ezgif-5-991de5dd59.gif](https://qiita-image-store.s3.amazonaws.com/0/156509/d5f4ba57-b744-939c-7a39-ed48deada9cf.gif)


上手くできていそうですね。


#まとめ
高度な技術の話がわからなくても、世の中にあるものを使うだけで気軽にそこそこの精度の寿司分類ができました。
中で何が起こっているのかがよくわからないのは怖いと思うので、ちゃんと技術的な勉強もおいおいやっていきたいなと思いました。
【JavaScript】ライブラリを使わずにCookieを読み書きする

# 概要

諸事情でCookieを読む処理を手書きしたいという場合に必要なあれやこれのメモ

ライブラリが使える場合はこれとか↓<br>[js-cookie/js-cookie: A simple, lightweight JavaScript API for handling browser cookies](https://github.com/js-cookie/js-cookie)

# Cookieを全部吐かせる

```js
let strFull = document.cookie;
```

`strFull`には「key=value」をスペースと`;`で繋いだ文字列が入ります。
:information_source: [document.cookie - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/Document/cookie)

# 特定のkeyのvalueを取得する

```js
let str = cookieVal('hoge');

function cookieVal(key){
  return ((document.cookie + ';').match(key + '=([^¥S;]*)')||[])[1];
}
```

`str`には文字列か`undefined`が入ります。

やり方はいくらでもありそうですが今回は正規表現を使いました。
1. 生のCookie文字列の末尾に`;`を追加する
2. 正規表現でvalueを抽出
3. 抽出できない場合空配列を返す

:information_source: [RegExp - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp)
:information_source: [ JavaScript正規表現メモ。 - こせきの技術日記](http://koseki.hatenablog.com/entry/20090530/JsIdiom)

# valueをデコードする

```js
let decodedStr = decodeURIComponent(str);
```

`decodedStr`にはURIデコード済みの文字列が入ります。

CookieのvalueはURIエンコードしてあるので、データによってはデコードする必要があります。

:information_source: [decodeURIComponent() - JavaScript | MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent)

# valueをJSON形式にパースする

```js
let jsonCookie = JSON.parse(decodedStr);
```

`jsonCookie`にはJSONオブジェクトが入ります。

:information_source: [JSON.parse() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse)

# 全部まとめて

```js
let key = 'hoge';
let jsonVal = JSON.parse(
  decodeURIComponent(
    (
      (document.cookie + ';').match(key + '=([^¥S;]*)')||[]
    )[1]
  )
);
```

# 書き込む場合

書き込む場合は読み込む場合と逆の順番で処理します。

```js
let key = 'hoge';
let jsonVal = {"fuga": "piyo"};
document.cookie = key + '=' + encodeURIComponent(JSON.stringify(jsonVal));
// hoge={%22fuga%22:%22piyo%22}
```

上のコードだとkeyが`hoge`の部分だけ更新されます。

`expire`とか`path`その他のオプションは今回は割愛。

:information_source: [JavaScriptでcookie処理（読み・書き・削除） - Qiita](https://qiita.com/takanorip/items/4e23b803bb1393176636)
MacでWi-Fi繋がらなくなってレインボーカーソルのままになる

# 状況
- Macで
- スリープから復帰後に
- Wi-Fi繋がらないし
- なんならメニュー右上がレインボーカーソル
- くるくるくるくる...

# 右上のアイコンとか時計はSystemUI
というものらしい

# Wi-Fiの管理してるのはairport
というものらしい

# 解決策
ターミナル分からんのであればアクティビティモニタ開いて

- airportd
- SystemUIServer

の二つを強制終了
でなんとかなる

ターミナルからコマンド打った方が早い

sudo kill -9 \`ps -e | grep -e airportd -e SystemUI | grep -v grep | awk '{print $1}'\`
パスワード入力

※alias組んでおくと便利だよ

Mac自体再起動で「この手に限る」って脳筋爆発なやり方もあるけどスマートじゃない
てかブラウザで開いてるページ閉じたくないし、編集中ファイルいちいち開き直しするのめんどくさい
Githubの基本操作

###ローカルリポジトリを追加
**既存のローカルリポジトリを追加**を選択
リモートリポジトリに追加したいファイルを選択してアップロード

###リモートリポジトリを作成（github上にまだ作られていない場合）
settingで名前を変更し、URLからSSHのパスを取得
**リポジトリの設定**からリモートリポジトリのパスを追加する

他のフォルダもリポジトリに追加する場合、まずはアップロードしたいファイルをコミットし、masterブランチを作成する。
その後、tempブランチを作成し、プルボタンでmasterからtempにgithubを反映させる。
この時、すべてのボタンにチェックを入れる。
その後tempからmasterにプッシュして完了。
超初心者がwindows10 home 64bitのnode.jsをバージョンアップする

私はnode.jsは超初心者です。

node.jsをelectronの勉強のためにwindows10 home 64bitにインストールしています。初心者の実体験を書いているだけなので記事の内容に誤りや不正確な部分があるかもしれません。

先日やっと一個、生まれて初めてelectronアプリを作りました。すごく時間がかかりましたがなんとか自分用のツールとして動いています。

* [electronのメモ帳の動画（注　音有です)](https://www.youtube.com/watch?v=vX5r9TEDbic)

作り始めた時のnode.jsは6.11.2LTSでしたが気づけば、もう8.9.1LTSになっていました。そこで仕方なくバージョンアップ方法をググり始めました。

ただ私がググった限りではwindows10 home 64bitについて書かれた記事は見当たらず、Qiitaのいくつかの記事※を組み合わせてバージョンアップ手順を無理矢理作りました。

※古い記事や対象OSが違う記事もあったのであえて記事のリンクはしていません。

さて、その顛末やいかに…

## 1.当初の予想手順


当初の予想手順は以下です。Windowsの管理者用コマンドプロンプトで実行を考えてました。node.js本体をnで上げて、npm-check-updatesしてパッケージをまとめてアップデート…のハズでした。

1. npm install -g n
1. n lts
1. npm i -g npm-check-updates 
1. ncu -a
1. npm update

## 2.実際にやったこと

かなりボロボロでした…(^_^;)

１. npm install -g n

> なんと、nは32bit版のみでした。仕方なくnodistに変更

２. https://github.com/marcelklehr/nodist/releases からnodist　v0.8.8インストール
３. nodist dist
４. nodist 8.9.1

> うまく行ったように見えましたがnode -vでみてもバージョンが前のままです。windowsを再起動してもだめでした。node.jsを再インストールする方針に変更。

５. https://nodejs.org/ja/ からnode.js v8.9.1LTSインストール
６. nodistをwindowsの設定アプリのアプリと機能からアンインストール
７. npm install -g npm
８. npm i -g npm-check-updates
９. ncu

> No package.json と出てチェックしてくれないのでnpmパッケージの情報を調べる

１０. npm ls -g

> いっぱい出過ぎて意味不明…

１１. npm ls -g --depth=0

> C:\Users\～\AppData\Roaming\npmにnpmでインストールしたパッケージがあることを知る。

１２. cd C:\Users\～\AppData\Roaming\npm\node_modules\electron
１３. ncu

> ちゃんとチェックしてくれた

> @types/node        ^7.0.18  →  ^8.0.52
> electron-download   ^3.0.1  →   ^4.1.0
> home-path           ^0.1.1  →   ^1.0.5
>（以下略）

１４. ncu -a
１５. npm update

> とりあえずイケたみたい…

> added 6 packages, removed 22 packages and updated 126 packages in 24.59s

electronの自作アプリも動きました。

##3.まとめ

一応まとめるとこの手順なのかなと…間違いがあればコメントいただければと思います。多分ちがうんだろうな…

1. https://nodejs.org/ja/ からv8.9.1インストール
1. npm install -g npm
1. npm i -g npm-check-updates
1. npm ls -g --depth=0 ⇒パッケージのインストール先を探す
1. cd パッケージのインストール先ディレクトリ
1. ncu
1. ncu -a
1. npm update

windows10 home 64bitでnode.js動かすこと自体がレアでいらない記事なのかもしれませんが一応レアな人もいるかもしれないので書きました。

以上
備忘録：ajax(jQuery)をネイティブJSで書き換える

###どうしてネイティブJSをわざわざ使うのか
jQueryは便利ではありますが、
昨今のwebストレージは膨大なものとなり、
jQueryの処理を重複させるには少々描画処理に不安な部分があります。

そういうわけでajaxもネイティブJSで書き換えれば処理能力あがるのかなと思い、備忘録として残そうと思います。

```.js
//XMLHttpRequestオブジェクトの生成
var request = new XMLHttpRequest();

//イベントハンドラ設定
request.onload = function (event) {
  if (request.readyState === 4) {
    if (request.status === 200) {
      console.log(request.statusText); // success
    } else {
      console.log(request.statusText); // error
    }
  }
};
request.onerror = function (event) {
  console.log(event.type); // error
};

//open("request method", URL, true or false))
request.open("get", "URL", true);

//json or jsonp
xmlHttpRequest.responseType = 'json';

//POSTメソッドのときはnullじゃないと思われる
request.send(null);
```
jQuery、特にajaxの方が処理早いぞとかあれば
教えていただけるとありがたいです。
これはGETリクエスト用なのでPOSTリクエストのときは
.send()あたりのパラメータ変えるのかなと思ったり。

参考にした記事：
https://mae.chab.in/archives/2821
【ネタ】超手抜きで作る：カウンタ付きランダム画像表示

サイトを運営していると、「ランダムで画像を表示したい」という事がよくあると思います。それを実現するコードはたくさん転がっていると思いますので…

- 標準関数だけを使う
- 超短時間で作る
- とにかく手間をかけない
- 変わった方法

…という条件でコードを書いてみます。目標は10分以内。ネタ＆お遊び重視。

--------------------------------------------------------------------------------

## ファイル構成

```
random_image.php

download_csv.php

img ┬ aaa.gif
    ├ bbb.png
	└ ccc.jpg

pv ┬ YYYY-MM-DD.txt
   ├ 2017-11-15.txt
   └ 2017-11-16.txt
```

--------------------------------------------------------------------------------

## random_image.php

- 表示回数を記録する。
- 「img」ディレクトリ内から画像ファイルをランダムに1つ選び出力する。

```php:random_image.php
<?php
//-- 表示回数を記録(ファイルロックとか面倒なので追記で'1'を書き込む)
if ($fp = fopen('./pv/' . date('Y-m-d') . '.txt', 'a')) {
    fwrite($fp, '1');
    fclose($fp);
}

//-- 出力する画像のパス
$imgAry = glob('./img/{*.jpg,*.gif,*.png}', GLOB_BRACE) or outputImageGif();

//-- 色々書くのが面倒なので画像ファイルへリダイレクトして終わり
header('Location: ' . $imgAry[array_rand($imgAry)], true, 302);
exit;

//-- 1×1の透過GIFを出力する関数(スニペットからコピペ)
function outputImageGif()
{
    header('Content-Type: image/gif');
    echo base64_decode('R0lGODlhAQABAGAAACH5BAEKAP8ALAAAAAABAAEAAAgEAP8FBAA7');
    exit;
}
```

--------------------------------------------------------------------------------

## download_csv.php

- 表示回数を集計してcsvでダウンロードする。あとはエクセルでも使えばいい。

```php:download_csv.php
<?php
//-- fputcsv() とか SplFileObject とか面倒
$csv = '';

//-- 表示回数記録ファイル全部拾ってきて
if ($pathAry = glob('./pv/*.txt')) {
    foreach ($pathAry as $path) {
        //-- ファイル名をそのままCSVの各値として使う
        $csv .= str_replace('-', ',', basename($path, '.txt')) . ','
              . filesize($path) . "\n";
    }
}

//-- 出力して終わり(スニペットからコピペ)
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=pv.csv');
header('Content-Length: '. strlen($csv));

echo $csv;
exit;
```

--------------------------------------------------------------------------------

## 使い方

```html:example.html
<img src="./random_image.php">
<a href="./download_csv.php">csv</a>
```

--------------------------------------------------------------------------------

## Q&A

- Q.ディレクトリのパスとかハードコーディングしちゃダメでしょ。
	- A.そうですね。
<br><br>
- Q.`if ($fp = fopen())` や `if ($path = glob())` という書き方が気持ち悪い。
	- A.そうですね。
<br><br>
- Q.表示回数記録ファイルって1日に1ファイルできるのでは？
	- A.そうですね。
<br><br>
- Q.表示回数記録ファイルって1日に100,000回表示されたら、ファイルサイズが100,000byteになるのでは？
	- A.そうですね。
<br><br>
- Q.「pv」ディレクトリ内に想定外のファイル名のファイルがあるとマズイのでは？
	- A.そうですね。
<br><br>
- Q.10分で書けた？
	- A.これを「書いた」と呼べるのなら。なお、コードにコメントを付けてQiitaの記事にするのにかけた時間は、コードを書く時間の10倍以上。
<br><br>
- Q.Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」だよ？
	- A.いつもお世話になってます。
<br><br>
- Q.これだからPHPerは…
	- A.言語やそれを使う人へダメ出しをしたら君の価値が上がるの？もっと他にやるべき事があるんじゃないかな。(ミサワ風)
<br><br>
- Q.反省してる？
	- A.お固い事ばかり言ってないで、たまにはリラックスしたら？(ミサワ風)

--------------------------------------------------------------------------------

## 結論

Qiita向けの記事を真面目に書くのは大変。
CORBAのIDLファイルでメソッドの返り値・引数に配列を指定する方法

### はじめに
いまどき、CORBAを使ってる人なんているの！？なんて話はさておき:thermometer_face:

### そもそもCORBAとは？
ググればいくらでも出てくると思いますが……

Common Object Request Broker Architectureの略（コルバ・コーバ）。
分散処理を連携するための規格で、IDL（Interface Definition Language）で言語非依存のインターフェイスのみを定義する。
COBRAでは、コードをその機能や呼び出し方の情報と共に一種のカプセル化し、CORBAに対応したコンポーネント同士は言語やOSの違いによらず通信することができる。
つまり、IDLに記述したインターフェイスを実装していれば異なる言語(JavaとかCとか)間でも通信ができます:scream_cat:。

参考サイト
- [CORBA関連のJava技術について](http://d.hatena.ne.jp/ryoasai/20101103/1288765869)
- [ORB の輪](http://www.ogis-ri.co.jp/otc/hiroba/technical/ORBRing/step1/index.html)

今回のケースでは、idljコマンドでIDLに記述したインターフェイスをJavaに変換します……が、IDLの文法とJavaの文法が異なるためハマってしまいました。
（idljコマンドはJDKをインストールすると使えます。）

### IDLの例

例として引数に価格を渡して消費税を計算するメソッドを定義すると以下のようになります。

```idl:test.idl
module com{
  module neriudon {
    module corba {
      interface CalcTax{
      double calc(in long price);
      };
    };
  };
};
```

`module`はJavaの`package`に、IDLの`long`はJavaの`int`に相当します。詳しくは[Java IDL: IDL to Java Language Mapping](https://docs.oracle.com/javase/8/docs/technotes/guides/idl/mapping/jidlMapping.html)を参照してください。

で、ここからが本題です。↑のサイトに変換表が記載されていますが、メソッドの返り値・引数に配列を指定したい場合はどうしたらよいのでしょうか？

で、調べた結果……

[Is it possible to accept a string array as argument in corba idl file](https://stackoverflow.com/questions/28483240/is-it-possible-to-accept-a-string-array-as-argument-in-corba-idl-file)

配列は`typedef`を使ってあらかじめ定義しておく必要があるようです。なんか構造体みたいですね。
以下はStringの配列をbyte配列に変換するメソッドです。

```idl:Converter.idl
module com{
  module neriudon {
    module corba {
      typedef sequence<octet> response;
      typedef sequence<string> request;
      interface Conveter
      {
        response convert(in request request);
      };
    };
  };
};
```
※IDLの`string`はJavaの`String`に、`octet`は`byte`に相当。


では、さっそく、これを`idlj`コマンドでJavaファイルに変換してみましょう。

`idlj -fall -td ./ ./Converter.idl` を実行すると、以下のようなJavaコードが出力されます。

![生成結果](https://qiita-image-store.s3.amazonaws.com/0/162142/c046c89a-f580-c2bd-1d34-e56db76c318e.png)

生成したインターフェイスを実装する場合は`ConveterPOA`を拡張します。

```java:ConverterImpl.java
package com.neriudon.corba;

public class ConverterImpl extends ConveterPOA {

  @Override
  public byte[] convert(String[] request) {
    // TODO Auto-generated method stub
    return null;
  }
}
```
IORファイルなどを使って実際にオブジェクトを通信する部分は割愛します:frowning2:。

ちなみに、JavaでCORBAを扱う場合は[JacORB](https://www.jacorb.org/)というプロジェクトもあります。

### この記事を投稿した経緯
IDLの文法とJavaの文法が異なるためハマってしまったので:cry:。
byteの記法や配列の記法とかは単独でヒットするのですが、メソッドの入出力の例がなかなか見つからず苦労しました:confounded:。
あとQiitaのコードブロックがIDLに対応していたのが驚き:stuck_out_tongue_winking_eye:。
Pythonで 出会って４行で合体する（画像を動画に）

タイトルオチです。[moviepy](https://zulko.github.io/moviepy/)というライブラリで4行で画像フォルダから動画をつくります。インストールはpipでどうぞ。

```bash
$ pip install moviepy
```

## 基本：画像フォルダから動画をつくる

globを使ってファイル名のリストを`ImageSequenceClip`に与えてやるだけでmoviepyの動画インスタンスができます。`write_videofile('filename')`メソッドで保存できます。

```python:make_video.py
from glob import glob
from moviepy.editor import ImageSequenceClip

clip = ImageSequenceClip(glob("images/*"), fps=60)
clip.write_videofile("video.mp4")
```

なお、上の例では、ImageSequenceClipの引数に、ファイル名のリストを与えていますが、別の方法で読み込んだ画像(numpy array)のリストを与えても構いません。

## 応用：動画に処理を施してから出力する

各動画フレームになにか処理を施すことも簡単にできます。下の例では、`process_image(image)`関数で処理を定義し、動画インスタンスの`fl_image`メソッドに与えてやるだけで変換できます。

```diff:make_video.py
from glob import glob
from moviepy.editor import ImageSequenceClip

+def process_image(image):
+    #do something
+    pass

clip = ImageSequenceClip(glob("images/*"), fps=60)
+new_clip = clip.fl_image(process_image)
new_clip.write_videofile("video.mp4")
```
boto3が~/.aws/credentialsのaws_session_tokenを見ないで毎回`Enter MFA code:`と聞いてくるのをなんとかする方法


はじめに
=========
AWSのroleを使っていてMFAが設定してあり、boto3を使いつつLocal環境開発時の鬱陶しさ軽減の話です。

※ よく見ると ISSUE: https://github.com/boto/botocore/issues/1126 になっていますね。いずれ修正されるのでしょう。

Version
--------
* boto3==1.4.4
* botocore==1.5.7

ちょっと古いです。

内容
======

Pythonのboto3ライブラリは、AWS操作の鉄板ライブラリです。
認証の時にCredentialを色々な箇所から自動的に取得してくれますが、
`~/.aws/config` に`role_arn` や `mfa_serial` があると、`~/.aws/credentials` にキーを設定してあってもその前にAssumeRoleProviderが発動し、`Enter MFA code:` というプロンプトを表示してMFAの入力を求められてしまいます。

[ソースコード](https://github.com/boto/botocore/blob/725ebd8a14ed74a5bd64221b0b43181daf6bd697/botocore/credentials.py#L59) を見ると、

* EnvProvider
* AssumeRoleProvider
* SharedCredentialProvider

の順にCredentialをチェックして、AssumeRoleProvider の時にこのプロンプトを表示します。
別途事前にassume-roleを実行していてファイル`~/.aws/credentials`に書いてある場合はこの手順はスキップしたいです。

以下のようにするととりあえずできます。

```python:sample.py
from botocore.session import get_session
from boto3.session import Session

bc_session = get_session()
session = Session(botocore_session=bc_session, profile_name="<your profile name>")
cred_resolver = bc_session.get_component('credential_provider')  # type: CredentialResolver

# set assume-role after shared-credentials-file
assume_role = cred_resolver.get_provider("assume-role")
cred_resolver.remove("assume-role")
cred_resolver.insert_after('shared-credentials-file', assume_role)

#
s3 = session.resource("s3")

# for testing
for bucket in s3.buckets.all():
    print(bucket.name)
```

ちなみに`profile_name` の部分は、環境変数`AWS_PROFILE` で指定してあれば省略可能です。

さいごに
========

小技でした。