OmniAICreator/Qiita-1.07M huggingface dataset:
AngularJS で半角から全角に変換する Directive を追加する

[AngularJS で全角から半角に変換する Directive を追加する](http://qiita.com/yutackall/items/1da7a06f0e8ae28f3a3f) の逆バージョンです。
JavaScript で Form の value に半角で入力された値を全角へ変換する関数を、AngularJS の Directive に書き換えてみた

# JavaScript バージョン

```html:inputタグ
<input name="phone" type="text" placeholder="09012345678" onchange="han2zen(this)">
```
```js:zen2han.js
function han2zen(obj){
  // 文字列かチェック
  if(typeof(obj.value)!="string") return false;
  var word = obj.value;

  obj.value = word.replace(/[!"#$%&'()*+,\-.\/0-9:;<=>?@A-Z\[\\\]^_`a-z{|}~]/g, function(s) {
      return String.fromCharCode(s.charCodeAt(0) + 0xFEE0);    
  })
}
```

[デモ](http://jsfiddle.net/yutackall/ayonsjxz/2/)

# AngularJS Directive バージョン
```html:inputタグ(ng-model無)
<input name="phone" type="text" placeholder="09012345678" convert-ascii-to-mb >
```
```html:inputタグ(ng-model有)
<input name="phone" type="text" placeholder="09012345678" ng-model="phone" convert-ascii-to-mb >
```
```js:app.js
angular
    .module('MyApp', [])
    // 英数字記号の半角文字を全角へ変換
    .directive('convertAsciiToMb', function () {
        return {
            restrict: 'A',
            require: '?ngModel',
            link: function (scope, element, attrs, ngModel) {
                element.on('change', function(){
                    if(typeof(this.value)!="string") return false;
                    var word = this.value;
                    word = word.replace(/[!"#$%&'()*+,\-.\/0-9:;<=>?@A-Z\[\\\]^_`a-z{|}~]/g, function(s) {
                        return String.fromCharCode(s.charCodeAt(0) + 0xFEE0);    
                    });
                    // ng-model への反映(これがないとフォームの値だけ更新され、ng-modelの値は更新されない)
                    if (ngModel != null) {
                        scope.$apply(function() {
                            ngModel.$setViewValue(word);
                        });
                    }
                    this.value = word;
                });
            }
        };
    })

```

[デモ](http://jsfiddle.net/yutackall/uwpxft54/3/)

参考
[AngularJS で全角から半角に変換する Directive を追加する](http://qiita.com/yutackall/items/1da7a06f0e8ae28f3a3f)
swiftでYMCPhysicsDebuggerが使えなかった話（showsPhysicsを使おう）


swift + cocoapodsでYMCPhysicsDebuggerを入れてみたけどエラーが出てしまった。

が、よく調べるとすでにこれはSpritekitに標準で機能が備わっているっぽい


```swift
class GameViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {
            
            // Configure the view.
            let skView = self.view as! SKView
            skView.showsFPS = true
            skView.showsNodeCount = true
            
            skView.ignoresSiblingOrder = true
            skView.showsPhysics = true // これ
            scene.scaleMode = .AspectFit
            
            skView.presentScene(scene)
        }
    }

}
```

オブジェクトに青線が出る。
よかった。使えた。
ObjC to Swift : [NSAlert beginSheetModalForWindow:completionHandler]


Objective-C

```Objective-C
NSAlert * alert = [[NSAlert alloc] init];
	
[alert beginSheetModalForWindow: self.view.window
              completionHandler: ^( NSModalResponse returnCode)
{
	if ( returnCode == NSAlertSecondButtonReturn )
	{
		// do something
	}
}];
```

Swift

```Swift
let alert = NSAlert()
		
alert.beginSheetModalForWindow( view.window! )
{ returnCode in

	if ( returnCode == NSAlertSecondButtonReturn )
	{
		// do something
	}
}
```
Google Cloud Storage に S3 互換の REST でアップロード

先ほど次のような記事を書きましたが、

[Google Cloud Storage に AWS CLI や AWS SDK for PHP でアップロード](http://qiita.com/ngyuki/items/fd3bb47cd4aeb2f61fec)

要するに Interoperability API を有効にすれば S3 互換の REST API が有効になるってことなので、普通に curl で REST API を叩いてアップロードしてみます。

```php
<?php
$accessKey = 'YOUR_ACCESS_KEY';
$secretAccessKey = 'YOUR_SECRET_ACCESS_KEY';
$bucket = 'YOUR_BUCKET_NAME';

$path = 'rest.txt';
$type = 'text/plain';
$body = 'this is rest api';

$verb = 'PUT';
$md5 = base64_encode(md5($body, true));
$date = gmdate(\DateTime::RFC2822);
$amzHeaders = '';
$resource = "/$bucket/$path";

$stringToSign = implode("\n", [$verb, $md5, $type, $date, $amzHeaders . $resource]);
$signature = base64_encode(hash_hmac('sha1', $stringToSign, $secretAccessKey, true));
$authorization = sprintf('AWS %s:%s', $accessKey, $signature);

$headers = [
    "Date: $date",
    "Content-Type: $type",
    "Content-MD5: $md5",
    "Authorization: $authorization",
];

$ch = curl_init();

curl_setopt_array($ch, [
    CURLOPT_URL => "https://storage.googleapis.com/$bucket/$path",
    CURLOPT_CUSTOMREQUEST => 'PUT',
    CURLOPT_HEADER => true,
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POSTFIELDS => $body,
]);

curl_exec($ch);
```

実行します。

```console
$ php google-cloud-storage-rest.php
```

デベロッパーコンソールのストレージブラウザを見てみます。

![10-rest.png](https://qiita-image-store.s3.amazonaws.com/0/8734/8f80e15e-7230-dd5d-76b6-20422f4d6b16.png)

アップロードされています。
Migration の書き方まとめ。(MySQL)


## 新規テーブル作成
```
create_table :articles do |t|
  t.integer :user_id
  t.string  :title
  t.text    :article
  t.timestamps
end
```

integer はデフォルトでカラム長は int(11)
string は varchar(255) 
text は text 型

## テーブル削除
```
drop_table :users
```

## カラム追加
```
add_column :users, :delete_flg, :integer, defalut: 0
```

## カラム削除
```
remove_column :users, :delete_flg
```

## カラム名変更
```
rename_column :users, :delete_flg, :del_flg
```

## カラム変更
```
change_column :users, :admin, :boolean, :default => false
```

### カラム変更時は遡及も同時に行う
```
User.all.update_all(admin: false)
```

## インデックス追加
```
add_index :users, [:name, :email], :unique => true, :name => 'users_ix1'
```

## インデックス削除
```
remove_index :users, :users_ix1
```
さくらVPSのArch Linuxが「Booting from Hard Disk」で止まってしまう

## 概要

```
pacman -Syu
```

でアップデートしたらカーネルアップデートも含まれていて、ブート時に

```
Booting from Hard Disk
GRUB
```

で止まってしまい、Linuxが起動しなくなった。

grubをインストールし直すことで、正常に起動するようになった。


## 環境・背景

さくらのVPS。
5月初旬にArch Linuxを初インストール。
ブートローダはgrubを使っていた。
カーネルアップデートするのは今回がはじめて。

## やったこと

### Arch Linux ISOイメージから起動

最初にインストールしたときと同じようにFTPでISOイメージをアップロードするのだが、FileZillaでうまく接続できない。エラーメッセージは：

```
Server unexpectedly closed network connection
```

さくらのVPSコントロールパネル→OSインストール→アカウントの削除
で一度FTPアカウントを削除し、作り直したら接続できるようになった。

### grubの再インストール

マウント

```
loadkeys jp106
mount /dev/vda3 /mnt
mount /dev/vda1 /mnt/boot
swapon /dev/vda2
arch-chroot /mnt
```

インストールしたときのコマンドがメモしてあったので、それと同じくgrub-installを実行

```
grub-install --target=i386-pc --recheck --debug /dev/vda --force
grub-mkconfig -o /boot/grub/grub.cfg
```

旧grub.cfgと比較してみたら何も変わっていなかったので、grub-mkconfigは不要だったかも。
そして再起動で無事に起動。
redis sentinelのdocumentが更新されてたからdiff取ってみた(2015/2/2 vs 2015/5/23)

#redis sentinelのdocumentが更新されてたからdiff取ってみた。(2015/5/23現在)

* 更新元URL:http://redis.io/topics/sentinel
* 比較対象: 
　2015/2/2（左側) と 2015/5/23(右側)
* 比較方法: way back machine http://web.archive.org/web/20150202044249/http://redis.io/topics/sentinel

##diff text(2015/6/23くらいに消えます)
https://www.diffchecker.com/zvdeo8dt

##diffまとめ
・2.8が最新だったけど、3.0がもう出るのでそちらに言及
・sentinelの設定が書き換えられるのは、failoverの際だけじゃなく新しいsentinelが追加されたときも(「and every time a new Sentinel is discovered.」が追記)
・redis sentinalは3台以上の独立したマシン・VMを使わないとうまく動かないと明記
・dockerを使うとportとか変更してうまく動かないかもだから注意してねと明記
・SENTINELコマンド追記
SENTINEL sentinels <master name> Show a list of sentinel instances for this master, and their state.
SENTINEL ckquorum <master name> Check if the current Sentinel configuraiton is able to reach the quorum needed to failover a master, and the majority needed to authorize the failover. This command should be used in monitoring systems to check if a Sentinel deployment is ok.
terminalからサーバ上にあるファイルをscp

#Terminalからサーバ上にあるファイルをSCPコマンドで持ってくる

###SFTPクライアントソフトがない時に、一々インストールするのが面倒な場合Terminalでやっちゃう方法

* scp -r -i 鍵ファイルファイル -P 22 ユーザ@アドレス:/path/to/file ローカルのパス
chromeモバイルのpull to refresh(引っ張って更新)を簡単に無効にするスニペット

以前はandroid版だけだったようですが、最近ios版chromeでも「引っ張って更新」機能が追加されました。

私の環境(iPhone5s/ios8.3/chrome)では、中途半端に引っ張って更新しないと、複数のページでjavascriptが動作しなくなったので、webページ側でこの機能をほぼ無効にすることにしました。

厳密には完全に無効化できているわけではない(ページ下部「完全なアプローチ」参照)ですが、意図せず「引っ張って更新」が発生することはこれでなくなるかと思います。

スクロールしないページだと、上方向に引っ張って(指を下から上にスワイプ)からすぐ下方向に引っ張ると「引っ張って更新」が発生しますが、スクロールしないページなら単純に各html要素に適宜overflow:hiddenをかけてあげるとか、touchmoveをpreventDefaultしてあげればいいと思います。

早くこの機能なくなればいいのに。

[動作デモ(モバイル版chromeからご覧ください)](http://s.codepen.io/sundaycrafts/debug/rVMROv)

```js
/**
 * inspired by jdduke (http://jsbin.com/qofuwa/2/edit)
 */
 
 
 
var preventPullToRefresh = (function preventPullToRefresh(lastTouchY) {
  lastTouchY = lastTouchY || 0;
  var maybePrevent = false;
 
  function setTouchStartPoint(event) {
    lastTouchY = event.touches[0].clientY;
    // console.log('[setTouchStartPoint]TouchPoint is ' + lastTouchY);
  }
  function isScrollingUp(event) {
    var touchY = event.touches[0].clientY,
        touchYDelta = touchY - lastTouchY;
 
    // console.log('[isScrollingUp]touchYDelta: ' + touchYDelta);
    lastTouchY = touchY;
 
    // if touchYDelta is positive -> scroll up
    if(touchYDelta > 0){
      return true;
    }else{
      return false;
    }
  }
 
  return {
    // set touch start point and check whether here is offset top 0
    touchstartHandler: function(event) {
      if(event.touches.length != 1) return;
      setTouchStartPoint(event);
      maybePrevent = window.pageYOffset === 0;
      // console.log('[touchstartHandler]' + maybePrevent);
    },
    // reset maybePrevent frag and do prevent
    touchmoveHandler: function(event) {
      if(maybePrevent) {
        maybePrevent = false;
        if(isScrollingUp(event)) {
          // console.log('======Done preventDefault!======');
          event.preventDefault();
          return;
        }
      }
    }
  }
})();
 
// usage
// document.addEventListener('touchstart', preventPullToRefresh.touchstartHandler);
// document.addEventListener('touchmove', preventPullToRefresh.touchmoveHandler);
```

gistにも載せてます: <https://gist.github.com/sundaycrafts/af0f9ed28de87d496b66>

元ネタ: [html - Disabling android's chrome pull-down-to-refresh feature - Stack Overflow](http://stackoverflow.com/questions/29008194/disabling-androids-chrome-pull-down-to-refresh-feature)
完全なアプローチ: [HTML5 - [Chrome for Android] Pull-to-Refreshをページ側で無効化する - Qiita](http://qiita.com/zeriyoshi/items/d73d6712400d75dc8bea)
node.js でインターネット上の画像をダウンロード

## request で取得、fs で保存してみる
バイナリを壊さないように注意する。

- request でのエンコーディング指定は {encoding: null}
- fs でのエンコーディング指定は 'binary'

```json:package.json
{
    "dependencies": {
        "request": "*",
        "fs": "*"
    }
}
```

```js:test.js
var request = require('request');
var fs = require('fs');

var url = 'https://www.google.co.jp/images/nav_logo195.png';

request(
	{method: 'GET', url: url, encoding: null},
	function (error, response, body){
		if(!error && response.statusCode === 200){
			fs.writeFileSync('a.png', body, 'binary');
		}
	}
);
```

```bash:実行
npm install
node test.js
```

## 参考
- [Getting binary content in Node.js using request - Stack Overflow](http://stackoverflow.com/questions/14855015/getting-binary-content-in-node-js-using-request)
【Rails】rbenvとbundlerを使ったRails環境の構築


## Bundlerのインストール

	$ gem install bundler


## プロジェクトディレクトリの作成

	$ mkdir project_name


## プロジェクトディレクトリでBundlerをイニシャライズ
	
	$ cd project_name		# Projectのディレクトリへ移動
	$ bundle init			# Gemfileが作成される

## Gemfileを編集
	
	$ vim Gemfile
	
	==================================================
	# A sample Gemfile
	source "https://rubygems.org"

	gem "rails", "4.0.5"


## Railsをインストール

	$ bundle install
CSSだけでスライドメニュー

車輪の再発明かもしれないが、メニューが開いている時にスクロールしてしまったり、メニュー以外をタップすると閉じるようなものが見つからなかったので自分で作ってしまった。

ご参考までに。。。

[Demo](http://kadotami.github.io/css_only_slider_menu/demo.html "Demo")
[code](https://github.com/kadotami/css_only_slider_menu "code")

plefixも雑です。
クラス名などは適当に付けました。
気に食わなければ自分で適宜変えてください。
OSXのキーチェーンアクセスから秘密メモを取り出す

日本語の情報がなかったので今後使うと思うのでメモ。

OSXのキーチェーンアクセスに秘密メモという項目に設定を持たせ、
スクリプトの中から使いたかったのです。

![スクリーンショット 2015-05-23 14.10.33.png](https://qiita-image-store.s3.amazonaws.com/0/11492/d454faef-4d6b-28b9-82b1-3fc18c792836.png)

1. キーチェーンアクセスの秘密メモに項目を登録。（ここではmy_secret_info）
2. コマンドラインから秘密メモを取り出す。
`security find-generic-password -C note -s my_secret_info -w > my_secret.txt`
3. 取り出した情報はバイナリ文字列かつXMLなので、メモ本体を取り出す。

```sample.rb
require 'rexml/document'
str = open("my_secret.txt").read    
doc = REXML::Document.new str.split.pack("H*")    
puts doc.root.elements["dict/string"].text 
```



stackoverflowからの簡易説明でした。（あちらはPythonだったので）
http://stackoverflow.com/questions/22370552/keychain-services-secure-notes
RxAndroidとRetrolambdaでオレオレリスナーを駆逐する


Androidにて独自イベントを取得する場合はListenerを作成するのが通例ですが
規模の大きいアプリだとListener(Callback)のパッケージが肥大化しがちです。
これをRxAndroidとRetrolambdaを利用することで解決できます。

## 一般的なケース

```OnCustomListener.java
public interface OnCustomListener {
	void onSuccess();
}
```


```HogeView.java
public class HogeView extends View {
	private OnCustomListener mListener;

	public void setListener(OnCustomListener listener) {
		this. mListener = listener;
	}

	public void hoge() {
		// 何らかの処理
		if (mListener != null) {
			mListener.onSuccess();
		}
	}
}
```

```MainActivity.java
public class MainActivity extends Activity implements OnCustomListener{

	private HogeView mHogeView;

	private void init() {
		mHogeView.setListener(this);
	}

	@Override	
	public void onSuccess() {
		Log.d(TAG, "onSuccess");
	}
}
```


## RxAndroidとRetrolambdaを併用したケース

```HogeView.java
public class HogeView extends View {
	private Action0 mListener;

	public void setListener(Action0 listener) {
		this. mListener = listener;
	}

	public void hoge() {
		// 何らかの処理
		if (mListener != null) {
			mListener.call();
		}
	}
}
```

```MainActivity.java
public class MainActivity extends Activity {

	private HogeView mHogeView;

	private void init() {
		mHogeView.setListener(this::onSuccess);
		/*
		↓↓の省略した記述です↓↓
		mHogeView.setListener(new Action{
			@Override	
				public void call() {
					onSuccess();
				}
		});
		*/
	}
	
	private void onSuccess() {
		Log.d(TAG, "onSuccess");
	}
}
```
コードの長さはさほど変わっていませんが、interfaceの代わりを立派に務めてくれます。
RxAndroidとRetrolambdaを利用することでListenerクラスを減らすことができ、独自Viewから呼ばれる処理もprivate化することができます。

また、引数や返り値が欲しい場合はAction1やFuncなどを利用することで柔軟に対応可能です。

RxAndroidとRetrolambdaは本当に相性がいいですね！！
OSXの環境で、gemのpgをインストールする



# 問題

`Can't find the 'libpq-fe.h header`
ヘッダーがないためposgresqlのライブラリ(NativeExtension)がコンパイルできずに、失敗した。

```
$ Gemfile
```

```Gemfile
gem 'pg'
```

コマンド

```bash
$ ./bin/bundle install --path vendor/bundle
```

出力結果

```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /Users/saicologic/.rbenv/versions/2.1.6/bin/ruby extconf.rb
checking for pg_config... no
No pg_config... trying anyway. If building fails, please try again with
 --with-pg-config=/path/to/pg_config
checking for libpq-fe.h... no
Can't find the 'libpq-fe.h header
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/saicologic/.rbenv/versions/2.1.6/bin/ruby
	--with-pg
	--without-pg
	--enable-windows-cross
	--disable-windows-cross
	--with-pg-config
	--without-pg-config
	--with-pg_config
	--without-pg_config
	--with-pg-dir
	--without-pg-dir
	--with-pg-include
	--without-pg-include=${pg-dir}/include
	--with-pg-lib
	--without-pg-lib=${pg-dir}/lib

extconf failed, exit code 1
```

# 解決


## Install posgresql

```
$ brew install postgresql
```


出力結果

```
==> Downloading https://homebrew.bintray.com/bottles/postgresql-9.4.1_1.yosemite.bottle.tar.gz
######################################################################## 100.0%
==> Pouring postgresql-9.4.1_1.yosemite.bottle.tar.gz
==> Caveats
If builds of PostgreSQL 9 are failing and you have version 8.x installed,
you may need to remove the previous version first. See:
  https://github.com/Homebrew/homebrew/issues/2510

To migrate existing data from a previous major version (pre-9.4) of PostgreSQL, see:
  https://www.postgresql.org/docs/9.4/static/upgrading.html

To have launchd start postgresql at login:
    ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents
Then to load postgresql now:
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
Or, if you don't want/need launchctl, you can just run:
    postgres -D /usr/local/var/postgres
==> /usr/local/Cellar/postgresql/9.4.1_1/bin/initdb /usr/local/var/postgres
==> Summary
```
stan練習

Airpassengersのデータで季節調整。詳細は北川時系列p165あたり。





scodeap="

```stan


data{
  int N;
  real y[N];
}

parameters{
  real trend[N];
  real v_trend;
  real sigma;
  real season[N];
  real v_season;
}

model{
  int cycle;
  real myu[N];
  real ssum;
  cycle<-12;
  
  for(i in cycle:N){
    ssum<-0;
    for(j in 1:(cycle-1)){
      ssum<-ssum+season[i-j];
    }
    season[i]~normal(-ssum,v_season);
  }
  for(i in 3:N){
    trend[i]~normal(trend[i-1]*2-trend[i-2],v_trend);
  }
  for(i in 1:N){
    myu[i]<-trend[i]+season[i];
    y[i]~normal(myu[i],sigma);
  }

}

"
```

```R:
ap=AirPassengers
dat=list(N=length(ap),y=ap)
fit=stan(data = dat,model_code = scodeap,iter = 300,chains = 1)
la=extract(fit)

#matplot(cbind(apply(la$trend,2,mean),apply(la$season,2,mean),ap),type="l")
hoge=apply(la$trend,2,mean)+apply(la$season,2,mean)
matplot(cbind(hoge,ap),type="l")

```

![plot_zoom_png.png](https://qiita-image-store.s3.amazonaws.com/0/38159/7072f2d1-3e6d-8e17-7626-6885ea7f5460.png)
AndroidStudioでlogcatにログが表示されないとき


AndroidStudioでlogcatにログが表示されないときは以下を確認してみてください。

![Android_と_Tools_と_Menubar.png](https://qiita-image-store.s3.amazonaws.com/0/41889/9c5e5c63-dc51-499d-5caa-f747bd1f8461.png)

Enable ADB Integrationにチェックが入っているかを確認しましょう。
もし入ってなかったらチェックを入れ、AndroidStudioを再起動で、
ログが表示されるようになると思います。

もしくは、adb serverを再起動するという方法もあるようです。

>[Android Studioでlogcatに出力されない時](http://qiita.com/deconcepter/items/da8db45f347840903fae)

以上
Macでfc-listコマンドでフォントがなにも表示されないとき

# 背景

[GTK+ Download: Mac OS X](http://www.gtk.org/download/macos.php)を参考に
jhbuildでGimpをビルドした。

# 問題　

2台のマックで作業をしたのだが、片方がGtkのフォント選択ダイアログでなにもフォントが
表示されない状態。

なかなかこの原因がわからなかった。

# 解決への糸口の発見

```
~/gtk/inst/bin/fc-list
```

の結果がフォント一覧が出てる場合、ずらずら/usr/X11R6/lib配下のフォントが表示される。


# わかったこと

2台共、Xquartzは入れてはいたが、
/usr/X11R6
が問題となったMacの方には無かった。どうやら、これがないと、

```
~/gtk/inst/etc/fonts/fonts.conf 
```

に

```xml
<!-- Font directory list -->

	<dir>/usr/share/fonts</dir>
	<dir>/usr/X11R6/lib/X11/fonts</dir>
	<dir prefix="xdg">fonts</dir>
	<!-- the following element will be removed in the future -->
	<dir>~/.fonts</dir>

```

といった具合に、/usr/X11R6のエントリが書き込まれない。

/usr/share/fontsは存在しないが、これはデフォルトで書かれるのかも。。

# 解決方法

```bash
ln -s /opt/X11 /usr/X11R6
```

して、初めからjhbuildをやり直すか、

```bash
~/gtk/inst/etc/fonts/fonts.conf
```

に、

```xml
<!-- Font directory list -->

    <dir>/usr/share/fonts</dir>
    <dir>/opt/X11/lib/X11/fonts</dir>
    <dir prefix="xdg">fonts</dir>
    <!-- the following element will be removed in the future -->
    <dir>~/.fonts</dir>
```

と

```xml
<dir>/opt/X11/lib/X11/fonts</dir>
```

のエントリを追記することで対応できる。


これで、gimpでフォントを加工するプラグインが「フォントがないので文字機能の利用はできません」とならずに、利用可能になった。

# 2015/5/24 追記

Xquartzを入れずとも、

```xml
<!-- Font directory list -->

        <dir>/usr/share/fonts</dir>
        <dir>~/Library/Fonts</dir>
        <dir>/Library/Fonts</dir>
        <dir>/System/Library/Fonts</dir>
        <dir prefix="xdg">fonts</dir>
        <!-- the following element will be removed in the future -->
        <dir>~/.fonts</dir>
```

と、OSXの標準的なフォントが格納されているフォルダを指定することで、対応できる模様。
【データサイエンスの基礎】pythonでRSSからデータ収集

# 前記事

- [【python初心者がデータサイエンスしてみた】APIからデータ取得【day1】
](http://qiita.com/shunsuke227ono/items/c8f6f13a064d0ad584d2)

一応シリーズ続き。今後も取得したデータ解析とかも続けて書いていく予定。(予定)

# 今回はYahoo!ニュースからRSSでデータ取得してニュースの見出しとリンクを出力するまでをやります。

```
$ python yahoo_news_rss.py
```

で、

```
Yahoo!ニュース・トピックス - トップ
http://dailynews.yahoo.co.jp/fc/world/nuclear_weapons/?id=6160968
NPT決裂 文書採択できず閉幕
http://dailynews.yahoo.co.jp/fc/domestic/injury_case/?id=6160975
家族ら切られ4人死傷 男逮捕
http://dailynews.yahoo.co.jp/fc/economy/coffee_chain/?id=6160962
スタバ鳥取オープンに千人超
http://dailynews.yahoo.co.jp/fc/economy/apparel/?id=6160961
6月契約終了のバーバリー好調
http://dailynews.yahoo.co.jp/fc/science/life_on_earth/?id=6160969
「ゼロ」の概念をサル認識か
http://dailynews.yahoo.co.jp/fc/sports/prowrestling/?id=6160973
初代タイガーマスク 緊急手術
http://dailynews.yahoo.co.jp/fc/entertainment/broad_casting/?id=6160945
生中継に反発 安藤優子氏混乱
http://dailynews.yahoo.co.jp/fc/domestic/obituary/?id=6160936
闘病のアイドル 丸山さん死去
```
がでてくるところまでの簡単なRSSの使いかたを解説します。

# RSSとは

>RSSは、ニュースやブログなど各種のウェブサイトの更新情報を簡単にまとめ、配信するための幾つかの文書フォーマットの総称である。

[wiki](http://ja.wikipedia.org/wiki/RSS)より。
つまり、本物スクレイピングしたら手間なところ、情報取得用に簡単にまとめられてるものて感じかな。

# moduleを揃える。

## feedparserのインストール

> RSSフィードの解析にはfeedparserを利用します。 

とのことなので、feedparserインストール[これ](http://
otiai10.hatenablog.com/entry/2012/05/04/180950)が参考になった。

## feedparserの働き

[ドキュメント](https://pythonhosted.org/feedparser/)を参照するとわかるのですが、以下の二つのkeyはおさえておきましょう。

### entries

>A list of dictionaries. Each dictionary contains data from a different entry. Entries are listed in the order in which they appear in the original feed.

### feed

>A dictionary of data about the feed.

それぞれの内部のkeyに関しては、[ドキュメント](https://pythonhosted.org/feedparser/)に一覧になっているのでそちらをさらに参照。

# RSSの取得と表示

yahooが[こんな感じ](http://headlines.yahoo.co.jp/rss/listhttp://headlines.yahoo.co.jp/rss/list)でRSS提供しています。
のでこのURL叩いて帰ってきたXMLをdictionaryにparseしてやるのが以下。

```yahoo_news_rss.py
import feedparser

RSS_URL = "http://rss.dailynews.yahoo.co.jp/fc/rss.xml"

yahoo_news_dic = feedparser.parse(RSS_URL)
```

これで、ニュースがdictionaryに入る。どんな構造で入っているかはfeedparserのドキュメント見つつ。

んで以下が、全体のtitleとそれぞれの記事のタイトルとリンクを表示するところ。

```yahoo_news_rss.py
print yahoo_news_dic.feed.title

for entry in yahoo_news_dic.entries:
  title = entry.title
  link  = entry.link
  print link
  print title

```

で、冒頭にあったように

```
Yahoo!ニュース・トピックス - トップ
http://dailynews.yahoo.co.jp/fc/world/nuclear_weapons/?id=6160968
NPT決裂 文書採択できず閉幕
http://dailynews.yahoo.co.jp/fc/domestic/injury_case/?id=6160975
家族ら切られ4人死傷 男逮捕
http://dailynews.yahoo.co.jp/fc/economy/coffee_chain/?id=6160962
スタバ鳥取オープンに千人超
http://dailynews.yahoo.co.jp/fc/economy/apparel/?id=6160961
6月契約終了のバーバリー好調
http://dailynews.yahoo.co.jp/fc/science/life_on_earth/?id=6160969
「ゼロ」の概念をサル認識か
http://dailynews.yahoo.co.jp/fc/sports/prowrestling/?id=6160973
初代タイガーマスク 緊急手術
http://dailynews.yahoo.co.jp/fc/entertainment/broad_casting/?id=6160945
生中継に反発 安藤優子氏混乱
http://dailynews.yahoo.co.jp/fc/domestic/obituary/?id=6160936
闘病のアイドル 丸山さん死去
```

てな感じで出てくる。

以上、ソースコードは[こちら](https://github.com/shunsuke227ono/gci/blob/master/collect_data_with_rss/yahoo_news_rss.py)にも。
C#で1時間で解けなきゃ～その４

例のアレ
http://www.softantenna.com/wp/software/5-programming-problems/

# 問題4
正の整数のリストを与えられたとき、数を並び替えて可能な最大数を返す関数を記述せよ。例えば、[50, 2, 1, 9]が与えられた時、95021が答えとなる

```
            int maxLen = int.MaxValue.ToString().Length;
            string zeros = new string('0', maxLen);
            int[] ss = args
                        .Select(a =>
                            new
                            {
                                orgValue = a,
                                padValue = (a + zeros).Substring(0, maxLen)
                            })
                        .OrderByDescending(a => a.padValue)
                        .Select(a => a.orgValue)
                        .ToArray();
            return string.Concat(ss);
```
gcloudをzshにインストールする


半年ぶりぐらいにGCPを触ろうとgcloudコマンドを打ったのですが

```shell
$ zsh: command not found: gcloud
```

というエラーに遭遇しました。

途中で自分のマシンをzshに置き換えていたことを思い出し
せっかくなのでインストールメモです。

## 前提条件
- zshがインストールされていること
- .zshrcはユーザー直下に配置されていること（/Users/ユーザー名/.zshrc）

## インストール
公式ドキュメントにしたがい、コマンドを実行します。

```zsh
$ curl https://sdk.cloud.google.com | bash
```

3回ほどEnterやらを押す（この辺は任意なので各マシンの環境と相談）
と以下の様な感じで入力待ち状態になります。

```zsh
$ Enter path to an rc file to update, or leave blank to use
$ [/Users/ユーザー名/.bash_profile]:
```

zshにしているので、以下のように入力します。

```zsh
$ Enter path to an rc file to update, or leave blank to use
$ [/Users/ユーザー名/.bash_profile]: /Users/ユーザー名/.zshrc
```

そうすると、バックアップが取られ.zshrcファイルに追記されます。

```zsh
$ Backing up [/Users/ユーザー名/.zshrc] to [/Users/ユーザー名/.zshrc.backup].
$ [/Users/ユーザー名/.zshrc] has been updated.
$ Start a new shell for the changes to take effect.
```

追記されたかどうか確認します。

```zsh
# The next line updates PATH for the Google Cloud SDK.
source '/Users/ユーザー名/google-cloud-sdk/path.bash.inc'

# The next line enables bash completion for gcloud.
source '/Users/ユーザー名/google-cloud-sdk/completion.bash.inc'
```

なお、このままでは「source .zshrc」をやると

```zsh
/Users/ユーザー名/google-cloud-sdk/path.bash.inc:3: = not found
```

となってしまいます。
なので、.zshrcに追記された記述を以下のように記述を修正します。

```zsh
# The next line updates PATH for the Google Cloud SDK.
source '/Users/ユーザー名/google-cloud-sdk/path.zsh.inc'

# The next line enables bash completion for gcloud.
source '/Users/ユーザー名/google-cloud-sdk/completion.zsh.inc'
```

そして、「source .zshrc」をやるとエラーが出ずに適用されます。

動作確認として、GCEにアクセスしてみます。

```zsh
# project名は伏せておきます。念のため。
$ gcloud compute --project "XXX" ssh --zone "asia-east1-a" "web"
[ユーザー名@web ~]$
```

繋げることができました。

ちょっとしたことで繋がらないと焦りますが
落ち着いて対処すれば大丈夫なことでした。

## 余談
gcloudはPython2系じゃないとダメっぽいです。
pyenv入れているとrbenvみたいに切り替えができるので
入れておいた方がいいです。
JavaScriptでURLを操作するメモ

なんか難しくって忘れそうなのでメモっておきます。
#history.pushState(state, title, url)
履歴に指定したURLを追加するってこと。指定したURLへの再読み込みは発生しないので、読み込みの処理は自分で行う。

`hoge.com`のページで`hoge.com/hoge`にしたい場合

````js
history.pushState(null,null,"/hoge");

````
こうするとブラウザのURL欄がhoge.com/hogeに変わる。けどページには何も変化が起こらない。
pushStateするとブラウザのURL履歴が追加される。わかりやすく説明すると

````js
history.pushState(null,null,"/hoge1");
history.pushState(null,null,"/hoge2");
history.pushState(null,null,"/hoge3");
````
このように履歴を3回追加したあとに、ブラウザの戻るボタンをクリックしていくと

````php
"hoge.com/hoge3"->"hoge.com/hoge2"->"hoge.com/hoge1"-> "hoge.com"
````

の順に、ブラウザのURL欄が変わっていきます。このときやはりページの内容は変わりません。

さらに`hoge.com`まで戻った後にブラウザの進むボタンをクリックすると

````php
"hoge.com"->"hoge.com/hoge1"->"hoge.com/hoge2"-> "hoge.com/hoge3"
````

の順に、ブラウザのURL欄が変わっていきます。
しつこいようですが、ページの内容は変わりません。

#history.repalceState(state, title, url)
現在の履歴が書き換えられます
要は履歴に追加されないってこと。

`hoge.com`の状態で下記を実行すると

````js
history.relpaceState(null,null,"/hoge1");
````

アドレス欄が`hoge.com/hoge1`に変わりますが、ブラウザの戻るボタンを押しても
一つ前の`hoge.com`には戻りません。hoge.comを見ていた前の履歴のアドレスが表示されます。
見た目の履歴上は、hoge.comには行っていないことになります。

もうサルでもわかるように説明すると。（サルな自分に説明すると・・）

````js
history.pushState(null,null,"/hoge1"); //ブラウザのURL欄はhoge.com/hoge1
history.pushState(null,null,"/hoge2");//ブラウザのURL欄はhoge.com/hoge2
history.replaceState(null,null,"/hoge3");//ブラウザのURL欄はhoge.com/hoge3
history.pushState(null,null,"/hoge4");//ブラウザのURL欄はhoge.com/hoge4
````
このように3回目にreplaceStateを実行したとします。
さて、ブラウザの戻るボタンを押すとどうなるでしょう？

````html
現在のURLは hoge.com/hoge4です。
1回目 ブラウザのURL欄はhoge.com/hoge3　になります。
2回目 ブラウザのURL欄はhoge.com/hoge1　になります。
````
というわけでhoge2には行っていないように見えます。
今度は進むボタンを押すと
````html
現在のURLは hoge.com/hoge1です。
1回目 ブラウザのURL欄はhoge.com/hoge3　になります。
2回目 ブラウザのURL欄はhoge.com/hoge4　になります。
````
このようにhoge2は出てきません。

#第一引数State
ここまでnullで無視してきた第一引数ですが、これはなんでしょうか？
検索すると

>履歴に関連付する任意のオブジェクトを渡すことができ、そのオブジェクトはpopstateイベントハンドラから参照することができます。

**????**
サルでもわかるよう解説すると（サルな自分に・・・）

````js
window.onpopstate=function(e)
       console.log(e.state);
}
//現在のURLはhoge.com
history.pushState("hello",null,"/hoge1");
````

この状態でブラウザの戻る、進むボタンを押してみてください。
進むボタンを押した後に、ブラウザのコンソールで見ると
helloと表示されると思います。stateは、こんな感じでページ遷移時のイベントハンドラに渡されます。また、*history.state*でもアクセスできます。
詳しくは下で解説

#popState
これで最後。
これはpushState後にブラウザの戻る、進むを行った場合のイベント取得するために使用します。

前述の通り、pushStateや、pushState後の戻る、進むボタンではページ内容が
変わりませんでしたよね。
pushStateの場合、pushStateを実行したときにページを読み込む処理を書けばよいですが、
ブラウザの戻るや進むボタンを使った場合には、この**popState**イベントで捕まえて
ページを書き換える必要があるわけです

````js
//本当はwindow読み込み時に処理するけど省略
window.onpopstate=function(e){
       どこの解説にも書いてあるので一応いれとく
       if (!e.originalEvent.state) return; // 初回アクセス時に再読み込みしてしまう対策
       //ページ読み込み、描画処理
       ・・・・
}
````

こんな感じですかね。
ちなみに現在のパスは`location.pathname`、クエリは`location.search`なんかで取得できあすので、これを使って現在のURL応じたページ描画処理を行います。

あと、ブラウザの戻る、進むをjavascirptで処理する場合は
**戻る**:*history.back()*
**進む**:*history.forward()*

を使います。
これらの関数呼び出し後も同様に、popStateイベントが発生します。

※HTML5以降の実装なので、古いブラウザだと使えません。

以上、自分はこれでだいたい理解しました。
hirb でテーブルを縦表示にするには


[hirb](https://github.com/cldwalker/hirb) という gem を導入すると REPL 上で ActiveRecord オブジェクトをテーブル風に表示してくれて、とても見やすくなって便利。
ただ、大量のカラムがあるレコードを表示する際は、以下のようにカラムの値が省略されまくってしまい、逆に見えにくくなってしまう時がある。

```ruby
pry 2.2.1-p85> event
+-----+-----+------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+-----+------+-----+
| id  | cou | star | end | dea | add | loc | acc | sea | min | rem | can | cro | rem | aaa | bbbb | cre | upda | del |
+-----+-----+------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+-----+------+-----+
| xxx | xxx | 2015 | 201 | 201 | 江  | 未  | ゆ  | 3   | 1   | 2   | 201 |     |     |     | 5eb5 | 201 | 2015 |     |
+-----+-----+------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+-----+------+-----+
1 row in set
```
   
で、このような時、 hirb が自動で縦表示に切り替えてくれる場合もあるんだけど、そうでない時に手動で縦表示にするには、以下のようにすればいいようだ。

```ruby
pry 2.2.1-p85> extend Hirb::Console
main

pry 2.2.1-p85> table event, vertical: true
********************* 1. row *********************
            id: xxx
     course_id: xxx
    start_time: 2015-05-23 11:00:00 +0900
      end_time: 2015-05-23 12:15:00 +0900
      deadline: 2015-05-22
       address: XXXXX
      location: XXXXX
        access: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
           ...
1 row in set
true
```

## 追記 - 2016/04/07 19:55

``.pryrc`` に以下のような関数を定義しておくと便利になった。

```ruby:.pryrc

   begin
     require 'hirb'
   rescue LoadError
   end

   if defined? Hirb
     extend Hirb::Console
     def vtable(record, options = {}, *args)
       table record, { vertical: true }.merge(options), *args
     end
   end
```

```ruby
   pry> vtable Hoge.last
   ****************** 1. row ******************
             id: 1
     created_at: 2016-03-28 19:00:07 +0900
     updated_at: 2016-03-28 19:00:07 +0900
     ...
   1 row in set
   => true
```
dockerでENTRYPOINTに自由に引数を指定する

## 引数を`$@`にすればよい

```
ENTRYPOINT /usr/bin/command $@
```

## 実行例

```bash:
docker run -it --rm -v `pwd`:/root tukiyo3/pysheng -- -e 2 "https://books.google.co.jp/books?id=XXXXXX"
```
Apacheのauthz,authnのzとかnってなんなの？

authn = AutheNtication = 認証[^1]
authz = AuthoriZation = 認可[^2]

ということみたいです。

認証と認可の違いはこちら: http://d.hatena.ne.jp/end0tknr/20110104/1294112345

[^1]: https://ja.wikipedia.org/wiki/%E8%AA%8D%E8%A8%BC
[^2]: https://ja.wikipedia.org/wiki/%E8%AA%8D%E5%8F%AF_(%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3)
PHP7調査(34)型名と同じクラス名が作れないようになった

PHP7から、組み込みの型名と同じクラス名・インターフェース名・trait名が作れなくなりました。

具体的には次の名前が予約されています。

* int
* float
* bool
* string
* true
* false
* null
* resource（PHP7.0時点ではエラーではなく、規約として利用禁止）
* object（PHP7.0時点ではエラーではなく、規約として利用禁止）
* mixed（PHP7.0時点ではエラーではなく、規約として利用禁止）
* numeric（PHP7.0時点ではエラーではなく、規約として利用禁止）

これらは他の予約語とは異なり、変数名や関数名としては利用できます。

これは、PHP7から採用されたスカラ型のタイプヒントとの整合性の意味でも必要な修正だと言えるでしょう。intというタイプヒントがスカラ型を指しているのかユーザー定義クラスを指しているのか曖昧だと使い物になりませんからね。

# コード例

```php
<?php
class int {}
```

```
PHP Fatal error:  Cannot use 'int' as class name as it is reserved in /tmp/foo.php on line 2
```

# 直近の動向

voidも予約語にしようぜ、なんて話題がinternal MLで今も上がっています。

# 参照

* [PHP RFC: Reserve More Types in PHP 7](https://wiki.php.net/rfc/reserve_more_types_in_php_7)
* [PHP RFC: Reserve Even More Types in PHP 7](https://wiki.php.net/rfc/reserve_even_more_types_in_php_7)
C#で作るコンソールアプリケーションの.exeとwindowsアプリケーションの.exeの違い

# はじめに
簡単なC#ソースから2通りの方法で.exeを作成します．
そしてバイナリを比較します．

# .exe作成
ソース

```c#:Cock.cs
class Cock
{
	static void Main()
	{
	}
}
```

**/target:exe**を指定

```console:
/c/Windows/Microsoft.NET/Framework/v4.0.30319/csc.exe /target:exe Cock.cs
```

**/target:winexe**を指定

```console:
/c/Windows/Microsoft.NET/Framework/v4.0.30319/csc.exe /target:winexe Cock.cs
```

# 比較

exeファイルを比較します．
3つ違う箇所があります．

1. アドレス88h
2. アドレスDCh
3. アドレス440h~44Fh

1.はPEヘッダのCOFFヘッダのタイムスタンプです．
.exeを作成した時刻が異なります．

2.はPEヘッダのオプションヘッダのサブシステムです．
/target:exeの場合は3，/target:winexeの場合は2になります．
[XBOXもあるらしい](https://msdn.microsoft.com/en-us/library/windows/desktop/ms680339%28v=vs.85%29.aspx)

3.はモジュールバージョンIDであり，GUIDです．
この値は.exe作成のたびに変わります．/taget:は関係ありません．
今回はぐうぜんにも16バイト全て違う値になった．うれしかった．

```c#
Assembly.ManifestModule.ModuleVersionId
```

# おわりに
サブシステムの値が異なります．
iphone アプリの開発手順 for 初心者

*この投稿は，随時更新される予定です．*

# **対象とする人**
* iphone アプリの開発をしたことがない人

# **手順**
**1. 開発環境を整える**
以下のサイトを参考にして，Mac に Xcode (無料) をインストールする．
[中学生からわかるiPhoneアプリ開発入門。第1回 。](http://www.appbank.net/2011/12/24/iphone-news/342008.php)
**2. Xcode を起動する**
**3. Create a New Xcode project を選択する**
**4. アプリのテンプレートを選択する**
アプリのテンプレートには，
* Master-Detail Application
* Page-Based Application
* Single View Application
* Tabbed Application
* Game
などがあり，開発するアプリに応じて選択することができる．
以下の動画を参考にして，アプリのテンプレートを選択する．
[Explaining different application types in iOS](https://www.youtube.com/watch?v=xaGsyUDmwbA)
![template_selection.png](https://qiita-image-store.s3.amazonaws.com/0/77762/c9b17a2e-8777-9886-f3e6-68216d455267.png)
ここでは，Master-Detail Application テンプレートを使ったサンプルアプリを開発する．
**5. プロダクト名を入力する**
![master_detail_naming.png](https://qiita-image-store.s3.amazonaws.com/0/77762/3704be2c-5a22-2378-dc9f-836ec39d4cf6.png)
**5.5. バージョン管理用にGit をインストールする**
Xcode には，開発するアプリをGit で管理する機能があるらしい．
Git とは，ソフトェアのバージョンを管理するためのソフトウェアである．
Git を用いることで，任意の時点のバージョンに立ち戻ったり，ブランチという本流のソフトウェアとは別に開発を行うリポジトリを作成したりすることができる(不勉強のため
，ブランチを一言で説明することができませんでした．ブランチという機能の概念については，ネット上で図解してあるのでそちらを参照してください)．
Git を使うメリットとしては
* ある時点でのソフトウェアの状態をゲームのようにセーブできるので，開発中に手戻りが発生したとき，楽にソフトウェアを任意の状態に戻すことができる
* ブランチを作成し
，ブランチで機能拡張や実験的な変更を行うことで，本流のソフトウェアに影響を与えずに(例えば，新たなバグを混入させずに)開発を進めることができる．
などが挙げられる．Git はソフトウェア開発において非常に頻繁に使われるので，ソフトウェア開発初心者も勉強しておいて損はない．
Git をインストールするには Homebrew というソフトウェアがあると楽なようである．
以下のサイトを参照のこと．
[MacにHomebrewをインストールする](http://qiita.com/_daisuke/items/d3b2477d15ed2611a058)
[gitインストールを1分で済ませる【Mac編】](http://www.tettori.net/post/1491/)
pyshengで保存するファイル名が16進数だったので修正した

## 参考

* [文字参照や実体参照を通常の文字に戻す【Python】 - Programming Magic](http://www.programming-magic.com/20080820002254/)

## pull request

* https://github.com/tokland/pysheng/pull/15

### 修正前

```
$ pysheng -e 2 "https://books.google.co.jp/books?id=NP3yag-zvhAC"
&#12456;&#12473;&#12461;&#12517;&#12540;&#12499;&#12474;&#12512; - Python&#20837;&#38272;.page-002.png
```

### 修正後

```
$ pysheng -e 2 "https://books.google.co.jp/books?id=NP3yag-zvhAC"
Python入門/002.png
```


## dockerイメージ作った

```bash:
docker run -it --rm -v `pwd`:/root tukiyo3/pysheng -- -e 2 "https://books.google.co.jp/books?id=XX"
```
bash > 式の前の":(コロン)"の使用

[lazynickさんの投稿](http://qiita.com/lazynick/items/2ecf55ee9631bbacea08)にて":"が使われていた。

スクリプトの気になる部分を抜き出すと

```bash
#!/bin/env bash

for ((i=0; i<3; i++));do
 : $((NUMBER_PROCESS++))
  
 echo $NUMBER_PROCESS
done
```

":"の意味があまり理解できていなかった。

[m-yamashitaさんの投稿](http://qiita.com/m-yamashita/items/889c116b92dc0bf4ea7d)に":"を使う例がいくつかある。

> : というコマンド(？)を利用すると、何もせずに終了ステータス0(つまり正常終了)を返します。
...


試しに":"を抜いたもので実行すると

```bash
#!/bin/env bash

for ((i=0; i<3; i++));do
 $((NUMBER_PROCESS++))
  
 echo $NUMBER_PROCESS
done
```

```txt:実行結果
... 0: command not found
... 1: command not found
... 2: command not found
```

理解できた。
":"がない時は、((NUMBER_PROCESS++))された結果(例:0)がコマンドとして実行されようとしてエラーとなる。
":"をつけることで、コマンドとしては実行せず、加算++だけするということのようだ。

man setで下記の説明がある。
> : [arguments]
> No effect; the command does nothing beyond expanding arguments and performing any specified redirections. A zero exit code is returned.
Storyboardを開くとクラッシュするときの対処法


## 現象
Storyboardを選択すると、開かれずにクラッシュする。

## 環境
- Xcode 6.1
- OSX 10.8 (Mountain Lion)

## 原因
他のPC（OSX 10.9以降）でStroryboardの変更を行うと、NSAppearance属性がつく。
そのプロジェクトをOSX 10.8以前のPCで開くと
OSX 10.8以前はNSAppearanceに対応していないため、解決できずにクラッシュする。

## 解決法
1. OSアップデート
2. NSAppearance属性を除去

### 1. OSアップデート
Mavericks以降であればなんでもOK

### 2. NSAppearance属性を除去
Storyboardを右クリックし、  
__Open As__ で __Source Code__ を選択

```
 appearanceType="aqua" 
```
 属性を全て除去
 
 
## 参考
[NSAppearance](https://developer.apple.com/library/mac/documentation/AppKit/Reference/NSAppearance_Class/)
bash > %を使った文字の変換 > for fname in test.tmp;do echo $fname TO ${fname%.tmp}.work; done

http://qiita.com/dek1chan/items/a25472963a2a072f7d87
で紹介されている変換処理。

有用なので、メモとして抜き出しておく。

%を使って拡張子を削除した後、別の拡張子を追加している。

%の使い方はman bashで/remove matchingで検索したら説明が出てくる (suffixの方)。
proxmoxホストが落ちたのでOFF/ONしたらコンテナが自動起動してこない場合の対処

proxmoxホストが突然落ちたとき以下エラーになることがある。

## コンテナが起動してこない例

* [container locked](http://forum.proxmox.com/threads/1482-container-locked)
* [Container already locked - OpenVZ Linux Containers Wiki](https://openvz.org/Container_already_locked)

```bash:
# vzctl stop 270
Container already locked
```

## 対処

```bash:
# rm /var/lib/vz/lock/270.lck
```

```bash:
# vzctl start 270
Warning: distribution not specified in CT config, using defaults from /etc/vz/dists/default
Starting container ...
vzquota : (error) can't lock quota file, some quota operations are performing for id 270
vzquota on failed [7]
```

## can't lock quota file, と出た場合

```bash:
# vzctl stop 270
# vzquota drop 270
vzquota : (warning) Quota is running for id 270
# vzctl start 270
```
gitWatch > Don't quote nil and t in doc strings

https://github.com/emacs-mirror/emacs/commit/96794d2f97cd064e4c2bf4f71459b42558cc8c79

> This is as per "Tips for Documentation Strings" in the elisp manual.
For consistency, do the same in diagnostics and comments.
...
-Set this variable to <font color=red>`nil'</font> to empty the cache, and have it replenish from the
+Set this variable to <font color=red>nil</font> to empty the cache, and have it replenish from the

elispではこういう記載規約ということなのか?

''をつけてはダメな理由があるのだろうか?

nilはいいのだが、検索する時't'では検索でしぼれるが、tでは関係ない検索が膨大にひっかかり個人的には''がある方が望ましいと思っている。
2015-05-23 linux > ファイル時刻を秒まで表示 > ls --full-time test.txt

[参考](http://d.hatena.ne.jp/kaoskfos/20080414/p1)

ファイルの作成時刻などは通常は分までしか表示されない。

ある複数ファイルを作成した時刻を秒まで調べたかった。

```bash
$ls --full-time text.txt
-rw-rw-r--. 1 xxx xxx 0 2015-05-23 08:24:49.063094094 +0900 test.txt
```
でいいようだ。

"-"が1つだけの短縮形はないのだろうか? manを見たけどわからなかった。


(追記 2019-07-10)
上記はISO8601???
van_de_Hulst > typo 4.42 > "l" is mistakenly taken to be superscript

Kindle No. 1146 > the paragraph under equations $E_r$ and $E_l$

Kindle version (typo)
> where $r$ and $^l$ refer to the electric fields perpendicular to and parallel with the plane of scattering.

printed book (correct)
> where $r$ and $l$ refer to the electric fields perpendicular to and parallel with the plane of scattering.
van_de_Hulst > typo 3.22 > several "l"s mistakenly taken to be superscript

Kindle No. 885 > the second half of the 1st paragraph

Kindle version (typo)
> ... if either $^l = f_1$ or $^l = f_2$. ... the intensity in a focus, $^l = f_1 = f_2$.

printed book (correct)
> ... if either $l = f_1$ or $l = f_2$. ... the intensity in a focus, $l = f_1 = f_2$.
van_de_Hulst > typo 3.21 > several "l"s mistakenly taken to be superscript

Kindle No. 850 > the paragram under Fig.3

Kindle version (typo)
> ... in sec 3.12. The only difference with plane waves is the replacement of the factor $1/^l$ in the exponent by $1/^l - 1/f$.

printed book (correct)
> ... in sec 3.12. The only difference with plane waves is the replacement of the factor $1/l$ in the exponent by $1/l - 1/f$.


There are too many mistakes related to the "l" being superscript.
技術英語 > When the time/condition is right,

When the time is right, 

http://eow.alc.co.jp/search?q=time+is+right
> （チャンスの）時が来たら、機が熟したら、そのときが来たら、頃合いになったら、しかるべき時が来たら

When the condition is right, 

http://eow.alc.co.jp/search?q=condition+is+right
> if condition is right
> 条件が整えば

Star trek Voyagerにて何度か出てきたフレーズ。

技術的な会話の中でも使えそう。

http://homepage.cs.uri.edu/book/cpu_memory/cpu_memory.htm
> Likewise, when the time is right, the control unit sends these items from memory to the arithmetic/logic unit,

https://social.msdn.microsoft.com/Forums/en-US/fe4221c6-b182-4b0f-b04b-47e20c6a45d3/vbnet-trying-to-detect-key-state-of-numlock?forum=vbgeneral
> When the condition is right, the program will break.
Git管理下のテキストファイルから文字列検索してファイル名取得

"xxx"を検索する場合:

```console
$ git grep -I xxx | sed -e "s/:.*$//" | uniq
foo
bar.html
hoge/fuga.txt
hoge/piyo.txt
```

* `git grep`で、Git管理下のファイルのみから検索
    * `-I`でバイナリを除外
* `git grep`が結果としてファイル名とその行を出力するので、`sed`でファイル名部分のみに
* `uniq`で同じファイル名はひとつに

※ファイル名に":"が含まれるとグワーーーー
メイドさんに教えるバイトとビット


##Byte（バイト）
情報量の単位。ほとんどの場合、1Byte（バイト）は8bit（ビット）。

##語源
bite（ひとかじり）
情報量の最小単位をまとめたもの

アップルのロゴは、byte（バイト）とbite（噛む）をかけたもの。

##それでは、そもそもbit(ビット）何？

##bit（ビット）
コンピュータが扱う情報の最小単位。
binary digit（2進数字）を略したもの。
bitは0または1のいずれかの値をとるデータ。

##語源
bit[名詞]小片という意味、この単語と「binary digit」かけてつくったと思われる。

##それでは、なぜbit（ビット）を使うのか？

##理由
２進法がコンピューターにとって都合が良いから。

* ノイズの強い
* 電子回路が単純になる
* 演算が簡単になる

##これは、日本Androidの会秋葉原支部・コスプレ理系女子普及部 第36回定例会 講義の下書き
Enterpirse UX 2015 Conferenceのスケッチノート


アメリカではスケッチノートというフォーマットのメモ術が流行っているらしく、デザイナーの割合が多いカンファレンスだけあって、当日会場では講壇のスピッチとほぼリアルタイムでスケッチノートを作成している人が何人もいて、それがTwitterで共有されていました。

以下はその一つ（というか、公式スケッチノート）。
https://www.flickr.com/photos/merrybrain/sets/72157652664602338
npm installでError:EACCESがでたら


例：Bowerのインストール

```bash
npm install -g bower
npm ERR! tar.unpack untar error /Users/Foo/.npm/bower/1.4.1/package.tgz
npm ERR! Darwin 14.3.0
npm ERR! argv "node" "/usr/local/bin/npm" "install" "-g" "bower"
npm ERR! node v0.12.3
npm ERR! npm  v2.9.1
npm ERR! path /usr/local/lib/node_modules/bower
npm ERR! code EACCES
npm ERR! errno -13

npm ERR! Error: EACCES, mkdir '/usr/local/lib/node_modules/bower'
npm ERR!     at Error (native)
npm ERR!  { [Error: EACCES, mkdir '/usr/local/lib/node_modules/bower']
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   path: '/usr/local/lib/node_modules/bower',
npm ERR!   fstream_type: 'Directory',
npm ERR!   fstream_path: '/usr/local/lib/node_modules/bower',
npm ERR!   fstream_class: 'DirWriter',
npm ERR!   fstream_stack:
npm ERR!    [ '/usr/local/lib/node_modules/npm/node_modules/fstream/lib/dir-writer.js:36:23',
npm ERR!      '/usr/local/lib/node_modules/npm/node_modules/mkdirp/index.js:46:53',
npm ERR!      'FSReqWrap.oncomplete (fs.js:95:15)' ] }
npm ERR!
npm ERR! Please try running this command again as root/Administrator.

npm ERR! Please include the following file with any support request:
npm ERR!     /Users/Foo/.npm/npm-debug.log
```

## 解決方法1 chmodで権限を与える

解決コマンド
`sudo chmod 777 /usr/local/lib;sudo chmod 777 /usr/local/lib/node_modules`
※777の意味などは自分で調べましょう

ディレクトリを作成する権限がないため、このエラーが起きています。
`npm ERR! Error: EACCES, mkdir '/usr/local/lib/node_modules/bower'`
と書いてるように、/usr/local/lib か /usr/local/lib/node_modules に権限がないことが分かります。
したがって、その２つのディレクトリに権限を付与します。
※node_modulesディレクトリは存在しないこともあるので、その場合はコマンド失敗しても大丈夫です

## 解決方法2 sudoで実行

解決コマンド
`sudo npm install -g bower`

インストール系のコマンドに失敗した場合、大体対策が出力されます

"Please try running this command again as root/Administrator."とあるように、
rootもしくはAdministratorで実行してくださいと書いてあります。
AppleScriptからUSB機器の接続チェック

do shell script で

```shell-session
system_profiler SPUSBDataType | grep '0x0714'
```

ここでgrepしてるのはプロダクトID。
調べ方はシステム情報からでも、

```shell-session
% system_profiler SPUSBDataType
〜〜〜〜〜〜〜〜〜〜〜〜〜〜
            PTK-440:

              Product ID: 0x00b8
              Vendor ID: 0x056a  (WACOM Co., Ltd.)
              Version: 1.04
              Speed: Up to 12 Mb/sec
              Manufacturer: Tablet
              Location ID: 0x14220000 / 5
              Current Available (mA): 500
              Current Required (mA): 300
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
```

として拾っても。
一つしか無いことが分かっているなら

```applescript
try
do shell script "system_profiler SPUSBDataType | grep '0x0714'"
on error
---無い時の処理
return
end try
```

とか？
1時間以内に解けなければプログラマ失格となってしまう5つの問題

[1時間以内に解けなければプログラマ失格となってしまう5つの問題](http://www.softantenna.com/wp/software/5-programming-problems/)なんてのがあるんですね。
確かに1,2,3に比べて4,5の差は大きいような気がします。

rubyでやってみました。

####問題4

```
echo 5 2 1 9 50 56 | ruby -e "puts gets.split(/\s+/).permutation.map(&:join).max"
```

####問題5

```rb
def gen_pattern(depth, size, acc = [])
  if depth >= size
    exp = (1 .. (size + 1)).zip(acc).flatten.join.gsub(/ /, "").gsub(/(\+|-)/, ' \1 ')
    puts exp if eval(exp) == 100
  else
    [" ", "+", "-"].each do |op|
      gen_pattern(depth + 1, size, acc + [op])
    end
  end
end

gen_pattern(0, 8)
```

2015/05/23追記
問題4でpermutation使ってる時点で反則気味なので、問題5も同じ方針で。

```rb
puts [" ", "+", "-"].repeated_permutation(8).map{|e|
  (1 .. 9).zip(e).flatten.join.gsub(/ /, '').gsub(/(\+|-)/, ' \1 ')
}.select {|e|
  eval(e) == 100
}
```

2015/05/26追記
teratailでこの問題の解き方を質問している人がいてて、問題5に関して、
私とほぼ同じ方針で解いておられた方が、入れ子の配列をjoinするときにflattenは不要、と
書いてあって試してみると

```rby
[["1", "2", ["3"]], ["4", "5"]].join
#=> "12345"
```

と、確かに不要でした。

どうやってるんだろうと思ってRubyのソースを確認してみると、
要素が配列だと再帰的に潜っていくというような処理になってるみたいですね。
処理を追ってみると、再帰的な配列になってるとエラーにする処理が書かれてた(array.c)ので、
そんな配列どう作るんだ？と思っていろいろ試してみると、こんなことが出来るんですね。

```rb
irb(main):001:0> ary = [1, 2, 3]
=> [1, 2, 3]
irb(main):002:0> ary[0] = ary
=> [[...], 2, 3]
```

`[...]`なる表記は初めて見ました。確かに永遠に潜って行けるようです。
joinすると確かにエラーになりました。

```rb
irb(main):003:0> ary[0][1]
=> 2
irb(main):004:0> ary[0][0][1]
=> 2
irb(main):005:0> ary[0][0][0][1]
=> 2
irb(main):006:0> ary.join
ArgumentError: recursive array join
        from (irb):6:in `join'
        from (irb):6
        from D:/Ruby21-x64/bin/irb:11:in `<main>'
```

あまり使いどころは思いつきませんでしたが、面白いですね。


というわけで、問題5はこう書けますね。

```rb
puts [" ", "+", "-"].repeated_permutation(8).map{|e|
  (1 .. 9).zip(e).join.gsub(/ /, '').gsub(/(\+|-)/, ' \1 ')
}.select {|e|
  eval(e) == 100
}
```
Chrome 拡張 esarea でブラウザ内でも快適 Markdown 生活

## <i class="fa fa-paw" style="font-size:1em;"></i> 概要
Chrome 拡張 esarea でブラウザ内でも快適 Markdown 生活

## <i class="fa fa-cloud-download" style="font-size:1em;"></i> インストール
* Chrome ウェブストアにアクセス
<i class="fa fa-external-link" style="font-size:1em;"></i> [esarea - Chrome ウェブストア](https://chrome.google.com/webstore/detail/esarea/pjhancoeamcahkmbmgoonbaggjbpijoc?utm_source=chrome-app-launcher-info-dialog)

![esarea_shop.png](https://qiita-image-store.s3.amazonaws.com/0/43480/a5111e09-1966-0b3d-ca50-f224c65709d2.png)

* CHROME に追加を押下
* インストール完了

## <i class="fa fa-hand-o-right" style="font-size:1em;"></i> 基本機能
入力状況 = コンテキスト に応じて、動作が変わります。

|コンテキスト|機能|操作|
|:--|:--|:--|
|なし|インデント(順)|Tab|
|なし|インデント(逆)|Shift + Tab|
|テーブル操作|カラム移動(順)|Tab|
|テーブル操作|カラム移動(逆)|Shift + Tab|
|テーブル操作|自動補完|1行目を入力後、行末で Enter|
|リスト|自動補完|行末で Enter|

※タスクリストのトグル操作は、Windows だとショートカットキーの影響か動作確認できず

## <i class="fa fa-flask" style="font-size:1em;"></i> 動作確認
Trello の description 欄で esarea を動かしてみました

![esarea_demo.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/3e2e64ae-a428-ad9f-38fa-8c2666c07291.gif)

## <i class="fa fa-book" style="font-size:1em;"></i> 関連サイト
* <i class="fa fa-external-link" style="font-size:1em;"></i> [esarea で GitHub の markdown を倍速で書く - kakakakakku blog](http://kakakakakku.hatenablog.com/entry/2015/04/05/013727)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [esarea – 任意のテキストエリアでMarkdown記入を補助 - MOONGIFT](http://www.moongift.jp/2015/03/esarea-%E4%BB%BB%E6%84%8F%E3%81%AE%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%AA%E3%82%A2%E3%81%A7markdown%E8%A8%98%E5%85%A5%E3%82%92%E8%A3%9C%E5%8A%A9/)

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [fukayatsu/esarea - GitHub](https://github.com/fukayatsu/esarea)
Chefで設定ファイルを記述するときはrenderを使うと便利な件

Apacheなどの設定ファイルを書くとき、メインの設定ファイルから各機能毎の小さい設定ファイルをインクルードするのが定番かと思います。

```apache:httpd.conf
Include conf.d/listen.conf
Include conf.d/user.conf
```

よく見ますよね。

# erbのrenderを使ってインクルードする方法もある

Chefで設定ファイルを書くときは、上記のようにしてもいいのですが、erbの`render`メソッドを使ってインクルードする方法もあります。

```erb:httpd.conf.erb
<%= render "listen.conf.erb" %>
<%= render "user.conf.erb" %>
```

この場合は、Chef側であらかじめ設定ファイルが連結された上で、1個の巨大なhttpd.confがサーバに配置されることになります。

「巨大な1個の設定ファイル」は一見ダサく見えますが、実は意外とメリットもあるのです。

## インクルードするファイルが増えたり減ったりした場合に、レシピを修正しなくてよい

Include方式の場合、設定ファイルを追加したり削除したりしようとすると、Include文を追加/削除するだけでなく、レシピのtemplateリソースの記述も修正する必要があります。

```ruby:default.rb
%{
listen.conf
user.conf  #   ← コレ
}.each do |file|
  template "/etc/httpd/conf.d/#{file}" do
    source "#{file}.erb"
  end
end
```

このレシピを直すというのが意外に面倒で忘れがちです。

renderの場合はレシピの修正が不要です。

## renderの方が削除時の事故が起こりにくい

Chefはファイルの削除が苦手だと言われていますがその通りです。
例えば`conf.d/user.conf`が不要になったとして、テンプレートファイルとレシピからそれを削除したとします。

ところがChefのレポジトリ上で消してもサーバには設定ファイルが残ってしまうため、`Include conf.d/*.conf`のような記述があると残留したファイルが読み込まれてしまいます。
対策として、サーバ上の不要ファイルを手動で削除したり、fileリソースの`action :delete`などを使って消したりする必要があります。これはかなり面倒です。

一方erbのrenderを使う場合、renderの行を削除すれば確実に削除を反映することができます。
プロビジョニングするときの`--why-run`で差分としても現れます。

# 「設定ファイルは分割すべし」の意味は時代とともに変わる(かも)

「分割すべし」という考えは正しいですが、上記のようにChefレポジトリ上で分割できているのであれば、必ずしもサーバ上で分割配置されていなくてもよいかもしれません。

例えて言うなら、フロントエンド開発で、開発中はJSやCSSファイルを分割していても、リリースするときは結合してサーバに設置しますよね。それと似たようなことかなと思います。

ちなみに私はどっちの方法でやってるかというと、今のところはInclude方式とrender方式を両方使ってハイブリッドでやっています(w)
もうちょっと運用がこなれてきたらrender方式に統一するかもしれません。