OmniAICreator/Qiita-1.07M huggingface dataset:
GWT-BootstrapのHello World


##GWTって？
- google web toolkit
- http://www.gwtproject.org/

##Bootstrapって？
- twitter bootstrap
- http://getbootstrap.com/

###これを統合したフレームワークが開発され中
- https://github.com/gwtbootstrap/gwt-bootstrap

なのでHello worldしました。

##GWT
http://www.gwtproject.org/download.html
からダウンロードしてパスを通しましょう。

##GWTプロジェクト作成
IDEの力に頼るのが楽ですが、大体以下のようなディレクトリ構成になっています。

```
{$appRoot}/
  {$appName}.gwt.xml
  client/
    {appName}.java
  server/
```
またweb.xmlなども適宜設定が必要なので、面倒な人はぜひIDEを使いましょう。

##GWT-bootstrap
```
<dependency>
    <groupId>com.github.gwtbootstrap</groupId>
    <artifactId>gwt-bootstrap</artifactId>
    <version>2.2.1.0</version>
</dependency>
```
maven使っている人はpom.xmlに上記を追加しましょう。
使ってない人はjarにパス通したりしましょう。

これで前準備は終わりです。

##gwt.xmlを編集
{$appName}.gwt.xmlに、gwt-bootstrap用クラスを追加します。

```
<inherits name="com.github.gwtbootstrap.Bootstrap"/>
```

##テスト用クラスとxmlを追加

```Test.java
public class Test extends Composite{

    interface TestUiBinder extends UiBinder<Widget, Composite> {}
    private static TestUiBinder uiBinder = GWT.create(TestUiBinder.class);

    public Test(){
        initWidget(uiBinder.createAndBindUi(this));
    }
}
```

``` Test.ui.xml
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
             xmlns:gwt='urn:import:com.google.gwt.user.client.ui'
             xmlns:b="urn:import:com.github.gwtbootstrap.client.ui">
    <gwt:HTMLPanel>
        <div>
            <b:Heading size="1">Hello</b:Heading>
        </div>
    </gwt:HTMLPanel>
</ui:UiBinder>
```
これらを同じパッケージに置きます。
デフォルトであれば、上記構成のclientパッケージです。
よしなに配置しましょう。

##EntryPointから呼び出す
EntryPointに指定されたクラス(デフォルトであれば{$appName}.java)のonModuleLoad()から呼び出してみましょう。

```
    public void onModuleLoad() {
        RootPanel.get().add(new Test());
    }
```

これで終わりです。
動かしてみましょう。

![kobito.1381040624.172459.png](https://qiita-image-store.s3.amazonaws.com/0/29484/e163ce50-3961-f949-978f-b01ac78a0f96.png "kobito.1381040624.172459.png")

どこかで見たような文字が表示されたら成功です。
Windows 環境で rakefile が "cannot load such file" と言われる

タイトルの通り、Windows 環境で rakefile が見つからずにタスクが実行できない。
でも -f オプションで明示的にファイルを指定すると実行できる… ということで
ググってみたけど『これ！』というのが無い。

もしかして… と Rakefile の置いてあるフォルダのパスを見たら

> c:\Users\xxxx\...\日本語\こんな かんじ\Rakefile

となっていたので、これを

> c:\Users\xxxx\....\English\LikeThis\Rakefile

にしたら、問題なく実行できました。これで数時間、悩んだ orz。
ビルドからTestflight配信までやるコマンド作った


毎度のことなんだけども、testflightに配信しようとすると

* Xcodeでアーカイブして
* Organizerからipaファイル吐かせて
* testflightにアップして
* リリースノート書いて
* いつものメンバーに配信する

みたいなフローが必要だったので、面倒になってスクリプトにまとめてしまった。

## やってること

流れとしては、

* アーカイブする
* ipaファイル作る
* リリースノート書く
* testflightのUpload APIに配信する

と言った感じ。

ちなみに大抵Cocoapods使ってるのでxcworkspaceのある環境が対象です。そうでない人は適当にxcodebuild部分だけ書き換えてください。

```sh:testflight
#!/bin/sh

# applicationの名前
APP="hoge"
# SDK
SDK="iphoneos7.0"
# ビルド時の設定
CONFIGURATION="Release"
# 出力先
OUT_DIR="build"
# ワークスペース名
WORKSPACE="hoge.xcworkspace"
# ワークスペース内のビルド対象スキーム
TARGET="hoge"
# PROVISIONING FILE
PROVISIONING="*****-****-****-****-****"

# TESTFLIGHTのAPIトークン
TESTFLIGHT_API_TOKEN="your api token"
# TESTFLIGHTのAPIトークン
TESTFLIGHT_TEAM_TOKEN="your team token"
# TESTFLIGHTの配布対象チーム
TESTFLIGHT_TEAM="Your distribution team"

# ビルドする
if [ -a build ]; then
    echo "Remove existing build dir."
    rm -R build
fi

# ビルド
xcodebuild -workspace "${WORKSPACE}" -sdk "${SDK}" -configuration "${BUILD_SCHEME}" -scheme "${TARGET}" clean build CONFIGURATION_BUILD_DIR="$(PWD)/${OUT_DIR}" PROVISIONING_PROFILE="${PROVISIONING}"

# IPAファイル化
xcrun -sdk "${SDK}" PackageApplication "${OUT_DIR}/${APP}.app" -o "$(PWD)/${OUT_DIR}/${APP}.ipa" --embed "${PROVISIONING}.mobileprovision"

# リリースノート作成
vi "${OUT_DIR}/release.txt"

# 存在しない場合はとりあえず空ファイル用意しておく
if [ ! -f "${OUT_DIR}/release.txt" ]; then
    touch "${OUT_DIR}/release.txt"
fi

# テストフライトへ送信
curl http://testflightapp.com/api/builds.json \
    -F file="@${OUT_DIR}/${APP}.ipa" \
    -F api_token="${TESTFLIGHT_API_TOKEN}" \
    -F team_token="${TESTFLIGHT_TEAM_TOKEN}" \
    -F notes="@${OUT_DIR}/release.txt" \
    -F notify=True \
    -F distribution_lists="${TESTFLIGHT_TEAM}"

```
これを作業ディレクトリにtestflightって名前などで配置して`chmod a+x testflight`して`./testflight`すれば、アーカイブ始まって、完了後にviが起動するのでリリースノート書いて保存すればtestflightで配信されます。

便利。

----
### 追記
`build/`ディレクトリは多分デフォルトで.gitignoreに記載されてると思いますが、無い場合は追記、もしくはOUT_DIRで別なディレクトリを指定してください。
引数付きメソッドのありなしチェック



プロトコルであるメソッドがあるかどうか

[delegate mmm:ppp1 bbb:ppp2];

```
if ([delegate respondsToSelector:@selector(mmm:bbb:)]) {
        [delegate mmm:ppp1 bbb:ppp2];
}
```

とすれば良い。

```
@protocol aaaDelegate
-(void)getaaa:(id)sender;
@end

-(void)getaaa:(id)sender {
NSMutableDictionary *bbb=(NSMutableDictionary*)sender;
```

とすれば良いのかorz
AWS EC2 Amazon Linux + ApacheでBasic認証

EC2でテスト環境とかまだ公開したくないアプリケーションを作成した時に、簡単な認証をかけたくなることがよくある。
ってことで *AWS EC2 Amazon Linux + Apache* 環境でBasic認証のかけ方

##認証ユーザの作成、追加
認証に使用したいユーザのログイン名とパスワードを.htpasswdファイルに設定する

```
htpasswd -c -b /etc/httpd/conf/.htpasswd user1 password
```

##Basic認証を有効にする
最終行にBasic認証の設定を追加する

```
vi /etc/httpd/conf/httpd.conf
```

> \<Directory "/var/www/html/">
>       AuthUserFile /etc/httpd/conf/.htpasswd
>       AuthGroupFile /dev/null
>       AuthName "Basic Auth"
>       AuthType Basic
>       Require valid-user
> \</Directory>

Apacheの再起動をして設定完了

```
/etc/init.d/httpd restart
```
Sublime Text 3初期導入

##挨拶
Mac Book Airが完全に使い物にならなくなったので、
Mac Book Pro Retinaに乗り換えると、同時に環境を構築し直さないといけなくなったので、
どうせなら、この記事として残しておこうと思った次第です。
もちろん、この記事はMacでの設定なので他OSユーザーの方は参考程度にしかならないかもです。
ご了承ください。

##設定
まず、Sublime Text3をダウンロードし、インストールします。
http://www.sublimetext.com/3

起動しましたら、
大抵、最初にやることはPackage Controlを導入することです。
https://sublime.wbond.net/installation#Manual_Instructions 

こちらのSublime Text3の方をコピーして、Sublime Textに戻り、ターミナル(View->Show Console)を開き実行します。
(2013/10/03 時点)
```import urllib.request,os; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); open(os.path.join(ipp, pf), 'wb').write(urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ','%20')).read())
```
インストールが終わるとcmd+shift+PでCommand Palletを表示し、package controlが入っていたら成功。
これでパッケージをインストールする準備は出来ました。

##日本語化
開発環境を日本語化する・しないは分かれますよね。
僕は英語がとても弱いのでほぼ日本語化してます。

ここで日本語化パッケージである、Japanizeをインストールします。
cmd+shift+PでCommand Palletを表示し、install packageを選択。
パッケージリストが出てくるので、japanizeと検索してjapanizeをインストール。
read.meに従って日本語化します。
2013/10/03時点ではWindows向けにread.meが書かれていましたので、Macの場合ですと、
```\Users\ユーザー名\AppData\Roaming\Sublime Text 3\Packages\Japanize```
が、
```/Users/ユーザー名/Library/Application Support/Sublime Text 3/Packages/Japanize```
となります。

##プラグイン
ここからはどうカスタマイズするか自由ですが、個人的におすすめのプラグインを紹介していきます。
command + shift + Pでパッケージコントロールが開くので、そこで様々なプラグインをいれていきます。

###SFTP
これで保存した時にrsyncと同様の動きが出来ます。
・丸ごとダウンロード・アップロード
・ファイルを保存した瞬間に自動アップロード機能
・ファイルを選んだ瞬間に自動ダウンロード機能
ランダムに出る購入販促アラートが出ますが、僕はあまり気にならないかも。
もし気になる場合は、16ドルで正規版になるので、気に入ったらご購入してみるといいかもです。

###PHPcs
PHPの補完機能。
PHPを使うのならばいれておいて損はないと思う。

###SublimeCodeIntel
関数定義元にジャンプすることが出来る。
CTags?のが主流らしいが、特に理由なくこっちを利用しています。（あやふやですみません笑）
Control + クリックで定義元に飛びます

###BracketHighlighter
divとか{}とかの組み合わせを色付けして強調してくれます。
割と便利です。

###SubLimeLinter
コードのエラーチェック・コード規約などを指摘してくれる。
設定がややめんどくさいが、あるとないとじゃ完成した後のコードの奇麗さが段違い。

##終わり
これで最低限の設定は出来ました。
Japanizeのパッケージの様に、様々な便利なパッケージがあり、日々増え続けています。
SFTPやら、JSLintやら本当に便利なパッケージがたくさんです。
僕はSublime Textを使い、Node.jsとPHPのコーディングをしています。
その上で便利だったパッケージ等、次回ご紹介したいと思います。

わからない所、またこう説明したほうがいいんじゃない？という箇所がございましたらご指摘等下さい。
ありがとうございました。
[GroovyとProcessing]画像を表示する

読み込んだ画像をそのまま表示する方法と3Dのオブジェクトにテクスチャとして貼り付ける方法の2通りやってみた

動画リスト：[LWJGLのチュートリアル](http://www.youtube.com/playlist?list=PL19F2453814E0E315)
動画は[ココ](http://www.youtube.com/watch?v=naE3nbreSUo)

```groovy:DisplayTest.groovy
package episode005

import groovy.swing.SwingBuilder
import processing.core.PApplet

import javax.swing.*

class DisplayTest extends PApplet {

    def void setup() {
        size(640, 480, P3D)
        frameRate(60)
    }

    def void draw() {
        background(0, 0, 0)

        def img = loadImage('wood.png')
        image(img, 400, 300)

        beginShape()
        texture(img)
        vertex(15, 15, 0, 0)
        vertex(65, 15, 50, 0)
        vertex(65, 65, 50, 50)
        vertex(15, 65, 0, 50)
        endShape()
    }

    def static void main(args) {
        def display = new DisplayTest()
        new SwingBuilder().frame(
                title: 'Episode 3',
                defaultCloseOperation: JFrame.EXIT_ON_CLOSE,
                size: [640, 480], show: true) {
            widget(display)
        }
        display.init()
    }
}
```

![grocessingGL005.png](https://qiita-image-store.s3.amazonaws.com/0/17179/866ac44b-2428-ada4-d3b7-9e0afeec02b0.png)
AWS EC2を使って5分で仮想サーバ+Webサーバ構築

##必要なもの

* [AWSアカウント](http://aws.amazon.com/jp/register-flow/)

##EC2のインスタンス作成

1. [AWSマネジメントコンソール](https://console.aws.amazon.com/)へアクセス

1. サービスの中からEC2をクリック
1. Launch Instanceをクリック
1. Classic Wizardを選択してContinueをクリック
1. Amazon Linux AMIを選択(構築する仮想サーバーのディストリビューションのOS)
1. インスタンスの数やタイプ、その他詳細設定、ストレージデバイスなどの設定は全てデフォルト設定のままContinueをクリック
1. インスタンスにタグ付けできます。ここでは「Name」というキーに任意のわかりやすい値を設定
![EC2 Management Console.png](https://qiita-image-store.s3.amazonaws.com/0/28298/db6531ef-82f2-46e3-c469-eb916889ab24.png)
1. EC2で作成する仮想サーバーへは公開鍵認証で接続する際に必要となる秘密鍵をここで作成
名前を入力しCreate & Download your Key Pairのリンクをクリックすると秘密鍵がダウンロードされる

1. セキュリティグループ（ファイアウォール）を設定
1. ウェブサーバーを作成するので、上記の手順でHTTP（Port 80）を追加
![EC2 Management Console(1).png](https://qiita-image-store.s3.amazonaws.com/0/28298/a03dec4e-c84c-d256-4bd7-bb4d58df34ea.png)
右のテーブルに「80(HTTP)」が追加されたのを確認しContinueをクリック
1. 確認画面で設定値を確認しLaunchをクリック
1. Closeをクリックするとインスタンス管理画面へ遷移
作成したインスタンスのStateが「running」、Status Checksが「2/2 checks passed」になれば仮想サーバーの作成成功。また、同時にインスタンスのURLも確認できる。
![image07.png](https://qiita-image-store.s3.amazonaws.com/0/28298/68821b1a-5c73-812e-bca5-43100fe57444.png)

##仮想サーバーに接続

作成した仮想サーバーにターミナルからログイン

1. ターミナルに鍵を登録
ここはソフトによって微妙に方法が違うので、詳しくは使用するターミナルソフトの設定方法を確認

1. ターミナルからインスタンスのURLへアクセス

1. ec2-userでログイン
パスワードは秘密鍵を作成した時に入力したもの

##Apacheインストール

仮想サーバーにApacheをインストールしウェブサーバーを構築

1. インストール&起動

```
$ sudo yum -y install httpd
$ sudo service httpd start
```

ブラウザからURLにアクセスし、Apache初期画面が表示されればのウェブサーバー完成！
![Test Page for the Apache HTTP Server on Amazon Linux AMI(1).png](https://qiita-image-store.s3.amazonaws.com/0/28298/cf899fe5-8e50-fa0a-e6a1-3825239a04d0.png)


###参考
[わずか5分!? AWSのEC2でクラウドなウェブサーバーを構築してみた](http://liginc.co.jp/web/programming/server/39969)
Visual StudioのフォントはConsolasにしようよ

MSゴシックなんか使うのやめよう。
あんな細っこいフォントでコーディングしてたら目が悪くなるよ。

Consolasを使おう。
（日本語には対応していないけどVSがMSゴシックに変換してくれる。）
メイリオは綺麗だけど、駄目なんだ。
プロポーショナルフォントだから同僚のVSで見た時にコードのレイアウトが崩れるんだ。
部分文字列を削除する

pythonでreを使って取得した部分文字列を元の文字列から削除する方法を検討したのでメモ代わりに。

ぱっと思いついたのは以下2つ
1.部分文字列の位置情報をもとに元の文字列を切ってつなぎ合わせる。
2.部分文字列をリプレイスする。

timeitを使って数パターンテストした感じだと1のほうが早そうなのでこちらを採用。

テストに使用したコードは以下の通り。

```py
import timeit
import re


test_str = '...なんか文字列...'
pat = re.compile('...なんか正規表現...')
match = pat.search(test_str)


def _remove_str1(base_str, target):
    """ match_objectのデータを元にbase_strを切断してつなぎ直す """
    start = target.start()
    end = target.end()
    return base_str[:start] + base_str[end:]


def _remove_str2(base_str, target):
    """ match_objectのデータを元に
    base_strの該当個所を空文字列にリプレイス """
    return base_str.replace(target.group(), '') 


def run1():
    _remove_str1(test_str, match)


def run2():
    _remove_str2(test_str, match)


if __name__ == '__main__':
    t = timeit.Timer('run1()',
            'from %s import run1' % __name__)
    print t.timeit()

    t2 = timeit.Timer('run2()',
            'from %s import run2' % __name__)
    print t2.timeit()
```
「第14回オフラインリアルタイムどう書く」 を Haskell で

問題は http://nabetani.sakura.ne.jp/hena/ord14linedung/

```off_line14.hs
import Data.List


type Weapon  = Char
type Monster = Char

dataBase :: [(Weapon, (Monster, Weapon))]
dataBase = [('a', ('B', 'c')),
            ('c', ('D', 'e')),
            ('e', ('F', 'g')),
            ('g', ('H', 'i')),
            ('i', ('J', 'k')),
            ('k', ('L', 'a'))]

takeData :: String -> ([Weapon], [(Monster, Int)])
takeData cs = (nub ws, [(head m, length m) | m <- group ms])
  where (ms, ws) = span (< 'a') $ sort cs

attakMonster :: [Weapon] -> [(Monster, Int)] -> Int -> Int
attakMonster [] _ c = c
attakMonster _ [] c = c
attakMonster (w : ws) ms c
  | null mb   = attakMonster ws ms c
  | otherwise = attakMonster (w1 : ws) (ma ++ (tail mb)) (c + (snd . head) mb)
  where
    Just (m1, w1) = lookup w dataBase
    (ma, mb) = break ((== m1).fst) ms

solve :: String -> String
solve cs = show $ attakMonster ws ms 0
  where (ws, ms) = takeData cs



----------------------------------------------------------------
-- test
----------------------------------------------------------------

test :: [(Int, Bool)]
test = zip [0 ..] $ map (\ (a, b) -> solve a == b) testData

testData :: [(String, String)]
testData = [
  ( "gLDLBgBgHDaD", "6" ),
  ( "DBcDLaLgDBH", "6" ),
  ( "JJca", "0" ),
  ( "FJDLBH", "0" ),
  ( "HJBLFDg", "6" ),
  ( "HBaDLFJ", "6" ),
  ( "DJaHLB", "2" ),
  ( "gDLHJF", "3" ),
  ( "cJFgLHD", "5" ),
  ( "FFBJaJJ", "1" ),
  ( "FJeJFBJ", "2" ),
  ( "iJFFJJB", "3" ),
  ( "JBJiLFJF", "5" ),
  ( "JDiFLFBJJ", "8" ),
  ( "BDFDFFDFFLLFFJFDBFDFFFFDDFaDBFFB", "28" ),
  ( "DDFBFcBDFFFFFFLBFDFFBFLFDFDJDFDF", "24" ),
  ( "FDLBFDDBFFFeFFFFFDFBLDDFDDFBFFJF", "16" ),
  ( "FDBFFLFDFFDBBDFFBJDLFgDFFFDFFDFF", "0" ),
  ( "FDiFLDFFFFBDDJDDBFBFDFFFBFFDFLFF", "31" ),
  ( "FDFDJBLBLBFFDDFFFDFFFFFDDFBkFDFF", "30" ),
  ( "HBkFFFFHBLH", "3" ),
  ( "FBHHFFFHLaB", "2" ),
  ( "LFHFBBcHFHF", "0" ),
  ( "LFBHFFeFHBH", "7" ),
  ( "LgFHHHBFBFF", "3" ),
  ( "FFiFHBHLBFH", "0" ),
  ( "BFHHFFHBeFLk", "10" ),
  ( "FHFaBBHFHLFg", "5" ),
  ( "FFgacaFg", "0" ),
  ( "JHDaDcBJiiHccBHDBDH", "9" ),
  ( "FHJJLckFckFJHDFF", "12" ),
  ( "DeDHJHDFHJBLHDLLDHJLBDD", "22" ),
  ( "gJLLLJgJgJLJL", "0" ),
  ( "DaaaDDD", "0" ),
  ( "HFeJFHiBiiBJeJBBFFB", "9" ),
  ( "FJFFJDBHBHaLJBHJHDLHkLLLFFFgJgHJLHkJkB", "32" ),
  ( "giFLBiBJLLJgHBFJigJJJBLHFLDLL", "23" ),
  ( "cgkLJcLJJJJgJc", "2" ),
  ( "LDFHJHcFBDBLJBLFLcFJcDFBL", "22" ),
  ( "JJHHHkHJkHLJk", "1" ),
  ( "kHHBBaBgHagHgaHBBB", "11" ),
  ( "HDBFFDHHHDFLDcHHLFDcJD", "20" ),
  ( "HFFFHeFFee", "7" ),
  ( "gLLDHgDLgFL", "1" ),
  ( "JJJBBaBBHBBHaLBHJ", "7" ),
  ( "FBFBgJBDBDgF", "0" ),
  ( "LLLLakakLakLL", "7" ),
  ( "HeJHeJe", "0" ),
  ( "LDFLBLLeBLDBBFFBLFBB", "4" )]
PFQueryTableViewControllerで最下部までスクロールした場合に「続きを読む」処理をする

PFQueryTableViewControllerで最下部までスクロールすると
「Load More...」というセルができて、それをタップすると
「続きを読む」処理が実行される。
どうせなら自動で続きを読み込んで欲しいので
最下部までスクロールした場合に続きのコンテンツを読み込む処理を行う。

```objc
- (PFTableViewCell *)tableView:(UITableView *)tableView cellForNextPageAtIndexPath:(NSIndexPath *)indexPath;
{
    [self loadNextPage];
    static NSString *cellIdentifier = @"Cell";
    PFTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (!cell) {
        cell = [[PFTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
                                      reuseIdentifier:cellIdentifier];
    }
    return cell;
}
```
serverspec が叩いているコマンドを調べる

サーバーのテストが簡単に書ける [serverspec](http://serverspec.org/) が最近話題です

serverspec はコマンドの出力結果をパースしているので，実際にどのようなコマンドを叩いているのか意識していると書きやすいと思います

実際にどんなコマンドを叩くのか知りたい場合は [serverspec/lib/serverspec/commands](https://github.com/serverspec/serverspec/tree/master/lib/serverspec/commands) 以下を見ると分かります

環境非依存は `base.rb` で環境依存は別ファイルに書かれています
シェルで今日の天気予報表示

* livedoor天気予報が提供する[Weather Hacks](http://weather.livedoor.com/weather_hacks/)のAPIを利用する。
* 結果はJSONで返ってくるので`jq`コマンドに渡す。`jq`は`brew intall jq`などしてインストール

```
$ curl -s http://weather.livedoor.com/forecast/webservice/json/v1\?city\=XXXXXX | jq -r '.forecasts[] | select(.dateLabel == "今日").telop'
```

`XXXXXX`に地域IDを入力。地域IDは[ここ](
http://weather.livedoor.com/forecast/rss/primary_area.xml)から確認できる。

大阪（地域ID:270000）の天気予報を表示してみる

>
$ curl -s http://weather.livedoor.com/forecast/webservice/json/v1\?city\=270000 | jq -r '.forecasts[] | select(.dateLabel == "今日").telop'
曇り

[API仕様](http://weather.livedoor.com/weather_hacks/webservice)を見ると、もちろん今日の天気以外にも取得できるので、色々と応用できそう。
Gnu ScreenとTMUXのキーバインド比較

TMUXならGnu Screenと違って絵文字を表示可能に気づいたので、Screenから移行するべくキーバインド一覧の使ってたキーの比較表を作った。
Prefixは省略、ウィンドウ＆ペインの用語はTMUX方式に統一、です。


|Command     |  Gnu Screen | TMUX |
|:----------------|------------------|---------|
|キーバインド一覧を表示 |^? | ^?|
|ウィンドウ作成|^c|^c|
|次のウィンドウ|^n|^n|
|前のウィンドウ|^p|^p|
|ウィンドウの破棄|^k|^&|
|ペインの分割|^S|^"(縦)  ^%(横)|
|次のペイン|^o|^Tab|
|ペインの破棄|^x|^x|
|コピーモードへ|^[|^[|
|ペースト|^]|^]|
|タイトル変更|A|,|


TMUX使いやすい。
![スクリーンショット 2013-10-05 21.26.33.png](https://qiita-image-store.s3.amazonaws.com/0/29365/d59abda2-8594-2fe5-4679-97e213e55f2a.png)
Rails 4.0 の ActiveRecord::Relation のバグっぽい挙動？

以下のような2つのscopeがあるActiveRecordのクラスがあるとする。

````
class Clip < ActiveRecord::Base 
  scope :display, -> { order("clips.updated_at DESC") }
  scope :undone, -> { where.not(status: 8) }
end
````

[7]の実行結果が理解できない。直すかバグ報告したい。Edgeでは確認していない。

````
[4] pry(main)> Clip.display # display scope 単独
  Clip Load (0.3ms)  SELECT "clips".* FROM "clips" ORDER BY clips.updated_at DESC
=> []
[5] pry(main)> Clip.undone# undone scope 単独
  Clip Load (0.3ms)  SELECT "clips".* FROM "clips" WHERE ("clips"."status" != 8)
=> []
[6] pry(main)> Clip.display.undone # display -> undone の順で呼び出す
  Clip Load (0.3ms)  SELECT "clips".* FROM "clips" WHERE ("clips"."status" != 8) ORDER BY clips.updated_at DESC
=> []
[7] pry(main)> Clip.undone.display # undone -> display の順序で呼び出すとnilになる。
#<ActiveRecord::Relation::ActiveRecord_Relation_Clip:0x007f80620108d0>=> nil
````
Jadの簡単な使い方メモ

こんな感じで使えるらしい。

```bat:jad001.bat
jad -s HelloWorld.class
```

```bat:jad002.bat
jad -s java -d src -r classes\**\*.class
```

「-s」は、出力ファイルの拡張子を指定します。
「-d」は、出力ディレクトリを指定します。
「-r」は、処理対象のクラスファイルを指定します。

ダウンロードサイト

- [JAD Java Decompiler Download Mirror](http://www.varaneckas.com/jad)

# 参考

- [Jad(Javaの逆コンパイラ)で僕にもソースが見えるの巻 - tanamonの日記](http://d.hatena.ne.jp/tanamon/20090613/1244907632)
iOS7でのデバイストークン発行ルール変更対応


##概要

iOS7より、これまでデバイスユニークだったデバイストークンが流動的に。
参考）
http://blog.katty.in/4162

つまり、
・アプリごとに変化する
・同一アプリでもOSアップデートのタイミングで更新される

##想定される問題
デバイストークンとユーザの紐付けをログインのタイミングで実施していたりすると、紐付けが切れてしまうタイミングが発生する。

その際はユーザがOSアップデートした場合は再度ログインしなおす必要があるが、それをユーザに期待するのは難しい。

##対策

デバイストークンが変化したタイミングでそれを判定し、最新のものを紐付け直す実装を追加する。
便利なgitエイリアス


.bash_rcか.bash_profileに以下設定。

```alias_sample
alias gck="git checkout"
alias gst="git status"
alias gcm="git commit -m"
alias gdi="git diff"
alias gbr="git branch"
alias gad="git add"
alias gmg="git merge"
alias gps="git push"
alias gpl="git pull"
```
クリックジャッキング対策


##概要
iframeにて攻撃対象ページを透過で呼び出すことで、
ユーザの意図しない行動を誘導する。

##対策
X-Frame-Options HTTPレスポンスヘッダをDENYに設定することで、iframeでの呼び出しを拒否することが可能。

apacheのconfに以下を設定する。

```
Header always append X-Frame-Options DENY
```


なお、本対策を取ってもネイティブアプリのwebviewからの
呼び出しに影響はない。

##参考
http://www.websec-room.com/2013/02/20/98
http://buzzwordjp.blogspot.jp/2011/09/iframe-x-frame-options-http.html
n番目に文字列が現れる場所を探す

**【2021/10/15 追記】**
**この記事は更新が停止されています。現在では筆者の思想が変化している面もありますので，過去の記事として参考程度にご覧ください。**

番目指定は

**0番目、1番目、2番目、…**

というように<ins>0以上の整数</ins>とします。
想定しない値の例外処理はしていません。

# `strpos()`　を使う

 [strpos()](http://php.net/manual/ja/function.strpos.php) の第3引数 **_`$offset`_** なんて滅多に出番ないと思ってたけど、こういう使い方ができるとは・・・

```php
function strpos_n($str, $needle, $n = 0) {
    $offset = 0;
    $len = strlen($needle);
    while ($n-- >= 0 && ($pos = strpos($str, $needle, $offset)) !== false) {
        $offset = $pos + $len;
    }
    return $pos;
}
```

```php
var_dump(strpos_n('He has a pencil that has a eraser on the top.', 'has', 1)); // int(21)
```

そのまま置換をしたい場合は [substr_replace()](http://php.net/manual/ja/function.substr-replace.php) に結果を渡してください。

#### マルチバイト対応版

バイトオフセットの代わりに文字オフセットで返します。

```php
function mb_strpos_n($str, $needle, $n = 0, $encoding = null) {
    if (func_num_args() < 4) {
        $encoding = mb_internal_encoding();
    }
    $offset = 0;
    $len = mb_strlen($needle, $encoding);
    while ($n-- >= 0 && ($pos = mb_strpos($str, $needle, $offset, $encoding)) !== false) {
        $offset = $pos + $len;
    }
    return $pos;
}
```

# `preg_match_all()` を使う

[preg_match_all()](http://php.net/manual/ja/function.preg-match-all.php) のオプション **`PREG_OFFSET_CAPTURE`** を利用した手法です。
回数が増えてきたりするとこちらの方が速いと思われます。

```php
function strpos_n($str, $needle, $n = 0) {
    $pattern = '/' . preg_quote($needle, '/') . '/';
    return
        preg_match_all($pattern, $str, $matches, PREG_OFFSET_CAPTURE) > $n ?
        $matches[0][$n][1] :
        false
    ;
}
```

こちらはマルチバイトに対応できません。
クラスの落とし穴1 - プロパティの初期化


* クラスの落とし穴1 - プロパティの初期化 (この投稿)
* [クラスの落とし穴2 - メソッドとクロージャ](http://qiita.com/cocottejs/items/0c1756ac7e7ec8bae7cb)
* [クラスの落とし穴3 - 継承](http://qiita.com/cocottejs/items/e75f751c7aa8a7361aab)
* [クラスの落とし穴4 - プライベート変数の実装](http://qiita.com/cocottejs/items/35e0edef71d8c0fc3348)


# はじめに

javascriptでもクラスを作成する事が多くなってきました。
しかし、「javascriptにはクラスがない」とよく言われ、実装側が擬似的にクラスを定義しています。
クライアントサイドで大規模開発が増えてきたため、オブジェクト指向の概念で実装したいと思っているのでしょう。

javascriptでは安易な疑似クラスの作成によって見事落とし穴にはまる事があります。
ここでは、本来javascriptにはないクラスをうまく実装する方法を順に追って説明します。

"落とし穴とは、 **うまく動いているけど気がついていないだけで実はマズい実装の事** とします


## 簡単なクラスの実装

クラスの定義には幾つかの方法がありますが、多数派であるプロトタイプを使用を採用します。

```javascript:
// クラスを定義
function Klass () {};

// プロパティ
Klass.prototype.name = 'foo';

// メソッド
Klass.prototype.setName = function setName (value) {
  this.name = value;
};
```

使用するには以下のようにします。

```javascript:
var instance = new Klass();
instance.setName('bar');
console.log(instance.name);
```

基本的にはこの様な記述でクラスのようなものが出来ました。
動作もうまく行っているようです。

## 間違った実装

次の例は先ほどとほとんど同じようなコードに見えて、クラスの機能としては確実に間違っているところがあります。
それがどのような理由かすぐにわかるでしょうか？

```javascript:
// クラスを定義
function Klass () {};

// プロパティ
Klass.prototype.hobbies = [];

// メソッド
Klass.prototype.addHobby = function addHobby (value) {
	this.hobbies.push(value);
};
```

最初の例と変わらないように見えますので、うまく動作しそうです。
実際に使用してみても問題はないように見えます。

```javascript:
var instance = new Klass();
instance.addHobby('guitar');
console.log(instance.hobbies);  // ['guitar']
```

しかし、次のコードを動作させるとよくわかります。

```javascript:
var inst1 = new Klass();
inst1.addHobby('guitar');
console.log(inst1.hobbies);  // ['guitar']

var inst2 = new Klass();
inst2.addHobby('jogging');
console.log(inst2.hobbies);  // ['guitar', 'jogging']
```

`inst2`の`hobbies`には、`jogging`だけではなく`guitar`も追加されています。
じつは、prototypeに追加されたプロパティは`new`で作成されたオブジェクトから参照する事ができるだけでなく、どの(OOでいう)インスタンスからも変更できます。
そのため、 **`inst1`と`inst2`が参照している`hobbies`は同じ実体です。**

これはプロトタイプチェーンによる参照による正常な動作です。
理解すると「なんだ単純なミスだ」と思うかもしれません。

しかし、この不具合の厄介なところは、 **一つのインスタンスを作成しテストしただけでは全く間違いに気がつかない事**です。
では最初のクラス定義はなぜうまく行ったのでしょうか？
それは、文字列は参照しているプロパティを変更したのはなく、 **新たに値を設定した事** により参照がnewで作成されたオブジェクトのプロパティとして上書きされたため、たまたまうまく動作したにすぎません。
代入と`array.push`にプロトタイプチェーンでの参照時に大きな違いがあることがポイントです。

この事は、`console.log(inst1)`でオブジェクトを出力するとよくわかります。
最初の`setName`を実行したインスタンスは`{name: 'bar'}`と出力され、`addHobby`を実行したインスタンスは`{}`と出力されます。`hobbies`プロパティが存在しません。

## 正しい実装方法は?

クラスを定義するのに定石となる実装方法はあるのでしょうか？
おそらく一番簡単な方法はコンストラクタで、すべてのプロパティに初期値を設定する事です。
最初の例と２番目の例のプロパティ・メソッドを一緒に定義して書き直すと次のようになります。

```javascript:
// クラスを定義
function Klass () {
  // プロパティ
  this.name = 'foo';
  this.hobbies = [];
};

// メソッド
Klass.prototype.setName = function setName (value) {
  this.name = value;
};
Klass.prototype.addHobby = function addHobby (value) {
  this.hobbies.push(value);
};
```

しかし、メソッドや定数までコンストラクタで設定する必要はありません。prototypeがメモリ節約をする利点が生かされなくなるからです。
特に共通の処理であるメソッドをコンストラクタで設定することは、また[別のある落とし穴](http://qiita.com/cocottejs/items/0c1756ac7e7ec8bae7cb)が存在します。


# さいごに

**プロパティの実装はコンストラクタで行いましょう** これだけ覚えておけば今回は大丈夫です
まだまだ落とし穴がたくさんありますので、他の投稿も確認していただければと思います。
AjaxにおけるCSRF対策


##手法
・HTTPヘッダのX-requested-withの値をチェックし、ajaxであることを担保する。

```validate_sample.php
    private function validateCSRF() 
    {
        if( isset($_SERVER['HTTP_X_REQUESTED_WITH'])
            && strtolower($_SERVER['HTTP_X_REQUESTED_WITH'])==='xmlhttprequest'
        ){
            return true; // not csrf
        }
            return false; // invalid request
    }

```

##理論的背景
SameOriginPolicyより、Ajaxであることはすなわり不正な外部ドメインからのアクセスではない。

上記から、X-requested-withの確認のみでCSRF対策が可能となる。

##考慮事項

・X-requested-withは操作することも可能
・Ajax level2ではクロスドメイン間の通信が可能であるためこの対策は無効

→定石通りワンタイムトークンを用いるのがベターか。

##参考
http://madaolog.blogspot.jp/2012/12/ajaxwebcsrf.html
MySQLのscheme変更時テストにおけるデータdumpとリストア手順


##概要
MySQLのScheme変更時、本番dbと同一環境を用意してテスト実施〜リストアまでの手順

##流れ

####データdump
```
mysqldump -u user_name -p***** -h hostname db_name > dbname.dump
```
####dbクリア
```
mysql -u user_name -p***** -h hostname
DROP DATABASE db_name
CREATE DATABASE db_name CHARACTER SET utf8
```
####データリストア

```
mysql -u user_name -p***** -h hostname db_name < db_name.dump
```

リストアデータサイズによって

```
--max_allowed_packet=1G 
```
オプションをつける

```
mysql -u user_name -p***** -h hostname --max_allowed_packet=1G db_name < db_name.dump
```
LTPによるLinuxシステム検証


![kobito.1380731512.294003.png](https://qiita-image-store.s3.amazonaws.com/0/13343/a1c12c60-5814-7d24-e334-075ef2f65ef4.png "kobito.1380731512.294003.png")


# LTPとは
LTP(Linux Test Project)とはLinuxの信頼性、堅牢性、および安定性を検証するテストスイートを提供するオープンソースソフトウェア。

公式サイト:http://ltp.sourceforge.net/
Githubページ:https://github.com/linux-test-project/ltp

#  インストール
本記事執筆時の最新リリース版(20130904)をインストールする

```
$ wget https://sourceforge.net/projects/ltp/files/LTP%20Source/ltp-20130904/ltp-full-20130904.tar.xz
$ tar Jxvf ltp-full-20130904.tar.xz
$ cd ltp-full-20130904/
$ ./configure 
$ make 
# make install
```

上記手順により`/opt/ltpに`インストールされる
※今回のインストール環境はUbuntu 12.04 LTS 64bit on Vagrant

#  LTP実施

```
$ cd /opt/ltp
# ./runltp
```

検証結果は`result`や`output`配下に作成される。
結果に失敗や警告が出たらコンソールログを確認。
しかし、それだけでは分からないことが多々あるので、その時はテストのソースコードなどの確認をする。
カーネルコンフィグやコマンドといった特定の機能の有無を検証していることもあるので、失敗が出たからといってシステムに問題があるとは限らない。

# 検証項目の指定

何もオプションしてせずに`runtlp`を実行するとデフォルで設定されたシステムコールやメモリ周りなどの基本的な検証項目を実施する。
この場合、1500件ぐらい実施し、２時間程度かかるので検証項目を簡略化するときは`runltplite.sh`を実行、または`-f`オプション指定で検証項目を指定する。

```システムコール検証を実施
# ./runltp -f syscalls
```

検証項目およびそれぞれの項目はruntest配下のファイルが該当する。
各ファイルを開くことでそれぞれの項目で検証される１つ１つのテストを確認することができる。
また、コメントアウトすることで書くテスト実施有無の設定を行うことができる


# 検証結果をHTML出力する
`-g`オプションでファイル名を指定することで、
以下のようなHTML形式の検証結果レポートを出力することができる。

```システムコール検証時のHTMLレポート出力
# ./runltp -f syscalls -g syscalls.html
```

![kobito.1380904228.756034.png](https://qiita-image-store.s3.amazonaws.com/0/13343/10cb061d-4fdc-4622-d4e3-cb69865403b6.png "kobito.1380904228.756034.png")
（途中省略...）
![kobito.1380904284.476181.png](https://qiita-image-store.s3.amazonaws.com/0/13343/aa6733d0-4ecd-bd53-f248-d03c888641c8.png "kobito.1380904284.476181.png")


※runltpはbashでの動作を前提としているようで、ubuntuなどの/bin/shがdashにシンボリックリンクされている環境ではレポート出力処理途中でエラーが生じた。
そのような場合はrunltpを編集し、`#!/bin/bash`として動作させた。

----

* その他オプションは`---help`オプションで確認できる。
* ネットワーク周りの検証項目は対向機の設定が必要となる。
ansible gem module gemのPATH

ruby & gemをソースから入れてた場合等で、
/usr/local/bin/にしかgemが無い場合は、
gemモジュールを使うと、以下のようにエラーとなる。

```bash:
ailed: [localhost] => {"failed": true, "item": ""}
root      3077  0.0  0.0   3676   3│msg: Failed to find required executable gem
```
これは、/usr/local/binは見てくれないようになっているからっぽい
sbin_paths = ['/sbin', '/usr/sbin', '/usr/local/sbin']
は対象になっている
https://github.com/ansible/ansible/blob/9d5d88b59fa3fdbbec4f4cb269c446c666e3abbb/lib/ansible/module_common.py#L743

.bashrcや/etc/bashrc等にPATHを追記しても無理だったので、
仕方なく以下のようにして対処・・・。

```bash:
ln -s /usr/local/bin/gem /usr/local/sbin/gem
```

だれかもっとマシな解決方法を教えてくださいｗ
CoffeeScriptでオブジェクトのプロパティに同名の変数を代入する時の書き方

```coffeescript:obj.coffee
obj = {hoge}
```
こう書くと

```js:obj.js
var obj;

obj = {
  hoge: hoge
};
```
こうなる

```coffeescript:obj.coffee
obj = {hoge, fuga, foo}
```
複数指定も

```js:obj.js
var obj;

obj = {
  hoge: hoge,
  fuga: fuga,
  foo: foo
};
```
この通り

最近知ったのでメモ。便利ですね。
Jekyll Generator の作り方


## Generator とは

Jekyll で独自のファイルを生成するためのプラグインの一つである。`Jekyll::Generator` を継承して作成する。

Jekyll は以下の順序でサイトをビルドする。

1. 処理対象のファイル（Page/Post/Static File）を探す
2. Generator を実行する
3. Page と Post を Converter で変換する
4. 出力先ディレクトリをクリアする
5. 出力先ディレクトリに Page と Post の変換結果を出力し、Static File をコピーする

全ての Generator は手順 2. で実行される。 

Generator という名前から、Generator 自身に何らかのファイルを生成させてしまいそうになるが、生成したファイルは上記の手順 4 で Jekyll によって削除されてしまう（ただし `_config.yml` の `keep_files` に指定したファイルは削除されない）ので、作成されたはずのファイルが見つからず、頭を捻ることになる。

したがって、Generator は直接ファイルを生成するのではなく、独自の Page や StaticFile を生成し、処理対象に追加する。実際のファイル生成は Jekyll の通常の処理に任せるのがよい。


## Generator の使用例

* 処理対象のファイルが存在せず、他の情報から出力ファイルを生成する場合。例えば、他の Post からカテゴリ一覧ページや月別アーカイブページを生成する場合など。

* 処理対象のファイルを変換したいが、YAML front-matter を書くことができない場合。例えば、画像ファイルを圧縮したり、sass ファイルや AltJS ファイルを変換したりする場合など。


## Generator の実装例

Sass の変換を Jekyll のビルドに統合する場合を考える。今回は `_scss` ディレクトリに Sass のソースファイルを配置し、出力先の `css` ディレクトリに出力する。

まず、`.scss` ファイルを表す `StaticFile` のサブクラス `SassStaticFile`  を作成する。Jekyll は、Static File を出力する際、`StaticFile#write` を呼ぶので、`write` をオーバーライドし、出力時に CSS に変換する。

```ruby:_plugins/sass.rb
require 'pathname'
require 'sass'

module Jekyll

  class SassStaticFile < ::Jekyll::StaticFile

    def initialize(site, base, dir, name)
      super
    end

    def destination(dest)
      (Pathname.new(dest) + 'css' + @name).sub_ext('.css').to_s
    end

    def write(dest)
      dest_path = destination(dest)

      return false if File.exist?(dest_path) && !modified?
      @@mtimes[path] = mtime

      FileUtils.mkdir_p(File.dirname(dest_path))
      template = File.read(path)
      sass = ::Sass::Engine.new(template, syntax: :scss)
      File.write(dest_path, sass.render)

      true
    end
  end

end
```

次に、`.scss` を探して `SassStaticFile` を作成し、Jekyll の処理対象に追加する `SassGenerator` を作成する。

```ruby:_plugins/sass.rb
module Jekyll

  class SassGenerator < ::Jekyll::Generator

    def generate(site)
      sass_files(site.source).each do |sass|
        site.static_files << SassStaticFile.new(site,
                                                site.source,
                                                File.dirname(sass),
                                                File.basename(sass))
      end
    end

    def sass_files(source)
      sass_dir = File.join(source, '_scss')
      return [] unless File.directory?(sass_dir)
      files = Dir.chdir(sass_dir) { Dir['**/*.{sass,scss}'] }
      files.map { |file| File.join('_scss', file) }
    end
  end

end
```

上記の内容を `_plugins/sass.rb` など、`_plugins` ディレクトリ以下に配置すれば、Jekyll がビルド時に自動でロードし、`_scss/*.scss` を CSS ファイルに変換して `css/*.css` に出力してくれる。
`~/.emacs.d` 配下にある elispファイルを全てバイトコンパイルして起動を爆速に！

最近やっとEmacsが便利に使えてくるようになったら、今度は起動時のもっさり感がちょっと無理なレベルになってきた。(10秒ぐらいかかる)

なので全部バイトコンパイルして起動時間を速くしよう！

`C-u 0 M-x byte-recompile-directory`

して一度 `y` と答えると全部バイトコンパイルされます。
コンパイルが終わるまでじっくりゆっくり待ちましょう。


「爆速にする」と書いたけど、そこまでは速くなりませんでした。
一度このフレーズを使ってみたかっただけなんです。

## 参考

C-u 0 M-x byte-recompile-directory
http://stackoverflow.com/questions/1217180/how-do-i-byte-compile-everything-in-my-emacs-d-directory
OSXでEmacsを起動する時に `~/.emacs.d` 配下を読み込まない

何かEmacsの設定がよくわからなくなって原因を調査するとき設定ファイルを読み込まない方法。

`/Applications/Emacs.app/Contents/MacOS/Emacs -Q`

でOK

## 参考

osx - How to run a emacs without loading `.emacs` nor `.emacs.d`? - Stack Overflow
http://stackoverflow.com/questions/19194720/how-to-run-a-emacs-without-loading-emacs-nor-emacs-d/19194832?noredirect=1#19194832
LearnOSM -中上級者編


このページは、[LearnOSM](http://learnosm.org/ja/)の、[English Learning Guides](https://github.com/hotosm/learnosm/wiki/English-Learning-Guides)の翻訳ファルを置いています。

問い合わせたところライセンスはCC0とのことでしたが、もし問題があればご連絡ください。

I've heard they are licensed under CC0. If there are some problem, [contact me](nyampire@gmal.com).


# 中級編
* [より詳細な編集](https://docs.google.com/document/d/1isRbgJ8HIGtdvy3wuF5ywtBwhUuSBNlVZPlIF3n15qs/edit?usp=sharing)
 * [JOSM資料](http://www.slideshare.net/TomG3X/josm-26185682) - Tom_G3X Slideshare
 * [JOSM Manual](https://www.dropbox.com/s/vjgln8ashf0ynhd/JOSM_manual_0324.pdf?m) - Kubota@OSMFJ PDF
* Conflict Resolution - 競合発生時の解決
* Using Orbview Imagery in JOSM - JOSMにおけるOrbview画像利用
* Quality Assurance - 品質管理
* Tasking Manager -  HOTタスクマネージャ
* Editing the Wiki - OSM WIkiの編集
* Creating Custom Presets - プリセット自作手順
* Private Data Store - HOTプライベートデータストア

# 上級編
* PostGIS Configuration - PostGIS基礎設定
* [TileMillによる地図デザイン](https://docs.google.com/document/d/1INTVsQcw3cKihg68tnJ4aeTfX3GkATc09Toh-3QS8XM/edit?usp=sharing)
* Putting Maps on a Website - Webサイトでの地図表示
* Github Sharing - Githubによるデータ共有
* WMS Service Configuration - WMSサービス設定
* Private Data Storage Configuration - プライベートデータストア設定
* Projections and File Types - 地理情報ファイル形式と投影法
* SQLite Databases - SQLite データベース
* Virtual Machine Setup - 仮想マシンのセットアップ

# QGIS
* The Basics of QGIS - QGIS基礎
* Managing Your Data - QGISによるデータ管理
* Adding Labels to Maps - 地図上へのラベル表示追加
* Adding Style to Maps - 地図へのスタイル設定
* Printing Maps - 地図の印刷
* Attaching Photos to Maps - 地図への写真データ追加
* Useful Plugins - 各種プラグイン紹介
* [Inasafe] Need to introduce Inasafe and link it to the main website. - Inasafe機能解説
gitで使うコマンドメモ

# ブランチの作成


```

// branchを作成
$ git checkout -b trunk
Switched to a new branch 'trunk'

// 作成されたことを確認
$ git branch
  master
* trunk

// remoteリポジトリに反映
$ git push origin trunk
Enter passphrase for key '/home/mtaji/.ssh/id_rsa': 
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:otajisan/work.git
 * [new branch]      trunk -> trunk

```
FuelPHPをインストールする

下記、公式ドキュメントより。
http://press.nekoget.com/fuelphp_doc/installation/instructions.html

これを見ると、非常に簡単にインストールできることが分かる。

1. curlで落としてくる

```

$ curl get.fuelphp.com/oil | sh

```

2.oilコマンドを使ってインストール

```

$ oil create sample

```

これだけ。

```

$ cd sample

$ ls -l
合計 992
-rw-rw-r--  1 mtaji mtaji  54776  3月 24 12:37 2013 CHANGELOG.md
-rw-rw-r--  1 mtaji mtaji   6526  3月 24 12:37 2013 CONTRIBUTING.md
-rw-rw-r--  1 mtaji mtaji   1771  3月 24 12:37 2013 README.md
-rw-rw-r--  1 mtaji mtaji   3243  3月 24 12:37 2013 TESTING.md
-rw-rw-r--  1 mtaji mtaji    997  3月 24 12:37 2013 composer.json
-rw-rw-r--  1 mtaji mtaji   5586  3月 24 12:40 2013 composer.lock
-rwxrwxr-x  1 mtaji mtaji 913318  3月 24 12:39 2013 composer.phar
drwxr-xr-x 10 mtaji mtaji   4096  3月 24 12:37 2013 docs
drwxrwxr-x  6 mtaji mtaji   4096  3月 24 12:39 2013 fuel
-rw-rw-r--  1 mtaji mtaji   1451  3月 24 12:37 2013 oil
drwxrwxr-x  3 mtaji mtaji   4096  3月 24 12:37 2013 public

```

正常に入った。

ちなみに、Controllerなどはこのへん⬇に作成すれば良い。

```

$ cd fuel/app/classes/

$ ls -l
合計 12
drwxrwxr-x 2 mtaji mtaji 4096  3月 24 12:37 2013 controller
drwxrwxr-x 2 mtaji mtaji 4096  3月 24 12:37 2013 model
drwxrwxr-x 3 mtaji mtaji 4096  3月 24 12:37 2013 view

```
macOSでgem install pgしてNo pg_configとなる対処法

Homebrewが入っていれば

```bash
$ brew install libpq
```

で `libpq` をインストールする。 `brew install postgresql` すると書いてある記事もあるが（この記事にもそう書いていた）、これだとサーバーも入ってしまう。サーバーもMacにインストールしたいなら `postgresql` でOKだが、サーバーはDocker等で動かすのでMacにはクライアントのみで問題ないということなら `libpq` とするほうが良い。

## インストールしていてpg_configがあるはずと思う場合

以下コマンドでどこにインストールされているかが調べられる：

```bash
$ brew info libpq
libpq: stable 14.5 (bottled) [keg-only]
Postgres C API library
https://www.postgresql.org/docs/14/libpq.html
/opt/homebrew/Cellar/libpq/14.5 (2,340 files, 28.3MB)
  Poured from bottle on 2022-08-23 at 14:20:09
（以下略）
```

`/opt/homebrew/Cellar/libpq/14.5` にインストールされていることがわかり、以下のようにすればインストール可能。

```bash
$ gem install pg --with-pg-config=/opt/homebrew/Cellar/libpq/14.5/bin/pg_config
```

また、bundle installの中でこのエラーが出るようなら、以下のようにしてbundle installの過程でインストールされるgemに引数を渡せる。

```bash
$ bundle config build.pg --with-pg-config=/opt/homebrew/Cellar/libpq/14.5/bin/pg_config
$ bundle install
```
関数の場合の変数の巻き上げ問題について


一見正しく動作しないと思われるコードを見かける事があります。
不幸にもそのようなコードを保守しなければならなくなった際に、慌てないように理解しておかなければなりません。

##よくある「変数の巻き上げ問題」について

次のコードを実行した際に、`ReferenceError: x is not defined`の例外が発生します。

```js:
console.log(x);
```

当たり前ですね。
しかし、次のコードを実行した際に、undefinedが表示されます。

```js:
console.log(x);
var x = 1;
```

このことから、xは`var`の記述の位置に限らず次のように解釈されています。

```js:
var x;
console.log(x);
x = 1;
```

この事はjsの問題としてたびたび話題にあがる **変数の巻き上げ** の説明です。

##関数にもある同じ問題

では次はどのように動作するでしょうか？

```js:
console.log(y());
var y = function x() {
    return 1;
};
```

`TypeError: undefined is not a function`と例外は発生します。
これも変数の巻き上げと同じ解釈が働いているので当たり前の動作ですね。
これならどうでしょうか？

```js:
console.log(x());
var y = function x() {
    return 1;
};
```

やはり`TypeError: x is not a function`と例外は発生します。
`x`は関数名ではありますが、変数ではないので参照する事もできません。

では次の場合はどのように動作するでしょうか？

```js:
console.log(x());
function x() {
    return 1;
}
```

実際に動作させると`1`が表示されると思います。
ということは次と同じとなります

```js:
var x = function x() {
    return 1;
}
console.log(x());
```

このことから次の事が分かります。

 * `function x(){}`と記述した場合は、`x`は変数になるうえに、先頭で宣言と定義が一緒にされたものと同じである。
 * `var y = function x(){}`とした場合は、`x`は変数にならないので`x`を参照できない。
 * 関数を変数に代入するだけで動作が変わる！
 * `var`を使用しなくとも変数の巻き上げは存在するが、値がundefinedではない場合がある

投稿するほどのトピックではないと思うかもしれません。

しかし問題は次のようなコードに遭遇したときです。

```js:
var z = new Class1;

// ~~~ 間に多くの行 ~~~

function Class1 () {
};
```

前半部分だけみると、このClass1とはなんだ？ってなりがちです。
Class1が一般的な名称であればあるほど、読み込んでいる汎用ライブラリや言語仕様で定義されているのかな？と **勘違い** してしまう可能性があります。
しかし、実際はソースコードの後ろのほうで定義されています。
（なぜかnode.js界隈では、この形式の記述が多くみられます。）

変数では気をつけていればすぐ分かる事もクラス(関数)だと分かりにくくなります。それは`var`を使用しなくていい事と`undefined`ではない事によるものです。
> jsにはクラスはありませんがここでは便宜的にクラスという名称を使用しています

保守や参考にしようとする人にとっては、上から順番にソースを読めば良いという（大抵の言語なら）決まっているルールから外れているため、無駄に時間を取られてしまいます。

 **しかし、関数も変数の巻き上げ問題がある事を、認識している必要があります**

もし自分がモジュール開発の立場で、他人がコードをみる可能性がある場合は、関数は必ず変数に代入し使用する前に定義した方が良いでしょう。
これにより、js初心者に理解しにくい「不自然に見えるコード」ではなくなります。
新規に立てたgithubリポジトリからソースをcloneする

ターミナルからcloneを実行

```

s git clone git@github.com:otajisan/work.git
Initialized empty Git repository in /home/mtaji/work/.git/
Permission denied (publickey).
fatal: The remote end hung up unexpectedly

```

エラーが発生。
permissionで弾かれている。

RSA公開鍵を作成

```

s ssh-keygen -C mtaji@taji.dev02
Generating public/private rsa key pair.
Enter file in which to save the key (/home/mtaji/.ssh/id_rsa): id_rsa 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in id_rsa.
Your public key has been saved in id_rsa.pub.
The key fingerprint is:
・・・

```

生成確認

```

s ls -l
合計 12
-rw------- 1 mtaji mtaji 1743  3月 24 11:57 2013 id_rsa
-rw-r--r-- 1 mtaji mtaji  398  3月 24 11:57 2013 id_rsa.pub
-rw-r--r-- 1 mtaji mtaji  803  3月 24 11:42 2013 known_hosts

```

公開鍵を確認

```

s cat id_rsa.pub 

```

この内容を、githubの「SSH Keys」に登録すればいけるはず。

というわけで、再度clone実行。

```

s git clone git@github.com:otajisan/work.git
Initialized empty Git repository in /home/mtaji/work/.git/
Warning: Permanently added the RSA host key for IP address '192.30.252.130' to the list of known hosts.
Enter passphrase for key '/home/mtaji/.ssh/id_rsa': 
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.

```
キター

```

s cd work
s ls -l
合計 4
-rw-rw-r-- 1 mtaji mtaji 60  3月 24 12:05 2013 README.md

```
正常にcloneできている。

これで、githubを使って自宅での開発も可能そうです。
PowerShellスクリプトを書くときのテンプレート

PowerShellスクリプトを書くときに使っている個人的なテンプレートです。

```ps1:Template.ps1
# Windows PowerShell
# テンプレート

param($dummy)

Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
$WarningPreference = "Continue"
$VerbosePreference = "Continue"
$DebugPreference = "Continue"

######################################################################
### 関数定義
######################################################################

# 使用方法を出力する。
# return - なし
function U-Write-Usage() {
    Write-Output "使い方：$psName"
}

# 主処理を実行する。
# return - なし
function U-Run-Main() {
    Write-Output $dummy
}

######################################################################
### 処理実行
######################################################################

###
### 前処理
###

$baseDir = Convert-Path $(Split-Path $MyInvocation.InvocationName -Parent)
$psName = Split-Path $MyInvocation.InvocationName -Leaf
$psBaseName = $psName -replace "\.ps1$", ""
$timestamp = Get-Date -Format "yyyyMMdd-HHmmss"

Write-Verbose "$psName Start"

# 設定ファイル読み込み
$iniPath = "${baseDir}\${psBaseName}.ini"
if (Test-Path -PathType Leaf $iniPath) {
    Write-Debug "設定ファイル読み込み $iniPath"
    $ini = @{}
    Get-Content $iniPath | %{ $ini += ConvertFrom-StringData $_ }
}

###
### 主処理
###

if ($dummy -eq $null) {
    U-Write-Usage
} else {
    U-Run-Main
}

###
### 後処理
###

Write-Verbose "$psName End"

```
PowerShellからODBC接続してSQL実行してみました

これで実行出来ました。

```ps1:OdbcCommand001.ps1
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
$WarningPreference = "Continue"
$VerbosePreference = "Continue"
$DebugPreference = "Continue"

# ライブラリ読み込み
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Data")

# DB接続
$connectionString = "DSN=H2TestDsn;uid=sa;pwd=sa;"
$odbcCon = New-Object System.Data.Odbc.OdbcConnection($connectionString)
$odbcCon.Open()

# コマンドオブジェクト作成
$odbcCmd = New-Object System.Data.Odbc.OdbcCommand
$odbcCmd.Connection = $odbcCon

# コマンド実行（テーブル作成）
$odbcCmd.CommandText = "CREATE TABLE TEST (ID INT PRIMARY KEY, NAME VARCHAR(255))"
$odbcCmd.ExecuteNonQuery() | Out-Null

# コマンド実行（INSERT）
$odbcCmd.CommandText = "INSERT INTO TEST (ID, NAME) VALUES (100, 'りんご')"
$odbcCmd.ExecuteNonQuery() | Out-Null
$odbcCmd.CommandText = "INSERT INTO TEST (ID, NAME) VALUES (101, 'みかん？')"
$odbcCmd.ExecuteNonQuery() | Out-Null
$odbcCmd.CommandText = "INSERT INTO TEST (ID, NAME) VALUES (102, 'すいか')"
$odbcCmd.ExecuteNonQuery() | Out-Null

# コマンド実行（UPDATE）
$odbcCmd.CommandText = "UPDATE TEST SET NAME='みかん' WHERE ID=101"
$odbcCmd.ExecuteNonQuery() | Out-Null

# コマンド実行（DELETE）
$odbcCmd.CommandText = "DELETE TEST WHERE ID=102"
$odbcCmd.ExecuteNonQuery() | Out-Null

# コマンド実行（SELECT）
$odbcCmd.CommandText = "SELECT * FROM TEST ORDER BY ID"
$odbcReader = $odbcCmd.ExecuteReader()
while ($odbcReader.Read()) {
    $odbcReader["ID"].ToString() + " " + $odbcReader["NAME"].ToString()
}
$odbcReader.Dispose()

# コマンド実行（テーブル削除）
$odbcCmd.CommandText = "DROP TABLE TEST"
$odbcCmd.ExecuteNonQuery() | Out-Null

# コマンドオブジェクト破棄
$odbcCmd.Dispose()

# DB切断
$odbcCon.Close()
$odbcCon.Dispose()
```
ODBCデータソースを作成するコマンド

次のコマンドで、ODBCデータソースを作れました。

```bat:Odbcconf001.bat
odbcconf /A {CONFIGDSN "PostgreSQL Unicode(x64)" "DSN=H2TestDsn|DATABASE=testdb|SERVER=localhost|PORT=5435|UID=sa|PWD=sa"}
```

次のコマンドで簡単なヘルプが出ました。

```bat:Odbcconf002.bat
odbcconf /?
```
非推奨のメソッドを使用した時にメッセージを表示させる

いずれ不要になる（非推奨）メソッドを使用したときにメッセージを出力させる関数を作成した。

非推奨メソッドを使用したときにメッセージを表示させる関数
--------

```coffeescript:CoffeeScript
deprecation = (out) -> () => 
   switch arguments.length
     when 3 then [thiz, name, f] = arguments
     when 2 then [name, f] = arguments
     else throw new ArgumentException("argument length error!")
   that = if (thiz) then thiz else this
   that[name] = () -> 
        out("*** WARNING *** deprecated function:#{name}")
        f.apply(this, arguments)
```

関数の使用する前に、共通的な出力先を指定する。
非推奨メッセージの出力先を、都度変える場合は不要。

```coffeescript:CoffeeScript
#deprecated = deprecation(alert) #alertを出したい場合
deprecated = deprecation(console.log) # console.logを出したい場合
```

この関数は次のように使用する。

```
deprecated <クラスメソッドの場合は'@,‘そうでない場合は指定しない> "メソッド名", メソッド本体
```

このようなメソッドがあれば

```coffeescript:CoffeeScript
@fnca = (a) -> console.log(a)
fncb = (a) -> console.log(a)
```

こうなる。

```coffeescript:CoffeeScript
deprecated @,"fnca", (a) -> console.log(a)
deprecated "fncb", (a) -> console.log(a)
```

実行結果（非推奨前）

```
a
b
```

実行結果（非推奨後）

```
"*** WARNING *** deprecated function:fnca
a
"*** WARNING *** deprecated function:fncb
b
```

クラス内のメソッドも同様に使用可能
ProgressionのCommandをFlexUnitでテスト

いつも忘れるのでメモ。

```Actionscript3
[Test(async)]
public function testCommand():void
{
	var com:Command = new Command();
	com.onComplete = Async.asyncHandler(this, function():void{
		assertTrue(true);
	}, 5000);
	com.execute();
}
```

`Command`の`onComplete`に`Async.asyncHandler`を突っ込むのがミソ。
ガンガンCommand書いてガンガンテストしよー。
Parseにサーバーサイドのコードを書いてiOSアプリから呼ぶ

Parse の Cloud Code をはじめて触ってみた際に書いたメモです。 **ローカルで生成した JavaScript のコードをデプロイし、iOSアプリから呼んでみる** までの手順。

###1. 準備

- Parseダッシュボードからアプリをつくっておく
- コマンドラインツールをインストールする

````
$ curl -s https://www.parse.com/downloads/cloud_code/installer.sh | sudo /bin/bash
````


###2. Parse newコマンドを実行する

````
$ parse new MyCloudCode
````

EmailとPasswordを求められるので、入力する。

GitHubとかでサインアップした場合、Passwordがないので、ParseのダッシュボードのAccount->Editで設定しておく。

認証に成功すると、

    1:MyAppA
    2:MyAppB
    Select an App: 

みたいな感じでどのアプリにするか聞かれるので、番号を入力する。

成功すると、下記フォルダ／ファイルが自動生成される。

    -config/
      global.json
    -cloud/
      main.js
    -public/
      index.html

###3. デプロイする

cloud/main.js にはHello world的なコードが入ってるので、すぐにデプロイして試せる。

````
$ cd MyCloudCode
$ parse deploy
````

成功すると、ダッシュボードの Cloud Code タブで main.js の内容を確認できる。

ちなみにこんなコード。

````
Parse.Cloud.define("hello", function(request, response) {
  response.success("Hello world!");
});
````


###4. コマンドラインからたたいてみる

curlコマンドからmain.jsに実装されているhello関数を呼ぶ。

````
curl -X POST \
  -H "X-Parse-Application-Id: {Application ID}" \
  -H "X-Parse-REST-API-Key: {REST API Key}" \
  -H "Content-Type: application/json" \
  -d '{}' \
  https://api.parse.com/1/functions/hello
````

こういうレスポンスが返ってくる。

    {
      "result": "Hello world!"
    }


###5. iOSアプリからたたいてみる

####iOSアプリへParse SDKを導入する

この詳しい手順は省略します。

[クイックスタートガイド](https://www.parse.com/apps/quickstart)

Parse.frameworkを追加して、依存フレームワークを追加して、APIキーとかをセットするメソッドを呼ぶ、それだけです。


#### `callFunctionInBackground:withParameters:` メソッドで実装した関数を呼ぶ

````
[PFCloud callFunctionInBackground:@"hello"
                   withParameters:@{}
                            block:^(NSString *result, NSError *error) {
                                
                                if (error) {
                                    
                                    NSLog(@"error:%@", error);
                                }
                                else {
                                    
                                    NSLog(@"result:%@", result);
                                }
                            }];
````

###参考資料

-  [Getting Started](https://www.parse.com/docs/cloud_code_guide) 
-  [Cloud Functions](https://www.parse.com/docs/ios_guide#cloudfunctions/iOS)
Cocoa ApplicationでRegexKitLiteをやる。

環境
OSX 10.6.8
Xcode 4.2
RegexKitLite 4.0
##1. Cocoa Applicationを作成する。
##2. ソースを追加する。
RegexKitLite.h
RegexKitLite.m
RKLMatchEnumerator.h
RKLMatchEnumerator.m
##3. Build Settingする。
Other Linker Flags に-licucoreを追加
##4. run
mkdir したディレクトリに cd する

こういうのはよく見掛けるけど、 `mkdir` のオプションが固定だったり、
`-` で始まるディレクトリが扱えなかったりして悲くなったので作ってみた。
(ってのは後付けで、とりあえず Qiita に何か書いてみたかった)

```bash
function mkcdir() {
    mkdir "$@" || return $?

    local arg got_end_option=0
    for arg in "$@"; do
        case "$arg" in
            --)
                got_end_option=1
                continue
                ;;
            -*)
                ((1 == $got_end_option)) && break
                continue
                ;;
            *)
                break
                ;;
        esac
    done
    cd -- "$arg"
}
```
kvmでvirtioのCrystalDiskMark結果

最初xpを使おうとインストールしたのですが、体感で昔のネットブック(Atom)の半分くらいの速度。
virtioを有効にしてもその遅さは改善せず。
windows7をインストールしたところさくさく動きました。

* https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/

環境
=======
Core i5-2500K CPU @ 3.30GHz
メモリ16GB
[ADATA SSD S510](http://jp.adata-group.com/index.php?action=product_feature&cid=3&piid=136)をSATA3.0 (6Gbps)に接続。
ホストOS: ubuntu 13.10 be 64bit

windows xp
==============
仮想IDE
------------------------
![xp-ide.png](https://qiita-image-store.s3.amazonaws.com/0/25728/c60a50ff-b42f-447b-842a-c43360aad0d7.png)

virtio
------------------------
![xp-virtio.png](https://qiita-image-store.s3.amazonaws.com/0/25728/d9af5d44-169e-09ae-4ed2-f341c8a00f0a.png)

windows7
=============
仮想IDE
------------------------
![7-ide.png](https://qiita-image-store.s3.amazonaws.com/0/25728/feda6301-ae71-ea0f-9487-9a38904135c5.png)

virtio
------------------------

![7-virtio.png](https://qiita-image-store.s3.amazonaws.com/0/25728/29e9c810-f9b8-b661-1979-ff39456ea60f.png)
「パンくず」の意味

[Home](# "ホームへ") > [大カテゴリ](# "大カテゴリへ") > **現在地**

な、よくあるパンくずナビ。
なんで「パンくず」なんだろ？って思ってたら、下北沢オープンソースカフェの河村さんが教えてくれた。


> WEB業界のヘンゼルとグレーテルは、ユーザが迷わないようにトップページから最短距離でパンくずを撒いて行きます。

あの童話で兄弟が迷わない様に撒いていったパンくずから来てるんですね。
知らんかったー