OmniAICreator/Qiita-1.07M huggingface dataset:
Workspaces でクリップボード制御をする方法

# 概要
この記事では、グループポリシーを利用して Workspaces のクリップボードを無効化します。無効化する場合でも、以下に示すように画面から[有効]を選択のうえ、プルダウンから[無効]を指定する必要がありますのでご注意ください。また設定終了後に Windows を再起動してください。

# 実施
AWSのドキュメントは以下の通りです。
http://docs.aws.amazon.com/en_us/workspaces/latest/adminguide/group_policy.html

[mmc]を起動します。
![Screen Shot 2015-02-02 at 1.16.41 PM.png](https://qiita-image-store.s3.amazonaws.com/0/19485/566126e2-3c49-da28-c054-4d830028a481.png)

[スナップインの追加と削除]を選択します。
![Screen Shot 2015-02-02 at 12.57.55 PM.png](https://qiita-image-store.s3.amazonaws.com/0/19485/8598542d-1afb-a2bf-01e0-d738a4459e41.png)

[グループポリシーオブジェクト エディタ]を選択して、[追加]をクリックします。[ローカル コンピュータ ポリシー]をダブルクリックします。
![Screen_Shot_2015-02-02_at_1_04_09_PM.png](https://qiita-image-store.s3.amazonaws.com/0/19485/bb617fc9-8ea7-49b5-5648-85bf3ec06df0.png)

[コンピュータの構成] > [管理用テンプレート] > [テンプレートの追加と削除]をクリックします。
![Screen Shot 2015-02-02 at 1.05.38 PM.png](https://qiita-image-store.s3.amazonaws.com/0/19485/f41c1e8e-d3a4-3a44-7806-e2156fb37981.png)

[追加]をクリックします。
![Screen Shot 2015-02-02 at 1.05.56 PM.png](https://qiita-image-store.s3.amazonaws.com/0/19485/3f45e4f5-fa09-1e84-2e80-5d5ded662a7c.png)

[C:\Program Files (x86)\Teradici\PCoIP Agent\configuration\pcoip.adm]を選択します。
![Screen Shot 2015-02-02 at 1.06.31 PM.png](https://qiita-image-store.s3.amazonaws.com/0/19485/08ed0c73-0d09-bbbc-475c-16006f6656e5.png)

[従来の管理用テンプレート] > [PCoIP Session Variables] > [Override Administrator Defaults]を選択のうえ、[Configure clipboard redirection]をダブルクリックします。
![Screen Shot 2015-02-02 at 1.14.12 PM.png](https://qiita-image-store.s3.amazonaws.com/0/19485/4a10dcde-a10e-6100-ab41-b40e87f1d1c7.png)

[有効]を選択し、プルダウンから[Disalbed in both directions]を選択します。
**※[無効]を選択してもクリップボードを無効化できません。**
※Client → Agent の片方向だけクリップボードを有効化したい場合は、[Enabled client to agent only]を選択します。ユースケースに合わせて切り替えてください。
![Screen Shot 2015-02-02 at 1.15.14 PM.png](https://qiita-image-store.s3.amazonaws.com/0/19485/422bfcff-3728-0f31-771d-0ae2a263e6c8.png)

設定が完了したら、**Workspaces の Windows を再起動**します。
※gpupdate や 再接続 では反映できません。

#免責
個人の見解です。所属する団体や企業とは関係ございません。
[JAWS-UG CLI] AWSアカウント(root)作業 #1証跡関連の設定

AWSアカウント作成直後にCloudTrailの設定をします。 IAMを利用開始する前に設定しておくことが、証跡保存上とても重要です。

#前提条件

- AWSアカウント(root)が必要です。

# 0. 準備

## Trailを作成するリージョンの決定

Trailを作成するリージョンを、下記を参考にして決定します。

- S3のストレージコストが安いこと。 (2015-02-02時点)
  - 米国スタンダード (us-east-1) [独自仕様に注意]
  - オレゴン (us-west-2)
  - アイルランド (eu-west-1)
  - シンガポール (ap-southeast-1)


# 1. 事前作業

## CloudTrailのマネジメントコンソールにアクセス

CloudTrailのマネジメントコンソールにアクセスします。

https://console.aws.amazon.com/cloudtrail/home


# 2. 本作業

## 2.1. CloudTrailの有効化

- "今すぐ始める"ボタンをクリックします。



## 2.2. CloudTrailの設定


- 以下を入力します。

:証跡名: all
:証跡情報を全てのリージョンに適用: はい
:新しい S3 バケットを作成しますか: はい
:S3 バケット: (S3バケット名)

-    "有効化"ボタンをクリックします。


# 3. 事後作業

## 3.1. CloudTrailの設定の確認

一覧の'all'をクリックします。

画面の右上の"ログ記録"がOnと表示されていれば、証跡は有効になっています。

設定後しばらくして画面をリロードすると、"配信された最後のログファイル"という文字列と日時情報が表示されます。 これは、先程のCloudTrailを有効にしたときの操作ログが早速S3に保存されたことを示しています。


## 3.2. APIアクティビティ履歴の確認

"API アクティビティ履歴"(リンク)をクリックします。
"配信された最後のログファイル"が表示された後であれば、以下の4つのイベントが表示されているはずです。

- CreateTrail
- StartLogging
- CreateBucket
- PutBucketPolicy


## 3.3. S3バケットの確認

https://console.aws.amazon.com/s3/home にアクセスして、CloudTrail用のバケットが存在することを確認してください。

"配信された最後のログファイル"が表示された後であれば、以下のバケットの下にログが保存されているはずです。

- バケット名 / AWSLogs / AWSアカウントID / CloudTrail / リージョン名 / 年 / 月 / 日 /



# 完了

次に、IAM関連の設定を行います。

http://qiita.com/tcsh/items/6f297076935fa6a06044
RSpec3でCapybaraのinclude

# 背景
[Ruby on Rails チュートリアル](http://railstutorial.jp/)を参考に、``Rails 4.2.0``と``RSpec 3.1.7``でWebアプリケーションの作成を行っている際、チュートリアルとのバージョンの違い（チュートリアルは``RSpec2``）により、Capybaraのincludeでハマってしまいました。

# 問題
[Rails Tutorial 3.2.1](http://railstutorial.jp/chapters/static-pages?version=4.0#sec-TDD)では、Capybaraを取り込むには下記の通りに``spec/spec_helper.rb``に追記しろとありましたが、RSpec3で同様のことを行った場合、``\`block in <top (required)>': uninitialized constant Capybara (NameError)``と出て怒られてしまいました。

```ruby:spec/spec_helper.rb
RSpec.configure do |config|
  .
  .
  .
  config.include Capybara::DSL
end
```

# 解決
調べてみたところ、RSpec3から``spec/rails_helper.rb``というファイルが新たに登場したとのことです。[GithubのREADME](https://github.com/rspec/rspec-rails)を見たところ、確かに[The default helper files created in RSpec 3.x have changed](https://www.relishapp.com/rspec/rspec-rails/docs/upgrade#default-helper-files)というリンクがあり、デフォルトで作るhelperが変わったよ！と書いてあります。すごく雑に読み解くと、今後は``spec/rails_helper.rb``に書いてね！ってことらしいです。

というわけで、以下の通りに実装してみたところ、無事にCapybaraさんが動くようになりました。

```ruby:spec/rails_helper.rb
RSpec.configure do |config|
  .
  .
  .
  config.include Capybara::DSL
end
```

# 追記
RSpec3 での Capybara を使用した E2E テストは`spec/features`以下に書くのが正道なようです。
`spec/features`以下では Gem さえ入っていれば、特に設定なく Capybara の DSL が使えました。
iPhone6サイズ　ペーパープロトタイピング用 PDF フォーマット

iPhone6 サイズのペーパープロトタイプ用PDFフォーマットです。
【ダウンロードはこちらから】
http://www.hugkey.com/798/

![スクリーンショット 2015-02-02 12.41.07.png](https://qiita-image-store.s3.amazonaws.com/0/6688/3f4b2b7d-83d1-7293-c982-b979e32c210e.png)



A4サイズでプリントアウトすると、iPhone6とだいたい同じくらいのサイズになります。
http://www.hugkey.com/798/




iPhone5サイズはこちらから。
http://www.hugkey.com/302/
Restart php-fpm, my way


Edit file `/bin/php-fpm-restart`

```shell-session
#!/bin/sh

x=$(ps -cx -o pid,command | awk '$2 == "php-fpm" { print $1 }')
kill $x

/usr/local/php/sbin/php-fpm
```

Make it executable

```
chmod a+x /bin/php-fpm-restart
```
HTTPプロキシの設定パラメータとは、構成ファイルとは、自動検出とは

OS問わず、HTTPアクセスするネイティブアプリを作ろうとすると避けて通れないのがプロキシの設定です。

プロキシのために一体どんな設定項目を設けてどうプログラミングすべきかについて一応の答えをまとめましたのでご参考までに。

前提、プロキシ情報とは
---
プロキシ設定情報とはHTTPアクセスするときに使うプロキシのURL、ぐらいに思っていたこともありました。
しかしそう単純ではない。除外アドレスというものが必ずありますし、http:, https:, ftp:それぞれのプロトコルで別々のプロキシを使わないといけないかもしれない。
そういういろいろも含めると、プロキシ設定情報とはこうだと言えます—— **アクセス先URLを受け取ってプロキシURLを返す関数** であると。

急に観念的な話をしたみたいで驚かせてしまったらすみません。しかし関数だってのは本当で、実際にJavascript で関数を記述してそれをプロキシ設定にだってできるんです。

ではまずはそれの話から。

PAC - Javascript関数定義によるプロキシ設定
---
JSでFindProxyForUrlという関数を記述したファイルを書くと、それはプロキシ設定として機能します。WindowsでもMacでもスマホOSでも。この設定形式をPAC（Proxy Auto-Config）と呼びます。

Windowsならインターネット オプションの画面から「自動構成スクリプト」として登録できます。
![proxy-setting.png](https://qiita-image-store.s3.amazonaws.com/0/2852/8fe0d60d-ed45-c327-dcc3-eb9899c43c34.png)
このダイアログだと上から二番目のところですね。PACファイルをURLで指定します。http:// も file:// も両方使えていいのですが、 file:// は推奨されていません。

WPAD - PACの配信
---
上述したPACファイル、通常はユーザーが自分でマシンに設定する機会はあまりありません。なぜなら、LAN内で配信して各マシンは自動取得するように構築できるので、そうすることが多いからです。この配信規格がWPAD（Web Proxy Autodiscovery）です。
詳しくは別途調べてもらうとして、

* DHCPでオプション情報としてPACアドレスを配る
* http://wpad.（組織内ドメイン）/wpad.dat というリソースを読みに行く

のどちらかの方法でPACを手に入れます。

Windows の場合だと「設定を自動的に検出する」にチェックを入れることで利用できるようになります。

つまりプロキシ設定の画面構成は
---
プロキシ設定を入力させるに当たって考慮点は以上のようなものがあるわけです。これに、単純なプロキシアドレス入力も含めるとどう整理できるか。

まず、判断のフローです。与えられたURLに対してプロキシが必要か、必要ならどこを使うかは、

1. WPADは有効か。有効なら、PACファイルの取得に成功したか。 → 取得したPACに従って判断
2. PACアドレスの直接指定はあるか。あるならそこからPACファイルの取得に成功したか。 → 取得したPACに従って判断
3. プロキシURLと除外アドレスの直接指定はあるか。 → これらから判断

と、こういう判断を踏まないとなりません（以上を自分でプログラミングする必要があるとは限りません。Win32だとまとめてやってくれるAPIコールが用意されています）。

ともかくこれらの判断に必要な入力項目を組み上げると、こうなります。

* ☑プロキシの自動取得をする
* ☑プロキシ構成スクリプトを指定する【入力欄】
* ☑プロキシサーバを指定する【入力欄】 除外アドレス【入力欄】

結局のところ、OSの設定ダイアログとほぼ同じ構成になりました。
それに加えて、アプリの場合は「OSの設定に従う」という選択肢があるはずですね。それも加えると、こう。

* ☑OSのプロキシ設定に従う（ONだと以下3項目がグレーアウト）
* ☑プロキシの自動取得をする
* ☑プロキシ構成スクリプトを指定する【入力欄】
* ☑プロキシサーバを指定する【入力欄】 除外アドレス【入力欄】

簡易版、ユーザーにあまりプロキシについて難しいことを考えさせたくない場合などは

* ☑OSのプロキシ設定に従う（ONだと次項目がグレーアウト）
* ☑プロキシサーバを使用する【入力欄】
 
という風になりますか。OSのプロキシ設定に従う場合は、WPAD,PACも含めた正式な判断が走りますが手動設定だと使うか使わないかだけです。

プログラミング
--
Win32の場合、必要な入力項目を揃えればあとは次の2つのAPIですべきことが全部できます。

* [WinHttpGetIEProxyConfigForCurrentUser](https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa384096(v=vs.85).aspx) 関数: OSのプロキシ設定を取得します
* [WinHttpGetProxyForUrl](https://msdn.microsoft.com/en-us/library/windows/desktop/aa384097%28v=vs.85%29.aspx) 関数: プロキシの各種設定とアクセス対象URLを引数に、プロキシを使用するか・使用するならどれかを返します

最後に - 「プロキシを自動検出する」という言葉に気をつけて！
--
「プロキシを自動検出する」といった場合、

* OSからプロキシ設定を取得する
* LANからプロキシ設定を取得する

というレイヤーの違う別々の自動を意味する場合があります。自動検出と言われた場合、意味の確認をお忘れなく。
Jenkins Workflow pluginでビルドのパラメータを取得する

## やりたかったこと
* ビルドのパラメータをWorkflow内で参照する
* Buildflow pluginでいう params['VAR1']

## 結論
* ~~[yasuhirokiさんの記事](http://qiita.com/yasuhiroki/items/9d96af7538975358d175) に書かれてるやり方で取れました~~
* ~~パラメータを取るだけですが結構大変です~~
* 【訂正】単にパラメータを参照するだけならば VAR1 だけで取れました
    * 受け取ったパラメータを全部取りたいような場合はyasuhirokiさんの記事のようにするとよいようです
    * 以下に書くのは全部取り出したい場合、下流ジョブに全パラメータを渡すような場合に使えそうです(がちょっと扱いにくそう)
    * 教えていただいたyasuhirokiさんに感謝！

----

![スクリーンショット 2015-02-02 11.59.46.png](https://qiita-image-store.s3.amazonaws.com/0/22341/58c03fdf-98bf-6ad9-f2b6-c18a6c2c5f1d.png)

#### Script (Groovy CPS DSL)
```
current_env = this.getProperty("env"). getEnvironment()
current_build = Jenkins.instance.getItemByFullName(current_env['JOB_NAME']).getBuildByNumber(current_env['BUILD_NUMBER'].toInteger())
current_params = current_build.getActions(ParametersAction.class). parameters[0]

echo "current_env: ${current_env}"
echo "current_build: ${current_build}"
echo "current_params: ${current_params}"
```

#### 結果
```
current_env: [BUILD_DISPLAY_NAME:#5, BUILD_ID:5, BUILD_NUMBER:5, BUILD_TAG:jenkins-TEST-workflo-params-5, BUILD_URL:https://your-domain.com/ci/build/job/TEST-workflo-params/5/, CLASSPATH:, HUDSON_HOME:/var/lib/jenkins, HUDSON_SERVER_COOKIE:37c38c47b14a0acf, HUDSON_URL:https://your-domain.com/ci/build/, JENKINS_HOME:/var/lib/jenkins, JENKINS_SERVER_COOKIE:37c38c47b14a0acf, JENKINS_URL:https://your-domain.com/ci/build/, JOB_NAME:TEST-workflo-params, JOB_URL:https://your-domain.com/ci/build/job/TEST-workflo-params/]

current_build: TEST-workflo-params #5

current_params: [(StringParameterValue) VAR1='hoge', (StringParameterValue) VAR2='fuge']
```

## できなかった
* 当然 params['VAR1'] では取れませんでした(エラー)

> groovy.lang.MissingPropertyException: No such property: params for class: WorkflowScript

* env.VAR1 でもしかして、と思ったけど取れませんでした(エラーにはならなかったけどnull)

> null
DrawerLayoutをタッチすると、下のアイテムのタッチイベントになる問題の対策(Mapだけ？)

##DrawerLayout on MapFragment
以下のようなレイアウトでアプリ実行、DrawerLayoutを引き出した後にTextViewをタップすると、MapFragmentのタッチイベントが発火してしまっていた。

```lang:activity_main
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- The main content view -->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">
        <fragment xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
            android:layout_height="match_parent" android:id="@+id/map" tools:context=".MapsActivity"
            android:name="com.google.android.gms.maps.SupportMapFragment"
            android:layout_alignRight="@+id/fragment"
            android:layout_alignEnd="@+id/fragment" />
    </LinearLayout>

    <!-- The navigation drawer -->
    <LinearLayout
        android:id="@+id/right_drawer"
        android:orientation="vertical"
        android:layout_width="320dp"
        android:layout_height="match_parent"
        android:layout_gravity="end"
        android:background="#DDDDDD"
        android:paddingRight="16dp"
        android:paddingTop="8dp"
        android:paddingBottom="8dp"
        android:paddingLeft="56dp">
        <TextView
            android:id="@+id/drawer_address_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:text="null" />

        <ListView android:id="@+id/drawer_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:choiceMode="singleChoice"
            android:divider="@android:color/transparent"
            android:dividerHeight="0dp"
            android:paddingTop="8dp"
            android:paddingBottom="8dp"
            android:paddingLeft="8dp" />
    </LinearLayout>
</android.support.v4.widget.DrawerLayout>
```

##ダメだった対策
getParent().requestDisallowInterceptTouchEvent(true); をする。
参考：http://blog.livedoor.jp/txmy/archives/52182923.html
→ダメでした

##動いた対策(?)
DrawerLayoutの一番上のViewのClickableをtrueにする。
今回の場合なら(idがright_drawerのLinearLayout).setClickable(true);ですね
自分はコード上でやったけど、layoutのxmlでandroid:clickable="true"にしても一緒だと思う
参考：http://stackoverflow.com/questions/21380317/navigation-drawer-disable-backview-when-drawer-open
→オッケー
Docker内のCronでCannot make/remove an entry for the specified sessionとか言われた時の対処法メモ


はじめに
======

DockerでCronを動かそうとしたら

`Cannot make/remove an entry for the specified session`

と出て動かなかった時の対処法メモです。

Versionや構成
----------

Docker内のVersionです。

* CentOS release 6.6 (Final)
* SupervisordでCronを起動
* CentOSのベースイメージからそんなにいじってない環境

問題
=======

症状
------

Cronを実行しようとすると、
/tmp以下に以下のようなログが出ていてCronが実行されていません。

```text:tmp/crond-stderr---supervisor-oAgn26.log 
Cannot make/remove an entry for the specified session
```

対策
------

http://stackoverflow.com/questions/21926465/issues-running-cron-in-docker-on-different-hosts

のように

`/etc/pam.d/crond` の pam_loginuid.so をコメントアウトします。

```text:/etc/pam.d/crond
#
# The PAM configuration file for the cron daemon
#
#
# No PAM authentication called, auth modules not needed
account    required   pam_access.so
account    include    password-auth
# session    required   pam_loginuid.so     ← これをこんな風にコメントアウト
session    include    password-auth
auth       include    password-auth
```

そして `sudo service crond restart` で crond を再起動します。

さいごに
=========

PAMとかあまりよくわかってなく動けばいいや的な感じでやっているので、
この対処法では問題がある場合はご指摘いただければ幸いです。
signal_ > 入力したキーのシグナルを見つける > stty -a

動作環境

    CentOS 6.5
    

Ctrl+Cなどを入力した時にSIGXXX(XXX:は任意)のどれに対応するかなどを見つけたい時、

    stty -a
を実行する。

結果は下記のように表示される。

    ...
    intr = ^C; quit = ^\; ...
    ...
Ctrl+Cの場合はintr(SIGINT)に割り当てされていることがわかる。

さらに詳細な説明は以下がわかりやすい。
http://equj65.net/tech/linuxprocessgroup/
gitで過去のコミットを修正したい

※【修正しました】SourceTreeを使うとうまくいかないことが何回かあったので、SourceTreeは使わずにコマンドラインを使って作業します。

このコミットを修正したい、とします。

![opencv-python_p150121__Git_3.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/1b87e9d8-8d03-4483-84b1-ce57cf5b0e98.jpeg)

具体的には、「この行を書かなかった」ことにしたい、とします。

![opencv-python_p150121__Git_4.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/652026f8-7a15-3162-b563-67aeae4204c6.jpeg)

下準備としてgitのeditorを指定しておきます。

```text:~/.gitconfig
...
[core]
        editor = /usr/bin/vim
        ...
...
```

まず修正したいコミットの一つ前のコミットのハッシュをコピーします。

![opencv-python_p150121__Git_5.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/e74d98c0-c45f-a2a9-a51f-fd6a58accbbb.jpeg)

コンソールから以下のように打ちます。

```shell-session
$ git rebase -i c06c668
```

するとこんなvim編集中の画面が現れます。

![opencv-python_p150121_—_vim_—_80×24.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/a0b6bbe5-2ef1-0414-d6fd-939860977124.jpeg)

修正したいコミットを「edit」に変えて保存します。

![opencv-python_p150121_—_vim_—_80×242.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/1e3920fd-355e-ed1b-55d8-ae3737828c95.jpeg)

するとこんな画面が表示されます。

![opencv-python_p150121_—_bash_—_80×243.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/da08c623-8073-b471-7eb8-aeaf33a62876.jpeg)

SourceTreeで見ると、このようになっています。

![opencv-python_p150121__Git_6.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/79f77851-2e08-bf63-922a-553c1c775ea3.jpeg)

修正します。

```shell-session
$ vi convertImage.py
```

するとSourceTreeは、こんな感じになります。

![opencv-python_p150121__Git_7.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/1e20ae31-ce0a-c9a5-60e0-bb65d9fc6212.jpeg)

コミットします。

```shell-session
$ git commit --amend
```

残りのコミットを適用します。

```shell-session
$ git rebase --continue
```

途中でコンフリクトが起きたときは普通に対処し、再度`git rebase --continue`します。

これで過去のコミットが書き換わります。

今回の記事の内容は全面的に[@utwang](https://twitter.com/utwang)くんに教えてもらったものです。感謝！

（SourceTree単体でやる方法があれば、ぜひ教えて下さい）

---
ブログやってます：[Weed software](http://weed.cocolog-nifty.com/wzero3es/)
nodejsの標準出力でttfフォントをcssに変換する

baseuri使ってますか？小さいファイルは、[datauriを使って](http://qiita.com/cognitom/items/3134467210e0022f4a02)、どんどんcssに[しまっちゃいましょう](https://www.youtube.com/watch?v=wn367h7-LUg)。

お手持ちのターミナルか、[cmder](http://bliker.github.io/cmder/)を起動して以下を入力します。

# 出力

```bash
$ node -p '(new Buffer("hoge")).toString("base64")'
# aG9nZQ==

$ node -p '(new Buffer(((new Buffer("hoge")).toString("base64")),"base64").toString("utf8"))'
# hoge
```
はい、ワンライナーですね。

# 保存
```bash
$ node -p '(new Buffer("hoge")).toString("base64")' > hogekosan.txt
$ more hogekosan.txt
# aG9nZQ==

$ node -p "(new Buffer(require('fs').readFileSync('./hogekosan.txt').toString(),'base64').toString())"
# hoge
```

標準出力なので、最後に`> filename`を足すと、出力を保存できます。

# 加工
```bash
$ node -p '"data:text/plain;base64,"+(new Buffer("hoge")).toString("base64")'
# data:text/plain;base64,aG9nZQ==
```

文字連結で[datauriスキーマ](http://ja.wikipedia.org/wiki/Data_URI_scheme#.E6.9B.B8.E5.BC.8F)に加工できますね。

`data:text/plain;base64,aG9nZQ==`

をコピペしてブラウザで開けば、テキストファイルとして表示できます。

# nodejsの標準出力でttfフォントをcssに変換する
さいきん美咲フォントの作者が、[k8x12というフォント](http://www.geocities.jp/littlimi/k8x12.htm#download)を公開されたので、これをcssにdatauriとして埋め込んで、htmlで表示します。

```html:k8x12.htmlイメージ
<style>
@font-face{
  font-family:"k8x12";
  src:url(ここにブチ込む) format('truetype');
}
h1{
  font-family:"k8x12";
}
</style>
<h1>やったぜ。</h1>
```

公式サイトでttfのzipをダウンロードして、その中の`k8x12.ttf`を変換します

```bash
node -p "'<style>@font-face{font-family:\"k8x12\";src:url(data:application/x-font-ttf;base64,'+require('fs').readFileSync('./k8x12.ttf').toString('base64')+')format(\"truetype\");}h1{font-family:\"k8x12\";}</style><h1>やったぜ。</h1>'" > k8x12.html
```

k8x12.html

![スクリーンショット 2015-02-02 11.01.05 AM.png](https://qiita-image-store.s3.amazonaws.com/0/28576/3bd700fa-6d6a-e70b-e6a7-78d3a3e95b23.png)

やったぜ。
Python2.7.9にアップデート

```bash
$ sudo wget https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz
$ tar zxvf Python-2.7.9.tgz
$ cd Python-2.7.9/

$ ./configure --with-threads --enable-shared
$ make
$ sudo make install

### 確認
$ python -V

### 下記エラーが出るかもしれない。
# python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory
# リンクを貼る
$ sudo ln -s /usr/local/lib/libpython2.7.so.1.0 /lib64/

# 再度確認
$ python -V
Python 2.7.9
```
UIButtonのタイトルを変更する時にアニメーションをオフにする（RubyMotion）


`viewDidLoad`の中で一度セットした`UIButton`のタイトルをその後変更したいときの方法。

普通に`setTitle:forState:`だけ使ってタイトルを変更すると、アニメーションが入ってボタンのタイトルが一度消えたような（ちらついたような）感じになってしまうので、ちょっとだけコードを加える。

```ruby:test_view_controller.rb
class TestViewController < UIViewController
  def viewDidLoad
    super
    
    ...
    
    testView = TestView.setContent self
    
    ...
    
    self.view.addSubview testView
  end
end
```

```ruby:test_view.rb
class TestView < UIScrollView
  attr_accessor :hogeButton

  def setContent(controller)
    self.alloc.initWithFrame(controller)
  end
  
  def initWithFrame(controller)
    super(controller.view.bounds)
  
    ...
    
    hogeButton = UIButton.buttonWithType(UIButtonTypeSystem).tap do |b|
      ...
      
      b.setTitle("hogehoge", forState: UIControlStateNormal)
      
      ...
    end
    self.hogeButton = hogeButton
    
    # ボタンのタイトルを変更
    changeButtonTitle
    
    ...
  end
  
  
  def changeButtonTitle
    Dispatch::Queue.concurrent.async do
      ...
    
      Dispatch::Queue.main.async do
        UIView.setAnimationsEnabled false
        
        self.hogeButton.setTitle("fugafuga", forState: UIControlStateNormal)
        self.hogeButton.layoutIfNeeded
        
        UIView.setAnimationsEnabled true
      end
    end
  end
end
```

タイトル変更時は`setAnimationsEnabled:`でアニメーションをオフにしておく。
さらに`layoutIfNeeded`を呼んでレイアウトを変更する。


これで、ボタンのタイトルの文字の変更が、自然な感じになった。
git patch (masterで修正した内容を、別ブランチに切り直す)

「masterで修正した内容を、別ブランチに切り直してプルリク出したい！」
ってときに使います。


# patch用のデータ抽出

```bash
### 修正内容を吐き出します
$ git diff HEAD~ 更新したファイル名 > thisis.patch
```

# patchする

```bash
### tmpあたりに当たらしくgit clone
$ cd /tmp
$ git clone リポジトリURL

### branchを切る
$ sudo git checkout -b ブランチ名

### パッチしても問題なさそうかテストする
$ patch --dry-run -p1 < thisis.patch
# -p1・・・ファイル階層から1階層無視する。

### patchする
$ patch -p1 < thisis.patch

### 確認
$ sudo git diff

### merge, push
$ git commit -m "修正" 更新したファイル名
$ git push origin HEAD
```
Git で 誤って master ブランチを編集してしまったとき

development 等のブランチを作成して作業するはずがブランチの切り替えを忘れて、
ガッツリ master ブランチで作業をしてしまったときのメモ。

# 作業内容を退避

まずは master で作業した内容を退避させる。

```
$ git stash save 
```

これで master ブランチは作業前の状態に戻る。

# 新ブランチで作業内容を復元

次に作業用ブランチで master で行った作業内容を復元する。

```
$ git checkout -b development
$ git stash pop
```

これで master で作業していた内容がそのまま development に復元される。
ブレイクアウトボード接続方法

参考にしたサイト  https://learn.adafruit.com/adafruit-micro-sd-breakout-board-card-tutorial?view=all




![image](https://qiita-image-store.s3.amazonaws.com/0/67795/5640e655-6ed7-727f-dfa9-65f4f2a9b9f8.png)


5V は5V
GND はGND 
CLK が pin 13 
 DO が pin 12 
 DI が pin 11 
 CS が pin 10 





```



#include <SD.h>//breakeaut borde micro sd  sprak  fan
 
File myFile;
 
void setup()
{
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
   pinMode(10, OUTPUT);
 
  if (!SD.begin(10)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
 
  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);
 
  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");　　//ここを書き込む
	// close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}
 
void loop()
{
	// nothing happens after setup
}
```
プロジェクト内のWindowsフォーム（クラス）のコピー手順

０．準備としてソリューションのバックアップを作成する

１．ソリューションエクスプローラー上でCTRL+C,CTRL+Vでコピーする
>「hogehoge.vb」をコピー＆ペーストすることで
>「hogehoge - コピー.vb」が作成されます

２．「hogehoge - コピー.vb」フォームのクラスをクリックし、実装部分(ソース)を表示状態する
>「Public Class hogehoge」が表示され、クラス名が波線表示されます

３．クラス名が衝突しているので、コピー先のクラス名に変更する
>「Public Class piyopiyo」に変更するとクラス名の波線表示が解除されます

４．フォームファイル名「hogehoge - コピー.vb」をクラス名に準拠したファイル名に変更する
>「hogehoge - コピー.vb」を「piyopiyo.vb」にリネームします

ＰＳ．継承することも視野に入れてください
Genymotionでsuによるroot端末チェックを回避する

Superuserのアプリにて
Settings -> Superuser Access -> Disabledとしていても

```java:MainActivity.java
String message = "Fail. ";
try {
    Process process = Runtime.getRuntime().exec("su");
    process.destroy();
    message = "Success.";
} catch (IOException e) { message += "IOException - " + e.getMessage();
} catch (Exception e) { message += "Exception - " + e.getMessage(); }
```

のようなコードで試してみると、su自体が存在するせいか実行に成功してしまう。そのためにアプリのroot端末チェックを回避できない。よって、suを実行できないようにしてやればよい。

I. system領域を確認

```shell-session
/Users/bloodysnow% adb shell

root@vbox86p:/ # mount
rootfs / rootfs ro,relatime 0 0
tmpfs /dev tmpfs rw,nosuid,relatime,mode=755 0 0
devpts /dev/pts devpts rw,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
debugfs /sys/kernel/debug debugfs rw,relatime 0 0
tmpfs /mnt/secure tmpfs rw,relatime,mode=700 0 0
tmpfs /mnt/asec tmpfs rw,relatime,mode=755,gid=1000 0 0
tmpfs /mnt/obb tmpfs rw,relatime,mode=755,gid=1000 0 0
/dev/block/sda6 /system ext4 ro,relatime,data=ordered 0 0
/dev/block/sdb1 /cache ext4 rw,nosuid,nodev,relatime,data=ordered 0 0
/dev/block/sdb3 /data ext4 rw,nosuid,nodev,relatime,data=ordered 0 0
/dev/block/sdc /mnt/shell/emulated vfat rw,relatime,fmask=0000,dmask=0000,allow_utime=0022,codepage=cp437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro 0 0
```

/dev/block/sda6が/systemとしてマウントされているようだ。

II. system領域を書き込み可能で再マウントする

```shell-session
root@vbox86p:/ # mount -o rw,remount /dev/block/sda6 /system
```

III. suを適当な名前にrename

```shell-session
root@vbox86p:/ # mv /system/bin/su /system/bin/sux
```

最初のテストコードを実行してみると、IOExceptionが発生するようになり、root端末チェックを回避できるようになった。
Nokogiriを使用したクローラーめも

##文字コードの変更
```
require 'kconv'

str = "日本語の文字列"

puts str.tosjis => shift_jisに変換
puts str.toutf8 => utf-8に変換
```

##Nokogiri
###NodeとNodeSetとElement
NodeとNodeSetの違いについて理解する必要がある。
####Nodeset
Nodeを格納したリスト型は配列

####Node
NodeSetに格納されているもの
(例)

```
require 'nokogiri'
require 'open-uri'

html = open("http://XXXXXXX")
doc = Nokogiri::HTML.parse(html, nil, "UTF-8")

nodesets = doc.xpath('//title')
puts nodesets.text
puts nodesets.inner_text
puts nodesets.first_inner_text

nodesets.each do |nodeset|
puts nodeset.text
puts nodeset.inner_text
end
```

###検索系のメソッド

```
doc.at('//title')  => 検索にヒットした最初のノード

doc.at_xpath('//title')  => xpathの検索にヒットした最初のノード

doc.at_css('title')  => cssの検索にヒットした最初のノード

doc.css('title')  => cssで検索。Nodeset

doc.css('title')[0]  => cssで検索。NodeSetから最初のノード

doc.xpath('//title')  => xpathで検索。最初のNode

doc.xpath('//title')[0]  => xpahtで検索。NodeSetから最初のNode

doc.search('title')
xpathかcssで検索。NodeSet

doc.search('title')[0]  => xpathかcssで検索。NodeSetから最初のNode
```


##Nokogiriの検索・参照系メソッド

####at
cssかxpathで検索し、ヒットした最初のElementをとりだす

####at_css
cssで検索し、ヒットした最初のElementをとりだす

####at_xpath
xpathで検索し、ヒットした最初のElementをとりだす

####css
cssで検索し、NodeSetを返す

####xpath
xpathで検索し、NodeSetを返す

####search
cssかxpathで検索し、NodeSetを返す

####content
コンテンツ(タグで囲まれた部分)を返す

####inner_html
タグ内のHTMLを返す

####inner_text
タグ内のテキスト文を返す

####to_html
要素全体を返す

####to_s
要素全体を返す

####to_str
stringで返す

####to_xhtml
要素全体を返す

####to_xml
要素全体を返す

##便利なやつ

###Google

指定した文字を検索させ、検索結果を取得する

```
require 'google-search'

Google::Search::Web.new(:query => 'クローラー').each do |item|
puts item.url
puts item.title
end

```

**Google Custom Search APIを使用するのあり**

###Amazon

**Product Advertising API**


###Twitter
**Twitter Streaming API**


###Facebok
**Facebook Graph API**
ngx_luaのコードをCLIで実行できるresty-cliが超便利な件

nginxを拡張する上でとても便利なngx_luaですが、nginx上でコードが実行される性質上、非常に簡単なコードを実行する場合でも`curl`等でHTTPリクエストを送る手順が必要でngx_luaによるアプリケーションを開発・デバッグする際に面倒だと感じることがよくありました。

## resty-cliの登場

しかし、昨年末に[resty-cli](https://github.com/openresty/resty-cli)というモジュールが[OpenResty](http://www.openresty.com/)に加わりました。これを使うとngx_luaのコードをCLIで実行できます。

https://github.com/openresty/resty-cli


## resty-cliをインストールする

[resty-cli](https://github.com/openresty/resty-cli)は最新の[OpenResty](http://www.openresty.com/)に含まれているので、利用するにはOpenRestyごとインストールすると楽です。

```console
$ wget http://openresty.org/download/ngx_openresty-1.7.7.1.tar.gz
$ tar ngx_openresty-1.7.7.1.tar.gz
$ cd ngx_openresty-1.7.7.1
$ ./configure
$ make
$ sudo make
```

## resty-cliでngx_luaのコードを実行する

[resty-cli](https://github.com/openresty/resty-cli)の実態は`resty`という名前の単一のPerlスクリプトです。こんな感じでインラインコードを実行できます。

```consle
$ /usr/local/openresty/bin/resty -e 'ngx.say("nginx")'
nginx
$ /usr/local/openresty/bin/resty -e 'print(ngx.now())'
1422835556.82
$
```

CLIですが、ngx_luaのコードが実行できました。上記のは非常に簡単な例ですが、[lua-resty-mysql](https://github.com/openresty/lua-resty-mysql)や[lua-resty-redis](https://github.com/openresty/lua-resty-redis)のようにngx_luaのAPIをバリバリ使っているモジュールのコードも実行できます。

一方で多少制限もあってすべてのAPIが`resty-cli`で実行できるわけではありません。例えばnginxの内部変数を参照しようとするとエラーになります。

```console                                                                                                                                                           
$ /usr/local/openresty/bin/resty -e 'ngx.say(ngx.var.nginx_version)'
(command line -e):1: API disabled in the current context
$
```

とはいえその他のresty系モジュールも普通に実行できるのでngx_luaを使って開発しているエンジニアなら[resty-cli](https://github.com/openresty/resty-cli)を使わない理由はないと言ってよいでしょう。
ngModelのFormattersとParsersの使い方

inputの入力と出力に変換を挟ませるやり方

```javascript:例
/**
 * inputの値をcurrencyCodeを元にフォーマットする
 *
 * usage:
 *  <input type="text" amount-format="currencyCode">
 */
context.app.directive("amountFormat", function ($parse:ng.IParseService) {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function (scope:ng.IScope, element:ng.IAugmentedJQuery, attrs:ng.IAttributes, ngModel:ng.INgModelController) {
            var currencyCode = $parse(attrs["amountFormat"])(scope);
            var currencyInfo =  Currency.getInformationByCode(currencyCode);
            var offset = currencyInfo.map((x)=>x.offset).getOrElse(1);

            // model から view へ
            ngModel.$formatters.push(function toView(amount) {
                if(_.isUndefined(amount)) {
                    return NaN;
                }

                return parseFloat((amount / offset).toFixed((offset == 100) ? 2 : 0));
            });

            // view から model へ
            ngModel.$parsers.push(function(amount) {
                return (amount * offset).toFixed(0);
            });
        }
    };
});

```
markdownベースのスタイルガイドジェネレーター Styledown


[Styledown](https://github.com/styledown/styledown)についての話。あんまり日本語記事がなさそうなので

# デザインスタイルガイド
存在自体は割りとメジャー感出てきた気がするデザインのスタイルガイド。
生成ツールとして有名どころはだいたい下記な感じではなかろうか

- KSS
- Kalei
- Styledocco

今まで自分の体験ではKSSをがっつり使ってみたりStyledoccoはちょっと触ったりとか。
でもkssはkss-railsがどうもイマイチだったりで再度使うのもなあ、と思ったりで新しくスタイルガイドを作る上で再選定を考えて[The styleguide guide](http://vinspee.me/style-guide-guide/)とかでstyledownというのにぶちあたった。


特徴としてはこんな感じ

- Markdownで記載
- CSSのコメントとしても書けるし分離したmarkdownファイルでも書ける
	- 個人的には分離した.mdファイルがおすすめ（理由は後述）
- サンプルのHTMLコードに **jade** が使える
	- これかなり魅力。サンプル書くのがすごい楽。
- headタグ部分やレイアウトもmarkdwon + jadeで記載

# Usage
すげーシンプルで[公式](https://github.com/styledown/styledown)見ればだいたいわかるのでざっくり

#### cssコメントモードでの記法

ほぼ公式通りですがこんなん。styledoccoチックなものなんで特に何がという感じでもないですね。

```compoennt.css
/**
 * コンポーネント名:
 * `.button` - このへんマークダウンで記載
 *
 *     @example
 *     .button
 *       h3 Sample code
 *       p goes here
 */

.your-component-here {
  display: block;
  ...
}
```

こんな感じだけど雑感を下記に

- 結構コメントの記述がだいぶシビアで、上記のようなちゃんとしたブロックコメントでないと今のところダメらしい。
	- なのでこのモードを使うならstyledoccoとかでいいかもと思ってしまう。
	- この問題は[Issue](https://github.com/styledown/styledown/issues/3#issuecomment-62667881
)としては上がっているのでいつか解決されることを期待したいところ。
- 一応ソースを見るとcss,　scss, jadeあたりは上記で書ける模様。

#### markdownモード

個人的にはこっちのほうが好き。

```compoennt.md
### Button
`.button` - ボタンです 

    @example
	a.button Button
	a.button.primary Button
```

罠としてはh1にあたる`# hoge`のような記載をするとその下から全部表示されなくなること。
configとして認識される模様？。

こっちをメインで使ってみると、実はこいつの比較対象はKSSやstyledoccoなどではなく[Styleguide Boilerplate](http://bjankord.github.io/Style-Guide-Boilerplate/)、または[Assemble](http://assemble.io/)のような静的サイトジェネレーターみたいなものなんじゃないかと思う。

#### build

公式に乗っているのはこんな感じ。

```sh
$ styledown css/*.css css/config.md > styleguides.html
```

ちょっとこれしばらくわかっていなかったんだけどこういうことらしい。

```sh
$ styledown 対象ファイル configファイル > 出力
```

最後のパラメータがconfigであるというわけではなく、読み込んだものの最後の`h1`ブロックがconfigとして使われているよう。

#### configファイル

レイアウトファイルという言い方のほうがイメージつきやすいかも。

```sh
$ styledown --conf > config.md
```

で生成するデフォルト設定が生成できる。
こなれてくるまではデフォルトでよさそう。

### gulp / grunt

どちらもある。けどまだまだstar数とか少ないしまだまだマイナー感高い。

- https://github.com/drakeh/grunt-styledown
- https://github.com/st44100/gulp-styledown

# まとめ
- 全体的にシンプルで好き
- markdown + jade でさくさく書けるのとてもいい
- cssに埋め込む記法はだいぶ融通が効かなくて今はだいぶ辛い
- 個人的には上記の理由でmarkdownファイルに別途記載するやり方がおすすめ
- KSSやstyledoccoとの比較というより[Assemble](http://assemble.io/)のような静的サイトジェネレーターの特化版とかんがえると良い。
- config.mdをいじれば色々できる
SDWebImageのダウンロード処理を、ネットワークのステータスに応じて制御する


Reachabilityを使って制御する。
あくまでもダウンロードキューに対しての停止であるため、ダウンロード実行中のタスクを確実に止められる保証はないので、リトライ処理も別途考慮すべき。

ちなみに、`initialize`メソッドは、クラス初期化時に自動的に実行されるメソッドです。


```objectivec
@implementation APIManager

/*!
    @note ネットワーク状況によって、画像ダウンロード処理の停止・再開を行う
 */
+ (void)initialize {
    [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case AFNetworkReachabilityStatusReachableViaWWAN:
            case AFNetworkReachabilityStatusReachableViaWiFi:
            {
                [[SDWebImageDownloader sharedDownloader] setSuspended:NO];
                break;
            }
            case AFNetworkReachabilityStatusUnknown:
            case AFNetworkReachabilityStatusNotReachable:
            default:
            {
                [[SDWebImageDownloader sharedDownloader] setSuspended:YES];
                break;
            }
        }
    }];
}

@end
```
ソート済みのNSArrayに、順番を保ちつつ新しいデータを追加する


`indexOfObject:inSortedRange:options:usingComparator:`に`NSBinarySearchingInsertionIndex`を指定すれば、追加するべきIndexが取得できる。


```objectivec
NSArray *sourceData = @[
                        @{@"id": @"A", @"createdAt": @1234533333},
                        @{@"id": @"B", @"createdAt": @1234599999},
                        @{@"id": @"C", @"createdAt": @1234511111},
                        @{@"id": @"D", @"createdAt": @1234522222},
                        @{@"id": @"E", @"createdAt": @1234599999},
                        ];

// Sort descritors
NSSortDescriptor *createdAtSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"createdAt" ascending:NO];
NSSortDescriptor *idSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"id" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];

// 並び替え(作成日降順、ID昇順)
NSMutableArray *objects = [sourceData sortedArrayUsingDescriptors:@[createdAtSortDescriptor, idSortDescriptor]].mutableCopy;
/*! ->
    @[
        @{@"id": @"B", @"createdAt": @1234599999},
        @{@"id": @"E", @"createdAt": @1234599999},
        @{@"id": @"A", @"createdAt": @1234533333},
        @{@"id": @"D", @"createdAt": @1234522222},
        @{@"id": @"C", @"createdAt": @1234511111},
    ];
 */

// 新規データ
NSDictionary *newObject = @{@"id": @"F", @"createdAt": @1234544444};

// NSBinarySearchingFirstEqualも合わせて指定すると最初にマッチしたIndexを返す
NSUInteger searchOptions = NSBinarySearchingInsertionIndex | NSBinarySearchingFirstEqual;
// 追加するデータのIndexの取得
NSInteger newIndex = [objects indexOfObject:newObject inSortedRange:NSMakeRange(0, objects.count) options:searchOptions usingComparator:^NSComparisonResult(NSDictionary *d1, NSDictionary *d2) {
    if (![d1[@"createdAt"] isEqualToNumber:d2[@"createdAt"]]) {
        return [d2[@"createdAt"] compare:d1[@"createdAt"]];
    }
    return [d1[@"id"] localizedCaseInsensitiveCompare:d2[@"id"]];
}];
// -> 2

[objects insertObject:newObject atIndex:newIndex];

/*! ->
    @[
        @{@"id": @"B", @"createdAt": @1234599999},
        @{@"id": @"E", @"createdAt": @1234599999},
        @{@"id": @"F", @"createdAt": @1234544444},
        @{@"id": @"A", @"createdAt": @1234533333},
        @{@"id": @"D", @"createdAt": @1234522222},
        @{@"id": @"C", @"createdAt": @1234511111},
    ];
 */

```

## 参考

- [NSArray Binary Search – Ole Begemann](http://oleb.net/blog/2013/07/nsarray-binary-search/)
- [The Foundation Collection Classes - Foundation - objc.io issue #7](http://www.objc.io/issue-7/collections.html)
デバイスが32bitなのか64bitなのかチェックする


ポインタのサイズを調べればOK

```objectivec
if (sizeof(int *) == 4) {
	// 32bit
} else if (sizeof(int *) == 8) {
	// 64bit
}
// others
```

下のようなカテゴリを作成すれば、`NSOperationQueue`の`maxConcurrentOperationCount`や、`NSManagedObjectContext`の保存バッチサイズを決定するための基準に使えそうです。

```objectivec
// UIDevice+Hardware.h
typedef NS_ENUM(NSUInteger, DeviceArchitecture) {
	DeviceArchitectureUnknown,
	DeviceArchitecture32Bit,
	DeviceArchitecture64Bit,
};

@interface UIDevice (Hardware)

- (DeviceArchitecture)cpuArchitecture;

@end

// UIDevice+Hardware.m
#import "UIDevice+Hardware.h"

@implementation UIDevice (Hardware)

- (DeviceArchitecture)cpuArchitecture {
	if (sizeof(int *) == 4) {
		return DeviceArhictecture32Bit;
	} else if (sizeof(int *) == 8) {
		return DeviceArchitecture64Bit;
	}
	return DeviceArchitectureUnknown;
}

@end
```
【Vim × tmux】PC再起動も怖くない！ セッションの保存・復元を実現する

# Vim，tmuxでのセッション保存・復元

## TL;DR

* [tmux-plugins/tmux-resurrect](https://github.com/tmux-plugins/tmux-resurrect)はtmuxのセッションを保存・復元するためのtmux plugin．
* [tpope/vim-obsession](https://github.com/tpope/vim-obsession)はVimのセッションを保存・復元するためのVim plugin.
* `prefix C-s`でセッション保存，`prefix C-r`でセッション復元．

## About

> tmuxはターミナル使いとしては必須のツールなんですが、PC毎再起動した時に元に戻すのが面倒だと思っていた。
> tmuxinator使えよ、という話もあるのだが、あれ設定が若干面倒なのと設定した状態に戻す事しか出来ないんで、再起動の時に元の状態に戻る訳じゃない。
> 
> <cite>[(小ネタ) tmuxのセッション状態を保存・復元できるtmux-resurectを使おう！ - Qiita](http://qiita.com/joker1007/items/0e43f3a3c35506b27cff)</cite>

OSのアプデとかで再起動を強要されることも多々あるのでこういうの欲しいと思ってた．
僕は稼働中のプロジェクトごとにiTermのタブ作ってtmuxのセッションを立てているので，再起動するとそれを全部起動して回るのが非常につらい．
[**tmux-resurrect**](https://github.com/tmux-plugins/tmux-resurrect)があればそんな苦しみからも開放される．
起動中のプログラムなども保存できるし，[**vim-obsession**](https://github.com/tpope/vim-obsession)と連携させればVimのセッションも保存・復元可能になる．
これらのプラグインによって僕のようにQOLがめっちゃ向上する人もたくさんいそうな気がするので設定とかをここで共有しておく（元記事に被せるような形になっちゃってるのはすみません…）．

みんなもtmuxとVimで論文書こう．

## Configuration

### tmux側

[**tmux-resurrect**](https://github.com/tmux-plugins/tmux-resurrect)をインストールする．
`.tmux.conf`に追記するだけ（[**tpm**](https://github.com/tmux-plugins/tpm)の利用推奨，参考: [【tmux】tpmでplugin管理 - Qiita](http://qiita.com/izumin5210/items/5b7f4c01fb6fe6064a05)）．

```bash:.tmux.conf
set -g @tpm_plugins '              \
  tmux-plugins/tpm                 \
  tmux-plugins/tmux-resurrect      \
'

set -g @resurrect-strategy-vim 'session'
set -g @resurrect-processes 'irb pry "~rails server" "~rails console"'

run-shell '~/.tmux/plugins/tpm/tpm'
```

`prefix + I`でインストールされる．

* `tpm_plugins` : 利用するプラグインのリスト（GitHubのrepo）
* `@resurrect-strategy-vim` : がVimのセッションを読み出す設定
* `@resurrect-processes` : 復活させるプロセスの設定（参考: [Configuration - Tmux Resurrect](https://github.com/tmux-plugins/tmux-resurrect#configuration)）．

### Vim側

[**vim-obsession**](https://github.com/tpope/vim-obsession)をインストールするだけ．

```vim:.vimrc
NeoBundle 'tpope/vim-obsession'
```

## Usage

* Vim
  * `:mksession`（もしくは`:mksession!`）でセッション保存
  * `Session.vim`に保存される
* tmux
  * `prefix C-s`で保存
    * session，window，pane全て保存
    * 設定によっては起動してるプログラムとかも保存される
  * `prefix C-r`で復元
    * `tmux list-sessions`を確認するとセッションが復活してることがわかる
    * `tmux attach -t <target-session>`でattach可能

`:mksession!`するのめっちゃ忘れそうな気がするので，定期的に実行してくれる何かが必要かもしれない．

# 参考URL

* [(小ネタ) tmuxのセッション状態を保存・復元できるtmux-resurectを使おう！ - Qiita](http://qiita.com/joker1007/items/0e43f3a3c35506b27cff)
* [【tmux】tpmでplugin管理 - Qiita](http://qiita.com/izumin5210/items/5b7f4c01fb6fe6064a05)
* [tmux-plugins/tmux-resurrect](https://github.com/tmux-plugins/tmux-resurrect)
* [tpope/vim-obsession](https://github.com/tpope/vim-obsession)
【tmux】tpmでplugin管理して快適ターミナル生活


# tpm(Tmux Plugin Manager)

## TL;DR

[**tpm**（Tmux Plugin Manager）](https://github.com/tmux-plugins/tpm)はtmuxのpluginをいい感じに管理できるツール．
Vimの[NeoBundle](https://github.com/Shougo/neobundle.vim)やRubyの`Gemfile`のように`.tmux.conf`にpluginを記述することで管理を行う．

## usage

`tpm`のインストール．

```console
$ git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
```

`.tmux.conf`に利用するpluginを記述．
`run-shell tpm`でpluginのスクリプト（`*.tmux`）が実行される．

```bash:.tmux.conf
set -g @tpm_plugins '              \
  tmux-plugins/tpm                 \
  tmux-plugins/tmux-yank           \
  tmux-plugins/tmux-open           \
  tmux-plugins/tmux-resurrect      \
  tmux-plugins/tmux-battery        \
  tmux-plugins/tmux-pain-control   \
'

run-shell '~/.tmux/plugins/tpm/tpm'
```

tmuxを起動して`prefix I(shift+I)`でpluginがインストールされる（NeoBudleでいうところの`:NeoBundleInstall`）．

## plugins

僕が利用しているのはこんな感じ．

* [tmux-yank](https://github.com/tmux-plugins/tmux-yank) : システムのクリップボードにコピー
* [tmux-open](https://github.com/tmux-plugins/tmux-open) : URLやファイルを開く
* [tmux-resurrect](https://github.com/tmux-plugins/tmux-resurrect) : セッションの保存・復元
* [tmux-battery](https://github.com/tmux-plugins/tmux-battery) : バッテリ残量等を表示
* [tmux-pain-control](https://github.com/tmux-plugins/tmux-pain-control) : pain間の移動キーバインドをつけてくれる

tmux-yankとかtmux-pain-controlは，従来だと`.tmux.conf`にだらだら書いてたものをpluginとして抽出したもの．
こういう設定がOSSとして切りだされていくと`.tmux.conf`がより洗練されていって素敵だと思う．

pluginの作り方は[How to create Tmux plugins](https://github.com/tmux-plugins/tpm/blob/master/HOW_TO_PLUGIN.md)にまとめられているので自作も可能．
現状だとtpm作者が1人で頑張ってるけど，brewとかgemみたいにtpm pluginsが広まっていけば世の中がもっといい感じになっていく気がする．

# 参考

* [tmux-plugins/tpm](https://github.com/tmux-plugins/tpm)
enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」チュートリアル（１６）効果音を再生する

ここでは、「**game01**」というディレクトリ内で作業しているという前提で説明しています。

**※標準で入っているメディアファイルと、「<font color="red">playSound()</font>」の仕様を変更しました。<font color="red">2015年2月1日</font>以前にenforceをクローンしている方は、**

$ <font color="red">git pull https://github.com/digitarhythm/enforce.git</font>

**を行ってください。**

# 効果音を再生する
「**environ.coffee**」でプリロード指定した音声ファイルを再生してみます。

まず、「**src/environ.coffee**」を開いてください。
次に、

```coffeescript
    control: 'media/picture/controlplane.png'
```
の下に、

```coffeescript
    gamestart: 'media/sound/gamestart.mp3'
```
と記述してください。

「**environ.coffee**」の修正が終わりましたら、「**src/gameControl.coffee**」を開いてください。
開きましたら、「**when 0**」を下記のように修正してください。

```coffeescript
            when 0
                button = PADBUTTONS[0]
                if (button[0])
                    # 修正箇所
                    playSound("gamestart", 0.5, false)

                    @title.visible = false
                    @nextjob()
```
「**playSound()**」が追加されています。
この関数は、

**「<font color="red">environ.coffee</font>」で「<font color="red">gamestart</font>」という名前でプリロード指定した音声ファイルを、オリジナルの半分の音量で再生し、ループはしない」**

ということになります。
音量と、ループフラグは省略可能です。
省略した場合は、「音量＝1.0、ループ＝false」、になります。
ここまでの修正が終わりましたら、コンパイルしWebブラウザをリロードしてください。
「z」キーを押すと音が鳴ると思います。
「音量」パラメーターは、「0.0〜1.0」を指定します。
enchant.jsでは1.0を越えても音量に変化はありませんが、tmlib.jsでは1.0を越えると増幅されます（大きくしすぎると音が割れます）。

ゲームにアクセスした場合にエラーが出てゲームが立ち上がらない場合は、フレームワークに標準で入っている「**gamestart.mp3**」が古い可能性があります。
gitリポジトリからpullしてください。

**注）iOS端末のブラウザでは、タップアクションを受け取った処理内でサウンド再生を行った後でないと、正しくサウンド再生が行われないという仕様があります。ゲームを作成する場合はタイトル画面に「GAMESTART」ボタンを用意し、これがタップされた時にサウンドを再生するようにすることで、ゲーム中に普通にサウンドを再生することが出来ます。**

[チュートリアル（１５）](http://qiita.com/digitarhythm/items/42b78d4e8ddbf919fc0d) <--- ⬛︎ --->[チュートリアル（１７）](http://qiita.com/digitarhythm/items/bbb9feb4a6725cb89980)

---

[enforceチュートリアル一覧](http://qiita.com/digitarhythm/items/9e75c871f5ce582a4d01)
Super easy project planning and estimation

The Program: http://geon.github.io/estimator/
Source: https://news.ycombinator.com/item?id=8980292

* Click the button to create a new project.
* Type in your project title.
* Click the "+"-button to add a task.
* Hover over a taks to see the button for adding subtasks.
* Drag&drop task to reorder them or move them up/down the hierarchy.
* Open the edit-dialog on a task to set an estimated time.
* When you enter the first estimate in a task, you get projected estimates for all other tasks.
PHPでわざとSegmentation Faultを出してDebugする練習をしてみる

# これは何？
* PHPでDebugの方法を確認したくて、わざとSegmentation Faultを出して、Debugしてみるやり方をメモしたもの。

# 事前準備
* PHP + Apache を導入しておく。
* ```sudo yum install -y php-devel```

# PHPのソースの導入
* 事前準備で導入したバージョンと同じPHPのソースを入手。
* 入手先の詳細は、http://php.net/git.php で参照。

```bash
$ git clone https://github.com/php/php-src.git 
$ git checkout PHP-5.3 # これは任意のバージョン
```

# PHPのモジュールを作る

わざとSegmentation Faultを出すPHPモジュールを作る。

まず、ひな形を作る

```bash
$ cd php-src/ext
$ ./ext_skel --extname=xxxx //xxxxは作りたいモジュール名
$ cd xxxx
```
次に、php_xxxx.hファイルを編集する。

```c
PHP_FUNCTION(xxxx);
```

次に、xxxx.cファイルを編集する。

```c

function_entry Down_functions[] =
{
    PHP_FE(xxxx, NULL)
    {NULL, NULL, NULL}
};

zend_module_entry Down_module_entry =
{
    STANDARD_MODULE_HEADER,
    "Down",
    Down_functions,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NO_VERSION_YET,
    STANDARD_MODULE_PROPERTIES
};

PHP_FUNCTION(xxxx)
{
    char *ptr = NULL ;
    strcpy(ptr, "down") ;
}

```

config.m4 下記の行頭delをはずす（16行目位）

```vim
PHP_ARG_ENABLE(helloworld, whether to enable helloworld support,
Make sure that the comment is aligned:
[  --enable-helloworld           Enable helloworld support])
```

インストール

```bash
$ sudo phpize
$ ./configure
$ make
$ sudo make install
```

動作確認

```bash
$php xxxx.php

Functions available in the test extension:
confirm_down_method_compiled

Segmentation fault (core dumped)

```

ちゃんとCoreDumpになりました。
xxxx.php はモジュールをMakeをすると自動的に生成されます。

# apacheでデバッグ

php.ini　下記を追加

```
extension=xxxx.so
```

httpd.conf 下記を追加

```
CoreDumpDirectory /tmp
```

apacheリスタート

```
sudo service httpd restart
```

先ほどの、```xxxx.php```をHTTPでアクセス出来る領域にコピーして、アクセスしてみる。アクセスログを見てみると･･･期待通りにエラーが出ています。

```
[Sun Feb 01 17:39:25 2015] [notice] child pid 29222 exit signal Segmentation fault (11),  possible coredump in /tmp
```

# debug

pid をキーにして、gdbを実行してみると、xxxx.cで落ちていると指摘されている。狙い通り。

```bash
$ sudo  gdb /usr/sbin/httpd /tmp/core.29222

(略)
Core was generated by `/usr/sbin/httpd'.
Program terminated with signal 11, Segmentation fault.
#0  zif_confirm_down_method_compiled (ht=1, return_value=0x7fa80c6ac6c0,
    return_value_ptr=0x0, this_ptr=0x0, return_value_used=1)
    at /home/azureuser/php-src/ext/down_method/xxxx.c:162
162             strcpy(arg,"down");
Missing separate debuginfos, use: debuginfo-install httpd-2.2.15-39.el6.centos.x86_64

```

# その他

```bash
(gdb) where // traceを見る事ができる

```

# Segmentation Fault が起きる理由／可能性とか。

### PHPをPrefowrkで動かすべきところを、Workerで動かしていた

```
#1  0x00000000004657f7 in ap_worker_pod_check (pod=) at pod.c:57
```

下記コマンドで現在動いているMPMが確認できる。

```bash
$ apachectl -V | grep "Server MPM"
```

http://digape.com/201204/php-php5-4-apache-2-4%E3%81%A7segmentation-fault/

### ImageMagick の場合

http://dqn.sakusakutto.jp/2012/07/php53_imagick%EF%BC%BFsegmentation_fault.html

### StackOverFlow の場合

http://tmotooka.hatenablog.jp/entry/2012/10/21/222411



### 

# 引用／参考

* http://techblog.yahoo.co.jp/tips/php/
* http://dsas.blog.klab.org/archives/50777398.html
EmacsLispでカレントバッファの更新を検知する

## 概要

リアルタイムプレビューに使うバッファが更新確認の関数が欲しかったので作りました。

## 実装

更新があれば一時バッファに書き込んで一時バッファを更新することで、
カレントバッファが更新されているかどうか検知しています。
更新があれば```t```、 更新がなければ```nil```を返します。

```el
(defun buffer-update-p ()
  (let ((current-buffer-string
         (buffer-substring-no-properties
          (point-min) (point-max))))
    (if (not
         (string=
          current-buffer-string
          (progn
            (set-buffer
             (get-buffer-create  (concat "*" (buffer-name) "*")))
            (buffer-substring-no-properties
             (point-min) (point-max)))))
        (progn
          (erase-buffer)
          (insert current-buffer-string)
          t)
      nil)))
```

## 使い方

以下のようにtimer関数の中で実行すると、前回実行してからバッファが更新されたときに処理をすることができます。

```el
(setq hoge-timer 
      (run-at-time t 1 '(lambda ()
                          (if
                              (buffer-update-p)
                              (message "buffer update!!")))))

```
文字集合と文字符号化方式について

# はじめに

数年前の話ですが、「MySQL へ登録したデータが文字化けしているんですけど、文字コードを UTF-8 から Unicode に変えれば直りますかね？」という意味不明なことを質問されました。（私の周りでは・・）今時はもうほとんど UTF-8 で扱うことが多く、文字コードで悩まされることも少なくなりましたが、だからこそ基本的なことを残しておこうかと思います。

# 文字集合とは
読んで字の如く、文字の **"集合"** です。Wikpedia で [集合](http://ja.wikipedia.org/wiki/%E9%9B%86%E5%90%88) のページを見ると

> 数学における集合 (しゅうごう、英: set, 仏: ensemble, 独: Menge) とは、大雑把に言えばいくつかの「もの」からなる「集まり」である。

と書いてあります。あまり具体的になりませんでしたね :sweat_smile:
私なりの言葉で表現すると「文字集合に含まれる文字、含まれない文字が明確になっている」「文字集合に含まれる文字が 1つ 1つ区別できる」という感じですかね。んー、余計に分かりにくい・・？

# 文字符号化方式とは

いわゆる **"エンコーディング"** のことです。文字の集合をコンピュータで扱えるようにしたもので、代表的なものに UTF-8、Shift_JIS、EUC-JP などがあります。
文字集合に含まれる任意の文字とその符号化された文字の間には 1 対 1 の対応が存在します。

# もう少し具体的に・・

分かり易くするために細かな部分は端折ります。
細かな部分を正しく説明できる自信もないので、この投稿をご覧になった皆さん自身でより詳しく調べることをお勧めします。

日本語の文字集合として主なものに下記 2つがあります。

<dl>
  <dt>JIS 漢字コード</dt>
  <dd>
    文字に区と点の番号が割り付けられているもの<br />
    符号化方式としては主に Shift_JIS や EUC-JP がある</dd>
  <dt>Unicode</dt>
  <dd>
    文字にコードポイントと呼ばれる番号が割り付けられているもの<br />
    符号化方式としては主に UTF-8 や UTF-16 がある
  </dd>
</dl>

同じ文字集合をベースにしている Shift_JIS と EUC-JP の間は基本的には符号化方式を変換することができます。上で述べたように文字集合と符号化方式の間には 1 対 1 の対応が存在しますので、区点番号を介せば Shift_JIS と EUC-JP の間にも 1 対 1 の対応が存在します。

一方、異なる文字集合の Shift_JIS と UTF-8 ですが、そもそもの集合が異なりますので、普通には変換することができません。実際に変換プログラムを見たことも書いたこともないのですが、おそらく変換表のようなものを使っていると思われます。（違ったらごめんなさい）
文字集合が異なるので、Shift_JIS の波ダッシュ（～）を UTF-8 の **"WAVE DASH"** と **"FULLWIDTH TILDE"** のどちらに対応付けるか？といった問題も発生しますね。UTF-8 から Shift_JIS への変換ならば 1つに決まるのだけれど・・（数学用語でいうと全射）。

# さいごに

伝えたいことは、「文字コードの一言で済まさず、集合の概念と符号化方式をきちんと意識して扱いましょう」ということです。

# 余談

UTF-16 は 2バイト単位で文字を処理するため、ファイルの先頭にバイトオーダーマーク（いわゆる BOM）を置いて、そのファイルがどちらのエンディアンで作成されたものなのかを判別します。反面、UTF-8 は 1バイト単位で処理するので、本来 BOM は不要なのですが、なぜか BOM を付けることもできるという変なことになってます。