OmniAICreator/Qiita-1.07M huggingface dataset:
Javaでメール送信したい。


どうやったらいいんだろう...と探していたところ、
Apache Commons Emailが良さそうだったので、これを使う事にした。

プロジェクトでApache Commons Langも使ってるし、
変なライブラリ入れるよりは、これの方が統一感あっていいかなと。

##使い方①
[サンプルコード](https://commons.apache.org/proper/commons-email/userguide.html)があるのであるので、とりあえずコピペ。

```java
Email email = new SimpleEmail();
email.setHostName("smtp.googlemail.com");
email.setSmtpPort(465);
email.setAuthenticator(new DefaultAuthenticator("username", "password"));
email.setSSLOnConnect(true);
email.setFrom("user@gmail.com");
email.setSubject("TestMail");
email.setMsg("This is a test mail ... :-)");
email.addTo("foo@bar.com");
email.send();
```

サンプルコードを見てると、googleのメールサーバを使って送信するようになってる。
なので、自分のGoogleの情報を使って、以下を修正する。
- `username` ...........Googleにログインする時のユーザID
- `password` ...........Googleにログインする時のパスワード
- `user@gmail.com` .....Googleのメールアドレス
- `"foo@bar.com"` ......送信先のメールアドレス(※他人のメールアドレス使っちゃダメだよ！！！)

そして実行。

これだけ！
シンプル！
素晴らしい！
Congratulations！



##使い方②：添付ファイル付与

```java
Email email = new SimpleEmail();
```

これだとファイルが添付できない。
ファイルを添付するには.....これも[サンプルコード](https://commons.apache.org/proper/commons-email/userguide.html)がある。

```java
// Create the attachment
EmailAttachment attachment = new EmailAttachment();
attachment.setPath("mypictures/john.jpg");
attachment.setDisposition(EmailAttachment.ATTACHMENT);
attachment.setDescription("Picture of John");
attachment.setName("John");

// Create the email message
MultiPartEmail email = new MultiPartEmail();
email.setHostName("mail.myserver.com");
email.addTo("jdoe@somewhere.org", "John Doe");
email.setFrom("me@apache.org", "Me");
email.setSubject("The picture");
email.setMsg("Here is the picture you wanted");

// add the attachment
email.attach(attachment);

// send the email
email.send();
```

ファイルが配置されているパスを指定してあげるだけという、非常にシンプルな構成。
素晴らしい。

けど、これだとファイルを一件しか添付できない。
複数ファイルを添付するにはどうしたら？？？？？？？？？？？？
と思って調べてたらこんな記事があった。
[http://d.hatena.ne.jp/hiro_nemu/20091109/1257760767](http://d.hatena.ne.jp/hiro_nemu/20091109/1257760767)

添付したいだけnewして、`email.attach(attachment)`してあげればいいだけみたい。
素晴らしい。


##結論
Apache Commons 素晴らしい。
苦しんで覚えたEclipse（STS）のショートカットキー（随時更新）

# はじめに
最近Javaを合間に勉強していて、Springを使って何か作りたいと思ってもいるので、STSをインストールしてJavaを勉強しています。

### STSとは
EclipseベースのSpring用のIDEです。

## 困ったこと
最初に困ったことは、ショートカットキーが使えない、、、
正確には、「使えるけど自分のこれまで使っていたエディタとちがいすぎた、、、」ですね。
普段はAtomでRubyを書いていたりするのですが、Atomと同じようにショートカットキーを使おうとすると動作しない or 意図しない動作をする´・ω・)っﾌｩ･･･

とはいえ、ショートカットキーなしには生きていけない、、

## ということで
調べながら覚えたEclipseのショートカットキーをここに載せていこうと思います。
ちなみにMacでのショートカットキーになります。
随時更新していきます。


# ショートカットs
それでは身に付けたショートカットたちをご紹介。

## ファイル関連
ファイルに関係するショートカットs

### ファイル検索（shift + command + R）
ファイル多いので、検索したいのです。押しづらいのですが、、、慣れですかね

![d028f36a0de63d7523f93e3a7288057d.gif](https://qiita-image-store.s3.amazonaws.com/0/45577/e6333192-8748-21f2-9500-8d5413949b77.gif)

## その他
### コメントアウト（command + /）
コメントアウト自体の説明はしません。
以下のコマンドでコメントアウトできます。

### 指定した行に移動（command + L）
特定の行に移動したい場合に使えます。

### 1行削除（command + D）
カーソルがある行を1行削除できます。

### インデントの追加（行を選択後に、tab）
ショートカットといえるか微妙ですが、インデントを加えたいときに`command + ]`でできなかったので載せておきます。
【nginx】WORKER_CPU_AFFINITYの設定 


###	core数に応じた設定が必要

```nginx.conf
#4coreの場合
worker_processes 4;

worker_cpu_affinity  0001 0010 0100 1000
```


### 詳細
http://nginx.org/en/docs/ngx_core_module.html#worker_cpu_affinity



| CORE| WORKER_CPU_AFFINITY |
|------- |------------|---------------------|
|2|01 10|
|3|001 010 100|
|4|0001 0010 0100 1000|
|8|00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000|



`worker_cpu_affinity : auto` 設定は、nginx 1.9.10 からサポート
Webサーバのアクセスログで統計が取りたいのでデータベースに投入しようと思って足掻いてみた

#はじめに
　(元々統計とか取る気も無いので)アクセスログを普通にテキストでアーカイブしてただけのようなWebサーバのアクセスログの詳細な解析が急に必要になってしまった…みたいなことはありませんか? 私はあります。
　極めて泥臭い作業ではありますが、何かの参考になれば。
　(※MySQLに依存した命令/機能を使っていますので他DBの方は適宜同等の機能に読み替えてください)
# 前準備
```mysql
CREATE TABLE `LOGDUMP` (
  `a` varchar(255) DEFAULT NULL,
  `b` varchar(255) DEFAULT NULL,
  `c` varchar(255) DEFAULT NULL,
  `d` varchar(255) DEFAULT NULL,
  `e` varchar(255) DEFAULT NULL,
  `f` varchar(255) DEFAULT NULL,
  `g` varchar(255) DEFAULT NULL,
  `h` varchar(255) DEFAULT NULL,
  `i` varchar(255) DEFAULT NULL,
  `j` varchar(255) DEFAULT NULL,
  `k` varchar(255) DEFAULT NULL,
  `l` varchar(255) DEFAULT NULL
); 
```
とりあえずこういう(とてもやっつけな)テーブルを作っておきます。
#データ投入
コンソールから

```shell-session
mysql -u 《ユーザID》-h 《ホストIP》 "-p《パスワード》" 《スキーマ名》 -e "LOAD DATA LOCAL INFILE '《ログファイル》' INTO TABLE LOGDUMP FIELDS TERMINATED BY '\"'"
```
…とやると、ログファイルの内容が先程のテーブルに投入されます。ですが、投入されただけでこのままでは使い物にならないのでSQLで整形します。

```mysql
SELECT
	b AS IP,
	SUBSTRING_INDEX(TRIM(SUBSTRING(c, 1, LOCATE('[', c) - 1)), ' ', 1) as CRIENTUSER,
	SUBSTRING_INDEX(TRIM(SUBSTRING(c, 1, LOCATE('[', c) - 1)), ' ', -1) as AUTHUSERID
	STR_TO_DATE(SUBSTRING(c, LOCATE('[', c) + 1), '%d/%M/%Y') AS DATE,
	TIME(STR_TO_DATE(SUBSTRING(c, LOCATE('[', c) + 1), '%d/%M/%Y:%H:%i:%s')) AS TIME
	SUBSTRING_INDEX(d, ' ', 1) AS METHOD,
	RTRIM(SUBSTRING(SUBSTRING_INDEX(d, ' ' ,- 2),1,LOCATE(' ',SUBSTRING_INDEX(d, ' ' ,- 2)))) AS FILE,
	SUBSTRING_INDEX(d, ' ' , -1) AS PROTOCOL,
	SUBSTRING_INDEX(TRIM(e), ' ', 1) AS STATUSCODE,
	SUBSTRING_INDEX(TRIM(e), ' ' , -1) AS SIZE,
	f AS REFERRER,
	h AS UA
FROM
	LOGDUMP 
```
　世にもおぞましい吐き気のするクエリですが、用は成します。
　(※これはApacheの標準のログフォーマットに合わせてありますので、フィールドをカスタマイズされている方はLOGDUMPテーブルの中身を見ながら適宜調整してください)
　いちいちこんなクエリを発行したくは無いので、頭にCREATE TABLE文でも付けて別テーブルに流したほうが良いと思います。
　後は時間帯でGROUP BYするなり如何様にでも調理出来るでしょう。
Revelのバージョンアップ


Revel v0.13.1 (2016-06-06)からRevel v0.15.0 (2017-05-11)にアップデートしたときのメモ

```bash
$ go get -u github.com/revel/revel
$ go get -u github.com/revel/cmd/revel
$ revel version
~
~ revel! http://revel.github.io
~
Version(s):
   Revel v0.15.0 (2017-05-11)
   go1.8.3 darwin/amd64
```

以上！

`github.com/revel/cmd/revel`を更新するが抜けてて、ハマりました。
pythonの関数の引数を1つの変数にまとめる


こんにちはsekitakaです。
pythonで引数の数が多い関数で引数を1つのdictにまとめて使用する方法です。
`**`演算子を使用することでdictが展開できるみたいなので、それを利用して以下のようにかけます。

```python
def my_function(foo, bar):
    print "foo is {0}, bar is {1}".format(foo, bar)


params = {
    'foo': 'FOO',
    'bar': 'BAR',
}

# paramsのfooを引数のfooとして、barも同様に渡す
my_function(**params)
```

ifで一部の引数の値だけ変更とかしやすくていいですね。
Decodableでenumに変換する

これで行ける気がする？

```swift
enum City: String {
	case tokyo = "東京"
	case osaka = "大阪"
	case nagoya = "名古屋"
	case sapporo = "札幌"
	case fukuoka = "福岡"
	case other
}

struct Address: Decodable {
	let city: City

	static func decode(_ json: Any) throws -> Address {
		let city = try City(rawValue: json => "city") ?? .other
		return try Address(city: city)
    }
}
```

（↓outdated。rawType持つenumにargument宣言できないw）

```swift
enum City: String {
	case tokyo = "東京"
	case osaka = "大阪"
	case nagoya = "名古屋"
	case sapporo = "札幌"
	case fukuoka = "福岡"
	case other(String)
}

struct Address: Decodable {
	let city: City

	static func decode(_ json: Any) throws -> Address {
		let city = try City(rawValue: json => "city") ?? .other(json => "city")
		return try Address(city: city)
    }
}
```
DockerのCentOSにPython3をインストールしてDCGAN-tensorflowを試してみる話 2017年5月版

#はじめに
最近流行のディープラーニングで画像解析を気軽に試せないかと調べてたらDCGAN-tensorflowなるツールを発見！
とりあえず理論は後回しにてEC2のインスタンスを立ち上げセットアップを行うも環境構築が上手くいかない。
WEBの情報は若干古くツールのバージョンアップに追いついていないようだ。
そこでトライ＆エラーを簡単に繰り返せるようにDockerを使うことにした。
ちなみにDockerの環境構築についてもWEBの情報は若干古くそのままでは上手くいかなかったけど試行錯誤の結果、学習コマンドがエラーを吐かないところまでこぎつけることができた。

ここに書いてあるのは2017年5月時点のお話なので数か月後には上手くいかない可能性があるよ。

#参照したいサイト
下記のサイトを参照させていただきました。ありがとうございます。

- [Docker上のCentOSにPython3と、関連ライブラリpip, virtualenvとフレームワークDjango, bottle, Flaskのインストール！これらをまとめたDockerfile付き！](http://qiita.com/RyosukeKamei/items/eca9687162b7fe122094)
- [DCGAN-tensorflowで自動画像生成をお手軽に試す](http://qiita.com/shu223/items/b6d8dc1fccb7c0f68b6b)

#DockerにCentOSをインストール
最初からPythonやTensorFlowが入っているDockerイメージもあるのだけどベースになるOSがUbuntuになっている。
CentOS派のボクにはしっくりこなかったのでCentOSのイメージから構築することにした。

##Dockerをインストール
まずはDockerをインストール。root権限で必要であればupdateをしてから。

```
sudo su
yum update
yum install docker.io
```

##Dockerデーモンを起動
各種Dockerコマンドを実行したときにDocker起動していないよというエラーがでたらコレ。

```
/etc/init.d/docker start
```

##Docker用のCentOSイメージを取得
pullコマンドでイメージをダウンロードします。200MB弱あります。

```
docker pull centos
```

##CentOSイメージからコンテナを起動
これでDockerのCentOS環境に入ります。

```
docker run -it centos
```

#DockerのCentOSに環境構築
基本的に以下のページに記載の内容で構築ができた。
>[DCGAN-tensorflowで自動画像生成をお手軽に試す](http://qiita.com/RyosukeKamei/items/eca9687162b7fe122094)

しかしながらpipのバージョンが低かったのでreadlineのインストールで失敗します。以下のコマンドでpipのアップグレードを実行。バージョンを指定したいのでpip3としています。

```
pip3 install --upgrade pip
```

#TensorFlowをインストール
pipでインストールするだけ。今後も実行するPythonはPython3にしたかったのでこれ以降も明示的に指定している。

```
pip3 install tensorflow
```

#DCGAN-tensorflowをインストール
基本的に以下のページに記載の内容で構築ができた。
>[DCGAN-tensorflowで自動画像生成をお手軽に試す](http://qiita.com/shu223/items/b6d8dc1fccb7c0f68b6b)

GitHubで公開されているのでダウンロードする。

```
git clone https://github.com/carpedm20/DCGAN-tensorflow.git
```

ダウンロードしたディレクトリに移動し以下のコマンドを打つとエラーになる。

```
python3 download.py celebA
```

```
Traceback (most recent call last):
  File "download.py", line 20, in <module>
    from tqdm import tqdm
ImportError: No module named 'tqdm'```
```

このようなエラーが表示された場合は、記載されているコマンドを都度インストールしていく。記載しないがmain.py実行時もエラーがでた場合は同様にインストールする。

```
pip3 install requests
pip3 install tqdm
・・・
```

データがダウンロードされるとdataディレクトリに保存されます。この状態で以下のコマンドを実行すると学習が実行されるはずだがエラーになります。

```
python3 main.py --dataset celebA --input_height=108 --train --crop
```

download.pyと同様にエラーが出た場合はpipコマンドで都度インストールしていくのだけど1つだけ異なるエラーがでた。WEBで調べた結果以下のコマンドをインストールすることで解決。

```
pip3 install pillow
```

#おわりに
これでデモ用のデータを実行できる環境が整った。再度上記のmain.pyコマンドを実行すると学習が開始された！

しかしながらEC2のmicroインスタンスだと待てど暮らせど終わらない。次はGPU付きのインスタンスで試してみたいが料金はいくらになるのだろうか。。。
日本語で書いたエクセルファイルをJAVAベースのシステム化する裏技

![wfc20161109051.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/02b8ce27-d7a6-2ef1-58c3-f114d7825d74.jpeg)


このような感じでエクセルのシートを作成します。

実際はもっといろいろなシートがあるのですが、詳しくはサンプルが配布されているのでそちらをご確認ください。

これをSaaSForceの一括取り込みと言う機能を使ってアプリ化します。


【ステップ1】

![wfc20161109047.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/3dc02f26-eb6f-5ab0-3892-c376b178b5a3.jpeg)

上のボタンを押すと、テスト用のファイルがダウンロードできます。

アレンジして、自分なりのものに作り変えることも可能です。

そのファイルを段ロードに成功したら、「システム設計書取込」のボタンを押すと次の画面がポップアップします。

![wfc20161109048.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/25bfbc0f-5833-1512-1fb4-8a05ba6fd8f5.jpeg)

「自動メニューに追加」のラジオボタンを｢追加する」を選択して緑色の｢システム設計書取込」を押すと、ファイルの変換が始まります。

【ステップ2】

![wfc20161109049.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/724ece50-5418-aa75-bec9-a338f838da27.jpeg)

「画面レイアウト作成」の画面を開けて、編集をクリックすると、別画面で｢画面デザイン｣が開かれます。

それで、元のファイルとほぼ同じ物が生成されていることを確認したら終わりです。

あとは、テストサーバーで動作確認をするだけです。


現時点では、エクセルファイルは加工するぐらいしか私の場合はいじれませんが、確かにエクセルでアプリを作れることは確認できました。
Embedded framework使用時の肥大化問題

#Embedded framework使用時のアプリ肥大化問題解決方法

##概要
SwiftにてEmbedded　frameworkを使ってレイヤー分割して実装しているのですが、
思わぬ落とし穴がありました。。
Swift Standard Libraryをターゲット単位に梱包してしまい、
ipaの容量が肥大化してしまっていました。。

環境
Xcode8.3.2

##原因
各フレームワークでSwift Standard Libraryを梱包していた為肥大化していた

##解決方法
各フレームワーク、BuildSettingのALWAYS_EMBED_SWIFT_STANDARD_LIBRARIESをNOに変更。

![スクリーンショット 2017-06-02 15.36.36.png](https://qiita-image-store.s3.amazonaws.com/0/68719/89b3ff29-631f-090a-b911-8b74a2b940d3.png)

結果としてipaが変更前は46MBから14MBまで下げることができました。

##感想
この肥大化に気づいた時危うくEmbedded　frameworkをやめて、
名前空間を使うのを諦めるかと思いましたが調べると解決作はあるものだなと思いました。
サイトリニューアルで古くなったURLから新しいURLにリダイレクトする処理をスタイリッシュに実装する


URLを変更したときは、ブックマークしてくれているユーザーがいたり、外部サイトからのリンクがあることを考慮して、変更前のURLから変更後のURLにリダイレクトすることが一般的です。
具体的な例をあげると、WebサイトのリニューアルにともないURLを変更するシチュエーションで、変更前のURLにアクセスがあったら変更後のURLにリダイレクトをかけるようなケースです。

# こんな人におすすめ

- 変更前のURLから変更後のURLにリダイレクトする方法が知りたい
- routes.rbで1行ずつリダイレクトを書くのはダルいしダサいと思っている人

# 実装方針

大きく分けると次の2つの実装があります。

1. routes.rbで1つずつリダイレクトしてあげる

` get ':author_name/articles/:id' => redirect("/articles/:id") `

2. リダイレクトするURLをモデルで管理して、routes.rbで管理しているURLを全てリダイレクトしてあげる


routes.rbで1つずつリダイレクトしてあげるのは面倒ですし、かっこ悪いので2.の方法で実装します。

# 実装

まずは修正前のURLとリダイレクト先のURLを管理するモデルを作成します。

app/models/redirection.rb

```
 +class Redirection < ActiveHash::Base
 +  self.data = [
 +    {id: 1, before:'/blog/posts', after:'/' },
 +    {id: 2, before:'/blog/posts/2', after:'/' },
 +    {id: 3, before:'/blog/posts/4', after:'/' },
 +    {id: 4, before:'/blog/posts/5', after:'/' },
 +  ]
 +end
```

redirectionモデルからデータを取得してルーティングに追加します。

config/routes.rb

```
 +  Redirection.all.each do |redirection|
 +    get redirection.before.to_s => redirect(redirection.after.to_s)
 +  end
```

上記の修正後に修正前のURLにアクセスして修正後のURLにリダイレクトされればOKです。

# 参考

- [このブログのリダイレクトを対応した時のdiff](https://github.com/tackeyy/blog/commit/c03bfffce72b92189a81569b35e9e61883b9dd29)

- [railsで煩雑なリダイレクトの管理](http://blog.attracie.com/entry/2016/12/16/180329) というブログでも紹介されています。

この記事と同じ方針でリダイレクト処理を行うやり方が記載されています。
上記のブログとこの記事では以下の点が異なります。

1. 管理画面からURLのリダイレクトの設定ができるようにしていない
そもそも頻繁にURLのリダイレクトの設定を行わないため、この記事では管理画面からリダイレクトの設定をできるようにしていません。

2. ModelはActiveRecordではなくActiveHashを利用している
管理画面からリダイレクトの設定をできるようにしていないので、リダイレクトのデータを変更することはほぼありません。
そのためデータはDBで持つのではなく静的に持ちたいのでActiveHashを利用しています。

# その他

[ブログ](http://tackeyy.com/)からの転載です。
Canvasに描かれている画像をDLする方法

# はじめに
HTML5から導入されたCanvas。このCanvasを画像として保存したいということがありました。
その辺をどうやったかを書いていきます。

# いいかわからないけど方法

jQueryは必須です。

```js
// 保存のためのaタグを用意
var paragraph = $('<a id="download" href="#", download="0.jpg" >Download</a>');
$('body').append(paragraph);

// Canvasからデータを抽出
var type = 'image/png';
var canvas = document.getElementById('canvas_id');
var data = canvas.toDataURL(type);
var bin = atob(data.split(',')[1]);
var buffer = new Uint8Array(bin.length);

for (var i = 0; i < bin.length; i++) {
  buffer[i] = bin.charCodeAt(i);
}

// 画像データをblob使ってurl化する(?)
var blob = new Blob([buffer.buffer], {type: type});
var url = window.URL.createObjectURL(blob);

// blobでurl化した画像データをaタグのクリックによりDLできるようにする
var downloader = $('#download');
downloader.attr('href', url);
downloader.attr('download', currentNum+'.png');

// クリックイベントを発火させる
document.getElementById('download').click();
```

こんな感じなりました、いい方法かはわかりません。
もしいい方法があったら教えてください
MsgPackの検証

下記ソースだと
var serializer = MessagePackSerializer.Get<ABC>(context);　の行で
実機でAOTエラーになる。

■テストクラス

```
using System.IO;
using System.Collections;
using System.Collections.Generic;

using UnityEngine;

using MsgPack;
using MsgPack.Serialization;

public class test : MonoBehaviour {

	public class ABC
	{
		public int aaaaa;
		public int bbbbb;

	}

	// Use this for initialization
	void Start () {
		Debug.Log ("***********************");
		MessagePackSerializer.PrepareType<object> ();
		Debug.Log ("?????????????????????????");
	}
	

	public void OnClickButton()
	{
		Debug.Log ("0");
		var test = new ABC ();
		test.aaaaa = 0;
		test.bbbbb = 1;
		var stream = new MemoryStream();

		Debug.Log ("1");

		// --- シリアライズ
		var memoryStream = new MemoryStream();

		Debug.Log ("2");
		var context = new SerializationContext();
		context.SerializationMethod = SerializationMethod.Map;

		Debug.Log ("3");
		// シリアライズした結果をMemoryStreamに書き込み
		var serializer = MessagePackSerializer.Get<object>(context);
		Debug.Log ("4");
		serializer.Pack(memoryStream, test);

		Debug.Log ("abcde");
	}
}

```


■ライブラリ
Msgpack 0.8.1

■開発環境
Unity5.5.1f1
Xcode8.2

●実機
iPhone5se
iOS10.1


■パターン１：MessagePackSerializer.PrepareType<ABC> ();　をテストクラスに追記する

●結果：MessagePackSerializer.PrepareType<ABC> (); でエラーになる。

```
void Start () 
{
	Debug.Log ("***********************");
	MessagePackSerializer.PrepareType<ABC> ();
	Debug.Log ("?????????????????????????");
}

```

■パターン２：MessagePackSerializer.PrepareType<int> ();　をテストクラスに追記する


●結果：エラーにならない

```
void Start () 
{
	Debug.Log ("***********************");
	MessagePackSerializer.PrepareType<int> ();
	Debug.Log ("?????????????????????????");
}

```

■パターン３：MessagePackSerializer.PrepareType<object> ();　をテストクラスに追記する


●結果：エラーにならない

```
void Start () 
{
	Debug.Log ("***********************");
	MessagePackSerializer.PrepareType<object> ();
	Debug.Log ("?????????????????????????");
}

```

■パターン４
　テストクラスを下記に変更。

```
　var serializer = MessagePackSerializer.Get<ABC>(context);
　↓
　var serializer = MessagePackSerializer.Get<object>(context);
```

　serializer.Pack(memoryStream, test);の行で下記エラーが発生

　ExecutionEngineException: Attempting to call method 'MsgPack.Serialization.SerializationContext::GetSerializer' for which no ahead of time (AOT) code was generated.
  at System.Reflection.MonoMethod.InternalInvoke (System.Object obj, System.Object[] parameters, System.Exception& exc) [0x00000] in <filename unknown>:0


■パターン５
　テストクラスを下記に変更。

```
  serializer.Pack(memoryStream, test);
　↓
　serializer.Pack(memoryStream, (object)test);
```

　serializer.Pack(memoryStream, (object)test);の行で下記エラーが発生

　ExecutionEngineException: Attempting to call method 'MsgPack.Serialization.SerializationContext::GetSerializer' for which no ahead of time (AOT) code was generated.
  at System.Reflection.MonoMethod.InternalInvoke (System.Object obj, System.Object[] parameters, System.Exception& exc) [0x00000] in <filename unknown>:0
Gradle で Hello Kotlin


## 概要

Gradle で Kotlin をビルドできるようにするまでのセットアップ作業を示したものです。普段は Kotlin を使っておらず、たまにテキストエディタでちょっとしたコードを書く場合を想定しています。

## Kotlin の採用実績

2017年5月に Google I/0 2017 で Kotkin が Android の開発言語としてサポートされることが公表されました。Kotlin を採用している個別の企業の例として Ruby on Rails の作者が在籍する Basecamp をはじめ、Amazon Web Services、Pinterest、Netflix、Uber などが挙げられます。Kotlin で書かれたプロジェクトの例として Corda が挙げられます。Corda は分散型台帳プラットフォームで、金融機関が参加するコンソーシアムによって開発されています。

## セットアップ

### 方針
プログラミング言語を導入する場合、特定のバージョンだけでよいのか、プロジェクトごとにバージョンを使いわける必要があるのか考える必要があります。今回は後者を基準にツールを選ぶことにしました。以前は前者の方針で macOS の homebrew を使ってきました。

### jabba

Java のパッケージマネージャーとして jabba を使うことにしました。このツールは Go で開発されています。

```bash
curl -sL https://github.com/shyiko/jabba/raw/master/install.sh | bash && . ~/.jabba/jabba.sh
```


インストールできる Java のバージョンのリストを表示させてみましょう。

```bash
jabba ls-remote
```

今回は 1.8.131 をインストールすることにしました。

```bash
jabba install 1.8.131
```

.profile に次のコードを追加しました。

```bash
jabba use 1.8
```

Java のバージョン番号を確認してみましょう。

```bash
java -version
```

### SDKMAN!
Kotlin や Gradle の複数のバージョンを管理できるように SDKMAN! を導入することにしました。以前のコマンドツールの名前は gvm でしたが、Go Version Manager のコマンドツールと名前が重複していました。


```bash
curl -s "https://get.sdkman.io" | bash
```

.profile ファイルに次のコードを追加しました。

```bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
```

### Kotlin

sdk コマンドで Kotlin をインストールします。

```bash
sdk install kotlin
```

Kotlin のバージョンを確認してみましょう。

```bash
kotlin -version
```

### Gradle

sdk コマンドで Gradle をインストールします。

```bash
sdk install gradle
```

## プロジェクト

ターミナルで Hello Kotin を表示させるプログラムを書いてみましょう。開発元の JetBrains がサンプルコードの[リポジトリ](https://github.com/JetBrains/kotlin-examples/tree/master/gradle/hello-world)を公開しています。

### build.gragle

build.gradle を用意します。

```bash:build.gradle
buildscript {
  ext.kotlin_version = '1.1.2-2'

  repositories {
    mavenCentral()
  }

  dependencies {
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
  }
}

apply plugin: 'kotlin'
apply plugin: 'application'
mainClassName = 'demo.HelloKt'

defaultTasks 'run'

repositories {
  mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
```

`buildscript {}` ブロックの代わりに `plugins {}` ブロックを使って次のように書き換えることができます。

```bash:build.gradle
plugins {
  id "org.jetbrains.kotlin.jvm" version "1.1.2-2"
}

apply plugin: 'kotlin'
apply plugin: 'application'
mainClassName = 'demo.HelloKt'

defaultTasks 'run'

repositories {
  mavenCentral()
}

dependencies {
  compile "org.jetbrains.kotlin:kotlin-stdlib:1.1.2-2"
}
```

`plugins {}` ブロックはトップレベルの宣言でなければならず、`id` や `version` に指定できるのは定数、リテラル、文字列です。
 
### Hello.kt

`src/main/kotlin/demo/Hello.kt` のファイルを用意します。

```kotlin:Hello.kt
package demo

fun main(args: Array<String>) {
    println("Hello Kotlin!")
}
```

### 実行

プログラムを実行してみましょう。

```bash
gradle
```

明示的にタスクを指定することもできます。


```bash
gradle run
```
WRF / gfortran > Error: NAMELIST attribute conflicts with ALLOCATABLE attribute > gfortranのバージョンv4.4.7で発生 | v4.6以降で修正済?


```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
```

WRF(Weather Research and Forecasting Model)とその前処理であるWPS。

WPSのungrib.exeをgfortranでコンパイルしようとして以下のようなエラーが出ている。

```
Makefile:90: warning: overriding commands for target `.F.o'
../../configure.wps:103: warning: ignoring old commands for target `.F.o'
Makefile:95: warning: overriding commands for target `.c.o'
../../configure.wps:95: warning: ignoring old commands for target `.c.o'
/usr/bin/cpp -P -traditional -D_UNDERSCORE -DBYTESWAP -DLINUX -DIO_NETCDF -DBIT32 -DNO_SIGNAL -D_MPI -D_UNGRIB -DUSE_JPEG2000 -DUSE_PNG read_namelist.F > read_namelist.f90
gfortran -c -ffree-form -O -fconvert=big-endian -frecord-marker=4 read_namelist.f90
read_namelist.f90:72.25:

       add_lvls, new_plvl, interp_type
                         1
Error: NAMELIST attribute conflicts with ALLOCATABLE attribute in 'new_plvl' at (1)
read_namelist.f90:238.20:
```

### 案 > コンパイルオプションでの対応 > 失敗

以下が関連しそう。
https://groups.google.com/forum/#!topic/gg95/cO9AiFtaeH4

> The f95 standard forbids having allocatable arrays as namelist group objects. The f2003  standard allows it. The problem is that g95 is a f95 compiler with some f2003 features but not including that one. Gfortran gives you the choice. With the -std=f95 option you get an error message equivalent to g95's, with -std=f2003 (or with no -std option at all) the program compiles.
>
>-- John Harper

f95(g95)ではダメで、GFortran(f2003機能)を使わないといけないようだ。

WPS v3.7.1では問題がなかったが、v3.9のコードではこのあたりがきちんと検討されていないようだ。

gfortran v4.4.7-17(とv4.9)で`-std=f2003`オプションを付けてもダメだった。

### 案 > GFortranのバージョン変更

v4.4.7-17: 上記の問題が発生する
v4.9.2-6: 上記の問題は発生しない

v4.9.2-6については[CentOS 6 で C++11 に対応した g++ を使う](http://qiita.com/phanect/items/45c67fa55d624e45367b)を参考にsclを使って切替できるようにした。

```
$sudo yum install devtoolset-3-gcc-gfortran
```

### 関連リンク

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43062
v4.6以降で修正されているようだ。
楽しいPageControlアニメーションならCHIPageControl!

#実装
今日実装してみたのは[CHIPageControl](https://github.com/ChiliLabs/CHIPageControl)っていうカスタUIPageControlのFramework.

実装は簡単でした。

私たちはcocoapodsでバージョン`0.1.3`導入しました。

##二つの実装やり方
###Storyboard
UIView置いて
![Screen Shot 2017-06-02 at 15.20.38 (2).png](https://qiita-image-store.s3.amazonaws.com/0/147278/2c9ae37d-54cc-6c8d-fe00-edf9e87941d4.png)

Module気をつけないといけない。CHIPageControlになっていなければビルド失敗する。
![Screen Shot 2017-06-02 at 15.21.37.png](https://qiita-image-store.s3.amazonaws.com/0/147278/af252c17-eca3-31af-d9da-d038cb9dcc7b.png)

それでコード側でもページ数とか設定できるし、下記のようにも設定できる。
![Screen Shot 2017-06-02 at 15.22.50.png](https://qiita-image-store.s3.amazonaws.com/0/147278/8f817d3d-7a92-897e-d549-440f9c610a6c.png)

Classなら下記のような実装

```swift
pageControl.tintColor = UIColor(hexString: "3c5a56")
pageControl.numberOfPages = pages.count
pageControl.radius = 3
```

#結果
簡単に楽しいアニメーション付けれるのでおすすめできます。

![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/147278/3257b717-9ded-7ee8-5ece-ac086329ddf8.gif)
【Mac】複数のアプリ⇄デスクトップ間を高速で行き来する方法

# アプリ⇄デスクトップで行き来したい！
複数のアプリケーションを起動していると、デスクトップを表示するのが大変です。
そこで、高速でアプリ⇄デスクトップを行き来する方法が存在するので、その方法をレクチャーします。

![名称未設定.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/179510/a18f766c-3831-3c3f-fe64-3e89d434fa31.gif)

#　①りんごマーク　＞　システム環境設定
mac左上のりんごマークから「システム環境設定」をクリックします。

<img width="200" alt="スクリーンショット 2017-06-02 15.00.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/179510/63229eab-b620-83b6-b1aa-4d4659dfddda.png">

# ②Mission controllを選択
一番上の行に「Mission Controll」があるのでクリックします。

<img width="462" alt="スクリーンショット 2017-06-02 15.05.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/179510/4100a89a-bb7b-677d-b716-d1b66d0bd78f.png">

# ③ホットコーナーを選択
左下の「ホットコーナー」をクリックします。

<img width="458" alt="スクリーンショット 2017-06-02 15.07.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/179510/62d64ef0-e3b6-1f0a-11d0-079e6c3dd508.png">

# ④4角のどこかに「デスクトップ」を配置
４つ設定できる角がありますが、どこでもいいので「デスクトップ」を選んで設定します。
<img width="458" alt="スクリーンショット 2017-06-02 15.12.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/179510/1a0619ef-c17c-d3c0-09c3-cebb8e5d1e4c.png">

#　完成
設定した角にマウスポインタを当てた際に、動画のように全てのアプリケーションウインドウを画面外に待機させ、デスクトップを表示することができます。

「デスクトップ」の他にもこの「ホットコーナー」を設定することで、作業効率アップすると思いますので、まだの方は是非「ホットコーナー」を設定してみてください。
Git取り消したい

#概要
間違って違ったブランチでプッシュしてしまったものを取り消したい。

ブランチがmaster、topic1があります。
topic2として切り分けてプッシュしたかったものを誤ってtopic1にプッシュしてしまった。やっちまった。修正したい。

#手順
まずは、topic2を作成してそこに移ってみる。

```
$ git checkout -b topic2
```

gitのログを確認してみる。もちろんtopic1もtopic2も同じcommitのやつだね。topic2は`****01`のままにして、topic1は`****00`までに戻していきたい。

```
$ git log --oneline
****01 (HEAD -> topic1, topic2)
****00
...
```

topic1に移動する。

```
$ git checkout topic1
Switched to branch 'topic1'
```

コミット記録を`****00`まで戻す。

```
$ git reset --hard ****00
```

ブランチtopic1でのログを確認すると、`****00`まで戻っている。よし、とりあえずローカルの状態はOK。
でもプッシュしてしまったリポジトリをなんとかせねば。

```
$ git log --oneline
****00 (HEAD -> topic1)
...
```

削除した差分をforceプッシュする。

```
$ git push -f origin topic1
```

gitリポジトリを確認してみる。おお。戻っている。助かりました。これでtopic2でまた開発を再開できる。

#参考URL
[gitで誤ったブランチに対して行った変更を正しいブランチへ移す](http://labs.timedia.co.jp/2010/12/git-moving-changes-with-cherry-pick.html)
[【git】git pushを取り消す](http://tweeeety.hateblo.jp/entry/2015/06/10/215753)
jsdoでconvnetjs その12

#概要
convnetjsで、CIFAR-10を学習させて、画像で分類を聞いてみた。

#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/E/X/b/EXbr.jpg?t=1496382799)
#成果物
http://jsdo.it/ohisama1/EXbr
#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/Y/p/m/YpmM.jpg?t=1496382818)
#成果物
http://jsdo.it/ohisama1/YpmM
SSH トンネル（メモ）

# SSH のトンネルを config に書く

**自分の備忘のために書いています**

gateway を経由して、gateway-target にssh ログインするための
ssh の config ファイル

```
port forward 用
Host gateway
HostName gateway.hoge.com
User hoge_user
IdentitiesOnly yes
IdentityFile ~/.ssh/hoge_key
PasswordAuthentication no
Port 22

Host           gateway-target
HostName       target.hoge.com
User           hoge_user
IdentityFile   ~/.ssh/hoge_key
Port 22
ProxyCommand   ssh -CW %h:%p gateway
```
canvas で対比横棒グラフを作る

![canvas_jun0201.png](https://qiita-image-store.s3.amazonaws.com/0/179446/7fc10323-c69f-5dc5-47b6-d700ecc8f548.png)



```html:index.html
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="utf-8">
<script src="bar.js"></script>
<title>canvas描く対比横棒グラフ</title>
</head>
<body>
<div>
<canvas id="bar_area" width="800" height="400"></canvas>
</div>
<hr />
Aug/07/2023<p />
</body>
</html>
```

```js:bar.js
// -------------------------------------------------------------------------
//	bar.js
//
//						Aug/07/2023
// -------------------------------------------------------------------------
window.onload = ()=>
{
	const file_json = "pacific.json"

	fetch(file_json).then((response) => {
		if(!response.ok) {
			console.log('Read error!')
			throw new Error('error')
		} 
		console.log('Read ok!')
		return response.text()
	}).then((data)  => {
		const data_aa = JSON.parse(data)
		bar_proc (data_aa)
		})
}

// -------------------------------------------------------------------------
function bar_proc (data)
{
	var bar = document.getElementById('bar_area')
	var ctx = bar.getContext('2d')

	ctx.font = "18px 'ＭＳ Ｐゴシック'"
	ctx.strokeStyle = "black" 

	var yy = 30
	ctx.strokeText("パシフィック",250,yy)
	ctx.strokeText("勝利",420,yy)
	ctx.strokeText("敗北",150,yy)


	var xx = 250
	yy = 70
	ctx.strokeStyle = "blue" 
	for (it in data)
		{
		const unit = data[it]
		ctx.strokeText(unit.team,xx,yy)
		draw_win_proc (ctx,xx+120,yy-18,unit.win)
		draw_lose_proc (ctx,xx-30,yy-18,unit.lose)
		yy += 50
		}
}

// -------------------------------------------------------------------------
function  draw_win_proc (ctx,xx,yy,nn)
{
	ctx.beginPath();
	ctx.fillStyle = 'green'
	ctx.rect (xx,yy,nn*5,20)
	ctx.fill()
	ctx.closePath()
	ctx.stroke();
}

// -------------------------------------------------------------------------
function  draw_lose_proc (ctx,xx,yy,nn)
{
	ctx.beginPath();
	ctx.fillStyle = 'red'
	ctx.rect (xx-nn*5,yy,nn*5,20)
	ctx.fill()
	ctx.closePath()
	ctx.stroke();
}

// -------------------------------------------------------------------------
```

```json:pacific.json
[
{"team": "楽天","win": 33,"lose": 12},
{"team": "ソフトバンク","win": 32,"lose": 20},
{"team": "西武","win": 26,"lose": 21},
{"team": "オリックス","win": 22,"lose": 27},
{"team": "日本ハム","win": 21,"lose": 28},
{"team": "ロッテ","win": 15,"lose": 35}
]
```
システム開発を日本語で作成する裏技

実際はJAVAを使っているのですが、それを誰でもクラウド環境で使用するアプリケーションを作成できる開発環境がSaaSForceです。

ほぼ、日本語と中学レベルの英単語かローマ字による入力、そしてクリックやコピペができれば、データーベースのアプリケーションを作成できます。

【ステップ1】

![wfc20161109008.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/831ed7a4-b463-d245-c4af-55f2b7ec4be5.jpeg)

まずは、テーブル項目作成をします。

データーベースに記録したい項目、品名や日付、ドロップダウンリストなどの入力法の指定などをこのプロセスでします。

【ステップ2】![wfc20161109009.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/b8165004-3a0a-229e-8b30-8de78ee36c9d.jpeg)

画面項目定義の作成で、ステップ1で作成されたテーブルの項目を画面で使える項目に自動的に変えて、テストサーバーに登録します。

【ステップ3】

![wfc20161109011.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/a385d68a-5717-0fc3-a793-5ae017933d83.jpeg)

ステップ2の画面項目定義で生成されたパーツを並べ替えて表示させたいポジションにします。

作成自体は以上です。

最後に、テストサーバーで動作確認をして終わりです。
PycharmのDocker統合でdocker-composeのProject Nameを指定する


こんにちはsekitakaです。

# Pycharのdocker-composeのProject Nameを指定する方法
`docker-compose`コマンドの実行に指定する以外に`COMPOSE_PROJECT_NAME`環境変数を指定することでProject Nameが指定できるそうです。
Preferences > Project > Project Interpreter から Docker Composeの設定の`Environment variables`に`COMPOSE_PROJECT_NAME`を任意のProject Nameに設定する。

![mypy.jpg](https://qiita-image-store.s3.amazonaws.com/0/18273/77d3b6d8-6302-2bb0-579f-6677fd4ffadc.jpeg "mypy.jpg")



# 経緯
Pycharmでpythonインタプリタとしてdocker-composeで起動したdockerを使用していたのですが、`docker-compose -p <プロジェクト名> -f <docker-compose.ymlへのパス> build`でビルドしても、Pycharmから実行する環境が最新にならずにハマりました。

# 原因
私はプロジェクト直下にdocker用の`docker`ディレクトリを作り、その下にdocker-compose.ymlやDockerfileを配置していました。
Pycharmは docker-composeの Project Nameを指定せずに実行するようで、このままだとPycharmから実行される時のイメージ名は`docker_<サービス名>_連番`てきな感じになります。

私はbuild時にhelperスクリプトを経由してProject Nameを指定していたので、Pycharmが使用しているイメージが更新できていなかったというオチでした。
Gitでローカルリポジトリが変になったからリモートリポジトリからcloneしなおすわって手順（Laravel5.2）

# まず今のディレクトリの名前を変えておく
```
mv hoge hoge_back
```

# ブランチ指定＆ディレクトリ名指定してcloneする
```
git clone -b master [remote_repository] hoge
```

#storageとbootstrap/cacheの権限を777にする
```
chmod 777 -R storage
chmod 777 -R bootstrap/cache
```

# composer installする
```
composer install
```

# Elixir使ってたらnpm installする
```
npm install
```

# gulpかける
```
gulp --production
```

# 必要な画像とか添付ファイルとかをコピーしてくる(ここではstorage/appに画像類を格納していると仮定)
```
sudo cp -avr /var/www/hoge_back/storage/app /var/www/hoge/storage
```
Kotlinを学ぼう［環境構築］


# はじめに
[Kotlin on Android. Now official](https://blog.jetbrains.com/kotlin/2017/05/kotlin-on-android-now-official/)

こんな記事を見つけてKotlinに興味が湧きました。  
Java自体は触ったことはありますが、Kotlinは触ったことも無く、Androidに関しても全く知識がありません。  
遅まきながらAndroid面の技術力習得を目標に、Kotlinを使ってあれこれ試してみようと思います。

# そもそもKotlinってなんだ？
コトリン、ことりん、小鳥ん？

- JetBrains社によって開発(IntelliJ IDEAの開発元ですね!)
- Javaをもっと簡潔・安全になるように改良した産業利用向け汎用言語
- JVM上で動く
- Javaと同じ速度でコンパイルされ、同じ速度で動作する
- Javaでは互換性の問題で採用出来ていない機能や、現時点では実現予定となっている機能も採用している
- Android上での開発・動作も可能
- JavaScriptへのコンパイルもサポート
- オープンソース(Apacheライセンス バージョン2.0)
- 名称の由来はコトリン島

参考・引用：[Wikipedia - Kotlin](https://ja.wikipedia.org/wiki/Kotlin)

## じゃあJavaとの違いは？
以下の記事が分かりやすかったです。

- [Qiita - はじめてのKotlin。Javaと比較してみた](http://qiita.com/hituziando/items/fa2dc4097b24ab78276e)
- [Qiita - Kotlin】【Java】Kotlin Javaの比較メモ](http://qiita.com/farman0629/items/f959a4ff791f26b33fc3)
- [Qiita - kotlinはJavaからどう見えるか?](http://qiita.com/boohbah/items/167233c7eafe17f3150b)

# とりあえずの環境面
別になんでも良かったのですが、とりあえず`IntelliJ IDEA`をIDEとして使うことにしました。  
[IntelliJ IDEA - The most intelligent Java IDE](https://www.jetbrains.com/idea/?fromMenu)

IDE上で完結させるのであれば(多分?)不要かもですが、  
コマンドラインでコンパイルしたい人は以下を参考にKotlinコンパイラを入手しておきましょう。  
[Kotlin - Working with the Command Line Compiler](https://kotlinlang.org/docs/tutorials/command-line.html)

# お決まり
`HelloWorld`は各自でやってみましょう。  
Kotlinのチュートリアル見て真似すれば簡単です。  
(Eclipseやコマンドラインでのコンパイル方法も記載あるのできっと大丈夫でしょう)

[Kotlin - Getting Started with IntelliJ IDEA](https://kotlinlang.org/docs/tutorials/getting-started.html)

# 折角なので

## 内容比較
Javaで書いた`HelloWorld`と比較してみましょう。

```java:HelloWorld.java
public class HelloWorld {
    public static void main(String args) {
        System.out.println("Hello World!");
    }
}
```

```kotlin:HelloWorld.kt
fun main(args: Array<String>) {
    println("Hello World!")
}
```

元々短いコードなので、そこまで大きく変わってはいませんが、記述量が減っていますね。

他にもアクセス修飾子が無くなっていたり(デフォルトで`public`)、`fun`ってキーワードがあったり、型・変数のシンタックスが変わっていたり、`println`がそのまま書けたり、セミコロン(;)が無かったり。

## 実行してみる
コンパイルして出来た`.class`ファイルを実行してみます。

```cmd
$ kotlin HelloWorldKt
Hello World!
```

## 逆アセンブルしてみる
`.class`ファイルを逆アセンブルしてみます。

```cmd
$ javap HelloWorldKt
Compiled from "HelloWorld.kt"
public final class HelloWorldKt {
  public static final void main(java.lang.String[]);
}
```

javaっぽいですね。

## javaコマンドで実行してみる
kotlinランタイムを含めた形で`jar`を作成してあげると、なんと`java -jar`コマンドで実行することが出来ます。
これならJREのみの環境でも動かすことが出来ますね。

```cmd
$ kotlinc -d HelloWorld.jar -include-runtime HelloWorld.kt
$
$ ls
HelloWorld.jar HelloWorld.kt
$
$ java -jar HelloWorld.jar
Hello World!
```

# 次回(?)
今回は大したことも出来ませんでしたので、次回から徐々に基本的な構文から学んで行きたいと思います。  
最終的にはアンドロイド的な何かが作れると良いですね。（いつになるかな）

**以上**
[Ansible] AnsibleのPlaybookをlocalhostに対して実行する

localhostに対してAnsibleのplaybookを実行する方法メモ
Vagrantでの `ansible_local` 作成時などの検証時に使う。

# ansible-playbookのオプションで指定

```console:コマンドで指定
$ ansible-playbook -i localhost, -c local playbook.yml
```

注意点として、 `-i localhost,` の最後のカンマ指定が必須らしいとのこと（※理由は要調査）

# playbookで直接指定（非推奨）

playbook事態に、hostsとconnectionとして `localhost` を指定するやり方。

```yaml:playbool.yml
- hosts: localhost
  connection: local
  tasks:
    - ping:
```

検証中はいいけれども、最終的に書き換えないといけなくなる場合が多そうなので、基本的には上のオプション指定のほうが良さそうです。

# 参考
[メモ：localhostに対してAnsibleを実行するにはconnection: local - Technically, technophobic.](http://notchained.hatenablog.com/entry/2016/02/21/141227)
[ansible-playbookをローカルホストに対して実行 - biaxident’s blog](http://www.instrumedley.net/entry/2017/02/20/110456)
Prepackを試してみよう。

# 自己紹介

じゅんじゅんと言うニックネームで、関西を拠点に活動しているフロントエンドエンジニアです。

HAL大阪3回生です。（2017/06/02現在）

イベントや、勉強会に参加してるので是非お会いした際はお声掛けください！

# Prepackとは

Prepackとは、facebookが作っているJavaScriptを高速化するツールです。

![スクリーンショット 2017-06-02 11.54.28.png](https://qiita-image-store.s3.amazonaws.com/0/90347/5b8a3fc9-6fc8-c240-89e3-d51bd8444f9d.png)

公式サイト: [Prepack](https://prepack.io)

GitHub: [facebook/prepack](https://github.com/facebook/prepack)

少し前にPrepackが話題になりましたね...

どういうものなのかサクッと公式サイトのコードを真似て見たいと思います。

```js
(function () {
  function hello() { return 'hello'; }
  function world() { return 'world'; }
  global.s = hello() + ' ' + world();
})();
```

例えばこういったコード。

prepackを通すと

```js
(function () {
  s = "hello world";
})();
```

になるらしい...

これは、**計算できる場所をコンパイル時にしてしまって高速化**を図るツールであると...

# 使い方

使い方は、ブラウザで確認するかローカルにprepackをインストールして使うかです。

ブラウザで使う場合は、公式サイトからリンクがはっている[Try It Out](https://prepack.io/repl.html)から実行できます。

ローカルにインストールする場合は

```bash
$ npm install prepack -g
```

prepackをnpmからグローバルインストールしてください。

すると、コマンドラインで`prepack`というのが使えるようになります。

`prepack`コマンドの使い方は、

```bash
$ prepack <file name>.js
```

とjsのファイルを指定するか

```bash
$ prepack <file name>.js --out <out file name>.js
```

として、結果を保存するファイルを指定することもできます。

`--out`を指定しない場合はコマンドラインに実行結果が出力されます。

一度簡単な例で試してみましょう。

```js:test1.js
(function(){

  var hoge = "hoge"
  var huga = hoge

  global.huga = huga

})()
```

これをprepackに通すと

```js
(function(){
  huga = "hoge"
})()
```

と短縮されます。

注意点として、prepackではコードを書く際に無名の即時関数で囲まないといけません。

```js
var hoge = "hoge"
var huga = hoge
global.huga = huga
```

などのように書き始めてしまうと

```js
huga = undefined;
hoge = undefined;
hoge = "hoge";
huga = "hoge";
```

のような結果になります。

最後に`global`にいれていますが例えば

```js
(function(){
  var hoge = "hoge"
  var huga = hoge

  console.log(huga)

})()
```

としてみると

```js
console.log("hoge")
```

と短縮されています。

ES2015のコードでかいて、webpackでトランスパイルしたやつをprepackする。
とかになると、プラグイン的なものをいれるようです。

[JSの最適化ツール「Prepack」を使ってみる](http://qiita.com/kurosame/items/b8f9cb3657538ef703c0)

# あとがき

Prepackはまだまだ開発段階のものなので、プロダクトにすぐ導入できるかと言われるとそうでもないですが、長い目で見守っていきたいですね！

テスト的に書いているコードなどは全てGitHubにあるので参考までに。

GitHub [konojunya/prepack](https://github.com/konojunya/prepack)

質問等はTwitterへなげてもらえるとありがたいです。

Twitter [@konojunya](https://twitter.com/konojunya)
macのsparkで起動エラー（java.net.UnknownHostException）

# はじめに
macで `brew install apache-spark`でインストールした後、諸々のPATHを通した後に、`spark-shell`を実行したら、java.net.UnknownHostExceptionが起きて起動しない症状が出ました。

# エラーメッセージ

```
java.net.UnknownHostException: user-MacBook-Pro-2.local: user-MacBook-Pro-2.local: nodename nor servname provided, or not known
  at java.net.InetAddress.getLocalHost(InetAddress.java:1475)
  at org.apache.spark.util.Utils$.findLocalInetAddress(Utils.scala:870)
  at org.apache.spark.util.Utils$.org$apache$spark$util$Utils$$localIpAddress$lzycompute(Utils.scala:863)
  at org.apache.spark.util.Utils$.org$apache$spark$util$Utils$$localIpAddress(Utils.scala:863)
  at org.apache.spark.util.Utils$$anonfun$localHostName$1.apply(Utils.scala:920)
  at org.apache.spark.util.Utils$$anonfun$localHostName$1.apply(Utils.scala:920)
  at scala.Option.getOrElse(Option.scala:121)
  at org.apache.spark.util.Utils$.localHostName(Utils.scala:920)
  at org.apache.spark.internal.config.package$.<init>(package.scala:189)
  at org.apache.spark.internal.config.package$.<clinit>(package.scala)
  at org.apache.spark.SparkContext.<init>(SparkContext.scala:397)
  at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2320)
  at org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:868)
  at org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:860)
  at scala.Option.getOrElse(Option.scala:121)
  at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:860)
  at org.apache.spark.repl.Main$.createSparkSession(Main.scala:96)
  ... 47 elided
Caused by: java.net.UnknownHostException: asn-usr-no-MacBook-Pro-2.local: nodename nor servname provided, or not known
  at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
  at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:901)
  at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1295)
  at java.net.InetAddress.getLocalHost(InetAddress.java:1471)
```

# 原因分析

- Exceptionのメッセージ

上記のエラーメッセージで主な原因であるメッセージ行を取得しました

`java.net.UnknownHostException: user-MacBook-Pro-2.local: user-MacBook-Pro-2.local: nodename nor servname provided, or not known`

これは、実行時に実行したMacの端末の`user-MacBook-Pro-2.local`というというホスト名が見つからないという意味合いだと解釈しました。

# 対策
ホスト名が解決できない問題に対して、対策を実施致します。
## HOSTファイルへのドメイン名の登録
hostsファイルを編集し、ホスト名を登録します。

- VIエディタ などで hosts ファイルを編集します

`sudo vi /etc/hosts`

- 最終行にIPアドレスとホスト名の対応関係を追記します

Exceptionが出た、ホスト名は自分自身のマシンなので、ローカルIPアドレス（127.0.0.1）とホスト名の対応関係を記入します。

```
127.0.0.1      user-MacBook-Pro-2.local
```

「IPアドレス」　「ホスト名」という書式です。
HIveでWITH句

#概要
HiveでのWITH句についての解釈が曖昧だったので残しておきます。

##WITH句を用いた例

```.sql
WITH number_list as (
--番号テーブルからnumberを抽出
SELECT
    number
FROM
    number_table
WHERE
    partition='aa'
)

SELECT
    number
FROM
    --先ほど定義したnumber_listから
    number_list

```
##間違ったWITH句の解釈
WITH のあとに定義した名前に、WITH句内の処理結果を格納し、
一つのテンポラリテーブルのように使用できる便利な機能です。
(sqlからこっちのイメージが強かったのです...)


##実際のWITH句
WITH のあとに定義した名前で、WITH句内の処理を呼び出すことができる機能です。

##まとめ
WITHを使用したとき、WITH句内の処理内容を格納しているわけではなく、
毎回呼び出して処理を行っています。

そのため、
毎回処理結果が変わる処理
(・リアルタイムに更新される来客者テーブルから、現在の来客者を抽出
・毎回値が変化するサンプリング結果　など)や、
重い処理をWITH句に書くとき(毎回処理を実行するので時間がかかる)などは
一旦テーブルを作成してしまうことを推奨します。

##参考
https://cwiki.apache.org/confluence/display/Hive/Common+Table+Expression
細かくコミットしすぎたのでrebase -iでまとめた

**細かくコミットしすぎたよ～まとめたいよ～**な状況に陥ったので、メモ。
## HEADから3個分のコミットをまとめる場合

```
$ git rebase -i HEAD~3
```

テキストエディタが開いて、3個分のコミットが表示されます。
各コミットの頭に*pick*と表示されています。

```
pick 11c0757
pick 6e0792c
pick 1ec795c
```

２個目と３個目の*pick*の文字を*squash*に変更します。
*squash*を指定するとコミットをひとつにまとめて
コミットメッセージを書き込めるようにしてくれます。

```
pick 11c0757
squash 6e0792c
squash 1ec795c
```

上記のように変更したら保存して終了。

またテキストエディタが開くので、
ここでコミットメッセージを入力します。
保存して終了したら完了です！

## 参考文献

- [5. rebase -i でコミットをまとめる【チュートリアル3 コミットを書き換えよう！】 | サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ](http://www.backlog.jp/git-guide/stepup/stepup7_5.html)
Mac OS Sierra でamazon awsのインスタンスにsshす

うまくできなくてめっちゃ詰まったので自分用として作成

# 前提（と用意するもの）

* ES2のインスタンス
* sshしたいインスタンスのキーペアと秘密鍵 ```hogehoge.pem```

# やり方

* キーペアの秘密鍵 ```hogehoge.pem``` を　``` ~/.ssh ```　以下に置く
* ``` ~/.ssh ```　のパーミッションを700に、```~/.ssh/*``` または ```hogehoge.pem``` のパーミッションを600に変更する

```
sudo chmod 700 ~/.ssh
sudo chmod 600 ~/.ssh/*
```

* ```sudo vim ~/.ssh/config```でコンフィグファイルを開いて、```PubkeyAcceptedKeyTypes=+ssh-dss```を追記

* ssh接続する
```
ssh -i /Users/username/.ssh/hogehoge.pem ec2-user@パブリックDNS
```

## 何が原因だったのか

* Sierraにアップデータした時にsshのバージョンが上がって鍵がうまく使えなかったっぽい
* 秘密鍵のある場所は700にしないといけないけど、秘密鍵自体は600じゃないと動かないっぽい(400がいいとか644がいいとか諸説ありだけど、私の環境では600じゃなきゃダメだった)
Entityとしてid、scopeを返す


```
    public function search(): array
    {
        $models =  $this->userModel->with("misc")->get();
        $rtn = [];

        foreach ($models as $model) {
            assert($model instanceof UserEloquent);
            $miscModel = $model->misc;
            
            assert($miscModel instanceof UserMiscEloquent);
            $misc = $miscModel->toValueObject();
            
            /** @var UserMiscEloquent $miscModel */
            $rtn[] = $model->toEntity([
                User::SCOPE_MISC => $misc
            ]);
        }
        return $rtn;
    }
```
RailsでOpenStreetMapを扱う

# 概要
Railsで地点を登録する時、緯度経度を入力させるのはUX的にもどうかと思う。
そこで、マップから地点を登録することができればイイ感じになりそう。
今回はOpenStreetMapを使って実装してみる。

# 実装
今回は登録画面で地図を表示し、クリックした地点にマーカーを立てて、緯度経度を取得する。
## 事前準備
- scaffoldで簡単に登録画面等を準備する。モデル生成時に緯度経度を忘れないようにする。
- rails sでサーバーが起動できていることを確認する。
- [leaflet - Download](http://leafletjs.com/download.html)から安定版をダウンロードする。

## 本編
上記のサイトからダウンロードしたものを下記のディレクトリに移動する。

- leaflet.js  => /vendor/assets/javascripts
- leaflet.css => /vendor/assets/stylesheets
- Imageについては/vendor/assets/にimagesディレクトリを作成し、中身を移動する。

### スクリプトファイルとスタイルシートの読み込み
``` app/assets/javascripts/application.js
//= require jquery
//= require jquery_ujs
# 以下を追加
//= require leaflet                         
```
``` app/assets/stylesheets/application.css
*= require_self
# 以下を追加
*= require leaflet
*= require_tree .                         
```
### 地図を表示する
``` app/views/maps/_form.html.erb
<div id="map"></div>
  <style type="text/css">
    #map {
      height:400px;
    }
  </style>
  <script type="text/javascript">
        L.Icon.Default.imagePath = "/assets";
        var map = L.map('map').setView([緯度, 経度],17);
        var osmUrl = "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png";
        var osmAttrib = "Map data OpenstreetMap contributors";
        L.tileLayer(osmUrl,{
          attribution: osmAttrib,
          maxZoom: 20,
        }).addTo(map);

  </script>
```
ここまで、終わったら実際に登録画面で地図が表示されるか確認する。
まだ、マーカーを立てることや緯度経度の取得はできない。

### クリックした地点にマーカを設置＆緯度経度の取得
続きに入力していく

```js:app/views/maps/_form.html.erb
        var marker = L.marker([緯度, 経度]).addTo(map);

        map.on("click",function(e){
          marker.setLatLng(e.latlng);
          $('#map_latitude').val(e.latlng.lat);
          $('#map_longitude').val(e.latlng.lng);
        });
```
このとき、フォーム中に緯度経度表示欄があり、表示させたい場合は、フォームにidを設定する必要がある。
下記は例であるが、:id =>'id名 'でidを割り振ることができる。

```html+erb
  <div class="field">
    <%= f.label :latitude %><br>
    <%= f.text_field :latitude, :id => 'map_latitude'%>
  </div>
  <div class="field">
    <%= f.label :longitude %><br>
    <%= f.text_field :longitude, :id => 'map_longitude'%>
  </div>
```
Google Mapもいいけど、たまにはOSMでもいいじゃないかという記事でした

# 参考サイト
- [OSMを使ったスマホ＆Web開発入門 - SlideShare](http://www.slideshare.net/smellman/osc2013tkspring)
Newspaper3kパッケージのarticleモジュール

Python3でNewspaper3kのarticleモジュール（Python2ならNewspaper）を紹介します。

##インストール

```
>>> pip install newspaper3k
```

##コマンド紹介

```
>>> from newspaper import Article

>>> article = Article('http://www.independent.co.uk/life-style/motoring/small-suvs-go-head-to-head-peugeot-3008-vs-toyota-c-hr-vs-seat-ateca-a7617746.html') # 記事URL

>>> article.download()

>>> article.html # htmlコードを取得
'<!DOCTYPE html>\n<!--[if IE 8]>\n<html class=...'
```

```
>>> article.parse() # 記事中身読込み

>>> article.title # 記事タイトルの取得
'Small SUVs go head-to-head: Peugeot 3008 vs Toyota C-HR vs Seat Ateca'

>>> article.authors # 記事著者の取得
['Graham Scott']

>>> article.publish_date # 記事公開日時の取得
datetime.datetime(2017, 3, 8, 10, 44, 46, tzinfo=tzutc())

>>> article.text # 記事テキストの取得
"For it seemed like ever, if you had a small SUV big..."
```
【VMware@Bluemix IaaS 2017】vCenter Server Applianceにパッチを当ててアップデートする

#背景
vSphere6.5を使用して様々な検証をしていますが、NSX6.3.1の機能をフルに使うためにも、vCenter Serverを6.5→6.5bへアップデートします。

と言うのも、**vCenter Server6.5のままではNSX Edgeのデプロイが出来ず**、Edge Service Gatewayを用いた検証ができないため、6.5a以降のアップデートは必須です。NSX6.3.1のライセンスを取得しても、vCenter Server6.5ではライセンスを適用できませんでした。

NSX6.3.1のシステム要件に関しては以下のURLをご覧ください。
http://pubs.vmware.com/Release_Notes/jp/nsx/6.3.1/releasenotes_nsx_vsphere_631.html

パッチの形式は、isoベース・URLベースの2種類があります。今回は、isoベースのパッチを適用する方法を取りました。
方法の詳細については、以下のURLを参照してください。
http://pubs.vmware.com/vsphere-65/index.jsp#com.vmware.vsphere.upgrade.doc/GUID-3E7C2187-42A4-4DD4-9EC8-80D8B0077F82.html

# isoファイルのダウンロード
アップグレード用のisoファイルを以下のURLよりダウンロードします。My VMwareのユーザ登録が必要です。
今回は、環境の都合により、6.5bのアプライアンスバージョンをダウンロードします。
https://my.vmware.com/group/vmware/patch
![image.png](https://qiita-image-store.s3.amazonaws.com/0/171918/ca6f86c2-8174-57e2-68da-7742b414af21.png)

#アプライアンスのCD/DVDドライブに接続
ダウンロードしたisoファイルを、vCenter Web Client経由でアプライアンスに接続します。

アプライアンスが紐づけられているストレージを選択し、「ファイル」タブを開き、「データストアにファイルをアップロード」のアイコンをクリックし、isoファイルをアップロードします。
![スクリーンショット 2017-06-02 10.38.25のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/171918/28d5bd17-f18d-ef3f-58d2-c8db329c86bf.png)

vCenter Server Applianceの仮想マシンを選択し、「設定」タブから「仮想マシンのハードウェア」を選択し、「CD/DVDドライブ」の右にあるアイコンから「データストアのCD/DVDイメージに接続」を選択し、先ほどのisoファイルを接続します。![スクリーンショット 2017-06-01 10.58.46のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/171918/91558e12-d9fd-c4a9-5272-d0fc2c2797d2.png)



#シェルに接続してインストール
アプライアンスシェルにログインし、接続したisoファイルをインストールします。

シェル画面には、アプライアンスのコンソール画面（下画像）からCtrl+alt+F1でアクセスできます。また、Alt+F2キーで元の画面に戻ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/171918/a2ae3648-1c0d-d3dc-648e-6ae3b6eb68e7.png)


rootアカウントでログインし、下記のコマンドを入力してisoファイルのインストールを行います。
`software-packages install --iso`

最後に、vCenter Server Applianceを再起動して完了です！

アップデートしたvCenter Serverでは、「ライセンス」の「ソリューション」タブにおいて「NSX for vSphere」を選択＆ライセンス適用できるようになっています。
NSX Edgeのデプロイも無事にできました！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/171918/666d662e-71c7-8f15-e62f-4f3e7a40ca42.png)


#参考文献
- Full Patch for VMware vCenter Server Appliance 6.5 b (2148497)
https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2148497

- パッチ適用の方法について（「VMware vShere6.5ドキュメントセンターより」）
http://pubs.vmware.com/vsphere-65/index.jsp#com.vmware.vsphere.upgrade.doc/GUID-3E7C2187-42A4-4DD4-9EC8-80D8B0077F82.html
Zabbix ローレベルディスカバリ(LLD)をzabbix-agent1.8でも使えるようにする

LLD機能はZabbix 2.0以降で実装された機能の為、zabbix-agent1.8には標準装備されていません。
そのため、管理画面上でディスカバリルール(vfs.fs.discoveryやnet.if.discovery)を設定しても値を取ることができません。
zabbix-agentのバージョンアップをすれば問題はすぐに解決するのですが、環境によってはそれができない場合もあります。
そんなときの対応方法を記載致します。

#▼スクリプトファイルの作成
vfs.fs.discoveryキーでは/proc/mountsに記載されている内容を整形したものを取得しています。
そこでvfs.fs.discoveryキーと同様の結果が返ってくるように、/proc/mountsの中身を整形して返すスクリプトファイルを作成し、それを実行することでvfs.fs.discoveryキーに対応していないzabbix-agent1.8でもディスカバリルールを使用できます。
下記が/proc/mountsの中身を整形して返すスクリプトファイルになります。

```vfs_fs_discovery.pl
#!/usr/bin/perl
    
$first = 1;
    
print "{\n";
print "\t\"data\":[\n\n";
    
for (`cat /proc/mounts`)
{
    ($fsname, $fstype) = m/\S+ (\S+) (\S+)/;
    $fsname =~ s!/!\\/!g;

    print "\t,\n" if not $first;
    $first = 0;

    print "\t{\n";
    print "\t\t\"{#FSNAME}\":\"$fsname\",\n";
    print "\t\t\"{#FSTYPE}\":\"$fstype\"\n";
    print "\t}\n";
}

print "\n\t]\n";
print "}\n";
```

net.if.discoveryに関しても同様で/proc/net/devの内容を整形したものを取得しているだけなので、vfs.fs.discoveryと同じように別途スクリプトファイルを作成して、zabbix-agent1.8でもディスカバリルールを使用できます。

```net_if_discovery.pl
#!/usr/bin/perl

$first = 3;

print "{\"data\":[";

for (`cat /proc/net/dev`)
{
        if(!/:/)
        {
                $first--;
                next;
        }

         ($ifname) = m/(\S+):/;

        print "," if not $first;
        $first = 0;

        print "{\"{#IFNAME}\":\"$ifname\"}";
}
print "]";
print "}\n";
```

#▼UserParameterへの登録
スクリプトファイルを作成するだけではzabbix管理画面にLLDを登録しても認識できないので、zabbix-agentの設定ファイルに下記のようにスクリプトファイルを登録する必要があります。

```
UserParameter=vfs.fs.discovery,/opt/bin/vfs_fs_discovery.pl
UserParameter=net.if.discovery,/opt/bin/net_if_discovery.pl
```
※Userparameterとは何かについては公式サイトをご参考下さい
https://www.zabbix.com/documentation/2.2/jp/manual/config/items/userparameters

以上でLLDに対応していないzabbix-agentのバージョンでもLLDを使用できるようになります。もちろん、zabbixサーバ自体にLLD機能がなければできませんが...