tag:blogger.com,1999:blog-36535842884037282182024-02-20T21:54:32.936+09:00b6noteSuitable as the B6 notebook.akitsukadahttp://www.blogger.com/profile/17373157314129071819noreply@blogger.comBlogger12125tag:blogger.com,1999:blog-3653584288403728218.post-21558732751834292672011-06-02T23:10:00.003+09:002011-06-04T16:19:23.686+09:00きめた ひっこそう学校卒業と同時にブログタイトル変えるとき、<br />
気分転換的にはてなからBloggerに移ってきたけど<br />
どーもやっぱりなじまないからはてなにしよー。<br />
<br />
⇨ <a href="http://d.hatena.ne.jp/akitsukada">http://d.hatena.ne.jp/akitsukada</a>akitsukadahttp://www.blogger.com/profile/17373157314129071819noreply@blogger.com1tag:blogger.com,1999:blog-3653584288403728218.post-65876520287230593722011-06-02T19:59:00.000+09:002011-06-02T19:59:41.980+09:00ActiveRecordで木構造を扱うめも<h3>1:nの自己参照 = 木構造のデータをRailsで扱いたい</h3><p>具体的には、SetucoCMSのCategoriesテーブル。ERDは↓こんなの<br />
<a href="https://spreadsheets.google.com/spreadsheet/pub?hl=ja&hl=ja&key=0AsZ5eShbQ7T_dDJRRm5pdkJUUDlHQUVobnhPckFnWWc&output=html">https://spreadsheets.google.com/spreadsheet/pub?hl=ja&hl=ja&key=0AsZ5eShbQ7T_dDJRRm5pdkJUUDlHQUVobnhPckFnWWc&output=html</a><br />
</p><p>外部キーの名前も、デフォルトの<br />
<table_name>_idじゃなくてparent_idにしたい。</p><h3>migrationの定義</h3><p>こうした。</p><pre class="prettyprint"> 1 class CreateCategories < ActiveRecord::Migration
2 def self.up
3 create_table :categories do |t|
4 t.string :name, :null => false
5 t.integer :parent_id
6 t.timestamps
7 end
8 end
9
10 def self.down
11 drop_table :categories
12 end
13 end
</pre><h3>Categoryモデルの定義</h3><br />
<p>こうした。</p><pre class="prettyprint"> 1 # -*- coding:UTF-8 -*-
2 class Category < ActiveRecord::Base
3 has_many :pages
4
5 has_many :children, :class_name => 'Category', :foreign_key => :parent_id
6 belongs_to :parent, :class_name => 'Category', :foreign_key => :parent_id
7
8 end
</pre><h3>試す(`・ω・´)</h3><pre class="prettyprint">~/programming/ruby/SetucoCMSR$ rails c
Loading development environment (Rails 3.0.7)
ruby-1.9.2-p180 :001 > Category.all
=> []
ruby-1.9.2-p180 :002 > c = Category.create([
ruby-1.9.2-p180 :003 > {:name => 'cat1'},
ruby-1.9.2-p180 :004 > {:name => 'cat2', :parent_id => 1},
ruby-1.9.2-p180 :005 > {:name => 'cat3', :parent_id => 1},
ruby-1.9.2-p180 :006 > {:name => 'cat4', :parent_id => 2}
ruby-1.9.2-p180 :007?> ])
=> (snip)
ruby-1.9.2-p180 :008 > pp c
[#<Category id: 1, name: "cat1", parent_id: nil, created_at: "2011-06-02 10:56:44", updated_at: "2011-06-02 10:56:44">,
#<Category id: 2, name: "cat2", parent_id: 1, created_at: "2011-06-02 10:56:44", updated_at: "2011-06-02 10:56:44">,
#<Category id: 3, name: "cat3", parent_id: 1, created_at: "2011-06-02 10:56:44", updated_at: "2011-06-02 10:56:44">,
#<Category id: 4, name: "cat4", parent_id: 2, created_at: "2011-06-02 10:56:44", updated_at: "2011-06-02 10:56:44">]
=> (snip)
ruby-1.9.2-p180 :009 > pp c[0].children
[#<Category id: 2, name: "cat2", parent_id: 1, created_at: "2011-06-02 10:56:44", updated_at: "2011-06-02 10:56:44">,
#<Category id: 3, name: "cat3", parent_id: 1, created_at: "2011-06-02 10:56:44", updated_at: "2011-06-02 10:56:44">]
=> (snip)
ruby-1.9.2-p180 :010 > pp c[1].parent
#<Category id: 1, name: "cat1", parent_id: nil, created_at: "2011-06-02 10:56:44", updated_at: "2011-06-02 10:56:44">
=> (snip)
ruby-1.9.2-p180 :011 > pp c[1].children
[#<Category id: 4, name: "cat4", parent_id: 2, created_at: "2011-06-02 10:56:44", updated_at: "2011-06-02 10:56:44">]
=> (snip)
</pre><p>でけた!</p>akitsukadahttp://www.blogger.com/profile/17373157314129071819noreply@blogger.com0tag:blogger.com,1999:blog-3653584288403728218.post-19415398330896437992011-05-30T18:56:00.005+09:002011-05-31T09:08:49.031+09:00link_toにブロックを渡す件の続き<p><a href="http://atsukada.blogspot.com/2011/05/rails3linkto.html">昨日</a>の続き。</p><h3>link_toにブロックを渡すときのaタグ属性値は</h3><p>こんな感じ。</p><pre class="prettyprint"><%= link_to(url, :target => '_blank') { 〜リンクを貼る文字列とか画像とか〜 } %>
</pre><p>ふむふむふむ</p><h3>それにしても</h3><p>SetucoCMSでZendFramework使うときにも思ったんだけど、<br />
こんなにビューヘルパーたくさんあって、<br />
HTMLコーダーのみなさんは問題なくビューを編集できるのかしら???<br />
分業できなくないですかね。</p>akitsukadahttp://www.blogger.com/profile/17373157314129071819noreply@blogger.com0tag:blogger.com,1999:blog-3653584288403728218.post-39244770524224992402011-05-30T00:10:00.021+09:002011-05-31T09:15:07.278+09:00Rails3のlink_toヘルパーで、画像と文字列にリンクを貼る<h3>やりたいこと</h3><pre class="prettyprint"><a href="リンク先URL">
<span>文字列</span>
<img src="画像パス" alt="あうあう">
</a>
</pre><h3>普通(?)にlink_toでやると</h3><pre class="prettyprint"><%= link_to リンク文字列, リンク先情報 %>
</pre>こう?でもこれだと出力は<br />
<pre class="prettyprint"><a href="リンク先URL">リンク文字列</a>
</pre>になっちゃう。<br />
<h3>これだとタグがエスケープされちゃう</h3><pre class="prettyprint"><%= link_to("文字列", リンク先URL) %>
</pre>し、imgタグもなんか入れにくい<br />
<h3>それlink_toのブロック構文でできるよ</h3><pre class="prettyprint"><% link_to "リンク先情報" do %>
<span>文字列</span>
<%= image_tag("画像パス", :alt => 'ほげほげ' %>
<% end %></pre>出力<br />
<pre class="prettyprint"><a href="リンク先URL">
<span>文字列</span>
<img src="画像パス" alt="ほげほげ">
</a>
</pre>できたわーい!<br />
<br />
※上記の例だと最初からそのままaタグ書けばいいじゃんって思えるけど<br />
"リンク先情報"の部分で<br />
「:controller => 'hoge', :action => 'fuga'」<br />
とか指定したいのでlink_toを使ってます。image_tagも似たような感じ。akitsukadahttp://www.blogger.com/profile/17373157314129071819noreply@blogger.com0tag:blogger.com,1999:blog-3653584288403728218.post-6219552749872098982011-05-28T12:49:00.021+09:002011-05-28T21:42:32.193+09:00will_paginateを拡張しようとしたら"uninitialized constant WillPaginate::LinkRenderer"エラー<h3>will_paginateの表示をカスタマイズしたい</h3><p>will_paginateのページネータで、デフォルトのspanタグではなく<br />
ul>liを使いたかったので、renderer拡張クラスをつくろうとしてみた!<br />
</p><h3>環境</h3><p>railsのバージョンは3.0.7、will_paginateは3.0.pre2。<br />
</p><h3>継承するクラスがない</h3><p>ネット上でぐぐってみると<br />
</p><pre class="ruby" name="code">class CustomRenderer < WillPaginate::LinkRenderer
・・・ここで拡張・・・
end
</pre>
<p>っていう情報がよく見つかるけど、こうしようとすると</p><pre>uninitialized constant WillPaginate::LinkRenderer
</pre><p>エラーが出ました。あうあう
</p><h3>will_paginateのクラス構造が変わってた(ViewHelpers)</h3><p><a href="https://groups.google.com/group/rubyonrails-talk/browse_thread/thread/c03bc20f23687d91?hl=ja">rubyonrails-talkのMLでのやりとり</a>を見ると、
</p><pre class="ruby" name="code">class CustomRenderer < WillPaginate::ViewHelpers::LinkRenderer
・・・ここで拡張・・・
end </pre>
<p>って感じで、"ViewHelpers"が追加になったみたい!できた!
</p><h3>併せてwill_paginateのデフォルト設定</h3><p>カスタムrendererを記述する場所はみんなそれぞれの場所に書いてるみたい。<br />
(environment.rbとかapplication.rbとかapp/modelの下とか)<br />
僕はこうしました。<br />
</p><h4>app/helpers/paginate_helper.rb にヘルパーと拡張クラスを追加</h4><pre class="ruby" name="code"># -*- coding: utf-8 -*-
module PaginateHelper
def paginate collection, opts = {}
opts[:id] ||= 'pageNav'
opts[:previous_label] ||= '前へ'
opts[:next_label] ||= '次へ'
opts[:class] ||= nil
opts[:renderer] ||= 'PaginateHelper::SetucoPaginateRenderer'
will_paginate collection, opts
end
class SetucoPaginateRenderer < WillPaginate::ViewHelpers::LinkRenderer
〜ここで拡張〜
end
end
</pre>
<h4>ビューで使うとき</h4><pre class="ruby" name="code"><%= paginate @pages %>
</pre><p>すっきり!!</p>akitsukadahttp://www.blogger.com/profile/17373157314129071819noreply@blogger.com0tag:blogger.com,1999:blog-3653584288403728218.post-35602355835244256402010-10-16T10:14:00.004+09:002010-10-16T10:38:06.114+09:002010年の日本OSS奨励賞をいただきましたIPAが毎年行っている<a href=" http://www.ipa.go.jp/about/press/20101015_2.html">日本OSS貢献者賞/奨励賞</a>というやつがあり、今年その奨励賞を受賞しました。<br /><br />受賞理由は、簡単に言うと「コミュニティ活動や勉強会への学生の参加、情報発信を頑張った」ということで、2009年中に<a href="http://penguin.jec.ac.jp">電設部</a>のつかだとして勉強会に参加&自分で開催&周りの学生をたくさん誘致したのがよかったね!ということみたいです。情報発信は、<a href="http://d.hatena.ne.jp/atcorp/">ブログ</a>とか<a href="http://lab.jibun.atmarkit.co.jp/entries/237">@IT</a>とかでわいわい書いてました。あとは勉強会で登壇したりとか。中学生から大学生まで揃ってOSCで勉強会に<br />関するセミナーしてみたりとか。発表したものはSlideShareにタメてみたりとか。<br /><br />でも、勉強会に参加して学生層/若い層に輪を広げたことが評価されるというなら、それの原動力になった各勉強会の運営者(「この勉強会に友達連れてきたい!」と思っちゃうような場をたくさんいただきました。それに、「参加したらブログに書いて恩返し」ということも学びました)や参加者のみなさん(「この人に会わせたい!」と思う魅力的な人ばかりでした)、電設部やかまってくれた学生のみんなが居たからこその結果なので、去年関わっていただいた全ての方に心から感謝です。全員で受賞した気持ちです。受賞を知ったとき、そう思いました。たくさんの方(数えきれないのでここで列挙はできない)に直接会ってお礼を言いたいです。どうもありがとうございました。<br /><br />というわけで、今年ももちろん勉強会に参加したり<a href="http://groups.google.ca/group/anycommand">開催したり</a>しておりますし、今は<a href="http://sourceforge.jp/projects/setucocms/devel/">SetucoCMSの開発</a>に注力しております。SetucoCMSも、現在電設部の現役学生と私のようなOBでやっておりますが、学生と一緒にやるということをずっと大事にしていきたいです。<br /><br />では、今後ともよろしくお願いします。akitsukadahttp://www.blogger.com/profile/17373157314129071819noreply@blogger.com1tag:blogger.com,1999:blog-3653584288403728218.post-32582773732417112952010-08-24T23:51:00.002+09:002010-08-24T23:53:47.126+09:00zf create project ⇒ Cannot redeclare class PHPUnit_Framework_TestSuite_DataProvider in /usr/share/php/PHPUnit/Framework/TestSuite/DataProvider.phpzf create project path<br /><br />を実行したとき、<br /><br />Cannot redeclare class PHPUnit_Framework_TestSuite_DataProvider in /usr/share/php/PHPUnit/Framework/TestSuite/DataProvider.php<br /><br />というエラーが発生。<br />スタックをたどってみると、<br /><br />/usr/share/php/PHPUnit/Framework.php<br /><br />の中で大量にphpファイルをrequireしていたので、ファイル内のrequireを全てrequire_onceに置換して解決。akitsukadahttp://www.blogger.com/profile/17373157314129071819noreply@blogger.com0tag:blogger.com,1999:blog-3653584288403728218.post-51142528659972594532010-07-25T23:15:00.008+09:002010-07-26T00:12:11.944+09:00git rebase -i で編集をミスったときgit rebase -i で過去のコミットを編集、まとめたりするとき、<br />途中で操作をミスると再度 git rebase -i を実行しようとしても<br /><br />"Interactive rebase already started"<br /><br />と出ることがある。<br />このときは一度<br /><pre name="code" class="c"><br />$ git rebase --abort<br /></pre><br />を実行して、「今のrebase無しよ」としてから<br />再度git rebase -i を実行すれば上手くいく。akitsukadahttp://www.blogger.com/profile/17373157314129071819noreply@blogger.com0tag:blogger.com,1999:blog-3653584288403728218.post-80103830006575128272010-06-02T03:14:00.000+09:002010-06-02T03:15:23.324+09:00Hello, world.I had written the blog in the title "[Susume] of school IT study meeting" before. My name is [tsukadaakihiro]. It is shifting gradually to akitsukada though I had acted by the pen name named atcorp before. <br /><br />The place of employment is domestic SIer, and I am employed as SE apprenticeship. Even if it is private, the programming is done. The programming is a hobby. <br /><br />The CMS development project of open source named SetucoCMS is started up with the classmate, the junior, and the senior in the school days now. A real activity has not started yet though the page of the project is made in SourceForge. The future is the enjoyment.akitsukadahttp://www.blogger.com/profile/17373157314129071819noreply@blogger.com0tag:blogger.com,1999:blog-3653584288403728218.post-72056403018820339532010-05-06T03:26:00.014+09:002010-05-06T22:32:21.602+09:00SetucoCMS合宿中のHTML勉強会めも<p>今立ち上げ中のオープンソースプロジェクト「<a href="http://sourceforge.jp/projects/setucocms/">SetucoCMS</a>」の合宿中に、HTML勉強会を行った。講師はプロジェクトリーダーの<a href="http://twitter.com/skyguild">@skyguild</a>。走り書きのようだけど、内容をメモったのでここに記録。</p><h3>SetucoCMS HTML勉強会</h3> <h4>hタグについて</h4><p>h6まである。html4ではh1は一つのページに一つまで、となっていたが、html5ではその辺の事情が変わりつつある。単純に太い大きい文字で表示するタグじゃない。見出しの意味を持つのが重要。</p><h4>リストタグ(ul ol dl)について</h4><p>場合によっては、dlタグを使うのか、それをhタグをpタグでやればいいのかと迷うこともある。見分け方、判断の仕方としては、「◎◎」は「〜だ」、「○○」は「〜〜だ」というときは「dl dt dd」だろうし、「◎○」について、「◎○◎○◎○◎○◎○◎○◎○◎○◎○◎○◎でhhhhhhasldkfja;slkdjfaだ」とかならhタグとpタグがいいかもね。</p><h4>divタグについて</h4><p>ブロックレベル要素(ほかにh,p,・・・など、文書構造としての意味を持つもの)。要素をまとめておけるタグ。divタグ自体は意味を持たないタグ。意味をなさないので、本来は「いかにdivを使わないか」という観点で見たり。</p><h4>spanタグについて</h4><p>divのインライン要素。(a,img・・・など、文中に使うもの)pタグで囲った中でも、一部だけ赤文字にしたいとか。ただし、これも本来文書としての意味をなさないので、使用には一考を要する。たとえば、赤文字にしたいのはなぜか=>強調したいから。=>それなら別のタグでは。</p><h4>b, em, strong の違いについて</h4><p>bはbold、emはemphasis、strongはstrongの略(strongは略じゃない><)。emは文中で強調・重視したいところ、strongはさらにstrongなところ!</p><h4>copyright表記について、addressタグを使うのは適切か</h4><p>addressか?そうでもないだろ => pタグじゃね?という議論があったりした。でも、それも違わね?みたいな展開になって、さらにhtml5ではsmallタグを使うんだって。</p><h4>HTML5では</h4><p>divで一般的に表していたことをタグ化して、より適切に文書構造の意味を表現できるようにする。例えば <div id="header">というお決まりのタグは <header> タグにするとか。</p><br /><p>例えば <a>(アンカー)タグでページ内ジャンプを表現しているとき、音声読上げブラウザでは毎回不要な見出しを読上げられたりする。それが、HTML5なら<navigator>タグで適切な意味を持たすことができ、音声ブラウザに対する適切な配慮ができる。「セマンティックなマークアップ」方面に力を入れている。</p><h4>CSS3について</h4><p>やりすぎじゃないかな、という意見も。CSSは装飾を施すものであって、アニメーション関連はCSS本来の役目だろうか?</p><h4>CSSの書き方について</h4><p>dim#header と書くときの、divは意味があるか?ないけど、それをみたときに意味が分かりやすい。p#copyright と書いたときとか、#copyrightより分かりやすい。htmlソースを見て検索しないでも、cssだけ見れば分かるよね。私は結構すき。そもそも、要素はコーディングに設計/定義をすべきものなので、後から要素を変更しない前提で書くべきだし。</p><h4>cssの一括書きと個別書き</h4><p>たとえば、backgroundとbackground-image, background-position, background-repeat。3つ書くと3行消費しちゃうし読みにくくなるから、background一行で書こうね。あと、marginの指定はmargin-top、margin-bottomとか分けるんじゃなくて、margin:10px 0; みたいにまとめ書きしよう。</p><p>それに、margin/paddingの指定をするときに0pxとか書かないで。0は0であって、emでもpxでもないのだよ。</p><h4>HTMLコーダーが魅せるのは、見えないところ</h4><p>HTMLコーダーがアツくなるポイントとしては、alt属性。これは入れた方がいいとかじゃなくて「入れなきゃいけない」。音声読上ブラウザに対する配慮もそうだし、SEO的にも効果がある。imgタグにaltが入っていなければ、どちらもダメ。</p><p>imgで、画像に対する意味の補足としてやるとか。tips的には、<h2><a href="" title="*****"></a></h2>みたいに書いたときのtitle属性。title属性は、多くのタグにつけられる要素。補助的な意味として、アツい。<br />HTMLって、見えないところにけっこうこだわるもんなんだよー。googleも、「ランキング上げるためじゃなくてユーザのことを考えてサイト作りなさい」って言ってるんだよ!</p><h4>読み上げブラウザのtips</h4><p>altに補足の文書を書いてあげるとき、「menu」って書くと「エム・イー・エヌ・ユー」とか読上げられちゃったりすることがあるので、カタカナで「メニュー」って書いてあげるほうがいいよ、とかね!</p><h4>レイアウト</h4><p>固定幅レイアウト、リキッドレイアウト、エラスティックレイアウト。</p><p><dl><dt>固定幅</dt> <dd>横幅が変動しないレイアウト</dd> <dt>リキッドレイアウト</dt> <dd>リキッドレイアウト</dd> <dt>エラスティックレイアウト(ゴムのように弾力性のあるレイアウト)</dt> <dd>文字サイズを基準に各所のサイズを決める(単位にemを使うなど)</dd> <dt>リキッド+エラスティックレイアウト</dt> <dd>最大幅/最小幅などを指定したり、外部のバナー等固定幅でなければならない部分がある場合は、柔軟にがんばる。</dd></dl>エラスティック+固定幅の活用例⇒http://www.jec.ac.jp/design-w/<p></p><h4>お役だち情報</h4><dl><dt>役立つサイト</dt><dd>Another HTML-lint gateway<br /> http://htmllint.itc.keio.ac.jp/htmllint/htmllint.html<br /> HTMLの構造上の正しさを採点してくれるよ!</dd> <dd><br /> W3C Markup Validation Service<br /> http://validator.w3.org/ </dd><br /><dt>役立つアドオン - Firefox</dt> <dd><br /> Web Developer<br /> http://lab.tubonotubo.jp/tools/webdeveloper/index.html </dd><dd><br /> HTMLバリデータ<br /> https://addons.mozilla.org/ja/firefox/addon/249<br /> 検証してくれます。 </dd> <dd><br /> Semantic Checker 0.8.0<br /> https://addons.mozilla.org/ja/firefox/addon/13560<br /> Sugamo.CSSで教えてもらったアドオン。<br /> 要素ごとに色分けして一目で分かるように表示してくれるよ。 </dd></dl><h4>質疑応答</h4><p>Q:brタグってどうなの</p><p>A:改行であって空白ではない。改行なのだよ。p使うべきときはp使うべきだし、あくまでも意味としての改行に使うべき。レイアウト調整のために使うことは許されない。いっさい。ダメ、絶対。</p><p>Q:idとかclassの名前を付けるのめんどくさいんですけど。</p><p>A:逆に、必要なところ以外はidやclassをつけないようにコーディングを頑張っては。たとえばulタグ自体にcssを指定すればいいのにわざわざdivでラッピングしたりは無駄っすよね。あとは、<div id="container">とか、ある程度お決まりの構造や名前を使っていけます。まぁ、正直迷うこともあるけど。</p><h4>関連して、命名ルールの一般的な参考例</h4><dl><dt>本文全体を囲む</dt> <dd>container、wrapper、page、pagebody、all</dd> <dt>ヘッダー</dt> <dd>header、header-area</dd> <dt>ナビゲーション</dt> <dd>nav、navi、navigation</dd> <dt>グローバルナビゲーション</dt> <dd>global-nav、gnav</dd> <dt>ローカルナビゲーション</dt> <dd>local-nav、lnav</dd> <dt>補足ナビゲーション</dt> <dd>assist-nav、utility、utility-nav</dd> <dt>パンくずナビゲーション</dt> <dd>topicpath、breadcrumbs</dd> <dt>コンテンツ全体</dt> <dd>content(s)、container、wrapper</dd> <dt>メインコンテンツ</dt> <dd>main、maincontent(s)、content(s)、alpha、primary</dd> <dt>サブコンテンツ</dt> <dd>sub、subcontent(s)、beta</dd> <dt>サイドバー</dt> <dd>sidebar</dd> <dt>見出しと本文のまとまり</dt> <dd>section、entrybody、article(s)</dd> <dt>記事単体</dt> <dd>article(s)、entry(-ies)</dd> <dt>フッター</dt> <dd>footer、footer-area、copyright、publication</dd> <dt>ロゴ</dt> <dd>logo</dd> <dt>キービジュアルやメインビジュアル</dt> <dd>keyvisual、mainvisual</dd> <dt>画像や写真、グラフなど</dt> <dd>image、photo、fig、figure</dd> <dt>検索</dt> <dd>search、search-area、search-box</dd> <dt>注釈、ヒント</dt> <dd>aside、hint、note</dd> <dt>商品一覧</dt> <dd>products、item-list、shopitems</dd></dl>akitsukadahttp://www.blogger.com/profile/17373157314129071819noreply@blogger.com0tag:blogger.com,1999:blog-3653584288403728218.post-85200893442369371072010-04-11T21:26:00.018+09:002010-04-24T21:23:03.840+09:00オープンソースの定義を読む<div class="section"><p>最近、オープンソースのライセンスについて勉強している。以前からオープンソースソフトウェア(以下、OSS)の恩恵に預かっていたり、その世界や人に魅力を感じまくってはいたのだが、そのライセンス体系や、オープンソース自体の定義について、これまでほとんどまともな理解をしてこなかったことを、今さらながら痛感している。今日は、「オープンソースの定義」について、知ったことをまとめておく。正直言ってよく分からなかった部分も中にはあるので、突っ込み歓迎の意を表しておく。</p> <h3> 「オープンソースの定義」の生い立ち</h3> <p>今日で言う「オープンソース」を定義したのは、ブルース・ペレンスという人物である。彼はその後、非営利団体であるオープンソース・イニシアティブ(OSI)を設立した。ここで言う「オープンソースの定義(The Open Source Definition…以下、OSD)」とは、彼の書いた"The Open Source Definition"である。原文は<a href="http://www.opensource.org/docs/osd">ここ</a>、八田真行氏による日本語訳は<a href="http://www.opensource.jp/osd/osd-japanese_plain.html">ここ</a>で読むことができる。この記事では、日本語訳版の文章を逐次引用しつつ、解釈を進めていこう。</p> <p>全10項目があるのだが、ちょっと僕の足りない知識では分かりにくい部分があり、咀嚼するのに時間がかかってしまった。なんとか理解できたような気がするので、それを忘れないようにメモしておきたい。また、文章がややこしいのが分かりにくい原因なのではないかと思うので、できるだけ各項目について要点を箇条書きでまとめていくことを試みたい。</p> <h3> 以下の項目</h3> <p>多いので、いったんここで項目を挙げておく。</p><ol> <li>再頒布の自由</li> <li>ソースコード</li> <li>派生ソフトウェア</li> <li>作者のソースコードの完全性(Integrity)</li> <li>個人やグループに対する差別の禁止</li> <li>利用する分野に対する差別の禁止</li> <li>ライセンスの分配(distribution)</li> <li>特定製品でのみ有効なライセンスの禁止</li> <li>他のソフトウェアを制限するライセンスの禁止</li> <li>ライセンスは技術中立的でなければならない</li></ol> <p>一つずつ見ていこう。</p> <p>※なお、<a href="http://www.opensource.jp/osd/osd-japanese.html">日本語訳</a>を見ると、各項目に「理由:~」という文章が書いてある。この記事では基本的に各項目の解釈に焦点を絞っているが、項目についての理解が進んだ後は、ぜひ「理由」を読んでおいてほしい。</p> <h4> 再頒布の自由</h4> <pre>「オープンソース」であるライセンス(以下「ライセンス」と略)は、出自の様々なプログラムを集めたソフトウェア頒布物(ディストリビューション)の一部として、ソフトウェアを販売あるいは無料で頒布することを制限してはなりません。ライセンスは、このような販売に関して印税その他の報酬を要求してはなりません。</pre> <p>「『オープンソース』であるライセンスは(略)販売あるいは無料で頒布することを制限してはなりません。(略)印税その他の報酬を要求してはなりません。」とある。</p> <p>箇条書きにすれば、</p><ul> <li>オープンソースライセンスは</li><ul> <li>再頒布時に、無料か有料で販売するかは、利用者の自由にすること</li> <li>もし利用者が販売することを選んだ場合でも、報酬や印税を求めないこと</li></ul></ul> <p>こうだ。言い換えると、</p><ul> <li>OSSの利用者は、そのOSSを利用して作ったものを</li><ul> <li>無料で再頒布してもOKだし</li> <li>売ってもOK</li></ul> <li>そのとき、利用者はもとのOSS(の作者)に対して</li><ul> <li>報酬とか印税を支払う必要はない</li></ul></ul> <p>こういうことになる。</p> <h4> ソースコード</h4> <pre>「オープンソース」であるプログラムはソースコードを含んでいなければならず、コンパイル済形式と同様にソースコードでの頒布も許可されていなければなりません。何らかの事情でソースコードと共に頒布しない場合には、ソースコードを複製に要するコストとして妥当な額程度の費用で入手できる方法を用意し、それをはっきりと公表しなければなりません。方法として好ましいのはインターネットを通じての無料ダウンロードです。ソースコードは、プログラマがプログラム を変更しやすい形態でなければなりません。意図的 にソースコードを分かりにくくすることは許されませんし、プリプロセッサや変換プログラムの出力のような中間形式は認められません。</pre> <p>文章は長いが、言っていることは簡単だ。</p><ul> <li>OSSは、そのソースコードを頒布していなければならない</li> <li>コンパイル済みのバイナリファイル(たとえば.exeファイルとかの)形式で頒布している場合も、ソースコードを一緒に頒布すべし</li> <li>もしバイナリファイルとソースコードを一緒に頒布できないとしても、簡単にソースコードが入手できるようにしておくこと</li> <li>できればインターネットで公開して、無料ダウンロードできるようにしておくこと</li> <li>ソースコードは、プログラマが改変しやすいようにしておくこと</li> <li>ソースコードを中間形式で配布するのはダメ。要するにテキスト形式で、ちゃんと人間がいじれる状態で配布すること</li></ul> <p>とにかく、テキスト状態のソースコードをちゃんとオープンにしておけということだ。分かりやすい。</p> <h4> 派生ソフトウェア</h4> <pre>ライセンスは、ソフトウェアの変更と派生ソフトウェアの作成、並びに派生ソフトウェアを元のソフトウェアと同じライセンスの下で頒布することを許可しなければなりません。</pre> <p>「~と同じライセンスの下で頒布することを許可しなければなりません。」あたりの言い回しが多少分かりにくく感じた。要するに、</p><ul> <li>あるOSSの利用者は、</li><ul> <li>そのOSSの内容を変更してもよい</li> <li>そのOSSを元にした、いわば「派生ソフトウェア」を新たに開発してもよい</li> <li>その派生ソフトウェアの頒布時に、</li><ul> <li>元のOSSと同じライセンスを適用してもよい</li> <li>元のOSSと違うライセンスを適用してもよい</li></ul></ul></ul> <p>ということだ。</p> <p>最後の、「元のOSSと違うライセンスを適用してもよい」のくだりが、一見すると原文に含まれていないような感じがしてややこしい。</p> <h4> 作者のソースコードの完全性(integrity)</h4> <pre>バイナリ構築の際にプログラムを変更するため、ソースコードと一緒に「パッチファイル」を頒布することを認める場合に限り、ライセン スによって変更されたソースコードの頒布を制限することができます。ライセンスは、変更されたソースコードから構築されたソフトウェアの頒布を明確に許可していなければなりませんが、派生ソフトウェアに元のソフトウェアとは異なる名前やバージョン番号をつけるよう義務付けるのは構いません。</pre> <p>10項目中、最も分かりにくいと思う。箇条書きで内容をまとめられるのか心配である。</p> <p>まず、この項目は、「派生ソフトウェア」の再頒布時の形態について、二つのケースを想定している。すなわち、</p><ol> <li>あるOSSのソースコード + その利用者が作ったパッチファイル</li> <li>あるOSSのソースコードを、その利用者が改変したもの</li></ol> <p>の2パターンである。では、一つ目のケースから見ていこう。</p> <p>「1. あるOSSのソースコード + その利用者が作ったパッチファイル」の場合について、</p><ul> <li>あるOSSのライセンスは、</li><ul> <li>元のOSSのソースコードを変更した状態で再頒布することを禁止してもよい</li> <li>ただし、同時に「パッチファイル」を頒布することを認めなければならない</li></ul></ul> <p>ということが書かれている。</p> <p>ここで「?!」となるのが、「元のOSSのソースコードを変更した状態で再頒布することを禁止してもよい」というくだりではないだろうか。これが、前項である「派生ソフトウェア」で定義されていた「そのOSSの内容を変更してもよい」という内容と相反するように感じられるのが、個人的にはOSDややこしポイント第一位である。</p> <p>この項を理解するには、まず「パッチファイル」について知っていなければならない。かいつまんで言えば、パッチファイルとは、「ソースコードの『変更点』をまとめたファイル」である。「変更点」とは、たとえば「○行目を削除」とか「△行目の"public"という単語を"private"に変更」とか、文字通りソースコードを変更する内容である。</p> <p>このパッチファイルを、元のソースコードに「適用」することによって、パッチファイルにまとめられた「変更点」の情報がソースコードに一気に反映される。</p> <p>つまり、「あるOSSのソースコード + その利用者が作ったパッチファイル」が一緒に頒布された場合、それを手に入れた第三者は、「あるOSSのソースコード」に「その利用者が作ったパッチファイル」を「適用」することによって、結果的に「その利用者が開発した派生ソフトウェア」を得ることができるわけだ(書いててもややこしい)。</p> <p>なんでこんな面倒なことをわざわざするかというと、こうすることによって、「元のOSSの作者が書いたソースコード」自体はそのまま再頒布されるため、「元の作者のソースコード」と「派生ソフトウェアの作者が書いた変更点」とが明確にできるからである。作者や場合によっては、「自分はここまで書いたんだ」ということをはっきりさせておきたいかも知れない。そのための項目といえる。</p> <p>では次に、「2. あるOSSのソースコードを、その利用者が改変したもの」の場合を見てみよう。</p><ul> <li>あるOSSのライセンスは、</li><ul> <li>(パッチファイルでなく)ソースコード自体を改変した「派生ソフトウェア」の再頒布を許可すべし</li> <li>その再頒布時に、「派生ソフトウェア」には元のソフトウェアとは違う名前、違うバージョンをつけることを強制してもよい</li></ul></ul> <p>となる。</p> <p>これは、「元のOSS」と「派生ソフトウェア」の名前やバージョンをしっかり区別させることによって、「元のOSSの作者が書いたソースコード」を明確にしておくためである。たとえば、あるOSSの作者が、そのOSSの「派生ソフトウェア」には「元のOSS」とは違う名前をつけるように強制することで、その二つが明確に違うものであり、「自分が書いたのは『元のOSS』のソースコードだ」と主張しやすくなるわけだ。</p> <p>この2つのケースに共通するのは、どちらも</p><ul> <li>オリジナルな作者が書いた範囲(ソースコード)を、明確に分かるようにする</li></ul> <p>ために定義されているということだ。これが、「作者のソースコードの完全性(integrity)」ということである。</p> <h4> 個人やグループに対する差別の禁止</h4> <pre>ライセンスは特定の個人やグループを差別してはなりません。</pre> <p>これは大変わかりやすい。言葉どおりなので、詳しい説明は不要だろう。なお、OSD日本語訳のこの項目に添えられた「理由」には、</p> <pre>進化の過程から最大の恩恵を引き出すためには、可能な 限り多種多様な人々やグループに、平等にオープンソースに貢献する資格が与 えられている必要があります。そこで、オープンソースなライセンスによって 誰かを進化の過程から締め出すことは禁止されています。<br />(後略)</pre> <p>と書かれている。個人的には、これこそオープンソースの思想であると思う。</p> <h4> 利用する分野(fields of endeavor)に対する差別の禁止</h4> <pre>ライセンスはある特定の分野でプログラムを使うことを制限してはなりま せん。 例えば、プログラムの企業での使用や、遺伝子研究の分野での使用を制限してはなりません。</pre> <p>これも、その言葉どおりだ。あえて言い換えるなら、</p><ul> <li>このOSSをどんな分野で使ってもいいよ</li> <li>でも、うまくいかなくっても泣かないでね><</li></ul> <p>ということだろうか。</p> <h4> ライセンスの分配(distribution)</h4> <pre>プログラムに付随する権利はそのプログラムが再頒布された者全てに等しく認められなければならず、彼らが何らかの追加的ライセンスに同意することを必要としてはなりません。</pre> <p>これまでの項目において、「再頒布」とは「あるOSSに何らかの改変を加えた派生ソフトウェアを頒布すること」という意味で述べることが多かった。しかし、ここで言う「再頒布」とは、特に「あるOSSを入手した後、そのままの形で(改変を加えず)他の人に頒布すること」と考えればよい。</p><ul> <li>あるOSSが、あるライセンスの下で頒布された場合</li><ul> <li>そのOSSを、そのまま再頒布するとき、ライセンスを変更してはならない</li></ul></ul> <p>ということである。</p> <h4> 特定製品でのみ有効なライセンスの禁止</h4> <pre>プログラムに付与された権利は、それがある特定のソフトウェア頒布物の一部であるということに依存するものであってはなりません。プログラムをその頒布物 から取り出したとしても、そのプログラム自身のライセンスの範囲内で使用あるいは頒布される限り、プログラムが再頒布される全ての人々が、元のソフトウェア頒布物において与えられていた権利と同等の権利を有することを保証しなければなりません。</pre> <p>これも、言い回しが難しい気がするが、意味はそう難しいものではない。ここでいう「プログラムに付与された権利」とは、「OSSのライセンスの内容」である。それが「ある特定のソフトウェア頒布物の一部であるということに依存するものであってはならない」。つまり、</p><ul> <li>「あるソフトウェアの一部である場合のみ、OSSとしてのライセンスが有効になるよ」はNG</li> <li>そのOSSが「あるソフトウェア」の一部であろうがなかろうが、OSSとしてのライセンスは絶えず有効である</li></ul> <p>ということである。</p> <p>この定義によって、たとえば「ある特定の商用ソフトウェア"A"」に「あるOSS"B"」が含まれていた場合(それ自体は悪いことではない)、「商用ソフト"A"の一部として"B"を入手した場合のみ、あなたは"B"をOSSとして利用できますよ。魅力的でしょう。だから"A"を買ってください。」という行為を防ぐことができる。</p> <h4> 他のソフトウェアを制限するライセンスの禁止</h4> <pre>ライセンスはそのソフトウェアと共に頒布される他のソフトウェアに制限を設けてはなりません。例えば、ライセンスは同じ媒体で頒布される他のプログラムが全てオープンソースソフトウェアであることを要求してはなりません。</pre><ul> <li>OSSライセンスは、</li><ul> <li>どんなソフトウェアと一緒に頒布するかは、頒布者の自由にすべし</li> <li>たとえば、「このソフトウェアは、一緒に頒布されるソフトウェアがすべてOSSである場合のみ、OSSとして利用してよい」とかはNG</li></ul></ul> <p>一緒に頒布される他のソフトウェアがOSSだろうとプロプライエタリだろうと関係ない。それらに依存した内容をライセンスに盛り込んではならない、ということだ。</p> <h4> ライセンスは技術中立的でなければならない</h4> <pre>ライセンス中に、特定の技術やインターフェースの様式に強く依存するような規定があってはなりません。</pre> <p>これは、読んだ当初は例えば「このソフトウェアは、Linux上で動作する場合のみOSSとなる」とかいった規定を禁止するものがと思った。今でも、文章のみを見るとそう思う。だが、<a href="http://www.opensource.jp/osd/osd-japanese.html">OSD日本語訳</a>の「理由」を見てみると、どうもそれとは少し違ったニュアンスのことを想定しているようだ。</p> <pre>理由: この規定で特に念頭に置いているのは、ライセンサーとライセンシーの間で 契約を成立させるために明示的な同意の意思表示を必要とするような ライセンスです。いわゆる「クリックラップ(click-wrap)」を要求する規定は、 ソフトウェア頒布において重要な手法であるFTPダウンロードや CD-ROM アンソロジー、ウェブのミラーリングなどと衝突する可能性がありますので、 このような規定もコードの再利用を妨げてしまいます。よって、本定義に 準拠するライセンスは、(a) ソフトウェアの再頒布が、ダウンロード時の クリックラップをサポートしないようなウェブ以外の経路で起こりうるという 可能性 (b) ライセンスで保護されるコード (あるいは保護されるコードの 再利用された部分) はポップアップダイアログをサポートできない非GUIの 環境でも実行されれうるという可能性、を認めなければなりません。</pre> <p>つまり、OSSを利用する際に、利用者が利用許諾の内容について間違いなく同意の意思を表示できるようにするための規定ということである。箇条書きにしてみよう。</p><ul> <li>OSSを利用するとき、以下のような場合についても、利用者がライセンスの内容に同意を示せるようにすべし</li><ul> <li>例えば、GUI環境がなくて、「同意しますか?はい/いいえ」といったポップアップが出せない場合</li> <li>例えば、Webからのダウンロード、CD-ROM等の媒体等々、複数の手段で頒布される場合</li></ul></ul> <p>特に二つ目、「複数の手段で頒布される場合」が面白い。これは、例えば「Webからダウンロードしたことを以って同意したとみなす」とか、「パッケージの包装を破ったことをもって同意したとみなす」など(こういった利用許諾確認をクリップクラップという)、ライセンスの中で利用意思の確認手段を特定してしまうと、それだけOSS再頒布/再利用のチャンスを制限してしまうことになる。だから、特定の媒体やインターフェース環境下でのみ正常に利用意思が確認されるようなライセンスであってはならない。と、いうことのようだ。</p> <p>ふう、やっと終わった。</p> <h3> これは数ある具体的なライセンスの大枠</h3> <p>以上で、OSD10項目の解釈を終える。しかしこの10項目は、具体的なライセンス(GPLとかBSDとか)の基礎となるものに過ぎない。各ライセンスは、このOSDに反しない中で、また独自に種々の取り決めを行っている。いわば、OSDは日本国憲法、各ライセンスは法律のようなものだろうか。いや、違うか。</p> <p>とにかく、今回これをまとめたことによって、OSDの概要はつかめたように思う。今後は、各ライセンスについて、その内容や特徴、違いを勉強していきたい。</p></div>akitsukadahttp://www.blogger.com/profile/17373157314129071819noreply@blogger.com0tag:blogger.com,1999:blog-3653584288403728218.post-52073366949848770192010-04-11T10:52:00.006+09:002010-04-11T14:18:01.986+09:00こんにちは、世界以前、はてなダイアリーで「<a href="http://d.hatena.ne.jp/atcorp">学内IT勉強会のススメ</a>」という身もふたもないタイトルのブログを書いていた。つかだあきひろです。atcorpというHNで活動していたが、これを徐々にakitsukadaに移行中である。<br /><br />この2010年4月に晴れて新社会人となり、これまでのブログのタイトルが現状とそぐわなくなった。タイトルを変えて、はてなダイアリー運用を続けていくかどうかほんの少しだけ迷ったのだけれど、この際気分転換も含めて、思い切ってBloggerに移行してみようと思う。<br /><br />就職先は国内のSIerで、僕はSE見習いとして採用された。今後は仕事でシステム開発に携わっていくわけだが、プライベートでもプログラミングが趣味である。また、学生時代の同期や後輩、先輩とともに、SetucoCMS(せつこしーえむえす)というオープンソースのCMS開発プロジェクトを立ち上げている最中だ。<a href="http://sourceforge.jp/projects/setucocms/devel/">SourceForgeにプロジェクトのページは作ってある</a>が、まだ本格的な活動はスタートしていない。<br /><br />これまでのはてなダイアリーでは、そのタイトルのとおり学内外の勉強会に参加または開催したエピソードを中心に綴ってきたが、このブログは、日記の意味も含めて、興味のある技術を中心に、もう少し緩く全般的なことを記していきたい。akitsukadahttp://www.blogger.com/profile/17373157314129071819noreply@blogger.com0