OmniAICreator/Qiita-1.07M huggingface dataset:
Titanium で GCM を利用する際のモジュールのサンプルコードを CoffeeScript で書き直し

https://github.com/Guti/Google-Cloud-Messaging--Titanium-/blob/6ac1270026f3cc266f37812b64ef40f2ab1b9055/example/PushNotification.js

これを CoffeeScript で書き直しました．

```coffeescript:PushNotification.coffee
exports.pushNotification = ->
  hostURL = 'http://YOUR_HOST_URL/register?'

  gcm = require 'com.activate.gcm'
  Ti.API.info "module gcm is => #{gcm}"

  Ti.API.info 'Registering...'

  gcm.registerC2dm
    success: (e) ->
      Ti.API.info "JS registration success event: #{e.registrationId}"
      alert "Yeah JS registration success event: #{e.registrationId}"
      alert "Sender ID:#{gcm.getSenderId()}"
      alert "Registration ID:#{gcm.getRegistrationId()}"

      appName = Ti.App.name
      appVersion = Ti.App.version

      deviceUUID = Ti.Platform.macaddress # Ti.Network.remoteDeviceUUID
      deviceName = Ti.Platform.username
      deviceModel = Ti.Platform.model
      deviceSystemVersion = Ti.Platform.version
      deviceToken = e.deviceToken
      regId = e.registrationId

      # deviceUUID = deviceUUID.replace /-/ig, ''
      # deviceToken = deviceToken.replace /<>/ig, ''

      host = hostURL
      urlString = host
      # urlString += "&appname=#{appName}"
      # urlString += "&appversion=#{appVersion}"
      # urlString += "&deviceuid=#{deviceUUID}"
      # urlString += "&devicetoken=#{deviceToken}"
      # urlString += "&devicename=#{deviceName}"
      # urlString += "&devicemodel=#{deviceModel}"
      # urlString += "&deviceversion=#{deviceSystemVersion}"
      # urlString += "regId=#{regId}"

      loader = Ti.Network.createHTTPClient()
      loader.setTimeout 60000

      loader.onload = (evt) ->
        alert evt
        return

      loader.open 'GET', urlString, false
      loader.send()

      alert urlString
      return

    error: (e) ->
      Ti.API.error "Error during registration : #{e.error}"
      alert "Error during registration : #{e.error}"

      if e.error is 'ACCOUNT_MISSING'
        message = 'No Google account found; you will need to add on in order to activate notifications'

      (Titanium.UI.createAlertDialog
        title: 'Push Notification Setup'
        message: message
        buttonNames: ['OK']
      ).show()
      return

    callback: (e) -> # called when a push notification is received
      Ti.API.info "JS message event: #{JSON.stringify e.data}"
      alert "JS message event: #{JSON.stringify e.data}"

      # same as e.data
      # data = Ti.App.Properties.getString 'com.activate.gcm.last_data', ''
      # data = JSON.parse data
      # Ti.App.Properties.removeProperty 'com.activate.gcm.last_data'
      # Ti.App.Properties.hasProperty 'com.activate.gcm.last_data'
      # Ti.Android.NotificationManager.cancelAll()
      return
```
Titanium Studio が Ubuntu 12.04 (amd64) で build するとき必ず死んだフリをしています

Android エミュレータを起動しようとしても実機転送しようとしても

```text
[ERROR] Exception occured while building Android project:
[ERROR] Traceback (most recent call last):
[ERROR]   File "/home/ka/.titanium/mobilesdk/linux/2.1.1.GA/android/builder.py", line 2242, in <module>
[ERROR]     s.build_and_run(True, avd_id, device_args=device_args)
[ERROR]   File "/home/ka/.titanium/mobilesdk/linux/2.1.1.GA/android/builder.py", line 1849, in build_and_run
[ERROR]     self.wait_for_device('d')
[ERROR]   File "/home/ka/.titanium/mobilesdk/linux/2.1.1.GA/android/builder.py", line 362, in wait_for_device
[ERROR]     devices = self.sdk.list_devices()
[ERROR]   File "/home/ka/.titanium/mobilesdk/linux/2.1.1.GA/android/androidsdk.py", line 220, in list_devices
[ERROR]     (out, err) = subprocess.Popen([adb, 'devices'], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
[ERROR]   File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
[ERROR]     errread, errwrite)
[ERROR]   File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
[ERROR]     raise child_exception
[ERROR] OSError: [Errno 2] No such file or directory
```

このエラーが出て困ってしまいます．

```sh
sudo apt-get install ia32-libs
```

これで OK です．

# 参考

* https://jira.appcelerator.org/browse/TIMOB-11666
* https://jira.appcelerator.org/browse/TIMOB-11666?focusedCommentId=226296&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-226296

* http://developer.android.com/intl/ja/sdk/installing/index.html

ここの Information for other platforms の Troubleshooting Ubuntu

# 参考にならなかったもの

* http://ubuntuforums.org/showthread.php?t=2014687
* http://stackoverflow.com/questions/11277438/could-not-build-titanium-android-application-to-test-in-emulator/11482718#11482718
Coqで型クラス

```coq:Show.v
Require Import String.
Open Scope string_scope.

(* 型クラスShowの定義 *)
Class Show (A: Set) := {
  show : A -> string
}.

(* フィールドshowの型 *)
Check @show.
(*
show
     : forall A : Set, Show A -> A -> string
((A:Set)と(s:Show A)の部分は暗黙引数となり、省略可能)
*)

(* string型をShowクラスのインスタンスとする *)
Instance ShowString : Show string := {
  show s := s
}.

(* bool型をShowクラスのインスタンスとする *)
Instance ShowBool : Show bool := {
  show b := match b with | true => "true" | false => "false" end
}.

(* 文字列はShowクラスのインスタンス *)
Definition foo := show "hello".

(* ブール型はShowクラスのインスタンス *)
Definition bar := show true.

(* 混ぜても使える *)
Definition hoge := show "hello" ++ show false.
```
Ubuntu 12.04 に Oracle Java 6, 7 (JRE, JDK) をインストール

OpenJDK でいいよ，って人は http://qiita.com/items/1b56bf19e4bf398de96c を参考にすればいいでしょう．

しかし[やんごとなき理由](http://docs.appcelerator.com/titanium/latest/#!/guide/Quick_Start-section-29004949_QuickStart-SystemRequirements "Titanium 2.1 - Appcelerator Docs")等でどうしても Oracle の方の Java を使わなければならないときがあったりします．

そこで，適当にググって

```sh
sudo apt-get install sun-java6-jre
```

してもそんなパッケージねーよｋｓｇって言われたり，

```sh
sudo add-apt-repository ppa:flexiondotorg/java
```
しても

```text
You are about to add the following PPA to your system:
 tag:launchpad.net:2008:redacted
 More info: https://launchpad.net/~flexiondotorg/+archive/java
Press [ENTER] to continue or ctrl-c to cancel adding it

gpg: keyring `/tmp/tmpfDuKkl/secring.gpg' created
gpg: keyring `/tmp/tmpfDuKkl/pubring.gpg' created
gpg: "tag:launchpad.net:2008:redacted" not a key ID: skipping
recv failed
```

としか出なくて困っている人 (主に私) へ．

```sh
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update

sudo apt-get install oracle-java6-installer
sudo apt-get install oracle-java7-installer # 両方でも片方だけでもいいよ
```

こうすれば大丈夫です．

ちなみに，`java` や `javac` コマンドが実際どのバージョンのものを使うことになってしまうのか分からないので怖い＞＜

という人 (主に私)，

```sh
sudo update-alternatives --config java
```

これでいつでも切り替えられます．安心ですね．

問題なのは，このメモも遅かれ早かれまたただのエラーを吐くだけのサンプルに成り下がってしまいかねないこと．

というか既に半年以上前に皆が困っていた問題らしい感あって非常に今更感の溢れるエントリであり己の無知が悲しい．

Ubuntu で Java をインストールする際に，確固たる **ここをまず最初に参照するようにすればだいたい大丈夫** な情報源が欲しいところです．

ここ https://help.ubuntu.com/community/Java かなぁ…？

# 参考


* http://arunimmanuel.blogspot.jp/2012/11/installisation-issues-with-appcelerator.html?spref=tw
* http://www.gaggl.com/2012/04/installing-java6-jdk-on-ubuntu-12-04/
* http://radi0ant.hatenablog.com/entry/2012/05/04/035243
* http://d.hatena.ne.jp/absj31/20120925/1348692705
delayed_jobs による非同期処理時に、exception_notification によるエラー通知メール送信を行う


[delayed_jobs](https://github.com/collectiveidea/delayed_job) は極めて簡単に非同期処理を実現してくれる素敵gem。

> see:
[Railsで非同期処理が簡単に実装できる「Delayed_job」が便利すぎる](http://blog.nzm-o.com/item/222)
[[ruby] delayed_job ちょっとだけ詳しく](http://w.koshigoe.jp/study/?ruby-delayed_job)

[exception_notification](https://github.com/rails/exception_notification) は Railsでの例外発生時に詳細を記述したエラー通知メールを送信してくれる素敵gem。

> see:
 [Rails本番運用で役に立つプラグイン exception_notification](http://d.hatena.ne.jp/the_yokochi/ 20110517/1305641153)
 [Rails3 で exception_notification プラグインを使う](http://blog.twiwt.org/e/340979)

[exception_notification](https://github.com/rails/exception_notification) なしでは安心して眠れないくらいに頼りになるのですが、実は delayed_jobs の遅延処理タスクとして動作しているときは通知処理を行なってくれないという問題が。
これでは眠れなくなってしまうので、次のような記述を追加します。

```rb:config/initializer/delayed_jobs.rb
# exception_notifier にメソッドが存在することを確認。
[[ExceptionNotifier::Notifier, :background_exception_notification]].each do |object, method_name|
  raise NoMethodError, "undefined method `#{method_name}' for #{object.inspect}" unless object.respond_to?(method_name, true)
end

# workrが失敗を検出した時のハンドラ(Delayed::Worker#handle_failed_job）にメール送信処理を追加
Delayed::Worker.class_eval do 
  def handle_failed_job_with_notification(job, error)
    handle_failed_job_without_notification(job, error)
    begin
      ExceptionNotifier::Notifier.background_exception_notification(error)
    rescue Exception => e
	  # メール送信失敗時はログに記録
      Rails.logger.error "ExceptionNotifier failed: #{e.class.name}: #{e.message}"
      e.backtrace.each do |f|
        Rails.logger.error "  #{f}"
      end
      Rails.logger.flush
    end
  end 
  alias_method_chain :handle_failed_job, :notification 
end

```

これで非同期処理中のエラーも検出できるようになりました。
ただし、失敗時にはわりと短い時間で再試行するの、再現性のあるエラーの場合は同じようなメールが複数届いてしまってちょっと嫌な感じですが、あんまり気にしません。

> 以下の Q&A を参考にしました：
[How to make ExceptionNotifier work with delayed_job in Rails 3?](
http://stackoverflow.com/questions/5972903/how-to-make-exceptionnotifier-work-with-delayed-job-in-rails-3)

## 追記

delayed_jobs 4.0 から ```ExceptionNotifier::Notifier.background_exception_notification(error)``` に代わって、```ExceptionNotifier.notify_exception(error)``` を使うようになったので下記のようになります。

```rb:config/initializer/delayed_jobs.rb
# exception_notifier にメソッドが存在することを確認。
[[ExceptionNotifier, :notify_exception]].each do |object, method_name|
  raise NoMethodError, "undefined method `#{method_name}' for #{object.inspect}" unless object.respond_to?(method_name, true)
end

# workrが失敗を検出した時のハンドラ(Delayed::Worker#handle_failed_job）にメール送信処理を追加
Delayed::Worker.class_eval do
  def handle_failed_job_with_notification(job, error)
    handle_failed_job_without_notification(job, error)
    begin
      ExceptionNotifier.notify_exception(error)
    rescue Exception => e
      # メール送信失敗時はログに記録
      Rails.logger.error "ExceptionNotifier failed: #{e.class.name}: #{e.message}"
      e.backtrace.each do |f|
        Rails.logger.error "  #{f}"
      end
      Rails.logger.flush
    end
  end

  alias_method_chain :handle_failed_job, :notification
end
```
Perl6 Advent Calendar １日目


#はじめに

今年もAdvent Calendarの季節がやって来ました。例のごとくマイナー言語ながら、ぼちぼちやっていこうと思います。今年も25日、完走できると良いなぁ。

# 現状確認
とりあえず一回目の今日は、現状の確認からにしようと思います…が、最近はNieczaやPugsを追っていなかったので、メインストリームの処理系であるRakudoに関してのみのお話です。

## 仕様と実装
今年に入ってメタな部分の実装がかなり進んだように感じます。処理系の深い部分から覗く意味不明なバグも大幅に減りました。GrammarとActionで簡単なパーザを書く程度なら、妙なバグに悩まされることも殆ど無いといっていいでしょう。大分まともな言語になってきた感があって素晴らしい。

公式の言語仕様を定義するテストスイート(Roast)をどれだけパスしたかが以下のページで見られます。スレッド周りはガタガタも良い所ですが、それ以外は結構な部分がimplementedになっています。「いつかのクリスマス」はそう遠くないのかもしれません(とは言え仕様の方もかなりの頻度で更新されていますし、実際これからどうなるかはよく分からないですね…)。

http://perl6.org/compilers/features

## 実行速度
ParrotのバージョンアップやRakudoの最適化に伴って、実行速度は徐々に改善の兆しを見せています。初代Rakudo Starに比べると、10倍以上高速になっているのでは無いでしょうか（ベンチマークとってる時間がありませんでした…ごめんなさい）。

## 使えるようになったオイシイ機能

#### Macros
今年実装された機能では、やはりマクロが大きいでしょう。実装段階としてD1-D6のステージが用意されており、現在ではD2までの機能が実装されています。具体的には「単純な文字列置換」と「関数形式のマクロ」は既に使えます。詳しくは以下のページを参照してください。

http://news.perlfoundation.org/2011/09/hague-grant-application-implem.html

### MetaClass
Perl6には「クラス」や「ロール」といった言語のベースとなる枠組みの挙動を変更することを可能にする仕組みがあります。言わば「クラスを定義するクラス」ということで「メタクラス」と呼ばれており、これを差し替えることでメソッド呼び出しをフックして本来とは別のメソッドを呼び出したりできます。

これを利用して、Grammarがどのように文字列にマッチしたのかを分かりやすく表示するデバッガが、Jonathan Wothingtonさんによって開発・公開されています。これはすごく便利。

http://6guts.wordpress.com/2012/08/28/a-rakudo-debugger/

これは部分正規表現がマッチした時に呼ばれる処理をフックすることによって実現しており、今年のYAPC::Asia Tokyoで彼が仕組みを解説しながら実際にデモを行った様子がYouTubeで見られます。

http://www.youtube.com/watch?v=aDba4yaNymI&feature=share&list=UUTqv2OjSox70MM7iYftlsIw

他にも挙げるとキリがないのですが、まだ24回も残っているので追々紹介していくことにしましょう。参加者も絶賛募集中ですので、興味を持った方はガンガン書いていってください！

明日の担当は@uasiさんです。

---

本家Perl6 Advent Calendarも始まったようですので、こちらもあわせてどうぞ。
https://perl6advent.wordpress.com/2012/12/01/state-of-perl-6-in-2012/
Pythonの例外処理を少し便利に


### 例えば、自作のライブラリで特定の例外を違う例外クラスとして送出したい

ライブラリ用に例外を定義していて、組み込み例外をラップするのが一々面倒くさいシーンで使える？

```python
import functools

class MyException(Exception):
    def __init__(self, original, *args, **kwargs):
        super(MyException, self).__init__(str(original), *args, **kwargs)
        self.original = original

def raise_as(except_classes, target_class):
    def wrapper(f):
        @functools.wraps(f)
        def wrapper_inner(*args, **kwargs):
            try:
                return f(*args, **kwargs)
            except except_classes as e:
                raise target_class(e)
        return wrapper_inner
    return wrapper

@raise_as(IndexError, MyException)
def func(a):
    l = [1,2]
    return l[a]
```

一つ目はMyException、２つ目はTypeErrorになる

```python
func(3)  # MyException
func('hoge')  # TypeError
```

### 例外を補足して返り値を変える

細かい制御は無理。

```python
def try_return(except_classes, value=None):
    def wrapper(f):
        def wrapper_inner(*args, **kwargs):
            try:
                return f(*args, **kwargs)
            except except_classes:
                return value
        return wrapper_inner
    return wrapper

@try_return(ZeroDivisionError, None)
def func(x):
    return 1 / x

print func(1) # 1
print func(0) # None
```
TortoiseHgのファイルビューを少し改造してみる

* [2012/12/07追記] masterのdefaultブランチにこの修正をマージしてもらいました。

##やりたいこと
TortoiseHgで、ファイルのDiffやBlameを表示すると、変更箇所を表示するインジケータが一緒に表示されますよね？
![thg-fileview](http://gyazo.com/614f06f44fa90c302292b02d56086c36.png)

ウインドウをスクロールするとそれにあわせて灰色の箱が動いたりするんですが、ここ、クリックしたくなりませんか？
クリックしたらその位置にジャンプしてくれるととてもうれしいんですが。僕は。

##やったこと
という訳で少し手を入れてみました。
https://bitbucket.org/iwata0303/thg/commits/bbb613be1df57a43c4e3f6c20aa10ad45fe26c93

tortoisehg/hgqt/blockmatcher.pyというファイルがあって、そこにあるBlockListというクラスにこのメソッドを追加してます。

```python:blockmatcher.py
    def scrollToPos(self, y):
        # Scroll to the position which specified by Y coodinate.
        if not isinstance(self._sbar, QScrollBar):
            return
        ratio = float(y) / self.height()
        minimum, maximum, step = self._minimum, self._maximum, self._pagestep
        value = minimum + (maximum + step - minimum) * ratio - (step * 0.5)
        value = min(maximum, max(minimum, value))  # round to valid range.
        self.setValue(value)

    def mousePressEvent(self, event):
        super(BlockList, self).mousePressEvent(event)
        self.scrollToPos(event.y())

    def mouseMoveEvent(self, event):
        super(BlockList, self).mouseMoveEvent(event)
        self.scrollToPos(event.y())
```
これで、インジケータ上をクリックすればその位置までジャンプしますし、そのまま上下にドラッグすればスクロールも連動するようになりました。

##プラグインにしてみる
さて、とはいえ、これだけのためにTortoiseHgのソースを入手してビルドして、というのも面倒な話ですね。

**ちょっと良い子にはお勧めできない系になりますが** 、エクステンションを使ってモンキーパッチあててみます。

```python:thg_blocklist_patch.py
# -*- coding:utf-8 -*-
def extsetup():
    import sys
    import os
    # thg.exeやthgw.exeから実行されたときだけ処理をするようにする
    if not os.path.basename(sys.argv[0]).startswith('thg'):
        return

    from PyQt4.QtGui import QScrollBar

    from tortoisehg.hgqt.blockmatcher import BlockList
    from types import MethodType

    mousePressEvent_org = BlockList.mousePressEvent
    mouseMoveEvent_org = BlockList.mouseMoveEvent

    def scrollToPos(bl, y):
        # Scroll to the position which specified by Y coodinate.
        if not isinstance(bl._sbar, QScrollBar):
            return
        ratio = float(y) / bl.height()
        minimum, maximum, step = bl._minimum, bl._maximum, bl._pagestep
        value = minimum + (maximum + step - minimum) * ratio - (step * 0.5)
        value = min(maximum, max(minimum, value))  # round to valid range.
        bl.setValue(value)

    def mousePressEvent(self, event):
        mousePressEvent_org(self, event)
        scrollToPos(self, event.y())

    def mouseMoveEvent(self, event):
        mouseMoveEvent_org(self, event)
        scrollToPos(self, event.y())

    BlockList.mousePressEvent = MethodType(mousePressEvent, None, BlockList)
    BlockList.mouseMoveEvent = MethodType(mouseMoveEvent, None, BlockList)
```

ふつうにhgコマンドを叩いた時に悪さされても困るので、thg*.exeとかから実行されたときだけ処理をするようにしています。
確認してませんがLinuxとかだと `sys.arg[0]` はpythonのパスが入ってくると思うので、その場合は `sys.arg[1]` でチェックする感じで。

このファイルを適当にエクステンションとして登録すれば、本体のソースに手を入れなくてもいけるようになります。
**あくまでモンキーパッチなので、バージョンアップなどの際にはご注意を。**
Use Rem, forget about em formulas.

# What is REM?

> ## font size of the root element
> Equal to the computed value of ‘font-size’ on the root element.
> When specified on the ‘font-size’ property of the root element, the ‘rem’ units refer to the property's initial value.

```css
html {
  font-size: 62.5%;
}
```
Now you've a base size of 62.5% to go.

If `62.5%` is `10px`, then:

you can use `1.6rem` as `16px`.

and don't bother with which context should I take into account, or whatsoever em & px's problems. Now you only refer to the size of `html` root element.
列の値を読み込んでリストに整形


```javascript:gas.js
function getColumnValues(sheetname, row, col){
  var ss = SpreadsheetApp.openById(DATA_SPREADSHEET_ID).getSheetByName(sheetname);
  var rangeValues = ss.getRange(row, col, ss.getLastRow()).getValues();
  var valueList = [];
  for (var i = 0; i < rangeValues.length; i++){if (rangeValues[i][0] != '') { valueList.push(rangeValues[i][0]); } }
 
  return valueList;
}
```
Flaskからーのredis proxy


```
#!/usr/bin/env python
import os
import redis
from flask import Flask, request
import json
app = Flask(__name__)
app.debug = True

@app.route('/')
def redis_input():
  html = '''
  <!doctype html>
  <form action="/api/post" method="post">
  Key:<input type=text name="key"><br>
  Val:<input type=text name="val"><br>
  <input type=submit value="save">
  </form>
  '''
  return html

# GET method ================================================
@app.route('/api/set/<key>/<val>')
def set_id(key, val):
  gram = 'redis_' + key
  twit_id = str(val)
  r = redis.Redis(host='localhost', port=6379, db=0)
  r.rpush(gram, twit_id)
  cur_list = r.lrange(gram, 0, -1)
  return json.dumps(cur_list, indent=2)

@app.route('/api/get/<key>')
def get_id(key):
  gram = 'redis_' + key
  r = redis.Redis(host='localhost', port=6379, db=0)
  cur_list = r.lrange(gram, 0, -1)
  return json.dumps(cur_list, indent=2) 

# POST method ================================================
@app.route('/api/post', methods=['POST'])
def set_post_id():
  gram = 'redis_' + request.form['key']
  twit_id = str(request.form['val'])
  r = redis.Redis(host='localhost', port=6379, db=0)
  r.rpush(gram, twit_id)
  cur_list = r.lrange(gram, 0, -1)
  return json.dumps(cur_list, indent=2)

if __name__ == '__main__':
  app.run(host='0.0.0.0', port=8080)
```
真っ白画面の直し方


> この投稿は [xoopscube.jp][] に2005年4月1日に投稿したものです。

公式フォーラムを読んでいますと、たびたび真っ白画面のヘルプが投稿されています。 
初心者にとって修理することは難を要することがあります。 

今回はHi-Mackee(HM)というツールを利用した修理の方法を紹介します。 
HMは1976年にZEBRA社より発売されたもので、150円と安価に入手出来ます。 

１）HMの購入が完了したら、真っ白な画面のページを開きます。 

２）基本となる色を１つ選びます。 

３）キャップを外し、レイアウトの骨格となる罫線を描画します。 

４）罫線の構築が完了したら、次はコンテンツを構成します。 
　　その際、強調部分は「太」をそのほかの部分は「細」を使用すると上手く仕上がります。 

５）最後にデザイン上の微調整を行えば完了です。 

通常の修理には１０色以上有れば十分ですので１２色セットがお買い得です。
お買い求めは最寄りの文房具店に。

以前にこのtipsを紹介した時に「塗りつぶしにはPOSCAがお薦め」とか「油性だと書き換えが大変なので、ホワイトボード用が良いですよ。」などの有用なご意見も頂きました。

私としては、キャッシュを十分に効かせたい場合はHi-Mackeeを使用し、動的コンテンツの場合はホワイトボード用が最適だと考えております。

![img1]

▲作業中の写真

![img2]

▲スクリーンショット

なお、当方はこの修理方法に一切の責任を負いかねます。 


[img1]: https://qiita-image-store.s3.amazonaws.com/0/889/d132fa54-58d3-02b3-895f-e662c31c5d46.jpeg
[img2]: https://qiita-image-store.s3.amazonaws.com/0/889/1c7e424b-f3b7-6b67-ecf0-76b82d61a36c.jpeg
[xoopscube.jp]: http://xoopscube.jp/modules/newbb/viewtopic.php?viewmode=flat&order=ASC&topic_id=8219&forum=8
UILabelのheightやwidthを文字列の長さに合わせて調整する


こんな感じで書くといけます！

Labelに表示したい文字列をmyObjectに、boldSystemFontOfSizeにフォントサイズを、maxWidthに最大のwidthを入れてあげるとCGSizeが取得できます。

```
CGSize textSize = [[myObject getALongText] 
                    sizeWithFont:[UIFont boldSystemFontOfSize:15] 
                    constrainedToSize:CGSizeMake(maxWidth, 2000)
                    lineBreakMode:UILineBreakModeWordWrap];
```

詳しくはこちら。
http://stackoverflow.com/questions/5430890/uilabel-auto-resize-on-basis-of-text-to-be-shown
文字列に同じ処理を繰り返し実行したい時に便利なキーボードマクロ

数百件程度の改行区切りのデータをカンマ区切りにしたいとか，「文字列に対して簡単な処理を数十回/数百回実行したい，でもプログラムを書くほどでもない」というときはキーボードマクロが便利．
キーボードマクロとは一連のキーボード操作をコマンドに定義したもの．定義したコマンド(キーボードマクロ)は簡単に繰り返し実行ができる．

## 利用例
以下では改行区切りのデータをquoteしてカンマ区切りにする，という処理を例に説明する．

```txt:処理前
foo
bar
baz
...
```

```txt:処理後
'foo', 'bar', 'baz', ...
```

### 作業手順

1. 適当なバッファ(*scratch*とか)に処理したい文字列を貼る(今回は`foo\nbar\nbaz`...)
2. 繰り返し実行したいキーボード処理を考える．今回ならば以下の作業で1行目(foo)の処理が終わる．(スタート時にカーソルは1行目の`f`にあるとする)
 - `'`を入力
 - C-eで行末に移動(カーソルは`o`に移動する)
 - `',`を入力
 - C-dで改行を削除
3. 2の処理をキーボードマクロに定義する．定義方法は簡単で，`C-x(` -> 定義したいキーボード処理を操作 -> `C-x)`とするだけ．
4. 定義したマクロの実行は`C-xe`(execution)．連続実行は`C-xeeeee...`.
5. 大量に実行したい時は`C-u100C-xe`などとすればよい

他のキーバインドなど，詳細は [GNU Emacsマニュアル: M. キーボードマクロ](http://www.bookshelf.jp/texi/emacs-man/21-3/jp/emacs_16.html)
5分で始めるGoogle Apps Script

Google Apps Script Advent Calendar一日目です。
ゆるゆる書いて行きたいと思います。

今回は初日なのでGoogle Apps Scriptの紹介を書きつつ5分でやれるGoogle Apps Scriptのはろーわーるどを紹介したいと思います。

なおイメージは後でつけます...

# Google Apps Scriptとは

Google Apps ScriptはGoogleのインフラを利用したサーバサイドJavascriptで、
以下のような特徴を持っています。

## Google Apps Scriptの特徴

* 無料
* Googleアカウントだけあれば開始できる
* 開発環境のインストールがいらない
* Googleの他のアプリケーション(DriveやSheets、Gmail等など)との連携が非常に簡単


イメージはExcelマクロ(VBA)のサーバサイド版と考えるといいかもしれません。

# 始めてみようGoogle Apps Script
ということでGoogle Apps Scriptを始めてみましょう。

## 0分目 準備

三分クッキングでも材料の用意の時間はクッキング内に含まれないのでここでも準備の時間は含みません。
用意するものは以下です。

### 用意するもの
* Googleアカウント（GoogleAppsアカウントでも可能）
* ブラウザ（ChromeやFirefox等のモダンブラウザをお勧めします。）
* ネットワーク環境

多くの人は持っていると思います。。。 多分


### 1分目 開発環境の起動

Google Apps Scriptのプログラムを開発するための開発環境を起動します。
開発環境の起動方法は3つあるのですが今回は簡単に始められる方法を紹介します。

1. ブラウザでGoogle Driveを表示します。(Googleアカウントにログインして下さい)
 * [https://drive.google.com/](https://drive.google.com/)
 * https://drive.google.com/a/{your domain} ※Google Appsアカウントの場合

2. Google Driveの一覧画面 左上の「作成」ボタンより「スプレッドシート」選択します。
3. スプレッドシートが表示されたら、メニューより「ツール」→「スクリプト エディタ...」を選択します。
4. Google Apps Scriptの開発環境「スクリプト エディタ」が表示されます。

これで開発環境の起動は完了です。


### 2分目 コードを記述する

次はGoogle Apps Scriptのコードを記述します。
既にmyFunctionメソッドが記述されているはずなのでそれを以下のように変更します。

```javascript
function myFunction() {
  Browser.msgBox("Hello " + Session.getEffectiveUser().getEmail());
}
```
※myFunctionが存在しない場合は上記のコードをスクリプト エディタに貼り付けて下さい。


### 3分目 プログラムをGoogleサーバにデプロイ(配置)する

コードをブラウザ上で記述したら、プログラム(コード)をサーバへデプロイ（配置）します。

1.「ファイル」→「保存」を選択します。 （Ctrl + S）でも可能
2. プロジェクト(プログラム・アプリケーションの単位)の名前の入力欄が表示されるので任意の名前をつけ、「OK」ボタンを押下します。
3. これで、Googleサーバへのデプロイ（配置）は完了です。

簡単ですね☆


### 4分目 起動

Googleサーバにプログラムがデプロイされたのでこのプログラムを起動します。

1. メニューから「実行」→「myFunction」を選択します。
2. 起動されました。

...
...

え？何も起きない？？
せっかちですね。　まだ5分目がありますよ。

### 5分目 テスト

起動をしたらテストが必要ですね。
1分目に起動した、スプレッドシート画面を見てみましょう。

どうですか？
「Hello {自分のメールアドレス}」と書かれた、メッセージボックスが表示されてますね。

これでGoogle Apps Scriptの起動からコード実行まで完了です。
この記事を読みながらでも5分以内にできたのでは無いでしょうか？

# まとめ

今回はGoogle Apps Scriptのはじめ方について紹介しました。

Google Apps Scriptはネットに繋がったブラウザさえあれば簡単に始めることができます。
開発環境の起動に数分まったり、専用アプリケーションのインストールも不要です。

Google Apps Scriptの開発スタイルとしては

「1日1行」

このイメージですこしずつ楽しみながらやっていくのがあっていると思います。

また、今回はあまり触れませんでしたが、
様々なGoogleアプリケーションだけじゃなく、

* 多くのWebアプリケーションとの親和性の高さ
* クーロンによる定時起動による自動化
* 簡易にWebアプリケーションが作成できる

など、かなりの潜在能力を持っているプロダクトです。
まだまだ日本語のドキュメントや書籍が少ないなど、謎が多いですが、
こういったAdvent Calendar等を利用して、使ってくれる方が増えたら嬉しいっす。

特にGoogle Appsを利用している企業の方はめんどくさい作業をかなり自動化出来るはずです。
是非是非Google Apps Scriptを利用してみてください☆

# Link

* [Google Apps Script Reference](https://developers.google.com/apps-script/) 英語です。
python manage.py syncdbで"ValueError: unknown local: UTF-8"と怒られてしまう時の対処


`python manage.py syncdb`を実行してsuperuserを作成しようとすると`ValueError: unknown local: UTF-8`とエラーを出されることがあった。

これはpythonの中でチェックされる環境変数が適切に設定されていないと起きるらしい。なので

```zsh:
export LANG=ja_JP.UTF-8
export LC_COLLATE=ja_JP.UTF-8
export LC_CTYPE=ja_JP.UTF-8
export LC_MESSAGES=ja_JP.UTF-8
export LC_MONETARY=ja_JP.UTF-8
export LC_NUMERIC=ja_JP.UTF-8
export LC_TIME=ja_JP.UTF-8
export LC_ALL=
```

を.zshrcへ追加して

`python -c 'import locale; print(locale.getdefaultlocale());'`

を実行して`('ja_JP', 'UTF8')`と出力されれば対処完了。

## 参考
+ http://patrick.arminio.info/blog/2012/02/fix-valueerror-unknown-locale-utf8/
+ https://code.djangoproject.com/ticket/5846
RubyでHSV形式を扱う

HSV形式を扱うgemを探していたらsassのなかに単独で使えるのがありました。

下の例は、明度を3段階にして一つのバリエーションを作り、色相を一周してます。(RGB形式じゃ無理！) saturation(彩度)を下げると落ちついた感じになったりします。

Railsの携帯用ヘルパーなどで使うと横着できそうです。

```ruby:
require "sass"
require "sinatra"
get("/") do
  out = [%(<style type="text/css">body{background:black}</style>)]
  (n = 100).times{|i|
    base = Sass::Script::Color.new(:hue => 360.0 * i / n, :saturation => 100.0, :lightness => 50.0)
    back = base.with(:lightness => 15.0).inspect
    line = base.with(:lightness => 40.0).inspect
    text = base.with(:lightness => 45.0).inspect
    out << %(<div style="background:#{back};border:1px solid #{line};color:#{text};padding:8px;margin:8px;display:inline-block">Sample</div>)
  }
  out * "\n"
end
sleep(1)
`open http://localhost:4567/`
```

![](http://25.media.tumblr.com/tumblr_meb9ay3RIO1rs2hx9o1_1280.png)

2014-05-10 追記

Sassのメインの機能を使わないのであれば、色変換に特化した paleta gem https://github.com/jordanstephens/paleta も良い、、、とさっき書いたんですが、実際使ってみると rmagick を要求されたり、パレット機能などあまり使わない機能があったり、Math モジュールを汚されたりで、どうかなという感じです。

2014-05-11 追記

結局この rgb gem に落ち着きました。最小限のシンプルなコードで気に入りました。

plashchynski/rgb
https://github.com/plashchynski/rgb
SICPより反復と再帰

```

#include <stdio.h>

int Sum0(int start, int end)
{
    int sum = 0;
    for( ; start <= end ; ++start)
    {
        sum += start;
    }
    return sum;
}

int Sum1(int start, int end)
{
    if(start <= end)
    {
        return start + Sum1(start + 1, end);
    }
    else
    {
        return 0;
    }
}

int Sum2(int sum, int start, int end)
{
    if(start <= end)
    {
        return Sum2(sum + start, start + 1, end);
    }
    else
    {
        return sum;
    }
}


int main(int argc, const char * argv[])
{
    printf("%d\n", Sum0(1, 5));
    printf("%d\n", Sum1(1, 5));
    printf("%d\n", Sum2(0, 1, 5));
    
    
    /*
     Sum1(1, 5)
     = 1 + Sum1(2, 5)
     = 1 + 2 + Sum1(3, 5)
     = 1 + 2 + 3 + Sum1(4, 5)
     = 1 + 2 + 3 + 4 + Sum1(5, 5)
     = 1 + 2 + 3 + 4 + 5 + Sum1(6, 5)
     = 1 + 2 + 3 + 4 + 5 + 0
     = 15
     
     Sum2(0, 1, 5)
     = Sum2(0 + 1, 1 + 1, 5) = Sum2(1, 2, 5)
     = Sum2(1 + 2, 2 + 1, 5) = Sum2(3, 3, 5)
     = Sum2(3 + 3, 3 + 1, 5) = Sum2(6, 4, 5)
     = Sum2(6 + 4, 4 + 1, 5) = Sum2(10, 5, 5)
     = Sum2(10 + 5, 5 + 1, 5) = Sum2(15, 6, 5)
     = 15;
     */
    return 0;
}

```

SICPからのネタです。
1から5の合計を愚直に求める関数をテーマに反復と再帰の構造を考えてみます。
非常に面白いです。こんな考え方があったとは。
誰にでも分かるようにメモします。

まず、すごく手続き型的に考えて、Sum0があります。
for文をつかったまあ分かりやすいプログラムですね。これはいいでしょう。

次に再帰的な関数呼び出しです。
これは少々再帰関数に慣れていないと読みづらいと思います。
しかしこれは展開すると簡単にわかります。

Sum1(1, 5)
を呼び出すということは、次に
1 + Sum1(2, 5)
と展開することができます。そして次に
1 + 2 + Sum1(3, 5)
と、このようにどんどん展開していくことができます。
最後はSum1(6, 5)これは0になるようにifで仕込んであるので、
= 1 + 2 + 3 + 4 + 5 + 0
と展開されるので15になるわけですね。

さて、次が面白いです。
一つ引数が増えています。sumですね。
これは、関数を呼ぶたびに加算した上でスタックに積み続けます。
日本語にするとわけがわからないよ、となりますね。
なので、これも展開してみます。

Sum2(0, 1, 5)
これは次の関数を呼び出すときに２つのことを行います。
１、sumにstartを足す
２、startに1を足す
すると、
Sum2(1, 2, 5)
となります。
これはつまり、ここのsumは、関数Sum0のsum変数とほぼ同等の役割を果たしているわけです。計算をしながら次の関数を呼び出しているんですね。
「再帰関数ではあるが、反復的な構造をしている」
というちょっと不思議な気分です。　
同じ再帰関数でありながら、Sum1とSum2はまったく違う構造で問題を解決しているんですね。実に面白いと思いませんでしょうか。

さて、これは何の役に立つのでしょうか？
自分にはわからないのでもうすこしSICP読みましょうかね。
Selenium(Capybara)でChromeを使う

selenium-webdriverでテストする場合に、Chromeをブラウザとして使う。

まず、[chromedriver](http://chromedriver.storage.googleapis.com/index.html)をダウンロード（最新バージョンの自分のプラットフォームのもの）、インストール `$ sudo mv ~/Downloads/chromedriver /usr/bin/`

```ruby:spec/support/selenium_chromedriver.rb
Capybara.register_driver :selenium do |app|
  # http://code.google.com/p/chromedriver/downloads/list
  # sudo mv ~/Downloads/chromedriver /usr/bin/
  Capybara::Selenium::Driver.new(app, :browser => :chrome)
end
```

上記はRSpecの場合。
Inspectorが使いやすいのと慣れているのとでデバッグしやすい。
BundlerでGemfileを変更せずにローカルの:pathのgemを使う

Railsプロジェクトでgemを変更しながら開発する場合、

* Gemfileに:pathでローカルのgemを指定 `gem 'mygem', :path => '../mygem'`
* gemを変更したらgem側をプッシュ
* 本体のプロジェクトのGemfileのgemの指定をリモート向けに戻して`bundle update mygem`
* やっと本体のプロジェクトをコミット、プッシュ
* またGemfileに:pathでローカルのgemを指定

することになりますが、頻度が多いと面倒になります。

## bundle local

以下のコマンドにより、Gemfileを変更する必要がなくなります。

```sh:
$ bundle config local.mygem ../mygem
($ bundle config local.mygem /Users/user/path/to/mygem)
```

設定はプロジェクトごとではなく、グローバルになるようです。

```sh:
$ cat ~/.bundle/config
---
BUNDLE_LOCAL__MYGEM: ../mygem
```

bundle実行時の出力は少し違うので、設定の違いを判断できます。

```sh:
$ bundle
Using mygem (0.1.9) from git@github.com:hoge/mygem.git (at ../mygem)
```

gem側のブランチを複数扱ったりする場合や、古いリビジョンを参照したいなどの場合には、bundleコマンドの挙動やGemfile.lockの変化などが、自分の意図に反して混乱する可能性もあります。
その場合はおとなしく元に戻して、従来通り:pathを使う事をお勧めします。
`~/.bundle/config`を消せば大丈夫なはずです。

[Bundler 1.2](http://gembundler.com/v1.2/whats_new.html)から使えるようです。

その他、プロジェクトごとに指定できるかは未調査。

## bundle local解除用alias

切り替えがしやすいように以下のようなaliasをおすすめ

```bash:
alias bl_on='mv $HOME/.bundle_OFF $HOME/.bundle'
alias bl_off='mv $HOME/.bundle $HOME/.bundle_OFF'
```
次に述べる副作用の関係上、特にリリースなどに携わる人は良く理解して切り替えがすぐにできるようにしていることが望まれる

## 副作用

### ローカルgemのプッシュし忘れ

考えられる副作用としては、gemをプッシュし忘れて、でもそれを参照する本体のプロジェクトは最新の状態でプッシュしたりしたときに、他のメンバーにとっては最新のgemが無く、プル+bundleするのに失敗するということが起こり得ると思います。

### ローカルgemからのdependencyの追加

これはとても大切

特にリリース回りを担当する人は知っておかないと、リリース直前でなぜか起動できないとかいろいろ起こり得る

ローカルgem内の `mygem.gemspec` に `s.add_dependency 'some_shared_gem'` を追加したとする。  
ローカルgemを含むプロジェクト側をただ`bundle install`しても、このdependencyは追加されない。何が問題となるかと言うと、ほとんどの場合追加されたdependencyはコード内で`require 'some_shared_gem'`を必要とする。プロジェクト側で`rails`でも`rake`でも起動しようとすると、`some_shared_gem`のLoad Errorになる。

対応方法は2つ

* bundle localを解除して、gem側もプッシュ済みの状態で作業をすすめる
* プロジェクト側で`bundle update mygem`する

（`bundle update`した後も、意図しない他のdependencyのgemがアップグレードされないように注意もしないといけない。最近だと`jquery-rails`は2.1.4と2.2系でjQuery自体のアップグレードになりプロジェクトが壊れる可能性がある）

## その他

余談で、Rails界隈のすごい人たちが長い間議論してきて、いろいろなアプローチ、提案があったことをIssueから見て取れて面白いFeatureだと感じた。

[Issue1](https://github.com/carlhuda/bundler/issues/231)、[Issue2](https://github.com/carlhuda/bundler/issues/396)、[Issue3](https://github.com/carlhuda/bundler/pull/1641)　他
taps で簡単に MySQL から PostgreSQL へデータを移行する


諸事情で MySQL から PostgreSQL にデータを移行しなければならなくなったので [taps](https://github.com/ricardochimal/taps) を使ってみた。

#taps gem

[taps](https://github.com/ricardochimal/taps) は、データのインポート/エクスポートを用意に実現するシンプルなgem。

##インストール

```Bash
$ gem instal taps 

$ gem instal sqlite3 # 標準でsqlite3を使おうとするので必要ぽい
$ gem instal mysql # 移行元：MySQL
$ gem instal pg # 移行先：PostgreSQL 
```

## サーバ

taps は sinatra アプリケーションとして動作し、http経由でデータをやり取りする。
また、簡易的なセキュリティ対策として、httpのためのユーザ名とパスワードを設定する必要がある。

```Bash
$ taps server mysql://localdbuser:localdbpass@localhost/dbname httpuser httppassword
````

任意のDBを指定する際は `[DB_TYPE]://[DB_USERNAME]:[DB_PASSWD]@[DB_HOST]/[DB_NAME]` みたいな感じで。

## クライアント

taps サーバは標準で5000番ポートで動作しているのでそこに接続する。（下記の例ではホスト example.com で動作しているものとする）


```Bash
$ taps pull postgres://dbuser:dbpassword@localhost/dbname http://httpuser:httppassword@example.com:5000
```

* `taps pull` 
サーバ側DBからデータを取得する。
* `postgres://dbuser:dbpassword@localhost/dbname`
localhost で動作している postgresql をディスティネーションにする。
アクセス権限さえあれば localhostに限らず、どこのサーバでの利用できる。
* `http://httpuser:httppassword@example.com:5000` 前述のtaps サーバに接続する。`httpuser` と `httppassword` は起動時に指定したもの。

クライアントで `tap push ` にすれば、サーバ側で指定したDBにデータをインポートすることも出来る。

# 実行例

実行するとこんな感じでぐりぐりデータを移行してくれる。スキーマも拾ってくれるので便利。

```Bash
$ taps pull postgres://dbuser:dbpassword@localhost/dbname http://httpuser:httppassword@example.com:5000
Receiving schema
Schema:          0% |                                                                                                                                           | ETA:  --:--:--
Schema:         33% |=============================================                                                                                              | ETA:  00:00:00
Schema:         66% |===========================================================================================                                                | ETA:  00:00:00
Schema:        100% |===========================================================================================================================================| Time: 00:00:01
Receiving data
3 tables, 600 records
page:          100% |===========================================================================================================================================| ETA:  00:00:00

```



see also: 

* [taps gem](https://github.com/ricardochimal/taps)
* [#342 Migrating to PostgreSQL](http://railscasts.com/episodes/342-migrating-to-postgresql?language=ja&view=asciicast)
Yii NetBeans Plugin

参加したものの実は、ドキュメントを見ながら少し動かした程度なので、Yiiについてはあまりよくわかっていません。NetBeansを使ってらっしゃらない方にはつまらない話になってしまいますが、時々ドキュメントをみたりしてNetBeansのプラグインを作成中なのでYiiのNetBeansのプラグインの話を書きます。

githubのリポジトリのmasterにはほとんど何も入れていないのですが、star数がいつの間にか増えていることから、海外のYiiユーザ（cakeでいうところのbaker的なものはあるのでしょうかね？？？）はIDEをつかている人が比較的多いのかもという印象を受けました。

他のIDEの対応は以下のようになっています。（他にもあるかもしれません

## 他のIDEでの対応

### CodeLobster

[CodeLobster - Yii plug-in](http://www.codelobster.com/yii.html)

### Eclipse
[Yiiclipse homepage - How to setup yii support for eclipse PDT](http://yiiclipse.maziarz.org/)

NetBeansでの対応は？

## 旧プラグイン NetBeans

NetBeans 7.1では、別の人がプラグインをつくって公開していましたが、7.2では直接インストールできなくなっているので更新をやめてしまったようです。実際hg.netbeans.orgのリポジトリを見てみると、1年以上そのままの状態です。

旧と書いたのは、新しくプラグインを作り直すからです。まず、そのコミュニティの紹介をします。

## netbeans php council

NetBeansのPHPブログで[NetBeans PHP Community Council (NetBeans for PHP)](https://blogs.oracle.com/netbeansphp/entry/netbeans_php_community_council)が紹介されています。なんとなく面白そうだなと思って自分もこれに参加してみました。

これは公式でサポートされていない部分を、コミュニティでプラグインとかドキュメントを作成して充実させようという活動です。

ここで最初に対応することになったのがYiiのプラグインです。

Yiiの中の人(@sam_darkさん)も参加してくれています。

## 新プラグイン

APIの変更の都合により7.3からの対応になります。また、旧プラグインをクローンするのではなく、スクラッチからのスタートです。機能としては次のようなものが考えられます。

1. New Project Wizard
2. Go to View/Action Action
3. Code Completion

1はリーダーの人が最初に実装したい機能と言っていたのですが未実装です。
2は実装済。
3はControllerのrenderメソッドで設定した変数をviewで補完できるようにはしました。YiiはドキュメントブロックにIDE用のアノテーションが書いてあるので、インクルードパスにコアのディレクトリを追加しておけば、プラグイン側で何もしなくてもかなり補完してくれます。

現在7.3beta2でしか動きませんが、nbmファイルも下記にアップしています。

### リポジトリ
https://github.com/nbphpcouncil/nb-yii-plugin

残念なことに、現在連絡がストップしているので、どうしたらいいのかわからない状態です。もうしばらくして何もなければ、連絡をとってみます。

もし興味を持ってもらった方がいれば使っていただけたら幸いです;)
emscripten memo

https://github.com/ukyo/zpipe

ビルド

```
cd path/to/repo
cd zlib
emconfigure ./configure
make
cd ..
emcc -O2 --closure 0 src/zpipe.c zlib/libz.a -o dist/zpipe.raw.js
cat src/header.js dist/zpipe.raw.js src/footer.js > zpipe.js
java -jar path/to/compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --js dist/zpipe.js --js_output_file dist/zpipe.min.js
```

ソース

```c
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include "zlib.h"

// ...

int def(FILE *source, FILE *dest, int level, int zlib_header)
{
// ...
}

int inf(FILE *source, FILE *dest, int zlib_header)
{
// ...
}

int def_stdio(int level, int zlib_header) {
    SET_BINARY_MODE(stdin);
    SET_BINARY_MODE(stdout);
    return def(stdin, stdout, level, zlib_header);
}

int inf_stdio(int zlib_header) {
    SET_BINARY_MODE(stdin);
    SET_BINARY_MODE(stdout);
    return inf(stdin, stdout, zlib_header);
}
```

```js
//------------------ header.js -------------------
//グローバル汚染しまくるので囲う。
(function() {

//名前が被ったらいやなので一応プレフィックスつけとく。
var zpipeInput;
var zpipeOutput = new Uint8Array(1);
var zpipeTemp;
var zpipeInputIndex;
var zpipeOutputIndex;

var Module = {
  //標準入力を上書き
  'stdin': function() {
    return ++zpipeInputIndex < zpipeInput.length ?
      zpipeInput[zpipeInputIndex] :
      null;
  },

  //標準出力を上書き
  'stdout': function(x) {
    if (x !== null) {
      if (++zpipeOutputIndex === zpipeOutput.length) {
        zpipeTemp = new Uint8Array(zpipeOutput.length * 2);
        zpipeTemp.set(zpipeOutput);
        zpipeOutput = zpipeTemp;
      }
      zpipeOutput[zpipeOutputIndex] = x;
    }
  }
};
//------------------ /header.js -------------------

// zpipe.raw.js

//------------------ footer.js -------------------
function zpipeInit(input) {
  zpipeInputIndex = -1;
  zpipeOutputIndex = -1;
  zpipeInput = input;
  //標準入力を使いまわす場合、eofフラグは一度trueになると元に戻らないので手動で入力。
  FS.streams[1].eof = false;
}

function zpipeGetOutput() {
  return new Uint8Array(zpipeOutput.subarray(0, ++zpipeOutputIndex));
}

function zpipeDeflate(input, level, zlibHeader) {
  zpipeInit(input);

  level = typeof level === 'number' ? level : 6;
  level = Math.min(Math.max(level, 0), 9);
  zlibHeader = zlibHeader ? 1 : -1;

  _def_stdio(level, zlibHeader);
  return zpipeGetOutput();
}

function zpipeInflate(input, zlibHeader) {
  zpipeInit(input);
  zlibHeader = zlibHeader ? 1 : -1;
  _inf_stdio(zlibHeader);
  return zpipeGetOutput();
}

function zpipeGC() {
  zpipeInput = new Uint8Array(1);
}

// export

var global = (function() {return this})();

global['zpipe'] = global['zpipe'] || {};
global['zpipe']['deflate'] = zpipeDeflate;
global['zpipe']['inflate'] = zpipeInflate;
global['zpipe']['gc'] = zpipeGC;

})();
//------------------ /footer.js -------------------
```

stdin,stdoutが重い？
Mac mini(late 2012)に Windows7(32bit)をインストールしたメモ

Windows8(32bit) でもいけます。

1. Mountain Lion の Bootcampアシスタントで Windows7_32bit のディスク入れて続行しようとすると「対応してません」とエラーが出る
2. とりあえず「サポートソフトウェア」はUSBメモリに取得しておく
3. Bootcampアシスタントはあきらめ「ディスクユーティリティ」でパーティションを作る
4. 再起動→起動時に option(ALT)キー押しっぱなし→windows のディスクを選択
5. Windows7_32bit をインストール
6. インストール後、デバイスマネージャ見ると黄色がいっぱい。ネットもつながらない
7. サポートソフトウェアは64bit用だが、中には兼用のものもあるので、入れられるものは入れておく
8. Broadcom からイーサネットコントローラのドライバをダウンロードしてインストール
9. ネットがつながった、これで勝つる。

※他に古い Mac mini があるなら、そこから Bootcamp でサポートソフトウェアをダウンロードしておくと、32bit のドライバが使える
※けどどーしても Bluetooth ドライバが見つからない。。。
date("～～", 0)の罠


```php

$test = date("Y-n-j H:i",0);
var_dump($test);

```

```実行結果
string(14) "1970-1-1 09:00"
```

第二引数の $timestamp は、1970年1月1日0時0分0秒からの経過秒数（Unix時間）だが、dateで変換してみると9時になった。
タイムゾーンが日本だとこうなるんだろう。
ひっかかりかけた。
テーブルのヘッダを固定してスクロールする jQuery プラグイン

http://www.otchy.net/20100308/jquery-tablefix-js-had-released/

超便利

いいところ
・テーブルをほとんどいじらなくていい（tableタグにid属性を付加する程度）
・縦・横のスクロールが可能
・固定化する（スクロールしない）列数・行数を指定できる
・高さや幅の指定の範囲内でスクロールバーが必要ない場合は、普通に表示してくれる
・MITライセンス
・jQuery1.3系、1.4系で動作するらしい

悪いところ
・見当たらない
・しいて言えば、動的に行や列を追加するとおかしなことになるそうだ
数列をcell（各要素はstr）に分解する

超ニッチですが，手っ取り早くlegendを振りたいときなどに便利です．

```matlab:num2strcell.m
function [ out ] = num2strcell( numseq )

out=cellfun(@mat2str, mat2cell(numseq,1,ones(1,length(numseq))),'UniformOutput', false);

end
```

```
>> num2strcell(1:5)

ans = 

    '1'    '2'    '3'    '4'    '5'
```

legend(num2strcell(1:number_of_plots))みたいな感じで使えます．
Sinatra::Base はルーティングや設定も継承する

`Sinatra::Base` を継承したクラスは、

* 親クラスのルーティングをさらに継承したクラスでも利用できます
* 親クラスの設定をさらに子クラスでも参照できます

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

class Parent < Sinatra::Base
  get '/' do
    "original root"
  end

  get '/foo' do
    "original foo"
  end

  set :some_setting, "some text"
end

class Child < Parent
  get '/foo' do
    "override foo"
  end

  get '/buz' do
    "#{settings.some_setting}"
  end
end

Child.run!
```

### ====

![GET /](http://gyazo.udzura.jp/9f6bc204a4fb7ccc987f65f1c58b980a.png)

### ====

![GET /foo](http://gyazo.udzura.jp/a040e12af93b76fd6555e1f3acf608ea.png)

### ====

![GET /buz](http://gyazo.udzura.jp/41360b7d24647eec85e8f39d9db669ec.png)

## `route!` が親クラスを遡って探して行くため && `settings` は要するに `self` なので、普通に親クラスに定義されやメソッドを見に行くため、です

* https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L859
* https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L803
created_atなどに日本語曜日入り日付フォーマットを1行で書く

Qiitaの記事に、これ(http://qiita.com/items/20853d5fce6677d0f346)
で日付を日本語にできるとあるが、これだと現在時刻ばかりなので、
忘れないために便乗して補足しておく。

Time.now.strftime("%m/%d(#{%w(日 月 火 水 木 金 土)[Time.now.wday]})")



例えば、Postモデルのcreated_atを日本語化したいときは、
<% @posts.each do |post| %>
    post.created_at.strftime("%Y/%m/%d(#{%w(日 月 火 水 木 金 土)[post.created_at.wday]})") 
<% end %>

この１行でおｋ。
Go言語でzipファイル解凍

archive/zipパッケージが用意されているので簡単に実装できるかと思いきや、サンプルも見つからずに苦労したので投稿しました。

``` main.go
package main

import (
	"archive/zip"
	"io"
	"io/ioutil"
	"log"
	"os"
	"path/filepath"
)

func Unzip(src, dest string) error {
	r, err := zip.OpenReader(src)
	if err != nil {
		return err
	}
	defer r.Close()

	for _, f := range r.File {
		rc, err := f.Open()
		if err != nil {
			return err
		}
		defer rc.Close()

		if f.FileInfo().IsDir() {
			path := filepath.Join(dest, f.Name)
			os.MkdirAll(path, f.Mode())
		} else {
			buf := make([]byte, f.UncompressedSize)
			_, err = io.ReadFull(rc, buf)
			if err != nil {
				return err
			}

			path := filepath.Join(dest, f.Name)
			if err = ioutil.WriteFile(path, buf, f.Mode()); err != nil {
				return err
			}
		}
	}

	return nil
}

func main() {
	err := Unzip("./sample.zip", "./out")
	if err != nil {
		log.Fatal(err)
	}
}
```
クラスの書き方


CoffeeScriptが生成したJavaScriptコードを参考にした。

```javascript
var Hoge;
Hoge = (function () {
  var items;

  function Hoge(items) {
    this.items = items;
  }

  Hoge.classMethod = function () {
    console.log("classMethod");
  };

  Hoge.prototype.instanceMethod = function () {
    console.log("instanceMethod");
  };

  return Hoge;

})();
```

```javascript
Hoge.classMethod();

var obj = new Hoge({obj: 'object'});
obj.instanceMethod();
```
cocos2d for iPhoneを使ったアプリがバックグラウンドに移動した時にクラッシュしないようにする


iOS 6, cocos2d for iPhone 2.0で確認。

AppDelegate.m に以下のメソッドを追記するとクラッシュしないようになる。

```
- (void)applicationDidEnterBackground:(UIApplication *)application
{
    [[CCDirector sharedDirector] stopAnimation];
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    [[CCDirector sharedDirector] startAnimation];
}

- (void)applicationWillResignActive:(UIApplication *)application
{
    [[CCDirector sharedDirector] pause];
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [[CCDirector sharedDirector] resume];
}
```
Smalltalk 風 while

[6 日](/items/4efb81f8058ccabf1a7a)に引き続き、筆者の趣味に偏った水増し記事です。

# 末端呼び出しの最適化

Scheme という純度の高い Lisp の方言では、ループはプリミティブではありません。条件分岐と再帰でループを定義します。無限ループは無限再帰になるので、普通ならスタックがあふれてしまいますが、[末端呼び出しの最適化](http://en.wikipedia.org/w/index.php?title=Tail-call_optimization&redirect=no)が行われれば、そういう事態は避けられます。

Smalltalk ではどうなっているかというと、以下の謎コードが書かれています。詳細は述べませんが、筆者の頭ではどう考えてもループ(再帰)が止まりません。

```smalltalk
BlockClosure>>whileTrue: aBlock
	"Ordinarily compiled in-line, and therefore not overridable.
	This is in case the message is sent to other than a literal block.
	Evaluate the argument, aBlock, as long as the value of the receiver is true."

	^ [self value] whileTrue: [aBlock value]
```

末端呼び出しは、実は Perl 5 でも最適化できます。要所で goto を使うことで、再帰を使った無限ループが実現できます。

ところが Perl 5 の goto にあたるものが Perl 6 では何になるのか、わかっていません。そこで今回は、[6 日](/items/4efb81f8058ccabf1a7a)に定義したプリミティブを使って、Perl 6 で擬似的なループの制御構造を定義します。この制御構造は無限に繰り返すことはできません。無限に繰り返すことのできる制御構造は Perl 5 で書いて、付録にします。

# 繰り返しの原理 (面倒なのでテストごと)

```perl6:a.tail-call.t6
#!/usr/bin/env perl6

# 念のため Unix 版の rakudo-star-2012.11 を使ってください。

use v6;
use Test;
plan *;

my ($x, $y);

sub _do_(:&test, :&todo)
{
	return unless &test();
	&todo();
	_do_ :&test, :&todo;
}

sub test()
{
	0 < $x;
}

sub _todo_()
{
	$y += $x;
	$x--;
}

# say $*ERR: 'it takes a while.';
$*ERR.say('it takes a while.');

($x, $y) = (10, 0);
_do_(:&test, :todo(&_todo_));
is $y, 55;

($x, $y) = (100000, 0);
try { _do_(:&test, :todo(&_todo_)); }
is $!, 'maximum recursion depth exceeded';
isnt $y, 5000050000;
```

`_do_` という制御構造風の関数を定義しています。何も考えずに再帰するので、`$x` の値が大きくなるとスタックがあふれます ('maximum recursion depth exceeded')。

```
$ ./a.tail-call.t6
it takes a while.
ok 1 - 
ok 2 - 
ok 3 - 
```

# 6 日に作った真偽値クラスを使う

`_do_` を、[6 日](/items/4efb81f8058ccabf1a7a)に作った真偽値クラスを使って書き換えます。

## 複雑なので WhileTrue モジュール/ロールを作る

```perl6:WhileTrue.pm6
use v6;

role WhileTrue;

method _do_(&todo)
{
	my &tail = sub () {
		my &cont = sub () {
			&todo();
			&tail();
		};
		my &break = sub () { };
		my $b = (self)();
		$b._if_(:t(&cont), :f(&break));
	};
	&tail();
}
```

# テスト

```perl6:b.while-true.t6
#!/usr/bin/env perl6

# 念のため Unix 版の rakudo-star-2012.11 を使ってください。

use v6;
use B;
use I;
use WhileTrue;
use Test;
plan *;

my ($x, $y);

($x, $y) = (I.new(10), I.new(0));
WhileTrue.new(&test)._do_(&_todo_);
is $y.equals(I.new(55)), T._;

($x, $y) = (I.new(100000), I.new(0));
try { WhileTrue.new(&test)._do_(&_todo_); }
is $!, 'maximum recursion depth exceeded';
isnt $y.equals(I.new(5000050000)), T._;

sub test
{
	$x.equals(0).not;
}

sub _todo_ # `todo` という名前は `Test` と干渉する。
{
	$y = $y.add($x);
	$x = $x.pred;
}
```

```
$ perl6 -I../d.st-if -I. b.while-true.t6
it takes a while.
ok 1 - 
ok 2 - 
ok 3 - 
```

# Perl 5 では

カレンダーの趣旨に反するのでここにコードは貼りませんが、下記の github リポジトリには、perl5/ というサブディレクトリがあって、今回の話に対応する Perl 5 による無限に繰り返せるバージョンの WhileTrue の実装とテストが置いてあります。これを読むと Perl 5 の goto が、その名にかかわらず画期的な機能であることが理解できると思います。筆者は Perl 6 でこの goto がどのように昇華されるのかを楽しみにしています。

https://github.com/x19290/2012advent.p6/tree/master/e.st-while
jQuery Deferred + google APIs

非同期処理を同期的に実行のメモ（改）
===================================

1. 認証
2. google APIsのロード
3. APIの使用

を逐次実行。

```gapi.js
        function prms_gapi_auth(){
            var df = $.Deferred();
            gapi.auth.authorize(
            {client_id: constants.gapi.client_id, scope: 'https://www.googleapis.com/auth/drive', immediate: true}, function(res){
                if(!gapi.auth || !gapi.auth.getToken()){
                     df.reject("gapi.auth not exists");
                }
                for(var i=0;i<10000;i++){
                    var s = "aaaa";
                    s+="bbbbb";
                }
                console.log("auth success");
                df.resolve(res);
            }
            );
            return df.promise();
        }
        
        function prms_gapi_load_by(api,v){
            var df = $.Deferred();
            gapi.client.setApiKey(constants.gapi.api_key);
            gapi.client.load(api, v, function(){
                console.log("load success:" + api);
                df.resolve("loaded:" + api);
                });
            return df.promise();
        }
        /*
         * google drive file list( filter:folder id )
         */
        function list_files_with(cond){
            var df = $.Deferred();
            var initialRequest = gapi.client.drive.files.list(
                {q:"'0B3pnnGKgIx1uWlZrY3RiTHBHcTA' in parents"}
            );
           initialRequest.execute(function(resp){
            var cache = {};
            console.log(resp.items);

              $(resp.items).each(function(ix,v){
                    cache[v.id] = v;
                });
               console.log(cache);
               df.resolve(cache);
            });
           return df.promise();
        }
        /**
         * google drive sdk (create folder sample)
         */
        function createFolder(folderName){
            var body = {
              'title': folderName,
              'mimeType': "application/vnd.google-apps.folder"
            };
            var request = gapi.client.drive.files.insert({
              'resource': body
            });
            request.execute(function(resp) {
              console.log('Folder ID: ' + resp.id);
            });
        }
        
        function load_APIs(){
            prms_gapi_auth().done(function(res){
                console.log("auth callback");
                $.when(prms_gapi_load_by("drive","v2")).then(function(data){
                    //事前条件： authorize が完了    
                    console.log(data);
                })    
            });
        }
```
Ruby 1.9.3-p327 falcon patchをrvmでインストール

なにか評判のいいパッチがrvmに来てたのでインストールの方法だけメモ
自分ではパフォーマンスのテストなどはしてません

https://gist.github.com/4136373

```
rvm get head
# open new shell
rvm reinstall 1.9.3 --patch falcon
```

.bash_profileに

```
export RUBY_GC_MALLOC_LIMIT=60000000
export RUBY_FREE_MIN=200000
```
rbenv versions の出力をプログラムから利用しやすい形で得る


`rbenv versions --bare` を使う。

```
$ rbenv versions
* 1.9.3-p327 (set by /Users/usr0600121/.rbenv/version)
  2.0.0-preview1
  ree-1.8.7-2012.02
```

```
$ rbenv versions --bare
1.9.3-p327
2.0.0-preview1
ree-1.8.7-2012.02
```

https://github.com/sstephenson/rbenv/blob/master/libexec/rbenv-versions#L7
.rvmrc を読み込みたいけど、gemsetをまだ作っていなかった

.rvmrc ってたいていこんな中身だと思うので

```bash:.rvmrc
rvm use 1.9.3@gemset-hoge
```

以下のコマンドで一発セットアップ

```bash
`cat ./.rvmrc` --create && bundle
```
ソースコードの更新タイミングで自動的にテストを実行する


## Gemfile修正

以下をGemfileに追加

```ruby:Gemfile
  gem 'ZenTest'
  gem 'autotest-rails'
  gem 'autotest-growl'    # Growl する場合
  gem 'autotest-fsevent'  # mac の場合（推奨）
```

## `~/.autotest` を作成

```ruby:.autotest
# coding: utf-8
require 'autotest/growl'    # Growlする場合
require 'autotest/fsevent'  # mac の場合推奨

# 無視するファイルディレクトリを指定
Autotest.add_hook :initialize do |autotest|
  %w{.git .DS_Store ._* vendor}.each { |exception| autotest.add_exception(exception) }
  false
end
```

## Autotestを実行

プロジェクトのルートで`autotest`を実行


## 参考
- [autotest · rspec/rspec Wiki](https://github.com/rspec/rspec/wiki/autotest)
- [svoop/autotest-growl](https://github.com/svoop/autotest-growl)
- [svoop/autotest-fsevent](https://github.com/svoop/autotest-fsevent)
お兄ちゃん、どいて!そいつ(AVD)殺せ(kill)ない!!


立ち上げようとすると死ぬし、じゃあAVDを削除して作り直そうとすると「VM生きてるから殺せないよ」みたいに言われるし、どうしろって言うんだみたいな状態の時の対処方法

```
cd ~
rm -fr .android
```

この状態に陥いるのはエミュレータを強制終了せざるを得なかった時と思う。結構ハマったのでメモ。