OmniAICreator/Qiita-1.07M huggingface dataset:
JavaでDOMの一部をXMLで見たい

# JavaってDOMの一部をXMLでさっと見れないの？

- 今までは偶然にも(?)DOMを操作して、選んだNodeを生XMLで見たいと思うことがありませんでした。
- JavaScriptで言うところのinnerHTML的なものが...あれ？？ないんだっけ？

# で、作りました。

- 便利なライブラリを探せば一発で出来るのがあるかもしれませんが、探すのが面倒なので最初から入ってるライブラリで作りました。

## ソースコード

```java

import java.io.ByteArrayOutputStream;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Node;

public class Util {

	public Util() {
		// TODO Auto-generated constructor stub
	}

	public static String convertXMLSource(final Node node) throws Exception  {

		// 空のドキュメントを作る。
		Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
		// Nodeをコピー（インポート）する。
		document.appendChild(document.importNode(node, true));
		// XMLDocumentからDOMSouceを作る。
		DOMSource source = new DOMSource(document);
		// 変換ツールを作る。
		Transformer transformer = TransformerFactory.newInstance().newTransformer();
		// 変換オプションを設定する。
		transformer.setOutputProperty(OutputKeys.INDENT, "yes");// インデントつける
		transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");// インデントは空白４文字分
		transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");// 先頭の<xml~~は付けない
		// 変換用のバッファを作る
		StreamResult result = new StreamResult(new ByteArrayOutputStream());
		// DOMSourceを表示用のXMLに変換する。
		transformer.transform(source, result);
		// 文字列
		return result.getOutputStream().toString();

	}
}

```

- String xml = Util.convertXMLSource(node); みたいに使います。


# ツッコミ・コメント上等！

- もっといい手があるよ！とか、ココちがくない？ということがあればコメントよろしくお願いします。
Surfaceで画面が回転しなくなった

突然、Surface Pro3で画面が上下逆から戻らなくなくなりました。電源再起動やWindowsの画面ロック設定を見直しましたが何をやっても上下逆のままです。

キーボードカバーをつけても画面が反対になったままで、使うことができないとの事で調査しました。

原因と解決した理由は不明ですが、一応解決したのでメモしておきます。

#事前にやった事

以下のページ通りに解決策４までやりましたが、変化がみられませんでした（５，６は影響不明なので後回しにしました）

[Surface 画面の回転に関するトラブルシューティング](https://www.microsoft.com/surface/ja-jp/support/hardware-and-drivers/troubleshoot-surface-touchscreen-rotation?os=windows-10)

その次にネットでみた下記を実施してみましたが、回転は戻りませんでした。

+ Windowsの復元ポイントへの戻し
+ センサー関連ドライバー削除 → 再起動

#解決方法

「ツーボタンシャットダウンの実施」で解決しました。

1.電源ボタンを30秒長押し、
2.音量↑と電源ボタンを同時に15秒以上押して離す

もし、BIOS画面（UEFI構成画面）が開いた場合には「Exit Setup」を選択して「Yes」を押して起動してください。

![a4f73a72-5c7b-4f55-addc-9612ade572e4.png](https://qiita-image-store.s3.amazonaws.com/0/14768/873a5583-e4d4-4e9e-2062-eaa91de5c00f.png)

ツーボタンシャットダウン参考：
[Surface Pro->電源が入らない->解決策3](http://www.microsoft.com/surface/ja-jp/support/warranty-service-and-recovery/surface-pro-wont-turn-on)

次回以降、同様の症状が起きたら再度確認します。
文字コードとエンコードと文字集合のまとめ

# メモ
- 文字集合: 文字の集合 
    - 例: unicode, JIS X 0208
- エンコード: 文字と数字をマッピングする方式
    - 例:  UTF-8, Shift_JIS
- 文字コード: 文字に割り当てられた「数字」
    - 例: E38182(あ in UTF-8)
- Charset: 文字集合とエンコードを含んだもの 
    - 例: Windows-31j 
    
# 参照
http://d.hatena.ne.jp/cero-t/20110614/1308063484
iPhoneシミュレータを誤って消してしまったとき


みなさんも、iPhoneシミュレータを誤って消してしまうことがありますよね？
こんな感じで。

```
xcrun simctl delete XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
```

私は、英語をあまり読まずに、てきとーに実行してしまって、消しました。

`delete`があるなら、`create`もあるので、慌てず騒がず下記のように実行しましょう。

```
xcrun simctl create <名前> <デバイスのタイプ> <ランタイムのタイプ>
```

デバイスのタイプなどは、`xcrun simctl list`を実行したら見れます。
私は、下記のように実行しました。

```
xcrun simctl create "iPhone 5s" com.apple.CoreSimulator.SimDeviceType.iPhone-5s com.apple.CoreSimulator.SimRuntime.iOS-9-0
```

## 参考
http://ericasadun.com/2014/06/18/ios-8-building-custom-simulators/
dataTablesプラグインの事例

http://www.ivysoho.net/article.php/20141009182845897

の訂正。全くの素人がこのミスを悟るのには相当時間を要しました。（こんな引用で良いのかな？）

```html:誤
Price: <select type="text" id="min" name="min">
<option onchange="filterme()" value= "0" selected="selected"></option>
<option onchange="filterme()" value= "50000"> 50000</option>
<option onchange="filterme()" value= "60000"> 60000</option>
...
<option onchange="filterme()" value="50000000">50000000</option>
</select> - 

<select type="text" id="max" name="max">
<option onchange="filterme()" value="99999999999" selected="selected"></option>
<option onchange="filterme()" value= "50000"> 50000</option>
<option onchange="filterme()" value= "60000"> 60000</option>
<option onchange="filterme()" value= "70000"> 70000</option>
...
<option onchange="filterme()" value="9990000000">50000000～</option>
</select>
```

では動きまへん。



```html:正
Price: <select onchange="filterme()" type="text" id="min" name="min">
<option value= "0" selected="selected"></option>
<option value= "50000"> 50000</option>
<option value= "60000"> 60000</option>
...
<option value="50000000">50000000</option>
</select> - 

<select type="text" id="max" name="max">
<option value="99999999999" selected="selected"></option>
<option value= "50000"> 50000</option>
<option value= "60000"> 60000</option>
<option value= "70000"> 70000</option>
...
<option value="9990000000">50000000～</option>
</select>
```
じゃないと動きません。



```js:script.js
function filterme() {
  //build a regex filter string with an or(|) condition
  var types = $('input:checkbox[name="type"]:checked').map(function() {
    return '^' + this.value + '\$';
  }).get().join('|');
  //filter in column 0, with an regex, no smart filtering, no inputbox,not case sensitive
  otable.fnFilter(types, 0, true, true, false, false);

  //build a filter string with an or(|) condition
  var frees = $('input:checkbox[name="free"]:checked').map(function() {
    return this.value;
  }).get().join('|');
  //now filter in column 2, with no regex, no smart filtering, no inputbox,not case sensitive
  otable.fnFilter(frees, 2, false, false, false, false);

}
Arduino で i2cdetect する


i2c の機器を買ったけどアドレスが解らない or 認識されてるのか解らない、そんなときに Linux では i2c-tools の i2cdetect コマンドですぐ調べられる。

Arduino でも [i2c_scanner](http://playground.arduino.cc/Main/I2cScanner) のやり方で解るんだけど、i2cdetect の出力の方がかわいくて解りやすいので、同じように出力するライブラリを書いた。

- https://github.com/hotchpotch/Arduino-i2cdetect

```cpp
#include <Wire.h>
#include <i2cdetect.h>

void setup() {
  Wire.begin();
  Serial.begin(9600);
}

void loop() {
  Serial.println("-- i2cdetect --");
  i2cdetect();
  delay(1000);
}
```

結果

```bash
-- i2cdetect --
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
```
ActiveResourceのダンプ

ActiveResourceを使用時に
どんなリクエスト投げてて、何が返ってきてるのかを把握したかった。
`ActiveResource::Connection`見ててもオプションとかなさそう。

とりあえずパッチで対応。railsだったんで`config/initializers/`に追加

```ruby:config/initializers/hoge.rb
module ActiveResourceDump
  def http
    origin = super
    origin.set_debug_output $stderr
    origin
  end
end
   
ActiveResource::Connection.send(:prepend, ActiveResourceDump) if Rails.env.development?
```
avyのmigemo対応およびswiperのmigemo対応

最近，avy-migemoというパッケージが登場した。
https://github.com/momomo5717/avy-migemo
名前から容易に想像されるように，本パッケージを利用することでavyをmigemo対応されることが可能となる。

MELPAからインストールして以下を設定ファイルに追記する。

```el
(require 'avy-migemo)
(avy-migemo-mode 1)
```
例えば`avy-goto-char`については対応する`avy-migemo-goto-char`を利用するといった具合である。

本パッケージの売りはswiperのmigemo対応も可能という点である。swiperを最新版に更新し（必須），以下を設定ファイルに追記する。

```el
(require 'avy-migemo-e.g.swiper)
```

swiperについてはるびきち氏の紹介記事が参考になる。
http://rubikitch.com/2015/03/18/swiper/
ただし，同ページに書いてある設定のうち，

```el
(fset 'ivy--regex 'identity)
```

はmigemo化を無効にしてしまうので注意。
Hubot を使って Slack で特定の人をランダムと称して選びたいときに使うと便利なスクリプト

# はじめに

ランダムで人を選出したいときってありますよね。
でも適切な人が選ばれないのは非効率的。
そこで適切な人をあたかもランダムで選んだかのようにみせるスクリプトの作り方です。

# tchoice スクリプト

```coffeescript
module.exports = (robot) ->
  robot.respond /choice+ (.*)+/i,(msg) ->
    if msg.match.length == 0
      msg.send "hubot choice <name1> <name2> ..."
      return null
    names = msg.match[1].split(' ')
    result = msg.random(names)
    msg.send "厳正な抽選の結果､ #{result} が当選となりました｡おめでとうございます！"

  robot.respond /tchoice+ (.*)+/i,(msg) ->
    if msg.match.length == 0
      msg.send "hubot tchoice <name1> <name2> ..."
      return null
    msg.send "厳正な抽選の結果､ @test が当選となりました｡おめでとうございます！"
```

# tchoice の 解説

まず、ランダムに人を選ぶスクリプトを作成します。
コマンドへの信頼性を高めるために、こちらは真面目に作成しましょう。
ある程度 choice が利用され始めたら tchoice を作成します。
これはその適切な人のニックネームの頭文字とかにしておくと便利です。
そして、しれっとこのコマンドを使うとあたかもランダムに選ばれた錯覚が起こります。
この錯覚が重要です。

# もう少し複雑にしたい場合

tchoice なんて名前だとすぐバレちゃうよ！ダメだよ！っていう人にはこちら

# setchoice スクリプト

```coffeescript
module.exports = (robot) ->
  robot.respond /choice+ (.*)+/i, (msg) ->
    if msg.match.length == 0
      msg.send "hubot choice <name1> <name2> ..."
      return null

    names = msg.match[1].split(' ')
    n = getN()
    if n and n < names.length
        result = names[n]
    else
      result = msg.random(names)
    msg.send "厳正な抽選の結果､ #{result} が当選となりました｡おめでとうございます！"

  robot.respond /setchoice (\d{1})/i, (msg) ->
    if msg.match.length == 0
      msg.send "hubot choice set <N>"
      return null
    n = parseInt(msg.match[1])
    if isFinite(n) and n >= 0
      setN(n)

  robot.respond /unsetchoice/i, (msg) ->
    setN(null)

  KEY_HUBOT_BRAIN = 'hubot_choice_key'
  KEY_HUBOT_N = 'hubot_choice_n_key'

  getData = () ->
    return robot.brain.get(KEY_HUBOT_BRAIN) or {}

  setData = (data) ->
    robot.brain.set KEY_HUBOT_BRAIN, data

  getN = () ->
    return getData()[KEY_HUBOT_N] or null

  setN = (n) ->
    data = getData()
    if n
      data[KEY_HUBOT_N] = n
    else
      delete data[KEY_HUBOT_N]
    setData(data)
```

# setchoice の解説

とても簡単 choice の機能の中に `@test` を出すしくみを入れてあげれば OK
tchoice を使ったあとの信頼性を高めた choice ですのでかなり有効的です


# おわりに

やってもいいターゲットを間違えると大問題になりそうなのでご注意を。
新gTLDのwhoisサーバを調べるには

# 一言で言うと
[IANAのデータベース](https://www.iana.org/domains/root/db)見ろ。

# も少し細かく説明
新 gTLD の whois サーバがどこかという情報は、[IANAのデータベース](https://www.iana.org/domains/root/db)に記載されています。
たとえば、.moe の whois サーバの情報は、[.moe のページ](https://www.iana.org/domains/root/db/moe.html)の「Registry Information」という箇所に記載されています。これが分かれば、jwhois コマンドでも以下のように問い合わせ先サーバを指定することで

```shell-session
$ jwhois -h whois.nic.moe nic.moe
[Querying whois.nic.moe]
[whois.nic.moe]
Domain Name:                                 NIC.MOE
Domain ID:                                   D511-MOE
Sponsoring Registrar:                        NEUSTAR Organization
Sponsoring Registrar IANA ID:                1
Registrar URL (registration services):       www.neustar.co
Domain Status:                               serverDeleteProhibited
Domain Status:                               serverTransferProhibited
Domain Status:                               serverUpdateProhibited
Registrant ID:                               NICCONTACT1
Registrant Name:                             Neustar, Inc.
(後略)
```

問い合わせを行うことが出来ます。
まぁ、一部 gTLD はなぜか whois サーバの情報が無くて、ググってあちこち見たりして調べる必要があるんですが...。
jQueryでaddClassされたタイミングでイベント発火したいけど無理だった

とあるjQueryのpluginを使っていて、とあるタイミングでJavaScriptでも処理を行いたかったのですが、結果スマートな方法な無いみたいですね〜。

自分で管理しているなら以下みたくすればいい。

```js
$('selector').addClass('tempClass');
$('selector').trigger('fire');
```

でも今回は自分の管理外のpluginなのでできない。
(というか汎用性無くなるからやっててほしかった＞＜)

DOMを無理やりObserveする方法もあるのですが、ブラウザの実装状況によって左右されるので面倒。。。

もしObserveするなら以下を使う。

+ DOMSubtreeModified -> 非推奨
+ propertychange
+ MutationObserver -> 手間おおし

```js
$('selector').on('DOMSubtreeModified propertychange', function () {
    // todo
});
```

```js
// 準備
var observeSelector = function () {
    console.log('addClass');
}
var temp = new MutationObserver(observeSelector);

// セレクタをセットして監視を開始
temp.observe($('selector')[0], {
    'attributes': true,
    'characterData': true,
    'childList': true,
});

// 適当なタイミングで以下を実行
$('selector').addClass('asdf');
```

変更を加えると、`console.log('addClass');`が実行される。


というメモでした。
何も解決できてない。
Azureの料金情報をAPIで取得。

Azureの料金情報をPython3で取得するコードのメモ。

ライブラリの「requests」が無かったらpipで入れる。

エンロールメント：EAコンソールの左上にでてる数字。
fmt:csvかJSONを指定。指定した形に応じてコンテントタイプを変更する必要がある。
セカンダリキー：AzureのEAコンソールで取得出来る長ったらしい方。

```lang:
import requests

BASE_URL = 'https://ea.azure.com/rest/エンロールメント/usage-report?fmt=json'
AUTH_KEY = 'bearer ' + 'セカンダリキー'

headers = {
  'content-type'  : 'application/json',
  'authorization' : AUTH_KEY,
}

response = requests.get(
  BASE_URL,
  headers=headers,
)
print(response.text)
```
環境変数を使ってコマンドラインからCapistrano の設定を上書きする

デプロイ先のホストやロールをコマンド上で上書きできる様です。
`--dry-run` と使い分けしながらローカルでCapistrano タスクをテストする際に便利そうな機能です。

## ロールを変更する

- 環境変数 `ROLES` を指定
- カンマ区切りで複数のロールを指定可能

```
ROLES=app,web cap production deploy
```

別のやり方で `--roles` オプションでもできるらしい

```
cap --roles=app,web production deploy
```

（参考）[Role filtering](http://capistranorb.com/documentation/advanced-features/role-filtering/)

## ホストを変更する

- 環境変数 `HOSTS` を指定
- カンマ区切りで複数のロールを指定可能

```
HOSTS=server1,server2 cap production deploy
```

別のやり方で `--hosts` オプションでもできるらしい

```
cap --hosts=server1,server2 production deploy
```

（参考）[Host filtering](http://capistranorb.com/documentation/advanced-features/host-filtering/)
CarrierWaveを使いつつfixtures + minitestでtestを書く

なんかもうちょっといい方法がある気がするんですが、これで一応通りました。

## 準備

``` ruby:app/models/user.rb
class User < ActiveRecord::Base
  mount_uploader :avatar, AvatarUploader
  validates :avatar, presence: true # ファイルがちゃんと設定されていることを確認
end
```

## やり方

``` ruby:app/uploader/avatar_uploader.rb
class AvatarUploader < CarrierWave::Uploader::Base
  #...
  def store_dir
    return '' if Rails.env.test?
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
  #...
end
```

``` ruby:test/fixtures/users.yml
<% file_path = Rails.root.join('test/fixtures/files') %>
user_with_avatar:
  avatar: <%= file_path.join('avatar.png') %>
# test/fixtures/files 配下にavatar.pngを置いておく
```

``` ruby:test/test_helper.rb
class ActiveSupport::TestCase
  #...
  # Not storing uploads in the tests
  CarrierWave::Mount::Mounter.class_eval { def store!; end }
  CarrierWave.root = Rails.root.join('test/fixtures/files')

  def after_teardown
    super
    CarrierWave.clean_cached_files!(0)
  end
  #...
end
```

``` ruby:test/model/user_test.rb
class UserTest < ActiveSupport::TestCase
  test 'レコードが作成できること' do
    #...
    file_dir = Rails.root.join('test/fixtures/files/')
    File.open(file_dir.join('avatar.png')) do |image|
      #...
      user.avatar = image
      user.save!
    end
    #...
  end
end
```

## 参考記事
[Using Rails test fixtures with CarrierWave](http://jeffkreeftmeijer.com/2014/using-test-fixtures-with-carrierwave/)
rubyで定数が上書きできないので引数を増やして分岐を入れてみた


初心者なのでいろいろ分かっていませんが必要に迫られたので対応した記録を。
rubyもできるphperの人に聞いたら定数は普通上書きできないけどrubyではがんばればできるらしいスゲー変わってんな、ということでした。
でも私には難しすぎて良くわからなかったのと今回のケースでは無理そげな気がしたので正攻法（たぶん）でいくことにしました。

元の処理（イメージです）

```
  SUBNET = {
    'env1'     => ['10.0.0.0/17'],
    'env2'    => ['10.1.32.0/19'],
  }
def sg(env)
proc {
    p *SUBNET[env]
}
end

sg('env2').call
```

単体テストにつかったスクリプトはこちら。

```
vi /tmp/istest.rb
------
  SUBNET = {
    'env1'     => ['10.0.0.0/17'],
    'env2'    => ['10.1.32.0/19'],
  }
  OLDSUBNET = {
    'env2'    => ['10.2.128.0/20'],
  }

def sg(env,*vpc)
proc {
  if vpc[0] == 'oldvpc'
    p *OLDSUBNET[env]
  else
    p *SUBNET[env]
  end
}
end

sg('env2','oldvpc').call
#sg('env2').call
-------
# ruby  /tmp/istest.rb
"10.2.128.0/20"
```

今回わかったことなど
・procで指定してるブロックをcallで呼んでる
・定数はcallしてる側から上書きできない（rubyは例外もあるらしいけど）
・定数を変えるのは諦めてdefで定義してる側に引数増やしてそれに応じて分岐を入れることにした
・引数を複数指定する場合にデフォルト値や配列指定以外の方法で引数の数が定義する側と呼ぶ側で合わないとエラーになる
・引数のデフォルト値を指定するやりかただとcallしてる側で上書きできないケースがあった
・引数を増やして渡す時に*がついてると配列で渡る。そして引数が含まれてなくても空の値が渡るので引数の数が合わないエラーが出ないっぽい、ので配列にした。

rubyまだあんまりよくわかんないままですけど（ググるとむずかしいのばっかりでてくる）
まあなんか動いたのでよかったなーと思いました。精進しないとですね。

参考：
「Ruby逆引きハンドブック」ほかいろいろ
以下よくわかってないやつ
https://hydrocul.github.io/wiki/programming_languages_diff/function/var-args.html
http://melborne.github.io/2014/04/28/proc-is-the-path-to-understand-ruby/
http://takitake.hatenablog.com/entry/2014/10/15/215007
http://akkunchoi.github.io/ruby-metaprogramming1.html
http://d.hatena.ne.jp/vaaaan/20090727/1248690914
GoのEnumイディオム


```
// RequestMethod defines http request method
type RequestMethod int

// Request methods
const (
	GET RequestMethod = iota
	POST
)

func (rm RequestMethod) String() string {
	switch rm {
	case GET:
		return "GET"
	case POST:
		return "POST"
	default:
		return "Unknown"
	}
}
```

1. まずint型の別名としてtypeを設定する
2. constのブロックの中でiotaを呼ぶと上から連番で0,1,2...と振ってくれる
 - iotaの応用は https://splice.com/blog/iota-elegant-constants-golang/ が詳しい
3. そのままだとPrintした時に、0とか1とか数字が出てしまうので、作成したtypeに対してString()メソッドを用意しておくと良い
 - これはダックタイピングのGo的にはStringerインターフェースを実装したことになるhttps://golang.org/pkg/fmt/#Stringer
4. (おまけ) 大文字始まりのものはExportされるので、GoDoc用に上のような形でコメントを入れておく。そうしないと、golintでWarningが出る。


## 参考

- http://arslan.io/ten-useful-techniques-in-go
- http://stackoverflow.com/questions/14426366/what-is-an-idiomatic-way-of-representing-enums-in-golang
Kotlinさんが「incompatible version of Kotlin」と叫びたがっているんだ

> Class 'kotlin/KotlinPackage' was compiled with an incompatible version of Kotlin.



>    Error:/Users/rirakuma/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/0.14.449/5b3fbac3cd9c019ed24e40fe69ea64fcf1d051a7/kotlin-stdlib-0.14.449.jar!/kotlin/KotlinPackage.class: (0, 0): Class 'kotlin/KotlinPackage' was compiled with an incompatible version of Kotlin. Its ABI version is 25, expected ABI version is 23


ある日Kotlinを立ち上げたら、突然こんなこと言われたよ。
ABI25は23と下位互換ありませんぜ！みたいな。

いや、別にバージョンを上げたいわけじゃないです。
古いバージョンのままです。

ライブラリのバージョンを指定してあげる。
>build.gradle

dependencies#compile "org.jetbrains.kotlin:kotlin-stdlib:0.12.613"


buildscript/dependencies/classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:0.12.613"

>gradle.properties

kotlin_version=0.12.613




そしてこいつら。
>compile 'com.jakewharton:kotterknife:0.1.0-SNAPSHOT'
>url 'https://oss.sonatype.org/content/repositories/snapshots/'

snapshotsさんが最新バージョンのkotlinさんを呼び寄せたっぽい。
消したら直りました。
INDIRECT関数で動的に別シートの情報を参照する


Excelでシート fuga にあるセル A2 の内容を、シート hoge から参照したいときは、セルに

`='fuga'!A2`

という式を書けばいいのですが、これをあちこちに貼っていてかつシート名が fuga から piyo 
に変わった場合など、これ全部直すの・・・と、どんよりとした気持ちになってしまいます。

そんなときは INDIRECT 関数を使って動的に参照を記述しましょう。

シート hoge の適当なセル（ここでは B5）に fuga と記入したうえで、シート hoge の別のセルで

`=INDIRECT("'" & B5 & "'!A2")`

とすると、シート fuga のセル A2 の内容を参照できます。

シート名が fuga から piyo に変わったときは、セル B5 の内容を piyo に変えればOKです。

追記：ささいな事なのですが、ググっても正しい情報が見つかりにくかったので備忘録として。
マイクロサービスを実践するなら、まずはアカウント作成の機能を自前アプリから切り離すといいかも

昨今ウェブサービスのユーザ登録にIDプロバイダーからの登録フローは必須といっていい。
ところが、FacebookやTwitterアカウントを持っていない、または何があろうとサービス間の連携を忌避する層というのが居て、開発者はサービス独自のアカウント作成の実装を強いられる。

## アカウント作成の処理フローとはなにか

あまり説明する必要性を感じないが、よくあるフローを箇条書きにする。

1. メールアドレスを入力させる
2. 1で入力されたメールアドレス宛に、登録のためのトークン付きURLが送付される
3. 2のURLを辿ると、ユーザ名やパスワード、その他そのサービスに必要な情報を入力させる
4. バリデーション兼コンファームページを経て、アカウント登録の完了となる

以上がサービス独自のアカウント作成フローになる。
前述したとおりIDプロバイダーを利用したアカウント作成も提供したいので、IDプロバイダーとのID連携も行うがそれは省略する。

余談だが、ネイティブアプリではコンバージョンレートを高めるためにアカウント作成をスキップ（隠蔽）し、使用したデバイスに強く依存した仕組みが用いられることが多くなった。

## マイクロサービスを実践する

独自アカウント作成の実装と、IDプロバイダーとのID連携は同じアプリケーション上で実装されることが多いと思う。このアプリケーションをサービスアプリとする。

なんのことはない。独自アカウント作成の部分だけを切り離したアプリケーションを作り、このアプリケーションをアカウントアプリとし、そこにIDプロバイダーの機能を実装することでサービスアプリからはひとつのIDプロバイダーとみなせばよい。

![microservice.jpg](https://qiita-image-store.s3.amazonaws.com/0/13113/ab6d83d2-0f66-0d32-ee85-b807d773766c.jpeg)

## アカウントアプリの中身について

アカウントアプリの設計はアカウント登録に必須なパラメータ以外を持ち込まないようにすべきで、サービスアプリに必要だからといって住所などの付属情報をアカウントアプリ内で処理させないよう注意したい。
これはセキュリティうんぬんの話ではなく、サービスアプリに必要なデータはサービスアプリ内で処理させなければ、他のIDプロバイダとの兼ね合いにより二度手間になってしまうことが多い。

先の例ではアカウント作成にメールアドレスを必要としたが、TwitterのAPIではユーザのメールアドレスを取得する手段は用意されていないし( https://dev.twitter.com/faq#26 )、Facebookではメールアドレスを取得するためのパーミッションが必要となる。
サービスアプリでメールアドレスが必須なのであれば、Twitter経由のユーザのためにメールアドレスを登録する機能が必要となる。

事前にこのようなことが判明していれば、アカウントアプリでメールアドレス登録させずともサービスアプリで登録させてしまうことで同じような機能を実装する手間が省ける。

幸いなことにRubyOnRailsの世界ではdoorkeeperをはじめとし、OAuth2プロバイダを実装するための良いライブラリがあるので、ぜひ実践してみてはいかがか。
Go言語でチャネルとselect

Go言語でチャネルとselectを使う場合の挙動についてのメモ

## 受信

単純に書くと以下のようになる。

```go
// ch は chan
v := <- ch
```

ところが、チャネルが `close` されている場合はゼロ値が受信される。

値を受信したのか `close` によってゼロ値になったのかを区別するには左辺の2つめの変数でbool値を受け取る。

```go
v, ok := <- ch
if ok {
	fmt.Println(v)
} else {
	fmt.Println("closed")
}
```

この `ok` はチャネルから受信した場合は `true` 、そうでない場合は `false` が入る。

### select

チャネルに値が入っていない場合、受信はブロックする。ブロックせずに処理を行いたい場合は `select` を使う。

```go
select {
case v := <- ch:
	fmt.Println(v)
default:
	fmt.Println("no value")
}
```

`ch` に値が入っている場合は `case v := <- ch` ケースが実行される。`ch` に値が入っていない場合は `default` ケースが実行される。`default` ケースが実行された場合はチャネルからの値の受信は行われない。

この時もチャネルが `close` されているとブロックせず `case v := <- ch` が実行される。受信か `close` か区別したい場合は以下のようにする。

```go
select {
case v, ok := <- ch:
	if ok {
		fmt.Println(v)
	} else {
		fmt.Println("closed")
	}
default:
	fmt.Println("no value")
}
```

## 送信

単純に書くと以下のようになる。

```go
// ch は chan
ch <- v
```

### select

チャネルに空きがない場合、送信はブロックする。ブロックせずに処理を行いたい場合は `select` を使う。

```go
select {
case ch <- v:
	fmt.Println("sent")
default:
	fmt.Println("no capacity")
}
```

`ch` に空きがある場合は `case ch <- v` ケースが実行され "sent" 表示、空きがない場合は `default` ケースが実行され "no capacity" 表示となる。`default` ケースが実行された場合はチャネルへの値の送信は行われない。

なお `close` したチャネルに送信しようとすると `panic: send on closed channel` となる。
ITMS-90206エラーの回避策

##発生したエラー
iTunes Connectからのサブミット時に下記のようなエラーが発生しました。

```text
ERROR ITMS-90206: "Invalid Bundle. The bundle at 'hogehoge' contains disallowed file 'Frameworks'.
```

##原因
Cocoa Podsの問題で、Extensionのディレクトリに作成してはいけないFrameworkフォルダがある模様です。
https://github.com/CocoaPods/CocoaPods/issues/4203

##回避策
githubのチケット上で、下記のようなスクリプトが考案されてました。
該当するextensionのBuild Phase Scriptとして追加します。

```text
cd "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/"
if [[ -d "Frameworks" ]]; then 
    rm -fr Frameworks
fi
```

僕の環境でも、上記修正後にclean/archiveして無事にサブミットできました。
Slack でチャンネル名を変更する方法

*注: チャンネル作成者や管理者じゃないと変更できない。その場合はメニューに選択肢が表示されない。

## 1. チャンネルに移動する

## 2. 右上の歯車ボタンを押す

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/1a23c930-8793-6a48-09d2-d3379a209c91.png)

## 3. 「Addtional Options」を選ぶ

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/19fb2e79-0b95-3d65-4e29-745d8b40c0af.png)

## 4. 「Rename this channel」 を選ぶ

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/ef17ff2e-ea2c-c224-db75-0ab97b739457.png)


## 5. 好きなチャンネル名を入力して「Rename Channel」を押す

![スクリーンショット 2015-10-15 16.25.01.png](https://qiita-image-store.s3.amazonaws.com/0/90607/5e379dd3-db1f-dc9b-ea44-f5555d504bd0.png)



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
SConsことはじめ


# 前準備

あらかじめ、pythonとsconsをインストールしておくこと。

# 基本的な知識

[ここ](https://bitbucket.org/scons/scons/wiki/BasicConcepts)の意訳。適当。

## SConstruct

SConsのエントリポイントとなるファイル。プロジェクトのルートディレクトリに配置される。
中身はpythonスクリプト。

## SConscript

SConsのスクリプトであるが、プロジェクトのサブディレクトリに配置されるファイル。階層的なビルドに利用される。

## Scons Environment

SConsがプロジェクトをビルドする際に作成されるオブジェクト。プロジェクトの依存関係ツリーや、ヘルパー関数、ビルダーなどをもとに作成される自身の環境。
スクリプトからは、単に`Environment`でアクセスすることができる。

## System Environment

`PATH`や`HOME`などの、OSの環境変数を含む。スクリプトからは`os.environ`でアクセスすることができる。

## Builder

ソースファイル群から依存するターゲットをビルドするために、明示的に呼び出すオブジェクト。ソースファイルが変更されたとき、何をビルドするべきか自動的に検出する。

## Action

外部コマンドを実行したり、pythonの関数を呼び出したりする、呼び出し可能なオブジェクト。`Builder`は、`Action`のリストを保持する。

## Node

通常、ファイルやディレクトリなど、ファイルシステムを表現するオブジェクト。

## Scanner

ファイル内部から参照されるファイルをスキャンするのに利用されるオブジェクト。

## Tool

`Builder`や`Scanner`、その他ヘルパーを、SConsの環境に追加する外部コンポーネント。

# 最も簡単なプログラム

`Hello World`を表示させるだけの簡単なプログラム。
`hello.c`と`SConstruct`を作成する。

```
$PROJ_ROOT
├── hello.c
└── SConstruct
```

それぞれ、ファイルの内容は以下。

```c:hello.c
#include <stdio.h>

int main(void) {
  printf("Hello world!\n");
  return 0;
}
```

```python:SConstruct
env = Environment()

env.Program(target='hello', source=["hello.c"])
```

`$PROJ_ROOT`で、以下のコマンドでビルドしてみる。

```bash
$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
gcc -o hello.o -c hello.c
gcc -o hello hello.o
scons: done building targets.
```

ビルドが成功すると、`hello`が生成される。

```
$PROJ_ROOT
├── hello <= (*)
├── hello.c
├── hello.o
└── SConstruct
```

実行してみる。

```bash
$ ./hello
Hello world!
```

ビルドで生成されたファイルは、以下のコマンドでクリーンできる。

```bash
$ scons -c
```

# ソースコード

https://github.com/toshiyukihina/hello-scons
Unity のバージョンを取得する


## C# スクリプトで Unity バージョンを取得
### 利用するもの
以下のメンバまたはメソッドで Unity のバージョンを取得できる。

- [UnityEngine.Application.unityVersion](http://docs.unity3d.com/ScriptReference/Application-unityVersion.html) … バージョン
- UnityEditorInternal.InternalEditorUtility.GetFullUnityVersion() … バージョン + ハッシュ

### バージョン取得コード例
```csharp
Debug.Log("---- version info ----");
Debug.Log(UnityEngine.Application.unityVersion);
Debug.Log(UnityEditorInternal.InternalEditorUtility.GetFullUnityVersion());
```

### 出力例
```text
---- version info ----
5.2.1p4
5.2.1p4 (9a78a9ce1e6c)
```

## シェルスクリプト (Mac) で Unity バージョンを取得
### 利用するもの
ちょっと強引ですが、batchモードで起動時の出力からバージョン情報を抽出。

### バージョン取得コード例
```bash
UNITY_VERSION=`/Applications/Unity/Unity.app/Contents/MacOS/Unity -batchmode -quit -logFile /dev/stdout | grep "Initialize engine version:" | awk '{print $4;}'`
echo "---- version info ----"
echo $UNITY_VERSION
```

### 出力例
```
---- version info ----
5.2.1p4
```
[awk] 特定の文字列以降を削除する

# データ例

```
1 yamada_taro
2 kimura_hanako
3 takahashi_jiro
4 sato_momoko
5 tanaka_akane
```

上記のように、番号と名前からなるデータがあるとします。また、名前は姓と名の間に"_"が入った形式となっています。

こういうデータから、awkを使って、"_"以降の名を削除することを考えましょう。なお、このデータは"test.dat"というファイルに保存されているとします。

# コード例

正規表現を使った文字列置換ができるsub関数を使います。

```awk
awk '{
    sub("_.*", "");
    print $0;
}' test.dat
```

## 脚注

はじめgsub関数を使っていたのですが、今回のデータ例ではsub関数で事足ります。なお、sub関数とgsub関数の違いについては軽くまとめました。
[[awk] sub関数とgsub関数の違い](http://qiita.com/kaw/items/604a76abda6b5ed84715)

# 出力

```
1 yamada
2 kimura
3 takahashi
4 sato
5 tanaka

```
JAVA参照渡し(引数としてアドレスを渡す)-配列

▪️例

```java
public class test38 {
	public static void incArray(int[] array) {
		for (int i = 0; i < array.length; i++) {
			array[i]++;
		}
	}

	public static void main(String[] args) {
		int[] array = { 1, 2, 3 };
		incArray(array);
		for (int i : array) {
			System.out.println(i);
		}
	}

}
```

▪️実行結果
2
3
4

▪️補足
もしarray[i]++;がなかったら、結果が
1
2
3
となる。


▪️例② 戻り値が配列の場合

```java
public class test38 {
	public static int[] makeArray(int size) {
		int[] newArray = new int[size];
		for (int i = 0; i < newArray.length; i++) {
			newArray[i] = i;
		}
		return newArray;
	}

	public static void main(String[] args) {
		int[] array = makeArray(3);
		for (int i : array) {
			System.out.println(i);
		}
	}
}
```

▪️例② 実行結果
0
1
2

▪️例② 補足
int[] array = makeArray(3);をint[] array = makeArray(5);としたら、
結果が
0
1
2
3
4
となる。
JavaScript で安定ソート


めも。

```js
// デフォルトの比較関数
function compare (a, b) {
  if (a === b) {
    return 0;
  } else if (a > b) {
    return 1;
  } else {
    return -1;
  }
}

function stableSort (array, fn) {
  if (fn == null) {
    fn = compare;
  }

  var i, len = array.length;

  if (len === 0) return array;

  // 値とインデックスのペアにする
  for (i = 0; i < len; i++) {
    array[i] = [array[i], i];
  }

  array.sort(function (p1, p2) {
    var cmp = fn(p1[0], p2[0]);
    if (cmp !== 0) {
      // ペアの0番目同士が等しくない場合はその比較結果を返す
      return cmp;
    } else {
      // 等しい場合は、インデックスを比較した結果を返す
      return p1[1] - p2[1];
    }
  });

  // ペアの0番目を取り出す
  for (i = 0; i < len; i++) {
    array[i] = array[i][0];
  }

  return array;
}

```
[Excel] VBAでハイパーリンクを取得する関数を作る

関数だけでなんとかしたい・・・！という気持ちはあったのですが、ハイパーリンクだけはどうしてもVBA経由でしか取得ができないようです。せめてどこでも取得できるようにと、ハイパーリンクを取得する関数を作って利用しています。その利用までの手順と実際の使用例をまとめています。主に自分用です。

#関数登録

VBAにハイパーリンク取得関数を登録します。


| 工程 | 作業イメージ |
|:--|:-----------------------------------------------------|
|（１）「開発＞コードの表示」クリックする   |![image](https://qiita-image-store.s3.amazonaws.com/0/36476/815d9427-e008-bd56-c7aa-38c7d9bd0e99.png)   |
| （２）「VBAProject＞挿入＞標準モジュール」をクリックする  | ![image](https://qiita-image-store.s3.amazonaws.com/0/36476/f5a7e7f2-5200-5e0e-4a59-f8e1c8d7fbf3.png)  |
| （３）下記をはりつける  |![image](https://qiita-image-store.s3.amazonaws.com/0/36476/d15ea0a5-b379-98a5-8aa5-0d708fb620d0.png)|
|（４）VB編集画面を閉じる（Alt+Q）   |   |


###（３）ではりつけるもの

```vba:
Function GetHyperlink(セル As Range) As String
        Dim sp As Shape
        If セル.Hyperlinks.Count > 0 Then
                GetHyperlink = セル.Hyperlinks(1).Address
        End If
        For Each sp In ActiveSheet.Shapes
                If セル.Address = sp.TopLeftCell.Address Then
                        GetHyperlink = GetHyperlink & vbLf & sp.Hyperlink.Address
                End If
        Next
End Function

```

# 実際に使ってみる

（１）任意のセルに以下を記入する

```
 =GetHyperlink(A1(セル）)
```

![image](https://qiita-image-store.s3.amazonaws.com/0/36476/6ccb6386-ad30-c6f6-2659-a57bc74109ef.png)


# 変更履歴
- 2017/01/04 手順変更。スマートにしました。
Alfredでエイリアスを検索対象にして検索効率アップ

AlfredはMacでは手放せないアプリケーションランチャです。
マウスいらずの素早い検索は効率と快適さを求める人なら絶対必要なユーティリティといっていいでしょう。

アプリやフォルダ名の頭数文字から検索してくれるのがとても素晴らしいですが、フォルダやアプリが増えて効率が少しずつ落ちてきたので、その対策をメモしておきます。

# 状況

## 例1：似たようなフォルダ名
`hogehoge`にたどり着くには`hogeh`まで入力しないといけない。

```
hoge/
hoge2/
hogehoge/
```


## 例2：日本語のフォルダ名
いちいち漢字変換するのが面倒くさい。
日本人なので日本語フォルダは多用してます。

```
prj_佐藤砂糖会社/
prj_鈴木材木店/
```

# 対策

頻繁に使うフォルダならFinderの「よく使う項目」に登録しろって話ですが、あの場所に**20個近くのフォルダを登録したくない**し、そもそも**マウスに手を伸ばしたくありません**。

## エイリアスを使おう！

自分の場合は自分のホームディレクトリに「エイリアス」というフォルダを作り、そこにエイリアスを突っ込みました。

![スクリーンショット 2015-10-15 15.10.49.png](https://qiita-image-store.s3.amazonaws.com/0/2513/cce55d83-70c4-d616-bb44-63228558f2ef.png)

```
ss_佐藤砂糖会社
sz_鈴木材木店
```

これなら`sz`で鈴木材木店が、`ss`で佐藤砂糖会社が出てきます。
ラクチン！

## エイリアスを検索対象にする

しかしAlfredは初期状態ではエイリアスを検索対象としてくれません。
設定変更しちゃいましょう。

Alfredの設定画面から`[Features > Default Results]`を開き、`[Advanced...]`をクリックします。

![スクリーンショット 2015-10-15 15.17.20.png](https://qiita-image-store.s3.amazonaws.com/0/2513/0016561f-d440-6c50-119c-83bc5d3a5324.png)

小さいウィンドウが表示されるので、適当なエイリアスファイルをドロップします。
そうするとドロップしたファイルのファイルタイプが登録されます。

![スクリーンショット 2015-10-15 15.17.40.png](https://qiita-image-store.s3.amazonaws.com/0/2513/d682d6ca-47cf-c3d5-d6d4-c50ec7779efc.png)

エイリアスが検索対象になりました！

![スクリーンショット 2015-10-15 15.27.49.png](https://qiita-image-store.s3.amazonaws.com/0/2513/9b95177f-838d-6b4f-1f9f-14165d4ce713.png)

# おわり

当初はフォルダにタグを付けて`tags `で検索しようと思ったのですが、

* tags と入力するのが面倒くさい
* 該当タグの一覧から選ぶのが面倒くさい
* どんなフォルダ、アプリが登録されているのかをファイルとして視認したい
* ほかいろいろ

という理由からエイリアスを使うことにしました。
最小限で動画再生したい

AVFoundationを用いた最小限の動画再生してみるだけのコード

```swift
        let bundle = NSBundle.mainBundle()
        let url = bundle.URLForResource("samplemovie", withExtension: "mov")

        self.playerItem = AVPlayerItem(URL: url!)
        self.player = AVPlayer(playerItem: self.playerItem!)

        let playerLayer = AVPlayerLayer(player: self.player)
        playerLayer.frame = self.playerView.bounds
        playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
        self.playerView.layer.addSublayer(playerLayer)

        self.player?.play()
```


playerViewは表示させたいUIView
mac Fluid.app でログインが必要なアプリを使う

Fluidについてはこちら
http://fluidapp.com/

Trello とか Waffle.io のアプリを作った時にログインするとコールバックするときにアプリ内ではなくブラウザで開かれてしまったのでメモ

## 原因
初期設定ではアプリのドメイン以外のブラウズを制限されているせいっぽい

## 解決方法
目的のアプリを開いた状態で一つ設定するだけ

1. menubar > Waffle.io > Preference (⌘ + ,) > Whitelist :heart: 
2. Allow browsing of any URL にチェックする
![Whitelist_Preferences_and_新規投稿_-_Qiita_-_火狐⊂__ω_⊂__.png](https://qiita-image-store.s3.amazonaws.com/0/40717/1c873b95-f9c5-ea3d-77ba-15e38a828633.png)

認証した後はセッションが残るっぽいので再び設定を戻しても大丈夫そう
正規表現で数字と文字の判別

指数表示やnanまでの判別に

```py
import re

def isd(N):
    return bool(re.compile("^[-+]?([0-9]+(\.[0-9]*)?|\.[0-9]+)([eE][-+]?[0-9]+)?$|nan$|^[-+]?inf$").match(N))

for i in ['-3.', '0.', '5..', '0.1', '1', '1e+2', 'b0', '0c', 'test','nan','1ee-3','1.3e-3','1.3e-3.','00.','5.0.','inf']:
	print('{0:9} {1}'.format(i,isd(i)))

```

出力結果

```
-3.       True
0.        True
5..       False
0.1       True
1         True
1e+2      True
b0        False
0c        False
test      False
nan       True
1ee-3     False
1.3e-3    True
1.3e-3.   False
00.       True
5.0.      False
inf       True
```
PyCharmのファイルの文字コード変更

PyCharmでShift_JISのcsvファイルの中身を見たいのに文字コードをどこで変更するのかわからなかった。

![pycharm1.png](https://qiita-image-store.s3.amazonaws.com/0/21492/64adba3d-6700-ffa8-a4ff-68ca47142ea4.png)


![pycharm2.png](https://qiita-image-store.s3.amazonaws.com/0/21492/9ff6f72c-2032-e12c-a6c9-a377cfb04676.png)
開発用 PC を Windows から Linux 変更したときの　各種ソフトの乗り換えまとめ

Windows から CentOS7 に乗り換えて半年経ったので、まとめておきます。
他のディストリビューションでも使えるものが多いと思います。

|項目|Windows|CentOS|備考|
|:--|:--|:--|:--|
|テキストエディタ|[サクラエディタ](http://sakura-editor.sourceforge.net/)|[Bluefish](http://bluefish.openoffice.nl/index.html)|使える正規表現や日本語対応を比較して Bluefish になりました。[Sublime Text](http://www.sublimetext.com/)、 [Atom](https://atom.io/)、 [Brackets](http://brackets.io/)、 [Light Table](http://lighttable.com/)、 [Gedit](https://wiki.gnome.org/Apps/Gedit) あたりが比較対象になると思います|
|GUI な diff|[WinMerge](http://www.geocities.co.jp/SiliconValley-SanJose/8165/winmerge.html)|[Meld](http://meldmerge.org/)|いくつかあって機能も似ているので見た目で選びました|
|簡単なテキスト編集<br>（行ソート、重複行削除、CSV の特定のカラム抽出など）|なし|sort, uniq, cut など|Windows 時代はサクラエディタの独自機能や正規表現で頑張っていました。編集手順をコマンドで残せるようになったのでたまに便利です|
|IDE|省略|省略|有名どころは Windows 版も Linux 版もあると思います|
|日本語入力|MS-IME|[Mozc](https://github.com/google/mozc)|ユーザ辞書の形式は同じです。簡単にデータ移行できます|
|オフィス|[Microsoft Office](http://www.microsoft.com/ja-jp/office/2013/default.aspx)|[LibreOffice](https://ja.libreoffice.org/)|主に閲覧だけ LibreOffice。資料作成はいつもと別のPC（Windows）で Microsoft Office を使うことが多いです|
|簡単な画像編集|[JTrim](http://www.woodybells.com/)|なし|画像の切り抜きや矩形での墨塗りを JTrim ほど簡単に行えるものは見つけられませんでした。妥協して [Pinta](http://pinta-project.com/) を使っています|
|複雑な画像編集|[GIMP](http://www.gimp.org/)|[GIMP](http://www.gimp.org/)||
|スクリーンショット|なし（PrintScreen）|Screenshot (GNOME 環境に付属のもの)|Windows時代は JTrim が便利なので普通に PrintScreen してからクリッピングなどしていました|
|SSH|[PuTTY ごった煮版](http://yebisuya.dip.jp/Software/PuTTY/)|ssh コマンド||
|SCP|[WinSCP](https://winscp.net/eng/docs/lang:jp)|scp コマンド||
|IRC クライアント|[LimeChat](http://limechat.net/)|[HexChat](https://hexchat.github.io/)|ファイル送信を行える IRC クライアントが Linux では多くないようです|
|ブラウザ|[Google Chrome](https://www.google.co.jp/chrome/browser/desktop/index.html)|[Google Chrome](https://www.google.co.jp/chrome/browser/desktop/index.html)||
|ファイル検索|[Everything](http://www.voidtools.com/)|updatedb コマンドと locate コマンド|これは Windows の方が便利です|


代替のソフトを探すときには [alternativeTo](http://alternativeto.net/)というサイトが便利です。
たとえば [LimeChat の Linux での代替を探すならこのように検索出来ます](http://alternativeto.net/software/limechat/?platform=linux)。


# 乗り換えた感想
CentOS に乗り換えてもあまり不便はありません。
改行コードや各種コマンドなどで Windows 特有の色々な事柄に煩わされなくなりました。
トータルで見れば乗り換えて得しました。
[Windows][Win32]ウィンドウ取得時の条件・情報のダンプにつかうやつ

```cpp
#include <sstream>

const auto class_is = [](HWND hwnd, LPCTSTR classname) -> bool {
      TCHAR buffer[MAX_PATH] = { 0 };
      ::GetClassName(hwnd, buffer, MAX_PATH);
      // dump
      OutputDebugString(buffer);

      return _tcscmp(classname, buffer) == 0;
    };

const auto window_is = [](HWND hwnd, LPCTSTR windowtitle) -> bool {
      TCHAR buffer[MAX_PATH] = { 0 };
      TCHAR buffer_c[MAX_PATH] = { 0 };
      DWORD pid;
      ::GetWindowThreadProcessId(hwnd, &pid);
      ::GetWindowText(hwnd, buffer, MAX_PATH);
      ::GetClassName(hwnd, buffer_c, MAX_PATH);

      // dump
      std::basic_ostringstream< TCHAR > oss;
      oss << pid << _T(" : ")
        << buffer << _T(" : ")
        << cbuffer << _T("\r\n");

      //std::wstringstream ss;
      //ss << pid << L" : "
        //<< buffer << L" : "
        //<< buffer_c << L"\r\n";

      OutputDebugString(oss.str().c_str());

      return _tcscmp(windowtitle, buffer) == 0;
    };
```

## ダンプ箇所をTCHAR型に変更
追記：2015/10/16

コメントで教えていただきました。ありがとうございます。ダンプ部分がwstring型になっていたので、
TCHAR型に変更したものに書き換えました。
MacをEl Capitanにして、brewがエラーになった時の対処法

### brewのエラー内容

```zsh
$ brew update
```

```zsh
Error: The /usr/local directory is not writable.
Even if this directory was writable when you installed Homebrew, other
software may change permissions on this directory. Some versions of the
"InstantOn" component of Airfoil are known to do this.

You should probably change the ownership and permissions of /usr/local
back to your user account.
  sudo chown -R $(whoami):admin /usr/local
```

### 解決方法

`You should probably change the ownership and permissions of /usr/local
back to your user account.`
権限を変更したほうがいいかもしれない。

> 参考：「You should probably」：したほうがいいかもしれない
> http://ejje.weblio.jp/content/You+should+probably

と言われたので、
権限を変更。

```zsh
$ sudo chown -R $(whoami):admin /usr/local
```

確認。

```zsh
$ brew update
Already up-to-date.
```
c++ builder XE4, 10.2 Tokyo > TDateTime > 2015 Oct 14のような表示 > 自作

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

FormatString()を使って`2015 Oct 14`のような表示にしたい。

参考
http://www.delphibasics.co.uk/RTL.asp?Name=FormatDateTime

```
Now().FormatString(L"yyyy mmm dd hh:nn:ss")
```

<hr>
よくわからないが、上記を実行しても`Oct`でなく`10`となってしまう場合がある。

`mmmm`として試すと`10月`となる時がある。
Locale関連の設定がJaとENで違うのかもしれない。

<hr>
#try1
上記で希望通りの動作にならないので自作することにした。

1つの方法は以下。

```cpp
static const String kNumToShortName_tbl [][2] =
{
	{"/01/", " Jan "},
	{"/02/", " Feb "},
	{"/03/", " Mar "},
	{"/04/", " Apr "},
	{"/05/", " May "},
	{"/06/", " Jun "},
	{"/07/", " Jul "},
	{"/08/", " Aug "},
	{"/09/", " Sep "},
	{"/10/", " Oct "},
	{"/11/", " Nov "},
	{"/12/", " Dec "},
};

static String ToShortMonthName(String src)
{
	String dst = src;
	for(int idx=0; idx < 12; idx++) {
		dst = StringReplace(dst, kNumToShortName_tbl[idx][0], kNumToShortName_tbl[idx][1], TReplaceFlags()<<rfReplaceAll);
	}
	return dst;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	String srcs[] = {
		L"2015/01/05 12:30:45",
		L"2015/02/11 12:30:45",
		L"2015/03/06 12:30:45",
		L"2015/10/12 12:30:45",
	};
	String dst;

	for(int mi=0; mi < 4; mi++) {
		dst = ToShortMonthName(srcs[mi]);
		Memo1->Lines->Add(srcs[mi] + L" --> " + dst);
	}

}
```

```txt:結果
2015/01/05 12:30:45 --> 2015 Jan 05 12:30:45
2015/02/11 12:30:45 --> 2015 Feb 11 12:30:45
2015/03/06 12:30:45 --> 2015 Mar 06 12:30:45
2015/10/12 12:30:45 --> 2015 Oct 12 12:30:45
```

以下の前提条件が必要
1. 月の表記が`/`で囲われている
2. 1桁の月は0つきで表示 (3月 -> /03/)

他の方法として、月をint型で取得して、配列のインデックスに返す方法などもある。
Docker Install 決定版 for CentOS7


2015/10/15時点でCentOS7にDockerを入れようとすると1.7系が入ってしまうので最新Stableを導入したい時の手順メモ。
これが一番楽だと思います。

## 環境
CentOS7.X minimal install 64bit

## おまじない
これをやっておかないと失敗する場合があった。

* CentOSの標準リポジトリよりDockerをyum install & yum remove

```
$ sudo yum install -y docker
$ sudo yum remove -y docker
```

## Dockerリポジトリの追加
```
cat >/etc/yum.repos.d/docker.repo <<-EOF
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
```

## インストール
```
$ sudo yum install -y docker-engine
```

## 起動
```
$ sudo service docker start
```
UIButtonのグラデーション背景をStoryboard上で設定する

## はじめに
UIButtonの背景にグラデーションをつける場面があったので、Storyboard上で見た目を見ながら設定できたらいいなと思いUIButtonのサブクラスを作りました。

環境：Xcode10.0, Swift 4

## コード

IBDesignableをつけることでStoryboard上で設定できるようになり、設定する変数にはIBInspectableをつけます。
上部の色と下部の色を設定、また枠線の色・太さ、角丸も設定できるようにしてあります。

```swift
import UIKit

@IBDesignable
class BGButton: UIButton {

    var gradientLayer = CAGradientLayer()

    @IBInspectable var startColor: UIColor = UIColor.white {
        didSet {
            setGradient()
        }
    }

    @IBInspectable var endColor: UIColor = UIColor.black {
        didSet {
            setGradient()
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0 {
        didSet {
            layer.cornerRadius = cornerRadius
            setGradient()
        }
    }

    @IBInspectable var borderWidth: CGFloat = 0 {
        didSet {
            layer.borderWidth = borderWidth
            setGradient()
        }
    }

    @IBInspectable var borderColor: UIColor = UIColor.clear {
        didSet {
            layer.borderColor = borderColor.cgColor
        }
    }

    @IBInspectable var startPoint: CGPoint = CGPoint(x: 0, y: 0.5) {
        didSet {
            setGradient()
        }
    }

    @IBInspectable var endPoint: CGPoint = CGPoint(x: 0, y: 1) {
        didSet {
            setGradient()
        }
    }

    private func setGradient() {

        gradientLayer.removeFromSuperlayer()

        gradientLayer = CAGradientLayer()
        gradientLayer.colors = [startColor.cgColor, endColor.cgColor]
        gradientLayer.frame.size = frame.size
        gradientLayer.frame.origin = CGPoint.init(x: 0.0, y: 0.0)
        gradientLayer.cornerRadius = cornerRadius
        gradientLayer.zPosition = -100
        gradientLayer.startPoint = startPoint
        gradientLayer.endPoint = endPoint
        self.layer.insertSublayer(gradientLayer, at: 0)
        self.layer.masksToBounds = true

        imageView?.layer.zPosition = 0

    }

}
```

## 使い方

1. 上記コードを `BGButton.swift` など適当なファイルを作ってコピペしてください。
![スクリーンショット 2015-10-15 13.24.35.png](https://qiita-image-store.s3.amazonaws.com/0/62690/b4c517c8-15db-23fb-8650-95ec93a4fab9.png)

2. UIButtonを配置してCustomClassに上記コードのクラスを設定します。
![u.png](https://qiita-image-store.s3.amazonaws.com/0/93918/1b3d751b-18d4-89c2-c6f8-ada4dc55cce2.png)


上下の色、枠線、角丸、グラデーションの方向をお好みのものに変えます。

※結構時間なく作ったのでおかしなところあるかもです。
あったら教えて下さい。

-- 10/25 追記
imageView設定すると表示されないのを直しました。
golang 製 WAF(Web Application Frameworks) の package 依存状況を見てみた

最近 go で WAF を使いたいのでいろいろ見るとも無く見てたんですが、多くてよくわからないので @hirokidaichi さんの goviz [https://github.com/hirokidaichi/goviz] をつかってパッケージ依存状況をみてみました。

---
- revel

![revel.png](https://qiita-image-store.s3.amazonaws.com/0/25422/bf7941c1-3739-3ea9-0a20-841d80c70e8f.png)

---
- kocha

![kocha.png](https://qiita-image-store.s3.amazonaws.com/0/25422/2ebf5950-8dda-7243-da9e-5af5a71d8fef.png)

---
- martini

![martini.png](https://qiita-image-store.s3.amazonaws.com/0/25422/4e49315c-15f2-fd8d-58a4-76de3d928d33.png)

---
- goji

![goji.png](https://qiita-image-store.s3.amazonaws.com/0/25422/20bd53d1-5b66-1a41-4ba7-942eb18a3fe3.png)


---
- gin

![gin.png](https://qiita-image-store.s3.amazonaws.com/0/25422/f0186580-0d2c-c78c-3798-fd2bb1943439.png)


---
- beego

![beego.png](https://qiita-image-store.s3.amazonaws.com/0/25422/5265400f-b7ee-7fbf-5a1b-1f51bc718f24.png)

---
- kami

![kami.png](https://qiita-image-store.s3.amazonaws.com/0/25422/b6fdf003-f73d-f35d-50ab-95c66a7f3200.png)

---
- echo
![echo.png](https://qiita-image-store.s3.amazonaws.com/0/25422/0e92c575-c6e2-ee70-823e-6d0105512e24.png)

ただ画像にしただけでも、ある程度見えてくるものがありますね。kami, gin は x/net/context つかってんだなとか。kami はルーターは最速と呼ばれる httprouter なんだなとか、martini は全然わからんなとか。beego はかなり自力だなとか。

いいとこどりしてる kami いいすねぇ。star しときました。

✧＼\ g( 'ω' )o /／✧
コマンドプロンプト(powershell)経由でファイルをダウンロード、実行

## コマンドプロンプトに以下貼り付け

```
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('http://hoge.com/sample.ps1'))"
```

* http://hoge.com/sample.ps1 がダウンロードされpowershellで実行される。

## 解説: powershellにて動作

* sample.ps1にて http://hoge.com/sample.exe を `%TEMP%\ps\sample.exe` に保存。
* `%TEMP%\ps\sample.exe`が実行される

```bash:sample.ps1
$url = "http://hoge.com/sample.exe"
if ($env:TEMP -eq $null) {
  $env:TEMP = Join-Path $env:SystemDrive 'temp'
}
$fixTempDir = Join-Path $env:TEMP "ps"
if (![System.IO.Directory]::Exists($fixTempDir)) {[System.IO.Directory]::CreateDirectory($fixTempDir)}
$file = Join-Path $fixTempDir "sample.exe"

function Download-File {
param (
  [string]$url,
  [string]$file
 )
  # Downloading $url to $file
  $downloader = new-object System.Net.WebClient
  $downloader.Proxy.Credentials=[System.Net.CredentialCache]::DefaultNetworkCredentials;
  $downloader.DownloadFile($url, $file)
}

# download the package
Download-File $url $file

# start sample.exe
Start-Process "$file"
```
vim初心者がとりあえず覚えたTips

入社したての頃に書いたメモを供養。使わないと以外と忘れる。

# vimで複数行のテキストをペーストすると階段状にずれた！

pasteモードに切り替える。

```
:set paste
-- INSERT(paste) --
```

pasteを無効にする場合は以下。

```
:set nopaste
```

# Windowsの改行文字をvimで修正したい
WindowsではCR+LF、UnixではLF。
Windowsで編集したファイルをそのままコミットしてしまうとdiffが丸ごと変更になってしまう。
ので、コミット前にCRを削除。

```
$ vi -b foo.txt
```

vim -bにて編集すると^Mが表示される。
^Mは、^とMのキーを押すのではなく、Controlキーを押したまま、vのキーを押し、続いてmのキーを押す。(Controlキー押したままvm)

```
:%s/^M//g
```

# Vimで文字列を置換したい
微妙にフォーマット変換する場合など
title_hogehoge.png → title-hogehoge.png

```
:%s/title_\(\w*\.png\)/title-\1/gc
```

テンプレまるっと置換ワンライナー
ベタURLからuri_forに置換したいときなど

```
%s/"\(\/.*\)"/"[% uri_for\('\1'\) %]"/gc  
```
OSX 10.11 El CapitanでJ-Link LITEが接続できない

OSX 10.11 El Capitanにアップデートした途端にJ-Link LITEが利用できなくなった場合の対処方法です。
（Can not connect to J-Link via USB.）

1) Windows PCを用意する（Parallelsなどの仮想環境では、そもそもOSXでJ-Linkを認識してくれないため対応できません）
2) J-Link Software for WindowsをダウンロードしJ-Linkツールをインストールする
https://www.segger.com/jlink-software.html
3) J-Link Commanderを起動する
4) 起動すると「J-Link V5.02f Firmware update」のダイアログが表示されるので、「はい(Y)」を選択する
5) J-LinkのFirmwareを最新（5.02f）にアップデートする
6) MacにJ-Link LITEを接続する

参考
JLink no longer works under El Capitan?
https://github.com/adafruit/Adafruit_Adalink/issues/14
Swift でOAuthしたい

SwiftでOAuthする方法を調べてるんですが、毎回調べてる気がしてなんかあれなのでまとめました。
もっとたくさんあるかと思ったら意外と無かったので調べ漏れている可能性が高い。

# リポジトリ
* https://github.com/dongri/OAuthSwift
    * 「swift oauth」で検索したら最初に出てきた
    * Carthage, CocoaPods両方対応済み
    * いろんなサービスに対応してるのを推してくる
    * 基本的にiOS Appでやる前提のものっぽい
* https://github.com/p2/OAuth2
    * 
    * OS Xでも動かせるみたい
* https://github.com/Alamofire/Alamofire
    * ライブラリなんか使わねえ！自前でゴリゴリ
    * 完全にイケてないからやめよう

他にいい方法があったらぜひ教えて下さい。
redisのhsetやhget等、hashの扱いメモ

### redisのデータ永続化

```
redis-cli bgsave
```
※バックグラウンド処理版


### redisのデータ全部削除　※扱い注意！
```
redis-cli flushall
```



### hashのキーを指定してデータ取得

#### clearのフィールド名lv200を取得
```
redis-cli HGET clear lv200
```
#### フィールドを指定せずに全部
```
redis-cli HGETALL clear
```



#### hashのフィールドを指定して更新
```
redis-cli HSET clear lv200 1
```

#### hashのフィールドの指定して削除
```
redis-cli HDEL clear lv200
```

#### hashのkey毎削除(扱い注意
```
redis-cli DEL clear
```


## トラブルシューティング

#### hset時に、下記のようなエラーがでたら型違いで、既に同じhash値で登録されている可能性がある

> WRONGTYPE Operation against a key holding the wrong kind of value

僕の場合は、hdelやdelで対象を削除して、インポートし直せばOKでした。
Nexus7(2013)をAndroid 6.0にアップデートしてroot化する方法

##Android 6.0へのアップデートとRootログイン

###Android v6.0:

Android 6.0のイメージです。個別に、`boot.img`,`system.img`,`recovery.img`がありますが、その解凍ファイルを解凍して、この中では、`system.img`のみ`flash`して端末の`system`領域に書き込みます。

https://developers.google.com/android/nexus/images

###Twrp v2.8.7.0:

リカバリモードのイメージです。`flash`で`recovery`領域に書き込みます。

http://teamw.in/project/twrp2/

###SuperSU v2.52:

SuperSUのインストールは、`Twrp`のリカバリモードから行います。具体的には`adb push supersu.zip /sdcard`してから`Install`するか、`Advanced`から`adb sideload supersu.zip`します。

https://download.chainfire.eu/743/SuperSU/BETA-SuperSU-v2.52.zip

###SuperSU Boot:

Android 6.0にSuperSUをインストールするには改造した`booot.img`が必要になります。このイメージを`flash`します。

http://forum.xda-developers.com/apps/supersu/wip-android-6-0-marshmellow-t3219344 (razor)

前提として、開発者モードをONにして、USBデバッグを有効にして、PCと端末をUSB接続、許可しておいてください。

```bash:
$ adb reboot-bootloader

$ fastboot erase system
$ fastboot flash system system.img

# このboot.imgはsupersuのものにしてください。
$ fastboot flash boot m-boot.img

# リカバリをtwrpのカスタムリカバリにします
$ fastboot flash recovery twrp.img
$ fastboot boot twrp.img

# twrpにてadb sideloadを実行します, Advanced - ADB Sideload
$ adb sideload BETA-SuperSU-v2.52.zip

# または、twrpにてinstallします, Install - BETA-SuperSU-v2.50.zip
$ adb push BETA-SuperSU-v2.52.zip /sdcard

$ adb reboot
```

##その他

その他、重要ではない説明を以下で行います。

###開発者モード

`設定 -> タブレット情報 -> ビルド番号`を10回以上タップします。すると、`設定 -> 開発者向けオプション`という項目が表示されます。

###バックアップ

私はバックアップ取りませんでしたが(大して重要なデータもないし)、手動でアップデートする場合は、バックアップが推奨されています。また、この手順でルート化が必ず成功するとは限りません。時にクリーンインストールしてでしか成功しない場合もあるようですし、成功しない場合もあるみたいです。場合によっては、端末が起動しなくなる恐れもありますので、ルート化には自己責任かつ最新の注意を払って行ってください。

###クリーンインストール

ここで解説した方法では、クリーンインストールせずに、個別の設定などは残ります。クリーンインストールとは、いわゆるリカバリのことで、個人データなどは全て削除されます。注意してください。

クリーンインストールする場合は、`flash-all.sh`を使います。Windowsには、`flash-all.bat`が用意さています。

```bash:
$ ./flash-all.sh
```

### CF-Auto-Root

端末によっては、[CF-Auto-Root](https://autoroot.chainfire.eu/)が必要になりますが、Android 6.0に対応しているとは書いてありませんので、実行は自己責任でお願いします。こちらで確認したところ、Android 6.0でも有効に動作し、SuperSUがインストールされRootが有効になりました。

https://download.chainfire.eu/347/CF-Root/CF-Auto-Root/CF-Auto-Root-flo-razor-nexus7.zip

```bash:
$ adb reboot-bootloader

$ chmod +x root-mac.sh

$ ./root-mac.sh
```

###adbコマンド


Android SDK Toolsをインストールしていない場合は、以下の記事で最小構成のインストール方法を書いています。具体的には、パッケージマネージャーをインストールして、adbコマンドが入ったパッケージであるAndroid SDK Platform Toolsをインストールしましょう。

http://qiita.com/syui/items/f24d0a49ecc0ccc1211d

```bash:Macの場合
# バージョンは最新ではないので、URLは自身で取得してください
$ curl -O http://dl.google.com/android/android-sdk_r24.3.3-macosx.zip

$ mv android-sdk-macosx ~/Applications/

# パッケージマネージャーが起動します(起動にはJavaが必要)
$ ~/Applications/android-sdk-macosx/tools/android

# ここで Android SDK Platform Tools をインストールすると android-sdk-macosx/platform-tools/ 以下にadbコマンドなど各種がインストールされます
```

```bash:ArchLinuxの場合
$ yaourt -S android-sdk-platform-tools

$ export /opt/android-sdk/platform-tools
```
iOS9でDebugビルドのみATSを無効化する


Run Scriptに以下のような処理を追加すればいい。

```sh
if [[ $CONFIGURATION == "Debug" ]]; then
    defaults write ${TARGET_BUILD_DIR}/Debug.app/Info.plist "NSAppTransportSecurity" -dict-add NSAllowsArbitraryLoads -bool yes
fi
```

Debugでビルド時はlocalhostに立てたAPIサーバと通信させたい時など、特定のconfigurationのみhttp通信を許容したいとき便利。


Info.plistの設定項目をconfig毎に切り替えるのは環境変数を使う手があるけど、設定の値がString型になってる必要がある。なのでビルド成果物のコピー先でplistを書き換えるようにしてる。