OmniAICreator/Qiita-1.07M huggingface dataset:
macOSで画面上の長さを一瞬で測る裏ワザ

画像やWebサイトの要素の幅、高さを測りたい時や、パソコンのスクリーン上の長さを測りたい時、どうしていますか？
macOSで特別なソフトを使用すること無く、画面上の長さを一瞬で測る裏ワザを紹介します。

使用するのは[macOSの一歩進んだ画面キャプチャテクニック](http://qiita.com/tonkotsuboy_com/items/f8e98697456a1d2a7ebe)で紹介した画面キャプチャー機能です。[command] + [shift] + [4] を同時押しすると、下記のようなアイコンが現れます。

![画面キャプチャー用アイコン](https://qiita-image-store.s3.amazonaws.com/0/67884/e1ebf3c3-27d8-e459-c9a9-42026823ef48.png)


この状態でマウスを押したまま動かし、マウスを離すことで画面キャプチャーが撮れるのですが、マウスを動かしている間にキャプチャーしようとしている画面の大きさが表示されます。これを使います。

手順は下記です。

1. [command] + [shift] + [4] を同時押し
2. マウスを押したまま、調べたい長さの部分で動かす
3. [esc]キーを押してキャンセル

![moment_length.gif](https://qiita-image-store.s3.amazonaws.com/0/67884/9964933b-2a01-b06a-58a7-d616ab4c032d.gif)


これで、画面キャプチャーを撮影すること無く、画面の長さだけを測ることができます。
iOSアプリから印刷させる（Swift2.1, XCode7.2）

Swiftでアプリから文書を印刷させるためのメモ

```
var s = ""
s += "<FONT color='#00ff00'><h1>hogeeeeeeeeeee</h1></FONT>"
s += "<br><br>"
s += "<font size='10' face='Osaka'><h2>piyooooooooooooooo<br>foooo</h2><br></font>"
s += "<font size='10' face='arial'><h2>piyooooooooooooooo<br>foooo</h2><br></font>"
s += "<strong>ほほほほほげ</strong>"
s += "<small>うぬぬぬぬ</small>"


let pi = UIPrintInfo(dictionary: nil)
pi.outputType = UIPrintInfoOutputType.General
pi.jobName = "print Job"
pi.orientation = UIPrintInfoOrientation.Portrait
pi.duplex = UIPrintInfoDuplex.LongEdge

let pic = UIPrintInteractionController.sharedPrintController()
pic.printInfo = pi

// markupText(HTMLファイル)印刷させる場合
let formatter = UIMarkupTextPrintFormatter(markupText: s)

// text(文字列)印刷させる場合
// let formatter = UISimpleTextPrintFormatter(text: s)
// formatter.font = UIFont.systemFontOfSize(CGFloat(20)) //フォントサイズ
// formatter.color = UIColor.blueColor() //フォントカラー

formatter.contentInsets = UIEdgeInsets(top: 20, left: 32, bottom: 32, right: 20) //余白

pic.printFormatter = formatter
pic.presentAnimated(true, completionHandler: nil)
```


markupText(HTML)で印刷した結果
<img width="350" alt="markupText.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/40894/311962f0-af14-7d2c-ca36-778bf5c9e1b0.jpeg">


text(文字列)で印刷した結果
<img width="350" alt="text.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/40894/0bbcb0a1-e95e-e6cb-dee8-152b35b11ed0.jpeg">
concrete5.7 テーマ（最少）を作ってみる。

# はじめに

concrete5 のテーマが動く、最少のファイルを作ってみます。

# 更新履歴

2016.02.05-1
`$a->display();` を `$a->display($c);` に変更しました。`$c` は、表示するページのオブジェクトです。
`Loader::element('footer_required');` が、`</body>` 直前になってなかった。

2016.02.05-2
`$a->display($c);` を `$a->display();` に戻しました。5.7 からは省略可能になったようです。


# テーマファイルの置き場所

```
/application/themes/
```

themes (シームスと読むそうです）フォルダ以下に、作りたいテーマの名前フォルダを作ります。

```
/application/themes/tm1
```

これで「tm1」という名前のテーマが存在していると認識されます。管理画面のテーマを選択すると、中身が何もないのに、「tm1」をインストールするか聞いてきます。

![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/1154/2e2dc734-267c-51e9-4099-00eb0c471cf4.jpeg)

中身がないので、サムネイルも名前も説明も何もなしです。

# default.php を作る

最低限、default.php があるとテーマが使えるようになるようなので、default.php を作ってみました。UTF-8 で保存しましょう。

```lang:application/themes/tm1/default.php
<?php
	// おまじない
	defined('C5_EXECUTE') or die("Access Denied.");
?>
<html>
<head>
<?php
	// concrete5 の動作に必要な、<head> タグ内コードを出力
	Loader::element('header_required');
?>
</head>
<body>
<!-- 編集時 concrete5 の上部メニューの表示で、コンテンツが隠れてしまうのを予防します -->
<div class="<?php echo $c->getPageWrapperClass()?>">
<?php
	// ブロックを置けるエリアを作成
	$a = new Area('Area1');
	$a->display();
	// エリアを複数作る場合は、Area(引数); の引数を変更して作成
	$a = new Area('Area2');
	$a->display();
?>
</div>
<?php
	// concrete5 の動作に必要な、<body> タグ内コードを出力 </body> 直前に置くのがお作法らしい
	Loader::element('footer_required');
?>
</body>
</html>
```

このコードで、Area1 / Area2 としてブロックが配置できるテンプレートが利用可能になりました。
管理画面で、サムネイルも名前も説明も何も表示されないというような状況もありますが、この記事のコードをとっかかりに、今後、解決していきたいと思います。

# 参考

[【完全保存版】 concrete5.6.x テーマスニペット集](http://ja.katzueno.com/2014/05/3104/)
テスト環境が複数ある時にAPIなどの向き先を自動で変更させるやり方（CodeIgniter編）

PCのテスト環境で、ドメインが以下のように複数あり、それぞれAPIもある場合、
www-test1.●●●.net　　⇒　　api-test1.●●●.net   に向かせたい
www-test2.●●●.net　　⇒　　api-test2.●●●.net   に向かせたい　
www-test3.●●●.net　　⇒　　api-test3.●●●.net   に向かせたい

CodeIgniterでは、
application/config/development/配下に
application_env.php
といファイルがあり、

そこで、以下のような記述で設定が可能です。

<pre>
$pattern ='/test[1-9]?/';
$match = array();
preg_match($pattern,$_SERVER["HTTP_HOST"],$match);
$test = $match[0];


$config['api_url'] = 'https://api-'.$test.'.●●●.net';
$config['pc_url'] = 'https://www-'.$test.'.●●●.net';
$config['sp_url'] = 'https://sp-'.$test.'.●●●.net';
</pre>

設定例やURLは仮です。
awk templates

非常に便利なLinuxコマンドawk の使い方　覚え書き　テンプレート

# 超基本：第n列目の取り出し
`awk '{print $3}' <file>　　# 3列目のみ標準出力`

パイプで渡すと便利。
`sort -k3n <file> | awk '{print $2,$4}' > col_2_4_sort.dat`
↑3列目の数字でソーティングした後、2列目と4列目の値をファイルcol_2_4_sort.datに出力する。

# もし5列目の値が1やったら、その行を出力する
`awk '{if($5==1){print $0}}' cluster.dat |less`
print $0　で行の全てを標準出力。
if文の書き方が、c言語とc++と同じで嬉しい。
ちなみに、c、c++のようにprintf文も使えるから、formatを指定して、出力できる。
tabとスペースとか、pasteでくっつけた後のファイルとかで、区切りがごちゃごちゃになっているものの体裁を整えるためにも使える。

# 5列目の値が1となるデータの、4列目の合計を取る
`awk 'BEGIN{m=0;} {if($5==4){m+=$4}} END{print m;}' <file>`
これは、いくつか省略して以下のようにも書ける
`awk ' {if($5==4){m+=$4}} END{print m}' <file>`
セミコロン;はc、c++と同様に、1つの命令文の終わりを意味する。
1つしか命令しないときセミコロン;は省略できる。
BEGINとENDを用いることで、awkの最初と最後に行う命令を記述することができる。
上記の場合、m=0と明示的に初期化しなくても、省略しても勝手に初期化してくれている。

# 奇数行　または　偶数行　のみ取り出す
`awk 'NR%2==0' <file>   # 偶数行取り出し`
`awk 'NR%2==1' <file>   # 奇数行取り出し`
NRという変数には、行数が格納されている。
したがって、行数を2で割ったやつの余りだけを見ればよい。
Engine Yardで、Custom Chefのuploadとapplyを同時にやる

### 概要

Engine Yardで、インフラをカスタマイズするときにつかえるChef、それをUpload/Applyするために使うコマンド、`$ey recipes upload` `$ey recipes apply` でも、uploadしたら、ほぼapplyしますよね。


### やり方

```
$ey recipes upload --apply
```

これで、upload後すぐに、applyを走らせてくれます。
nginx で転送設定をする方法

# 設定方法

`/etc/nginx/nginx.conf`ファイルにリダイレクトルールを書き込む。

SSLの場合は`/etc/nginx/conf.d/default-ssl.conf`ファイルに設定を書き込む。

## テンプレート

```
server {
    # いろいろ記述がある
    # 〜〜〜〜

    # このあたりに書き込む
    location ルール {
        return 301 転送先;
    }
}
```

## 具体例

具体的には次のような例となります。`http://example.com/hoge/`と`http://example.com/hoge/index.html`の２つのURLが存在するとFacebookやはてなブックマークの数値が分散するので転送設定をかけておくと吉。

```
server {
    # いろいろ記述がある
    # 〜〜〜〜

    # このあたりに書き込む
    location = /hoge/ {
        return 301 /hoge/index.html;
    }
}
```

これだと`index.html`ファイルのほうに転送され幸せになる。
C# リクエストしたXMLデータをクラスに取り込みたい

# C# リクエストしたXMLデータをクラスに取り込みたい

## 作ろうと思った理由
　APIからXMLを取得した際に、オブジェクトを指定して値を手軽に取りたかったから

## イメージ図
![URLRequest.png](https://qiita-image-store.s3.amazonaws.com/0/111261/ba81a4ae-2ea7-6a1a-194c-83daf541741b.png)

## XMLファイルとデータクラス
 簡単なサンプル用のxmlを作成する。

```xml:sample.xml
<?xml version="1.0" encoding="UTF-8"?>
<Root>
  <data>
    <id>01</id>
    <text>Hello!</text>
  </data>
</Root>
```

XMLの構造にあわせてデータクラスを作成する。
※このときクラスやメンバーをPublicにする必要がある。Seriallizerで読み込めないときは、Publicではないことを疑った方がいい

```csharp:SampleXMLData.cs
using System.Xml.Serialization;

namespace URLRequest
{
    [XmlRoot("Root")]
    public class SampleXMLData
    {
        [XmlElement("data")]
        public XMLData xmlData;
    }

    public class XMLData
    {
        [XmlElement("id")]
        public string id;

        [XmlElement("text")]
        public string text;
    }
}
```

## Seriallizer
 XMLの文字列をデータクラスに流し込む

```csharp:CustomXMLSeriallizer.cs
using System.IO;
using System.Xml.Serialization;

namespace URLRequest
{
    public static class CustomXMLSeriallizer
    {
        public static T LoadXmlDataString<T>(string xmltext) where T : class
        {
            XmlSerializer serializer =new XmlSerializer(typeof(T));
            StringReader reader = new StringReader(xmltext);
            T loadAry = (T)serializer.Deserialize(reader);
            reader.Close();
            return loadAry;
        }
    }
}
```

## メイン

```csharp:Program.cs
using System;
using System.IO;
using System.Net;
using System.Text;

namespace URLRequest
{
    class Program
    {
        static void Main(string[] args)
        {
            Encoding enc = Encoding.GetEncoding("UTF-8");
            string url = "http://127.0.0.1/sandbox/sample/xml/sample.xml";

            WebRequest req = WebRequest.Create(url);
            WebResponse res = req.GetResponse();

            Stream st = res.GetResponseStream();
            StreamReader sr = new StreamReader(st, enc);
            string xml = sr.ReadToEnd();
            sr.Close();
            st.Close();

            Console.WriteLine(xml);

            SampleXMLData xmlDatas = CustomXMLSeriallizer.LoadXmlDataString<SampleXMLData>(xml);

            Console.WriteLine("--------");
            Console.WriteLine("id  :" + xmlDatas.xmlData.id);
            Console.WriteLine("text:" + xmlDatas.xmlData.text);
            Console.WriteLine("--------");
            Console.ReadKey();
        }
    }
}
```

## 結果
![ResultConsole.png](https://qiita-image-store.s3.amazonaws.com/0/111261/6828907e-b529-ec4f-70ca-8183448d6558.png)
ansible で prompt (入力待ち) の実現とその周辺テクニックのまとめ

概要
======

ansible でキー入力待ちを実現するには [pause](http://docs.ansible.com/ansible/pause_module.html) というモジュールを使います。
いろいろなサンプルをまとめてみました。

◆「Enterキーを押してください」
=============================

```yaml:tasks
- name: confirm
  pause: prompt="Enterキーを押してください"
```

```text:nameがあることで下記の出力にできる
TASK: [confirm] ***********************************
[webservers]
Enterキーを押してください:
```

##### ちょいテク: 出力を汚さないために `name` を使う:

```text:nameがない場合はちょっと出力がカッコ悪い
TASK: [pause prompt="Enterキーを押してください"] ****
[webservers]
Enterキーを押してください:
```

```text:nameがあれば
TASK: [confirm] ***********************************
[webservers]
Enterキーを押してください:
```

◆ y/nで確認
=============

```yaml:tasks
- name: confirm
  pause: prompt="このまま進めて良いですか？ (y/n)"
  register: yn

- name: abort
  fail: msg="Aborted!!"
  when: yn.user_input != 'y'
  run_once: true
```

##### ちょいテク: 条件付きで強制終了するなら `when` + `fail`

##### ちょいテク: `run_once: true` でホストが複数でも１度しか実行しない。

- `pause` は性質上もともと１回しか動かないので `run_once: true` は不要。つけても害はないが。



◆ 何かを入力させる
===================

```yaml:tasks
- name: branch
  pause:
    prompt: "branch 名 もしくは リリース tag を指定してください [develop]"
  register: branch_input

- name: set branch
  set_fact:
    branch_name: "{{ branch_input.user_input | default('develop', true) }}"
```

```text:表示イメージ
TASK: [branch] *****************************************
[127.0.0.1]
branch 名 もしくは リリース tag を指定してください [develop]:
ここで入力
ok: [127.0.0.1]

TASK: [set branch] *************************************
ok: [127.0.0.1]
```

##### ちょいテク: `.user_input` で入力された内容を取れる。

- 末尾の改行は含まれない。
- 何も入力せずに Enter おされたら `""` が入る。

##### ちょいテク: `default()` でデフォルトを指定できる

- 第１引数でデフォルト値を指定する。
- 第２引数を `true` にすることで、（未定義だけでなく）空欄も default の対象にできる。

##### ちょいテク: [set_fact](http://docs.ansible.com/ansible/set_fact_module.html) で変数への代入ができる


◆ `vars_prompt` でも入力させることができる
=========================================

```yaml:playbook
- hosts: 127.0.0.1
  vars_prompt:
    - name: "branch_name"
      prompt: "リリース tag もしくは branch 名を指定してください"
      default: develop
      private: no
```

```text:表示イメージ
[ansibleadm@localhost playbooks]$ ansible-playbook -i hosts xxxx.yml
リリース tag もしくは branch 名を指定してください [develop]:
```

##### この方法の良い所:

- デフォルト機能が備わっている
- パスワードの場合の文字が見えない入力機能(`private: yes`)が備わっている
- 冒頭で訊いてくれるので task の出力を汚さない

##### この方法の問題点:

- デフォルトに変数(`{{ default_branch }}` 等)を使えない（変数展開されずそのまま使われてしまう）
- role 化できない


おまけ1：hosts が複数サーバだった場合どうなるか
=============================================

全サーバで１度しかプロンプトはでません。


おまけ2：promptで改行する方法
=============================================

```yaml:改行されない
  pause: prompt="aaa\nbbb"
```

上記では改行されないが、下記なら改行されます:

```yaml:改行される1
  pause:
    prompt: "aaa\nbbb"
```
もしくは

```yaml:改行される2
  pause: prompt="{{"aaa\nbbb"}}"
```
browserify+babel+ReactでES2015を利用したコードを変換する

公式サイトの [チュートリアル](https://facebook.github.io/react/docs/getting-started.html) 読みながらReactをいじっていてES2015を利用したコードを変換する方法がよく分からなかったのでメモ

`npm install babel-preset-es2015`でbabelのpresetを追加し、browserifyのbabelifyで指定する項目にes2015を追加する。

```
browserify -t [ babelify --presets [ react es2015 ] ] src\main.jsx -o bundle.js
```
Mac OS Xでたまに生成されるThumbs.dbとは

`Thumbs.db`はWindows用ファイルで、画像ファイルのサムネイルを高速で読み込むためのキャッシュです。

Windowsユーザーから画像入りのフォルダを受け取った際などに`Thumbs.db`がでてきます。
ETag等の比較で更新をチェックしてリソースを取得したい（injectで書く）

『[ETag等の比較で更新をチェックしてリソースを取得したい](http://qiita.com/hadzimme/items/57c79731b3f5b5471d74)』を`inject`メソッドで書き直した。依然としてモヤモヤは晴れないけども。

```rb
require "logger"
require "open-uri"

$logger = Logger.new($stderr)
$logger.level = Logger::DEBUG

class Crawler
  def initialize(interval)
    @interval = interval
  end

  def start
    loop.inject("") do |etag|
      connection = Connection.new(@interval, etag)
      yield response = connection.start
      sleep @interval
      response.meta["etag"]
    end
    self
  end
end

class Connection
  ENDPOINT = URI("https://example.com/index.rss")
  OPTION = {
    read_timeout: 5,
  }

  def initialize(interval, etag = "")
    @interval = interval
    @etag = etag
  end

  def start
    open(ENDPOINT, OPTION.merge("If-None-Match" => @etag))
  rescue OpenURI::HTTPError
    sleep @interval
    retry
  rescue => e
    $logger.warn("%s: %s" % [e.class, e.message])
    sleep @interval
    retry
  end
end

c = Crawler.new(3)

c.start do |response|
  $logger.info(response.meta["etag"])
end
```
JAVA HTML

Javaしか勉強していなかったので、
20歳の時パソコンスクールで習ったhtmlをメモ
Javaやってるからhtmlわからん

<font color="ff0000"> 

```html
<head> ~ </head>
```

~の間には、文書のタイトル等のヘッダ情報を記述します。

![eltstree.gif](https://qiita-image-store.s3.amazonaws.com/0/95187/51c21de1-973b-1113-879e-1da94d86c873.gif)
Check! jQuery ですでに登録されているイベントを取得し、割込ませたりするメモ

こんにちは、[cloudpack][] の @dz_ こと[大平かづみ][]です。

Prologue - はじめに
====
javascript, jQuery を使って作られた既存のイベント処理に対して、なんとかして追加の処理をかませたい！と必死に模索したメモです。

サンプル
====

サンプルとして、クリックイベントに処理を割り込ませるコードを書きました。なお、一例ですので、参考にする際は自己責任でお願いいたします。m(_ _)m

サンプルコード
----

```html:サンプル.html
<form>
    <input type="text" id="message">
    <button id="submit">Show</button>
</form>
```

```js:サンプル.js
$(function() {
  // 元のクリックイベントを設定する
  $('#submit').on('click', function() {
    alert('Message is ' + $('#message').val());
  });
  
  // クリックイベントに設定されたハンドラを取得する
  var events = $._data($('#submit').get(0), "events");
  var originalHandler = events.click[0].handler;

  // 元のクリックイベントを外す
  $('#submit').off('click', originalHandler);
  
  // クリックイベントに、別のハンドラを設定し、引数として元のハンドラを渡す
  $('#submit').on('click', {next: originalHandler}, function(event) {
    // 処理例: ダイアログの返り値によって、元のイベントを実行する
    if (confirm('This is INTERRUPT!\nRun next handler?')) {
        event.data.next();
        }
  });
})
```

解説
----

### 登録されているイベントハンドラを取得する
`$._data(セレクタ, "events")` でセレクタに設定されているイベントが取得できます。

イベントのハンドラ（関数）を取得するには、クリックイベントの場合は、上記の `events.click[0].handler` のように取得できます。また、他のイベント、例えばフォーカスイベントのハンドラを取得したい場合は、 `events.focus[0].handler` で取得できます。

### イベントの付け外し
クリックイベントを外す場合は、 `off('click', 外したいハンドラ関数)` です。また、クリックイベントを設定する場合は、 `on('click', 設定したいハンドラ関数)` です。

### 元の関数も実行したい場合
`.on(events [, selector ] [, data ], handler)` の引数 data として配列を指定すると、イベントハンドラの関数の中で利用することができます。これを利用して、元の関数を渡して処理を引き継がせることもできました。

デモ
----
上記について、簡単なデモをこちらに用意しました。
http://codepen.io/dzeyelid/pres/bExomw

備考
====
- `on()`/`off()` を `bind()`/`unbind()` に入れ替えても動作します。jQuery 1.7 以降は `on()`/`off()` 、それ以前は `bind()`/`unbind()` を使うようです。

- 上記の `click` は、 `focus` などの他のイベントでも同様に使えるようです。

Epilogue - おわりに
====
以上、ちょっとゴリ押しな処理かもしれませんが、ちょっとした機能追加や修正の際に役立つかもしれません。


[cloudpack]:https://cloudpack.jp/ "cloudpack（クラウドパック） AWSクラウドの導入設計、構築、運用保守サービス"
[大平かづみ]:http://blog.cloudpack.jp/author/oohira/ "大平かづみの記事一覧"
Redmine + gitolite連携

# 環境

* CentOS7
* Apache/2.4.6
* Ruby 2.0.0
* Redmine 3.2.0
* Git 1.8.3.1

gitoliteをインストールしたユーザ 「git」
gitoliteのインストールディレクトリ 「/home/git」
連携するリポジトリ 「hoge」
Apacheの実行ユーザ 「apache」

# 方針
RedmineからはapacheユーザでGitを参照するので、gitグループに追加します。
リポジトリのミラーを作って参照できるようにパーミッションを調整をします。
pushが反映されるようにフックを作成します。

# 手順

## apacheをgitグループに追加
```sh:
sudo usermod -G git apache
```

## gitoliteのumask調整
```diff:.gitolite.rc
21c21
<     UMASK                           =>  0077,
---
>     UMASK                           =>  0027,
```

## リポジトリのミラー
```
sudo -u git mkdir -p /var/lib/redmine/repositories
sudo chown git:git /var/lib/redmine/repositories

cd /var/lib/redmine/repositories/
sudo -u git git clone --mirror /home/git/repositories/hoge.git
```

## pushをミラーに反映するようにフックを作成
```vim:/home/git/repositories/hoge.git/hooks/post-receive
#!/bin/sh
/usr/bin/git push --mirror /var/lib/redmine/repositories/hoge.git
```
```sh:
chmod 700 /home/git/repositories/hoge.git/hooks/post-receive
```

### Redmineのデバックログ出力
上手く行かない時は、Redmineのデバックログを出力すると手助けになります。

```rb:/&lt;redmine_dirname&gt;/config/additional_environment.rb
config.log_level = :debug
```

編集して、Apacheを再起動します。
ログは、 /&lt;redmine_dirname&gt;/log/production.log に出力されます。
main thread で動作させる話

Main Thread で動作させたいコードなどが時々あります。 `UITableView` の `reloadData()` などは、場合によって、autolayout を background thread でやるなみたいなメッセージをもらったり、Core Data や OpenGL のように やっぱりちゃんと main thread で呼び出したい場合などが考えられます。

もっともオーソドックスなやり方は、以下のような書き方かもしれません。

```.swift
dispatch_async(dispatch_get_main_queue()) { () -> Void in
	self.tableView.reloadData()
}
```

さてしかし、処理の順番などなんらかの都合で、`dispatch_sync()` を使いたい時は、こんなコードを書きたいと一瞬思うかもしれませんが、これを、main thread から呼び出してはいけません。

```.swift
doStep1()  // 時間のかかる処理等
dispatch_sync(dispatch_get_main_queue()) { () -> Void in
	doStep2()  // step1 の結果を保存・表示する場合に main thread が必要な場合
}
doStep3()  // 後始末等
```

ならば、`NSThread.isMainThread()` で main thread かどうか、判定すればいいと思うかもしれませんが、同じコードを二回書かなくてはなりません。

```.swift
if NSThread.isMainThread() {
	// your code
}
else {
	dispatch_sync(dispatch_get_main_queue()) { () -> Void in
		// your code
	}
}
```

で、技巧的に走って

```.swift
let yourCode: () -> Void = {
	// your code
}

if NSThread.isMainThread() {
	yourCode()
}
else {
	dispatch_sync(dispatch_get_main_queue()) { () -> Void in
		yourCode()
	}
}
```

と書くこともできますが、似たような処理の都度何度もこんな書き方をするのは面倒で、なおかつ可読性が落ちます。そこで、より使いかってを考えれば、そもそも引数としてコードを渡せるので、同期用と非同期用の二種類の関数を用意すれば便利になりそうです。

```dispatch_sync_main.swift
func dispatch_sync_main(block: () -> Void) {
	if NSThread.isMainThread() {
		block()
	}
	else {
		dispatch_sync(dispatch_get_main_queue()) { () -> Void in
			block()
		}
	}
}
```

```dispatch_async_main.swift
func dispatch_async_main(block: () -> Void) {
	dispatch_async(dispatch_get_main_queue()) { () -> Void in
		block()
	}
}
```

こんな感じで、使いかってがよくなると思います。

```.swift
	doStep1()
	dispatch_sync_main() {
		doStep2()
	}
	doStep3()
```

```
	dispatch_async_main() {
		self.tableView.reloadData()
	}
```

ネーミングが本物のGCDとまぎわらしいと思う場合は、`_` をつけるなり、他の名前をつけるなり工夫しましょう。
[Laravel]レスポンスをJSON形式で返す方法2つ

# LaravelではレスポンスをJSON形式で返す方法2つある

## response()->json()
まずは公式ドキュメント（5.1LTS）に記載されている方法。

> jsonメソッドは自動的にContent-Typeヘッダーをapplication/jsonにセットし、同時に指定された配列をjson_encode PHP関数によりJSONへ変換します。

```php
public function index()
{
    return response()->json(['apple' => 'red', 'peach' => 'pink']);
}
```

これにより

```json
{
    'apple':'red',
    'peach':'pink'
}
```

がレスポンスされる。
ドキュメントになるとおり、
`Content-Type`もちゃんと`application/json`にしてくれる。

## 配列をreturnする
そして、もう1つの方法。
例えばこんなコードがあるじゃろ。

```php
public function index()
{
    return ['apple' => 'red', 'peach' => 'pink'];
}
```

んでレスポンスは、、、

```json
{
    'apple':'red',
    'peach':'pink'
}
```

こうなる。
加えて`Content-Type`もちゃんと`application/json`にしてくれる。

## まとめ
JSON形式で返す時は「配列をreturnする」方法にしてます。
Laravelってこうゆう事ができるからやめられない、止まらない。
今日のvim: ちょっとだけ手数の少ない置換


## お題
文字列を置換したい。
いつもの

```
:%s/before/after/g
```

の応用です。


## やりかた

```example``` を ```hogefoobar``` に置換したい。


```
web0.example.com
web1.example.com
web2.example.com
web3.example.com
web4.example.com
web5.example.com
web6.example.com
web7.example.com
web8.example.com
web9.example.com
```

置換したい文字列上（今回は ```example```）にカーソルをのせた状態で


```
*:%s//hogefoobar/g
```

で、ターン。

```
web0.hogefoobar.com
web1.hogefoobar.com
web2.hogefoobar.com
web3.hogefoobar.com
web4.hogefoobar.com
web5.hogefoobar.com
web6.hogefoobar.com
web7.hogefoobar.com
web8.hogefoobar.com
web9.hogefoobar.com
```

ポイントは ```*``` で検索した文字が自動的に ```before ``` のところに入ってるって(とこ。|、ことなのか？)
SublimeText | 検索モードで正規表現のオン/オフを切り替えるショートカット

`Command + F` で検索窓を開く。
`Command + Alt + R` で切り替え。

これで正規表現が有効になる。(既に有効の場合は無効になる)

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/fe5ed7e1-ae5b-14f8-801a-b251b75ff425.png)

よく忘れるのでメモ。


# 環境

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/6dc308a0-6d18-f4d2-0c0d-154b284a7204.png)

- Mac OS X 



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
GrWinをVisualStudio2015で使う

#①GrWinのインストール
[GrWin公式](http://spdg1.sci.shizuoka.ac.jp/grwinlib/)
まずはGrWinをPCにインストールする
1.1.0のインストーラは動かなかったので、1.0.0を使う
下の方にある
**`MS VC++ & f2c`**
をDLしてインストール

#②Visutal Studioの設定
**`Platform Toolset`** の設定を **`v110`** にしないと、リンカが`_sprintf`が無いなどとエラーを吐くので、
Visual Studio 2012のライブラリ等をインストールする
VS2015をインストールする際、全部インストールしていれば多分問題ないが、
VS2015のインストーラを起動して、
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/112111/028cda96-df08-ce47-9ce5-150bc6c330e8.png)
「ツールとWindows SDK」にチェックが入っていなければ、チェックを入れてインストールする
これで、v110に必要なライブラリなどがごっそり手に入る

あとはプロパティで、

[構成プロパティ]→[全般]→[プラットフォーム ツールセット]に
**`v110`**と書いて（リスト上にはないはず）、

[リンカ]→[全般]→[追加のライブラリディレクトリ]に
「C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib」を追加する
（これを設定しないと、`gdi32.lib`が無いとエラーを吐く）

[リンカ]→[入力]→[追加の依存ファイル]に
`GrWin.lib`を追加


これで、リンクエラーは出なくなるはず
これでもうまく行かなかったら
[Visual Studio 2015のDLサイト](https://www.visualstudio.com/ja-jp/downloads/download-visual-studio-vs.aspx)
から「Visual Studio 2012 Update 5」をインストールしてみよう
JAVAリクエストパラメータを取得するサーブレットクラス


```java
package model;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//P142 リクエストパラメータを取得するサーブレットクラス
@WebServlet("/EmployeeRequest")
public class EmployeeRequest extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");

		String name = request.getParameter("name");
		String gender = request.getParameter("gender");
		String address = request.getParameter("address");
		String age = request.getParameter("age");

	}

}
```

<FONT color="#ff0000">▪️protected</font>
自分と同じパッケージに属するか、自分を継承した子クラス。

<FONT color="#ff0000">▪️HttpServletRequest</font>
このインターフェイスの目的の1つは、入力フォームで
入力された値を取得すること。
HTTP Servlet のためのリクエスト情報を与えるために ServletRequest インタフェースを拡張します。
Servlet コンテナは HttpServletRequest オブジェクトを生成し、Servlet のサービスメソッド (doGet、doPost 等) に引数で渡します。

<FONT color="#ff0000">▪️HttpServletResponse</font>
レスポンスの送信に関して HTTP 独自の機能性を与えるために ServletResponse インタフェースを拡張します。 例えば、HTTP ヘッダや Cookie にアクセスするためのメソッドを持ちます。


<font color="#ff0000">▪️ServletResponse</font>
Servlet がクライアントに送り返すレスポンスをラップするオブジェクトを定義している。 ServletResponse 型のオブジェクトを Servlet コンテナが生成し、service メソッドの引数で Servlet に渡している。

<font color="ff0000">▪️getParameter</font>
リクエストパラメーターの取得

<font color="ff0000">▪️リクエストパラメーター</font>
例)name=港&age=23&address=東京都◯◯区
リクエストパラメーター→name=港

<font color="ff0000">▪️setCharacterEncoding</font>
リクエストパラメータの文字コードを指定。
リクエストデータの文字コード（Windows-31J、SJIS、EUCなど）をセットする。

<font color="ff0000">▪️protected void doPost(HttpServletRequest request, HttpServletResponse response)</font>
ServletにPOSTリクエストを処理可能にさせるために、
(serviceメソッド経由で)サーバーによって呼び出される

<font color="ff0000">▪️ServletException</font>
このクラスでは、処理中に問題が起こったときに、Servlet がスローする可能性のある一般的な例外を定義しています。

<font color="ff0000">▪️IOException</font>
なんらかの入出力例外の発生を通知するシグナルを発生させます。このクラスは、入出力処理の失敗、または割り込みの発生によって生成される例外の汎用クラスです。

![スクリーンショット 2016-02-04 15.52.17.png](https://qiita-image-store.s3.amazonaws.com/0/95187/edcba69d-8e0c-ba9d-3c4c-39908f73bbfe.png)

[引用したサイト](http://www.javaroad.jp/servletjsp/sj_servlet1.htm)
Windows 64ビット版向けアプリケーションを設計・開発・運用しようとするときにハマらないための留意事項

サーバOSでは Windows Server 2008 R2 以降は64ビット版のみ、クライアント用OSでも Windows10 がリリースされ、メモリが潤沢に搭載されるようになった昨今、業務用ではまだまだ Windows7 が多いものの、64ビット版で利用することも多くなりました。
32bit版 OS 上で開発・テストを行ってOKであったので、64bit版 OS にセットアップ・運用をしようとすると...

- EXE・DLLが見つからないで異常終了
- 行った設定が表示されないでエラー

などの不具合に見合されることがあります。運用設計時、次の内容を確認しておくことをおすすめします。
##Microsoft Office を利用するか？
Excel、Word、Access などは、一般的に 32bit で動いています。マクロからCOMを呼び出す場合などには、アーキテクチャ (32bit? 64bit?) 関連が一致していることを確認します。
##ODBCドライバを利用するか？
ODBCドライバ、DBクライアント、利用するアプリケーション、おのおののアーキテクチャ (32bit? 64bit?) が一致していることが必要です（64bit版OS では、ODBCデータソースを登録するツール (adbcad32.exe) は32bit用（%systemroot%￥SysWow64 内）と64bit用と両方用意されています）
###Excel・Access(mdb) 用の 64ビットドライバ
Microsoft Excel や Access となじみ深いドライバ "Microsoft.JET.OLEDB.4.0" は 32ビット用のみですが、これの 64ビット版的な "Microsoft.ACE.OLEDB.12.0" なるものが用意されているそうです。

- [ﾌﾟﾗﾌﾟﾗ式技術系 Access流!【SQLServer】32bitOfficeが入っている環境に64bitACEOLEDBプロバイダを導入できる？](http://plus-sys.jugem.jp/?eid=430)
- [ﾌﾟﾗﾌﾟﾗ式技術系 Access流!【SQLServer】（自己責任で）32bitOffice環境で64bitMicrosoft.ACE.OLEDB.12.0プロバイダを導入する方法。](http://plus-sys.jugem.jp/?eid=446)
- [もりもりゲームブログ ついに、64bit版 SQL-Server 2008 Expressにおいて、Excelワークシートを直接テーブルとして読み込む事が出来るようになりましたぁ!!](http://morimorigameblogg.blogspot.jp/2010/05/64bitwindows764bit-sql-server-2008.html)

---
適宜、書き加えます...

各リンク先の皆様に感謝申し上げます！
herokuでdocker使うときに躓いたポイント

docker使ってherokuにでぷろーいしようとして詰まったところを備忘録る

# 起きてた問題
```bash
heroku docker:init
```
して、Dockerfileを色々書いてローカルでは正しく動いてたのにheroku上ではコケた！

コンソールを見ると、apt-get installしといたはずの子が見つからないと言う…

# 解決方法
インストール先は**/app**以下にする。

そう、それだけ。


# 問題のポイント
これは、herokuの仕様によるものでした。
dockerだからと言って、好き勝手に環境いじり倒せるかと言ったらそういう訳じゃなかったそうです。

詳しくは、公式の[ドキュメント](https://devcenter.heroku.com/articles/docker#modifying-the-dockerfile)を見ると良いのですが重要なポイントを掻い摘むと…

> Modifying the Dockerfile
> This is because the slugs created from the Docker container must conform to the Heroku slug format:
FROM heroku:cedar:14
changes localized to the /app directory

つまり、heroku/cedar/14のイメージを使って、**環境に変更を加える様な事をするときは
/app**以下でやってね！
ということでした。
ということは、状況はheroku & gitの開発の時と同じ感じということか…

ということで、/app/binと/app/source
みたいにディレクトリ切って、/app/binに独自に導入したいものを置くのが良さそう。

apt-getは/usr/binにインストールしちゃうので、欲しい子たちはソースからビルドする事にする。
Java 任意の場所にpropertiesファイルを配置

## はじめに
propertiesファイルを配置する際、
Webアプリケーションでは以下のような事例が多いかもしれません。

```
コンテキストパス/WEB-INF/classes/foo.properties
```

テスト環境、本番環境で内容の異なるpropertiesファイルを配置したい場合、上記の例では何かと面倒が増えます。
jarファイルで配置する際にはテスト用と本番用とでjarファイルを作り直す必要がありますし...。

こういったケースではアプリケーション配布時にpropertiesファイルを含めないようにし、
任意の場所(＝クラスパス外)に配置したpropertiesファイルを読み込むようにして解決しています。

事前に準備する外部ライブラリ等はありません。

読み込むpropertiesは以下のファイルを使います。

```properties:/var/taro/conf/foo.properties
key1=value1
key2=value2
key3=value3
```

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。

```java:ResourceBundleTest.java
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Enumeration;
import java.util.Locale;
import java.util.ResourceBundle;

/**
 *
 * @author tool-taro.com
 */
public class ResourceBundleTest {

	public static void main(String[] args) throws MalformedURLException {

		//propertiesファイル配置ディレクトリ
		String dir = "/var/taro/conf";
		//propertiesファイル名(.propertiesは不要)
		String source = "foo";

		//取得処理
		URLClassLoader urlLoader = new URLClassLoader(new URL[]{new File(dir).toURI().toURL()});
		ResourceBundle bundle = ResourceBundle.getBundle(source, Locale.getDefault(), urlLoader);
		Enumeration keys = bundle.getKeys();
		String key, value;
		while (keys.hasMoreElements()) {
			key = (String) keys.nextElement();
			value = bundle.getString(key);
			if (value != null) {
				//標準出力
				System.out.format("%1$s=%2$s\n", key, value);
			}
		}
	}
}
```

## 動作確認

```
$ javac ResourceBundleTest.java
$ java ResourceBundleTest
$ key1=value1
key2=value2
key3=value3
```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

Webツールも公開しています。
[Web便利ツール@ツールタロウ](http://tool-taro.com/)
JSTileMapでtextureimageが読み込めない

RPGのゲームを作るためにJSTileMapを使おうとしてハマったのでメモ

# JSTileMapとは
tmx形式のマップデータを読み込むライブラリ
[Github/JSTileMap](https://github.com/slycrel/JSTileMap)

# マップデータが読み込めない？
TileMapEditorなるフリーソフトを使い、JSTileMapのライブラリでtmx形式のマップデータを読み込む。

```
import Foundation
import SpriteKit

class StartScene:SKScene {
    var tileMap = JSTileMap(named: "~~~.tmx")
    
    override func didMoveToView(view: SKView) {
        
        self.anchorPoint = CGPoint(x: 0, y: 0)
        tileMap.position = CGPoint(x: 0, y: 0)
        self.addChild(tileMap)
    }
}
```
実行。

**SKTexture: Error loading image resource: ファイルパス**

ん？
リファレンスを良く見るとtmxファイルとtexture画像は同じディレクトリに置かなければならない模様。なるほど。tmxファイルとtexture画像を同じディレクトリにおいて再度実行

**EXC_BAD_ACCESS**

なぬ！？なぜだ。。
いろいろ調べて見るも原因がわからない・・・
あ、そうだ！Githubのサンプルデータをとってこよう。
ということで[Github/JSTileMap](https://github.com/slycrel/JSTileMap)から一番最新のtmxファイルと画像データを取り込んで実行。表示された！
自分で作ったtmxファイルとの差分を見てみると、どうやら**layerのencodingをbase64でやらなければならない**模様。自分はcsvでしていました。
さっそくencodingをcsvからbase64にかえたところ・・・・
できた！！

解決するのに時間がかかったのでメモ。
OpenMPIのインストール


OpenMPIの特徴
---
インストールして、簡単なプログラムを実行しただけなのですが、以下の特徴がある。
１．MPI-2に対応
２．あらかじめ各hostでdaemonを起動させておく必要がない
３．32/64 bit環境に対応
４．CentOS5のbaggageに含まれており、OSインストール時に一緒にインストール可能

インストール手順
---
１．OpenMPIのページからソースコード(openmpi-1.10.2.tar.bz2)をダウンロード。2016年2月時点ではVersion1.10.2でした
https://www.open-mpi.org/software/ompi/v1.10/

２．圧縮されているので解凍
*** tar xjvf openmpi-1.10.2.tar.bz2***

３．./configureを実行
***cd /home/liu/openmpi/***
***./configure --prefix=/home/liu/openmpi***

４． コンパイル
***make***

5．インストール
***make install***
opacity: 0; と visibility: hidden;のJavaScriptにおける微妙な違い

opacity: 0;とvisibility: hidden;ですが双方共に下記の動作をします。
・見た目上は見えない
・display: none;とは異なり、幅/高さは保持しており要素自体が存在している。

**ただし、JavaScriptのイベントが発火するかしないかという違いがあります。**

# opacity: 0;
イベントが発火します。

# visibility: hidden;
イベントが発火しません。

# サンプル
https://jsfiddle.net/vey2gvs1/1/

# まとめ
稀にこの2つの特性を活かした実装が必要になるケースがあるので上手く使い分けると良いかもしれません。
/var/log以下のログ一覧

参考サイト
https://thinkit.co.jp/article/711/1?page=0%2C1

### /var/log以下のログ一覧
バイナリログの見方がよくわからなかったので

#### テキストログ
直接確認できる。

|/var/log/*| mean|
|:--:|:--|
|anaconda.log|インストーラのログ|
|audit.log|監査デーモンauditdのログ。アプリがpermission denyで動かなかった場合なんかに調査できる|
|boot.log|起動時(起動ステータス)ログ|
|cron|cronログ|
|dmesg|システム起動〜ファイルシステムがマウントされるまでのカーネルのログ|
|mcelog|Hardware Errorのログ|
|messages|syslogを使用したログ|
|ntp.log|ntpdのログ|
|sa|sarの中身(CPU使用率とか)が保存されている|
|secure|認証関連ログ。sshd,sudo等のログが出力される|
|spooler|UUCP(Unix to Unix CoPy)というUnixシステム間データ通信のログ。ISDNなどで使われていたらしい。(今はほとんど使われてない？)|

<br />
#### バイナリログ
ユーザ認証系ログ。
ログイン成功/失敗、登録ユーザ最終ログイン時刻を取得できる。
バイナリ形式で保存されているため、確認するにはコマンドを使用しなければならない。

|/var/log|command|Mean|
|:--:|:--|:--|
|wtmp|last|login success一覧|
|btmp|lastb|login fail一覧 (rootのみ実行可)|
|lastlog|lastlog|登録ユーザ最終ログイン時刻|
|tallylog|pam_tally2|登録ユーザログイン失敗回数|
SwiftでUILabelやUIButtonの文字サイズを可変にする


iOSアプリを開発している時、横幅はきまっているけど、UILabelのデフォルトであるtruncate tailではなく、文字サイズを変更したい場合の処理
adjustsFontSizeToFitWidthを設定することで、可変になります。
minimumScaleFactorで最小値も指定できます。

```:UILabelの場合
let label = UILabel.init()
label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.8 # 最小でも80%までしか縮小しない場合
```

```:UIButtonの場合
let button = UIButton.init()
button.titleLabel?.adjustsFontSizeToFitWidth = true
button.titleLabel?.minimumScaleFactor = 0.8 # 最小でも80%までしか縮小しない場合
```
twitter Application Management(twitter API)の登録エラー

twitter Application Managementを利用する際に
認証用コードが届かなかったり、やっと届いても登録でエラーになったりと、
ちょっとハマったのでメモ！

認証用コードのメールが届かない時！
http://oxynotes.com/?p=8309

認証用コードを入力しても登録ができない時！
http://qiita.com/tk1024/items/644ead20793a6e869b83

「Access Token Key」と「access token secret」の取得方法!
https://syncer.jp/twitter-api-matome
あのTabBarの背景色を僕達はまだ知らない。

# やること
UITabBarの選択されているところだけ、背景をブラックにしたい。
5sの横幅とアイテム数をもとに作った画像を背景に設定していたが
iPhoen6やPlusのサイズだと、設定していた画像がはみ出してしまった。

なのでコードでUIImageを作って、当てはめることにしました。

## 実装

```TabBarController.swift
override func viewDidLoad() {
    super.viewDidLoad()
    self.delegate = self
    self.tabBar.selectionIndicatorImage = setImage()
}
    
// 横幅とアイテム数をもとにUIImageを生成
func setImage() -> UIImage {   
     let size = CGSize(width: UIScreen.mainScreen().bounds.size.width/CGFloat((self.tabBar.items?.count)!), height: 49)
     UIGraphicsBeginImageContext(size)
     let cgContextRef = UIGraphicsGetCurrentContext()
     CGContextSetFillColorWithColor(cgContextRef, UIColor.blackColor().CGColor)
     CGContextSetAlpha(cgContextRef, 1.0)
     CGContextFillRect(cgContextRef, CGRectMake(0, 0, size.width, size.height))
     let colorImage = UIGraphicsGetImageFromCurrentImageContext()
     UIGraphicsEndImageContext()
        
     return colorImage
}
```

これで、選択した時の背景画像に幅が均等になったものがセットされます。
わざわざパターン別に画像を用意しなくても対応できる！
あと色は、お好みで！
IMESupportの位置がおかしかった

すいません。すぐ直る方法がわかりました。
テキスト画面で、ctrl押しながらマウスホイールで
グリグリ拡大・縮小を行ったら、治りました。

下記は無視してください


==============================



Sublime Text3の導入に伴い、さまざまなプラグインをいれているのですが、

>WindowsでGoogleの日本語入力いれてる人は、日本語入れるときに変な位置にカーソルが出てしまう。

ので、解決してくれるのがIMESupportらしいのだけど、みんな平然と使ってるんだけど、ずれる。サイドバーの大きさ分ずれる。

なので、面倒ではあるのだけど、自分ルールとしてサイドバーの大きさを固定する事にして、例えば400pxくらい。

Users\名前のフォルダ\AppData\Roaming\Sublime Text 3\Packages\IMESupport\imesupport

にglobalhook.py

があるので、開くといろいろ書いてあるのですが、
x += 400;を追加して

```lang:globalhook.py
・・・
def set_inline_position(hwnd, x, y, font_face, font_height):
    # TODO Use font_face
    x += 400;
    if imesupport_dll is not None:
        ctypes.windll.user32.PostMessageW(
            hwnd, WM_IMESUPPORT_SET_INLINE_POSITION, x << 16 | y, font_height)
・・・
```

で表示してる位置より右に400pxずれてくれるので、なんとか納得いく位置に配置されてくれました。もちろんサイドバーのサイズ変えるとずれる。。サイドバーの大きさをとる関数とかプラグイン作る人じゃないのでわからない。。ので、取り急ぎの解決方法！
LinuxでCLIのVIPAccessキーを取得する方法

#LinuxでCLIのVIPAccessキーを取得する
ゲームや2重認証でVIPACCESSを使用している人はとてもおおいとおもいます。
しかし、スマホの機種交換、PCの交換ごとにVIPアクセスは変えるのは面倒
トークンがPC固有になってしまう。スマホで持ち歩けば良いかもしれませんがスマホを忘れたとき
充電がきれたとき困ると思います。スマホを破損すると当分ログインができません
そこで探してきたのがpython-vipaccessです。
こんな便利なものを公開していただけた作者様に感謝。

##インストール方法

Raspberry Pi　を例にしてインストール方法を書きます

`sudo apt-get install python-pip python-gmpy python-lxml`
`pip install lxml oath PyCrypto requests libxml2`
`git clone https://github.com/dlenski/python-vipaccess.git`
`cd python-vipaccess/`
`sudo python setup.py install`

lxmlがラズベリーパイの場合apt-get から入れないとダメなようです（おそらく）

そして
`cd $HOME`
`vipaccess provision`

.vipaccess が生成されます。


##クレデンシャルIDを知るには
クレデンシャルIDを見る場合は
`cat $HOME/.vipaccess | grep id`
としてみてください

##使用方法
`Vipaccess show` と入力すると

user@raspberrypi ~ $ vipaccess show
585885
user@raspberrypi ~ $ 

任意の６文字の数字がでます。
CentOS7にnginx1.8をインストールする方法

リポジトリの追加

```lang:
# rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
```

nginxのインストール

```lang:
# yum -y install nginx
```

バージョンの確認

```lang:
# nginx -v
nginx version: nginx/1.8.1
```
enumerizeのI18nではまったこと

I18nでyes,noの取り扱いでハマったので備忘録。

```rb
class Hoge
  extend Enumerize
  enumerize :fuge, in: [:yes, :no]
end
```
こんなモデルがあったとして...

localeファイルを追加して

```yaml
ja:
  enumerize:
    hoge:
      fuge:
        yes: はい！
        no:  いいえ！
```

```rb
hoge = Hoge.new(fuge: Hoge.fuge.yes)
hoge.fuge_text
=> "Yes"
```

(´･ω｀･)ｴｯ?


期待する結果は"はい！"だったのだが・・・

暫く詰まった末に思い出した！！


```yaml
ja:
  enumerize:
    hoge:
      fuge:
        "yes": はい！
        "no":  いいえ！
```

keyを囲ってあげないとダメだったんだorz

```rb
hoge = Hoge.new(fuge: Hoge.fuge.yes)
hoge.fuge_text
=> "はい！"
```

これでめでたく使えた(・∀・)
mymemo > Link > Pi Zero関連


https://www.adafruit.com/products/2885


### 図面
 
- [pdf](https://www.raspberrypi.org/documentation/hardware/raspberrypi/mechanical/rpi-zero-v1_2_dimensions.pdf)
- [stackexchange > Schematics/Drawings of the Pi Zero?](http://raspberrypi.stackexchange.com/questions/38596/schematics-drawings-of-the-pi-zero)

コーナンでこのサイズの板(例: ファルカタ材 90x6x450)を切ってもらう。[タミヤのプラカラー](http://www.tamiya.com/japan/products/list/tamiya_spray/kit85001.htm)で塗る。モックの完成([実際に作ったもの](https://hackaday.io/project/9526/gallery#aad8356091d409465e273343a4e765f8))。

追記: 上のPDFの図面は印刷をして実物と比べると、65と書いている部分が90mmに対応している。65はmmではないのか。あるいは印刷が拡大されているのか。

### GPIO

- [geeky-gadgets.com](http://www.geeky-gadgets.com/raspberry-pi-zero-mini-pc-launches-for-just-5-26-11-2015/)

- [GPIO of Pi2 @ element14](https://www.element14.com/community/docs/DOC-73950/l/raspberry-pi-2-model-b-gpio-40-pin-block-pinout)

### @ adafruit

- [Setting up your SD card](https://learn.adafruit.com/introducing-the-raspberry-pi-zero/setting-up-your-sd-card)
  - Raspbian Jessi
Michael Abrash Interview 5

http://qiita.com/7of9/items/51dc65c34ca65b09652e
の続き

Michael Abrash Interview:
https://www.youtube.com/watch?v=a7My8zbDNRI&list=PL_MJualihC5AxdlHgVUROYKbNAaPJ5PE4&index=2)

(2:26-)
The first class I took was Fortran for geographers course, in 1974, when I was a fresh man. Dick Haword had a class. It was ... Here's how you program Fortran, 

(2:40-)
and everyday, every class I come in, he would write an assignment on the board. And he talk about how to do this assignment. 

(2:45-)
But when I look the assignment, it's <font color=red>XXX1</font> spending the class writing the code out on paper. And I <font color=red>XXX2(run or write?)</font> it over typing the program. It <font color=red>XXX3(would?)</font> work.


赤文字ははっきり聞き取れない部分。
青文字はそのように聞き取れるが、文法的にしっくりいかない部分。


過去の話だが、時勢が時々現在形で話しているような気がしてきた。習慣行為の説明として現在形なのだろうか？未消化。


Dick Hawordで検索したら、Abrashのblogに引っかかった。
http://blogs.valvesoftware.com/abrash/do-what-you-love/
Let's Encryptで自動更新したらSlackに通知したかった

[Let's Encrypt](https://letsencrypt.org)の証明書は有効期限が3か月で切れちゃうので、折を見て更新しなければなりません。
都度、ちゃんと思い出して更新作業をすればいいのですが、人は忘れてしまうものです。僕は忘れます。
というわけで、ほっといても月一くらいで勝手に更新していてほしいです。ついでに更新したら更新したよって通知だけでもSlackに送ってほしいです。

Slackへの送信部分は、[Slackboard (https://github.com/cubicdaiya/slackboard)](https://github.com/cubicdaiya/slackboard)を使用させていただきました。
Slackboardについては以下の記事を参照。

- [Slackboard〜Slackプロキシサーバ in Go〜](http://qiita.com/cubicdaiya/items/1f9a8846f55b9d0bcb48)

ちなみに環境は以下の通りです。

- CentOS 7.2
- Slackboard 0.6.2
- golang 1.5.3
- Nginx 1.9.9

SlackへPostするIncoming-WebHookは事前に準備しているものとします。

# Slackboardの導入
## …その前にGo言語
何はともあれSlackへ通知する用にSlackboardを導入しなければなりません。しかしこれ[Go言語](https://golang.org)で作られているので、Slackboardに先立ってまずGo言語を使えるようにする必要があります。

```console:console
# wget https://storage.googleapis.com/golang/go1.5.3.linux-amd64.tar.gz
# tar -C /usr/local -xzf go1.5.3.linux-amd64.tar.gz
# export PATH=$PATH:/usr/local/go/bin
```

`/usr/local/go`配下に実行ファイルその他が解凍されます。

## そしてSlackboard
`go get`というコマンドが割と便利で、GitHubから`clone`してさらにはビルドまでしてくれます。

```console:console
# mkdir /usr/local/slackboard
# cd /usr/local/slackboard
# export GOPATH=`pwd`
# go get -u github.com/cubicdaiya/slackboard/...
```

すると、`/usr/local/slackboard/bin`の中にCLIやサーバプログラムが出来上がります。

続いて設定ファイルを作成します。iniに似ていますが、TOMLという形式だそうです。
`slack_url`にはSlack側で設定したWebHookのURLを指定します。`channel`や`username`は適宜変更してください。

```ini:/usr/local/slackboard/bin/slackboard.toml
[core]
port = "29800"
slack_url = "https://hooks.slack.com/services/....."

[[tags]]
tag = "letsencrypt"
channel = "#general"
username = "Let's Encrypt"
```

コマンドラインでサーバを起動することは当然可能ですが、どうせならやっぱりサービス化したいですね。したいです。

```ini:/usr/lib/systemd/system/slackboard.service
[Unit]
Description=Slackboard/Slack Proxy Server
After=network.target

[Service]
ExecStart=/usr/local/slackboard/bin/slackboard -c /usr/local/slackboard/bin/slackboard.toml

[Install]
WantedBy=multi-user.target
```

ユニットファイルが書けたら、サービスを有効化し、起動します。

```console:console
# systemctl enable slackboard
# systemctl start slackboard
```

# 自動更新させる
Let's Encryptのサイトにはcronで毎月行わせるサンプルが載っていましたので、それに従います。ただし、毎月1日とかみんなやりそうなので、ここは他に譲って20日とかにします。

## 更新用スクリプト
まずは、更新して結果をSlackboard経由で通知するスクリプトを作成します。ここでは`webroot`プラグインを使用します。

```bash:letsencrypt-update.sh
#!/bin/bash

SLACKBOARD=/usr/local/slackboard/bin/slackboard-cli

if ! /path/to/letsencrypt-auto certonly --renew-by-default --webroot -w /var/www/html -d example.com ; then
    # NG
    echo "Let's Encrypt certificates auto renewal failed." | $SLACKBOARD -t letsencrypt -s localhost:29800 -l crit 1>/dev/null 2>/dev/null
    exit 1
else
    # OK
    systemctl reload nginx
    echo "Let's Encrypt certificates auto renewal succeeded." | $SLACKBOARD -t letsencrypt -s localhost:29800 -l info 1>/dev/null 2>/dev/null
    exit 0
fi
```

## crontabに追加
毎月20日、朝5時に更新用のスクリプトを走らせるようにします。

```console:console
# crontab -e
```

```none:crontab
0 5 20 * * /path/to/letsencrypt-update.sh
```

失敗時にだけ通知したり、新しい有効期限を通知内容に含めたり、文言等はいい感じに調整するのもよいでしょう。Let's EncryptのAPIや他のクライアントを使うともっと柔軟な通知や更新ができるかもしれませんね。
RackTablesでゲストユーザにIPv4の表示・検索だけを可能にする


RackTablesで特定のユーザについて機能制限したい場合の書き方がわかったのでメモ

`Configuration : Permissions`に下記のように指定する

```
allow {$username_guest} and {$tab_default} and {$page_index}
allow {$username_guest} and {$tab_default} and {$page_search}
allow {$username_guest} and {$tab_default} and {$page_ipv4space}
allow {$username_guest} and {$tab_default} and {$page_ipv4net}
allow {$username_guest} and {$tab_default} and {$page_ipaddress}
```

* `$username_guest` はユーザ名が`guest`のユーザ
* `$tab_default` は各ページの`default` (通常は`Browse`で表示) だけ
* `$page_index` はログイン直後のページ
* `$page_search` は検索結果ページ
* `$page_ipv4space` はIPv4一覧ページ
* `$page_ipv4net` はIPv4のプレフィックス単位のページ
* `$page_ipaddress` はIPアドレス個別のページ

検索結果等に他機能のページへのリンクが表示されるが、そのリンクをたどるとアクセス不許可のページが表示される。

参考 [Permission configuration](http://wiki.racktables.org/index.php/RackTablesAdminGuide#Permission_configuration)
Java 文字列から数値への変換＆進数指定

## はじめに
事前に準備する外部ライブラリ等はありません。

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。

```java:StringToLong.java
/**
 *
 * @author tool-taro.com
 */
public class StringToLong {

	public static void main(String[] args) {

		//変換したい文字列
		String source = "21i3v9";
		//変換時の進数
		int radix = 36; //数値＋アルファベット小文字の36進数

		//変換処理
		Long result = Long.parseLong(source, radix);
		//標準出力
		System.out.format("変換結果=%1$d", result);
	}
}
```

## 動作確認

```
$ javac StringToLong.java
$ java StringToLong
$ 変換結果=123456789
```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

Webツールも公開しています。
[Web便利ツール@ツールタロウ](http://tool-taro.com/)
画像を公式サイトにアップしてちやほやされる

vvvvの[公式トップページ](https://vvvv.org/)には世界のユーザが**「作ってみたよ！見て！」**って画像を投稿する場所が用意されており、Screenshots of the Daysと呼ばれているそう。（ちなみにヘッダー画像も投稿されたやつ）
![kore.png](https://qiita-image-store.s3.amazonaws.com/0/60003/b5d7234b-ddb3-51e7-cd3c-def889b5a736.png)

単純に眺めてるだけでも何をどうやったらこんなの出来るんだ・・・という気分に浸れて良いんだけど、どうせならこちらからも発信してみよう、という趣向。

***
#やり方
わざわざスクショ撮って公式ページに行って～、のような煩瑣な手段は用意されておらず、機能として最初から組み込まれてあるのでそれを使う。

1.　適当なパッチを組む
2.　任意のウインドウをアクティブにしてパッチ上でCtrl+3
3.　Kommunikatorってのが出てくる。タイトルとか説明とか書く。ユーザーIDがある場合はパスも書く。Uplaodを押して成功したら下の方に成功したよって出る。![スクリーンショット 2016-01-25 23.21.16.png](https://qiita-image-store.s3.amazonaws.com/0/60003/f3675f6d-b524-ba0d-5e7c-67cf20bcc5db.png)

4.　ちょっと待つとトップページに出る　![スクリーンショット 2016-01-26 09.00.50.png](https://qiita-image-store.s3.amazonaws.com/0/60003/83f5df45-0dc8-f151-b1f6-37f4e1a6185c.png)

5.　あとはfuckin awesomeとかvvvveautyとかの世界からのコメントを待ってちやほやされるところを想像する

***
Twitterとかでぽいーって上げるのもいいんだけど、見た感じあまり日本からの公式サイトへのアクセスがそんなに無さそう（[ここ](https://vvvv.org/users/map)とか見てると）なのでちやほやされるならこっちのほうがいいかもしれない。貢献もできるし。アルファアップローダーになろうよ。
base64とかbasexx系encode/decodeって調べたら結構多かった

> とりあえず一覧だけロジックとかの説明はおって書きます

# Base16
## ロジック

## ライブラリ

# Base32
## ロジック

## ライブラリ

# Base62
## ロジック

## ライブラリ

# Base63
## ロジック

## ライブラリ

# Base64
データを64種類の印字可能な英数字のみを用いて、それ以外の文字を扱うことの出来ない通信環境にてマルチバイト文字やバイナリデータを扱うためのエンコード方式
## ロジック

## ライブラリ

# Base65
## ロジック

## ライブラリ

# Base85
## ロジック

## ライブラリ

# Base91
バイナリデータをASCII文字へエンコードするための方式
## ロジック

## ライブラリ

# Base128
## ロジック

## ライブラリ

# Base65536
## ロジック

## ライブラリ
電池 > Link > リチウム一次電池の定格 > CR2032 / CR123A

http://www.inedenki.co.jp/dcms_media/other/sanyo_lit.pdf
の
p11に「リチウム一次電池の定格」が記載されている。


- CR2032 : 230 mAh
- ...
- CR123A : 1400 mAh

など

こういう値はメーカーによってばらつきがありそう。
NSUserDefaultsを観測し、保存内容が変わったことを通知する実装

当たり前のことなのかもしれませんが、最近まで知らなくて
viewWillAppearとかで画面が切り替わったりした時にUserDefaultの値をもとに画面に変化を与えてました。
しかし場合によっては、上手く反映されないこともあるので困ることが多々あります。

なので、僕みたいに知らない人に共有したいと思います。

```ViewController.swift
override func viewDidLoad() {
        super.viewDidLoad()
        let userDefaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
        // NSUserDefaultsを観測
        userDefaults.addObserver(self, forKeyPath: "NSUserDefaultsの観測したい対象のKey", options: [NSKeyValueObservingOptions.New, NSKeyValueObservingOptions.Old], context: nil)
}

// UserDefaultの観測イベント
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        //通知された時に処理したい内容
}
```
指定してあるオプションの意味は

``NSKeyValueObservingOptions.New`` は、変更後の値を

``NSKeyValueObservingOptions.Old`` は、変更前の値を通知するオプションだそうです。
SlackAPIでuser groupにmentionをとばす

Slackには、チャンネルとは別で、ユーザーグループを作る機能があります。

参考：[SlackがUser Groups機能を追加、所属チャネルに関係なく「@engineers」などで対象者全員にメッセージ - THE BRIDGE（ザ・ブリッジ）](http://thebridge.jp/2015/10/slack-adds-user-groups-pickupnews)

APIからだと、`@hoge-group` のように単に@をつけただけではメンションを送れません。

正しくメンションを送る方法を紹介します。なお、動作確認はnode-slackで行いました。


## user group のIDを調べる

1. [usergroups.list method | Slack](https://api.slack.com/methods/usergroups.list/test) から`usergroups.list`APIを叩く
    - tokenがない場合は、上部にメッセージが出てると思うので、リンクをクリックして、tokenを取得してください。
2. メンションを送りたいグループのIDを取得する
    - idとteam_idの2つがありますが、**id**の方が正しいです


## messageをつくる
```
slack.send({
    text: `Hello <!subteam^取得したID|グループ名> !`,
    channel: config.SLACK_CHANNEL
});
```

という感じで、取得したIDとグループ名をいれてください。

参考：[user groups](https://api.slack.com/docs/formatting)

> For paid teams there is an additional command for user groups that follows the format <!subteam^ID|handle>. These indicate a user group message, and should cause a notification to be displayed by the client. User group IDs can be determined from the usergroups.list API endpoint.


これでメンション飛ばせます！
電子工作 > Link > MAX3232 > 3 V～5.5 V マルチチャネル RS-232 ライン・ドライバ/レシーバ

これはまあまあ使う。

http://www.tij.co.jp/product/jp/max3232

[datasheet](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiD0v6Oid3KAhWDKaYKHTmEDl8QFggdMAA&url=https%3A%2F%2Fdatasheets.maximintegrated.com%2Fjp%2Fds%2FMAX3222-MAX3241_jp.pdf&usg=AFQjCNGw_R2npQ2fmKpZwZaBJhvBEuVw0w&sig2=czsN0dHUyQAxDnek5HrytQ)

MAX213というのもあったが、こちらは使っていない。理由は思い出せない。
BLE機器のデバイス名を変更してもiOSから見えるデバイス名が変わらない

BLE機器を開発中に、テスト用アプリを作っていた時に引っかかったメモ。

# BLE機器のデバイス名を変えたのに、変更前の名前になっている
確かに変更したはずと思い、自分のiOSアプリを疑う。
そこで、持っていた[BLExplr](https://itunes.apple.com/jp/app/blexplr/id524018027?mt=8)でスキャンしてみたところ、見えていた情報が食い違っていることに気づく。

※以下キャプチャ画像の表示は一部マスクしてます
![capt.png](https://qiita-image-store.s3.amazonaws.com/0/99184/e3fe26b5-a322-8468-7f0d-5026412649c9.png)


# iOS、デバイス情報のキャッシュ
あれこれ調べたところ、データの取り方によってはiOSが持っているキャッシュのデバイス名を取り出してしまう模様。
（BLEのUUIDとひも付けているっぽい？）

当初のコードでは、didDiscoverPeripheralに渡ってきたCBPeripheralのnameを参照していた。

```objc
- (void)   centralManager:(CBCentralManager *)central
    didDiscoverPeripheral:(CBPeripheral *)peripheral
        advertisementData:(NSDictionary *)advertisementData
                     RSSI:(NSNumber *)RSSI
{
    // キャッシュからデバイス名を取り出す場合がある
    NSLog(@"Device name: %@", peripheral.name);

}
```

一度接続しなおす、などでキャッシュを書き換えることも可能だが、このままではBLE機器のデバッグが面倒なので違う手段にしたいところ。


# 対策
peripheralではなく、advertisementDataのkCBAdvDataLocalNameに入っている名前を取り出して使う。

こんな感じ。


```objc
- (void)   centralManager:(CBCentralManager *)central
    didDiscoverPeripheral:(CBPeripheral *)peripheral
        advertisementData:(NSDictionary *)advertisementData
                     RSSI:(NSNumber *)RSSI
{
    // キャッシュじゃないところからデバイス名を取り出し
    NSLog(@"Device name: %@", advertisementData[@"kCBAdvDataLocalName"]);
}
```


# 思ったことなどなど
- ありものの機器を使って開発するなら前者の方法でも別に問題なさそう
    - デバイス名ころころ変わらないだろうし。
- peripheralからキャッシュ側の名前を取り出す場合の利点ってなんだろう？
JSCSに振り回された話

# あらまし
12月から、JSのコーディング規約を整えようとして、Jenkins上とGitのコミットフックでJSCSを叩くようにしたんですよ。 
gulp-jscs + gulp-jscs-stylish つかって、Gulpコマンドとして用意しました。

preset は airbnb にしました。深い理由は無いんですが、自分の普段の書き方にわりと近かったので。
ちょっと冗長すぎるところはあるかなと思いますが・・・オブジェクト宣言時のカンマとか。

```js
var obj = {
  hoge: 'hoge',
  fuga: 'fuga',  // <- これね！
};  // <- あとこれとかね！
```

お堅い感じ。

# 振り回された＞＜
ある日突然、ローカルではJSCS通るのにJenkinsで通らない事象が起きました。 
node_modulesディレクトリを綺麗さっぱり消し去ってから`npm install`しただけではあるんですが、つまるところJSCSがアップデートされて、チェックするルールが変わったのですね。

https://github.com/jscs-dev/node-jscs/releases/tag/v2.9.0 (こいつだ・・・ッ！！)

ところで、gulp-jscsのバージョンは上がっていません。 
アプリケーションのpackage.jsonにはgulp-jscsのみdependencyを指定していて、jscsはしてませんでした。

gulp-jscsのpackage.jsonを見ると、jscsのdependency指定は以下のようになってました。

```json
{
  "gulp-util": "^3.0.4",
  "jscs": "^2.1.1",
  "through2": "^2.0.0",
  "tildify": "^1.0.0"
}
```

あーね。こりゃある日突然チェックルール変わっちゃうわ。

# 解決編
アプリケーションのpackage.jsonのdependency指定にjscs突っ込むだけ。

```json
{
  "gulp-jscs": "~3.0.2",
  "gulp-jscs-stylish": "~1.3.0", 
  "jscs": "~2.8.0"
}
```

#まとめ
ある程度以上の規模プロジェクトでコーディング規約が勝手に変わられちゃうと「全ソース修正したコミット、しかもスペース調整だけ」みたいな頭の痛くなるコミットができちゃうので、固定しときましょうという話でした。
もちろん、任意のタイミングで規約を改めるのはいいと思います。開発メンバーの意図しないところで規約が変わってしまうというのが迷惑なだけで。
NetCommons3でユーザ名を表示する方法


Users.DisplayUserHelperを使う。

コントローラで

```php
$helpers = [
	'Users.DisplayUser',
];
```


テンプレートでFindで取得したデータをそのままDisplayUserHelper::handleLinkに渡せばOK。楽だね


```php
<?php echo $this->DisplayUser->handleLink($bbsArticle, array('avatar' => true)); ?>
```

## 更新者を表示したいとき

```php
<?php echo $this->DisplayUser->handleLink($bbsArticle, array('avatar' => true), [], 'TrackableUpdater'); ?>
```