OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonによる数値計算入門-Part2

# 数値計算の基礎
　本稿ではPythonで行う数値計算を具体的に書こうと思います。Part1では数値計算の思考プロセスについて書いたので、それを実現するためのプログラムを示します。まず数値計算の手法で解くことのできる数式ですが、今回はcos関数を可視化します(Part1の1.に対応)。

```math
y = \cos{\theta}
```
　cos関数は数値計算の手法で解くことのできる数式であり、複雑な式の変形は必要ないです。式の変形が必要となるのはもう少し難しい方程式に対してですので、その辺に関しては後にまわします。まず数値計算に慣れるところから始めようと思います。
 　数値計算の手法で解くことのできる数式を用意したら、定義域の設定をしますが(Part1の2.に対応)、今回は0[rad]から20[rad]までの区間でcos関数を書き出すことにします。Pythonのmathモジュールに含まれるcos(x)関数はx[rad]の余弦を計算します。単位がラジアンであることに注意してください。次に、cos関数を計算するためにこれを細かく分割します(Part1の3.に対応)。この分割が細ければ細かいほど多くの点をプロットすることになり、可視化されたときに点の集合がなめらかな曲線を引きますが、計算量が多くなることで時間がかかることに注意してください。今回は0.1[rad]ずつ角度を増やして、その角度におけるcos関数を出力しますと。Part1で紹介した積分の計算では、積分区間を細かく分割して、分割した区間とその値域を平均したものをかけて求めた台形の面積を全て足しあわせることで積分を求めるという説明しました。これは数値計算の手法として区分求積法を使うことに等価です。cos関数も同様に区間の分割を行います。分割した各点に対応するcos関数の値を求め、その各点をグラフにプロットすることで可視化が実現します。可視化にはmatplotlibというライブラリーのpylabというモジュールを利用します(Part1の5.に対応)。今回はPartの4.にあるようなデータの保存はしません。データを保存する必要があるような問題が出てこない限り、データの保存はフォルダを汚すだけです。
　長々と説明しましたが、いよいよプログラムをみていくことにしましょう。

```cos.py
import math, pylab    #①

steps = 200   #②
dtheta = 0.1

theta = [0.0]*steps    #③
cos = [0.0]*steps

for i in range(steps):    #④
    theta[i] = i*dtheta
    cos[i] = math.cos(theta[i])

print(theta)    #⑤
print(cos)

pylab.plot(theta, cos)    #⑥
pylab.show()
```

　このプログラムではまず①でmathモジュールとpylabモジュールをインポートします。②で定義域と分割数を設定しています。0.1[rad]ずつ角度を増やして、最終的には200回繰り返すことで定義域の最大が20[rad]になるようにしています。③では定義域としての角度と値域としてのcos関数についてリストを繰り返す回数分だけ生成します。④では角度リストのi番目の値を求めて、それをmathモジュールのcos関数に渡し、結果をcos関数リストのi番目に格納します。このfor文が終了した時点で、角度リストとcos関数リストに値が格納されていることを確認するために⑤のprint文を書いてみました。これは数値計算には本質的に関係してこないのですが、僕は簡単な計算が正しく行われているのかを確認するためによく使っています。ことごとくprint関数でデータを出力することでどこで間違えたのか、あるいは正しいのかを簡単に知ることができます。また、print関数ではなくwrite関数を使うとデータの書き出しができたりもします。⑥でデータの可視化を行います。pylabモジュールのplot関数に角度リストとcos関数リストを渡すことで二次元のグラフが出来上がります。

![cos.png](https://qiita-image-store.s3.amazonaws.com/0/207891/06e688db-2790-b6de-ea7d-197391d7f055.png)

# 最後に
　本稿では数値計算の初歩をみました。こんな感じで数値計算の入門的な内容を扱っていきます。Pythonに慣れている人は考え方さえわかってしまえばプログラムの部分はそこまで難しくなかったと思います。慣れていない人はコピー&ペーストではなく自分の手で打ち込んでみてください。自分の手で打ち込むことで高い学習効果が得られると誰かが言っていたような気がしたりしなかったりします。プログラミングで数学を勉強したいという高校生や大学生にとってもPythonは学習が容易だと思っているので、難しく考えずにやってみて欲しいです。cos関数は高校生でも習いますよね。中学生は放物線を描いてみるといいと思います。
　余談ですが、僕は開発環境としてPyCharmを使っています。
ReactNativeで作ったIOSアプリを公開するまでに必要な手順


## 全体の手順
1. 自分のPC上で、秘密鍵／公開鍵ペアを生成する
2. CSR（Certificate Signing Request - 証明書署名要求）を、(1)の公開鍵を付けてAppleに送る
3. (2)の公開鍵を含む証明書を作り、認証局の秘密鍵で暗号化
4. (3)の証明書をダウンロードし、キーチェーンへ登録
5. App IDを登録
6. プロビジョニングファイルの作成
7. プロビジョニングファイルをダウンロードし登録
8. ビルド設定を行う（BundleID, コードサイニング）
9. ビルド、アーカイブ（ipaファイル作成 ※）

## 証明書の作成 & キーチェーンへの登録 (1-4までの手順)
* 開発用と配布用の2種類がある
	* 開発用 (Development)
		* https://developer.apple.com/account/ios/certificate/development
	* 配布用 (Distribution)
		* https://developer.apple.com/account/ios/certificate/distribution
* [iPhone] iOS Certificate の作成手順 https://i-app-tec.com/ios/apply-application.html
* 証明書の登録作業は基本同一のMacでしかできない
* 別のMacの場合は初めからやり直し
* **証明書は開発者個人を特定するためのものなので、他人のMacで作った証明書は基本、自分のMacには登録できない**
* 後述する方法で秘密鍵を共有すれば可能

## AppIDの登録 (5の手順)
* [iPhone] iOS App IDs の登録 https://i-app-tec.com/ios/ios-app-ids.html
* **AppleIDとは別物。一度作ると削除できない**
* 過去にiTunes Connectに登録したアプリ(AppIDs)は以下に表示される
	* https://developer.apple.com/account/ios/identifier/bundle

## プロビジョニングファイルの作成 (6-7の手順)
* iOSアプリ Provisioning Profile の作成 https://i-app-tec.com/ios/provisioning-profile.html

* App ID
	* Bundle ID: com.hoge.AppName
	* XCodeのBundleIdentifierと違うとArchiveのValidationでエラーになる

* Enable Service: Push Notificationなど
* 証明書 Certificate
	* ペア鍵
* 端末のUUID
	* 公開前にテストする実機のUUID
* 上記3つを結びつける役割
* プロビジョニングファイルにも開発用・配布用がある
	* 開発用
		* https://developer.apple.com/account/ios/profile/limited
	* 配布用
		* https://developer.apple.com/account/ios/profile/production


### プロビジョニングファイルの役割
* どのアプリ(BundleID)のどの開発者(Certificate)がどの端末(UUID)で動作させるかを判断するためのもの
	* 開発用 (Development)
	* 製品用 (App Store)
	* リリース前のテスト用 (AdHoc)

### チームで開発する場合はどうするか？
* プロビジョニングファイルは証明書を作った開発者のPCじゃないと、Private Keyが無いよとArchiveする時に怒られます

* 複数台のMacでiOSアプリを開発する方法 ~ 開発チームのブログhttp://stpsysdev.blogspot.jp/2015/09/macios.html

ここを参考に本番の証明書を作った開発者の秘密鍵(p12)と証明書を渡せば共有可能です。

## ビルドを行う (8-7の手順)
* ここまでできたら後はProduct > Archive
* Validateを実行して通ったら晴れてApple StoreにUploadできます
macOSのSpotlightで計算するTips

macOS/iOSのSpotlight上で計算できます。気軽に計算ができるので、急いで計算するとき便利です。ここでは、Spotlightで計算するTipsをまとめてみます。

# 基本編

Spotlight(スポットライト)を起動するには、macOSの右上にある虫眼鏡のアイコンをクリックするか、設定したショートカットキー（デフォルトでは、[⌘command]+[space]）を押すことです。

そして、以下のように、普通に計算式を入力すると計算機のアイコンが出て、計算を行うことができます。

![basic.png](https://qiita-image-store.s3.amazonaws.com/0/33180/ffc57ada-4196-2a77-af1e-9e83473b189b.png)

利用可能な演算子は、次の通りです。

| 演算子 | 説明 |
| --- | --- |
| + | 足し算 |
| – | 引き算 |
| * または × | 掛け算 |
| / または ÷ | 割り算 |
| ^ | べき乗 |
| % | 割り算の余り |
| ( ... ) | 計算の優先順位を変更する |

## 結果をコピーしよう編

計算結果を、[command] + [c]でコピーできます。かなり便利。

# 関数を使ってみよう！

Spotlightでは関数が利用できます。

| 関数の例 | 例の結果  | 説明    |
| --------- | ------ | ------- |
| sin(0.1)  | 0.09983341665 | 三角関数のサイン | 
| cos(0.1)  | 0.9950041653 | 三角関数のコサイン |
| tan(0.1)  | 0.1003346721 | 三角関数のタンジェント |
| asin(0.1) | 0.1001674212 | 三角関数のアークサイン |
| acos(0.1) | 1.4706289056 | 三角関数のアークコサイン |
| atan(0.1) | 0.09966865249 | 三角関数のアークタンジェント |
| exp(3) | 20.0855369232 | 指数関数 |
| sqrt(2) | 1.4142135624 | 平方根 |
| ceil(2.3) | 3 | 切り上げ |
| floor(3.9) | 3 | 切り下げ |
| rint(2.6) | 3 | 四捨五入 |
| log(10) | 1 | 常用対数 |
| ln(10) | 2.302585093 | 自然対数 |
| 3! | 6 | 階乗	|

# 単位変換/通貨変換/日時計算

Spotlightでは単位変換/通貨変換が利用できます。

| 記述例 | 結果(例) | 説明 |
| ----- | -------- | ---- |
| ¥300 | 2.66米ドル | 通貨変換(円→ドル) |
| $5 | 563.41 円 | 通貨変換(ドル→円) |
| 5cny | 84.88 円 | 通貨変換(中国元[cny]→円) |
| 5myr | 133.49 円 | 通貨変換(マレーシア・リンギット[myr]→円) |
| 5in | 12.7 センチメートル | 単位変換 インチ→センチ |
| 30mg | 0.03 グラム | 単位変換 ミリグラム→グラム |
| 5mb | 4.77 メビバイト | 単位変換 メガバイト→メビバイト |
| 10m | 10.94 ヤード | 単位変換 メートル→ヤード |
| 10km | 6.21 マイル | 単位変換 |
| 10kg | 22.05 ポンド | 単位変換 |
| 10k | -263.15 ℃ | 温度変換 ケルビン→度 |
| 30c | 86 ℉ | 温度変換 |
| 100秒 | 1 分 40 秒 | 時間変換 |
| 100分 | 1 時間 40 分 | 時間変換 |
| 1年 | 365 日 6 時間 | 日付計算 |

![convert.png](https://qiita-image-store.s3.amazonaws.com/0/33180/b9155207-3594-ae02-bdf5-84216ac9c6c7.png)

# まとめ

他には、「天気」と打って天気予報を表示したり・・・。便利機能満載のSpotlight、ぜひ使いこなしたいものです。

# (番外編) ターミナルからSpotlight使う？！

ターミナルから「mdfind」コマンドを使うと、SpotlightのCUI版として利用できます。Homebrewなどで「peco」をインストールしておけば、以下のようなコマンドで、コマンドラインからもファイル検索できて便利。

```
# ホームディレクトリ以下のキーワードを持つファイルをpecoで一覧表示
$ mdfind -onlyin ~/ -name "キーワード" | peco
```
Javaでの部品化

2017年10月20日に限定公開した記事．
## パッケージ
```java
package パッケージ名;
import パッケージ名; //FQCNを省略できる．
``` 
## クラス
別クラスのメゾットの読み出しは，以下のように指定する．

```java
クラス名.メゾット名;
```
## メゾット
* 配列はアドレスを(渡す/戻す)している．
* 仮引数(の数・型)が異なる場合，**オーバーロード**できる．
* 起動時に**コマンドライン引数**を指定できる．

```java:Main.java
public class Main {
        public static void main (String args[]) {
            System.out.println("東海道新幹線です．");
            others.keikyu(); //クラスを指定
            System.out.println("リニアがやってきた！");
            System.out.println(linear(new java.util.Scanner(System.in).nextLine()) + "本に減便された!");
        }
        public static int linear (String afraid) { // 戻り値，引数の型を指定
            System.out.println(afraid + "などと抜かしおって…");
            int howmany = new java.util.Random().nextInt(100);
            System.out.println("1日" + howmany + "本に減便してくれるわ!");
            return howmany; //変数を戻す
        }
}
```
```java:others.java
public class others {
    public static void keikyu () {
        System.out.println("赤電，抜かしたるでぇ!");
    }
}
```
C | C++ > ＃define定義が、ある数値未満でビルドエラーにする > ＃if MAXNUM_LINE < 100 と ＃error "[MAXNUM_LINE] should be >= 100" | static constでの使用はお薦めではない

```txt:動作環境
C++ Builder XE4
```

### 概要

以下のような定義で、将来の修正時に100未満にしたらビルドエラーする。

`#define MAXNUM_LINE (100)`

### code

[Assert](http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/JA/html/delphivclwin32/System_Assert@Boolean.html)を使おうと思ったが、@SaitoAtsushi さんに教えていただいた方法と関連したコードが使えそうに思った。

参考: [C > define多重定義のチェック > 3つまで > #if (defined(USE_CASE0)+defined(USE_CASE1)+defined(USE_CASE2)) != 1 #error "Wrong number of selected cases" #endif](https://qiita.com/7of9/items/8f9fab70fe556b5b6e5c)

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------


#define MAXNUM_LINE (50)
#if MAXNUM_LINE < 100
#error "[MAXNUM_LINE] should be >= 100"
#endif

__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{

}
//---------------------------------------------------------------------------
```

### ビルド

```
bcc32 の "Unit1.cpp" コマンド ライン
...
[bcc32 致命的エラー] Unit1.cpp(16): F1003 error 指令: "[MAXNUM_LINE] should be >= 100"
失敗
経過時間: 00:00:00.1
```

何故100以上にしないといけないか、はコメントとして付記すると、未来の誰かにディスられない。
(エラーメッセージに理由を書くというのもいいことかもしれない）

@ プログラマが知るべき97のこと by Kevlin Henneyら
未来へのメッセージ by Linda Rising
> 彼に言いました。「自分の書くコードは、全部、未来の誰かへのメッセージだと思うのよ。その誰かは、あなたの弟さんかもしれない。誰か、とても賢い人に、自分が難しい問題をどう解いたのか、丁寧に説明するつもりで書くの」

### static const int

~~`#define`定義でなく`static const int`定義の定数に対しても使える。~~

(訂正 2017/10/22)

**C++ Builderではエラーが出るが、IDE固有のビルド方法でエラーを発しているだけかもしれない。**

**将来の移植時に「はまる」可能性があるため、static const int変数での使用はやめておいた方が良いように思う。**
Zabbix API 覚書

zabbix(API) 使って躓いたところを箇条書き


# Item 登録
- 親は hostid 属性で指定
  - (get する時も hostid で親を指定する)
- 数式は params 属性にぶっこむ
  - (formula には指定しない)
- key は key_(紛らわしい)
- 数式は全て Zabbix に登録した key で指定
- 数式で指定する key は last でくくる
  - last(key1) / last(key2)

# Trigger 登録
- {[Templatename]:[item_key_name].last()}
  - .last() が必要
iPhoneで方位を取得する

iPhoneの動作検知について、少し勉強しています。
今回は、「方位」の検知に関して備忘録を残します。

やること
端末の位置情報から方位を取得し、簡単なコンパスを作ります
※ただ矢印の画像が回転するだけのサンプルです。
ライブラリは「CoreLocation」を使用します。

実装

```
#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>

@interface ViewController () <CLLocationManagerDelegate>

@property (strong, nonatomic) CLLocationManager *manager;
@property (weak, nonatomic) IBOutlet UIImageView *compass;
@property (weak, nonatomic) IBOutlet UITextField *magneticHeading;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.manager = [[CLLocationManager alloc] init];
    self.manager.delegate = self;
    self.manager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
    self.manager.distanceFilter = kCLDistanceFilterNone;
    
    // 位置情報取得開始
    [self.manager startUpdatingLocation];
    // コンパスのアニメーション開始
    [self.manager startUpdatingHeading];
}

//コンパスの矢印を回転させる（取得するたびに走る）
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)heading {
    
    if (heading.headingAccuracy < 0) {
        return;
    }

    CLLocationDirection theHeading = ((heading.trueHeading > 0) ? heading.trueHeading : heading.magneticHeading);
    
    // 取得した方位をテキストフィールドに入力
    self.magneticHeading.text = [NSString stringWithFormat:@"%f", theHeading];
    
    // 取得した方位を元にイメージを回転
    self.compass.transform = CGAffineTransformMakeRotation(-heading.magneticHeading * M_PI/180);
}

@end
```
##所感
改めてiPhoneの動作検知機能の素晴らしさに気づかされました。様々なモーションデータを数行で取得できるんですね。その他、「高度」「速度」なんかも取得できるみたいです。流行りの「顔認証」技術なども合わせて、今後も勉強を続けます。
行を複製して数字をインクリメントするSublime Textプラグイン

#Duplicate And Increment
つくりました。
インクリメントしながら行を複製するやつ。
その昔FlashDevelopというEditorにあった便利プラグインと似たような動作です。
Sublime Textでも需要あるかなと。。
複数行でもインクリメント出来ます。
これで大量の連番処理も捗るはず。

```json

{
	"item-list":[
		{ "name":"item1", "path":"./image1.jpg" }
		, { "name":"item2", "path":"./image2.jpg" }
		, { "name":"item3", "path":"./image3.jpg" }
		, { "name":"item4", "path":"./image4.jpg" }
		, { "name":"item5", "path":"./image5.jpg" }
		, { "name":"item6", "path":"./image6.jpg" }
		, { "name":"item7", "path":"./image7.jpg" }
		, { "name":"item8", "path":"./image8.jpg" }
		, { "name":"item9", "path":"./image9.jpg" }
		, { "name":"item10", "path":"./image10.jpg" }
		, { "name":"item11", "path":"./image11.jpg" }
		, { "name":"item12", "path":"./image12.jpg" }
		, { "name":"item13", "path":"./image13.jpg" }

	...

```


##使用方法
###領域選択せずに、カーソル置いて実行
![example1.jpg](https://qiita-image-store.s3.amazonaws.com/0/207875/d031ba23-dfb3-41d5-4ddf-ec398ab9a126.jpeg)
普通に数字をインクリメント

###領域選択して実行
![example2.jpg](https://qiita-image-store.s3.amazonaws.com/0/207875/628fe303-6423-e994-c560-597d911aa644.jpeg)
領域選択した数字のみインクリメント

###複数行選択して実行
![example3.jpg](https://qiita-image-store.s3.amazonaws.com/0/207875/162b494b-0cb3-34aa-205a-ffe32b4c0691.jpeg)

もちろんjsonでも
![example4.jpg](https://qiita-image-store.s3.amazonaws.com/0/207875/d65ed43e-0d0a-25fd-0067-862e4d00c5f7.jpeg)


##インストール方法
1. Package Controlから「Package Control: Add Repository」を選択
2. 入力ボックスに「[https://github.com/112KA/duplicate_and_increment](https://github.com/112KA/duplicate_and_increment)」を入力
3. Package Controlから「Package Control: Install Package」を選択
4. 「duplicate_and_increment」を選択

好きなショートカットを指定して使ってください。
私はWindows環境で"ctrl+shift+alt+d"で使えるようにしてます。


##今後の予定
~~Package Controlに登録申請してみようかな。。~~
~~PullRequestしてみました。登録待ち。。(2017/10/25)~~
Package Controlに登録されました。(2017/11/05)

##参考リンク
- [Sublime Text 言語パッケージ作成：パッケージを公開する（応用編）](https://qiita.com/makopo/items/83d551b5594e7802a3c4)
- [Package Control新方式(2.0)でのJSON記述方法](https://qiita.com/makopo/items/25c73b186aa73a9edd3a)
- [自作したSublime TextのプラグインをPackage Controlに登録してみる](http://orememo-v2.tumblr.com/post/93924306902/registration-package-control)
- [Submitting a Package | Package Control](https://packagecontrol.io/docs/submitting_a_package)
SquareのWebhooks APIを使ってみる

決済されたタイミングでシステムに通知して欲しいと思うことはないでしょうか。それを実現できるのがSquareのWebhooks APIです。他にもタイムカードが更新されたタイミングでも通知を受けられます。

今回はサンプルコードをベースに、Webhooks APIの使い方を紹介します。

## 設定について

Webhooksの設定はSquare Developer PortalのWebhooksタブにて行います。Webhooksを有効にして、URLを指定します。これはPOSTで呼ばれるURLを指定します。

![Screenshot_ 2017-10-20 18.19.49.png](https://qiita-image-store.s3.amazonaws.com/0/197026/0f5898db-c727-f51e-6ebe-9767bebcedbf.png)

URLを設定すると、Signature Keyが生成されます。通知先のURLと共に使いますので覚えておきます。

## リクエストの検証を行う

WebhooksはPOSTリクエストで呼ばれます。そしてまず必要なのがリクエストの検証です。使うのはリクエストのボディとHTTP_X_SQUARE_SIGNATUREヘッダーです。以下はRubyのコード例です。

```
callback_body = request.body.string
callback_signature = request.env['HTTP_X_SQUARE_SIGNATURE']
```

ここに先ほど設定したWebhooksのURL（WEBHOOK_URL）とSignature Key（WEBHOOK_SIGNATURE_KEY）を使って検証を行います。

```
string_to_sign = WEBHOOK_URL + callback_body
string_signature = Base64.strict_encode64(OpenSSL::HMAC.digest('sha1', WEBHOOK_SIGNATURE_KEY, string_to_sign))
Digest::SHA1.base64digest(string_signature) == Digest::SHA1.base64digest(callback_signature)
# trueなら検証OK
```

検証した結果が正しければ問題ありません。

## JSONの内容を取得

内容が問題なければリクエストをJSONにします。

```
callback_body_json = JSON.parse(callback_body)
```

入っている内容は次のようになります。

```
{
  "location_id": "AAABCHDD",
  "merchant_id": "JGHJ0343",
  "event_type": "PAYMENT_UPDATED",
  "entity_id": "Jq74mCczmFXk1tC10GB"
}
```

entity_idは取引IDになります。location_idと組み合わせてSquare APIから取引の詳細情報を取り出せます。

```
# Square APIにアクセスして決済情報の詳細を取得します
api_instance = SquareConnect::V1TransactionsApi.new
response = api_instance.retrieve_payment(location_id, payment_id)
```

レスポンスとして、細かい取引情報が取得できます。以下はレスポンスの一部です。

```
{
  :id=>"4867tampXm52hAvQ9To5S",
  :merchant_id=>"BE1...H66",
  :created_at=>"2017-10-16T07:05:29Z",
  :creator_id=>"BE1...H66", :device=>{
    :id=>"DEV...647",
    :name=>"iPhone 7 Plus"},
  :payment_url=>"https://squareup.com/dashboard/sales/transactions/KXL...tMF",
  :receipt_url=>"https://squareup.com/receipt/preview/4867tam...o5S",
    :
  :inclusive_tax=>[],
  :additive_tax=>[],
  :tender=>[{
    :id=>"4867tampXm52hAvQ9To5S",
    :type=>"CASH",
    :name=>"Cash",
    :receipt_url=>"https://squareup.com/receipt/preview/4867tam...o5S",
    :total_money=>{
      :amount=>1500,
      :currency_code=>"JPY"
    },
      :
  }],
  :refunds=>[],
  :itemizations=>[{
    :name=>"Custom Amount",
    :quantity=>1.0,
    :itemization_type=>"CUSTOM_AMOUNT",
    :item_detail=>{
      :category_name=>"",
      :sku=>""
    },
      :
    :taxes=>[],
    :discounts=>[],
    :modifiers=>[]
  }]
}
```

このようにしてWebhookの処理が可能です。取引情報が取り出せれば、自社システムと連携させるのも難しくないでしょう。

----

なおWebhooksなのでイベントを受け取るサーバはインターネット上に公開されている必要があります。また、外部からのPOSTリクエストを許可するようになっていなければなりませんので注意してください。

今回のRubyのコードは[goofmint/Square_Webhook_Ruby: SquareのWebhook APIをRubyで利用するためのデモコードです](https://github.com/goofmint/Square_Webhook_Ruby)にアップロードしてあります。Herokuでも立てられますので、手軽に使えるはずです。

[Square Connect API Documentation](https://docs.connect.squareup.com/api/connect/v1#webhooks-overview)
SquareのWebhooks APIを使ってみる

決済されたタイミングでシステムに通知して欲しいと思うことはないでしょうか。それを実現できるのがSquareのWebhooks APIです。他にもタイムカードが更新されたタイミングでも通知を受けられます。

今回はサンプルコードをベースに、Webhooks APIの使い方を紹介します。

## 設定について

Webhooksの設定はSquare Developer PortalのWebhooksタブにて行います。Webhooksを有効にして、URLを指定します。これはPOSTで呼ばれるURLを指定します。

![Screenshot_ 2017-10-11 22.37.35.png](https://qiita-image-store.s3.amazonaws.com/0/197026/d10fec59-df4b-4dcc-2c55-c3e6063ba4ed.png)

URLを設定すると、Signature Keyが生成されます。通知先のURLと共に使いますので覚えておきます。

## リクエストの検証を行う

WebhooksはPOSTリクエストで呼ばれます。そしてまず必要なのがリクエストの検証です。使うのはリクエストのボディとHTTP_X_SQUARE_SIGNATUREヘッダーです。以下はRubyのコード例です。

```
callback_body = request.body.string
callback_signature = request.env['HTTP_X_SQUARE_SIGNATURE']
```

ここに先ほど設定したWebhooksのURL（WEBHOOK_URL）とSignature Key（WEBHOOK_SIGNATURE_KEY）を使って検証を行います。

```
string_to_sign = WEBHOOK_URL + callback_body
string_signature = Base64.strict_encode64(OpenSSL::HMAC.digest('sha1', WEBHOOK_SIGNATURE_KEY, string_to_sign))
Digest::SHA1.base64digest(string_signature) == Digest::SHA1.base64digest(callback_signature)
# trueなら検証OK
```

検証した結果が正しければ問題ありません。

## JSONの内容を取得

内容が問題なければリクエストをJSONにします。

```
callback_body_json = JSON.parse(callback_body)
```

入っている内容は次のようになります。

```
{
  "location_id": "AAABCHDD",
  "merchant_id": "JGHJ0343",
  "event_type": "PAYMENT_UPDATED",
  "entity_id": "Jq74mCczmFXk1tC10GB"
}
```

entity_idは取引IDになります。location_idと組み合わせてSquare APIから取引の詳細情報を取り出せます。なお、この時にはトークンが必要になります。

```
# Square APIにアクセスして決済情報の詳細を取得します
api_instance = SquareConnect::V1TransactionsApi.new
response = api_instance.retrieve_payment(location_id, payment_id)
```

このようにしてWebhookの処理が可能です。取引情報が取り出せれば、自社システムと連携させるのも難しくないでしょう。

----

なおWebhooksなのでイベントを受け取るサーバはインターネット上に公開されている必要があります。また、外部からのPOSTリクエストを許可するようになっていなければなりませんので注意してください。

今回のRubyのコードは[goofmint/Square_Webhook_Ruby: SquareのWebhook APIをRubyで利用するためのデモコードです](https://github.com/goofmint/Square_Webhook_Ruby)にアップロードしてあります。Herokuでも立てられますので、手軽に使えるはずです。

[Square Connect API Documentation](https://docs.connect.squareup.com/api/connect/v1#webhooks-overview)
Jenkins PipelineのUnsupportedOperationExceptionをなおす

# ゴール
Jenkins Pipelineがjava.lang.UnsupportedOperationExceptionでこけた。

どうやら、タプルを使用したことが原因らしい。
https://issues.jenkins-ci.org/browse/JENKINS-38846

このエラーを解消する。

# やりかた
タプルなしの実装に変える。

## Before
```groovy:Jenkinsfile
def tupleFunc() {
    ["a","b"]
}

node {
    (tA, tB) = tupleFunc()
    
    echo "tA: $tA"
    echo "tb: $tB"
}
```
```groovy:コンソール出力
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
General error during canonicalization: java.lang.UnsupportedOperationException

java.lang.UnsupportedOperationException
	at com.cloudbees.groovy.cps.CpsTransformer.visitTupleExpression(CpsTransformer.java:858)
	at org.codehaus.groovy.ast.expr.TupleExpression.visit(TupleExpression.java:78)
	at com.cloudbees.groovy.cps.CpsTransformer.visit(CpsTransformer.java:335)
:
省略
:

Finished: FAILURE
```

## After

```groovy:Jenkinsfile
def tupleFunc() {
    ["a","b"]
}

node {
    result = tupleFunc()
    def tA = result[0]
    def tB = result[1]
    
    echo "tA: $tA"
    echo "tb: $tB"
}
```


```groovy:コンソール出力
[Pipeline] {
[Pipeline] echo
tA: a
[Pipeline] echo
tb: b
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
```

#考察
Jenkins 2.60.3 でこのエラーになったが、2.70 では発生しなかった。特定のプラグインのバージョンにバグがあるのかも。
UnsupportedOperationExceptionはタプルへの再代入時に発生するので、そういう動きが旧バージョンのJenkinsに入っていたのかなぁ。

```groovy:tuple.groovy
def tuple = new Tuple('apple','banana')

println "tuple[0]: ${tuple[0]}"
println "tuple[1]: ${tuple[1]}"

tuple[0] = 'coke' // -> UnsupportedOperationException
```
```groovy:実行結果
tuple[0]: apple
tuple[1]: banana
Caught: java.lang.UnsupportedOperationException
java.lang.UnsupportedOperationException
	at tuple.run(tuple.groovy:6)
```
高さを維持しつつ、背景からコンテンツをはみ出させる方法

# ある程度コンテンツの高さを維持つつ、背景からコンテンツをはみ出させる方法
ヒーローイメージが多い昨今、可変な背景を求められるシーンが増えたかと思います。
可変な背景(height: auto)の中で、position: relativeとネガティブマージンを使用することで実現可能なレイアウトがありましたので、投稿いたします。

## どんなレイアウトか
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192967/1b0fabcd-57c1-aa00-0892-ad3fb06af954.png)
position: relative, position: absoluteを使用すると簡単じゃないかと思われるかもしれません。  
ですが、<font color="red">背景がheight: auto</font>となると少し難易度が上がります。

## まずはソース
```html
<div class="haikei">
  背景
  <h1>タイトル</h1>
  <p>テキスト</p>
  <div class="flow">
    <div class="flow-box">
      
    </div>
  </div>
</div>
```

```css
.haikei {
  background-color: red;
  margin: 0 auto;
  width: 400px;
}
.flow {
  position: relative;  /* 　今回のメインテーマ  */
  margin-top: -60px;  /*  今回のメインテーマ   */
  top: 60px;         /*  今回のメインテーマ   */
}
.flow-box {
  height: 150px;
  width: 150px;
  background-color: blue;
  margin: 0 auto;
}
```

## 領域が確保されるまでの流れ
- margin: -60px; で上のコンテンツを無視して突き上げる  
- あとは、<font color="red">浮かせつつ、下に60px動かす</font>だけ。  

## 浮かせつつ、下に60px動かす
- position: relative;
- top: 60px;  

位置指定の際、position: relative, position: absoluteで有名ですが、position: relativeした要素にもtop, bottom, right, leftの指定が可能です。（相対位置）
また、[スタックコンテキスト₍₍⁽⁽(ી( ･◡･ )ʃ)₎₎⁾⁾](https://qiita.com/hoto17296/items/42e62989193504d512c7)というものを生成するので、top:60pxしても背景が伸びずに、コンテンツのみ下に動きます。

  

特にミソだったのは、<font color="red">position: relative</font>だったかと思います。
スタックコンテキスト, z-indexと深い関係がありますので、先ほどのリンクを熟読することをオススメします。
SpreadsheetGearでExcelのグループ化をする

```csharp:GroupingSample.cs
class GroupingDef {
	public int ColIdx { get; set; }
	public int RowIdx { get; set; }
	public int ColLen { get; set; }
	public int RowLen { get; set; }

	/// <summary>
	/// 行のグループ化であるか
	/// </summary>
	public bool IsRow { get; set; }

	/// <summary>
	/// 集計行(列)を詳細データの下(右)にするか
	/// </summary>
	public bool IsBelowSummaryPosition { get; set; }
}

class GroupingSample {

	public void SetGrouping(SpreadsheetGear.IWorksheet worksheet, GroupingDef[] defList) {
		//アウトラインの集計行列の位置を設定
		if (defList.Count() > 0) {
			if (defList[0].IsBelowSummaryPosition) {
				if (defList[0].IsRow) {
					//詳細データの下
					worksheet.Outline.SummaryRow = SpreadsheetGear.SummaryRow.Below;
				} else {
					//詳細データの右
					worksheet.Outline.SummaryColumn = SpreadsheetGear.SummaryColumn.Right;
				}
			} else {
				if (defList[0].IsRow) {
					//詳細データの上
					worksheet.Outline.SummaryRow = SpreadsheetGear.SummaryRow.Above;
				} else {
					//詳細データの左
					worksheet.Outline.SummaryColumn = SpreadsheetGear.SummaryColumn.Left;
				}
			}
		}

		//グループ化設定
		foreach (var def in defList) {
			SpreadsheetGear.IRange range = worksheet.Cells[def.RowIdx, def.ColIdx, def.RowLen, def.ColLen];
			if (def.IsRow) {
				//行のグループ化
				if (range.EntireRow.OutlineLevel < 8) {		//最大8段階
					range.EntireRow.Group();
				}
			} else {
				//列のグループ化
				if (range.EntireColumn.OutlineLevel < 8) {		//最大8段階
					range.EntireColumn.Group();
				}
			}
		}
	}
}
```
FlutterでiOSのCocoaPodsでライブラリ管理する

> 最新のFlutterでは、この記事にあるような対応をしなくても動くかも？ 試して動かなかったときに使ってください。

FlutterでiOSのプラットフォーム側コードを書く際に、各種ライブラリを使うことがある。

その場合は `ios/Podfile` に追加する。

```
target 'Runner' do
  # Uncomment this line if you want to use Swift in your app.
  # Note that some Flutter plugins are not compatible with use_frameworks!
  # use_frameworks!

  # Pods for Runner
  pod 'TwitterCore'
  pod 'TwitterKit'
  
  ...
```

上記の例では Twitter の SDK を追加している。

`flutter run` や `flutter build` のコマンドの１ステップとして `pod install` が実行される。

なお、`pod update` したい場合は以下のようにする。

```
cd ios/
FLUTTER_FRAMEWORK_DIR=/path/to/flutter/bin/cache/artifacts/engine/ios/ pod update
```

Flutter本体が、ローカルパスにある依存Frameworkなので、そこのパスを環境変数 `FLUTTER_FRAMEWORK_DIR` で指定する必要がある。
macOS の音声 Good News の復活と、キッチンタイマー tir バージョンアップ

# Good News を復活する

多分 Sierra からだと思うのだが、say コマンドで指定できるボイスから「威風堂々」のメロディーで歌い上げてくれる Good News がなくなった。これがないと、コマンドラインから使うキッチンタイマーコマンド tir のゴージャスオプション __-G__ が使えない。

- https://qiita.com/kaz-utashiro/items/72f9e4c089c46210dec4

実用的には困らないので、そのままにしてあったのだが、使えないオプションがあるのはどうも居心地が悪いと考えていたところ、復活する方法があることがわかった。

システム環境設定の「アクセシビリティ」から「スピーチ」を選んで、「システムの声」から「カスタマイズ」を選択すると、インストールされてない音声をダウンロードすることができた。

<img width="780" alt="システム環境設定" src="https://qiita-image-store.s3.amazonaws.com/0/36551/46b53faa-0d73-6fc4-44c9-95b7f3b93035.png">

# tir バージョンアップ

さて、これでオプションを外さなくてもよくなった。しかしどうも音声データも以前のものとは若干違うようで、そのままでは塩梅が悪い。tir は、指定した時間が経つと "Tea is ready" と喋ってくれるコマンドだ。カップ麺を作る時には

    % tir 3min Ramen

と実行すれば、3分経つと "Ramen is ready" と教えてくれる。ターミナルが開いていれば秒速で実行できる。そのゴージャスバージョンのショートカットが __-GR__ オプションで、これを使うために先の Good News が必要になる。しかし、Tea と Ramen では単語の長さが違うのでメロディーにのらなくなってしまうのだ。どちらかに合わせると、もう一方がずれる。

というわけで、実に面倒だが指定された単語の音節数を数えて、それによってメッセージの形式を変えるようにした。実装はいい加減で、含まれている母音の数を数えているだけ。ただ cake みたいに最後に発音しない（っぽい）母音は削除してから数える。bash なので、awk で頑張る。

`bash
define awk_vowelcount <<'EOF'
{
    gsub(/[bcdfgkmnpstvwyz]e( |$)/, " ");
    for (vowel=0; match(tolower($0), /ey|y[aeiou]*|[aeiou]+/); vowel++) {
        $0=substr($0, RSTART + RLENGTH)
    }
    print vowel
}
EOF
syllable() {
    echo "$1" | awk "$awk_vowelcount"
}
`
もっとマシなやり方があると思うので、いい考えがあれば教えて欲しい。

まあ、でも不自由しないくらいの精度で動くようになったので、このくらいで満足としておこう。とりあえず、こんな例を試してみた。これからの季節に合わせて鍋焼きにも対応。

- 1音節
  - Tea
- 2音節
  - Ramen, Udon, Curry, Pe-young, Cup Noodle
- 3音節
  - Ki Tsu Nee
- 4音節
  - Yakisoba, Nabeyaki
- 5音節
  - Ah Kai Ki Tsu Nee


## iTunes の処理

気がつくと、こんな方がいらっしゃったので、iTunes が立ち上がっているかどうかをチェックするようにした。そういえば、自分のマシンではいつも動いているので気にしていなかったのでした。

- https://qiita.com/catfist/items/b0c9479a4006f38c7d9c

ついでに、Darwin ではない場合には諸々の機能が無効になるようにしたので、別の OS でも動くには動くんじゃないかと思う。

tir は、[github.com/kaz-utashiro/tir](https://github.com/kaz-utashiro/tir) からどうぞ。
WSL (Windows Subsystem for Linux) への Windows PATH 追加を防ぐ方法

Windows 10 Fall Creators Update がリリースされ WSL (Windows Subsystem for Linux)が正式に使えるようになりました。

GUI(X Window System)とサービス常駐で工夫が必要な点を除けば、一般的な Linux 環境と同じように使えるのですが、意外に困るのが PATH 問題です。初期状態では、Windows の PATH 環境変数が自動的に変換され Linux 側の PATH 環境変数に追加されるようになっています。

Windows のコマンドも呼び出せるので便利といえば便利なのですが、Windows/Linux に両対応しているツールでは、bat ファイルと拡張子なしのシェルスクリプトファイルの両方が置かれているため Linux 側のプログラムを呼ぶつもりが Windows 側にインストールしたプログラムを実行してしまうことがあり、逆に面倒に感じることも多いです。

解決策としては単に .profile にて PATH を再定義してしまうというのも手なのですが、レジストリを変更することでそもそも Windows PATH を追加させないことができたので紹介しておきます。

次のテキストを .reg 拡張子のファイルに保存して実行してください（レジストリを変更しますので、気になる方はバックアップの取得を先に行ってください）。

```registry
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LxssManager]
"DistributionFlags"=dword:fffffffd
```

ウィンドウを閉じ、再度立ち上げると Windows PATH が追加されない状態になります。

参考： [Microsoft/BashOnWindows - bash $PATH includes native Windows path](https://github.com/Microsoft/BashOnWindows/issues/2048)
3次元空間で図解する多重共線性

#多重共線性とは

説明変数同士が強く相関していること．
例えば月の売り上げが月の降水量と月の降水日数に比例するモデルを考えると，降水量と降水日数の間は相関しているので，このモデルには多重共線性がある．

多重共線性があると，回帰係数の標準誤差が大きくなり、訓練データが変わる(増える)度に分析結果が大きく変わりうるらしい．
でも予測精度には影響しないとか．
……なにが起きてるの？
どういう時に問題になるだとか，数学的にはどういう状況かとかいった説明はWeb上に沢山見かける([例](http://www.housecat442.com/?p=494))ので、今回は図で理解したい．

#多重共線性のないとき

$z = x + y$


```r
n <- 100
x <- runif(n) + rnorm(n, sd = 0.05)
y <- runif(n) + rnorm(n, sd = 0.05)
z <- x + y + rnorm(n, sd = 0.05)
plot3D::scatter3D(x, y, z)
```

![unnamed-chunk-1-1.png](https://qiita-image-store.s3.amazonaws.com/0/149890/f00c743a-18e8-4d8e-8e97-b5bdceff040b.png)


どう頑張っても，これらの点を乗せられる平面は1面しか描けないと思う．

#多重共線性のある時

xとyが1:1で比例するようにしてみた．


```r
y <- x + rnorm(n, sd = 0.05)
z <- x + y + rnorm(n, sd = 0.05)
plot3D::scatter3D(x, y, z)
```

![unnamed-chunk-2-1.png](https://qiita-image-store.s3.amazonaws.com/0/149890/266d83f3-1c7b-4a96-ec32-8c30c8b3e53c.png)


今度も$z = x + y$に乗るが， 直線上に並んだ点を乗せる面は無数に描けるので
$z = 2x$,
$z = 0.1x + 1.9y$
$z = 100x - 98y$
などにも乗る．

回帰係数の標準誤差が大きく，その大小や正負の関係も信用成らないとはこのことかとお分かり頂けると思う．  
ということは，たまたま追加したデータのxまたはyが外れ値だったりすると，直前とは全く異なる面で回帰されるだろうことが分かる．

一方でどの式を解としても予測には影響がない．

#多重共線性を避けるには

回帰係数の大小に興味がなく，予測しかしないならば，多重共線性は必ずしも忌避すべきものではない．
ただし，観測値が不足すると，ランク不足により，説明変数を減らす必要が生じうる．
こんな時は明示的に説明変数を取捨選択してもいいし，LASSOなどの正則化を用いるのも手だ．
Rの基本[メモ]

#データ入力
`c()`を使う

`variable <- c(data1,data2,...)`

csvファイルなどを読み込む場合は

`x<-read.csv(“name.csv”,header=T, row.name=1)`

#functions

```r
mean(x)
var(x)
var(x,y)
cor(x,y)
sd(x): 標本標準偏差
median(x)

```

#probability

n=N,p=Pの2港分布に従う確率変数がXになる確率
`dbinom(X,N,p=P)`
などなど

#Random values
`data <-rnorm(n,mean,sd)`

#visual aids

##`hist()`:ヒストグラム
 |arguments|explanation|
|:--------------:|:------------------:|
| breaks|階級幅|
|col | color|

##`plot(x,y)`:散布図

##`curve(dnorm(x),from,to(,add=T))`:正規分布

#どこに書くか

スクリプト
「ファイル」→「新規文書」
kube-awsでaws-ssm-agentとRunCommandを試してみる

## kube-awsとは

AWS上にKubernetesクラスタをつくるツールです。GolangやCloudFormation、Container Linux(旧CoreOS)をベースにしています。

## RunCommandとは

Amazon EC2 Systems Managerというサービスの一機能で、AWSのAPI経由でEC2インスタンスにざまざまなコマンドを実行させることができます。

## aws-ssm-agentとは

RunCommandで送られたコマンドを実際に実行するデーモンです。

## 概要

kube-awsクラスタでRunCommandが利用できるようにします。

まず、aws-ssm-agentは公式にはrpmなどで配布されているのですが、基本的にContainer Linuxにはパッケージマネージャ的なものが存在しないのでそれが利用できません。そのため、Container Linux向けにビルドしたaws-ssm-agentをなんとかして手に入れる必要があります。

ありがたいことに、DailyHotelという会社さんがContainer Linux向けにaws-ssm-agentをビルド・公開してくださっているので、それを利用します。

https://github.com/DailyHotel/amazon-ssm-agent

また、kube-awsにはaws-ssm-agent対応があるので、ほぼcluster.yamlという設定ファイルの記述を少しいじるだけでセットアップは完了です。ただし、kube-aws 0.9.8の時点ではaws-ssm-agentの動作に必要なIAMポリシーがそのままだと付与されないというバグ？があるので、その点だけ手動でフォローする必要があります。

## 手順

`kube-aws init`、`kube-aws render`を実行して必要なファイルを生成したあと、cluster.yamlに以下を追記します。

```
amazonSsmAgent:
  enabled: true
  downloadUrl: https://github.com/DailyHotel/amazon-ssm-agent/releases/download/v2.0.805.1/ssm.linux-amd64.tar.gz
  sha1sum: a6fff8f9839d5905934e7e3df3123b54020a1f5e
```

`clusterName`は`k8s1`ということにします。
その場合、クラスタ名でIAMロールを検索すると下記のように3つでてきます。それぞれ、Controllerノード、Etcdノード、Workerノード用です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/5912/1dec6a60-2dd7-4de7-2506-347f598c2405.png)

それぞれに、AWSマネージドなIAMポリシー「AmazonEC2RoleforSSM」を追加します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/5912/f30d3384-216e-51f8-5075-6957d640fccb.png)

この時点でノードが起動完了してしまっている場合、aws-ssm-agentがエラーを吐き続けているかもしれません。（試した時は少なくともそう見えた）

その場合、aws-ssm-agentを再起動します。

```
sudo systemctl restart aws-ssm-agent
```

これで、あとはAWSコンソールから普段どおりRunCommandと`AWS-RunShellScript`ドキュメントを使ってクラスタ内の任意のEC2インスタンスに対して任意のシェルコマンドを実行することができます。

例えば、クラスタ内の全インスタンスを対象にしたい場合は、クラスタ名のタグが使えます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/5912/d68e19a2-acf7-b61b-e3a3-c913d9fe97de.png)

コマンドの実行結果（時刻、成否、標準出力など）は以下のように記録されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/5912/d43f32ba-fdb4-9eee-f1ed-1c35fb0c79c9.png)

CloudTrailなども使うと監査ログをとる目的ではかなり良さそうですね。
擬似クラス　カラムレイアウトでの便利な使用方法

# 擬似クラスによるカラムレイアウト
 フロントエンド開発をしていると必ずカラムレイアウトが登場します。
(正確には、グリッドレイアウトを用いたグリッドシステム、グリッドデザインと呼ぶ)  
そのカラムに対して、まるでテーブルレイアウトのようにborderを適用するが、擬似クラスを用いると<font color="red">プロパティの打ち消しを全くすることなく</font>実現できるので、備忘録がてら投稿致します。

※擬似クラス（nth-child, nth-of-type）の詳細に関しては、[擬似クラス nth-childとnth-of-type](https://qiita.com/kudo_kk/items/8277c1f0eae18e15dd64)をご確認ください。
※より実践的な留意点に関しては、[擬似クラス　カラムレイアウトでの留意点](https://qiita.com/kudo_kk/items/74e214eaf54bd97df1e4)をご確認ください。


## 単純なカラムレイアウト
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192967/27dcaa25-5d21-0d1e-ce41-5aad9b477b3b.png)


```css
.item {  /* 1〜9 */
  border-top: 1px solid gray;
  border-left: 1px solid gray;
}
.item:nth-child(3n) {  /* 3, 6, 9 */
  border-right: 1px solid gray;
}
.item:nth-last-child(-n+3){  /* 7〜9 */
  border-bottom: 1px solid gray;
}
```

##　上ボーダーのいらないカラムレイアウト
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192967/de352198-3f97-a5e2-0715-462c6449d851.png)

```css
.item {  /* 1 〜 9  */
  border-left: 1px solid gray;
  border-bottom: 1px solid gray;
}
.item:nth-child(3n) {  /* 3, 6, 9 */
  border-right: 1px solid gray;
}
```

下ボーダーのいらないカラムレイアウトは、.itemのborder-bottomをborder-topに変更するだけで可能。

## 上下ボーダーのいらないカラムレイアウト
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192967/5c11dc1b-1de9-f7d9-50ea-ebc5c0a5d648.png)

```css
.item {  /* 1〜9 */
  border-left: 1px solid gray;
}
.item:nth-child(3n) {  /* 3, 6, 9 */
  border-right: 1px solid gray;
}
.item:not(:nth-last-child(-n+3)){  /* 1〜6 */
  border-bottom: 1px solid gray;
}
```
上下にコンテンツがあるかbox-shadowがかかっている場合に必要になる。

## 上下左右ボーダーのいらないカラムレイアウト
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192967/dac8a972-228c-68b1-d231-a0e82492d1f6.png)


```css
.item:not(:nth-child(3n)) {  /* 1, 2, 4, 5, 7, 8 */
  border-right: 1px solid gray;
}
.item:not(:nth-last-child(-n+3)) {  /* 1〜6 */
  border-bottom: 1px solid gray;
}
```
BEMで言う、別のBlock内に内包されている場合など需要がある。
右の１列だけborder-rightがいらない。:not(:nth-child(3n))
下の１行だけborder-bottomがいらない。:not(:nth-last-child(-n+3))

お気づきだとは思いますが、行数をいくら増やしても同じ結果が得られるようになっています。
また、今回は、どれも３カラムだが、４カラムでも擬似クラスの中の `3`を `4` にするだけで同様の動作ができる。

## 使用した便利な擬似クラス
### nth-last-child
- nth-last-child(n): 最後からn番目に適用される
- nth-last-child(<font color="red">-n+3</font>): 最後から３番目まで適用される  

nth-first-child(-n+3)も同様で、最初から３番目まで適用される。

#### メリット
- プロパティの上書き回数を少なく、感覚的にレイアウトを実装することができる。

これらを使いこなせると他にも様々な応用ができると考えられる。

### not
- li:not(.item) //itemクラスでないliタグに適用される  
- .item:nth-child(3n):not(:nth-last-child(-n+3)) //最後から３番目までじゃない、かつ、3の倍数の要素がitemクラスなら適用

#### 注意点
- 上記のようにセレクタに連結して条件を増やすことができるが、連結しただけ詳細度が上昇する

※正確には、  
>否定擬似クラスの :not は詳細度の計算では擬似クラスとは見なされません。しかし、否定擬似クラスの中に置かれたセレクタは、通常のセレクタのように計算されます。
引用：[MDN](https://developer.mozilla.org/ja/docs/Web/CSS/Specificity)

## 参考
- [何番目系の便利なcssまとめ](https://qiita.com/ituki_b/items/62a752389385de7ba4a2)
[超初心者]ソースツリーについて

現在、アイフォンアプリ製品化に向けて共同開発で作業しているのですがソースツリーを利用し、データを共有して作っています。
ですが、そのデータを（相手が）コミットしても何故か修正前のデータは出るのですが最新のデータが反映されません。
　・相手の方はちゃんと最新のデータをコミットしています。
Googleで検索しても全く原因がわかりません。
Ruby — rubocop のネームスペース変更に対応する

# 概要

rubocopのバージョンアップによりネームスペースが変わる場合があるので、`.rubocop.yml` を書き換える。

# 警告の例

```
$ rubocop
```

```
.rubocop.yml: Style/ExtraSpacing has the wrong namespace - should be Layout
```

# .rubocop.yml

警告に `should be Layout` と書かれていたとおり、ネームスペースを `Layout` に変更する。

```diff:rubocop.yml
- Style/ExtraSpacing:
+ Layout/ExtraSpacing:
  Enabled: false
```

# 環境

- rubocop 0.49.1
- ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin16]








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ELBでオレオレ証明書を使う時にエラーが出てインポートできない問題（メモ）

# 状況
- ELBに証明書を持たせてhttps接続を行いたい
- オレオレ証明書をインポートしようとするとエラーが出る

# 調べた結果
- sgでELB-インスタンス間の443と80を開けると行ける
- aws-cliだと行けるらしい（やったことないから使いたくない...）
- エラー内容はドメイン情報不足らしいけどドメイン情報を入れてもダメ

# 解決
- secret keyを作成する時にJPとかTOKYOとかをちゃんと入れるとできた
- メールアドレスとかを入れたのが良かったのかなぁ...
iOS SafariにjQuery Mobileでtextareaに改行込みの値をセットする


普通は

```sample.js
$('#TEXTAREA').val('値');
```

で，セットできるが，改行込みになるとiOS Safari等で改行されない事がある．

##### `\n` を `\r\n` で置換してもダメ


### 構成

```sample2.html
<div id="d">
	<textarea id="ta">hogehoge</textarea>
</div>
```

ここの `hogehoge` を `fuga（改行）fuga` に変更したい．

##### JSでの処理


```sample2.js
$('#d').empty();
$('#d').html('<textarea id="ta">fuga\r\nfuga</textarea>');
$('#ta').textinput();
```

これで改行込みでtextareaに（を）セットできる（iOS Safariでも改行されて表示される）

#### 解説

1行目でtextareaを削除し
2行目でfuga（改行）fuga込みでtextareaを新設
3行目でjQuery Mobile用に初期化している



-----

もっと，上手い方法があったような気がするけどググっても見つけられなかった…
データディレクトリやキャッシュディレクトリをエクスプローラで開く

#環境
Unity2017.1.1p3

#概要
persistentDataPathやCacheのパスを忘れてしまうのでメニューから開けるようにしました。
それだけです。

#プログラム
Assets/Editor/ShowInExplorer.cs

~~~c#
using UnityEditor;
using UnityEngine;

public class ShowInExplorer
{
	[MenuItem( "Tools/ShowInExplorer/PersistentDataPath" )]
	private static void OpenPersistentDataPath()
	{
		var path = Application.persistentDataPath;
		RevealInFinder( path );
	}

	[MenuItem( "Tools/ShowInExplorer/DataPath" )]
	private static void OpenDataPath()
	{
		var path = Application.dataPath;
		RevealInFinder( path );
	}

	[MenuItem( "Tools/ShowInExplorer/TemporaryCachePath" )]
	private static void OpenTemporaryCachePath()
	{
		var path = Application.temporaryCachePath;
		RevealInFinder( path );
	}

	[MenuItem( "Tools/ShowInExplorer/DefaultCachePath" )]
	private static void OpenDefaultCachePath()
	{
		var path = Caching.defaultCache.path;
		RevealInFinder( path );
	}

	[MenuItem( "Tools/ShowInExplorer/StreamingAssetsPath" )]
	private static void OpenStreamingAssetsPath()
	{
		var path = Application.streamingAssetsPath;
		RevealInFinder( path );
	}

	[MenuItem( "Tools/ShowInExplorer/ApplicationPath" )]
	private static void OpenApplicationPath()
	{
		var path = EditorApplication.applicationPath;
		RevealInFinder( path );
	}

	[MenuItem( "Tools/ShowInExplorer/ApplicationContentsPath" )]
	private static void OpenApplicationContentsPath()
	{
		var path = EditorApplication.applicationContentsPath;
		RevealInFinder( path );
	}

	private static void RevealInFinder( string path )
	{
		Debug.Log( "ShowInExplorer:" + path );
		EditorUtility.RevealInFinder( path );
	}
}

~~~
AWS上にSuperset+MySQL+RedisをDockerを使ってサクッと起動する

## 参考にした記事など
* https://github.com/amancevice/superset/blob/master/examples/mysql/docker-compose.yml
* http://blog.soushi.me/entry/2017/04/07/165144
* https://qiita.com/neko-neko/items/de8ea13bbad32140de87
* https://qiita.com/suzukihi724/items/91950450734e4c9913cf


# やったこと
* [Superset](https://github.com/apache/incubator-superset) をDockerを使ってさくっと動かしてみました
    * https://github.com/amancevice/superset/tree/ce534c15a4752642098c4a7beffaf44233b60bc0/examples/mysql が大いに参考になりました(むしろほぼこれ)
    * MySQLのイメージをそのまま使うとcharsetがlatin1になり日本語などを使う場合に不都合なのでutf8mb4にしています

* docker 17.03.2-ce
* docker-compose 1.16.1
* Superset 0.20.4
* MySQL 5.7
* Redis 4.0.2

# 前提
* docker環境
    * git, docker, docker-composeが必要となります
    * https://qiita.com/suzukihi724/items/91950450734e4c9913cf#1-ec2%E3%81%AB%E6%9C%80%E4%BD%8E%E9%99%90%E5%BF%85%E8%A6%81%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97 に分かりやすく書かれていますのでそちらを御覧ください
        * docker-composeは https://docs.docker.com/compose/install/#install-compose から最新のバージョン番号を確認し新しいものを入れると良いと思います

# 1) Docker起動
```
$ sudo service docker start
$ sudo chkconfig docker on
```

# 2) docker-compose.yml
```
$ git clone https://github.com/amancevice/superset.git
$ cd superset
```

* docker-compose.yml


```
version: '3'
services:
  superset:
    build:
      context: .
      args:
        SUPERSET_VERSION: 0.20.4
    image: amancevice/superset
    ports:
      - 80:8088
    depends_on:
      - mysql
      - redis
    volumes:
      - ./superset:/etc/superset
    restart: always

  mysql:
    container_name: mysql
    image: mysql:5.7
    restart: always
    ports:
      - 3306:3306
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: superset
      MYSQL_DATABASE: superset
      MYSQL_USER: superset
      MYSQL_PASSWORD: superset
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci

  redis:
    image: redis
    restart: always
    volumes:
      - redis:/data
volumes:
  mysql:
    external: false
  redis:
    external: false
```
* ポイントは mysql の commandに `--collation-server=utf8_unicode_ci` を付けているところです

# 3) superset_config.py
superset/superset_config.py

```
import os

MAPBOX_API_KEY = os.getenv('MAPBOX_API_KEY', '')
CACHE_CONFIG = {
    'CACHE_TYPE': 'redis',
    'CACHE_DEFAULT_TIMEOUT': 300,
    'CACHE_KEY_PREFIX': 'superset_',
    'CACHE_REDIS_HOST': 'redis',
    'CACHE_REDIS_PORT': 6379,
    'CACHE_REDIS_DB': 1,
    'CACHE_REDIS_URL': 'redis://redis:6379/1'}
SQLALCHEMY_DATABASE_URI = 'mysql://superset:superset@mysql:3306/superset?charset=utf8mb4'
SQLALCHEMY_TRACK_MODIFICATIONS = True
SECRET_KEY = 'thisISaSECRET_1234'
ENABLE_PROXY_FIX = True
```
* ALBなどを使ってhttpsでアクセスする場合 `ENABLE_PROXY_FIX = True` がないとhttpにリダイレクトされます

# 4) 起動
```
$ docker-compose up -d
```

# 5) 管理アカウント作成
```
$ docker-compose exec superset superset-init
Username [admin]: 
User first name [admin]: 
User last name [user]: 
Email [admin@fab.org]: 
Password: 
Repeat for confirmation: 
```

これで作成した管理アカウントでログインできるようになりした
【Laravel】 バリデーション -  unique ルール（論理削除-SoftDeletes 対応)

##概要
Laravelで論理削除(SoftDeletes)を設定している場合、
バリデーションで理論削除したデータも引っかかる。。。

条件を追加（削除したデータを除外）したい！を実現するにあたり
ハマったのでメモとして残しています。

##サンプル

```ruby:Laravel
'email' => 'required|unique:member,email,40,id,deleted_at,NULL',
`````
↓

```ruby:SQL
SELECT email 
FROM member
WHERE id != '40'
AND deleted_at = 'NULL'

※ 必須(required)は無視しています
`````

##uniqueのパラメータ内容

|パラメータ|内容|必須|補足|
|:-----------------|:------------------|:------------------|:------------------|
| 第1|テーブル |必須||
| 第2|カラム|必須||
| 第3|除外データ|除外したいデータがある場合は、必須<br>（データを編集の時など）|デフォルトはIDのデータを記述する。<br>※現時点では、理論削除に対応されていない|
| 第4|除外カラム名<br>（デフォルトはID）|下記の場合、必須<br><br>・「除外データ（第3）」が「'テーブル（第1）'.’id’」以外<br><br>・追加条件（第5を追加する）||
| 第5|追加条件の<br>カラム（1）|下記のる場合、必須<br><br>・理論削除に対応<br>・条件を追加する|'deleted_at'を追加<br><br>または、<br>条件追加のカラム名|
| 第6|追加条件の<br>内容（1）||'NULL'を追加<br><br>または、<br>条件追加の内容|
| 第7|追加条件の<br>カラム名（2）||| 
| 第8|追加条件の<br>内容（2）|||


バリデーション 5.1 Laravel
https://readouble.com/laravel/5.1/ja/validation.html
Django Rest FrameworkでAPIのURLにアクセスされた時の表示について


本番環境にDjango Rest Frameworkで作ったAPIを実装し、そのAPIへブラウザから直接アクセスした時、何も対処しないと以下のように表示され、しかもここからPOSTできることになってしまい、かなりよろしくない
![スクリーンショット 2017-10-20 16.05.01.png](https://qiita-image-store.s3.amazonaws.com/0/80787/881dde35-b299-80dc-94a9-e141cee3c712.png "スクリーンショット 2017-10-20 16.05.01.png")


なので、settings.pyで以下のようにしてあげると

```python:settings.py
REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    )
}
```

APIへブラウザから直アクセスしても以下のようになり、良い感じです
![スクリーンショット 2017-10-20 16.07.05.png](https://qiita-image-store.s3.amazonaws.com/0/80787/a782c305-5625-200a-5fde-f1479927488b.png "スクリーンショット 2017-10-20 16.07.05.png")
クラスとモジュール

application_helper.rbやuser_helper.rb、static_page_helper.rbといったヘルパーにおいて下記のような記述があります。


```rb:application_helper.rb

module ApplicationHelper
  def full_title(page_title)
    base_title = "Ruby on Rails Tutorial Sample App"
    if page_title.empty?
      base_title
    else
      "#{page_title} | #{base_title}"
    end
  end
  
  def bootstrap_class_for(flash_type)
    case flash_type
      when :success
        "alert-success"
      when :error
        "alert-danger"
      when :alert
        "alert-warning"
      when :notice
        "alert-info"
      else
        flash_type.to_s
    end
  end
end
```

1行目のclassが来る位置にある「module」って一体何なんだろうと思って調べてみました。

結論から言ってしまいますが、

クラスはインスタンスを作るための設計図、つまりオブジェクトになることが出来るもの（インスタンス化できる）。

モジュールはインスタンス化できないが、処理を記述してめとめておくことができる。

#モジュールはクラスに取り込むことが出来る

モジュールをクラスに取り込むことをmixinといいます。

ちなみにRubyではクラスを継承することができ、親のクラス（スーパークラス）のインスタンスメソッドを、子のクラス（サブクラス）が受け継ぎます。


```rb:taiyali.rb

module Taiyaki
    
    def Oyoge_Taiyaki_kun
        puts "まいにちまいにち"
        puts "ぼくらはてっぱんのうえで"
    end
    
    def taiyaki
        @taiyaki = "taiyakikun"
    end
end

class Yatai
    def the_tayai
        puts "屋台グルメは美味しい"
    end
end

class TaiyakiYatai < Yatai
    include Taiyaki
    def anko
        @anko = "anko"
    end
    
    def custard
        @custard = "custard"
    end
    
    def shiro_an
        @shiro_an = "shiro_an"
    end
    
    def self.name
        "Taiyakikun Shop"
    end
end
```
上記のコードでは、TaiyakiYataiクラスはYataiクラスを継承しています。

更に、20行目の「include Taiyaki」という記述により、TaiyakiYataiクラスはTaiyakiモジュールをmixinしていることになります。


つまりどういうことかというと・・・

Yataiクラスで定義されているインスタンスメソッド(the_Yatai)はTaiyakiYataiクラスで使用できます。
（19行目の「class TaiyakiYatai < Yatai」という記述によりYataiクラスがスーパークラス、TaiyakiYataiクラスがサブクラスという関係になっているためです）



そしてTaiyakiYataiクラスはTaiyakiモジュールをmixinしているため、Taiyakiモジュールで定義されているインスタンスメソッド(Oyoge_Taiyaki_kun)はTaiyakiYataiクラスで使用することが出来ます。

#まとめ
クラスはインスタンス化する能力を持ち、メソッドを格納することが出来ます。

モジュールはインスタンス化する能力を持たないが、メソッドを格納することができます。



クラスにモジュールを取り込むことをmixinと呼び、コード内ではincludeという記述を使います。
アセットパイプラインについて

Railsを学んでいく中で、突然「アセットパイプライン」というワードが飛び出してきました。

「なにこれ？」と思って調べてみました。

#ざっくり言うとアセット関連のことを処理してくれるもの

アセット、つまりCSSやJavaScriptに関わることを色々やってくれているものがアセットパイプラインになります。

RailsではCSSやJavaScriptのファイルを複数作成可能です。また、ファイル内でも改行したりインデントをそろえたりすることで見やすく、保守作業がやりやすいソースコードを書いていくわけです。

ここで問題になるのがファイル容量になります。

実はRailsの裏では、アセットパイプラインが、こうした複数のCSSファイル・JavaScriptファイルをひとまとめにしてくれているそうです。

こうすることでファイル容量が小さくなります。



また、アセットパイプラインはコンパイラとしての役割も備えています。

Saasは、それ単独ではコンピュータが理解してくれません。

そこでRailsが、アセットパイプラインという機能を使って、Sassをコンピュータにも理解できるよう翻訳してくれているのです。

#参考リンク先

アセットパイプライン | Rails ガイド　https://railsguides.jp/asset_pipeline.html

Ruby on Rails チュートリアル　5.2.1　アセットパイプライン　https://railstutorial.jp/chapters/filling_in_the_layout?version=5.1#sec-the_asset_pipeline
iOSシミュレータのフォトライブラリに画像を簡単に入れる方法

画像を処理や加工、アップロードなどするアプリを作る時、デバイスでいちいち確認したくない。
シミュレータでやりたい。

これまではシミュレータにマウントされるディレクトリをファイルシステムから探して〜

メンドウクサイ、メンドウクサイよ！

実は、シミュレータにFinderからドラッグ・アンド・ドロップするだけで、シミュレータのフォトライブラリに入るようになる。

もうご存じの方が数多いるかもしれないが、これは便利だぞ！と思った次第。
[RHEL7]/etc/resolv.conf 強制上書き無効

## この記事を書くことになった経緯
RHEL7 で /etc/resolv.conf を書き換えたが再起動すると毎回
強制的に書き換わってしまったので備忘録を兼ねて投稿。


# /etc/resolv.conf が書き換えられないようにする手順

## 1. /etc/NetworkManager/NetworkManager.conf に設定を追記する。
- 追記する行: **dns=none**

- **必ず[main] のところに追記してね**

```bash
$ cat /etc/NetworkManager/NetworkManager.conf
[main]
plugins=ifcfg-rh
dns=none <= ここ
```

## 2. 設定を反映するために NetworkManager のサービスを再起動する。

```bash
$ sudo systemctl restart NetworkManager
```

## 3. /etc/resolv.conf にリゾルバを追記する

- 以下は例です

```bash
$ cat /etc/resolv.conf
search hogehoge.com
nameserver 192.168.0.8
nameserver 192.168.0.9
```

再起動しても /etc/resolv.conf が書き換えられていなければ成功です。
Qiita記事の書き方〜基本の基本〜


自分用メモも兼ねて、記事の書き方(Markdown記法)についての初投稿です＾＾



#参考資料様
大変お世話になっております。
１)コチラさえ読んでおけば記事がかける…かけるぞォォオオ
　<a href="https://qiita.com/cloversoft/items/0f12f3a739312d35cb8f" target="_blank">Qiita初心者の投稿方法備忘録</a>
2)先生ェー！バッククオートが表示したいです！！なんてときはこちら
　<a href="https://qiita.com/usagizmo/items/0c8c6bb54d13e818f2d0" target="_blank">Markdown コードブロック中にバッククオート3つを表示したい</a>
3)他の記号も表示させたいよおおおんってときはこちら
　<a href="https://qiita.com/higuma/items/3344387e0f2cce7f2cfe" target="_blank">Markdown文法まとめ</a>
4)画像とかチェックボックスだって入れたいのぉんってときはこちら
　<a href="https://qiita.com/toshihirooya/items/949f571b85cd7c297cca" target="_blank">Markdown記法についてまとめてみた</a>
5)綺麗な書き方サンプルほしい方はこちら
　<a href="https://qiita.com/tbpgr/items/989c6badefff69377da7" target="_blank">Markdown記法 サンプル集</a>




#コードの載せ方
参考様に従い、やってみるぜコード挿入！

```Python:GM_world.py
 print "Good morning world"
```





#引用
コードがあるだけでなかなか記事っぽくなってまいりました。
次いってみよー

> (空行)
> \`\`\`Python:GM_world.py
> print "Good morning world"
> \`\`\`
> (空行)

さっきのコード挿入のやつです。
※引用するときは「>」を頭につけると、左に先が入った引用部分になります

ふふふ、実は、コード挿入はバッククオートで始まりバッククオートで終わっていたのだ勇者よ...
そしてバッククオートを表示させるのはちょっとめんどくさかったぞ勇者よ....

>
\`\`\`\`\`\`Python:GM_world.py
print "Good morning world"
\`\`\` \`\`\`

後ろのバッククオートたちの間にスペースがあるのがポイント(たぶん)
ではでは次へGO

※10月22日
　バッククオート表示方法を修正しました。
　なるほど「'」の前に「\」を入れれば良いのね！
　altさんありがとうございます!!!!



#強調
##*イタリィーーーーーッック(斜め字)* ＆**太字**
強調してみました。
>
<p> *イタリィーーーーーッック(斜め字)* ＆**太字** </p>
>

ちなみに下は斜体で太字(ほんとに斜体かと疑うくらいの絶妙な傾き)

##**_5000兆円ほしい_**

>
<p> **_5000兆円ほしい_** </p>
>



斜体＋太字の時は「*」と「_」を合わせて使うとよいです

囁きかけるような5000兆円になってしまいましたね
やっぱりあのフォントじゃないと雰囲気が出ませんね

フォント変更方法はちょっとわからなかったのでまたの機会に


#画像挿入

![alt](https://pbs.twimg.com/media/C912A1iVoAAxjmO.png:large)

ほしいよね
>
<p> ![alt](https://pbs.twimg.com/media/C912A1iVoAAxjmO.png:large) </p>
>

URLのところを変えるだけでお好きな~~5000兆円~~画像を表示できます



#あとがき
自分が使いそうなものを一通りまとめてみました

html系を使うと10年くらい前の闇の腐女子時代の記憶がうずいていいですね
キリ番、リクエスト、パスワードが隠れたURL、、、、、うっ、頭が
Phoenixアプリでbasic_authメモ


## モジュール
https://hexdocs.pm/basic_auth/readme.html
elixirのこのモジュールを利用してベーシック認証を設定する
基本はドキュメントの通りにすれば良いだけ


## モジュールの追加

``` mix.exs
defp deps do
  [{:basic_auth, "~> 2.2"}]
end
```

``` 
mix deps.get
```


## 設定
``` config.exs
config :app_name, basic_auth: [
  realm: "Jirou",
  username: "myname",
  password: "pass"
]
```

configにアカウント設定したらbasic認証を追加したいコントローラで

``` test_controller.ex
defmodule TestController do

	plug BasicAuth, use_config: {: app_name, : basic_auth}

end
```
こうすることでbasic認証を追加することができる。
WIP > SSD > True Imageでの移行 > 開始オフセットが1,048,576になる > Error loading operating system

WIP (Work in progress)

```txt:動作環境
Windows 7 Pro (32bit)
移行元: S-ATA 40GB (Windows XP Professional)
移行先: m-SATA 30GB (INTEL BLK SSD 525 Series)
ツール: 玄人志向 mSATA SSD SATA変換アダプター (KRHK-MSATA/S7)
ツール: 玄人志向 mSATA SSD IDE変換アダプター (KRHK-MSATA/I9)
```

12年くらい前のS-ATAを故障予防目的でm-SATAに移行しようか検討している。

### 移行処理

True Image 2012にて「手動 > 移行先に合わせる」で移行元から移行先へクローン。

### パーティション開始オフセットの確認

参考: http://www.pc-master.jp/jisaku/aft.html by パソコン初心者講座さん

- msinfo32実行
    - ファイル名を指定して実行
- コンポーネント > 記憶域 > ディスク
   
移行先のm-SATAの「開始オフセット」は1,048,576だった。
移行元のS-ATAの「開始オフセット」は32,256。

なんらかの方法で移行先のm-SATAの「開始オフセット」を32,256にしないと、正常動作しない気がする。

参考: http://www.smiyasaka.com/windowsXP_SSD.html by 四国の宮坂家さん
参考: http://www.pcksfactory.com/hdd/aft.html by ケーズファクトリさん

### 問題ない?

http://z0001.blog87.fc2.com/blog-entry-311.html by わーとんさん
> Windows XPでの使用なのでパーティション開始オフセットが5,120バイトになってます。これが、4,096で割り切れる数字になっていないと4Kのパフォーマンスが落ちるらしい。

1,048,576は4,096で割り切れる。

起動してみた。

> Error loading operating system
Hello World!!!


## Kobito連携のテスト
初投稿となりますが、Kobitoで編集してアップロードのテストも兼ねて
いつものHelloWorld!!です。

Hello World サンプル

```cpp:HelloWorld
#include <iostream>

auto main() -> int {
    std::cout << "Hello World !!!" << std::endl;
    return 0;
}
```