最新の投稿一覧
FF-CMSの紹介(第2回)
今回から何回かにわたり、FF-CMSの最大の特徴である入力テンプレートと出力テンプレートについて紹介させていただきます。
FF-CMSの商品紹介サイトや導入事例でも詳細させていただいている各WEBサイトはFF-CMSで構築しています。
もちろん、全てのWEBサイトでデザインが異なります。
では、このように表示内容が異なるサイトにどうやって対応しているのか?
その方法をご紹介いたします。
◯カスタマイズ可能な入力フォーム
CMSでページを作成する場合、ブログのように
【タイトル】や【本文】しか入力する項目がないものがあります。
その場合は記事を作成する担当者は
どの場所に写真を表示するか
どの場所にテキストを表示するか
ということを考えながら作成する必要があります。
ブログに写真を貼りつけたりする際に
自分の思ったように配置できなかったり、完成した際の見た目(デザイン)が
気に入らなかったり・・・といったことを経験された方も多いと思います。
FF-CMSでは、【タイトル】【本文】で作成することもできますが
入力項目を小分けにすることで、記事を入力する担当者に
デザインを意識していただく必要がない構成にすることが可能です。
(例)Q&Aの入力画面
このように入力を分けるメリットは
・入力内容が明確になり、更新がしやすい
・テキストのみを入力することで、担当者はHTMLを意識することなく記事を作成することに集中できる
・あらかじめデザインされた部分にテキストを反映するため見栄えがいい
などがあります。
◯様々な入力フォームをサポート
入力内容を分けることでのメリットを説明しましたが
「デザインが決まったものとなってしまい、他のページとの代わり映えがしない」
というデメリットもあります。
そのような要望にお答するため、FF-CMSでは入力フォームに様々なタイプを設定することができます。
具体的には「ブログのように、個々の場所では自由に写真やテキストを入力したい」という要望があった際には
ブログのような入力フォームを追加し、「携帯用に絵文字を表示したい」という要望があった場合には
携帯用の入力フォームを追加することも可能です。
(例)携帯用入力フォーム
このように様々なタイプの入力フォームを追加することで、お客様が要望にあったホームページが
お客様自身で簡単に更新可能になります。
次回は具体例を交えながら、FF-CMSの入力フォームについて説明させて頂きたいと思います。
FF-CMSのお問い合わせはこちら
CMSを利用したサイト構築は、FF-CMSで!
FF-CMSの紹介(第1回)
よろしくお願いします。
◯CMSって何?
まず最初にCMSの説明をさせていただきます。
CMSという言葉はContent Management Systemの略です。
つまりコンテンツを管理するシステム、簡単に言うとホームページを管理できる仕組みです。
インターネットを利用する人口が増加し、ホームページは身近な情報源となっています。
ネット上には、常に新しい情報を求めているユーザが集まってきます。
企業にとってホームページは、最新の情報を提供する場として、とても重要なものとなっているのです。
誰でも簡単にホームページを更新したい!
そんな要望にお応えするのがFF-CMSです。
◯ホームページ管理について
ホームページの更新は3つのパターンに分かれます。
1)自分でHTMLを更新している
こちらはホームページ作成ソフトを利用して修正するのが一般的です。
ホームページ作成ソフトやHTMLの知識が必要となります。
特にWEBデザイナーに作成を依頼したホームページを自分で修正する場合には
HTMLやスタイルシートの知識が必須となります。
2)WEBデザイナーに更新を依頼している
ホームページの更新を、その都度WEBデザイナーに依頼するケースは
担当者のHTMLの知識は不要となりますが、
更新作業の費用がかかります。
また、依頼してからホームページが更新されるまで
時間がかかることがあります。
(WEBデザイナーの作業に依存します)
3)CMSなどの仕組みで更新している
システム化された方法を利用して、ホームページを更新します。
仕組みはブログのようなものであったり、独自のものを作成したりと様々です。
ホームページを思ったときに更新できますが
最初にホームページを立ち上げる(新規作成する)際に費用がかかります。
また、デザインを変更する場合にはシステムとの兼ね合いを考慮する必要があります。
(場合によってはシステムの改修が発生し、費用がかかります)
特徴をまとめると以下のようになります。
| 自分で行う | WEBデザイナに依頼する | CMSで管理する | |
| 更新作業 | 更新箇所によっては、HTMLの知識が必要 | 不要 | 不要 |
| 更新の際の作業コスト | 特になし | 更新の都度、必要となる | 不要(保守はどうする?) |
| 更新の際の作業時間 | 単純な更新ならすぐに可能 | 確認作業などがあるため、時間がかかる | すぐに更新が可能 |
ホームページの更新の際に、何かしらの仕組みを導入するケースが多くなっていますが
スピーディーに簡単に更新するメリット > 導入費用(運用費用)というケースの場合にCMSは導入されます。
それでは次回から実際にFF-CMSにはどのような機能があるのか紹介させていただきます。
FF-CMSのお問い合わせはこちら
CMSを利用したサイト構築は、FF-CMSで!
RubyのTwitterClientで任意のアプリケーション名を表示する方法
(Tweenとかtwhirlとか)を表示したかったので調査しました。
方法は色んなサイトに既に書かれているのですが
callbackするしないでよくわからなかった部分を整理してみました。
OAuthの仕組みなどはここでは書きません。
昔はメールで申請すればアプリケーション名を登録して貰えたみたいですが
最近は
(1)Twitterアプリケーション登録画面から登録
(2)OAuthの認証を通す
(3)OAuth認証後のTwitterAPIでstatusのPOST
アプリケーション名が表示できるようになってました。
以下実際に表示するまでの流れです。
(1)Twitterアプリケーション登録
ここ→ http://twitter.com/oauth_clients からTwitterにアプリケーション登録を行います。Application Name: 実際に表示するアプリケーション名 Client
Read & Write
にしました。あとは適当に書きました。
ApplicationTypeをBrowserにするとCallBackするURLを書かないといけないですが
今回はWebアプリではないのでCallBackさせることはできないのでClientです。
登録が完了すると
Consumer key と Consumer secret が表示されるので、これを(2)で使います。
(2)OAuthの認証を通す
RubyのOAuthを使用するのでインストールします→Ruby OAuth GEM
sudo gem install oauth
次にConsumer key とConsumer secretを利用してOAuthの認証を通します。
get_access_token.rb
#!/usr/local/bin/ruby流れとしては
require 'rubygems'
gem 'oauth'
require 'oauth/consumer'
consumer_key="(1)で取得したConsumer key"
consumer_secret="(1)で取得したConsumer secret"
# Consumerオブジェクト生成
consumer = OAuth::Consumer.new(consumer_key,consumer_secret ,
{:site=>"http://twitter.com"})
# Request token取得
request_token = consumer.get_request_token(:oauth_callback => "oob")
#authorize url取得
p request_token.authorize_url
# ブラウザでauthorize urlのURLを参照→Allow→PINコード取得
# PINコード入力
key = gets
p key.to_s.chomp!
# Access token取得
access_token=request_token.get_access_token(
:oauth_token => request_token.token,
:oauth_verifier => key.to_s
)
# Access token , Access secret表示
p "access_token_key=#{access_token.token}"
p "access_secret=#{access_token.secret}"
1.Cousumer keyとConsumer secretでConsumerオブジェクトを生成
2.ConsumerオブジェクトでRequest tokenを取得
(:oauth_callback => "oob"の指定でcallbackする必要がないアプリという意味になる)
3.Request tokenからユーザ認証を行うauthorize_urlを取得
4.Webブラウザからauthorize_urlを表示してアクセス許可を与えます。(Allowをクリック)
5.PINコード(7桁の数字?)が表示されるのでコピーします。
6.標準入力からPINコードを入力しEnterします。
7.認証されAccess tokenが発行されるのでAccess tokenとAccess secretをメモります。
Twitterでは有効期間がないようなので、一度取得すると↑の手順をやりなおす必要がありません。
(3)OAuth認証後のTwitterAPIでstatusのPOST
今回はOAuthをサポートしているRuby Twitter gemを利用します。
sudo gem install twitterOAuth認証されたTwitterAPIを利用したPOSTを行うサンプルです。
#!/usr/local/bin/ruby実行結果
#
require 'rubygems'
require 'twitter'
consumer_token_key="(1)で取得したconsumer key"
consumer_secret="(1)で取得したconsumer secret"
access_token_key="(2)で取得したaccess token key"
access_secret="(2)で取得したaccess secret"
oauth = Twitter::OAuth.new(consumer_token_key, consumer_secret)
oauth.authorize_from_access(access_token_key, access_secret)
client = Twitter::Base.new(oauth)
client.update('Twitter Gem')
(1)でApplication Nameに設定したクライアントアプリケーション名を表示することが出来ました。
nil と null
猛暑が続いていますね
さて、小話的な内容になりますが、rubyのnilについて書きます。
rubyでプログラムをするようになって、このnilというのは、最初の頃にちょっと不思議に思っていました。javaにはnullがありますが、nullとは違うのだろうか、、。名前が違うだけなのだろうかなぁ…と思いました。
まあ、nilは大体nullと同じものと考えておけばよいのかも知れません。
しかしながら、nilはオブジェクトであり、rubyのオープンクラスが機能するので、それなりに面白いことが出来るのは良いことだなと思います。
ということで、少し利用方法を考えてみました。次のようなのはどうでしょうか。
たとえば、よくviewのテンプレートなので、日付を文字列で表示するときなど、
<%= person.birthday.strftime("%Y-%m-%d") %>
といったことをしますが、これはbirthdayメソッドがnilを返した場合に、(当然)エラーになってしまいます。
そのため、nilかそうでないかを判断するために、if構文を使うと、たとえば
<%= person.birthday.strftime("%Y-%m-%d") if person.birthday %>
などとなって、ちょっと冗長な感じになります。
もう少しエレガントに書きたい! と考えて以下のようなコードをあらかじめ定義することを考えてみました。
# Spoilクラス
class Spoil
def to_s
""
end
def method_missing(name,*args)
return self
end
end
# Objectのオーバーライド
class Object
def if_exists
if self == nil
return Spoil.new
end
self
end
end
Spoilクラスは、to_s以外は、どのメソッドも自分自身を返すメソッドです。また、Objectクラスに、if_existsメソッドを追加して、もし自分がnilなら、Spoilクラスのオブジェクトを返すようにしました。
これを使うと、先の日付表示は
<%= person.if_exists.strftime("%Y-%m-%d") %>
とかけるようになります。if_existsメソッドは、すべてのオブジェクトに装備されていて、もしnilなら、そこから先はずっとSpoilクラスのオブジェクトになり、何もしないことになるため、メソッドチェーンだけでifのような処理が出来るようになります。
もし少し工夫すれば、else処理なども入れられると思います。
メソッドチェーンだけでゴリゴリ書くのがいいかどうかはともかくとして(Ruby 1.9のtapは良さそうですけど)、わりと面白いのではないかと思いました。
Ruby 1.9とRails 2.3
Rails 2.3が、Ruby 1.9.1対応ということで、少し試してみました。しかし、現状のところ、Ruby 1.9での運用は、まだいくつか問題があるようです。(私の知識不足な点もあると思いますが) 日々進化している分野なので、私が確認した時点からすでに修正が入っているかも知れませんが、自分が試した中で気になった点を書いてみます。環境は、Ubuntu 9.04、Rubyは1.9.1p129です。データベースとしてPostgresを利用しています。
ちなみに、自前のソースコードはUTF-8で書いているので、各ファイル(日本語文字列を使っている部分)の冒頭に
# -*- coding: utf-8 -*-をつけています。I18n対応となり、ソースコードに直接日本語を埋め込むことは少なくなりましたが。
また、Hpricotのto_htmlで取得した文字列は、force_encodingでUTF-8にするようにしています。
hdoc.to_html.force_encoding(Encoding.default_external)こんな感じです。
GEMのインストール
1.Mongrelのインストール失敗。
既知の問題のようです。
http://d.hatena.ne.jp/taigou/20090203/1233588016
を参考にして修正してインストールしました。
(パッケージを作る際に、gem_plugin,daemons,cgi_multipart_eof_fixというGEMも必要でした)
2.RUBY-PG
パッケージ名がruby-pgからpgに変わっていたので、gem install pgでインストールできるのですが、文字コードの対応がされていないため、日本語文字列がバイナリ扱いになってしまい、いろいろ面倒を引き起こします。
http://yugui.jp/articles/828
で作成されているパッチを当ててインストールしました。方法は、ruby-pg-0.8.0のソースコードをrubyforgeから取得して展開。Yugui氏のパッチを取得して、
# patch -p0 < pg-m17n2.patch
gemファイルの作成(Rspecが必要なので、あらかじめgem install rspecでいれておく)
# rake packageこれでpkgディレクトリにパッケージが出来たので、pkgディレクトリに移動して
# gem install pg --local
3.shared-mime-info
MIME判定に使っていたのですが、バージョン 0.1で344行目あたりでエラーになります。ファイルを開くときにバイナリ指定をする必要があるようなので、open命令のところにモード指定で"rb"を付けました。具体的には、もともと
open(file) { |f|
となっていた部分を、
rmode = '1.9'.respond_to?(:force_encoding) ? 'rb' : 'r'としました。(冗長ですね。ただ"rb"とするだけでもいいのですが)
open(file,rmode) { |f|
また255行目あたりのEnumerable::Enumeratorは、1.9ではEnumeratorに変更されたので修正が必要です。私は次のようにしました
if '1.9'.respond_to?(:force_encoding)4.Rails
enum = Enumerator.new(@globs, :each_key)
else
enum = Enumerable::Enumerator.new(@globs, :each_key)
end
Rails 2.3.2も、完全には1.9に対応していないようなので、freezeしてローカルの内容を修正しました。
4-1.テンプレート(erb、rhtml)ファイルの表示で
incompatible character encodings: ASCII-8BIT and UTF-8
が出てしまうため、https://rails.lighthouseapp.com/projects/8994/tickets/1988
を参考にパッチを当てる。
4-2.ファイルアップロード時に
invalid byte sequence in UTF-8
が出てしまうため、
rails/actionpack/lib/action_controller_vendor\rack-1.0/rack/utils.rb
の342行目
c = input.read(bufsize < content_length ? bufsize : content_length)を
c = input.read(bufsize < content_length ? bufsize : content_length).force_encoding("ASCII-8BIT")
に修正する4-3.インテグレーションテストで、コミットした内容の文字コード判定を失敗してしまう
これはまだ試行錯誤している段階ですが、rails/actionpack/lib/action_controller/integration.rbの401行目
あたりから、
elsif Hash === parametersの部分を
return nil if parameters.empty?
parameters.map { |k,v|
requestify(v, name_with_prefix(prefix, k))
}.join("&")
elsif Array === parameters
elsif Hash === parametersとしました。
return nil if parameters.empty?
t = parameters.map { |k,v|
requestify(v, name_with_prefix(prefix, k))
}.join("&")
if '1.9'.respond_to?(:force_encoding)
t.force_encoding(Encoding.default_external)
end
t
elsif Array === parameters
まだ実運用をするためには準備が必要な感じですが、各種GEMが対応して切り替わってしまえば、非常に快適になるのではないかと期待しています。
FF-CMSの事例(レッグ ファッション ハッピー コーディネート)
ついに一般ユーザー向けのサイトでの事例をご紹介できるようになりました。
そのサイトとは
「レッグ ファッション ハッピー コーディネート」
です。
靴下屋でおなじみのTabio様が
「おしゃれは足元から!」とよく言いますが、実際どうしたらよいのか分からない人も多いはず。というメッセージとともに立ち上げたサイトです。
せっかくおしゃれに決めても足元がいまいち決まらないことってよくありますよね。
人気読モが足元まで素敵にコーディネートするポイントを教えてくれます。
読モをマネして、みんなも足元おしゃれ達人になろう!
サイトの内容は
・読者モデルが自分のコーディネートと足元について紹介!(プレスからのコメントもあり)
・一般ユーザーからの投稿も随時サイトに掲載予定
・一般ユーザーの投稿はベスト3をトップページで表示
となっています。
レッグ ファッション ハッピー コーディネートはこちらからどうぞ
今はPC版のみのリリースですが、携帯版も近日リリースする予定です。
もちろんFF-CMSでページを作成しています。
FF-CMSのページはこちらからどうぞ
CMSをフェアへ出展
第3回Web2.0マーケティング フェアへ
FF-CMSと携帯サイト構築ソリューションを出展しました。
フォアフロントとしては初めてこのような大規模なフェアに参加しました。
準備不足でブースの装飾が少なく、殺風景な感じになりましたが、
思ったよりお客様の印象がよくて出展してよかったと思いました。
既に数社様に具体的な提案書を提出していて、ぜひ受注につなげたい!
「携帯サイトの構築を検討している」という声も多く聞けたので、
方向性は間違っていないと確信。弊社ならではのソリューションを展開していきたいです。
Rails 2.3のリリース
Rails 2.0の登場以来、2.1,2.2,2.3と比較的大きな変更が速いペースで行われていて、そのスピード感には驚くばかりです。
今回のRails 2.3は、Ruby 1.9.1への対応が一番大きいようですが、CGI系の仕組みが一新されたことも大きいですね。これまでのプログラムが、そのままで動作するのかどうかやや心配な点でもあります。
そこで、ざっと簡単なテストを行ってみました。I18nへの対応など、2.2からの流れで変更している箇所もあるのですが、意外と(?)、ほとんどそのままで動作するものが多いようです。ただ1つ、ちょっとしたところで動かないのを見つけました。
Rails 2.2では、
<% form_tag( { :action=>'test_receive' } ,
:multipart=>true ) do -%>
<%= file_field( :uploads , 'file' ) %>
<%= submit_tag '送信' %>
<% end -%>
こういうフォームがあった場合、ファイルを添付していない場合でも、コントローラ側では
@file = params[:uploads][:file]を取り出すことが出来ましたが、Rail 2.3ではエラーになります。添付されていない場合は、params[:uploads]がnilになってしまうためです。
もうしばらくは、テストをしてみる必要があるかなと思います。
Postgresのシーケンシャル
そのpostgresなのですが、自動で連番をつけてくれる仕組みにシーケンス(sequence)というものがあります。RoRでもデフォルトではこれを用いてid番号をつけていますね。
普段はあまり意識していないのですが、初期データやマスターデータなどを「入れなおしたい」といったときに、ちょっと困ったことがありました。データテーブルを空にしても、このシーケンスは以前のままなので、
テーブルを空にする(truncate) -> データの入れなおし(insert)を行っても、id番号は以前の続きからになってしまうのです。たとえば、Hogeクラスのシーケンスであるhoges_id_seqを設定するためには、setvalというpostgres命令があるので、これを使うと
# select setval('hoges_id_seq',1);
のようにして、シーケンスのカウント値を自由設定できます。しかし、初期化しようとして上記のように1に設定しても、実際にデータを入れていくと2からカウントされてしまいます。また、だからと言って0に設定することは出来ません。(シーケンスは正の整数に限られているらしく、postgresエラーとなります) それで困っていたわけですが。実は簡単に解決出来ました。
# select setval('hoges_id_seq',1,false);
このように設定することで、カウンタを1にするだけでなく、カウンタの呼び出し前の状態することが出来ます。RoRで書けば、
seqname = Hoge.sequence_nameとなります。(ドライバとしてruby-pgを使っている場合です。postgres-prは未確認ですが、ほぼ同じで動作すると思います)
pg_conn = ActiveRecord::Base.connection.raw_connection
pg_conn.query("select setval('#{seqname}',1,false)")
これでめでたく、もう一度idを振りなおしてくれました。
ちょっとしたことなのですが、知らなかったせいで苦労してしまいました。勉強になってよかったと思います。
携帯対応CMS
やっていたとしてもほとんどがPCの一部分を静的ページで対応しているものが多く、
更新がほとんどないのが実情だと思います。
なぜかというと
・まだ携帯対応の必要性の認識が不足している
・PCと携帯の両方に対応するのは運用が大変
といったところだと思います。
弊社のCMS、FF-CMSを利用することで上記の「PCと携帯の両方に対応するのは運用が大変」
という問題をクリアすることが可能です。
具体的には弊社のお客様テイクアンドギヴ・ニーズ様ではHTMLの知識のまったくないご担当者が
1つのCMSからPC用と携帯用の両方のデータを配信していて、運用コストを相当減らしています。
ブライダルフェア・イベント、パーティーレポートやメディア情報などをPCと携帯に配信しています。
PC:http://www.tgn.co.jp/
携帯:http://mobile.tgn.co.jp/index.xhtml
携帯対応でお悩みの方はぜひご相談ください。
