OmniAICreator/Qiita-1.07M huggingface dataset:
FlurryからAnalytics Reporting APIを使って、イベントに関する数値を頂戴する

# Flurry使ってますか？

WebサイトのUIも新しくなってやる気あるのかな？でも、Yahooだし・・・な[あれ](https://developer.yahoo.com/analytics/)です。
スマホアプリでのユーザー操作をトラッキングするのに、そこそこ便利なので使っている方もそこそこいるのではないでしょうか。

# WebのUIが変わった!

冒頭でも書いた通り、トラッキングしたあれやこれや(以降、イベントと呼びます)を見るためのWebサイトのUIが(去年の終わり頃？)大きく変わりました。(以降、新バージョンと呼びます)
とはいえ、旧バージョンのWebサイトもClassicFlurryとしてつい先日(3/27)まで使えていたのですが、ついに完全にお亡くなりになってしまいました。
概ね、新バージョンでも旧バージョンでも出来ることは変わらないレベルまで追いついており、日常業務においては支障が出ることはないと思うのですが、個人的に好きだった表示形式が無くなりました・・・

# 我が愛しのパイチャート

<img width="1203" alt="パイチャート.png" src="https://qiita-image-store.s3.amazonaws.com/0/69858/8a00325c-8980-d3c8-9eb0-25b2bcc11633.png">

これが無くなってしまったのです・・・

# あのパイチャートを再現するために

パイチャートを再現するにはイベントのデータが必要です。
幸いなことにFlurryにはAnalytics Reporting APIという形で ~~あんまり使いやすくないけど~~ イベントの各種データを取得するためのAPIが用意されていますので、それを使ってデータを集め、自前でパイチャートを再現しようと思います。

## 準備

- Analytics Reporting APIを使うためのトークンを取得する。
  - https://developer.yahoo.com/flurry/docs/api/code/apptoken/ をよく読んで、Programmatic Userを作成します。

## あとはAPIを使うだけ

ややクセの強い構文ですが、[ドキュメント](https://developer.yahoo.com/flurry/docs/api/code/analyticsapi/)を見ながら実行すれば、きっと大丈夫です。

## イベントがたくさんあるんだけど、全部手で実行するの？

無理ですね。
ということで、私はNode.jsでちょっとしたスクリプトを書いて日々のイベントのデータをデータベースに突っ込むことにしました。
(今のところ、毎日手で実行してローカルのデータベースに蓄積させています)

というわけで、使っているスクリプトはこちらです。

https://github.com/mayahiro/flurry-collector

Flurryは数値がなかなか安定しないことで定評があるので、1週間前から今日までの分を取得して、過去分でも数値が変わっていたら最新の数値で更新するようにしています。

使い方はREADMEの通りですが、以下のような流れです。

1. データベースを用意します。
2. schema.sqlを流し込みます。
3. appsテーブルに `https://api-metrics.flurry.com/public/v1/dimensions/app/values` で取得したアプリケーションのデータをInsertします。
4. `settings.json.sample` を `settings.json` とリネームして、取得したFlurry Analytics Reporting APIのトークン、用意したデータベースの情報を記述します。
5. `npm install` しましょう。
6. `node index.js` でデータ収集開始です。

雑なスクリプトなので、Issue、プルリクお待ちしております。

## で、パイチャートは？

鋭意制作中です！
C++でニュートン法を美しく書く　その２（再帰処理で書く）

前回は
[C++でニュートン法を美しく書く　その１](http://qiita.com/konho/items/53611dbea598788abe4f)
で，ニュートン法を書いてみました．このときはwhileループを使って書きましたが，同じことを再帰処理を使って書いてみたいと思います．

```c++
#include <iostream>

auto solve_by_newton_method = []( auto func , double x ,double error , double delta ) {

	double x1 = x;
	double x2 = x1 + delta;

	double y1 = func(x1);
	double y2 = func(x2);

	double diff_x = (y2 - y1) / (x2 - x1);
	double next_x = x1 - y1 / diff_x;

	if (fabs(y1 - 0) < error) {
		return x1;
	}
	double answer = solve_by_newton_method(func, next_x, error , delta);
	
	return answer;
};

int main()
{
	double x;
	double y;
	double xini = 5.0;//初期値

	auto func = [](double x) {
		return x * x - 5.0;
	};

	x = solve_by_newton_method( func ,xini , 0.00001 , 0.00001);
	y = func(x);

	std::cout << "x = " << x << std::endl;
	std::cout << "y = " << y << std::endl;

	return 0;
}
```

はい，書けました．
次に，すこしかゆいところに手を届かせてみます．ニュートン法をはじめとする数値計算は，最終的に収束してくれれば良いのですが，収束せずに何度もループを回ってしまうことが良くあります．
そういう時に，無限ループに陥ってしまうとよろしくありませんので，ループ回数を制限することがあります．それで，ループ回数の上限に達してしまった場合は，これまでのニュートン法のステップの中で一番解に近いものを出力するようにしてみます．

一応やりたいことは，

- ループの上限を設定できる
- ループ上限に達した場合は一番解に近いものを出力

です．

```c++
#include <iostream>

auto solve_by_newton_method = [](auto func, double x, double error, double delta , int counter , int max_loop ) {
	double x1 = x;
	double y1 = func(x1);
	double diff_x = ( func(x1+delta)  - y1) / ((x1 + delta) - x1);
	double next_x = x1 - y1 / diff_x;
	
	if ( fabs(y1 - 0.0) < error) {
		//収束判定に収まった場合は，再帰処理の底になる．
		return x1;
	} else if ( counter > max_loop) {
		//ループ上限に達した場合は，再帰処理の底になる．
		std::cout << "loop over" << std::endl;
		return x1;
	}else {
		//どれにも当てはまらなかったら再帰処理を続ける
		double answer = solve_by_newton_method(func, next_x, error, delta, counter + 1, max_loop);

		//収束しなかったanswerが戻ってくる場合もあるので，この階層の再帰処理の結果と比較して，解に近い方を返す．
		if (fabs(y1 - 0.0) < fabs(func(answer) - 0.0)) {
			return x1;
		}
		else {
			return answer;
		}
	}
};

int main()
{
	double x;
	double y;
	double xini = 5.0;//初期値

	//解きたい関数の定義
	auto func = [](double x) {
		return x * x + 0.1;
	};

	x = solve_by_newton_method(func, xini, 0.0001, 0.00001, 1, 1000);
	y = func(x);

	std::cout << "x = " << x << std::endl;
	std::cout << "y = " << y << std::endl;

	return 0;
}
```

こんな感じになります．最大1000回の再帰呼び出しにしました．
ちなみに解く方程式は，

```math
y=x^2+0.1
```

に変更しました．この方程式は実数解を持たないので，ニュートン法は解を見つけようとして何度も何度もループを繰り返します．
Netlify + Hugo で作った無料ブログがNetlify CMSでWeb上で編集可能に! 感無量

個人的にイチオシの静的サイトをホスティングしてくれるサービス**[Netlify](https://www.netlify.com)**

静的サイトジェネレーターってホスティング費用ゼロでメンテナンス費用もあまりかからなくて最高だが、投稿の作成や編集にいちいちgitを使わないといけないというイライラがあった。

Netlify CMS？　これはまさかこの課題を解決するものなのではないか？ と思って試してみたらなんと、

**まさに求めていたものであった。**

そんな画期的なサービスがこの**[Netlify CMS](https://www.netlifycms.org)**なのだ。

static-site用の管理画面を生成するだけっちゃだけなんだけど(画期的でもない)、Netilifyで無料ホスティングできるというではないか。


感無量なテンションでよくわからない文章だが、実際に既存のHugoサイトに追加してみた。


## やったこと

1. Hugoで作ったサイトをgithubにホスティング
2. 上記のリポジトリをNetilifyにDeploy
3. https://github.com/settings/developers でnetlify用のOAuthアプリを生成
  -  Authorization callback URLに`https://api.netlify.com/auth/done`を設定
4. Netlifyの管理画面のAccessにgithubのAuthentication providerを追加
5. 以下のファイルを新規作成してcommit! push!
  - Hugoのディレクトリ構成によっては作成場所が変わります

``` html:/content/admin/index.html
<!doctype html>
<html>
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />

  <title>Content Manager</title>
  <!-- Include the stylesheets from your site here -->
  <link rel="stylesheet" href="https://unpkg.com/netlify-cms@^0.3.9/dist/cms.css" />
  <!-- Include a CMS specific stylesheet here -->

</head>
<body>
  <script src="https://unpkg.com/netlify-cms@^0.3.9/dist/cms.js"></script>
</body>
</html>
```

``` yaml:/content/admin/config.yml
backend:
  name: github
  repo: user/repo
  branch: master

media_folder: "static/img" # Folder where user uploaded files should go
public_folder: "img"

collections: # A list of collections the CMS should be able to edit
  - name: "post" # Used in routes, ie.: /admin/collections/:slug/edit
    label: "Post" # Used in the UI, ie.: "New Post"
    folder: "content/post" # The path to the folder where the documents are stored
    create: true # Allow users to create new documents in this collection
    fields: # The fields each document in this collection have
      - {label: "Title", name: "title", widget: "string"}
      - {label: "Publish Date", name: "date", widget: "datetime"}
      - {label: "Intro Blurb", name: "description", widget: "text"}
      - {label: "Image", name: "image", widget: "image", required: false}
      - {label: "Body", name: "body", widget: "markdown"}

```
(config.ymlが割りと色んな使い方ができるかもしれないとワクワクする)

上記のファイルを作ったら最後の`git push`(そんなことはない)

公開されたサイトの`/admin`にアクセスしてgithubログインすると...

![image](https://qiita-image-store.s3.amazonaws.com/0/51402/8a2f156a-4fde-952c-19cd-faeee7077495.png)

管理画面が使えるようになりました。

シンプルで割と誰でも使えそうなUIの感じがいいですね。



## Netilify CMSをとりあえず試すだけなら

https://www.netlifycms.org/docs/test-drive/

このページに`Deploy to Netilify`ボタンあるので、押して、OAuthとかの設定するだけで試せます。

自分はたまたまHugoつかってたけど、Hugo以外にも静的サイトジェネレータなら色々使えるようですね。
ForgeRock社Webサイトの歩き方 

# ForgeRock社Webサイトの歩き方

シングルオンサイオン製品であるのOpenAMを扱っているForgeRock社。Webサイトがわかりづらいんです。
OpenAMを中心に自分がよくアクセスする WebサイトのURLを整理しました。

## コーポレートサイト( www.forgerock.com )

* コーポレートトップ  
https://www.forgerock.com/
* OpenAMトップ  
https://www.forgerock.com/platform/access-management/
* ブログ  
https://www.forgerock.com/blog/

## バックステージ ( backstage.forgerock.com )
* ドキュメンテーションOpenAMトップ  
https://backstage.forgerock.com/docs/openam
* ナレッジベース    
https://backstage.forgerock.com/knowledge/kb
* ダウンロード-エンタープライズ版  
https://backstage.forgerock.com/downloads/OpenAM/OpenAM%20Enterprise/13.5.0/OpenAM%2013.5/zip#list
* セキュリティアドバイザリー  
https://backstage.forgerock.com/knowledge/kb/feed/AVcAY9NbRnj-08wS4zdT

## コミュニティサイト

* コミュニティトップ( forgerock.org )  
https://forgerock.org/
* OpenAMトップ  
https://forgerock.org/openam/
* ソースコード  
https://forgerock.org/projects/getting-the-source-code/  
https://stash.forgerock.org/projects/OPENAM
* ダウンロード-コミュニティ版  
https://forgerock.org/downloads/
* バグ報告(JIRA)  
https://bugster.forgerock.org/jira/projects/OPENAM/issues
* Wiki(Confluence)  
https://wikis.forgerock.org/confluence/display/openam
* ロードマップ  
https://wikis.forgerock.org/confluence/display/openam/OpenAM+Roadmap
[めも]pixi.jsのTextは、同じスタイルでも、色を変えると微妙にサイズが変わる？

実験した環境:
OS: Windows7
Firefox: 52.0
pixi.js: v4.4.2

pixi.jsで、色(fill)だけを変えたTextを、同じ位置に重ねて描画してみると、
枠線が付いたように見える事がある。
コード例(test.js)を実行してみると、黒い文字の周りに、部分的に黄色い枠線が。
ということで、色を変えると、微妙に(1px位？)サイズが変わるのかも。
(実際は、色を変えなくても変化しているのかもしれませんが・・)

テキストの表示をクリアせずに同じ箇所に再描画する時などに、注意が必要かと思います。

```test.js
var app = new PIXI.Application(800, 600, { backgroundColor: 0x202020, antialias: false }); // antialias:trueでも同様の結果
document.body.appendChild(app.view);

var tx1 = new PIXI.Text('Text', {fill: 0xFFFF77, fontSize: 96});
var tx2 = new PIXI.Text('Text', {fill: 0x000000, fontSize: 96});
app.stage.addChild(tx1);
app.stage.addChild(tx2);
```

実行例:
[jsfiddle](http://jsfiddle.net/vky0qdgm/24/show)
【初心者投稿-12】PHP初学習の感想そして挫折

#昨日までのおさらい
「HTML&CSS 学習コース 中級編」完了し、HTMLとCSSは出来る気になっていた(※過去形)
これまでの力を合わせれば簡単なページ作れるんじゃね？(※過去形)

#いろいろ挫折
もうね、色々挫折してどこから書けばいいのかわからない(笑)

* 友人から任されたトップページどこから手を付けたらいいかわからない事件
* ロゴから手を付けようと思ってpngで作ったもののアップデートがわからない事件
* PHPにチャレンジ！最初のレッスン(progate)が数学過ぎて謎

まず簡単なページ作れるんじゃね？って思っていた昨日の自分を思いっきり殴りたい。
すでにprogateで習ったページ作りを参考に作ることはできると思うんだけど、ロゴの挿入からわからないわ～

道は長いですね…
でもくじけず頑張る！

そして、PHPって便利なのはわかるけど、レッスンがつまらなすぎて…
ifとかすごい便利なんだろうけどさ、もっとインプットどうにかならないかな
覚えること多すぎて愚痴しか出てこないｗ

#学習の記録
* Progate10日目
* 今日の勉強時間：1時間30分(うち45分程度サイト作り)
* 総学習時間：11時間30分
* 今日嬉しかったこと：ifを使ったコードがとてもエンジニアっぽい(友達が使っているの見たことある)
Atomic Designってなんだ

## はじめに
* 所属しているプロジェクトにて、AtomicDesignを使うということで色々調べたりした内容のメモです。

## Atomic Designとは
* Atoms（原子）、Molecules（分子）、Organisms（有機体）、Templates（テンプレート）、Pages（ページ）の各コンポーネント同士を組み合わせて作成するデザイン手法
* それぞれのコンポーネント詳細は下記

|コンポーネント|詳細|
|-----|-----|
|Atoms(原子)|画面を構成する要素の最少単位 ラベルやインプット項目など|
|Molecules(分子)|Atomsを組み合わせて作成された要素　検索フォームなど|
|Organisms（有機体）|複数のMoleculesやAtomsを組み合わせたもの、ヘッダーやフッターなど|
|Templates（テンプレート）|複数のOrganisms等を組み合わせたデータの入っていない画面　ワイヤーフレームとなるもの|
|Pages(ページ)|実際の文言や画像などが入ったもの、ほとんど最終的な画面と同じ|

* 実際にどんな感じにそれぞれを定義するかは参考にしたサイトを見ていただくと良いと思います。

## 参考にしたサイト
[Atomic Design | Brad Frost](http://bradfrost.com/blog/post/atomic-web-design/)
[Atomic Designの考え方と利点・欠点 - I'm kubosho_](http://blog.kubosho.com/entry/using-atomic-design)
[珍しいワークフロー：Atomic Designの原則とSketchでデザインからプログラミングまで | デザイン | POSTD](http://postd.cc/the-unicorn-workflow-design-to-code-with-atomic-design-principles-and-sketch/)
[Swift] 同じ要素を繰り返す、Repeated

以前Sequenceに関するこんな記事を書きました。

[[Swift] シンプルなカウントアップでSequenceに強くなる](http://qiita.com/a-beco/items/2c0432217bbf41ee54e3)

カウントアップと微妙に違ったので書けなかったのですが、似たようなSequenceの仲間で**Repeated**というのがあります。

Repeatedは`repeateElement(_,count:)`関数で生成します。

```
let manyApples = repeatElement("🍎", count: 100)
for apple in manyApples {
    print("\(apple)") // 🍎, 🍎, 🍎...
}
```

お察しの通り、Repeatedは**第一引数で指定した要素を指定した回数繰り返す**ものです。Repeatedは`RandomAccessCollection`なので、ランダムアクセスも可能です。

うまい使い所が難しいですが、使えると気持ちよさそうですね。

---
:whale2: Twitter: [@a_beco](https://twitter.com/a_beco)
:guitar: SoundCloud: [@beco](https://soundcloud.com/baron1_3) <- 作業用BGMにどうぞ！
コマンドによる事故をこの世からなくしたい

2017/8/24
@taramさんからスクリプトがDRYとの指摘や、shutdownコマンドのオプションをフックする方法を教えていただいたので内容を修正しました。

# 概要
ターミナルをたくさん開いてて対象サーバと別のサーバをうっかりリブートしてしまい泣きながら報告書を書いたことがある人向けです。事故防止にお役立てください。

`reboot`や`poweroff`コマンドを実行した際にいきなりプロセスが開始されるのではなく、サーバのホスト名を確認するよう促します。

スクリプトを作ってコマンドのエイリアスにするだけです。

# スクリプト
## reboot/poweroffコマンド用
```bash:confirm_shutdown.sh
#!/bin/bash

confirm_shutdown() {
    COMMAND=$1      #yesの場合に実行されるコマンド。
    ACTION=${2:-$1} #メッセージに出力する動作の名前。省略すると$COMMANDと同じ

    echo "You will $ACTION << `hostname` >>, Are you sure? (yes or no)"
    read ANS1

    if [ "${ANS1}" = 'y' -o "${ANS1}" = 'yes' ]; then
        echo 'Really? (yes or no)'
        read ANS2
        if [ "${ANS2}" = 'y' -o "${ANS2}" = 'yes' ]; then
            echo "${ACTION^} `hostname`."
            exec $COMMAND
        fi
    fi
    echo "${ACTION^} cancelled."
}

```

## shutdownコマンド用
`shutdown`コマンドはオプションを使うことがほとんどなのでそれをフックします。

```bash:shutdown.sh
#!/bin/bash

source /<PATH>/confirm_shutdown.sh

while getopts :rhHP OPT; do
    case $OPT in
        r)
            ACTION="reboot"
            ;;
        h|H|P)
            ACTION="shutdown"
            ;;
        *)
            ;;
    esac
done

if [ -n "$ACTION" ]; then
    confirm_shutdown "shutdown $*" $ACTION
else
    shutdown "$@" #shutdown -cなどは普通に実行
fi
```

- `while getopts :rhHP OPT`はオプションに'r' 'h' 'H' 'P'いずれかの文字列があれば`OPT`に代入します。
- オプションが'r'の場合は再起動、'h' 'H' 'P'はシャットダウン、それ以外は最後の`else`のところでそのまま実行。
- `$*`、`$@`は引数全部。前者は引数すべての１つの文字列として扱い、後者は変数ごとに区切られた文字列として扱います。`shutdown -r now`など複数のオプションをフックするためですね。

## .bashrcへaliasを記載
```sh:.bashrc
(中略)
source /<PATH>/confirm_shutdown.sh
alias reboot="confirm_shutdown reboot"
alias poweroff="confirm_shutdown poweroff shutdown"
alias shutdown='/<PATH>/shutdown.sh'
```

`<PATH>`は自分の環境にあわせて修正しましょう。
`source`コマンドで`.bashrc`を読み込んで有効にすること。

# 試してみる
```sh
poweroff
```
を実行すると

```sh
You will shutdown <ホスト名>, Are you sure? (yes or no)
```
と表示されるのでyes(またはy)

```sh
Really? (yes or no)
```

yes(またはy)を入力しEnterを実行するとpoweroffが実行されます。rebootも同じ流れです。
この世から事故がなくなりますように。
大規模サイト構築で重くなったpugのプロジェクトを高速化する。


サイトの画面構成がそれなりの規模感になってくると pug のビルドにも時間がかかるようになってきます。

pug で全体を毎回ビルドする設定をしていると、 public 配下をwatch する browserSync が無限にリロードを重ねるようになり、ブラウザがぶっ壊れます。

変更のあったpugファイルのみ変更反映すればいいんですが、依存関係ぐちゃぐちゃのpug構成内では、そううまいこと行きません。

pug コンパイルタスクの完了に合わせて browserSync のリロードとか書ければいいんですがビルドに 5s とかかかるようになってくると流石に待てないですね。

というわけで browserSync に mddleware を刺して動的に pug ファイルをコンパイルするアレです。
 
 
````
const fs = require("fs")
const path = require("path")
const url = require("url")
const pug = require("pug")

const pugMiddleWare = (req, res, next) => {

    const basedir = process.cwd();
    const requestPath = getPugTemplatePath(basedir,req)

    if (path.parse(requestPath).ext !== ".html") {
        return next();
    }
    const pugPath = requestPath.replace('.html', '.pug');

    try{
        console.log("[BS] try to file "+ pugPath)
        fs.statSync(pugPath)
        const content = pug.renderFile(pugPath, {
            locals:{},
            pretty: true,
            basedir,
            compileDebug: true,
            doctype: "html"
        });
        res.end(new Buffer(content));
        next();
    }catch (e){
        console.log(e)
        return next();
    }
}

const getPugTemplatePath = (baseDir,req)=>{
    const requestPath = url.parse(req.url).pathname;
    const suffix = path.parse(requestPath).ext ? "": "index.html"
    return path.join(baseDir,"assets/pug",requestPath,suffix);
}
````

gulp で使うときにはこんな感じで

````
gulp.task("server",()=> {
    browserSync({
        server:{
            middleware: [pugMiddleWare],
            baseDir:"public",
            index: "index.html",
            open: false
        }
    })
    
    return gulp.watch(process.cwd()+"/**/*", () => {
        setTimeout(function(){
            browserSync.reload();
        },500);
    });
});

````
[Node]Webクリップアイコンやファビコンを取得するライブラリを作ってみた

## はじめに
今作ってるもので、Webクリップアイコンを取得しなければいけなかったのでついでにモジュール化して、npmに公開しました。
よければ使ってください。

↓Webクリップアイコンって言うんですね。はじめて知りました。
![te.png](https://qiita-image-store.s3.amazonaws.com/0/77608/b96acc54-e6fe-25b8-e064-8c3632476f6c.png)

## 使い方
npmでインストールしてください。
``` 
npm install web-icon-node 
```
あとは、```require```して```get```で取得できます。
これだけです。

```demo.coffee
web_icon = require 'web-icon-node'

web_icon.get 'http://ngnl.jp', (list) ->
  console.log list
```

Webクリップアイコンやファビコンがjsonに入ってます。

<img width="428" alt="demo.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/d3cefbcb-31cc-a753-570f-6f888081f6a8.png">

## さいごに
php版とpython版をそのうち作ります。
GitHubにあげてるのでよかったらみてください。
[https://github.com/yuki540net/web-icon-node](https://github.com/yuki540net/web-icon-node)

GitHub: [https://github.com/yuki540net](https://github.com/yuki540net)
Twitter: [@eriri_jp](https://twitter.com/eriri_jp)
Vagrantfile of ruby environment for ubuntu 14.04

自分の備忘録

```rb:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  config.vm.box = "phusion/ubuntu-14.04-amd64"
  config.vm.network :private_network, ip:"192.168.33.10"

  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--natdnsproxy1", "off"]
    vb.customize ["modifyvm", :id, "--natdnshostresolver1", "off"]
  end

  config.vm.provision :shell, path: "bootstrap.sh", privileged: false
end
```

```bash:bootstrap.sh
#!/bin/sh

# set interactive environmental-valiables
PS1='$ '
source ~/.bashrc

sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtimesudo update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10
sudo update-alternatives --set editor $(update-alternatives --list editor | grep 'vim.basic')
sudo sed -i'~' -E "s@http://(..\.)?(archive|security)\.ubuntu\.com/ubuntu@http://ftp.jaist.ac.jp/pub/Linux/ubuntu@g" /etc/apt/sources.list

# install
sudo apt-get -y update
sudo apt-get -y install software-properties-common
sudo add-apt-repository "deb https://cli-assets.heroku.com/branches/stable/apt ./"
sudo add-apt-repository -y ppa:git-core/ppa
curl -L https://cli-assets.heroku.com/apt/release.key | sudo apt-key add -

sudo apt-get -y update
sudo apt-get -y install g++ expect git nodejs libssl-dev libpq-dev samba libreadline-dev libsqlite3-dev npm postgresql-9.3 postgresql-contrib ruby-dev libxslt-dev libxml2-dev nkf imagemagick libmagickcore-dev libmagickwand-dev unzip language-pack-ja wget curl zip unzip git heroku
wget -O- https://toolbelt.heroku.com/install-ubuntu.sh | sh

# for rbenv
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc

# rbenv setting
rbenv install 2.2.3
rbenv global 2.2.3
rbenv rehash

# bundler
gem install bundler
```
Swiftのstatic、classキーワードの違いについて

# 概要
Swiftのスタティック、クラスプロパティの違いについてまとめました。
※スタティック、クラスメソッドについても違いは基本的に同じです。

# Swiftのスタティック、クラスプロパティの違い
## 名称
 - スタティックプロパティ（別名：静的プロパティ）
 - クラスプロパティ

上記両方をタイププロパティ（型プロパティ）と呼ぶ場合や、
スタティックプロパティのみを指してタイププロパティと呼ぶ場合あり

## 用途
 - 後述の特徴の違いはあるが、**全インスタンスから共通で利用されるという点では同様**
 - インスタンスに依存しないユーティリティ的な用途やシングルトンパターンで利用

```swift:シングルトンパターンの例
class Singleton {
    class var sharedInstance : Singleton {
        struct Static {
            static let instance : Singleton = Singleton()
        }
        return Static.instance
    }
}
```

## 定義方法
 - static、classキーワードを宣言の前に付与する
 - インスタンスのように初期化されないため、宣言時に初期値が必要
 - クラスプロパティは構造体（struct）、列挙型では定義不可、クラスでのみ定義可
 - クラスプロパティはストアドプロパティとしては定義不可（コンピューテッドプロパティのみ可）

```swift
// スタティックプロパティ
static let id: Int = 2017
static var name: String = "Qiita"

// クラスプロパティ
class let id: Int = 2017
class var name: String {
    return "Qiita"
}
```

## 利用方法
 - 型名.プロパティ名で同じようにアクセスできる
 - スタティック、クラスメソッドの内部では型名.は省略可（もしくはself.プロパティ名）

```swift
// スタティック、クラスプロパティで同様
func instanceMethod() {
    print(StructName.propertyName)
    print(EnumName.propertyName)
    print(ClassName.propertyName)
}

static func staticMethod(name: String) {
    print(self.name) // 引数と区別する時はself.
}

class func classMethod(name: String) {
    print(self.name) // 引数と区別する時はself.
}
```

## 特徴
 - サブクラスでオーバーライド（上書き）したい場合はクラスプロパティ一択
 - ストアドプロパティとして定義したい場合はスタティックプロパティ一択

| 比較項目                         | スタティック<br>プロパティ | クラス<br>プロパティ |
|----------------------------------|------------------------|------------------|
| オーバーライド                   | NG                     | OK               |
| ストアドプロパティの定義         | OK                     | NG               |
| コンピューテッド<br>プロパティの定義 | OK                     | OK               |

# 参考

 - [【Swift】classとstaticの挙動の違いを整理する](http://qiita.com/shimesaba/items/dc976b3974cfb41bec0c)
 - [Swiftでクラスメソッド](http://qiita.com/econa77/items/5f9f079953e331207886)
 - [nerd0geek1's iOS Blog / Swiftのclass/static修飾子](http://nerd0geek1.hatenablog.com/entry/2016/01/30/200000)
iOSのAPI Diffを見るために

本日、iOS 10.3がリリースされていました。
APIの更新を確認しようと思って、ここ最近API Diffを見るドキュメントが無いような気がしていた（どこかにあるのかもしれない）のですが、以下のような操作でAPI差分を見ることができることを知りました。

1. API Referenceのページへアクセス!!! https://developer.apple.com/reference
2. 右上の「Show API Changes」からXcodeのバージョン比較をすると、APIのdiffを表示させることができる。
<img width="563" alt="スクリーンショット 2017-03-28 22.00.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/30355/55c0b2b7-4bc8-afe6-9b64-72b77e564aee.png">

<img width="1057" alt="スクリーンショット 2017-03-28 22.03.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/30355/0faaa152-8813-4024-edb3-f1b280e561b3.png">

それぞれのAPIの詳細ページにいっても差分がわかるようになっていました。

<img width="1053" alt="スクリーンショット 2017-03-28 22.06.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/30355/2fcdc08c-20eb-c451-0eef-bce16a6c9bca.png">
DroidCamでAndroidカメラの映像を取得してOpenCVで使用した

[DroidCam](http://www.dev47apps.com)でAndroidカメラの映像を取得して[OpenCV](http://opencv.org)で使用できるようにしました。

## 環境

+ OS: ArchLinux 64bit
+ シェル: zsh
+ 言語: Python 3.6.0
+ ライブラリ: OpenCV 3.2

## AndroidにDroidCamをインストール

[Google Play](https://play.google.com/store/apps/details?id=com.dev47apps.droidcam)で最新のDroidCamをインストールしました。

## ArchLinuxにDroidCamをインストール

[DroidCam 公式ページ](http://www.dev47apps.com/droidcam/linuxx)を参考にして、最新のDroidCamをインストールしました。

## v4l2loopback周りの設定

``` sh
$ yaourt -S v4l2ucp v4l-utils
$ sudo modprobe v4l2loopback_dc
```

v4l2関連のパッケージをインストールしてから`v4l2loopback_dc`モジュールを有効にしました。

## 環境変数の設定

``` sh:zshrc
export LD_PRELOAD=/usr/lib/libv4l/v4l2convert.so
```

このままOpenCVからDroidCamの入力を読もうとすると、ピクセル形式がサポートされていないというメッセージが表示されました。そのため、アプリケーション実行前に`v4l2convert.so`を読み込ませるようにしました。

## 動作確認

![input.png](https://qiita-image-store.s3.amazonaws.com/0/155454/91c080c0-21de-aa7f-e297-be81e080f9ea.png)

![result.png](https://qiita-image-store.s3.amazonaws.com/0/155454/16d02945-f911-9b1a-45af-e9ffb9c696ca.png)

``` python:main.py
from cv2 import VideoCapture, imshow, waitKey


def main():
    video = VideoCapture(0)

    while video.isOpened():
        result, frame = video.read()

        if not result:
            break

        imshow("Input", frame)
        imshow("Inverse", 255 - frame)

        if waitKey(16) & 0xff == ord("q"):
            break


if __name__ == "__main__":
    main()
```

DroidCamからの入力画像の色を反転しました。

## 参考文献

1. [Webcam setup - ArchWiki](https://wiki.archlinux.org/index.php/Webcam_setup)
【git】マージしたけどやっぱりやめたい時のやり方4種類

**20190501追記**

- わかりにくい文章を修正しました
- 「その3 パート1」の方法を追加しました

**追記ここまで**


gitでマージ作業を始めたけど、もろもろの理由からやっぱりやめたいときのやり方3種類です。

## その1 「マージしたらコンフリクトした。やっぱりやめよう。」
マージしたらコンフリクトした、コンフリクトするとは思わなかった、いったんやめよう、などといういうときです。
コンフリクトの編集をしていないときに限ります。

```bash
$ git merge --abort
```

マージする前の状態に戻ります。

## その2 「マージしたらコンフリクトした。コンフリクトを解消しようといろいろ編集した。でもやっぱりやめよう。」
コンフリクト解消のためにコードをいろいろ編集したけどやっぱりマージやめよう、というときです。

```bash
$ git reset --hard HEAD
```

編集した内容もマージもすべて取り消されます。


## その3 「マージすべて完了した。でもやっぱりやめよう。」パート1
マージが完了(コミットまで)したけれども、やっぱりマージ前に戻したい、というとき、パート1です。
`revert`コマンドを使用して、マージコミットを取り消します。

```bash
$ git revert -m 1 <merge_commit>
```

マージコミットの場合、親が2つに分かれます。
revertコマンドを使う場合は、revertした結果どちらの親に戻すのかを`-m 数字`で指定します。`数字`が親を表します。

詳しくはこちらの記事を見てください。
https://qiita.com/chihiro/items/2fa827d0eac98109e7ee

### その3 パート1 の注意!!!
この方法の場合、取り消したマージコミットに含まれていた変更を再度マージすることはできなくなります。
例)
ブランチA に対して ブランチB をマージ
↓
マージコミットをrevertして、ブランチAの状態に戻す
↓
ブランチA に対して ブランチB をマージ ← **できない(変更が取り込まれない)** 

revertコマンドを使うと、コミット履歴としては「マージした」という歴史を残したままマージを取り消します。
2つのブランチがマージされたという事実は残るので、差分は(マージした時点のコードとしては)何もないということになります。


## その3 「マージすべて完了した。でもやっぱりやめよう。」パート2
マージが完了(コミットまで)したけれども、やっぱりマージ前に戻したい、というとき、パート2です。
`reset`コマンドを使用して、コミットの履歴自体を取り消します。

```bash
$ git reset --hard ORIG_HEAD
```

マージする前のHEADに戻ります。

### その3 パート2 の注意!!!
この方法は一度できたコミットを取り消すことになります。
`revert`コマンドとは違い、「コミットを取り消した」という履歴も残りません。
一度pushなどを行って、ほかの開発者に公開されているコミットを取り消すことは絶対にしてはいけません。
自分のローカルだけでマージしてみたけど(pushはしていない)やっぱりやめる、などのローカルの変更をもとに戻す場合にのみ使用しましょう。
古いバージョンの Android Studio を新規にダウンロードしてみた件

# 方法

[Android Developers](https://developer.android.com/) 内にリンクがありました :link:

https://developer.android.com/studio/archive?hl=en

オフィシャルなので安心安全です :helmet_with_cross:
Windows, Mac & Linux 版も取り揃っています :information_desk_person: 

# 更新履歴 :scroll:

## 2024.04.02 時点

英語版で表示しないとダウンロードができない模様 :rolling_eyes:

- :o: https://developer.android.com/studio/archive
- :x: https://developer.android.com/studio/archive?hl=ja

## 2017.09.27 時点

@katsuko0303 さんからのコメントより「Windows 版 Full installer (bundled SDK)  `1.0` のリンクは生きているが、インストールまでは試していない」との情報を得たので Windows 7 で検証してみました。
結果、途中までは順調に進みましたが「Fetching Android SDK component information」のフェーズで止まってしまいました :cry:

![image.png](https://qiita-image-store.s3.amazonaws.com/0/6881/d9adea8b-6f1b-b443-8cf9-30a464fceb93.png)

## 2017.09.03 時点

`2.3.1` の Stable 版より前のバージョンはリンク切れになっているようでした（@KNaito さんからのコメントより）。
org-modeのクロックテーブルの％表示を直してみた

## 追記(2017.03.31)
下の関数を適用しなくても、次のコードをinit.elに入れることでクロックテーブルの集計が時間単位となり、％表示が正常化することがわかりました。こっちのほうが楽なのでみなさんどうぞ。ううぅ…。

```lisp:init.el
(setq org-time-clocksum-format '(:hours "%d" :require-hours t :minutes ":%02d" :require-minutes t))
```

[こちら](https://repl.info/archives/49)を参考にしました。この場を借りてお礼申し上げます。

## なにをしたか
* org-modeで使用できる作業時間のまとめテーブル(クロックテーブル)には、全体の作業時間に対して各項目がどのくらいの割合か表示してくれる機能がある
* しかし、合計作業時間が1日以上だとうまく働かなかった
    * 日数を読み込んでくれないのが原因
* これを何日でも対応できるようにした([gist](https://gist.github.com/anno-kgrzk/56e8877e6d49ce463d44077cef60a194))
    * 初めてemacs-lispをまともにいじって楽しかったから勢いで投稿

## はじめに
Emacsには、org-modeというそれはそれは素晴らしい機能があり、タスク管理のほかタスク消化にかかった時間なども計測可能です。わたしはもっぱら~~アニメ試聴履歴の記録~~職場での工数管理に使用しています。

こうした工数を集計するのにとても便利なのがクロックテーブル機能です。これはorg-modeの動的テーブルを利用して、項目ごとの作業時間を自動的に集計してくれる優れものです(`C-c C-x C-r`で出せます)。さらにヘッダーに`:formula %`といれることで、作業時間が全体の何割だったかを集計してくれます。大変便利なのですが、これには一つ問題があり、**合計作業時間が1日以上あると計算がおかしなことになります。**私はもっぱら週次ないしは月次で集計するので、かなり問題です。再現した例を下に示しています。

<img width="456" alt="fig1.png" src="https://qiita-image-store.s3.amazonaws.com/0/144329/547aaa9d-10e6-6f4c-ffef-52faa014c1d3.png">

全体の時間が2日12時間59分、けものフレンズ1話視聴時間が1日2時間で、全体の42.6％になるはずですが、この図では15.4％にしかなっていません。これは、関数`org-clock-time%`が行う計算の過程で日以上の情報が無視されており、単純に12:59 vs 02:00という計算になっているためです。そこで今回はこれを修正することに決めました。

## ソース
ソースコードは[こちら](https://gist.github.com/anno-kgrzk/56e8877e6d49ce463d44077cef60a194)に上げました。

## 使用方法
gistの方にも書いてありますが、ソースをそのままinit.elにつっこんで`eval-buffer`すればいいです。nadvice.elでorg-clock-time%を上書きしているので、クロックテーブル側の変更は必要ないです。もし元に戻したくなった場合は、`advice-remove`を評価してあげる必要があります。

適用後は下の通り、うまく百分率が計算されています。捗る！

<img width="455" alt="fig2.png" src="https://qiita-image-store.s3.amazonaws.com/0/144329/c7d76d91-5925-5550-5d3e-f21e09853a1c.png">

## 余談
ソースははじめ全然違う形で書いていたけど、[オリジナル](https://github.com/emacs-mirror/emacs/blob/master/lisp/org/org-clock.el#L2732)を踏襲した方がいいかと思い書き直してる。ぶっちゃけ小さいExcel VBAマクロはよく作るけど、こういうちゃんとしたアプリケーションに(間接的とはいえ)手を加えるということは初めてなのでお作法がよくわからない…。たぶんこういうのはadviceでいつでも変更を取り消せるようにするのが一番いい、はずだと思う。

あと、名前とかライセンス(いるのか？)の文言は[こちら](http://syohex.hatenablog.com/entry/20130123/1358951475)を参考にしました。
心がHomebrewで旧バージョンのパッケージを入れたがってるんだ

## はじめに
iOSの開発で[Swiftgen](https://github.com/SwiftGen/SwiftGen)を使っているプロジェクトに入った時、周りのメンバーが最新のv4.2.0ではなく、旧バージョンのv4.1.0を使用していたため、ダウングレードしなければいけない状況でした。
旧バージョンをインストールしたことがある場合は `brew switch swiftgen 4.1.0`で終わりなのですが、無い場合はオワタ＼(^O^)／となってしまいます。
そのときに何とかしてダウングレードできないものかとググりまくって見つけた方法をここに記します。

## 現状
macOS : Sierra v10.12.2
Homebrew : v1.1.11
Swiftgen : v4.2.0 　←**こいつをダウングレードしたい**

## ダウングレードするぞい

### 1. Formulaまで移動
Homebrewのリポジトリのあるディレクトリまで移動します。

```
$ cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/
```

### 2. 全コミットの取得
Homebrewの全コミットを`git fetch --unshallow`で取得します。

```
$ git fetch --unshallow
remote: Counting objects: 329054, done.
remote: Compressing objects: 100% (139309/139309), done.
remote: Total 329054 (delta 190611), reused 325373 (delta 186941), pack-reused 0
Receiving objects: 100% (329054/329054), 94.67 MiB | 720.00 KiB/s, done.
Resolving deltas: 100% (190611/190611), completed with 3555 local objects.
From https://github.com/Homebrew/homebrew-core
   cb79fc2..e5e1865  master     -> origin/master
```

### 3. コミットの確認
欲しいバージョンのコミットを確認します。

```
$ brew log swiftgen --oneline | grep 4.1.0
307341b swiftgen: update 4.1.0 bottle.
bed3a58 swiftgen 4.1.0
```

### 4. 使用するコミットまで戻す
リポジトリを古いバージョンの頃に戻します。v4.1.0 の場合は `307341b` のコミットまで戻します。

```
$ git checkout 307341b swiftgen.rb
```

### 5. 現バージョンのアンインストール
旧バージョンを入れるときに新しいバージョンのパッケージが存在していると入らないので、一度アンインストールしましょう。

```
$ brew uninstall swiftgen
```

### 6. 旧バージョンをインストールする
**ここが重要です。**Homebrew v1.1.11ではインストール時にリポジトリの自動アップデートを**勝手に**行う仕様になっているため、ここまでの工程が元に戻ってしまい、最新のパッケージの方がインストールされて、(ﾟДﾟ)ﾊｧ? となってしまうのですが、先頭の **`HOMEBREW_NO_AUTO_UPDATE=1`** を指定するとアップデートせずに現在のコミットでインストールできます。

```
$ HOMEBREW_NO_AUTO_UPDATE=1 brew install swiftgen
==> Downloading https://homebrew.bintray.com/bottles/swiftgen-4.1.0.sierra.bottle.
######################################################################## 100.0%
==> Pouring swiftgen-4.1.0.sierra.bottle.tar.gz
🍺  /usr/local/Cellar/swiftgen/4.1.0: 172 files, 21.4MB
```

### 7. バージョンの確認
バージョンを確認します。やったぜ。

```
$ swiftgen --version
SwiftGen v4.1.0
```

### 8. リポジトリの修復
Homebrewのリポジトリが古い状態になっているので元に戻します。

```
$ git reset HEAD
$ git checkout .
```

### 9. 最後に
`git fetch --unshallow`でfull cloneしたことで重くなるかもと不安な方は`/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core` まで移動してから、以下のコマンドを入力することでlogを減らせます。

```
$ git fetch --depth=1
$ git gc
$ git prune
```

## 参考にさせてもらった記事
- Homebrewで過去のバージョンを使いたい - Carpe Diem
http://christina04.hatenablog.com/entry/2017/01/08/120459
- Is it possible to \`brew install\` without updating? · Issue #1670 · Homebrew/brew
https://github.com/Homebrew/brew/issues/1670
- Homebrewで旧バージョンのパッケージをインストールしたい - Qiita
http://qiita.com/KyoheiG3/items/912bcc27462871487845
ウィンドウを切り替えないとコードの変更が検知されない場合の対処法

小ネタ。

# 問題

`webpack`の`--watch`や、`webpack-dev-server`を使って`Hot Reload`や`Hot Module Replacement`をしている際、変更を保存をした直後にリロードをしてくれませんでした。
何故かウィンドウを切り替えると変更が検知され、正常に動作します。

# 原因

Webpackの設定を色々見直していましたが、原因はエディター側にありました。
つまり検知していないわけではなく、そもそも変更が書き込まれていなかったわけです。

JetbrainsのIDE（IntelliJ、RubyMine、Webstormなど）では、デフォルトで **safe write** が有効になっています。
設定の「Appearance & Behavior」 →「System Settings」、「Synchronization」内の「Use "safe write"...」で確認できます。

<img width="395" alt="スクリーンショット 2017-03-28 21.24.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/49432/2d32275e-34ae-6c09-7890-27fa121f580d.png">

これはファイルの破損を防ぐため、一旦一時ファイルに変更を書き出し、ウィンドウを切り替えた際に書き出してくれる仕組みです。

これを切ると、変更してすぐにビルドが走るようになりました。
普通は問題ないですが、破損しやすくなった場合は元に戻しましょう。
nginxでBasic認証（ユーザを複数設定する）htpasswdの叩き方

# nginxでBasic認証（ユーザを複数設定する）htpasswdの叩き方

Basic認証とは、HTTPで定義される認証方式の一つで、ユーザ名とパスワードをコロン(:)でつないで、Base64で送信して認証を行います。

今回は、AWS（Amazon Linux）でnginx v1.10.2-1.30.amzn1を利用。

## 複数ユーザを作ってみる

まずはコマンドが叩けるか調べてみる

```
$ which htpasswd
/usr/bin/htpasswd
```

こんな感じでコマンドが叩ける状態ならOKです。

なければ叩けるようにコマンドをインストールします。

```
$ sudo yum install -y httpd-tools
```

これでコマンドが叩けると思います。

```
$ sudo htpasswd -c /etc/nginx/.htpasswd ユーザ名
```

ここでユーザが一人追加されると思います。
下記で確認

```
$ cat /etc/nginx/.htpasswd
hoge:$apr1$1F44gU0L$Sm5kzGBydSQV5uoUZ8PNe0
```

最初に説明したとおりに、「ユーザ名:パスワード」の形式で保存されていると思います。

ここで、複数ユーザを追加する時ですが、実はさっきのコマンドをそのまま打つと再度新しくファイルが作られて追記にならないことがわかりました・・・
なので、追記するときは下記のコマンドを実行
（自分の場合、これを見落としていて、一旦他のファイルに書き出してからコピペで追加作業をしておりました）

```
$ sudo htpasswd /etc/nginx/.htpasswd ユーザ名
```

ちなみに、-cオプションは、manコマンドでみてみるとこう書いてました。

```
-c     Create the passwdfile. If passwdfile already exists, it is rewritten and truncated. This option cannot be combined with the -n option.
```

要するに-cはCreateだからすでにあったら上書きされるよって書いてます。

複数ユーザを作る場合は、-cオプションを外して実行しましょう。
そうすると、下記のようにユーザが追加されます。

```
hoge:$apr1$1F44gU0L$Sm5kzGBydSQV5uoUZ8PNe0
fuga:$apr1$DMNE8ana$3OxcmtTmjDeyzsc1nURil1
```

## nginxで設定してみる

```
$ sudo vim /etc/nginx/conf.d/hoge.conf
```

```
server {
   auth_basic "basic auth";
   auth_basic_user_file /etc/nginx/.htpasswd;
}
```

server以下にこの2行を追加

```
$ sudo service nginx reload
```

これで反映されます。

複数ユーザを作れば、それぞれユーザ毎にログインが可能になります。

## まとめ

htpasswdのコマンド

- 初回のみ

```
$ sudo htpasswd -c /etc/nginx/.htpasswd ユーザ名
```

- ユーザを追記したい場合

```
$ sudo htpasswd /etc/nginx/.htpasswd ユーザ名
```

- nginxの設定

```
server {
   auth_basic "basic auth";
   auth_basic_user_file /etc/nginx/.htpasswd;
}
```
Xcode 8.3に移行したらnullabilityのワーニングが大量に出たときの対処方法


Xcode 8.3がリリースされたので早速移行してみました。すると、特定のプロジェクトで、nullabilityに関するワーニングが大量に表示されてしまいました。その対処方法です。

## ワーニングが出たプロジェクト
Macアプリ用のプロジェクトで、バイナリは32ビット、Deployment TargetがOS X 10.8以降のものです。コードは、Objective-C, C++などの混在です。

## ワーニング詳細
`CoreGraphics/CoreGraphics.h`や`Carbon/Carbon.h`をincludeすると、システムヘッダに対して警告が出ます。

例えば、`CoreGraphics/CGColorSpace.h`で、次のように出ます。

```
Array parameter is missing a nullability type specifier (_Nonull, _Nullability, or _Null_unspecified)
```

## 対処方法
自分で書いているヘッダならば、nullability関連の定義を追加するなどすれば良いのですが、システムヘッダなので変更できません。

動作環境などの条件も変更できないので、今回は、このワーニングを無効にして、表示しないようにしました。

無効にするには、ビルド設定の「Apple LLVM 8.1 - Custom Compiler Flags」の「Other Warning Flags」に「`-Wno-nullability-completeness`」を指定します。

![nullability.png](https://qiita-image-store.s3.amazonaws.com/0/28111/fab34c06-1577-56e3-590f-443157bb06d3.png "nullability.png")
Ubuntu16.04でマウスカーソルが表示されなくなる

# 問題
ある日突然Ubuntuのマウスカーソルが表示されなくなって困った。
表示されないだけでなく、適当に動かしてクリックしてみても反応しないのでカーソル自体がおかしくなってそう。

# 環境
- Xiaomi Air 13
- Ubuntu 16.04

# 対策
結論としては次の記事の通りに対処すると解決した。
(【解決】Ｕｂｕｎｔｕ１５．０４　消えてしまったマウスポインターを表示する http://open.mixi.jp/user/15421546/diary/1943247857)
### やったこと

```
$ sudo vim /usr/share/icons/default/index.theme 
```

これを

```
inherits=DMZ-white
```

こうする

```
# inherits=DMZ-white
inherits=whiteglass
```

そして再起動すると復旧しました。
おっけい。

カーソルのテーマを変更したというのは分かるのですが、なぜこのような現象が発生したのかまでは把握できていない状況で、腑に落ちないですが一旦決着ということでよろしくお願いします。

### 付記
`inherits=`に変更する(値をブランクにする)といい、という記事も散見されたのですが、自分の環境の場合だと問題は解決されませんでした。

### 付記の付記
カーソルをwhiteglassに変更した後に、UnityTweakToolを使ってDMZ-whiteやDMZ-blackに変更してみたのですが無事に動作したのでなんだかよくわからないです…
IPv4アドレスの xxx.xxx.xxx.xxx 形式ではない記法 (省略表記と誤解されることもありそうな)

# サマリ

ping 192.168.0.1 のつもりで、ping 192.168.1 と書いてしまっても意図通りに動き、192.168.0.1 = 192.168.1 と解釈される経験をした方も多いと思いますが、処理系（*BSD/macOS, Linux/glibc, Windowsなど）によってはIPv4アドレスの記法として

```
xxx.yyy.zzz.aaa (それぞれ 0〜255)
```

以外の表記を受け付ける。

記事のタイトルに省略記法と書いたが、正確にはクラスを意識した記法の名残で、短縮することを目的とした書き方ではない。また仕様で決められたものではなく実装依存。

以下 macOS 10.12, FreeBSD 11.0-RELEASE, Linux (Ubuntu 16.04)のglibc での動作。. (ドット)は必ずしも３つではなく、数値も10進数だけでなく16進数、8進数が混ぜて書けて、いくつか例を挙げると以下のようなものが許容される。

```
# ping 1 (0.0.0.1)
# ping 9999999999 (84.11.227.255)
# ping 0xFACEB00C (250.206.176.12)
# ping 10.65535 (10.0.255.255)
# ping 10.0xFF.0377 (10.0.255.255)
# ping 192.168.9999 (192.168.39.15)
```

# . (ドット) なし。32ビット符号なし整数をべた書き

```
a # aの範囲は 0〜4294967295, 0x0〜0xFFFFFFFF(16進), 00〜077777777777(8進)
```

下記の例がこのルールに該当

```
# ping 1 (0.0.0.1)
# ping 9999999999 (84.11.227.255)
# ping 0xFFFFFFFF (255.255.255.255)
```

また、FreeBSD 11.0-RELEASE, macOS (10.12)の実装だと、32ビットを超える数を書いた場合は、下位32ビットのみが有効。例えば、こんな文字列でも有効なIPv4アドレス 192.168.0.1 として受け付けてしまう (Windows 10, Ubuntu 16.04のglibcは不可でした)。

```
# ping 0xFACEB00C000025DE0000FFFFFFFFFFFFFFFFFFFFFFFF0000000000C0A80001
# ping 1000000000000000000000000000000000000000000000000000003232235521
```

# . (ドット) ひとつ。[8ビット符号なし整数].[24ビット符号なし整数]

クラスAのネットワーク部(8ビット) + ホスト部(24ビット)の表記を意図した記法

```
a.b # a: 0〜255, 0x0〜0xFF, 00〜0377 
    # b: 0〜16777215, 0x0〜0xFFFFFF, 00〜0377777777
```

例

```
10.65535 = 10.0.255.255
10.0xFFFFFF = 10.255.255.255
```

クラスを意識した記法とは書いたが a が128を超えても

```
172.16 = 172.0.0.16
```

と解釈される。


#  . (ドット) ２つ。[8ビット整数].[8ビット整数].[16ビット整数]

クラスBのネットワーク部(16ビット) + ホスト部(16ビット)の表記を意図した記法

```
a.b.c # a: 0〜255, 0x0〜0xFF, 00〜0377
      # b: 0〜255, 0x0〜0xFF, 00〜0377
      # c: 0〜65535, 0x0〜0xFFFF, 00〜0177777
```

例

```
172.16.1 = 172.16.0.1
192.168.256 = 192.168.1.0 (クラスCのアドレスでも可)
```


# IPv4アドレスを含むIPv6アドレス (射影アドレス, 互換アドレスなど)

わざわざ試すまでもないが、Windows 10, Ubuntu 16.04 (Linux/glibc), FreeBSD 11.0-RELEASE, macOS Sierra (10.12)、どの実装でも、inet_pton(), getaddrinfo() は省略表記を受け付けない。

```
NG ::ffff:10.1
NG ::ffff:0xFF.0xFF.0xFF.0xFF
NG ::127.1
NG ::10.0.0.0xFF
NG fe80::172.16.65530
```



# まとめ

この記法を使う場面はたぶん、もうないと思う。ちなみにガラケーの時代にはURL(ホスト名)の入力を簡単にするため、long IPと呼ばれる、ネットワークバイトオーダ32ビットべた書きの表記を使う人もいたようだが、もはや意味はない。

■窓の杜 NEWS 2004/07/07
URLを携帯電話で入力しやすい9～10桁の数字に変換できる「LongIPmaker」が公開
http://forest.watch.impress.co.jp/article/2004/07/07/longipmaker.html


# 参考文献

日本語の wikipedia の「IPアドレス」の項目にも詳しく書いてあります
[1] [https://ja.wikipedia.org/wiki/IPアドレス#表記](https://ja.wikipedia.org/wiki/IP%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9#.E8.A1.A8.E8.A8.98)
Go言語でRPMファイルを読む その１

# はじめに

日常業務（書類作ったり、メール見たり）する端末はWindows環境で、開発や保守作業をする環境はLinuxというのはよくある話ではないかと思う。

そして誰しも、どこかのサイトからダウンロードしたり、CentOSかRedHatのインストールメディアから取り出したり、あるいは自作したRPMファイルが自分の端末にあり、パッケージの内容を確認したい、と思ったことが一度はあるかと思う。

そんなときどうするかというと、

* 仮想環境にインストールしたRHEL上で確認する
* 開発環境なんかにscpして確認する

のどちらかでやっている人が多いだろう。

めんどくさい。
そもそも開発者側なら上記の手段をとれるだろうが、手元にTera Termなんかしか無い保守側の人間には、そういう上等な環境なんかない場合が多い。

## 趣旨（だからなんなのか）

昨今はランタイムのいらない（というと語弊があるかもしれないが）Go言語があるのだから、それを使ってrpmコマンドの代わりを作ろう

# RHEL以外で動くrpmコマンドライクなツール

最低限、パッケージの詳細情報とファイルリスト、パッケージの検証ぐらいはやりたい

* ```rpm -qip <package>```
パッケージ情報の表示

* ```rpm -qlp <package>```
パッケージ内部のファイルリストの表示

* ```rpm -qVp <package>```
パッケージの検証

## できあがったもの

* package rpmlib
RPMファイルを読んでデータを取得するためのライブラリ。
今のところパッケージからの読み込みのみで、一部の機能のみ対応。

* gorpm コマンド
パッケージ情報とファイルリストを表示するコマンド。

## インストール/利用方法

インストールは以下のような感じ

```bash
$ mkidr gorpm
$ cd gorpm
$ export GOROOT=<Your Go language tools path>
$ export GOPATH=${PWD}
$ go get github.com/necomeshi/gorpm
$ go install github.com/necomeshi/gorpm
```

使うとこんな感じ

```bash
$ gorpm -i rpm-4.8.0-55.el6.x86_64.rpm
Name:       rpm
Version:    4.8.0
Release:    55.el6
Group:      System Environment/Base
Size:       2034245
Licence:    GPLv2+
BuildDate:  2016-05-11 08:49:46 +0900 JST
Source RPM: rpm-4.8.0-55.el6.src.rpm
Summary:    The RPM package management system
Description:
 The RPM Package Manager (RPM) is a powerful command line driven
 package management system capable of installing, uninstalling,
 verifying, querying, and updating software packages. Each software
 package consists of an archive of files along with information about
 the package like its version, a description, etc.
```

現状はファイル情報を取得するための`-i`オプションと、ファイルリストを表示するための`-l`オプションのみ対応。いずれ色々増やしていきたい。

## 詰まりどころ
RPMファイルのファイルフォーマットについての資料が完成してないので、必要な情報を取ろうにも現状の実装を確認する必要があった。

たとえば、下の参考の資料が示すように、RPMファイルは以下のようなフォーマットになっている。

```
　　RPMファイル
+----------------+
| Lead           |　　　　各セクション内部の構造
+----------------+ -> +----------------------+
| Signature      |    | Header Recode        |
+----------------+    +----------------------+
| Header         |    | Array of Index Recode|
+----------------+    +----------------------+
| Payload        |    | Store of Index Value |
~                ~    +----------------------+

```

`Signature` には文字通りシグネチャとか検証用のチェックサムが入っており、`Header` にはパッケージの情報が格納されている。

`Signature` セクションと `Header` セクションは上図のように３つのセクションで構成され、 `Array of Index Recode` でデータのタイプ(タグ名：パッケージ名、ファイル名...etc)と型（int, string, ...etc)、 `Store of Index Value` 内のデータ格納位置のオフセットを示している。

で、このデータタイプ（タグ名）が資料には全部リストアップされてない。
ひどいときは意味すら書いてない箇所がある。どうも実装ファーストでやっているようだ。

# 今後
パッケージの検証はまだ実装できてないし、色々足りない部分があるので、機会を見て実装したい。コードの構成もイマイチなのでどこかの段階できれいにしたい

# 追記 2017-04-04
rpm2cpio互換コマンド、Changelog表示、ファイルのタイプ別表示機能を追加しました。

詳細については[Go言語でRPMファイルを読む その１.5](http://qiita.com/necomeshi/items/1a4635755e7d5ed48bf0)を御覧ください。


# 参考
* [Linux Standard Base Core Specification 3.0Preview1](http://refspecs.linuxbase.org/LSB_3.0.0/LSB-Core-generic/LSB-Core-generic/swinstall.html#AEN26339)
* [RPM File Format](http://ftp.rpm.org/max-rpm/s1-rpm-file-format-rpm-file-format.html)
How to write basic UnitTestsを発表した際の参考資料

MAMORIOさんの[GEEK GARAGE iOS vol2](https://geekgarage.connpass.com/event/51888/)でっ[How to write basic unittests](https://speakerdeck.com/koichitanaka/how-to-write-basic-unittests)を話す際に参考にした資料です。

# 参考資料
- [ソフトウェアテスト基本テクニック](http://gihyo.jp/dev/serial/01/tech_station/0001)
- [iOS Unit Testing articles | Quality Coding](http://qualitycoding.org/category/ios-unit-testing/)
- [ユニットテストにまつわる10の勘違い ｜ Developers.IO](http://dev.classmethod.jp/testing/10_errors_about_unit_testing)
- [ユニットテスト改善ガイド](http://dev.classmethod.jp/testing/unittesting/working-effectively-with-unit-testing/)
- [JUnit 実践講座 - シナリオベースのテストケースの書き方](http://objectclub.jp/community/memorial/homepage3.nifty.com/masarl/article/junit/scenario-based-testcase.html)
- [TddAntiPatterns - TDD のアンチパターン](http://www.hyuki.com/yukiwiki/wiki.cgi?TddAntiPatterns#i3)
- [Amazon.co.jp： xUnit Test Patterns: Refactoring Test Code (Addison-Wesley Signature Series (Fowler)): Gerard Meszaros: 洋書](https://www.amazon.co.jp/dp/0131495054/?tag=hatena_st1-22&ascsubtag=d-2rgxf)
- [第1回　連載を始めるにあたって：［動画で解説］和田卓人の“テスト駆動開発”講座｜gihyo.jp … 技術評論社](http://gihyo.jp/dev/serial/01/tdd/0001)
- [ユニットテスト改善ガイド ｜ Developers.IO](http://dev.classmethod.jp/testing/unittesting/working-effectively-with-unit-testing/)
- [TDDの車窓から](http://objectclub.jp/technicaldoc/testing/stack_tdd.pdf)  

# テスト支援のライブラリ  
- [GitHub - thellimist/SwiftRandom: A tiny generator of random data for swift](https://github.com/thellimist/SwiftRandom)
- [GitHub - vadymmarkov/Fakery: Swift fake data generator](https://github.com/vadymmarkov/Fakery)
- [GitHub - Quick/Quick: The Swift (and Objective-C) testing framework.] (https://github.com/Quick/Quick)
- [Github - Quick/Nimble A Matcher Framework for Swift and Objective-C](https://github.com/Quick/Nimble)
- [GitHub - joemasilotti/UI-Testing-Cheat-Sheet: How do I test this with UI Testing?](https://github.com/joemasilotti/UI-Testing-Cheat-Sheet#verifying-the-current-controllers-title)
PythonだけどPixieDust を使ってお手軽なVisualization 

## Python でもお手軽に視覚化

Python環境でグラフ書くのに、matplotlib&seabornで色々書くのもなかなか楽しい？けれども、PixieDustでお手軽に視覚化してみた。
( 以下、IBM Data Science Experience で使用）

``` python
from pixiedust.display import *
display (df_data_1)
```
こんなコードを入力しただけで、インタラクティブなグラフコンポーネントが表示されたw

### テーブル出力
<img width="1002" alt="Screen Shot 2017-03-28 at 20.16.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/149522/a7cc2319-4714-0266-704e-23dc2e071b56.png">

### ヒストグラム
日本語のラベルもスンナリw
<img width="950" alt="Screen Shot 2017-03-28 at 20.19.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/149522/2660523b-7e07-4c47-c704-58a7c18ef022.png">

### 円グラフ
<img width="760" alt="Screen Shot 2017-03-28 at 20.25.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/149522/d2704be2-a81c-c692-00c1-c8d49d370e43.png">

その他、Google Mapへのプロットもできるようなので、Brunel visualizationと一緒に今度試してみようと思うw

[参考リンク] http://datascience.ibm.com/docs/content/analyze-data/Home.html
GitとGithub

# Git・Githubって何？？
##Gitとは？？？
- ソースコードをはじめとするファイルの変更履歴のこと。
- 過去のファイルに戻ったり、変更履歴を管理できる！！！

##Githubとは？？
- gitをより簡単に便利に使いやすくしたwebサービスのことである。
- チームでの開発に便利な機能をつけたもの。

##Github開発フローについて
-GitHub社が実践している開発フロー。

###リポジトリ・・・ファイルの変更履歴を保管していく入れ物。
- ローカルリポジトリ・・・自分のPC上に置くリポジトリ。
- リモートリポジトリ・・・サーバ上に置くリポジトリ。

###コミット・・・ファイルの状態などを記録するもので変更を加えた人や日時も一緒に記録される。
geocoderが便利過ぎる！

作っているアプリケーションで住所から座標を使う必要があったので、メモ

今まではgoogle APIを使用して、住所から位置座標を特定して値をとっていたが
gem 'geocoder'を導入するとデータベース保存時に自動で入れてくれる。

# geocoderの導入

```ruby:Gemfile
gem 'geocoder'
```
あとはbundle install

# 座標データが欲しいmodelへの記述

```ruby:model.rb
geocoded_by :住所のカラム名
after_validation :geocode, if: :住所のカラム名_changed?
```
住所のカラム名には自身のモデルの住所が格納されているカラムを入れてください。
保存したいテーブルにはlatitude,longitudeカラムを作成することを忘れずに！！

# 実際の保存
住所のカラム名に住所を入れて保存を行えば、自動的にlatitude,longitudeカラムに保存される。
スゴイ！！！

# おまけ
```ruby:model.rb
reverse_geocoded_by :latitude, :longitude
after_validation :reverse_geocode
```
とすると逆に、座標情報保存時に住所を保存してくれる。
javascriptで利用できる正規表現パターンの基本(初心者向け)

# JavaScriptで利用できる正規表現の基本
| パターン | マッチする文字列  |
|:-----------------|:------------------|
| ABC          |  「ABC」という文字列  |  
| [ABC]        |    A,B,Cのいずれか1文字|   
| [^ABC]          |  A,B,C以外のいずれか1文字 |  
| [A-Z]            |    A~Zの間の1文字 |  

基本中の基本ですみません。上記に加え、量指定、文字セット等を用いて正規表現パターンを表現することができます。
次回は量指定について書こうと思います。
設定より規約について

##「設定より規約」
というプログラミングをする上で避けて通ることのできない言葉を知っているのでしょうか？

wikipediaには、このように説明されています。（引用）

>設定より規約（せっていよりきやく、英: convention over configuration）とは、開発者の決定すべきことを減少させ、単純にするが柔軟性は失わせないというソフトウェア設計パラダイム。
この言葉は本来、開発者が指定しなければならないのはアプリケーションの慣例に従わない点だけだ、ということを意味している。例えば、モデルの中に Sale というクラスがあれば、データベース中の対応する表の名前はデフォルトで sales である。この規約から逸脱したときだけ、例えばその表を "products_sold" という名前にした場合だけ、その名前を使ったコードを書く必要が生じる。
使用しているツールが実装した規約が開発者の望む動作と一致していれば、設定ファイルを書く必要もない。実装規約と望みの動作が違っている場合、必要な動作を設定しなければならない。


これだけで理解できない人のために、簡単な表現でいうと、

「基本、特に指定しなきゃデフォルトの設定で動きますよ。そのままで良いのであれば複雑で長い設定を書かなくていいですよ。デフォルトと差異をつけたいところを書いてください」

という感じです。

――――では、ここでいう規約とは何でしょうか？
　　実は、ある程度プログラミングを勉強してる人は必ず触れています。

例でいうと、「group」というテーブルを作ったときのテーブル名は**groups**という複数形になりますよね？**これが「規約」です。**

言語とかによっては規約よりも設定が多くなったり、そもそも規約が多すぎて困ってしまうということがあるかもしれませんが、基本はこの原則ということを頭に入れておきましょう。
JavaScriptの厳密な曖昧な比較

[PHP](https://qiita.com/rana_kualu/items/129b4210ce99e7f50d06) / [JavaScript](https://qiita.com/rana_kualu/items/2a12fc8b9bc1cd647ec5)


JavaScriptの等価演算子は`==`と`===`の2種類です。

`==`は値の比較だけ行い、`===`は値と型の両方を比較する、とよく言われますが、実は正しくありません。
正しくは、`===`は型と値の比較を行い、`==`は両方の型を揃えてから`===`で比較する、です。

この自動型変換、勝手に行われるうえに動作がアバウトでバグの温床だからやめろー`==`滅ぶべし慈悲はない、とかよく言われますが、実際はアバウトどころか厳密な定義に基づいて正確に動作しています。
きちんと理解して使えば強い味方となってくれるはずです。

詳細な定義がECMA2016の[7.2.13 Abstract Equality Comparison](http://www.ecma-international.org/ecma-262/7.0/index.html#sec-abstract-equality-comparison)にあったので見てみましょう。
以下は`==`および`===`を表す擬似コードです。
`===`を使って`===`を定義してるので正確なものではありませんが、まあイメージと思ってください。

```javascript
/**
* x == yの定義
* @param mixed x
* @param mixed y
* @return boolean x == y
*/
function ==(x, y){
	if(xの型 === yの型){
		return x === y;
	}
	if(x === null AND y === undefined){ return true; }
	if(x === undefined AND y === null){ return true; }
	
	if(xの型 === "number" AND yの型 === "string"){
		return x == ToNumber(y);
	}
	if(xの型 === "string" AND yの型 === "number"){
		return ToNumber(x) == y;
	}
	
	if(xの型 === "boolean"){
		return ToNumber(x) == y;
	}
	if(yの型 === "boolean"){
		return x == ToNumber(y);
	}
	
	if( (xの型 === "string" OR "number" ) AND yの型 === "object" ){
		return x == ToPrimitive(y);
	}
	if( xの型 === "object" AND (yの型 === "string" OR "number" ) ){
		return ToPrimitive(x) == y;
	}
	return false;
}

/**
* x === yの定義
* @param mixed x
* @param mixed y
* @return boolean x === y
*/
function ===(x, y){
	if(xの型 !== yの型){ return false; }
	
	if(xの型 === "number"){
		if(x === NaN){ return false; }
		if(y === NaN){ return false; }
		if(x === y){ return true; }
		
		if(x === +0 AND y === -0){ return true; }
		if(x === -0 AND y === +0){ return true; }
		return false;
	}
	
	return SameValueNonNumber(x, y);
}

/**
* number以外の型でx === yの定義
* @param mixed x
* @param mixed y
* @return boolean x === y
*/
function SameValueNonNumber(x, y){
	Assert(xの型 !== "number");
	Assert(xの型 === yの型);
	
	if(xの型 === "undefined"){ return true; }
	if(xの型 === "null"){ return true; }
	
	if(xの型 === "string"){
		if(xとyの長さ、文字列が同じ){ return true; }
		return false;
	}
	if(xの型 === "boolean"){
		if(x === y === true){ return true; }
		if(x === y === false){ return true; }
		return false;
	}
	if(xの型 === "symbol"){
		if(xとyが同じSymbolを参照している){ return true; }
		return false;
	}
	
	if(xとyが同じObjectを参照している){ return true; }
	return false;
}
```

見てのとおり、`==`は単なる`===`のラッパーです。

うん、やっぱりややこしいから`===`使おう。

疑似関数`の型`は概ねtypeofですが、より厳密で、特に`nullの型==="null"`が致命的に異なります。
ToNumberとToPrimitiveはJavaScriptの内部関数のようで、それぞれ数値型とプリミティブ型に変換してくれます。
が、[定義](http://www.ecma-international.org/ecma-262/7.0/index.html#sec-toprimitive)を見てみたら相当ややこしかったので見なかったことにしよう。