OmniAICreator/Qiita-1.07M huggingface dataset:
Xcode5環境で外部ライブラリをiOS用にビルドする

<pre>
#!/bin/bash
 
#Build external static library for iOS in Xcode5 environment
#
#This script was originally written by MiKL for GDAL.
#http://stackoverflow.com/questions/12643898/incorporating-gdal-ogr-into-an-ios-project-a-quick-guide
#
#And modified by igorti
#https://gist.github.com/igorti/6044531
#
#Finally, modified by teuder
#https://gist.github.com/teuder/7657480
 
# Disallow undefined variables
set -u
 
 
#default install directory
prefix=$HOME/Output
 
#minimal iOS version
iphoneos_version=7.0
 
unset DEVROOT SDKROOT CFLAGS CC LD CPP CXX AR AS NM CXXCPP RANLIB LDFLAGS CPPFLAGS CXXFLAGS
 
 
usage ()
{
    cat >&2 << EOF
Usage: ${0##*/} [-h] [-p prefix] target [additional_configure_args]
	-h	Print help message
	-p	Installation prefix (default: \$HOME/Output)
	target	i386, armv7, armv7s
 
Any additional arguments are passed to configure.
 
EOF
}
 
 
while getopts "hp:" opt; do
    case $opt in
	h  ) usage ; exit 0 ;;
	p  ) prefix="$OPTARG" ;;
	\? ) usage ; exit 2 ;;
    esac
done
shift $(( $OPTIND - 1 ))
 
if (( $# < 1 )); then
    usage
    exit 2
fi
 
target=$1
shift
 
 
 
case $target in
 
    armv7 )
	arch=armv7
	platform=iPhoneOS
	extra_cflags=""
	;;
	
	armv7s )
	arch=armv7s
	platform=iPhoneOS
	extra_cflags=""
	;;
	
	 
    i386 )
	arch=i386
	platform=iPhoneSimulator
	extra_cflags=""
	;;
 
    * )
	usage
	exit 2
 
esac
 
#SDK directory
platform_dir=/Applications/Xcode.app/Contents/Developer/Platforms/${platform}.platform/Developer
platform_sdk_dir=${platform_dir}/SDKs/${platform}${iphoneos_version}.sdk
 
#System header and library
include_path=${platform_sdk_dir}/usr/include/**
library_path=${platform_sdk_dir}/usr/lib
 
#Other external library compiled by this script before
include_path2=${prefix}/include/**
library_path2=${prefix}/lib
 
#Set environmental variables for configure
export CC="/usr/bin/clang"
export CXX="/usr/bin/clang++"
export CPP="/usr/bin/clang -E"
export LD="/usr/bin/ld"
export AR="/usr/bin/ar"
export AS="/usr/bin/as"
export NM="/usr/bin/nm"
export RANLIB="/usr/bin/ranlib"
 
export C_INCLUDE_PATH="${include_path}:${include_path2}"
export CPLUS_INCLUDE_PATH=$C_INCLUDE_PATH
export LIBRARY_PATH="${library_path}:${library_path2}"
export LD_LIBRARY_PATH=$LIBRARY_PATH
export CFLAGS="-arch ${arch} -pipe -Os -gdwarf-2 -miphoneos-version-min=${iphoneos_version} -isysroot  ${platform_sdk_dir} ${extra_cflags} -I${include_path} -I${include_path2}"
export LDFLAGS="-L${library_path} -L${library_path2}"
export CXXFLAGS="${CFLAGS}"
export CXXCPP="${CPP}"
#export CPPFLAGS="-I${include_path} -I${include_path2}"
 
./configure \
    "$@" \
    --prefix="${prefix}" \
    --host="${arch}-apple-darwin" \
    --disable-shared \
    --enable-static || exit 2\
 
make install || exit 2
 
cat >&2 << EOF
 
Build succeeded!  Files were installed in
 
  $prefix
 
EOF
</pre>
VBAで閉じたブックからセルの値を取り出す

    Public Function ReadClosedBook As String
        ReadClosedBook = ExecuteExcel4Macro('C:\hoge\[Hogehoge.xlsx]Sheet1'!R5C1)
    End Function

・'パス名 & [ファイル名]  &  シート名 'R & 行番号 & C & 列番号 で指定する。'は必須。
・セルが空白の場合は0が返ってくる。
ipaファイルのProvisioningを差し替える



```sh:プロビジョニングを入れ替える
#!/bin/bash

#元のipaファイル
IPA_FILE=test.ipa

#出力するipaファイル
DEST_FILE=test_copy.ipa

#差し替えるProvisioning Profile
PROV_FILE=test.mobileprovision

#差し替えるEntitlements
ENTITLEMENTS=Entitlements.plist

#差し替える署名の証明書の名前
SIGN="iPhone Developer: DEVELOPER NAME (XXXXXXXXXX)"

mkdir -p tmp
cp ${IPA_FILE} tmp
cd tmp
unzip -q ${IPA_FILE}
APP_FILE=Payload/`ls Payload`

#署名を削除
rm -r ${APP_FILE}/_CodeSignature

#プロビジョニングファイルを新しいものに置き換え
cp ../${PROV_FILE} ${APP_FILE}/embedded.mobileprovision

#.appに署名し直す
codesign --force --sign "${SIGN}"\
	--resource-rules ${APP_FILE}'/ResourceRules.plist' ${APP_FILE}

# #.appを署名し直す（entitlementsも書き換える）
# codesign --force --sign "${SIGN}"\
# 	--resource-rules ${APP_FILE}'/ResourceRules.plist'\
# 	--entitlements ../${ENTITLEMENTS} ${APP_FILE}

#署名が上手くいったか確認
codesign -d --entitlements - ${APP_FILE}

# #再パッケージ（使う時は、次のzip圧縮はいらない。失敗するかも・・・）
# /usr/bin/xcrun -sdk iphoneos PackageApplication\
# 	-v ${APP_FILE} -o ${DEST_FILE} --sign "${SIGN}" --embed ../${PROV_FILE}

#zip圧縮で新しいipaファイル作成
zip -qr ${DEST_FILE} Payload
cp -f ${DEST_FILE} ../
cd ../
rm -rf tmp
```



```sh:キーチェーンに登録された証明書の一覧を出力する
security find-identity -p codesigning -v
```

```xml:Entitlements.plistサンプル
<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
    <dict> 
        <key>application-identifier</key> 
        <string>XXXXXXXXXX.*</string> 
        <key>keychain-access-groups</key> 
        <array> 
            <string>XXXXXXXXXX.*</string> 
        </array> 
        <key>get-task-allow</key> 
        <true/> 
    </dict> 
</plist> 
```

###参考

iOSアプリの署名を付け替える - Qiita [キータ]
http://qiita.com/beakmark/items/33c0b73603e491f08a33

iOS アプリのprovisioning profile差し替え方法 | Septeni Engineers' Blog | セプテーニ エンジニアブログ
http://labs.septeni.co.jp/?p=815

doesNotRecognizeBlog, codesign(1) についてのメモ
http://mtakagi.tumblr.com/cli/codesign.1/
ログインしたタイミングが前回のログインから日をまたいでるかチェックする



```cpp:ログインチェック

#include <iostream>
#include <time.h>

using namespace std;

/**
 * now - 現在の日時
 * time - 前回のログイン日時
 * hours - 日付更新時刻
 * timezone - タイムゾーン
 */
bool loginCheck(int now, int time, int hours, int timezone)
{
    int tz = timezone * 3600;
    int offset = -hours * 3600;
    now += tz + offset;
    now -= now % 86400;
    time += tz + offset;
    return now > time;
}

//------- test >>

int dt(char *s)
{
    struct tm tm_;
    memset(&tm_, 0, sizeof(struct tm));
    strptime(s, "%Y-%m-%d %H:%M:%S", &tm_);
    return mktime(&tm_);
}

string toString(bool b)
{
  return b ? "true" : "false";
}

int main(int argc, char *argv[]) 
{
	// loginCheck(現在の日時, 前回のログイン日時, 日付更新時刻, タイムゾーン);
    cout << toString(loginCheck(dt("2013-01-01 03:59:59"), dt("2012-12-31 03:59:59"), 4, 9)) << "\n"; // true
    cout << toString(loginCheck(dt("2013-01-01 03:59:59"), dt("2012-12-31 04:00:00"), 4, 9)) << "\n"; // false
    cout << toString(loginCheck(dt("2013-01-01 04:00:00"), dt("2012-12-31 04:00:00"), 4, 9)) << "\n"; // true
    cout << toString(loginCheck(dt("2013-01-01 00:00:00"), dt("2012-12-31 23:59:59"), 4, 9)) << "\n"; // false
    cout << toString(loginCheck(dt("2013-01-01 04:00:00"), dt("2013-01-01 04:00:00"), 4, 9)) << "\n"; // false
    cout << toString(loginCheck(dt("2013-01-01 03:59:59"), dt("2013-01-01 00:00:00"), 4, 9)) << "\n"; // false
    cout << toString(loginCheck(dt("2013-01-01 04:00:00"), dt("2013-01-01 03:59:59"), 4, 9)) << "\n"; // true
    cout << toString(loginCheck(dt("2013-01-01 04:00:00"), dt("2013-01-01 04:00:00"), 4, 9)) << "\n"; // false
    cout << toString(loginCheck(dt("2013-01-01 04:00:01"), dt("2013-01-01 04:00:00"), 4, 9)) << "\n"; // false
}
```
macでChromeがFinderごと固まる

https://twitter.com/fuqunaga/status/400164324435447808

という症状が出ていたけど、正解っぽい対策を発見

http://productforums.google.com/forum/#!topic/chrome-ja/tC85Tzt0PG8

>試した方法は、プロファイルの作り直しです。こちらが参考になりました。結果は成功で今は全くトラブルなく使えています。
>
>http://support.google.com/chrome/bin/answer.py?hl=en&answer=142059

要は
**~/Library/Application Support/Google/Chrome/Default を適当にリネーム**
でプロファイルが新規作成される

さてさてこれで直るかな
zipコマンド


```
zip (option) [archive file] [file/directory]
```

``` sh:zip圧縮
zip -r FILENAME.zip FILE_DIR 
```

``` sh:zip圧縮（パスワード付き）
zip -re FILENAME.zip FILE_DIR
```

``` sh:zip圧縮（DS_Store、__MACOSXを含めない）
zip -r FILENAME.zip FILE_DIR -x "*.DS_Store" "*__MACOSX*"
```

``` sh:zip圧縮（パスワード付き：DS_Store、__MACOSXを含めない）
zip -r -P PASSWORD FILENAME.zip FILE_DIR -x "*.DS_Store" "*__MACOSX*"
```

``` sh:zipからDS_Store、__MACOSXを削除
zip --delete FILENAME.zip "*.DS_Store" "*__MACOSX*"
```

``` sh:zip解凍
unzip FILENAME.zip 
```

### option

| コマンド 	| 機能 
|:------------------|:--------------------------------------------------------
| -A 			| 自己解凍形式で圧縮する
| -d 			| アーカイブから指定ファイルを削除
| -l 			| 改行をLFからCR LFへ変更
| -ll 			| 改行をCR LFからLFへ変更
| -m 			| アーカイブから指定ファイルを移動（削除）
| -q 			| 処理内容を表示しない
| -r 			| ファイルとディレクトリを再帰的に処理する
| -t 			| 指定日付以降のファイルを圧縮
| -u 			| 更新されたファイルや新しいファイルのみを追加する
| -z 			| コメントの追加
| -@ 			| ファイル名を標準入力から読む
ファイル操作コマンド


```sh:ファイルの一覧を出力
ls -1
```

```sh:空のファイルを作成する
mktemp ${FILE_NAME}
```

```sh:空のファイルを作成する
echo -n > ${FILE_NAME}
```

```sh:ファイルに書き込む
echo ${TEXT} > ${FILE_NAME}
```

```sh:ファイルに日付を追記する
echo `date +"%Y/%m/%d %H:%M:%S"` >> ${FILE_NAME}
```

```sh:ディレクトリを作成
mkdir -p -v ${DIRECTORY_NAME}
```

```sh:日付フォルダを作る
mkdir `date +%Y%m%d_%H%M`
```

```sh:ファイルに追記する
echo ${TEXT} >> ${FILE_NAME}
```

```sh:ファイルの内容を出力する
cat ${FILE_NAME}
```

```sh:ファイルをコピーする（上書き）
cp -f ${FROM_SRC_FILE} ${DEST_DIR_PATH}
```

```sh:ファイル名を変更する
mv ${BEFORE_FILE_NAME} ${AFTER_FILE_NAME}
```

```sh:ディレクトリを削除（警告を表示しない＆中身も削除）
rm -rf ${DIRECTORY_NAME}
```

```sh:ディレクトリ内の全てのファイルを操作
for FILE in *
do
  echo ${FILE}
done
```

```sh:ディレクトリ内の特定の拡張子のファイルを操作
for FILE in *.png
do
  echo ${FILE}
done
```

```sh:複数のファイルの拡張子を一括変更する
for FILE in *.txt;
do
  mv $FILE ${FILE%.txt}.doc;
done
```
iOS7でレジューム復帰時にアラートダイアログを表示するときの注意点

開発担当のタイトルで発生した問題で、忘却防止用の自分メモとして残しておきたいと思います。

UIAlertViewを利用したダイアログは通常使用する場合には問題がないのですが、
レジューム復帰時に”wifi接続がない”警告や”ゲーム進行の為に通信します”表示等で
使用しているとiOS7では高確率でCrashするようになりました。

// コードサンプル（Crashする場合）

```objective-c:
self.alertDialog =
 [[UIAlertView alloc] initWithTitle: @"hoge hoge"
                      message: @"Unable to connect to the server."
                      delegate: self
                      cancelButtonTitle: nil
                      otherButtonTitles: nil];

[self.alertDialog addButtonWithTitle: @"Retry"];
[self.alertDialog release];
[self.alertDialog  show];
```


Crashした状況のログを見ると以下のようになっていました。

<Warning>: Debug Log: UE3SYS:CRASH: appUncaughtExceptionHandler: NSInternalInconsistencyException - -[UIKeyboardTaskQueue performTask:] may only be called from the main thread.

ログからは”メインスレッドからコールしなさい”という内容ですが、iOS6まで正常に動作していたので、
iOS7からレジュームからの復帰の際にメインスレッドから呼び出されてないのでは？という予想をしました。

またWebで調べてみるとStack Over Flowでも同様の報告あり、メインスレッドで"show"をコールすると
修正できるようでした。
http://stackoverflow.com/questions/19162508/uialertview-crash-ios7-assertion-failure
http://stackoverflow.com/questions/19005463/uialertview-makes-the-program-crash

アラートダイアログの"show"を以下のように変更した所、Crashしなくなりました。

```objective-c:
dispatch_async(dispatch_get_main_queue(), ^{
    [self.alertDialog  show];
});
```

今回はこちらの対応で処理しましたが、実際はダイアログ表示のAPIを変更する方法もありそうなので
時間があれば調べておきたいと思いますが、これに関しては完結したいと思います。
【Android】Androidアプリでスプラッシュ画面を作成する

iOSでは画像(Default.png)を設定するだけで実現できるアプリのスプラッシュ画面。
Androidではそうはいかないようです。何か方法があるのかな？

現在、作成しているアプリでスプラッシュ画面を作る必要があったのでメモ。



##SplashActivity.java(スプラッシュ画面)

```java
private void startTopActivity()
{
	Intent intent = new Intent(this, TopActivity.class);
	startActivity(intent);

	//Top画面からこの画面に戻ってきたくないので、アクティビティを終了しておく
	SplashActivity.this.finish();
}
```

##TopActivity.java(Top画面)

```java
@Override
public boolean onKeyDown(int keyCode, KeyEvent event){
	//Top画面でBackボタンが押された場合はアプリを終了する
	//Splash画面側は既に削除されている
	if (keyCode == KeyEvent.KEYCODE_BACK){
		TopActivity.this.finish();
		return true;
	}
	return false;
}
```

アプリ起動時に表示されるアクティビティをSplashActivityに設定しておいて
何らかの初期処理を行った後に、TopActivity(Top画面)を表示する。
というような場合、TopActivityに遷移する`startActivity(intent)`を実行後に
`SplashActivity.this.finish();`で自分を終了しています。

Top画面として表示されるTopActivityでは、
AndroidのBackボタンを押したイベントをオーバーライドして
アプリを終了するようにしています。


他にもいろいろとやるべき事があるかもしれませんが、
とりあえずこれでTop画面表示時にBackボタンでアプリを終了する。という流れは実現できます。
Chef 11.8.0 では、cookbook_path や role_path を配列にできない

cookbooks フォルダ以外に、 site-cookbooks フォルダも使っていたので、~/.chef/knife.rb の一部は以下のようになっていました。

```rb
cookbook_path            [ './cookbooks', './site-cookbooks' ]
```

```
bundle exec knife solo prepare aaa
```

すると、prepare するサーバに Chef はインストールされるものの、Ruby のエラーが出て肝心の json ファイルが生成されない。
エラーは下記参照。

```
/Users/aaaaa/.rbenv/versions/1.9.3-p429/lib/ruby/gems/1.9.1/gems/knife-solo-0.4.0/lib/knife-solo/node_config_command.rb:44:in `exist?': can't convert Array into String (TypeError)
```

berkshelf を使えば cookbooks フォルダに統一できるし、cookbooks_path は cookbooks だけを指すようにしたら json ファイルも生成されましたとさ。

GitHub での議論はこちら。

https://github.com/matschaffer/knife-solo/issues/278#issuecomment-28091223
YumでリポジトリごとにProxyを有効/無効にする

会社のネットワークから社外に出る場合にはProxyを経由するようになっているところが多いと思います。
Yumをつかうときも、基本的に社外のリポジトリを使うならば`/etc/yum.conf`に`proxy=http://user@proxy-address:port`などと書いておけば問題ないのです。

ただ、何台もサーバーを作るとなったときに、いちいちProxyを経由していてはアレなので、ローカルにリポジトリを建てることにしました。
そのため、社内のリポジトリにはProxyを経由せず、社外のリポジトリにはProxyを経由して、という設定をする必要が出てきましたのでメモしておきます。

私のところの場合、リポジトリの数は社外が多いので、`/etc/yum.conf`にProxyの設定を書いておき、社内リポジトリは個別にProxyを外す、というポリシーにしています。

具体的には`/etc/yum.repos.d/`のリポジトリ設定ファイルに次の一行を書くことで、Proxyを使わない設定が出来ます(これは不正解みたいです)。

```text:
proxy=http://
```

追記:正解は

```text:
proxy=_none_
```

だそうです。manpagesを読んでいませんでした。お恥ずかしい...
ご指摘ありがとうございます> iwaim@github さん


もっとスマートな方法がある、間違っている、などのコメントをお待ちしております。
JavaScriptの配列

どこかで見かけた<del>配列</del>(文字列の間違いです)処理
この記事は不完全ですので、コメントも合わせてご覧ください

<pre>
var str = "asdfgh";
var sliceStr = str["slice"](2, 4);

console.log(sliceStr); // df
</pre>

JavaScriptの <del>配列</del> 文字列の添え字にString系のプロパティを指定すると同様の処理を行ってくれるようです
全てのStringプロパティで試した訳ではないので例外があるかもしれません

あまり見かけないので、利点は薄いのかもしれませんね

技術的な間違いがございましたらご指摘いただければ幸いです
iOSデバイスに応じて，使用するストーリーボードを変更する

IPhone 4sとiPhone 5の間で，画面の高さが変更になりました．また，Universal Appにする場合に，iPhoneのStoryboardとiPadのStoryboardそれぞれに，ViewControllerを用意するのは無駄です．
そこで，Storyboardを3つ作成して，一つのViewControllerの同一のpropertyやmethodに接続すればデバッグも簡単になります．

---
仮に3つのStoryboardの名前を

1. iPad.storyboard
1. iPhone_old.storyboard
1. iPhone.storyboard

とします．

AppDelegate.hに

```objc:
@property (nonatomic) NSString  *sbName;
```
を定義し，Storyboardの名称を格納する領域を取ります．

AppDelegate.mの`@implementation AppDelegate`直下に

```objc:
@synthesize sbName;
```

を追加します．

`didFinishLaunchingWithOptions`を以下の様に書き換えます．

```objc:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    // Override point for customization after application launch.
    // StoryBoardの型宣言
    UIStoryboard *storyboard;
     // StoryBoardの名称設定用
    NSString * storyBoardName;
    
    // 機種の取得
    NSString *modelname = [[UIDevice currentDevice] model];
    
    // iPadかどうか判断する
    if ( ![modelname hasPrefix:@"iPad"] ) {
        
        // Windowスクリーンのサイズを取得
        CGRect r = [[UIScreen mainScreen] bounds];
        // 縦の長さが480の場合、古いiPhoneだと判定
        if(r.size.height == 480)
        {
            storyBoardName = @"iPhone_old";
        }
        else
        {
            storyBoardName = @"iPhone";
        }
    }
    else
    {
        storyBoardName = @"iPad";
    }

    sbName = storyBoardName;

    // StoryBoardのインスタンス化
    storyboard = [UIStoryboard storyboardWithName:storyBoardName bundle:nil];
    
    // 画面の生成
    UIViewController *mainViewController = [storyboard instantiateInitialViewController];
    
    // ルートウィンドウにひっつける
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = mainViewController;
    [self.window makeKeyAndVisible];
    
    return YES;
}
```
これで3つのStoryboardを用意して，それぞれにレイアウトを工夫して，一つのViewControllerで制御する事が可能になります．
CentOS6.3でMySQL5.6.14をソースからインストール 

# CentOS6.3でMySQL5.6.14をソースからインストール 

## 環境

```
# uname -a
Linux ttakahashi 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
# cat /etc/redhat-release 
CentOS release 6.3 (Final)
```

## 前提
- CentOS6.3
- Apache2.4.6をインストール済み
- PHP5．5をインストール済み

## MySQLのインストール

### 1.MySQLソースファイルのダウンロード

```
# cd /usr/local/src/
# wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.14.tar.gz/from/http://cdn.mysql.com/
# tar xvfz mysql-5.6.14.tar.gz
# cd /usr/local/src/mysql-5.6.14
→　configureがない・・・cmakeが必要らしい
```

### 2.cmakeソースファイルのダウンロード&インストール

```
# cd /usr/local/src/
# wget http://www.cmake.org/files/v2.8/cmake-2.8.12.tar.gz
# tar xvfz cmake-2.8.12.tar.gz
#  cd cmake-2.8.12
# ./configure
# make
# make install
```

### 3.MySQL インストール

```
# cd /usr/local/src/mysql-5.6.14
# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
Curses library not found.  Please install appropriate package,
remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu, package name is libncurses5-dev, on Redhat and derivates it is ncurses-devel.
→　エラー発生、ncurses-develが必要
```

ncurses-develインストール

```
# cd /usr/local/src/
# wget ftp://rpmfind.net/linux/centos/6.4/os/x86_64/Packages/ncurses-devel-5.7-3.20090208.el6.x86_64.rpm
# rpm -ivh ncurses-devel-5.7-3.20090208.el6.x86_64.rpm
```

再度インストール

```
# cd /usr/local/src/mysql-5.6.14
# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
→　CMakeCache.txt削除し忘れ
# rm CMakeCache.txt 
# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
# make
# make install
```

### 4.初期設定
グループ、ユーザ作成

```
# groupadd mysql
# useradd -g mysql -d /usr/local/mysql mysql
```

データディレクトリを追加

```
# sudo mkdir /var/lib/mysql
# mkdir /var/lib/mysql
# chown -R mysql:mysql /usr/local/mysql
```
初期化

```
# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/var/lib/mysql -basedir=/usr/local/mysql 
```

所有者変更

```
# chown mysql:mysql -R /var/lib/mysql/*
```

起動スクリプト作成

```
# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
```

起動

```
# /usr/local/mysql/bin/mysql -u root 
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
→　エラー発生
```

設定ファイルを編集

```
# vi /etc/my.conf
[mysqld]
socket=/tmp/mysql.sock
[client]
socket=/tmp/mysql.sock
```

MySQL再起動

```
# /etc/init.d/mysqld restart
```

再度接続

```
/usr/local/mysql/bin/mysql -u root
接続を確認
```

パスワード設定

```
mysql> SET PASSWORD FOR root@localhost=PASSWORD('xxxxxxxxx');
```

### 5.ブラウザからの動作確認
ドキュメントルートに下記ファイルを配置

```html
<!DOCTYPE HTML>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <title>MySQL Databases</title>
</head>
<body>
<?php
$conn = new mysqli('localhost', 'root', 'xxxxxxxxx');
if (!$conn) {
    die('データベース接続エラー: ' . mysql_error());
}
$stmt = $conn->prepare("SHOW DATABASES");
$stmt->execute();

$stmt->bind_result($database);
while ($stmt->fetch()) {
     echo $database;
      echo "<br>";
}
?>
</body>
</html>
```
CentOS6.3でPHP5．5をソースからインストール

# CentOS6.3でPHP5．5をソースからインストール 
## 環境

```
# uname -a
Linux ttakahashi 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
# cat /etc/redhat-release 
CentOS release 6.3 (Final)
```

## 前提
Apache2.4.6をインストール済み
## PHPのインストール
### 1.PHPソースファイルのダウンロード

```
# cd /usr/local/src/
# wget http://us2.php.net/get/php-5.5.5.tar.gz/from/jp1.php.net/mirror
```

### 2.PHPのインストール

```
# tar xvfz php-5.5.5.tar.gz
# cd php-5.5.5
# ./configure --with-apxs2=/usr/local/apache2/bin/apxs
configure: error: xml2-config not found. Please check your libxml2 installation.　←　エラーが出た
```

### 3.libxml2ソースファイルのダウンロード&インストール

```
# cd /usr/local/src/
# wget ftp://xmlsoft.org/libxml2/libxml2-2.9.1.tar.gz
# tar xvfz libxml2-2.9.1.tar.gz
# cd libxml2-2.9.1
# ./configure
# make
# make install
```

### 4.PHPのインストール再実行

```
# cd php-5.5.5
# ./configure --with-apxs2=/usr/local/apache2/bin/apxs
　→今度は成功
# make
# make install
```

### 5.動作確認

```
# cd /usr/local/apache2/htdocs
# vi phpinfo.php
<?php
phpinfo();
?>
# curl http://192.168.155.70/phpinfo.php
<?php
phpinfo();
?>
↑　文字列として返ってきてしまった・・・
```

### 6.PHP利用のためのApache設定(http.conf設定)

1.モジュールの追加（新規追加）

```/usr/local/httpd/conf/httpd.conf
147行目 LoadModule php5_module        modules/libphp5.so
```

2.拡張子の登録（新規追加）

```/usr/local/httpd/conf/httpd.conf
376行目     AddType application/x-httpd-php .php
377行目     AddType application/x-httpd-php-source .phps
```

3.php.iniの配置場所の指定(PHPIniDir)(新規追加)

```/usr/local/httpd/conf/httpd.conf
505行目 PHPIniDir "/usr/local/lib/php/php.ini"
```

4．Apache再起動

```
# /usr/local/apache2/bin/apachectl restart
```

### 7.動作確認

```
# curl http://xxx.xxx.xxx.xxx/phpinfo.php
```
CentOS6.3でApache2.4.6をソースからインストール 

# CentOS6.3でApache2.4.6をソースからインストール 
## 環境
```
# uname -a
Linux ttakahashi 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
# cat /etc/redhat-release 
CentOS release 6.3 (Final)
```
## 1.ソースファイルのダウンロード
```
# cd /usr/local/src
# wget http://ftp.jaist.ac.jp/pub/apache//httpd/httpd-2.4.6.tar.gz
# wget http://ftp.jaist.ac.jp/pub/apache//apr/apr-1.4.8.tar.gz
# wget http://ftp.jaist.ac.jp/pub/apache//apr/apr-util-1.5.2.tar.gz
# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.33.tar.gz
```

## 2.PCRE をインストールする
```
# tar xvfz pcre-8.33.tar.gz
# cd pcre-8.33
# ./configure
# make
# make install
```
## 3.Apacheインストール
```
# tar xvfz httpd-2.4.6.tar.gz
# tar xvfz apr-1.4.6.tar.gz
# tar xvfz apr-util-1.5.2.tar.gz
# mv apr-1.4.6 httpd-2.4.6/srclib/
# mv apr-util-1.5.2 httpd-2.4.6/srclib/
# ./configure --with-included-apr
# make
# make install
```
## 4.apache起動
```
# /usr/local/apache2/bin/apachectl start
# curl xxx.xxx.xxx.xxx
<html><body><h1>It works!</h1></body></html>
```
Vagrantを始めたときに読んだサイトメモ


##いきなり結論
あーだこーだググってないで、
ドットインストールでvagrant → chefまでやってから調べたほうが捗る。

## ググった軌跡


"The guest machine entered an invalid state while waiting for it to boot. Valid states are 'starting, running'. The machine is in the 'poweroff' state. Please verify everything is configured properly and try again."
https://github.com/mitchellh/vagrant/issues/2157

Vagrant + シェルスクリプトでPHP開発環境をプロビジョニングしてみたメモ
http://k-holy.hatenablog.com/entry/2013/09/05/084237

PHPの外部ライブラリの管理にComposerを使う
http://www.ryuzee.com/contents/blog/5681

CakePHPをComposerで導入する手順(Vagrantでのデモ環境同梱)
http://www.engineyard.co.jp/blog/2013/install-cakephp-on-composer/


Vagrant入門 (全13回)
http://dotinstall.com/lessons/basic_vagrant


もう XAMPP / MAMP はいらない！Vagrant で作る PHP 開発環境
http://sssslide.com/www.slideshare.net/shin1x1/xampp-mamp-vagrant-php


Vagrant勉強会アップロード用
http://www.slideshare.net/takeuchi-tk/vagrant-26298430

Mac OS X Mavericks で Vagrant がこける時の対処法
http://firegoby.jp/archives/5182

[Mac]Vagrant1.0.7からVagrant1.2.２に更新
http://blog.hello-world.jp.net/?p=596

Vagrantを使ってみた！
http://www.r-cms.jp/rcms-develop/list/article/id=306

Vagrantの使い方
http://qiita.com/IK12_info/items/28ac74bfa92a39e886ef


Vagrantでmountエラーで、フォルダがShareされない
http://blog.mizoshiri.com/archives/1390

vagrant で共有フォルダのマウントに失敗するときの対処
http://qiita.com/Handen/items/ec1c0edcca5e8883a646

http://www.lancork.net/2013/11/vagrant135-synced-folder-permission-mount-options/
Vagrant1.3.5ではconfig.vm.synced_folderのパーミッションをmount_optionsで設定する

Mavericksで使えなくなったTextExpanderやBetterTouchToolを再び使えるようにする設定方法。
http://number333.org/2013/10/24/mavericks-textexpander/

Vagrantbox.es
http://www.vagrantbox.es/

CakePHPをComposerで導入する手順(Vagrantでのデモ環境同梱)
http://www.engineyard.co.jp/blog/2013/install-cakephp-on-composer/


PEARインストーラでCakePHPをインストール
http://book.cakephp.org/2.0/ja/installation/advanced-installation.html

Composerを使ってCakePHP2.4.1とDebugKitをインストールするまで
http://higan96.hatenablog.com/entry/2013/10/02/183809
PHPで複数のクラスをextendsしたい

PHP5.4以降でtraitという機能が追加されました。
http://php.net/manual/ja/language.oop5.traits.php

クラスAをextendsしてるけど、ここに追加でクラスBとクラスCもextendsしたい、そんな要求を概ね叶えてくれる機能です。

```php
<?php
	// 基底クラス
	class A{
		public function hoge(){
			print('クラスAのメソッドhoge');
		}
	}

	// trait
	trait B{
		public function hoge(){
			print('トレイトBのメソッドhoge');
		}
		public function fuga(){
			print('トレイトBのメソッドfuga');
		}
		public function foo(){
			print('トレイトBのメソッドfoo');
		}
	}

	trait C{
		public function fuga(){
			print('トレイトCのメソッドfuga');
		}
		
		private $int = 1; // プロパティ
	}

	// Aを継承したクラス
	class D extends A{
		// トレイトB,Cを使用
		use B, C{
			// 被っているメソッドfugaはBを使用
			B::fuga insteadof C;
		}
		
		// @Override
		public function foo(){
			print('クラスDのメソッドfoo');
		}
		
		// トレイトのprivateを参照可能
		public function getInt(){
			print($this->int);
		}
	}
		
		// 優先順位は自分自身 > trait > 基底クラス
		$d = new D();
		$d->hoge(); // トレイトBのメソッドhoge
		$d->fuga(); // トレイトBのメソッドfuga
		$d->foo();  // クラスDのメソッドfoo
		$d->getInt(); // 1
```

interfaceではメソッドの定義しか行えずロジックは書けませんでした。
クラスとはひとつしかextendsできないため、extends A, B, Cができませんでした。
トレイトを使うことによってこれらの問題点を解消し、ロジックを書いたうえで複数extendsのようなことを行うことができるようになります。

トレイト内のprivateな値も参照できていることから、普通のextendsより強い結びつきということがわかります。
実際はもっと単純に、useしたtraitは全部合わせてひとつのクラスと看做すと考えればよいでしょう。
要するにもう[Partial class](http://code.msdn.microsoft.com/windowsdesktop/15-partial-class-caecd686)ってことでいいよね。


※2013/06/21に[自サイト](http://yuubiseiharukana.blog.shinobi.jp/Entry/1187/)に記載したもの
perlモジュールがどのディレクトリにあるのか探す方法

# perlモジュールのソースが見たい

ログの確認時に Hoge::Fuga でエラーが起きているとだけ書かれていて、
どこのディレクトリにあるかわからないときがあった。
そんなときは perldoc コマンド。

```bash:例
$ perldoc -l Munin::Node::Server
/usr/share/perl5/vendor_perl/Munin/Node/Server.pm
```
1.9.2p290のleap?の動き

触ってるプロジェクト内でバグ見つけた時に挙動が気になったので調べたメモ。
##Date.leap?に文字列が渡せる
```ruby
require 'date'
Date.leap? "hoge" #=> false
```
##ruby1.9.2の中
```ruby:lib/date.rb
def self.gregorian_leap? (y) y % 4 == 0 && y % 100 != 0 || y % 400 == 0 end
class << self; alias_method :leap?, :gregorian_leap? end
```
%メソッドが動いておった
##ruby1.9.3では
```ruby
require 'date'
Date.leap? "hoge"
#=> TypeError: can't convert Fixnum into String
#        from (irb):3:in `+'
#        from (irb):3:in `leap?'
#        from (irb):3
#        from /Users/mori_daisuke/.rbenv/versions/1.9.3-p484/bin/irb:12:in `<main>'
```
メソッド探したら `ext/date/date_core.c` らへんにあた…
Ansible の template で生成したファイルに ansible によって生成されたというコメントを入れる

Ansible の template ファイルに

```jinja
{{ ansible_managed }}
```

を入れておくことで

```
Ansible managed: {file} modified on %Y-%m-%d %H:%M:%S by {uid} on {host}
```

というフォーマットで挿入できます。
このフォーマットはデフォルト値で ansible.cfg にて ansible_managed の値で変更できます。

http://www.ansibleworks.com/docs/intro_configuration.html#ansible-managed
に書いてあるまんまですけど。
Cygwin のssh でHOMEを変えていると怒られる件

Cygwinは普通に使うとホームディレクトリが `${Cygwinインストール場所}/home/ore` になります。（ユーザーが ore の場合の例ね）

Windowsのユーザーホームと合わせたいですよね。

### ホームディレクトリを変える

Windowsの環境変数HOMEにホームディレクトリにしたい場所を設定します。

```
HOME = D:\Users\ore
```

＃自分はDドライブにユーザーホームを引っ越しているので。。。

### .ssh/known_hostがどうのと怒られる対策

そのままだと何故か、　`/home/ore/.ssh/known_host` を作りに行って怒られます。
/etc/passwd に書かれているホームディレクトリの場所が `/home/ore` のままになっているので、こいつを `/cygdrive/d/Users/ore` みたいに書き換えればOK.
better_errorsがvagrantで動作しない対処

Rails4 今のところ最強なデバッグツール達
http://qiita.com/yusabana/items/8ce54577d959bb085b37

##better_errorsが動かない・・・
こちらにならって、vagrant環境にrailsを構築していたので、
デバッグに便利なbetter_errorsをgemからインストールしたが
・・・・動かず。


公式githubにこのようにありました。
https://github.com/charliesome/better_errors#security

```
You will notice that the only machine that gets the Better Errors page is localhost, which means you get the default error page if you are developing on a remote host (or a virtually remote host, such as a Vagrant box)
↓
超訳：localhostのみで表示され、リモートホストやVagrantでは出ないよ
```

##対処法
rails内にある、``config/environments/development.rb``に以下を追加

``BetterErrors::Middleware.allow_ip! "192.168.33.1"``
(※vagrantが config.vm.network :private_network, ip: "192.168.33.10" の場合)

vagrantのデフォルトでは、192.168.33.1から192.168.33.10にアクセスすることになるので、
192.168.33.1をallowすることで使えるようになりました。

非常に便利！！
Lionさんのgitバージョンアップ

gitを活用していこう！ってことでgitのバージョンを確認してみたところなかなか古いようでしたのでバージョンアップしました。

```
%git --version
git version 1.7.5.4
```

##手順
1. [公式サイト]( http://git-scm.com/ )の「Download for Mac」からファイルをゲット。（この時ゲットしたのは1.8.4.3でした）
2. ゲットしたものをインストール。(※1)
3. 新規に入れたgitが優先されるようにpathの設定変更。

```
%vim ~/.bash_profile
```

に下記を追加。

```
export PATH=/usr/local/git/bin:$PATH
```

反映させまーす。

```
source ~/.bash_profile
```

そして確認！

```
%git --version                                   
git version 1.8.4.2
```

おし！( ｀д´)b ｵｯｹｰ!

※1 Lionに元々入っていたgitは /usr/bin/git、新しく入れたgitは/usr/local/git/binに入っているようです。


以上です。
ゲーム制作計画2日目！

まず、気になるウェブサイトが企業の方から紹介されていたのでななめよみですが一読。
（http://d.hatena.ne.jp/shi3z/20111112/1321057463）
テーマと切り口で考える。
知ってるゲームが例として上げられておりとてもわかりやすかったです。
同じテーマを扱ってるにもかかわらず、
切り口を変えるだけでまったく別のゲームが生まれて別のおもしろさ（斬新さ）を感じさせられるみたいな感じ…かな？
たしかに、「斬新」と言われると、まっさらなところから何かを産み出したい気持ちになります。
この気持ちを改められたのは大きな収穫です。

しかし、テーマにしろ切り口にしろ、うなってなやんで思いつくようなものではないような気もします。
個人的には、頭の片隅のすみのすみのほうにぶら下げておいて、
アイデアが食いつくのをのんびりと待つのが良いと思います。
今回は時間がないので良いアイデアが釣れるかどうかは運次第な気がします。
まあ、そんな待ちの姿勢でこれから先生き残れるかは別問題。。。


#ゲーム内容の方針

一日経た結果、具体的な案は増えませんでしたが抽象的な条件と案を思いつきました。
・一周で飽きない工夫を
短い時間でできる簡単なゲームということで、
何回もプレイしてもらえることが必要だと思います。
そのためには、一定以上のステージを作る、もしくはいくつものパターンをランダムで生成することが必要だと思います。
他には図鑑などの要素も良いと思います。
うまくいけばですが、すべての要素を一般化できれば、
ランダム生成したほうが楽かなと思います。
ステージ作るにも図鑑作るにも手を動かさないといけないので。
しかし、ステージをクリアした時の達成感や、
図鑑の収集欲も侮れないところではあります。
図鑑に似ていますがps3のトロフィー機能のようなものもあれば楽しいと思います。

#ゲーム制作の方針

Unityで行こうとおもいます。
実は自分の環境ではUnityを起動するには
アカウントを変えてログインし直さないといけないようになっており、
昨日の段階では、それを億劫がってしませんでした。
今日確認したところ、標準でhtmlに出力できるようです。
以前作ったものを出力してみたところ、
クリックがうまく反応しなかったので、
それに関しては要研究です。

#cocos2dをお試し。
(http://qiita.com/shori0917/items/c9b76a0abf8e47e4fac4) を参考に少しだけ探ってみます。
最初に見つけたサイト2つはまっくじゃないと無理そうでした
アップロードにはお金がかかると言われると少しテンションが落ちてしまいますね。
パソコンはWindowsだし携帯に至ってはガラケーなので自分ではエミュレータでしか遊べないのですが。
開発を始められるようにするにはダウンロードしないといけないものが多そうです。
英語を嫌がっていてはいけないと思いつつも、今日のところは静かにダウンロードの画面を閉じました。

#感想
日記もブログもやったことがないので文面が安定しません。語調とか。
レポートだと思って書けば語調は安定しそうですが、精神が安定しないので
すこしゆるやかな気持ちで書こうと思います。
PHPでExcelで開いても文字化けしないCSVを出力する

最後にUTF-8からSJISに変換します。

```

//$dataがCSVで出力するデータ（キーがa,b,c,dの連想配列を想定）
foreach ($data as $key => $value) {
        //CSVに書きだす内容をカンマ区切りにする
        $csv .=  $value['a'] . ',';
        $csv .=  $value['b'] . ',';
        $csv .=  $value['c'] . ',';
        $csv .=  $value['d'] . ',';
        $csv .=  "\n"; 
    }
 

    header("Content-Type: application/octet-stream");
    //$filenameにファイル名を指定
    header("Content-Disposition: attachment; filename=$filename");
    //Excelで開くようにSJISにする
    echo mb_convert_encoding($csv,"SJIS", "UTF-8");

```
上記コードだと、改行・カンマが含まれていると正しいCSVが作成できないとご指摘頂いたので、修正。

```php
<?php

$data = array('hoge,fuga', "hoge\nfuga");
$csv = '';
$filename = 'test.csv';

foreach ($data as $key => $value) {
    //カンマ対応
    $value = str_replace(',', '","', $value);
    //改行対応
    $value = str_replace("\n", chr(10), $value);
    $csv .=  $value . ',';
    $csv .=  "\n"; 
}

    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=$filename");
    echo mb_convert_encoding($csv,"SJIS", "UTF-8");
```

こちらの方法でも可能とのことです！

```php
$fp = fopen('php://output', 'w');
stream_filter_prepend($fp,'convert.iconv.utf-8/cp932');
fputcsv($fp,$header);
foreach($rows as $row){
    fputcsv($fp,$row);
}
```
CentOS6でネットワーク インターフェイスの起動を早くする

VLANや死活監視系のためにネットワークインターフェイスが5個とか、多い時で10個以上あるCentOS(RHEL系)で`service network restart`とかやると物凄く時間がかかりますよね。
大体1個あたり2秒はかかっていて、ちょっと我慢出来なかったので、時短してみました。

遅い原因は、全てのインターフェイスでarpingしてIPアドレスの重複チェックをしていることです。
```/etc/sysconfig/network-scripts/ifup-eth```の次の部分です。

```sh:
if ! /sbin/arping -q -c 2 -w 3 -D -I ${REALDEVICE} ${ipaddr[$idx]} ; then
    net_log $"Error, some other host already uses address ${ipaddr[$idx]}."
    exit 1
fi
```

arpingのオプションの関係する部分は次のとおりです。

* `-c 2`はARPを打つ回数で、この場合は2回
* `-w 3`はARPのタイムアウト秒数で、この場合は3秒
* `-D`はIPアドレスの重複チェック

IPアドレスの重複チェックはこんなに入念にやらなくて良い、という場合には次のようにします。

```sh:
if ! /sbin/arping -q -c 1 -D -I ${REALDEVICE} ${ipaddr[$idx]} ; then
```

そもそもIPアドレスの重複チェックが不要な場合は、ifブロックそのものを削除してもよいでしょうし、ifブロックを残したい場合には`-c 0`を指定すればARPは打たれません。

```sh:
if ! /sbin/arping -q -c 0 -D -I ${REALDEVICE} ${ipaddr[$idx]} ; then
```
NSPageControllerでページをループさせる

`NSPageController`でページのループを実装する方法を考えました。


## NSPageControllerとは
スワイプによるビュー間の移動を可能にするCocoa用のクラスです。Xcodeのエディターエリアや、App Store、Spacesのページ移動には、多分これが使われています。


## どんな風に実装するのか
ページの先頭と末尾に、末尾と先頭のページをそれぞれ挿入します。
実行時は、これら挿入したページに移動した時に、そのページのコピー元のページに移動するようにします。

例えばA、B、Cという3枚のページがあるとすると、こんな感じになります。
![skitched-20131126-220007.png](https://qiita-image-store.s3.amazonaws.com/0/15888/d6fb9302-6440-4056-a303-73199bce6dfd.png)
後述の具体例ではこの図と正確には異なりますが、概念的にはこんな感じです。


## 具体例
Appleが公開している`NSPageController`のサンプル「[PictureSwiper](https://developer.apple.com/library/mac/samplecode/PictureSwiper/Introduction/Intro.html)」をいじって実装してみます。PictureSwiperは、複数枚の写真をスワイプによるページ移動で閲覧できる、簡易画像ビューアです。このサンプルに、ループを実装してみます。

今回変更するのは`AppDelegate.m`だけです。

まず、`AppDelegate`の`applicationDidFinishLaunching:`メソッドへ、下記のようにコード①、②を追加します。

```objc:applicationDidFinishLaunching:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {

    /* 
        中略（画像ファイルを読み込み、self.dataにそのデータを詰め込む）
    */

    // ①画像データの先頭と末尾に、末尾と先頭の画像データをそれぞれ挿入する
    id firstData = self.data[0];
    id lastData = self.data[self.data.count - 1];
    [self.data addObject:firstData];
    [self.data insertObject:lastData atIndex:0];
  
    // set the first image in our list to the main magnifying view
    if ([self.data count] > 0) {
      [self.pageController setArrangedObjects:self.data];
    }
  
    // ②0ページ目には末尾のページを挿入したので、1ページ目を表示する
    // （selectedIndex: 現在表示中のページのページ番号）
    self.pageController.selectedIndex = 1;
}
```

次に、`AppDelegate(NSPageControllerDelegate)`へ、下記メソッドを追加します。

```objc:pageController:didTransitionToObject:
// ページ移動時にこのメソッドが実行される
- (void)pageController:(NSPageController *)pageController didTransitionToObject:(id)object {
  
    // 先頭のページに行けば最後から1つ手前のページへ、
    // 最後のページに行けば先頭から1つ手前のページへ、
    // それぞれ移動する
    if (pageController.selectedIndex == 0) {
      pageController.selectedIndex = pageController.arrangedObjects.count - 2;
    }
    else if (pageController.selectedIndex == pageController.arrangedObjects.count - 1) {
      pageController.selectedIndex = 1;
    }
}
```
jQuery addClassメソッド・removeClassメソッドの引数にfunctionが使える

# addClass

[http://api.jquery.com/addClass/#addClass-functionindex--currentClass](http://api.jquery.com/addClass/#addClass-functionindex--currentClass)

# removeClass

[http://api.jquery.com/removeClass/#removeClass-functionindex--class](http://api.jquery.com/removeClass/#removeClass-functionindex--class)
gradleをつかって依存ライブラリを含む単一で実行可能なjarを生成する

バッチ処理をおこなう実行可能jarを生成する場合にはコマンドラインでいちいちクラスパスを設定するのは面倒ですし依存関係がかわるとバッチ処理コマンドも変更する必要が出てくるので管理が煩雑です。

gradleを利用してjarを生成する際に依存jar内のクラスも含めて一つのjarに入れればデプロイが格段に楽になります。

やり方は簡単。
build.gradleファイルのjarの設定に
from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
を加えるだけでできます。

```groovy:build.gradle
apply plugin: "java"
apply plugin: "maven"

def defaultEncoding = 'UTF-8'
[compileJava, compileTestJava]*.options*.encoding = defaultEncoding

sourceCompatibility = 1.7 
targetCompatibility = 1.7 
group = 'com.mychaelstyle.libs'
archivesBaseName = 'awstools' 
version = '0.1.0'

repositories {
  maven {
    url System.getenv("HOME") + "/.m2/repository"
  }
  mavenCentral()
}

dependencies {
  testCompile "junit:junit:4.11"
  compile 'javax.mail:mail:1.4'
  compile 'com.amazonaws:aws-java-sdk:1.6.4'
}

jar {
  manifest {
    attributes 'Implementation-Title': 'Mychael Style Tools', 'Implementation-Version': 1.0 
    attributes "Main-Class" : "com.mychaelstyle.tools.Main"
  }
  from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}

```
プルリクエストの画面でMerge出来ない事がわかった場合にどうすればよいか考える。


githubを使っていて、プルリクエストのMergeボタンが灰色になってて、
あ、コンフリクトが起きそう！
と思った時にどう対応するのが一番よいのか考える。


### 前提条件
- github flowを使っている
- hogehogeブランチ→masterに対してpull requestを送っている。
- 自分がhogehogeブランチで作業していて、最新の状態がローカルにある。

### 案
僕がいいと思った順に書いていきます。

#### 案１．灰色になっていたのを確認した瞬間にgit rebase masterして解消する
- 前提
 - 自分一人しかそのbranchで作業していない
 - ある程度rebaseがどういうものなのかわかっている。
- 作業内容

```git
git fetch origin
git checkout master
git pull origin master
git checkout hogehoge
git rebase master
（コンフリクトが起きるので修正）
git add test.txt
git rebase --continue
git push -f origin hogehoge
```

- メリット
 - 履歴が綺麗になる。
 - プルリクエストの画面からmergeボタンを押してmergeが出来る（つまり、他の人にレビューしてもらえるって事）
- デメリット
 - 前提に書いてるのでないと思うけど、`push -f`使ってるので、誰かがhogehogeブランチからブランチを切ってたり、hogehogeブランチに対してプルリクエストを出していると悲惨な事になる。

※と思ったけど、他の人が作業してても、

```git
git pull --rebase
```

他の人はこれで変更分を落とせば大丈夫かも。。

#### 案２．灰色になっていたのを確認した瞬間にgit merge masterする
- 前提
 - 自分以外の誰かがhogehogeブランチで作業している
 - rebaseに対して恐怖感を抱いている。
- 作業内容

```git
git fetch origin
git checkout master
git pull origin master
git checkout hogehoge
git merge master
（コンフリクトが起きるので修正）
git push origin hogehoge
```

- メリット
 - 他の人が作業してても安心
 - 他の人にレビューもしてもらえる。
- デメリット
 - 履歴がちょっと汚くなる。

#### 案３．リリース直前になってコマンドラインから、masterに直接pushする
- 前提
 - 僕の中ではこれはやりたくない。
 - プルリクエストの画面からmergeボタンが押せない場合、`Use the command line`ってリンクをクリックすると出てくるやつと同じような事です。
- 作業内容

```git
git fetch origin
git checkout master
git pull origin master
git checkout hogehoge
git merge master
（ここでコンフリクトが起きるので解消）
git add test.txt
git commit
git checkout master
git push origin master
```

- メリット
 - あまりメリットを感じない
- デメリット
 - リリース直前になって慌てて作業するのでちょっと。。。
 - プルリクエスト使ってないので、他の人がレビューしにくい。

### 思った事
案３は選択肢としてないなと思いつつも、もしかするとあるかもしれないと思って上げてみました。
前にコンフリクトが起きて、解消してるはずなんだけどMergeボタンが押せなかった現象が起きた事があったので、頭に入れとくといいかもしれません。（別のプルリクを作るという形でもいい気がしてきました）

僕は事前に解消して、リリース前にあたふたしたくないので、案１か案２をオススメします。
CentOS6でZeroconfを使用しないように設定する

CentOS6をインストールしてルーティングテーブルを表示するとこんなかんじに表示されると思います。

```text:
# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.70.0    0.0.0.0         255.255.255.0   U     0      0        0 eth2
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.90.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1004   0        0 eth2
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth0
```

169.254.0.0/16のルーティングテーブルが勝手に追加されていますが、これはZeroconfによって自動的に作られたものです。
Zeroconfに関しては割愛します。

さて、サーバーとして使うのにZeroconfは通常不要と思いますので、これを無効にします。
```/etc/sysconfig/network-scripts/ifcfg-ethX```に次の行を追加するだけです。

```text:
NOZEROCONF=yes
```

明示的にNOZEROCONFの設定がされていない設定ファイルに対して、すべて```NOZEROCONF=yes```を有効にするbashスクリプトを書いてみました。シェバンを省いてコマンドラインにコピペしてもokです。

```bash:
#!/bin/bash
for NIC in `ls -1 /etc/sysconfig/network-scripts/ifcfg-eth*`
do
  grep -q "^ *NOZEROCONF *= *.*" $NIC
  if [ $? -eq 1 ]; then
    echo "NOZEROCONF=yes" >> $NIC
  fi
done
```

追記: `grep -q "^ *NOZEROCONF *= *.*" $NIC || echo "NOZEROCONF=yes" >> $NIC`としようかとも思いましたが、どうやらファイルが見つからなかった等の理由で1以外が返ることもあるようですので、やめました。

追記: すべてのNICの設定に `NOZEROCONF=yes` しなくても `/etc/sysconfig/network` に書くだけで良いようです。つまり、上のようなスクリプトを書かなくても良いということです。
find で探したファイルを tar に

たとえばサイズが 10MB 以上のファイルを find で探して tar に渡して圧縮する。

<del>find . -type f -size +10M -print0 | xargs -0 tar czf foo.tar.gz</del>

xargs を使うと、引数が一定数以上の場合はプロセスが分割され、tar を上書きしてしまうとのこと。
@nacht_666 の[コメント](http://qiita.com/marcie001/items/f0bc4dd22e7128446d68#comment-8c24abe711c1a4c77df6)を参照してください。
ご指摘ありがとうございました。
sinatraでsubdirectoryに対応する

### やりたいこと
* Redirect を対応させる
* View 内のURLを対応させる

### 構成
以下の構成で確認しました。
* ruby 1.9.3
* sinatra 1.4.3
* thin 1.6.1
* haml 4.0.3


### サーバ(thin)をPREFIX付きで起動させます

```ruby:thin
thin start --prefix PREFIX
```

⇒環境変数SCRIPT_NAMEにPREFIXが設定されます。（これが大事です）

### prefixed_redirects を有効にします
以下のように`enable :prefixed_redirects`を追加します。

```ruby:app.rb
require "sinatra/base"

class App < Sinatra::Base
  enable :prefixed_redirects

  get "/" do
    redirect "/hello"
  end

  get "/hello" do
    haml :hello
  end

end
```

redirect "/hello" で PREFIX/hello にリダイレクトされるようになります。

### View内のURLをPREFIX対応します

```haml:hello.haml
!!!
%html
%head
  %script{:src => uri("/js/my.js")}
%body
  %p Hello
```

%script{:src => uri("/js/my.js")} のように、uriメソッドでURLをラップします。
こうすると、PREFIX/js/my.js に変換されます。

### おまけ
サーバ（thin）をPREFIX付きで起動しなくても正常に動作します。
【Android】文字列を『.(ピリオド)』で区切る

Javaにはreplace関数なんて簡単で便利な関数がありますが(iOSは関数名が長い・・・。)、
『.(ピリオド)』を置換したいとか、『.(ピリオド)』で区切りたい(split関数)なんてことがあります。

今回は、バージョン名を取得して、それを『.(ピリオド)』で区切りたい！と思ったのですが若干ハマりました。。

何がしたいかと言うと、バージョン名が 「1.2.5」みたいになっているので
これを「001002005」という感じにそれぞれの数字を3桁でゼロ埋めしたいと思ったわけです。

これを素直に・・・

```java
String versionName = Def.getVersionName(mContext);
			String[] versions = versionName.split(".",0);
			versionName = String.format("%03d%03d%03d", Integer.parseInt(versions[0]),Integer.parseInt(versions[1]),Integer.parseInt(versions[2]));
```
とやるとミスります。

正しくは、こう。

```java
String versionName = Def.getVersionName(mContext);
			String[] versions = versionName.split("\\.",0);
			versionName = String.format("%03d%03d%03d", Integer.parseInt(versions[0]),Integer.parseInt(versions[1]),Integer.parseInt(versions[2]));
```

バックスラッシュを２つつけることで『.(ピリオド)』という文字として認識してくれます。

(2013/11/27 追記)
ご指摘を頂きまして、追記しました。
こっちの方がいいですね！

```java
String[] versions = versionName.split(Pattern.quote("."), 0);
```
【Android】/data/dataからファイルを読込む

アプリ専用のディレクトリである/data/data/パッケージ/filesでファイルの読み書きをすることは多いかと思います。

FileInputStreamクラスを使ってファイルを読込もうとすると上手く行きませんでした。
どうやら/(スラッシュ)から始まるようなファイルパスを渡すことが出来ないようです。

てことで、JavaのInputStreamReaderを使ってファイルを読込んだところ成功しました。

```java
public static String readFile(String sFilepath, String sEnctype){

		String sData = "";
		BufferedReader bufferedReaderObj = null;

		try {
			//入力ストリームの作成
			bufferedReaderObj = new BufferedReader(new InputStreamReader(new FileInputStream(sFilepath), sEnctype));

			String sLine;
			while ((sLine = bufferedReaderObj.readLine()) != null) {
				sData += sLine + "\n";
			}

		} catch (Exception e) {
			Log.d(TAG, e.getMessage());
		} finally{
			try {
				if (bufferedReaderObj!=null) bufferedReaderObj.close();
			} catch (IOException e2) {
				Log.d(TAG, e2.getMessage());
			}
		}

		return sData;
	}
```

これでファイルの読込みに成功しました。
Railsアプリにパンくずリストを追加する

breadcrumbs_on_railsを利用する。
https://github.com/weppos/breadcrumbs_on_rails

手順は以下のとおり。

+ gemを追加
+ controllerに必要なコードを記述
+ viewに必要なコードを記述
+ 動く！

### gemを追加

以下のコードをGemfileに追加して `bundle install` する。

```rb:Gemfile
gem 'breadcrumbs_on_rails'
```

### controllerに必要なコードを記述

パンくずの設定をcontrollerで行う。

```rb
class BlogsController < ApplicationController

  # 第一引数にテキスト、第二にパスを入れる
  add_breadcrumb 'Home', 'http://www.example.com'
  add_breadcrumb 'ブログトップ', :blogs_path

  def index
  end

  def show
    @blog_title = "今日もやる気なし"
    
    # 第二引数を省くとリンクではない階層を作れる
    add_breadcrumb '日記'
    add_breadcrumb @blog_title, :blog_path
  end
end
```

上記のサンプルだと以下のように表示されることだろう。

` Home >  ブログトップ > 日記 > 今日もやる気なし` （separatorに「 > 」を指定した場合）

日記と今日もやる気なしはリンクにはならない。
日記の方は第二引数を指定しなかったため、ブログタイトルの方は最後の階層のためリンクにならない。

### viewに必要なコードを記述

あとは簡単。
viewの任意の場所に以下のコードを追加すれば良い。

```erb
<%= render_breadcrumbs separator: ' > ' %>
```

これで無事表示されているはず。

## オリジナルのテンプレートを使いたい場合は？

セパレーター以外にもマークアップ自体を変えたいこともあるでしょう。
そういう場合は以下のステップを踏む。

+ Breadcrumbs::Builderを作成
+ オリジナル用のerbを作成
+ viewの呼び出しを変更
+ 動く！

### Breadcrumbs::Builderを作成

こんなの作る。

```rb:lib/custom_breadcrumbs_builder.rb
class CustomBreadcrumbsBuilder < BreadcrumbsOnRails::Breadcrumbs::Builder
  def render
    @context.render "/shared/breadcrumbs", elements: @elements
  end
end
```

### オリジナル用のerbを作成

context.renderで指定した場所にerbを作成する。

```rb:app/views/shared/_breadcrumbs.html.erb
<% if elements.present? %>
  <ul class="breadcrumb">
    <% elements[0..-2].each do |element| %>
    <li>
    <% if element.path.present? %>
      <a href="<%= element.path %>"><%= element.name %></a>
    <% else %>
      <%= element.name %>
    <% end %>
      <span class="divider">/</span>
    </li>
    <% end %>

    <%= elements.last.name %>
  </ul>
<% end %>
```

### viewの呼び出しを変更

```erb
<%= render_breadcrumbs builder: ::CustomBreadcrumbsBuilder %>
```

これで自分好みのパンくずリストを表示できる。

参考記事: http://nishio.hateblo.jp/entry/2013/08/24/233004
S3から直接ダウンロードさせるときにファイル名を差し替える


ユーザにAmazon S3からファイルを直接ダウンロードしてもらいたいことがありますが、その際にファイル名を差し替えたいこともあります。
調べたところ、S3には、ファイル名を差し替えるための機能が用意されていました。
権限まわりの仕様を知らなくて少し手間取ったので、今回はそのあたりの内容を交えてメモします。

> 追記: LaravelのFilesystemを利用している場合は[このメソッド](https://github.com/laravel/framework/blob/5.8/src/Illuminate/Filesystem/FilesystemAdapter.php#L502-L529)を使うと一発でPre-Signed URLを発行したりダウンロード時のファイル名を指定したりできます。v5.4あたりで追加されたようです。

# どんな機能が用意されているか

S3のオブジェクトは、以下のようなURLを使ってGETで取りにいくことができますが、

* http://[bucket].s3.amazonaws.com/[key]

イメージとしては、URLに次のような感じでリクエストパラメータを含めると、ファイル名を差し替える（レスポンスヘッダをカスタマイズする）ことができます。([関連ドキュメントはこちら](http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html))

* http://[bucket].s3.amazonaws.com/[key]?response-content-disposition=[filename]

ただし、これだけだと権限エラーになります。
これについて、ドキュメントには以下のような注釈があります。

> You must sign the request, either using an Authorization header or a Pre-signed URL, when using these parameters. They can not be used with an unsigned (anonymous) request.

どうやらanonymousユーザはリクエストパラメータを使えないらしく、これは対象のオブジェクトが一般公開されていたとしても変わりません。リクエストをSignする必要があります。

# リクエストをSignする

というわけでリクエストをSignします。([関連ドキュメントはこちら](http://docs.aws.amazon.com/aws-sdk-php/guide/latest/service-s3.html#creating-a-pre-signed-url))
Signするには、AWS SDKのgetObjectUrl()を使います。

```php:PHP版の例
$client = S3Client::factory(array(
    'key'    => [access_key],
    'secret' => [secret_key]
));
$opt = array("ResponseContentDisposition" => 'attachment; filename="[filename]"');
$url = $client->getObjectUrl($bucket, '[key]', '[expiration]', $opt);
```

こうすると、次のようなURLが作られます。

* https://[bucket].s3.amazonaws.com/[key]?response-content-disposition=attachment%3B%20filename%3D%22hoge%22&AWSAccessKeyId=***&Expires=1111&Signature=***

このURLにアクセスすれば、ファイル名が差し替わった状態でダウンロードすることができます。

なお、URLにはAccessKeyIdが含まれています。これは、リクエストを事前にSign(Pre-Signed URL)した場合には必ず含まれるようですが、[シークレットアクセスキーがなければ何もできないので公開しても問題ない](https://stackoverflow.com/questions/7678835/how-secure-are-amazon-aws-access-keys)ようです。それでも「なんか気持ち悪い」と感じる場合は、何の権限ももたないか、あるいはread権限のみがあるIAMアカウントを作ってそれでSignしても良いかもしれません。

# 日本語のファイル名を扱う

Content-Dispositionは以下のようにして日本語のファイル名を扱うことができます。

```
Content-Disposition: attachment; filename*=UTF-8''[UTF-8のファイル名をURLエンコードしたもの]
```

ただし、[こちらのテスト結果](http://greenbytes.de/tech/tc2231/)を見る限りではIE8はこの方法では対応できないようです。
IE8の場合のみShift-JISを使えば良さそうですが、そうすると今度はAmazon側が対応していないような気もします。
※このあたりはちょっとまだ検証しきれていません（すみません）
FacebookのGraphAPIからユーザのアイコン画像にパラメータを付与すると捗る話



Facebookなどでユーザのアイコンを表示したいときによく

``` html
<img src="http://graph.facebook.com/asonas.P/picture">
```

こんなふうにやりますよね。
このAPIには`width`と`height`というパラメータを付与できて

``` html
<img src="http://graph.facebook.com/asonas.P/picture?width=500&height=500">
```

``` html
<img src="http://graph.facebook.com/asonas.P/picture?type=square">
```

とかできる。でかい。 四角い。便利。
ひとつのページにユーザのアイコンを大量に並べるときとかは画像サイズを小さくして読み込みを早くなったり、UIに合わせて適切なサイズにしておくとhtmlやcssで画像を無理やりリサイズすることもなくなるし、便利。

他にもパラメータがあるのでドキュメントを読みましょう。
https://developers.facebook.com/docs/graph-api/reference/user/picture/
zsh + tmux で端末に表示されてる文字列を補完する

===============================================

[zsh + screen で端末に表示されてる文字列を補完する - 2nd life](http://secondlife.hatenablog.jp/entry/20060108/1136650653) の tmux 版。

tmux に移ったころもう不要だと思ってなにもしなかったけど、これ意外と使いたい時があるのよねぇ。

コピペして``.zshrc``にでも貼れば動くと思う。

    HARDCOPYFILE=/tmp/tmux-hardcopy
    touch $HARDCOPYFILE

    dabbrev-complete () {
      local reply lines=80

      tmux capture-pane && tmux save-buffer -b 0 $HARDCOPYFILE && tmux delete-buffer -b 0
      reply=($(sed '/^$/d' $HARDCOPYFILE | sed '$ d' | tail -$lines))

      compadd -Q - "${reply[@]%[*/=@|]}"
    }

    zle -C dabbrev-complete menu-complete dabbrev-complete
    bindkey '^o' dabbrev-complete
    bindkey '^o^_' reverse-menu-complete

ほぼ、screen のコマンド部分を tmux に変えただけ。
一応変更点として、ファイル保存先 /tmp にしたのと``~/Documents``みたいなのの``~``が``\~``にならないようにしたはず。
制限ユーザーを作成する


```bash
# rbashを有効にする
$ ln -s /bin/bash /bin/rbash
$ sudo vim /etc/shells
/bin/rbash

# ユーザー追加
$ sudo groupadd viewer
$ sudo useradd -s /bin/rbash -g viewer viewer
$ sudo rm /home/viewer/.*
$ sudo mkdir -p /home/viewer/bin
$ sudo vim /home/viewer/.bash_profile
PATH=$HOME/bin

# 使用コマンド追加
$ ln -s /bin/grep  /home/viewer/bin/
```