<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>TechRacho</title>
	<atom:link href="http://techracho.bpsinc.jp/feed" rel="self" type="application/rss+xml" />
	<link>http://techracho.bpsinc.jp</link>
	<description>BPSスタッフがおくるシステム開発プラスαマガジン</description>
	<lastBuildDate>Sat, 25 May 2013 01:38:27 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Arel::Tableを使ってなるべく生のSQLを書かずに済ます方法</title>
		<link>http://techracho.bpsinc.jp/tsunekawa/2013_05_24/8502</link>
		<comments>http://techracho.bpsinc.jp/tsunekawa/2013_05_24/8502#comments</comments>
		<pubDate>Fri, 24 May 2013 13:15:36 +0000</pubDate>
		<dc:creator>tsunekawa</dc:creator>
				<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://techracho.bpsinc.jp/?p=8502</guid>
		<description><![CDATA[Railsでプログラムを書いるとSQLを直接記述する機会が意外と多いので、 なるべくRubyらしく書く方法がないか調べてみました。 ORなどかなり基本的な構文でもarel_tableを使う必要があるのですね。 というわけで、Arel::Table を使ってみました。 動作確認環境は以下の通りです。 ruby: 1.9.3-p392 Rails: 3.2.13 arel: 3.0.2 MySQL: 5.1.65 検索条件をORで繋げたい 基本的な構文ですがSQLを直接記述する場合が多いのではないでしょうか？ User.where("name = ? OR name = ?", "太郎", "花子").to_sql #=&#62; "SELECT `users`.* FROM `users` WHERE (name = '太郎' OR name = '花子')" なるべくRubyで書こうとするとこうなります。 user_table &#8230; <a href="http://techracho.bpsinc.jp/tsunekawa/2013_05_24/8502">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>
Railsでプログラムを書いるとSQLを直接記述する機会が意外と多いので、<br />
なるべくRubyらしく書く方法がないか調べてみました。<br />
ORなどかなり基本的な構文でも<a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-c-arel_table" title="arel_table">arel_table</a>を使う必要があるのですね。<br />
というわけで、Arel::Table を使ってみました。
</p>
<p>動作確認環境は以下の通りです。<br />
ruby: 1.9.3-p392<br />
Rails: 3.2.13<br />
arel: 3.0.2<br />
MySQL: 5.1.65
</p>
<h2 class="article">検索条件をORで繋げたい</h2>
<p>基本的な構文ですがSQLを直接記述する場合が多いのではないでしょうか？</p>
<pre class="brush:ruby">
User.where("name = ? OR name = ?", "太郎", "花子").to_sql


#=&#62; "SELECT `users`.* FROM `users`  WHERE (name = '太郎' OR name = '花子')"
</pre>
<p>なるべくRubyで書こうとするとこうなります。</p>
<pre class="brush:ruby">
user_table = User.arel_table


User.where(user_table&#91;:name&#93;.eq("太郎").or(user_table&#91;:name&#93;.eq("花子"))).to_sql
#=&#62; "SELECT `users`.* FROM `users`  WHERE ((`users`.`name` = '太郎' OR `users`.`name` = '花子'))"
</pre>
<p>ActiveRecordに orメソッドを取り込んで欲しいというリクエストについて<a href="https://github.com/rails/rails/pull/9052" title="Added #or to ActiveRecord::Relation" target="_blank">議論</a>もされているようなので、<br />
今後はもっと簡単に書けるようになるかもしれません。</p>
<h2 class="article">Arel::Tableで使えるメソッド</h2>
<p>サンプルコードに eq というメソッドが出て来ましたが、これは &#8216;=&#8217;(イコール)に変換されます。<br />
他によく使うものでは不等号がありますが、これは以下のメソッドが対応しています。</p>
<pre class="brush:ruby">
user_table = User.arel_table

User.where(user_table&#91;:age&#93;.lt(2)).to_sql
#=&#62; "SELECT `users`.* FROM `users`  WHERE (`users`.`age` &#60; 60)"

User.where(user_table&#91;:age&#93;.gt(2)).to_sql
#=&#62; "SELECT `users`.* FROM `users`  WHERE (`users`.`age` &#62; 20)"
</pre>
<p>&#8216;<=' と '>=&#8217; はそれぞれ</p>
<pre class="brush:ruby">
User.where(user_table&#91;:age&#93;.lteq(60)).to_sql


#=&#62; "SELECT `users`.* FROM `users`  WHERE (`users`.`age` &#60;= 60)"

User.where(user_table&#91;:age&#93;.gteq(20)).to_sql
#=&#62; "SELECT `users`.* FROM `users`  WHERE (`users`.`age` &#62;= 20)"
</pre>
<p>他にもLIMIT OFFSET JOIN 等に独自のメソッドが存在します。<br />
詳しくは<a href="https://github.com/rails/arel#readme" title="rails/arel">GitHubのページ</a>等を参照して下さい。</p>
<h2>サブクエリを使う</h2>
<p>Arel::Tableを利用すれば、サブクエリを使ったSQLを生成することができます。<br />
以下はホワイトリストにまだ登録されていないユーザーを選択する場合を例にしたサンプルです。</p>
<p>ActiveRecord単体ではこのように書いていました。</p>
<pre class="brush:ruby">
white_listed_users = WhiteList.group(:user_id).pluck(:user_id)
#=&#62; &#91;1, 2, 3&#93;

User.where("id NOT IN (?)", white_listed_users).to_sql
#=&#62; "SELECT `users`.* FROM `users`  WHERE (id NOT IN (1,2,3))" 
</pre>
<p>Arel::Tableでサブクエリを利用した場合は以下のようになります。</p>
<pre class="brush:ruby">
user_table = User.arel_table
white_list_table = WhiteList.arel_table

User.where(user_table&#91;:id&#93;.not_in(white_list_table.project(:user_id) ) ).to_sql

#=&#62; "SELECT `users`.* FROM `users`  WHERE (`users`.`id` NOT IN (SELECT user_id FROM `white_lists` ))"
</pre>
<p>
ActiveRecord単体で生成する場合は2度クエリを発行していますが、サブクエリをつかえば一度発行するだけで済みます。<br />
単純なクエリでは影響は少ないかもしれませんが、複雑なテーブル構成のデータの場合はパフォーマンスの向上が見込める場合もあるのでは無いでしょうか。</p>
<h2 class="article">Arel::Table を使うメリット</h2>
<h3 class="article">コードの見た目がスッキリする</h3>
<p>コード内でSQLを記述した場合</p>
<pre class="brush:ruby">
  @admin = &#91;true, false&#93;&#91;rand(2)&#93;
  sql = &#60;&#60;-ENDSQL
    SELECT *
    FROM users
    WHERE
    #{ 'id IS NOT NULL' if @admin  }
    #{ '(id NOT IN (SELECT user_id FROM white_lists))' unless @admin }
  ENDSQL
</pre>
<p>
この例は短いですが、複雑なqueryではかなりの行をSQLの記述が占めてしまうのではないでしょうか。<br />
また、パラメータによってqueryを書き換えたい場合 #{} を多用してしまうと見にくくなってしまいます。
</p>
<h3 class="article">スコープやクラスメソッドとして定義して再利用できる</h3>
<p>
query生成をメソッドに切りだすことで、Controller等から呼び出すことができるので<br />
似たような検索を何度も行う場合はDRYに書くことができます。
</p>
<pre class="brush:ruby">
class WhiteList &#60; ActiveRecord::Base
  ...
  def self.whitelisted_users
    white_list_table.project(arel_table&#91;:user_id&#93;)
  end
end

class SampleController &#60; ApplicationController
  def show
    user_table = User.arel_table
    @users = User.where(user_table&#91;:id&#93;.not_in(WhiteList.whitelisted_users))
  end
end
</pre>
<p>
Railsで検索を行うと検索結果が ActiveRecord::Relation のオブジェクトとして取得されます。<br />
ActiveRecord::Relation には高機能なメソッドがいろいろ定義されていますが、query生成については<br />
ActiveRecord::Relation#where_values が便利です。
</p>
<p>
このメソッドを使うとWHERE句をArelのオブジェクトとして取得できるので、<br />
複数のscopeをAND やOR で連結したり<br />
検索条件を追加したりといったことができるようになります。
</p>
<pre class="brush:ruby">
class User &#60; ActiveRecord::Base
  scope :teenage, where(arel_table&#91;:age&#93;.gteq(13).and(arel_table&#91;:age&#93;.lteq(19)))
  scope :senior, where(arel_table&#91;:age&#93;.gt(60))
end

class SampleController &#60; ApplicationController
  def show
    # 13歳から19歳の間もしくは61歳以上
    teen_or_senior = User.teenage.senior.where_values.inject(:or)
    @teen_or_senior = User.where(teen_or_senior)
    @teen_or_senior.to_sql
    #=&#62; "SELECT `users`.* FROM `users`  WHERE ((`users`.`age` &#62;= 13 AND `users`.`age` &#60;= 19 OR `users`.`age` &#62; 60))"

    # 60歳も含むという条件を後から追加
    senior = User.senior.where_values.first
    @senior = User.where(senior.or(User.arel_table&#91;:age&#93;.eq(60)))
    @senior.to_sql
    #=&#62; "SELECT `users`.* FROM `users`  WHERE ((`users`.`age` &#60; 60 OR `users`.`age` = 60))"
  end
end
</pre>
<p>
成人 未成年 男性 女性 etc&#8230; よく使う検索条件をscopeとして定義しておいて、<br />
複数のscopeを組み合わせて複雑なqueryを作り上げるという使い方ができそうですね。
</p>
<h3 class="article">RDBMSが変わっても同じように使える</h3>
<p>
PostgreSQL 9.2.2で動作を確認しました。
</p>
<p>
MySQLと PostgreSQL ではboolean型のデータが違ったり<br />
ORDER BY句でランダムに並べ替える際に使う関数名が違ったりと、<br />
RDBMSによって動くqueryと動かないqueryがあるため、<br />
生のSQLを使っているとサーバ移転等で環境が変わった際にソースコードの修正が必要になる場合があります。<br />
しかし、Arelを適切に使っていればそういった変更が不要になるかもしれません。
</p>
<h2 class="article">Rails4でも動きます</h2>
<p>
そろそろRails4の正式版がリリースされますね。<br />
せっかくなので、Ruby2.0 Rails4 の環境で動作するか確認してみました。</p>
<p>動作確認環境<br />
ruby: 2.0.0p195<br />
Rails: 4.0.0.rc1<br />
arel: 4.0.0<br />
MySQL: 5.1.65</p>
<p>例に上げたような単純なqueryであれば問題なく動作するようです。<br />
scopeを利用した場合の例だけは少し問題があります。<br />
そのままでも動作はするのですが、DEPRECATION WARNING が出てしまいます。<br />
scopeの書き方が変わったようなので、指示の通りに書き換えます。
</p>
<pre class="brush:ruby">
# DEPRECATION WARNING: Using #scope without passing a callable object is deprecated. For example `scope :red, where(color: 'red')` should be changed to `scope :red, -&#62; { where(color: 'red') }`. There are numerous gotchas in the former usage and it makes the implementation more complicated and buggy. (If you prefer, you can just define a class method named `self.red`.).

class User &#60; ActiveRecord::Base
  scope :teenage, -&#62; { where(arel_table&#91;:age&#93;.gteq(13).and(arel_table&#91;:age&#93;.lteq(19))) }
  scope :senior, -&#62; { where(arel_table&#91;:age&#93;.gt(60)) }
end
</pre>
<p>
これで警告も出なくなるはずです。<br />
以上、簡単な例でしたがArelの使い方をまとめてみました。</p>
<p>便利なのでどんどん使いましょうとは言い難いですが、Arelのメソッドはなんだかかっこいいですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://techracho.bpsinc.jp/tsunekawa/2013_05_24/8502/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Googleさんから読み取るPHPとRails開発の比較</title>
		<link>http://techracho.bpsinc.jp/morimorihoge/2013_05_23/8576</link>
		<comments>http://techracho.bpsinc.jp/morimorihoge/2013_05_23/8576#comments</comments>
		<pubDate>Thu, 23 May 2013 11:26:35 +0000</pubDate>
		<dc:creator>morimorihoge</dc:creator>
				<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[システム開発]]></category>

		<guid isPermaLink="false">http://techracho.bpsinc.jp/?p=8576</guid>
		<description><![CDATA[渡辺さんがPHPとRubyを徹底比較！開発効率をあげて収益を増やすという記事を出していたので，反応してみます． この記事は，PHPとRails開発について，PHPはメジャーでRailsは開発者が少ないとは言うけど，証拠はあるのかよ！とか具体的にどれくらいの開発者数の差があるの？という質問にデータを用いて答えてみます． PHPとRails開発の得意分野やメリット・デメリットについては前述の記事に良くまとまっていますので，そちらを参照すると良いです． 情報ソースについて 今回の比較にはGoogle検索のヒット数，及びGoogleトレンドを利用しました．Google検索は今までの蓄積された情報の累計，Googleトレンドは今流行っているかどうか（勢いがあるか）という指標としてある程度の信頼性があるのではないかと思います． 「ヒット数==開発者の数」というのは多少乱暴ですが，それなりの指標にはなるのではないかと思います． PHP v.s. Rails では，PHPとRailsを比較してみましょう．まずは「〜〜開発」「〜〜 development」で調べてみました． Google検索 - &#8220;PHP開発&#8221;: 41,500,000 - &#8220;Rails開発&#8221;: 6,730,000 - &#8220;PHP development&#8221;: 279,000,000 - &#8220;Rails development&#8221;: 62,500,000 Googleトレンド 日本語 英語 ・・・うーん，Railsさんが息をしていないようです．PHP v.s. Railsの結果はどう見てもPHPの圧勝と言えるでしょう．Google検索で4〜7倍，Googleトレンドでもやはり7倍程度の情報量の差があるようです． Googleトレンドから読み取れる他の情報としては，PHPはインドの情報が多いのに対し，Railsはアメリカとインドの情報が多い様です． これは僕の主観になりますが，実際PHPとRailsという軸で見てみると，国内・海外問わずPHPの案件やサイトの方が多いです．有名どころではFacebookのような超大規模サイトでもPHPは採用されており，まだまだ一線で使える現役言語であることが分かります． だがしかし しかし，ちょっと待って下さい．PHPはプログラミング言語，RailsはWebアプリケーションフレームワークです．種類の違う二つのものを比べるのはフェアじゃないですね． 軸を合わせるために，PHPのWebアプリケーションフレームワークとRailsで比較してみましょう． PHPフレームワーク v.s. Rails &#8230; <a href="http://techracho.bpsinc.jp/morimorihoge/2013_05_23/8576">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://techracho.bpsinc.jp/author/piichan1031">渡辺さん</a>が<a href="http://techracho.bpsinc.jp/piichan1031/2013_05_13/8578">PHPとRubyを徹底比較！開発効率をあげて収益を増やす</a>という記事を出していたので，反応してみます．</p>
<p>この記事は，PHPとRails開発について，PHPはメジャーでRailsは開発者が少ないとは言うけど，証拠はあるのかよ！とか具体的にどれくらいの開発者数の差があるの？という質問にデータを用いて答えてみます．<br />
PHPとRails開発の得意分野やメリット・デメリットについては<a href="http://techracho.bpsinc.jp/piichan1031/2013_05_13/8578">前述の記事</a>に良くまとまっていますので，そちらを参照すると良いです．</p>
<h3 class="article">情報ソースについて</h3>
<p>今回の比較にはGoogle検索のヒット数，及び<a href="http://www.google.co.jp/trends/">Googleトレンド</a>を利用しました．Google検索は今までの蓄積された情報の累計，Googleトレンドは今流行っているかどうか（勢いがあるか）という指標としてある程度の信頼性があるのではないかと思います．<br />
「ヒット数==開発者の数」というのは多少乱暴ですが，それなりの指標にはなるのではないかと思います．</p>
<h3 class="article">PHP v.s. Rails</h3>
<p>では，PHPとRailsを比較してみましょう．まずは「〜〜開発」「〜〜 development」で調べてみました．</p>
<h4 class="article">Google検索</h4>
<p>- &#8220;PHP開発&#8221;: 41,500,000<br />
- &#8220;Rails開発&#8221;: 6,730,000</p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-23-at-18.25.20.png"><img class="aligncenter size-full wp-image-8759" alt="Screen Shot 2013-05-23 at 18.25.20" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-23-at-18.25.20.png" width="357" height="211" /></a></p>
<p>- &#8220;PHP development&#8221;: 279,000,000<br />
- &#8220;Rails development&#8221;: 62,500,000<br />
<a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-23-at-18.18.31.png"><img class="aligncenter size-full wp-image-8760" alt="Screen Shot 2013-05-23 at 18.18.31" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-23-at-18.18.31.png" width="356" height="212" /></a></p>
<h4 class="article">Googleトレンド</h4>
<p>日本語<br />
<script type="text/javascript" src="//www.google.co.jp/trends/embed.js?hl=ja&amp;q=PHP%E9%96%8B%E7%99%BA,++Rails%E9%96%8B%E7%99%BA&amp;cmpt=q&amp;content=1&amp;cid=TIMESERIES_GRAPH_AVERAGES_CHART&amp;export=5&amp;w=600&amp;h=330"></script><br />
英語<br />
<script type="text/javascript" src="//www.google.co.jp/trends/embed.js?hl=ja&amp;q=%22PHP+development%22,++%22Rails+development%22&amp;cmpt=q&amp;content=1&amp;cid=TIMESERIES_GRAPH_AVERAGES_CHART&amp;export=5&amp;w=600&amp;h=330"></script></p>
<p>・・・うーん，Railsさんが息をしていないようです．PHP v.s. Railsの結果はどう見てもPHPの圧勝と言えるでしょう．Google検索で4〜7倍，Googleトレンドでもやはり7倍程度の情報量の差があるようです．<br />
Googleトレンドから読み取れる他の情報としては，PHPはインドの情報が多いのに対し，Railsはアメリカとインドの情報が多い様です．</p>
<p>これは僕の主観になりますが，実際PHPとRailsという軸で見てみると，国内・海外問わずPHPの案件やサイトの方が多いです．有名どころではFacebookのような超大規模サイトでもPHPは採用されており，まだまだ一線で使える現役言語であることが分かります．</p>
<h4 class="article">だがしかし</h4>
<p>しかし，ちょっと待って下さい．PHPはプログラミング言語，RailsはWebアプリケーションフレームワークです．種類の違う二つのものを比べるのはフェアじゃないですね．<br />
軸を合わせるために，PHPのWebアプリケーションフレームワークとRailsで比較してみましょう．</p>
<h3 class="article">PHPフレームワーク v.s. Rails</h3>
<p>ここでは，3大メジャーPHPフレームワークの<a href="http://symfony.com/">Symfony</a>，<a href="http://framework.zend.com/">Zend Framework</a>，<a href="http://cakephp.org/">CakePHP</a>とRailsを比較してみます．</p>
<h4 class="article">Google検索</h4>
<p>- &#8220;Symfony&#8221;: 7,060,000<br />
- &#8220;Zend Framework&#8221;: 5,430,000<br />
- &#8220;CakePHP&#8221;: 6,470,000<br />
- 上記3フレームワークの合計: 18,960,000<br />
- &#8220;Rails&#8221;: 93,400,000</p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-23-at-19.33.24.png"><img class="aligncenter size-full wp-image-8769" alt="Screen Shot 2013-05-23 at 19.33.24" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-23-at-19.33.24.png" width="699" height="355" /></a></p>
<h4 class="article">Googleトレンド</h4>
<p><script type="text/javascript" src="//www.google.co.jp/trends/embed.js?hl=ja&#038;q=%22Symfony%22,+%22Zend+Framework%22,+%22CakePHP%22,+%22Rails%22&#038;cmpt=q&#038;content=1&#038;cid=TIMESERIES_GRAPH_AVERAGES_CHART&#038;export=5&#038;w=600&#038;h=330"></script></p>
<p>・・・いかがでしょうか？先ほどとは打って変わってPHPフレームワーク涙目のRails圧勝の結果となりました．<br />
Google検索では個別フレームワークで見て13倍以上，PHPの3フレームワークの合計と比較しても5倍以上の開きがあります．また，Googleトレンドでも9倍程度の開きがあることが見て取れます．</p>
<h3 class="article">考察など</h3>
<p>これらの結果をまとめると，PHPでの開発Railsの開発ではPHPが圧倒的に多い一方，フレームワークを使うという条件を付けた場合においてはこの順位が逆転するということがわかりました．<br />
ここで気になるのは，PHP開発におけるフレームワーク利用率です．世の中のPHPプログラムのうち，どの程度の割合がフレームワークを使った開発をしているのでしょうか？</p>
<p>PHP : Rails = 7 : 1<br />
PHPフレームワーク : Rails = 1 : 5</p>
<p>という結果から，単純に計算すると，</p>
<p><span style="color: #ff0000;"><strong>PHP : Rails : PHPフレームワーク = 35 : 5 : 1</strong></span></p>
<p>という計算結果が導き出せます．<br />
つまり，<span style="color: #ff0000;"><strong>世の中のPHPプログラムのうち，フレームワークを使った開発は1/35程度</strong></span>という仮説が導き出せるわけですね．<br />
もしこれが単純に開発者数と比例すると仮定した場合，<strong>PHPプログラマの中でフレームワークを扱えるエンジニアは35人に一人</strong>ということになります．<br />
一般的な小中規模Web開発でプログラマを35人も雇うことは無いので，なかなか厳しい割合といえます．また，上記の割合は3種類のフレームワークの合計と比較しているので，実際に任意のPHPプログラマ集合から同じフレームワークを使っている人を見つけるには，さらに難易度が高いことになるわけですね．</p>
<p>一方，RailsプログラマはRails自体がフレームワークなので，全員フレームワークを扱えます．Railsは比較的規約の厳しいフレームワークのため，Railsの規約にさえ従っていればある程度のコードの質は自動的に担保されます．<br />
また，Railsエンジニアは，上記の式からPHPフレームワークの使えるPHPエンジニアの5倍の人数がいると考えられますので，フレームワークを使った開発が必要な場合はPHPよりRailsの方が開発に向いているのではないか，という結論になります．</p>
<h3 class="article">終わりに</h3>
<p>今回使ったGoogle検索とGoogleトレンドを使った比較は相当乱暴な方法ですが，PHPの世界で未だにフレームワークを使った開発がメジャーではないということを証明することはできたと思います．<br />
スクリプトベタ書きによるプログラミングは敷居が低く，小さいコードならコピペが容易ですが，後々システムが大きくなればなるほど負の遺産としてシステムにのし掛かってきます．</p>
<p><a href="http://techracho.bpsinc.jp/piichan1031/2013_05_13/8578">こちらの記事</a>にあるように，フレームワークを使うのに適した開発を行う場合は，PHPにこだわらずRailsを採用するのを考えてみるのも良いのではないでしょうか．</p>
<p>僕はPHPフレームワークの世界からRailsに移行した身として両方の世界を知っていますが，今のRails開発は一度経験するともうPHPには戻れない位の勢いをひしひしと感じます．これからきっちりとしたWeb開発を勉強する人は，Railsを検討してみるのも良いと思いますよ．</p>
<h3 class="article">おまけ</h3>
<p>社内で見せたら「PHP v.s. Rubyはないのか？」と言われたので測ってみました．<br />
※計測した時期が異なるので上記と結果が多少違います．</p>
<h4 class="article">Google検索</h4>
<p>日本語<br />
- &#8220;PHP開発&#8221;: 36,400,000<br />
- &#8220;Ruby開発&#8221;: 18,700,000<br />
<a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-23-at-20.16.44.png"><img src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-23-at-20.16.44.png" alt="Screen Shot 2013-05-23 at 20.16.44" width="401" height="210" class="aligncenter size-full wp-image-8785" /></a></p>
<p>英語<br />
- &#8220;PHP development&#8221;: 257,000,000<br />
- &#8220;Ruby development&#8221;: 109,000,000<br />
<a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-23-at-21.15.02.png"><img src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-23-at-21.15.02.png" alt="Screen Shot 2013-05-23 at 21.15.02" width="357" height="212" class="aligncenter size-full wp-image-8793" /></a></p>
<h4 class="article">Googleトレンド</h4>
<p>日本語<br />
<script type="text/javascript" src="//www.google.co.jp/trends/embed.js?hl=ja&#038;q=%22PHP%E9%96%8B%E7%99%BA%22,+%22Ruby%E9%96%8B%E7%99%BA%22&#038;cmpt=q&#038;content=1&#038;cid=TIMESERIES_GRAPH_AVERAGES_CHART&#038;export=5&#038;w=600&#038;h=330"></script></p>
<p>英語<br />
<script type="text/javascript" src="//www.google.co.jp/trends/embed.js?hl=ja&#038;q=%22PHP+development%22,++%22Ruby+development%22&#038;cmpt=q&#038;content=1&#038;cid=TIMESERIES_GRAPH_AVERAGES_CHART&#038;export=5&#038;w=600&#038;h=330"></script></p>
<p>というわけで，言語レベルで見るとGoogle検索では国内で約2倍，英語圏で2.5倍の開きがあるようです．日本の方が言語自体の普及度が高いのは，日本製ということもあるんでしょうね．<br />
Googleトレンドでみると，海外では7倍近くの開きがあり，PHPにはやはり遠く及ばないですね．</p>
<p>Rubyでプログラミングするのは楽しいので，もっと普及するといいな．</p>
]]></content:encoded>
			<wfw:commentRss>http://techracho.bpsinc.jp/morimorihoge/2013_05_23/8576/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Excel で楽にSQL やseed を管理する方法</title>
		<link>http://techracho.bpsinc.jp/shibuya/2013_05_23/8563</link>
		<comments>http://techracho.bpsinc.jp/shibuya/2013_05_23/8563#comments</comments>
		<pubDate>Thu, 23 May 2013 06:55:39 +0000</pubDate>
		<dc:creator>shibuso</dc:creator>
				<category><![CDATA[Web開発]]></category>
		<category><![CDATA[DB]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://techracho.bpsinc.jp/?p=8563</guid>
		<description><![CDATA[Rails + PostgreSQL の組み合わせが多いなと最近感じているshibuso です。Heroku もこの組み合わせですしRails 界隈では流行りなのでしょうか、個人的にはMySQL の方が長く触れてきたので好きなのですが。とは言えどちらもSQL です。今回はExcel を用いてテストデータがいくつか必要になった時にSQL を手軽に生成したり、管理する方法を紹介したいと思います。 この記事を読んで幸せになれそうなのは、プログラマ及びデータベースでデータを管理している方（ソーシャルゲームでのプランナーに当たるような方）です。ただしこれを読むにあたって、最低限のSQL を書ける知識が必要になります。SQL を書けない方は学習するか書ける方に手伝ってもらいつつ進めると、きっとそのうち書けるようになります、いつか、多分。それに加えて少しだけExcel を理解している必要があります。 実用例 いきなり「テストデータを作る」「データを管理する」と言われてもなかなか想像できないと思うので、欲しいデータとSQL の例を先に出します。 例1. 一貫性があるデータを大量に作る テストをする際に、殆ど同じデータで構わないものの、見分けを付けたいために少し違うデータを用意したい場合があったりします。例えばメールを送るテストがあるとして、gmailを使えば「ユーザ名+適当な文字列@gmail.com」みたいなフォーマットで送信可能です。この「適当な文字列」の部分を楽に用意することができます。 sample+1 sample+2 sample+3 あるいはゲームで言えば「モンスター1」「モンスター2」のように、とりあえず見分けを付けたい場合があります。 モンスター1 モンスター2 モンスター3 そんな時のSQL 文は以下のようになります。（テーブルのCREATE 文は適当にご用意下さい） -- SQL -- 送信しないようにわざと「@gmail」としています -- しかしRails + Devise のような環境ですとvalidate &#8230; <a href="http://techracho.bpsinc.jp/shibuya/2013_05_23/8563">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Rails + PostgreSQL の組み合わせが多いなと最近感じているshibuso です。Heroku もこの組み合わせですしRails 界隈では流行りなのでしょうか、個人的にはMySQL の方が長く触れてきたので好きなのですが。とは言えどちらもSQL です。今回はExcel を用いてテストデータがいくつか必要になった時にSQL を手軽に生成したり、管理する方法を紹介したいと思います。</p>
<p>この記事を読んで幸せになれそうなのは、プログラマ及びデータベースでデータを管理している方（ソーシャルゲームでのプランナーに当たるような方）です。ただしこれを読むにあたって、最低限のSQL を書ける知識が必要になります。SQL を書けない方は学習するか書ける方に手伝ってもらいつつ進めると、きっとそのうち書けるようになります、いつか、多分。それに加えて少しだけExcel を理解している必要があります。</p>
<h2 class="article">実用例</h2>
<p>いきなり「テストデータを作る」「データを管理する」と言われてもなかなか想像できないと思うので、欲しいデータとSQL の例を先に出します。</p>
<h3 class="article">例1. 一貫性があるデータを大量に作る</h3>
<p>テストをする際に、殆ど同じデータで構わないものの、見分けを付けたいために少し違うデータを用意したい場合があったりします。例えばメールを送るテストがあるとして、gmailを使えば「ユーザ名+適当な文字列@gmail.com」みたいなフォーマットで送信可能です。この「適当な文字列」の部分を楽に用意することができます。</p>
<table style="border:none;">
<tr>
<td style="border:none;">
<a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/excel_sql_shibuso.png"><img class="alignleft size-full wp-image-8713" alt="excel_sql_shibuso" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/excel_sql_shibuso.png" width="60" height="60" /></a>
    </td>
<td style="border:none;">
<a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/excel_sql_shibuso.png"><img class="alignleft size-full wp-image-8713" alt="excel_sql_shibuso" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/excel_sql_shibuso.png" width="60" height="60" /></a>
    </td>
<td style="border:none;">
<a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/excel_sql_shibuso.png"><img class="alignleft size-full wp-image-8713" alt="excel_sql_shibuso" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/excel_sql_shibuso.png" width="60" height="60" /></a>
    </td>
</tr>
<tr>
<td style="border:none;">sample+1</td>
<td style="border:none;">sample+2</td>
<td style="border:none;">sample+3</td>
</tr>
</table>
<p>あるいはゲームで言えば「モンスター1」「モンスター2」のように、とりあえず見分けを付けたい場合があります。</p>
<table style="border:none;">
<tr>
<td style="border:none;">
<a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/excel_sql_monster.png"><img class="alignleft size-full wp-image-8714" alt="excel_sql_monster" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/excel_sql_monster.png" width="60" height="60" /></a>
    </td>
<td style="border:none;">
<a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/excel_sql_monster.png"><img class="alignleft size-full wp-image-8714" alt="excel_sql_monster" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/excel_sql_monster.png" width="60" height="60" /></a>
    </td>
<td style="border:none;">
<a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/excel_sql_monster.png"><img class="alignleft size-full wp-image-8714" alt="excel_sql_monster" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/excel_sql_monster.png" width="60" height="60" /></a>
    </td>
</tr>
<tr>
<td style="border:none;">モンスター1</td>
<td style="border:none;">モンスター2</td>
<td style="border:none;">モンスター3</td>
</tr>
</table>
<p>そんな時のSQL 文は以下のようになります。（テーブルのCREATE 文は適当にご用意下さい）</p>
<pre class="brush:sql;toolbar:false;">-- SQL
-- 送信しないようにわざと「@gmail」としています
-- しかしRails + Devise のような環境ですとvalidate に失敗するのでご注意下さい
INSERT INTO users (id, email) VALUES (1, 'sample+1@gmail');
INSERT INTO users (id, email) VALUES (2, 'sample+2@gmail');
INSERT INTO users (id, email) VALUES (3, 'sample+3@gmail');

INSERT INTO monsters (id, name) VALUES (1, 'モンスター1');
INSERT INTO monsters (id, name) VALUES (2, 'モンスター2');
INSERT INTO monsters (id, name) VALUES (3, 'モンスター3');</pre>
<h3 class="article">例2. マスターデータを管理する</h3>
<p>運用側が用意し必要がある時以外は更新を行わない、いわゆるマスターデータを管理する事も多々あると思います。</p>
<p>例えば全都道府県の名前は、私がこれまで生きてきた中で変更はありませんでした。しかし例えば「大阪府」が「大阪都」になるかもしれません。こういう情報の管理も楽に行えます。</p>
<p>SQL 文は以下のようなものを想定しています。</p>
<pre class="brush:sql;toolbar:false;">-- SQL
INSERT INTO prefectures (id, name) VALUS (1, '北海道');
INSERT INTO prefectures (id, name) VALUS (2, '青森県');
INSERT INTO prefectures (id, name) VALUS (3, '岩手県');

UPDATE prefectures SET name = '北海道' WHERE id = 1;
UPDATE prefectures SET name = '青森県' WHERE id = 2;
UPDATE prefectures SET name = '岩手県' WHERE id = 3;</pre>
<h2 class="article">実現方法</h2>
<p>勘がいい人はもうここまでで実現方法が想像できているかもしれませんね。カラム名、値をそれぞれ決まったセルに入力し、最後にそれらをまとめてSQL を書き出す式を作ればいいのです。</p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/excel_sql_excel1.png"><img class="alignleft size-full wp-image-8715" alt="excel_sql_excel1" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/excel_sql_excel1.png" /></a></p>
<p>上の画像は一番最初に挙げた例を実際にExcel で管理してみたものです。「=」で書き始めるとそれが式だと判断されますが、その後に「&#8221;」を付けることで文字列として扱ってくれます。これと途中途中に参照式を組み合わせることにより、SQL 文を作り出すことが可能です。書いた式は以下のとおりです。</p>
<pre class="brush:vb;toolbar:false;">
="INSERT INTO "&amp;$B$1&amp;" ("&amp;$B$2&amp;", "&amp;$C$2&amp;") VALUES ("&amp;B3&amp;", '"&amp;C3&amp;"');"
</pre>
<p>注意すべき点としては</p>
<ul>
<li>テーブル名やカラム名は絶対参照にする</li>
<li>カラムが文字列を扱う場合は「&#8217;」を前後にはさむ</li>
<li>NULL やNOW() 等SQL 文に直接書きたいものはセルを参照せずにそのまま書き込んでしまうのも手</li>
</ul>
<p>ぐらいでしょうか。上記の例ではINSERT 文を書きましたが、UPDATE 文にする場合は式の形が変わるものの、基本的にやることは同じです。</p>
<p>Excel を利用する利点としては、コピペが簡単にできることと、値を少しずつ増やすことが容易な点です。上記の図でのB4 は、普通に「2」と書いても良いですが、「=B3+1」と式を書くことも可能です。そしてそれを下にコピーしていくとどんどん数字が増えていきます。正に手間いらず。</p>
<p>式を書かなくても、セルの右下を引っ張ってオートフィル機能を使うのも便利です。C3 に当たる「sample+1@gmail」を書けば、その後は「sample+2@gmail」「sample+3@gmail」…と好きなだけ書けます。テストデータを大量に用意するのはもちろん、マスターデータを作る時にも活用できます。</p>
<h2 class="article">おまけ1：seed を生成する</h2>
<p>無理矢理感が少しありますが、書き換えればRails で利用するseed も書き出せます。例えば都道府県のデータを作ろうとします。</p>
<pre class="brush:ruby;"># seed
# 冪等を意識して書いています
prefecture_data = &#91;
  { id: 1, name: '北海道' },
  { id: 2, name: '青森県' },
  { id: 3, name: '岩手県' },
# あとは略
&#93;

prefecture_data.each do |d|
  next if Prefecture.find_by_id(d&#91;:id&#93;).present?
  h = Prefecture.new
  d.each do |k, v|
    h.send("#{k}=", v)
  end
  h.save!
end</pre>
<p>このようなものが必要になった時に、「{ id: 1, name: &#8216;北海道&#8217; },」の部分を書き出すように、先程の要領で書き換えればいいのです。</p>
<p>マスターデータはもちろんSQL を流すことで対応可能ですが、seed を用いることのメリットとしてはRails のvalidate を通すことができるということがあります。validate を通すことでデータに不整合があった場合に気づくことが可能です。システムが意図していない値でもSQL 上問題ない場合があります。例えば最初に紹介したメールアドレスの例もSQL としては問題がありませんが、システムとしておかしいです。validate が通らないということで気づくことが可能です。</p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/excel_sql_excel2.png"><img class="alignleft size-full wp-image-8716" alt="excel_sql_excel2" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/excel_sql_excel2.png" width="595" height="174" /></a></p>
<h2 class="article">おまけ2：複数のテーブルと連携する</h2>
<p>例えば1 シートに1 テーブルという管理方法をとれば、複数のテーブルを1 ファイルで管理することが可能です。また、別シートも参照することが可能なので、関連するテーブルの値を参照することも可能です。これにより関連テーブルを簡単に再現することが可能です。</p>
<div style="text-align:right;">
一部画像: <a href="http://neutralx0.net/tool/bnmk.html" target="_blank">化け猫アイコンメーカー</a>
</div>
]]></content:encoded>
			<wfw:commentRss>http://techracho.bpsinc.jp/shibuya/2013_05_23/8563/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RubyでExcelデータをJSON形式に変換するには</title>
		<link>http://techracho.bpsinc.jp/morimorihoge/2013_05_16/8664</link>
		<comments>http://techracho.bpsinc.jp/morimorihoge/2013_05_16/8664#comments</comments>
		<pubDate>Thu, 16 May 2013 13:06:29 +0000</pubDate>
		<dc:creator>morimorihoge</dc:creator>
				<category><![CDATA[ITライフ]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://techracho.bpsinc.jp/?p=8664</guid>
		<description><![CDATA[Excelで作った表データをJavaScriptであれこれしたい時に，ExcelデータをJSONに変換したいことがあったので，さっくり書いてみました．特徴としては，セル内改行があっても正しくデータが取れるので，CSVやTSVに比べるとデータに自由が効く点があります．HTMLを入れてみたり，JavaScriptを入れて読み込み側でeval()してみたりと色々応用が利くと思います． 動作環境はRuby 1.9.3，ActiveSupport 3.2.13，roo 1.11.2です．Mac環境でのみ確認しています．案の定ご利用は自己責任でお願いします． まず，以下のgemをインストールします． $ gem install active_support roo その後，以下のコードをexcel2json.rbとして保存します．Excelデータのファイル名は直して使って下さい． # encoding: utf-8 # # excel2json.rb: Excel -&#62; JSON変換を行う # # usage: $ ruby excel2json.rb # # description: # 　SOURCE_FILEに変換したいExcelファイル名を設定して実行することでJSONデータを標準出力に表示する # 変換するファイル名 SOURCE_FILE = "SOURCE_EXCEL.xlsx" # Ruby 1.8系の場合はrubygemsをrequireする必要がある &#8230; <a href="http://techracho.bpsinc.jp/morimorihoge/2013_05_16/8664">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Excelで作った表データをJavaScriptであれこれしたい時に，ExcelデータをJSONに変換したいことがあったので，さっくり書いてみました．特徴としては，<strong><span style="color: #ff0000;">セル内改行があっても正しくデータが取れる</span></strong>ので，CSVやTSVに比べるとデータに自由が効く点があります．HTMLを入れてみたり，JavaScriptを入れて読み込み側でeval()してみたりと色々応用が利くと思います．</p>
<p>動作環境はRuby 1.9.3，ActiveSupport 3.2.13，<a href="https://github.com/hmcgowan/roo">roo</a> 1.11.2です．Mac環境でのみ確認しています．案の定ご利用は自己責任でお願いします．</p>
<p>まず，以下のgemをインストールします．</p>
<pre class="brush: bash">$ gem install active_support roo</pre>
<p>その後，以下のコードをexcel2json.rbとして保存します．Excelデータのファイル名は直して使って下さい．</p>
<pre class="brush: ruby"># encoding: utf-8
# 
# excel2json.rb: Excel -&#62; JSON変換を行う
# 
# usage:  $ ruby excel2json.rb
# 
# description:
# 　SOURCE_FILEに変換したいExcelファイル名を設定して実行することでJSONデータを標準出力に表示する

# 変換するファイル名
SOURCE_FILE = "SOURCE_EXCEL.xlsx"

# Ruby 1.8系の場合はrubygemsをrequireする必要がある
# require 'rubygems'
require 'active_support/all'
require 'roo'

# xlsxではなくxlsファイルを使う時はExcelx -&#62; Excelに変更する
doc = Roo::Excelx.new(SOURCE_FILE)
# 1枚目のシートを使う
doc.default_sheet = doc.sheets.first

# 1行目をヘッダ行として列数をカウントする．ヘッダ名をJSONのhash keyにするので空文字はスキップされる
headers = {}
(doc.first_column..doc.last_column).each do |col|
  headers&#91;col&#93; = doc.cell(doc.first_row, col)
end

hash = {}
hash&#91;:data&#93; = &#91;&#93;
((doc.first_row + 1)..doc.last_row).each do |row|
  row_data = {}
  headers.keys.each do |col|
    value = doc.cell(row, col)
    # rooは整数値もfloatとして返すので，整数値なら整数に変換する（必要なければコメントアウトして良い）
    value = value.to_i if doc.celltype(row, col) == :float &amp;&amp; value.modulo(1) == 0.0
    row_data&#91;headers&#91;col&#93;&#93; = value
  end
  hash&#91;:data&#93; &#60;&#60; row_data
end

puts hash.to_json</pre>
<p>実行するには単に</p>
<pre class="brush: bash">$ ruby excel2json.rb</pre>
<p>とすれば良いです．ソースコードのSOURCE_FILEに変換したいExcelファイルのファイル名を入れて下さい．</p>
<p>変換データのサンプルですが，以下の様なデータを入力すると，</p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-16-at-21.18.23.png"><img class="aligncenter size-full wp-image-8686" alt="Screen Shot 2013-05-16 at 21.18.23" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-16-at-21.18.23.png" width="618" height="255" /></a></p>
<p>以下の様な構造のJSONになって出てきます．</p>
<pre class="brush: javascript">{
   "data":&#91;
      {
         "id":1,
         "title":"ほげほげほげ",
         "body":"ほげほげほげ？ふがふがふがふが"
      },
      {
         "id":2,
         "title":"ふがふがふが",
         "body":"ふげふげふげ！\nふｇうｇｈうｇうっっっっっうぇうぇ"
      },
      {
         "id":3,
         "title":"ぴよぴよぴよ",
         "body":"改行があっても\nちゃんとでーたがとれますぜ"
      },
      {
         "id":4,
         "title":"うぇえっっっうぇうぇうぇっうぇっっっうぇうぇ",
         "body":":\"'wee;;;;llm,記号を入れてみた"
      },
      {
         "id":5,
         "title":"おなかすいた",
         "body":123123
      },
      {
         "id":6,
         "title":"小田急線が遅れている件について",
         "body":null
      },
      {
         "id":7,
         "title":"雨が止まない件について",
         "body":"ueueueueeu"
      },
      {
         "id":8,
         "title":"傘が無い件について",
         "body":"hogwhogwhogww"
      }
   &#93;
}</pre>
<p>時間のあるときに，もうちょっときちんとオプションなど整理してgemにでもしようと思いますが，とりあえず使い捨てプログラムとしてはこれで十分かと思います．</p>
]]></content:encoded>
			<wfw:commentRss>http://techracho.bpsinc.jp/morimorihoge/2013_05_16/8664/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHPとRubyを徹底比較！開発効率をあげて収益を増やす</title>
		<link>http://techracho.bpsinc.jp/piichan1031/2013_05_13/8578</link>
		<comments>http://techracho.bpsinc.jp/piichan1031/2013_05_13/8578#comments</comments>
		<pubDate>Mon, 13 May 2013 09:58:16 +0000</pubDate>
		<dc:creator>渡辺 正毅</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[フレームワーク]]></category>

		<guid isPermaLink="false">http://techracho.bpsinc.jp/?p=8578</guid>
		<description><![CDATA[弊社ではRubyというプログラミング言語を使ってシステムを開発しています。そして車輪の再発明を回避しつつ開発効率を最大限引き出すためにRuby on Railsというフレームワークを活用してます。別にRuby以外触れないわけではないのですが、腰を据えて社内のノウハウを構築していくことが組織力を高める要因になるのでそうしています。ただスタッフはそれぞれあいた時間やプライベートで別の言語やフレームワーク、技術を積極的に探しては社内に共有をかけてくれるため、1年度には別の言語・フレームワーク・技術体系を採用しているかもしれません。 現時点でRuby on Railsを毎日活用していて、お客様や同業他社に推薦しまくっているため、「Rubyっていいの？みんなPHP使ってるみたいだけど。」といった質問や相談を頻繁に受けます。お客様からはほぼ100%聞かれる内容なので実際この業界にいる方々以外にとっては意外と情報が少ないのかもしれません。そんな方々のために比較を下記にまとめてみました。普段口下手なのでお会いする前にサイトを見ていただいたり、そもそもこういった情報が広がってくれると嬉しいなと感じています。 まずは主にプログラミング言語の面から比較してみます。手段としてどちらを採用した方がいいかは目的が何かで答えが異なるので、最後にまとめます。 比較対象 Webシステムでは、サーバOSにはLinuxが、プログラミング言語には俗にLL(LightweightLanguage)と呼ばれるerl/PHP/Ruby/Pythonなどのスクリプト型言語が多く利用されます。サーバOSとしてWindowsServer、言語としてJavaなども利用されますが、一般的に開発工数が激増するため、スピード重視のWeb業界ではLinux+スクリプト言語が主流です。 今回は、国内でWebシステム開発によく使われている、PHPとRubyを比較してみることにします。 (Perlは新規開発での採用が減っていること、Pythonは研究用途を除くと国内での採用事例が比較的少ないことから、今回は対象外にしました) PHPによるWeb開発の選択肢 PHPはもともとWebのために開発された言語で、簡単なWebページから本格的なWebシステムまで、非常に多く採用されています。PHPでは、多数のフレームワークが存在し、フレームワークを利用しない(俗に「生PHP」と呼ばれる)開発も広く行われていることが特徴です。参考までに一般的に採用されているフレームワークや開発スタイルはこちら。 http://www.phpframeworks.com/top-10-php-frameworks/ Yii、CodeIgniter、CakePHP、Zend、Symfonyなどのフレームワーク 日本で多く採用されているフレームワークの特徴として、始めるための敷居が低く、設置が簡単、があります。特にCakePHPはXAMPPなどのお手軽LAMP環境とも相性がよく、WEBアプリ開発の経験しかなくても、またデザイナであっても手軽にWEBシステムを開発できるのが最大の特徴であり利点です。受託開発のうち、小規模またはキャンペーンなど期限付きの作りきりのシステムを、多少の保守性を残しながら開発するときには良い選択肢です。 生PHPでの開発 小規模システムを中心に、フレームワークを利用しない開発も広く行われています。デザイナーが制作したHTMLに、1ページだけ問い合わせフォームをつけるなどの用途には相変わらず有効です。ただし、当初の予定を超えて開発規模が大きくなり、破綻するという流れも良く見受けられます。 PHPでの開発によるメリット 開発者の数が多い 始めるための敷居が低いため、「PHPプログラマー」で募集をかけると、他の言語に比べて非常に多く集まりやすいです。人員確保しやすいのは大きなメリットです。ただし、あくまで敷居が低いことによるため、一定レベル以上の人材の数は、他のメジャー言語と同程度と思われます。 日本語の情報が多い ドキュメント類が豊富なうえ、その多くが丁寧に日本語翻訳されています。そのため、英語にアレルギーがある開発者でも情報収集しやすくなっています。 導入の敷居が低い 最近は安価なレンタルサーバでもPHPが組み込まれているため、「納品されたソースコードをFTPで置けば動く」「コマンドラインを触らなくても一通りのことができる」のは、サーバ管理スキルが不要という点で大きなメリットです。生PHPはもちろん、CakePHPもこの点で多く支持されているように見受けられます。 ※YiiやSymfonyのような本格的なフレームワークでは、バージョンやライブラリ要件などが厳しくなってきており、このメリットは享受しにくくなります。 PHPが向いている開発 デザイナーとの分業が重要な体制 基本的にHTMLで構成し、一部必要なページのみをPHPで出力するといった構成が特に工夫無く実現できます。キャンペーンサイトなどで、基本的にデザイナーのみでデザインからHTMLまでを制作し、一部に問い合わせフォームをつけるなどの場合では、分業化の敷居が低いことがメリットになります。 超小規模開発 画面数が極端に少なくデータベースも不要なシステムの場合、高度なフレームワークの生産性よりもスピード重視で作りきるという割り切りに適した手段が多いです。 共用サーバーで動かすことが要件の場合 PHP、特に生PHPやCakePHPでは、レンタルサーバーでも多くの場合設置するだけで動きます。諸事情で共用サーバにインストールが必要、追加ソフトウェアのインストールが禁止されているなどの状況では、この点がメリットになります。 なお、システムは「置いて終わり」でもしばらくは稼働しますが、メンテナンスを怠ることはおすすめできません。どのような環境でもセキュリティアップデートは日々更新されており、追従しなれば大きな問題を引き起こす可能性があります。 RubyでのWeb開発 RubyでWeb開発と言えば、Ruby on Railsフレームワークを使うのが主流です。 デザインからインフラまでをワンストップで Rails開発では、デザイナー/HTMLコーダー/プログラマ/DBエンジニア/サーバエンジニアのような過度の分業をせず、各開発者がほぼすべての工程を担当するのが普通です。開発者に求められる基本スキルセットが高くなる傾向はありますが、要求を実現するために最適な方法を分担にとらわれず追求することができます。 &#8230; <a href="http://techracho.bpsinc.jp/piichan1031/2013_05_13/8578">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>弊社ではRubyというプログラミング言語を使ってシステムを開発しています。そして車輪の再発明を回避しつつ開発効率を最大限引き出すためにRuby on Railsというフレームワークを活用してます。別にRuby以外触れないわけではないのですが、腰を据えて社内のノウハウを構築していくことが組織力を高める要因になるのでそうしています。ただスタッフはそれぞれあいた時間やプライベートで別の言語やフレームワーク、技術を積極的に探しては社内に共有をかけてくれるため、1年度には別の言語・フレームワーク・技術体系を採用しているかもしれません。</p>
<p>現時点でRuby on Railsを毎日活用していて、お客様や同業他社に推薦しまくっているため、「Rubyっていいの？みんなPHP使ってるみたいだけど。」といった質問や相談を頻繁に受けます。お客様からはほぼ100%聞かれる内容なので実際この業界にいる方々以外にとっては意外と情報が少ないのかもしれません。そんな方々のために比較を下記にまとめてみました。普段口下手なのでお会いする前にサイトを見ていただいたり、そもそもこういった情報が広がってくれると嬉しいなと感じています。</p>
<p>まずは主にプログラミング言語の面から比較してみます。手段としてどちらを採用した方がいいかは目的が何かで答えが異なるので、最後にまとめます。</p>
<h2 class="article"><strong>比較対象</strong></h2>
<p>Webシステムでは、サーバOSにはLinuxが、プログラミング言語には俗にLL(LightweightLanguage)と呼ばれるerl/PHP/Ruby/Pythonなどのスクリプト型言語が多く利用されます。サーバOSとしてWindowsServer、言語としてJavaなども利用されますが、一般的に開発工数が激増するため、スピード重視のWeb業界ではLinux+スクリプト言語が主流です。</p>
<p>今回は、国内でWebシステム開発によく使われている、PHPとRubyを比較してみることにします。<br />
(Perlは新規開発での採用が減っていること、Pythonは研究用途を除くと国内での採用事例が比較的少ないことから、今回は対象外にしました)</p>
<h2 class="article"><strong>PHPによるWeb開発の選択肢</strong></h2>
<p>PHPはもともとWebのために開発された言語で、簡単なWebページから本格的なWebシステムまで、非常に多く採用されています。PHPでは、多数のフレームワークが存在し、フレームワークを利用しない(俗に「生PHP」と呼ばれる)開発も広く行われていることが特徴です。参考までに一般的に採用されているフレームワークや開発スタイルはこちら。<br />
<a href="http://www.phpframeworks.com/top-10-php-frameworks/">http://www.phpframeworks.com/top-10-php-frameworks/</a></p>
<h2 class="title">Yii、CodeIgniter、CakePHP、Zend、Symfonyなどのフレームワーク</h2>
<p>日本で多く採用されているフレームワークの特徴として、始めるための敷居が低く、設置が簡単、があります。特にCakePHPはXAMPPなどのお手軽LAMP環境とも相性がよく、WEBアプリ開発の経験しかなくても、またデザイナであっても手軽にWEBシステムを開発できるのが最大の特徴であり利点です。受託開発のうち、小規模またはキャンペーンなど期限付きの作りきりのシステムを、多少の保守性を残しながら開発するときには良い選択肢です。</p>
<h2 class="title">生PHPでの開発</h2>
<p>小規模システムを中心に、フレームワークを利用しない開発も広く行われています。デザイナーが制作したHTMLに、1ページだけ問い合わせフォームをつけるなどの用途には相変わらず有効です。ただし、当初の予定を超えて開発規模が大きくなり、破綻するという流れも良く見受けられます。</p>
<h2 class="article"><strong>PHPでの開発によるメリット</strong></h2>
<h2 class="title">開発者の数が多い</h2>
<p>始めるための敷居が低いため、「PHPプログラマー」で募集をかけると、他の言語に比べて非常に多く集まりやすいです。人員確保しやすいのは大きなメリットです。ただし、あくまで敷居が低いことによるため、一定レベル以上の人材の数は、他のメジャー言語と同程度と思われます。</p>
<h2 class="title">日本語の情報が多い</h2>
<p>ドキュメント類が豊富なうえ、その多くが丁寧に日本語翻訳されています。そのため、英語にアレルギーがある開発者でも情報収集しやすくなっています。</p>
<h2 class="title">導入の敷居が低い</h2>
<p>最近は安価なレンタルサーバでもPHPが組み込まれているため、「納品されたソースコードをFTPで置けば動く」「コマンドラインを触らなくても一通りのことができる」のは、サーバ管理スキルが不要という点で大きなメリットです。生PHPはもちろん、CakePHPもこの点で多く支持されているように見受けられます。<br />
※YiiやSymfonyのような本格的なフレームワークでは、バージョンやライブラリ要件などが厳しくなってきており、このメリットは享受しにくくなります。</p>
<h2 class="article"><strong>PHPが向いている開発</strong></h2>
<h2 class="title">デザイナーとの分業が重要な体制</h2>
<p>基本的にHTMLで構成し、一部必要なページのみをPHPで出力するといった構成が特に工夫無く実現できます。キャンペーンサイトなどで、基本的にデザイナーのみでデザインからHTMLまでを制作し、一部に問い合わせフォームをつけるなどの場合では、分業化の敷居が低いことがメリットになります。</p>
<h2 class="title">超小規模開発</h2>
<p>画面数が極端に少なくデータベースも不要なシステムの場合、高度なフレームワークの生産性よりもスピード重視で作りきるという割り切りに適した手段が多いです。</p>
<h2 class="title">共用サーバーで動かすことが要件の場合</h2>
<p>PHP、特に生PHPやCakePHPでは、レンタルサーバーでも多くの場合設置するだけで動きます。諸事情で共用サーバにインストールが必要、追加ソフトウェアのインストールが禁止されているなどの状況では、この点がメリットになります。<br />
なお、システムは「置いて終わり」でもしばらくは稼働しますが、メンテナンスを怠ることはおすすめできません。どのような環境でもセキュリティアップデートは日々更新されており、追従しなれば大きな問題を引き起こす可能性があります。</p>
<h2 class="article"><strong>RubyでのWeb開発</strong></h2>
<p>RubyでWeb開発と言えば、Ruby on Railsフレームワークを使うのが主流です。</p>
<h2 class="title">デザインからインフラまでをワンストップで</h2>
<p>Rails開発では、デザイナー/HTMLコーダー/プログラマ/DBエンジニア/サーバエンジニアのような過度の分業をせず、各開発者がほぼすべての工程を担当するのが普通です。開発者に求められる基本スキルセットが高くなる傾向はありますが、要求を実現するために最適な方法を分担にとらわれず追求することができます。</p>
<h2 class="title">最新技術・スタイルを常時取り入れる</h2>
<p>Rails開発は、良くも悪くも工業生産的にはなっていません。テストやデプロイの自動化、より効率的なデザインフレームワークの採用などにより、ルーチンワークを減らし、常にビジネスロジックの開発に注力できるようになっています。</p>
<h2 class="article"><strong>Rubyでの開発によるメリット/デメリット</strong></h2>
<h2 class="title">[メリット] ノウハウの集約</h2>
<p>RubyでのWeb開発と言えばRailsなので、ノウハウがRailsに集結します。言語では無くフレームワーク単位で見た場合に、Railsの人気は圧倒的です。開発者数の多さは、多数のライブラリによる開発効率の向上、安定性の向上など多くのメリットをもたらします。</p>
<h2 class="title">[メリット] 圧倒的な開発効率</h2>
<p>Railsはその登場当時から一貫したポリシーによりアップデートを重ねており、現在ではあらゆるWebシステムへ対応できる基盤になっています。ノウハウの蓄積により、他の追随を許さない開発効率を実現しています。</p>
<h2 class="title">[デメリット] 導入の敷居の高さ</h2>
<p>Railsはその万能性ゆえ、開発者にとってやや敷居が高く、国内でのプログラマー数はPHPと比べると少なめになります。チームメンバーとして参加するにもサーバの基礎知識やコマンドライン操作が必要になるため、工業的な分業もしにくく、必要な時に人員を追加するのに苦労することがあります。またサーバ環境への要求も高く、共有レンタルサーバーなどでは動作させられないことも多いですが、この点は昨今のクラウドサービスの普及により大きな問題にはならなくなってきました。</p>
<h2 class="article"><strong>Rubyが向いている開発</strong></h2>
<h2 class="title">継続的に開発し続けるシステム</h2>
<p>システムは生き物です。状況の変化に応じて日々変化を続けていくようなシステムには、Ruby/Railsの効率性と柔軟性が大きな武器になります。特に、立ち上げ時には規模の読めないスタートアップサービスには適しています。<br />
逆に、当初の仕様で変更無く作りきり、いったん完成したら二度と更新しないようなシステムだとしたら、Railsのメリットはあまり享受できないでしょう。バージョンアップが速く、旧バージョンのサポート停止などに対応するコストのほうが高く付いてしまう可能性があります。</p>
<h2 class="article"><strong>で、どんなシステムにPHP/Rubyは向いてるの？</strong></h2>
<p>上記の事実をもとに、ぼくの主観で振り分けていきます。弊社にはRuby on Rails経験の豊富なエンジニアがいるため、採用しにくいことや開発環境の準備にコストがかかる部分があまりないため、多少バイアスがかかっているかもしれません。</p>
<h2 class="title">社内業務システム</h2>
<p>社内にオールラウンドなエンジニアがいれば（Ruby経験不問）、基盤部分だけ発注して、納品後に機能を足していくことをおすすめします。社内システムは常に要望が変化するため初期のデータ設計部分に携わり、基盤部分だけはしっかりと良い物を作っておき、その後何年もかけて自社の要件にあわせて開発を継続していくことが最も安価でリスクの少ない選択肢とおもいます。社内にそういったエンジニアがいない場合、採用できない場合、または継続的に開発していうことが面倒などの理由で実現できない場合、ぜひ<a href="http://www.bpsinc.jp/rails">弊社を検討</a>ください。既にあるものをさくっとRuby on Railsシステムに作り変えることも可能です。</p>
<h2 class="title">自社で運用するWebサービスの場合</h2>
<p>社内業務システムのように初期の最も大きな要件が変化しない・また社内で継続的に運用していくような類のものであれば、Ruby on Railsはとても良い選択肢です。逆に、そこまで要件・機能が多くないサービスのプロトタイプを開発するような場合は、すこし注意が必要です。作ってもすぐ全部壊して作りなおす可能性がある場合（例：プロトタイピングして要件を洗い出す場合など）はスピード重視かつ保守性を捨てたほうが良い場合があるため、PHPも良い選択肢と言えます。機能の量でフレームワークを活用するかどうかを決めれば良いかと思います。</p>
<h2 class="title">キャンペーンなど期限付きのサイト</h2>
<p>キャンペーンが終われば正常かどうする必要がないなど、保守性をある程度無視して開発できるものはPHPやアリモノのシステムを採用すべきです。PHPはツールや関連ソフトが無料な場合が多くスモールスタートする場合に適しています。</p>
]]></content:encoded>
			<wfw:commentRss>http://techracho.bpsinc.jp/piichan1031/2013_05_13/8578/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>nagiosでmailmanの監視をする</title>
		<link>http://techracho.bpsinc.jp/yamasita-taisuke/2013_05_13/8637</link>
		<comments>http://techracho.bpsinc.jp/yamasita-taisuke/2013_05_13/8637#comments</comments>
		<pubDate>Mon, 13 May 2013 08:26:07 +0000</pubDate>
		<dc:creator>yamasita</dc:creator>
				<category><![CDATA[サーバー/ネットワーク]]></category>
		<category><![CDATA[nagios]]></category>

		<guid isPermaLink="false">http://techracho.bpsinc.jp/?p=8637</guid>
		<description><![CDATA[こちらのプラグインを以下の環境で動くように修正しました。 動作確認環境 distribution: ubuntu 12.04 perl: 5.14.2 mailman: 2.1.14 mailmanは/var/lib/mailman/qfilesにメールをキューとして保存してからmailmanのデーモンが処理していきます。 なので、このフォルダ内のメールが極端に古くなっていたら何らかの問題が発生していると考え、アラートを出すという仕組みです。 warning,criticalになる値はデフォルトでそれぞれ5分,20分となっています。 こちらは環境に合わせて変更下さい。]]></description>
				<content:encoded><![CDATA[<p><img src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Nagios.png"><br />
<a href="http://exchange.nagios.org/directory/Plugins/Email-and-Groupware/Mailman/check_mailman_qfiles/details">こちらのプラグイン</a>を以下の環境で動くように修正しました。</p>
<p>動作確認環境</p>
<pre>
distribution: ubuntu 12.04
perl: 5.14.2
mailman: 2.1.14
</pre>
<p><script src="https://gist.github.com/5114683.js?file=20130513_checkmail.diff"></script></p>
<p>mailmanは/var/lib/mailman/qfilesにメールをキューとして保存してからmailmanのデーモンが処理していきます。<br />
なので、このフォルダ内のメールが極端に古くなっていたら何らかの問題が発生していると考え、アラートを出すという仕組みです。</p>
<p>warning,criticalになる値はデフォルトでそれぞれ5分,20分となっています。<br />
こちらは環境に合わせて変更下さい。</p>
]]></content:encoded>
			<wfw:commentRss>http://techracho.bpsinc.jp/yamasita-taisuke/2013_05_13/8637/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GitLabをアップデートしたら行コメントが消えてしまったとき</title>
		<link>http://techracho.bpsinc.jp/baba/2013_05_12/8581</link>
		<comments>http://techracho.bpsinc.jp/baba/2013_05_12/8581#comments</comments>
		<pubDate>Sun, 12 May 2013 13:30:40 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[Rails]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[サーバー/ネットワーク]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[sqlite3]]></category>

		<guid isPermaLink="false">http://techracho.bpsinc.jp/?p=8581</guid>
		<description><![CDATA[GitLabはバージョンアップが頻繁で、気づいたら安定版が5.1にまでなってました。 先日社内サーバと個人サーバのGitLabをそれぞれ3系から5.1にアップデートしたのですが、いつの間にかgitolite→gitlab-shell、resque→sidekiq、unicorn→pumaとすごい変化ですね。 アップデートは横着せずにマニュアル通りにやれば特に難しくありません。3.1の段階で、sqlite→mysqlに移行しておくのを忘れずに。 しかし問題が1点、コミットの行に付けていたコメントが表示されなくなってしまいました。 これは、4.1以降で行コード（line_code, line_anchorなどとコード内で呼ばれている）のフォーマットが変わったのが原因です。 アップデートしてもデータが消失してしまったわけではないので、5.1にアップデート後、以下の手順を実行すれば解決できました。 MySQLのデータをバックアップ この移行スクリプト（以下にも記載）をlib/tasks/migrate/migrate_note_linecode.rakeとして保存 sudo -u git -H RAILS_ENV=production bundle exec rake migrate_note_linecode desc "GITLAB &#124; Migrate Note LineCode" task migrate_note_linecode: :environment do Note.inline.each do &#124;note&#124; index = note.diff_file_index if index =~ /^\d{1,10}$/ # is &#8230; <a href="http://techracho.bpsinc.jp/baba/2013_05_12/8581">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="https://github.com/gitlabhq/gitlabhq">GitLab</a>はバージョンアップが頻繁で、気づいたら安定版が5.1にまでなってました。</p>
<p>先日社内サーバと個人サーバのGitLabをそれぞれ3系から5.1にアップデートしたのですが、いつの間にかgitolite→gitlab-shell、resque→sidekiq、unicorn→pumaとすごい変化ですね。</p>
<p>アップデートは横着せずに<a href="https://github.com/gitlabhq/gitlabhq/tree/master/doc/update">マニュアル</a>通りにやれば特に難しくありません。3.1の段階で、<a href="https://github.com/gitlabhq/gitlabhq/wiki/Migrate-from-SQLite-to-MySQL">sqlite→mysqlに移行しておく</a>のを忘れずに。</p>
<p>しかし問題が1点、コミットの行に付けていたコメントが表示されなくなってしまいました。<br />
<div id="attachment_8582" class="wp-caption aligncenter" style="width: 310px"><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/epub-webkit-webkit-GitLab.png"><img src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/epub-webkit-webkit-GitLab-300x272.png" alt="行コメント" width="300" height="272" class="size-medium wp-image-8582" /></a><p class="wp-caption-text">行コメント</p></div></p>
<p>これは、4.1以降で行コード（line_code, line_anchorなどとコード内で呼ばれている）のフォーマットが変わったのが原因です。<br />
アップデートしてもデータが消失してしまったわけではないので、5.1にアップデート後、以下の手順を実行すれば解決できました。</p>
<ol>
<li>MySQLのデータをバックアップ</li>
<li><a href="https://raw.github.com/babatakao/gitlabhq/migrate_note_linecode/lib/tasks/migrate/migrate_note_linecode.rake">この移行スクリプト</a>（以下にも記載）をlib/tasks/migrate/migrate_note_linecode.rakeとして保存</li>
<li>sudo -u git -H RAILS_ENV=production bundle exec rake migrate_note_linecode</li>
</ol>
<pre class="brush:ruby">
desc "GITLAB | Migrate Note LineCode"
task migrate_note_linecode: :environment do
  Note.inline.each do |note|
    index = note.diff_file_index
    if index =~ /^\d{1,10}$/ # is number. not hash.
      hash = Digest::SHA1.hexdigest(note.noteable.diffs&#91;index.to_i&#93;.new_path)
      new_line_code = note.line_code.sub(index, hash)
      note.update_column :line_code, new_line_code
      print '.'
    end
  end
end
</pre>
<p>※アップデート前3.1、アップデート後5.1でのみ動作確認しました。必ずバックアップは取っておいてください。</p>
<p><strong>5/13追記</strong><br />
<a href="https://github.com/gitlabhq/gitlabhq/pull/3911">masterに取り込んでもらえました</a></p>
]]></content:encoded>
			<wfw:commentRss>http://techracho.bpsinc.jp/baba/2013_05_12/8581/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>3年間かけて培ったWebシステム開発におけるHTML/CSSコーディングまとめ(方針編)</title>
		<link>http://techracho.bpsinc.jp/kazumasa-ogawa/2013_05_10/8264</link>
		<comments>http://techracho.bpsinc.jp/kazumasa-ogawa/2013_05_10/8264#comments</comments>
		<pubDate>Fri, 10 May 2013 05:39:00 +0000</pubDate>
		<dc:creator>Kazumasa Ogawa</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Web開発]]></category>

		<guid isPermaLink="false">http://techracho.bpsinc.jp/?p=8264</guid>
		<description><![CDATA[こんにちは。私は今まで、3年間、RailsやCakePHP,Ethnaなど様々な言語やフレームワークを使って開発を行ってきました。その中で、共通して使ってきたのがHTML/CSSです。私が3年間かけて培ってきたHTML/CSSの書き方ややり方、方針などをこの場を借りてまとめたいと思います。 1. まずはじめに 　1.1 対応ブラウザを確認する 　1.2 スマホ対応の必要があるかを確認する 　1.3 HTML/CSSを使った開発のルールを決める 2. HTML編 　2.1 idやclassの命名を考える 　2.2 idは多用しない 　2.3 HTMLの共通化を考えた記述をする 　コラム コラム: IE(後方互換モード)の対応が必要になった時の対処 3. CSS編 　3.1 共通で使えるCSSは共通用のファイルを作ってまとめる 　3.2 CSSの適用範囲を考慮して記述する 　3.3 reset.cssを使うかどうかを決める 　3.4 CSSの!importantはできるだけ利用しない 　3.5 BootstrapのCSSを上書きする場合は別クラスを作成する 4. おわりに 1. まずはじめに ここでは、HTML/CSSを使った開発をする前に行っておきたいことをまとめます。 1.1 対応ブラウザを確認する ここを最初に確認しておかないと後々大変なことになります。IE6,7でデザインが崩れたとお客さんに言われ、後々、対応した経験があります。。 &#8230; <a href="http://techracho.bpsinc.jp/kazumasa-ogawa/2013_05_10/8264">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>こんにちは。私は今まで、3年間、RailsやCakePHP,Ethnaなど様々な言語やフレームワークを使って開発を行ってきました。その中で、共通して使ってきたのがHTML/CSSです。私が3年間かけて培ってきたHTML/CSSの書き方ややり方、方針などをこの場を借りてまとめたいと思います。</p>
<p>1. <a href="#link-1">まずはじめに</a><br />
　1.1 <a href="#link1-1">対応ブラウザを確認する</a><br />
　1.2 <a href="#link1-2">スマホ対応の必要があるかを確認する</a><br />
　1.3 <a href="#link1-3">HTML/CSSを使った開発のルールを決める</a><br />
2. <a href="#link2">HTML編</a><br />
　2.1 <a href="#link2-1">idやclassの命名を考える</a><br />
　2.2 <a href="#link2-2">idは多用しない</a><br />
　2.3 <a href="#link2-3">HTMLの共通化を考えた記述をする</a><br />
　コラム <a href="#column1">コラム: IE(後方互換モード)の対応が必要になった時の対処</a><br />
3. <a href="#link3">CSS編</a><br />
　3.1 <a href="#link3-1">共通で使えるCSSは共通用のファイルを作ってまとめる</a><br />
　3.2 <a href="#link3-2">CSSの適用範囲を考慮して記述する</a><br />
　3.3 <a href="#link3-3">reset.cssを使うかどうかを決める</a><br />
　3.4 <a href="#link3-4">CSSの!importantはできるだけ利用しない</a><br />
　3.5 <a href="#link3-5">BootstrapのCSSを上書きする場合は別クラスを作成する</a><br />
4. <a href="#link-end">おわりに</a><br />
<a name="link1"></a></p>
<h2 class="article"><strong>1. まずはじめに</strong></h2>
<p>ここでは、HTML/CSSを使った開発をする前に行っておきたいことをまとめます。<br />
<a name="link1-1"></a></p>
<h2 class="title">1.1 対応ブラウザを確認する</h2>
<p>ここを最初に確認しておかないと後々大変なことになります。IE6,7でデザインが崩れたとお客さんに言われ、後々、対応した経験があります。。<br />
IE6,IE7の対応が必要になった場合はHTML/CSSの書き方を工夫する必要がありますし、最初に決めておくとお客さんとのトラブルも減りますので、先に決めておきましょう。</p>
<p><a name"link1-2"></a></p>
<h2 class="title">1.2 スマホ対応の必要があるかを確認する</h2>
<p>スマホの対応が必要かどうかの確認をしましょう。また、スマホは別デザインにするかどうかも確認する必要があります。<br />
詳しくは「スマホ対応編」で書きます。</p>
<p><a name="link1-3"></a></p>
<h2 class="title">1.3 HTML/CSSを使った開発のルールを決める</h2>
<p>複数人で開発する場合、後に他の人に引き継ぐ可能性がある場合はルールを決め共有するようにしましょう。<br />
これが、先に決まっていないとHTML/CSSファイルが複数出来上がって、どれがどれだかわからなくなったり、<br />
CSSの書き方が人によって異なったりして、後々、修正しづらいといったことが発生します。<br />
これも経験しました。。</p>
<p>※下記のHTML編とCSS編がルール決めの参考になれば幸いです。<br />
<a name="link2"></a></p>
<h2 class="article"><strong>2. HTML編</strong></h2>
<p>ここでは、私がHTMLコーディングする際に気を付けていることを紹介します。<br />
<a name="link2-1"></a></p>
<h2 class="title">2.1 idやclassの命名を考える</h2>
<p>主に心がけているのは以下です。<br />
・どのような要素かわかりやすいようかつ汎用的(使い回しができる)命名を付ける。<br />
塩梅が難しいのですが、<br />
共通で使用する要素用のクラス名は&#8221;common&#8221;とする<br />
左側の要素は&#8221;left_contents&#8221;右側の要素は&#8221;right_contents&#8221;というクラス名にする<br />
などを行っています。</p>
<p>・単語の区切り文字を決める<br />
単語の区切り文字がバラバラになって見にくくなるという経験があります。<br />
headerWrapper, header_wrapper, header-wrapper<br />
少し前までは&#8217;_'区切りで単語切っていたのですが、最近はbootstrapが&#8221;-&#8221;区切りを使用していることからそちらに合わせて&#8221;-&#8221;区切りを使用するようになりました。</p>
<p><a name="link2-2"></a></p>
<h2 class="title">2.2 idは多用しない</h2>
<p>idは要素が一意に決まるため、javascriptを使用する場合などには便利なのですが、その反面、同HTMLファイル内ではその要素が利用できないといったデメリットがあります。<br />
そのため、idを利用する際は、本当にその要素にidを付ける必要があるのか、再利用はしないのかといったことを考えてから利用するようにしています。<br />
個人的には、idやクラスが多いと見づらいので、見易さの観点からも気を付けるようにしています。</p>
<p><a name="link2-3"></a></p>
<h2 class="title">2.3 HTMLの共通化を考えた記述をする</h2>
<p>Railsを使った開発もやっているのですが、RailsにはpartialといったHTMLを共通化するための便利な機能があります。<br />
同じような要素を繰り返し記述している部分は共通化したいのですが、共通化する際に共通化しづらいHTML何度か遭遇したので、<br />
共通化しづらい記述方法を例に挙げて共通化しやすいHTMLはどのようなものなのかを説明します。</p>
<p><strong>HTML</strong></p>
<pre>
&lt;div class=&quot;contents-wrapper&quot;&gt;
  &lt;div class=&quot;contents first&quot;&gt;
  &lt;/div&gt;
  &lt;div class=&quot;contents&quot;&gt;
  &lt;/div&gt;
&lt;/div&gt;
</pre>
<p><strong>CSS</strong></p>
<pre>
.contents-wrapper .contents {
  margin-right: 3px;
}
.contents-wrapper .contents.first {
  margin-left: 3px;
}
</pre>
<p>上記のような記述の場合、&#8221;contents&#8221;クラスがついているブロックは共通化して使いまわしたいところなのですが、<br />
最初の&#8221;contents&#8221;クラスの要素には&#8221;first&#8221;がついています。<br />
共通化する際にプログラム側で最初の要素であれば&#8221;first&#8221;を付けるように書くことも可能なのですが、逆に言うとプログラムを書く必要があるのと条件が増える分プログラムの処理コストも上がるので、<br />
なるべく繰り返しの要素に関しては一部要素にだけ特定の要素を付けないような工夫をしてあげるとプログラマは助かります。<br />
上記の例の場合は&#8221;.contents-wrapper .contents.first&#8221;の部分を消して<br />
<strong>css</strong></p>
<pre>
.contents-wrapper {
  padding-left: 3px;
}
</pre>
<p>上記を追加すると似たようなことができます。</p>
<p><a name="column1"></a></p>
<h2 class="title">コラム: IE(後方互換モード)の対応が必要になった時の対処</h2>
<p>後方互換モードについては<a href="http://w3g.jp/others/data/doctype_switching" target="_blank">こちら</a>を参考にしてください。<br />
昔のHTMLファイルの修正が必要などでどうしてもIE(後方互換モード)の対応が必要になってしまった場合はHTML/CSSを少し工夫する必要があります。<br />
※最初から作成する場合はHTML5記法の<!DOCTYPE html>宣言すると標準準拠モードになるので気にしなくてよくなります。<br />
IE(後方互換モード)は&#8221;width&#8221;, &#8220;height&#8221;の計算方法が少し特殊です。<br />
IE(後方互換モード)では<br />
width = width &#8211; padding-left &#8211; padding-right &#8211; border-left &#8211; border-right<br />
height = height &#8211; padding-top &#8211; padding-bottom &#8211; border-top &#8211; border-bottom<br />
みたいに計算されます。<br />
<a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/ie.png"><img src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/ie.png" alt="" title="ie" width="674" height="388" class="alignnone size-full wp-image-8545" /></a><br />
NG<br />
<strong>HTML</strong></p>
<pre>
&lt;div class=&quot;contents&quot;&gt;
&lt;/div&gt;
</pre>
<p><strong>CSS</strong></p>
<pre>
.contents {
  width: 100px;
  padding: 0 10px;
  border: solid 2px #0000ff;
}
</pre>
<p>そのため、指定したwidth, heightよりも小さく幅がとられるといったことが発生します。<br />
回避方法としてはwidth, heightと一緒にpadding, borderを指定しないことです。<br />
具体的にはIE(後方互換モード)対応が必要な場合は&#8221;-wrapper&#8221;のクラスを一つ上の階層に作り対応するようにしています。<br />
<strong>HTML</strong></p>
<pre>
&lt;div class=&quot;contents-wrapper&quot;&gt;
  &lt;div class=&quot;contents&quot;&gt;
  &lt;/div&gt;
&lt;/div&gt;
</pre>
<p><strong>CSS</strong></p>
<pre>
.contents-wrapper {
  padding: 0 10px;
  border: solid 2px #0000ff;
}
.contents {
  width: 100px;
}
</pre>
<p>上記の方法以外にもCSSハックを利用する方法がありますが、CSSの記法から外れることがあり、<br />
個人的に好きではないので利用しないようにしています。<br />
※CSSハックで検索するとやり方はいっぱい出てきます。</p>
<p><a name="link3"></a></p>
<h2 class="article"><strong>3. CSS編</strong></h2>
<p>ここでは、私がCSSを記述する際に気を付けていることを紹介します。</p>
<p><a name="link3-1"></a></p>
<h2 class="title">3.1 共通で使えるCSSは共通用のファイルを作ってまとめる</h2>
<p>どのページでも汎用的に使えるクラスを作成し、使いまわせるようにすると便利です。<br />
例えば、左マージンを&#8221;10px&#8221;とるようなクラスを&#8221;.ml10&#8243;、フォントカラーを赤にするクラスを&#8221;.red&#8221;<br />
のように汎用的に使用できるクラスを最初に作成し、共通用のファイルにまとめておくと別件でHTML/CSSを作成する際に使いまわせて便利です。<br />
下記に私が使用している共通用のCSSを一部ご紹介します。<br />
<strong>margin.css</strong></p>
<pre>
@charset "UTF-8"

/*------------------------------------------*
 *   margin系CSS
 *------------------------------------------*/
.mt5{
  margin-top: 5px;
}
.mt10{
  margin-top:10px;
}
.mt15 {
  margin-top:15px;
}
.mt20 {
  margin-top: 20px;
}
.mr5{
  margin-right: 5px;
}
.mr10{
  margin-right:10px;
}
.mr15 {
  margin-right:15px;
}
.mr20 {
  margin-right: 20px;
}
.mb5{
  margin-bottom: 5px;
}
.mb10{
  margin-bottom:10px;
}
.mb15 {
  margin-bottom:15px;
}
.mb20 {
  margin-bottom: 20px;
}
.ml5{
  margin-left: 5px;
}
.ml10{
  margin-left:10px;
}
.ml15 {
  margin-left:15px;
}
.ml20 {
  margin-left: 20px;
}
.ml40 {
  margin-left: 40px;
}
.ml50 {
  margin-left: 50px;
}
.mtb10 {
  margin: 10px 0;
}
</pre>
<p><strong>common.css</strong></p>
<pre>
.left-contents {
  float:left;
}
.right-contents {
  float:right;
}
.clear {
  height:0;
  clear:both;
}
.v-middle {
  vertical-align:middle;
}
.v-bottom {
  vertical-align:bottom;
}
.align-right {
  text-align: right;
}
.align-center {
  text-align: center;
}
.notice{
  color: #dd2200;
}
</pre>
<p><a name="link3-2"></a></p>
<h2 class="title">3.2 CSSの適用範囲を考慮して記述する</h2>
<p>CSSの記述がどの程度優先されて適用されるのか考えてCSSを記述しないと意図しないところでデザインが崩れたりする可能性があります。<br />
ここは、感覚的な部分や経験がものをいう部分でもあったりするので難しいところなのですが、<br />
私の場合は基本的には、共通で使用するクラス、ベースとして定義したCSS以外はCSS適用の優先度が高くなるように記述するようにしています。</p>
<p><a name="link3-3"></a></p>
<h2 class="title">3.3 reset.cssを使うかどうかを決める</h2>
<p>ブラウザのデフォルトで適用されるスタイルをリセットするためにreset.cssを利用することが多いのですが、reset.cssはメリットだけではありません。<br />
※reset.cssについてはグーグルなどで検索するといっぱい出てきます。<br />
最近、WYSIWYGを利用する機会があったのですが、reset.cssを利用した際に、WYSIWYG内で表示されたものと、実際に画面で表示されたもののデザインが異なっていたといったことがありました。<br />
WYSIWYGエディタ<br />
<a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/wysiwyg1.png"><img src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/wysiwyg1.png" alt="" title="wysiwyg" class="alignnone size-full wp-image-8510" /></a><br />
実際は</p>
<pre>
hoge
test
</pre>
<p>のように表示されました。●ついてない<br />
原因はreset.cssで</p>
<pre>
ol, ul {
  list-style :none;
}
</pre>
<p>としていたからです。<br />
この様にreset.cssを利用するとこで思わぬ弊害が起こりうるので、reset.cssを使って問題ないかを確認しましょう。</p>
<p><a name="link3-4"></a></p>
<h2 class="title">3.4 CSSの!importantはできるだけ利用しない</h2>
<p>!importantを使用したCSSを編集することが何度かありましたが、!importantを使用されてしまうとどう頑張ってもそのCSSが適用されてしまうので、<br />
後々になってこの箇所だけ違うCSSを適用したいといったときに困ってしまいます。特にCSSの記述が多くなってくると安易に後で!importantを外すことができなくなってしまうので、個人的にはあまり使用して欲しくはないです。!importantに対してさらに!importantをかぶせて上書きしたことがあります。。。<br />
いけてないですね。<br />
!importantは使わずCSSの適用優先順位が高くなるように記述して対応しましょう。</p>
<p><a name="link3-5"></a></p>
<h2 class="title">3.5 BootstrapのCSSを上書きする場合は別クラスを作成する</h2>
<p>最近はBootstrapを利用することが多くなってきました。Bootstrapを使っている中でBootstrapに記述されているCSSを上書きしたいことがしばしばありました。そのような場合は特定のクラスをつけて上書きするようにしています。私はよく&#8221;ovverride&#8221;クラスをつけるようにしています。<br />
※IE6対応が必要な場合、IE6は複数クラスセレクタに不完全対応なので1階層したに要素を作成してクラスをつけるなどで対応しましょう。<br />
Bootstrap使う場合は大抵IE6で見るとデザイン崩れるので対応外になることが多いと思いますが。<br />
<strong>BootstrapのCSS</strong></p>
<pre>
.form-horizontal .control-label {
  float: left;
  width: 160px;
  padding-top: 5px;
  text-align: right;
}
</pre>
<p><strong><br />
上書き</strong></p>
<pre>
.form-horizontal.override .control-label {
  padding: 10px;
  margin-right: 50px;
  width: 120px;
}
</pre>
<p><a name="link-end"></a></p>
<h2 class="article"><strong>4. おわりに</strong></h2>
<p>最後まで読んでくださった方、有難うございました。<br />
HTML/CSSでの開発で3年間で学んだことをまとめましたが、絶対これがいいというものではありません。<br />
他にもっといいやり方もあると思いますので、こんなやり方のほうがいいのではないかという意見もお待ちしております。<br />
今後、複数人開発で気を付ける点をまとめた(複数人開発編)とスマホ対応での気をつける点をまとめた(スマホ対応編)を書く予定です。</p>
]]></content:encoded>
			<wfw:commentRss>http://techracho.bpsinc.jp/kazumasa-ogawa/2013_05_10/8264/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Macで東方Projectのゲームをプレイする方法（2013年5月版）</title>
		<link>http://techracho.bpsinc.jp/morimorihoge/2013_05_04/8369</link>
		<comments>http://techracho.bpsinc.jp/morimorihoge/2013_05_04/8369#comments</comments>
		<pubDate>Sat, 04 May 2013 00:34:22 +0000</pubDate>
		<dc:creator>morimorihoge</dc:creator>
				<category><![CDATA[ITライフ]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Wine]]></category>
		<category><![CDATA[ゲーム]]></category>
		<category><![CDATA[東方Project]]></category>

		<guid isPermaLink="false">http://techracho.bpsinc.jp/?p=8369</guid>
		<description><![CDATA[世間はGW真っ只中なので，たまにはTechぽくない記事も書いてみようと思います． Macへの移行を考えた際に，今も昔もボトルネックになるのはゲームです（真面目な話）．PCでゲームといえば昔からWindowsが主流で，Mac版がリリースされるゲームはごくわずかです．数少ないMac版も日本語版がリリースされなかったり，最新パッチが当たらない or Mac版リリースまでブランクがあったり，Modが動かなかったりと残念な状況だったりすることが多いです．例外としてBlizzardのゲームはWin/Mac同時対応ですばらしいです．おかげでWoWやDiablo 3は普通にプレイできますね（Diablo 3は残念な出来なので，まだまだパッチ待ちですが．．．）．他にも，Steamを見ればBorderlands 2やCivilization V，少し古いですが名作PortalもMac対応しているので，昔に比べればずいぶん遊べるゲームが増えました．そうそう，最近LoLもMac版公式クライアントがBeta取れましたね． しかし，Mac対応したゲームが増えたといっても全部ではありません．ぶっちゃけ東方Project（上海アリス幻樂団）のゲームがやりたいわけです．STGは1プレイ時間が5〜40分程度と，電車移動やちょっとした空き時間にやるのにちょうど良いです．息抜きも大事．しかし東方ProjectのゲームはWindowsオンリー（6作目の東方紅魔郷以降の話．旧作がやりたい人はAnex86あたりを使って下さい）なので，そのままMac OS Xで動作させることはできません． MacでWindowsゲームをプレイする方法 現在MacでWindowsゲームを動かす方法は大きく分けて3種類あります． BootCamp環境などを構築し，Mac本体をMac OS X/Windowsのデュアルブート環境にして，ゲームをやりたいときは再起動してWindowsを起動する VMWare Fusion / Parallels Desktop / VirtualBox等の仮想マシン環境を使い，VM上のWindowsにゲームをインストールする CrossOver，MikuInstallerなどのWine環境を構築し，Wine経由で実行する それぞれの方法につき，一長一短があります．BootCampは最も理想的な環境ですが，いちいち再起動する必要がある上，Macのアプリを同時起動できません．仮想マシンを使った方法では仮想マシンの3Dドライバ性能によってかなり動作速度が制限されます．ただ，最近のVMWareやParallelsのドライバはかなり良い線まで行っている様です．しかし，ゲームを起動するためだけにVM一つ実行してメモリを割り当てるのはもったいない＆面倒な感じもします．最後のWine環境は純粋にアプリのみを起動することができるので，最もお手軽ですが，Wine自体のエミュレーション性能に依存するところが大きく，昔の不安定だったころのWineを知っているとちょっと不安が残ります． 今回は上記3環境でそれぞれ東方をインストールしてプレイしてみて，どれが良いのか比較しようと思っていました．しかし，試してみたらWine環境が思ったよりずっと良くなっていたので，結論から言うとWine環境がおすすめです．再起動やVMの起動待ちを気にせず，やりたいときにパッとプレイできるのでまさに息抜きに丁度良いです． Wine環境選び MacにWine環境をインストールするには有償・無償含めかなりの選択肢がありますが，ゲームや特定アプリケーションを動かしたいという用途であれば，CrossOverがおすすめです．以前はCrossOver Games等に分かれていた記憶がありますが，今はCrossOverに一本化されたみたいです．59.95ドルで，1年経つとアップグレードするのにさらにアップグレードライセンスを買わされますが，品質はかなり良いです．いくつかのゲームは公式サポートもしており，新しいゲームも随時サポートに追加されていきますので，気になる人は対応ゲームのページを見ると良いでしょう． CrossOverを使う際にはbottleという概念を理解しておく必要があります．bottleは原則アプリケーションごとに作成され，異なるBottle間のデータはアクセスできないという性質を持ちます（いわゆるSandbox）．これにより，あれこれアプリをインストールしていても，間違って他のアプリのデータを上書きする心配が無くなります．逆に，お互いに依存性のあるソフトウェアをインストールしたい場合は，同一bottleにインストールする必要があるので気をつけましょう．といっても，ゲームをやりたいだけなら普通は全部別bottleで構いません． CrossOverにゲームをインストールする手順 早速CrossOverに東方Projectのゲームをインストールしてみます．まずはお試しということで，サイズの小さい東方文花帖にしてみます． ゲームディスクを入れ（僕はディスクユーティリティでイメージ化してあるものをマウントしました），CrossOverを起動したら，Configure -&#62; Install Softwareを選びます． なんと文花帖はCrossOverのゲームリストに既に登録されており「Touhou 9.5: Shoot the &#8230; <a href="http://techracho.bpsinc.jp/morimorihoge/2013_05_04/8369">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>世間はGW真っ只中なので，たまにはTechぽくない記事も書いてみようと思います．</p>
<p>Macへの移行を考えた際に，今も昔もボトルネックになるのはゲームです（真面目な話）．PCでゲームといえば昔からWindowsが主流で，Mac版がリリースされるゲームはごくわずかです．数少ないMac版も日本語版がリリースされなかったり，最新パッチが当たらない or Mac版リリースまでブランクがあったり，Modが動かなかったりと残念な状況だったりすることが多いです．例外として<a href="http://us.blizzard.com/en-us/">Blizzard</a>のゲームはWin/Mac同時対応ですばらしいです．おかげで<a href="http://us.blizzard.com/en-us/games/mists/">WoW</a>や<a href="http://us.blizzard.com/en-us/games/d3/">Diablo 3</a>は普通にプレイできますね（Diablo 3は残念な出来なので，まだまだパッチ待ちですが．．．）．他にも，<a href="http://store.steampowered.com/">Steam</a>を見れば<a href="http://www.borderlands2.com/">Borderlands 2</a>や<a href="http://www.civilization5.com/">Civilization V</a>，少し古いですが名作<a href="http://www.thinkwithportals.com/">Portal</a>もMac対応しているので，昔に比べればずいぶん遊べるゲームが増えました．そうそう，最近<a href="http://na.leagueoflegends.com/">LoL</a>もMac版公式クライアントがBeta取れましたね．</p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-7.28.05.png"><img class="aligncenter size-large wp-image-8415" title="Screen Shot 2013-05-04 at 7.28.05" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-7.28.05-1024x823.png" alt="" width="640" height="514" /></a></p>
<p>しかし，Mac対応したゲームが増えたといっても全部ではありません．ぶっちゃけ東方Project（<a href="http://www16.big.or.jp/~zun/top.html">上海アリス幻樂団</a>）のゲームがやりたいわけです．STGは1プレイ時間が5〜40分程度と，電車移動やちょっとした空き時間にやるのにちょうど良いです．息抜きも大事．しかし東方ProjectのゲームはWindowsオンリー（6作目の東方紅魔郷以降の話．旧作がやりたい人は<a href="http://motor.geocities.jp/aqua_marine_blue_556/Anex86/homepage2/ans/ax/axdown.htm">Anex86</a>あたりを使って下さい）なので，そのままMac OS Xで動作させることはできません．</p>
<h2 class="title">MacでWindowsゲームをプレイする方法</h2>
<p>現在MacでWindowsゲームを動かす方法は大きく分けて3種類あります．</p>
<ul>
<li>BootCamp環境などを構築し，Mac本体をMac OS X/Windowsのデュアルブート環境にして，ゲームをやりたいときは再起動してWindowsを起動する</li>
<li><a href="http://www.vmware.com/jp/products/desktop_virtualization/fusion/overview">VMWare Fusion</a> / <a href="http://www.parallels.com/jp/products/desktop/">Parallels Desktop</a> / <a href="https://www.virtualbox.org/">VirtualBox</a>等の仮想マシン環境を使い，VM上のWindowsにゲームをインストールする</li>
<li><a href="http://www.codeweavers.com/products/">CrossOver</a>，<a href="http://mikuinstaller.sourceforge.jp/">MikuInstaller</a>などのWine環境を構築し，Wine経由で実行する</li>
</ul>
<p>それぞれの方法につき，一長一短があります．BootCampは最も理想的な環境ですが，いちいち再起動する必要がある上，Macのアプリを同時起動できません．仮想マシンを使った方法では仮想マシンの3Dドライバ性能によってかなり動作速度が制限されます．ただ，最近のVMWareやParallelsのドライバはかなり良い線まで行っている様です．しかし，ゲームを起動するためだけにVM一つ実行してメモリを割り当てるのはもったいない＆面倒な感じもします．最後のWine環境は純粋にアプリのみを起動することができるので，最もお手軽ですが，Wine自体のエミュレーション性能に依存するところが大きく，昔の不安定だったころのWineを知っているとちょっと不安が残ります．</p>
<p>今回は上記3環境でそれぞれ東方をインストールしてプレイしてみて，どれが良いのか比較しようと思っていました．しかし，試してみたらWine環境が思ったよりずっと良くなっていたので，結論から言うと<strong>Wine環境がおすすめ</strong>です．再起動やVMの起動待ちを気にせず，やりたいときにパッとプレイできるのでまさに息抜きに丁度良いです．</p>
<h2 class="title">Wine環境選び</h2>
<p>MacにWine環境をインストールするには有償・無償含めかなりの選択肢がありますが，ゲームや特定アプリケーションを動かしたいという用途であれば，<a href="http://www.codeweavers.com/">CrossOver</a>がおすすめです．以前はCrossOver Games等に分かれていた記憶がありますが，今はCrossOverに一本化されたみたいです．59.95ドルで，1年経つとアップグレードするのにさらにアップグレードライセンスを買わされますが，品質はかなり良いです．いくつかのゲームは公式サポートもしており，新しいゲームも随時サポートに追加されていきますので，気になる人は<a href="http://www.codeweavers.com/products/cxgames/">対応ゲームのページ</a>を見ると良いでしょう．</p>
<p>CrossOverを使う際にはbottleという概念を理解しておく必要があります．bottleは原則アプリケーションごとに作成され，異なるBottle間のデータはアクセスできないという性質を持ちます（いわゆるSandbox）．これにより，あれこれアプリをインストールしていても，間違って他のアプリのデータを上書きする心配が無くなります．逆に，お互いに依存性のあるソフトウェアをインストールしたい場合は，同一bottleにインストールする必要があるので気をつけましょう．といっても，ゲームをやりたいだけなら普通は全部別bottleで構いません．</p>
<h2 class="title">CrossOverにゲームをインストールする手順</h2>
<p>早速CrossOverに東方Projectのゲームをインストールしてみます．まずはお試しということで，サイズの小さい東方文花帖にしてみます．</p>
<p>ゲームディスクを入れ（僕はディスクユーティリティでイメージ化してあるものをマウントしました），CrossOverを起動したら，Configure -&gt; Install Softwareを選びます．</p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-3.24.17.png"><img class="aligncenter size-full wp-image-8370" title="Screen Shot 2013-05-04 at 3.24.17" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-3.24.17.png" alt="" width="304" height="110" /></a></p>
<p>なんと文花帖はCrossOverのゲームリストに既に登録されており「Touhou 9.5: Shoot the Bullet」として自動認識してくれます．なので，デフォルト設定（winxp bottle，DirectX 9を追加インストール）でInstallボタンを押します．</p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-3.24.56.png"><img class="aligncenter size-full wp-image-8371" title="Screen Shot 2013-05-04 at 3.24.56" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-3.24.56.png" alt="" width="643" height="579" /></a></p>
<p>途中でDirectXのインストールダイアログなどが出ますが，構わずOKを押してインストールしていきます．DirectXのインストール後，文花帖のインストールダイアログが出るので，もちろん開始を押してインストール（インストール先はデフォルトのまま）．</p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-3.25.44.png"><img class="aligncenter size-full wp-image-8372" title="Screen Shot 2013-05-04 at 3.25.44" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-3.25.44.png" alt="" width="353" height="138" /></a></p>
<p>インストールが完了すると，CrossOverのProgramsメニューから起動できます．</p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-3.28.41.png"><img class="aligncenter size-full wp-image-8373" title="Screen Shot 2013-05-04 at 3.28.41" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-3.28.41.png" alt="" width="596" height="161" /></a></p>
<p>ここまでがCrossOverにゲームをインストールする共通手順になります．</p>
<h2 class="title">CrossOverに東方をインストールする注意点など</h2>
<p>ここからは東方をインストール，プレイする上で知っておく必要のあることになります．</p>
<p>東方紅魔郷以外はインストール時にスタートメニューへの登録とデスクトップショートカットをするかどうかの確認がありますが，スタートメニューに登録するとCrossOverのProgramsメニューから起動できるので便利です．スタートメニューに登録しない場合，~/Library/Application Support/CrossOver/Bottles/インストールBottle名/drive_c/Program Filesを参照し，実行ファイルをダブルクリックすれば実行できます．</p>
<p>アップデートパッチを当てる場合，インストール対象と同じBottleでパッチを実行する必要があるので，CrossOverの「Configure -&gt; Manage Bottles」で対象BottleのAdvancedタブから「Open C: Drive in Finder」ボタンを押し，EXE本体のインストール先にパッチファイルをコピーして実行します．</p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-4.14.14.png"><img class="aligncenter size-full wp-image-8375" style="max-width: 100%;" title="Screen Shot 2013-05-04 at 4.14.14" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-4.14.14.png" alt="" /></a></p>
<p>アップデートパッチによってはインストールディレクトリを聞かれるので，その場合は「/Users/ユーザ名/Library/Application Support/CrossOver/Bottles/インストールBottle名/drive_c/Program Files/東方XXX」を指定します（C:\Program Files\東方XXX でも同じ）．</p>
<p>リプレイファイルを再生したい場合も同様の手順で対象Bottleのインストールディレクトリにreplayフォルダがある（無い場合は一度ゲーム中からreplayメニューを開くと作成される）ので，そこに置けば良いです．</p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.13.13.png"><img class="aligncenter size-full wp-image-8376" title="Screen Shot 2013-05-04 at 8.13.13" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.13.13.png" alt="" width="406" height="330" /></a></p>
<p>ゲームプレイについて，フルスクリーンモードでプレイすることもできますが，ウィンドウモードで起動して拡大表示して使う方が中断などがやりやすくて良いです．システム環境設定のアクセシビリティから，ズーム機能を有効にします．</p>
<p><a style="font-size: 16px;" href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.17.03.png"><img class="aligncenter size-full wp-image-8377" title="Screen Shot 2013-05-04 at 8.17.03" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.17.03.png" alt="" width="668" height="475" /></a></p>
<p>すると，Controlキーを押しながらホイールスクロールすることで，画面の任意領域を拡大することができるようになります．あとはウィンドウモードでゲームを起動し，できるだけ画面いっぱいになるようにズームしてやれば，フルスクリーンモードと同じ様な状態になります．</p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-4.17.52.png"><img class="aligncenter size-large wp-image-8378" title="Screen Shot 2013-05-04 at 4.17.52" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-4.17.52-1024x576.png" alt="" width="640" height="360" /></a></p>
<h2 class="title">各作品別動作確認状況，気づいた点など</h2>
<p>ここからは各作品別に実行した結果（動作速度，不具合の有無など）をまとめます．動作確認環境はMacBook Pro 15 Retina（Mid 2012）: CPU 2.6GHz Core i7, メモリ16GBで，動作確認時はクラムシェルモードで2台のThunderbolt Displayに出力しています．Mac OS Xのバージョンは10.8.3，CrossOverのバージョンは12.2です．</p>
<p>昔のWineやVMWareでのひどい有様を知っている人はそれでも半信半疑だと思うので，各作品のSSも貼っておきます．再現度が気になる人は眺めてみて下さい．半透明処理・エフェクト・BGM含めて問題ないです（紅魔郷を除く）．また，僕はキーボードシューターなのでゲームパッドについては良くわからないのですが，<a href="http://d.hatena.ne.jp/nakamura001/20101214/1292341589">PS3のコントローラーを使う方法</a>などがあるようです．自己責任で．</p>
<p>また，当然ですが，Wine環境で東方Projectのゲームを動かすことは公式サポート外なので，うまく動かなかったからといって神主様に文句を言ったりするのは止めましょう．むしろCrossOverのチームにリクエストを送った方が建設的です．</p>
<h2 class="title">東方紅魔郷 〜 the Embodiment of Scarlet Devil（ver 1.02hアップデート済み）</h2>
<ul>
<li>処理落ち：なし（常時60fps前後）</li>
<li>動作確認環境：Extraリプレイ</li>
<li>その他：Extraリプレイボス戦後半からBGMが歪み始め，残念な状態に．BGM以外のグラフィック・入力周りは全く問題なし．</li>
</ul>
<p>フルスクリーンモードで起動すると400fpsとか出てでバグる（既知のVSyncバグ）ので，ウィンドウモードでプレイするか，<a href="http://thwiki.info/?VsyncPatch%B2%F2%C0%E2">有志のVSyncパッチ</a>を使う必要があります．<br />
アップデートパッチは<a href="http://www16.big.or.jp/~zun/html/th06.html">ここ</a>から落として前述の手順で当てれば良いです．</p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.32.21.png"><img class="aligncenter size-large wp-image-8382" title="Screen Shot 2013-05-04 at 8.32.21" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.32.21-1024x801.png" alt="" width="640" height="500" /></a></p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.32.46.png"><img class="aligncenter size-large wp-image-8383" title="Screen Shot 2013-05-04 at 8.32.46" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.32.46-1024x805.png" alt="" width="640" height="503" /></a></p>
<h2 class="title">東方妖々夢 〜 Perfect Cherry Blossom.（ver 1.00bアップデート済み）</h2>
<ul>
<li>処理落ち：なし（常時60fps前後</li>
<li>動作確認環境：Lunaticリプレイ（6面のみ確認）</li>
<li>その他：一部グラフィックの表示残り現象が見つかった（SS参照）が，普通にプレイしていたら気づかないレベル．BGMも問題なく最後までプレイ可能．</li>
</ul>
<p>アップデートパッチは<a href="http://www16.big.or.jp/~zun/html/th07.html">ここ</a>から落とす．ファイルがlzh形式（!?）なので，Homebrewでlhaパッケージをインストールし，以下のコマンドで解凍できる．</p>
<pre class="brush: bash">$ lha x youmu_update100b.lzh
youmu_update100b.exe - Melted : ooooooooooooooooooooooooooo</pre>
<p>その後のパッチ当て手順は他と同じ．</p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.36.00.png"><img class="aligncenter size-large wp-image-8385" title="Screen Shot 2013-05-04 at 8.36.00" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.36.00-1024x795.png" alt="" width="640" height="496" /></a></p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.35.44.png"><img class="aligncenter size-large wp-image-8384" title="Screen Shot 2013-05-04 at 8.35.44" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.35.44-1024x796.png" alt="" width="640" height="497" /></a></p>
<h2 class="title">東方永夜抄 〜 Imperishable Night. （ver 1.00dアップデート済み）</h2>
<ul>
<li>処理落ち：なし（常時60fps前後）</li>
<li>動作確認環境：Lunaticリプレイ（6面のみ確認）</li>
<li>その他：BGMも問題なく最後までプレイ可能．</li>
</ul>
<p>アップデートパッチは<a href="http://www16.big.or.jp/~zun/html/th08dl.html">ここ</a>から落とす．これもlzhなので解凍方法は東方妖々夢と同じくlhaコマンドで．</p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.44.49.png"><img class="aligncenter size-large wp-image-8386" title="Screen Shot 2013-05-04 at 8.44.49" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.44.49-1024x805.png" alt="" width="640" height="503" /></a></p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.44.34.png"><img class="aligncenter size-large wp-image-8387" title="Screen Shot 2013-05-04 at 8.44.34" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.44.34-1024x805.png" alt="" width="640" height="503" /></a></p>
<h2 class="title">東方文花帖 〜 Shoot the Bullet.</h2>
<ul>
<li>処理落ち：なし（常時60fps前後）</li>
<li>動作確認環境：Stage EX 禁忌「禁じられた遊び」</li>
<li>その他：撮影時瞬間的にfpsが30前後まで落ちるが，それ以外はBGM共に問題なくプレイ可能．</li>
</ul>
<p><span style="font-size: medium;"><span style="line-height: 21.81818199157715px;"><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.48.25.png"><img class="aligncenter size-large wp-image-8389" title="Screen Shot 2013-05-04 at 8.48.25" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.48.25-1024x801.png" alt="" width="640" height="500" /></a></span></span></p>
<div>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.47.43.png"><img class="aligncenter size-large wp-image-8390" title="Screen Shot 2013-05-04 at 8.47.43" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.47.43-1024x807.png" alt="" width="640" height="504" /></a></p>
<h2 class="title">東方花映塚 〜 Phantasmagoria of Flower View.</h2>
<ul>
<li>処理落ち：なし（常時60fps前後）</li>
<li>動作確認環境：Normalプレイ（文まで確認）．ネット対戦は未確認</li>
<li>その他：BGMも問題無く最後までプレイ可能．リプレイが無かったので1プレイしてみたけどSS撮影に気を取られ文で死亡．弾速早いのは苦手ですOTL</li>
</ul>
<p><span style="font-size: medium;"><span style="line-height: 21.81818199157715px;"><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.50.25.png"><img class="aligncenter size-large wp-image-8391" title="Screen Shot 2013-05-04 at 8.50.25" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.50.25-1024x794.png" alt="" width="640" height="496" /></a></span></span><br />
<a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.50.51.png"><img class="aligncenter size-large wp-image-8392" title="Screen Shot 2013-05-04 at 8.50.51" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.50.51-1024x803.png" alt="" width="640" height="501" /></a></p>
<h2 class="title">東方風神録 〜 Mountain of Faith.</h2>
<ul>
<li>処理落ち：なし（常時60fps前後）</li>
<li>動作確認環境：Normal Allクリアまで確認</li>
<li>その他：起動直後にウィンドウがなぜか最小化されるが，Dockのアイコンをクリックすれば普通にプレイできる．</li>
</ul>
<p>replayフォルダにリプレイファイルを置いたのになぜか認識されなかったので普通にプレイして動作確認しました．数年ぶりだったけど一発Normalクリアできるあたり，風神録は難易度低めですね．</p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.52.57.png"><img class="aligncenter size-large wp-image-8393" title="Screen Shot 2013-05-04 at 8.52.57" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.52.57-1024x804.png" alt="" width="640" height="502" /></a></p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.52.45.png"><img class="aligncenter size-large wp-image-8394" title="Screen Shot 2013-05-04 at 8.52.45" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.52.45-1024x807.png" alt="" width="640" height="504" /></a></p>
<h2 class="title">東方地霊殿 〜 Subterranean Animism.</h2>
<ul>
<li>処理落ち：なし（常時60fps前後，1280&#215;960解像度にて確認）</li>
<li>動作確認環境：Lunatic 5，6面で確認</li>
<li>その他：環境設定プログラムが起動しなかった．また，起動直後にウィンドウが最小化される仕様は風神録と同じ．</li>
</ul>
<p>地霊殿からは公式で起動時に解像度が選べるので，高めの解像度でプレイできます．<br />
リプレイモード6ボスにて同期ずれを確認．拾ってきたリプレイファイルではだめでした．試しに5面を再生してみたらそちらは問題無かった（既知のバグ？）．</p>
<p>※追記：既知のバグの様です：<a href="http://www26.atwiki.jp/touhoufuguaimatome/pages/40.html">東方シリーズ不具合情報まとめWiki</a>．Twitterにて@hrm_wata先輩にご指摘頂きました</p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.54.56.png"><img class="aligncenter size-large wp-image-8395" title="Screen Shot 2013-05-04 at 8.54.56" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.54.56-1024x785.png" alt="" width="640" height="490" /></a></p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.55.12.png"><img class="aligncenter size-large wp-image-8396" title="Screen Shot 2013-05-04 at 8.55.12" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.55.12-1024x785.png" alt="" width="640" height="490" /></a></p>
<h2 class="title">東方星蓮船 〜 Undefined Fantastic Object.</h2>
<ul>
<li>処理落ち：なし（常時60fps前後，1280&#215;960解像度にて確認）</li>
<li>動作確認環境：Lunatic 4面で確認</li>
<li>その他：環境設定プログラムが起動しなかった．また，起動直後にウィンドウが最小化される仕様は風神録と同じ．</li>
</ul>
<p>星蓮船はまだAllクリアできてないのでリプレイ6面は自力でクリアするまで見ない自分ルール．この辺からの作品は買うだけ買ってほとんどプレイしてないのでこれからがんばります．</p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.58.46.png"><img class="aligncenter size-large wp-image-8397" title="Screen Shot 2013-05-04 at 8.58.46" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.58.46-1024x786.png" alt="" width="640" height="491" /></a></p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.59.07.png"><img class="aligncenter size-large wp-image-8398" title="Screen Shot 2013-05-04 at 8.59.07" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-8.59.07-1024x785.png" alt="" width="640" height="490" /></a></p>
<h2 class="title">ダブルスポイラー 〜 東方文花帖</h2>
<ul>
<li>処理落ち：なし（常時60fps前後，1280&#215;960解像度にて確認）</li>
<li>動作確認環境：Level 1の数枚で確認</li>
<li>その他：環境設定プログラムが起動しなかった．また，起動直後にウィンドウが最小化される仕様は風神録と同じ．</li>
</ul>
<p><span style="font-size: medium;"><span style="line-height: 21.81818199157715px;"><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-9.01.43.png"><img class="aligncenter size-large wp-image-8399" title="Screen Shot 2013-05-04 at 9.01.43" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-9.01.43-1024x784.png" alt="" width="640" height="490" /></a></span></span><br />
<a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-9.00.48.png"><img class="aligncenter size-large wp-image-8400" title="Screen Shot 2013-05-04 at 9.00.48" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-9.00.48-1024x787.png" alt="" width="640" height="491" /></a></p>
<h2 class="title">妖精大戦争 〜 東方三月精.</h2>
<ul>
<li>処理落ち：なし（常時60fps前後，1280&#215;960解像度にて確認）</li>
<li>動作確認環境：Normalプレイにて確認</li>
<li>その他：環境設定プログラムが起動しなかった．また，起動直後にウィンドウが最小化される仕様は風神録と同じ．</li>
</ul>
<p><span style="font-size: medium;"><span style="line-height: 21.81818199157715px;"><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-9.05.03.png"><img class="aligncenter size-large wp-image-8401" title="Screen Shot 2013-05-04 at 9.05.03" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-9.05.03-1024x786.png" alt="" width="640" height="491" /></a></span></span><br />
<a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-9.03.53.png"><img class="aligncenter size-large wp-image-8402" title="Screen Shot 2013-05-04 at 9.03.53" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-9.03.53-1024x782.png" alt="" width="640" height="488" /></a></p>
<div>
<h2 class="title">東方神霊廟 〜 Ten Desires. （ver 1.00cアップデート済み）</h2>
<ul>
<li>処理落ち：なし（常時60fps前後，1280&#215;960解像度にて確認）</li>
<li>動作確認環境：Normalプレイにて確認</li>
<li>その他：環境設定プログラムが起動しなかった．また，起動直後にウィンドウが最小化される仕様は風神録と同じ．</li>
</ul>
<p>積みゲー状態になっていたので今回初プレイ．霊界システムが良く理解できてないので後でちゃんと操作説明読もう．</p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-9.10.50.png"><img class="aligncenter size-large wp-image-8404" title="Screen Shot 2013-05-04 at 9.10.50" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-9.10.50-1024x788.png" alt="" width="640" height="492" /></a></p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-9.11.04.png"><img class="aligncenter size-large wp-image-8405" title="Screen Shot 2013-05-04 at 9.11.04" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-9.11.04-1024x788.png" alt="" width="640" height="492" /></a></p>
<p>※神霊廟だけはCrossOverのアプリケーション登録がされていないので「Other Application」としてインストールすること．setup.exeをダブルクリックして実行すると以下のウィンドウが出るので，bottleをwinxp，bottle名を「TH13」に設定して新規作成する．DirectXは神霊廟のインストーラが入れてくれるので，あとはそのままインストールすれば良い．</p>
<p><a href="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-6.58.58.png"><img class="aligncenter size-full wp-image-8403" title="Screen Shot 2013-05-04 at 6.58.58" src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/Screen-Shot-2013-05-04-at-6.58.58.png" alt="" width="668" height="604" /></a></p>
<h2 class="title">まとめ</h2>
<p>そんなわけで，CrossOverで東方をプレイする手順を紹介してみましたが，いかがでしたでしょうか？数年前はVMWareですら一部のエフェクトが表示されなかったり，弾が表示されなかったり，掛け合い文字が潰れたりして使い物にならなかったことを思えば大きな進歩だと思います．特にWineはフォント周りの問題か，プレイ不可能なレベルだったので，よくぞここ数年でここまで進化したな，という感じです．紅魔郷以外は完全に実用レベルです．これで東方やるためだけにWindows機の電源を入れなくて良くなりました:)</p>
<p>昔ほどゲームをプレイする時間も気力も無くなってしまいましたが，ちょっとした時間の合間にプレイできる環境を整えておくことで，忙しくてもそこそこプレイ時間を確保することができるかなと思いました．</p>
<p>&nbsp;</p>
<p><script charset="utf-8" type="text/javascript" src="http://ws.amazon.co.jp/widgets/q?rt=ss_mfw&amp;ServiceVersion=20070822&amp;MarketPlace=JP&amp;ID=V20070822/JP/prognagger-22/8001/2f9438d5-14e7-472a-8f90-fcb7eceadf5c">// <![CDATA[</p>
<p>// ]]&gt;</script></p>
<noscript>&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;A HREF=&#8221;http://ws.amazon.co.jp/widgets/q?rt=ss_mfw&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;ServiceVersion=20070822&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;MarketPlace=JP&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;ID=V20070822%2FJP%2Fprognagger-22%2F8001%2F2f9438d5-14e7-472a-8f90-fcb7eceadf5c&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;Operation=NoScript&#8221;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;Amazon.co.jp ウィジェット&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;/A&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;</noscript>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://techracho.bpsinc.jp/morimorihoge/2013_05_04/8369/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iptablesで鉄壁？の守りを実現する3つのTips</title>
		<link>http://techracho.bpsinc.jp/yamasita-taisuke/2013_05_01/8351</link>
		<comments>http://techracho.bpsinc.jp/yamasita-taisuke/2013_05_01/8351#comments</comments>
		<pubDate>Wed, 01 May 2013 07:48:12 +0000</pubDate>
		<dc:creator>yamasita</dc:creator>
				<category><![CDATA[サーバー/ネットワーク]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://techracho.bpsinc.jp/?p=8351</guid>
		<description><![CDATA[iptablesでサーバを守るときに知っておくと良いことを3つ紹介します 1. 接続回数を制限する(IPアドレスごと) hash_limitを使います これにより特定ホストからの大量アクセス、DoS攻撃を緩和することが可能です 例 2. 接続回数を制限する(サービスごと) limitを使って制限します これにより多数のホストからの攻撃、DDoS攻撃を緩和します limitを使った制限は全ホストが等しく制限を受けるため、ssh等に設定すべきではありません。 （攻撃を受けている間は自分たちも制限されるため） Webサーバが大量アクセスで落ちそうな場合は使えるんじゃないでしょうか？ 例 3. 接続IPアドレスを限定する IPアドレスの国別割り当てをAPNIC等から取得してコマンドを作ります この手のルールは長くなるので、ユーザー定義チェインにしたほうが見やすくなります 例 あとはこんな感じのスクリプトを用意して iptables.pl rootでこんな感じのコマンドを打てばIP制限チェインの出来上がりです # wget http://ftp.apnic.net/stats/apnic/delegated-apnic-latest \ -O - &#124; ./iptables.pl ACCEPT_IP &#124; bash 細かいパラメータや、IPアドレスについては各自調整してみて下さい]]></description>
				<content:encoded><![CDATA[<p><img src="http://techracho.bpsinc.jp/wp-content/uploads/2013/05/firewall.png" alt="" title="firewall" width="128" height="128" class="aligncenter size-full wp-image-8361" /></p>
<p>iptablesでサーバを守るときに知っておくと良いことを3つ紹介します</p>
<h2 style="font-weight: bold;font-style:italic">1. 接続回数を制限する(IPアドレスごと)</h2>
<p>hash_limitを使います<br />
これにより<b>特定ホストから</b>の大量アクセス、DoS攻撃を緩和することが可能です<br />
例<br />
<script src="https://gist.github.com/5114683.js?file=hashlimit.sh"></script></p>
<h2 style="font-weight: bold;font-style:italic">2. 接続回数を制限する(サービスごと)</h2>
<p>limitを使って制限します<br />
これにより多数のホストからの攻撃、DDoS攻撃を緩和します<br />
limitを使った制限は全ホストが等しく制限を受けるため、ssh等に設定すべきではありません。<br />
（攻撃を受けている間は自分たちも制限されるため）<br />
Webサーバが大量アクセスで落ちそうな場合は使えるんじゃないでしょうか？<br />
例<br />
<script src="https://gist.github.com/5114683.js?file=limit.sh"></script></p>
<h2 style="font-weight: bold;font-style:italic">3. 接続IPアドレスを限定する</h2>
<p>IPアドレスの国別割り当てをAPNIC等から取得してコマンドを作ります<br />
この手のルールは長くなるので、ユーザー定義チェインにしたほうが見やすくなります<br />
例<br />
<script src="https://gist.github.com/5114683.js?file=acceptip.sh"></script></p>
<p>あとはこんな感じのスクリプトを用意して<br />
iptables.pl<br />
<script src="https://gist.github.com/5114683.js?file=iptables.pl"></script></p>
<p>rootでこんな感じのコマンドを打てばIP制限チェインの出来上がりです</p>
<pre>
# wget http://ftp.apnic.net/stats/apnic/delegated-apnic-latest \
-O - | ./iptables.pl ACCEPT_IP | bash
</pre>
<p>細かいパラメータや、IPアドレスについては各自調整してみて下さい</p>
]]></content:encoded>
			<wfw:commentRss>http://techracho.bpsinc.jp/yamasita-taisuke/2013_05_01/8351/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
