OmniAICreator/Qiita-1.07M huggingface dataset:
v1.0 → v2.0（＠2015年4月30日有効期限終了）当時を思い出す用メモ

#前おき
【Facebook】Graph API アップグレードのお知らせ（8月8日まで）
http://qiita.com/umeume66/items/a2e880abc8fee8dd706a
を書いてから、
『そーいや、v1.0 から v2.0 に上がった時、どーゆー対応をしたっけ？』と、
急に気になったので Qiita にも当時のメモをコピー。
（なぜちゃんと記事にしておかなかったんだろう…）

当時はたくさんの Facebookページをがっさー！書き直しましたが、
それに比べれば今回の「v2.0 有効期限終了対応」は
ツールもあるし、特に大騒ぎするようなもんではなさそう。

いつか v3.0 に上がる時には、またいろいろ書き換えるのかな？
　
　
**※以下は 2015年5月15日 に社内向けに投稿した記事です。（※一部抜粋）**

---
##[Facebook] APIバージョンアップ（7月末に移行期間終了）

以前から「2015年4月30日終了」とアナウンスされていたので、もうとっくに過ぎてますが…。
（運用中のページは昨年11月頃からほぼ対応済み。）
v1.0 から v2.0 への対応をしていないページもまだ問題なく動作しているので、調べてみたら
「最短でも90日間の移行期間がある」ようです。
7月末には移行期間が終了しますので、お早めにご確認ください！



###バージョンアップ対象となるのは、主に以下のものです。

- 「いいね！」ボタン
- Facebookページ　※ほぼ全て対象（スクロールバーを消す際に「FB.init()」を使用しているため）
- Facebookアプリ


###対応方法

1. JavaScript SDK のパスを変更　「all.js」→「sdk.js」
2. 「FB.init()」のバージョンを変更。以前はなかった「version : 'v2.0',」を追加*

※最新版は「v2.3」のようですが、「v2.x」にアップグレードすれば大丈夫なので、
「v2.0」で統一しておいても問題ないかと思います。（最新版を推奨）
（なお、この「v2.0」は最短で 2016年4月30日に有効期限が切れる予定です。）
　


---
###参照
※すべてFacebook公式の情報。
・「いいね！」ボタン for Web（英語）
https://developers.facebook.com/docs/plugins/like-button
※こちらからコードを再生成してください。
　　
・Facebookプラットフォームアップグレードガイド（日本語）
https://developers.facebook.com/docs/apps/upgrading?locale=ja_JP#v1tov2
・Graph API Version（v2.3）（英語）
https://developers.facebook.com/docs/javascript/reference/FB.init/
・What to Expect on April 30 - Upgrading to Graph API and the New Login（英語公式）
https://developers.facebook.com/blog/post/2015/04/28/april-30-migration/?pnref=story
・Graph API v1 Deprecation（英語）
https://developers.facebook.com/docs/apps/api-v1-deprecation
　　
※スマホ向け
・iOS向けSDKのアップグレード手順（英語）
https://developers.facebook.com/docs/ios/upgrading-3.x
・Android向けSDKのアップグレード手順（英語）
https://developers.facebook.com/docs/android/upgrading-3.x
UISearchBar/UISearchControllerの実装で困った時見直したいところ

# UISearchBarで、確定前の文字入力を検知する

```
- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    // 遅延させる
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
       // なにかしらの処理
     } afterDelay:0.1];

    return YES;
}
```

ここでの`replacementText`には入力した文字だけしか取れないし、`searchBar.text`をしても、入力した文字が含まれてない状態の検索文字しか取れない。
`searchBar.text`で入力した文字も含めて検索文字を撮りたい場合は、一度`return YES`を通さないとダメ。
そのため、遅延させる。

# UISearchBarのUITextField

UISearchBarのUITextFieldは、以下で取れる。

```
UITextField *textField = [self.searchBar valueForKey:@"_searchField"];
```

# UISearchController
- `UISearchController`を使う`viewDidLoad`などで、`self.definesPresentationContext = YES`しないと、画面がずれる。
- `viewWillDisappear`などで`self.definesPresentationContext = NO`しないと、遷移先の画面で`UISearchController`が使えない。
- `UISearchController`の`UISearchBar`のキャンセルボタンは、タップするとUISearchBar内のテキストが消える。
    - `- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar`で、`searchBar.text = @"xxxxx"`をしても、`UISearchBar`に反映されない。
    - オブザーバーで`UISearchBar`の`text`プロパティの変化を見ると、`xxxxx`が`UISearchBar`にセットされてることを確認できた。
        - けど、文字列が表示されない。。。
        - 同じように困っていた人
            - http://stackoverflow.com/questions/21762859/uisearchbar-how-to-prevent-cancel-button-from-clearing-text
- 上の解決策として`UISearchBar`がデフォルトで出してくるキャンセルボタンを非表示にしようと思ったら、`searchBar.showsCancelButton = NO`しても、`-(void)setShowsCancelButton:(BOOL)showsCancelButton`で`[searchBar showsCancelButton:NO];`しても出てくる。。
    - キャンセルボタンをずっと非表示にする時は、`-(void)setShowsCancelButton:(BOOL)showsCancelButton`で何もしない、`UISearchBar`を継承したサブクラスをつくって使う。
    - http://stackoverflow.com/questions/30020853/uisearchcontroller-uisearchbar-subclass

# 参考
http://s-prism3.seesaa.net/category/23766759-1.html
【three.jsのヘルパー解説集】 ⑥DirectionalLightHelperの使い方

## DirectionalLightHelper
継承：THREE.Line
解説：平行光源(DirectionalLight)を可視化してくれるヘルパーです。平行光源の向きがどちらに向いているかを確認できます。__簡素なラインだけで構成されているため、ひと目で向きが解り難いことが有ります。__[ArrowHelper](http://qiita.com/sawa-zen/items/c31a5a07e8bb6e6a6fa0)を使用したほうが分かりやすいかもしれません。

### デモ

![Untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/42248/e42b6216-ec71-b890-979f-2ab7e6ed027d.gif)

- [jsdo.itで確認する。](http://jsdo.it/sawa-zen/U4W8)
- [ソースコードを確認する。](https://github.com/sawa-zen/three_js_demo/blob/master/helper/src/helper/DirectionalLightHelper.ts)　

### 実装例

```js:javascript
var directionalLight = new THREE.DirectionalLight(0xffff00, 0.5);
directionalLight.position.set(1, 1, 0);
scene.add(directionalLight);

var directionalLightHelper = new THREE.DirectionalLightHelper(directionalLight, 2);
directionalLight.position.set(0, 0, 0);
scnene.add(directionalLightHelper);
```

DirectionalLightHelper(light, size)

- light：ヘルパーを表示させたいDirectionalLightオブジェクト
- size：末尾についた四角形の大きさ
【Android】【SQLite】アプリのDBデータをローカルに持って来る

# やりたいこと
開発中のアプリの中にあるDBをビュワーで解析したい。
Android Device Monitorだと
パーミッションの関係でdataフォルダの中身が見れなかったりする。

# コマンドラインから権限変更してpullする
コマンドラインを開いて

```
adb shell "run-as ${パッケージ名} chmod 666 /data/data/${パッケージ名}/databases/${db名}"
adb pull /data/data/${パッケージ名}/databases/${db名} C:\${local}
```
run-as ${パッケージ名}でアプリの権限者としてコマンドを実行できる。
あとはdbファイルの権限を変えて、pullしてくればOK。

# 追記
Realmバージョン。

```
adb shell run-as ${パッケージ名} cp /data/data/${パッケージ名}/files/${realmファイル名}.realm /sdcard/Download/
adb pull /sdcard/Download/${realmファイル名}.realm ./
```
basic認証、digest認証のハッシュ生成ツール

↓のリンク先で生成できる。
https://tgws.plus/app/digest/

入力欄に値が残るのでセキュリティ的によろしくないかも。
テスト用などに利用するといいと思います。

コマンドで生成する場合は↓
パスワードを聞かれるので２回入力
```
htdigest -c .htdigest(ファイルの生成場所) Realm(省略可) User
```
RubyのHashをStrong Parametersで検証したい時

Hashに対して、permitメソッドは使えない・・・

```rb
pry(main)> params = {id: 1, value: 2}
=> {:id=>1, :value=>2}
pry(main)> params.permit(:value)
NoMethodError: undefined method `permit' for {:id=>1, :value=>2}:Hash
```

なので、通常のHashに対して、permitなどのStrong Parametersのメソッドを使いたい時は
以下のように宣言することで使える。

```rb
params = ActionController::Parameters.new({id: 1, value: 2})
```

実行結果

```rb
pry(main)> params = ActionController::Parameters.new({id: 1, value: 2})
=> {"id"=>1, "value"=>2}
pry(main)> params.permit(:value)
Unpermitted parameter: id
=> {"value"=>2}
```


クラスで実装した時の例

```rb
class SampleClass
  def initialize(params)
    @params = ActionController::Parameters.new(params)
  end

  def value_params
    @params.permit(:value)
  end
end

params = {id: 1, value: 2}
sample = SampleClass.new(params)
p sample.value_params
```


どうしてもpermit使いたいって時は便利かも？
sqlalchemyを使ってDBのテーブル検索をしてpandasのDataflameを作成する

##RDBのテーブルを検索してpandasのdataframeを作成する
　pandasにはRDBに対してsqlクエリーを実行するメソッドが用意されている。これを使ってストアドプロシージャを実行し、その実行結果からpandasのdataframeを作成。pandasを使ったデータ集計やらその後のmatplotlibを使ったグラフ描画などに展開することが可能。

```py3:make_pandas_df.py

    import sqlalchemy
    import pandas as pd

    q = 1
    ym = 201604

    CONNECT_INFO = 'mssql+pyodbc://hogehoge'
    engine = sqlalchemy.create_engine(CONNECT_INFO, encoding='utf-8')

    #データフレーム作成
    query = 'EXEC dbo.sp_rtrv4pandas @q = {0},@ym = {1}'.format(qq,ym)
    df = pd.read_sql_query(query, engine,index_col =['prd'])

    print(df)
```

1.上記における接続DBはSQLServerを想定。SQLServerの場合、ストアドの実行はEXEC文で行う
2.pandasのread_sql_queryメソッドでSQLを実行する
3.ストアドプロシージャの引数は、上記のようにpythonの変数埋め込み記述(format)で指定
4.ストアドプロシージャの結果はdfにセット、これがpandasのdataframeオブジェクトとなる
.htaccessのリダイレクトで、特定ディレクトリ・ページをリダイレクトさせない(除外する)方法

# .htaccessのリダイレクトで、特定ディレクトリ・ページをリダイレクトさせない(除外する)方法
ディレクトリ/hoge/と画像・CSSを除く,全ページをリダイレクトする。
WordPressなどの管理画面のみリダイレクトしたくない場合におすすめ。
特定のディレクトリ・ページを閲覧可能にするにはCSSや画像やJSをリダイレクトしないことがポイント。CSSと画像とJSをリダイレクト対象から除外している。
リダイレクト先が同じサイト内のページの場合は、そのページも除外すること。(意外と忘れるので注意！)

以下を.htaccessに記述してサイトに設置すると、配下ディレクトリ全てに対して有効になる。
最後の行 R=301は恒久的なサイト移転、 R=302は一時的なサイト移転
UNIX・Linux系のサーバの場合、改行コードをLFとして.htaccessを保存すること

```apache:.htaccess
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !(^/hoge/)
RewriteCond %{REQUEST_URI} !\.css$
RewriteCond %{REQUEST_URI} !\.js$
RewriteCond %{REQUEST_URI} !\.jpg$
RewriteCond %{REQUEST_URI} !\.gif$
RewriteCond %{REQUEST_URI} !\.png$
RewriteRule /* http://リダイレクト先 [R=301,L]
```
Vagrant ゲストOSのWebサーバーにホスト名でアクセスする(Windows10)

###Vagrantを使ってみた
会社のパソコンが一台余っていたので新しい開発環境として使うことにした。
それを機にWeb系の開発環境をXAMPPからVagrant+VirtualBoxに変えてみた。
とりあえず、[ドットインストール](http://dotinstall.com/lessons/basic_localdev_win)を参考にVagrant、VirtualBox、puttyをインストールして仮想化環境を構築。
ゲストOSにはCentOSを選択、そこにApache、PHP、MySQLをインストールし、ホストOS(Win10)のブラウザからゲストOSのWebサーバーにアクセスするところまでできた。

インストール手順は上の講座や「vagrant php」「vagrant windows」などで検索してヒットしたサイトを参考にした。

###Vagrantについて
https://www.vagrantup.com/
Vagrantは「仮想化環境構築ツール」の一つ。コマンドを実行することで仮想化環境の作成、起動ができるようになる。
###Vagrantfile
VagrantにはVagrantfileというファイルがあり、ここで仮想化環境起動時の初期設定をすることができる。
例えば
`config.vm.network "private_network", ip: "192.168.33.10"`
と書くとゲストOSのIPアドレスが「192.168.33.10」になり、ブラウザで「http\://192.168.33.10」と入力すればゲストOSのWebサーバーにアクセスできる。

###ゲストOSにホスト名を定義する
ゲストOSにホスト名を定義するにはVagrantfileに以下の定義をする。
`config.vm.hostname = "vagrant.local"`
これでゲストOS内ではホスト名でアクセスできるようになるが、ホストOSからアクセスできるようにするにはホストOSのhostsに「vagrant.local 192.168.33.10」を追加する必要がある。
おそらく直接hostsをメモ帳などで修正しても問題ないと思うが、いいやり方は無いかと「vagrant hosts」で検索すると、ゲストOS起動時にホストOSのhostsを書き換えるプラグインがあることが分かった。
http://qiita.com/tag1216/items/0d10f67cb55651740df4
今回、上のページにあったvagrant-hostsupdaterとvagrant-hostmanagerを試してみた。
使い方は上に書いてある通りなんだけど、Windows10環境で実行したところhostsを更新するところで引っかかったのでその辺についてメモを残しておく。

####vagrant-hostsupdater
https://github.com/cogitatio/vagrant-hostsupdater
プラグインをインストールする。
`vagrant plugin install vagrant-hostsupdater`
あとはそのままvagrantを起動するだけ。
ただし、Windows10で試したところ、C:\Windows\system32\drivers\etc\hosts に書き込み権限がなく、Permission deniedエラーになってしまった。
これはあらかじめvagrantを起動するコマンドプロンプトを管理者として実行しておくと回避できる。
ただし、コマンドプロンプトを管理者として実行するとカレントディレクトリがC:\Windows\system32になるのでvagrantの起動用ディレクトリに移動する必要がある。
`vagrant halt`
で終了するとhostsがもとにもどる。
	
####vagrant-hostmanager
https://github.com/devopsgroup-io/vagrant-hostmanager
プラグインをインストールする。
`vagrant plugin install vagrant-hostmanager`
プラグインをインストール後、Vagrantfileに以下を追加する。
`config.hostmanager.enabled = true`
`config.hostmanager.manage_host = true`
上はゲストOSのhostsを更新し、下はホストOSのhostsを更新する。
こちらはPermission deniedエラーは出ないがユーザーアカウント制御の確認ダイアログ(「このアプリがPCに変更を加えることを許可しますか？」というメッセージ)が表示されるので、許可するとhostsが更新される。
`vagrant destroy`
でhostsが元に戻る。

###余談
vagrant-hostsupdaterプラグインをインストールするときにエラーが出てインストールできない、
という問題があった。エラーメッセージを手掛かりにググってみたところstackoverflowの書き込みを発見。

以下超意訳：
>質問者：vagrant-hostsupdaterをインストールしようとするとエラーが出るんだけど？
>(エラーメッセージやOSバージョンを細かく記述)
>回答者１:スペルミスじゃない？vagrant-hostsupdaterじゃなくてvagrant-hostupdaterになってるよ。
>質問者：あ、ホントだ！直したら動いたよ。ありがとう！
>回答者１：いえいえ :blush: 
>回答者２：同じエラー出て調べてたんだけど、俺もスペルミスだったよ！
>質問者：よかったよかった :blush: 

「あー、スペルミスとかあるあるだなぁ」と思って自分のPCのエラーが出ている画面を見てみると、

・・・自分もスペルミスが原因だった。
Unity3D Shader


```shader:sample.shader
Shader "EXample/jDiffuse Texture" {
 Properties {
   _MainTex ("Texture",2D) = "white" {}
 }
 SubShader {
  Tags {"RenderType" = "Opaque"}
  CGPROGRAM
  #pragma surface surf Lambert
  struct Input {
   float2 uv_MainTex;
  };
  sampler2D _MainTex;
  void surf (Input IN, inout SurfaceOutput o) {
    o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
  }
  ENDCG
 }
 Fallback "Diffuse"
}
```

下一次，将对上面代码中的几个部分分别做出说明：Properties，Tags，SubShader的结构，Input结构体，surf函数等。

理解Shader代码
接下来，我们将概要地解释Shader中各个部分的作用，进一步理解Shader。

Properties
由上面的代码可以看出，Shader的第一行指明了Shader的名字：“Example/Diffuse Texture”。紧跟着就是Shader的第一个重要组成部分，Properties{ }。我们可以在Properties里面定义一系列属性，这些属性被下面的SubShader所共享，它们可以让你在Unity的面板里直观地控制Shader变量，影响渲染结果。

这些属性的定义格式如下：

[plain] view plain copy print?在CODE上查看代码片派生到我的代码片
_Name ( "Displayed Name", type ) = default value {options}
gulp で shift_jis 環境を管理する

sublime も gulp も shift_jis に弱い。というか対応してない？
それでも shift_jis でやらなきゃいけない時があるもので gulp の備忘録。

## ファイルのエンコード設定
HTMLやCSSの charset 記述は shift_jis にしておく。
&lt;meta charset="shift_jis"&gt;
とか
@charset "shift_jis";
とか

だけどファイル自体のエンコードは utf-8。
（shift_jis にするとうまくコンパイルできなかった）

※エンコード記述も gulp のタスクに組み込んじゃうこともできる。
それに関しては誰かがやり方を書いてくれてるので探そう！
⇒　[gulpで処理結果をShift_JISに変換して出力する](https://www.anothersky.pw/2015/02/gulp_convert_encoding.html)


## プラグイン：gulp-convert-encoding
utf8 ⇒ shift_jis に変換してコンパイルしてくれるプラグイン。
[gulp-convert-encoding](https://www.npmjs.com/package/gulp-convert-encoding)

これをHTML（jade, ejs ...etc.）のタスク内にかましてあげる。

```gulpfile.js
var convertEncoding = require('gulp-convert-encoding');

// html
gulp.task('html', function() {
  return gulp.src(paths.html)
  // その他のタスクいろいろ
  .pipe(convertEncoding({to: "shift_jis"}))
  .pipe(gulp.dest(paths.dist));
});

// ejs
gulp.task('ejs', function () {
  return gulp.src(paths.ejs)
  // その他のタスクいろいろ
  .pipe(ejs(json, {ext: '.html'}))
  .pipe(convertEncoding({to: "shift_jis"}))
  .pipe(gulp.dest(paths.dist));
});

// jade
gulp.task('jade', function() {
  return gulp.src(paths.jade)
  // その他のタスクいろいろ
  .pipe(jade({
    pretty: true,
    basedir: './src/_jade/',
    doctype: 'html'
  }))
  .pipe(convertEncoding({to: "shift_jis"}))
  .pipe(gulp.dest(paths.dist));
});
```

SCSS も同じように。

```gulpfile.js
gulp.task('sass', function() {
  return gulp.src(paths.scss)
  // その他のタスクいろいろ
  .pipe(sass())
  .pipe(convertEncoding({to: "shift_jis"}))
  .pipe(gulp.dest(paths.dist))
});
```
xargs が思いのほか危険だった

#事件
`find /path/to/dir/ -type f -mtime +13 | xargs rm`
こんなコマンドを cron に仕込んで、一定日数以上経過した古いファイルを削除していました。
今回この処理がコケていたので原因を調べてみると……

find で発見したファイルに半角スペースが含まれていました。
"/path/to/dir/hogehoge huga.txt" というファイルがおりました。
`rm /path/to/dir/hogehoge huga.txt`
というコマンドを実行するとどうなるかというと、/path/to/dir/hogehoge と huga.txt をそれぞれ削除しようと試みます。
意図としては `rm "/path/to/dir/hogehoge huga.txt"` ということがしたいのですが、たまたま名前が似ている別のファイルが処理対象になってしまいます。


# 試してみる
ファイルを4つ用意。

```
[user@host workdir]$ ll
合計 0
-rw-rw-r-- 1 user axis 0  7月 13 16:29 2016 dump_afjspace importantfile.txt
-rw-rw-r-- 1 user axis 0  7月 13 16:28 2016 dump_fjai4fao43j9a4.txt
-rw-rw-r-- 1 user axis 0  7月 13 16:27 2016 importantfile.txt
-rw-rw-r-- 1 user axis 0  7月 13 16:27 2016 textfile.txt
```

名前が dump_ で始まるファイルがどれか一覧して……

```
[user@host workdir]$ find ./ -name "dump_*"
./dump_afjspace importantfile.txt
./dump_fjai4fao43j9a4.txt
```

じゃあそれを rm で消しますね。エンター押下。

```
[user@host workdir]$ find ./ -name "dump_*" | xargs rm
rm: cannot remove `./dump_afjspace': そのようなファイルやディレクトリはありません
```

え…？

```
[user@host workdir]$ ll
合計 0
-rw-rw-r-- 1 user axis 0  7月 13 16:29 2016 dump_afjspace importantfile.txt
-rw-rw-r-- 1 user axis 0  7月 13 16:27 2016 textfile.txt
```

うわぁぁ...... `importantfile.txt` が消えてる。

# 対策

find の -exec では上記の現象は起こりません。

```
[user@host workdir]$ find ./ -name "dump_*" -exec rm {} \;

[user@host workdir]$ ll
合計 0
-rw-rw-r-- 1 user axis 0  7月 13 16:32 2016 importantfile.txt
-rw-rw-r-- 1 user axis 0  7月 13 16:27 2016 textfile.txt
```

また、 find のオプションに -print0 を付けてファイル列挙時の区切り文字を半角スペースではなく \0 で出力し、 xargs 側でもオプション -0 によって区切り文字を \0 と認識させて拾うことで、問題を回避できます。これは若干めんどくさい。

```
[user@host workdir]$ find ./ -name "dump_*" -print0
./dump_afjspace important.txt./dump_fjai4fao43j9a4.txt[user@host workdir]$ 

[user@host workdir]$ find ./ -name "dump_*" -print0 | xargs -0 rm
```
【Trainer's Recipe】はじめてのHTML / CSSの学習方法

このEntryは、<a href="http://gsacademy.tokyo/" target="_blank" style="text-decoration: none;">G's ACADEMY TOKYO</a>のトレーナー/チューターによる投稿記事です。
授業の中で出たちょっとした質問や疑問、トレーナーが関心のある新技術等を脈絡なく綴っていきます。


![htmlCss.png](https://qiita-image-store.s3.amazonaws.com/0/104065/5719e43c-5b71-8820-1b12-f6460f6734f5.png)

#HTML / CSSの学習方法#
ジーズアカデミーチューターの木崎です。
「Webデザイナー・エンジニアになりたいけど、HTML/CSSをどう勉強していいかわからない」
こんな悩み、ありませんか？今回は、そんな悩みの解決に少しでも役立つことができればと、
私が実践したHTML / CSSの学習方法を共有いたします。

正直申し上げて、HTM/CSSのスキルを身につけるために、今やるべきことはこの記事を読まずに
どんな簡単なものでもいいのでWebサイトを早速作り始めることです。
とはいえ！どうやって学習したら良いかというのも一読の価値はあるかと思いますので、
ぜひ、ご一読ください。

##独学##
![dokugaku.jpg](https://qiita-image-store.s3.amazonaws.com/0/104065/464adbc0-85a4-6d10-969a-83a4a7b76049.jpeg)


スキルを身につける上での基本と位置付けています。
まずこれをやらないとなにもはじまらないなーと。

幸い、プログラミング教育熱が高まる昨今、無料から始められて
十分に学ぶことができるWebサービスがたくさんあるので大いに活用しました。

独学を進めるポイントとしては、

- 1つのセクションが短い
- 実際に手を動かして動くものを作ることができる
- 日にちを明けて学び直す
これを基に実践したらあるていど身につけられた実感があります。

##誰かに教えてもらう、教える##
独学でもある程度は知識をつけることができますが、どこかでつまずいたりして
学習の効率が悪くなるタイミングが必ずきます。
そんな時、初心者にとっては悩ましい問題でも、経験者であれば数秒で解決できることが多々あるので、

また、これと同じぐらい大事なのが自分が学習したことを発表することです。
発表と言うと何十人の前で話すという大事になりそうなので、共有といったほうがよいでしょうか。
いま自分はこうゆうことをやっている、ここでつまずいている、手応えを感じている、
なんでも良いので話しているうちにテンションが上がってきて、楽しくなります。

できれば同じくHTML/CSSなどのWeb関係を学んでいる人に共有するのがオススメです。
相手も同じことで悩んでいたり、実はその問題を既に解決していたりするので、
いまの自分の問題解決に直結することがたくさんあります。

さらにもっと欲を言えば、そういったコミュニケーションを1対1の関係で行うのでなく
n対nで行えるコミュニティーに属すこと、私自身そういう環境に身を置くことによって、
それまで経験することのなかった成長の実感を得ることができました。

##寝る##
![sleep.jpg](https://qiita-image-store.s3.amazonaws.com/0/104065/3c0d6365-437b-df90-25b4-4ebf8445d180.jpeg)

本気です。寝る。これ、超重要です。あなどってはいけません。
生物学的な睡眠摂取という意味でもそうなんですけど、もうひとつ、時間を置く。
それ、重要です。

その時には理解できなくても、時間をおいて再度脳内にインプットしなおせば、
「あー、なるほどそういうことね！」という体験、少なくないです。

「理解できたようなできないような」そんなとき、一度オフトゥン老師を訪ねてみましょう。


以上、なんのことはないHTM/CSSやWebに限らず、
なにかしらのスキルを身につけるためには共通することでした。

まー、経験した身としてましては、手を動かすことが１番最初ファーストにやることなのではないかなと。
（あるいは、手を動かすことができる環境を整える）
まずは、そこから全てが始まるかなと思います。


というところで、ご案内は以上でございます。
ありがとうございました！
Jenkinsのインストールされてるplugin listを出す

Docker buildする時点でplugin installするために使う。

スクリプトコンソールに貼る

~~~
Jenkins.instance.pluginManager.plugins.each{
  plugin -> 
    println ("${plugin.getShortName()}:${plugin.getVersion()}")
}
~~~

result

~~~
cloudbees-folder:5.12
mailer:1.17
google-login:1.2.1
icon-shim:2.0.3
matrix-auth:1.4
junit:1.15
antisamy-markup-formatter:1.5
pam-auth:1.3
script-security:1.21
matrix-project:1.7.1
windows-slaves:1.1
ldap:1.12
token-macro:1.12.1
external-monitor-job:1.5
build-timeout:1.17
credentials:2.1.4
structs:1.2
workflow-step-api:2.2
plain-credentials:1.2
credentials-binding:1.8
timestamper:1.8.4
ws-cleanup:0.29
ant:1.3
gradle:1.24
jquery-detached:1.2.1
workflow-api:2.1
workflow-support:2.2
workflow-job:2.3
pipeline-rest-api:1.5
handlebars:1.1.1
momentjs:1.1.1
pipeline-stage-view:1.5
pipeline-build-step:2.2
ace-editor:1.1
workflow-scm-step:2.2
scm-api:1.2
workflow-cps:2.9
ssh-credentials:1.12
git-client:1.19.6
git-server:1.7
workflow-cps-global-lib:2.1
branch-api:1.10
workflow-multibranch:2.8
durable-task:1.11
workflow-durable-task-step:2.3
pipeline-input-step:2.0
pipeline-stage-step:2.1
workflow-basic-steps:2.0
workflow-aggregator:2.2
github-api:1.76
git:2.5.2
github:1.19.2
github-branch-source:1.8.1
github-organization-folder:1.3
mapdb-api:1.0.9.0
subversion:2.6
ssh-slaves:1.11
email-ext:2.44
Result: [Plugin:cloudbees-folder, Plugin:mailer, Plugin:google-login, Plugin:icon-shim, Plugin:matrix-auth, Plugin:junit, Plugin:antisamy-markup-formatter, Plugin:pam-auth, Plugin:script-security, Plugin:matrix-project, Plugin:windows-slaves, Plugin:ldap, Plugin:token-macro, Plugin:external-monitor-job, Plugin:build-timeout, Plugin:credentials, Plugin:structs, Plugin:workflow-step-api, Plugin:plain-credentials, Plugin:credentials-binding, Plugin:timestamper, Plugin:ws-cleanup, Plugin:ant, Plugin:gradle, Plugin:jquery-detached, Plugin:workflow-api, Plugin:workflow-support, Plugin:workflow-job, Plugin:pipeline-rest-api, Plugin:handlebars, Plugin:momentjs, Plugin:pipeline-stage-view, Plugin:pipeline-build-step, Plugin:ace-editor, Plugin:workflow-scm-step, Plugin:scm-api, Plugin:workflow-cps, Plugin:ssh-credentials, Plugin:git-client, Plugin:git-server, Plugin:workflow-cps-global-lib, Plugin:branch-api, Plugin:workflow-multibranch, Plugin:durable-task, Plugin:workflow-durable-task-step, Plugin:pipeline-input-step, Plugin:pipeline-stage-step, Plugin:workflow-basic-steps, Plugin:workflow-aggregator, Plugin:github-api, Plugin:git, Plugin:github, Plugin:github-branch-source, Plugin:github-organization-folder, Plugin:mapdb-api, Plugin:subversion, Plugin:ssh-slaves, Plugin:email-ext]
~~~
【three.jsのヘルパー解説集】 ⑤CameraHelperの使い方

## CameraHelper
継承：THREE.Line
解説：カメラを可視化してくれるヘルパーです。画角、アスペクト比、ニアークリップ、ファークリップ、アップベクターがひと目で確認できます。__オブジェクトがカメラの射程内にいるかを確認する際や、カメラのアニメーションをする際に活用できます。__

### デモ

![Untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/42248/845a48d9-4d2a-5cfe-5eb0-ff1ad86b9ec1.gif)

- [jsdo.itで確認する。](http://jsdo.it/sawa-zen/YLmI)
- [ソースコードを確認する。](https://github.com/sawa-zen/three_js_demo/blob/master/helper/src/helper/CameraHelper.ts)　

### 実装例

```js:javascript
var camera = new THREE.PerspectiveCamera(20, 16 / 9, 1, 3);
var cameraHelper = new THREE.CameraHelper(camera);
scene.add(cameraHelper);
```

CameraHelper(camera)

- camera：ヘルパーを表示させたいカメラオブジェクト
Mattermost導入手順

SlackクローンのMattermostをAmazonLinuxにインストールして使用する手順。

### mysql5.6のインストール
最新のMattermostはmysql5.6以上でないと動作しない。
バージョン5.6をインストールするためリポジトリを追加。

```
wget http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
sudo yum install mysql-community-release-el6-5.noarch.rpm
```

正しくリポジトリが追加されたかを確認。
「MySQL 5.6 Community Server」が表示されていれば成功。

```
yum repolist
```

mysqlのインストール。

```
sudo yum install mysql-server
sudo /etc/init.d/mysqld start
```

Mattermost用のユーザーとスキーマを作成。

```
mysql -uroot
mysql > CREATE DATABASE mattermost;
mysql > GRANT ALL PRIVILEGES ON mattermost.* TO 'mattermost'@'localhost' IDENTIFIED BY 'mattermost' WITH GRANT OPTION;
```

### MatterMostのインストール

mattermost実行ユーザーを作成。

```
sudo adduser mattermost
```

eMattermostの公式サイトでダウンロードできるバージョンを確認。
http://www.mattermost.org/download/

ダウンロード及び展開、配置。

```
wget https://releases.mattermost.com/3.1.0/mattermost-team-3.1.0-linux-amd64.tar.gz
tar zxvf mattermost-team-3.1.0-linux-amd64.tar.gz
sudo mv mattermost /opt/mattermost
sudo mkdir -p /opt/mattermost/data
sudo chown -R mattermost:mattermost /opt/mattermost
sudo chmod -R g+w /opt/mattermost
```

下記のファイルを編集し、Mattermostの設定を変更。
/opt/mattermost/config/config.json
DataSourceの項目を下記のように編集。

```
"DataSource": "mattermost:mattermost@tcp(localhost:3306)/mattermost?charset=utf8mb4,utf8",
```

※デフォルトだとDockerを使用する設定になっているので書き換える。

### nginxのインストール及び設定

nginxのインストール及び起動設定。

```
sudo yum install nginx
sudo chkconfig nginx on
sudo /etc/init.d/nginx start
```

Mattermostの設定を追加。
下記のファイルを作成する。
/etc/nginx/conf.d/mattermost.conf

```
  server {
    location / {
       client_max_body_size 50M;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";
       proxy_set_header Host $http_host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_set_header X-Frame-Options SAMEORIGIN;
       proxy_pass http://localhost:8065;
    }
  }
```

※nginx.confにserverの設定が記述されていたらコメントアウトしておく

### Mattermost自動起動設定

Mattermost起動スクリプトを下記場所に作成。
/opt/mattermost/bin/mattermost.sh

```
#!/bin/sh
# chkconfig:   - 85 15
# description:  mattermost

SERVICE=mattermost
start() {
    cd /opt/mattermost/bin
    sudo -u mattermost ./platform &
    echo "service $SERVICE [start]"
}
stop() {
    pkill platform
    echo "service $SERVICE [stop]"
}
status() {
   PID=`pgrep platform | wc -l`
   if [ $PID -eq 0 ]; then
       echo "$SERVICE stop"
   else
       echo "running $SERVICE ..."
   fi
}

case $1 in
start)
       start
       ;;
stop)
       stop
       ;;
status)
       status
       ;;
restart)
       stop
       start
       ;;
*)
       echo "Usage: $SERVICE [start|stop|restart|status]"
       ;;
esac
exit 0
```

権限の修正及びシンボリックリンクの作成。

```
sudo chmod 755 /opt/mattermost/bin/mattermost.sh
sudo ln -s /opt/mattermost/bin/mattermost.sh /etc/init.d/mattermost
```

Mattermostの起動。

```
sudo /etc/init.d/mattermost start
```

これで「 http://ホスト名 」にアクセスするとMattermostが開く。
追加でSSLやドメインの設定を行うのであればnginxで設定する。
開発用ブラウザBlisk

開発用ブラウザBliskが発表されました。
スマホとPCの表示を同時に確認できるので便利ですねー。

エンジンはChoromeと同じ[Chromium](http://www.chromium.org/)を利用しているので表示などはChoromeと同じだと思います。
一つ不満なのはベーシック認証がまだ対応してないっぽいところですね。。

[Blisk](https://blisk.io/)
Django1.9でデプロイ環境を作るまでのメモ

Pythonで作った機械学習モデルをWEB上で使いたい、ツールをWEBブラウザで作りたいこと、APIにしたいことがあると思います。機械学習ならpythonなことが多いと思いますが、そのままモデルを使えるのでDjangoで作っています。検証用ならrunserverで立ち上げられるのですが、他の人に使ってもらうようにはデプロイする必要があると思いました。そこで、Djangoプロジェクトをデプロイするに当たって、ドキュメントが少ない中、苦戦しながらやたことをメモしておきます。


## 環境
* Ubuntu 14.04LTS
* Django 1.9.6


## 前提
既にDjangoのプロジェクト、アプリを作成している状態。（https://docs.djangoproject.com/en/1.9/intro/）
```$ manage.py runserver``` で動くことが確認され、デプロイしたい状況

## Apache 環境構築
Apache 2.4を入れます
http://apr.apache.org/download.cgi


Apacheインストールに必要なものをインストールします

### APR and APR-Util
http://qiita.com/boscoworks/items/dbe4eeeec4dd1ad36992
http://apr.apache.org/download.cgi
から最新のAPRとAPR-Utilをダウンロード

解凍

```
$ bzip2 -dc apr-util-1.5.4.tar.bz2 |tar xvf -
$ bzip2 -dc apr-1.5.2.tar.bz2 |tar xvf -
```

移動する

```
$ sudo mv apr-1.5.2 /httpd_source_tree_root/srclib/apr
$ sudo mv apr-util-1.5.4 /httpd_source_tree_root/srclib/apr-util
```

configure&make&install

```
$ cd /httpd_source_tree_root/srclib/apr
$ ./configure
$ make
$ sudo make install

$ cd ../apr-util
$ ./configure --with-apr=/usr/local/apr
$ make
$ sudo make install
```

### Apache インストール
ここから2.4の最新版をダウンロード
http://httpd.apache.org/download.cgi

解凍、インストール

```
$ cd path/to/apache/httpd/file
$ bzip2 -dc httpd-2.4.23.tar.gz2 |tar xvf -
$ cd httpd-2.4.23/
$ ./configure
$ make sudo make install
```

## mod wsgiのインストール

https://modwsgi.readthedocs.io/en/develop/user-guides/quick-installation-guide.html

以下からファイルダウンロード
https://github.com/GrahamDumpleton/mod_wsgi/releases

解凍してインストール

```
$ ./configure --with-apxs=/usr/local/apache2/bin/apxs
$ make
$ sudo make install
```

モジュール追加

cd /usr/local/apache2/conf/
内のhttpd.confを編集
LoadModuleが並んでるところに以下を追加

```
LoadModule wsgi_module modules/mod_wsgi.sohttps://docs.djangoproject.com/ja/1.9/howto/deployment/wsgi/modwsgi/
```

再起動

```
$ sudo /usr/local/apache2/bin/apachectl restart
```

動作確認

```
$ curl http://localhost/
<html><body><h1>It works!</h1></body></html>

```

## デプロイ設定

https://docs.djangoproject.com/ja/1.9/howto/deployment/wsgi/modwsgi/

httpd.confに以下の内容を追加

```
WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
WSGIPythonPath /path/to/mysite.com

<Directory /path/to/mysite.com/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
```

virtualenvを使っていたので、WSGIPythonPathにvirtualenvのsite-packageのパスをこのように追加

```
WSGIPythonPath /path/to/mysite.com:/path/to/your/venv/lib/python3.X/site-packages
```

Djangoで設定したstaticファイルを公開するには、また別途設定が必要。httpd.confに以下を追加

```
Alias /static/ /path/to/mysite.com/static/

<Directory /path/to/mysite.com/static>
Require all granted
</Directory>
```
再起動しなおせば、設定したurlでレスポンスが返るはずです。


## Apacheの開始、再起動、停止

```
# 開始
$ sudo /usr/local/apache2/bin/apachectl start
# 再起動
$ sudo /usr/local/apache2/bin/apachectl restart
# 終了
$ sudo /usr/local/apache2/bin/apachectl stop

```

## ログファイルのありか
```
/usr/local/apache2/logs/access_log
/usr/local/apache2/logs/error_log
```
Android ExoplayerでBASIC認証付きURLを再生

自分向けの備忘録
ManifestFetcherの引数UriDataSourceに対してBASIC認証ヘッダを付加したHttpDataSourceを渡すことで
BASIC認証付きのファイルの再生ができました

```java
private final ManifestFetcher<HlsPlaylist> playlistFetcher;

.......

HlsPlaylistParser parser = new HlsPlaylistParser();
HttpDataSource defaultHttpDataSource = new DefaultHttpDataSource(userAgent, null);

//BASIC認証をHttpDataSourceに追加
String credential = com.squareup.okhttp.Credentials.basic(BuildConfig.USERNAME, BuildConfig.PASSWORD);
defaultHttpDataSource.setRequestProperty("Authorization",credential);

//マニフェストにBASIC認証ヘッダを追加したHttpDataSourcew渡す
playlistFetcher = new ManifestFetcher<>(url, defaultHttpDataSource,parser);
```

com.google.android.exoplayer.r1.5.9
Sublime Text2のシンボリックリンクを作ろうとした時の話

sublimeをターミナルから呼び出せたら便利だなと思って調べてみたら

sudo ln -s "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" /usr/bin/subl

でシンボリックリンクを作成できるらしい

/usr/bin　は既に色々なコマンドが登録されているので，/usr/bin/symlinkを作り，その中に登録することに

早速 sudo mkdir /usr/bin/symlinkを実行したら，"Operation not permitted"のエラーが。。。管理者権限での実行なのになぜ！？

調べてみると，OS X 10.11 El Capitanから新しく追加された”Rootless”機能のせいでusr/はカーネルレベルでのアクセス制限がかけられているらしい。

まずはこれをなんとかしないと。

#Rootlessの解除
１．Mac再起動、cmd+R]を押しながら起動→リカバリモードに
２．上部のメニューから「ユーティリティ」「ターミナル」
３．以下のコマンド入力操作でRootlessを解除する


「SIP」の状態を確認

```
% csrutil status
System Integrity Protection status: enabled.
```


「SIP」を無効にし、再起動する

```
% csrutil disable
Successufully disabled System Integrity Protection. Please restart the machine for the changes to take effect.  
% reboot
```


ターミナルを立ち上げ「SIP」の状態を確認

```
% csrutil status
System Integrity Protection status: disabled.
```

これで解決


```
sudo mkdir /usr/bin/symlink

sudo ln -s "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" /usr/bin/symlink/subl

#パスを通すのを忘れずに
export PATH=$PATH:/usr/bin/symlink
```

subl -hコマンドでヘルプが表示されればOK

仕上げに
~/.bash_profileに
export EDITOR='subl -w'
を追加するとデォルトで利用するテキストエディタをsublime Text 2にできます
srcタグ抽出の正規表現(php)

phpでsrc=のURL先を抽出する正規表現

```
$pettern1	 = "/<img.*?src[[:space:]]{0,}=[[:space:]]{0,}[\"']{0,}(.*?[^\"'>[:space:]]{0,}.*?[^\"'>[:space:]]{0,}.*?)[\"']{0,}[[:space:]]{0,}.*?>/is";
$pettern2	 = "/<a.*?href[[:space:]]{0,}=[[:space:]]{0,}[\"']{0,}(.*?[^\"'>[:space:]]{0,}.*?[^\"'>[:space:]]{0,}.*?)[\"']{0,}[[:space:]]{0,}.*?>(.*?)<\/(.+?)/is";
$pettern3	 = "/<script.*?src[[:space:]]{0,}=[[:space:]]{0,}[\"']{0,}(.*?[^\"'>[:space:]]{0,}.*?[^\"'>[:space:]]{0,}.*?)[\"']{0,}[[:space:]]{0,}.*?>/is";
$pettern4	 = "/<area.*?href[[:space:]]{0,}=[[:space:]]{0,}[\"']{0,}(.*?[^\"'>[:space:]]{0,}.*?[^\"'>[:space:]]{0,}.*?)[\"']{0,}[[:space:]]{0,}.*?>/is";
$pettern5	 = "/<link.*?href[[:space:]]{0,}=[[:space:]]{0,}[\"']{0,}(.*?[^\"'>[:space:]]{0,}.*?[^\"'>[:space:]]{0,}.*?)[\"']{0,}[[:space:]]{0,}.*?>/is";
$pettern6	 = "/@import.*?u?r?l?\(?[\"']{0,}(.*?[^\"';\)]{0,}.*?[^\"';\)]{0,}.*?)[\"']{0,}\)?;?/is";
$pettern7	 = "/background\-image[[:space:]]{0,}:[[:space:]]{0,}url\([\"']{0,}(.*?[^;\)\"'>]{0,}.*?[^;\)\"'>]{0,}.*?)[\"']{0,}\);?/is";
$pettern8	 = "/background[[:space:]]{0,}=[[:space:]]{0,}[\"']{0,}(.*?[^;\)\"'>]{0,}.*?[^;\)\"'>]{0,}.*?)[\"']{0,}/is";
$pettern9	 = "/background[[:space:]]{0,}:[[:space:]]{0,}url\([\"']{0,}(.*?[^;\)\"'>]{0,}.*?[^;\)\"'>]{0,}.*?)[\"']{0,}\)/is";
```
AWSで運用するWindowsサーバのバックアップとリストアについて

# 目的
* 任意のタイミングまでロールバックさせる

# 方法
* 任意の静止ポイントで作成したAMIを利用
* 日時処理しているSnapShotから作成したVolumeを利用

# 環境
* Microsoft Windows Server 2012 R2 Standard
* [EC2のスナップショットを自動的にAWS Lambdaで作成する](http://qiita.com/eiroh/items/66bb68d12bd8fdbbd076)

# 手順
* イメージ
![sepm-resotre.png](https://qiita-image-store.s3.amazonaws.com/0/58788/8c010de6-efe7-773f-7820-260b570911e8.png)

* 日付は例

1. 7/1にAMI作成
2. 7/15に異常が発生 -> 7/14の状態にロールバックさせる
3. 7/1~7/14ではデータに差分が発生している為、日時で取得しているSnapshotからVolumeを作成し、アタッチし直す
4. 7/14の状態に戻ったことを確認

# 複製サーバを作成する場合
* WindowsはSID等、固有データを持つため、sysprepを使用して固有データを書き換える必要がある
    * [Sysprep を使って標準の Amazon マシンイメージを作成します](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/ami-create-standard.html)
【three.jsのヘルパー解説集】 ④BoxHelperの使い方

## BoxHelper
継承：THREE.Line
解説：オブジェクトの境界エリアを可視化してくれるヘルパーです。[BoundingBoxHelper](http://qiita.com/sawa-zen/items/0e64484ebe5f47d0dd95)と似ていますが、こちらはMeshではなくLineで構成されています。__境界エリアだけを確認したい場合はこちらを使用をオススメします。__

### デモ

![Untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/42248/6e61da39-6a70-a283-d9c5-dcb00db0d586.gif)

- [jsdo.itで確認する。](http://jsdo.it/sawa-zen/mPb2)
- [ソースコードを確認する。](https://github.com/sawa-zen/three_js_demo/blob/master/helper/src/helper/BoxHelper.ts)　

### 実装例

```js:javascript
var sphere = new THREE.SphereGeometry();
var object = new THREE.Mesh( sphere, new THREE.MeshBasicMaterial( 0xff0000 ) );
var box = new THREE.BoxHelper( object );
scene.add( box );
```

BoxHelper(object, color)

- object：境界を表示させたいObject3Dオブジェクト
- color：boxのラインの色
DockerでTS3サーバー立ててみた

GMOレンタルサーバーでVPSを契約したのでTS3のサーバーをDockerで構築しました。
とても簡単です。

## Enviromment
GMO VPS 
3 Core
Memory:2GB
HDD:200GB
OS:CentOS7.1

## CentOS KernelUpdate
いつかDockerSwarmを勉強するかもということでkernelを上げる事に。
http://qiita.com/kawaz/items/21637f5f0b443bbf7893
以上を参考にUpdate

## Dockerインストール
公式ドキュメントを読めば出来ます。
Composeも一緒にインストール。
https://docs.docker.com/

## TS3を構築
DockerHubにTS3のイメージがあったので借用

```
docker run --name TS3 -d -p 9987:9987/udp -p 10011:10011/tcp -p 30033:30033/tcp -v {FolderPath}:/teamspeak3 luzifer/teamspeak3
```

TS3への接続に必要なトークンやserveradminのパスワード

```
docker logs TS3
```

```
------------------------------------------------------------------
                      I M P O R T A N T                           
------------------------------------------------------------------
               Server Query Admin Account created                 
         loginname= "serveradmin", password= "********"
------------------------------------------------------------------
------------------------------------------------------------------
                      I M P O R T A N T                           
------------------------------------------------------------------
      ServerAdmin privilege key created, please use it to gain 
      serveradmin rights for your virtualserver. please
      also check the doc/privilegekey_guide.txt for details.

       token=***********************************************
------------------------------------------------------------------
```

こんな感じで表示されるのであとはTS3クライアントでサーバーに接続して下さい。

## あとがき
volumeをデータ・コンテナに入れることも考えたけどまだ理解が足りてないので、ホストにマウントすることにした。
Gitの基本的な使い方

■gitの基本的な使い方

■初期設定
　・リポジトリをクローンする場合
　　用途に合わせて下記いずれかを実行
　　git clone リポジトリ先のブランチ
　　git clone -b リモートのブランチ名 リモートのリポジトリ先

　・リポジトリをクローンしない場合
　　git init→ローカルのリポジトリ作成
　　git remote add origin リモートのリポジトリ先→リモート先の設定
　　git remote -v→リモート先の確認
　　git fetch→リモートリポジトリの情報をローカルリポジトリに持ってくる
　　git checkout 取り込みたいブランチ名

■ローカルからリモートに反映
　git fetch 
　git checkout 作業を行うブランチ名A
　git add ファイル名
　git commit -m "コミットのコメント"
　git push origin 反映したいブランチ名A

■リモートリポジトリの更新をローカルリポジトリに取り込む
　下記のいずれかコマンドを実行する
　ケース１
　git fetch ブランチ名A
　git checkout ブランチ名A
　git pull origin ブランチ名A

　ケース２
　git fetch
　git checkout ブランチ名A
　git merge origin/ブランチ名

　ケース３
　git fetch origin ブランチ名A
　git checkout ブランチ名A
　git merge FETCH_HEAD

■リモートリポジトリの更新(git pull、git fetch + git mergeなど)でコンフリクト(競合)が起きた場合の対応
　・手動で行う場合
　　コンフリクトを起こしたファイルを開くと差分が表示される
　　======= の上がローカルリポジトリ、下がリモートリポジトリなので手作業で修正を行う。

　　例：
　　var sortNumber = function (number) {
　　　number.sort(function (a, b) {
　　　<<<<<<< HEAD
　　　if (a === b) {
　　　=======
　　　if (a == b) {
　　　>>>>>>> 839396c5383737ec06b9c2a842bfccc28f3996ef
　　　　return 0;
　　　}
　　　return a < b ? -1 : 1;
　　　});
　　};

　　git add コンフリクトのファイル
　　git commit -m "競合を解決"
　　git push origin 作業を行うブランチ名

　・どのブランチを優先させるのかわかっている場合
　　git checkout --ours "ファイル名"→ローカルにあるファイルを優先するのでリモートにあるファイルは反映されない
　　git checkout --theirs "ファイル名"→ローカルにあるファイルはリモートにあるファイルで反映される
　　git add コンフリクトのファイル
　　git commit -m "競合を解決"

■リモートにある情報をローカルのリモート追跡ブランチに取り込む(ファイル自体には取り込まれない)
　下記いずれかを実行
　git fetch→リモートのすべての情報をローカルのリモート追跡ブランチへ取り込む
　git fetch origin ブランチ名→リモートの特定のブランチをローカルのリモート追跡ブランチ(FETCH_HEAD)へ取り込むとき

■tagの作成→確認→リモートへ反映
　git tag -a タグ -m 'タグのコメント'
　git tag
　git push origin タグ名
仮想サーバーコマンド(virt-install)＆ks.cfgファイル

virt-installのメモ

■virt-installの中身

```
sudo /usr/sbin/virt-install \
--connect qemu:///system \
--name=nishi2 \
--ram=512 \
--file=/var/lib/libvirt/images/nishi2.img \
--file-size=5 \
--vcpus=2 \
--os-type=linux \
--os-variant=rhel5 \
--network bridge=br0 \
--nographics \
--accelerate \
--hvm \
--location='http://192.168.1.21/ISO2' \
--extra-args="ks=http://192.168.1.21:80/KS/ks.cfg ksdevice=eth0 ip=192.168.1.23 netmask=255.255.255.0 gateway=192.168.1.1 console=tty0 console=ttyS0,115200n8"
```



■ks.cfgファイルの中身

```
install
url --url http://192.168.1.21/ISO2
lang en_US.UTF-8
keyboard us
network --device eth0 --bootproto static --ip 192.168.1.24 --netmask 255.255.255.0 --gateway 192.168.1.1 --nameserver 192.168.1.11 --hostname mori_lab3
rootpw morimori5963
firewall --enabled --port=22:tcp
authconfig --enableshadow --enablemd5
selinux --enforcing
timezone Asia/Tokyo
bootloader --location=mbr --driveorder=hda --append="console=ttyS0,115200n8"
clearpart --all --initlabel
autopart

%packages
@admin-tools
@base
@core
@development-libs
@development-tools
@editors
reboot
```
仮想サーバーのサーバー設定手順

■サーバー関連
手順１：yum install libpng-devel


■Apache関連

手順１：Apacheダウンロード・インストール(http://archive.apache.org/dist/httpd/)
※rootで実行
		1.	wget http://archive.apache.org/dist/httpd/httpd-2.2.4.tar.gz
		2.	chmod 755 httpd-2.2.4.tar.gz
		3.	tar zxvf httpd-2.2.4.tar.gz
		4.	./configure --prefix=/usr/local/apache2 --enable-module=so
		5.	make
		6.	make install


手順２：httpd.conf関連
		1.	vi /usr/local/apache2/conf/httpd.conf
		2.	httpd.conの最後尾に下記を追記
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/↓ここから↓_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

```
NameVirtualHost *:80

<VirtualHost *:80>
        DocumentRoot /home/www/
        ServerName virtual-server.nishi.com

        <Directory />
            Options FollowSymLinks
            AllowOverride All
            Order deny,allow
            Allow from all
        </Directory>

        <IfModule dir_module>
                DirectoryIndex index.html index.htm index.php
        </IfModule>

        PHPIniDir "/home/www/php.ini"

</VirtualHost>
```

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/↑ここまで↑_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/


■PHP関連

手順１：PHPのダウンロード(http://www.php.net/downloads.php)
		1.	wget http://jp1.php.net/get/php-5.4.7.tar.gz/from/this/mirror
		2.	chmod 755 php-5.4.7.tar.gz
		3.	tar zxvf php-5.4.7.tar.gz
		4.	下記のコマンドを実行
/_/_/_/_/_/_/_/_/_/_/_/_/↓ここから↓_/_/_/_/_/_/_/_/_/

```
./configure \
--with-apxs2=/usr/local/apache2/bin/apxs \
--with-mysql \
--with-curl \
--with-zlib \
--with-gd \
--enable-mbstring \
```

/_/_/_/_/_/_/_/_/_/_/_/_/↑ここまで↑_/_/_/_/_/_/_/_/_/
		5.	make
		6.	make install
virt-installでエラーが表示されたときの対応方法

■SELinuxの設定を変更する

■設定ファイル
/etc/selinux/config

■変更箇所
SELINUX=disabled

■手順

	１．/etc/selinux/config
	２．ファイルの内容を変更
	３．システムの再起動
		※下記のようにすると一時的に実行できる
			１．コマンド：getenforce(selinuxの設定状況確認)
				実行結果→Enforcing

			２．コマンド：setenforce 0(一時的に無効する)

			３．コマンド：getenforce
				実行結果→Permissive(無効になっている)
virt-installの困ったときメモ

■virt-installの困ったときメモ

	・virt-installを実行するとターミナル上でpsコマンドを実行するとqemu-kvmコマンドが実行されている。
	→プロセスを見ると--no-rebootが付加されている
		・これを改善するときのメモ
			１．/etc/init.d/xendomains
			２．１.で呼び出されるファイル→/etc/sysconfig/xendomains
仮想サーバーに関するコマンド

■仮想サーバーに関するコマンド

	■仮想サーバーの設定ファイル確認
		ls -la /etc/libvirt/qemu

	■仮想サーバーの一覧
		virsh list --all

	■仮想サーバーのステータス情報
		virsh dominfo 仮想サーバー名

	■仮想サーバーの起動
		virsh start 仮想サーバー名

	■仮想サーバーの一時停止
		virsh suspend 仮想サーバー名

	■仮想サーバーの再開
		virsh resume 仮想サーバー名

	■仮想サーバーのドメインの復元
		virsh restore ファイル名

	■仮想サーバーの停止
		virsh shutdown 仮想サーバー名
		※このコマンドを実行後、virsh dominfoでステータス情報を見ると、
		仮想サーバーは実行中で表示されている

	■仮想サーバーの再起動
		virsh reboot 仮想サーバー名

	■仮想サーバーの電源オフ
		virsh destroy 仮想サーバー名

	■仮想サーバーの削除
		１．virsh destroy 仮想サーバー名
		→電源オフにする
		２．仮想サーバーの定義を削除
		virsh undefine 仮想サーバー名
		→これで仮想サーバーの定義が削除されるが、
		仮想サーバーのディスクイメージは削除されない。
		なので、完全に削除されていない状態

		３．仮想サーバーのディスクイメージを削除(ディスクイメージを削除するにはボリュームも削除する必要がある)
		ls -la /var/lib/libvirt/images/				→仮想サーバーのディスクイメージを確認
		virsh pool-list								→ストレージテーブルを一覧表示
		virsh vol-list ストレージプール名
		→ボリュームの確認(ストレージテーブルを作成していなければ通常はdefaultが表示される。)
		virsh vol-delete 削除するボリュームを指定(上記のコマンドで削除したいストレージプール名を指定)
		virsh vol-list								→削除されているのか確認


	■qemu-kvm(/etc/libvirt/qemu.conf)



	■/etc/libvirt/libvirtd.conf 


	■仮想化が有効になっているかの確認
		・コマンド：modprobe kvm_intel
			→Operation not supported のエラーが出る場合は、BIOSでVT(Virtualization Technology)が有効になっているか確認
require_once中でexit()を使うと終了するので、戻りたい時はreturnを使う

## サンプル

```php:index.php
<?php
echo "a";
require_once("b.php");
echo "c";
```

### exitの場合

```php:b.php
echo "b";
exit(0);
```

* `c`が出力されない。die();でも一緒。

### returnの場合

```php:b.php
echo "b";
return;
```

* `c`が出力される。

## 実例

```index.php
...
require_once("top_page.php");
...
```

```php:top_page.php
<?php
if (is_gecko() && file_exists("gecko_top_page.php")) {
    require_once("gecko_top_page.php");
    return;
}
?><html><body>ガラケー時代のコンテンツ</body></html>
```


```php:gecko_top_page.php
<!DOCTYPE html>
<html><body>新コンテンツ</body></html>
```
Zelotes C-12 Gaming Mouse をどうしてもmacでカスタマイズする

それ[Karabiner](https://pqrs.org/osx/karabiner/index.html.ja)でできるよ。

private.xmlに追加するようのitemノードはこちら
https://gist.github.com/umezo/447de14fe33b7f305a9a39f9f84d640f

Karabiner便利すぎ。寄付しよ。



## 設定を書き上げるまでにやったこと
- C12の4〜9ボタンがどんな入力になっているかEventViewerで確認した
    - 普通に数字キーの4〜９になっていた
- Karabinerで特定のデバイスからの入力だけ変更できるか確認した
    - [外付けキーボードが接続されている場合は内蔵キーボードを無効化する](https://pqrs.org/osx/karabiner/gallery.html.ja#disable-built-in-keyboard-if-external-keyboard-exists) なんていう設定ができるぐらいだからできるやろ
    - [filter](https://pqrs.org/osx/karabiner/xml.html.ja#filter-overview)でできるっぽい
    - [device_only](https://pqrs.org/osx/karabiner/xml.html.ja#devicedef)タグやな
- Device:XXXXXとかDeviceProduct:YYYYYYをどうやって知るか確認した
    - EventViewerのDevicesでIDは確認できた
    - サンプルだと `DeviceVendor::APPLE_COMPUTER` などもっと人間にわかりやすい文字列になってる
    - それっぽい[ｉｓｓｕｅ](https://github.com/tekezo/Karabiner/issues/618) を読んでいたら[こんな感じ](https://github.com/tekezo/Karabiner/issues/605)で`deviceproductdef`や`devicevenderdef`で定義してやればいいことがわかった。
- 4〜9キーをマウスの４〜９ボタンに変更
    - マウスの４〜９ボタンの表現は[ここ](https://github.com/tekezo/Karabiner/blob/version_10.21.0/src/bridge/generator/keycode/data/PointingButton.data)に書いてあった

## 付録
- devicexxxxxxdefは[ここ](https://pqrs.org/osx/karabiner/xml.html.en#devicedef-steps)に説明があった
小ネタ：Excelで度分秒(DMS)表記のセルから度の小数表記を生成

小ネタです。

Excelで経緯度などの度分秒表記のセルを度の小数表記に直したいときどうするか。

たとえば度分秒のフォーマットが`135.23.45`みたいな感じでA1セルに入っている時、度に直すには、

```vbnet:Excelで度分秒から度へ
=LEFT(A1,FIND(".",A1)-1) + MID(A1,FIND(".",A1)+1,FIND(".",A1,FIND(".",A1)+1)-FIND(".",A1)-1) / 60 + RIGHT(A1,LEN(A1)-FIND(".",A1,FIND(".",A1)+1)) / 3600
```

区切りが`.`以外の場合は、読み解いてもらって`"."`の部分を適宜直す感じで。
あと、正の場合だけで負の場合には対応してません。負に対応するにはもう一工夫必要...
【jQuery UI】要素をドラッグ&ドロップで並び替え【Sortable】

# 【jQuery UI】要素をドラッグ&ドロップで並び替え【Sortable】
jQuery UI のSortable機能を利用して、要素を動的に並び替えます。
実務で使う機会があり、またどこかで使いそうな感じもするので備忘録的なメモ。

## 目的
HTML要素をドラッグ&ドロップで動的に並び替える

## 環境
* ECMA Script5
* jQuery 1.11.1
* jQuery UI

## ソースコード

~~~html:sample.html
<!DOCTYPE html>

<head>
    <meta charset="UTF-8">
    <title>テスト</title>
    <!-- CSS読み込み -->
    <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
    <!-- CSSを記述 -->
    <style>
        .sort-elements {
            height: 100px;
            border:solid 2px;
            margin:10px;
            background-color:#999999;
        }
    </style>
</head>

<body>
    <!-- ここにHTML要素 -->
    <div id='sortable'>
        <div id='a' class='sort-elements'>a</div>
        <div id='b' class='sort-elements'>b</div>
        <div id='c' class='sort-elements'>c</div>
    </div>
    <!-- Script読み込み -->
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
    <!-- jQueryでイベント記述 -->
    <script>
    jQuery( function() {
        /**
         * sortable
         */
        jQuery( '#sortable' ) . sortable( {
                cursor: 'move',                     //移動中のカーソル
                opacity: 0.7,                       //移動中の項目の透明度
                placeholder: "ui-state-highlight",  //ドロップ先の色指定(Styleで指定可能)
                forcePlaceholderSize: true          //trueでドラッグした要素のサイズを自動取得できる
        } );
        $( '#sortable' ).disableSelection();
        /**
         * 動作
         */
        jQuery(document).on('sortstop','#sortable',function(){
            alert('並び替え時の動作')               //sortstopイベントで並び替え後処理を実行
        });
    } );
    </script>
</body>

</html>
~~~

__ポイント__

* jQueryとjQueryUIをCDNで読み込み、jQueryにてプロパティを記述するだけ。
* プロパティ・イベント等については、APIを参考にどうぞ。<br>
  <http://stacktrace.jp/jquery/ui/interaction/sortable.html>
* placeholderに指定したクラスのStyleは、__移動予定地のStyle__になる。  
  デフォルトを利用すると黄色く光るが、書き換えることによって色々カスタマイズできる。
* forcePlaceholderSizeはドラッグ要素のサイズを自動で取得できる。便利。

## 結果
並び替え時
![d1.PNG](https://qiita-image-store.s3.amazonaws.com/0/131683/d8b88c42-d9f1-9c45-fc8e-df713a1e2d3e.png)
並び替え後
![d2.PNG](https://qiita-image-store.s3.amazonaws.com/0/131683/536e36fc-81e6-2be9-0166-1f38c45de9e4.png)


## 感想
* DOM操作等々面倒そうな感触でしたが、とても使いやすく、シンプルで分かりやすいライブラリでした。
* この他にもDraggable、Droppable等面白そうな機能があるので、近々使ってみたいです。

## 参考
jQuery UI 日本語リファレンス
<http://stacktrace.jp/jquery/ui/>
jQuery UI の Sortable を使いドラッグ＆ドロップで並べ替え
<http://alphasis.info/2011/05/jquery-ui-sortable/>
UnityEditor上でSteam VR PluginのLeftControllerがdisableになってしまうことへの一時的な対処

8日にViveが届いたのでいろいろと遊んでました。

チュートリアルもそこそこにSteamVRPluginを使ってUnityで何か作ろうと思って
<blockquote class="twitter-video" data-lang="ja"><p lang="ja" dir="ltr">男の子だからどうしてもこういうインタフェースが好きになってしまう…😌 <a href="https://t.co/4ZMmMMhp5z">pic.twitter.com/4ZMmMMhp5z</a></p>&mdash; Negipoyoc (@CST_negi) <a href="https://twitter.com/CST_negi/status/752532099857395712">2016年7月11日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

というのを作っていました。(楽しい！)

開発に際して、今回は片方の手だけ使えれば良かったので特に問題なかったのですが、**何故か左コントローラだけDisableになってしまって使えない**という状況が発生してました。
UnityEditor上以外(例えばチュートリアルとか)ではコントローラが正しく認識されているし、SteamVRPluginのコードを特にいじってない状況でこうなるのはおかしいなぁと思っていたらフォロワーの方から以下の様なアドバイスがありました。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/CST_negi">@CST_negi</a> 最新のファームアップデートするとなるっぽいですー<br>現状修正方法が見当たらない感じで、自分も困ってます…</p>&mdash; 野村譲誉 into VR (@n_yositaka) <a href="https://twitter.com/n_yositaka/status/752867369647616000">2016年7月12日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

早く治ってほしいなぁという感じですね。
　
　
しかし、治るの待ってたらいつまでたってもテストアプリ作成すらままならないので、その後いろいろ試していたら**手動でdeviceのIndexを割り当ててGameobjectをEnableすれば(コントローラの一部の初期化処理以外は)通常通り動きました**。

このバグはいずれ治ると信じて簡単な一時的対処をしたコードを以下にあげます。
https://gist.github.com/NegishiTakumi/7e252323a464935926012d879f542ebc


```TempBugFix.cs
 tmpConf.index = SteamVR_TrackedObject.EIndex.Device4;
```
のDevice4というのはもしかしたら人によって違うかもしれないのでいろいろ試して変えてください。
僕の場合はたまたまDevice4だったというだけですね。


コントローラに電源が入ってないなど正しくDisableが働くときでも強制的にEnableするコードなのでそういうところは雑ですが、ひとまず今はテストアプリを書いたりDebugのことしか考えてないのでこんな感じで…。

----
追記2016/07/19
SteamVR Betaにしたあと、PC再起動で動くようになりました。
なんだったんだ…
React.jsコンポーネントのReact-datetimeライブラリのカーソル問題＆解決法

[React.js](https://facebook.github.io/react/)をすでに導入している方も多いのではないでしょうか。

今回は、React.jsのカレンダーライブラリの[React-datetime](https://github.com/YouCanBookMe/react-datetime)の問題点とその解決法を紹介します。
そもそも、「**React.jsとはなんぞや？**」と言う方は、下記の記事で丁寧に説明されているので読んでください。

* [5分で理解する React.js](http://qiita.com/tomzoh/items/7fabe7cb57dd96425867)

Ract-datetimeとは、React.jsコンポーネント内の日付と時刻に関するカレンダーライブラリです。


では、はじめに、React-datetimeの導入方法から説明します。
すでに導入してる人は、読み飛ばしちゃってください！

# react-datetimeの導入
react-datetimeをインストールし、react-datetimeを`hogehoge.js`でrequireするだけです。

```sh:react-datetimeをインストール
$ npm install react-datetime
```

```js:hogehoge.jsでreact-datetimeの導入
require('react-datetime');
render: function() {
  return <Datetime />;
}
```

画面にアクセスすると、こんな感じに表示されます。

<img width="262" alt="スクリーンショット 2016-07-08 18.39.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/49238/b96a7328-9656-967e-7d2c-408f7d93b8a7.png">

# React-datetimeの問題点

* 最新のバージョンでは、問題は解消されています。
    * 古いバージョンで発生する現象です。

### カーソルが指:point_up:ではない！！！

ちゃんとクリックできるのに、これって直感的ではない。（導入はとても簡単なのに・・・）

![スクリーンショット 2016-07-08 17.20.09.png](https://qiita-image-store.s3.amazonaws.com/0/49238/2d5e3262-1e60-2b90-1ae3-d1d76981aab4.png)

# 指カーソルにする方法（１）
バージョンをアップロードする。

```
$ npm update react-datetime
```

# 指カーソルにする方法（２）

解決する方法は、とても簡単。**CSSでカーソルを指定**するだけです。
では、どこのCSSに変更を加えるか確認するために、React-datetimeのHTML構造を見ましょう。

```html:react-datetimeのHTML構造
// カレンダー全体
<div class="rdtPicker">
  <div class="rdtDays">
    <table>
      <thead>
        <tr>
　　　　   // 前月のボタン「 ＜ 」
          <th class="rdtPrev"></th>
          // M月 YYYY （例: 7月 2016）
          <th class="rdtSwitch"></th>
　　　　   // 次月のボタン「 ＞ 」
          <th class="rdtNext"></th>
        </tr>
        <tr>
          // 曜日（例： 日）
          <th class="dow"></th>
                （略）
          <th class="dow"></th>
        </tr>   
      </thead>
      <tbody>
        <tr>
          // 前月の日付
          <td class="rdtDay rdtOld"></td>
                （略）
          // 当月の日付
          <td class="rdtDay"></td>
        </tr>
        <tr></tr>
          （略）         
        <tr></tr>
        <tr>
          // 当月の日付
          <td class="rdtDay"></td>
                （略）
          // 未来の日付
          <td class="rdtDay rdtNew rdtDisabled"></td>
        </tr>
      </tbody>
    </table>
  </div>
</div>
```

HTML構造から、`.rdtDay`クラスを変更すれば良いとわかります。

```css:指カーソルを指定するCSS
.rdtDay {
  cursor: pointer;
}
```

指定後、画面にアクセスすると、カーソルが指:point_up:に変身！

![スクリーンショット 2016-07-08 17.19.54.png](https://qiita-image-store.s3.amazonaws.com/0/49238/c036b84a-ff57-f8c1-f8a9-7debe47a3ba2.png)


# まとめ
React.jsコンポーネント内でカレンダーを簡単に表示する[React-datetime](https://github.com/YouCanBookMe/react-datetime)の導入と、その問題点と解決法を紹介しました。

簡単に、導入できるので是非使ってみてください。