Cassandra 1.x で7日以上経過したスナップショットディレクトリを削除する

キースペース名を Hoge とすると…

テスト

/usr/bin/find /var/lib/cassandra/data/Hoge/ -type d -ctime +7 -regex '.*/snapshots/.*' -print;

削除

/usr/bin/find /var/lib/cassandra/data/Hoge/ -type d -ctime +7 -regex '.*/snapshots/.*' -exec rm -rf {} \;

0.xなら

/usr/bin/find /var/lib/cassandra/data/Hoge/snapshots/ -type d -ctime +7 -exec rm -rf {} \;

jpmobileでiPadに対応する

jpmobileとしては、iPadはモバイルじゃないよという考えなのだろうなと思いつつも野暮なことをしてみました。

ついでにタブレット端末かどうか判定するコードも入れました。

lib/jpmobile_ext.rb

# -*- coding: utf-8 -*-
Dir[File.join(File.dirname(__FILE__), 'jpmobile/**/*.rb')].sort.each { |lib| require lib }

module Jpmobile
  # autoload mobile classes
  module Mobile
    autoload :Ipad, 'jpmobile/mobile/ipad'
    DEFAULT_CARRIERS_WITH_IPAD = %w(Docomo Au Softbank Vodafone Emobile Willcom Ddipocket Iphone Android WindowsPhone Ipad)

    def self.carriers
      if @carriers.nil? || @carriers == DEFAULT_CARRIERS
        @carriers = DEFAULT_CARRIERS_WITH_IPAD.dup
      end
      @carriers
    end

  end
end

lib/jpmobile/mobile/abstract_mobile_ext.rb

# -*- coding: utf-8 -*-

module Jpmobile::Mobile
  class AbstractMobile

    def tablet?
      return false
    end

  end
end

lib/jpmobile/mobile/android_ext.rb

# -*- coding: utf-8 -*-
# =Android
module Jpmobile::Mobile
  # ==Android
  class Android < SmartPhone

    # GALAXY Tab SC-01C はタブレット端末であるが例外的に Mobile Safari を使っている
    TABLET_USER_AGENT_REGEXP = /((?!(Android.*Mobile)+)Android)|(Android.*SC-01C)/

    def tablet?
      if TABLET_USER_AGENT_REGEXP =~ @request.env['HTTP_USER_AGENT']
        return true
      else
        return false
      end
    end

  end
end

lib/jpmobile/mobile/ipad.rb

# -*- coding: utf-8 -*-
# =iPad
module Jpmobile::Mobile
  # ==iPad
  class Ipad < SmartPhone
    # 対応するUser-Agentの正規表現
    USER_AGENT_REGEXP = /iPad/

    # Jpmobile::Rack::Filter を適用する
    def apply_filter?
      true
    end

    # Jpmobile::Rack::ParamsFilter を適用する
    def apply_params_filter?
      true
    end

    def tablet?
      return true
    end

    # 文字コード変換
    def to_internal(str)
      # 絵文字を数値参照に変換
      str = Jpmobile::Emoticon.external_to_unicodecr_softbank(Jpmobile::Util.utf8(str))
      # 数値参照を UTF-8 に変換
      Jpmobile::Emoticon.unicodecr_to_utf8(str)
    end
    def to_external(str, content_type, charset)
      # UTF-8を数値参照に
      str = Jpmobile::Emoticon.utf8_to_unicodecr(str)
      # 数値参照を絵文字コードに変換
      str = Jpmobile::Emoticon.unicodecr_to_external(str, Jpmobile::Emoticon::CONVERSION_TABLE_TO_SOFTBANK, false)

      [str, charset]
    end
  end
end

rvm + cron + bundler + script/runner

bundler を使い始めてから cron 経由の script/runner が起動しなくなり、エラーを見ると次のようになっていた。

/usr/bin/env: ruby: No such file or directory

rvm の Ruby が見つけられないようなので、cron から実行する shell script を次のように変更する

#!/usr/bin/env bash

app_home=/home/test_app
ruby_home=/usr/local/rvm/gems/ruby-1.9.2-p0
bundle_path=$ruby_home/bin/bundle
export GEM_HOME=$ruby_home
export PATH=$PATH:/usr/local/rvm/bin:$ruby_home/bin

cd $app_home
$bundle_path exec script/runner 'Hoge.test;Rails.logger.flush' -e production

Windows + Ruby1.9.2 + Rails3 で mysql2.gem を使う

RubyRubyInstaller を使ってインストールしておく。

自分のローカルの MySQL Server と同じバージョンの MySQL の header と library をダウンロードしておく。

インストール(include, lib のパスは自分の環境に合わせる)

gem i mysql2 -- '--with-mysql-include="c:\gem_build\mysql_5_5\include" --with-mysql-lib="c:\gem_build\mysql_5_5\lib"'

面倒臭かったら、mysql.gem (ruby-mysqlではない)を使うのもありだと思います。

Windows + Ruby1.9.2 で RMagick を使う

RubyRubyInstaller を使ってインストールしておく。

ImageMagick のサイトから ImageMagick-6.6.9-8-Q8-windows-dll.exe をダウンロード(2011/05/11時点の最新)。

http://www.imagemagick.org/script/binary-releases.php#windows


インストール時にパスを追加するという項目と以下の項目をチェックする。
「Install develpment headers and libraries for C and C++

インストール(include, lib のパスは自分の環境に合わせる)

gem i rmagick -- '--with-opt-include="C:\Program Files\ImageMagick-6.6.9-Q8\include" --with-opt-lib="C:\Program Files\ImageMagick-6.6.9-Q8\lib"'

Titanium Mobile + iPhone4 でオーバーレイビュー表示時にカメラビューが縦長になってしまう不具合の対応方法

Titanium.Media.showCamera(
  overlay: (省略),
  transform: Ti.UI.create2DMatrix().scale(1),
  success: function() {
(省略)
);