OmniAICreator/Qiita-1.07M huggingface dataset:
エックスサーバーでWordpressをSSL化（https）する時に無限ループでハマった

# 独自SSLが無料になったのでSSL化させた

ふとしたきっかけで自分のブログをSSL化したら無限ループでハマってしまいました。
今後のためにメモとして残しておきます。

基本的にはこちらの記事が詳しく解説されているので、大変参考になりました。
[≫エックスサーバー独自SSLが無料！WordPressサイトをHTTPS化する方法](http://naifix.com/xserver-ssl/)

## 無限ループでハマる

上記のサイトを参考にほぼできるのですが、２箇所ほど無限ループでハマりました。

### wp-config.phpを書き換えないとダメ

こちらの環境では `wp-config.php` も変更する必要がありました。
下記の2行を設定して強制的にhttpsにしないと無限ループが発生します。

```php:wp-config.php
$_SERVER['HTTPS'] = 'on';
$_ENV['HTTPS'] = 'on';
```

### .htaccessのリライト条件を変更しないとダメ

記事では下記のようになっていますが、こちらの環境では無限ループになりました。

```apache:.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>
```

修正したものが下記になります。RewriteRuleはそのままでも良かったのですが念の為。

```apache:.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1 [R,L]
</IfModule>
```

これについては下記の記事が大変参考になりました。
[≫AWS常時SSL リダイレクトループしない.htaccessの書き方](https://ikuty.com/2016/07/02/aws-htaccess-without-redirectloop/)

>・ロードバランサが443へのアクセスを80へのアクセスに変換する
>・.htaccess内の RewriteCond ${HTTPS} が永遠に on にならず、リダイレクトの度にRewriteRule が走ってしまう
>元々のアクセスが https か http のどちらかが分かれば良いのだが、上記の挙動のせいで、https にリダイレクトしたとしても http からアクセスされたことになり、これが永遠に繰り返されてしまう。

おそらくエックスサーバーでもプランや契約時期によっては上記と似たような環境になっているものがあるのかもしれません。

とりあえず上記の設定で問題無くSSL化ができました。

ちなみにSSL化したブログはこちらです。
台湾旅行に興味ある方はぜひｗ
[≫ちょっと台湾いってきます−台湾旅行ブログ−](https://go-taiwan.jp/)


## 追記：2016.07.31

Wordpressの予約投稿が失敗するようになりました……。

wp-cron.php はWordpress自身から呼び出すらしいですが、`curl`で試したらエラーになりました。キャッシュ系プラグインは停止しましたし、これくらいしか心当たりがないなぁと。

```bash:
[***@sv*** public_html]$ curl --head https://go-taiwan.jp/wordpress/wp-cron.php
curl: (35) error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error
```

結果、サーバーで使用しているPHPが古いだけでした！ｗ
5.5.30 → 5.6.22 にしたらあっさり解決Ｗ

## 追記：2017.02.16

Xserverのサーバー移行キャンペーンで新しいサーバーにしたら再び無限ループが発生しました。
.htaccessのリライトルールを戻したら解消されました。

以前のサーバーは下記のルールでダメでしたが、新サーバーではこちらで正解でした。

```apache:.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>
```
【備忘録】【teratarm】Windows環境のショートカットキー(ALT+M)が効かなくなった原因

#前提
Windows7（Windows全般かな？）でALT+Mが動かなくなってしまったことがあったので覚えておくために記載しておく。
正確にはサクラエディタの連続した重複行の削除(ALT+M)が動作しなくなって
サクラエディタの不具合かと思ってかなり調べた事があった。

しかし、ALT+Sに割り当てると正常に動作するし、ExcelでもALT+Mが同時押しの動作しなかったり
他のプログラムでもダメで他に原因があるだろうと結論づけた結果、
teratermをインストールした時にフルでインストールしたのがまずかったっぽい事が分かった。

#原因
teratermをインストールする際に、とりあえず全部入れとこと思ってフルでインストールした結果、
以下のプログラムが**常駐して悪さをしていることが分かった。**
（もしかしたら最小限のインストールでも入るかもですが未確認）

##Collector.exe
C:\Program Files (x86)\teraterm\Collector\Collector.exe
###強引に設定変えた。
![image](https://qiita-image-store.s3.amazonaws.com/0/53550/0a799a13-db9f-2fff-fc94-532cdaf60ef7.png)

###何しているプログラムなのか
軽く調べた所、**teratermをタブ化してくれているツール**のようで、
設定しだいでは他のプログラム(エクスプローラ）でもタブ化することが出来るらしい。
が、しかし。このプログラム起動中はとにかく設定したショートカットキーが
軒並み引っかかりまくって動かないこともあるので面倒であれば削除することも検討すべきかもしれない。


#最後に
かなり昔にインストールした時は、Collector.exeが無い状態だったので
まるで気にしないでフルインストールしたけど、確かに使わないプログラムばっかりではあったのだが、
とりあえずは常駐するソフトは特に気をつけようかなと思った。
Angular2 Dart - Hello world

Qiita初投稿です。
いきなりですがとても興味深いニュースが飛び込んできました。

- [AngularDart is going all Dart](http://news.dartlang.org/2016/07/angulardart-is-going-all-dart.html)
- [Angular 2のコードベースがDart版とTypeScript／JavaScript版に分割、Dart版Angularの専従チームも](http://news.dartlang.org/2016/07/angulardart-is-going-all-dart.html)

今まではTS版のリリースと同じタイミングでDart版もリリースされてたのにRCが出てからピタッとDart版がリリースされなくなってたのはこういう理由だったんですね。

# Hello world
というわけで早速Hello worldです。
今回のソースコードは[こちら](https://github.com/takayuki-hayashi/angular2-dart-examples/tree/master/angular-example01)です。

## pubspec.yaml
```yaml:pubspec.yaml
#~~~~~
dependencies:
  angular2: 2.0.0-beta.18
  browser: ^0.10.0
  dart_to_js_script_rewriter: ^1.0.1
transformers:
- angular2:
    platform_directives:
    - 'package:angular2/common.dart#COMMON_DIRECTIVES'
    platform_pipes:
    - 'package:angular2/common.dart#COMMON_PIPES'
    entry_points: web/main.dart
- dart_to_js_script_rewriter
```
pubspecはこんな感じです。TS版には存在しないbeta.18のバージョンです。

## index.html
```html:web/index.html
<!DOCTYPE html>
<html>
  <head>
    <title>angular_sample01</title>
    <script defer src="main.dart" type="application/dart"></script>
    <script defer src="packages/browser/dart.js"></script>
  </head>
  <body>
    <app></app>
  </body>
</html>
```
scriptタグは2つ。main.dartはWebアプリのエントリーポイントみたいなものです。
そしてもうひとつのdart.jsを指定したダグを書いておくとpubspec.yamlにて依存関係に追加したdart_to_js_script_rewriterがプロダクションモード（pub build）時に本アプリケーションのJSをいい感じで出力してくれた上で上記2つのscriptタグを消去してくれます（DartVMがブラウザに搭載されない事が決定した今、上記タグはプロダクションモードでは必要ないですしね）
`<app></app>`は別途作成するComponentにて指定するselectorの文字列になります。

## main.dart
```dart:web/main.dart
import 'package:angular2/platform/browser.dart';

import 'package:angular_sample01/app.dart';

main() {
  bootstrap(App);
}
```
DartでWebアプリを作成するときはエントリーポイントとなるmainメソッドが実行されます。
そしてAngular2 Dartではここでbootstrapメソッドを呼び出し、そこにAngular2における重要な概念であるComponentを指定します。
Angular2では沢山のComponentを作成するのですがここで指定するのは全てのコンポーネントのROOTとなるComponentです。

## app.dart
```dart:lib/app.dart
import 'package:angular2/core.dart';

@Component(selector: 'app', templateUrl: 'app.html')
class App {}
```
さてComponentです。アノテーションの属性であるselectorに記述した文字列がComponentの名前になり、index.html内の`<app></app>`で定義可能になります。templateUrlに指定するのはComponentと対となるhtmlです。また、今回は単にhello world表示だけなのでAppクラスには何もメソッドは定義していません。

## app.html
```html:lib/app.html
<h1>Hello world</h1>
```
この状態で
`pub serve`
を実行した後にhtt://localhost:8080にアクセスすると下記のようになります。

![Screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/134650/fdd82ad6-f8b7-0764-5a57-492723592a12.png)

まあ、普通のhello worldですｗ
とりあえず今回は以上で。


###あとがき
今までPolymer Dartを使ってWebアプリを作っていましたが、ニュースを見てAngular2Dartを本格的に使おうと思い、今後も備忘録も兼ねてQiitaに書き溜めて行こうかなと思っています。

ちょいちょいDartを仕事でも使っているのですがWebフレームワークは[Polymer Dart](https://github.com/dart-lang/polymer-dart)を使っていました。しかしこのFWはDIが無かったりも含めてかなりライトな感じです。それはそれで良い特徴なのですが、やはりそれなりのWebアプリを作るとなるといろいろ物足りない感がしていたし、polymer0.16系と1.0RC系はかなり書き方が変わったのでどうせいろいろ新しく覚えるなら開発の活発なAngular2 Dartにしようと思います。
【Sensu】Ubuntu14.04にsensuをインストールする

sensuを動かすのに必要なパッケージを全部いれる。

# 必要なもの
* Redis
* RabbitMQ
* Sensu

# Redis

```
sudo apt-get update
sudo apt-get -y install redis-server
```

Linux起動時にredisが動くようにする

```
sudo update-rc.d redis-server defaults
sudo update-rc.d redis-server disable
```

# RabbitMQ 

## erlangをインストールする
```
sudo wget http://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb
sudo dpkg -i erlang-solutions_1.0_all.deb
sudo apt-get update
```

```
sudo apt-get -y install erlang-nox=1:18.2
```

## RabbitMQをインストールする

RabbitMQ3.6.0をダウンロードする

```
sudo wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.0/rabbitmq-server_3.6.0-1_all.deb
```

RabbitMQをインストールする

```　
sudo dpkg -i rabbitmq-server_3.6.0-1_all.deb
```

Linux起動時にRabbitMQも起動するようにする。

```
sudo update-rc.d rabbitmq-server defaults
```

## RabbitMQで扱えるファイル制限数を変更する

Linuxの１つのプロセスで扱える最大ファイル数を1024から65536に変更する

> By default, most Linux operating systems will limit the maximum number of file handles a single process is allowed to have open to 1024. RabbitMQ recommends adjusting this number to 65536 for production systems, and at least 4096 for development environments.

``` /etc/default/rabbitmq-server
# This file is sourced by /etc/init.d/rabbitmq-server. Its primary
# reason for existing is to allow adjustment of system limits for the
# rabbitmq-server process.
#
# Maximum number of open file handles. This will need to be increased
# to handle many simultaneous connections. Refer to the system
# documentation for ulimit (in man bash) for more information.
#
ulimit -n 65536
```

起動時にRabbitMQが動くようにする

```
sudo rabbitmqctl status
```

# Sensuをインストールする

```
wget -q http://sensu.global.ssl.fastly.net/apt/pubkey.gpg -O- | sudo apt-key add -
echo "deb     http://sensu.global.ssl.fastly.net/apt sensu main" | sudo tee /etc/apt/sources.list.d/sensu.list
sudo apt-get update
sudo apt-get install sensu
```

起動時にSensuが起動するようにする

```
sudo update-rc.d sensu-client defaults
sudo update-rc.d sensu-server defaults
sudo update-rc.d sensu-api defaults
```

```
sudo update-rc.d sensu-client disable
sudo update-rc.d sensu-server disable
sudo update-rc.d sensu-api disable
```

# 参考

http://qiita.com/narvaux/items/15da8f71f7e175116d8b#sensu%E8%B5%B7%E5%8B%95

http://qiita.com/narvaux/items/4d8d2bc59229af359c81

http://qiita.com/spesnova/items/f9a8c9661861cc453ead
Raspberry Pi CPU温度比較

#概要
ヒートシンクやファンの効力がどの程度なのかが知りたく、
ヒートシンク有り無し、ヒートシンク+ファン有りの3種でそれぞれ温度を計測しました。
その時の温度推移などを共有できればと思います。

#計測環境
| 項目 | 説明 |
|:----|:-----|
|ラズベリーパイ|Raspberry Pi2 Model B|
|ヒートシンク|W30 × D30 × H20 (mm)<br>アルミ製|
|ファン|USB-TOY80BK|
|室温|２９℃くらい|


計測を行った際に使用したソースコードは[こちら](https://github.com/Ki4mTaria/test_temperature_raspi)になります。
内容は各コアに負荷加える処理と定期的(1秒毎)にCPU温度を取得する処理となっています。
このコードをラズパイで動かすには以下の手順で環境が整うかと思います。

```bash
apt-get install -y gcc git
cd /usr/local
git clone https://github.com/Ki4mTaria/test_temperature_raspi.git
chmod 755 -R /usr/local/test_temperature_raspi/tool/

### start test ###
# 各コアのCPU利用率を100%にする
/usr/local/test_temperature_raspi/tool/start_load.sh
# 1秒ずつCPU温度を取得する
/usr/local/test_temperature_raspi/tool/start_monitor.sh
```

#計測結果
## 負荷なし
特に重い処理をしない状態の時は以下の温度でした。

| パターン | 計測結果 |
|:----|:-----:|
| ヒートシンク無し |39℃|
| ヒートシンク有り |34℃|
| ヒートシンク有り+ファン |３３℃|

## 負荷あり
CPUに負荷を加えて各コアを100%の状態にして10分間程様子を見ました。
いづれの場合も負荷をかけて1秒もしないうちに一気に5度くらい上昇しました。
その後もじわじわ上昇し10分後に以下の温度で落ち着きました。

| パターン | 計測結果 |
|:----|:-----:|
| ヒートシンク無し |58℃|
| ヒートシンク有り |47℃|
| ヒートシンク有り + ファン |43℃|

## 温度推移
### 負荷10分
10分間負荷を加えた際の温度推移は以下となりました。
ヒートシンク+ファンの場合43℃くらいまでは上昇しましたが
それ以上は上がらずそのまま維持しました。

![temp_compare.png](https://qiita-image-store.s3.amazonaws.com/0/48569/9754f38f-0833-58d6-184b-0b8d57ace27e.png)

### 負荷1時間
(途中)
グラフはまだです。。
長く負荷を加えるとヒートシンク有り(ファンは無し)でもじわじわと温度が上がっていき
ヒートシンク無しの温度(58℃)に近づいてきました。

# (適当な)結論
ヒートシンク + ファンでやった方が良いかもしれません。
が、ファンは中々うるさいですよ。
spark sqlのdataframeでhiveのpartition付きテーブルにsave or insertIntoするには


- partitionByで指定して
- saveAsTable or insertInto

でいけると思いきや、バグ or 仕様が実装されてないかで、そのままでは
save or insert できないっぽい。

http://www.cloudera.com/documentation/enterprise/release-notes/topics/cdh_rn_spark_ki.html

http://apache-spark-user-list.1001560.n3.nabble.com/DataFrame-saveAsTable-partitioned-tables-td22173.html

なので、

- hive tableは自前でcreate tableしておく with partition
    - df.saveAsTableでhive tableをcreateしてくれるが、partitionByが効かない。一回作って、partitionを編集して、自前でcreate tableする。
- regsiterTempTableでtemp tableに吐き出して
- 普通のspark上で hiveqlでinsertする。dynamic partitionで


```
import scala.collection.mutable.HashMap

import org.apache.spark._
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.functions._
import org.apache.spark.sql.hive.HiveContext
import org.apache.spark.sql._

val options = new HashMap[String, String]

options.put("spark.hadoop.mapred.output.compress", "true")
options.put("spark.hadoop.mapred.output.compression.codec", "true")
//options.put("spark.hadoop.mapred.output.compression.codec", "org.apache.hadoop.io.compress.GzipCodec")
options.put("spark.hadoop.mapred.output.compression.codec", "org.apache.hadoop.io.compress.SnappyCodec")
options.put("spark.hadoop.mapred.output.compression.type", "BLOCK")
//options.put("parquet.compression","GZIP")

//SET hive.exec.compress.output=true;
//SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
//SET mapred.output.compression.type=BLOCK;

//val sqlContext = new SQLContext(sc)
val sqlContext = new HiveContext(sc)
import sqlContext.implicits._

sqlContext.setConf("spark.sql.parquet.compression.codec", "snappy")
sqlContext.setConf("parquet.compression", "SNAPPY")
sqlContext.setConf("hive.exec.dynamic.partition", "true")
sqlContext.setConf("hive.exec.dynamic.partition.mode", "nonstrict")

val date="2016-07-23"
val hour="00"

// imp
val impRdd = sc.textFile(s"/data/imp/$date/$hour")
val parsedImp = impRdd.map(LogParser.parse)

```


```
val impDf = parsedImp.map(LogParser.parseForDFRow2).toDF
scala.util.Try(sqlContext.dropTempTable("temp_imp"))
inviewDf.registerTempTable("temp_imp") 
sqlContext.sql(s"INSERT overwrite TABLE sandbox.partitioned_imp partition(dt, dh) SELECT * FROM temp_imp limit 10")

```
Linuxプロセスアドレス空間 メモリリージョン操作

詳解Linuxカーネルの9章プロセスアドレス空間に関連する、メモリリージョンを操作する関数を読んだ。

## カーネルバージョン

v4.1.10

## データ構造

プロセスから見える仮想アドレス空間の情報は`task_struct->mm`で管理される。
割り当てるメモリリージョンは`mm_struct->mm_rb`のRed-blackツリーでメモリ番号順にソートされた、`vm_area_struct`の単位で管理される。

メモリリージョンが管理するメモリの領域は開始・終了アドレスであらわす。

~~~c
unsigned long vm_start;         /* Our start address within vm_mm. */
unsigned long vm_end;           /* The first byte after our end address within vm_mm. */
~~~

これらのデータ構造はカーネル内のメモリの確保と解放を管理するだけで、ページテーブルへの登録は別途行う必要がある(と思う)。

## メモリリージョンを直接操作する関数

基本的にはmm_rbからアドレス（範囲）を指定して検索する。また、ツリーの探索を省略するためのキャッシュをプロセスごとに持っている。
2.6.x時点の`mm->mmap_cache`は`task_struct->vmacache`となっていて、各プロセスごとに4つvmaのキャッシュを格納できる配列となっている。操作は`vmacache_*`関数で行っている。

## find_vma

`addr < vm_end`となる最小の`vm_area_struct`を検索する。検索対象のvm_area_structにaddrが含まれている必要はない。

1. `current->vmacache`を検索
2. mm_rbを検索し、対象のvmaがあればreturn、なかった場合はNULL。

## find_vma_intersection

引数のアドレス範囲`start_addr, end_addr`と重なるvmaを返す。
`find_vma(mm, start_addr)`の戻り値に対して、`end_addr <= vma.vm_start` となるかどうか。

## その他

空き範囲の検索、リージョンの追加のための関数がある。

## ページテーブルへの追加

`do_mmap`は読めていないが、関連する関数が2.6.xより大きく変わっている事がわかった。
`make_page_present()`ではなく、`populate_vma_page_range()`でページテーブルへの追加は行われていると思われる。
改行コードとタイプライター

# はじめに

全部 Wikipedia に載っています。

# 昔話

昔々、タイプライターという道具がありました。タイプライターは、指で鍵盤（キー）を叩くだけで文字や記号を紙面に印字できる機械であり、手書きよりも高速に文書を作成することができました。私もラクーンシティではよくお世話になりました。

タイプライターのキーを押すと、キーに対応するハンマーが跳ね上がり（てこの原理のイメージです）、ハンマーの先端に付いている活字（ハンコ）が紙を叩きます。この動きによって文字が紙に印字されます。更に、キーを離すとハンマーは元の位置に戻り、紙が一文字分横にずれます。この動きによって、連続してキーを叩くことで連続して文字を印字していくことができるのです。

> タイプライターに付いている全てのハンマーは常に同じ位置を叩くように設計されています。
> タイプライターの現物を見たことがない人は勘違いしていることが多いのですが、
> 文字を印字する位置が変わるのではなく、印字される紙の位置がずれていきます。

連続してキーを叩くことで文章が印字できることが分かりましたが、2 行目を印字したいときはどのようにするのでしょうか？

タイプライターの紙を固定する土台のことをキャリッジと呼びます。キャリッジは、キーを叩くたびに横へずれていき、印字部分が紙の端に近づくと、ベルとともに横移動を停止します。タイプライターの使用者は、ベルが鳴るとキャリッジを元の位置へ戻す必要がありました。この動きをキャリッジリターンと呼びます。

2行目を印字するためにはキャリッジリターンだけでは不十分です。なぜなら、キャリッジの位置を元に戻しただけでは、印字される位置が 1 行目の先頭に戻っただけだからです。つまり、そのまま印字動作を始めると 1 行目に文字が上書きされていきます。そのため、タイプライターの使用者は、キャリッジリターンと合わせて紙を 1 行分（キャリッジの動きに対して縦方向へ）ずらす必要がありました。この動きをラインフィードと呼びます。

タイプライターの使用者は、キーの押下とキャリッジリターン・ラインフィードを組み合わせて文書を作成していました。

# 今話

テキストファイルは一般的なデータ形式であるにも関わらず、改行コードに種類があることはあまり知られていません（要出典）。
ASCII 文字コードを使用するシステムでは、以下のように呼ばれる文字（文字列）が改行として使用されています。

- CR
- LF
- CR + LF

これらの名前は、タイプライターの動きに由来しています。即ち CR はキャリッジリターン、LF はラインフィードに由来します。
元祖であるタイプライターは、改行のために CR と LF の両方を必要としましたが、Unix 系と呼ばれるシステムでは LF だけを改行文字として採用しました。一方で Windows OS では、タイプライターと同様に CR と LF を改行として認識します。CR は BSD 系のシステムで改行文字として採用されているそうです。そのため（かどうかは厳密には調べていませんが） BSD を祖先に持つ Mac は Return キーで改行を入力します。

ただし、Unix 系システムは CR が使われていないというわけではなく、同じ行を随時更新していく（行を上書きする）必要があるときに使用されています。例えば `yum` などでパッケージをインストールする際のプログレスバーの表示などで使用されているように思われます。

ちなみに Windows の notepad.exe では [CR + CR + LF という改行コードが一時的に使用される](http://qiita.com/kaityo256/items/4b97a025a528fea3583d)ことがあるそうです。

ところで、プログラミングでよく使用される改行文字の表現 `\n` は通常 LF に対応しますが、`next line` の頭文字らしく、必ずしも LF に対応する必要は無いように思います。もしくは、多くのプログラミング言語が LF を改行とする Unix 系システムで発展したことを示す文化として認識するべきものなのかもしれません。

# おわりに

キャリッジリターンだけする人の動画です。
https://www.youtube.com/watch?v=g2LJ1i7222c
iOS Swift AVPlayerのAudio Track(副音声)切り替え




英語、日本語、中国語など複数の音源をもつ動画等の再生に便利です。

```swift

let player = AVPlayer()

func switchAudioTrack() {
    guard let currentItem = self.player.currentItem else { return }
    guard let audioSelectionGroup = currentItem.asset.mediaSelectionGroupForMediaCharacteristic(AVMediaCharacteristicAudible) else { return }
    let tracks = audioSelectionGroup.options
    let count = tracks.count
    // 2つ以上のみ
    guard count > 1 else { return }

    // 次のAudio Trackのindexを取得
    var index = 0
    if let currentTrack = currentItem.selectedMediaOptionInMediaSelectionGroup(audioSelectionGroup) {
        if let i = tracks.indexOf(currentTrack) where i != NSNotFound {
            if i + 1 < count {
                index = i + 1
            }
        }
    }
    
    currentItem.selectMediaOption(tracks[index], inMediaSelectionGroup: audioSelectionGroup)
}

```
centos7にvirtualboxをインストールする

#centos7にvirtualboxをインストールする
windows機にvirtulboxを入れる機会は度々あるが、linuxに入れたのは初めてだったのでメモ。

##virtualboxのインストール
###キーのインポート
Virtual Boxの配布元であるOracleのパブリックキーをインポートする。

```lang:
wget http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc
rpm --import oracle_vbox.asc
```

###レポジトリを追加する

```lang:
wget http://download.virtualbox.org/virtualbox/rpm/el/virtualbox.repo -O /etc/yum.repos.d/virtualbox.repo
```

###インストール
下記でインストールできる対象を取得

```lang:
yum list |grep Virtual
```

インストール

```lang:
yum install VirtualBox-5.1.x86_64
```

selinuxの無効化してからカーネルのリビルド

```lang:
/usr/lib/virtualbox/vboxdrv.sh setup
```

###起動
デスクトップの端末上で以下のコマンドを実行する。

```lang:
virtualbox
```
EPELリポジトリを導入


#EPELリポジトリを導入
```lang:
cd /usr/local/src/
wget https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-7.noarch.rpm
yum install epel-release-7-7.noarch.rpm
```

###使い方
```lang:
yum --enablerepo="epel" install パッケージ名
```
もしくは/etc/yum.repos.d/epel.repoのenabledを1にする。
PythonistaでクライアントFTPを最速で作ってみる

# Pythonista [iOS用 Python]
[Pythonista](http://omz-software.com/pythonista/)は、iOS端末を強力にしてくれるアプリです。
サーバー化はもちろん、その他にもいろいろ可能です。

さらに、Python2.7だけではなく、Python3.5での実行も可能です。
ただPythonコードが書けるだけではなく、オリジナルキーボードからターミナル(コンソール)、エディター、エクステンションなどあげるとキリがないくらい...アプリ紹介はこの辺で、切り上げて。

コード記載に移ります。

## FTPクライアントコード
```python:FTP.py
# coding=utf-8
#############################
# FileName: FTP.py
#.
#├── FTP.py
#└── var
#    └── tmp
#        └── test.html
#############################
## improt
from ftplib import FTP_TLS

## variable 変数
ftp_serveraddress = 'ftpアドレス'
ftp_user = 'アカウント名'
ftp_password = 'パスワード'
ftp_putdir = './var/tmp/'
ftp_putfile = 'test.html'

def ftpput(host, username, password, putdir, putfile):
    try:
        ftp_putdir = "/"
        _putfile = '%s%s' % (putdir, putfile)
        print _putfile
        print "FTP Start."
        # FTPの場合
        # _ftp = FTP(host) # FTP通信
        _ftps = FTP_TLS(host) # FTPS通信
        # デバックログの出力 (0:なし /1:コマンド /2:詳細)
        _ftps.set_debuglevel(1) # デバッグログがリアルタイムで確認できます。
        _ftps.login(username, password)
        print _ftps.getwelcome()
        print "Login OK! : %s" % (_ftps)
        _ftps.cwd(ftp_putdir)
        print "File Open."
        _file = open(_putfile, 'rb')
        command = 'STOR %s' % putfile # command操作が必要なため
        _ftps.storlines(command, _file)
        _file.close()
        print _ftps.quit()
        print "File UP Complete!"
    except:
        _ftps.quit()
        print "ERR!! ftpput_failed :" + _putfile

if __name__ == '__main__':
    ftpput(ftp_serveraddress, ftp_user, ftp_password, ftp_putdir, ftp_putfile)
```

これで、簡易なFTPクライアントができました。
file指定なところは、クールじゃないけど...。

今回挑戦したことは、FTP通信ではなく、FTPSでも通信が可能なところくらいです。
次回のアプリは、利用側が楽なようにUIなども考慮して作ってみたいと思います。

## ※注意※
同名ファイルをアップした場合は、上書きされます。
Vagrant 起動時に SSH auth method: private key で止まる

Vagrant (1.8.4) + VirtualBox (5.0.24 r108355) + Ubuntu (14.04) 環境で久しぶりに起動しようと思ったら、

`SSH auth method: private key`

から進まない ……

王道的な対策として `Vagrantfile` に以下を追記。

```rb:Vagrantfile
...略...
config.vm.provider 'virtualbox' do |vb|
  vb.gui = true
end
...略...
```

GUI が起動したら「どれを使うか選べ」的な画面が表示された（スクリーンショット撮り忘れました……）

選択したら接続された！

その後は、上記の GUI を使う設定を外しても起動できました。

追記1

遅いので、上記のように GUI で起動すると以下で止まっている様子だった。

```
cloud-init-nonet[MM:SS]: Waiting ... 略 ...
```

原因については、以下の記事が参考になりそう。

参考： [vagrantでubuntuの起動が異常に遅い](http://blog.bgbgbg.net/archives/2626)

自分の場合は特に何もしなくても、元に戻った。
MacにDocker環境を構築する


# はじめに
なかなかDockerのコマンドを覚えないのでMacにBeta版である `Docker for Mac` 環境を構築してみたのでメモしておく。
最新のインストール方法は[公式サイト](https://docs.docker.com/engine/installation/mac/)を参照してください。

# 要件
公式サイトを見ると以下の要件を満たす必要があるよう。

- OS X 10.10.3 Yosemite or newer
- At least 4GB of RAM
- VirtualBox prior to version 4.3.30 must NOT be installed



# 環境
以下実際に構築した環境。

- OS X: 10.11.1

# 手順
## インストール
### Docker for Macの入手
以下から最新版の[Docker for Macのバイナリ](https://download.docker.com/mac/beta/Docker.dmg)を入手します。

### インストーラーの起動
ダウンロードしたdmgファイルを起動すると以下の画面が表示されるので、`Docker` を `Application` ディレクトリに移動します。

![スクリーンショット 2016-07-25 23.53.28.png](https://qiita-image-store.s3.amazonaws.com/0/46472/2eeb9122-3084-50ca-966c-be5a57d9aef0.png "スクリーンショット 2016-07-25 23.53.28.png")

### Dockerの初回起動
`Application` ディレクトリにあるDockerアプリケーションをダブルクリックする。

![docker_app.png](https://qiita-image-store.s3.amazonaws.com/0/46472/18f994ea-4246-3f39-56ca-81b9b3b5b438.png "docker_app.png")

そうすると以下のポップアップ画面が表示されるのでぽちぽちしていくと簡単にインストールできる。
![スクリーンショット 2016-07-25 23.55.38.png](https://qiita-image-store.s3.amazonaws.com/0/46472/dd1ceef2-ca21-4c0e-0dab-39bcd0c1cf54.png "スクリーンショット 2016-07-25 23.55.38.png")

管理者権限が必要であり、パスワードを用意しておくこと。
![スクリーンショット 2016-07-25 23.55.45.png](https://qiita-image-store.s3.amazonaws.com/0/46472/4fc3c910-99df-18e9-54ce-eb90028aba2d.png "スクリーンショット 2016-07-25 23.55.45.png")

![スクリーンショット 2016-07-25 23.56.10.png](https://qiita-image-store.s3.amazonaws.com/0/46472/b903859b-9551-cec7-78f7-4e681ee498db.png "スクリーンショット 2016-07-25 23.56.10.png")

## コンテナを起動する
### インストールの確認
以下のコマンドでDockerのバージョンを確認する。
実験的らしい。

```
$ docker --version
Docker version 1.12.0-rc4, build e4a0dbc, experimental
$ 
```

### imageの取得
以下のコマンドでDockerHubからnginxのコンテナイメージを取得する。

```
$ docker pull nginx:latest
latest: Pulling from library/nginx
51f5c6a04d83: Pull complete 
a3ed95caeb02: Pull complete 
51d229e136d0: Pull complete 
bcd41daec8cc: Pull complete 
Digest: sha256:0fe6413f3e30fcc5920bc8fa769280975b10b1c26721de956e1428b9e2f29d04
Status: Downloaded newer image for nginx:latest
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              0d409d33b27e        7 weeks ago         182.8 MB
$ 
```

### コンテナの起動
以下のコマンドでNginxコンテナを起動してやる。
LocalのMacの `8080` ポートをNginxコンテナの80ポートにフォワーディングしている。

```
$ docker run -d -p 8080:80 --name webserver nginx
4512aad79ad04a2c773ae4142870f35dd009c2fb49db6d11f402200b97883e1f
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
4512aad79ad0        nginx               "nginx -g 'daemon off"   3 seconds ago       Up 2 seconds        443/tcp, 0.0.0.0:8080->80/tcp   webserver
$ 
```

### アクセスしてみる
`localhost:8080` にブラウザでアクセスしてみる。

![docker_nginx.png](https://qiita-image-store.s3.amazonaws.com/0/46472/39bb58b3-5dea-c890-d5b4-5b5d1a24092c.png "docker_nginx.png")

正常にコンテナが起動していることがわかる。

# おわりに
非常に簡単にMacにDockerをインストールすることができた。
`Docker for Mac` には `Docker Compose` もパッケージングされているので、今度はある程度のシステムを構築してみようかなと思う。
快適なC++生活のためにスクリプト言語を使おう5  - 数値データの確認にはSpyder統合環境を使おう -

数値データの確認には、グラフを作図するのが有効なことがあります。
あなたがPython使いの場合には、matplotlibというライブラリを紹介を受けて使っていることでしょう。

しかし、C++使いの場合には、MATLABやmatplotlib並みの作図ができるグラフライブラリを標準的に共通に使っているというにはいたっていないように見えます。[注]　（C++使いでも、MATLABやmatplotlib並みの作図ができるグラフライブラリを使っていらっしゃる方は多いと思います。ただ、それが全てのC++使いに共通のノウハウにはなっていないと、経験的に感じています。）

そこで今回はC++使いの方々に、Spyder統合環境を利用して　数値データを扱うことを紹介します。（[MATLAB](http://jp.mathworks.com/products/matlab/)や[R](https://www.r-project.org/)などのツールを使いこなしている方は、選択肢の１つが増えるだけです）


数値計算のプログラムでは
コンパイルしてビルドが通って、実行できたからといってプログラム開発が終わることはありません。
実行した結果の値が適切であることを確認する作業がいわば仕事の始まりです。
どういう値が返ってくれば正しいのかが分かる入力を使って計算を行います。

###**正しいことがわかっている簡単な例でまず確認しよう**
数値計算のプログラムの妥当性を検証する手法は、どんなにつまらないものでも、数多く考えてみることです。答がわかっている問題を数多く解いていくことが、問題を見つけることにつながります。
計算結果の行列を見やすくします。PythonのSpyder統合環境をnumpyやmatplotlibなどを使って、表示させます。
試行錯誤する段階では、対話的に使える環境を使って、妥当性の確認をしましょう。

###**ちょっとだけ難しくした例を試してみよう**

（要追記）
###**ノイズのあるデータでの結果を確認しよう**

（要追記）



これらの作業をMatplotlibのようなツールなしに確認するのは手間です。どんなにC++のコーディングが得意であっても、C++以外のツールを使いこなすべきです。C++でそれだけのグラフを作れる人は、その労力をもっと認められる分野に使うべきです。

[Matplotlib](http://matplotlib.org/)

１．まず、Matplotlibなどのライブラリで何ができるのか例題を見てみよう。

[Matplotlib](http://matplotlib.org/)の例題を数多くみることです。そうすると、中には自分の作図したい内容と類似したものがあるはずです。


２．次に入力データを置き換える方法を学ぼう。
私の場合は、他のプログラムの出力結果を行列を受け取るなら
[numpy.loadtxt()](http://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html)

画像ファイルを受け取るなら
 [cv2.imread()](http://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html#imread)
を使います。

　そのような、入力データの差し替えをすることが、データ解析の力をつける最初の一歩です。


３．matplotlibを使う例題をscikit-learnやscikit-imageで数多く試してみよう。
　[scikit-learn](http://scikit-learn.org/stable/)や[scikit-image](http://scikit-image.org/)の例題を数多く実行してみましょう。これらのサイトで用意されている例題は、全てデータ付です。そのため、それらの例題を数多く実行してみましょう。matplotlibが、複数のグラフを1枚のプロットに見やすく作ってくれることなどを経験してみてください。


４．そのようにして身につけたグラフの作成能力を、あなたの抱えている問題にあてはめてみてください。


あなたの数値計算の確認が進んで、よい結果にたどりつきますように。


###**OpenCVの中で無理やりグラフを作らない方がよいと考える理由**

数値データをOpenCVのimshow()やimwrite()で扱ってグラフ化する例はあります。しかし課題はいろいろあります。
・　0-255の範囲にするためのコードを自分で書かなくてはならない。
・　値を示すcolorbarがない。
・　１００と１１０の違いと、２００と２１０との違いとを分かりやすくする方法がない。
・　０と１の違いを見やすくするのが手間である。
・　気の利いたグラフを作るように機能を追加していくごとに
　　メンテナンスしなければならない自作ライブラリを背負い込むことになってしまう。
C/C++からグラフを作成しなければならないときに、私などがよく用いる手法の一つは
pythonスクリプトで引数を与えれば、グラフを生成して保存するように作っておく。
それを
system("python myscript.py datafile.txt")
などとして実行することです。
そうすると、C/C++のソースコードで無理やり配列データを0-225のグレースケール画像などに書かなくて済むようになります。

[注]
C++使いの場合、開発環境のOSが違っていることや、ライセンスなどの問題のために、誰もが気がいるに使える共通のライブラリは、あまり普及していないように見えます。C++では組み込みからハイエンドまでどのような種類のCPUやOSでも対応することや、GUIのライブラリもまちまちであるのでやむをえない事情があるのもわかります。
　一部のC++使いの場合には、他のソフトウェア言語の便利な機能を知ることがなく、データや妥当性の確認に手間どってしまっていることが見受けられます。


MATLABは、ライセンスが維持できる限りとても有用です。ところがいったん、組織内の部署を移動しただけで、とたんにライセンスが利用できなくなったりします。
UniversalLinkってなんだ？

#UniversalLinkとは？
iOS9からDeepLink系の技術としてAppleから正式に提供されたものぐらいの認識でいいようです。

#そもそもDeepLinkってなに？
メルマガやWebなどから`○○○://news?newsid=1234`などのURLを踏むことによって、
直接アプリの該当画面に飛ぶというものらしいです。
iOSではURLスキーム、AndroidではインテントURLなどと言うそうです。

#じゃあ具体的に何が違うの？
従来のカスタムURLスキームを使ったDeepLinkではアプリを開くまでの過程で、
Webページを挟んだり、対応アプリが複数あった場合どのアプリで表示するかなど、
コンテンツを表示するまでの間に何かが挟まれていたのですが、
iOS9からのUniversalLinkでは、間に何も挟まずに、ユーザーに開かせたいアプリで、
直接コンテンツを表示させることができるのが大きな違いのようです。

#まとめ
簡単にはなってしまいますが、従来のDeepLinkとiOS9から導入されたUniversalLinkの違いは、
上記のような違いになってくるのかなと思います。
UniversalLinkを使うにはアプリ、Webともに使えるように対応させる必要があるようです。
今回はソースコードや詳しい内容は載せられなかったので、
今後、随時追記していきたいと思います。
Java リフレクションでprivteなフィールドを参照・更新したりメソッドを実行する方法

JUnitテストで、privateなフィールドを参照・更新したり、メソッドを実行する必要がありましたので、リフレクションを使ったアクセス方法を整理します。

```java
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class Test {
  static class X {
    private int num;           // privateな値
    private List<String> list; // privateなオブジェクト
    private String greeting(String name, int age) { // privateなメソッド
      return name + "(" + String.valueOf(age) + "): Hello!";
    }
    X(int i) {
      num = i;
      list = new ArrayList<String>();
      for (int j = 0; j < i; j++) {
        list.add(String.valueOf(j));
      }
    }
  }

  public static void main(String[] args) {
    X x = new X(10); // privateメンバへアクセスしたいオブジェクト

    try {
      Class<X> xClass = X.class; // Xクラスのクラスインスタンスを取得
			
      // privateな値の参照と変更
      Field xNumField = xClass.getDeclaredField("num");
      xNumField.setAccessible(true);
      System.out.println(xNumField.getInt(x)); // 10
      xNumField.setInt(x, 5); // 5をセット
      System.out.println(xNumField.getInt(x)); // 5
			
      // privateなオブジェクトの参照と変更
      Field xListField = xClass.getDeclaredField("list");
      xListField.setAccessible(true);
      List<String> xList = (List<String>)xListField.get(x);
      System.out.println(xList); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      xList.add("10");
      xListField.set(x, xList); // "10"を追加したリストをセット
      System.out.println(xListField.get(x)); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
			
      // privateなメソッドを実行
      Class[] argClasses = { String.class, int.class }; // 引数のクラス配列
      Method xGreetingMethod = xClass.getDeclaredMethod("greeting", argClasses);
      xGreetingMethod.setAccessible(true);
      Object[] argObjects = { "Tanaka", 28 }; // 引数のオブジェクト配列
      System.out.println(xGreetingMethod.invoke(x, argObjects)); // Tanaka(28): Hello!
			
    } catch (NoSuchFieldException e) {
      e.printStackTrace();
    } catch (SecurityException e) {
      e.printStackTrace();
    } catch (IllegalArgumentException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    } catch (NoSuchMethodException e) {
      e.printStackTrace();
    } catch (InvocationTargetException e) {
      e.printStackTrace();
    }
  }
}
```
メルカリのサンフランシスコオフィスに訪問して色々聞いてみた

# メルカリのサンフランシスコオフィスに訪問して色々聞いてみた

## はじめに
6/11 から 6/19 まで WWDC16 に参加するために
サンフランシスコを訪れていました。
それはブログの方に記事を書いております。
よろしければごらんください。[^1]

6/17 の金曜日夜(現地時間)にメルカリの
サンフランシスコのオフィスで
WWDC16 の After Party が開かれたのでお邪魔してきました。
その際，メルカリについて，事業の海外展開について
少しお話を聞く機会があったので聞いてきたことを書きたいと思います。

サンフランシスコなど海外勤務に興味ある方は，
もっと詳しい話がおそらく iOSDC で聴けると思います。

## Q. アメリカでのサービス展開はどうですか？
日本の方がまだサービスの規模は大きい。
アプリは日米通算DL数 4000万を達成し，
そのうち3000万が日本で，1000万がアメリカだそう。
アメリカは約 2 年前からサービス展開してる。
CM とかは打ってないらしい。(高いらしい)
今は質を高める段階にある。
アメリカとイギリス向けに力入れている。
アメリカでのサービス展開はまだまだ課題山積だけど
言い換えればとてもやりがいがあるとのこと。


## Q. アプリについてざっくり教えて
8 〜 9 割は同じコードで，ローカライズのため 2 つに分けている。
ローカライズといっても言語だけでなく，支払い方法などが該当し，
アメリカだと Apple Pay とかの対応がある。
エンジニアは日本から来てもらって，
残りの職(デザイナーさんなど)は現地の方を採用している。
アメリカ人好みのアプリにするために頑張っている。
デザイナーさんなどで現地の方を採用するのはこういう意図もある。
DL 数や KPI などの数字は常にチェックしている。
社内に数字を分析する部隊もいてどうすればいいのかを判断しているそう。
フリマとかもあるし土壌はあるはず。
これから期待できる。

## Q. サンフランシスコでの生活はいかかですか？
とても良い！
バイクとかでいろいろ出かけるのが好きだから。
サンフランシスコの方は朝が早く，朝型になれた。
(だいたい 9:00-17:00くらいなんだとか)
社員の方はみんなサンフランシスコ市内に住んでいる。
家賃が 30 ~ 40 万円くらいする。(会社からの補助がでてなんとか)
英語がとりわけできるとかが基準ではなく，
サンフランシスコへは志願制で，メルカリは少し年齢層が高く，
家族がいる方も多いので独身の方の志願が多いそう。

ビザが 3 か月しかないので出張扱いで行って，
現地の空気や人々と空気が合うかもチェック可能。
3 か月のビザを連続で取りすぎると入国のときに修羅場になるとかならないとか。
就労ビザ取得すれば問題ないみたい。この辺はよくわからない。
人が増えてきたので引越しも検討中とのこと。

Q. そういえば，不動産屋さんとか見かけてないのですが，
どうやって皆さん部屋とかオフィスとか探してるのですか？

2ch みたいなのがあって，直接オーナーと交渉するらしい。
でも日本の不動産の方が世界的には特別な感じする。
海外での生活は慣れるまで大変そうです。
あと人によってだいぶ違うかも。

## ブレイク
メルカリのサンフランシスコのオフィスはサンフランシスコ市内で
最も栄えているという Market Street 沿いにある。
駅的には BART の Powell 駅と Montgomery 駅の
ちょうど中間くらい。
歩いてもそんなに遠くはないです。

Market Street は電車が走っていたり，
歩道も広めで人通りも多いです。

![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/88266/ed39460e-f56e-1e42-4afa-e74f89772604.jpeg)


パウエル駅の方は楽器鳴らしてる謎の人たちもいたり，とにかく賑やかです。
WWDC に参加すると間違いなく多用する通りでしょう。
ケーブルカーのところが一番賑わっている気がする。

![42.JPG](https://qiita-image-store.s3.amazonaws.com/0/88266/d7f1baaa-b0a5-3254-a16f-d7e4b0235da3.jpeg)

入り口はちょっとわかりづらいけど，
通りの左側を見て 720 のドアを開ければいいです。
オフィスはごくごく普通な感じ。ロゴはおなじみ。

![08.jpg](https://qiita-image-store.s3.amazonaws.com/0/88266/7a593cae-d15c-fad4-4cc5-d6e769e3152f.jpeg)

![IMG_2877.jpg](https://qiita-image-store.s3.amazonaws.com/0/88266/c4d31fd5-40fa-278a-07c4-8d6bf5f74582.jpeg)

アメリカはピザがでかい。

![IMG_2871.jpg](https://qiita-image-store.s3.amazonaws.com/0/88266/44765c8a-88c6-bf0d-019b-8ba86df5ce3b.jpeg)



## おわりに
WWDC16 の After Party でメルカリの
サンフランシスコオフィスにお邪魔し，
どういう感じでお仕事されているのかを聞いてきました。
海外で働きたい，支社を出したいそういった方々の参考になれば幸いです。

サンフランシスコ，ロンドンで働いてみたいという方が
いらっしゃいましたら Wantedly などで積極採用されている
ようなので応募してみてはどうでしょうか？

最後にお忙しい中 After Party を開いていただき，
ありがとうございました。とても楽しめました!!

## ブログ
勉強会レポの第 13 ~ 21 回の記事が該当になります。↓
[^1]: [http://milanista224.blogspot.jp/p/study.html](http://milanista224.blogspot.jp/p/study.html)
201MにAndroid4.4を導入する

## 概要
ポケモンGOがどうしてもプレイしたかったので，余っていた
201M(別称:RAZR M, XT907)にAndroid4.4互換のCyanogenMod11(以下CM11)を導入した記録
環境はUbuntu14.04

## 環境準備
* スマホ側で"USBデバッグを有効にする"をオン
* PC側に必要なソフトをインストール

```bash
sudo apt-get install android-tools-adb android-tools-fastboot
```
* PC側でスマホのマウントの設定.以下の２行を`/etc/udev/rules.d/51-android.rules`に書き込む

```bash
#Motorola
SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", MODE="0664", GROUP="plugdev"
```

## rootの取得
http://www1.axfc.net/uploader/so/2991543
上記からファイルをダウンロード
READMEに従って以下のコマンドを実行

```bash
adb push break_setresuid /data/local/tmp/
adb push mole-plough-ccsecurity.so /data/local/tmp/
adb push mole-plough-lsm.so /data/local/tmp/
adb shell
cd /data/local/tmp/
chmod 777 *
./unlock_security_module
./break_setresuid
```

## ブートローダのアンロック
http://vulnfactory.org/public/motopocalypse.zip
上記からファイルをダウンロード
以下のコマンドを実行

```bash
adb push unlock /data/local/tmp/
adb shell chmod 755 /data/local/tmp/unlock
adb shell
cd /data/local/tmp/
chmod 777 *
./unlock_security_module
./break_setresuid
./unlock
```

## suの設置
http://ux.getuploader.com/F10D/download/14/f-10D_root_tool.7z
上記からファイルのダウンロード
`su`のあるディレクトに移動し，以下を実行

```bash
adb push su /data/local/tmp
adb shell
chmod 777 /data/local/tmp/su
mount -o rw,remount /system /system
cat /data/local/tmp/su > /system/xbin/su
chmod 6755 /system/xbin/su
mount -o ro,remount /system /system
```

## カスタムリカバリモードの書き込み
http://d-h.st/iu8
上記からファイルのダウンロード
`電源ボタン+音量ダウン`を同時押ししながらスマホを起動し,
`fastboot`モードに入る.
以下のコマンドを実行

```bash
sudo fastboot flash recovery CWM-6.0.4.6-swipe-moto_msm8960.img
sudo fastboot flash boot CWM-6.0.4.6-swipe-moto_msm8960.img
```
電源を切って再起動後，いつもと違う画面が起動すればおｋ
２行目のコマンドまで紹介されているページが殆ど無く，ココで一番時間を消費した・・・．

## CM11の書き込み
http://download.cyanogenmod.org/get/jenkins/90472/cm-11-20141112-SNAPSHOT-M12-moto_msm8960_jbbl.zip
http://jump.2ch.net/?ux.getuploader.com/android/download/6/xt902-cm11-patch.zip
http://itvends.com/gapps/gapps-kk-20140606-signed.zip
上記からファイルをダウンロードし，スマホのmicroSD内に配置
スマホの電源を入れ，以下の２つを実行

```bash
"wipe data/factory reset"
"wipe cache partition"
```

`"install zip"`を起動し，上記の３つのzipを上から順に書き込む

### 終わり＼(^o^)／

## 参考
* root取得
http://tam-sam-tp.hatenablog.jp/entry/2015/06/06/044445

* ブートローダアンロック
http://tam-sam-tp.hatenablog.jp/entry/2015/06/06/044445
* suの設置
http://l05d.blogspot.jp/2015/01/201mrootcm11android44.html
http://www.neko.ne.jp/~freewing/android/docomo_f10d_arrows_x/
* カスタムリカバリモードの書き込み
http://forum.xda-developers.com/showthread.php?t=2402234
https://wiki.cyanogenmod.org/w/Install_CM_for_xt907
http://l05d.blogspot.jp/2015/01/201mrootcm11android44.html
* CM11の書き込み
http://l05d.blogspot.jp/2015/01/201mrootcm11android44.html
http://andmem.blogspot.jp/2014/02/romwrite.html
SSLでLaravel5.1のヘルパー関数 url() を使う

# 概略
L5のヘルパー関数 url()をSSL(https)上に設定されたページで使うときのメモ

- Apache & SSL : 自動的にURLが"https://"に設定される
- nginx & FastCGI & SSL : 自動的にURLが"https://"に設定されない

# nginx & FastCGI & SSLでURL()を"https://"したい

``` php:example.php
echo url('foo/bar', $parameters = [], $secure = null);
```

ヘルパー関数 url()には、引数```$secure```があるので、```TRUE```を設定する。


# 参照
- 英語:[L5.1 Helper Functions](https://laravel.com/docs/5.1/helpers#method-url) (引数```$secure```記載あり)
- 日本語:[L5.1 ヘルパー関数](http://readouble.com/laravel/5/1/ja/helpers.html#method-url) (引数```$secure```記載なし)
OpenBlocks IoT BX1/EX1 へ Ruby 2.3 をインストールする

TL;DR
=====

これで `/opt/rbenv` に rbenvおよびRuby 2.3.1 本体が入ります

```console
# export RBENV_ROOT=/opt/rbenv
# RUBY_VERSION=2.3.1

# apt-get update
# apt-get install -y --no-install-recommends build-essential libssl-dev libncurses5-dev  libreadline6-dev libtinfo-dev libyaml-dev zlib1g-dev ssh-client ca-certificates git

# git clone https://github.com/sstephenson/rbenv.git ${RBENV_ROOT}
# export PATH="${RBENV_ROOT}/bin:${PATH}"
# (cd $RBENV_ROOT && src/configure && make -C src)
# eval "$(rbenv init -)"
# git clone https://github.com/sstephenson/ruby-build.git $(rbenv root)/plugins/ruby-build
# TMPDIR=/var/tmp/rbenv-build rbenv install -v ${RUBY_VERSION}

# echo ${RUBY_VERSION} > $(rbenv root)/version
# $(rbenv root)/versions/${RUBY_VERSION}/bin/gem update --no-document
# update-alternatives --remove-all ruby
```

※`TMPDIR` は `/tmp` の容量不足に対応するものです。最終的にはrbenv install時のログが残ります。削除しちゃってOK

※最後の `echo` は `rbenv global ${RUBY_VERSION}` したのと同じです
※`gem update`はお好きにしてください
※`update-alternatives`は既存のRubyを無視(!)するためのものです。既存のRubyがなければ失敗しますけど気にしないでください

実際に使う際には
-------------

`.bash_profile` あたりに

```bash:.bash_profile
if [ -x "RBENV_ROOT/bin/rbenv" ]; then
    export PATH="RBENV_ROOT/bin:$PATH"
    eval "$(rbenv init -)"
fi
```

としてください (この辺は普通にrbenvインストールした時と同じです)
※RBENV_ROOTはわざとだよ。

cron等non-interactiveな環境からは
-------------------------------

この辺をご参考に

http://blog.livedoor.jp/sonots/archives/33204053.html


注意
----

対象: [OpenBlocks IoT Family ファームウェア 1.0.10](http://openblocks.plathome.co.jp/support/software/bx1/)
消費サイズ: /dev/mmcblk0p10 を 約560MB 消費します (apt-get installした分含め)
作業に必要な時間: **70分くらいかかります(!!)**

解説
====

OpenBlocks IoTにインストールされているDebian GNU/Linuxのバージョンは wheezy です

このまま `apt-get install ruby` とかすると [Ruby 1.9 とか Obsolete](https://www.ruby-lang.org/ja/news/2015/02/23/support-for-ruby-1-9-3-has-ended/) なバイナリがインストールされます ;-p)

そこで [rbenv](https://github.com/rbenv/rbenv) を使って最新のRubyをインストールするという試みです

あとがき
======

さぁ、安心して `gem install fluentd --no-document` しよう！
Laravel5.xをサブディレクトリで動かす

# 概要
- Laravel5.xを http://exapmle.com/laravel/ で動作させたい。
- 設定ファイルの位置は CentOS6 ベースです。

# Apache


``` diff:/etc/httpd/conf.d/laravel.conf

# いつもどおりのVirtualHost 
<VirtualHost *:80>
    ServerAdmin webmaster@example.com
    DocumentRoot /www/docs/example.com
    ServerName example.com
    ErrorLog logs/example.com-error_log
    CustomLog logs/example.com-access_log common
+   #Aliasを設定する
+   Alias /laravel-twilio "/var/www/laravel/public"
#</VirtualHost>
```

``` diff:/var/www/laravel/public/.htaccess
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
+   #サブディレクトリを指定
-   RewriteRule ^(.*)/$ /$1 [L,R=301]
+   RewriteRule ^(.*)/$ /laravel-twilio/$1 [L,R=301]
+   RewriteBase /laravel-twilio

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>
```

# nginx

``` diff:/etc/nginx/conf.d/laravel.conf
# 前略
+    location ^~ /laravel {
+        alias /var/www/laravel/public;
+        try_files $uri $uri/ @laravel01;
+        index index.php index.html index.htm;
+
+        location ~ \.php$ {
+            fastcgi_split_path_info ^(.+\.php)(/.+)$;
+            fastcgi_pass unix:/var/run/php-fpm.sock;
+            include fastcgi_params;
+            fastcgi_param SCRIPT_FILENAME /var/www/laravel/public/index.php;
+        }
+    }
+    
+    location @laravel01 {
+        rewrite /laravel/(.*)$ /laravel/index.php?/$1 last;
+    }
# 後略
```

# あとがき
nginxの```fastcgi_param SCRIPT_FILENAME```のところをもう少しスタイリッシュに書きたい。
ubuntu skills

http://wiki.ubuntu.org.cn/UbuntuSkills

```bash
vagrant@precise64:~/data/boot$ dpkg -L python3
/.
/usr
/usr/lib
/usr/lib/valgrind
/usr/lib/valgrind/python3.supp
/usr/share
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/dh_python3.1.gz
/usr/share/man/man1/py3compile.1.gz
/usr/share/man/man1/py3clean.1.gz
/usr/share/debhelper
/usr/share/debhelper/autoscripts
/usr/share/debhelper/autoscripts/postinst-py3compile
/usr/share/debhelper/autoscripts/prerm-py3clean
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/python3
/usr/share/pixmaps
/usr/share/perl5
/usr/share/perl5/Debian
/usr/share/perl5/Debian/Debhelper
/usr/share/perl5/Debian/Debhelper/Sequence
/usr/share/perl5/Debian/Debhelper/Sequence/python3.pm
/usr/share/doc
/usr/share/doc/python3
/usr/share/doc/python3/copyright
/usr/share/python3
/usr/share/python3/runtime.d
/usr/share/python3/runtime.d/public_modules.rtremove
/usr/share/python3/runtime.d/public_modules.rtinstall
/usr/share/python3/dist_fallback
/usr/share/python3/python.mk
/usr/share/python3/debpython
/usr/share/python3/debpython/depends.py
/usr/share/python3/debpython/debhelper.py
/usr/share/python3/debpython/pydist.py
/usr/share/python3/debpython/__init__.py
/usr/share/python3/debpython/option.py
/usr/share/python3/debpython/version.py
/usr/share/python3/debpython/tools.py
/usr/bin
/usr/bin/dh_python3
/usr/bin/py3compile
/usr/bin/py3clean
/usr/share/man/man1/pygettext3.1.gz
/usr/share/man/man1/pydoc3.1.gz
/usr/share/man/man1/pdb3.1.gz
/usr/share/pixmaps/python3.xpm
/usr/share/doc/python3/README.Debian
/usr/share/doc/python3/changelog.Debian.gz
/usr/bin/pygettext3
/usr/bin/pydoc3
/usr/bin/pdb3
```

http://kvz.io/blog/2008/11/08/search-for-a-package-with-aptfile/

```bash
dpkg -S filename
apt-file search filename
```

```bash
sudo apt-get dist-upgrade (这一步安装所有可用更新)
或者
sudo apt-get upgrade (这一步安装应用程序更新，不安装新内核等)
```

查询软件xxx依赖哪些包
apt-cache depends xxx
查询软件xxx被哪些包依赖
apt-cache rdepends xxx
vagrant windows smb


https://segmentfault.com/a/1190000003921392

http://blog.rudylee.com/2014/10/27/symbolic-links-with-vagrant-windows/

https://coderwall.com/p/cdsl2q/can-t-create-symlinks-in-virtualbox-shared-folders

http://blog.xcatliu.com/2016/04/21/setup-linux-workspace-in-windows/

http://tech.respect-pal.jp/vagrant-synced_folder-type/

https://blogs.technet.microsoft.com/heyscriptingguy/2013/06/02/weekend-scripter-install-powershell-3-0-on-windows-7/

https://www.microsoft.com/en-us/download/details.aspx?id=34595

http://www.howtogeek.com/255435/how-to-update-windows-7-all-at-once-with-microsofts-convenience-rollup/

http://www.jianshu.com/p/2eebd6ad284d

http://stackoverflow.com/questions/1565434/how-to-find-the-net-version

http://www.tipsninja.com/grub-installation-failed/

http://www.diskgenius.cn/help/partresizing.php

https://wiki.ubuntu.org.cn/viewtopic.php?f=120&t=257333

http://wiki.ubuntu.org.cn/UbuntuSkills

https://www.ubuntu.org.cn/viewtopic.php?f=155&t=356254&start=0

https://wireless.wiki.kernel.org/en/users/Drivers

https://pci-ids.ucw.cz/read/PC/8086/095a

https://wireless.wiki.kernel.org/en/users/drivers/iwlwifi#and_7265_support

vagrant 1.7.4

http://www.linux-drivers.org/audio.html

http://www.quantumcore.cn/archives/www.wikimilk.org/linux-realtek-wireless-driver/

http://www.jianshu.com/p/aaa5c8f104aa

https://wireless.wiki.kernel.org/en/users/drivers/iwlwifi/debugging

http://askubuntu.com/questions/258616/how-can-i-debug-my-wireless-problem

https://wiki.archlinux.org/index.php/Wireless_network_configuration#Installing_driver.2Ffirmware


必须要用管理员权限的cmd打开vagrant,有些版本的vagrant不能用就一个一个换一个一个试,powershell版本至少要3.0
升级的办法是这个https://blogs.technet.microsoft.com/heyscriptingguy/2013/06/02/weekend-scripter-install-powershell-3-0-on-windows-7/


语法大概是这样

```rb
config.vm.synced_folder “C:\hogehoge\hugahuga”, “/hogehoge/hugahuga”, type: “smb”, smb_username: “Windowsユーザー名”, smb_password: “パスワード”
```
IntelliJでSpringBootの開発環境を作成する

#初めに
IntelliJでSpringBootのプロジェクトを作成した時のメモです。

#SPRING INITIALIZRでプロジェクト作成
IntelliJだとSpringBootがサポートされていて、IntelliJから作成できるのですが、今回は[SPRING INITIALIZR](https://start.spring.io/)でMavenプロジェクト形式で作成します。

<img width="979" alt="スクリーンショット 2016-07-25 22.34.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/70979/1adce163-6815-ab94-2cf3-392c364d1e37.png">


# Mavenプロジェクトの作成
Group名とArtifactを入力します。
その後、Dependenciesを入力するのですが、Web系の場合はとりあえずWebだけ指定して、"GenerateProject"をクリックします
少しするとzipファイルがダウンロードされるのでそれを保存します。
保存後Zipファイルを展開します。

#IntelliJでプロジェクトのインポート
InttelliJを起動してImportProjectをクリックします。

<img width="777" alt="IntelliJ起動後の画面" src="https://qiita-image-store.s3.amazonaws.com/0/70979/fc1265a8-c7e3-d17a-e2a3-43e566fd80e3.png">
表示されたダイアログからZipファイルを展開したディレクトリを指定します。

<img width="421" alt="ディレクトリ選択" src="https://qiita-image-store.s3.amazonaws.com/0/70979/f11b2fd1-3471-76e7-51f1-fd5e05f6b66a.png">

プロジェクトのタイプを選択するように促されるので、"Maven"を選択して"Next"をクリックします。
<img width="721" alt="プロジェクトタイプの選択" src="https://qiita-image-store.s3.amazonaws.com/0/70979/4aec49bd-0cac-e205-827d-fcc4302cf924.png">

後は、最後まで"Next"をクリックして、最後は"Finish"をクリックして、プロジェクトの作成は完了します。
<img width="724" alt="スクリーンショット 2016-07-25 23.17.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/70979/5eab7412-9b81-13ef-0315-32a69da734ee.png">

<img width="723" alt="インポートするプロジェクトの選択" src="https://qiita-image-store.s3.amazonaws.com/0/70979/c4dd87d6-9f8a-c546-0bb4-880df64c5540.png">

<img width="722" alt="パスの設定" src="https://qiita-image-store.s3.amazonaws.com/0/70979/5da43895-feb6-0c4e-989e-8e97b44fcf47.png">

<img width="722" alt="IntelliJのプロジェクトの設定" src="https://qiita-image-store.s3.amazonaws.com/0/70979/c41b99d6-c2e7-1400-de23-9d50064603d2.png">
Herokuメモ

## はじめに
今まではAWSや専用サーバーなどでデプロイをしていて、初めてHerokuを使ってみたのでメモをとっておく。

## デプロイ
デプロイはHerokuのページに書かれている通り。

`アプリ名` → `Deploy`

の順番に辿っていけばやり方が書かれている。


```
// Herokuにログイン
$ heroku login

// プロジェクトが無い場合は作成する。
$ cd my-project/
$ git init

// すでにプロジェクトがある場合はこれだけでOK
$ heroku git:remote -a APP_NAME

// あとはgitと同じだが、プッシュと同時にデプロイされる。
$ git add .
$ git commit -am "make it better"
$ git push heroku master
```

素晴らしい！
これだけでデプロイが完了する。

## Rakeタスク
デプロイ後はDBが無いためエラーで落ちてしまう。
なので、Rakeタスクを流す必要がある。

`heroku run`

このコマンドを使えば`Rake`コマンドが使えるようになる。
具体的には以下のようにコマンドを実行することができる。

```
heroku run rake db:migrate
heroku run rake db:seed
````

これで基本的なアプリなら起動するはずだ。

## DB再作成
PostgreSQLはMySQLとは違い接続がある時にDBを削除できない。（MySQLはできる。）
なので、HerokuでDBを作り直す時は以下のコマンドを実行する。

```
heroku pg:reset DATABASE
```

もしくは

```
heroku rake db:migrate:redo STEP=10
```

でも可能だが、`down`できない状況の場合は使えない。
本番環境でこのような事をすることは無いと思うが、開発時点ではそれなりに使うことがあるだろう、

## Herokuの再起動
`heroku restart`で再起動される。
ロールバックは

`heroku releases`でバージョン確認後に`heroku rollback <バージョン番号>`を実行する。

バージョン情報に日付などもあるのでわかりやすい。

## アプリの情報
`heroku apps:info`で確認できる。

## SSH接続
`heroku run bash`で接続が可能。

## irb起動
`heroku run console`で起動する。
SSH接続よりも使う機会が多い気がする。

## Herokuへ環境設定追加
`heroku config:set KEY=**********`
これで管理している情報は以下のコマンドで見れる。

`heroku config`

見ると変えてはいけない項目もあったりするので注意。
(`heroku config --shell`を使えば.envで使える形式で出力される。)

## アプリ削除
`heroku apps:destroy --app APP`でアプリ削除らしい。
実行したことが無い。

## 無料枠
クレジットカードの登録をすれば`1000 dyno hours`でしない場合は`550 dyno hours`になります。
無料枠は30分アクセスが無いとsleepされる。（再びアクセスすれば起動する。）
変わりにクレジットカードを登録していない場合は550時間/月しか稼働ができないので途中でアクセスができなくなりそう。

※2016/6/3より上記が適用されたらしい。随時改定されるみたいなので注意。

## おまけ

### ステージングの作成
やったことは無いけど`heroku fork -a APPNAME APPNAME-stg`でコピーされるらしい。
DBの内容もコピーされるのでとても良い。

### PostgreSQL
普段MySQLばかり使っていたので、基本的なコマンドがわからない・・・。

```
\l					データベースの一覧
\d					テーブル一覧
\d テーブル名		  テーブルの項目(フィールド)確認
\i sqlファイル名	  SQL(スクリプト)ファイルの実行
\q					psqll切断
```

とりあえず最小限。
python manage.py runserver でサーバーが起動しないときの対処法

#runserver でエラーが発生する
プロジェクトを作ってすぐに

```
python manage.py runserver
```
を実行したのに！
設定とかコード弄ってないのに！
エラーが発生した！
そんなときのための対処法

#アカウント名を疑う
PCのアカウント名に日本語などの2byte文字が含まれている場合、エラーが発生する
この場合、既存のアカウントの名前を変更する方法はない
新規にアカウントを作成し、新規アカウントで実行する

#PC名を疑う
アカウント名同様、PC名に2byte文字が使われている場合、エラーが発生する
コントロールパネル > システムとセキュリティ > システム > 設定の変更 > コンピュータ名 > 変更 から変更することができる（要再起動）

#ポート番号の問題

```
python manage.py runserver
```
を実行すると、デフォルトでは port:8000 を使って起動しようとする
すでに port:8000 が使われていて起動できない場合、使われていないポート番号を指定してやることで起動できる

```
// port:8080 を指定した場合
python manage.py runserver 8080
```
Cisco Calalystスイッチの系統図

# Catalystスイッチの系統図

EOL機器をリプレイスする際の参考になればと思います。
太字はダウンリンクがGigabitEthernet、細字はFastEthernetです。
仕事上見た事ある物をピックアップしているので、たくさん漏れているかも。

## L3スイッチ
| 3世代前 | 2世代前 | 1世代前 | 最新 |
|:-:|:-:|:-:|:-:|
|**Catalyst3550-12**|**Catalyst3750G**|**Catalyst3750X**|**Catalyst3850**|
||**Catalyst3560G**|**Catalyst3560X**|**Catalyst3650**|
|Catalyst3550(Other)|Catalyst3750|Catalyst3750V2|**Catalyst3650**|
|   |Catalyst3560|Catalyst3560V2|**Catalyst3650**|

## L2スイッチ
| 3世代前 | 2世代前 | 1世代前 | 最新 |
|:-:|:-:|:-:|:-:|
|Catalyst2950|Catalyst2960||Catalyst2960+|
||**Catalyst2960G**|**Catalyst2960S**|**Catalyst2960X**|
mocha × TeamCity インテグレーション 〜テスト結果、カバレッジをTeamCity に表示する〜

TeamCity ではnode.js のテストフレームワークであるmocha をデフォルトではサポートしていません。

そのためNode.js のテストをTeamCity 上でCIするためにはnode.js のパッケージをインストールする必要があります。

ここではそのモジュールと使い方を解説します。

## package 名
* mocha-teamcity-reporter -> テスト結果の表示
* mocha-teamcity-cov-reporter -> テストカバレッジの表示

## インストール
テスト対象となるプロジェクトのpackage.json に以下を追加します。

```
{  
  "devDependencies": {  
    "mocha-teamcity-reporter": ">=0.0.1",
    "mocha-teamcity-cov-reporter": ">=0.0.1"  
  }  
}
```

## テストの定義
### テスト対象プロジェクト
テスト対象となるプロジェクトのpackage.json にテストを定義しておくと良いです。

```
{
  "scripts": {
    "test-teamcity": "mocha --recursive ./src/test --reporter mocha-teamcity-cov-reporter --reporter mocha-teamcity-reporter"
  }
}
```

### TeamCity
`Runner type`を`Node.js NPM`にして以下を追加します。
TeamCity でnpm を扱うためには[過去のQiita](http://qiita.com/AHA_oretama/items/acc535d3bdc313816a59)を参照してください。

```
run test-teamcity
```

## TeacmCity での表示
### テスト結果
成功、無視、エラーをまとめて見ることができます。
この例ではありませんが、エラーがあればエラーのテストも見ることができます。
<img width="747" alt="スクリーンショット 2016-07-25 22.22.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/110216/993fdfb5-b379-e28b-21a5-ef07a9d76fe6.png">

### カバレッジ
カバレッジについても継続して記録されるようになります。
テストの指標を継続して見られるので非常に役に立ちます。

<img width="1139" alt="スクリーンショット 2016-07-25 22.24.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/110216/44d9f02f-385d-4d9f-3556-98a17c0dd356.png">