<?xml version="1.0" encoding="utf-8" ?>

<?xml-stylesheet href="/tt_clown/rssxsl" type="text/xsl" media="screen"?>

<rdf:RDF
	xmlns="http://purl.org/rss/1.0/"
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xml:lang="ja">
<channel rdf:about="http://d.hatena.ne.jp/tt_clown/rss">
	<title>Life like a clown</title>
	<link>http://d.hatena.ne.jp/tt_clown/</link>
	<description>Life like a clown</description>
	
	<dc:creator>tt_clown</dc:creator>
	<items>
	<rdf:Seq>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/tt_clown/20130426/git_rebase"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/tt_clown/20130414/git_merge"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/tt_clown/20130412/git_management"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/tt_clown/20130328/windows_ui_icon"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/tt_clown/20120725/vusual_studio_x64"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/tt_clown/20120419/sakura_vps_redmine"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/tt_clown/20111116/inno_setup_templates"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/tt_clown/20110917/ghostscript_options"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/tt_clown/20110916/ghostscript_embed_font"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/tt_clown/20110908/ghostscript_pdfx"/>
	</rdf:Seq>
	</items>
</channel>



<item rdf:about="http://d.hatena.ne.jp/tt_clown/20130426/git_rebase">
	<title>[Development][Git] git rebase に関するメモ</title>
	<link>http://d.hatena.ne.jp/tt_clown/20130426/git_rebase</link>
	<description> 間が空きましたが、 git の運用指針 - Life like a clown のフォロー記事、第 2 弾。 公開リポジトリに push した commit を rebase してはいけない rebase に関しては、まだ使いどころが今一つ掴めないでいるのですが、明快な指針が一つ示されていました。 あぁ、このすば</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>間が空きましたが、<a href="http://d.hatena.ne.jp/tt_clown/20130412/git_management" target="_blank"> git の運用指針 - Life like a clown</a> のフォロー記事、第 2 弾。</p>
			<h4> 公開リポジトリに push した commit を rebase してはいけない</h4>
			<p>rebase に関しては、まだ使いどころが今一つ掴めないでいるのですが、明快な指針が一つ示されていました。</p>
			<blockquote title="Git - Book" cite="http://git-scm.com/book/ja/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%AA%E3%83%99%E3%83%BC%E3%82%B9">
			<p>あぁ、このすばらしいリベース機能。しかし、残念ながら欠点もあります。その欠点はほんの一行でまとめることができます。</p>
			<p><strong>公開リポジトリにプッシュしたコミットをリベースしてはいけない</strong></p>
			<p>この指針に従っている限り、すべてはうまく進みます。もしこれを守らなければ、あなたは嫌われ者となり、友人や家族からも軽蔑されることになるでしょう。</p>
			<cite><a href="http://git-scm.com/book/ja/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%AA%E3%83%99%E3%83%BC%E3%82%B9" target="_blank">Git - リベース</a></cite></blockquote>
			<p>なぜ、公開リポジトリに push した commit に対して、後から rebase を行ってはいけないのかと言うと、「（rebase で作られた commit は元の commit と同内容でも別の commit となるため）rebase してしまうと push できなくなる」と言う理由のようです。何故、push できなくなってしまうのかについては <a href="http://www.slideshare.net/kotas/git-15276118" target="_blank">こわくない Git</a> と言うスライドで分かりやすく解説されていますので、このスライドの 104 〜 146 枚目を何度か追うと理解できると思います。</p>
			<p>逆に、公開リポジトリに push する前であれば rebase を使って統合ブランチに追従するのは問題ないようです。<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798023809/cielquis-blog-22/ref=nosim/:title=" target="_blank">http://www.amazon.co.jp/exec/obidos/ASIN/4798023809/cielquis-blog-22/ref=nosim/:title=</a>入門 Git] では、rebase 等を使用して自分の修正履歴を綺麗に整理して公開できる事も git のメリットの一つとして挙げられていました。</p>
			<blockquote title="入門 Git - Chapter 6. グループで使う（p.93）" cite="http://www.amazon.co.jp/exec/obidos/ASIN/4798023809/cielquis-blog-22/ref=nosim/">
			<p>しかし、git では、個人の作業リポジトリがあるために、<strong>共用リポジトリに push して他のメンバーに結果を見せるまでは</strong>、今まで見てきたように rebase したり commit --amend したり reset --hard したり等の方法で歴史を訂正することができます。従来の集中型のシステムと異なり、間違いや失敗をおそれずに、自分の作業の都合だけで区切りの良い時点でコミットして行くことができ、また、自分の作ってきた歴史を綺麗に整理し直して見やすくしてから他人に自分の仕事の結果を見せることができるのが、大きな利点です。</p>
			<p>※強調はブログ筆者によるもの</p>
			<cite><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798023809/cielquis-blog-22/ref=nosim/" target="_blank">入門 Git - Chapter 6. グループで使う（p.93）</a></cite></blockquote>
			<h4> rebase の使いどころ</h4>
			<p>さて、rebase の使いどころに関してですが、<a href="https://gist.github.com/katzchang/4126092" target="_blank">rebaseはコミットグラフを綺麗にするためじゃなくてffマージをするためにあるのであった</a> と言う記事がありました。この記事自体は「<strong>FastForward</strong> マージの利点」に主眼が置かれて書かれているので直接的には関係ないのですが、そう言った <strong>FastForward</strong> マージの恩恵にあやかるために rebase が存在しているのかな、と言う気がします。また、<a href="http://git-scm.com/book/ja/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%AA%E3%83%99%E3%83%BC%E3%82%B9" target="_blank">Git - リベース</a> での解説においても FastForward できるようにする事を念頭に rebase を実行している感が見て取れます。</p>
			<p>一方で、<a href="http://d.hatena.ne.jp/tt_clown/20130414/git_merge" target="_blank"> git merge に関するメモ - Life like a clown</a> でも書いたように、現在の git の運用においては「基本的に Non-FastForward でマージする」と言う方法が割とポピュラーになっているようなので、そう言った意味でも rebase を使うタイミングと言うのは、感覚的になかなか掴めないでいます。</p>
			<p><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798023809/cielquis-blog-22/ref=nosim/" target="_blank">入門 Git</a> では、多人数で開発を行う場合の「トピックブランチからメインブランチへの統合作業」に際して、rebase に関する検討が記載されていました。</p>
			<blockquote title="入門 Git - Chapter 8. 分散環境とブランチの関連（p.118-120）" cite="http://www.amazon.co.jp/exec/obidos/ASIN/4798023809/cielquis-blog-22/ref=nosim/">
			<p>プロジェクトによっては、バージョン管理方針として、新しい変更が常に最新の状態から始まっていることを要求するものもあります（例えば X.org プロジェクトは最初に git を取り入れた頃からそのような方針を取っています）。</p>
			<p>このような場合には、完成したブランチをまとめる前に、もう 1 ステップ、トピックブランチでした仕事の歴史のクリーンアップが必要になります。</p>
			<p>…（中略）…</p>
			<p>一般的に言って、プロジェクト全体で新しい変更が必ず最新状態の上にリベースされていることを要求するのはプロジェクトメンバーにとって不要な負担を強いることになり、また、トピックをリベースする時に競合解決を間違った場合に、どこにもそのトピックの正しく動くバージョンが残っていないという状況を引き起こすことになるので、メリットはあまりありません。</p>
			<p>しかしながら、プロジェクト内でのメンバーの役割分担がきちんと行われていれば、完成したトピックが、そのトピックを開発中に共用リポジトリで並行して他のメンバーによって進められていた変更と意味的にもテキスト的にも重なることはほとんどないはずで、そうした場合には、後から完成したトピックを統合する前にリベースして最終的に記録される歴史を直線化することで、後から開発履歴を調べる際にスキップしないといけない不要なマージコミットを少なくすることができます。</p>
			<p>プロジェクト全体の方針が新しい変更が必ず最新状態の上にリベースされていることを要求していなくても、トピックを新しく統合する前にリベースが容易に可能であればリベースするようにするのが、共同作業に参加するプロジェクトメンバーの良いしつけであると言えるでしょう。</p>
			<cite><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798023809/cielquis-blog-22/ref=nosim/" target="_blank">入門 Git - Chapter 8. 分散環境とブランチの関連（p.118-120）</a></cite></blockquote>
			<p>ちょっとまだ理解不足な部分も多いのですが、例えば、以下のような話でしょうか。</p>
			<p><a href="http://f.hatena.ne.jp/tt_clown/20130426173709" class="hatena-fotolife" target="_blank"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/t/tt_clown/20130426/20130426173709.png" alt="f:id:tt_clown:20130426173709p:image" title="f:id:tt_clown:20130426173709p:image" class="hatena-fotolife"></a></p>
			<p><a href="http://f.hatena.ne.jp/tt_clown/20130426173710" class="hatena-fotolife" target="_blank"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/t/tt_clown/20130426/20130426173710.png" alt="f:id:tt_clown:20130426173710p:image" title="f:id:tt_clown:20130426173710p:image" class="hatena-fotolife"></a></p>
			<p><a href="http://f.hatena.ne.jp/tt_clown/20130426173711" class="hatena-fotolife" target="_blank"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/t/tt_clown/20130426/20130426173711.png" alt="f:id:tt_clown:20130426173711p:image" title="f:id:tt_clown:20130426173711p:image" class="hatena-fotolife"></a></p>
			<p>Non-FastForward によるマージを基本方針としている場合でも、容易に rebase 可能（≒コンフリクション無で rebase 可能？）な時は rebase してから merge すると、後から歴史を見た時や巻き戻す時に楽になると言う事が有り得るかもしれません。ただ、まだもやもやしてる部分もあるので、しばらくは「<strong>公開リポジトリにプッシュしたコミットをリベースしてはいけない</strong>」と言う指針のみ頭に入れて、試行錯誤して行こうかと思います。</p>
			<h4> Related Pages</h4>

			<ul>
				<li> <a href="http://git-scm.com/book/ja" target="_blank">Git - Book</a></li>
				<li> <a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798023809/cielquis-blog-22/ref=nosim/" target="_blank">入門Git, 濱野 純</a></li>
				<li> <a href="http://www.slideshare.net/kotas/git-15276118" target="_blank">こわくない Git</a></li>
				<li> <a href="https://gist.github.com/katzchang/4126092" target="_blank">rebaseはコミットグラフを綺麗にするためじゃなくてffマージをするためにあるのであった</a></li>
			</ul>
		</div>
]]></content:encoded>

	<dc:creator>tt_clown</dc:creator>
	<dc:date>2013-04-26</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/tt_clown/20130414/git_merge">
	<title>[Development][Git] git merge に関するメモ</title>
	<link>http://d.hatena.ne.jp/tt_clown/20130414/git_merge</link>
	<description> 前回、 git の運用指針 - Life like a clown と言う記事を書きましたが、git の事をよく理解しない状態のまま取り急ぎ作成したために、やはりいろいろとまずい所があったようです*1。指摘された点としては、「merge や rebase の理解がまずい」、「git-flow はしんどいから </description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>前回、<a href="http://d.hatena.ne.jp/tt_clown/20130412/git_management" target="_blank"> git の運用指針 - Life like a clown</a> と言う記事を書きましたが、git の事をよく理解しない状態のまま取り急ぎ作成したために、やはりいろいろとまずい所があったようです<span class="footnote"><a href="/tt_clown/#f1" name="fn1" title="特に、後でいろいろ資料を読んでいるうちに rebase 辺りの部分は危険そうな予感がしたので、取り消して保留としています">*1</a></span>。指摘された点としては、「merge や rebase の理解がまずい」、「<a href="http://www.oreilly.co.jp/community/blog/2011/11/branch-model-with-git-flow.html" target="_blank">git-flow</a> はしんどいから <a href="https://gist.github.com/Gab-km/3705015" target="_blank">GitHub Flow</a> の方が良い」辺りがありました。これらに関しては一つずつ調べながら、自分が理解した範囲で一度まとめてみようと思います。取りあえず、今回は git merge から。</p>
			<p>尚、merge や rebase について調べていると <a href="http://www.slideshare.net/kotas/git-15276118" target="_blank">こわくない Git</a> と言う非常に分かりやすくて良い資料（スライド）が見つかりました。git 上で何らかのブランチ戦略を取って開発を行う場合、ひとまずこの資料に目を通す（通させる）と良いかもしれません。</p>
			<h4> git merge (Non Fast-Forward) 概要</h4>
			<p>git merege の概要に関しては <a href="http://git-scm.com/book/ja/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%A8%E3%83%9E%E3%83%BC%E3%82%B8%E3%81%AE%E5%9F%BA%E6%9C%AC" target="_blank">Git - ブランチとマージの基本</a> に詳細な説明がありました。尚、git では下記の iss53 のような「何らかの機能追加や修正のために一時的に作成されたリポジトリ」を<strong>トピックブランチ</strong>と呼ぶそうです。また、下記の図のように git では一連のコミットの履歴を有向グラフで表現する事が多く、これを<strong>コミットグラフ</strong>（<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798023809/cielquis-blog-22/ref=nosim/" target="_blank">入門 Git</a> ではコミット家系図 (commit ancestry graph) と表記）などと呼んだりもするようです。</p>
			<blockquote title="Git - Book" cite="http://git-scm.com/book/ja/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%A8%E3%83%9E%E3%83%BC%E3%82%B8%E3%81%AE%E5%9F%BA%E6%9C%AC">
			<p>マージ先のコミットがマージ元のコミットの直系の先祖ではないため、Git 側でちょっとした処理が必要だったのです。ここでは、各ブランチが指すふたつのスナップショットとそれらの共通の先祖との間で三方向のマージを行いました。図 3-16 に、今回のマージで使用した三つのスナップショットを示します。</p>
			<p><a target="_blank" href="http://git-scm.com/figures/18333fig0316-tn.png"><img width="450" src="http://cdn-ak.f.st-hatena.com/images/fotolife/t/tt_clown/20130414/20130414014616.png"></a></p>
			<p>単にブランチのポインタを先に進めるのではなく、Git はこの三方向のマージ結果から新たなスナップショットを作成し、それを指す新しいコミットを自動作成します (図 3-17 を参照ください)。これはマージコミットと呼ばれ、複数の親を持つ特別なコミットとなります。</p>
			<p>マージの基点として使用する共通の先祖を Git が自動的に判別するというのが特筆すべき点です。CVS や Subversion (バージョン 1.5 より前のもの) は、マージの基点となるポイントを自分で見つける必要があります。これにより、他のシステムに比べて Git のマージが非常に簡単なものとなっているのです。</p>
			<p><a target="_blank" href="http://git-scm.com/figures/18333fig0317-tn.png"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/t/tt_clown/20130414/20130414014617.png"></a></p>
			<p>これで、今までの作業がマージできました。</p>
			<cite><a href="http://git-scm.com/book/ja/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%A8%E3%83%9E%E3%83%BC%E3%82%B8%E3%81%AE%E5%9F%BA%E6%9C%AC" target="_blank">Git - ブランチとマージの基本</a></cite></blockquote>			<p>これらの記述を読んで、最初に思った事は「自分が思っているよりもはるかに賢いんだな」と言う事でした。前回の記事で「トピックブランチの修正中にメインブランチ (develop) に何らかの修正が加えられた場合、それを直ちにトピックブランチにも反映する」と言う指針を立てたのは、<strong>できるだけ早い段階で修正を反映しておかなければ（トピックブランチからメインブランチへの）マージ時に何か変な事<span class="footnote"><a href="/tt_clown/#f2" name="fn2" title="例えば、メインブランチ側で修正したものをトピックブランチで再修正＝削除したと見なされて、修正をなかった事にされるのではないか、とか。">*2</a></span>になるのではないか、と言う不安</strong>からでした。「マージがなんとなく怖い」と言う <a href="http://www.slideshare.net/kotas/git-15276118" target="_blank">こわくない Git</a> で紹介されていた git 初心者の心理そのまま、と言う感じです（苦笑）。</p>
			<p>しかし、上記の説明やその他の記事を読んでいるうちに、（同じファイルが修正された等の）コンフリクトが発生しそうな場合や修正箇所が該当のトピックブランチの挙動にも関わってくる（トピックブランチでの開発を進める上でメインブランチの修正が必要）場合を除けば、該当のトピックブランチで修正している間は、メインブランチの変更は無視しても構わないのだなと言う気になりました。</p>
			<h4> マージは常に Non Fast-Forward でと言う議論</h4>
			<p>git に関する資料を読んでいて、気になっていた事の一つに「マージは常に <strong>Non Fast-Forward</strong> で行う (<span class="code">git merge -no-ff &#60;branch&#62;)</span>」と言う規則を設けている事が多い、と言うものがありました。</p>			<p><a href="http://www.slideshare.net/kotas/git-15276118" target="_blank">こわくない Git</a> では、<strong>Fast-Forward</strong> によるマージの弊害として、以下の 2 点が挙げられていました<span class="footnote"><a href="/tt_clown/#f3" name="fn3" title="尚、Fast-Forward によるマージの利点に関しては、[https://gist.github.com/katzchang/4126092:title] や [http://kotas.hatenablog.jp/entry/2012/11/22/000046:title] 等で言及がありました。">*3</a></span>。</p>

			<ol>
				<li> 「ブランチをマージした」という事実が歴史（コミットグラフ）に残らない</li>
				<li> 「ブランチのマージ」を取り消しづらい</li>
			</ol>
			<p>その他、<a href="http://d.hatena.ne.jp/hiratara/20121107/1352284754" target="_blank">git log --first-parent</a> と言うコマンドを用いて「修正履歴を見やすくする」と言う事を考えた場合にも <strong>Non Fast-Forward</strong> によるマージは必要と言う意見がありましたが、いずれに関しても、<strong>ある機能に関わる修正（コミット）がどこからどこまでなのかを分かりやすくする、と言う事が、実際の開発・運用に関しては重要になってくる</strong>場面も多いため、そう言った戦略が取られるようです。</p>
			<p>これは個人的な話ですが、git に関する各種解説を読んでいるうちに「git においては、できるだけコミットグラフを一直線に保つことが良いとされているんだ。だから、可能であれば各種コマンド （Fast-Forward の merge や rebase）を用いて早い段階でコミットグラフを一直線にすべきだ」と言う気になっていました。</p>
			<p>しかし、git （と言うか VCS）の目的はあくまで「多人数による開発のための管理や不意の事態（機能の逆戻り等）への対応」をしやすくする事にあるので、そう言った事を考慮せずに「コミットグラフに一直線に保つかどうか」に固執すると言うのは本質からずれる、と言う感じもします。なかなか難しい問題ですが、「実際の開発・運用においては何がベストか」をよく検討して指針を立てられるようにしていきたいと思います。</p>
			<h4> git merge に関する指針（未完成）</h4>

			<ul>
				<li> トピックブランチで修正中は、基本的には、メインブランチへの修正は無視（保留）して良い。</li>
				<li> トピックブランチからメインブランチへのマージは、基本的には、Non Fast-Forward で行う（修正量的に軽度のバグフィックスを行う場合は、Fast-Forward でも良い？ような気もするが、要検討）。</li>
				<li> メインブランチの修正がトピックブランチでも必要になった場合は、どうやって取り込む？普通に <span class="code">git merge &#60;main-branch&#62;</span> とか？</li>
			</ul>
			<blockquote>
			<div class="twitter-detail twitter-detail-left">
  <div class="twitter-detail-user">
    <a class="twitter-user-screen-name" href="http://twitter.com/ruedap">
      <img src="http://a0.twimg.com/profile_images/192828388/ruedap_twitter_icon_normal.png" alt="ruedap" height="48" width="48">
    </a>
  </div>
  <div class="twitter-detail-tweet">
    <p class="twitter-detail-text">
      自分は今のところ、remoteにpushしてない手元だけのトピックブランチはrebaseを使ってmasterに追従しておいて、一度でもremoteにpush(pull req)したらそれ以降はmergeを使う、としてます。 <a class="twitter-tweet-url" href="http://t.co/tteSN24tIe" target="_top"><span>URL</span></a>
    </p>
    <p class="twitter-detail-info">
      <a href="http://twitter.com/ruedap/status/323613092917436416" class="twitter-detail-info-permalink"><span class="twitter-detail-info-date">2013-04-15</span> <span class="twitter-detail-info-time">10:45:48</span></a> <span class="twitter-detail-info-source">via <a href="http://www.hatena.ne.jp/guide/twitter" rel="nofollow">Hatena</a></span>
    </p>
  </div>
</div>

			</blockquote>
			<h4> Related Pages</h4>

			<ul>
				<li> <a href="http://git-scm.com/book/ja" target="_blank">Git - Book</a></li>
				<li> <a href="http://www.slideshare.net/kotas/git-15276118" target="_blank">こわくない Git</a></li>
				<li> <a href="http://kotas.hatenablog.jp/entry/2012/11/22/000046" target="_blank">「こわくない Git」というスライドを発表しました - kotas.tech</a></li>
				<li> <a href="https://gist.github.com/katzchang/4126092" target="_blank">rebaseはコミットグラフを綺麗にするためじゃなくてffマージをするためにあるのであった</a></li>
			</ul>
		</div>
		<div class="footnote">
			<p class="footnote"><a href="/tt_clown/#fn1" name="f1">*1</a>：特に、後でいろいろ資料を読んでいるうちに rebase 辺りの部分は危険そうな予感がしたので、取り消して保留としています</p>
			<p class="footnote"><a href="/tt_clown/#fn2" name="f2">*2</a>：例えば、メインブランチ側で修正したものをトピックブランチで再修正＝削除したと見なされて、修正をなかった事にされるのではないか、とか。</p>
			<p class="footnote"><a href="/tt_clown/#fn3" name="f3">*3</a>：尚、<strong>Fast-Forward</strong> によるマージの利点に関しては、<a href="https://gist.github.com/katzchang/4126092" target="_blank">rebaseはコミットグラフを綺麗にするためじゃなくてffマージをするためにあるのであった</a> や <a href="http://kotas.hatenablog.jp/entry/2012/11/22/000046" target="_blank">「こわくない Git」というスライドを発表しました - kotas.tech</a> 等で言及がありました。</p>
		</div>
]]></content:encoded>

	<dc:creator>tt_clown</dc:creator>
	<dc:date>2013-04-14</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/tt_clown/20130412/git_management">
	<title>[Development][Git] git の運用指針</title>
	<link>http://d.hatena.ne.jp/tt_clown/20130412/git_management</link>
	<description> ソフトウェア開発に関しては、これまでほぼ一人で完結していた*1ので git の運用方法もかなり適当だったのですが（ただのコミットマシーン状態）、今回、同一プロジェクトに対して複数人でコミットしていく形になっているので、その状態だとやはりまずいなと言う気がしてき</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>ソフトウェア開発に関しては、これまでほぼ一人で完結していた<span class="footnote"><a href="/tt_clown/#f1" name="fn1" title="複数人で作業をする場合も、プロジェクト自体が違う事がほとんどだった。">*1</a></span>ので git の運用方法もかなり適当だったのですが（ただのコミットマシーン状態）、今回、同一プロジェクトに対して複数人でコミットしていく形になっているので、その状態だとやはりまずいなと言う気がしてきました。ググっていると「なるほど」と思う記事もたくさんあったので、それらの記事を元に自分のプロジェクトの「git の運用指針」を情報共有のために記載しておこうと思います。</p>
			<h4> 前提</h4>
			<p>まず始めに、現在のプロジェクトの状況は下記のようになっています。</p>

			<ul>
				<li> 開発は 1 人のメインコミッタ（私）と数人のサポートコミッタ（アルバイト等）で行われる</li>
				<li> メインコミッタはフルタイム、サポートコミッタは週に数時間〜10時間程度の勤務形態</li>
				<li> サポートコミッタに対しては、基本的に 1 機能（1 チケット）を 1 人で完結するように作業を配分するが、時間的な兼ね合いもあり、作業途中でサポートコミッタからメインコミッタに作業を引き継ぐ場合もある</li>
			</ul>
			<h4> git-flow によるブランチ管理</h4>
			<p>git の運用についてググっていると、「git-flow」と言う単語をぽつぽつ目にしました。git-flow とは「ブランチモデル（ブランチの切り方）」を表しているそうです。これに関しては、<a href="http://www.slideshare.net/KatokichiSoft/git-flow-16616440" target="_blank">Git flowの活用事例</a> によくまとまっている図が掲載されていました。</p>
			<blockquote title="Git flow の活用事例（17/63）" cite="http://www.slideshare.net/KatokichiSoft/git-flow-16616440">
			<p><strong>2 系統ブランチと命名規則</strong></p>
			<p><a href="http://f.hatena.ne.jp/tt_clown/20130412112642" class="hatena-fotolife" target="_blank"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/t/tt_clown/20130412/20130412112642.png" alt="f:id:tt_clown:20130412112642p:image:w600" title="f:id:tt_clown:20130412112642p:image:w600" class="hatena-fotolife" width="600"></a></p>
			<cite><a href="http://www.slideshare.net/KatokichiSoft/git-flow-16616440" target="_blank">Git flow の活用事例（17/63）</a></cite></blockquote>
			<p>上記を参考に、自分のプロジェクトでのブランチの運用指針を記載します。基本的な指針として、開発時はメインブランチを develop とします。何らかの機能を追加・修正する際には develop ブランチから派生ブランチを作成し、作成したブランチ上で作業を行います。<strong>develop ブランチ上では、決して作業を進めてはいけません。</strong></p>
			<ol>
				<li> サポートコミッタは、開発作業としてチケット<span class="footnote"><a href="/tt_clown/#f2" name="fn2" title="チケットは Redmine で管理しています。">*2</a></span>を割り当てられたら、まず feature/&#60;ticket&#62; と言う形（&#60;ticket&#62; は修正する機能を表す適当な名前）で develop ブランチから派生ブランチを作成します。<br><span class="code">git checkout -b feature/&#60;ticket&#62; develop</span><br>複数のチケットを 1 日で終了させるケースも考えられますが、1 日の作業は基本的には 1 つの派生ブランチで行う事とします（名前は適当に考える）。</li>
				<li> サポートコミッタは、1 日の作業の終わりの際には、どんなに不完全であったとしても作業していた派生ブランチをリモートリポジトリへ push します。<br><span class="code">git push origin feature/&#60;ticket&#62;</span><br>作業が完結しなかった場合は、未実装項目や問題点等を該当チケットのコメント欄、または口頭等で報告して作業を終了します。</li>
				<li> メインコミッタは、リモートリポジトリに push された派生ブランチを取得し、レビュー・修正等を行った後、develop ブランチにマージします。作業が完了した場合は、該当ブランチは削除します。<br><span class="code">git checkout develop<br>git merge feature/&#60;ticket&#62;<br>git branch -d feature/&#60;ticket&#62;<br>git push origin :feature/&#60;ticket&#62;</span></li>
				<li> サポートコミッタは、次回の勤務時に前回 push したブランチがリモートリポジトリにまだ残っていた場合は、引き続きそのブランチで作業を行います。<del datetime="2013-04-14T02:10:54+09:00">その際、作業の開始時に develop ブランチの内容を比較し、コミットが進んでいた場合は rebase してから作業を再開します。</del> rebase する、と言う部分は保留とします。<br><span class="code">git fetch<br>git checkout develop<br>git merge origin/develop<br>git checkout feature/&#60;ticket&#62;<br>git merge origin/feature/&#60;ticket&#62;<br><del datetime="2013-04-14T02:10:54+09:00">git rebase develop</del></span><br>リモートリポジトリから各ブランチの最新の内容を反映<del datetime="2013-04-14T02:13:57+09:00">した後、develop ブランチを rebase できればいいです</del>。git pull でも良いのですが、変なブランチにマージしてしまいそうなので上記としています（後述）。</li>
			</ol>
			<h4> その他</h4>
			<p>現時点で自分が気になっている点について記述していきます。精査している訳ではないので、内容は随時、加筆・修正されていきます。</p>
			<h5> git merege</h5>
			<p><a href="http://d.hatena.ne.jp/tt_clown/20130414/git_merge" target="_blank"> git merge に関するメモ - Life like a clown</a> を参照して下さい。</p>
			<h5> git rebase</h5>
			<p><a href="http://d.hatena.ne.jp/tt_clown/20130426/git_rebase" target="_blank"> git rebase に関するメモ - Life like a clown</a> を参照して下さい。</p>
			<h5> git add</h5>
			<p>よくあるのが「git add . ってやったらサイズの大きなゴミファイルがリポジトリに紛れ込んでしまった」と言うものがあります。この運用方針を決めようと思ったのも、これに近い事例が原因でした。一応、.gitignore でいろいろフィルタリングしてるので多くの場合では適当に add しても大丈夫なのですが、漏れがあったりする事もあるので、add する際には<strong>必要なファイルのみを新たに追加 (git add) する</strong>と言う事を心掛けて下さい。</p>
			<h5> git pull</h5>
			<p>git pull の挙動がよく分かってなかったのですが、下記の記事を読んで何となく分かってきました。</p>

			<ul>
				<li> <a href="http://dqn.sakusakutto.jp/2012/11/git_pull.html" target="_blank">Git pullを使うべきでない３つの理由 - DQNEO起業日記</a></li>
				<li> <a href="http://d.hatena.ne.jp/hokaccha/20120404/1333507076" target="_blank">git pullの詳細な挙動を追ってみる - hokaccha.hamalog v2</a></li>
			</ul>
			<p>上記でも少し触れましたが、複数のブランチを用いて開発を進める場合、現在のローカルブランチの確認を怠ってうっかり「git pull origin feature/&#60;ticket&#62;」とかやったりすると、develop ブランチとかにマージしてしまったりして阿鼻叫喚になりそうな予感がしました。そう言えば、新しいリモートブランチを持ってくる際には、私もよく嵌っていました……</p>
			<blockquote title="hokaccha.hamalog v2" cite="http://d.hatena.ne.jp/hokaccha/20120404/1333507076">

			<ul>
				<li> hogeというリモートブランチをローカルのhogeブランチにもってきたい</li>
				<li> hogeをローカルのmasterにはマージしたくない</li>
				<li> pullでなんかこんな感じでいけそう？</li>
			</ul>
<pre>
$ git pull origin hoge:hoge
</pre>

			<p>でもこれは間違えで、なぜか今いるブランチ（master）にhogeがmergeされるし、期待してる動作じゃない。正解はこう。</p>
<pre>
$ git branch hoge origin/hoge
</pre>

			<p>もしくはチェックアウトも同時にするなら</p>
<pre>
$ git checkout -b hoge origin/hoge
</pre>

			<p>こう。</p>
			<cite><a href="http://d.hatena.ne.jp/hokaccha/20120404/1333507076" target="_blank">git pullの詳細な挙動を追ってみる - hokaccha.hamalog v2</a></cite></blockquote>
			<p>事故を防ぐ意味でも、いったん git fetch でダウンロードした後、git branch -av 等でブランチ状況を確認しながら、git checkout, git merge, git rebase 等のコマンドを利用して適切にマージ（または、rebase）して下さい。</p>
			<h4> 参考 URL</h4>
			<p>基本的な内容として、ひとまず以下に目を通してみると良いかと思います。</p>

			<ul>
				<li> <a href="http://git-scm.com/book/ja" target="_blank">Git - Book</a></li>
				<li> <a href="http://www.slideshare.net/kotas/git-15276118" target="_blank">こわくない Git</a></li>
				<li> <a href="http://d.hatena.ne.jp/idesaku/20091106/1257507849" target="_blank">Git初心者が絶対に覚えておくべきコマンド - idesaku blog</a></li>
				<li> <a href="http://blog.layer8.sh/ja/2013/04/08/best-git-commands-for-the-lonely-programmer/" target="_blank">  ぼっちプログラマがチームに入る前に知っておきたい６つの git コマンド</a></li>
			</ul>
			<p>その他（随時、更新予定）。</p>

			<ul>
				<li> <a href="http://cdn8.atwikiimg.com/git_jp/pub/Documentation.ja/user-manual.html" target="_blank">Git ユーザマニュアル (バージョン 1.5.3 以降用)</a></li>
				<li> <a href="http://www.oreilly.co.jp/community/blog/2011/11/branch-model-with-git-flow.html" target="_blank">git-flow によるブランチの管理 - O’Reilly Japan Community Blog</a></li>
				<li> <a href="http://www.slideshare.net/KatokichiSoft/git-flow-16616440" target="_blank">Git flowの活用事例</a></li>
				<li> <a href="https://gist.github.com/Gab-km/3705015" target="_blank">GitHub Flow (Japanese translation)</a></li>
				<li> <a href="http://bleis-tift.hatenablog.com/entry/20100922/1285140344" target="_blank">Git と GitHub を体験しながら身につける勉強会行ってきた - ぐるぐる?</a></li>
			</ul>
			<p>書籍情報。</p>

			<ul>
				<li> <a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798023809/cielquis-blog-22/ref=nosim/" target="_blank">入門Git, 濱野 純</a></li>
				<li> <a href="http://www.amazon.co.jp/exec/obidos/ASIN/427406767X/cielquis-blog-22/ref=nosim/" target="_blank">入門git, Travis Swicegood (著), でびあんぐる (翻訳)</a></li>
			</ul>
		</div>
		<div class="footnote">
			<p class="footnote"><a href="/tt_clown/#fn1" name="f1">*1</a>：複数人で作業をする場合も、プロジェクト自体が違う事がほとんどだった。</p>
			<p class="footnote"><a href="/tt_clown/#fn2" name="f2">*2</a>：チケットは Redmine で管理しています。</p>
		</div>
]]></content:encoded>

	<dc:creator>tt_clown</dc:creator>
	<dc:date>2013-04-12</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/tt_clown/20130328/windows_ui_icon">
	<title>[Development] Windows の標準的な UI ボタン用アイコン素材 59 種類</title>
	<link>http://d.hatena.ne.jp/tt_clown/20130328/windows_ui_icon</link>
	<description> アプリケーションを開発する際、最終的なアイコン等の UI 素材はデザイナの方に作ってもらうのですが、開発途中等で方向性が決まっていない段階では取りあえず適当なアイコンを適用して開発を進める事がしばしば存在します。この際に「取りあえずの適当なアイコン」を毎回 W</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>アプリケーションを開発する際、最終的なアイコン等の UI 素材はデザイナの方に作ってもらうのですが、開発途中等で方向性が決まっていない段階では取りあえず適当なアイコンを適用して開発を進める事がしばしば存在します。この際に「取りあえずの適当なアイコン」を毎回 Web 上で探すのがめんどうになってきたので、何か良いものがないかなぁと思っていると、自分の需要に非常によくマッチした素晴らしいアイコン素材集がありました。</p>

			<ul>
				<li> <a href="http://www.visualpharm.com/must_have_icon_set/" target="_blank">Free Must Have Windows 7 Icons from VisualPharm</a></li>
			</ul>
			<p>「開く」、「保存する」、「コピー」、「ペースト」等の Windows のソフトウェアでよくあるような UI に対して、「よく見る」ようなアイコンが一通り揃っています。微妙に足りない部分もあるにはあるのですが、開発版用としてはまずまず困らない位にまとまっています。</p>
			<p>尚、そう言った類のアイコンの一部は Windows 各種 dll (shell32.dll, imageres.dll, ...) が標準で保持しているのですが、その一覧を掲載している記事もありました。上記と合わせて使用するとアイコンで悩まなくて済みそうです。</p>

			<ul>
				<li> <a href="http://diymediahome.org/windows-icons-reference-list-with-details-locations-images/" target="_blank">Windows Icons: Reference list with details, locations &#38; images</a></li>
			</ul>
			<p>その他、上記で足りない場合は <a href="http://www.iconarchive.com/" target="_blank">Icon Archive</a> で探すと良い感じでしょうか。</p>
			<a name="seemore"></a>

			<h4> アイコン一覧</h4>
			<p>以下は、<a href="http://www.visualpharm.com/must_have_icon_set/" target="_blank">Free Must Have Windows 7 Icons from VisualPharm</a> でダウンロードできるアイコンの一覧です。</p>
			<p><div style="text-align:center;margin-top:2em"><a target="_blank" href="http://www.visualpharm.com/must_have_icon_set/"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/t/tt_clown/20130328/20130328123930.jpg"></a></div></p>
			<h4> Related Pages</h4>

			<ul>
				<li> <a href="http://www.visualpharm.com/must_have_icon_set/" target="_blank">Free Must Have Windows 7 Icons from VisualPharm</a></li>
				<li> <a href="http://commons.wikimedia.org/wiki/Crystal_Clear" target="_blank">Crystal Clear - Wikimedia Commons</a> (from <a href="http://b.hatena.ne.jp/teramako/">b:id:teramako</a>)</li>
				<li> <a href="http://diymediahome.org/windows-icons-reference-list-with-details-locations-images/" target="_blank">Windows Icons: Reference list with details, locations &#38; images</a></li>
				<li> <a href="http://www.iconarchive.com/" target="_blank">Icon Archive - Search 436,218 free icons, desktop icons, download icons, social icons, xp icons, vista icons</a></li>
			</ul>
		</div>
]]></content:encoded>

	<dc:creator>tt_clown</dc:creator>
	<dc:date>2013-03-28</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/tt_clown/20120725/vusual_studio_x64">
	<title>[Development][C#] x64 設定中にデザイナで UserControl を表示しようとするとエラーになる</title>
	<link>http://d.hatena.ne.jp/tt_clown/20120725/vusual_studio_x64</link>
	<description> 先日、Visual C# 2010 上で UserControl を継承したコンポーネントをデザイナ経由で貼り付けていたら、「ビルドは成功するんだけど、デザイナ上で表示しようとするとエラーになる」と言う状況に遭遇しました。適当にググっていたら「作成したコンポーネントにデフォルトコン</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>先日、Visual C# 2010 上で UserControl を継承したコンポーネントをデザイナ経由で貼り付けていたら、「<strong>ビルドは成功するんだけど、デザイナ上で表示しようとするとエラーになる</strong>」と言う状況に遭遇しました。適当にググっていたら「作成したコンポーネントにデフォルトコンストラクタが定義されていない場合にエラーになる」と言う情報が結構ヒットしたので確認してみたのですが、特に問題なし。</p>
			<p>どうしたものかなと悩んでいたのですが、最終的には「x64 で開発していたから」と言うものでした。</p>
			<blockquote title="Runtime Error" cite="http://social.msdn.microsoft.com/Forums/ja/csharpgeneralja/thread/3289c3a8-8b2e-49eb-8894-b9d6a822c070">
			<p>デザイン時に、そのユーザーコントロールを含むアセンブリが Visual Studio によって読み込まれることでコントロールの配置、表示、シリアライズなどができるようになっています。しかし、Visual Studio はすでに指摘のあるとおり、x86 アプリケーションです。このため、x64 のアセンブリを読み込むことができず、エラーになっているのではないでしょうか。</p>
			<cite><a href="http://social.msdn.microsoft.com/Forums/ja/csharpgeneralja/thread/3289c3a8-8b2e-49eb-8894-b9d6a822c070" target="_blank">    x64プラットフォームで、ユーザーコントロールを使用したフォームのデザインが出来ない</a></cite></blockquote>
			<p>自分の環境が 64bit 版 Windows である事と、リリースする際には一応 x86/x64 版を分けて出している事から、普段 Visual Studio で開発する際には x64 に設定している事が多いのですが、UserControl を使用するようなコーディングを行う時は x86 か Any CPU でやる方が無難のようです。</p>
		</div>
]]></content:encoded>

	<dc:creator>tt_clown</dc:creator>
	<dc:date>2012-07-25</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/tt_clown/20120419/sakura_vps_redmine">
	<title>[Web][Development] さくら VPS に Redmine をインストールする</title>
	<link>http://d.hatena.ne.jp/tt_clown/20120419/sakura_vps_redmine</link>
	<description> 所用でさくら VPS に Redmine をインストールしていました。基本的には さくらのVPS を使いはじめる | アカベコマイリ で書かれている通りにやっていけば良いのですが、いくつか違うところもあったのでメモ。OS はデフォルト (CentOS 6.2 x86_64) のままです。 MySQL のイン</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>所用でさくら VPS に Redmine をインストールしていました。基本的には <a href="http://akabeko.me/blog/2010/09/%E3%81%95%E3%81%8F%E3%82%89%E3%81%AEvps-%E3%82%92%E4%BD%BF%E3%81%84%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B/" target="_blank">さくらのVPS を使いはじめる | アカベコマイリ</a> で書かれている通りにやっていけば良いのですが、いくつか違うところもあったのでメモ。OS はデフォルト (CentOS 6.2 x86_64) のままです。</p>
			<h4> MySQL のインストールまで</h4>
			<p>特に問題となった箇所はなし。</p>

			<ul>
				<li> <a href="http://akabeko.me/blog/2010/09/%e3%81%95%e3%81%8f%e3%82%89%e3%81%aevps-%e3%82%92%e4%bd%bf%e3%81%84%e3%81%af%e3%81%98%e3%82%81%e3%82%8b/" target="_blank">さくらのVPS を使いはじめる | アカベコマイリ</a></li>
				<li> <a href="http://akabeko.me/blog/2010/09/%e3%81%95%e3%81%8f%e3%82%89%e3%81%aevps-%e3%82%92%e4%bd%bf%e3%81%84%e3%81%af%e3%81%98%e3%82%81%e3%82%8b-2/" target="_blank">さくらのVPS を使いはじめる 2 &#8211; sudo と SSH ポート変更 | アカベコマイリ</a></li>
				<li> <a href="http://akabeko.me/blog/2010/09/%e3%81%95%e3%81%8f%e3%82%89%e3%81%aevps-%e3%82%92%e4%bd%bf%e3%81%84%e3%81%af%e3%81%98%e3%82%81%e3%82%8b-3/" target="_blank">さくらのVPS を使いはじめる 3 &#8211; iptables を設定する | アカベコマイリ</a></li>
				<li> <a href="http://akabeko.me/blog/2010/09/%e3%81%95%e3%81%8f%e3%82%89%e3%81%aevps-%e3%82%92%e4%bd%bf%e3%81%84%e3%81%af%e3%81%98%e3%82%81%e3%82%8b-4/" target="_blank">さくらのVPS を使いはじめる 4 &#8211; Apache のインストールと初期設定 | アカベコマイリ</a></li>
				<li> <a href="http://akabeko.me/blog/2010/09/%e3%81%95%e3%81%8f%e3%82%89%e3%81%aevps-%e3%82%92%e4%bd%bf%e3%81%84%e3%81%af%e3%81%98%e3%82%81%e3%82%8b-5-%e2%80%93-mysql-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%a8/" target="_blank">さくらのVPS を使いはじめる 5 ? MySQL のインストールと初期設定 | アカベコマイリ</a></li>
			</ul>
			<h4> Ruby のインストール</h4>

			<ul>
				<li> <a href="http://akabeko.me/blog/2010/09/%e3%81%95%e3%81%8f%e3%82%89%e3%81%aevps-%e3%82%92%e4%bd%bf%e3%81%84%e3%81%af%e3%81%98%e3%82%81%e3%82%8b-6/" target="_blank">さくらのVPS を使いはじめる 6 &#8211; Ruby と Passenger | アカベコマイリ</a></li>
				<li> <a href="http://akabeko.me/blog/2010/09/%e3%81%95%e3%81%8f%e3%82%89%e3%81%aevps-%e3%82%92%e4%bd%bf%e3%81%84%e3%81%af%e3%81%98%e3%82%81%e3%82%8b-7-ruby-ee%e3%80%81passenger%e3%80%81redmine/" target="_blank">さくらのVPS を使いはじめる 7 &#8211; Ruby EE、Passenger、Redmine | アカベコマイリ</a></li>
			</ul>
			<p>gem を叩くと libyaml をインストールしろと言う警告が出ました。ruby をインストールする前に、libyaml と libyaml-devel をインストールしておく必要があるようです。</p>
<pre>
# yum install libyaml
# yum install libyaml-devel
</pre>

			<p>もう少し足りないモジュールがあったような気もしますが、まぁエラーメッセージ見て適当に yum 叩けば何とかなるレベルでした。後、この記事では Redmine のインストール中に何らかの問題に遭遇して Ruby を 1.8.7 に落としていますが、現在のバージョン (Redmine 1.4.0) だと Ruby 1.9.3 (1.9.3-p125) でも問題なくインストールできたので、特に落とす必要はないかと思います。</p>
			<h4> Redmine のインストール</h4>
			<p>Redmine のインストールは、公式ページのインストール手順を見て行いました。</p>

			<ul>
				<li> <a href="http://redmine.jp/guide/RedmineInstall/" target="_blank">    Redmineのインストール &#8212; Redmine Guide 日本語訳  </a></li>
			</ul>
			<p>まっさらな状態からやっていくと ImageMagick がインストールされておらず rmagick のインストールでコケたので、先に ImageMagick をインストールしておきます。</p>
<pre>
# yum install ImageMagick
# yum install ImageMagick-devel
</pre>

			<p>次は、bundle でコケました。エラーは pg_config がないとの事。ググると PostgreSQL 周りのモジュールのようです。めんどくさいので、後述されている postgresql と sqlite 関連のものはインストールしない設定で。</p>
<pre>
# bundle install --without development test postgresql sqlite
</pre>

			<p>最後は、MySQL のアダプタでコケました。インストール手順にもはっきりと「Ruby 1.9.x の場合は mysql2 を設定しろ」と書いてあるのに、なかなか気づけませんでした・・・人生そんなものです。</p>
			<p>config/database.yml を以下のように修正します。</p>
<pre>
production:
adapter: mysql2
database: redmine
host: localhost
username: redmine
password: my_password
</pre>

			<h4> Related Pages</h4>

			<ul>
				<li> <a href="http://redmine.jp/" target="_blank">    Redmine.JP  </a></li>
				<li> <a href="http://akabeko.me/blog/2010/09/%e3%81%95%e3%81%8f%e3%82%89%e3%81%aevps-%e3%82%92%e4%bd%bf%e3%81%84%e3%81%af%e3%81%98%e3%82%81%e3%82%8b/" target="_blank">さくらのVPS を使いはじめる | アカベコマイリ</a></li>
				<li> <a href="http://akabeko.me/blog/2010/09/%e3%81%95%e3%81%8f%e3%82%89%e3%81%aevps-%e3%82%92%e4%bd%bf%e3%81%84%e3%81%af%e3%81%98%e3%82%81%e3%82%8b-2/" target="_blank">さくらのVPS を使いはじめる 2 &#8211; sudo と SSH ポート変更 | アカベコマイリ</a></li>
				<li> <a href="http://akabeko.me/blog/2010/09/%e3%81%95%e3%81%8f%e3%82%89%e3%81%aevps-%e3%82%92%e4%bd%bf%e3%81%84%e3%81%af%e3%81%98%e3%82%81%e3%82%8b-3/" target="_blank">さくらのVPS を使いはじめる 3 &#8211; iptables を設定する | アカベコマイリ</a></li>
				<li> <a href="http://akabeko.me/blog/2010/09/%e3%81%95%e3%81%8f%e3%82%89%e3%81%aevps-%e3%82%92%e4%bd%bf%e3%81%84%e3%81%af%e3%81%98%e3%82%81%e3%82%8b-4/" target="_blank">さくらのVPS を使いはじめる 4 &#8211; Apache のインストールと初期設定 | アカベコマイリ</a></li>
				<li> <a href="http://akabeko.me/blog/2010/09/%e3%81%95%e3%81%8f%e3%82%89%e3%81%aevps-%e3%82%92%e4%bd%bf%e3%81%84%e3%81%af%e3%81%98%e3%82%81%e3%82%8b-5-%e2%80%93-mysql-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%a8/" target="_blank">さくらのVPS を使いはじめる 5 ? MySQL のインストールと初期設定 | アカベコマイリ</a></li>
				<li> <a href="http://akabeko.me/blog/2010/09/%e3%81%95%e3%81%8f%e3%82%89%e3%81%aevps-%e3%82%92%e4%bd%bf%e3%81%84%e3%81%af%e3%81%98%e3%82%81%e3%82%8b-6/" target="_blank">さくらのVPS を使いはじめる 6 &#8211; Ruby と Passenger | アカベコマイリ</a></li>
				<li> <a href="http://akabeko.me/blog/2010/09/%e3%81%95%e3%81%8f%e3%82%89%e3%81%aevps-%e3%82%92%e4%bd%bf%e3%81%84%e3%81%af%e3%81%98%e3%82%81%e3%82%8b-7-ruby-ee%e3%80%81passenger%e3%80%81redmine/" target="_blank">さくらのVPS を使いはじめる 7 &#8211; Ruby EE、Passenger、Redmine | アカベコマイリ</a></li>
				<li> <a href="http://akabeko.me/blog/2010/09/%e3%81%95%e3%81%8f%e3%82%89%e3%81%aevps-%e3%82%92%e4%bd%bf%e3%81%84%e3%81%af%e3%81%98%e3%82%81%e3%82%8b-8/" target="_blank">さくらのVPS を使いはじめる 8 &#8211; Redmine と Subversion | アカベコマイリ</a></li>
				<li> <a href="http://akabeko.me/blog/2010/12/%E3%81%95%E3%81%8F%E3%82%89%E3%81%AEvps-%E3%82%92%E4%BD%BF%E3%81%84%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B-9-phpmyadmin-%E5%B0%8E%E5%85%A5%E3%81%A8-redmine-%E6%9B%B4%E6%96%B0/" target="_blank">さくらのVPS を使いはじめる 9 &#8211; phpMyAdmin 導入と Redmine 更新 | アカベコマイリ</a></li>
				<li> <a href="http://komugi.net/archives/2012/04/18220450" target="_blank">さくらのVPS サーバ構築メモ - コムギドットネット</a></li>
				<li> <a href="http://u2k772.blog95.fc2.com/blog-entry-125.html" target="_blank">U2Kの覚え書き　redmineでチケットとかにファイルを添付した時にエラーが出た時の対処法</a></li>
			</ul>
		</div>
]]></content:encoded>

	<dc:creator>tt_clown</dc:creator>
	<dc:date>2012-04-19</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/tt_clown/20111116/inno_setup_templates">
	<title>[Development][InnoSetup] Templates for Inno Setup</title>
	<link>http://d.hatena.ne.jp/tt_clown/20111116/inno_setup_templates</link>
	<description> 最近，ちょっとしたアプリケーションのインストーラを書く機会が増えてきました．インストーラは Inno Setup で作成しているのですが，毎回，似たようなスクリプトファイルを記述するのは面倒になってきました（以前の Inno Setup 用 IDE であれば，IDE がテンプレートを自</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>最近，ちょっとしたアプリケーションのインストーラを書く機会が増えてきました．インストーラは <a href="http://www.jrsoftware.org/isinfo.php" target="_blank">Inno Setup</a> で作成しているのですが，毎回，似たようなスクリプトファイルを記述するのは面倒になってきました（以前の Inno Setup 用 IDE であれば，IDE がテンプレートを自動生成してくれたのですが，これも微妙に修正する箇所があったりなかったり）．そんな訳で，ある程度，汎用的に使っていけるテンプレート（スケルトン）用のスクリプトファイルを作成してみました．</p>
			<h4> ダウンロード</h4>
			<p><a href="https://github.com/clown/inno-templates" target="_blank">https://github.com/clown/inno-templates</a> から．使い方は，README を読むと大体分かるかと思います．README の内容をここにも記述しておきます．</p>
			<h4> ファイル構成</h4>
			<p>inno-templates では，以下のようなファイル構成を想定しています．</p>
<pre>
{#ROOT_PATH}
    + setup
        - setup.iss
        - process.iss
        - windows.iss
    + {#RESOURCE_DIR}
        + x86
            - {#APP_EXE_NAME}.exe
        + x64
            - {#APP_EXE_NAME}.exe
        - Readme.txt
        - License.txt
        - {#APP_EXE_NAME}.ico
        - ...
</pre>

			<p>アプリケーション本体は，x86/x64 両方のバージョンが存在するケースを想定して書かれていますので，どちらか一方のエディションしか用意しない場合でも，x86/x64 のフォルダを作成した上で，そのフォルダにアプリケーション本体を設置して下さい．尚，各種テキストファイル（Readme.txt, License.txt），およびアイコン画像ファイルは省略する事も可能です．詳細は，「パラメータ設定」の項目で記述します．</p>
			<h4> パラメータ設定</h4>
			<p>inno-templates では，以下のパラメータが設定されています．これらは，setup.iss の上部で定義されており，これらを変更する事によってインストーラが作成されます．</p>
<dl>
				<dt>X64_INSTALL_MODE</dt>
				<dd>必須項目です．このパラメータを 0 にすると 32bit 用のインストーラが，1 以上に設定すると 64bit 用のインストーラが作成されます．尚，上記のファイル構成に関連した注意事項として，0 に設定すると x86 フォルダ以下のファイルを 1 以上に設定すると x64 フォルダ以下のファイルを参照するようになります．</dd>
	<dt>GUID_VALUE</dt>
				<dd>必須項目です．インストーラに固有の GUID を割り当てます．開発環境として <a href="http://www.innoide.org/" target="_blank">InnoIDE</a> を使用している場合，「Inno Scripts」→「Insert GUID」メニューを選択する事により新たな GUID を生成する事ができます．</dd>
	<dt>ROOT_PATH</dt>
				<dd>必須項目です．各種スクリプトファイルやインストールするリソース群が置かれているフォルダのルートとなるパスを選択します．</dd>
	<dt>RESOURCE_DIR</dt>
				<dd>必須項目です．アプリケーション本体や各種テキストファイル等のリソースが格納されているフォルダ名を指定します．初期値には "release" が指定されています．例えば，ROOT_PATH が "C:\myproject" であった場合，setup.iss は各種リソースファイル群が "C:\myproject\release\" 以下に存在すると想定します．</dd>
	<dt>APP_NAME</dt>
				<dd>必須項目です．インストーラを作成するアプリケーションの名前を設定します．</dd>
	<dt>APP_EXE_NAME</dt>
				<dd>必須項目です．メインとなるアプリケーションの exe 名を設定します．スクリプトファイル中では {#APP_EXE_NAME}.exe と記述しています．そのため，ここで設定するファイル名は ".exe" を除いた名前となります．</dd>
	<dt>APP_VERSION</dt>
				<dd>オプションです．アプリケーションのバージョンを設定します．省略する場合は，パラメータ自体は削除せずに "" を設定して下さい．</dd>
	<dt>APP_RELEASE_YEAR</dt>
				<dd>オプションです．アプリケーションのリリース年を設定します．スクリプトファイル内では現在のところ，コピーライト表記でのみ使用しています．<br>Copyright (c) {#APP_RELEASE_YEAR} {#APP_PUBLISHER}<br>省略する場合は，パラメータ自体は削除せずに "" を設定して下さい．</dd>
	<dt>APP_PUBLISHER</dt>
				<dd>必須項目です．アプリケーションの作成者の名前を設定します．</dd>
	<dt>APP_URL</dt>
				<dd>必須項目です．アプリケーションの配布，または説明をしている Web ページの URL を指定します．<br>※APP_URL を指定しない場合，[Icons] セクションの Filename: {#APP_URL} となっている行を削除した後，パラメータ自体は削除せずに "" を設定して下さい．</dd>
	<dt>APP_LICENSE</dt>
				<dd>オプションです．アプリケーションのライセンスが記述されているファイルのファイル名を設定します．スクリプトファイル内では，このファイルは {#ROOT_PATH}\{#RESOURCE_DIR} 下に存在している事を想定しています．このファイルに記述されている内容が，インストーラ実行時の「使用許諾契約書の同意」のダイアログで表示されます．ファイルが存在しない場合は，このパラメータを削除して下さい．</dd>
	<dt>APP_README</dt>
				<dd>オプションです．アプリケーションの説明が書かれているファイルのファイル名を設定します．スクリプトファイル内では，このファイルは {#ROOT_PATH}\{#RESOURCE_DIR} 下に存在している事を想定しています．ここで設定されたファイルが，インストーラの最後に「Readme.txt を表示する」と言った選択肢として表示されます．ファイルが存在しない場合は，このパラメータを削除して下さい．</dd>
	<dt>APP_ICON</dt>
				<dd>オプションです．アプリケーションのアイコンとして使用されている画像ファイルを設定します．ここで設定された画像がインストーラのアイコンとして使用されます．ファイルが存在しない場合は，このパラメータを削除して下さい．</dd>

			</dl>
			<h4> setup.iss のデフォルトの挙動</h4>
			<h5> ファイル関連</h5>
			<p>{#APP_EXE_NAME}.exe（アプリケーション本体），および {#APP_README}（説明用のテキストファイル）がインストールされます．APP_README パラメータを削除した場合は，アプリケーション本体のみがインストールされます．</p>
			<h5> レジストリ関連</h5>
			<p>HKEY_LOCAL_MACHINE\Software\{#APP_PUBLISHER}\{#APP_NAME} 下に以下の値が設定されます．</p>

			<ul>
				<li> InstallDirectory ..... ユーザが選択したインストールフォルダ</li>
				<li> Version ..... アプリケーションのバージョン（APP_VERSION で指定した値）</li>
			</ul>
			<h5> ショートカット関連</h5>
			<p>スタートメニュの「すべてのプログラム→{#APP_PUBLISHER}→{#APP_NAME}」下に以下のショートカットが設定されます．</p>

			<ul>
				<li> アプリケーション本体 ..... {#APP_EXE_NAME}.exe を実行するショートカット</li>
				<li> Web ページへのリンク ..... {#APP_URL} で指定した URL を規定のブラウザで開くショートカット</li>
				<li> アンインストール ..... アプリケーションをアンインストールするためのプログラムへのショートカット</li>
			</ul>
			<p>また，これとは別にデスクトップにアプリケーション本体へのショートカットを作成するかどうかの</p>
			<p>オプションをダイアログで表示するように設定されています．</p>
			<h4> その他</h4>
			<p>[Code] セクションにおいてもいくつかの機能をデフォルトで実装しています．</p>
			<h5> インストールするアプリケーションが実行されているかどうかのチェック</h5>
			<p>アプリケーションをアップデートする等の理由で，既にアプリケーションがインストールされているにも関わらず，再度インストーラを実行する場合があります．そういった場合に，インストーラ起動時にアプリケーション本体が実行されているとインストールに失敗します．また，アンインストール時に置いても同じような問題が発生します．そのため，インストーラ，およびアンインストーラの起動直後にアプリケーションが実行されているかどうかをチェックし，実行されている場合は強制終了する KillProc() 関数を実装しています．</p>
			<p>尚，KillProc() 関数は，64bit 用であっても Inno Setup で生成されるインストーラプログラム自体は 32bit 版であるため 64bit 用の場合にはうまく機能しません（<a href="http://d.hatena.ne.jp/tt_clown/20110416/1302927489" target="_blank"> 32bit プロセスは 64bit プロセスを見つけられない - Life like a clown</a> 参照）．64bit 版でこの機能を実現する場合，プロセスを終了させるためだけの 64bit プログラムを作成し，そのプログラムをインストーラに含める等の回避策を取る必要があります．</p>
			<h5>  Microsoft .NET Framework ランタイムがインストールされているかどうかのチェック</h5>
			<p>Microsoft .NET Framework を用いて開発されたアプリケーションは，インストールされる環境にランタイムがインストールされてある必要があります．そのため，インストーラの起動直後にMicrosoft .NET Framework ランタイムがインストールされてあるかどうかをチェックし，インストールされていない場合にはエラーメッセージを表示する機能を実装しています．</p>
			<p>尚，この機能はデフォルトではコメントアウトされています．必要な場合は，InitializeSetup() 関数内の該当箇所のコメントアウトを解除します．</p>
			<h5> Related Pages</h5>

			<ul>
				<li> <a href="https://github.com/clown/inno-templates" target="_blank">clown/inno-templates ? GitHub</a></li>
				<li> <a href="http://www.jrsoftware.org/isinfo.php" target="_blank">Inno Setup</a></li>
				<li> <a href="http://www.innosetup.com/ishelp/" target="_blank">Inno Setup Help</a></li>
				<li> <a href="http://d.hatena.ne.jp/tt_clown/20110416/1302927489" target="_blank"> 32bit プロセスは 64bit プロセスを見つけられない - Life like a clown</a></li>
			</ul>
		</div>
]]></content:encoded>

	<dc:creator>tt_clown</dc:creator>
	<dc:date>2011-11-16</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/tt_clown/20110917/ghostscript_options">
	<title>[Development][Ghostscript] Ghostscript のオプション</title>
	<link>http://d.hatena.ne.jp/tt_clown/20110917/ghostscript_options</link>
	<description> Ghostscript のオプションのうちで分かりにくいものに -d オプションと -s オプションがあります．特に -dKey=Value の形になっているオプションに関しては，どちらを使って良いか分からない場合も多いです． -s オプションの Value はどうも「名前」を表しているようです．</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p><a href="http://pages.cs.wisc.edu/~ghost/" target="_blank">Ghostscript</a> のオプションのうちで分かりにくいものに -d オプションと -s オプションがあります．特に -dKey=Value の形になっているオプションに関しては，どちらを使って良いか分からない場合も多いです．</p>
			<p> -s オプションの Value はどうも「名前」を表しているようです．PostScript や PDF の名前には先頭に "/" (スラッシュ)が付くのですが，-sKey=Value の形でオプションを指定すると Value を「名前」と判断して Value の先頭に自動的に "/" を付加するようです．</p>
			<p>例えば，以下の 2つのオプションはどちらを指定してもまったく同じ意味になります．</p>
<pre>
-dProcessColorModel=/DeviceCMYK
-sProcessColorModel=DeviceCMYK
</pre>

			<p>以上から，Ghostscript の -s と -d オプションの使い分けは以下のようになります．</p>

			<ul>
				<li> -sDEVICE，-sOutputFile などは -s オプションとしてしか指定できない．</li>
				<li> -dKey の形になっているオプションは -s オプションでは代替不可能．</li>
				<li> -dKey=Value の形になっているオプションは，Value の先頭に "/" (スラッシュ) が付いている場合はそのスラッシュを除いた上で -s オプションで代替可能．</li>
			</ul>
			<p>Ghostscript はオプション指定の仕方で結構いろいろな事ができるようなのですが，まだまだ把握しきれていない部分が多いです．</p>
		</div>
]]></content:encoded>

	<dc:creator>tt_clown</dc:creator>
	<dc:date>2011-09-17</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/tt_clown/20110916/ghostscript_embed_font">
	<title>[Development][Ghostscript] Ghostscript のフォント埋め込みポリシー</title>
	<link>http://d.hatena.ne.jp/tt_clown/20110916/ghostscript_embed_font</link>
	<description> Ghostscript でフォント埋め込み指定した場合 (-dEmbedAllFonts=true)，Base 14 Fonts と呼ばれる基本フォント (Courier, Courier-Bold, Courier-Oblique, Courier-BoldOblique, Helvetica, Helvetica-Bold, Helvetica-Oblique, Helvetica-BoldOblique, Times-Roman, Times-</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p><a href="http://pages.cs.wisc.edu/~ghost/" target="_blank">Ghostscript</a> でフォント埋め込み指定した場合 (-dEmbedAllFonts=true)，Base 14 Fonts と呼ばれる基本フォント (Courier, Courier-Bold, Courier-Oblique, Courier-BoldOblique, Helvetica, Helvetica-Bold, Helvetica-Oblique, Helvetica-BoldOblique, Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic, Symbol, ZapfDingbats の 14個) については<strong>埋め込まない</strong>ようになっているようです．</p>
			<p>ただし，PDF/X や PDF/A と呼ばれるフォーマットの場合，これらのフォーマットの要求事項に「全てのフォントを埋め込む事」と言う指定があるため，Base 14 Fonts も埋め込まれるようです．実際，<a href="http://d.hatena.ne.jp/tt_clown/20110908/ghostscript_pdfx" target="_blank"> Ghostscript で PDF/X ファイルを作成する - Life like a clown</a> でテストした際にも，PDF/X の場合は Times-Roman フォントが埋め込まれていました．</p>
			<p>PDF/A や PDF/X 以外の普通の PDF 形式でも全てのフォーマットを埋め込みたい場合には，以下のコードを修正する事で可能になるようです．</p>
			<blockquote title="bitly | Page Not Found | 404" cite="http://bit.ly/oXfUxH">
			<h5>欧文基本14書体を PDF に埋め込むには</h5>
			<p>Ghostscript は、標準では PostScript Level 1 欧文基本14書体を PDF に埋め込まない。これが好ましくない場合には以下のようにする。</p>
<pre>
&#91;/opt/local/share/ghostscript/9.02/Resource/Init/gs_pdfwr.ps]
...
/.standardfonts &#91;
%  /Courier /Courier-Bold /Courier-Oblique /Courier-BoldOblique
%  /Helvetica /Helvetica-Bold /Helvetica-Oblique /Helvetica-BoldOblique
%  /Times-Roman /Times-Bold /Times-Italic /Times-BoldItalic
%  /Symbol /ZapfDingbats
] readonly def
...
</pre>

			<cite><a href="http://bit.ly/oXfUxH" target="_blank">Beginning OS X Lion/運用編 - Beginning OS X</a></cite></blockquote>
			<p>ただし，Resource/Init/* にあたるファイル群は，Windows 版のオリジナル Ghostscript だとバイナリとして埋め込まれてる？ようなので，Windows 版でこの修正を行う場合には，恐らく，Ghostscript 自体を再ビルドする必要があります．尚，<a href="http://auemath.aichi-edu.ac.jp/~khotta/ghost/" target="_blank">日本語版 Ghostscript</a> と呼ばれている修正バージョンでは，Resource/Init/* のファイルを分離して再ビルドしているようなので，こちらを使用する場合には該当する PostScript ファイルを修正するだけで変更できるようです．</p>
			<h5> Related Pages</h5>

			<ul>
				<li> <a href="http://ja.wikipedia.org/wiki/PDF/A" target="_blank">PDF/A - Wikipadia</a></li>
				<li> <a href="http://ja.wikipedia.org/wiki/PDF/X" target="_blank">PDF/X - Wikipedia</a></li>
			</ul>
		</div>
]]></content:encoded>

	<dc:creator>tt_clown</dc:creator>
	<dc:date>2011-09-16</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/tt_clown/20110908/ghostscript_pdfx">
	<title>[Development][Ghostscript] Ghostscript で PDF/X ファイルを作成する</title>
	<link>http://d.hatena.ne.jp/tt_clown/20110908/ghostscript_pdfx</link>
	<description> Ghostscript で PDF/X ファイルを作成するには，-dPDFX オプションを付ければ良いようです．ただし，PDF/X には CMYK じゃないとダメ等の制限があるので，実際には以下のような設定が必要になります． -sDEVICE=pdfwrite を指定する．あるいは，ps2pdf スクリプトを使用して</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p><a href="http://pages.cs.wisc.edu/~ghost/" target="_blank">Ghostscript</a> で PDF/X ファイルを作成するには，-dPDFX オプションを付ければ良いようです．ただし，PDF/X には CMYK じゃないとダメ等の制限があるので，実際には以下のような設定が必要になります．</p>

			<ul>
				<li> -sDEVICE=pdfwrite を指定する．あるいは，ps2pdf スクリプトを使用しても良い．</li>
				<li> -dPDFX オプションを付ける．このオプションを付けると PDF バージョンは強制的に 1.3 になる模様．</li>
				<li> -sProcessColorModel=DeviceGray か -sProcessColorModel=DeviceCMYK を設定する．RGB は不可．</li>
				<li> デバイスに依存しない PDF ファイル？を作成する場合は，-dUseCIEColor オプションを付ける．</li>
				<li> PDF/X に変換するための定義ファイルを指定する．省略すると gs/lib/PDFX_def.ps が使用される模様．</li>
			</ul>
			<p>尚，PDF/A ファイルに関してもほとんど同様の方法（-dPDFX を -dPDFA に変える）で生成する事ができます．</p>
			<h4> テスト</h4>
			<p>取りあえず，Ghostscript をインストールすると付いてくるサンプルファイルのうち，<a href="http://cielquis.net/trash/colorcir.ps" target="_blank">colorcir.ps</a> でテストしてみました．</p>
			<h5> 普通の PDF</h5>
<pre>
$ gswin32c.exe -dBATCH -dNOPAUSE -dNOOUTERSAVE -sDEVICE=pdfwrite
-sOutputFile=colorcir.pdf colorcir.ps
</pre>

			<p><a href="http://cielquis.net/trash/colorcir.pdf" target="_blank">生成結果 (PDF)</a></p>
			<h5> PDF/X</h5>
<pre>
$ gswin32c.exe -dPDFX -dBATCH -dNOPAUSE -dNOOUTERSAVE -sDEVICE=pdfwrite
-sProcessColorModel=DeviceCMYK -sColorConversionStrategy=CMYK
-sOutputFile=colorcir.pdf colorcir.ps
</pre>

			<p><a href="http://cielquis.net/trash/colorcir-x-2.pdf" target="_blank">生成結果 (PDF/X, -sColorConversionStrategy=CMYK オプション付き)</a></p>
			<p><strong>追記</strong> どうやら RGB のファイルを CMYK に変換する場合，-sProcessColorModel=DeviceCMYK オプションだけでは不十分で，-sColorConversionStrategy=CMYK オプションも付ける必要があるようです(参考: <a href="http://stackoverflow.com/questions/6241282/converting-pdf-to-cmyk-with-identify-recognizing-cmyk" target="_blank">linux - Converting PDF to CMYK (with identify recognizing CMYK) - Stack Overflow</a>)．</p>
			<h5> PDF/X (UseCIEColor オプション付)</h5>
<pre>
$ gswin32c.exe -dPDFX -dBATCH -dNOPAUSE -dNOOUTERSAVE -sDEVICE=pdfwrite
-sProcessColorModel=DeviceCMYK -sColorConversionStrategy=CMYK -dUseCIEColor
-sOutputFile=colorcir.pdf colorcir.ps
</pre>

			<p><a href="http://cielquis.net/trash/colorcir-x-cie.pdf" target="_blank">生成結果 (PDF/X, UseCIEColor オプション付)</a></p>
			<h4> カスタマイズ</h4>
			<p>カスタマイズは，PDFX_def.ps 辺りをベースにこれを修正する事でできるようです（カスタマイズしたら，入力ファイルの直前にそのファイル名を指定する）．カスタマイズ項目は，以下のように記述されていました．</p>
			<blockquote title="404 Not Found" cite="http://svn.ghostscript.com/ghostscript/trunk/gs/doc/Ps2pdf.htm">
			<p>As mentioned above, the PDF/X definition file provides special information, which the PDF/X-3 standard requires. You can find a sample file in <strong>gs/lib/PDFX_def.ps</strong>, and edit it according to your needs. The file follows Postscript syntax and uses the operator <strong>pdfmark</strong> to pass the special information. For your comfort we marked the lines likely to need editing in the sample file with the comment <strong>% Customize</strong>. They are explained below.</p>
<dl>
				<dt>OutputCondition string</dt>
				<dd>Defines an OutputCondition value for the output intent dictionary. OutputConditionIdentifier string Defines an OutputConditionIdentifier value for the output intent dictionary.</dd>
	<dt>ICCProfile string</dt>
				<dd>May be omited if OutputConditionIdentifier specifies a registed identifier of characterized printing condition see <a href="http://www.color.org/IPA_2003-11_PDFX.pdf" target="_blank">http://www.color.org/IPA_2003-11_PDFX.pdf</a>). Defines a file name of an ICC profile file to be included into the output document. You may specify either an absolute file name, or a relative path from the working directory.</dd>
	<dt>Title string</dt>
				<dd>Defines the document title. Only useful if the source Postscript file doesnt define a title with DSC comments. therwise remove entire line from definition file.</dd>
	<dt>Info string</dt>
				<dd>Defines an Info value for the output intent dictionary.</dd>

			</dl>
			<cite><a href="http://svn.ghostscript.com/ghostscript/trunk/gs/doc/Ps2pdf.htm" target="_blank">ps2pdf: PostScript-to-PDF converter</a></cite></blockquote>
			<p>ICC プロファイル辺りは使うかもしれません．</p>
		</div>
]]></content:encoded>

	<dc:creator>tt_clown</dc:creator>
	<dc:date>2011-09-08</dc:date>
</item>
</rdf:RDF>
