OmniAICreator/Qiita-1.07M huggingface dataset:
Qiitaの記事をJekyllの投稿の形式に変換してバックアップする

ひょっとしたら隕石が落ちてきたりしてQiitaに投稿した記事が消えてしまうことがあるかもしれない。  
対策として自分ですべてを管理できるところにも記事をバックアップできるスクリプトを書いた。
画像も取得してリンクを書き換えてくれる。

[kotet/qiita-to-jekyll](https://github.com/kotet/qiita-to-jekyll)

## つかいかた

1. [管理画面](https://qiita.com/settings/applications)からアクセストークンを入手する。
2. `python qiita-to-jekyll.py <アクセストークン>`
3. 記事や画像が取得され、変換し保存される。

```text:変換結果の例/2016-12-14-a2203a400136ba50b41e.md
---
layout: post
title: "GitHubのissueを悪用して画像をホストする"
tags: Qiita
---
この記事はQiitaに投稿されたものの転載です。

---
知らなかったので投稿。  
[Dash](https://github.com/Circular-Studios/Dash)というDで書かれたゲームエンジンがあるのだが、そのreadmeの一番上にあるでっかいロゴの画像ファイルがどこにおいてあるのか気になった。  
![でかい]({{ site.url }}/assets/qiita/0/57768/cabd3a50-395c-ee60-6068-875e6b6a96f7.png)
//以下省略//
```

## オプション

### --tag

tagsを指定できる。

### --note

`この記事はQiitaに投稿されたものの転載です。\n---`というところを指定できる。

### --imgpath

画像のURLを置き換える。

### --postdir

変換後の記事の保存場所

### --imagedir

画像の保存場所

---

いい感じになってきたが、[まだうまく動かない場合とかもある](https://github.com/kotet/qiita-to-jekyll/issues)。~~誰か作って~~そのうちなんとかしたい。

追記: [自分のサイトで使ってみました。](https://kotet.github.io/)
MonoDevelopのSource Analysis機能が非常に便利だった

## はじめに
MonoDevelopにはSource Analysisという機能があり、有効にしておくとMonoDevelopがソースコードの改善箇所を指摘してくれるようになります。今回はその設定方法と具体的な指摘内容を実例を交えて紹介したいと思います。

## 確認環境
* OSはMacのOS X El Capitan (10.11.6) を使用
* MonoDevelopはバージョン5.9.6を使用

## 設定方法
MonoDevelopのメニューの「MonoDevelop-Unity」→「Preferences...」→「Text Editor」→「Source Analysis」の「Enable source analysis of open files」にチェックを入れ「OK」をクリックします。これでSource Analysis機能が有効になります。

![image](https://qiita-image-store.s3.amazonaws.com/0/5879/ce63acaf-7345-b790-6527-4213ff0e0e97.png)

Source Analysis機能を有効にすると、MonoDevelopの右側にスクロールバーが表示されるようになります。緑色/青色の箇所にマウスのカーソルを合わせ、改善箇所の内容を確認してみてください。以下の例では不要なusingが指摘されており、ソースコードの該当箇所は色が薄くなって表示されます。（この場合はUnityEngine.UIが不要）

![image](https://qiita-image-store.s3.amazonaws.com/0/5879/174e6b97-8802-74f7-b5d2-00da4828dbc3.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/5879/df0d986d-f539-3aea-2fa6-0c50cb19637d.png)

## 具体的にどのようなコード改善箇所が検出できるのか？
試しに個人で開発しているプロジェクトで確認してみた結果、以下のようなコード改善箇所が検出されました。（あくまでも一例なので参考までに）

### 不要なusingの検出
![image](https://qiita-image-store.s3.amazonaws.com/0/5879/9c3cefc8-7caf-62d1-f68f-387230d40aad.png)

### var宣言の使用
![image](https://qiita-image-store.s3.amazonaws.com/0/5879/97483045-0d4b-1cd6-d8d4-a4f07b103f90.png)

### フィールドに対するデフォルト値での冗長な初期化
![image](https://qiita-image-store.s3.amazonaws.com/0/5879/b0a99aea-cb78-ecfe-e8ef-30ef47020ac0.png)

### 冗長なToString()メソッドの呼び出し
![image](https://qiita-image-store.s3.amazonaws.com/0/5879/49c8d61c-25b9-0bce-4699-5ba3126649b1.png)

### コメント・トークン
ソース上に残っている FIXME/TODO/HACK/UNDONE など

## 個人的に不要だったルール
### staticメソッドへの変更
Unityのイベントコールバックでシーン遷移のような単純なコードも引っかかったため不要という判断です。

![image](https://qiita-image-store.s3.amazonaws.com/0/5879/b0bd58f3-25e1-581c-98be-e291fb6c3312.png)

### 未使用のフィールド
SerializeFieldにして、Inspectorからオブジェクトを割り当ててスクリプトから操作するだけだと検出対象となるようです。ただし、ルールを無効にすると本当に未使用なフィールドが検出されなくなるためルールとしては残しておいてほうが良さそうです。

![image](https://qiita-image-store.s3.amazonaws.com/0/5879/23553f6c-6f26-2f98-5acb-6d615e9d312e.png)

### 三項演算子への変更
可読性が下がる場合もあるためHint→Suggestionに変更しました。

## ルールの調整
上記のようにルールの調整が必要な場合は、指摘箇所で右クリック→「Fix」→「Options for "(指摘内容)"」→「Configure Rule」から調整するようにしましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/5879/e7cb7f1c-b000-5006-bd47-ef5b03dcfccc.png)
AWS S3でのhttps対応含む静的ウェブサイト公開

AWSのS3って単純にストレージとして利用している人も多いと思いますが、html/js/cssだけの静的なウェブサイトやホームページ、アプリなんかはs3でホスティングした方が、落ちることもないし、良いと思う。

## S3での静的ウェブサイト公開
1. S3でバケットを作成
2. html/css/jsを配置する
3. バケットのプロパティ[静的ウェブサイトホスティング]で[ウェブサイトのホスティングを有効にする]を選択し、トップページにしたいhtmlとインデックスドキュメントに設定する
4. バケットのプロパティ[アクセス許可]で[バケットポリシーの編集]を押し、下記を入力

```json
{
	"Version": "2008-10-17",
	"Statement": [
		{
			"Sid": "AddPerm",
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::[バケット名]/*"
		}
	]
}
```

上記でバケットのプロパティ[静的ウェブサイトホスティング]の[エンドポイント]に記載されているURLで配置したhtmlが公開される

上記だと公開されるURLが
http://[バケット名].s3-website-[region].amazonaws.com/~
みたいになる。
これをhttpsにしたい場合は、CloudFrontというAWSの別サービスを利用する必要がある。

## https, 独自ドメインでのs3　静的ウェブサイト公開
1. S3でバケットを作成し、html/css/jsを配置する（この時、バケット名を公開したいドメイン名にしておく https://hogehoge.co.jp であれば、バケット名は hogehoge.co.jp )
2. CloudFrontでDistributionを作成
    3. [CreateDistribution]を押し、[Web]の方の[Get Started]を押す
    4. [Origin Settings]
        5. [Origin Domain Name]にカーソルを合わせると上記で作成したS3のバケットが選択肢に出てくるので選択
        6. [Origin Path]は付けたければ
        7. [Origin ID]は[Origin Domain Name]選択で自動付加
        8. [Restrict Bucket Access]を[yes]にする（S３のアドレスで直接アクセスを許さなくする）
        9. [Origin Access Identity]は[Create a New Identity]を選択
        10. [Comment]はわかりやすいもの（自動でもつく）
        11. [Grant Read Permissions on Bucket]は[yes]にする
        12. [Origin Custom Headers]は付けたければ
    13. [Default Cache Behavior Settings]
        14. アクセスをhttpsのみにしたければ[Viewer Protocol Policy]を設定
    15. [Distribution Settings]
        16. [Alternate Domain Names(CNAMEs)]にはs3のバケット名でもあるドメイン
        17. [SSL Certificate]は独自ドメインであればcustomの証明書を選択
        18. [Default Root Object]はs3のrootのhtmlを入力
        19. [log]は付けたければ
19. Route53
    20. [Create Record Set]を押す
    21. [Name]はバケット名に設定したドメイン名を入力
    22. [Type]は[CNAME-Canonical name]を選択
    23. [Value]は上記で作成したCloudFrontの[Domain Name]　(generalから確認可能)


上記でhttpsによる独自ドメインの静的ウェブサイトがs3で公開できるはずです。


何かご指摘、ご意見あればお願い致します。
onlineTool > カウンターツールはGカウンター！

ふと、「自分はソース内の検索を1日何回くらいしているのだろうか。」と思った。
ソースリーディングの効率についての検討中。

ローカルアプリでもいいが、オンラインでカウントするツールを探してみた。

すぐに見つかったのは以下。
https://yonelabo.com/gcounter

使い勝手

- 名前編集: 使いやすそう
- ボタンの数調整: 使いやすそう

追加案

- ブラウザ閉じた時にも最終カウント情報が残るようにすれば便利かも (ブラウザキャッシュを使う??)
- 名前編集と同様「カウント編集」機能があれば便利かも
   - 各カウンタに任意のカウント値を設定できる
   - 過去のカウントからの続きに使う

バグ

- ボタン追加時
   - Zの次がBになっています
   - (大きな問題ではないでしょう)

> ツイートしてくれたらメチャ感激です

Twitterはしないので、Qiitaで書きました。
Slackにintegrationできるカスタマー対応チャットツールのSmooch

本記事は、以前(2016/08/15)に自ブログに投稿した記事の転載です。
まだQiitaに、[Smooch](https://smooch.io/)に関する記事が見当たらなかったので投稿しておきます。

[ピティナ開発者ブログ - Slackにintegrationできるカスタマー対応チャットツールのSmooch](http://ptna.hateblo.jp/entry/2016/08/15/Slack%E3%81%ABintegration%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%83%BC%E5%AF%BE%E5%BF%9C%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AESmooch)

---


## 前置き
遂に、遂に、「Slackにintegrationできるカスタマー対応チャットツール」の本命が来たか！？と思いました。

[Smooch](https://smooch.io/)

先日、[Slaaskが有料になったと嘆いた記事を投稿しました](http://ptna.hateblo.jp/entry/2016/08/08/Slack%E3%81%ABintegration%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%83%BC%E5%AF%BE%E5%BF%9C%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AESlaask%E2%80%A6)が、捨てる神あれば拾う神あり、という諺を実感した次第です。

## 登録の仕方
「Get started for free」のボタンを押します。
あとは、何とチャットでの対話形式で登録完了まで進められます。解説をわざわざ書くまでもない、ほんと楽。
このUI/UXは革新的で、うおおおかっけええええとなります。
「これぞチャットツール」だし「チャットbotでここまでできるんだぜ」というのをこれ以上ない説得力で顕示してきている感じです。惚れる。


## 試しに設置
bodyタグ終了の直前あたりにScriptタグを仕込むだけで設置できます。楽。
はてなブログにも設置できます（[自ブログ](http://ptna.hateblo.jp/)の右下にあるのがソレです。Stop！イタズラ）


## Slackでもいけるし、それ以外でも
登録の最中に、どこにintegrationする？と問われます。
Slackに限らず、HipchatでもLINEでもメールでも何にでもintegrationできます。当協会では、Slackを愛用しているのでSlackにしました。
使い勝手は[Slaask](https://get.slaask.com/)とほぼ同じで、チャットメッセージがユーザから届いたら、そのユーザごとにChannelが増えるかたちですね。
Slaaskとちょっと違うのは、リプライするときには頭に /sk とコマンドをつけること、くらいですが、別段面倒なほどでもありません。


## フリー版でも十分実用に堪えうる
プラン/価格は以下の通りですが、フリー版でも月間2,500メッセージのやり取りができるので、ヘヴィに使わなければ、全く問題ないでしょう。
「問合せフォームを全部チャットに置き換えるぜ！　電話対応もしないぜ！」という中規模以上のサイトでもなければ、いけるいける。

[Smooch - Pricing](https://smooch.io/pricing/)

-----
(2017/01/16追記)
2017/01/13付で料金体系が変更されたようです。
フリー版は従来、月間2,500メッセージのやり取りまで、でしたが、今後は、月間500対話まで、になったそうです。
おそらく、複数メッセージやり取りのまとまりを「1対話」と見なすのでしょう。

-----


## 割と勢いもあるらしい
つい先日、「資金調達ラウンドで760万ドルを獲得した」らしく、今、割と勢いもあるらしいです。

[メッセージングアプリとウェブをつなぐ「チャット・クラウド」Smoochが760万ドルを獲得](http://thebridge.jp/2016/08/chat-company-smooch-raises-7-million)

ので、試しに乗っかってみるのは手でしょう。
Slaaskが有料化してしまって他の代替サービスも今のところこのSmoochくらいしか見当たらないですし。
日本でユーザが増えて、色々と情報が出回るといいなと思います。
Twilio Client iOS を手動インストール

## ライブラリの配置以外で設定すること

* Link Binary With Libraries
"SystemConfiguration.framework"
"AudioToolbox.framework"
"AVKit.framework"
"AVFoundation.framework"
"libcypto.a"
"libTwilioClient.a"
"libssl.a"

* Other Linker Flags
"-lTwilioClient -lcrypto -ObjC -lssl"

## 環境

* Xcode8
* Swift3
Pythonのargparseでサブコマンドを実現する

Python 3 で argparse を使ってサブコマンドをパースする方法を説明します。が、Python に詳しくないのでもっといい方法があるかもしれません。標準ライブラリだけで済ませたいけど、argparse は高機能過ぎて使いづらい…

## やりたいこと

* `git` コマンドのように `git add` や `git commit` を作る
* サブコマンドごとのヘルプを見る `git help` を作る

## サンプルコード

ポイントとしては次の通りです。

* `parser.add_subparsers()` で `parser` を入れ子にする
* `parser_〇〇.set_defaults(handler=関数名)` でサブコマンドごとの処理をハンドラ関数に移譲する
* 未知のサブコマンドが指定された場合はヘルプを表示する

```py:git.py
#!/usr/bin/env python
# coding: utf-8

import argparse


# サブコマンドの実際の処理を記述するコールバック関数

def command_add(args):
    print(args)

def command_commit(args):
    print(args)

def command_help(args):
    print(parser.parse_args([args.command, '--help']))

# コマンドラインパーサーを作成
parser = argparse.ArgumentParser(description='Fake git command')
subparsers = parser.add_subparsers()

# add コマンドの parser を作成
parser_add = subparsers.add_parser('add', help='see `add -h`')
parser_add.add_argument('-A', '--all', action='store_true', help='all files')
parser_add.set_defaults(handler=command_add)

# commit コマンドの parser を作成
parser_commit = subparsers.add_parser('commit', help='see `commit -h`')
parser_commit.add_argument('-m', metavar='msg', help='commit message')
parser_commit.set_defaults(handler=command_commit)

# help コマンドの parser を作成
parser_help = subparsers.add_parser('help', help='see `help -h`')
parser_help.add_argument('command', help='command name which help is shown')
parser_help.set_defaults(handler=command_help)

# コマンドライン引数をパースして対応するハンドラ関数を実行
args = parser.parse_args()
if hasattr(args, 'handler'):
    args.handler(args)
else:
    # 未知のサブコマンドの場合はヘルプを表示
    parser.print_help()
```

## 実行例

サブコマンドを指定しないと、トップレベルのヘルプメッセージが表示されます。

```shell-session
$ python git.py
usage: git.py [-h] {commit,add,help} ...

Fake git command

positional arguments:
  {commit,add,help}
    commit           see `commit -h`
    add              see `add -h`
    help             see `help -h`

optional arguments:
  -h, --help         show this help message and exit
```

サブコマンドに `-h` オプションを付けると、サブコマンドレベルのヘルプメッセージが表示されます。これは、argparse がよしなにやってくれるからです。

```shell-session
$ python git.py commit -h
usage: git.py commit [-h] [-m msg]

optional arguments:
  -h, --help  show this help message and exit
  -m msg      commit message
```

`help` サブコマンドを使った場合も同様です。こちらは自前で実装したからです。

```shell-session
$ python git.py help commit
usage: git.py commit [-h] [-m msg]

optional arguments:
  -h, --help  show this help message and exit
  -m msg      commit message
```

最後に、 `add` や `commit` サブコマンドも期待通りに動作します。

```shell-session
$ python git.py add
Namespace(all=False, handler=<function command_add at 0x102973c80>)

$ python git.py commit -m "message"
Namespace(handler=<function command_commit at 0x10510e7b8>, m='message')
```

## 参考情報

* http://docs.python.jp/3.5/library/argparse.html#sub-commands
Dropbox > disk 100% usage > 「システム起動時にDropboxを開始」をしない > バッチファイルでの遅延実行方法を教えていただいた

```txt:動作環境
Windows 8.1 pro (64bit)
Dropbox version 16.4.30
```

## 症状と対応

Win8.1上でシステム起動時にDropboxを起動するようにしていた。
数日前からdisk 100% usageの状態がOS起動後も10分以上延々と発生している。

以下の対応をした。

- 「システム起動時にDropboxを開始」をオフにする

下記のようになった。

- システム起動後のdisk 100% usage時間: 1分
- Dropbox手動起動後のdisk 100% usage時間: 1分
- その後、時々disk 100% usageの波が発生するが、1分程度で0%近くになる

Dropboxについては、再インストール、セーフモード、今回の対応、などいろいろ試したが、今回の対応が一番シンプルで時間がかからない。

過去にも調べていたが、最近は問題がないと思って「システム起動時にDropboxを開始」を使ってしまっていた。
関連 http://qiita.com/7of9/items/23b1e2ae42c8533364f2

Dropbox手動起動をできない環境では別の対応を探さないといけない。

## バッチファイルでの遅延実行

@jTakasuRyuji さんにバッチファイルでの遅延実行方法を[教えていただきました](http://qiita.com/7of9/items/876f9d61a148d1f6cc52/#comment-4f247adf7d7833ecbf7b)


ありがとうございます。

### バッチファイル

作成場所: `C:\Program Files (x86)\Dropbox\Client`
ファイル名(任意): `startDropbox.bat`

```startDropbox.bat
REM 2017/01/10 suggested by jTakasuRyuji
REM @ http://qiita.com/7of9/items/876f9d61a148d1f6cc52#comment-4f247adf7d7833ecbf7b 

timeout /t 30
Dropbox.exe
```

startDropbox.batをスタートアップに登録した。

Windows 8.1を再起動したところ、disk 100% usageは起動後3分で止まるようになった。

(timeoutの時間はもう少し長くするかは、今後の様子を見て検討します）。

> Dropbox手動起動をできない環境では別の対応を探さないといけない。

バッチファイルを使うことで、Dropbox手動起動をできない環境でも対応できるようになりました。

情報感謝です。

### バッチファイルが消えました 

(追記 2017/01/13)
OS起動時にバッチファイルが実行されないことに気づきました。

`C:\Program Files (x86)\Dropbox\Client`を確認したところ、`startDropbox.bat`は見当たりませんでした。

Dropboxで消したのか、OSで消したのかは不明です。

`C:\Program Files (x86)`とは別のフォルダにバッチファイルを作成し実行したところ、管理者権限でバッチファイルを実行しないとDropboxが起動しなくなっていました。
jsdoでFM変調、復調。　その４

#概要
jsdoでFM変調、復調やってみた。
復調アルゴリズムは、オリジナルです。

#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/0/a/W/0aWH.jpg?t=1483919804)


#成果物

http://jsdo.it/ohisama1/0aWH

#成果物
音が出ます。

http://jsdo.it/ohisama1/aaMg
Google翻訳を利用して英作文トレーニング

Google翻訳に英作文の出題文（日本語）を作成してもらい、英作文をリアルタイムでレビューしてもらおうというお話です。

最近、Google翻訳の精度がかなり向上して、英日翻訳がそこそこ違和感のない日本語をアウトプットしてくれるようになりました。

そこで英文を書かなければならないときには、Google翻訳に英文を入力しリアルタイムに出来上がる日本語を見て、書きたい意図が読み取れる日本語訳になるように英文を推敲することにしました。英語の先生がリアルタイムでレビューしてくれているような感覚です。迷いが減ったので英作文のスピードがかなり向上しました。英作文の質も向上したのではないかと思います。

英作文のスピードアップが狙いなら、まず日本語で書いておいてGoogle翻訳に日英翻訳させる方が手っ取り早いかもしれません。しかしそれでは自分の英語が上達しませんし、日本語の作文にもそれなりに時間がかかる上に英訳に不向きな文章ができてしまいがちなので、トータルで考えると上記の方法はなかなか合理的と言えそうです。

ここから発想を広げて、以下の手順のような英作文トレーニング法を考えました。Google翻訳をハッシュ関数に見立てて、ハッシュ値を見ながら入力値を当てに行くようなやり方です。（ついつい単語を総当りしたくなるところもハッシュっぽい）


手順：

1. お手本にする英文を選ぶ。（スピーチのトランスクリプトとか、新聞や雑誌の記事とかブログとか）
2. Google翻訳にかけて日本語にする。これが出題文になる。
3. 出題文を見ながらGoogle翻訳の左側の枠内で英作文する。右側の枠内にリアルタイム翻訳されて出て来る日本語が出題文と同じになったら、元の英語と同じ文章を作文できているはず。
4. 作文した英語と元の英語を比べてみる。

この方法には以下のメリットがあります。

+ 任意の英文を英作文の題材にできる。例えば英語で語れるようになりたい分野や真似したい人の文章を題材にできる。
+ 英作文の巧拙のフィードバックをリアルタイムで受けられる。生成される日本語訳を見ながらその場で英文を修正することができるので、イライラ感が少ない。
+ スピーチや会話のトランスクリプトを題材にすると、英作文だけでなく、ヒアリングや音読など、いろんなトレーニングで使い回せる。
+ 英語以外にも応用できる。（市販教材の少ない言語の方がありがたみが大きいかもしれない）
+ 一人でできる。
+ タダ。

考慮点もあります。

+ インターネットにつながっている必要がある。
+ 精度が向上したとはいえ、Google翻訳が生成する日本語はまだまだぎこちない。（元の英文を推測するためのヒントと割り切る。日本語としての完成度はさほど重要ではない）
+ 出題文とおなじ日本語訳ができたとしても、元の英文と同じ英文を作文できているとはかぎらない。（その点はハッシュ関数っぽくない）
+ 題材の英文を自分で選ぶので、選んだ題材がお手本として適切である保証はない。間違った英語かもしれないし、自分のレベルに合ってないかもしれない。（チョイスを相談できる上級者がいるといいかも）
+ 初級者には向いてなさそう。初級者向きの英文を探すと結局ちゃんとした学習教材に行き着いて、上記の手間をかける必要がない気がする。

実際にやってみました。
<img width="1195" alt="Screen Shot 2017-01-07 at 8.06.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/71cb6ceb-1ab4-0dae-614f-28d56ffdad06.png">


出題文ができました。
*「はい。 それは楽しいと簡単です。 私はあなたのパンチラインを台無しにすることが嫌いですが、実際に私にとっては難しいことは、最初に私が何を言いたいのかを考え出すことです。 私は書いて座る前に、資料を集めて資料を整理するのに多くの時間を費やします。 私は時間の4分の3がそれだと言っています。 実際の執筆が始まると、それは私のために楽しいものです。 それはただの楽しみです。」*

出題文と同じ日本語訳を目指して推敲を繰り返しながら英作文して、程々のところで終了します。
<img width="1280" alt="Screen Shot 2017-01-07 at 9.57.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/32083/0d461a05-27ef-0b75-b4a0-670da25bfca6.png">

最後に英作文とお手本の英文と比較します（答え合わせ）。

実際にやってみて、自動翻訳された日本語の違い以上にお手本の英文と英作文が違っていたのは残念でしたが、それによって自分の語彙の少なさ、文法力の未熟さに気付かされます。これをたくさんこなすと語彙や表現力が身についていくだろうという実感はありました。問題集よりは意欲をもって取り組めそうです。

年末にふと思いついてまださほど実践していないのですが、今年は英作文をたくさんこなそうという年初の誓いの意味を込めて投稿しました。

ちなみに今回お手本にした英文は[FREAKONOMICS RADIO](http://freakonomics.com/podcast/men-started-thinking-revolution/)というPodcastの一節です。ご参考まで。

以上です。
AWS認定ソリューションアーキテクト - プロフェッショナルレベルにリベンジして合格した

[2015年8月に受験して不合格](http://qiita.com/mechamogera/items/ae42922f50679e64367c)だったのですが、このたびAWS認定ソリューションアーキテクト - プロフェッショナルレベルに合格しました！！
やったあ、嬉しい。

総合スコアは71%で際どいところでまだまだ勉強不足感はありますが、前回の受験と比べて変えたところを記録しておきます。

## 試験勉強

### 模擬試験

サンプル問題と模擬試験を中心にして勉強を進めました。
サンプル問題は解説記事があるのでそれを参考にしました。

模擬試験は、以下の記事を参考にして各問題がどの分野に属しているのか、各分野でどれくらい誤答があるのかを調べて分析しました。
[AWS 認定ソリューションアーキテクト プロフェッショナルに合格したので対策と勉強方を公開 - YOMON8.NET](http://yomon.hatenablog.com/entry/2015/10/21/080826)
分類は完璧にはできないですが、弱い分野は誤答数が多く重点的に見る指針になります。

また、各問題でわからない部分はBlackBeltみたり、WhitePaperよんだりして調べていきました。

ちなみに、これでいけると思って試験2ヶ月ほど前に２度目の模擬試験を受けたのですが、1度目と問題が同じにも関わらずギリギリな感じで不合格でした^^;
弱い分野を重点的に見てみると結構思い込みをしてた部分がわかって良かったです。
ただ、自分側の問題だけではなく、模擬試験では日本語訳がまずいところなど本試験の問題に比べてクオリティが低い部分はある気がします。

参考になるかなと思ってDevOpsの模擬試験も受けてみたもののこちらは分析する時間がありませんでした。
やっていればDeployment Managementの分野の点数上げられたかな？

### 勉強時間

試験勉強の時間は家では子育てで全く確保できず、職場で30分〜１時間ほど地道に進めていきました。
本業務などが忙しかったり他のこと勉強したりとその30分も確保できないことも多かったです。
試験直前の1-2ヶ月もほとんど時間は確保できていなかったですが、模擬試験の分析は終わらせていたのでなんとかなりました。


## 試験当日

集中力維持のために試験30分前にレッドブル飲みました。
３時間の長丁場では後半集中力が切れてしまいますがちょっとはマシだったかな。

今回は1問ずつ見直さなくてもいいくらいじっくり解いていくスタイルにしてみました。
最後の問題を解いた時点で試験終了数分前の状態でした。
残り１時間くらいで焦ってしまったりしましたが、結果的には良かったです。

やはり難しかったですが、模擬試験解いていたおかげで全く手が出ない感じはしなかったです。
技術英語 > the choice of one or the other might [boil down to] a matter of taste,

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 330 / 12833)

言語の選択について

> the choice of one or the other might <font color=red>**boil down to**</font> a matter of taste, or available libraries for your particular application.

https://www.merriam-webster.com/dictionary/boil%20down
> intransitive verb
> 1 :  to undergo reduction in bulk by boiling
> 2 a :  to be equivalent in summary : 

「煮詰まる」を「行き詰る」として使い間違うことについて、森博嗣さんのブログ（もしくはモリログアカデミー）で紹介されていたことを思い出す。
CNTKインストール　Windows10 CPU only 

 V 2.0 Beta 7 がRelease　されたそうです。
[リンク]https://github.com/Microsoft/CNTK


CNTK for Windows v.2.0 Beta 7 CPU onlyをWindows10に
インストールしてみましたので、手順を記載します。
自分にとって初めてCNTKに触れることになります。

1.　CNTKのバイナリをMicrosoft/CNTK/releasesからダウンロード
  [リンク]https://github.com/Microsoft/CNTK/releases
 　CNTK for Windows v.2.0 Beta 7 CPU onlyを選択しました。

2．PowerShell起動
 　管理者command pronpt -> powershell(CR/LF)
 　dirなどのコマンドをたたくと色がつくので、起動されたのが解ります。

3.　.ps1ファイルを実行するためPowerShellの実行ポリシーExecution Policy）をUnrestrictedにします。
　　Set-ExecutionPolicy Unrestricted(CR/LF)

4.　ディレクトリーを移動して、インストール開始
　　cd c:\local\cntk\Scripts\install\windows（CR/LF)
　　.\install.ps1 -execute(CR/LF)

 　CUDAとかvisualC++のruntimeとかの要件があるとの話もありますが、こちらの環境では
　インストールは進みました。(CUDAは入れてないはず)

 　途中、R CR/LF を何回かと
　　1 - I agree and want to continue
　　Q - Quit the installation process
　　と聞かれるので、勿論1(CR/LF)
 　 最後に、y(CR/LF)
5.　powershellを抜けます。
　　exit (CR/LF)
6.CNTK Python環境とPATH設定
 c:\local\cntk\scripts\cntkpy34.bat(CR/LF)

これでWindows10上でCNTKが使えるようになりました。

[リンク]https://github.com/Microsoft/CNTK/wiki/Setup-CNTK-on-your-machine
[リンク]http://www.code-lab.net/?p=20851
Redmineで長いセレクトボックスを自動補完して欲しかったのでプラグインを作った


Redmineでものすごく長いセレクトボックスに遭遇して入力に難儀したことはないでしょうか。僕はあります。

# つくったもの

[Selectbox Autocompleter](https://github.com/heriet/redmine-selectbox-autocompleter)

## 動作例

![動作例](https://qiita-image-store.s3.amazonaws.com/0/77961/ecfedba2-6934-3ef5-09b1-1675a3c923c6.png "ss_author_select2.png")

デフォルトでは 指定したセレクトボックスを[Select2](https://select2.github.io/)に変換します。
プラグイン設定で変換するセレクトボックスをidで指定することができます。

![設定ページでIDを指定](https://qiita-image-store.s3.amazonaws.com/0/77961/eb9a8765-b14a-465e-4870-ab43ea43aee1.png "configure_default.png")

たとえば、デフォルトで指定している「project_quick_jump_box」は右上のプロジェクトジャンプのセレクトボックスです。関わっているプロジェクトが多いときに設定しておくと特に便利でしょう。

セレクトボックスのidさえ調べておけば、自分で変換したいセレクトボックスだけ指定することができます。

ちなみに、project_quick_jump_box だけ Select2 化するプラグインは既にあります（[Improved Searchbox](https://github.com/ries-tech/redmine_improved_searchbox)）また、Select2ライブラリを読み込むプラグインなどは既にいくつかあります（＋[View Customize](https://redmine.org/plugins/redmine_view_customize) プラグインなどと組み合わせて使える）。

このプラグインの場合、インストールするだけで設定ページのID指定から簡単にカスタムしやすくなっているのがよいところです。

## インストール方法

```
$ cd $(REDMINE_HOME)/plugin
$ git clone https://github.com/heriet/redmine-selectbox-autocompleter.git selectbox_autocompleter
```

pluginディレクトリにcloneしてRedmine再起動するだけ（cloneするディレクトリ名は上の通り selectbox_autocompleter にする）

# 経緯とか

ものすごく長いセレクトボックスを頻繁に選択するのがあまりにつらかったので、まずは指定したセレクトボックスにHTML5のdatalist化するような Greasemonkeyをつくっていました。そして、それを利用者全員が使えるよう、Redmine Pluginにしたのが Selectbox Autocompleter です。

![datalistを使ってautocomplete](https://qiita-image-store.s3.amazonaws.com/0/77961/8dc37ea0-58a6-488a-dae1-c831302ff381.png "ss_jump_datalist.png")

datalistを使う場合、jqueryに依存しないし軽量というメリットはあります。が、いかんせんテキストボックスを余分に作るので、デザインが崩れたりします。崩れるだけならCSSで調整してもよいのですが、さらにChromeだとものすごく長い datalist に対してスクロールバーを表示してくれない（Firefoxだといい感じにスクロールバーを付けてくれる）という問題があることが後々わかりました。

結局 Select2を使ったほうが使い勝手がよさそうということがわかり、そちらをデフォルトに採用しました（いちおう、datalistを使った場合も機能的には残している）

![select2を使ってautocomplete](https://qiita-image-store.s3.amazonaws.com/0/77961/76fbf22d-f0bb-cc33-a34c-27b27c8cfb35.png "ss_jump_select2.png")


あと、上に上げたようにSelect2を組み込める類似の機能が実現できるプラグインが他にもたくさんあることに、作ったあとに気がついたのですが、せっかくなので自分なりに導入が簡単かつカスタムしやすいように仕上げました。（セレクトボックスのidをいちいち調べないといけないのはちょっと不便ですが、カスタムの幅の広さを優先した）

# まとめ

セレクトボックスの要素数が長すぎて使いにくいRedmineを見つけたときは、ぜひ Selectbox Autocompleter をお試しください
Rails5 + APIモードで後からdeviseを使おうとした時のエラー対応

APIモードでRails構築した後からdeviseでログイン画面作ろうとしてドハマリしたので、備忘録も兼ねて記述

# ハマるまでの経緯
1. Rails + JSフレームワークでSPAを作ろうと考える
2. APIサーバー構築のため、Rails5のAPIモードを使用
3. 一般公開用ページとは他に、管理者用の管理ページ作成に着手
4. ログイン処理周りも全部SPAの枠組みで作ろうとすると認証とか大変だったので、管理ページはRailsに組み込むことにした
5. deviseインストール + 初期設定をGithubのReadme見ながら実施
6. 管理ページを開こうとするとエラーになって動かない!

# 実施した対応
##　エラーその1
### undefined method 'flash' for#\<ActionDispatch::Request>
- なんかflashメソッドが見つかんないって怒られてる
- 経緯5.まで実施して一番最初に発生

### 原因
- Rails5をAPIモードで構築すると、ブラウザ操作に関わるいくつかのミドルウェアがインストールされない。  
[Rails ユーザー必見！Rais 5の注目新機能と変更点まとめ](https://www.wantedly.com/companies/wantedly/post_articles/31132)
- インストールされないミドルウェアの中で、flashメソッドが定義されていた。

### 対策
- 以下の行を追加し、ActionDispatch::Flashがインストールされるようにする。

```ruby:config/application.rb
config.middleware.use ActionDispatch::Flash
```

## エラーその2
### undefined method `protect_against_forgery?' for #\<Class>
- ログイン画面(/users/sign_in)にアクセスしようとすると発生
- protect_against_forgery?は
[ここの394行目](https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/request_forgery_protection.rb)
で定義されている。
- 上記モジュール(RequestForgeryProtection)自体はActionController::Base内でちゃんとincludeされてるっぽい([203〜251行目あたり](https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/base.rb))。

### 原因
- Rails5をAPIモードで構築すると、ApplicationControllerの親がActionController::Baseではなく、ActionController::APIになる。
- deviseの各コントローラーは、デフォルトでApplicationControllerを親として継承するようになっている([226・227行目](https://github.com/plataformatec/devise/blob/master/lib/devise.rb))。
- ActionController::APIは、RequestForgeryProtectionをindludeしていない([111〜143行目](https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/api.rb))

### 対策
- deviseの各コントローラーが、ApplicationControllerではなくActionController::Baseを継承するようにする

```ruby:config/initializes/devise.rb
config.parent_controller = 'ActionController::Base'
```


ここまで実施してからサーバーを再起動後、/users/sign_inにアクセスするとログイン画面が表示された。
ファイルから非ASCII文字列を駆逐するワンライナー

ツール使ってアクセスログ集計してたらUAにUnicodeとか紛れてて邪魔くさい…
そんな時は以下のワンライナーで全部消えます。

```sh
# ファイル上書きしても良い
perl -pi -e 's/[^[:ascii:]]+//g;' *.log

# ファイル上書きしたくない
perl -pi.bak -e 's/[^[:ascii:]]+//g;' *.log
```

やったね
Djangoで外部キー制約を記述する

# 目的

- Djangoでの多対一の外部キー制約の記述方法の確認
- Django管理サイト上での外部キー制約の表示

# 前提

- Ubuntu 16.04
- Python 3.5.2
- Django 1.10.5

# 手順

## 外部キー制約の記述

Taskモデルオブジェクトの状態をStatusモデルで記述することを想定している。
(TaskモデルとStatusモデル間で多対一の関係を記述する)


### モデルファイルの記述


statusモデルクラスは通常通り思うがまま記述する。

```python:models/status.py
"""
Model for status
"""
from django.db import models

class Status(models.Model):
    """
    Status for Task
    """
    name = models.CharField('ステータス', max_length=30, blank=False)
```


taskクラス側で外部キー制約を記述する

```python:models/task.py
from django.db import models
from datetime import datetime
from webui.models.status import Status

class Task(models.Model):
    """
    Task to do.
    """
    name = models.CharField('タスク名', max_length=30, blank=False)
    startTime = models.DateTimeField('開始時刻', blank=True)
    endTime = models.DateTimeField('終了時刻', blank=True, null=True)
    memo = models.CharField('メモ', max_length=200, blank=True)
    # status = models.CharField('状態', max_length=20, default='未着手', blank=False)
    status = models.ForeignKey(Status)
```

```python
status = models.ForeignKey(Status)
```

この部分でTaskモデルとStatusモデルの多対一の関係を記述している。
**これで外部キー制約は記述完了**

## 管理サイトでの表示

管理サイトに任意のフィールドを表示する方法は別途探してください。
（そのうち書く？）

### 初期状態

![image](https://qiita-image-store.s3.amazonaws.com/0/40692/73771fa3-f996-f80e-67bb-aa04011944e8.png)

Taskのオブジェクトを設定してもstatusの項目が"Status object"となっていて悲しいのでこれを修正する。

### 修正方法(Statusモデルの修正)

```python:models/status.py
from django.db import models

class Status(models.Model):
    """
    Status for Task
    """
    name = models.CharField('ステータス', max_length=30, blank=False)

    def __str__(self):
        return self.name
```

```python
def __str__(self):
    return self.name
```

この部分でどの情報を管理サイトの情報として表示するかを定義できる。
(＿str＿でオブジェクトが文字列として呼び出された時の表示内容を定義しているだけ？？）

### 修正後

Statusモデルクラスを修正したことで、
Taskモデルのオブジェクトを管理サイトから表示した際に
期待した通りの表示を実現できている。

![image](https://qiita-image-store.s3.amazonaws.com/0/40692/55f63669-e751-23df-0476-91a7e7d895cc.png)
kintone 電子回路シミュレータ 部品オプション設定

#kintone 電子回路シミュレータ 部品オプション設定
simcir-basicset.js で、基本部品を設定しているが、部品によりオプション指定できる項目がある。


OSC を 1Hz、AND の入力端子を３に変更した例

![2017-01-08_21h39_45.png](https://qiita-image-store.s3.amazonaws.com/0/100572/eaf87421-6d0a-696f-61ce-ef5130cb3f7e.png)


#論理回路　入出力端子数指定

- AND
- NAND
- OR
- NOR
- EOR
- ENOR

入力端子数が規定値２だが、「numInputs」 指定して増やすことが可能

ToolBox の指定例

```
    {"type":"AND", "numInputs": 3, "label":"AND(3in)" },
    {"type":"AND", "numInputs": 10, "label":"AND(10in)" },
    {"type":"NAND", "numInputs": 3, "label":"NAND(3in)" },
    {"type":"OR", "numInputs": 3, "label":"OR(3in)" },
    {"type":"NOR", "numInputs": 3, "label":"NOR(3in)" },
    {"type":"EOR", "numInputs": 3, "label":"EOR(3in)" },
    {"type":"ENOR", "numInputs": 3, "label":"ENOR(3in)" },
```

- BusOut

入力端子数が規定値８だが、「numInputs」 指定して増やすことが可能



- BusIn

出力端子数が規定値８だが、「numOutputs」 指定して増やすことが可能

#OSC 発振周波数指定
OSC は、発振周波数の規定値が 10Hzだが、「freq」指定可能

```
 {"type":"OSC", "freq":1, "label":"OSC(1Hz)"},
```

#LED の色指定

- LED
- 4bit7seg
- 7seg
- 16seg

"color", "bgColor" オプションで色指定可能
{"type":"LED","color":"#ff0000", "bgColor":"#000000" }

```
{"type":"LED","color":"Green", "bgColor":"#000000", "label":"LED(Green)"},
```

#kintone アプリでの部品オプション指定

- 部品グループアプリに、基本部品の設定をjson 形式で指定

![2017-01-08_23h23_33.png](https://qiita-image-store.s3.amazonaws.com/0/100572/91823c82-079e-a913-1d5b-75981bb3c11d.png)

- 電子回路アプリで、部品グループを指定するとその基本部品の設定を読み込み、ToolBox に登録する。
- ToolBox に追加された部品が表示され、使用可能になる。

![2017-01-09_00h45_49.png](https://qiita-image-store.s3.amazonaws.com/0/100572/d0221b93-a053-b99e-b67d-bee0b1a93e29.png)
Macにて，スリープ解除時にWindowsの起動音で迎えてもらう

# 目次
1.概要
2.環境
3.スリープ解除を検知する
4.音源を用意する
5.音源再生をスリープ解除のスクリプトに組み込む
6.まとめ

# 概要
Macのスリープを解除した時に，好きなWindowsの起動音で迎えてくれるスクリプトを作成します．

# 環境
macOS Sierra(version: 10.12.2)
AppleScript

# スリープ解除を検知する
下記のサイトを参考に，Macのスリープ解除を検知するプログラムを書きました．
[ASH Planning: スリープの解除を検出](http://ashplanning.blogspot.jp/2005/09/blog-post.html)

```AppleScript:SleepDetect.app
property theRes : ""

on run
	set theRes to do shell script "grep -i 'wake' /var/log/system.log"
end run

on idle
	set tmp to do shell script "grep -i 'wake' /var/log/system.log"
	if tmp is not theRes then
		set theRes to tmp
		display dialog "スリープを解除しました"
	end if
	return 2
end idle
```

このスクリプトをアプリケーションとして保存する際に，「実行終了後にアプリケーションを終了しない」にチェックを入れ，常駐アプリケーションとして起動させます．

上記のコードは簡潔に言いますと，読み取ったシステムのログの変化から，Macの起動を検出し，起動を検出した時にダイアログを表示するというものです．

# 音源を用意する
下記のサイトにて，Windowsの起動音が配布されてるのでmp3でダウンロードし, aiffに変換します．
[Windows Startsounds](http://www.winhistory.de/more/winstart/winstart.htm)
筆者はWindowsXPの音源をダウンロードしました．


# 音源再生をスリープ解除のスクリプトに組み込む
Macのターミナルでは，aiff音源を再生するafplayコマンドがあるのでそれを使います．

```
$ afplay <音源を置いたディレクトリ>/winxp.aif
```
ターミナルで上のコマンドを打つと，音源が再生されるのが分かるかと思います．

それでは，スリープ解除時に音源を再生するスクリプトを書いて行きたいと思います．
...と言っても，先ほどのコードの<code>display dialog</code>の部分を上記のコマンドに変えるだけです．

完成したコード(アプリケーション)は以下のようになります．

```AppleScript:WinAlert.app
property theRes : ""

on run
	set theRes to do shell script "grep -i 'wake' /var/log/system.log"
end run

on idle
	set tmp to do shell script "grep -i 'wake' /var/log/system.log"
	if tmp is not theRes then
		set theRes to tmp
		do shell script "afplay /Users/<ユーザ名>/Desktop/mymusic/winxp.aif"
	end if
	return 2
end idle
```

# まとめ
Macのスリープを解除した時にWindowsの起動音で迎えてくれるアプリケーションができました．
他の音で試したり，「今日も頑張ろう！」みたいなボイスを入れても面白いかもしれないですね．
macOS SierraにCocoaPodsをインストールする

# はじめに
iOSアプリの開発で使用されているパッケージマネージャといえば、CocoaPods, Carthage, Swift Package Managerです。
この中のCocoaPodsのインストール、2017/1/9時点でこうやったらできましたというのをメモしておきます。

# 環境
- macOS Sierra
- version 10.12.1

# コマンド
成功したときのコマンドです。

```
$ sudo gem install cocoapods
$ cd ~/.cocoapods/repos
$ git clone https://github.com/CocoaPods/Specs.git master
$ pod setup --verbose
...
Setup completed
```

# ハマった部分

1. `git clone`が何度か通信エラーになった。
    
    ```
    error: RPC failed; curl 18 transfer closed with outstanding read data remaining
    fatal: The remote end hung up unexpectedly
    fatal: early EOF
    fatal: index-pack failed
    ```
    エラーになっても同じコマンドを実行したらgit cloneに成功した。
    通信エラーは、めげずにリトライする必要があるようです。
    　
2. `git clone --depth 1`だと`pod setup --verbose`が失敗した。
    失敗したときのメッセージ
    
    ```
    Updating spec repo `master`
      Performing a deep fetch of the `master` specs repo to improve future performance
        $ /usr/bin/git -C /Users/aaaa/.cocoapods/repos/master fetch --unshallow
    ```
    `--depth 1`を指定すると通信が軽くなるので`git clone`には成功しやすくなりますが、そのあとの`pod setup`が途中で止まりました。
    Gitのリポジトリは、きちんとクローンしないといけないようです。

# メモ
CocoaPodsは`/Library/Ruby/Gems/2.0.0/gems/`にインストールされます。
以前はMacOSX El CaptanにCocoaPodsをインストールする際は
`$ sudo gem install -n /usr/local/bin cocoapods`
のようにインストールディレクトリを指定する必要があったようですが、今（2017/1/9）はインストールディレクトリを指定する必要はないようです。

以上です。
SlackからGitLabのChatopsを行う

[GitLab8.15](https://about.gitlab.com/2016/12/22/gitlab-8-15-released/) から、SlackからGitLabのChatops連携出来るようになったようです。
どんなものか試してみたかったので設定メモを残しておきます。[^1]

<br>

## Slack側の設定

[ここ](https://my.slack.com/services/new/slash-commands) を開いて、自分のSlackチームに新規スラッシュコマンドを作ります。

コマンド名はお好きなものをどうぞ。プロジェクトごとに作るなら `/<project_name>`などとしておけばよいでしょう。

このページに `Token` 欄があるので、それをメモしておきます。
また、後ほどGitLabの設定を貼り付けるのでページは開いたままにしておきます。

<br>

## GitLab側の設定

プロジェクト選択 > 設定 > Services > Slack Command を開きます。
<img width="870" alt="スクリーンショット 2017-01-09 1.18.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/9099/f2792beb-d2af-0b06-049a-927b2e8481a5.png">

<br>

そしてこのページの `URL` 欄をコピーし、Slack側設定の `URL` にコピペします↓
<img width="928" alt="スクリーンショット 2017-01-09 1.19.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/9099/3ada5e42-e144-9423-7028-593c9255c80d.png">

<br>

次に、先ほどメモしておいたSlackの `Token` を 今度はGitLab側設定の Token にコピペします。
そして最後に Active にチェックして保存。
<img width="857" alt="スクリーンショット 2017-01-09 1.20.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/9099/83924d9b-5123-96c7-e1e5-ae6be77f54d6.png">



以上でchatops連携は終了です。簡単ですね。
初回のコマンド実行時にOAuthを要求されるのでAcceptすれば使えるようになります。

<br>


## コマンドメモ

コマンドリストは `/<command_name> help` で確認できます。
現時点では以下のオペレーションが可能となっているようです。

- `/<command_name> issue show <id>`
- `/<command_name> issue new <title> [⇧ Shift+↵ Enter] <description>`
- `/<command_name> issue search <your query>`
- `/<command_name> deploy <environment> to <target-environment>`

issueの操作と、deployコマンドの実行が可能。
おそらく今後はもっとできることが増えていくでしょう。
設定もお手軽にできるので一度試してみてはいかがでしょうか  

<br>

[^1]: 8.15.2では不具合があるらしく動作しませんでした。今回の動作確認は8.15.3で行っています
100均グッズを魔改造してIoT化する～Raspberry PI（Node-RED）とMS FlowとAndroidで遊ぶ～

# はじめに

　ダイソーなどの100均グッズで、クローゼットの”中”に設置するLED照明があります。クローゼットの扉に磁石式の開閉センサーを付けて、扉が開くと点灯、閉じると消灯する仕組みです。この開閉センサーをハサミで切ってRaspberry PIに付けて、（雰囲気だけですが）扉の開閉を監視しスマホに通知する仕組みを作ってみました。
　なお、大半の説明は、以下の記事に機能を追加したものなので、お手数ですが併せて御覧下さい。

*Node-REDからMicrosoft Flowをhttps(POST)を使って呼ぶ（以下、前記事と記す）*
http://qiita.com/arrowmeiwaracing/items/600b30c473a3aac22437

![10.jpg](https://qiita-image-store.s3.amazonaws.com/0/155377/5e8b6124-c386-5cbe-c19d-acb94f3c290c.jpeg)
###### ※使用しないLED部分は、”後でスタッフがおいしくいただきました。”

# 概要
1. Raspberry PI(2B+）に開閉センサーを取り付ける
2. Microsoft Flow上にセンサーの状態を受信してスマホへ通知するフローを作成
3. Raspberry PI上にセンサーの値を読んでFlowに送信するNode-REDフローを作成
4. 動かしてみる

# 1. Raspberry PI(2B+)に開閉センサーを取り付け
1. 100均LED照明の磁石式開閉センサー部分をハサミでカットし、ブレッドボード等で使用しやすくするためにピンを圧着（ピンは秋月電子通商で通販にて購入した）
2. Raspberry PI(2B+）に開閉センサーを、40番GPIO-21と39番GNDへ”内部”Pull UPにて接続（外部に抵抗をつけたい場合は10KΩ程度のものでPull UP）

![11.jpg](https://qiita-image-store.s3.amazonaws.com/0/155377/706b2480-e991-d160-e8c1-4087df33ddc8.jpeg)
![12.jpg](https://qiita-image-store.s3.amazonaws.com/0/155377/c99f3f2d-1c4f-44cc-44fe-7e26502c7e95.jpeg)



# 2. Microsoft Flowの設定
1. プロパティaのみ使用するために、前記事の「要求」フローのJSONスキーマのプロパティaの属性をintegerに変更し、さらにb、cを削除
2. 「応答」フローの下に「Send a notification」フローを追加

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/155377/3219bf0d-bf36-5f0e-d789-1b4f9c763716.png)


# 3. Raspberry PI上のNode-REDの設定
1. GPIO入力ノードを図のように設定（値が変化するとイベントが発生する）
2. GPIOで入力した値をJSON形式に編集
3. Microsoft Flowを呼び出し

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/155377/56dde1d5-b952-1324-7c1b-15bacdc4c025.png)

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/155377/8de95928-0993-410e-60f1-36af31edacee.png)

![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/155377/2b538832-40db-6817-e01d-8c75de656ad2.png)

# 4. 実行
1. スマホにMicrosoft Flowアプリをインストールし、Flowと同じアカウントを設定（設定後、アプリは終了してよい）
2. 開閉センサーを近づけたり、離したりするとスマホの通知欄にアイコンが表示される。開いて内容を確認する

![13.png](https://qiita-image-store.s3.amazonaws.com/0/155377/4f85fec2-d715-bcf7-350d-8786ac86cf2f.png)


# 終わりに
　実は、IoTノード側をESP-WROOM-02+Arduino開発環境で行っていましたが、どうやってもhttps-POSTができず、5H以上嵌って諦めました。そこでお手軽なRaspberry PI+Node-REDに変えてみたら5分かからず作れましたorz。
　いずれESPで再度試してみたいと思っていますが、しばらくは面倒くさい。。。。

最後までご覧いただき有難うございました。
UnityでNativeDialogを実装する

## 前提
### 各ツール・プラグイン等
- Unity 5.5.0f3
- Xcode 8.2.1
- NativeDialog ?

### プラットフォーム
- 開発機
    - macOS (MacBookPro)
        - Windowsの場合は大差はないが、適宜読み替えること
- リリース
    - Android
    - iOS
 
## 内容
### Unityでの開発
1. NativeDialogを利用して、アプリ作成
    1. ダイアログの表示にNative Dialogを利用
        - Native Dialog : https://github.com/asus4/UnityNativeDialogPlugin [^1]
1. Unityビルド
    - Androidの場合はAPKをそのまま端末にインストール
    - iOSの場合はプロジェクトが作成されるので、以下手順へ 

### Xcodeでの開発
1. 作成されたプロジェクトをXcodeで開いて各種設定を調整
    1. provisioning profileを設定（事前に作成しておく
    1. Build PhasesのCompile SourcesのUNDialogManager.mmのCompiler Flagsに**-fno-objc-arc**をつける
        - Native Dialogを用いると、この設定をしないとコンパイルは通るがアプリ起動中に落ちる
        <img width="714" alt="スクリーンショット 2016-12-25 01.09.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/153015/e9e72262-f21f-4c2b-6b9c-850ee275c9b8.png">
1. Xcodeビルド

以上。

## 補足
[^1]: 参考：http://loumo.jp/wp/archive/20140223023418/
MySQL データベースの削除

## mysqlへ接続

SQLを実行するために、まずはデータベースへ接続をする必要があります。

```
mysql -u root
```

## データベースの削除

下記のコマンドを打てば、データベースを削除できます。

```
mysql> drop database 削除したいデータベース名;
```

### [注意]ハイフンのついたデータベースを削除する場合

例えば、```hello-app_development```というデータベースを削除したい場合、上記のコマンドを参考に削除しようとすると、エラーがでます。

```
mysql> drop database hello-app_development;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-app_development' at line 1
```

なので、ハイフンのついたデータベースを削除する場合は、バッククォート(`)でデータベース名を囲んであげる必要があります。

```
mysql> drop database`hello-app_development`;
Query OK, 0 rows affected (0.02 sec)
```

### 削除できたか確認方法

```
mysql> show databases;
```

上記のコマンドでデータベースを一覧で表示させると確認できます。
GAE/GOからGCSに画像アップロードして公開する

##アップロード

```go

func upload(ctx context.Context, body []byte, storagePath string) (urlString string, err error) {
	bucketname, err := file.DefaultBucketName(ctx)
	if err != nil { return }

	client, err := storage.NewClient(ctx)
	if err != nil { return }

	writer := client.Bucket(bucketname).Object(storagePath).NewWriter(ctx)
	writer.ContentType = "image/jpeg"
	defer writer.Close()
	_, err = writer.Write(body)
	if err != nil {
		return
	}
	urlString = "https://storage.googleapis.com/" + bucketname + "/" + storagePath
	return
}
```

bodyは`ioutil.ReadAll`とかで取り出したbyte列
storagePathは"images/128082/1233.jpg"とか、/から始めないこと

##権限変更

このままだとアップロードしても

```xml
<Error>
  <Code>AccessDenied</Code>
  <Message>Access denied.</Message>
  <Details>
    Anonymous users does not have storage.objects.get access to object file.
  </Details>
</Error>
```

と言われるので、権限を変更する。
権限はバケット毎に変更する。ディレクトリ自体単位では変更出来ない。

`https://console.cloud.google.com/storage/browser?project=#{project id}`

からバケットを選んで、左側の・・・から`オブジェクトのデフォルトの権限を編集`

<img width="497" alt="スクリーンショット 2017-01-09 0.48.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/cd4c7039-7875-b45c-c317-e0f2292561a6.png">

ユーザー：allUsers:読み取り
と設定する。最初`allUsers`をどうやって指定するのかわからなかったけど普通にallUsersって入れておけばOK
UnityでPurchase(課金)を実装する

## 前提
### 各ツール・プラグイン等
- Unity 5.5.0f3
- Xcode 8.2.1

### プラットフォーム
- 開発機
    - macOS (MacBookPro)
        - Windowsの場合は大差はないが、適宜読み替えること
- リリース
    - Android
    - iOS

## 内容
### Unityでの開発
1. Purchaseを利用して、アプリ作成
    - Purchaseは、UnityのservicesウィンドウからEnable
        - メニューのWindowからServicesを選択
        - Google Play Developer Console、iTunes Connectで課金アイテムを登録
        - Unityエディタ上で、課金用ボタンに「IAP Button」をAdd Component
            - UI - Button

                <img width="615" alt="スクリーンショット 2017-01-08 18.34.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/158722/c4bba15e-ac14-1c7b-9712-d49a6f3a2ee2.png">
            - IAP Button (Script)

                <img width="347" alt="スクリーンショット 2016-12-25 23.04.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/153015/cb0266e2-08fc-2d59-2657-304289bc9729.png">
        - On Purchase Complete、On Purchase failedにそれぞれメソッドをアタッチ
1. Unityビルド
    - Androidの場合はAPKをそのまま端末にインストール
    - iOSの場合はプロジェクトが作成されるので、以下手順へ 

### Xcodeでの開発
1. 作成されたプロジェクトをXcodeで開いて各種設定を調整
    1. provisioning profileを設定（事前に作成しておく
1. Xcodeビルド

以上。

## 補足
Purchaseでは今回、広告非表示のための課金を実装。
そのため、Non Consumable（一回購入したら永続的に有効になるアイテム）を利用。
Kinectで取得した点群をPCLで描画する

KinectやPCLの導入・設定方法に関しては他の解説記事をご覧ください！
# ソースコード

```cpp:main.cpp
// Cのmin,maxマクロを無効にする
#define NOMINMAX
// 安全でないメソッドの呼び出しでの警告を無効にする
#define _SCL_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <Windows.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/features/integral_image_normal.h>
#include "kinect2_grabber.h"

// 点群の型を定義しておく
typedef pcl::PointXYZ PointType;

// プロトタイプ宣言
void estimateNormal( pcl::PointCloud<PointType>::Ptr cloud, pcl::PointCloud<pcl::Normal>::Ptr &cloud_normals );

void main()
{
	try{
		// ビューア
		pcl::visualization::PCLVisualizer viewer( "Point Cloud Viewer" );

		// 点群
		pcl::PointCloud<PointType>::Ptr cloud( new pcl::PointCloud<PointType> );

		// 点群の排他処理
		boost::mutex mutex;

		// 法線
		pcl::PointCloud<pcl::Normal>::Ptr cloud_normals( new pcl::PointCloud < pcl::Normal > );

		// データの更新ごとに呼ばれる関数（オブジェクト）
		boost::function<void( const pcl::PointCloud<PointType>::ConstPtr& )> function
			= [&cloud, &mutex]( const pcl::PointCloud<PointType>::ConstPtr &new_cloud ){
			boost::mutex::scoped_lock lock( mutex );
			pcl::copyPointCloud( *new_cloud, *cloud );
		};

		// Kinect2Grabberを開始する
		pcl::Kinect2Grabber grabber;
		grabber.registerCallback( function );
		grabber.start();

		// ビューアーが終了されるまで動作する
		while ( !viewer.wasStopped() ){
			// 表示を更新する
			viewer.spinOnce();

			// 点群がある場合
			boost::mutex::scoped_try_lock lock( mutex );
			if ( ( cloud->size() != 0 ) && lock.owns_lock() ){
				// 点群を更新する
				auto ret = viewer.updatePointCloud( cloud, "cloud" );
				if ( !ret ){
					// 更新がエラーになった場合は、未作成なので新しい点群として追加する
					viewer.addPointCloud( cloud, "cloud" );
				}

				// 法線を推定する
				estimateNormal( cloud, cloud_normals );
				// 法線を更新する
				viewer.removePointCloud( "normals" );
				viewer.addPointCloudNormals<PointType, pcl::Normal>( cloud, cloud_normals, 100, 0.05, "normals" );
			}

			// エスケープキーが押されたら終了する
			if ( GetKeyState( VK_ESCAPE ) < 0 ){
				break;
			}
		}
	}

	catch ( std::exception& ex ){
		std::cout << ex.what() << std::endl;
	}
}

// 法線を推定する
void estimateNormal( pcl::PointCloud<PointType>::Ptr cloud, pcl::PointCloud<pcl::Normal>::Ptr &cloud_normals )
{
	// 法線推定クラス
	pcl::IntegralImageNormalEstimation<PointType, pcl::Normal>  ne;

	ne.setNormalEstimationMethod( ne.AVERAGE_DEPTH_CHANGE );
	ne.setMaxDepthChangeFactor( 0.01 );
	ne.setNormalSmoothingSize( 5.0 );
	ne.setInputCloud( cloud );
	ne.compute( *cloud_normals );
}

```

kinect2_grabber.hは以下のリンク先から頂きました。
https://github.com/UnaNancyOwen/KinectGrabber

実行結果例がこちら
![2017-01-09 (1).png](https://qiita-image-store.s3.amazonaws.com/0/48341/2cf9e555-90ae-db24-af1f-aae0ba8ccc0a.png)
にょろにょろ出ている線が推定された法線です。
extend ActiveSupport::Concernの魔術を理解する。

rails/activesupport-4.1.0に使われている 
extend ActiveSupport::Concernの機能を__全て__図解しました。

Speaker Deckにスライドをアップロードしました。
(間違いあるかもです。あしからず。)

[extend ActiveSupport::Concernの魔術を理解する](https://speakerdeck.com/yukihirop/extend-activesupport-concernfalsemo-shu-woli-jie-suru)

![ActiveSupport_Concernを理解する_画像化.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/113181/32aa2e73-20c4-176f-43a5-86a880811c6c.jpeg)
JAX-RS @BeanParam のパラメータクラスと JavaEE7 の BeanValidation の順番指定

# ことのあらまし

## 実装としてやりたいこと
1. JAX-RS で `@BeanParam` でパラメータを受け取る
1. `@BeanParam` のクラスはいくつかのフィールドを別のクラスに依存している
1. JavaEE7 の BeanValidation で妥当性チェックを行う
1. BeanValidation ではグループを使用して検査順序を指定する
1. 特定のグループでのエラーか確認したい

## シチュエーション
1. HTTPのヘッダー情報から得るデータは１つのクラスにまとめておきたい
1. ヘッダー情報のエラーと、クライアント UI から渡される情報のエラーは応答を区別したい

事情としては、ヘッダー情報はクライアント UI で入力しないので、入力エラーと同じように応答を返しても、クライアント側は何も対処のしようがないので、システム的におかしいよ、ということを伝えたい。

## 環境
JavaEE7 ということで以下の前提。

1. JAX-RS 2.0
1. BeanValidation 1.1.0

実際の稼動確認は WebSphere Liberty Profile 8.5.x.6 で行った。

# 実装の形
## グループ指定用インターフェース

```java:HeaderValidationGroup.java
public interface HeaderValidationGroup {
  // 中身不要
}
```

複数のエンドポイントでパラメータの妥当性検査の順序指定に使用する想定のインターフェース。

## パラメータクラス
### 共通ヘッダ
```java:HeaderParam.java
// このクラスの検査順序指定 ( HeaderParam.class の指定も必要　）
@GroupSequence({ HeaderValidationGroup.class, HeaderParam.class })
public class HeaderParam {
    @HeaderParam("header.h1") // Param のフィールド名を指定する => "h1" だけではダメ X-<
    @NotNull(groups = HeaderValidationGroup.class)
    private String h1;

    @HeaderParam("header.h2")
    @NotNull(groups = HeaderValidationGroup.class)
    private String h2;
}
```
### エンドポイント固有のパラメータ
```java:Param.java
public class Param {
    @BeanParam
    @Valid
    private HeaderParam header;

    @QueryParam("p1")
    @Pattern(
    private String p1;

    @QueryParam("p2")
    private String p2;
}
```

## エンドポイント
```java:EndPoint.java
@Path("/endpoint")
public class EndPoint {
    @Inject
    private Validator validator;

    @GET
    @Path("service1")
    @Produces(MediaType.APPLICATION_JSON)
    public Response service1(@BeanParam Param param) {
        Set<ConstraintValidation<T>> results = validator.validate(param);
        if (results.size() == 0) {
            // 実処理
            return Response ・・・
        } 
        // 検出したエラーの ConstraintValidation が保持する情報から groups を手繰っていく
        boolean hasHeaderError = 
            results.stream().anyMatch(c->c.getConstraintDescriptor().getGroups().stream()
                .anyMatch(HeaderValidationGroup.class::isAssignableFrom));
        return Response.status(
            hasHeaderError ? Status.INTERNAL_SERVER_ERROR : Status.BAD_REQUEST).build();
    }
}
```
---
一応上記で「ことのあらまし」に書いたことは実現できた。
しかし、`@HeaderParam("header.h1")` という書き方はなんとかしたい・・・。
Param クラスのフィールド名を prefix としてつけるのはできれば避けたい。

```
   curl -X GET --header 'header.h1: value_for_h1' ・・・
```
ではなくて、

```
   curl -X GET --header 'h1: value_for_h1' ・・・
```
と、したい。

---
# __*Happy Programming!*__
IIS で pukiwiki を動かしましょう

技術メモをまとめるために、pukiwiki を利用しています。
PHP 7.0 に対応したという噂を聞いたので、とりあえずインストール＆テストしてみました。

■環境
1. Windows Server 2012R2（IIS 8.5）
（動作検証はしていませんが、Win2016 IIS 10.0でも動くでしょう）

■順番
1. IIS のインストール
2. PHP 7.0 のインストール
3. Pukiwiki の配置
私は外部公開＆認証していますので、認証とHTTPS化を行っています。
（この部分はオプションになるため省略）

■手順
① IIS のインストール
Win2012R2 のサーバーマネージャーよりIIS をインストールします。
IIS を有効にした際の機能に加えて、「CGI」 をインストールします。

② PHP 7.0 インストール
PHP 7.0 をインストールします（http://windows.php.net/download/）
Win2012R2はx64なので、x64の「VC14 x64 Thread Safe」をインストールします。

※参考（IISのスレッド対応）
※https://blogs.msdn.microsoft.com/osamum/2011/04/05/iis-php-1236/　

ダウンロードし、適当な場所で解答。
例として「C:\PHP7\**」の下に移動

このままでは動かないので、Visual Stdio のランタイムをインストール
https://www.microsoft.com/ja-JP/download/details.aspx?id=48145　
とりあえず、VS2015のx64版をインストールする

③ IIS でのパンドラマップの設定
IIS マネージャーにてPHP のパンドラマップを作成

![3. モジュラーマップの追加.png](https://qiita-image-store.s3.amazonaws.com/0/94366/55ef9a2d-b518-f256-5abe-feced194d894.png)

④ テストプログラム
適当に PHP ファイルを作成し、phpinfo を表示
![4. php確認.png](https://qiita-image-store.s3.amazonaws.com/0/94366/bf42b54c-77a0-1b06-be0a-1332e99b71e4.png)

PHPの情報が見れれば前半終了

⑤ pukiwikiのインストール
pukiwiki のHP より該当ファイルをダウンロード
https://pukiwiki.osdn.jp/?PukiWiki/Download/1.5.1　

UTF-8 をダウンロードします。
IIS のデフォルトHP の下に「***/wiki」フォルダを作成して、ダウンロードしたファイルをそこに置きます。

⑥ ブラウザアクセス
デフォルトの場合、「http://localhost/wiki/index.php」にアクセス（もしくは他の端末よりIPアドレスもしくはマシン名）

これでpukiwiki の設定は終わり。
![1. pukiwiki install access.png](https://qiita-image-store.s3.amazonaws.com/0/94366/aff07ebb-7812-b181-4e81-96c535c8548e.png)

※
Runtime エラーの原因は、ファイル、フォルダーへのアクセス許可がないこと。
アクセス権利は「everyone」で許可しています（アクセス制御は別途やるため）

※
なぜか、検索窓で日本語を入力すると、文字化けするので、ソースファイルをコメントアウトします
lib/html.php の150行目「\$body = preg_replace_callback(\$pattern, \$decorate_Nth_word, \$body);」
https://pukiwiki.osdn.jp/?%E8%B3%AA%E5%95%8F%E7%AE%B15/142
Securing OpenAM 実践

OpenAMのAdministration Guideに記載されているSecuring OpenAMの項目をOpenAM13.0で実践してみようかなと思い、とりあえずしてみました。

# cookie名の変更

> Change the default iPlanetDirectoryPro cookie name both in OpenAM (com.iplanet.am.cookie.name) and in your policy agent profiles (com.sun.identity.agents.config.cookie.name).

まずデフォルトのcookie名がiPlanetDirectoryProなので、それを変更してみます。

OpenAMの管理画面の
[CONFIGURATION]-[サーバーおよびサイト]-[*サーバ名*]-[セキュリティー]-[Cookie]から
cookie名を確認したところ、編集がどうやらできないらしい...

![default_cookie_config.jpg](https://qiita-image-store.s3.amazonaws.com/0/116278/6a67bf14-7222-8fcd-3b71-fcf38237e462.jpeg)

調べてみたらssoAdminTools(CLI)もしくはssoadm.jsp(GUI)を使うことで変更できるらしい。今回はssoadm.jspを使ってみます。

## 1.ssoadm.jspの無効化を解除する

ssoadm.jspはデフォルトでは無効化されているので、それを解除します。
[CONFIGURATION]-[サーバーおよびサイト]-[*サーバ名*]-[セキュリティー]-[高度]に
> ssoadm.disabled=false

を設定します。

## 2.ssoadm.jspからcookie名を変更する

*OpenAM Deployment URL*/ssoadm.jspにアクセスし、update-server-cfgにいきます。

![update-serer-cfg.jpg](https://qiita-image-store.s3.amazonaws.com/0/116278/1b4db98c-839c-03b1-797b-3ba05dd7ef9e.jpeg)

サーバ名に*OpenAM Deployment URL*を設定し、
属性の値にcom.iplanet.am.cookie.name=*新cookie名*を設定します。

設定が終了したので、cookie名の設定を確認してみると、変更されてました。

![update_cookie_config.jpg](https://qiita-image-store.s3.amazonaws.com/0/116278/6bc735ca-b86c-3894-0e81-0c1404422a0e.jpeg)

## 3.OpenAMを再起動する

再起動後にcookie名を確認してみます。

![check_cookie_name.jpg](https://qiita-image-store.s3.amazonaws.com/0/116278/b5e28aef-322b-08cf-23dc-23837c734324.jpeg)

どうやら、うまく変更できたらしい。

## 4.ssoadm.jspを無効化する

ssoadm.jspはAdministration Guideに記載されているように、無効化しておかないとマズいので、変更し終えたら無効化しておきます。

> Leave ssoadm.jsp disabled in production. (Advanced property: ssoadm.disabled=true)

ssoAdminToolsでもやってみようか検討中。。。
CakePHP3：datetimeのカラムを入力する際、時・分の入力を省略する


```add.ctp
            echo $this->Form->input('mydate',
                                     [
                                       'label'      => '日付',
                                       'type'       => 'date',
                                       'dateFormat' => 'YMD',
                                       'monthNames' => false,
                                       'minYear'    => date('Y') - 3,
                                       'value'      => date('Y-m-d')
                                     ]
                                   );
            echo $this->Form->hidden('mydate[hour]',   ['value' => '0' ]);
            echo $this->Form->hidden('mydate[minute]', ['value' => '00']);

```

キモは'type'に'datetime'ではなく'date'を指定すること。
これにより年月日のプルダウンが表示されます。

足りない時・分についてはhiddenにて固定値を設定します。
Androidにjarファイルの追加

# Androidに外部のjarファイルを追加する。
jarファイルに追加するときに、つまづいた。

## 詳細
* Android Studio 2.2.3
* JTransforms-3.0.jar (今回私が追加したかったjarファイル)

## lib内にjarファイルを追加
まず、使いたいjarファイルを**(プロジェクトフォルダ)/app/libs**内に追加する。

## Android Studioでgradleファイルを編集
**(プロジェクトフォルダ)/app/build.gradle**ファイルを開く。

``` gradle
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs') // <- この一行を追加
    
}
```
## jarファイル各々でも設定できる
上記で、lib内のjarファイルは、全て追加されると思うんだけど、もう一つ、各々のjarファイルごとにやるものもある。
projectビューにあるjarファイルを右クリックし、**Add As Library**をクリックする。
![image](https://c5.staticflickr.com/1/444/32147123236_e2217a4194.jpg)

すると、app内のbuild.gradleファイル内に

``` gradle
compile files('libs/hoge.jar')
```
が追加されている。

## javaファイルのimport文
今回はJTransforms内にあるDoubleFFT_1Dというクラスを利用したかった。ここで、JTransform.jarのDoubleFFT_1Dクラスに至るまでのパスは  
**JTransforms-3.0.jar/org.jtransforms/fft/DoubleFFT_1D**  

このパスから、javaファイルにインポートする際には

``` java
import org.jtransforms.fft.DoubleFFT_1D;
```
という書き方で加えるとうまくいった。
Go言語で単純パーセプトロンの実装をしてみた #golang

ずっとやりたいと思っていた機械学習の入門として、何からやろうかネットサーフィンしていたところ、

http://yukihir0.hatenablog.jp/entry/2015/01/14/202210

をみつけて、真似しながらやってみました。

https://github.com/yagitatsu/perceptron-sample
https://play.golang.org/p/ycQz7j6R1N

xy座標上にあるデータから、

```math
ax+by+c = 0
```

の、a, b, cを求めるプログラムです。
(ロジックの理解には、 http://hokuts.com/2015/11/25/ml2_perceptron/ が役に立ちました)

以下、思ったことメモ。

- golangの配列計算はちょっとめんどい
    - 基本的な配列計算も自分で実装した
        - めんどくさいけどライブラリ探すほどでもない微妙さ
    - 実装内容が高度になってくると、python使ったほうが幸せそう
- 実際にはテキストなどから特徴量抽出してやってみないと実用性がなんともいえないので、つぎは形態素解析を含めてやってみたい