OmniAICreator/Qiita-1.07M huggingface dataset:
【しずおかアプリ部】活動ログ　第33回

![しずおかアプリ部2.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/ee800648-fa25-1829-20c3-bad9c2055d35.jpeg)


##■タイトル##
第３３回


##■開催日##
２０１７年１月２８日（土）　１６：００～１８：００


##■参加者##
６名


##■活動内容（概要）##
・菅原プレゼン「Unityはじめるよ　～IKを使ってアニメーションをコントロール～」
・部員さんプレゼン「フリーCADソフトFusion360の紹介」
・部員さん　開発中のVRゲームについての途中経過を発表
・告知・雑談・VR体験

##■活動内容（詳細）##

【実演・プレゼン】

**・菅原プレゼン「Unityはじめるよ　～IKを使ってアニメーションをコントロール～」**

　　IK（インバースキネマティクス）という手法を用いて、
　　アニメーション中のキャラの体の一部を別のアニメーションをさせる方法を解説。

　　IKで何ができるかというと
　　・階段登る時に足䛾位置がしっかり段差に乗る
　　・ハシゴを登る時に両手両足ともしっかりハシゴを掴む
　　・坂道䛾角度に合わせて自然に足首䛾向きを変えられる
　　など、アニメーションに地形等の影響を与えることができる。
　　※ただしHumanoidのみ

　　今回はMecanimのおさらいをしながら、「壁に近づくと手すりに手を置きながら歩く」体験を行った。
　　AnimatorウィンドウでLayerのIKPassを有効にし、
　　スクリプトで、IKの重み（適用度）と、目標（位置、回転）の設定をするだけ。
　　※Animatorスクリプトに設定用のメソッドが用意されている。

　　非常に簡単に利用できる。
　　ただし、自然な動作に見せるためには、それなりの工夫が必要。

<img width="813" alt="スクリーンショット 2017-01-28 20.16.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/88105/ad4a1336-55b9-1a64-c76c-c438c37e1465.png">


　　資料：[第33回_プレゼン資料(～IKを使ってアニメーションをコントロール～).pdf](http://monolizm.com/sab/pdf/第33回_プレゼン資料(～IKを使ってアニメーションをコントロール～).pdf)
　　プロジェクト一式：[ik.zip](http://monolizm.com/sab/src/ik.zip)

<hr>


**・部員さんプレゼン「フリーCADソフトFusion360の紹介」**

　　Ｆｕｓｉｏｎ３６０はＡｕｔｏｄｅｓｋ社の３ＤＣＡＤソフト。
　　３０日間の無料体験版があり、非営利目的であれば３０日後も無料で使用できる。

　　・ソリッドモデリングやパラメトリックモデリングに加えフリーフォームモデリングも可能。
　　・様々な３Ｄデータファイルの取込みと変換機能
　　・クラウドサービスによるデータの共有
　　・履歴管理や２Ｄ図面への出力
　　・アセンブリ機能やレンダリング機能
　　・応力解析や熱解析などの各種シミュレーション
　　・ＣＡＭ機能

　　本来なら何十万円もするソフトがフリーで使える！！

　　作ったデータを「DMM.Make」などの3Dプリント業者に発注すれば、
　　モデリングしたデータから、現実のモノを作ることができる。

![IMG_7517.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/b0aa6b36-1a7d-7381-b39b-5fae6327443d.jpeg)

　　資料：[第33回_プレゼン資料(～Fusion360の紹介～).pdf](http://monolizm.com/sab/pdf/第33回_プレゼン資料(～Fusion360の紹介～).pdf)



<hr>


**部員さん　開発中のVRゲームについての途中経過を発表**

　　制作中のVRゲーム（ハードもソフトも自作！）の途中経過を発表＆体験をしてもらいました。

　　ハードの進化
　　・椅子の回転対応
　　・衝撃を受けた時の椅子の振動

　　ソフトの進化
　　・着座後のスタート時に自動でセンサーの補正を行うように。
　　・ステージのギミックの追加
　　・エフェクトの追加
　　・操作性の向上

　　など、
　　前回からパワーアップしています。
　　毎回体験していますが、着実に操作性が向上していると感じました。
　　初心者向け対応と、細かいバグ修正が今後の課題です。

<img width="813" alt="スクリーンショット 2017-01-28 20.22.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/88105/5331b2d5-2e3f-e9c6-6ca4-28be2a6e8ed5.png">

![IMG_7521.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/c1facb85-10e2-c57c-ea70-61b1504e3a7e.jpeg)


<hr>


**・告知・雑談・VR体験**
・Google翻訳のリアルタイムカメラ翻訳が面白い
・Panasonicのミラーレス一眼GH5が熱い
・ゲーミングPC市場規模が3兆円超え
・コアラのマーチのの絵柄を消すマシンが面白い
・歯車シミュレーションソフトの機能が驚き

・2/18に島田で行われる「Shizuoka.py(pythonの勉強会)」で部員さんが数学の歴史についてプレゼンをします。

・OculusTouchとPSVRの体験をしました
　菅原はOculusTouchを初めて体験したのですが、こんなにスゴイとは思ってもいませんでした。
　その空間の中にいる感がハンパないです。画面の中の手と現実の手が完全に連動していて違和感なし。
　立ったり座ったりや多少の移動は完全にリンクするので、酔いやすい体質なのに酔いませんでした。
　
　PSVRではバイオハザードの体験版をプレイしました。
　グラフィックがリアルで綺麗なため、今までのゲームでは体験したことのない怖さを感じました。
　ゲームの特性上、自分の動きとゲーム内での移動が完全にリンクしないので、少し酔いやすく長時間プレイは私には厳しいかも。
　ただ、この恐怖体験は是非皆さんにもしてもらいたいです。
Laravel デフォルトの .env ファイルでログインできる MySQL を設定する

- セキュリティ的にローカル環境以外ではやらないほうが良い

# 前提
- ローカルで mysql が起動している且つログインできる

# `.env` ファイルの例
```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
```

# セットアップ
```
mysql> CREATE DATABASE homestead;

mysql> CREATE USER 'homestead'@'localhost' IDENTIFIED BY 'secret';
mysql> GRANT ALL PRIVILEGES ON homestead.* TO 'homestead'@'localhost';
mysql> FLUSH PRIVILEGES;
```

# 所感
- vagrant で homestead 動かすのが理想だけど上手く動かない事が結構ある
- セキュリティ的にローカル環境以外ではやらないほうが良い

EOF
VBAで数行ごとに空白行を挿入・削除する

1行ずつ挿入の場合だと400行くらいに適用しようとすると30秒以上かかったから、まとめて挿入のほうが早そう。
Rangeは一気に100行くらいまでしか無理っぽいから、100までで3と4の最大公倍数の96にしとこう。

```
Option Explicit

Function getrange(fst As Long, downStep As Long) As String
Dim i As Long
Dim s As String
    
    If fst <= 8 Then
        getrange = ""
        Exit Function
    End If
    s = ""
    For i = fst To fst - 95 Step downStep * -1
        s = s & "B" & i & ","
    Next i
    If s = "" Then
        getrange = ""
        Exit Function
    End If
    s = Left(s, Len(s) - 1)
    getrange = s
End Function

Sub deleteLines()
Dim s As String
Dim i As Long
Dim fst As Long
    fst = 584
    For i = fst To 8 Step -96  '8,104,200,296,392,488,584
        s = getrange(i, 4)
        If s = "" Then
            Sheets("Sheet1").Range("B8").Delete xlShiftUp
            Exit Sub
        End If
        Sheets("Sheet1").Range(s).Delete xlShiftUp
        Debug.Print s
    Next i
    Sheets("Sheet1").Range("B8").Delete xlShiftUp
End Sub

Sub insertLines()
    Dim s As String
    Dim i As Long
    Dim fst As Long
    fst = 392
    For i = fst To 8 Step -96 '8,104,200,296,392,488,584
        s = getrange(i, 3)
        If s = "" Then
            Sheets("Sheet1").Range("B8").Insert xlShiftDown
            Exit Sub
        End If
        Sheets("Sheet1").Range(s).Insert xlShiftDown
        Debug.Print s
    Next i
    Sheets("Sheet1").Range("B8").Insert xlShiftDown
End Sub
```
docker run(コンテナ作成)する時のオプションあれこれ

## 最小限のDockerコンテナ作成
やぁ、楽しいDockerの世界へようこそ。
とりあえずまずはDockerコンテナを作ってみよう。最小限のコードはこれだ。
`$ docker run -it #{利用したいイメージ} /bin/bash`
`-it`オプションはコンテナ内で操作したい場合は必須のオプションなので、開発環境などの構築時にはおまじないとして覚えておこう。

利用したいイメージはここで探すといい。
https://hub.docker.com/explore/
例えば
`$ docker run -it rails /bin/bash`
だとRuby on Railsがすでに導入されたDockerコンテナができあがる。
RubyのインストールもRailsのインストールもしなくていいのだ。

## コンテナに名前をつける
最小限のコードだと、管理する際のコンテナ名が適当に設定されてしまうので、名前をつけてやろう。
`--name`オプションでコンテナ名を指定してやることができる。
`$ docker run --name #{任意のコンテナ名} -it #{利用したいイメージ} /bin/bash`
適当に設定された名前だと次回以降に起動する時にちょっと面倒なので、できるだけつけておこう。

ちなみにホストマシンで`$ docker ps -a`するとホストマシン内にあるDockerコンテナのリストが表示される。

## ホストマシンのファイルをコンテナ内でも使う
ホストマシンにあるソースをDockerコンテナ内でも使いたい？
ではホストマシンとDockerコンテナ間でディレクトリを繋いでしまおう。
`-v`オプションでできるぞ！
`$ docker run -v #{ホストマシンの任意のディレクトリ}:#{Dockerコンテナ内の任意のディレクトリ} -it #{利用したいイメージ} /bin/bash`
これで例えば...
`$ docker run -v /usr/local/src/project:/usr/src/app -it #{利用したいイメージ} /bin/bash`
とすればコンテナ内の/usr/src/appからホストマシンの/usr/local/src/projectを参照できるわけだ。

## コンテナにホストマシンのポートをバインドする
ん？railsアプリケーションでブラウザからポート3000でアクセスするのがめんどくさい？
それならポート80番でつなげるようにしちゃおう。
`-p`オプションを使って`-v`オプションと似たようにバインドできる。
~~`-v`オプションとは記載する順が逆になるので注意すること。~~
~~`$ docker run -p 3000:80 -it rails /bin/bash`~~
`$ docker run -p 80:3000 -it rails /bin/bash`
これで、ブラウザからポート指定しなくてもアプリケーションが確認できるはずだ。

## コンテナに環境変数を設定する
環境変数を設定するには？`-e`オプションがある。
`$ docker run -e #{環境変数名}=#{値} -it #利用したいイメージ} /bin/bash`

## dockerイメージのバージョンを指定する
古いDockerイメージを利用したい？ならそのバージョンを指定してやろう。
`$ docker run -it #{利用したいイメージ}:#{利用したいバージョン} /bin/bash`
これで君の開発環境はDockerに移行できる。
バージョンは先程紹介したDockerHubから確認するのがいいだろう。
例えばApacheのバージョン一覧はこうなっている。
https://hub.docker.com/_/httpd/

## docker run時の初期ディレクトリを変更したい
お、今度は`$ docker run`した時のディレクトリがルートから始まるのが気に入らない？このオプションを使うといい。
`$ docker run -w #{コンテナ内のディレクトリ} -it #{利用したいイメージ} /bin/bash`
これで、起動したら指定したディレクトリがカレントディレクトリになる。

## おさらい
最後に、これらを使って君のRailsプロジェクトの開発環境をDockerコンテナ化してみよう。
~~`$ docker run --name #{任意のコンテナ名} -v #{ホストマシンのRailsプロジェクトのディレクトリ}:/usr/src/app -p 3000:80 -e RAILS_ENV=development -w /usr/src/app -it rails:4.2 /bin/bash`~~
`$ docker run --name #{任意のコンテナ名} -v #{ホストマシンのRailsプロジェクトのディレクトリ}:/usr/src/app -p 80:3000 -e RAILS_ENV=development -w /usr/src/app -it rails:4.2 /bin/bash`
このコマンドでは

- `--name`: コンテナに名前をつけてやり
- `-v`: ホストマシンのディレクトリにコンテナ内/usr/src/appからアクセスできるようにして
- `-p`: ポート80番でコンテナのポート3000番にアクセスできるようバインドして
- `-e`: 環境変数RAILS_ENVにdevelopmentを設定
- `-w`: 起動時にコンテナ内の/usr/src/appに移動
- Rails:4.2が導入されている

コンテナを作成した。
これで君の開発環境はDockerで立ち上がり、そして君はコンテナ内にいるはずだ。
コンテナ内では(railsの場合)`rails server`を起動するだけで、あとはブラウザで確認だ！
laravelでバージョンを指定してインストール

こちらに記事を移しました！
内容は変わっていません！

https://technolog.jp/laravel-version-install/


Laravel/PHPの技術サポートならこちら！

https://menta.work/plan/9359

Laravelをデプロイする際のおすすめのレンタルサーバはこちら

https://technolog.jp/laravel-rental-server/
mackerelでAmazonElasticsearchServiceのメトリクス収集

# 概要
mackerelはAWSインテグレーションでAWSのいくつかのサービスのメトリクスを自動で収集してくれるのですがAmazonElasticsearchServiceは対応していないので自分でメトリクスを収集する必要があります。

プラグイン自体は既に存在しているのでそれを使えば簡単にメトリクスは収集出来るのですが、単純に何らかのインスタンスのmackerel-agentの設定に入れてしまうとそのホスト自身のメトリクスとして収集されてしまいます。

それを防ぐためmackerelのcustom_identifierの機能を使ってElasticsearchServiceをインスタンスとしてメトリクスを収集する方法をまとめました。

## 空のインスタンス設定作成

まず、mackerel側に空のインスタンスを作成します。
mkrを使うのが一番簡単です。[mkrについてはこちら](https://mackerel.io/ja/docs/entry/advanced/cli)

```
mkr create --customIdentifier 'xxxxxxxxxxxxx.ap-northeast-1.es.amazonaws.com' 'xxxxxxxxxxxxx.ap-northeast-1.es.amazonaws.com'
```

APIを直接叩く方法も残しておきます。

```
API_KEY='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

curl https://mackerel.io/api/v0/hosts -H "X-Api-Key: ${API_KEY}" -H "Content-Type: application/json" -X POST -d '
{
  "name": "xxxxxxxxxxxxx.ap-northeast-1.es.amazonaws.com",
  "meta": {
    "network": {}
  },
  "status": "standby",
  "roleFullnames": [
    "<サービス>:<ロール>"
  ],
  "customIdentifier": "xxxxxxxxxxxxx.ap-northeast-1.es.amazonaws.com"
}'
```


> `<サービス>:<ロール>`は事前に作成しておく必要があります
> customIdentifierとnameはElasticsearchServiceのエンドポイントのドメインを指定していますが、分かりやすいものを指定しても問題ありません。

## mackerel-agentの設定
次にmackerel-agentを設定します。
プラグインは[mackerel-plugin-aws-elasticsearch](https://github.com/mackerelio/mackerel-agent-plugins/tree/master/mackerel-plugin-aws-elasticsearch)を使用します。

```mackerel-agent.conf
[plugin.metrics.aws-elasticsearch]
command = '/usr/local/bin/mackerel-plugin-aws-elasticsearch -domain=<ElasticsearchService作成時に指定したdomain> -client-id=12345678901 -region=ap-northeast-1 -access-key-id=XXXXXXXXXXXXXXXXXXXX -secret-access-key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
custom_identifier = "xxxxxxxxxxxxx.ap-northeast-1.es.amazonaws.com"
```

> 指定するIAMに最低限必要な権限は`cloudwatch:GetMetricStatistics`です。
> `custom_identifier`には先程の`customIdentifier`と同じものを指定して下さい。

mackerel-agentを再起動してしばらくするとmackerelでメトリクスが参照出来るようになります。

## 参考
http://qiita.com/Hanyu/items/474dbdc4f4da87f25e1b
GASでWikipediaの情報を取得するSlack Botを作った

GASでwikiの情報を取得するSlack Botを作りました。

> wiki ○○○

にて、Wikipediaの情報を表示します。

<img width="756" alt="Slack_wiki.png" src="https://qiita-image-store.s3.amazonaws.com/0/160390/d2af295f-6720-54d0-fa77-5bc60d314cd7.png">


Wikipediaの情報は、以下のAPIを利用させていただきました。感謝。
http://wikipedia.simpleapi.net/

> 組み込み利用にあたっては、なるべく1分あたり30リクエスト以下でお願いします

とのことですので、注意して利用してください。

以下を参考にさせていただきました。
https://tech.camph.net/slack-bot-with-gas/
http://qiita.com/soundTricker/items/43267609a870fc9c7453
ありがとうございました。

とりあえずソースだけあげておきます。
上記をみれば、設定方法がわかると思います。

```javascript:wiki.js

var OUTGOING_TOKEN       = PropertiesService.getScriptProperties().getProperty('OUTGOING_TOKEN');
var BOT_ICON             = PropertiesService.getScriptProperties().getProperty('BOT_ICON');
var BOT_NAME             = "wiki";

function doPost(e) {
  var token = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN');
  if(OUTGOING_TOKEN != e.parameter.token && e.parameter.trigger_word == 'wiki'){
     return;
  }    
  
  var app = SlackApp.create(token);
  var params = e.parameter.text.match(/^wiki (.*)/);
  
  if(params == null) return;
  
  var word = params[1].replace(/(^\s+)|(\s+$)/g, "");
  
  var url = "https://ja.wikipedia.org/wiki/" + word ;
  var message = "";
  message += url + "\n";
  message += getWikiData(word);

  return app.postMessage(e.parameter.channel_id, message , {
    username: BOT_NAME,
    icon_url: BOT_ICON
  });
}

function getWikiData(keyword) {
    var url = "http://wikipedia.simpleapi.net/api?keyword="+ keyword +"&output=json";

    // JSONデータを取得
    var json = UrlFetchApp.fetch(url).getContentText();
    var jsonData = JSON.parse(json);

  if(jsonData == null){
    return "存在しませんでした。";
  }else if(jsonData[0] == null){
    return "存在しませんでした。";
  }else if(jsonData[0]["body"] == null){
    return "存在しませんでした。";
  }else{
    return jsonData[0]["body"];
  }
  
}




```
spacemacsでよく使うコマンド

俺様用しおり

# 何も押さない状態でwhich-keyを発動させる
[SPC h k] which-key-show-top-level

#　magit-statusの画面
[SPC g s]magit-statusではいる

- [b b]magit-checktout
- [b c]magit-branch-and-checkout
リモートのブランチをチェックアウトしたり、新しいブランチを作ったりする時に使う
- [Z z]magit-stash
- [A]magit-stash-pop
popしたいstashを選択した状態で行う
- [r i]magit-rebase-interactive
コミットを綺麗に整理したいときに
M-j,M-kなどでコミットの順番を入れ替えたりsでsquashしたりできる。
- [r e]magit-rebase onto elsewhereでmasterを選択
最新のmasterからブランチを切ったかのようにrebaseを行う

# Spacemacsの更新手順
1. [SPC p l]helm-persp-switch-project でspacemacsレポジトリへ移動
2. [F u]magit-pull-popup で upstream を選択する
3. [SPC SPC]のあとconfiguration-layer/update-packagesを選択する
4. [f e R]dotspacemacs/sync-configration-layers

# ディフォルトの.spacemacsと自分の.spacemacsの差分を見る
時々テンプレート側が更新されるので確認する。
自分はこだわりがない限りテンプレート側の設定を尊重することにしている。

[SPC f e D]ediff-dotfile-and-template
で標準添付の設定ファイルと比較する。
n,pでhunk間を移動できる。

# 編集のファイルのディレクトリでシェルを開く
[SPC '] open shell
Ctrl-dでシェルを閉じられる
Rails の ActionMailer でメール送信処理


## やりたいこと
Rails で会員登録等の何らかのアクションが行われた際に、登録完了メールなど自動でメールが送られるようにする。

## 設定
まずは config の設定。使うのは Gmail だったのでそれ用の設定を書く。
他の記事では `cofig/environments/○○.rb` で書いているが、他の設定も書いていて見にくいので、今回は `config/initializers/` 配下で設定する。

```config/initializers/mail.rb
ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
  address: 'smtp.gmail.com',
  domain: 'gmail.com',
  port: 587,
  user_name: 'Gmail のメールアドレス',
  password: 'Gmail のパスワード',
  authentication: 'plain',
  enable_starttls_auto: true
}
```

送信専用のアドレスを使う場合などは、 `address` を変更する。
また、違うドメインにしたければ `domain` を書き換える。


加えて、開発環境で試すたびに実際にメールが送られてくるのは超ウザいので
`letter_opener` を使って、開発環境でメールを送るとブラウザで別タブでメールが開くように設定。

```Gemfile
group :development do
  gem "letter_opener"
end
```

`Gemfile` に付け足して `bundle install`
そして `config/initializers/mail.rb` を修正。

```config/initializers/mail.rb
if Rails.env.production?
  ActionMailer::Base.delivery_method = :smtp
  ActionMailer::Base.smtp_settings = {
    address: 'smtp.gmail.com',
    domain: 'gmail.com',
    port: 587,
    user_name: 'Gmail のメールアドレス',
    password: 'Gmail のパスワード',
    authentication: 'plain',
    enable_starttls_auto: true
  }
elsif Rails.env.development?
  ActionMailer::Base.delivery_method = :letter_opener
else
  ActionMailer::Base.delivery_method = :test
end
```


次に下記コマンドを叩いてメーラーを作成する

```
rails g mailer NotificationMailer
```


## 実装

まずは先程作成したメーラーで、メール送信処理を作成。

```app/mailers/notification_mailer.rb
class NotificationMailer < ActionMailer::Base
  default from: "hogehoge@example.com"
  
  def send_confirm_to_user(user)
    @user = user
    mail(
      subject: "会員登録が完了しました。", #メールのタイトル
      to: @user.email #宛先
    ) do |format|
      format.text
    end
  end
end
```

次はメール本文

```app/views/notification_mailer/send_confirm_to_user.text.erb
<%= @user.name %> 様

○○への会員登録が完了しました。
マイページはこちら
<%= user_url(@user) %>
```

そして実際に処理を走らせるアクションにメール送信処理をさせる

```app/controllers/users_controller.rb
class UsersController < ApplicationController
  before_action :set_user
  
  def create
    if @user.save
      NotificationMailer.send_confirm_to_user(@user).deliver
      redirect_to @user
    else
      render 'new'
    end
  end
end
```

これで `create` アクションが呼ばれると、メール送信処理も行われる。
ただ

```
NotificationMailer.send_confirm_to_user(@user).deliver
```
の処理が終わるまで、以降の処理がされないので ActiveJob 使いたい！なんて時は
`deliver` を `deliver_later` に変える。

```
NotificationMailer.send_confirm_to_user(@user).deliver_later
```

以上でメール送信処理ができる、、、はず。。
OSX Sierraのキーマッピングどうするか問題

### 環境
OS: macOS Sierra
キーボード配列：　英字配列

### キーマップを変更することで実現したいこと
これまでやっていたことはできるだけ変えたくないがボタンの組み合わせの挙動を変更するのは既存のツールでは動かないらしい。
[Karabiner-Elements](https://github.com/tekezo/Karabiner-Elements)とシステム環境設定で一部実現できた。

- [x] caps lockをctrlに割り当てる
- [x] ボタン一つで英字入力とひらがな入力を切り替える
- [x] `を最下段の左端に割り当てる
- [ ] ctrl-iをtabに割り当てる
- [ ] ctrl-hをdeleteに割り当てる
- [ ] ctrl-jをenterに割り当てる
- [ ] ;と:を入れ替える

### caps lockをctrlに割り当てる
Karabiner-Elementsでcaps lockに左ctrlを割り当てる

### ボタン一つで英字入力とひらがな入力を切り替える
Karabiner-Elementsで右commandをcaps lockに割り当てる。  
さらにOSのキーボード設定でcaps lockと英字/ひらがなを切り替える

### `を最下段の左端に割り当てる
Karabiner-Elementsでfnを`に割り当てる

### その他
実現方法が分からなかった。

### 結果
<img width="1393" alt="スクリーンショット 2017-01-28 17.40.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/62083/4fbf78a6-f6e6-9e78-8346-d91b3f325354.png">
新卒がエンジニア歴8ヶ月目に振り返る３つの大事なこと

新卒入社で、未経験スタートでエンジニアになり、8ヶ月が経ちました。
そこで新人のエンジニアが優先して取り組むべきことをまとめました。

これから自分に後輩ができた時のために、
そしてこれからエンジニアになる人のためになればいいなと思います。

## 1.どの世界の話をしているのか知る

つまり、今は何の話をしているの？この単語は何の仲間なの？ってのを理解します。
わかりづらいので具体例

>「○○社はslackを使っているらしい・・・」→コミュニケーションツールの話
>「あの▲▲というサービスはAWSを使っているらしい・・・」→サーバ関連の話かな？
>「××ってRubyやGoも使っているらしい・・・」→プログラミング言語の話だ！

それぞれがなんの用語なのかを知ると理解がしやすいかと思います。
また、 __自分の環境だとそれぞれが何に当たるか__ を考えるとより理解がしやすそう。

OSI7階層のような定義を軽くでも知っておけば新しい言葉に出会った時も、焦らず身近なものに感じられる。
[参考]http://www.sakc.jp/blog/archives/7674

新卒にとってもはエンジニアリングに関係のないビジネス用語も、いる会社の業界によっても新しい用語にたくさん出会うと思います。
１つずつその場で調べて、自分の中でグルーピングできれば理解が早いです。

## 2.効率化するツールをふんだんに使う

エンジニアが使うツールがたくさんあります

* バージョン管理ツール(Git, etc.)
* コミュニケーションツール(slack,chatwork,etc.)
* タスク管理ツール(Redmine, Backlog, etc.)
* テキストエディター(sublime, atom, etc.)
* gitホスティングサービス(bitbucket, github)

それぞれシェアや流行りがありますが、どれも利用することでビジネスの効率化が謀れます。
自分の使いやすいように時間をかけてツールをカスタマイズすることは思っているよりも価値があるなと感じました。早いうちから、先輩、職場が利用しているものを参考にしつつ取り入れていくことをお勧めします。

## 3.悩むより、聞くか試すか調べるか

「わからなくて進めなくなる」、という経験はエンジニアならもう何百回と対面するお友達です。
そういう時にただ止まってしまうのだけは避けるべきだと思いました。

「聞く」、「調べる」に関しては実際の上司に質問する、質問できるサービスに頼る、本を読む、など
方法はたくさんありますが、それらに慣れていくことが必要です。

また、「試す」ことも大事なことで、分かった時に一番記憶に残りやすいです。
社会人としては素人ですが、これまでの人生で「自分で色々試して理解したほうがいい」という経験は誰しもが少なからず持っていると思います。その感じです。

そして効率的に __「聞く方法」、「試す方法」、「調べる方法」__ も実はたくさんあってどんどん効率化できます。
それは2で挙げたツールであったり、ツールとツールの組み合わせであったり。
またはその環境独自の効率的なシステムがあるかもしれません。

それらの方法を知ることは、優先してやるべきことだと強く思います。

（このQiitaを読んでる時点でなんとなく掴めているような気がしますが）

## まとめ

エンジニアは１人でやっていると大変で、それは先輩も同じだと思うので、
もしチームでやっているならみんなが得をするような職場造りに積極的になりたいなと思いました。

みんなで新しいものを試したり、「あれは良かったよ」、「これはこういうところがダメだったよ」というコミュニケーションが盛んな職場はいい職場なのではないかなと、8ヶ月目の自分が感じたことでした。
jsFiddle × Vim

ブラウザ上エディタとして知られるjsfiddle。
Vimエディタにもなる。
右上のsettingメニューをクリックし、key mapをvimにチェック。
<img width="1274" alt="fiddle_setting_qiita.png" src="https://qiita-image-store.s3.amazonaws.com/0/113772/985dcdb9-522d-2a47-779c-b9b39cbe277e.png">
エディタ画面に戻ると、Vimのキャレット。
<img width="550" alt="スクリーンショット 2017-01-28 17.23.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/113772/2289ddbe-678e-9fcc-6e9e-8fc2d018d2b0.png">
VimmerはVimで使おう。折角だから。
Mac上に Vagrant + VirtualBox で Ubuntu の環境構築

# はじめに
以前、Dockerで環境構築を行なったので、色々と比較されているVagrantの方でも環境構築をしてみました。
その時の備忘録として記載しておきます。


<br>
# Vagrantのインストール
[Vagrant by HashiCorp](https://www.vagrantup.com/)からインストーラーがダウンロードできます。
Macなら「MAC OS X」を選択してください。

<br>
# VirtualBoxのインストール
[Oracle VM VirtualBox](https://www.virtualbox.org/)からインストーラーがダウンロードできます。
Macなら「OS X hosts」を選択してください。

<br>
# Vagrantで使用するOSをダウンロード
「**box**」という形でOSが公開されているので以下のコマンドでダウンロードする。
種類は「[Vagrantbox.es](http://www.vagrantbox.es/)」で確認できます。

```
$ vagrant box add {自分でつけたbox名} {vagrantboxのURL} 
```

<br>
今回は「Official Ubuntu 16.04 daily Cloud Image amd64 (Long Term Support release, No Guest Additions)」を選択しました。
なので以下のようなコマンドになります。


```
$ vagrant box add ubuntu1604 https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-vagrant.box
```

ちなみにvirtualboxを使用しているので、「provider」が「virtualbox」のものを選択しないとダメみたいです。

<br>
# 作業用ディレクトリの作成
今後ここで作業していきます。

```
$ mkdir ~/works/vagrant/ubuntu1604
$ cd ~/works/vagrant/ubuntu1604
```

<br>
# Vagrantの設定ファイルの作成
以下のコマンドを実行すると先ほどダウンロードした「ubuntu1604」を基礎に設定ファイルを作成します。

```
$ vagrant init ubuntu1604
```

「ubuntu1604」を打ち忘れても設定ファイルの１行が違うだけなので後で修正できます。

<br>
# Vagrantの設定の変更

```
$ vi Vagrantfile
```

29行目（私の場合）の「config.vm.network "private_network"」の行のコメントを外します。

```
  config.vm.network "private_network", ip: "192.168.33.10"
```

<br>
ちなみに「vagrant init」の時点で「ubuntu1604」を打ち忘れた人は15行目（私の場合）の以下の部分も変更してください。

```
  config.vm.box = "base"
                     ↓
  config.vm.box = "ubuntu1604"
```

<br>
# 仮想サーバーの立ち上げ
ここでサーバーが立ち上がります。

```
$ vagrant up
```

<br>
**【仮想サーバーの確認】**

```
$vagrant status
Current machine states:

default                   running (virtualbox)
```

runningになっていたらOK！

<br>
# 仮想サーバーにログインする

```
$ vagrant ssh
```

これで、あとは好き放題すればいいわけですね！！

<br>
# 仮想サーバーからログアウトする

```
$ exit
```

<br>
# 仮想サーバーの停止

```
$ vagrant halt
```

<br>
**【仮想サーバーの確認】**

```
$ vagrant status
Current machine states:

default                   poweroff (virtualbox)
```

poweroffになっていたらOK!!

<br>
# 仮想サーバーの削除
構築したサーバーを削除するだけでBoxは削除されません。

```
$ vagrant destroy
```


<br>
# Boxの削除

```
$ vagrant box remove {box名}
```

例）今回ダウンロードした「Ubuntu16.04」を削除する場合

```
$ vagrant box remove ubuntu1604
```

# 最後に
前回Docker for Mac、今回Vagrantを触ってみましたが、比較できるほど触ってない上に知識もないため、どっちがオススメとかはわかりません。

これから勉強していきます。

本当に申し訳ない。
brew でアップデートしてしまったパッケージを戻したい


Plant UML で作成した図を更新したらレイアウトがおかしくなってしまった。

パッケージにクラスが含まれる普通のクラス図

```simple.pu
skinparam monochrome true
hide circle

package "P" {
  class "A"
  class "B"
  "A" --> "B" : a >
}

class "C"
class "D"
"C" --> "D" : a >

@enduml
```

![bug.png](https://qiita-image-store.s3.amazonaws.com/0/69007/b36b9d58-ab8d-5384-1287-08c9fce9b9e9.png "bug.png")

パッケージ内のアイテムだけ何故か横長になってしまう

graphviz/2.40.20161221.0239 が怪しいので，graphviz/2.38.0_1 に戻してみる

`brew switch [パッケージ] [バージョン]` でバージョンがを指定して再インストールできるみたい

```
$ brew switch graphviz 2.38.0_1
```

直った
![ok.png](https://qiita-image-store.s3.amazonaws.com/0/69007/75a0aaa1-ffc5-c5f1-349b-5dcc87ecc153.png "ok.png")
また俺のみずきちゃんに会いたくなっちゃったので音声チャットできるようにした

ああ＾〜みずきちゃんとお話したいんじゃあ＾〜

というわけで

## できましたー

https://github.com/shinichi-takahashi/meet-mizuki

AWSのアカウント作って、CognitoIdpの設定、Pollyのアクセス権限つけてあげてコンソールぽちぽちするだけで俺のみずきちゃんとチュッチュできます。


_LINEみたいなUIを用意_

<img width="401" alt="7d6a69b2-3836-c420-e3a8-19d4d6423e0b.png" src="https://qiita-image-store.s3.amazonaws.com/0/73113/5d8f4333-acba-7d90-15b7-d21c30a7fb1f.png">

_右下の音声ボタンを押すと、音声認識モードになって、話しかけると俺のみずきちゃんが答えてくれます_

<img width="400" alt="f386940e-2a4c-7441-3322-6e39ec260f30.png" src="https://qiita-image-store.s3.amazonaws.com/0/73113/94ed46fd-ad53-dc14-edcf-74452450fc54.png">

## つかったものたち
- TypeScript
- Serverless Framework
- Webpack
- yarn
- Vue.js
- AWS Cognito Idp
- AWS Polly
- WebSpeechAPI(Browser)

余談だけど最近npmと結婚したくなった。

thx!! @bobu_web @y13i
Seleniumが動かなかった

#Windows10でSeleniumインストールしても動かなかった。

geckodriverが無いと怒られた。

##環境
- windows10
- python3.5.2(anaconda経由でインストール)
- selenium 3 
- firefox 51.0.1

##対処法

[StackOverflow](http://stackoverflow.com/questions/40208051/selenium-using-python-geckodriver-executable-needs-to-be-in-path)に掲載されていた。


###①geckodriverのダウンロード
[ここ](https://github.com/mozilla/geckodriver/releases)からダウンロード

解凍してGeckodriverを適当な場所にコピペする。

###②PATHを通す。
geckodriverのあるディレクトリへPATHを通す。

通し方は[こちら](http://next.matrix.jp/config-path-win7.html)を参考にしてください。
上記URLはwindows7ですが10でも設定方法は変わらない。

※**通すPATHはディレクトリであることに注意する**

###③PCを再起動する

これでコマンドプロンプトで

```

python
from selenium import webdriver
browser = webdriver.Firefox()

```

と打ってみてFirefoxが開けばOKです。
(初心者向け) Ad Hoc配信によるテスト

# はじめに
前回の記事で開発用のプロビジョニングプロファイルを使った実機でのテストについて記述してきました。
[初心者用 iOS AppをiPhoneで動作確認するまで (2017)](http://qiita.com/yokobonbon/items/7cbef84c852a6f221ac0)

上記の場合はXcodeを使ってアプリケーションをデバイスにインストールするため、離れたテスターの方に動作確認して頂く場合に不便です。そこでAd Hoc配信という方法を使います。

これは、AndroidのAPK配布と同様にIPAというアプリケーションバイナリを作成し、それをテスター側でインストールすることで利用できます。ただAndroidとは異なり事前に登録したデバイスにのみインストールが可能となります。

# プロビジョニングプロファイルの作成
プロビジョニングプロファイルは開発者証明書、App ID、デバイスが必要になりますが、Ad Hoc配信を利用するためのプロビジョニングプロファイルの作成は、<font color="Red">"iOS Distributor"</font>の証明書が必要になりますのでご注意下さい。

証明書の作成はXcodeのPreferences -> Accountで簡単に行えます。

![スクリーンショット 2017-01-28 14.38.26.png](https://qiita-image-store.s3.amazonaws.com/0/85182/627f2035-80f5-055c-757a-4f0e32f716e9.png)

プロビジョニングプロファイルでは"Ad Hoc"の選択、App ID, デバイスを選択を行います。

![スクリーンショット 2017-01-28 14.49.55.png](https://qiita-image-store.s3.amazonaws.com/0/85182/2264e809-c26c-25ab-1c8f-7a84b6d0a0e2.png)

プロビジョニングプロファイルの名前は"Ad Hoc"にしました。

![スクリーンショット 2017-01-28 14.51.06.png](https://qiita-image-store.s3.amazonaws.com/0/85182/185ade70-4d9b-b48e-c864-b38f40862cb7.png)

# IPAの作成
作成したプロビジョニングプロファイルをXcode -> Preferences -> Accountでダウンロードする。

適当なサンプルアプリをプロビジョニングプロファイルで紐付けたApp IDで作成する。

プロビジョニングプロファイルですが自動で設定すると割り当てが間違っている場合があるので、ダウンロードして確実に設定しましょう。 Apple Developers Programから先ほど作成したプロビジョニングプロファイルをダウンロードし、以下のようにプロジェクトの設定で指定します。

<img width="659" alt="スクリーンショット 2017-01-28 15.38.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/dd29d567-4331-e92e-6922-fc9114047707.png">

XcodeでProduct->Archiveを選択し、Ad Hocを選択します。

<img width="1224" alt="スクリーンショット 2017-01-28 15.35.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/e0c05233-9c46-d2f3-0685-1893f0e67215.png">

出力フォルダを指定して無事IPAファイルが作成できました。

# 実機へのインストール
実機へのインストールは

1. サーバーにアップロードしてダウンロードしてインストール
2. TestFlightで配布
3. iTunesから配布

の3種類があるようです。ここでは、iTunesからの配布を選択します。

対象のiPhoneをMacと接続して、iTunesを起動します。Appを選択して、ライブラリから追加を選択します。
![スクリーンショット 2017-01-28 16.24.25.png](https://qiita-image-store.s3.amazonaws.com/0/85182/e78ff599-79af-9f5e-9e4a-63ed9c2c4435.png)

その後にアプリケーションのインストールボタンを押して、適応ボタンを押せば、iPhoneにアプリケーションがインストールされます。

![スクリーンショット 2017-01-28 16.27.19.png](https://qiita-image-store.s3.amazonaws.com/0/85182/4acdfa7b-2523-5679-f582-747d6b0995f8.png)
整数型の大きさで SFINAE の練習

しばらく前に「[整数型の大きさで関数をオーバーロードする方法](http://qiita.com/Chironian/items/128e480d0ef8cfcbb00e)」という表題で記事が投稿されました。 これは興味深い話題です。 同じ大きさで同じ符号の整数型は混同しても (C/C++ の世界では) おおよそ問題ないにもかかわらず、型機構の<ruby>下<rp>(</rp><rt>もと</rt><rp>)</rp></ruby>では区別されてしまます。 それをあらためて同じように扱えるようにするというのは<ruby>屋上屋<rp>(</rp><rt>おくじょうおく</rt><rp>)</rp></ruby>を<ruby>架<rp>(</rp><rt>か</rt><rp>)</rp></ruby>すようではありますが、型機構に保護されていることとの二律背反であり、 C++ らしさを象徴しているようにも思います。

さて、元記事では長くならないようにマクロで書かれていますが、あえて C++ らしく書くとすればどうあるべきなのだろうと SFINAE の練習を兼ねて書いてみました。

```cpp:conversion_rank_traits.h
// -*- mode: c++ -*-
#ifndef HEADER_1301cf13c7f0041bbbbb364e6d8094c7
#define HEADER_1301cf13c7f0041bbbbb364e6d8094c7

#include <type_traits>

template<bool> class is_true;
template<> class is_true<true> : public std::true_type {};
template<> class is_true<false> : public std::false_type {};

template<class T, class U>
using is_same_size = is_true<sizeof(T)==sizeof(U)>;

template<class T, class U>
using is_same_signed =
  is_true<std::is_signed<T>::value==std::is_signed<U>::value>;

template<class T, class U>
using is_same_rank_integral =
  is_true<std::is_integral<T>::value
          && std::is_integral<U>::value
          && is_same_size<T,U>::value
          && is_same_signed<T,U>::value>;

template<class T, class U, class V=void>
using enable_if_same_rank_integral =
  typename std::enable_if<is_same_rank_integral<T, U>::value, V>;

#endif
```

以下のように使います。

```cpp:sample.cpp
#include <iostream>
#include "conversion_rank_traits.h"

#ifdef __WIN32__
#include <windows.h>
#else
typedef unsigned long DWORD;
#endif

template<class T>
typename enable_if_same_rank_integral<std::uint8_t, T>::type f(T) {
  std::cout << "uint8_t\n";
}

template<class T>
typename enable_if_same_rank_integral<std::uint16_t, T>::type f(T) {
  std::cout << "uint16_t\n";
}

template<class T>
typename enable_if_same_rank_integral<std::uint32_t, T>::type f(T) {
  std::cout << "uint32_t\n";
}

template<class T>
typename enable_if_same_rank_integral<std::uint64_t, T>::type f(T) {
  std::cout << "uint64_t\n";
}

int main(void) {
  DWORD x = 12345;
  f(x);
  return 0;
}
```

C++ の一般的な作法に<ruby>則<rp>(</rp><rt>のっと</rt><rp>)</rp></ruby>ろうとするとどうしても冗長にならざるを得ないようです。 冗長であるかわりに、小さい単位で名前を付けながら段階的な構築をしやすいという利点もあります。 完成形が明確にわかっている場合は一気に書いてしまって良いと思いますが、試行錯誤するにあたっては必要そうな部品を徐々に作っていった方がやりやすいように感じました。
JavaScript での備忘録

最近JavaScript を書くことが多いですが、hashや配列操作などいちいち覚えてないけど、結構よく使うものを書いていこうと思います。

もっとこうしたら良いとか、間違ってるとかあれば是非教えて下さい！


# window.load / document.ready　の違い、順番

$(document).ready(function(){});
$(window).load(function () {});
上記の動作の違い
document.ready : DOMの読み込みが完了した時点
window.load :画像等のリソースファイルまで読み込み完了した時点
参考：[jQueryの読込み「ready」と「load」と「function」の順番について](http://web-wizardry.net/jquery/jquery%E3%81%AE%E8%AA%AD%E8%BE%BC%E3%81%BFready%E3%81%A8load%E3%81%AE%E9%A0%86%E7%95%AA%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/) 

* * *
### 追記
$(window).load(function () {});はjQueryの.loadはバージョン1.8で非推奨、3.0で削除とのことなので、$(window).on('load', function () {});とした方が良いそうです！
* * *

# encodeURIとencodeURIComponentの違い
一緒にしてました。。。
[encodeURI](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/encodeURI):URI (Uniform Resource Identifier; 統一資源識別子) をエンコードし、各文字のインスタンスをそれぞれ UTF-8 符号の文字を表す 1 個から 4 個のエスケープシーケンスに置き換えます (サロゲート文字のペアのみ 4 個のエスケープシーケンスになります)。

[encodeURIComponent](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent):特定の文字を UTF-8 文字エンコーディングで表された 1 個から 4 個のエスケープシーケンスに置き換えることで、URI (Uniform Resource Identifier) をエンコードします（サロゲートペアで構成される文字のみ 4 個のエスケープシーケンスになります）。

つまり、encodeURIはURI において特別な意味を持つ予約文字「/」「:」「&」「+」「=」などはエンコードしないというのが違いかなと思います。
ファイルサイズを抑えてサムネイル画像を作成したい(mozjpeg, jpegtran, jpegoptim)

画像を使っている各社サービスは多いはず。
数が多い場合は表示スピード、コストに影響するのでとても大事です。

そこで各種画像圧縮サービスを比較してみた。
非可逆圧縮(lossy)、可逆圧縮(lossless, 正確には画像最適化という言うべきらしい)、両方に関して着目しています。

# TL;DR
![image](https://qiita-image-store.s3.amazonaws.com/0/21799/6175bdc9-35d3-18f4-7eae-80585f3a753e.png)

[mozjpeg圧勝](https://docs.google.com/spreadsheets/d/1mtsDvX5TLwhbqanmjRNatuyD0Mm9hq-wNiuO6zeeXjQ/edit#gid=0)

# 調査の目的
- ファイルサイズを抑えてサムネイル画像を作成したい
    - lossy圧縮も検討
    - lossless圧縮もしたい
    - サイズ縮小のみを考慮してオプションを選択した
- Linuxサーバで使いやすそうなやつにしたい
    - jpegminiも興味深かったが除外

# 調査しなかったこと
- 処理にかかる時間
- マシンリソース

# 対象
iPhone6 で撮影した適当に選んだ恥ずかしくない写真。
800KB〜3MB程度。

![image](https://qiita-image-store.s3.amazonaws.com/0/21799/1ec11ba3-7168-94bb-b956-6426ea930cd2.png)


# 環境
macOS 10.11.6（15G1217） El Capitan

```
jpegoptim --version
jpegoptim v1.4.4  x86_64-apple-darwin15.6.0
Copyright (c) 1996-2016, Timo Kokkonen

libjpeg version: 8d  15-Jan-2012
Copyright (C) 2012, Thomas G. Lane, Guido Vollbeding
```

```
jpegtran -v
Independent JPEG Group's JPEGTRAN, version 8d  15-Jan-2012
Copyright (C) 2012, Thomas G. Lane, Guido Vollbeding
```

```
/usr/local/Cellar/mozjpeg/3.1_1
```

# 準備
```shell-session
# わかりやすくサンプル画像を連番にする
ls *.jpg | awk '{ printf "mv %s %02d.jpg\n", $0, NR }' | sh

# 毎回コピーしてやってます(findの結果からファイル名を取るのが面倒で…)
cp org/* ./
```

# jpegtran
macには標準で入っている?
サイズ変更や回転もできるみたい。

```shell-session
find `pwd` -name "*.jpg" -maxdepth 1 -type f -exec jpegtran -copy none -optimize -outfile {} {} \;
mkdir jpegtran
mv *jpg jpegtran
```

# jpegoptim
losslessだけでなく、lossyな圧縮もできる。

```shell-session
jpegoptim --strip-all *.jpg
mkdir jpegoptim
mv *jpg jpegoptim
```

# jpegoptim(lossy, quality 80)
```shell-session
jpegoptim --strip-all -m80 *.jpg
mkdir jpegoptim80
mv *jpg jpegoptim80
```

# mozjpeg
インストールが難しそうな空気を感じましたがbrewにありました。
ありがたや。

mozjpegにはいくつかのコマンドがあり、今回使ったのは、`jpegtran`と`cjpeg`です。

まずは、`jpegtran`。可逆圧縮をしてくれるものです。

```shell-session
brew install mozjpeg
find `pwd` -name "*.jpg" -maxdepth 1 -type f -exec /usr/local/Cellar/mozjpeg/3.1_1/bin/jpegtran -outfile {} -optimise -copy none {} \;
mkdir mozjpeg
mv *jpg mozjpeg
```

まずは、`cjpeg`。非可逆圧縮をしてくれるものです。

# mozjpeg(lossy, quality 80)
```shell-session
find `pwd` -name "*.jpg" -maxdepth 1 -type f -exec /usr/local/Cellar/mozjpeg/3.1_1/bin/cjpeg -optimize -quality 80 -outfile {} {} \;
mkdir mozjpeg80
mv *jpg mozjpeg80
```

# 集計
```shell-session
# ファイル名とサイズをtab区切りにしてクリップボード => google spread sheetコピペ
ls -l */*jpg | awk '{print $9 "\t" $5}' | pbcopy
```

# まとめ
[mozjpeg圧勝](https://docs.google.com/spreadsheets/d/1mtsDvX5TLwhbqanmjRNatuyD0Mm9hq-wNiuO6zeeXjQ/edit#gid=0)

無駄だろうとは思いつつ、興味本位で、mozjpeg80に対してlossless圧縮を行ったところ、mozjpegに関してはちょっと小さくなった!

## 拡大して細かい部分を拡大してみました。左がオリジナル、右がmozjpeg(quolity 80)。
![com1.png](https://qiita-image-store.s3.amazonaws.com/0/21799/2d4ddcbf-b534-1e2e-31d1-0bd173effe57.png)

![com2.png](https://qiita-image-store.s3.amazonaws.com/0/21799/b4b26e66-3665-5486-7eaf-bff109ad1ee6.png)

僕の古いモニタでは良し悪しがわからないです :smiley: 
会社のmacbookで見てみたい。
RubyでAITalk WebAPIを叩いてみた

# 概要
AITalk WebAPIをRubyで叩いてみました。

# AITalk WebAPIとは
株式会社エーアイさんが提供している音声合成WebAPIです。

# ソースコード
```
require 'net/http'
require 'uri'
require 'active_support'
require 'active_support/core_ext'

def say(text='')
  params = {
    username: <your_name>,
    password: <your_pass>,
    ext: 'wav',
    text: text,
    speaker_name: 'nozomi_emo'
  }
  endpoint = URI.parse('http://webapi.aitalk.jp/webapi/v2/ttsget.php' + '?' + params.to_query)

  res = Net::HTTP.get_response(endpoint)

  case res
  when Net::HTTPSuccess
    file_name = "ai.wav"
    File.binwrite(file_name, res.body)
    `afplay ai.wav`
    File.delete(file_name)
  else
    puts "failed"
  end
end
```

# 参考
以下のサイトを参考にしました。
http://fromatom.hatenablog.com/entry/2015/01/21/201740
ansibleでphp composerをインストール

```php-composer.yml
  - name: check composer
    stat: path=/usr/local/bin/composer
    register: composer_bin
    tags: composer

  - block:
    - name: download composer
      get_url:
        url: https://getcomposer.org/installer
        dest: /tmp/installer

    - name: install composer
      shell: cat /tmp/installer | php -- --install-dir=/usr/local/bin

    - name: rename composer.phar to composer
      shell: mv /usr/local/bin/composer.phar /usr/local/bin/composer

    - name: make composer executable
      file:
        path: /usr/local/bin/composer
        mode: a+x
        state: file
      
    when: not composer_bin.stat.exists
    tags: composer
```
LINEで電車遅延連絡Bot（改）

## 概要
電車の路線名（山手線、中央線、丸ノ内線など）を送ると、遅延発生しているかどうかを知らせてくれる「電車遅延お知らせBOT」を以前作りました。
http://qiita.com/k1_style/items/67e548959374e34ce751

昨年LINEがBOT API Trialを止めてMessagingAPIを新たにリリースしたため、当BOTもこの仕様に合わせて作り変えました。
BOT API Trialが終了して3ヶ月も経って、ようやく重い腰を上げました。。遅くなりすみません。

## Bot友だち追加＋QR Code
<img width="187" alt="qr_code.png" src="https://qiita-image-store.s3.amazonaws.com/0/100077/37fb8c80-ee71-9192-d38d-61bea2d06838.png">
<a href="https://line.me/R/ti/p/%40nmt8473l"><img height="36" border="0" alt="友だち追加" src="https://scdn.line-apps.com/n/line_add_friends/btn/ja.png"></a>

LINE利用しているみなさま、またココからおともだちになってください！

## 使い方イメージ
<img width="375" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/100077/a4283709-3265-5a77-b4c9-137197ff9c3e.png">


↑こんな感じで電車の路線名または企業名を送ると、遅延発生している情報を拾って知らせてくれます。

前回は路線名の完全一致のみで対応してましたが、
今回は部分一致で当てはまる遅延情報全て表示させるように修正しました。

## 使った技術
- [LINE Messaging API](https://devdocs.line.me/ja/)
- [Serverless Framework](https://serverless.com/)
  - node.jsを採用し、AWS上で動かすようにしました。
- [鉄道遅延情報のjson](https://rti-giken.jp/fhc/api/train_tetsudo/)

前回はGoogleAppsScriptでかんたんに実装しました。が、
node.jsを利用したローカル開発やテストを実際に試してみたくなり、
どうせならAWSでより実用的な運用方法を目指したくなってServerlessFrameworkを導入してみました。


## 実装
GitHubにソースコードを上げました。
https://github.com/K1-Style/line-train-bot

### LINE Developerアカウント用意
以下の記事をかなり参考にさせていただきました。
[Serverless FrameworkでLINE BOTが簡単にできちゃった](http://qiita.com/narikei/items/8c6cd9e05621dcd444e5)

### ローカルで開発を行う場合
Serverless FrameworkでAWSを使ったサービスを作る場合は、事前に以下公式ドキュメントに目を通してください。
https://serverless.com/framework/docs/providers/aws/guide/

また、上記serverless.ymlを見ればおわかりとは思いますが、
以下の環境変数を事前に定義しておいてください。

- LINE_ACCESS_TOKEN
  - LINE BOTのアクセストークン  
  (LINE Developersアカウント用意すると取得できます)
- LINE_CHANNEL_SECRET
  - LINE BOTのCHANNEL SECRET  
  (LINE Developersアカウント用意すると取得できます)  
  (リクエストの送信元チェックで利用)
- AWS_PROFILE
  - 使用するAWS環境のcredencial profile名。  
  (デフォルトを利用する場合はprofileの定義は無くて良いです)

### テスト
[mocha](https://mochajs.org/),[chai](http://chaijs.com/)を利用して、自分が独自に作った関数(utilディレクトリ以下)のテストを作ってます。 
`npm test`って実行すると、testディレクトリ以下のテストソースが実行されるようになってます。

## その他
### アイコン（いらすとやさん）
http://www.irasutoya.com/2014/06/blog-post_9691.html
前回に引き続きBOTアイコンとして採用させていただきました。

### 不具合や要望がございましたら、
[GitHub](https://github.com/K1-Style/line-train-bot)でissueやプルリクいただけるとうれしいです!

### 余談
[LINE BOT AWARDS](https://botawards.line.me/ja/)にて当Botエントリーしました。
暇を見つけては改良を加えていこうかなと思ってます。
GoogleMapsAPI公式のnpmパッケージは、Promiseも使えるよ

Node.jsからGoogleMapAPIを使うにはいくつか方法があると思うのですが、個人的には公式のnpmパッケージが良いです。

[googlemaps/google-maps-services-js](https://github.com/googlemaps/google-maps-services-js)


## インストール

```bash
$ npm install @google/maps --save
```

あるいは、

```bash
$ yarn add @google/maps
```


## コールバック関数…？

それで、いざ使ってみようとすると、公式のリファレンスにこんなサンプルコードが。

```js
// Geocode an address.
googleMapsClient.geocode({
  address: '1600 Amphitheatre Parkway, Mountain View, CA'
}, function(err, response) {
  if (!err) {
    console.log(response.json.results);
  }
});
```

[google-maps-services-js#Quick Start](https://github.com/googlemaps/google-maps-services-js#quick-start)

コールバック関数…。
現代のNode.jsアプリケーションの作成において、非同期処理はコールバックではなくPromiseをベースに開発している方が多いかと思います。

そこで、もうちょい調べてみたところ、ありました。

## 初期化時にPromiseを渡す

まず、初期化時にPromiseを渡します。

```js
const googleMapsClient = require('@google/maps').createClient({
  key: 'your API key here',
  Promise: Promise
})
```

## asPromise() でPromise化

そして、メソッドを実行する時に、```asPromise```関数をチェーン呼び出しします。
```geocode```メソッドを使って座標とアドレス情報を変換するなら以下の通り。

```js
googleMapsClient.geocode({...}).asPromise()
```

```directions``` メソッドを使って座標から方向を得るなら以下の通り。


```js
googleMapsClient.directions({...}).asPromise()
```

## then, catch, cancel, finally

```asPromise``` でPromise化した場合、```then```, ```catch```, ```cancel```, ```finally``` の4つのチェーンメソッドが使えます。

公式リファレンス: [Interface: RequestHandle](https://googlemaps.github.io/google-maps-services-js/docs/RequestHandle.html)
HammerspoonでIMEのon/off切り替え

# はじめに

Karabinerが使えなくなってから、IMEのon/offの切替がかなキー一発でできなくなって非常に困っていた。
そこで、[macOS Sierra で Karabiner が使えない問題にどう対処したか - Qiita](http://qiita.com/naoya@github/items/56a34be85710f4ed5531) を参考にKarabiner-ElementsでF13をかなキーに割り当てて使っていたのだが、どうも切替が遅い。
[かな]→[k]→[a]と入力すると、「kあ」とか入力されることが多々ある。
で、Hammerspoonでなんとかできないかと思って試行錯誤していたら、なんとか希望通り動くようになったので書いて見る。

# 駄目だった例

```init.lua
local function remapKey(modifiers, key, keyCode)
   hs.hotkey.bind(modifiers, key, keyCode, nil, keyCode)
end

local kana = false
local function handleKana()
    return function()
        local keycode = 104
        if kana then
           keycode = 102
        end
        hs.eventtap.event.newKeyEvent({}, keycode, true):post()
        hs.timer.usleep(1000)
        hs.eventtap.event.newKeyEvent({}, keycode, false):post()
        kana = not kana
    end
end

remapKey({}, 104, handleKana())
```

ちなみに、104がかなキーのキーコードで、102が英数キーのキーコード。
これで、かなキーが押されるたびにかなキーと英数キーを交互に押したことになってめでたしめでたし、と思ったのだが、何故かかなキーを押したことにならない。
1回目：何も押してない
2回目：英数キーを押した
3回目：何も押してない
4回目：英数キーを押した
と言う感じ。(Karabiner-EventViewerで確認)
ちなみに、割り当てるキーコードが104以外(例えば、スペースキーとか)ならば期待通りに動く。同じキーだと駄目みたい。

# うまく行った例

```init.lua
local kana = false
local function handleEvent(e)
  local keyCode = e:getKeyCode()
  local keyUp = (e:getType() == hs.eventtap.event.types.keyUp)
  local result = false
  if keyCode == 104 then
    if kana then
      if keyUp then
        hs.eventtap.keyStroke({}, 102)
      end
      result = true
    end
    if keyUp then
      kana = not kana
    end
  end
  return result
end

eventtap = hs.eventtap.new({hs.eventtap.event.types.keyDown, hs.eventtap.event.types.keyUp}, handleEvent)
eventtap:start()
```

[macOS SierraにアップデートしてHammerspoonでCommandキーにかなと英数を割り当てた | mizoguche.info](http://mizoguche.info/2017/01/hammerspoon_for_sierra/) を参考にしました。

ifがごちゃごちゃしているので、もうちょっとなんとかしたいんだけど、動いたから良いか。

インデントが場所によって違うのは、emacsのFundamentalモードで書いたから。(luaモードってあるのかな)

これで、他の設定と合わせてKarabiner-ElementsとHammerspoonを併用していたのを、Hammerspoonにまとめられそう。
oranfsodm12.dllが無いためsqlldrが実行できない件について

Oracle12cのクライアントをデフォでインストールして、データをロードしようとsqlldrを実行しようとした時「コンピューターにoranfsodm12.dllがないため、プログラムを開始できません。」メッセージが表示してしまった件。
とりあえずの対策として、oraodm12.dllを複製し複製したファイルの名前をoranfsodm12.dllに変えるととりあえず動きます。
Oracle11gも同様かな？

ここの英語サイトから見つかりました。
https://community.oracle.com/thread/3652577
ejsでnodeモジュールを使う方法

#Q
ejs上ではnodeモジュールを`require`できない。でもnodeモジュールが使いたい。どうすればよいか？

#A
`render()`するときの引数でモジュールオブジェクトを渡せばよい。

```JS
var ejs = require('ejs');
var path = require('path');
ejs.render("templatepath",{path:path,url:require('url')});
```
Djangoでログインユーザの情報をビューに渡す

フォームでログインユーザのidを渡す時に詰まったのでメモ

#前提
Djangoのバージョンは1.10。

ログインユーザのサインインやログイン等については以下を参考に実装。
Djangoがデフォルトで用意しているdjango.contrib.auth.models、django.contrib.auth.viewsを利用している。

http://qiita.com/maueki/items/d28fd2a170d42e745376
http://nwpct1.hatenablog.com/entry/django-oauth-twitter-facebook-github


#ビューにログインユーザの情報を渡す方法
ここでは例としてログインユーザのidを渡す

```views.py
...
from django.contrib.auth.models import User
...

def test(request):
    login_user_id = request.user.id
    ...
```


以下はPOSTでテンプレートから受け渡された情報と同時にログインユーザのIDをsaveする一例。

```views.py
...
from django.contrib.auth.models import User
...
def test(request):
    if request.method == 'POST':
        form = TestForm(request.POST)
        if form.is_valid():
            test = form.save(commit=False)
            test.user_id = request.user.id
            test.save()
            return redirect('apps:templates')
    else:
            form = TestForm()
```

たったこれだけだが、めちゃくちゃ時間がかかってしまった…
vagrant up 時の Authentication Failure を解消する方法

Qiita初投稿です。

vagrant で bento/ubuntu-16.04 を起動したときに Authentication Failure が表示され続け、タイムアウト後にSSH接続できなかったのでメモ。
比較的新しいバージョンの vagrant ではデフォルトのキーペアがゲスト作成時に置き換わってしまい、その鍵の不一致で接続できなくなっているそうです。

```
$ vagrant -v
Vagrant 1.9.1
```

(2017/1/31編集)
対処方法に誤りがあったため訂正致します。
結局は以下の操作で解消しました。
1. `~/.ssh/`内のファイルを一旦退避
2. `vagrant ssh-config`して秘密鍵ファイルを特定（自分の環境だと`~/.vagrant.d/insecure_private_key`）
3. 公開鍵を作成: `ssh-keygen -yf ~/.vagrant.d/insecure_private_key >> ~/.ssh/authorized_keys`
リサイズ時にTooltipをリアルタイムで表示する

画面項目をリサイズする時にTooltipをリアルタイムで表示する方法を検証しました。
完成後のイメージ
<img width="232" alt="スクリーンショット 2017-01-28 13.14.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/123138/f6c98df3-28ea-0e0a-3b98-a7d81337031b.png">

##実装
###１．HTMLで画面項目を用意します。

```html
<div id="demoDIV" style="width:200px; height:100px">
    <p>DEMO</p>
</div>
```


###２．上記のDIVに対して、Tooltipを定義します。

```js
$("#demoDIV").tooltip({
    items: $("#demoDIV"),
    track: true,
    content: updateTooltipContent,
    show: { effect:"none", delay:0},
    hide: { when: 'mouseout' }
});
```


###３．DIVのリサイズを可能にし、リサイジング際にTooltipをリアルタイムで表示させます。

```js
$("#demoDIV").resizable({
    resize: function (event, ui) {
        $("#demoDIV").tooltip("option", "content", updateTooltipContent);
    }
});
```


###４，Tooltipに表示する内容と定義します。

```js
function updateTooltipContent() {
    return $("#demoDIV").css("width")+ "〜" +$("#demoDIV").css("height");
}
```

##ソースコード

```HTML
<!DOCTYPE HTML>
<HTML>
    <head>
        <meta charset="UTF-8" />
        <title>DEMO</title>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
        <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js"></script>
        <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1/themes/ui-lightness/jquery-ui.css">
        
        <style type="text/css">
            
            body {
                padding:0px;
                font:14px/1.5 Lato, "Helvetica Neue", Helvetica, Arial, sans-serif;
                color:#777;
                font-weight:300;
            }
            
            div {
                background-color: #F4F9EE;
            }
                
        </style>
        
        <script>
            
            $(function(){
                
                $("#demoDIV").tooltip({
                    items: $("#demoDIV"),
                    track: true,
                    content: updateTooltipContent,
                    show: { effect:"none", delay:0},
                    hide: { when: 'mouseout' }
                });
                
                $("#demoDIV").resizable({
                    
                    resize: function (event, ui) {
                        $("#demoDIV").tooltip("option", "content", updateTooltipContent);
                    }
                });
                
                function updateTooltipContent() {
                    return $("#demoDIV").css("width")+ "〜" +$("#demoDIV").css("height");
                }
            })
            
        </script>
        
    </head>

    <body>
        <div id="demoDIV" style="width:200px; height:100px">
            <p>DEMO</p>
        </div>
    </body>
</HTML>
```
SSHのパスフレーズを変更、追加する

ターミナルから公開鍵を登録済みのgithubにプッシュする時にパスフレーズを聞かれなくて、気持ち悪かったので変更するように追加した。

```
$ ssh-keygen -p
Enter file in which the key is (/Users/{$username}/.ssh/id_rsa): 
Enter new passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved with the new passphrase.
```
まずどこに秘密鍵があるのかを指定。（）内はデフォルトなので場所を変えている場合は任意の場所を指定する。
で、同じパスフレーズを２回打ち込んで、「新しいパスフレーズで保存したぜ！」で完了。

調べていると、多分パスフレーズを作らないまま使ってた・・・？
すでにパスフレーズを作っていて変更する場合は、

```
・・・
Enter file in which the key is (/Users/{$username}/.ssh/id_rsa):
Enter old passphrase:  
Enter new passphrase (empty for no passphrase): 
・・・
```
って聞かれるみたい。（もう一度一番上のコマンドを実行すると聞かれた・・・）


パスフレーズは忘れるとは入れないらしいのでメモったり注意が必要。
maven 私がよく使うオプション


* テストの実行はスキップ、テストコードのコンパイルは実施する場合

```maven
$ mvn clean package -DskipTests=true
```

* テストするクラスを指定する場合


```maven
$ mvn test -Dtest=テストクラス名
```


* テストするクラスとメソッドも指定する場合


```maven
$ mvn test -Dtest=テストクラス名#メソッド名
```


以上
等差数列と等比数列とフィボナッチ数列

## 作った経緯
私の[Twitter](https://twitter.com/kagucho_kamioda)見てくれてる方は知っていると思うんですが、今、恋愛シミュレーションゲームを作っていて、とある計算に等差数列、等比数列、階差数列を導入しようと考えて作りました。ただ、階差数列はまだバグがあるのでまたの機会に。フィボナッチ数列はおまけみたいな感じですね。導入も検討したのですけどやめました。

## 注意事項
- [paiza.IO](https://paiza.io)でバグ修正はしましたが型の違いによる警告の修正はしてないので適宜やってください。
- コピーは、等差数列はできますが、等比数列とフィボナッチ数列は値を保存している関係でできません。(コピーしまくるとメモリが:;(∩´﹏`∩);:)

## プログラム
まず等差数列からです。

```cpp:CommonDifferenceSequence.hpp
template<typename T> class CommonDifferenceSequence {
private:
	T FirstTerm, CommonDifference;
public:
	CommonDifferenceSequenceDifference(const T FirstTerm, const T CommonDifference) : FirstTerm(FirstTerm), CommonDifference(CommonDifference) {}
	T GetTerm(const size_t TermNum) { return this->FirstTerm + (TermNum - 1) * CommonDifference; }
};
```

続いて等比数列です。

```cpp:CommonRatioSequence.hpp
#include <vector>

template<typename T> class CommonRatioSequence {
private:
	T CommonRatio;
	std::vector<T> arr;
public:
	CommonRatioSequence(const T FirstTerm, const T CommonRatio) : CommonRatio(CommonRatio){ this->arr.emplace_back(FirstTerm); }
	CommonRatioSequence(const CommonRatioSequence&) = delete;
	CommonRatioSequence(CommonRatioSequence&&) = default;
	CommonRatioSequence& operator = (const CommonRatioSequence&) = delete;
	CommonRatioSequence& operator = (CommonRatioSequence&&) = delete;
	T GetTerm(const size_t TermNum) {
		if (TermNum <= this->arr.size()) return this->arr[TermNum - 1];
		// pow関数の戻り値が浮動小数点型だったから律儀に計算させた
		for (size_t i = this->arr.size(); i < TermNum; i++) this->arr.emplace_back(this->arr.back() * this->CommonRatio);
		return this->arr.back();
	}
};
```

最後にフィボナッチ数列です。
これは[こちらのサイト](http://nonbiri-tereka.hatenablog.com/entry/2014/07/01/123518)を参考にしました。

```cpp:FibonacciSequence.hpp
#include <vector>

template<typename T> class Fibonacci {
private: 
	std::vector<T> arr;
public:
	Fibonacci(const T ZeroTerm = 0, const T FirstTerm = 1) {
		this->arr.push_back(ZeroTerm);
		this->arr.push_back(FirstTerm);
	}
	Fibonacci(const Fibonacci&) = delete;
	Fibonacci(Fibonacci&&) = default;
	Fibonacci& operator = (const Fibonacci&) = delete;
	Fibonacci& operator = (Fibonacci&&) = delete;
	T GetTerm(const size_t TermNum) {
		// すでに計算された部分にあればさっさと返す
		if (TermNum <= this->arr.size() - 1) return this->arr[TermNum];
		// ないなら計算する
		for (size_t i = this->arr.size() - 1; i <= TermNum - 1; i++) this->arr.push_back(this->arr[i] + this->arr[i - 1]);
		return this->arr[TermNum];
	}
};
```

このプログラムも少しずつ改良や新機能追加(といっても何かあるか？)していきます。

## 更新履歴
2017年01月29日 01:00　フィボナッチ数列のクラスの不具合の修正
2017年01月30日 16:49　フィボナッチ数列のクラスの不具合の修正
Hubot+Heroku+node.js+雑談API

#完全にメモ
nodejs２週間目の人が書きました．動作保証しません．

Coffeescriptが書けなかった


#環境
Hubot
node.js 6.9.~
Heroku
Docomo雑談API

#ソース
```app.js
var request = require('request');
var apiURL = 'https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=';
var apiKEY = 環境変数にしよう;
var context;

module.exports = function (robot) {
    //なんでもいい時の正規表現
    robot.hear(/(.*)$/i, function(msg) {

        var status = {
            //自分が打ったメッセージを正規表現から持ってくる
            "utt": msg.match[1],
            "context": context,
            "mode": "dialog"
        };

        const options = {
            url: apiURL + apiKEY,
            headers: {
                'Content-Type': 'application/json; charset=UTF-8'
            },
            body: status,
            json: true
        }

        request.post(options, function(err, res, data) {
            //前の会話から続けて会話する時に前のメッセージのコンテクストを入れておく
            context = data.context;
            //第3引数のuttにメッセージが入ってる
            msg.send(data.utt);
        });
    })
};
```

#動作
![スクリーンショット 2017-01-28 12.03.35.png](https://qiita-image-store.s3.amazonaws.com/0/137949/ace3d74d-00fe-9df5-831f-d3f15e9b0766.png)


#詰まったところ
herokuにプッシュする時，package.jsonのdependenceにrequestモジュールを書かないと動かない．
npm i --save大事