OmniAICreator/Qiita-1.07M huggingface dataset:
Xamarin.Mac + F#のソリューションがビルドできないときは

2017年4月頭のアップデート（内容と日付の正確なところが分かりません。ごめんなさい）で、Xamarin.Macを使ったCocoa App + F#のソリューションがビルド出来なくなり、悪戦苦闘した内容をメモしておきます。
極めて期間限定の価値しか提供できないとは思いますが、せっかくなので公開しておきます。

# 現象
Cocoa App+F#のソリューションをビルドするとエラーが起きビルドに失敗する

# エラー内容
```
Error: <solution_path>/FSharpSample/FSharpSample.fsproj
     : /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Mac/Xamarin.Mac.FSharp.targets
         : Project file could not be imported, it was being imported by
       <solution_path>/FSharpSample/FSharpSample/FSharpSample.fsproj
      /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Mac/Xamarin.Mac.FSharp.targets
                    could not import "$(FSharpTargets)"
```
（適度に改行を入れています）

# 原因の推測
正確な日付と対象ライブラリは覚えていないのですが、４月頭のアップデートでビルドプロセスの雛形となるtargetファイルのパスが変わったようで、Cocoa App+F#のプロジェクトがビルドできなくなったようです。

# 対処内容
下記ファイルの一部を書き換えます。
```
/Library/Frameworks/Xamarin.Mac.framework/Versions/Current/lib/msbuild/Xamarin.Mac.FSharp.targets
```

FSharpTargetsという変数の中身が存在しないパスになってしまうので、存在するパスに書き換えます。

書き換え前）
```xml
<Import Project="$(FSharpTargets)" />
```

書き換え後）
```xml
<Import Project="/Library/Frameworks/Mono.framework/Versions/4.8.1/lib/mono/fsharp/Microsoft.FSharp.Targets" />
```

FSharpTragets変数を参照せずに直接targetsファイルを見に行っています。汎用性はない解決方法ですが、当面を乗り切れます。


# 雑感
Cocoa App+F#はViewControllerが自動で作られないなど、C#に比べてケアが行き届いていません。F#でMacアプリは、茨の道のようです・・・^^;
Rails の ActionMailer のデバッグ色々メモ

# メールの本文を Console でチェックする
```
$ bin/rails console

[1] pry(main)> puts XxxxMailer.xxxx.html_part.decoded
```

エンコードされてしまうので、 decoded を取ると、エンコード前が見れる

# Subscriber を attach したときの payload
ソース: [lib/action_mailer/base.rb@a45f234b028fd4dda5338e5073a3bf2b8bf2c6fd](https://github.com/rails/rails/blob/a45f234b028fd4dda5338e5073a3bf2b8bf2c6fd/actionmailer/lib/action_mailer/base.rb#L566-L576)

```rb
      def set_payload_for_mail(payload, mail)
        payload[:mailer]     = name
        payload[:message_id] = mail.message_id
        payload[:subject]    = mail.subject
        payload[:to]         = mail.to
        payload[:from]       = mail.from
        payload[:bcc]        = mail.bcc if mail.bcc.present?
        payload[:cc]         = mail.cc  if mail.cc.present?
        payload[:date]       = mail.date
        payload[:mail]       = mail.encoded
      end
```

ここにあるものしか取れない。これ以上を欲しい場合はオーバーライドするしかない
itamaeでjobberの設定ファイル.jobberdが更新されたら設定を再読込

ユーザー名は`deployer`になってます。これで`itamae`でレシピを実行した時にサービスもちゃんと再起動されます。

```.rb
service 'jobberd'
remote_file '/home/deployer/.jobber' do
  source '.jobber'
  notifies :restart, 'service[jobberd]'
end
```
VirtualBox 5.1.20で共有フォルダーが動かなくなる対策

VirtualBoxを5.1.20にアップデート後、Guest Additionをインストールし直すと、以下のようなメッセージが出力され、それ以降、共有フォルダーのマウントに失敗するようになってしまいます。

```
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o dmode=755,fmode=644,uid=1000,gid=1000 vagrant /vagrant

The error output from the command was:

mount: wrong fs type, bad option, bad superblock on vagrant,
       missing codepage or helper program, or other error

       In some cases useful info is found in syslog - try
       dmesg | tail or so.
```

Guest Additionがリグレッション起こしたのかな？
(Issueを調べれば上がってそう)

```
sudo rm /sbin/mount.vboxsf && sudo ln -s /usr/lib/VBoxGuestAdditions/mount.vboxsf /sbin/mount.vboxsf
```

を行えばマウントできるようになります。

なので、上記手順を実施後、

(VM再起動したくない場合)
```
sudo mount -t vboxsf -o dmode=755,fmode=644,uid=1000,gid=1000 vagrant /vagrant
```
を行うか、(VM再起動してもいい場合)ホストで
```
vagrant reload
```
して、VMを再起動すればOK

【参考】
http://qiita.com/amagitakayosi/items/07ff50afac1cd6f62c1f

【2017/04/23 追記】
@ytooyama さんからの情報です。
以下のisuueが発行されているようです。VirtualBoxの修正対応待ちですね。

https://www.virtualbox.org/ticket/16670
オフラインリアルタイムどう書くF04の問題


オフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/59438 )を行っています。

問題は「正八角形の分割」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/ordf04octsp/
です。

出題者の気分としては、問題を読み始めてから解けるまで30分あればなんとかなると思ってますが、ひとそれぞれで。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、
https://nabetani.hatenadiary.com/entry/yhpg_list
に過去問リンク集がありますので、そちらをご覧になると良いと思います。

【宣伝】
CodeIQ で問題出しています。
https://codeiq.jp/q/search?combine=%40Nabetani
をご覧いただければ幸いです。
超シンプル SSH 鍵コマンド集


なんか覚えれないのでメモ

## 自分がよく使ってる

```
ssh-keygen -t rsa -b 4096 -f roles/add_users/files/USERNAME.pem -C USERNAME@localhost
```

## Nginx とか Apache ユーザーで鍵を作る

Git 用とかで

Nginx


```
sudo -u nginx ssh-keygen -t rsa -b 4096 -C nginx@localhost
sudo cat /var/lib/nginx/.ssh/id_rsa.pub
```

Apache


```
sudo -u apache ssh-keygen -t rsa -b 4096 -C apache@localhost
sudo cat /var/lib/apache/.ssh/id_rsa.pub
```

## 鍵のパスワードを変更

```
ssh-keygen -p [-f 鍵ファイル生成先]
```

## 秘密鍵から公開鍵を取り出す

```
ssh-keygen -y -f [秘密鍵の場所] > [公開鍵出力先]
```


## コマンドライン

```
ssh-keygen [オプション] -t 鍵タイプ [-N 新しいパスフレーズ] [-C コメント] [-f 鍵ファイル]
ssh-keygen -f [生成先] -C [コメント]
ssh-keygen -p [-P 古いパスフレーズ] [-N 新しいパスフレーズ] [-f 鍵ファイル生成先]
ssh-keygen -i [-f 鍵ファイル]
ssh-keygen -l [-f 鍵ファイル]
```

## 鍵を生成

```
ssh-keygen -t rsa [-f 鍵ファイル生成先]
```



## 参考

http://webkaru.net/linux/ssh-keygen-command/
【読書ノート】《C# in Depth》～4 LINQ

LINQとは？　Language Integrated Query

```csharp
List<Product> products = Product.GetSampleProducts();
List<Supplier> suppliers = Supplier.GetSampleSuppliers();
var filtered = from p in products
               join s in suppliers
                      on p.SupplierID equals s.SupplierID
               where p.Price > 10
               orderby s.Name, p.Name
               select new { SupplierName = s.Name, ProductName = p.Name };
foreach (var v in filtered)
{
  Console.WriteLine("SUpplier={0}; Product={1}",
                     v.SupplierName, v.ProductName);
}
```
Slackbotを公開channelに招待するときは、今後kickする必要があるか考えておこう

slackbotは便利です。
しかし、slackbotを公開channelに招待したとき、
Team Owners / Admin権限を保持してないとremoveできません。

* Team Owners / Admin権限がない
* botは自分からleaveできない(権限がない)

botを公開channelから外すときは以下のような作業が必要です。
* 権限を保持している人(管理者)にお願いする
* botを削除する
* channelを作り直す

botをテストするときは気をつけましょう。


### 参考

* [公式マニュアル：メンバーを外す](https://get.slack.help/hc/ja/articles/201898668-%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E3%81%8B%E3%82%89%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E3%82%92%E5%A4%96%E3%81%99)
* https://api.slack.com/methods/channels.leave
Rails で open という enum を定義した場合に、メソッドの上書きに対する警告を取り除く

# 問題

```rb
class Ticket < ApplicationRecord
  enum status: {
    open: 1,
    closed: 2
  }
end
```

上記の Ticket モデルでは、status カラムに Rails の [enum](http://api.rubyonrails.org/classes/ActiveRecord/Enum.html) を使っています。enum を定義すると、自動的に `open`, `closed` という名前のスコープも定義されます。

```rb
Ticket.open.to_sql #=> SELECT "tickets".* FROM "tickets" WHERE "tickets"."status" = 1
Ticket.closed.to_sql #=> SELECT "tickets".* FROM "tickets" WHERE "tickets"."status" = 2
```

この `open` という名前が少し曲者です。モデルのクラスには Kernel から継承した `open` という名前のプライベートメソッドが既に存在します。

```ruby
pry(main)> $ Ticket.open

From: /Users/quanon/.rbenv/versions/2.3.4/lib/ruby/2.3.0/open-uri.rb @ line 29:
Owner: Kernel
Visibility: private
Number of lines: 11

def open(name, *rest, &block) # :doc:
  if name.respond_to?(:open)
    name.open(*rest, &block)
  elsif name.respond_to?(:to_str) &&
        %r{\A[A-Za-z][A-Za-z0-9+\-\.]*://} =~ name &&
        (uri = URI.parse(name)).respond_to?(:open)
    uri.open(*rest, &block)
  else
    open_uri_original_open(name, *rest, &block)
  end
end
```

そのせいで、クラスの読み込み時に

```
Creating scope :open. Overwriting existing method Ticket.open.
```

という警告が表示されてしまいます。

# 解決策

```rb
class Ticket < ApplicationRecord
  class << self; undef :open; end

  enum status: {
    open: 1,
    closed: 2
  }
end
```
enum を定義する前に [undef](https://docs.ruby-lang.org/ja/latest/doc/spec=2fdef.html#undef) を使って open メソッドの定義を取り消します。

# 参考

* Rails 製のツールである [Redmine](http://redmine.jp/) の issue を参考にしました。 
  * [Overwriting existing method Issue.open](http://www.redmine.org/issues/11545)
Dockerを使ってローカルにknowledgeサーバを立てる


1. knowledgeとpostgresのイメージをDocker Hubからダウンロードしてくる

	``` shell
	docker pull koda/docker-knowledge
	docker pull postgres
	```

1. postgresを起動する
	
	``` shell
	docker run \
	  -d \
	  --name knowledge-no-db \
	  -v /Users/hogefuga/knowledge/db/:/var/lib/postgresql/data \
	  -e POSTGRES_USER=hogefuga \
	  -e POSTGRES_PASSWORD=foobar \
	  postgres
	```

1. knowledgeを起動する

	``` shell
	docker run \
	  -d \
	  --name knowledge \
	  -v /Users/hogefuga/knowledge/app/:/root/.knowledge \
	  -p 80:8080 \
	  --link knowledge-no-db:postgres \
	  koda/docker-knowledge
	```

1. ブラウザでknowledgeを開き、adminアカウントでサインインし、
システム設定の「データベースの接続先変更」画面で組み込みDBからpostgresにDBを変更する

	|項目|値|
	|:--|:--|
	|URL|jdbc:postgresql://knowledge-no-db:5432/hogefuga|
	|user|hogefuga|
	|password|foobar|


----

ちょっと触って見る程度とかでpostgres不要であれば、以下のみでOK。

``` shell
docker run \
  -d \
  --name knowledge \
  -v /Users/hogefuga/knowledge/app/:/root/.knowledge \
  -p 80:8080 \
  koda/docker-knowledge
```
C++ Builder XE4 > IDE > 複数のコンポーネントのプロパティを順番に変更する

```txt:動作環境
C++ Builder XE4
```

[C# Tutorial In Urdu - Introduction to Visual C#](https://www.youtube.com/watch?v=ULzJNoSg2Xo&list=PLUyYwyJA_WfQd5zeCU890TDFQAqboekyc)

上記の15:10あたりからVisual Studioにて複数のコンポーネントのTextを以下の手順で変更していた。

1. コンポーネントをマウスクリック
2. Textプロパティを選択
3. キーボードから入力
4. 次のコンポーネントをマウスクリック
5. キーボードから入力
6. 4以降を繰返す

効率が良さそう。

C++ Builderでは上記のように順番に変更できない、と思っていた自分がいました。

実はできました。上記と同じ方法で。

![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/6c234913-712b-431b-74ba-966de5643777.png)

複数のコンポーネントに異なるプロパティ値を入れるのはnameの設定時など。
MySQL と SQL の基本


実行環境　CentOS6.9

## ターミナルでのコマンド

実行　`/etc/init.d/mysqld start`

状況確認　`/etc/init.d/mysqld status`


管理することができるプログラム一覧
`chkconfig --list`

電源を立ち上げた時にプログラムを立ち上げる
`chkconfig mysqld on`



## MySQL 内のコマンド

### ログインしているユーザーを表示

```
mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
```

#### 使用できるDBを表示

```
mysql> show databases;
```

#### 使用するDBを選択

```
mysql> use webapp
Database changed
```

#### Mysqlの環境を確認

```
mysql> status
```

#### カラムの一覧表示
使用するDB選択後

```
mysql> desc users;
```

#### 入出力のリダイレクション

sqlの取り込み

` mysql -u root -p < db.sql`



#### selcet文

student テーブルからstudent_idを取り出す時

```
mysql> select student_id from student;
+------------+
| student_id |
+------------+
|          1 |
|          2 |
|          3 |
|          4 |
|          5 |
|          7 |
|          8 |
|          9 |
|         10 |
|         11 |
|         12 |
|         13 |
|         14 |
|         15 |
|         16 |
+------------+
```

studentテーブルからすべての情報を表示する場合

```
mysql> select * from student;
```

## 簡単検索

```
mysql > select * from table名 where カラム名 like '%検索ワード%';
```

任意の
  
linuxとワイルドカードを比較

|  | Linux | Mysql |
|:-----------|------------:|:------------:|
| 任意の0文字以上の文字列       |       * |     %     |
| 任意の1文字     |     ? |    _    |




### join

ほとんどの場合は等価結合を用いる。

```
SELECT a_column,b_column, c_column
FROM a_table,b_table
WHERE a_table.b_table_id = b_table.b_table_id;
```
b_tableのb_table_idがa_tableのb_table_idに対応して、関連させることができる。

### order_by
検索結果の並び替えをおこなうことができる。

###select構文の指定順番
順番を覚えておこう。
順番を間違えるとエラーになってしまう。

```
SELECT ...
FROM ...
WHERE ...
GROUP BY ...
HAVING ...
ORDER BY ...
LIMIT ...
```



### mysql work banch
mysqlが公式で出しているworkbenchというのが
設計する上で便利
https://www-jp.mysql.com/products/workbench/
redisをその場限りで使う話

`redis` の zset がどうしても使いたいけど、そのためだけに常駐させるのは嫌だし、永続化する必要も無いし、
`leveldb` とか `sqlite` とかも代替にならなそうなので、
その場限りで `redis-server` 立ち上げてソケットで繋ぐことにした話。

```bash
#!/bin/bash

set -ue

# バックグラウンドでredis起動
cat <<EOD | redis-server -
daemonize yes
pidfile redis.pid

port 0
bind 127.0.0.1

logfile redis.log
loglevel verbose

unixsocket redis.sock
unixsocketperm 700

timeout 0
databases 16
EOD
# 後始末
trap 'kill $(cat redis.pid)' EXIT

# 立ち上がりを待機
while test ! -S redis.sock; do sleep 1; done

# socket 経由で繋いでみる
redis-cli -s redis.sock <<EOD
set hoge 123
get hoge
EOD
```

やっぱredisだよね、みたいな。
cronの代替jobberをUbuntu14.04にインストール

`cron`だと手が届かない細かい所に手が届く`jobber`のインストール方法です。

http://dshearer.github.io/jobber/

複数サーバーの連携などを行うもっと大規模のだと`Chronos`などがあるんですが、そういうでかいのはいらない時にオススメです。

### インストール
まず公式のヘルプを見ながらインストールします。

https://github.com/dshearer/jobber/blob/master/DEBIAN_UBUNTU.md

一つだけ注意点がありまして

```.sh
go get github.com/dshearer/jobber
```

した時に`no buildable Go source files`と言われますが、`Makefile`を使ってビルドするので無視してOKです。

### サービス化

あとサービスとして起動する`jobberd`という実行ファイルを自分でデーモン化して起動させて上げないといけません。

Ubuntu14.04は`upstart`を使っていますので

`vi /etc/init/jobberd.conf`で

```/etc/init/jobberd.conf
start on filesystem
exec /usr/local/sbin/jobberd
```
と設定して

```.sh
ln -s /etc/init/jobberd.conf /etc/init.d/jobberd
```

とすることで`service`コマンドで使えるようにします。

設定がうまく行っていれば

```.sh
service jobberd start
```

でサービスが正常に起動します。あとは`jobber list`などが正常に動くか確認していきましょう。
クロス・バリデーション (K-fold)

## クロス・バリデーション (K-fold)

クロス・バリデーションは手許のデータのうち、いくらかを訓練データ、残りをテストデータにして分類器の精度を見る検証方法。そのうち、k-fold法は、データをk個に分割し、うちk-1個で訓練し、1個でテストする。そのk通りの訓練およびテストを試して、成績の平均値をその分類器のスコアとする。たとえば、5つのデータを3つに分割した次が参考になる。

```py3
kf = KFold(5, n_folds=3)
for train, test in kf:
    print(train, test)
```

これは、

```
[2 3 4] [0 1] [0 1 4] [2 3] [0 1 2 3] [4]
```

を返す。この数字は、何番目を訓練データ、テストデ―タとするかの添え字(index)になる。たとえば、

```
[2 3 4] [0 1]
```

のときは、

```py3
X(train) = np.numpy([9,0,3],[1,2,-1],[-4,8,3])
y(train) = np.numpy([1,0,0])
```

 と同じことになっている(X, yがどのような数だったか見よ)。また、5つのデータが

```
 01, 23, 4
```

 の3つに分割されているとわかる(テストデータを見ると明白)。上記のコードでは、スコアが

```
 0.0
 0.5
 0.0
```

 と返ってきたので、成績は平均して16.7%だとわかる。実際、

```py3
for train, test in kf:
    X_train, y_train, X_test, y_test = X[train], y[train], X[test], y[test]
    clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
    print(clf.predict(X_test), y_test)
```

とすると、

```
[0 0] [1 1]
[1 1] [1 0]
[1] [0]
```

なので、scoreの正しさを確認できる (ここで、成績はこの2:2:1の加重平均にしなくていいのかという疑問が生じるのだが)。
QNAPのNASで.QsyncフォルダをSMBでもアクセスする

# Qsync とは

QNAP製のNASを買うと入ってるやつです．
Dropboxのように全自動でデバイス間のファイルを同期するサービスで，NASがサーバーになります．

# /home/.Qsync/ がSMBで参照できない問題

NASを多人数が個別に使用する場合，ユーザーごとに自動生成されるホームディレクトリを活用するのがかんたんです．
ホームディレクトリは `/homes/ユーザ名/` ，またはログイン中のユーザなら単に `/home/` という名前で自分のホームディレクトリにアクセスできます．
例えば，別のPCからSMB（Windowsファイル共有）で自分のデータにアクセスする場合は，アカウント認証を経て `\\NASのアドレス\home\` に行けばいいわけです．

SMBでホームディレクトリにアクセスできるのはわかったのですが，Qsyncではホームディレクトリを同期させてくれません．
その代わりに`/home/.Qsync/` というフォルダが各ユーザーに割り当てられるので，このフォルダを同期することになります．

`/home/.Qsync/` というパスからわかるとおり，これはホームディレクトリ内にある隠しフォルダです．見えないだけで実際そこにあります．
ところがSMBで `\\NASのアドレス\home\.Qsync\` にアクセスしようとしても，できません．

# smb.conf を弄ってみる

まずNASのシェルにadminユーザーとしてログインします．NASにキーボードをつなぐなりSSHするなり．

`/home/.Qsync/` を使えなくする設定は， `/etc/config/smb.conf` ファイルの中に書かれています．

```/etc/config/smb.conf
...
veto files = /.AppleDB/.AppleDouble/.AppleDesktop/:2eDS_Store/Network Trash Folder/Temporary Items/TheVolumeSettingsFolder/.@__thumb/.@__desc/:2e*/.@__qini/.Qsync/.@upload_cache/.qsync/.qsync_sn/.@qsys/.streams/.digest/
...
```

拒否ファイルに `.Qsync` と `.qsync` が入っているのがわかります．これらを消してからsmbdを再起動してみます．

```
# /etc/init.d/smb.sh restart
```

おや？　状況は変わりません．一体どうなっているのでしょう．

# veto_file.conf を弄ってみる

もういちど `/etc/config/smb.conf` を開いてみると，内容が編集前に戻っています．どうやら残像を掴まされていたようです．smbdを起動するごとにsmb.confは上書き再構成されるのです．

ではどのように再構成されているのでしょう．smbdの起動スクリプトを見てみましょう．

```bash:/etc/init.d/smb.sh
...
DEFAULT_VETO_FILE="/etc/default_config/veto_file.conf"
...
```

このファイルが大元のようです．

```/etc/default_config/veto_file.conf
[global]
veto files = /.AppleDB/.AppleDouble/.AppleDesktop/:2eDS_Store/Network Trash Folder/Temporary Items/TheVolumeSettingsFolder/.@__thumb/.@__desc/:2e*/.@__qini/.Qsync/.@upload_cache/.qsync/.qsync_sn/.@qsys/.streams/.digest/
```

`.Qsync` と `.qsync` を消してからSMBを再起動してみます．

```
# /etc/init.d/smb.sh restart
```

<img width="215" alt="無題.png" src="https://qiita-image-store.s3.amazonaws.com/0/116137/bd2c074f-f284-cb52-8bd0-f9d45910e522.png">


`\\NASのアドレス\home\.Qsync\` が現れました．隠しフォルダを非表示にしていると見えないかもしれませんが，アドレス直打ちでアクセスできると思います．

# 注意点

デフォルトで `/home/.Qsync/` へのアクセスを拒否する設定になっているということは，SMBでアクセスしてほしくない理由があるということです．
ここで紹介した方法を試したところ，SMB経由で `/home/.Qsync/` に加えた変更がQsyncサービスに検知され，実際に別のPCへ同期されるまでには，かなりの時間を要しました．実際に試す場合は注意してください．
linux基礎



##network

- `netstat -r`
- `route`
この二つのコマンドはネットワークの表示をする
ルーティングの環境を表示する

```
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.0.2.0        *               255.255.255.0   U         0 0          0 eth0
default         10.0.2.2        0.0.0.0         UG        0 0          0 eth0
```

Gatewayが*（アスタリスク）なものは
同じネットワークなのでルーターを経由せずにアクセスできるもの
[参考](http://ips.nekotype.com/1602/)

#### プライベートIPアドレス
DHCPサーバーによって割り振られたIPアドレスのこと。

####  リンクローカルアドレス(Automatic Private IP Addressing)

DHCPサーバが存在しない場合に、ネットワーク内のコンピュータ同士で重複しないようなリンクローカルアドレスのこと

[参考](http://www.arearesearch.co.jp/learn/ip/10.html)




### ホストを設定する

```/etc/hosts

server.example 192.168.100.13
```
を `/etc/hosts`に書き入れることで
`server.example`で`192.168.100.13`にアクセスできるようになる。



## ネットワークモニタリングコマンド

### ping
サーバー間が物理的につながるのかを
確認するコマンド

### traceroute
ネットワーク経路の追跡が行えるコマンド

### nmap
- 空いているポートをスキャンすることに特化したコマンド

- ポートスキャン

- 環境構築をする場合に使用する

- 相手のサーバーのポートを確認できる。
- 企業のサーバーに使用するのはセキュリティ的はよくない


## セキュリティ
sshの公開鍵は
knownhostに公開鍵を含まれる

### scp
`scp -P 2222 test.txt root@localhost:/root/`

- scpでにportを指定する場合は大文字で`-P`とする。
- `scp ローカルのファイル ユーザー名@ホスト名:ディレクトリパス`
よく使うmetaタグ（メモ）

## 文字コード
```html
<meta charset="utf-8">
```

## IEを互換表示させない
```html
<meta http-equiv="X-UA-Compatible" content="IE=edge">
```

## 電話番号の自動リンク無効化
```html
<meta name="format-detection" content="telephone=no">
```

## レスポンシブサイト
```html
<meta name="viewport" content="width=device-width, initial-scale=1">
```

## SEO
```html
<title>タイトル名</title>
<meta name="description" content="全角124文字程度におさめること">
<meta name="keyword" content="5つくらいが最適とされている">
<link rel="canonical" href="URLを正規化したい場合に使用">
```

## OGP
```html
<meta property="og:title" content="">
<meta property="og:type" content="">
<meta property="og:description" content="">
<meta property="og:url" content="">
<meta property="og:image" content="">
<meta property="og:site_name" content="">
```

## TwitterCard
```html
<meta name="twitter:card" content="">
<meta name="twitter:site" content="">
<meta name="twitter:creator" content="">
<meta name="twitter:title" content="">
<meta name="twitter:description" content="">
<meta name="twitter:image:src" content="">
```
jQuery Mobileを使う時の注意事項

jQuery Mobileを用いる時いろいろ不具合があると思いますが、これからわたしが使う時でてきた不具合に基づき、注意事項を共有しようと思います

###1 　jQuery Mobileを引用したのに効かない###
これは、引用の順次が間違っている可能性があります

```html
<script src="/common.js"></script>
<script src="/jquery.mobile-1.4.5.min.js"></script>
```
jQuery Mobileはかならず携帯用のJavaScriptファイルの後ろに追加


###2　 loadingがでまくる###
元ファイルでここを検索して

```jquery.mobile-1.4.5.min.js
...{theme:"a",textVisible:!1,html:"",text:"loading"}...
```

それを

```jquery.mobile-1.4.5.min.js
...{theme:"a",textVisible:!1,html:"",text:""}...
```
に変更

###3　 `<a>`タグが飛ばない###

jQuery Mobileはデフォルトで`<a>`と`<form>`の請求をajaxに変換してしまうので
このように`data-ajax="false"`の属性を追加

```sample.html
<a href="qiita.com" data-ajax="false"></a>
```
ローカルホストで実行中のWebアプリケーションを止めたい


# 背景
自分で実行したWebアプリケーションが"localhost:4567"というURLで動いてるんだが、止め方が分からなくて困った！そんな時の対処法を紹介します。

# 止め方
### まずは、そのWebアプリケーションが実行されているプロセスのID(PID)を突き止める

```
$ lsof -i @localhost:4567
```

### PID見つけた！(97581)
```
COMMAND   PID        USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
ruby    97581 xxxxxxxx   11u  IPv6 0x88050fea7816fa0d      0t0  TCP localhost:tram (LISTEN)
```

## 見つけたプロセスをkillする
```
kill 97581
```

# まとめ
Webアプリケーション開発初心者にはあるあるな事案なんじゃないかと思います(自分自身が何度もはまっているので)。
私も出来てないけど、エンジニアのブログを読んでいて気付いたこと

# 最初に
スライドモードを使用しています。
閲覧もスライドモードを想定しています。
ネタや画像は入れてません。

# ブログを書いて終わりにしていませんか？
学生の頃に「ノートはきれいに取りなさい」と指導された事はありませんか？
私なんかはそれで、「とりあえずやって満足」というところがありました。

しかし、これは良くないです。

***

# これからはブログは書いて「見せる」ことが大事
Qiitaに書く目的は色々ありますが、ブログよりフィードバックを得やすい環境にある以上、見せる事を考えながら作る必要があるでしょう。
これは[良い記事を書くためのガイドライン(Qiita:Support)](http://help.qiita.com/ja/articles/qiita-article-guideline)にもある通り、良質なコンテンツを提供するためにも必要な事です。

***

## エンジニアのブログを読んでいて気付いた事

***

## 実例　よくあるケース

「〇〇について更新しました！」
と言われればとりあえず見に行きます。
RSSも登録してるし、最新情報はバッチリ！
→これは間違いない

***

## 実例　過去の〇〇についての記事

「確か〇〇について書いてた**ブログがあったよね……？**」

→これが見つからない。

***

# ブログは後からも読まれるものです。
公開直後は瞬間風速もありますが、後から読まれるものはブログの見やすさにもよります。
前者は人気・知名度ですが後者は利用のしやすさにあると思います。
技術系のブログなんかは、新入社員の方？とかが検索してやってくることも結構多いです。

***

## 今のうちにブログの構成を見直しましょう。

とりあえずWordPress？
エンジニアブログを見ていると、過去の情報を取り出す仕組みが非常に弱い。
結果として、Qiitaの記事は読むけどブログは読まない、なんて事も……。

**Wordpressは運用を考えないと効果的に使うのは難しい。**

***

## Q.どうすれば良いのか？
A.1.WordPressのテーマやプラグインを見直す
→根本的な解決策としては弱い……
A.2.WordPress以外のCMSを考えてみる
→技術の内容ごとにマルチブログにしてしまう

***

## adiaryにするとどうなるの？
こうなります。

- [従来型：技術的なテーマについて書いたブログ](http://field-city.xsrv.jp/nomura/iot/)
- [今後の提案：上記を使って技術をまとめたブログ](http://field-city.xsrv.jp/nomura/adiary/)
- [今後の提案：上記を使って技術をまとめたブログ](http://field-city.xsrv.jp/nomura//)

なんちゃってで作ってるので今はコンテンツが弱いです、すみません……

***

### 解説
- 従来型：なんかもういっぱいでごちゃごちゃ
- 提案：何についての話なのかフォーカスしてみた

最初の段階でここまでやれれば楽なんだけど……
実際は運用していくなかでダラダラやっちゃう

***

## どこかで思い切ってブログを捨ててみては？
Qiitaが優秀なのは、最初からこういう観点でタグ付けを明確化出来る事にあると思ってます。
エンジニアブログでも同じように、大体の感覚でタグ付けできたり、普段から整理整頓が出来ればブログでやってていいと思います。

***

## Qiitaで学ぶべきこと
**整理整頓の仕方**

これに尽きると思う。

***

## どうやって整理整頓をしていけば良いのだろうか？
永遠の課題。
その時の流行りものや状況によって分類のアプローチも異なると思う。

大切なのは、「どの立場の人がどんな時にブログを読むのか」考えてみること？

***

### 提案
分類を考えるより言語ベースでブログ自体を分けておいて、必要な時にタグやキーワードを足してあげる仕組みを作っておくのはどうか？

- 言語も複数扱いたいよね→マルチブログが理想？
- 言語によってFWとかツールとか違うよね？→それぞれのブログで管理できる仕組みを

***

### WordPressよりadiaryかなぁ
adiaryで出来ることはさっきの提案のブログにて。
後ほど、別の記事をQiitaに書くと思います。
Authorization codeを利用したMastodon APIを利用するためのaccess tokenの取得

API DocumentにあるOAuth2.0でaccess tokenを取得するための例がpasswordを使うもので, authorization\_codeでやりとりするにはどうすればいいのかぱっと見わからなかったので, 色々漁ってみた備忘録.


# client\_id と client\_secretの取得

まずはclient\_idとclient\_secretを貰います. "https://$YOUR_MASTODON_HOST/api/v1/apps" にPOSTメソッドでパラメータと共にリクエスト投げて返ってくるjsonにclient\_idとclient\_secretがあるのでそれを保持.

パラメータは以下

-   client\_name: クライアント名. 多分好きな名前を入れていいと思います.
-   redirect\_uri: リダイレクト先. 特になければ urn:ietf:wg:oauth:2.0:oob を指定しておきます.
-   scopes: アクセス範囲. read write followがあるらしい.

curlで叩くと以下のような雰囲気.

```sh
# YOUR_MASTODON_HOSTにはご自分がアクセスしたいMastodonインスタンスを指定してください(mstdn.jp等)
# YOUR_CLIENT_NAMEには自分が使いたいクライアント名を入れてください
curl -X POST -sS https://$YOUR_MASTODON_HOST/api/v1/apps -F "client_name=YOUR_CLIENT_NAME" -F "redirect_uris=urn:ietf:wg:oauth:2.0:oob" -F "scopes=read write follow"
```

ただしくレスポンスが返ると以下のようなjsonがやってきます.

```javascript
// id, client_id, client_secretは伏せ字です.
{"id":xxxxx,
 "redirect_uri":"urn:ietf:wg:oauth:2.0:oob",
 "client_id":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
 "client_secret":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
```

idはそのリクエストのidで数値です. これ同じリクエスト投げ続けるとidがどんどん変わっていくし, client\_id, client\_secretもその都度変わります.


# authorization\_codeの取得

取得したclient\_idを使って, authorization\_codeを取得します.

-   client\_id: 先程取得したclient\_id
-   response\_type: code
-   redirect\_uri: リダイレクト先. 特になければ urn:ietf:wg:oauth:2.0:oob を指定しておきます.
-   scopes: アクセス範囲. 先程指定したものと同じ物を指定.

上記のパラメータをurl encodeした物を, "https://$YOUR_MASTODON_HOST/oauth/authorize?" にくっつけてブラウザ上で叩きます.

```sh
# macOSのターミナルから指定のURLを既定のブラウザを開く
open https://$YOUR_MASTODON_HOST/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxxxxxx&response_type=code&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=read%20write%20follow
```

ブラウザ上で承認すると, authorization\_codeが表示されるので, それを保持します.


# access tokenの取得

ここまでで, client\_id, client\_secret, authorization\_codeが揃っているので, grant\_type=authorization\_codeでaccess\_tokenを取得できるようになりました. /oauth/token APIに対してPOSTメソッドでリクエストしてaccess tokenを取得しましょう.

POSTメソッドに渡すパラメータは以下の通り

-   grant\_type: authorization\_code を指定
-   redirect\_uri: リダイレクト先. 特になければ urn:ietf:wg:oauth:2.0:oob を指定しておきます.
-   client\_id: 取得したclient\_id
-   client\_secret: 取得したclient\_secret
-   code: 取得したauthorization\_code

curlで叩くと以下のような雰囲気になります.

```sh
curl -X POST -sS https://$YOUR_MASTODON_HOST/oauth/token -F "grant_type=authorization_code" -F "redirect_uri=urn:ietf:wg:oauth:2.0:oob" -F "client_id=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" -F "client_secret=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" -F "code=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
```

うまくいくと以下のようなレスポンスが返ります.

```javascript
{"access_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"token_type":"bearer",
"scope":"read write follow",
"created_at":1234567890}
```
【読書ノート】《C# in Depth》～3

日本語で投稿してくださいって言われましたので、ここから日本語で書きましょう。:frowning2:

ジェネリックの誕生:ocean:
何故ジェネリックが存在するのか？知りたいでしょう！？

要求：ArrayListをソーティングする

C#1の書き方を見てみましょう（非ジェネリック）

```csharp
class ProductNameComparer : IComparer
{
  public int Compare(object x, object y)
  {
    Product first = (Product)x;
    Product second = (Product)y;
    return first.name.CompareTo(second.Name);
  }
}

ArrayList products = Product.GetSampleProducts();
products.Sort(new ProductNameComparer ());
foreach (Product product in products)
{
  Console.WriteLine(product);
}
```

若し、GetSampleProductの戻り値はstringの場合、エラーが発生してしまう。原因はstringをProduct型に強制変換しようとする。

C#2の書き方を見てみましょう、ジェネリックを使うと上記の問題をクリアする事が出来ます。:point_up_tone4:


```csharp
class ProductNameComparer : IComparer<Product>
{
  public int Compare(Product x, Product y)
  {
    return x.Name.CompareTo(y.Name);
  }

  List<Product> products = Product.GetSampleProducts();
  products.Sort(new ProductNameComparer());
  foreach (Product product in products)
  {
    Console.WriteLine(product);
  }
}
```

ソースが少なくなりました、嬉しいでしょう！　そして、最初に渡されたパラメーターはProduct型です、強制変換しなくでもいい。

確かにC#2はC#1より良くなりました、でも、私は直接に商品(Product)をソーティングしたいですが、インタフェースを使わずに実現できるかな？
答えは出来ます、デリゲートを使えば実現出来ます。

```csharp
List<Product> products = Product.GetSampleProducts();
products.Sort(delegate(Product x, Product y))
              { return x.Name.CompareTo(y.Name);}
             );
foreach (Product product in products)
{
  Console.WriteLine(product);
}
```

OK,いい感じでしょう？　次はC#3のソースを見てみましょう

```csharp
List<Product> products = Product.GetSampleProducts();
products.Sort(x,y) => x.Name.CompareTo(y.Name));
foreach(Product product in products)
{
  Console.WriteLine(product);
}
```

=>　は伝説のLambda式（ラムダ式）　　delegateを省略された。

C#3はそれだけじゃなく、OrderByを使ってソーティングする

```csharp
List<Product> products = Product.GetSampleProducts();
foreach(Product product in products.OrderBy(p => p.Name))
{
  Console.WriteLine(product);
}
```
:kissing_heart: :kissing_heart: :kissing_heart: :kissing_heart:すすすすごいでしょう。Write Less Do More !!!
A-Frameを使えば使うほどiOSが嫌いになる

(A-Frame v0.5.0 / iOS 10.2.1での検証結果です)
WebVRフレームワークのA-Frameを使ったアプリケーションを開発していたのですが、以下のような点でiOSのブラウザへの対処に苦労しました。
iOSでは独自実装のブラウザの配信が事実上できないためAndroidのようにこのブラウザを使ってくださいとも言えないんですよね・・・。

# 一部機種でVRモードでアドレスバーが消えない

[一応対処することはできた](http://qiita.com/nanananakam/items/5ffef864b0025e0de52d)のですが、この方法でも横向きにするように指示する画面の表示がおかしくなるのと、時々スクロールバーが出てくるので完全な対処にはなってません。

ちなみにAndroid一部機種の標準ブラウザでも発生しますがAndroidではGoogle Chromeを使ってくださいということで。

# fuse-based cursorによるclickで音声を再生することができない

AndroidでもiOSでもブラウザでの音声や動画の再生はユーザーのアクションをトリガーにした場合のみしかできないという制約がありますが、iOSではA-Frame上のfuse-based cursorによって発火されたclickアクションでは音声の再生ができません(Google Chrome for Androidではできました)

これに関しては対処法を見つけられませんでした。

# ちなみに
A-Frameのソースコードを読んでいるとiOSに対処するためのコードのコメントに

```
// *sigh* Just fake it.
```

とか

```
/**
 * This is only needed if we are in an cross origin iframe on iOS to work around
 * this issue: https://bugs.webkit.org/show_bug.cgi?id=152299.
 */
```

とか

```
  // "To the last I grapple with thee;
  //  from hell's heart I stab at thee;
  //  for hate's sake I spit my last breath at thee."
  // -- Moby Dick, by Herman Melville
```

とか見えます。

A-Frame開発者の方も苦労されているようです。
border-imageを使うときborder-radiusが効かない

こんなふうに書く人多いと思うんですけど

```button.css

#button { 
    border-image-source: linear-gradient(90deg, red, blue);
    border-radius: 15px;
}

```

これは効かないんですね
この下のように書けば、widthが1の丸角のボーダーが作れます

```button.css

#button { 
    position: relative;
    background-color:white;
    border-radius: 15px;
}

#button::after {
    position: absolute;
    top: -1px; bottom: -1px;
    left: -1px; right: -1px;
    background: linear-gradient(90deg, red, blue);
    content: '';
    z-index: -1;
    border-radius: 16px;
}

```
onlineTool > link > SQL Tryit Editor v1.5

SQLは1998年頃から3年間アルバイトで使った。
当時の環境Microsoft AccessでVisualBasicだったような。

SQL構文はほとんど忘れたので、練習用にオンラインで試せるものを探してみた。
[SQL Tryit Editor](https://www.w3schools.com/sql/trysql.asp?filename=trysql_op_in)

SQL構文のサイトは色々ありそうであるが、上記のサイトにも掲載されている。
https://www.w3schools.com/sql/

Quizがあり、試したところ
> Result:
> 21 of 25
84%
You can be proud of yourself!
>
Time Spent 4:48
Windowsにてrake db:resetができない

# 失敗したときのログ
Windows環境でdbのリセットを行おうとしたときに、db:resetが失敗した

```
C:\Users\KTakata\Desktop\tool>bundle exec rake db:reset
Permission denied @ unlink_internal - C:/Users/KTakata/Desktop/tool/db/development.sqlite3
Couldn't drop database 'db/development.sqlite3'
rake aborted!
Errno::EACCES: Permission denied @ unlink_internal - C:/Users/KTakata/Desktop/tool/db/development.sqlite3

Tasks: TOP => db:drop:_unsafe
(See full trace by running task with --trace)
```
Dropに失敗していた...

# Permission denied
Errorを見る限り、development.sqlite3をどこかのプロセスがつかんでいるようだ...

他に起動しているアプリを全て閉じて再実行⇒失敗
PCを再起動して再実行⇒失敗

どないせいっちゅうじゃいん...:umbrella2:

そんなときはErrorMessageを読み返してみよう

```
...(略)...
Tasks: TOP => db:drop:_unsafe
(See full trace by running task with --trace)
```

ん？？

# option :_unsafeを指定して実行
```
C:\Users\KTakata\Desktop\tool>bundle exec rake db:drop:_unsafe
Dropped database 'db/development.sqlite3'
DEPRECATION WARNING: Passing #original_exception is deprecated and has no effect. Exceptions will automatically capture the original exception. (called from load at C:/Ruby24-x64
in/rake:22)
Database 'db/test.sqlite3' does not exist
```
Dropが成功したっぽいぞ？

# migrate実施
```
C:\Users\KTakata\Desktop\tool>bundle exec rake db:migrate
== 20170308082654 CreateUsers: migrating ======================================
-- create_table(:users)
...(略)...
== 20170419060402 ChangeNameToProject: migrated (0.0428s) ============
```

Migrateが最初から実施された⇒Dropに成功してた...

# まとめ
どこのプロセスがdevelopment.sqlite3をつかんでいるかはわからなかったが、最後の手段として:_unsafeと言う手がある。
ただし、読んで字の如しなのであまり多様はしたくないところですね。
admin-on-restで画像以外のファイルをアップロードする

# はじめに

[admin-on-rest](https://github.com/marmelab/admin-on-rest)はReactベースでかかれた管理画面用コンポーネント集で、REST APIを前提としていて割とデフォルトでよしなにやってくれていい感じのライブラリ。

しかし、けっこうレールがかっちりしてて、カスタマイズ性も割とあるんだけどレールを外れる際は割とめんどくさい。
そんな中で、ファイルのアップロードという基本的なことに対応してなかったりもしていて、

![SS_ 2017-04-19 15.03.56.png](https://qiita-image-store.s3.amazonaws.com/0/2648/9fa2653f-21c4-4590-c06d-31d7108f7266.png)
https://github.com/marmelab/admin-on-rest/issues/564

という状態。

とりあえずPR送るほどは洗練できてないけどとりあえず素朴にファイルアップロードができる状態はできたので記録しておく。

# TL;DR

'redux-form'のField使ってコンポーネントつくって、
FormDataベースのREST Clientをかく 

gist
https://gist.github.com/maruware/edcf91e08f083e9354e431ad561b6f99

# 問題

タイトルで"画像以外"と書いたように、画像についてはImageInputというD&Dしてサムネも展開されて、というリッチなアップローダーがある。

![ImageInput](https://cloud.githubusercontent.com/assets/688373/19227828/28355562-8ebf-11e6-9f66-a750df17712f.gif)
https://github.com/marmelab/admin-on-rest/pull/77

上記のPRの中にも記述があるが、最終的にREST Clientまわりで画像ファイルをBase64してPUTしている。
なぜかというとREST Clientで用意されている2つの実装（simple, jsonServer）がJSONリクエストベースになっているから。

しかし、動画ファイルのような大きなファイルをBase64するのは重すぎる。

ということで

* 独自にInput用のコンポーネントをつくる必要
* FormDataベースのREST Clientを実装する必要

がある。

# 解決

admin-on-restのドキュメントに

>### Writing Your Own Input Component
If you need a more specific input type, you can also write it yourself. You’ll have to rely on redux-form’s <Field> component, so as to handle the value update cycle.
https://marmelab.com/admin-on-rest/Inputs.html#writing-your-own-input-component

とあるように、
redux-formのFieldを使ってコンポーネントをつくる。

あとはFormDataベースのREST Clientをかけばいける。

くわしくは[gist](https://gist.github.com/maruware/edcf91e08f083e9354e431ad561b6f99)参照
MySQLのコマンド[いまの状況確認編]


# はじめに
MySQLを使っていく上で覚えなきゃいけないコマンドはたくさんあります。その中でも今回は、「いまどんなテーブルがあるんだっけ・・・？」「いまどのデータベースで作業してるんだっけ・・・？」といった、いまの状況を確認したいときに使うコマンドをまとめました。

#いまの状況確認コマンド
### どんなデータベースがあるんだっけ？
```
show databases;
```
### どんなテーブルがあるんだっけ？
```
show tables;
```
### このテーブルどんなカラム構成になってるんだっけ？
```
show columns from 'tablename';
```
```
show create table 'tablename';
```
### サーバーのバージョンなんだっけ？
```
select version();
```
### いまどのデータベースで作業してるんだっけ？
```
select database();
```
### いまどのユーザーで接続してるんだっけ？
```
select user();
```
### クライアントのステータスが知りたい！
```
status;
```

# まとめ
この辺をスムーズに使えるようになるところが、MySQLを使いこなせるようになる第一歩かなと。
UnityでPepperのカメラ画像を取得して表示してみた

Unityのお勉強のためにPepperのカメラ画像を取得して表示してみた。

## 前提

* Pepperの操作には以下のライブラリを利用させていただく。
 * [UnityEngine用のPepper操作ライブラリを公開しました – Bakulog](http://www.baku-dreameater.net/archives/10791)
 * 読み込みは[[Unity]パッケージの作成＆読み込み | CHO DESIGN LAB](http://www.cho-design-lab.com/2013/08/05/unity-package-save-load/)あたり参照

* PepperのAPIは[ALVideoDeviceProxy::getImageRemote()](http://doc.aldebaran.com/2-5/naoqi/vision/alvideodevice-api.html#ALVideoDeviceProxy::getImageRemote__ssCR)を利用する。
 * 事前に[ALVideoDeviceProxy::subscribeCamera()](http://doc.aldebaran.com/2-5/naoqi/vision/alvideodevice-api.html#ALVideoDeviceProxy::subscribeCamera__ssCR.iCR.iCR.iCR.iCR)を実行する必要あり

# 環境

* Unity 5.5.2f1 personal
* Pepper NAOqi Version 2.5.5.5
* LibqiUnity_ver3.01_alpha

## 書いてみたコード

RawImageに表示させてみた。
そのままだと反対の表示になってしまうので180度回転させている。

```csharp
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
using Baku.LibqiDotNet;
using Baku.LibqiDotNet.Service;
using Libqi = Baku.LibqiDotNet.Libqi;

public class PepperAccessor : MonoBehaviour {
	public UnityEngine.UI.RawImage imageUi;

	// Use this for initialization
	void Start () {
		GetImage ();
	}
	
	// Update is called once per frame
	void Update () {
	}

	private void GetImage() {
		QiSession session = new QiSessionFactory().CreateSocketIoSession();
		try {
			session.Connect("XX.XX.XX.XX");
			if (!session.IsConnected)
			{
				Debug.Log("Failed to connect");
				return;
			}
			ALVideoDevice video = ALVideoDevice.CreateService (session);

			string camera_id = "camera";
			// カメラを設定
			// Name：
			// CameraIndex：top camera指定
			// Resolution：Image of 160*120px指定
			// ColorSpace：Buffer contains triplet on the format 0xBBGGRR, equivalent to three unsigned char指定
			// Fps：とりあえず30fps指定
			string videoHandle = video.SubscribeCamera (camera_id, 0, 0, 11, 30);
			try {
				IQiResult result = video.GetImageRemote (videoHandle);
				try {
					byte[] image = result [6].ToBytes ();
					int width = result [0].ToInt32 ();
					int height = result [1].ToInt32 ();

					Texture2D texture = new Texture2D (width, height, TextureFormat.RGB24, false);
					texture.LoadRawTextureData (image);
					texture.Apply ();
					imageUi.texture = texture;
				}
				finally {
					video.ReleaseImage(camera_id);
				}
			}
			finally {
				video.Unsubscribe (camera_id);
			}
		}
		finally {
			session.Close ();
		}
	}
}
```

## やってみた感想

* 取得画像を640 x 480とかにするとかなり遅くなる。
* Pepperの画像種別指定とTexture2Dへの渡し方で結構苦労した。
* [画像をYUVとかにするとパフォーマンスが良くなるみたい](http://doc.aldebaran.com/2-1/naoqi/vision/alvideodevice.html#performances-and-limitations)だが現状はtexture2Dへ渡せない？
Ubuntu 16.04でWi-Fiアクセスポイント（ルータ）化＋はまった点メモ

# はじめに

Ubuntu 歴3日の ishihatta です。初 Qiita 投稿です。
小型のローカルサーバを立ててかつそのサーバを Wi-Fi アクセスポイント化（Wi-Fiルータ化）する必要があったためそのときのメモを残します。
誰かの役に立てば幸いです。

# 構成

ハードウェア

- Intel NUC6CAYH
- メモリ4GB
- HDD 1TB

OS

- Ubuntu 日本語 Remix 16.04 LTS

# 手順

## ハードの組み立てとOSのインストールと初期設定とパッケージのアップデート

省略

## 無線LANデバイスの有効化

NUC6CAYH が内蔵している無線LANデバイス（AC3168）は比較的新しいものらしく、Ubuntu 16.04 はそのままでは認識してくれず。ググったところ、この無線LANデバイスを認識できるのは Kernel 4.6 以上らしい。Ubuntu 16.04 はデフォでは Kernel 4.4 なので[こちらの記事](https://askubuntu.com/questions/868075/how-to-get-intel-dual-band-wireless-ac-3168-work-on-ubuntu-16-04)を参考に 4.8 にアップグレード。具体的には以下の通り（最後の一行はいらないかも）。

```
sudo apt update
sudo apt install linux-generic-hwe-16.04
sudo apt update && sudo apt upgrade
```

これで reboot したところ Wi-Fi が有効になりました。めでたしたし。

## アクセスポイント化

以下の手順で GUI からアクセスポイント化（ Wi-Fi ルータと同等の機能を有効化）できます。

1. デスクトップ右上にあるネットワークマネージャのアイコンをクリック→「Wi-Fiを有効にする」のチェックを外す。
2. 同様にネットワークマネージャ→「接続を編集する...」クリック。
3. 「Add」クリック。
4. 接続の種類に「Wi-Fi」を選択して「作成...」をクリック。
5. 接続名の欄に分かりやすい名前を入力し、モードを「HotSpot」に変更し、SSID欄に適当なSSIDを入力。
6. 「Wi-Fi セキュリティ」タブを開いてセキュリティを「WPA & WPA2 Personal」に変更し、パスワードを入力。
7. 「保存」クリック。

以上であなたの Ununtu マシンは Wi-Fi ルータと化します。

**すごーい！あなたは GUI から Wi-Fi ルータになれる Ubuntu なんだね！**

本来は無線LANのモード変更だけでなく DHCP サーバを導入して設定して IPTABLES をごちゃごちゃ設定してとかやらなきゃいけないはずだけど、全部やってくれちゃってるらしいです。ありがたやー。
ただこれだとブリッジにできないっぽいのがちょっと気になります。でも今回はルータにできればいいから掘り下げないです。

# はまった点

実は最初は GUI からできるとは露とも知らず、[こちらの記事](http://qiita.com/8mamo10/items/59adae2c9f286e041792)などを参考に hostapd とか isc-dhcp-server とかせっせと入れてたんだけど、どうやっても動かなかったのです。

そうこうしてるうちに上で書いたように GUI から設定できることに気づいて、無事アクセスポイント化できたんだけど、、、 reboot するとなぜか動かなくなる（アクセスポイントが見えなくなる）。このとき、ネットワークマネージャから Wi-Fi をいったん無効化して再度有効化すると正常に動くようになる。でも reboot するとやっぱり動かなくなる。

なんじゃこりゃーーー！！

ってなことで1時間ほどハマったわけです。
もうお分かりかと思いますが、原因は先に入れた hostapd と isc-dhcp-server （のどちらかまたは両方）でした。これらを remove したら reboot してもアクセスポイントのまま動いてくれるようになりました。お粗末なりー。
Vanilla JSはジョークフレームワーク。普通のJSのこと。

# Vanilla JS とは
単に**JavaScript**のことです。ネイティブの**JavaScript**。

**Pure JS**と言ったりもします。

Vanilla JSは、JavaScriptだけでいろいろできるのにフレームワークありきで考える風潮を皮肉った**ジョークフレームワーク**です。

# Vanilla JS
公式
http://vanilla-js.com/
日本語記事
http://creatorhyp.com/tips/coding/vanillajs/


# なぜこんな無粋な記事を書いたか
Vanila JSでググると、普通のフレームワークっぽく説明している記事が出てきて、最後まで読んで、あ、そういうジョークね。と分かります。

JS界隈はいろいろ新しいものが出てきていて、調べるのも大変です。そんな中で、少しでも無駄な時間が減ればいいと思い、書きました。
react es6 bind記述パターン

es6記法でReactComponentを使う場合のbind記述パターンはいくつかある

# 1. constructorでbind(this)する
この書き方が一番多い気がする

```
import { Component } from 'react'

class Sample extends Component {
  constructor() {
    super();
    this._handleClick = this._handleClick.bind(this);
  }
}
```

# 2. Allow functionを使う

```
import { Component } from 'react'

class Sample extends Component {
  constructor() {
    super();
  }

  _handleClick = () => console.log("click!!")

  return (
    <div onClick={this._handleClick}>click</div>
  )
}
```

# 3. es7の::を使う

```
import { Component } from 'react'

class Sample extends Component {
  constructor() {
    super();
  }

  _handleClick() {
    console.log("click!!")
  } 

  return (
    <div onClick={::this._handleClick}>click</div>
  )
}
```

※::対応ではうまくbindできないケースもありましたので、確実なのは1か2。

# 4.おまけ
1の書き方をしている派が多いようにみえるが、bindするメソッドが多い場合に
bind(this)をひたすら書くのは美しくないのでloadshのforEachを使う

```
import { Component } from 'react'
import _ from 'lodash'

class Sample extends Component {
  constructor() {
    super();
  }
  _.forEach([
      '_method1',
      '_method2',
      '_method3'
  ], (method) => {
      this[method] = this[method].bind(this);
  });
}
```
VSCode 用の launch.json でデバッグコマンドに環境変数 / 引数 / フラグを渡す設定

# 環境変数を渡す

```json
"env": {
    "FIRST_NAME": "yuma",
    "LAST_NAME": "inaura"
}
```

以下のような状態でコマンドが走ることになる。

```bash
FIRST_NAME=yuma LAST_NAME=inaura command
```

# 引数を渡す

```json
"args": ["yuma","inaura"]
```

以下のようなコマンドが走ることになる。

```bash
command yuma inaura
```

# コマンドのフラグを渡す

これも args に指定できる。

```json
"args": ["--first_name=yuma","--last_name=inaura"]
```

以下のようなコマンドが走ることになる。

```bash
command --first_name=yuma --last_name=inaura
```

# ファイル例

```go
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Debug",
            "type": "go",
            "request": "launch",
            "mode": "debug",
            "remotePath": "",
            "program": "${workspaceRoot}/some_package/cmd/name",
            "env": {
                "GOPATH": "/Users/yinaura/go",
            },
	        "args": ["yuma","--last_name=inaura"],
            "showLog": true
        }
    ]
}
```

# 環境

- VsCode 1.11.2
- MacOs Sierra 10.12.3








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[MySQL]データベース上にサンプルデータを追加するRubyスクリプト


# はじめに
この記事では、MySQLを使ってテーブルを作るところから、Rubyスクリプトでサンプルデータをデータベースに追加するところまでを紹介します。
ちなみに環境はこんな感じです。

```
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.18, for osx10.12 (x86_64) using  EditLine wrapper
```

作りたいテーブルはこんな感じ。
**データベース名：chatroom**
**テーブル名：users**

|カラム名|内容|
|:---:|:---:|
|user_id|int, unsigned, not null|
|name|varchar(20), not null|
|password|char(64), not null|
|prefectures|varchar(20), not null|

追加したいサンプルデータはこんな感じ。

|user_id|name|password|prefectures|
|:---:|:---:|:---:|:---:|
|1|shinichi|hoge|gunma|
|2|ran|fuga|saitama|
|3|sonoko|fizz|ibaraki|
|4|kogoro|buzz|tokyo|
|5|ai|ping|kyoto|

# まずは、MySQLでテーブルを作ろう
#### MySQLに接続
```
$ mysql -uroot
```
#### データベース作成
```
mysql> create database if not exists chatroom;
```
#### データベースが作成できたか確認
```
mysql> show databases;
```
#### データベースへ接続
```
mysql> use chatroom;
```
#### テーブル作成
```
mysql> create table users (
    -> user_id int unsigned not null,
    -> name varchar(20) not null,
    -> password char(64) not null,
    -> prefectures varchar(256) not null
    -> )engine = InnoDB;
```
#### プライマリーキー設定
```
mysql> alter table users add primary key (user_id);
```

#### テーブルが作成できたか確認
```
mysql> show tables;
```
#### カラムの内容を確認
```
mysql> show columns from users;
```

# つづいて、サンプルデータを追加していこう
#### [ruby-mysql](https://github.com/tmtm/ruby-mysql)を導入
```
$ sudo gem install ruby-mysql
```
#### Rubyスクリプトを書く
``` ruby:sampledata.rb
require 'mysql' #ruby-mysql
require 'digest/sha1' #passwordをSHA1でハッシュ化するために必要

# サンプルデータ
names = ['shinichi','ran','sonoko','kogoro','ai'] 
passwords = ['hoge','fuga','fizz','buzz','ping']
prefectures = ['gunma','saitama','ibaraki','tokyo','kyoto']

# MySQLに接続
client = Mysql.connect("127.0.0.1","root","","chatroom") 
#引数：(ホスト名/IPアドレス(127.0.0.1→localhost), ユーザー名, パスワード(最初は設定されてない), データベース名)

# INSERT文
# ここでは値が入る部分を?で設定する
query = client.prepare('insert into users values (?,?,?,?)')

range = 0..4 #4:追加したいデータ数-1
range.each do |num|
  # ここINSERTしたい値を実際に指定している
  query.execute num+1, names[num], Digest::SHA1.hexdigest(passwords[num]), prefectures[num]
  # Digest::SHA1.hexdigest() → 値をSHA1でハッシュ化する関数
  # 今回はpasswordをハッシュ化してからDBに入れています
end
```
#### スクリプトを実行 
```
$ ruby sampledata.rb
```
#### サンプルデータが追加されたか確認
```
mysql> select * from users;
```

# まとめ
多くのサンプルデータを毎回SQL文で打ち込むのは大変です。スクリプトを使えばだいぶ効率化すると思います。
【QuickFIX】08 通貨ペア要求 <x> SecurityListRequest

利用可能な通貨ペアのリストを要求します

とりあえず、リストくれ！って要求だけを投げ込みます


## メッセージ送信部分 < x > SecurityListRequest
```cpp:send_x__SecurityListRequest.cpp
#include "config.h"

#include "Application.h"
#include "quickfix/Session.h"
#include <iostream>

/* x  */
void Application::SecurityListRequest()
{
  FIX44::SecurityListRequest message(
    /* 320  */ FIX::SecurityReqID( "SecListReq_" + YmdHMSs() ),
    /* 559  */ FIX::SecurityListRequestType( FIX::SecurityListRequestType_SYMBOL ) /* 0 Only */
  );
  SetMessageHeader( message );
  FIX::Session::sendToTarget( message );
  std::cout << "<x> SecurityListRequest: " << std::endl << message.toXML() << std::endl;
}

```

リクエストIDに適当な文字列として日時を設定
リクエストタイプは通貨ペア（SecurityListRequestType_SYMBOL）を設定

sendToTarget で Currenex サーバに要求を投げ込みます


コメントの数字はFIXの仕様と一致してます。
ここらへん
  http://fiximate.fixtrading.org/en/FIX.4.4/tag320.html
  http://fiximate.fixtrading.org/en/FIX.4.4/tag559.html


メッセージの仕様はこんな感じ
http://fiximate.fixtrading.org/en/FIX.4.4/body_5355120.html




---

＜前 [【QuickFIX】07 セッション開始 <h> TradingSessionStatus](https://qiita.com/nobu-maple/items/98369bad8351cb662740)
次＞ [【QuickFIX】09 通貨ペア取得 <y> SecurityList](https://qiita.com/nobu-maple/items/66feda02d9a717bd31b9)

---
# 一覧
[01 サンプルのコンパイル](https://qiita.com/nobu-maple/items/051188f21efc59429808)
[02 ログイン時にPassword(554)を送信](https://qiita.com/nobu-maple/items/649f1fd2525523f12064)
[03 送受信ログをMySQLに保存](https://qiita.com/nobu-maple/items/cc943f0c1028f21161c0)
[04 情報保存用にMySQLコネクションを保持..他](https://qiita.com/nobu-maple/items/cfe505ad984e16d46af9)
[05 各種メッセージの枠を作成](https://qiita.com/nobu-maple/items/770d8da8c50c4f5a5a54)
[06 独自メッセージ仕様](https://qiita.com/nobu-maple/items/580815f3c304d96bde31)
[07 セッション開始 <h> TradingSessionStatus](https://qiita.com/nobu-maple/items/98369bad8351cb662740)
[08 通貨ペア要求 <x> SecurityListRequest](https://qiita.com/nobu-maple/items/ba0fb7175c378bc4c608)
[09 通貨ペア取得 <y> SecurityList](https://qiita.com/nobu-maple/items/66feda02d9a717bd31b9)
[10 デモ環境サーバへ接続](https://qiita.com/nobu-maple/items/52de92892a03f59c7368)
[11 ログ出力設定](https://qiita.com/nobu-maple/items/828d3859ebf2ab2237f8)
[12 マーケット情報要求 < V > MarketDataRequest](https://qiita.com/nobu-maple/items/1c4f2d27cabde8eff713)
[13 マーケット情報受信 < X > MarketDataIncrementalRefresh](https://qiita.com/nobu-maple/items/eb7855841000eb2b0f04)
[14 口座情報要求 < AN > RequestForPositions](https://qiita.com/nobu-maple/items/30c286f8dbf1e9b0e173)
[15 口座情報取得 < AZ > CollateralResponse](https://qiita.com/nobu-maple/items/a16e3c787ef5e83f3971)

---
tomcatインストール


Tomcat 8をインストール

javaをインストール
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

![image](https://qiita-image-store.s3.amazonaws.com/0/135925/acbad20d-4650-2d7a-d883-a6c855c5b34c.png)



ダウンロード
http://tomcat.apache.org/download-80.cgi

![image](https://qiita-image-store.s3.amazonaws.com/0/135925/7f1d47df-3ead-d3e3-fabf-44c0723a0ae2.png)

実行する

![image](https://qiita-image-store.s3.amazonaws.com/0/135925/516bdd06-5e2f-49e8-f6fa-f886b8c3a668.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/135925/6fb231c3-7e01-a035-2d98-bda358b89d23.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/135925/3e4a6832-6795-2975-ddf0-d445261c2d2d.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/135925/930933d1-6915-7445-7648-bee375e64224.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/135925/9ad5347c-342a-6a0a-9855-966bef9ef540.png)
javaがインストールされているフォルダ

![image](https://qiita-image-store.s3.amazonaws.com/0/135925/a86a6204-b5b5-92a7-275e-20b40dfc984f.png)
このフォルダにTomcatがインストールされます。メモに控えておいてください。
インストールボタンを押します。

![image](https://qiita-image-store.s3.amazonaws.com/0/135925/d2311cbf-b313-4dfb-3c49-a7fb42dcb268.png)
そのままFinishボタンで終了です

以下のURLにアクセスしてください
http://localhost:8080/

![image](https://qiita-image-store.s3.amazonaws.com/0/135925/c5c843ba-099a-fd59-b334-d44c92c92613.png)
ELB を経由すると keepalive ヘッダーが勝手に付与される

AWS Elastic Load Balance 配下にぶら下がっている EC2 インスタンスのベンチマークを、keepalive on/off それぞれの状態で取ろうとしたのですが、「どうしても keepalive を off にできない」という状況にハマりました。

後学のためにメモ。


nginx で keepalive を off にする方法
----
nginx.conf に以下のような設定を書きます。

```:/etc/nginx/nginx.conf
http{
  keepalive_timeout 0;
  # (何も書かない場合はデフォルト値の 75 になる)
}
```

設定後は `nginx -s reload` を忘れずに。

keepalive の有効/無効の確認
----
この状態で、以下のように ELB 経由でアクセスすると、あたかも keepalive が有効のように見えてしまいます。

```sh
$ curl -I http://foo.bar/

HTTP/1.1 200 OK
Server: nginx
Date: Wed, 19 Apr 2017 05:19:08 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 105370
Connection: keep-alive    # <- nginx の設定に関わらず必ず付与される
...
```

一方、プライベート側から nginx に直接アクセスすれば、ちゃんと keepalive は無効化されています。

```sh
$ curl -I http://10.2.8.97/

HTTP/1.1 200 OK
Server: nginx
Date: Wed, 19 Apr 2017 05:19:08 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 105370
Connection: close    # <- keepalive が無効になっている
...
```

まとめ
----
keepalive が無効化されていることを確認したければ、ELB を経由せずに直接 nginx を叩きましょう。

補足: ELB 側で keepalive off にできないか？
----
**できない** ようです。

[Classic Load Balancer のアイドル接続のタイムアウトを設定する - Elastic Load Balancing](http://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/config-idle-timeout.html)

> [Configure Connection Settings] ページに、[Idle timeout] の値を入力します。アイドルタイムアウトの範囲は 1～3,600 秒です。

(0 には指定できない)
UI勉強会: インターフェースデザインの実践教室 II部 デザイン(2)

## 21章 プレファレンスよりオプションを

### 環境設定の種類
- セッティング ... 機能や動作を変更できる機能
- コンフィギュレーション ... 正常動作に必要な設定
- プレファレンス ... ユーザー設定。厳密には不要で好みで変えられるもの
- パーソナライゼーション ... 視覚効果のみ 実際の動作は変えない

### プリファレンス
- 探せない
- それがモードになる
- 設定によっては使いにくくなる
- 良いデフォルト動作でなくしていく
- 隠れたプレファレンスを入れる(最後のユーザー操作を記憶)

> 設定値で変えられるように、というリクエストはとても多い。場当たり的な設定でごちゃごちゃしないように整理・設計・ときに取り下げてもらう説得、結構大変。1個増えただけでテストケースがどんだけ増えんのかっつーのもあるし

## 22章 階層化、空間、時間、外界の認知

- 人間は階層化しても保存場所をすぐ忘れる
- 場所や時間の方が覚えている
- 階層化が避けられないときは考慮する
 - 深さの制限
 - 空間的な表示
 - 複数個所への分類
 - メタデータ(タグとかかな？)
 - 検索など他のアクセス方法

## 23章 スピード
- 0.1秒で応答する
- 応答できないものは視覚的にフィードバックする
- 体感速度が重要
　　途中から結果を返したり、待ち中に他の操作を可能にする等
- 早すぎてわかりにくい場合もある
　　あえてプログレスバーを出す等

## 24章 機能の抑制

バージョンアップを長期間怠ると製品が死んでしまうが、
新機能を追加するにつれ段階的に学んでいない新規ユーザーは使い方が分からない

- ユーザーの目標、なぜ・なぜ・・を考える
- 既存機能の改良で済まないか
- ひとつの機能で複数の問題が解決できないか
- コストと効果は見合っているか
- 認知負荷を増加させずに追加できないか(不可視化。自動処理など)
- API提供・プラグイン化できないか

> クライアント自体、欲しがるかもしれない、かもしれない、かもしれない、、で要求を膨れ上がらせてしまう。説得は試みるもののなかなか難しく、スタートからもう機能が詰め込みすぎになっている。自社サービスじゃないと難しいかなあ。追加費用が厳しくなってきたリリース後の方が機能抑制の話は進むｗ

## 25章 機能の削除

- 削除の判断が妥当か調査・再確認
　統計情報を取ったりリサーチしたりする
　重要だが頻度がまれだったりしないか
　使いやすくなったらもっと使われるものではないか
- 情報提供
　削除前に通知し意見を求める
- 代替手段
　他製品の紹介等々

> Chromeのなんだっけなあ、なんかの機能が突然なくなっててすごい腹立ったんだよなあ
> 基本ナシだろう、、

## 26章 テレビゲームに学ぶ

### 面白さの心理学的側面

- 意味のある難問があり
- 進捗が計測でき
- レベルがマッチしているとき面白いと感じる

### ゲームから学ぶ例
- 進捗状況
- 上達 ... 上級者には複雑な機能が提供される等
- 発見と報酬 ... トロフィーやアチーブメント
- 競争
- 収集

> 最近TODO管理やタイムトラッキングのWebサービス漁ってたときにも、アチーブメントの表示は結構見かけたなあ。でも速攻閉じた。実務・実用で目的持って訪れてるときまでゲーミフィケーション的要素って要るのかなあ？？あんまいらない気がしてしまうんだが・・・