OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry Pi3にuv4l-webrtcをインストールして接続してみる。


# uv4l-webrtc とは
Raspberry PiとUSB WEBカメラでストリーミング配信したい時に利用できる UV4L(Userspace Video4Linux framework)に追加された webrtc実装です。
ローカルで起動している WebSocketのサーバを利用して WebRTCのシグナリングをしているのでLANの中であれば、簡単にWebRTCでの動画音声配信を見ることができます。

# uv4l-webrtc インストール
1. Raspberry Piの無線LANなどの設定は済んでいる状態にする。
1. UV4L のパッケージを認証

    ```
    wget http://www.linux-projects.org/listing/uv4l_repo/lrkey.asc && sudo apt-key add ./lrkey.asc
    ```
1. パッケージのダウンロード元設定ファイル sources.list にダウンロート元を追加する

    ```
    sudo vi /etc/apt/sources.list
    ```
   末尾に下記を追加する

    ```
    deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main
    ```
1. apt-getを更新して uv4l-webrtcをインストールする

    ```
    sudo apt-get update
    sudo apt-get install uv4l uv4l-webrtc uv4l-uvc uv4l-xscreen uv4l-dummy
    ```
1. USBカメラを繋いで IDを調べる

    ```
    lsusb    
    ```
1. uv4lを起動する

    ```
    uv4l --driver uvc --device-id <Device ID> --config-file=/etc/uv4l/uv4l-uvc.conf
    ```

# LAN環境での WebRTC の確認
ここまでの設定でWebRTC配信できている筈なので Chrome でアクセスしてみましょう。

1. 同じLANに接続した MacBook等のChromeで下のURLに接続する
   
    ```
    http://＜ラズパイのIPアドレス＞:8090/stream/webrtc
    ```

2.  画面したの Call ボタンを押すと Raspberry Piカメラからの映像が表示されます。  
    ※ Chrome側のカメラは、https環境じゃないと表示できないのでここでは表示できなくて問題ありません。

次回は uv4l-webrtc が行っているシグナリングの流れの説明をして実際にルータの外側から接続する手順を書く予定です。

#参考
[UV4L使ってRaspberry pi2でWebRTCでブラウザに動画表示](http://qiita.com/kgbu/items/ccdc69b5fd66b49f454f)
[ラズパイでWebRTC ヾ(*´∀｀*)ﾉｷｬｯｷｬ uv4l-webrtc 軽くハックしてみたよ！](https://www.slideshare.net/KensakuKOMATSU/webrtc-uv4lwebrtc)
PHP time


###**UNIX TIMESTAMP**
協定世界時(UTC)を基準にした1970年1月1日の0時0分0秒からの経過秒数

###**strtotime()**
英文形式の日付を Unix タイムスタンプに変換する。

```php:
$a2 =strtotime("+1 week");
echo date("y/m/d", $a2); // 17/04/17
echo strtotime("4 months ago"); // 1481358756
```

###**UNIX TIMESTAMPを年月日に変換**

```php
$a = time(); // 1491798124
echo date("y/m/d", $a); // 17/04/10
```

###**strtotimeを年月日に変換**
strtotime()で取得されたタイムスタンプを年月日に変換

```php
$a1 = strtotime("yesterday");
echo date("y/m/d", $a1); // 17/04/09
```

[strtotime('Monday',time());](http://qiita.com/shuntaro_tamura/items/b7908e6db527e1543837)

###**date()**
現在時刻をフォーマット文字列に沿って作成し、日付文字列を返す関数

|フォーマットで使える文字列|        |  例   |
|:--|:--|:--|
|**Y**|4桁の年|date('Y'); // 2017|
|**y**|2桁の年|date('y'); // 17|
|**m**|2桁の月で、先頭に0が付く|date('m'); // 04|
|**n**|先頭に0の付かない月|date('n'); // 4|
|**d**|2桁の日で、先頭に0が付く|date('d'); // 20|
|**j**|2桁の日で、先頭に0が付かない|date('j'); // 20|
|**H又はh**|2桁の時(24時間単位|date('H'); // 08|
|**i**|2桁の分で、先頭に0が付く|date('i'); // 32|
|**s**|2桁の秒で、先頭に0が付く|date('s'); // 59|

```php:
echo date('y/m/d'); // 17/04/10
```

```php:
date_default_timezone_set('Japan');
echo '<p>', date('Y/m/d h:i:s');
echo '<p>', date('Y年m月d日 h時i分s秒'),'</p>';
```

```php:実行結果
2017/04/27 12:04:37
2017年04月27日 12時04分37秒
```

###**date_default_timezone_set()**
■何故か[H]の部分、時間が7時間遅れて表示されてしまう

```php:
echo date('Y/m/d/H/i'); // 2017/04/20/08/45
date_default_timezone_set('Asia/Tokyo');
echo date('Y/m/d/H/i'); // 2017/04/20/15/45
```

```php:タイムゾーンを日本に指定
date_default_timezone_set('Japan');
```


###**mktime()**

指定した日時をタイムスタンプ(UNIX TIMESTAMP)という数字で取得することができる

|||
|:--|:--|
|**mktime(時,分,秒,月,日,年)**|指定した日時のUNIXタイムスタンプを取得する |

```php:
mktime ( 15, 30, 0, 4, 25, 2017 ); // 1493127000
```

###**strftime()**
ロケールの設定に基づいてローカルな日付・時間をフォーマットする

|フォーマットで使える文字列|        |  例   |
|:--|:--|:--|
|**%d**|日付(2桁で表現)|strftime('%d'); //20|
|**%a**|曜日(3文字で表現)|strftime('%a'); //Thu|
|**%m**|月(2桁で表現)|strftime('%m'); //04|
|**%b**|月(3文字で表現)|月(3文字で表現) //Apr|
|**%y**|年(2桁で表現)|strftime('%y'); //17|
|**%Y**|年(4桁で表現)|strftime('%Y'); //2017|
|**%D**|月/日/年||
|**%I**|2桁で表した12時間制の時間|strftime('%I'); //06|
|**%M**|2桁で表した分|strftime('%M'); //09|
|**%H**|2 桁であらわした 24 時間制の時間|strftime('%H'); //18|

###**strftime()とdate()を比較**

|説明　|strftime()|date()|  例   |
|:--|:--|:--|:--|
|**日**|**strftime(%d)**|**date('d')**|24|
|**月(2桁)**|**strftime('%m')**|**date('m')**|04|
|月(頭に0を付けない)||**date('n')**|4|
|月(アルファベット)|**strftime('%B')**|**date('F')**|April|
|**年**|**strftime('%y')**|**date('y')**|17|
|年(4桁で表現)|**strftime('%Y')**|**date('Y')**|2017|
|**曜日**|**strftime('%a')**|**date('D')**|Mon|
|**時(24時間制)**|**strftime('%H')**|**date('H')**|11|
|時(12時間制)|**strftime('%I')**|**date('h')**|11|
|**分(2桁で表現)**|**strftime('%M')**|**date('i')**|58|
|秒|**strftime('%S')**|**date('s')**|01|
|**複合日付**|**strftime('%c')**||04/24/17 12:15:18|
|複合日付||**date('c')**|2017-04-24T12:16:15+09:00|
|その年の何週目か|**strftime('%V')**|date('W')|17|
Rspecでmoduleのテストを作成する

classがネストされているmoduleのテストを通すのに色々実行しつつも失敗し、やっとこさ成功に至りましたので、備忘録兼同じように詰まっている方の参考になればと思います。

今回参考にさせていただいたのが、この記事です。
http://qiita.com/tq_jappy/items/ed56b0f4a20500252461


僕のコードの場合、クラスメソッドに対するテストコードの実装であり、Rspec & Railsともに初心者の僕にとっては困難を極めました。
対象のmoduleはだいたいこんな感じです(都合上似たような形式のコードを作成しています)。

```module_test.rb
module Test
 class Module_test
  def self.load
   true
  end
 end
end
```
上の記事によれば、Structクラスにmoduleをincludeしてやればいいのですが、如何せん、RubyもRailsも初心者の僕にとっては書き方がわからなかったので、まず、Rubyで実装してみてから、それを参考にやっていきました。

以下がいろんなサイトを参考に自分で作成した参考コードです。

```struct_module.rb
#structクラスにincludeするモジュールの作成
module Test
 class Module_test
  def self.load
   true
  end
 end
end

class Struct
 include Test
end


#Structクラスに関して~読み込みクラス~
Point = Struct.new("Point", :x, :y)
item_test = Point::Module_test.load
item = Point.new(100, 200)
p item
p item.x
p item.y
p item_test

#無名クラスバージョン
Point2 = Struct.new(:z)
Point2.class
item2 = Point2.new(300)
p item2
p item2.z

```

classがネストされているmoduleをincludeした場合、どのように参照したら良いか、がまず僕の問題でした(そこかよって感じですけど)。
Structクラスがわからない場合はググってみてください。以外と簡単でした。
あまり使われていないようですが。

```
#Structクラスに関して~読み込みクラス~
Point = Struct.new("Point", :x, :y)
item_test = Point::Module_test.load
```
三行目の書き方が肝です。これがわかってなかったので手間取ったのですが、moduleをもっと勉強していればスムーズだったんでしょうね。

上の

```
class Struct
 include Test
end
```
で最初は

```
class Struct
 include Test::Module_test
end
```
と書いていたのですが、これはエラーになりました。
includeするときは、module名だけでないとダメなようです。


これをもとに、Structクラスにmoduleをincludeして書いてみた実際のテストコードが以下になります。

```test.rb
describe 'モジュールテスト' do
 let(:module_test) { Struct.new(:test) { include Test } }
 let(:test) { module_test::Module_test.load }

 it 'self.loadのテスト' do
  expect(test).to be(true)
 end
end
```

クラスメソッドに対してもStructクラスにmoduleをincludeしてできたので、これを参考にしてみてください。

テストが成功してかなりスッキリしました。


###おまけ
この書き方だとmoduleのテストは通らない。


```module_test.rb
module Test
 class Module_test
  def self.load
   true
  end
 end
end
```

```test_miss.rb
describe 'モジュールテスト' do
 let(:test) { Test::Module_test.load }
 
 it 'testがtrueであること' do
  expect(test).to be(true)
 end
end
```
正しくはテストは通るけど、カバーできないです。
Alibaba CloudでOracle DBにSwingbenchを実行してみた

##概要
SB Cloudの提供しているAlibaba CloudのECS(仮想サーバ)にOracle Databaseをインストールし、Swingbenchを実行した時のメモです。

##目的
以下の点を明らかにするために行った。

1. ECSにOracle Database 12cがインストールできるか
2. どのぐらい構築に苦労するか
3. Swingbench(Order Entry)のトラヒックがかかるか
4. デフォルトの状態での性能値はどのぐらいか
5. 非CDBとCDBで性能に違いはあるか
6. 上記の確認を行った際に費用はいくらか

##結果
以下の点が分かった。

1. ECSにOracle Database 12cがインストールでき、起動されることが可能であることを確認
2. オンプレミスで構築する際と同様の手順で構築でき、全く苦労はしなかった
3. エラーなく動作した
4. デフォルトの状態でSwingbenchを動作させたため、限界値が分からなかった
5. ほとんど同じ
6. 95円(Oracle費用は検証なので除外）

##スペックなど
###Alibaba Cloud
|項目|値|
|:--|:--|
|インスタンス|世代 III 汎用タイプ n4|
|システムディスク|/dev/xvda Ultra クラウドディスク|
|CPU|4Core|
|Mem|8GB|
|OS|CentOS 7.3 64bit|
|リージョン|日本|
|ネットワークタイプ|VPC|

###Oracle Database
|項目|値|
|:--|:--|
|バージョン|12.2.0.1.0|
|Edition|Enterprise Edition|
|その他|インストーラのデフォルト|

###Swingbench
|項目|値|
|:--|:--|
|バージョン|2.5.971, Updated March 17th 2015|
|ベンチマーク|Order Entry|
|ユーザ数|20|
|その他|デフォルト|

##構築
###IaaS
SB CloudのAlibaba Cloudコンソールより、ECSを構築した。従量課金で1時間23.38円だった。このほかにNetworkトラヒックなどに費用がかかり、4時間くらい稼働させたので、合計95円の請求となった。
Alibaba CloudのECSインスタンスは非常に早く、1分程度で構築できた。従量課金の場合はこの構築時間の速さが費用削減に繋がる。

###Database
オンプレミスにインストールする場合の手順と同じでインストールできた。
Swingbenchも同じマシンで動作させるので、GNOME環境もインストールした。
リモートから画面に接続するために、tigervnc-serverもインストールを行った。

###Swingbench
ダウンロードして、展開して実行した。
セットアップで以下の画面が長いので、気長に待つ必要がある。

![snap1のコピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/169790/d2e2eeca-f0e4-0306-0969-c335b3d8ae79.jpeg)

以下の画面で完了となる。

![snap2のコピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/169790/74325cc1-dac1-02ea-523c-7daac4b492fa.jpeg)

##実行結果
###Swingbench
以下が実行結果の画面キャプチャです。
####CDB<br>コネクションプール：なし

![snap3のコピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/169790/21df5d80-f586-6125-59c9-7c2b7547dc06.jpeg)

####CDB<br>コネクションプール：25

![snap4のコピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/169790/de33783a-5674-8068-e65e-9063610eb730.jpeg)

####非CDB<br>コネクションプール：なし

![s5のコピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/169790/48d5f3f5-2ae2-4f8e-7ef0-8b756282ce9f.jpeg)

####非CDB<br>コネクションプール：25

![s6.jpg](https://qiita-image-store.s3.amazonaws.com/0/169790/ad305cb4-bfad-ab88-0e07-876691f64a60.jpeg)

##Q&A
Q. SwingBench 2.6を使用しないのですか
A. CentOS 7.3ではグラフの描画が動作しませんでした（Exceptionが出力されているようでした）
Q. Alibaba CloudのECSを選択する理由
A. Alibaba CloudのPaaSにOracleがないため、Oracle使用はIaaSを使うしかないため

##雑感
予想していた通り、非常な安価な費用で確認を行うことができた。
オンプレミスでRACを使用していない構成であれば、クラウド移行の検討対象になると考えられる。
FreeNAS Corral（FreeNAS 10）のネットワーク設定

FreeNAS Corral（FreeNAS 10）の初期ネットワーク設定はDHCPが有効である。
DHCPを無効にしてデフォルトインターフェースem0に静的IPアドレスを設定、デフォルトルートとDNSを設定および確認する方法を記載する。

###インターフェース設定
・DHCPを無効に設定
```unix::/>network interfece em0 set dhcp=no```
・IPアドレスとネットマスクを設定
```unix::/>network interfece em0 alias create address=192.169.0.1 netmask=255.255.255.0 type=INET```
・インターフェースを"有効"に設定
```unix::/>network interfece em0 set enabled=yes```
・インターフェース設定の確認
```unix::/>network interfece em0 show```
![img01_em0show.png](https://qiita-image-store.s3.amazonaws.com/0/171475/9f14d5c4-2def-f01f-c2c3-b2e43ff05773.png)
###ネットワーク設定
・デフォルトゲートウェイとDNSサーバを設定
```unix::/>network config set ipv4_gateway=192.169.0.254 dns_servers=192.168.0.253```
・ネットワーク設定の確認
```unix::/>network config show```
![img02_configshow.png](https://qiita-image-store.s3.amazonaws.com/0/171475/ffa95a75-8a50-f066-f11b-58baf0dcd9ae.png)
【Atom】linter-rubyが日本語文字列に「unexpected end-of-input, expecting keyword_end」という

# 事象
これと同じように、日本語文字列がError扱いになっている。
https://teratail.com/questions/61253

# 原因
linter-rubyが、うまくファイルをUTF-8で読み込んでいないらしいとのこと。（対応Rubyが古いらしい）
https://github.com/AtomLinter/linter-ruby/issues/103
バグはしばらく直りそうにない。

# 対応
明示的にUTF-8で読み込むオプションを付与したコマンドを作成し、linter-rubyではそれを呼ぶようにする。

### 1. コマンド作成
下記をPATHの中に設置。実行権限を付与する。（rubyのパスは適宜）
自分は`ruby-ku`にした。

```bash
#!/bin/bash
exec /usr/local/var/rbenv/shims/ruby -Ku "$@"
```

試しに`ruby-ku -v`と打って、バージョンが出力されたらOK。

### 2. linter-rubyに設定
Ruby Executable Pathに、作成したコマンド名を入力
<img width="1013" alt="スクリーンショット 2017-04-10 13.11.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/43485/1b86ae08-a853-b6ef-d803-d9ead3643a06.png">

エラーが出てたファイルを開き直し、エラーが消えていれば完了。

# 補足
* 作成コマンドだと`ruby: warning: -K is specified; it is for 1.8 compatibility and may cause odd behavior`という警告が出ますが無視。Eutf-8オプションでは効かなかった・・・
Xamarin.Forms で外部アセンブリの *.resx リソースを使う方法

必要になった時に忘れているので覚書。

## 目的

XAML のあるアセンブリ（App.Forms)から別のアセンブリ(App.Shared)に定義した resx 形式で文字列リソースを参照したい。
構造としてはこう：
```+ App.Shared
..+-- Resources
....+--Messages.resx
+ App.Forms
..+-- App.xaml
..+-- MainPage.xaml
```

## 手法

1. 外部ライブラリ側のプロジェクトで、「ファイルの追加」ダイアログから Resx リソースを選び、Messages.resx を作成する。
2. 修飾子を Public に変更する。 Xamarin Studio の場合はプロパティで「カスタムツール」の項目を「`PublicResXFileCodeGenerator`」に書き換える。
3. **参照したい XAML ファイルのルート要素に名前空間とアセンブリ名を記述する。**
4. 利用先のプロパティで `x:Static` マークアップ拡張を使う。つまり、以下のようにする。

```xml:MainPage.xaml
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage
	xmlns="http://xamarin.com/schemas/2014/forms"
	xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
	xmlns:resources="clr-namespace:App.Shared.Resources;assembly=App.Shared"
	x:Class="App.Views.MainPage"
	Title="MainPage">
    <Label Text="{x:Static resources:Messages.Hello}"/>
</ContentPage>
```

## 国際化

国際化については Xamarin 公式のドキュメントに記述がある。
https://developer.xamarin.com/guides/xamarin-forms/advanced/localization/
Vue2.xでデータをエスケープせずに表示したい

# Vueでhtml等をそのまま表示したい

1.xまではマスタッシュ記法

```
<div>
  {{{ some }}}
</div>
```

上記方法は2.xから廃止になってました。<br>代わりに`v-html`というディレクティブが用意されています。

```
<div v-html="some"></div>
```

参考：
[Vue 1.x からの移行 - HTML-の展開-削除](https://jp.vuejs.org/v2/guide/migration.html#HTML-の展開-削除)
VirtualBox上のWindows10で、MacのUSキーボードを使うための設定方法

何が押されているのか分からないキーボードになってしまっている方へ。

# 環境情報

## ホスト
* MacBook Pro (Retina, 15-inch, Late 2013) **USキーボード**
* macOS Sierra 10.12.1

## 仮想化ソフト
* VirtualBox 5.1.18 r114002 (Qt5.6.2)
    * デバイスメニューより、Guest Additions インストール済み

## ゲスト
* Windows 10 Home 日本語版


# 状況

MacでUSキーボードを使っています。また、Command等の修飾キーの設定をいくつか変更して使用しています。

このようなMac上に構築されている、VirtualBox上のWindows10を使おうとすると、**何が押されているのか分からないキーボード**になってしまい、かなり困りました。どれがCtrlか、どれが半角全角か・・・分からないとまともに操作できません。

備忘録も兼ねて、このような訳のわからないキーボードになってしまっている人向けに解決方法を共有します。

個々の設定は環境依存の話になりますので、具体的にどのキーをどのキーに変更しろといった情報は載せておりません。あらかじめご了承ください。

# 解決方法

## 1. VirtualBoxのホストキー設定を変更する。

ホストキーというのは、VirtualBoxのゲストOSを操作していても、反応するキー（ホストOSからメタ的に操作するためのキー）になります。

MacのVirtualBoxは[Command左]になっています。よく使うキーでバッティングを招きやすいので、[Command右]に変更しておきます。

* 上部メニューから、**[VirtualBox] > [環境設定] > [入力] > [仮想マシン] > [ホストキーの組み合わせ]**

<img width="548" alt="virtualbox.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/170816/8d76950c-88df-1a0c-c0f5-aae78883e870.jpeg">


## 2. Windowsのキーボード設定を変更する。

次にWindowsのキーボード設定を変更します。下記のまとめて頂いている記事を参照してください。

* [Windows10日本語版で英語配列キーボードを使用する](http://qiita.com/shimizu14/items/000cceb9e72a492b9176)

<img width="700" alt="Windows_10__key.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/170816/9019e435-a3c7-ca4e-f1a4-fc3e8ee7d7ca.jpeg">


この時点で一通りUSキーボードとして使用できます。

### 【補足】日本語入力への切り替え

日本語入力への切り替えは、次のキーを入力してください。

```
[Alt]　＋　[～]（チルダ）
```

[引用元] [【Windows】英語配列キーボードで日本語（ローマ字）入力するには？／日本語と英語の切替方法は？](http://qa.elecom.co.jp/faq_detail.html?category=&page=1&id=3016)

## 3. 修飾キーがどのキーに設定されているか調査する。

修飾キー（Ctrl、Windowsキー等）がどのキーか調査するために**「Change Key」**というWindows用のフリーソフトウェアをダウンロードします。展開するだけで使用できるシンプルなツールです。

※最新のv1.5では、対応機種は「WindowsNT4.0,2000,XP,vista,7」と記載されていますが、私のWindows10上では特に支障なく動いています。（他にもWindows10で動作する旨の記事が多数あがっていますが、使用判断は自己責任でお願いします。）

* [Change Key ダウンロードサイト](http://satoshi3.sakura.ne.jp/f_soft/dw_win.htm)

<img width="760" alt="Windows_10__Running_.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/170816/9b25f0cd-a6c1-e990-e770-9c9738708c9c.jpeg">

＜調査手順＞
1. 取得したexeを右クリックして**管理者で実行**します。
2. [調査]メニューから、キーの調査ウィンドウを表示させます。
3. Macのキーボードを押して、どのキーに何が対応しているか調査できます。



## 4. キーレイアウトをカスタマイズする。

結構押しづらいキー配置があると思うので、必要に応じてレイアウトを変更します。同じく「Change Key」を使って、使いやすいレイアウトに変更していきます。登録して再起動すると反映されます。

<img width="750" alt="Windows_10__Running_2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/170816/4e122e2b-a9e4-af87-88ea-78c378481b0b.jpeg">


以上をもちまして、MacのUSキーボードを自由自在に使える状況になっているはずです。


# 参考

* [VirtualBoxのホストキーを変更する方法](https://pc-karuma.net/mac-virtualbox-host-key/)
* [ChangeKeyでWindows10のキー配置を変更する方法 : KLX/ITLOG](http://klx.ldblog.jp/archives/changekey_windows10.html)
RaspberryPiでLEDをチカチカさせるPythonプログラム（４）

前回はブレットボードにLEDを６つ並べて、上から順番に点灯させましたが、今回は、ランダムに点灯させます。

こんな感じで点滅します。
https://youtu.be/nNMyl2Ehdvo

 配線は前回と全く同じなので、[RaspberryPiでLEDをチカチカさせるPythonプログラム（３）](http://qiita.com/az-yocatter/items/7ad7c61337db55932370)をご覧ください。

ソースは以下の通りです。

```python:led04.py
import RPi.GPIO as GPIO
from time import sleep
import random

ch_list = [4, 17, 5, 27, 25, 24]
GPIO. setmode(GPIO.BCM)
GPIO.setup(ch_list, GPIO.OUT)
list_r = [4, 5, 25]
list_g = [17, 27, 24]


try:
    c  =  1
    s  =  0.1
    t  =  50
    r = random.choice(list_r)
    g = random.choice(list_g)    
    
    while c < t:
        GPIO.output(r, GPIO.HIGH)
        sleep(s)
        GPIO.output(g, GPIO.HIGH)
        sleep(s)
        GPIO.output(r, GPIO.LOW)
        sleep(s)
        GPIO.output(g, GPIO.LOW)
        sleep(s)
        r = random.choice(list_r)
        g = random.choice(list_g)
        c += 1
except KeyboardInterrupt:
    pass
GPIO.cleanup()

```
皆様お試しあれ

今回の内容をグラビアアイドルのお姉さんを眺めながら学びたいという方はこちら
http://oppython.wp.xdomain.jp/2017/04/01/post-58/

今回はこのへんで・・・。
最後までお付き合い頂き、誠にありがとうございました。
cakephp3 belongsToMany で タグを複数持つものを検索

複数の SiteTable は 複数の Tag を持つって関係。
いわば belongsToMany。

ここで
ラーメンとつけめん。
両方のタグを持つサイトを検索したい。

そんな場合はこう。

・SitesController.php

```
    public function test()
    {
        $tagName = ['ラーメン','つけめん'];

        $query = TableRegistry::get('Sites')->find();

        $res = $query
            ->matching('Tags', function ($q) use ($tagName) {
                return $q->where(['Tags.name IN' => $tagName]);
            })
            ->group(['Sites.id'])
            ->having([
                $this->Sites->query()->newExpr()->eq('COUNT(DISTINCT Tags.name)', count($tagName))
            ])

            ->all()->toArray();

        pr($res);
        
        $this->autoRender = false;
    }
```

これでラーメンとつけめん。両方のタグを持つサイトのみ取得できる。


つづいて、SearchPluginを使う場合


```

$search
    ->add('tag', 'Search.Callback', [


        'callback' => function ($query, $args, $filter) {

//                カンマまたは " ", \r, \t, \n , \f などの空白文字で句を分割する。
            $tags = preg_split("/[\s,]/",$args['tag']);

            $query->matching('Tags', function ($q) use ($tags) {
                return $q->where(['Tags.name IN' => $tags]);
            })
                ->group(['Sites.id'])
                ->having([
                    $query->newExpr()->eq('COUNT(DISTINCT Tags.name)', count($tags))
                ]);

        }
    ]);

```
CloudWatch resolution


# EC2

|name|detail|normal|to typical|note|
|:--:|----|----|----|---|
|Network-In/Out|Byte/Minute|Byte/5 Minutes| bps = X * 8 /(60 or 300)|
|Network-Count In/Out|Counts/5 Minutes|Counts/5 Minutes| PPS = X  / 300| Detail 5min|

# EBS
|name|detail|to typical|note|
|:--:|----|----|----|
|Volume Write&Read Ops| Ops in 5 mins | IOPS = X / 300| GAUGE (Avg = Sum = Max...) |
|Volume Write&Read Bytes| Bytes per Ops in 5 mins| Byte/Sec = Sum(X) / 300| Data Samples = IOPS |

EC2 @ Management Console EBS volume　view has `Bandwidth (KiB/s)` and `Throupghput (Ops/s)`, that pre-caluculated metrics `Bandwidth (sum) = (KiBs)`  `Throughput (any except sample count) = (IOPS)` .


# ElastiCache Redis
|name|to typical|note|
|:--:|----|----|
|GetTypeCmds| QPS = X / 60  | RAW = Count/Minute (get,mget,hget)|
|SetTypeCmds| QPS = X / 60 | RAW = Count/Minute (set, hset)|

# RDS Aurora
http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Aurora.Monitoring.html

|name|to typical|note|
|:--:|----|----|
|Queries| X | RAW = QPS|
|SelectThroughput| X | RAW = QPS|
|AuroraReplicaLag| X | gauge|
|DatabaseConnections| - | - |
|Volume(Read,Write)IOPs| IOPS = X / 300 (fixed) | gauge RAW = IOs in 5min (why named IOPs!)|


# DynamoDB
See. http://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/dynamo-metricscollected.html

|name|to typical|note|
|:--:|----|----|----|---|
|Consumed(Read/Write)CapacityUnits|units/sec = X(sum) /(60 or 300)|Dimensions (Table or GSI)|
|UserErrors|Errors/sec = X(counts) / (60 or 300)| NO dimentions ↓↓|
|(Write/Read)ThrottleEvents|-|No data No metrics(No 0)|
googlechrome ver57　でSSL証明書情報の確認方法

忘れないよう、簡単なメモです。

久々にchromeからSSLの証明書情報を確認しようとしたところ、仕様変更があったようなのでメモ。
以前までは［保護された通信］をクリックすると証明書情報が表示されたのに。赤丸の［詳しく見る］あたりに。

![SSL05.png](https://qiita-image-store.s3.amazonaws.com/0/174392/8cbf18d8-d5d0-eeb0-929b-8362ef534d11.png)

#変更後の確認方法

ページ上で右クリック　＞　検証　
![SSL01.png](https://qiita-image-store.s3.amazonaws.com/0/174392/3571ffa0-9137-cb5b-c16f-5ae55275f1b6.png)

ディベロッパーツールが開くので、 ［Security］

![SSL02.png](https://qiita-image-store.s3.amazonaws.com/0/174392/48c27faa-9756-6088-781c-eeca4a144c88.png)

［View certificate］をクリック。

![SSL03.png](https://qiita-image-store.s3.amazonaws.com/0/174392/b49d25c3-7658-ab1b-29dd-c2cd494e8084.png)

証明書情報が表示されました。

![SSL04.png](https://qiita-image-store.s3.amazonaws.com/0/174392/21301977-1667-bbba-9001-ddb57b41bf4f.png)
Trim space in PostgreSQL plperl  

### Original
the page below contains typo in the code...
https://wiki.postgresql.org/wiki/Normalize_whitespace
here is the working code...


### Trim space in PostgreSQL plperl

```pl
CREATE OR REPLACE FUNCTION n_space()
 RETURNS trigger
 LANGUAGE plperl
AS $function$
	my $rs = spi_exec_query(<<"    EOT");
    SELECT
        a.attname as name,
        format_type(a.atttypid,a.atttypmod) 
    FROM
        pg_class AS c
    JOIN
        pg_attribute AS a
        ON a.attrelid = c.oid
        AND c.oid = '$_TD->{table_name}'::regclass 
        AND a.attstorage <> 'p'
        AND format_type(a.atttypid,a.atttypmod) = 'text'
    EOT
 
	my $rs_rows = $rs->{processed}-1;
	foreach my $rn (0 .. $rs_rows){
		my $row = $rs->{rows}[$rn]->{name};
		$_TD->{new}{$row} =~ s/(^\s+|\s+$)//g;
		$_TD->{new}{$row} =~ s/\s+/ /g;		
	}	
	return "MODIFY";
$function$
;
```

```
CREATE TRIGGER n_space BEFORE INSERT OR UPDATE ON pepito FOR EACH ROW EXECUTE PROCEDURE n_space();
```


## Trim trailing linefeed/return

```pl
CREATE OR REPLACE FUNCTION mrm.n_space()
 RETURNS trigger
 LANGUAGE plperlu
AS $function$
	my $rs = spi_exec_query(<<"    EOT");
    SELECT
        a.attname as name,
        format_type(a.atttypid,a.atttypmod) 
    FROM
        pg_class AS c
    JOIN
        pg_attribute AS a
        ON a.attrelid = c.oid
        AND c.oid = '$_TD->{table_name}'::regclass 
        AND a.attstorage <> 'p'
        AND format_type(a.atttypid,a.atttypmod) like 'character%'
    EOT
 
	my $rs_rows = $rs->{processed}-1;
	foreach my $rn (0 .. $rs_rows){
		my $row = $rs->{rows}[$rn]->{name};

        if (! defined $_TD->{new}{$row}) {
          $_TD->{new}{$row} =~ s/\x0D?\x0A?$//;
          return "MODIFY";
        } else {
          return;
	}
   }
$function$
;

```
mono 5.0+ を導入後 Xamarin.Forms 2.3.4 未満がビルドできないときの対応

## 起こっていること
2017年4月10日現在，Xamarin Studio(以下XS)のalphaチャンネルなどを使っていたり，Visual Studio for Mac - Preview6以降(以下VS4M)を使っていると mono 5.0.0.42 をインストールすることが出来ます．

ですがこのアップデートを適用後 Xamarin.Forms 2.3.4 未満(正しくは2.3.4 preview3未満)のプロジェクトがビルドできないといったことが起こっています．

~~また Fody を使うようなライブラリ（Realmなど）でも同様の現象が起こっているようです．~~
改善されました．

要するに，こういう状態です．

|| Xamarin.Forms 2.3.4以降 |未満|
|:--|:--:|:--:|
|mono 5.0+|OK|NG|
|mono 4.8.0|OK|OK|

## 解決策
XS を使っている人は Project->Active Runtime->Mono4.8.0 を選択し，明示的に mono4.8.0を使うようにすることで対処することが出来ます．

VS4M を使っている人も同様のことを行うことで対処することも出来ます~~が，__ビルドのステップが止まってしまうことも確認できています．__~~

## 結論
何かしらの事情がないのであれば Xamarin.Forms 2.3.4 にアップデートしてしまうのが一番簡単だと思います．

しかしバージョンが上げられないなどの事情がある場合は Active Runtimeを mono4.8.0に変更して開発するしかないようです．
~~また Fody を使う場合であれば，今は mono4.8.0を使うしかなさそうです．~~

~~VS4MacのPreview6の起動にmono5.0+が要求されるから [前あげた雑なやり方で対処できない](http://qiita.com/yamachu/items/49352849e41c020b5616)...~~

## 確かめていないけど起こりそうだなあと思っていること
Xamarin Mac Agentを使用する際に
[macでdotnetのSDKやmonoのバージョンをシステムレベルで変えたいときにやったこと](http://qiita.com/yamachu/items/49352849e41c020b5616)
であげているように
`/Library/Frameworks/Mono.framework/Versions/Current`以下の`/Commands/xbuild`が叩かれているとしたら，おそらくmono 5.0.0を導入した際 Currentが5.0.0に向いているはずなので失敗する恐れがあります．

どなたか検証して教えていただければ...と思います（人任せ）
RaspberryPiでLEDをチカチカさせるPythonプログラム（３）

前回は２つを交互に点灯させてみましたが、今回は6つに増やし、上から順番に点灯→消灯します。

youtubeに動画をご用意いたしました。
https://youtu.be/Z6QAQjGlTH8

GPIO（赤い線のほう）から抵抗を伝わってLEDに電気が通り、GNDへ流れていくという回路です。
（これが６つ並んでおります）

![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/154158/d7c28ba8-bc2e-1a67-b617-3e40d07abf3a.jpeg)



この並んでいるランプを上から順番につけ、そして消してから次のLEDを点灯させるというPythonのプログラムでございます。

コードはこちら

```python:led03.py
import RPi.GPIO as GPIO
from time import sleep

ch_list = [4, 17, 5, 27, 25, 24]
GPIO.setmode(GPIO.BCM)
GPIO.setup(ch_list, GPIO.OUT)

try:
    c  =  0
    s  =  0.1
    t  =  10
    while c < t:
        GPIO.output(4, GPIO.HIGH)
        sleep(s)
        GPIO.output(4, GPIO.LOW)
        sleep(s)
        GPIO.output(17, GPIO.HIGH)
        sleep(s)
        GPIO.output(17, GPIO.LOW)
        sleep(s)
        GPIO.output(5, GPIO.HIGH)
        sleep(s)
        GPIO.output(5, GPIO.LOW)
        sleep(s)
        GPIO.output(27, GPIO.HIGH)
        sleep(s)
        GPIO.output(27, GPIO.LOW)
        sleep(s)        
        GPIO.output(25, GPIO.HIGH)
        sleep(s)
        GPIO.output(25, GPIO.LOW)
        sleep(s)
        GPIO.output(24, GPIO.HIGH)
        sleep(s)
        GPIO.output(24, GPIO.LOW)
        sleep(s)

        c += 1

except KeyboardInterrupt:
    pass

GPIO.cleanup()
```
皆様お試しあれ

今回の内容をグラビアアイドルのお姉さんを眺めながら学びたいという方はこちら
http://oppython.wp.xdomain.jp/2017/03/31/post-56/

今回はこのへんで・・・。
最後までお付き合い頂き、誠にありがとうございました。
波紋を作る！


会社の同僚(ほぼ友人みたいな...)とアプリを作ろう！となり、

タップしたところに波紋を作りたい...
それをみんなで共有したい...
チャットもできるようにしたい...
そしたら寂しさも紛らわせる...

それ出会い系じゃない？

そんなことから始まりとりあえずプロトタイプ的なものができました。


```swift
import UIKit

class ViewController: UIViewController {
    
    //		transformプロパティを使うのでその値(変形する比率?割合?)を宣言します。
    let scaleTransform = CGAffineTransform(scaleX: 0.01, y: 0.01)
    
    //		画面に表示させる波紋の内容をここで設定します。
    func makeHamonnImage(wigth w:CGFloat, height h:CGFloat) -> UIImage {
        let size = CGSize(width: w, height: h)
        UIGraphicsBeginImageContextWithOptions(size, false, 1.0)
        let context = UIGraphicsGetCurrentContext()
        let ovalRect = CGRect(x: 0, y: 0, width: w, height: h)
        let ovalPath = UIBezierPath(ovalIn: ovalRect)
        context?.setFillColor(red: 0.0, green: 0.0, blue: 1.0, alpha: 0.0)
        ovalPath.fill()
        ovalPath.lineWidth = 3.0
        context?.setStrokeColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
        ovalPath.stroke()
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image!
    }
    
    //		画面がタップされたら処理される内容を設定します。
    @IBAction func tapAction(_ sender: UITapGestureRecognizer) {
        let HamonnImage = makeHamonnImage(wigth: 300, height: 300)
        let HamonnView = UIImageView(image: HamonnImage)
        
        HamonnView.transform = scaleTransform
        
        HamonnView.center = sender.location(in: self.view)
        view.addSubview(HamonnView)
        
        UIView.animate(withDuration: 3.0, delay: 0.0, options: [ .curveEaseInOut], animations: {HamonnView.alpha = 0.0
        HamonnView.transform = .identity}, completion: nil)
    }
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        view.backgroundColor = UIColor.orange
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

```
AWSのオートスケーリンググループ、ロードバランサー関連の各リソースをER図にしてみた

さて、めげずに「AWSの○○関連の各リソースをER図にしてみた」シリーズ第3段。
こちらも最初は？？？状態だったオートスケーリンググループ、ロードバランサー関連の各リソースをER図にしてみました。

# ER図

![スクリーンショット 2017-04-10 12.05.29.png](https://qiita-image-store.s3.amazonaws.com/0/145575/15824c1b-6331-8fb6-7c50-dcfe25e33c72.png)


前回と同じく、カーディナリティが省略されている箇所は"1"です。

# ポイント
- ロードバランサはClassicとApplicationの2種類がある。
    - Applicationの場合は、URLのパターンごとに振り分けるターゲットグループを分けることができる。
    - その分設定が複雑になる。
- 起動設定は作成後のAMIの変更はできない。
    - AMIを変えるには、新しい起動設定を作成してオートスケーリンググループの参照先を変更する必要がある。

例によって、図に誤りがあればご指摘ください。
PySide2をインストールしたはいいが、pyside2-uicが動作しなかったのでなんとかする

[前回の記事]
(http://qiita.com/Keck/items/60bdbc0869abb89287b0)でPySide2をPyenv+Virtualenv環境下にインストールしたはいいが、QtDesignerで作成したUIファイルを変換するツールであるpyside2-uicがうまく動作しなかったので、対処法をメモ

```bash
$ pyside2-uic 
Traceback (most recent call last):
(中略)
  File "/home/hoge_user/.pyenv/versions/pyside_test/lib/python3.5/site-packages/PySide2-2.0.0.dev0-py3.5-linux-x86_64.egg/pyside2uic/__init__.py", line 27, in <module>
    from pyside2uic.Compiler import indenter, compiler
```
と出てきたので、エラー表示にあるpyside2uicディレクトリまでのパスをメモ(パスはVirtualenv名などによって異なる)

```bash
$ cd [メモしたディレクトリ]
$ ll
合計 88
drwxrwxr-x 3 hoge_user hoge_user  4096  4月 10 11:37 ./
drwxrwxr-x 5 hoge_user hoge_user  4096  4月 10 11:35 ../
-rw-rw-r-- 1 hoge_user hoge_user  5027  4月 10 11:37 __init__.py
drwxrwxr-x 2 hoge_user hoge_user  4096  4月 10 11:37 __pycache__/
-rw-rw-r-- 1 hoge_user hoge_user  4039  4月 10 11:35 driver.py
-rw-rw-r-- 1 hoge_user hoge_user  1101  4月 10 11:35 exceptions.py
-rw-rw-r-- 1 hoge_user hoge_user  4533  4月 10 11:35 icon_cache.py
-rw-rw-r-- 1 hoge_user hoge_user  3986  4月 10 11:35 objcreator.py
-rw-rw-r-- 1 hoge_user hoge_user 16295  4月 10 11:35 properties.py
-rw-rw-r-- 1 hoge_user hoge_user 32268  4月 10 11:35 uiparser.py
```


ディレクトリを覗いてみると、実際Compilerディレクトリは見当たらない

そこで、前回の記事でcloneしてきたgitリポジトリを見てみると・・・

```bash
$ cd pyside2-setup/pyside_package/pyside2uic/
$ ll
合計 96
drwxr-xr-x 5 hoge_user hoge_user  4096  4月 10 11:35 ./
drwxrwxr-x 5 hoge_user hoge_user  4096  4月 10 11:35 ../
drwxr-xr-x 2 hoge_user hoge_user  4096  4月 10 11:35 Compiler/
-rw-r--r-- 1 hoge_user hoge_user  5000  4月 10 11:35 __init__.py
-rw-r--r-- 1 hoge_user hoge_user  4039  4月 10 11:07 driver.py
-rw-r--r-- 1 hoge_user hoge_user  1101  4月 10 11:07 exceptions.py
-rw-r--r-- 1 hoge_user hoge_user  4533  4月 10 11:07 icon_cache.py
-rw-r--r-- 1 hoge_user hoge_user  3986  4月 10 11:15 objcreator.py
drwxr-xr-x 2 hoge_user hoge_user  4096  4月 10 11:35 port_v3/
-rw-r--r-- 1 hoge_user hoge_user 16295  4月 10 11:07 properties.py
-rw-r--r-- 1 hoge_user hoge_user 32268  4月 10 11:07 uiparser.py
drwxr-xr-x 2 hoge_user hoge_user  4096  4月 10 11:35 widget-plugins/

```

Compilerディレクトリ発見 port_v3、widget-pluginsディレクトリなんてものもある とりあえず全部コピーする

```bash
$ cp -r port_v3 [メモしたディレクトリ]
$ cp -r widget-plugins [メモしたディレクトリ]
$ cp -r Compiler [メモしたディレクトリ]

```

```bash
$ pyside2-uic 
Error: one input ui-file must be specified
```
インポートエラーなどは出ないようになった
UIファイルを指定しての実行もうまく動作した
Rails5(5.1ではない)とWebPackerではじめるVue.js

## 🎯ここでのゴール

Rails5(5.1ではない)でVue.jsをさくっと使えるようにします。

## 🔀手順

### 初期設定

```
gem install rails
rails new experimental-vue
cd experimental-vue
```

### GemfileにWebPackerを追加

```
gem 'webpacker', github: 'rails/webpacker'
```

### webpack環境のインストール

```
rails webpacker:install
```

### vueのインストール

```
rails webpacker:install:vue
```

### コントローラの生成

```
rails g controller Index
```

### レイアウトからサンプルのVueアプリを読み込む

views/layouts/application.html.erb に追加

```
<%= javascript_pack_tag 'hello_vue' %>
```


### webpack watcherの起動

```
./bin/webpack-watcher
```

### config/routes.rb の変更

```
Rails.application.routes.draw do
  root to: 'index#index'
end
```

### railsの起動

```
rails s
```

### 表示

open http://localhost:3000/

### Vue側のコードの場所

```
app/javascript/packs
```

## templateの言語をjadeにする

jadeは、pugという名称に変更されているので注意

```
yarn add pug
```
webpack-watcher を再起動して反映する。

templateのlangにpugを指定する。

```html
<template lang="pug">
</template>
```


## 💚所感

Rails5.1からはWebPackerが標準で入るようになりますし、たぶんこれが一番はやいです。

* Vueify(vue-loader)が便利
* まだWebPackerが標準じゃないのが課題
* これで開発したい
RaspberryPiでLEDをチカチカさせるPythonプログラム（２）

前回のLEDチカチカ（連続で点滅させたのちお休みするプログラム）、更に進化させ、LEDを2つにし、交互にチカチカさせるのを連続させるプログラムに作り変えてみました。

GPIOは4番と25番を使っております。GPIOのsetupを複数行にしたら警告が出たので、変数をリストにして代入させました。

なお変数ｓは点灯間隔、変数ｔは点灯回数です。点灯間隔を調整したければｓの値を、点灯回数を変更したければｔの値を変更してみて下さい。（点灯間隔は余り早くしないほうが点滅がわかりやすいと思います。変数ｓを0.001にしたら点滅しているのかどうか全くわかりませんでした）

コードは以下のとおりです。

```python:led02.py
import RPi.GPIO as GPIO
from time import sleep

ch_list = [4, 25]
GPIO. setmode(GPIO.BCM)
GPIO.setup(ch_list, GPIO.OUT)

try:
    c  =  0
    s  =  0.05
    t  =  50
    while c < t:
        GPIO.output(25, GPIO.HIGH)
        sleep(s)
        GPIO.output(25, GPIO.LOW)
        sleep(s)
        GPIO.output(4, GPIO.HIGH)        
        sleep(s)
        GPIO.output(4, GPIO.LOW)
        sleep(s)
        c += 1

except KeyboardInterrupt:
    pass

GPIO.cleanup()
```

皆様お試しあれ。

今回の内容をグラビアアイドルのお姉さんを眺めながら学びたいという方はこちら
http://oppython.wp.xdomain.jp/2017/03/25/post-41/

今回はこのへんで・・・。
最後までお付き合い頂き、誠にありがとうございました。
RaspberryPiでLEDをチカチカさせるPythonプログラム（１）

はじめまして！
『おっ、python と、Raspberry ぱい』というサイトでブログを書いている Az yocatterと申します。
ここでは『おっ、python と、Raspberry ぱい』をお色気を抜いてほぼそのままの内容で掲載しております。今後ともよろしくお願いします・・・ということで本題。

カラー図解 最新 Raspberry Piで学ぶ電子工作 作って動かしてしくみがわかる (ブルーバックス)の中に書いてある、第4章の2番目に書いてあったPythonのプログラムもちょいと改造しました。
（点滅間隔を0.5秒から0.2秒に変更し、さらに20回点滅してストップさせます。また、20回点滅の途中でctrl + Cを押してもエラーなくストップします。どやっｗ）

コード(python)は、以下の通りです。

```python:led01.py
import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(25, GPIO.OUT)

try:
    c = 1
    while c <= 20:
        GPIO.output(25, GPIO.HIGH)
        sleep(0.2)
        GPIO.output(25, GPIO.LOW)
        sleep(0.2)
        c += 1

except KeyboardInterrupt:
    pass

GPIO.cleanup()
```

どうぞお試しあれ！

ということで、今回はこのへんで・・・。
最後までお読み頂き、誠にありがとうございました。

グラビアアイドルのお姉さんを眺めながら学びたいという方はこちら
http://oppython.wp.xdomain.jp/2017/03/24/post-36/
Cognos Analytics 11.0.6 新機能 - レポート

##概要

Cognos Analytics 11.0.6のレポート新機能の紹介動画がこちらにUPされています。
https://www.youtube.com/watch?v=kBPifTJrTmw

別のこちらの投稿で概要を説明していましたが、動画を見てそれ以上に説明されていた事を投稿します。
Cognos Analytics 11.0.6 新機能一覧
http://qiita.com/shinyama/items/5f8a04138472c1e5f1dc

##新規レポートテンプレートの変更
新規にレポートを作成する際の、テンプレートは11.0.5では多数表示されていましたが、11.0.6ではシンプルにブランクのテンプレートが表示されるようになりました。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/9107120a-6e03-fd88-042f-2a85b2dcc0fc.png)

##Linege & Business Glossary
データアイテムを右クリックし、「Lineage」を選択します。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/5dcd7d29-86d1-17c8-bd21-2345bb396cae.png)

Lineageの機能は、Business ViewとTechnical Viewがあります。

Business Viewは、テキストベースの概要レベルのデータアイテム説明で、FMのパッケージのどこの場所からデータを取得してきているか確認する事ができます。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/7eacdd37-8b0c-ee0c-f617-731e357db079.png)

Technical Viewは、グラフィックベースの画面で、データの取得元がグラフィカルにより詳細に確認する事ができます。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/62ba2472-33e2-155d-fd69-fb6e2f9665f6.png)

##Freeze Column
リストのプロパティーで、「Scrollable area height」を300に設定します。
※300pixelという意味だと思います。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/b357cb6c-9693-6e56-10e3-041aaff16f9d.png)

以下のように、スクロールバー付きの高さ300pixelのリストとして表示されます。
当然スクロールしても、ヘッダーは固定されています。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/d8fab21e-54c6-d9b6-da41-a79e715453cb.png)

##Embed and Share
他のポータルなどからiFrame組み込み用にレポートのURLやiFrame記述を、Share及びEmbedのアイコンで取得できますが、レポートエントリーのMoreアイコンで使用できるようになりました。
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/4478a24b-a0e5-0c87-df92-1d12f53dde3e.png)

##レポートビュー
Cognos BIで良く使われているレポートビューですが、Cognos Analyticsではこれまでレポート実行した画面(Report View)からのみ作成が可能でしたが、Cognos BI同様にレポートエントリーのメニューから作成する事ができるようになりました。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/c071ceb2-81cc-3527-220d-5cf07c80b439.png)

##データ・モジュールでレポートを作成した場合のクエリー・エクスプローラー
以下のように、データ・モジュールをデータソースとしてレポートを作成した場合も、クエリー・エクスプローラーが使えるようになり、フィルターの作成や計算アイテムの追加をできるようになりました。
![009.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/1e545207-4a70-cb82-b6f2-0b3c6eef6606.png)
文法一覧【JavaScript】


##タグ##
###scriptタグ###
scriptタグはJavaScriptを埋め込むためのタグ。scriptタグの中にはJavaScriptを直接書き込むことができる。またscriptタグは別ファイルのJavaScriptを読み込むこともできる。

```scriptタグ
<script>
  // scriptタグの間にJavaScriptを記述する
</script>
```

##メソッド##

###window.alert()###
ブラウザでアラートを表示させるメソッド。引数としてアラートに表示させるテキストを渡す。

```window.alert()
window.alert('表示させたいテキスト')
```
※テキストはシングルクォート（'）かダブルクオート（"）で囲む。


###console.log()###

ブラウザのコンソールにテキストを表示させるメソッド。引数としてコンソールに表示させるテキストを渡す。

```console.log()
console.log('表示させたいテキスト')
```
※Macではcommand+option



##length##

配列の要素数を取得。

```length
var list = ['Ruby', 'Ruby on Rails', 'JavaScript', 'HTML', 'CSS'];
list.length; // 5が取得できる
```


##push()##

配列の一番後ろに要素を追加。引数には追加したい要素を渡す。

```
var list = ['Ruby', 'Ruby on Rails', 'JavaScript', 'HTML', 'CSS'];
list.push('jQuery');
list[list.length - 1]; // jQueryが取得できる
```
※push()は配列の末尾に要素を追加。反対に先頭に要素を追加するにはunshift()を使用。



##pop()##

配列の一番後ろの要素を削除。

```pop()
var list = ['Ruby', 'Ruby on Rails', 'JavaScript', 'HTML', 'CSS'];
list.pop();
list[list.length - 1]; // HTMLが取得できる
```
※pop()は配列の末尾の要素を削除。反対に先頭の要素を削除するにはshift()を使用。


##プロパティ##

プロパティとはオブジェクトの属性値。オブジェクトは複数のプロパティを持つことができる。プロパティは必ず属性名である"プロパティ名"とデータである"値"をセットで持つ。

```プロパティ
var obj = { プロパティ名1: 値1, プロパティ名2: 値2 };
```

##for##
繰り返しはfor文を使う。

```
for (var i = 0; i < 繰り返す回数; i = i + 1) {
  // 繰り返す処理の内容
}
```

i = i + 1の部分は変数iを1増やすという意味。この部分は処理が一回繰り返すごとに呼ばれる。つまり、変数iは処理が1回呼ばれると1増える。
インデックスについて【MYSQL】

##インデックスについて##
####インデックスとは####
テーブル操作の中でレコードの検索が多々起きる。例えばusersテーブル内をnameカラムで検索したい場合などがえる。こういったテーブル内で検索が頻繁に行われるカラムにインデックスを設定することで検索の高速化を図ることができる。

####インデックスのデメリット####
速度が上がるからといってすべてのカラムにインデックスを設定してはいけない。インデックスには以下2点のデメリットが生じる。

・データを保存・更新する速度が遅くなる
・データベースの容量を使う
【macOS】Gitで毎回パスワードを聞かれる時の解決法

# git pushやgit pullで毎回パスワードを聞かれる…
macOS Sierraにアップデート以降、git pushやpull、fetchといった動作の度に、sshの秘密鍵のパスフレーズを聞かれるようになったので、その解決法です。

sshのconfigファイルの先頭に以下を定義します。

```~/.ssh/config
Host *
  UseKeychain yes
  AddKeysToAgent yes
```

これで、鍵のパスフレーズを入力した際にKeychain(キーチェーン)に自動的に保存されるようになるので、以後同じ状況になっても入力が不要になります:tada::tada:
githubの機能使い分けメモ

# wiki
コードの履歴(git log)が汚れない
　　→ wikiはコミットなしで更新が可能
検索対象でなかったが検索対象となった

# Pages
プルリクでレビューや差分の確認ができる
バージョン管理ができる

# Gist
メモや１ページに収まる内容を他人と共有できる
検索が不自由 ( 作成したユーザ名でしか検索できない )
例) user:[ユーザ名]検索ワード
検索結果でかかるフィルター：言語情報のみ
Reduxのreducerの実験

reducerの作り方が色々な方法があるし、combineReducersだけ使うと、各stateでreducerを分けたときに、その他のstateの情報がとれないので困った。あとObject.assignが増えてコードがごちゃごちゃする。

解決策として、reduceReducerを使ったり、immutable.jsを使ったりするといいと色々なところに書いてあったのでとりあえず試してみた。

```src/index.js
import { createStore, combineReducers } from 'redux'
import reduceReducer from 'reduce-reducers'
import { Map, fromJS } from 'immutable'

const hoge = (state = 0, action) => {
  switch (action.type) {
    case 'HOGE':
      return state + parseInt(action.num, 10)
    default:
      return state
  }
}
const moge = (state = 1, action) => {
  switch (action.type) {
    case 'MOGE':
      return state * parseInt(action.num, 10)
    default:
      return state
  }
}
const arra = (state = [], action) => {
  state = fromJS(state)
  switch (action.type) {
    case 'ADD_ARRA':
      return state.push(
        Map({ id: action.id, name: action.name , moge: 0})
      ).toJS()
    case 'EDIT_ARRA':
      let idx = state.findIndex(s => s.get('id') === action.id)
      return state.setIn([idx, 'name'], action.name).toJS()
    default:
      return state.toJS()
  }
}
const arraForMoge = (state, action) => {
  state = fromJS(state)
  switch (action.type) {
    case 'ADD_ARRA':
      return state.setIn(['arra', -1, 'moge'], state.get('moge')).toJS()
    case 'EDIT_ARRA':
      let idx = state.get('arra').findIndex(s => s.get('id') === action.id)
      return state.setIn(['arra', idx, 'moge'], state.get('moge')).toJS()
    default:
      return state.toJS()
  }
}
const redu = combineReducers({ hoge, moge, arra })
const reducer = reduceReducer(redu, arraForMoge);
let store = createStore(reducer)

store.subscribe(() => {
  console.log(store.getState())
})

store.dispatch({type: 'HOGE', num: 3})
store.dispatch({type: 'HOGE', num: 5})
store.dispatch({type: 'MOGE', num: 3})
store.dispatch({type: 'ADD_ARRA', name: 'apple', id: 1})
store.dispatch({type: 'MOGE', num: 2})
store.dispatch({type: 'ADD_ARRA', name: 'orange', id: 2})
store.dispatch({type: 'MOGE', num: 4})
store.dispatch({type: 'EDIT_ARRA', name: 'coffee', id: 1})
store.dispatch({type: 'MOGE', num: 5})
store.dispatch({type: 'ADD_ARRA', name: 'mame', id: 3})
```

immutable.jsは確かに便利だなーと思った。reduceReducersの使い方は、別のstateが必要なところを残して、全部一回combineReducersしてからreduceReducersを使ってみた。なんか非効率な気がする。もしかしてcombineReducers使わなくてもいいんじゃないかとも思った。でもstate数がめちゃくちゃ増えたときはやっぱりcombineReducersを前提にした方がいいのかなーとも思った。あとは、[ここ](https://www.wantedly.com/companies/wantedly/post_articles/28935)にimmutableを使ってモデルを作ることで効率化できると書いてあるので、それを試してみつつ、大きなstateのコードをgithubとかで探してみてみようかなと思った。
MonoDevelop-Unityでソリューションウィンドウを表示させたい

#MonoDevelop-Unityを使っているとソリューションウィンドウが表示されなくてウザい
使っていると何故かソリューションウィンドウが表示されなくなることがある
どこから再表示されるかわからず5分ほど色々彷徨ってしまったのでメモ
(ファイルタブをダブルクリックしても再表示されない時の話です)

## MonoDevelopの基本的な画面構成
MonoDevelopの基本的な画面は
- メインメニュー
- メイン画面（エディター部分）
- 各種パッド（［ソリューション］［プロパティ］［Errors］など）
から構成される
## ソリューションウィンドウ(正式にはソリューションパッド？)を表示させる
![スクリーンショット 2017-04-10 10.58.41.png](https://qiita-image-store.s3.amazonaws.com/0/144288/9fe6ee14-7f59-50db-e511-354339f58caa.png)

`メインメニュー`->`View`->`Pads`->`Solution`を選択
これで表示されます

# 教訓
Padsと言う呼び名を知らなかったので検索に時間を要してしまった・・・
名前を知ることでググラビリティが高くなるので、名前はきちんと把握しておくことはとても大事
以前はRailsで->(読み:ハッシュロケット)の名前を知らなくて彷徨ったり・・・
【JavaScript】配列要素の基本操作とカタカナのsort

JSを基礎から勉強中で、配列要素の基本的な操作を学びました。
使用している教本はオライリー「初めてのJavaScript」です。


#push, pop, unshift, shift
最後に要素を追加、削除、先頭に要素を追加、削除。
どちらも要素そのものを変更するメソッド。
push / unshiftの戻り値は変更後の配列の長さ。
一方、popとshiftは削除された要素を戻す。

#concat
これは配列を追加して、そのコピーを返すメソッド。

#slice
これは部分配列を返す。

#splice（接合する、接ぐ）
引数が多め。
最初に指定した引数の位置から、次に指定した引数の数だけ削除（0だと削除しない）、第3引数以降に追加する要素を指定
戻り値は、削除された要素からなる配列。

#copyWithin
ES2015で導入。配列のある部分を同じ配列内の部分にコピーし、そこに以前あった要素を上書きする。
第一引数でどこにコピーするか、第2引数でどこからコピーするか、第3引数（オプション）でコピーを終了する場所。

#fill
ES2015で導入。複数の要素の値を一度に指定することができる。Arrayコンストラクトと使うことで
複数の要素の初期値を設定することができうる。一部だけの値の指定も可能。

#reverse
配列の要素を逆順に並び替える。
オブジェクト自身を返す。

#sort
配列の要素のソートをする。
数値だけじゃなくてアルファベットもソートできる。
複数の文字列の場合は、ひとつ目から見られていく。
ちなみに、カナのソートも試してみたところ可能。


```JavaScript
let arr = [5, 3, 2, 4, 1];
let arr2 = arr.sort();
console.log(arr);
console.log(arr2);
arr2.reverse();
console.log(arr); //[ 1, 2, 3, 4, 5 ]
console.log(arr2); //[ 1, 2, 3, 4, 5 ]

let arrA = ["b", "d", "e", "a", "c"];
let arrA2 = arrA.sort();
console.log(arrA); //[ 'a', 'b', 'c', 'd', 'e' ]
console.log(arrA2); //[ 'a', 'b', 'c', 'd', 'e' ]

let arrAA = ["ab", "ad", "ae", "aa", "ac"];
let arrAA2 = arrAA.sort();
console.log(arrAA); //[ 'aa', 'ab', 'ac', 'ad', 'ae' ]
console.log(arrAA2); //[ 'aa', 'ab', 'ac', 'ad', 'ae' ]

let arrAB = ["db", "bd", "ae", "ea", "cc"];
let arrAB2 = arrAB.sort();
console.log(arrAB); //[ 'ae', 'bd', 'cc', 'db', 'ea' ]
console.log(arrAB2); //[ 'ae', 'bd', 'cc', 'db', 'ea' ]

let arrカナ = ["イ", "ア", "ウ", "オ", "エ"];
let arrカナ2 = arrカナ.sort();
console.log(arrカナ); //[ 'ア', 'イ', 'ウ', 'エ', 'オ' ]
console.log(arrカナ2); //[ 'ア', 'イ', 'ウ', 'エ', 'オ' ]
```
複雑な動作をするRailsのコールバックを書きたい場合に

RailsのActiveRecordには、特定のタイミングでコールバックを実行する仕組みがあります。とはいえ、複雑な処理を行おうとすると少し悩むことになるかもしれません。

# コールバックとは
詳細は[Rails Guide](https://railsguides.jp/active_record_callbacks.html)に譲りますが、`before_save`/`after_save`など、ActiveRecordが特定の動作をした段階で動くルーチンを仕掛けることができます。

# コールバックとして設定できるもの
コールバックは`before_save 動作`というような形で定義しますが、この「動作」に指定できるものも何種類かあります。なお、Railsのコールバックは内部的に`ActiveSupport::Callbacks`（[詳細](http://api.rubyonrails.org/classes/ActiveSupport/Callbacks.html)）を使っているので、指定できるものはこれに準じます。

## ブロック、proc、lambda
「ルーチン」でいちばんイメージしやすいものですが、これらは`instance_eval`でそのインスタンスのコンテキストで実行されます[^1]。比較的わかりやすいとは思いますが、複雑な処理を書くには向かない書式です。

* メリット： ごくかんたんな処理を行う場合、シンプルに書ける
* デメリット：複雑なものを書くには向かない

```ruby
before_validation do
  # 中身は省略
end
```

## シンボル
シンボルを渡した場合、インスタンスに対してシンボルの名前のメソッドが実行されます。

* メリット：モデルのインスタンス変数も使える
* デメリット：コールバック専用のコードだった場合、インスタンスにメソッドとして持たせるのはじゃまになる

```rb
before_validation :convert_name
```

## その他のオブジェクト
その他のオブジェクトを渡すと、そのオブジェクトの、コールバック名と同じメソッドを、モデルインスタンスを引数にして呼び出します。コールバックを別なところへ分離できて便利です。

### コールバックオブジェクトのインスタンスについて
この形で指定する場合、`after_save SomeObject.new`のようにも書けますが、クラス内に書くことからもわかるように、インスタンスは**モデル全体で共通**ですので、引数指定でインスタンスを作り分ける、というような状況でなければわざわざインスタンスを作る意味もそこまで大きくありません。そのメソッドを[モジュールメソッド](http://qiita.com/jkr_2255/items/3a6049b39ac8272ba06c)として実装して、Moduleオブジェクトそのものを指定する、という手段もありです。

### インスタンス変数を引き回したい！
ただ、モジュールメソッドで実装してしまうと、`CallBackModule.after_xxx(model)`のような形で呼ばれることとなります。下請けメソッドが必要な規模のコールバックを書こうとすれば、モデル内の値を参照するのに、いちいち`model`を引き回す必要が出てきてしまいます。

これでは不便ですし、モデル以外にインスタンス変数やメソッドを持たせても便利ですので、「外から見ればクラスメソッド、内部処理はインスタンスを作ってそこで処理」というような形で書けば、使う方も中身も比較的わかりやすくなります。

```rb
class SomeCallback
  # インスタンス変数の準備
  def initialize(model)
    @model = model
    @some_children = @model.some_children
  end

  # インスタンス変数を使って作業
  def all_children?
    @some_children.all? do
      # 略
    end
  end

  # メインルーチン
  def after_save
    some_value = all_children ? @model.some_value : 5
    # 後略
  end

  # フロントエンド用メソッド
  def self.after_save(model)
    new(model).after_save
  end

  # 外部から直接newはしない
  private_class_method :new
end


# モデル側
after_save SomeCallback
```


[^1]: 文字列も`instance_eval`されますが、これは非推奨とのことです。
Java の Try-with-Resources で、try句中に return してもちゃんと close されるから気にせず return しよう

## Try-Catch-Finally は問題ない

Try-Catch-Finally の try句中で return した場合、ちゃんと finally句が実行されることはこちらの記事から確認できる。

[try-catch-finally句内のreturnについて](http://qiita.com/eijenson/items/7e9e112e69b37f72353c)

## Try-with-Resources で実際に確認してみた

ここで疑問。Java でよく似た Try-with-Resources ではきちんとリソースを close してくれるのだろうか？
実際に確認してみた。

[https://github.com/takeo-asai/try-with-resources](https://github.com/takeo-asai/try-with-resources)

```java
public class Main {
    public static void main(String[] args) {
        System.out.println("Begin Main");
        tryWithResources();
        System.out.println("End Main");
    }

    private static void tryWithResources() {
        try (MockConnection connection = new MockConnection();) {
            System.out.println("tryWithResources");
            return;
        }
    }
}
```

```java
public class MockConnection implements AutoCloseable {
    public void close() {
        System.out.println("MockConnection is closed.");
    }
}
```

```log
Begin Main
tryWithResources
MockConnection is closed.
End Main
```

結論としてはちゃんと close してくれるので、ガンガン使っていこう。
`.ssh/config` の Host はワイルドカードで書ける

開発、ステージング、本番など共通の設定があるならば「*」で一括指定できる。

```bash
Host foobar-web-1
    Host 192.168.0.1
Host foobar-web-2
    Host 192.168.0.2
Host foobar-db
    Host 192.168.0.3
Host foobar-dev
    Host 192.168.0.4
Host foobar-staging
    Host 192.168.0.5

Host foobar-web*
    # WEB のみ 鍵が違う
    IdentityFile ~/.ssh/id_rsa-foobar-web

# 最初に見つかったものが使われるので、デフォルトは下に書く
Host foobar*
    # 全てのホストで、User は hoge
    User hoge
    IdentityFile ~/.ssh/id_rsa-foobar
```
情報処理学会のCGVI研究会ホストを引き受けてみました

GYAOの玉利です。

私のチームはクラウド技術開発と一緒に、産学連携・オープンイノベーションの部分も担当しています。数回に渡ってオープンイノベーションについて書こうと思います。

出向元のヤフーには実に優秀な若者が働いてまして、話を聞くと高専から「豊橋／長岡」などの技術科学大学に行っていたというではありませんか。私のある友人グループも高専のメンバーで、仕事ができるやつらばかりです。

そういえば、私の義父が豊橋技術科学大学で長く教員をした後に産学連携部門にいまして（記事の現在はすでに退職済み）、技科大の学生・院生さんの地方ゆえの就職探しの困難さについて何度も聞かされてました。基本的に全国から集まる学生さんで、就職先は地元以外になるので地方ゆえの就職活動が大変だと。

なにか産学連携でお手伝いできることはないかと相談しました。

建て付けづくり途中は長くなるので飛ばしますが、弊社(GYAO社)の映像技術領域に近いということで、映像を扱う研究室の先生をご紹介いただき、「参加メンバーが揃いやすい東京の交通が便利な場所で研究会を開きたい」ということで弊社（赤坂見附　紀尾井町ガーデンテラス）の会議室を開放して研究会を開催しました。

<img width="284" alt="スクリーンショット_2017_04_10_10_38.png" src="https://qiita-image-store.s3.amazonaws.com/0/113049/d4dabe16-373e-4914-4ec5-892fcbd47c4e.png">


人数は５０名近くの人が集まっていただいて、研究会としては大盛況だったようでした。私自身は階下の受付でひたすら来場者の案内と仕事をしていたので、内容をお聞きできなかったのが残念です。大きいビルの入り口は寒いですね。。。

## 準備

これが異常に面倒でした。弊社側のしくみの問題でビルの勤務エリア入館には事前のメンバー登録が必要なのですが、飛び入りOKという立て付けの研究会のため社内交渉が。。。このあたりは役に立たないノウハウなので省きます。

* 日程を決める
* 会議室を押さえる。理事会なども開催するので、そちらの部屋も用意
* ポスターセッション用にホワイトボードをたくさん手配（壁にテープ貼るのは禁止だったため）
* 理事会の昼食弁当・懇親会用の軽食手配。
* 当日進行表の作成
* 館内案内の作成（地図・昼食・wifiパスワード・喫煙所案内等)

## ふりかえり

結論としては成功だったのですが、いくつか反省すべき点がありました。ノウハウとして後悔もとい公開しておきます。

* ものごとを決めるのに、メールだと非常に待ち時間コストが高いので、メッセンジャーや共有ツール的なものを使うべきだった(Slack/Google Docs,JIRA等)
* 担当の先生は事務作業が苦手だったので、もう少し早めにフォローとプッシュしておけばよかった

## おわりに

GYAO社として、エンジニア主導でイベントをやる最初の試みとして学会研究会のホストをしてみましたが、実際にやってみると会社からは効果が見えにくい評価しにくい活動でした。ただし太っ腹な会社のおかげで、今後も続けていくことができそうです。

GYAO社では、エンタメテックのエンジニアを集めるイベントも5月に企画しています。是非とも同じ業界の皆さんになにか良い刺激を持ち帰っていただきたいと思います。
Sublime Text でマークダウン編集環境を作成する

マークダウンで資料作ると便利なのでちょっとSublimeで編集環境を構築してみました。
その時の備忘録です。

##まずはパッケージのインストール
パッケージコントローラーは入っている事が前提として記載しています。

* command + sift + p でパッケージコントローラを立ち上げる
* OmniMarkup Previewer（リアルタイムプレビュー）
* Monokai Extended（シンタックスハイライト）
* Markdown Extended（挿入したコードのシンタックスハイライト）

##OmniMarkupPreviewerの設定
Preferences > Package Settings > OmniMarkupPreviewer > Settings - User に以下の内容を設定する

```
{
  "renderer_options-MarkdownRenderer": {
    "extensions": ["tables", "fenced_code", "codehilite"]
  }
}
```
##OmniMarkupPreviewerの使い方

* command + option + o でプレビュー
* command + option + x でｈｔｍｌ形式にエクスポート

##参考

* [[備忘録] 今さらSublime Text3でのMarkdown編集環境構築](http://qiita.com/AnnPin/items/7a42208e044a70e75fe2)
* [OmniMarkupPreviewerでブラウザプレビューすると404エラーになる](http://mikan.lunarscape.net/2016/09/omp-404error.html)
* [Sublime Text で Markdown を快適にする3つのパッケージ](http://webmem.hatenablog.com/entry/sublime-text-markdown)