OmniAICreator/Qiita-1.07M huggingface dataset:
搾取に決別！アップルからiOS Developer Programの継続催促のメール来てたけど無視！（※2013年11月執筆：懐古録）

**※本内容は2013年11月に自分でメモしていた内容です。2年以上経過したので現在とは異なっているかもしれません。当時と現在との違いを認識していただければと思い、アップしました。**

<hr>
11月26日未明にアップルから「Renew your iOS Developer Program membership」というメールが来てました。
<a href="http://blog-imgs-42.fc2.com/t/e/a/teapipin/renew_your_ios_developer.png"><img title="renew_your_ios_developer" style="margin: 5px; display: inline" alt="renew_your_ios_developer" src="http://blog-imgs-42.fc2.com/t/e/a/teapipin/renew_your_ios_developer_thumb.png" height="480" width="381"></a>

そう、恒例のiOS Developer Programの継続催促です！
もうおなじみですね。
　→2011/11/14 <a href="http://teapipin.blog10.fc2.com/blog-entry-195.html">【開発環境】iOS Developer Programを継続 </a>
　→2012/11/21 <a href="http://teapipin.blog10.fc2.com/blog-entry-351.html">iOS Developer Programをまた継続</a>


iTunes Connectを見るといろいろと焦らせる内容が。
<a href="http://blog-imgs-42.fc2.com/t/e/a/teapipin/itunesconnect_.png"><img title="itunesconnect_期限切れ" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 5px; border-left: 0px; display: inline; padding-right: 0px" alt="itunesconnect_期限切れ" src="http://blog-imgs-42.fc2.com/t/e/a/teapipin/itunesconnect__thumb.png" border="0" height="229" width="530"></a>

<a href="http://blog-imgs-42.fc2.com/t/e/a/teapipin/itunesconnect_3.png"><img title="itunesconnect_期限切れ3" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 5px; border-left: 0px; display: inline; padding-right: 0px" alt="itunesconnect_期限切れ3" src="http://blog-imgs-42.fc2.com/t/e/a/teapipin/itunesconnect_3_thumb.png" border="0" height="499" width="335"></a>

<a href="http://blog-imgs-42.fc2.com/t/e/a/teapipin/itunesconnect_2.png"><img title="itunesconnect_期限切れ2" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 5px; border-left: 0px; display: inline; padding-right: 0px" alt="itunesconnect_期限切れ2" src="http://blog-imgs-42.fc2.com/t/e/a/teapipin/itunesconnect_2_thumb.png" border="0" height="180" width="640"></a>
　
　
といっても、結局ここ2年以上まともにiPhoneアプリなんぞ作っておらず、
興味も全然なくなっているのでさすがに今回は継続はしません。
iPhoneアプリでクリエイティブ活動としての自己表現はできないですから。。。
流行に乗っていただけだったともいえるでしょう。

iPhoneアプリ開発のためアップルに支払った金、本に支払った金、そして時間、
どれも元は取れていません（大泣き）
だって、JavaやらVisual Basicなら検索して数分で答えが分かるようなことすら、
Objective-Cでやろうとすると何日も何千円もかかるんですから。
しかも答えが分からずじまいで何度実装を諦めた機能があることか！

<strong>まあ、これも人生。</strong>
<strong>振り返ればアップルに搾取され続けた3年間悪くはなかったです。</strong>
って、これでは手なずけられた奴隷の発言ですね（苦笑）

気を取り直して、今後もiPhoneアプリとは違う方法で自己表現をしていきたいと
思います。
RethinkDBのReQLProというGUIツールがいい感じ

RethinkDBの公式GUIツールを探したのですが、無さ気でした。

「Rethinkdb GUI」でググると、このページがトップに来ます。

https://www.rethinkdb.com/docs/administration-tools/

公式ですね。
ただし、これは単なるAdminインターフェイス。

データ操作には結局、ReQLを書かなくてはいけません。

<img width="641" alt="Screen Shot 2016-09-13 at 12.22.53 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/77614/a4bcd6c5-5256-7942-48fd-c668bb59c4df.png">


そこで、ReQLProというツールを発見。

http://codehangar.io/rethinkdb-data-management-made-easy-with-reqlpro-admin-gui/


GUIでデータ操作をゴリゴリできます。

<img width="1118" alt="Screen Shot 2016-09-13 at 12.18.36 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/77614/43e3c6a9-0eb6-7493-f1dd-a3c25753d6ba.png">

ただしまだベータ版のようですね。
最新バージョンリリース日はこのとおり。

<img width="362" alt="Screen Shot 2016-09-13 at 12.26.22 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/77614/c9ef1cf0-873e-5655-e5bb-ed9a43ef688a.png">


悪くないんじゃないでしょうか。
軽く使ってみたのですが、使用感も不満はありません。RethinkDBでGUIツールをお探しの方はぜひ。
ターミナル上で動いているEmacsで、選択範囲をXのクリップボードにコピーする

ELispをほとんど書いていないので、正しいやり方なのか全然わからないが、とりあえずできた。
ただ`xsel`の動作があまり安定しない。短いテキストなら問題ないが・・・

```lisp
;; Region to X clipboard
(defun paste-to-tmp-file(data)
  (with-temp-buffer
    (insert data)
    (write-file "/tmp/clipboard")))
  
(defun xclip-add-region()
  (interactive)
  (if (region-active-p)
      (progn
        (paste-to-tmp-file (buffer-substring-no-properties (region-beginning) (region-end)))
        (shell-command "xsel -ib < /tmp/clipboard")
        (message "%s" (shell-command-to-string "cat /tmp/clipboard")))
    (progn
      (message "no region"))))

(bind-key "C-c C-c" 'xclip-add-region)
```
典型的な状態遷移マシンのパターン

##はじめに
VHDLをいじり始めて１年が経ち慣れてきたところ。これまでいくつか解説もの書籍を読んでみましたが、どうもすっきりわかった気にならない。生産性を上げたいので、自分用にちょっとづつ整理していこうかと。まずは状態遷移マシン(ステートマシン）から。

<!--
(想定読者)
VHDLの文法は知っているが、論理回路設計の経験は少ない。他人が書いたサンプルデザインを渡されて、必死で移植する羽目になり、めいめい勝手な規則で書かれた芸術的コードを読むのが苦痛になった。自分が以前書いたコードを読み返すことになり、コメントを読んでも当時のことを思い出せず、愕然としたことがある人。

(おススメのサイト）
デジタル・デザイン・ノート　(zakiiさん）
　HDLによるFPGA設計　1.論理合成のためのVerilogHDLの書き方
-->


##状態遷移マシン（クロック同期型）パターン
（こんな用途に）
I2C,UARTの送受信,KC705のLCD制御など、シリアルデータ通信処理に効果的。クロックに同期して状態遷移を行うのが定石。

（設計のキモ）
どんな時に何を行うか、どんな手順で処理を行うか、事前分析することが大切。状態遷移が頭の中で整理できれば、一気に回路ができてしまうのが良いところ。

<!--
ついつい、カリカリにチューニングして腕自慢をしたくなる職人殺しのパーツ。ほどほどに。-->
### 準備
　まずは、状態の抽出から。入力に対して、同じような出力を行う部分を一つの状態にまとめると、回路が作りやすい。また、同じような処理を何度も繰り返す場合は、状態変数とは別に、回数や進行状態を管理するカウンターやレジスタを用意すると、状態数を減らすことができます。

　状態とレジスタを抽出できたら、状態遷移の条件となる入力と、出力を整理する。

### VHDLでの書き方
あとは機械的にコードを書くだけ。以下VHDLを想定して説明。

・宣言部

（１）状態変数と状態を定義
type文で状態を定義し、それを用いて状態変数と、更新信号を作成する。
(スタイル例)型名には```st_t```、状態には```S番号_状態名```。状態変数名は```st_reg```、状態変数の更新信号名は```st_nxt```。

（２）合わせて使用するレジスタを定義
(スタイル例)レジスタ名は```名称_reg```、状態変数の更新信号名は```名称_nxt```。複雑な回路ではプリフィックスとしてユニット番号をつけても良い。

（３）出力信号の定義
※入力信号はどこかで宣言してある前提です。

・インスタンス部

（４）レジスタ更新部(U_REG)
　状態や各種レジスタのラッチ回路。
クロックエッジのタイミングで、状態変数レジスタ（st_reg）を状態遷移先(st_nxt)に更新する。st_nxtは、組み合わせ回路部で作成する。状態更新のタイミングはクロックの立ち上がり。

（５）組み合わせ回路部(U_NXT)
　状態に応じた信号処理を行う組み合わせ回路。

- センシティビティリストには、状態変数(st_reg)、レジスタ(名称_reg)、入力信号を入れる。
- DEFAULT部：出力信号の書き忘れを防ぐため、デフォルト値を書いておく(強くお勧めします)。
- SATE_MACHINE部：case文を用いて状態を切り分け、出力信号を記述。if文を用いて、遷移条件を判断し、遷移先を切り替える。if文の中で出力信号を作ればミーリー型、一切作らなければムーア型になる。

あとは必要に応じてチューニング。

## テンプレート自動生成
　以下のサイトでStates, input, output, registersに状態、入力信号、出力信号、レジスタをカンマで区切って入力し、Generateボタンをクリックするとテンプレートを表示します。よかったら使ってみてください。

http://cgi1.plala.or.jp/~hbf/ppVhdl/ppStateMachine.cgi

```vhdl:state_machine_sample
----------------------
-- DECLEAR STATE
----------------------
type st_t is(S0,S1);
signal st_reg : st_t :=S0;
signal st_nxt : st_t ;
----- registers ------
signal counter_reg,counter_nxt:std_logic;
----- outputs ------
signal out1:std_logic;

begin
----------------------
-- UPDATE REGISTER
----------------------
U_REG:process(CLK)begin
  if rising_edge(CLK) then
    st_reg <= st_nxt;
    counter_reg <= counter_nxt
  end if;
end process
----------------------
-- STATE MACHINE
----------------------
U_NXT:process(st_reg,counter_reg,in1)begin
  -- DEFAULT --
  st_nxt <= st_reg;
  counter_nxt <= counter_reg
  out1 <= '0';
  -- STATE --
  case st_reg is
    when S0 =>
      if in1='1' then
        --状態x入力で出力設定するとミーリー型になる
        --out1 <= '1';
        st_nxt <= S1;
      end if;
    when S1 =>
      --状態だけで出力を設定していればムーア型
      out1 <='1';
      if in1='0' then
        st_nxt <= S0;
      end if;
    when others=>
  end case;
end process
```
angular-cli環境でasync/awaitを書いてみる。

angular-cliを使ったAngular開発環境でasync/awaitが書けないもんかなーと思って色々調べてみたら書けたのでメモを残します。

```
$ ng new 
```
上記コマンドで既に環境が作られているものとして話を進めます。

## 必要なものをnpm install

```
$ npm install --save-dev babel-core babel-preset-latest
$ npm install --save babel-polyfill
```

## tsconfig.jsonを編集
変更前のtsconfig.json

```json:src/tsconfig.json
{
  "compilerOptions": {
    "declaration": false,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "lib": ["es6", "dom"],
    "mapRoot": "./",
    "module": "es6",
    "moduleResolution": "node",
    "outDir": "../dist/out-tsc",
    "sourceMap": true,
    "target": "es5",
    "typeRoots": [
      "../node_modules/@types"
    ]
  }
```

変更後のtsconfig.json

```json:src/tsconfig.json
{
  "compilerOptions": {
    "declaration": false,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "lib": ["es6", "dom"],
    "mapRoot": "./",
    "module": "es6",
    "moduleResolution": "node",
    "outDir": "../dist/out-tsc",
    "sourceMap": true,
    "target": "es2015",
    "typeRoots": [
      "../node_modules/@types"
    ]
  },
  "awesomeTypescriptLoaderOptions": {
    "useBabel": true,
    "babelOptions": {
      "presets": [
        "latest"
      ],
      "plugins": []
    },
    "useCache": true,
    "useWebpackText": true,
    "doTypeCheck": false
  }
}
```

## .gitignoreを編集

```txt:.gitignore
# 追加
.awcache
```

## polyfills.tsを編集

変更前のpolyfills.ts

```ts:src/polyfills.ts
import 'core-js/es6/symbol';
import 'core-js/es6/object';
import 'core-js/es6/function';
import 'core-js/es6/parse-int';
import 'core-js/es6/parse-float';
import 'core-js/es6/number';
import 'core-js/es6/math';
import 'core-js/es6/string';
import 'core-js/es6/date';
import 'core-js/es6/array';
import 'core-js/es6/regexp';
import 'core-js/es6/map';
import 'core-js/es6/set';
import 'core-js/es6/reflect';

import 'core-js/es7/reflect';
import 'zone.js/dist/zone';
```

変更後のpolyfills.ts

```ts:src/polyfills.ts
// import 'core-js/es6/symbol';
// import 'core-js/es6/object';
// import 'core-js/es6/function';
// import 'core-js/es6/parse-int';
// import 'core-js/es6/parse-float';
// import 'core-js/es6/number';
// import 'core-js/es6/math';
// import 'core-js/es6/string';
// import 'core-js/es6/date';
// import 'core-js/es6/array';
// import 'core-js/es6/regexp';
// import 'core-js/es6/map';
// import 'core-js/es6/set';
// import 'core-js/es6/reflect';

// import 'core-js/es7/reflect';
import 'babel-polyfill';
import 'zone.js/dist/zone';
```

## async/awaitのコードを書いてみる

```ts:src/app/app.component.ts
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'app works!';

  constructor() {
    (async () => {
      console.log(1);

      await new Promise(resolve => {
        setTimeout(function () {
          console.log(2);
          resolve();
        }, 300);
      });

      console.log(3);
    })();
  }
}
```

## 実行してみる

```
$ npm start
```

これでコンソールには

```
1
2
3
```
の順で出力されます。

特にハックする必要もなくasync/awaitが書けました。
macOS Sierraにアップグレードしたら案の定Homebrewが壊れたので対処法


macOX Sierraに更新しましたか？してないでしょう、そうでしょう。

なんで更新してないかあなたの心を透かしてあげます。

**開発環境が壊れる恐れがあるから。**

当たりましたか？

## Homebrewがおかしくなった！
僕の場合、`Homebrew`が以下のような感じでおかしくなりました。ふぁっく。

```bash
$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry and just ignore them. Thanks!

Warning: Xcode is installed to a directory with a space in the name.
This will cause some formulae to fail to build.

Warning: Your Xcode (6.3.2) is outdated
Please update to Xcode 8.0.
Xcode can be updated from the App Store.
```

要約すると、「お前のXcodeは古いから、新しいのをApp Storeからいれろ！」ってことですね。

でも当然、Xcodeは最新版になっている。

さて困った。App Storeから入れ直しても症状は変わりません（入れ直して確認済み）。

## 解消法
このコマンドで明示的に示してあげましょう。

```bash
$ sudo xcode-select -switch /Applications/Xcode.app
```

するとあら不思議、正常になります。

```bash
$ brew doctor
Your system is ready to brew.
```

それでは良きSierraライフを。
Reactのスタイル問題にShadow DOMを使うという選択肢

といっても今のところChromeアドオンやElectronくらいでしか使えませんが。

BEMとかCSS ModulesとかCSS in JSとかで非常に心が疲れたので、
Shadow DOMに安寧の地を求めることにしました。

# ReactでShadow DOMを使う

別に難しいことするわけではなく、ReactShadowを使うだけです。

* [Wildhoney/ReactShadow: Utilise Shadow DOM in React with all the benefits of style encapsulation.](https://github.com/Wildhoney/ReactShadow)

```jsx:hello.jsx
import React from 'react';
import ShadowDOM from 'react-shadow';

export default class Hello extends React.Component {
  render() {
    return (
      <ShadowDOM>
        <h1>Hello, World!</h1>
      </ShadowDOM>
    );
  }
}
```

タグで囲むだけでそれ以下の要素がShadow DOMになってCSS空間が分割されます。

# スタイルの適用

スタイルはSassで書きたい勢なので、
webpackのraw-loaderとsass-loaderでSassをCSS文字列として読み込ませて、

```js:webpack.config.js
    loaders: [
      {
        test: /\.scss$/,
        loaders: ['raw-loader', 'sass-loader']
      }
      ...
    ]
```

styleタグに放り込んで終わり。

```jsx:hello.jsx
import React from 'react';
import ShadowDOM from 'react-shadow';
import css from './style.scss';

export default class Hello extends React.Component {
  render() {
    return (
      <ShadowDOM>
        <div>
          <style>{css}</style>
          <h1>Hello, World!</h1>
        </div>
      </ShadowDOM>
    );
  }
}
```

...Polymerかな？

# 感想

大して使ってないですが、今のとこはいい感じ。

Shadow DOMによって新たなCSSの適用単位が生まれるので、
[ReactコンポーネントとCSSコンポーネントは1対1なのか問題](https://speakerdeck.com/shibe97/reactkonponentotocsskonponentoha1dui-1nafalsekawen-ti-nituite)をある程度解決できるかもね。

# 追記

iframeを使えば同じことできるので、Shadow DOM非対応のブラウザでも使えます。

* [ryanseddon/react-frame-component: Render your React app to an iFrame](https://github.com/ryanseddon/react-frame-component)

iframeではContent Security Policyの``child-src 'none'``に引っかかるかと思ってたけど、
src属性使わず外からいじる分にはセーフっぽい。
Linuxをシングルユーザーモードで起動する

# はじめに
シングルユーザーモードで起動すると必要最小限のデーモンを起動し、パスワードを入力することなく、rootアカウントでログインするモードになります。
Windowsのセーフモードに当たるもので、主にメンテナンスの際に利用されます。

# 起動
1. まずサーバーを起動します。
<br>

2. 「Press any key to enter the menu」という画面が表示されたら「ESC」キーを押下します。
![linux_single01.png](https://qiita-image-store.s3.amazonaws.com/0/82090/34016692-57c8-5a73-a951-6806b8724c02.png)
<br>

3. 「CentOS ・・・」と表示されるので、「e」キーを押下します。
もし、複数カーネルが表示された場合は起動時に利用しているカーネルを指定してください。
![linux_single02.png](https://qiita-image-store.s3.amazonaws.com/0/82090/1a620046-126b-1bfb-b86f-e131ea189130.png)
<br>

4. 「kernel ・・・」のところで「e」キーを押下します。
![linux_single03.png](https://qiita-image-store.s3.amazonaws.com/0/82090/6e60a545-4fbe-3b62-0df4-bbe203188c17.png)
<br>

5. 行の末尾に「single」を入力して「Enter」キーを押下します。
![linux_single05.png](https://qiita-image-store.s3.amazonaws.com/0/82090/95510eca-6cdd-9cf4-3cff-511874bf37c5.png)
<br>

6. 「b」キーを押下します。
![linux_single06.png](https://qiita-image-store.s3.amazonaws.com/0/82090/039fad85-935c-726e-71d2-56ff731b3199.png)
<br>

7. あとは起動してプロンプトが返ってきたら終わりです。
![linux_single07.png](https://qiita-image-store.s3.amazonaws.com/0/82090/9ba0ac99-7e5d-fa8f-926a-4176efc56ad1.png)


# おわりに
最近ではAWSなどのクラウドの普及によって物理サーバーに触れる機会がほとんどないと思いますが、ここら辺は一応基本知識なので、インフラエンジニアは知っておいた方がいざという時に恥をかかないで済むかもしれません。
VR酔い防止のための真のルール

#まえがき

VRで酔わないための真のルールはそんなに多くない。これらを守ればワープやステップターンなど不自然な方法を使わなくてもまず酔わないものを作れる。

一般的な「VRで酔わないようにする」話は「酔わなかったこと集」を基礎においているのに対し、ここで紹介するルールは「酔ったこと集」を基礎においてそれらを排除することで作られているので「これを守らなければ酔う」という最低限の、真のルールにより近いものになっている...ハズ...たぶん...きっと...。

根本的なルールとして「**挙動を感覚レベルで予測できるようにしておく**」を挙げておく。「開発者はテスターとして最悪」というのは開発者は常に挙動を予測できるので非常に酔いにくいからだ。

また、以下のルールは座位を基本とし、移動や旋回はキャラクタ(カメラ)のものである。プレイヤーが現実で移動したり旋回したりすることは含まない。その場合は存分に現実通りにするとよい。

# 移動

VRにおける移動は前進した時に進む方向(以下：正面)が鍵になる。正面を正しく認識することで移動した時の挙動を予測できるようになり、これが酔いを防ぐ。

## 常に正面を正しく認識させる

**正面が正しくない状態で移動すると移動した瞬間に酔う**。正面が正しくない状態で酔わないのはプレイヤー自身が実際に移動する場合と、ワープや自動移動、乗り物に乗っているなどの自発的には視点が移動しない場合だ。

以下に正面を正しく認識させるための方策をいくつか紹介する。

### 正面マーカー

正しい正面に常に何かを表示しておく。例えば動物に乗っているような状態にして正面に頭が見えているようにしておくのでもいい。乗り物に乗っておくのが簡単だろう。

逆に生身のFPSみたいなものは正面マーカーを表示するゲーム世界におけるイイワケを成立させない限り難しい。旋回で短時間で正面補正してしまい、酔いを感じている時間を減らすという力技も考えうるが...。

### 正面リセット

ステージ開始時や「正面リセットボタン」が押されたタイミングで現在向いている方位を正面にリセットする。とにかく正面を正しく認識している状況を維持する。

違和感を感じた時点でプレイヤーが自分ですぐに補正できる必要があるので**正面リセットボタンがないコンテンツはVR失格**と言っていい。

# 旋回

角速度は加速度より敏感なのでVRにおける旋回は移動より困難だ。

## 旋回は移動中に

移動すると旋回に対する感覚が鈍くなるのでその間に旋回してしまう。逆に**停止時のゆっくりとした旋回は禁忌**だ。しかしスナップターンであれば問題はない。

## 正面補正

移動中に向いている方向に正面を合わせていくことで旋回する。回転の感覚は量にはあまり敏感でない事を利用し、現実でその方向に頭が回転したという状況にVR内の状況変化を合わせることで認識のズレを知覚させない。

この方法は見ている対象を中心とした極座標系に近い挙動になるのでアクションゲームにも適する。横移動に慣れるといい感じにアクションできる。既存の類似する「エイムすると対象を中心に移動」と違ってモードを切り替える必要もない。

## ゆっくりとした旋回は避ける

例えば右スティックを左右に入れることでその度合いに比例して旋回というのはよくある操作だが、これは禁忌。ゆっくり回るとすぐ酔う。代わりに「振り向き」と統合してスティックを入れた方向にスナップターンするのがいい。

# その他

## ヨー軸以外の回転

調査中。ただし椅子自体が動くなどでVR内から現実の体を回転させるなら話は別だが**勝手にキャラクタを回転するのはどの軸でも禁忌**だ。

## ごろ寝VR

例えば上方向を正面とするなどで現実とはずれた基準で問題なく運用できるなら「ごろ寝VR」とも言える怠惰感溢るるシステムを作れる。これも調査中。

## 巷でVR酔い防止とされているもの

だいたいdisり。

### スナップターン

旋回であると完全には認識できないほど高速に旋回することで酔いを防ぐと言い換えることができるだろう。速度としては停まる直前に回転方向を認識できるくらいが良さそうだ。旋回が全く認識されないとプレイヤーが置いてけぼりになってしまう。

バイオハザード7のスナップターンみたいな「左右でx°」では残る誤差に気を取られるし「前で頭が向いている方向」もスナップターン後に視界があらぬ方向を向いている。結果として正面を意識することを強いられ続けてプレゼンスをそがれる。

振り向きと統合して、単純に「右スティックを入れた方向へスナップターン」が良いだろう。

### ワープ

中断することでプレゼンスを低下させて酔いを防止すると言い換えることができそうだ。中断によるものなのでアクションと相性が悪い上に**移動先の指定に時間と手間**がかかり、ワープ単体でもやはりアクションとは相性が非常に悪いだけでなく、**面倒と言える領域にまで達している**。そもそも顔の向きや視線で指定できるものに対して「手」を使うのはあまりにも不自然だ。

ワープによる移動を用いているコンテンツでは旋回もできないことが多いが**俺の首は180度回ったりしない**。梟じゃあんめぇし。

そんなわけで立位が前提でありサポートが必要になる以上、個人向けには全く向かない上に面倒だ。なのでこれを採用すると評判が悪化するのは容易に予想できる。

...**やめとけ**

何より移動そのものではあまり酔わないので不要でもある。

### 集中線やいわゆるグリッディング

正面マーカーの一種にあたり、正面マーカーとしての効果は大きいが、正面マーカーそれ自体の不自然さはプレゼンスを低下させる。これらはプレゼンス低下の割に合うかどうかは疑問だ。

### 鼻を表示する

当然鼻は顔に付いているので移動時の正面であるとは限らず、キャラクタの正面マーカーにはならない。何か別のものだろう。

# 最後に

VR酔いの防止はプレゼンスのコントロールという面もある。何もかもが現実通りなら加速度や角速度も現実通りが要求されてしまうので、都合の悪いプレゼンスを選択的に低下させて感覚を鈍くするワケ。
PowerShellで make のような何か(Publish-Document)

make のパチモンを作ったので[公開](https://github.com/asterisk9101/Publish-Document)します。

# なぜか

そこそこ手順の多い作業（ワークフロー）をツール化するとき、エラー処理とかリトライ処理が問題になる。

入力されたデータが手入力されたゆるふわデータなので、ツールで処理しても当たり前のようにコケる。
個々の入力ミスにツールがいちいち対応していたら手間がかかって仕方ないので、ツールがコケたら手でデータを修正して続きからリトライするのが気軽で現実的な対応策になる。

実現する方法として make という巨人の肩を借りることにした。
make はビルドツールとして知られているが、ワークフロー制御ツールとしても使うことができる。
当然「普段使用している windows PC」に make などあるはずもなく、それらしいものを自作することになる。

# make とは

Wikipedia から引用。

> make（メイク）は、プログラムのビルド作業を自動化するツール。コンパイル、リンク、インストール等のルールを記述したテキストファイル (makefile) に従って、これらの作業を自動的に行う。
>
> 複雑に関連し合ったファイルの依存関係を解決するのが make の長所である。例えば、A というファイルを処理して B というファイルを生成するとき、make はそれぞれのファイルの更新時刻（タイムスタンプ）を参照し、A が B よりも新しいときには作業を行うが、B が A より新しければ作業は不要と見なして何もしない。ファイル数が増え、依存関係が複雑になっても、make は makefile の記述を頼りに必要最低限の作業だけを自動で行う。Autotools という別のツールを使う事で makefile の自動生成が可能である。
>
> UNIX系ソフトウェアは、ソースコードの形で配布されることが多いが、そのビルド作業にはほぼ必須のツールといえる（ごくまれに make を使わないソフトウェアも存在する）。
>
> なお、make はプログラムコードのビルド以外の用途にも使用可能である。例えば、LaTeX のソースファイルから DVI 形式のファイルを生成する作業などにも使用することができる。バッチ処理の簡略化にも使うこともできる。

# 手順

意識的ではないけど以下のような方針で作っていたような気がする

1. 要件を決める
2. 最低限の機能を実装する
3. 装飾する

# 1. 要件を決める

make らしきものを作るにあたって、要件として以下のようなことを考えた。

- Makefile を初めて見た人がウッとならないこと（YAML採用）。
- ansible とか digdag とか汎用的で良いよね（モジュール機構採用）。

ここで一番悩んだのは、Makefile を YAML フォーマットで再現する方法。
YAML フォーマットが自由すぎて色々拡張し放題になっていた。

ただ、結果として以下のような感じに落ち着いた。
拡張については後日検討する。

```YAML
Task1:
    desc: task description
    from:
        - Task2
        - Task3
    exec:
        - cmdline
        - module:
            module_arg1: "hoge"
            module_arg2: true
```

ここまでで8割やること終わった感がある。

# 2. 最低限の機能を実装する

最低限の機能として、以下のような機能を実装。
Import-YAML は[既に実装が終わっている](http://qiita.com/asterisk9101/items/63e0017dd00dec854b01)ので手抜きをした形になる。

- YAML 形式の Makefile を読んで依存関係を解決できること（DAGの構築）
- 依存関係に従って適切な順番でタスク（コマンド）を実行できること(グラフ探索)
- 実行済みのタスクはスキップできること。
- タスクが失敗するとフローが止まること。

基本的に教科書通りの再帰するコードなので構造単純 200 行ぐらい。

最初から色々実装しても無駄が多い気がするので最低限に留める。
必要な機能は必要になってから実装。欲しい機能は暇になってから実装。
凡人の先見性を当てにしてはいけない。

プログラムの速さだとか、メモリ効率だとかも後で良い。手作業よりも十分に早いことが期待できるのであれば問題ない。
~~コンピュータが 10 秒で終わる処理を 1 秒に短縮して喜んでいるから IT 業界は儲からない~~。

# 3. 装飾する

利用者のターゲットに、こんぴゅーたよくわからない人を含むので、装飾は必須。
ただでさえコマンドラインツールは評判が悪い。

コンソールに表示される実行ログは読みやすくする。当然、文字は色付き。
タスクの呼び出しはグリーンで、余計なタスクがスキップされたらイエローで、コマンドの実行結果はホワイト。

また `Get-Help` に対応する。よくわからない人に「自分で調べる」ことを覚えてもらうチャンスを逃してはいけない。
書き方はやはり [MSDN](https://technet.microsoft.com/ja-jp/library/hh847834.aspx) が参考になる。

# まとめ

どちらかというと品質よりも生産性を重視した形になりましたが、プロトタイピングの第一歩ということで、次回のコミットから品質は上がっていきます多分。
LinkedList と ArrayList の使い分け方

業務で ArrayList を使っていたところ

> ここは LinkedList を使ったほうがいいよ

と先輩にアドバイスを貰いました。

LinkedList を実装するにあたり、それぞれ業務で使う上での長所と短所、加えてそれぞれがどのような仕組みになっているのか、理由を調べてみたのでまとめます。

## それぞれの長所と短所と使い所

### ArrayList
- 長所と短所 
    - 特定の要素にアクセスするスピードが早い
    - 要素を追加するスピードが遅い 
- 使い所
    - 配列内の要素に対してランダムなアクセスを必要とし、配列内の要素に対して挿入／削除の操作があまり必要ない場合
    - 例えば... データベースからデータを大量に読み込み、以後それを順に参照しつつ複雑な計算を行うような場合

### LinkedList
- 長所と短所
    - 要素を追加したり削除するスピードが早い
    - 特定の要素にアクセスするスピードが遅い
- 使い所
    - 配列内の要素に対してランダムなアクセスを必要とせず、配列内の要素に対して挿入／削除の操作を頻繁に行う場合
    - 例えば... プログラム中で発生するデータの入れ物として使われ、時折データベースへ書き出してデータの永続化が図られるような用途

## そもそも ArrayList ってどんな仕組みになってるの?

ArrayListクラス<E>はListインターフェースを実装したクラスで、要素が順序をもった配列として実装されたコレクションです。  

要素がそれぞれ順序番号を持っており、全てメモリ上でインデックス化されているため、特定の要素へすぐにアクセスすることが出来ます。  

それぞれの要素が保持している順序番号が要素へのアクセスを高速にする一方、それが裏目にでる事もあります。  

末尾意外の要素を足したり引いたりすると、それ以降の要素全ての順序番号を繰り上げたり繰り下げたりするための再配置処理が行われます。  
その処理により ArrayList 内の要素には全て 0 から 全要素数から 1 引いた数までの全ての順序番号が付けられた要素がキレイに並び続けるのですが、処理が行われる分時間がかかってしまいます。
そしてその処理数は要素数に比例して多くなります。

## LinkedList の仕組みは?
ArrayList の要素が順序番号を伴った配列として保持されている一方、LinkedList では要素同士が、それぞれ前後に持っているリンク情報で繋がっています。

それぞれの要素は順序番号を保持していないため、特定の要素を取り出す際は、先頭もしくは末尾から一つずつ順序を数えていく必要があるため、順序番号があらかじめ保持されている ArrayList に比べると、それだけ多くの時間がかかります。  

一方要素を足したり引いたりする際は、リンク情報を書き換えれば終わりなので、再配置処理が行われない分 ArrayList よりも高速です。

## 参考
- [ArrayList - Java入門](http://www1.megaegg.ne.jp/~yasu/Programmer's%20Page/collection/arraylist.html)
- [LinkedList - Java入門](http://www1.megaegg.ne.jp/~yasu/Programmer's%20Page/collection/linkedlist.html)
- [ArrayListとLinkedListの違い - かまたま日記3](http://kamatama41.hatenablog.com/entry/20111226/1324893418)
Slackのカスタム絵文字用画像をGoogle Slidesで軽量化する

## 概要
Slackのカスタム絵文字に使う任意の画像をGoogle Slides（Googleスライド）でリサイズして軽量化するための手順です。

## 簡易まとめ
1. 絵文字用の画像を用意
1. Google Slides新規作成後、Slide > Apply Layout > Blankを選択
1. File > Page setup... > Customに変更後、10x10 inchesにしてOK
1. 用意した画像をDrag & Dropで貼り付け
1. File > Download as > JPEG image（もしくはPNG image）を選択
1. SlackのチームメニューのCustomize Slack > Emoji から絵文字登録

## 軽量化する理由
カスタム絵文字用画像に64KBのサイズ制限があるためです。

以下、Slackの Customize Your Team > Emoji > Choose an emoji の説明文から引用
>Square images work best. Image can't be larger than 128px in width or height, and must be smaller than 64K in file size.

## 手順

### 画像を用意
カスタム絵文字用の1:1画像を用意する。
（元画像が1:1でなくてもGoogle Slidesで1:1になるように後から加工すればOK）

### Google Slidesの準備
#### Google Slides新規作成
Google Driveの新規作成でGoogle Slidesを選択

#### レイアウトを空のスライドにする
Slide > Apply Layout > Blankを選択
![Screen Shot 2016-09-24 at 17.54.13.png](https://qiita-image-store.s3.amazonaws.com/0/123122/23a07e9d-7092-4ced-f3cd-1edf93c7d83b.png)

#### スライドのアスペクト比を1:1に変更
File > Page setup...選択
![Screen Shot 2016-09-24 at 18.12.36.png](https://qiita-image-store.s3.amazonaws.com/0/123122/b802925e-144e-b88f-ed91-9b19ac125eda.png)

プルダウンをCustomに変更後、10x10 inchesにしてOK
![Screen Shot 2016-09-24 at 18.00.01.png](https://qiita-image-store.s3.amazonaws.com/0/123122/4f71a84b-f332-9038-3ec7-5dd5210711bf.png)

### 用意した画像を貼り付け
用意した画像をDrag & Dropで貼り付ける。
必要に応じて加工する。

### 軽量化した画像をダウンロード
File > Download as > JPEG image（もしくはPNG image）を選択
![Screen Shot 2016-09-24 at 18.02.56.png](https://qiita-image-store.s3.amazonaws.com/0/123122/0ad3bf5d-34ae-885e-eedf-0a5afd80d514.png)

### 軽量化した画像をカスタム絵文字として登録
SlackのチームのプルダウンメニューでCustomize Slack選択
![Screen Shot 2016-09-24 at 18.40.32.png](https://qiita-image-store.s3.amazonaws.com/0/123122/b74d1be9-6ceb-89ed-a6e4-1d3d3e080a21.png)

Customize Your Team > Emoji から絵文字登録
https://`チーム名`.slack.com/customize/emoji でも直接飛べます
![Screen Shot 2016-09-24 at 18.37.44.png](https://qiita-image-store.s3.amazonaws.com/0/123122/b5ee30e9-59b1-7284-1cd8-8a4768eaee8a.png)


## 補足
- 画像編集ソフトなどでも同様のことができますが、同時編集したかったので今回はGoogle Slidesでやりました。
- この方法で何枚か試したところどの画像でも一律で5KB程度になりました。
【忘れ易いがたまに使う】Emacsチートシート


| やりたいこと                           | コマンド |
|----------------------------------------+----------|
| 外部コマンド実行                       | M-!      |
| 外部コマンド実行、現在のバッファに出力 | C-u M-!  |
| カーソルのある単語を検索               | C-s C-w  |
| emacsclientをttyで開いた時の終了       | C-x 5 0  |
| コメントアウト                         | M-;      |

Dired

| やりたいこと                           | コマンド   |
|----------------------------------------+------------|
| 今のバッファでディレクトリを開く       | i          |
| 今のバッファで開いたディレクトリを消す | C-/ or C-_ |
| 親ディレクトリに行く | ^ |

思い出したら、追加していきます。
Vue.js を PHP7+Laravel5 で使用してみた雑感と注意点

#環境
- Vue.js 1.0
- CentOS 7
- PHP 7
- Laravel 5.3

#はじめに Vue.js とは
- [MVVM](https://ja.wikipedia.org/wiki/Model_View_ViewModel)な JavaScript のフレームワーク
- Knockout.js の良いところを取って AngularJS をより簡略(軽量)化したようなポジション
- ES5 の機能が使われているため、IEは`9`以上でないと動作しない
- [React.js に次いで満足度が高い](https://medium.com/@sachagreif/the-state-of-javascript-front-end-frameworks-1a2d8a61510#.o1jwmymoh)
![2d326cf4-2c26-4d1a-a648-ad415b5e6c79-min.png](https://qiita-image-store.s3.amazonaws.com/0/57002/583369b2-4110-4f3a-3a41-d8231a99fb22.png)


#使用してみた雑感
- [公式ドキュメント](https://jp.vuejs.org/)が日本語化されていて、それなりに充実している
- [チュートリアル](https://jp.vuejs.org/guide/)をやれば大体分かる

##イベント処理が簡単にできる
`v-on:click=`とか`v-on:keyup.enter=`とかでイベントが簡単に処理できる。

```html
<div id="example">
  <button v-on:click="greet">Greet</button>
</div>
```

```javascript
var vm = new Vue({
  el: '#example',
  data: {
  name: 'Vue.js'
  },
  methods: {
  greet: function (event) {
  alert('Hello ' + this.name + '!')
  }
  }
})
```

でもスクロールのイベントはデフォだと取得できないぽい。
 [vue-scroll](https://www.npmjs.com/package/vue-scroll) を入れれば解決する。

##$index が地味に便利
`v-for`のブロック内で使える`$index`（カウンタ）が地味に便利。

```html
<ul id="example-2">
  <li v-for="item in items">
  {{ parentMessage }} - {{ $index }} - {{ item.message }}
  </li>
</ul>
```
```javascript
var example2 = new Vue({
  el: '#example-2',
  data: {
  parentMessage: 'Parent',
  items: [
  { message: 'Foo' },
  { message: 'Bar' }
  ]
  }
})
```
結果：
> Parent - 0 - Foo
Parent - 1 - Bar

##Blade テンプレートにレンダリングする際は @ を付ける

 Vue.js というより テンプレートエンジンの問題だけど、
Laravel で使用している Blade テンプレートにレンダリングする際は、
`@{{ name }}`のように記述しないとエラーになる

```html
<h1>Laravel</h1>

こんにちは @{{ name }}.
```

##エディタは ATOM がおすすめ
Vue.js のプラグインがいくつか出ているのでコーディングしやすい。
gitbucketをdockerでセットアップ（dockerfile）

gitbucket用のdockerfileを作成し、dockerで起動（セットアップ）したメモ。


参考）
https://github.com/gitbucket/gitbucket
http://qiita.com/japboy/items/be3f0bf8eb3b315de6ae


#gitbucket用のdockerfileを作成

以下がgitbucket用のdockerfile例

Dockerfile

```
FROM tomcat:8-jre8

MAINTAINER H.S.

ENV GITBUCKET_HOME /var/gitbucket

RUN rm -rf /usr/local/tomcat/webapps/ROOT

ADD https://github.com/gitbucket/gitbucket/releases/download/4.5/gitbucket.war /usr/local/tomcat/webapps/ROOT.war

EXPOSE 8080 29418

CMD [ "/usr/local/tomcat/bin/catalina.sh", "run" ]
```

GitHubに記載のある通り、gitbucketはJava8が必要で、"Tomcat 7.x, Jetty 8.x, GlassFish 3.x or higherでデプロイ"とのことなので、tomcatイメージをベースに作成。

gitbucketのバージョンを変えたければ、以下サイトからURLを参照し、ADDの取得先を変える。

https://github.com/gitbucket/gitbucket/releases

EXPOSEで指定したポートは、8080がWEB-GUIアクセスポート、29418がSSHアクセスポート。


#gitbucket用のdockerイメージを作成

buildすればdocker(コンテナ)イメージが完成。

```
docker build -t gitbucket:4.5 ./
```


#docker runで起動

docker registryにpushしても良いが、とりあえずローカルに生成されたイメージを指定して起動。

```
docker run -d -p 8080:8080 -p 29418:29418 -v ${PWD}/gitbucket-data:/var/gitbucket gitbucket:4.5
```

例では、ホスト〜コンテナのポートバインドは同じポートで指定。（変えても良い）

また、ボリュームを、ホスト上の実行ディレクトリのgitbucket-dataにマウントする。
※データを永続化する。


以上で、ホストのグローバルIP:8080に対してアクセスすれば、gitbucket(GUI)に接続できる。
初期ID/Passwordはroot/root。
TensorFlowによる将棋ソフトの開発日誌（ゆっけさんの場合） #2

前回 [TensorFlowによる将棋ソフトの開発日誌（ゆっけさんの場合） #1](http://qiita.com/YusukeSuzuki@github/items/1b69f0e85b36b5095593)
目次 [TensorFlow将棋ソフト開発日誌 目次](http://qiita.com/YusukeSuzuki@github/items/30bcaf7b14f015493121)

将棋の盤面を見て勝敗を予測するマンを作ろう その1
-----------------------------------------------------------------

前回アプローチを説明したとおり指し手モデルの学習の序盤は勝敗予測モデルが合格を出す手を学習する。というわけで勝敗予測モデルを作っていく。

この記事では使用するデータについて記述する。ネットワークの話は次の記事に書く。

使用データ2chkifu
-----------------------------------------------------------------

コンピュータ将棋とか1ミリも知らんので棋譜データも手探りで探すことになる。これだけコンピュータ将棋だ電王戦だAIだディープラーニングだと言っているのだからデータやフォーマットやライブラリも整備されているのかと思ったが全然そんなことはなく「ここは1999年のインターネッツですか？」というような状態だった。

棋譜データは [棋譜データベース作成プログラムの使い方](http://www.geocities.jp/shogi_depot/2chkifu.htm) (geocities!) でCSA形式の棋譜が大量に入手出来た。学習用に変換していてわかったのだが10件前後持ち駒から成駒を打っている棋譜がある。（当たり前だが）人力入力らしいし非公式なので仕方がないが成駒以外にも入力間違いがあるかも知れない。まだ手探りなのでデータ量でカバーできているということにする。

各種フォーマットで収録された日本将棋連盟公式のデータ集があれば10000戦につき1000円くらい出してもいいが虫のいい話か。

入手したデータは6万戦超の棋譜が1ファイルにマージされている。これを個別のファイルに分割する。そして駒の動きを読みだして [python-shogi](https://pypi.python.org/pypi/python-shogi) に投入することで sfen 形式の文字列を得る。sfenでは勝敗にかかった総手数、その盤面からの次の手、勝者を記載しないので元ファイルから読みだして追加する。結果として以下のようなカンマ区切りの文字列を手ごとに記述する。

```text
# sfen,総手数,次の手,勝者（b: 先手, w: 後手, チェスの流儀に倣う）
l3g3l/3s2ks1/p1nppp2p/2p2b3/1r7/2PB5/PP1P1P2P/2G1K1S2/LNS2G1NL b 2PNG4pr 45,110,6f4d,b
```

1ファイル1戦、1戦は上記の表記で1手1行の羅列になる。入玉、千日手についてはよくわかってないのでCSAが%TORYOで終端しているもののみを抽出している。

なぜsfenが必要なのか。それは自分のアプローチでは1戦を時系列データとして扱わず1手の盤面のみに着目して学習するからである。またニューラルネットの学習においては1イテレーションごとに入力データがほどよくばらけている方が良い。そうであるから1戦の系列を順次投入するよりはランダムに対局を選びランダムに何手目を抽出する方が良い。ランダムに行を選んだ時に行の情報だけで盤面を再現できるsfen形式が最適であったしありがたいことにpython-shogiでは主にsfenで入出力をしていた。

ここまでの変換を全て終えたところ入手した全戦の変換後の行数は約723万行となった。しばらくはこのデータで遊ぶことになる。
PythonでSQLiteを使用する方法

sqlite3を使って、connectをつくるだけ。
とてもかんたん。

```Python

#codeing:UTF-8

import sqlite3
import pandas as pd

#ない場合は新たに作成される
con = sqlite3.connect('/Users/Desktop/web_data.db')
drop_table = "drop table gas_portal_access_log"

create_table = """
create table gas_portal_access_log (
  user text,
  pv integer,
  page_id text
  );
"""
insert_table = """
insert into gas_portal_access_log values('yamada taro',3 ,'1234');
"""
insert2_table = """
insert into gas_portal_access_log values('hoge',2 ,'1234');
"""

con.execute(drop_table)
con.execute(create_table)
con.execute(insert_table)
con.execute(insert2_table)

#コミットを忘れず
con.commit()

check_sql = """
select * from gas_portal_access_log
"""
df = pd.read_sql(check_sql,con)
con.close

print df

```
C#:「ゴールドバッハの予想」をlong以下で確認する


## ゴールドバッハの予想
「ゴールドバッハの予想」とは、次のようなものです。

 - ４以上の偶数は２つの素数の和であらわすことができる

4 = 2 + 2 ですから、これを言い直すと、

 - 6以上の偶数は２つの素数の和であらわすことができる。

とも言えます。

この問題は、数学の未解決問題の一つとして知られてて、1742年に数学者・ゴールドバッハがオイラー宛ての手紙の中で

  - ５よりも大きい自然数は３つの素数の和であらわすことができる。

と予想したことから来ています。

なぜこの予想と最初の予想が、同値であるのかという証明は、Webで検索するといろんなページがヒットしますので、そちらを参照してください。

## どんなプログラムにするか

6,8,10.... とすべてを調べるのは時間がかかるので、入力された6以上の偶数(longまでの値)が、「２つの素数の和であらわすことができ」かを確認するプログラムとします。


## C#のコード

以下に、C#のコード(コンソールアプリ)を示します。

```csharp:Goldbach.cs
class Program {
    static void Main(string[] args) {
        while (true) {
            var str = Console.ReadLine();
            long num;
            if (long.TryParse(str, out num) == false) {
                Console.Error.WriteLine("入力形式が異なります。6以上の偶数を入力してください。");
            } else if (num % 2 != 0 || num < 6) {
                Console.Error.WriteLine("6以上の偶数を入力してください。");
            } else {
                var r = Goldbach.Resolve(num);
                Console.WriteLine($"{num} = {r[0]} + {r[1]}");
            }
        }
    }
}

public static class Goldbach {

    public static long[] Resolve(long num) {
        for (long a = 3; a <= num; a += 2) {
            if (!PrimeNumber.IsPrime(a))
                continue;
            long b = num - a;
            if (PrimeNumber.IsPrime(b))
                return new long[] { a, b };
        }
        return new long[] { -1, -1 };
    }
}
```

## ほんの少しコードの補足説明

Goldbach.Resolveメソッドでは、２つの素数を返すところで、

`return new long[] { a, b };`

と配列を返しています。
2つのプロパティを持つ専用のクラスを定義するよりもこの方が簡単です。
Tuple[^1] を戻り値にする方法もありますが、無味乾燥なItem1, Item2という名前がどうも好きになれません。

[^1]: C#7.0でこの状況は改善されそうなので、期待しています。



PrimeNumber.IsPrimeは、「[C#:ミラー・ラビン素数判定法を使い素数判定メソッドを書いてみた]()」で示した、メソッドを利用しています。


## 課題

例えば、「6以上、1000万までの偶数は２つの素数の和であらわすことができるか」を調べるという問題だとすると、僕のPCだと１分くらいでした。それなりの速度が出ていると思います。しかし、検証する範囲をさらに拡大しようとした場合、このプログラムだとちょっと苦しいかなと感じます。並列処理するようなプログラムにする必要があるかもしれません。


-------------------------
この記事は、Gushwell's C# Programming Pageで公開したものを加筆・修正したものです。
C++: ベクトルの要素へのアクセス

C++で、ベクトルの要素へアクセスする。

- インデックスを指定：`x[i]`
- イテレータを利用：`*(it+i)`
- ベクトルへのポインタから：`*(p)[i]`, `*(p->begin()+i)`


```cpp
#include <iostream>
#include <vector>

int main(int argc, char* argv[])
{
  std::vector<int> x;
  x.push_back(9); x.push_back(5);

  // access elements by index
  std::cout << x[0] << " ";
  std::cout << x[1] << "\n";    
  
  // access elements using iterator
  std::vector<int>::iterator it = x.begin(); 
  std::cout << *it << " ";
  std::cout << *(it+1) << "\n";    
  
  // access elements from pointer
  std::vector<int> *p;
  p = &x;
  std::cout << *(p->begin()) << " ";
  std::cout << *(p->begin() + 1) << "\n";
  
  std::cout << (*p)[0] << " ";
  std::cout << (*p)[1] << "\n";

  return 0;
}
```

*実行結果*

```
9 5
9 5
9 5
9 5
```
Android Studio利用時は、広告IDを取得する場合のdependenciesの設定に注意する

#広告IDを取得する場合、dependenciesには、play-services-base を設定する。
```
build.grade(Module: app)の例：※バージョンは、環境に合わせて変更して下さい。
dependencies {
	compile fileTree(include: ['*.jar'], dir: 'libs')
	compile 'com.google.android.gms:play-services-base:9.4.0'
}
```
AdvertisingIdClient.getAdvertisingIdInfo()に必要な機能は、play-services-baseに入っています。
(play-services-adsの依存関係の設定に、baseが入っています。)

#(他の機能が不要な場合は) play-services-adsを指定しない。
```
失敗例：
compile 'com.google.android.gms:play-services-ads:9.4.0'
```
**dependenciesにplay-services-adsを指定すると、**
Project Structure/ Developper Services/ Adsの
**「AdMob」欄にチェックが自動的に入ります。**
(AndroidStudio 2.2で確認しました。バージョンによって挙動が異なるかもしれません。)

この欄にチェックが入っている場合は、デベロッパーコンソールの、
価格と販売/配布地域の、「広告を含む」欄に、
> アプリに広告SDKが見つかりました
> 有効なAPKに広告SDKが見つかりました：
> バージョン：～、SDK:AdMob
というメッセージが表示されます。(これも最近の変更かもしれません。)

最近、デベロッパーコンソールを開いてないという方は、一度確認してみるとよいかも？

#補足
Project StructureのUIでAdMobのチェックを外すと、play-services-adsのdependenciesが削られますが、base等は新たに設定してくれないので、そのままだとエラーになります。要注意。

#蛇足
広告IDを取得しようとすると、毎回、IOException(timeout)をthrowするよ～という場合は、デバイスを再起動してみましょう。
この現象は、Google Play開発者サービスが呼び出すサービスが止まってしまった場合などに発生します。

お約束の
変な自動設定を増やすのはやめよう・・(特に、見ていない場所の。)
sayコマンドの音声全員に"Pen-Pineapple-Apple-Pen"と言わせる


なんか最近流行っているようなので。
https://www.youtube.com/watch?v=d9TpRfDdyU0


```bash
say -v ? | awk '{print $1}' | xargs -I{} -t say -v {} 'pen pineapple apple pen'
```

英語話者だけに限定したい場合は下記。

```bash
say -v ? | awk '/en_US/{print $1}' | xargs -I{} -t say -v {} 'pen pineapple apple pen'
```

お気に入りの音声を探すときにどうぞ！✒️🍍🍎✒️
nokogiriの使い方メモ（XPathを使った場合）


Nokogiriのサンプルをメモ。

Youtubeで「Ruby on Rails」と検索して、結果の動画のタイトルの一覧を表示する。

```ruby:nokogiri_sample.rb
require 'open-uri'
require 'nokogiri'

# Youtubeで「ruby on rails」で検索した結果の動画のタイトルの一覧を取得する。

# youtubeでruby on railsを検索
doc = Nokogiri::HTML(open('https://www.youtube.com/results?q=ruby+on+rails&sp=CAI%253D'))

# 動画のノードの一覧を取得
# ドキュメント全体を検索する場合は「//をつける」
nodes = doc.xpath("//div[@class='yt-lockup-dismissable yt-uix-tile']")

nodes.each do |node|
  # このノード以下のすべての子要素に対して検索を行う場合は「.//」をつける
  title_node = node.xpath(".//h3[@class='yt-lockup-title ']")
  # 子要素のみを検索対象とする場合は何もつけない
  title = title_node.xpath("a")
  puts title.text
end
```
[Node.js] 簡単なWebサーバとして静的ファイル配信/ディレクトリ一覧機能のサンプルコード

# Expressを利用してWebサーバーを記述する

まず依存モジュールをnpmで持ってくる

```bash
$ npm init -y
の後に
$ npm i -S express serve-index
または
$ npm install --save express serve-index
```


```js:express-app1.js
'use strict';
require('express')()
.use(require('express').static('.'))
.use(require('serve-index')('.', {icons: true}))
.listen(process.env.PORT || 3000);
```

わかりやすく書くと...

```js:express-app2.js
'use strict';

const express = require('express');
const serveIndex = require('serve-index');

const app = express();
app.use(express.static('.'));
app.use(serveIndex('.', {icons: true}));
app.listen(process.env.PORT || 3000);
```

# Node.jsだけでWebサーバーを記述する

Expressを使えば割と簡単に記述できた。
今度は、そういうライブラリを使わずに生のNode.jsだけでWebサーバーを記述してみた。

```js:web-server-simple.js
'use strict';

const http = require('http');
const path = require('path');
const fs = require('fs');

const mimes = {
	'.html': 'text/html',
	'.js': 'text/javascript'
};
const dir = __dirname;

http.createServer(function onRequest(req, res) {
	const start = process.hrtime(); // 開始時刻
	res.end = (end => function () { // 終了時にログ出力
		const delta = process.hrtime(start); // 時刻の差
		console.log(res.statusCode + '', req.method, req.url,
			(delta[0] * 1e3 + delta[1] / 1e6).toFixed(3), 'msec');
		end.apply(this, arguments);
	}) (res.end);

	const file = path.join(dir, req.url); // 実際のファイル名
	if (!file.startsWith(dir)) // 悪意のある要求は除外
		return resError(418, new Error('malicious? ' + file));

	fs.stat(file, (err, stat) => { // ファイルの状態?
		if (err) return resError(404, err); // エラー

		if (stat.isDirectory()) { // ディレクトリの場合
			// URLが'/'で終わっていない時はリダイレクトさせる
			if (!req.url.endsWith('/'))
				return resRedirect(301, req.url + '/');

			// index.htmlがあるか?
			const file2 = path.join(file, 'index.html');
			fs.stat(file2, (err, stat) => {
				if (err) resDir(file); // 無ければディレクトリ一覧
				else resFile(file2); // あればファイルを応答
			});
		}
		else resFile(file); // ファイルの場合ファイルを応答
	});

	function resFile(file) { // ファイルを応答
		res.writeHead(200, {'content-type':
			mimes[path.extname(file)] || 'text/plain'});
		fs.createReadStream(file).on('error', resError).pipe(res);
	}

	function resDir(dir) { // ディレクトリ一覧
		fs.readdir(dir, (err, names) => {
			if (err) return resError(500, err);

			res.writeHead(200, {'content-type': 'text/html'});
			res.end('<pre>' + names.map(x =>
					'<a href="' + x + '">' + x + '</a>')
					.join('\n') + '</pre>');
		});
	}

	function resRedirect(code, loc) { // リダイレクトさせる
		res.writeHead(code, {location: loc});
		res.end(code + ' ' + http.STATUS_CODES[code] + '\n' + loc);
	}

	function resError(code, err) { // エラー応答
		if (code instanceof Error) err = code, code = 500;
		res.writeHead(code, {'content-type': 'text/plain'});
		res.end(code + ' ' + http.STATUS_CODES[code] + '\n' +
			(err + '').replace(dir, '*'));
	}

}).listen(process.env.PORT || 3000); // ポートをListenする
```

やっぱり非同期処理がキツイ。
libselenium-remote-driver-perl パッケージへの道

```
E: libselenium-remote-driver-perl source: source-is-missing lib/Selenium/Firefox/amd64/libibushandler.so
E: libselenium-remote-driver-perl source: source-is-missing lib/Selenium/Firefox/amd64/x_ignore_nofocus.so
E: libselenium-remote-driver-perl source: source-is-missing lib/Selenium/Firefox/x86/libibushandler.so
E: libselenium-remote-driver-perl source: source-is-missing ... use --no-tag-display-limit to see all (or pipe to a file/program)
E: libselenium-remote-driver-perl: arch-independent-package-contains-binary-or-object usr/share/perl5/Selenium/Firefox/amd64/libibushandler.so
E: libselenium-remote-driver-perl: arch-dependent-file-in-usr-share usr/share/perl5/Selenium/Firefox/amd64/libibushandler.so
E: libselenium-remote-driver-perl: unstripped-binary-or-object usr/share/perl5/Selenium/Firefox/amd64/libibushandler.so
E: libselenium-remote-driver-perl: arch-independent-package-contains-binary-or-object usr/share/perl5/Selenium/Firefox/amd64/x_ignore_nofocus.so
E: libselenium-remote-driver-perl: arch-dependent-file-in-usr-share usr/share/perl5/Selenium/Firefox/amd64/x_ignore_nofocus.so
E: libselenium-remote-driver-perl: unstripped-binary-or-object usr/share/perl5/Selenium/Firefox/amd64/x_ignore_nofocus.so
E: libselenium-remote-driver-perl: arch-independent-package-contains-binary-or-object usr/share/perl5/Selenium/Firefox/x86/libibushandler.so
E: libselenium-remote-driver-perl: arch-dependent-file-in-usr-share usr/share/perl5/Selenium/Firefox/x86/libibushandler.so
E: libselenium-remote-driver-perl: unstripped-binary-or-object usr/share/perl5/Selenium/Firefox/x86/libibushandler.so
E: libselenium-remote-driver-perl: arch-independent-package-contains-binary-or-object ... use --no-tag-display-limit to see all (or pipe to a file/program)
E: libselenium-remote-driver-perl: arch-dependent-file-in-usr-share ... use --no-tag-display-limit to see all (or pipe to a file/program)
E: libselenium-remote-driver-perl: unstripped-binary-or-object ... use --no-tag-display-limit to see all (or pipe to a file/program)
E: libselenium-remote-driver-perl: missing-dependency-on-libc needed by usr/share/perl5/Selenium/Firefox/amd64/libibushandler.so and 3 others
W: libselenium-remote-driver-perl: new-package-should-close-itp-bug
E: libselenium-remote-driver-perl: debian-copyright-file-uses-obsolete-national-encoding at line 3
```

道は長い...。Firefox周りのバイナリがそのまま含まれてるのが問題かな？

│   │   │   ├── amd64
│   │   │   │   ├── libibushandler.so
│   │   │   │   └── x_ignore_nofocus.so

という形でsoファイルがある。x_ignore_nofocus.soは他のパッケージにもあるのでそちらから持ってくるとして（とはいえ、そちらのパッケージもバイナリをそのまま含んでてしまっていてソースがないので、そこをまたほじくり返さなきゃいかんという気が重い）、libibushandler.soってなんだ？lib ibus handeler と呼べるからibus周りのなのか？どこ由来かがサッパリわからん。
OpenGl (glew) ・環境構築 ( OS : Mac , IDE : Eclipse CDT )

OpenGL(glew) を mac で動かす。
環境構築から Hello World を実行するところまでをまとめる。

## 1. そもそも Glew とは？

## 2. 環境構築

### glew ライブラリの入手
glew を自前で make する。
具体的な手順は以下の通り

### glew をダウンロード

1. [glewサイト](http://glew.sourceforge.net/)へアクセス
2. Source -> ZIP からソースをダウンロード

### glew を make
1. glew-2.0.0.zip を解凍
2. 解凍した先の Makefile をテキストで開く
3. GLEW_PREFIX, GLEW_DEST を任意のpathにする  
 参考 : [OS X 10.11ではrootでも/usrや/bin以下に書き込みできない](http://apple.srad.jp/story/15/09/30/1529213/)
4. ターミナルを起動、glewフォルダ の Makefile がある階層へ移動
5. make all を実行
6. sudo make install を実行  
 glew-2.0.0/lib の中に libGLEW.a が生成されていれば成功

## 4. glfw を動かしてみる
先ほどの glfw ライブラリが動くかを確認するために、最小の glfw コードを書いて動作確認をしてみる。最小の glfw ソースコードは [glfw 公式の documentページ](http://www.glfw.org/documentation.html) にあるのでこれを使う。

1. eclipse CDT の起動
2. 空の C++ Project を作成
	* 上部メニューから File ➡️ New ➡️ c++ project を選択して Next
	* Project name を適当に入力
	* Executable ➡️ Hello World C++ Project ➡️ Cross GCC を選択して Next
	* 以降は全て Next 、最後に Finish を押す

4. project の property を開いて、以下を設定する
	* [C/C++ General] → [Path and Symbols] → [Includes] → [GNU C++] → [Add ボタン]を押して、ヘッダの存在する include/GLFW へのパスを設定する  
	* [C/C++ General] → [Path and Symbols] → [Library Paths] → [Add ボタン]を押して、libglfw.3.a の存在するフォルダへのパスを設定する
	*  [C/C++ General] → [Path and Symbols] → [Libraries] → [Add ボタン]を押して glfw3 と設定する。
          
       * C/C++ BUild -> Settings -> Tool Setting -> MacOSX C++ Linker -> Command: に g++ -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo を指定
5. Project Explore から src / main.cpp を開く
6. main.cpp を次のように書き換える

## 今回の環境
＊　glew-2.0.0
* OSX EL Capitan 10.11.6
* Eclipse IDE for C/C++ Mars 2 Release (4.5.2) / 日本語化無し
【PHP】セッションIDの長さを変える

#はじめに

「セッションIDの文字列長を32文字以上にしろ」と言われて調査したことを書きます。

Linux 上で動く PHP 5.x での話です。

#セッションIDに関係する4つの設定

セッションIDの生成方法を設定するには、以下の4つのパラメータをいじります。

session.entropy_file
session.entropy_length
session.hash_function
session.hash_bits_per_character

ここで重要なのは、**文字列長を直接指定するパラメータは無い**ということです。

**Q：じゃあどうすればいいの？**
**A：すっ飛ばさずにちゃんと読んでください。**

##session.entropy_file

/dev/urandom を指定します。

セッションIDは、セッションハイジャックなどを防ぐために「デタラメな文字列」である必要があります。それを作る元となるデタラメなデータを作ってくれるファイルがコレです。

「デタラメなデータ」って、簡単なようですんごい難しくて、ハッカーから見て予測不可能なデタラメさが必要となります。/dev/urandomから、暗号の偉い人たちが考える最強のデタラメなデータが流れてくると思ってください。

##session.entropy_length

先の、session.entropy_length で指定したファイルから何バイト読み込んでくるかを指定します。

小さいと「デタラメ度」が小さくなってしまいます。
大きいと、計算時間が無駄になってしまいます。
また、ここの数値はセッションIDの長さとはなんら関係ありません！

最適な値はいくつになるのか？ というのは、次の session.hash_function で指定するハッシュアルゴリズムにより異なります。

##session.hash_function

ハッシュ関数を指定します。ハッシュ関数の意味が分からない方はwikipediaでも読んでください。（最初の概要部分だけでもいいかな）

session.entropy_fileで指定したファイルからsession.entropy_lengthで指定したバイト数分読んできて、それをsession.hash_functionで指定したハッシュ関数にかけます。

session.hash_functionは
0を指定すると MD5 になります。
1を指定すると SHA-1 になります。

PHP 5.3.0 以降では、文字列で任意のハッシュ関数を指定することができます。
使用できるハッシュ関数は [hash_algos()](http://php.net/manual/ja/function.hash-algos.php) で知ることができます。
コマンドラインからは `php -r 'print_r(hash_algos());'` で調べることができます。

で、何がお勧めかというと、sha1 でしょうか。

sha1 の場合、ブロック長は512bits(64バイト)なので、session.entropy_length には 64 を指定するのが良いと思います。

##session.hash_bits_per_character

先のハッシュ関数からの出力はバイト列なので、文字列に変換する必要があります。その際、何ビット毎に1文字にするのかを指定するのがこのsession.hash_bits_per_characterというパラメータです。

4,5,6 のどれかを指定できます。

session.hash_function に sha1 を指定していた場合、SHA-1の出力は160bit ですので、セッションIDの長さは 160÷session.hash_bits_per_character になります。
小数は切り上げです。
表にまとめると以下のようになります。

| hash_bits_per_character  | セッションIDの文字列長 |
|:-:|:-:|
| 4 | 40 |
| 5 | 32 |
| 6 | 27 |

ここで注意したいのは、**session.hash_bits_per_characterを変えたことによって文字列長が長くなったからと言ってセキュリティ強度が上がったわけではない**という点です。
4にすると文字種が減るので、組み合わせの数としては変わりません。

#様々な組み合わせでの設定

考えられる設定はたくさんあります。
しかし、
- 今更 MD5 はないだろう
- 256bitもあれば十分だろう
- hash_bits_per_character に 4 を採用する理由はないだろう
といったことを考えると、以下の組み合わせあたりが合理的な設定かなと思います。

| entropy_length | hash_function | hash_bits_per_character  | セッションIDの文字列長 |
|:-:|:-:|:-:|:-:|
| 64 | sha1(1) | 5 | 32 |
| 64 | sha1(1) | 6 | 27 |
| 64 | sha224 | 5 | 45 |
| 64 | sha224 | 6 | 38 |
| 64 | sha256 | 5 | 52 |
| 64 | sha256 | 6 | 43 |

hash_bits_per_character に 5 を設定するケースは殆どないと思いますが、セッションを保存するストレージに大文字小文字を判別しないファイルシステムを使う場合（簡単に言うとwindowsの場合）は 5 を使うほうがよいです。
同じViewで遷移アニメーションを使う


![FlipHorizontal.gif](https://qiita-image-store.s3.amazonaws.com/0/49022/59c1de16-420b-476c-ee3c-e19862d742e8.gif "FlipHorizontal.gif")

画面遷移する際のアニメーションを、同じViewで表示を切り替えるタイミングで使用する方法。

```swift
@IBAction func Button(sender: AnyObject) {
  if Label.text == "A"  {
    UIView.transitionWithView(self.view, duration: 0.725, options: .TransitionFlipFromLeft, animations: {
      // animation
      self.Label.text = "B"
      }, completion: { (finished: Bool) -> () in
      // completion
    })
  }else{
    UIView.transitionWithView(self.view, duration: 0.725, options: .TransitionFlipFromRight, animations: {
      // animation
      self.Label.text = "A"
      }, completion: { (finished: Bool) -> () in
      // completion
    })
  }
}
```

## 参考
[UIView transitioning to the same view](http://stackoverflow.com/questions/14961415/uiview-transitioning-to-the-same-view)
Orelang(俺言語)をC++で実装してみた

http://qiita.com/shuetsu@github/items/ac21e597265d6bb906dc
http://qiita.com/mattn/items/96d79fc0b50af2bf5572
http://qiita.com/ubnt_intrepid/items/79392297af7282fcd4b3
http://qiita.com/alpha_kai_NET/items/aa4c71a09f853fda7011
http://qiita.com/arc279/items/816ff67737b79c45ae82

C++版です。YACCとか好きじゃないので、パーサーも自作です。
JSONパーサーはもともと別のプログラムのために作ったものを流用してます。

https://github.com/soramimi/orelang-cpp

開発環境はQt Creatorです。ソースファイルはヘッダ含めて3個だけなので、まとめてコンパイルすればおｋ
iPhoneでフルバックアップしてもアドレス帳が吹っ飛んだ

プログラミング関係ないですが同じ苦難になった人用の備忘録で

iPhoneを5sから7に機種変更したらiTunesでフルバックアップしたのにアドレス帳が空白で吹っ飛んだ。
フルバックアップだから問題ないだろとiCloudにも入れているかどうかきちんと確認していなかったので顔面蒼白になった。

調べてみたらau依存のプロファイルの問題だった。

## ひっそりとプロファイルが変化していた
iOSに入れる構成プロファイルに各携帯会社のをインストールする。
auはIMAPとExchangeがあって、アドレスの横に二重丸がついているとExchange。
今通常入れてるのはIMAPだけど僕が入れてたのはExchangeだった。(確かにアドレスの横にある二重丸なんなんだろうなあって思ってたんだよなー。)

ref.) http://via-news.net/apple/iphone/314/

実際にそれぞれ入れてみたらIMAPの場合は同期対象がメール/メモでExchangeの場合はメール/連絡先/カレンダー/リマインダーがあった。

## 対応
肝心のプロファイルがリンク切ればかりで本当に辛かった。
https://set.mail.ezweb.ne.jp/md/eas-setting

これをiPhoneの回線で接続してプロファイルインストールすると連絡先の欄に携帯アドレス枠が無事復活。調べた感じだとこの古いプロファイルは推奨してないし、アドレス帳もちゃんと同期されるか保証してないみたい。
なのでこれをiCloudなり何らかのバックアップを行ったあとに古いプロファイルを消して今のプロファイルを入れて無事解決。

慌てて調べてやった対処法なので訂正などありましたらぜひ！
公式でリンクを踏んでたどり着けなかったのが本当に辛かった。どこかに載ってたのかな。。。
複数の要素をSPでは正順（上→下）に、PCでは逆順（右→左）に表示する

# 例

↓↓こういうことをやりたい時。

![flex-direction.gif](https://qiita-image-store.s3.amazonaws.com/0/77614/adcb6251-5eb4-5ea9-9050-f3222bc96cfb.gif)


上の例で２つの要素は、縦並びのときと横並びのときでは、順番が異なります。
縦並びのときは、上→下（正順）、横並びのときは右→左（逆順）となっています。

SP, PCに限らず、レスポンシブに表示順を変えたい時に有効。

# やり方

mediaクエリと```flex-direction: row-reverse; ```を使います。

[MDN - flex-direction](https://developer.mozilla.org/ja/docs/Web/CSS/flex-direction)

# コード

## HTML

flexを使うので、２重構造にしておきます。

```html
<div class="container">
  <div class="box">
    １
  </div>
  <div class="box">
    ２
  </div>
</div>
```

## CSS

スクリーンサイズに応じて、```display``` の値を切り替えます。縦並びのときは```block```に、横並びのときは```flex```を指定します。
さらに、```flex-direction: row-reverse;```を指定しているので、横並びの際は逆順となります。

```css
.container {
  display: flex;
  flex-direction: row-reverse;
}

@media screen and (max-width: 765px) {
  .container {
    display: block; 
  }
}

/* 装飾用 */
.box {
  margin: 10px;
  padding: 10px;
  background-color: #595;
  color: #fff;
  font-family: sans-serif;
}

```

## Codepan

Codepanにコード置いときました。
http://codepen.io/chuck0523/pen/kkGZaL


# そもそもflexがよくわかっていない人

以下の記事がわかりやすいです。ぜひ。

[CSSレイアウトにfloatはもう古い！ 
Webデザイナー初心者でも始められるFlexbox入門](https://ics.media/entry/13117)