OmniAICreator/Qiita-1.07M huggingface dataset:
remの使用について追記

Bootstrapのドキュメント[container](http://v4-alpha.getbootstrap.com/layout/overview/)のサンプルコードに、divのサイズにrem単位を使うらしい。

[MDN](https://developer.mozilla.org/ja/docs/Web/CSS/Length)を調べると、
remは、
>ルート要素（html)のfont-size

と説明しているが、外国語の資料によると、ルート要素を基準値にした相対単位だそうだ。
html要素のfont-sizeは１０pxとすれば、
1rem=10px
2.5rem=25px
3rem=30px

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="../jquery-3.2.1.min.js"></script>
    <link href="../css/bootstrap.min.css" rel="stylesheet">
    <script src="../js/bootstrap.min.js"></script>
    <style>
        div.container{
            min-width: 16rem;
            max-width: 30rem;
            margin-right: auto;
            margin-left: auto;
        }
        .container-header{
            height: 3rem;
            margin-bottom: .5rem;
            background-color: #daeeff;
            border-radius: .25rem;

        }
        .container-sidebar{
            float: right;
            width: 4rem;
            height: 8rem;
            background-color: #fae3c4;
            border-radius: .25rem;

        }
        .container-body{
            height: 8rem;
            margin-right: 4.5rem;
            background-color: #957bbe;
            border-radius: .25rem;
        }

        html{
            font-size:10px;
        }
     

    </style>
</head>
<body>
これはサンプルです。
<div class="bg-container container">
    <div class="container-header">これは使用方法のサンプルです。これは使用方法のサンプルです。</div>
    <div class="container-sidebar"></div>
    <div class="container-body"></div>
</div>
<div class="bg-container-fluid container-fluid">
    <div class="container-header"></div>
    <div class="container-sidebar"></div>
    <div class="container-body"></div>
</div>

</body>
</html>
```

htmlを１０ｐｘと設定してみれば、divの大きさが確定されるが、文字のfont-sizeは14pxで、bodyの初期値じゃないかと考えて、divのfont-sizeを１emと設定する。


```html
<style>
html{
font-size:10px;
}
div{
font-size:1rem;
}
</style>
```
でdivブロックに何文字分入れるかを把握することはできる。
特に文字の大きさに関しては、htmlのfont-sizeを基準にしたい場合、remで再設定する必要があり、設定しないと、htmlの初期値ではなく、その上の父の要素のfont-sizeの初期値になるかと考えられる。
Terraformのoutputでmapを利用する方法

# やること
Terraformのoutputでmapを利用する

# なにが嬉しいか
module間で値を受け渡す時のoutputの定義が短くなる

## Befor: 冗長的なoutput
```:output側の定義
output "vpc_id" {
  value = "${aws_vpc.vpc.id}"
}

output "public-a" {
  value = "${aws_subnet.public-a.id}"
}

output "public-c" {
  value = "${aws_subnet.public-c.id}"
}

output "private-a" {
  value = "${aws_subnet.private-a.id}"
}

output "private-c" {
  value = "${aws_subnet.private-c.id}"
}
```

```:moduleから呼び出す時
module "compute" {
  source = "../../xxx"

  vpc_id     = "${module.xxx.vpc_id}"
  public-a   = "${module.xxx.public-a}"
  public-c   = "${module.xxx.public-c}"
  private-a  = "${module.xxx.private-a}"
  private-c  = "${module.xxx.private-c}"
}
```


## After: mapを使ったoutput
outputの際にvalueの値に `"${map("key", "value")}"` を入れることでmapとして利用可能になる。

```:output側の定義
output "vpc" {
  value = "${
    map(
      "vpc_id",           "${aws_vpc.vpc.id}",
      "subnet-public-a",  "${aws_subnet.public-a.id}",
      "subnet-public-c",  "${aws_subnet.public-c.id}",
      "subnet-private-a", "${aws_subnet.private-a.id}",
      "subnet-private-c", "${aws_subnet.private-c.id}"
    )
  }"
}
```

```:moduleから呼び出す時
module "compute" {
  source = "../../xxx"
  vpc = "${module.xxx.vpc}"
}
```

**スッキリ！！**

## 参照方法
ちなみに以下のようにlookupでkeyを指定することでvalueを参照出来る。

```:.tf
subnet_ids = ["${lookup(var.vpc, "subnet-private-a")}"]}
```
ITの世界に迷い込んだ文系の成長記録。

今日も頭がパンクしそうでした。

今日学習した単語
HTML、CSS、ゲートウェイ、API、RAM

今日は研修の一環で初めてプログラミングをしたのですが、HTMLとCSSという怪物達に心を折られそうになりました。いや、折れました。

これから地道に投稿を続けたいと思います。
GitHubリポジトリの言語比率


Githubのトップに表示されている以下のバーはそのリポジトリに於ける言語比率を表していて、バーをクリックすると内訳が表示される

![ss_20170426_191917.png](https://qiita-image-store.s3.amazonaws.com/0/112602/782cad89-f85e-74b7-ad5b-9e4003704cbf.png)

![ss_20170426_191925.png](https://qiita-image-store.s3.amazonaws.com/0/112602/94137336-a4e1-32fc-e532-03442306ce9c.png)

各言語をクリックするとリストが表示される

![ss_20170426_191906.png](https://qiita-image-store.s3.amazonaws.com/0/112602/13e4e33b-5ba0-e80c-865b-5ade1fa08e90.png)

### 更新されるタイミング

デフォルトブランチに push されたタイミング
https://help.github.com/articles/about-repository-languages/
`Language statistics will update after you push changes to your default branch`

後に述べるように、自作したルールやファイルの移動が反映されるかどうかを確認したい場合には

1. 作業用ブランチを作成
2. 作業用ブランチをリモートに push
3. Settings → Branches → Default branch を変更
4. 作業用ブランチに変更を加える
5. リモートに push

すると更新されて表示が変更される
デフォルトブランチを切り替えただけだと反映されないので注意

### 何の比か

Linguist というOSSで計測しているが、このOSSはGithubの`List languages`APIを叩いている
https://github.com/github/linguist

`List Language` の仕様に書かれているがここで表示されている言語の比率は**バイト比**になっている
https://developer.github.com/v3/repos/#list-languages
`The value on the right of a language is the number of bytes of code written in that language.`

Java から Kotlin への置き換えをしている時などに目安にしているのだが、Java に比べて Kotlin はコード量が少なくて済むため進捗に比べてバーが伸びていかない事がある


### 対象ディレクトリ

ノイズによって意図しない言語が混在する場合には Linguist のドキュメントにあるように、元々除外されているディレクトリに格納するか、自分でルールを記述する
`If you see files that you didn't write, consider moving the files into one of the paths for vendored code, or use the manual overrides feature to ignore them.`

除外されるディレクトリ
https://github.com/github/linguist/blob/master/lib/linguist/vendor.yml

リポジトリルートの`.gitattributes`にルールを記述する
https://github.com/github/linguist#overrides

### 参照
http://qiita.com/yuku_t/items/15888c95e32f43e6c830
[MySQL]コマンドだけで、HTML形式のテーブル定義書を作成する

こんにちは。
ER図もテーブル定義書もない。
取り急ぎ、テーブル定義書だけでも欲しいよー。
ということで、 **コマンドだけでテーブル定義書** を作成してみます。

# 前提
mac, もしくはlinuxで実行します。

# テーブル
ユーザーとその嗜好を保持するテーブルを作りました。

```sql
mysql> CREATE DATABASE mamy1326;
Query OK, 1 row affected (0.00 sec)

mysql> USE mamy1326;
Database changed

mysql> CREATE TABLE m_user (
    ->   user_id bigint unsigned NOT NULL AUTO_INCREMENT,
    ->   family_name varbinary(100) NOT NULL COMMENT '姓',
    ->   first_name varbinary(100) NOT NULL COMMENT '名',
    ->   birth_day date NOT NULL COMMENT '生年月日',
    ->   PRIMARY KEY (user_id)
    -> ) COLLATE utf8mb4_bin;
Query OK, 0 rows affected (0.02 sec)

mysql> CREATE TABLE wishlist (
    ->   wishlist_id bigint unsigned NOT NULL AUTO_INCREMENT,
    ->   user_id bigint unsigned NOT NULL COMMENT 'ユーザーID',
    ->   item_name varbinary(100) NOT NULL COMMENT '欲しい物の名前',
    ->   created_at datetime NOT NULL COMMENT '作成日',
    ->   FOREIGN KEY(user_id) REFERENCES m_user(user_id),
    ->   PRIMARY KEY (wishlist_id)
    -> ) COLLATE utf8mb4_bin;
Query OK, 0 rows affected (0.02 sec)

```


# 概要
xml形式でdumpしたcreate tableのDDLに、xslでスタイルを指定し、html化します。
xslファイルは自力またはどこかから拝借する必要がありますが、基本的にコマンドのみで完結します。

# お手本
[私と私の猫の他は誰でも隠し事を持っている](http://mariyudu.hatenablog.com/)さんの
[続・MySQL データベースからテーブル定義書を生成する](http://mariyudu.hatenablog.com/entry/2015/02/01/200517)
をお手本とさせて頂きました。感謝！

# 手順

## 1.以下のコマンドでDDLを出力

```
$ mysqldump --no-data --xml -u root -p mamy1326 > mamy1326.xml
```

## 2.スタイルを用意
お手本のサイトで公開されている、以下のページの右テキストボックスから拝借致しました。
[MySQL テーブル仕様書メーカー](http://mysql-doc.mariyudu.net/)
サンプルとしても十分すぎるスタイルでしたので、そのまま使わせて頂いてます。
デザイン変更する場合は適宜、編集してください。

## 3.スタイルをファイル保存
「2.」で取得したXSLTを、 ```style.xsl``` として保存します。
今回はGitHubに公開したので、cssファイルのURLをhttpsに変更しています。

## 4.以下のコマンドを実行し、htmlファイル出力

```
$ xsltproc -o mamy1326_tables.html style.xsl mamy1326.xml
```

# 利用方法
普通のHTMLファイルなので、ローカルからブラウザで実行します。
HTMLファイルダブルクリックでも、ブラウザURLから ```file:///Users/mamy1326/mamy1326_tables.html``` などでもいいと思います。

今回作ったもろもろは以下に公開しています。
https://github.com/mamy1326/create_mysql_tables_doc

直接ページで確認したい場合は[こちら](https://mamy1326.github.io/create_mysql_tables_doc)

# 課題
サクッと作れると定義のチェックにもなるので、シェルで一発作成しとくといいかもですね。

# ご注意
やらないと思いますが、HTMLだからといってカジュアルにどこぞのドキュメントルートに置いて公開しないようにお気をつけください。
普通に機密情報ですからね！
Voided Purchases APIを呼んでみる（Google Play Developer API）

#0.はじめに
Google Playでの返金ポリシー変更に伴い、返金リクエストを行ったユーザーをアプリ提供者が知るためのAPI（Voided Purchases API）が追加されまたのでとりあえずOAuthでこのAPIを叩いてみたメモ

Google Play での返金についての新しい API とポリシーのお知らせ
https://developers-jp.googleblog.com/2017/04/google-play-new-api-policy.html

#1.APIアクセスの設定
- Google Play Console https://play.google.com/apps/publish/ にアクセス
- 設定 -> APIアクセス と進む
- 初めての場合はAPIプロジェクトを作成する
- OAuthクライアントを作成をクリック
- 生成されたクライアントIDとクライアントシークレットを取得
    - クライアントシークレットはGoogle Developers Console で表示 -> 編集アイコンクリック先で確認できる

#2.ユーザーの準備
- 「ユーザーと権限」メニューを開く
- 「新しいユーザーを招待」から「注文の管理」権限のあるユーザーを作成する

#3.OAuth認証
- ブラウザで以下のURLにアクセス
 
```
https://accounts.google.com/o/oauth2/auth?client_id={クライアントID}>&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=https://www.googleapis.com/auth/androidpublisher&response_type=code&approval_prompt=force&access_type=offline
```
*client_id ： 手順1で取得したクライアントID
*scope ： 今回は```https://www.googleapis.com/auth/androidpublisher```とする
*scopeの一覧はこちらを参照 https://developers.google.com/identity/protocols/googlescopes

- 認証画面が表示されるので手順2で作成したユーザーで認証
- コードが表示される（「注文の管理」権限が無いユーザーの場合エラーになる）
- ターミナルで以下のコマンドを叩く

```
curl -k -d client_id={クライアントID} -d client_secret={クライアントシークレット} -d redirect_uri=urn:ietf:wg:oauth:2.0:oob -d grant_type=authorization_code -d code={コード} https://accounts.google.com/o/oauth2/token
```
*client_id ： 手順1で取得したクライアントID
*client_secret ： 手順1で取得したクライアントシークレット
*code ： ブラウザに表示されたコード

- 以下のようなjsonが返ってくるのでアクセストークンを確認

```
{
  "access_token" : "<access_token>",
  "expires_in" : 3600,
  "refresh_token" : "<refresh_token>",
  "token_type" : "Bearer"
}
```

#4.APIを叩く
- 以下のURLを叩く

```
https://www.googleapis.com/androidpublisher/v2/applications/{アプリパッケージ名}/purchases/voidedpurchases?access_token={アクセストークン}
```
- 以下のようなjsonが返ってくる

```
{
 "voidedPurchases": [
  {
   "kind": "androidpublisher#voidedPurchase",
   "purchaseToken": "<purchaseToken>",
   "purchaseTimeMillis": "<purchaseTimeMillis>",
   "voidedTimeMillis": "<voidedTimeMillis>"
  }
 ]
}
```
*Voided Purchases API https://developers.google.com/android-publisher/voided-purchases?hl=ja

#5.おわりに
取得したpurchaseTokenをサービス側で記録している課金ログと照らし合わせてアカウントを特定すれば良さそう
フロントのモジュールバンドラー「fuse-box」を試した

fuse-boxとはwebpackやbrowserifyと同様にモジュールをバンドルするツール
https://github.com/fuse-box/fuse-box

いつも通り、こんな感じでインストールできる

```
yarn add fuse-box --dev
```

fuse.jsが設定ファイルになっているので、こちらに色々必要なプラグインなどを追加して、以下コマンド等で実行

```
node ./fuse.js
```

今回はFuseBox+Vue.jsの環境が作れる、こちらを試してみる
https://github.com/fuse-box/fuse-box-vue-seed

## インストール
fuse-box-vue-seedをcloneして、以下で実行

```
yarn
yarn start
```

こんな感じでビルドされた

<img width="362" alt=" 2017-04-25 17.04.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/168197/98c55240-6430-6938-b62d-f7700e39e785.png">

## 設定ファイルの中身
```js:fuse.js
const fsbx = require('fuse-box');

const fuseBox = fsbx.FuseBox.init({
  homeDir: 'src/',
  sourcemaps : true,
  outFile: './dist/app.js',
  plugins: [
    [
      fsbx.SassPlugin({ outputStyle: 'compressed' }),
      fsbx.CSSPlugin({})
    ],
    fsbx.TypeScriptHelpers(),
    fsbx.JSONPlugin(),
    fsbx.HTMLPlugin({ useDefault: false })
  ]
});

fuseBox.devServer('>main.ts **/*.html', {
  port: 4445
});
```

githubのREADMEにもある通り、「FuseBox loves typescript」みたいなので、
TypeScriptはほぼ設定無しで、サポートされる
リファレンスを見ると拡張子`.ts`を検出すると自動的にTypeScriptモードに切り替わり`.tsx`に変換するとある
TypeScriptHelpersでTypeScriptのヘルパー関数も追加可能

webpack2だとjsonはwebpackが内部的にロードしていたが、fuse-boxだとJSONPluginが必要っぽい
他にもロードが必要なものはpluginsの中に追加していく（webpackでいうloaderみたいなもの）

fuseBox.devServerでサーバが立ち上がる
HMRはデフォルトでサポートされており、特に設定不要（一応`hmr: false`で廃止もできるっぽい）

## 速度検証
先程のfuse.jsの中身と同じ動作をするようなwebpack.configを作った

```js:webpack.config.js
module.exports = {
  entry: [
    './src/index.html',
    './src/main.ts'
  ],
  output: {
    path: `${__dirname}/dist`,
    filename: 'app.js'
  },
  devServer: {
    port: 4445
  },
  devtool: 'source-map',
  module: {
    rules: [
      {
        test: /\.tsx$/,
        use: 'ts-loader',
        exclude: /node_modules/
      },
      {
        test: /\.html$/,
        use: 'html-loader',
        exclude: /node_modules/
      },
      {
        test: /\.scss$/,
        use: [
          'css-loader',
          'sass-loader'
        ]
      },
      {
        test: /index.html$/,
        use: 'file-loader?name=[name].[ext]'
      }
    ]
  }
};
```

厳密には同じなってない箇所があるかもしれませんが、ご了承ください。。

### fuse-box
初回ビルド
<img width="228" alt=" 2017-04-26 18.51.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/168197/f805deb6-eb9c-15d7-db4b-3fee7caf375f.png">

さっきより速いのはソースマップを変えたせい

差分ビルド
<img width="243" alt=" 2017-04-26 18.52.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/168197/a85688c0-8bc3-348b-1010-229f8023082d.png">

### webpack
初回ビルド
<img width="309" alt=" 2017-04-26 18.54.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/168197/ab020e9e-d288-6cd0-ce10-64e87046f1bf.png">

差分ビルド
<img width="297" alt=" 2017-04-26 18.55.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/168197/3a28ea88-2f8c-4432-388b-af9553156275.png">

だいぶfuse-boxの方が速いけど、app.jsのサイズが全然違う

↓webpack-dev-server外して、webpack
<img width="312" alt=" 2017-04-26 19.01.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/168197/a71789f4-afd1-4769-4886-e94a71342dff.png">

やっぱりfuse-boxだいぶ速い

## まとめ
fuse-boxはwebpackより速い
設定ファイルもシンプルに見える
今度は色々設定ファイル変えて試してみたい
tinymce-railsのバージョンを4.5系にアップデートしたらTinymceが動かなくなって嵌った件


tinymce-railsのバージョンを`4.1.6`から`4.5.6`にアップデートしたら、
本番環境でのみ`Uncaught TypeError: Cannot read property 'settings' of undefined`というエラーが出て、かなり嵌ったので備忘録として顛末を残しておく。

## tinymceのIssueを見つける
エラー名でググったら、以下のTinymceのイシューが出てきた。

upgrading to 4.4.1 causing error "Cannot read property 'settings' of undefined" #3091
https://github.com/tinymce/tinymce/issues/3091

中の人のコメントによると、これはTinymceの不具合ではなくtinymce.jsとtheme.jsのバージョンの片方が古かったり、新しかったりすると発生する問題らしい。

```
Make sure that tinymce.min.js and tinymce.js and theme.min.js and theme.js is all updated. If you run an older version of tinymce core with a newer version of theme.js this error will occur. This is not a bug in tinymce but a deployment issue where you haven't uploaded/updated all the files. If you still think this is some form of bug please reproduce it on fiddle.tinymce.com since it uses the latest tinymce core and theme.
```

## tinymce-railsのコードを読む
tinymce-railsの4.5.6のソースコードを読んでみると、どうやらtinymce.jsは4.5.6にアップデートされているがtheme.jsは4.5.4のままになっている。これが原因ぽい。

https://github.com/spohlenz/tinymce-rails/tree/master/vendor/assets/javascripts/tinymce

## tinymce-railsのリポジトリをフォークして修正する
まず、tinymceのリポジトリから4.5.6のバージョンのzipコードをダウンロードします。
https://github.com/tinymce/tinymce/releases/tag/4.5.6

これをgruntでビルドしてtinymce-railsのtheme.jsを置き換えました。
置き換えたのはこちらのファイルです。
`vendor/assets/javascripts/tinymce/themes/modern`

## フォークしたリポジトリをGemfileで読み込む

```
gem "tinymce-rails", github: "hogehoge/tinymce-rails"
```

これで`bundle update`したら直るはず...！

## でもなぜかうまくいかない
なぜか...

## 開発者ツールで読み込んでいるJSの中身を確認する
Chromeの開発者ツールの[Sources]で該当のJSファイルを見ると、開発環境・ステージング環境のJSとは本番環境は明らかに違うことが判明。どうやら古いJSを読み込んでいそう

## CDNのキャッシュが怪しい
本番環境ではステージング環境とは違い、CDNのSaasを利用していた。初期状態では1時間キャッシュを保存するようになっている。

本来ファイルの内容が変わればRailsのSprocketsがダイジェストを変えてくれて、キャッシュが無効になるはずなのだが、ここが怪しすぎるという展開に

## CDNのキャッシュを削除する
CDNサービスの管理画面からキャッシュを削除して確認したら、ついに解決！！
古いJS側がキャッシュされており、それが読まれていたのが原因ぽい。

## tinymceの不具合?
今回の不具合の原因はtheme.jsとtinymce.jsのバージョンがtinymce-rails側で差異があったこと。そして自身でtinymce-railsのtheme.jsを書き換えても、古いtheme.jsがキャッシュに残ってしまっていたことが問題だった。

中身のコードまでまだ終えていないが、tinymce-railsのバージョンを上げる時は今後もCDNのキャッシュには注意したほうが良さそう。。
【python】レイリー分布に従う乱数を生成する

分布のピークがpeakになるレイリー分布に従う乱数を生成するには，

import random
random.weibullvariate(peak,2)

が使いやすいです．

numpyでnp.random.weibullを使うときは，
randomとは微妙にパラメータが異なるみたいなので要注意です．

参考：
https://en.wikipedia.org/wiki/Rayleigh_distribution
https://docs.python.org/2/library/random.html
https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.weibull.html
【ネタ】Pythonでスレッドセーフな Sleep Sort関数 (threading編)

流行りに乗って、ソート結果を返すスレッドセーフな関数を作ってみました。
multiprocessing編とかjoblib編とか、どなたか作ってみません？

```py
from threading import Thread, Lock
from time import sleep

def sleep_sort(values):
    sorted_values = []
    lock = Lock()
    def worker(value):
        sleep(value)
        with lock: sorted_values.append(value)
    threads = [Thread(target=worker, args=(value,)) for value in values]
    for thread in threads: thread.start()
    for thread in threads: thread.join()
    return sorted_values

array = [5, 3, 6, 3, 6, 3, 1, 4, 7]
print(sleep_sort(array))
```

```text:実行結果（このスクリプトでは実行に7秒かかる)
[1, 3, 3, 3, 4, 5, 6, 6, 7]
```

参考：
2012/03/16 [スリープソートをRubyで汎用的に書いてみる。](http://qiita.com/kunimiya/items/8a5a8f60f1db6fdaf7ba)
2013/05/15 [sleep sort の解説](http://qiita.com/snsk/items/33c01951ef27bbd2b093)
2013/10/24 [手習いsleepsort](http://qiita.com/ayahito2828/items/b4346d062ec2c275e4bc)
2015/06/09 [RustとSleep sort](http://qiita.com/woxtu/items/d082adfa360943775079)
2015/06/25 [C#でスリープソート書きました](http://qiita.com/tobigitsune/items/d372d989b346dea17683)
2015/10/21 [C++の並列処理でsleep sortを実装してみた](http://qiita.com/kokoax/items/9f7632729df250ec6aa1)
2016/11/15 [Sleep Sortでマルチスレッド比較(js/TS/VB/C#/C++/D/Go/HSP(mist))](http://qiita.com/yosgspec/items/25e1a3b0694c81cd18bd)
2017/04/24 [【ネタ】Swift で Sleep Sort](【ネタ】Swift で Sleep Sort)
2017/04/24 [【ネタ】JavaScriptでSleep Sort](http://qiita.com/takustaqu/items/412d6c36534b1145a024)
2017/04/26 [【ネタ】Java で Sleep Sort](http://qiita.com/krmtyshr/items/2d2904ea29dbc3ab4644)
2017/04/26 [【ネタ】PythonでSleep Sort](http://qiita.com/nnsnodnb/items/9e6dad912926c3d25844)
2017/04/26 [sleep sort](http://qiita.com/astrsk_hori/items/8699b004ca2f337adfe4)
linuxで操作ログ取得する

OSユーザの操作ログを取得する方法

環境
---
AWS EC2 AmazonLinux

##方法１：scriptで取得


```text:profile.dを読み込む時だけ実行されるようにシェルを作成
#vi /etc/profile.d/script.sh
```


```shell-session

P_PROC=`ps aux | grep $PPID | grep sshd | awk '{ print $11 }'`
if tty -s;then
if [ "$P_PROC" = sshd: ]; then
  script -q /var/log/script/`whoami`_`date '+%Y%m%d%H%M%S'`.log
  exit
fi
fi
```
ifの分岐は無限ループ起こさないようにするためのポイント！

ログ保存用ディレクトリ作成
/var/log/script/は各ユーザが書き込めるようにパーミッション設定しておきます。

```
#mkdir /var/log/script
#chmod 777 /var/log/script
```

##方法２：pacctで取得
amazonlinuxはデフォルトでインストールされているので起動するだけ！
簡単ですね。

```text:chkconfigで起動有効
#chkconfig psacct on
```

```text:サービスstart
#service psacct start
```
ログは/var/account/pacctに溜まります。

確認コマンド

```text:ユーザのコマンド履歴が表示
#lastcomm --user **ユーザ名
例）lastcomm --user ec2-user
ls                      ec2-user pts/0      0.00 secs Wed Apr 1 1:22
```

　　



#####参考URL
---
下記サイトを参考にさせていただきました。
http://d.hatena.ne.jp/higher_tomorrow/20110330/1301435608#20110330f3
API GatewayのバックエンドでLambdaを使うときは出力形式に気をつける

API GatewayのバックエンドでLambdaを使う場合、
レスポンス形式が不正だとAPI Gatewayが `502 Bad Gateway` レスポンスを返す。

```
{
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "body": "..."
}
```

参考：
[プロキシリソースのプロキシ統合を設定する - Amazon API Gateway](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-simple-proxy-for-lambda-output-format)
[slick.js] バグ（不具合）の対策

sliderの中でも一番よく使っているpluginだけどバグ・不具合っぽいのに時折ぶつかるのでメモ。
（現時点17年4月で最新verのもので確認）

# 1.fade + autoplayで、dotをタップするとautoplayが止まってしまう
スマホの場合のみに、fadeとautoplayを設定すると、dots（ページャー）をタップした時に
autoplayが止まってしまう。

**一度この現象が起こるとその後のautoplayは動作しない**模様で、例えば
一度止まって→スワイプなどではslide移動可能→それでもその後autoplayは動かない。

* focusが取れてないのかと思って`pauseOnHover` や `pauseOnDotsHover`とかを無効にしてもだめ
* fadeから**sliderモードに戻すと正常に治る**
* 調べても全然情報でてこない

### 解決策
dotsのデフォルトclickイベントをoffして、代わりにslickGoToで代用。

```js
let $slider = $('.slider');

//動的に作られるdotにアクセスしたいので
//init後に処理を書く
$slider.on('init', ()=>{
    let $dots = $slider.find('.slick-dots li');

    $dots
        .off('click')//デフォルトのclickを消す
        .on('click', (e)=>{
            let clickedIndex = $dots.index($(e.currentTarget));//クリックされたdotsのindex取得
            
            $slider.slick('slickGoTo', clickedIndex);//本来の動作をslickGoToで代用
        });
})

//普通にslick実行
$slider.slick({
    fade: true,
    autoplay: true,
    dots: true,
    //inifinite: true ← 無限ループにすると何故かバグる（後述）
});
```
### 注意
上記の通り、何故か`inifinite:true`にすると

* autoplayが最後まで行くと、最初へ戻ると思いきや、なぜか・・・逆ループし始める

（順次追加）
コベクトルで考えるパーセプトロン

表計算による内積と、関数によるコベクトルの考え方を復習して、その観点からパーセプトロンによる論理演算を見ます。NumPyによる計算を添えます。

シリーズの記事です。

1. [見積りで考える内積](http://qiita.com/7shi/items/03e9eb2c78360a5c1374)
1. [関数で考えるコベクトル](http://qiita.com/7shi/items/1275d2a15a25a75125d2)
1. [関数で考える行列](http://qiita.com/7shi/items/5515a49c86efb8d5102a)
1. [関数で考える双対性](http://qiita.com/7shi/items/c452e2946d1f58b5ff7f)
1. コベクトルで考えるパーセプトロン ← この記事

この記事は以下の書籍の補助となることを意図して書きました。

* [斎藤康毅(2016)『ゼロから作るDeep Learning』オライリー・ジャパン](https://www.oreilly.co.jp/books/9784873117584/)

# 見積り計算

以前の例を再掲します。

品名|単価(A社)|個数|小計
----|---:|---:|---:
鉛筆|30|12|360
消しゴム|50|10|500
ノート|150|5|750
総計|||1,610

単価と数量をベクトルで書き直せば、これは内積の計算です。

```math
\overbrace{\left(\begin{matrix}30 \\ 50 \\150\end{matrix}\right)}^{単価}\cdot
\overbrace{\left(\begin{matrix}12 \\ 10 \\ 5\end{matrix}\right)}^{個数}
=\overbrace{30×12}^{小計}+\overbrace{50×10}^{小計}+\overbrace{150×5}^{小計}
=\overbrace{1610}^{総計}
```

## NumPy

NumPyでの計算を示します。

```py3
>>> from numpy import *
>>> dot([30,50,150],[12,10,5])
1610
```

※ 以後 `import` は省略します。

一気に総計を求めないで、アダマール積により小計を求めます。

```py3
>>> array([30,50,150])*[12,10,5]
array([360, 500, 750])
```

小計の合計により総計が得られます。

```py3
>>> sum(array([30,50,150])*[12,10,5])
1610
```

## コベクトルによる関数化

A社の単価を `A` という横ベクトル（コベクトル）に割り当てれば、内積を取ることが関数を評価することと同一視できます。

```py3
>>> A=[30,50,150]
>>> dot(A,[12,10,5])
1610
```
```math
A
 \left(\begin{matrix}12 \\ 10 \\ 5\end{matrix}\right)
=\left(\begin{matrix}30 &  50 &  150\end{matrix}\right)
 \left(\begin{matrix}12 \\ 10 \\ 5\end{matrix}\right)
=1610
```

## 個数の比較

個数を変えて比較するケースを考えます。

品名|単価|個数①|個数②|小計①|小計②
----|---:|---:|---:|---:|---:
鉛筆|30|12|9|360|270
消しゴム|50|10|13|500|650
ノート|150|5|4|750|600
総計||||1,610|1,520

コベクトルを使った計算では、引数のベクトルを横に並べた行列を渡せば、一度に計算できます。

```py3
>>> dot(A,array([[12,10,5],[9,13,4]]).T)
array([1610, 1520])
```
```math
\begin{align}
A\left(\begin{array}{c|c}12 & 9 \\ 10 & 13 \\ 5 & 4\end{array}\right)
&=\left(\begin{matrix}
    A\left(\begin{matrix}12 \\ 10 \\ 5\end{matrix}\right) &
    A\left(\begin{matrix} 9 \\ 13 \\ 4\end{matrix}\right)
  \end{matrix}\right) \\
&=\left(\begin{matrix}1610 & 1520\end{matrix}\right)
\end{align}
```

ここまでが復習です。

# AND

論理演算として `AND` を考えます。乗積表を示します。

A|B|A&B
:--:|:--:|:--:
0|0|0
0|1|0
1|0|0
1|1|1

これはコベクトルでは表せない類の計算です。そのため後処理を加えます。

考え方としては、AとBを足して、それが1より大きいかを調べ、真なら1とします。

A|B|A+B|>1|A&B
:--:|:--:|:--:|:--:|:--:
0|0|0|F|0
0|1|1|F|0
1|0|1|F|0
1|1|2|T|1

AとBを足す部分をコベクトル `And0` で表し、大小比較を加え、数値化するためゼロを足します。

```py3
>>> And0=[1,1]
>>> (dot(And0,array([[0,0],[0,1],[1,0],[1,1]]).T)>1)+0
array([0, 0, 0, 1])
```

このコベクトル $(1\ 1)$ を**重み** $w$、`>1` の $1$ を閾値 $θ$ と呼びます。

※ θはthに相当する文字です。英語で閾値を意味するthresholdの頭文字を表しています。

## パーセプトロン

重みと閾値による計算をパーセプトロンと呼びます。パーセプトロンの関数を定義します。

```py3
>>> def perceptron(w, th, x):
...     return (dot(w, x) > th) + 0
...
```

これを使って `AND` を計算します。

```py3
>>> perceptron(And0, 1, [0,1])
0
```

コベクトルと同じように、引数を複数受け付けます。

```py3
>>> perceptron(And0, 1, array([[0,0],[0,1],[1,0],[1,1]]).T)
array([0, 0, 0, 1])
```
wordpressのカスタムフィールドの内容を取得する

rssで取得される本文を部分的にくり抜いて表示させたい

```ruby:filename.rb
<?php
//カスタムフィールドの本文url
$url = "http://super-beaver.com/shows/XXXXXXXXXXX/";
//読み込み
$str = file_get_contents($url);
//欲しい箇所の始まりから終わりまでくり抜く
preg_match_all('/<dd>(.*?)<\/dd>/is', $str, $matches);
var_dump($matches[1]);
```
sleep sort

新入社員に基本のソートアルゴリズム（基本選択とかバブルソートとか）教えてるんだけど変わり種も伝えておこうかと書いてみた。

結構、有名なので知ってる方は多いと思いますが最大の値がが実行時間になってしまうのと負荷がかかってる状態だと想定外の結果になる可能性があるので実用では使わないでください。
※　`sleep sort` でググってください。

javascriptバージョン


```javascript
var data = [1000,6,4,3,45,6,8,9,2,32,5,1];

for (i=0;i<data.length;i++) {
    setTimeout(function(v){console.log(v);}, data[i], data[i]);
}
```

結果

```
1
2
3
4
5
6
6
8
9
32
45
1000
```
Polymerドキュメント(日本語) Feature overview 〜Polymerの概要〜

[目次へ移動](http://qiita.com/jtakgiuchi/items/e5160ba7d039ca5b05a4)

[翻訳ドキュメントの管理ページ](https://github.com/jtakiguchi/polymer-docs-japanese-translation)

Polymerライブラリはカスタム要素(Custom Elements)を作成するための機能一式を提供します。これらの機能は、標準のDOM要素のように動作するカスタム要素を迅速かつ容易に作成できるように設計されています。標準的なDOM要素と同様、Polymer要素では以下のようなことが可能です。：

- コンストラクタまたは`document.createElement`を使用してインスタンス化する。
- 属性またはプロパティを使用して構成する。
- 各インスタンスに内部DOMを追加する。
- プロパティや属性の変化に応じて処理を行う（例えば、DOMにデータを追加したり、イベントを発火させるなど）。
- 内部のデフォルトから、あるいは外部からスタイルを設定する。
- 内部の状態を操作するメソッドに応答して処理する。

基本的なPolymer要素の定義は以下のようになります。：

~~~html
    <dom-module id="x-custom">
      <!-- Optional shadow DOM template -->
      <template>
        <style>
          /* CSS rules for your element */
        </style>

        <!-- shadow DOM for your element -->

        <div>{{greeting}}</div> <!-- data bindings in local DOM -->
      </template>

      <script>
        // Define the element's API using an ES2015 class
        class XCustom extends Polymer.Element {

          static get is() { return 'x-custom'; }

          // Declare properties for the element's public API
          static get properties() {
            return {
              greeting: {
                type: String,
                value: "Hello!"
              }
            }
          }

          // Add methods to the element's public API
          greetMe() {
            console.log(this.greeting);
          }

        }

        // Register the x-custom element with the browser
        customElements.define(XCustom.is, XCustom);
      </script>

    </dom-module>
~~~

このドキュメントでは、機能を次のグループに分けて解説しています。：

- [カスタム要素](https://github.com/jtakiguchi/polymer-docs-japanese-translation
/blob/master/docs/custom-elements/custom-elements-concepts.md)：要素を登録すると、class名がカスタム要素名に関連付けられます。この要素は、ライフサイクルを管理するコールバックを提供します。また、Polymerでは、プロパティを宣言することで、要素のプロパティAPIをPolymerのデータシステムに統合することもできます。

- [Shadow DOM](https://github.com/jtakiguchi/polymer-docs-japanese-translation
/blob/master/docs/shadow-dom-and-styling/shadow-dom-concepts.md)：Shadow DOMは、カスタム要素内にカプセル化されたローカルのDOMツリーを提供します。PolymerはDOMテンプレートからShadow Treeを自動的に生成し、カスタム要素に挿入することができます。

- [イベント](https://github.com/jtakiguchi/polymer-docs-japanese-translation
/blob/master/docs/events/handle-and-fire-events.md)：Polymerは、Shadow DOMの子にイベントリスナーをアタッチするための宣言的構文を提供します。また、ジェスチャー関連イベントを処理するためのオプションのライブラリも用意しています。

- [データシステム](https://github.com/jtakiguchi/polymer-docs-japanese-translation
/blob/master/docs/data-system/data-system-concepts.md)：Polymerのデータシステムは、プロパティオブザーバー(Property Observer)や算出プロパティ(Computed Properties)といった機能によって、プロパティや属性へのデータバインディングを提供しています。

Polymer 1.xベースの既存の要素を新しいAPIにアップグレードする場合は、[Upgrade guide](https://www.polymer-project.org/2.0/docs/upgrade)を参照してください 。

リリースの最新の状況を確認したい場合は、[Release notes](https://www.polymer-project.org/2.0/docs/release-notes)を参照してください。
Google Compute EngineのVMインスタンスのスワップメモリをSSDに変える方法。

#これ書いたきっかけ#

Google Compute Engineでmastodonを立ち上げたのは、まあ知人の紹介によるものでした。Amazon ECSが前提のサービスなのに「GCEのほうがモテるよ」と言われてホイホイ乗っちゃう方もあれなのですが、まあsshがパスワード入れなくてもブラウザで立ち上がっちゃったりsudoerに自分が入っていたりするという、開発者を甘やかしすぎる至れり尽くせりな環境には若干快感を感じちゃったりもしています。

一番小さいGCEのインスタンスでもmastodonはインストール可能、だけどもメモリが小さすぎるからってんでブートディスクに4GBくらいのswapfileを置いて構築したわけですが、いざ使い始めてみるとけっこう処理に時間がかかる。それだけでなく合計10GBくらいですと1人で適当に書き込んで数日たったくらいで使い切ってしまいました。これはひどい。画像ファイルやDBなんかはこの時点で外出しすることに決めていましたが、おそらく単体で一番大きいファイル、そう4GBのswap領域をSSD化することで高速化と容量確保の両面からの対処を目論みました。

とはいえ大したことは必要ないのです。

#方法#

##追加のSSDを確保する##

1. 例のコンソールから、自分のVMインスタンスを選びます。
2. 上の方のペンマーク[編集]を選びます。
3. 真ん中下の方「追加ディスク」と書かれているところの「項目を追加」を選びます。
4. 空欄をクリックして出て来るプルダウンメニューに「ディスクの作成」がありますので、それを選びます。
5. 名前を適切につけて、説明を適当につけます。
6. ディスクタイプは「SSD永続ディスク」、ソースは「なし」、サイズはまあスワップ用ですから10GBくらいでいいんじゃないでしょうか。暗号化は「自動」にしておきます。
7. 「作成」したらあとはデフォルトでOK。モードは、読み取り/書き込み、インスタンス削除後も「ディスクを維持」でいいと思います。まあスワップですからディスク削除しても困らないような気はします。
8. 一番下の「保存」でSSDは確保完了です。

##追加のSSDをマウントする##

これは[GCEドキュメントの出来がいい](https://cloud.google.com/compute/docs/disks/local-ssd?hl=ja#formatandmount)のでそっちを読んでもらうのがいいです。簡単に書くと、

```
$sudo mkdir -p /mnt/disks/[適当な名前]
$ls /dev/disk/by-id/
$sudo mkfs.ext4 -F /dev/disk/by-id/(lsで見つけたSSDの名前)
$sudo mount -o discard,defaults /dev/disk/by-id/(lsで見つけたSSDの名前) /mnt/disks/[さっきの適当な名前]
$sudo chmod a+w /mnt/disks/[その適当な名前]
```
これで``/mnt/disks/[適当な名前]``でSSDディスクが使えるようになります。

##SSDが再起動しても使えるようにする##

/etc/fstabに書き込む、ってやつです。さっきのGCEドキュメントの続きでもあります。

```
$echo UUID=`sudo blkid -s UUID -o value /dev/disk/by-id/(さっきのSSDの名前)` /mnt/disks/[適当な名前] ext4 discard,defaults,nofail 0 2 | sudo tee -a /etc/fstab
```
これで再起動後も使えるようになりました。

##swapfileを作って有効にする##
まあ、これも[ほかのところで語られている](http://qiita.com/tsuitta_dayo/items/dfd659ec68435653d16a#%E6%89%8B%E9%A0%86)やつです。そもそもmastodonとか作った人なら過去にもやってるはずですが再掲します。

```
$sudo fallocate -l 8G /mnt/disks/[適当な名前]/swapfile
$sudo chmod 600 /mnt/disks/[適当な名前]/swapfile
$sudo mkswap /mnt/disks/[適当な名前]/swapfile
$sudo swapon /mnt/disks/[適当な名前]/swapfile
$echo '/mnt/disks/[適当な名前]/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
```
これで、新たに8GBのスワップ領域が出来ました。いや別に10GBのディスクをつけたんだから10Gでもいいはずなんですが、なんだか2のn乗にしたくなりますよね。のこり2GBの使いみちはおいおい考えます(考えるとは言っていない)。

##今のswapfileを使うのをやめる##

swapで実際に使っている量より、メモリの量が多い場合は適切なコマンドを打てば適切にスワップファイルの内容を退避してその使用をやめてくれるそうです。今はまだ大丈夫なはず、なので

```
$sudo swapoff /[今まで使っていたswapfile名]
```
すれば、今までのswapfileとはおさらばです。ついでに

```
$sudo vi /etc/fstab
```
して、現在のスワップファイルをマウントしている行までカーソルを動かして、

```
dd
```
と押せば、その行がまるっと消えます。

```
ZZ
```
すれば、保存して終了してくれます。間違えてなんか変になった場合は、

```
:q!
```
で保存せずに終了。もう一度viの立ち上げからやり直しましょう。

ここまでやれば、
```
$sudo rm /[そのswapfile名]
```
で4GBが浮きます。

#評価(してない)#

すいません、スピード比較してないんです。そもそも8Gもスワップが必要なのかどうかもわかりません。でもこれでうまく動いています。ゆるふわですみません。
2017年版Realmのエレガントな使い方

## はじめに
Realmと言えば、とにかく高速なモバイルDBという感じでしたが、最近では「双方向編集」、「リアルタイム同期」など、公式サイトのキャッチフレーズも変わってきてます。2017年版のハマりポイントと、エレガントな使い方のパターンの紹介です

### 1.検索してから更新する

下記のように、RLMResultsをインスタンス変数に持った状態で、HogeHogeオブジェクトを追加すると、resultsに自動的に追加されます。

```swift
self.results = HogeHoge.allObjects()

// 適当にオブジェクトを生成
 let realm = RLMRealm.default()
 try realm.transaction {
    let hoge = HogeHoge()
    realm.addOrUpdate(draft)
 }

self.results.count // 増えてる
```
逆に、トランザクションの直後に再度取得した場合、反映されないことがありました。

```swift
 let realm = RLMRealm.default()
 try realm.transaction {
    let hoge = HogeHoge()
    realm.addOrUpdate(draft)
 }
let results = HogeHoge.allObjects() //書いたオブジェクトがない！！！！
```

またRLMResultsには更新された際に、発火するブロックを追加できます。

```swift
let token = results.addNotificationBlock({[weak self] (results, change, error) in
}
```

まとめると、Realmで更新直後に、更新内容を含む、データを取得したい場合は

```swift
// 1.検索する
self.results = HogeHoge.allObjects()


// 2.更新された際のブロックを追加

self.results.addNotificationBlock({[weak self] (results, change, error) in

}

// 3.更新する
 let realm = RLMRealm.default()
 try realm.transaction {
    let hoge = HogeHoge()
    realm.addOrUpdate(draft)
 }
```
とするとできます。

### 2.TableView/CollectionView パターン

TableViewとCollectionViewの場合の実装パターンです

### 1.viewDidLoadで、RLMResultsをインスタンス変数に持ち、更新フックで、reloadDataを呼び出します

```swift
override func viewDidLoad() {
   self.datas = HogeHoge.allObjects() 
   self.datas.addNotificationBlock({[weak self] (results, change, error) in
      self.collectionView.reloadData()
   }
}
```

### 2.DataSourceで、RLMResultsを使って、行数を返します
```swift
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
   return self.datas.count
}
```
このように実装すると、データが更新された際に、ビューが自動的に更新されます。


### 3.PageViewControllerパターン

１ページを表すUIViewControllerにRLMObjectをコピーしたstructを作成し、structのインスタンスを変数として持ちます。RLMObjectを直接保持すると、そのRLMObjectが削除された後に、変数にアクセスするとAssertionErrorが発生します。

```swift
class FooViewController: UIViewController {
   var hoge: HogeHogeWrapper!
}
```

次にDataSourceクラスにて下記のように実装します。

```swift
var datas: RLMResults<RLMObject>

override init() {
   datas = HogeHoge.allObjects()
}

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
   
   //UIViewControllerから現在のオブジェクトを取得
   guard let hoge  = (viewController as? FooViewController)?.hoge else { return nil }
   
   //indexを求める
   let index = indexOf(medium: hoge)
   if index <= 0 { return nil}

   //隣のオブジェクトをセットする
   controller.hoge = datas.object(at: (index-1)) as! Hoge
   return controller
}

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
   guard let hoge  = (viewController as? FooViewController)?.hoge else { return nil }
   let index = indexOf(medium: hoge)
   if (index+1) >= datas.count { return nil }
   controller.hoge = datas.object(at: (index+1)) as! Hoge
   return controller 
}
```

今のコントローラの持つ、オブジェクトを元に、RLMResultsのindexを求めることで、データが追加された際に、自動的に追従できるようになります。ただしこのままでは、ページ1とページ2がある場合に、データがページの間に追加された場合に、追従しないため更新フックを使って、ページビューを再作成する必要がありますが、大体のケースでは機能します。

現場からは以上です。
S3のアクセスを全て他のページに飛ばす


あるS3のバケットにリクエストが来た時に、全てのリクエストを
`http://hogehoge/fuga.html`に流したい。

最近S3のWeb Consoleが変わったので自分のために作業メモを残しておく。

Static Website Hostingの設定
---


![スクリーンショット 2017-04-26 17.13.10.png](https://qiita-image-store.s3.amazonaws.com/0/18331/b9912d35-afb7-ba24-81ae-832d2d9da8f2.png "スクリーンショット 2017-04-26 17.13.10.png")


適当にindex.htmlをアップロードする。
S3のStatic Website Hostingの設定を図のように、errorにも`index.html`を設定する。



リダイレクトするindex.htmlの設定
---


![スクリーンショット 2017-04-26 17.22.33.png](https://qiita-image-store.s3.amazonaws.com/0/18331/b6bc3809-946f-b8b8-dc4f-36e39a18cefe.png "スクリーンショット 2017-04-26 17.22.33.png")

index.htmlのプロパティを開いて、

「Website-Redirect-Location」のメタデータに飛ばしたいURL`http://hogehoge/fuga.html`を設定する。

こうすることによって、エンドポイントのURLにアクセスすると、`http://hogehoge/fuga.html`に飛ぶはず。
プログラミング未経験者がRuby/Ruby on Railsのローカル開発環境構築で迷わない為の参考記事と順序説明

# ローカル開発環境で参考にした記事を載せていきます(2017/04/26現在)

　色々な記事がネット上に点在していて結局どうすればいいのかわかりづらかったので、ノンプログラマーの僕が参考にした記事と順序をまとめてみました。何が何だかわからなくても記事の指示に沿ってコピペしていけばとりあえず構築はできると思います。

　各々の記事での注意点や「ここはコレ選ぶ」ってことをこの投稿では残しておくので行ったり来たりを頑張ってください。

  僕のPCはmacなのでwinの人は他の記事を当たってください。



## [初心者必見！Ruby開発環境構築おすすめの方法【Mac/Windows別】](http://www.sejuku.net/blog/3958)
内容はタメになるものなのでしっかり読みましょう。

目次３のRuby開発環境の種類では「 **rbenv** ]を選択

記事に沿って下まで行くと**「rbenvで複数のRubyインストールに挑戦してみよう」**という場所で下の画像のようなリンクが出てきますがここではHomebrewについては進めなくて良いです
>![image](https://qiita-image-store.s3.amazonaws.com/0/92926/493d3619-c2a2-ce11-cef4-463100456854.png)

ここまでたどり着いたらもう次の記事に移行します。

## [Homebrewのインストールとrbenvのインストールまで Mac編](http://qiita.com/issobero/items/e0443b79da117ed48294#%E3%81%93%E3%81%93%E3%81%BE%E3%81%A7%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6)

読み始めて早速意味わからない単語が出てきます
>![image](https://qiita-image-store.s3.amazonaws.com/0/92926/cb88f6ff-7b0b-7f68-a50b-fd4d3e54113e.png)

ここは該当する部分がなければスルーしていいです
最低限2.3.6はやります（僕は６やってなかったけど）
7に関しては環境構築終わってからでも間に合いそうだったので割愛

---

Homebrewのインストール手順までたどり着いたらターミナルでコマンド入力していきます。Homebrewのコマンドは公式から引っ張ってきた方がいいので[**コチラ**](https://brew.sh/index_ja.html)からどうぞ

ターミナル？コマンド？って人はドットインストールで学習してから戻ってきましょう
>http://dotinstall.com/lessons/basic_unix

ターミナルにガンガン記事からコピペしてきたコマンドを入力して進めていきます

---
### 「最新バージョンのRubyを入れてみよう」　
ここで僕は一番最新の安定版Rubyということで
rbenv install 2.3.1 の部分を　rbenv install **2.4.1**に書き換えてインストールしました

>![image](https://qiita-image-store.s3.amazonaws.com/0/92926/6c486538-3cf3-bf83-29dd-ab25fadd2a27.png)

インストールが終わったらターミナルを一旦再起動し、コマンド 「 ruby -v 」と入力して現在のバージョンが 2.4.1(またはご自身が選択したバージョン）になっているか確認しましょう
確認が取れたら次の記事にいきます

## [2017年版!30分で作るRuby on Rails 5開発環境 Mac編 Vagrant+CentOS7+rbenv](http://withdom.jukendou.jp/withdom-it-lab/it-skills/714)
こちらでVagrantやVirtualBoxのインストールをしていきます。意味不明だと思いますが記事を読めばある程度わかってきます。お手持ちのMac内に仮想領域を作ってCentOS7で動く別のPCを作っちゃおうってことです（たぶん）
今後はここで作った開発環境に一度SSH接続というものをしてから開発を進めることになります。

記事通り進めて行くとここでもしかしたらエラーが出て詰まるかもしれません
>![image](https://qiita-image-store.s3.amazonaws.com/0/92926/03898e1f-d5a8-d9dc-bce7-f01d49f2223c.png)

このコマンドはVagrantfileがあるディレクトリ内でしか実行できないんです。ここまで忠実に進めてきた方はホームディレクトリ内にruby_on_railsというディレクトリがあると思いますので、そちらに移動してから「 **$ vagrant up** 」しましょう

---

さらに進めて行くとGemfileの編集をすることになります
（ここで僕はvimに切り替わっていると気づかず１時間ほど悩みました）
>![image](https://qiita-image-store.s3.amazonaws.com/0/92926/31e1feba-7c3a-3dc9-af33-a25821c9cc07.png)

ここで vi Gemfile というコマンドを利用しますが、これを利用するとCentOS7に標準装備されている**Vim**というテキストエディタでの編集に切り替わります。ターミナルの画面からVimに切り替わっているので操作方法も切り替わります。操作方法の記事は[**コチラ**](https://lab.sonicmoov.com/development/server/vivim10/)です。

---

そのまま記事通り進めていったらlocalhost:3000からRailsの画面表示するところまでたどり着けました。
# みなさん無事に辿り着きましたか？
ここの解説足りないっしょ！ってところあったらツッコミください
Re:dashのキャッシュデータを削除する


最近、Re:dashをちょくちょく使っています。
キャッシュ関連で気になったことがあったのでメモ。

Re:dashはクエリを毎回発行しなくてもいいように、結果をローカルのPostgreSQLにキャッシュして利用している。
長期運用してたり、リアルタイムにクエリを発行するようなSQLを書いてるとキャッシュが溜まっていってしまい、ディスクを圧迫していったので、この辺の問題を解決したいなと思って調べたら環境変数で設定できるようでした。

普段はdockerで立ち上げてるので、docker-composeに環境変数を書いていきます

docker-compose.ymlは公式のものからREDASH_QUERY_RESULT_CLEANUPの3つを追記しただけです。
ここで気をつけないといけないのは、実際にキャッシュを削除しているのはworkerなので、workerのところに書いてあげないといけません。serverのところに書いちゃうと動きません。

```
  worker:
    build: .
    command: scheduler
    environment:
      PYTHONUNBUFFERED: 0
      REDASH_LOG_LEVEL: "INFO"
      REDASH_REDIS_URL: "redis://redis:6379/0"
      REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres"
      QUEUES: "queries,scheduled_queries,celery"
      WORKERS_COUNT: 2
      REDASH_QUERY_RESULTS_CLEANUP_ENABLED: "true"
      REDASH_QUERY_RESULTS_CLEANUP_COUNT: 150
      REDASH_QUERY_RESULTS_CLEANUP_MAX_AGE: 1
```

- REDASH_QUERY_RESULTS_CLEANUP_ENABLED
 - キャッシュの削除を有効にするかどうか設定(defaultはfalse)
- REDASH_QUERY_RESULTS_CLEANUP_COUNT
 - 古いキャッシュを何件ずつ削除するかを設定
- REDASH_QUERY_RESULTS_CLEANUP_MAX_AGE
 - 過去何日経ったキャッシュを削除するかを設定

今回、僕がdocker-composeに書いた設定だと
1日前のキャッシュを150件ずつ削除するようになっています。

## 実際にどこで消しているのか？

[worker.py - GetRedash/redash](https://github.com/getredash/redash/blob/61244dead3c9e53e8f8888a3128e8de66b7ae173/redash/worker.py#L40) でworkerが5分置きに`redash.tasks.cleanup_query_results`を叩くようになっている。
つまり、1日前のキャッシュを5分おきに150件消すようになっていて
10分で300件消すことになる。

で、実際のタスクはここ [cleanup_query_results() - GetRedash/redash](https://github.com/getredash/redash/blob/8b4643d6acdd05c6ddc53a4e24903b5744fae888/redash/tasks/queries.py#L329)

cleanup_query_resultの中身まではまだ読めてないけど、
5分おきにworkerがキャッシュを消してるのが分かったので良かった。

## 参考

- [Settings - Environment Variables - Redash Help Center](https://redash.io/help-onpremise/setup/settings-environment-variables.html)
Evernoteでコンテクスト機能を無効にする方法

Evernoteが新しくなって「コンテクスト」がデフォルトで有効になったが非常に鬱陶しい。
無効にする方法を探していたが、そのオプションの指定方法が見つかりづらく、ネットで検索しても古いバージョンの設定画面での解説しかなかったため、ここで記録を残しておく。
大した話ではないけど、誰かの役に立てば恐縮です。

+ メニューの「ツール」→「オプション」を選択
+ 「オプション」ダイアログの右にある「ノート」を選択
+ 「詳細オプションを表示」チェックボックスを入れる
+ スクロールして表示される「コンテクスト表示」チェックボックスを外す

![Evernote_context_option.png](https://qiita-image-store.s3.amazonaws.com/0/64819/e0c1f2fe-0871-f56b-a2e4-9b37cf83ad27.png)
形態素解析エンジンについて検討

形態素解析を色々使ってみようということで
実装難度等を考慮して比較とか色々検討するメモ
~~形態素解析じゃ無くても良い気もする~~
※ めっちゃ編集中です。検討段階なのでめっちゃ編集します。

# 形態素解析ってなに
文を解析して形態素(単語とか)に分割する奴

詳しくは
[形態素解析:wiki](https://ja.wikipedia.org/wiki/%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90)

# 要件？
・ECCUBE、wordpress等のPHPから実行出来るもの
・UNIXで動くやつ
・主な用途としては検索エンジン、関連商品やデータの抽出など
・実装コストは軽いほうが良い(エンジン自作は流石に無い)
・一杯走るだろうからリソースも気にしたい
・取り敢えず調べるけどAPI系はリクエスト数に制限があるからダメだと思う
・MeCabで良い気がするけど取り敢えず調べる

# どんなものがある？
## [MeCab](https://ja.wikipedia.org/wiki/MeCab)
めっちゃメジャー。実際に動作してる実績がある。
ただ重い(らしい)
辞書が自分で作れる
  
**要root**
### [neologd](https://github.com/neologd/mecab-ipadic-neologd)
Web上の言語資源から得た新語を追加することでカスタマイズした MeCab 用のシステム。
なのは完売とかも解析出来る。
メモリ要件が5GBとかなので辛い。


## [yahoo 日本語形態素解析](https://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html)
**API**
24時間で50000リクエストまで行けるって

## [JUMAN](http://nlp.ist.i.kyoto-u.ac.jp/index.php?cmd=read&page=JUMAN&alias%5B%5D=%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0JUMAN)
JUMAN++があるから不要…？
辞書が自分で作れる

## [JUMAN++](http://nlp.ist.i.kyoto-u.ac.jp/index.php?JUMAN++)
MeCabより強いらしい
辞書が自分で作れる

表記揺れとか強い。googleがぐーぐるでも認識する

## [Tofu](http://www.discoveryfuji.com/software.jsp)
MeCabより軽いらしいけど**windows用**
logrotateで大量のログを扱う

# logrotateを使って大量のログを切り替える

大量のログファイルが生成されるディレクトリを切り替える必要があり、logrotateが使えるかもしれない、と思ってやってみました。

## 2段階のconfigで実現

しかしこれでいいのか自信がありません。
そもそも大量のログを吐き出すのが間違いのような気もします。

```
# 1段階目。catで全ログを1ファイルにまとめる
/path/to/many/logfiles/* {
    weekly
    firstaction   # ローテーションの前に以下を実施 = concatnated ファイルに全ログをcatする (ログファイルが存在する場合)
        if ls /path/to/many/logfiles/* > /dev/null 2>&1; then
          for file in /path/to/many/logfiles/*; do echo "== $file =="; stat $file; echo ""; cat $file; echo "";done >> /path/to/log/concatnated
        fi
    endscript
    rotate 0      # ローテーションはしない = ログを削除する
    missingok     # 対象ログがなくてもエラーにしない
}

# 2段階目。まとめたファイルをローテーション
/path/to/log/concatnated {
    weekly
    rotate 50
    compress
    dateext
    missingok
}
```

## 注意点

- ディレクトリごと切り替える、ことはできないようなので諦め。
- rotate 0 にしているので、1段階のパスに誤りがあるとログが全部消えます。
- 1つにまとめたファイル concatnated は、単にログをくっつけただけではなく、ファイル名はstatコマンドによる情報も貼り付けています。  
  ファイル名そのものが情報である場合のためです。
SublimeTextからターミナルを起動するPackage「TerminalProjectFolder」[Mac編]

最近AtomよりSublimeTextの方がサクサク動くなあーと感じるようになったので、Sublimeさんに乗り換えていたのですが、時々今開いているファイルの場所からターミナルを起動したい時があるので、その方法をググってみたところ、Windows版はサッと出て来たのですが、Mac版が見当たらなかったのでまとめておきました。

# 使い方
1. Sublime Text（Build3116の場合）を起動する。<br />
![スクリーンショット 2017-04-26 16.44.12.png](https://qiita-image-store.s3.amazonaws.com/0/174167/042eec49-a9c7-1cb1-f951-0a4f560360df.png)
* 「Preferences」 > 「Package Control」に進む。
* 「Package Control：」のあとに「Install Package」と記入し、Enterを押す。<br />
![スクリーンショット 2017-04-26 16.48.46.png](https://qiita-image-store.s3.amazonaws.com/0/174167/3d6a38da-2455-73e6-7be8-3c362aac7657.png)<br />↓<br />
![スクリーンショット 2017-04-26 16.52.36.png](https://qiita-image-store.s3.amazonaws.com/0/174167/31d1c730-202e-cf03-abb3-d1fec4e22dce.png)
* その後、「Install Package」が起動するので、その画面で「TerminalProjectFolder」と入力し、再度Enterを押す。<br />
![スクリーンショット 2017-04-26 16.55.10.png](https://qiita-image-store.s3.amazonaws.com/0/174167/8ac11f12-0894-5e5e-c512-e345f9547eb1.png)
* これだけ！あとは任意のディレクトリから、任意のファイルを開き、ある程度作業をした段階で、current directoryからターミナルを起動する場合には、「command + shift + T」を押せばOK。
c言語_関数ポインタの配列を使う


```c:main.c

#include <stdio.h>

typedef int (*fptrOperate)(int, int);
fptrOperate operations[128] = {NULL}; // int (*operations[128])(int, int) = {NULL}


int add( int num1, int num2 ){
    return num1 + num2;
}


int sub( int num1, int num2 ){
    return num1 - num2;
}


int multi( int num1, int num2 ){
    return num1 * num2;
}


int unko( int num1, int num2 ){
    return 777; // unko
}


void initialize(){
    operations['+'] = add;
    operations['-'] = sub;
    operations['*'] = multi;
    operations['u'] = unko;
}

int evaluate(char opcode, int num1, int num2){
    fptrOperate operate;
    operate = operations[opcode];
    return operate(num1, num2);
}
    

int main(int argc, const char * argv[]) {
    initialize();
    printf("evaluate('+',10,100)=%d\n", evaluate('+', 10, 100));
    printf("evaluate('-',10,100)=%d\n", evaluate('-', 10, 100));
    printf("evaluate('*',10,100)=%d\n", evaluate('*', 10, 100));
    printf("evaluate('u',10,100)=%d\n", evaluate('u', 10, 100));
    return 0;
}


```

関数のポインタの配列(=operations)を使って、
関数(=evaluate)の機能を切り替えられるようにしてみたという、サンプルコードです。

```c:./main.o

evaluate('+',10,100)=110
evaluate('-',10,100)=-90
evaluate('*',10,100)=1000
evaluate('u',10,100)=777

```

参考：
> [詳説Cポインタ](https://www.oreilly.co.jp/books/9784873116563/)

　　
　　
どやっ！
クイックソート

同じく書籍より

```

#クイックソート
def quicksort(array):
    if len(array) < 2:
        return array      #基本ケース 配列に１個だけならなれべ変えることができない
    else:
        pivot = array[0]  #0番目をピボットとしてとる
        
        #ピボットよりも小さい要素を全て含んだ部分配列
        less = [i for i in array[1:] if i <= pivot]  #配列1(2番目)以降が pivotより小さい場合less
        
        #ピボットよりも大きい要素を全て含んだ部分配列
        greater = [i for i in array[1:] if i > pivot] #配列1(2番目)以降が pivotより大きい場合less
        
        return quicksort(less) + [pivot] + quicksort(greater)
    
print quicksort([10,5,2,3])

```

> [2,3,5,10]とちゃんと並べ替えられた
pivotを基準に小さいか大きいかでソートされているがreturn で再帰関数を使っている
Google Vision APIをHerokuで使う

最近Line Bot作りを暇つぶしにやっています。

簡単な画像認識をするためにGoogle Vision APIを使おうとしたのですが、LineBotの運用をHerokuで行っていたことで問題がありました。

Herokuではアプリケーションの管理をgitを用いて行っています。そのためGoogle Vison Apiを使用するのに必要な認証用のjsonファイルをプロジェクトに含めなければなりませんでした。（Google Vision APIのGo言語用パッケージの仕様はjsonファイルを読み込む用になっている）

```golang
ctx := context.Background()

// Create the client.
client, err := vision.NewClient(ctx)
if err != nil {
    return nil, err
}
````

通常は上記のようにして`client`のインスタンスを作成します。しかし、これでは先ほど述べたようにjsonファイルをHeroku上に置くことになるのでよろしくありません。

[ここ](https://github.com/google/google-api-go-client/issues/185)に参考となるコードが載っていたので、これを参考に書き換えてみました。

```golang
json := os.Getenv("GOOGLE_APPLICATION_CREDENTIALS")
ctx := context.Background()
jwtConfig, err := google.JWTConfigFromJSON([]byte(json), vision.Scope)
if err != nil {
    return nil, errors.New("google.JWTConfigFromJSON :" + err.Error() + "\n" + json)
}

ts := jwtConfig.TokenSource(ctx)

// Create the client.
client, err := vision.NewClient(ctx, option.WithTokenSource(ts))
if err != nil {
    return nil, err
}
```

先ほどよりも長くなってしまいましたが、これでいけました。Herokuの環境変数`GOOGLE_APPLICATION_CREDENTIALS`に認証用のjsonファイルの中身を設定しておく必要があります。使っているシェルがbashであるなら以下のようにして設定できると思います。

```console
$ heroku config:set GOOGLE_APPLICATION_CREDENTIALS="$(cat <ファイル名>.json)"
```

----------------------------
参考にしたページ:
[Load GOOGLE_APPLICATION_CREDENTIALS json content via an environment variable instead of a file #185](https://github.com/google/google-api-go-client/issues/185)
[Google Vision APIのサンプルプログラム](https://github.com/GoogleCloudPlatform/golang-samples/tree/master/vision/label)

---------------------------
作成中のlinebot
https://github.com/hasokon/linebot
Azure IoT Suite Connected factory が本日から利用できます。

4/20にアナウンスされた、Azure IoT Suite Connected Factory が本日から使えるようになりましたので、さっそく動かしてみたいと思います。

Azure IoT Suite connected factory now available
https://azure.microsoft.com/en-us/blog/azure-iot-suite-connected-factory-now-available/

##Azure IoT Suite Connected Factory とは？

・複数の工場の稼働状況を管理するための機能やモニタリング、可視化、アラートの機能が事前に構成されている。
・利用開始はワンタッチ
・OPC UA接続をサポート
OPCとは何ですか? - OPC Foundation Japan （日本OPC協議会）
https://jp.opcfoundation.org/faq/question-1/
 
Get Started !

例によってGet Startedが公開されているので、こちらを参考に。
https://docs.microsoft.com/en-us/azure/iot-suite/iot-suite-connected-factory-overview

IoT Suiteはこちらから作成できます。
https://www.azureiotsuite.com/

開いてみると、、、おお、Connected Factoryができていますね。
![image](https://qiita-image-store.s3.amazonaws.com/0/167354/bac96404-cb3f-2ba1-4c90-14e247f8ec09.png)

Connected factoryを選択し、必要な設定（たったの３つ）を入れます。
![image](https://qiita-image-store.s3.amazonaws.com/0/167354/689ec2c7-ab54-d062-95d6-a0e055335789.png)

本件に限りませんが、ご利用のサブスクリプションによっては、VMが起動できない箇所があったりしますので、ご注意ください。その場合は、リソースグループごと消して再チャレンジ！
結構待つと、、、無事に完成します。
![image](https://qiita-image-store.s3.amazonaws.com/0/167354/82354764-350a-bd77-356b-6fa046110367.png)

工場を選択するとこんな感じでドリルダウンできます。
![image](https://qiita-image-store.s3.amazonaws.com/0/167354/ed907b8e-f559-d031-36b4-081c9f9b8a3b.png)

詳細な使い方、試し方はGet Startedのドキュメントをご参照ください。

Azure IoT Suite connected factory overview | Microsoft Docs
https://docs.microsoft.com/en-us/azure/iot-suite/iot-suite-connected-factory-overview
 
リリースされたばかりのTime Series Insightsもさっそく使われてますね。
![image](https://qiita-image-store.s3.amazonaws.com/0/167354/649c21f0-31d9-0979-4d12-3fd95fb642e8.png)

ぜひお試しください。
カウントアップ・カウントダウン処理の実装とそのとき出くわしたJavascript比較処理の注意点

#カウントアップ・カウントダウン処理の実装を行いました。

以下のコードだと３３３→４５５にカウントアップします。値を入れ替えればカウントダウンします。



```html:count-sample.html
<html lang="utf-8">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>

<script> 

$(function(){
    var countElm = $('.count'),
    countSpeed = 7;

    countElm.each(function(){
        var self = $(this),
        countMax = Number(self.attr('data-num')),
        thisCount = Number(self.text()),
        countTimer;

        function upTimer(){
            countTimer = setInterval(function(){
                var countNext = thisCount++;
                self.text(countNext);

                if(countNext == countMax){
                    clearInterval(countTimer);
                }
            },countSpeed);
        }
        function downTimer(){
            countTimer = setInterval(function(){
                var countNext = thisCount--;
                self.text(countNext);

                if(countNext == countMax){
                    clearInterval(countTimer);
                }
            },countSpeed);
        }

        if(thisCount < countMax){
        	upTimer();
        }else{
        	downTimer();
        }
    });

});


</script>

<span class="count" data-num="450">333</span>

</html>
```


#Javascript比較処理ではまった点

はじめは

```js
countMax = self.attr('data-num'),
thisCount = self.text(),
```
としており、`countMax`と`thisCount`を文字列で比較していました。
javascriptの比較演算子は文字列で比較すると文字列のサイズで比較しているようで、上手く比較できていませんでした。

「比較演算子は数値型で比較するでしょっ」て思っていても、タグの要素を取ってきたりしているうちについついこんなことになってる場合があるという教訓でした。