OmniAICreator/Qiita-1.07M huggingface dataset:
pythonを使ったwebスクレイピング　作業メモ

pythonでwebスクレイピングを行なっているが、どうしてもhttp内にある欲しいtagをfindallすることができない。同じ値の値を持っているtagがあるがclass名が異なる

spanタグをfor文で回してstringが希望の値と同じものをif文で探して、それをprintで表示して見たが、先ほどのディベロッパーツールに表示されている、class名と異なるものしか出てこない。

どうすれば良いのだろうか・・・

findallについてもう少し詳しく理解を進め、どうにか解決したい。

上の問題結局解決できた

理由は指定するurlが希望するclass名を含まない、別のページの物を選択していたからだ。
単純なミスだが、次はまずurlがしっかり選択できているのか確認しようと思う。

これからの目標
スクレイピングを使用して、ネット上の画像を取得してそれを表示するbotを作成後、
webサイトを作成する。
ただし法律に触れないよう、内容を考え利用規約なども考える必要あり。
Azure Application Insightsでアラートルール作成に失敗するパティーン

## TL;DR;

* Azure Application Insightsのアラート(クラシック)はリージョンが「東南アジア」だとサポートされていない
* 一回削除したリソースを同名で作成するとリージョンが引き継がれてしまうので注意

## 経緯

ちょっとシンプルな死活管理がしたくなり、Application Insightsを使うことを検討。
試しに適当なサイトの可用性テストを設定して、クラシックアラートで簡単なアラートを飛ばしてみようというチュートリアル以下な作業をしていたのだが、なぜかアラート設定がONだと可用性テストが作成されない。ちなみに内容はこんな感じ。

> 可用性テスト "github" の警告ルールの作成に失敗しました。エラー: "The target resource id '/subscriptions/xxxxxxxx/resourcegroups/sample/providers/microsoft.insights/webtests/github-check' is not supported."。

はてなぜだろう、ということで適当に設定を変えてみるも変化なし。
致し方ないので別のリソースグループで作成してみると成功。リソースグループに合わせてのApplication Insightsのリージョンを変えていたので、おそらく原因はこれだろうとのことで試してみるとビンゴ。Application Insightsのリージョンが「東南アジア」になっているとアラートルールの設定が失敗するようだ。

原因がわかってめでたしめでたし・・・・・・・・・・とはいかなかったのが今回のパティーン！

## 追加経緯

原因は分かったのでリージョンが東南アジアになっているApplication Insightsリソースを削除する。

![05_delete.PNG](https://qiita-image-store.s3.amazonaws.com/0/41164/9924664b-0a3c-60cc-855b-9b448c311413.png)


リージョンを「米国東部」にして再作成。

![06_recreate.PNG](https://qiita-image-store.s3.amazonaws.com/0/41164/05a20ff2-daa8-ec46-75f1-576c4b1944ef.png)

場所が「米国東部」になっているのを確認。よしよし

![07_success_recreate.PNG](https://qiita-image-store.s3.amazonaws.com/0/41164/4cf56156-92c4-2ec5-abe5-7a0d935f8a8c.png)

これで対処は完了したので改めて可用性テストを作成・・・したのだがなぜかエラー。あるぇー？

![04_error.PNG](https://qiita-image-store.s3.amazonaws.com/0/41164/10960a01-41ea-2e2f-2631-d7ed70aecd96.png)

ここから何回かリソースを再作成したりして試してみたが全然ダメ。
ちゃんとリソース一覧を見ても「米国東部」になってるよなぁ、と首をかしげていたのだが、ふと目についた「プロパティ」を見てみると・・・

![08_property.PNG](https://qiita-image-store.s3.amazonaws.com/0/41164/9968df0c-c5f3-e9a7-477d-8f6317fd3216.png)

ﾌｧｯ！？東南アジアになってるやんけ！？
リソース一覧には「米国東部」ってあるのに、なぜか実体としてはリージョンが「東南アジア」になっているのが原因でした。

どうもリソースの再作成を行うとき同名前を使っていたのが悪かったらしく、削除した後に同名リソースを作成すると「削除したほうのリソースのリージョン」を適用してしまうご様子。
別名リソースを作成して試してみると全く問題ありませんでした。

## まとめ

というわけで再作成に同名使用するとリージョンがおかしくなるお話でした。しかもプロパティで見ないと判断つかないというのがつらい。
時間をおけば大丈夫なのかとか、そもそもクラシックアラートがなんで東南アジアリージョンで使用できないのかとかは調べてないので不明。誰か知ってたら教えてください。
ask-sdk v2でのstateがない

# v2でのstateはこうやる？

v2にstateという概念がない。
`this.handler.state = ...;`とかってのがない
てか、もともとAlexaから送られてくるjsonに`state`とかって項目はなくてsessionAttributesの中に`STATE`という値を入れてあげてそれで管理していた。

ここで、再確認しておくのがv2でのsessionAttributesの保存方法は

```js
// 保存の方法は
attributes = {
  "key": "value"
}
handlerInput.attributesManager.setSessionAttributes(attributes);
```

この容量で

```js
attribute = {
  STATE: "stateKey"
}
handlerInput.attributesManager.setSessionAttributes(attributes);
```

って、設定してあげて`canHandle`の中で

```js
return handlerInput.requestEnvelope.session.attributes.STATE === "stateKey"
```
とかってしてあげればいいのではないか
つまり、こんな感じ？

```js
const sampleIntentHandler = {
  canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === 'IntentRequest'
      && handlerInput.requestEnvelope.request.intent.name === 'levelIntent'
      && handlerInput.requestEnvelope.session.attributes.STATE === "stateKey"; // ここ
  },
  handle(handlerInput) {
    ...
  }
};
```

`handlerInput.attributesManager.getSessionAttributes().STATE`に`stateKey`がはいっていなかったら`canHandle`で`false`を返されるので、呼ばれない
他にいい方法ってか、ちゃんとした方法がある？
【エラー】Key is not long enough. Bitbucket requires RSA keys be at least 2048 bits.

BitbucketとSourceTreeを繋ぐために、SourceTree > ツールからPuTTY Key Generatorを起動してSSHキーを作成
↓
Bitbucketに公開鍵を登録しようとしたけれど、タイトルのエラーが出てしまってうまく登録できなかった場合。

![putty.png](https://qiita-image-store.s3.amazonaws.com/0/238771/232ba6a3-ee8a-19b2-b750-83c02ce0ef58.png)

このエラーは「2048ビットのRSAキーが必要です」というエラーなので、
PuTTY Key Generatorの赤枠部分（何ビットの鍵を生成するかの設定箇所）を2048以上の数値にして
鍵を作り直すとうまくいく。


エラー出るたびGoogle翻訳様に助けてもらう…翻訳って便利。
AWS IoT から Lambdaアクション へCSVデータを渡す

# はじめに
IoTデバイスがCSVフォーマットでしかデータ送信できない環境において、AWS IoT から Lambda へサクッとそのままデータを渡したい。
というニーズがあっての調査メモです。  
AWS IoTに関する情報は様々あれど、デバイスからの入力はJSONを前提としたものが比較的多く、CSVを入力とする方法に辿り着くのに少々時間を要してしまいました。。。
このメモが同じような状況にある方の調査時間を少しでも短縮できれば幸いです。

# 対応方法
AWS IoT のルールで受信データをbase64エンコードし（そのようなSQLし）、Lambdaに渡す。
## AWS IoT
以下のように「*」に対してencode関数を適用する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62555/3c4439d5-e461-e800-928d-5a98647262db.png)

## Lambda
base64されたデータがSQLで指定した別名をキーとしてeventオブジェクトに格納される。

```python
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def lambda_handler(event, context):
    logger.info('event: %s', event)
    return ''
```
といったLambdaをIoTルールのアクションに指定すると、

```
[INFO]	2018-04-23T07:30:41.199Z	xxx	event: {'data': 'YWEsYmIsY2MsZGQ='}
```
のような結果が得られます。　　
※この結果は入力値を "a,b,c"　とした場合の例。

# 補足
入力が「CSV」であることにとらわれず、「生データをそのまま入力する」という観点で調べていれば、以下の情報をサクッと見つけられていたはずなのですが。色々足りていないですね。
-[バイナリペイロードの使用](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-sql-select.html#binary-payloads)


# 参考資料
-[バイナリペイロードの使用](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-sql-select.html#binary-payloads)
-[SQL関数](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-sql-functions.html#iot-sql-encode-payload)
HTMLにおける親の高さベースの正方形の作り方

# 正方形のテクニックはいろいろある

vminなどの Viewport units を使ったり、横幅ベースの正方形要素の作り方というものがいくつかあります。
前者はともかく後者はなかなか難しいことをしていてけっこう大変ですが、とりあえずビュー基準か親要素の横幅基準で正方形要素を作ることは可能です。

さて、ここで問題になってくるのは、親の高さベースで正方形をどうやって作ればよいかです。

今回やり方がかっこ悪くて全然おすすめはできないものの、一つ方法を思いついたのでメモっておきます。

# 基本的な考え方

画像は例えば `height: auto` の時 `width: 100%` とかすると、親要素の横幅いっぱいまで画像を広げ、高さはそれに合わせてアスペクト比を維持して拡大されます。

これの横幅と高さを入れ替え、画像の大きさに合わせる要素(`display: inline-blockとかposition: absoluteとか`)を用意すれば、親の縦をベースにした正方形要素がうまく作れそうです。

今回はSVG画像をBase64変換して `<img>` に埋め込み、正方形の土台にします。

# 実際のコード

## 元のSVG

```
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="1" width="1"></svg>
```

サイズを1,1にすることで、正方形の空画像を作ります。

## Base64変換された画像

Base64+ヘッダにいろいろつけた、`<img>` に直接埋め込める状態にしたのが以下です。

```
data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4xIiBoZWlnaHQ9IjEiIHdpZHRoPSIxIj48L3N2Zz4=
```

## HTML

```
<div class="parent">
    <div class="square">
        <img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4xIiBoZWlnaHQ9IjEiIHdpZHRoPSIxIj48L3N2Zz4=">
        <div class="contents"></div>
    </div>
</div>
```

## CSS

```
/* 親要素の高さを3emにするので、正方形は3em*3emになる */
.parent { height: 3em; }
/* 正方形にする要素 */
.square {
    background-color: gray;
    /* 今回は 横幅をコンテンツに合わせるためinline-blockにする */
    display: inline-block;
    /* 自分の中のコンテンツの配置のため、relativeにしておく */
    position: relative;
    /* 高さは親に合わせる */
    height: 100%;
}
/* 正方形に拡大する画像 */
img {
    /* 横幅は縦に合わせ、縦は親に合わせる */
    width: auto;
    height: 100%;
}
/* 正方形内のコンテンツ */
.contents {
    /* コンテンツは正方形目いっぱいの大きさにする */
    width: 100%;
    height: 100%;
    /* 画像の上に設置する */
    position: absolute;
    top: 0;
}
```

# まとめ

今回はSVG画像を使ったこともあり、画像サイズの比率を変えればそこそこ応用が効く実装になったのではないかと思います。

ただ、元々ShadowDOMを使っている時に親要素の高さベースで正方形を描画したいのに、どうにもならない上になんか求めている解決方法がなかったので頑張りましたが、できればCSSだけでシンプルに解決したいものです。

他に何かいい方法があったら教えてください。
AWS でブロックチェーンをトライしてみるの巻

※途中エラー出て止まってます

#目的
祝！AWS でブロックチェーンのテンプレートが出来ました！
https://aws.amazon.com/jp/blogs/news/get-started-with-blockchain-using-the-new-aws-blockchain-templates/

#目標
まずは、教科書通り、AWS 上に作ってみましょう

#手順
下のサイトを参照
https://docs.aws.amazon.com/ja_jp/blockchain-templates/latest/developerguide/blockchain-template-getting-started-prerequisites.html



ロケーション縛りがあるようなので、バージニア北部　で実施。
事前に、下の準備
・VPC
・SG
・キーペア
・IAM ロール２つ（LB 用、インスタンス用）
　※クラウドフォーメーションを利用するため、ログインユーザに権限がない場合は、追加でクラウドフォーメーション用のロールが必要

##キーペアの作成
キーペア作成のため、下のポータルへ
https://console.aws.amazon.com/ec2/v2/home?region=us-east-1#KeyPairs:sort=keyName

キーペアの作成　＞　名前を入力　＞　作成
pem がダウンロードされるので、大事に保存。


##Elastic IP の作成
VPC の Elastic IP ページへ
https://console.aws.amazon.com/vpc/home?region=us-east-1#Addresses:

新しいアドレスの割り当て　＞　割り当て
リストに新しいIP アドレスがでる。
IP アドレスと　アロケーションID をメモ

##VPC の作成
VPC の作成ページへ
https://console.aws.amazon.com/vpc/home?region=us-east-1#vpcs:

VPC ウィザードの開始　＞　パブリックとプライベートサブネットを持つVPC ＞　下の必要な項目を入力
IPv4 CIR block
VPC name

Public subnet's IPv4 CIDR
AZ
Public subnet name
Private subnet's IPv4 CIDR
AZ : デフォルト
Private  subnet name：デフォルト

##サブネットの作成
AZ を分けて、3つ作成
https://console.aws.amazon.com/vpc/home?region=us-east-1#subnets:
サブネットの作成　～


##セキュリティグループの作成
https://console.aws.amazon.com/vpc/home?region=us-east-1#securityGroups:

検証用に全てのIP からアクセスできるルールにします。

インバウンドルールを追加して、全てのトラフィックを全てのソースからアクセス可能に設定。

##IAM role の作成
下へ移動
https://console.aws.amazon.com/iam/home#/roles

ロールの作成　＞　Elastic Continer Service > Elastic Container Service






AWS のポータルへ移動
https://console.aws.amazon.com/cloudformation/home

スタックの作成　＞　テンプレートの選択　＞　S3 URL を選択　＞　下のアドレスをコピペ
https://s3.amazonaws.com/aws-blockchain-templates-us-east-1/ethereum/templates/latest/ethereum-network.template.yaml

詳細の設定　＞　スタックの名前（任意に入力）　＞　VPC network configuration の3項目（VPC の選択、サブネットの選択、ALB サブネットの選択）　＞　Security Configuration　の5項目の入力(キーペア、EC2 セキュリティグループ、ECS用とALB のIAM Role ARN、EC2 インスタンスプロファイルARN、ALB セキュリティグループ)

後は、基本はデフォルト設定

ケーパビリティで、"AWS CloudFormation によってカスタム名のついた IAM リソースが作成される場合があることを承認します" にチェックを入れるて、作成。
VirtualBoxでGuestOSのアプリケーションに外部からアクセスする方法


たくさん記事があるので、今更感満載ですが書きます。

VirtualBoxでのGuestOSのアクセス方法はざっくり４つあります。

1. NAT+ポートフォワーディング設定
  - ゲストOSから外部ネットワークに接続できるもの 
2. NATネットワーク+ポートフォワーディング設定
  - ↑プラス、ゲストOS同士で接続できるもの
3. ホストオンリーアダプター
  - ホストOSとゲストOS間のみでやり取りできるもの
4. ブリッジアダプター
  - ゲストOSがホストOSと同じネットワークを使用するもの（ネットワークからは全く別のマシンが存在することになる）

このうち「ブリッジアダプター」のみ、IPアドレスが増えるので会社とかで監視が厳しい場合、怒られる可能性があります。

おとなしくやりたい場合は、1 or 2 or 3を使うのですが、外部のPCからアクセスする場合、3が使えないです（ホストオンリーのアダプタのため、HostOS以外からアクセスできない。）

簡単なのは、デフォルトで設定されている1のパターンです。

NATに対して、ポートフォワーディングの設定を追加すればOKです。

設定イメージは、HostOSのこのポートにアクセスがあったら、GuestOSのこのポートにアクセスを流すイメージです。

起動中だと設定できないので、一旦シャットダウンしてから、設定してください。

例）80,443,53306でHostOSにアクセスが来たら、GuestOSの80,443,3306にアクセスを流す

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/130210/f58621e3-ffc9-5435-5f79-5b859f46c783.png)

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/130210/a6abe5b2-04e0-9933-9fd8-be1d066c08b4.png)


参考記事
[VirtualBox Mania ネットワーク設定](http://vboxmania.net/content/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E8%A8%AD%E5%AE%9A)
Multi-probe consistent hashing ご紹介

みんな大好き consistent hash ですね!

最近提案された Multi-probe consistent hashing が素晴らしいですね.

http://arxiv.org/abs/1505.00062

Jump consistent hash http://qiita.com/syoyo/items/96fb03e3d26c8c8a8c83 に続く, cool な consitent hash 関数になります.

## 特徴

* ハッシュテーブル以外にストレージを必要としない

## Jump consitent hash との違い.

Jump consitent hash も効率のよいハッシュを計算しますが, 任意のノードを削除することができないという欠点がありました. つまり N ノードあれば, 1, 2, 3, 4, ... N と連続している必要があり, どれかのノードが任意に消えてしまうような想定がある分散 KVS な用途では使えませんでした.

Multi-probe consistent hashing は, Karger らの手法(Ring consitent hash)と, Lamping and Veach(Jump consitent hash) のいいとこ取りのような手法になっています. 

## 実装

* C https://github.com/dgryski/libmpchash
* Golang ありました https://github.com/dgryski/go-mpchash

## まとめ

分散 KVS 用途に最適そう. 
Acknowledgement に Google を救った男, Eric Veach がいますね. 素晴らしい!
自然言語処理をテストする環境を整えるまでの手順②

自然言語処理関係を行なっていくことになりましたので、まずは環境からと色々やっていったことをまとめた備忘録的なものです。


```環境
macOS High Sierra 10.13
Python 3.6.5
```


#KNPをインストールする
KNPとは日本語文の構文・格・照応解析を行うシステムです。

引用
>
KNPは日本語文の構文・格・照応解析を行うシステムです．形態素解析システムJUMANの解析結果(形態素列)を入力とし, 文節および基本句間の係り受け関係，格関係，照応関係を出力します． 係り受け関係，格関係および照応関係は，Webから自動構築した大規模格フレームに基づく確率的モデルにより決定します．


<b>KNPをダウンロードする</b>
下記からダウンロードしてください。
http://nlp.ist.i.kyoto-u.ac.jp/index.php?KNP

<b>KNPをインストールする</b>

```
#解凍して
$tar jxvf knp-4.19.tar.bz2
#インストール
$brew install knp --with-crf++
Error: Failed to download resource "knp"
```
エラー。。ファイルが見つからないということです。
ダウンロード先とハッシュ値を手動で変更して対応できました。
下記のサイトがとても参考になったのでそちらを参照してください。
http://ensekitt.hatenablog.com/entry/tree3


```
require "formula"
  
class Knp < Formula
  homepage "http://nlp.ist.i.kyoto-u.ac.jp/index.php?KNP"
  url "http://nlp.ist.i.kyoto-u.ac.jp/DLcounter/lime.cgi?down=http://nlp.ist.i.kyoto-u.ac.jp/nl-resource/knp/knp-4.19.tar.bz2&name=knp-4.19.tar.bz2"
  sha256 "fe5d1249e7c7716e4ac76a57052096bb8b321829af39f3fa2ad5acd9e060427b"

  depends_on "juman"
  depends_on "tinycdb"

  def install
    args = %W[
      --disable-debug
      --disable-dependency-tracking
      --disable-silent-rules
      --prefix=#{prefix}
      --with-juman-prefix=#{HOMEBREW_PREFIX}/opt/juman
    ]

    system "./configure", *args
    system "make", "install"
  end

  test do
    system "false"
  end
end

```
再度インストール。無事できました。

```
brew install knp --with-crf++
#動作確認
$ echo "ピコピコハンマーを持ってきた人の名前はピコ太郎です" | jumanpp | knp
# S-ID:1 KNP:4.19-CF1.1 DATE:2018/04/20 SCORE:-95.21639
  ピコピコ─────┐　　　　　　　　　　　　　
ハンマーを─────┤　　　　　　　　　　　　　<体言>
        持ってきた─────┐　　　　　　　　　<用言:動><格解析結果:ガ/人;ヲ/ハンマー;ニ/-;カラ/-;時間/-;修飾/ピコピコ;ニツク/-;ノ/->
                      人の─────┐　　　　　<体言>
                            名前は─────┐　<体言>
                              ピコ太郎です<体言><用言:判><格解析結果:ガ/名
```

<b>pyKNPをインストール</b>
pythonでKNPを使うものです。

```
wget "http://nlp.ist.i.kyoto-u.ac.jp/DLcounter/lime.cgi?down=http://lotus.kuee.kyoto-u.ac.jp/nl-resource/pyknp/pyknp-0.3.tar.gz&name=pyknp-0.3.tar.gz -O pyknp-0.3.tar.gz"
pip install pyknp-0.3.tar.gz
```


■参考サイト
http://nlp.ist.i.kyoto-u.ac.jp/index.php?KNP%2F%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95


以上
fmt.Printf with struct field without names.

Test code ( https://play.golang.org/p/z__pwPlGxAT ):

```golang
package main

import (
	"fmt"
)


func test(i interface{}){
	switch i.(type) {
	case error:
		fmt.Printf("error type\n")
	default:
		fmt.Printf("other type\n")
	}
	fmt.Printf("%v\n", i)
}

func main() {
	
	i1 := struct {
		string
		error
	}{ "a", nil }

	fmt.Println("--------- case 1 ---------")
	test(i1)

	i2 := struct {
		S string
		error
	}{ "a", nil }

	fmt.Println("--------- case 2 ---------")
	test(i2)

	i3 := struct {
		string
		E error
	}{ "a", nil }

	fmt.Println("--------- case 3 ---------")
	test(i3)

}

```

Output:

```
--------- case 1 ---------
error type
%!v(PANIC=runtime error: invalid memory address or nil pointer dereference)
--------- case 2 ---------
error type
%!v(PANIC=runtime error: invalid memory address or nil pointer dereference)
--------- case 3 ---------
other type
{a <nil>}
```


# Conclusion

If an anonymous struct with a error field but without give the field a name, the `Printf('%v')` will process this struct as an `error` type, but the `error` field is nil,  `Printf` will call `error.Error()` to print its value, so we got an  `runtime error: invalid memory address or nil pointer dereference` error message.
loopback.jsフレームワーク

#loopbackとは
IBMが2015年に買収したAPI用のフレームワーク
Android、Objective-Cにも対応している

##インストール
```console
$ sudo npm install -g strongloop
```

##アプリケーション作成
```console
$ mkdir loopback-tutorial & cd loopback-tutorial
$ slc loopback
```
アプリ名を入力する

##アプリケーションを起動
```console
$ node .
```
最小限の構成要素でシンプルなゲームプロジェクトを用意する

UnityのTutorialで学んだ内容を復習したり、自分なりに改変する時のために
最小限の要素で構成したプロジェクトを用意しました。
元のプロジェクトで作業を行うと他の要素が邪魔になったり、バグの原因特定が困難になることがあるためです。

この環境でできる内容を以下の通りです。

- 方向キーでキャラクターを移動させる
- カメラがキャラクターに追尾する

今後3Dゲームの内容に関して、このプロジェクトに追加していく形で学習したことをアウトプットして行こうと考えています。

![参考](https://qiita-image-store.s3.amazonaws.com/0/55307/d0981c3d-64d4-29ec-5b91-dae364548205.gif)

```c#:Player.cs
public class Player : MonoBehaviour
{
	public float m_Speed = 6f;	// 移動速度

	Animator m_Animator;
	Rigidbody m_Rigidbody;
	Vector3 m_Movement;

	void Awake ()
	{
		m_Animator = GetComponent<Animator> ();
		m_Rigidbody = GetComponent<Rigidbody> ();
	}

	void FixedUpdate ()
	{
		// キー入力の取得
		float h = Input.GetAxisRaw ("Horizontal");
		float v = Input.GetAxisRaw ("Vertical");

		// キー入力からベクトルを設定する
		m_Movement.Set (h, 0f, v);

		Move ();
		Turn ();
		Animate ();
	}

	private void Move ()
	{
		// ベクトルから移動量を取得する
		m_Movement = m_Movement.normalized * m_Speed * Time.deltaTime;
		m_Rigidbody.MovePosition (transform.position + m_Movement);
	}

	private void Turn ()
	{
		// 移動中でなければ回転処理は行わない
		if (!isRunning ())
			// NOP.
			return;

		// ベクトルから回転方向を取得する
		Quaternion targetRotation = Quaternion.LookRotation (m_Movement);

		// 回転処理
		transform.rotation = Quaternion.RotateTowards (transform.rotation, targetRotation, 360.0f * Time.deltaTime);
	}

	private void Animate ()
	{
		// 走るアニメーションの有効、無効化
		m_Animator.SetBool ("Running", isRunning ());
	}

	private bool isRunning ()
	{
		// ベクトルの長さでキャラクターが移動中か判断する
		return m_Movement.magnitude != 0f;
	}
}
```

```c#:CameraController.cs
public class CameraController : MonoBehaviour {
	public Transform m_Target;		// カメラの追尾対象（プレイヤー）の位置
	public float m_Smoothing = 5f;	// カメラの追尾速度

	private Vector3 offset;			// カメラからm_Targetまでの距離、
									// カメラは常にプレイヤーからoffset分の距離を保つことになる

	void Start ()
	{
		// プレイヤーの初期位置からoffsetを初期化する
		offset = transform.position - m_Target.position;
	}


	void FixedUpdate ()
	{
		// プレイヤーの位置から追尾後のカメラ位置を算出する
		Vector3 targetCamPos = m_Target.position + offset;

		// プレイヤーの位置を元にカメラを移動させる
		transform.position = Vector3.Lerp (transform.position, targetCamPos, m_Smoothing * Time.deltaTime);
	}
}
```

ソースコードは[GitHub](https://github.com/ayaseya/SimpleTestGround)にアップロードしています。

[敵（障害物）を追加する](https://qiita.com/ayaseya/items/4e3b157f2980538c8a89)に続きます。
UICollectionViewを必要最低限のコードで実装してみる

UICollectionViewを理解する第一歩として、UICollectionViewを使った画面を必要最低限のコードのみで実装してみたいと思います。

StoryBoardはこんな感じです。
UIViewController内にUICollectionViewを配置しているだけです。
UICollectionViewにはSafeAreaに対する制約のみ付与しています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/81715/edffa0c7-c6f2-7789-bbb8-3abe38b62c06.png)

ViewControllerの実装は以下の通りです。


```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var collectionView: UICollectionView!

    override func viewDidLoad() {
        super.viewDidLoad()

        collectionView.dataSource = self
    }
}

extension ViewController: UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 10
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
        cell.backgroundColor = .red

        return cell
    }
}
```

画面に何か表示するために最低限必要なのは、UICollectionViewDataSourceの実装です。
実装が必須のメソッドは`collectionView:numberOfItemsInSection:`と`collectionView:cellForItemAt:`の2つです。

ここでは`collectionView:numberOfItemsInSection:`は`10`を返すようにしています。
これで10個のセルが表示されるようになります。

`collectionView:cellForItemAt:`はセルの設定を行うためのメソッドです。
ここではセルに色をつけています。

上記内容でアプリを起動すると、以下のような画面が表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/81715/6dd3fa11-e474-cb31-6820-e689ea147e45.png)
FragmentでのActionBarの実装メモ【Android】


## Fragment#onCreateView

```java:Fragment#onCreateView
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {

    view = inflater.inflate(R.layout.search_history, container, false);
    Toolbar toolbar = (Toolbar) view.findViewById(R.id.searchHIstoryToolbar);

// 1.activityを取得する。
    activity = (AppCompatActivity) getActivity(); 
// 2.ActionBarを設置する。
    activity.setSupportActionBar(toolbar);
// 3.ActionBarにhomeボタンを表示する。
    activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);     
// 4.3で設定したhomeボタンを押下できる設定にする。
    activity.getSupportActionBar().setHomeButtonEnabled(true);
// 5.Fragment#onOptionsItemSelectedを有効にする。
    setHasOptionsMenu(true);

    recyclerView = (RecyclerView) view.findViewById(R.id.search_history_list);
    recyclerView.setLayoutManager(new LinearLayoutManager(context));
    return view;
}

```

## Fragment#onOptionsItemSelected
```java:Fragment#onOptionsItemSelected
@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case android.R.id.home:
            getFragmentManager().popBackStack();
        default:
            break;
    }
    return super.onOptionsItemSelected(item);
}
```

## ハマったこと
はじめActionBarに表示されたhomeボタンをタッチしても、onOptionsItemSelected関数が反応しませんでした。

Fragment#onCreateViewの「5.Fragment#onOptionsItemSelectedを有効にする」を加えることで反応するようになりました。

以下の説明にもある通り、このメソッドにtrueを渡して実行することで、`onCreateOptionsMenu`及び`onOptionsItemSelected`などの関連メソッドの実行をFragmentが受信するようになるみたいです。

https://developer.android.com/reference/android/app/Fragment.html

```java
    /**
     * Report that this fragment would like to participate in populating
     * the options menu by receiving a call to {@link #onCreateOptionsMenu}
     * and related methods.
     *
     * @param hasMenu If true, the fragment has menu items to contribute.
     */
    public void setHasOptionsMenu(boolean hasMenu) {
        if (mHasMenu != hasMenu) {
            mHasMenu = hasMenu;
            if (isAdded() && !isHidden()) {
                mHost.onSupportInvalidateOptionsMenu();
            }
        }
    }
```
jQueryのon()の小さなサンプルメモ

名前空間の利用

```
$(セレクタ).on("イベントの種類.名前空間", イベントハンドラ);
$(セレクタ).off(".名前空間");
```

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script>
        $(function(){
            $('.test1').on('click', function(){
                alert("test1");
            })

            $('.test2').on('click.my1', function(){
                alert("クリック2-1");
            })

            $('.test2').on('click.my2', function(){
                alert("クリック2-2");
            })

            $('.test2').off('click.my2');
        });
    </script>
</head>
<body>
<div class="test1">test1</div>
<div class="test2">test2</div>
</body>
</html>
```

test1,クリック2-1がAlert

参考：
jQueryのon()でイベント処理を極める！ | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト https://www.sejuku.net/blog/38774

【jQuery】名前空間を使ったイベントの設定／削除 - Qiita https://qiita.com/Masa_Kado/items/1c82b795d659c98e4bd8
VisualStudioにXamarinが入っているのに、Xamarin.Androidが無い

VisualStudio　Mac版で、Androidが入っていないので、色々と調べました。
私の記憶では、雑誌の付録でXamarinの小冊子があり、一緒に付いていたCD-ROMでvisualstudioをインストールしたと思います。

https://www.instagram.com/p/Bh5SsTVlkvh/?taken-by=yosiki2008

今回、Xamarinのサイトにアクセスして、visualstudioのMac版を再インストールしました。
https://www.xamarin.com/

![スクリーンショット 2018-04-23 16.25.02.png](https://qiita-image-store.s3.amazonaws.com/0/20977/6dc67e2b-7aa1-322b-67dc-07c75e676761.png)

そしたら、Xamarin.AndroidやiOSの選択する画面が出たので、Xcodeが空き容量不安なので、インストールできないため関連のOSはチェックを外して、Androidのみインストールしました。

無事に、Androidのアプリができる環境を追加できました。
![スクリーンショット 2018-04-23 16.37.29.png](https://qiita-image-store.s3.amazonaws.com/0/20977/f9e903d6-72b1-7b01-faa1-c33147e7a377.png)
pythonで簡単にGPU計算ができるCupyを紹介

#Cupyについて

pythonで行列計算をする場合は通常CPUで計算するNumpyを使いますが、行列数が多い場合はGPUで計算ができるCupyが便利です。
GPUはコア数が圧倒的の多いので場合によっては数倍～数百倍で計算できることがあります。
[参考：CupyとNumpyのパフォーマンスを比較してみた](http://segafreder.hatenablog.com/entry/2017/12/02/210452)

Cupyは元々DeeplearningのフレームワークのChainerの一部でしたが、Chainerのv2よりCupyが分離されました。
簡単なコードで手軽にGPU行列計算ができるので、物理シミュレーションなどにも使ってみるとよいかもしれません。

#環境
現状linuxの方が簡単にインストールできると思いますが、Windowsでも動かないわけではありません。
（公式にはサポートされてないですし、どうも動かないときは動かないです。。）
　※2018/4/27追記:今後cupy v5ではwindowsがサポートされいるかもしれません。
　https://www.slideshare.net/pfi/cupy-v4-and-v5-roadmap

　※2018/5/25追記:cupy v5.0.0b1よりwindowsにおけるwheelでのインストールが試験的に始まりました。
　　cudaのバージョンに合わせて以下のようにインストールが試せます

```
pip install cupy-cuda80
pip install cupy-cuda90
pip install cupy-cuda91
```



とりあえず、今回のテスト環境は以下で行いました。

- Windows 10 Professional
- CPU:Core i5-6600（3.9GHz、4コア）
- GPU:GeForce GTX 1070(1.8GHz、1920コア）
- Visual C++ Build Tools
- CUDA Toolkit 8.0 (8.0.44)
- cuDNN 6.0
- Anaconda3 5.1 (Python 3.6)
- Cupy 4.0.0


#簡単な使い方

使い方は簡単で、下のようにnumpyと同じようにcupyを使うだけで行列の足し算や積などいろいろできます。
ただし、numpyで使われる一部の関数はcupyで使えないものもあるので[cupyの公式ドキュメント](https://docs-cupy.chainer.org/en/stable/)を参照してみてください。

以下の[ソースはこちら](https://github.com/samacoba/Mytest/blob/master/No_01_cupy_array.ipynb)

###配列の生成

```
import cupy as cp
A = cp.arange(9).reshape(3, 3).astype('f') #cupy上で3*3の行列を生成
B = cp.arange(9).reshape(3, 3).astype('f') #cupy上で3*3の行列を生成
print('A = \n', A)
print('B = \n', B)

-----------
A = 
 [[0. 1. 2.]
 [3. 4. 5.]
 [6. 7. 8.]]

B = 
 [[0. 1. 2.]
 [3. 4. 5.]
 [6. 7. 8.]]
```
###行列の和、積

```
C = A + B #行列の和
print('和：A + B = \n', C)

D = cp.dot(A, B) #行列の積
print('積：A・B = \n', D)

-----------
和：A + B = 
 [[ 0.  2.  4.]
 [ 6.  8. 10.]
 [12. 14. 16.]]

積：A・B = 
 [[ 15.  18.  21.]
 [ 42.  54.  66.]
 [ 69.  90. 111.]]
```
###numpyの配列 ⇔ cupyの配列の変換
cupyで定義した配列はGPU上にあるので、そのままだと他のライブラリで使えないことが多いです。
また、逆にnumpyの配列をcupyの配列に変換して、GPU上で計算したいこともよくあります。

numpy配列とcupy配列の変換は「cupy」の関数
・cupy ⇒ numpy配列へ変換：cupy.asnumpy
・numpy ⇒ cupy配列へ変換：cupy.asarray
を使うとできます。

```
E = cp.arange(9).reshape(3, 3).astype('f') #cupyで生成するとcupy配列
print('「E」のクラスは', type(E)) 

E_np = cp.asnumpy(E) #cupy ⇒ numpy配列へ変換
print('「E_np」のクラスは', type(E_np))

E_cp = cp.asarray(E_np) #numpy ⇒ cupy配列へ変換
print('「E_cp」のクラスは', type(E_cp))

-----------
「E」のクラスは <class 'cupy.core.core.ndarray'>
「E_np」のクラスは <class 'numpy.ndarray'>
「E_cp」のクラスは <class 'cupy.core.core.ndarray'>

```


#2次元フーリエ変換
Cupy v4より2次元フーリエ変換も使えるようになりました。

numpyでの2次元FFTの参考：
[Pythonで画像処理（2次元FFTとパワースペクトル）](https://yaritakunai.hatenablog.com/entry/2016/03/20/235500)


以下の[ソースと結果はこちら](https://github.com/samacoba/Mytest/blob/master/No_02_cupy_fft.ipynb)

下の図のような【 元画像 ⇒ フーリエ変換 ⇒ フーリエ逆変換】を

![20180423_cupy_fft.png](https://qiita-image-store.s3.amazonaws.com/0/109458/4a6888be-2b4b-356d-833e-29dd2258fce4.png)

こんなかんじで簡単にできます。

```
cp_fimg = cp.fft.fftshift(cp.fft.fft2(cp_img))#フーリエ変換＋シフト
cp_ffimg = cp.fft.ifft2(cp.fft.ifftshift(cp_fimg))#シフト＋フーリエ逆変換
#（一部略）
```
4096*4096pixのモノクロ画像を10回計算した時間は
- numpy：30.4 s
- cupy：34.1 ms
と非常に高速になっていました。
jQueryの最初の小さなサンプル

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script>
        $(function(){
            $("#test").css("color", "blue")
        });
    </script>
</head>
<body>
<div id="test">test</div> 
</body>
</html>
```

青字でtestが表示
AWS CodeBuild で Build 環境として使える docker イメージの中を見たかった

CodeBuild の途中でこけるのでデバッグしようとしたのですがデバッグのたびにビルドさせるのは面倒でお金もかかっちゃうので、ローカルで様子を見ようと思いました

# 結論
[github にあがってる aws の Dockerfile](https://github.com/aws/aws-codebuild-docker-images/blob/1461cbc34d0d8924c5174f97bd758b33e59bcbb9/ubuntu/docker/17.09.0/Dockerfile) から build した

# Pull (失敗)

pull しようとすると

```
$ docker pull aws/codebuild/docker:17.09.0
Error response from daemon: pull access denied for aws/codebuild/docker, repository does not exist or may require 'docker login'
$
```

search しても確かに見つからない。

docker 力が足りないだけなのかもしれない。

`aws ecr get-login` して「あれ〜？」とか呑気に言ってたけど、自分で push したわけじゃないので少なくとも ecr を試すのは無駄だと判断。

# Build
探すより Build したほうが早そうなので自分で build することにした

```bash
$ git clone git@github.com:aws/aws-codebuild-docker-images.git
Cloning into 'aws-codebuild-docker-images'...
remote: Counting objects: 525, done.
remote: Total 525 (delta 0), reused 0 (delta 0), pack-reused 525
Receiving objects: 100% (525/525), 95.94 KiB | 606.00 KiB/s, done.
Resolving deltas: 100% (208/208), done.
$ cd aws-codebuild-docker-images/
$ docker build -t aws-codebuild-docker ./ubuntu/docker/17.09.0/
Sending build context to Docker daemon  7.168kB
Step 1/8 : FROM ubuntu:14.04.5
14.04.5: Pulling from library/ubuntu

(中略)

Successfully built PyYAML
Installing collected packages: docutils, jmespath, six, python-dateutil, botocore, pyasn1, rsa, futures, s3transfer, PyYAML, colorama, awscli
Successfully installed PyYAML-3.12 awscli-1.15.6 botocore-1.10.6 colorama-0.3.7 docutils-0.14 futures-3.2.0 jmespath-0.9.3 pyasn1-0.4.2 python-dateutil-2.7.2 rsa-3.4.2 s3transfer-0.1.13 six-1.11.0
Removing intermediate container 29be58076bf4
 ---> bf97099e2f8d
Step 6/8 : VOLUME /var/lib/docker
 ---> Running in 6ccefd8ee279
Removing intermediate container 6ccefd8ee279
 ---> 497e0d5e5fd8
Step 7/8 : COPY dockerd-entrypoint.sh /usr/local/bin/
 ---> 08563d553802
Step 8/8 : ENTRYPOINT ["dockerd-entrypoint.sh"]
 ---> Running in a42256c82653
Removing intermediate container a42256c82653
 ---> 317742568182
Successfully built 317742568182
Successfully tagged aws-codebuild-docker:latest
$
```

build にかかったのは 10分くらい。序盤の apt-get が長かったように思います。

```
$ docker images | grep codebuild
aws-codebuild-docker                                      latest              317742568182        About a minute ago   850MB
$
```
gitリポジトリの変更ファイルだけPEP8違反していないかチェックする

メモです

## 前提
reviewdogをインストールしておく

```shell-session
$ go get -u github.com/haya14busa/reviewdog/cmd/reviewdog
```

## コマンドイメージ

変更ファイルのチェック

```shell-session
$ pycodestyle --max-line-length=120 `git diff --name-only` | reviewdog -efm="%f:%l:%c: %m" -diff="git diff"
```

今のブランチとmasterブランチの変更ファイルをチェックしたい場合

```shell-session
$ pycodestyle --max-line-length=120 `git diff --name-only master` | reviewdog -efm="%f:%l:%c: %m" -diff="git diff master"
```

## git拡張

パスの通るところに以下のような `git-pep8` というファイルを実行権限を付けて置いておくと、 `git pep8 master` みたいな感じで使えます。

```zsh:git-pep8
args=$@
pycodestyle --max-line-length=120 `git diff --name-only ${args}` | reviewdog -efm="%f:%l:%c: %m" -diff="git diff ${args}"
```

以上、メモでした。
Android NDK で C++ から java の呼び出し

# 概要
**Visual Studio 2017**の**OpenGLES アプリケーション(Android, iOS)**で、**C++**から**Java**を呼び出すメモ

# 環境
- Visual Studio 2017
- Visual C++ > クロスプラットフォーム > OpenGLES アプリケーション(Android, iOS)
- android-21

# 内容
## 既存クラスの場合
```c++
auto env = state->activity->env;
auto vm = state->activity->vm;

vm->AttachCurrentThread(&env, NULL);

jstring str = env->NewStringUTF("abc");

jclass     cls = env->FindClass("java/lang/String");
jmethodID  mid = env->GetMethodID(cls, "toCharArray", "()[C");
jcharArray ary = (jcharArray)env->CallObjectMethod(str, mid);

vm->DetachCurrentThread();
```
## ユーザークラスの場合
### **[プロジェクト名].Packaging**プロジェクトの**src**フォルダ以下にjavaのソースを追加
```java:Test.java
package com.test;

public class Test
{
    public boolean test()
    {
        return true;
    }
}
```
### AndroidManifest.xmlのapplication:android:hasCodeをtrueに
```xml:AndroidManifest.xml
<application android:label="@string/app_name" android:hasCode="true">
```
### NativeActivity:getClassLoaderを使って呼び出す
https://stackoverflow.com/questions/14586821/android-flurry-integration-with-ndk-app
http://archive.is/QzA8#selection-471.0-507.81

```c++
auto env = state->activity->env;
auto vm = state->activity->vm;

vm->AttachCurrentThread(&env, NULL);

jclass activityClass = env->FindClass("android/app/NativeActivity");
jmethodID getClassLoader = env->GetMethodID(activityClass,"getClassLoader", "()Ljava/lang/ClassLoader;");
jobject classLoaderInstance = env->CallObjectMethod(state->activity->clazz, getClassLoader);
jclass classLoader = env->FindClass("java/lang/ClassLoader");
jmethodID findClass = env->GetMethodID(classLoader, "findClass", "(Ljava/lang/String;)Ljava/lang/Class;");
jstring strClassName = env->NewStringUTF("com/test/Test");
jclass classIWant = (jclass)env->CallObjectMethod(classLoaderInstance, findClass, strClassName);
jmethodID testMethod = env->GetStaticMethodID(classIWant, "test", "()Z");
jboolean retValue = env->CallStaticBooleanMethod(classIWant, testMethod);

vm->DetachCurrentThread();
```
返り値が複数ある関数に対してscipy.optimize.fminするとValueErrorが出るときの解決策

若干ハマって解決法が出てこなかったのでメモ。

X,yともにデータ(m件)が入っていて、Xがm×nの行列、yがm次元のベクトルとします。例えばロジスティック回帰のコスト関数

```python
import numpy as np
from scipy.optimize import fmin

def cost_function(theta, X, y):
    h_theta = 1 / (1 + np.exp(np.dot(-X, theta)))
    J = np.sum(-y * np.log(h_theta) - (1 - y) * np.log(1 - h_theta)) / len(y)
    grad = np.zeros(len(theta))
    for j in range(len(theta)):
        grad[j] = sum((h_theta - y) * X[:, j]) / len(y)
    return J, grad
```

でthetaを変化させて、Jを最小化したいような問題を解きたいとします。```scipy.optimize```モジュールには組み込みの関数があります。

参考：[Optimization (scipy.optimize)](https://docs.scipy.org/doc/scipy-0.10.0/reference/tutorial/optimize.html)

fmin関数を使うとシンプレックス法で最小化問題を解くことができます。

参考：[scipy.optimize.fmin](https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin.html)

##ダメな例
```python
fmin(cost_function, initial_theta, args=(X, y, ))
```

```:出力
    print(fmin(cost_function, initial_theta, args=(X, y, )))
  File "C:\Program Files\Anaconda3\lib\site-packages\scipy\optimize\optimize.py"
, line 393, in fmin
    res = _minimize_neldermead(func, x0, args, callback=callback, **opts)
  File "C:\Program Files\Anaconda3\lib\site-packages\scipy\optimize\optimize.py"
, line 517, in _minimize_neldermead
    fsim[k] = func(sim[k])
ValueError: setting an array element with a sequence.
```

スタックトレースからはわかりづらいが、**原因はどの返り値で最適化していいかわからないから**らしい。


##解決策
最適化に必要な1つの返り値のみを返す関数で1回ラップして、そのラップした関数を最適化します。

```python
cost_wrap = lambda theta,X,y : cost_function(theta, X, y)[0]
fmin(cost_wrap, initial_theta, args=(X, y, ))
```

これで上手く行きました。

ちなみにargsの引数には、最適化で動かしても変化させない定数（例えばデータなど）を入れます。このargsを使えば目的関数の引数が複数の場合でも対応できます。
【初歩】Dockerを使い始めたので、コマンド一覧など

#よく使用するコマンド


#####ステータス確認
```
docker-compose ps
```
| Name       |       Command |    Status    |    Ports    |
|:-----------------|------------------|------------------|------------------:|
|laradock_apache2_1|/opt/docker/bin/entrypoint ...|Up|0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp|
|laradock_mysql_1|docker-entrypoint.sh mysqld|Up|0.0.0.0:3306->3306/tcp|
|laradock_php-fpm_1|docker-php-entrypoint php-fpm|Up|9000/tcp|
|laradock_phpmyadmin_1|/run.sh phpmyadmin|Exit 255|0.0.0.0:8080->80/tcp, 9000/tcp|
|laradock_workspace_1|/sbin/my_init|Up|0.0.0.0:2222->22/tcp|

#####ミドルウェア起動
```
cd ~/work/app/Laradock
docker-compose up -d workspace mysql php-fpm apache2
```
reverseをいつ使うのか？

#### 背景
ほぼあらゆるプログラミング言語に配列（やリスト）を逆順にするreverse()という関数（とかメソッドとか）が存在する。

この関数はプログラミング入門フェーズで扱うサンプルコードとかではよく出てきたりすると思うが、実際の開発では「いつ使うんだろう？」といった割とユースケースに乏しい機能じゃないかと思ってもいた。

#### 自分の場合のユースケース： 多重代入と組み合わせる
だが最近、このreverse()の面白い使い方を発見して、かなり使うようになった。

それは、こうだ。

まず、何か省略可能な要素を伴う配列（やリスト）を考えてみる。例えば、名前と敬称、という２要素の配列があるとする。具体的には「Mr. 佐藤」や「鈴木 さん」のようなもの。

これを表現するには構造体やクラスのようなものを使うこともできるが、シンプルに（多くはリテラルで表しやすいことのある）配列で表現する。

敬称と名前のどちらを先にするかを決める必要がある。通常、多くのプログラミング言語では「多重代入」という記法が「配列のサイズが可変なケース」を想定して設計されているため、多くの場合、省略されることのある敬称のほうを後にしておくほうがこの場合に無難なコーディングとなるだろう。Javascriptであれば次のような具合だ。

```javascript
const items = [name,title]
const display_name = ' '.join(items)
```
これを配列のままプログラムの中で取り回すのでも良いが、仮に上記のコード中にあるdisplay_nameのような２要素を一つにまとめた文字列にしてDBに格納したりあちこちで取り回したりするほうが便利なこともかなり多い。例えば、プログラミング言語をまたがってデータを共有したり、なんらかの通信プロトコルを介したりする場合に文字列へのエンコーディングが定義されていると都合が良いことが多い。

#### 多重代入＋文字列とのコーデックを支える機能としてのreverse()
この、「省略可能な部分を含んだ文字列表現をsplit()して配列にする」、というユースケースはかなり多くあるように思う。省略可能な部分が配列の末尾の方にあればreverse()は不要だが、そうでないこともよくある。

そんなとき、reverse()の出番である。要素数が２の時に限定したflip()のような関数でも同じだという気もするが、reverse()の良い所は要素数が１のときや３以上の時でも振る舞いが定義されているところだ。

要素数が１のときに、reverse()した結果が元と同じであるという性質は「省略可能な要素を含んだ配列」を取り扱うときにとても都合が良い。これはflip()には無い性質だろう。

また、要素数が３以上の時に、例えば「末尾の要素(a)は必ず存在し、その一つ前の要素(b)は省略されうる」というケースで(b)を取り出したい時、Javascriptならシンプルに

```javascript
const [a,b] = items.reverse()
```

とすれば良い。これは、Pythonのような配列マイナスインデックスアクセスをサポートする言語でも簡易なコーディングができない。省略されるかもしれない要素へのインデクスアクセスは、もし存在しない場合にインデックス範囲外エラーになってしまうからだ。

なおPythonの場合、ちょっとトリッキーだが以下のようになるかもしれない。

```python
items2=items[-2:]
items2.reverse()
b = (items2+[None])[1]

# ワンライナーなら
b = (items[::-1]+[None])[1]
```
これをreverse()やPythonのマイナス増分の配列スライスを使わずに簡易に書くのは結構難しい気がする。

#### というわけで
ちょっとクドクドと長くなりましたが、reverse()のユースケース他にもあるよという話ありましたらコメント等でいただけると幸いです。
Qiita風の目次が便利なのでワードプレスで使わせてクレメンス

## めっちゃ便利

PCでQiitaの記事を読むときに右側に出るメニュー、めっちゃ便利だと思います。
記事内での現在位置が分かるので、見通しが良くなります。
特に長い記事を読むときに効果抜群ですね。

![qiita_menu.PNG](https://qiita-image-store.s3.amazonaws.com/0/20427/0efec707-cfa0-b52d-8ef0-369828ef8801.png)
[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)

古いバージョンでは[今のような形ではなかった](http://blog.qiita.com/post/77055935852/qiita-toc)みたいですが、2017年末から変わったのでしょうか？

参考：[Qiita の新記事ページのレイアウト実装](https://qiita.com/morishitter/items/c4aa500929f2de441bfd)


私も最近立ち上げたワードプレスブログで長い記事を投稿しているので、このような便利な見出しが欲しくなりました。

## 指針

既に利用中のワードプレステーマの機能で、目次機能とサイドウィジェットの追従領域が用意されています。

使用テーマは[Simplicity](https://wp-simplicity.com/)後継の[Cocoon](https://wp-cocoon.com/)です。
他のテーマでは目次を出してくれるプラグイン：[Table of Contents Plus](https://ja.wordpress.org/plugins/table-of-contents-plus/)なども利用できそうです。

あとは以下の記事を参考にしながら、ページスクロールのたびに現在位置を取得して目次の項目をハイライトすれば実装できそうです。

[シングルページでナビゲーションをカレント表示するjQuery](http://yachin29.hatenablog.com/entry/2015/08/14/104711_1)

## 教えてクレメンス

Qiita風の目次を使いたいのはこういう記事です。

[クレメンス8世「コーヒーをクレメンス」…41人の偉大なクレメンスに「クレメンス」と言わせてみる | すごい人まとめ](https://you-are-awesome.net/great-clemens-list/)

ひたすらに長くなるので、ユーザビリティがピンチ。

Javascriptやワードプレスで使えるプラグインがあったら教えてクレメンス。
React 16.3で正式に導入されたContextを使ってcurrent_userを渡すHOCを作ったけど使わなかった

# モチベーション：バケツリレーやめたい

ご近所SNSマチマチのフロントエンドはReact + Flowtypeで実装されています。ReduxやMobXなどの状態管理のアーキテクチャを採用していないので、`current_user`などの様々なコンポーネントが必要とするプロパティは親コンポーネントから子コンポーネント、子から孫、とバケツリレー式に渡しています。

バケツリレー、`current_user`について型安全になるので非常にありがたいのですが、当然面倒ではあります。React 16.3でContextが正式に導入されたので、これを使えば`current_user`のバケツリレーをやめられるかも？と期待に胸を膨らませつつ`current_user`を渡すHigher Order Componentを作ってみました。

# Context使って`current_user`を渡すHOCを書いた

HOCはこんな感じ

```jsx
// @flow
import * as React from "react";

type UserObject = {
  id: number,
  name: string
}

// `React.createContext`でContextのインスタンスを作る。
// デフォルト値はNon-nullableであってほしいんだけど、Contextのインスタンスを作る時点でcurrent_userはわからないので仕方ない
const defaultValue: ?UserObject = null;
const UserContext = React.createContext(defaultValue);

// `current_user`を持つオブジェクト型を`current_user`なしにする型
type WithoutCurrentUser<T> = $Diff<
  T & { current_user: UserObject },
  { current_user: UserObject }
>;

// `current_user`をとるコンポーネントをとり、Contextで包んで`current_user`不要のコンポーネントを返すHOC
function withCurrentUser<Props>(
  Component: React.ComponentType<Props>
): React.ComponentType<WithoutCurrentUser<Props>> {
  return props => (
    <UserContext.Consumer>
      {user => {
        if (user) {
          return <Component {...props} current_user={user} />;
        } else {
          throw "userが無かった…";
        }
      }}
    </UserContext.Consumer>
  );
}

export { withCurrentUser };

export default UserContext;
```

`withCurrentUser`をこのようにコンポーネントに対して適用して、

```jsx
import { withCurrentUser } from "./UserContext"; 

class ComponentNeedsCurrentUser extends React.Component<Props, State> {
// ...
}

export withCurrentUser(ComponentNeedsCurrentUser);
```

このように`UserContext.Provider`で包むと、コンポーネントに`current_user`が渡ります。


```jsx
<UserContext.Provider value={current_user}>
  <ComponentNeedsCurrentUser
    foo={'foo'}
  />
</UserContext.Provider> 
```

お気づきかと思いますが、`UserContext.Consumer`の中で例外を吐いています。これはContextは定義する時点で初期値が必要なので`current_user`がNullableになってしまうことへの苦しい対応です。

# Nullableになってしまった

バケツリレーをしている間は`current_user`の渡し忘れは型検査の段階で気づけたのですが、Contextを使うと実行時までわかりません。`UserContext.Provider`で包み忘れた`withCurrentUser`なContextが実行時に例外を吐く、という事態が発生してしまいます。型で検知できたバグが実行時エラーになってしまうのは大きなデメリットです。これは許容できないよねーということで、採用はやめました。

# おわりに

HOCの型付けが大変でした。

参考リンクは下記の通りです。公式ドキュメントにHOCの作り方も書いてあって、この記事のHOCもそれを踏襲しています。

- https://reactjs.org/docs/context.html
- https://reactjs.org/blog/2018/03/29/react-v-16-3.html



ちなみにマチマチではエンジニアを募集しています。これからReact Nativeでアプリを作る予定です。パートタイムも大歓迎なので、興味がある方は是非 @fujimura までご連絡ください。
プライベートリポジトリのcarthage updateがうまくいかない時

# はじめに

オプションをいつも付け忘れてしまうのでメモ
デフォルトはhttps
プライベートリポジトリはsshでつなげることができる

```
--use-ssh
```

これでできる

```
carthage update --no-use-binaries --use-ssh --platform iOS
```
SQL*LoaderのDEFAULTSパラメーターを試す（Oracle Database 12c Release 2新機能）

# DEFAULTSパラメータを使用するデータのロード
Oracle Database 12c Release 2 (12.2) のSQL*LoaderにはDEFAULTSパラメーターが追加されました。このパラメーターはSQL*Loaderによるデータのロード時にテーブル列のDEFAULT設定をどのように評価するかを決定します。マニュアルを読むとDEFAULTSパラメーターは以下の値を指定することができます。「サポートされていないデフォルト値」が何を指すのかは不明です。

|指定値|説明
|:---|:---|
|IGNORE|DEFAULTを評価しません。このため値は格納されません。|
|IGNORE_UNSUPPORTED_EVALUATE_ONCE|ロード開始時にデフォルト式を１回評価します。サポートされていないデフォルト値は無視されます。|
|IGNORE_UNSUPPORTED_EVALUATE_EVERY_ROW|	ロード開始時にすべてのデフォルト式を評価します。サポートされていないデフォルト値は無視されます。|
|EVALUATE_ONCE|	ロード開始時にデフォルト式を１回評価します。|
|EVALUATE_EVERY_ROW|ロード開始時にすべてのデフォルト式を評価します。|

パラメーターを指定しない場合、DEFAULTが順序を参照しない場合はEVALUATE_ONCE、参照する場合はEVALUATE_EVERY_ROWになります。
マニュアルにある「順序を参照」はGENERATED AS IDENTITY列や、明示的にDEFAULT値にSEQUENCEオブジェクトを指定している場合を指すと思われます。


# 実行例
## テーブルの準備

SYSTEIMESTAMPをDEFAULTとするテーブルを作成し、データをロードしてみます。

```
SQL> CREATE TABLE load1(c1 VARCHAR2(128), c2 TIMESTAMP DEFAULT SYSTIMESTAMP);

表が作成されました。

```

## データの準備
テストにはDBA_OBJECTビューのOBJECT_NAME列のみを抜き出して使用します。

```
SQL> SPOOL load1.dat
SQL> SELECT OBJECT_NAME FROM DBA_OBJECTS;
SQL> SPOOL OFF
```
## SQL*Loaderの実行
DEFAULTSパラメーターはDIRECTモードの場合に限り指定できるため、DIRECT=TRUEの設定を追加します。

### EVALUATE_EVERY_ROW指定

```
$ sqlldr userid=scott/tiger control=load1.ctl direct=true defaults=EVALUATE_EVERY_ROW

SQL*Loader: Release 12.2.0.1.0 - Production on 月 4月 23 14:40:40 2018

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.

使用パス:      ダイレクト

ロードが完了しました - 論理レコード件数74464。

表LOAD1:
  74464 行は正常にロードされました。

確認するログ・ファイル:
  load1.log
ロードの詳細を参照してください。
```

実際に格納されたレコードを確認します。最大値、最小値を確認すると、異なるデータが格納されていることがわかります。またDISTINCT値を確認すると、745種類のデータが格納されていることがわかります。正しく動作しているようです。

```
SQL> SELECT MIN(c2), MAX(c2) FROM load1 ;

MIN(C2)
---------------------------------------------------------------------------
MAX(C2)
---------------------------------------------------------------------------
18-04-23 14:40:41.085373
18-04-23 14:40:41.441384

SQL> SELECT COUNT(DISTINCT c2) FROM load1;

COUNT(DISTINCTC2)
-----------------
              745

```

### EVALUATE_ONCE指定
マニュアルを信じると、EVALUATE_ONCEを指定すると、DEFAULT値はロード開始時に１回だけ評価されるように読めます。このためEVALUATE_ONCEを指定してSQL*Loaderを実行します。

```
$ sqlldr userid=scott/tiger control=load1.ctl direct=true defaults=EVALUATE_ONCE

SQL*Loader: Release 12.2.0.1.0 - Production on 月 4月 23 14:33:44 2018

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.

使用パス:      ダイレクト

ロードが完了しました - 論理レコード件数74464。

表LOAD1:
  74464 行は正常にロードされました。

確認するログ・ファイル:
  load1.log
ロードの詳細を参照してください。
```


実際に格納されたレコードを確認します。最大値、最小値を確認すると、なぜか異なるデータが格納されていることがわかります。またDISTINCT値を確認すると、29種類のデータが格納されていることがわかります。EVALUATE_ONCEを指定しても単一の値が格納されるわけではないことがわかります。

```
SQL> SELECT MAX(c2), MIN(c2) FROM load1 ;

MAX(C2)
---------------------------------------------------------------------------
MIN(C2)
---------------------------------------------------------------------------
18-04-23 14:33:45.086733
18-04-23 14:33:44.838263

SQL> SELECT COUNT(DISTINCT c2) FROM load1;

COUNT(DISTINCTC2)
-----------------
               29

```

検証の結果、EVALUATE_ONCEを指定しても必ずしも単一の値がロードされるわけではないことがわかりました。マニュアルに記載された「ロード開始時」が何を指すかがカギとなりそうですが、現状では詳細は不明です。
[Road to DL Engineer] DL in C++

Link
https://github.com/tiny-dnn/tiny-dnn/tree/master/examples/mnist
https://qiita.com/nyanp/items/11c6bb6fb539486c5069

C++ tutorials
https://qiita.com/Rowing0914/items/d65e901fee9f4e2adffe
https://qiita.com/Rowing0914/items/05df2d6f82864e65ef2c
https://qiita.com/Rowing0914/items/aee5e023d35027682f02
UiPath　インストール直後に見るべきもの

意気込んでUiPath Community Editionをインストールしたものの、どこから手を付けていいかよくわからない・・・各種チュートリアルを見ても今一つピンとこない・・・そんな方へ。

【原因】
一番初めに読むであろう公式コンテンツ「UiPathの概要」(https://www.uipath.com/ja/tutorials/introduction-to-uipath-jp) が「どうだすげえだろう！」というのが前面に出すぎていて、具体的に何をしたらいいのかわからなくなるため。

【解決策】
１．最初に見るべきは「UiPathの概要」ではなく、下記２つ。これらは一般的なプログラミングの話を土台にGUIの説明をしているため、写経することでイメージがつかめる。UiPathが魔法の杖ではないことを再確認します。
・「アクティビティ、変数、データ型」
　　https://www.uipath.com/ja/tutorials/activities-variables-and-data-types-jp
・「コントロール フロー」
　　https://www.uipath.com/ja/tutorials/control-flow-jp

２．興味の持てるビデオチュートリアルを追加で見る。

３．株式会社チュートリアル様の解説記事も、ちゃんと頭に入るようになります。
https://tutorial.co.jp/uipath-overview/
Androidコマンド動いた

先日記事の中で、Android AVDなどのコマンドが動かないなど書きました。
その後帰宅してターミナルを閉じて、ターミナルを再起動したら、PATHの更新が反映されて、無事に使えるようになりました。

![スクリーンショット 2018-04-22 23.40.04.png](https://qiita-image-store.s3.amazonaws.com/0/20977/d842efd9-0330-7153-94c2-8892a9382dbd.png)
ターミナルからAVDを起動しました。

![スクリーンショット 2018-04-22 23.43.45.png](https://qiita-image-store.s3.amazonaws.com/0/20977/d7df1b04-4c74-4b5a-24f5-3878eb98a38b.png)
androidのコマンドも、動きました。

![AVDマネージャー.png](https://qiita-image-store.s3.amazonaws.com/0/20977/7d098062-a718-0095-373a-8b07872a62b5.png)
visualstudioのAVDは、ツールの中のエミューレーター　マネージャーをインストールして使えるようになりました。

また、Xamarinの開発環境ですが、Xamarin.Formsを使うと、iOSも、Androidもハイブリッドに作ることができるということで、この環境のみがvisualstudioにセットされたのかもしれません。

今、visualstudioを更新していたら、次のダウンロードをするように言われました。
![スクリーンショット 2018-04-23 14.55.23.png](https://qiita-image-store.s3.amazonaws.com/0/20977/b260ce76-6706-1744-a1d0-04bfa67e2e34.png)

Xamarinでアプリを書き始めたら、新しく記事を書きます。
オブジェクト指向、新たな言語を身につけるための問題演習


# 図形の面積を求めるプログラムをオブジェクト指向で作成する
## 目的

- オブジェクト指向
- カプセル化
- 継承
- オーバーライド
- ポリモーフィズム

の体験と理解、また 新たに学ぶ言語の文法を手に覚えさせる

## 演習の流れ
  - Figure classの実装 [オブジェクト指向・クラスの作成]
  - 子クラスから2つ選んで実装 [継承、オーバーライド]
  - 作成した子クラスをいくつかインスタンス化
  - `$figres[]`に格納 
  - `foreach`を用いて各メソッド(setを除く)を実行する [ポリモーフィズム]
 
## クラス構造
### 親クラス
#### Figure class
##### setPoints method
必要な座標を登録する
##### showPoints method
持っている座標の一覧を表示する
##### getArea method
図形の面積を数値でreturn
##### getName method
図形の名前(ex. circle, triangle...)をreturn


### 子クラス

#### Rectangle class(長方形)
メンバに2つの座標を持つ

#### Square class(正方形)
メンバに2つの座標を持つ

#### Triangle class
メンバに3つの座標を持つ

#### Circle class
メンバに1つの座標と、半径を持つ

### Trapezoid class(台形)
メンバに4つの座標を持つ


## 出来たらやってみよう項目
 - Figure classを抽象クラスにする
 - 各メンバはprivateにする [カプセル化]
 - 座標のメンバはPoint classを作成し、各クラスで用いる
 - すべての子クラスを実装
 - 座標が図形を正しく表せるかのチェック(直線になってしまう、正方形じゃない、等)
 - Square classはRectangle classを継承させる(Square class中身がほとんどなくなるはず)
 - setPoints methodをオーバーライドしない
 - getPoints methodをオーバーライドしない
【Rust】Rocketで複数ルーティング

# 概要
HelloWorldが終わったので、さてもう少しやってみるか、となった時に複数ルーティングの仕方がわからなかったのでメモ。誰かの助けになればと思います。

# やったこと
ルーティングの条件を`.mount()`でつないで`launch()`は最後で一回だけ呼ぶ。

```rust
#![feature(plugin)]
#![plugin(rocket_codegen)]

extern crate rocket;

#[get("/world")]
fn world() -> &'static str {
    "Hello, world from routing!"
}

#[get("/")]
fn hello() -> &'static str {
    "Hello, world!"
}

fn main() {
    // 悪い例
    // rocket::ignite().mount("/", routes![hello]).launch();
    // rocket::ignite().mount("/hello", routes![world]).launch();

    // 良い例
    rocket::ignite().mount("/", routes![hello])
                    .mount("/hello", routes![world]).launch();
}

```
java.net.URL#getPathの気になるところを調べた

記事の内容はJava8で検証しています。

#概要
getPath()で得られる文字列での'/'の扱いがどうなっているのか、コード書くたびにドキドキするのでメモ。

#まとめ

* パスが完全に省略されていても、'/'だけは返される
    * ただしhostとpathの両方が存在しない場合、空文字列が返る
* 末尾の'/'は省略されない
    * そもそも省略されるべきではないので指摘すべきでもないが

#例

|URL|getPath()|
|---|---|
|`http://host`|/
|`http://host/`|/
|`http://host/path`|/path
|`http://host/path/`|/path/
|`http://host?query`|/
|`http://host/?query`|/
|`http://host/path?query`|/path
|`http://host/path/?query`|/path/
|`http://`|(空文字列)
|`http:///`|/
|`http:///path`|/path

#留意すべき点

* '/'で始まることが保証されるので、次のような記述は問題ない

```
path.startsWith("/path");
```

* '/'で始まることが保証されるので、split("/")で要素を切り出すと最初の要素は必ず空文字列になる…読み飛ばす必要がある
    * **ただし"/"だけのパスの場合、split("/")はサイズ0の配列を返すことに要注意**

```
String a[]=path.split("/");
if(a[1].equals("path")) {} //パスが"/"の場合に例外発生
```

* 末尾の'/'は省略されないので、次のような記述は注意が必要

```
path.endsWith("tail"); //"/path/tail/"だった場合には偽となる
```

* getPath()がnullを返すことはたぶんない
    * コンストラクタにURL文字列を渡してインスタンスを生成する分にはnullにはならないはず