OmniAICreator/Qiita-1.07M huggingface dataset:
ITエンジニアのための機械学習理論入門読了者が Kaggle やってみた

## Kaggle とは

Wikipedia
> Kaggleは企業や研究者がデータを投稿し、世界中の統計家やデータ分析家がその最適モデルを競い合う、予測モデリング及び分析手法関連プラットフォーム及びその運営会社である。

雑に言うと、TopCoderのデータサイエンティスト版

## 経緯

今どきのエンジニアの嗜みとして [ITエンジニアのための機械学習理論入門](https://www.amazon.co.jp/IT%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E7%90%86%E8%AB%96%E5%85%A5%E9%96%80-%E4%B8%AD%E4%BA%95-%E6%82%A6%E5%8F%B8/dp/4774176982) は一通り読んだが、データ解析系のお仕事を仕事をしているわけではないため仕事で機械学習を使う機会はない。  
実際に手を動かさないと機械学習は習得できないが、手を動かすにもデータセットの用意等で準備がかかり大変そうだし、実際なにを教材(MNIST?)として勉強するのが適当なのかわからない。  
今どきのエンジニアとして、オンライン学習やコミュニティをきちんと活用できるようになり、あわせてそれらの知見を得ておきたい。  
チュートリアルとしてやってみた Dataquest の Kaggle competitions がよかったのでご紹介。  


## この記事の Goal

Kaggle の Competition の [Titanic: Machine Learning from Disaster](https://www.kaggle.com/c/titanic) に実際に参加し、コンペで自分の順位を獲得する。


## Getting Start

### 前提
機械学習でロジスティック回帰やランダムフォレストを学んだことがある  
pythonのコードをある程度かける  
python実行環境  

### あるといいもの
jupyter notebookが書ける環境  
英語の技術サイトを読むのにそれほど抵抗がない程度の英語スキル  

### 今回なくていいもの
GPU環境  
ディープラーニングの知識  

### Dataquest の Kaggle competitions tutorial

kaggle competition titanic で適当にググルと　でてくる オンライン学習サイト。

[Free Kaggle Tutorial - Getting Started with the Titanic Dataset](https://www.dataquest.io/m/32/getting-started-with-kaggle)

google か facebook アカウントがあれば ログインしてすぐ tutorial をはじめられる。

Titanic の乗客の生存データを元にテストデータの乗客に対して生存確立を算出するパラメトリックモデルを作成してモデルの性能を競う Kaggle のコンペを題材としていて、 機械学習の基本的なプロセスのデータの前処理、モデルの作成、トレーニングデータセットの学習とテストデータセットの予測までを、要所要所でpythonのコードを書く問題を解きながら Tutorial を進めていく。

![data_quest_titanic_python.JPG](https://qiita-image-store.s3.amazonaws.com/0/116075/6d5343a7-8975-17ab-cdde-eee3775d4251.jpeg)

この画面は、Dataquest の tutorial の画面の一例。
左に例題が出て、右の画面でpythonのコードを書いて、実行ボタンを押してコードの結果が正しいと `good work` とでてきて次の画面に進める。

Tutorial では最後に実際に作ったモデルのテストデータセットの予測結果を kaggle に submit するファイルを生成するところまでサポートしている。
Dataquest の Kaggle Competition のコースは二つあり、最初のコースは単純なロジスティック回帰のモデルで一通りの流れを体験するコースとなっていて、次の Improving Your Submission というコースでは、アンサンブル学習のモデルで精度をあげてスコアを狙っていくことを主眼としたコースとなっている。

前提に書いてある知識があれば各々のコースは2時間もあれば、最後まで進めることができると思う。

Tutorial の学習を終えて、自分のPython実行環境で学んだことを整理して、、、(といっても Tutorial で書いたコードをコピペするだけなんですが)、実際に Kaggle に submit するファイルを生成するコードにしてみたのは [こちら](https://github.com/takaaki-inada/kaggle_titanic/blob/master/kaggle_titanic.ipynb) 。

これを、いざ、 Kaggle に submit !

![kaggle_titanic_complete.JPG](https://qiita-image-store.s3.amazonaws.com/0/116075/c8600afc-91fc-49af-7e61-0103c7825475.jpeg)

7071 team 中、1231位 でした！


## まとめ
悩まずに短時間で一通り体験できるので、機械学習の入門書を読んだ後の自習、勉強会ネタとしてちょうどいいんじゃないかと思った。
ここはスタートラインとして、自分でモデルを工夫してももう少しスコアをあげる方向で勉強を進めるのもあり、
他の competition に参加するのもあり。  
私の場合は、ディープラーニングの勉強中でもあるので、[dogs vs cats](https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition) の competiion をいろんなサイトを参考に引き続いてやってみた。とりあえず出た score が 0.14160 で、 697位 / 1314チーム ぐらいの score が出たのだが、ただこれ、もう competition が close されてるみたいで、 close されていると Rank には登録されないみたいで、ちょっと残念でした。

## 余談
ITエンジニアのための機械学習理論入門の著者は、自分と同い年で、同じ理学部物理学科卒(大学は違いますが)でした。
自分と一体どこでこんなに差がついたのか、著者を教師データとして自分の脳のニューラルネットワークを誤差逆伝播してニューロンの重みを学習させてやりたいです。。。
ReactNativeアプリをローカル環境でライブコーディングする


弊社でアプリ開発にReactNativeを採用することになったので、まずは、ローカル環境でのエミュレータ開発を行うために、検証した結果の導入手順を忘れないようにメモっておきます。

前提条件
---
* Node.jsがインストールされている
* npmが使える

用意するもの
---
* AndroidStudio（Android SDK）
* Expo.io

検証環境
---
MacBook Pro (Retina, 13-inch, Early 2015)
macOS Sierra バージョン10.12.5

AndroidStudioのダウンロードとエミュレータの作成
---
1. [こちら](https://developer.android.com/studio/index.html?hl=ja)からAndroidStudioをダウンロードして手順にしたがってダウンロードしてください
2.  基本的に全てデフォルトのままでok
3. Configure > SDK Manegerを開いて必要なSDKを入れる（ロリポップより上に全部チェックつけとけばOK）
4. Start a new Android Studio Projectで適当なプロジェクトを作る
5. プロジェクトができたら、ツールバーの Tools > Android > AVD Manegerを開く（Android Virtual Device の略)
6. Create Virtual Device... を選ぶ
7. Nexus 5X（エミュレートしたい端末） を選んで次へ
8. Nougat（上記の搭載OS）をダウンロードして次へ
9. AVD name をわかりやすい名前に変更（※ あとでコマンドラインでここで決めたデバイス名を打つので打ちやすい長さがいい）
10. Finishで終了

npmでCRNA（create-react-native-app）のインストール
---
```
$ npm install -g create-react-native-app
$ cd アプリを作りたいフォルダ
$ create-react-native-app アプリ名
```
なんか色々ダウンロードしてよしなにやってくれる

Androidエミュレータを起動できるようにする
---
1.SDKを入れたフォルダを確認する
　AndroidStudio > Preference > Appearance & Behavior > Sttings > Android SDK
　上記に書いている場所パスが書いてある。
　
2.sdkフォルダ内部のplatform-toolsとtoolsにパスを通す
　パスの通し方は、調べてくだしあ

3.パスが通ったか確認する
`$ adb`と`$ android`と`$ emulator`コマンドが使えるか確認

今回はemulatorコマンドしか使いませんが、
adb、androidコマンドも今後開発で
使うのでついでにパスを通しておきます。

Expo.ioでReactNativeアプリをエミュレータに表示する
---
1. [こちら](https://expo.io/)からExpo.ioをダウンロードしてインストール
2. 会員登録する。
3. コマンドラインからAndroidエミュレータを起動。
4. `$ emulator <AVD name>`で最初に作成した仮想端末を起動
5. Expoを起動し、Project > Open Project から、create-react-native-appで作成したアプリを開く
6. buildが終了すると右上のDeviceボタンが押せるようになるので、そこからAndroidを選択
7. エミュレータ上で、Expoアプリがインストールするか聞かれるのでインストール。
8. HelloWorld!!

起動中のReactNativeを編集すればリアルタイムに、
エミュレータに反映されます。

注意としては４と５の順序が逆転すると起動できません。
確実にエミュレータを起動した後に、Expoを開く必要があります。


初めて書いた記事なので、お手柔らかにお願いします。
ホップフィールドネットワーク・ボルツマンマシン・制限付きボルツマンマシンについて

# はじめに
ホップフィールドネットワーク，ボルツマンマシンと制限付きボルツマンマシンについてここでは解説する．　過去の研究が現在の研究に新たな見地を与えるのではないかということを目的として記す．
# ホップフィールドネットワーク

![image.png](https://qiita-image-store.s3.amazonaws.com/0/169641/eb249116-d079-b723-8acc-2afbaae5560a.png)
http://e-musu.github.io/ml/2016/02/10/hopfield-network
上のように，ニュールラルネットワーク（NN）には階層型と相互結合型の大きく分けて２種類が存在する．
ホップフィールドは相互結合型NNである

```math

ユニットiとjの結合係数をw_{ij}，ユニットiの結合係数を-\theta_i,ユニットの出力結果をx_i = 0　or　1とする.\\

エネルギーE = -(\sum_{i<j} w_{ij} x_i x_j+\sum_i \theta_i  x_i)\\
=-(\sum_{i ne j} w_{ij} x_j + theta_i)x_i + (x_iを含まない項)　ー（１）\\
なので
\sum_{i ne j} w_{ij} x_j + \theta_iが正の時はx_iは１
\sum_{i ne j} w_{ij} x_j + \theta_iが負の時はx_iは０とする操作を行うと\\
Eは減少する．よってこの操作を繰り返していくと，Eが極小値を取る点で安定し，出力結果が安定化する．
```
このように閾値ーθをもとに，ユニットの出力結果を更新していくことで最終的に安定した出力結果に落ち着くことが，数式からわかる．
# ボルツマンマシン
ボルツマンマシンも相互結合型NNである．エネルギーEの式も等しい．ボルツマンマシンになって異なる部分は統計力学における温度という概念を持ち込んだ点である．

``` math
x_iが1の時と0の時のエネルギーの差は（１）よりΔ E =-(\sum_{i \ne j} w_{ij} x_j + \theta_i)-(2)と出せる．\\
一方で，統計力学においてよく用いられるカノニカル集合ではエネルギーEを取る確率がexp(-E/kT)と表せて,\\
x_i=1となる確率をp，x_i=0となる確率を1-pとおくと，\\
x_iが1の時と0の時のエネルギーの差はΔ E =(-kTlog(p))- (-kTlog(1-p))=kTlog(1/p-1)\\
p=1/(1+ exp(Δ E / kT))\\
```
ホップフィールドの場合，Δ E が正であれば必ず出力を1，負であれば必ず出力を０にするというものであったが，ボルツマンマシンの場合, Δ E が正であれば50％以上で出力を1，負であれば50%以上で出力を０にする．　その確率は温度　Tに依存しており，Tが０に近いと，確実にEが減少するホップフィールドネットワークに近づく．Tが無限大に近いと出力=1 or 0の確率が，ΔEに関係なく両方とも1/2に近づき乱雑さを増す．
最初はTを高温にして，徐々にTの温度を低くすることがよく行われる．これの意図は最初はTの温度を上げた状態で，乱雑に動かすことで，　小さな極小値から抜け出し，　大きな極小値を見つけたあたりでTの温度を下げて，安定させるといったところである．


#制限付きボルツマンマシン
　制限付きボルツマンマシンは上の一般的なボルツマンマシンを階層型NNに変えたものである．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/169641/b76a7615-89e5-eb01-7b03-0f1d2887c3d1.png)
https://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%AB%E3%83%84%E3%83%9E%E3%83%B3%E3%83%9E%E3%82%B7%E3%83%B3
ボルツマンマシンにおいて，visible unitsとhidden unitsの二種類のレイヤーに分け，同じレイヤーに属するユニットは結び付けないようにしたものを，制限付きボルツマンマシンと呼ぶ．　unit間を全結合しなくてよいので計算量が減り，ボルツマンマシンの問題点である収束速度を早めることにつながる．

#次回
今回述べたものが現在どのように応用されているかについて述べたい．
# Reference
ホップフィールドネットワークhttps://ja.wikipedia.org/wiki/%E3%83%9B%E3%83%83%E3%83%97%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%83%BB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF
ボルツマンマシン
https://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%AB%E3%83%84%E3%83%9E%E3%83%B3%E3%83%9E%E3%82%B7%E3%83%B3
カノニカル集合
https://kotobank.jp/word/%E3%82%AB%E3%83%8E%E3%83%8B%E3%82%AB%E3%83%AB%E9%9B%86%E5%90%88-46037
Qiitaの数式チートシート
http://qiita.com/iizukak/items/04d6e226982bc108bc16
ServiceNow Jakartaアップデートトピックス - ServiceNowコミュニティがリリースされた -

ServiceNowのバージョン「Jakarta」での変更点。
[まとめはこちら](http://qiita.com/Kisaragi13/items/3f332bb2a5b2a561f423)

# ServiceNowコミュニティがリリースされた
[このような記事(外部サイト)](https://servicematters.servicenow.com/2017/05/09/increase-customer-loyalty-by-personalizing-service-with-servicenow-communities/)も出来ているので、Jakartaでの最も大きなトピックと言えそう。

デモデータをロードするとこんな感じ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/6a0b8b87-e616-e7c5-a5d7-302d777bdc57.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/ad08d673-55dc-a584-3493-1d10bed54110.png)

設定次第なんだろうけど、元々あったポータルと比べると非会員（未ログインユーザ）にやさしい気がする。
**ポータルホーム（未ログイン時）**
右上から検索できるが、デフォルトではログイン押し。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/f85d7012-0198-4ae4-f1ed-26d3c6dd5194.png)

**コミュニティホーム（未ログイン時）**
ほとんど見え方は変わらない。質問を投稿する際にはログインが必要。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/7ac92042-beae-d28c-0b3c-3e35e35169b7.png)

# コミュニティを試す
**com.sn_communities**プラグイン（<font color="red">赤枠</font>）を導入することで「**コミュニティ**」というメニューが増える。（<font color="blue">青枠</font>）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/51c52741-aacc-0bd6-4261-12ffb755c598.png)
他と同様、開発者向けインスタンスでは無料で試せる。

# 関連記事
> - [ServiceNow Jakartaアップデートトピックスまとめ](http://qiita.com/Kisaragi13/items/3f332bb2a5b2a561f423)

> - [ServiceNowでプロジェクトを管理する - ServiceNow ITプロジェクト・ポートフォリオ管理 -](http://qiita.com/Kisaragi13/items/d89e1b9a7a66bfc2a97e)
→　プラグインの有効化手順はこの記事を参考にして下さい。


# 参考サイト
> ServiceNow Product Documentation - Jakarta release notes -
https://docs.servicenow.com/bundle/jakarta-release-notes/page/release-notes/jakarta-release-notes.html
> 
> ServiceNow Blog - Increase Customer Loyalty By Personalizing Service With ServiceNow Communities -
> https://servicematters.servicenow.com/2017/05/09/increase-customer-loyalty-by-personalizing-service-with-servicenow-communities/
ServiceNow Jakartaアップデートトピックス - セキュリティインシデント等にタグを付けることができるようになった -

ServiceNowのバージョン「Jakarta」での変更点。
[まとめはこちら](http://qiita.com/Kisaragi13/items/3f332bb2a5b2a561f423)

# セキュリティインシデントにタグを付けることができるようになった
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/970e0321-8b68-ac59-be8d-985c734f0374.png)

## タグの追加方法
アプリケーションナビゲータより
**Security Operations -> セキュリティタグ -> グループ**
**Security Operations -> セキュリティタグ -> タグ**
をそれぞれ作成する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/83ff269d-8015-e595-fbbc-e6d1f8691287.png)

色はタグ側で設定可能。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/3fa522e5-d732-7b57-7b4f-f1d610abc6a3.png)

# 関連記事
> - [ServiceNow Jakartaアップデートトピックスまとめ](http://qiita.com/Kisaragi13/items/3f332bb2a5b2a561f423)

# 参考サイト
> ServiceNow Product Documentation - Jakarta release notes -
https://docs.servicenow.com/bundle/jakarta-release-notes/page/release-notes/jakarta-release-notes.html
Spring+Doma+H2DBでWEBシステムを構築

#はじめに
何かシステムを作ろうかなと思ったので何か作ります。
そろそろJavaの勉強をしたいので言語はJava。
Frameworkは使ったことのないSpringとDoma。
あとDBはOraleとか準備するのめんどくさかったのでH2DB。

#開発環境
MacBook Pro (13-inch, 2016, Four Thunderbolt 3 Ports)
Eclipse(Pleiades All in One 4.6.3.v20170422)
JDK 8u131
Spring Boot 1.5.4(Maven)
Doma2 2.12.0
H2DB 1.4.195

#プロジェクト作成
[ここ](https://blog.ik.am/entries/371)を参考にプロジェクトの雛形を作成

##プロジェクトのインポート
1. [SPRING INITIALIZR](https://start.spring.io)にアクセス
1. `Maven Project`,`Java`,`Spring Boot 1.5.4`を選択
1. Group,Artifactはご自由に
1. Dependenciesには`Web`,`JDBC`,`H2`を選択し、Generate Project
![SpringBoot.png](https://qiita-image-store.s3.amazonaws.com/0/189711/4f102a31-7a0a-5d49-9b8e-ded7d527a79f.png)
そうすると`(Artifact).zip`(今回の場合「create-design-documents.zip」)がダウンロードされる
1. Eclipseから`インポート`→`Maven`→`既存のMavenプロジェクト`を選択し次へ
1. ルート・ディレクトリーにzipを解凍したフォルダを選択し、プロジェクト内の`pom.xml`にチェックを入れ完了

##Domaの追加
1. `pom.xml`の`dependencies`タグに以下の内容を追記

```xml:pom.xml
<!-- https://mvnrepository.com/artifact/org.seasar.doma.boot/doma-spring-boot-starter -->
<dependency>
    <groupId>org.seasar.doma.boot</groupId>
    <artifactId>doma-spring-boot-starter</artifactId>
    <version>1.1.0</version>
</dependency>
```
これでプロジェクトの雛形は完成です。

次回はEntityとDaoを作って画面表示します。

参考にしたURL
[Spring Boot + Doma2を使おう](https://blog.ik.am/entries/371)
自分のアプリ/サービスをグロースしよう 〜アクセス解析について〜

#はじめに
最近、よくグロースとかKPIとかの言葉を耳にする。
自分のアプリ・サービスをグロースしていくためにも、よく出てくるキーワードは
押さえておかないと理解しにくいので、この辺りをまとめた。

#この分野でよく聞くワードまとめ

※ネイティブアプリかWebサイトかで使われるワードは多少変わってくるが、
ここでは網羅的に紹介。

効果的なマーケティングを展開するには指標による管理分析が必要。
基本ではあるが、「ユニークユーザー」（Unique User）数の把握も重要。


##UU（ユニークユーザー数）
特定の期間内（1日・1週間など）に訪れたユーザーの数。純粋なユーザーの数。
期間内に同じ人が何度も訪れたとしても、それは一人としてカウントする。

しかし、訪れた人が複数のPCやスマホからアクセスした場合は同一人物とは特定されないので、あくまでもファンの数としてのだいたいの目安と考えるべき。

##AU（アクティブユーザー数）
特定の期間内にアプリやサービスを一回以上利用したユーザーの数。
（実際に利用している“活きた”ユーザーの数）
主に、SNS系やアプリなどで使われる指標で、「定期的に利用するユーザ」のこと。

UUはアクセスの実態を把握するのに良い指標だが、ユーザーが実際にそのサイト/サービスを利用しているかまでは把握できないので、これを把握するための指標としてAUがある。


期間ごとに呼び方が異なる。

・**DAU** : 1日あたりのアクティブユーザー（Daily Active User）

・**WAU** : 週間アクティブユーザー（Weekly Active User）

・**MAU** : 月間アクティブユーザー（Monthly Active User）

MAUを重要指標とするか、DAUを重要指標とするかなどはサービスによって違う。
自分のアプリ/サービスの特徴を理解して、自分（または自社）の場合は、どれを重視する必要があるのかを吟味することも重要。

※MAU/DLやDAU/MAUで算出するアクティブ率というのもある

##PV（ページ閲覧数）

閲覧されたページの総数（Page View）。訪問者が閲覧したページ数であり、ユーザーは一度に複数ページを閲覧したりするので、PVはUUよりも多くなる。

PVを分析することで、どこがよく閲覧されていて、逆にどこがあまり閲覧されていないのかを把握することができる。


##CV（コンバージョン数）
達成した成果の数。

[Webサイトの場合]
会員制サイト：会員登録・メルマガ登録 など
ショッピングサイト：商品の購入 など



##CVR（コンバージョンレート）
集計期間中のコンバージョン率。一般的に、「CV ÷ UU」。


##Session（セッション）
セッションとはユーザーが訪れた数。

例えば、期間内に一人のユニークユーザーが5回サイトを訪れた場合、セッションでは5回。
セッションはユーザーが何回PVしたかに関係なく、純粋なサイトへの訪問数。

・**入口数**
セッションのスタート地点となった数
・**直帰数**
セッションのスタート地点で最終地点となった数
・**離脱数**
セッションの最終地点となった数


・**入口率（％）**
直接訪問している割合。入口数をセッション数で割った数値
・**直帰率（％）**
1ページしか見なかったセッションの割合。直帰数をセッション数で割った数値
・**離脱率（％）**
離脱数をセッション数で割った数値

##Reach（リーチ）
リーチとはマーケティング用語でターゲットへの到達という意味。
広告メッセージが閲覧されたり、「いいね！」などのエンゲージメントが行われたという意味で使われる。

##UB（ユニークブラウザ　）
UB（Unique Browser）とは、Webサイトへのブラウザごとの訪問回数。
ApacheなどのWebサーバは、アクセスログに訪問者のブラウザの種類・バージョンの情報も記録するため、それらをアクセスログ解析ツールなどで把握することができる。また、訪問者のブラウザにCookieを発行し、ブラウザの種類とバージョンを特定する方法もある。

 
##利用時間
1セッション内の最初のPVから最後のPVまでの時間

##CTR
Click Through Rateの略。
表示回数中のクリックの割合で、クリック数÷表示回数。

##インプレッション数
広告やリンクの表示回数。
 
##クリック数
リンクや広告を選択した数。

##継続率（リテンションレート）
リテンション率は、特定の期間内のいずれかの日にアプリをインストールしたユーザー全体のうち、特定の日または週にアクティブなユニークユーザー数を算出。

ECサイトで一度お客さんになってくれた場合は、その既存顧客に何度も買ってもらう（リピーターになってもらう）ことが最も効率のよい集客手段で、新規顧客を集客する場合の何倍も効率がよいと言われている。

このリテンションを用いたリテンション分析は、どれくらいのユーザーがアプリを継続して使い続けているのかを確認することができる分析手法で、Googleアナリティクスなど他のアクセス解析ツールではコホート分析とも言われる。

詳しくは、
https://growthhackjournal.com/retention-analysis-01/

##DL（ダウンロード数）
そのままの意味で、アプリのダウンロード数。

##クラッシュ率
全体における、クラッシュしたものの割合です。
１%未満には押さえたいところ。

##開封率
開封率とは、どれくらいのユーザーに開封されたのかを表す指標です。
数値は（開封数÷有効配信数）×100（％）という計算式で出せます。
アプリでいうとプッシュ通知の開封とかも、この辺りに関わる。

#代表的なツール
効果的なスマホアプリ開発に欠かせないアクセス解析ツール15選
https://blog.codecamp.jp/analysis_for_application

プロがオススメする国内無料アクセス解析ツール6選のメリット・デメリット
http://free-web-hope.com/6-free-access-analysis-tool

#まとめ
このように色々な指標があるが、一番大事なのは、
**どの指標が自分のアプリ/サービスのグロースには必要であるかを見極めて、日々その指標を注視しながら改善する**ことだと思いました。
Office365の残ライセンスが少なくなったらSlackで通知

Office365をこまめに少しづつ買っているので、残ライセンスを都度都度確認していたのですが、めんどくさくなったので、Powershellで自動化しました。(けっこう便利)
※初回だけ、認証情報を登録する必要があるので、手動で起動してください。



```ps1
# 参考URL
# http://blog.kazuakix.jp/entry/2016/08/07/212916
# https://technet.microsoft.com/ja-jp/library/dn771773.aspx

# スクリプトが保存されているパスを取得。
$workDirectory = Split-Path -Parent ($MyInvocation.MyCommand.Path)
cd $workDirectory

$connectUserName = "hogecorp@hoge.ne.jp" # Azureの全体管理者のユーザ名
$credentialPasswordFile = "C:\\p.dat" # Azureの全体管理者のパスワードを保存するファイル

# パスワードファイルが無い時の処理。
# パスワード情報を保存したファイルが作成されます。
IF ( -Not(Test-Path $credentialPasswordFile) )
{
  $credential = Get-Credential
  $credential.Password | ConvertFrom-SecureString | Set-Content $credentialPasswordFile
}

# パスワードファイルから読みだして、$credentialに代入。
$credentialPassword = Get-Content $credentialPasswordFile | ConvertTo-SecureString
$credential = New-Object System.Management.Automation.PSCredential $connectUserName,$credentialPassword

# Office365に接続。
Connect-MSolService -Credential $credential

Get-MsolAccountSku | % {
  $licenseName = $_.AccountSkuId
  $remainingLincense = ($_.ActiveUnits - $_.ConsumedUnits)

  # 表示名を書き換えたいときはここで書き換える。
  $licenseName = $licenseName -replace "hogecorp:AAD_PREMIUM","*AzureAD_P1*"
  $licenseName = $licenseName -replace "hogecorp:SMB_BUSINESS","*O365_Business*"
  $licenseName = $licenseName -replace "hogecorp:POWER_BI_STANDARD","Power BI"
  
  # 30ライセンスを下回ったら通知。
  if ( $remainingLincense -le 30 ) {
    $remainingText += $licenseName + " が 残り" + $remainingLincense + " ライセンスだよ！"
    $remainingText += "`n"
  }  
}

# Slackに通知
# webhookのURLを入れてください。
$webhookURL = "https://hooks.slack.com/services/*******"
$messageText = $remainingText
$enc = [System.Text.Encoding]::GetEncoding('ISO-8859-1')
$utf8Bytes = [System.Text.Encoding]::UTF8.GetBytes($messageText)
$notificationPayload = @{ 
  text = $enc.GetString($utf8Bytes);
  username = "bot";
  icon_emoji = ":rage:"
}
Invoke-RestMethod -Uri $webhookURL -Method Post -Body (ConvertTo-Json $notificationPayload)
```
[小ネタ] 最近使っているvimからdockerコンテナ内でテストする方法

最近はneovimを使っている。neovim-qtが割と安定していて良い。
neotermとvim-testでテストを実行する。
direnv等で、プロジェクト毎に環境変数を指定し環境変数でコンテナ名を引っ張ってくる。コンテナ名はプロジェクト毎で大体固定になるはず。
コンテナ名があれば`docker ps`で取ってきて`docker exec`に渡す、というコマンドのトランスフォーマーを定義する。`spring`の有無はお好みで。

```vim
nnoremap [space]tn :TestNearest<cr>
nnoremap [space]tf :TestFile<cr>

let test#strategy = 'neoterm'

let test#ruby#rspec#executable = 'rspec'

function! DockerTransformer(cmd) abort
  if $APP_CONTAINER_NAME != ''
    let container_id = system('docker ps --filter name=$APP_CONTAINER_NAME -q')
    return 'docker exec -t ' . container_id . ' spring ' . a:cmd
  else
    return 'bundle exec ' . a:cmd
  endif
endfunction

let g:test#custom_transformations = {'docker': function('DockerTransformer')}
let g:test#transformation = 'docker'
```

基本的にdockerはコンテナ立ち上げっぱなしで、zshを起動する様にしている。サーバープロセスは一回中に入ってから起動する。
そうしておかないとサーバープロセス再起動時にコンテナごと落ちて面倒。
話題のエディタ Atom を使ってみた

#Atomって何？
AtomとはGitHubが開発したオープンソースのエディタです。
豊富なパッケージが用意されているので自分なりにカスタマイズすることができます。


#動作環境
windows10 64bit

#Atomをダウンロードしよう
<a href="https://atom.io/">Atomダウンロードサイト</a>
上記リンクにアクセスすると環境に応じてダウンロードボタンが表示され、
ボタンをクリックすると自動的にダウンロードが始まります。
![Atom_Download.png](https://qiita-image-store.s3.amazonaws.com/0/188402/975e6840-2dd2-dfc8-6f08-792e04ddba8b.png)

#Atomをインストールしよう
ダウンロードされたexeファイルを開くと自動的にインストールが開始されます。

![Atom_install_icon.PNG](https://qiita-image-store.s3.amazonaws.com/0/188402/31a4d1fa-f1fe-0108-4e09-83ea9085ff0a.png)

インストール中はこの画面になっており、
インストールが完了すると自動的にAtomが起動します。

![Atom_Main.PNG](https://qiita-image-store.s3.amazonaws.com/0/188402/7ee4a931-0e4c-b80c-e075-9ecb3c14d741.png)

#Atomを日本語化しよう
御覧の通りAtomは標準で英語になっており、わかりづいらいので日本語化をしてみましょう。
Atomのメイン画面から[Install a Package]　⇒　[Open Installer]　を開きましょう。
![Atom_日本語化.PNG](https://qiita-image-store.s3.amazonaws.com/0/188402/d9bfe2eb-ceac-23ae-08d9-77d36e1e219a.png)
<br>
パッケージのインストールが行える画面に遷移するので、テキストボックス内に[japanese]と入力し、Enterキーを押下します。
[japanese-menu]というパッケージが表示されるので[Install]ボタンを押下します。
![Atom_日本語化2.PNG](https://qiita-image-store.s3.amazonaws.com/0/188402/027bfd91-1729-480a-8842-62b35871fb74.png)
<br>
インストールが完了するとこの通り自動で日本語化されました。
![Atom_日本語化3.PNG](https://qiita-image-store.s3.amazonaws.com/0/188402/b72a458e-07b2-c97f-5d72-04351d1e331c.png)

このようにAtomは[パッケージ]という形で便利な機能が多数用意されているので、有効活用していきましょう。
※便利なパッケージの紹介はまた別の記事で。。。
【GAS】ARRAYFORMULA関数を使って九九計算表、可変長型計算表を作ってみよう

　エクセルで九九計算表を作る場合、縦軸と横軸に1から9を用意し、中に式を入力し、それを横方向にコピー、さらに下方向にコピーといった方法で作るのが一般的かと思います。

　参考サイト
　http://www.acroquest.co.jp/webworkshop/excel/excel_1_01.html

　そして今回、グーグルスプレッドシートでこれをよりスマートに実現する方法を紹介しようと思います。

![スクリーンショット 2017-06-29 21.35.00.png](https://qiita-image-store.s3.amazonaws.com/0/139134/97400efc-497e-d56c-da3a-ec31906e6f28.png)

　縦横に1から9を用意するところまではエクセルと同じですが、セルB2に、

````

=ARRAYFORMULA(A2:A10*ARRAYFORMULA(B1:J1))

````

　とするだけで一気に九九が完了します。

　このように、ARRAYFORMULA関数は入れ子状態にすることで通常のプログラミングでいうところのForのネストと似たようなことをしでかしてくれるわけです。

　で、当然これだけでは不満なわけで、１０，１１，１２・・・と増えたときに自動的に反応してくれないかな？ってなりますよね。

　そこで次に可変長のARRAYFORMULAを見てみましょう。

![スクリーンショット 2017-06-29 21.41.46.png](https://qiita-image-store.s3.amazonaws.com/0/139134/e3a97e61-dec2-826c-6ab7-7675ea808957.png)

　これも一撃です。セルB2に

````

=ARRAYFORMULA(INDIRECT("A2:A"&COUNTA(A:A)+1)*ARRAYFORMULA(INDIRECT("B1:"&CHAR(COUNTA(1:1)+65)&1)))

````
　とするだけです。見やすく改行すると、

````

=ARRAYFORMULA(
　INDIRECT("A2:A"&COUNTA(A:A)+1)*
　ARRAYFORMULA(
　　INDIRECT("B1:"&CHAR(COUNTA(1:1)+65)&1)
　)
)

````
　このような感じになるでしょうか。すなわち、COUNTA関数を混ぜることで行列数の変動に対応させています（だから空白セルとかは勘弁）。同時に、INDIRECT関数で包むことでA2:A10,A2:A11,・・・といった文字列を動的に生成しています。横軸はアルファベットに変換するためにCHAR関数も使っています。なお、CHAR関数だとZまでしか対応できず、AA以降はまた別の方法が必要になりますがここでは割愛します。
XCode9で追加されたAsset catalogsのNamed colors supportについて


XCode９のAsset Catalogsに以下が追加

###Asset Catalogs
- Named colors support.
- Added wide gamut app icons.
- Added a larger iOS marketing to the App Icon set.
- Added option to preserve image vector data for matching Dynamic Type scaling.
- Added support for HEIF images.

その中の自分で設定した色をAsset catalogsで管理できるようになる
**Named colors support.**
について



##使い方
Asset CatalogsでNew Color Setが追加されている

![スクリーンショット 2017-06-29 19.07.02.png](https://qiita-image-store.s3.amazonaws.com/0/64331/92c4e149-423a-4517-b765-086c32e6ca78.png "スクリーンショット 2017-06-29 19.07.02.png")



New Color Setを選択して
以下のように追加

![スクリーンショット 2017-06-29 19.19.32.png](https://qiita-image-store.s3.amazonaws.com/0/64331/3e4d8a6e-98f5-893f-e5cc-22aeea4e84b4.png "スクリーンショット 2017-06-29 19.19.32.png")

これでstoryboardの色変更で呼び出せるように

![スクリーンショット 2017-06-29 19.20.34.png](https://qiita-image-store.s3.amazonaws.com/0/64331/5ab80ca3-4b6c-2975-cd5a-abded2323c78.png "スクリーンショット 2017-06-29 19.20.34.png")

コードで呼ぶ場合は以下のように呼ぶ

```swift
label.textColor = UIColor.init(named: "myColor1")
```

これでアプリのよく使う色を一元管理できるように！！
ruby versionがMac全体に適用されない時の対処方

## 起こったこと
```
MacBook-Air-7:Users sato$ rbenv versions
  system
  2.2.2
  2.2.3
* 2.3.1 (set by /Users/sato/.rbenv/version)
```

こうなってるのに```ruby -v```すると
```
ruby 2.0.0p481 (2014-05-08 revision 45883) [universal.x86_64-darwin14]
```
あら。変わってない。

## 対処方
バージョンの切り替えが上手くいかなかった原因
~/.bash_profileに以下を追記する必要があった。

```
eval "$(rbenv init -)"
```
これをしないと、rbenvでインストールしたrubyのPATHが反映されない。

```
$ vi ~/.bash_profile # eval "$(rbenv init -)"を追記
$ source ~/.bash_profile # .bash_profileを読み込み、追記した設定を反映
# 改めてバージョンを確認
$ ruby -v
ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-darwin14]
```

### 参考
[こちら](http://mktktmr.hatenablog.jp/entry/2016/06/09/013545)
インストールと簡単な使い方【GLPK】

[<--目次へ](https://qiita.com/ki073/items/508b3c20eb03078703dd)

2021.12.14 追記あり

##MacやLinuxなどのUNIX系OSの場合

###インストール
Macの場合はMacPortsなどのパッケージ管理ソフトを使えば簡単にインストールできますし、CentOSではEPEL repoに登録されています。

###プログラムファイル、データファイルの作成
必ずUTF-8(BOMなし)でファイルを作ってください。標準でついているエディタやターミナルは文字コードがUTF-8になっていますので、文字コードは特に気にする必要はありません。最初のうちはプログラム部分とデータ部分を分けずに、1つのファイルにした方が簡単だと思います。ファイル名、拡張子には特に制限はないはずです。

###プログラムの実行
glpsol -m ファイル名
でモデルとデータが1つのファイルになっている場合は実行できます。
データが別の場合は-d データファイル名を追加。

##Windowsの場合 (2021.12.14 追記)
###インストール
GLPKが含まれるGUSEKをインストールするのが初心者には簡単ではないかと思います。

###プログラムファイル、データファイルの作成
必ず**文字コードがUTF-8(BOMなし)**でファイルを作ってください。Windows10からは、メモ帳でUTF-8で保存できるになっています。必ずUTF-8を選んで保存してください。それと**ファイル名は日本語を含まない英文字・数字のみ**を使い、プログラムファイルの拡張子は**.mod**にしてください。
それ以前のバージョンの場合はサクラエディタなどUTF-8で保存できるソフトを使うか、下記のようにgusekの編集ウインドウにコピーしてプログラムファイルを作ってください。
最初のうちはプログラム部分とデータ部分を分けずに、1つのファイルにした方が簡単だと思います。

###プログラムの実行
Windows10にgusek_0-2-24.zipをインストールした場合です。そのままでは日本語が文字化けしますのでその対策です。
上記のように文字コードUTF-8でプログラムのファイル作成し、拡張子は、必ず.modにしておいてください。

次に、gusek.exeを起動するとウインドウが開きます。openメニューでプログラムを書いたファイル(文字コードUTF-8)を読み込みます。日本語の部分が文字化けしているはずですので、メニューのFile->Encoding->UTF-8を選択すると、文字化けは治るはずです。
Tool->Goで実行されますが、もし拡張子がmodでなければGoが選べません。その時はFile->Save As...で拡張子をmodにして保存すると実行できるようになります。
計算が実行され、右に結果が出力されます。
日本語が文字化けしている場合には
Language->Propertis
で読めるようになるはずです。

繰り返しますが、プログラムファイルやデータファイルはUTF-8に限られておりますので注意してください。
実行時のオプションは、
View->Parameters
で空いているところに書き込むことで設定できるようです。

Window7などで、UTF-8のファイルが作れない場合は、
メニューのFile->Encoding->UTF-8を選択して、その後でプログラムをコピペしてから、
File->Save As...で拡張子を必ずmodにして保存するとうまくいくはずです。
PowerShellでsudo

PowerShellでsudoがしたかったんですよ．

# 背景
[みむら親方が以前ブログに書いてたの](http://mimumimu.net/blog/2014/12/11/windows-%E3%81%A7-sudo-%E3%81%AA%E3%81%93%E3%81%A8%E3%82%92%E3%81%99%E3%82%8B%E3%80%82/)を参考にしたのですが，
これだと第一引数を実行ファイルとして管理者権限で起動するだけなので，コマンドや引数付きでの実行ができなかったわけです．
そこで，以下のようにしました．
[Pauseが定義されてる](http://qiita.com/twinkfrag/items/f3ecf79b68ea09eadec2)ことを前提とします．
これを，`$profile`に書くなどすれば，起動時に読み込まれて`sudo`が使えます．

# 本体
```sudo.ps1
function Invoke-CommandRunAs
{
    $cd = (Get-Location).Path
    $commands = "Set-Location $cd; Write-Host `"[Administrator] $cd> $args`"; $args; Pause; exit"
    $bytes = [System.Text.Encoding]::Unicode.GetBytes($commands)
    $encodedCommand = [Convert]::ToBase64String($bytes)
    Start-Process powershell.exe -Verb RunAs -ArgumentList "-NoExit","-encodedCommand",$encodedCommand
}

Set-Alias sudo Invoke-CommandRunAs

function Start-RunAs
{
    $cd = (Get-Location).Path
    $commands = "Set-Location $cd; (Get-Host).UI.RawUI.WindowTitle += `" [Administrator]`""
    $bytes = [System.Text.Encoding]::Unicode.GetBytes($commands)
    $encodedCommand = [Convert]::ToBase64String($bytes)
    Start-Process powershell.exe -Verb RunAs -ArgumentList "-NoExit","-encodedCommand",$encodedCommand
}

Set-Alias su Start-RunAs
```

# 解説
## 全体
`Invoke-CommandRunAs`がメイン．
基本的には`$commands`に実行するものを全部放り込んで，Base64でエンコードして管理者権限のpowershell.exeに渡します．
PowerShellコマンドは;で区切ってやれば次の行として扱われます．
この用法は`powershell /?`で確認できます．

$commandsの中身は以下のようになっています．
## `Set-Location $cd`
親方も言っていたとおり，`Start-Process -Verb RunAs`すれば管理者権限で起動ができるのですが，このときワーキングディレクトリが強制的にSystem32になり，`-WorkingDirectory`オプションが効きません．
なので，コマンド実行前に`Set-Location`をかけます．

## `Write-Host `"[Administrator] $cd> $args`"`
何が実行されたのか分かりづらかったのでワーキングディレクトリと実行内容を出しておきます．

## `$args`
関数に渡ってきた引数をそのまま全部コマンドとみて実行します．

## `Pause; exit`
実行後は開いた新しいPowerShellウインドウが勝手に閉じないように`Pause`を置いていたのですが，それだけだとエラー時に`Pause`の行まで行かずに閉じてしまうので，powershell.exeに`-NoExit`オプションをつけた上で，正常にPauseを通り過ぎたら`exit`するようにしています．

# おまけ
`Start-RunAs`は現在のワーキングディレクトリで管理者のPowerShellウインドウを開くコマンドです．残念ながらインラインでやる方法は分かりませんでした．

これで，`sudo Enable-PSRemoting`とか`sudo cmd /c mklink a b`とかを管理者で走らせられるようになりました．もちろん実行前にはUACのダイアログが出ます．
CentOS7にDockerとDocker Composeをインストールする

#事前準備
* Virtual BoxでCentOS7を立ち上げました


#手順
root権限で作業をします。
##yumの設定とyum-utilのインストール

```
yum update
yum install yum-utils
```

※ プロキシ環境の場合は、yumを使うときにはプロキシ設定が必要です。

```
vi /etc/yum.conf
```
設定ファイルに以下の記述を追加します。

```
proxy=http://proxy.xxx.xxx:pp
```
※ xxx.xxx = 指定するIPアドレス　　pp = ポート番号

参考にしたサイト
[yum,wgetのproxy設定(centOS 7)](http://qiita.com/katsuta/items/17eee8e78543871b5f27)

##DockerとDocker Composeのインストール

```
# Dockerのインストール
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce
systemctl start docker
systemctl enable docker

# 一般ユーザ×××× に権限追加
usermod -g docker ××××

# Docker Composeのインストール
curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
```
* usermod   
ユーザーのアカウント情報を変更するコマンド。-gで所属するグループを指定する。


###ちょっと試しにコンテナを起動させてみました

```
[root@localhost ××××]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b04784fba78d: Pull complete 
Digest: sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
```
と色々メッセージがでてきます。
ちゃんとDockerがインストールできていることを確認できました。


　

#躓いたところ
* **sudo bashが使えない問題**  
いつも当たり前のように使っていたsudo bash。なのに今回は使えない…！と思ったら、sudo bashを使うためには、ユーザにroot権限を付与する必要があるみたいでした。そのときは**visudo**コマンドを使います。  
手順はこちらのサイトを参考にしました。  
[作成したユーザーにroot権限を持たせる設定](https://genchan.net/it/server/5421/)  
今まで上司が、いかに環境を整えていてくれてたのかを、知ることができました。 
* **yumできない問題**  
yumコマンドを打つとき、最初はネットワークにつながらないというエラーがでました。これは**プロキシの設定**をしていないことが原因でした。ネットワーク系の時はプロキシを忘れない！
* **netstatできない問題**  
とりあえずネットワーク系のエラーの時はnetstat…と覚えていたのですが、netstatがコマンドとして認識されませんでした。これはnetstatが**ss**コマンドに変わっていたためでした。  
ついでに、route  →  ipコマンド、ifconfig  →ipコマンドに変わっているとのこと。私が知っている数少ないLinuxコマンドだったのに、こんなに変わっているとは…

#感想
Dockerのインストールは、バージョンの違いによって適宜方法が変わるようです。 
しかもかなりの頻度だそうです。
AWSでDockerを扱ったことがありますが、いちいちそんなこと気にせずに、初めからDockerを使うことができるのは大変ありがたいことだったのだなあと思いました。

あと、何回プロキシ設定に苦しめば気が済むんだ…という感じなので、ネットワーク系のときはプロキシ設定忘れない！を忘れないようにしたいです。

今後はこの環境を使って、ロケットチャットを立ち上げたいです。ただ今絶賛苦戦中なので頑張ります。
PowerShellでPause

なんかいつの間にか最新のWindows10までに入ってるみたいなんだけど，定義が以下のようになっている．

```PowerShell:defaultPause.ps1
# > (Get-Command Pause).Definition
$null = Read-Host '続行するには、Enter キーを押してください...'
```

これだと任意のキーでよかったcmdのpauseとは勝手が違うし，そもそもいつまでだか分からないけど前はなかったので，使ってるのを貼ってみる．

```PowerShell:Pause.ps1
function Pause
{
    if ($psISE) {
        $null = Read-Host 'Press Enter Key...'
    }
    else {
        Write-Host "Press Any Key..."
        (Get-Host).UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") | Out-Null
    }
}
```
`RawUI.ReadKey()`も，`[System.Console]::ReadKey()`もISEでは使えないので，仕方なくRead-Hostにする．
それ以外は見ての通りで入力を待ってnullに投げるだけ．`$null`に入れても`Out-Null`にパイプしても多分同じ．
この内容を`$profile`とかで呼んでやれば`function Pause`がなければ作られてあれば上書きされる．
【2017/10/25更新】QiitaのContribution数ランキング


## この記事について

・ユーザ毎のContribution数総合ランキングです。
・毎日06:30に自動更新されます。
・Contribution数には誤差があります。あくまで順位の目安としてください。
・この記事へのコメントは削除されます。ご指摘などは[解説記事](http://qiita.com/rana_kualu/items/0715ee2ce77be743398e)にお願いします。

## Contribution数ランキング

上位50名の一覧。

| Contribution数 | ユーザ名 | 順位 |
|-----------:|------------:|:------------:|
| 32889 | @jnchito | 1 |
| 32569 | @hirokidaichi | 2 |
| 27044 | @icoxfog417 | 3 |
| 22176 | @suin | 4 |
| 19560 | @shu223 | 5 |
| 18057 | @KeithYokoma | 6 |
| 17161 | @mizchi | 7 |
| 17002 | @yuku_t | 8 |
| 16596 | @mpyw | 9 |
| 16549 | @kenju | 10 |
| 16280 | @opengl-8080 | 11 |
| 15625 | @awakia | 12 |
| 14680 | @mono0926 | 13 |
| 12937 | @b4b4r07 | 14 |
| 12902 | @muran001 | 15 |
| 12855 | @haminiku | 16 |
| 12439 | @edo_m18 | 17 |
| 12299 | @cognitom | 18 |
| 12183 | @HirofumiYashima | 19 |
| 11816 | @appwatcher | 20 |
| 11742 | @koher | 21 |
| 11442 | @kazunori279 | 22 |
| 11418 | @susieyy | 23 |
| 11202 | @zaru | 24 |
| 10971 | @yimajo | 25 |
| 9869 | @hshimo | 26 |
| 9800 | @ynakayama | 27 |
| 9754 | @kenmatsu4 | 28 |
| 9702 | @hkusu | 29 |
| 9551 | @uasi | 30 |
| 9498 | @kidach1 | 31 |
| 9422 | @takeharu | 32 |
| 9399 | @joker1007 | 33 |
| 9179 | @kawasima | 34 |
| 9156 | @tukiyo3 | 35 |
| 9025 | @tadsan | 36 |
| 8421 | @usagimaru | 37 |
| 8106 | @kawaz | 38 |
| 7865 | @gaogao_9 | 39 |
| 7822 | @zembutsu | 40 |
| 7748 | @okappy | 41 |
| 7674 | @sion_cojp | 42 |
| 7673 | @tonkotsuboy_com | 43 |
| 7505 | @syui | 44 |
| 7499 | @vvakame | 45 |
| 7436 | @Quramy | 46 |
| 7211 | @Qiita | 47 |
| 7133 | @rana_kualu | 48 |
| 7107 | @kaiinui | 49 |
| 7099 | @tbpgr | 50 |
DB2→Db2 なんで小文字？dashDBも名称変更

####(更新)製品名の変更が正式に変更されました！
IBM Db2 ファミリー製品の名称の改訂
https://ibm.com/common/ssi/ShowDoc.wss?docURL=/common/ssi/rep_ca/3/760/JAJPJP17-0443/index.html

|旧名称|新名称|
|:---|:---|
|IBM DB2 Linux, Unix and Windows (LUW)|IBM Db2|
|IBM DB2 for i|IBM Db2 for i
|IBM DB2 for z/OS|IBM Db2 for z/OS
|IBM DB2 on Cloud|IBM Db2 Hosted
|IBM dashDB for transactions|IBM Db2 on Cloud
|IBM dashDB local|IBM Db2 Warehouse
|IBM dashDB for analytics|IBM Db2 Warehouse on Cloud

---

DB2がDb2にリブランド、リネームされたようです。HPも順次リネームが始まっていますね。
なんで小文字にしたのかの背景？などは今後発表されるでしょう。

[IBM、DB2を「Db2」にリブランド。開発者向け「Db2 Developer Community Edition」も無償公開。MacOS版も用意 (publickey)](http://www.publickey1.jp/blog/17/ibmdb2db2db2_developer_community_editionmacos.html)

さて、これらの発表に合わせて、dashDBのサービスも一部名称変更となっているので注意が必要です。
Bluemixでは”DB2 on Cloud” および "dashDB for Transactions" の名称が以下のように変更になりました。

 

##Db2 Hosted (旧 DB2 on Cloud)

-**“Hosted”** という表記はIBMのソフトウエアがクラウド上でホステッドサービスとして提供されるサービスすべてに適用される予定です。

##Db2 on Cloud (旧 dashDB for Transactions)

-dashDB for Transactions はDb2 ファミリーとして新たにリブランドしました。
-**“on Cloud”** という表記はクラウド上での提供されるマネージド・サービスの製品およびサービスに適用される予定です。
Command::ask()など、コンソールからの入力を受け付けるartisanコマンドのテスト

# 問題点
何らかの入力を求めるartisnaコマンドをphpunitでテストしようとした場合、ただartisanコマンドを実行するだけではいつまでも入力待ちの状態になりテストが行うことが出来ない。

## 例
### Commandクラス
本当は入力値を使用してDBに書き込み・・・などすると思うが、ここでは必要最低限のコードのみを記載する。

```php:TestCommand.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class TestCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'test_command';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $name = $this->ask('名前は？');
        $this->info("あなたの名前は{$name}です。");
    }
}
```
## Kernelクラス
```php:Kernel.php
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        \App\Console\Commands\TestCommand::class
    ];
```

### 通常のartisanコマンド実行

```sh:artisan
$ php artisan --ansi test_command

 名前は？:
 > 山田太郎

あなたの名前は山田太郎です。

```
### 上記artisanコマンドを実行するようなテストクラス

入力待ちのまま固まってしまいプロセスを強制終了するしかない。

```php:CommandTest
class CommandTest extends TestCase
{
    /**
     * @see \MasterDataSeeder
     */
    public function test001()
    {
//        $this->artisan('test_command');
    }
}
```

# 回避方法

こちらを参考にさせてもらいました。

- http://themsaid.com/building-testing-interactive-console-20160409/
- https://github.com/laravel/framework/issues/11946


## 例
### 上記artisanコマンドを実行するようなテストクラス

`ask()`をモック化して、常に山田太郎を返却するようにしています。
もしパスワードの入力などを求めていて`secret()`を使用している場合も同様に対応可能です。

```php:CommandTest
class CommandTest extends TestCase
{
    /**
     * @see \MasterDataSeeder
     */
    public function test001()
    {
        $command = \Mockery::mock("\App\Console\Commands\TestCommand[ask]");
        $command->shouldReceive('ask')->once()->andReturn('山田太郎');
        $command->setLaravel($this->app->make('Illuminate\Contracts\Foundation\Application'));
        $command->setApplication($this->app->make('Symfony\Component\Console\Application'));

        $tester = new CommandTester($command);
        $tester->execute([]);
        $this->assertSame("あなたの名前は山田太郎です。" . PHP_EOL, $tester->getDisplay());
    }
}
```
[Python]BottleでさくっとWebアプリケーション！

# はじめに
「Webアプリケーションを作ってみたい…」と思い立ち、現在勉強中のPythonで良いフレームワークが無いかな？と調べてみたところ…

[Bottle](https://bottlepy.org/docs/dev/)というものを見つけたので、Hello Wordまでの備忘録を。

# 動作環境
- Amazon Linux AMI release 2017.03
- Python 2.7.12

# HelloWordまで
## yum update
まぁ、基本だからやっておきましょうね。

```shell-session
# sudo yum update
Loaded plugins: priorities, update-motd, upgrade-helper
No packages marked for update 
```
うん、新しいサーバって素敵。

## bottleインストール
色々調べた所、Bottle本体をwgetで配置したりとか…
でも、私は公式ドキュメントを信じる！！
![1.png](https://qiita-image-store.s3.amazonaws.com/0/153178/ec358c84-d9ef-1382-2dc9-0b562a52e394.png)

```shell-session
# pip install bottle
You are using pip version 6.1.1, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Collecting bottle
100% |******************************| 73kB 4.0MB/s 
Installing collected packages: bottle
  Running setup.py install for bottle
Successfully installed bottle-0.12.13
```
よし、特に無事に入ったッぽいね。

## アプリ配置
[Bottle](https://bottlepy.org/docs/dev/)のページのど真ん中にあるやつを使うんだな。
**Example: “Hello World” in a bottle**

適当な名前を付けて作っちゃおう。

```py:main_app.py
from bottle import route, run, template

@route('/hello/<name>')
def index(name):
    return template('<b>Hello {{name}}</b>!', name=name)

run(host='localhost', port=8080)
```

## 実行権限付与
お忘れ無く！

```shell-session
# chmod +x ./main_app.py 
```

## Runさせる
さぁ動かすぞ！

```shell-session
# python main_app.py 
Bottle v0.12.13 server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.
```
お！Listenし始めた。
んじゃ、ターミナル複製してcurlしてみる。

```shell-session
$ curl http://localhost:8080/hello/jump
<b>Hello jump</b>!
```
こんちゃーっす！！

Runさせてたターミナルにはアクセスログが返ってきてます。

```shell-session
127.0.0.1 - - [29/Jun/2017 09:48:38] "GET /hello/jump HTTP/1.1" 200 18
```

# おわりに
BottleのHelloWordまでやってみました。
公式ドキュメント読めばいいんじゃね？っていう声も聞こえてきそうですが…
誰かのお役に立てれば幸いです。

# 余談
とりあえず、Qiita初投稿という事で、練習がてら書いてみたけど、
**Qiita素敵！！**:relaxed:
今後とも続けていきたい！
RedHatのバックグラウンドでコマンドを実行する方法

## はじめに
大量の画像をアップロードするような処理ですと、コードの実行で何時間もかかり、他の作業に支障をきたすこともあるかと思います。
今回は、何時間かかる処理をRedHatのバックグラウンドでコマンドを実行し、コマンドを実行している間にローカルで別の作業ができる方法を記述しますので、参考にしてください。

## RedHatのバックグラウンドでコマンドを実行
### RedHatにscreenのインストール
1. TeraTermでサーバーにログインします。  
　　
2. screenをインストールします。

```
 $sudo yum install screen
```  
![java9.png](https://qiita-image-store.s3.amazonaws.com/0/185050/95a5afcc-75c4-4230-6691-0697b1080067.png)


### screenを実行
RedHatでそのままコマンドを実行すると、バックグラウンドで実行した状態にできないので、screen内でコマンドを実行します。

1. screenを実行しますので、下記をコマンドで実行します。

```
 $screen
```  
![screen1.png](https://qiita-image-store.s3.amazonaws.com/0/185050/3ad53966-87ca-c5cd-3c75-6238caa6726d.png)  
　　
2. scrennを実行すると、上部に「screen0」と表示されます。
![screen2.png](https://qiita-image-store.s3.amazonaws.com/0/185050/cad38676-273a-e170-772c-444a0acdb99b.png)
これでscreenが実行できました。

### screen内でコマンドを実行
「screen0」の画面でコマンドを実行します。
今回は、topコマンドを実行します。 
![top1.png](https://qiita-image-store.s3.amazonaws.com/0/185050/e239bf41-6db9-cea2-f949-531cff1e6c92.png)

### デタッチ
1. screen内コマンドを実行中に元の環境に戻る場合は「Ctr＋A」→「D」とコマンドで実行します。  
コマンドでたたくと、下図のように「detached from ×××××.pts-×.linux1」と表示されます。  
![screen8.png](https://qiita-image-store.s3.amazonaws.com/0/185050/0a86b5e1-dddf-da0d-79cb-27917f90c844.png)  
　
2. RedHatからデタッチする場合も同様に「Ctr＋A」→「D」とコマンドで実行します。  
このままTeraTermを終了します。

### アタッチ
1. TeraTermでRedHatにログインします。  
　　
2. RedHatでデタッチ前のscreenに戻る際は、下記を実行します。  

```
 $screen -r
```  
![screen12.png](https://qiita-image-store.s3.amazonaws.com/0/185050/6acdd83e-6e2b-4826-f38d-23ea70400f0b.png) 
　　
3. screenにアタッチすると、コードを実行中のscreenに戻ることができます。
![top1.png](https://qiita-image-store.s3.amazonaws.com/0/185050/e239bf41-6db9-cea2-f949-531cff1e6c92.png)

### 複数のscreenからデタッチしている場合の注意事項 
複数のscreenにログインしている場合は複数のscreenが表示されますので、下記のようにscreenを指定して、screenに戻ります。
SCREENNAMEには、アタッチするscreenの名前を、「.pts-×.linux1 (Detached)」より前の数字を指定します。  
たとえば、「38177.pts-0.linux1」のscreenにアタッチする場合は、「screen -r 38177」と実行します。

```
 $screen -r SCREENNAME
```  
![screen9_1.png](https://qiita-image-store.s3.amazonaws.com/0/185050/bc3aa22f-a09a-9e7c-8c20-531b7cc35441.png)


### screenから抜ける
screenから抜ける場合は、「exit」とコマンドで実行します。

```
 $exit
```  
サーバーでコマンド実行中のscreenから抜ける場合は、1回処理を中断してから、「exit」とコマンドで実行します。
たとえば、top画面を開いている場合は、「q」で1回処理を中断してから、「exit」とコマンドで実行します。  
![screen13.png](https://qiita-image-store.s3.amazonaws.com/0/185050/649463e7-9317-cf04-4c0b-b4d6da277421.png)　　
これで、screenから抜けることができます。
CSSを正規表現で適用先を絞り込む

#属性セレクタ
CSSの適用先に正規表現を用いることが出来ます。


| 書式 | 適用先 |記述例|解説|
|:--|:--|:--|:--|
| [属性名]  | [属性]が指定されている要素全て  |img[title]|img要素にtitle属性が指定されている要素|
| [属性名="属性値"]  | 属性値が全体一致  |input[type="submit"]|input要素にtyupe="submit"が指定されている要素|
| [属性名~="属性値"]  |属性値が含まれる（classを指定した場合、クラスセレクタと同じ）  |div[class="sample"]| div要素のclass属性値に"sample"が指定されている要素|
| [属性名｜="属性値"]  | 属性値が含まれる（ハイフン区切り値の前半に対応）  |span[lang｜="zh"]|span要素のlang属性値にzhを含む要素|
| [属性名^="属性値の始め"]  | 属性値の文頭が一致  |a[href^="/pc/"]|a要素のhref属性値の文頭が/pc/であるもの|
| [属性名$="属性値の終わり"]  | 属性値の末尾が一致  |img[src$=".jpg"]|img要素のsrc属性値の末尾が.jpgであるもの|
| [属性名*="属性値"]  | 属性値の一部が一致 | a[href*="mobile"]|a要素のhref属性値にmobileを含むもの全て|

※[属性名|=属性値]の記述がqiitaのマークアップと被ってしまうため全角にしています。
はじめてのSwiftアプリ制作1: プロジェクトの作り方

プロジェクト作成時の設定項目と、生成されるファイルについて簡単に書きます。

## 自己紹介
皆さま、はじめまして。tsubamechiと申します。
ここでは、SwiftでのiOSプログラミング未経験（かつアプリケーション開発も未経験）の見習いエンジニアが数ヶ月学んだ「アプリ制作」の知見を記録していこうと思っております。

## 環境
Xcode: 8.3
Swift: 3.0

## プロジェクトの作成
まずは制作するアプリのプロジェクトを作成します。
Xcodeを開き、「Create a new Xcode project」を押すか [File] -> [New] -> [Project]からプロジェクトの作成画面に行きましょう。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/189662/8b490112-a69c-4438-5968-e97c297db074.png)


様々なアプリケーションのテンプレートが選択できますが、一般的な「Single View Application」を選択して[Next]。

<img width="729" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/189662/9f234118-cb30-1983-5312-47d8d514f08c.png">

次の画面ではプロジェクトの基本的な設定をします。

<img width="1279" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/189662/c471ae10-ccf9-18ee-8b60-681da03367cc.png">

| 設定項目名 |内容|
|:--|:--|
| Product Name| 作成するプロジェクトの名前を入れます。 | 
| Team  | 後日説明予定です。実機検証する際に必要となりますが一旦はNoneでよいです。  |
| Organization Name | アプリの制作元となる組織名を入力します。  |
| Organization Identifier  | 上記の組織名のIDを入力します。これにプロダクト名を合わせたもの（いわゆるドメイン）を逆にしたものがBundleID(=アプリのID)として設定されます。（後でBundleIDは変更可能ですが、この形の記述が推奨されています）  |
| Language  | SwiftまたはObjective-Cを選択します。 |
| Devices | iPhone用またはiPad用もしくはUnivarsal（両対応）かを選択します。  |
| Use Core Data  | Core Data(アプリ内保存用のデータベースライブラリ) を使用するかどうか。チェックをいれた場合、AppDelegateにCoreData用のコードが追加されます。  |
| Include Unit Tests  | チェックを入れるとユニットテスト用のファイルをプロジェクトに追加します。  |
| Include UI Tests  | チェックを入れると UIテスト用のファイルをプロジェクトに追加します。  |

保存先を決定すると、プロジェクトが作成されます。

## 各ファイルの説明
「Single View Application」を選択した際に、自動的に生成される各ファイルについて役割を確認しましょう。

<img width="258" alt="4.png" src="https://qiita-image-store.s3.amazonaws.com/0/189662/eff272d9-bd4a-b160-9892-208483da9bd7.png">

| ファイル名 |内容|
|:--|:--|
|AppDelegate.swift|アプリ全体のライフタイムイベントを管理します。(起動時、バックグラウンド時、フォアグラウンド時、終了時etc)|
|ViewController.swift|画面内の各パーツ（View）を管理・操作します。基本的に、1画面につき1つのViewControllerが作られます。|
|Main.storyboard|アプリ全体の画面の表示や遷移を見ながら、パーツの追加や表示の制御ができるツールです。ストーリーボードについては後日説明予定です。|
|Assets.xcassets|アプリで使用する画像セットを表示するカタログです。アプリで表示したい画像はここに追加していきます。|
|LaunchScreen.storyboard|アプリ起動時に表示する画面を設定します。|
|info.plist|アプリでの共通的な設定を記載します。ユーザーに使用許可を尋ねなければならない機能を使用する際等に記述を加える必要があります。|
|SampleAppTests.swift|XCTestフレームワークを使ったユニットテストを記載します。|
|SampleAppUITests.swift|XCTestフレームワークを使ったUIテストを記載します。|

## 設定について
プロジェクトの一番上にある青い[プロジェクト名]のファイルを選択すると、以下のような設定画面が開きます。

<img width="796" alt="5.png" src="https://qiita-image-store.s3.amazonaws.com/0/189662/49084154-6453-8e99-3d5c-bb9350196d0e.png">

この各項目については説明すると非常に長くなるので、作成する際に設定した基本設定の他に[Deployment Target]を選択しましょう。
これは、このアプリを動かすことができる最低のiOSバージョンになります。
今回は、こちらを9.0にしてみましょう。
（iOS8に対応する場合は、こちらを8.0に。iOS10以上ならば10.0とします。OSの新機能を使いたい場合、実装されたバージョン以上を選択しなければその機能を使用することができません）

## まとめ
* 普通のアプリを作成する際は、「Create a new Xcode project」から「Single View Application」を選択して作成
* 作成する際にアプリの基本設定を入力する。後から変更も可能
* アプリに必要な最低限のファイルはプロジェクト作成時に作られる
* どのiOSのバージョンまで対応するかはあらかじめ設定しておく

次回は、Xcodeの機能について書きます。
Vagrant の Box 化の前にすること


### logディレクトリの中身削除する
$ sudo rm -fr /var/log/*

### tmpディレクトリの中身削除
$ sudo rm -fr /tmp/*

### yumのキャッシュ削除
$ sudo yum clean all

### 0埋め
# これをやると仮想ハードディスクの未使用領域をゼロ埋めし、box容量が小さくなる
$ sudo dd if=/dev/zero of=zero bs=4k

### 作られたファイルを削除する
$ sudo rm zero

### コマンドヒストリー削除
$ history -c
# -c コマンド履歴を削除
Marx.cssでclassタグとの闘争を終結させる

> これまでのすべての社会の歴史は<strike>階級闘争</strike> **classタグとの闘争**の歴史である

---

# 現代はCSSフレームワーク全盛

---

# CSSフレームワークを使う利点

 - とりあえずステキな見栄え
 - コンポーネントを自作せずに済む
 - 画面間でデザインが統一される
 - レスポンシブ対応も考慮されている

→ 特にデザイン工数が少ない **管理画面**・**社内向け画面**

・・・しかし！

---

# 繰り返し書かされる class

```html
<button type="button" class="btn btn-default" />

<input type="submit" class="btn btn-primary" />

<input type="text" class="form-control" />
```

（ボタンは全部 `btn btn-default` に決まっているのに・・・ :frowning2:）

---

# 何段にもネストするタグ

```html
<div class="panel panel-default">
  <div class="panel-heading">
    <h3 class="panel-title">Panel title</h3>
  </div>
  <div class="panel-body">
    Panel content
  </div>
</div>
```

（ワクで囲みたいだけなのに・・・ :frowning2::frowning2:）

---

# サーバーサイドのコードも必要

```ruby
def form_group(f, name, &block)
  classes = ['form-group']
  classes << 'has-error' if f.object.errors.include?(name)
  content_tag(:div, class: classes, &block)
end

def error(f, name)
  f.object.errors.full_messages_for(name).map do |message|
    content_tag(:span, class: 'help-block') { message }
  end.join('').html_safe
end
```
```haml
= form_for(...) do |f|
  = form_group(f, :name) do
    .control-label.col-xs-3
      = f.label :name
    .col-xs-9
      = f.text_field :name, class: 'form-control'
      = error(f, :name)
```

（工数を節約するために Bootstrap を使うのに・・・ :frowning2::frowning2::frowning2::frowning2:）

---

# これが我々が求めた世界か！？:fist:

---

# No!

---

# Marx.css

---

# Marx.css は・・・

 - CSSリセット + 小ぎれいなデフォルトスタイル
 - 基本的なレイアウト（ヘッダー・フッター）は提供
 - レスポンシブ対応済み
 - 19世紀の思想家とは関係ない
 - **class数: 0**

---

# 公式サイト

https://mblode.github.io/marx/
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179154/72ee43c4-892c-47b1-7b1b-3f9f8f083184.png)

---

# **class数: 0** の理由

デフォルトでスタイル適用済み:

 - `<button>` `<input type="submit">`
 - `<input type="text">`
 - `<h1>` `<h2>` `<h3>`...
 - `<table>`

レイアウトにはHTML5のタグ:

 - `<main>`: メインコンテンツ
 - `<header>`: ヘッダー

---

HTML5の新しいinput type:

 - `<input type="datetime" />`
 - `<input type="number" />`
 - `<input type="range" />`
 - `<input type="email" />`
 - `<input type="color" />`

---

# Marx.css のメリット・デメリット

## メリット:

 - とにかくマークアップが楽
 - `<link>` タグ１個で導入できる
 - パーツ選びに迷いようがない
 - サーバーサイドの開発が不要
 - 別フレームワークへの移行も（多分）簡単

## デメリット:

 - 地味
 - レスポンシブ対応は基本のみ（テーブルの並び替えなどはしない）

---

# その他の軽量フレームワーク

 - sakura (https://oxal.org/projects/sakura/)
 - Sanitize.css などのCSSリセットライブラリ
 - Marx.css を改造する（SCSSで書かれているので簡単。背景を赤に染め上げるなど。）
vue.jsでHTML5 Form validationの利用

# 目的
vue.jsでSPAページの構築時、submitせずにHTML5 Form validationを利用

# 方法

```html
<form id="form" @submit.prevent="">
  <input type="text" required />
  <button @click="update" />
</form>
``` 

* buttonのclick eventは、formタグに伝播させる
* formタグでは、click eventは受け付けるが、submit eventはpreventで処理させない
    * formタグでのclick event受付時にHTML5 Form validationが実施される
    * validationの実行結果に問題なければ、formタグでsubmit eventが発行されるのでprevent

```js
export default {
  methods: {
    update () {
      const form = document.getElementById('form');
      if (!form.checkValidity()) return;
      // 以降、省略
      // API request && 画面遷移処理 etc..
    }
  }
}
```

* `checkValidity()`の結果に従って処理の実施可否を判定


# 備考
* Form上でのEnter Key実行は、buttonタグのclick eventと解釈され、`@click`の処理が実施される
* Safari / Chromeでの動作確認はしたが、それ以外のブラウザでの動作検証は未達
node.jsの環境をサクッと

## node.js環境構築

###nvm

``` nvmを入れる
$ git clone https://github.com/creationix/nvm.git ~/.nvm && cd ~/.nvm && $ git checkout `git describe --abbrev=0 --tags`
```
``` パスを通す
$ source ~/.nvm/nvm.sh
$ nvm --version
```
###node
``` node.jsを入れる
// インストールするversionの確認
$ nvm ls-remote
// インストール
$ nvm install v6.10.0
// versionの切り替え
$ nvm use v7.10.0
// インストールされているnodeのバージョンを確認
$ nvm ls
```


###npm
```:npmのversionを確認
$ npm --version
3.10.10
```

```:npm自体のversionをあげる
$ npm install -g npm
```

```:npmversion確認するとversionが上がっている
$ npm --version
5.0.0
```
Cognos マルチ粒度のファクト表が存在するデータモデルでの対処方法

##概要
タイトルから何を言ってるのか、さっぱりわからないかも知れないですが、この概要を読んで頂ければ大事な問題だとわかりますので、是非ちょっと読んでみてください。
こんなテーブル構造のデータを取り扱う場合の、Framework Managerモデルの対処方法です。
何が特徴的かというと、販売実績表と販売目標表という、二つのファクト表の粒度が、実績表は日単位、目標表は月単位にデータを持っている点です。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/beb4cf2b-c060-aa33-4038-574738152919.png)

実績を日単位、目標を月単位なんて、普通にある話ですよね。
とりあえず上のような感じで、普通にテーブル間に1対多のリレーションを張ってみます。

さて、ここで問題ですが、2015年1月のAppleの売り上げ数量(QUANTITY)と、売り上げ目標(EXPECTED_VOLUME)はいくつでしょうか？
売り上げ数量を、販売実績表で見ると、A1の2015年1月は、2015年1月1日の2個と、2015年1月2日の1個で、合計3個。
売り上げ目標は簡単で、販売目標表で見たら一発でわかる、4個。
あと1個だけ目標に届かず、という結果が正しいですね。

ところが、実際にレポートでリスト表にこれらのデータアイテムを置いてみると、こんな結果になります。
なんで、Appleの目標が8個なの？と、びっくりしてしまいます。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/e62cdad0-a700-4f43-51c0-3f4c2ce72df5.png)

これは何もCognosが悪いわけではなく、こういうマルチ粒度のファクト表を取り扱うデータモデルでは、他のBIツールでもこの結果を返してしまいます。
そして、実は多くのBIツールでは、このモデルの解消法が無いという、なかなか厄介なモデルなのです。

##対処方法
Cognosでは、こういうモデルの対処方法として「行列式」という機能が提供されています。
先ほどのモデルで、粒度違いのリレーションが実装されている、「日付マスタ表」に行列式を実装します。
日付マスタ表は、販売実績表とはDAY_KEYで接続し、販売目標表とはMONTH_KEYで接続しています。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/d47d6308-30a9-6f25-2b50-b6138c0d1eb5.png)

行列式はFramework Managerの機能です。
日付マスタのクエリー・サブジェクト(DATEMST)の、行列式タブで、以下のように「Month」と「Day」というエントリーを作成し、DayはDAY_KEYが所属し一意にデータが存在し、MonthはMONTH_KEYが所属し一意ではなくグループ化(集約)アイテムであると宣言します。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/950d7b60-3b99-5808-4f4a-4347f773b71c.png)

この行列式の設定をして、発行されたモデルだと、以下のように正しい目標値の結果が出力されます。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/6f89ca04-12f9-a2fe-cb81-cf5a1c45f2d8.png)

Cognosだけでなく、全てのBIツールで気を付けないといけない大事な話なので、マルチ粒度のファクト表モデルを取り扱う場合は、結果が正しく表示されているか注意して見るように心がけてみて下さい。