OmniAICreator/Qiita-1.07M huggingface dataset:
babelのwatch機能がdockerコンテナ上で動かない

### 経緯
- トランスパイル用のdockerコンテナをチームで共有したい
 - **babel単体**(モジュールバンドラ無し)

### 事象
- jsファイルをdockerコンテナ上にマウント
- dockerコンテナ上でトランスパイル

```json:package.json
"scripts": {
 "build": "babel ./hoge/js --watch --out-dir ./hoge/output"
}
```

- **何故か『watch』機能**(変更検知 ⇒ 再トランスパイル)**が動作しない**

### 解決
dockerfileに以下を追加

```dockerfile:Dockerfile
ENV CHOKIDAR_USEPOLLING=true
```

### 原因(?)
- babel-cliのwatchオプションでは、内部的に[**chokidar**](https://github.com/paulmillr/chokidar)を利用している
  - 環境によっては[**chokidarの設定を変更しなければ、babelのwatchが動作してくれない**](http://discuss.babeljs.io/t/babel-watch-does-not-work-for-me/478)(らしい)

### その他
- 今のご時世でbabelが単体利用されるシーンってどんな時なんだろうか・・・  



　
　
以上、覚書レベルの投稿でした。
Project Euler Q56 【もっとべき乗の数字和】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
$Googol (10^{100})$は非常に大きな数である: $1$の後に$0$が$100$個続く. $100^{100}$は想像を絶する. $1$の後に$0$が$200$回続く. その大きさにも関わらず, 両者とも数字和 ( 桁の和 ) は$1$である.

$a, b < 100$ について自然数 $a^b$ を考える. 数字和の最大値を答えよ.

## 解答

```bash
time seq 99 |
awk -M '{for(i=1;i<=99;i++){print $1^i}}' |
awk -v FS= '{for(i=1;i<=NF;i++){s[NR]+=$i};print s[NR]}' |
sort -k1,1nr |
head -1
972

real    0m0.536s
user    0m0.543s
sys     0m0.137s
```

ただ計算すればいいので特にコメントはない。
`awk`の`-M`オプションが使用できる環境が必要。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/056.html
iPhoneでソースを確認する方法

## はじめに
正月やGWなど長期の休みは、ブラっと、
手ブラで外出をしたい人多いですよね。
でもそんな時、突然のハプニング、、
WEBサイトのソースを確認しなくてはいけなくなった場合困りますよね。

そんな時のために、
“View Source”のアプリをダウンロードしておくと
便利です。

## View Sourceのインストール

![4.png](https://qiita-image-store.s3.amazonaws.com/0/58950/82fa1be7-b9b5-3d07-6f64-ca0009cde3f4.png)


Apple Storeから検索にて、”View Source”を探してインストールします。


## 使い方

![3.png](https://qiita-image-store.s3.amazonaws.com/0/58950/b7c4cfc7-bf43-03d6-14f1-3a732d4d9be6.png)


Safariで、対象のページを開きます。
その後、共有マークをタッチ。


![6.png](https://qiita-image-store.s3.amazonaws.com/0/58950/d4deed41-25a9-35c8-e558-3d8207d77172.png)


その他を選択します。



![2.png](https://qiita-image-store.s3.amazonaws.com/0/58950/e2e1cd4e-ecc5-a349-f55d-445dff239ef5.png)


View Sourceがありますので、スイッチONに


![1.png](https://qiita-image-store.s3.amazonaws.com/0/58950/78cee377-73fb-2bdc-18ec-a7bcca6f59ff.png)


そうすると View Sourceが表示されます。


![5.png](https://qiita-image-store.s3.amazonaws.com/0/58950/9edf6861-1e28-98cf-ea71-6b629ef0b413.png)


クリックするとソースを見ることが出来ます！

## PCページの確認
![3.png](https://qiita-image-store.s3.amazonaws.com/0/58950/fe3956b1-3671-c076-d4e2-f80ee2f2a63e.png)


Safariで、対象のページを開きます。
その後、共有マークをタッチ。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/58950/b9543036-e82c-9372-a5c4-77e8960d3442.png)


デスクトップ用サイトを表示を選択します。
画面がPC表示に変わるので再度View Sourceを選択します。


なんにしても、ソースを見て不具合があった場合、
ソースの修正をしなくてはなりません。
PCでの作業が必要な場合は、急いで帰りましょう、、。
Firebase CLIで作成したTypeScriptのFirebase Cloud Functionsのプロジェクトをファイル分割

index.tsに記述した複数のFunctionを別ファイルに分割する方法です。
特別なことはしていませんが、メモとして残しておきます。

## 前提

```
$ firebase -V
3.16.0
```

前提として、Firebase CLI(firebase-tools)にて次のように初期化したプロジェクトを前提に進めます。

```
$ mkdir firebase-functions && cd firebase-functions
$ firebase init functions
-- 略
? Select a default Firebase project for this directory: [create a new project]
-- 略
? What language would you like to use to write Cloud Functions? TypeScript
? Do you want to use TSLint to catch probable bugs and enforce style? Yes
-- 略
? Do you want to install dependencies with npm now? Yes
```

## ファイル分割しないパターン

Firebase CLIを使ってCloud Functionsを使用するプロジェクトを初期化すると、`functions/src`以下に、`index.ts`が作成されます。
同一のプロジェクトFunctionを追加する場合、次のようにこのファイルに追記していけば、`firebase deploy --only functions`実行時に複数Functionが同時にデプロイされます。

```typescript:index.ts
import * as functions from 'firebase-functions';

export const helloWorld = functions.https.onRequest((request, response) => {
 response.send("Hello World!");
});

export const helloFirebase = functions.https.onRequest((request, response) => {
 response.send("Hello Firebase!");
});

export const helloTypeScript = functions.https.onRequest((request, response) => {
 response.send("Hello TypeScript!");
});
```

## ファイル分割する

Functionが増えてきたときに辛いので、ファイル分割してみましょう。
TypeScriptのビルド設定が記述されている`tsconfig.json`を見てみると、次のように`functions/src`以下が対象として指定されているので、何も考えずTypeScriptのモジュールシステムに従ってファイルをFunctionごとに分割していけばよさそうです。

```typescript:tsconfig.json
{
  "compilerOptions": {
    "lib": ["es6"],
    "module": "commonjs",
    "noImplicitReturns": true,
    "outDir": "lib",
    "sourceMap": true,
    "target": "es6"
  },
  "compileOnSave": true,
  "include": [
    "src"
  ]
}
```

まずは、`functions/src`以下にFunctionごとのファイル`helloWorld.ts`、`helloFirebase.ts`、`helloTypeScript.ts`を作成します。

```typescript:helloWorld.ts(例)
import * as functions from 'firebase-functions';

export const helloWorld = functions.https.onRequest((request, response) => {
 response.send("Hello World!");
});
```

index.ts側では次のようにimport/exportするだけです。

```typescript:index.ts
import { helloWorld } from './helloWorld';
import { helloFirebase } from "./helloFirebase";
import { helloTypeScript } from './helloTypeScript';

export {
  helloWorld,
  helloFirebase,
  helloTypeScript
}
```

## デプロイについて

プロジェクト内の全てのFunctionをデプロイする場合

```
$ firebase deploy --only functions
```


指定したFunctionのみをデプロイする場合(次の例ではhelloWorldのみをデプロイするように指定)

```
$ firebase deploy --only functions:helloWorld
```

## 参考

https://firebase.google.com/docs/cli/?hl=ja#partial_deploys
PostgreSQLで時間ごとのレコード数集計をいい感じに行う

# やりたいこと

* 時間ごとのレコード数の集計を取りたい
* レコードが生成されない時間もある。その時はゼロ扱いとしたい。

# サンプルデータ

## テーブル定義 

| カラム名 | データ型 | 備考 |
|---|---|---|
| seq | serial | 通番 |
| freetext | text | 何らかのデータ |
| created_at | timestamp | 作成日時(default current_datetime)|

実際は`freetext`以外にも入力値等を記録するカラムが存在するが割愛。

## 期待する出力結果

| datetime | count |
|---|---|
| 2017/12/27 12 | 17 |
| 2017/12/27 11 | 5 |
| 2017/12/27 10 | 0 |
| 2017/12/17 09 | 0 |

1時間ごとのレコード数の集計を行いたい。
該当期間にレコードがなければ、ゼロとしたい。

# 実例

## 3日前から1時間ごとのレコード数集計を行いたい

```postgresql
SELECT
	datetable.datetime,
	COALESCE(total.cnt, 0) as count --(5) NULLデータをゼロに変換する
FROM
(
	-- (3)日付時刻の連続データを自動生成する
	SELECT TO_CHAR(generate_series, 'YYYY/MM/DD HH24') as datetime 
	FROM
		generate_series(
			CAST(TO_CHAR(NOW() + INTERVAL '-3 day',  'YYYY/MM/DD HH24:00:00') AS timestamp),
			CAST(TO_CHAR(NOW(),                      'YYYY/MM/DD HH24:00:00') AS timestamp),
			'1 hour'
		)
) AS datetable

-- (4)日付時刻の連続データと、集計データを外部結合する
LEFT JOIN
(
	-- (2)データテーブルのデータを日付時刻(時間)で集計する
	SELECT
		TO_CHAR(created_at, 'YYYY/MM/DD HH24') as datetime,
		count(*) AS cnt
	FROM
		(
			-- (1) データテーブルのデータを、予めフィルタリングしておく副問い合わせ
			SELECT * FROM datatable
			WHERE created_at >= CAST(TO_CHAR(NOW() + INTERVAL '-3 day', 'YYYY/MM/DD HH24:00:00') AS timestamp)
		) as source
	GROUP BY datetime
) AS total
ON datetable.datetime = total.datetime

ORDER BY datetable.datetime DESC
```

## 解説

1. データテーブルのデータを予めフィルタリングする
必要なデータだけカウントするよう、あらかじめフィルタリングしておく
この例では日付のみ行っているが、ほかに絞り込み条件がある場合はここでやっておく

2. データテーブルのデータを日付時刻(時間)で集計する
`created_at`の分・秒を切り捨てたものでグループ化し、件数をカウントする

3. 日付時刻の連続データを自動生成する
PostgreSQLの固有関数 `generate_series` を用いて、1時間ごとの連続データを生成する

4. 日付時刻の連続データと、集計データを外部結合する
集計データ側に存在しないものは`NULL`となる

5. NULLデータをゼロに変換する
`NULL`だった場合、任意の値に変換してくれる `COALESCE` 関数を使用し、`NULL`をゼロに変換する

## 注意点

* データテーブル側のボリュームが大きい場合は、(1)で絞り込みをしておかないと速度に影響する

* (2)と(3)で使用するデータの書式を合わせておかないと結合が出来ない

* 今現在を起点に特定期間(3日前から等)の集計を行う場合、日付時刻の扱いに注意する
単純に `NOW() - INTERVAL('-3 day')` などを用いると、分・秒まで絞り込みに使われてしまい、データの取りこぼしが発生する
上記例では、`TO_CHAR(NOW() + INTERVAL '-3 day', 'YYYY/MM/DD HH24:00:00')` で、分・秒を切り捨て、`timestamp`型にキャストすることで回避している


# あとがき

* 自分用にメモした内容です。必要に応じて読み替えてください。
* こうしたほうがいいよ的なアドバイスを頂けると大変助かります

以上
「no submodule mapping found in .gitmodules」解決の一例です

誤って`repoA`の中で、 `git clone hadoop` し `git add && commit` したの話です。

```shell
$ cd repoA

$ git clone github:/abc/hadoop

$ git add .
warning: adding embedded git repository: hadoop
hint: You've added another git repository inside your current repository.
hint: Clones of the outer repository will not contain the contents of
hint: the embedded repository and will not know how to obtain it.
hint: If you meant to add a submodule, use:
hint: 
hint: 	git submodule add <url> hadoop
hint: 
hint: If you added this path by mistake, you can remove it from the
hint: index with:
hint: 
hint: 	git rm --cached hadoop
hint: 
hint: See "git help submodule" for more information.

```

warningを無視しつづきに：

```shell
$ cd hadoop/
$ rm -rf .git/
$ git commit -m "xxx"
```

が、他の人は`repoA`をCloneできなくなってきました：

```shell
fatal: no submodule mapping found in .gitmodules for path 'hadoop'
```

`repoA`の配下に`.gitmodules`もなければ、`.git/config`にもSubmodulesに関するものもない。

解決方法はこれです。

```
# ファイルパーミッションにSubmoduleになっているものを探す
$ git ls-files --stage | grep 160000
160000 58e597f4bb5d3f15680a25814bfee5041027b7c9 0	hadoop

# 一旦ｒｍする
$ git rm --cached hadoop
rm 'hadoop'


$ git status

# 追加戻し
$ git add .
$ git commit --amend

```
Windows10(64bit)でMecabの環境構築に苦戦した

#実行環境
Windows 10 64-bit
Python 3.6 (64-bit版Anacondaの仮想環境上)
#Mecabの環境設定
形態素解析ツールMecab
Windowsの場合はexeのものを指定して文字コードを指定してインストールします。（その際、文字コードをUTF-8を選択する）
対象ダウンロードは下記の通り
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/4f20a7b6-2d9b-662f-f3d0-6a4a321d4420.png)

しかし、32bit版しかありません。そのため、MeCab本体を64-bitでコンパイルし直し、関連ファイルを64bit版に更新する必要があります。

#Mecabをインストール
http://taku910.github.io/mecab/#download
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/8a718af3-2faa-7aaf-b5af-6d966532363d.png)
デスクトップにショートカットも出てくるのでクリックするとコマンドプロントもどき？が出てきます。すでに辞書もインストールできているので、直接文字を入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/de009837-295a-33f3-81dd-5a00870c3e81.png)
文字化けです。この文字化けを改善するのにMeCabの64bit化をする必要があります。
#Visual Studio 2017のインストール
MeCab本体を64-bitでコンパイルし直し、関連ファイルを64bit版に更新するために必要なものです。
参照したサイトでは2015版をインストールするように推奨されていましたが、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/70ef1155-44a9-bbed-cd25-114ad0d4bc36.png)

そのため2017年版で実装します。
ファイルを書き換えないといけないようなのでファイルを解凍・・・・
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/11de3fc9-bd05-1f6c-65b3-666787f59dd9.png)

文字化けしてる。どうすればいいのか途方に暮れる。10回ぐらいインストールと再インストールを繰り返し、半日費やしてしまいました・・・

#Janomeを使おう！

```
$ pip install janome
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/d01f1da8-8336-391f-c308-694a3af42f41.png)
https://pypi.python.org/pypi/Janome

1分もしないでインストールが完了。

```$ pip install janome
```
インストールが完了したので形態素解析をする。

```token.py
from janome.tokenizer import Tokenizer
t = Tokenizer()
for token in t.tokenize('冬休み嬉しすぎる！'):
        print(token)
```

実行結果

![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/0281da78-fd06-c88a-d6d9-60af7fb3aaa9.png)

#参考URL
http://taku910.github.io/mecab/#install-windows
Zendesk SDK for iOSで添付ファイルを送信する方法

現在関わっている案件で、[zendesk](https://www.zendesk.co.jp/)という顧客とサービス側とのコミュニケーションをチケット方式やチャットなどで簡易に利用できるサービスを導入しています。

webアプリ側では既に実装されており、今回iOS版のアプリにも導入する事となり画像のアタッチメントの方法が少し分かりずらかったので共有致します。

---

因みに、デベロッパー向けのドキュメントには下記の使用例が記載されています。

```
var request = ZDKCreateRequest()
request.attachments = UploadResponse
request.subject = "My printer is on fire!"
request.requestDescription = "The smoke is very colorful."

provider.createRequest(request) { result, error in
}
```

うん、まずUploadResponseって何ですか？という感じですね。
もう少し内容を見ていくと下記の記述が、、、

> In the following example, replace UploadResponse with a ZDKUploadResponse retrieved with the uploadAttachment method of the [ZDKUploadProvider](https://github.com/zendesk/zendesk_sdk_ios/blob/master/ZendeskProviderSDK.framework/Headers/ZDKUploadProvider.h#L58).

リンク先に飛んで、ふむ、メソッド定義されてますね、、、

| - (void) uploadAttachment:(NSData *)attachment |
|:--|
|              withFilename:(NSString *)filename |
|            andContentType:(NSString*)contentType |
|                  callback:(ZDKUploadCallback)callback; |

で？

と取り急ぎ対応を依頼されてる身としては、いくつか言いたい事はありましたが、
とりあえずはコールバックあるから、ZDKUploadProviderをインスタンス化してメソッド使ってみようかなと色々試行錯誤して成功した方法を記載致します。

## ここからが具体的な設定方法

事前にAppDelegate.swiftに下記の初期設定を行なって下さい。

```
// zendesk SDK 初期化設定
ZDKConfig.instance().initialize(
    withAppId: /*zendesk管理画面で設定されているWITHAPPID*/,
    zendeskUrl: /*zendesk管理画面で設定されているZENDESKURL*/,
    clientId: /*zendesk管理画面で設定されているCLIENTID*/)
        
let identity = ZDKAnonymousIdentity()
ZDKConfig.instance().userIdentity = identity
```

ViewController内でフォームは別途用意して下さい。
※ここでは送信ボタンイベント内を想定しております。
また、画像をライブラリから添付する方法等も割愛させて頂きます。

```
// コールバックで返却されたオブジェクトを格納
var attachments: [AnyObject]! = []

// プロバイダ作成
let provider = ZDKRequestProvider()
// リクエストを作成
var request = ZDKCreateRequest()
// 添付ファイルのアップロードに使用
let zdkUploader = ZDKUploadProvider()

let attach = <引数などで渡されたイメージ> as? UIImage
// ここでは、ユーザー名_日付という添付画像名を想定
let imageName = String("\(name + "_" + Date())")

zdkUploader.uploadAttachment(UIImageJPEGRepresentation(attach!, 0.5), withFilename: imageName, andContentType: "image/jpeg") { (response, error) -> Void in
 if error == nil {
  self.attachments.append(response!)
 }
 request.subject = "タイトル"
 request.requestDescription = "本文"
 if self.attachments != nil { request.attachments = self.attachments! } //添付ファイルをセット

 provider.createRequest(request) { result, error in
  if error == nil {
    print("送信完了しました。")
  } else {
    print("送信に失敗しました。")
  }
 }
}
```

SDKは便利なサービスですが、特殊な使い方だったりドキュメントを素直に追っても中々分かりずらかったりしますね。
勿論、自身の精進も必要ですが、、

ニッチな内容なので汎用性は無いですが、もし本記事が参考になった方がいれば幸いでございます。
Picostyle - 400バイトの CSS in JS ライブラリ

この投稿は [Increments Advent Calendar 2017](https://qiita.com/advent-calendar/2017/increments) の13日目の記事です。[Picostyle](https://github.com/picostyle/picostyle) という CSS in JS ライブラリを自作しているので、その説明と作った理由について述べます。

## CSS in JS

今更語る必要はないと思いますが、CSS はとにかく言語仕様が貧弱でメンテナンス性が乏しい言語です。また、アプリケーションの状態に合わせて GUI が変化するような実装をする際は JavaScript を利用する必要があり、CSS と JavaScript 間でその値を共有したいことがあります。

これらの問題を解決するために、JavaScript コード内にスタイルに関する記述を含めてしまおうというアプローチが CSS in JS です。Facebook の Christopher Chedeau というエンジニアが「[React: CSS in JS](https://speakerdeck.com/vjeux/react-css-in-js)」という、発表で CSS の抱える問題は React の Inline Styles を使って解決できると述べたことが事の発端です。

### 既存の CSS in JS ツール

以下のライブラリが、既存のものとして有名です。

- [styled-components](https://github.com/styled-components/styled-components)
- [gramorous](https://github.com/paypal/glamorous)
- [emotion](https://github.com/emotion-js/emotion)
- [CSS Modules](https://github.com/css-modules/css-modules)
	- 厳密にはこれは違うかもしれない

これらのライブラリについては説明しません。styled-components が2017年末でおそらく最も広く利用されており、個人的にもおすすめです。

## Picostyle

ここからが拙作の Picostyle についての説明です。Picostyle は [Hyperapp](https://github.com/hyperapp/hyperapp) という 1KB の JavaScript フレームワークのための CSS in JS ライブラリです。Hyperapp は Increments の同僚の @JorgeBucaran が作っています :)

![](https://camo.githubusercontent.com/bb28c56bd1ebddd8354b455d0e777d9d29dd830f/687474703a2f2f6d6f7269736869747465722e6769746875622e696f2f7069636f7374796c652e737667)


Picostyle のコンセプトは「シンプルで軽量であること」です。Picostyle のコードサイズは Gzip 圧縮時でたった 0.4KB と、数ある CSS in JS ツールの中で最軽量です。Hyperapp と合わせても 1.5 KB ほどしかありません。

### 使い方

まずは完全なコード例から

<p data-height="500" data-theme-id="29396" data-slug-hash="aEpGYN" data-default-tab="js,result" data-user="morishitter" data-embed-version="2" data-pen-title="picostyle example with hyperapp" class="codepen">See the Pen <a href="https://codepen.io/morishitter/pen/aEpGYN/">picostyle example with hyperapp</a> by Masaaki Morishita (<a href="https://codepen.io/morishitter">@morishitter</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

Picostyle は Hyperapp の `h` 関数を受け取り、要素名を受け取って JS オブジェクト形式の CSS の宣言を受け取り、加工した `h` を返す関数です、と書くとややこしいですが、使い方は上記の例を見れば分かると思います。styled-components とほとんど同じです。


## なぜ作ったのか

Picostyle は革新的に便利なもので世界中の人たちに使ってほしい！と言った気持ちはあまりなく、概念実証のために作りました。僕は CSS in JS というアプローチにずっと懐疑的で、既存のツールを利用し、実装を読み、オリジナルな再実装をすることで理解を深め、より正確な評価ができると思いました。

「ウェブアプリの UI を実装する最適解は何か」という理想について考えてみる。今自分が使っている技術、道具は自分にとって一体どういう存在なのか、ということに考えが及ぶと良い。そして、時にはその技術の思想さえも疑い、より良いものを生み出したい。このようなことを考えて Picostyle は作られました。

ということは微塵も考えてなくて、Hyperapp が流行りつつあるから俺もこのビッグウェーブに乗っておくか、くらいの気持ちで作りました :D
intellijが死んだのでメモ（書き途中）

■日本語化


■プラグイン
ruby
python
regexptester
material theme ui
codeglance
autoscroll save
.ignore
lombok

■メニューバー
縦分割
横分割
コードフォーマッター

■設定
メソッドの区切り線：エディター＞一般＞メソッドの区切り線
空白表示：エディター＞一般＞外観：空白を表示する
空白の色：
フォント：
■
Autoscroll
Macで appium / appium desktop 環境を整えた覚書

# Java8
適当にいれる(
# Androidstudioインストール
* https://developer.android.com/studio/index.html?hl=ja
* ここから dmg を落として実行。
* いつものドラッグ画面が出て来るのでドラッグ
* application から開く
* 設定をインポートするか聞いてくるのでインポートしない。
* ようこそ! > next
* セットアップの方法 > カスタム
* UIテーマ > 私はダークが好き
* SDK Components Setup > SDKにはチェックがついてるから残りの2つにチェックいれて next
* Emulator settings > とりあえず初期設定(2G)のまま
* 色々落とすよと言われるので finish
  * 途中で別のアプリのインストールを求められるので許可。
* スタートアップの画面から SDK マネージャ を開き目的のSDKをインストール

# ~~Androidエミュレータ~~
~~今回は andy を選択。上の download から dmg を落としてインストール~~
Andyのアンドロイドバージョンが4とかだったのでお蔵入り。 Android studio の ADV を使う事に。
# appium
* http://appium.io/
最新版の dmg があるのでインストール

アプリを開くとホスト名をポートを聞かれるが、そのまま起動すればローカルでサーバが立つ。

# appium desktop
* https://github.com/appium/appium-desktop
ここの readme にあるダウンロードリンクから
Majestouch MINILA(US)をHHKBとして使う on Mac

# はじめに

エンジニア界隈でよく使われているHHKBことPFU製のHappy Hacking Keyboardですが，非常にできのいいキーボードとはいえ主に2つの問題があります。

+ 値段が高い
+ 配列がかなり変態的
    + カーソルキーなど

また，HHKBと同じくらいの人気を誇っているキーボードにFILCO製のMajestouch MINILAがあります。
もちろんRealForceなどのキーボードや他の中華製キーボードもいくつかあるのですが，ぼく個人としてはHHKBのようななるべく机の上を占有しないコンパクトなキーボードがほしかったので，今回はMajestouch MINILAをHHKBとして使う方法について説明します。ちなみにMac限定です。

今回書くことは

+ **MajestouchをHHKB配列として使う**
    + ハードウェア側の設定
        + スイッチの設定，キーの入れ替え
    + ソフトウェア側の設定
        + Karabiner Elementsの設定
+ **うれしいこと**
    + HHKBを買わなくてもHHKB配列が楽しめる
        + メカニカルキーボードでもHHKB配列が使える
    + HHKBを買うより安い

をつらつらと書いていく感じになります。

# ハードウェア側の設定

## DIPスイッチの設定

まずはDIPスイッチの設定をしましょう。

| 1   | 2  | 3   | 4   | 5   | 6  |
|-----|----|-----|-----|-----|----|
| OFF | ON | OFF | OFF | OFF | ON |

こんな感じです。2と6のスイッチを上にしておきます。

## キートップの入れ替え

続いてキートップを入れ替えます。

<img src='https://qiita-image-store.s3.amazonaws.com/0/59488/83d418d8-0c48-beda-b905-84acd9b0e888.png' width='640px'>

だいたいこんな感じにしておきましょう。マルをつけたあたりが通常の配列と違う部分です。
もちろんその他にも表記と違うキーとなっている部分はたくさんあるのですが，せめて変えられる部分だけでも変えておこうくらいの意味です。

# ソフトウェア側の設定

## 入れ替えるキー

MajestouchをHHKBとして使うのを支えている技術のひとつが「Deleteキーの位置」です。
↓の画像を見るとわかるのですが，HHKBでは右シフトキーの右側に `Fn` キーがあるのですね。こういう位置にFnキーがあるキーボードはなかなか多くはないのですが，なんとMajestouch MINILAはカーソルキーを強引に押し込んでいるためにHHKBの `Fn` の位置に `Delete` が存在しています。これは使うしかありません。

<img src="http://1.bp.blogspot.com/-ScRy9LUOlYs/UnNU6JedRqI/AAAAAAAAAHw/qlwMEHHux6g/s1600/thumb_pdkb400ws_l.jpg">

というわけでまずはリマップです。

## Karabiner Elementsの設定

### キーリマップ

まずはリマップです。

<img width="800" alt="Screenshot 2017-12-27 16.02.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/59488/31349526-c80c-f7a5-8135-87a716460a54.png">

だいたいこんな感じにしておきましょう
`Target Device` を絞っておくと挿したときだけ有効になるので便利です(なぜか文字化けする)

+ 左 `Option` と `Command` が逆になるのでそれを入れ替える
+  `` ` `` と `~` も入れ替える
+  `application` を入れ替える
    +  今回は `fn` にしていますが `right-option` にすると普通の配列に近づきそうです
+  `delete_forward` を `fn` にする

### Complex Modification

続いてHHKBの変態配列，主にカーソルキーあたりを使えるようにしておきましょう。

Karabiner Elementsの設定画面に行って `Complex Modifications` を押します。そして `Add rule`

<img width="800" alt="Screenshot_2017-12-27_16_08_59.png" src="https://qiita-image-store.s3.amazonaws.com/0/59488/8e6796b8-4128-f6f4-ad79-659beb21abb1.png">

`Import more rules from the Internet` を押します。

<img width="800" alt="Screenshot_2017-12-27_16_09_17.png" src="https://qiita-image-store.s3.amazonaws.com/0/59488/e64b23b6-a1ac-c734-fd2f-7fe2a2b6fcf5.png">

これを入れる↓

<img src='https://qiita-image-store.s3.amazonaws.com/0/59488/15fecdd4-8fde-4681-c2db-dadec807d8e0.png' width='700px'>

先ほどの `Add rules` のところに追加されている

<img width="800" alt="Screenshot 2017-12-27 16.11.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/59488/7a05b1ae-55fb-4ec3-4793-d4b3ceef68c1.png">

これで使えるようになっていると思います。

# おわりに

今回はなんとかしてMajestouch MINILAをHHKBとして使う方法を紹介しました。これをしてから半年くらい経ちますが，脳のスイッチを切り替えずにHHKBもMajestouchも使えるので助かっています。
もちろんMajestouchだと `zxcv` 段が少し左にずれている，そもそも静電容量方式じゃないなどの違いもありますが，半額程度でジェネリックHHKBを使うことができたのはよかったなと思っています。
cron使って雑なプロセス監視&落ちてたら再起動

いろんなサービスをのっけている社内とか個人だけで使っているサーバ上で、しょっちゅう落ちるサービス/プロセスがあるのだけど、本腰を入れて対応するのが面倒だったり、スケールアップしたくなかったりしたので、cron使ってプロセスチェックして、落ちてたら再起動する、という雑な対応をしたのでメモ
`crontab -e`でcron編集

```crontab
*/1 * * * * ps ax |grep -v grep | grep -q サービス名 || (起動コマンド)
```

こんな感じで1分おきにプロセスチェック
ただし、対象のサービス名が汎用的なものだったりと、そのサービス名を持つプロセスが複数あったりする場合はなんか別の方法やる必要あると思う
ビットコインは何が新しいのか

## はじめに
現在話題となっているビットコインなど仮想通貨の基礎となるのは、ブロックチェーンという技術です。しかし、仮想通貨は**仮想的な通貨**の略称であるので、必ずしもブロックチェーンという技術が必要な訳ではありません。

ここでは仮想通貨とブロックチェーン、そしてその関係について知り、なぜ今話題になっているのか順を追って、著者の理解を元に解説していきたいと思います。

なおブロックチェーンの仕組み自体は、様々な書籍で語られているのでここでは言及しません。以下に参考書籍を記します。

- 入門書: [60分でわかる！　仮想通貨　ビットコイン＆ブロックチェーン　最前線](https://www.amazon.co.jp/dp/B0721W434K/)
    - なんとなく大枠をつかむのに良いです
- 技術書: [ビットコインとブロックチェーン:暗号通貨を支える技術](https://www.amazon.co.jp/4757103670/ref)
    - アルゴリズムレベルで説明しており、完全に腑に落とすのに良いです。

## 通貨とは
通貨とは価値の交換に使われるものです。価値の交換には古くは物々交換（魚と肉を交換するなど）がありますが、価値の交換に融通が効かないので、現在では通貨を仲介させて価値の交換が行われることが多いです（普段みなさんも硬貨や紙幣を使っていることと思います）。

通貨には例えば円やドル、古くは貝なども存在し、そして今ビットコインが生まれています。

## 仮想通貨とは
では仮想通貨とは何でしょうか。仮想通貨の対義語は法定通貨と言われており、それは各国の法律で定められている通貨のことです。日本であれば日本円、アメリカであればドルです。

言ってしまえば仮想通貨はそれ以外の枠組みで構成される通貨全てであり、国以外の法人や個人、またそれ以外の主体が発行する通貨になります。仮想通貨には例えばウェブマネーやペイモなどのマイクロペイメントにおけるポイント、そしてビットコインもここに含まれます。

## ビットコインの新規性
ここで仮想通貨を更に大きく二つ分類します。それは「中央集権的」なものと「非中央集権的」なものです。

これまであったのは中央集権的なものが殆どでした。つまりそれは、特定の会社などが発行しているものです。ウェブマネーやSuicaなどがここに含まれます。

ビットコインは後者の「非中央集権的」なものにあたります。これは特定の会社や個人に依存しません。ここがビットコインの新規性です。

![currency-matrix.png](https://qiita-image-store.s3.amazonaws.com/0/18606/6dd6835e-7d6c-9508-2df0-dc01263ab8b9.png)

## 非中央集権的通貨のメリット
非中央集権的な通貨のメリットは大きく2つあります。それは永続性と公平性です。

まず永続性について考えてみましょう。中央集権的通貨であれば発行主体の会社が倒産してしまえば、その通貨の価値は無くなってしまいます。しかし非中央集権的通貨では、そもそも特定の主体が存在しないのでそれは起こらず、通貨の永続性が担保されます。これは国が発行主体となる法定通貨（国がデフォルトしてしまえば通貨の価値は無くなる）にも無かった特性です。

次に公平性について考えてみましょう。仮に特定の会社が発行主体となれば、その会社はいくらでもその通貨を発行することが出来ます。そうなると通貨の価値は安定せず、価値交換に使えることが難しくなってしまいます（いくらでも増やせるお金にどんな価値があるでしょうか）。

最近であればジンバブエが通貨を刷りまくったことで大幅なインフレ（通貨の価値が下がる）が起きました。このようなことが起きるとそもそも**通貨**として扱えるかどうかも怪しいです。その点、非中央集権的であれば、（その通貨の枠組みの中では）誰かが勝手に発行することはできなくなり、通貨の価値が一定程度担保されます。

## なぜこれまでそのような通貨が無かったか
中央集権的な仮想通貨を作るのは比較的簡単です。例えば私たちが、○○ポイントを発行します！と言って、それを各人に付与すればそれは中央集権的な仮想通貨となります。

ただ非中央集権的だとそうはいきません。特定の個人や会社に依存しないとなると、そもそも誰かが一方的に宣言するわけにはいかなくなります。この時困るのが、そのような通貨を発行する方法です。

例えば昔からある非中央集権的な通貨としては金が考えられます。特定の会社が発行したわけではないが、偽造が難しいことから非中央集権的な通貨として用いられています。

ただこういったものを人為的に作るとなると難しいです。いわばデジタルのゴールドというものを、どうやって作ればいいのでしょうか。

## ブロックチェーンの価値
そこで生まれたのがブロックチェーン技術です。ブロックチェーン技術を使うことで、非中央集権的でなおかつ偽造が難しい通貨を作ることが出来ました。

ブロックチェーンの価値は「**分散合意**」が行えることです。この技術を使用することで、国や会社などの中央集権的な主体の介在無しに、何が起きたかを全員で（条件付きですが）合意することが出来ます。

この「分散合意」を活用して、ビットコインは作られています。誰がいくら持っていて、通貨の受け渡しがAさんからBさんへ行われたという記録が全て「分散合意」されて、通貨が成り立っています。全員が全員、この通貨を誰がいくら持っているか、どのように取り引きされているか知っていることで、非中央集権的な通貨であるビットコインが成立しています。

## おわりに
この文章は[C93で出す同人誌の中の章「仮想通貨に『悪戯』しよう！」](https://mailchi.mp/6ed365c6481a/miso-lab-c93)から構成の変更で漏れてしまったものを供養したものです。
[Java]複数OR条件判定

そんなの

```java:よく使う方法
Arrays.asList(expects...).contains(target)
```

でいいじゃん、というツッコミはさておき、

```java:MultipleConditionMatcher.java
// 要lombok.jar

import java.util.Arrays;

import lombok.NonNull;

/**
 * 複数OR条件判定
 * @param <T> 判定対象の型
 */
public class MultipleConditionMatcher<T> {

    /** 判定対象 */
    @NonNull
    private T target;

    /**
     * コンストラクタ
     * @param target 判定対象
     */
    public MultipleConditionMatcher(@NonNull T target) {
        this.target = target;
    }

    /**
     * 複数OR条件判定
     * @param expects 判定条件
     * @return 判定条件のいずれかと一致した場合 {code true}
     */
    @SuppressWarnings("unchecked")
    public boolean in(@NonNull final T... expects) {
        return Arrays.stream(expects).anyMatch(target::equals);
    }

    /**
     * 複数OR条件判定
     * @param expects 判定条件
     * @return 判定条件のいずれかと一致した場合 {code true}
     */
    @SuppressWarnings("unchecked")
    public boolean or(@NonNull final T... expects) {
        return in(expects);
    }

}
```

```java:サンプルコード
// String
System.out.println(new MultipleConditionMatcher<String>("Hoge").in("Hoge", "Fuga"));
// Integer
System.out.println(new MultipleConditionMatcher<Integer>(Integer.valueOf(1)).or(Integer.valueOf(0), Integer.valueOf(Integer.MAX_VALUE));
```

```text:実行結果
true
false
```

**（2018/11/01 追記）**

`Predicate#Or()` で繋ぐ版を作ってみました。

```java:MultipleConditionMatcher.java
// 要lombok.jar

import java.util.function.Predicate;

import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.NonNull;

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class MultipleConditionMatcher {

    /**
     * 複数OR条件判定
     * @param <T> 判定対象の型
     * @param target 判定対象
     * @param expects 判定条件
     * @return 判定条件のいずれかと一致した場合 {code true}
     */
    @SuppressWarnings("unchecked")
    public static <T> boolean in(final T target, final T... expects) {
        if (expects.length == 0) {
            return false;
        }
        Predicate<T> chainedExpect = null;
        for (final T expect : expects) {
            if (chainedExpect == null) {
                chainedExpect = expect::equals;
            } else {
                chainedExpect.or(expect::equals);
            }
        }
        return chainedExpect.test(target);
    }

    /**
     * 複数OR条件判定
     * @param <T> 判定対象の型
     * @param target 判定対象
     * @param expects 判定条件
     * @return 判定条件のいずれかと一致した場合 {code true}
     */
    @SuppressWarnings("unchecked")
    public static <T> boolean or(final T target, final T... expects) {
        return in(target, expects);
    }

}
```

```java:サンプルコード
// String
System.out.println(MultipleConditionMatcher.in("Hoge", "Hoge", "Fuga"));
// Integer(boxed int)
System.out.println(MultipleConditionMatcher.or(1, 0, Integer.MAX_VALUE));
```

```text:実行結果
true
false
```
(Swift4コードで書く)SubViewを追加してPan(Drag)で動かす



![pan.gif](https://qiita-image-store.s3.amazonaws.com/0/72559/494cd88d-78da-8205-80c7-458ee3f39c4d.gif "pan.gif")

#コード
```ViewController.swift
import UIKit

class ViewController: UIViewController {
    var label:UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //SubViewを作成
        let pos:CGRect = CGRect.init(x: 0, y: 0, width: 250, height: 250)
        let SubView   = UIView.init(frame: pos)
        let bgColor    = UIColor.blue
        SubView.backgroundColor = bgColor
        
        //Panの処理を追加し、SubViewにpanを登録
        let panGesture = UIPanGestureRecognizer(target: self, action: #selector(self.panView(sender:)))
        SubView.addGestureRecognizer(panGesture)
        
        //座標表示用のラベルを作成しSubViewに追加
        let bWidth  : CGFloat = 200
        let bHeight : CGFloat = 50
        let posX    : CGFloat = SubView.bounds.width/2 - bWidth/2
        let posY    : CGFloat = SubView.bounds.height/2 - bHeight/2

        label                 = UILabel(frame: CGRect(x: posX, y: posY, width: bWidth, height: bHeight))
        label.backgroundColor = UIColor.black
        label.textColor       = UIColor.white

        label.textAlignment   = NSTextAlignment.center

        label.text = "\(pos.minX), \(pos.minY)"

        SubView.addSubview(label)
        
        //Selfに追加
        self.view.addSubview(SubView)
    }
    
    //Pan実行時のメソッド
    @objc func panView(sender: UIPanGestureRecognizer) {
        //移動量を取得
        let move:CGPoint = sender.translation(in:self.view)
        //ドラッグした部品の座標に移動量を加算
        sender.view!.center.x += move.x
        sender.view!.center.y += move.y
        //ラベルに現在座標を表示する
        label.text = "\(sender.view!.frame.origin.x), \(sender.view!.frame.origin.y)"
        //移動量を0に
        sender.setTranslation(CGPoint.zero, in: self.view)
    }
}
```
RailsのViewでJSON/ハッシュを整形して見やすく表示


ちょっとしたメモなので簡潔に…。RailsでHashオブジェクトを整形して以下のように表示する方法。

![スクリーンショット 2017-12-27 15.17.38.png](https://qiita-image-store.s3.amazonaws.com/0/106272/81602999-ed7c-cbc5-556c-5515868b15e9.png)

## サンプルコード

JSONやハッシュを整形して表示するには、preタグとJSON.pretty_generateを使う。

```ruby:sample.slim
pre = JSON.pretty_generate(JSON.parse(string))

pre = JSON.pretty_generate(hash_object)

pre = JSON.pretty_generate({uri: 'https://qiita.com/', limit: 123, keywords: ['neko','cat']})
```

## 補足説明

* JSON.pretty_generateは引数のオブジェクトを整形されたハッシュ形式の文字列に変換する
* preタグで囲むことで半角スペースや改行が表示に反映される(simple_formatなどは必要ない)
* JSON.pretty_generateが対応するのはHashオブジェクト、あるいはto_hかto_hashメソッドを持ちHash化が可能なオブジェクトだけ
* 何らかのシンタクスハイライトのライブラリを入れるとより良いかも
AzureのWindows日本語化

# はじめに

Azure環境でWindowsServerの仮想マシンを立ち上げると、英語版になってます。
もれなく表示は、英語です。
英語ができない私ですが、画面には英語が出てきます。
・・・・と言うことで、Windows ServerをAzureで立ち上げたら、日本語環境にするため最初にこれだけはやっておきましょう。


# 日本語インストール
１．Windowsキー＋「E」でエクスプローラを立ち上げます。
２．画面上部に「This PC」、もしくは「Quick access」という記載がありますが、その左側に「↑」があるのでクリックします。

![language01.png](https://qiita-image-store.s3.amazonaws.com/0/109620/3892c987-30de-1221-4829-f91c968437c2.png)


３．画面に「Control Panel」が表示されるので、ダブルクリック！
４．「Clock, Language, and Region」に「Add a language」があるのでクリック。

![language02.png](https://qiita-image-store.s3.amazonaws.com/0/109620/e86db5e6-cde0-5509-7c8f-823dba1b00d1.png)

５．「Add a language」をクリックすると画面が切り替わり、いろいろな言語が表示されます。Jの部分にJapanese（日本語）が表示されているので、クリックして「Add」ボタンを押します。
６．日本語が２番目に表示されているので、選択して「Move up」を押します。（一番上に移動します）
    ※ 必要なければ、English(United States）をRemoveしましょ。
７．日本語の右側にOptions と青文字で記載があるのでクリックします。
８．「Download and install language pack」という文字があるので、クリックします。（インストールが始まります。）
９．日本語パックのインストールには３~５分かかります。完了したら、「Close」ボタンを押します。
１０．「Make this the primary language」をクリックすると、ログオフを要求してきます。「Log off now」ボタンを押します。

![language07.png](https://qiita-image-store.s3.amazonaws.com/0/109620/f38c8aa0-72ef-0f20-7549-512a8e9b7cd7.png)


再ログインすると、日本語表示されています。

# ロケーションの変更
でも、まだ設定は終わっていません！
このまま勢いに乗って、ロケーションを変更です。

１１．次は、コントロールパネルの「Clock, Language, and Region」をクリックします。
１２．「Region」の中の「Change location」を選択します。

![language03.png](https://qiita-image-store.s3.amazonaws.com/0/109620/ab4045b2-dc26-aca7-53b8-0d16e268144b.png)

１３．LocationタブHome location の中で、「Japan」を選択します。

![language06.png](https://qiita-image-store.s3.amazonaws.com/0/109620/f0ab16ad-b00a-960b-4e33-74aa3ef8210b.png)


１４．続いてAdministrativeタブで「Change time zone」ボタンを押します。
１５．「Japanese(Japan)」を選択して、「OK」ボタンを押すと再起動を促されます。「Restart now」を押すと再起動が実行されます。


# タイムゾーンの変更
まだです！

１６．コントロールパネルから「Clock, Language, and Region」をクリックします。（１１．と同じです）
１７．「Date and Time」の中から「Change the time zone」をクリックします。

![language04.png](https://qiita-image-store.s3.amazonaws.com/0/109620/e6b55ffd-a1f4-6cd7-9eb4-f32e9f41aaa5.png)

１８．「Change time zone」ボタンを押します。

![language05.png](https://qiita-image-store.s3.amazonaws.com/0/109620/96d4bd02-1969-7e7c-eed4-df6eef9488a6.png)

１９．Time zone から「（UTC+09:00) Osaka, Sapporo, Tokyo」を選択して、「OK」ボタンを押します。
２０．「OK」ボタンを押して、押して、押しまくって立ち上がってる画面を閉じます。
Activity起動時にEditTextがオートフォーカスされてしまうときの対処法

同じXML内の適当なTextViewに下記の設定をしましょう

## 例

```xml
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="true"
    android:focusableInTouchMode="true" />
```

## 参考サイト

[EditTextのフォーカスについて - プログラマーのアプリ開発日誌](http://d.hatena.ne.jp/nkawamura/20130824/1377348841)
mackerelでゾンビプロセスをチェックする

# mackerelでゾンビプロセスをチェックする

## はじめに

あるプロセスがゾンビプロセスの場合に、mackerelでチェックして通知するのに少しハマったので、覚書。

まずゾンビプロセスのチェックの場合、以下のような設定をします。

- 1件以上の場合、warningかcriticalで通知。（件数は2件以上でも、10件以上でもよい。）
- 0件の場合、通知しない。

通常ゾンビプロセスがない場合は正常なので通知はしません。

## ゾンビプロセスのチェック

ゾンビプロセスのチェックをするには、-s （または--state）のオプションを利用します。
ゾンビプロセスの場合は「Z」を指定します。

あと、1件以上でwarning、2件以上でcriticalの通知をしたいので、その設定も一緒します。

```
check-procs -p 'hoge' -s Z -w 0 -c 1 -u hoge-user
```

これでゾンビプロセスが存在する場合、通知がきますが
このままだとゾンビプロセスが0件の場合、criticalの通知が来ます。
（warning-under、critical-under共にデフォルトが1のようです。）

## ゾンビプロセスが0件の場合は、正常とする

困ったと思って、macherelのソースを見たところ以下のような実装になっていました。

```
if opts.CritUnder != 0 && count < opts.CritUnder ||
	opts.CritOver != nil && count > *opts.CritOver {
	result = checkers.CRITICAL
} else if opts.WarningUnder != 0 && count < opts.WarningUnder ||
	opts.WarningOver != nil && count > *opts.WarningOver {
	result = checkers.WARNING
}
return checkers.NewChecker(result, msg)
```

プロセスチェックの仕様で、warning-under と critical-underが0の場合は
0件のチェックをしないようなので、以下の設定にします。

```
check-procs -p 'hoge' -s Z -w 0 -c 1 -W 0 -C 0 -u hoge-user
```

これで、ゾンビプロセスの通知ができるようになりました。

## 参考
- [check-procsのoptions](https://github.com/mackerelio/go-check-plugins/blob/master/check-procs/README.md#options)
- [check-procsの件数チェック](https://github.com/mackerelio/go-check-plugins/blob/master/check-procs/lib/check_procs.go#L101-L107)
[Linux] Ubuntu 16.04でDNSレコードを動的に更新する

今まではネームサーバへのレコード登録をDHCPサーバに任せていましたが、`nsupdate`コマンドを使って積極的に登録するようにしました。


# 環境

- DHCPクライアント: Ubuntu 16.04
- DHCPサーバ: YAMAHA RTX1200
- ネームサーバ: Windows Server 2012 R2

# スクリプト

dhclient enter hookの中で、`nsupdate`を実行するようにします。

以下のスクリプトを`/etc/dhcp/dhclient-enter-hooks.d/`に置いてください。

```sh:/etc/dhcp/dhclient-enter-hooks.d/nsupdate
#
# Script fragment to make dhclient update name server records.
#

# set to 'yes', temporary file will not remove
DEBUG="no"

ip_to_ptr() {
	local ip
	local p
	local ptr

	ip=$(echo $1 | tr '.' ' ')
	ptr="in-addr.arpa."

	for p in $ip; do
		ptr="${p}.${ptr}"
	done
	
	echo $ptr
}

echo_update() {
	echo update $*
	echo
}

del_ptr_record() {
	if [ "$1" != "" ]; then
		echo_update del $(ip_to_ptr $1) PTR
	fi
}

del_a_record() {
	if [ "$1" != "" ]; then
		echo_update del $1 A
	fi
}

add_ptr_record() {
	if [ "$1" != "" ] && [ "$2" != "" ]; then
		echo_update add $(ip_to_ptr $2) 1200 PTR ${1}
	fi
}

add_a_record() {
	if [ "$1" != "" ] && [ "$2" != "" ]; then
		echo_update add ${1} 1200 A ${2}
	fi
}

name_server() {
	local n

	for n in $1; do
		echo "server ${n}"
		echo
		break;
	done
}

exec_nsupdate() {
	if [ "$DEBUG" != "yes" ]; then
		nsupdate $1
		rm -f $1
	else
		echo '-------------------' >> /tmp/nsupdate.debug
		cat $1 >> /tmp/nsupdate.debug
		echo '-------------------' >> /tmp/nsupdate.debug
		nsupdate -d $1 >> /tmp/nsupdate.debug 2>&1
	fi
}

go_nsupdate() {
	local host
	local tmp

	host=$(hostname)
	tmp="/tmp/nsupdate.$$"

	case "$reason" in
	  BOUND|RENEW|REBIND|REBOOT|TIMEOUT)
		name_server $new_domain_name_servers	> ${tmp}
		del_ptr_record $old_ip_address		>> ${tmp}
		del_a_record ${host}.${old_domain_name}	>> ${tmp}
		add_ptr_record ${host}.${new_domain_name}. $new_ip_address	>> ${tmp}
		add_a_record ${host}.${new_domain_name} $new_ip_address	>> ${tmp}

		echo "send" >> ${tmp}

		exec_nsupdate $tmp
		;;
	  EXPIRE|FAIL|RELEASE|STOP)
		name_server $old_domain_name_servers	> ${tmp}
		del_ptr_record $old_ip_address		>> ${tmp}
		del_a_record ${host}.${old_domain_name}	>> ${tmp}

		echo "send" >> ${tmp}

		exec_nsupdate $tmp
		;;
	esac
}

if [ -x /usr/bin/nsupdate ]; then
	go_nsupdate
fi
```

うまくいかないときは、ファイルを書き換えて`DEBUG="yes"`としてください。
`/tmp/nsupdate.debug`というファイルを出力します。
LaravelでControllerではなくHandlerを使う

[こちらの記事](https://jenssegers.com/85/goodbye-controllers-hello-request-handlers)で紹介されていた、コントローラーを使うのを止めて単一責務のHandlerにすると便利だよという内容でした。

Laravelのルーティングでは、 `SomeController@someMethod` という書き方以外にも、 `__invoke` メソッドを実装したクラスを直接渡すことができます。

```php
Route::get('/user/{user}', Handlers\ShowUserHandler::class);
```

この場合、 `__invoke` メソッドが呼ばれることになります。DIやRoute Model Bindingもこのメソッドで可能です。

```php
<?php

namespace App\Http\Controllers\Handlers;

use App\Models\User;

class ShowUserHandler
{
    public function __invoke(User $user)
    {
        return $user;
    }
}
```

何が嬉しいのかちゃんと理解できていないので、後日追記したい。
BrowserSyncを使って今すぐライブリロードする

[BrowserSync](https://github.com/BrowserSync/browser-sync)はファイルの変更を監視して、変更があれば自動でブラウザをリロードして変更を反映させるためのツール。年の瀬に知ったけどもっと早くちゃんと調べておくべきだった。

# クイックスタート

```sh
# install
$ npm install -g browser-sync

# start server
$ browser-sync start --proxy http://localhost --files *
```

これだけ。

# 仕組み

インストール後、 `browser-sync` コマンドを実行することでproxyサーバーが立ち上がり、適当なportが割り振られブラウザ上にページが表示される。

`--proxy` の引数には表示させたいページ、`--files` の引数には監視したいファイルを指定。ワイルドカードを指定すれば全ファイル対象になる。なお、コマンドを実行したカレントディレクトリ配下にあるファイルのみが対象。
navigationItem削除処理

### 概要
NavigationItem(ボタン)を取り除く。
調べた時に出てこなくて、後で知ったので、備忘録として残す。

### 前提
NavigationBarにNavigationItem(ボタンが)追加されていること

### 想定する状況
パラメーターの分岐等によってNavigationItemを取りたい場合

### コード
NavigatioItemをNavigationBarItemの配列から取り除くという要領。

```
// 右側のボタンの場合(at:数字のところでItemの配列の番号を指定)
navigationItem.rightBarButtonItems?.remove(at: 0)

// 左側のボタンの場合(at:数字のところでItemの配列の番号を指定)
navigationItem.lightBarButtonItems?.remove(at: 0)
```
LPS25Hを高速化する

# 背景
<img src="https://os.mbed.com/media/uploads/yasuyuki/lps25h.jpg" />
気圧センサのLPS25Hのデフォルトのサンプリングレートが1Hzと中々に遅いので、
25Hzまで上げたというお話。

普通にデータシート読めば一瞬なのですが、備忘録として。
http://www.st.com/content/ccc/resource/technical/document/datasheet/58/d2/33/a4/42/89/42/0b/DM00066332.pdf/files/DM00066332.pdf/jcr:content/translations/en.DM00066332.pdf

## 使用機材
- Arduino UNO x 1
- LPS25H(I2Cでつなぎました)

## 配線

| Arduino       | LPS25H |
|:--------------|------------------:|
| 3.3V          | VDD(1) |
| A5(SCL)       | SCL(2) |
| A4(SDA)       | SDA(3) |
| 3.3V          | SDO(4) |
| 3.3V          | CS(5) |
| GND           | GND(8) |

## コード

```sensor.ino
/**
 * LPS25Hのサンプリングレートを上げたコード
 */
#include <Wire.h>
 
#define LPS25H_ADDRESS  0x5d /* SA0 -> VCC */
//#define LPS25H_ADDRESS  0x5c /* SA0 -> GND */
#define LPS25H_WHO_AM_I     0x0f
#define LPS25H_CTRL_REG1    0x20
#define LPS25H_PRESS_OUT_XL 0x28
#define LPS25H_PRESS_OUT_L  0x29
#define LPS25H_PRESS_OUT_H  0x2a
#define LPS25H_TEMP_OUT_L   0x2b
#define LPS25H_TEMP_OUT_H   0x2c
 
void setup() {
  // put your setup code here, to run once:
  Serial.begin(19200);
  Wire.begin();
   
  Serial.print("WHO_AM_I = 0x");
  Serial.println(whoAmI(), HEX);
   
  setCtrlReg1();
}
 
void loop() {
  Serial.print("Pressure = ");
  Serial.print(getPressure());
  Serial.println(" hPa, ");
  delay(50);
}
 
int whoAmI() {
  Wire.beginTransmission(LPS25H_ADDRESS);
  Wire.write(LPS25H_WHO_AM_I);
  Wire.endTransmission();
   
  Wire.requestFrom(LPS25H_ADDRESS, 1);
  while(Wire.available() < 1) {
    ;
  }
   
  return Wire.read();
}
 
void setCtrlReg1() {
  Wire.beginTransmission(LPS25H_ADDRESS);
  Wire.write(LPS25H_CTRL_REG1);
  Wire.write(0xC0); // 25Hzにまであげる  
  //Wire.write(0x90); // default: 1Hz
  Wire.endTransmission();
}
 
float getPressure() {
  long pData = 0;
   
  for (int i = 0; i < 3; i++) {
    Wire.beginTransmission(LPS25H_ADDRESS);
    Wire.write(LPS25H_PRESS_OUT_XL + i);
    Wire.endTransmission();
 
    Wire.requestFrom(LPS25H_ADDRESS, 1);
    while(Wire.available() < 1) {
      ;
    }
     
    pData |= Wire.read() << (8 * i);
  }
   
  return pData / 4096.0;
}
 
float getTemperature() {
  short tData = 0;
   
  for (int i = 0; i < 2; i++) {
    Wire.beginTransmission(LPS25H_ADDRESS);
    Wire.write(LPS25H_TEMP_OUT_L + i);
    Wire.endTransmission();
 
    Wire.requestFrom(LPS25H_ADDRESS, 1);
    while(Wire.available() < 1) {
      ;
    }
     
    tData |= Wire.read() << (8 * i);
  }
   
  return 42.5 + tData / 480.0;
}
```

以上です。
GithubへのContribute数を取得する


もう一年もおわりですね。
ってことでGithubへのContribute数を取得してみます。


## Contribute取得方法

GithubにはAPIが用意されていてcommitの詳細を取得することができます。

https://developer.github.com/v3/repos/

以前このAPIは使用して1日のcommit数を集計してツイートするアプリケーションを作成しました。
詳しくはこちらをどうぞ。

http://jesus9387.hatenablog.com/entry/2017/09/13/124525


ですが、この方法だとprivateリポジトリへのcommitが取れないので今回はスクレイピングします(スクレイピングは自己責任でお願いします。


Contribute数を数えているクラスは下記になります。
gemは`nokogiri`を使用しています。

```ruby
require 'nokogiri'
require 'open-uri'

class GithubContributeCount

  def create_tweet_text
    count = count_contribute
    "通算で" + count + "回Githubへコミットしています。https://github.com/yshogo Github contribute count app author shogo yamda"
  end

  private
    def count_contribute
      html = Nokogiri::HTML open 'https://github.com/yshogo'
      text = html.xpath('//h2[@class = "f4 text-normal mb-2"]').first.inner_text
      text.delete! 'in the last year'
      text.delete! 'cobuo'
      text.gsub(/[\r\n]/,"")
    end
end

```

このクラスを使ってContribute数をTwitterへ投稿するアプリケーションを作成しました。

<blockquote class="twitter-tweet" lang="ja"><p>通算で698回Githubへコミットしています。https://github.com/yshogo  Github contribute count app author shogo yamda</p>&mdash; @yshogo87 <a href="https://twitter.com/yshogo87?ref_src=twsrc%5Etfw&ref_url=http%3A%2F%2Fjesus9387.hatenablog.com%2Fentry%2F2017%2F12%2F27%2F135509"></a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


詳しくは下記のブログに書いたのでご覧ください。

http://jesus9387.hatenablog.com/entry/2017/12/27/135509


Rubyについてもっと勉強したいな〜
ArduinoをAuto-IC機能付モバイルバッテリーで長時間駆動させる方法

#やりたいこと
Arduinoを用いて実験的なIotデバイスを作る時に、モバイルバッテリーを使うことが度々あります。
初代cheero Canvasが販売されていた時はそのまま使えば使えたのでIoT用としては非常に便利でしたが、今は入手し辛くなってしまいました。

また最近のモバイルバッテリーは、Auto-IC機能がほぼ必須で付いているので単純にArduinoを繋げただけだと消費電力が閾値を下回ってしまい、Arduinoへの電源供給が自動で止まってしまいます...。また、リチウムイオンポリマー電池もありますが、扱い方によっては危険を伴うのでその使用を避けたい思いがあります。

もともとスマホ用で過充電等を防ぐためなので当たり前といえば当たり前ですが、ArduinoでのIoTデバイス作成時にはこの機能が結構邪魔だったりするので、Auto-IC機能が働かないように**Arduinoの消費電力を簡単に上げる方法**がないかを探してみた


#実験
単色LEDをHIGHにして光らせるだけで、Auto-IC機能を回避できるか実験してみました。
##結果
電源供給のみのArduino(左側)とLEDを常に光らせたArduio(右側)で実験してみた。
動画を見ていただければ解りますが、左側のArduinoは40秒前後でAuto-IC機能が働き電源供給が止まってしまいますが、右側のArduinoはずっと電源供給されたままになります。

![モバイルバッテリーテスト.jpg](https://qiita-image-store.s3.amazonaws.com/0/159447/82032ebe-164c-92ac-4ad8-b8eb7c03b66e.jpeg)
動画のリンク：https://youtu.be/mNp4rN3YBrI

##実験環境
◆左側のArduino
- cheero Power Plus 3(1回目：stick 3350mAh, 2回目：10050mAh)
- Arduino Leonaldo

Arduinoのプログラムの中身は空です。

```arduino:left_arduino.ino
void setup() {
}

void loop() { 
}

```

◆右側のArduino
- cheero Power Plus 3(1回目：10050mAh, 2回目：stick 3350mAh, )
- Arduino Leonaldo
- 単色LED

Arduinoのプログラムの中身はLEDをsetup時に光らせるだけです。

```arduino:right_arduino.ino
#define LED_PIN 13
void setup() {
    pinMode(LED_PIN , OUTPUT);
    digitalWrite(LED_PIN , HIGH);
}

void loop() { 
}

```

#最後に
単色LEDを光らせるだけでモバイルバッテリー(cheero Power Plus 3)のAuto-IC機能の閾値を上回ることができましたが、もっと賢く簡単な方法があると思うので、知っている方がいたら教えてください....!!
また、もちろん他のモバイルバッテリーだと閾値が異なる可能性があるのでご注意ください。
Fedora26でpyenvを使ってPython入れようとしたら失敗した"ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?"

情報が古くなっており、メンテナンスが難しいため、こちらのページはアーカイブさせていただきました。

古い情報でも閲覧を希望される場合は、編集履歴からご覧くださいませ。
iOS ライセンス・証明書とか

# ios ライセンス・証明書

ここでは証明書やprovisioningの発行手順などは省略します。

## 証明書関連

### CertSigningRequest(CSRファイル)
ローカルマシン上で作成する、個人を特定するキーとなるファイルです。
後述するcerファイルをダウンロードするとKeychain Access上でcerファイルと
private keyが紐づきます

### Certificates(cerファイル)
開発者個人を特定するための証明書です。
CSRファイルを作成したローカルマシンと同じマシンに
取り込んだ場合、private keyと紐づきます。
証明書には

- Development(開発用)
- Production(配布用)

があります。

### p12ファイル
keychain Access上でcerファイルとprivate keyをエクスポート時に作成されるファイルです。
作成した証明書を他のマシンに移行する時などに使用します。

### Devices
端末情報などを登録します。ここに開発機として登録したデバイスでないとAdhoc配布時にアプリをインストールできません。

### App ID
アプリのID情報です。Bundle IDを設定したりします。

### Provisioning Profile
上記したCertificates、Devices、App IDを紐づけたプロファイルです。
Provisioningファイルも

- Development(開発用)
- Distribution(配布用)

があります。


Distributionにはさらに

- Adhoc(デバイス100台に配布可能)
- In-House(無制限に配布可能)
- App Store(ストア配信用)

があります。


## iosライセンス
iosの一般的なライセンスには

- Apple Developer Program
- Apple Developer Enterprise Program

があります。

#### ライセンス比較(2023年6月)
||Apple Developer Program|Apple Developer Enterprise Program|
|:--|:--|:--|
|年間費用|99米ドル|299米ドル|
|Apple Store配布|○|×|
|Ad Hoc配布|○|○|
|in-house配布|×|○|
|ライセンス|-|法人のみ|
|プロビジョニングファイル期限|1年|1年|
|証明書期限|1年|3年|

EnterpriseライセンスはIn-House配布をすることが可能でアプリを無制限に配布可能となっていますが、アプリの利用は組織内に限られており、これに違反してしまうと最悪ライセンスを取り消されてしまうということもあります。

また、EnterpriseライセンスではProvisioningファイルが失効してしまうとアプリが起動しなくなってしまいますので、cerファイル、Provisioningファイルの更新により注意を払っておく必要があります。

2020年ごろからEnterpriseライセンスの新規申し込みはほぼ通らなくなったようです。。(2023年6月追記)