OmniAICreator/Qiita-1.07M huggingface dataset:
kaibun2

問題はこちら
http://nabetani.sakura.ne.jp/hena/ord17scheherazade/

他の解答例はこちら
http://qiita.com/Nabetani/items/dabe8ec57e0313229552

```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void solve(const unsigned long N, char *result)
{
	for(unsigned long base = 2; base < N; base++)
	{
		unsigned long q, r, buff[30] = {0}, i;
		for(i=0, q=N, r=N%base; q!=0; i++, q/=base, r=q%base)
		{
			buff[i] = r;
		}
		int ok = 1;
		for(int start=0, end=i-1; start<end; start++, end--)
		{
			ok &= buff[start]==buff[end];
		}
		if(ok)
		{
			char tmp[10] = {0};
			sprintf(tmp, "%d,", base);
			strcat(result, tmp);
		}
	}
}

void test(const char* IN, const char* ANS)
{
	char result[200] = {0}, emp[2] = "-";
	solve(atoi(IN), result);
	const char* R = (strlen(result)!=0) ? result: emp;
	printf("%s\t%s\n", R, (strncmp(ANS, R, strlen(ANS))==0) ? "ok": "*** NG ***");
}

int main()
{
/*0*/ test( "17301", "5,38,100,218,236,5766,17300" );    
/*1*/ test( "2", "-" );    
/*2*/ test( "1", "-" );    
/*3*/ test( "3", "2" );    
/*4*/ test( "4", "3" );    
/*5*/ test( "5", "2,4" );    
/*6*/ test( "6", "5" );    
/*7*/ test( "10", "3,4,9" );    
/*8*/ test( "101", "10,100" );    
/*9*/ test( "1001", "10,25,76,90,142,1000" );    
/*10*/ test( "10001", "10,24,30,42,80,100,136,10000" );    
/*11*/ test( "1212", "22,100,201,302,403,605,1211" );    
/*12*/ test( "123412", "62,100,205,215,30852,61705,123411" );    
/*13*/ test( "5179", "5178" );    
/*14*/ test( "4919", "4918" );    
/*15*/ test( "5791", "5790" );    
/*16*/ test( "5498", "2748,5497" );    
/*17*/ test( "453", "150,452" );    
/*18*/ test( "134", "66,133" );    
/*19*/ test( "8489", "27,652,8488" );    
/*20*/ test( "1234", "22,616,1233" );    
/*21*/ test( "5497", "41,238,5496" );    
/*22*/ test( "4763", "19,35,432,4762" );    
/*23*/ test( "3974", "17,27,1986,3973" );    
/*24*/ test( "3521", "44,55,502,3520" );    
/*25*/ test( "5513", "20,38,53,148,5512" );    
/*26*/ test( "8042", "23,29,60,4020,8041" );    
/*27*/ test( "7442", "37,60,121,3720,7441" );    
/*28*/ test( "4857", "25,1618,4856" );    
/*29*/ test( "22843", "49,69,91,141,430,22842" );    
/*30*/ test( "194823", "84,121,21646,64940,194822" );    
/*31*/ test( "435697", "160,169,235,626,1822,435696" );    
/*32*/ test( "142", "3,7,70,141" );    
/*33*/ test( "886", "5,14,442,885" );    
/*34*/ test( "3102", "7,65,93,140,281,516,1033,1550,3101" );    
/*35*/ test( "17326", "11,28,99,105,8662,17325" );    
/*36*/ test( "32982", "13,72,238,477,716,1433,5496,10993,16490,32981" );    
/*37*/ test( "36", "5,8,11,17,35" );    
/*38*/ test( "37", "6,36" );    
/*39*/ test( "251", "8,250" );    
/*40*/ test( "252", "5,10,17,20,27,35,41,62,83,125,251" );    
/*41*/ test( "253", "12,14,22,252" );    
/*42*/ test( "6643", "2,3,9,81,90,510,948,6642" );    
/*43*/ test( "5040", "71,79,83,89,104,111,119,125,139,143,167,179,209,239,251,279,314,335,359,419,503,559,629,719,839,1007,1259,1679,2519,5039" );    
/*44*/ test( "9240", "23,38,62,104,109,119,131,139,153,164,167,209,219,230,263,279,307,329,384,419,439,461,615,659,769,839,923,1154,1319,1539,1847,2309,3079,4619,9239" );
	return 0;
}
```
Apple Mach-O Linker


```objective-c
clang: error: linker command failed with exit code 1 (use -v to see invocation)

```

上記のエラーが出た際の原因と対処法です。


##原因と対処法


1、.hファイルをimportするべきところで.mファイルをimportしている。
→全ファイルのimportしている部分を確認し、.mがあれば.hに修正する。

２、必要なフレームワークが入っていない。

３、同じ.mファイルをCompile Sourceに登録している。
→Targets→Build Phases→Compile Sourceに同じ.mファイルがないか確認する。
$\left(\hat{ ... }\right)$ のカッコが大きくて気持ち悪い

TeX で ```$\left( ... \right)$``` と書くと、中に書いた数式の大きさに応じて、自動的に大きいカッコが使われます。中に積分や分数のような「大きな式」を書くときはその方が見やすくなるので、基本的にカッコを使うときは ```\left```,```\right``` を使うべきです。

一方、```\hat{x}``` は x の上にハット ```^``` を載せる命令です。

これらを組み合わせて使うと、（少なくとも個人的には）ちょっと気持ち悪い感じになります（下の図参照）。

```tex
\[
	f\left(\hat{X}\right) {\lVert v \rVert}_{P\left(\hat{X}\right)}
\]
```

![2014-01-07-224551_1024x768_scrot-bigparen.png](https://qiita-image-store.s3.amazonaws.com/0/2251/3464197d-cb42-7bdb-06c6-26b43d40e265.png)

これは、ハットをのせたことで ```\hat{X}``` のボックスがその分大きくなったためです。実際、そのおかげで分数なども適切な位置に表示できるのですが、個人的にはこのようにカッコの中の場合はハットなしの文字と同じ高さになって欲しいです。

そこで、ハットなしの場合と同じ高さでハット付き文字を作るマクロを作りました（20140214追記: **コメント欄にて以下のマクロの問題点をご指摘いただきましたので，そちらで提示されている改良案を使用することをオススメします**）。

```tex:Hat.tex
%% 縦に大きくならないハット付き文字を作る。
%%%% \hbox to 0pt : 幅 0pt のボックスを作る。
%%%% \phantom     : その文字列の大きさで何も表示されないボックスを作る。
%%%% \raisebox    : ボックスの位置・サイズを変更する。
%%%% \mathchoice  : 数式モードに応じて条件分岐する。
\def\Hat#1{{\fboxsep0pt\mathchoice
{\hbox to 0pt{\phantom{$\displaystyle #1$}     }\raisebox{0ex}[0pt][0pt]{$\displaystyle\hat{#1}$}}
{\hbox to 0pt{\phantom{$\textstyle #1$}        }\raisebox{0ex}[0pt][0pt]{$\textstyle\hat{#1}$}}
{\hbox to 0pt{\phantom{$\scriptstyle #1$}      }\raisebox{0ex}[0pt][0pt]{$\scriptstyle\hat{#1}$}}
{\hbox to 0pt{\phantom{$\scriptscriptstyle #1$}}\raisebox{0ex}[0pt][0pt]{$\scriptscriptstyle\hat{#1}$}}
}}
```

```tex
\[
	f\left(\Hat{X}\right) {\lVert v \rVert}_{P\left(\Hat{X}\right)}
\]
```

![2014-01-07-230108_1024x768_scrot-properparen.png](https://qiita-image-store.s3.amazonaws.com/0/2251/35cdf4f4-0e85-48de-e243-cd7139e1771c.png)

もちろん、ボックスの高さが変わらないということを理解せずに分数の分母にこのマクロを放り込むような使い方をするとそれはまた気持ち悪いことになります。適材適所に使ってください。

## 参考文献
- "LaTeX 数式の縦/横の調整(Kodama's tips page)", http://www.math.kobe-u.ac.jp/~kodama/tips-latex-math-margin.html , 2014-01-07閲覧
pythonでmarkdownを扱う

# PythonでMarkdownを扱う 
* [pypi:Markdown](https://pypi.python.org/pypi/Markdown)  
これをダウンロードしてセットアップ。

```python:md_test.py
import markdown

md = markdown.Markdown()

sample_makedown = '''
An h1 header
============

Paragraphs are separated by a blank line.

2nd paragraph. *Italic*, **bold**, `monospace`. Itemized lists
look like:

  * this one
  * that one
  * the other one
'''

# makedown -> html
print md.convert(sample_makedown)
```

print結果は以下です。

```html:出力結果
<h1>An h1 header</h1>
<p>Paragraphs are separated by a blank line.</p>
<p>2nd paragraph. <em>Italic</em>, <strong>bold</strong>, <code>monospace</code>. Itemized lists
look like:</p>
<ul>
<li>this one</li>
<li>that one</li>
<li>the other one</li>
</ul>
```
こんなかんじでconvertしてあげるだけで、
MarkdownのテキストをHTMLに変換してくれます。  
とても使いやすいですね。  
ファイルに書き込みとかも対応しています。

# Djangoで使う

Djangoで使う場合は次のようなフィルタを自作してあげます

```python:myfilter.py
import markdown
#キャッシュするためここで宣言、初期化しとく
md = markdown.Markdown()

@register.filter
@stringfilter
def mark2html(value):
    return md.convert(value)
```

```html:template.html
{% load myfilter %}

{{ markdown_text|mark2html }}
```
Xorg でモニタのスリープを無効にする

デフォルトだと操作しない時間が10分続くとモニタがスリープしてしまう。
これを無効化するには /etc/X11/xorg.conf または /etc/X11/xorg.conf.d/15-monitor.conf のようなファイルに

```/etc/X11/xorg.conf.d/15-monitor.conf
Section "ServerFlags"
  Option "BlankTime" "0"
  Option "StandbyTime" "0"
  Option "SuspendTime" "0"
  Option "OffTime" "0"
EndSection
```

と設定する。X を再起動すれば反映される。
スリープまでの時間を調整したい場合は、これらの値を "0" 以外にすればいい (単位は分)。

## 確認
`xset q` で確認できる。

```
% xset q
(snip)
Screen Saver:
  prefer blanking:  yes    allow exposures:  yes
  timeout:  0    cycle:  600
(snip)
DPMS (Energy Star):
  Standby: 0    Suspend: 0    Off: 0
  DPMS is Enabled
  Monitor is On
```

## SEE ALSO
[xorg.conf(5)](http://www.x.org/archive/X11R7.7/doc/man/man5/xorg.conf.5.xhtml#heading5)
String#toLowerCase()でハマりました


いまさらなのかもしれないですがString#toLowerCase()は実行環境のロケール依存なのでちゃんと引数にLocale.ENGLISHを渡してあげると思った通りの結果が出ますよという話です。日本語環境だけで動かすと気づかないですよね…

testTr()だけfailedになります。トルコ語環境以外でも起きるかもしれません

```java
package example;

import static org.junit.Assert.*;

import java.util.Locale;

import org.junit.Test;

public class LocaleTestCase {

	@Test
	public void testJa() {
		Locale.setDefault(Locale.JAPANESE);
		String upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		String lower = "abcdefghijklmnopqrstuvwxyz";
		assertEquals(lower, upper.toLowerCase());
	}

	@Test
	public void testTr() {
		Locale tr = new Locale("tr");
		Locale.setDefault(tr);
		String upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		String lower = "abcdefghijklmnopqrstuvwxyz";
		// iが一致しない
		assertEquals(lower, upper.toLowerCase());
	}

	@Test
	public void testTr2() {
		Locale tr = new Locale("tr");
		Locale.setDefault(tr);
		String upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		String lower = "abcdefghijklmnopqrstuvwxyz";
		assertEquals(lower, upper.toLowerCase(Locale.ENGLISH));
	}
}
```
UIButton境界線だしつつStoryboardで設計

　iOS7にかわってから、UIButtonの境界線がなくなりました。Storyboardは画面遷移が可視化できるため非常に便利です。ここで問題はStoryboardを使いながらUIButtonの境界線を出す方法です。

　UIButtonの境界線を出す方法はButtonをIBOutletで定義する必要があります。

```ViewController.m
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIButton *button;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    _button.layer.borderColor = [UIColor grayColor].CGColor;
    _button.layer.borderWidth = 1.0f;
    _button.layer.cornerRadius = 7.5f;
}
```
このような感じで境界線を出します。
次に画面遷移を個別に定義します。

```ViewController.m
   [_button addTarget:self action:@selector(done) forControlEvents:UIControlEventTouchDown];
```

　このような感じです。次にdoneを記述して画面遷移を記述します。ここで忘れていけないことはStoryboard上でStoryboard IDに何かKeyword指定です。ここではSecondViewControllerとしておきます。
　次にdoneを記述します。

```ViewController.m
- (void)done{
    SecondViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
    [self.navigationController pushViewController:vc animated:YES];
}
```
これでButtonをカスタマイズしつつStoryboardでUI設計できます。
Go言語:メソッドの引数の型を調べる方法



```go:main.go
package main

import (
	"log"
	"reflect"
)

type Foo struct {}
func (this *Foo) DoSomething(param0 string, param1 int, param2 interface{}) {}

func main() {
	foo := &Foo{}
	methodType := reflect.ValueOf(foo.DoSomething).Type()
	log.Printf("param0: %#v", methodType.In(0).String())
	log.Printf("param1: %#v", methodType.In(1).String())
	log.Printf("param2: %#v", methodType.In(2).String())
}
```

出力結果


```
2014/01/07 21:54:40 param0: "string"
2014/01/07 21:54:40 param1: "int"
2014/01/07 21:54:40 param2: "interface {}"

```
Go言語:変数が関数かどうかを返す関数


変数が関数かどうかを判断する関数です。
この関数はメタプログラミングすることが目的です。
`reflect` モジュールを使います。

```go
func IsFunction(value interface{}) bool {
	if reflect.ValueOf(value).Type().Kind() == reflect.Func {
		return true
	}
	
	return false
}
```


サンプルコード:

```go:main.go
package main

import (
	"log"
	"reflect"
)

func DoSomething() {}
type Foo struct {}
func (this *Foo) DoSomething() {}

func IsFunction(value interface{}) bool {
	if reflect.ValueOf(value).Type().Kind() == reflect.Func {
		return true
	}
	
	return false
}

func main() {
	log.Println(IsFunction(true))
	log.Println(IsFunction(1))
	log.Println(IsFunction("string"))
	log.Println(IsFunction(DoSomething))
	
	foo := &Foo{}
	log.Println(IsFunction(foo.DoSomething))
}
```
Range Adapter を使ってループを分解

ややこしいループ構造を分解する際に Range Adapter の考え方を使うとよさそうな場合があったのでメモ。

大きなループというのは、実は、いくつかのブロックに分かれていることが多い。

そのブロックをRange Adapterに切り出すとシンプルになる。

Range Adapterそのものはループではないのでテストしやすい。


例

```cpp:test.cpp
#include <iostream>
#include <vector>
#include <boost/range/adaptor/transformed.hpp>
#include <boost/range/adaptor/filtered.hpp>

using namespace std;

struct is_even
{
    bool operator()( int x ) const { return x % 2 == 0; }
};

struct tenfold_int
{
    typedef int result_type;
    int operator()(int x) const { return x * 10; }
};

void test1(vector<int> const& arr)
{
    for (int x : arr) {
        // Block 1 (filter)
        if (!(x % 2 == 0))
            continue;

        // Block 2 (transform)
        x *= 10;

        cout << x << endl;
    }
}

void test2(vector<int> const& arr)
{
    using namespace boost::adaptors;

    for (int x : arr | filtered(is_even()) | transformed(tenfold_int()) ) {
        cout << x << endl;
    }
}

int main()
{
    vector<int> arr = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    cout << "--- test1 ---" << endl;
    test1(arr);

    cout << "--- test2 ---" << endl;
    test2(arr);
}
```

test1() と test2() は同じ機能になっている。

test1()はひとつの大きなループだが、test2()はループの中のブロックをファンクタ(is_even, tenfold_int)に切り出して、シンプルにしている。
切り出したファンクタは短くてテストが容易である。

ビルド方法

`g++ -Wall test.cpp -std=c++11 -I$BOOST_ROOT`
gcc-4.7.2でビルド。Boost.Rangeを使っています。

出力

```
--- test1 ---
0
20
40
60
80
--- test2 ---
0
20
40
60
80
```
Photoshop自動化のjsを書くときに使うScripting Listenerプラグイン、CS6以上での有効化方法



Scripting ListenerプラグインはPhotoshopをjsで操作する際に、そこそこ便利なプラグインです。

いつのまにか有効化する方法が変わっていました。


## CS6から変わってました。以下手順です
1. プラグインとスクリプトをダウンロードする
2. プラグインを置く
3. jsxファイルを置く
4. メニュー - [ファイル] - [スクリプト] - [ScriptListenerOn] で ON！
5. デスクトップにログファイルができる



## 1. プラグインとスクリプトをダウンロードする
↓ここからScripting Listenerプラグインをダウンロードします
[Photoshop ヘルプ / 
ダウンロード可能なコンテンツ（プラグイン））](http://helpx.adobe.com/jp/photoshop/kb/plug-ins-photoshop-cs61.html)

## 2. プラグインを置く

ダウンロードして解凍した`Utilities`の中にある、`ScriptingListener.plugin`を以下に置きます

Windows

    Program Files/Adobe/Adobe Photoshop CC (64 bit)/Plug-ins


Mac

    /Applications/Adobe Photoshop CC/Plug-ins


## 3. jsxファイルを置く

解凍したフォルダの`Sample Scripts/JavaScript`の中にある`ScriptListenerOn.jsx`, `ScriptListenerOff.jsx` を以下に置きます


Windows

    Program Files/Adobe/Adobe Photoshop CC (64 bit)/Presets/Scripts


Mac

    /Applications/Adobe Photoshop CS6/Presets/Scripts

## 4. メニュー - [ファイル] - [スクリプト] - [ScriptListenerOn] で 実行

![20140107210009.png](https://qiita-image-store.s3.amazonaws.com/0/2631/dbbe76b4-2090-537e-c2e2-127bf6f0182f.png "20140107210009.png")


## 5. デスクトップにログファイルができる

できたーーー！！

必要がなくなったらOFFしておきましょうー
Rails 4 で assets に font を追加する方法

`app/assets/fonts` に ttf, woff, etc... を投入する。終わり。

よく`config/application.rb`に設定を追加しているのを見かけますが間違いです。

## config.assets.paths に設定追加の間違い

`config.assets.paths << Rails.root.join('app', 'assets', 'fonts')`

こういうの。
間違いじゃないのですが、`app/assets` 以下は自動で追加されるので不要です。

## config.assets.precompile に対象ファイル追加の間違い

`config.assets.precompile << /\.(?:svg|eot|woff|ttf)$/`

こういうの。
`.css`, `.js`以外は precompile する必要がないので不要です。

以下の設定もよく見かけるのですが、正規表現じゃないのでマッチしません。ということで論外(実は設定していたことは内緒です)。

`config.assets.precompile += %w( .svg .eot .woff .ttf )`

## SEE ALSO

- http://stackoverflow.com/questions/18294150/how-to-use-fonts-in-rails-4/18299918#18299918
- http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets
- https://github.com/rails/rails/blob/v4.1.0/railties/lib/rails/engine.rb#L599-L601

## まとめ

最初から公式見ておけという結論でした。
無駄にハマってしまって結構疲れて書いているので間違っていたら教えてください。
Xamarin.iOS で特定の画面だけ向きを固定する時ハマったこと


画面A,B があって B だけ横向き固定にしたい。

* [uiviewcontroller - iOS 6 ViewController is rotating but shouldn't - Stack Overflow](http://stackoverflow.com/a/12588038)
* [iPhone - UIViewController iOS6での画面回転への対応 - Qiita [キータ]](http://qiita.com/yusuga_/items/8cc82376edb40e09f0e7)

これを Xamarin.iOS でやりたい。

Storyboard を Interface Builder で開いて、NavigationController のカスタムクラスを ``MyNavigationController`` とした。

![](http://blog.amay077.net/assets/images/posts/viewcontroller_orientaion_lock_in_xamarin_ios_01.png)

すると、Xamarin Studio 側にも ``MyNavigationController.cs`` ができるので、Stackoverflow の通り、以下のように実装した。

```csharp:MyNavigationController.cs
// This file has been autogenerated from a class added in the UI designer.

using System;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using System.Linq;

namespace MyApp
{
	public partial class MyNavigationController : UINavigationController
	{
		public MyNavigationController (IntPtr handle) : base (handle) { }

        public override UIInterfaceOrientation PreferredInterfaceOrientationForPresentation()
        {
            return this.ViewControllers.Last().PreferredInterfaceOrientationForPresentation();
        }

        public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations()
        {
            return this.ViewControllers.Last().GetSupportedInterfaceOrientations();
        }

        public override bool ShouldAutorotate()
        {
            return this.ViewControllers.Last().ShouldAutorotate();
        }

	}
}
```

次に、横固定にしたい画面Bを以下のように実装。

```csharp:BViewController.cs
// This file has been autogenerated from a class added in the UI designer.

using System;

using MonoTouch.Foundation;
using MonoTouch.UIKit;

namespace MyApp
{
	public partial class BViewController : UIViewController
	{
		public PhotoPreviewViewController (IntPtr handle) : base (handle)
		{
		}

        public override UIInterfaceOrientation PreferredInterfaceOrientationForPresentation()
        {
            return UIInterfaceOrientation.LandscapeLeft;
        }

        public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations()
        {
            return UIInterfaceOrientationMask.LandscapeLeft;
        }

        public override bool ShouldAutorotate()
        {
            return false;
        }
	}
}
```

これで動かしてみたものの、一向に画面が固定されない。
しばらく悩んだ後、``MyNavigationController`` のコンストラクタにブレークポイントを仕掛けてデバッグしてみたとても止まらない。
よくよくアプリケーション出力のコンソールを見てみると、

> Unknown class MyNavigationController in InterfaceBuilder file."

と出力されていることに気づいた。
なんか、.storyboard と C# クラスの関連付けがうまくいってないらしい。

ソリューションをクリアして、再ビルドしたらこのエラーは消え、画面Bの向きが固定されるようになった！

(ただ、縦画面のまま画面Bに遷移すると縦画面で固定されてしまう。これは実装が何か足りない気がする。)
SublimeText2で現在開いているファイルをサイドバー上の位置を示すショートカット・パッケージ

■ショートカット
```
// 位置を示す
{"keys": ["super+shift+r"], "command": "reveal_in_side_bar"}
// フォーカス
{ "keys": ["super+shift+u"], "command": "focus_side_bar"}
```

■パッケージ
SyncedSideBar
https://github.com/sobstel/SyncedSideBar
押すと上にスルスルっと戻るJavaScriptモジュール


動作そのものっていうより、JavaScriptでのnamespaceの実装とか、prototypeを使ったモジュールを作ったりとかの練習をしたかった感じです。


```js
var ns = (function(exports) {
  var Raise = function constructor() {
    this._init_handler = function(func) {
      window.addEventListener('load', func);
    };
  };

  Raise.prototype.register = function(id) {
    var to_top = function(e) {
      var scroll_top = document.documentElement.scrollTop || document.body.scrollTop;
      if (scroll_top > 0) {
        var diff = Math.max(scroll_top / 2, 20);
        window.scrollTo(0, scroll_top - diff);
        window.setTimeout(to_top, 25, e);
      }
    };

    this._init_handler(function() {
      var target = document.getElementById(id);
      target.addEventListener('click', to_top);
    });
  };

  exports.Raise = Raise;
  return exports;
})({});


var RAISE_BUTTONS_ID = 'raise-top';
var raiser = new ns.Raise();
raiser.register(RAISE_BUTTONS_ID);
```

あとは`<div id="raise-top"></div>`みたいなもんを置いてあげて、cssで見た目を整えてあげればスルッとのぼるアレになります。
特定のソースコードがいつ変更されたか知る

```bash
$ git blame foo.txt
```

とすると各行にコミットの情報が出てくるので、
ハッシュ値をコピーしておく。

```bash
$ git show ハッシュ値
```

上記でどのようなコミットがなされたか確認出来る。

## 参考リンク

http://qiita.com/siluejp/items/44960964ecbac77fe19a
ssh configで踏み台サーバーを使ってる時にワイルドカードで手抜きができた

そもそも.ssh/configでワイルドカードが使えるなんて知らなかった。知らなかったんですよ。

踏み台サーバーを経由したことにして直接サーバーに入るための.ssh/configの設定は以前書きました。
[http://kazuph.hateblo.jp/entry/2013/02/04/192358](http://kazuph.hateblo.jp/entry/2013/02/04/192358)

以前は以下のように、serverが増える度に設定を追加してました。

```.ssh/config
# 踏み台サーバー
Host fumidai
  HostName fumidai-no-server
  User username

# 踏み台後に入りたいサーバー Hostは適当 また説明に不要な設定は省いている
Host server-app1
  HostName server-app1
  User username
  ProxyCommand ssh -W %h:%p fumidai

Host server-app2
  HostName server-app2
  User username
  ProxyCommand ssh -W %h:%p fumidai

以下同じようなサーバー名が続く…
```

他にもserver-db-masterとかserver-db-slaveとかserver-adminとか、これは単なる例ですが、server-*なサーバー名が続き、かつserver-*なサーバーヘは必ず踏み台を経由するなら、

```.ssh/config
Host server-*
  User username
  ProxyCommand ssh -W %h:%p fumidai
```

と書くだけで、```ssh server-app1```でも```ssh server-db1```でも、ホスト名があってるなら入れるようになります！

入らないといけないサーバーが数十台になってくると、.ssh/configも数百行になってくるのでこれでその管理からも開放されました。

便利ですね。


ただし、ターミナルでの補完が効かなくなりました。
これだけ残念。
CANNON.jsのConvexPolyhedronにBlenderから書きだしたデータを読み込ませる


BlenderのThree.js exporterで書きだしたデータから、CANNON.jsのConvexPolyhedronに読み込ませるためのデータを生成する方法のメモ。
CANNON.jsの情報が少ないのでだいぶ大変。

結論から言うと、Blenderで書きだしたJSONファイルは、なんか変なフォーマットになっていたのでまずはそこを修正。
具体的には、facesプロパティの数がやたらと多い。meta dataを見ると150くらいなのに、配列数は700とかあった。
多分、Three.js側でなにかしら利用しているんだと思うけど、CANNON.jsでは使わないので編集。

さらによく見てみると、セパレータとして使われているように見える数字が。
faces配列の最初の数字はおそらくセパレータとして機能しているみたいなので、その数字を配列からすべて消す。その上で、meta dataに書かれている数だけ先頭から取り出し新しい配列にする。

サンプルは以下。

```js
{
	//...略
	"vertices" : [1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,0.999999,1,1,-1,1,1,-1,1,-1],
	"faces" : [35,0,1,2,3,0,0,1,2,3,35,4,7,6,5,0,4,5,6,7,35,0,4,5,1,0,0,4,7,1,35,1,5,6,2,0,1,7,6,2,35,2,6,7,3,0,2,6,5,3,35,4,0,3,7,0,4,0,3,5],
	//...略
}
```

facesの中に、`35`という明らかにindexとしておかしい数値が含まれている。
なので、まずはこの`35`をすべて消し、さらにmeta dataに`"faces": 6`と書かれてるので、配列の数を6にする。

修正後は以下。

```js
"faces" : [0,1,2,3,0,0],
```

データを修正したら、CANNON.jsのモデルデータを使ったサンプルを元に、以下のようにしたら無事動いた。

```js
var compound = new CANNON.Compound();
for(var i=0; i<someModel.length; i++){

    var rawVerts = someModel[i].verts;
    var rawFaces = someModel[i].faces;
    var rawNormals = someModel[i].normals;
    var rawOffset = someModel[i].offset;

    var verts=[], faces=[], normals=[], offset;

    // Get vertices
    for(var j=0; j<rawVerts.length; j+=3){
        verts.push(new CANNON.Vec3( rawVerts[j]  ,
                                    rawVerts[j+1],
                                    rawVerts[j+2]));
    }

    for(var j=0; j<rawNormals.length; j+=3){
        normals.push(new CANNON.Vec3(rawNormals[j+0],
                                     rawNormals[j+1],
                                     rawNormals[j+2]));
    }

    // Get faces
    for(var j=0; j<rawFaces.length; j+=3){
        faces.push([rawFaces[j],rawFaces[j+1],rawFaces[j+2]]);
    }

    // Get offset
    offset = new CANNON.Vec3(rawOffset[0],rawOffset[1],rawOffset[2]);

    // Construct polyhedron
    var someModelPart = new CANNON.ConvexPolyhedron(verts,faces, normals);

    // Add to compound
    compound.addChild(someModelPart,offset);
}
```

`compound`は複合体を表しているぽい。
ので、これをRigidBodyのコンストラクタに形状データとして渡してやれば、あとはCANNON.jsがちゃんと物理演算してくれる。

```js
var body = new CANNON.RigidBody(1, compound);
```

基本的に凸多面体がベースなので、複雑なモデルデータの場合はそれぞれ凸多面体の複合体となるように分割しなければいけないから、Blenderから書き出すのは大変かも。
ChromeのNetBeans Connectorが動作しないと思ったらProxy設定のせいだった

NetBeansにはHTML5プロジェクトでデバッグに使える[Chrome用のNetBeans Connector](https://chrome.google.com/webstore/detail/netbeans-connector/hafdlehgocfcodbgjnpecfajgkeejnaa)がある。
これを職場で使おうと思ったら、Proxy設定が原因で起動しなかったのでメモ。

## ことのはじまり
ChromeにNetBeans Connector Extensionを導入した。詳しくは[こちら](https://netbeans.org/kb/docs/webclient/html5-gettingstarted_ja.html?print=yes)。

しかし、HTML5プロジェクトでツールバーからNetBeans Connector統合付きChromeを選択して実行しても、デバッグモード（黄色いバーつき）でのWebページが表示されなかった。

アドレスバーでも、正常に動作していれば

```
http://localhost:8383/...
```

の様なURLになるはずが、

```
file:///var/folders/sz/7766s54x6vq3c832t3b5y9200000gn/T/blank39839856561138140.html
```

のようなURLが表示されてしまう。

職場はHTTPプロキシが必須の環境で、かつStackOverFlowに[Proxy除外設定を見直せよ](http://stackoverflow.com/questions/15392099/netbeans-with-chrome-integration-is-not-working-for-html5)的な情報があったので、localhostに加えて127.0.0.1も除外するようにプロキシ設定を見直したところ、正常に動作した（単なる名前解決の問題ですね）。

## 解決方法
1. NetBeansのプロキシ設定が「システムのプロキシ設定を使用」になってるなら、OSXのネットワーク設定の「プロキシ設定をしようしないホストとドメイン」で  localhost の他に 127.0.0.1/32 を追加。
1. 「手動でプロキシ設定」になっているのなら、「詳細」から「プロキシ・ホストなし」の欄に127.0.0.1を設定。
bashで連番生成


### 概要

連番生成時のbashとzshの違いのまとめ

### 動作確認環境

```sh:env&version
% uname -a 
Darwin Macmini.local 13.0.0 Darwin Kernel Version 13.0.0: Thu Sep 19 22:22:27 PDT 2013; root:xnu-2422.1.72~6/RELEASE_X86_64 x86_64
% bash --version 
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.
% zsh --version 
zsh 5.0.2 (x86_64-apple-darwin13.0)

```

### 基本

* 連番を作る

```sh:bash&zsh
% echo {1..10}
1 2 3 4 5 6 7 8 9 10
% echo {10..1}
10 9 8 7 6 5 4 3 2 1
```

### 応用

* コマンド結果から連番を作る

```sh:zsh
% zsh -c 'echo {$(date -r 1388502000 -v -1d +%d)..1}' 
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
```

```sh:bash
% bash -c 'echo {$(date -r 1388502000 -v -1d +%d)..1}' 
{31..1}
% /bin/sh -c 'eval "echo $(echo {$(date -r 1388502000 -v -1d +%d)..1})"' 
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
```

bashではコマンド結果から連番を生成できないのでコマンド結果をevalした
むろんzshでも動く

```sh:zsh
% zsh -c 'eval "echo $(echo {$(date -r 1388502000 -v -1d +%d)..1})"' 
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
```

長い上にわかりにくいので短くした

```sh:bash&zsh
% bash -c 'eval "echo {$(date -r 1388502000 -v -1d +%d)..1}"'
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
% zsh -c 'eval "echo {$(date -r 1388502000 -v -1d +%d)..1}"'
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
```
iOSのシングルトンの話

皆さんiOSでシングルトンは使っていますか？
シングルトンはいわゆるデザインパターンと呼ばれるもので、複数のクラス間の変数、オブジェクト、メソッドのやりとりを劇的に簡単にすることが可能です。
このように便利ですが今ひとつとっつきずらいiOSのシングルトンについてこの記事では少々解説したいと思います。

シングルトンを使用したクラスには、例えば以下のメリットが有ります。
・複数のクラス間での変数やオブジェクトの共有が簡単にできる。
・複数のクラス間でメソッドの共有ができる。
・ViewControllerの機能を分担させることができる。

一方で、以下のようなデメリットも有ります。
・不要になっても自動的に解放されない。
・何度もインスタンス化することができない。

必要に応じて、通常のクラスとシングルトンを適用したクラスを使い分けるといいと思います。

シングルトンですが、シングルスレッドの場合は次のように書くことができます。

```objc:SingletonSample.h
@interface SingletonSample : NSObject
+ (SingletonSample *)sharedManager;
@end
```

```objc:SingletonSample.m
@implementation SingletonSample

static SingletonSample *sharedData_ = nil;

+ (SingletonSample *)sharedManager{
    if (!sharedData_) {
         sharedData_ = [SingletonSample new];
    }
    return sharedData_;
}

- (id)init
{
    self = [super init];
    if (self) {
        //Initialization
    }
    return self;
}
```

他のクラスからシングルトンのクラス内のプロパティやメソッドにアクセスするためには、以下のように記述します。

```objc
    [SingletonSample sharedManager].(プロパティ名) 
    [[SingletonSample sharedManager] (メソッド名)];
```

シングルトンではインスタンスの初期化が最初の１回しか行われず、それ故に１つのインスタンスを共有できることがメリットですが、マルチスレッドの場合は複数のスレッドが同時に初期化を行ってしまう危険性があります。
そのため、以下のように@synchronizedを使ったスレッドセーフな記述をした方がベターかと思います。

```objc:SingletonSample.m
@implementation SingletonSample

static SingletonSample *sharedData_ = nil;

+ (SingletonSample *)sharedManager{
    @synchronized(self){
        if (!sharedData_) {
            sharedData_ = [SingletonSample new];
        }
    }
    return sharedData_;
}

- (id)init
{
    self = [super init];
    if (self) {
        //Initialization
    }
    return self;
}
```

もしくは、以下の通りにdispatch_once_tを使ってアプリの起動中初期化処理は１回のみにするという手もあります。これもスレッドセーフです。

```objc:SingletonSample.m

@implementation SingletonSample

static SingletonManager* sharedData_ = nil;

+ (SingletonSample*)sharedManager
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedData_ = [SingletonSample new];
    });
    return sharedData_;
}
```

それでは、@synchronizedとdispatch_once_tを使った方法が全く一緒なのかというと、微妙に異なります。
前述の通り、dispatch_once_tはアプリの起動中１回しか起動できないので、一度sharedData_のメモリを解放してしまうともう初期化ができません。
@synchronizedの場合は、例えば同じシングルトンのクラスの中に、

```objc:SingletonSample.m
- (void)terminate{
    _sharedData = nil;
}
```

と書くことで_sharedDataを解放後に、再び初期化することができます。
メモリの解放は関数が終了した後に行われるようですので特に問題は無いようです。
クラス内の変数が多すぎて値を初期値に戻すのが大変な場合は、この手を使うのも有りかと思います。

という認識ですが、間違った内容があれば是非教えてくださいね。
javascriptによるソートの基本


```js
            var yosanArray = [
                {namae:'野球部',yosan:15000},
                {namae:'サッカー部',yosan:10000},
                {namae:'柔道部',yosan:8000},
                {namae:'バスケ部',yosan:20000}
            ];
            yosanArray.sort(
                function(a,b){
                    var aYosan = a['yosan'];
                    var bYosan = b['yosan'];
                    if(aYosan<bYosan){
                        return -1;//aYosanが前に行く。
                    }
                    if(aYosan>bYosan){
                        return 1;//aYosanが後ろに行く。
                    }
                    if(aYosan = bYosan){
                        return 0;//並び替えない。
                    }
                }
            );
                for(var i = 0;i < yosanArray.length;i++){
                    document.write(
                        i+':'+
                        yosanArray[i]['namae']+
                        ','+
                        yosanArray[i]['yosan']+'<br/>'
                    );
                }
```
return -1/0/1で前にあった変数を一つ一つ前に行くのか後ろに行くのかを指定していく。

連想配列.sort(function(a,b)~);
を無名関数という。a,bには[]で連想配列のkey変数を返す。
コンテキストによって指し示すthisの違い


\<html lang="ja">
    \<head>
        \<meta charset="utf-8"/>
        \<script>
	　　///////////////////////////
            function Dog(){
                this.age = 3;
                this.name = 'pochi';
            };
		///////////////////////////
		//ここではfunction Dogのthisを実行しているのはDogオブジェクト。
		//コンストラクタにインスタンスするときはnewの後に半角１文字のスペースを開ける。
            var anyDog = new Dog();
            console.log(Dog);
        \</script>
        <style>
            
        </style>
    </head>
    <body>
        <div id="container">
            <div id="target">
            </div>
        </div>
    </body>
</html>
スクロールで背景の色を変化させるjs


\<html lang="ja">
   \<head>
        \<meta charset="utf-8"/>
        \<script>
            window.onload = function(){
            
            var r = 0,g = 0,b = 0;
            var rd =1,gd = 1,bd = 1;
            
            window.addEventListener('scroll',function(){
                r += ~~(Math.random()*10)*rd;
                g += ~~(Math.random()*10)*gd;
                b += ~~(Math.random()*10)*bd;
                
                if(r>255){
                    r = 255;
                    rd = -1;
                }
                if(r<0){
                    r = 0;
                    rd = 1;
                }
                if(g>255){
                    g = 255;
                    gd = -1;
                }
                if(g<0){
                    g = 0;
                    gd = 1;
                }
                if(b>255){
                    b = 255;
                    bd = -1;
                }
                if(b<0){
                    b = 0;
                    bd =1;
                }
                
                document.body.style.backgroundColor = 'rgb('+r+','+g+','+b+')';
                },false);
            };
            
        </script>
        <style>
            
        </style>
    </head>
    <body>
        <div id="container">
            <div id="target">
            </div>
        </div>
    </body>
</html>
Google App Engine for PythonでTweet(API1.1)


http://offsidenow.phpapps.jp/archives/1664

・Python2.7
・TwitterAPI1.1
・OAuthライブラリ(https://github.com/mikeknapp/AppEngine-OAuth-Library)


```tweet.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-

from google.appengine.ext import webapp

#さきほど取得した各情報をここで指定する
TWITTER_CONSUMER_KEY = 'コンシューマーキー'
TWITTER_CONSUMER_SECRET = 'コンシューマーシークレット'
TWITTER_ACCESS_TOKEN = 'アクセストークン'
TWITTER_ACCESS_TOKEN_SECRET = 'アクセストークンシークレット'

class TweetHandler(webapp.RequestHandler):
  def get(self):
    from extends.GAE_Oauth import oauth
    client = oauth.TwitterClient(TWITTER_CONSUMER_KEY,
                                 TWITTER_CONSUMER_SECRET, None)
    tweet = u"おはよう"
    param = {'status': tweet}
    client.make_request('https://api.twitter.com/1.1/statuses/update.json',
                        token=TWITTER_ACCESS_TOKEN,
                        secret=TWITTER_ACCESS_TOKEN_SECRET,
                        additional_params=param,
                        protected=True,
                        method='POST')
    self.response.out.write(tweet)
```
gitの管理対象から特定のファイル、ディレクトリを削除する


追記: 下記記載内容も含め、様々なTipsを記載: [Git Tips - Qiita](https://qiita.com/ytkt/items/f5127c77feabc4354d88)


## gitの管理対象から特定のファイル、ディレクトリを削除する

`.gitignore`書き忘れて `add` & `commit` しちゃったとかよくありますよね。そんな人いないっすよね:-)
そんな時は `git rm`。

## ファイルも一緒に削除したいとき〜
```bash
$ git rm [削除したいファイル]
```

## ディレクトリごと逝きたいとき〜
```bash
$ git rm -r [削除したいディレクトリ]
```

## ファイルを残したいとき〜
`--cached`オプションを付けることにより、ファイルを残したまま管理対象から外すことができます。

```bash
$ git rm --cached [削除したいファイル]
```

ファイルを残した場合は必ず`.gitignore`に追記するように。

## ちなみに～
`.gitignore`作るのは”[gibo](https://github.com/simonwhitaker/gibo)”を使うと便利です。

[.gitignoreを作ってくれるgiboが便利すぎる - hnwの日記](http://d.hatena.ne.jp/hnw/20121221)
シェルスクリプトでTCPの読み書きをする

LinuxではシェルスクリプトだけでTCPの読み書きが出来るのでやり方をメモ。

# BASHでTCPクライアント
```bash
#適当なファイルディスクリプタでTCPを開く（0,1,2は標準入力/出力/エラーで使われてるからそれ以外）
exec 5<>/dev/tcp/www.google.com/80

#先程のディスクリプタに対して書き込む
echo "GET / HTTP/1.1" >&5
echo "Host: www.google.com" >&5
echo >&5

#レスポンスをディスクリプタから読み込む
cat <&5
HTTP/1.1 302 Found
Location: http://www.google.co.jp/?gws_rd=cr&ei=5azLUvfcBczRkwXW4oCADw
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=bcfe5bc4c98312a1:FF=0:TM=1389079781:LM=1389079781:S=syDn3Htc1dVCRLQ8; expires=Thu, 07-Jan-2016 07:29:41 GMT; path=/; domain=.google.com
Set-Cookie: NID=67=hRM9vKYySsBxDFxWTWC92D5ThwJy08b4A894fGt6ZyXIIhaWkbfB-vpdO44-jb6LJIO_dJnMVGaP_5QIus2HNqHNvSHc9tq84lLIBA6N-YWwKizdOpVIyPvqKDiPieX3; expires=Wed, 09-Jul-2014 07:29:41 GMT; path=/; domain=.google.com; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
Date: Tue, 07 Jan 2014 07:29:41 GMT
Server: gws
Content-Length: 261
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Alternate-Protocol: 80:quic

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.co.jp/?gws_rd=cr&amp;ei=5azLUvfcBczRkwXW4oCADw">here</A>.
</BODY></HTML>
```

# BASHでTCPサーバ
残念ながらBash単体ではTCPのbind(LISTEN)は出来ないのでTCPサーバにはなれません。他のコマンド使って下さい。
EC2のPublicDNSの解決の仕組み

#結論
- 同じリージョンであればZoneが異なっても、Public DNSはPrivate IPとして解決される
- リージョンが異なるとPublic DNSはPublic IPとして解決される

#確認してみた
同じリージョンの異なるゾーンでインスタンスをたてる

1.us-west-2a 

```
Public DNS:ec2-54-203-255-149.us-west-2.compute.amazonaws.com
Public IP:54.203.255.149
Elastic IP:54.203.255.149

Private DNS:ip-10-252-192-161.us-west-2.compute.internal
Private IPs:10.252.192.161

Security groups:launch-wizard-1
```

2.us-west-2c

```
Public DNS:ec2-54-245-152-35.us-west-2.compute.amazonaws.com
Public IP:54.245.152.35 

Private DNS:ip-10-217-149-198.us-west-2.compute.internal
Private IPs:10.217.149.198

Security groups:launch-wizard-1
```

3.ap-northeast-1a
異なるリージョンのサーバーも用意しておく

```
Public DNS:ec2-54-238-12-24.ap-northeast-1.compute.amazonaws.com
Public IP:54.238.12.24

Private DNS:ip-10-132-73-226.ap-northeast-1.compute.internal
Private IPs:10.132.73.226
```



## IPの解決
###us-west-2cからus-west-2aを呼ぶ場合

```
[ec2-user@ip-10-217-149-198 ~]$ nslookup ec2-54-203-255-149.us-west-2.compute.amazonaws.com
Server:		172.16.0.23
Address:	172.16.0.23#53

Non-authoritative answer:
Name:	ec2-54-203-255-149.us-west-2.compute.amazonaws.com
Address: 10.252.192.161

[ec2-user@ip-10-217-149-198 ~]$ nslookup ip-10-252-192-161.us-west-2.compute.internal
Server:		172.16.0.23
Address:	172.16.0.23#53

Non-authoritative answer:
Name:	ip-10-252-192-161.us-west-2.compute.internal
Address: 10.252.192.161
```
Public DNSもPrivate DNSもPrivate IPの10.252.192.161となった

ここで、us-west-2aをStop/Startしてみる

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html
![AWSのドキュメント](http://gyazo.com/9b701ad02bea6452d070d0f6b05cdad9.png)
classicの場合は、Elastic IPが外れるので、手動で再度関連づける

```
Public DNS:ec2-54-203-255-149.us-west-2.compute.amazonaws.com
Public IP:54.203.255.149
Elastic IP:54.203.255.149

Private DNS:ip-10-217-149-198.us-west-2.compute.internal
Private IP:10.232.1.18

Security groups:launch-wizard-1
```

```
[ec2-user@ip-10-217-149-198 ~]$ nslookup ec2-54-203-255-149.us-west-2.compute.amazonaws.com
Server:		172.16.0.23
Address:	172.16.0.23#53

Non-authoritative answer:
Name:	ec2-54-203-255-149.us-west-2.compute.amazonaws.com
Address: 10.232.1.18

[ec2-user@ip-10-217-149-198 ~]$ nslookup ip-10-232-1-18.us-west-2.compute.internal
Server:		172.16.0.23
Address:	172.16.0.23#53

Non-authoritative answer:
Name:	ip-10-232-1-18.us-west-2.compute.internal
Address: 10.232.1.18

```
Elastic IPはかわらないが、`nslookup ip-10-217-149-198.us-west-2.compute.internal`の結果は、あたらしいPrivate IP(10.232.1.18)になった（期待通り）

###us-west-2cからap-northeast-1aを呼ぶ場合

```
[ec2-user@ip-10-217-149-198 ~]$ nslookup ec2-54-238-12-24.ap-northeast-1.compute.amazonaws.com
Server:		172.16.0.23
Address:	172.16.0.23#53

Non-authoritative answer:
Name:	ec2-54-238-12-24.ap-northeast-1.compute.amazonaws.com
Address: 54.238.12.24

[ec2-user@ip-10-217-149-198 ~]$ nslookup ip-10-132-73-226.ap-northeast-1.compute.internal
Server:		172.16.0.23
Address:	172.16.0.23#53

** server can't find ip-10-132-73-226.ap-northeast-1.compute.internal: NXDOMAIN

```
Public DNSの解決はできたが、Private DNSは解決できない

##まとめ
- 同じリージョンであればZoneが異なっても、`Public DNS`は`Private IP`として解決される
- リージョンが異なると`Public DNS`は`Public IP`として解決される
HDFSの再バランス


#課題

Hadoopでhdfsを使用しているが下記の様なことが発生した

* 特定のノードだけ妙にswapしたり負荷が高くなったりする
* 追加したノードが使われていない気がする。

#原因

HDFSは、頻繁に書き込みや削除を繰り返すとデータに偏りが出てきてしまうため(データの断片化）、特定のノードにデータを取得してしまうため負荷も偏ってしまう。

また、ノードを追加した時に自動で再バランスするわけではないので、手動で再バランスをするか、新しいファイルを作るタイミングからブロックを割り当てるのを待つしかないようです。

#再バランス結果

各ノードのデータ量を平準化するためCloudera Managerで再バランスをしてみる

####手順

`サービス -> hdfs -> アクション -> 再バランス`

####結果ログ

```
2014-01-07 12:34:12,342 INFO  [main] balancer.Balancer (Balancer.java:parse(1538)) - Using a threshold of 10.0
2014-01-07 12:34:12,351 INFO  [main] balancer.Balancer (Balancer.java:run(1417)) - namenodes = [hdfs://nameservice1]
2014-01-07 12:34:12,353 INFO  [main] balancer.Balancer (Balancer.java:run(1418)) - p         = Balancer.Parameters[BalancingPolicy.Node, threshold=10.0]
Time Stamp               Iteration#  Bytes Already Moved  Bytes Left To Move  Bytes Being Moved
2014-01-07 12:34:14,239 INFO  [main] net.NetworkTopology (NetworkTopology.java:add(393)) - Adding a new node: /default/192.168.1.1:50010

(snip)

2014-01-07 12:34:14,253 INFO  [main] balancer.Balancer (Balancer.java:logNodes(907)) - 0 over-utilized: []
2014-01-07 12:34:14,257 INFO  [main] balancer.Balancer (Balancer.java:logNodes(907)) - 2 underutilized: [BalancerDatanode[192.168.1.6:50010, utilization=0.35506872895520886], BalancerDatanode[192.168.1.7:50010, utilization=0.372112826760373]]
2014-01-07 12:34:14,264 INFO  [main] balancer.Balancer (Balancer.java:run(1344)) - Need to move 91.54 GB to make the cluster balanced.
2014-01-07 12:34:14,267 INFO  [main] balancer.Balancer (Balancer.java:chooseSource(1086)) - Decided to move 10 GB bytes from 192.168.1.2:50010 to 192.168.1.6:50010
2014-01-07 12:34:14,268 INFO  [main] balancer.Balancer (Balancer.java:chooseSource(1086)) - Decided to move 10 GB bytes from 192.168.1.3:50010 to 192.168.1.7:50010
2014-01-07 12:34:14,273 INFO  [main] balancer.Balancer (Balancer.java:run(1358)) - Will move 20 GB in this iteration
Jan 7, 2014 12:34:14 PM           0                  0 B            91.54 GB              20 GB

(snip)

2014-01-07 14:01:52,211 INFO  [main] balancer.Balancer (Balancer.java:logNodes(907)) - 0 over-utilized: []
2014-01-07 14:01:52,212 INFO  [main] balancer.Balancer (Balancer.java:logNodes(907)) - 0 underutilized: []
The cluster is balanced. Exiting...
Balancing took 1.4613238888888889 hours
```

#まとめ

* 多少の速度低下はあったものの運用したままで再バランスすることはできた
* 2つのノードを新規追加した場合、再バランスを実行すると自動で検出して既存のノードから10GBずつ分配された.
* 全体が1.5TBのデータで91.54GBが再バランス対象を完了するのに1時間半位かかった。(NetworkやIO速度に依存するけど。。)
Storyboardを使わずにStoryboardにあるViewControllerに遷移する

備忘。

参照元こちら。
http://nw.tsuda.ac.jp/class2013/3proj/changeViewController/changeViewController.html


navigationControllerを使った場合を想定して書いています。

```objc
// ストーリーボードを指定する
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
// 遷移先のViewControllerをStoryBoardをもとに作成
HogeViewController *hogeViewController = [storyboard instantiateViewControllerWithIdentifier:@"ここにStoryboardのStoryboard IDに書いた名前を書く"];
// 画面をPUSHで遷移させる
[self.navigationController pushViewController:hogeViewController animated:YES];
```



TableViewControllerで、セルのアクセサリをタッチしたら、hogeViewControllerに遷移する例

```objc
// アクセサリーが押された時に遷移する
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{
	UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    HogeViewController *hogeViewController = [storyboard instantiateViewControllerWithIdentifier:@"hogeHoge"];
	// プロパティに値(indexPath)も渡しちゃう
	hogeViewController.indexPath = indexPath;
	// Pushで遷移
	[self.navigationController pushViewController:editWineViewController animated:YES];
}
Objective-C : クラスの名前をNSStringで取得する

メモ。

```objc
// objectという名前のクラス不明のオブジェクトがあるとき
NSString * className = NSStringFromClass([object class]);
NSLog(@"クラス名は %@", className);
```


参照元こちら。
http://program.station.ez-net.jp/special/handbook/objective-c/id/instanse.asp
Knockout.jsでdata-bindにセットした値を確認する


Knockoutを使っている時に、data-bind上で$parentとか$dataとかの値がどうなってるかを確認したかったのでやり方を考えた。


```html:knockout_console
<p data-bind="text: eval('console.log($parent)')"></p>
```

とりあえずこれでconsoleに出力できるので満足。
正しいやり方とかあるのかな。
iOS7でUDID取得アプリ使ってUDIDを取ると頭にFFFFFFFFがついた無効なUDIDになる


先日、テスト用のアプリを配布するときにUDIDを頂いたとき、UDIDがFFFFFFFF〜から始まっていました。
桁数は40ケタだったのですが、通常なら英字は小文字なのに全部大文字だったし、頭にFFFFFFFFってどう考えてもおかしいと思って調べてみたら、案の定無効なUDIDだったよう。

- [Unusable UDID in new ios7 (with FFFFFFFF prefix) - Stack Overflow](http://stackoverflow.com/questions/19586896/unusable-udid-in-new-ios7-with-ffffffff-prefix)

> 
Yes. The "FFFFFFFF" UDIDs are wrong. This seems due to the fact that the UDID is now considered a Privacy Topic and thus Apps are not allowed anymore to retrieve them... and iOS returns an obfuscated UDID if called and precedes the first digits with FFFFFFFF. So I guess some of your clients got the UDID via an App on the device.

iOS7でUDID取得アプリ使ってUDIDとると、こうなるみたいです。
iOS 7 Release Notesにも記載がありました。

- [iOS 7 Release Notes](https://developer.apple.com/library/ios/releasenotes/General/RN-iOSSDK-7.0/)

> 
-[UIDevice uniqueIdentifier] is no longer accepted in submissions to the App Store. In iOS 7, apps that are already on the store or on users’ devices that call this removed API will no longer be returned the UDID. Instead, -[UIDevice uniqueIdentifier] will return a 40-character string starting with FFFFFFFF, followed by the hex value of -[UIDevice identifierForVendor]. It is important to consider how this will affect existing apps. Consider submitting updates that no longer access the UDID.

iOS 7で取得がダメになったのは知っていましたが、このような形式で返されるのは知りませんでした。
iTunesやiPhone構成ユーティリティなどを使って取得しましょう。
[iOS]setContentSizeをしてもUIScrollViewがスクロールしないときの対処


## 症状

元々は、UIScrollViewでスクロールさせるときには、
ViewControllerのviewDidLoad内で、
scrollViewに対してsetContentSizeを使って
内部コンテンツの大きさを指定してやればスクロールできた。

…はずなのだが、しばらくぶりにXCodeをいじっていたら、それではスクロールできなかったので２４時間ぐらい悩んだ。

## 原因と対処

どうやら、AutoLayoutを使っているとviewDidLoad内でsetContentSizeを呼び出しても駄目らしい。

>参考：　[2012/11/13 [iOS6] AutoLayoutを使用すると、viewWillAppear: でframeが決定しないので注意](http://www.zero4racer.com/blog/988)

AutoLayoutを使う際は、viewDidLayoutSubviews内でsetContentSizeを呼び出してやればうまく動く。

```objc:
-(void)viewDidLayoutSubviews {
    [self.scrollView setContentSize: self.contentView.bounds.size];
    [self.scrollView flashScrollIndicators];
}
```
Ruby1.9.2系からソースコードをビルドしてRuby1.9.3p484にアップデートする方法、またはアップデート直後で自分が引っかかった部分とそれに対する処方箋

Rubyにおいて「[浮動小数点数パースにおけるヒープオーバーフロー (CVE-2013-4164)](https://www.ruby-lang.org/ja/news/2013/11/22/heap-overflow-in-floating-point-parsing-cve-2013-4164/)」なんていう危なげなものがあったので、サーバ上のRubyのバージョンを上げることにしたよ。
作業にかかった時間はおおよそ20~30分程度かな。


# アップデートする前の注意点
**1.9.3に切り替えた時、こんなエラーがちょくちょく出る場合があるんだ。**
> /usr/local/lib/ruby/1.9.1/yaml.rb:83:in `<top (required)>’:
> It seems your ruby installation is missing psych (for YAML output).
> To eliminate this warning, please install libyaml and reinstall your ruby.

解決策： ***libyamlを入れる***

(これを放置することによって起こる弊害は未検証だよ)

## 導入手順

```shell-session
$ su -
# cd /usr/local/src
# wget http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz
# tar -zxvf yaml-0.1.4.tar.gz
# cd yaml-0.1.4
# ./configure
# make
# make install
```

# rubyのアップデート

```shell-session
$ su -
# cd /usr/local/src
# cd (旧版のrubyのあるディレクトリ)
# cat .installed.list | xargs rm
# cd ../
# wget http://cache.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p484.tar.gz 
# tar zxvf ruby-1.9.3-p484.tar.gz
# cd ruby-1.9.3-p484
# ./configure
# make
# make install
```

1. rootではいる
2. 旧版rubyを削除
3. 新しいのをDL
4. 解凍
5. configureしてmakeしてインストール

## 導入完了！

完了後、バージョンチェックしてみよう。

```shell-session
$ ruby -v
ruby 1.9.3p484 (2013-11-22) [i686-linux]
```

### おまけ：libyamlを入れる前にうっかり間違えてrubyを入れ替えた場合

なんてことはない。
libyamlを導入(前述)してrubyを再インストールしよう。
以下を実行すれば多分大丈夫。

```shell-session
# cd /usr/local/src/ruby-1.9.3-p484
# cat .installed.list | xargs rm
# make clean
# make
# make install
```

# 番外編: rbenvを使ったバージョン切り替え

ローカルのrubyを更新する場合等。
ruby-buildをアップデートしないと新しいバージョンが一覧に出てこない。

詳細はこのへんが詳しい。
http://qiita.com/kawasy/items/5d000afa6571c71c2723
ちなみにgithubからの場合でgitコマンドを動かすのは(普通に入れていれば)この場所。

```shell-session
$ cd ~/.rbenv/plugins/ruby-build/
```

場所がわからなくてあたふたしたので補則。

# 番外編: railsとか何やらが起動しない
こんなのが出ちゃう。
> found a tab character that violate intendation while scanning a plain scalar at line 59 column 9 (Psych::SyntaxError)


原因：ruby1.9.2と1.9.3でYAMLのライブラリが変わったから。
http://qiita.com/udzura/items/ec4c5b83db94363c9cdf
解決法：使ってるYAMLファイルにタブ文字が入っているので、grepして探してそれを修正する。
grepのタブ文字検索の方法は以下を参照のこと
http://akio0911.net/archives/3051

ちなみに1.9.2ではタブ文字が入っていようが起動するみたい。


### 参考資料
http://d.hatena.ne.jp/donbulinux/20111111/1321004527
http://pyyaml.org/wiki/LibYAML
http://d.hatena.ne.jp/mikage014/20091021/p1
http://d.hatena.ne.jp/koziy/20111104/1320370451
http://centos.bungu-do.jp/archives/000294.html
http://tech.tmd45.jp/entry/2013/07/03/182414
http://fjordegg.tumblr.com/post/36575034137/day-13-mysql-readme
http://www.smokeymonkey.net/2013/11/ruby-on-macbook.html
http://qiita.com/udzura/items/ec4c5b83db94363c9cdf
http://akio0911.net/archives/3051
ある文字が含まれている行を削除する際の正規表現と改行コード　（さくらエディターなどで使うとき）

# ある文字が含まれている行を削除するには

以下で検索をかけて、削除するといいです。

```vim
^.*対象の文字.*\r\n|\n|\r
```

# 英数字の大文字小文字を区別しない場合は以下の通り。

```vim
^.*(?i)taisyounomoji.*\r\n|\n|\r
```

# 空行の削除は以下の通り

```vim
^\r\n|\n|\r
```

# ちなみにvimでは

```vim
:g/^.*(?i)対象の文字.*\r\n|\n|\r/d
```

## 正規表現に一致しなかった行を削除の場合は

```vim
:v/^.*(?i)taisyounomoji.*\r\n|\n|\r/d
```


# 改行コード

改行のパターンは以下の通り。

```vim
1. \r\n　： CR+LF
2. \r　　： CRのみ
3. \n　　： LFのみ
```

なので、それぞれにあった改行コードを正規表現で記載するといい。
めんどくさい時は、上記の様に全部盛りでやるのもあり。
【JavaScript】ランダムで1か2を取得する

こんにちは。
よく使われるので、メモ

結論から出すと

```js
Math.floor(Math.random()*2 + 1) ;
```

準備：
>
Math.random()
0 以上 1 未満の範囲で疑似乱数を返す

>
Math.floor()
小数点以下の切捨て

何故*2なのかは、Math.random()関数が0以上1未満であり
Math.floor()は切捨てを行うので、2以上の数が出ることがないため。

と、書いていて気づいたのですが
0<1の間で乱数を作成してから2をかけ、1を足して
小数点以下の数字を切捨てだと完全な乱数になるのかな。

と不意に漠然と思いました。

それではこれからもよろしくお願いいたします。
これだけはおさえておきたい！Selenium IDEのコマンド

## はじめに
* 今はSeleniumWebdriverを使っているが、昔Selenium IDEを使っていて今日使おうとしたらコマンドをド忘れしていたのでメモメモ

## コマンドについて
* コマンドはstoreXXX、verityXXX、assertXXXというように３種類用意されている
 * storeXXXは値を変数に格納したいときに使う
 * verifyXXX、assertXXXは検証ときに使う
 * verifyXXXはテストが失敗してもそれ以降のテストが実行可能だが、assertXXXは失敗した時点でテストは中断される

## よく使うコマンド(要素検証系)
* 以下は、Qiitaページ内で使った例

| コマンド | 対象(例) |値(例) |説明|
|:-----------|:------------|:------------|:------------|
| open|http://qiita.com/|指定なし|対象で指定したURLにアクセス|
| verifyTitle |ホーム - Qiita [キータ]|指定なし| タイトルを検証 |
| verifyText|css=#main h2|プログラミング知識を共有しよう。|テキストを検証|
| verifyAttribute|css=#home-user_info img@alt|oh_rusty_nail|要素の属性を検証|
| verifyCssCount|css=#main h2|1|要素数を検証|
|pause|1000|指定なし|指定した時間(ミリ秒)待機|
|type|css=#q|oh_rusty_nail|テキストボックスに値を入力|
|clickAndWait|css=#search-button|指定なし|クリックしてページがロードされるまで待機|

## よく使うコマンド(変数に値を格納/呼び出し)
* javascript式を使用しない場合

| コマンド | 対象(例) |値(例) |説明|
|:-----------|:------------|:------------|:------------|
|store|Qiita|qiita|変数"qiita"に文字列"Qiita"を格納|
|storeTitle|pagetitle|指定なし|変数"pagetitle"に文字列"ホーム - Qiita [キータ]"を格納|
|echo|${pagetitle}|指定なし|格納した値を表示(変数に格納されている値は${}で呼び出せる)|

* javascript式を使用した場合

| コマンド | 対象(例) |値(例) |説明|
|:-----------|:------------|:------------|:------------|
|store|javascript{storedVars.pagetitle = 'ホーム - Qiita [キータ]'}|指定なし|storeコマンドと同意|
|getEval|storedVars.pagetitle='ホーム - Qiita [キータ]';|指定なし|storeコマンドと同意|
|verifyEval|storedVars.pagetitle == this.page().getDocument().title;|true|javascipt式の評価も可能|


* getEvalは対象のところにjavascript式を書くことができる
 * storedVars.変数名で定義、呼び出しが可能

## 最後に
* コマンドはたくさんあり、使い方もリファレンスを読めば丁寧に書いてあるので詳しくはそちらを
* ループ処理にも対応しています（結構お世話になりました）
 * この記事が参考になりました → http://iflaglabs.jp/original10.html

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
timezone が狂ってしまっているときの設定方法

<h2> 時刻再設定 </h2>
<p>1 /usr/sbin/tzconfig を実行し /etc/timezone と /etc/localtime を作成
</p><p>2 コマンドを入力
</p>
<pre>date --set="Tue Dec 21 03:03:03 JST 1999"
</pre>
<p>って感じで localtime の日時を設定
</p><p>3 ハードウェアクロックをシステムクロックにあわせる
</p>
<pre>hwclock --systohc --localtime
</pre>
<h2> もっと正確な時間を設定したいんだ！ </h2>
<p>「もっと正確な時間を設定したいんだ！自分で時間なんて打てないぜ〜」という方は ntpdate というパッケージをインストールして、
</p>
<pre>ntpdate ntp.nict.jp
</pre>
<p>とすれば、OKです。あとは、3. を実行してね。
不幸にも the NTP socket is in use, exiting とかいうエラーが出たら -u を入れてみて。
</p>
<pre>ntpdate -u ntp.nict.jp
</pre>
<p>これでいけるはず。