OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScriptで集合演算


JavaScriptで集合演算がしたくて調べてみたら、ECMAScript2015(es6)からbuilt-in objectとしてSetが用意されていることがわかった（[MDN Set (日本語版)](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Set)）。集合の定義と要素の追加や削除、イテレータの例は[日本語版](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Set)にあるが、和や積などの集合演算の例は[英語版](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set)にしか無かった。試してみたのでメモを共有。

## 集合演算の定義

[英語版](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set)によると、組み込みでは集合演算は定義されていないので、自分で追加する必要がある。上位集合（Superset）、和(Union)、積(intersection)、差(difference)の例がある。


上位集合(Superset)

```superset.js
Set.prototype.isSuperset = function(subset) {
    for (var elem of subset) {
        if (!this.has(elem)) {
            return false;
        }
    }
    return true;
}
```

和(Union)

```union.js
Set.prototype.union = function(setB) {
    var union = new Set(this);
    for (var elem of setB) {
        union.add(elem);
    }
    return union;
}
```

積(Intersection)

```intersection.js
Set.prototype.intersection = function(setB) {
    var intersection = new Set();
    for (var elem of setB) {
        if (this.has(elem)) {
            intersection.add(elem);
        }
    }
    return intersection;
}
```

差(Difference)

```difference.js
Set.prototype.difference = function(setB) {
    var difference = new Set(this);
    for (var elem of setB) {
        difference.delete(elem);
    }
    return difference;
}
```


部分集合がなかったので書いてみた。上位集合の裏返しなので、下記のような感じになるはず。

```subset.js
Set.prototype.isSubset = function(superset) {
    for (var elem of this) {
        if (!superset.has(elem)) {
            return false;
        }
    }
    return true;
}
```

## 実行

公式の例をChromeのJavaScript Consoleで試してみた。

```example1.js
//Examples
var setA = new Set([1, 2, 3, 4]),
    setB = new Set([2, 3]),
    setC = new Set([3, 4, 5, 6]);

setA.isSuperset(setB);
// true

setA.union(setC);
// Set(6) {1, 2, 3, 4, 5, 6}

setA.intersection(setC);
// Set(2) {3, 4}

setA.difference(setC);
// Set(2) {1, 2}
```

部分集合も試してみた

```example2.js
setA.isSubset(setB);
// false

setB.isSubset(setA);
// true
```

期待したとおり動いているようだ。

## 感想

やっぱり、組み込みでサポートしてくれるととても便利。演算も、和、積は組み込んでほしいと思った。


# 参考

* [ECMAScript 6 sets: union, intersection, difference](http://2ality.com/2015/01/es6-set-operations.html)
* [ECMAScript6 ~ MapとSet ~](https://qiita.com/yhikishima/items/199fd6dcbeeb8ddf90a6)
* [ES2015のMapとSetから配列を生成する](https://qiita.com/1000ch/items/51a97d608441c450ed2c)
python3.5.2にopenCVを導入するメモ

# openCVのインストール
PythonでopenCVを導入するメモ

# 環境
- Windows7
- anaconda
- Python3.5.2
- GitBash(MING64)

# openCVインストール

「[ここ](http://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv)」から「opencv_python-3.3.1+contrib-cp35-cp35m-win_amd64.whl」をダウンロード

下記のコマンドでインストール
`pip install opencv_python-3.3.1+contrib-cp35-cp35m-win_amd64.whl`

参考：「[OpenCV 3（core + contrib）をWindows & Python 3の環境にインストール＆OpenCV 2とOpenCV 3の違い＆簡単な動作チェック](https://qiita.com/hitomatagi/items/d5d475a446ec9c73261e)」

# サンプルコード実行
画像を半分のサイズに変更するサンプルコード

```resize.py
import cv2
import numpy as np

def half_size(im):
        height = im.shape[0]
        width = im.shape[1]
        
        cv2.imshow("full_size",im)
        cv2.waitKey(0)
        cv2.destroyAllWindows()  
        
        half_size = cv2.resize(im,(int(width/2),int(height/2)))

        cv2.imshow("half_size",half_size)
        cv2.waitKey(0)
        cv2.destroyAllWindows()  

if __name__ == '__main__':
    im = cv2.imread("image.jpg")
    if not (im.all() == None):
        half_size(im)
    else:
        print('Not exist')
        
```

condaさんを使うと簡単にインストールできますね。
RubyのみでTwitter Analyticsからimpressionを取得する

#Rubyスクリプトで取得する
Twitter apiではimpressionやengagementは直接取得することができないため、Twitter Analyticsから別途取得する必要があったことから備忘録。ここでは直近の2つ目のツイートのデータをみることにする。

```
require 'capybara'
require 'capybara/dsl'
require 'capybara/poltergeist'
require 'phantomjs'

Capybara.configure do |config|
   config.run_server = false
   config.default_driver = :poltergeist
   config.app_host = 'https://twitter.com/login'
end

Capybara.register_driver :poltergeist do |app|
   Capybara::Poltergeist::Driver.new(app,:phantomjs => Phantomjs.path,:timout=>180,js_errors: false, phantomjs_options: ['--ignore-ssl-errors=yes'])
end

module Crawler
  class TwitterAnalytics
  include Capybara::DSL

  def get_data
  @accounts  = ["@hogehoge", "@hugahuga"]
  @passwords = ["foofoo", "barbar"]
  number     = 0
  @accounts.each do |account|
      visit('https://twitter.com/login')
      sleep(5)
      fill_in "session[username_or_email]", :with => account
      fill_in "session[password]", :with => @passwords[number]
      find(:xpath,'//*[@id="page-container"]/div/div[1]/form/div[2]/button').click
      account.slice!(0)
      visit('https://analytics.twitter.com/user/'+account+'/tweets')
      sleep(10)
      doc = Nokogiri::HTML.parse(page.html)
      impression = doc.xpath('//div[@class="tweet-activity-data impressions text-right col-md-1"]')
      engagement = doc.xpath('//div[@class="tweet-activity-data metric text-right col-md-2"]')
      puts "impression:" + impression.first(2).last.text
      puts "engagement:" + engagement.first(3).last.text
      Capybara.reset_session!
      number += 1
  end
 end
end
end
crawler = Crawler::TwitterAnalytics.new
crawler.get_data
```

##やっていること
要はスクレイピングです。
上記のpasswordとかを考慮すれば複数のアカウントに対応することができます。
Twitter Analyticsを有効化しておくことを忘れないようにしてください。
OpenLDAPのインストール（ソースから）

OpenLDAPをインストールして検証する場面があったのでメモ
必要最低限しか実施していません。

## 前提条件
以下の環境で実施

|OS・ミドルウェア|バージョン|
|:---------|:-------|
|OS|CentOS Linux release 7.4.1708 (Core)|
|OpenLDAP|2.4.45|

仮想マシンはVagrantで作成

## 手順
1. OpenLDAPのソースをダウンロードする

    ```shell-session
    # curl -LkvOf ftp://ftp.openldap.org/pub/OpenLDAP/openldap-release/openldap-2.4.45.tgz
    ```

2. 依存ライブラリをダウンロードする

    ```shell-session
    # yum -y install gcc openssl gnutls libdb-devel
    ```

3. configureを実行する

    ```shell-session
    # ./configure
    ```

4. ソフトウェアのビルド

    ```shell-session
    # make depend
    # make
    ```

5. ビルドしたソフトウェアのテスト

    ```shell-session
    # make test
    ```

6. ソフトウェアのインストール

    ```shell-session
    # su root -c 'make install'
    ```

## ハマった点
自分が作業をやっていてハマってしまった点があった。具体的には`libdb-devel`のインストールをしておらず、次のようなエラーが出力されてしまった

```shell-session
configure: error: BDB/HDB: BerkeleyDB not available**
```

## 参考資料

- [OpenLDAP Software 2.4 Administrator's Guide](https://www.openldap.org/doc/admin24/)
- [2. A Quick-Start Guide](https://www.openldap.org/doc/admin24/quickstart.html)
ubuntuサーバー構築

# 構築

## ユーザー

* hoge ALL=NOPASSWD: ALL
* 上記の設定だと初回がパスワード入力とされて、%sudo  ALL=(ALL:ALL) NOPASSWD:ALL  を追加すれば上手くいった。
* パスワード入力セッション無限設定 (Defaults env_reset, timestamp_timeout=-1)
* [サービス操作](https://www.cyberciti.biz/faq/ubuntu-linux-start-restart-stop-apache-web-server/)
* [メモリー使用状況調査](http://blog.toshimaru.net/linux/)

>
ps alx  | awk '{printf ("%d\t%s\n", $8,$13)}'
ps alx  | awk '{printf ("%d\t%s\n", $8,$13)}' | sort -nr | head -10

## ssh追加

* [公開キー追加](https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys--2)


## ansibleインストール
最新のansibleをインストールする
>
sudo apt-get install software-properties-common
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible

## LAMP環境のインストール手順

* [Apache2.4 + PHP7.0 + MySQL5.7をインストール](https://www.deep-deep.jp/blog_engineer/archives/4219)
* [How To Install Apache MySQL PHP (LAMP Stack) on Ubuntu 16.04](https://tecadmin.net/install-apache-mysql-php-lamp-stack-on-ubuntu-16-04/)
* [Ubuntu 16.04ではPHP5.6をインストールする](http://thr3a.hatenablog.com/entry/20160621/1466469700)
* [php7.1のインストールする](https://www.deep-deep.jp/blog_engineer/archives/5199)
* [Ubuntu16.04とApache2のインストール・設定のまとめ](http://chee-s.net/ubuntu16-04にapache2をインストール・設定する)

## ansible準備

* [ansibleで自分自身(localhost)を制御する場合はlocalで](https://qiita.com/hotta/items/47a432edacdfbd6a3e3e)

>
/etc/ansible/hosts に
localhost ansible_connection=local

## Jenkinsインストール

* [UbuntuにJenkinsをインストール](https://qiita.com/koara-local/items/268dab580346fcef59b5)

>
$ wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
$ sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
$ sudo apt-get update
$ sudo apt-get install jenkins

* JenkinsのTimezoneを変更

> jeinkins管理 > script console > System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Tokyo')

* [githubとjenkinsの連携](https://qiita.com/yuch_i/items/44d224112382b5f1c8eb)

## Virtualbox周りの設定

* sshうまくいかない場合にiptablesを無効化にするかポートを開けていくか
> http://d.hatena.ne.jp/uriyuri/20080704/1215164085

* sshうまくいかないその２、ip addressがない
> https://qiita.com/shinya241/items/e2ee8156f8e99505bef5

* 共有フォルダーの設定

> [-unknown filesystem type vboxsf virtualbox 共有フォルダー設定](https://segmentfault.com/a/1190000004362463)
> centosの場合は [Guest Additionsインストール方法](http://mpweb.mobi/windows/guestadditions-centos.php)

うまくいかない場合：インストールモジュール足りない無い可能性
> yum install bzip2 gcc make perl kernel-devel

/etc/rc.localに mount -t vboxsf -o uid=1000,gid=1000,dmode=0777,fmode=0777 folder_name /var/www/html/を追加する

* phpデバッグ設定

> [xdebug]
zend_extension=/usr/lib64/php/modules/xdebug.so
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_connect_back=0
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.profiler_enable=1
xdebug.profiler_output_dir="/tmp"
xdebug.max_nesting_level=1000
xdebug.idekey="phpstorm"
xdebug.remote_handler=dbgp
パスを一時的に外すワンライナー(例えばanacondaとか)

# 一時的にPATH外したいことあるよね？
あるはず。

# 男なら黙ってsedコマンド。
このケースでは/anaconda/binを外す。
(2018/4/28追記)
もちろん、環境によってpathは違いますから読み替えてくださいね…念のため…

```bash
export PATH=$(echo $PATH | sed -e 's/:\/anaconda\/bin//')
```

…と言いたかったんですが、コメントで先頭にあるときも対応できるやつを頂いたので併記します！

```bash
$ export PATH=$(sed 's|:\?/anaconda/bin||;s/^://' <<< $PATH)
```

# 動機
anaconda嫌いな友達がanaconda入ったコンピュータ使って辛そうだったので
.bash_profileや.bashrcを弄らずにワンライナーを一筆。
WebサイトとSPAの間、あるいはTurbolinksの役割

まずはじめにお断りということで、Railsアドベントカレンダーのはずなのに、Raisタグすら入っていない記事をねじ込んでしまいますが、そのあたりはご了解いただければと思います。

# そもそもHTMLって

まずは、このWeb全盛時代を支えているHTMLですが、略語を開くと**H**yper **T**ext **M**arkup **L**anguageということで、「ハイパーテキスト」をマークアップするための言語、というのが本来の形です。それが、JavaScriptなどが加わったこともあって、いつしかアプリケーション用のプラットフォームとも化している、というのが現況です。

# 各手法を考えてみる
## 単票HTML

そんなHTMLで複雑なJavaScript、CSSを備えたWebサイトを作った場合、ページ遷移のたびにJavaScriptやCSSはご破算になって、再度解析からやり直しとなります。そのコストもあるし、ページ遷移だけに頼っていてはユーザー体験も非連続にならざるをえない（Google Map以前のネット地図を思い浮かべてください）ということで、アプリケーションプラットフォームとして使うには少々物足りないものとなります。

## Ajax＋jQuery

JavaScriptからリクエストを投げられるAjaxは、ページ遷移に依存していたWebの形を大きく変えることとなりました。とはいえ、ネイティブにしてもjQueryにしても、DOMを大きく書き換えようとすれば「細々1つずつ変更していく」か「HTML文字列で作って一気に書き換える」と言うような手段しかなくて、コーディングの手間とパフォーマンスが両立しない環境でした。

## 仮想DOMとSPA

その後、JavaScriptの高速化もあって、「DOM構造自体はJavaScript上のオブジェクトで表現した上で、差分反映はルーチン任せにしてしまう」という戦略が現実的となり、仮想DOMとして普及していっています。さらに考え方を推し進めれば、「ページ遷移もJavaScriptで実現する」というSPAへと進んでいきます。

Railsでも、複雑なJavaScriptフロントエンドを実現するためのWebpackerや、バックエンドに専念するAPIモードなど、SPA向けの機能も導入されています。

## 手法の比較

どのような手法をどんなページに使えば適当かは、もちろん適材適所があります。たとえば、文章や画像を表示するだけでほとんどアクションがないのであれば、単純なHTMLだけで用が片付きます。一方で、Webページというよりアプリケーションと言ったほうが適切な、TwitterやGmailのようなものは、SPA的な手法で作るのが適切、ということになります。

# Turbolinksの位置付け

で、本題のTurbolinksですが、ページ遷移を乗っ取ることで、JavaScriptやCSSのリセットをバイパスし高速化する、という仕組みです。

* 動作のパラダイム…ページ遷移をベースにした通常のWebページと同じ
* サーバサイドの調整…ほぼ不要
* SEO実装…アクセスすれば通常のHTMLを返してくるだけなので、不要
* HTML…ほぼ通常通りでOK
* JavaScript・CSS実装…それなりに考慮する必要あり（とはいえ、SPAほどではない）

ということで、フィールドとしては「ページ遷移というアクションのある世界」で使うもので（文章表示目的～フォーム送信の入るシステム）、JavaScriptやCSSの解析コストが嵩んできたところに対するオプション、というような位置付けで考えておけばいいかな、と思いました。
FoxDotを使ってライブコーディングでセッションをする

※Troopという便利なツールがございましたのでぜひこちらの記事をご参照ください。（2017/12/27 追記）
https://qiita.com/Hulc_0418/items/0509ed0521f7309b29d7

# ライブコーディングでセッションする
FoxDotを見つけてから、日夜楽しませていただいております。

ライブコーディングといえばプログラマが一人でパソコンだけおいてゴリゴリ書いて...
というのがかっこよさだったりもすると思いますが、
音楽なんだからだれかとセッションしたいと思うのは当然かとも思います。

以前Tidal Cyclesで複数人でセッションできないかといろんな方法を考えたんですが、
テンポの同期の部分がネックで、いまいちいい方法に考え至らず諦めていました。
今回、FoxDotならpythonなので行けるんじゃないかと思ってやってみました。

仕組みとしては
FoxDotのエディタ上でoscサーバーを立ち上げる
（送られてきた文字列をそのまま実行するサーバー）
↓
コマンドを文字列としてoscで送る。
↓
サーバー側で送られてきた文字列を実行。

というものです。
セッションというよりは指揮者が複数人いるイメージのほうが正しいかもしれません。

ちなみに現状だとFoxDotエディタは固まっていて、さらに全員コンソール上でコマンドを書くという、なんとも不細工な状態でのセッションになってしまいますが、ご了承ください。

#FoxDot側の準備
まず準備としてpython-oscをpipでインストールしておきます。
``` pip install python-osc ```

次にSuperColliderとFoxDotを立ち上げて普段通り準備を済ませたら、
FoxDotエディタ上で次のコードを実行します。
ipアドレスとポート番号は適宜設定してください。

```python:session_osc_server.py
from pythonosc import dispatcher
from pythonosc import osc_server

def processing(unused_addr, command):
    exec(command)
dispatcher = dispatcher.Dispatcher()
dispatcher.map("/command", processing)

server = osc_server.ThreadingOSCUDPServer(("127.0.0.1", 8000), dispatcher)
server.serve_forever()
```

これを実行するとFoxDotエディタが固まりますが、裏ではコードが動いているはずなので気にしないでください。

#クライアント側の準備
ここまで来たら新しくコンソールを立ち上げて次のコードを実行します。
実行時にFoxDotが起動しているパソコンのipアドレスとoscのポート番号を指定します。

```python session_osc_client.py --ip 127.0.0.1 --port 8000```

みたいな感じになると思います。

```python:session_osc_client.py
import argparse
from pythonosc import osc_message_builder
from pythonosc import udp_client

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--ip", default="127.0.0.1")
    parser.add_argument("--port", type=int, default=8000)
    args = parser.parse_args()

    client = udp_client.SimpleUDPClient(args.ip, args.port)
    while True:
        client.send_message("/command", input())
```

このコードでは標準入力の文字列がエンターキーを押す度、FoxDotに送られてFoxDot側で実行されます。

#最後に
今回のやり方は思いつくなりすぐやってみた感じなのでかなり不細工ですが、ちゃんと動いてくれて妙に感動しました。
他にももっといいやり方があるよという方がいらっしゃいましたら是非教えてください！
world bankのデータを視覚化(2)

#概要
　前回に引き続いてworld bankからのグラフの書き方である。
　今回はpandasの使い方もちょっとウンチクしてみようか・・

#まずはサンプル
　![image.png](https://qiita-image-store.s3.amazonaws.com/0/60225/71482ec9-26a6-ce89-3aef-3da0a767cbb2.png)
　今回は、このグラフである。
　簡単かと思うんだが、けっこう悩んだ。プログラムはこんな感じ
　<pre>
# coding:utf-8

import wbdata
import pandas
import matplotlib.pyplot as plt
cc = ["CHN"]
ic = {"TX.VAL.TRVL.ZS.WT":"travel","TX.VAL.TRAN.ZS.WT":"trans","TX.VAL.INSF.ZS.WT":"insulance",
    "TX.VAL.OTHR.ZS.WT":"other"}
df = wbdata.api.get_dataframe(ic,country=cc,convert_date=False)

ic1={'TX.VAL.SERV.CD.WT':'service'}
df2 = wbdata.api.get_dataframe(ic1,country=cc,convert_date=False)
dfu00 = df2.unstack(0)
dfu0 = dfu00.unstack(0)

dfu = df.unstack(level=0)
dfu2 = dfu.unstack(0)
dfu3 = pandas.DataFrame(dfu0.values*dfu2.values/100,columns=dfu2.columns,index=dfu2.index)
dfu3[["travel","trans","insulance","other"]].sort_index(0)['1970':'2016'].plot(stacked=True); 
plt.legend(loc='best'); 
plt.title("us goods element")
plt.show()
 </pre>

#ウンチク箇所
　今回は４つの指標を取り出して、その合計を計算しているグラフで
ある。
　.plot(stacked=True)というので簡単にできる。
　
　そして、その４つの指標が％なので、合計数と掛け算をしないといけない。
　そこが、

<pre>
dfu3 = pandas.DataFrame(dfu0.values*dfu2.values/100,columns=dfu2.columns,index=dfu2.index)
</pre>

というところである。

また、unstackを２回実施するというのも、ちょっとコツである。

#unstackの意味
ここは、pandasのseriesというデータ形式の問題である。

wbdata.api.get_dataframe
では、seriesという形式でdataframeに格納する。

っで、seriesというのはなんだ？というと、１次元の配列である。
簡単にいうと、以下のような構造で格納する
<pre>
travel CHI   1960 v1
             1961 v2
             1962 v3
             ・・
　　　　　　  2016 v56
trans CHI   1960 vv1
            1961 vv2
            1962 vv3
            ・・
　　　　　　 2016 vv56
</pre>

列としては１列しかなく、travel,CHI,1960というのは、行のラベルの意味しかないということになる。
この「行のラベル」をindexというデータで表現しているのが、sereisである。

まあ、簡単にいうと、データを縦に並べただけということである。

そこで、unstackをするとまずは、CHIが列になる。
普通は、国別にグラフを書くので、unstackは１回だが、今回は国別
ではなく、"travel","trans","insulance","other"を列に
したいので、２回のunstackが必要であるということである。

わかったかなあ？

#そういえば・・
プログラムはcc=["CHN"]になっているが、グラフと同じにするにはUSにしないと同じにならないので念のため
非asyncメソッドからasyncメソッドを使うためのラッパーメソッド

普通のやり方だとasyncなメソッドを呼び出すのはasyncメソッドからでないとダメ、そのせいで既存のプログラムやクラスにasyncメソッドを追加するのはけっこうめんどう

という呪縛から解放するための小ネタ。
あくまで雛型なので、これを元に必要に応じてエラーやキャンセルの場合の処理を追加することで実用的になると思います。

```csharp
static class AsyncWrapper{
  //返り値あり
  static TResult Await<TResult>(Func<Task<TResult>> asyncFunc)
  {
    //Task.Runを使わず直接asyncFuncを呼ぶとデッドロックの可能性あり
    Task<TResult> task = Task.Run<TResult>(asyncFunc);
    task.Wait();
    return task.Result;
  }

  //返り値なし
  static void Await(Func<Task> asyncFunc)
  {
    Task task = Task.Run(asyncFunc);
    task.Wait();
  }
}
```

####使用例

```csharp:Bluetoothのデバイスインスタンスを取得
  //using Windows.Devices.Bluetooth;

  UInt64 bleAddress = 0xff00ff00ff00ff00;//ダミーアドレス

  //ラムダ式を渡す場合はAwait<返り値の型>と明示する必要あり
  //IAsyncOperationなどを返すメソッドはAsTask()で明示的にTaskに変換する
  var bleDevice = AsyncWrapper.Await<BluetoothLEDevice>(() =>
    BluetoothLEDevice.FromBluetoothAddressAsync(bleAddress).AsTask());
```

####追記
「メソッドの拡張メソッド」というわけのわからんボケをやってたので修正しました。
あと.NETでは「(普通の)メソッドはオブジェクトではない」ため、ほとんどの場合は「AsyncWrapper.Await()の引数としてラムダ式を渡す」形になりそう。
【javascript】即時関数とは？

javascriptはコピペ駆動開発 + javaのつもりで書いているため即時関数(のような)javaで全くみない書き方が目に入ると脳みそがフリーズしていました。同じ症状の方の参考になればと思い自分なりに即時関数について説明してみます。

# Javaっぽく関数を利用する
JavaやCのプログラマなら以下の記法で関数を宣言し実行できる、というのをなんとなく理解できると思う。

```javascript:
//関数宣言1
function testFunction(){
  console.log('かんすうのテストです');
}

//関数宣言2、htmlのボタンクリックなどから呼び出し
function main(){
  //宣言１を呼び出す
  testFunction();//出力：かんすうのテストです
}
```

というよりjavascriptをきちんと勉強するまで、上の書き方しか理解(納得)できなかった。

# Javascriptでは関数は第1級オブジェクト

javascriptでは、数値や文字と同じく、関数を変数に代入したり、関数の引数に利用したり、戻り値に指定できる。
この性質のことを[第1級オブジェクト](https://ja.wikipedia.org/wiki/第一級オブジェクト)と呼ぶ

関数コンストラクタというものの存在が関数がオブジェクトであることを納得させると思う。

```javascript:
//関数コンストラクタで作ったオブジェクトを変数に代入
var test = new Function('arg1,arg2','console.log(arg1 + ":::"+ arg2)');

//変数を関数として実行
test("hello","world");//hello:::world
```

そんなjavascriptの性質から、javascriptでは関数を以下のように利用できる。

 - 関数の中に関数をかける
 - 関数を引数で受け取り、後続の処理で利用する
 - 関数の処理結果として別の関数を返す

余談ですが、まったくjavascriptを学んでいない状態のjavaプログラマーなどでは上記の使い方の箇所で脳みそがフリーズすると思う。(俺だけ？)

# 関数リテラル

リテラルというのは文字どおり、書かれたもの、ということ。
文字列がコンストラクタを使わずに宣言できるように、関数もコンストラクタなしで記述できる

```javascript:
"test";    //Stringリテラル
5;         //数値リテラル
[5,4,3];   //配列リテラル
(function(arg1,arg2){console.log(arg1 + arg2)}); //関数リテラル
```

をそれぞれ右辺にして変数に代入すればそのまま後続の処理で利用できる。

関数リテラルは**匿名関数**とも呼ばれる

# 即時関数

匿名関数を記述と同時に実行すること。一度知ってしまえば難しい話でもないですね。


```javascript:
(function(){console.log("test")}()); //出力結果：test
```


# 使い所
ES6(最近のjavascriptの仕様)でブロックとモジュールの考え方が導入されたため、スコープの極少化のために利用するということはなくなっていくんだろうと思う。昔は少量の記述かつグローバルスコープに影響を与えない性質から、ブックマークレットなどに積極的に利用されていたらしい。

ただ昔に出版された本や古いコードなどには結構即時関数が利用されているため読めるようにはなっている必要があると思う。

# 参考
[javascriptパターン](https://www.oreilly.co.jp/books/9784873114880/)
[もうはじめよう、ES6~ECMAScript6の基本構文まとめ(JavaScript)~](https://qiita.com/takeharu/items/cbbe017bbdd120015ca0)
[JavaScriptから即時関数を排除する](https://qiita.com/raccy/items/310b4353a757296f797f)
メールの生データ：メールの画像

#現在、メールデータの解析で悩んでるところ
メールでのブログ投稿システムを作製しているところなのですが**インライン画像のcid**の出力の仕方が解らず悩んでます。画像の保存は下記コードで出来るようになったのですが本文やら画像やらを保存しても画像の出力方法がいまいち解らない。

```php:blog.php
// 画像格納フォルダ作成
// ディレクトリ　./blogimg/ユーザーアドレス/投稿日時/画像ファイル本体
    $dir_date = date("YmdHis", strtotime($Date));
    $dir_Add = "./blogimg/$fromAdd/";
    if(file_exists($dir_Add)){ // 既にメールアドレスでフォルダがある場合
        if(file_exists($dir_Add."/$dir_date")){
            $dir_path = $dir_Add.$dir_date; // 最終的な画像保存先
        }else{
            mkdir($dir_Add."/$dir_date", 0777);
            chmod($dir_Add, 0777);
            $dir_path = $dir_Add.$dir_date; // 最終的な画像保存先
        }
    }else{ // フォルダ新規作成
        if(mkdir($dir_Add, 0777)){
            chmod($dir_Add, 0777);
            mkdir($dir_Add."/$dir_date", 0777);
            $dir_path = $dir_Add.$dir_date; // 最終的な画像保存先
        }
    }
// ====================:中略
// 画像保存
    $file_path = $dir_path."/".$img_name[end(array_keys($img_name))];
    file_put_contents($file_path,base64_decode($img_data[end(array_keys($img_name))]));
```
**$img_dataにbase64でエンコードされたデータ**を格納してそれを**base64_decode()**でデコードしたあと**file_put_contents**で**$file_path**に画像を格納してます。

画像の保存はこれで指定する**$file_path**へ保存出来るのですが**Content-Type: text/html**にある**\<img\>タグのsrc="cid:hogehoge@foobar"**と関連付ける方法が調べても調べても全く解らないという暗闇の中に今居ますｗ

htmlとしてメールデータの本文に当たる**Content-Type: text/html**を出力した際にどうやってimgタグのsrc="cid"と画像本体を結び付ければいいのか、参考になるサイトがあれば有難いのですがどうすればいいんだろう。Content-IDが無いメールデータもありますし、添付ファイル(attachment)には殆どContent-IDがない始末。メールデータはもっと細かにグローバルルールを設けるべきだと心底思いますね。Appleが特殊すぎて泣ける。添付ファイル付けれないし。

まだ完成にはほど遠いのですが、かなり終着点が見えてきた感じにはなってます。仮にユーザーのアドレスでフォルダ作ってますが後々はユーザーIDとか個人を特定出来るような何かに置き換える予定です。

完成したと思った時に果たして上手く行くのかどうかは解りませんが作り続けてみたいと思います。メール受信解析ライブラリって昨今、新しいのが出てませんよね。メール受信解析関係で調べると何年も前の記事やブログが出てきますし、過去の状態と現在の状態は違うところが多いので初学者にはとても難しいです。まだまだひよっこですがこれからも頑張りたいと思います。

PHP楽しい！
Udemyのコース「【作りながら覚える！】 Ruby on Rails を用いたウェブ開発(Airbnbを作ろう！) 」を学ぶ。part2-4,5,6

Udemyの[こちらのコース](https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0ahUKEwjBu4a35bfXAhXQ16QKHfxQCvIQFggyMAE&url=https%3A%2F%2Fwww.udemy.com%2Fruby-on-rails-g%2F&usg=AOvVaw2zf_7hwBdtTsJHjjVy_0-6)を受けながら、疑問に思ったこと、調べた結果、大事なことをまとめていきます。

#part2-4 loginページのViewを整える

#自己課題
- navbar.html.erbを作成せよ。partialフォルダーに入れてね。
- ログイン画面、登録画面でrenderを用いてnavbarを表示させよ。
- bootstapを用いてloginページを整えよ。

#part2-5 トップページのnavbarを調整
トップペ＝ジのnavbarもpartialを適応させたい。しかし、classが違うため見た目も違うのだがそれを適応させないといけない。

以下のコードをトップペ＝ジの上に追加。

    <script type="text/javascript">
      $(function(){
        $(".navbar").removeClass("navbar-devise");
        $(".navbar").addClass("navbar-default");
      });  
    </script>
javascriptを用いて変更する。

##href="/"にするとトップページへ飛ぶ。


#自己課題
- トップページにもnavbarを適応。
- brandのリンクをトップページへ。

#part2-6 実際にアカウントを作成してデータベースを
##navbarにログアウトを追加したのだがうまくいかない・・・。
    <li><%= link_to"ログアウト", destroy_user_session_path, :method => :delete %></li>
これを実行すると、なぜかGETが起動し、エラーがでる。
一時間ググっていたが解決。
[こちら](https://qiita.com/yuskamiya/items/ee5280dfcbca9d7216ae)の記事を参考にやっていたがうまくいかず。application.jsに記載されているコードは書いてあるし、ここは問題ないと思っていたが。順番を変えて見た。コードの最後に移動したら解決した。順番も大事なのね・・・。



#自己課題
-　navbarにログアウトを追加。
XCodeのアップデートが途中だったせいでXamarin.iOSがビルドできなかったお話

WindowsでXamarin.Formsを使って組んだコードをGitHubに上げて、Macでもビルドできるか確認しようとしたところ以下のエラーが出現してビルドできず。

```
The "IBTool" task failed unexpectedly.
```
```
Error: ibtool exited with code 134
```

エラー文でググってみると以下に行き当たりました。
https://bugzilla.xamarin.com/show_bug.cgi?id=57678

「もしや…？」と思いXCodeを開いてみたところ、アップデート後に一度も開いていなかったため規約にAgreeしておらず、そこでアップデートが止まっていた模様。
アップデートが完了するとビルドも成功し、無事動かすことができました。

アップデートはちゃんと最後までやりましょう…。
AppBarLayoutの下に配置したToolBarを透過する

# 方法

- styles.xmlでTheme.AppCompat.Light.NoActionBarを継承したテーマを作成し、デフォルトのActionBarを非表示にする
- ToolBarを表示するだけのapp_bar.xmlを作成し、任意のレイアウトにincludeして使う

## styles.xml
```styles.xml
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <style name="MyActionBar">
        <item name="android:textColorPrimary">@android:color/black</item>
        <item name="colorPrimary">@android:color/transparent</item>
        <item name="android:windowActionBarOverlay">true</item>
        <item name="windowActionBarOverlay">true</item>
    </style>

</resources>
```

## app_bar.xml
```app_bar.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="false">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="false"
        android:theme="@style/MyActionBar">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize" />

    </android.support.design.widget.AppBarLayout>

</android.support.design.widget.CoordinatorLayout>

```

# ToolBarの影を消すには
app_bar.xmlのandroid.support.design.widget.AppBarLayoutに`app:elevation="0dp"`を追記

# 説明とか
肝心なのは`<item name="colorPrimary">@android:color/transparent</item>`と`android:theme="@style/MyActionBar"`の部分
colorPrimaryをこのように設定しないと、AppBarLayoutにデフォルトのテーマのカラーが適用されて透過できない（真っ青なバーが表示される）
ディストリビューションから始めたくない人向けのNeovimディストリビューション

[begin-with-init.vim](https://github.com/raviqqe/begin-with-init.vim)というNeovimディストリビューションを作りました。それが提供するのは一枚の小さな設定ファイル`init.vim`のみです。そのまさかだ。

# 背景

Vimのディストリビューションは既に色々あります。

- [SpaceVim](https://github.com/SpaceVim/SpaceVim)
- [spf123](https://github.com/spf13/spf13-vim)
- [janus](https://github.com/carlhuda/janus)

でもミニマリストの方々は、

- 重いのきらい
- 要らないプラグイン入れたくない
- 設定ファイルは自分でカスタマイズしたい

といった理由からディストリビューションを避けるでしょう。そして、既存の環境に甘んじ、Vimを触らずに生涯を過ごすのです。

嘆かわしい。

## インストール

Neovimを事前に[インストール](https://github.com/neovim/neovim/wiki/Installing-Neovim)してください。

GitHubレポジトリをクローンして、シェルスクリプトを走らせれば完了です。

```shell-session
> git clone https://github.com/raviqqe/begin-with-init.vim
> cd begin-with-init.vim
> ./install.sh
```

## なんでNeovim?

- 非同期処理
- プラガブルなフロントエンド
- 多言語バインディング

未来を感じる。

## まとめ

改宗するのは今からでも遅くはない。

一応、最小公倍数的なものを目指しています。フィードバックお待ちしております。
ついに jest の軍門に降った

もう駄目だ。ついに React 以外のプロジェクトでも Jest 一択になってしまった。

もともと自分の選択するテストツールは、むかしは jasmine、いまは mocha + chai（ときどき power-assert） をベースに周辺ツールと連携させていて、React を使うようになってしばらくして Jest を入れるようになった。ここ5年くらいのフロントエンド界隈では標準の一種だと思う。

それがどうしてこんなに Jest びいきになったのか。

その1. 楽
-----------------

とにかく楽だからだ。

Jest の売りはオール・イン・ワンとゼロ・コンフィグというだけあって、構築がとりわけ楽。

1パッケージ入れるだけでざっと以下の機能が使えるようになる。

* テストランナー（mocha, jasmine [^1]）
* アサーション（chai, jasmine）
* モック（sinon, testdouble）
* カバレッジ（istanbul）

とくにカバレッジがオプションひとつ足すだけで使えるのは大きい。

使い慣れたツールがあるひとは抵抗あるかもしれないが、書き心地はそこまで違わないので、新規での移行コストは高くないはず。

その2. ウォッチが賢い。
-----------------

ウォッチモードで起動すると、ファイル変更時に依存関係のあるテストだけ走る。

対話用のUIも洗練されていて、全部走らせたい、ウォッチをやめたいといった場合もキーひとつで済む。

さらにつぎに述べるスナップショットテストの更新も同様に必要があればキーひとつでできる。

その3. スナップショットテスト
-----------------

Jest を手放せない一番の理由がこれ。

Jest には React の仮想DOMと呼ばれるHTMLのツリー構造をJSONでダンプし、以降はそれとの差分で判定する「スナップショットテスト」と呼ばれる機能が標準で入っている[^2]。自働UIテストをやったことがあるひとはスクリーンショットに相当するものと思えばいい。

これを例えばファイル読み込みや、APIの出力、データ変換のプログラムに応用すると回帰テストがとても楽に書ける。サーバーレスやデータ・ドリブンのプログラムのプログラムではこれが効いてくる。

その4. だめなところがなくなってきた
-----------------

これはマイナスがゼロになったという話だけれど、以前の Jest はデフォルトであらゆるモジュールの import/require をモックするという~~はた迷惑な~~癖の強い挙動をしていた。自分の場合、これが最後まで障壁になっていたのだけれど、バージョン15から明示的に指定したものだけモックの対象になっている。やったね。

その5. とはいえ問題がないわけではない
-----------------

総合的にみてとっくに実用レベルに達していると思うが、いくつか問題に遭遇することもあるし、ツール外でイマイチなところも残っている。

自分が思い出せるところでいうと：

mac の特定のバージョンでは watchman をアップグレードしないと実行時エラーになる。

Benchmark.js と組み合わせるとこける。これは jest のデフォルトの環境が js-dom だからで明示的に node に設定しないとブラウザだと判別されてしまう。このあたり、やはり癖がある。

TypeScript から使おうとすると追加のパッケージ ＋ お約束の config がいる。mocha と比べると少しだけ手間が大きい。

全般にエコシステムが未成熟。エディタやIDE との統合、karma からの実行などなど……求めていけば切りがない[^3]。ただ Facebook 製なので今後いきなりハシゴを外されたりはしないだろうし、導入する時期としては十分だと思われる。

[^1]: というかベースが Jasmine2 である。
[^2]: いまではほかのテストランナー用のもある。が、組み込みであるのは Jest と Storybook だけである。（2018/1/22追記：[ava](https://github.com/avajs/ava) にも入っていました。知らなかった。）
[^3]: Jest 自体 Karma では [Mocha を使っている]( https://github.com/facebook/jest/blob/master/karma.conf.js)
Bokeh をつかって行列演算を可視化する．

# 本日は

pythonで使えるグラフ描画ツール [Bokeh](https://bokeh.pydata.org/en/latest/docs/user_guide/quickstart.html) の練習として行列演算の結果の可視化をしてみようと思います．
例えば， 2x2行列

```math
R(\theta)=\begin{bmatrix}
\cos\theta& -\sin\theta\\
\sin\theta& \cos\theta
\end{bmatrix}
```

は２次元ベクトルに作用させると結果が　$\theta$　だけ回転したベクトルを出力することがよく知られています．
これを実際に　Bokeh　をもちいて確認してみましょう．

# 実装例

```py3:rot.py
import numpy as np
from bokeh.plotting import figure, output_file, show
from bokeh.models import ColumnDataSource, Div
from bokeh.layouts import gridplot, column


def main():
    xs = np.linspace(-np.pi, np.pi, 10)
    ys = xs
    Xs, Ys = np.meshgrid(xs, ys)
    Xs, Ys = Xs.flatten(), Ys.flatten()

    theta = np.deg2rad(30)
    mat = np.array([[np.cos(theta), -np.sin(theta)],
                    [np.sin(theta), np.cos(theta)]])
    
    transXs, transYs = mat @ np.array([Xs, Ys])

    output_file("lasso_selector.html")
    TOOLS = "pan,lasso_select,save,reset"
    source = ColumnDataSource(data=dict(Xs=Xs,
                                        Ys=Ys,
                                        transXs=transXs,
                                        transYs=transYs))

    f = figure(tools=TOOLS, title="target",
               x_range=(-np.pi*np.sqrt(2)-1, np.pi*np.sqrt(2)+1),
               y_range=(-np.pi*np.sqrt(2)-1, np.pi*np.sqrt(2)+1))
    f.circle('Xs', 'Ys', source=source)

    transf = figure(x_range=f.x_range,
                    y_range=f.y_range,
                    tools=TOOLS,
                    title="trans")
    transf.circle('transXs', 'transYs', source=source)

    grid = gridplot([[f, transf]])
    show(column(Div(text="<h2>Transform before and after</h2>"), 
                grid))

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

# install

```shell-session
$ pip install bokeh
```

# 実行例

```shell-session
$ python rot.py
```

実行すると `output_file`　で指定した `lasso_selector.html`　が生成され，　ブラウザでこれを閲覧することができます．

![スクリーンショット 0029-11-13 午後9.36.16.png](https://qiita-image-store.s3.amazonaws.com/0/135978/a77553a0-6dba-03dd-9256-d03811b56bf8.png)

ここでは格子点領域が左回りに30度回転している様子がみられます．　ただ，この場合では **どの点がどの点に移動した** かがわかりません．
そこで，　`TOOLS` に `lasso_select` を追加しすることで縄で範囲を指定した部分の targetグラフ と transグラフ　の点との対応を閲覧することができます．　つまり，下の図のように可視化することができます．
 
![スクリーンショット 0029-11-13 午後9.41.51.png](https://qiita-image-store.s3.amazonaws.com/0/135978/f06dae15-e8d3-d361-398b-57533c7683e4.png)

縦に並んだ点列が30度傾いていますね．

# 応用

rank が１の行列たとえば，

```math
A=\begin{bmatrix}
1 & 1\\
1 & 1
\end{bmatrix}
```

の像をみてみましょう．

![スクリーンショット 0029-11-13 午後9.48.30.png](https://qiita-image-store.s3.amazonaws.com/0/135978/85555467-57c5-d40a-5671-959ea4d6cecd.png)

rankが１なので像は一次元平面上にズベーっと並びます．　そしてtransグラフの方で原点の点を囲んでみましょう．　そうすると target グラフの方では $y+x=0$ を満たす直線上の点が浮かびあがるはずです．要するに $\ker A$ を可視化していることになります．
これから線形代数の次元定理

```math
\operatorname{rank} A + \dim(\ker A) = 2
```

が成り立つのも確認できますね．

# 参考文献

- [Quickstart](https://bokeh.pydata.org/en/latest/docs/user_guide/quickstart.html)
- [Titles over layouts a la "suptitle"](https://github.com/bokeh/bokeh/issues/5463)
- [次元定理の意味，具体例，証明](https://mathtrain.jp/ranknullity)

# 追記
[続編作りました](https://qiita.com/SatoshiTerasaki/items/b7a5bf61f572aac1e358)
bootstrap4導入時にpopper.jsでSyntaxErrorに遭遇した場合

# bootstrap4導入でpopper.jsでSyntaxErrorに遭遇した場合
こちらはβ-2で発生を確認しました。
解決策としては、こちらの[stackoverflow][error_link]質問に対する答えで解決します。

```text:debug-console

Uncaught syntaxError: Unexpected token export

```

## アンサー的には...

...必要そうなところ以外は省く...

わーが、[Navbar][]のソースんじゅんてよ、`popper.min.js`がうまーぬごとぅたっくわーてくてぃたさー、
やんばーて、くまーぬまんにぃーてぃれば、なんくるないさー。

`<script src="https://getbootstrap.com/assets/js/vendor/popper.min.js"></script>`

だからさ、ローカルファイルにするにはよー、[`https://getbootstrap.com/assets/js/vendor/popper.min.js`][popper]
くまーぬてぃ、ダウンロードしち、たっくわせーば、ひーじーどー！

...的な感じなんだと思う。英語分からないけど、方言にしてみた...久しぶりに方言を使ったから、間違ってるかもw
Google翻訳もしてくれないから、余計にややこしいかもしれんw

<!-- Link's -->
[error_link]:https://stackoverflow.com/questions/46459767/popper-js-in-bootstrap-4-gives-syntaxerror-unexpected-token-export/46460112#46460112
[popper]:https://getbootstrap.com/assets/js/vendor/popper.min.js
[Navbar]:https://getbootstrap.com/docs/4.0/examples/navbars/
C++11TMPでコンパイル時にSATを解く

C++のテンプレートメタプログラミング(TMP)はチューリング完全ですので、当然 充足可能性問題(SAT)を解くこともできます。
コンパイル時に分岐するための技法としてSFINAEがありますが、これを使うと少ないコード量でコンパイル時にSATを解くコードを書くことができることに気づきました。

# SATをコンパイル時に解くコード
```cpp
template<bool...> struct Var {};

template<bool...> struct Satisfiable {};
struct Unsatisfiable {};

template<bool... Vs>
auto search( Var<Vs...> )
    -> decltype( problem( Var<Vs...>{} ) );

template<bool... Vs, class... Rest>
auto search( Var<Vs...>, int, Rest... )
    -> decltype( search( Var<Vs..., true>{}, Rest{}... ) );

template<bool... Vs, class... Rest>
auto search( Var<Vs...>, long, Rest... )
    -> decltype( search( Var<Vs..., false>{}, Rest{}... ) );

template<class... Ts>
auto solve( Ts... ) -> decltype( search( Var<>{}, Ts{}... ) );

auto solve( ... ) -> Unsatisfiable;



#include <type_traits>

template<
    bool V1, bool V2, bool V3, bool V4,
    typename std::enable_if<
           (  V1 ||  V2 )
        && (  V1 || !V2 ||  V4 )
        && ( !V1 || !V2 || !V3 || !V4 )
    , std::nullptr_t>::type = nullptr
>
auto problem( Var<V1, V2, V3, V4> )
    -> Satisfiable<V1, V2, V3, V4>;

#include <iostream>
#include <typeinfo>

int main() {
    decltype( solve( 0, 0, 0, 0 ) ) ans;
    std::cout << typeid(ans).name() << std::endl;
}
```

```
$ clang++ -std=c++11 sat.cpp
$ ./a.out | c++filt -t
Satisfiable<true, true, true, false>
```

実行結果→[[Wandbox]三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ](https://wandbox.org/permlink/70K1PDK5Yury3qLD)

オーバーロード解決が成功する、つまりSubstitutionが成功するかは、```decltype```内で呼び出されている関数のオーバーロード解決が成功するかに依存しています。深く呼び出した先の関数でSFINAEが起きた場合はバックトラックが起こるので、それをSATを解くことに利用した形になります。

### コード理解のヒント
* ```std::nullptr_t```と```nullptr```を使ったSFINAE(参照: [Qiita: std::enable_ifを使ってオーバーロードする時、enablerを使う？](https://qiita.com/kazatsuyu/items/203584ef4cb8b9e52462))
* ```search```関数は、後ろに宣言されている関数を参照するが、同じ名前空間上にある```struct Var<...>```が引数に入っているためADLで検索されて問題なく参照できる
* オーバーロード解決の優先順位をつけるために、```0```という```int```を関数に渡し、オーバーロード解決の優先順位が```int```>```long```なことを利用する(参照：[本の虫: C++11におけるモダンなhas_xxxの実装](https://cpplover.blogspot.jp/2012/02/c11hasxxx.html)の追記解説)


# Parity SATをコンパイル時に解く
上記コードでは、オーバーロード解決の優先順位をつけていましたが、これをつけないと変数への真偽値割り当てがどちらでもSatisfiableにできる場合に、オーバーロード解決があいまいになってしまいます。オーバーロード解決があいまいになることは、SFINAEの対象です。
どういう時にオーバーロード解決が成功するかを考えると、「部分問題の解が2つある」と「部分問題の解が存在しない」のどちらもSFINAEになることから、mod 2の世界で考えればいいとわかります。つまり、全体の解が奇数個存在するときのみオーバーロード解決が成功すると言えます。
ところで、「SATの解の個数が奇数個であるか？」という問題をParity SATと言いますが、完全にこれの定義に合致します。よって、先のコードでオーバーロード解決の優先順位をつけていたところをなくす(```long```を```int```に書き換える)だけでParity SATを解くことができます！
(「SATの解が唯一であるか？」という問題を解いているわけではない点には注意が必要です)


実行結果→[[Wandbox]三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ](https://wandbox.org/permlink/DvAxORJR08jrPXFX)

# 注意
SATソルバーのようにかしこい方法を使って解くわけではなく、枝刈りなしのバックトラックを行いすべてのパスでテンプレートをインスタンス化するため、13変数でGBオーダーのメモリーを使います。

また、なぜかUnsatisfiableなパスの方が多くメモリを消費するため、そういったパスが多いとclangが落ちてしまうことがあります。
雰囲気でわかるDocker

## 目的
Dockerについてざっくりわかること

Docker関連のファイルで何をしているかを
　ざっくり理解すること

---
## 注意

社内勉強会向けに、Docker初心者が複数のスライドや公式サイト等を見て、実践した程度なので、正確でない可能性があります。
最新の情報や、参考のスライドを見て、次のステップへ進むことを強く推奨します。

---
## Agenda
1. コンテナによるプロセス分離

1. コンテナの作り方

---

コンテナによるプロセス分離
-
---
## Linuxカーネルの上に独立した環境を構築できる。

コンテナの中にそれぞれ独立したプロセス群がある

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3094/5e9fd465-f8b7-8dcf-975a-00fa312fa77d.png)

---

カーネルってなんだっけ？
-

---
## カーネル
OSの構成要素の一部で中核となる部分です。

| OS              |  カーネル |
|:---------------|:--------|
| Windows　      　　　　|Windowsカーネル|
| Mac           　　　|Darwinカーネル|
| CentOS,Ubuntu 等|**Linuxカーネル**|

※Dockerでは、それぞれContainerの中で **Linuxカーネル**を共有するため、Windows,MacOSではそのままDockerを使えません。
なので、Linux系のVMを起動してDockerを操作しています。

---
なにそれおいしいの？
-

---

## 1.はやい！
　
VMと違って、ホストOSの中で分離させているだけなので、軽量ではやい！※　　　　
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3094/f617df75-dbd1-7c62-4f90-2a951c1a1cb1.png)

※クラウドで1VM,１コンテナとかだとオーバーヘッドがあるだけなので遅い可能性があります。
（とーぜんか。）

---

## 2.安い！

安いシーン

開発環境を20人分用意する必要があるとして、、、

20人用のVM      = 20台分のOS , Mem, CPU, 
20人用のコンテナ  =   1台分のOS、20台分のプロセス , Mem, CPU

コンテナの方がリーズナブルになりそう！※未検証

---

## 3.うまい！

元々コンテナ技術はあったけど、
dockerのコマンドを使うことで、
そのへんのことをよろしくやってくれるので、
とても使いやすくなったよ！

---
コンテナの作り方
-

---
コンテナの作り方
-

Dockerで記述するファイルは

**Dockerfile**

**docker-compose.yml**

この2つです。　イメージ的には単品料理と定食みたいな感じ。

---
Docker file 例　debian
-

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3094/bf725822-69ca-b385-61b8-9e1c73ae509d.png)

scratchで作ってる

---
Docker file 例　nginx
-

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3094/639ce4df-e50a-17d9-2a5c-889de9930083.png)

debianから作成

---
Docker file 例 nginx-proxy
-

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3094/19e577aa-f475-de0f-a402-fe311d1da870.png)

nginxから作成

---
どう使うのか
-
たとえば、今見せたそれぞれのDockerfileをbuildすると
それぞれのimageが生成されます。

imageからコンテナーが生成できるので、
それで初めて利用が開始できます


![image.png](https://qiita-image-store.s3.amazonaws.com/0/3094/443e9e74-5f09-8c95-89d3-30fdbe5d13d7.png)

---
ImageとContainerの　雰囲気
-

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3094/af8a5c31-66bd-0a08-15be-160ad987df6f.png)
imageは読み取り専用のハコで、Fileを編集したり出来ないので、操作するためにContainerの層を足します。
※imageが層になってるの超重要なコンセプトです。

---
docker-compose は？
-
docker-compose は、docker-compose.yml ファイルを用意してコマンドを1 回実行することで、
そのファイルから設定を読み込んですべてのコンテナサービスを起動することができます。

---
## docker-compose を実行すると？

ymlにdb, web, proxyそれぞれ指定して、"docker-compose up” コマンドを実行するとそれぞれ以下の構成が起動します。
(コンテナ同士のネットワークも簡単に指定できる)
  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3094/762fa30e-b237-b47b-3740-c8823aa2d22d.png)
　
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3094/29d341ef-f714-8db7-b312-c1f6198ec16c.png)

---
## 以上！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3094/90eb05e4-073d-7364-16e2-89cc6f21be8a.png)

---
参考

Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
https://www.slideshare.net/zembutsu/introduction-to-docker-management-and-operations-2nd

Dockerを支える技術
https://www.slideshare.net/enakai/docker-34668707

LinuxコンテナとLXC入門
 https://speakerdeck.com/tenforward/1st-kistudy
Unity Dashboard／DevelopにあるProjectを消す

Unityで新しくプロジェクトを作った場合、Unityのweb（Dashboard）のProjectsにその名前が登録される。
その後、何かの理由でローカルのフォルダだけ削除した場合、webにはプロジェクト名がそのまま残る。
このままだと困るので、web上に残ったプロジェクトを消す方法を探して「How to delete Develop Project from cloud build」をググったところ、[Unity Community Forums](https://forum.unity.com/threads/removing-projects-from-unity-cloud-build.354510/)上に削除方法が掲載されていたので、引用しながらメモとして残す。

#Unity Cloud Build から Projects を消す
フォーラムに書かれている回答文を引用
>If you are the owner of a project setup to use Cloud Build, you can delete it at the bottom of the settings page (Homepage -> Project History -> Settings). Click the "Delete this Project" button. But be warned, deleting a project removes it from ALL services: including Cloud Build, Unity Ads, and Unity Analytics.

簡単に意訳する。
プロジェクトを作った本人であれば、以下の手順でクラウドビルド上から消すことができる。

1. [Dashboard](https://developer.cloud.unity3d.com/projects/)の画面を開く
![unity01.png](https://qiita-image-store.s3.amazonaws.com/0/211753/cf897a27-8d74-1fd7-8ef6-1f2f5b5c9403.png)
<br>

2. 消したいプロジェクトの詳細画面を開いて、[Settings] -> [General] をクリック
![unity02.png](https://qiita-image-store.s3.amazonaws.com/0/211753/1ff2db24-0823-090a-860e-fd4f5b3edefe.png)
<br>

3. Archive this project の欄の [Archive may project for ALL Unity services] ボタンを押す
![unity03.png](https://qiita-image-store.s3.amazonaws.com/0/211753/d8c102a2-7caf-d79c-6f33-5c0851eb1aee.png)
Important以下の文章は、「このボタンを押してプロジェクトを削除すると、Unity Cloudの全てのサービスからプロジェクトが削除される。」という警告。
ボタンを押して実行すれば、Dashboardの再読み込みが始まり、プロジェクトが消えたことが確認できる。
仮想環境のPythonをバージョンアップする

Pythonの仮想環境を構築し、その後Pythonのバージョンが上がった際、どうやって仮想環境のPythonのバージョンを変えるか、うまく記事が見つけられませんでした。

そこで、自分で試した結果を残します。

今回は、`3.6.2`から`3.6.3`へバージョンを上げます。

なお、Windowsで試したので、Macの方はコマンド等の読み替えをお願いします。
PowerShell使用です。

## 環境
|ツール等|バージョン|
|---|---|
|OS|Windwos 10 64bit|
|Python本体|3.6.2|
|Python仮想環境|3.6.2|
|venv|Python本体付属|
|Visual Studio Code|1.18.0|

※VSCodeは動作確認に使用。

## 手順
`venv`を使ってアップデートします。
### 本体のバージョンアップ
まず、ユーザー環境や`Program Files`の下にある、Python本体をバージョンアップします。

インストーラーをダウンロードし、実行するだけです。

![pyupgrade2.PNG](https://qiita-image-store.s3.amazonaws.com/0/15429/8f7eb1b5-2cd7-6690-2a3f-1785cd063919.png)

`Upgrade Now`を選択で良いでしょう。

バージョンを確認します。

![pyver3.6.3.PNG](https://qiita-image-store.s3.amazonaws.com/0/15429/c2eb21f2-0bac-5964-8340-36372859a95a.png)

上がっています。

### 仮想環境のアップデート
まず、仮想環境のバージョンを確認します。

```ps1
python --version
```

により、Pythonのバージョンがわかります。

![pyver-venv3.6.2.PNG](https://qiita-image-store.s3.amazonaws.com/0/15429/ef105e71-453d-4e80-f29e-bea97f06ffb1.png)

上記の通り、3.6.2の状態です。
確認が終わったら、

```ps1
deactivate
```
コマンドで、仮想環境を終了します。

仮想環境のアップデートには、標準で入っている`venv`を使います。
上記の状態で、PowerShellで

```ps1
python -m venv (仮想環境へのパス) --upgrade
```

と入力し、バージョンアップを実行します。

### 成功したか確認
上記で、コマンドを実行しても、**成功したかどうかは表示されない**です。
そのため、再びバージョンを確認します。

仮想環境を起動し、再び`python --version`と入力します。

![pyver-venv3.6.3.PNG](https://qiita-image-store.s3.amazonaws.com/0/15429/955d8388-16e5-8624-10be-c6c6d6fe5a4b.png)

上記のように、更新後のバージョンになっていれば成功です。

## 動作確認
厳密には、インストールしているライブラリを一通り確認すべきですが、動くかどうかだけ確認しました。

![pyvenv.PNG](https://qiita-image-store.s3.amazonaws.com/0/15429/7baea5f7-bb00-8527-0f2c-7d7cce3f59d7.png)

VSCodeで動かした限りだと、動きました。画面下部のバージョンも、3.6.3になっています。

## おわりに
ドキュメントが無い状態でも、案外何とかなりました。
Pythonってわかりやすい、と実感した次第です。
JavaScriptのオブジェクトが空であるかを調べる


`Object.keys()`でキーを取り出し、その数が0であるか調べる。
オブジェクトをハッシュとして扱うときに使う。

```javascript
var obj = {};

if (0 === Object.keys(obj).length) {
    ...
}
```

# 参考

- [javascript - Is object empty? - Stack Overflow](https://stackoverflow.com/questions/4994201/is-object-empty)
JavaScriptで背景色を変更する


element.styleを使う。

```javascript
var input = document.getElementById('foo');

input.style.backgroundColor = 'red';
```

# 参考
- [書籍:徹底マスター JavaScriptの教科書 プログラミングの教養から、言語仕様、開発技法までが正しく身につく](http://amzn.asia/1RP2FYM)
classファイルをコンパイルしたJavaバージョンを調べる方法

Java10まで確認済みです（2018/08/01 現在）。

# コマンド
```sh
javap -v file.class | grep "major version" | awk '{ print $3 - 44 }'
```

# 解説
`javap -v`コマンドで表示されるメジャーバージョンの値は、「サポートclassバージョン」（≠Javaバージョン）らしいです。
classバージョンは「Javaバージョン+44」なので、それを引いてあげればOKです。

Javaが互換性を維持している＝それより前の「サポートclassバージョン」をすべてサポートしている
ということみたいですね。

# 懸念点
Java9よりあとはバージョンの付け方が変わるため、どうなるか不明です。
今後のバージョンのベータ版はいつか出るんしょうかね？

## 2018/03/12 追記
Java10以降のバージョン表記は↓のようになるらしいです。
実際に`java -version`でどのように出るのかはわかりませんが、参考までに。

https://qiita.com/nowokay/items/d9bc4b3f715d17c2830d#322-time-based-release-versioning

# 参考
* [\[Java\] Javaの名前とバージョン](https://qiita.com/yoshi389111/items/3f5e2c7dc19141df6122)
* [Java 10新機能まとめ](https://qiita.com/nowokay/items/d9bc4b3f715d17c2830d#322-time-based-release-versioning)
CakePHP2でWebアプリケーションを作ってみる！！~環境構築編~

# 環境
* Xampp
* Mac
* PHP(5.6.15)

# フレームワーク
* CakePHP2.5.8

# 環境構築
## CakePHPのダウンロード
Mac上にあるphpと、後から入れたXamppのphpが干渉しているというか、コマンドではMac内臓のphpが動いてしまうから、コマンドベースではやらない
###1.ファイルのダウンロード
https://github.com/cakephp/cakephp/releases/tag/2.5.8
↑
このサイトの下の方からcakePHP2.5.8をダウンロード＋解凍する。
###2.ファイル名をプロジェクト名に変更
「cakephp-2.5.8」->「任意のプロジェクト名」
###3.Security.saltを変更
これは初期設定のままじゃいけないようなので変更

	Configure::write('Security.salt', 'DIhG93b0qyJfIxfs2guVoUuabWwvniR2G0FgaC9mi');

	Configure::write('Security.cipherSeed', '768593S96574535424967a49683645');


この２行の値を適当に変更

###4.データベース設定ファイル作成
Configディレクトリに
「database.php.default」というのがあるので、これをコピーして、名前をdatabase.phpに変更
さらに、その中身の設定も自分のデータベースに接続するように変更
go-bindata が awesome-go から削除された

Original: [go\-bindata が awesome\-go から削除された \| tail \-f pinzo\.log](https://pinzolo.github.io/2017/11/13/go-bindata-was-remove-from-awesome-go.html)

---

[Goでファイル系のリソースも一緒にビルドして配布しちゃう\! \- hatappiのブログ](http://hatappi.hateblo.jp/entry/2017/11/11/155336)

こういうエントリがはてブに上がってた。

[Remove go\-bindata by wjkohnen · Pull Request \#1675 · avelino/awesome\-go](https://github.com/avelino/awesome-go/pull/1675)
[Remove go\-bindata \(\#1675\) · avelino/awesome\-go@6cf3360](https://github.com/avelino/awesome-go/commit/6cf33601fc651b4cdd68045d5b6e0a961145953a)
つい先日 go-bindata はメンテナンスされていないという理由で [Awesome Go](https://awesome-go.com/) から削除されたので、今後は使わない方がよいと思う。

じゃあ、何を使えばいいかというと自分の場合は [go\-assets](https://github.com/jessevdk/go-assets) を使用している。
[go\-assets\-builder](https://github.com/jessevdk/go-assets-builder) を使って go ソースを生成し、`Assets.Open` 経由で取得できる。ファイルシステムとしてのインターフェースを持っているので `Read` や `Name` などが直接使えるので便利。

```sh
$ go-assets-builder assets > assets.go
```

```go
f, err := Assets.Open("/assets/template.tmpl")
if err != nil {
  return err
}
defer f.Close()
fmt.Println(f.Name())
```

みたいな感じで使う。
Excel主義者に負け続け

####ASP.NET対Excel。
ASP.NETで作るプロジェクトに参加している。
ASP.NETのプロトタイピングは強力で、コードファーストでデータベーステーブルは作れるわ、スキャフォールディングで基本的なページはできるわと、無敵感が半端ない。こういうのは積極的に使うべきだと思う。

####Excel上司
ところが、使ったことのない人が上にいる。基本設計のとき、画面キャプチャーでやりたいといったら、Excelで書けと言われた。画面キャプチャーだとお客さんが「もうできていると期待する」というのだ。いや、期待はするかもしれんが、ASP.NETで最終的には作るんだから(そうなんでしょう?)最終的に作るものとの齟齬がもっとも少ないじゃないかといいたいが、認められなかった。

####Excel方眼紙
Excelの基本設計は単なるExcel方眼紙の落書きで、ASP.NET標準のアコーディオンメニュー、一覧、その他ことごとくASP.NETとかけ離れている。ASP.NETの機能はリッチなので、それをExcel方眼紙で再現するのは困難。画面をキャプチャーして貼るのに較べて途方もなく時間がかかる。セル結合とか、もうありえない。
ASP.NETなら、画面に描いたものは、CodeFirstでデータベーステーブルまで作れる。作ったテーブルは、A5S2でテーブル定義書にもできる。鼻歌交じりだ。これが、Excelでは無理。何日もかかる。とても再現できなかった。ASP.NETとはかけ離れた基本設計書ができた。不安がよぎった。これをASP.NETに戻すことができるのだろうか。

####mock up
詳細設計フェーズで、プレゼンテーション用のmock upを作成することになった。プロトタイプはASP.NETで作ってあるが、客先にVisual Studioをインストールすることはできないので、htmlにしてほしいとのこと。
htmlで保存すると、htmlでは動作しないので、操作できるようにしてほしいとリクエスト。それは(あまりくわしくないが)JavaScriptで書く必要がありそう。
さらに、mockはASP.NETの標準機能を使っているが、基本設計のExcel方眼紙に合わせろとのこと。
それは難しい。cssとかを全部剥ぎ取ることになる。

####html+JavaScript
結局html(+JavaScript)でスケルトンを作ることになった。
これで2度、ASP.NETから離れた。
cssをはぎ取った、ほとんどゼロから書いたhtml。ASP.NETで書いても無駄。・・・。


####負け続け
今後、実装ということになるが、このままだとASP.NETから、標準機能をすべて剥ぎ取り、デザインも自前で行う必要ありそう。
こういうやりかたは、ASP.NETを使っていなくて、工数ばかり増やしているように思える。基本仕様をExcel方眼紙、モックアップをhtmlとjava scriptで書いて、本番はASP.NETの標準機能から、Excel方眼紙にあわせて実装するのだ。
なんかすごく負け続けている気がする。

それで毎日みんな遅くまで残業していて、文句をいわれている。いや、そんな、Excel使っているからじゃないのか?
それってわたしの責任なのだろうか。
IBM Cloud Consoleで特定のリージョンにアクセスする

~~~
この方法は2020年頃より利用できなくなっています。 
コンソール画面にリージョンを指定してアクセスする手段はなくなりました。
~~~

# IBM Cloudのコンソールはグローバル・コンソール

IBM Cloud のWebコンソールは2017/7よりグローバル・コンソールと呼ばれる、全リージョンで共通のコンソール画面に移行しました。全世界のユーザーが同じコンソールのURLにアクセスしますが、実際には最寄りのリージョンで稼働するコンソールにアクセスしているようです。日本のユーザーの場合には東京リージョンにアクセスしていることがほとんどのようです。

各リージョンごとにコンソールは独立して稼働しているので、グローバル・コンソールへアクセスして問題がある場合には他のリージョンのコンソールにアクセスしてみると稼働するようなケースもあります。日本のお客様の場合には東京リージョンにアクセスしているケースがほとんどなので、ダラスやシドニーにアクセスしてみるといいでしょう。


# 各リージョンのコンソールのURL

- IBM Cloud 東京リージョンのコンソール [(https://tok02.console.cloud.ibm.com)](https://tok02.console.cloud.ibm.com)

- IBM Cloud ダラス・リージョンのコンソール [(https://dal10.console.cloud.ibm.com)](https://dal10.console.cloud.ibm.com)

- IBM Cloud ワシントンDCリージョンのコンソール [(https://wdc07.console.cloud.ibm.com)](https://wdc07.console.cloud.ibm.com)

- IBM Cloud ロンドン・リージョンのコンソール [(https://lon04.console.cloud.ibm.com)](https://lon04.console.cloud.ibm.com)

- IBM Cloud シドニー・リージョンのコンソール [(https://syd01.console.cloud.ibm.com)](https://syd01.console.cloud.ibm.com)

- IBM Cloud フランクフルト・リージョンのコンソール [(https://fra02.console.cloud.ibm.com)](https://fra02.console.cloud.ibm.com)

- (参考) IBM Cloud グローバル・コンソール [(https://cloud.ibm.com)](https://cloud.ibm.com)
C#:逆ポーランド記法を利用した数式の計算(3) ReversePolishNotationクラスを改良する


[前回](https://qiita.com/gushwell/items/58572bcff11315d77738)は、数式をトークンに分解するクラスを作成しました。 このトークンは、最終的には並び順を変えて、ReversePolishNotationオブジェクトとして組み立てる必要があります。

## 記事一覧

[逆ポーランド記法を利用した数式の計算(1) 逆ポーランド記法の計算](https://qiita.com/gushwell/items/a40f4119a35a1e6d7622)
[逆ポーランド記法を利用した数式の計算(2) 数式をトークンに分割する](https://qiita.com/gushwell/items/58572bcff11315d77738)
[逆ポーランド記法を利用した数式の計算(3) ReversePolishNotationクラスを改良する](https://qiita.com/gushwell/items/1f58e270a5430bcc5dba) ← 当記事
[逆ポーランド記法を利用した数式の計算(4) Contextクラスを定義する](https://qiita.com/gushwell/items/03ed3063e9eacef84695)
[逆ポーランド記法を利用した数式の計算(5) Interpreterパターンで数式を解析する](https://qiita.com/gushwell/items/f598ee4c3e3f1a22604b)
[逆ポーランド記法を利用した数式の計算(6) 最後の仕上げ](https://qiita.com/gushwell/items/b2649335392fd366a691)


## 第1回目に示したReversePolishNotation

[第1回目](https://qiita.com/gushwell/items/a40f4119a35a1e6d7622)で作成したReversePolishNotationでは、コンストラクタで、逆ポーランド記法で書かれた数式(文字列)を受けとる仕様でした。

そのクラスを再度掲載します。

```csharp
public class ReversePolishNotation {
    public IEnumerable<string> Tokens { get; }

    public ReversePolishNotation(IEnumerable<string> tokens) {
        Tokens = tokens.ToList();
    }

    public ReversePolishNotation(string exp) {
        var tokens = exp.Split(' ')
                        .Where(s => s != "");
        Tokens = tokens.ToList();
    }
}
```

## ReversePolishNotationを改良する

しかし、実際には取り出したトークンを並び変えて、一つ一つReversePolishNotationオブジェクトに追加していく必要があります。 ということで、Addメソッドを追加します。

せっかくなので、コンストラクタはそのまま残すことにします。

で書き換えたのが以下のコード。

```csharp
public class ReversePolishNotation {
    private List<string> _tokens = new List<string>();

    public IEnumerable<string> Tokens => _tokens;


    public ReversePolishNotation(string exp = "") {
        var tokens = exp.Split(' ').Where(s => s != "");
        _tokens = tokens.ToList();
    }

    public void Add(string token) {
        _tokens.Add(token);
    }

    public override string ToString() {
        return String.Join(" ", Tokens.ToArray());
    }
}
```
   
ついでに、内部で保持しているTokensリストの内容を簡単に確認できるように、ToString()メソッドをoverrideしています。

## ReversePolishNotationのテストプログラムを書いてみる

テストコード書くまでもない単純なクラスですが、ReversePolishNotationのテストプログラムを書いてみます。


```csharp
class Program {
    static void Main(string[] args) {
        TestReversePolishNotation();
    }

    private static void TestReversePolishNotation() {
        var rpn = new ReversePolishNotation();
        rpn.Add("4");
        rpn.Add("2");
        rpn.Add("+");
        rpn.Add("15");
        rpn.Add("3");
        rpn.Add("+");
        rpn.Add("*");
        Console.WriteLine(rpn.ToString());
    }
}
```

### 実行結果
```
4 2 + 15 3 + *
```

ちゃんと、追加できているようです。

([続く](https://qiita.com/gushwell/items/03ed3063e9eacef84695))...

---
この記事は、Gushwell's C# Programming Pageで公開したものを加筆・修正したものです。