OmniAICreator/Qiita-1.07M huggingface dataset:
FuelPHP で Parser ライブラリを使いつつ、ViewModel を使う

ViewModel の場合、読み込むテンプレートの指定が少し特殊だったのでメモ
テストとして言語ファイルを読み込んで出力してみる。

まず、設定に parser を追加

```PHP:app/config/config.php
<?php
// ..
	'always_load' = array(
		'packages' => array(
			'parser',
		)
	);
// ..
```

読む込む言語ファイルはこちら

```PHP:app/lang/ja/test.php
<?php

return array(
	'label' => array(
		'hoge' => 'Hoge!',
		'fuga' => 'Fuga!',
	);
);
```

出力したいテンプレートはこちら

```Twig:app/views/welcome/index.html.twig
{{ labels.hoge }}
{{ labels['fuga'] }}
```

コントローラでの ViewModel の使い方はいつも通り。

```PHP:app/classes/controller/welcome.php
<?php

class Controller_Welcome extends Controller
{
	public function before()
	{
		\Lang::load('test');
	}
	
	public function action_index()
	{
		return \Response::forge(\ViewModel::forge('welcome/index'));
	}
}
```

ViewModel はこちら

```PHP:app/classes/model/welcome/index.php
<?php

class View_Welcome_Index extends \ViewModel
{
	protected $_view = 'welcome/index.html.twig';
	
	public function view()
	{
		$this->labels = array(
			'hoge' => __('label.hoge'),
			'fuga' => __('label.fuga')
		);
	}
}
```

しかし使い辛い。。
もっといい方法があるのかな〜
１月、2月…をJan. Feb. ...に変換する

可読性のよいやり方↓

```cs
        public static string GetMonthStringEn(int month)
        {
            var date = new DateTime(2000, month, 1);
            System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("en-US");

            return date.ToString("MMM", ci) + ".";
        }
```

別解↓

```cs
        public static string GetMonthStringEn(int month)
        {
            var invariantCulture = new CultureInfo(string.Empty, false);
            var monthString = DateTimeFormatInfo.GetInstance(invariantCulture).AbbreviatedMonthNames[month - 1];

            return monthString + ".";
        }

```
指定した確率でtrue/falseを取得

```php:kakuritu.php
/**
 * 指定した確率でtrue/falseを取得
 * @param integer $prob 確率(1～100)
 */
function kakuritu($prob=100) {
	if ($prob < 1 || $prob > 100) {
		$prob = 100;
	}
	$rnd = mt_rand(1, 100);
	if ($rnd <= $prob) {
		return true;
	} else {
		return false;
	}
}
```
0xAARRGGBBから0xAAと0xRRGGBBを取り出して、再び0xAARRGGBBにもどす。

```actionscript
var color:uint = 0xAARRGGBB;
var alpha:uint = color >>> 24;
var rgb:uint = color & 0xFFFFFF;
//alpha --;
color = alpha << 24 | rgb;
```
CoffeeScriptで作るjQueryプラグイン

たぶん動く。

```coffeescript
do (jQuery) ->
  $ = jQuery
  $.fn.mypluin = (config) ->
    defaultConfig =
      color: 'red'
    options = $.extend(defaultConfig, config);
    @each () ->
      $(@).css('color', options.red)
```

```js
(function(jQuery) {
  var $;
  $ = jQuery;
  return $.fn.mypluin = function(config) {
    var defaultConfig, options;
    defaultConfig = {
      color: 'red'
    };
    options = $.extend(defaultConfig, config);
    return this.each(function() {
      return $(this).css('color', options.red);
    });
  };
})(jQuery);
```
How to open a link from popup.html in a new tab.

There are two ways to open a new tab that has a URL clicked in popup.html.

**Note:** Without both of them, even if an user click a link, nothing occurs.

First, add `target='_blank'` to A tags. 

```html
<a href='http://qiita.com/' target='_blank'>Qiita</a>
```

Second, use `chrome.tabs.create`. This function can be used without requesting the 'tabs' permission in the manifest.json.

```javascript
$(function() {
  $('a').click(function() {
    chrome.tabs.create({url: $(this).attr('href')});
    return false;
  });
});
```

The difference between them is whether the popup window is closed. The former close it and the later keep it opened.
git fetchしたときにremoteに存在しないbranchはlocalでも削除する

ふつうgit fetchでは他人が削除したremoteのブランチを消してくれないが、

````
% git fetch -p
````

とすればローカルのブランチをremoteに合わせて、remoteで消されてるものはローカルでも削除する、という動きをする。

````
% git fetch --help

 -p, --prune  
 After fetching, remove any remote-tracking branches which no longer exist on the remote. 
````
Google App Engineで日本時間を使うには

```java
TimeZone.setDefault(TimeZone.getTimeZone("JST")); 
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss"); 
String dateStr = sdf.format(new Date());
```

# 関連記事

- [Google App Engine(Java)日本語の件名でメールを送信する](https://abrakatabura.hatenablog.com/entry/2011/02/12/214121)
- [DockerのAlpine Linuxでタイムゾーンでハマった](https://abrakatabura.hatenablog.com/entry/2017/07/16/081952)
Entity Frameworkでコードファーストをする時の注意点

Entity Framework4.1からの新機能、コードファーストは非常に素晴らしいのです。
しかし昨日から何故かテストが通らずに
`System.InvalidOperationException: The model backing the 'xxxContext' context has changed since the database was created`
という例外が出てハマりまくってました。

解決策は簡単で、Web.configのconnectionStringsのaddタグのname属性を、
コンテキストクラス名の「xxxContext」の__Contextを抜いた「xxx」の部分__と同じにしないといけない制約があるそうです。

name属性を「xxxContext」にしていて丸一日ハマってました・・・。
ココログでSyntaxHighlighterを使う

設定->基本情報->ブログのサブタイトル(キャッチフレーズ)に以下のコード追加すれば出来た。

``` js
<script type="text/javascript">
function cssChange( file ){
 var link = document.createElement('link');  
 with( link ) {     
href = file;
        type = 'text/css';
      rel = 'stylesheet'; 
 }       
 var head = document.getElementsByTagName('head');   head.item(0).appendChild(link);
}
cssChange("http://kjunurl.appspot.com/css/shCore.css");
cssChange("http://kjunurl.appspot.com/css/shThemeDefault.css");
</script>
<script type="text/javascript" src="http://kjunurl.appspot.com/js/shCore.js"></script>
<script type="text/javascript" src="http://kjunurl.appspot.com/js/shBrushJScript.js"></script>
<script type="text/javascript" src="http://kjunurl.appspot.com/js/shBrushCSharp.js"></script>
<script type="text/javascript" src="http://kjunurl.appspot.com/js/shBrushJava.js"></script>
<script type="text/javascript" src="http://kjunurl.appspot.com/js/shBrushPerl.js"></script>
<script type="text/javascript" src="http://kjunurl.appspot.com/js/shBrushVb.js"></script>
<script type="text/javascript" src="http://kjunurl.appspot.com/js/shBrushXml.js"></script>

<script type="text/javascript">
     SyntaxHighlighter.all()
</script>
jsdo.itでサーバサイドJavaScript

# 仕組み
Google App EngineでRingojsを動かし、そこからJsdo.it上のJavaScriptのソースを
GETして、evalする。やや危険な香りがする方式。

## Google App Engineに設置するJavaScript
コードはこんな感じです。


```js
exports.app = function(request) {
    var path = request.pathInfo.slice(1) || "index";
    // 1. resolve against actions
    if (typeof actions[path] === "function") {
        return actions[path](request);
    }
    // 2. resolve against public folder
    var resource = getResource("./public/" + path);
    if (resource.exists()) {
        return response.static(resource);
    }
    importPackage( java.net);
	importPackage( java.io);
	var sourceJs = "http://jsdo.it/[your accounts]/"+path+"/js";
	var url = new java.net.URL(sourceJs);
	try {
	var ucon = url.openConnection();
	var istream = ucon.getInputStream();
	var isr = new java.io.InputStreamReader(istream, "utf-8");
	var br = new java.io.BufferedReader(isr);

	var line = "";
	var buf = "";
	while ((line = br.readLine()) != null) {
		buf=buf+line+"\n";
	}
	// 読み込んだJavaScriptを実行する。
	var result="";
	// jsdo.it側でjsdoitServerFuncを定義する。
	eval(buf);
	result = jsdoitServerFunc(request);
	return result;
	} catch(e) {
		return response.notFound(e);
	}
    // 3. return 404 response
    return response.notFound(request.pathInfo);
}
```

## Jsdo.itの作品のURLとのマッピング関連の仕掛け

web.xmlで任意の名前でリクエストを受けられるようにしておき、
PathInfoでjsdo.it側から読み込むソースのURLを決定します。

# 大事なこと忘れてた
[RingoJS](http://ringojs.org/)が必要です!

DLして、適当な場所で展開して動かします。

```
ringo-admin create --google-appengine /path/to/appdir
```

これでappdirが作成されるので、適当にEclipseに取り込んで、Google App Engineの
プロジェクトとして設定して、デプロイします。

参考ページ [RingoJS runs fine on Google App Engine for Java](http://ringojs.org/wiki/Google_App_Engine)

# 関連記事
- [Jsdo.itでGoogle App Engineのデータストアを使う](http://kjunichi.cocolog-nifty.com/misc/2012/02/jsdoitgoogle-ap.html)
- [RingoJSでのBase64エンコード](http://qiita.com/items/a55a723ac6dc8551707f)
- [RingoJS v0.8でのファイルアップロード](http://qiita.com/items/329c75219835cc4912bd)
JavaScriptでapplyを使ってメソッド呼び出しする

```JavaScript
var add = function (a, b) {
    return a + b;
};
var array = [3, 4];
// first argument is "this"、second is parameters.
var sum = add.apply(null, array); //sum is 7
```

applyの使い方をよく忘れそうなので、メモ。
Javaにおける異種コンテナの実装(Effective Java 2ndから)

自分のよく使う実装メモからの移植投稿

```java
import java.util.HashMap;
import java.util.Map;

public class Test
{

	private Map<Class<?>, Object> contents = new HashMap<Class<?>, Object>();
	private <T> T getContent(Class<T> type){
		
		return  type.cast(contents.get(type));
	}
	
	public static void main(String[] args)
	{
		
		Test test = new Test();
		
		test.contents.put(String.class, "メモですよ");
		
		
		String newMemo = test.getContent(String.class);
		System.out.println(newMemo);
		
	}
}
```

異種コンテナは、インターフェースをキーにそのインスタンスを保持するようなフィールドの型として便利。
jQueryを手早くコピペ出来る

```javascript
src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js";
sc = document.createElement("script");
sc.type="text/javascript";
sc.src=src;
document.body.appendChild(sc);
```

これを、ブラウザのConsoleに貼りつけたら、OK
PHPでendifを使う

PHPでendifが使えるらしいので、試してみました。

```PHP:endif
<?php
if(true):
        echo '1'.chr(10);
        echo '2'.chr(10);
        echo '3'.chr(10);
else:
        echo '4'.chr(10);
        echo '5'.chr(10);
endif;
?>
```

```:output
1
2
3
```

これ、どういう時に使うんだろう・・・・
Building un-registered extention in waf

waf's bld rejects unknown extensions(registered extensions are '.c', '.o', '.obj', '.C', '.c++', '.cxx', '.cc', '.pc.in', '.cpp').

If you have following shell file named app-env.sh.in,

```sh
#!/bin/sh

export APP_HOME=@prefix@
# other settings
```

writing build rule as below.

```py
bld(source='app-env.sh.in',
    target='app-env.sh',
    prefix=bld.env['PREFIX'],
    features='subst')
```

target and ```features='subst'``` are needed. Thanks to tanakh!
Qiitaへの改善要望

・ 特定のタグのページ、例えばhttp://qiita.com/tags/HTML からも投稿出来るようにして欲しい

投稿時にデフォルトでHTMLのタグが付加されてると良いですね。
あるタグのページを閲覧してて、そのタグに関するネタを投稿したい時にトップに戻るのが面倒です。

・ トップページ (http://qiita.com/) からもタグの検索ができるようにして欲しい

現在は、タグ一覧ページ (http://qiita.com/tags) からしかタグの検索できませんよね。
削除したテキストをレジスタに保存しないようにする

ブラックホールレジスタ_を活用

```vim
"_dd
```
上記をノーマルモードで実行すると、削除したカレント行がレジスタに保存されない。
クリップボードの内容を無名レジスタに入れている場合などに便利
Excel2007 リボンの最小化 VBA

Excel2007で、リボンの最小化の切換えをするVBAです。
手動の『Ctrl+F1』と同じです。

フォームからは、できません。

``` ruby:最小化
private sub miniMenu()
    Application.SendKeys Keys:="^{f1}", Wait:=True
    DoEvents
end sub
Qiitaへの要望メモ

# 使いやすいところ

* デフォルトでmarkdown記法を認識してくれて、コードスニペットを文章の任意の位置に挿入できて、各コードスニペットの言語を指定してシンタックスハイライトを適用できて、かつその場でプレビューを見ながらメモを書くことができる
* かなり便利
* 一つ一つに対応したサービスはあるがこれらが全部できるサービスはQiitaしか無い

# 要望

* 各ユーザーの投稿アイテムを、タグ別で絞り込んで表示する機能がほしい
  * http://qiita.com/users/yuiseki/tag1/tag2/
  * 投稿アイテムが増えたとき、自分の過去のメモを探すのが大変になりそう
  * ユーザーページの円グラフから各タグのページに行けると良いのでは
* 各ユーザーのRSSがほしい
  * http://qiita.com/users/yuiseki/feed
* titleにタグを#ハッシュタグで付けるのを設定でオフにできるようにしてほしい
* 過去に投稿したアイテムを一括でエクスポート（ダウンロード）する機能がほしい
* 下書き機能＆下書き自動保存機能などクラッシュ時に悲しいことになるのを防ぐ機能がほしい
* gistのscriptタグによるembedへの対応
* はてなダイアリー、はてなグループ、はてなブログの過去ログを取り込み
  * APIかなんか用意してもらえれば自分でやれなくもない

他に思いついたら追記する
keepalived + ipvsadmのLVS環境で、様々な用途の接続を1つのkeepalivedで管理することは良くない…？

MySQL接続をLVSで管理しておけば、PGでの振り分けとか、リアルサーバ側でのIP変更対応が不要になって便利なんだけど、落とし穴があるような気がしてきた…。

httpなどの他プロトコルと同じ keepalived で管理していると、ipvsadmで個別にweightを変更するような対応ができない。
ipvsadmで個別にweight変更しても、結局keepalivedに戻されたりするので、keepalived.conf を書き換えてkeepalived再起動することになる。

そうすると、全LVS設定を巻き込むことになる。

httpの場合は特に問題が出ていないのだけど、mysql接続が巻き込まれると、sleepプロセス発生の原因になっているような…。

もちろん、[timeout時間の問題](http://d.hatena.ne.jp/hirose31/20110607/1307419229 "LinuxのLVS（IPVS）でMySQLをロードバランスするときはtimeoutに注意 - （ひ）メモ")については対応済なので、そこは潰している。

というか、違う用途の接続は、同じkeepalivedで管理しない方が良いのかもしれない。

[IPVS(--check)とVRRP(--vrrp)を分けて運用する](http://d.hatena.ne.jp/hirose31/20090713/1247487788 "keepalived と 当ててるパッチたち - （ひ）メモ")という手法があるくらいなので、一つのkeepalivedで一括管理していること自体がそもそもの間違いなのか…。
CoreDataの一対多関連(One To-Many Relationship)

最初つまづいたのでメモって公開しておく

-----

## .xcdatamodeldファイルを編集する

* Add Entityで親になるモデルと子になるモデルをつくる
* Relationshipsの部分で＋ボタンを押して、それぞれのモデルでお互いへの関連をつくる。親から子への関連は複数形にしておくとわかりやすい
* Inverse(逆関連)にも、お互いを指定しておく
* **インスペクタを開き**、親モデルのRelationshipsの行を選択した状態でTo-Many Relationshipにチェックをつける
* **インスペクタを開き**、子モデルのRelationshipsの行を選択した状態でCount Minimum, Maximumを両方1にする


* TODO: Delete Ruleについても書く

----
## モデルのクラスを定義する

* NewFileから、左側の一覧でCoreDataを選び、NSManagedObject subclassを選択する
* Nextを押して、前項で編集していた.xcdatamodeldであることを確認し、生成する

これで自動的に、.xcdatamodeldで定義した親子関係を持ったNSManagedObjectが作られる

-----
## 関連付けして保存する部分

親モデルに、関連定義した子を追加（関連付け）するための便利メソッドが生成されているのでそれを使う
クラスメソッドとインスタンスメソッドを混同してコールすると変なことになるので変数名のつけ方に注意

```objective-c
        // 親 Modelを生成
        Photo *photo = [NSEntityDescription insertNewObjectForEntityForName:@"Photo" inManagedObjectContext:self.managedObjectContext];

        for (UILabel *label in [imageView subviews]) {
            // 子 Modelを生成
            Label *labelData = [NSEntityDescription insertNewObjectForEntityForName:@"Label" inManagedObjectContext:self.managedObjectContext];
            [labelData setValue:label.text];
            // 子 を 親 Modelに追加
            [photo addLabelsObject:labelData];
        };

```

ここではforで一個づつ追加しているが、NSSetになったオブジェクトを一度に追加するメソッドも生成されている
IEの<input type="image" />対策

input type="image" をクリックしたとき、IEではname属性を送らずに、画像の縦横のサイズを送ってくるので、PHPでname属性が来ることを期待するような作りになっているとハマる。

image_xやimage_yがあるかも込みでハンドルしてもいいけど、name属性を配列にしておくと、
type="submit"でもtype="image"でも同じキーが渡ってくるので楽。

```php
<!-- フォーム1 -->
<form action="" method="post">

	<input type="submit" name="submit" value="送信" />
	<input type="image" name="image" value="画像" />
</form>

<!-- フォーム2 -->
<form action="" method="post">

	<input type="submit" name="submit[dummy]" value="送信" />
	<input type="image" name="image[dummy]" value="画像" />
</form>

<?php

var_dump($_POST);

// フォーム1

	// Chrome + submit
	// array(1) { ["submit"]=> string(6) "送信" }

	// Crhome + image
	// array(3) { ["image_x"]=> string(2) "16" ["image_y"]=> string(1) "4" ["image"]=> string(6) "画像" }

	// IE8 + image(ここでたいていハマる）
	//array(2) { ["image_x"]=> string(2) "12" ["image_y"]=> string(2) "25" }

// フォーム2

	// Chrome + submit, IE8 + submit
	// array(1) { ["submit"]=> array(1) { ["dummy"]=> string(6) "送信" } }

	// Chrome + image
	// array(1) { ["image"]=> array(1) { ["dummy"]=> string(6) "画像" } }

	// IE8 + image
	// array(1) { ["image"]=> array(1) { ["dummy"]=> string(2) "20" } }
```
IE Conditional Comments

IEの独自拡張である条件分岐コメント（Conditional Comments） の書き方。条件に合致した場合、あるいは合致しなかった場合、コメント内の記述が適用される。

#IEに適用（バージョンを限定しない）

```html
<!--[if IE]>
<link rel="stylesheet" href="/css/ie.css" type="text/css" />
<![endif]-->
```

#特定バージョン以下のIEに適用

```html
<!--[if lte IE 6]>
<link rel="stylesheet" href="/css/ie.css" type="text/css" />
<![endif]-->
```

#特定バージョン以上のIEに適用

```html
<!--[if gte IE 6]>
<link rel="stylesheet" href="/css/ie.css" type="text/css" />
<![endif]-->
```

#特定バージョンのIEのみに適用

```html
<!--[if IE 6]>
<link rel="stylesheet" href="/css/ie.css" type="text/css" />
<![endif]-->
```
CoreDataに画像のサムネイルをバイナリデータで保存する

100KB以下のちいさい画像ならCoreDataのモデルにいきなり入れちゃってもOK


* UIImageをいい感じに四角く切り取って縮小するメソッドをつくる

```objective-c
- (UIImage *)cropImageView:(UIImage *)image
{
    // 切り取る
    float origin_width = image.size.width;
    float origin_heigt = image.size.width;
    CGRect cropRect;
    if (origin_heigt <= origin_width) {
        float x = origin_width / 2 - origin_heigt / 2;
        float y = 0;
        cropRect = CGRectMake(x, y, origin_heigt, origin_heigt);
    } else {
        float x = 0;
        float y = origin_heigt / 2 - origin_width / 2;
        cropRect = CGRectMake(x, y, origin_width, origin_width);
    }
    CGImageRef cgimage = CGImageCreateWithImageInRect(image.CGImage, cropRect);
    UIImage *cropImage = [UIImage imageWithCGImage:cgimage];

    // 縮小する
    CGSize thumbSize = CGSizeMake(80, 80);
    UIGraphicsBeginImageContext(thumbSize);
    [cropImage drawInRect:CGRectMake(0, 0, thumbSize.width, thumbSize.height)];
    UIImage * thumbImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return thumbImage;
}
```

* 上記のメソッドからデータを取得して、CoreDataへ保存する
* thumbは、CoreDataのスキーマ設定でBinary Dataに設定しておくだけでOK

```objective-c
UIImage *thumbImage = [self cropImageView:image];
NSData *dataCropImage = UIImagePNGRepresentation(thumbImage);

Photo *photo = [NSEntityDescription insertNewObjectForEntityForName:@"Photo" inManagedObjectContext:self.managedObjectContext];
[photo setValue:dataCropImage forKey:@"thumb"];
```


* このサムネイルをDBから取り出して、UITableViewCell上のUIImageViewにセットするには

```objective-c
NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSData *data = [managedObject valueForKey:@"thumb"];
UIImage *img = [UIImage imageWithData:data];
cell.photoThumbImageView.image = img;
```
[古い方法]Master-Detail ApplicationでInterface Builderを使ってUITableViewCellのカスタマイズ

-----
## GUIでの作業
* ビューの追加
  1. NewFileからUIViewControllerのサブクラスを新規に作成。名称はPhotoCellControllerのようにする
  2. 生成されたxibファイルを開き、UIViewを消し、Objects一覧からテーブルセル単体をD&Dする
  3. セル上に必要な画面構成要素（UIImageViewやUILabel、UIButtonなど）を好きに配置する
  4. ↓の手順に従い、コードを変更する
  5. アシスタントエディタを開き、PhotoCell内の要素をPhotoCellクラスにアウトレット接続する。PhotoCell自体をPhotoCellControllerにアウトレット接続する。

-----
## コードの変更作業

* 上記4.の手順
  1. PhotoCellController.hで、PhotoCellControllerの上にPhotoCellクラスを書く
  2. PhotoCellController.mで、PhotoCellControllerの上にPhotoCellクラスを実装する

```objective-c:PhotoCellController.h
@interface PhotoCell : UITableViewCell {
@private
}
@property (nonatomic, retain) IBOutlet UIImageView *imageView;
@property (nonatomic, retain) IBOutlet UILabel *nameLabel;
@end

@interface PhotoCellController : UIViewController
{
@private IBOutlet PhotoCell* _cell;
}
@end
```

```objective-c:PhotoCellController.m
#import "PhotoCellController.h"
@implementation PhotoCell
@synthesize imageView;
@synthesize nameLabel;
- (void)dealloc
{
    self.imageView = nil;
    self.nameLabel = nil;
}
@end

@implementation PhotoCellController
〜〜……
```


* MasterViewController.mでカスタムセルを使う部分の変更
  1. #import "PhotoCellController.h"し、UITableViewCellの部分を以下のように変更する

```objective-c:MasterViewController.m
@interface MasterViewController ()
- (void)configureCell:(PhotoCell *)cell atIndexPath:(NSIndexPath *)indexPath;
@end

// Customize the appearance of table view cells.
- (PhotoCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"PhotoCell";
    PhotoCell *cell = (PhotoCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        PhotoCellController* controller = [[PhotoCellController alloc] initWithNibName:@"PhotoCellController" bundle:nil];
        cell = (PhotoCell *)controller.view;
    }
    [self configureCell:cell atIndexPath:indexPath];
    return cell;
}

- (void)configureCell:(PhotoCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
〜〜
}
```
プログラミングの本を無料で手に入れる方法

プログラミングの原作本はオープンソースになって公開されていることがあります。
例えば、
・[C++ GUI Programming with Qt 4 (First Edition)](http://www.qtrac.eu/marksummerfield.html)
・[C++ GUI Programming with Qt 3](http://www.qtrac.eu/marksummerfield.html)
・[The C++ Hackers Guide](http://www.oualline.com/books.free/free-books.html)
・[Teachers' Guide to Practical C++ Programming](http://www.oualline.com/books.free/teach/intro.html)
・[PHP Programming](http://en.wikibooks.org/wiki/PHP_Programming)
・[Programming Scala](http://www.artima.com/pins1ed/)
・[Real World Haskell――実戦で学ぶ関数型言語プログラミング](http://book.realworldhaskell.org/read/)
・[Ruby Best Practices](http://majesticseacreature.com/rbp-book/pdfs/rbp_1-0.pdf)
・[7 Free JavaScript E-Books and Tutorials](http://www.readwriteweb.com/hack/2010/12/6-free-javascript-e-books.php)
・[プログラマが知るべき97のこと](http://programmer.97things.oreilly.com/wiki/index.php/Contributions_Appearing_in_the_Book)
・[ソフトウェアアーキテクトの知るべき97のこと](http://97things.oreilly.com/wiki/index.php/97_Things_Every_Software_Architect_Should_Know_-_The_Book)

Amazonで気になる本を調べて、”原作者 言語 free ebook”と検索すれば出てきます。
調べれば調べるほどたくさんあるんですねｗ　他に良書があれば教えて下さい。

【追記】
著作権的に怪しいのは削除しました。原作者のホームページに行けばだいたい書いています。
CoffeeScriptでfilter&mapをforに置き換える

CoffeeScriptでfilterとmapを併用するケースは、forに置き換えることができる。
↓は配列の中身を全てtrimして、undefined・null・空文字のものを取り除いた配列を生成する関数の例。

```CoffeeScript:trim_all.coffee
# (1) filter and map version.
trim_all = (ary) -> ary.filter((e) -> e?.trim()).map (e) -> e.trim() 

# (2) for version.
trim_all = (ary) -> e.trim() for e in ary when e?.trim()

# (3) for version 2.
trim_all = (ary) -> t for e in ary when t = e?.trim()
```

(1)はfilter・mapのそれぞれでループするため、ループが2回になっている。
(2)のfor版だとループが1回で済む。
更にforだとスコープが同じなため、(3)のようにwhenの計算結果を再利用することも可能。
　Note: (1)ではfilterに渡す関数とmapに渡す関数のスコープが違うため、エラーとなる。
coffee-mode のインデントをスペース2つに設定

READMEの設定例に加えて、coffee-tab-widthも設定する必要がある。

https://github.com/defunkt/coffee-mode/pull/45

```cl:emacs.el
(defun coffee-custom ()
  "coffee-mode-hook"
 (set (make-local-variable 'tab-width) 2)
 (setq coffee-tab-width 2))

(add-hook 'coffee-mode-hook
  '(lambda() (coffee-custom)))
```
テストケース内で他のhtml内で定義した変数を参照する

複数のテストケースで値を持ちまわりたい時に、storeコマンドだとテストケース間で変数を持ちまわることができないので、javascript で記述。これだと別の1箇所に記述すれば複数のテストケースから値を参照できる。

ちなみに Selenium IDE だと、store でも testSuite 内で値が保存されたままになる様子。ただし、store だと testRunner とかを使った時にはうまく行かない。

```html:consts.html
<tr>
	<td>getEval</td>
	<td>myvar1='abc'; myvar2='def'; myvar3='ghi';</td>
	<td></td>
</tr>
```

```html:test1.html
<tr>
	<td>type</td>
	<td>id=text1</td>
	<td>javascript{myvar1}</td>
</tr>
```

そもそももっとちゃんとコードを書けばこんなことしなくても良いのだろうけれど。
なるべくコードが書けない人でも保守できるようにとか考えると、このあたりがわかりやすい一つの解かなと。
リモートホストのファイルやコマンド実行結果をdiff

bash系のプロセス置換（process substitution）がサポートされているシェルで可能。
公開鍵認証で認証エージェントに鍵を追加してある等、sshでパスワードやパスフレーズを入力せずに接続できる必要がある。
`diff <(ssh host1 cat file1) <(ssh host2 cat file2)`

sshでコマンド実行した結果をdiffする例。
`diff <(ssh host1 "rpm -qa"|sort) <(ssh host2 "rpm -qa"|sort)`

ローカルでも、コマンド実行した結果をdiffする例。
`diff <(sort file1) <(sort file2)`

昔書いたブログ記事からでした。
[しげふみメモ : リモートホストのファイル等でdiffする方法](http://blog.livedoor.jp/hakin/archives/51590509.html)
vimからref.vimでalc辞書を引く

ref.vimがインストールされていること。テキストブラウザとしてw3m, elinksなどを試したが、文字化け。結局lynxで成功した。

````zsh
% brew install lynx
% vim /usr/local/Cellar/lynx/2.8.7/etc/lynx.cfg
 => CHARACTER_SET:utf-8
% vim ~/.vimrc
 => let g:ref_alc_encoding = 'utf-8'
 => let g:ref_alc_start_linenumber = 44
````

ここまでできたらvimを開いた状態で

````vim
:Ref alc word
````

とすれば辞書が引ける。
To Check Internet Connection

To see if the machine is connected to the internet, the following functions would be useful.

I have experienced that the [InternetGetConnectedState](http://msdn.microsoft.com/en-us/library/windows/desktop/aa384702%28v=vs.85%29.aspx) API function sometimes returned true right after the router started rebooting. So it would help to double-check the connection with [WMI Ping](http://msdn.microsoft.com/en-us/library/windows/desktop/aa394350%28v=vs.85%29.aspx). 

```ahk:CheckInternetConnection.ahk
; Press F1 to check the internet connection.
F1::
	if IsOnline() && Ping("www.google.com") 
		TrayTip, Internet Connection, Online, 5, 1
	else
		TrayTip, Internet Connection, Offline, 5, 1
Return 

Ping(nAddress, strComputer=".") {
	objWMIService := ComObjGet("winmgmts:{impersonationLevel=impersonate}!\\" . strComputer . "\root\cimv2")
	colPings := objWMIService.ExecQuery("Select StatusCode From Win32_PingStatus where Address = '" nAddress "'")
	For objStatus in colPings
		If (objStatus.StatusCode = "") || (objStatus.StatusCode != 0)
			Return False
		Else
			Return True
}

IsOnline() {
	if DllCall("Wininet.dll\InternetGetConnectedState", "Str", "0x40", "Int", 0) 
		Return True
	else
		Return False
}
```

![Alt Result](http://lh3.googleusercontent.com/-VDyhzX6yjpU/TzicDvWICVI/AAAAAAAAAWI/buMocs3lzX0/s800/CheckInternetConnection.jpg)
jQueryでnoscriptを実装するためのお作法

自分のブログの[過去記事からの転載](http://ameblo.jp/itboy/entry-10715380924.html)ですが。

```example.html
<html>
<head>
<style type="text/css">
.jsenabled {
    font-weight:bold;
    border: 2px solid #0000ff;
    padding: 5px;
    width: 400px;
    display: none;
}
.jsdisabled {
    font-weight:bold;
    border: 2px solid #ff0000;
    padding: 5px;
    width: 400px;
}
</style>
<script type="text/javascript" src="js/jquery.js"></script>
<script>
    $(document).ready(function() {
    $(".jsenabled").show();
    $(".jsdisabled").hide();
})
</script>
</head>
<body>
    <div class="jsenabled">JavaScript is enabled</div>
    <div class="jsdisabled">JavaScript is disabled</div>
</body>
</html>
```

CSSでJavaScriptが有効なときに見せたい領域を非表示（display: none）にしておき、JavaScriptが有効な場合のみjQueryで表示に切り替えるというやり方です。
JavaScriptの名前空間のスマートな使い方

「JavaScriptの名前空間のスマートな使い方」と題してtogetterに投稿しました。
http://togetter.com/li/256885

これ以外に「こういう便利な方法がある」とか「自分はこういう工夫をしている」ということがあればご意見いただけませんでしょうか？
jQuery TimersのeveryTime()でsubmit()する時は事前にstopTime()する

jQuery Timers による　タイマー制御
http://s-ej.com/sample/jqp/jqp0004/

everyTime()を使って一定時間間隔で監視し、条件が満たされたらformをsubmit()する処理を書いていたがsubmit()する前にstopTime()しておかないとsubmit()が完了する前に次のeveryTime()が実行されて無限ループする場合がある。
Qiitaに欲しい検索機能

今後アイテムが多くなってくると、普通のタグ別表示だけじゃ足りない。
複数のタグで絞り込むのはもちろん、あるタグを「含まない」という条件で検索が必要になると思う。
「Javaタグを含むけど、Androidタグは含まない」みたいな。
Python での shift_jis と shift_jis_2004 について

最近文字コードについて調べてたら？なことがあったのでアウトプット。
簡単に言うと、

```python:hoge.py
hoge = '①'  # Python 3 なので Unicode
print(hoge.encode('sjis'))  # UnicodeEncodeError
print(hoge.encode('sjis_2004'))  # b'\x87\x40'
```

という話。

「①？機種依存文字でしょ？そんなん使うなよ」というのは今は昔の話で、符号化文字の JIS 規格の最新版 (JIS X 0213:2004) では①から㊿までが (連続でありませんが) 規定されており、いわゆる JIS2004 対応フォントであれば問題なく使用することができます。(例：Windows Vista 標準のメイリオ、Mac OS X (10.5 以降) 標準のヒラギノ)
いつも Shift_JIS で出力するときはサボって 'sjis' と書いてたのでエラーが出て面食らってしまいました。

で、結論としては sjis は Shift_JIS のエイリアスであって、Shift_JIS-2004 のエイリアスではないよーというなんていうことのない話でした。参考：[6.6. codecs — Codec registry and base classes &mdash; Python v3.2.2 documentation](http://docs.python.org/py3k/library/codecs.html#standard-encodings)

Shift_JIS-2004 は Shift_JIS の上位互換っぽいし (Shift_JIS + 第三、第四水準漢字)、Shift_JIS-2004 のエイリアスとして動いても問題なさそうなんですが、過去のコードが動かなくなるリスクを背負うよりは今後のコードに一手間入れた方が安全ってことなんでしょうか。

※余談
上記のドキュメントには sjis2004 も shift_jis_2004 の Aliases に入ってるのに、実行してみたら LookupError でそんなエンコーディングねーよでした。バグ？

※追記 2012/02/13-6:10
Lib/encodings/aliases.py にエイリアスの一覧があった。sjis2004 の代わりに s_jis_2004 なるものが。
どうやらドキュメントと aliases の差異については 2005 年の段階で[既に報告済み](http://bugs.python.org/issue1249749)みたいだけど、どうみてもプライオリティ高くないし後回しになってる模様。
名前空間を書いてみた。

コメントとか文字化けするんだが、どうすればいいか？
Qiitaを使う際に特殊な記号とかあるのか？「#」はタイトルとか
htmlでいうところのh1とか見出し？
本に書いてあるサンプルをやってみたのだが、
名前空間の使い方を初めて学んだ。
とりあえず、using namespace hogehoge;で呼び出せるようだ。(想像)
usingしないとhogehoge::hogeのようにやらんと使えないか(想像)

```main.cpp

#include <iostream>
using namespace std;

namespace firstNS{
	
	class demo{
		
		int i;
		
	public:
	
		demo(int x) { i = x; }
		void seti(int x) { i = x;}
		int geti() { return i; }
	
	};
	char str[] = "名前空間を説明する\n";
	int counter;
	
}

namespace secondNS{
	
	int x, y;
	
}

int main(){
	
	//スコープ解決演算子を使用する
	firstNS::demo ob(10);
	
	/*obを宣言した後は、名前空間就職しを使用せずに
	そのメンバ関数を使用することができる*/
	
	cout << "ob value is : " << ob.geti();
	cout << endl;
	
	ob.seti(99);
	
	cout << "now ob value is : " << ob.geti();
	cout << endl;
	
	//strを現在のスコープを取り込む
	using firstNS::str;
	cout << str;
	
	//firstNSのすべてびメンバを現在のスコープに取り込む
	using namespace firstNS;
	for(counter = 10; counter; counter--)
		cout << counter << " ";
	cout << endl;
	
	//secondNS　名前空間を使用する
	secondNS::x = 10;
	secondNS::y = 20;
	
	cout << "x, y: " << secondNS :: x;
	cout << ", " << secondNS::y << endl;
	
	 //2つの名前空間を可視状態にする
	 using namespace secondNS;
	 demo xob(x), yob(y);
	 
	  cout << "xob, yob: " << xob.geti() << ", ";
	  cout << yob.geti() << endl; 
	  
	  return 0;
	
}

```

//10分プログラミング(自分用に使うために作った自分用の造語)
//実際はだいたい20m47s掛かった。(ストップウォッチで計測)
//他、20分程、例外処理とかやった。
CoffeeScriptでis_blank

Qiitaよさげ！初投稿してみます。

Javaなんかで良く書かれる関数の、isBlank。
パラメタがnull or 空文字 or 空白のみかどうかを判定するのに使う関数で、実装は↓みたいな感じです。

```java:isBlank.java
public static boolean isBlank(String s) {
  return s == null && s.equals("") ? true : s.trim().equals("");
}
```

Rubyだともっと短く、こんな風に書けます。(Java版と違って、型チェックないけど)

```ruby:blank?.rb
def blank? s
  !s || s.strip == ''
end
```

CoffeeScript初心者(初めて2日目)なので、勉強のためにこれを移植をやってみました。

```coffeescript:is_blank.coffee
is_blank = (s) -> !s || s.trim() == ''
```

もう少しCoffeeScriptらしく書けないかなと思って調べてたら、こんな風にも書けることに気がつきました。

```coffeescript:is_blank.coffee
is_blank = (s) -> !s?.trim()
```

CoffeeScript、良いね！

######2012/02/13 09:22 追記
すみません、良く考えたらJavaも

```java:isBlank.java
public static boolean isBlank(String s) {
  return s == null || s.trim().equals("");
}
```

と書けます。
最初はRubyの「||=」について書こうと思って途中で変えたから、混乱してしまった･･･。
PythonとTkinterを使ってプログラミング

#encoding:utf8

from Tkinter import *
import tkFileDialog as dialog

def save(root, text):
    data = text.get('0.0', END)
    filename = dialog.asksaveasfilename(
        parent = root,
        filetypes=[('Text', '*.txt')],
        title='名前を付けて保存...')
    writer = open(filename, 'w')
    writer.write(data.encode('utf8'))
    writer.close()
    
def quit(root):
    root.destroy()
        
window = Tk()
text = Text(window)
text.pack()
    
menubar = Menu(window)
filemenu = Menu(menubar)
filemenu.add_command(label='保存', command=lambda : save(window, text))
filemenu.add_command(label='終了', command=lambda : quit(window))
    
menubar.add_cascade(label='ファイル', menu=filemenu)
window.config(menu=menubar)
    
window.mainloop()


'''
Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1413, in __call__
    return self.func(*args)
  File "menu.py", line 23, in <lambda>
    filemenu.add_command(label='Save', command=lambda : save(window, text))
  File "menu.py", line 11, in save
    writer.write(data)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

'''

'''
    初めてのコンピュータサイエンス gui/menu.pyよりそのままだとエラーだったので
    writer.write(data)ではエラーが出たので
    writer,write(data.encode('utf8')と、data.encode('utf8')を追加してみた。
'''
converting PCL point cloud type between pcl::PointCloud<PointT> (pcl pointcloud) and pcl::PointCloud2 (ROS pointcloud)

```cpp
//Convert pcl/pointcloud object(cloud1) to sensor_msgs/PointCloud2(cloud2) with toROSMsg()
const sensor_msgs::PointCloudConstPtr &cloud1;
sensor_msgs::PointCloud2 cloud2;
pcl::toROSMsg(*cloud1, cloud2); 

// Convert the sensor_msgs/PointCloud2(cloud2) object to pcl/pointcloud(cloud1) object with fromROSMsg()
sensor_msgs::PointCloud2ConstPtr& cloud2
pcl::PointCloud<pcl::PointXYZRGB> cloud1;
pcl::fromROSMsg (*cloud2, cloud1);
```
Qiitaの通知を表示できるChrome拡張を作った

画面の上の方に出てくる通知を見れるChrome拡張を勉強がてら作りました。よければ使ってみて下さい。

[Chrome Web Store - Qiita Notifications](https://chrome.google.com/webstore/detail/hcnchocfgcldaldkchelnhpidgmfaocc)
[taka84u9/qiita-notifications](https://github.com/taka84u9/qiita-notifications)

![Qiita Notifications](https://lh4.googleusercontent.com/hZhB60uPU4YW7q6YX3GQ-IjONfZH1nuM6JudHNLzAfeG05PiEQT3uXMsMoFQEhmIEBtKIsp4v0U=s640-h400-e365)

クロール間隔は150秒です。

HTTP通信の履歴からAPIを予測して（つまり非公開APIを用いて）作っているので、突然APIが変わったりして動かなくなったりする可能性があります。

また、バグなんかがあったら、GithubのページかQiitaに書いてくれれば、極力対応します。

ソースコードはオープンですが、最初の実装がQiitaに過剰にアクセスする感じだったので、キャッシュをさせたりなんなりしていたら、だんだんコードを綺麗に保つのが面倒になってしまって、つまり、汚いです。
最初の仕事はリファクタリングですかね。
ちょっと便利な content_tag_if ヘルパー

いまいちありがたい感じがしない content_tag ヘルパーですが、ちょっと拡張してみると結構便利になりました。

```
def content_tag_if(boolean, name, content_or_options_with_block = nil, options = nil, escape = true, &block)
  if boolean
    content_tag(name, content_or_options_with_block, options, escape, &block)
  end
end
```

こういうヘルパーを作成しておくと、

```
<% if boolean %>
  <div>hoge</div>
<% end %>
```

と書いていたものが、

```
<%= content_tag_if boolean, :div, 'hoge' %>
```

とすっきり書けます。
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad

こういうエラーがでるときの対応方法。

02-11 17:00:07.754: I/DEBUG(19337): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
02-11 17:00:07.754: I/DEBUG(19337): Build fingerprint: 'docomo/P_01D/pana2_1:2.3.4/GRH78/20111019.143038:user/release-keys'
02-11 17:00:07.754: I/DEBUG(19337): pid: 19367, tid: 19391  >>> hogehoge.me <<<

BitmapリソースやWebviewリソースで、recicleのような破棄系の処理をした後にリソースを参照しているため発生するエラー。Null系処理で無いのでNullPointerExceprionが出ないので、LogCatでキャッチしにくいので注意。

対処は、recicle系の処理をスタートするタイミングを見直すこと。
JavaScript で文字列の各単語の最初の文字を大文字にする

JavaScriptには文字列の各単語の最初の文字を大文字にする関数はないです。
PHP の ucwords 関数を簡単に作る方法です。


    function ucwords(str) {
        return str.replace(/(^|\s)[a-z]/g, function(val){ 
            return val.toUpperCase();
        });
    }
    
    var text = "hello my name is tom.";
    console.log(ucwords(text));
    // Output: Hello My Name Is Tom.
JavaScript で文字列の最初の文字を大文字にするための３つの方法

JavaScript には文字列の最初の文字を大文字にする関数はありません。
PHPでいうと ucfirst 関数と同じことができる３つの方法を書いた。

```js
var text = 'hello.';

var text2 = text.charAt(0).toUpperCase() + text.slice(1);

var text2 = text.substring(0, 1).toUpperCase() + text.substring(1);

var text2 = text.replace(/^[a-z]/g, function (val) {
    return val.toUpperCase();
});

// Output: Hello.
```

文字列の置き換え(replace)が遅いという先入観があって、１つ目の方法の charAt と slice を使うようにしてる。

#### ちなみに頭文字以外を小文字にしたい場合はこんな感じになる

```js
var text = 'hEllo All.';

var text2 = text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();

var text2 = text.substring(0, 1).toUpperCase() + text.substring(1).toLowerCase();

var text2 = text.toLowerCase().replace(/^[a-z]/g, function (val) {
    return val.toUpperCase();
});

var text2 = text.replace(/(^[a-z])(.*)/g, function (text, val1, val2) {
    return val1.toUpperCase() + val2.toLowerCase();
});

// Output: Hello all.
```
NICがどのドライバを使っているか確認

dmesgのバッファがあふれてなければ、`dmesg | grep ethX` でOKだし、/var/log/boot.msg でもわかるけど。
udevadm や udevinfo でも確認できる。
（RHELだと `grep eth /etc/modprobe.conf` でもわかるみたい）

`udevadm info -a -p /sys/class/net/ethX | grep DRIVER`
udevadmが無ければ、以下でもOK.
`udevinfo -a -p /sys/class/net/ethX | grep DRIVER`

>linux:~ # udevadm info -a -p /sys/class/net/eth4 | grep DRIVER
>    DRIVER==""
>    DRIVERS=="ixgbe"
>    DRIVERS=="pcieport"
>    DRIVERS==""
>linux:~ # 

この例の場合、ixgbe となる。

あとは、`modinfo -F version ixgbe` でバージョンを確認したり、
`modinfo -F filename ixgbe` でファイル名を確認して、
`rpm -qf /path/to/driver/file` でkernelに含まれるものなのか、
rpmでドライバのパッケージを追加したものか、等を確認。
コンソールログレベルの確認

参考
[障害発生時の金科玉条：第2回　PD思考法の基礎と情報収集（その2） (1/3) - ITmedia エンタープライズ](http://www.itmedia.co.jp/enterprise/articles/0512/15/news008.html)

`cat /proc/sys/kernel/printk` で表示される左端の値。

以下はSLES11SP1での例

>linux:~ # cat /proc/sys/kernel/printk
>1       4       1       7
>linux:~ # 

左から
console_loglevel	現在のコンソールログレベル
default_message_level	ログレベルが指定されていないメッセージに付加するログレベル
minimum_console_loglevel	コンソールログレベルに設定できる最小のログレベル
default_console_loglevel	デフォルトのコンソールログレベル

以下で定義されている。

```/usr/src/linux/include/kernel.h
#define KERN_EMERG      "<0>"   /* system is unusable                   */
#define KERN_ALERT      "<1>"   /* action must be taken immediately     */
#define KERN_CRIT       "<2>"   /* critical conditions                  */
#define KERN_ERR        "<3>"   /* error conditions                     */
#define KERN_WARNING    "<4>"   /* warning conditions                   */
#define KERN_NOTICE     "<5>"   /* normal but significant condition     */
#define KERN_INFO       "<6>"   /* informational                        */
#define KERN_DEBUG      "<7>"   /* debug-level messages                 */
```

デフォルトのログレベルは以下で定義されている。

```/usr/src/linux/kernel/printk.c 
/* printk's without a loglevel use this.. */
#define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */
/* We show everything that is MORE important than this.. */
#define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
#define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */
```

デフォルトは 7 だけど、SLESだと起動時に 1 に設定されてる。
SLESで SysRq + m とかしてもコンソールに何も表示されないのはこのため。
`dmesg -n 7` や `echo 7 > /proc/sysrq-trigger` 等で変更できる。
恒久的な変更はSLESなら /etc/sysconfig/syslog で KERNEL_LOGLEVEL=1 を変更。

RHELだとコンソールログレベルは6になっているみたい。
syslogdが起動すると6になるのかな？
重複順列を全て列挙する

例えば、A, B, C, D, Eからなる10文字を並べる。並べる10文字の中には同じ文字が重複してもよい。このとき、全ての重複順列を列挙するプログラムの例。
他にも効率的なやり方はあるけど, まずは実装がしやすい方法を。

# 考え方
A, B, C, D, Eをそれぞれ文字0, 1, 2, 3, 4に1対1に対応付ける. こうすると, 求めたい重複順列の1つは各桁が0〜4であるような10桁の整数に対応付けることができる(10桁に満たない場合10桁になるように前0で埋める).
各桁が0〜4なのでこれは5進数の10桁の整数のことである. 10桁の5進数の最小値・最大値はそれぞれ10進数で0, 5^10 - 1なので0から5^10 - 1までのループを行うことで全てが漏れなく得られる. あとは各ループのインデックスを5進数に変換し, 0, 1, 2, 3, 4をそれぞれA, B, C, D, Eに置き換えることで元のA, B, C, D, Eからなる10文字が得られる.

# 進数の変換
言語によっては自分で変換するためのコードを書いたりする必要がある.
しかしPHPでは便利なことにn進数からm進数への変換のための関数がデフォルトで用意されている.
`base_convert ($number, $n, $m)`を使うことで可能である.
またJavaScriptでは`Number.toString(5)`などとすれば5進数への変換が行える.

他の言語でも2進数や16進数など比較的よく使われる進数変換に関してはライブラリが存在するものも多い. ライブラリが存在しない場合, 自分で実装する必要があるが, 10進数からの変換で, 整数から整数への変換に限定さえすれば, そんなに難しいことはない. 

# 最後にサンプル
``` php
<?php
// 0埋めするための関数
function padZero($str, $length) {
    if (strlen($str) == $length) {
        return $str;
    }
    return padZero("0".$str, $length);
}

// マッピング
$replace_from   = array("0", "1", "2", "3", "4");
$replace_to     = array("A", "B", "C", "D", "E");

for ($i=0, $length=pow(5, 10); $i<$length; $i++) {
    $str = padZero(base_convert($i, 10, 5), 10);
    echo str_replace($replace_from, $replace_to, $str)."\n";
}
?>
```
[Java]年俸1000万の会社の試験問題(JavaではなくPHPで実装)

4種類のアルファベット "A,C,G,T" から成るn文字の文字列のうち、
"AAG"という並びが含まれる文字列を全て列挙するプログラムを書きなさい。
ただし、nは3以上の整数とし、文字列内に同じアルファベットが出現しても構わないものとし、
出力順序は問わないものとします。
http://alpha.cgios.net/alpha/cgios

速度的な問題もあるのでできれば, 重複を省く処理を入れたくはないのだが, 入れざるを得ない・・・


``` php
<?php 
/**
 * 任意の重複しないA, C, G, Tから成る長さn-3から成る文字列に対して, その文字列の任意の箇所に文字列"AAG"を埋め込んで
 * 得られる文字列は, 題意を満たす. ただし, この方法で求めた文字列には重複が存在する. そこで重複を全て省いた結果が求める
 * 文字列集合である.
 */

function padZero($string, $length) {
    if (strlen($string) < $length) {
        return padZero("0".$string, $length);
    }
    return $string;
}

function insertString($base_string, $insert_string, $position) {
    $length = strlen($insert_string);
    $value1 = substr($base_string, 0, $position);
    $value2 = $insert_string;
    $value3 = substr($base_string, $position, strlen($base_string));
    return $value1.$value2.$value3;

}

function solve($n) {
    $key = "002";
    $value;
    $hash = array();
    $answer = array();
    for ($i = 0; $i < PHP_INT_MAX; $i++) {
        $value = base_convert($i, 10, 4);
        if (strlen($value) <= $n - 3) {
            $hash[] = padZero($value, $n - 3);
        } else {
            break;
        }
    }

    for ($i = 0, $size = count($hash); $i < $size; $i++) {
        for ($j = 0, $length = strlen($hash[$i]) + 1; $j < $length; $j++) {
            $value = insertString($hash[$i], $key, $j);
            $answer[$value] = true;
        }
    }
    $hash = null;

    $count = 0;
    $replace_from = array("0", "1", "2", "3");
    $replace_to = array("A", "C", "G", "T");
    foreach($answer as $key => $value) {
        echo str_replace($replace_from, $replace_to, $key)."\n";
        $count ++;
    }
    echo "Count: $count\n";
}

// 実行
solve(10);
?>
Unity のタスクトレイのアイコンを表示されるようにする

Ubintu のUnity 環境だとシステムに許可されたものやインストーラが対応していないものは起動してもタスクトレイのアイコンが表示されなくなっている
これを表示できるようにする2種類の方法

1)gsettings コマンドで設定する方法
先ず，現在の設定を確認する

> $ gsettings get com.canonical.Unity.Panel systray-whitelist
> ['JavaEmbeddedFrame', 'Wine', 'scp-dbus-service', 'Update-notifier', 'gnome-keyring-prompt-3', 'SpiderOak']

出てきた結果に登録したいプログラムを加えてセットする
all にすると全て許可になる

> $ gsettings set com.canonical.Unity.Panel systray-whitelist [‘all’]
> 1:expected value

ログインしなおして反映されたのを確認する

2)dconf-editor で設定する方法
こちらはGUI のツール
標準では導入されていないので dconf-tools パッケージを導入する

> $ sudo apt-get install dconf-tools

dconf-editor を起動し，[desktop]->[unity]->[panel] の [systray-whitelist] を編集する
ログインしなおして反映されたのを確認する


なお，Ubuntu 11.04 での規定値は以下の内容だった

> ['JavaEmbeddedFrame', 'Wine', 'scp-dbus-service', 'Update-notifier']
AppHarborにデプロイするまでのメモ

AppHarborは.NetのPaaSです。Windows Azureが有名ですね。
Heroku(RubyのPaaS)の.Net版を目指してるみたいです。

[公式のページ](http://support.appharbor.com/kb/getting-started/deploying-your-first-application-using-git "ただし英語ですが")で懇切丁寧に説明されてるので特に必要ないかもですが、一応。

まずはWindowsにGitを入れる。
次にASP.NETのプロジェクトを作る。
Projectファイルの中の、xxxApplicationとかxxxApplication.Testsとかの階層で
` git add
  git commit`
次に[https://appharbor.com/](https://appharbor.com/ "AppHarbor")でユーザー登録。
メールを受け取ってアクティベートすると、Applicationを作る。
`git remote add appharbor https://[username]@appharbor.com/[example].git`
(usernameはAppHarborのユーザー名、exampleは作成したアプリケーション名)
`git push appharbor master`でデプロイ完了。(プッシュするとAppHarborで登録した時のパスワードを聞かれます)

http://[example].apphb.com/がデプロイしたWebアプリのURL。

AppHarborは1インスタンス目が無料で作成でき、2インスタンス目から課金という体型をとってます。
まずは試してみたいというのにはいいかもです。
[Java]年俸1000万の会社の試験問題[速度重視]

4種類のアルファベット "A,C,G,T" から成るn文字の文字列のうち、
"AAG"という並びが含まれる文字列を全て列挙するプログラムを書きなさい。
ただし、nは3以上の整数とし、文字列内に同じアルファベットが出現しても構わないものとし、
出力順序は問わないものとします。
http://alpha.cgios.net/alpha/cgios

初投稿。しょぼい知識で高速化を図ってみました。もっといい方法あれば教えて下さい。

```java:ACGTLogic.java
public class ACGTLogic {
	static final String[] CHARS = { "A", "C", "G", "T" };
	static final String REQUIRE_STR = "AAG";

	Map<Integer, List<String>> cache;

	public List<String> getList(int n) {
		if (n == REQUIRE_STR.length()) {
			List<String> list = new ArrayList<>();
			list.add(REQUIRE_STR);
			return list;
		}

		int reqNum = n - REQUIRE_STR.length();

		cache = new HashMap<>();
		List<String> pre, suf;
		Set<String> setList = new HashSet<>();
		createCache(reqNum);
		for (int i = 0; i <= reqNum; i++) {
			pre = cache.get(i);
			suf = cache.get(reqNum - i);

			for (int preIdx = 0; preIdx < pre.size(); preIdx++) {
				String preStr = pre.get(preIdx);
				for (int sufIdx = 0; sufIdx < suf.size(); sufIdx++) {
					setList.add(new StringBuilder().append(preStr).append(REQUIRE_STR).append(suf.get(sufIdx))
							.toString());
				}
			}
		}
		List<String> res = new ArrayList<>(setList);
		Collections.sort(res);
		return res;
	}

	private void createCache(int reqNum) {
		List<String> list = new ArrayList<>();
		list.add("");
		cache.put(0, list);
		for (int rep = 0; rep < reqNum; rep++) {
			List<String> tmp = new ArrayList<>();
			for (int i = 0; i < list.size(); i++) {
				for (int j = 0; j < CHARS.length; j++) {
					tmp.add(new StringBuilder().append(list.get(i)).append((CHARS[j])).toString());
				}
			}
			cache.put(rep + 1, tmp);
			list = tmp;
		}
	}
}
```
VMwareのIPアドレス


MacのターミナルからsshでローカルのVMwareFusionに接続して作業してるのですが、場所を移して接続するネットが変わる度にVMwareのアドレスが変わって再ログインしないといけないのを何とかしたいです。
何か良い方法は無いでしょうか？
Store an arbitrary Bundle object into a SQLite database

Note that the technique using Parcel is not recommended to use to store a object into a persistent storage.

```java:store_bundle_in_sqlite3.java
/* store a bundle */
Bundle bundle = // get a bundle from somewhere
final Parcel parcel = Parcel.obtain();
bundle.writeToParcel(parcel, 0);
byte[] bundleBytes = parcel.marshall();
parcel.recycle();

ContentValues values = new ContentValues();
values.put("bundle", bundleBytes);
SQLiteDatabase db = // create a db object
db.insert("table", null, values);

/* restore a bundle */
Cursor cur = // get a cursor of your db
byte[] bundleBytes = cur.getBlob(cur.getColumnIndex("bundle"));
final Parcel parcel = Parcel.obtain();
parcel.unmarshall(bundleBytes, 0, bundleBytes.length);
parcel.setDataPosition(0);
Bundle bundle = (Bundle) parcel.readBundle();
parcel.recycle();
```

You can get complete code from https://github.com/peo3/IntentSpooler/blob/master/src/jp/peo3/android/intentspooler/database/IntentDatabaseAdapter.java
Scalaで特殊なレイアウトをしたいとき

Scalaには典型的なレイアウトを実現するPanelが（JavaのLayoutをラップする形で）用意されている。
しかし、サイズが思いどおりに反映されなかったり、いたずらに変数が増えたりと、どうにも使いづらい。
正直なところ、自作したほうが簡単で思いどおりにでき、学習コストも低いと思う。
　
ScalaのPanelは、javax.swing.JPanelとjava.awt.LayoutManagerをラップしたものなので、JavaとScalaの同名クラスが入り乱れてたいへん分かりづらい。基本的には、scala.swing.Panelの側にしかScalaのクラスは存在しない。
参考にするのは、ScalaのBorderPanelおよびJavaのBorderLayoutのコードが最適だと思う。
BorderPanel: 
 https://lampsvn.epfl.ch/trac/scala/browser/scala/tags/R_2_9_1_final/src//swing/scala/swing/BorderPanel.scala
BorderLayout:
 http://www.docjar.com/html/api/java/awt/BorderLayout.java.html
これらを改造しつつScalaに移植すればよい。
以下のサイトは、それぞれのコードが何をしているかということを理解するのに役立つだろう。
http://www.ne.jp/asahi/hishidama/home/tech/scala/swing/Panel.html#MyLayout1

そのうち、作ったものをコメントつきで提示してみようと思う。
rubyのnextに引数与えるとnil返さずにすむのしらなんだ

```ruby:iterator_next.rb
a = [1,2,3,4,5,6,7,8,9,10]
a = a.map do |i|
  #next if i.even?
  next i if i.even?
  i*10
end
p a
#=>[10, nil, 30, nil, 50, nil, 70, nil, 90, nil]
#=>[10, 2, 30, 4, 50, 6, 70, 8, 90, 10]
```
ソースコードをWeb上で実行する方法

ソースコードをWeb上で実行できるサービスで[ideone](http://ideone.com/)というのがあります。
このサイトを使うと、実行環境がなくても50以上のプログラム言語のソースコードを実行することができます。

ideoneのAPIつかって、Qiita上で実行環境が用意されてたらなぁ…
var_dumpやprint_rより100倍見やすい関数

var_dumpやprint_rより100倍見やすい、tableを作成しました。
これで配列をテーブルに書き出すことができます。

```PHP:table_sample.php
<?php
function table($val){
	if(!$val) echo 'table error';
	if(is_array($val)){
		echo '<table border="1" cellspacing="0" bordercolor="#333333" >';
		_table($val);
		echo '</table>';
	}else{
		echo var_dump($val);
	}
}
function _table($val){
	echo '<tr align="left" valign="top">'.chr(10);
	echo ' <td align="left" valign="top" bgcolor="#33EE33">key</td>'.chr(10);
	echo ' <td align="left" valign="top" bgcolor="#33EE33">value</td>'.chr(10);
	echo '</tr>'.chr(10);
	foreach($val as $key => $_val){
		echo '<tr align="left" valign="top">'.chr(10);
		echo ' <td align="left" valign="top" bgcolor="#FFFFFF">'.$key.'</td>'.chr(10);
		echo ' <td align="left" valign="top" bgcolor="#FFFFFF">'.chr(10);
		if(is_array($_val))	table($_val);
		else echo $_val.'</td>'.chr(10).'</tr>'.chr(10);
	}
}
table(array('fruit'=>array('apple','banana','orange'),'human'=>array('alice','bob','chris')));
?>
```

結果
![画像](http://dl.dropbox.com/u/2896915/pict/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202012-02-11%2014.43.02.png)
よく使う関数群は、ライブラリとして用意してるとすごい便利です。
リンクのデフォルト動作を無効にして、JavaScriptを実行させる


リンクをクリックしたときの動作を無効にして、JavaScriptを実行させるためのいくつかの方法をまとめました。

**　**

##### href 属性に # を指定する。クリックするたびに画面の上に移動するから迷惑！

    <a href="#" onclick="myMethod()">Click Me</a>

**　**

##### href でデフォルト動作を無効にして、onclick属性を追加

    <a href="javascript:void(0)" onclick="myMethod()">Click Me</a>

**　**

##### href 属性に全部書く。

    <a href="javascript:myMethod();void(0)">Click Me</a>

**　**

##### デフォルトのイベントを無効にする。JavaScriptが無効な場合、リンクが動作するのがメリット。
##### Event.preventDefault() を使うとデフォルトの動作をキャンセルできる

    <a href="http://www.google.com/">Click Me</a>
    $('a').on('click', function(e){
        e.preventDefault()
        console.log(this);
    });
ターミナルで256色表示できているか確認する関数

256色表示できているか確認する zsh の関数。

```sh
function 256colortest() {
    local code
    for code in {0..255}; do
        echo -e "\e[38;05;${code}m $code: Test"
    done
}
```
ちゃんと256色環境になっていたらきれいに色が出る。
perl... #perlはじめました

```sh:sample.sh
/Users/massat% perl -MData::Dumper -e 'my @array = [1,2,3]; warn Dumper @array; foreach (@array) { warn Dumper $_ };' 
$VAR1 = [
          1,
          2,
          3
        ];
$VAR1 = [
          1,
          2,
          3
        ];
```

なんで同じDump結果になるの。鬼なの。
template for getting a field name of class or struct

Here!

```d
import std.conv : text;
import std.traits : Unqual;

/**
 * Get a field name of class or struct.
 */
template getFieldName(Type, size_t i)
{
    static assert((is(Unqual!Type == class) || is(Unqual!Type == struct)), "Type must be class or struct: type = " ~ Type.stringof);
    static assert(i < Type.tupleof.length, text(Type.stringof, " has ", Type.tupleof.length, " attributes: given index = ", i));

    // 3 means () + .
    enum getFieldName = Type.tupleof[i].stringof[3 + Type.stringof.length..$];
}
```
みなさんはどのようにしてPerlを学びましたか

リャマ本をすり切れるほど読み返した
仕事で使わざるを得なくなっていつの間にか覚えてた
Plackを写経していたら悟りに入った
などなど。

みなさんの体験談を聞いてみたいです。
上限、下限を一行で書くテクニック

よくゲームとかでは、自機の移動に0〜640までの制限などをつけることがあります。
昔はよくこういうコードを書いていました。

```PHP:上限下限をつける
if(jiki.x < 0) jiki.x = 0;
if(jiki.x > 640) jiki.x = 640;
```

こう書くことで、0以下や640以上になることはありません。
しかし、これは1行で綺麗に書くことができます。

```PHP:上限下限をつける
jiki.x = max(min(jiki.x,640),0);
```
楽しいjQueryの練習方法

jQueryは至るサイトで利用されています。
jQueryが埋めこまれているWebページでは、JavaScriptコンソールで、jQueryのスクリプトを入力することができます。

いろんなサイトで、「◯◯するにはどうすればいいだろう？」とかコマンドを考えて、実験すると結構楽しいです。
リロードすると元に戻るので、簡単にやり直しができます。


```
$('a.stock-button').click()
```


実際にコンソール画面を開いて、上記のスクリプトを実行してみよう。
一覧画面では、実行しないほうがいいですｗ
Gitで間違えてaddしてしかもcommitしてしまったファイルを取り消す

例えば2つ前のコミットに対して行う場合。

```
> git rebase -i HEAD~2
> git reset HEAD~2 -- path/to/file
> git commit --amend
> git stash save
> git rebase --continue
> git stash pop
```

Gitは使い始めて1年以上経つがいまいち使いこなせている感じがしない。