OmniAICreator/Qiita-1.07M huggingface dataset:
SkyWay IoT SDK + ラズパイでカスタム遠隔監視カメラを作ってみる


**本記事は、SkyWay IoT SDKがv0.1.0にあがったのに伴い古いものになりました。続編記事、 "[続・SkyWay IoT SDKでのカスタム遠隔監視カメラ](https://qiita.com/komasshu/items/f8f3497ca4ee139437a1)" を参照ください。**


# これは何？

[SkyWay IoT SDK](https://github.com/nttcom/skyway-iot-sdk) [^1] とラズパイを使って、カスタムメイドな遠隔監視カメラを作ってみる

# 構成

全体構成はざっくりこんな感じ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/83466/fd23677b-e558-49c2-b69b-1ac7f7d5d032.png)

* gstreamer
    * USBカメラの映像からRTP/H.264の映像ストリームを生成する
* Janus-gateway
    * RTP/H.264の映像ストリームなんかをWebRTCに変換して、ブラウザへ送信する
* SkyWay
    * Janus-gatewayとブラウザ間のWebRTCのつなぎこみ（シグナリング）を行なう
* Browser
    * 監視カメラのWebアプリを動かす

# APIKEYの取得

まず、SkyWayのAPIKEYを https://console-webrtc-free.ecl.ntt.com/users/login から取得する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/83466/c122f678-e7a8-33b4-d368-e111fef0b50c.png)

**Application Settings** の **Available Settings** で、

* localhost
* nttcom.github.io

を登録する（Permissionsのチェックは全てはずしてOK）

# SDK インストール

Raspbian jessieを推奨（stretchは、apt-getで入る gstreamer が現状イマイチなので）。Jessieのイメージは[ここ](https://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2017-07-05/)からゲットできる。

以下のコマンドでインストールする

```bash
$ curl https://nttcom.github.io/skyway-iot-sdk/install_scripts/debian_based/installer.sh > installer.sh; sudo -E bash - installer.sh
#（最初にAPIKEYを聞かれるので、上の手順で取得したAPIKEYを入力する）
...

$ rm installer.sh; chown -R ${USER}:${USER} skyway-iot
```

# 各種プロセス起動

## SDKのプロセスを起動する

* Janus (映像ストリームをWebRTCに変換）

```bash
$ /opt/janus/bin/janus
```

* SkyWay Signaling Gateway (JanusとSkyWayのつなぎこみ）

```bash
node skyway-signaling-gateway/app
```

* sample app（ラズパイ側のサンプルアプリ）

```
node skyway-siru-device/examples/metrics
```

## gstreamerを起動する

USBカメラの映像からRTP/H.264ストリームを生成[^2]

```bash
gst-launch-1.0 v4l2src device=/dev/video0 ! \
  video/x-raw,width=640,height=480,framerate=30/1 ! \
  videoscale ! videorate ! videoconvert ! timeoverlay ! \
  omxh264enc target-bitrate=2000000 control-rate=variable ! \
  h264parse ! rtph264pay config-interval=1 pt=96 ! \
    udpsink host=127.0.0.1 port=5004
```

# 監視カメラのWebアプリで見てみる

https://nttcom.github.io/skyway-siru-sample/dist/
（最初にAPIKEYが聞かれるので、上述のAPIKEYを入力する。room nameはデフォルトの ``testroom`` のままにする）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/83466/a129a962-b7ce-f371-30fd-847843f06c46.png)

カメラ映像が見れる。あと、ラズパイのCPUや温度などのリアルタイムデータも表示される。

Janusだけ＆ラズパイがNAT配下にあると、VPNでも貼らない限りインターネット経由でみれないが、このSDKを使うと可能なのが嬉しいところ。あと、CPU情報なんかも、DataChannelで取得するようになっていて All WebRTC な世界を満喫できる。



[^1]: ブラウザを使わずに Linux でヘッドレス動作する [SkyWay の SDK](https://webrtc.ecl.ntt.com/)（βバージョン）。WebRTCスタックとして [Janus gateway](https://github.com/meetecho/janus-gateway)を利用している。
[^2]: Janusでは、これを受信して、WebRTCに変換 => ブラウザに送信
Mathematicaのコードが10倍速くなる機能 (Mathematica8以降)

https://www.330k.info/essay/how-to-optimize-mathematica-programs/
にも記載されているがCompileのオプション　**CompilationTarget -> "C"** を使うといい。コードが10倍も速くなった！！

例

```
DoubleCircles = Compile[{{d, _Real}, {th _Real}, {r, _Real}},
   Table[
    If[
     ((i - 1000. - d Cos[th])^2 + (j - 1000. + 
           d Sin[th])^2 < 
        r^2) || ((i - 1000. + d Cos[th])^2 + (j - 1000. - 
           d Sin[th])^2 < r^2), 1., 0.
     ], {i, 2000}, {j, 2000}],
 CompilationTarget -> "C", 
 RuntimeOptions -> "Speed"
];
DoubleCircles2 = Compile[{{d, _Real}, {th, _Real}, {r, _Real}},
   Table[
    If[
     ((i - 1000. - d Cos[th])^2 + (j - 1000. + 
           d Sin[th])^2 < 
        r^2) || ((i - 1000. + d Cos[th])^2 + (j - 1000. - 
           d Sin[th])^2 < r^2), 1., 0.
     ], {i, 2000}, {j, 2000}],
 RuntimeOptions -> "Speed"
];
ArrayPlot[DoubleCircles[500, -45 Degree, 100]] // AbsoluteTiming
ArrayPlot[DoubleCircles2[500, -45 Degree, 100]] // AbsoluteTiming
```
<img width="564" alt="CompilationTargetC.png" src="https://qiita-image-store.s3.amazonaws.com/0/178902/d6fdbc69-0321-ff7e-2d7a-39aff2e4854d.png">
Webページに仮想通貨（BTC）の現在価格をBitflyerのAPIを利用して表示する

#WebページにAPIを利用 
HTMLとCSSと少ーしPHPがわかる状態で初めてのAPIだったので、同じような境遇に再びなったときの自分の忘備録として残します。

*※ちなみにWordPressを使っているサイトなのでPHPが使える環境です！*

あくまでも自分用なので、色々わかりづらいところもあると思います。
読むのめんどくせ〜って人は下をコピペして使ってください。

```php:sample
<?php　
$base_url = 'https://bitflyer.jp';
$responce = file_get_contents($base_url.'/api/echo/price');
$array = json_decode($responce,true);

 echo("<h3>販売価格</h3><p class='p-ask'>".$array["ask"]."</p>");
 echo("<h3>買取価格</h3><p class='p-bid'>".$array["bid"]."</p>");
 echo("<h3>中間値</3h><p class='p-mid'>".$array["mid"]."</p>")
?>
```
### そもそもAPIが何かわからなかった
ハッカソンとかに出たり、エンジニアの人と一緒にいたりすると**「API叩けば良くね？」**みたいなワードが出て来ました。
初めての時は**「叩くって何！？」**ってなるんですけど、私的解釈でいうと
**情報や機能をリンクで呼び起こして、自分のサイトやプロダクトで表示・利用する**ということでした。

また、初めてのときに立ちはだかった壁は、WebデザイナーでHTMLとCSSがわかりますよ〜ってレベルだと、呼び出しても次の処理がわからない。といった点でした。

##こっから手順の話
さて本題。とりあえず思いつく順で説明して行きましょう。
まずは、BitflyerさんのAPI一覧のページにアクセスして、どういったことができるのかというのを確認しましょう。[▶︎こちらからどぞ](https://bitflyer.jp/Corporate/Echo/Api?lang=ja)

###今回は「レート取得」を'叩き'ます。

サイトを見て、**認証・リクエスト・レスポンス…何これ？**となりましたが、今ならなんとなくわかる。まずはそれぞれの役割を見て行きますか。

####:robot: 認証
```
なし
```
おそらく、アクセスするための許可証のようなものでしょう。今回はないですね。
####:robot: リクエスト
```
GET /api/echo/price
```
呼び出す情報を特定するカテゴリー指定の呪文。

```php:箇所
$responce = file_get_contents($base_url.'/api/echo/price');
```

上記のように`file_get_contents`で「お前の()内のところからこのデータを引っ張ってきますね」という記述になります。

####:robot: レスポンス
```
{
    "mid" : 41022,
    "ask" : 41812,
    "bid" : 40233
}
```
呼び出す情報（召喚獣）の表示場所のターゲットとなる、魔法陣。
なお、魔法陣と召喚獣の対応表は以下とのこと。

>mid： int型 必須 仲値
ask： int型 必須 bitFlyerの1BTC販売価格
bid： int型 必須 bitFlyerの1BTC買取価格

前後しますが、次は「**API共通事項**」という箇所を確認して見ましょう。
####:robot: エンドポイントURL

>エンドポイントURL https://bitflyer.jp/

エンドポイントってのはAPIを呼び出すときにどのサイトから呼び出しますよ〜ってな感じのものでした。

```php:箇所
$base_url = 'https://bitflyer.jp';
```
コードって何書いたか忘れることが多いので、エンドポイントは名前つけて別枠にしました。

####:robot: 文字列の形式指定
>APIのレスポンスデータは、特に断りのない場合を除き、 JSON（※1）形式の文字列とします。

**JSON**…どうしようわからん…
となりましたが、PHPに変換して利用しました。
変換方法は[リファレンス](http://php.net/manual/ja/langref.php)にて調べるとわかりますが、それも見つけるまで大変だったよ。

### JSONのままではWebページにはレート表示されません！表示できる形に変換する必要があった

なんかこれをデコードやらエンコードやらいうらしいですが、んなもん知らないよ〜ってなったのでここも苦労しました。Google先生ありがたや。

`json_decode`というのを利用して、取得した内容をPHPの形式に変換しました。

```php:箇所
$array = json_decode($responce,true);
```
んで、変換した後は`echo（）`にて`$array[]`で、[]内にレスポンスで表示したい値の名前を入れれば表示されます。

```php:箇所
echo("<h3>販売価格</h3><p class='p-ask'>".$array["ask"]."</p>");
echo("<h3>買取価格</h3><p class='p-bid'>".$array["bid"]."</p>"）;
echo("<h3>中間値</3h><p class='p-mid'>".$array["mid"]."</p>")
```
##まとめ

いや〜思いつくままに書いたんで、わかりづらさMAXですネ。
とりあえず、APIを叩く、という作業工程を残せたんで、これで良しとします。

ポイントとしては

* どこから取得するかを確認
* なんの文字列形式で返ってくるか確認

ですね。以上。
Macに複数バージョンのUnityをインストールする

:::note alert
追記：2018年に「Unity Hub」というUnity公式の管理ツールがリリースされています。本記事はUnity Hubリリース以前の手法となりますので、特に理由がなければUnity Hubをお使いください。
https://unity.com/ja/unity-hub
:::

# 複数バージョンのUnityを共存させる
バージョンアップ検証等で複数バージョンのUnityをインストールすることが度々あったので、やり方をメモしておきます。タイトルは「Macに」としましたが、Windowsでも手順は同じです。

# 手順
## 1.既存のUnityフォルダをリネーム
既存バージョンの「Unity」フォルダをコピーしてリネームします。バージョンを振っておくとわかりやすいです。
`例）「Unity」→「Unity 5.4.3f1」`

## 2.対象バージョンのUnityインストーラをダウンロード
インストール対象のUnityをダウンロードします。

最新バージョンもしくはベータ版であれば以下ページから
https://unity3d.com/jp/get-unity/download
過去バージョンのUnityが必要であれば以下ページからインストーラをダウンロードします。
https://unity3d.com/jp/get-unity/download/archive

## 3.インストール
インストーラを起動して「Unity」フォルダを上書きします。
ウィザードに従って通常通りインストールすればOKです。

## 4.プロジェクトを開く
新しいバージョンのUnityでプロジェクトを開きます。

古いバージョンで作ったプロジェクトを新しいバージョンのUnityで開くと、[自動APIアップデーター](https://docs.unity3d.com/ja/current/Manual/APIUpdater.html)を実行するかどうか聞かれます。
![スクリーンショット 2017-10-24 15.15.39.png](https://qiita-image-store.s3.amazonaws.com/0/6380/03ad8ad9-2b08-8759-9c09-d7338c8a86b1.png)

バージョンアップで変更の入ったメソッドが自動置換されるので、基本的には実行する方針で良いでしょう。

## 5.コンパイルエラー等の対応
バージョンアップ後に出たコンパイルエラーや各種プラグイン等でifdefでバージョン分岐入ってるものなどは手動で調整が必要です。エラー箇所の対応や全体の動作確認を行なっていきましょう。

Unityではプロジェクトの下位互換性が無いため、新しいバージョンで読み込んだプロジェクトを保存すると、古いバージョンではそのプロジェクトが開けなくなる点に注意です。

gitでブランチ切ればバージョン毎にプロジェクトを切り替えることは可能なので、バージョンアップ時は検証用ブランチで対応を行なっていくのが良いかと思います。
Armadillo IoT G3 でscreenを実行すると平仮名が文字化けする


あんまりちゃんと調べてないけどとりあえず`-U`つけたら文字化けしなくなった。

```shell-session
screen -U
```


ちなみにアットマークテクノユーザーズサイトにどこで文字化けしてるのか調査する方法が詳しく書かれていた。（こちらはbusyboxの模様。busyboxは本当につらい）
https://users.atmark-techno.com/node/2197
Javascriptオブジェクト指向でのthisの扱い自分メモ

#thisが場所により指しているものが違う

※Jqueryを使ってソースを記述しています。

javascriptでprototypeを使った擬似的なクラス化ができますが、
場所によってthisの指すものが違ってめんどくさい。メンバ関数をサクッと呼べないのはなぁ……。
そこである程度統一できる記述方法をメモ。
クラス化は調べて日が浅いのでこれ以外にいい方法があれば教えてください。
bind等は検討中...

#目標
thisはクラス自身を指すようにしたい。
やり方がわからなかった部分は変数 _self にクラス自身をセット。
原始的だけど一番お手軽だと思う。

#方法

```js:class.js
(function(){

  /**
   * コンストラクタ
   **/
  function Class()
  {
    //コールバック用
    var _self = this;

    //メンバ変数
    this.val = 0;

    //Eventの登録
    $(document).on('click','.onClick',function(){
      _self.onClickEvent(this); //コールバック内で_selfからメンバ関数を呼ぶとthisがクラスになる。
    });

    this.serviceFunction($('#container')); //呼び出せるのでOK
  }

  /*
   * onClickイベント
   */
  Class.prototype.onClickEvent = function(e)
  {
    //eはEventのトリガーとなった要素
    $div = $(e).find('#container');
    //thisはクラスを指している。
    this.serviceFunction($div);  //ちゃんと呼び出せる
  }

  /*
   * メンバ関数から呼ばれる
   */
  Class.prototype.serviceFunction = function($container)
  {
    alert(this.var); // var = 0 でOK
    alert(this._self); // _self = undefined となるのでOK
  }

  window.Class = Class;
}(window));

var Class = new Class();
```

これでとりあえず一通りthis使いそうなところはあまり考えずに使えてよさそう。
メンバ関数のコールバック内とかは _self になっちゃいそうだけどthisに置き換えられないかな……。
せめてコンストラクタ内だけに留めたい。
個人的にちょっとコールバックの事を理解してなかったのであぁそうかとなったのは、

```js
$(document).on('click','.onClick',onClickEvent);

Class.prototype.onClickEvent = function()
{
  //ここのthisはトリガーの要素になる。
}
```
となるのに対して、

```js
$(document).on('click','.onClick',function(){
  _self.onCLickEvent();
});

Class.prototype.onClickEvent = function()
{
  //ここのthisはクラスになる。
}
```
ってところかなぁ。
_selfから実行してるからそりゃそうかぁってなるんだけど勉強になった。
もう少し理解を深められるように頑張ろうと思うのでしたまる。
Emacs で JavaScript コーディングを快適に

# 紹介

皆さんご存知 [ESLint](https://eslint.org/) には**自動修正機能**（[`--fix`](https://eslint.org/docs/user-guide/command-line-interface#--fix) CLIオプション）がありますが、今回この機能を Emacs で自動的に走らせるための `js-auto-format-mode` という Emacs Lisp パッケージ作りました。

- GitHub: https://github.com/ybiquitous/js-auto-format-mode
- MELPA: https://melpa.org/#/js-auto-format-mode

![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/104952/d634fa1e-8bd4-c6f0-3fdc-637c56e2d3dd.gif)

# インストール

## ESLint

Node.js と ESLint をインストールしてください。後述するように、他のフォーマッターを使うのであれば ESLint のインストールは不要です。

```
npm install --global eslint
```

`~/.eslintrc` ファイルを作成してください。

```json:~/.eslintrc
{
  "extends": "eslint:recommended"
}
```

ESLint を任意のプロジェクトディレクトリでのみ使用する場合は、上記のグローバルインストール＆設定は不要です。
また、必要に応じて `~/.eslintrc` の内容は書き換えてください。

ESLint 設定の詳細は[公式サイト](https://eslint.org/)をご覧ください。

## Emacs

[MELPA](https://melpa.org/) からインストールしてください。

<kbd>M-x package-install RET js-auto-format-mode RET</kbd>

# 使い方

デフォルトで有効にする場合は、以下のようにするとよいでしょう。

```el
(add-hook 'js-mode-hook #'js-auto-format-mode)
```

グローバルインストールした ESLint ではなく、プロジェクトローカルな ESLint を使いたい場合(多くのケースがそうでしょう)、一緒に [`add-node-modules-path`](https://github.com/codesuki/add-node-modules-path) パッケージもインストールしておくと幸せになります。

```el
(add-hook 'js-mode-hook #'js-auto-format-mode)
(add-hook 'js-mode-hook #'add-node-modules-path)
```

任意のタイミングで実行したい場合は、`js-auto-format-execute` 関数を実行してください。

<kbd>M-x js-auto-format-execute</kbd>

## 他のフォーマッターを使う

デフォルトのフォーマッターは ESLint ですが、他のフォーマッターを使いたい場合はカスタマイズが可能です。

例えば、[Prettier](https://prettier.io/) を使う場合は以下のようになるでしょう。

```el
(custom-set-variables
  '(js-auto-format-command "prettier")
  '(js-auto-format-command-args "--write --single-quote --no-semi"))
```

カスタマイズについての詳細は、次のコマンドを実行してください。

<kbd>M-x customize-group RET js-auto-format RET</kbd>

# 最後に

以上、`js-auto-format-mode` パッケージの紹介でした。フィードバックやプルリクエストをいただけると大変ありがたいです :hugging:
sublimeプラグイン

sublimeおすすめされてプラグインいろいろ入れてみたので自分用メモ

# プラグイン
## All Autocomplete
補完機能を強化。
これ入れてない状態で使ったことないからどんなもんかわかんないけどみんな入れてるからきっといいやつ。
## AutoFileName
ファイルのパスを自動入力。
楽。
## BoundKeys
キーバインド一覧表示。
## BracketHighlighter
始まり終わりタグ強調。
## Color Highlighter
cssで色指定したコードの背景色をつけてくれる。
## ColorPicker
カラーコード入力に便利。
## ConvertToUTF8
文字コードをUTF8に変換してくれる。
## DataConverter
よくわかんないけど入ってた。使ったことない。
## DocBlockr
コメント補完。
## Emmet
Emmetつかえる。
## Git
Gitつかえる。
## GitGutter
どこ変更したのかわかりやすくしてくれる。
便利。
## Goto-CSS-Declaration
HTMLからCSSに飛べる。
すごく便利。
## HTML Snippets
スニペット。
## HTML5
HTML5。
## JavaScript Snippets
スニペット。
## jQuery
ｊQueryの補完。
## OmniMarkupPreviewer
コントロール＋オルト＋Oでマークダウンプレビュー。
## Origami
画面分けれる。
## Search Stack Overflow
Stack Overflowで検索。
## SideBarEnhancements
サイドバー拡張。
## SublimeCodeIntel
定義元ジャンプ。
## SublimeLinter
文法チェック。
## SublimeLinter-html-tidy
HTML文法チェック。
## SublimeLinter-jshint
JavaScript文法チェック。
## SyncedSideBar
開いてるファイルとサイドバー連動。
## Terminal
ターミナル。
## TrailingSpaces
行末の半角スペース削除。
## Vue Syntax Highlight
vueのハイライト。
## Vuejs Snippets
スニペット。

# 最後に
HTML、CSS、JavaScript系でおすすめあったら教えてください！！！！！！！！
DBから重複レコードを除いて取得するSQL文

#課題
以下のSQL文でデータを取得した時に重複したデータが全て取得され結果に格納されてしまいました。

```sql
select user_id from idols where idol = any(select idol from idols where user_id = 1);
```
uses・・ユーザーテーブル
idols・・ユーザーが好きなアイドルを登録するテーブル
以下のSQL文では`user_id = 1`のユーザーと同じアイドルを好きなユーザーを取得しているのですが、好きなアイドルが複数被っている場合同じuser_idが複数取得されてしまいました。

#解決
以下のように`distinct`を入れるだけ。

```sql
select distinct user_id from idols where idol = any(select idol from idols where user_id = 1);
```

以上。

参考
https://www.dbonline.jp/mysql/select/index13.html
DefaultValueAttributeの本当の意義


# はじまり

巷では中々に評判の芳しくない`DefaultValue`アトリビュートの話です。

イマイチその有用性が分かり難いアトリビュートではありますが、つい先日その有難味にどっぷり浸る体験をしてしまいました。

簡単ではありますが、その顛末を纏めてみたいと思います。

# はじめの一歩

`TextBox`のサブクラスを作ろうと思い立ったんですね。
非常に簡単な話だけしてしまうと、常に`MultilinedなTextBox`を作ろうと思った訳です。因みに此処はツッコミどこじゃないですよ。究極に単純化した話ですから。

# サブクラスを作成した

で`TextBoxEx`クラスを以下の様に定義します。

```csharp:TextBoxEx.cs
using System.Windows.Forms;

public class TextBoxEx : TextBox {
	public TextBoxEx() : base() {
		base.Multiline = true;
	}

	public new bool Multiline { get { return base.Multiline; } }
}
```

`Multiline`プロパティには触って欲しくないので、`getter`だけ持った同名のプロパティを`new`で被せます。

で、コンストラクタ中で親クラスの`Mulitiline`プロパティに`true`をセットすれば完成ですね。
ここで一旦ビルドしておきましょう。

# サブクラスを配置したら怒られた

さっきビルドしたのでツールボックスウィンドウに`TextBoxEx`が追加されています。
これをメインプロジェクトの`Form`上に配置します。

![image](https://qiita-image-store.s3.amazonaws.com/0/136132/74ebabd2-704d-7b25-e252-c09f54ec11dc.png)

よしよし。
コードビューに切り替えて…
とか思ったら、エラーが出てしまった。

![image](https://qiita-image-store.s3.amazonaws.com/0/136132/2d4766a5-f046-cdd1-27c8-f67b28d1e839.png)

場所は以下にある`Form2.Designer.cs`の中の32行目。

![image](https://qiita-image-store.s3.amazonaws.com/0/136132/ba43ca66-f4b4-09b3-250f-1cf2e418a755.png)

`setter`が無いのに、`Multiline`プロパティに値を設定しようとしてエラーになっています。
`TextBoxEx`のコンストラクタで`base`の方に設定するから、勝手な事しないでくれよー

# 足掻いてみた

う～～ん、コンストラクタで直接設定しちゃうからいけないのかと思って、以下の方法を試してみました。

1. `private`なメソッドを定義して、`base.Multiline = true;`を移してみた<br/>つまり、表記上コンストラクタから追い出してみた、と云う事
2. `refrection`を使って遠回りな方法で、`Multiline`に初期値を設定してみた

ま、何れもダメでしたけどね。
ここで得た結論は、（当然かも知れませんが）ビューデザイナさんはソースそのものを見て`InitializeComponent`メソッドを作り上げている訳ではないと云う事。

# どうすりゃいいのよ

何か初期値設定を抑制する様な機能はないかなー
って考えたら、やっぱりアトリビュートだよね。

で、改めてアドリビュートを見返しても、それらしいのは見つかりません。
とか言いつつ、この記事の主題から考えれば、答えは`DefaultDataAttribute`であったと云う事は容易に想像がつくでしょう。

実はそうなんですよ。

```csharp:TextBoxEx.cs
using System.ComponentModel;
using System.Windows.Forms;

public class TextBoxEx : TextBox {
	public TextBoxEx() : base() {
		base.Multiline = true;
	}

	[DefaultValue(true)]
	public new bool Multiline { get { return base.Multiline; } }
}
```

ってして、`Form`上の`TextBoxEx`を一旦削除、全体ビルドして`TextBoxEx`を再度配置したところ、`Multiline`アトリビュートへの代入文は生成されませんでした。

めでたしめでたし…

# 〆

じゃなくて、最後の考察を…

逆に`[DefaultValue(true)]`を指定したまま、コンストラクタの`base.Multiline = true;`を消したら、`Designer.cs`内に`this.TextBoxEx1.Multiline = false;`が出てきましたよ。

ここで、一つの結論に至ります。
つまり、ビューデザイナさんはデザイン画面上に展開されたコントロールのプロパティ（コンストラクタは動くんでね）の値を見て、`Designer.cs`内のコントロールのインスタンス化コードを生成しているんじゃないでしょうか？

で、プロパティの設定コードを出すか否かの判定に`DefaultValueAttribute`の値を利用している、んです。
あくまでもデザイナ向けのアトリビュートであって、自分のコードに反映される値ではないよー
と云う事をきちんと押さえておかないといけないんですね。

こう考えると、`DefaultValueAttribute`はとっても大事な役割を持っていました。
<br/>
でも、基本データ型以外は如何にも指定し難いのは何とかならんもんか。
いや、ここら辺もう少しきちんと理解すれば良いのかなぁ…

ヨシ、今度もう少し掘り下げてみよう。（時間ができた時にね）
【備忘録】Unity2017.2でiosビルドするとエラー吐いた問題

#はじめに

この記事には問題の解決するまでの手順はメモされていますが根本的な原因は書かれていません。
なので、同じ問題が起きた人すべてに当てはまるとはいえないので注意してください

#起きたエラー

2017.2にあげて初めてiosビルドした時に起きたエラー

~~~
UnityEditor.BuildPlayerWindow+BuildMethodException: 3 errors
  at UnityEditor.BuildPlayerWindow+DefaultBuildMethods.BuildPlayer (BuildPlayerOptions options) [0x00207] in /Users/builduser/buildslave/unity/build/Editor/Mono/BuildPlayerWindowBuildMethods.cs:172 
  at UnityEditor.BuildPlayerWindow.CallBuildMethods (Boolean askForBuildLocation, BuildOptions defaultBuildOptions) [0x00050] in /Users/builduser/buildslave/unity/build/Editor/Mono/BuildPlayerWindowBuildMethods.cs:83 
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)
~~~

~~~
ArgumentOutOfRangeException: Cannot be negative.
Parameter name: length
System.String.Substring (Int32 startIndex, Int32 length) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System/String.cs:348)
UnityEditor.iOS.PostProcessiPhonePlayer.SetupBuildSettings (PostProcessorSettings postProcessorSettings, BuildPostProcessArgs args) (at /Users/builduser/buildslave/unity/build/PlatformDependent/iPhonePlayer/Extensions/Common/BuildPostProcessor.cs:458)
UnityEditor.iOS.PostProcessiPhonePlayer.PostProcess (PostProcessorSettings postProcessorSettings, BuildPostProcessArgs args) (at /Users/builduser/buildslave/unity/build/PlatformDependent/iPhonePlayer/Extensions/Common/BuildPostProcessor.cs:544)
UnityEditor.iOS.iOSBuildPostprocessor.PostProcess (BuildPostProcessArgs args) (at /Users/builduser/buildslave/unity/build/PlatformDependent/iPhonePlayer/Extensions/Common/ExtensionModule.cs:37)
UnityEditor.PostprocessBuildPlayer.Postprocess (BuildTargetGroup targetGroup, BuildTarget target, System.String installPath, System.String companyName, System.String productName, Int32 width, Int32 height, BuildOptions options, UnityEditor.RuntimeClassRegistry usedClassRegistry, UnityEditor.BuildReporting.BuildReport report) (at /Users/builduser/buildslave/unity/build/Editor/Mono/BuildPipeline/PostprocessBuildPlayer.cs:271)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)
~~~

#これが起こるまでに行っていたこと
ビルドセッティングからスイッチプラットフォーム
player settingからbundleIDを変える
シーンを追加
ビルド

#解決までにやったこと
①あたらしくプロジェクトを作り直す→×
②過去のバージョン（2017.1）をダウンロードしてみる→×
③もう一度過去のバージョンをダウンロード→？
この際、スタンダードアセットをダウンロードし直した
④諦めてandroidでビルドしてみる→⚪︎
この際、きちんとbundleIDをきめた
⑤過去のバージョンのままでiosビルド→⚪︎

#学んだ？こと
初めてアンドロイド実機で動かした
アンドロイド開発する予定はないがアンドロイドスタジオをダウンロードした
私の持っている実機はバージョンが古いのかVRは動かない
bundleIDきちんとつける

#関係ありそうな記事
http://answers.unity3d.com/questions/1378775/i-dont-know-what-this-is-someone-help-me.html
http://answers.unity3d.com/questions/1380921/build-failed-with-errors-at-unityeditorbuildplayer.html


10月28日追記

約1ヶ月前につくったプロジェクトも同じような症状でビルドできなくなりました…
その時は2017.1でビルドができていたのですが、今、2017.1と2017.2では動きません
作業をする前に必ずビルドができるか確認したほうがよさそうです
【Android】Kotlin Android ExtensionsをFragmentで使ったときのNullPointerExceptionエラー対処法

[Kotlin Android Extensions](https://kotlinlang.org/docs/tutorials/android-plugin.html) をFragmentで使ったときにNullPointerExceptionで落ちたのでその対処法メモです。

## 結論
`onViewCreated()`を使う。

## 環境
kotlin 1.1.50

## エラー内容
>
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference

## 原因
`textView`というIDのViewをkotlin-android-extensionsで参照した場合、内部的には`getView().findViewById(R.id.textView)`を実行していて、Fragmentの`onCreateView()`では`getView()`が`null`になるため。

## サンプルコード
レイアウト

```xml:fragment_main.xml
<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
```

ダメな例

```kotlin:BadFragment.kt
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val view = inflater?.inflate(R.layout.fragment_main, container, false)
    textView.text = "foo" // NullPointerException
    return view
}
```
良い例

```kotlin:GoodFragment.kt
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? =
    inflater?.inflate(R.layout.fragment_main, container, false)

override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
    textView.text = "foo" // OK
}
```

## 補足
Activityでは`onCreate()`で使っても大丈夫です。


## 参考
Kotlin Android Extensions - Kotlin Programming Language
https://kotlinlang.org/docs/tutorials/android-plugin.html

Kotlin Android Extensions and Fragments - Stack Overflow
https://stackoverflow.com/questions/34541650/kotlin-android-extensions-and-fragments
Python リストの基本

リストはシーケンス型(データ型)の１つです。
リストを定義するときは角括弧([])を使います。

##■定義
```:構文
[要素0, 要素1, 要素2, 要素3, ・・・・]
``` 

```:例
val = [1990, 1991, 1992]
```

##■取り出し
```:構文
リスト名[要素のインデックス]
```

```:例1
val = [1990, 1991, 1992]
print(val[0])
1990  #結果
```

```:例2
sample = [1990, 1991, 1992]  #代入
print(val[-1]) #リストの最後から1番目
print(val[-2]) #リストの最後から2番目
1992  #結果 val[-1]
1991  #結果 val[-2]
```

##■2次元配列
```:構文
[
[要素0,要素1,要素2, ・・・],
[要素3,要素4,要素5, ・・・]
・・・
]
```

```:例
val = [
[1,3,5,7,9],
[2,4,6,8,10]
]
```

##■2次元配列の取り出し

```:構文
リスト名[要素1][要素2]
```

```:例
val = [
[1,3,5,7,9],
[2,4,6,8,10]
]
print(val[1][4]) 
10 #結果
```

##■結合
　2つのリストを足し算すると結合されます。

```:例
val1 = [1 ,2 ,3, 4, 5]
val2 = [6, 7, 8, 9, 10]
new_val = val1 + val2
print(new_val)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] #結果
```

##■要素の削除
```:構文
del リスト名[要素]
```

```:例
val = [1 ,2 ,3, 4, 5]
del val[2] #要素2を削除
print(val)
[1, 2, 4, 5] #結果
```

##■リストの合計、最大値、最小値
```:構文
sum(リスト名) #合計
max(リスト名) #最大値
min(リスト名) #最小値
```

```:例
val = [1,3,5,7,9]
print(sum(val)) #合計
print(max(val)) #最大値
print(min(val)) #最小値
25 #結果 合計
9  #結果 最大値
1  #結果 最小値
```
vba macroサンプル集 (①セル参照範囲を文字列化　②CSVファイルから指定セルへコピー)



# 目的
2種類のサンプルコードを示す。
*  Worksheet関数で参照セル範囲を文字列化する方法が面倒だったので、ユーザ定義関数を作成した。
*  CSVファイルを読み込み、指定セルへコピーするマクロの雛形を作成した。

# 用途/特長
1. RangeToText Function
  セル参照範囲を文字列化するユーザ定義関数。文字列にシート名を付与するので、別シートを参照する場合にも対応できる。

2. CopyFromCSV Subroutine
  CSVファイルを読み込み、指定したセルに書き出すマクロ。第１引数には相対パス(..\sample.csv　など)を使用できる。



``` vba
Attribute VB_Name = "utils"
Option Explicit


Function RangeToText(rng As Range) As String
    Dim sheetName As String
    sheetName = rng.Parent.Name
    RangeToText = "'" & sheetName & "'!" & rng.Address
End Function

Sub CopyFromCSV(path As String, rng As Range)

Dim absPath As String
Dim lineText As String
Dim splitText As Variant, result As Variant
Dim fp As Integer, i As Integer, j As Integer


absPath = ThisWorkbook.path & "\" & path
fp = FreeFile
result = rng   ' result is One origin.
i = 0
j = 0

Open absPath For Input As fp
Do Until EOF(1)
    i = i + 1
    Line Input #fp, lineText
    splitText = Split(lineText, ",") ' splitText is ZERO origin.
    
    For j = 0 To UBound(splitText)
        result(i, j + 1) = splitText(j)
    Next j
Loop
Close #fp

rng = result
End Sub
Access VBA Accessで必ず使う 今表示されているテーブル、クエリのフィルターを解除する

#データシートで表示されている状態
MicroSoft Access でテーブルやクエリを開いて、フィルターをかけるという経験はあると思います。

[クエリのデータをフィルター処理する](https://support.office.com/ja-jp/article/%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E5%87%A6%E7%90%86%E3%81%99%E3%82%8B-a462c0c9-f92c-4004-8868-f9de61153d18)
[フィルターを適用して選択したレコードを Access データベースに表示する](https://support.office.com/ja-jp/article/%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%82%92%E9%81%A9%E7%94%A8%E3%81%97%E3%81%A6%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%9F%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92-Access-%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B-2a493ded-e544-4144-9103-b9b1d1865147)

>フィルターが有効な場合
>フィルターの適用後に取得したビューには、選択した値を持つレコードのみが表示されるため、残りのデータはフィルターをクリアするまで非表示のままになります。
>*注: 式に連結されたフォームおよびレポート内のデータシートとコントロールの列は、フィルターをサポートしていません。*
>フィルターは簡単に適用したり削除したりできます。Access 2010 では、すべてのビューに一般的なフィルターが組み込まれています。フィルター コマンドを使用できるかどうかは、フィールドの種類と値によって決まります。
>たとえば、特定の月に誕生日を迎える人のレコードを表示するには、[ホーム] タブの [並べ替えとフィルター] で [生年月日] 列をクリックし、[日付フィルター] をクリックして、必要な期間を選択します。

Excelだとオートフィルターが似た機能ですね。
[オートフィルタを使い倒す - Office Tanaka](http://officetanaka.net/excel/vba/tips/tips155.htm)

# Accessのフィルタの欠点

##一度かけたフィルタは解除しないと新しいフィルタにならない
そのままだと絞り込みになります。

##複数の列に欠けたフィルタを一気に解除する方法がない

これらの欠点がAccessを使いにくくしています。

## これらを解決するためにマクロとVBAを使う。

マクロに登録すると、クィックアクセスツールバーに登録できます。
ExcelはALT+F8でマクロの一覧を出せます（もちろんマクロを有効にしてください）
Accessはこの方法がたぶんありません。
しかし、VBAを組み、マクロに登録することによってそれが可能となります。

## かけた条件をメモする
しかしただ解除するだけでは、またかけるとき大変です。
そこで、解除するときに、今かけてあるフィルタのクエリをイミディエイトに書きだします。

## イミディエイトのクエリで一気にフィルタをかけなおすマクロも用意する。

```vbnet
Function Macro_Off_TBlQryFilter()
Call Off_TBlQryFilter
End Function

Sub Off_TBlQryFilter()
' テーブル、クエリにかかっているフィルタを解除する
' ただし解除する前にフィルターの文字列を表示する
Dim cDB As DAO.Database: Set cDB = CurrentDb
Dim acObj As AccessObject
Dim acScr As Screen
Dim str As String
Set acScr = Application.Screen

str = acScr.ActiveDatasheet.Filter
If str <> "" Then
Debug.Print "DoCmd.ApplyFilter , " & """" & Replace(acScr.ActiveDatasheet.Filter, Chr(34), Chr(34) & Chr(34), 1, -1, vbTextCompare) & """"
Debug.Print acScr.ActiveDataSheet.Filter
acScr.ActiveDatasheet.FilterOn = False

End If
End Sub
```

これをVBAのモジュールに貼り付けます。
新しいマクロを一個作成し、デザイン画面にします。
そしてプロシージャの実行を選択し、
Macro_WhatCurrentObjectFilter()
といれます。かっこが必要です。
登録した後名前を
A01フィルタ解除
とします。英語だと A01FltReleaseでしょうか。

###個人的なテクニック
マクロに登録するための関数は全てMacro_サブプロシージャ名にしています。
オートで候補が出てきますが、このときわかりやすいからです。

## 単純に今フィルタがかかっているテーブルまたはクエリのデータシートのフィルタ式を調べる

```vbnet

Function Macro_WhatCurrentObjectFilter()
Call WhatCurrentObjectFilter
End Fuction
Sub WhatCurrentObjectFilter()
'Access カレントのテーブルにかかっているフィルターをイミディエイトに表示する
Dim cDB As DAO.Database: Set cDB = CurrentDb
Dim acObj As AccessObject
Dim acScr As Screen
Dim str As String

Set acScr = Application.Screen

str = acScr.ActiveDatasheet.Filter

If str <> "" Then
Debug.Print acScr.ActiveDatasheet.Filter
Else
Debug.Print "No Filter"
End If
End Sub
```

## クエリ式をインプットボックスから入力して一気にフィルタをかけるマクロ

```vbnet

```
【インストール編】cakephp3でwebサービスを開発してみる

はじめまして。
新米エンジニアのnaskaです。

アウトプットも兼ねてcakephp3でＷＥＢサービスを作ってみようと思います。
ＯＳはwindowsです。
今回は、インストール編です。
###１、インストールするもの
・XAMPP(phpなどでＷＥＢサービス開発する上で必要な諸々が入っている)
https://www.apachefriends.org/jp/index.html
・composer(依存性管理ツール。cakephpをインストールに必要)
https://getcomposer.org/
どちらも、nextをクリックしていけばインストールされます。
###２、インストールしたXAMPPに対して必要な２つの変更
####・Apacheの設定
C:\xampp\apache\conf
にある、httpd.confファイルを開く。
LoadModule rewrirte_module modules/mod_rewrite.so
の冒頭に＃がついていたら削除。
※ctrl+Fで検索すると早い。
####・phpの設定
C:\xampp\php
にある、php.iniファイルを開く。
1番下に1文追加。
extension=php_intl.dll
###３、CakePHPのインストール
やっと本番ですね。
cakephpは、コマンドプロンプトでコマンドを叩いて作成します。
####デスクトップのディレクトリに移動
cd desktop
####アプリケーションの作成
composer create-project --prefer-dist cakephp/app webdiv
※webdivは、アプリ名です。ご自由にどうぞ
###４、サーバーで実行してみる。
サーバーを立ち上げます.
コマンドプロンプトで、先ほど作成したアプリの配下にいる状態で、
bin\cake server
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/208802/f4525629-ac71-f23f-cee5-3b502a449eff.png)
こんな感じになれば大丈夫です。
####５、実際に開いてみよう。
googlechroomなどのブラウザに、
上の画像の真ん中らへんにある、URLをコピペして貼り付けます。
built-in server is runnning in **http:localhost8765/**　←太文字の所
![a.PNG](https://qiita-image-store.s3.amazonaws.com/0/208802/9750d170-d2b2-8069-6e97-d4142cf787bf.png)
こんな画面が表示されます。

というわけで今日はここまでです。
これから、どういうサービスをつくろうか考えていこうと思います。
参考ＵＲＬ：https://book.cakephp.org/3.0/ja/installation.html
　　　　　　https://github.com/composer/windows-setup/blob/master/README.md
「ブロックチェーンEthereum入門 2-4」の手順が動かないので補足


# ブロックチェーンEthereum入門 2

引き続き、下記コラムをやっていってます。
[ブロックチェーンEthereum入門2](http://www.intellilink.co.jp/article/column/ethereum02.html)

順調だったのですが、eth-net-intelligence-apiを起動すると、黒画面が一定間隔で起動と終了を繰り返し、次のようなエラーログを吐きまくるという状況になってしまいました・・・。
<pre>
TypeError: results.reverse is not a function
    at c:\Tools\eth-net-intelligence-api\lib\node.js:622:21
    at c:\Tools\eth-net-intelligence-api\node_modules\async\lib\async.js:52:16
    at c:\Tools\eth-net-intelligence-api\node_modules\async\lib\async.js:361:13
    at c:\Tools\eth-net-intelligence-api\node_modules\async\lib\async.js:52:16
</pre>

調べてみると、発生条件はともあれ、下記に該当するっぽいのですが、本家にmergeされてないので仕方なくパッチを手動で適用したら安定しました・・。

https://github.com/cubedro/eth-net-intelligence-api/pull/242

# ブロックチェーンEthereum入門 3

どんどん進んでおります
[ブロックチェーンEthereum入門3](http://www.intellilink.co.jp/article/column/ethereum03.html)

1. サンプルのスマートコントラクト（Custom Token）をデプロイしようと思うと次のエラー
<pre>
 "throw" is deprecated in favour of "revert()", "require()" and "assert()".
</pre>
throwがdeprecatedになっているので、if/throwの部分を、次のようにrequereなどで書き換え。
<pre>
        require(balanceOf[msg.sender] >= \_value);
        require(balanceOf[\_to] + \_value >= balanceOf[\_to]);
</pre>

2. まだエラーが出ます。
<pre>
 Source file does not specify required compiler version!Consider adding "pragma solidity ^0.4.16
</pre>
言われたとおりにpragma追加で、コンパイル完了
<pre>
pragma solidity ^0.4.16;
contract MyToken { 
</pre>

# ブロックチェーンEthereum入門 4

最後のチャプター。
[ブロックチェーンEthereum入門4](http://www.intellilink.co.jp/article/column/ethereum04.html)

<pre>
以下のリンク先のソースコードを全選択してコピーし、SOLIDITY コントラクトソースコード の枠内に貼り付ける。
Democratic Autonomous Organization
</pre>
一見、リンク先が「Democratic Autonomous Organization」でなくて、「MyToken」のソースと同じになっているようにみえます。探してみると、左のbrowserのところを展開すると「Democratic Autonomous Organization」のソースが選択できるので、選択してコピペ
また、throwと、pragmaについて警告されるので修正。これで行けるかと思ったら・・、別のエラーが|дﾟ)。ググってみても、よい感じの解決策に当たらずギブアップ・・・。

# 関連記事
[「ブロックチェーンEthereum入門1」の手順が動かないので補足](https://qiita.com/tasklist78/items/5e66aca07059ab18f296)
BashでPython3のコードをログを吐き出しながらバックグラウンドで実行する

機械学習をしていてpythonのコードをバックグラウンドで実行し続ける必要があるときに使います。

```bash
nohup python3 -u foo.py > out.log 2> error.log &
tail -f out.log
tail -f error.log
top |grep python3 #プロセス番号を調べる
sudo renice -20 -p {プロセス番号} #優先順位を上げる
```

nohup: ハングアップシグナルを無視して実行し続ける。
python3 -u ：標準出力と標準エラー出力のストリームのバイナリーレイヤー (buffer 属性として利用可能) がバッファされないよう強制します。それでもテキスト I/O レイヤーは、コンソールに出力する場合はラインバッファされ、日対話的なファイルにリダイレクトされた場合はブロックバッファされます

uオプションを付けると tail -f out.log で実行状況を確認できる。
背景を自動で無限スクロールさせる


![bg_scroll.gif](https://qiita-image-store.s3.amazonaws.com/0/136286/5aef7344-a98a-49f1-d6db-0a150b74decd.gif "bg_scroll.gif")

## 上から下に流れる背景

__上から下に流れる背景__をつくるため、背景を2枚並べて、一番端までいったらスタート地点に戻す動作を繰り返す。

```c:上から下に流れる背景
using UnityEngine;
using System.Collections;

public class Done_BGScroller : MonoBehaviour
{
	public float scrollSpeed;
	public float tileSizeZ;

	private Vector3 startPosition;

	void Start ()
	{
		startPosition = transform.position;
	}

	void Update ()
	{
		float newPosition = Mathf.Repeat(Time.time * scrollSpeed, tileSizeZ);
		transform.position = startPosition + Vector3.forward * newPosition;
	}
}
```

## 下から上に流れる背景

__下から上に流れる背景__に変更するには、`Vector3.back`で進行方向を背面にして、スタート地点を変更する。

```c:下から上に流れる背景
void Start ()
{
	var pos = transform.position;
	startPosition = new Vector3(pos.x, pos.y, tileSizeZ);
}

void Update ()
{
	float newPosition = Mathf.Repeat(Time.time * scrollSpeed, tileSizeZ);
	transform.position = startPosition + Vector3.back * newPosition;
}
```

## Mathf.Repeat

https://docs.unity3d.com/ja/540/ScriptReference/Mathf.Repeat.html

第一引数〜第二引数の値をループで返す

```c:サンプル
Debug.Log (Mathf.Repeat (-10, 30)); // 20
Debug.Log (Mathf.Repeat (0, 30));   // 0
Debug.Log (Mathf.Repeat (10, 30));  // 10
Debug.Log (Mathf.Repeat (30, 30));  // 0
Debug.Log (Mathf.Repeat (50, 30));  // 20
Debug.Log (Mathf.Repeat (140, 30)); // 20
```

> 参考
[チュートリアル > スペースシューター](https://unity3d.com/jp/learn/tutorials/projects/space-shooter-tutorial)
【Python】webbrowserモジュールで、URLをブラウザで表示

***webbrowser*** モジュールを使って、簡単に当該のURLをブラウザで表示することができます。
**Safari**を例として試した結果は、以下のコードをご参照ください。

```.py
>>> import webbrowser
>>> url = 'http://docs.python.org/'

>>> webbrowser.get(using='safari')
>>> webbrowser.open_new(url)
>>> webbrowser.open_new_tab(url)
```

####**参考**
[21.1. webbrowser — 便利なウェブブラウザコントローラー](https://docs.python.jp/3/library/webbrowser.html)
はじめまして

##はじめに
私は機械工学を専攻している大学生です。
今までプログラミングはしたことはありませんが、この度学校でC言語を習うことになりました。
単位を取るだけで何も実らなかったでは終わりたくないので、ここに記録を記していきたいと思います。
と言ってもほんとのほんとに初心者なので何もわかっていないのですが、書いたコードなどを記録しておいて、後で見たときに「なんだこの汚いコードは（笑）」ってなれればいいかなと思っています。
３日坊主なのでいくつ記事を書くかも、悪い噂しか聞かないポインタにぶち当たったときどうするのかもわかりませんがよろしくお願いします。

とりあえずQiitaのアイコンの解像度が悪すぎてビビりました。

PC:MacBook Pro(Early 2015)
テキストエディタ:Vim(7.4.8056)

##今日書いたコード

```C:zikan.out
#include <stdio.h>

int main(void)
{
    int t, hour, minute, second;

    t = 10000;

    hour = t / 3600;
    minute = (t - hour * 3600 ) / 60;
    second = t - (hour * 3600 + minute * 60);

    printf("%d秒は%d時間%d分%d秒です。\n", t, hour, minute, second);

    return 0;
}
```
結果
10000秒は2時間46分40秒です。

これくらいは考えながらそらで書けるようになりました。結構デリケートなイメージがあったのできちんとかけ算割り算を先に計算してくれたり、括弧が使えるのは少し意外でしたね。

```C:zikan2.out
#include <stdio.h>

int main(void)
{
    int time, hour, minute, second;

    printf("時間（秒）の入力 >> ");
    scanf("%d", &time);

    hour = time / 3600;
    minute = (time - hour * 3600 ) / 60;
    second = time - (hour * 3600 + minute * 60);

    printf("%d秒は%d時間%d分%d秒です。\n", time, hour, minute, second);

    return 0;
}
```

zikan.outの応用（？）ですね。scanfはまだ空で書くことができません。覚えてしまえば簡単そうですが、つい本を見てしまいますね。実は割り算で小数点込みの計算（1/2=0.5みたいな）の方法がまだわかっていません。

本当にこの記事は誰が見てくれるんでしょうね。
Raspberry piでjuliusを使用して音声認識


ストックじゃなくて、いいねください。

# juliusを使用して音声認識
## 準備物
### - Raspberry Pi(今回は3)
~~Raspberry Piに入れるって言ってるのにないわけないだろ~~
### - USBマイク

## juliusのインストール  
```
$ wget https://github.com/julius-speech/julius/archive/v4.4.2.tar.gz
$ tar zxvf v4.4.2.tar.gz
$ cd julius-4.4.2
$ ./configure
$ make
$ make install
$ julius -version
```
v4.4.2のところは最新のversionを指定してください。

## juliusの実行キット(ディクテーションキットと記述文法音声認識実行キット)のインストール
```
~/julius-4.4.2$ mkdir julius-kit
~/julius-4.4.2$ cd julius-kit
$ wget --trust-server-names 'http://osdn.jp/frs/redir.php?m=iij&f=%2Fjulius%2F60416%2Fdictation-kit-v4.3.1-linux.tgz'
$ wget https://github.com/julius-speech/grammar-kit/archive/v4.3.1.zip
$ tar zxvf dictation-kit-v4.3.1-linux.tgz
$ unzip v4.3.1.zip
```
容量が大きいため少し時間がかかります。なるべく回線のいい環境でのダウンロードを推奨します。

```ディレクトリ構成
~/julius-4.4.2
｜--julius-kit
       ｜--dictation-kit-v4.3.1
       ｜--grammer-kit-v4.3.1
```        
## juliusの実行
### ディクテーションキットを使用した場合
```
$ cd dictation-kit-v4.3.1
$ julius -C main.jconf -C am-gmm.jconf -demo   
///homeから実行する場合
$ cd ~   
$ julius -C ~/julius-4.4.2/julius-kit/dictation-kit-v4.3.1-linux/main.jconf -C ~/julius-4.4.2/julius-kit/dictation-kit-v4.3.1-linux/am-gmm.jconf -demo
```
### 記述文法音声認識実行キットを使用した場合
```
$ cd grammer-kit-v4.3.1
$ julius -C testmic.jconf -charconv SJIS UTF-8
///homeから実行する場合
$ cd ~
$ julius -C ~/julius-4.4.2/julius-kit/grammer-kit-v4.3.1/testmic.jconf -charconv SJIS UTF-8   
```

### もしエラーが出て実行されない場合
```
### read waveform input
Stat: adin_oss: device name = /dev/dsp (application default)
Error: adin_oss: failed to open /dev/dsp
failed to begin input stream
```
- そもそもマイクがささってない（自分やっちゃった・・・）
- マイクに問題がない場合   

```   
$ sudo modprobe snd-pcm-oss   
$ sudo sh -c "echo snd-pcm-oss >> /etc/modules"
$ export AUDIODEV=/dev/dsp1
```
今までは毎回起動時にexport AUDIODEV=/dev/dsp1
を行っていましたが、めんどくさいのでラズパイの設定を変えましょう。

```
$ sudo emacs /etc/profile
```
profileファイルの最後に
export AUDIODEV=/dev/dsp1を追加してください。
追加して、保存すると再起動してください。
それで毎回のexport AUDIODEV=/dev/dsp1する必要はなくなります。

###　実行結果
```
<<< please speak >>>
```
と表示され、音声入力待ちになると成功

### まとめ
一応認識はできました。
しかし、そのまま使用しても認識率がよくないので辞書を作りましょう。
作り方は[こちら](https://qiita.com/fishkiller/items/40c271d1216921e29b91)
docomoAPIの音声認識などいくつか試して音声認識をどれで行うか決めることにしましょう。
あとマイクはある程度いいやつにしましょう。安いやつだとガバガバ・・・( ́・ω・ )
❄️Shrine gem 使い方　メモ

(★)はアプリによって異なります！
★は消して下さい。


$ rails new   _________ 
で、railsアプリを作成し,scaffoldでPhotoに関するもの一式を作った後からです。



Gemfileにgemを追加

```
gem "shrine"
```
そして、

```
$ bundle install
```

次に、モデルを作成します。
shrineを使う場合、image_data:textです！

```
→ rails g model （画像を置くページ） その他:型　image_data:text
$ rails g model ★Photo ★title:string image_data:text
```


そして、データベースに反映。

```
$ rails db:migrate
```

config/initializers　の中に”shrine.rb”という名前のファイルを自分で作成し、以下を貼り付けます。

```config/initializers/shrine.rb
require "shrine"
require "shrine/storage/file_system"
 
Shrine.plugin :activerecord
Shrine.plugin :logging, logger: Rails.logger
 
Shrine.storages = {
  cache: Shrine::Storage::FileSystem.new("public", prefix: "uploads/cache"),
  store: Shrine::Storage::FileSystem.new("public", prefix: "uploads/store"),
}
```
modelの中に”image_uploader.rb”というファイルを自分で作成し、Shrineを継承。

```models/image_uploader.rb
class ImageUploader < Shrine
end
```
ここでimageだけを取ってきてるらしいです。

```models/★photo.rb
include ImageUploader[:image]

```
コントローラーの設定

```controllers/★pages_controller.rb
class ★PhotosController < ApplicationController
  def index
    ★@photos = ★Photo.all
  end
end

##############################################
private
  def ★photo_params
      params.require(:★photo).permit(:image, ★:name,...その他)
    end
```

views/★photos/index.html.erbやviews/★photos/show.html.erbにも
画像を表示したい所に↓のimgの行を追加。

※これを貼る時、インスタンスメゾットで”＠”をつける所、つけない所を書き分けているかに注意して下さい。
（初めの頃、@photos each do |photo|　〜 　endがあるのを気づかずに、その中に@photosとか書いたりしてました。アホでした。）

```views/★photos/★_photo.html.erb
<div>
  <% if ★photo.image_data? %>



    <img src= "<%= ★photo.image_url %>">　#この行が画像を表示する所！！！



  <% end %>
  <%= link_to 'Edit', edit_★photo_path(★photo) %>
</div>
```

```views/★photos/_form.html.erb
  <div class="field">
    <%= form.label :image %>
    <%= form.hidden_field :image, value: @★photo.cached_image_data if defined?(@★photo.cached_image_data) %> 
　　#↑私はこの一行が足りなかったです、、、泣
    <%= form.file_field :image %>
  </div>

```


エラーが出た場合、
・ルートがきちんと設定されているか。
・コントローラーのメゾットの中に、viewに対応するコントローラーがあるか、そして＠インスタンスメゾットが定義されているか。
確認してみて下さい！

rails全般において初心者ならではのエラー
・```JSON::ParserError  unexpected token at 
```のエラーが出た時は、自分で投稿した（キーボードで適当に文字を入力した場合）その内容の一部が問題を起こしています。今までの内容を編集するか、、、削除するか、、、でその投稿を変更して下さい。
私の場合はshrine gem を入れる前に、image_dataに変な文字を入力していたので、rails consoleにてimage_dataをnilに変更して対処しました。

```ruby
$ rails c
irb(main):008:0> Product.all.each do |product|
irb(main):009:1* product.image_data = nil
irb(main):010:1> product.save
irb(main):011:1> end
```


もう二度と、フォームの入力は適当にキーボードをガチャガチャって入力しない！！！と誓いました。笑






http://localhost:3000/★photos/new にアクセスし、画像を投稿してみて下さい。
PHPフレームワーク Laravel その2

[welcome画面からの続き](https://qiita.com/takz2503/items/fe34dae67879cb6b95f8 "welcome画面からの続き")

#view他のありかを探る
http://{vagrant sv ip}/webapp000/public/
にあるリンク[http(ｓ)://laravel.com/docs]が書かれているviewファイルは？？？

```ruby:command
$ grep  -rl 'https://laravel.com/docs' ./*
./readme.md
./resources/views/welcome.blade.php
```
welcome.blade.phpを読み込んでるのは？
↑これはhtmlが書かれているviewなので…

```ruby:command
$ grep  -rl 'welcome' ./*
./routes/web.php
```

```ruby:/routes/web.php
Route::get('/', function () {
    return view('welcome');
});
```
/(webapp000/public/) でアクセスしたら
view.welcomeを返してるんですかねー

#HTMLをいじいじしてみる
##formを作成の下準備
**ここはググった**

```ruby:command
$ /home/vagrant/composer.phar require laravelcollective/html
```
```ruby:config/app.php
providers =>
        Collective\Html\HtmlServiceProvider::class,

aliases=>
        'Form' => Collective\Html\FormFacade::class,
        'Html' => Collective\Html\HtmlFacade::class,

↑を追加
```

んな感じでちょくちょくララってみてる:zzz:
ProLiant ML350 G6 にWindows Server 2016 をインストールしてみた

インストールメモ。
HPのサイト 検索がしにくくてイライラMAXになる。

## 構成図を確認

[ProLiant ML350 G6 システム構成図(pdf)](https://h50146.www5.hpe.com/products/servers/proliant/system_old_pdf/ml350g6.pdf)


## Windows Server 2016 のインストール

dvdから普通にインストール。
RAIDコントローラも見えるので特にハマることもなし。


## ドライバのインストールとか
[HPEサポートセンター](https://support.hpe.com/hpesc/public/home)から
物によってWin2016版が無いものがあるので適宜2012とかから選ぶ。

### iLO関連

デバイスマネージャで未発見のシステムデバイスとIPMIインターフェースはiLOのコントローラードライバとマネージメントドライバ。

- HP ProLiant Integrated Lights-Outマネジメントインターフェイスドライバー for Windows Server 2012
- HP ProLiant iLO 2マネジメントコントローラードライバー for Windows Server 2012

をインストール。

- [Re: Missing Base System Device Driver \- HP Support Forum \- 6061582](https://h30434.www3.hp.com/t5/Business-PCs-Workstations-and-Point-of-Sale-Systems/Re-Missing-Base-System-Device-Driver/td-p/6061582)

### 管理ソフト系

RAIDをホストOSから管理したいので[HPE SSA](http://h50146.www5.hpe.com/products/servers/proliant/storage/ssa/)を追加

- HPE Smart Storage Administrator (HPE SSA) for Windows 64ビット

### NIC (NC326i デュアルポート Gigabitネットワーク アダプター)

デバイスマネージャにはBroadcom NetXtreme Gigabit Ethernet と出てくる。
これがMS製のドライバだと1000baseとして使えなかったのでドライバ入れ替え。

[HPEサポートセンター](https://support.hpe.com/hpesc/public/home)で ｢NP NC326i Integrated Dual Port PCI Express Gigabit Server Adapter｣を選択して以下をインストール

- HP Broadcom 1Gbドライバー for Windows Server x64 Edition

## 参考
- [How to install Windows Server 2012 on HP ProLiant Servers \- TechRepublic](http://www.techrepublic.com/blog/data-center/how-to-install-windows-server-2012-on-hp-proliant-servers/)
- [HP Smart Update Manager ユーザー ガイド](https://support.hpe.com/hpsc/doc/public/display?sp4ts.oid=1008862748&docLocale=ja_JP&docId=emr_na-c03179042) →別途Service Pack for ProLiantが必要
-
Windows10にOpenCV3.2をインストール

# 環境
- Visual Studio Community 2017	Version 15.4.1
- Windows 10
- OpenCV 3.2.0

# 手順
1 ほぼこれの手順通り	[Install OpenCV 3 on Windows](https://www.learnopencv.com/install-opencv3-on-windows/)  
2 詰まったところ  
Visual Studio でWin32 コンソールアプリケーションを作成することができなかった。  
  
解決方法  [Visual Studio 2017 Update 3 で Win32 プロジェクトが作成できなくなった時の対処法](https://qiita.com/sasakenotolab/items/9fe86626d206ce4d6668)
yhpg07 - のんびり座りたいをPythonで解いてみる

問題はこちら
http://nabetani.sakura.ne.jp/hena/ord7selectchair/

一文字ずつ座れる席を探す作戦。


```py3:yhpg07.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-

# https://yhpg.doorkeeper.jp/
# http://nabetani.sakura.ne.jp/hena/ord7selectchair/

from functools import reduce


def solve(data):
    data = data.split(":")
    field = ["-"] * (int(data[0]) + 1)  # 末尾を番兵用に＋１しとく

    for d in data[1]:
        # print(field)
        if d.isupper():
            # 大文字は座る人
            num = findSheatCanSit(field)
            field[num] = d
        else:
            #小文字は降りる人
            num = findVacantSheat(field, d)
            field[num] = "-"

    flattern = reduce(lambda x,y:x+y,field)
    return flattern[:-1]    # 末尾はいらないので削除

def findSheatCanSit(field):
    #両側が開いている席を探す
    for i in range(len(field)-1):
        if i == 0:
            if field[i] == "-" and field[i+1] == "-":
                return i
        else:
            if field[i-1]== "-" and field[i] == "-" and field[i+1] == "-":
                return i

    #両側に空きがなければ、片側が開いている席を探す
    for i in range(len(field)-1):
        if i == 0:
            if field[i] == "-" and field[i+1] != "-":
                return i
        else:
            if field[i-1] == "-" and field[i] == "-" and field[i+1] != "-":
                return i
            elif field[i-1] != "-" and field[i] == "-" and field[i+1] == "-":
                return i


    #左優先で座れる席に座る
    for i, f in enumerate(field):
        if f == "-":
            return i


def findVacantSheat(field, data):
    for i, f in enumerate(field):
        if f == data.upper():
            return i


def test(data, expect):
    result = solve(data)
    if result == expect:
        print("成功: " + result + "/" + expect )
    else:
        print("失敗: " + result + "/" + expect )

test( "6:NABEbBZn", "-ZAB-E" );
test( "1:A", "A" );
test( "1:Aa", "-" );
test( "2:AB", "AB" );
test( "2:AaB", "B-" );
test( "2:AZa", "-Z" );
test( "2:AZz", "A-" );
test( "3:ABC", "ACB" );
test( "3:ABCa", "-CB" );
test( "4:ABCD", "ADBC" );
test( "4:ABCbBD", "ABDC" );
test( "4:ABCDabcA", "-D-A" );
test( "5:NEXUS", "NUESX" );
test( "5:ZYQMyqY", "ZM-Y-" );
test( "5:ABCDbdXYc", "AYX--" );
test( "6:FUTSAL", "FAULTS" );
test( "6:ABCDEbcBC", "AECB-D" );
test( "7:FMTOWNS", "FWMNTSO" );
test( "7:ABCDEFGabcdfXYZ", "YE-X-GZ" );
test( "10:ABCDEFGHIJ", "AGBHCIDJEF" );


```
Rubyのparallelで並列処理するときにputsでLog出しするときに注意すること

# TL;DR (長い3行で)
・parallel使って並列処理させるときに`puts`で標準出力にLog出しすると，
・行末の改行位置が正しく表示されない．(改行がされなかったり，2回改行されたり)
・putsの自動改行挿入によるものなので，`print("**\n")`か`puts("**\n")`のように明示的に改行する．

# 何が困るか
Log出ししてる処理をparallelで並列化するときに，↓のようなCodeを書いたとします．

```ruby
def func(i)
  puts "#### Function in Multi Thread : index=#{i}"
end

Parallel.each(1..1000, in_threads: 8) { |i|
  func(i)
}
```

端末に表示されるLogの期待値は ↓ だと思います．
![ok.png](https://qiita-image-store.s3.amazonaws.com/0/129035/8f953cae-7de5-8389-656c-945fbda1fb69.png)

しかし，実際には ↓ のように改行位置が意図しないものになります．
![ng.png](https://qiita-image-store.s3.amazonaws.com/0/129035/25c14745-28ef-a8f5-7a47-bd7990da85dc.png)

# なんでこうなる?
Kernel.#puts の仕様書によると，
https://docs.ruby-lang.org/ja/2.4.0/method/Kernel/m/puts.html

```text
引数と改行を順番に 標準出力 $stdout に出力します。
```

とのこと．”引数と改行を順番に”．

`Kernel#puts`のソースを確認するために，
`pry`で`show-source puts`すると，

```c
From: io.c (C Method):
Owner: Kernel
Visibility: private
Number of lines: 8

static VALUE
rb_f_puts(int argc, VALUE *argv, VALUE recv)
{
    if (recv == rb_stdout) {
        return rb_io_puts(argc, argv, recv);
    }
    return rb_funcall2(rb_stdout, rb_intern("puts"), argc, argv);
}
```

`rb_io_puts'が実体のようなので，Rubyのソースコードで検索すると ↓ のコードが出てきます．
https://github.com/ruby/ruby/blob/trunk/io.c#L7573


```c
rb_io_puts(int argc, const VALUE *argv, VALUE out)
{
    int i;
    VALUE line;

    /* if no argument given, print newline. */
    if (argc == 0) {
	rb_io_write(out, rb_default_rs);
	return Qnil;
    }
    for (i=0; i<argc; i++) {
	if (RB_TYPE_P(argv[i], T_STRING)) {
	    line = argv[i];
	    goto string;
	}
	if (rb_exec_recursive(io_puts_ary, argv[i], out)) {
	    continue;
	}
	line = rb_obj_as_string(argv[i]);
      string:
	rb_io_write(out, line); // 引数の書き出し
	if (RSTRING_LEN(line) == 0 ||
            !rb_str_end_with_asciichar(line, '\n')) {
	    rb_io_write(out, rb_default_rs); // '\n'が無いときにrb_default_rs(== '\n')を追加で出力
	}
    }

    return Qnil;
}
```

↓ こちらの解説も参考にさせていただきましたが，putsのnative実装の中で2回のwriteに分けて処理されていて，その間排他制御がされていない模様．
http://ode.hatenadiary.jp/entry/20091117/1258445186


# こうすればOK
文字列終端に'\n'が無ければ`\n`をwriteする処理を黙らせればいいので，
`puts("**\n")`
のように明示的に改行を入れるか，
`print("**\n")`
を使えば期待どおりのLogが出力されます．

---///
【Ruby】コードリーディングして分からなかった記載や違いについて

# 背景
Ruby on Railsの[チュートリアル](https://railstutorial.jp/)を勉強後、一つ[サイト](http://anivote.com/)を作ってみましたが、他の人のソースを読むと「まだまだ理解できていないところが多いな・・・」と感じました。
これはいかんと思い、まずはRubyの知識を補うため「[kaminari](https://github.com/kaminari/kaminari)を読んでみよう!!!」って事で読み始めてみました。
最初のコードリーディングにkaminariを選んだ理由は、有名なgemであり、中できっと難しいことしているだろうという考えです。

その中で分からなかった記述方法や違いについてしっかりと理解できていなかった点を下記に挙げてます。
基本的には分かりやすかったサイトへ誘導するようにしてます。
コードリーディングはまだ道半ばなので、新たにあれば追加していきます。

# extend, include, prependについて
### extend
クラスがモジュールをincludeすると、モジュールのインスタンスメソッドを特異メソッドとして追加

### include
クラスがモジュールをincludeすると、モジュールのインスタンスメソッドを追加

### prepend
includeに近いですが、継承チェーンはプリペンドしたクラスの手前に入ります。

## 参考サイト
[【Ruby】includeとprependとextendの違いと用途](http://www.task-notes.com/entry/20170425/1493047290)

# yield(+ブロック、proc)について
railsのViewでyieldは使ったけど、よくわかってない・・・。
調べると、ブロックやprocがセットで出てくるので合わせて勉強。

### yield
yieldは"供する", "譲る"などの意味があり、メソッド呼び出し時にブロックを与えると、メソッド内でyieldでブロックの処理を実行できます。

### ブロック
メソッド呼び出し時に{}やdo...endで囲まれているもの。

### proc
yieldで実行する以外に、引数に&procという引数を追加すれば、ブロックをproc.callで実行できるようになります。

## 参考サイト
[Ruby の yield って結局なんなの?](http://d.hatena.ne.jp/yoshidaa/20090511/1241967137) 

# <=>について
最初は何かわからなかったけど、<と=と>であると理解すれば納得。

###<=>
JavaのCompareと同じ。

## 参考サイト
[Ruby の <=> 演算子が返す値を覚える方法](https://qiita.com/takuya0301/items/364f2b3f7ba2c36e0f62)
Perfect-MySQL library not found for -lmysqlclient for architecture x86_64 with Xcode & brew

### 1. install mysql
`$ brew install mysql`

### 2. make xcodeproj
```swift
import PackageDescription
let package = Package(
	name: "PerfectTemplate",
	targets: [],
	dependencies: [
		.Package(url: "https://github.com/PerfectlySoft/Perfect-HTTPServer.git", majorVersion: 3),
        .Package(url: "https://github.com/PerfectlySoft/Perfect-MySQL.git", majorVersion: 3)
	]
)
```

```
swift package generate-xcodeproj
open [yourproject].xcodeproj
```

### 3. Xcode build and Error

`Xcode -> Product -> Build`
`library not found for -lmysqlclient for architecture x86_64`

# Solution
```
swift build -Xlinker -L/usr/local/lib
swift test -Xlinker -L/usr/local/lib
swift package -Xlinker -L/usr/local/lib generate-xcodeproj
```

### Refers

 - https://github.com/IBM-Swift/SwiftKueryMySQL#install-mysql
[Android] EditTextでE-mail確認しよう。 

```java:function
   public static boolean checkEmail(String email){

        String regex = "^[_a-zA-Z0-9-\\.]+@[\\.a-zA-Z0-9-]+\\.[a-zA-Z]+$";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(email);
        boolean isNormal = m.matches();
        return isNormal;
    }
```

使おう

```java

 if (!checkEmail(userEmail)){
       AlertDialog.Builder builder = new AlertDialog.Builder(RegisterActivity.this);
            dialog = builder.setMessage("メール確認してください。").setNegativeButton("了解", null)
                    .create();
            dialog.show();
            return;
}
```

## 二つ目

```java

Email.setOnFocusChangeListener(new View.OnFocusChangeListener(){
 
           @Override
           public void onFocusChange(View v, boolean hasFocus) {
               if(hasFocus) {
                   Pattern p = Pattern.compile("^[a-zA-X0-9]@[a-zA-Z0-9].[a-zA-Z0-9]");
                   Matcher m = p.matcher((etEmail).getText().toString());
 
                   if ( !m.matches()){
                       Toast.makeText(RegistActivity.this, "メール確認してください", Toast.LENGTH_SHORT).show();
                   }
               }
           }
       });

```

###注目ポイント

```java
^[a-zA-X0-9]@[a-zA-Z0-9].[a-zA-Z0-9]
```