OmniAICreator/Qiita-1.07M huggingface dataset:
Cognos10エクスポートファイル作成


####エクスポート対象として選択できるもの
ContentStore全体
特定のディレクトリ
特定のパッケージ
※**レポート自体を選択してエクスポート配布仕様を作成することはできない**

#手順
1.「IBM Cognos Administration」を起動する

2.「設定」タブの「コンテンツ管理」、エクスポートの新規作成を押下

3.「名前」を入力し、「次へ」ボタンを押下


4.「共有フォルダー、ディレクトリー、およびライブラリーのコンテンツを選択」を選択し、「次へ」ボタンを押下

5.「追加」ボタンを押下し、エクスポートするフォルダを選択する

6.今回は、「共有フォルダ＞Qiita」のチェックボックスにチェックし、「追加」ボタンを押下

7.「OK」ボタンを押下

8.先ほど選択したフォルダが選択されていることを確認し、「次へ」ボタンを押下

9.「次へ」ボタンを押下

10.「次へ」ボタンを押下
　　〈記録レベルについて〉
　　・基本
　　　配布の進捗情報と集計情報を保存する。これはデフォルト・オプションです。
　　・最小限
　　　配布の集計情報のみを保存する。このオプションを選択した場合、メモリー消費が最小になります。
　　・トレース
　　　配布の詳細すべてを記録する。このオプションを選択した場合、メモリー消費が最大になります。

11.「次へ」ボタンを押下

12.設定した内容を確認し、「次へ」ボタンを押下

13.「保存して1回実行」を選択し、「終了」ボタンを押下
haskell parsec個人メモ

# haskell parsec個人メモ

parsecのドキュメント
http://jakewheat.github.io/intro_to_parsing/#_first_parser
を参考にメモをしていく。

使うにはbuild-dependsにparsecを追加する。
モジュールはたくさんあるが、とりあえず

#パーサの実行
パーサの実行にはparse関数を使う。
引数は
parse <パーサ> <名前> <パースしたい文字列>
みたいにして渡す。
<名前>は単に識別としてつかうので別に"hoge"とかでもいい。

parsecのドキュメントどおり、パースの実行を簡易にするためのrunという関数を
定義すると便利だろう。

```
import           Text.Parsec.Char
import           Text.Parsec.Prim
import           Text.Parsec.String

--パーサの簡易実行と出力をする関数
run::Show a => Parser a -> String -> IO ()
run p input =
    case parse p "hoge" input of
        Left err -> 
            putStr "parse error at" >> print err
        Right x  -> print x
```

## Text.Parsec.Char
文字のパーサが定義されている。

### oneOf
任意の文字列kを設定し、パース対象の文字列から一文字受け取り、文字列kのどれか一文字に一致したらパースを成功させる

```
run (oneOf "abc") "aaa" --  'a'がパースされる 
run (oneOf "abc") "bac" --  'b'がパースされる
run (oneOf "abc") "zabc" --  パース失敗
```

### noneOf
任意の文字列kを設定し、パース対象の文字列から一文字受け取り、文字列kのどの文字にも一致しなければパースを成功させる

```
run (noneOf "abc") "aaa" --  パース失敗 
run (noneOf "abc") "bac" --  パース失敗
run (noneOf "abc") "zabc" -- 'z'がパースされる
```

## Text.Parsec.Prim
パーサの実行など、パーサの基本的な操作が定義されている。

## Text.Parsec.String 
String型をパースするパーサの型Parserが型シノニムとして定義されている。

## Text.Parsec.Combinator
コンビネータを定義している。
eof
文字列の終端が来たらパースを成功させる
run (char 'a') "abc" --"a"がパースされる
run (char 'a' >> eof) "abc" --パース失敗。文字列が残っている！



## charパーサ

```
--"()"をパースする
openClose :: Parser String
openClose =do
    a <- char '('
    b <- char ')'
    return [a,b]

main :: IO ()
main = do
    run openClose "()"
    print "-----------"
    run openClose "(4)"
    print "-----------"
    run openClose "(("
    print "-----------"
    run openClose "()44444"
```

実行結果

```
"()"
"-----------"
parse error at"hoge" (line 1, column 2):
unexpected "4"
expecting ")"
"-----------"
parse error at"hoge" (line 1, column 2):
unexpected "("
expecting ")"
"-----------"
"()"
```

むむむ、最後の結果には注意だ。
()44444がパースに成功している。
どうやら余った文字があったとしても成功判定になるらしい。

## \<|>コンビネータ
<|>コンビネータを使うと「または」を表現することができる。
例えばaまたはbまたはcにマッチするパーサはこう。

```
a_b_c ::Parser Char
a_b_c = char 'a' <|> char 'b' <|> char 'c'

main :: IO ()
main = do
    run a_b_c "a"
    run a_b_c "b"
    run a_b_c "c"
    run a_b_c "d"
```

実行結果
```
'a'
"-------------------"
'b'
"-------------------"
'c'
"-------------------"
parse error at"hoge" (line 1, column 1):
unexpected "d"
expecting "a", "b" or "c"
"-------------------"
```

## パーサの再帰
パーサは、自分自身を再帰的に呼び出すことができる。

```
parens :: Parser String
parens = do
    a <- char '('
    c <- parens
    b <- char ')'
    return $ a:c++[b]
    <|>
    return []

main :: IO ()
main = do
    run parens "()"
    run parens "(())"
    run parens "((()))"
    run parens ")"
    run parens "(("
```

実行結果
```
"()"
"-------------------"
"(())"
"-------------------"
"((()))"
"-------------------"
""
"-------------------"
parse error at"hoge" (line 1, column 3):
unexpected end of input
expecting "(" or ")"
"-------------------"
```

# この記事はどんどん追記していきます！！
《JavaScript》ある値を現在の範囲から新しい範囲における値に変換する。

Processingの `map()` 関数が欲しかったのでJavaScriptで自前で実装しました🍟


## スクリプト


`map(value, fromMin, fromMax, toMin, toMax)` というようにパラメータを渡して、`value` を `fromMin-fromMax` から `toMin-toMax` に対応する値に変換します。

```js:map.js
/**
 * 新しい範囲における現在の値を、現在の範囲を元に変換して返す
 * map(a, b, c, d, e)	aを範囲b-cから別の範囲d-eへ変換する
 * @param value {Number}
 * @param fromMin {Number} 変換前の最小
 * @param fromMax {Number} 変換前の最大
 * @param toMin {Number} 変換後の最小
 * @param toMax {Number} 変換後の最大
 */
const map = (value, fromMin, fromMax, toMin, toMax) => {

  let result = 0;

  result = (value <= fromMin)
    ? toMin : (value >= fromMax)
      ? toMax : (() => {

        let ratio = (toMax - toMin) / (fromMax - fromMin);
        return (value - fromMin) * ratio + toMin;

      })();

  return result;

};

console.log(map(5, 0, 10, 0, 100));  // 50
console.log(map(-20, 0, 10, 0, 100));  // 0
console.log(map(2000, 0, 10, 0, 100));  // 100
```

ちょっと言語化するのが難しいですが、結果を見てもらうとわかると思います。




## なにに使う？

CSSの値を異なる単位やプロパティ同士で連携(アニメーション)させる時に、よく使っています。

例えば、1回転(360deg)させるアニメーションと、100px移動するアニメーションの現在地の更新を簡単に実装することができるので、コードの見通しや計算の手間を省くことができます。



おわります。
Jupyter-tensorboardの紹介とKerasから使ってみる

# Jupyter-tensorboardの紹介とKerasから使ってみる
Jupyter Notebookに統合されたTensorboardの紹介です。
https://github.com/lspvic/jupyter_tensorboard

ディープラーニングのモデル開発をする際、ひろく使われる開発インターフェイスがJupyter Notebookです。
加えてディープラーニングのフレームワークとして頻繁に使われる2強がTensorflowとKerasだと思います。
Keras自体がTheanoやTensorflowをカバーするハイレベル・ライブラリのため、実質Tensorflowが使われているのですが、TensorflowにはTensorboardという便利なウェブアプリケーションがあります。
Jupyter-tensorboardはJupyter上でTensorboardを起動することができるプラグインです。

![101.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/ad994b50-1802-1956-c870-a2a2d85d5951.png)


インストール方法は簡単で、`pip install`で導入できます。

```bash
pip install tensorflow tensorboard keras jupyter-tensorboard
```

## Kerasからでも使える
Kerasは従来からTensorboardで可視化することができますが、もちろんJupyter-tensorboardでも使えます。
簡単にMNISTのモデルをJupyter-tensorboardで表示したいと思います。
プログラムは以下ですが、"!!ここ追加!!"とある部分を追加するだけでTensorboardを使うことができるようになります。

```python
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop

batch_size = 128
num_classes = 10
epochs = 20

# the data, shuffled and split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(num_classes, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer=RMSprop(),
              metrics=['accuracy'])

# !!ここ追加!!
tb_cb = keras.callbacks.TensorBoard(log_dir="tflog/", histogram_freq=1)
cbks = [tb_cb]

history = model.fit(x_train, y_train,
                    batch_size=batch_size,
                    epochs=epochs,
                    verbose=1,
                    validation_data=(x_test, y_test),
                    callbacks=cbks)　# !!ここ追加!!

score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

```

MNISTの学習を開始すると、"tflog/"ディレクトリにログが蓄積されていきます。
Jupyterの画面でこのディレクトリを選択し、Tensorboardを選択することでJupyter-tensorboardを起動することができます。

![102.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/64dce40d-33fc-b258-3c05-94f712d5cf65.png)


あとはTensorboardそのままに使うことができます。

![103.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/29c440a5-afc8-b0dd-a17a-236ba6cffd1d.png)
Google Play App Signing

# 内容

- 準備：APK 署名の仕組み
- いままでとこれから
  - いままで：app signing key の自己管理
  - これから：Google Play App Signing で管理
- 作業手順
- やってみる

****
# APK の署名
- 端末に APK をインストールするためにはデジタル署名が必要です。
- Android システムが署名を検証します

****
# 仕組み
- 開発者は pub/priv key-pair を保持
  - apk を priv key で署名
  - apk に pub key を添付（公開鍵証明書）
- Andorid は apk に添付された公開鍵証明書で署名を検証
- 署名が valid ならアプリを上書き更新

***
# 詳細
- META-INF/CERT.SF
  - 各リソースパスとその SHA1 が含まれたファイル
- META-INF/CERT.RSA
  - CERT.SF を署名したファイル（公開鍵も含む）
  - これを使って署名検証

> openssl pkcs7 -inform DER -in scene/META-INF/CERT.DSA -noout -print_certs -text

*** 
# 用語
- app signing key: アプリの署名に使う priv key のこと
- keystore: priv key のバイナリ形式

****
# 何を防ぎたいか
- APK の改竄
- 開発者としての証明
  - ⇒ 他者アプリの上書きインストールの禁止

***
# 防いでないこと
- app signing key 保持者の信頼性
  - 証明書は自己発行
- 新規インストール時のアプリの信頼性

***
# いままで

*** 
# app signing key の自己管理
- keystore (priv key) は自己管理
- 紛失すると apk が二度とアップデートできない

***
# 図解
<img src="https://developer.android.com/studio/images/publish/appsigning_selfmanagediagram_2x.png">

ref: https://developer.android.com/studio/publish/app-signing.html

***
# これから：

*** 
# Google Play App Signing
- Google に app signing key を預ける
- メリット
  - Google の最高セキュリティレベルで管理される
  - 鍵を紛失する心配をしなくていい
  - Google が署名できるので配布時に最適化可能

***
# 図解
<img src="https://developer.android.com/studio/images/publish/appsigning_googleplayappsigningdiagram_2x.png">
ref: https://developer.android.com/studio/publish/app-signing.html

*** 
# 注意点など
- 取り消せない
 
***
# Step1: 利用規約に同意
- Play Console を開く
- Google Play App Signing の利用規約に同意する

***
# Step2: App Signing Key のアップロード
- Google の提供ツールで app signing key 自体を暗号化
- Play Console からアップロード

***
# Step3: アップロード鍵の登録
- アップロード用の鍵（keystore）をローカルで生成
- 公開鍵証明書を Play にアップロード
- APK アップロード時にはこのアップロード鍵（keystore）を使う

***
# アップロード鍵について
- revoke 可能
- 再発行可能（ただし手続きはかなり厳重）

***
# やってみる
- 実際にやってみる
【Hadoop】mapred.map.tasks？mapreduce.job.maps？似たパラメータで悩んだときに見るページ

hiveのパラメータチューニングしてて様々なパラメータがある上になんか似たパラメータがあってどっちを設定すればいいかわからん！！
というなることが度々あります。

似たパラメータというのはだいたいhadoopのバージョンが上がることでパラメータの名前が変わっただけというのが多いです
。


https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/DeprecatedProperties.html

ここのドキュメントを見れば新旧のパラメータ名が書かれているのでどっちを設定すべきか。っていうのがわかるかと。

古いパラメータを指定すると自動的に新しいパラメータ名で設定されるようなのであまり気にしなくてもいいかもですが、ある日（バージョン）を堺にその古いパラメータ名はいっさいサポートしないってなることもあるのでなるべくそのバージョンに合ったパラメータ名で設定するようにしたいです。

そんな感じです。
Cognos Content Storeで既にLDAPから削除されたユーザーのコンテンツを掃除する

#概要
Cognos BIやAnalyticsの環境で、エンドユーザーに自由にレポートの作成や保存を許可している環境では、「個人用コンテンツ」 or 「マイ・フォルダー」には、各ユーザーの個人的なレポートやパッケージなど、各種コンテンツが色々と存在していると思います。
これらのコンテンツは、実はContent Storeのテーブルの中に保持されていて、ディスク容量を使っています。
もし、このユーザーが退職や異動等で、認証ソース(LDAP等)から削除されても、実はこのコンテンツはContent Storeに残っていて、永遠にゴミとして残ります。
Content Storeの容量を小さく保つ事は、Cognos全体のパフォーマンスの観点でも、バックアップ時間短縮の観点でも重要ですので、これらの残存コンテンツを消しましょう、という話です。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/3c3d97e9-c9f8-5697-a90d-01f3661c00de.png)

#手順
前述のcoguser3以外にも、coguser2が存在して、個人用コンテンツを保持している環境です。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/f7a94abd-0273-81e3-4d8d-a085b7edb499.png)

今回は、coguser3が退職で、LDAPから削除されたというシナリオです。

システム管理者でログインし、「管理」→「管理コンソール」でCognos Administrationを起動します。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/f3f19c71-f6c3-0faf-9fac-8ef9262baf93.png)

「設定」タブの「コンテンツ管理」から、図のアイコンのプルダウンで「整合性チェックを新規作成」を選択します。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/8a752f1c-5b12-2068-6dbb-5fe7b0a628f3.png)

任意の名称を付与し「次へ」。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/85436b14-4a78-5008-4067-7882e978eed4.png)

「外部ネームスペースへの参照」をチェックし、「すべてのネームスペース」をチェックして「次へ」。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/fec2d89b-d4cd-9858-17d1-ebcf697392d1.png)

この画面でモードに「検索して修正」をチェックし「実行」。
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/da5b00c2-5042-0463-fa73-9befe4a81b04.png)

成功時に以下のようなメッセージでcoguser3が削除された事がわかります。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/70bfc190-a654-3aac-e8a9-c4c058c2c3ed.png)

確認のため、もう一度LDAPにcoguser3を作成して、Cognosにログインします。
![009.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/c82c8348-9581-8bd3-109d-e604f77903d7.png)

ばっちり、coguser3は個人用コンテンツがきれいに消されています。
![010.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/03f7451f-c1f2-abe4-21f0-81cf6fcb7693.png)

coguser2の個人用コンテンツは健在です。
![011.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/debdaa96-6511-5b2b-95d5-dc3965e2c948.png)

という感じです。
ユーザー数が大きく、レポートの作成等をエンドユーザーに解放している環境では、時々気にして実施して頂けると良いと思います。

#参考
**How to remove old users from the Content Store in Cognos Analytics 11.**
http://www-01.ibm.com/support/docview.wss?uid=swg22001773

**How to remove old Users from the Content Store**
http://www-01.ibm.com/support/docview.wss?uid=swg21474185
Marketplace にある AWS WAF Rule

Marketplace にある AWS WAF Rule Group の料金など(2017/12/12)
それぞれRule Groupが一つ追加され、ACLへ組み込むことで利用できるらしいです。
実際にどんなルールが含まれているかは説明されていません。
その時々で最新ルールを適用してくれるらしいです。

現在Marketplaceから取得できるRule Groupについてまとめました。

# Alert Logic
## Virtual Patches for WordPress
直近6ヶ月のWordpress, Wordpress pluginの脆弱性に関するルールが含まれている。6ヶ月以上経過したルールは自動で削除される。
#### 料金
|Rule Group|Request|
|---|---|
|$14/Region/Month|$0.6/million requests|

# Fortinet
## Malicious Bots
#### 料金
|Rule Group|Request|
|---|---|
|$5/Region/Month|$0.5/million requests|

## SQLi/XSS
#### 料金
|Rule Group|Request|
|---|---|
|$15/Region/Month|$1.0/million requests|

## General and Known Exploits
上2つ以外って感じかな？
#### 料金
|Rule Group|Request|
|---|---|
|$20/Region/Month|$1.5/million requests|

## Complete OWASP Top 10
Fortinet完全版な感じかな？
#### 料金
|Rule Group|Request|
|---|---|
|$30/Region/Month|$1.8/million requests|

# Imperva
## IP Reputation on AWS WAF
#### 料金
|Rule Group|Request|
|---|---|
|$40/Region/Month|$0.4/million requests|


## Wordpress Protection
#### 料金
|Rule Group|Request|
|---|---|
|$30/Region/Month|$0.6/million requests|

# Trend Micro
PCI DSS適合を謳っている
## Content Management System (CMS) 
#### 料金
|Rule Group|Request|
|---|---|
|$5/Region/Month|$0.2/million requests|

## WebServer (Apache, Nginx)
#### 料金
|Rule Group|Request|
|---|---|
|$5/Region/Month|$0.2/million requests|

# TrustWave
## CMS Virtual Patches
#### 料金
|Rule Group|Request|
|---|---|
|$15/Region/Month|$0.9/million requests|

## ModSecurity Virtual Patching 
WebApplication用
Adobe, Apache, Microsoft products, SAP などなど。
#### 料金
|Rule Group|Request|
|---|---|
|$10/Region/Month|$0.8/million requests|
ElasticBeanstalkでクロスゾーン負荷分散されない問題の解決【AWS】

## EB環境を気軽に使い捨てしたい

本番環境からCloneしているのに上手く動くor動かないの分岐があり、悩んでいました。
本腰入れて調べたところ、クロスゾーン負荷分散がうまくいっていないようでした。
ap-northeast-1aにインスタンスが立つとInServiceになるけど、1cに立つとならない、みたいな。

「おかしいな、EBのクロスゾーン負荷分散オプションはチェック入れてるのにな。」

そう思って、自力解決を諦め、AWSのサポートに連絡したところ、無事解決したのでメモしておきます。

いやぁ。AWSのビジネスサポートは解答が的確で助かります。ほんの少しのコストでプロフェッショナルがサクっと問題解決してくれるかとおもうとありがたいですよね。

## クロスゾーン負荷分散に関するオプション設定は2ヶ所ある
2ヶ所ある、というと正確な表現ではないかも。

要は、**EB側の設定**と、**ELB側の設定**があり、今回でいうとEB側しか出来ていなかったということです。

ELB側の設定は、EBコンソールの 設定 > VPC > 「アベイラビリティーゾーンの ELB インスタンスと EC2 インスタンスに対しては異なるサブネットを選択します。」配下から行えます。

ここでチェックの入っているAZにしかルーティングされないよということでした。そんな設定あったんか~い！しらんかった~！

## おわりに
EBについてはだいたい把握してるつもりだったんですが見事にハマりました。
Bussinessサポートはいっててよかった~！（感謝の宣伝）

まあでも、ロギングちょっと弱いよな~とは思いますよね。EB。
Gitのコミットログを綺麗にする

# はじめに
こちらはDMM.com #1 Advent Calendar 2017 19日目の記事です。
前日の記事は@rinnkisiさんの[初心者が明日から使えるLinuxコマンド【簡易編】](https://qiita.com/rinnkisi/items/46b5e251c079c5d36835)でした。
カレンダーのURLはコチラ
- [DMM.com #1 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/dmm)
- [DMM.com #2 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/dmm2)

就職するまでGitを使ったことすらなかった新卒が、コミットログを気にするようになったので書くことにしました。

# コミットログを綺麗にするとは:question:
簡単に言うと無駄なコミットを作らないことです

無駄なコミットとは主に`FIX lint`や`FIX typo`のような実装後の修正にあたる部分です
またaddし忘れたファイルを追加するだけのコミットもなるべく避けるようにします

利点としては~~自己満足できることです~~
__どのような変更がどこで起きたのか追いやすくなることです__

# どうやってやるの:question:
コミットログを綺麗にする方法は大きく分けて2つあります

1. `git commit --amend`を使用する
2. `git rebase -i`を使用する

それぞれ例を出しながら紹介していきます

## `git commit --amend`を使用する

このコマンドは直前のコミットを上書きするコマンドです
直前のコミットメッセージの修正時にも使用します

ここではhogeという機能の実装時にaddし忘れたファイルがある場合を例にします
例

```shell
$ git add aaa.php
$ git commit -m 'hogeを実装'
$ git log --oneline
f1e76na hogeを実装
```

ここでaddし忘れたbbb.phpをaddします

```shell
$ git add bbb.php
$ git commit --amend --no-edit
$ git log --oneline
g2mt37a hogeを実装
```

直前のコミットの書き換えが成功しました:relaxed:
`--no-edit`を使用して`--amend`時に立ち上がるエディターを立ち上げないようにしています
コミットメッセージを書き換える必要のないときには付けておくといいです

逆にコミットメッセージだけを書き換えたい場合は
`$ git commit --amend -m 'fugaを実装'`
とします

## `git rebase -i`を使用する
`git commit --amend`で直前のコミットが書き換えられるようになりました
しかし、2つ以上前のコミットの書き換えるにはどうするのか？
そこで使用するのが`git rebase -i`です

`git rebase -i`を実行するとエディタが立ち上がり対話的にコミットを整理することができます
基本的な構文は`git rebase -i <commit-ish>`です

ここではブランチでの作業が終わりプルリクを出す前にコミットログをまとめる場合を例にします

```shell
$ git log --oneline
c45aa0f (HEAD -> aaa) fooの実装
258dcd3 FIX:typo
d17250a fugaの実装
099e3b1 (master) hogeを実装

$ git rebase -i master
pick d17250a fugaの実装
pick 258dcd3 FIX:typo
pick c45aa0f fooの実装

# Rebase 099e3b1..c45aa0f onto 099e3b1 (3 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#                (以下略)
```

`git rebase -i`を実行すると上記のようになります
`Commands:`以下に書かれていることが重要です
それぞれのコミットの左に`pick`と書かれている部分を`reword`や`edit`などに書き換えてコミットを整理していきます

今回は`FIX:typo`というコミットをその前のコミットにまとめます
コミットメッセージを変える必要はないので`fixup`を使用します

```shell
$ git rebase -i master
pick d17250a fugaの実装
fixup 258dcd3 FIX:typo　　#　⬅️ここをfixupに
pick c45aa0f fooの実装
```

書き換えたらエディタを閉じます

```shell
$ git log --oneline
684fcf4 (HEAD -> aaa) fooの実装
158530a fugaの実装
099e3b1 (master) hogeを実装
```

無駄なコミットがなくなりました:relaxed:

これで皆さんもレビュアーが喜んでくれるプルリクを作れると思います:clap:


明日は@szynさんのTable definition as Codeを実現するflagonを作ったお話です！
( ᐛ )σ「render: h => h(App) 」

```js:vue-cli/weboack-simple/main.js
new Vue({
  el: '#app',
  render: h => h(App)
})
```

vue-cliでwebpack-simpleテンプレートを利用すると見かける記述ですが、
なんじゃこりゃ、と思った人は私の他にもいるでしょう。
いませんか。

これが

```js
render: function (createElement) {
    return createElement(App);
}
```

こうなって

```js
render (createElement) {
    return createElement(App);
}
```

更にこう

```js
render (h){
    return h(App);
}
```

最後、アロー関数に

```js
render: h => h(App)
```

`h` は*hyperscript*のことだそう。

>[Explanation for `render: h => h(App)` please](https://github.com/vuejs-templates/webpack-simple/issues/29)
PHPで文字列中のアルファベット（半角英字）のみを削除する

調べても無かったので方法を記載しておきます。

# 環境
PHP 7.2.0

#方法
[preg_replace](http://php.net/manual/ja/function.preg-replace.php)と正規表現を使用します。

```
php > $str = "Appleが好き";
php > echo preg_replace('/[a-zA-Z]/', '', $str);
が好き
```
Togetterでキーワード検索をしてもツイートが出てこない場合のまとめ方法

* 2018/01/29追記：トゥギャッター株式会社がNTTデータ提供の検索APIを使用することになったとアナウンスがあったことで、今記事のような「あるはずのツイートが出てこない」現象は少なくなると思われます。 https://twitter.com/togetter_jp/status/957812833609170944
* 2019/06/27追記：トゥギャッター公式のChrome拡張機能がリリースされたようです。こちらを使うのも良いでしょう https://twitter.com/togetter_jp/status/1143723761679519745
    * [Twitterまとめサイト“トゥギャッター”、公式Chrome拡張「Togetter Clip!」をリリース - 窓の杜](https://forest.watch.impress.co.jp/docs/news/1192825.html)

Toggetter（トゥギャッター）でツイートまとめを作成する際、ハッシュタグ等でキーワード検索をしますが、直近多くのツイートがあったにも関わらず検索が全くヒットしない場合があります。

![スクリーンショット 2017-12-12 15.29.19.png](https://qiita-image-store.s3.amazonaws.com/0/8760/14cac42b-643c-4ef9-560a-bc8220ac3aac.png)

「RTを除く」であるとか「日本語のみ」のオプションを外して広域に検索しても同様の場合があります。

「[Twitter公式ウェブ](https://twitter.com/)、Twitter公式アプリでの検索はひっかかるんだけど…」という場合は、**Twitter が提供している [REST API](https://developer.twitter.com/en/docs/api-reference-index) の制限もしくは不具合の類**であることが考えられます。Togetter も（たぶん）これを使って内部的にツイートを検索しているからです。

この場合、どうやって Togetter でツイートをまとめるとよいでしょうか。

# ツイートURLをTogetterに読ませる方法

上記キャプチャ画面にも見られますが、Togetter のまとめ画面には![TogetterのURLボタン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8760/537bf369-e119-5e15-ebb1-93963c953d60.png)というボタンがあり、このボタンを押すと**ツイートのURLを指定して一括読み込み**が行えます。



- 2019/05/23追記：「ツイートのURLを指定して一括読み込み」ボタンのデザインが ![スクリーンショット 2017-12-12 15.37.02.png](https://qiita-image-store.s3.amazonaws.com/0/8760/24db4a03-eee9-5f7e-2c06-e9f2d459b82a.png) から ![TogetterのURLボタン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8760/537bf369-e119-5e15-ebb1-93963c953d60.png) に変更になっています。記事のその他のスクリーンショットは当時のままとなっています


![スクリーンショット 2017-12-12 15.37.49.png](https://qiita-image-store.s3.amazonaws.com/0/8760/6b091deb-0cfe-1474-1fba-5c02d201c462.png)

あとはTwitter公式ウェブから検索して引っかかった個別ツイートのURL群をここに貼り付ければよいことになります。

# Twitter公式ウェブの検索画面からツイートURLを抜き出す

「一つずつ右クリックしてリンクURLをコピー」といった原始的な方法はツイート数が多くなればなるほど現実的ではないでしょう。もちろんここは Qiita なので簡単なプログラミングで解決しましょう。「何も設定されていない Google Chrome があるだけ」という状態であれば、デベロッパーコンソールに簡単な JavaScript を入力するのが簡単です。

まずはTwitterの検索で「すべてのツイート」を選択した状態で、読みたいツイートが出尽くすまで下にスクロールします。あまりに多すぎる場合にはうまくいかない場合もあったり、Twitter の検索機能の制限などでこちらでも出てこない場合があります。

![スクリーンショット_2017-12-12_15_40_55.png](https://qiita-image-store.s3.amazonaws.com/0/8760/98658724-4e4a-de5a-11d4-0c7ab67fa715.png)

この状態で Google Chrome であれば「デベロッパーツール」「JavaScriptコンソール」を開き、JavaScriptが入力可能な状態にします。

そこで

```javascript
urls=""; $("a.tweet-timestamp").each((idx, el)=>{urls+=el.href+"\n"}); urls;
```

と打つことで、ツイートURLが抜き出せます（2017年12月現在）。

![スクリーンショット_2017-12-12_15_51_37.png](https://qiita-image-store.s3.amazonaws.com/0/8760/f5081176-9f94-dbb7-1eba-7741ee8eef38.png)

やることの方針は以下のような感じ。

* 個別ツイートへのリンクは tweet-timestamp クラスを持った a 要素となっているので、それを指定するCSSセレクタは `a.tweet-timestamp` となり、その href 属性の値をひたすら集めれば良いことになる
* Twitter公式ウェブでは jQuery を読み込んでいるので、`$("a.tweet-timestamp).each(...)` といったショートカットが書ける

もちろんこの仕様は2017年12月現在のTwitter公式ウェブです。もし、年月が経って仕様が変わっている、このテクニックを応用したい場合は、日付文字列がリンクになっているツイートURLリンク部分を右クリックして「検証」を選択してみると、HTMLの該当部分がデベロッパーコンソールで表示されるので、色々とヒントが得られます。

![スクリーンショット 2017-12-12 16.04.21.png](https://qiita-image-store.s3.amazonaws.com/0/8760/494508aa-f4a2-5e6c-3ccb-2c960e6bbb5e.png)
関取について調べてみた


遅くなってすいません

これは、 [Livesense - 関 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/livesense-kan)  12日目の記事です。

こんにちは、体調が良くなく絶賛家庭内パンデミック中のパッソルです

関と聞いて関取が真っ先に思い浮かんだので、関取について調べてみました

## 関取とは

関取というのは、大相撲の力士全員を表す呼称なのかと思ったらそうではなく、大相撲の階級の内、十両以上の力士のことだそうです

リストにすると

* 横綱
* 大関(三役)
* 関脇(三役)
* 小結(三役)
* 前頭 <-- ここから上が幕内
* 十両 <-- ここから上が関取
* 幕下
* 三段目
* 序二段
* 序ノ口
* 番付外

となっているそうです。

関取になるまでは給料もなく(部屋に住み込みなので、衣食住はある）、一場所に取る取り組みの数が少なかったりで一人前ではないと言われているようです。厳しい世界ですね

関取について調べていたら力士のことが気になって来たので、検索出来るようにプログラムを書いてみました

## 成果物について

![Qiita_Test.gif](https://qiita-image-store.s3.amazonaws.com/0/27670/aab982a7-1bf7-38cd-b4d3-65f9de8c7e00.gif)

* https://rubygems.org/gems/sekitori-search

RubyGems に登録しています(Ruby 2.1.0以降です)

### 軽く説明


* 検索が出来ます

```sh
$ ./sekitori search [word]
```

* -dを付けると完全一致でwikipediaへ飛びます

```sh
$ ./sekitori search -d [word]
```

* -aを付けると幕下まで対象になります

```sh
$ ./sekitori search -a [word]
```

### 今後もし改善するとしたら

以下のような改善をした方がいいかな？と思っています

* Ruby 2.0.0でも動くようにする
* デフォルトは現役力士だけで検索するようにする
* -aオプションで、引退した力士を含めた検索にする
* -dオプションのリンクを正確にする
* ふりがなでも検索できるようにする
* etc...


個人的には、ターミナルで検索出来るようになったので概ね満足です

[小ネタ] Azure Portal のヒミツ - 其の壱

#はじめに
Azure Portal の、どうでもいい小ネタです。
#手順
Azure Portal を開いたら、おもむろに何もブレードなどが表示されていないところをダブルクリックしてみましょう！
<img width="475" alt="004pr.png" src="https://qiita-image-store.s3.amazonaws.com/0/199379/1c03f014-4e20-b6f8-704e-95df1222686b.png">
#結果
色が変わるよ！！
<img width="475" alt="004r.png" src="https://qiita-image-store.s3.amazonaws.com/0/199379/5a441686-d4c9-d160-73cd-d999396c38a0.png">
<img width="475" alt="005r.png" src="https://qiita-image-store.s3.amazonaws.com/0/199379/529fbc80-8932-8908-794f-09b6b0e80b86.png">
<img width="475" alt="006r.png" src="https://qiita-image-store.s3.amazonaws.com/0/199379/856f2c4d-2c1a-0c5b-0fe2-efe814e3e050.png">
<img width="475" alt="007r.png" src="https://qiita-image-store.s3.amazonaws.com/0/199379/a9bf9c19-d83d-11f7-2daf-272129a55872.png">
#まとめ
以上！！！
[ios]iosで縦線を表現する

下記の画像のようなUIを再現したいと考えた時に、「横線はTableViewをうまく加工すればできそうだけど、縦線ってどうすれば・・」と思い、調べたらUIViewのwidthを１pxにした上で、heighを表現したい長さに設定すれば、OK。
https://pin.it/z673zlrnkh7p54
http://llcc.hatenablog.com/entry/2015/10/07/233450
scpコマンドで最新のファイルをリモートから転送

リモート側の特定のディレクトリにあるファイルのうち、
最新のファイルをローカルにコピーしたかった。

※ リモート側には作成日がファイル名に含まれるファイルが存在するが、
　作成した日にscpするとは限らなかったので、システム日付からはコマンドを生成できなかった

```
$ fname=`ssh hoge.jp 'ls -1t /home/hoge/data/current/table_*.tsv|head -n 1'` 
$ scp hoge.jp:${fname} ~/Downloads
```

きっとまた同じことを調べるんだろうなぁと思ってここに残しておきます。

一旦、下書きに書いて再度眺めると、もしかしたら1行で書けるの？
と思ったが、それは後々確認します。
Faust : 初めてのVSTプラグインを直列にしてみた

参考にしたページ

+ [Faustの基本文法解説](https://matsuuratomoya.com/blog/2017-01-07/faust_grammer/)
+ [Faust Libraries](http://faust.grame.fr/library.html)
+ [Faust Online Compiler](http://faust.grame.fr/onlinecompiler/)


[前に作ったプラグイン](https://qiita.com/ttatsf/items/0a24ec3fc411fcde021e)がけっこういい感じで使えたので、もっと便利になるよう改造してみました。

音質を変えずに中域を約2ms、高域を4周期遅らせるディレイなのですが、直列にしてスライダーで遅延量を調整できるようにしてみました。
今までは必要な数だけ挿入していたのですが、いろんな設定を簡単に試せるようになってさらに便利になりました。

```Java:
declare name "APFDelaySeq";

import("maxmsp.lib");

APFSt(F,Q) = APF(_,F,0,Q),APF(_,F,0,Q);

APFDelay = APFSt(250,1.5):APFSt(700,4.5):APFSt(1250,6.3):APFSt(1600,15);

bypassIfZero( x, y, n ) = (  x, y : ba.bypass2( n==0, APFDelay ) ), max( 0, n-2 ) ;

process= _, _, hslider( "Mid Delay[unit:ms]", 2, 2, 24, 2 ) 
		: seq( i, 12, bypassIfZero) 
		: _, _, ! ;

```
![スクリーンショット 2017-12-12 14.39.52.png](https://qiita-image-store.s3.amazonaws.com/0/61597/4273e5f2-269b-1ac1-7b92-268cd8227466.png "スクリーンショット 2017-12-12 14.39.52.png")

以下、試行錯誤してみた感想。

+ スライダーの値によって動的にブロックが生成できるといいなと思ったんだけど、さすがにそれは無理なよう。コンパイル時に数が決まってないといけないみたい。
+ あと、条件によってブロックの中味がごっそり変わるとかも同様に無理なのかも。

+ 機能を変更する時は、必要そうなブロックを全部配置して、ルーティングで工夫する感じかな?

違ってるよ、とか、もっとこんなやりかたがあるよ、とかありましたらコメントおねがいします。

## ※追記
引数を省略した場合、後に追加されるそうな。今思い出した。

```Java:
declare name "APFDelaySeq";

import("maxmsp.lib");

APFSt(F,Q) = APF(_,F,0,Q),APF(_,F,0,Q);

APFDelay = APFSt(250,1.5):APFSt(700,4.5):APFSt(1250,6.3):APFSt(1600,15);

bypassIfZero( n ) =  max( 0, n-2 ),  ba.bypass2( n==0, APFDelay )  ;

process=  hslider( "Mid Delay[unit:ms]", 2, 2, 24, 2 ), _, _ 
		: seq( i, 12, bypassIfZero) 
		: !, _, _ ;
```
![スクリーンショット 2017-12-12 17.01.26.png](https://qiita-image-store.s3.amazonaws.com/0/61597/0776f1db-3819-8f02-4848-b0e7d2416e09.png "スクリーンショット 2017-12-12 17.01.26.png")
同じものですけどちょっとすっきり。読み易いかはまた別。
プロセスがメモリ使ってないけどサーバのメモリが枯渇してしまった際の教訓と反省

## 結論:

偉大な先人が地雷を踏み抜いていてくれた。

[プロセスのメモリ使用量が少ないのにメモリ使用量が増加していた時に調査、対応したこと](https://dev.classmethod.jp/cloud/aws/dentry-cache/)

解決策なども詳細に書かれているので同じことを書く必要性を感じないので省きます。

現象としては`ps`コマンドなどでメモリの使用量を確認したが特にメモリを圧迫するようなプロセスは見当たらないのに間違いなくメモリの使用量が圧迫されていました。
実際には`slab`の消費量がとんでもないサイズになっており、これがメモリを圧迫していたということになります。

## 当初の推測
当初アプリケーション側の実装でメモリリークしているか、アプリケーション側でキャッシュしているデータサイズが`解放される量` < `蓄積される量` になってしまっており圧迫しているのか？と考えていました。

実際、インスタンス立ち上げ後から徐々にメモリの使用量が増加傾向にあり、ここ最近はほぼ横ばいであったことから急激なメモリ枯渇ではなく緩やかなメモリ枯渇だと考えたからです。

## 反省点:

`top`コマンドと`free`コマンドでメモリの使用量などは確認していたのですがプロセスが使用しているメモリ量に問題がないことが明らかだったため`/proc/meminfo`を確認することを省いてしまいました。
これこそが今回の障害の原因に気づくのが遅れた最大の原因であり、反省点です。

プロセスのメモリに問題がないから`/proc/meminfo`をみても同じだろうと思い、省略してしまい何か別の原因があるのだと思いこんでしまいました。

「推測するな、計測せよ！」の原則はどのようなときでも行わなければいけませんね。

## 教訓
障害対応時は愚直さこそが正義。
きちんと調べるべきことを調べて計測した結果のみにフォーカスする。
推測は最後の手段。
wedding photography

Wedding photography can't avoid being photography of activities related to weddings. it incorporates photographs of the couple before marriage and extent of the wedding and reception.It is an <a href="https://www.zoompo.com/wedding-photographers-in-angamaly-kerala/">best wedding photographers in angamaly</a> essential branch of business photography.Two fragments of photography is dynamic now,indoor photography at church,temple ,private place in the midst of administration and assembling and outside photography at park,beaches etc.There are a wide arrangement of accumulations and produces are open and picture takers may give standard tangled albums,contempary albums,scrapbook albums.As wedding <a href="https://www.zoompo.com/wedding-photographers-in-kottayam-kerala/">best wedding photographers in kottayam </a> is one time event,photographers must be set up for the unexpected.Communication and organizing timetables before the event will diminish the tension related with photography of weeding.
filemaker-ruby のご紹介

# filemaker-ruby
FileMaker の API を利用する方法については[昨年の Advent Calendar でも書き散らしましたが](https://qiita.com/advent-calendar/2016/filemaker)[^1]、いくつかの方法があります。メンテナンスの現状やそれを利用する言語などを検討すると、2017年ならば **filemaker-ruby** を使うのがモダンかと思います。

[mech/filemaker\-ruby: A Ruby wrapper to FileMaker XML API](https://github.com/mech/filemaker-ruby)

この **filemaker-ruby** は、FileMaker の API のうち、XML方式 の API を Ruby でラップしたものです。

# 使い方
使い方は README に網羅されていますが、実際のコードを見たほうが早いと思います。ここでは単純に「レコードを検索する」コード例を紹介します。

# 使うための準備
コード例を見る前に、とにもかくにもまずは filemaker-ruby をインストールしておかなければいけません。

```bash
$ gem install filemaker
```

# 分割したコード例（レコードの検索を例に）
コード例はいくつかに分割して掲載します。そして最後にそれらをつなぎあわせます。

#### 1. filemaker-ruby を require する
まず filemaker-ruby を require しないと始まりません。

```ruby
require 'filemaker'
```

#### 2. FileMaker Server に接続するための基本設定を行う
FileMaker Server への接続情報を以下のようにして定義しましょう。`fm_server`の中に接続情報が詰め込まれています。

```ruby
fm_server = Filemaker::Server.new do |config|
  config.host         = '10.10.10.100'
  config.account_name = 'your_account_name'
  config.password     = 'your_password'
  config.ssl          = { verify: false } # SSLを用いる場合はtrueを指定します
end
```

#### 3. 「データベース名」と「レイアウト名」を指定する（準備をする）
後ほど「データベース名」と「レイアウト名」を使用する場面が出てきますので、ここでそれらを変数に押し込めておきます。

```bash
db_name = '顧客データ'
layout_name = '性別一覧'
```

#### 4. レコードを検索する
ここまでできたならばレコードを検索することは簡単です。以下のようなメソッドを実行するとレコードの検索ができます。

```ruby
results = fm_server.database[db_name].layout[layout_name].query('性別': ['男'])
```

上記の例では、以下の順に頭からメソッドチェーンをしています。

- FileMaker Server の定義
- データベース名を `database[データベース名]` で定義
- レイアウト名を `layout[レイアウト名]` で定義
- `query` メソッドで検索条件を定義

したがってこの例では以下のような条件で検索をしていることになります。

- `10.10.10.100` にある FileMaker Server に
- ユーザー名は `your_account_name`
- パスワードは `your_password`
- 上記のユーザー名とパスワードで接続し
- `顧客データ` というデータベースの
- `性別一覧` というレイアウトにおいて
- `性別` というフィールドが
- `男` であるレコードを
- 検索する

そして上記の結果は `results` に格納されます。レコードは複数個ヒットする可能性があります。

# 結合したコード例（レコードの検索を例に）
前項のコードを結合すると以下のようになります。このコードのファイル名を `fm_ruby_practice.rb` としましょう。

```ruby:fm_ruby_practice.rb
require 'filemaker'

fm_server = Filemaker::Server.new do |config|
  config.host         = '10.10.10.100'
  config.account_name = 'your_account_name'
  config.password     = 'your_password'
end

db_name = '顧客データ'
layout_name = '性別一覧'

results = fm_server.database[db_name].layout[layout_name].query('性別': ["男"])
```

あとはこれを実行するだけです。

```bash
$ ruby fm_ruby_practice.rb
```

これで `results` に検索結果が格納されました！[^8]

# 検索結果を取り扱うために
一つの記事に多くを詰め込み過ぎると読む気が無くなると思います[^2]ので、検索結果をどう取り扱うか、についてはこの記事では省略します[^3]。

注意することは、上記例の `results` には複数のレコードが格納されていることです[^4]。個別のレコードを扱う場合には、`results` を「バラして」から[^5]扱う必要があります。

「バラした」あとのレコード[^6]からフィールドの値を取り出す方法は、例えば、「バラした」レコードが `result` という変数に格納されているとすると、`result.性別` というメソッドによって「性別」フィールドの値が返ってきます[^7]。

[^1]: 一人で大暴れしてすいませんでした……
[^2]: と思っています
[^3]: 後日書くかもしれません
[^4]: Filemaker::Resultset クラスのオブジェクト
[^5]: Filemaker::Record クラス のオブジェクトにする
[^6]: Filemaker::Record クラス のオブジェクト
[^7]: 日本語をメソッドの名前としてそのまま使えてしまう
[^8]: 出力まわりのコードは書いていないため、見た目にはただ実行しただけとなります
UnityでNuGetパッケージを使う方法

Unityで作るアプリを拡張する際、NuGetのパッケージを遅かれ早かれ利用する必要が出てくるので、その方法の覚書となります。

#前提条件

全てのC#ライブラリが使える訳ではないので、Mono対応であることが前提です。.NET2.0用のライブラリが用意されていればほとんどの場合利用できます。

#NuGetパッケージのダウンロード

[NuGetパッケージのサイト](https://www.nuget.org/packages/)に行って欲しいライブラリを検索し、そのページに行きます。

そのページに Manual download というボタンがあるはずなので（2017年１２月現在）、そのリンクをクリックします。

<img width="210" alt="Screen Shot 2017-12-12 at 14.56.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/42909/e72a91b7-28e9-a9c3-865a-0157232a05a3.png">

すると.nupkg拡張子がついたファイルがダウンロードされます。


#NuGetパッケージの解凍

.nupkgは実際のところ.zipファイルなので、zip解凍ソフトで展開できます。一度.nupkgを.zipにリネームしておくといいかもしれません。

#Unityにいれる

あとは、解凍された中にあるlibフォルダの中のバージョンのあった各種dllをUnityのPluginsフォルダに入れればこれで使えます（*あくまでMonoに対応しているdllのみ*）
desktop calendars


Visual computerization is the procedure of visual correspondence and critical thinking. Visual creators are one who plans the visual communication and they speak to their thoughts through pictures and images. Creators sort out pages and alternatively include realistic pages. They <a href="http://www.chennikkara.com/"> Desktop calendars</a> require relational abilities to persuade the group of onlookers and offer their plans. The fundamental imperative factor of configuration is technique for presentation.Inorder to pass on your interesting messages and in addition mirror your one of a kind character visual computerization benefit give a promising part. Everybody who is having a site and online business utilize the advantages of visual communication.
App Store の予約注文とは？

App Store でアプリの予約注文機能が提供されました！
https://developer.apple.com/app-store/pre-orders/

ザッと翻訳してまとめたので
もし間違いなどがあればご指摘いただけると助かります。

# <b>概要</b>
iTunes Connect でレビュー用のアプリとメタデータを送信すると、
すべてのAppleプラットフォーム上で予約注文を利用できるようになります。
リリース日は2日〜90日後を選択することができます。
アプリがリリースされるとユーザに通知され、24時間以内に自動的にダウンロードされます。


## <b>対象のアプリ</b>
App Store で公開されたことのない新しいアプリは、予約注文の対象となります。
既に公開されたことがあるアプリ（他の国などを含む）は予約注文の対象外となります。


# <b>プロダクトページ</b>
アプリの予約注文が可能になると、リリース予定日が表示された限定ページが App Store で公開されます。
App内課金を提供するアプリの場合は、事前予約中はApp内課金のプロモーションは表示されません。


# <b>ユーザからはどう見えるか</b>
ユーザはプロダクトページ、検索結果からアプリを予約注文することができます。
また、アプリがフィーチャーされていれば Today, ゲーム, アプリタブからも予約注文することができます。
リリース日に予約注文をリクエストしたデバイスと
自動ダウンロードが有効になっている他のデバイスに自動的にダウンロードされます。
また、アプリが利用可能になったお知らせが通知されます。

有料アプリを先行予約したユーザは、アプリがリリースされるまでは請求されません。
アプリの価格が事前予約中に変更された場合は、予約注文時の価格とリリース時の価格の安い方の価格が適用されます。
ユーザは App Store の設定や iTunes の設定から予約注文をキャンセルすることができます。
予約注文は iOS 11.2, tvOS 11.2, macOS 10.13.2以降の端末でおこなうことができます。
予約注文のプロダクトページは上記以前のOSを利用しているユーザでも、リンクからアクセスすることができます。
ただし、購入ボタンは無効になっており、最新のOSバージョンにアップデートしてアプリを予約注文するように促されます。

## 予約注文のレポート
Sales and Trends からアプリの予約注文の掲載結果をトラッキングできます。
そこで 注文済み、キャンセル済み、ネット予約済の注文数を確認できます。

# <b>マーケティング</b>
Webサイト、メーリングリスト、SNSアカウントなどのマーケティングチャネルを使用して、
閲覧者が App Store にアクセスしてアプリを予約注文できるようにします。
たとえば、「App Storeで先行予約」など明確な行動を促すフレーズを含めて、プロダクトページへの直接リンクを提供します。

プロダクトページにリリース予定日が表示されますが、この日付が変更される可能性がある場合はアナウンスすることをおすすめします。
アプリを事前予約しているユーザには、Appleからは日付の変更が通知されないので、この変更を伝える必要があります。
同様に AppStoreから予約注文を削除する必要がある場合は、ユーザに知らせるメッセージングを準備する必要があります。

リリース日にマーケティング資料をすべて更新し、AppStoreのダウンロードバッジを更新しましょう。

## ダウンロードバッジについてはこちら
https://developer.apple.com/app-store/marketing/guidelines/jp/#downloadOnAppstore
Actions on GoogleのSimulatorで複数のProjectを切り替える

Projectを2つ作ってみたところ、その切り替え方法がわからなかったので、バッドノウハウ的なやり方をメモ。

「テスト用アプリにつないで」と話しかけることで1つしかプロジェクトが立ち上がらず困っていたので、トリガーワードでプロジェクトが立ち上がらないようにしてとりあえずの解決となった。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/102757/0a44e82f-e080-e785-abf4-c633dea1067f.png)

**右上のデバイスっぽいボタンをクリック**し、"Testing on Device"を切り替え、Disabledに変更する。

もっとスマートに切り替える方法あるよって方いらっしゃったら教えてください。
Intel MKLをWindows+CMake+MinGWで使用する方法

Intel MKL (Math Kernel Library) をWindows + CMake + MinGWで使用する方法です。英語圏でも情報が見つからなかったので、ここにメモします。この方法で JetBrains CLion では関数名の補完も効き、Ctrl + Q で関数の簡単なヘルプも出ます。

## 試したバージョン

- Intel MKL 2017.4.210
- MSYS2, gcc 7.2.0 (64ビット)
- JetBrains CLion 2017.3
- Windows 10

## CMakeLists.txt に追記する物

MyApp は自分のアプリ名。

```
include_directories("C:/Program Files (x86)/IntelSWTools/compilers_and_libraries/windows/mkl/include")
link_directories("C:/Program Files (x86)/IntelSWTools/compilers_and_libraries/windows/mkl/lib/intel64")

target_link_libraries(MyApp mkl_rt)
```

## 環境変数PATHに追記する物

```
set "PATH=C:\Program Files (x86)\IntelSWTools\compilers_and_libraries\windows\redist\intel64\mkl;C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2017.4.210\windows\redist\intel64\compiler;%PATH%"
```
WordPressをルートディレクトリ以外にインストールすると、SiteGuard WP Pluginの管理ページアクセス制限が動かなくなる

WordPressはそのままの設定だと[ブルートフォース攻撃](https://ja.wikipedia.org/wiki/%E7%B7%8F%E5%BD%93%E3%81%9F%E3%82%8A%E6%94%BB%E6%92%83)などに脆弱なため、対策が必要になります。
色々なプラグインがあるのですが、その中でも「[SiteGuard WP Plugin](https://www.jp-secure.com/siteguard_wp_plugin/)」は国産で無料かつ設定もわかりやすいので個人的に気に入っています。

…ただ、WordPressをルートディレクトリ以外にインストールすると管理ページアクセス制限が動かなくなってしまうようです。

※管理ページアクセス制限とは、ログインしていないユーザーには管理ページ（/wp-admin/）へアクセスさせなくするSiteGuard WP Plugin独自の機能です

# 動作環境
以下がWebサイトのURLだとして、
http://example.com/

実際には以下のURLにWordPressをインストールしているような場合です。
http://example.com/wp/

※WordPressをルートディレクトリ以外にインストールする方法は、以下公式サイトを参照
[WordPress を専用ディレクトリに配置する](http://wpdocs.osdn.jp/WordPress_%E3%82%92%E5%B0%82%E7%94%A8%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AB%E9%85%8D%E7%BD%AE%E3%81%99%E3%82%8B)

# 対処方法
「/wp/.htaccess」が生成されているはずなので修正します。
※ルートディレクトリではなく「/wp/」配下です

以下のような感じになります。

```apache
#SITEGUARD_PLUGIN_SETTINGS_START
#==== SITEGUARD_RENAME_LOGIN_SETTINGS_START
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /wp/
    RewriteRule ^wp-signup\.php 404-siteguard [L]
    RewriteRule ^wp-activate\.php 404-siteguard [L]
    RewriteRule ^login_12345(.*)$ wp-login.php$1 [L]　# ここを修正
</IfModule>
#==== SITEGUARD_RENAME_LOGIN_SETTINGS_END
#==== SITEGUARD_ADMIN_FILTER_SETTINGS_START
```

↓

```apache
#SITEGUARD_PLUGIN_SETTINGS_START
#==== SITEGUARD_RENAME_LOGIN_SETTINGS_START
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /wp/
    RewriteRule ^wp-signup\.php 404-siteguard [L]
    RewriteRule ^wp-activate\.php 404-siteguard [L]
    RewriteRule ^login_12345(.*)$ /wp/wp-login.php$1 [L]
</IfModule>
#==== SITEGUARD_RENAME_LOGIN_SETTINGS_END
#==== SITEGUARD_ADMIN_FILTER_SETTINGS_START
```

※「login_12345」は環境によって異なります

# 解説
元々は、
http://example.com/wp/login_12345
にアクセスしたらログイン用phpファイルである
http://example.com/wp-login.php
を実行する動作になっています。

が、WordPressのインストールディレクトリを変更しているせいで上記ファイルが見つからなくなってしまいます。
そのため、WordPressインストール先の
http://example.com/wp/wp-login.php
を指定するようにしています。
コンテナで機械学習を動かすKubeflow

# コンテナで機械学習を動かすKubeflow
KubernetesでオーケストレートされたDockerコンテナでTensorflowを動かすKubeflowというツールがGithubに上がっていました。
https://github.com/google/kubeflow

ためしに動かしてみました。

## Kubeflowとは
KubeflowはKubernetesで機械学習を動かすためのスケーラブルでポータブルな環境を提供します。
目的は"to provide a straightforward way for spinning up best of breed OSS solutions"とのことですので、OSSで機械学習基盤を実現するシンプルな構成を提供するというものだと思います。
Kubeflowには以下が含まれています。
- JupyterHub
- Tensorflow Training Container
- Tensorflow Serving

というわけで、モデル開発（JupyterHub）、学習（Tensorflow Training Container）、推論（Tensorflow Serving）まで、機械学習に関わる一連の機能を提供しています。
これらをDockerコンテナとKubernetesのymlで提供しているので、すぐ使い始められてスケーラブルも簡単、というものです。

## 早速動かしてみる
早速動かしてみます。
Kubernetesを構築後（ここが一番たいへんでは？）、`git clone`してKubernetesから起動します。
具体的には以下のコマンドで構築可能です。

```bash
git clone https://github.com/google/kubeflow.git

cd kubeflow/
kubectl apply -f components/ -R
```

![0.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/c6e15216-2aaf-7159-cfa5-fd1a0d9e2bb2.png)


`kubectl get svc,pods,rs,deployment,role,rolebinding`で起動されているものを確認すると以下が表示されます。

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/1f3c00fe-4740-7bb4-dfd7-9ab582fa0275.png)


なんかいろいろ動いていますが、ひとまずJupyterHubにアクセスしてみます。

JupyterHubの初期ログインユーザ／パスワードは任意です。好きなユーザとパスワードがそのままユーザとパスワードになります。

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/08afdd65-98f2-f4e0-1bca-29416dd992b3.png)


![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/ed2e7086-7804-31e3-88b9-472b6d83f56a.png)

ユーザとパスワードを設定すると同時に、このユーザのJupyterHubに割くリソースを設定します。

![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/ca6ac1a3-d39e-684c-856e-c4e095b8c56a.png)

どうもユーザ／パスワードを設定することで新たにpodsを起動しているようです。

![6.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/de52c996-2706-cfaf-08bf-61f7ab198cd6.png)


ユーザ用JupyterHubの起動には少々時間がかかりますが、正常起動するとJupyterHubのログイン後画面が表示されます。

![7.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/6d4f0170-9e7d-49e0-21c2-036f3e1c213a.png)


ディレクトリがいくつかありますが、.ipynbは`tensorflow-models/samples/outreach/blogs/housing_prices.ipynb`しか見つけられませんでした。

![8.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/75888014-1b3b-838c-5028-cb529fd56736.png)

なお、.pyのサンプルはたくさんありますが、どう動かすのかはよくわかりません。
JupyerHubで動かすわけではなさそうですし、どうするのでしょうね（笑）

## tf-controllerのサンプル
JupyterHub以外にも、tf-controllerのサンプルが`kubeflow/tf-controller-examples/tf-cnn/`ディレクトリにあります。
https://github.com/google/kubeflow/tree/master/tf-controller-examples/tf-cnn

こちらにはkube jobsがいろいろ用意してあり、`kubectl create`で実行可能です。

```bash
cd kubeflow/tf-controller-examples/tf-cnn/
kubectl create -f tf_job_cpu.yaml
```

CPU用とGPU用が用意されています。
現時点（2017年末）で[KubernetesからGPUアクセスするのはまだα機能](https://qiita.com/cvusk/items/5a6f57876fdcff7710d2)ですが、今後正式版になっていくのでしょう（期待）
`kubectl get svc,pods,rs,deployment,role,rolebinding,jobs`で確認すると、更にいろいろ起動していることがわかります。

![9.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/8ded82b1-0eb9-78e7-23b9-dfb18ca3751c.png)


jobsとしてマスターとワーカーとパラメータ・サーバが起動していて、Resnet50の学習が動いているようです。

![11.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/dfbafd6c-b71d-74cd-3890-288faaf1b793.png)



## 今後に期待？
まだドキュメントが少なく、まともに動かせていませんが、機械学習やディープラーニングとコンテナは相性が良いと思うので、今後発展していくと期待しています。
appetize.ioを使ってネイティブアプリのビルドをブラウザ上で動かす

[appetize.io](https://appetize.io) という、Web上でネイティブアプリを動かせるサービスがある。一時期ReactNativeの公式ドキュメントからもリンクされていたのでご存知の方も多いはず。100分/月・最大同時接続数2までの範囲であれば無料で使うことができる。実際に使ってみるまでの手順を紹介する。

### 前準備: トークンの取得
https://appetize.io/signup からアカウントを作ったあと、 https://appetize.io/docs#request-api-token にメールアドレスを入力してAPIトークンを申請する。

### apkのアップロード
```shell
curl https://APITOKEN@api.appetize.io/v1/apps \
  -F "file=@file_to_upload.apk" -F "platform=android"
```

これだけ。注意点としてはapkは署名されている必要がある。

### コード例

あまりにあっさりと終わってしまったので、もう少し現実っぽい例として、commitごとに走るCIから最新版ビルドをappetize.ioにアップロードするようなサンプルを作ってみた。

https://github.com/daisy1754/ReactNativeQiitaReader

```javascript
const fs = require('fs');
const request = require('request');

request.post({
  url: `https://${KEY}@api.appetize.io/v1/apps`,
  formData:  {
    platform: 'android',
    file: fs.createReadStream('android/app/build/outputs/apk/app-release.apk'),
  }
}, function (err, res, body) {
  if (err) {
    throw new Error("Failed to upload apk", err);
  } else {
    console.log(`App is succeesfully uploaded!`);
    console.log(JSON.parse(body).publicURL);
  }
});
```
のようにapkをアップロードすればよい。例ではAndroidアプリを対象としたが、iOS版でも同様。

実際にアップロードされたapkは以下のURLから試すことができる。
https://appetize.io/app/99dpadte3vjmcn2z0ngqkrhg4g?device=nexus5&scale=75&orientation=portrait&osVersion=7.1


### fastlaneとの連携
Android/iOSアプリ開発まわりの自動化ツール[fastlane](https://github.com/fastlane/fastlane)はappetize.ioにも[バッチリ対応](https://github.com/fastlane/fastlane/blob/master/fastlane/lib/fastlane/actions/appetize.rb)していて、こちらを使うのも良さそう。githubでのPRに対応して作成したビルドをappetize.io上で動かすような例が[Fabricのブログで紹介されていた](https://fabric.io/blog/fastlane-updates-powerful-prs-enhanced-deployment)。
nmcliによる teamd + vlan + bridgeのNetwork設定

# サマリー
Fedora/CentOSを再セットアップした際にbondingからteamdに設定を変更したため、
その際のメモを記録する
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/networking_guide/sec-Configure_teamd_Runners

# 設定
```
## 既存設定が残っていた場合を考慮して削除
nmcli connection delete br-vlan1
nmcli connection delete team0.1
nmcli connection delete team0
nmcli connection delete team0-slave-enp0s25
nmcli connection delete team0-slave-enp7s0
nmcli connection delete enp0s25
nmcli connection delete enp7s0

## teamdを用いてteam0を作成
## LACP利用
## eth+l3(src/dst ipv4,ipv6)+l4(src/dst-port)による分散
nmcli connection add type team con-name team0 ifname team0 config '{"runner": {"name": "lacp", "active": true, "fast_rate": true, "tx_hash": ["eth", "l3", "l4"]}, "link_watch": {"name": "ethtool", "delay_up": 1000, "delay_down": 1000}}'
nmcli connection modify team0 ipv4.method disabled
nmcli connection modify team0 ipv6.method ignore
nmcli connection modify team0 802-3-ethernet.mtu 9000

## 物理Interfaceをteam0に従属させる
nmcli connection add type team-slave autoconnect yes ifname enp0s25 master team0 con-name team0-slave-enp0s25
nmcli connection add type team-slave autoconnect yes ifname enp7s0 master team0 con-name team0-slave-enp7s0

## VLAN1をteam0に追加(team0.1)
nmcli connection add type vlan ifname team0.1 con-name team0.1 dev team0 id 1
nmcli connection modify team0.1 802-3-ethernet.mtu 9000

## bridge interface(br-vlan1)を作成
nmcli connection add type bridge ifname br-vlan1 con-name br-vlan1
nmcli connection modify br-vlan1 bridge.stp no
nmcli connection modify br-vlan1 ipv4.address 192.168.1.60/24
nmcli connection modify br-vlan1 ipv4.gateway 192.168.1.250
nmcli connection modify br-vlan1 ipv4.dns 127.0.0.1
nmcli connection modify br-vlan1 ipv4.dns-search 0nyx.net
nmcli connection modify br-vlan1 ipv4.method manual
nmcli connection modify br-vlan1 ipv6.dns ::1
nmcli connection modify br-vlan1 ipv6.dns-search 0nyx.net
nmcli connection modify br-vlan1 ipv6.method manual
nmcli connection modify br-vlan1 802-3-ethernet.mtu 1500

## team0.1にbr-vlan1を従属させる
nmcli connection modify team0.1 connection.master br-vlan1 connection.slave-type bridge
nmcli connection up br-vlan1

```

# 確認コマンド
```
nmcli connection show team0
teamdctl team0 config dump actual
teamdctl team0 state      #summary
teamdctl team0 state -v   #detail
teamdctl team0 state dump #JSON format
```
Android Layoutに関するまとめ　メモ

# 概要

数年ぶり(2017年12月現在)にAndroid開発をすることになりました。
当時はEclipseの時代でしたが、色々変わってることが多々あり、
現状のベストプラクティスを模索しています。
今後自分がAndroidの開発をしていく上で調査した内容などを個人的な見解でまとめます。
この記事はlayoutに特化していきます。

関連記事
[Android開発まとめ　個人メモ](https://qiita.com/hadasui/items/6ef4c6138f365bf908dd)

# Layoutメモ

## 枠線をつける

``` frame.xml(定義)
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <stroke android:width="1dp"
        android:color="@color/gray"/>
</shape>
```

```layout.xml(利用側)
android:background="@drawable/frame"
```
drawableに定義して backgroundで指定する。

## Couldn't resolve resource @id/visible が出る

https://stackoverflow.com/questions/41303347/couldnt-resolve-resource-id-visible-when-using-textinputlayout

``` strings.xml 
<resources>
    <item name="visible" type="id"/>
    <item name="masked" type="id"/>
</resources>
```
values/配下のどこでもいいので上記の設定を入れる。
nw.jsをとってもSimpleに使ってみる（簡易版）

# NW.js をとりあえず動かす

## これはなに？

なるはやで NW.js を使ってみる。余計なことは言わない。
ほぼほぼ自分用のメモなのですがせっかくなので共有。

## 手順
どうにかして Node.js をインストールする。
コンソールで下記コマンドを実行。
わたしはWindows環境なのでGitbashのコンソール使ってます。

```
npm install -g nw
```

すこし時間がたってコンソールが復帰したら、適当なエディタを使って下記内容の ``package.json`` を作る。

```package.json
{
	"name": "application name",
	"main": "index.html",
	"version": "1.0,0"
}
```

次に``index.html``を作る。

```index.html
<html>
    <head>
        <title>hello world</title>
    </head>
    <body>
        <button onclick="alert('hello');">Say Hello</button>
    </body>
</html>
```

下記コマンドを実行する。

```
nw
```

アプリがたちあがる。ボタン押すと "hello" と出る。
おしまい m__m

## 小技

### console.log をターミナルに出す

```
nw --enable-logging=stderr
```
LASの論文まとめ

[Listen, Attend and Spell](https://arxiv.org/pdf/1508.01211.pdf)を読んで理解したことを綴っていく

(**未完成、随時更新しまつ**)

### **LASの概要**
Listen, Attend and Spell(LAS)は、音声の音素を文字に変換するニューラルネットワークである。LASは主に、Listener(聴く者)とSpeller(綴る者)の二つの構成要素をもつ。 Listenerはピラミッド型リカレントネットワークのエンコーダであり、入力としてfilter bank spectraを受け取る。Spellerはattention-based型リカレントネットワークのデコーダであり、文字を出力する。文字間の独立推定をすることなくLASは、文字列を出力することができる。

###**introduction**
"triple a"といったフレーズを考えると、モデルは"triple a"と"aaa"を生成する。CTCのようなモデルはフレーム間の独立推定を行ってしまうために、同じ音素で構成された文を生成する際、問題が起きてしまう。

エンコーダのピラミッド構造がない場合、ニューラルネットのトレーニングが遅くなり、一ヶ月でも終わらなくなり、エラーの割合がとても高くなる。なぜなら、音響信号にはRNNの学習を遅くする要因となる非常に多くのノイズが存在するためである。

LASのグーグル音声タスクに置けるWERは、辞書や言語モデルを用いない場合、14.1%となった。言語モデルを使用した場合、LASは10.3%のWERを達成した。比較対象としてグーグルの世界最高精度であるCLDNN-HMMシステムは、同じデータセットを用いて8.0WERを達成した。

### **Model**
このセクションでは、入力として音響信号の特徴を受け取り英語の文字を出力するLASについて解説する。入力として、$x = (x_1,...,x_T)$のフィルタバンク特徴量列を与え、出力として文字列$\vec{y} = ((sos),y_1,...,y_S,(eos)), y_i \in (a,b,c,...,z,0,...,9,(space),(comma),(period),(apostrophe),(unk))$を排出する。ここで、(sos)と(eos)は、特別な記号であり、文の始まりと終わりをそれぞれ表している。

書く文字の出力$y_i$を以前の文字$y_{<i}$と入力信号の条件付き確率を求めることを目的とする。
    $P(y|x) = \prod_{i} P(y_i|x, y_{<i})$
LASのListenは、二つの構造でできている。listenerとspellerである。listenerは音響モデルのエンコーダであり、主な動作は「聴く」ことである。spellerは、文字のデコーダであり、主な動作は音響モデルを「処理し綴る」ことである。Listenerは、入力信号をより高級なベクトル$h=(h1,...,h_U)$ with $U<T$へと変換することである。一方で、Spellerは、