OmniAICreator/Qiita-1.07M huggingface dataset:
NSCalendarを用いた日付の差分（1日前）を正確に表示する方法

NSCalendarを用いたを用いた日付の差分（1日前）を正確に表示する方法について紹介します。
現在の時刻と比較する時刻を用いて差分比較をすることで、「現在の時刻からの1日前」を表示します。
#NSCalendarを用いた日付の差分計算
現在時刻を表すNSDate（currentTime）と差分を計算するNSDate（differenceTime）の比較を行い、秒・分・日の文字列を返す関数を作成します。

```swift　
func timeDifferenceString(differenceTime: NSDate, currentTime: NSDate = NSDate()) -> String {
	guard let calender = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian) else {
		return ""
	}
	let unitFlags: NSCalendarUnit = [.Second, .Minute, .Hour, .Day]
	let compareCalendar = calender.components(unitFlags, fromDate: differenceTime, toDate: NSDate(), options: [])
	let currentCalendar = calender.components(unitFlags, fromDate: currentTime)
		
	if (compareCalendar.day == 1 && currentCalendar.hour > compareCalendar.hour) || (compareCalendar.day == 0 && currentCalendar.hour < compareCalendar.hour) {
		return "昨日"
	} else if compareCalendar.hour > 0 {
		return "\(compareCalendar.hour)時間前"
	} else if compareCalendar.minute > 0 {
		return "\(compareCalendar.minute)分前"
	} else if compareCalendar.second > 0 {
		return "\(compareCalendar.second)秒前"
	}
	return ""
}

```
NSCalenderのcomponentsで作成しているcompareCalendar.dayの値が"1"のとき、「1日前」と判定せず、

```swift:compareCalendar.dayの値が"1"のとき
	if compareCalendar.day == 1 {
		return "昨日"
	} 
```
現在の時刻（currentCalendar.hour）と比較する時刻(compareCalendar.hour)を用いて差分比較をすることで、「現在の時刻からの1日前」を表示します。

```swift:compareCalendar.dayの値が"1"のとき
	if (compareCalendar.day == 1 && currentCalendar.hour > compareCalendar.hour) || (compareCalendar.day == 0 && currentCalendar.hour < compareCalendar.hour) {
		return "昨日"
	}
```
Unity 5でシェーダーをつかってキャラクタの位置のマーカー表示


##はじめに

![out.gif](https://qiita-image-store.s3.amazonaws.com/0/42909/1c575ea2-5928-1dad-575f-38b07fef9bad.gif "out.gif")

３D系のRPGゲームなどでよくみる、キャラクタの足元にある円形のマーカーをUnityのシェーダで書いてみます。

##床用のシェーダー

まずはRadiusShaderという名前で新しくシェーダーを作ります。

```
Shader "Custom/RadiusShader" {
	Properties {
		_MainTex ("Albedo (RGB)", 2D) = "white" {}
		_Center("Center", Vector) = (0,0,0,0)
		_Radius("Radius",Float) = 0.5
		_RadiusColor("Radius Color",Color) = (1,0,0,1)
		_RadiusWidth("Radius Width",Float) = 2
		_RadiusPower("RadiusPower",Range(0,10)) = 2
		_RadiusSpeed("RadiusSpeed",Range(0,100)) = 50
	}
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200
		
		CGPROGRAM
		// Physically based Standard lighting model, and enable shadows on all light types
		#pragma surface surf Standard fullforwardshadows

		// Use shader model 3.0 target, to get nicer looking lighting
		#pragma target 3.0

		sampler2D _MainTex;
		float3 _Center;
		float _Radius;
		fixed4 _RadiusColor;
		float _RadiusWidth;
		float _RadiusPower;
		float _RadiusSpeed;

		struct Input {
			float2 uv_MainTex;
			float3 worldPos;
		};


		void surf (Input IN, inout SurfaceOutputStandard o) {
			float d = distance(_Center, IN.worldPos);
			float tempRadiusWidth = _RadiusWidth * abs(sin(_Time * _RadiusSpeed));

			if(d > _Radius && d < _Radius + tempRadiusWidth)
				o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb + _RadiusColor * pow(d/(_Radius+tempRadiusWidth),_RadiusPower);
			else
				o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;

		}
		ENDCG
	}
	FallBack "Diffuse"
}

```

Properties{}では以下のようなパラメータを設定しています。

- _MainTex : ベーステクスチャ
- _Center : マーカー中心位置
- _Radius : マーカーの半径
- _RadiusColor : マーカーの色
- _RadiusWidth : マーカーの太さ
- _RadiusPower : マーカーのグラデーションの強さ
- _RadiusSpeed : マーカーの拡大縮小アニメーションのスピード


![スクリーンショット 2016-08-28 23.24.52.png](https://qiita-image-store.s3.amazonaws.com/0/42909/a3d15909-43e2-0032-3864-2c0ed4fc0db5.png "スクリーンショット 2016-08-28 23.24.52.png")

基本的にはサーフェースシェーダーとして作っています。
このシェーダーを使ったMaterialを作成し、床面となるPlaneやTerrainなどに設定します。


##キャラクタ用のC#スクリプト


次にキャラクター（ここではSphere）に以下のスクリプトをはりつけます。床用のMaterialのパラメータをランタイムで変更するために必要です。

```C#
using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
public class RadiusCenter : MonoBehaviour {
	public Material radiusMaterial;
	public Color color = Color.white;
	public float radius = 10f;
	public float radiusWidth = 2f;
	public float power = 5f;
	public float speed = 60f;

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
		radiusMaterial.SetVector ("_Center", transform.position);
		radiusMaterial.SetColor ("_RadiusColor", color);
		radiusMaterial.SetFloat ("_Radius", radius);
		radiusMaterial.SetFloat ("_RadiusWidth", radiusWidth);
		radiusMaterial.SetFloat ("_RadiusPower", power);
		radiusMaterial.SetFloat ("_RadiusSpeed", speed);
	}
}
```

主に、キャラクタに円形のマーカーがついてくるために、Update()の中でマテリアルのパラメータを操作しています。
Bluemix：簡易ETLサービスDataConnect（複数DBからのデータコピー/テーブルのJOINもやってみた）

## この記事の主旨
DataWorksで以下をチャレンジ
・**複数のデータベースに点在しているテーブルをひとつのデータベースに纏めて、コピー**
・**元となる複数テーブルをJOINして1テーブルにしてからコピー**


## やりたいことのイメージ図
青いのは、テーブルです。
・3つのデータベースを情報元として、1つのデータベースにデータコピー
・データベースを跨ってるテーブル２つをJOINして1つのテーブルとする
・他の２つのテーブルはそのままコピー

![スクリーンショット 2016-08-28 23.20.19.png](https://qiita-image-store.s3.amazonaws.com/0/119378/cf690c7c-f34d-ddfd-7fd7-114c72234191.png)


## 前提：各種テーブルの定義/中身

**従業員**
日本語満載の表。ちなみに一番最後のはアラビア語です（使えるんですねー）。
![スクリーンショット 2016-08-28 20.16.54.png](https://qiita-image-store.s3.amazonaws.com/0/119378/d1480971-abe4-7efb-14e4-0096fa50d42e.png)

**dept**
![スクリーンショット 2016-08-28 20.35.14.png](https://qiita-image-store.s3.amazonaws.com/0/119378/9ac054f9-ab6f-2a2e-ab2b-9b8deba3e711.png)

**顧客情報とmeisaiテーブル**
![スクリーンショット 2016-08-28 23.18.06.png](https://qiita-image-store.s3.amazonaws.com/0/119378/a33a4087-2a0d-49e0-28cc-e8ff77fb5acd.png)


## DataWorks上での設定

### 元データはどれか、選択する
データベースごとにどの表をコピーするかを選択します。
下の図であれば、
・まずはcompose2データベースからmeisaiテーブルを選ぶ。
・次にBLUDBデータベースからdeptテーブルを選ぶ
・最後にcomposeデータベースから顧客情報と従業員テーブルを選ぶ

### JOINしたいときはREFINE DATA

選びおわったら、JOINの準備です。
REFINE DATAをクリックして画面を進めます。

![スクリーンショット 2016-08-28 23.35.57.png](https://qiita-image-store.s3.amazonaws.com/0/119378/8b006582-cd20-36c4-9da4-db466149bab2.png)


### JOINの定義

Join data setをクリックすると、具体的にどのテーブルをJOINさせるかを定義できる画面に移ります。
ここではDEPTテーブルとは従業員テーブルをJOINしたいので、「Select a table」---> 「従業員」の順番でクリックします。

![スクリーンショット 2016-08-28 23.52.04.png](https://qiita-image-store.s3.amazonaws.com/0/119378/7d9f2dfa-9226-67ba-909d-a12d111b0d37.png)



どの列（キー）でJOINするかを定義
deptidでJOINするように選択し、最後に右上の「JOIN」をクリックします。

![スクリーンショット 2016-08-28 23.56.47.png](https://qiita-image-store.s3.amazonaws.com/0/119378/db436800-6a9b-ed69-4b66-34fe93e7c472.png)


JOINできているのを確認して、NEXT
![スクリーンショット 2016-08-28 21.12.51.png](https://qiita-image-store.s3.amazonaws.com/0/119378/9fcc16bf-35f9-d96a-49a2-44f8dc7f0f64.png)

### コピー先のデータベース、テーブルを定義して、ジョブ実行！

コピー先の情報を定義します。
簡単な画面の意味等は過去の記事を参照してください。
http://qiita.com/azzeten/items/a0b604c67d993387ff5e

ここでは、最後に表の名前を変えてみました。
「結合したテーブル」という名前で、JOIN結果をdashDBに格納できます。

![スクリーンショット 2016-08-28 23.48.19.png](https://qiita-image-store.s3.amazonaws.com/0/119378/944af354-b444-4b03-ea3b-83b568e71560.png)



## 結果
こんなかんじで完了です。おつかれさまでした。

![スクリーンショット 2016-08-28 21.17.26.png](https://qiita-image-store.s3.amazonaws.com/0/119378/5b55b582-4d06-69e2-f451-c0ef1e679428.png)

結合結果は↓
![スクリーンショット 2016-08-28 23.59.11.png](https://qiita-image-store.s3.amazonaws.com/0/119378/33f204fd-a6ad-f580-b5da-7ed6a714d985.png)
TableViewCell　Cell選択できないようにする

TableViewCell　Cell選択できないようにする

Xcode version 7.3.1

![001.png](https://qiita-image-store.s3.amazonaws.com/0/93155/2fbfb771-8703-68ce-71ec-4deeea5692f7.png)

![002.png](https://qiita-image-store.s3.amazonaws.com/0/93155/3f817a88-09fd-7a0a-aae5-8def650a680e.png)

![003.png](https://qiita-image-store.s3.amazonaws.com/0/93155/3cfef514-5750-330b-c990-0f34b2a468af.png)

![004.png](https://qiita-image-store.s3.amazonaws.com/0/93155/af90eb50-8661-1a7e-8d1e-d29402139a71.png)
⑤完成図

![完成.png](https://qiita-image-store.s3.amazonaws.com/0/93155/3427e7b0-9a51-c196-feb5-2fbc3e5626be.png)

![001.png](https://qiita-image-store.s3.amazonaws.com/0/93155/aa9b22db-2e76-a86b-a116-89d18b08733d.png)

![002.png](https://qiita-image-store.s3.amazonaws.com/0/93155/c686ecfc-eda9-e16a-6040-59946e1fdf52.png)

![003.png](https://qiita-image-store.s3.amazonaws.com/0/93155/f65b9839-7e7f-ba7b-c877-def028b479dd.png)

![004.png](https://qiita-image-store.s3.amazonaws.com/0/93155/9ea12a84-53c6-2fdc-7f6c-d649f24493b1.png)

![005.png](https://qiita-image-store.s3.amazonaws.com/0/93155/2279be68-ec35-e4e8-874e-fc33030c102c.png)
サーバー移動でgitolite-adminのリポジトリを移動する

最短なやり方かどうかはわからないですがとりあえずできました。
以下ユーザー名gitという前提です。

予め古いサーバーからgitolite-adminをクローンしておきます。

```
git clone git@旧ホスト:gitolite-admin
```

新しいサーバーで普通にgitoliteをインストールします

```

$ mkdir ~/tmp;cd ~/tmp
$ git clone git://github.com/sitaramc/gitolite
$ mkdir -p ~/bin
$ gitolite/install -to ~/bin
$ ~/bin/gitolite setup -pk ~/自分の鍵.pub

```

cloneしていたローカルリポジトリをpushします

```
git push origin master
```

多分過去に作ってたリポジトリが生成されます。


sshでサーバーにログイン
ssh git@ホスト はできないので別ユーザーでログインしてsudo su - でログイン


```
rm -rf ~/repositories
```

さっきできたリポジトリを削除


旧サーバーからリポジトリをコピーしてきて置き換えます。

```
chown -R git:git ~/repositories
```
を忘れずに
MacでCentOS8のbootable USBを作成する手順



# CentOS8のISOをダウンロード
```
axel -a -n 10 -o CentOS.iso http://ftp.jaist.ac.jp/pub/Linux/CentOS/8.0.1905/isos/x86_64/CentOS-8-x86_64-1905-dvd1.iso
```
Axelがない場合は

```
brew install axel
```

# .isoを.imgに変換
CentOSのISOがあるディレクトリで以下を実行

```
hdiutil convert -format UDRW -o CentOS.img CentOS.iso
```

# USBに書き込み
USBを挿した状態で以下のコマンドを実行

```
diskutil list
```

USBのディスクを見つけたらアンマウントする
ex.( /dev/disk2の場合

```
diskutil unmountDisk /dev/disk2
```

実際の書き込み処理(長い)

```
sudo dd if=CentOS.img.dmg of=/dev/disk2 bs=1m
```

終わり！
Sw③TableViewCell　nonHeaderTableCell （ヘッダー部分　スクロール固定 Cell  HEADER1 - HEADER3）

③TableViewCell　nonHeaderTableCell
（ヘッダー部分　スクロール固定
Cell  HEADER1 - HEADER3）

Xcode version 7.3.1

![完成.png](https://qiita-image-store.s3.amazonaws.com/0/93155/cc4862e0-1823-210c-df56-fbb993be69ce.png)
![009.png](https://qiita-image-store.s3.amazonaws.com/0/93155/fb29864c-de52-0893-47ef-47b78b220e75.png)

![001.png](https://qiita-image-store.s3.amazonaws.com/0/93155/b7c2bede-2b06-976c-814c-2096e5dbe996.png)

![002.png](https://qiita-image-store.s3.amazonaws.com/0/93155/e352c811-1d59-06d0-d3c0-b4d57872325e.png)

![003.png](https://qiita-image-store.s3.amazonaws.com/0/93155/6dbcc2f4-549e-58cc-b824-9bd661a906ec.png)

![004.png](https://qiita-image-store.s3.amazonaws.com/0/93155/7a6bd587-a23b-d875-1919-fe05ad2d1096.png)

![005.png](https://qiita-image-store.s3.amazonaws.com/0/93155/d6e8141e-bf2a-0455-75b5-c700e588c092.png)

![006.png](https://qiita-image-store.s3.amazonaws.com/0/93155/7fe0ab08-98f9-837f-5192-27e08a7bd94b.png)

![007.png](https://qiita-image-store.s3.amazonaws.com/0/93155/0fa8408a-1a28-7c1f-2de3-0a5bf08d3717.png)

![008.png](https://qiita-image-store.s3.amazonaws.com/0/93155/d6fc78f2-6394-065f-4c40-72f77be4063f.png)
備忘録：PHP開発環境準備

[いまどきのアルゴリズムを使いこなす PHPプログラミング開発テクニック](https://www.amazon.co.jp/%E3%81%84%E3%81%BE%E3%81%A9%E3%81%8D%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%82%92%E4%BD%BF%E3%81%84%E3%81%93%E3%81%AA%E3%81%99-PHP%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E9%96%8B%E7%99%BA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-%E3%82%AF%E3%82%B8%E3%83%A9%E9%A3%9B%E8%A1%8C%E6%9C%BA/dp/4802610440)
がなかなか面白そうだったのでPHPの学習にと思い購入した。PHPの開発環境は[XAMPP](https://www.apachefriends.org/jp/index.html)で手っ取りばやくすまそうかとも思ったが、VirtualMachineを使ったことがなかったのでこの本の通りに準備をした。
いろいろやって忘れそうなので、備忘録としてここに準備手順を書いておくことにした。


#仮想マシンの導入
仮想マシンの
-[VirtualBox](https://www.virtualbox.org/)
と
仮想環境構築ツールに
-[Vagrant](https://www.vagrantup.com/)
をインストールした。
どちらも[Chocolatey](https://chocolatey.org/)でインストールできた（chocoほんと便利)

```
cinst -y VirutalBox
cinst -y Vagrant
```
##Vagrantでの環境構築
```
$ vagrant box add phpdev https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box
$ vagrant init phpdev
$ vagrant up
```

1行目：phpdevという名前でbox(ubuntu)を追加
2行目：phpdevを初期化
3行目：仮想マシンの起動

vagrant initをしたときにvagrant設定ファイルのVagrantfileとその他ファイルがカレントディレクトリに作成されるので注意。
自分は管理者としてcmdを実行していて気づかずにSystem32ディレクトリでinitしてしまった。
upした後に気づいて仮想マシンを起動したままファイルを削除したら仮想マシンがゾンビ化してしまった。

ゾンビになってしまったときは
```
$ vagrant global-status --prune
```
でシャットダウンできる。

[[Vagrant] ゾンビ化した仮想マシンを消す方法](http://wordpress.ideacompo.com/?p=3702)
↑ここを参考にした。

#仮想マシンへのログイン
```
$ vagrant ssh
```
でSSH接続に必要な情報を表示してくれるので、
あとは適当なSSHクライアントを使用して接続する。

vagrantでインストールしたOSではユーザー名、パスワードともに"vagrant"になる。

##Vagrant設定ファイルの修正
ホストからゲストのWebサーバーを確認できるようにするためにVagrantの設定ファイルを修正する。
設定ファイルはinitを行ったディレクトリに作られるVagrantfileなのでこれを修正する、というか
必要な行のコメントアウトを外すだけ。

```
# config.vm.network "forwarded_port", guest: 80, host: 8080
```
↓
```
config.vm.network "forwarded_port", guest: 80, host: 8080
```

あとは
```
$ vagrant reload
```
で仮想マシンを再起動

#PHPとApacheをUbuntuにインストール
ubuntuにログインしたら、
```
$ sudo apt-get -y install apache2
```
でApacheをインストール

本の通りにPHP5.6以降をインストールする場合は
PPA（パーソナルパッケージアーカイブ）の追加が必要
```
$ sudo apt-add-repository ppa:ondrej/php5-5.6
$ sudo apt-get update
$ sudo apt-get -y install php5
```

ためしに↑を行う前に
```
$ sudo apt-get -y install php5
```
だけでPHPをインストールをしたらPHP5.5系（詳しいバージョンは忘れちゃった）がインストールされた（2016.8.28現在）



とりあえず以上で仮想マシンにPHP開発環境の準備手順はおわり


```
$ vagrant halt
```
で仮想マシンシャットダウン
Laravel 5.3 の新機能

2016年8月23日にリリースされたLaravel 5.3の新機能まとめ。

この記事は、Laravel Newsの["Laravel 5.3 is now released"](https://laravel-news.com/2016/08/laravel-5-3-is-now-released/)の抄訳。翻訳がこなれていないところや怪しいところもありますが、何かあればご連絡ください。

# 新しいホームページ

![alt](https://i0.wp.com/wp.laravel-news.com/wp-content/uploads/2016/08/laravel-homepage.png?resize=768%2C634)

新しいパッケージやLaravelコミュニティーの情報へのリンクが表示されるようになった。

# Laravel Scout

Eloquent用の新しい全文検索エンジン。ユーザのモデルにSearchable traitを追加することで機能する。データは選択可能な方法でインデックス化が行われ、次のように簡単に検索できる。
```
Post::search('Alice')->get();
```

# Laravel Passport

Laravel Passportにより、ものの数分で自分自身のOAuth2サーバーを配備することが可能となるオプションパッケージ。

# Laravel Mailable と Notifications

Laravel Mailable は、メール送信のためのクラスベースの新しい方法で、クロージャスタイルを必要とせず簡単にメールが送れるようになる。

Laravel Notifications により、Slack, テキストメッセージ、電子メールのようなサービスによる即座にアップデートを送ることが可能になる。
[“Laravel Notifications Channel”](http://laravel-notification-channels.com/)というコミュニティーが立ち上がっており、誰でもドライバーを公開でき、すでに２６のドライバーが公開されている。

# Laravel Echo

Laravel Echo は、今まであったweb socketで動くイベントブロードキャスティングシステムの改良版。Echoを利用するためのバックエンドはLaravelのコアに同梱されており、JavaScript側のNPMパッケージにpullする必要がある。

# マイグレーション

１ステップのロールバックが可能となった。
```
php artisan migrate:rollback --step=1
```
このオプションはこれまではなく、従来は複数ステップを一気にロールバックするしかできなかった。

# シンプル・ページネーション

Laravelは２つのページネーションを提供している。ページ番号を表示する高度なスタイルと、前後ページへのリンクのみを表示するシンプルなスタイルの２種。

このリリースから従来より簡単にビューファイルでシンプル・ページネーションの利用が可能となった。

# BladeのLoop変数

Laravel Bladeでは、ループ内でより細かい制御を可能とする新しい $loop 変数が導入された。次のようなプロパティがある。

- index – ループの数
- remaining – 残っているループの回数
- count – 全体のカウント
- first – 最初のループかどうか
- last – 最後のループかどうか
- depth – 何レベルの深さにいるか
- parent – ネスとしたループ内から親を呼び出す

参考ブログ -> [The new $loop variable in Laravel 5.3](https://mattstauffer.co/blog/the-new-loop-variable-in-laravel-5-3)

# ディレクトリ構成の変更

appフォルダからEvents, Jobs, Listeners, Policiesのからフォルダが削除された。ただし、互換性のため、aritisan make:コマンドによりこれらのフォルダを作ることができる機能が残されている。

# キューイングされたジョブ

[Eloquentコレクション](https://laravel.com/docs/5.3/eloquent-collections) は、個々のモデルに対する操作と同様に、キューイングされたジョブによって綺麗にシリアライズして引き出することができる。

これは、ジョブがキューイングされた時からEloquentコレクション内のデータが変更された場合に有益である。

# クエリービルダー

クエリービルダーはディフォルトでは配列ではなくコレクションを返すようになる。これは互換性に影響する変更が起こりうるが、クエリビルダからもEloquentからも同一形式で結果を受け取ることができるようになる。

# Cache ヘルパー関数

Laravel 5.3 は、新しくグローバルヘルパー関数cache()を用意している。これは背後にあるサービスに対してインスタンスをget, put, returnすることができる。

# ドキュメントの改定

このリリースではドキュメントに大きなオーバホールが行われた。インストールに始まってLaravelの公式パッケージ全体を見渡せるように章構成が改善された。また、関連する無料のLaracastsビデオへもリンクされている。オーディオやビデをを好む人にも読むのを好む人にも対応できるようになった。

# アップグレードガイド

今日から5.3を使い始めるために必要な情報を含んだアップグレードガイドを公式ドキュメントとして用意した。アップグレードに必要な時間の見積もりは2~3時間だ。

(original English article was written by Eric L. Barnes)
②TableViewCell　nonCategoryTableCell （カテゴリー Cell  Category1 - Category3）

②TableViewCell　nonCategoryTableCell
（カテゴリー
Cell  Category1 - Category3）

Xcode version 7.3.1

完成図
![完成.png](https://qiita-image-store.s3.amazonaws.com/0/93155/d3c761b0-381f-0a17-457d-3b572cef0020.png)


![001.png](https://qiita-image-store.s3.amazonaws.com/0/93155/6e4b7d20-8d11-0867-0b14-233843694816.png)

![002.png](https://qiita-image-store.s3.amazonaws.com/0/93155/5aba9614-a613-e9a8-9569-a45286404649.png)

![003.png](https://qiita-image-store.s3.amazonaws.com/0/93155/ffb590fd-6e61-75e1-2a46-e6363c31b849.png)
VaporでViewsの中をそのまま返す

# 概要
簡単な静的ページであれば、ルーティングにワイルドカードを使ってパスで返せるメモ。

# 実装
```swift:main.swift
drop.get("*") { request in
  var path = request.uri.path.characters
  path.removeFirst()
  
  return try drop.view(String(path))
}
```

# 参考文献
 - [VAPOR Docs (Basic Routing: Fallback)](https://vapor.github.io/documentation/routing/basic.html#fallback)
git　コミット履歴を変更する


一度コミットした後でちょっとした修正を加える事ってある。
そんなときに
git add
git commit
してもいいんだけど、これだとログが残る。
大した変更じゃない場合な度、ログを残したくないときに使えるのが
# git commit -amend
である
アメンドは変更って意味らしい。
これだとログが追加されないで変更することができる。
便利そう。
structではなくinterfaceにScanした値を入れる

__Gorm__や__sqlx__のようなGolangのデータベースライブラリではプリミティブな機能である`(*DB) Rows`と`(*Rows) Scan`が使用できる。
`(*Rows) Scan`の引数は大抵の場合structで紹介されているがinterface{}にScanした値をいれることができる。

以下がスニペット。

```go

rows, err := sql.Rows()

var results []map[string]interface{}
cols, err := rows.Columns()

for rows.Next() {
	var row = make([]interface{}, len(cols))
	var rowp = make([]interface{}, len(cols))
	for i := 0; i < len(cols); i++ {
		rowp[i] = &row[i]
	}

	rows.Scan(rowp...)

	rowMap := make(map[string]interface{})
	for i, col := range cols {
		switch row[i].(type) {
		case []byte:
			row[i] = string(row[i].([]byte))
			num, err := strconv.Atoi(row[i].(string))
			if err == nil {
				row[i] = num
			}
		}
		rowMap[col] = row[i]
	}

	results = append(results, rowMap)
}

```
英文をタップして、単語単位で選択する

	protected override void OnCreate(Bundle bundle)
	{
		base.OnCreate(bundle);

		SetContentView(Resource.Layout.Main);

		TextView textview = (TextView)FindViewById(Resource.Id.textView1);
		textview.TextFormatted = new Android.Text.SpannableString("Chapter 1\n\nThis is a pen.\nThis is a window.");
		textview.SetTextIsSelectable(true);

		textview.Touch += delegate (object sender, View.TouchEventArgs e)
		{
			var widget = (TextView)sender;
			var buffer = (Android.Text.ISpannable)widget.TextFormatted;

			if (buffer.Length() != 0 && (e.Event.Action == MotionEventActions.Up || e.Event.Action == MotionEventActions.Down || e.Event.Action == MotionEventActions.Move))
			{
				if (e.Event.Action == MotionEventActions.Up)
				{
					var line = widget.Layout.GetLineForVertical((int)e.Event.GetY() + widget.ScrollY - widget.TotalPaddingTop);
					var offset = widget.Layout.GetOffsetForHorizontal(line, (int)e.Event.GetX() + widget.ScrollX - widget.TotalPaddingLeft);

					if (buffer.CharAt(offset) != '\n')
					{
						int start = int.MaxValue;
						for (int i = offset - 1; i >= 0; i--)
						{
							if (Java.Lang.Character.IsLetterOrDigit(buffer.CharAt(i)) != true)
							{
								start = i + 1;
								break;
							}
						}

						int end = int.MinValue;
						for (int i = start + 1; i < buffer.Length(); i++)
						{
							if (Java.Lang.Character.IsLetterOrDigit(buffer.CharAt(i)) != true)
							{
								end = i - 1;
								break;
							}
						}

						if (end >= start)
						{
							Android.Text.Selection.SetSelection(buffer, start, end + 1);
						}
					}
				}
				else if (e.Event.Action == MotionEventActions.Down)
				{
					//
				}
				else if (e.Event.Action == MotionEventActions.Move)
				{
					//
				}
			}
			else
			{
				Android.Text.Selection.RemoveSelection(buffer);
			}
		};			
	}
}
swift Protocolで型宣言することで動的な型付けを実現する


# 背景
swiftは強力な型付け言語であるため、全ての変数の型はコンパイル時には決定している必要がる。
ゆえに以下の様なコードがかけない。

```swift:compile_error.swift
struct A { }
struct B { }


// コンパイルエラー  mismatching types 'A' and 'B'
let o = genRandomBoolValue() ? A() : B()

```

# Protocolで型宣言を行うとことで動的型付けの実現

上記の型A, Bを以下のように共通のProtocolを持つようにすれば、
実行時に型を動的に決定させることが出来ます。

```swift:dinamic_dispatching_type.swift
protocol P { 
    var name: String { get }
}

struct A: P { var name = "I am A" }
struct B: P { var name = "I am B" }

let o: P = genRandomBoolValue() ? A() : B()
print(o.name)
```

# Protocolを型宣言で用いれる所
* ローカル変数の型宣言
* 関数の仮引数の型宣言
* 関数の返り値の型宣言

# デメリット
* プロトコルで型宣言された変数は、プロトコルで定義されている機能のみ有効である。  
　 値として代入された型独自の機能を使う場合は、どこかでキャストする必要がある。
* プロトコルで型宣言できるプロトコルが限られている。(Self, 関連型を持っていないプロトコルのみ)
git 管理したくないファイルの扱い方


git の対象にしたくないファイルってどう扱うの？
例えばログファイルとかテンポラリファイルとか
そんなときに便利なのが
#.gitignore
です。

使い方は簡単で作業ディレクトリにこのファイルを作れば🆗

```
vim .gitignore
```

このファイルの中で
.log
と書けば、error.log などのファイルが管理対象外となる
これは便利

履歴をとることに意味がない
ファイルサイズが大きいなどで管理対象から除外したい場合は使ってみてください
takewhileとdropwhileでパス加工


何かを探すなら`find`みたいなメソッドがあるし、`filter`みたいにも使えないし、
`takewhile`と`dropwhile`っていつ使うんだろうと思ってた

けど先日うまく(?)使えた気がしたので小ネタとしてぶん投げておくよ

### 長い前置き
#### こんなパスが文字列であって
```
data/output/user/contract.csv
```

#### 任意の部分が欲しい
`outputまで`の部分(baseとする)と`user`の部分(dirとする)とする

#### とりあえずこの実装で動いてた
```Groovy
def base = path.split('/')[0..1].join('/') // data/output
def dir = path.split('/')[2]               // user
```

#### ディレクトリ、もっと切りたくなっちゃった！
```
data/ver1.0/output/user/contract.csv
```

むむ...添え字ずらしたぜ...

```Groovy
def base = path.split('/')[0..2].join('/') // data/ver1.0/output
def dir = path.split('/')[3]               // user
```

#### ツールのテストコード書こうぜ！
テストで使うダミーデータはこれな！

```
test/data/ver1.0/output/user/contract.csv
```

i...if使えば良いんだろ...はは...

```Groovy
if (isTest) {
  def base = path.split('/')[0..3].join('/') // test/data/ver1.0/output
  def dir = path.split('/')[4]               // user

} else {
  def base = path.split('/')[0..2].join('/') // data/ver1.0/output
  def dir = path.split('/')[3]               // user
}
```

#### いくらなんでもこの実装はないね
添え字アクセスじゃあわかりづらいし、ディレクトリ構造の変化に全く耐えられてない
しかもフラグで添え字を変えるなんてサイテーだ！

### そこでtakewhile/dropwhileだ！
`.../output`までが欲しいならtakewhileで、
`outputの次`が欲しいならdropwhileで良かったんだ！

```Groovy
def base = path.split('/').takeWhile {it != 'output'}.join('/').concat('/output') // data/ver1.0/output
def dir = path.split('/').dropWhile {it != 'output'}[1]                           // user
```

これならある程度は柔軟に自動に対応できるね（ツール設計上の理由等で`output`以下の構成は変わらない場合だけど）
それにしても、実は`takewhile`は初めて書いてみたんだけど、`output`は含まないんだね...そこだけちょい残念かな...

### おまけ
#### Groovy
書きやすいね、例の通り
メソッドチェインは読みやすいし、無名関数書くのも楽でベネ

#### Python
```Python
path = 'data/ver1.0/output/user/contract.csv'

import itertools

taken_iter = itertools.takewhile(lambda x: x != 'output', path.split('/'))
print '/'.join(list(taken_iter)) + '/output' # data/ver1.0/output

dropped_iter = itertools.dropwhile(lambda x: x != 'output', path.split('/'))
print list(dropped_iter)[1]                  # user
```

Python好きだけど、ちょっと残念かな...
xxxwhileがimportしてメソッド呼び出しってのと、結果に`list()`や`join()`かけないといけないので
1行で書くと`....))))`になってしまう
無名関数もGroovyやScalaと比べるとやや読みづらく、全体的に何しているか流れがわかりづらい、無念！

#### Haskell
```Haskell
import Data.List
import Data.List.Split

main = do
    let path = "data/ver1.0/output/user/contract.csv"

    print $ (intercalate "/"  $ (takeWhile (/= "output") $ splitOn "/" path)) ++ "/output"
    print $ (dropWhile (/= "output") $ splitOn "/" path) !! 1
```

やはりやることが多いからか、`(...)`が多くなってしまう...
あと本題とは関係ないけど、`splitOn`がインストールしないと使えないってどうなの！
結構よく使うんだけど！

#### Haskell2
```Haskell
import Data.List
import Data.List.Split

main = do
    let path = "data/ver1.0/output/user/contract.csv"

    let reversed = reverse $ splitOn "/" path
    print $ intercalate "/" $ reverse $ dropWhile (/= "output") reversed
    print $ last $ takeWhile (/= "output") $ reversed
```

takeWhileだと肝心の`output`が結果に含まれないので、要素を逆順にしてみた
すっきりしたかな！

他にもPHPとか考えてみたけど目立った差分が出なさそうだったので省略、Javaは面倒そう（偏見）だから却下
色んな言語で書いてみると色んな関数を知れて良いね！

どうしていつもこんだけの小ネタで長くなってしまうのか...
でも、便利さを伝えるにはダサさからだよね！

あとね、「文字列のままのパス」を「output」で分割すれば良いとか言う意見はなしね！
①TableViewCell　nonCustomTableViewCell（Cell  福岡、熊本、長崎）


Xcode version 7.3.1
swift
①TableViewCell　nonCustomTableViewCell（Cell  福岡、熊本、長崎）

完成図
![完成.png](https://qiita-image-store.s3.amazonaws.com/0/93155/102f7ec3-562d-2b1c-4e42-7a4076d47923.png)



![001.png](https://qiita-image-store.s3.amazonaws.com/0/93155/be12a4d0-668b-c1fa-ea0d-3189ec070315.png)
![002.png](https://qiita-image-store.s3.amazonaws.com/0/93155/be6397af-50d0-f8f4-45ad-75c939f89ac3.png)
![004.png](https://qiita-image-store.s3.amazonaws.com/0/93155/d2d26bbb-0695-f426-ec07-8fc045673ae9.png)
![005.png](https://qiita-image-store.s3.amazonaws.com/0/93155/b187a241-71d5-89d6-30fc-0fdbfc28c741.png)
![006.png](https://qiita-image-store.s3.amazonaws.com/0/93155/6573050e-11ff-c236-992d-b044f2c27955.png)
アプリからNFCをオンオフする

NFCのオンオフのためのAPIは公開されてないのでリフレクションで非公開のAPIを呼ぶ必要がある．また，この操作にはWRITE_SECURE_SETTINGSが必要で，この権限はシステム署名がされているか，/system/priv-appにインストールされているアプリでしか有効でないことに注意する[^1]．

# テストした環境
* Android 7.0
* Nexus 5X (NRD90M)

# コード
```xml:AndroidManifest.xml(抜粋)
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
```
```java:setNfcState
public static final int NFC_STATE_DISABLE = 0;
public static final int NFC_STATE_ENABLE = 1;

public boolean setNfcState(Context context, int newState) {
    NfcManager nfc = (NfcManager)context.getSystemService(Context.NFC_SERVICE);
    NfcAdapter adapter = nfc.getDefaultAdapter();
    Method setEnable = null, setDisable = null;
    try {
        Class<?> NfcAdapterClass = adapter.getClass();
        setEnable = NfcAdapterClass.getDeclaredMethod("enable");
        setEnable.setAccessible(true);
        setDisable = NfcAdapterClass.getDeclaredMethod("disable");
        setDisable.setAccessible(true);
    } catch (NoSuchMethodException e) {
        return false;
    }
    try {
        if (newState == NFC_STATE_ENABLE) {
            setEnable.invoke(adapter);
        } else {
            setDisable.invoke(adapter);
        }
    } catch (InvocationTargetException|IllegalAccessException e) {
        return false;
    }
    return true;
}
```
```java:使用例
private void toggleNfcState() {
    NfcManager nfc = (NfcManager)getSystemService(Context.NFC_SERVICE);
    NfcAdapter adapter = nfc.getDefaultAdapter();
    boolean ret = false;
    boolean enabled = adapter.isEnabled();
    if (enabled) {
        ret = setNfcState(this, NFC_STATE_DISABLE);
    } else {
        ret = setNfcState(this, NFC_STATE_ENABLE);
    }
    if (ret) {
        Toast.makeText(this, "NFCの状態を" + (enabled ? "無効" : "有効") + "にしました", Toast.LENGTH_SHORT).show();
    } else {
        Toast.makeText(this, "NFCのオンオフ切り替えに失敗しました", Toast.LENGTH_SHORT).show();
    }
}
```

# /system/priv-appへのインストール
この方法でNFCをオンオフさせるには，アプリをシステムアプリとして動作させる必要がある．システムアプリとしてインストールするには上述の通り2つの方法があるようだが，今回は/system/priv-appにインストールする方法を使用した．ちなみに，一度/system/priv-appに入れてしまえば，その後のアップデートは普通にアップデートしてもNFCのオンオフが可能なようだ．

/system/priv-appにインストールする方法について，/systemをrwマウントした上で以下のようなコマンドを実行するか，ESファイルエクスプローラなど/systemを読み書きできるファイラアプリを使って同様の操作を行えば，作成したアプリをシステムアプリとしてインストールできる．
<pre>
\# $appnameは適当なアプリ名，$apkpathはシステムアプリとしてインストールするapkのパス
cd /system/priv-app
mkdir $appname
chmod 755 $appname
cd $appname
cp $apkpath .
chmod 644 $apkpath
reboot
</pre>

# 参考ページ
* [android - How can I enable NFC reader via API? - Stack Overflow](http://stackoverflow.com/questions/6509316/)

[^1]: 詳しくはこちらを参照: [Androidエミュレータでシステム署名が必要な処理の動作を確認する - Qiita](http://qiita.com/le_skamba/items/a7a822846bae91ecc2f3)
git ちょっと便利な機能立ち


超初心者向けの記事です。
ステータスや差分を見るときに便利なコマンドを覚えておこう。
その前に基本てきなフローは

```
git add
git commit
```

ですね。このコミットまでの流れで便利なコマンドを記載しておきます。

###現状と次に何をすれば良いか教えてくれる

```
git status
```

###コミットされているものと、カレントファイルの差分

```
git diff
```

###ステージングエリアのファイルと、コミットされているファイルとの差分でgit add した後に差分を見るときに使う

```
git diff --cached
```


###まとめてadd

```
git add .
```
8/28　今日の学習内容～cloud9でコントローラとアクションの作成！～

###今日の学習内容
***
今日も前回同様、改訂３版基礎Ruby on RailsでRuby on Railsの学習を進めていきました。
>[改訂３版基礎Ruby on Rails (Amazonのページ)](https://www.amazon.co.jp/dp/4844338153)　

cloud9でRailsのコントローラとビューを作成し、Webページ上に"Hello World!"と表示させることが今日の学習内容になります(-ω-)/

####cloud9でコントローラとビューを作成
***
前回の続きからになりますが、まずはコントローラを作成していきたいと思います。

ターミナルに移動後、``bin/rails g controller top index``と打ち込み、実行します。
``bin/rails g コントローラ名　アクション名``コマンドでコントローラとアクションを作成できるようです。
(赤枠内がターミナルです。bashとあるところですね。)

![cloud9_9.png](https://qiita-image-store.s3.amazonaws.com/0/137880/7766c7ca-9f09-82d5-9de5-397cc079f933.png)


ちなみにコントローラとは、ブラウザーからの入力を受け取る、データをモデルに要求する、データの追加や変更をモデルに示する、などの役割をするものです。
アクションはコントローラが実行する具体的なお仕事のことと思ってもらえればいいと思います(-ω-)/

つぎに、``アプリケーション名/controllers``ディレクトリ（私の場合は``asagao/controllers``）に今回作った``top_controller.rb``というファイルが確認できるかと思います。

![cloud9_10.png](https://qiita-image-store.s3.amazonaws.com/0/137880/fc759363-0164-c00d-b842-d4f716cde65c.png)

**これでコントローラとアクションの作成ができました！**

####ルーディングの設定をする
***
コントローラとアクションを作っただけでは、残念ながらRailsアプリケーションのページとして動くことはないのです(´;ω;｀)
URLとコントローラを結びつける作業をしてあげないといけません。

まず、``config``の下にある``routs.rb``を開いてください。

次に``Rails.application.routes.draw do``と``end``の中を``root "top#index"``に変更します。

![cloud9_13.png](https://qiita-image-store.s3.amazonaws.com/0/137880/23c4d9a0-b2d1-be18-1833-cfca931a4ce2.png)

これでトップページに対応するコントローラとアクションが先ほど作成したコントローラとアクションに変更されました。


####ビューの作成
***
続いて、Webページ上にHello World!と表示させるために見た目を作るビューをいじってみたいと思います(*‘∀‘)

``app/views/top``ディレクトリの``index.html.erb``（赤枠内）を開きましょう！

![cloud9_11.png](https://qiita-image-store.s3.amazonaws.com/0/137880/2ab3d7b6-97f2-b919-a556-311155e81aff.png)

拡張子の``.erb``はRailsのビューのためのテンプレートファイルであることを示しているそうです(-ω-)/

このhtmlファイルの``<h1></h1>``の間を編集して、``<h1>Hello World!</h1>``に変えてみましょう。

![cloud9_12.png](https://qiita-image-store.s3.amazonaws.com/0/137880/dadd782d-6236-11c9-ca29-77deb2d169e2.png)

そのあとに``rails s -b $IP -p $PORT``コマンドでRailsサーバを再起動します。

![cloud9_14.png](https://qiita-image-store.s3.amazonaws.com/0/137880/08205a8a-5edb-5498-709a-33ab6c91090d.png)
**Hello World!と表示されました！**


###あとがき
***
今日はコントローラとアクションを作成したのち、ビューの中身を変更して``Hello World!``に変えることができました。
なんだかWebページを作り始めた気がしてきました(笑)
次回も改訂３版基礎Ruby on Railsを使って学習していきます(-ω-)/
ここまで読んでいただき、ありがとうございました(*- -)(*_ _)ペコリ

###参考にさせていただいたサイトなど
***
>[改訂３版基礎Ruby on Rails (Amazonのページ)](https://www.amazon.co.jp/dp/4844338153)
Python 2 と Python 3 では四捨五入の仕様が違う

とあるプログラミングで解くクイズ的なサイトで遊んでいると、奇妙なことが起きた。

そのサイトでは回答に使える言語が豊富にあり、クイズの正誤を複数のテストケースの通過で判定する。

Python 2 で解いた問題を Python 3 用にほんの少しだけ書き換えて提出したところだった。

10 個ほどあるテストケース。

そのうちの 1 個だけが通過できずに失敗する。

なんでだろう。

単純に `print ANSWER` を `print(ANSWER)` に書き換えただけである。その程度の変更で問題ないと思っていた。

なぜ？

どこかに知らない癖があるのだろうか。

その問題はひとつのテストケースでも相当な数の計算の答えを要求される。その上で通過に失敗するテストケースはひとつなのだから、計算の根っこの仕様が変わっているわけではなさそうだ。

癖…。

なんとなく怪しげなのは四捨五入だった。

環境
----

- Python 2.7.11
- Python 3.5.1

参考
----

- [Language differences and workarounds — Supporting Python 3 - The Book Site](http://python3porting.com/differences.html)
  - [Rounding behaviour](http://python3porting.com/differences.html#rounding-behavior) の項目
- [端数処理 - Wikipedia](https://ja.wikipedia.org/wiki/%E7%AB%AF%E6%95%B0%E5%87%A6%E7%90%86)
  - [最近接偶数への丸め](https://en.wikipedia.org/wiki/Rounding#Round_half_to_even) の項目

四捨五入の仕様が違っていた
----

検索したらあっさり出てきた。

### Python 2

Python 2 では値を 0 から遠ざける形で値を丸める。

~~~python2
>>> round(1.5)
2.0
>>> round(2.5)
3.0
~~~

日本で一般的な四捨五入だ。

### Python 3

Python 3 では丸めた先の値が偶数になるように値を丸める。

~~~python3
>>> round(1.5)
2
>>> round(2.5)
2
~~~

[Wikipedia](https://en.wikipedia.org/wiki/Rounding#Round_half_to_even) によると、このやり方だと値の正負による誤差が小さいらしい。

### その他の違い

Python 2 と Python 3 では出力されている数値の型も違うようだ。

Python 3 の round 関数では第 2 引数で丸める桁の位置を指定できる。省略すると、結果が integer 型になる。小数点以下を削った上で、結果を float 型で欲しい場合は 0 をつける。

~~~python3
>>> round(2.5, 0)
2.0
~~~

ソースでの違い
----

なんとなく気になって Python のソースを見比べてみた。

round の処理は Objects/floatobject.c の double_round 系の関数らしい。

表現を「系」としているのは微妙に名前が違うからで、 Python 2 では _\_Py_double_round(double, int)_ で Python 3 では _double_round(double, int)_ がそれにあたる。

肝となる部分は以下。

~~~c:Python-2.7.11/Objects/floatobject.c 
z = round(y);
if (fabs(y-z) == 0.5)
  /* halfway between two integers; use round-away-from-zero */
  z = y + copysign(0.5, y);
~~~

~~~c:Python-3.5.1/Objects/floatobject.c
z = round(y);
if (fabs(y-z) == 0.5)
  /* halfway between two integers; use round-half-even */
  z = 2.0*round(y/2.0);
~~~

要点だけを取り出したので一部補足。

C の round 関数は整数への変換にしか対応しておらず、その変換仕様は Python 2 と同じ round-away-from-zero である。

y は その整数化されてしまう仕様から、事前に四捨五入する桁に合わせて小数点の位置を動かしたものだ。例えば小数点以下 2 位に丸めたい場合 1.259 は 125.9 に調整される。

z は round 関数を使い y を整数化したもの。

y と z の差が絶対値で 0.5 のときに、それぞれ違った処理になる。

へえ。

### 確かめてみる

C に詳しいわけじゃないのと、やはりなんとなく気になって、上記の部分から比較するコードを書いてみる。

~~~c:test_roundings.c
#include<stdio.h>
#include<math.h>

double round_half_even(double d) {
  return 2.0 * round(d / 2.0);
}

double round_away_from_zero(double d) {
  return d + copysign(0.5, d);
}

void print_rounds(double d) {
  printf("(%lf)\n", d);
  printf("half even:      %lf\n", round_half_even(d));
  printf("away from zero: %lf\n", round_away_from_zero(d));
  printf("\n");
}

int main() {
  print_rounds(0.5);
  print_rounds(1.5);

  return 0;
}
~~~

コンパイルして実行。

~~~
(0.500000)
half even:      0.000000
away from zero: 1.000000

(1.500000)
half even:      2.000000
away from zero: 2.000000
~~~

うん、OK。
アプリがシステムアプリとしてインストールされているか確認する

Androidで自分自身がシステムアプリとしてインストールされているかどうか確認する場合，次のコードで確認することができる．

この関数でtrueが返ってきた場合はシステムアプリとしてインストールされており，falseが返ってきた場合はユーザアプリとしてインストールされている．

```java
public boolean isSystemApp(Context context) {
    return (context.getApplicationInfo().flags & ApplicationInfo.FLAG_SYSTEM) != 0;
}
```
git のきほん


#概要
以下の三つにわかれる
1.作業ディレクトリ
2.ステージングエリア（インデックス）
3.リポジトリ（ローカル、リモートに分かれる）

にわかれる

#基本設定
```
$ git config --global user.name "hogehoge"//User name
$ git config --global user.email "hoge@hoge.com"//Email Address
$ git config --global color.ui auto// Color設定
$ git config --global color.ui true// Color設定
$ git config -l//設定値確認
```
#基本コマンド
##ヘルプ
```
git config --help
git help config
```
##簡単なフロー
```
$ vim index.html  //ファイルを作成して適当に編集
$ git add index.html //作業ディレクトリからステージングエリアへ登録
$ git commit //ステージングエリアからリポジトリへ登録
[master (root-commit) ac42898] initial commit
 1 file changed, 1 insertion(+)
 create mode 100644 index.html```
git log
```
こんな感じで簡単にCommitできた。
commitするとエディタが立ち上がるから適当に編集すること

エディタが立ち上がらない場合は以下で設定しましょう

```
$ git config --global core.editor vim
$ git config --global core.editor vi
```
クロスサイトスクリプティングって何だ？

Wikipediaによると

>クロスサイトスクリプティング（英: cross site scripting）とは、
>ウェブページの部分をユーザからの入力をそのままエコーバック
>（オウム返し）することによって生成しているアプリケーションの
>セキュリティ上の不備を利用して、サイト間を横断して悪意のある
>スクリプトを注入する攻撃のことをいう。また経緯上、
>それを許してしまう脆弱性についても、このように呼ばれている。

とのことらしい。
全然わからんかったので、自分でHTMLを書いてみたらようやく理解できた。

#超簡単なXSSのサンプル
入力内容をそのままページに表示するプログラムを書いてみる。

```html:before_xss.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
</head>
<body>
  <p></p>
  <h4><a href="http://google.com">Google</a></h4>
  <ul>
    <li>今日はいい天気</li>
  </ul>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <input type="text" name="name" id="inputed_text" value="">
  <input type="button" name="name" id="btnRegist" value="投稿">
  <script type="text/javascript">
    $(function() {
      $('#btnRegist').on('click', function() {
        var inputed_text = $('#inputed_text').val();
        $('ul').append('<li>'+ inputed_text +'</li>');
      });
    });
  </script>
</body>
</html>
```
<img width="212" alt="スクリーンショット 2016-08-28 20.22.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/388ba6fa-08ca-3dcc-9400-1d181563db29.png">

投稿ボタンを押すと入力内容がそのままページに表示される。これはサンプルとしてHTMLだけで書いたが、実際には入力内容はサーバーに保存され、このWebサービスを使う全ユーザが同じ内容を共有できるようになっていると仮定する。


この入力欄に下記のような一文を挿れて投稿してみる。

```html:input
</li>
<script type="text/javascript">
  $('a').attr('href','http://yahoo.co.jp');
</script>
<li>
```

するとHtmlはこのようになる。

```html:after_xss.html
<html lang="ja"><head>
  <meta charset="utf-8">
</head>
<body>
  <p></p>
  <h4><a href="http://yahoo.co.jp">Google</a></h4>
  <ul>
    <li>今日はいい天気</li>
  <li></li> <script type="text/javascript">   $('a').attr('href','http://yahoo.co.jp'); </script> <li></li></ul>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <input type="text" name="name" id="inputed_text" value="">
  <input type="button" name="name" id="btnRegist" value="投稿">
  <script type="text/javascript">
    $(function() {
      $('#btnRegist').on('click', function() {
        var inputed_text = $('#inputed_text').val();
        $('ul').append('<li>'+ inputed_text +'</li>');
      });
    });
  </script>
</body></html>
```

ul要素（リスト）の中にscriptが埋め込まれ、Googleのリンク先が
Yahoo!JAPANに変わっている。

今回のサンプルはリンク先を変えただけだが、input要素のPostの送信先を改ざんしてクレジットカード番号を抜き取るというようなことが行われているらしい。

#対策は？
入力内容に含まれる危ない文字（<とか>とか&やら）をエスケープするのが基本的な対策法。

RubyOnRailsはRails2までは、明示的なエスケープ処理を書く必要があったけどRails3からはエスケープがデフォルトになったんだそう。
[Visual Studio 2015 C#] クイックアクションの「○○を通じてインターフェイスを実装します」がかなり便利

```csharp:sample.cs
class Main : ITest
{
    Test test = new Test();

}

class Test : ITest
{
    public string function()
    {
        return "test";
    }

}

interface ITest
{
    string function();
}

```
委譲したクラス（Testクラス）に対して、委譲した機能（ITestインターフェイス）を外側から見たときに、
分からないようにする（簡単にアクセスしたい）場合には、クイックアクションの「○○を通じてインターフェイスを実装します」がかなり便利。

上記の例だと、Mainの横のITestに対して、クイックアクションを実行すれば、functionをTestインスタンスを用いて自動生成してくれる。
chocolatey の導入方法

chocolatey は、Linux での apt-get や yum に相当する、パッケージ管理機能です。

1. chocolatey のインストール  
Chocolatey Gallery 配下の、Installing Chocolatey 参照  
https://chocolatey.org/install

コマンドプロンプトを管理者権限で実行し、以下のコマンドを入力する。
<pre>
@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
</pre>

2.パッケージの管理コマンド
(1) パッケージリストの取得
choco list -lo

(2) 単一パッケージのインストール (例：gimp)
choco install [packageName]
choco install -y gimp

(3) 複数パッケージをまとめてインストール
choco install [packageName] [packageName] [packageName]
cinst -y dropbox gimp adobereader ccleaner skype recuva git firefox

(4) パッケージの更新
chocolatey upgrade [packageName]
chocolatey update [packageName]

(5) インストールしたパッケージ全体の更新
chocolatey upgrade all -y
chocolatey update all

(6) パッケージのアンインストール
chocolatey uninstall [packageName]
chocolatey updateとした場合は、Chocolateyを最新のバージョンにアップデート

3.ChocolateyGUIをインストール
choco install ChocolateyGUI
QUIC に関する調査メモ



## QUIC についての資料
- https://tools.ietf.org/html/draft-hamilton-early-deployment-quic-00
    - QUICプロトコルのドラフト
- http://www.iij.ad.jp/company/development/tech/techweek/pdf/151111_4.pdf
    - 2015年11月11日の資料
- https://www.chromium.org/quic/quic-faq
    - QUIC の FAQ
- https://www.chromium.org/quic/playing-with-quic
    - QUIC をとりあえず試すための資料
- http://d.hatena.ne.jp/ASnoKaze/20140515/1400166446
    - quic_clientとquic_serverを試してみる
- https://groups.google.com/a/chromium.org/forum/#!topic/proto-quic/lAdf4qvU-LY
    - quic_clientとquic_serverに関する議論
- https://bugs.chromium.org/p/chromium/issues/list?can=2&q=QUIC%20component:Internals%3ENetwork%3EQUIC&colspec=ID%20Pri%20M%20Stars%20ReleaseBlock%20Component%20Status%20Owner%20Summary%20OS%20Modified
    - Chromium の QUIC に関する issues


## QUIC の実装
- Chromium
- [libquic](https://github.com/devsisters/libquic)
    - chromium のソースコードからライブラリを構成している。goquicのベース
- [goquic](https://github.com/devsisters/goquic)
    - libquicのGo言語用バインディング
- [proto-quic](https://github.com/google/proto-quic)
    - Google製ではあるが、非公式サポート版。
    - QUIC開発者のサイドプロジェクト
    - Linuxのみサポートしているが、WindowsとiOSをサポート予定
- [quic-go](https://github.com/lucas-clemente/quic-go)
    - QUICのGo言語実装
- [quic-version-detector](https://github.com/povilasb/quic-version-detector)
    - QUICサーバの対応バージョンを列挙してくれるコマンド

## Chromium での QUIC 接続テスト
- Ubuntu 16.04
- Chromium 51.0.2704.79

google.co.jp に対して強制的にQUICプロトコルでアクセスする。


```sh
chromium-browser --enable-quic --origin-to-force-quic-on=www.google.co.jp:443 --quic-version=QUIC_VERSION_30 https://www.google.co.jp
```

`--quic-version=QUIC_VERSION_30` オプションは、QUICのバージョンを指定できる。末尾の数字変更することでバージョンを指定できる。

アクセス後に、 chrome://net-internals/#quic を開くと、 www.google.co.jp:443 を確認できる。

ネットワーク環境によっては、アクセスできない時がある。自宅のネットワーク有線回線で繋がらない場合は、モバイルネットワークに切り替えると繋がりやすかった。


## QUICサーバの対応バージョンを確認

QUIC はドラフト版なので、バージョンが変更される。このため、サーバが最新のQUICバージョンに対応しているとは限らない。クライアント側から、サーバの対応バージョンを確認する必要がある。確認するには、[quic-version-detector](https://github.com/povilasb/quic-version-detector) を利用できる。

Ubuntu 16.04でのインストール

```sh
sudo apt install python3-pip
sudo pip3 install --upgrade quic-version-detector
```

実行

```sh
quicver www.google.co.jp 443
```

結果

```
"www.google.co.jp:443" supported versions:
     Q036
     Q035
     Q034
     Q033
     Q032
     Q031
     Q030
```

## proto-quic に関するメモ
### サンプルクライアントの実行

```sh
cd src
./out/Release/quic_client --host=`dig www.google.com +short | head -1` --quic-version=32 --port=443 http://www.google.com
```
https://github.com/google/proto-quic/blob/master/src/net/net.gyp の quic_client ターゲットを見ると、 QUIC のアプリ作成に必要なライブラリがわかる。net.gypを流用できそうだ。

## caddy に関するメモ

caddy のインストール

```sh
go get github.com/mholt/caddy/caddy
```

caddy を QUIC で実行

```sh
caddy -quic
```

実行できたものの、クライアントからアクセスできていない。

## メモ欄
- https://github.com/google/proto-quic/blob/a464dfcce267fd28c45ffc2eb5a7bdcbeb0cf81d/src/net/quic/core/quic_session.h
    - WriteData と SendRstStream が役立ちそう。
- https://github.com/google/proto-quic/blob/a464dfcce267fd28c45ffc2eb5a7bdcbeb0cf81d/src/net/tools/quic/quic_socket_utils.h
rex0220 一覧メニュープラグイン

kintone アプリで、一覧・グラフ画面をメニュー表示するプラグインです。
一覧の数が増えると、目的の一覧を探すのが大変ですが、メニューに整理されているとわかりやすく効率的です。

- 一覧・グラフ対応
- PC・モバイル対応
- ３ヶ国語対応
- [一覧権限設定プラグイン](http://qiita.com/rex0220/items/37c4faa29aa013e76eda)と連動して、メニュー内の一覧も表示制御します

[rex0220 stores](https://rex0220.stores.jp) で、販売中です。

# 直近の変更点

Ver.12
・プラグイン設定画面のデザイン変更対応
・プラグイン設定に、「説明」設定機能を追加

# 一覧メニューの表示例

- PC 表示例

![vmenu01.png](https://qiita-image-store.s3.amazonaws.com/0/100572/5464f4df-cfbb-65ea-3806-c1df4f5f810f.png)

メニューを展開した例
![2021-05-24_12h58_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/1145115f-c2b5-2f93-b289-546aa11a0e73.png)


- モバイル表示例

![2021-02-18_21h44_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/b67412ab-ab07-5df7-904c-7c394ef79cae.png)


#プラグインの追加

![vmenu11.png](https://qiita-image-store.s3.amazonaws.com/0/100572/5fd99855-da52-95f9-19da-d75805e06d8b.png)

#プラグインの設定

- プラグイン有効：　プラグインの有効／無効を指定。
- NOTE：　プラグイン設定のメモ用
- メニュー： メニュー表示されます。
- 英：英語表記時のメニュー
- 日：日本語表記時のメニュー
- 中：中国語表記時のメニュー
- 概要：　メニューでカーソルを合わせるとポップアップ表示されます。
- 一覧：　表示指定された一覧・グラフ
    - V: 一覧、R: グラフ
- 編集ボタン：　一覧の設定画面を表示します。
- 運用環境に反映：　「保存」クリック時に、直接運用環境に反映されます。

![2021-05-24_13h01_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/90446263-48a6-18de-0b50-56b048a108b9.png)


#サブメニューの設定

- 未選択一覧リストの一覧をクリックすると、選択済みリストに移動します。
- 選択済リストの並び順は、選択順です。
- 選択済みリストの一覧をクリックすると、未選択一覧リストに移動します。
- 「保存」ボタンをクリックして、設定します。

![2021-05-24_13h02_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/4f89ea52-bead-e139-f14a-6e1273893901.png)


# 設定行の移動

左端のアイコンをドラッグアンドドロップで、行移動できます。

![2019-12-16_00h56_12.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/c834333f-0c65-1a4d-3271-9e617ba207db.gif)

#一覧の名称が重複している場合のエラー対応

一覧の名称が重複していると、プラグインの設定画面でエラーとなります。
一覧の名称を変更後、プラグインの設定を行ってください。

![vmenu14.png](https://qiita-image-store.s3.amazonaws.com/0/100572/c4370d30-4aa8-b113-ee18-b0cc147eb18b.png)

#注意事項

- 既に、JavaScript によるカスタマイズを行っているアプリの場合、処理が競合して、エラーになる場合があります。その場合は、該当するアプリでプラグインの使用を中止してください。
- 一覧設定を変更した場合は、プラグインを再設定してください。
Meteorのあんちょこ꒰｡･ω･`;꒱ Routes編

# 概要：FlowRouter（kadira:flow-router）

- [URLs and Routing @ Meteor Guide](https://guide.meteor.com/routing.html#flow-router)
- [Routing Guide for Meteor Apps @ KIDIRA](https://kadira.io/academy/meteor-routing-guide)

- Meteor 0.Xの頃は、[Iron Router](https://atmospherejs.com/iron/router) を使用することが多かった？
- Meteor Guideでは、[FlowRouter（kadira:flow-router）](https://atmospherejs.com/iron/router) が紹介されている。

# サンプル

```bash:console
$ meteor create --example todos
To create the todos example, please run:      
  git clone https://github.com/meteor/todos  
$ git clone https://github.com/meteor/todos   
$ cd todos
$ rm -rf .git
$ meteor
```

# Hello, routes!

1.プロジェクト作成

```bash:console
$ meteor create routes
```

2.パッケージインストール

```bash:console
$ meteor add kadira:flow-router
# 動作確認
$ meteor 
```

3.最初のルーティング

- client/main.html...削除
- client/main.js→index.js...リネーム


```js:client/index.js
import './routes.js';
```

```js:client/routes.js
import { FlowRouter } from 'meteor/kadira:flow-router';

FlowRouter.route('/lists/:_id', {
  name: 'Lists.show',
  action(params, queryParams) {

    // ex. http://localhost:3000/lists/2

    console.log('[FlowRouter.getRouteName]' + FlowRouter.getRouteName()); // Lists.show

    console.log('[FlowRouter.getParam]' + FlowRouter.getParam('_id')); // 2

    // console.log('[FlowRouter.getQueryParam]' + FlowRouter.getQueryParam('data'));

    console.log('[params._id]' + params._id);  // 2

    alert("Hello, routes!");
  }
});
```

- 動作確認
- "localhost:3000/lists/1"にアクセスすると、"Hello, routes!"のアラートが表示される。
- params._idで、_idを取得できる。

```bash:console
# 動作確認
$ meteor 
```

```text:browser-console
[FlowRouter.getRouteName]Lists.show
[FlowRouter.getParam]2
[params._id]2
```

# アクティブルートのハイライト

```bash:console
meteor add kadira:blaze-layout
```

- [Rendering Blaze Templates](https://kadira.io/academy/meteor-routing-guide/content/rendering-blaze-templates)
Cocos Studio（サポート終了）を探す

この本↓を今年(2016年)の**５月**に購入しました。
[パズルRPGの作り方](http://www.shoeisha.co.jp/book/detail/9784798141589)
![alt](http://www.seshop.com/static/images/product/18259/L.png)

斜め読みしただけで、なかなか試す時間がとれず積読状態を続けていました。
つい先日から、ようやく重い腰を上げて、試そうとしたところが、、、
Cocos の[ダウンロードサイト](http://jp.cocos.com/products/download/)に Cocos が無くて戸惑いました :cold_sweat: 
Cocos2d-x はあります。
ド素人なので理解に時間がかかりましたが、Cocos はおそらく Cocos Studio のことらしく、 Cocos2d-x 用のエディタ、開発環境であって、Cocos2d-x とは別物です。

いろいろと調べると、Cocos Studio は今年**４月**から EOL(サポート終了)だったのですね :scream: 
[Cocos Studio is EOL'd](http://cocos2d-x.org/docs/deprecated/studio/)

なお、[パズルRPGの作り方](http://www.shoeisha.co.jp/book/detail/9784798141589)は**３月**に発行なのでギリギリセーフでした :sweat: 

しかし :laughing: 
[Cocos Studio is EOL'd](http://cocos2d-x.org/docs/deprecated/studio/)の説明文のなかにあった[Windows](http://www.cocos2d-x.org/filedown/CocosForWin-v3.10.exe)をクリックすると CocosForWin-v3.10.exe をダウンロードできて、今のところ、これだけで OK のようです。

[パズルRPGの作り方](http://www.shoeisha.co.jp/book/detail/9784798141589) には、Framework と cocos2d-x を Cocos Studio からインストールするようにとあるのですが、これらはインストール操作をしていません。

しかし、それが原因なのか、パブリッシュ(Publish and Package)したところ、
![Cocos_warning_1.png](https://qiita-image-store.s3.amazonaws.com/0/107389/4905e831-e543-5382-d753-0b834433aa4b.png)
という警告にあたりました。
しかし、これも下記の "One Click Configure" で対策できました。
![Cocos_warning_2.png](https://qiita-image-store.s3.amazonaws.com/0/107389/98aeea22-e6d3-7ec2-38a3-8d17d99b5123.png)

"One Click Configure" をクリックすると、後半は Android SDK Manager による Andorid SDK/NDKのインストールになって、トータルで１時間くらいかかりました。

これが終って、念のため、Windows ごと再起動しました。

その後はパブリッシュと実行(cocos run -p web)も無事に実行できました :heart_eyes: 

まあ、できたといっても、付属の Hellow World だけです。
このため、この先、Framework と cocos2d-x が必要になるかもしれません。念のため、これらの Cocos V3.10 対応版だと期待できるインストーラは下記にありました。
[CocosForWinWithFramework-v2.3.3.exe](http://www.cocos2d-x.org/filedown/CocosForWinWithFramework-v2.3.3.exe)
[cocos2d-x-3.10.zip](http://www.cocos2d-x.org/filedown/cocos2d-x-3.10.zip)

あと、少ネタで、JavaScriptを修正した後、"cocos run -p web" を実行しても変更が反映されないことがありました。これはブラウザのキャッシュを一度クリアーしてあげるとよいみたいです。

なお、以上は Window 10 64-bit で試しています。[cocos2d-x は Linux でも使えるようです](http://www.cocos2d-x.org/wiki/Linux_Installation_and_Setup)が、Cocos Studio が Windows/Mac 対応版しかないようです。
CentOS に GCC 5.2 を Yum でインストールする

# GCC 4.8.5
```bash
gcc --version | head -n1
```
```text:出力例
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)
```
標準の GCC はバージョンが 4.8 と低い。
残念ながら他のリポジトリーでも GCC のパッケージはないが、 Red Hat Developer Toolset 4.1 を利用することで GCC 5.2 をパッケージでインストールすることが出来る。

# Red Hat Developer Toolset 4.1
[Red Hat Developer Toolset 4.1 User Guide](https://access.redhat.com/documentation/en-US/Red_Hat_Developer_Toolset/4/html-single/User_Guide/)
## インストール
```bash
yum install centos-release-scl-rh
yum install devtoolset-4-gcc devtoolset-4-gcc-c++ devtoolset-4-binutils
```
## 一時有効化
```bash
scl enable devtoolset-4 'bash'
```
Software Collections なのでそのままではまともに利用できない。

## バージョン確認
```bash
gcc --version | head -n1
```
```text:出力例
gcc (GCC) 5.2.1 20150902 (Red Hat 5.2.1-2)
```
## 自動有効化設定
```bash
cat << _EOF_ > /etc/profile.d/devtoolset-4.sh
#!/bin/bash
source scl_source enable devtoolset-4
_EOF_
```
`scl enable` では再ログイン時に再度実行する必要が出てくるため、 /etc/profile.d/ に bash スクリプトを配置することで自動的に有効になるようにすることができる。[^scl_source]
[^scl_source]: https://access.redhat.com/ja/node/2112231
Vimで正規表現を使って1行中の任意文字列を入れ替える

```
『パーフェクトJavaScript』/井上誠一郎
『パーフェクトRuby』/Rubyサポーターズ
『リーダブルコード』/Dustin Boswell
```

この各行を`/`を中心にひっくり返してみる

## TL;DR

```
:%s #\(.*\)\/\(.*\)#\2\/\1
```

## Vimでの置換

(2016/08/29 追記) %sの区切りはスラッシュでなくても良いようです。
したがって、

```
:%s/置換対象/置換文字列
```

でも良いし、

```
:%s #置換対象#置換文字列
```

とも書けるようです (thx @sugitk)
あらかじめ`/`が対象になることが分かっている場合こういう方が見やすそうです。

## グループ化

* `()`の中に入れる
    * `(`, `)`は`\`でエスケープする必要がある
    * Windowsだと`¥`？
* `.*` 任意文字列の0回以上の繰り返し
    * `.` 任意文字列
    * `*` 0回以上の繰り返し
* グルーピングしたものは`\1`, `\2`, ...で取り出し

## 文字列のエスケープ

* 文字列中の`/`はエスケープが必要なので`\/`
SSHクライアント

- [TeraTerm](https://ttssh2.osdn.jp/)
- [PuTTY](http://www.chiark.greenend.org.uk/~sgtatham/putty/)
- [SuperPuTTY](https://github.com/jimradford/superputty)
- [MobaXterm](http://mobaxterm.mobatek.net/)
- [RLogin](http://nanno.dip.jp/softlib/man/rlogin/)