OmniAICreator/Qiita-1.07M huggingface dataset:
webpackのUglifyJsPlugin使用時にUnexpected character '`'エラーが発生した場合

追記（2018/2/3）
* uglifyjs-webpack-plugin（[GitHub](https://github.com/webpack-contrib/uglifyjs-webpack-plugin)）を使用する事によりエラーは発生しなくなりました。
* Webpack 4では、標準のuglifyjs-webpack-pluginもUglifyESに対応との事です。

---

メモ。

エラー内容はそのままで、バッククォートが処理できないようでした。
私の場合はpug-loaderを使用時発生しました。（pugの中にバッククォートを使用）
pug-loaderの処理順先行し、babel-loaderの処理を後で通すようにしたら解消されました。


以下、webpack.config.jsの必要部分の抜粋です。

```webpack.config.js
module: {
  rules: [{
    test: /\.pug/,
    use: [{
      loader: "pug-loader"
    }],
    enforce: "pre"
  }, {
    test: /\.(pug|js)$/,
    use: [{
      loader: "babel-loader"
    }]
  }]
}
```

重要な部分はenforce: "pre"とtest: /\.(pug|js)$/の部分です。
RDocで出力したドキュメント内の任意の箇所で改行したい

# RDocで出力したドキュメント内の任意の箇所で改行したい
Rubyのソースコードからドキュメント生成していた際に、
任意の箇所で改行する方法に若干戸惑ったので記載します。
## RDocとは？
RDoc は Ruby のドキュメント生成を行うためのライブラリです。
[Ruby 2.5.0 リファレンスマニュアル > ライブラリ一覧 > rdocライブラリ](https://docs.ruby-lang.org/ja/latest/library/rdoc.html)

## 任意の箇所で改行する方法
結論から言うと、改行したい箇所にHTMLの&lt;br>タグを使用することになります。

&lt;br>タグのバリエーションとして、以下の３パターンを試してみます。
1. &lt;br>
2. &lt;br />
3. &lt;BR>


```ruby:new_line.rb
# coding: sjis

# １行目<br>
# ２行目
def test01
	nil
end
# １行目<br />
# ２行目
def test02
	nil
end

# １行目<BR>
# ２行目
def test03
	nil
end
```

RDocの出力結果は以下となります。
上記の３パターンの内の&lt;br>だけで改行され、他はそのまま出力されてしまいます。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/112941/86f67a4c-f84a-17fe-f8f0-7087559302e5.png)

## 備考
RDocの他にRubyのドキュメント生成ツールの[YARD](https://yardoc.org)も同様のようです。
※私の場合YARDで&lt;br />と書き込んでみたところ改行されず出来ないものと勘違いしてしまいました。
OpenCVはGStreamerパイプラインを直接受け入れてくれるが、注意必要

例えば、RPIからUbuntu等へ、GStreamerで画像をストリームで受けとり、UbuntuのOpenCVで処理したいとき、

RPI側のshellでは、例えばこうします。

```shell
gst-launch-1.0 -v -e rpicamsrc preview=0 fullscreen=0 vflip=1 ! 'video/x-h264, width=640, height=480, framerate=30/1, profile=high' ! queue ! rtph264pay ! udpsink host=サーバのIPアドレス port=適当なポート番号X
```

そして、サーバー側(Ubuntu Python)で、

```py
cmd = '-v udpsrc port=X caps="application/x-rtp,media=(string)video,encoding-name=(string)H264" ! rtph264depay ! avdec_h264 ! videoconvert ! appsink'
```
とかいうパイプラインと記述を準備しておき、それをそのままOpenCVのVideoCaptureメソッドに指定します。pipelineの最後がappsinkです。

```py
cap = cv2.VideoCapture(cmd)
```
これでサーバー側でストリームを受け取り、OpenCVで処理できます。

注意点：　
１．cv2.VideoCaptureにGstreamerのPipelineを直接書けるというのは、Undocumentedな仕様らしいです。コード以外のどこにも書いてない。
２．パイプラインの記述で、 ! の両側に空白がないと動きません。<-　GSteamerのドキュメントに書いてあるところが見つけられなかった。たとえ書いてあったとしても、仕様Bugと言っていいと思う。
句読点の違いなんて知るかという人のために

# はじめに
日本語組版のときに注意するべきことの一つとして句読点の種類があると思います。

横組みのときは「，」と「．」であるとか、縦組みのときは「、」と「。」であるとか。しかも、流儀によってこれが混在するのですからたまりません。

そこで、そこら辺の苦痛を和らげるパッケージを作りました（使用は完全に自己責任でお願いします）。

# 前提条件
これは、pLaTeX での使用を想定しています。くれぐれもLuaLaTeX等で使用しないよう注意をしてください。まあコマンドが和文字を使っているので問題はないでしょうが

また、要望がない限りCTANにあげるつもりはないので他人にtexファイルを渡すときは注意してください。

# 本体
さて、お待ちかねの本体です。以下のコマンド等を.styファイルで保存するだけです。

~~~latex
\newcommand{\yokoku}{．}
\newcommand{\tateku}{。}
\newcommand{\yokotou}{，}
\newcommand{\tatetou}{、}

\def\kuten@a{\yokoku}
\def\kuten@b{\tateku}
\def\touten@a{\yokotou}
\def\touten@b{\tatetou}

\newcommand{\読点}{%
\ifydir \touten@a \else \touten@b \fi}
\newcommand{\句点}{%
\ifydir\kuten@a\else\kuten@b\fi}
~~~

保存したstyファイルを読み込みんで句点を打つときに`\句点`と、読点を打つときに`\読点`と書けばいいだけです。あとはpTeXが縦モードか横モードかを判別して句読点の種類を変えてくれます。

実際に使うときは、自分の好きな通りに句読点を打ったあとに一括置換をするのが便利だと思います（自分は辞書登録をすることでで「、」を打つと`\読点 `が、「。」を打つと`\句点 `が予測変換で出るようにしました）。

また、`\renewcommand{\yokoku}{。}`などと書けば記号を好きな通りに変えることができます。下にコマンドの対応を示しておきます。

- 横の句点=`\yokoku`
- 縦の句点=`\tateku`
- 横の読点=`\yokotou`
- 縦の句点=`\tatetou`

# おわりに
ここまで記号類で揉めるのはいかがなものかというのが率直な考えです。まあ記号なんてよほど的外れではない限りは好きなようにするのがいいとも思いますが。
メールサーバ構築・独自ドメインのメールアドレス作成(2/4)～独自ドメイン取得編～

##目標
最終目標　：メールサーバを立てて、独自ドメインのメールアドレスを作成する
今回の目標：独自ドメインの取得

##必要なものごと
1. サーバーリソース確保→ [前回の記事](https://qiita.com/pypypyo14/items/08cf3e3fa8cc4d9e254b)
2. **独自ドメイン取得**　　→今回はこれを取得
3. サーバーと独自ドメインの紐付
4. メールサーバのインストール・設定

##ドメイン決め
.com/.jp/.net あたりを候補に字面やお値段と相談。
安くても可愛くても、メールアドレスとしてうさんくさいというか見慣れないドメインは除外しました。
（迷惑メール扱いされたり、各種サービスの新規登録などで弾かれる可能性がありそうだと思ったため）

##ドメイン取得サービスの選定
以下2点を条件に探しました。
　・ 自動更新あり
　・ whois情報公開代行無料
本当ならお値段等々比較して決めたほうがいいのでしょうが
早いとこドメインが持ちたくて気が焦っていたので、とりあえず有名どころのお名前.comさんにしました。


##申し込みの流れ
2018年2月のお名前.comさんの場合、
取得可能ドメインの検索→ドメイン決定→ユーザー登録→個人情報入力→決済。かんたんなので詳細は割愛。
※ 登録後、メールアドレス認証メールが届くのでURLクリックをお忘れなく。

##登録確認
###whois
お名前.comのwhoisを確認。
代行登録いただいたので、自分の名前丸出しじゃないことを確認してひと安心です
![image.png](https://qiita-image-store.s3.amazonaws.com/0/174283/304c5297-63e9-e5fe-f125-3e32b3be9f93.png)


###nslookup
![image.png](https://qiita-image-store.s3.amazonaws.com/0/174283/307da34a-b9a8-4680-c8f6-7123dd94a38e.png)
ドメイン登録直後はまだIPと自サーバを結んでいないです。
お名前.comさんのサーバのIPが出てくるみたいです。
【THETA V】ライブストリーミングの映像をUnityで表示


## 準備

[RICOH THETA Vで4Kライブストリーミングをしよう](https://theta360.com/ja/howto-livestreaming/)


## Skybox版

- MainCameraにSkyboxを追加。
- [Custom Skybox]に[Stereoarts Homepage](http://stereoarts.jp/)の`ThetaRealtimeSkybox`を設定。
- MainCameraに以下の`WebCamDrawer.cs`をアタッチ。


## Sphere版

- [UnityとOculusで360度パノラマ全天周動画を見る方法【無料編】](http://warapuri.com/post/131599525953/)から、`Sphere100.fbx`を拝借。
- ヒエラルキーにD&D。スケールを100倍。
- ShaderをUnlitにして、光の影響を受けないようにする。
- Sphere100に以下の`WebCamDrawer.cs`をアタッチ。


## 映像を描画するスクリプト

[THETA SからOculus RiftへUSBライブストリーミング with Unity (Skybox編)](http://hammmm.hatenablog.com/entry/2015/12/23/213257)より[WebCamDrawer.cs](https://bitbucket.org/mhama/thetaoculuslivestreaming/src/master/Assets/ThetaLiveStreaming/Scripts/WebCamDrawer.cs?at=master&fileviewer=file-view-default)を拝借、少し手を加えたスクリプト。

```csharp:WebCamDrawer.cs
using UnityEngine;
using System.Collections;

public class WebCamDrawer : MonoBehaviour {
	public string deviceNameKeyword = "THETA";

	void Start() {
		StartStreaming();
	}

	void StartStreaming() {
		WebCamDevice device = new WebCamDevice();
		// 参照渡しでdeviceを書き換え
		if (!FindDevice (ref device)) {
			Debug.LogError("<"+deviceNameKeyword+">を含むWebカメラが検出できませんでした。");
			return;
		}
		WebCamTexture webcamTexture = new WebCamTexture(device.name);
		Material mat = GetTargetMaterial ();
		if (mat == null) {
			return;
		}
		mat.mainTexture = webcamTexture;
		webcamTexture.Play();
	}

	bool FindDevice(ref WebCamDevice target) {
		bool deviceExists = false;
		WebCamDevice[] devices = WebCamTexture.devices;
        foreach (WebCamDevice device in devices) {
			Debug.Log("device.name => " + device.name);
			if (device.name.Contains(deviceNameKeyword)) {
				target = device;
				deviceExists = true;
			}
        }
		return deviceExists;
	}

	Material GetTargetMaterial() {
		Skybox skybox = GetComponent<Skybox> ();
		if (skybox != null) {
			return skybox.material;
		}
		Renderer renderer = GetComponent<Renderer> ();
		if (renderer != null) {
			return renderer.material;
		}
		Debug.LogError ("Renderer/Skyboxコンポーネントがありません。");
		return null;
	}
}
```

> 参考
[WebCamTexture](https://docs.unity3d.com/ja/current/ScriptReference/WebCamTexture.html)

## windowsのエラー

```md
Could not connect pins - RenderStream()
UnityEngine.WebCamTexture:Play()
```

こんなエラーが出てくるので、以下のURLを参考に進める。
[Solved: Unity Can’t Display THETA V Live Stream on Windows 10](http://lists.theta360.guide/t/solved-unity-cant-display-theta-v-live-stream-on-windows-10/1688/24)

レジストリエディターから`DevicePath`を追加する。
![2018-02-03.png](https://qiita-image-store.s3.amazonaws.com/0/136286/baa06bd3-9ab5-7a75-6d5a-eea54441da55.png)

`WebCamDrawer.cs`のデバイスの名前を、Macの場合は`THETA`、Windowsの場合は`THETA V FullHD`と使い分ける。
![2018-02-03 (1).png](https://qiita-image-store.s3.amazonaws.com/0/136286/36224027-c4c4-fd18-a1b2-0748031e5c56.png)
RPI上のPythonでKivyを終わらせる

RPI+PythonでKivyを動かしているとき、App.get_running_app().stop()で終わってくれない状況の話です。

主ループでClock　eventを使い、sys.exit()を呼べば死んでくれるらしいが、KivyをThreadで動かしていて
sys.exit()が使えない場合どうするか。普通のThreadの終わらせ方のように、while flag: みたいにしたいが
Kivyは、buildメソッドをrunすると主ループがプログラマーには見えず、ループに細工できない。
Eventハンドリングのループに直接作用させて、
```
from kivy.base import EventLoop
...
EventLoop.exit()
```
で、消えてくれます。
GASから短縮URL付きで自動ツイートする

# はじめに
個人アプリで、新着記事があったらpushを送る、という機能を実装したのですが、これをtwitterでも自動ツイートできると、アプリの拡散・宣伝にも繋がるかもしれないな、と思い立ち、やってみることにしました。

# ツイート処理

こちらの記事が丁寧でわかりやすかったです。
[Google Apps Script (GAS) でTwitterへ投稿するだけの機能を実装してみる](https://qiita.com/akkey2475/items/ad190a507b4a7b7dc17c)

こちらを参考に、PUSHのタイミングでツイートもしてあげるとよいかと思います。
また、アプリの宣伝のためには、マーケットのURLもツイートに含めてあげる必要がありますが、URLが長すぎるといろいろ不都合が多いので、短縮URLを使ってあげます。

# URLの短縮

利用するサービスはこちら。
[Google URL Shortener
](https://developers.google.com/url-shortener/v1/getting_started?hl=ja)

GASから利用するには、スクリプトのメニュー「リソース」＞「Googleの拡張サービス」から、「URL Shortener API」をON(有効)にします。

次に、下記URLからコンソール上でもURL Shortener APIを有効にします。
https://console.cloud.google.com/apis/library/urlshortener.googleapis.com/?q=url

実際のコードはこちらの記事を参考にさせていただきました。
[［GAS］SpreadSheetで短縮URLを出力する関数（goo.gl編）](https://yhirano55.github.io/2015/09/20/6653458415122013571/)

```gas
API_KEY = 'xxxxxxxxxxxx';
function urlShortener(url) {
  var apiUrl  = 'https://www.googleapis.com/urlshortener/v1/url?key='+API_KEY;
  var payload = { longUrl: url };
  var options = {
        method: 'POST',
        contentType: 'application/json',
        payload: JSON.stringify(payload),
        muteHttpExceptions: true
      }
  var response = UrlFetchApp.fetch(apiUrl, options);
  if (response.getResponseCode() !== 200) {
    throw new Error('cannot shorten url.');
  } else {
    return JSON.parse(response).id;
  }
}
```

API_KEYは以下の手順で作成できます。
https://console.cloud.google.com/apis/credentials
「認証情報」タブ＞「認証情報を作成」ボタン＞「APIキー」から作成
作成済みの場合は認証情報タブにAPIキーとして記載されていると思います。

## 解析
Googleの短縮URLではクリック数などのも計測可能です。
https://developers.google.com/url-shortener/v1/getting_started

```gas
function shortUrlClickCount(shortUrl) {
  try {    
    // projection=FULL にするともっと細かい情報も取得可能です。
    var apiUrl = 'https://www.googleapis.com/urlshortener/v1/url?shortUrl=' + shortUrl + '&projection=ANALYTICS_CLICKS&key=' + API_KEY
    var response = UrlFetchApp.fetch(apiUrl);
    if (response.getResponseCode() !== 200) {
      throw new Error('cannot analyze shorten url.');
    } else {
      return JSON.parse(response).analytics['allTime']['shortUrlClicks'].toString();
    }
  } catch(e) {
    return e.toString();
  }
}
```
解析結果は下記のような配列で返却されます。

```json
({allTime:{shortUrlClicks:"1", longUrlClicks:"1"}, 
  month:{shortUrlClicks:"1", longUrlClicks:"1"}, 
  week:{shortUrlClicks:"1", longUrlClicks:"1"}, 
  day:{shortUrlClicks:"1", longUrlClicks:"1"}, 
  twoHours:{shortUrlClicks:"1", longUrlClicks:"1"}) 
```
期間がallTime/month/week/day/twoHours が用意されており、それぞれshortUrlClicksとlongUrlClicksが取得できるようですが、サンプルでは全期間の短縮URLクリック数のみ出力しています。
Gem 開発方法と気をつけることまとめ

# 概要

* Gem を作ったので、次以降のために覚えておきたいことをメモ

# 流れ

## ひな形作成

* `bundle gem foo` を実行
    * Gem 名に応じてひな形の構成も変わる
        * 推奨される命名規則: http://guides.rubygems.org/name-your-gem/
    * この構成自体は仕様ではなく、あくまで慣例。後述する gemspec で各種パス名を設定しているので、もっとヘンテコな構成やフォルダ名にもできるが、無論そうするメリットはない

## gemspec を修正

* 以下、ポイントだけかいつまんで説明

### spec.files

* Gem に含めたいファイルはここで全て指定する必要があるが、`bundle gem` でひな形を作るとデフォルトで git 管理しているファイルがすべて含まれるようになるので、あまり意識しなくてよい

### spec.require_paths

* この Gem を `require` したときに実際にロードするファイルのパス。デフォルトだと lib が指定されており、それが慣例なので従っておくとよい。主にこのパス配下にコードを書いていくことになる

### spec.executables

* rspec のようにコマンドラインから実行できるタイプの Gem を作る場合、実行したい Ruby スクリプトをここで指定する。これもデフォルトで exe 配下を全て含むように書かれているので、あまり意識しなくてよい

### spec.bindir

* 上述した `spec.executables` で指定した ruby スクリプトを探索するためのパス。デフォルトだと exe が指定されている。bin ではないので注意。 bin には Gem 開発中に使うコマンドを入れるとよい

### spec.add_runtime_dependency

* この Gem をインストールしたときに、ここで指定した依存 Gem があわせてインストールされる。不用意にバージョンを縛りすぎないように注意。個人的にはメジャーバージョンが変わらなければ OK くらいの指定がいいと思う

### spec.add_development_dependency

* minitest など、開発中にだけ使う依存 Gem をここに書く。Gemfile に書かないように注意。Gemfile 中の `gemspec` がこれを読み込んでくれるので、`bundle install` で普段通りインストールできる


## lib を実装

* lib 配下に .rb ファイルは1つだけにする（Gem名.rb）
    * Gem を `require` すると、先述した `require_paths` で指定したパス（今で言う lib/）が `$LOAD_PATH` に追加される（[参考](https://github.com/rubygems/rubygems/blob/master/lib/rubygems/core_ext/kernel_require.rb#L39)）。そのため、lib/ 配下に例えば erb.rb のようなファイルを置いてしまうと、`require "erb"` したときにそれがロードされるようになってしまう（＝ 一般的な [ERB](http://ruby-doc.org/stdlib-2.5.0/libdoc/erb/rdoc/ERB.html) がロードできなくなってしまう）。

```txt:ダメな例
.
└── lib
    ├── foo
    │   └── cgi.rb
    ├── erb.rb
    ├── foo.rb
    └── set.rb

# http://guides.rubygems.org/patterns/#loading-code より引用
```

* 他のファイルを読み込むのに `__FILE__` は使わなくていい
    * 前述の通り `require` した時点で lib/ が `$LOAD_PATH` に追加されているので、その前提に立って単純に `require` できる。例えば上記の「ダメな例」のような構成のとき、foo.rb 内で foo/cgi.rb をロードしたければ、単純に `require foo/cgi` と書けばよい

# その他メモ

## バージョン番号の付け方

* [Semantic Versioning](https://semver.org/) に従う
    * `MAJOR`.`MINOR`.`PATCH`
    * `MAJOR` : 後方互換のない機能追加があったらインクリメント
    * `MINOR` : 後方互換のある機能追加があったらインクリメント
    * `PATCH` : 後方互換のあるちょっとしたバグ修正があったらインクリメント

# 参考

* [RubyGemsはrequireの裏で何をやっているのか？ | ブログのおんがえし](http://ongaeshi.hatenablog.com/entry/20111214/1323830203)
* [RubyGems Guides](http://guides.rubygems.org/)
MySQL主要コマンド

備忘録です
###データベース一覧表示
```mysql> SHOW DATABASES;```

###データベースを作る
```mysql> CREATE DATABASE データベース名;```

###データベースを削除
```mysql> DROP DATABASE データベース名;```

###データベースをセット
```mysql> USE データベース名;```

###テーブルを表示
```mysql> SHOW TABLES;```

###「pet」というテーブルを表示
```mysql> DESCRIBE pet;```

###中身を表示、nameなどの属性が表示
```mysql> SELECT * FROM pet;```

###テーブルを編集する場合
###pet.txtを編集後
```mysql> DELETE FROM pet;```
```mysql> LOAD DATA LOCAL INFILE 'pet.txt' INTO TABLE pet;```

###nameを指定して、詳細をみたいとき
```SELECT * FROM pet WHERE NAME = 'Bowser';```

###レコードの挿入
```mysql> INSERT INTO mydb01
    -> VALUES ('tanaka','080-9988-7766');```
Project Euler Q74 【桁の階乗による連鎖】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
$145$は各桁の階乗の和が$145$と自分自身に一致することで有名である.

$1! + 4! + 5! = 1 + 24 + 120 = 145$

$169$の性質はあまり知られていない. これは$169$に戻る数の中で最長の列を成す. このように他の数を経て自分自身に戻るループは$3$つしか存在しない.

$169 → 363601 → 1454 → 169$
$871 → 45361 → 871$
$872 → 45362 → 872$

どのような数からスタートしてもループに入ることが示せる.

例を見てみよう.

$69 → 363600 → 1454 → 169 → 363601 (→ 1454)$
$78 → 45360 → 871 → 45361 (→ 871)$
$540 → 145 (→ 145)$

$69$から始めた場合, 列は$5$つの循環しない項を持つ. また$100$万未満の数から始めた場合最長の循環しない項は$60$個であることが知られている.

$100$万未満の数から開始する列の中で, $60$個の循環しない項を持つものはいくつあるか?

## 解答

```bash
time seq 999999 |
awk -v FS= '{printf $0" ";delete a;for(i=1;i<=NF;i++){a[$i]+=1};for(i=0;i<=9;i++){printf a[i]*1};print ""}' |
sort -k2,2n |
uniq -f1 -c |
awk 'BEGIN{a[0]=1;for(i=1;i<=9;i++){a[i]=a[i-1]*i}} {delete b;b[$2]=1;x=$2;c=1;while(1){s=0;for(i=1;i<=length(x);i++){s+=a[substr(x,i,1)]};if(s in b){break};b[s]=1;x=s;c++};print $1,$2,c}' |
sort -k3,3n |
awk '$3==60{s+=$1} END{print s}'
402

real	0m20.945s
user	0m23.641s
sys	0m0.367s
```

最初はループに入るとか、循環しない項とかの意味がわからなかったけど、一度出てきた数字までの項の数と解釈すればよいらしい。
なんとか自力で解けたので良かった。


## 答え合わせ
http://www.geocities.jp/oraclesqlpuzzle/csharp/csharp-euler-answers.html
Rails：AvtiveRecordのバグ？でメモリが解放されない問題をunicorn-worker-killerを入れて解決した

# 何があったか
APIの性能測定を行うべく数十万件のデータの全件取得を行った結果、pumaがハング。


「pumaダメじゃーん」とかろくに原因も調べずにpumaのせいにしていました。

その後、productionと同じnginx + unicornの組み合わせに変えて測定しなおした結果、同じくハング。
メモリ使用量を確認したら下記のような値が。

```
$ ps aux
hoge 31672 12.5 49.0 7306084 3926988 ? Dl 16:30 22:44 unicorn worker[1] -c /home/hoge/my_project/rails_app/config/unicorn.
```

7GB使ってるっていう。8GBしかないんですけど。

# 原因
ggってみた結果、どうもActiveRecordの問題らしいです。

参考： [Qiita - ActiveRecordがメモリを食って解放しない問題](https://qiita.com/dainghiavotinh/items/8158213207b257670ff3)


知らなかった。。ただ、該当のgithubとかのissueを見つけきれませんでした。

# unicorn-worker-killerを入れて解決した


## install
```ruby:Gemfile
gem 'unicorn-worker-killer'
```

```shell
$ bundle install
```

## config
自分の場合はproduction環境でのみunicornを使っているので、unicorn-worker-killerも同様にproduction環境でのみ動くように記述しました（環境指定しないと怒られました）。

```ruby:my_app/config.ru
# This file is used by Rack-based servers to start the application.

require_relative 'config/environment'

# 下記のif文を記述
if ENV['RAILS_ENV'] == 'production'
# Unicorn self-process killer
  require 'unicorn/worker_killer'
# Max requests per worker
  use Unicorn::WorkerKiller::MaxRequests, 3072, 4096
# Max memory size (RSS) per worker
  use Unicorn::WorkerKiller::Oom, (192*(1024**2)), (256*(1024**2))
end

run Rails.application
```



無事unicorn_worerを再起動する動きをしてくれて何回リクエストをしてもハングすることは無くなりました。
でも落としちゃうってワイルド過ぎない。

## 参考

* [Github - unicorn-worker-killer](https://github.com/kzk/unicorn-worker-killer)
* [zephiransasのチラシの裏 - unicorn-worker-killerが便利だった件](https://zephiransas.github.io/blog/2015/07/29/unicorn-worker-killer/)
* [tabosque - unicorn-worker-killerのエラーがdevelopment環境で出る時](https://www.tabosque.com/tech/134)

# まとめ
* ActiveRecord要注意
* 本番でunicorn使っているならunicorn-worker-killerがおすすめ
* pumaは悪くなかった
* ActiveRecordのメモリリークに関してご存知の方情報募集中です！

結構ヤバめな問題だと思うんですが、無料で利用させてもらっているのであまり偉そうなこと言えないですね。


# 追記

どういったリクエストを行っていたかについてもう少しだけ具体的に書くと、数十万件のデータを抱えるXXX APIに全件取得リクエストが成功した後、その他の数百件程度の比較的件数が少ない別のAPIたちに続けてリクエストを行っていると、いずれ動かなくなるというものです。

変なコードを書いてメモリリークさせちゃっている可能性も無くは無いです。
ただ、レスポンスが終わった後は必ずGCが働くんじゃないのと思っていて、もしそこらへんの自分の認識が間違っていると結構ヤバヤバです。
[Terminal]macで複数コマンドをまとめよう

terminal上で複数コマンドをいつもおんなじ順番で打つことありますよね。

簡単にまとめられるので、1つのコマンドにまとめておきましょう。

僕の場合だと、Herokuにuploadしてheroku上でDBの操作を色々まとめてやることが多いので、それ用にコマンドを作りました。

通常だと`.bashrc`、zshに変更された方は`.zshrc`にこのように追記します。

bash→zshに変更したい方は[こちら](https://qiita.com/dach1_ken/items/23b3ef3bd09dd2c268b3)

```sh:.bashrc/.zshrc
#herokuにuploadしてDBをresetしてmigrateしてseed_fuする
#ついでにsitemap-generatorでsitemapを更新しておく
#引数を入力する場合は()をコマンド名の後に入れる
#引数が複数ある場合、下記を参考にして指定する
#http://takuya-1st.hatenablog.jp/entry/2015/12/15/030119
function heroku_up() {　
 git push heroku master
 heroku pg:reset DATABASE --app $1
 heroku run rake db:migrate --app $1
 heroku run rake db:seed_fu --app $1
 heroku run rake sitemap:refresh --app $1
}

#rails起動前にpgを起動
function rails_pg_s {
  pg_ctl start -l logfile
  rails s
}
```

終わったらTerminalを再起動しましょう。

# 参考: 一つのコマンドをもっと短くしたい方

`alias`を使えば簡単に出来ます。

```sh:.bashrc/.zshrc
alias r=rails
```

便利な世の中ですねえ。
どんどん楽していきたい。
CentOS7に最新版のgitを導入してみた

### 最新版のgitの導入方法
yumでインストールすると古いバージョンが導入されてしまうので、最新版をDLしてソースをコンパイルして導入しました。

【参考URL】
[git公式HP](https://git-scm.com/book/ja/v1/使い始める-Gitのインストール)

```bash:手順
# 事前に必要なパッケージを導入しておく
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker

# 最新版のgitをダウンロード
wget https://www.kernel.org/pub/software/scm/git/git-2.16.1.tar.gz

tar -zxf git-2.16.1.tar.gz
cd git-2.16.1
make prefix=/usr/local all
make prefix=/usr/local install
git —version
# > git version 2.16.1
```
俺も自作のMac用アプリにイースターエッグを入れたい！！

# tl;dr

自作のmacOS用のアプリケーションに秘密のモードをつけてワクワクした人向けの記事です。

秘密のキーコンビネーションを押しながらアプリを起動したら…???　じゃじゃーん！

# イースターエッグ!!🐣

コンピューターの世界では昔からプログラマーがソフトウェアの中に✨**秘密の何か**✨を組み込むのが大好きだ。

それがゲームであれ、重要なソフトであれ、プログラマーはみんな隠し続けてきた歴史がある。

以下ではそれをちょっとだけ紹介する

## めくるめくイースターエッグの数々

### Windows 95
あの有名なWindows95には、フォルダー名をある一定の名前に変更していくと現れるイースターエッグが存在した。
軽快なサウンドとともに開発者の名前が横にスクロールしていく。

![hqdefault.jpg](https://qiita-image-store.s3.amazonaws.com/0/7161/64520a3c-8572-9bff-83cb-922112c2a0b4.jpeg)

https://www.youtube.com/watch?v=dtfBBNYdcPc

### Excel 95

ExcelといえばMSの稼ぎ頭。こんな真面目なソフトウェアによもやダンジョンが存在するなど誰が想像しただろう。おっこちたら最初からやり直しだ！

![images-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/7161/5216ac1e-7cf3-2d4c-15e9-88ef6f07baea.jpeg)


https://www.youtube.com/watch?v=nwg9eLHZZRo

### ResEdit

昔のMac OS(OS X以前)のアプリケーションには実際に走るバイナリなどを扱うデータフォーク、アイコンや画像などを扱うリソースフォークという形でアプリケーションが構成されていた。アイコンやその他のリソースをいじるためにResEditは存在した。こいつは古から存在するAboutメニューをShiftキーを押しながら選択すると以下のようなダイアログを表示するものであった。

http://www.mackido.com/EasterEggs/PR-ResEdit.html

![ResEditPigMode.gif](https://qiita-image-store.s3.amazonaws.com/0/7161/f642e4f8-1e64-0487-b120-e34f53f1c28b.gif)

## 俺もStart Pig-mode したい！

僕らのアプリにもこの古のブタちゃんを実装したい！というわけで、あるキーコンビネーションを押しながらAboutメニューを押したらStart pig-modeのダイアログを出すようにしてみる。

### swiftでキーコンビネーションを得る

手始めにCommand & Shift & Option キーのコンビネーションが押されているかを調べるコードを書く。

キーコンビネーションを取得するには**NSEvent.modifierFlags.contains**を利用し、ほしいキーの名前を渡す。


```
let cmdOptShift = NSEvent.modifierFlags.contains([
    NSEvent.ModifierFlags.command,
    NSEvent.ModifierFlags.option,
    NSEvent.ModifierFlags.shift
])
```

一度applicationDidFinishLaunching等に貼り付けて、Run時にcmd+opt+shiftを押しっぱなしにして結果を見てもらえるとわかります。

これを踏まえてAppDelegateに以下を用意。Storyboard中にあるメニューバーの、First Responderに接続されている**About [アプリ名]**のアクションを外し、このfuncに接続。

```AppDelegate.swift
    @IBAction func showAbout(_ sender: Any) {
        if (NSEvent.modifierFlags.contains([NSEvent.ModifierFlags.command, NSEvent.ModifierFlags.option,  NSEvent.ModifierFlags.shift])) {
            let alert = NSAlert()
            alert.messageText = ""
            alert.informativeText = "Start pig-mode?"
            alert.icon = NSImage(named: NSImage.Name(rawValue: "pig"))
            alert.addButton(withTitle: "OK")
            alert.addButton(withTitle: "Cancel")
            alert.runModal()
        } else {
            NSApp.orderFrontStandardAboutPanel(sender)
        }
    }
```

豚さんの画像はAssets.xcassetsにご自分でご用意ください。

あとはビルドしてRun、その後Cmd+Opt+Shiftを押しながら**About[アプリ名]**をクリック。すると・・・

<img width="532" alt="スクリーンショット 2018-02-03 18.08.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/7161/fde8db59-d196-7371-18ac-9d043ee16541.png">

じゃじゃーん！


# さてマジレスです。

なんでこんな記事を書いているかというと、アプリケーションを立ち上げる際にあるキーコンビネーションを押しながら立ち上げることで、設定画面に通常ならば見えないパネルを表示したいからでした。

Obj-Cのころは以下のようなコードでキーコンビネーションを調べていました。

```
BOOL optKeyDown = ((GetCurrentKeyModifiers() & (optionKey | rightOptionKey)) != 0) ? YES : NO;
```

が、**GetCurrentKeyModifiers**が利用不可能になっているのでやり方を調べていたところ、上のコードが出てきたのでメモがてら残しておきました。

# 最後に

イースターエッグだいすき！
CLLocationManagerの用例

#概要
iOSアプリにおいて端末の位置情報にアクセスする場合、CoreLocationフレームワークを使用することになります。その際のCLLocationManagerの使用例になります。

```swift:CLLocationManagerの用例
import Foundation
import CoreLocation

class LocationManager: NSObject {
    var locationManager: CLLocationManager
    var latitude: String?
    var longitude: String?
    
    override init() {
        locationManager = CLLocationManager()
        super.init()
        locationManager.delegate = self
    }
    
    func startUpdating() {
        locationManager.startUpdatingLocation()
    }
    
    func requestLocation() {
        if #available(iOS 9.0, *) {
            locationManager.requestLocation()
        } else {
            locationManager.startUpdatingLocation()
        }
    }
}

extension LocationManager: CLLocationManagerDelegate {
    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        if (status == .notDetermined) {
            // Show dialog to ask user to allow getting location data
            locationManager.requestWhenInUseAuthorization()
        }
    }
    
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        if let location = locations.first {
            self.latitude = String(describing: location.coordinate.latitude)
            self.longitude = String(describing: location.coordinate.longitude)
            
            print("Latitude:" + self.latitude! +  " Longitude:" + self.longitude! + " date:\(location.timestamp.description)")
        }
    }
    
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("# Failed to get location data.", error.localizedDescription)
    }
}
```

#注意点
CoreLocationフレームワークを使用する場合、下記のようにInfo.plistに位置情報取得に関する説明を追記する必要があります。ここに指定した文言がダイアログとして端末に表示され、ユーザは位置情報の使用を許可するか否かを選択することができます。

- アプリ使用時のみ位置情報を取得する場合

```
<key>NSLocationWhenInUseUsageDescription</key>
<string>＊＊＊＊のため、位置情報を取得します</string>
```

- 常に位置情報を取得する場合

```
<key>NSLocationAlwaysUsageDescription</key>
<string>＊＊＊＊のため、常に位置情報を取得します</string>
```
制御構文 演算子

#代表的な制御構文
　<dl> 
 <dd><strong>「順次、分岐、繰り返し」</strong></dd>
　　<dd>どんな複雑なプログラムも、上記３つの組合せで作成可能!</dd>
　</dl>

###*if文*
　　<dd><strong>条件式に一致した場合、処理を実行する</strong></dd>
#####　*基本構文*

```
if(条件式) {
	 条件式に一致時の処理；
   }else  
	 条件式に不一致時の処理;
}
```


###*while文*
<dd><strong>条件式に一致している間、処理を繰り返す</strong></dd>
#####　*基本構文*
```
while(条件式) {
	 条件式に一致時、繰り返す処理；
}
```
#####　*do while文*
```
do{
   繰り返す処理
}while(条件式);

```
<dd>実行してから条件式で評価するため、<strong>最低１回は処理が実行される</strong>。このことを<strong>後置判定</strong>という（↔︎前置判定）</dd>

###*for文*
<dd><strong>繰り返し回数を指定し、その回数処理を繰り返す</strong></dd>
#####　*for文の基本構造*

```
for (①int 変数名 = 初期値; ②変数名 < 繰り返す回数; ③繰り返し時処理) {
   　　　　繰り返す処理
}
```
<dd>　　①何周目のループか記録しておく変数を代入する。<strong>ループ変数</strong>という</dd>
<dd>　　②ループを継続するか否かを判定する条件式</dd>
<dd>　　③繰り返す処理を終えた後（"}"まで達した後）に実行される処理</dd>

#####　*ループ変数について*
<dd>　　・ブロック内の計算や表示に使用可</dd>
<dd>　　・for文外で使用不可</dd>

#####　*繰り返し処理の中断*
<dd>　　・<strong>break文</strong>と<strong>continue文</strong>で繰り返し処理を中断出来る</dd>
<dd>break文の基本構文(例：５回目で処理を中断する場合)</dd>
```
for (int i = 1; i < 10; i++) {
  if(i==5){
  break;
　}
繰り返す処理
}
```
<dd>continue文の基本構文(例：５回目のみ処理をしない場合)</dd>
```
for (int i = 1; i < 10; i++) {
  if(i==5){
  continue;
　}
繰り返す処理
}
```


###*switch文*
<dd><strong>判断条件が複数ある場合、ifより完結に記載出来る<strong></dd>
#####　*switch文の使用条件*
<dd> ・左右が一致するかを比較する条件であること</dd>
<dd>　　・比較する値が、少数や真偽値では無いこと</dd>

#####　*switch文の基本構文*


```
switch(変数名) {
	case 値1 :
　　　　　　　　　　　　　　　　　　変数が値１に一致時の処理
      break; /*breakで処理を終了させる
	case 値２ :
　　　　　　　　　　　　　　　　　　変数が値２に一致時の処理
      break;
    default :
　　　　　　　　　　　　　　　　　　変数が全値に不一致時の処理
}   
```

##制御構文の構成要素
　`if(条件式) {`
　　　　<strong>ブロック</strong>
　`}`  

####*条件式の特徴*
<dd>・条件式は評価結果が`true`または`false`でなければならない</dd>

####*条件式に文字列を使用する場合は・・・*
<dd>・`=("文字列")`では無く、`.equals("文字列")`</dd>

####*ブロックの特徴*
<dd>・ブロック内で宣言した変数は、宣言したブロック内でのみ有効</dd>
<dd>・変数が利用可能な場所の範囲を**スコープ**という</dd>

##関係演算子
<dd>条件式の中で用いられている記号</dd>
| 演算子 　　　　　　　　　　| 意味 | 
|:-----------|--------:|
| ==         |左辺と右辺が等しい|
| !=         |左辺と右辺が異なる|
| >          |左辺が右辺未満|
| <          |左辺が右辺以上|
| >=         |左辺が右辺以上|
| <=         |左辺が右辺以下|


##論理演算子
| 演算子 　　　　　　　　　| 意味 | 
|:----------|--------:|
|&&         |AND（かつ）|
|ll       |OR（または）|

##否定演算子
<dd>・条件式の前に！を付ける事で、条件式の値・true/falseを逆転させることが出来る</dd>
######　　　`if(!(name.equals("a")))`　→ name=a<strong>で無ければ</strong>
Raspberry Pi 3 AI実装 : TensorFlow/Keras/MobileNetsを用いた画像認識と日本語音声読み上げ

[![](https://img.youtube.com/vi/m_n_PJzSWMM/0.jpg)](https://www.youtube.com/watch?v=m_n_PJzSWMM)

| ドキュメント | 内容 |
----|----
| [README.md](https://github.com/yoshihiroo/programming-workshop/blob/master/rpi_ai_handson/README.md) | 機材購入ガイド、事前の準備 |
| [HANDSON_GUIDE.md](https://github.com/yoshihiroo/programming-workshop/blob/master/rpi_ai_handson/HANDSON_GUIDE.md) | ハンズオン当日に使うガイド。実装の詳細なステップ |
| [REFERENCES.md](https://github.com/yoshihiroo/programming-workshop/blob/master/rpi_ai_handson/REFERENCES.md) | ガイド作成にあたって参考にした外部情報、リンク |
Raspberry Pi Zero W + VisionBonnetアクセサリボード + Camera Module Version 1によるカメラ画像分類

[![](https://img.youtube.com/vi/-ZhVdgR4h6w/0.jpg)](https://www.youtube.com/watch?v=-ZhVdgR4h6w)

ディープラーニングを使ったカメラ画像認識をRaspberry Pi Zero W(以下Pi Zero)上に実装する。
Pi Zeroに[Vision Kit](https://aiyprojects.withgoogle.com/vision/)のVisionBonnet accessory boardをにアタッチすることで、ほぼリアルタイムな分類処理を実現する。
また、Vision Kit組み立てにはカメラモジュールのV2が必要となるが、今回はV1のカメラモジュールを用いて実装を行う。

[続きの詳細ガイド](https://github.com/yoshihiroo/programming-workshop/blob/master/aiy_vision_kit/CLASSIFICATION_CAM_V1.md)
[iOS] 画像を非同期で読み込む

#画像の読み込み
URLから画像を読み込み、完了した時点で画面に反映させたい場合があるとします。この場合、画像のロードは非同期で行い、完了した時点でメインスレッドにてUIの操作を行う方法が考えられます。

```swift:URLSessionを用いて画像を読み込み、完了時にClosure内の処理を実行する
class ImageLoader {
    func loadImage(url: URL, completion: @escaping (_ succeeded: Bool, _ image: UIImage?) -> Void) {
        URLSession.shared.dataTask(with: url) { (data, response, error) in
            if let data = data {
                completion(true, UIImage(data: data))
            }
        }.resume()
    }
}
```

#使用例
```swift
ImageLoader().loadImage(url: imageUrl) { (succeeded, image) in
    if (succeeded) {
        DispatchQueue.main.async {
            self.imageView.image = image
        }
    }
}
```

#注意点
UIの操作（ImageViewの更新）をバックグラウンドで行うと遅延やクラッシュの原因となるため、メインスレッドで行うようにしてください。
AppleScriptでシステム環境設定の句読点の種類を設定

## システム環境設定 ＞ キーボード ＞ 入力ソース ＞ 句読点の種類  
### 句読点の選択  
 『 。と 、 』  に設定してありますので必要に応じでコメントアウトを調整してください

* ``` click menu item 1 ``` 『 。と 、 』  
* ``` click menu item 2 ``` 『 。と , 』  
* ``` click menu item 3 ``` 『 ．と 、 』  
* ``` click menu item 4 ``` 『 . と , 』 


システム環境設定 ＞ セキュリティとプライバシー ＞ プライバシー ＞ アクセシビリティ
で制御を許可する必要があるかもしれません

```AppleScript
tell application "System Preferences"
	activate
	
	--キーボード
	set current pane to pane id "com.apple.preference.keyboard"
	
	tell application "System Events"
		tell process "System Preferences"
			tell window 1
				--入力ソース
				click radio button 4 of tab group 1
				
				--句読点の種類
				click pop up button 4 of scroll area 2 of tab group 1
				
				--句読点の選択
				
				-- 。と 、
				click menu item 1 of menu 1 of pop up button 4 of scroll area 2 of tab group 1
				
				-- 。と ,
				--click menu item 2 of menu 1 of pop up button 4 of scroll area 2 of tab group 1
				
				-- ．と 、
				--click menu item 3 of menu 1 of pop up button 4 of scroll area 2 of tab group 1
				
				-- . と ,
				--click menu item 4 of menu 1 of pop up button 4 of scroll area 2 of tab group 1
				
				
			end tell
			
		end tell
	end tell
	
	
end tell
```
Webpackでもモジュール統合がしたい

少し前にRollupを使ってみたところ、「モジュールごとに名前空間の関数を切るのではなく、各変数や関数の名前を変更してすべてを同じ名前空間に入れる」というシンプルさに感心したのですが、ある程度までは同様のことがWebpackでできることに気づきました。

# プラグインの用意

このような処理は、Webpackに[ModuleConcatenationPlugin](https://webpack.js.org/plugins/module-concatenation-plugin/)を入れることで実現可能ですが、Webpack 3には標準添付されています。ということで、使い始めるには`webpack.config.js`の`plugins`に`new webpack.optimize.ModuleConcatenationPlugin()`を書き足すだけです（なお、後述の理由により、Babelには`modules: false`などES6 Moduleの変換を止める設定が必要となります）。

また、従来は「ソースコードの1ファイル」=「Webpack後の1関数」=「1モジュール」で曖昧さはなかったのですが、1つの関数に複数のモジュールが入るようになったので、以降では「Webpack後の1関数」を「グループ」と呼ぶことにします。

# グループが切れるパターン

## 従来のように、ソースの1ファイルが1グループとなる場合（Prevent）

まず、`ModuleConcatenationPlugin`は **ES6 Module**が前提となっています。そのため、CommonJSの外部モジュールや、`exports`と`require`で書かれたCommonJSモジュールは、従来通り1ファイル1グループで切り出されます。

また、モジュール内で`eval`をやっているような場合や、`ProvidesPlugin`で定義のない変数を読み取るような場合も、スコープを広げるのは危険なので1ファイル1グループとなります。

## ある程度のモジュールをまとめたグループを形成する場合（Root）

Webpackには、モジュール分割を前提とした機能（動的`import`、HMR、チャンク分割など）がありますが、これらの機能を使う場合はもちろん同じ名前空間に混ぜ込むわけには行きませんので、きちんとグループの分割が行われます。

また、`import`以外の`require`やWebpack独自の方法で参照されるモジュールも、モジュール参照が関数実行である以上、そのまま展開することはできず、参照されたモジュールを返すようなグループを形成します。

さらに、何らかの理由でグループA、Bが分かれることが決定していた場合に、AとBの両方から同じモジュールを`import`していた場合、このモジュールCなども1つのグループを形成します。

# 実際にやってみる

動作が気になったのでいろいろやってみて、結果を[jkr2255/webpack-module-concat-test](https://github.com/jkr2255/webpack-module-concat-test)においてあります。実際にどんなコードが吐き出されるかも、確認しておくといいかもしれません。
javascriptのほにゃららeach系の違いについてまとめた。

javascriptでいろんなeachとついたメソッドがあるのは知っていて、なんとなく使っているけど、結局どれがいいのかわからない！！

とこの記事を読んでいる人は思っているんじゃないでしょうか？

僕もそんな状態なのでこの記事にまとめて理解を深めます。


## javascriptのeach系のメソッドってそもそも何があるの？
### $のeach

```javascript:sample.js
$.each(array, function(index, val) {
  //処理
  console.log(this) //thisはeach文で回している要素自体を指す
});
```

使える対象としては

- jQueryオブジェクト
- 配列
- 連想配列
- オブジェクト

があります。なんでも使える感じですね。

```javascript:sample.js
// jQueryオブジェクト
$.each($('.target'), function(index, element){
 //処理
});

//配列
$.each(array, function(index, value){
  //処理
});

//オブジェクト
$.each(object, function(key, value){
    console.log(key,value);
});
```

#### $のeachではループを抜け出せる

後述するforEach文ではループを抜け出すことはできませんが、こちらでは簡単にループを抜け出すことができます。

```return false```とすることでループを抜け出すことができます。


### jQueryのeach

```javascript:sample.js
$('ターゲット').each(function(index, value){
    //処理
});
```

これは

- jQueryオブジェクト

に対してのみ使うことができます。


### forEach

```javascript:sample.js
array.forEach(function(val, index, array){
   //処理
});
```

特徴的なのが、第3引数に```array.forEach```で指定した```array```がきているところです。
これってなんでいるのかな・・って言う
jQueryでは、thisは要素を指していましたが、forEachではコールバック内のthisが参照するオブジェクトを指定できます。つまり

```
array.forEach(function(val, index, array)
```

このかっこの最後のところのarrayを参照できる。

これ第3引数いらない気がします。

```javascript:sample.js
array.forEach(function(val, index){
   //処理
});
```

と書くのが普通に使うのにはいいでしょう。

#### 注意点

forEach文ではループから抜け出すことができません。
なのでforEach文は**絶対にループから抜け出したくないとき**に使うといいかもしれません。

### someのeach

ループから抜け出せるタイプのforEachです。

```javascript:sample.js
array.some(function(value,index){
   if(index==2) return false; // 処理を中断して次のループへ（continueと同じ）
});
```

ややこしいのが、
```return false```で次のループを実行して```return true```でループ自体を終了すると言うことです。

## 結局どれがいいの？

**jQueryが使える環境では$.eachが最適かなと思っています。**

forEachに関しては、jQueryが使えない環境や、ループから絶対に抜け出させたくないときに使うと言う感じでしょうか？



僕が調べた感じではこのような結論に至りましたが、間違いがあればそっと教えていただけると幸いです。
TeraTermマクロ作成方法


**作成前に事前にTeraTermのインストールが必要**

##用途
ログインの簡易化。ssh認証やパスワード認証を不要にし、クリックするだけでサーバー等へのログインが出来るようにする。※セキュリティ面に注意

##作成手順
###鍵認証の場合
**1.ローカル環境で、テキスト等に以下の内容を記述　※上3行のみ設定**

```
username = 'ログインユーザ名'
hostname = 'ログイン先のIPアドレス(例：192.168.0.1)'
keyfile = 'ローカルに保存された秘密鍵のパス(例：C:\Users\foo\path\to\secret_key)'

msg = hostname
strconcat msg ':22 /ssh /auth=publickey /user='
strconcat msg username
strconcat msg ' /keyfile='
strconcat msg keyfile
connect msg
```


作成したテキストを｢.ttl｣形式のファイル名で保存する

**2.ttpmacro.exeと関連付け**

ダブルクリックし、実行プログラムを選択する際に、teratermプログラム関連のフォルダ内にある、ttpmacro.exeを選択。

そのまま実行すれば、ログインできる






###パスワード認証の場合
**1.ローカル環境で、テキスト等に以下の内容を記述　※上3行のみ設定**

```
username = 'ユーザー名'
hostname = 'IPアドレス （例 192.168.200.130）'
password = 'パスワード'

msg = hostname
strconcat msg ':22 /ssh /auth=password /user='
strconcat msg username
strconcat msg ' /passwd='
strconcat msg password
connect msg
```


作成したテキストを｢.ttl｣形式のファイル名で保存

**2. ※ssh鍵ありの場合と同様**
VMwareの入った端末に他PCからログインする方法

VMWareのネットワーク設定は、デフォルトの状態では、ホストPC(VMWareを立てたPC)との接続しか出来ません。
外部PCからアクセスしたい場合は、ネットワーク設定の変更が必要になります。
***※前提条件として、ホストPCが、DHCP接続していること***
###設定
***準備***
VMWareが立ち上がっている状態では、設定の編集が出来ない為、事前にシャットダウンしておく

**1.仮想マシンの設定を開く**
以下のように対象の仮想環境を右クリックして開く
[![https://gyazo.com/a365c484e6f992c0ed1944eea9f6a432](https://i.gyazo.com/a365c484e6f992c0ed1944eea9f6a432.gif)](https://gyazo.com/a365c484e6f992c0ed1944eea9f6a432)

**2.設定の変更**
デフォルトでは、「NAT」にチェックが入っているので、「ブリッジ」に変更
[![https://gyazo.com/baf8e6a4600232dd930ff3435ae9882f](https://i.gyazo.com/baf8e6a4600232dd930ff3435ae9882f.gif)](https://gyazo.com/baf8e6a4600232dd930ff3435ae9882f)

###確認
VMWareを起動し、コンソール上で以下のコマンドを入力

```
[test@localhost ~]$ ifconfig
eth0      Link encap:Ethernet  HWaddr 00:00:00:00:XX:XX
          inet addr:192.168.X.XX  Bcast:192.168.X.XXX  Mask:255.255.255.0
          inet6 addr: XXXX::XXXX:XXXX:XXXX:XXXX/64 Scope:Link
          ・
　　　　　 ・
　　　　　 ・ 
```
DHCPによって割り当てられたIPがeth0のinetに設定されている。このIPで外部端末よりログインが出来るようになる
Latest Status for Good Morning

नमस्ते दोस्तों मै श्वेता परमार Reallifejokes में स्वागत करती हूँ , जैसा कि आप सब जानते हो आज कल सब <a href="https://reallifejokes.com/good-morning-status/">Good Morning Quotes</a> गूगल पर सर्च करते है तो हम आपके लिए Good Morning Quotes लाये है |Know more for <a href="https://reallifejokes.com/good-morning-status/">Click here</a>
コピペでできる RailsでTwitterAPIを使う 準備編

# はじめに
サービスの各種告知やプロモーションにTwitterを利用する人は多いのではないでしょうか？
Railsで作られたWebシステムからのTwitter操作が思った以上に容易に実装できるので紹介します。
今回は、まずTwitterAPIを利用するまでの準備にフォーカスを当てて解説します。

このシリーズでは、ソースをコピペするだけで機能を実装できることを目標に記述しています。


# 事前準備
- Twitterアカウントの作成（https://twitter.com/）

# TwitterAPIのアクセスキーを取得する
TwitterAPIにアクセスするためには以下の4つのキーが必要です。

- Consumer Key
- Consumer Secret
- Access Token
- Access Token Secret

取得手順を以下に記します。

## TwitterAppの登録
アクセスキーを取得するためには以下のページよりTwitter Appを登録する必要があります。
https://apps.twitter.com/

ボタンをクリックしてアプリケーションを作成します。
<img width="1290" alt="スクリーンショット 2018-02-03 18.45.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/34d112ef-fff3-892c-2ac9-5f70ff92df57.png">

必須事項を入力して次へ進みましょう。
英語だからって心を折らないように！
<img width="1282" alt="スクリーンショット 2018-02-03 18.47.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/21d385db-ed0e-b904-afc2-ad60b55257d4.png">
<img width="1246" alt="スクリーンショット 2018-02-03 18.48.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/1c8a297f-3332-e0e4-15b0-8f2e6398f343.png">
アプリケーションの作成はこれで完了です。

## キーの取得
Keys and Access Tokensタブよりキーが取得できます。
<img width="1270" alt="スクリーンショット 2018-02-03 18.52.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/d5eabae1-8429-6ec1-07fb-2c3a19fd4341.png">

「Consumer Key」、「Consumer Secret」はすでに表示されています。
<img width="1189" alt="スクリーンショット 2018-02-03 18.52.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/f696ae1e-e7c3-2b44-4d8f-28c041cb79b6.png">
「Access Token」、「Access Token Secret」はまだ作成されていません。
「Create my access token」ボタンをクリックして作成します。
<img width="1146" alt="スクリーンショット 2018-02-03 18.53.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/c76399ff-b0e0-1c5d-34c0-4478f8b23768.png">

クリックした後に以下のような画面になります。
<img width="1064" alt="スクリーンショット 2018-02-03 18.53.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/1d0ef8d0-1169-afee-b95e-e7916856c812.png">

以上で

- Consumer Key
- Consumer Secret
- Access Token
- Access Token Secret

4つのキーを取得できました。

# ライブラリの準備
さて、いよいよアプリ側の設定です。
Twitterクライアントの操作はGemに任せます。

https://github.com/sferik/twitter

```rb:Gemfile
gem 'twitter'
```

# クライアントの準備

GemのREADMEにも書いていますが割くほど取得した4つのキーを設定するだけでクライアントの準備は完了です。
https://github.com/sferik/twitter#configuration

```rb
client = Twitter::REST::Client.new do |config|
  config.consumer_key        = "YOUR_CONSUMER_KEY"
  config.consumer_secret     = "YOUR_CONSUMER_SECRET"
  config.access_token        = "YOUR_ACCESS_TOKEN"
  config.access_token_secret = "YOUR_ACCESS_SECRET"
end
```

# 準備完了
以上でTwitterAPIを使う準備は完了です。
次回以降は実際にAPI触りながら解説していこうと考えています！

ブログ記事で見たい方はこちら → <a href="http://nabesys.com/article/2018/02/03362/" target="_blank" rel="noopener">コピペでできる RailsでTwitterAPIを使う 準備編</a>
デバッグ時の自己証明書（オレオレ証明書）の回避方法

#概要
iOSアプリをStaging環境でテストする場合などに、サーバ側の証明書が自己署名証明書になっていると通信エラーが生じる場合があります。その場合、下記のようにiOSのプライベートAPIを利用することで証明書エラーを回避する方法があります。

```swift:自己署名証明書を回避する
#if DEBUG
    extension NSURLRequest {
        static func allowsAnyHTTPCertificate(forHost host: String) -> Bool {
            return true
        }
    }
    
    func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
        if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {
            if let serverTrust = challenge.protectionSpace.serverTrust {
                let credential = URLCredential(trust: serverTrust)
                completionHandler(URLSession.AuthChallengeDisposition.useCredential, credential)
            }
        }
    }
#endif
```

#注意点
プライベートAPIを使用したコードはリリースビルドに含むことはできない（ipaアップロード時に弾かれる）ので、DEBUGやSTAGING用のSchemeを用意して上記のようにif文で囲んでやる必要があります。
DBCAのサイレントモードでBIGFILE表領域を作る


#DBCAのサイレントモードでBIGFILE表領域を作るには？

CREATE DATABASE文には「SET DEFAULT BIGFILE TABLESPACE」が用意されており、SYSTEM、SYSAUX表領域をBIGFILEで作成することができます。

Oracle® Database管理者ガイド 12cリリース2 (12.2)　E72998-04
2 Oracle Databaseの作成および構成
2.5.9 データベース作成時のbigfile表領域のサポート
https://docs.oracle.com/cd/E82638_01/ADMIN/creating-and-configuring-an-oracle-database.htm#GUID-35A12594-29EB-4545-A6AD-63B9AC3A5671


DBCAをサイレントでデータベースを作成したい場合、dbcaのコマンドオプションやレスポンスファイルで作成するためのオプションが用意されていません。

DBCAのサイレントモードで作成するには、非シードのDBCAテンプレート(New_Database.dbt)を編集することで可能です。
具体的にはテンプレートファイルの中の`<TablespaceAttributes id="SYSTEM">`タグの中のBIGFILEを制御するタグを`<bigfile>true</bigfile>`に設定します。

なお、`<TablespaceAttributes id="SYSTEM">`と`<TablespaceAttributes id="SYSAUX">`のどちらかで設定しても
両方がBIGFILE　かつ　デフォルトの表領域設定もBIGFILEとなります。

SYSTEMおよびSYSAUX表領域は、常にデフォルトの表領域タイプで作成されるという仕様のためと考えられます。


#実行例

デフォルトで存在している「New_Database.dbt 」を「New_Database2.dbt」としてコピーして編集します。

```
cd /u01/app/oracle/product/12.2.0.1/dbhome_1/assistants/dbca/templates
cp New_Database.dbt New_Database2.dbt
vi New_Database2.dbt
```

SYSTEM表領域のbigfileをtrueに設定します。（★部分）

```
略
 <TablespaceAttributes id="SYSTEM">
         <online>true</online>
         <offlineMode>1</offlineMode>
         <readOnly>false</readOnly>
         <temporary>false</temporary>
         <defaultTemp>false</defaultTemp>
         <undo>false</undo>
         <local>true</local>
         <blockSize>-1</blockSize>
         <allocation>3</allocation>
         <uniAllocSize unit="KB">-1</uniAllocSize>
         <initSize unit="KB">64</initSize>
         <increment unit="KB">64</increment>
         <incrementPercent>50</incrementPercent>
         <minExtends>1</minExtends>
         <maxExtends>-1</maxExtends>
         <minExtendsSize unit="KB">64</minExtendsSize>
         <logging>true</logging>
         <recoverable>false</recoverable>
         <maxFreeSpace>0</maxFreeSpace>
         <bigfile>false</bigfile> ★
         <datafilesList>
            <TablespaceDatafileAttributes id="{ORACLE_BASE}/oradata/{DB_UNIQUE_NAME}/system01.dbf"/>
         </datafilesList>
      </TablespaceAttributes>
以下略
```

dbcaの「-templateName」に編集したテンプレート指定します。
レスポンスファイルは任意です。

```
dbca -silent -createDatabase -responseFile ./dbca.rsp -templateName /u01/app/oracle/product/12.2.0.1/dbhome_1/assistants/dbca/templates/New_Database2.dbt
```

DBが作成されたあと確認するとBIGFILEになっていることがわかります。

```
SQL> set sqlformat ansiconsole
SQL> select * from database_properties where PROPERTY_NAME='DEFAULT_TBS_TYPE'
  2  /
PROPERTY_NAME     PROPERTY_VALUE  DESCRIPTION
DEFAULT_TBS_TYPE  BIGFILE         Default tablespace type


SQL> select TABLESPACE_NAME,BIGFILE from dba_tablespaces
  2  where TABLESPACE_NAME in ('SYSTEM','SYSAUX')
  3  /
TABLESPACE_NAME  BIGFILE
SYSAUX           YES
SYSTEM           YES

```

#参考

Sh! – silent installation (DBCA)
https://www.spotonoracle.com/?p=155

Manually setting tablespace
https://www.ibm.com/support/knowledgecenter/en/SSBNJ7_1.3.2/com.ibm.tnpm.doc/Wireless_Deployment/ttnpm_wls_deployment_manually_setting_tablespace.html


http://oracle-l.freelists.narkive.com/NmvfWND0/question-about-bigfile-tablespaces-at-database-create-time
AKB２０１７総選挙ランキング上位者のFine-Tuning

#前回の記事

「乃木坂と欅坂メンバーをVGG16,VGG19,InceptionV3で転移学習してみた」
https://qiita.com/MuAuan/items/6c0e95ac7538ddc6c19a
から、少ないデータでも、転移学習すれば画像をフィッティングできることが分かった。
そこで、今回はAKB総選挙の上位者についてFine-Tuningしてみた。

###【参考】
【速報】AKB48総選挙2017の順位・結果・票数まとめ【1位：指原莉乃｜2位：渡辺麻友】
http://aikru.com/archives/2562/

###コードは以下に置いてある
https://github.com/MuAuan/DL-FineTuning

#手順
前回の教訓を生かしつつ以下の手順で実施した。
①AKB総選挙上位者の画像データをYahooから「名前」でそれぞれ６０個取得、画像にコンタミネーションがあるので、併せて「名前　顔写真」でさらに６０個取得、一般女性と男性のデータもそれぞれ取得
②ResNet50「９０層固定」で各カテゴリ６０個のデータに対して、フィッティング実施
③フィッティング実施後のモデルを使って、各カテゴリごとに一致率の悪い画像をデータから削除し、「名前　顔写真」で取得したデータから追加して、各カテゴリ６０個ずつにする
④ReNet50「１７４層固定」パラメーター②で、転移学習
⑤④のフィッティング実施後もカテゴリに属さないデータが存在したので、再度③⇒④のプロセスを実施
⑥ちなみに、③のあとResNet50「９０層固定」で実施した場合、Val_accのフィッティング率は上がらなかった※ここが実は謎

#結果
以下のとおり、
②の結果は以下のとおり、Trainデータの精度が出ているが、Testデータについて、全体で５４％であり、コンタミネーションの結果である。
![score_akb1.png](https://qiita-image-store.s3.amazonaws.com/0/233744/64f4b6e2-34c8-6cb7-57df-a077edf57740.png)
![val_acc.png](https://qiita-image-store.s3.amazonaws.com/0/233744/f5652967-e1f3-184a-4b64-b05c8b228168.png)
③の結果は、特にないが、②のパラメータでセレクト出来て、カテゴリ毎にはエラーはなくなる
④の結果は以下のとおり、今度はTrainデータ、Testデータ両者にエラーが発生したが、②に比べると大幅に減少して、フィッティング率は９５％程度まで上昇した
![score_akb2.png](https://qiita-image-store.s3.amazonaws.com/0/233744/6b6b8ec1-9ab7-c2eb-62b6-585927b72358.png)
![val_acc.png](https://qiita-image-store.s3.amazonaws.com/0/233744/72035faf-61cf-32d7-44ed-a7694a90e42e.png)
⑤の結果は、さらに精度は９９％台に上昇、エラーは全体で２件まで減少した。この２件は人の目だとそこにあるべきデータであるので、このデータ数では本来のエラーだと思う。
![score_akb3.png](https://qiita-image-store.s3.amazonaws.com/0/233744/09c83241-9341-3ed1-47d1-318f5cb5c991.png)
![val_acc.png](https://qiita-image-store.s3.amazonaws.com/0/233744/a9961f58-811f-7a3e-050f-23766f033571.png)

#まとめと課題
①Fine-Tuningと転移学習を利用すると、６０個／カテゴリで１８分類程度のカテゴリが多い場合も、フィッティング精度はデータ精査することにより、あげることができる。
②今回の成果は、データをあまり理解していなくても、自己組織的にフィッティングとデータスクリーニングを繰り返せば、一定の精度の識別器を作れることを意味している。
③【課題】Fine-Tuningだけだと、データ入れ替えしてエラーが消えても、Tuning後Testデータに対するエラーが７５％まで低下してしまった。
　　⇒ここはもう少し、追及して理解しておきたい

#今後の予定
①課題解決
②入力として、画像を送れば、ランキングや似顔絵を返信するサービスなどにする
※今回は、入力の元画像サイズは特に指定はないが、データサイズは（２２４、２２４）である
タイムゾーンと言語設定をよく忘れるのでメモしとく

##タイムゾーンの修正
地域ごとに標準時間は異なり、それらの標準時間帯をタイムゾーンという。
タイムゾーンの情報は、```/usr/share/zoneinfo```ディレクトリ以下のバイナリファイルに格納されている。
システムで利用するタイムゾーンは、上記のファイルを```/etc/localtime```にコピーすることで、設定できる。またその他にもいくつか方法があるので、紹介しておく。

**■zoneinfoのコピーの場合**

```
# cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
cp: `/etc/localtime' を上書きしてもよろしいですか(yes/no)? yes
```

**■シンボリックリンクの作成の場合**
シンボリックリンクを作成しても良い。その場合は、以下のコマンド。

```
# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

**■TZの設定**
タイムゾーンは、環境変数TZで設定することも出来る

```
# export TZ="Asia/Tokyo"
# echo $TZ
Asia/Tokyo
```

dateコマンドで、設定が反映されていることを確認

##言語設定
**■言語情報の変更**
manマニュアルやメッセージ等を日本語にしたい場合は、i18nファイルの設定を変更する。言語がen(English)になっている為、ja(Japan)に変更
```vi /etc/sysconfig/i18n```

1行目のLANGを日本語でUTF-8に変更

```
LANG="ja_JP.utf8"
SYSFONT="latarcyrheb-sun16"
```
HomebrewでCakePHP環境構築〜インストール編

#intlをインストール
CakePHPをインストールするためには、まず``intl``というものが必要らしい。

PHPのバージョンを確認し、``brew search``で該当するパッケージを確認後、インストールする。

```
$ php -v
$ brew search intl
$ brew install homebrew/php/php71-intl
```

今回``composer.json``の編集は行わなかった気がするが・・・どうやらパッケージの依存情報を定義するファイルらしい。

#ComposerでCakePHPをインストール
アプリケーションを作成したい場所（ディレクトリ）へ移動し、実際に作成する。今回は``testcake``という名前にする。

途中で``Set Folder Permissions ? (Default to Y) [Y,n]?``と聞かれるので、``Y``を入力して進める。

```
$ composer self-update && composer create-project --prefer-dist cakephp/app testcake

You are already using composer version 1.6.2 (stable channel).
Installing cakephp/app (3.5.1)
  - Installing cakephp/app (3.5.1): Loading from cache
Created project in testcake
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 47 installs, 0 updates, 0 removals
以下略
```

作成したアプリケーションのディレクトリへ移動し、PHPの組み込みウェブサーバーを起動する。

```
$ cd testcake
$ bin/cake server 

Welcome to CakePHP v3.5.11 Console
---------------------------------------------------------------
App : src
Path: /Users/yuki/workspace/testcake/src/
DocumentRoot: /Users/yuki/workspace/testcake/webroot
---------------------------------------------------------------
built-in server is running in http://localhost:8765/
You can exit with `CTRL-C`
```

ブラウザを開いて``http://localhost:8765/``にアクセスし、CakePHPの画面が開けば作業完了。もしくは別ターミナルで``curlコマンド``を使用して確認する。

```
$ curl -I  http://localhost:8765/
```

ちなみにCakePHPでは8765番ポートが使用されている。こちらも別ターミナルを開き、``lsofコマンド``で確認可能。

```
$ lsof -i:8765
```

終了は``Ctrl+C``で。
とりあえず、起動はできた。
Missing return statement less|phpstormでのwarning

以下の書き方はwarningをとりあえず解消したというメモ。
今後書き方を変えるか、設定を変えるかプロジェクトなどを基準に考えます。

#warning

```
Missing return statement less... (Ctrl+F1) 

The inspection is intended to point at the following types of inconsistencies:
The function/method contains return statements with arguments as well as without them
The function/method may happen to return a value or end it's execution without a return statement at all
The function/method is declared void but contains return statements with arguments
Technically these are not errors but practically usually indicate programmer’s mistakes.
```

#ソース
```php:php
function get_user_name() {
	$current_user = wp_get_current_user();

	if ( isset( $current_user->user_login ) ) {
		$user_name = $current_user->user_login;

		return $user_name;
	} 
}
```

#原因
if文のelseの動作でreturnがnullを返すと明示的に指定しないといけないというエラーらしい。
「文法的には間違いではないのでこのエラーチェックが不要だったら設定してね」という
気の利いたコメントも出力されておりました。

#修正ソース
以下のように修正したらwarning消えました。


```php:php
function get_user_name() {
	$current_user = wp_get_current_user();

	if ( isset( $current_user->user_login ) ) {
		$user_name = $current_user->user_login;

		return $user_name;
	} else {
		return null;
	}
}
```


個人的な経験談では上記のような書き方は見たことがないのですが
これは設定を変えたほうがいいのでしょうか。。。