OmniAICreator/Qiita-1.07M huggingface dataset:
MeCab で surface が想定通りの結果にならないバグ

## 事象

MeCab で surface（表層形）が正しい表示にならない。

## 注意

surface が **取得できないバグ** とは別件のバグです。こちらについては下記の記事を参考にしてください。

- [python3 + mecabでnode.surfaceが取得できないバグへの対応] 

[python3 + mecabでnode.surfaceが取得できないバグへの対応]: https://qiita.com/piruty/items/ce218090eae53b775b79

## 再現した環境

- Anaconda Python 3.6.5
- MeCab 0.996
- mecab-python3 0.996.1
- 辞書は mecab-ipadic-NEologd を使用

## 再現方法

次のようなコードを書いて実行します。

```python
import MeCab


tagger = MeCab.Tagger('-d /usr/lib/mecab/dic/mecab-ipadic-neologd')
tagger.parse('')

node = tagger.parseToNode('メイが恋ダンスを踊っている。')
result = []

while node:
    surface = node.surface
    feature = node.feature.split(',')

    print(surface, feature)

    node = node.next
```

```shell:実行結果
メイが恋ダンスを踊っている。 ['BOS/EOS', '*', '*', '*', '*', '*', '*', '*', '*']
メイが恋ダンスを踊っている。 ['名詞', '固有名詞', '人名', '一般', '*', '*', 'M.A.Y', 'メイ', 'メイ']
が恋ダンスを踊っている。 ['助詞', '格助詞', '一般', '*', '*', '*', 'が', 'ガ', 'ガ']
恋ダンスを踊っている。 ['名詞', '固有名詞', '一般', '*', '*', '*', '恋ダンス', 'コイダンス', 'コイダンス']
を踊っている。 ['助詞', '格助詞', '一般', '*', '*', '*', 'を', 'ヲ', 'ヲ']
踊っている。 ['動詞', '自立', '*', '*', '五段・ラ行', '連用タ接続', '踊る', 'オドッ', 'オドッ']
ている。 ['助詞', '接続助詞', '*', '*', '*', '*', 'て', 'テ', 'テ']
いる。 ['動詞', '非自立', '*', '*', '一段', '基本形', 'いる', 'イル', 'イル']
。 ['記号', '句点', '*', '*', '*', '*', '。', '。', '。']
 ['BOS/EOS', '*', '*', '*', '*', '*', '*', '*', '*']
[]
```

## 解決方法

すでに [issue #19] で解決されているので GitHub から最新のソースコードを取得してインストールします。

[issue #19]: https://github.com/SamuraiT/mecab-python3/issues/19

```python
$ pipenv install -e git+https://github.com/SamuraiT/mecab-python3#egg=mecab-python3
```

インストール後に再度実行すれば正しく表示されました。

```shell:実行結果
メイ ['名詞', '固有名詞', '人名', '一般', '*', '*', 'M.A.Y', 'メイ', 'メイ']
が ['助詞', '格助詞', '一般', '*', '*', '*', 'が', 'ガ', 'ガ']
恋ダンス ['名詞', '固有名詞', '一般', '*', '*', '*', '恋ダンス', 'コイダンス', 'コイダンス']
を ['助詞', '格助詞', '一般', '*', '*', '*', 'を', 'ヲ', 'ヲ']
踊っ ['動詞', '自立', '*', '*', '五段・ラ行', '連用タ接続', '踊る', 'オドッ', 'オドッ']
て ['助詞', '接続助詞', '*', '*', '*', '*', 'て', 'テ', 'テ']
いる ['動詞', '非自立', '*', '*', '一段', '基本形', 'いる', 'イル', 'イル']
。 ['記号', '句点', '*', '*', '*', '*', '。', '。', '。']
 ['BOS/EOS', '*', '*', '*', '*', '*', '*', '*', '*']
[]
```

mecab-python3 0.996.2 がリリースされれば PyPI からインストールしてもこの問題は解消されていると思います。
Power AppsからMS Flowのフローを呼び出すと発生するエラー「テンプレート言語式を評価できません。 」

#問題
MS Flowで作成したフローをPower Appsのボタンなどに割り当てて、フローを呼び出すと以下のようなエラーが発生する場合があります。

>InvalidTemplate. 行 '1'、列 '1904' のアクション 'リストの取得' 入力でテンプレート言語式を処理できません: 'プロパティ 'shared_sharepointonline_1' が存在しないため、テンプレート言語式 'json(decodeBase64(triggerOutputs().headers['X-MS-APIM-Tokens']))['$connections']['shared_sharepointonline_1']['connectionId']' を評価できません。利用可能なプロパティは '' です。使用方法の詳細については、https://aka.ms/logicexpressions をご覧ください。'。 」

#発生条件
外部サービスとの接続情報(上のエラーではSharepoint Online)を持っているフローをPower Appsに割り当てた後にFlowの接続情報(e.g.ログインアカウント)を更新し、Power Appsからフローを実行すると発生。

#原因
フローをPower Appsに割り当てると、フローの接続情報がPower Appsにコピーされます。
Power Appsに割り当てた後にMS Flowでフローの接続情報を変更するとMS Flow側で保持している接続情報は新しい接続情報に更新されます。しかし、割り当て先のPower Appsにコピーされた接続情報は更新されません。
そのためMS Flow側で新しい接続情報になったフローを古い接続情報のままのPower Appsから呼び出されることで接続情報に差異が生じてしまい、エラーが発生します。

#解決方法
新しい接続情報を設定したフローを「名前をつけて保存」で別のフローとして保存し、そのフローを新しくPower Appsに割り当てし直すと接続情報が新しくコピーされるのでMS Flow側とPower Apps側で接続情報が一致し正常な状態に戻ります。



https://powerusers.microsoft.com/t5/Using-PowerApps/Flow-BUG/td-p/71606
https://powerusers.microsoft.com/t5/Using-PowerApps/Flow-BUG/td-p/71606
Vue.js/Nuxt.jsのmeetupイベントに行った話

#1 主旨
[v-kansai Vue.js/Nuxt.js meetupに行ってきた話](https://vuekansai.connpass.com/event/112900/)
今回参加して感じたことなどを書き連ねていきます。

会場はグランフロント34F！
窓からちらっと見えた景色がすごかった。

#2　アジェンダ
・デザイナーの私がvue.jsと Nuxt.js学んでみた

・Vueコンポーネントについて考えてみた

・Vue.jsからFirebaseに入門しようとしたら使い方間違ってた件

・Nuxt.jsでSSR対応をする

・Contentful の話

・Nuxt.jsのinjectでインジェクトしてみる話

・Vue.js経験日数2日で、あるサービスを作ってみた

・Nuxt.js+Firebase と Laravel で 非同期に アプリケーション開発する話

・Lightening Talks

※細かい内容は資料がUpされているのでそちらを参照

#3　全体的なメモとか感想など
・Vueについて
→UI、ロジックの分離ができる
→コンポーネントという単位での管理による部品の再利用性、デザインの統一
→v-modelなどのディレクティブが優秀
→私はポートフォリオをVueで作ったことがあるのですが、Vuexfireは使ってなかったので次から使用しようかと思います。
→本イベントが登壇者の中でもWebデザイナーの割合が多く、バリバリのフロントエンジニアでなくても習得が容易という印象
→FireBaseと組み合わせが流行？
　RealtimeDataBaseでアクションゲームを作る話が面白かったです。

・Nuxt.jsについて
→Vueをベースにしたフレームワーク
→SSR(サーバーサイドレンダリング)を言語としてサポートしている
 　Webサイトのページ全てにSSR適用しないといけないというわけではなく、必要な部分に適用ということができる
→injectの仕組みを利用して、フロント・サーバーサイドの開発が分離することが容易
 　例えばサーバー側で障害があったとき、フロント側はバグ改修が終了するまで何もできないなどの状況を解消する
→デプロイなどサーバー側の管理はRancherを使うのがスマートな感じがした。
 　知識不足なもので当日はRancherがどういうものかわからなかったのですが、後日調べました。
 　DockerをGUIで管理できるツールのようですね！
 　クラウドの次はコンテナ化の時代が来るのでしょうか。

→Nuxt.js/PHP(Laravel)の組み合わせの話が多かった印象
 　PHPを勉強せねば…

・感想
Web系の技術ということもあり、参加者の層が今までのイベントとは少し違う感じの印象でした。
Webデザイナーの方もいたり、フロント／サーバーサイドエンジニアの方とか良い意味でごちゃごちゃしてました。
私のようなIT土方っぽい感じの人はあまりいるように感じませんでしたね（笑）
年齢層も比較的若い方が多かったような気がします。
個人的にVue/Nuxt.jsには注目しているのでまたイベントがあったら参加してみたいです。

本イベントは第三回目が京都で実施されるようです。
都合が付けば参加しようかと思ってます。

以上です。
PHPのIDEとしてSunblime Textを使いたい

# ビルド設定
１. [Tools] > [Build System] > [New Build System...] > untitled.sublime-bildが開く

```json:untitled.sublime-bild
{
    "shell_cmd": "make"
}
```

２. 設定を書く
[【Mac】Sublime Text 3でPHPをビルドしよう！ - たくじろう.net](http://takujiro.net/2015/09/05/sublime-text-php/)
[Sublime Text で PHP 実行する方法 - 技術ブログ | 株式会社クラウディア](https://cloudear.jp/blog/?p=353)

```json:Macの場合
{
    "cmd": ["php", "$file"],
    "selector": "source.php"
}
```
```json:Windowsの場合
{
    "path": "phpのある場所",
    "cmd": ["php", "-f", "$file"],
    "selector": "source.php",
    "encoding": "UTF-8"
}
```

３. `PHP.sublime-bild` として保存する。

# プラグイン
## 構文チェックしたい
- [構文チェックしてくれるLinterシリーズを使うにはまずSublimeLinterが必要です](https://github.com/SublimeLinter/SublimeLinter)
- [PHPの構文チェックしてくれるSublimeLinter-php](https://packagecontrol.io/packages/SublimeLinter-php)

```text:SublimeLinter-php
1. PHPにPATHを通す
2. SublimeLinterを入れる : リアルタイムで構文チェックをしてくれるパッケージ
3. SublimeLinter-phpを入れる : PHPの構文エラーをチェックしてくれるLintパッケージ
```

## PHPDocを書きたい
- [SublimeText/PhpDoc: PhpDoc support package.](https://github.com/SublimeText/PhpDoc)

## PHPUnitしたい

1. [PHPUnitをインストールする - Qiita](https://qiita.com/ponsuke0531/items/365b9463cd381585a9a3)
2. [Sublime Textでsublime-phpunitを入れる](https://github.com/stuartherbert/sublime-phpunit/blob/master/README.md)

## いろいろ便利にしたい
- [便利なのがほしい - Qiita](https://qiita.com/ponsuke0531/items/781d38b4a7cbc8075ac2#%E4%BE%BF%E5%88%A9%E3%81%AA%E3%81%AE%E3%81%8C%E3%81%BB%E3%81%97%E3%81%84)
Nuxtのプロジェクトでvuex-router-syncを導入する手順について

vuexのgettersやactionsでrouterのパスやクエリパラメータなどを使ってデータを整形したいケースはよくあると思います。

そんな要望を叶えるためにvuexが保持しているstoreとvue-routerが保持しているデータを同期してくれる[vuex-router-sync](https://github.com/vuejs/vuex-router-sync)があります。

今回はNuxtのプロジェクトに**vuex-router-sync**を導入する方法についてまとめました。


## 1. vuex-router-syncのインストール

https://github.com/vuejs/vuex-router-sync

```
yarn add vuex-router-sync
```

## 2. pluginsにファイルを追加

`plugins/vuex-router-sync.js`を作成


```javascript

import { sync } from "vuex-router-sync"

export default ({ app: { store, router } }) => {
  sync(store, router)
}
```

## 3. nuxt.config.jsにpluginを追加

`nuxt.config.js`を編集します。

```javascript
// ...省略
plugins: ["~/plugins/vuex-router-sync"],
// ...省略
```

## 実際にstoreからrouteにアクセス
rootStateに**route**が追加されています。

routeが保持している情報は以下になります。

<img width="276" alt="スクリーンショット 2019-01-20 13.50.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/114525/a7c148a0-57bf-7ad2-5f0e-89a383f2348c.png">

以下のようにアクセスすることが出来ます。

```javascript
export const getters = {
  getHogeData(state, getters, rootState) {
    return rootState.route.params
  }
}
```

手軽に導入、アクセスすることができました。
以上になります。
【Oculus Go】コントローラからレーザーポインタを表示する

# はじめに
Oculus Goのコントローラからレーザーポインタを表示するサンプルを動かしてみます。

# 準備
* [【Oculus Go】コントローラを表示する](https://qiita.com/eKushida/items/0ba3599536c3aef51f04)
* [OVRInputModule Part1](https://us.v-cdn.net/6024342/uploads/editor/f2/n7cs2udd49g1.rar)をインポートする
* [OVRInputModule Part2](https://us.v-cdn.net/6024342/uploads/editor/f2/n7cs2udd49g2.rar)をインポートする
* [OVRInputModule Part3](https://us.v-cdn.net/6024342/uploads/editor/f2/n7cs2udd49g3.rar)をインポートする


# 手順
## 1. レーザーポイント用のオブジェクトの追加
Hierarchy上で「Create Empty」を追加し、オブジェクト名を「Selection Visualizer」とする。

<img width="200" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/d8d7400e-4935-c5e9-0f8b-ece29bbedf3e.png">

## 2. Line Rendererの追加
Selection Visualizerのコンポーネントに「Line Renderer」を追加する。

<img width="350" alt="linerender.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/4ccba602-b643-7ecf-06b8-e5c4df3fe492.png">

インスペクタで、設定を以下のように変更する。

| 項目名 | 値 |
|---|---|
| Cast Shadows | off |
| Receive Shadows | off |
| Width | 0.020 |

<img width="350" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/9369aa4e-db47-7086-25d6-84d856a042d3.png">

[ラインレンダラー](https://docs.unity3d.com/ja/2018.1/Manual/class-LineRenderer.html)の詳細はこちら

## 3. レーザーポインタの先端用のオブジェクトの追加
SelectionVisualizer上で、「Sphere」を追加する。

<img width="200" alt="5.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/83572972-b3cb-8a55-9078-499c36b6a1bb.png">

scaleのx,y,zのscaleを0.05に変更する。

<img width="350" alt="スクリーンショット 2019-01-20 13.27.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/cfafa78e-7591-b45d-599b-a732e1487a3c.png">


## 4. OVRPointerVisualizerの追加
Selection Visualizerのコンポーネントに「OVRPointerVisualizer」を追加する。

<img width="350" alt="スクリーンショット 2019-01-20 12.47.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/d90de4b2-b32b-206c-70ae-dc19afa35284.png">

インスペクタで、設定を以下のように変更する。

| 項目名 | 値 |
|---|---|
| Tracking Space | OVRCameraRig > TrackingSpace |
| Line Pointer | Selection Visualizer |
| Gaze Pointer | Selection Viualizer > Shpere |

<img width="387" alt="スクリーンショット 2019-01-20 13.29.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/9772446b-87fe-c6c9-807e-4e9c29ec8ff5.png">

# 動作確認
無事、レーザポインタが表示されました。

![screenshot-1547956236509.jpg](https://qiita-image-store.s3.amazonaws.com/0/71694/e6cf0715-851c-ebc4-85bf-10089ed5a13d.jpeg)

## （おまけ）レーザーの色を変更する。
MaterialsのElement0を変更すると、色を変更できるようです。

<img width="379" alt="スクリーンショット 2019-01-20 13.42.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/dc3b6adb-d3d4-fa27-6967-a313eefcbddd.png">


![screenshot-1547959436262.jpg](https://qiita-image-store.s3.amazonaws.com/0/71694/1cf00266-2c64-3096-5797-0f66a37a1ec2.jpeg)
AutoHotkey 矢印キーの代替とF4キーが遠すぎる対策

自分の好きなショートカットキーで任意の動作を行わせるため、
最近AHK（AutoHotkey）を導入しました。
それまでは別のソフトなどを駆使してやっていましたが、
USBキーボードになって使えなくなったり、
Windows10になって使えなくなったり、、としたことが増え、
AHKの導入に至った次第です。

巷で色々と使えるサンプルスクリプトなどが簡単に手に入りますが、
ここで私がこれまで別のソフトなどで対応していたものを
AHK化しましたので、ご紹介します。

■ソース

```

;矢印キーに右手がある場合のクローズ動作
^Numpad0::Send, ^{F4} ; Ctrl + 0 -> Ctrl + F4
^Numpad1::Send, !{F4} ; Ctrl + 1 -> Alt + F4
;変換キー、無変換キーを使ったクローズ動作
^vk1D::Send, ^{F4} ; Ctrl + F4
^vk1C::Send, ^{F4} ; Ctrl + F4
;無変換キーとの組み合わせ
vk1D & s:: Send, {Left}
vk1D & f:: Send, {Right}
vk1D & d:: Send, {Down}
vk1D & e:: Send, {Up}
vk1D & w:: Send, {PgUp}
vk1D & r:: Send, {PgDn}
;変換キーとの組み合わせ
vk1C & j:: Send, {Left}
vk1C & l:: Send, {Right}
vk1C & k:: Send, {Down}
vk1C & i:: Send, {Up}
vk1C & u:: Send, {PgUp}
vk1C & o:: Send, {PgDn}
#Hotstring *
;ファイル名末尾に付記する日付文字列
::///::
FormatTime, now,, yyMMdd
Clipboard = %now%
Send,^v
return
```

■詳細
●ウインドウのクローズ

```
;矢印キーに右手がある場合のクローズ動作
^Numpad0::Send, ^{F4} ; Ctrl + 0 -> Ctrl + F4
^Numpad1::Send, !{F4} ; Ctrl + 1 -> Alt + F4
```

・Ctrl + F4　の機能を　Ctrl + 0(Numキー)　に適用
仕事中にブラウザやエクセルを触る時間が多く矢印キーを多用するため、
自分にとって右手は矢印キーの上が準ホームポジションのようになっています。
ウェブブラウジングの時は大量にタブを開いていくスタイルなのですが、
その時に矢印キーの上に置いた右手の位置を動かさずにタブを閉じることができるため、
大変重宝する割り当てです。


 
・Alt + F4　の機能を　Ctrl + 1(Numキー)　に適用
もともとはShift + Ctrl + 0　に割り当てていましたが、
使っているキーボードの仕様なのか、Shift + Ctrl + Numキーを押すと
NumLock On時のキーになるようで、渋々この割り当てにしました。

```
;変換キー、無変換キーを使ったクローズ動作
^vk1D::Send, ^{F4} ; Ctrl + F4
^vk1C::Send, ^{F4} ; Ctrl + F4
```

上記はテンキーが無いキーボードを使っている時に有用な割り当てで、
指を伸ばすが億劫なF4キーを補う意図です。

●ホームポジションから動かさずに押せる矢印キー代用
これは他の方もよくされている例です。
私の場合、右手でも左手でもできるよう、
変換キー、無変換キーの両方で同様の適用を行いました。

```
;無変換キーとの組み合わせ
vk1D & s:: Send, {Left}
vk1D & f:: Send, {Right}
vk1D & d:: Send, {Down}
vk1D & e:: Send, {Up}
vk1D & w:: Send, {PgUp}
vk1D & r:: Send, {PgDn}
 
;変換キーとの組み合わせ
vk1C & j:: Send, {Left}
vk1C & l:: Send, {Right}
vk1C & k:: Send, {Down}
vk1C & i:: Send, {Up}
vk1C & u:: Send, {PgUp}
vk1C & o:: Send, {PgDn}
```

●日付挿入の省力化
自分の使い方として、ファイルに「190112」のような日付を
入れることが多いので、「;;;」と打てば上記が入力されるようにしました。

```
#Hotstring *
;ファイル名末尾に付記する日付文字列
::;;;::
FormatTime, now,, yyMMdd
Clipboard = %now%
Send,^v
return
```


 
以前使用していたATOKは「今日」と打つことで上記のような
6桁の日付を変換で入力できていたのですが、
Windows10に変わりデフォルトのIMEでも
スマホのような予測変換が充実するようになったので
わざわざATOKを導入しなくなりました。
上記はその弊害です。
ちなみにWindows10に変わってからAHKを入れるまでは、
クリップボードに6桁の日付文字列をコピーする
VBSを都度起動して同じ要領を実現していました。
任意のインスタンスタイプでAWS Cloud9を動かす

#注意
~~**2019/04/11現在、この記事の手順は特に必要なくともt3インスタンスでAWS Cloud9環境を作成できました。**この記事は当面、役に立ちません。将来、AWSが新しいインスタンスタイプを発表した時などに、もしかしたら役に立つかも知れません。~~
AWS Cloud9環境作成時にt3は選択できるようになりましたが、新たにインスタンスタイプt3aが登場して、そちらはまだ選択できないので、この記事は**その時選択できないインスタンスタイプでCloud9を使いたい**時に役立ててください。[^obsolete]

#要約
1.AWS Cloud9は初期設定で指定できるインスタンスタイプに偏りがあります。
2.一度初期設定を済ませ、その後にインスタンスタイプを変更すれば、好きなインスタンスタイプでCloud9を使えます。

#この記事が書かれた経緯
今回、IDEやその他開発ツールを満足にインストールできない環境からコードを書くために、AWS Cloud9を使うことにしました。この記事はその過程でちょっと見つけた小ネタです。

## Cloud9環境を作る
こちらの記事の通りにやってみて、全てうまく行きました。
「AWS Cloud9を動かしてみた」
https://qiita.com/icck/items/7705ef6871e261d6535e

上の記事にもありますが、Cloud9の設定画面では、選択できるインスタンスタイプがやけに少ないですね。
記事の内容を参考にしながら「Other Instance Type」を開いてみましたが、実はこちらの選択肢もそれほど多くはありません。
![c9-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/158145/8ba93fb2-c28d-9f53-6aa5-c5d9de455585.png)
特に、t3が使えないのは釈然としないなぁ。上の参考元の記事はt3登場前に書かれているものですが、t3登場後に書かれていたら、著者の方もそう思っただろうなぁ…と思います。
とはいえ、ないものは仕方がないので、ひとまずこの中からインスタンスタイプを決めます。
## インスタンスタイプを変える
でも大丈夫。相手はたかだかEC2です。一度インスタンスを停止してインスタンスタイプを変更してしまいましょう。
なお、この際に**ブラウザからCloud9のIDEを開いたままでいると、コンソールからインスタンスを停止してもCloud9がインスタンスを起動しようとするため、インスタンスタイプを変更できませんでした。**
![c9-3.PNG](https://qiita-image-store.s3.amazonaws.com/0/158145/73afc9b3-776d-55c0-c669-1deb086dc609.png)

今回はこれで、t2.smallから、安くて高性能なt3.smallに変更してみました。

また、インスタンスタイプを変更した後でも、Cloud9側で設定したCost-saving settingがちゃんと生きているのは確認できました。

では、また何か、面白そうなものがあれば書いてみます。

[^obsolete]: インスタンスタイプは好きに変えられるとして、実は2019/05現在Clowd9環境に使われているAMIイメージって、Amazon Linux（2じゃないほう）なんですよね。そろそろ新しくして欲しいなぁと思います。
Railsチュートリアル躓き→解決箇所:1.5.3 Herokuにデプロイする(2) 演習1

##1.5.3 Herokuにデプロイする(2) 演習1

####問題: git push herokuでデプロイを試みるが本番URLで変更反映されない

- 環境: AWSCloud9
バージョン設定はRailsチュートリアル内容に準じる。 

- エラー表示： 
emote: !   WARNING:
remote: !   Do not authenticate with username and password using git.
remote: !   Run `heroku login` to update your credentials, then retry the git command.
remote: !   See documentation for details: https://devcenter.heroku.com/articles/git#http-git-authentication
fatal: Authentication failed for ~

- 解決法: https://qiita.com/shiroux/items/f0e1844ff3ef301d88b9
上記ページ記載の手順を実行。
Gitの設定を変えるみたいです。今の時点では深追いはせず、次に進めるので良しとします。
jQuery クリックしたテーブルの値取得

業務でクリックしたテーブルの値を取得する必要があった為、
その方法を調べたメモ書き。

実際のソースコード

```html:GetTableVal.html
<!DOCTYPE html>
<html>
    <head>
        <title>ジジ&ハリー</title>
        <meta charset="UTF-8" />
    </head>
    <script type="text/javascript"
            src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <body>
        <table id="friend-table" border="1" cellspacing="0" cellpadding="5" >
            <tr>
                <th hidden>No</th>
                <th>名前</th>
                <th>特徴</th>
                <th>好きな食べ物</th>
                <th>好きな遊び</th>
            </tr>
            <tr class='chara'>
                <td hidden>01</td>
                <td>ジジ</td>
                <td>目が大きい</td>
                <td>チョコバット</td>
                <td>ハリーと遊ぶ</td>
            </tr>
            <tr class='chara'>
                <td hidden>02</td>
                <td>ハリー</td>
                <td>かわいい</td>
                <td>チョコパイ</td>
                <td>空中散歩</td>
            </tr>
        </table>
    </body>
    <script type="text/javascript">
        $('.chara').on('click', function(){
            var hiddenVal = $(this).children('td')[0].innerText;
            var nameVal = $(this).children('td')[1].innerText;
            alert('No: '+ hiddenVal + ' name: '+ nameVal);
        });
    </script>
</html>
```

説明
①どのレコードがクリックされたか識別出来るようテーブルの\<tr>タグにclass='chara'属性を付与
②var hiddenVal = $(this).children('td')[0].innerText;
　クリックされたレコードの0番目の値をjQueryオブジェクトとして取得
　そのオブジェクトのinnerTextプロパティの値を取得して変数に格納
「mysql --version」がcommand not foundになる件

#概要
・mysql@5.6をインストールする
・確認のため「mysql --version」コマンドを実行したが、以下のエラーが返ってきたので解決する

```bash:shell
$ mysql --version
-bash: mysql: command not found
```
※初心者なのでお手柔らかに
#対象のバージョン
macOS Mojave

Homebrew 1.9.2
　・パッケージ管理マネージャー
　・mysql@5.6を導入するために使用

MYSQL5.6
　・データベース

#解決方法
① パスが通ってないので、パスを通す

・mysql@5.6インストール時のメッセージにこのように書いてあるので、echo以下をそのままコピーして使います

```bash:shell
$ brew install mysql@5.6
〜
If you need to have mysql@5.6 first in your PATH run:
  echo 'export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"' >> ~/.bash_profile
〜
```
・コピーしたコマンドを実行します

```bash:shell
# パスを通す
$ echo 'export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"' >> ~/.bash_profile
# ~/.bash_profileにパスが更新されていることを確認
$ cat ~/.bash_profile
~~
export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"
```

② mysql --versionを打ってみましょう

```bash:shell
$ mysql --version
mysql  Ver 14.14 Distrib 5.6.42, for osx10.14 (x86_64) using  EditLine wrapper
```

#「パスを通す」をめちゃくちゃ雑にこじつけて理解したことにする
①mysqlコマンドはこのようにすればパスを通さなくても実行できる

```bash:shell
#以下のパス先にあるmysqlコマンドを実行するって感じでしょうか
/usr/local/opt/mysql@5.6/bin/mysql --version
/usr/local/opt/mysql@5.6/bin/mysql  Ver 14.14 Distrib 5.6.42, for osx10.14 (x86_64) using  EditLine wrapper
```
でもこれを毎回打つのは面倒なので、あらかじめ登録しておきたい
その登録先が「~/.bash_profile」
※カーナビに家の住所を登録しておく感じ、デスクトップによく使うショートカットを登録する感じ

②そんなわけで「パスを通して**(パスを~/.bash_profileに登録)**して」、次回から省略します

```bash:shell
#パスを通す
$ echo 'export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"' >> ~/.bash_profile
#パス省略しても大丈夫
$ mysql --version
mysql  Ver 14.14 Distrib 5.6.42, for osx10.14 (x86_64) using  EditLine wrapper
```
ArgumentError in Tasks#index

こんにちは.
railsでタスク管理アプリを作っていたところ,

[![Screenshot from Gyazo](https://gyazo.com/811a8dc168dad7828f7de87e075ec47a/raw)](https://gyazo.com/811a8dc168dad7828f7de87e075ec47a)

コントロ-ラーです↓
[![Screenshot from Gyazo](https://gyazo.com/3e59ce7b0f523df61e063bf231f5219f/raw)](https://gyazo.com/3e59ce7b0f523df61e063bf231f5219f)

index.html.erbのviewです↓

[![Screenshot from Gyazo](https://gyazo.com/fc895634fd696bb367e819dc800a9693/raw)](https://gyazo.com/fc895634fd696bb367e819dc800a9693)

本来ならこう出力されます。↓
[![Screenshot from Gyazo](https://gyazo.com/61a601111d5d728aa1fc625ab3dd49c5/raw)](https://gyazo.com/61a601111d5d728aa1fc625ab3dd49c5)

どなたか詳しい方教えてください。
LPO（ランディングページ最適化ツール）の基礎知識

## 考え方

- 検索キーワードとコンテンツは一致しているか
- マーケティングの主流は個別対応
- 個別対応できるランディングページ戦略
- リアル店舗での経験を活かす

### 「胡麻蘭」の場合

キーワードによってLPの作りを変える

- 配送重視LP -> 通販、配達、宅配
- 価格重視LP -> 価格、安い、送料
- 用途重視LP-> ギフト、祝い、プレゼント
- 栽培重視LP -> 育て方、手入れ、植え替え

## 訪問者がとる5つの行動をターゲティング

- どんな検索キーワードで来たことがあるのか
- どのホームページから来たのか
- 何回目の訪問なのか
- どの商品を買ったことがあるのか
- どのページを見たことがあるのか

### 検索キーワードの調査方法

- Googleキーワードツール
- FerretPLUS
- Google　Insights for Search
- UnitSearch

## 繁盛キーワード

- 緊急性が高いキーワード -> トイレ、つまり
- 重要性が高いキーワード -> データ、復旧
- 地域性が高いキーワード -> 銀座、ランチ
- 季節性が高いキーワード -> ゴールデンウイーク、国内旅行
- 専門性が高いキーワード -> VPN 回線　費用

## LPOツール

- ココマッチLPO
- CONDUCTORLCO

## エリアターゲティング

### 気候が違う

- 遠い地域のものを欲しがる

### 地元のものに愛着をもつ

- 地域を限定したキャンペーン　祝・埼玉県民の日　25%OFFクーポン券

## Google無料ツール

- ウェブサイトオプティマイザー
- A/Bテスト
- 多変量テスト

## 伝えること

- 何のホームページなのか
- 訪問者にどんなメリットがあるのか
- 他社との違いはどこなのか
- 信頼に足る実績はあるのか

## ランディングページの作り方

- 敷居の低いゴールを1つだけ用意する
- 訴求ポイントを絞り込む
- ビジュアル重視
- 流れを視覚化する -> 矢印、数字、繰り返し
AWS SSO (Single Sign On)にMFAを設定する

AWSのシングルサインオンサービスであるAWS SSOにメールによるMFA機能が追加されたので設定してみました。これまでMFAを実現するためにはディレクトリ側(Active Directoryなど)でRADIUSサーバを設定する必要がありましたが、この機能によってAWS SSO側でマネージドなMFAが設定できるようになりました。AWS SSOはマルチアカウント環境のログインユーザ管理が簡単なステップでとても楽になるためお勧めです。


# 前提条件
* すでにAWS SSOが設定済みである。
* ディレクトリとしてActive Directoryを使用している場合は、ADユーザのプロパティでメールアドレスが設定されている必要があります。AWS SSOディレクトリを使っている場合はユーザ作成時に入力するメールアドレス(ユーザ名)が使用されます。

# AWS SSOでMFAを設定する
* AWSマネジメントコンソールにログインし、AWS SSOのコンソールを開きます。(2018/1時点でAWS SSOの設定はバージニア北部リージョンからのみ可能です。)
* "設定"をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/345960/b9cee0f7-5135-3cfa-d67d-5ef47de037e1.png)


* "AWS MFAの設定"をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/345960/3eadef80-3e30-6c41-4ae8-59b96611364a.png)

* "MFAモード"を選択します。"MFAメソッド"は現時点ではEメールベースのMFA"のみです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/345960/4ade9fd6-d199-341b-2531-99b47223fe78.png)

* 警告画面で"CONFIRM"を入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/345960/5459e34e-7f63-07f6-37b5-776abe5a5ceb.png)

* 設定が完了します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/345960/ba6ea4fa-0999-d08f-10be-b46b9bf0523a.png)

* AWS SSOのユーザポータルからログインしてみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/345960/2c73a87b-132f-a73f-bda0-e869214429d8.png)
すると以下の画面が表示されるようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/345960/e75ef9e0-27be-d0e2-d52e-5229a0ac1fe9.png)
ユーザにメールアドレスが適切に設定されていない場合は以下の画面が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/345960/4e9ebce7-c133-030d-f662-e66a4cf14d9e.png)

* ユーザのメールアドレス宛に以下のようなメールが届くため、確認コードを入力し、"サインイン"をクリックします。コードの有効期間は10分です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/345960/52ff2893-bcfe-2867-c6ac-90d62575d9d2.png)

* ユーザポータルにログインできました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/345960/c9a936b8-9bc3-82f4-0442-6a5f755c48db.png)

### まとめ
RADIUSサーバの設定なしに簡単にAWS SSOにMFAを設定することができました。対応方式が増えるとより良いですね。
Python Pandas.read_csv 関連ノウハウ

# はじめに
pandas.read_csv に関して、高速化・日本語対応等に関するノウハウをまとめました。

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

## 圧縮CSVファイルの読み込み

    compression="infer"  # デフォルト値

* Pandas.read_csvは、gzip, zipなどで圧縮されたCSVファイルをOn-the-flyで解凍して読み込める。
* デフォルトでは「compression="infer"」のため、read_csvは拡張子から圧縮方法を推定する。compressionを変更することで、拡張子によらない圧縮方法の指定が可能。
* 冗長になりがちなCSVファイルは圧縮率が高いため、これを利用するとディスク領域の削減効果が高い。

## 日本語CSVファイルの読み込み

    engine = "python"

* デフォルトのparserエンジン"c"では日本語名ファイルの読み込みに失敗する。
* parserエンジン"python"を指定すると、日本語ファイルの読み込みも可能になる。
* ただし、parserエンジン"c"の方が高速。


## 複数カラムを日付カラムに変換 

    parse_dates = {"DATETIME":["DATE","TIME"]}

* 日付カラム"DATE"と時刻カラム"TIME"を連結して"DATETIME"という新しい日時カラムを定義できる。

## 日付フォーマットを指定して高速化

    to_datetime = lambda d: pd.to_datetime(d, format ="%Y/%m/%d %H:%M:%S")
    ...
    date_parser = to_datetime
　　
日付フォーマットは指定したほうが、read_csvの読み込みが高速化される。


## Windows環境では文字コードは”CP932”

    encoding = "cp932"


* Windows環境のShift-JIS ＝ Shift-JISを拡張したCP932 ≠ Pythonの Shift-JIS
* そのため、文字コードとして”sjis”を使うならば”cp932"を指定したほうがトラブルが少ない。


https://qiita.com/vh5150/items/43ad779f993de9a1c163


## pickleで入出力を高速化

    df.to_pickle("D:¥¥Output.pkl")

- pickle形式はCSV形式と比べ、型推定などを省略できるため、読み込みが高速。
- そのため、前処理後のデータはCSV形式でなくPickle形式で保存したほうが良い。

# サンプルコード
```python:sample.py
import pandas as pd

# 日付フォーマットを指定して高速化
to_datetime = lambda d: pd.to_datetime(d, format ="%Y/%m/%d %H:%M:%S", errors="coerce")

df = pd.read_csv(
    "D:¥¥日本語.csv.gz",  # 圧縮CSVファイルの読み込み 
    parse_dates = {"DATETIME":["DATE","TIME"]}, # 複数カラムを日付カラムに変換
    date_parser = to_datetime, # 日付フォーマットを指定して高速化
    engine = "python", # 日本語CSVファイルの読み込み
    encoding = "cp932", # Windows環境では文字コードは”CP932”
)

# pickleで入出力を高速化
df.to_pickle("D:¥¥Output.pkl")
df2 = pd.read_pickle("D:¥¥Output.pkl")
```
動的型付け言語も型を意識して書くべき

Python、Ruby、JavaScriptなどは動的型付け言語と呼ばれています。

動的型付け言語では、変数や関数の引数には型が指定されておらず、値が型を持っています[^1]。また、リスト（配列）や辞書（ハッシュ、オブジェクト）に異なる型の値を混ぜて格納することができます。

[^1]: なお、変数どころか値も型を持っていない（かのような）実行モデルの言語もあります。[Tcl](https://ja.wikipedia.org/wiki/Tcl/Tk#%E7%89%B9%E5%BE%B4)とか。

ところで、動的型付け言語について以下のような、「利点」を紹介する記事を見かけることがあります。曰く：

- 配列にどんな型の値も格納できるので便利
- どのような型の値でも代入できるので、型を意識しなくてもよい
- 変数に型がないので変更に強い
- if文で値の型をチェックすれば、変数に型は不要

**どれも誤解です。**

動的型付け言語を正しく使うには、動的型付け言語が作られ・使われている背景を理解しなければなりません。

# 古い静的型付け言語の辛さ

Ruby・Python・JavaScriptなどが普及した1990年代 〜 2000年代には、ロクな静的型言語がありませんでした。低級で安全に書くのが難しいC言語、複雑怪奇なC++、冗長で遅くジェネリクスを欠いたJavaなどです。

これらの言語で特に辛いのは**型名を書かなければならないこと**。人間なら一目で型が分かる部分にも型を明示しなければなりません。

```java
ArrayList<String> alist = new ArrayList<String>(); // 右辺を見れば、alistの型は明らかだが、書かなければならない
```

もう一つの重要な「辛さ」は、**インターフェースの指定をクラス側が行う**のでダックタイピングをしにくいことです。例えば、以下のような、ファイルのインターフェース / 具象クラスを定義する C++ のコードがあったとしましょう：

```C++
// 読み書き可能なファイルを表すインターフェース
class IFile {
    public:
    vector<char> read(int n);
    int write(vector<char> v);
};

// 読み込み可能なファイルの具象クラス
class File: public IFile;
```

そして、このインターフェースを使う関数を作ったとします。

```c++
// ファイルをすべて読み込む関数
vector<char> read_all(IFile f) {
    // 当然、.read は使うが、.writeは使わない
}
```

`read_all` が受け付ける引数は `IFile` を継承したクラスのオブジェクトのみです。たとえ `.read` を提供していたとしても、`IFile`を継承していなければアウトです。

また、あるクラスを`read_all`の引数に渡したければ `IFile`を継承しなければなりませんが、そのためには `IFile`のメソッドをすべて定義しなければなりません（`read_all` では `.read`しか使っていないのに）。

`IFile`も`File`も`read_all`も全て自分で書いたコードなら回避策もあるのですが、`IFile` がライブラリのような自分が手を出せないところで定義されたものだったりすると辛いことになります。

# 動的型付け言語なら辛くない

そうした暗黒時代において、ほとんどの人々は無力でした。プログラミングとはこういうものだと思い込んでいました。

しかし、

- 未来を発明するパパ
- 子供とパワーレンジャーを観てホンダ・アコードで牛丼屋に連れて行くパパ
- モンティパイソン大好きのパパ
- 学生時代はノートに自作言語を書くのが趣味だったパパ

といった人たちは気づいていたのです。

```
コンパイル時にインターフェースをチェックをしなければいいじゃないか？
```

そうです、動的型付け言語だと引数の型自体をチェックしないので、こうした辛さはないのです！！

```ruby
# Ruby
alist = [] # 型を書かなくてもよい

def read_all(f)
  # 引数の型を指定しないので、
  # 引数の値が所定のメソッドを提供してくれさえすれば、
  # どんな型の値でも動作する
end
```

※追記： 上記の説明は「１９９０年代に『動的型付け』というアイデアが考案された」というようにも読める表現になっていますが、実際には動的型付け言語はそれ以前からありました。

# 動的型付け言語には「インターフェースが無い」のか？

動的型付け言語は、あくまでダメダメな静的型付け言語の辛さを回避するために作れられたものです。型とかインターフェースの概念を否定しているわけではありません。

例えば、動的型言語版の `read_all(f)` では、`f` は 「`.read`メソッドを提供しなければならない」という（仮想的な）インターフェースを実装することを要求しています。`.read`メソッドが無いオブジェクトを渡したら、当然エラーになります。実際の開発では「`f` は `.read`メソッドを提供することを期待する」とコメント等に書いておかなければなりません。

よって、動的型付け言語は「インターフェースが無い」わけではなく

- **目に見えないインターフェースがある**
- **インターフェースのチェックを、コンパイラーの代わりに人間が行なっている**

とも見做せます。

# 今でも動的型付け言語がベストなの？

静的型付け言語も進化しています。

現在では、多くの言語が変数定義の型を省略できる機能（型推論）を持っています。

またGo言語では「インターフェースを関数の引数の側で指定する」仕様になっています（構造的部分型）。つまり、動的型言語でコメントに書かれていた「`f` が `.read`メソッドを提供することを期待する」的なことを、コンパイラでチェックできるようになるのです。

また、90年代に比べて開発環境（特にIDE）が進歩し、インターフェースをリファクタリングしたり、アダプタークラスを作ったりすることが容易になりました。そのため、（古い）静的型付け言語であっても、昔ほどの辛さは感じなくなりました。

すると、動的型付け言語の **「チェックを人間が行う」という特徴は昔に比べてデメリットが目立つようになっています**。

とは言え、言語を選ぶ判断材料は静的vs.動的だけではありません。ライブラリの充実度とか、利用実績とか、現に使ってしまっているかどうかとか。また、動的型付け言語すなわち「型チェックが無いから危険」というわけでもありません。動的型付け言語には、それぞれ**エンバグしにくく書くためのイディオム**とか**デファクトスタンダードのLintツール**があります。プログラミング言語は上手に使って、楽しく書きましょう。
Webマーケティング基礎知識

「[マンガでわかるWebマーケティング ―Webマーケッター瞳の挑戦！](https://www.amazon.co.jp/%E3%83%9E%E3%83%B3%E3%82%AC%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8BWeb%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0-%E2%80%95Web%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%83%E3%82%BF%E3%83%BC%E7%9E%B3%E3%81%AE%E6%8C%91%E6%88%A6%EF%BC%81%E2%80%95-%E6%9D%91%E4%B8%8A-%E4%BD%B3%E4%BB%A3/dp/4844330160/ref=sr_1_3?s=books&ie=UTF8&qid=1547955713&sr=1-3&keywords=%E6%BC%AB%E7%94%BB%E3%80%80%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0)」を読んでまとめたものです。


## フローごとにアンケートをとる

- KPS -> 満足度を尋ねるものではなく「人におすすめしたいか」のアンケート
- 各フローごとにKPSをとることでどのフローで満足、不満を抱いているのかがわかる

## ビックデータ‐を活用して自分だけの接客

- 来店1回目、2回目・・・の個人データを記録することで、その個人によってメルマガの情報やおすすめ情報を変える

## BEAMSのECサイト

- 店舗スタッフが顔出しでタイムライン投稿を記録
- お気に入りの店舗スタッフを選んで実店舗でコーディネートの依頼ができる

## エンゲージメントの意義

- 送り手が一方的に受け手に買うように推し進めても買わない
- いかに受け手にとって有益なものであるか、また共感を得た上で購入、リピーターとなる
- 送り手も受け手も両方ハッピーになる商品、戦略が必要
- 企業内の社員でもエンゲージメントが必要
- 自社愛があって初めて、お客さんにそれを提供したいという気持ちになる

## どの程度関心を持っているかを把握

- 例えば家の購入を考えてる人がサイトに訪問、資料請求、家の見学申し込みに分かれていれば。どの段階が購入率が高くなるかが分かる
- どの程度関心を持っているかによってそのアプローチ方法が異なる

## 中古PCのECサイト

- 中古PCの購入で即日お届け
- 返金100%を謳うことでユーザーの需要と安心につなげている

## スタッフ顔出し100%のECサイト

- 店舗スタッフの顔出しを100%にすることでスタッフが責任を持って発言することができる
- 有益な情報を得たり。ユーザーに安心感を与える

## メルマガの活用

- ポイント付与をメルマガで行ったり、お得情報を発信する
- 各顧客によって変えると尚よい

## ユーザーの検索キーワード認識

- たとえば、企業のマスコットキャラクターの検索キーワードが多い場合、そのキャラクターの特設ページを作って入り口を作る
- その特長などを知ってもらってキャラクターに好意を抱かせる
- それが商品購入につながる

## 同じ記述、問い合わせをさせない

- 1回目の来店時に記入してもらって、お問い合わせもらった内容を2回目以降もさせない
- 覚えるようにデーターベース化させる

## EPO（エントリーフォーム最適化）

- 入会するときに書き込むエントリーフォームの離脱率を測って改善を図る
- そもそも不要な項目があるかも洗い出す

## LPO（ランディングページ最適化ツール）を適用する

- ユーザーの検索キーワード、リスティング広告、アフィリエイト広告によってLPを振り分ける。（場合によっては数十種類にも及ぶ）

## 広告の種類

### 純広告

- ある特定のサイトにお金を払って載せる広告
- 広告を見るユーザーは多いが、興味のない人も多い

### リスティング広告

- ユーザーの検索キーワードによって表示させる広告
- ユーザーの需要とマッチしているが、競合広告も多数あるためボリュームが減る

### アフィリエイト広告

- アフィリエイターがバナーを貼ってもらって、契約成約で報酬を渡す広告
- アフィリエイターがその商品に関して宣伝しやすい情報、ポイントを提供することで、商品を紹介しやすくさせる
- 結果、成約率がアップ
- 第三者との関係で成り立つので信憑性も高い


## AISAS理論

- インターネットにおける典型的な購買行動をモデル化
- Attention（注意・認知）
- Interest（興味）
- Search（検索）
- Action（購買）
- Share（情報共有）

## マンガコンテンツ

- HTMLメールやページにマンガを導入
- 親しみやすさと分かりやすさを取り入れる

## 離脱者に向けたメルマガ配信

- 入会をしないで離脱してしまったユーザーに向けたメルマガ配信をする
- 自社のサービスを始める前の懸念点、不安点を挙げて（クレーム、お問い合わせ内容から）、それからサービス使用しての実際の喜びの声を載せる
- 不安に対する改善点を配信

## 発注するときの心得

- 制作する背景
- 制作の目的(認知向上、売上向上、イメージアップ、その他目的)
- 目的の優先順位
- 期待する効果(アクセス数向上、問い合わせ数向上、その他効果)
- 会社の特徴
- 会社の強み/弱み
- 将来のビジョン
- 組織構成
- 従業員数
- 現状の不満点
- サイト内で最も重要なコンテンツ
- ユーザーに与える利益

## O2O(オンライン・ツー・オフライン)

- オンラインとオフラインの購買活動が連携し合う
- オンラインでの活動が実店舗などでの購買に影響を及ばさない

## ビッグデータ

- 通常の技術では処理や管理が困難であるほど巨大で複雑なデータの集合

## 新しい技術

- QRコードを使ってポイントを与える
- RFID→ICチップを埋め込んでデータ管理する
- AR（セカイカメラのように現実世界の情報を表示）
- デジタルサイネージ(電子看板)→画面をタッチして情報を検索、閲覧

## キックオフミーティングの意義

- サイト制作の目的、KPI、スケジュールを共有
- 進捗状況共有をどうするか。などを決める最初のMTG
マルチプラットフォーム対応のスレッド処理を書く

本文書は、マルチコア対応 Forth 系言語 [Paraphrase](https://github.com/iigura/Paraphrase) の開発作業からのスピンオフ企画です（C++ 教材としての Paraphrase / Paraphrase 解体新書プロジェクト）。

# お急ぎの方へ
　GitHub に揚げてあるコード https://github.com/iigura/Paraphrase/blob/master/src/inc/thread.h を見て下さい。

# 背景および戦略
　Paraphrase は、シングルソース・マルチプラットフォームな開発を行っています。現在対応しているプラットホームは Mac, Linux そして Windows です。Mac や Linux では pthread が使用できますが、Windows の場合、標準の環境では使用できません。そのため、プラットホーム依存の部分を適当なコード（マクロ）でラッピングし、ラッパーを使うことでプラットホーム依存の部分を吸収するようにしました（って、ごく普通の戦略ですね…）。

# とは言うものの…
　Mac、Linux については pthread を使えば良いのですが、Windows については、さてどうしたものか、という状況でした。Windows 版 pthread もなんだか微妙な雰囲気な雰囲気を受けました（完全に個人的な偏見ですが）。


# マルチスレッド対応 - 特に pthread_cond_wait() をどうすれば良いのか問題
　Windows 版を考えるときに、thread の生成などは Windows API でもなんとかなりそうな感じだったのですが、pthread_cond_wait() と同等のものが見つけられず色々調べておりました。

　結論から言えば、今や C++ ではスレッドは標準的な機能としてライブラリが提供されているので、それを利用することとした。いやぁ、時代は変わるもんですねぇ。灯台下暗し。

結局、

* スレッドは std::thread を
* シグナル待ちは std::condition_variable を

使用するようにしました。特に、Windows で pthread_cond_wait() したい場合、そこそこ速度が出そうな（手軽な *1）方法が見当たらないので、これは非常に助かっりました。

*1 私の記憶では、そのような場合は IOCP (I/O Completion Port）を用いるのが最速だったような気がするのだけれども…。ただ、それを用いて pthread の互換 wrapper を書くのも辛い年齢なので、その部分に関しては頑張ることはできませんでした。Windows ネイティブの機能で（簡単に）シグナル待ちする場合って、イベントを用いて WaitForSingleObject() するしかないんですかねぇ…だれか詳しい人、教えて下さい。

余談： std::condition_variable は遅い、という話もあり（要出典）、Paraphrase のビルドシステムにおいては、Mac と Linux 版はビルド時のオプションで pthread と std::thread を切り替えられるようにしてあります。


# ラッパー（というかマクロ）
　https://github.com/iigura/Paraphrase/blob/master/src/inc/thread.h をダウンロードし、適当に include して下さい。すると、以下のような関数やマクロが定義されます。

* Thread - スレッドを表す型
* Mutex - 排他制御用ミューテックスを表す型
* Cond - 条件（シグナル待ち等に使う）を表す型

…って、そのままですね（汗

以下、ラッパーです。th は Thread 型の変数を、mtx は Mutex 型の変数、cnd は Cond 型の変数を表すものとします：

* initMutex(mtx) - mtx を初期化します
* initCond(cnd) - cnd を初期化します
* Lock(mtx) - mtx を用いてクリティカルセクション（排他制御エリア）に入ります
* Unlock(mtx) - ロックに使用した mtx を用いてクリティカルセクションから抜けます
* NotifyOne(cnd) - cnd を用いてシグナル待ちしているスレッドをひとつ起こします
* NotifyAll(cnd) - cnd を用いてシグナル待ちしている全てのスレッドを起こします
* CondWait(cnd,mtx) - cnd と mtx を用いてシグナル待ち状態に入ります（NotifyOne もしくは NotifyAll にて起こされます）
* NewThread(th,func,arg) - 新しいスレッドを関数 func(arg) と共に起動します。起動したスレッドは th に代入されます
* Yield() - 他のスレッドに yeild します

# おわりに
　本コードと同様の働きをするラッパーライブラリもいくつかあったかと思いますが、どれも機能が豊富すぎて（＝規模が大きくて）、結局自作してしまったという感じです。ぱっとみて分かる、小規模なものが欲しい方が、私の他にも存在するならば幸いです。
Scalaのvar, valの違い

Scalaの変数定義である、varとval、2つのそれぞれの挙動の違いとどちらを使用するべきかに調べたので、メモします。

## var
こちらは、C++, javaの通常変数と同じで、値の変更が可能な変数です。
ただし、型の違う値を代入しようとするとエラーとなります。

#### 実行例：

```Scala
scala> var a = 2
a: Int = 2

scala> // 変数の値は、valueを変更可能
scala> a = 3
a: Int = 3

scala> // 違う型の値を代入すると、エラーになる。
scala> a = 2.5
<console>:12: error: type mismatch;
 found   : Double(2.5)
 required: Int
       a = 2.5
```


## val
こちらは、C++のconst, javaのfinalと同じようなものと考えます。
最初に定義した変数の値の変更が不可能です。
もちろん、型の違う値を代入してもエラーになります。

#### 実行例：

```Scala
scala> val a = 2
a: Int = 2

scala> // 変数の値は、valueを変更不可能
scala> a = 3
<console>:12: error: reassignment to val
       a = 3
         ^
scala> // 違う型の値を代入すると、エラーになる。
scala> a = 2.5
<console>:12: error: reassignment to val
       a = 2.5
         ^
```

## どちら使うべき?
以下の記事によると一般的にScalaではvalを使うことのほうが多いようです。
https://dwango.github.io/scala_text/basic.html#%E5%A4%89%E6%95%B0%E3%81%AE%E5%9F%BA%E6%9C%AC
【Oculus Go】コントローラを表示する

# はじめに
会社のクリスマスパーティのビンゴでOculus Goが当たったので、Oculus Goの開発にチャレンジしてみます。
まずは、Oculus Goのコントローラを表示するサンプルを動かしてみます。

# 準備
* [Oculus Utilities for Unity](https://developer.oculus.com/downloads/package/oculus-utilities-for-unity-5/)をダウンロード後、インストールする。
* Asset StoreよりOculus Integrationをインストールする。

# 手順
## 1. OVRCameraRigの追加し、Main Cameraの削除
Assets -> Oculus -> VR -> Prefabs > OVRCameraRigを選択し、Hierarchyへドラッグ＆ドロップする。

<img width="879" alt="5.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/2bfde2a6-94bb-d232-1a7c-70458d316986.png">

Main Cameraは不要のため、削除します。

<img width="302" alt="6.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/d0c258ec-8b78-8986-5a7d-a0a03004a9ad.png">

## 2. Oculus Goのコントローラの追加
LeftHandAnchorとRightHandAnchorにTrackedRemoteを追加する。

<img width="883" alt="8.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/33cf1c2a-5827-eccd-7435-5d7ddb4f1bda.png">

## 3. 実行
「"OVRPlugin.aar" is denied.」　というエラーが表示されました。
甘くないですね。

<img width="983" alt="スクリーンショット 2019-01-13 10.37.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/04c89826-9cde-a7ab-cdc4-e22134b1802b.png">

下記の記事を見つけ、試してみました。
ファイル名を「OVRPlugin.aar」から「OVRPlugin.bak」に変更して再度実行してみる。

[[Solved] Can't Make Android Build - Access to OVRPlugin.aar Denied](https://forum.unity.com/threads/solved-cant-make-android-build-access-to-ovrplugin-aar-denied.505856/)

## 4. 実行結果
無事にコントローラが表示されました。
ここまでコードは一行も書いていません。
ただし、レーザポインタはまだ表示されていません。

![9.jpg](https://qiita-image-store.s3.amazonaws.com/0/71694/ef86050c-e3bc-7ce7-159d-5da35c0f17fc.jpeg)

# 参考
ChromeのPluginを利用すると、画面共有できるようです。
参考までに

[Vysor](https://chrome.google.com/webstore/detail/vysor/gidgenkbbabolejbgbpnhbimgjbffefm/related?hl=ja)
エンジニアは無理数とか、そんな数式を知らなくてもできる職業。数学の世界も面白そうだけどね。

数学の世界には、絶対に成り立たないということが成り立つみたいな、そんな不思議な公式があるらしい。

# この 0 =1 と言うのは、無理数の何かだっけ、その究極的な公式を、

極限までシンプルにして、最終形態にした。そんな感じがした。 https://t.co/qEFkg5Ju2U


機械の言葉は、1番低いレイヤーでは、2進数で描かれている。0と1しか存在しない。サザンオールスターズの昔の歌でも、ゼロワンMessengerという歌があったな。CDシングルが長く細かった時代。はるか昔の話。懐かしい。

#  そして、プログラミングの世界ではこの 0=1 と言う、

演算は、成り立たないわけだけど、もしプログラミングが究極的に数学の不思議な世界を表現できるならば、この公式だって成り立っておかしくないんじゃないか。

これを書くことによって、無理数の何らかのあれを表現できないだろうか。
そんなことをぼんやりと考えてみる。ところでプログラマには、

# 数学的な能力より、国語的な能力の方が実は大事で、

大学にも行ったことのない僕は、微分積分もわからないし、本当にぼんやりとしたイメージで数字を眺めるなり。 https://t.co/5yIIWqBbVz


![image](https://user-images.githubusercontent.com/13635059/51434876-27417800-1cae-11e9-9b0a-a7c49ec5ac56.png)

---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
初めてのVulkanプログラミング step3 クロスプラットフォーム化


[目次に戻る](https://qiita.com/tositada_nakada/items/db0f01c1c8c2945f786b)

ソースコードは以下の場所に置いておきます。各自のバージョンに合わせたプロパティ設定をしてから自由にご利用ください。
[github:  VulknAppAdocal2018](https://github.com/nakadasanda/vulkanAppaddcal2018)

#クロスプラットフォーム化

[クロスプラットフォーム化とは- IT用語辞典](http://e-words.jp/w/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0.html)

>####クロスプラットフォーム
あるコンピュータプログラム（ソフトウェア）を、複数の異なる仕様の機種やOSで同じように動作させられること。また、入出力装置などコンピュータの周辺機器を、複数の異なる機種に繋いで使用できること。

もっとわかりやすくまとめると一つのプログラムを作ったら、そのプログラムをAndroid,windows,Mac...etcと様々な環境でも使えるようにすることです。


クロスプラットフォームは、vulkanに限らずどんなプログラムでも活用できるものすごく重要なことです。

##条件付きコンパイル
条件付きコンパイルを使うことによってコンパイル時にプラットフォームに応じて異なったソースコードを使うことができます。
もしOSがWindowsならば*A*という処理をコンパイル、もしOSがMacならば*b*の処理をコンパイルといった、感じにコンパイルするプログラムを変えることができます。
このソースコードを新しくplatform.hに作成していきます。

```cpp
#if defined(_WIN32)
//windowsで動くプログラム ...linuxで動かない

#elif defined (__linux)
// linuxで動くプログラム ...windowsで動かない

#endif
//終了
```


##Windowクラスの作成
どのOSでもWindowを生成して使える環境を作るために、抽象クラスWindowを作成します。

##Windowの作成
抽象化クラスWindowを継承し、新しくWindowを作るプログラムを作ります。
自分のプログラムでは、前回のGLFWサンプルを少し改良した、Window_GLFWです。


gitHubには、前回のGLEWサンプルと、プラットフォーム化が終了したバージョンが(2019/1/19)現在あげていますのでよかったら活用してください。

##最後に

自分のvulkanプログラムは、一応マルチプラットフォームに対応させて作っていきますので、多くの人の参考になればいいと思います。
each,map,selectなど配列の繰り返し処理について

配列の繰り返し処理についてメソッドごとの違いを調べたので備忘録としてメモ。

# each
配列の要素数だけブロックを繰り返し実行する。戻り値はレシーバー自身を返す。

```ruby
[1, 2, 3, 4].each { |i| puts i }
#1
#2
#3
#4
#=>[1, 2, 3, 4]
```
こうも書ける

```ruby
[1, 2, 3, 4].each(&method(:puts))
#上と同じ
```
また、配列の最後から処理するreverse_eachもある。

```ruby
[1, 2, 3, 4].reverse_each(&method(:puts))
#4
#3
#2
#1
#=>[1, 2, 3, 4]
```

# each_with_index
ブロックに要素とインデックスを渡し、繰り返し実行する。返り値はレシーバー自身を返す。

```ruby
["野球", "サッカー", "テニス"].each_with_index do |sport, i|
  puts "#{i}番目のスポーツは#{sport}です。"
end
#０番目のスポーツは野球です。
#１番目のスポーツはサッカーです。
#２番目のスポーツはテニスです。
# =>["野球", "サッカー", "テニス"]
```
なお、指定した数字からインデックスを始めたい場合each.with_index()を使う。

```ruby
["野球", "サッカー", "テニス"].each.with_index(1) do |sport, i|
  puts "#{i}番目のスポーツは#{sport}です。"
end
#1番目のスポーツは野球です。
#2番目のスポーツはサッカーです。
#3番目のスポーツはテニスです。
# =>["野球", "サッカー", "テニス"]
```
# cycle
配列の要素をブロックで繰り返し実行し、その繰り返し回数を引数で指定する。

```ruby
[1, 2, 3, 4].cycle(2) { |i| puts i }
#1
#2
#3
#4
#1
#2
#3
#4
#=>[1, 2, 3, 4]
```
# map
配列の要素数だけブロックを繰り返し実行し、ブロックの戻り値の配列を返す。

```ruby
["a", "b", "c", "d"].map { |s| s.upcase }
# => ["A", "B, "C", "D"]
```
こうも書ける

```ruby
["a", "b", "c", "d"].map(&:upcase)
#　上と同じ
```

# select
配列の要素を条件で繰り返し、返り値が真を返した要素を集めて新しい配列にして返す。

```ruby
[1, 2, 3, 4, 5, 6].select { |num| num % 2 == 0 }
#=> [2, 4, 6]
```

# reject
逆に偽を返した要素を集めるのはreject

```ruby
[1, 2, 3, 4, 5, 6].reject { |num| num % 2 == 0 }
#=> [1, 3, 5]
```

#参考

[class Array (Ruby 2.6.0)](https://docs.ruby-lang.org/ja/2.6.0/class/Array.html)
[\[初心者向け\] RubyやRailsでリファクタリングに使えそうなイディオムとか便利メソッドとか - Qiita](https://qiita.com/jnchito/items/dedb3b889ab226933ccf)
MySQLのコマンド

## コマンド

### 起動

```
mysql -u root -p
```

### 指定

```
mysql -u dbuser -p blog_app
```

### データベース作成

```
create database cakephp_blog;
```

### データベース一覧

```
show databases;
```

### データベース選択

```
use blog_app;
```

### データベース削除

```
drop database blog_app;
```

### 開く

```
show tables;
```

### テーブル列表示

```
desc users
```

### テーブル列追加

```
alter table users add full_name varchar(255) after name;
```

### テーブル列変更

```
alter table users change full_name full_name varchar(100);
```

### テーブル列削除

```
alter table users drop full_name;
```

### 索引追加

```
alter table users add index name (name);
```

### 索引削除

```
alter table users drop index name;
```

### テーブル名変更

```
alter table users rename blog_users;
```

### 削除

```
drop table users;
```

### 全データ表示

```
select * from users;
```

### 抽出

```
select * from users where email like '%.ne.jp’; 
```

### 1つ抽出

```
select * from users limit 1;
```

### 並び替え

```
select * from users order by name desc;
```

### カウント取得

```
select count(*) from users;
```

### 特定列抽出

```
select distinct email from users;
```

### 合計

```
select sum(score) from users;
```

### ランダム表示

```
select rand();
```

### 長さ取得

```
select email,length(email) from users;
```

### 2つ表示

```
select concat(name,'(',email,')') from users;
```

### 2つ表示タイトル付け

```
select concat(name,'(',email,')') as label from users;
```

### 特定の数だけ表示

```
select name,substring(name,1,1) from users;
```

### 日付

```
select now();
```

### 作成した日付

```
select name,month(created) from users;
```

### 更新

```
upadate users set email = 'hoge@docomo.ne.jp' where id = 5;
```

### 削除

```
delete from users where score <= 3.0;
```

### バックアップ

```
mysqldump -u dbuser -p blog_app > blog_app.dump.sql
```

### データ復元

```
mysql -u dbuser -p blog_app < blog_app.dump.sql
```


## 初期設定の手順

```
mysql -u root -p
create database cakephp_blog;

// データベースのid,pwd設定
// grant all on データベース名.* to ユーザー名@localhost identified by '設定したいパスワード';
grant all on blog_app.* to hoge@localhost identified by 'password’; 

例)
create table users (
     id int not null auto_increment primary key,
     name varchar(255),
     email varchar(255) unique,
     password char(32),
     score double,
     sex enum('male', 'female') default 'male',
     memo text,
     created datetime,
     key score (score)
);

create table users (
     id int(11) not null auto_increment primary key,
     name varchar(50),
     email varchar(255),
     password varchar(16)
);

// テーブルにデータ挿入(複数)
insert into users (name,email,password) values
     ('yamada','yamada@gmail.com','taro'),
     ('sato','sato@gmail.com','jiro');

// テーブルにカラム追加
alter table テーブル名 add カラム名 型
alter table posts add name varchar(255);
```
ksnctf 32 Simple Auth 50pt

#問題

https://ksnctf.sweetduet.info/problem/32

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/e2895e99-e016-46c7-7971-9ec67153e113.png)

#解いてみた

前回の問題31と同じくソースを見て脆弱な部分を見つけてflagを得る問題。
https://qiita.com/CTFman/items/b8408239f1782920b46e

ソースを見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/f2557535-efaf-27d6-711c-0dfb93d3c60e.png)

flagを入力するとflagが表示されるようです。
flagは入力できないので、このif文に何かヒントがありそうです。

strcasecmpについて調べてみます。
仕様についてはこちらで。
[strcasecmp - PHP](http://php.net/manual/ja/function.strcasecmp.php)

脆弱性とかそういうキーワードで調べると、引数のStringの型チェックが厳密に行われていないらしく、配列を渡すと返り値で0がくるらしい。

nameに[]をつけると配列をPOSTすることができるので、ChromeのF12でソースを編集してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/bcfb35e2-bd5b-86e5-1225-843212ebf6a3.png)

そして送信ボタンを押す。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/258f89ec-483d-eb81-42a1-a9d3682c9dd8.png)

できました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/c346c122-88c7-2a95-fe11-a3671f2a3caa.png)
DockerをHomebrewでMac OSに導入する方法


#はじめに
何番煎じだ的な感じですが、DockerをHomebrewを使ってMac OSに導入した時の手順を、備忘がてら簡単にまとめてみました。

#環境
- `Mac OS Mojave Version 10.14`
- `Homebrew`
- `Homebrew Cask` 

Homebrewの拡張である Homebrew Cask を使うと、Mac OSアプリをターミナルから簡単に素早くインストールすることができます。

Mac OSアプリをインストールするために、「dmg.ファイルをダブルクリックして、アプリのアイコンを Applications フォルダーにドラッグする」ような操作をする必要がなくなります。

#Dockerとは
Dockerは、コンテナ型仮想化ツールです。

<img src=https://qiita-image-store.s3.amazonaws.com/0/310353/fa69fe1c-6661-48a2-5e94-41493ee0c7d5.png width=70%>

Dockerについての詳細な説明は本記事では割愛しますが、[【図解】Dockerの全体像を理解する -前編-](https://qiita.com/kotaro-dr/items/b1024c7d200a75b992fc)が分かり易かったです。

#手順

###1. Dockerのインストール
まず、ターミナルに以下コマンドを入力します。（少し待つ）

```
$ brew install docker
$ brew cask install docker
```
Docker のバージョンとアプリケーションフォルダのDocker.appが作成されていることが確認できればインストール完了です。

```
$ docker --version
Docker version 18.09.1, build 4c52b90
```

### 2.Docker.appの起動 
このままだと、まだDockerコマンドが利用出来ないので、Docker.appを起動する必要があります。
以下のコマンドを入力します。

```
open /Applications/Docker.app
```
色々とダイアログが表示されるので、メッセージに従って実行を進めて下さい。
最後に以下のような画面が表示され流ので、アカウントを登録してセットアップが完了するのを待ちましょう。

<img src=https://qiita-image-store.s3.amazonaws.com/0/310353/f0d8c9b5-697a-efa1-1bfd-64207dc650d1.png width=40%>

Mac画面の右上（メニューバー）に Dockerのアイコンが表示されたら、完了です。
<img src=https://qiita-image-store.s3.amazonaws.com/0/310353/84b3514a-ae07-2b13-e739-c3e34882a0f6.png width=40%>


#参考
- [How to Install Docker on macOS using Homebrew](https://www.code2bits.com/how-to-install-docker-on-macos-using-homebrew/)
「いや、これはもう改修じゃなくて一から作り直しましょう」と思ったときに読み返したい記事

[「いや、これはもう改修じゃなくて一から作り直しましょう」「は？」 - Qiita](https://qiita.com/sisi_maExtend/items/c79e743ae03a52acc939)

気持ちはよく分かります。

**書き直しを初める前にこちらの記事を読んでください**。

[Joel on Software - Rub a dub dub](http://local.joelonsoftware.com/wiki/Rub_a_dub_dub)


# どんどこどん大作戦

 ・
 ・
 ・

読みましたか？・・・読んでない？ぜひ[読んでください](http://local.joelonsoftware.com/wiki/Rub_a_dub_dub)。

 ・
 ・
 ・

さて、おそらく真っ当なプログラマーなら**できるものなら一から作り直したい**と思った経験があるはずです。

しかし、作り直しには以下のようなリスクがあります。

- いつ作業が完了するかわからない or 思ったより時間がかかる
- 作り直しの間はリリースができない（機会損失が発生する）
- 作り直しの結果、現行版の仕様とずれてしまうかもしれない
- 現行版で犯した失敗を繰り返したりしてしまうかもしれない
- そもそも完成しないかも

だから、多くの場合漸進的な改善の方が良いというのが記事の主張です。

# 作り直しても、再発する恐れ

さて、以下は私の意見ですが・・・

そもそも、**なぜ目の前にスパゲッティコードがあるのでしょうか？**

プログラマーに十分な教育がなされ、適切なコードレビューが行われていれば、スパゲッティコードは発生しなかったはずです。

もし、こういった背景が改善されなければ、一から作り直したとしても、いずれは・・・
C# 構造体をbyte配列にする

#概要
C#で構造体をbyte配列にするサンプル。

#環境
Visual Studio Community 2017

#サンプル
Visual C#のコンソールアプリを作成。

```c#
using System;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;

namespace ConsoleApp1
{
    [StructLayout(LayoutKind.Sequential, Pack=2)]
    class MyStruct
    {
        public byte a = 0x42;
        public uint b;
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyStruct ms = new MyStruct();
            ms.b = 0xCAFEBABE;

            using (FileStream stream = new FileStream(@"c:\tmp\struct1.bin", FileMode.Create))
            {
                int size = Marshal.SizeOf(ms);
                byte[] bytes = new byte[size];
                GCHandle gch = GCHandle.Alloc(bytes, GCHandleType.Pinned);
                Marshal.StructureToPtr(ms, gch.AddrOfPinnedObject(), false);
                gch.Free();
                stream.Write(bytes, 0, bytes.Length);
                // 42 00 BE BA FE CA
            }

            using (FileStream stream = new FileStream(@"c:\tmp\struct2.bin", FileMode.Create))
            {
                int size = Marshal.SizeOf(ms);
                IntPtr ptr = Marshal.AllocHGlobal(size);
                Marshal.StructureToPtr(ms, ptr, false);
                byte[] bytes = new byte[size];
                Marshal.Copy(ptr, bytes, 0, size);
                stream.Write(bytes, 0, bytes.Length);
                // 42 00 BE BA FE CA
            }

            using (FileStream stream = new FileStream(@"c:\tmp\struct3.bin", FileMode.Create))
            {
                FieldInfo[] infos = typeof(MyStruct).GetFields();
                foreach (FieldInfo info in infos)
                {
                    byte[] bytes = BitConverter.GetBytes(Convert.ToUInt32(info.GetValue(ms)));
                    stream.Write(bytes, 0, Marshal.SizeOf(info.FieldType));
                }
                // 42 BE BA FE CA
            }
        }
    }
}
```
演算子オーバーロードの糖衣構文的な解釈とフレンド関数による解決

プログラミング言語 C++ における演算子オーバーロードの糖衣構文的な解釈と、フレンド関数による解決

# 演算子オーバーロードの糖衣構文的な解釈

```c++
#include <iostream>
using namespace std;
 
class coord {
	int x, y;
public:
	coord() : x(0), y(0) {}
	coord(int i, int j) : x(i), y(j) {}
	void show() { cout << "x = " << x << ", y = " << y << endl; }
	coord operator+(coord position);
	coord add(coord position);
};
 
coord coord::operator+(coord position)
{
	coord temp;
 
	temp.x = this->x + position.x;
	temp.y = this->y + position.y;
 
	return temp;
}
 
coord coord::add(coord position)
{
	coord temp;
 
	temp.x = this->x + position.x;
	temp.y = this->y + position.y;
 
	return temp;
}
 
int main()
{
	coord position_a(10, 10), position_b(5, 3);
 
	coord position_m = position_a + position_b;
	position_m.show();		// => x = 15, y = 13
 
	coord position_n = position_a.add(position_b);
	position_n.show();		// => x = 15, y = 13
 
	return 0;
}
```
※ 説明をシンプルにするために参照渡しやconst修飾は省略しています。

上記のコードにおいて、 +演算子のオーバーロード

```c++
position_a + position_b
```

は

```c++
position_a.operator+(position_b)
```

の糖衣構文（シュガーシンタックス）です。

メンバー関数名 &quot;operator+&quot; を &quot;add&quot; と意訳すれば、下記のように書き換えることができます。

```c++
position_a.add(position_b)
```
さらに下記のような演算子オーバーロードも考えることができます。

```c++
position + 10
```

```c++
position.add(10)
```

しかし、下記のような演算子のオーバーロードは『メンバー関数』として定義することはできません。

```c++
10 + position
```

```c++
10.add(position)
```

# フレンド関数の演算子オーバーロード

そこで下記のようにフレンド関数の演算子オーバーロードをつかえば二項演算子の交換法則を正しく実装することができます。フレンド関数を使う目的はprivateなメンバー変数にアクセスすることにあります。もしメンバー変数がpublicであれば、必ずしもフレンド関数である必要性はありません。メンバー変数にアクセスできる非メンバーの関数でありさえすれば交換法則を実現することができます。

```c++
#include <iostream>
using namespace std;
 
class coord {
	int x, y;
public:
	coord() : x(0), y(0) {}
	coord(int i, int j) : x(i), y(j) {}
	void show() { cout << "x = " << x << ", y = " << y << endl; }
	friend coord operator+(const coord& pos, const int& dist);
	friend coord operator+(const int& dist, const coord& pos);
};
 
coord operator+(const coord& pos, const int& dist)
{
	coord temp;
 
	temp.x = pos.x + dist;
	temp.y = pos.y + dist;
 
	return temp;
}
 
coord operator+(const int& dist, const coord& pos)
{
	coord temp;
 
	temp.x = pos.x + dist;
	temp.y = pos.y + dist;
 
	return temp;
}
 
int main()
{
	coord position(5, 3);
 
	coord position_m = position + 5;
	position_m.show();		// => x = 10, y = 8
 
	coord position_n = 5 + position ;
	position_n.show();		// => x = 10, y = 8
 
	return 0;
}
```