OmniAICreator/Qiita-1.07M huggingface dataset:
プログラムできるための最初の一歩

# プログラムがわからない人の状態
うちの会社にはプログラム未経験で入社してくる新人がいる。
いや、むしろ未経験の方が多い。

当然そのままだと使えないので早く一人前になるようにプログラム研修をしていく。
ただ一緒にやっていると、
「いやいや、わからないならすぐに聞けよ！」
「そうじゃないんだよなぁ」
と思うことがままある。

なんでかな？と観察してたところ
彼らに共通することとして
「プログラムがわからないことがわからない」
といった状態があることがわかった。

# 自分のレベルを理解する
プログラムを組む前段階として自分のレベルを認識してもらうことにより、
　・本人の成長を見込む。
　・指導者側の指導方針を検討する。
ことが得られる
それぞれの状態に関しては以下が考えられる。
## 1．わからない
### 1-1．何がわからないかがわからない
　自分がわからないことがわかっていない状態
　　・自分で頑張って調べようとしているが、見当違いのことを探している
　　・考えたまま固まっている（ように見える）
### 1-2．何かがわからないことがわかる
　自分が何かしらわかっていないことがわかる状態
　　・自分で頑張って調べようとしているが、見当違いのことを探している
　　・質問にくるが質問の内容が不明
　　・考えたまま固まっている（ように見える）
### 1-3．何がわからないかがわかる
　わからないところがわかっている状態
　　・自分で頑張って調べようとしているが、見当違いのことを探している
　　・質問にくるが質問の内容が不明
　　・考えたまま固まっている（ように見える）
　　・的確な質問にくる

まず最初の状態が「わからない」
「わからない」のフェーズに関してもよく見ると複数の状態があることがわかった。
ここでの目標としては「的確な質問にくる」状態になることが望ましい。
必要なスキルとしては
　・質問のしかた
　・何がわからないかを理解してもらう
があるかと思われる。

## 2．できる
#### 2-1．できるが時間内に終わらない
#### 2-2．できるがクオリティが低い
#### 2-3．それなりのものができる

プログラムの恐ろしいところではあるのだが、
「よくわからないけどプログラムはできた」
ということがある。

ここでとどまる場合、行き着く先はコピペプログラマーである。
彼らには中身を質問しても答えられない。
他のソースをコピペしただけだからである。
恐ろしや。

## 3．わかる
##### 3-1．正確に理解できる

内容を理解した上でプログラムを組める。
せめてココまでは連れていきたい。
実装レベルにおける設計上の矛盾とかにも気づき、指摘できるようになる。

## 4．説明できる
#### 4-1．わかる人（先輩等）に対して説明できる
#### 4-2．わかる人（先輩等）からの質問に対して説明できる
#### 4-3．わからない人に対して説明できる
Python の標準ライブラリが https でサーバー検証するようになったバージョンのまとめ

昔の Python の標準ライブラリは、 https でサーバーの証明書の検証をしていませんでした。
そのため、ちゃんと https を使いたい場合は、標準ライブラリより使いたい [requests](http://docs.python-requests.org/) を使うことがずっと推奨されていました。 [^1]

数年前から https の重要度が叫ばれるようになり、標準ライブラリがデフォルトで検証しないのはマズイよねということで、 Python 3.5 からはシステムのデフォルトCA証明書を使って検証するようになりました。 ([PEP 476](https://www.python.org/dev/peps/pep-0476/))

この新機能はセキュリティに大きく関わるので、 3.5 より前のバージョンにもバックポートされました。具体的には 2.7.9 と 3.4.3 です。

これ以降のバージョンの Python を使っていれば、標準ライブラリの urllib を使っていてもサーバーの証明書を検証しているはずです。コネクションプール等の urllib3 / requests が提供するメリットよりも、依存を減らす方を優先したい場合は、 Python のバージョンがこれ以降であることを確認してください。

[^1]: requests は Mozilla の CA List から作られた cacerts.pem をバンドルして配布しています。 (See also: [certifi](https://certifi.io/en/latest/)) CAが追加されたとか、どっかの CA がやらかしたとかあって CA List が更新されたら、 requests のバンドルしているものに反映されているのを確認してアップデートしましょう。
Spring BootでThymeleafの構文チェックを緩くする

## 概要

Spring Boot 1.4で使用されるデフォルトのThymeleafはバージョンが2系である。これは、テンプレートをXMLとしてパースするため、閉じタグが必須であるなど、かなり厳密に記述する必要がある。
一般的なHTML5の構文で記述したい場合は、Thymeleafを3系にすることで対応することができる。

## Thymeleaf 3系にする

build.gradleで``thymeleaf.version``に3系のバージョンを設定する。

```groovy
dependencies {
    compile('org.springframework.boot:spring-boot-starter-thymeleaf')
    // 略
}

ext['thymeleaf.version'] = '3.0.3.RELEASE'
ext['thymeleaf-layout-dialect.version'] = '2.1.2'
ext['thymeleaf-extras-java8time.version'] = '3.0.0.RELEASE'
ext['thymeleaf-extras-data-attribute.version'] = '2.0.1'
```

他のオプションは必要に応じて設定する。

## 関連URL

- [Support Thymeleaf 3 #4393](https://github.com/spring-projects/spring-boot/issues/4393)
C#開発メモ

# 子フォームから親フォームへの受け渡しする方法
　F1＝親フォーム,F2=子フォームとする。

```c#:F1
private void F1(イベントハンドラー)
{
　using (F2 f2=new F2())
{
　f2.ShowDIalog(this);/親フォーム→子フォーム(展開)/

/ここに子フォームの処理が入る/

　変数=f2.InputText;/子フォーム→親フォーム(データ譲渡）/
}}
```

```c#:F2
public string InputText{get;set}/譲渡用変数/
private void F2(イベントハンドラー)
{
　InputText=HOGE;/譲渡変数値/
　this.Close();/F2の表示を消す/
}
```
# キャスト可能判断条件
*変数名.TryParse(対象, out ture時出力箇所)*
例) 
  if(int.TryParse(int A,out int B)) ←Aがint変換可能ならBに出力。null確認に使えるかも…

# 機能ごとにまとめて見やすくする。
*#region～#endregion*
　　はさんだコード等をまとめて見やすくすることが出来る。

例)
![region使用例.png](https://qiita-image-store.s3.amazonaws.com/0/159061/b318e018-b853-c12d-8bdc-67a38f6d0e3a.png)


# continue構文
処理のスキップを行う。
for,while,do~whileのループ処理で用いる。
条件が*ture*のとき処理をスキップする。

# Enabled(選択付加のプロパティ)の不思議
プロパティで追加ツールの**Enabled**設定をTrueにしたときなぜか色がグレーアウトする。
調べたらどうやらそもそもの仕様の関係でした。
ユーザーに選択できませんということを伝えるためにグレーアウトするらしい。
そのおかげで見た目が変わってしまうから困ったものだ。
とりあえず**ReadOnly**で代用できるようなのでそっちを使うことに。
Tabコントロールを避けたければ**TagStop**プロパティをfalseにする。

# 日にちとかのデータを取得する
>DateTime.Now.Tostring("yyyyMMddHHmmss")

上記で4文字の年(y)2文字の月(M)2文字の日(d)2文字の時間(H)2文字の分(m)2文字の秒(s)を取得できる。
つまり20170511183005(2017年5月11日18時30分05秒)が取得できる

# CSSの調整
グーグルクロームの開発者モードで調整　→　更新
が一番わかりやすいし対応しやすい。

# C#からJavascriptを呼び出す。
例>
webapp開発中にフォームのようなポップアップが表示したい。
ポップアップの内容を状態によって変更したい。
そんなときは
Literalを使用してjavascriptを呼び出す。

注意点>
javascriptを呼び出すと画面描写がおかしくなる(たぶん描写しきる前にjavascriptの処理が走るため？)
処理の前にwaitでも引っ掛けるか…。

# 画像ファイルを変更する
内容>
ページAで表示している画像をページBにて変更する。
UserページのヘッダーをAdminが変更するみたいな…。

動き>
1. フォームを開く
2. Userページで使用している画像を表示
3. FileUploadで画像を指定
4. 指定した画像を変更画像として表示
5. 変更ボタンを押下して画像変更。

やってること>
フォームにはaspImage(二個)FileUpload(一個)ボタン(2個)設置
処理前は画像は白の画像(デフォルト.png)に画像名を変更したものを入れている。

1. フォームロード時に格納されているUserページの画像をプロジェクトのローカルファイル(TMP)にコピー
2. コピーした画像をaspImageで表示(Userページで使用している画像)
3. FileUploadで画像を指定
4. 確認ボタンを押下して指定した画像を変更画像の名前で上書き。空白だったaspImage(変更後画像)が指定した画像に上書きされる。
5. 確認ボタンを押下
6. 変更後画像をもともと参照していたファイル名に上書き保存
localの画像をデフォルト.pngをリネームして上書き保存。(初期化)

一言>
プロジェクト直下のフォルダをいじるのであまりよくない気がする。
キャッシュが残ると画像が変わらない…。

# Webのキャッシュを無効化する方法
以下のURL
[ ASP.NET で ブラウザ キャッシュ を 無効化 する web.config 設定 ](https://garafu.blogspot.com/2013/06/aspnet-webconfig.html)

web.Configファイルに対して行う。
サーバーアクセスが多いときはやめたほうが良い(アクセスのキャッシュを毎回取得する)
CSRの作成方法


```bash
openssl genrsa -out 2017_english.cn_sha2.key 2048
```

```bash
openssl req -new -sha256 -key 2017_engoo-english.cn_sha2.key -out 2017_english.cn_sha2.csr
```

```example
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Beijing
Locality Name (eg, city) []:Beijing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:company name
Common Name (e.g. server FQDN or YOUR name) []:yahoo.co.jp
```
iOSで音声/ビデオ通話をWebRTCを使って実現する(調査編)

ある案件でWebRTCを使うことになりましたが、ググって情報を集めるのに難航しました。整理も兼ねて、iOSにおけるWebRTCの利用方法をまとめてみました。

※この記事はiOS側での実装について記載しており、インフラの構成、サーバーサイドの実装については言及していません。

## WebRTCとは？
ブラウザやモバイルアプリ上で音声通話、ビデオ通話などのReal-Time Communication(RTC)を実現するための技術です。Googleを始め、Mozilla、Operaなどがサポートしています。 [公式ページ](https://webrtc.org/)自体はGoogle Chromeチームが運営しているようです。

## 対応ブラウザとプラットフォーム
Google, Mozilla, Operaが開発しているので、各社ブラウザはもちろんのこと、AndroidやiOSもサポートしています。

* Chrome
* Firefox
* Opera
* Android
* iOS

## ビデオ通話や音声通話をするには？
公式で提供されているサンプルがあります。その他にもWebRTCを活用した [WebRTC samples](https://github.com/webrtc/samples/)  が提供されています。ですが、これらすべてブラウザ上で動作するサンプルです。

* ビデオ通話：
 [Peer connection](https://webrtc.github.io/samples/src/content/peerconnection/pc1/)
* 音声通話：
[Peer connection: audio only](https://webrtc.github.io/samples/src/content/peerconnection/audio/)

残念なことに、公式のiOSサンプルはありません！
ですが、公式の[AppRTC](https://appr.tc/) をiOS実装した[ISBX/apprtc-ios](https://github.com/ISBX/apprtc-ios)があります。
リポジトリをCloneしてビルドすると、Room IDの入力が求められるので、適当に入れ、同じアプリを他の人の端末にビルドして、同じRoom IDを入れると、その人とのビデオチャットがスタートします。

## iOS向けのフレームワークってあるの？
[公式](https://webrtc.org/native-code/ios/) では、自分でビルドしろって言ってきますが、 ~~かったるいので~~ CocoapodやCarthageで気軽に入れられるようにしてくださっている方々がいます。 

* [ISBX/apprtc-ios](https://github.com/ISBX/apprtc-ios)

先程紹介したAppRTCのiOS実装です。AppRTCをそのまま利用したい場合は、podでのインストールも可能です。

``` ruby
pod install AppRTC
```

SSL Peer Connectionの初期化、ビデオチャットの追加方法もコードサンプルとともにまとめられています。

* [libjingle_peerconnection](https://cocoapods.org/pods/libjingle_peerconnection)
先程のISBX/apprtc-iosのサンプルでもこのフレームワークを使用しています。WebRTC本家に含まれているiOSのビルドスクリプトを独自に修正し、生成したバイナリをフレームワークとしてCocoapodsで配布してくださっています。

*  [Anakros/WebRTC](https://github.com/Anakros/WebRTC)
 こちらはCocoaPodsでも、Carthageでもインストール可能です。libjingle_peerconnectionとおおよそ一緒なのですが、一部含まれているヘッダファイルが異なります。
[https://chromium.googlesource.com/external/webrtc/](https://chromium.googlesource.com/external/webrtc/)にある `webrtc/build/ios/build_ios_libs.sh`を使ってビルドしています。

こちらは、i386, x86-64アーキテクチャに未対応なので、シミュレーターでのビルドは不可です。

同じWebRTCのバイナリから生成されているものなので、どれを選んでも基本的には問題ないと思います。
僕はCarthageでインストールできるArakros/WebRTCを選びました。

## まとめ / 次にやろうと思っていること
iOS向けにまとめられた記事が少なく、調査が難航しましたが、WebRTCに立ち向かわなくてはならない人に参考になれば幸いです。
`apprtc-ios` はObjective-Cで書かれているし、他のライブラリを活用する場合でも、モデルやラッパーは自身でつくることになるので、次回は開発で得た知見をSwiftのライブラリにしたためたいところです。

## Resouces
* [WebRTC](https://webrtc.org/) ：WebRTCの公式ページ
* [WebRTC iOS](https://webrtc.org/native-code/ios/)：WebRTCのiOS向けのページ
* [Real time communication with WebRTC](https://codelabs.developers.google.com/codelabs/webrtc-web/#0)：ブラウザでのサンプル集
* [ISBX/apprtc-ios: A native iOS video chat app based on WebRTC](https://github.com/ISBX/apprtc-ios) ：ISBX社によるiOS実装
* [libjingle_peerconnection](https://cocoapods.org/pods/libjingle_peerconnection)
* [GitHub - Anakros/WebRTC](https://github.com/Anakros/WebRTC)
* [Getting started with WebRTC on iOS](https://tech.appear.in/2015/05/25/Getting-started-with-WebRTC-on-iOS/)は：appear.inでの実装例です。`libjingle_peerconnection`を用いています。
MAMPで、任意のPHPバージョンを切り替えできるようにする。画像付き。

今あまりMAMPを使わなくなりましたが、とはいえやはりインスタントにPHPの開発するときには便利なので、使用しておりました。
先日、MAMPのバージョンを新しくした際、自分が開発していたPHPのバージョンが、PHPのバージョン切り替えエリアに表示されていないことに気づきました。
その時の解決策を画像付きで、わかりやすく記載いたしました。（自分用メモ）

# 動作環境
- macOS10.12.2(Sierra)
- MAMP4.1

# 現状
バージョン7.0.13
バージョン7.1.0
の二つが表示されている。
<img width="648" alt="スクリーンショット 2017-01-10 14.36.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/32982/d967ce26-528b-6c68-f00f-93b20d0b54b8.png">


# 切替方法
1. /Applications/MAMP/bin/phpへ移動
↓移動後の画面↓
![スクリーンショット 2017-01-10 14.37.30.png](https://qiita-image-store.s3.amazonaws.com/0/32982/f45eb5d5-921a-624e-0abd-19ea665fa1e4.png)

2. 使用したい二つのバージョン以外全てのディレクトリの頭にアンダースコアをつける。
↓アンダースコアをつけた後の画像↓
![スクリーンショット 2017-01-10 14.37.53.png](https://qiita-image-store.s3.amazonaws.com/0/32982/567583bb-231d-40a3-c078-823b7abecc6d.png)

3. MAMPを再起動する。
4. PHPのバージョン変更画面を確認すると、使用したい任意のバージョンが選択できるようになっている。
↓PHPのバージョン変更画面画像↓
<img width="648" alt="スクリーンショット 2017-01-10 14.38.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/32982/0089843c-934b-1990-e994-d59b1824295f.png">

以上です。
よいMAMPライフを！！！:relaxed:

参考：[MAMPで好きなPHPのバージョンを(大体)選ぶ | Shimabox Blog](https://blog.shimabox.net/2014/11/23/php-version-of-mamp/)
Qiita > バグ? > コメントへのリンクが機能しない ←別記事から

どや
http://qiita.com/7of9/items/7bb49fbc1b88e40a89a3#comment-364bf4258dc6fb927e7c

セルフリンク、どや
（#の直前に/を入れると、ジャンプする）
http://qiita.com/jTakasuRyuji/items/7d761cd5a84aeed220bc/#comment-4b57f5a51a08157b931b
【Swift3】2つのUIView.animateを交互に動かす

#アニメーションで心拍を表現したい！
ハートを心拍のようにドキドキ、ドゥンドゥンと動かしたい。
ライブラリで何とかなりそうな気はしたけど、デフォルトで入っているアニメーションでどうにかなった。

#やりたかったこと
UIImageViewを
**0.5秒かけて小さく
→2.0秒かけて大きく**　するのをループする。

![capture.gif](https://qiita-image-store.s3.amazonaws.com/0/144427/4d2e641f-47f1-5445-9ba2-3bb770cd2290.gif)


二つのアニメーションに分けないとだめなのでoptions: .repeatが使えなかった。

#完成したやつ

```swift:AnimationController.swift
let image = UIImage(named: "image.png")
override func viewDidAppear(_ animated: Bool) {
    animate2()
}

func animate1() {
    UIView.animate(withDuration: 2.0, animations: {
        self.image.transform = CGAffineTransform(scaleX: 1.5, y: 1.5
    }) { _ in
        self.animate2()
    }
}

func animate2() {
    UIView.animate(withDuration: 0.5, animations: {
        self.image.transform = CGAffineTransform(scaleX: 1.0 / 1.5, y: 1.0 / 1.5)
    }) { _ in
        self.animate1()
    }
}
```

completionにお互いのアニメーションを指定してゴリゴリっと。
.repeatを使わなくても何とかできました。
Finderで隠しファイルを一時的に表示する(キーボードショートカット)

#前提
macOS Sierra 10.12.2

#手順

`Cmd+Shift+.` を押す。

![finder.gif](https://qiita-image-store.s3.amazonaws.com/0/115844/6c0d8d55-f5e3-df03-d282-ca8710bd45f8.gif)

参考にしたページ
http://qiita.com/kawaz/items/08b4f4770789fb96d70e

いつの間にか素のFinderでもできるようになってたようです。

---
以上
Qiita > バグ? > コメントへのリンクが機能しない

```txt:動作環境
Windows 8.1 pro (64bit)
Windows 7 pro (32bit)
Google Chrome 55.0.2883.87 m

OS X El Capitan
Google Chrome 55.0.2883.95 (64-bit)
```

Qiitaの記事において、コメントへのリンクの記載を時々使っています。
本日、記事の中でコメントへのリンクを記載したところ、クリックしてもコメントへ飛ばないことに気づきました。
こちらの環境の問題なのかは切り分けできていません。

以下のリンク(1,2)をクリックしても、コメントに飛びません。
Ctrlを押しながらクリックすると、新しいタブでコメントに飛びます。

1. [コメントへのリンク](http://qiita.com/7of9/items/7bb49fbc1b88e40a89a3#comment-364bf4258dc6fb927e7c)

2. http://qiita.com/7of9/items/7bb49fbc1b88e40a89a3#comment-364bf4258dc6fb927e7c
3. http://qiita.com/7of9/items/7bb49fbc1b88e40a89a3/#comment-364bf4258dc6fb927e7c

メモ: コメントをページ外にするために、以下に空白行を入れています。

```









































```

ここまで。
adehabitatLT で動物の移動軌跡を分析＆時系列 GPS データを間引く

動物の移動軌跡を分析するパッケージとして adehabitatLT がある。
今回の目標は
・GPS データを ltraj 形式に変換する
・移動軌跡にかんする情報を得る
・GPS データを間引く

#GPS データを ltraj 形式に変換する
以下のようなサル 1 個体の GPS データを用いる。
xy 座標 (UTM)、個体 ID、日付＋時間をふくむ。
GPS データは 30 秒ごとに取得されている。
![image](https://qiita-image-store.s3.amazonaws.com/0/153729/75b27a28-cf71-4b61-9463-9fa31d52948b.png)


```R:trajectory1
library(adehabitatLT)

d<-read.csv(適切なファイル)

# 日付＋時間の列を POSIXct 型に変換する
d$datetime<-as.character(d$datetime)
d$datetime<-as.POSIXct(strptime(d$datetime,"%Y.%m.%d %H:%M:%S"),tz="Asia/Tokyo")

#1 sp 形式にする場合
d_sp<-SpatialPoints(d[,c(1:2)], proj4string=CRS("+init=epsg:32652"))
d_sp<-data.frame(d_sp)
idd_sp<-data.frame(d$id)
coordinates(idd_sp)<-d_sp
# ltraj 形式に変換
l<-as.ltraj(coordinates(idd_sp),date=d$datetime,id=d$id,infolocs=NULL)

#2 sp 形式にしない場合
# ltraj 形式に変換
l<-as.ltraj(xy=d[,c("X","Y")],date=d$datetime,id=d$id,infolocs=NULL,proj4string=CRS("+init=epsg:32652"))
```
ためしに l の中身を見てみると以下のように表示される。
![image](https://qiita-image-store.s3.amazonaws.com/0/153729/01723c8f-88e8-738d-6a3b-bf30c720301f.png)

・Type of the traject（軌跡のタイプ）
時間の情報を含まないものは Type I、含むものは Type II と分類される。
さらに時間情報の取得間隔が一定かどうかによって、Type II は regular traject と irregular traject に分類される。
今回のデータの場合は、時間の情報を含み、すべての GPS ポイントが 30 秒ごとに取得されているため、Type II (regular) となる。

・characteristics of the bursts
ひとつづきの軌跡を burst と呼ぶらしい。
nb.reloc は GPS ポイントの数、NAs は欠損しているポイントの数（今回はなし）、
date.begin と date.end はそれぞれ軌跡の最初と最後の GPS ポイントが取得された日付＋時刻を示す。

#移動軌跡にかんする情報を得る
いろいろな情報が ltraj 形式のデータに含まれているが、
扱いにくいのでデータフレームに変換する。

```R:trajectory2
# ltraj 形式からデータフレームに変換
dd<-ld(l)
```

以下のようなデータフレームが得られる。
![image](https://qiita-image-store.s3.amazonaws.com/0/153729/21607c1b-3c11-7517-a9bb-87f3d24e7f8c.png)
（略）
![image](https://qiita-image-store.s3.amazonaws.com/0/153729/071a1c22-7560-e556-5d11-701fa1f332e3.png)

dx: x 軸方向の移動距離
dy: y 軸方向の移動距離
dist: 移動距離
dt: 時間間隔
R2n: 軌跡の最初のポイントから t 時点までの距離の 2 乗
abs.angle: x 軸方向を 0° としたときの角度
rel.angle: ひとつまえのステップの移動方向を 0° としたときの角度

t 行と t+1 行との距離や角度が計算されている
（そのため最後の行の dist や angle などは NA になっている）。

#GPS データを間引く
subsample 関数を使う。
時間間隔が一定である軌跡しか扱えない。
**ポイントは as.ltraj するときに infolocs=NULL しておくこと**

```R:trajectory3
sub_l<-subsample(l,dt=300,nlo=1,unit="sec")
```
指定する時間間隔 (dt) は元の時間間隔の倍数である必要がある。
今回は 30 秒ごと→ 300 秒（5 分）ごとまで間引く。
nlo で subsample を開始する GPS ポイントの番号を指定できる。
今回は軌跡の最初の点を指定しているが、nlo = 5 とすれば 5 番目の GPS ポイントから間引き始める。

間引いた結果は以下のようなかんじ。
無事に 300 秒ごとに間引かれたデータになった。
![image](https://qiita-image-store.s3.amazonaws.com/0/153729/30589e00-8762-c121-93c3-9ec5b26594a1.png)

#参考にしたページ
Package ‘adehabitatLT’
https://cran.r-project.org/web/packages/adehabitatLT/adehabitatLT.pdf
Analysis of Animal Movements in R: the adehabitatLT Package
https://cran.r-project.org/web/packages/adehabitatLT/vignettes/adehabitatLT.pdf
Walter Applied Spatial Ecology Laboratory | 3.2 Movement trajectories
http://ecosystems.psu.edu/research/labs/walter-lab/manual/movement-methods/3.2-movement-trajectories
[R-sig-eco] Package adehabitatLT; lion telemetry data; removing intermittent 1-hr locations to create 2-hr locations
https://stat.ethz.ch/pipermail/r-sig-ecology/2016-November/005473.html
Galaxyで、ツールを実行して身に覚えのないエラーが出た時

# 概要

ツールを実行したら、身に覚えのないエラーが出た。


```
mv: cannot stat ‘/home/ubuntu/galaxy/database
```


# 結論

データベースへの接続は、UTF-8になっているか確認する。

この場合、上のエラーメッセージのstatの次のシングルクォートが半角のものではないことが原因

## 典型的なケースの例

典型的なケースでは、Galaxyからdatabaseへの接続がlatin-1などで接続している時に、
GalaxyがUTF-8で動いていて、その結果、ツールを実行した時に、databaseの対応していない文字を受け取り、データベースに保存しようとすると、

|内容|文字コード|
|:--- |:--:|
|Galaxyからデータベースへの接続|latin-1|
|Galaxyの実行環境|UTF_8|


## Galaxyが保存しようとするもの

Galaxyは、ツールの実行結果について以下の３つを、データベースに保存する。

* job.stdout(text)
* job.stderr(text)
* job.traceback(text)

# 参考情報

[Question: UnicodeEncodeError: latin-1' codec can't encode character](https://biostar.usegalaxy.org/p/17191/)
C ドライブを SSD にしたので、データ類を D ドライブに入れて Windows10 でシンボリックリンクした話


## 目的
小容量の SSD と大容量の HDD をそれぞれ C,D ドライブに割り当てた PC を構築したのだけど、初期のまま利用するとユーザ作成したファイル類は C に保存されてしまう。
そうなるとあっという間に SSD の容量を食いつぶしてしまう。
なので、そういったデータ類を D ドライブに退避させようと思った。
今回移動させるのは「ドキュメント」「ダウンロード」の2つ。
なお、 DropBox のフォルダの位置はアプリの設定から、移動と変更が同時にできるのでそっちでやった。
メールなどもアプリで設定できるものが多いので、アプリでできることはアプリでやった方がわかりやすいと思う。

## ショートカットはダメ
Windows でシンボリックリンクっていうキーワードをあまり聞かないので、もしかしたらショートカットでいけるのでは？なんて思って試して見たけど、ダメだった。
ショートカットはそういう機能を持っているただのファイルなので、別物として認識されているようだ。

## 当たり前ですが
以下に記述されている内容について、その実行結果に対して責任は取れません。
会社等のパソコンでやる際は、社としてやっても良いのか確認しておくこと。
他の人とパソコンを共有している場合は、リンク先の実体フォルダに権限設定をしておくと良いかも。

環境によって様々な差異があると思いますが、気合いで乗り越えて。
実行中に出る警告やエラーの多くはシンボリックリンクとは関係なかったりするので、よくメッセージを確認して、適宜検索する。

(Windows7 から Windows10 にアップグレードした人はフォルダ構成が違ったり、シンボリックリンクがすでにできていたりして、よくわからないことになっているので頑張って)

## 先ずは試してみる
本番の前にテストするのは常識。
D ドライブ直下にある `test_dir` フォルダを、ユーザー名 `test_user` のユーザーの「ドキュメント」フォルダの下にシンボリックリンクを作成するケース。

1. 普通にエクスプローラで D ドライブ直下を開き、右クリックで普通に `test_dir` を作成する。
1. デスクトップのタスクバーにある Windows マークを右クリックし `コマンドプロンプト (管理者)(A)` をクリックする。
1. `mklink /d "C:¥Users¥test_user¥Documents¥test_dir" "D:¥test_dir"` 
1. `C:¥Users¥test_user¥Documents¥test_dir <<===>> D:¥test_dir のシンボリック リンクが作成されました` というログが出力される (環境によっては英語かも)。
1.  「ドキュメント」フォルダを開いてみて、見た目は普通のショートカットのアイコンになっている `test_dir` ができていることを確認する。
1. そのアイコンをダブルクリックした時に、実体がある場所に移動していることを確認する。

フォルダの指定を間違えないように (左がリンク、右が実体フォルダ)。
特に `¥` は人によってはバックスラッシュ表示になったりするので要注意。

## 実際にやってみる

### 準備
やる前に移動するフォルダやその中のファイルを利用するソフトがないか確認して、必要に応じて終了させておく。
リモートデスクトップで別マシンを接続している場合は、念のため終了させる。

### 実体をどこにおくか検討する
自分は C と同じになるように、 `D:¥Users¥test_user` フォルダを作成し、そこにそれぞれをおくことにした。
絶対に他にユーザを作らない！という強い信念があるのなら、階層を浅くするために D ドライブ直下とかでもいいかもしれない。

### 実体を移動する
エクスプローラで `PC` ＞ `ローカルディスク (C:)` ＞ `ユーザー` ＞ `test_user` とクリックで移動する。
エクスプローラの上部にアドレスバーを表示している場合、そこをクリックすると `C:¥Users¥test_user` と表示が切り替わる。
前項で作ったフォルダを別のウィンドウで開いておき、「ドキュメント」「ダウンロード」を思い切ってカットアンドペースト (`Ctrl + X` -> `Ctrl + V`) する (恐ければコピペ後に元ファイルを削除でも良い)。
途中各種確認や警告が出ると思うけど、よしなにやる(人によって違うのでなんとも言えない)。

移動後に隠しファイルやフォルダなどが残ることがあるので、よくよく確認してから移動なり削除すること (備考: [隠しファイルを見えるようにする](#隠しファイルを見えるようにする) )。
`C:¥Users¥test_user` 直下から「ドキュメント」「ダウンロード」が削除されていることを確認すること。

### シンボリックリンクを貼る
ドキュメント: `mklink /d "C:¥Users¥test_user¥Documents" "D:¥Users¥test_user¥Documents"`
ダウンロード: `mklink /d "C:¥Users¥test_user¥Downloads" "D:¥Users¥test_user¥Downloads"`

### 確認する
エクスプローラで `C:¥Users¥test_user` に移動して、ぱっと見ショートカットのようなアイコンが増えていることを確認する。
それぞれダブルクリックすると移動することを確認する。
実際に適当なファイルをブラウザからダウンロードしてみて、ちゃんとフォルダに入っているか確認する。

## おしまい
この2つのフォルダを移動してから3日ほど経っているけど、今のところ特に問題は発生していないので、多分大丈夫。
自分がやった時は、ほぼ新品状態だったため特にエラーもなくすんなり完了してしまったので、残念なことにエラーに関するノウハウは皆無。
画像は気が向いたらアップするかもしないかも。

## 蛇足

### 隠しファイルを見えるようにする
エクスプローラのツールバーから `表示` ＞ `オプション` ＞ (ウィンドウが開く) ＞ `表示` タブ ＞ `隠しファイル、隠しフォルダー、および隠しドライブを表示する` にチェック

### シンボリックリンクを削除する
シンボリックリンクのアイコンを右クリックして普通に削除できる。
コマンドでやる際は以下のように書く (今回[お試しで作ったやつ](#先ずは試してみる)を削除する場合)。
`rd "C:¥Users¥test_user¥Documents¥test_dir"`
右クリックでやってもコマンドでやっても同じことなので、前者がオススメ。
ＶＳでbacklogを使った開発忘却録

ＶＳでbacklogを使った開発でいろいろあせったポイントをメモ

▼VS側で開発をロールバックする方法
　方法：履歴>戻したいコミット>変更をリセットして削除(物理)
　詳細：指定箇所までロールバックします。
　　　　ローカルのデータが消えるので注意が必要。
Create React App による React アプリに TypeScript を導入してテストも TypeScript 化

2017-09-30 追記 : 本記事の内容ではなく [TypeScript-React-Starter](https://github.com/Microsoft/TypeScript-React-Starter#typescript-react-starter) をみると良さそうです。 (コメント参照。)

React アプリケーションのプロジェクトのひな形を作ってくれる [Create React App](https://github.com/facebookincubator/create-react-app) でプロジェクトを作成し、TypeScript を使えるようにするメモ。

# TypeScript で開発できるようにする (テスト以外)

基本的には 「[create-react-appでTypeScript用のReact開発環境を作る(入門者向け)](http://qiita.com/ovrmrw/items/5e573cff401929a3ed72)」 の教えにしたがうと TypeScript で開発できるようになる。 ありがたい情報。

ただ、このままだと `yarn run test` でテスト実行しようとしてもインポートに失敗してテストに落ちてしまう。 (ですよね？)

# テストも TypeScript 化する

上記の通り、上の手順だけではテストが実行できないので、テストを実行できるようにする。

テストファイル (src/App.test.js) を JS のままでテストが動くようにすることもできなくはないと思うが、テストファイルを TypeScript 化した方がテスト実行できるようにしやすいだろうし開発もしやすいだろうので、テストファイルを TypeScript 化する。

Jest についてあまり詳しくないので、もっといい方法があるかもしれない。 (指摘お願いします。)

## Jest が TypeScript のテストファイルを扱えるように変更

まずは [Jest](https://facebook.github.io/jest/) (Create React App でセットアップされる JS テストフレームワーク) が TypeScript ファイルを認識するようにする。

[ts-jest](https://www.npmjs.com/package/ts-jest) という npm モジュールを使用する。

```
yarn add ts-jest --dev
```

上記コマンドで ts-jest を依存に追加して、下記設定を project.json に追加。 (ts-jest のドキュメントの例通り。)

```json
{
  "jest": {
    "transform": {
      ".(ts|tsx)": "<rootDir>/node_modules/ts-jest/preprocessor.js"
    },
    "testRegex": "(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$",
    "moduleFileExtensions": [
      "ts",
      "tsx",
      "js"
    ]
  }
}
```

## テストファイルを TypeScript 化

んでもってテストファイル (src/App.test.js) を TypeScript 化する。 Jest が提供する関数を使っているので、型定義ファイルを依存に追加する。

```
yarn add @types/jest --dev
```

んでもってファイルの拡張子を .tsx に変更し、ファイルの先頭行あたりを以下のように書き換える。

```diff
-import React from 'react';
-import ReactDOM from 'react-dom';
+/// <reference types="jest" />
+
+import * as React from 'react';
+import * as ReactDOM from 'react-dom';
```

これで完了。

### `<reference types="..." />` について

この形の 3 連スラッシュディレクティブが使えるのを知らなかったのだけど、多分 TypeScript 2.0 で導入されたっぽい。 @types/jest が提供する型定義ファイルはモジュール形式じゃないので `import` で読み込めないのだけど、`<reference types="jest" />` によって参照することができる。

* [Triple-Slash Directives (`/// <reference types="..." />`)](https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html#reference-types-)

これ欲しかったやつなのでありがたい。

## 変更全体

* こういう感じ : https://github.com/nobuoka/my-react-typescript-app/commit/59dc5eeffb29e8834efd2f89ffaa1b2e77fb6197

# 感想

React アプリケーションを TypeScript で書きたい人は多いと思うのだけど、TypeScript 込みの開発環境の構成をいい感じに作ってくれるやつが見当たらない気がする。

Create React App に対しても [TypeScript オプション追加の要望](https://github.com/facebookincubator/create-react-app/issues/142) が上がってたけど却下されてるし、Create React App の README で紹介されている[代替プロジェクト](https://github.com/facebookincubator/create-react-app#alternatives) ([nwb](https://github.com/insin/nwb) とか [neo](https://github.com/mozilla/neo) とか [kyt](https://github.com/NYTimes/kyt) とか) を見てみても TypeScript サポートはなさそう。 まあ自分で構成したらいいんだけども。 TypeScript 推しな Angular と比べると React 界隈はそこまで TypeScript 推しではないのかなー、と思ったり。 (Facebook には Flow があるから？)

それはともかく web フロントエンド開発のビルド環境をどうするかは悩ましいところなので、こうやってひな形を作ってくれるものがあるのはありがたい。
vagrant + centos 7 でvagrant upが止まる、ネットワーク接続できない問題への対処

### version
* vagrant 1.9.1
* virtualbox 5.0.30
* centos 7.0

## CASE 1. `vagrant up`が途中で止まる
```shell-session
SSH auth method: private key
Warning: Remote connection disconnect. Retrying...
```
この辺で処理がSTOPする、あるいは`Timeout`のエラーが出る。

#### 原因
1. ゲスト側にインストールされている`Guest Additions`のバージョンが古い
2. あるいは`Guest Additions`がインストールされていない

これ故にport forwarding, networkまわりの挙動が不安定になる。

#### 対応
1. `$ vagrant plugin install vagrant-vbguest` --> `vagrant up`
2. 公式のcentos 7を使用しない。なぜならGuest Additionsがインストールされていないから。かわりに非公式のboxイメージを使う。例えば [tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box](https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box)

#### 参考
[VagrantのboxのGuest Additionsのアップデート方法](http://qiita.com/isaoshimizu/items/e217008b8f6e79eccc85)



##  CASE 2. ホスト --> ゲストのprivate_network接続ができない
* `ping 192.168.33.10`がTimeoutする
* `ifconfig`しても`eth1` or `enp0s3` or `enp0s8`に`192.168.xxx`のアドレスがない

#### 原因
単純にvagrantのバグ？勝手に設定が変わってしまう（初回`vagrant up`は大丈夫でも2回目以降は駄目が起こりうる）

#### 対応
Vagrantfileに強制的にサービス再起動するprovision追加

```sh:Vagrantfile
config.vm.provision "shell", run: "always", inline: "systemctl restart network.service"
```

#### 参考
[vagrant + centos7 でprivate_networkで設定したIPに接続ができない](http://qiita.com/junqiq/items/a19d3ea48b072a1b28d3)

## おわりに
めっちゃはまった…
Windows > ファイル日時 > 「作成日時」がOSによって異なる (XP, Win7)

```txt:動作環境
C++ Builder XE4
OS: Windows XP Service Pack 3
OS: Windows 7 Pro
```

C++ Builder XE4で作成したexeファイルをWinXPとWin7で見たところ、以下のようになった。

- XP 
  - 作成日時: 2017年1月4日 9:58:52
  - 更新日時: 2017年1月10日 10:30:00
- Win7
  - 作成日時: 2017年1月9日 13:59:52
  - 更新日時: 2017年1月10日 10:30:00

深追いはやめておくが、こういうこともあるようだ。
Jaspersoft Studioをインストールする

※プラグイン版のみ作成済みです。
## Jaspersoft Studioプラグイン版を使用する場合
### Eclipseよりプラグインをインストールして行います
http://community.jaspersoft.com/wiki/jaspersoft-studiopuraguinnoinsutoru

1.メニューバーより、「ヘルプ」－「新規ソフトウェアのインストール...」を選択します
![image](https://qiita-image-store.s3.amazonaws.com/0/130367/2b3b9f4b-e212-12a2-0fbf-660709cef9fd.png)

2.「作業対象」を追加します
![image](https://qiita-image-store.s3.amazonaws.com/0/130367/8eb6bf8c-4d6d-959d-051f-66574dcb87ce.png)
名前⇒Jaspersoft Studio 6.3
ロケーション⇒https://sourceforge.net/projects/jasperstudio/files/updatesite/6.3.1/
※特に指定がなければ、最新バージョンを取得してOKです。

3.インストールするツールを選択します
Business Intelligence, Reporting ToolsをチェックONにし、「次へ」押下します
![image](https://qiita-image-store.s3.amazonaws.com/0/130367/38cb67b7-90ec-6001-49a0-e3dae9776de8.png)
要件および依存関係を計算。...で数秒待ちます。

4.インストール詳細確認を確認します
インストール詳細画面が表示されるので、名前とバージョンを確認して「次へ」を押下します。
![image](https://qiita-image-store.s3.amazonaws.com/0/130367/06c4fa12-01f9-0c08-1354-08cc34c3d5c9.png)

5.Eclipseライセンス内容を確認します
ライセンスのレビュー画面にて内容確認し、「使用条件の条項に同意します」ラジオボタンを選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/130367/23292dc2-1c44-2f1f-f76b-0859b97857fd.png)

インストールが実行されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/130367/580b8c57-fcda-56ce-b4a0-53a9499af049.png)

インストール後、Eclipseを再起動すると、JapserSoftStudioのメニューが使用可能となります。
![image](https://qiita-image-store.s3.amazonaws.com/0/130367/87eed15d-55df-cb76-6abc-fd0fec24b51f.png)

新規作成対象に、JasperReportが選択可能となります。
![image](https://qiita-image-store.s3.amazonaws.com/0/130367/ccf898f4-1aaa-d3a2-d396-a4f77d002915.png)

レポート作成方法についてはまた別で。


## JaspersoftStudioを使用する場合(未完了)
1.JaspersoftStudioをダウンロードする
　http://community.jaspersoft.com/project/jaspersoft-studio
![image](https://qiita-image-store.s3.amazonaws.com/0/130367/9bb22875-1714-7b35-3b00-2990b57f974c.png)
　↓↓↓

![image](https://qiita-image-store.s3.amazonaws.com/0/130367/f8abfca0-e97c-87a8-cdc5-ec7f4ed81c49.png)
環境に合わせて、適当なものをダウンロードします。

2.インストール
Windows 10 Pro > インターネットアクセスなし > セーフモード起動で復旧

```txt:動作環境
Windows 10 Pro (64bit)
Windows 10 Anniversary Update適用済み
2017年1月10日現在までのセキュリティパッチ適用済み
```

「インターネットアクセスなし」の状態になっていると報告を受けた。
該当のEthernetケーブルを別PC(Windows 10 Pro)に接続すると、そのPCではインターネット接続できた。

**セーフモードにしてから、通常起動することでインターネットアクセスできるように回復した。**

セーフモードの起動方法
https://121ware.com/qasearch/1007/app/servlet/relatedqa?QID=013673
の`msconfig`を使う方法が簡単。

セーフモードを解除するには、再度msconfigを実行して「セーフブート」のチェックをはずす。

「インターネットアクセスなし」の状態になる現象はこれまで10台のWindows 10 Proで発生している。
すべて「セーフモード起動」で問題解決した。


## アップデート不具合

http://qiita.com/Urushibara01/items/e705a05edadd390de40c
に書かれているKB3201845 不具合が関係するのかは不明。

症状のあったPCでは固定IPアドレスになってなかった（と思う）が、次回発生時、注意する事項ではある。
【iOS】ツイートをサクッと実装【Swift3.0】

Apple純正のソーシャルライブラリを使ってツイート処理を実装してみます。

見本
<img width="375" alt="IMG_0792.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/e80c31ca-2ffa-70eb-9646-631d27c9b5cd.png">

## 実装

### 1. Social.frameworkを追加
<img width="1206" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/46c3cd7c-174d-902d-68b9-7665710804e0.png">

### 2. サンプルソース
ツイートのミニマムサンプルです。実行すると画面の真ん中にツイートボタンが表示され、ボタンクリックで見本のようなツイート入力画面が出現します。

```swift

//
//  ViewController.swift
//  Tweet
//
//

import UIKit
import Social

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    
        // ツイートボタン
        let button = UIButton(frame: CGRect(x:0,y:0,width:200,height:30))
        button.center = view.center
        button.setTitle("tweet", for: .normal)
        button.layer.backgroundColor = UIColor.red.cgColor
        button.addTarget(self, action: #selector(ViewController.tweet), for: .touchUpInside)
        view.addSubview(button)
    
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func tweet() {
        
        // ツイート処理が可能かチェック
        if SLComposeViewController.isAvailable(forServiceType: SLServiceTypeTwitter) {
            // make controller to share on twitter
            let slc = SLComposeViewController(forServiceType: SLServiceTypeTwitter)
            
            slc?.setInitialText("ツイートしちゃうよ！")
            slc?.add(UIImage(named:"leako.png"))
            
            // ツイート入力画面表示
            present(slc!, animated: true, completion: {
            })
            
            // 事後処理
            slc?.completionHandler = {
                (result:SLComposeViewControllerResult) -> () in
                switch (result) {
                    
                // 投稿した
                case SLComposeViewControllerResult.done:
                    print("tweeted")
                
                // キャンセルした
                case SLComposeViewControllerResult.cancelled:
                    print("tweet cancel")
                    
                }
            }
        } else {
            print("can not tweet")
        }
    }
}

```
これだけです。簡単です。ユーザの動作別（投稿かキャンセル）に処理を定義しておくことが可能です。

```swift

public enum SLComposeViewControllerResult : Int {
    
    case cancelled

    case done
}
```
アイコンがシルエットにならない AHBottomNavigation を作った

# これはなにか

| Before | After |
|:-:|:-:|
| ![device-2017-01-10-105511.png](https://qiita-image-store.s3.amazonaws.com/0/67657/43fd286b-134f-7c9b-c07f-22800bd6e9b0.png) |  ![device-2017-01-10-105606.png](https://qiita-image-store.s3.amazonaws.com/0/67657/c6c34788-a995-482f-6a51-5c1101930afe.png) |





[AHBottomNavigation](https://github.com/aurelhubert/ahbottomnavigation) は指定したタブのアイコンが強制的にアイコンシルエットになりますが、タブのアイコンにオリジナルの画像そのままを表示できるようにしました。

# ソースコード

[https://github.com/yhirano/ahbottomnavigation/tree/cancel_tint_icon](https://github.com/yhirano/ahbottomnavigation/tree/cancel_tint_icon)

# インストール

```groovy
allprojects {
    repositories {
        // ...
        maven { url 'https://jitpack.io' }
    }
}
```

```groovy
dependencies {
    compile 'com.github.yhirano:ahbottomnavigation:2.0.6-p1'
}
```

# 使い方

AHBottomNavigationItem はオリジナルのコンストラクタを排し、Builderでインスタンスを作るように変更しました。
他の基本的な使い方はオリジナルの [AHBottomNavigation](https://github.com/aurelhubert/ahbottomnavigation) と同じ。

```java
AHBottomNavigationItem item1 =
    new AHBottomNavigationItem.Builder(R.string.tab_1, R.drawable.ic_maps_place)
        .setColorRes(R.color.color_tab_1)
        .setTintDrawableActive(false)    // タブがアクティブな際にアイコンをシルエットにしないようにする
        .setTintDrawableInactive(false)  // タブが非アクティブな際にアイコンをシルエットにしないようにする
        .build();
```

なお、 XMLリソースからのタブを作成する場合のタブのアイコンの非シルエット機能には対応していません。
MacOSでTorの簡単なインストール方法

Mac Sierraでテストしましたが、他のMacでもできると思います。

### 1. Torインストール
```bash
# Brewの場合
$ brew install tor

# Macportsの場合
$ sudo port install tor
```

### 2. Tor起動スクリプト準備
`tor.sh`など好きな名前でスクリプトを以下の内容で作成して実行権を与えます。

```sh
#!/usr/bin/env bash

# 'Wi-Fi' or 'Ethernet' or 'Display Ethernet'
INTERFACE=Wi-Fi

# Ask for the administrator password upfront
sudo -v

# Keep-alive: update existing `sudo` time stamp until finished
while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &

# trap ctrl-c and call disable_proxy()
function disable_proxy() {
    sudo networksetup -setsocksfirewallproxystate $INTERFACE off
    echo "$(tput setaf 64)" #green
    echo "SOCKS proxy disabled."
    echo "$(tput sgr0)" # color reset
}
trap disable_proxy INT

# Rollback
sudo networksetup -setsocksfirewallproxy $INTERFACE 127.0.0.1 9050 off
sudo networksetup -setsocksfirewallproxystate $INTERFACE on

echo "$(tput setaf 64)" # green
echo "SOCKS proxy 127.0.0.1:9050 enabled."
echo "$(tput setaf 136)" # orange
echo "Starting Tor..."
echo "$(tput sgr0)" # color reset

# Start Tor
tor
```

### 3. 起動スクリプト実行
```
$ ./tor.sh
```

詳しくは[Running Tor on Mac OS X](https://www.torproject.org/docs/tor-doc-osx.html.en)をご参考ください。
SUコマンドを有効にしなくても、すぐにTerminalでrootになる方法

Ubuntuは、デフォルトでは`su`コマンドが有効では無い。
そこで、`su`コマンドを有効にしたり、いちいち`sudo`で実行したりするわけです。
面倒だと思っていたのですが、単純な解決方法がありました。

#以下のコマンドだけ

```$ sudo bash```

常識かも知れませんが、私は知らなかったので目からウロコでした。
意識高い系を煽るための Hubot スクリプト

誰しも願望って持っています。
その願望が強くなると `!` を付けたくなるようです（個人的観測）。

```coffeescript:e.coffee
# Description:
#   えっ？それマジで価値あると思ってんの？
#

module.exports = (robot) ->

  robot.hear /(たい！|たい!)$/i, (msg) ->
    msg.send "えっ？それマジで価値あると思ってんの？"

```

昔、導入してたらあまりにもウザいので機能ごと抹消されたヤツです。
有言実行されるとぐうの音も出ない機能でもあります。


この文章の閲覧やスクリプトの実装に係るすべてのことについて責任を負いかねますので、あらかじめご了承願います。
コミカムを分解してみた

自分のプロジェクトで使いたくて、WiFi経由で制御できて安価なカメラを探していたところ、ちょうど2016年の暮れに上海問屋からジャストなものが出てきた。

[電車や車のおもちゃ用のWi-Fiカメラ「コミカム」――ドスパラが完全自社開発 - ITmedia](http://www.itmedia.co.jp/pcuser/articles/1612/27/news101.html)

[上海問屋 コミカム おもちゃ用 Wi-Fiカメラ (914034)](https://www.donya.jp/item/74298.html)

どこまで使えそうか(いじれそうか)確認したかったので、早速購入。とりあえずバラしてみたので備忘録。
制御側も調べているけど、まだ動作確認できてないので、そちらはまとまってから。

**お約束 : バラすとメーカー保証は無くなるので、以下自己責任で。**

## 全体

![IMG_1615.jpg](https://qiita-image-store.s3.amazonaws.com/0/52410/6a1fb9cd-fd1a-7500-3689-e36d94febfcb.jpeg)

![IMG_0681.JPG](https://qiita-image-store.s3.amazonaws.com/0/52410/a1238c0d-ebc6-7c7e-8903-3e1a4926645e.jpeg)

分解可能な限りバラした状態。
ねじは外装に3本、基盤の固定に2本。全てプラスのみ。

バッテリーに貼られた銅板が、SoCの放熱板になっている。


## レンズ部

![IMG_0675.JPG](https://qiita-image-store.s3.amazonaws.com/0/52410/a36bd026-a6cf-e59e-6851-01da271a397c.jpeg)

cmosはレンズと一体化されていて、フレキで分離されている。
フレキの延長ケーブルで合うのがあれば、レンズ部の配置は弄れそう。
Nゲージの台車には充分乗る。Zゲージはメイン基盤を斜めにしても厳しそう。


## メイン基盤

![IMG_0677.JPG](https://qiita-image-store.s3.amazonaws.com/0/52410/2b17af66-5938-1971-1ba4-c358fdb09adb.jpeg)

まずは表面。

SoCには SPCA6330M-HHM11 と刻印がある。

台湾 iCatch Technology(芯鼎科技) の、アクションカメラ用のチップのようだ。

<a href="http://www.icatchtek.com/product/index/4" target="_blank">
<img width="1281" alt="スクリーンショット 2017-01-10 10.23.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/52410/ff1ee0ed-3f15-e015-09d0-2d5a46444409.png">
</a>
[Action Camera SPCA6330M (V33M)](http://www.icatchtek.com/product/index/4) 

情報があんまり出てないけど、Ambarellaのチップとかと同じように、カメラ組み込み用に必要なプロセッサーが、コアとなるarm系cpuと一緒になってて、カスタムlinuxがインストールされているのではないかと想像。


![IMG_0679.JPG](https://qiita-image-store.s3.amazonaws.com/0/52410/8c9e8b4d-31cb-47e2-f076-b88df3f79e98.jpeg)

次は裏面。

WiFiアンテナの設置がすごくダイナミックだけど、プラ筐体だし充分そう。

右端に乗っている別基盤にはカニさんチップが乗っているので、WiFiモジュールっぽい。
しばらくググった限り、レイアウト的には多分これっぽい。

<a href="http://www.alibaba.com/product-detail/Compare-Realtek-RTL8189-wifi-wireless-audio_60238372040.html" target="_blank">
<img src="https://qiita-image-store.s3.amazonaws.com/0/52410/fff92471-6ce6-5b9d-d1a9-991a927e7434.jpeg" width=50% height=50%>
</a>
[Compare Realtek RTL8189 wifi wireless audio video transmitter receiver](http://www.alibaba.com/product-detail/Compare-Realtek-RTL8189-wifi-wireless-audio_60238372040.html)


## まとめ

バラす前に1時間程度連続稼働させてみたけど、熱暴走とかはなかったし、チップもGoProライクなアクションカメラで結構使用実績があるようなので、とりあえず使い物にはなりそう。

構造も単純でバラしやすいので、諸々使いやすそう。例えば、中身を取り出してNゲージの台車にホットボンドで固定するだけでレイアウトを走れる車載カメラとして使えるだろう。
何より、現時点で6480円なので、車載カメラシステムと比較して圧倒的に安価になる。

車載システムの例 : [TOMIX Nゲージ 5594 車載カメラシステムセット (E233 3000系) (3両)](http://amzn.to/2jnenN0)

もちろん、Nゲージ以外に使うにも、その他の既存製品や、RaspberryPi + カメラモジュールや、Arduino + シリアルカメラで組むより安価なので、用途次第ではうまく使えそう。

**(もちろんバラして転用すると保証は無くなるので、完全自己責任で。)**
Reactメモ

## 目的
自分用のReactのメモ
間違いやアドバイスなど、気軽になんでもコメントしていただけると幸いです

## Reactとは
"ReactはFacebookが開発しているUI(MV*フレームワークでいうViewのようなもの)に特化したJavaScriptライブラリです。"
引用元[https://www.to-r.net/media/react-tutorial01/]

## Virtual DOM
"Reactでは情報が受け渡われてもいきなり描画は行わずVirtual DOMとよばれる構造体を作成してからVirtual DOMの内容を元にHTMLを作成してブラウザに描画します。

そして情報が変化した場合は、まずVirtual DOMに反映を行なってから、Virtual DOMと現在のHTMLの内容の比較を行い、差分のみをHTMLに反映させてブラウザの再描画をおこないます。"
引用元[https://www.to-r.net/media/react-tutorial01/]
ポイント：とても高速

## Componentとは
Virtual DOMを構成する部品の事

## Prop
Componentの属性。
型指定、バリデーションが可能

## デザインパターン
[fluxフレームワーク](http://qiita.com/koba04/items/b32ba449d753fdb2b597)
今回は、Reduxというのを推薦したり。(理由：流行ってるし、reactと相性が良さげ

## 最後に
React、なんか良さげなきがする
ESLint v3.13.0

前 [v3.12.0] | 次 [v3.14.0]

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">ESLint v3.13.0 has been released: <a href="https://t.co/HcvHViG8Ih">https://t.co/HcvHViG8Ih</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/817474123345592321">2017年1月6日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint 3.13.0 がリリースされました。
いくつかの機能追加・バグ修正が行われています。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

- :globe_with_meridians: [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
- :speech_balloon: [日本語サポート チャット](https://gitter.im/eslint/eslint-jp)
- :globe_with_meridians: [本家リポジトリ](https://github.com/eslint/eslint)
- :speech_balloon: [本家サポート チャット](https://gitter.im/eslint/eslint)

----

# :bulb: 新しいルール

## [#6053]: [prefer-destructuring]

![JSCS Icon](http://jscs.info/favicon.ico) JSCS 互換ルールです。

ローカル変数にプロパティを代入する際に分割代入 (Destructuring Declarations/Assignments) を優先して使おう、というスタイル・ルールです。

```js:例
/*eslint prefer-destructuring: error */

//✔ GOOD
const {foo, bar} = obj

//✘ BAD
const foo = obj.foo
const bar = obj.bar
```

# :wrench: オプションが追加されたルール

## [#7564]: [object-shorthand] avoidExplicitReturnArrows

関数本文がブロックであるアロー関数もメソッド記法で書くべし、というオプションが追加されました。

```js:例
/*eslint object-shorthand: [error, always, {avoidExplicitReturnArrows: true}] */

//✔ GOOD
const a = {
    foo() {
        // do something.
    },
    bar: () => doSomething(),
}

//✘ BAD
const b = {
    foo: () => {
        // do something.
    },
}
```

# :pencil: `eslint --fix` をサポートしたルール

## [#7540]: [no-unneeded-ternary]

```js:例
const foo = bar === 1 ? true : false
const baz = qux ? qux : boop

// ↓↓↓ gets fixed to ↓↓↓

const foo = bar === 1
const baz = qux || boop
```

## [#7702]: [operator-linebreak]

```js:例
foo
  && bar;

// ↓↓↓ gets fixed to ↓↓↓

foo &&
  bar
```

## [#7740]: [object-property-newline]

```js:例
const w = {x,
    y, z
}

// ↓↓↓ gets fixed to ↓↓↓

const w = {
    x,
    y,
    z
}
```

## [#7840]: [no-extra-label]

```js:例
A: while (true) {
    doSomething()
    break A
}

// ↓↓↓ gets fixed to ↓↓↓

while (true) {
    doSomething()
    break
}
```

[v3.12.0]: http://qiita.com/mysticatea/items/c8fd8ddca83093dab573
[v3.14.0]: http://qiita.com/mysticatea/items/82a6686cd9550dc010d5
[#6053]: https://github.com/eslint/eslint/issues/6053
[#7540]: https://github.com/eslint/eslint/issues/7540
[#7564]: https://github.com/eslint/eslint/issues/7564
[#7702]: https://github.com/eslint/eslint/issues/7702
[#7740]: https://github.com/eslint/eslint/issues/7740
[#7840]: https://github.com/eslint/eslint/issues/7840
[#9999]: https://github.com/eslint/eslint/issues/9999
[no-extra-label]: http://eslint.org/docs/rules/no-extra-label
[no-unneeded-ternary]: http://eslint.org/docs/rules/no-unneeded-ternary
[object-property-newline]: http://eslint.org/docs/rules/object-property-newline
[object-shorthand]: http://eslint.org/docs/rules/object-shorthand
[operator-linebreak]: http://eslint.org/docs/rules/operator-linebreak
[prefer-destructuring]: http://eslint.org/docs/rules/prefer-destructuring
[xxxx]: http://eslint.org/docs/rules/xxxx
Angular2とIonic2でのルーティング



こんにちわ。はこです。
Ionic2は、Angular2に深く依存しているとは言え、ルーティングは別々のやり方です。


## まずはAngular2でのルーティング


### ルーティングを使う
普通のAngularではこう書きます。

```javascript:app.module.ts
import { RouterModule, Routes } from '@angular/router';

const appRoutes: Routes = [
  { path: '', component: CrisisListComponent }, //一般的な指定。
  { path: 'hero/:id',      component: HeroDetailComponent }, //URL引数を取る
  { path: 'heroes', component: HeroListComponent, //値をrouterから挿入
    data: { title: 'Heroes List' }
  },
  { path: '', redirectTo: '/heroes', pathMatch: 'full' }, //転送
  { path: '**', component: PageNotFoundComponent } //ワイルドカード処理。
  　// ワイルドカードは redirectTo と組み合わせても良いよね
];


@NgModule({
  imports: [
    RouterModule.forRoot(appRoutes) //上記で設定したルーティングを読込
    // ...
  ],
  //...
})
export class AppModule { }
```

あとTemplate側に router-outletを書きましょう。

```html:app.html
<!-- app.module.ts で設定した内容は下記に反映される -->
<router-outlet></router-outlet> 
<!--  逆に言えば、routingによらない内容は、router-outletの外に書くと良い -->
```

### URLで指定された値を利用する

```javascript:heroDetail.component.ts
import { Router, ActivatedRoute, Params } from '@angular/router';


@Component({
  //...
})
export class HeroDetailComponent {
  constructor(private route: ActivatedRoute){
    // ActiveRouteを取得
  }
  
  // hero/12 でURL遷移したときには…
  ngOnInit() {
    this.route.params.subscribe((params: Params) => {
      console.log(params['id']) // 12
    })
  }  
}
```



## Ionic2でのルーティング

### 基本はルーティング無し

Ionicは、基本はルーティング不要と考えているようです。
アプリっぽいものを作るのであれば、ルーティングは無くても確かに困りません。
むしろルーティングがあるほうが、直URL指定の遷移によって困ることが多いかもしれません。


### ルーティングを使う
そうは言っても使いたいことがは多いです。
テストやデバッグの時でも使用頻度は高いでしょう。

[DeepLinker](http://ionicframework.com/docs/v2/api/navigation/DeepLinker/)を使います。
使い方はすごく簡単です。


```javascript:app.module.ts

// ルーティング設定
const appRoutes = {
  links: [
    { component: HelloIonicPage, name: 'Home', segment: 'home' }, //一般的な指定
    { component: ItemDetailsPage, name: 'Detail', segment: 'detail/:id' } //引数あり
  ]
}

@NgModule({
  //...
  imports: [
    IonicModule.forRoot(MyApp, {}, appRoutes)
  ],
  //...
})
export class AppModule {}


```

これだけです！ router-outletは必要ありません！



### URLで指定された値を利用する


```javascript:pages/item-details.ts
import { NavController, NavParams } from 'ionic-angular';

@Component({
  //...
})
export class ItemDetailsPage {

  // detail/12 でURL遷移したときには…
  constructor(public navCtrl: NavController, public navParams: NavParams) {
    console.log(navParams.get('id')) //12
  }
}
```

Angular標準のより簡単な気がしますね。


### 遷移直後に履歴を修正:defaultHistory

面白い機能として、「直接そのページに飛んだ場合」に戻る履歴を操作するdefaultHistoryがあります。

```
  { component: DetailPage, name: 'Detail', segment: 'detail/:userId', defaultHistory: [HomePage] }
```

上記の例では、myapp.com/detail/4でアプリを起動すると、DetailPageが表示され、戻るボタンを押すとHomePageに移動します。
アプリっぽい画面では、戻るボタンを常に表示してたりするので(Homeボタンを使わない)、けっこう必要かもしれませんね！
今更ながらそもそもRailsのバージョンが違う件。

前回の投稿でちらっと自分の環境がRails4.2.2だと書きました。
その時は`params`の削除だけで解決できましたが、今回チュートリアルの7.5「プロのデプロイ」まで行き、`puma`を導入しなければならないとのことで完全に行き詰まりました。
4.2.2のまま`puma`だけを導入するか。それともバージョンアップしてしまうか・・・悩みましたが、`puma`導入に意外と手間取ったことと、どうせそもそも違うならとこの度バージョンアップを試みました。
恐らくこんな状態の人はいないと思いますが、念の為変更した点を書き記します。

##バージョンアップの仕方
まずは当然作成中のディレクトリのままのバージョンアップを試みました。
しかし、そもそもPCにRails5はもちろんRuby2.2.2も入っていなかったです・・・
ということでそれらをインストールし、スマートなやり方ではないと思いましたが、rails5用のディレクトリを作成してこれまでのファイルをそこにコピーすることにしました。(元を変えて失敗したら怖かったので・・・)

それぞれのインストールにはこちらを参考にさせて頂きました。
http://qiita.com/gaku3601/items/5a484043f9c803ce9941


##変更点
アプリのコードは変更というよりほとんど教材通りに直しただけです。
(Rails5前提で書かれてるのだから当たり前ですけど…)
＜変えた部分＞
1.　Gemfile.lock。ここは丸ごと消してやり直しました。
2.　Gemfile。ここもチュートリアルのやつを丸ごとコピペしました。
(ちなみに7章までの最終版のGemfileは、この章のリスト6.36が最後です。
https://railstutorial.jp/chapters/modeling_users?version=5.0#cha-modeling_users)
3.　前回自分で勝手に消したparamsを教材通りに戻す。
4.　`ActiveRecord::Base`を継承している部分を`ApplicationRecord`にする。
5. テストで`DEPRECTION WARNING`が3つほど出たので警告に従い対処。

##詳細
###1. Gemfile.lock
Rails5導入に伴い、インストールしているgemもアプデートしなくてはならないのですが、こいつがあるとうまくいきません。
なので一度削除することにしました。

###2. Gemfile
最新版とかは今のところ必要ないので、これはチュートリアルのものを丸々コピペして`bundle install`。
これでGemfile.lockも新しく作り直されました。

###3. 自分で消したparams
これは前回の投稿で消したやつです。
http://qiita.com/maru_katy/items/76eebf872c3d927abbd8
Rails5からは明示的に記述するのが推奨されているとのことでしたので戻しました。

###4. ApplicationRecord
Rails4.2以前は`ActiveRecord::Base`から継承されていたものが、Rails5からは`ApplicationRecord`に移されたとのことです。
＜手順＞
1. app/modelsにapplication_record.rbファイルを作成。
2. 以下を記述
```class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end```
3. ソース内の`ActiveRecord::Base`の部分を`ApplicationRecord`に修正。

これはこちらを参考にさせていただきました。
https://railsguides.jp/upgrading_ruby_on_rails.html
http://qiita.com/ryohashimoto/items/09724ad4dddcda01bce3


###5. テストで出る`DEPRECTION WARNING`
具体的にはconfig/environments/test.rbファイルで2つ。
`config.serve_static_files`　->  `config.public_file_server.enabled = true`
`config.static_cache_control = 'public, max-age=3600'` ->`config.public_file_server.headers = { 'Cache-Control' => 'public, max-age=3600' }`

もう一つはアプリのソース外です。
これは4.2からだそうですが、隠しディレクトリの.rbenv以下のファイルにある
`raise_in_transactional_callbacks=(value)`
の設定を`true`にしました。

これらの詳しい説明はRailsのアップグレードガイドをご覧ください。
https://railsguides.jp/upgrading_ruby_on_rails.html

##まとめ
今回は早く勉強を進めるためこんな感じでアップデートしましたが、ちゃんと運用中のままでできるようにならないと実践では使えませんねσ(^_^;)
ショートカットを活用しよう - 6 - Win + E

# <kbd><kbd>Win</kbd> + <kbd>E</kbd></kbd> の効果
* <kbd><kbd>Win</kbd></kbd>はWindowsのロゴマークのキーのことです。（大抵のキーボード配列で左下の<kbd><kbd>Ctrl</kbd></kbd>のとなりにありますよね。）

エクスプローラを表示します。定番ですね。
![image](https://qiita-image-store.s3.amazonaws.com/0/156225/5c0389e8-3378-e941-13bd-c3cfa09a62ea.png)

コレ以上書くことがないので・・・
ショートカットの紹介は様々な記事があると思いますし、もっと丁寧な解説をされているところもあるかと思います。
その上で同じようなことをしているのは、その時、その瞬間、記事を目にした人にとって役に立つ情報であるかもしれないためです。

以上

|前回|方針|次回|
|:--|:--:|--:|
|[<kbd><kbd>Alt</kbd> + <kbd>↓</kbd></kbd>](http://qiita.com/rrryutaro/items/fa8d5a22506644f34acc)|[記事の方針](http://qiita.com/rrryutaro/items/74d60a6e31ff149c5710)|[<kbd><kbd>Win</kbd> + <kbd>L</kbd></kbd>](http://qiita.com/rrryutaro/items/276204bb9b6395976d7f)|
Laravel4.2と5.1のバリデーションルールactive_urlの実装を追ってみた

# 概要
Laravelのバリデーションルールには「active_url」という有効なURLかどうかをチェックするルールがあります。

調べたところ、Laravel4系と5系で、このactive_urlの実装が異なるらしく、気になったので実装を追ってみました。


# 公式ドキュメントでの記述の違い
まず公式ドキュメントでの説明を比較してみますが、どちらも`checkdnsrr`を使っているという同じ説明をしています。

```
Laravel 4.2  
https://readouble.com/laravel/4.2/ja/validation.html#rule-active-url
> active_url
フィルドがPHPの機能であるcheckdnsrrを通して、有効なURLであるかをバリデートします。

Laravel 5.1
https://readouble.com/laravel/5.1/ja/validation.html#rule-active-url
> active_url
フィルドがPHPの機能であるcheckdnsrrを通して、有効なURLであるかをバリデートします。
```

しかし、この後説明しますが、Laravel5.1では**checkdnsrr()を使っておらず、dns_get_record()を使ってURLのチェックをしていることがわかりました。**

そのため、上記の記述は公式のミスだと思われます…なんという罠…！

# 各バージョンごとの、バリデーションで使われる関数　validateActiveUrl の実装内容

それではここからバージョンごとのactive_urlの実装ルールを追っていきます。

## Laravel4.2のactive_url

実装内容は、下記のとおりです。
https://github.com/laravel/framework/blob/4.2/src/Illuminate/Validation/Validator.php

```php:framework/src/Illuminate/Validation/Validator.php
	/**
	 * Validate that an attribute is an active URL.
	 *
	 * @param  string  $attribute
	 * @param  mixed   $value
	 * @return bool
	 */
	protected function validateActiveUrl($attribute, $value)
	{
		$url = str_replace(array('http://', 'https://', 'ftp://'), '', strtolower($value));
		return checkdnsrr($url);
	}
```

Laravel4.2では、PHPの`checkdnsrr`を使用しています。

http://php.net/manual/ja/function.checkdnsrr.php

```
bool checkdnsrr ( string host[,stringhost[,stringtype = "MX" ] )
host に対応する type 型のレコードを DNS から探します。
```

しかし、この`str_replace()`の書き方ですと、`$value = 'http://example.jp/hoge/1'`だった場合、`example.jp/hoge/1`を`checkdnsrr`に投げることになってしまいます。

そのため、`http://example.jp/hoge/1`というようなURLを`active_url`でチェックしようとすると、**存在しない判定になってしまいます。**


## Laravel5.1のactive_url
実装内容は、下記のとおりです。
https://github.com/laravel/framework/blob/5.1/src/Illuminate/Validation/Validator.php

```php:framework/src/Illuminate/Validation/Validator.php

    /**
     * Validate that an attribute is an active URL.
     *
     * @param  string  $attribute
     * @param  mixed   $value
     * @return bool
     */
    protected function validateActiveUrl($attribute, $value)
    {
        if (! is_string($value)) {
            return false;
        }
        if ($url = parse_url($value, PHP_URL_HOST)) {
            return count(dns_get_record($url, DNS_A | DNS_AAAA)) > 0;
        }
        return false;
    }
```

Laravel5.1では、PHPの`dns_get_record`メソッドを使っているようです。
http://php.net/manual/ja/function.dns-get-record.php

```
dns_get_record — ホスト名に関連する DNS リソースレコードを取得する
array dns_get_record ( string $hostname [, int $type = DNS_ANY [, array &$authns [, array &$addtl [, bool &$raw = false ]]]] )
指定した hostname に関連づけられた DNS リソースレコードを取得します。
```

`parse_url($value, PHP_URL_HOST)`でホスト名の部分のみを取得しているため、`$value = 'http://example.jp/hoge/1'`であっても、ホスト名の`example.jp`をチェックするようになっています！


# まとめ

* Laravel4.2
    * checkdnsrrメソッドを使用している
    * `http://example.jp/hoge/1`の有効URLのチェックができない
* Laravel5.1
    * dns_get_recordメソッドを使用している
    * `http://example.jp/hoge/1`の有効URLのチェックができる
CakePHPではてブAPI

# はじめに
APIを初めて使ったというだけのメモ書きです。
file_get_contentsで取ればいいんだ、というだけです。

ほとんどSyncerさんのコードをパク……参考にしました
https://syncer.jp/hatebu-api-matome

CakePHPのバージョンは2.9.1です。

# コード

```php:Controller/HatebuController.php
<?php

App::uses('AppController', 'Controller');

class HatebuController extends AppController {

	public $uses = null; // Model使わない

	public function index() {

		// チェックするURL
		$target_url = $this->request->data('target_url');

		// JSONデータを取得
		$count = @file_get_contents( 
			'http://api.b.st-hatena.com/entry.count?url='
			. rawurlencode( $target_url )
		);

		// データが存在しない場合は0扱い
		if( !isset($count) || empty($count) ) {
			$count = 0;
		}
		
		// Viewに値を渡す
		$this->set(compact('target_url','count'));
	}
	
}
```


```php:View/Hatebu/index.ctp

<h2>はてなブックマーク総数カウンター</h2>

<?php
	echo $this->Form->create(false,array(
		'type' => 'post',
	));
	echo $this->Form->input('target_url',array(
		'type' => 'url',
		'label' => 'URL (http://またはhttps://から入力)',
	));

	echo $this->Form->submit('Submit');
	echo $this->Form->end();
?>

<br><br>

<h3>URL : <?php echo $target_url; ?></h3>
<h3>結果は [ <?php echo $count ?> ] 件です</h3>
```

以上です