[Flex4]はじめました。やっと...[インストール編]

[Flex4]はじめました。やっと...


Flash Develop 3.1.1 RTMが先月にリリースされていましたが、
記事を見ているとFlex4にも対応とか書いてありましたので、重い腰があがってしまいました。
FlashDevelop 3.1.1 RTMがインストールされている前提で進めていきます。


Flex4のインストール


1. Flex4 DownloadよりAdobe Flex SDKをダウンロードします。


2. 解凍してフォルダ名変更して[C:\Program Files\flex_sdk_4]な感じに設置しました。
Vistaとか7だとc直下のほうがいいのかな?


3. 一応Path通しておきます。やり方わからなかったらGoogleにでも聞いてみてください。
ひだりうざい


4. FlashDevelopを起動します。


5. [F10]キーを押下します。または[ツール] => [環境設定]


6. 左ペイン[AS3Content] => [Flex SDK Location]に先程設置したFlex4 SDKのパスを指定します
こんな感じ => [C:\Program Files\flex_sdk_4]


7. 一応再起動しておきます


おしまい。


適当Flex4アプリを作成してコンパイル・実行してみる


[プロジェクト] => [新規プロジェクト] => [Flex 4 Project]と選択します。


[名前]を適当に入力し、[場所]を確認して[OK]を押下します。


以下のようなソースが自動生成されます。



<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">

<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>

</s:Application>

とりあえず名前空間の変化にびっくりした!


以下のように変更してみましょう



<?xml version="1.0"?>
<!-- Simple example to demonstrate the Spark Button control -->
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx">

<fx:Script>
<![CDATA[
import flash.events.Event;

// Event handler function to print a message
// describing the selected Spark Button control.
private function printMessage(event:Event):void {
message.text += event.target.label + " pressed" + "\n";
}

]]>
</fx:Script>

<s:Panel title="Spark Button Control Example"
width="75%" height="75%"
horizontalCenter="0" verticalCenter="0">
<s:VGroup left="10" right="10" top="10" bottom="10">
<s:VGroup width="100%">
<s:Button label="Default Button" click="printMessage(event);"/>
<s:Button label="autoRepeat Button" buttonDown="printMessage(event);"
autoRepeat="true"/>
<s:Button label="Disabled Button" enabled="false"
click="printMessage(event);"/>
</s:VGroup>
<s:TextArea x="80" y="0" id="message" height="100%" width="100%"
color="#0000FF"/>
</s:VGroup>
</s:Panel>

</s:Application>

うん。ただのAPIリファレンスにのっていたサンプルなんですよ。


[F5]キー又は[プロジェクト] => [プロジェクトをテスト]で実行されるか確認します。
なお、Flex4はFlash Player10以降がインストールされている必要があります。


こちらから完成例?をみることができます。デフォルトデザインが非常に綺麗になっていますね。
sample.swf


おまけ


ご存知のとおり、FlashDevelop 3.1からはDebugツールの標準組み込みや日本語化がされています。


日本語化


日本語化は[ツール] => [環境設定] => 左ペイン[FlashDevelop]を選択
一番下にスクロールして、[Selected Locale]から[ja_JP]を選択して、再起動すれば日本語化されます。


デバックツールは日本語化されないようですが...


デバックツール


デバックツールの使い方は[行番号]の横をマウスでクリックするだけです。
1回選択でブレイクポイント作成、2回目の選択でブレイクポイントの無効化、3回目で削除です。
なお、[表示] => [Local Variables]でローカル変数等の値を表示することが出来ます。


行番号


[ツール] => [環境設定] => 左ペイン[FlashDevelop]
[Display | 表示]内の[View Line Numbers]を[True]にします。
これはいじってなければデフォルトでtureのはず。


Flash Builder 4だとUnitテストができるようになっているみたいなので、
こちらはすごく魅力的ですね...
FlashDevelopにつかないかしら...


Sparkアーキテクチャー


Flex4からは新たにSparkアーキテクチャーが使えるようになりました。
これは、HTMLっぽくてすごく使いやすいかなと思います。
上記の例はspark.componentsというパッケージを利用しました。
勿論Flex 3で利用していたmxアーキテクチャーも使用できます。
mxアーキテクチャーではvboxとかを利用していましたが、
これと同等の機能としてVGroupとなったりと若干名称が変わっているようです。


外部リソースとの連携などもやりやすくなっているらしいので、(これは使うときにUnitテストが欲しいなーとか思っちゃいますが...)次回以降そこらへんを触ってみようかなと思います。


追記


<を文字参照にし忘れていましたのでいまさらながら修正。

スポンサーサイト

あまり使わないけど使うリンク集メモ

リンク集メモ


MySQL系のアーカイブ


http://downloads.mysql.com/archives.php


Flex4ダウンロード先


http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+4


Flex3ダウンロード先


http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+3


Flex Developer Documentation


http://opensource.adobe.com/wiki/display/flexsdk/Developer+Documentation


Ruby系


OneClick系


ソース


gem


CentOS(riken)


http://ftp.riken.jp/Linux/centos/


ISO(i386)


ISO(x86_64)


その他


OpenSSH
5.4p1

[Rails][非同期処理]delayed_job使い方

[Rails][非同期処理]delayed_job使い方


情報が若干古くなりましたので、修正しました。
現在(2010/11/27)の最新バージョンは
Rails2系 => 2.0.4
Rails3系 => 2.1.1
となっています。Priorityや実行時刻などの制御が可能となっています。(たぶん)


delayed_jobを使ってみたかったのでメモ。
但し、非同期処理自体はWindowsで実行できない模様なので、Jobの登録までしかローカルで実行できない感じ。=> RakeFileへ登録した後にrake jobs:workコマンドでWindowsでも登録されたJobの登録ができました。
ちなみに利用したのはgemでインストールできるやつ。多分collectiveidea's delayed_job


[関連記事]
以下のほうが詳しいかなと思います。
[Rails][非同期処理]delayed_job使い方 その2
[Rails][非同期処理]delayed_job使い方 その3


インストール


環境


  • Windows XP Professional SP3
  • ruby 1.8.6 (2010-02-04 patchlevel 398) [i386-mingw32]

  • gem 1.3.6

gemからインストール
※以下はRails2系用です。


gem install delayed_job -v 2.0.4

2010/11/14に最新のバージョンがリリースされました。
2.0.3が2.0.4になりました。


Rails3系を利用されている方は以下のコマンドでインストールしてください。


gem install delayed_job -v 2.1.1

Railsへの設定


config/enviroment.rbへの記述


Rails::Initializer.run do |config|
...略
config.gem 'delayed_job'
...略
end

delayed_jobの初期設定


RadRails使っている場合は、ジェネレーターを出して、生成プログラムのところに[delayed_job
]と入力し、実行する。
コマンドプロンプト等から実行する場合はRAILS_ROOTへ移動して以下のコマンドを実行


ruby script/generate delayed_job

上記で以下のようなマイグレーションファイルが生成される。
RAILS_ROOT/db/migrate/[timestamp]_create_delayed_jobs.rb


class CreateDelayedJobs < ActiveRecord::Migration
def self.up
create_table :delayed_jobs, :force => true do |table|
table.integer :priority, :default => 0 # Allows some jobs to jump to the front of the queue
table.integer :attempts, :default => 0 # Provides for retries, but still fail eventually.
table.text :handler # YAML-encoded string of the object that will do work
table.text :last_error # reason for last failure (See Note below)
table.datetime :run_at # When to run. Could be Time.zone.now for immediately, or sometime in the future.
table.datetime :locked_at # Set when a client is working on this object
table.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead)
table.string :locked_by # Who is working on this object (if locked)
table.timestamps
end

add_index :delayed_jobs, [:priority, :run_at], :name => 'delayed_jobs_priority'
end

def self.down
drop_table :delayed_jobs
end
end

マイグレーション


RadRails使っている場合は、Rakeタスクを出して、db:migrateを選択して実行します。
コマンドプロンプト等から実行する場合はRAILS_ROOTへ移動して以下のコマンドを実行


rake db:migrate

使い方


object.send_later(methods, params)

具体的には、CsvImportを例に取ると...


Model


require 'csv'
class CsvImport < ActiveRecord::Base
def self.import(filepath)
# TODO something
end
end

controller


require 'digest/sha2'
class CsvImportsController < ApplicationController
FILE_TMP_DIR = "#{RAILS_ROOT}/uploaded/csv/"
def upload
file_name = Digest::SHA256.hexdigest(params[:file].original_filename + Time.now.to_s.gsub(/ /, '')) + ".csv"
file_path = FILE_TMP_DIR + file_name
if params[:file]
File.open(file_path, "wb") { |f|
f.write params['file'].read
}
end
CsvImport.send_later(:import, :filepath => filepath)
redirect_to :controller => 'csv_imports', :action => 'index'
return

バックグランドジョブの動かし方


script/delayed_job start # development mode start
script/delayed_job stop # development mode stop
script/delayed_job restart # development mode restart

RAILS_ENV=[production] script/delayed_job [start/stop/restart]

-nオプションで起動プロセス数指定。
--max-priorityオプションでpriorityの最大値を指定。
--min-priorityオプションでpriorityの最小値を指定。(1とかにするとデフォルトで登録されたJobは実行されなくなる)
※-nオプション以外は使ったことはありません!


capistrano deploy.rb用


namespace :delayed_job do
desc "Start delayed_job process"
task :start, :roles => :app do
run "cd #{current_path}; RAILS_ENV=#{stage} script/delayed_job start"
end

desc "Stop delayed_job process"
task :stop, :roles => :app do
run "cd #{current_path}; RAILS_ENV=#{stage} script/delayed_job stop"
end

desc "Restart delayed_job process"
task :restart, :roles => :app do
run "cd #{current_path}; RAILS_ENV=#{stage} script/delayed_job restart"
end
end

after "deploy:start", "delayed_job:start"
after "deploy:stop", "delayed_job:stop"
after "deploy:restart", "delayed_job:restart"

参考 : http://adamfortuna.com/2009/08/17/the-amazingness-of-delayed_job-for-rails/


delayed_jobの設定


設置場所 : RAILS_ROOT/config/initializers
ファイル名 : delayed_job.rb


# 失敗したJobを削除するか
Delayed::Worker.destroy_failed_jobs = (ENV[‘RAILS_ENV’]== 'production' ? true : false)
# Sleepタイム
Delayed::Worker.sleep_delay = (ENV[‘RAILS_ENV’]=='production' ? 60 : 5)
# 最大実行回数
Delayed::Worker.max_attempts = (ENV[‘RAILS_ENV’]=='production' ? 5 : 1)
# 最大実行時間
Delayed::Worker.max_run_time = 5.minutes
# production時のみ非同期処理をする場合は以下を設定
if %w(production).include? ::Rails.env
[ClassName].handle_asynchronously :[MethodName]
end

CentOS 5.5で動作確認しました。上記例とは若干違うプログラムです。上記例は適当に書いているだけですので注意してください。


参考文献
http://github.com/collectiveidea/delayed_job


テスト環境と開発環境では非同期処理をしたくない場合


enviroment内のproduction.rb等に非同期処理をしたいメソッドを追加するだけです。
但しこの方法だとモデルメソッド等しか実行できませんので、
コントローラに実装が入っている場合は上手く利用できません。



[Model].handle_asynchronously :[method]

おまけ : jobが登録されているか閲覧用


結構重要でした。吐かれるエラーもキャッチして画面に表示できますので、是非マスターなどに導入してみてください。
Jobの削除はrake jobs:clearでも可能ですが、全部消えちゃうので、管理画面から消せるといいと思います。


Controller : DelayedJobsController



class DelayedJobsController < ApplicationController
before_filter :set_page_title

def index
@jobs = Delayed::Job.paginate(:page => params[:page], :per_page => 10, :order => 'id DESC')
end

def show
@job = Delayed::Job.find(params[:id])
end

def destroy
@job = Delayed::job.find(params[:id])
@job.destroy
redirect_to :index
end
private

def set_page_title
@page_title = t('delayed_jobs.page_title')
end
end

View : index.html.erb



<h2><%= t('delayed_jobs.h2.index')%></h2>
<table class="list">
<thead>
<tr>
<th>ID</th>
<th><%= t('activerecord.attributes.delayed_job.priority') %></th>
<th><%= t('activerecord.attributes.delayed_job.attempts') %></th>
<th><%= t('activerecord.attributes.delayed_job.run_at') %></th>
<th><%= t('activerecord.attributes.delayed_job.failed_at') %></th>
<th><%= t('activerecord.attributes.delayed_job.updated_at') %></th>
<th></th>
</tr>
</thead>
<tbody>
<% @jobs.each do |job| %>
<tr>
<td><%= h(job.id) %></td>
<td><%= h(job.priority) %></td>
<td><%= h(job.attempts) %></td>
<td><%= h(job.run_at) %></td>
<td><%= h(job.failed_at) %></td>
<td><%= h(job.updated_at) %></td>
<td><%= link_to t('show'), :controller => 'delayed_jobs', :action => 'show', :id => job.id %></td>
</tr>
<% end %>
</tbody>
</table>
<%= will_paginate @jobs %>

View : show.html.erb



<h2><%= t('delayed_jobs.h2.show')%></h2>
<table class="col_001">
<tbody>
<tr>
<th>ID</th>
<td><%=h @job.id %></td>
</tr>
<tr>
<th><%= t('activerecord.attributes.delayed_job.priority') %></th>
<td><%=h @job.priority %></td>
</tr>
<tr>
<th><%= t('activerecord.attributes.delayed_job.attempts') %></th>
<td><%=h @job.attempts %></td>
</tr>
<tr>
<th><%= t('activerecord.attributes.delayed_job.handler') %></th>
<td><pre><%=h @job.handler %></pre></td>
</tr>
<tr>
<th><%= t('activerecord.attributes.delayed_job.last_error') %></th>
<td><pre><%=h @job.last_error %></pre></td>
</tr>
<tr>
<th><%= t('activerecord.attributes.delayed_job.run_at') %></th>
<td><%=h @job.run_at %></td>
</tr>
<tr>
<th><%= t('activerecord.attributes.delayed_job.locked_at') %></th>
<td><%=h @job.locked_at %></td>
</tr>
<tr>
<th><%= t('activerecord.attributes.delayed_job.failed_at') %></th>
<td><%=h @job.failed_at %></td>
</tr>
<tr>
<th><%= t('activerecord.attributes.delayed_job.locked_by') %></th>
<td><%=h @job.locked_by %></td>
</tr>
<tr>
<th><%= t('created_at') %></th>
<td><%=h @job.created_at %></td>
</tr>
<tr>
<th><%= t('updated_at') %></th>
<td><%=h @job.updated_at %></td>
</tr>
</tbody>
</table>
<%= link_to '戻る', :controller => 'delayed_jobs', :action => 'index' %>

config/locals/ja.yml



activerecord:
models:
delayed_job: ジョブ
attributes:
delayed_job:
priority: 優先度
attempts: 処理回数
handler: 処理対象
last_error: エラーメッセージ
run_at: 実行時刻
locked_at: ロックタイム
failed_at: 失敗時刻
locked_by: ロックプロセス
created_at: 作成時刻
updated_at: 更新時刻
to_index: 戻る
created_at: 作成時刻
updated_at: 更新時刻
show: 閲覧
edit: 編集
destroy: 削除

delayed_jobs:
page_title: ジョブ一覧
link:
index: "ジョブ一覧"
h2:
index: "ジョブ一覧"
show: "ジョブ詳細"


言語ファイルの書き方がこれであっているのかは不明。

続きを読む
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。