OmniAICreator/Qiita-1.07M huggingface dataset:
Cognos Analytics 11.0.7 新機能 - レポートパフォーマンスチェック

#概要
Cognos Analytics 11.0.7の新機能を、興味を持った順に触ってみて、紹介していきます。

今回は、レポートの機能の新機能の「レポートパフォーマンスチェック」の機能です。

レポートの機能の中で、レポートの実行時に、グラフやリストなどの各オブジェクト毎に、クエリー及びレンダリング(描画)で、どれくらいの時間を要したかを確認する事ができるようになりました。

こんなイメージですね。
各オブジェクトの下に、実行時間が表示されているのがわかります。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/4da36f45-8bae-cf6c-cf81-67730c436231.png)

#内容
手順と機能をもう少し詳細に記載します。

レポートの機能で、「実行オプション」から「実行オプションを表示」を選択します。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/3dfdd683-add1-0b32-cc24-f22d841d2353.png)

「パフォーマンス詳細を含める」にチェックしてOK。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/01d84376-11ba-818f-b67e-3bb0549021f3.png)

再度「実行オプション」からHTML形式でレポートを実行します。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/eda6d038-7838-eab5-f3a1-514765b29912.png)

レポート実行画面で、各オブジェクトの下に事項時間が表示されています。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/2e277ab3-99f7-1243-f51b-444fa3583280.png)

「i」マークにカーソルを当ててみると、Render(描画時間)とQuery(クエリー時間)が表示されます。 
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/5f328462-5518-79dc-3015-98446443127b.png)

レポート全体の「i」の場合、以下のような情報が表示されます。
Process Idは、レポートを実行したBIBusTKServerMainのプロセスID。
Request Idから、cogserver.logや監査ログなどでもっと詳細な情報を確認できます。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/14fafec4-bd96-9c4e-39b0-73c7ed08045e.png)

#参考
情報元の記事です。
**Interactively view report performance**
https://www.ibm.com/communities/analytics/cognos-analytics-blog/interactively-view-report-performance/

その他、Cognos Analytics 11.0.7の新機能はこちらです。
**Cognos Analytics 11.0.7 新機能紹介**
http://qiita.com/shinyama/items/174fd2be7f37de277fa2
Visual Studio Code の Proxy設定

# 目的
- Proxy環境下において各種アップデートを実施したい

# 環境
- Windows 7 Professional SP1 64bit
- Visual Studio Code 1.15.1

# http.proxy 設定
1. `ctrl + shift + P`にてPreferenceを開く
2. `User Setting`と入力
3. http.proxy にプロキシサーバーのアドレスとポートを記載

```settings.json
{
"http.proxy":"http://proxy.co.jp:8080"
}
```
MyBatis で生成されたSQLを確認する方法を知りませんか？

MyBatis を使ってWeb アプリを作成し、テストしています。
eclipse を使ってローカルでテストしていたときに得られた結果と、仮想環境にサーバーを構築して、
テストしたときに結果が違います。
おそらくMySQLの設定に違いがあるのだろうと思っているのですが、MySQLのコンソールで同じSQLを叩いた分には同じ結果が得られました。
そうなると、MyBatisで作られたSQLを直に確認したくなったのですが、コードをデバッグしながら追ってもよくわかりませんでした。
ローカル環境：
　OS:Windows10
　MySQL:5.7.17
仮想サーバー環境：
　OS:Ubuntu
　MySQL:5.7.19-Oubunt

少ない情報で申し訳ありませんが、よろしくおねがいします。
tarのワーニング発生時の終了ステータスに注意

# tarはアーカイブ作成が最後まで完了しても終了ステータスが 0 以外になることがある！
tar コマンドはアーカイブ作成時にワーニングが発生することがあり、ワーニングが起きてもアーカイブ作成自体は最後まで完了してくれるので、簡易なバックアップ用途であれば大抵無視してよいのだが終了ステータスが `1` になってしまうので、終了しないようにしましょう。（ちゃんと考えるならファイルシステムやブロックデバイスレベルでスナップショットを取るところ）

なお致命的エラーの場合は `2` とかで終了するのでこれは止まって良いです。


# 駄目な例
```bash:
#!/bin/bash
set -e
tar cfz tmp.tar.gz target/
mv tmp.tar.gz target.tar.gz
```

↑これだとファイルのアーカイブ中に以下のような状況が起きた際などに最後までアーカイブ作成は完了するが、終了ステータスが `1` になってしまい。そこでスクリプトが終了してしまう。

- アーカイブ開始した時より後にファイルの更新があった時
    - `tar: target/file: file changed as we read it`
    - `tar: target/file: 読み込んだファイルが変更されています`
- アーカイブ開始した時に存在したファイルが消えたとき
    - `tar: File removed before we read it`
    - `tar: 読み込み以前に削除されました`
- アーカイブ開始した時よりファイルサイズが小さくなった時
    - `tar: target/file: File shrank by 12345678 bytes; padding with zeros`
    - `tar: target/file: 12345678 バイト小さくなったので、ゼロで埋めます`
 

# 改善例
```bash:
#!/bin/bash
set -e
tar cfz tmp.tar.gz target/ || [[ $? == 1 ]]
mv tmp.tar.gz target.tar.gz
```

終了ステータスが 0 または 1 でも終了しないようにしたので、tarでワーニングが起きても最後の mv まで実行されるようになった。

なおワーニング表示自体出てほしくない場合は `--warning=no-file-changed`
`--warning=no-file-removed` `--warning=no-file-shrank` などのオプションを tar につけてやれば良い。ただしこれはワーニングメッセージを抑止するだけで、終了ステータスはやはり `1` になってしまうので上記対応は必要。
ASTERIA WARPでデータを縦持ちから横持ちに変換するには

### うまくいかなかったケース

[ASTERIA WARP 逆引きリファレンス](
https://www.amazon.co.jp/ASTERIA-WARP-%E9%80%86%E5%BC%95%E3%81%8D%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9-%E5%A4%A7%E6%9C%88-%E5%AE%87%E7%BE%8E/dp/4295001198/ref=pd_lpo_sbs_14_img_1?_encoding=UTF8&psc=1&refRID=XH0YRXMVSZ5R4C1J2QSY)
この本にも載っていなかったので、

ひとまず、↓の記事の
[[SQL]データの縦持ち、横持ちを入れ替える](http://dev.classmethod.jp/etc/sql-data-horizontal-vertical/)
"縦持ちのデータを横持ちに入れ替える"を読んでいただきたいです。

これをASTERIAで実行するには？

経理では、データを縦持ちでDBに格納することが多いです。
(金額情報を1レコードに一つにすると見やすいから)
例

```
// 勘定科目名,金額
売上,1000     // 1月度
売上,1500     // 2月度
売原,500      // 1月度
売原,600      // 2月度
販管費,100    // 2月度
販管費,150    // 2月度 
販管費,100    // 3月度
```

↓　以下の形で変換したい。


```
// 勘定科目名,1月度,2月度,3月度
売上,1000,1500,null
売原,500,600,null
販管費,100,150,100
```

注意点は、金額が、科目と期間でソート済みであること。

上記URLの"縦持ちのデータを横持ちに入れ替える"のサブクエリを実行すると

```sql:RecordSQL1
SELECT
field[1]
,field[2]
,row_number() over (PARTITION BY field[1]) 
FROM
in[1]
```

![qiita20170905-1.png](https://qiita-image-store.s3.amazonaws.com/0/180419/42abeb24-2074-3a5b-365c-bd4e3a4653ad.png)

と怒られてしまいます。
どうやらPARTITION句はASTERIAのRecordSQLでは非対応のようです。



### うまくいったケース
[SQL で縦横変換まとめ（pivot と unpivot）](http://qiita.com/k24d/items/79bc4828c918dfeeac34)
例。


```
// 勘定科目名,期間名,金額
売上,1月度,1000
売原,1月度,500
販管費,2月度,100
売上,2月度,1500
売原,2月度,600
販管費,2月度,150
販管費,3月度,100
```
注意すべてき点は、1列目は縦のキー,2列目は横のキー,3列目(以降)はデータ部。

↓　以下の形で変換したい。

```
// 勘定科目名,1月度,2月度,3月度
売上,1000,1500,null
売原,500,600,null
販管費,100,150,100
```
これをASTERIAで実行すると


```sql:RecordSQL2
SELECT
field[1]
,max(CASE WHEN field[2] = '1月度' THEN field[3] END)
,max(CASE WHEN field[2] = '2月度' THEN field[3] END)
,max(CASE WHEN field[2] = '3月度' THEN field[3] END)
FROM in[1]
GROUP BY field[1]
```

PARTITION句が使っていないからか、うまく出来ました。
とりあえず、横キーを追加することが大事なようです。
concrete5のファイルダウンロードをログイン必須にする

# 背景
concrete5で作ったサイトにお問い合わせフォームを作って、そこにファイル添付機能もつけた。
お問い合わせが来るとメールで通知するようにしてるけど、その中に書いてあるファイルダウンロードリンクが知られると第三者に添付ファイルが見られるので不安。

# やること
ファイルのダウンロードリンク(`http://example.com/download_file/0000/000`みたいな形式のやつ)をログインユーザーしかアクセスできないようにする。

# やりかた
applicationフォルダ内にdownload_fileコントローラのコピーを作って、オーバーライドする。

```php:application/controllers/single_page/download_file.php
<?php
namespace Application\Controller\SinglePage; // ← 忘れずnamespaceをApplicationに上書き

use PageController;
use Core;
use Page;
use Permissions;
use Concrete\Core\Entity\File\File as FileEntity;
use Concrete\Core\File\File;
use User; // ← ログインチェックのため、Userクラスをインポート

// 省略...


    protected function download(\Concrete\Core\Entity\File\File $file, $rcID = null)
    {
        // ↓以下4行を追加
        $loggedIn = User::isLoggedIn();
        if ($loggedIn == false) {
            $this->redirect('/login'); // ←好きなところにリダイレクト
        }
        
        $filename = $file->getFilename();
        $file->trackDownload($rcID);
        $fsl = $file->getFileStorageLocationObject();
        $configuration = $fsl->getConfigurationObject();
        $fv = $file->getVersion();
        if ($configuration->hasPublicURL()) {
            return \Redirect::url($fv->getURL())->send();
        } else {
            return $fv->forceDownload();
        }
    }

// 以下省略
```
こんな感じでどうでしょうか。もっといけてるやり方あったら教えてください。
visualstudio.com経由でAzureのサブスクリプションを有効にする方法

#はじめに
visualstudio.comの特典であるAzureのサブスクリプションを有効にする方法です。

#visualstudio.comにアクセスする
[visualstudio.comにアクセスしてログインする。](https://app.vsaex.visualstudio.com/)

「特典を使用する」リンクをクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/98130/be7f57c7-d39d-d68c-0b0d-5f93f38efe85.png)

特典の中から、Azureを選択して、アクティブ化を選択する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/98130/d9627ed8-d007-f993-dc1e-bc8d0faf6698.png)

#Windwos Azureの利用
サブスクリプション契約にチェックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/98130/ed4a5243-575d-bd66-26c3-2dd78d9299a9.png)

サブスクリプションの準備が整ったら、「または、Azureサブスクリプションを開始してください」をクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/98130/a5fae065-39b7-e6c7-a554-6f6ec3c89ec1.png)

Azureのダッシュボード画面が表示される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/98130/58660add-9e8d-f2fd-23ba-271682f2549c.png)


以上で設定は完了です！
[STAR-CCM+ on Rescale w/Azure] ハンズ・オン @Microsoft

Sep 27th, 2017


Rescale の実験計画法を使いパラメータスタディー機能を体験しよう
======================================================


計算実行までの Overview
------------------------

![Kobito.qRMZAh.png](https://qiita-image-store.s3.amazonaws.com/0/73207/48ee19d9-9a9a-7087-c93b-81bb14a482a9.png "Kobito.qRMZAh.png")

- [計算モデルとパラメータスタディーを行う変数](https://qiita-image-store.s3.amazonaws.com/0/73207/bc1f8ad3-b0da-7b5d-b3c8-86598d1ed6cf.png)
- [特性値](https://qiita-image-store.s3.amazonaws.com/0/73207/68693899-13a1-863e-f9dc-12ced9d381cd.png) 



計算実行方法
-------------------

- [STEP0: ジョブの作成と実験計画法の選択][STEP0]
- [STEP1: 入力ファイルのアップロード][STEP1]
- [STEP2: 並列設定(パラメータリストの定義)][STEP2]
- [STEP3: テンプレートの設定][STEP3]
- [STEP4: ソフトウェアの設定][STEP4]
- [STEP5: ハードウェアの設定][STEP5]
- [STEP6: ポストプロセッシング][STEP6]
- [STEP7: 計算の実行][STEP7]



[STEP0]:http://qiita.com/daikumatan/private/635184d3c8aa37c74c7e
[STEP1]:http://qiita.com/daikumatan/private/9647668247c50b7eaaca
[STEP2]:http://qiita.com/daikumatan/private/39c16d73bf86a809c217
[STEP3]:http://qiita.com/daikumatan/private/66ded6b4f285fe7c194c
[STEP4]:http://qiita.com/daikumatan/private/7b14ad6fcba57afd7981
[STEP5]:http://qiita.com/daikumatan/private/3bd4bec31c8bb7f7cc93
[STEP6]:http://qiita.com/daikumatan/private/ffaa51fd398203e2e9aa
[STEP7]:http://qiita.com/daikumatan/private/ca0afd813d7a71930719


計算結果確認
-------------------

- [計算結果の確認: 3Dグラフを作成する][result1]
- [計算結果の確認: ある特定のファイルを確認/Downloadする][result2]


[result1]: http://qiita.com/daikumatan/private/2ffa7d255e1210413894
[result2]: http://qiita.com/daikumatan/private/b75311cca75abba46170
エラーになる実機と普通に起動する実機

object-cを始めたばかりなのですが、現在object-cを使ったblogアクセスアプリを制作しているのですが、下記のエラーでハマっており困っています。iphone6Plus,iphone7Plusでのみ下記のエラーが出ます。

CALayer bounds contains NaN: [0 nan; 300 3.40282e+38]

Y軸と高さに問題があることはわかるのですが、コードを探ってもその問題元がどこにあるか分からない状態です。なぜ他の実機では普通に動くのにこの二つはダメなのか、いくつか対策をしてみたのですが解決には至らずここに投稿させていただきました。このようなエラーを解決したことがある方の体験談やアドバイスをお聞きしたいです。画面はStoryBordではなくxibファイルで構成しています。
環境は、Xcode Version 8.3.3　　ios 10.3 です。
Python > list > append()とextend() > append:リストが追加される | extend: リストの要素が追加される | +=でのリスト追加

```txt:動作環境
ideone (Python 3)
```

@ Scipy Lecture notes, Edition 2015.2
p14

list操作にappend()とextend()の使用例がある。

```py
L = [ 'red', 'blue', 'green', 'black', 'white' ]
L.append('pink')
...
L.extend(['pink', 'purple'])  # extend L, in-place
```

append()は使ってきたことがあったが、extend()はあまり覚えていない。


https://docs.python.jp/3/tutorial/datastructures.html
5.1. リスト型についてもう少し

> list.extend(iterable)
イテラブルのすべての要素を対象のリストに追加し、リストを拡張します。a[len(a):] = iterable と等価です。

append()とextend()を使ってみる。

https://ideone.com/CAHncZ

```py
alist = [3, 1, 4]
alist.append([1, 5, 9])
print(alist)
#
blist = [3, 1, 4]
blist.extend([1, 5, 9])
print(blist)
```

```txt:run
[3, 1, 4, [1, 5, 9]]
[3, 1, 4, 1, 5, 9]
```

### `+=`使用でのリスト追加

@shiracamus さんに`+=`を使ったリスト追加方法を教えていただきました。

情報感謝です。
PowerShellで実行中のスクリプトファイルのディレクトリを取得（PowerShell ISE対応版）

```
$ScriptDir = $null

If( $host.Name -match "ise" ){

    # On PowerShell-ISE
    $ScriptDir = Split-Path $psISE.CurrentFile.FullPath -Parent
}
Else{

    # Out of PowerShell-ISE
    If($PSVersionTable.PSVersion.Major -ge 3 ){

        # PS Version >= 3
        $ScriptDir = $PSScriptRoot
    }
    Else{

        # PS Version < 3
        $ScriptDir = Split-Path $MyInvocation.MyCommand.Path -Parent
    }
}
```
XcodeでPCL(Point Cloud Library)

PCL(Point Cloud Library)をXcodeで開発するケースはあまりないかもしれませんが、普段持ち歩いているMacと慣れたXcodeで開発したかったので、その時のインストール方法と環境構築をメモしておきます。


環境
---
Mac OS X El Capitan 10.11.6
Xcode 8.2.1
Point Cloud Library 1.8.0
vtk 8.0.0

インストール
---
```bash
sudo brew update
sudo brew tap homebrew/science
sudo brew install -vd boost Eigen flann vtk
sudo brew install -vd pcl --without-openni --with-examples
```

boost, Eigen, flann, vtkは必須。cmakeがなければ事前にインストールする。
他にもオプションでQt、QHULL、OpenNI、libusb等あるが、必要に応じて追加する。


Xcodeの設定
---
1. 新規プロジェクト ->  macOS -> Command Line Tools -> Language: C++　でプロジェクト作成。
2. TARGETSのBuild SettingからHeader Search Pathsに以下を追加。

    ```
    /usr/local/include/pcl-1.8　
    /usr/local/include/eigen3
    /usr/local/include
    /usr/local/Cellar/vtk/8.0.0/include
    ```

3. Library Search Pathsに以下を追加。

    ```
    /usr/local/lib
    /usr/local/Cellar/vtk/8.0.0/lib
    /usr/local/Cellar/boost/1.64.0_1/lib
    ```

4. TARGETSのBuild PhasesからLink Binary with Librariesに以下を追加

    ```
    OpenGL
    Cocoa.framework
    IOKit.framework
    libz.tbd
    /usr/local/Cellar/vtk/8.0.0/lib/libvtk*.dylib 
    /usr/local/Cellar/pcl/1.8.0/lib/libpcl*.dylib
    ```
libvtk*.dylibとlibpcl*.dylibは全部選択しているが、必要な機能だけに絞ったほうが良い。Link Binary with Librariesの代わりにBuild SettingのOther Linker Flagsで設定でもOK（むしろこっちが良いかも）。
```
-lpcl_common -lpcl_visualization -lboost_thread-mt -lpcl_io -lpcl_filters 
```

ビルド＆実行
---
[チュートリアル](http://www.pointclouds.org/documentation/tutorials/)などからサンプルソースを適当にとってきて、main.cppにペースト。
`cmd-b` ビルド　
`cmd-r` 実行




参考
---
Installing on Mac OS X using Homebrew
http://www.pointclouds.org/documentation/tutorials/installing_homebrew.php
選ばれし Android アプリだけが利用できる com.google.android.finsky.activities.InlineAppDetailsDialog

## `com.google.android.finsky.activities.InlineAppDetailsDialog` とは？

Android 版の [Facebook](https://play.google.com/store/apps/details?id=com.facebook.katana) や [YouTube](https://play.google.com/store/apps/details?id=com.google.android.youtube) などで広告表示されているアプリを [Google Play](https://play.google.com/store) ストアからインストールする際に使用されるダイアログです。

※ パッケージ＆クラス名については [`adb shell dumpsys activity top`](https://moneyforward.com/engineers_blog/2014/11/17/android%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E8%80%85%E3%81%AA%E3%82%89%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8F%E3%81%B9%E3%81%8Ddumpsys%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/) で確認しました :mag:

### [Facebook](https://play.google.com/store/apps/details?id=com.facebook.katana) アプリでの使用例

| 図1. タイムラインの広告 | 図2. ダイアログ表示 |
|:------:|:-------:|
|![20170903_171039.jpg](https://qiita-image-store.s3.amazonaws.com/0/6881/5390849e-6873-11f0-b486-2a99f1484a97.jpeg)|![20170903_171055.jpg](https://qiita-image-store.s3.amazonaws.com/0/6881/5f4a2807-ca72-4957-6bc4-bf59c5f68951.jpeg)|

### [YouTube](https://play.google.com/store/apps/details?id=com.google.android.youtube) アプリでの使用例

| 図1. インストール前 | 図2. インストール中 |
|:------:|:-------:|
|![20170903_000546.jpg](https://qiita-image-store.s3.amazonaws.com/0/6881/1b542495-f658-c142-5888-2cac8c35bd51.jpeg)|![20170903_000633.jpg](https://qiita-image-store.s3.amazonaws.com/0/6881/3d65c4bf-854d-7ae6-f0e0-c22f05aa1247.jpeg)|

## 自作アプリでも利用できないものか？

調べてみたところ、Stack Overflow に[回答](https://stackoverflow.com/questions/42734624/open-google-play-dialog-from-my-app)がありました。

- 許可されたアプリ以外は利用できない :no_good_tone1:
    - 呼び出し元アプリのパッケージをチェックしている
- [Facebook](https://play.google.com/store/apps/details?id=com.facebook.katana) や [Flipboard](https://play.google.com/store/apps/details?id=flipboard.app), [KakaoTalk](https://play.google.com/store/apps/details?id=com.kakao.talk),
 [LinkedIn](https://play.google.com/store/apps/details?id=com.linkedin.android), [Pinterest](https://play.google.com/store/apps/details?id=com.pinterest), [Twitter](https://play.google.com/store/apps/details?id=com.twitter.android), [YouTube](https://play.google.com/store/apps/details?id=com.google.android.youtube) など限られたアプリのみが利用可能 :ok_woman_tone1:
- 一般公開されるまで待つしかない :hourglass_flowing_sand:

## まとめ

Android で [Google Play](https://play.google.com/store) ストアのアプリ詳細画面を表示する場合は[既存の方法](https://developer.android.com/distribute/marketing-tools/linking-to-google-play.html#android-app)で我慢しましょう。

``` Java
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("market://details?id=com.epicactiononline.ffxv.ane"));
startActivity(intent);
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/6881/15c5b275-f9e1-25d0-b063-39c3e1ff7dbb.jpeg" width="350px" />
Microsoft TeamsにC#で投稿

## 1.Incoming Webhook
以下の方法に従ってPOST先のIncoming WebhookのURIを取得します。
[webhookを追加します。-Officeサポート](https://support.office.com/ja-jp/article/%E4%BD%9C%E6%88%90%E3%81%97%E3%81%A6%E3%83%81%E3%83%BC%E3%83%A0%E3%81%A7%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B-webhook-%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%99%E3%80%82-8e1a1648-982f-4511-b342-6d8492437207)

## 2.コード
※サンプルです。頻繁に通信が発生する場合はHttpClientをusingで破棄しないようにしましょう。

```csharp:PostToTeams.cs
using Newtonsoft.Json;


string url = "IncomingwebhookのURI";

using (HttpClient httpClient = new HttpClient())
{
  var param = new Hashtable();
  // とりあえずTextパラメータは必須
  param["Text"] = "hogehoge message";
  var json = JsonConvert.SerializeObject(param);

  var content = new StringContent(json);
  HttpResponseMessage response = await httpClient.PostAsync(url, content);
}
```

# 3.Actionable message card reference
[このサイト](https://docs.microsoft.com/en-us/outlook/actionable-messages/card-reference)に従いパラメータを追加すると、
よりリッチな表示を投稿することができます。

その場合、JSONの階層を深くする必要が出てくることがあるので、投稿内容に合わせたModelを作ってJSONにシリアライズすれば良いと思います。（未検証)
namespaceの重複

##名前空間の重複

railsはクラス名を自動解決してくれたりするので、場合によってはうまく解決出来ないケースがある

##エラーになったケース

```app/controllers/hoge/piyo_controller.rb
tmp = Hoge::Foo.new
```

```app/services/hoge/foo.rb
module Hoge
  class Foo
    〜略〜
  end
end
```

この場合、controller側で
`uninitialized constant Hoge::Foo`
となる。
理由は`Fooクラス`を`app/controllers/hoge`から探してしまうためである。

##解決方法


```app/controllers/hoge/piyo_controller.rb
tmp = ::Hoge::Foo.new
```

このように先頭に`::`をつけてあげると、親の方から探してくれる。
Cognos Analytics 11.0.7 新機能 - インタラクティブ・フィルター

#概要
Cognos Analytics 11.0.7の新機能を、興味を持った順に触ってみて、紹介していきます。

今回は、レポートの機能の新機能の「インタラクティブ・フィルター」の機能です。

レポートのHTML実行後の画面で、結果に対してフィルターをエンドユーザーが追加できる機能です。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/a2695111-fa31-63cd-3f7c-9368556e4bd4.png)


#内容
まずは、普通にこんな4つのリストで構成されるレポートを作ったとします。
左上のリストと右下のリストのみ、同一クエリーで生成しています。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/8dc28bbd-abc1-ebd9-4992-861829efe67e.png)

左上のリストの「登山用品」をクリックし、表示される「フィルター」アイコンから「登山用品を含める」を選択します。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/ec61a46b-846a-7ef9-0f74-1bd95527e1dd.png)

すると、左上のリストは「登山用品」のみに絞り込まれ、同時に右側のツールバーのフィルターアイコンで表示されるフィルターウィンドウに、今作成したフィルターの内容が「"クエリー4"の表示中 [製品ライン]が[登山用品]を含む」という記載で表示されます。
同時に、同じクエリーから作成されている、右下のリストも「登山用品」のみに絞り込まれています。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/f9c5ce63-a817-5373-a11c-6969a4974ccd.png)

右上のリストを選択し、今度は「カスタム・フィルターの作成」をやってみます。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/7d2b7df3-8c1a-1eb8-a9d6-d1d02aaf6691.png)

こんな画面で、自由に保持・除外アイテムを選択できます。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/9ea2ee3a-6a45-d1a2-10c0-4f418875a816.png)

右上のリスト用のフィルターが生成されました。
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/338ca681-bd40-d120-8430-6aa2c17aa047.png)

左下リストで、数値の「年」を対象とした場合、画面のように比較のフィルターを指定できました。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/f5c34beb-aed4-2155-43e2-e1f979e8125d.png)

このような表示になります。
先に作成したフィルターが見えなくなってしまった場合は「すべて表示」をクリックします。
![009.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/aaf50b26-e182-466b-ecf8-d5aed4fdbcde.png)

全てのフィルターが見えました。
![010.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/9fba6524-f4c5-4bb4-9791-ec694e7c7ae9.png)

不要になったフィルターを消してみます。赤枠のアイコンを選択します。
![011.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/010eb979-8bee-484e-a433-0dde1a27eaa3.png)

右上のリストのフィルターが削除されました。
リストに表示されるデータも、製品ラインが全て表示されています。
![012.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/df11a406-f6b8-feae-21c1-b02d4173b968.png)

ちなみに、フィルターをクリックすると、どのオブジェクトがこのフィルターを使用しているかわかるように、青い点線でオブジェクトが囲まれます。
![013.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/cb317224-1d6c-19b0-acf2-dd45e480649d.png)

今度はフィルターを編集してみます。
「登山用品」だけでなく「個人装備」も追加しました。
![014.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/31c9e782-93a0-101e-6e31-eb0ed4b7c6a6.png)

リストの表示に「個人装備」が追加されました。
![015.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/9a62a3f6-698f-220b-15c4-3d591a92e7d6.png)

という感じですね。
レポート実行後のHTML画面で、エンドユーザーがこんなに簡単にフィルターの追加・把握ができる、という機能になります。

#参考
その他、Cognos Analytics 11.0.7の新機能はこちらです。
**Cognos Analytics 11.0.7 新機能紹介**
http://qiita.com/shinyama/items/174fd2be7f37de277fa2
Reactで指定の要素まで自動スクロールさせる

# はじめに
Reactで、ページ上部にスクロールや指定のidやclassまでスクロールさせたいことがあったので、Reactで使えるスクローラー作りました。

# react-smooth-scroller

Github: [https://github.com/gurimon/react-smooth-scroller](https://github.com/gurimon/react-smooth-scroller)

## Installation
```shell-session
$ npm i -S react-smooth-scroller

or

$ yarn add react-smooth-scroller
```

## Usage
```js
// ES2015 imports
import rsScroller from 'react-smooth-scroller';

// ES5 require
const rsScroller = require('react-smooth-scroller');
```

## API

### rsScroller#scrollToTop(option)

```js
rsScroller.scrollToTop();

// custom
rsScroller.scrollToTop({ easing: 'linear', duration: 1500, frame: 20, revise: 100 });
```

### rsScroller#scrollToTarget(classname, option)

```js
rsScroller.scrollToTarget('hoge');

// custom
rsScroller.scrollToTarget('hoge', { easing: 'linear', duration: 1500, frame: 20, revise: 100 });
```

### rsScroller#scrollReset()


#### option
|Key|Type|Default|Description|
|---|---|---|---|---|
|easing|string|easeOutQuint|[easing](#easing)|
|duration|number|1000|all time|
|frame|number|13|one frame time|
|revise|number|0|revise pixel|

#### easing
- linear
- easeInQuad
- easeOutQuad
- easeInOutQuad
- easeInCubic
- easeOutCubic
- easeInOutCubic
- easeInQuart
- easeOutQuart
- easeInOutQuart
- easeInQuint
- easeOutQuint
- easeInOutQuint
- easeInSine
- easeOutSine
- easeInOutSine
- easeInExpo
- easeOutExpo
- easeInOutExpo
- easeInCirc
- easeOutCirc
- easeInOutCirc
- easeInElastic
- easeOutElastic
- easeInBack
- easeOutBack
- easeInOutBack
- easeInBounce
- easeOutBounce
- easeInOutBounce

## Use with React

```js
import React from 'react';
import rsScroller from 'react-smooth-scroller';

class Test extends Component {
  onScrollTop() {
    rsScroller.scrollToTop();
  }

  onScrollTarget(classname) {
    rsScroller.scrollToTarget(classname);
  }

  render() {
    return (
      <div className="test">
        <h1>react-smooth-scroller</h1>
        <div className="test__desc">
          <p>test</p>
          <a onClick={() => this.onScrollTarget('hoge')} className="btn">button-A</a>
        </div>
        <a onClick={() => this.onScrollTop()} className="btn hoge">button-B</a>
      </div>
    )
  }
});
```
UACの回避方法

いまさらながら必要に駆られて調査したときのメモです。OSはWindows7でしか確認してません。

###1. タスクスケジューラを使ってタスクの作成をおこなう
実行したいプログラム名をapp.exeとするとき、
タスクスケジューラの「操作」プロパティにて、
プログラム/スクリプトを
  `C:\Windows\System32\cmd.exe`
と設定し、
引数を
  `/c start "" "app.exe"`
と設定する。

###2. タスクをCreateProcess()で実行する

1.で作成したタスク(task_name)を実行するコマンドラインは以下のとおり。
　`C:\Windows\System32\schtasks.exe /run /tn "task_name"`

タスクスケジューラで実行させたプロセスの優先度は"通常以下"になるのですが、
優先度の設定方法については別途ググッてください＾＾；；；
(今回の私の件では、シグナル/メッセージを本体に送るプログラムの起動だけが必要だったので、優先度設定は不要だった)
IntelliJ IDEAにAndroid App 開発環境を作成


Androidアプリを始めてみようと考えたが，環境がない・・・，ので
IntelliJにAndroid Studioの機能があるため，今回はそれを使おう!!!

# セットアップ環境
MacBook Air (13-inch, Mid 2013)
OS X El Capitan

# Android SDK
Android SDKをIntelliJに組み込んでいきます．

## SDKをダウンロード
[sdkmanager|Android Studio](https://developer.android.com/studio/index.html)

今回は，Android Studioを使わない方向なので，コマンドラインツールのみを取得する．

インストールするために適当な場所に移動させる．

```bash
unzip sdk-tools-darwin-3859397.zip
mv tools ~/Application/
~/Application/tools/bin/sdkmanager
```

## Android SDK インストール
sdkmanagerを用いて，Android SDKをインストールする．
今回は，
* build-tools;26.0.1 
* platforms;android-26
* emulator
* tools

をインストールする．

```bash
# インストール可能なものをリストアップ
~/Application/tools/bin/sdkmanager --list
# インストール
~/Application/tools/bin/sdkmanager "build-tools;26.0.1" "platforms;android-26" "emulator" "tools"
```

~/Application/の下にインストールしたものが色々入っている．

## IntelliJにAndroid SDKを追加
IntelliJを起動して，Configure > Project Default > Project Structure の "+"ボタンを押してAndroid SDKを追加する．

![スクリーンショット 2017-09-04 11.18.03.png](https://qiita-image-store.s3.amazonaws.com/0/152224/c41e0f30-46c6-ee25-b352-f5c67b490167.png "スクリーンショット 2017-09-04 11.18.03.png")

すると，ファイル選択画面が出るので，~/Applicationを指定する．

これで簡単なAndroidの設定はできたと思う・・・．

# Emulatorの高速化
デフォルトでは，Android Emulatorは付属してるが，何もしないと起動に時間がかかりすぎる！なので，高速化をしましょう!!!

## 必要なSDKのインストール
* Intel x86 Atom System Image
* Intel x86 Emulator Accelerator (HAXM installer)

をインストールする．
Tools > Android > SDK Managerを起動．
SDK PlatformsでShow Package detailにチェックして，使うAPIのVersionの "Intel x86 Atom System Image" にチェックを入れる．

![スクリーンショット 2017-09-04 23.52.23.png](https://qiita-image-store.s3.amazonaws.com/0/152224/af3b0842-7058-ac06-328d-86f70ae7ad7c.png "スクリーンショット 2017-09-04 23.52.23.png")

後，SDK Toolsの "Intel x86 Emulator Accelerator (HAXM installer)"にもチェックを入れる．

## Intel x86 Emulator Accelerator(HAXM)のインストール
先ほど，Android ManagerでHAXMを選択したが，インストーラーをダウンロードしただけで，インストールはされていない．

SDKを配置した場所(~/Application/IntelliJ)から，extras/intel/Hardware_Accelerated_Execution_Manager/??????.dmgファイルでHAXMをインストールする．

これで，emulatorの起動時間が30秒ぐらいになった!!

![スクリーンショット 2017-09-05 11.13.42.png](https://qiita-image-store.s3.amazonaws.com/0/152224/9fb8aabf-cec2-345c-ba9f-5c314c758c6d.png "スクリーンショット 2017-09-05 11.13.42.png")



# 参考文献
[Android sdk for Intellij IDEA | stackoverflow](https://stackoverflow.com/questions/43448336/android-sdk-for-intellij-idea)
[Androidエミュレータは遅い！重い！！Intel x86設定で高速化して使うべし](https://saku-java.be-ourselves.jp/2014/05/18/intel-x86-android-emulator-setting/)
添え字をそのままに複数の配列をマージする

以下のような形の複数の配列を添え字（キー）をそのままにマージする必要があった

```php

$list1 = array(101 => '田中一郎',
               201 => '吉田二郎',
               305 => '佐藤三郎'
         );

$list2 = array(101 => '田中一郎',
               403 => '平野四郎',
               504 => '松田五郎'
         );
```

理想とする出力結果

```php

$list3 = array(101 => '田中一郎',
               201 => '吉田二郎',
               305 => '佐藤三郎',
               403 => '平野四郎',
               504 => '松田五郎'
         );
```

PHPの配列マージといえば、真っ先に思い浮かぶのがarray_merge()だが
これは添え字が文字列でない場合は、マージ結果の配列に対して添え字を振りなおしてしまうので
うまくいかなかった

### array_replace_recursive()

関数を使うことでうまくマージすることができた
scroll

```
scroll

```
要素がスクロールした時のイベントとして関数を指定できます。windowやCSSのoveflowが scroll である要素などに使用可能です。

```
$(window).scroll(function() {
    // windowがスクロールされた時に実行する処理
});

$("div").scroll(function() {
    // div要素内でスクロールされた時に実行する処理
});

```

この書き方は

```

bind("scroll", fun)と同じです。

```

```

$(window).bind("scroll", function() {
    // 実行したい処理
});

```
scrollTop()

```
scrollTop()

```

最初の要素の現在のスクロール上の上位置を取得します。
この関数は、要素の表示／非表示状態にかかわらず機能します。

```

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <script src="/jquery/js/jquery.js"></script>
  
  <script>
  $(document).ready(function(){
    $('div').scroll(function(){
      $('#out').text('scrollTop: '+$(this).scrollTop());
    });
  });
  </script>
  <style>
  div {
    height: 80px;
    overflow: auto;
    border: 1px solid black;
  }
  </style>
</head>
<body>
  <p id="out">scrollTop: </p>
  <div>a<br/>b<br/>c<br/>d<br/>e<br/>f<br/>g<br/>h<br/>i<br/>j<br/></div>
</body>
</html>

```
Amazon Cognitoを使って認証つきのAmazon API Gatewayを作成する方法

# はじめに
特定のユーザのみにAmazon API Gatewayを提供したいと思い調査したので、
そのときのメモをまとめました。

# API Gatewayとは
名前の通り、APIの入り口となるようなサービスです。
API Gatewayを経由し、Lambda関数を呼び出したり別のエンドポイントにアクセスしたりできます。
デフォルトでは認証なしの状態で作成されるため、誰でもAPIアクセスが可能です。

# Cognitoとは
AWSが提供する認証関連のサービスです。
3つの機能で構成されています。

* Amazon Cognito ユーザープール
IdPとして働き、ユーザ情報の管理を行います。

* Amazon Cognito フェデレーテッドアイデンティティ
IdPと連携して新たなIDを作成し、ユーザにひもづく複数のIdPを統合して取り扱うことができます。
また、権限が制限された一時的なAWS認証情報を取得して、他のAWSサービスにアクセスが可能です。

* Amazon Cognito Sync
デバイスごとのデータ連携等で利用します。
今回はあまり調査をしていませんので割愛。


# API Gatewayの認証方法
「メソッドリクエスト」のところにある「認証」から選択ができます。

## カスタムオーソライザー

### API Gatewayの設定
APIの「オーソライザー」から、「Cognitoユーザープールオーソライザー」を選択します。
適宜ユーザープールを選択し設定完了です。

そのあと、メソッドリクエストに先ほど作成したカスタムオーソライザが表示されているので、
そちらを選択してください。

### 呼び出し元の実装
カスタムオーソライザーのデフォルトでは、Cognito UserPoolから払い出された「IDトークン」「アクセストークン」「リフレッシュトークン」のうち、「IDトークン」をAuthorizationヘッダに付与して送信することで認証が行われます。

## IAM

### API Gatewayの設定
「認証」で「IAM」を選択してください。

### 呼び出し元の実装
こちら少し複雑ですが、

1. Cognito ユーザープールから「IDトークン」「アクセストークン」「リフレッシュトークン」を取得
2. Cognito フェデレーテッドアイデンティティに「IDトークン」を送付
3. Cognito フェデレーテッドアイデンティティが内部でSTSと通信し、一時的な認証情報を取得しクライアントへ
4. クライアントは、フェデレーテッドアイデンティティから受け取った「アクセスキーID」「セキュリティキー」「セッショントークン」をもとに署名を行う
5. 署名された文字列をAuthorizationヘッダまたはクエリ文字列に付与して送信する

といった流れになります。
署名関連については、[署名バージョン4を使用してAWSリクエストに署名する](https://docs.aws.amazon.com/ja_jp/general/latest/gr/sigv4_signing.html)を確認ください。
署名の実装についてですが、JavaScriptであれば[aws4](https://github.com/mhart/aws4)等を利用すると楽かと思います。

## カスタムオーソライザーとIAMの比較
|認証方法|認証に必要な情報|設定方法|利用するサービス|補足|
|:---|:---|:---|:---|:---|:---|:---|
|カスタムオーソライザー|UserPoolから取得した「IDトークン」|IDトークンをヘッダに設定|Cognito UserPool|API Gatewayのみで利用可能|
|IAM|STSから取得した「アクセスキーID」「セキュリティキー」「セッショントークン」|署名した文字列をヘッダまたはクエリ文字列に設定|Cognito UserPool/Cognito Federated Identity/STS|API Gateway以外のサービスでも利用可能（S3での認証等）|

ポイントとなるのは「設定方法」の項目で、カスタムオーソライザーではヘッダのみの設定となっています。
あまりないとは思いますが、ヘッダが設定できない場合はIAMの認証でクエリ文字列を設定するほうがよいかと思います。
（S3でクエリ文字列認証をつけた場合、x-amz-expiresで有効期限をある程度設定できるのですが、クエリ文字列でのAPI Gateway認証は5分程度しか有効ではないようです。サポートに聞いてみましたが、x-amz-expiresはAPI Gatewayでは有効にならないとのことでした。）

## 参考情報
CognitoとAngular2を使ったサンプル。
API Gatewayの処理はないのですが、STSからキーを取得する処理や、IDトークンを取得するソースがあったので
こちらのソースを触りながら勉強しました。
[https://github.com/awslabs/aws-cognito-angular2-quickstart](https://github.com/awslabs/aws-cognito-angular2-quickstart)

IAMで認証をかける記事です。
Cognito以外の設定も記載がありとても勉強になるので、Cognitoを利用する方にはぜひ読んで欲しいです。
[世界に先駆けてAWSサーバレスアーキテクチャでユーザ認証とAPI認可の実装をしてみた](http://qiita.com/teradonburi/items/ef535d19c28a009552ec)

## TODO
* 認証方法のところに図の追加
* Cognito UserPoolから各種トークンを取得するための実装
* Cognito Federated IdentityとUserPoolの連携、STSからのキー/トークンの取得するための実装
* Cognito Federated IdentityのIAMの設定
Ruby on Rails | I18nで24時間表記を午前午後表記にする ( 日本語対応 )

ちょっと苦しいがこんな感じ。

```rb
I18n.l Time.zone.now.change(hour: 8), format: '%p%l時'
# => "午前 8時"
```

```rb
I18n.l Time.zone.now.change(hour: 22), format: '%p%l時'
# => "午後10時"
```

# 環境

- i18n (0.8.6)
- rails-i18n (5.0.4)
  








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
NativeScriptで一発でビルド環境を切り替える

# 概要

AndroidStudioでの開発では、Flavorsでデバッグ版とか開発版とか定義できて便利だったのですが、NativeScriptでは多分そのような仕組みは用意されていません。
なので、直接設定ファイルを置き換えるスクリプトを作成してみました。

# 内容

アプリIDを変えるには、下記のファイルを書き換える必要があります。

```
./package.json
./app/App_Resources/Android/app.gradle
```

# コード

最近はWindowsでもbashが使えるようになったので、以下のようなshスクリプトを用意してみました。

```shell-session:switch.sh
#!/bin/sh
case "$1" in
    "stg")
    sed -E "s/applicationId = \".*\"/applicationId = \"com.hogehoge.dev\"/g" ./app/App_Resources/Android/app.gradle > ./app.gradle.tmp
    cp ./app.gradle.tmp ./app/App_Resources/Android/app.gradle
    rm ./app.gradle.tmp
    sed -E "s/\"id\": \".*\"/\"id\": \"com.hogehoge.dev\"/g" ./package.json > ./package.json.tmp
    cp ./package.json.tmp ./package.json
    rm ./package.json.tmp
    echo "switch to staging."
    ;;
    "prod")
    sed -E "s/applicationId = \".*\"/applicationId = \"com.hogehoge\"/g" ./app/App_Resources/Android/app.gradle > ./app.gradle.tmp
    cp ./app.gradle.tmp ./app/App_Resources/Android/app.gradle
    rm ./app.gradle.tmp
    sed -E "s/\"id\": \".*\"/\"id\": \"com.hogehoge\"/g" ./package.json > ./package.json.tmp
    cp ./package.json.tmp ./package.json
    rm ./package.json.tmp
    echo "switch to production."
    ;;
esac
```

こんな感じに置き換えてやると、

```
./switch stg
```

とした時は、com.hogehoge.dev、

```
./switch prod
```

とした時は、com.hogehogeというパッケージ名になります。
プログラム内で分岐したい場合は、

```ts
let application = require('application');
let applicationId;
if(application.android){
    applicationId = application.android.context.getPackageName();
}
if(application.ios){
    let mainBundle = utils.ios.getter(NSBundle, NSBundle.mainBundle);
    applicationId = mainBundle.bundleIdentifier;
}
```

みたいな感じでアプリIDが取得できますので、これを利用すれば良いと思います。
もっと良い方法があるかもしれません。
Ruby の Array#each を再定義しても Array インスタンスの Enumerable のメソッドはその each を使わない場合がある

Ruby の`Enumerable` のメソッドはミックスイン先の`each`メソッドを使用するが、 `Array` の `each` を再定義したとき、 `Array` のインスタンスメソッドは再定義した `each` を使わない場合がある。

## `Array#each` を再定義する

### 再定義する

```ruby
class Array
  def each
    count = 0
    while self[count]
      puts 'here!'
      yield self[count]
      count += 1
    end
    self
  end
end

ar = [1, 2, 3, 4, 5]

ar.each{|v| puts v}
=begin
出力は以下の通り
here!
1
here!
2
here!
3
here!
4
here!
5
=end


m = ar.map{|v| v * 2} # => "here!"が出力されない
p m # => [2, 4, 6, 8, 10]
```

### 特異メソッドで上書きする

```ruby
ar = [5,2,3,4,1]

def ar.each
  puts 'here!'
  dupped = self.dup
  while item = dupped.shift
    yield item
  end
  self
end

# 再定義した時と同様に"here!"は出力されない
puts ar.map {|i| i * 2}
```

### 継承したクラス

```ruby
class AnotherArray < Array
  def each
    d = self.dup
    while item = d.shift
      puts 'here!'
      yield item
    end
    self
  end
end

ar = AnotherArray.new [1,2,3,4,5]
ar.each{|v| puts v} #=> "here!"が出力される
m = ar.map{|v| v*v} #=> "here!"が出力されない
p m #=> [1, 4, 9, 16, 25]
```
## 自分で定義した `Enumerable` なクラスの場合は上書きされる

もちろん、自分で定義した `Enumerable` なクラスの場合は `each` を上書きすると上書きしたものが使われる


```ruby：another_array.rb
class AnotherArray
  include Enumerable
  def initialize src
    @src = src
  end
  def each
    puts 'AnotherArray#each'
    @src.each {|item| yield item}
  end
end

ar = AnotherArray.new [1, 2, 3, 4, 5] 
m = ar.map {|v| v * 2} # => "AnotherArray#each" が出力される
p m # => [2, 4, 6, 8, 10]
```


### 再定義する

```ruby
class AnotherArray
  def each
    puts 'This each is broken!'
  end
end

ar = AnotherArray.new [1, 2, 3, 4, 5]
broken = ar.map {|v| v * 2} # => 'This each is broken!' が出力される
p broken # => []
```

### 特異メソッドで上書きする

```ruby
ar = AnotherArray.new [1, 2, 3, 4, 5] 

def ar.each
  puts 'Fixed.'
  @src.each {|item| yield item}
end

fixed = ar.map {|v| v * 2} # => "Fixed." が出力される
p fixed # => [2, 4, 6, 8, 10]
```

### 継承したクラス

```ruby
class ChildAnotherArray < AnotherArray
  def each
    puts 'not implemented!'
  end
end

child = ChildAnotherArray.new [1,2,3,4,5]
child.each{|v| puts v} #=> "not implemented!"
child.map{|v| v * 2} #=> "not implemented!"
```

## 追記

### 原因

[コメントをいただきました](http://qiita.com/oieioi/items/55bc9d48c23e68691b1a#comment-5e543bd7de40a793c9c4)。@scivola さんありがとうございます。

原因は、 [`Array#map` が `Enumerable#map` と処理系レベルで別実装になっている](https://github.com/ruby/ruby/blob/f0ae63b072f3404f377f8fae0121c943ce33fc5d/array.c#L2717)から。 なので、[array.c](https://github.com/ruby/ruby/blob/f0ae63b072f3404f377f8fae0121c943ce33fc5d/array.c)で実装されていない他の `Enumerable` のメソッドでは再定義した `each` が使われれます。

```ruby
class Array
  def each
    puts 'broken each'
  end
end

ar = [1, 2, 3, 4]
ar.map {|v|v * 2} # => "broken each" は出力されない
ar.member? 1 # => "broken each" が出力される
```

また、 [mruby](https://github.com/mruby/mruby/blob/fd927d786eee1ecde94d9a791036c07543340e7b/mrblib/array.rb) など処理系によっては `Array#map` が `Enumerable#map`のものもあるようです。 上記のコードを mruby で実行するとどちらも `"broken each"` が出力されます。
NativeScriptでPUSH通知を受信する（Firebase編）

# 前提

数多くの{N}アプリを作成してきて、PUSH通知の実装も色々手がけてきたのですが、現時点ではAndroidもiOSもFirebaseで送信するのがベストという結論にいたりました。
APNs(iOS)はAPIの叩き方がソケットな上に、非同期でエラーとかが返ってきて大変にハンドリングがめんどくさい。
最近はPOSTでもいけるようになったみたいですけど、Firebase Consoleから手軽に通知テストとかできたりして、運用も便利になります。
というわけで、今回はFirebaseを用いたPUSH通知について解説します。

# 必要なパッケージ

親切な方がパッケージを作成してくださっています。
https://github.com/EddyVerbruggen/nativescript-plugin-firebase

以下でインストールしましょう。

```
tns plugin add nativescript-plugin-firebase
```

# 設定ファイルの取得

Firebase Consoleにアプリを登録して、FCM用の設定ファイルをダウンロードしてきます。
このへんはぐぐればいくらでも出てきますし公式ドキュメントも丁寧なので迷わないでしょう。
最終的に

- GoogleService-Info.plist # iOS用
- google-services.json #Android用

を取得できれば良いです。
それぞれ、app/App_Resources/iOS及びAndroidフォルダに設置します。

# パッケージのセットアップ

一手間かかるのですが、以下のコマンドを叩く必要があります。

```shell-session
cd ./node_modules/nativescript-plugin-firebase
npm run setup
cd ../..
```

### Android

利用するGoogleライブラリを最新にするため、
/app/App_Resources/Android/app.gradle
ファイルの該当箇所を下記のように書き換えます。

```
project.ext {
    ・・・
    googlePlayServicesVersion = "+"
    ・・・
}
```

### iOS

通常のアプリと同様に、アプリのPUSH通知を有効にします。
/app/App_Resources/iOS/info.plist
ファイルへ下記を追記します。

```
<key>UIBackgroundModes</key>
<array>
  <string>fetch</string>
  <string>remote-notification</string>
</array>
```

さらに、
/app/App_Resources/iOS/【パッケージ名】.entitlements
ファイルを作成し、以下の内容にします。

```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>aps-environment</key>
    <string>development</string>
</dict>
</plist>
```

# コード

適当な初期化部で、以下を呼び出すだけでOKです。

```ts
    let firebase = require('nativescript-plugin-firebase');
    firebase.init({
        onMessageReceivedCallback: function(message){
            //PUSH通知を受信した時にコールされます
            //message.dataに独自のpayloadが格納されます
        },
        onPushTokenReceivedCallback: function (token) {
            console.log("Firebase push token: " + token);
            //トークンを保持したりする
        },
    }).then((instance) => {
        console.log('Firebase init succeeds.');
    }, (error) => {
        console.log('Firebase init failed.');
    });
```

iOSの場合、OS側の通知して良いか確認ダイアログはこのタイミングで表示されます。

受信するだけなら上記でOKですが、FCMは他にも色々機能があります。
詳しくは
https://github.com/EddyVerbruggen/nativescript-plugin-firebase/blob/master/docs/MESSAGING.md
に色々書いてあるので参考にして下さい。
[WPF]ClipをX、Y、Width、Heightでバインドする

ClipにX・Y・Width・Heightのプロパティをそれぞれバインドさせたいなぁ、
と思ってもClipプロパティがGeometry型だからそのままはバインドできない。

かといって、new Rect(X, Y, Width, Height)を返すような
Boundsのプロパティを作った上で各プロパティ更新のタイミングで
Boundsのプロパティの更新通知もするようにして…………はめんどい。

というのを、MultiBinding使ったら上手いこと解決できました。

まずX,Y,Width,Heightを受け取ってRectを返すMultiConverterを作ります。
※ Clipとのバインド用として作成したMultiConverterなので、
　 ConvertBackは使わないかなと思って未実装です。

```ClipConverter.cs
/// <summary>
/// ClipConverter 
/// </summary>
public class ClipConverter : IMultiValueConverter
{
	/// <summary>
	/// ソース値をバインディング ターゲットの値に変換します。
	/// </summary>
	public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
	{
		double x = (double)values[0];
		double y = (double)values[1];
		double width = (double)values[2];
		double height = (double)values[3];

		return new Rect(x, y, width, height);
	}

	/// <summary>
	/// バインディング ターゲット値をソース値に変換します。
	/// </summary>
	public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
```

そうしたら上記のClipConverterをStaticResourceに定義して、
バインドさせたいコントロールのClipに対して↓のXamlを記述する。
※ Xamlで指定した順番通りに ConvertのValuesに渡ってくるので、
　 うっかり順番入れ替えたりしないように注意。

```control.xaml
<RectangleGeometry>
    <RectangleGeometry.Rect>
        <MultiBinding Converter="{StaticResource ClipConverter}">
            <Binding Path="ClipX" Mode="OneWay"/>
            <Binding Path="ClipY" Mode="OneWay"/>
            <Binding Path="ClipWidth" Mode="OneWay"/>
            <Binding Path="ClipHeight" Mode="OneWay"/>
        </MultiBinding>
    </RectangleGeometry.Rect>
</RectangleGeometry>
```

そうすると、ViewModelのClipX、ClipY、ClipWidth、ClipHeightと
コントロールのClipがバインドされた状態になります。

＜参考＞
[Bind Rect Width and Height in xaml (stackoverflow)](https://stackoverflow.com/questions/35033445/bind-rect-width-and-height-in-xaml)
[MultiBindingの使い方と使いどころ ](http://joynote.hatenablog.com/entry/2015/06/30/005222)
ubuntu16.04LTSにMecabとCaboChaをインストールしてpython3系から使えるようにする

## はじめに
cabochaという係り受け解析を行えるライブラリを見つけたのでとりあえず遊んでみようと軽い気持ちで触り始めたらインストールにすら苦戦…
とりあえず自分の環境ではこうすれば出来ましたっていうのを書いておこうと思います。


## 環境
 * windows 10
 * VirtualBox 5.1
 * Ubuntu16.04 LTS
 * python 3.5.2

※windowsマシン上のVMにUbuntuを入れています

# 本題
## MeCabと辞書データのダウンロード
ターミナルで以下のコマンドを実行する

```
$ sudo apt-get -y install mecab libmecab-dev mecab-ipadic-utf8 mecab-jumandic-utf8
```

## MeCabのpythonへのバインディング
※2017/11/06 追記

```
pip3 install mecab-python3
```
念のためこれをしておいたほうが良いそうです

## CRF++ のダウンロード
[こちら](https://drive.google.com/folderview?id=0B4y35FiV1wh7fngteFhHQUN2Y1B5eUJBNHZUemJYQV9VWlBUb3JlX0xBdWVZTWtSbVBneU0&usp=drive_web#list)から最新版をダウンロード(.tar.gz)。現在はver. 0.58でした。
適当なディレクトリにおいて解凍。移動。

```
$ tar zxvf CRF++-0.58.tar.gz
$ cd CRF++-0.58
```
バグがあるので修正

```
$ vim node.cpp
#include <time.h>  （追記）
```
保存して閉じてインストール

```
$ ./configure
$ sudo make
$ sudo make install
```

## CaboChaのダウンロード
[こちら](https://drive.google.com/drive/u/1/folders/0B4y35FiV1wh7cGRCUUJHVTNJRnM)からダウンロード。したのだが最新版(cabocha-0.69.tar.bz2)はどうやっても失敗。仕方なくcabocha-0.60.tar.gzをダウンロード。
適当なディレクトリにおいて解凍。移動。

```
$ tar xzvf cabocha-0.60.tar.gz
$ cd cabocha-0.60
```
バグがあるので修正

```
$ sudo vim /etc/ld.so.conf
include /usr/local/bin      (追記)
```
実行

```
sudo /sbin/ldconfig
```
もう一つ修正

```
$ vim src/utils.cpp
```
``` cpp:utils.cpp
void Unlink(const char *filename) {
#if defined(_WIN32) && !defined(__CYGWIN__)
  ::DeleteFileA(filename);
#else
  //::unlink(filename);  削除
  ::remove(filename);   //追記
#endif
}
```
保存して閉じてインストール

```
$ ./configure --with-mecab-config=`which mecab-config` --with-charset=utf8
$ sudo make clean
$ sudo make
$ sudo make install
$ sudo /sbin/ldconfig
```

cabochaを実行してみる

```
$ cabocha
$ (好きな文章)
```

## python3系へバインディング
```
$ sudo apt-get install swig python3-dev
$ cd cabocha-0.60
$ swig -python -shadow -c++ swig/CaboCha.i
$ mv swig/CaboCha.py python/
$ mv swig/CaboCha_wrap.cxx python/
```

python3系に対応するため書き換え

```
$ cd python
$ vim setup.py
```
``` python:setup.py
def cmd2(str):
    #return string.split (cmd1(str)) 削除
    return cmd1(str).split()   #追記
```
保存して閉じて実行

```
$ sudo python3 setup.py build_ext
$ sudo python3 setup.py install
$ sudo /sbin/ldconfig
```
※pyenvを使っている場合はインストール場所がおかしくなる場合があるので注意

```
$ python3
$ import CaboCha
```
エラーが出なければOK。これでインストールは終了です。適当に遊んでみて下さい。

## おわりに
お疲れ様でした。
軽く触ってみた感じなかなか精度が良くインストールに少しばかり手間取りましたがそれに見合うメリットはありそうです。
いろいろと遊んでみた結果については別途記事にできればと考えています。
それでは良き自然言語処理ライフを！

## 参考
・http://taku910.github.io/mecab/
・https://taku910.github.io/cabocha/
・http://qiita.com/nezuq/items/f481f07fc0576b38e81d
・http://azwoo.hatenablog.com/entry/2015/10/01/234434
・https://www.trifields.jp/install-cabocha-in-ubuntu-1038
PHP の `eval()` の HTML モードと PHP モード切り替え時の罠

PHP の [`eval()`](http://php.net/manual/ja/function.eval.php) は評価させる文字列内で HTML モードと PHP モードを切り替えることができます。 `eval`に渡された文字列は `?>` 以降から HTML モードとして解釈され、再び `<?php` が出てきたらその後ろの文字列は PHP として解釈されます。しかし、 __`<?php` の後ろが文字列の終端だとその `<?php` は HTML として解釈されます。__

## 例

 `<?php` がPHPモードに切り替わらない

```php:hoge.php
eval('echo "hoge"; ?> hoge <?php');
```
```html:hoge.phpの出力
hoge hoge <?php
```

後ろに何かついているとPHPモードに切り替わる

```php:fuga.php
eval('echo "fuga"; ?> fuga <?php echo "fuga";');
```

```html:fuga.phpの出力
fuga fuga fuga
```

空白がある場合もPHPモードに切り替わる

```php:bar.php
eval('echo "bar"; ?> bar <?php ');
```

```html:bar.phpの出力
bar bar 
```
## `<?php` だけだとそもそもPHPとして正しくない

```bash:末尾に改行を含まない<?php
echo -n "<?php" > index.php
php index.php #=> "<?php" が出力される
```

```bash:末尾に改行を含む<?php
echo "<?php" > index.php
php index.php #=> なにも出力されない
```

>それはさておき、渡すコードは PHP として有効な形式でなければなりません。

http://php.net/manual/ja/function.eval.php
【Python@matplotlib】matplotlib にて横、縦の補助線を描く方法について


計算結果を見やすいために、通常図の中に横、また縦の補助線を描きます。
一般的なやり方は、例えば *y = 0* の横線を描くためには、*x = [xmin, xmax]*, *y = [0, 0]* リストを作成して描きます。
尚、matplotlib では、専有の関数があります、*hlines* (横線)、 *vlines* (縦線)。これを使用して、簡単に何本の補助線でも描けます。以下のサンプルをご参照ください。 

**参考**：plt.hlines([value1, value2, ...], xmin, xmax, linestyle="dashed")
*value1, value2* は、横線を描く際の *y* の値に相当します。

---

```hlines.py
import numpy as np
import matplotlib.pyplot as plt

dx = 0.1
xmin, xmax = -3, 3
x = np.arange(xmin, xmax+dx, dx)
y = np.sin(x)

p = plt.plot(x, y, "blue", linestyle='solid')
p = plt.hlines([0], xmin, xmax, "blue", linestyles='dashed')     # hlines
p = plt.plot([xmin, xmax],[0.5, 0.5], "red", linestyle='dashed') # normal way

p = plt.xlim(xmin, xmax)
p = plt.ylim(-1, 1)
p = plt.xlabel('X')
p = plt.ylabel('Y')
plt.show(p)
```
![output.png](https://qiita-image-store.s3.amazonaws.com/0/194463/51c6c1ef-5a36-b503-5d0b-9542e0c21279.png)
Raspberry Piでサーボモータ制御


ほとんど以下の記事そのままです。記事中でも言及されていますが、間違った情報が散見されるような気がするので、これで動きましたという意味でここにも掲載します。

http://bufferoverruns.blogspot.jp/2016/08/raspberry-pisg-90.html

もともとは以下のようにServoBlasterというライブラリを使用していましたが、Linuxカーネル変更の影響か、全く反応しなくなってしまって代替策を探してたどり着いています（jessieでもstretchでも動かなかったです）。

http://qiita.com/lumbermill/items/218944f816bdb0483e3c


というわけでプログラムは以下の通り。

```python
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)

gp_out = 4
GPIO.setup(gp_out, GPIO.OUT)
servo = GPIO.PWM(gp_out, 50) 

servo.start(0.0)

for i in range(10):
    servo.ChangeDutyCycle(2.5)
    time.sleep(0.5)

    servo.ChangeDutyCycle(12.0)
    time.sleep(0.5)

GPIO.cleanup()
```

参考: [Arduinoでサーボ制御](http://qiita.com/lumbermill/items/6f175721d177a07b5033)
Rubyのキーワード引数に外部引数名を付けて遊ぶ

実用性はありません。

## 目的

RubyでもSwiftのように外部引数名を使いたい

```swift
// Swift
func range(from start: Int, to end: Int) {
  print(start)
  print(end)
}

range(from: 0, to: 5)
```

## Syntax

新しいメソッドの書き方を導入します。とは言え既存のシンタックスに沿って解釈できる形です。

```ruby
func range(from: :start, to: :end) do |args|
  puts args.start
  puts args.end
end
```

`func`メソッドに`range(from: :start, to: :end)`とblockを渡している、という解釈になります。
あとは、

- `method_missing`で`range(from: :start, to: :end)`の実行をフック
- `func`の中で引数をセット
- メソッドを定義

するだけです。

## 実装
```ruby
class BasicObject
  class << self
    def func(args, &block)
      method = args[:method]
      args_map = args[:args_map]
      define_method(method) do |args|
        keys = args_map.values.map { |v| ":#{v}" }.join(',')
        values = args_map.keys.map { |k| "'#{args[k]}'"}.join(',')
        s = eval("Struct.new(#{keys}).new(#{values})")
        self.instance_exec(s, &block)
      end
    end

    def method_missing(method, *args)
      super unless args.first.is_a?(Hash)
      return {:args_map => args.first, :method => method}
    end
  end
end
```

## テスト

```ruby
class A
  func range(from: :start, to: :end) do |args|
    puts args.start
    puts args.end
  end
end

a = A.new
a.range(from: 0, to: 5)
```

出来ましたね。

## 問題点

一応やりたいことはできましたが、`method_missing`でフックされる範囲が広すぎるため、失うものが多すぎます。
全く実用性はありません。

## やりたかったこと

`Binding#local_variable_set`で引数をコンテキストに渡してやるつもりでしたが、`Binding#exec`で`Proc`を評価出来ないため、諦めて`Struct`を`args`に渡しています。
うまい書き方教えてください。
vue-cliでホットリロードが効かない時の対応策

Vue + Vuexの開発において、`vue-cli`を使って環境構築をし、[単一ファイルコンポーネント](https://jp.vuejs.org/v2/guide/single-file-components.html)で書いていたらホットリロードが効かないことがあったのでメモ。

前提として、自分の環境では、ということになりますので、必ずしもこれが解決策になるかはわかりませんが、参考までに。

## 下階層コンポーネントの更新が反映されない

一応コンポーネントの構成を書くと（ダミーだけど）、一般的なVue + Vuexで、以下のようなコンポーネント体系となっていました。

```html
<Root>
  <App>
    <Header/>
    <Main>
      <Sidebar/>
      <ContentsList>
        <Content/>
        <Content/>
        <Content/>
      </ContentsList>
    </Main>
    <Footer/>
  </App>
</Root>
```

ここで、`<Content />`という部分に該当するComponent（.vue）ファイルを編集したところ、ホットリロードが効きませんでした。（その他のファイルは効いたり効かなかったり）

具体的には、`props`の型定義を変更しても、「予期してるのObjectだけど、String返ってきてるよ？」みたいなエラーがリアクティブに出ず、サーバを再起動しないと反映されない、みたいな状態でした。

## webpackDevMiddlewareの設定

結論としては、以下の設定ファイルを少し弄りました。

### Before
```build/dev-server.js
var devMiddleware = require('webpack-dev-middleware')(compiler, {
  publicPath: webpackConfig.output.publicPath,
  quiet: true
})
```

### After
```build/dev-server.js
var devMiddleware = require('webpack-dev-middleware')(compiler, {
  publicPath: webpackConfig.output.publicPath,
  quiet: false,
  stats: {
    colors: true,
    chunks: false
  },
  watchOptions: {
    aggregateTimeout: 300,
    poll: 1000
  }
})
```

`quiet`はデフォルトが`false`らしいので特に明記しなくてもよさそうです。（というか、これはコンソールに出力するかどうかのオプションだから`true`でも良い。）

たぶん、今回重要なのは`watchOptions`のところだと思います。ちょっと遅らせてる感じ？なのかな。

参考) https://github.com/vuejs-templates/webpack/issues/378