OmniAICreator/Qiita-1.07M huggingface dataset:
等しいものと等しくないものが全てではない

# 5 - 2 = 2 ?

users という5行のレコードを含むテーブルがあり、整数列 age の値が 20 と等しいレコードが2行だったとする。

```
mysql> select count(*) from users;
+----------+
| count(*) |
+----------+
|        5 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from users where age = 20;
+----------+
| count(*) |
+----------+
|        2 |
+----------+
1 row in set (0.00 sec)
```

このとき、age の値が 20 と等しくないレコードは何行でしょうか？

`5行 - 2行 = 3行`だと期待して、where の条件を `age <> 20` として試すと、

```
mysql> select count(*) from users where age <> 20;
+----------+
| count(*) |
+----------+
|        2 |
+----------+
1 row in set (0.00 sec)
```

と期待通りにならない場合がある。　

# 解説

select where では、where の条件が真になった行、例えば

```
mysql> select 20 = 20;
+---------+
| 20 = 20 |
+---------+
|       1 |
+---------+
1 row in set (0.00 sec)
```

あるいは

```
mysql> select 18 <> 20;
+----------+
| 18 <> 20 |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)
```

のような行を抽出する。一方で除外されるのは、条件が偽の行

```
mysql> select 18 = 20;
+---------+
| 18 = 20 |
+---------+
|       0 |
+---------+
1 row in set (0.00 sec)

mysql> select 20 <> 20;
+----------+
| 20 <> 20 |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)
```

だけでなく、null の行も除外される。

null と整数を比較すると、等しいかわからない、等しくないかわからないということで

```
mysql> select null = 20;
+-----------+
| null = 20 |
+-----------+
|      NULL |
+-----------+
1 row in set (0.01 sec)

mysql> select null <> 20;
+------------+
| null <> 20 |
+------------+
|       NULL |
+------------+
1 row in set (0.00 sec)
```

のどちらも null になるので、`age is null` なレコードは where の条件が `age = 20` でも `age <> 20` でも除外されて、最初に書いた挙動になっていた。

こういう論理を3値論理と呼ぶとのこと。真か偽かの2値論理を想定して使ってしまうと落とし穴にはまることがあるので注意が必要。この話は書籍「SQLアンチパターン」の13章で紹介されていて、他には null と文字列を連結する場合の話も書かれています。

# サンプルデータ

例として使ったテーブルは以下のようなもの。MySQL 5.7.16 で動作確認しました。

```
mysql> show create table users;
+-------+--------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                       |
+-------+--------------------------------------------------------------------------------------------------------------------+
| users | CREATE TABLE `users` (
  `name` text NOT NULL,
  `age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+--------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from users;
+----------+------+
| name     | age  |
+----------+------+
| foo      |   18 |
| bar      |   20 |
| amnesiac | NULL |
| john     |   20 |
| mary     |   18 |
+----------+------+
5 rows in set (0.00 sec)
```
【入門編】VirtualBox でホストOS(mac)から ゲストOS(主にCentOS)へ共有フォルダを作成する方法

## VirtalBox Guest Additions のインストール

### 開発ツールのインストール

Guest Additionsをコンパイルするのに必要な開発ツールを入れたら一度再起動する

```bash:
yum install -y bzip2 gcc make kernel-devel kernel-headers dkms gcc-c++
shutdown -h now
```

### バージョン確認

VirtualBox のバージョンと同じバージョンの Guest Additions の iso をダウンロードしてマウントする

ホストOS側(mac)で確認する

```bash:
[ookubo@macbook ~]$ VirtualBox --help
Oracle VM VirtualBox Manager 5.1.12
```

今回は `5.1.12` が対象

### ゲストOS側(CentOS)

```bash:
curl http://download.virtualbox.org/virtualbox/5.1.12/VBoxGuestAdditions_5.1.12.iso -o VBoxGuestAdditions_5.1.12.iso
mount -t iso9660 -o loop VBoxGuestAdditions_5.1.12.iso /media
export KERN_DIR=/usr/src/kernels/3.10.0-514.2.2.el7.x86_64/
sh /media/VBoxLinuxAdditions.run
```

`3.10.0-514.2.2.el7.x86_64` は、環境によりバージョンが異なるので適宜編集する

## 共有フォルダーの設定
<img width="782" alt="02c801da31debef07f4d440a4a3bb755.png" src="https://qiita-image-store.s3.amazonaws.com/0/9467/0df50e91-2057-6aae-795c-1213a18208a8.png">

VirtualBox の設定から共有フォルダー >> 追加アイコンから下記の様に入力する

![共有フォルダ追加](https://qiita-image-store.s3.amazonaws.com/0/9467/66218189-10d5-debc-ba4b-856c48bb09d4.png)

```text:
フォルダーのパス(ホストOS側): /Users/ookubo/guest_shared/
フォルダー名(ゲストOS側): guest_shared
読み込み専用: チェック外す
自動マウント: チェックする
永続化する: チェックする
```

`/Users/ookubo` と `guest_shared` の箇所は、自分の好きなフォルダー名で構いません

「OK」で設定したら、ゲストOSでマウントを実行する

```bash:
mkdir /guest_shared
mount -t vboxsf guest_shared /guest_shared
```

## ファイルを作成して確認する

ホストOS側(mac)で、適当にファイルを作成する

`touch ~/guest_shared/test.txt`

ゲストOS側(centos)で、ファイルが参照できるか確認する

```bash:
[root@localhost ~]$ ls -alp /guest_shared/
合計 12
drwxr-xr-x   1 root root  136  1月 14 00:34 ./
drwxr-xr-x. 19 root root 4096  1月 14 00:27 ../
-rw-r--r--   1 root root    0  1月 14 00:34 test.txt
```

後はホストOS・ゲストOS側でそれぞれ読み書きして、更新が同期されているか確認する

### 余談で apache で使用する HTML ファイルを共有できるようにしてみる

一度アンマウントして、マウント時に読み書きするユーザに apache を指定する

```bash:
umount -t vboxsf guest_shared
mount -t vboxsf -o uid=$(id apache -u),gid=$(id apache -g) guest_shared /guest_shared
```

vi などで apche の設定ファイルを編集して、 `DocumentRoot` を共有フォルダーのマウント先にする
既存の `DocumentRoot` はコメントアウトして、`<Directory>` ディレクティブを、追記します

```text:/etc/httpd/conf/httpd.conf
#DocumentRoot "/var/www/html"
DocumentRoot "/guest_shared"

<Directory "/guest_shared">
    Require all granted
</Directory>
```

#### テスト用の index.html を作成する

```html:/guest_shared/index.html
<html><body>Hello World</body></html>
```

#### apche の設定を再読みします

`systemctl reload httpd`


#### ゲストOS側で index.html が取得できるか確認する

```
[root@localhost ~]# curl http://127.0.0.1
<html><body>Hello World</body></html>
```

後は index.html をホストOS側で sublime などを使って手軽に編集する

※実際の本番環境などで実行する人はいないと思いますが、セキュリティ的にもパフォーマンス的にもザルなので気をつけてください、あくまでも練習用です
TensorFlowで input:100, output:100のネットワークでの学習を検討 v0.2 > csvファイル出力追加

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
```

v0.1 http://qiita.com/7of9/items/8b43357bcaea1f1bce4b

## v0.2

- csvファイル出力追加
  - 関連してcalcOutput()をnumpy.arrayにて出力するように変更

参考: http://qiita.com/richi40/items/6b3af6f4b00d62dbe8e1

### code

Jupyterコード

```py:in100_out100.ipynb
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

'''
v0.2 Jan. 14, 2017
  - sa() return in numpy.array
  - add saveToCsvFile()
v0.1 Jan. 14, 2017
  - add calcOutput()
  - add showIn2D()
  - show 1d in 2d format
'''

'''
codingrule:PEP8
'''

XDIM = 10
YDIM = 10
INDIM = XDIM * YDIM


def saveToCsvFile(data_1d, filename):
    wrk_1d = data_1d.reshape(1,INDIM)
    np.savetxt(filename, wrk_1d, delimiter=',')

def calcOutput(in_1d):
    len_1d = XDIM * YDIM
    out_1d = [0.0] * len_1d
    for idx in range(0, in_1d.size):
        out_1d[idx] = in_1d[len_1d - idx - 1]
    return np.array(out_1d)


def showIn2D(data_1d):
    # print(data_1d)
    data_2d = np.reshape(data_1d, (XDIM, YDIM))
    plt.imshow(data_2d, extent=(0, XDIM, 0, YDIM), cmap=cm.gist_rainbow)
    plt.show()

if __name__ == '__main__':
    in_1d = np.random.rand(INDIM)
    showIn2D(in_1d)
    out_1d = calcOutput(in_1d)
    showIn2D(out_1d)
    saveToCsvFile(in_1d, 'test_in.csv')
    saveToCsvFile(out_1d, 'test_out.csv')
```

### 結果

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/5ba2a7dd-bdb4-4b59-0139-73f71306f805.png)

```
$ cut -c 1-200 test_in.csv 
3.757247572810928915e-04,2.261566444672071796e-01,5.665968126413482020e-01,5.869499141590118763e-01,6.474665738698877071e-01,8.782973384764291014e-01,9.808027016657328012e-01,9.172719111087710431e-01,
```

```
$ cut -c 2300-2500 test_out.csv 
,9.172719111087710431e-01,9.808027016657328012e-01,8.782973384764291014e-01,6.474665738698877071e-01,5.869499141590118763e-01,5.665968126413482020e-01,2.261566444672071796e-01,3.757247572810928915e-04
```
フォントが原因でVisualStudioのアップデートが失敗する

#現象
VisualStudio2015上のアップデートからをUpdate3に変更しようとしたところ、エラーが出て終了。

```
セットアップ中に問題が検出されました。
以下をクリックして、解決策を確認し、セットアップ　エクスペリエンスの向上にご協力ください
```

Microsoftのホームページからアップデートをダウンロードして実行しても同様の現象。

「源ノ角ゴシック（Source Han Sans）」をインストールしていたのが原因だったよう。
VisualStudioで使用をやめても変化はなく、フォント自体をアンインストールして初めて解決した。
他でこのフォントを使用していたとも思えないが、原因不明。

[Visual Studio 2015 をインストール開始早々に「セットアップ中に問題が検出・・・」エラーが出る](http://qiita.com/flat9th/items/92900b38974e675e9510)
[Visual Studioのインストール中に﻿「セットアップ中に問題が検出されました。」と表示された場合の対処法](https://www.mirucon.com/2015/11/20/visual-studio-installer-failed/)
を参考にさせて頂きました。

#環境
VisualStudio2015 Update2⇒3
Windows10
LinuxでTBS6205を使う

# 概要
LinuxでDVB-C対応チューナー[TBS6205](http://www.tbsdtv.com/products/tbs6205_dvb_t2_quad_tuner_pcie_card.html)を使用してフレッツ・テレビのチャンネルスキャンを行ないます。

# 動作環境
|  項目   |  詳細   |
|:------:|:-------:|
| OS     | Getoo Linux  |
| Kernel | 4.4.39-gentoo |
| チューナ | TBS6205 |
| DVBドライバ | [TBS linux open source drivers](https://github.com/tbsdtv/linux_media/wiki) |

# 準備
必要なツールを準備します。

```
# emerge patchutils Proc-ProcessTable =v4l-utils-1.10.1
# git clone https://github.com/KouCo/dtv-jp-tools
# git clone https://github.com/KouCo/v4l-utils-jp
# cd v4l-utils-jp
# ./bootstrap.sh
# ./configure --disable-doxygen-doc --disable-doxygen-dot --disable-libv4l --disable-v4l2-compliance-libv4l --disable-v4l2-ctl-libv4l --disable-qv4l2 --enable-gconv --without-jpeg
# make
# cd contrib/gconv/
# make install
# echo "GCONV_PATH=/usr/local/lib/gconv" > /etc/env.d/99gconv
# env-update
# source /etc/profile
# cd ../../../
```

# TBS6205ドライバのインストール
「TBS linux open source drivers」をダウンロードします。

```
# git clone https://github.com/tbsdtv/media_build.git
# git clone --depth=1 https://github.com/tbsdtv/linux_media.git -b latest ./media
```

「TBS linux open source drivers」ではBandwidthがあっておらずパケットのドロップやエラーが発生するため、パッチを当てます。

```
# cd media
# patch -p1 < ../dtv-jp-tools/patches/tbs6205-fletsTV-sky.patch
# cd ../
```

下記の設定で、ドライバのビルド及びインストールをします。
詳細は[LinuxTVのDVBドライバをビルド](http://qiita.com/KouCo/items/0d7f2b49751125939679)を参照してください。

```
<M> Multimedia support  --->
    [*]   Digital TV support
    [*]   Dynamic DVB minor allocation
    [*]   Enable DVB demux section packet loss log
    [*]   Media PCI Adapters  --->
        <M>   TBS ECP3 FPGA based cards
    [*]   DVB platform devices  ----
    [ ]   Autoselect ancillary drivers (tuners, sensors, i2c, spi, frontends)
    Customize TV tuners  --->
        <M> Silicon Labs Si2157 silicon tuner
    Customise DVB Frontends  --->
        <M> Silicon Labs Si2168
```

ファームウェアのインストール

```
# wget http://www.tbsdtv.com/download/document/linux/tbs-tuner-firmwares_v1.0.tar.bz2
# tar axvf tbs-tuner-firmwares_v1.0.tar.bz2 -C /lib/firmware/
```

# チャンネルスキャン

```
# ./v4l-utils-jp/utils/dvb/dvbv5-scan -C JP -a 0 -N -T 5 -o ./fletTV-sky.conf ./dtv-jp-tools/dtv-scan-tables-jp/jp-fletsTV-sky
```
Jupyter / matplotlib > 15x15のデータ > 拡大表示されるようだ / TensorFlowで input:100, output:100のネットワークでの学習を検討 v0.1

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
```

TensorFlowを使って、input:100, output:100程度のネットワークの学習をしようかと検討中。

学習用データとして、入力データを「反転する」処理を実装してみた。


### Jupyterのコード

```py:in100_out100.ipynb
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

'''
v0.1 Jan. 14, 2017
  - add calcOutput()
  - add showIn2D()
  - show 1d in 2d format
'''

'''
codingrule:PEP8
'''

XDIM = 15
YDIM = 15


def calcOutput(in_1d):
    len_1d = XDIM * YDIM
    out_1d = [0.0] * len_1d
    for idx in range(0, in_1d.size):
        out_1d[idx] = in_1d[len_1d - idx - 1]
    return out_1d


def showIn2D(data_1d):
    # print(data_1d)
    data_2d = np.reshape(data_1d, (XDIM, YDIM))
    plt.imshow(data_2d, extent=(0, XDIM, 0, YDIM), cmap=cm.gist_rainbow)
    plt.show()

if __name__ == '__main__':
    in_1d = np.random.rand(XDIM*YDIM)
    showIn2D(in_1d)
    out_1d = calcOutput(in_1d)
    showIn2D(out_1d)
```

### 結果 (15x15)

入力ノードが(15x15 = 225)の場合。
縦横方向に自動的に拡大表示されるようだ。これは便利。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/1a57b80b-a259-3f04-dc9b-651d534aa7c3.png)

### 結果 (1000x1000)

入力ノードが(1000x1000 = 1million)の場合。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/a6043ee0-4748-f80a-02f9-f254cd4c3d34.png)
iOSで撮影した動画をAdobe Premiereに読み込んで音ズレが発生したら

## このページについて
iOSで撮影した比較的長尺の動画(例：10分くらい)をそのままPremiereに読み込ませて再生すると、最初の方は問題ないが、動画が後半になるに従い音ズレを感じてくるようになるので、この解決方法について記述する。

※ちなみに環境はMacOS X(El Capitan) / Adobe Premiere CC 2017リリース(ビルド11.0.0(154))での話

## 方法
1.「MOV」拡張子を「mp4」に変更する
2. 拡張子を変更したファイルをPremiereに読み込ませる

すると、「MOV」拡張子の時は30.00fpsだったフレームレートが、「mp4」拡張子だと29.97fpsになる。これでPremiere上で再生すると音ズレがなくなる。
## 補足事項
Webに落ちている情報を見ると、movもmp4もベースは同じっぽいのですが、本事象の原因などは知りません。誰か教えてください。
Windowsでlibeventでopensslと連携するには

# 安定版のlibevent 2.0.xだとダメ

安定版のlibevent 2.0.xではWindowsだとopensslの
サポートが外されているようでした。

```c
bufferevent_openssl_get_ssl
```

などが、使えません。

# 対応策

git cloneしてlibeventの最新版を使う

# 関連記事

- [Windows 10でMSVCでnghttp2のサンプルを動かす](http://abrakatabura.hatenablog.com/entry/2017/01/14/072846)
Python > [[0.0], [0.0], [0.0], [0.0], [0.0]]を簡略表記する > [[0.]]*5 > ***やってはいけない*** / Pythonインタープリタがプログラムを解釈しながら値や変数をメモリに展開していく様子を作図していただきました / 内包表記

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
```

```test_list1.py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

alist = [[0.], [0.], [0.], [0.], [0.]]
print(alist)
blist = [[0.]]*5
print(blist)
```

```txt:結果
[[0.0], [0.0], [0.0], [0.0], [0.0]]
[[0.0], [0.0], [0.0], [0.0], [0.0]]
```

~~過去に記事へのコメントで教えていただいた。
その記事がどれだったか検索できない。。。~~

記憶に基づくと間違いをします、という例でした。

@shiracamus さんに[コメントいただいたように](
http://qiita.com/7of9/items/d03d099b400d9a067086/#comment-23dc54f7194e6415b061)**<font color=red>やってはいけない</font>**書き方でした。


他の方法は要調査。

## v0.2

```py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

# blist = [[0.]]*5  # *** mistake ***
blist = [[]]*5
print(blist)
for idx in range(0, 5):
    blist[idx] = [0.]
print(blist)
blist[0][0] = 123.456
print(blist)
```

```txt:結果
$ python test_list3.py 
[[], [], [], [], []]
[[0.0], [0.0], [0.0], [0.0], [0.0]]
[[123.456], [0.0], [0.0], [0.0], [0.0]]
```

まだ間違いがある可能性はあります。

### 検索用キーワード
(追記 2018/01/23)

- List comprehension
Oracle Database の DUMP関数 と CONVERT関数 で 文字列のバイトコードを調べる。

はてぶコメントで

【「野球」に対応するEUC文字コードは「cceeb5e5」なのが判らん。】

と頂いたので、書くやで彡(ﾟ)(ﾟ)

文字コードのバイトコードは、Oracle Database だと DUMP関数 で
確認できます。AL32UTF8環境で「野球」のバイトコードを調べると
↓(e9878ee79083)のようになります。

```sql
SET LINESIZE 170
SET PAGESIZE 100
COLUMN PARAMETER FORMAT A30
COLUMN VALUE FORMAT A30
SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER LIKE '%CHARACTERSET%';

PARAMETER                      VALUE                              CON_ID
------------------------------ ------------------------------ ----------
NLS_CHARACTERSET               AL32UTF8                                0
NLS_NCHAR_CHARACTERSET         UTF8                                    0

-- '野球' の AL32UTF8 の バイトコード
SELECT DUMP('野球', 16) FROM DUAL;

DUMP('野球',16)
-------------------------------
Typ=96 Len=6: e9,87,8e,e7,90,83
```

文字コードの変換はCONVERT関数で出来るので、CONVERT関数と
DUMP関数を組み合わせると「野球」のバイトコードが確認できます。

```sql
-- '野球' の JA16EUC の バイトコード
SELECT DUMP(CONVERT('野球', 'JA16EUC' , 'AL32UTF8'), 16) FROM DUAL;

DUMP(CONVERT('野球','JA1
------------------------
Typ=1 Len=4: cc,ee,b5,e5

-- '野球' の JA16SJIS の バイトコード
SELECT DUMP(CONVERT('野球', 'JA16SJIS', 'AL32UTF8'), 16) FROM DUAL;

DUMP(CONVERT('野球','JA1
------------------------
Typ=1 Len=4: 96,ec,8b,85
```

「野球」に対応するバイトコードは、JA16EUCだと「cceeb5e5」、
JA16SJISだと「96ec8b85」なのが判るやで！

野球元年や！彡(ﾟ)(ﾟ) (しつこい) マニュアルは↓やで。

* Oracle Database SQL言語リファレンス 12cリリース1 (12.1) B71278-10<BR>
DUMP
http://docs.oracle.com/cd/E57425_01/121/SQLRF/functions063.htm#i77278
<BR>CONVERT
http://docs.oracle.com/cd/E57425_01/121/SQLRF/functions041.htm#i77037
技術英語 > Well, I'm sorry I don't live up to his expectations. / Expected value / a six-sided dice

@ Star Trek Voyager > THE THAW

相手の要求に答えることができなかったことについてJanewayが

> Well, I'm sorry I don't **<font color=red>live up to his expectations</font>**.

人に期待して、それがかなわないという愚痴を言う人がいる。
最初から(in the first place)期待せず、結果的に「あれもできたのか」と思う方がいい、と思う。

<hr>
関連して思い出したのは、統計で出てくる Expected value

調べてみた
https://en.wikipedia.org/wiki/Expected_value

> In probability theory, the expected value of a random variable, intuitively, is the long-run average value of repetitions of the experiment it represents. For example, the expected value in rolling **<font color=red>a six-sided dice</font>** is 3.5, because the average of all the numbers that come up in an extremely large number of rolls is close to 3.5.

意訳 「6面のサイコロ」

(1+2+3+4+5+6)/6 = 3.5

諸刃の剣はdouble edged sword
http://ejje.weblio.jp/content/double-edged+sword
C++でアライメントを意識したので覚書

#はじめに
初めてC++に触れてから約4年。
恥ずかしながら初めてアライメントを意識したので、覚書としてまとめておきます。

#なぜ意識したか
八分木による空間分割を実装していた時の話です。
静的に分割を行うと常時 **空間数(約240k)*クラスサイズB** のメモリが必要になりました。
そのためクラスサイズを落とせないか考えるうちに、意識した次第です。

#アライメントとは
>記憶装置にデータを書き込む際、書き込むデータの大きさや先頭の位置（アドレス）を、装置の管理単位の整数倍になるように調節すること。例えば、4バイト単位でメインメモリを管理してるコンピュータで、メモリ上に置くデータの先頭アドレスが4の倍数になるように調節する。こうすることで、装置がデータの読み書きを効率良く行うことができるようになり、処理効率の向上が見込める。※1

だそうです。
これを意識しないと、無駄な領域を発生させてしまいます。

#アライメントを意識しないと
```
class A // 4B
{
	A* pA;
};

class B // 8B
{
	bool hoge;
	bool foo;
	B* pB;
};

class C // 12B
{
	bool hoge;
	c* pC;
	bool foo;
};
```
BとCの内容は同じですが,Cにパディングが挿入され4バイト無駄にしています。※2
これが既述の八分木で起きた場合、約10MBもの無駄が発生してしまいます。
これを抑えるために、**アライメントを意識してメンバを並べなければいけません。**


#アライメントを意識する上で必要なこと
パディングが挿入されないように並べるためには、データのサイズを知っておく必要があります。
全ての型のサイズを覚えるのは厳しいので、有名所を書いておきます。
**64bitCpu:VisualStudio2015:x86環境で実行しています**
・組み込み型

| 型| サイズ(バイト) |
|:-----------|------------:|
| int       |                 4 |
|unsigned int       |         4 |
| char       |                1 |
| unsigned char       |       1 |
| short       |               2 |
| unsigned short       |      2 |
| __int64       |             8 |
| bool       |                1 |
| float       |               4 |
| double       |              8 |

・参照
参照のサイズに付いては[別の記事](http://qiita.com/yz2cm/items/927c562d0835bf01d0c9)で書かれていました。
ポインタのサイズと同等と考えて良さそうです。


・ポインタ
ポインタはx86の場合4バイト、x64の場合8バイトです。

・コンテナ

| 型| サイズ(バイト) |
|:-----------|------------:|
| list       |                12|
|vector       |               16|
| deque       |                20 |
| forward_list     |       8 |
| map       |               12 |
| unordered_map       |      40 |
| unordered_set       |             40 |
| array       |                要素サイズ*要素数|

デフォルトテンプレート引数を変更しない場合の数値です。

・その他

| 型| サイズ(バイト) |
|:-----------|------------:|
| string       |                 28 |
|shared_ptr       |                  8 |
| function       |                40 |
| system_clock      |       1 |
| thread       |               8|
| mutex       |      48 |
| type_index       |             4 |

#まとめ
数バイトですが無駄な領域です。
プロジェクト全体となれば結構な量になるはずです。
細かいことですが、気にかけてみては如何でしょうか？

### 註釈
※1 知的快楽主義者の備忘録 Wiki様 
http://wikiwiki.jp/takemaster/?IT%CD%D1%B8%EC%2F%A5%A2%A5%E9%A5%A4%A5%E1%A5%F3%A5%C8%20%A1%DA%20alignment%20%A1%DB%20%A5%A2%A5%E9%A5%A4%A5%F3%A5%E1%A5%F3%A5%C8

※2 64bitCpu、VisualStudio2015でx86環境で実行しています。

今回のプロジェクトは[ここ](https://github.com/Himatyu/Qiita/tree/master/MeasurementC%2B%2B)で公開しています。
non-jQuery でカレンダー生成スクリプトを書いてみた

Teratailの質問に 「[Javascript ==再度【カレンダー】の作成に](https://teratail.com/questions/61908)」を見つけて、コード書いてみたんですが、質問文を読むと回答する気が無くなったので、ここに。

```html
<!DOCTYPE HTML>
<html lang="ja">
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>

		<div id="calendar"></div>

		<script type="text/javascript">
			function calendar(element, y, m) {

				var weeks = ['日', '月', '火', '水', '木', '金', '土'];

				var start_dt = new Date(y, m - 1, 1);
				start_dt.setDate(start_dt.getDate() - start_dt.getDay());
				var end_dt = new Date(y, m, 0);
				end_dt.setDate(end_dt.getDate() + (7 - end_dt.getDay()));

				var table = document.createElement('table');
				element.appendChild(table);

				var caption = document.createElement('caption');
				caption.innerHTML = y + '/' + m;
				table.appendChild(caption);

				var thead = document.createElement('thead');
				table.appendChild(thead);

				var tr = document.createElement('tr');
				thead.appendChild(tr);
				for (var i in weeks) {
					var th = document.createElement('th');
					th.innerHTML = weeks[i];
					tr.appendChild(th);
				}

				var tbody = document.createElement('tbody');
				table.appendChild(tbody);

				while (start_dt < end_dt) {
					if (start_dt.getDay() === 0) {
						var tr = document.createElement('tr');
						tbody.appendChild(tr);
					}
					var td = document.createElement('td');
					td.innerHTML = start_dt.getDate();
					tr.appendChild(td);

					start_dt.setDate(start_dt.getDate() + 1);
				}
			}

			calendar(document.getElementById('calendar'), 2017, 1);
		</script>
	</body>
</html>
```
機械学習論文読みメモ_24


[Generalized Direct Change Estimation in Ising Model Structure](http://www.jmlr.org/proceedings/papers/v48/fazayeli16.pdf), ICML2016
P次元イジングモデルにおける変化を推測する手法を提案する。
この変化は構造的である事を想定して、それは例えばsparse、block sparse、node-perturbed sparseといった構造である。
このような構造はatomic normを用いて制約として最適化問題に取り入れて利用する事ができる。
Atomic normはある構造、例えば1-to-K sparse vector、に対してその凸包、例えばL1ノルム、を用いて制約として用いればある精度においてその構造制約を取り入れる事を可能にする一般的なノルム制約のフレームワークである。
本論ではこうした構造単位の変化、atomic-normの制約を取り入れた推測器を用いる事で直接推定する事を可能にする。
このときの推測誤差は、２つのデータのsample complexity、内包している構造のサイズ（数？）、に関連して決まってくる。

[Guided Cost Learning: Deep Inverse Optimal Control via Policy Optimization](https://arxiv.org/pdf/1603.00448.pdf), ICML2016
Inverse optimal control(IOC)が扱う問題として、人間のデモンストレーションを与える事で機械に最適化すべきコスト関数を学習させる問題がある。
この問題では、事前に有用な特徴量や、適切な制約を与えてコスト関数の構造を限定させてやる必要がある事、また不明かつ高次元な環境下でそのコスト関数を適切に最小化する必要がある。
本論では、この手間を回避するために、前者の問題に対してはNNモデルを導入する事で任意の非線形コスト関数を学習可能にする。
後者の問題に関しては、maximum entropy IOCの枠組みに沿った形でその効率的なサンプルベースの近似手法を提案する。
Maximum entropyベースの手法は、教師データがsuboptimalな場合にも利用可能なモデルを利用する手法である。

[Dropout as a Bayesian Approximation: Representing Model Uncertainty in Deep Learning](https://arxiv.org/pdf/1506.02142.pdf), ICML2016
Deep learning手法はモデルのuncertaintyを扱うことができないものが主である。
対して、bayesian modelはuncertaintyを扱えるが、計算コストの面で難があることが多い。
本論では、dropoutをdeep gaussian processにおけるベイズ推論として捉えるための理論的なフレームワークを提供する。
dropoutはモデルの重みのintegrationとして捉えることができる。
そしてdropoutを用いたNNの学習はdeep gaussian modelにおけるbayesian inferenceとなる事を理論的に示し、また実際にuncertaintyを測るための手法を提案する。
supersetをsystemdで動作させる


[superset](https://github.com/airbnb/superset)を起動するときにデーモンとして起動するオプションがなかったのでsystemdで起動する方法をまとめました。
インストールなどは[こちら](http://airbnb.io/superset/installation.html)を参照して進めました。


# Unitファイルの作成
```/etc/systemd/system/superset.service
[Unit]
Description=superset
Requires=network-online.target
After=network-online.target

[Service]
EnvironmentFile=-/etc/sysconfig/superset.conf
Restart=on-failure
ExecStart=/bin/superset runserver -p $PORT -w $WORKERS
ExecReload=/bin/kill -HUP $MAINPID
KillSignal=SIGINT

[Install]
WantedBy=multi-user.target
```

# 設定ファイルの作成
```/etc/sysconfig/superset.conf
PORT=8080
WORKERS=2
```

# 反映
`systemctl daemon-reload`

# 結果
これでsystemctlで起動・停止ができるようになる

```
systemctl start superset
systemctl stop superset
```

# その他
vagrantを使ってsupersetをお試し起動できるようにしました。
[こちら](https://github.com/gomesuit/larning-superset)にも反映しています。

# 参考
http://qiita.com/DQNEO/items/0b5d0bc5d3cf407cb7ff
Raspberry PiでC#を実行してみた（monoをいれてみた）

## 環境
Rasperry pi2
OS: Rasbian 7.11
※ 放置していたRaspberry piを使ってます

## TL;DR
教育用にRaspberryPiを使った簡単なシステムを作ることになったので、調査！
インストールまでだいたい**15分**程度でした！
RaspberryPi2にMonoのインストール～確認までまとめてみました。

## インストール
Mono公式のサイトを参照しながら、環境を作っていきます。
*Install Mono on Linux*
[http://www.mono-project.com/docs/getting-started/install/linux/](http://www.mono-project.com/docs/getting-started/install/linux/)

#### 1. 公開鍵のインポートを行い、リポジトリを追加します。

```shell-session:RaspberryPi
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
$ echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list
$ sudo apt-get update
```

#### 2. インストールします

```shell-session:RaspberryPi
$ sudo apt-get install mono-complete
```

## 確認
インストール後、正しくインストールできたか確認してみます

```shell-session:RaspberryPi
$ csharp
$ Environment.OSVersion
Unix 4.4.14.7
```

## 感想
Linuxでもc#が動く時代に...
楽ですよね、C#...

## 参考
*Raspberry Pi 2 に最新の Mono をビルドせずに apt-get で簡単にインストールする方法*
[http://blog.shibayan.jp/entry/20150222/1424607212](http://blog.shibayan.jp/entry/20150222/1424607212)
riotでyieldされた中にref/data-refを使うと.....

## ネストしていない単純なところに、refを使った場合。

```html
<simple-ref>
  <input ref="greeting1" type="text" value="Hello1">
  <input data-ref="greeting2" type="text" value="Hello2">
</simple-ref>
```

このように、tag.refsの下にぶら下がってくれる。

```javascript
var tag = riot.mount('nested-ref')[0]
expect(tag.refs.greeting1.value).to.be.equal('Hello1')
expect(tag.refs.greeting2.value).to.be.equal('Hello2')
````

## yieldをしているところに、refを使った場合。

```html
<nested-ref>
    <nested-ref-sub>
        <input ref="greeting1" type="text" value="Hello1">
    </nested-ref-sub>
    <nested-ref-sub>
        <nested-ref-sub>
            <input data-ref="greeting2" type="text" value="Hello2">
        </nested-ref-sub>
    </nested-ref-sub>
</nested-ref>

<nested-ref-sub>
    <yield/>
</nested-ref-sub>
```

このような感じに、埋め込まれたtagの持ち物になる。
さらに、&lt;nested-ref-sub>がさらに&lt;nested-ref-sub-sub>の中に入っていたりすると、もう無理。

```javascript
var tag = riot.mount('nested-ref')[0]
expect(tag.tags['nested-ref-sub'][0].refs.greeting1.value).to.be.equal('Hello1')
expect(tag.tags['nested-ref-sub'][1].tags['nested-ref-sub'].refs.greeting2.value).to.be.equal('Hello2')
````

ということなんで、単純な場合と同じように、こんな風にできるようにしてみた。

```javascript
var tag = riot.mount('nested-ref')[0]
expect(tag.refs.greeting1.value).to.be.equal('Hello1')
expect(tag.refs.greeting2.value).to.be.equal('Hello2')
````

## なやみごと

- 当然、処理が増えるんで重くなる。かも。ON/offとかいるのか。
- 定義したtagの識別子(_riot_id)をdata-riot-id属性にぶら下げて見たけど、名前が変？自分のidっぽいよね.....referrerのがいいのかな。
- そもそも、refは使うべきじゃない？なかった扱いのがいいのかな。
chocolatey v0.10.3(2017/01/14現在)をWindows10にインストール


chocolateyをはじめて触ってみたのでメモ。

# chocolateyってなに？
Windowsでapt-get install や apt-get update、apt-get upgradeのようなことをするパッケージ管理ツール。
https://chocolatey.org/docs/history
によると"Chocolatey nougat"と"nuget(MSがやってるやつ)"を「かけて」あるらしい。へー。

# どんなパッケージを扱えるの？
https://chocolatey.org/packages に行ってぐぐる。
rubyやpythonやJREはもちろんgolangもある。
sysinternalsってなんだか懐かしい名前も。
chromeもあるけど別にパッケージ管理ツールでインストールしなくてもいいような。。。コマンドラインからパッケージをずらっと並べてインストールする分には欲しいか。
あ、kobitoもあるでよ。(この文章はchocoでインストールしたkobitoで書いてる)

# chocolateyインストール方法
スタートメニューから[Windows PowerShell]を[管理者として実行する]で開き
https://chocolatey.org/install から以下のコマンドをコピペしてきて実行。
インストールが始まる。
```
PS C:\WINDOWS\system32> iwr https://chocolatey.org/install.ps1 -UseBasicParsing | iex
```
そのあと環境変数の再設定のためwindowsを再起動した(と思う)。

# パッケージはどうやってインストールするの？

以下は例としてgolang 1.7.3 (2017/01/14現在)をインストールする様子。

非管理者権限のコマンドプロンプトで実行しようとしたら怒られたので、管理者実行したPowerShellから実行した。パッケージによって非管理者権限でインストールできるものと管理者権限でしかインストールできないものがある?よーわからん。

golangに必要な環境変数(GOROOT)も設定してくれた。
大抵のパッケージはインストールするとc:\ProgramData以下にインストールされるのだがgolangは
c:\tools\go
にインストールされた。うーん、やめて欲しい。。。
インストール時の引数でインストール先を変更できないのかな。「Do you want to run the script?」で「[P]rint」を選択したら引数説明が表示されるのかな。誰か試してみて。

```
PS C:\WINDOWS\system32> choco install golang
Chocolatey v0.10.3
Installing the following packages:
golang
By installing you accept licenses for the packages.

golang v1.7.3 [Approved]
golang package files install completed. Performing other installation steps.
The package golang wants to run 'chocolateyinstall.ps1'.
Note: If you don't run this script, the installation will fail.
Note: To confirm automatically next time, use '-y' or consider setting
 'allowGlobalConfirmation'. Run 'choco feature -h' for more details.
Do you want to run the script?([Y]es/[N]o/[P]rint): y

C:\tools
Downloading golang 64 bit
  from 'https://storage.googleapis.com/golang/go1.7.3.windows-amd64.zip'
Progress: 100% - Completed download of C:\Users\eijim\AppData\Local\Temp\chocolatey\golang\1.7.3\go1.7.3.windows-amd64.zip (84.73 MB).
Download of go1.7.3.windows-amd64.zip (84.73 MB) completed.
Hashes match.
Extracting C:\Users\eijim\AppData\Local\Temp\chocolatey\golang\1.7.3\go1.7.3.windows-amd64.zip to C:\tools...
C:\tools
PATH environment variable does not have C:\tools\go\bin in it. Adding...
Environment Vars (like PATH) have changed. Close/reopen your shell to
 see the changes (or in powershell/cmd.exe just type `refreshenv`).
 The install of golang was successful.
  Software installed to 'C:\tools'

Chocolatey installed 1/1 packages. 0 packages failed.
 See the log for details (C:\ProgramData\chocolatey\logs\chocolatey.log).
```

# 自分用メモ

今回chocolateyを使ったのはVisual Studio Code用にgit.commandlineを導入するため。(参考: [Visual Studio Codeはmsys2版gitに対応していない](http://cad-san.hatenablog.com/entry/2016/01/21/011324))
chocoでgit.commandlineをインストールした後、Visual Studio Codeの[ファイル][基本設定][ユーザ設定]を開き以下の通り編集するとgitが使えるようになる。

```json
{
 "git.path": "%ChocolateyInstall%\\lib\\git.commandline\\tools\\bin\\git.exe"
} 
```
js Mumblingを表す

##お題
Mumbling　もぐもぐ言う　を関数で表現する。
・引数は大文字と小文字のアルファベットが渡される
##出力結果　例

```js
accum("abcd");    // "A-Bb-Ccc-Dddd"
accum("RqaEzty"); // "R-Qq-Aaa-Eeee-Zzzzz-Tttttt-Yyyyyyy"
accum("cwAt");    // "C-Ww-Aaa-Tttt"
```

```js
function accum(s) {
    // write your code
}
```

##つかったもの
split()
map()
toUpperCase()
join()
toLowerCase()
repeat()

##考え方
・引数の文字をsplit()で切り分けて変数にいれる。
・map()で各文字に処理を加える
・大文字のアルファベットと小文字はindexの分だけ繰り返すようにする
・join("-")でつないでおわり

##コード

```js
function accum(s) {
  return s.split('').map((ss, i) => {
    return ss.toUpperCase() + ss.toLowerCase().repeat(i);
  }).join('-');
}
```

##最初理解できなかった教えてもらったコード

```js
function accum(s) {
  return s.split('').map((x,index) => x.toUpperCase()+Array(index+1).join(x.toLowerCase())).join('-');
}
```

###他にもコードが浮かんだ方、コメントお待ちしております
エンジニア未経験者による客先常駐先で学んだことの復習(1/13)

1/13業務中にこんなことができるのかと学んだことをメモする
初心者によるメモなので、ほとんど役には立たないと思うが。


##なるほどと感じたこと
####リダイレクト
```
リダイレクトとは、サイトにアクセスしたユーザーを、最初にリクエストしたURLとは別のURLに移動させること。

例としては、
・サイトを移転したためこちらにアクセスしてください
・複数のページをまとめてこちらのアドレスに変更しました
みたいなことを指す。

引用元：https://support.google.com/webmasters/answer/2721217?hl=ja
```

このリダイレクトをするにはいくつかの方法がある
```
1.<meta>タグを用いてHTMLからリダイレクトさせる
2.JSを使用してリダイレクトさせる -> 別ファイルにscriptタグを用いて作成
3.サーバー側でリダイレクトさせる
```

流れとしては下に行けばいくほど比較的安全で、SEOとしても良いという。
また別の方法として、canonicalタグを用いる方法もあるのだとか。
要約すると、異なるURLを正規化して評価させるサイトを分散させないようにし、SEO対策としても有効。
```引用元：http://www.s-bokan.com/blog/seo/canonical-tag.html
```


####SEO
```
SEOはSearch Engine Optimization(検索エンジン最適化)という意味。
ユーザーがキーワードを入れて検索をかけた際、検索結果として上の方にページを表示させるようにする技術。
-> そうすることで多くのユーザに閲覧されるようになる。
```
今日聞かれてSearch Engine Organizationと答えました。
ちなみにorganizationは組織、団体、宗教を示す。

SEOの技術に関してはJSみたいに時代の流れですぐに廃れるというものではないらしい。
もちろん新しければ新しい方が良いが、それでも知るだけとかなら十分役に立つのだとか。
```引用元：https://liginc.co.jp/web/seo/85093
```


####コメントアウト
```
HTMLでのコメントアウトには//や/* */を用いるが、JSPには<%-- -->を用いる。
大きな違いとしては、開発者ツールで確認すると
・HTMLコメントアウトではユーザーからもコメントが確認できる
・JSPコメントアウトではユーザーから確認することができない

例として、ボタンのリンク先がすでに設定されているが、まだ非活性にしておきたいとき
-> リンクurlにJSPコメントアウトを用いて表示させないことで、ユーザーがリンク先に飛ばないようにする。
```
どうやらJSPコメントアウトにするとサーバー側で自動的に吐き出さないようにしてくれるらしい。


####開発者ツール
```
任意の要素にのみプロパティを適用させたい場合
　　　　　command + shift + C(なんかマウスのポインタみたいなやつ)
を有効にし、任意の要素を選択。

その後cssファイルを示している中で、一番上にある
　　　　　　element.css
にプロパティを打ち込むとその要素にのみ反映させることができる。
```
冷静に見れば当たり前ですね
聞かれたときパニクって爆死しました。


####git
```
ファイルをコミット(ステージングエリアにアップ)する際、
複数人で作業している場合は先にファイルの変更を取り込む(pull)をしてからコミットを行う。
なお、ブランチにまでは反映させたくない場合は、コミットだけして編集ファイルを保留するのもあり。
```


毎日が勉強ですね。
今日は眠いのでしっかりと寝る。
レンダリングの考え方を調べてまとめてみた(Unity)（２）

## そもそも反射ってどんな現象だろう？（不透明に限る）

物体が光を反射するときにどのような振る舞いをするのか？を考えてみます。（透明や半透明はおいておきます）

1. 不透明な物体表面に光を当てた時に「物そのものの色が見える部分」と「光源の光が反射する部分（ハイライト）」がある
2. 「物そのものの色が見える部分」は見る角度を変えても明るさが変わらない
3. ハイライトって見る角度を変えると移動する

このように2個の違う反射の種類があり、光の反射はその2種類の合計であるという考え方を「2色性反射モデル」と呼びます。

「物そのものの色が見える部分」を拡散（diffuse）反射、「光源の光が反射する部分（ハイライト）」を鏡面(specular)反射と呼びます。

```math
R_{reflection}(p,\vec{v}) = R_{diffuse}(p,\vec{v}) + R_{specular}(p,\vec{v})
```

## 拡散(diffuse)反射（直接光）
実世界でdiffuse反射を体現している物質としては紙や、チョークなどがあります。真正面から見ても横から見ても、紙やチョークの白さ（明るさ）はほとんど変わりません。また物体の色が反映されるのはdiffuse反射です。

![説明４.JPG](https://qiita-image-store.s3.amazonaws.com/0/65391/26cb6095-97bd-7751-6b16-fab6a3f70e8f.jpeg)

点pに入射する光が強いほど点pの反射する光が強くなります。まぁ当然ですよね。入射する光の強さは、光源の強さのほかに、点pと光源の角度によっても変わります（光源によっては光源と点pとの距離も影響しますがおいておきます）。同じ光源でも法線nとの内積が小さければ入射する光の強さも弱くなります。

![説明5.JPG](https://qiita-image-store.s3.amazonaws.com/0/65391/abb08e0f-b504-9ded-ed28-c1d2689c219b.jpeg)

この反射モデルで有名なのはランバート(Lambert)反射です。

```math
K_{diffuse}(p) : diffuseの時の反射係数を表す関数\\
max(dot(\vec{n},\vec{l}),0) : 光源と法線の内積。0が最低になるようにする\\
L(p):入射する光\\
-----\\
R_{diffuse}(p) = K_{diffuse}(p) * max(dot(\vec{n},\vec{l}),0) * L(p)\\
(R_{diffuse}(p,\vec{v})ではありません。視点に影響しないからです。)
```

## 鏡面(specular)反射（直接光）
リンゴのハイライトや車のボンネットなどが実世界でのspecular反射です。視点を変えるとハイライトの位置が移動するように、視点の位置によって反射率が変わります。また、diffuseとちがって光源の色が見えます。

lの正反射であるrの方向にある視点vでは点pは最も明るく輝きます。そしてそこから角度Xだけズレた視点v'では視点vよりは随分暗いですが輝きます。しかしまったく外れてしまった視点v''では全く輝きません。

![説明6.JPG](https://qiita-image-store.s3.amazonaws.com/0/65391/1f3b7fc9-8345-3ee1-c9d2-73569987bb75.jpeg)

このハイライトの鏡面反射で古くからあって有名なのはフォンの反射モデルです。フォン反射モデルは下の数式で表現されます。

```math
K_{specular}(p) : specularの時の反射係数を表す関数\\
dot(r,v)^s : 正反射と視線のズレのs乗\\
s : シャイネス(鏡面反射係数)。ツヤツヤ具合。ハイライトの大きさに影響。完全鏡面はs=∞\\
L(p):入射する光\\
-----\\
R_{specular}(p,\vec{v}) = K_{specular}(p) * dot(\vec{r},\vec{v})^s * L(p)\\
```

この式では角度X( $dot(r,v)$で表現されてる )がすこし大きくなるだけで急激に光が弱くなります。にしてもs乗とはめっちゃ急激に減りますね。

お手軽わかりやすいこのフォンの方程式ですが、以下のような問題があります（らしいです）。

- ハイライト以外の鏡面反射（特に金属）がうまく表現できない。
- それっぽく見えるだけで物理的には間違っている（らしい）。

とはいえ、それっぽく見えるし、簡易な計算方法もあり(詳しくは[リアルタイムシェーダー入門](https://www.amazon.co.jp/dp/4777514013/ref=pd_lpo_sbs_dp_ss_2?pf_rd_p=187205609&pf_rd_s=lpo-top-stripe&pf_rd_t=201&pf_rd_i=4777510875&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=HBVKSCH5XF88XEHN7CPM)をご覧ください)長く使われています。

昨今の物理ベースレンダリングではこのフォンの反射モデルは使われずに別の鏡面反射のモデルが使われています。後々説明できたらと思います。

## 間接光
間接光は計算しません。終わり。
とはいっても直接光だけだと暗くなりすぎます。影が本当に真っ黒になってしまいます。実世界では間接光がほんのりと照らしているので本当の真っ黒にはなかなかなりません。

そこで環境光(ambient)という光を導入します。どんなに暗くてもぼんやり光る、最低限の明るさです。単純に足すだけの項です。

![ライティングの例](http://www.oit.ac.jp/is/~whashimo/server/~whashimo/Article/OpenGL/Chapter5/lighting.gif)
(画像は[光源と物体の照光処理](http://www.oit.ac.jp/is/~whashimo/server/~whashimo/Article/OpenGL/Chapter5/) より引用させていただきました)

以上説明してたdiffuse、specular､ambientを合成して最終の画像を出力します。これが昔のレンダリング方法です。

![合成の例](http://www.oit.ac.jp/is/~whashimo/server/~whashimo/Article/OpenGL/Chapter5/lightall.gif)
(画像は[光源と物体の照光処理](http://www.oit.ac.jp/is/~whashimo/server/~whashimo/Article/OpenGL/Chapter5/) より引用させていただきました)

次の回では物理ベースレンダリングについて説明できたらと思います。
RxSwiftをサクッと勉強してみた

今更感が否めないのですが、勉強会をさせていただく機会をいただきRxSwiftを勉強してみました。

##RxSwiftについて

RxSwiftのRxとはReactive Extensionsの略称で、Swift以外にもJava、JS、Scalaなどの言語でRxを取り扱う事ができます。

[ReactiveX](http://reactivex.io/intro.html)

Rxを用いると非同期処理やイベント処理などを**宣言的に**記述することができるようになります。
モバイルアプリをより良いプロダクトにしていくには、ユーザーのUIを妨げにならない非同期処理やイベントや時間等のトリガーに応じて様々な処理をインタラクティブに実現することが不可欠です。
ただし、そういった記述が重なっていくと往々にしてコードが煩雑になり目を背けたくなるように地獄ViewControllerを生み出してしまった経験がある人は少なく無いと思います。
RxSwiftはそういった記述をより簡潔に実現できるようにする為のライブラリです。

---

ちなみに学習をする前のRxSwiftの印象はこんな感じでした。

```swift:FirstImpression.swift
// 生成したUIButtonに対して
// aが発生したらthisを
// bが発生したらthatを実行

let button = UIButton(...)
button.aHappen { doThis() }
      .bHappen { doThat() }

view.addSubview(button)
```

オブジェクトのプロパティとして、対象のオブジェクトにAやBという事象が発生した際にどういう挙動をさせるかという事をそのまま記述できる的なノリかと。
確かに様々なパターンの挙動を一つに集約することができてスッキリしそう！！

という事で、実際にはどのような事が実現できるのか触ってみましょう。

##導入

`pod 'RxSwift'`
`pod 'RxCocoa'`

をPodfileに記述、

`pod install`
で必要なライブラリをインストールできます。

Cocoapodsを使用していない人は[こちらから](https://github.com/ReactiveX/RxSwift#installation)

##実際に触ってみる
導入の際にRxSwiftとは別にRxCocoaというライブラリをインストールしましたが、これはUIKitの様々なクラスで使用できるプロパティをextensionとしてすでに定義してくれています。

[RxCocoa](https://github.com/ReactiveX/RxSwift/tree/master/RxCocoa/iOS)

実際にUIButtonを例にRxCocoaの一例を見てみましょう

```swift:UIButton+Rx.swift（一部抜粋）
extension Reactive where Base: UIButton {
    
    /// Reactive wrapper for `TouchUpInside` control event.
    public var tap: ControlEvent<Void> {
        return controlEvent(.touchUpInside)
    }
}
```

これを実際に使用してみると以下のようになります。

```swift:ButtonRxTry.swift
let button = UIButton()

button.rx.tap
            .subscribe(onNext: { [weak self] in
                doSomething()
            })
            .addDisposableTo(disposeBag)
```

Rxを取り扱う上で理解が必須な概念は
`ObservableType` 
`Subscribe`
の２つです。

ざっくりと説明すると、
ObservableTypeには**何を監視するか**を設定し、
Subscribeには**何を行うか**を設定します。

ObservableTypeによっては戻り値が設定されていることもあり、
subscribeのパラメーターのクロージャー内でその値にアクセスすることができます。

次はUITextFieldを例にして記述してみます。

```swift:TextFieldTry.swift
let label = UILabel()
let textField = UITextField()

textField.rx.text
            .subscribe(onNext: { [weak self] text in
                label.text = text
            }).addDisposableTo(disposeBag)
```

先程のUIButtonのtapが`ObservableType`の子クラスである`ControlEvent<Void>`だったのに対して、
UITextFieldのtextは`ControlProperty<String?>`
となっているので、subscribeからString?にアクセスをすることができます。


ソース
https://github.com/takashi9314/RxTest
vimのcurrent bufferにあるrubyスクリプトを実行したい

vimのcurrent bufferでrubyのソースコードを実行したい。お試しで書いたファイルすら作ってない場合どうやるのがいいのかなと考えてみた。

## ファイルがない

eval便利。

各行を1行ずつ処理したい。

```
:rubydo eval $_
```

けど、classやmethod定義もワンライナーじゃないといけないから複数行まとめて処理したい場合はこっち。

```
:ruby eval(Vim::Buffer.current.length.times.inject("") {|res, i| res << Vim::Buffer.current[i+1] << "\n"})
```

keymapがめんどくさかった

```
nnoremap <leader>rb :ruby<Space>eval(Vim::Buffer.current.length.times.inject(''){<Bar>res,i<Bar>res<lt><lt><Space>Vim::Buffer.current[i+1]<lt><lt><Space>"<Bslash>n"})<Return>
```

## ファイルがある

おまけ。

```
:!ruby %
```
PHP の連想配列の真似したい書き方

※PHP 5.4未満

## 今までの私の書き方

~~~php
array('Baroque'   => 'Bach',
      'Classical' => 'Beethoven',
      'Romantic'  => 'Brahms');
~~~

追加時

~~~php
array('Baroque'   => 'Bach',
      'Classical' => 'Beethoven',
      'Romantic'  => 'Brahms',
      'Post-Romantic' => 'Rachmaninov'); // 追加行
~~~

- 追加行の前に `,` を追加することで、追加行以外に差分が発生
- キーの長さによって `=>` の位置揃えが水の泡
- 末尾に `);` も書く必要があり、うっかり忘れると文法エラー
- `array('` でインデントを合わせているため、スペースが6つという変なインデントになり、エディタでの自動インデントが困難に

## 真似したい書き方

~~~php
array(
    'Baroque' => 'Bach', // array( の後は改行、インデントはスペース4つ
    'Classical' => 'Beethoven', // => の位置は揃えない
    'Romantic' => 'Brahms', // 末尾にカンマ
); // 改行
~~~

追加時

~~~php
array(
    'Baroque' => 'Bach',
    'Classical' => 'Beethoven',
    'Romantic' => 'Brahms',
    'Post-Romantic' => 'Rachmaninov', // 追加行のみの差分で済んだ。追加するのも要素のみ。インデントもエディタで自動に
);
~~~
Redmine3.3.2の＋ボタンのテーマ適応 Flat theme編


# やりたいこと
redmine3.3系から追加された通称？「＋ボタン」がテーマ適応を行うと後ろに隠れちゃう問題などが3.3.2で解消されたらしい。
有効にしてみたらFlat themeがその部分まだ対応してないじゃないですかやだーというのを解消したい。

# 前提
- [Flat theme](https://github.com/tsi/redmine-theme-flat "Flat theme")を使ってる人
- Redmine 3.3.1以上

# cssの書き換え
該当ファイル

- /redmine path/public/themes/Flat-theme-path/stylesheets/application.css

該当箇所：642行目あたりに追加

``` css
#main-menu li a.new-object {
  background-color: #202020;
}

#main-menu .menu-children {
  display: none;
  position:absolute;
  width: inherit;
  z-index:45;
  background-color:#fff;
  border-right: 1px solid #202020;
  border-bottom: 1px solid #202020;
  border-left: 1px solid #202020;
}

#main-menu .menu-children li a:hover {color: #fff; background-color: #202020;}

```

# いいわけ
web系知識皆無なため、いらない箇所まで書いちゃってるかもしれません。
得意な人はすでに自分で直してると思いますが、適宜読み直してください。
Windowsのコンパイラで初コンパイル

C言語を勉強中ですが、
何もぼそぼそとつぶやくところも、
今のところないのです。
（まだscanfとかそんな序盤の序盤です:raised_hand_tone3:）

昔にJavaをやったことあるのですが、
Hello worldを表示して挫折しました:sob:

その時は楽しさがいまいちわからなかったのです。



誰かが反応してくれるわけではないけど、
もそもそと勉強中はつぶやいてみることにしました。
飽き性だからいつまでやっていられるかは、
正直なところ本当にわからないけど、
また挫折せずに一通りくらいはやりたいな！
どうせなら3級でもよいから、資格を取りたいっ


苦Cさんの「学習用C言語開発環境」でJavaScriptエラー？というエラーがバシバシ出てうっとおしかったので、
ちょっと調べて「TeraPad」と「コマンドプロンプト」と「csc.exe」にしました。

ですが、まずコンパイルで突っかかりました･･･。:frowning2:

・プリプロセッサ ディレクティブが必要です。
　⇒(´･ω･)･･･？？？？？？？

・単一行コメントか行の終わりが必要です。
　⇒記号でも付け忘れたのかしら

・名前空間にフィールドやメソッドのようなメンバーを直接含めることはできません。
　⇒(´･ω･)･･･？

プリプロセッサ ディレクティブから調べてみます(´；ω；)

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

Windowsに入っているコンパイラ？（合っているのだろうか･･･）は
C#用だということがわかった･･･！（以下参照）
http://nyumon-info.com/program/csharp.html

しかも、C/C++とは別物で互換性はない。

これじゃあできないのね！
環境構築をしなければならないことがわかりました！
プログラミング初心者がPythonを始めるべき3つの理由

※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。

参考サイト：[プログラミング初心者がPythonを始めるべき3つの理由](http://programming-study.com/technology/python-recommend/)

プログラミング言語と一口に言ってもたくさんあり、これからプログラミングを始めようとしている方は「どれを選べばいいだろう」と悩むかと思います。プログラミング初心者の方には「Google三大言語」（C++、Java、Python）の一つであり、その中で唯一のスクリプト言語である「Python」という言語をオススメします。

##Pythonってどんな言語？

Pythonの歴史は古く、メジャーなスクリプト言語であるPerl、Python、Ruby、PHPの中では2番目に古い言語となります。また、JavaやC#よりも年上です。日本では少しマイナーですが、海外ではオブジェクト指向のスクリプト言語として人気です。

##Pythonはどんなところで使われている？

Pythonは様々な企業で利用されています。Googleの最初のウェブクローラーはPythonで書かれ、広告管理の自動化システムの構築や社内の様々な業務にPythonが使われています。Youtubeのシステムの多くは、Pythonで書かれています。他にも、NASAやMicrosoftなど多数の企業で使用されています。DropboxやTorrentなど、誰もが知る有名なソフトウェアがPythonで書かれてたりと、様々な実績がある言語です。

##近年話題の「機械学習」にもPythonがオススメ

最近では、「機械学習」「AI」「ビッグデータ」というキーワードをよく耳にするかと思います。求人でも「データサイエンティスト」や「機械学習エンジニア」といったものを見るようになりました。機械学習や高度な数値計算のライブラリが豊富にあるため、この分野ではPythonが一歩抜きん出ています。2016年度のプログラミング言語別の年収ランキングでは見事１位になりました。

##Pythonを選ぶべき理由

では、なぜプログラミング初心者にPythonがオススメなのでしょうか。今回はその理由を3つに分けてお伝えいたします。

###生産性が高い

例えば、Pythonでは1から10まで順番に表示するプログラムは以下のように記述します。

```
for index in range(1, 11):
    print(index)
```

ファイルから1行づつ読み取り、それを表示するプログラムは以下のようになります。

```
for line in open("myfile.txt", "r"):
print(line)
```

このように、とても簡単に書くことが可能です。何かを作りながらプログラミングを学ぶならば、短いコードと時間でどんどん次の技術を習得できます。

###汎用的に使える

Pythonは汎用的な言語です。これが何を意味するかと言うと、PythonだけでウェブサイトやGUI*、複雑な科学計算やゲーム、ロボット向けのアプリケーションまで作成することができます。もちろん、ゲームにはゲームを作るための知識・技術が必要ですし、ウェブサイトを作るには専用の知識・技術が必要になります。ですが、作りたいものに応じてプログラミング言語も習得しなおすのは学習コストの面で大変です。趣味でプログラミングを行いたいけれど、作りたいものや興味が多すぎる！という方には正に最適な言語といえます。

* exe等を押すと出てくる、画面つきのアプリケーションのこと。

###可読性（読みやすさ）が高い

Pythonは読みやすさを非常に重視した言語で、「実行可能な擬似コード」と呼ばれることがあります。特に記号を極力使わないように設計されており、他言語ではよく使う$(ドルマーク)やブロックの範囲を示す中括弧・endといった記述は不要ですし、if文での条件を記入する際の括弧ですら不要です。先ほどサンプルコードを二つ書きましたが、「1から10まで順番に表示する例」と「ファイルから一行づつ読み込み表示する例」というまったく別の処理であるにもかかわらず、書き方がほとんど同じになっています。これは言語の機能に一貫性を持つよう設計されているためで、慣れてくると「こうすれば、こういう処理ができそう」というように直感的にコードが書けます。
コードが読みやすいということは、人のコードを読んで簡単に理解ができるということになり、修正や拡張、自分のプログラムに組み込むといった作業がすぐに終わります。また、読みやすいことで処理内容がわかりやすく、最適なアルゴリズムや無駄な処理などの発見も容易です。

##Pythonの欠点とは

Pythonは素晴らしい言語ではありますが、欠点が2つあります。

###実行速度が遅い

他の言語に比べると、実行速度が遅めです。近年ではPCスペックの向上や言語自体の改善によって、実行速度が気になるケースは少ないのですが、どうしても処理速度を重視したい場合もあります。実行速度を改善するための方法は豊富にあるのですが、それらは言語にある程度習熟しないと難しく感じるのも事実です。

###他言語に比べて日本語情報が少なめ

日本においては、Pythonはまだマイナーな扱いをされています。書籍やインターネットの日本語情報も多いとは言えません。しかし、最近になりそれらも少し増えてはきたので、悲観するほどではありません。
OS自作入門1日目

FuntooでのOS自作入門1日目です。

# QEMU
何がはまったって、QEMUが動作しないことでした。動作しないのではなく、出力モードが指定できてなかっただけでした。

/etc/portage/package.use (かそれに類するファイル)に

```
app-emulation/qemu sdl sdl2 gtk
```

と書いてemergeしなくてはなりませんでした。たぶんsdl,sdl2,gtkのどれか1つを書けばいいような気もします。

# NASM
GASを使われている方が多いのですが、なぜかNASMが入っていたので、NASMでアセンブルしました。

NASKとの差は僅かで、識者の方が書かれているように、

```NASM
; RESB 18 ; とりあえず18バイトあけておく
TIMES 18 DB 0
```

のように、「RESB 数」を「TIMES 数 DB 0」にすればうまく行きました。DBディレクティブは初期値を指定したメモリ確保、RESBディレクティブは初期値を指定しないメモリ確保のようなので、RESBのままでもいいような気がします。がNASMがワーニングを出すのが気になり、「TIMES 数 DB 0」を使いました。

DBやRESBのことをディレクティブと呼ぶんだと勝手に思い込んでいましたが、必ずしもそうではないようですね。CPUの命令ではないものはディレクティブかと思ってました。

```NASM
; RESB 0x1fe-$ ; 0x001feまでを0x00で埋める命令
TIMES 0x1fe-($-$$) DB 0
```

識者の方が書かれているように、NASMの```$```はその行の先頭位置、```$$```は現在のセクションの
先頭位置を表すそうです。「現在のセクション」とはなんだろうと言うことになりますが、これだと現在の命令やデータなどが並んでいるまさにこの場所、ということでよいのでしょうか。```$-$$```を計算すれば、セクションの先頭からその行の先頭位置までのバイト数になりそうですね。```0x1fe```がそのまま書かれていますが、これはセクションの先頭からの相対位置っぽく理解すればいいのでしょうか。

# アセンブル
```shell-session
nasm helloos2.nas
```

で```helloos2```というファイルができます。

# 実行
上でアセンブルした```helloos2```を実行します。

```shell-session
qemu-system-i386 -drive file=helloos2,format=raw,if=floppy -boot a
```

これでウインドウが開いて「hello, world」が表示されます。エラーメッセージが割と出ないようなコマンドラインオプションを選んでみました。
sqlite3でsplit


sqliteって関数少ないですよね...

## やりたいこと

- こんなCSVなフィールドデータを...

|key|csv|
|:---:|:----------|
|key1|this,is,a,pen|
|key2|hello,world|
|key3|I,am,a,boy|

- こんな風に整形したいんです。

|key|value|
|:---:|:----------|
|key1|this|
|key1|is|
|key1|a|
|key1|pen|
|key2|hello|
|key2|world|
|key3|I|
|key3|am|
|key3|a|
|key3|boy|

## SQL

WITH RECURSIVEってのがミソですね。

```SQL
-- テーブル定義
CREATE TABLE KV(key TEXT,val TEXT);

-- データ設定
INSERT INTO KV(key,val) VALUES
("key1","this,is,a,pen"),
("key2","hello,world"),
("key3","I,am,a,boy");

-- クエリー
WITH RECURSIVE split(KEY,idx,fld,remain) AS
  (SELECT KEY,
          instr(val,',') AS idx,
          substr(val,1,instr(val,',')-1) AS fld,
          substr(val, instr(val,',')+1)||',' AS remain
   FROM KV
   UNION ALL SELECT KEY,
                    instr(remain,',') AS idx,
                    substr(remain,1,instr(remain,',')-1) AS fld,
                    substr(remain, instr(remain,',')+1) AS remain
   FROM split
   WHERE remain != '' )
SELECT KEY,
       fld
FROM split
ORDER BY KEY ASC;
```

## 実行結果

できました！

```shell
sqlite> select * from KV;
key         val
----------  -------------
key1        this,is,a,pen
key2        hello,world
key3        I,am,a,boy
sqlite>
sqlite> WITH RECURSIVE split(KEY,idx,fld,remain) AS
   ...>   (SELECT KEY,
   ...>           instr(val,',') AS idx,
   ...>           substr(val,1,instr(val,',')-1) AS fld,
   ...>           substr(val, instr(val,',')+1)||',' AS remain
   ...>    FROM KV
   ...>    UNION ALL SELECT KEY,
   ...>                     instr(remain,',') AS idx,
   ...>                     substr(remain,1,instr(remain,',')-1) AS fld,
   ...>                     substr(remain, instr(remain,',')+1) AS remain
   ...>    FROM split
   ...>    WHERE remain != '' )
   ...> SELECT KEY,
   ...>        fld
   ...> FROM split
   ...> ORDER BY KEY ASC;
KEY         fld
----------  ----------
key1        this
key1        is
key1        a
key1        pen
key2        hello
key2        world
key3        I
key3        am
key3        a
key3        boy
sqlite>
sqlite>
```
PythonのWebフレームワーク4種比較

※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。

参考サイト：[PythonのWebフレームワーク4種比較](http://programming-study.com/technology/python-framework/)


#PythonのWebフレームワーク4種比較

Webフレームワークは、Web開発において頻繁に利用される機能をあらかじめ作ったもので、「frame work」の名のとおり骨組みや枠として利用するものになります。
フレームワークを使用することで
・記述量が減る
・プログラミングの書き方を、ある程度統一することができる
・「○○フレームワークの経験がある人」のように、人材を集めるのが容易になる
といったメリットがあります。
Web開発においては、このフレームワークを使用して開発することが非常に多いです。

今回は、DjangoやBottleなど、PythonのWebフレームワークを4つご紹介します。

##django

Djangoは米国のLawrence Journal-World社のWeb開発部門である「World Online」が開発したWebフレームワークです。2005年に公開され、2008年9月にバージョン1.0がリリース、その後も活発に開発が続き、現在は安定版が1.9、最新は1.10となっています。

PythonのWebフレームワークの中では、最も人気の高いフレームワークの１つであり、中規模以上のWebアプリケーションの構築によく使われます。求人等で一番見かけるのも、このDjangoです。

Webフレームワークによく使用される
・URLディスパッチャー
・O/Rマッパー
・テンプレートエンジン
をはじめ、沢山の機能がDjangoには備わっており、「フルスタックフレームワーク」と表現されます。
また、管理画面が自動生成される機能も、公開当初は話題になりました。GAEに標準で含まれているなど、色々な場所で目にするフレームワークです。

[Djangoの公式サイトを見る](https://www.djangoproject.com/)



##Bottle

PythonのWebフレームワークの中では一番シンプルで、軽量なフレームワークです。
「bottle.py」という1ファイルだけで構成されています。そのため、サーバへのデプロイも非常に簡単です。
また、1ファイルというシンプルさからか、ソースコードを眺めながら勉強目的で使用する方もいますし、このBottleを使って実用的なWebアプリケーションを作成している方も勿論います。

[Bottleの公式サイトを見る](http://bottlepy.org/docs/dev/index.html)


##Flask

軽量なフレームワークの中では、最も人気があるWebフレームワークです。小規模・中規模なWebアプリケーションの構築に向いています。
Flaskは元々2010年のエイプリルフールのジョークとして始まったものですが、作者であるオーストラリア人のArmin Ronacherが熱狂的な反響に応え、本物のフレームワークにしたという面白い経緯があるフレームワークです。Flask（フラスコ）という名前は、Bottle（ボトル）に対する言葉遊びで命名されました。

「マイクロWEBフレームワーク」と呼ばれており、その名の通り動作も軽量で、覚えることもあまり多くはありません。
また、Webアプリケーション全体を１つの.pyファイルに記述することも可能で、小規模なサイトの構築を素早く行うことができます。

[Flaskの公式サイトを見る](http://flask.pocoo.org/)

##Tornado

Tornadoは、FriendFeedによって開発され、Facebookに吸収されたのちにオープンソース化されたWebフレームワークです。
Webフレームワークとしても充分な機能がありますが、Webサーバとしての側面もあります。
リアルタイムでの通信を行う「WebSocket」がサポートされているため、その目的で使用されることや、非同期Webサーバである「node.js」のPythonでの代替手段としても人気です。
Apacheではなくnginxと一緒に使用されるのが一般的で、静的なファイルの配信に関してはほかのWebフレームワークを圧倒するほど、高速に動作します。

[Tornadoの公式サイトを見る](http://www.tornadoweb.org/en/stable/)
SAP ERPのアドオン開発でよく使うトランザクションコード一覧

- AL11 SAPディレクトリ一覧
- SE01 移送オーガナイザ（拡張）
- SE11 ABAPディクショナリ
- SE16 データブラウザ
- SE16N Newデータブラウザ
- SE37 汎用モジュールビルダ
- SE38 ABAPエディタ
- SE39 ABAP画面分割エディタ
- SE80 ABAPワークベンチ
- SE91 メッセージ更新
- SE93 トランザクション更新
- SHDB トランザクションレコーダ（バッチインプットレコーダ）
- SM12 ロックエントリ処理
- SM30 テーブルビュー管理
- SM36 ジョブ登録
- SM37 ジョブ管理
- SM69 外部OSコマンド
- SQ01 SAPクエリ クエリ
- SQ02 SAPクエリ インフォセット
- SQ03 SAPクエリ ユーザグループ
- SQVI クイックビューア
- ST05 パフォーマンス分析
- STMS 移送管理システム
- VARD バリアント照会

業務でよく使うのでまとめました。
不足分ありましたらコメント下さい。