- 平成22年3月5日(金) 14時30分10秒
-
区分
- ssh
-
報告者:
- tahara
こんにちは!! tahara です。
例えば host1 を経由して host2 に vnc したい場合どうすればいいか調べてみました。
結果 ↓ のページに書かれてあるとおりすれば可能でした。ありがとうございます。
ssh を多段に使ってずっと遠くにあるマシンに port forward する|裏表(Phinloda のもう裏だか表だか分からないページ)
蛇足になりますが、次の手順で host2 に vnc できました。
>View Comments
このページの上へ戻る
- 平成22年2月26日(金) 16時42分10秒
-
区分
- iPhone
-
報告者:
- tahara
こんにちは!! tahara です。
突然ではありますが、とりあえず読むべきは iPhone Dev Center にある以下のドキュメントでしょうか。
まずは iPhone ヒューマンイン ターフェイス ガイドライン を読んでみました。
iPhone が他と違うところ
- 小さい画面サイズ。 480x320
- メモリ少ない。OS が警告をくれたらすぐにメモリ開放すべすし。didReceiveMemoryWarning
- 1画面。ある意味 Stumpwm!
- さらに、同時に1アプリケーション。
- 標準に準拠してヘルプコンテンツを最小限にすべし。
3つのアプリケーションの形態
- iPhone アプリケーション
- Web 専用contents
- ハイブリッドアプリケーション(上の2つの組み合わせ)
3つのアプリケーションスタイル
- 生産性型アプリケーション(例 Mail)
- ユーティリティ型アプリケーション(例 Weather)
- 没入型アプリケーション(例 ゲームアプリ)
デスクトップアプリを移植する場合はよく使われる 20% の機能のみに絞る。
ヒューマンインターフェイスの原則
- 自然なメタファで
- 具体的なものを直接いじる感覚
- テキスト入力を最小限に、選択肢を提示
- ユーザの操作に対するフィードバック、効果的なやりとり
- ユーザが開始でき、それを停止できる動きであること
- インターフェイスの一貫性
製品定義ステートメントを作りましょう。
簡潔さと使いやすさ
- 使い方を明白に
- 頻繁に使用される情報を画面上部に集中
- テキスト入力を最小限
- 重要な情報を簡潔に
- タップ可能な要素の領域は指先サイズに
製品ステートメントにふさわしい主たる機能に焦点を当て、
簡潔かつ入力を最小限にする。
ジェスチャを適切にサポートする。
- 単純かつ簡単な方法は必須
- 新しいジェスチャを定義しない
ブランドはささやかで控え目に。
ただしアプリケーションアイコンにはブランドももりこむ。
一般的なタスク
- 開始
- ステータスバーに適切なスタイルを設定する
- 最初の画面に似た起動画面を用意して感覚的起動時間を短縮する
- 余計なスプラッシュ画面は不要
- 基本縦で起動
- 最後に実行したときの状態を復元する
- 停止
- いつでも停止できるように
- 停止時は次の起動のために可能なかぎり詳細の情報を保存しておく
- 設定(Settings)と設定オプション
- 設定は一度設定したら変更しないもの
- 設定オプションは頻繁に変更する可能性があるもの
- 理想はユーザに設定を要求しないこと
- その他いろいろ ... ちょっと省略してしまいました。
ユーザインターフェイスの設計
- ステータスバーはあまりいじらない
- ToolBar は 44x44 で5つ以下が妥当
- Tab Bar はモードの切り替え。
5つまでは横に並んで、それをこえたものは More に。
バッジを表示できる。
- モーダルビューは煩わしいので乱用しない。
- Action Sheet はユーザの選択肢でり複数のボタンを備える。
害のあるものは赤で一番上に。
- モーダルビューは主たる機能が関連する自己簡潔型のタスクで(例 Mail のメッセージ作成)
- アクティビティインジケータ
- ステータスバーのは1〜2秒ネットワークにアクセスする場合
- もっと時間がかかる場合はツールバーに表示
- 進捗がわかるものは Progress View
- Text Field は左端に使用目的、右端に追加機能
- システムが用意しているボタン、アイコンを意図されたとおり使う
アイコン、画像の作り方の説明でおしまい。
このようなドキュメントがしっかり用意されているのは素晴しいですね。
>View Comments
このページの上へ戻る
- 平成22年2月19日(金) 23時09分06秒
-
区分
- Lisp on Rails
-
報告者:
- tahara
こんにちは!! tahara です。
Lisp on Rails 第4回です!
今回は ActiveRecord の has_many アソシエーションもどきを実装したいと思います。
前回の belongs_to とほとんど同じです。
ar-has-many-direct-slot-definition と ar-has-many-effective-slot-definition
を定義します。
(defclass ar-has-many-slot-mixin ()
((has-many :initarg :has-many
:initform nil
:accessor has-many)
(class-symbol :initarg :class-symbol
:initform nil
:accessor class-symbol)))
(defmethod initialize-instance :after ((self ar-has-many-slot-mixin) &rest args)
(declare (ignore args))
(unless (class-symbol self)
(setf (class-symbol self)
(sym (singularize (has-many self))))))
(defclass ar-has-many-direct-slot-definition (ar-direct-slot-definition
ar-has-many-slot-mixin)
())
(defclass ar-has-many-effective-slot-definition (ar-effective-slot-definition
ar-has-many-slot-mixin)
())
direct-slot-definition-class と effective-slot-definition-class と
compute-effective-slot-definition でゴニョゴニョすると上記の
slot-definition が使えるようになります。
slot-value-using-class と (setf slot-value-using-class) で関連テーブルの
取得と設定を行います。
(defmethod c2mop:slot-value-using-class
((class active-record-class)
instance
(slot-def ar-has-many-effective-slot-definition))
(aif (call-next-method)
it
(setf (slot-value instance (has-many slot-def))
(all (find-class (class-symbol slot-def))
:conditons (list (key-sym (class-name class) '-id)
(%value-of instance :id))))))
(defmethod (setf c2mop:slot-value-using-class) :after
(new-value
(class active-record-class)
instance
(slot-def ar-has-many-effective-slot-definition))
(loop with id = (%value-of instance :id)
with column = (str (class-name class) "-id")
for x in new-value
do (setf (%value-of x column) id)))
で、だいたいこんな感じで使えるようになります。
(def-record comment
(:belongs-to post))
(def-record post
(:has-many comments))
(let* ((post (car (all post)))
(comments (comments-of post)))
(mapc #'describe comments))
以上、なんとなく has-many できました。
ソースはこちらから http://github.com/quek/lisp-on-rails
第5回につづきます
>View Comments
このページの上へ戻る
- 平成22年2月12日(金) 10時55分04秒
-
区分
- Lisp on Rails
-
報告者:
- tahara
こんにちは!! tahara です。
Lisp on Rails 第3回です!
今回は ActiveRecord の belongs_to アソシエーションもどきを実装したいと思います。
実行時のイメージとしては次のようになります。
(def-record post)
(def-record comment
(:belongs-to post)) ; comments テーブルは post_id 列を持っている。
(mapcar #'post-of (all comment))
;; => ポストのリストを取得
これを実装するのに Common Lisp の MOP を使ってみます。
インスタンス変数とそのインスタンス変数へのアクセスを拡張することになります。
まずインスタンス変数の拡張です。
ar-belongs-to-slot-mixin に belongs_to のアソシエーションテーブルと
外部キーを持たせ、それを継承した
ar-belongs-to-effective-slot-definition を
belongs_to のアソシエーションのインスタンス変数とします。
(defclass ar-belongs-to-slot-mixin ()
((belongs-to :initarg :belongs-to
:initform nil
:accessor belongs-to)
(foreign-slotname :initarg :foreign-slotname
:initform nil
:accessor foreign-slotname)))
(defclass ar-belongs-to-effective-slot-definition (ar-effective-slot-definition
ar-belongs-to-slot-mixin)
())
slot-value-using-class を使い
ar-belongs-to-effective-slot-definition にアクセスする際に、
foreign-slotname を外部キーとして belongs-to のテーブルから
レコードを取得するようにします。
(defmethod c2mop:slot-value-using-class
((class active-record-class)
instance
(slot-def ar-belongs-to-effective-slot-definition))
(aif (call-next-method)
it
(setf (slot-value instance (belongs-to slot-def))
(select (find-class (belongs-to slot-def))
(slot-value instance (foreign-slotname slot-def))))))
以上、なんとなく belongs-to できました。
ソースはこちらから http://github.com/quek/lisp-on-rails
第4回につづきます
>View Comments
このページの上へ戻る
- 平成22年2月5日(金) 10時49分53秒
-
区分
- Ruby on Rails
-
報告者:
- tahara
こんにちは!! tahara です。
今回は Lisp on Rails はお休みで、Ruby on Rails の Paperclip の話題です。
IE で RGB の画像は表示できますが、CMYK の画像は表示できません。
CMYK から RGB に変換する手もありますが、変換時に結構色が変ってしまいます。
ということでアップロードする画像が CMYK の場合は、
バリデーションではじくようにします。
まず CMYK の判定ですが、ImageMagic の identify コマンドで可能です。
~% identify -format '%[colorspace]' ~/archive/normal.jpg
CMYK
~% identify -format '%[colorspace]' ~/archive/normal-rgb.jpg
RGB
ただし古い ImageMagic では -format '%[colorspace]'
オプションが認識されないので -verbose オプションを使います。
~% identify -verbose ~/archive/normal.jpg
Image: /home/ancient/archive/normal.jpg
Format: JPEG (Joint Photographic Experts Group JFIF format)
Class: DirectClass
Geometry: 290x200+0+0
Resolution: 72x72
Print size: 4.02778x2.77778
Units: PixelsPerInch
Type: ColorSeparation
Endianess: Undefined
Colorspace: CMYK <=== これ!!
Depth: 8-bit
...
この identify を呼び出して CMYK をチェックするバリデーションを
config/initializers/paperclip.rb に組み込みます。
module Paperclip
module ClassMethods
...
# CMYK は IE で表示できないため、検証でエラーとする。
def validates_attachment_not_cmyk name, options = {}
message = options[:message] || "CMYK フォーマットの画像はブラウザによって表示できないため使用できません。お手数ですが RGB フォーマットに変換してください。"
attachment_definitions[name][:validations][:not_cmyk] = lambda do |attachment, instance|
original_file = attachment.instance_variable_get(:@queued_for_write)[:original]
colorspace =
begin
attachment.file? && original_file &&
Paperclip.run("identify", "-verbose #{original_file.path}")
rescue
nil
end
if colorspace && colorspace =~ /^\s*Colorspace: CMYK$/
message
end
end
end
....
これでモデルから validates_attachment_not_cmyk
というひどい名前のバリデーションが使えるようになります。
validates_attachment_not_cmyk :picture_1
まとめるとこうなります。
(incf ImageMagic)
(decf IE most-positive-fixnum)
>View Comments
このページの上へ戻る
- 平成22年1月29日(金) 10時16分25秒
-
区分
- Lisp on Rails
-
報告者:
- tahara
こんにちは!! tahara です。
Lisp on Rails 第2回です!
ActiveRecord::Base ではクラスメソッドとして find や all の検索メソッドが定義されています。
Common Lisp でそれらを実装するにあたり、メタクラスのメソッドとして実装してみます。
Common Lisp では自分でメタクラスを定義することができます。
次のようにメタクラスを定義します。
なんとなく、テーブル名とカラム情報を持たせています。
(defclass active-record-class (standard-class)
((%table-name :initarg :%table-name :accessor %table-name-of)
(%columns :initarg :%columns :accessor %columns-of)))
各テーブル毎のクラスはこの active-record-class のインスタンスになり、
インスタンス変数としてテーブル名とカラム情報を持つイメージです。
メタクラスに全レコードを取得する all メソッドを実装します。
(defmethod all ((class active-record-class))
(multiple-value-bind (rows columns)
(clsql-sys:query (format nil "select * from ~a" (%table-name-of class)))
(loop for i in rows
collect (make-instance-from-row class i columns))))
(def-record post) は次のように展開されて
:METACLASS ACTIVE-RECORD::ACTIVE-RECORD-CLASS を指定します。
(PROGN
(DEFPARAMETER POST
(DEFCLASS POST (BASE)
((ID :INITARG :ID :INITFORM NIL :ACCESSOR ID-OF)
(NAME :INITARG :NAME :INITFORM NIL :ACCESSOR NAME-OF)
(TITLE :INITARG :TITLE :INITFORM NIL :ACCESSOR TITLE-OF)
(CONTENT :INITARG :CONTENT :INITFORM NIL :ACCESSOR CONTENT-OF)
(CREATED-AT :INITARG :CREATED-AT :INITFORM NIL :ACCESSOR
CREATED-AT-OF)
(UPDATED-AT :INITARG :UPDATED-AT :INITFORM NIL :ACCESSOR
UPDATED-AT-OF))
(:METACLASS ACTIVE-RECORD::ACTIVE-RECORD-CLASS)))
...
Ruby のクラス定義と違って Common Lisp のクラス定義ではクラス名に何も束縛しないため、
わざわざ
defparameter しています。
そんな感じでメタクラスによる
(all post)
ができました。
ソースはこちらから http://github.com/quek/lisp-on-rails
第3回につづきます
>View Comments
このページの上へ戻る
- 平成22年1月22日(金) 23時09分49秒
-
区分
- Lisp on Rails
-
報告者:
- tahara
こんばんは!! tahara です。
いま仕事で Ruby on Rails を使っています。
正直 Active Record いいっすねー。
DB いじるには楽です。
くやしいので Common Lisp でそれっぽいのを実装してみます。
Lisp on Rails ですね(何だか以前から聞く言葉のような気もします)。
第1回目の今日は何となく Active Record っぽい雰囲気のような感じだけです。
(eval-when (:compile-toplevel :load-toplevel :execute)
(setf *connection-spec* '("localhost" "blog_test" "root" ""))
(setq clsql-sys:*default-database-type* :mysql)
(establish-connection))
;; レコードの定義
(def-record post)
;; インサート
(save (make-instance 'post :name "名前" :title "タイトル" :content "内容"))
;; 検索
(all post)
ソースはこちらから http://github.com/quek/lisp-on-rails
第2回につづきます
>View Comments
このページの上へ戻る
- 平成22年1月15日(金) 16時19分22秒
-
区分
- Stumpwm
-
報告者:
- tahara
こんにちは!! tahara です。
script/autospec の結果を表示してくれる Growl がうらやましいのですが、私
の使っているのは Linux です。しかし、Linux には Stumpwm があります。
Stumpwm の stumpish を使えば echo でメッセージを表示することができます。
そこで script/autospec の結果を Stumpwm で表示する gem を作ってみます。
参考サイト
gem を作るには Jeweler を使うのがよさそうです。
Jeweler は GitHub の API を使うようなので、まずその設定を行います。
user_name と api_token には自分の Username と API Token を指定します。
git config --global github.user user_name
git config --global github.token api_token
Jeweler をインストールしてプロジェクトを作ってみます。
gem install jeweler
jeweler --rspec --create-repo autotest-stumpwm
これで綺麗にプロジェクトが作成されます。
おまけに GitHub にリポジトリまでできています。
次に Rakefile を編集します。TODO になっている次の二箇所を適当に編集すればよさそうです。
あと依存する gem も指定しておきます。
gem.summary = %Q{TODO: one-line summary of your gem}
gem.description = %Q{TODO: longer description of your gem}
gem.add_dependency "autotest-growl", ">= 0.1.7"
次に lib の下のファイルに Stumpwm を使って script/autospec の結果を表示するたコードを書きます。
コードが出きたら次のようにリリースします。
rake version:write
rake gemspec
rake release
これだけで Gemcutter にも自動的に公開されます。
Jeweler すばらしい!!
修正したら git commit して、次のいずれかでバージョンをあげ rake release するだけ。
rake version:bump:major # Bump the gemspec by a major version.
rake version:bump:minor # Bump the gemspec by a minor version.
rake version:bump:patch # Bump the gemspec by a patch
できあがった autotest-stumpwm を使うには gem install autotest-stumpwm して、
~/.autotest に次の一行を書きます。これで autospec と Stumpwm の幸せな生活がおくれます。
require 'autotest/stumpwm'
さて、一番大切な Stumpwm で結果を表示するコードですが、
# -*- coding: undecided -*-
require 'rubygems'
require 'autotest/growl'
module Autotest::Growl
def self.growl(title, message, icon, priority=0, stick="")
priority = if priority > 0 # error or feailed
1 # red
elsif priority == -2 # passed
2 # green
else
3 # yellow
end
system "stumpish echo ^#{priority}* #{title} #{message}"
end
end
ごめんなさい autotest-growl にモンキーパッチをあてただけです。
>View Comments
このページの上へ戻る
- 平成21年12月24日(木) 13時01分04秒
-
区分
- blog制作
-
報告者:
- tahara
こんにちは。12月からメンバにくわわった tahara と申します。
chiba さんの念願でした、このブログの AllegroServe から Hunchentoot への移行を行いました。
既に chiba さんが Hunchentoot への移植はやってくれていたので
Elephant
の導入がメイン作業でした。
Elephant は Common Lisp のオブジェクトデータベースです。バックエンドは色々選べるのですが、今回は SQLite3 を使いました。
現在このブログは次のような構成で動いています。
それでは、今後ともよろしくお願いいたします。
>View Comments
このページの上へ戻る