OmniAICreator/Qiita-1.07M huggingface dataset:
Cognos 認証で特定のネームスペースで強制/優先的に認証させる二つの方法

##概要
Cognos BI&Analyticsで認証のネームスペースを複数セットアップする事があると思います。
ネームスペースが複数ある場合に、特定のネームスペースを強制的に或いは優先的に認証させる方法の説明となります。

##ゲートウェイ・ネームスペース（強制）
Gatewayが導入されているノードのCognos Configurationの「環境」→「ゲートウェイ・ネームスペース」で設定します。
このGatewayのURLにアクセスしたユーザーは、指定されたネームスペースでの認証が強制され、このネームスペースで認証が失敗した場合は、認証エラーとなります。
Gatewayは本体のDispatcherとノードが同じでも、Gateway自体を複数立てる事が出来ます。
同一ノードの別々のフォルダにCognosを都度インストールし、Gatewayコンポーネントのみを選択します。
例えば、以下のような使い方をします。
http://cognoshost/ibmcognosJP → 日本用LDAPで認証
http://cognoshost/ibmcognosUS → US用LDAPで認証
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/c6112ee4-3e88-55ef-1c31-61ee84bef083.png)

##defaultNamespace（優先）
強制ではなく、優先して特定のネームスペースで認証する方法です。
つまり、プライマリのネームスペースで認証が失敗した場合、その他のネームスペースで認証が行われます。
図のように、「認証」→「詳細プロパティ」で、
名前：defaultNamespace
値：ネームスペース名
を指定します。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/1da9e12c-1cac-0b8e-b0ec-17d447b63f5f.png)

※defaultNamespaceパラメータの情報元（マニュアルには載っていないようですが）
http://www.slideshare.net/barnaby1502/cognos-technical-super-session-2012
Python > Comprehension / 内包表記 > List comprehension

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2285 / 12833)

> **Comprehension** make it possible for you to combine loops and conditional tests with a less verbose syntax.


### The simplest form

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2319 / 12833)

> The simplest form of list comprehension is:

```
[ expression for item in iterable ]
```

例を参考に実装してみた。
http://ideone.com/9l9LpH

```py
number_list = [ 2 * number - 1 for number in range(1,5)]
print(number_list)
```

```txt:結果
[1, 3, 5, 7]
```

### include a conditional expression

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2319 / 12833)

```
[ expression for item in iterable if condition ]
```

http://ideone.com/A1AkaE

```py
number_list = [ number for number in range(1,9) if number % 2 == 1]
print(number_list)
```

```txt:結果
[1, 3, 5, 7]
```

### 日本語訳

内包表記のことのようですね。

http://qiita.com/7of9/items/d03d099b400d9a067086#comment-a3d81d6be1e59c4a0a35
http://qiita.com/taiga_6404/items/20a3d9a7edf1f7bd6a2c
http://qiita.com/supersaiakujin/items/0776d3252c5000ca146e
> for文のあとにfor文を続けることもできる。
Bash操作

# カーソル移動
`[Ctrl + b]`：カーソル左移動（Backward）
`[Ctrl + f]`：カーソル右移動（Forkward 
`[Ctrl + a]`：カーソル行頭へ
`[Ctrl + e]`：カーソル行末へ
`[Meta + b]`：単語ごと左移動（Backward）
`[Meta + f]`：単語ごと右移動（Forkward）
# 文字削除
`[Ctrl + h]`：カーソル位置の後方に１文字削除
`[Ctrl + d]`：カーソル位置の１文字削除
`[Ctrl + w]`：後方にスペース区切りで１単語分削除
# カットとヤンク
`[Ctrl + k]`：カーソル位置から行末までを削除する
`[Ctrl + u]`：カーソル位置から行頭までを削除する
`[Ctrl + y]`：最後に削除した内容を挿入する
# 画面表示のロックと解除
`[Ctrl + s]`：画面表示をロックする
`[Ctrl + q]`：画面表示のロックを解除する
# コマンドが終了しないとき
`[Ctrl + c]`：実行中のコマンド強制終了
# プロンプトが文字化けしているとき
`[Ctrl + l]`：画面消去する
# 端末の初期化
```bash
$ reset
```
# コマンド履歴
`[Ctrl + p]` または `↑キー` ：1つ前のコマンド履歴に移動する
`[Ctrl + n]` または `↓キー` ：次のコマンド履歴へ移動する
`[Ctrl + r]`：履歴を遡ってインクリメンタル検索する
# インクリメンタル検索時のコマンド
`(文字の入力)`：検索語を追加して再検索
`[Ctrl + r]`：1つ前の検索結果へ移動
`Enterキー`：現在の検索結果をそのまま実行
`Escキー`：現在の検索結果を表示したまま、コマンドラインに戻る
`[Ctrl + g]`：検索結果を破棄し、プロンプトに戻る
「実践Vim」を読んで得られた考えをまとめてみた1（ドットコマンド・ノーマルモード）

# はじめに

Vimは敷居の高いエディタで、習得に時間がかかります。
しかし、一度習得してしまえば編集効率・速度は劇的にアップします。
数年前に購入した書籍に「実践Vim」があります。
Vimレベルアップの大きな手助けとなりました。
ここでは一通り読んで、得られた考えをまとめています。
長いので何度かに分けます。また、全てはやりません。

- [「実践Vim」を読んで得られた考えをまとめてみた1（ドットコマンド・ノーマルモード）](http://qiita.com/sfp_waterwalker/items/822bdcccb1b31f4b82ad)
- [「実践Vim」を読んで得られた考えをまとめてみた2（挿入モード・ビジュアルモード）](http://qiita.com/sfp_waterwalker/items/7558e80b0a7f6b36019e)
- [「実践Vim」を読んで得られた考えをまとめてみた3（コマンドラインモード）](http://qiita.com/sfp_waterwalker/items/22f30277de14fbb4ec4f)


# 各TIPのまとめ

## 第1章 Vimのやり方

### TIP1： ドットコマンドとは

**→.はマイクロマクロ**

.は「最後に行った変更（テキストに変更を及ぼすコマンド1単位）を繰り返す」コマンドです。
例えば、

- 現在行から3行削除 → 3dd
- 現在行を「-----」に変更 → cc-----[esc]
- 1単語を消去 → dw
- 「=」の前まで削除 → dt=
- 行末に「 // TODO」を追記 → A TODO[esc]

「最後に行った変更」は処理として記録されていて、つまりは短いマクロと考えられます。
「最後に行った変更」の内容によってはマクロの再実行がやりやすくもやりにくくもなるのです。
.コマンドに限った話ではありませんが、繰り返しやすいようにキーストロークを工夫することが効率アップにつながります。

### TIP2： DRY（Don't Repeat Yourself）

**→.を使いやすいコマンドを考える**

vimは移動のコマンドが多数存在します。
さらには複合コマンドも存在します。
例えばAを押すと行末にカーソルを移動して挿入モードに入りますし、
ccを押すと現在行を変更します。
どのコマンドを使えば.が使いやすくなるかを考えることが効率アップにつながります。

.を使いやすくする考え方の1つは、挿入モードだけで済まそうとしないことです。
下記の

- インサートモードに滞在する時間を短くさせる
- インサートモードにおける削除は現在挿入中の文字の削除、または、ドットに記憶させる予定の削除動作に限定させる

が非常に参考になります。

[新人達を1ヶ月でガチvimmerにした方法 \- Qiita](https://qiita.com/nyantera/items/4bf29ca6f11bc797a9cb)

.の挙動に、挿入モード内でのキー操作は関係ありません。
関係はないのですが、挿入モード内でのストローク数が増えるほど再現が変になる可能性が増えます。

### TIP3： 一歩下がって、三歩進む

**→.を使いやすいコマンドを考える**

TIP2と同じです。
例では「+」をsで消した上で「 + 」を入力しています。
.を使いやすくするための一例です。

### TIP4： 実行して、繰り返して、元に戻す

**→ 反対方向のコマンドも覚えて繰り返し過ぎたときに**

「反対方向」を覚えることで大胆なカーソル移動や編集が実現できます。
何回も.を押してしまい、テキストに変更を加えすぎたときでも、uで元に戻れます。
移動系のコマンドでも同様です。
単語単位の移動で、wを連打して進みすぎたときにbで戻れますし、
nの場合はNが反対方向への移動になります。

### TIP5： 手作業での検索と置換

**→*で入力せずにカーソルにある単語を検索。nと.の組み合わせ。**

nと.の組み合わせは私がVimを使った編集で効率を初めて実感できた内容です。
vimには置換用のコマンド（:s）もあります。
一方で特定のフレーズだけを置き換えたいときなど、nで検索し、カーソルを当てた単語を.で置き換えるということもよくやります。
特定の単語を検索しておき、一番最初の単語だけcwで変更します。
後はnで移動させて必要なところだけ.で変更できます。

### TIP6： ドットの公式

**→理想は移動に1キーストローク、編集に1ストローク**

特に移動のキーストローク数をいかに減らすか、ですね。
1ストロークが難しいことももちろんありますが、ストローク数を減らす意識は重要です。

## 第2章 ノーマルモード

### TIP7： 埃を払って一息つこう

**→ ノーマルモードは、構想を練るためのもの**

Vimはキーストロークの方法で効率が違ってきます。
ノーマルモード時に操作のイメージを思い描きましょう。
少し考えて効率のよい編集方法を思い出せることは多いです。

### TIP8： アンドゥはひとまとめに

**→ アンドゥの単位を考えて意図的に挿入モードを抜ける**

vimのアンドゥは「1つの変更」単位です。
挿入モードに入ってテキストを編集、抜けるまでの操作も1つの単位となります。
つまり、どこで挿入モードを抜けるかを考えることでアンドゥの単位をコントロールできます。
書籍には1文の途中、区切りの良い場所であえて挿入モードを抜ける手法が例に取り上げられています。
これもアンドゥのポイントを設定しています。

### TIP9： 変更を繰り返し可能なものにする

**→.を使いやすいコマンドを考える。**

TIP2と同じです。

### TIP10： 回数指定を使って簡単な計算を行う

**→ctrl-X, ctrl-Aは（カーソルに数字がなくても）直近の数字の計算を行う。**

「カーソルに数字がなくても」ということを知りませんでした。
さらに直近の数字にカーソルが移動することもポイントです。
これを知っておくと.コマンドの繰り返しもよりやりやすくなるでしょう。

### TIP11： 繰り返しで済むなら、回数を指定しない

**→回数指定より繰り返しの方が便利なことも**

5dwは単語5つ分を削除しますが、数えるのが面倒な場合があります。
頭で考える方が却って時間がかかる場合です。
dwで1単語を消してから.で繰り返す方が楽なこともあります。
.で消し過ぎたときはTIP4です。
uで元に戻せばよいのです。

### TIP12： 統合して統治せよ

**→vimの操作はオペレータとモーションの組み合わせ**

これに気付くと、応用を効かせてコマンドを覚えることができます。
まずはオペレータとなるキーを押してからモーションとなるキーを押すことで
vimの編集は成り立っています。
例えば以下のように分解して考えます。

- dG → d（削除のオペレータ）とG（最終行までのモーション） → 現在行から最終行まで削除
- c\$ → c（変更のオペレータ）と$（行末までのモーション） → 現在のカーソルから行末までを変更
- yw → y（ヤンクのオペレータ）とw（1単語を表すモーション） → 現在のカーソルから１単語文をヤンク
echo製のサーバでgRPCも走らせる方法

echoで作ってるRESTサーバにgRPCを足したかったのだけど、さっとやり方が見つからなかったのでメモ


こんな感じのechoのミドルウェアを作って

``` golang
func GRPCMiddleware(grpcServer *grpc.Server) func(next echo.HandlerFunc) echo.HandlerFunc {
	return func(next echo.HandlerFunc) echo.HandlerFunc {
		return func(c echo.Context) error {
			r := c.Request()
			w := c.Response()
			if r.ProtoMajor == 2 && strings.Contains(r.Header.Get("Content-Type"), "application/grpc") {
				grpcServer.ServeHTTP(w, r)
				return nil
			}
			if err := next(c); err != nil {
				c.Error(err)
			}
			return nil
		}
	}
}
```

使う

```
e.Use(GRPCMiddleware(gRPCServer))
```

認証とかロギング　エラーハンドリングを一元管理できていいです。
そのうちjsからgRPC叩けるようなればgRPCだけでいいんでしょうけど、、

ネタ元
https://github.com/philips/grpc-gateway-example/blob/master/cmd/serve.go#L51
技術英語 > and the old knight says "He chose poorly". 

@ http://thecodist.com/article/yes_i_still_want_to_be_doing_this_at_56

> and the old knight says "**He chose poorly**". 

意訳「古(いにしえ)の騎士は言った。"彼は選択を誤った"」

この文章の上の方には

> What matters more is the ability to choose wisely among the many options. One of my favorite movie lines is from Indiana Jones and the Holy Grail, where the bad guy melts down and the old knight says "He chose poorly". 

意訳「最も重要なことは、(言語、ツール、プラットフォーム、方法論などの）たくさんのオプションから賢く選ぶ能力だ。Indiana Jones and the Holy Grailからの好きな映画のセリフの１つは、悪役が溶けて、古（いにしえ）の騎士が言った（言葉だ)。"彼は選択を誤った"」

<hr>
@ 生きるのが楽しくなる15の習慣 by 日野原重明さん

> 私は自分の人生はすべて自分が選び取るもの、と覚悟を決めて歩んでいきたいと、いつもそう心に決めています。

...

> そして、どんなときでも良い習慣を選択することを、真剣に考える必要があります。
Pythonでキー入力待ちをしないキー入力

ファンクションキーやカーソルキーなども識別可能。
ShiftキーやControlキーの単独入力は判定できないが、文字キーとの同時押しは識別可能。
termios.ISIGのマスクを有効にすると、Cntl+Cでプログラムが停止せずにキー入力として受け付ける。

ポイント

- termiosでエコーを無効、カノニカルモード無効に設定
- fcntlでNONBLOCKモードに設定 

``` python:getkey.py
import fcntl
import termios
import sys
import os

def getkey():
    fno = sys.stdin.fileno()

    #stdinの端末属性を取得
    attr_old = termios.tcgetattr(fno)

    # stdinのエコー無効、カノニカルモード無効
    attr = termios.tcgetattr(fno)
    attr[3] = attr[3] & ~termios.ECHO & ~termios.ICANON # & ~termios.ISIG
    termios.tcsetattr(fno, termios.TCSADRAIN, attr)

    # stdinをNONBLOCKに設定
    fcntl_old = fcntl.fcntl(fno, fcntl.F_GETFL)
    fcntl.fcntl(fno, fcntl.F_SETFL, fcntl_old | os.O_NONBLOCK)

    chr = 0

    try:
        # キーを取得
        c = sys.stdin.read(1)
        if len(c):
            while len(c):
                chr = (chr << 8) + ord(c)
                c = sys.stdin.read(1)
    finally:
        # stdinを元に戻す
        fcntl.fcntl(fno, fcntl.F_SETFL, fcntl_old)
        termios.tcsetattr(fno, termios.TCSANOW, attr_old)

    return chr

if __name__ == "__main__":
    while 1:
        key = getkey()
        # enterで終了、キー入力があれば表示
        if key == 10:
            break
        elif key:
            print(key)
```
[めも]Visual Studio Code (VSCode) が起動しない時など

インターネットに接続しているか確認しましょう。

インターネットに接続していない場合は、
・Visual Studio Codeが起動しない
・ターミナルなどが開かない
などの現象が発生するようです。
(バージョン:1.9.1で確認。Windows環境。)
**ローカルのみ(192.168.*など)有効な場合も、同様の現象が発生します。**
[めも]Visual Studio Code (VSCode) のタスクで、複数コマンドを連続実行したい時

#バッチファイル(またはシェルスクリプト)を作って、それを呼ぶのが良さそう。
##Windows環境の場合

(例)　バッチファイルを置く場所は、使いやすい場所で。

**.vscode\tasks.json**
```
{
    "version": "0.1.0",
    "command": ".\\.vscode\\task1.bat",
    "isShellCommand": true,
    "args": ["arg1", "arg2"],
    "showOutput": "always"
}
```
**.vscode\task1.bat**
```
chcp 65001
REM 65001は、UFT8。
REM デフォルトではShiftJIS (932)になっているので、何も設定しないと文字化けします。
REM %*は、arg1 arg2になるので注意しましょう。
REM (先頭(%0)にコマンド名は付かず、argsで設定した値だけが入ります。)
コマンド1
コマンド2
・・・
```

###バッチファイルを使った場合も、キーボードからの入力を必要とするコマンドに注意しましょう。
`start`で別ウインドウを開かないと、入力待ちのままになります。
(タスクを強制修了した時に、入力待ちのエコーが表示されます)

##`cmd /C`でもよいかも? 
Linux環境などの`bach -c`と同様の方法も使えます。
(この方法の場合、コマンドは、バッチファイルではなく、タスクに記載します。)
※`"args"`でCオプションを指定しないと、タスクが実行したままになり、帰って来ないので要注意。

**.vscode\tasks.json**
```
{
    "command": "cmd",
    "isShellCommand": true,
    "args": ["/C", "chcp 65001 && コマンド1 && コマンド2"]
    "showOutput": "always"
}
```

##Linux環境などの場合：`bach -c`などでコマンドを流し込んでも、うまく行くらしいです。
http://stackoverflow.com/questions/31702041/multiple-commands-tasks-with-visual-studio-code

Windows環境と同様に、VSCodeのタスクからシェルスクリプトを実行しても行けるはず。(未検証)
HTTPヘッダ　条件付きリクエスト、部分的GET、キャッシュ、認証、チャンク転送、他

条件付きリクエスト
・利用するメッセージ
・値
・関連メソッド
・関連ステータスコード
ETag
If-None-Match
If-Modified-Since
If-Match
If-Unmodified-Since

部分的GET
GETRange
If-Range
Accept-Range
Content-Range

キャッシュ
Pragma
Cashe-Control
Expires
Age

認証
WWW-Authenticate
Authorization
Proxy-Authorization
X-WSSE

チャンク転送
Transfer-Encoding
Trailer
TE

その他
Allow
Connection
Max-Forwards
Upgrade
Via
Warning
Content-Disposition
Slug
X-HTTP-Override
HTTPヘッダ　サーバー、クライアント、リソース情報　コンテントネゴシエーション

サーバー情報
・利用するメッセージ
・値
・関連メソッド
・関連ステータスコード
Date
Retry-After
Server
Set-Cookie
・レスポンス
・サーバーソフトフェアの名称、バージョン
・-
・-

クライアント情報
Cookie
Expect
From
Referer
Use-Agent

リソース情報
Content-Encoding
Content-Language
Content-Length
Content-MD5
Content-Type
Content-Location
Last-Modified
Location
Host

コンテントネゴシエーション
Accept
Accept-Charset
Accept-Encoding
Accept-Language
Vary

条件付きリクエスト
ETag
If-None-Match
If-Modified-Since
If-Match
If-Unmodified-Since

部分的
GETRange
If-Range
Accept-Range
Content-Range

キャッシュ
Pragma
Cashe-Control
Expires
Age

認証
WWW-Authenticate
Authorization
Proxy-Authorization
X-WSSE

チャンク転送
Transfer-Encoding
Trailer
TE

そのほか
Allow
Connection
Max-Forwards
Upgrade
Via
Warning
Content-Disposition
Slug
X-HTTP-Override
Installation How to: Nested ESXi on KVM

# Installation How to: Nested ESXi on KVM

## 目的

- ESXi のテストを仮想環境で

## システム

  - Ubuntu 14.04.3 LTS
  - qemu-kvm 2.0.0
  - libvirt 1.2.2

## 手順

### 1. 空き VNC ポート調べ

```shell-session
$ for i in `virsh -c qemu:///system list --all | awk '{print $2}' | grep -v Name` ; do virsh dumpxml $i|grep vnc  ; done | sort
```

```shell-session:output_sample
    <graphics type='vnc' port='5926' autoport='no' listen='0.0.0.0'>
    <graphics type='vnc' port='5927' autoport='no' listen='0.0.0.0'>
    <graphics type='vnc' port='5928' autoport='no' listen='0.0.0.0'>
```

### 2. VNC ポートアサイン

```shell-session
$ VNCPORT='5929'
```

### 3. VM 名の決定と Disk 作成

```shell-session
$ VMNAME='esxi6.5-test01'
```
```shell-session
qemu-img create -f qcow2 -o preallocation=metadata $VMNAME.qcow2 20G
```

### 4. メモリアサイン

```shell-session
$ RAM='4096'
```

### 5. iso ファイル名、OS タイプ指定

```shell-session
$ ISOFILE='/pathto/VMware-VMvisor-Installer-201701001-4887370.x86_64.iso'
$ OSTYPE='linux'
```

### 6. VM インストール

```shell-session
$ virt-install --connect qemu:///system \
-n $VMNAME -r $RAM \
--vcpus=sockets=1,cores=2,threads=2 \
--cpu host --disk path=./$VMNAME.qcow2 \
-c $ISOFILE --os-type $OSTYPE \
--accelerate --network=bridge:br0,model=e1000 \
--hvm --graphics vnc,port=$VNCPORT,listen=0.0.0.0
```

### 7. VNC クライアントで KVM ホストの $VNCPORT に接続

![Screenshot 2017-02-23 03.30.41.png](https://qiita-image-store.s3.amazonaws.com/0/67892/84b8f37f-b20e-4645-de24-d77279b867e0.png)


![Screenshot 2017-02-23 03.35.54.png](https://qiita-image-store.s3.amazonaws.com/0/67892/1707bafb-a9c7-22f3-5b56-b7b13bafd4a8.png)

### 8. あとは通常の ESXi 同様にインストーラを進めて下さい

### 9. おわり
Ethereum gethでContractを作成する場合のSolidity versionによる注意点

・Ethereum gethでContractを作成する場合のSolidity versionによる注意点をまとめました。
　[今回使用したSolidity version 0.4.9]


【本文】
------------
EthereumのContractをgethで記述しコンパイル後、登録する際、
Solidity versionが0.4.9だと一部記述が変更されているので注意。
（※自分も結構悩んだので、備忘の意味も込めて共有。。。）

具体的には、以下のようなContractを作成する場合、

（Contractの例）
※『Ethereum入門』-Contractを作成する-　に記載されたContract作成例を参照しました。

----------------------------------
contract SingleNumRegister {
    uint storedData;
    function set(uint x) {
        storedData = x;
    }
    function get() constant returns (uint retVal) {
    return storedData;
    }
}

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

geth上で

（１．ソースを定義）
> var source = "contract SingleNumRegister { uint storedData; function set(uint x) { storedData = x; } function get() constant returns (uint retVal) { return storedData; }}"

（２．コンパイル）
> var sourceCompiled = eth.compile.solidity(source)

（３．ABI情報を取得）
> var contractAbiDefinition = sourceCompiled.SingleNumRegister.info.abiDefinition

（４．コントラクトを作成）
> var sourceCompiledContract = eth.contract(contractAbiDefinition)

（５．トランザクションを生成・送信）
> var contract = sourceCompiledContract.new({from:eth.accounts[0], data: sourceCompiled.SingleNumRegister.code})

という流れであったが、
Solidity version 0.4.9では、（３）及び（５）の記述は以下の通りに一部変更となる。

【変更箇所】
----------------
sourceCompiled.SingleNumRegister　⇒　sourceCompiled['\<stdin>:SingleNumRegister']

（３．ABI情報を取得）
> var contractAbiDefinition = sourceCompiled['\<stdin>:SingleNumRegister'].info.abiDefinition

（５．トランザクションを生成・送信）
> var contract = sourceCompiledContract.new({from:eth.accounts[0], data: sourceCompiled['\<stdin>:SingleNumRegister'].code})



【参考】
--------------
・『Ethereum入門』-Contractを作成する-
https://book.ethereum-jp.net/first_use/contract.html

・"Ethereum Beta"
http://ethereum.stackexchange.com/questions/11912/unable-to-define-greetercontract-in-the-greeter-tutorial-breaking-change-in-sol
内閣府の「国民の祝日」のCSVファイルをpandasで整形する

Twitterで叩かれてたあれです。
どんな酷い代物なんだろうと思ってpythonのpandasで開いてみました。
実物がこれ

![スクリーンショット 2017-02-23 0.52.30.png](https://qiita-image-store.s3.amazonaws.com/0/125193/a08b5e0c-c3fe-260d-1153-3d0c63a5a74b.png)

このCSVファイルの使い道がわからないので何とも言えないですが、これってそこまで酷いんですかね？
てっきり行と列がズレてるとか、日付けのフォーマットがばらばらとかそういうのを期待してたんですが。
日付けのフォーマットのズレに関してもpandasには時系列を統一させる機能もあるので比較的容易に解決できます。

何はともあれ整形してみましょう。


![スクリーンショット 2017-02-23 2.05.59.png](https://qiita-image-store.s3.amazonaws.com/0/125193/fa419372-b16c-b1ac-b34d-80da4f1cee91.png)

整形したのは
・欠損値が存在する列の削除
・重複した名称の削除
・日付けを文字列型からdatetime型に変更
以上3点です。

これで多少見やすくなったんですかね。

ついでにその祝日で毎年ズレが発生しているのかを表示しておきましょう


![スクリーンショット 2017-02-23 2.09.51.png](https://qiita-image-store.s3.amazonaws.com/0/125193/07e53e9d-0431-5497-261c-f83b73b3d787.png)

おまけで1列にまとめたバージョンも

![スクリーンショット 2017-02-23 1.17.05.png](https://qiita-image-store.s3.amazonaws.com/0/125193/4bff17db-7d34-4cb6-74ed-2eade7e2d08d.png)

こういったデータ整形はPandasを使えば簡単にできます。
Reduxをソースコードから理解する その1

[Redux](https://github.com/reactjs/redux)は簡単に全部読める規模のライブラリです。ソースコードを読んでからリファレンスを見たほうが理解しやすかったので紹介します。また、有名なコードを読むことによるJavaScriptの勉強も兼ねています。
今回はReduxの中心であるStoreの作成・初期化と`dispatch()`について見ていきます。

# 対象読者

Reduxを少なくとも1回くらい使ってみた人向けです。
バージョンは、2017-2-22時点でmasterの3f319eb7を見ています。

# Store

Reduxはreactなどのview libraryと併用し、状態管理をするライブラリです。アプリの状態を1つにまとめた構造(=Store)に対して、操作(=Action)を割り当てる(Dispatch)することで遷移させます。

[Store · Redux](http://redux.js.org/docs/api/Store.html)
まずは、Storeを作成する`createStore()`をみていきます。しばらく`reducer`以外の引数は`undefined`だと思っておきます。そうして、関数定義とエラーチェックを省略すると、実体はこれだけです。`dispatch({ type: ActionTypes.INIT })`が気になります。

~~~javascript:createStore.js
export default function createStore(reducer, preloadedState, enhancer) {

（エラーチェック）

  let currentReducer = reducer
  let currentState = preloadedState
  let currentListeners = []
  let nextListeners = currentListeners
  let isDispatching = false

（関数定義）

  dispatch({ type: ActionTypes.INIT })

  return {
    dispatch,
    subscribe,
    getState,
    replaceReducer,
    [$$observable]: observable
  }
}
~~~

`dispatch()`は3つのことを行います。`currentState`更新、`currentListeners`の更新、`listener()`の呼び出しです。
`dispatch({ type: ActionTypes.INIT })`を呼び出した時点では、`listeners`は空の配列です。つまり、`currentState`更新しかしません。この`dispatch()`によって、Stateの初期化を行います。

今考えている状態は`currentState = preloadedState`、つまり`currentState`は`undefined`です。`currentReducer()`は、`createStore`の引数で、ユーザが決めた`reducer`なのでした。

~~~javascript:createStore.js
  function dispatch(action) {

（エラーチェック）

    try {
      isDispatching = true
      currentState = currentReducer(currentState, action)
    } finally {
      isDispatching = false
    }

    const listeners = currentListeners = nextListeners
    for (let i = 0; i < listeners.length; i++) {
      const listener = listeners[i]
      listener()
    }

    return action
  }
~~~

# Reducers

[Reducers · Redux](http://redux.js.org/docs/basics/Reducers.html)
ReducersはRedux利用者が定義する関数で、Storeの`dispatch()`で`currentReducer()`として呼び出されます。
前述のStore初期化のために、渡されたStateが`undefined`だった場合、初期値を返す必要があります。また、それ以外のときに`ActionTypes.INIT`のように自分で定義していないActionが渡された場合は、Stateを変更しないで返す必要があります。

~~~javascript:createStore.js
/**
 * These are private action types reserved by Redux.
 * For any unknown actions, you must return the current state.
 * If the current state is undefined, you must return the initial state.
 * Do not reference these action types directly in your code.
 */
export const ActionTypes = {
  INIT: '@@redux/INIT'
}
~~~

サンプルコードなどでは、こんな感じで書いているものが多いようです。

~~~javascript:Reducer
const reducer = (state = initialState, action) => {
  switch (action.type) {
    case UPDATE:
      // update state
      return newState;
    default:
      return state;
  }
};
~~~

# あとがき

Reduxはいろんな機能を実装した便利なソフトウェアというわけではなくて、優れた考え方が支持されたソフトウェアなのだな、と思います。コメントも多いので、JavaScriptの勉強にも向いているのではないでしょうか。見切り発車で「その1」と銘打ってみたので、次回に続く予定です。

次回：[Reduxをソースコードから理解する その2 - Qiita](http://qiita.com/juntaki/items/7df6a6cbca990281ced8)
Androidアプリをストアに公開した後、そのアプリのログイン機能が機能しなかった時の対処方法

# 症状
　チャットアプリを作成し、ストアに公開しました。そのアプリは、まず最初の画面でGoogleアカウントを利用してログインし、それからチャット画面へ移動する仕組みになっています。ところが、ストアに公開したあとインストールし、動作を確認してみたところ、ログインできませんでした。デバック時にはしっかりとログイン機能は働いていたのに、ストアからインストールしたアプリはログイン機能が働きませんでした。
#原因
　原因としては、アプリの証明書にデバック用とリリース用の２種類あるということを知らずに、デバック用のフィンガープリントしか登録していなかったことです。

#方法
　証明書のフィンガープリントの表示方法は、

デバック用
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android

リリース用
keytool -list -v -keystore ***your_keystore_name*** -alias ***your_alias_name***

をターミナルに入力します。

表示されたフィンガープリントを両方共登録することで、デバック時とリリース後にしっかりとログイン機能が働くようになりました。

#参考
https://developers.google.com/places/android-api/signup?hl=ja
Gitのaliasに設定したコマンドを実行するとPermisson deniedって言われる

### 現象
.gitconfigに

```
[alias]
  st = status
```

とか書いた状態で、`git st`を実行すると`fatal: cannot exec 'git-st': Permission denied`って言われて、`git status`が実行されない

### 調査
http://stackoverflow.com/questions/4019501/git-alias-problem

ここを見るとstraceで調査しろってことなので、やってみる。
実行するユーザーは`drwtsn64`とする。

```bash
$ strace -f -eexecve git st 2>&1 | grep EACC

[pid 57935] execve("/home/hoge/bin/git-st", ["git-st"], [/* 23 vars */]) = -1 EACCES (Permission denied)
```

なんか`/home/hoge/bin/git-st`っていうhogeユーザのbinディレクトリを見てて様子がおかしい。
これが起きた背景としてはhogeユーザーで`su -- drwtsn64`でdrwtsn64ユーザーでログインしていたので、
PATH環境変数が引き継がれてしまったみたい。

`su drwtsn64`でも環境変数が引き継がれる。環境変数を引き継がないためには`-`を入れないといけない。

### 解決策
`su - drwtsn64`でログインする
そもそもsuコマンドの理解が足りてなかった。
ドキュメントコメントまとめ(仮)

# ドキュメントコメントについて
プログラミングのサンプルソース等には&lt;summary>や@が付けられた、
謎の書式による関数やクラスの概要が記述されていることが多い。
その正体は媒体により呼び名は異なるが、ドキュメントコメントなどと言われるもののようだ。

これは、読んでそのままに関数やクラスのドキュメント用のコメントであるが、
一定の書式に収めることで、エディタで自動で型を保管してくれたり、
インテリセンスでの説明文として、
またはドキュメントの自動生成などで使用できるようになる。

近いうちにもう少し触りこんでみたい。

# 各言語の書式とかのリンク(興味ある言語だけ)
## Visual C++ (ドキュメント コメント)
https://msdn.microsoft.com/ja-jp/library/ms177246.aspx

## <span>C#</span> (ドキュメント コメント)
https://msdn.microsoft.com/ja-jp/library/5ast78ax.aspx
http://dobon.net/vb/dotnet/programing/xmldocument.html

## VisualBasic (ドキュメント コメント)
https://msdn.microsoft.com/ja-jp/library/ms172652.aspx
https://msdn.microsoft.com/ja-jp/library/aa289191(v=vs.71).aspx
http://dobon.net/vb/dotnet/programing/xmldocument.html

## JavaScript (JSDoc)
https://msdn.microsoft.com/ja-jp/library/mt162307.aspx
https://ics.media/entry/6789

## Python (ドキュメンテーション文字列、docstring)
http://trivial-contents.com/programming/python/pydoc.html
http://h-miyako.hatenablog.com/entry/2014/11/11/072309
http://qiita.com/methane/items/e95c578c3d8fc5f1f62e

## CommonLisp
http://tips.cddddr.org/common-lisp/index.cgi?%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3
http://sile.hatenablog.jp/entry/20100124/1264260951

## HSP (hs ドキュメンテーションコメント)
http://www.onionsoft.net/hsp/v34/doclib/HSP%20Document%20Library/hdl_usage.htm
http://www.onionsoft.net/hsp/v35/doclib/HSP%20Document%20Library/HS_BIBLE.txt
※ファイルのエンコードは要Shift-JIS & CRLFであること

## D言語
http://www.kmonos.net/alang/d/ddoc.html
Macの便利な使い方〜アプリ編〜

#この記事について
社内で"Macの便利な使い方講座"の講師をやることになったのでメモ書き。
そのまま使えればいいなとも。
[Macの便利な使い方〜設定編〜](http://qiita.com/td2983_qp/items/ef037e752315ea4b735d)の続き

#〜アプリ編〜
##[Better Touch Tool](https://www.boastr.net/)
なんと言ってもこれ。
「せっかくMac使ってるんだしトラックパッド使いこなしたい!」って人はぜひ。
これを入れるだけでトラックパッドのパワーが３倍くらいになる。
１年くらい前に有料になってしまったけど、
６００円しないくらいだし払う価値はあるかと。
トライアル期間あるし、試してみてからでも遅くはない。
設定画面はこんな感じ。
<img width="1014" alt="スクリーンショット 2017-02-23 0.10.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/42587/471d3701-d69a-531d-fa8f-112e7ca9f114.png">
トラックパッドだけじゃなく、マウスの挙動やショートカットキーを新しく登録できる。
アプリごとに操作の設定ができるが、参考に自機のGlobal設定↓
<img width="811" alt="スクリーンショット 2017-02-23 0.13.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/42587/51a6239f-93e7-7e05-c9c2-ab8e4cb55c25.png">
３本指でタブ立ち上げ・タブを閉じる・タブ移動ができるように、
４本指で画面サイズの切り替えができるようにしている。
ジェスチャーを追加したい時は、
右下の方にあるAdd New Gestureをクリックすると登録フォームが下部に表示される。

##[Alfred](https://itunes.apple.com/jp/app/alfred/id405843582?mt=12&ign-mpt=uo%3D4)
Macの超優秀なランチャーアプリ。
1文字ごとに検索してくれて、しかも検索が早い。
ついでに言うと、よく開くアプリ・ファイルを学習してくれる。
Web検索もこれでできる。
Mac標準のSpotlight検索とかいらない。
<img width="539" alt="スクリーンショット 2017-02-23 0.21.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/42587/1f19b0e2-b54f-ea3d-fe2e-de37ffbb66c0.png">
これを入れたらSpotlightなんか無効にしちゃいましょう。
システム環境設定>キーボード>ショートカット
~~で、Spotlightを無効にすると１ついいことがあって、~~
~~Excelを使うときに⌘+spaceで列選択できるようになる。~~
ctrl+spaceだった。失敬。
<img width="665" alt="スクリーンショット 2017-02-23 0.27.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/42587/04f36e5f-463c-5160-21e4-f2103468bfdb.png">
Alfred、デフォルトではファイル検索をしてくれないので
ファイル検索をしたければ設定しましょう（非推奨）
<img width="1097" alt="スクリーンショット 2017-02-23 0.28.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/42587/96abb983-0c93-9784-7f11-fdccf95fd11e.png">
↑ご覧の通り、not recommended!と怒られます。

##[CLCL Lite](https://itunes.apple.com/jp/app/clcl-lite/id495511246?mt=12)
Macのイージーなランチャーアプリ。
特定の動作をすると起動するアプリを１つだけ設定できる。
僕の場合は、⌘キーをダブルクリックした時に上記のAlfredを起動するように設定している。
AlfredはAlt+spaceでも起動できるんだけど、２本指を使うのが面倒なので。
設定画面↓
<img width="301" alt="スクリーンショット 2017-02-23 0.32.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/42587/d249be61-0a67-04bd-f655-53bb18c1bdba.png">

##[Xtra Finder](https://www.trankynam.com/xtrafinder/)
Finderの設定ができるよ！！
returnキーでファイルを開けるように設定できるする。
<img width="508" alt="スクリーンショット 2017-02-23 0.52.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/42587/911b00be-d56c-0940-3d35-84b14a66ef23.png">

##[CheatSheet](https://www.mediaatelier.com/CheatSheet/)
ショートカットキー一覧を見ることができる。
![main.png](https://qiita-image-store.s3.amazonaws.com/0/42587/f146f58c-d76e-9742-b0b2-5bce96c139e0.png)

##[Onyx](http://www.titanium.free.fr/onyx.html)
Macを引くほど詳しく設定できる。
上級者向け。

##[Clipy](https://clipy-app.com/)
コピーした履歴を勝手に保存してくれる。
↓公式サイトから
![](https://clipy-app.com/img/screenshot1.png)

ショートカットキーを設定しておくと便利。（環境設定から）
自分の場合はoption+zで履歴が開くように設定している。
<img width="477" alt="スクリーンショット 2019-04-30 21.46.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42587/7d946618-5a86-7474-ae46-3b47c1b4adfc.png">
VCCW デフォルトでsite.ymlの設定

# グローバルな設定は ~/.vccw/config.yml に設定できる

```
~/.vccw/config.yml
```
```
linked_clone: true
cpus: 2
memory: 1024
lang: ja
```

たまたま記事に入っていたlink_cloneという機能を知らなかったので調べてみた。
VCCWのsite.ymlの設定でvagrant linked_clone という機能を設定できるらしい。

## linked_clone 
一つのマスターVMを元にして複数のクローンVMを作り出すという機能らしい。
クローンしたVMの方は差分のデータで作成しているようで容量や時間が短縮できる。
記事が2015/12ってなっていたので結構前からあったみたい。
linked_cloneを使用した際はVMを削除するときに注意が必要。
（削除する作業が出た際に追記する予定）

[Vagrant 1.8](https://www.hashicorp.com/blog/vagrant-1-8.html)
[Vagrant 1.8の新機能 Linked CloneとSnapshotを試してみた
](http://dev.classmethod.jp/tool/vagrant-linked-clone/)

##デフォルトの設定ファイル

```
vccw-dir/provision/default.yml
```
自分的に参照しにくかったので分解して部分的に試していくことにした。

[VCCW v3での変更点と新機能まとめ](http://qiita.com/miya0001/items/041e9363ff81695a2251)
RAD Studio/Delphi/C++BuilderでのiOS/macOS向けアプリ開発で実機デプロイに用いるブリッジサーバのPAServerを対話的に選択起動するランチャーを作る

# 本記事のサマリ
- RAD Studio/Delphi/C++Builder でのiOS/macOS向けアプリ開発ではPAServerが必須
- PAServer はWindows上のIDEからmacOSを経由して実機デプロイするためのブリッジサーバ
- PAServer は RAD Studio/Delphi/C++Builder の個々のバージョンに付属するものを用いる
- Bash が大好きなエンジニアとしては、PAServer はシェルから起動しつつ、でも対話的に複数バージョンを選ぶインタフェースも欲しい


# プロローグ
 マルチプラットフォーム向け開発環境のRAD Studio/Delphi/C++Builderを使用するときに、iOSやmacOS向けの実機デプロイで欠かせないのはPAServerというブリッジサーバです。RAD Studio/Delphi/C++BuilderのIDEはWindows上で動きますが、macOSやiOSの実機テストでのデプロイはmacOSを経由せねばならないので、そのためにmacOS上で動かすブリッジサーバがPAServerです。

そしてPAServerはRAD Studio/Delphi/C++Builderのバージョンに合致したものを使う必要があります。様々な理由によってRAD Studio/Delphi/C++Builderの複数バージョンを併用する場合では、起動するPAServerを適切に選択実行せねばなりません。

しかしPAServerの実行は基本的にGUI操作となりますので、利用するRAD Studio/Delphi/C++Builderのバージョンに合ったものを選んで実行しておかねばなりません。このときにマウス（タッチパッド）の操作でPAServerを選択起動するのが案外めんどくさいなあ、と思ったので、ターミナル上からPAServerを対話的に選択実行するlauncherを作ってみました。

# 実装方針
基本的な実装は bash のシェルスクリプトです。キーボードからのタイピングだけでPAServerを選択起動できるので、自分にとってはこれがベスト。

そして以下のような方針で実装してみます。

- /Applications/PAServer-*.app/ にインストールされた PAServer は全てリストアップして対話的に操作できるようにする
- peco があればインタラクティブなUIのために用いる
- peco が無くてもメニュー方式で使えるようにする
- メニュー表示は ja/en/de/fr の4ヶ国語対応できるようにする(やる意味はほとんど無いけれど)

# 実装
こちらのGithubリポジトリより PAServer.sh をダウンロードしてご利用いただけます。気が向いたら適時改良しています。
https://github.com/kazinoue/paserver-launcher

最新の実装では ~/.paserverrc が存在したら設定ファイルとみなして自動的に読み込むようにしましたので、PAServerへの接続パスワードを常に設定したい場合などに便利に使えます。

# 実行例
## peco と組み合わせた場合
![paserver_launcher_script1.gif](https://qiita-image-store.s3.amazonaws.com/0/149350/977fe6b1-1c31-ad1c-cd23-ad2d1baa760a.gif)

## peco や percol がない場合
![paserver_launcher_script2.gif](https://qiita-image-store.s3.amazonaws.com/0/149350/b4d89b2a-5764-2cea-0462-473b15fc917c.gif)
2つの矩形に含まれるマス目の数


- まさかの既知の問題…まあFシリーズだからいいか。でも既知じゃなかったら難しかったかもしれない。
- 入力が汚いのはご愛嬌。

- if 0 / elseで切ってある後者(使われる方)は[いもす法](https://imoz.jp/algorithms/imos_method.html)と呼ばれるものです。
- って[白黒陣取りゲームのときに紹介してたわ](http://qiita.com/cielavenir/items/a88865e276a1079cfc5d)

- [170226追記] 別件で、いもす法の添字を回す順番でTLEしたので、ちゃんと内側から回すようにしました。

```cpp:tyama_henaf02.cpp
//http://qiita.com/Nabetani/items/109c31c265be7fa1a36c
//http://nabetani.sakura.ne.jp/hena/ordf02in2rec/

//cf:
//http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_4_A
//http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=2119826

#include <cstdio>
#include <vector>
#include <set>
#include <map>
using namespace std;
long long solve(const vector<pair<pair<int,int>,pair<int,int>>> &v){
	set<int>lx,ly;
	for(auto &e:v){
		lx.insert(e.first.first);lx.insert(e.second.first);
		ly.insert(e.first.second);ly.insert(e.second.second);
	}
	int i;
	map<int,int>mx,my,sx,sy;
	i=0;for(auto ix1=lx.begin(),ix2=lx.begin();++ix2!=lx.end();++ix1,++i){
		mx[*ix1]=i,sx[i]=*ix2-*ix1;
	}
	mx[*lx.rbegin()]=i,sx[i]=0;
	i=0;for(auto iy1=ly.begin(),iy2=ly.begin();++iy2!=ly.end();++iy1,++i){
		my[*iy1]=i,sy[i]=*iy2-*iy1;
	}
	my[*ly.rbegin()]=i,sy[i]=0;
	vector<vector<int>>m(my.size());
	for(auto &e:m)e.resize(mx.size());
#if 0
	for(auto &e:v){
		for(int y=my[e.first.second];y<my[e.second.second];y++)
			for(int x=mx[e.first.first];x<mx[e.second.first];x++)m[y][x]++;
	}
#else
	for(auto &e:v){
		m[my[e.first.second]][mx[e.first.first]]++;
		m[my[e.second.second]][mx[e.first.first]]--;
		m[my[e.first.second]][mx[e.second.first]]--;
		m[my[e.second.second]][mx[e.second.first]]++;
	}
	for(int y=0;y<sy.size();y++)for(int x=1;x<sx.size();x++)m[y][x]+=m[y][x-1];
	for(int y=1;y<sy.size();y++)for(int x=0;x<sx.size();x++)m[y][x]+=m[y-1][x];
#endif
	long long r=0;
	for(int y=0;y<sy.size();y++)for(int x=0;x<sx.size();x++)if(m[y][x]==2)r+=(long long)sx[x]*sy[y];
	return r;
}
int main(){
	int x1_0,y1_0,x2_0,y2_0,x1_1,y1_1,x2_1,y2_1,x1_2,y1_2,x2_2,y2_2;
	for(;~scanf("%d,%d-%d,%d/%d,%d-%d,%d/%d,%d-%d,%d",&x1_0,&y1_0,&x2_0,&y2_0,&x1_1,&y1_1,&x2_1,&y2_1,&x1_2,&y1_2,&x2_2,&y2_2);){
		vector<pair<pair<int,int>,pair<int,int>>>v={
			{{x1_0,y1_0},{x2_0+1,y2_0+1}},
			{{x1_1,y1_1},{x2_1+1,y2_1+1}},
			{{x1_2,y1_2},{x2_2+1,y2_2+1}},
		};
		printf("%lld\n",solve(v));
		fflush(stdout);
	}
}
```
telnetでBASIC認証を通す

はじめて telnet を扱う人が雑に試してみた情報です。

<img width="710" alt="スクリーンショット 2017-02-23 0.05.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/47035/1a911527-40ee-5edc-660a-143f604b8d43.png">

# BASIC認証を要求するWebサーバを立てる

- https://github.com/tj/serve

```bash
$ echo '<h1>Hello</h1>' > index.html
$ npm i -g serve
$ export SERVE_USER=admin
$ export SERVE_PASSWORD=secret
$ serve -a

   ┌──────────────────────────────────────────────────┐
   │                                                  │
   │   Serving!                                       │
   │                                                  │
   │   - Local:            http://localhost:3000      │
   │   - On Your Network:  http://192.168.0.21:3000   │
   │                                                  │
   │   Copied local address to clipboard!             │
   │                                                  │
   └──────────────────────────────────────────────────┘
```

# `telnet`コマンドを使う

### BASIC認証が有効なことを確認する

```bash
$ telnet localhost 3000
Trying ::1...
Connected to localhost.
Escape character is '^]'.

GET / HTTP/1.1

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="User Visible Realm"
Content-Length: 13
Date: Wed, 22 Feb 2017 15:04:20 GMT
Connection: keep-alive

Access Denied
```

### 認証情報を付加してお返事をいただく

```bash
$ telnet localhost 3000
Trying ::1...
Connected to localhost.
Escape character is '^]'.

GET / HTTP/1.1
Authorization: Basic YWRtaW46c2VjcmV0  ★ココ★

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Accept-Ranges: bytes
Cache-Control: public, max-age=3
Last-Modified: Wed, 22 Feb 2017 14:37:44 GMT
ETag: W/"f-15a6641aac0"
Content-Length: 15
Vary: Accept-Encoding
Date: Wed, 22 Feb 2017 15:04:55 GMT
Connection: keep-alive

<h1>Hello</h1>
```

### cf.
- [telnetでブラウズ\(HTTP\)](http://ash.jp/net/telnet_http.htm)
- [telnetでBASIC認証対応http接続 \| ♪8thNote♪](http://blog.c-production.com/?p=885)
- [BASE64エンコード \- UIC](https://base64encode.uic.jp/)
PHP Object Injection とアプリケーションの互換性についての考察

# PHP Object Injection (POI) とは何か

以下のリンクが参考になります。

* [PHP Object Injection - OWASP](https://www.owasp.org/index.php/PHP_Object_Injection)
* [PHPのunserialize関数に外部由来の値を処理させると脆弱性の原因になる](http://blog.tokumaru.org/2015/07/phpunserialize.html)
* [PHPにおけるオブジェクトインジェクション脆弱性について](http://blog.a-way-out.net/blog/2014/07/22/php-object-injection/)

PHP の `unserialize` 関数に、外部からコントロールでき改竄されたことを検証できない値を渡している場合に発生する脆弱性です。

修正方法は、上記のリンクのいずれにも記載がある通り `unserialize` / `serialize` 関数を使う代わりに `json_decode` / `json_encode` を使うようにすることです。

なお PHP7 から導入された [allowed_classes](https://secure.php.net/manual/ja/function.unserialize.php) を `false` に設定するという方法もありますが、今回は PHP5 系のことを考えて以下では検討しないことにします。
（`allowed_classes`を設定する方法については [Practical PHP Object Injection (p. 82)](https://www.insomniasec.com/downloads/publications/Practical%20PHP%20Object%20Injection.pdf) のように本当にバイパスできないものなのか、という意見もあります）


# POI 修正前後で失われる互換性について

上記の通り、修正のためにはデータのシリアライズ方式を変更する必要があります。
つまり、アプリケーションの修正前にシリアライズされたデータが、アプリケーション修正後にはデシリアライズできないことになります。
そういった事態が問題になるかどうかはアプリケーションの仕様によるとは思いますが、互換性は失われてしまいます。

もちろん POI により任意の PHP コードが実行できるようになってしまう可能性を考えると、修正により互換性が失われることを許容できる場合もあると思いますが（というよりもそれが大半の場合ではないかと思いますが）、許容できない場合もあると思います。

許容できない、となると前述の方法では修正できないということになってしまいますので、以下ではこの場合について修正方針を考えていきます。


# 考えられる対応

以下のような状況にあるアプリケーションを考えます。

* (0): `unserialize` で外部からコントロール可能な値を処理している (データのシリアライズは `serialize` で実施)

これを以下のように変更していくとどうでしょうか？

* (1): データのシリアライズは `json_encode` で実施するように変更。デシリアライズを、最初に `json_decode` を試みて失敗したら `unserialize` するようにする
* (2): `unserialize` でデシリアライズする必要のあるデータの割合が、あらかじめ決めておいた閾値より小さくなったタイミングでデシリアライズを `json_decode` のみに変更する

このように (0) -> (1) -> (2) の順で修正を実施すると、(0) の段階でシリアライズされたデータを (1) の段階でも引き続き処理でき、最終的な (2) に至るまでに互換性が失われるデータを少なくすることができます。

しかし、この修正方法では (1) の修正途中の段階では依然として POI が残ったままであり、この点で問題があるといえます。

そこで、(1) の部分を以下のように変えてみます。

* (1'): データのシリアライズは `json_encode` で実施するように変更。デシリアライズを、最初に `json_decode` を試みて失敗したら `unserialize'` するようにする。

`unserialize'` というのは以下のものと考えてください。

* POI を引き起こす object のデシリアライズはしない
* それ以外の boolean、integer、string、arrayといったPOIを引き起こさない値のみをデシリアライズする

(0) -> (1') -> (2) の順で修正を実施することで、(0) の段階でシリアライズされたデータを (1') でも引き続き処理しつつ POI は発生させないようになっており、(0) -> (1) -> (2) の順で修正した場合に比べて状況が改善されているといえると思います。


# 作ったもの

前述した `unserialize'` に相当するものとして、 restricted-unserialize という composer package を作成しました。

https://github.com/xKerman/restricted-unserialize


# まとめ

* POI を修正するために `unserialize` を `json_encode` に置き換える過程で生じる互換性の問題について記述しました
* 互換性の問題を回避しつつ POI を修正する方法として、 `unserialize'` を利用する方法を提案しました
* `unserialize'` の実装として、 restricted-unserialize というパッケージを作成しました
オフラインリアルタイムどう書く F02 の ruby による実装例

問題 : http://nabetani.sakura.ne.jp/hena/ordf02in2rec/
実装例リンク集 : http://qiita.com/Nabetani/items/109c31c265be7fa1a36c

まずは百万×百万だと死ぬ実装。

```ruby
class Array
  def x; self[0]; end
  def y; self[1]; end
end

def cells_impl( rects )
  c=Hash.new{ |h,k| h[k]=0 }
  rects.each do |x0,y0,x1,y1|
    (x0..x1).each do |x|
      (y0..y1).each do |y|
        c[[x,y].join]+=1
      end
    end
  end
  c.keys.select{ |k| c[k]==2 }
end

def cells( src )
  cells_impl( src.split("/").map{ |rc| rc.scan(/\d+/).map(&:to_i) } )
end

def solve( src )
  cells( src ).size.to_s
end

DATA.map{ |line|
  num, src, expected = line.split(/\s+/)
  actual = solve( src )
  okay = actual == expected
  puts( "%s %s : %s->%s ( %s )" % [ (okay ? "ok" : "***NG***" ), num, src, actual, expected ] )
  okay
}.all?.tap{ |x| puts( x ? "okay!" : "something wrong" ) }
__END__
0 5,1-7,9/3,2-8,6/0,5-9,5 15
1 0,0-9,9/0,0-9,9/0,0-9,9 0
```

parse がやる気ない感じですいません。

すぐに数えないで cell のリストを作っているのは、出題の図を作るため。解くだけなら直接 count するのが良いと思う。

つづいて、百万×百万でも行ける実装

```ruby
class Array
  def x; self[0]; end
  def y; self[1]; end
end

def solve_impl( src0 )
  src = src0.map{ |x| [[x[0], x[1]], [x[2]+1, x[3]+1]] }
  xs, ys = [:x,:y].map{ |m| src.map{ |rc| rc.map(&m) }.flatten.sort.uniq }
  r=0
  ys.each_cons(2) do |y0,y1|
    xs.each_cons(2) do |x0,x1|
      count = src.count{ |rc|
        rc[0].x<=x0 && x0<rc[1].x && rc[0].y<=y0 && y0<rc[1].y
      }
      next unless count==2
      r+=(y1-y0)*(x1-x0)
    end
  end
  r
end

def solve( src )
  solve_impl( src.split("/").map{ |rc| rc.scan(/\d+/).map(&:to_i) } ).to_s
end

DATA.map{ |line|
  num, src, expected = line.split(/\s+/)
  actual = solve( src )
  okay = actual == expected
  puts( "%s %s : %s->%s ( %s )" % [ (okay ? "ok" : "***NG***" ), num, src, actual, expected ] )
  okay
}.all?.tap{ |x| puts( x ? "okay!" : "something wrong" ) }
__END__
0 5,1-7,9/3,2-8,6/0,5-9,5 15
41  112863,136827-415321,945235/278661,676383-304033,860715/404074,160748-970146,761914 11439007625 
```
テストデータの大半は省略。

実装方針は二通りあると思う。
一方は上記のもの。座標圧縮っていうのかな。もう一方は 
* https://twitter.com/angel_p_57/status/834338201657413632
* http://qiita.com/e0232/items/70f0a75daa97127bfdf5
* http://qiita.com/kota9/items/7fa5db61826bbf1fe3e5
にある戦略。

オフラインの現場で両方紹介できてラッキーだった。

なお。[cielさんに指摘いただいた]( http://qiita.com/Nabetani/items/109c31c265be7fa1a36c#comment-024221f2720cbb99f3b9 )とおり、矩形の数が多いと死ぬ。2000個あると、一千万回以上ループが回ることになる。指摘されるまで気づかなかったのでちょっとくやしいけど、矩形が三個に固定という問題なのでこれでいい。

出題意図としては、とにかく平易な問題を作ろいうということに注力した。
10×10 の方は非常に簡単だったでしょ？

とはいえ、参加者を見るとあんまり簡単だと良くないかなと思い、百万×百万 も用意した。
百万×百万 の方はほどよい難易度になったと考えている。簡単すぎず、難しすぎず。
Basic Operators - Arithmetic Operator


Swift はすべての数値型で利用できる4つの標準的な *算術演算子 arithmetic operators* を備えている。

* 加算 (+)
* 減算 (-)
* 乗算 (*)
* 割算 (/)

```swift
let addition = 1 + 2 // 3が格納される
let subtract = 5 - 3 // 2が格納される
let multiply = 2 * 3 // 6が格納される
let division = 10.0 / 2.5 // 4.0が格納される
```

C言語やObjective-Cと異なり、Swiftの算術演算子は標準ではオーバーフローを許容しない。意図的に行う方法については *Overflow Operators* を参照すること。

また、加算演算子は文字列接続にも利用できる。

```swift
let firstName = "John"
let lastName = "Doe"
let fullName = firstName + " " + lastName
// fullName は "John Doe" になる。
```

## 余剰演算子
*余剰演算子 remainder operator (a % b)* は割り算の余りを求める演算子。

```swift
let remainder = 9 % 4
// 9 / 4 の余りは 1 なので、remainder の値は 1 になる。
```

余剰演算子は `a % b` の答えを求めるにあたり処理の背景では下記のような計算を行なっている。

```swift
a = (b * 乗数) + 余り
```

ここでの乗数は、a にあてはまる b の最大倍数がそれとなる。
9 と 4 をあてて言うと、

```swift
9 = (4 * 2) + 1
```

となる。
また、余剰演算子は値が負であっても同じく機能する。

```swift
let negativeRemainder = -9 % 4
// negativeRemainder は -1 となる。
```

先ほどの式に -9 と 4 をあてはめると、

```swift
-9 = (4 * -2) + -1
```

となる。

## 単項マイナス演算子
数値の前に *-* を添えて利用する。その値の正負を反転させる。

```
let three = 3
let minusThree = -three
// minusThree は -3
let plusThree = -minusThree
// plusThree は 3
```

## 単項プラス演算子
数値の前に *+* を添えて利用する。これは対象の数値を一切変更せずにそのまま返す。

```swift
let minusSix = -6
let alsoMinusSix = +minusSix
// alsoMinusSix は -6
```

単項プラス演算子は実質何もしない演算子ではあるが、数値を負に変換するために単項マイナス演算子を使うコードにおいて正の数値を表すのに有用となる。
express(node.js)の設計思想に関する雑感（たぶん）。node.jsのベストなフレームワークは？？

特に意味のあることではないと思うけれど、率直な感想と「node.jsのベストなフレームワークは？？」に関する答え（？）的なことをアバウトにあいまいに書きます。

まず、node.jsは素晴らしいです。

javascriptでサーバーサイドをかけるんですもの、素晴らしいに決まっていますよね？
非同期通信するんだったら、nodeですよねぇ。非同期通信しないWEBなんて、前時代的ですよね？

さて、nodeを使うのは前提として。

「node.jsのベストなフレームワークは？？」ってのが気になるところ。rubyにおけるruby on rails的な「nodeのフレームワークっていったらこれでしょ？」的なやつ。それが知りたいと。

で調べたら、sails,meteor,express,etc..といろいろある。

かつ、「これだ！！」みたいな主流派がない。でまぁ、結局expressを選んだわけですけれども。

いかんせんこのexpressってやつはrubyOnRailsほどゴリゴリ感のあるフレームワークではない。イメージ的には「フレームワークのパーツを上げるから、自分で組み立ててね」的なノリを感じる。

さらにexpressのバージョンが３→４に上がるとさらにそれが進んで「もうちょっとここの部品を切り分けるわ。」的なノリを感じる。パッと見た感じだと「え？退化？」とも感じられるかも。

そう、この不思議なバージョンアップの方向性はどこからでてきたんだろうか。と。感じ、expressの設計思想について、考えてみたわけですけれども。

ちょっとわたしもrubyOnRailsをかじってみたわけですけれども、とにかくバージョンアップがつらい。かつ「初心者にやさしい！早く作れる！」みたいな喧伝のされかたをしていたのだけれども、全然初心者に優しくない（笑）。すごい時間かかった（笑）。しかも全然中身を理解していないところもたくさんあったし、まぁ、なんというか、rubyOnRailsの思想にはフルエタけれども、実際問題のところ、その恩恵に授かるまでの学習時間が思っていたよりも膨大だったので、勉強にナエタとでもいうべきでしょうか。

そんなこんなexpressの設計思想について妄想を巡らせていると、「あ、たぶんrubyOnRails的な思想に対するアンチテーゼなんだな」と勝手に思いいたったわけです。

どういうことかというと、RORは「ゴリゴリ機能追加して、ゴリゴリ規約追加（？）でスーパースピードでわっしょい開発、やっほい！」的な方向性（？）だとして、実際には機能が増えるにつけ、規約が増えるにつけ、学習コストは上がるので、開発コスト単体で見るとスピードアップになっているのかもしれないけれども、学習コスト＋開発コストで考えると、それほどスピードアップになっているのかどうなのか、という問題がある。（ある、と言い切れるほどの確信がこれについてはある。なぜなら、自分がかじってみて実際に思ったから）

一方のexpressについては、「挙動わかってなんぼでしょ、最低限の機能だけ提供して、便利機能はrequireしてもらうことにして、ドンドン断捨離、ドンドンシンプルにするほうが学習コストも下がるじゃん？」的なノリを感じる。実際3→4になって分離された機能とかも多い。

まぁ、バージョンアップしたら、いろいろ面倒くさいしバージョンアップで動かなくなるとかはexpressもrubyOnRailsもかわんないから、バージョンアップ毎の学習コストの加算はフレームワークにつきものなのかもしれないけれども。それでもrailsのバージョンアップは複雑さが別の複雑さに変換されるようなイメージで、expressのバージョンアップが徹底した断捨離的なイメージ、っていう差。これはバージョンアップの学習コストが比較するとexpressのほうが低い気がして、より長く付き合っていけそうだなぁ、とそういう風に感じました。

とそんなざっくりしたお話でした。

正確なお話は知らないですが、まぁ、そんな風に感じている人もいるんだなぁ、と思ってもらう程度のことを書きました。おしまい

せっかくなので、簡潔にまとめると…
・
node.jsはCool!
さらにフレームワークはexpressがBetter.
expressのバージョンアップは断捨離スマートでさらにCool!
ゴリゴリ系フレームワークはnot so coolだからI do'n like such frameworks.
「これからの強化学習」第1章を読んでみた

#強化学習とは
よく「試行錯誤しながらシステムが自ら学習を行う枠組み」と説明されます．
実際その通りで，環境におけるエージェントの状態(state)，行動(action)，それにより得られる報酬(reward)を定義してやり取りを行っていき，最終的に報酬を多くもらうためには，どの状態でどんな行動をすればいいか，を学習していきます．
これが人間とか生き物の学習のしかたに似ているということですね．餌を与えて動物に芸を覚えさせるのと同様というわけです．

#強化学習を日本語で勉強するには
強化学習をしっかり勉強しようとすると，強化学習の生みの親と言われている，Richard S. SuttonのReinforcement Learningをインターネット上で無料で読めます．
[Sutton & Barto Book:Reinforcement Learning](https://webdocs.cs.ualberta.ca/~sutton/book/the-book-2nd.html)
ちょうど2017年版が更新され，機械学習界隈では話題になりました．
ただ，もちろん英語です．
新しい分野の勉強を英語で行おうとすると，その分野のことを分かっていないのか，英語が分かっていないのか，とりあえず分からないという状態になることも多い人が多いかと思います．（私も同じです…）
上記の第一版である1998年版は「強化学習」として和訳書籍化されていますが，約20年前，もちろん基礎は変わらないものの，この流速の早い時代に20年という月日は長すぎます．
そんなこんなで，なかなか強化学習でいい和文の入門書がないと言われている中出版された入門書「これからの強化学習」です．
[これからの強化学習(Amazon)](https://www.amazon.co.jp/dp/4627880316)

#「これからの強化学習」について
第1章で初心者でも強化学習とは何かを分かるようにし，第2章では逆強化学習など一歩踏み込んだ内容を，第3では実際のアプロケーション，研究への応用例の紹介を行い，第4章ではヒトとの関係を記述しています．
初心者でも読める入門書としましたが，やはり第2章以降はかなりしっかり取り組まないと厳しいのではないか，と感じます．
ということで，今回は第1章を読んでの感想をまとめておきます．

#「これからの強化学習」第1章を読んで気になったこと
まず第1章に入る前に「はじめに」に記されている"「十分なデータをもっておらず，データの収集にコストがかかる世界において，データをどのように収集するか」が強化学習である"はおそらく誤解を招く表現だと感じました．
以前この部分だけを取り上げているスライド？を見た覚えがありますが，強化学習で重要なのは，"探索(explore)と利用(exploit)のトレードオフ"であって，いかにうまく探索を行うかだけではないことには注意が必要だと思います．
1.1節，1.2節の導入の流れはとてもわかり易いと思いました．たしかにこれなら初学者でも着いていけるだろう，強化学習の理解を楽しめるだろうという感覚です．ただ，細かなミスが多いのは気になりました．森北出版が出している公式の「これからの強化学習」の正誤表は[こちら](https://www.morikita.co.jp/books/download/1582)
ここに載っているもの以外にいくつか間違い探しは見つかりますが，本筋とは関係なさそうなので，気にせず読みました．
 1.3節での価値反復法と方策反復法の導入が結局何なのか分かりづらい．ここまではとても分かりやすかったので，すこし残念な気持ちになりました．この点は1.4節で再び記述されている部分の方が私には分かりやすかったですね．ただ，それでも方策反復法の話になったかと思うと価値反復法の話に戻ったりして，振り回される印象を受けました．一本道で理解できるようにしたいものです．
また，内容が高度になっていくことも関係はしているが，1.4は初学者に対する思いやりを1.3までより感じられないです．おそらくは著者が変わったことが一番の理由だと思いますが，数式の書き方などに初学者に対する思いやりの不足が見られました．論文でも多いような略記でアカデミックの悪いところだと思います．

#まとめ
「これからの強化学習」はとりあえず強化学習とは何なのかを簡単に知りたいというのにはうってつけの書籍だと思います．これを読んだあとじっくり学習するのであればSuttonの英文を読みたいですね．和訳する運動起きてないのかな．あるのだったら参加するのですが．
第2章以降も気分が向いたら感想を書こうと思います．
サーバーレスシステムでユーザー情報をアクセストークンを使って取得する

# やりたいこと
![サーバレス認証.png](https://qiita-image-store.s3.amazonaws.com/0/107056/f3d9f35c-470e-8b60-1fb5-b444d8e89e72.png)

サーバーレスシステムでの個人情報保護について考えてみます。

システムで管理するべき個人情報は、できるだけクラウド内にとどめ、クライアントとやりとりしないということにできれば、通信路上での漏えいを防ぐことができます。
また、個人情報の管理を、限定することができれば、システムの大部分は、個人情報の漏洩について意識することなくシステム開発を行うことができます。

このような要求のシステムの場合、AWSでは、次のようになります。

1. Cognito Identity Poolでユーザー管理をする。
2. クライアント⇔AWS間の通信路上はアクセストークンと処理結果のみの受け渡しする。
3. AWS内ではLambdaがアクセストークンを受け取りCognitoのユーザー情報をもとに処理を行う。

アクセストークンを受け取ったLambdaにアクセストークンに対応するユーザー情報へのアクセス権限が委譲され、LambdaはCognitoのユーザー情報を取得し処理できるようになります。よって、Lambdaは、アクセストークンを受け取れるようにする必要はありますが、ユーザー情報にアクセスするためのロールを付与する必要がなくなります。

参考までに、LambdaからCognitoにHTTPS通信する際に、どのような情報をやりとりするとアクセストークンと引き換えにユーザー情報を取得できるのか、cURL, Postman, AWS CLIを使って調べたのでまとめておきます。

# 結論
必要な情報は以下でした。
- Cognito Identity Service Providerが発行したアクセストークン
- Cognito Identity Poolのリージョン
- 各種おきまりのヘッダー（Content-Type、X-Amz-Target）

※ 各種おきまりのヘッダーをつけないと以下のエラーが返ってきます。

```
{"code":"BadRequest","message":"The server did not understand the operation that was requested.","type":"client"}
```

# cURL

```
$ curl 'https://cognito-idp.＜リージョン＞.amazonaws.com/' -H 'Content-Type: application/x-amz-json-1.1' -H 'X-Amz-Target: AWSCognitoIdentityProviderService.GetUser' --data-binary '{"AccessToken":"＜アクセストークン＞"}'
```

# Postman
+ メソッド
    - POST
+ Url
    - https://cognito-idp.＜リージョン＞.amazonaws.com/
+ Authorization
    - Type: No Auth
+ Headers
    - Content-Type: application/x-amz-json-1.1  
    - X-Amz-Target: AWSCognitoIdentityProviderService.GetUser
+ Body
    - {"AccessToken":"＜アクセストークン＞"}

# AWS CLI

```
$ aws cognito-idp get-user --access-token ＜アクセストークン＞
```

### （備考）
+ `＜リージョン＞`は、東京だったら「ap-northeast-1」です。
+ このシステムでは、HTTPS通信が必須です。
+ AWSのサービス間のセキュリティ（ex. Lambda ⇔ Cognito）の信頼性は、別途、考慮が必要です。
文字コードについてまとめる

文字コード周りの定義はすぐに忘れるので、要点を整理しておく。

##概念の整理

『**文字集合**』は、文字の集合のこと。
『**コードポイント**』は、文字集合内での位置のこと。
『**エンコーディング**』は、文字集合の各文字に番号を割り当てるときの方式のこと。
『**文字コード**』は、その割り当てられた番号そのもののこと。

この関係を表に表すとこんな感じ (縦軸：文字集合、横軸：エンコーディング)

|文字集合＼エンコーディング|JIS系|EUC系|UTF系|
|----------|:----------:|:----------:|:----------:|
| JIS X 0201<br>JIS X 0208  |Shift_JIS|EUC-JP|-|
| Unicode     |-|-|UTF-8<br>UTF-16|


**文字集合とエンコーディングは直交する概念**のはず。しかし混同して使用されることがある。「エンコーディングをUnicodeにしようか、それともUTF-8にしようか」と言うのは間違いである。


##代表的なエンコーディング
- **ASCII** (American Standard Code for Information Interchange)

128個の文字集合を7bitで表すエンコーディング。他のエンコーディングもASCII互換のものが多い。つまり7bitまではASCIIでエンコーディングしてそれ以降を各々の方式でエンコーディンしている。

- **Shift-JIS**

主にWindows上で日本語の文字を扱う場合に利用されているエンコーディング。ASCII互換。

- **EUC-JP** (Extended UNIX Code Packed Format for Japanese)

主にUNIX上で日本語の文字を扱う場合に利用されているエンコーディング。ASCII互換。

- **UTF-8** (Unicode Transformation Format-8)

Unicode(世界で使われる全ての文字を共通の文字集合で利用できるよにと考えられたもの)のエンコーディングの一つ。可変長(1-4バイト)の8ビット符号単位でエンコーディング。ASCII互換。

- **UTF-16** (Unicode Transformation Format-16) 

Unicodeのエンコーディングの一つ。
16ビット符号単位でエンコーディング。**ASCII非互換**。

##備考
**文字集合**は**符号化文字集合**とも呼ばれる。
**コードポイント**は**符号点**とも呼ばれる。
**エンコーディング**は**文字符号化方式**とも呼ばれる。
Vimのマクロを簡単に登録、編集

Vimのマクロの登録、編集が簡単にできる方法を見つけたのでメモ。

### マクロ登録

マクロは結局のところレジスタにノーマルモードでのキー入力となる文字列を記憶させているだけなので、レジスタ指定でヤンクしてあげれば書いたコマンドをそのまま登録できるじゃないかと気づきました。

1. 新規バッファにキー入力を書く
    * 例えば`:s/foo/bar/g`とか
1. ビジュアルモードで選択して`"ay`でレジスタにヤンク（例ではaレジスタに保存）
1. `@a`でマクロ実行できる


行選択モードで改行まで選択範囲に含めれば、`<CR>`まで含んだ形で登録できます。

### マクロ編集

編集もいったんレジスタから書き出して編集、再登録とするのがわかりやすい。

1. インサートモードで`<C-R>a`でaレジスタから現在登録されているマクロを書き出し
2. 編集
3. ビジュアルモードで選択して`"ay`でレジスタにヤンク
4. `@a`でマクロ実行できる

コマンドでも実装しようかと思って試してたらできたので目から鱗でした。

以上です。
Salesforceで任意のオブジェクトと項目を動的クエリでデータ取得する

# 概要

　Appexchange向けのアプリケーションでよくあるのですが、ユーザが選択した任意のオブジェクトのデータを抽出したい時に、どのように抽出すればいいのかをご紹介します。（初心者向け）

# 結論

　まず、結論から言いますとDescribeSObjectResult や DescribeFieldResult Classを用いることで、対象オブジェクトや項目のスキーマ情報を取得してSOQLを動的に生成すればOKです。

[DescribeFieldResult クラス リファレンス](https://developer.salesforce.com/docs/atlas.ja-jp.206.0.apexcode.meta/apexcode/apex_methods_system_fields_describe.htm)

[DescribeSObjectResult クラス リファレンス](https://developer.salesforce.com/docs/atlas.ja-jp.206.0.apexcode.meta/apexcode/apex_methods_system_sobject_describe.htm#apex_methods_system_sobject_describe)

# サンプルコード

以下のサンプルコードにおいて
Accountオブジェクトを対象に動的クエリを作成します。

```
String objectName = 'Account';
String selectString = 'Select ';
String fromString = ' From ' + objectName;

// 全オブジェクトのスキーマ情報を取得
// 再帰的にgetGlobalDescribeを呼ぶことがある場合は、処理負荷になることがありますので、
// 1度取得したスキーマ情報を共有するような実装をお勧めします
Map<String, Schema.SObjectType> gs = Schema.getGlobalDescribe();

// gs.get(objectName).getDescribe()でオブジェクトのスキーマ情報も取得できるので、
// アクセス権限の可否などのチェック処理をあらかじめ入れとくこともできます
Map<String, Schema.SObjectField> gf = gs.get(objectName).getDescribe().fields.getMap();

for(String k : gf.keySet()) {
    // 項目のスキーマ情報を取得
    Schema.DescribeFieldResult fr = gf.get(k).getDescribe();

    // アクセスできる項目かつ、隠し項目ではない
    if(fr.isAccessible() && !fr.isDeprecatedAndHidden()) {

        // getNameメソッドで項目のAPI参照名を取得できるが、名前空間に属する項目の場合は「名前空間名__項目名__c」で取得されます
        // 名前空間名を含んでほしくない場合は、getLocalNameメソッドを使用してください
        selectString += String.valueOf(fr.getName()) + ',';
    }
}
selectString = selectString.removeEnd(',');

// 必要であればlimit句を付けてください
String query = selectString + fromString;
system.debug(query);

// soqlの実行
List<Sobject> records = Database.query(query);
system.debug(records);
```