OmniAICreator/Qiita-1.07M huggingface dataset:
detect bash（bashから実行されているかどうかの判定）  

ある日同僚がこんなことを言っていた。

「ねえ @ma2saka さん。シェルスクリプトを強制的に bash で起動するにはどうしたらいいだろう。
　ちょっと bash に依存したスクリプトを書きたいんだけど、shで実行されたら嫌なんだよね」

で、帰りの電車で考えていたわけです。

## コメントで指摘もらった方式

昨晩考えていた方法はだいぶ的外れだったようです。コメントで指摘もらいました。

```bash
if [ -z "$BASH_VERSION" ] || [ "${BASH##*/}" != "bash" ]; then
  echo "$0: ERROR: Use bash" >&2
  exit 1
fi

echo "foo bar com"
```

簡潔ですね。

### 環境変数とシェル変数

`$BASH_VERSION`と`$BASH`は環境変数ではなくシェル変数です。

```
   Shell Variables
       The following variables are set by the shell:
```

http://codezine.jp/unixdic/w/シェル変数と環境変数 (CodeZine) によれば、

```
シェル変数は、現在実行しているシェルの中だけで有効な変数であり、環境変数は、新たなシェルを起動したり、コマンドを実行した場合にも継承される変数です。
```

ということで、シェル変数はサブシェルとか内部で実行しているコマンドには引き継がれません。（明示的に設定すれば環境変数として振る舞います）

最初、シェル変数の概念をすっかり忘れていて「BASH_VERSIONとか見ようとしても、親から引き継がれちゃうからなぁ」と悩んでいました。不覚です。

誰かに貸したまま帰ってこない入門bashを読み直さなければ…。

## 以下、蛇足ですが当初考えていた方法

```sh:detect.sh
#!/bin/bash
#tcsh , csh
which builtins | grep 'built-in command'>/dev/null && echo "maybe tcsh..">/dev/stdout && exit 1

#zsh
which comparguments 2>/dev/null | grep 'built-in command' > /dev/null && echo "maybe zsh" && exit 1

# sh
/usr/bin/type source 2>&1 | grep 'shell builtin' > /dev/null
if [ ! "$?" -eq "0" ] ;then
  echo "maybe /bin/sh"
  exit 1
fi

# posix on
set -o | grep posix | grep on > /dev/null && echo "maybe enable posix mode" && exit 1

echo "----------------------"
echo "hello bash!!!"
echo "----------------------"

```

##実行結果

以下のようになりました。ひとまず期待通り…。

```sh:
[tmp]$ csh detect.sh 
maybe tcsh..
[tmp]$ tcsh detect.sh 
maybe tcsh..
[tmp]$ zsh detect.sh 
maybe zsh
[tmp]$ sh detect.sh 
maybe enable posix mode
[tmp]$ bash detect.sh 
----------------------
hello bash!!!
----------------------
```
Unity3Dで、ラベルの色も変えつつ、EditorStyles.numberFiledみたいな見た目にする。

EditorWindowから継承した自作のエディタクラスにおいて、
EditorGUILayout.LabelFieldを表示して、スタイルはEditorStyles.numberFieldを指定していたけれども、
文字色を変えたくなったので無理矢理変えてみた。

そのときのコードが以下。


```csharp:Editor/MyStyle.cs
using UnityEngine;
using UnityEditor;

public class MyStyle : EditorWindow {
	// メニューの表示
	[MenuItem("Window/MyStyleTest")]
	static void CreateWindow(){  // メソッド名はなんでもOKっぽい。
		MyStyle window = (MyStyle)EditorWindow.GetWindow(typeof(MyStyle)); 
		window.title = "MyStyle Test"; 
		window.maxSize = new Vector2(200f, 300f); // サイズは適当
		window.minSize = new Vector2(80f, 150f);
	}

	// エディタウィンドウの描画
	public void OnGUI(){ 
		GUIStyle myStyle = new GUIStyle();
		// myStyleにEditorStyles.numberFieldから必要な値をコピーする。		
		GUIStyle style = EditorStyles.numberField;
		myStyle.border = style.border;
		myStyle.contentOffset = style.contentOffset;			
		myStyle.normal.background = style.normal.background;
		myStyle.padding = style.padding;
		// 文字色を変更
		myStyle.normal.textColor = Color.green;
		EditorGUILayout.LabelField("Label", "Test", myStyle);
	}
}
```

これを、Assets/Editorフォルダにいれると、メニューにWindow->MyStyleTestが追加される。
メニューを選択すると、自作エディタウィンドウが表示される。

![スクリーンショット 0025-08-07 21.38.41.png](https://qiita-image-store.s3.amazonaws.com/0/20722/8e09a1e5-4d8e-fd0f-7782-5b2a5221e85b.png "スクリーンショット 0025-08-07 21.38.41.png")
Rubocopを使ってコーディングルールへの準拠チェックを自動化

## はじめに
チーム内でコーディング規約を作っても，ついクセで違う書き方をしたり気にしない人がいたりして形骸化しがちだと思います．またレビュー時に細かい違いを指摘するのも面倒です．そんなときは[rubocop](https://github.com/bbatsov/rubocop)を入れましょう

## インストール
```ruby
gem i rubocop
```

これでrubocopコマンドがインストールされ，`rubocop foo.rb`とするとチェックできます．
コマンドラインからいちいち実行したくないので，[各エディタのプラグイン](https://github.com/bbatsov/rubocop#editor-integration)をインストール．すると，以下のようにコーディングルールに合わない箇所を指摘してくれます．

![kobito.1375877325.003516.png](https://qiita-image-store.s3.amazonaws.com/0/1/b491160b-b2bd-80a4-8e3d-97045d8ab2c2.png "kobito.1375877325.003516.png")

ここでは「bodyが1行のときは後置ifか，&&や||を使え」と言われています．

## 設定
rubocopが準拠するコーディング規約は[同じ開発者が提案しているもの](https://github.com/bbatsov/ruby-style-guide)ですが，`.rubocop.yml`ファイルを編集することで自分達に合った形に変更することができます．
うちではチームで話し合い，10箇所ぐらい変更しました．

## うちの設定
こんな感じです．(rubocop v0.9.1)
最近のバージョンだとデフォルト設定は別ファイルに切り出されたのでカスタマイズしやすい．

```yaml:.rubocop.yml
# This file overrides https://github.com/bbatsov/rubocop/blob/master/config/default.yml

# Use UTF-8 as the source file encoding.
Encoding:
  Enabled: false

# Limit lines to 80 characters.
LineLength:
  Enabled: false

# Avoid methods longer than 10 lines of code
MethodLength:
  Enabled: false

# Favor modifier if/unless usage when you have a single-line body.
IfUnlessModifier:
  Enabled: false

# Favor modifier while/until usage when you have a single-line body.
WhileUntilModifier:
  Enabled: false

# Preferred collection methods.
CollectionMethods:
  Enabled: false

# Avoid Perl-style regex back references.
AvoidPerlBackrefs:
  Enabled: false

# Don't interpolate global, instance and class variables directly in strings.
VariableInterpolation:
  Enabled: false

# Don't use semicolons to terminate expressions.
Semicolon:
  AllowBeforeEndInOneLineMethods: false

# Use only ascii symbols in comments.
AsciiComments:
  Enabled: false

# TODO: Change it to true when $redis and $mixpanel is removed
#
# Do not introduce global variables.
AvoidGlobalVars:
  Enabled: false
```

## 関連
obective-cなら[Objective-C - 意識の高さからかコードフォーマッター設定を公開 - Qiita](http://qiita.com/ayakix/items/3f05da9541b8e130e39f)

vimから自動実行するなら [Ruby - Rubocopをsyntastic.vimから実行する - Qiita](http://qiita.com/yuku_t/items/0ac33cea18e10f14e185)
IntelliJ IDEA でコンソールのTomcatログが文字化けしたときに設定した3点

Mac上の開発環境で文字化けしたので。

1. **IDE Settings** - **Appearance** - **Override default fonts by (not recommended)** にチェック、日本語を含むフォントを指定する

2. **IDE Settings** - **Editor** - **Colors & Fonts** - **Console Font** でも同様に日本語を含むフォントを指定する

3. ツールバー内の Tomcat ドロップダウンメニューから **Edit Configrations ...** を開き、
**Server** - **VM options** に `-Dfile.encoding=UTF-8` を指定する


3番あたりの設定は、そのプロジェクトにスポットで対応するかんじなので、Java大好きな人はもっとグローバルに大元から設定できる方法で対応したほうが良さそうです。
iOS メソッドの引数でBlocksを使う方法


```objectivec:

typedef void (^TestMethodBlock)(BOOL arg1, BOOL arg2);

- (void)testMethodWithCompletion:(TestMethodBlock)_completion {

	TestMethodBlock completion = [_completion copy];

    // 別スレッド
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{

        /// 時間のかかる処理 ///
        
        // メインスレッド
        dispatch_sync(dispatch_get_main_queue(), ^{
            completion(YES, YES);
        });
    });
}

```

呼び出

```objectivec:
    [self testMethodWithCompletion:^(BOOL arg1, BOOL arg2) {

    }];
```
FuelPHP で複数選択させるチェックボックスを作る凡例

**View**

```php:
<div class="control-group">
	<?= Form::label('Items', 'item_id[]', array('class'=>'control-label')); ?>

	<div class="controls">

<?php
	foreach ( Model_Item::find('all') as $item)
	{
		$checked = in_array($item->id, array_merge(
			(array) Input::post('item_id', []),
			isset($parent) ? array_keys($parent->items) : []
		));
		echo Form::label(
			Form::checkbox(
				'item_id[]',
				$item->id,
				$checked,
				['id' => 'form_item_id_' . $item->id]
			) . $item->name,
			'item_id_' . $item->id,
			['class' => 'checkbox']
		);
	}
?>

	</div>
</div>
```

**Controller**

```php:
<?php

class Controller_Parent extends Controller_Template
{

	/* ... 中略 ... */

	protected function apply_item_ids($parent)
	{
		$item_ids = (array) Input::post('item_id', []);

		foreach ( $parent->items as $item )
		{
			unset($parent->items[$item->id]);
		}

		foreach ( $item_ids as $item_id )
		{
			$parent->items[] = Model_Item::find($item_id);
		}
	}
}
```

改行入れたけど読みにくい罠。

あまり数の多いものには使えない。
Chrome Dev Toolsの"Workspace"を使う方法

こちらの記事で
http://www.atmarkit.co.jp/ait/articles/1308/06/news086.html
Chrome上からHTMLを編集できると聞いたので、
Chrome Dev Toolsの"Workspace"を早速試してみた。

以下手順---------------------------------


01.ブラウザでこのURLを開いて
chrome://flags

02."デベロッパー ツールのテストを有効にする"を有効にする

03.Chrome再起動

04.適当なページを開いてChrome Developper Toolsを起動（F12でもok）

05.右下の設定ボタンを押してオプションを開く

06.左メニューの"Experoments"を開く

07."File system folders in Sources Panel"を有効にする

08.Chrome Developper Toolsを一度閉じて、もう一度開く

※これで"Workspace"が使えるようになる


09.右下の設定ボタンを押してオプションを開く

10.左メニューの"Workspace"を開く

11.どのURLはどのローカルファイルに対応する？を設定する。

12."File systems"にプロジェクトのフォルダを設定する。

13.確認ダイアログが出るから"許可"する

14."Mappings"に"どのURLが""どのフォルダか"追加する。
　IDEでいうところのプロジェクトを決めるみたいな。

※これでプロジェクトの設定が完了


15."Mappings"のURLにブラウザアクセス

16.Chrome Developper Toolsを開く

17."Source"タブからファイルを選び、ガンガンHTMLを書く

18.Ctrl + Sでファイル保存

19.あら不思議！ローカルファイルが更新されています！

----------------手順ここまで


感想
ブラウザ上で直接編集なんで、スピードがめちゃ早い。
入力補完が聞いたら最高

実用にはあと一声！

PHPとかどうやって編集するんだろう？
もうちょっと調べてみよう；


今後に期待です。
日本の時刻表現を求める

宗教的なプログラミングにどうぞ

```haskell
import Data.Time.LocalTime

hourJapanese :: TimeOfDay -> String
hourJapanese (TimeOfDay h m _) = z : s : "つ"　where
    z = "子丑寅卯辰巳午未申酉戌亥" !! ((h + 1) `div` 2 `mod` 12)
    s
        | h `mod` 2 == 1 && m < 30 = '一'
        | h `mod` 2 == 1 = '二'
        | m < 30 = '三'
        | otherwise = '四'

isOmagaToki :: TimeOfDay -> Bool
isOmagaToki (TimeOfDay h m _) = 17 <= h && h < 19

isUshi_no_koku :: TimeOfDay -> Bool
isUshi_no_koku (TimeOfDay h m _) = 1 <= h && h < 3
```
DXライブラリの前処理(初期化前の設定)

自分用のメモ

DXライブラリの初期化前に、各種設定を行なっておくといいかんじになる。

```cpp:DxLibSample1.cpp
#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
         LPSTR lpCmdLine, int nCmdShow )
{

    ChangeWindowMode( TRUE ) ;// Windowモードで起動
    SetMainWindowText( "俺のゲームだ！" ) ;//ウィンドウタイトルを変更
    SetGraphMode( 640 , 480, 16 );// 画面解像度と色数の設定

    if( DxLib_Init() == -1 )
    {
        // エラー発生時の処理
        return -1 ;
    }
    
    WaitKey() ;// キーの入力待ち
    DxLib_End() ;// ＤＸライブラリ終了
    return 0 ;// ソフトの終了
}
```
ubuntuでVNCサーバーを構築＋sshポートフォワーディングによるアクセス

# 環境
client : Mac OSX 10.7
server: Ubuntu server 12.04

# インストール
```zsh:
# desktop
sudo apt-get install --no-install-recommends ubuntu-desktop

# vnc server
sudo apt-get install vnc4server
```

--no-install-recommendsを指定すると、余計なパッケージが入らなくなる

一旦起動して設定ファイル作成

```zsh:
vncserver :1
```

＊初回起動時にパスワードを入力する
すると、~/.vnc/ができる

一旦止める

```zsh:
vncserver -kill :1
```

#設定
設定ファイルを変更して、unityモードで起動できるようにする。

```zsh
emacs ~/.vnc/xstartup 
```

設定ファイルの最後に下記を追加

```
gnome-session --session=ubuntu-2d &
```

パスワードを変更したい場合は

```
sudo vncpasswd /etc/vncpass
```

うまくいかないときは下記コマンドパスワードを削除。
次回起動時に初回起動時と同様の形でパスワードを聞かれる。

```
rm ~/.vnc/passwd
```

#起動＆停止
初期設定のポート番号は起動時のスクリーン番号になる。
vncserver :1 なら5901
vncserver :2 なら5902

```
# start
vncserver -geometry 1280x720 :1
# kill
vncserver -kill :1
```

# 接続
macならFinderを開いて"cmd+K"をすれば”Connect to Server”というウィンドウが立ち上がるので下記を入力して接続。

```
vnc://user@192.168.111.123:5901
```

# SSHでポートフォワーディング
クライアントのターミナル上で下記のように入力

```
ssh -N username@192.168.111.123 -L 8888:192.168.111.123:5901
```

Nはサーバーにログインせず、ポートフォワーディングのみ行う。
Lの後にはローカルポート→リモートホスト→リモートホストポートの順に入力する。
これでssh接続するとlocalhost:8888 ->192.168.111.123:5901に転送される。

あとは、クライアント上で下記へアクセスすればログイン出来る。

```
vnc://localhost:8888
```
Scalaのパターンマッチングを使った代入がすごい

Scala使いなら誰もがパターンマッチを使っていると思います

```scala

num match {
  case i: Int    => println("Int型だよ")
  case l: Long   => println("Long型だよ")
  case d: Double => println("Double型だよ")
}

opt match {
  case Some(x) => println(x)
  case None    => println("Noneだよ")
}
```

型ごとに分岐できたり
メンバの値を束縛することもできます。


実はパターンマッチは代入にも使えます
まずはパターンマッチに使うcase classを用意しましょう


```scala
case class Person(name: String, age: Int)
```

case classではunapplyメソッドが実装され

```scala
case Person(name, age) => println("名前: " + name + ", 年齢: " + age)
```

みたいにnameとageに値を束縛できます

これを変数代入でも出来ちゃうんです

```scala
val p: Person = Person("taro yamada", 25)
val Person(name, age) = p
println(name) // => taro yamada
println(age) // => 25
```

わざわざ
val name = p.name
val age = p.age
みたいに書かなくても一行で済みます


ただこれは結構知ってる人が多いんじゃないかと思うので
もう一つのパターンマッチのやり方も書きます

```scala
case class +(_1: Int, _2: Int)
```

何これと思う人がいると思うんですけど
実はこれ+が名前のcase classです

```scala
val a = new +(1, 2)
```

みたいなかんじで使えます
これをパターンマッチでどういう風に使うかというと

```scala
val b + c = a
println(b) // => 1
println(c) // => 2
```

b + cみたいに演算子を使うかのような感覚で代入できます
パターンマッチ超便利
SublimeText2のEmmet（Zen-Coding）カスタマイズ

##Emmetの導入

「Package Controll」で「Emmet」をインストール。
**[command] + [Shift] + [P]** で「Command Palette」を開き「install」と入力してパッケージインストーラーを選択。

「Emmet」を選択してインストール。

### 参考

* [【便利ツール】Emmetで、ちょっと気持ちいいコーディング with sublime text 2・上巻 ｜ Developers.IO](http://dev.classmethod.jp/tool/emmet-sublimetext2-1/)


## タグの短縮入力

```html:
html:5←ここで**[ctrl]+[E]**
↓
<!doctype html>
<html>
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	
</body>
</html>
```

## タグの囲み入力

なぜかこれについて触れているサイトがほとんど無い。

```html:
ほげほげ ←この文章を選択して**[ctrl] + [alt] + [enter]**
↓
<div>ほげほげ</div>
```

画面下部に「Enter Abbreviation:」の入力枠が表示されるので、HTMLのタグか、Zen-codingのショートコードを入力する。

```html:
a[href=http://google.com/].colorbox
```

上記のように入力すると……

```html:
<div>ほげほげ</div>
↓
<a href="http://google.com/" class="colorbox">ほげほげ</a>
```

## ショートコードのカスタマイズ

「html:5」で変換すると下記のようになるので、ちょとカスタマイズします。

```html:
<!doctype html>
<html>
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	
</body>
</html>
```

**Preferences ＞ Package Settings ＞ Emmet ＞ Settings - User** 
でカスタマイズ。

```js:
{
  "snippets": {
    "html": {
        "snippets": {
          "html:5": "<!doctype html>\n<html lang=\"ja-JP\">\n<head>\n\t<meta charset=\"${charset}\">\n\t<meta name=\"description\" content=\"\">\n\t<title>${1:Document}</title>\n</head>\n<body>\n\t${child}${2}\n</body>\n</html>",
          "dldt": "<dl>\n<dt>${child}</dt>\n<dd></dd>\n</dl>"
		}
    }
  }
}
```

下記のようになります。

```html:
<!doctype html>
<html lang="ja-JP">
<head>
	<meta charset="UTF-8">
	<meta name="description" content="">
	<title>Document</title>
</head>
<body>
	
</body>
</html>
```

## ショートコードの追加


```js:
{
  "snippets": {
    "html": {
        "snippets": {
          "html:5": ～略～,
		  // 追加
          "dldt": "<dl>\n\t<dt>${1:title}</dt>\n\t<dd>${2:data}</dd>\n</dl>"
       }
    }
  }
}
```

```html:
dldt
↓
<dl>
	<dt>title</dt>
	<dd>data</dd>
</dl>
```

**選択文字を囲む方法がわからない！！**


## いろんなショートコード
###参考

* [Zen-Codingが楽しい - ぱせらんメモ](http://d.hatena.ne.jp/pasela/20100223/zencoding)
* [CSSの記述を高速化する、Emmet (Zen-Coding)｜Web Design KOJIKA17](http://kojika17.com/2012/10/css-speedstar-for-emmet.html)
Mac で日本語と英語を切り替えるショートカットを変更する

私は日本語と英語の切り替えを Ctrl-j で行うというこだわりがあります

今回は Mac での設定方法を紹介いたします

とりあえずシステム環境設定を開きます

そして __キーボード > キーボードショートカット > キーボードと文字入力__

と行きましょう

そこで __前の入力ソース__ のショートカットを `^j` に変更します

これで終わり…ならいいのですが，これだけだとカタカナになったりとかして使いにくいです

そこでシステム環境設定の __言語とテキスト__ を開きます

そこでひらがなと英数のみにしましょう（Google 日本語入力の場合 ことえりなどでも同様）

これで C-j を押すごとに日本語と英語が入れ替わります
Objective-CでMD5ハッシュ

NSStringをハッシュ値にするカテゴリ

```objc:NSString+Hash.h``
#import <Foundation/Foundation.h>

@interface NSString (Hash)

- (NSString*)MD5Hash;

@end
```

```objc:NSString+Hash.m```
#import "NSString+Hash.h"
#import <CommonCrypto/CommonCrypto.h>

@implementation NSString (Hash)

- (NSString *)MD5Hash
{
    const char *data = [self UTF8String];
    if (self.length == 0) {
        return nil;
    }
    CC_LONG len = (CC_LONG)strlen(data);
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(data, len, result);
    NSMutableString *ms = @"".mutableCopy;
    for (int i = 0; i < 16; i++) {
        [ms appendFormat:@"%02X",result[i]];
    }
    return ms;
}

@end
```
cuiでisoをDVDに書き込む

$ wodim isoファイル
====

```bash:
$ wodim VMware-VMvisor-Installer-5.1.0.update01-1065491.x86_64.iso 
wodim: No write mode specified.
wodim: Assuming -tao mode.
wodim: Future versions of wodim may have different drive dependent defaults.
wodim: Operation not permitted. Warning: Cannot raise RLIMIT_MEMLOCK limits.
Device was not specified. Trying to find an appropriate drive...
Looking for a CD-R drive to store 304.57 MiB...
Detected CD-R drive: /dev/cdrw
Using /dev/cdrom of unknown capabilities
Device type    : Removable CD-ROM
Version        : 5
Response Format: 2
Capabilities   : 
Vendor_info    : 'PHILIPS '
Identification : 'DVD+-RW DVD8881 '
Revision       : 'AD18'
Device seems to be: Generic mmc2 DVD-R/DVD-RW.
Using generic SCSI-3/mmc DVD-R(W) driver (mmc_mdvd).
Driver flags   : SWABAUDIO BURNFREE 
Supported modes: PACKET SAO
Speed set to 22160 KB/s
Starting to write CD/DVD at speed  17.0 in real unknown mode for single session.
Last chance to quit, starting real write in    0 seconds. Operation starts.
```

書き込み終了すると以下の表示になる。

```bash:
Track 01: Total bytes read/written: 319363072/319363072 (155939 sectors).
$ 
```
SublimeText2の導入

## 基本設定

Preferences＞Settings - User　でユーザー設定をカスタマイズ

```js:
{
  // フォントサイズ
  "font_size": 11,
  // カーソル行をハイライト
  "highlight_line": true,
 // ファイル末尾より先にもスクロール可能に
  "scroll_past_end": true,
 // 行のどこにいても逆インデントできるように
  "shift_tab_unindent": true,
  //[Emmet]Tabキー展開の停止
  "disable_tab_abbreviations": true 
}

```

### 色の設定
Preferences ＞ Color Schme で好きなものを選ぶ。

###参考
[Sublime Text 2 のDefault設定ファイルについて](https://gist.github.com/BlackKetchupTea512/3620658)

## プラグインの導入

###「Package Control」のインストール

View＞Show Console でコンソールを開き、下記コマンドをペーストして実行。

```js:
import urllib2,os;pf='Package Control.sublime-package';ipp=sublime.installed_packages_path();os.makedirs(ipp) if not os.path.exists(ipp) else None;open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read())
```

###その他プラグイン

[command] + [Shift] + [P] で「Command Palette」を開き「install」と入力するとパッケージインストーラーが選択できる。
下記をインストール。

* IMESupport-master
* AutoFileName
* Emmet
* SCSS
* SCSS Snippets

###参考

[Sublime Text 2ってエディタがすごくイイ。Dreamweaverから乗り換えた時の初期設定とか使い方とかをメモ | Mnemoniqs Web Designer Blog](http://mnemoniqs.com/web/sublimetext2/)



## ショートカットキー
###参考
[使ってわずか10分でメインエディタを変えてしまったSublime Text （ST2）がめちゃめちゃ使いやすい件 - YATのBLOG](http://wp.yat-net.com/?p=3313)
PHPのキャストをJavaScriptで再現してみた

艦これがメンテ中なので、何の役に立つかあまり考えずに書いた。自分はPHPなんて滅多に書かないのでどこか間違ってるかもしれない。（そもそもJavaScriptとPHPじゃ方の区別が違うからアレなんだけど）

方針として、

  * PHPのstring型はStringとして
  * PHPのboolはBooleanとして
  * PHPのint型とfloat型はNumberとして
  * PHPのarray型はArrayとして
  * PHPのobject型はオブジェクトとして
  * PHPのNULLはnullとして
  * PHPの未定義の変数はundefinedとして

扱ったつもり

```javascript:php_cast.js
function isEmptyArray(x) {
  return Array.isArray(x) && x.length === 0;
}

function castBoolean(x) {
  return !(
    x === false ||
    x === 0 ||
    x === '' || x === '0' ||
    isEmptyArray(x) ||
    x === null || x === undefined);
}

function castInt(x) {
  switch (typeof x) {
  case 'boolean': return +x;
  case 'number': return ~~x;
  case 'string': return ~~parseInt(x, 10) || 0;
  case 'undefined': case 'object': return +castBoolean(x);
  }
}

function castFloat(x) {
  switch (typeof x) {
  case 'string': return parseFloat(x) || 0;
  case 'object': throw new TypeError('invalid type convertion, `object\' to `float\'');
  default: return castInt(x);
  }
}

function castString(x) {
  switch (typeof x) {
  case 'undefined': case 'boolean': return x ? '1' : '';
  case 'number': return x.toString(10);
  case 'string': return x;
  case 'object':
    return Array.isArray(x) ? 'Array'
         : x.toString === Object.prototype.toString ? 'Object'
         : x.toString();
  }
}

function extendArray(x) {
  return Object.keys(x).reduce(function(arr, k) {
    arr[k] = x[k];
    return arr;
  }, []);
}

function castArray(x) {
  return x == null ? []
       : typeof x === 'object' ? extendArray(x) : [x];
}

function castObject(x) {
  return Object(x);
}

function castNull(x) {
  return null;
}

function cast(type, x) {
  return {
    'bool': castBoolean, 'boolean': castBoolean,
    'int': castInt,      'integer': castInt,
    'float': castFloat,
    'string': castString,
    'array': castArray,
    'object': castObject,
    'unset': castNull,
  }[type](x);
}

//使用例
console.log(cast('int', 'aaa')); //=> 0
console.log(cast('array', {a: 1, b: 2})); //=> [a: 1, b: 2]
```

`castBoolean`とか`castInt`の挙動は理解し難い。
タスクの有無を確認する


grunt 内で使用されてるチェックを真似て持ってきた。

```Gruntfile.js
  var path = require('path');

  /**
   * タスクの有無を確認します。
   *
   * @param   {…String} name タスク名
   * @returns {Boolean} 存在すれば true を返します。
   */
  function existsTasks()
  {
    var tasksdir
      , i = arguments.length
      , result = i > 0
      , root = path.resolve('node_modules')
      ;

    while (i--) {
      tasksdir = path.join(root, arguments[i], 'tasks');
      result = result && grunt.file.exists(tasksdir);
    }
    return result;
  }
```

▼使用例（タスクが存在する場合のみ、設定が行われる）

※LiveReload 機能は grunt-contrib-watch のオプションに統合されたとのこと。下の例は参考程度で見てください。

```Gruntfile.js
  var config = {}
    , path = require('path');
    , lrSnippet
    , folderMount
    ;

  if (existsTasks('grunt-contrib-livereload', 'grunt-contrib-connect', 'grunt-regarde')) {

    lrSnippet = require('grunt-contrib-livereload/lib/utils').livereloadSnippet;
    folderMount = function folderMount(connect, point) {
      return connect.static(path.resolve(point));
    };

    config['connect'] = {
      livereload: {
        options: {
            port: 9001
          , middleware: function(connect, options) {
              return [lrSnippet, folderMount(connect, '.')]
            }
        }
      }
    };
    config['regarde'] = {
      fred: {
          files: []
        , tasks: ['livereload']
      }
    };

    grunt.task.loadNpmTasks('grunt-contrib-livereload');
    grunt.task.loadNpmTasks('grunt-contrib-connect');
    grunt.task.loadNpmTasks('grunt-regarde');
    grunt.task.registerTask('autoreload', ['livereload-start', 'connect', 'regarde']);
  }

  grunt.config.init(config);
```
公衆無線LANを使ってノマドする

自宅でフレッツ光を利用している人の場合。  
<br>

-------------------------------

## 基本方針：追加出費は最小限に。

---------------------------------
フレッツスポットというサービスを利用すればWiMAXの追加契約やプロパイダ契約も変更しないで済む。  
とりあえず光ポータブルはいらない。（なんのためにあるんだあのハードは）  
<br>
まず以下のページから自分が利用したい圏内にフレッツスポットがあるのか検索  
[http://flets.com/spot/ap/ap_search_s.html](http://flets.com/spot/ap/ap_search_s.html)


”使えそう”ならば以下のページからフレッツスポットを契約する（月額210円）  
端末認証のスポットはめんどくさそうなのでやめたほうがいい。  
プロパイダの契約はいらない。 

**フレッツ・スポット　公衆無線LAN**   
[http://flets.com/spot/?link_id=f_spot](http://flets.com/spot/?link_id=f_spot)  

**以下はWeb認証方式のスポットへの接続方法の説明**

受付完了ページの各種情報をメモしておく。  
あらかじめ「FLETS-SPOT」と「NTT-SPOT」を無線LAN設定に入れておけば、認証IDとパスワードがあればだいじょうぶ。  

あとはお店に行って電波を捕まえて、Webブラウザを起動させれば認証画面になる。  
IDの末尾に**@e-flets.jp**をつけるのを忘れずに。


まあ、ここまで書いたけど、タバコ吸わないならおとなしく無料のスタバLANを利用したほうがいい気もする。  
[at_STARBUCKS_Wi2](http://starbucks.wi2.co.jp/pc/index_jp.html)


--------------------

## 外出先でフレッツスポットを探す

-----------

ちなみに外出先でフレッツスポットのアクセス先を探したいときは以下のアプリが便利。  
店の情報にDocomo-Wifiと書いてあってもNTT-SPOTならば接続可能のよう。

**FLET'S 光WiFi**  
Androidアプリ  
[https://play.google.com/store/apps/details?id=jp.e_flets.hikaristation](https://play.google.com/store/apps/details?id=jp.e_flets.hikaristation)  
  
iPhoneアプリ  
[https://itunes.apple.com/jp/app/flets-guangwifi/id529670945?mt=8](https://itunes.apple.com/jp/app/flets-guangwifi/id529670945?mt=8)
<br>
MarkdownとSyntaxHighlighterを併用する。

WordPressでMarkdownを利用している間にソースコードを記述しようとすると、  
**<code><</code>**や<strong><code>></code></strong>が<strong>& lt;</strong>や**& gt;**に自動変換されてしまう。

そんな時は**<code>&lt;div&gt; ... &lt;/div&gt;</code>**タグでくくって解決する。  


SyntaxHighlighter Evolvedプラグインが入っているとさらに言語別に最適化される。Qiitaもおそらくどうようのプラグインを利用しているので、以下のようになる。

```cpp:foo.cpp
#include "Foo.h"
public class Foo{
  int dammyInt;
  double dammyDouble;

  public void Foo(){
     dammyInt = 0;
     dammyDouble = 0.;
  }

  public void addInt(){
    dammyInt++;
  }
}
```


ちなみにSyntaxHighlighter Evolvedプラグインが対応している言語は以下の通り。  
http://ozpa-h4.com/2012/03/06/wordpress_plugin_syntax_highlighter_evolved/
Ansible でリモートのアーキテクチャに応じて挙動を変える

たとえば，RPM パッケージを持っていってインストールしたい場合，アーキテクチャによって RPM が変わりますよね (i686 とか x86_64 とか)。

そんなときは，`ansible_machine` という variable を使えば，リモートのアーキテクチャを特定することができます。

```yaml:
---
tasks:
  - copy: src="custom.{{ansible_machine}}.rpm" dest="/tmp/custom.rpm"
```

ちなみに Linux の場合，

| Variable                             | 32bit  | 64bit    |
| -------------------------------- | :----: | :------: |
| `ansible_architecture`           | `i386` | `x86_64` |
| `ansible_machine`                | `i686` | `x86_64` |
| `ansible_userspace_architecture` | `i386` | `x86_64` |
| `ansible_userspace_bits`         | `32`   | `64`     |

こんな感じになるようです。

これらの variables は，setup module を使うと確認できます。

```shell-session:
$ ansible host -m setup
```

アーキテクチャ以外にもいろいろ定義されている (distribution とか IP アドレスとか) ので，ほかにも条件わけするのによい variable があるかもしれません。
スマホのコーディングを手抜き出来るJS

様々な画面サイズのスマホに対応する為にコーディングするのは結構大変なので、そこを手抜きできるJSです。

PCサイトをコーディングするのと同じ感覚で、デザイン通りのサイズでコーディングします。
Retina対応の為に画像を1/2にしたりする必要はありません。
横幅640pxでデザインされた物なら、そのまんまコーディングすれば良いです。
320pxでデザインされた物なら、320pxでコーディングすれば良いです。
(body{width:640px;}とか指定しちゃっても良いかと・・・)

```html:HTML
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no>
```

```js:JavaScript
// HTMLの横幅を指定する。
var HTML_WIDTH = "640";

$(function() {
	$(window).resize(function(){ setZoom() });
	setZoom();
});

function setZoom(){
	var scale = $(window).width() / HTML_WIDTH * 100 + "%";
	$('html').css({'zoom' : scale });
}
```

後はJSが画面サイズに合わせて勝手にHTMLを拡大/縮小してくれます。
画面を横にしても勝手にHTMLが画面サイズに合うように調整されます。



===[ 追記 ]======

bodyのwidth固定するなら、こっちの方がスマートかも。

```js:JavaScript
$(function() {
	$(window).resize(function(){ setZoom() });
	setZoom();
});

function setZoom(){
	var scale = $(window).width() / $('body').width() * 100 + "%";
	$('html').css({'zoom' : scale });
}
```
chrome devtoolsの Snippets をつかってみる


最近ついたchrome devtoolsの新機能、「Snippets」をつかってみます。

- [Authoring & development workflow - Chrome DevTools — Google Developers](https://developers.google.com/chrome-developer-tools/docs/authoring-development-workflow#snippets)

## Snippetsとは?

要するに、 **デバック用にconsoleで実行するスクリプトを保持しておける** 、
みたいな機能だと思えば良よさそう。

スクリプトを、Snippetという単位で管理・追加・実行などできる。


## つかいかた

![snippetsの画面](http://gyazo.com/eb44b12ce40b3208f716cb4993462be3.png)

- 「Sources」の「Snippets」からアクセス
- 右クリック→「New」で作成
- 右クリック→「Run」で実行
あるいは「▶」ボタン(普段は一時停止とかがあるとこ)でもできる。

- 作成したSnippetは、Chromeが覚えていてくれるので、別のサイトでSnippetsを開いても残っている。
*(※現在、コピペしたスクリプトが保存されないことがある、気がする…。Canaryだと安定動作した。)*

- Snippetsのコードの一部を選択して、```ctr + shift + e``` で、「 **consoleで実行** 」。

- Local Modificationが見れるようになっているので、変更履歴が追える

# そのほか
最初に貼ったドキュメント読んでいて、はじめて知ったdevtoolsの機能など。

- devtoolsのトップバーを右にドラッグすると、右表示になる
下にドラッグすると、下表示になる

- ```cmd + o```で、source内の **ファイル** を検索(フィルタ)
```cmd + shift + o```で、source内の **関数** を検索(フィルタ)

- 同じくworkspaceは、sassとかcompassとかjsのconcatとかと、
まだ微妙に相性悪いので、本格導入には早いかなぁという感じ。(まだCanaryだけだし)
JavaScriptでscala.util.control.Breaksのようなもの

`Array.prototype.forEach`は途中でbreakしたくなっても抜けられない。
`Array.prototype.some`を使うという方法もあるみたいですが、それは色々とあれなので…

とりあえず、Scala風にBreaksクラスを作ってみた。（[scala.util.control.Breaks](http://www.scala-lang.org/api/current/index.html#scala.util.control.Breaks)）

```javascript:breaks.js
/**
 * scala.util.control.Breaksのようなもの。
 * @constructor
 */
function Breaks() {
  if (!(this instanceof Breaks)) return new Breaks();

  var
  value,
  breaking = {};

  /**
   * ループを抜ける
   * @name breaks
   * @fieldOf Breaks
   */
  Object.defineProperty(this, 'breaks', {
    get: function () {
      throw breaking;
    },
    set: function (val) {
      value = val;
      throw breaking;
    },
  });

  /**
   * 抜けられるしキャッチできるブロック
   * @param {Function} procedure 実行するブロック
   * @return {Object} catchBreakを持ったオブジェクト
   */
  this.tryBreakable = function (procedure) {
    var
    breaks = this;
    return {
      catchBreak: function (onBreak) {
        value = undefined;
        try {
          procedure(breaks);
        } catch(e) {
          if (e !== breaking) throw e;
          onBreak(value);
        }
      },
    };
  };
}

/**
 * 抜けられるブロック
 * @param {Function} procedure 実行するブロック
 */
Breaks.prototype.breakable = function (procedure) {
  this.tryBreakable(procedure).catchBreak(function () { /* noop */ });
};

/**
 * インスタンスをわざわざ作るのが面倒な人向け
 * @param {Function} procedure 実行するブロック
 */
Breaks.breakable = function (procedure) {
  (new Breaks).breakable(procedure);
}
```

コードを見れば一目瞭然だけど、scala.util.control.Breaks同様に特定の例外を投げてそれをキャッチすることでbreakを実現してる。

使い方はこうなる。

```javascript:breaks-usage.js
Breaks.breakable(function (b) {
  [1, 2, 3, 4, 5].forEach(function (x) {
    if (x === 3) b.breaks;
    console.log(x);
  });
});
```

結構良い感じだと思う。

実は、最初はCoffeeScriptで書いてたんだけど、よく考えたらCoffeeScriptには優秀なfor文があるから必要ないなー、と思ったりしてました。

一応その記録も貼っておきます。

```coffeescript:breaks.coffee
getter = (obj, name, func) ->
  Object.defineProperty obj, name, 
    get: func

class Breaks
  constructor: ->
    breaking = {}
    getter @, 'breaks', -> throw breaking
    @breakable = (procedure) ->
      try
        procedure @
      catch e
        throw e if e isnt breaking
  @breakable: (procedure) ->
    (new Breaks).breakable procedure

Breaks.breakable (b) ->
  [1..10].forEach (x) ->
    b.breaks if x is 5
    console.log x
```

これはこれでいいと思ったんだけどな―
JavaScriptでdate-time型の文字列をファイル名とかで使えるようなフォーマットに変換

すんげー限定された環境でしか使えないと思うけど・・・。

```js:
/**
 *	date-time型をファイル名等で使える形に変換
 *	yyyy-mm-dd h:m:s → yyyy-mm-dd_h-m-s
 *	
 *	@param	dateTime	date-time型の値
 *	@return		変換後の文字列
 *
 */
var dateReplace = function(dateTime){
  var replace = dateTime;
  replace = replace.replace(/:/g,"-");
  replace = replace.replace(/ /g,"_");
  return replace;
}
```
JavaScriptでブラウザの言語設定を取ってくる

jaとかenとか、頭2文字返してくれる。

```js:
/**
 *	ブラウザの言語設定
 *	
 *	@return		言語設定
 *
 */
var getLanguage = (function(){
	try{
		return (navigator.browserLanguage || navigator.language || navigator.userLanguage).substr(0,2);
	}catch(e){
		return undefined;
	}
})();
```
git備忘録

良く忘れるgitコマンドの備忘録。

## 直近の更新をcommitはせず一時的に保存する

```
git stash
```

## 一時的に保存(stash)した更新を適用する

```
git stash pop
```

## ローカルの変更はそのままで一つ前のcommitを取り消す

```
git reset --soft HEAD^
```

## aliasの確認方法

```
git config --list
```

## ローカルブランチ／ローカルタグの削除

```
git branch -d hoge
```

## リモートブランチ／リモートタグの削除

```
git push origin :hoge
```

## ローカルブランチへのタグ付け

```
git tag [tag name]
```

## リモートブランチへのタグ付け

```
git push origin --tag
```

## 変更履歴をファイル名付きで

```
git log --stat
```

## リポジトリ作成直後の初回git addをキャンセル

```
git rm --cache -r .
```

## エイリアスを追加

```
git config --global alias.xxx '[gitコマンド]'
```

以下、よく使うエイリアス。

```
git config --global alias.co checkout
git config --global alias.st status
git config --global alias.di diff
git config --global alias.br branch
git config --global alias.ci 'commit -a'
git config --global alias.ca '!git add -A && git commit'
git config --global alias.tr "log --graph --pretty='format:%C(yellow)%h%Creset %s %Cgreen(%an)%Creset %Cred%d%Creset'"
```

## ローカルブランチ名の変更

### 別ブランチでの作業時

```
git branch -m [旧ブランチ名] [新ブランチ名]
```

### 同一ブランチでの作業時

旧ブランチ名を省略可能。

```
git branch -m [新ブランチ名]
```

## 空コミット

```
git commit --allow-empty
```

## リモートリポジトリの確認

```
git remote -v
```

## リモートブランチの一覧

```
git branch -r
```

## diffでファイルリスト取得

```
git diff [revision] --name-only
```
JavaScriptでGETパラメーターを取得する

JavaScriptでGETパラメータを取得する関数。
"var getVal = getUrlVars();"とかやると、GETパラメータがObjectで入る。

```js:JavaScript
/**
 *	GETパラメータを配列にして返す
 *	
 *	@return		パラメータのObject
 *
 */
var getUrlVars = function(){
	var vars = {}; 
	var param = location.search.substring(1).split('&');
	for(var i = 0; i < param.length; i++) {
		var keySearch = param[i].search(/=/);
		var key = '';
		if(keySearch != -1) key = param[i].slice(0, keySearch);
		var val = param[i].slice(param[i].indexOf('=', 0) + 1);
		if(key != '') vars[key] = decodeURI(val);
	} 
	return vars; 
}
```

===[ 修正 1 ]======
@gocho様に指摘頂いた箇所を修正。
> fragment identifier(#以降の文字)が考慮されていません。
> http://suika.suikawiki.org/~wakaba/wiki/sw/n/%E3%83%95%E3%83%A9%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%88%E8%AD%98%E5%88%A5%E5%AD%90
>fragment identifier中に'&'が含まれる場合、正常に動作しません。

> また、[a=b=c]というパラメータは、[key:"a" / value:"b=c"]の様に分解されるのが一般的です。

===[ 修正2 ]======
@asahina_dev様に指摘いただいた箇所を修正。
> よそでも書いたが queryString 取得は location.search

===[ 修正3 ]======
@gocho様に指摘頂いた箇所を修正。
> vars = []; ではなく、 vars = {}; の方が望ましいですね。
> 非数がオブジェクトキーになるのなら、ArrayではなくObjectを使います。

===[ 修正4 ]======
@asahina_dev様の指摘を修正。
> プログラムでつくられる URL
> ```/dir/file.html?name1=1&name2&name3=&```
> の name2 が
> vars['name2'] = 'name2'; になる予感

キーと値の関係性がおかしい場合はObjectを返しません。
ただ、値が空の場合は想定されるので、キーがあって値が無い場合は空の文字列を返します。
例えば、パラメータが
```?name1=1&name2&name3=&```
の場合、```{name1: "1", name3: ""}```というObjectが返ってきます。
一日のGitコミットをMarkdownに変換するワンライナー

#環境非依存化したもの

@suin さんの協力により環境非依存になりました（zshとbashで動作確認）

```bash
echo "$(PROJECT=$(url=$(git config remote.origin.url) && url=${url#*github.com?} && echo ${url%.git}) && echo "hash | title" && echo "-----|------" && git log --since='12 hours ago' --author=$(git config user.email) --pretty="format:[%h](https://github.com/$PROJECT/commit/%h) | %s" | perl -nle "\$_ =~ s|#(\\d+)|[#\\1](https://github.com/${PROJECT}/pull/\\1)|g; print \$_")" | pbcopy
```

一応これが完成形ですが、ここまでくると一つのスクリプトファイルにした方がよさそうな気がしますね。

_（追記ここまで）_

---

日報みたいなものを毎日書くことにしているんですが、そこにその日のコミットログを書いておくと便利だと気が付きました。

GitHubリポジトリが github.com/yuku-t/hoge にあり、authorにYukuという文字列を含むとします。

```bash
git log --since='12 hours ago' --author=Yuku --pretty='format:[%h](https://github.com/yuku-t/hoge/commit/%h) | %s' | perl -nle '$_ =~ s|#(\d+)|[#\1](https://github.com/yuku-t/hoge/pull/\1)|g; print $_'
```

これ実行すると

```
[abcdef](https://github.com/yuku-t/hoge/commit/abcdef) | コミットタイトル
[123456](https://github.com/yuku-t/hoge/commit/123456) | Merge pull request [#1](https://github.com/yuku-t/hoge/pull/1)
```

みたいなのが標準出力されます。コミットのハッシュとPullRequestのマージコミットの場合はそれに対するリンクも作成しています。

簡単にここで使ってる `git-log` のオプションについて説明するとこんな感じ。詳しくは `man git-log` 参照。

名前 | 説明
----|----
 --author | コミットした人で絞込み
 --since | コミット日時で絞込み
 --pretty | 出力される内容を変更

でIncrementsでは [Qiita:Team](https://teams.qiita.com/) を使っているので、Qiita Markdownのテーブル記法を使うようにワンライナーをちょちょっと改造する（`pbcopy` コマンド使ってるのでMac限定）

```bash:
echo '
hash | title
-----|------' > tmp; git log --since='12 hours ago' --author=Yuku --pretty='format:[%h](https://github.com/yuku-t/hoge/commit/%h) | %s' | perl -nle '$_ =~ s|#(\d+)|[#\1](https://github.com/yuku-t/hoge/pull/\1)|g; print $_' >> tmp; pbcopy < tmp; rm tmp
```

これを実行すると以下の内容がクリップボードに入る

```
hash | title
-----|------
[abcdef](https://github.com/yuku-t/hoge/commit/abcdef) | コミットタイトル
[123456](https://github.com/yuku-t/hoge/commit/123456) | Merge pull request [#1](https://github.com/yuku-t/hoge/pull/1)
```

で、これをそのままMarkdownとして解釈させれば下記のようなテーブルになると

hash | title
-----|------
[abcdef](https://github.com/yuku-t/hoge/commit/abcdef) | コミットタイトル
[123456](https://github.com/yuku-t/hoge/commit/123456) | Merge pull request [#1](https://github.com/yuku-t/hoge/pull/1)

便利だなー
PHPのissetをJavaScriptで

PHPのisset的なのをJSでやる為の関数。
"isset(hoge);"とかやると、true/falseが帰ってくる。

```js:JavaScript
/**
 *	値の有無をチェック
 *	phpのisset()に相当
 *	
 *	@param	data	値
 *	@return			true / false
 *
 */
var isset = function(data){
	if(data === "" || data === null || data === undefined){
		return false;
	}else{
		return true;
	}
};
```
Google Analytics Outbound Link

毎回"_gaq.push();"を書くのがだるいので、関数として用意。
エラー処理は特にしてない。

```javascript:JavaScript
/**
 *	Google Analytics Outbound Link
 *	※） 要Google Analytics
 *
 *	@param	category	イベントカテゴリ
 *	@param	lnk			イベント アクション 
 *
 */
function trackOutboundLink(category, action) { 
	try { 
		_gaq.push(['_trackEvent', category , action]); 
	} catch(err){}
}
```
ブロック内でプリミティブ型のインスタンス変数にアクセスする

ARC環境のObjective-Cでブロック内でインスタンス変数にアクセスする場合のメモ。
ポインタ変数ならば__block修飾子を使ってretain cycleを回避すればいいのだけど、変数が整数や真偽値などのプリミティブ型だった場合機能しないので以下のように参照を使う。

```objc:main.m
@interface SomeClass () {
  BOOL _flag;
}
```

```objc:main.m
[self performBlock:^(id sender) {
  // retain cycle が起きる
  _flag = YES;
} afterDelay:(NSTimeInterval)]
```

```objc:main.m
__block BOOL __flag = _flag
[self performBlock:^(id sender) {
  // ポインタではないので機能しない
  __flag = YES;
} afterDelay:(NSTimeInterval)]
```

※Ushioさんのご指摘を受けたため修正しました。
ブロック内にインスタンス変数へのポインタをキャプチャしてしまうとselfが破棄されたかどうかの判断がつかないそうです。以下は、KVアクセッサを使ってインスタンス変数にブロック内でアクセスする方法です。

```objc:main.m
__block __weak typeof(self) __self = self;
[self performBlock:^(id sender) {
  // KV使ってインスタンス変数にアクセスする
  [__self setValue:YES forKey:@"_flag"];
  BOOL flag = [__self valueForKey:@"flag"] boolValue];
} afterDelay:(NSTimeInterval)]

```
exim4 でメール送信

## 参考

* https://help.ubuntu.com/community/Exim4
* [email - How do I configure exim4 to send mail through a password protected ssl smtp mail server? - Ask Ubuntu](http://askubuntu.com/questions/167043/how-do-i-configure-exim4-to-send-mail-through-a-password-protected-ssl-smtp-mail)

サーバーからのメール通知を受け取りたいだけなので以下のみ設定。

設定
====

```bash:再設定
$ sudo dpkg-reconfigure exim4-config
```

もしくは以下変更

```diff:/etc/exim4/update-exim4.conf.conf
-dc_eximconfig_configtype='local'
+dc_eximconfig_configtype='internet'
```

```diff:smarthostの指定方法
-dc_smarthost=''
+dc_smarthost='11.22.33.44'
```
```bash:exim4再起動
$ sudo /etc/init.d/exim4 restart
```

動作確認
====

```bash:送信確認
$ date | sendmail -f 送信@者 宛@先
もしくは
$ date | mail 宛@先
```

```bash:ログ確認
$ tail -f /var/log/exim4/mainlog
```

```bash:mail_que削除
exim -Mrm 1ZQSYj-0002jL-M0
```

* 参考: [メールキュー操作あれこれ » gmt-24.net](http://gmt-24.net/archives/277)
Gruntfile.js を CoffeeScript で書いて見やすくする

みなさん grunt 使ってますか？便利ですよ！

さて、「<a href="http://havelog.ayumusato.com/develop/javascript/e515-gruntfile_coffee.html" target="_blank" title="Gruntfile.jsは.coffeeのほうが扱いやすい ::ハブろぐ">Gruntfile.jsは.coffeeのほうが扱いやすい ::ハブろぐ</a>」を見ると、Gruntfile.js を CoffeeScript で書いてもちゃんと grunt さんは認識してくれるらしいので、CoffeeScript で書いてみました。

以下は grunt watch すれば、src/*.sass や src/*.js、src/*haml の保存時に、次の処理を自動で実行してくれるステキな設定です（ぼくはこれでしか grunt を使ってないけど...）。

1. src/*.sass -> css/*.css へのコンパイル
2. css 内と js 内の指定ファイルの concat
3. css の指定ファイルの minify
4. js の指定ファイルの minify
5. src/*.haml -> *.html へのコンパイル
6. 終了音の再生

```coffeescript::Gruntfile.coffee
module.exports = (grunt) ->
	pkg = grunt.file.readJSON 'package.json'
	grunt.initConfig
		compass:
			dev:
				options:
					config: 'config.rb'
					environment: 'development'
					force: true
			prod:
				options:
					config: 'config.rb'
					environment: 'production'
					force: true
		concat:
			'css/styles.css': ['src/reset.css', 'src/webfonts.css', 'css/common.css']
			'js/functions.js': ['src/common.js']
		cssmin:
			compress:
				files:
					'css/styles.min.css': ['css/styles.css']
					'css/tablet.min.css': ['css/tablet.css']
					'css/mobile.min.css': ['css/mobile.css']
		uglify:
			my_target:
				files:
					'js/functions.min.js': ['js/functions.js']
		haml:
			one:
				files:
					'index.html': 'src/index.haml'
		play:
			fanfare:
				file: './node_modules/grunt-play/sounds/end.mp3'
		watch:
			files: ['src/*.scss', 'src/*.js', 'src/*.haml']
			tasks: ['compass:prod', 'concat', 'cssmin', 'uglify', 'haml', 'play']

	for t of pkg.devDependencies
		if t.substring(0, 6) is 'grunt-'
			grunt.loadNpmTasks t

	grunt.registerTask 'default', ['compass:prod', 'concat', 'cssmin', 'uglify', 'haml', 'play']
```

凄く見やすくなりましたね！
Redisを使う時は見積の二倍の容量必要だよね、という話


ある日Redisのログを眺めるとこんな子が大量に現れてて焦った。

```log:redis.log
[15487] 04 Aug 21:02:37.523 * 1 changes in 900 seconds. Saving...
[15487] 04 Aug 21:02:37.523 # Can't save in background: fork: Cannot allocate memory
```

redis-cli infoしても、使用してるメモリは全体の半分ちょっとだったし、空きは十分にある…

答えは
Redis Administration
http://redis.io/topics/admin
に書いてありました。

## 原因と解決策
redisのバックアップが走る際、おそらく現状使用している量と同じだけのallocateを要求しているために、redis自体はメモリ使用が50%強だとしても、バックアッププロセスが落ちてしまう模様。

解決は簡単で、Redis Administrationに書いてあるとおり、応急処置的に

```sh:
sysctl vm.overcommit_memory=1
```
を設定して、allocateを許可してあげればいい。

あとは、/etc/sysctl.confへ以下を追記。

```config:
vm.overcommit_memory = 1
```

## 見積の2倍は用意しよう
結論として、Redisを運用する際は見積もりして必要だと思われた容量の2倍は出来るだけ用意しといたほうが安定運用できますよ、という話。
umount /mnt: デバイスがビジーです。

```bash:
$ sudo umount /mnt
umount /mnt: デバイスがビジーです。
       (このデバイスがプロセスによって使われているのであれば、lsof(8)やfuser(1)>
を使って調査するのが有益かもしれません)
```

```bash:
$ lsof /mnt
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF  NODE NAME
bash    13410 user  cwd    DIR   8,33     8192 63803 /mnt/work
$ sudo kill -9 13410
$ lsof /mnt
$ sudo umount /mnt
```
Git マージオプション「--no-ff」 

git merge する時に特に意味なく「--no-ff」をつけていなかった件

* --no-ffをつけた場合
 fast-forwardしないのでマージコミットされて分岐の履歴が残る

* --no-ffを付けなかった場合（デフォルトの設定）
fast-forwardされて履歴が一本化される（ブランチ参照先の更新だけを行う）

* --no-ffを付けていないがfast-forwardでは無い場合
マージする対象のブランチとfast-forwardでは無い場合（マージする対象にマージされる側のコミットの歴史がすべて含まれる場合）、--no-ffをつけた場合と同じくマージコミットされて分岐の履歴が残る

![no-ff.png](https://qiita-image-store.s3.amazonaws.com/0/5669/3f6087f5-936d-e9cc-9e89-7d7b481a80d9.png)
git-svnのタグをgitのタグにする

git-svnでsvnリポジトリにすればひととおりタグは読めるのですが、svn側のタグはgitではブランチとして記憶されます。これらをgitのタグとして使いたかったので、bashでスクリプトを書きました。

```bash:git-pin-svn-tags.sh
#!/bin/bash
for branch in `git for-each-ref --format='%(refname)' | grep tags/`
do
  git show --pretty=format:%s%n%n%b "$branch" | git tag -F - "`basename $branch`" "$branch^"
done
```

コミットを消したりはしないので破壊的なことはないと思います。

単純にやると`git branch`を`xargs`に突っ込むだけですむはずですが、上のように長くした理由を説明します。

Subversionでタグを作る時は「trunkで作業する→tagsディレクトリにコピー」のようにします。git-svnはSVNでのコミットをひとつひとつ忠実にgitのコミットに直すので、最後のコピーするコミットも単独のコミットになります。すると、特に変更内容のないコミットが各ブランチの先端にくることになります。この空コミットを省いてしまうのが冒頭のスクリプトです。

コピー時のメッセージはタグに含めることにしました。

(参考: [for-each-ref](http://qiita.com/usamik26/items/28503c2f594d2ef305d2))
試験日をカウントダウンして自動投稿


基本情報・応用情報と情報セキュリティスペシャリスト試験日までのカウントダウンをtwitterで投げます。
実行時点の日付と今春＞今秋＞来春の優先順位で試験日との差分をとり、1日以上残っている試験日の残日数を投稿。
残がなければ次の試験をカウント・ダウンするように。
秋期の後は来年の春になるのでyearに+1して来年の4月の第三日曜日と日付差分を取るように。
変数名が適当なのはセンスに絶望的な欠陥があるせいです。

```python:count.py
from urllib import urlencode
#from oauth2 import Client, Consumer, Token
from datetime import date, timedelta
import datetime
import calendar
import time
from datetime import date
import re
#from oauth2 import Client, Consumer, Token
#下は私が勝手に作ってOAuthトークンを別に置いているものですのでスルーして下さい。
import kino


today = date.today()now = datetime.datetime.now()year = now.year

#今年の4月と10月、来年の4月の日曜日をリストで取得xday1 = [x[calendar.SUNDAY] for x in calendar.monthcalendar(year, 4)]xday2 = [x[calendar.SUNDAY] for x in calendar.monthcalendar(year, 10)]xday3 = [x[calendar.SUNDAY] for x in calendar.monthcalendar(year+1, 4)]

#このコードを実行時点の今日と試験日との差分を取得xday1a = (date(year, 4, int(xday1[2])) - date.today())xday2m = (date(year, 10, int(xday2[2])) - date.today())xday3o = (date(year+1, 4, int(xday1[2])) - date.today())

if xday1a.days > 0:    message = "春期の応用情報技術者試験まであと" + str(xday1a.days) + "日しか残ってない "elif xday2m.days > 0:    message = "秋期の応用情報技術者試験まであと" + str(xday2m.days) + "日しか残ってない "else:    message = "春期の応用情報技術者試験まであと" + str(xday3o.days) + "日しか残ってない"kino.client.request('https://api.twitter.com/1.1/statuses/update.json', 'POST', urlencode({'status': message}))
```

2013/08/07
手直しした方がいい箇所だらけだと思いますが公開
2013/08/08
messageをif-else節で用意した後に外で投稿投げられたので2行節約
2013/08/13
差分がdaysだけ取り出して整形が必要なくなった行を削除
gem の '~> 1.2' みたいなバージョン指定を ['>=', '<'] 表記に展開する

gemspec や Gemfile で gem のバージョン番号を指定するときに `'~> 1.2'` のように書ける (pessimistic version operator とかいうものらしい)

簡潔に書けて便利な反面、簡潔すぎて「`'~> 1.2'` って上限いくつだよ」といつもわからなくなるのでわかりやすい `['>= 1.2', '< 2']` のような表記に展開する方法を調べた。

`Gem::Version#bump` で Semantic versioning を意識した「次のバージョン番号」が得られるので、

```rb:
version = "1.2"
"['>= #{version}', '< #{Gem::Version.create(version).bump}']"
```

これで ok. [テストコードつきのサンプルコードはこちら](https://gist.github.com/kyanny/6164775)

オマケ: ブラウザで試せる [Gem pessimistic version expander](http://jsdo.it/kyanny/q7mZ/fullscreen) も作った ([jsdo.it](http://jsdo.it/) と [lleval](http://colabv6.dan.co.jp/lleval.html) を利用)

<a href="http://jsdo.it/kyanny/q7mZ/fullscreen"><img src="https://qiita-image-store.s3.amazonaws.com/0/339/267bc73a-7233-b3e8-b381-d4a816af7b8a.png" /></a>

----

* [Pessimistic version constraint](http://guides.rubygems.org/patterns/#pessimistic_version_constraint)
* [Ruby's pessimistic operator](http://robots.thoughtbot.com/post/2508037841/rubys-pessimistic-operator)
* [Semantic Versioning 2.0.0](http://semver.org/)
homebrewが/Library/Cachesを見に行ってしまう。

brew install gitとかすると/Library/Cachesを見に行ってしまい、permission deniedって怒られてしまう状況になってしまった。

```
-% brew install git
Error: Permission denied - /Library/Caches
```
こんな感じ

どうも`~/Library/Caches/Homebrew`ってディレクトリがないと`/Library/Caches/Homebrew`をキャッシュに使うようになってるみたい。

なのでディレクトリ作ってやったらちゃんと動くようになりました。
勢い余って消しちゃったのかしらん。。

#####ちなみに
global.rbの18行目あたりからが多分該当箇所

```/usr/local/Library/Homebrew/global.rb
def cache
  if ENV['HOMEBREW_CACHE']
    Pathname.new(ENV['HOMEBREW_CACHE'])
  else
    # we do this for historic reasons, however the cache *should* be the same
    # directory whichever user is used and whatever instance of brew is executed
    home_cache = Pathname.new("~/Library/Caches/Homebrew").expand_path
    if home_cache.directory? and home_cache.writable_real?
      home_cache
    else
      root_cache = Pathname.new("/Library/Caches/Homebrew")
      class << root_cache
        alias :oldmkpath :mkpath
        def mkpath
          unless exist?
            oldmkpath
            chmod 0777
          end
        end
      end
      root_cache
    end
  end
end
```
ソフトウェアライセンスについて

誰かおしえてください。

現在、グローバル公開のWEBシステムを開発しています。

そのWEBシステムでは、オープンソースなフレームワークや
JQueryを使用しています。


それらのライセンスがどう関わってくるのかイマイチ分かっていません。。


何をすればいいのか、分かりやすいサイト等教えてください。
連想配列にデフォルト値を適用しつつ既知のキーだけ抽出

## Before

```php
<?php
$params = array('a' => 9, 'c' => 3);

$default = array('a' => 1, 'b' => 2);
$ret = array();
foreach ($default as $k => $v)
{
    if (array_key_exists($k, $params))
    {
        $v = $params[$k];
    }
    $ret[$k] = $v;
}
$params = $ret;
```

## After

foreach しなくてももっと簡単に書けます。

```php
<?php
$params = array('a' => 9, 'c' => 3);

$default = array('a' => 1, 'b' => 2);
$params = array_intersect_key($params, $default) + $default;
```

コンストラクタで連想配列でコンフィグを受け取る系のライブラリなどで使えます。

```php
<?php
class HogeClass
{
    protected $config = array(
        'attr1' => null,
        'attr2' => 123,
        'attr3' => "abc",
    );

    public function __construct(array $config)
    {
        $this->config = array_intersect_key($config, $this->config) + $this->config;
    }
}
```
ruby でブロックの実行時間を計る


たまに `Time.now - start` 的なことを書くので、記録。

```ruby:
def measure(&block)
  t0 = Time.now
  ret = block.call
  span = Time.now - t0
  return ret, span
end
```

利用方法は以下のような。

```ruby:
ret, time = measure do
  sleep 1
  "hello"
end

puts "return = #{ret}, time = #{time}" 
  => "return = hello, time = 1.00064"
```

実は変数の同時代入構文が好きです。
Marked.js で Markdown をクライアント側でパースして表示する


[Typescript クイックガイド](http://phyzkit.net/typescript/) で、ソースを見たら Markdown で書かれてたのをみて「カッケー」と思ったのと、[利用規約やプライバシーポリシーは Github に置くといいよ](http://www.atmarkit.co.jp/ait/articles/1302/05/news091.html) というのを見て、なら「github に .markdown ファイルを置いてクライアントサイドでスタイリングできたら嬉しいじゃん？」と思いやってみた。

## Javascript による markdown パーサいろいろ

上記 Typescript クイックガイド では [marked.js](https://github.com/chjj/marked) が使われているようだが、他にもいろいろある模様。下記にて比較してくださっている。

* [JavaScript - Markdownパーサーのshowdown.js、markdown-js、markedを簡単比較 - ぼっち勉強会](http://kannokanno.hatenablog.com/entry/2013/06/19/132042)

もともと marked.js を使おうと思ってたし、上記サイトでも問題無さそうだったので、そのままいく。

## 使い方

marked.js を読み込んだ後、

```js:
var formatted = marked(markdown_text)
```
で、HTML に整形された文字列が返されるというシンプルなもの。(整形オプションがいろいろあるようだが割愛)

Typescript クイックガイドでは、HTML 内に Markdown テキストがベタ書きされていたが、せっかくなので管理がしやすいように外部 Markdown ファイルを読みこむようにしてみた。

```html:md_renderer.html
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">

        <title>Markdown renderer</title>
        <meta name="description" content="Markdown renderer">

        <!-- bootstrap -->
        <link rel="stylesheet" type="text/css" href="css/bootstrap.css" rel="stylesheet">
        <link rel="stylesheet" type="text/css" href="css/bootstrap-responsive.css" rel="stylesheet">

        <!-- js libraries -->
        <script type="text/javascript" src="js/jquery-2.0.3.js"></script>
        <script type="text/javascript" src="js/marked.js"></script>
        <script>
            $(document).ready(function(){
                var target = $("#markdown_content");

                $.ajax({
                    url: target[0].attributes["src"].value,
                }).success(function(data){
                    target.append(marked(data));
                }).error(function(data){
                    target.append("This content failed to load.");
                });
            });
        </script>
    </head>

    <body>
        <!-- Content -->
        <div class="container">
            <div id="markdown_content" src="./sample.markdown"> </div>
        </div>
    </body>
</html>
```

一番下の ```<div id="markdown_content" src="./sample.markdown">``` の src に読み込む Markdown ファイルを指定するようにした。

bootstrap で見栄えを良くしているが、必須ではない。

こちらが [デモ](http://blog.amay077.net/assets/images/posts/md_renderer/md_renderer.html) 。

さすがに描画に少し時間がかかるみたいです。
``marked()`` は非同期版もあるようなので、そちらを使うべきだったかな。

これで、データ(Markdown)とプレゼンテーション部(HTML)を分離できて、なんか良さげな感じがする。

Octopress とか、HTMLを生成しちゃうんじゃなくて、クライアントサイドで 「Markdown を描画する」できると、投稿の手間が減って良いかもですね。
fatal: final sha1 did not match

唐突に出るエラー。
原因は不明。
ぐぐったらmacとfinkの情報が出てきますが、自分はwindowsのmsysgitでgithubからfetchする時に出ました：

```shell-session:
remote: Counting objects: 1, done.
remote: Total 1 (delta 0), reused 1 (delta 0)
Unpacking objects: 100% (1/1), done.
fatal: final sha1 did not match
fatal: unpack-objects failed
```

git fsck, repack, gcを一通りやってみたけど、全部正常でエラーを検出できませんでした。
最終的にはremoteを一度rmしてaddし直したらなぜか直りました：

```shell-session:
git remote rm origin
git remote add origin <url>
```