OmniAICreator/Qiita-1.07M huggingface dataset:
[Git]First Push

1. GitHub側でRepositoryをnewする。
2. clone URLをコピーする。
3. 'git remote add origin <コピーしたURL>'
4. 'git fetch'
5. 'git merge origin/master'
6. 'git push origin master'

あと必要に応じて
'git config --global http.proxy proxy.server:8080'

参考
* [ローカルで作ったリポジトリをgithubに初めてpushする方法](http://d.hatena.ne.jp/hyoshiok/20130505/p1)
* [2.5 Git の基本 - リモートでの作業](https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%81%A7%E3%81%AE%E4%BD%9C%E6%A5%AD)
* [GitHub for WindowsをProxy指定して使うには](http://qiita.com/kjunichi/items/33ab532d8514cdab9361)
smallbasicの最強エクステンション

反則技ですが、VBScriptを実行する、自前エクステンションを作りました。
#テスト
```
GraphicsWindow.BackgroundColor = "skyblue"
button = Controls.AddButton("caption", 380, 10)
Controls.SetButtonCaption(button, "run")
mtextbox = Controls.AddMultiLineTextBox(10, 40)
Controls.SetSize(mtextbox, 400, 400)
Controls.ButtonClicked = output
WC = Text.GetCharacter(34)
CRLF = Text.GetCharacter(13) + Text.GetCharacter(10)
code = ""
code = code + "Function setup(a)" + CRLF
code = code + "  Msgbox(a)" + CRLF
code = code + "  setup = " + WC + "a * a" + WC + CRLF
code = code + "End Function" + CRLF
Controls.SetTextBoxText(mtextbox, code)

Sub output
  text = Controls.GetTextBoxText(mtextbox)
  a = Class1.VBSrun(text)
  GraphicsWindow.ShowMessage(a, "vbs")
EndSub
  
```
AWS初心者に贈る〜初心者が押さえておきたいAWS関連コンテンツを使い倒そう〜

**2015年5月14日に開催されました、[JAWS-UG初心者支部 第一回勉強会](https://jawsug-beginner.doorkeeper.jp/events/22161)で講演したスライド内で紹介しているサイトを載せておきたいと思います。**

**スライドはこちらをご覧ください。**
**[◆◆AWS初心者に贈る〜AWS関連コンテンツを使い倒そう◆◆](http://www.slideshare.net/ayumitada126/awsaws20150514-jaws-ugbeginnerayumitadaupload)**


スライドだけ出回るとリンクが古くなってしまったりする可能性もあるので、そのスライドの最後に、このQiitaのTipのURLを載せて案内を流すという対策をとることにしました。

#■スライドに載っているリンク
##１．AWSアカウントについている無料枠を活用しよう
・[AWS無料枠について](http://aws.amazon.com/jp/free/)

・[AWS無料枠の規約](http://aws.amazon.com/jp/free/terms)

・[AWSアカウント作成する上での＄25クーポン付きキャンペーン（5/29まで）](http://aws.amazon.com/jp/campaigns/2015console/)

・[AWS公式サイト：アカウント作成の流れ](http://aws.amazon.com/jp/register-flow/)

・[無料アカウント作成方法（日本語字幕）](https://youtu.be/pDvIXrjtXww)

##２．セルフペースラボを活用しよう
・[無料演習リスト一覧](https://qwiklabs.com/searches/lab?keywords=introduction)

##３．AWS Webinerを活用しよう
・[Webinerスケジュール](http://aws.amazon.com/jp/about-aws/events/#webinar)

・Webiner過去資料
　　・[初心者向け](http://aws.amazon.com/jp/aws-jp-introduction/#beginner_webinar)
　　・[Black Belt Tech Webiner (旧マイスターシリーズ)](http://aws.amazon.com/jp/aws-jp-introduction/#product)


##４．書籍を活用しよう → 詳細は佐々木さんのセッションで
・[Amazonのクラウドエンジニアが選ぶ技術書３５選](http://www.amazon.co.jp/b?node=3517238051)

##５．AWSに関するBlogなど優良なサイト上の情報を活用しよう
・AWS公式ブログ
　　[日本語](http://aws.typepad.com/aws_japan/)
　　[英語](https://aws.amazon.com/jp/blogs/aws/)

・[AWS Solution Architectブログ](http://aws.typepad.com/sajp/)

・[AWS パートナー SAブログ](http://aws.typepad.com/aws_partner_sa/)

・[Developers.IO](http://dev.classmethod.jp/)

・[Developers.IO AWS記事まとめ](http://dev.classmethod.jp/category/cloud/aws/)

##６．Qiitaを活用しよう
・[Qiita AWSタグ](https://qiita.com/tags/aws)


##７．Slideshare,Spekerdeckなどの資料を活用しよう
・[Slideshare](http://www.slideshare.net/)

・[Spekerdeck](https://speakerdeck.com/)


##８．SNS（Twitter、Facebook）で情報収集をしよう
・[今すぐフォローすべきAWS界隈の素晴らしきエンジニア達【2014年版】](http://dev.classmethod.jp/cloud/aws/lets-follow-aws-engineers-now-2014/)

↓↓↓勉強会での発表の後、2015年版まとめができました！↓↓↓

・[今すぐフォローすべきAWS界隈の素晴らしきエンジニア達【2015年版】](http://dev.classmethod.jp/cloud/aws/lets-follow-aws-engineers-now-2015/)


##９．JAWSの他の支部にも参加しよう
・[JAWS-UG公式サイト](http://jaws-ug.jp/)


他にも気が向いたら追記するかもしれません。

リンク切れや追記したほうがよいサイトの提案含め、何か気づいたことがありましたらコメントください。
before_actionってコードの見通しが悪くなるような…

なんでもかんでもbefore_actionに落とし込んでしまうのは良くないと思う。
before_actionの適切な使いどころは？ということでググってみたら…



http://journal.sooey.com/238


> [before_action an anti-pattern?] (http://blog.thefrontiergroup.com.au/2014/02/before_action_an_anti_pattern/)

> Railsのコントローラーにおいて、なんでもかんでもbefore_actionでやるような設計はアンチパターンではないか、という話。

> before_actionでメソッドの呼び出しを宣言的に記述するのと、アクションメソッド内でそれらのメソッドを単純に呼ぶのとで、それぞれのメリット・デメリットを挙げたうえで、「アクションの実行を回避させるようなフロー制御をbefore_actionで書くのはいいと思う。それ以外の、単にデータをロードするためだけのメソッドなどはアクションメソッド内に書こう。コードが少し長くなるけど、そのほうが読みやすくて理解もメンテナンスも簡単だ」とのことです。


あと、こちらでも、同じようなことが述べられているようだ。（追記:2016/05/12）

The biggest Rails code smell you should avoid to keep your app healthy（英語）
https://medium.com/planet-arkency/the-biggest-rails-code-smell-you-should-avoid-to-keep-your-app-healthy-a61fd75ab2d3#.ex0p5aib6


### 追記

セキュリティ的に欠かすことの出来ない処理（ログイン確認のようなもの）は before_action で設定しておくのもありだと思う。
オプトアウト方式で記述しておけば、将来新たにアクションを追加したとしても、その重要な処理を入れ忘れるということがなくなるので。
scikit-image, scikit-learnで画像分割 (Image Segmentation)

この記事のゴールはクラスタリングによる画像分割アルゴリズムを体験することです．対象はcamera manにしましょう．
（全てipython --pylab上で動かします．）

```py
from skimage import data,io
image=data.camera()
io.imshow(image)
```

![camera_original.png](https://qiita-image-store.s3.amazonaws.com/0/37248/ad53e5fa-bf52-c132-5254-cabcaff7199e.png)


クラスタリング対象は各ピクセルです．データ数n，次元数dとしたとき，クラスタリングアルゴリズムを使うには，n×d行列を作らないといけません．今回対象は各ピクセルなのでn=512×512=262144, d=1の262144×1行列をまず作ります．

```py
X=image.reshape((-1,1))
```

これで準備完了です．クラスタリングしましょう．Mean-Shiftクラスタリングを使います．Mean-Shiftクラスタリングはクラスタ数を事前に決める必要がないことから，画像分割に適していると考えられています．こいつはすでにscikit-learnで実装されています．なんて便利なんだろう...．いくつかパラメータがありますが，参考文献に忠実にやってみます．

```py
from sklearn.cluster import MeanShift,estimate_bandwidth
bandwidth=estimate_bandwidth(X,quantile=0.2,n_samples=500)
ms=MeanShift(bandwidth=bandwidth,bin_seeding=True)
ms.fit(X)
```

これでクラスタリング完了です．結果を見てみましょう．

```py
segmented_image=ms.labels_
segmented_image.shape=image.shape
imshow(segmented_image)
#matshow(segmented_image)
```

![camera_segmented.png](https://qiita-image-store.s3.amazonaws.com/0/37248/26cb04be-6486-9a44-af1b-094f18f6f78a.png)

クラスタ数も見てみます．

```py
print len(unique(ms.labels_))
3
```

camera manは3つの部分に分割されました．これがいいのか悪いのかを評価するには正解データが必要ですが，どこかにあるのでしょうか？
Mean-Shiftクラスタリングの性能はbandwidthに大きく依存します．今回はsklearnにbandwidthを推定する関数があったので使ってみましたが，中で何をやっているのか見ていませんのでなんとも言えません．とりあえずscikitシリーズを使って画像分割を体験できたのでよしとします．

ありがとうございました．

# 参考文献
- http://scikit-learn.org/stable/modules/generated/sklearn.cluster.MeanShift.html
- http://scikit-learn.org/stable/auto_examples/cluster/plot_mean_shift.html
数値のスクランブル

一意な番号を割り振りたいが、連番になることを避けたいときに用いる。

C言語で書くとこんな感じ。

```c:

unsigned long function scramble(unsigned long seed) {
  // 好きなスクランブル用の値。
  unsigned long hash_keys = [0x12345678, 0x87654321];
  unsigned long value = seed;

  for(int i=0; i<hash_keys; i++) {
    unsigned long hash = (hash_keys[i] & 0x7fffffff | 0x1);
    // 掛け算して有効範囲分に切り捨て
    value = (value * hash) & 0x7fffffff;
  }

  return value;
}

```



PHPで書くとこんな感じ。

```php:

function scramble($seed) {
  $hash_keys = array(
    0x12345678, 0x87654321
  );

  $value = $seed;
  foreach($hash_keys as $hash) {
    $hash = ($hash & 0x7fffffff | 0x1);
    $value = ($value * $hash) & 0x7fffffff;
  }

  return $value;
}

```

よく忘れかけるのでメモメモ。
任意の数値xに奇数nを掛け算することで数値が巡回する。
奇数n単位で採番してるのと同義って感じですかね。
S3のRedirection RulesをCloudFrontに反映させる設定

#S3とCloudFrontの組み合わせについて
CloudFrontはコンテンツ配信元となるEC2、S3のコンテンツを高速に配信する仕組みです。例えばS3にある画像・動画をCloudFrontを利用して世界各地にあるエッジサーバにキャッシュさせます。エンドユーザが利用する際に、近くに配置されているエッジサーバから配信されるようになり高速のコンテンツ配信ができます。CDN(Contents Delivery Network)の機能を実装できます。

#課題
S3に置いた画像を配信しているサイトがあったとして、サイトに埋め込まれている画像がなくてエラー画像をリダイレクトしたい場合はあると思います。今回は、指定した画像がなかった場合に、エラー画像を表示する設定(S3の設定)と、そのリダイレクト設定をCloudFrontに反映させる方法を書きます。

#S3の設定
S3のStatic Website Hostingを有効して、[Edit Redirection Rules]でリダイレクトの設定をします。今回は、リダイレクト設定の詳細は省きます。
[リダイレクト設定の公式ドキュメント](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/HowDoIWebsiteConfiguration.html)
![スクリーンショット_2015-05-14_20_28_43_1.png](https://qiita-image-store.s3.amazonaws.com/0/58822/f6992538-f00d-960a-0ee4-f9622e1f0eba.png)




###注意点
※正規表現が使えないので、リダイレクト設定が長くなることもあります。
※ルールティングルールの要素で[KeyPrefixEquals]オブジェクトキー名のプレフィックス(接頭)に対するリクエストのリダイレクトができるが、拡張子などの接尾に対するリクエストはできないっぽい。

#CloudFrontの設定
CloudFrontで「ディストリビューション(配布設定)」を作成しますが、[Origin Domain Name]でオリジンサーバを選択する際に、ドロップダウンリストでS3を選択するとリダイレクト設定が有効になりません。


![スクリーンショット_2015-05-14_20_24_43.png](https://qiita-image-store.s3.amazonaws.com/0/58822/eeb4bf74-8a20-d8f4-a51f-20ec2b2b8e45.png)



任意のオリジンサーバを記載することできますので、S3のStatic Website HostingにあるEndpointを記載します。


![スクリーンショット_2015-05-14_20_19_33.png](https://qiita-image-store.s3.amazonaws.com/0/58822/24597711-5aa6-0c76-9e84-b28813ba1683.png)

実際にS3のリダイレクトルールが反映されているか検証します。

##参考URL
めちゃめちゃ勉強になりました。ありがとうございます！！
Amazon S3 + CloudFrontによるYumリポジトリにリダイレクトルールを適用する
http://dev.classmethod.jp/cloud/yum-repo-s3cf-redirect/
CDP:Cache Distributionパターン
http://aws.clouddesignpattern.org/index.php/CDP:Cache_Distribution%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3
SourceTreeコミットを戻す

ターミナルを開いて、破棄したい<commit>を入力する事、
<commit>はSourceTreeの樹形図のコミット列にある番号を参照

**必ず打ち消したいコミット番号を入れること**

git revert <commit>



https://www.atlassian.com/ja/git/tutorial/undoing-changes#!revert



## ■指定ファイルをコミット前の状態に戻すとき

１：SourceTreeの戻したいファイルのコミット番号のひとつ前のコミット番号を参照

２：SourceTreeのターミナルを開いて変更したいファイルのパスまで cdコマンドなどで移動

３：**git** **checkout** **1:で参照したひとつ前のコミット番号** **戻したいファイル名**
[C#]Windowsで書いたソリューションをMacでビルドしたメモ

Windowsで書いたC#ソリューションをMacでビルドするために友人とともにちょっと奮闘しましたので記録しておきます。手早く試したかったので、IDEなどのツールを使わない方法のメモになっています。
使用したソリューションは「冒険者は森に強い」というゲームのソースコードです。[GitHubから参照できます。](https://github.com/NumAniCloud/StrongAdventurer)

##概要

この記事で紹介する順番とは異なります。

1. VisualStudioのソリューション(.sln)やプロジェクト(.csproj)をコンパイルするには`xbuild`コマンドを使う
2. NuGetパッケージを復元するにはNuGet.exeを実行する
3. mono環境で利用できないライブラリの参照をなくす

##brewでmonoをインストール
まだmonoをインストールしていない場合は、まずmonoをインストールする必要があります。友人はパッケージマネージャとしてbrewを使っていたので、それでmonoをインストールしました。次のコマンドでインストールします。

```
brew install mono
```

##NuGetパッケージを復元する
用意したソリューションをビルドするために、NuGetパッケージの復元を行い、ソリューションが依存しているパッケージを復元する必要があります。まずは、復元を行ってくれるアプリケーションであるNuGet.exeを用意します。用意する方法ですが、今回はWebからダウンロードしてくるようにしましょう(友人と試したときは別の方法でした)。[NuGetのサイト](http://docs.nuget.org/consume/installing-nuget)にアクセスし、"Direct Download"からnuget.exeをダウンロードして使うことにします。
![mac1e.png](https://qiita-image-store.s3.amazonaws.com/0/32800/9d4e14b4-e888-75b8-be71-47a8806824f9.png)

ダウンロードしてパスを通すなどの準備をしたら、次のコマンドを実行してください。`mono`コマンドはexeファイルをmac,linux上で実行するためのコマンドのようです。

```
mono NuGet.exe restore Rpg.sln
```

次のようにパッケージの依存関係が解決・インストールされます。

```
Installing 'Ix-Main 1.2.2'.
Successfully installed 'Ix-Main 1.2.2'.
Installing 'CsvHelper 2.10.0'.
Successfully installed 'CsvHelper 2.10.0'.
```

##Mac環境で利用できないライブラリの参照をなくす
パッケージの参照を復元したら`xbuild`コマンドでコンパイルできるのですが、私のソリューションではMac環境で利用できないライブラリへの参照が混入していたようで、アセンブリ参照が足りていない旨のエラーが出ました。

今回のケースでは、テストプロジェクト(`Rpg1.Test`という名前でした)で`Microsoft.VisualStudio.TestTools.UnitTesting`名前空間を参照していたのが原因だったので、テストプロジェクトを丸ごとソリューションのビルドから除外することにしました。ソリューションを管理できるツールがなかったので、ソリューションファイルを直接弄ってテストプロジェクトをビルド対象から外して対処しました。次のように数行削除すればOKです。

```
# 以下の2行を削除した
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rpg1.Test", "Rpg1.Test\Rpg1.Test.csproj", "{3D7A1777-D467-49AA-9CC8-2C76898114E8}"
EndProject
```

##ビルド！

ビルドは`xbuild`コマンドで実行します。引数なしで実行するとカレントディレクトリにあるソリューションをビルドします。

結果：

```
1 Warning(s)
0 Error(s)
```

ビルドが通りました！「冒険者は森に強い」はWindows向けのゲームなので、Macではビルドはできても実行はできませんでしたが、コンソールアプリケーションなどでWindowsで書かれたものをMacで動かしてみたいという人はこのメモを参考にしてみてください。

##NuGet.exeを入手するもう一つの方法
本記事ではNuGetのサイトからダウンロードしましたが、友人と試したときは別の方法を使っていました。まずWindows上のVisualStudioでソリューションを開き、ソリューション エクスプローラーを開いてソリューションを右クリック→「NuGet パッケージの復元の有効化」を実行することで、NuGet.exeを生成しました。本記事でこちらの方法を採用しなかったのは、Windowsが必要なことと、単純に面倒なこと、またVS2015 RCでは「NuGet パッケージの復元の有効化」がメニューに現れなかったことがあります。私はNuGetのサイトからダウンロードする方法を使えばいいと思います。
Prepare JPY amount in Spree Demo

Spree を日本語化するのは下記記事参考ですが…。
[Rails製ECオープンソース「Spree」をRails4でインストール](http://www.moritaro.com/archives/1479)
最後が「日本の商品がないので、商品は表示されなくなった」ではチトさみしい。

というわけで、USD * 100 を JPY の値段にしちゃえ、とタスクを書きました。
`lib/tasks/prepare_ja_demo.rake` に置いて、次のコマンドを叩くと商品が表示されるようになります。

```shell-session
% rake prepare_ja_demo:usd_to_jpy
```

```ruby:lib/tasks/prepare_ja_demo.rake
namespace :prepare_ja_demo do
  desc 'JPY が nil の variant に、USD * 100 を JPY として設定する'
  task usd_to_jpy: :environment do
    Spree::Variant.all.each do |v|
      jpy = v.prices.find_or_create_by(currency: 'JPY')
      next if jpy.amount
      print "#{v.sku} "
      jpy.amount = v.prices.where(currency: 'USD').first.amount * 100
      jpy.save!
    end

    puts ''
  end
end
```

# 実行結果
![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/28376/fe00fd26-757a-af0c-1b8f-d8f68b3f356f.png)
![ダウンロード.png](https://qiita-image-store.s3.amazonaws.com/0/28376/77ac0dc8-9eeb-a37c-1d9a-c066e3a13a43.png)
空白を削除する


普通に今まで、'/([\s]|[\xe3\x80\x80])/'とか、こんな感じでいいと思ってたら、そうでもなかった件が出てきたのでメモ書き

```php
<?php

function remove_white ($str){
  return preg_replace('/(?:[\s]|[\xe3\x80\x80])+/', '', $str);
}

```

半角スペース「 」とタブ「	」とU+3000 の全角スペース「　」だけでいいと思ってたけど、wikipediaの http://ja.wikipedia.org/wiki/スペース を見たらそれだけではない様子。

| U-Point | UTF-8 (in literal) | Name|
|:---|--:|:--| --:|
|U+0009 | \x09 | CHARACTER TABULATION |
|U+0020 | \x20 | SPACE |
|U+00A0 | \xc2\xa0 | NO-BREAK SPACE |
|U+2002 | \xe2\x80\x82 | EN SPACE |
|U+2003 | \xe2\x80\x83 | EM SPACE |
|U+2004 | \xe2\x80\x84 | THREE-PER-EM SPACE |
|U+2005 | \xe2\x80\x85 | FOUR-PER-EM SPACE |
|U+2006 | \xe2\x80\x86 | SIX-PER-EM SPACE |
|U+2007 | \xe2\x80\x87 | FIGURE SPACE |
|U+2008 | \xe2\x80\x88 | PUNCTUATION SPACE|
|U+2009 | \xe2\x80\x89 | THIN SPACE |
|U+200a | \xe2\x80\x8a | HAIR SPACE |
|U+200b | \xe2\x80\x8b | ZERO WIDTH SPACE |
|U+3000 | \xe3\x80\x80 | IDEOGRAPHIC SPACE |
|U+FEFF | \xef\xbb\xbf | ZERO WIDTH NO-BREAK SPACE |

割と種類あるので無理やり対応するとこんな感じ。

```php
<?php

function remove_white ($str){
  return preg_replace(
  	'/(?:'
  	.'(?:\x09)'
  	.'|(?:\x20)'
  	.'|(?:\xc2\xa0)'
  	.'|(?:\xe2\x80\x82)'
  	.'|(?:\xe2\x80\x83)'
  	.'|(?:\xe2\x80\x84)'
  	.'|(?:\xe2\x80\x85)'
  	.'|(?:\xe2\x80\x86)'
  	.'|(?:\xe2\x80\x87)'
  	.'|(?:\xe2\x80\x88)'
  	.'|(?:\xe2\x80\x89)'
  	.'|(?:\xe2\x80\x8a)'
  	.'|(?:\xe2\x80\x8b)'
  	.'|(?:\xe3\x80\x80)'
  	.'|(?:\xef\xbb\xbf)'
  	.')+/',
  	'',
  	$str);
}

```
ActiveModel、ActiveRecordで複数のフィールドを一つの項目としてバリデーターで検証する

郵便番号や電話番号は郵便番号1、郵便番号2といった具合に複数のフィールドに分割してユーザに入力させることもあると思います。この場合、郵便番号・電話番号は一纏めで意味を持つのでバリデーションも対象フィールドを結合した上で実施したいという要望はあると思います。validateでモデル内にバリデーションを記述することもできますが、本社・支店の住所を入力する必要がある場合等には使い回しがし難かったりします。ここでは``ActiveModel::EachValidator``を使用したカスタムばりデータを定義する方法を記載します。

バリデータの定義

```ruby:postcode_validator.rb
class PostcodeValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    # 指定された属性からprefixを取得しグルーピングするため、必ず名前をxxpostcode_1と指定する
    prefix = "#{attribute}".to_s.sub "postcode_1", ""
    postcode_1 = record.instance_variable_get("@#{'%s%s'%[prefix, 'postcode_1']}"
    postcode_2 = record.instance_variable_get("@#{'%s%s'%[prefix, 'postcode_2']}"
    postcode = "#{postcode_1}-#{postcode_2}"
　　# バリデーションエラーならpostcodeという一纏めのエラーとして設定する
   unless postcode =~ /^([0-9]{3}-[0-9]{4})$/
     record.errors.add((prefix + "postcode").to_sym, '入力形式に誤りがあります。')
   end
 end
end

```

呼び元のモデルの定義

```ruby:postcode_validator.rb
class PostModel
  include ActiveModel::Model
  attr_accessor :admin_postcode_1, :admin_postcode_2
  attr_accessor :user_postcode_1, :user_postcode_2

  validates :admin_postcode_1, postcode: true
  validates :user_postcode_1, postcode: true
end
```

バリデータ側で第３引数のvalueを使用せず、第1引数で渡される自分自身からネーミング規約に乗っ取った値を取得しバリデーションのターゲットとして使用しています。
例の場合はpostcodeを**admin_**と**user_**でグルーピングしています。
ImageMagickで画像一括リサイズ

Macのスクショのファイル名にスペース入ってくるのに対応。

~~~ bash
#!/bin/bash

# 画像ファイル一覧
images="${HOME}/Desktop/*.png"
# 出力サイズ
DEST_WIDTH=400
DEST_HEIGHT=400

for image in $images; do
    echo "load ${image}"
    imageWidth=`identify -format "%w" "${image}"`;
    resized="no resize"
    if [ ${imageWidth} -gt ${DEST_WIDTH} ]; then
        convert "${image}" -resize ${DEST_WIDTH}x${DEST_HEIGHT} "${image}";
        resized="complete resized"
    fi
    echo $resized `identify -format "%wx%h" "${image}"`;  
done
~~~
HOSTからIPaddressを取得する<C#>

C#言語でHOSTからIPaddressを取得するコードを書いてみましょう。
using等は省略します。

～～～～～～～省略～～～～～～～
Console.Write("ホスト :: ");
var host = Console.ReadLine();

IPHostEntry ih = Dns.GethostEntry(host);

foreach(IPAddress ip in ih.AddressList)
{
    Console.WriteLine(ip);
}

～～～～～～～省略～～～～～～～

こんな感じですね。
これでHostからIPaddressを取得できます。
Qiita:Teamのページを印刷するときに余計な部分を隠すChrome拡張

# はじめに
Qiita:Teamのページを印刷するときに余計な部分が含まれていて、ごちゃごちゃするため、Qiita:Teamのページを印刷するときは自動的に簡素な印刷スタイルが適用されるChrome拡張を作ってみました。


# インストール
- Chrome拡張ファイルを[ダウンロード](https://github.com/kouda-isao/qiita_print_formatter/blob/master/qiita_print_formatter.crx)
- ダウンロードしたcrXファイルをChromeにドラッグ＆ドロップ

# 使い方
- Qiita:Teamをブラウザで開いて、普通に印刷するだけです

# 注意事項
- 印刷する際に必ず印刷フォーマットが適用されてしまうため、普通に印刷したい際には拡張機能を無効にしてください

# ソースコード
[qiita_print_formatter](https://github.com/kouda-isao/qiita_print_formatter)

# ご協力
- [sora0077@github](http://qiita.com/sora0077@github)さん、ご協力ありがとうございました！
- [kui](https://github.com/kui)さん、[JS](https://gist.github.com/kui/e769a01743c3a58d49b0)利用させていただきました。ありがとうございます！
Poderosaでoh-my-zshを使うと2行目以降で文字がずれる問題

## 概要

ターミナルソフト「Poderosa」でoh-my-zshの標準テーマであるrobbyrussellを使うと、なぜか2行目に突入すると文字がずれるバグが発生した。

## 問題

```shell-session
➜  hoge git:(hogehoge) ✗ git checkout hogepiyohogepiyohogepiyohogepiyohogepiyohogepiyohogepiyohogepiyohogepiyohogepiyohogepiyohogepiyohogepiyohoge
```

ここまで入力して、改行されて2行目に到達し、

```shell-session
➜  hoge git:(hogehoge) ✗ git checkout hoge
```

ここまで削除しEnterを押下すると、hogepブランチは存在しませんとのエラーが出力される。

**つまり2行目に突入するとプロンプトの表示がずれる**

## 解決策

prompt左側の「➜」とprompt右側の「✗」を削除する。

```shell-session
$ vi .oh-my-zsh/themes/robbyrussell.zsh-theme

### 変更前
PROMPT='${ret_status}%{$fg_bold[green]%}%p %{$fg[cyan]%}%c %{$fg_bold[blue]%}$(git_prompt_info)%{$fg_bold[bl
ue]%} % %{$reset_color%}'

ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[blue]%}) %{$fg[yellow]%}✗%{$reset_color%}"


### 変更後
PROMPT='%{$fg_bold[green]%}%p %{$fg[cyan]%}%c %{$fg_bold[blue]%}$(git_prompt_info)%{$fg_bold[bl
ue]%} % %{$reset_color%}'

ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[blue]%})%{$reset_color%}"
```

## まとめ

たぶん2byte文字だったから？なんにせよ解決したのでよかった。
ChefでCentOS6とCentOS7を判定して条件分岐する方法

## おさらい

OSのタイプやバージョン番号を取得するには、

* node[:platform_family]
* node[:platform_version]

などの値を参照すればよいです。

これらの情報はohaiが収集してくれたものです。

まず適当なレシピを作ってこれを確かめてみるとよいでしょう。

## バージョン情報を取得するレシピ

```ruby:default.rb
log ":platform_family = " + node[:platform_family]
log ":platform_version = " + node[:platform_version]
log ":platform_version.to_i = " + node[:platform_version].to_i.to_s
```

## 実行結果

### CentOS 6.6

```
  * log[:platform_family = rhel] action write

  * log[:platform_version = 6.6] action write

  * log[:platform_version.to_i = 6] action write
```
### CentOS 7.1

```
  * log[:platform_family = rhel] action write

  * log[:platform_version = 7.1.1503] action write

  * log[:platform_version.to_i = 7] action write
```

CentOS7からバージョン番号にパラダイム変化が起きているのが要注意点です。(1503はUbuntu的な年月のアレか？）

## メジャーバージョンで分岐させる方法

バージョン番号を`to_i`で整数に変換すると、分岐しやすくなります。

```ruby:default.rb
if platform_family?('rhel') && node['platform_version'].to_i == 7 then
  log "this is rhel 7"
elsif platform_family?('rhel') && node['platform_version'].to_i == 6 then
  log "this is rhel 6"
end
```

これでうまく行きました！
iOS Safariで、ページ遷移を伴うページ内リンクが動作しない問題をjQueryで何とかする


# 現象

```html
<a href="hoge.html#huga">ほげ</a>
```

のような、ページ遷移を伴うページ内リンクが、iOS Safariにて上手く動作せず、遷移後のURLを見ると
`http://sample.com/hoge.html`
って感じでハッシュが削除されてしまう。
どうやらiOS Safariの仕様らしいので、jQueryでなんとかした。

# 対処
該当するaタグのhrefからハッシュの値を取り出して、代わりにクエリパラメータとして付与

```html
<a href="hoge.html#huga">ほげ</a>
↓
<a href="hoge.html?js-hash=huga">ほげ</a>
```

クエリパラメータ`js-hash`を持ってアクセスしたときに、その値と一致するidを持つ要素にスクロールするようにした。

# コード

下記のコードを全ページで読み込ませた。

```javascript
$(function(){
	var ua = navigator.userAgent;
	//iOSのみ対応
	if(/iPhone/.test(ua) || /iPad/.test(ua)) {
		//ページをまたいだページ内リンクのハッシュをクエリパラメータに変換
		$('a[href*=#]').each(function(){
			var orgHref = $(this).attr('href');
			var index = orgHref.lastIndexOf("#");
			//通常のページ内リンクは対象外とする
			if(index != 0) {
				var hash = orgHref.substr(index).substr(1);
				var href = orgHref.substr(0,index);
				if(href.match(/\?/)) {
					var connector = '&';
				} else {
					var connector = '?';
				}
				$(this).attr('href',href + connector + 'js-hash=' + hash);
			}
		});
		//クエリパラメータに[js-hash]が存在したときの処理
		if(getQueryVariable('js-hash')) {
			var target = $('#' + getQueryVariable('js-hash'));
			offsetTop = target.offset().top;
			$('html, body').animate({scrollTop:offsetTop}, 500);
		}
	}

	//指定したクエリパラメータの値を返す
	function getQueryVariable(variable) {
	  var query = window.location.search.substring(1);
	  var vars = query.split("&");
	  for (var i=0;i<vars.length;i++) {
	    var pair = vars[i].split("=");
	    if (pair[0] == variable) {
	      return pair[1];
	    }
	  }
		return(false);
	}
});
```

# 参照ドキュメント
クエリパラメータ取り出し方はこちらを参照した
https://css-tricks.com/snippets/javascript/get-url-variables/
Spree Commerse で製品を体系化するには (パート1)

[How to Organize Products with Spree Commerce (Part One)](http://resolve.digital/blog/posts/how-to-organize-products-with-spree-commerce-part-one) を翻訳したものです。
***
![Tシャツ](https://resolve.digital/images/full/t-shirts.png)
Spree Commerse では「製品 (product)」の直感的概念を、5つのより抽象的コンセプトで拡張しています。ariants, taxons, プロパティ (properties), オプション (options), プロトタイプ (prototypes) です。これらのコンセプトがどのように関連し、買い物をする客, 管理する商店経営者, メンテナンスする開発者が簡単にストアを構築するかを説明します。
# 知らなければならない重要なこと: 製品と変形
絵文字Tシャツを販売するオンラインストアを持っているとします。数百のデザインのTシャツがあります。

一般的に言って、ほとんどの顧客は、主にデザインをもとにしてTシャツを選択します。 **Spree では、それぞれのデザインを別々の製品 (product) として扱います。**

しかし、最高の個性を表現したい顧客がいる以上、単に絵文字のデザインを選択することがショッピング体験の終わりでは困ります。Tシャツにはそれぞれ違うサイズ, 色, フィット感があります。顧客は mug-of-beer (1杯のビール) Tシャツを買うために店を訪れるかもしれませんが、実際にカートに入れるのは、赤の XL メンズ mug-of-beer Tシャツだったり、小サイズの青のレディス mug-of-beer Tシャツだったりするでしょう。こういった製品の微妙な差は変形 (variant) として表します。変形は顧客が実際に購入する具体的な項目です。
# 製品をブラウズするが、変形を買う
![製品と変形](https://resolve.digital/images/full/products-variants.png)
ここが重要なポイントです。購入する商品を特定するのは、製品 (products) ではなく、変形 (variants) なのです。少なくとも Spree の中では、様々な変形のグループをまとめるのは製品だけなので、顧客が望む商品を見つけるためのカットオーバーが簡単にできます。

Spree の管理インタフェースでは、製品と変形の間を明確に区別していません。全ての製品で変形を無視するところが良いのです。しかしそうすると、顧客をナビゲートするのが難しくなるでしょう。非標準的な方法で製品をグループ化し、この概念の再発明をしてしまいがちです。
# 変形を理解する
Spree では、全ての製品 (product) は少なくともひとつの変形 (variant) を持ちます。これはすぐには明確にはなりません。
![](https://resolve.digital/images/full/new_product.png)
Spree で製品を作成すると、 **「マスター変形 (master variant)」をも作成することになります。** 新しい製品の情報はマージされ、マスター変形として単一の形態となります。名称, プロトタイプ, 販売開始日 (Available On date), 配送カテゴリ (Shipping Categories) フィールドは製品にひも付きます。SKU とマスター価格 (Master Price) はマスター変形にひも付きます。 **Spree の管理インタフェースではマスター価格について操作できません。**

変形を追加すると、これらのフィールドが自然に結びつくのが明確になるでしょう。製品を変更することが無いよう、合理的に期待されることです。例えば、書籍を販売するとき、ハードカバーか、ペーパーバックか、電子書籍かで値段を変えたいときです。従って、値段 (price) は、製品全体ではなく、それぞれの変形に紐付かねばならない特性となります。

**変形の最も重要なフィールドは SKU です。** これは変形を一意に特定するコードであるべきで、これによって在庫を管理し、顧客の注文に答えます。

Spree ではどんなフォーマットの SKU も受け付けます。eコマース・サイトを立ち上げようとする企業はたいてい既存のシステムを持っていますが、特に納入業者が識別子を定義している場合、そのまま用いるようにするのがベストです。

Spree では SKU を全く用いない変形も使えますが、全ての製品に SKU を使うことを強く推奨します。

# 製品を理解する
**Spree では製品 (product) には2つの役割があります。** 1つ目は紐づく変形 (variants) を一緒にグループ化することです。2つ目は変形に共通する情報を保存することです。

製品名と製品の説明は合理的に明らかです。たいていは製品ごとにページがあるので、製品には固有の slug があります。slug は製品固有の URL に用いられます。デフォルトでは以下のようになります。

`www.mystore.com/products/slug-for-the-product`

利用可能日 (available on date) を用いることで、その製品の発売日をコントロールできます。これを空白にするか未来の日付にすると、顧客はサイト上でその製品を見ることはできません。

**taxon が製品を紐付けることができます。** taxon (とそれらが属する分類[^taxonomies]) についてはまた別の記事にすべきですが、手短に説明すると、カテゴリとタグのことで、顧客はこれを使って製品をブラウズすることができます。家具を売る場合、室内家具, 寝具, オフィス家具といった taxon を使います。またテーブル, 椅子, ベッド, デスクといった分類も要るでしょう。ブランド, 価格帯といったどんな分類にも taxon は使えます。taxon は階層化されたカテゴリとサブカテゴリとしても使えますし、特売製品 (featured products) の様にフラットな集合としても使えます。

**製品にはプロパティがあります。** 全てのサイトで使われているわけではありませんが、目玉商品のテーブルを手軽に作れます。

最後に、 **製品にはオプションがあります。** (オプション・タイプともいいます。)製品と変形のリレーションシップに足りないところがあると感じたら、オプションがそのミッシング・リンクです。

この記事の **その2** では Spree の変形, オプション, プロトタイプを予定しています。Don't miss it! すぐに満足したいなら、[PDF](http://resolve.digital/services/spree-commerce) をダウンロードして下さい。

[^taxonomies]: taxonomies
pythonメモ

```py:Test.py

# テスト用の多次元リストを生成
xss = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

print xss

# まずは通常のループで出力
yss = []
for xs in xss:
    ys = []
    for x in xs:
        ys.append(x * 2)
    yss.append(ys)
print yss

# リスト内包表記で出力
print [[x * 2 for x in xs] for xs in xss]

# フラット出力（1次元配列に変更）
print [x * 2 for xs in xss for x in xs]

# set出力
print {x / 2 for xs in xss for x in xs}

# 辞書出力
print {x:str(x * 2) for xs in xss for x in xs}

# ジェネレート出力
it = (x * 2 for xs in xss for x in xs)
print it.next()
print it.next()

def gen():
    for xs in xss:
        for x in xs:
            yield x * 2
it = gen()
print it.next()
print it.next()

# ソートテスト
print sorted(gen())
print sorted([[x * 2 for x in xs] for xs in xss], reverse=True)
print [1, 2] == [1, 2]
print [1, 2] < [1, 2, 3]
print [1, 2, -1, 3, 4] > [1, 2, 3]

# 可変長引数
# *がリスト
# **が辞書
def f(*args, **kwargs):
    print args
    print kwargs

f(1, 2, 3, a=10, b=20, c=30)

# いろいろな引数の引き渡しテスト
def g(a, b, c):
    print a, b, c

g(10, b=20, c=30)

x = [1, 2, 3]

# 通常の渡し方
g(x[0], x[1], x[2])

# リストとしての渡し方
g(*x)


y = {'a': 10, 'b': 20, 'c': 30}
# 通常の渡し方
g(a=y['a'], b=y['b'], c=y['c'])

# 辞書としての渡し方
g(**y)
x = [1]
y = {'b': 20, 'c': 30}
g(*x, **y)

# formatテスト
print '{hoge} {fuga}'.format(hoge=10, fuga=20)
print '{0} {1}'.format(*(value for value in range(0, 2)))

```
Golangで文字コード判定


Kobito for Windows が公開されたので、動作確認と自作プログラムの宣伝も含めて一つ記事を投稿してみます。

最近Golangで「[HighBatch]」 というバッチ管理用のJobSchedulerを作っているんですけど、その中で文字コードの判定が必要になってきました。

LinuxもOSXもWindowsもサーポートしようとすると、WindowsでのSJISファイルが問題になってきます。
他のOSだったら仮にEUCJPとかで問題になっても「今どきEUCJPかよ、UTF8にしろよ」って言えば済むのですが、Windowsだけはどうにもなりません(もしかして環境変数とかで変えられる？)。

そこでSJISとUTF8の判定だけでもいいので文字コードを推測(Guess)できるライブラリを探してみたのですが、標準では持ってない感じですね。  
他にいい方法がないか探したところ、なかなかいい情報が無い。

そんな中、 @mattn さんの [jvgrep](https://github.com/mattn/jvgrep/) の中で日本語の文字コードを推測してるコードを見つけました。  
該当のコードは [jvgrep.goの212行目](https://github.com/mattn/jvgrep/blob/master/jvgrep.go#L212) あたりになります。

上記のコードの中ではUTF16の判定やGrep作業なんかも入っているのですが、要は候補の文字コードでバッファに書き込んでみてエラーが発生しなければその文字コードは正しいと判断しているようです。

該当箇所を簡単にして抜き出してみると、

```golang.go
func readAssets(str string) (string, error) {
	body, err := ioutil.ReadFile(str)
	if err != nil {
		return "", err
	}

	var f []byte
	encodings := []string{"sjis", "utf-8"}
	for _, enc := range encodings {
		if enc != "" {
			ee, _ := charset.Lookup(enc)
			if ee == nil {
				continue
			}
			var buf bytes.Buffer
			ic := transform.NewWriter(&buf, ee.NewDecoder())
			_, err := ic.Write(body)
			if err != nil {
				continue
			}
			err = ic.Close()
			if err != nil {
				continue
			}
			f = buf.Bytes()
			break
		}
	}
	return string(f), nil
}
```

な感じで、SJISかUTF8かを判定してUTF8の文字列を取得できるようです。

実際に開発中の [HighBatch] でもSJISとUTF8の判定に利用していますが問題さそうです。

出来れば Golang の基本ライブラリだけで推測して自動変換してもらえると楽なんですけど、自動変換はバグの温床になりそうなので将来的にも対応はなさそうですね。

ちなみに、 [HighBatch] は 

> WebUI を持ったバッチ処理等を管理するシンプルなジョブスケジュールシステム

です。

興味のある方は [こちらのスライド](http://www.slideshare.net/NobuhitoSato/highbatch) もどうぞ！

以上、Golangでの文字コード判定方法 と [HighBatch] の宣伝でした。

[HighBatch]: https://github.com/nobuhito/HighBatch/
iOS + ESS


前回の続き。Apple iOSは802.11kに対応しているらしい。実は802.11kの仕様は結構大きい。ざっくり「電波監理系の強化」だけれども、サービス管理として使われるActionとしては次の3つ：

* Radio Measurement
* Link Measurement
* Neighbor Report

Appleのドキュメントには"nearby AP"を探すのに使っているという事で、おそらくNeighbor Reportに対応していると推測できます。より突っ込んだことについては、Ciscoの[Best practice](http://www.cisco.com/c/en/us/td/docs/wireless/technology/vowlan/bestpractices/EntBP-AppMobDevs-on-Wlans.html)ドキュメントにあります。さすがCisco。

iOSがhandoffするときに、自分でSCANをかける代わりに、Neighbor reportで移動先を決めるという事ですね。電波環境にとっては、確かにProbe request/replyが何度も飛び交うよりもNeighborで一度で決めてしまったほうが負荷は低いですね。
特定のフォルダ内に格納したzipファイルをファイル名をフォルダとして格納する

# 内容

大量に落としたファイルを一気に解凍したい用事ってありませんか? ありますよね、さらに__「格納先はファイル名と同じフォルダにしたい」__
となると困りませんか?
こんなコマンドで終わってしまいます

```lang:all_unzipd.sh
ls -Q *.zip |xargs -I {} echo {} | sed -e "s/.zip//" | xargs -I {} unzip -d {} {}".zip"
```

無駄にxargsを2回走らせてるのでスマートなやり方募集中

## 参考リンク
[zip内日本語ファイル名の文字化け対策＋α | 忘れっぽい職業プログラマの備忘録](http://conn314.seesaa.net/article/199415530.html)
[シェル・スクリプト・リファレンス - 【 文字列を置換する「sed」 】：ITpro](http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231161/)
AWS(RDS MySQL)のリードレプリカ作成が遅延した

お世話になります。
[AWSキッチン](http://aws.lepra.jp/)のシェフです。

リードレプリカ作成時に困ったことがあったので、その事を書こうと思います

リードレプリカ作成開始してから7時間以上しても完了していない状況が起きたことがありました。

MySQL では、デフォルトはオートコミットが有効なのです。遅延発生時は、オートコミット無効にするためParameter Group で"autocommit = 0"と設定してました。

これの影響を受けてリードレプリカを作成しが遅延したようです。


回避方法としては、一時的に"autocommit"を"1"に変更しリードレプリカ作成が完了してから戻すという方法で、
リードレプリカ作成が正常に完了しました。
XenCenterを使ってXenServer 6.5にSP1を当てた時の記録


pingを打ちっぱなしにしたら該当するサーバーのUpdate時に、一時的に他のサーバーにLiveMotionされた。
その時に12発分pingがおちたTCPのコネクションは「当然」維持されている。

64 bytes from 172.27.XXX.YYY: icmp_seq=1287 ttl=63 time=0.495 ms
64 bytes from 172.27.XXX.YYY: icmp_seq=1288 ttl=63 time=0.652 ms
64 bytes from 172.27.XXX.YYY: icmp_seq=1289 ttl=63 time=0.420 ms
64 bytes from 172.27.XXX.YYY: icmp_seq=1290 ttl=63 time=0.421 ms
64 bytes from 172.27.XXX.YYY: icmp_seq=1291 ttl=63 time=0.501 ms
64 bytes from 172.27.XXX.YYY: icmp_seq=1292 ttl=63 time=0.412 ms
Request timeout for icmp_seq 1293
Request timeout for icmp_seq 1294
Request timeout for icmp_seq 1295
Request timeout for icmp_seq 1296
Request timeout for icmp_seq 1297
Request timeout for icmp_seq 1298
Request timeout for icmp_seq 1299
Request timeout for icmp_seq 1300
Request timeout for icmp_seq 1301
Request timeout for icmp_seq 1302
Request timeout for icmp_seq 1303
Request timeout for icmp_seq 1304
64 bytes from 172.27.XXX.YYY: icmp_seq=1305 ttl=63 time=0.622 ms
64 bytes from 172.27.XXX.YYY: icmp_seq=1306 ttl=63 time=0.442 ms
64 bytes from 172.27.XXX.YYY: icmp_seq=1307 ttl=63 time=0.399 ms
64 bytes from 172.27.XXX.YYY: icmp_seq=1308 ttl=63 time=0.357 ms
64 bytes from 172.27.XXX.YYY: icmp_seq=1309 ttl=63 time=0.434 ms
64 bytes from 172.27.XXX.YYY: icmp_seq=1310 ttl=63 time=0.336 ms
c++ builder XE4 > smtp.gmail.comでの送信 | 10.2 Tokyoの場合

```txt:動作確認
C++ Builder XE4
```


#関連情報

関連情報は以下。

http://www.gesource.jp/programming/bcb/97.html


http://stackoverflow.com/questions/22517724/gmail-failing-with-connection-closed-gracefully-using-indy-in-delphi-xe-on-win

> Also keep in mind that setting the UseTLS property may change the Port property, so it is best to set UseTLS before setting Port rather than the other way around.

#google側の設定変更
安全性の低いアプリのアクセスをONにしないと失敗する。
[google設定の変更](http://qiita.com/7of9/items/2c91ee7335f07db49889)

#本文の文字化け (C++ Builder)
メール本文の文字化けについては以下が参考になる。
[C++Builder XEのIndy10のメール送信の動作がおかしい（Delphi XEのIndy10は問題ない）](http://www.gesource.jp/weblog/?p=4507)

> 下記のコードを追加して、プロジェクトオプションの「実行時パッケージを使って構築」をチェックを外すと、問題が発生しなくなります。

```
#include <IdHeaderCoder2022JP.hpp>
#pragma link "IdHeaderCoder2022JP"
```


#サンプルコード (XE4で動作確認済み)

```.cpp
#include <Idglobal.hpp>
#include <IdSMTP.hpp>
#include <IdSSLOpenSSL.hpp>
#include <IdHeaderCoder2022JP.hpp>
#pragma link "IdHeaderCoder2022JP"
...
void __fastcall TForm1::IdMessage1InitializeISO(System::WideChar &VHeaderEncoding,
		  UnicodeString &VCharSet)
{
	VHeaderEncoding = L'B';
	VCharSet = "ISO-2022-JP";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{

	TIdSMTP* smtp = new TIdSMTP(NULL);
	TIdSSLIOHandlerSocketOpenSSL * sslHandler = new TIdSSLIOHandlerSocketOpenSSL(NULL);

	smtp->Host = L"smtp.gmail.com";
//	sslHandler->Host = smtp->Host;
//	sslHandler->Port = smtp->Port;
//	sslHandler->Destination = sslHandler->Host + L":"
//		+ IntToStr(sslHandler->Port);
	smtp->IOHandler = sslHandler;
	smtp->Username = kMyUserName;
	smtp->Password = kMyPassword;
	smtp->Port = 587;
	smtp->UseTLS = utUseExplicitTLS;

	try {
		smtp->Connect();
	} catch (const Exception &e) {
		String msg = e.Message;
		int nop=1;
	}
	int nop38=1;

	TIdMessage* msg = new TIdMessage(NULL);
	msg->OnInitializeISO = IdMessage1InitializeISO;
	msg->ContentType = "text/plain";
	msg->CharSet = "ISO-2022-JP";
	msg->ContentTransferEncoding = "BASE64";
	msg->From->Name = kFromName;
	msg->From->Address = kFromAddr;
	msg->Recipients->EMailAddresses = kRecipients;
	msg->Subject = "テストメール";
	msg->Body->Text = "テストメールの本文です";

	try {
		smtp->Send(msg);
	} catch (const Exception &e) {
		String msg = e.Message;
		int nop69=1;
	}
	int nop71=1;

	smtp->Disconnect();
	delete msg;
	delete smtp;

	int nop=1;
}
```

kMyUserName, kMyPassword, kSendTo, kFromName, kFromAddr, kRecipientsはString型でそれぞれ定義しておいた。

sslHandlerのHost, Port, Destinationは[SO](http://stackoverflow.com/questions/22517724/gmail-failing-with-connection-closed-gracefully-using-indy-in-delphi-xe-on-win)の以下を見ると、コメントにしていてもよさそう。実際にコメント状態でメール送信がされることは確認済み。

> Also, You do not need to set the IOHandler's Host, Port, or Destination properties.  Connect() will handle that for you.
 
### 10.2 Tokyo対応
(追記 2018/01/10)

10.2 Tokyoの場合は以下の方法で送信できた。

- [C++ Builder 10.2 Tokyo > Indy > OpenSSL > Error: Could not load SSL library > libeay32.dllとssleay32.dllが関連](https://qiita.com/7of9/items/ac616e9bc593c270b5f2)
Sony Add-on SDK 3.0を最新のSDK Version(22)で使用する(非公式)


Sony Add-on SDK 3.0使ってるプロジェクトでLeakCanary使いたかったが、SDK Versionが21以上じゃないと使えなかった。
というわけで、SDK Version 22なSony Add-on SDKを作ってみた。
(他にも、SmallAppで最新のAPIを使用したい場合などにも使えるかも)
<br />
とりあえず、自分が使ってる限りでは動いているようですが、不具合がある可能性もありますので、試す方は __自己責任__ で。

-

Android SDKをインストールしたフォルダに移動して、

add-ons/addon-sony_add-on_sdk_3_0-sony-19

フォルダをコピーして、

add-ons/addon-sony_add-on_sdk_3_0-sony-22

にリネームする。

<br />

add-ons/addon-sony_add-on_sdk_3_0-sony-22/source.properties

をテキストエディタで開き、

```
AndroidVersion.ApiLevel=19
```
の19を22に変更。

<br />

add-ons/addon-sony_add-on_sdk_3_0-sony-22/manifest.ini

をテキストエディタで開き、

```
api=19
```
の19を22に変更。


-

Sony Add-on SDKを使用するプロジェクトのbuild.gradle内の

```
compileSdkVersion "Sony:Sony Add-on SDK 3.0:19"
```
の19を22に変更。
Let's build!!
Selenium WebDriver　ブラウザのパスが見つからない

# 環境
+ PC (OS:Windows7)
+ Java (1.7)
+ Selenium WebDriver (2.42.2)

# エラー

+ WebDriverからFirefoxを起動する際、下記エラーが発生。

    ```
Caused by: org.openqa.selenium.WebDriverException: Cannot find firefox binary in PATH. Make sure firefox is installed. OS appears to be: XP
    ```

# 対応

+ オプションでFirefoxのパスを指定。

    ``` java
> java -jar selenium-server-standalone-2.42.2.jar -Dwebdriver.firefox.bin="C:\apps\Mozilla Firefox\firefox.exe"
    ```

# 参考にしたページ
+ http://stackoverflow.com/questions/20950748/cannot-find-firefox-binary-in-path-make-sure-firefox-is-installed
[exFAT] ubuntu14.04(Linux Mint 17.1)でのexFATのマウント方法

##経緯
NW-A16にはWalkmanで恐らく（間違ってたらごめんなさい）初めてmicroSDに対応したので・・・
flacの高音質なハイレゾ音源を入れるために64GBのmicroSDXCを買ったわけだ。
そして、NW-A16でmicroSDXCをフォーマットするともれ無くexFATでフォーマットされてデフォルトのubuntu系（むしろLinux）では読めません。

というわけで、[ここ](http://itlx.ldblog.jp/archives/52048765.html)を参考にしてexfat-fuseとexfat-utilsをインストールしようにもコメント欄にあるようになぜか意味不明な公開鍵が出現し、リポジトリが登録され無い模様。

まぁ、Windowsじゃないんだしそういうこともあるさ。
というわけで、ならば手動で！！

##追記（2015年12月6日）
普通にmakeができるようになったようなので[こちら](https://github.com/relan/exfat)のページから普通にソースインストールすればできるようになったようです。

以下の記事の必要性はないですが、過去ログとしておいておきます。


## ~~手動でのexfat-fuseとexfat-utilsのインスコ方法~~
### ~~[Downloads - exfat](https://code.google.com/p/exfat/wiki/Downloads?tm=2)~~
~~上記リンクより最新版のexfat-fuseとexfat-utilsを落とします。~~
~~2015/05/14現在最新はexfat-utils-1.1.1.tar.gzとfuse-exfat-1.1.0.tar.gz~~

### ~~展開しましょう~~
~~ダウンロードしたファルダに`cd`してください。~~

~~```
tar xfz exfat-utils-1.1.1.tar.gz
tar xfz fuse-exfat-1.1.0-.tar.gz
```~~

### ~~インスコに必要なものを集める~~

~~```
sudo apt-get install fuse libfuse-dev scons
```~~

### ~~インスコ~~

~~```
cd fuse-exfat-1.1.0
sudo scons install
cd ../exfat-utils-1.1.1
sudo scons install
```~~

~~以上です。~~

~~インスコに関しては[展開しましょう](#展開しましょう)で同階層で2つのファイルを展開してることが前提なのでそれ以外の場所で展開したのなら`cd`のパスを適宜変更してください。~~

~~これでマウントできます。~~

##使い方
コマンドなら・・・

```shell-session
sudo mount.exfat-fuse /dev/sdXn /mnt/exfat
```

/etc/fstabに書くなら・・・

```shell-session
UUID=[uuid]   /home/share   exfat-fuse   async,auto,dev,exec,rw,suid,nouser   0   0
```

上手にできました〜。

##参照URL
[Ubuntu 14.04 でexFATをマウントする方法](http://itlx.ldblog.jp/archives/52048765.html)
[exFatの外付けドライブを任意のユーザーでマウント](http://asithink001.blogspot.jp/2013/05/exfat.html)
[HOWTO - exFAT - Quick Start Guide](https://code.google.com/p/exfat/wiki/HOWTO)
gmail > smtp送信 > Username and Password not accepted. Learn more at\n5.7.8 http://support.google.com/mail/bin/answer.py?answer=14257 sh5sm32272477pbc.21 - gsmtp'

c++ builderにてgmailでメール送信テスト中にタイトルの問題が発生した。

https://www.digitalocean.com/community/questions/unable-to-send-mail-through-smtp-gmail-com

> The point is this: https://www.google.com/settings/security/lesssecureapps

> You should change the "Access for less secure apps" to Enabled (it was enabled, I changed to disabled and than back to enabled). After a while I could send email.



https://support.google.com/mail/answer/14257
MKMapView で任意のアノテーション群が画面内に収まるように表示する方法

# 各点を繋いだ MKPolygon が収まる領域を表示範囲とする

1. 各アノテーションから取得した MKMapPoint を収めたC配列を用意
2. MKPolygon インスタンスを生成
3. バウンディング矩形を取得
4. マップビューに対して visibleMapRect を実行


```objc
MKMapPoint *points = calloc(count, sizeof(MKMapPoint));

// MKMapPoint を配列に入れる
for(…) {
MKMapPoint p = …;
points[idx] = p;
}

// 各点を繋げたポリゴンを作り、バウンディング矩形を得る
MKPolygon *polygon = [MKPolygon polygonWithPoints:points count:count];
MKMapRect rect = [polygon boundingMapRect];
free(points);
CGFloat padding = 10; // 表示範囲にパディングを設定する場合の値

// ポリゴンが収まる範囲を表示
[mapView setVisibleMapRect:rect edgePadding:UIEdgeInsetsMake(padding, padding, padding, padding) animated:YES];
```

……という方法を思いついたのですが、後になって便利なメソッドがあるのを見つけました。

# -[MKMapView showAnnotations:animated:] を使う

> \- (void)showAnnotations:(NSArray *)annotations animated:(BOOL)animated NS_AVAILABLE(10_9, 7_0);

```objc
[mapView showAnnotations:annotations animated:YES];
```

OS X 10.9 / iOS 7.0以降ならたった1行、簡単ですね。

## アニメーションの長さを変える

UIViewAnimation ブロックで括って duration を指定することでアニメーションの長さを変更することができる。

```objc
CGFloat duration = 0.1;

[UIView beginAnimations:@"Custom Animation" context:nil];
[UIView setAnimationDuration:duration];
		
[mapView showAnnotations:annotations animated:YES];
	
[UIView commitAnimations];
```
rack-timeoutのREADMEについて大まかに翻訳中


Herokuを使っているので、rack-timeoutを使っているのだけれど、あんまりよくわからずに使っていたので、よくないなと思って調べてみました。

[github:heroku/rack-timeout](https://github.com/heroku/rack-timeout)

私は英語が苦手なもんで、すごく適当に訳していってるので抜けもたくさんあるだろうし、終わるのはいつになるかわからんので、編集リクエスト待っています。

# 基本的な使い方

## Rails

```rb:Gemfile
gem 'rack-timeout'
```

デフォルトは15秒なので、カスタマイズしたかったらinitializer fileを作る。

```rb:config/initializers/timeout.rb
Rack::Timeout.timeout = 20 # seconds
```

# 詳細

## Service Timeout(Rack::Timeout::timeout)

これが重要な設定で、アプリケーションの処理がtimeoutより長い時間かかる場合、ステータスを`timed_out`として、`Rack::Timeout::RequestTimeoutError`が発生する。

0またはfalseに設定しておくと無効になる。

## Wait Timeout(Rack::Timeout::wait_timeout)

Herokuではルーティングレイヤーで30秒以上かかる場合はリクエストを破棄する。
通常だとこの場合はログに何も残らないが、`Rack::Timeout.wait_timeout`の設定がしてあると、`Rack::Timeout::RequestExpiryError`が発生して、リスエストの結果がログに`expired`として残る。

デフォルトは30秒。0またはfalseに設定しておくと無効になる。

基本的にはこのままでwait timeoutを超えることはないだろう。しかしHerokuのルーターの振る舞いが理由で、リクエストをwait timeoutとして破棄するかもしれない。
例えば、

* timeout=15
* wait_timeout=30

のときに、リクエストを受け付けてから20秒経過すると、timeoutの15秒の前の、10秒の時点でwait_timeoutの30秒に到達してしまう。
この振る舞いを無効にしたかったら、`Rack::Timeout.service_past_wait`を`true`にすることだ。

## Wait Overtime(Rack::Timeout::wait_overtime)

リクエストが大きい(POSTリクエストのような)場合や、クライアントが低速回線でアップロードしているような場合、問題である。
全部を受信するのに30秒以上かかるような場合、たとえアップロード中であったとしても、Rack::Timeoutはただちに破棄する。

`Rack::Timeout.wait_overtime`を設定することで、延長時間を設定できる。
デフォルトは60秒。0またはfalseで無効になる。無効にしてあると、延長時間はない。

ものすごく大きなリクエストを破棄したくなければ、wait_overtimeの値をものすごく大きい数値に設定すること。

ただ、Herokuは大きなファイルはAmazon S3にダイレクトにアップロードすることを推奨していることを覚えておいて。


疲れたので続きはまた今度。
Arduino + GO + 16チャネルLEDドライバTLC5940 + 8x8マトリクスLED x 2


注）本稿は作者のメモ書きのため逐次更新、修正されます

## ハードウェア

* 16チャネルLEDドライバTLC5940
[TLC5940/Texas Instruments製品ページ](http://www.tij.co.jp/product/jp/tlc5940)
[データシート](http://www.tij.co.jp/jp/lit/ds/symlink/tlc5940.pdf)

* 赤色ドットマトリクスLED 8x8
[OSL641501-ARA/秋月電子通商](http://akizukidenshi.com/catalog/g/gI-05163/)
[データシート](http://akizukidenshi.com/download/ds/optosupply/OSL641501-XX.pdf)

## 環境

* FirmataによるArduino制御
* GOによる実装

## ライブラリ

* TLC5940 Arduinoライブラリ
[Arduino Playground](http://playground.arduino.cc/Learning/TLC5940)
[配布元/code.google.com](https://code.google.com/p/tlc5940arduino/)

## パーツリスト

(作成中)

## 回路図

(作成中)
Wheneverで環境ごとにschedule内容を変更する


Whenever、crontabが簡単に定義できるし、capistranoでデプロイすれば勝手に設定変更してくれるから非常に便利ですよね。手で記述ミスしてないか確認しながら変更していた日々にバイバイ。`crontab -r`に怯える日々よサラバ。

普通に使うには普通に使えるんですが、production環境とstaging環境でcrontabの内容を変えたいときに、検索して出てくるやり方だと上手いこといかなかったので、メモ。

# 前提

- whenever v0.9.x
- capistrano v3.2.x

# capistranoの設定

```ruby:Capfile
require 'whenever/capistrano' # 追加
```

```ruby:config/deploy.rb
set :whenever_identifier, ->{ "#{fetch(:application)}_#{fetch(:stage)}" } # 追加
```

```ruby:config/production.rb
set :whenever_roles, :batch # 対象ロール
set :whenever_environment, :production # 対象環境
```

```ruby:config/staging.rb
set :whenever_roles, :batch # 対象ロール
set :whenever_environment, :staging # 対象環境
```

# Wheneverの設定

`@environment`に環境名が入ってくるので、それを使って単純に分岐させてやるだけです。

```ruby:config/schedule.rb
# 出力先のログファイルの指定
set :output, 'log/crontab.log'

if @environment.to_sym == :production
  # 10分毎
  every '*/10 * * * *', :roles => [:batch] do
    runner "Tasks::Hoge.execute"
  end
end

if @environment.to_sym == :staging
  # 1時間毎
  every '0 * * * *', :roles => [:batch] do
    runner "Tasks::Hoge.execute"
  end
end
```

他の方のやり方だと、`ENV['RAILS_ENV']`に環境名が入るように`whenever_command`を使って実行コマンド自体をカスタマイズしていましたが、僕の場合エラーになってしまうので上記のような対応をしました。

```ruby
set :whenever_command, -> { ["RAILS_ENV=#{fetch(:stage)}", :bundle, :exec, :whenever] }
```

# Wheneverの反映

Wheneverだけ実行したい場合は、下記のようにすればOK。

```
# 反映
$ BRANCH=staging bundle exec cap staging whenever:update_crontab

# 削除
$ BRANCH=staging bundle exec cap staging whenever:clear_crontab
```
MariaDB でクラスタ化してみる（MariaDB 10.0 Galera Cluster, CentOS 6.5）のを調査した結果のメモメモ

# MySQLクラスタ化
Oracle RAC などを会社で使っていた（主に使うガワ）のですが、自分でも設定してみたいなと思っていたら[MariaDB Galera Cluster](https://mariadb.com/kb/en/mariadb/yum/)が、比較的設定が簡単だと聞いたのでそのときに調査したメモ。

# 先人達の記事とおりなんだけどね
HA構成ちゃんと考えるなら LVS + Keepalived 使うのがスタンダードっぽいですけど、とりあえずどんな動作をするか確認してみます。ここらへんは、Oracle RACに比べて敷居が低くていいわ。が、業務で使うならバックアップとかリストアとか、クエリーログとるとか、、色々考えないといけませんけど、まあ勉強ですから。

> [MariaDB Galera Clusterを試す](http://research.sakura.ad.jp/2013/02/14/mariadb-galera-cluster-1/comment-page-1/)
> [MariaDB 10.0 Galera ClusterをCentOS7にインストール](http://qiita.com/tukiyo3/items/0971f89b5ad3024f5680#%E6%B3%A8%E6%84%8F%E7%82%B9)

# MariaDB 10.0 Server
MariaDB 5.5 と 10.0 がありますが、先人達の記事とおり 10.0 を入れてみますよ。手順とおり実施するのも勉強ですから。そしてさっくり動きます。

## 注意点がある
・Galera Clusterは最低3台以上での構成にすること。
　　⇒　推奨らしいです。
・クエリーが実行されたDBサーバのみbinlogが記録される。
　　⇒　バイナリログから、リストア・リカバリする場合は注意が必要。
・Primaryキーがないテーブルは、insert のみ使用可能。update, delete は使えない。
　　⇒　検証したら、そのとおりでした。業務では、Primaryキーを作成しないテーブル作るケースがある場面が浮かびませんが…特に問題ないかと（笑）

# チューニングすべき点
MySQLクラスタ化は驚くほど簡単にできました。3台⇒2台を止めて1台にして、2台復旧⇒3台、などしても当然ですがクラスタ化できているわけです。
あとは、HA構成や運用周りですね。こればかりはテンプレがないので考えないといけませんね。

とりあえず、その前にMariaDBの設定

> [MySQL 5.6のインストール後にチューニングすべき項目](http://yakst.com/ja/posts/61)
> [MariaDBの初期設定](http://www.seirios.org/seirios/dokuwiki/doku.php?id=serverapp:database:mariadb:initial-config)
> [keepalivedで仮想IPを体験](http://qiita.com/tukiyo3/items/dc355dd456c0973b5a39)


# クエリーログがでない
```general-log=1``` クラスタ化に伴う仕様なのかでないので、audit pluginでクエリーログを出力する。
よくよく考えるとバイナリーログも出力しているのでそこから取得するということでもいいかもしれないが、この audit つかうと任意のタイミングでon/off切り替えられるのでいいかもしれない。
ただしこのプラグイン使っても、クエリーが実行されたDBサーバのみ記録されるのは当然のことですｗ

> [MariaDBでデータベースを監査して、クエリーを追跡する！](http://qiita.com/hit/items/0c401767822185500cad)
シェルの引数処理を柔軟にしたい

久しぶりにbashネタ

**追記：shiftはjavaでいうとiteratorと似てる動きをするので進んでしまったオプションは取得できない問題があったので修正**

いままで引数処理で$1とかを使っていたが、このやり方では引数の順番を気にしないといけない

やりたいのはsshの-lオプションみたいに指定したい。
つまり

```bash
ssh -l hoge 127.0.0.1
ssh 127.0.0.1 -l hoge
```

こういう感じにどちらでも使えるもの

```bash
#!/bin/sh

#引数配列化
array=("$@")

# 引数があればシーケンスで処理。指定オプションを見つかればその次の要素で処理
if [ $# -gt 0 ]; then
    for i in `seq 0 $(($# -1))`
    do
        if [ '-l' = ${array[$i]} ]; then
            echo ${array[$i +1]}
            break
        fi
    done
fi

```
これを関数化すれば何個でも対応できる

*前回のshift*
shiftは進んでしまった引数を取得できなくなるので順次処理などでしか使えないかも。。

```bash
#!/bin/sh

for i in `seq 1 $#`
do
    echo $1
    shift
done

```
こんな感じの、、、
いいもの知ったとおもったけど、、まあ、そういうこともある。。
何度もハマル 『vagrant up で InvalidByteSequenceError 発生』 問題

###### 追記 2017/12/27
Vagrant2.0.1 (Windows10, VirtualBox5.2.0) でも同じエラーが発生！
今回はこれで一発解決！感謝！ -> [VagrantコマンドでEncoding::InvalidByteSequenceError](https://qiita.com/mokuo/items/fb18713c4f0a19d9c48e)
恐らく、以下の『再発』の現象もこれで解決できたんじゃないかと。

----

## 現象 ##
Windows8.1上でこんなエラーが発生して、VirtualBox上のCentOS6が起動しなかった。

```
> vagrant up
F:/tools/DevelopmentTools/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/util/io.rb:32:in `encode': incomplete "\x95" on Windows-31J (Encoding::InvalidByteSequenceError)
```

さっきまでは動いてたのに突然(-_-)


これ関連ありそうだったけど… 違った。
http://uchimanajet7.hatenablog.com/entry/2015/03/13/204916

## 解決 ##
VirtualBoxで他のCentOSを起動していている場合にこのエラーが発生することが分かった。他のを全て落としたら、vagrant upで正常に起動するようになった。

ポートフォワードのバッティングが原因だったのかもしれない。


## 再発 ##
VirtualBox5.0＋Vagrant1.7.3の組み合わせで同じエラーが発生した。

```
> vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'ubuntu/trusty64' is up to date...
==> default: A newer version of the box 'ubuntu/trusty64' is available! You currently
==> default: have version '20150506.0.0'. The latest is version '20150609.0.10'. Run
==> default: `vagrant box update` to update.
==> default: Clearing any previously set forwarded ports...
F:/tools/DevelopmentTools/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.7.3/lib/vagrant/util/io.rb:32:in `encode': inco
mplete "\x82" on Windows-31J (Encoding::InvalidByteSequenceError)
        from F:/tools/DevelopmentTools/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.7.3/lib/vagrant/util/io.rb:32:in `
read_until_block'
:
:
```

vagrant box updateしてから

```
==> default: Updating 'ubuntu/trusty64' with provider 'virtualbox' from version
==> default: '20150506.0.0' to '20150609.0.10'...
==> default: Loading metadata for box 'https://atlas.hashicorp.com/ubuntu/trusty64'
==> default: Adding box 'ubuntu/trusty64' (v20150609.0.10) for provider: virtualbox
    default: Downloading: https://atlas.hashicorp.com/ubuntu/boxes/trusty64/versions/20150609.0.10/
```

再度vagrant upしてみたが、やはりダメ。
【ご質問】FBログイン(omniauth)のアクセス要求について

ご質問させて頂きます。

WEBサイトを運営しておりまして、FBログイン機能(omniauth)を利用しています。
利用ユーザのメールアドレスを、必須で取得したいのですが何か方法はございますでしょうか？
※ユーザによっては、アクセス許可「メールアドレス」をOFFにされる方がいるため。
その場合、ログインさせず、再度アクセス許可(メールアドレス)を求めるようにしたいと考えております。

=現在のパラメータ
config/initializers/omniauth.rb
 scope: 'public_profile,email'

●環境

Ruby 1.9
Ruby on Rails 3.2
omniauth (1.2.1)
omniauth-facebook (1.5.1)
XamarinでUnityのShaderファイルにシンタックスカラーつける


http://blog.joolsadams.org/2013/04/01/syntax-coloring-shader-files-in-xamarin-studio-4/
こちらを参考にしました。

1. https://github.com/jools-adams/monodevelop-unity-mimetypes からソースを落としてくる
2. ビルドする (unity-mimetypes.sln を Xamarin で開いて `⌘ + K`)
3. install.sh を実行

これで一応あっさり目にカラーリングしてくれます・・
C# ばりに補完とかガシガシやってくれる環境あればなーと思いつつ
ひとまず最低限という感じ。
【未解決】objcopyで動的ライブラリに埋め込んだファイルのサイズがとれない

objcopyでファイルを埋め込んだライブラリを作成した場合、静的ライブラリは埋め込んだファイルサイズがsizeシンボルから正しく取得できるが動的ライブラリでは不正な値となる。

objcopyでのデータ埋め込みってなに？という方はこちらを参照のこと。
http://0xcc.net/blog/archives/000076.html


# 再現

全体は以下のリポジトリ
https://github.com/maueki/objcopy_lib

やっていることは、`objcopy`でテストデータ(test.data)を埋め込んだ（動的/静的）ライブラリを作成し、テストデータのサイズを出力しているだけである。
ライブラリには以下の関数のみ含まれている。


```cpp:func.cpp
#include <cstddef>

extern "C" char _binary_test_data_start[];
extern "C" char _binary_test_data_end[];
extern "C" char _binary_test_data_size[];

size_t get_size1() {
        return reinterpret_cast<size_t>(_binary_test_data_size);
}

size_t get_size2() {
        return static_cast<size_t>(_binary_test_data_end - _binary_test_data_start);
}
```

`test1`は静的ライブラリをリンク、`test2`は動的ライブラリをリンクしており実行結果は以下の通り、`test2`ではシンボル`_binary_test_data_size`の値が取れていない。

```
$ ./test1
get_size1() == 8
get_size2() == 8

$ ./test2
get_size1() == -1979670520
get_size2() == 8
```

なお、`test2`の`get_size1()`の値は毎回変わる。

動的ライブラリ(libtest_shared.so)を`nm`で確認すると_binary_test_data_sizeは絶対値(A)で8が指定されていることがわかる。

```
$ nm libtest_shared.so
(snip)
0000000000200b28 D _binary_test_data_end
0000000000000008 A _binary_test_data_size
0000000000200b20 D _binary_test_data_start
(snip)
```

内部シンボルを静的に解決するリンカオプション`-Bsymbolic`も試してみたが改善はしなかった。
コマンドプロンプトから PowerShell を実行する

Windows 向けにスクリプトを書く際に、コマンドプロンプトで出来る事は限られてくるので PowerShell を使いたい場合があります。

コマンドプロンプトから値を渡して PowerShell で実行できれば良いのに！という要望を叶えるための方法を紹介します。

# コマンドプロンプトから PowerShell を呼び出す
```
powershell -Command "ls"
```
これで、 powershell で `ls` コマンドを実行します。

# powershell に値を渡す
```
set dir=path/to
powershell -Command "ls %dir%"
```
`dir` 変数がコマンドプロンプト上で展開されて powershell に渡されます。

# ダブルクオートのエスケープ
```
set data=hello
set script=Invoke-RestMethod -Uri "http://example.com" -Method POST -Body "%data%"
```
こんな場合、 `powershell -Command` に渡して実行するにはダブルクオートで実行するスクリプトを囲む必要がありますが、 `"http://example.com"` が存在するのでエスケープする必要があります。

重要なのはコマンドプロンプト側でエスケープすることです。

コマンドプロンプトのエスケープ文字はバックスラッシュ `\` ですが、 PowerShell のエスケープ文字はバッククオート `` ` `` なので、注意が必要です。

手作業でエスケープするのは面倒なので自動的に行います。

```
set script=%script:"=\"%
```
ダブルクオートをエスケープされたダブルクオートに置換します。
そして、 PowerShell に渡す際にダブルクオートで囲みます。

```
powershell -Command "%script%"
```