ここの情報は古いです。ご理解頂いた上でお取り扱いください。

Changes between Version 10 and Version 11 of pne-book-9-2


Ignore:
Timestamp:
Mar 31, 2008, 11:52:27 AM (12 years ago)
Author:
imoto
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • pne-book-9-2

    v10 v11  
    77文:井本
    88 == 概要 ==
    9 OpenPNE開発では、SVNを用いてソースコードの管理やバグの修正の管理などを行っています。なかでも、これから紹介するブランチとマージはOpenPNE開発において非常に効率よく開発を進める手段として使っています。
     9OpenPNE開発では、SVNを用いてソースコードの管理やバグの修正の管理などを行っています。なかでも、これから紹介するブランチとマージはOpenPNE開発において非常に効率よく開発を進める手段として使っています。
    1010
    1111そこで、今回は、OpenPNE開発で実際に使われているSVNの使い方をOpenPNEのTracを一部参照しながらブランチとマージを紹介していきます。
     12
    1213{{{
    1314OpenPNE開発情報
     
    2526
    2627 === root ===
    27 次に、上のグローバルメニューから「Browse Source」をクリックすると、Tracで管理されているOpenPNEのソースを見ることが出来ます。(http://trac.openpne.jp/browser)
    28 ここはrootディレクトリで一番上のディレクトリです。
    29 このrootディレクトリは、大きく分けて二種類のディレクトリ構成になっています。一つ目OpenPNE本線開発のディレクトリ(/OpenPNE)で、もう一つはOpenPNE本線開発とはことなるプロジェクトです。(NEKOGET_PNESKIN、PNEMonster)
     28次に、上のグローバルメニューから「Browse Source」をクリックすると、Tracで管理されているOpenPNEのソースを見ることができます。(http://trac.openpne.jp/browser)
     29ここはrootディレクトリで一番上のディレクトリです。
     30このrootディレクトリは、大きく分けて二種類のディレクトリ構成になっています。一つ目OpenPNE本線開発のディレクトリ(/OpenPNE)で、もう一つはOpenPNE本線開発とはことなるプロジェクトです。(NEKOGET_PNESKIN、PNEMonster)
    3031
    3132{{{
     
    4445 === root/OpenPNE ===
    4546それでは、OpenPNE本線開発のディレクトリを見ていきましょう。[[BR]]
    46 OpenPNE以下のディレクトリにはbranches、tags、trunkと3つのディレクトリがあります。まず、一番下にあるtrunkはOpenPNE本線開発のメインディレクトリです。基本的に開発版のリリースはこのtrunkでされます。
    47 
    48 次に、一番上にあるbranchesですが、直訳すると「枝」です。このbranchesは安定したバージョンの開発や、各個人がもっている機能追加やプロジェクトなどに使われている作業用ディレクトリです。[[BR]]
    49 最後に、tagsはOpenPNEの開発でバージョンを固定した場合にこのディレクトリにソースコードを残しておくためのディレクトリです。
     47OpenPNE以下のディレクトリにはbranches、tags、trunkと3つのディレクトリがあります。まず、一番下にあるtrunkがOpenPNE本線開発のメインディレクトリです。基本的に開発版のリリースはこのtrunkでリリースされます。
     48
     49次に、一番上にあるbranchesですが、直訳すると「枝」です。このbranchesは安定したバージョンの開発や、各個人がもっている機能追加やプロジェクトなどに使われている作業用ディレクトリです。[[BR]]
     50最後に、tagsはOpenPNEの開発でバージョンを固定した場合にこのディレクトリにソースコードを残しておくためのディレクトリです。
    5051
    5152{{{
     
    6364
    6465{{{
    65 prj:プロジェクトとしてチームで開発するためのディレクトリ
     66prj:プロジェクトとしてチームで開発を行うディレクトリ
    6667stable-x.x.x:安定版のバグ修正などを行うディレクトリ
    6768work:個人で行う小さな機能開発を行うディレクトリ
     
    6970
    7071prjディレクトリとworkディレクトリは基本的には新しい機能の開発に使われるディレクトリです。[[BR]]
    71 具体的にどのようにprjディレクトリとworkディレクトリが使われているか実際のOpenPNE開発事例を参照しながら説明していきます。[[BR]]
     72具体的にどのようにprjディレクトリとworkディレクトリが使われているか実際のOpenPNE開発事例を参照しながら解説していきます。[[BR]]
    7273stable-x.x.xは安定版の機能修正やバグ修正などを行うためのディレクトリです。[[BR]]
    7374例えば、stable-2.10.0で何かバグが発見されたとします。するとまず、stable-2.10.xディレクトリで発見されたバグなどを修正します。そして、一通り修正が終わったら、tagsディレクトリ(root/OpenPNE/tags)にソースを移して、stable-2.10.1として正式にリリースされます。[[BR]]
    7475この様に、stable-x.x.xディレクトリでは、安定版のバグ修正などを行う一時的なディレクトリとなります。
    7576
    76 それでは、具体的にどのようにprjディレクトリとworkディレクトリがどの様に使われているか実際のOpenPNE開発事例を参照しながら説明していきます。
     77それでは、具体的にどのようにprjディレクトリとworkディレクトリがどの様に使われているか実際のOpenPNE開発事例を参照しながら解説していきます。
    7778
    7879{{{
     
    9293現在prjディレクトリには以下のような主要プロジェクトがあります。[[BR]]
    9394
    94 このprjディレクトリはプロジェクトごとの機能開発に使用されているディレクトリです。ですので、そのプロジェクトに所属しているメンバーであれば基本的に誰でもソースコードを修正することが許されています。
    95 
    96 現在OpenPNEではOpenIDを外部認証として使うことが出来ます。そのときに開発用ディレクトリとして使用されていたディレクトリがこのprjディレクトリにあるopenidディレクトリです。[[BR]]
    97 このopenidのディレクトリのリビジョンを見てもらうと分かると思いますが、ogawa、maruyama、ebiharaなど複数の人でチームを組んでOpenIDの機能開発を行っていたことが分かります。
     95このprjディレクトリはプロジェクトごとの機能開発に使用されているディレクトリです。ですので、そのプロジェクトに所属しているメンバーであれば基本的に誰でもソースコードを修正することが許されています。
     96
     97現在OpenPNEではOpenIDを外部認証として使うことができます。そのときに開発用ディレクトリとして使用されていたディレクトリがこのprjディレクトリにあるopenidディレクトリです。[[BR]]
     98このopenidのディレクトリのリビジョンを見てもらうと分かますが、ogawa、maruyama、ebiharaなど複数の人でチームを組んでOpenIDの機能開発を行っていたことが分かります。
    9899
    99100
     
    118119
    119120次に、workディレクトリを見ていきましょう。
    120 まず、このディレクトリを見て分かるのは個人名が多いということです。基本的にこのworkディレクトリは個人で行う小さな機能開発を行うディレクトリです。
    121 ですので個人が比較的自由にこのディレクトリを使うことが出来るので、小さな機能開発以外にも、OpenPNEで追加してみたい実験的な機能開発や、プロジェクトの機能開発だがprjにソースをマージ(あとで説明)させるほど完成度が高くないソースをここで改良するなどの使い方があります。
     121まず、このディレクトリを見てディレクトリ名に個人名が使われていることが多いということが分かります。基本的にこのworkディレクトリは個人で行う小さな機能開発を行うディレクトリだからです。
     122ですので、個人が比較的自由にこのディレクトリを使うことができるので、小さな機能開発以外にも、OpenPNEで追加してみたい実験的な機能開発や、プロジェクトの機能開発だがprjにソースをマージ(後ほど解説)させるほど完成度が高くないソースをここで改良するなどの使い方があります。
    122123prjディレクトリにあったxhtmlcssディレクトリはこのworkディレクトリである程度開発したあとで、prjディレクトリに移動したという経緯があります。
    123124また、workディレクトリは基本的には各個人のディレクトリですので、他の人がソースを書き換えるということはありません。
     
    138139
    139140例として、work以下のebiharaディレクトリを見てみます。[[BR]]
    140 主にebiharaディレクトリでは、プロジェクトに移す前段階でのソースコードを管理しています。ディレクトリのprj_というのは「プロジェクトに移行させるためのディレクトリですよ」ということを表しています。[[BR]]
    141 現在はすべてprj_がついたディレクトリ名ですが、個人的にOpenPNEに取り込んで欲しい機能などがあれば分かりやすい機能名のディレクトリを作って開発することもあります。[[BR]]
    142 prj_dashboadというディレクトリは主にダッシュボード改善プロジェクトの個人開発用として作ったディレクトリです。ダッシュボード改善プロジェクトというプロジェクトが立ち上がった段階でまず、このebiharaディレクトリにprj_dashboadというディレクトリを作ります。ここである程度ソースコードが完成した段階で、prjにソースコードを移してプロジェクトを進めています。[[BR]]
     141主にebiharaディレクトリでは、プロジェクトに移す前段階のソースコードを管理しています。ディレクトリの【prj_】というのは「プロジェクトに移行させるためのディレクトリですよ」ということを表しています。[[BR]]
     142現在はすべて【prj_】がついたディレクトリ名ですが、個人的にOpenPNEに取り込んで欲しい機能などがあれば分かりやすい機能名のディレクトリを作って開発しています。[[BR]]
     143prj_dashboadというディレクトリは主にダッシュボード改善プロジェクトの個人開発用として作ったディレクトリです。ダッシュボード改善プロジェクトというプロジェクトが立ち上がった段階でまず、このebiharaディレクトリにprj_dashboadというディレクトリを作ります。ある程度ソースコードが完成した段階で、prjにソースコードを移してプロジェクトを進めています。[[BR]]
    143144
    144145リビジョンを見てもらうと分かると思いますが、ここはebiharaディレクトリで、ebiharaが管理しているので、修正は基本的にebiharaしか行っていません。[[BR]]
     
    158159
    159160この様に、prjとworkにはプロジェクトで開発するか個人で開発するかかという大きな特徴があります。
    160 この特徴に注目しながらtrac.openpne.jpを見ていただけると、「お!この機能はプロジェクトとして動いてるんだ」「この機能はogawaさんが個人で開発しているけど本線に取り込まれるのかな」などまたOpenPNEの最新の動向と今後の方向性も見えてくるかも知れません。
     161この特徴に注目しながらtrac.openpne.jpを見ていただけると、「お!この機能はプロジェクトとして動いてるんだ」「この機能はogawaさんが個人で開発しているけど本線に取り込まれるのかな」などOpenPNEの最新の動向と今後の方向性も見えてくるかも知れません。
    161162
    162163== ブランチ ==
    163164それでは、OpenPNE開発ではどのようにしてブランチを作っているか、どのような方法でブランチを作っているかを実際にブランチを作りながら紹介します。
    164165現在、OpenPNE開発者は主に二種類の方法でブランチを作っています。二種類の方法とは「TortoiseSVNでブランチを作る方法」と「SVNコマンドでブランチを作る方法」です。
    165 OpenPNE開発者には、Eclipseなどの開発環境を使っている人もいますし、vimなどを使ってコマンドラインで開発している人もいます。ですので、それぞれに適したブランチの作り方があります。
    166 そこでこの章ではWindowsクライアントであるTortoiseSVNでブランチを作る方法とsvnコマンドでブランチを作る方法の二種類の方法を紹介するので、ぜひ環境に合わせて使いやすい方法でブランチを作ってみてください。
    167 
    168 今回、Subversionの詳しいインストールは割愛しますが、
    169 Debian系であればapt-get、CentOS系であれば、yumで取得できると思います。
    170 {{{
     166OpenPNE開発者には、Eclipseなどの開発環境を使っている人もいますし、vimなどを使ってコマンドラインで開発している人もいます。よって、それぞれの開発者に適した方法でブランチを作っています。
     167そこでこの章ではWindowsクライアントであるTortoiseSVNでブランチを作る方法とsvnコマンドでブランチを作る方法の二種類の方法を紹介するので、適宜環境に合わせて使いやすい方法でブランチ作成に取り組んでください。
     168
     169今回、Subversionの詳しいインストールは割愛しますが、Debian系であればapt-get、CentOS系であれば、yumで取得できます。
     170
     171{{{
     172   
    171173Debian系
    172174apt-get install subversion
    173 }}}
    174 
    175 {{{
     175
     176}}}
     177
     178{{{
     179
    176180CentOS系
    177181yum install subversion
     182
    178183}}}
    179184詳しくは、マニュアルを参照してください。
    180185{{{
     186
    181187Debian ユーザ文書
    182188http://www.debian.org/doc/index.ja.html
     
    184190CentOS Documentation
    185191http://www.centos.org/docs/
     192
    186193}}}
    187194
     
    196203  ==== ブランチの作成 ====
    197204それでは早速ブランチの作成に入ります。
    198 今回はroot/OpenPNE/branches/work/ebihara以下に個人用ブランチを実際に作りながら、説明していきます。
     205今回はroot/OpenPNE/branches/work/ebihara以下に個人用ブランチを実際に作りながら、解説していきます。
    199206
    200207{{{
     
    212219
    213220
    214 例として、ここにOpenPNEグローバル変数改善プロジェクトを作っていくことにします。
     221例として、ここにOpenPNEグローバル変数改善プロジェクトを作成していきます。
    215222
    216223[[Image(https://trac.openpne.jp/svn/prj/pne-book/pne-book-9/pne-book-9-2/3-drectory.png,650)]]
     
    218225まず、ローカル環境でOpenPNEのソースをコピーしてきたいディレクトリに移動します。[[BR]]
    219226次に、そのディレクトリで右クリックして、メニューの中から「Repo-browser」をクリックします。[[BR]]
    220 ※ディレクトリを移動しなくても右クリックでメニューが出ますが後にその場所にチェックアウト(ソースのダウンロード)することになるので移動しておいたほうがいいと思います。
     227※ディレクトリを移動しなくても右クリックでメニューが出ますが後にその場所にチェックアウト(ソースのダウンロード)することになるので移動しています。
    221228
    222229
     
    229236}}}
    230237
    231 入力後に「Repository Browser」という新しいウィンドウが開きSVNを見ることが出来る様になります。[[BR]]
     238入力後に「Repository Browser」という新しいウィンドウが開きSVNを見ることができるようになります。[[BR]]
    232239
    233240[[Image(https://trac.openpne.jp/svn/prj/pne-book/pne-book-9/pne-book-9-2/5-repo2.png,650)]]
     
    250257このログを残したら、prj_remove_globalsディレクトリが作成され、OpenPNE-2.10.3のソースコードがコピーされています。[[BR]]
    251258
    252 指定したバージョンがコピーされているか不安な場合はwebapp/version.phpを開いてOPENPNE_VERSIONを確認してみるといいと思います。[[BR]]
     259指定したバージョンがコピーされているかの確認はwebapp/version.phpを開いてOPENPNE_VERSIONを確認してください。[[BR]]
    253260
    254261
     
    279286[[Image(https://trac.openpne.jp/svn/prj/pne-book/pne-book-9/pne-book-9-2/9-checkout_migi.png,650)]]
    280287
    281 クリックすると、Caeckoutという新しいウィンドウが表示されます。[[BR]]
     288クリックすると、Checkoutという新しいウィンドウが表示されます。[[BR]]
    282289
    283290「Repository」の中に「URL of repository」「Checkout directory」とあるので項目を入力します。
     
    298305
    299306コミットとは作業した結果をリポジトリに登録することです。[[BR]]
    300 フォルダ上で右クリックから「SVN Commit...」メニューを選択し、OKを押せば簡単に作業した結果をリポジトリに反映することが出来ます。
    301 
    302 
    303   ==== コメント ====
    304   この様に、TortoiseSVNを使用することで、GUIで簡単にブランチの作成、チェックアウト、コミットを行うことが出来ます。[[BR]]
     307フォルダ上で右クリックから「SVN Commit...」メニューを選択し、OKを押せば簡単に作業した結果をリポジトリに反映することができます。
     308
     309
     310  ==== まとめ ====
     311  この様に、TortoiseSVNを使用することで、GUIで簡単にブランチの作成、チェックアウト、コミットを行うことができます。[[BR]]
    305312
    306313今回の事例ではcolinuxを使用していますが、XAMPPなどを用いてWindowsで開発している人でもTortoiseSVNを使用することが出来るの非常に導入しやすく、使いやすいツールだと思います。
     
    329336例)
    330337co3k@colinux:~/Programming/sns$ svn copy https://trac.openpne.jp/svn/OpenPNE/tags/stable/OpenPNE-2.10.3/ https://trac.openpne.jp/svn/OpenPNE/branches/work/ebihara/prj_remove_globals/
     338
    331339}}}
    332340
     
    334342  ==== チェックアウト ====
    335343次に、リポジトリのソースをローカルにチェックアウトします。
    336 先ほどはcopyコマンドを使いましたが、チェックアウトはcheckoutコマンドを使用します。チェックアウトしたいディレクトリに移動して、チェックアウトコマンドを実行するだけでそのディレクトリにチェックアウトすることが出来ます。
     344先ほどはcopyコマンドを使用しましたが、チェックアウトはcheckoutコマンドを使用します。チェックアウトしたいディレクトリに移動して、チェックアウトコマンドを実行するだけでそのディレクトリにチェックアウトすることができます。
    337345
    338346{{{
     
    349357SVNのコマンドヘルプ
    350358{{{
     359   
    351360svn --help
     361
    352362}}}
    353363
     
    355365
    356366{{{
     367
    357368svn copy --help
    358 }}}
    359 
    360 
    361   ==== コメント ====
     369
     370}}}
     371
     372
     373  ==== まとめ ====
    362374
    363375SVNコマンドでブランチを作る方法は非常にシンプルでコマンドを覚えればすばやくブランチを作ったりチェックアウトすることが可能になります。[[BR]]
     
    365377実際、OpenPNE開発者はsvnコマンドを使っている人が多くいます。
    366378 
     379 
    367380== マージ ==
    368381
    369382マージする方法を説明していきます。[[BR]]
    370383
    371 マージは直訳すると、「合併する」「融合する」といった意味がありますが、ここでは、ソースコードとソースコードを融合させることをいいます。[[BR]]
     384マージは直訳すると、「合併する」「融合する」といった意味があります。ここでは、ソースコードとソースコードを融合させることの意味だと考えてください。[[BR]]
    372385基本的には、先ほどブランチとしてtrunkから派生させたコードをまたtrunkに融合させるという作業をOpenPNEでは使っています。しかし、マージはその他にもさまざまな使い方があります。[[BR]]
    373 例えば、2.10.0から派生した個人作業ディレクトリのブランチでのんびり機能追加を開発していたが、trunkが2.11.6になっていたときに、その追加機能をtrunkに取り込んでも動かないということがないように、ある程度trunkの開発が進んだときに、個人作業ディレクトリにtrunkをマージさせておけばtrunkにマージさせたときに現在のtrunkのバージョンと相性が悪いから動かないということがなくなります。
    374 
    375 マージは基本的に、あるリビジョンからあるリビジョンでの変更箇所を取り込む作業になります。ファイルをそれぞれ変更するのではなく、修正されている箇所だけ取り込むという作業です。
    376 
    377 それでは、ブランチと同じく、「TortoiseSVNでマージする方法」と「SVNコマンドでマージする方法」の2種類を紹介します。[[BR]]
     386
     387マージは基本的に、あるリビジョンからあるリビジョンでの変更箇所を取り込む作業です。ファイルをそれぞれ変更するのではなく、修正されている箇所だけ取り込みます。
     388
     389それでは、ブランチと同じく、「TortoiseSVNでマージする方法」と「SVNコマンドでマージする方法」のニ種類を紹介します。[[BR]]
    378390マージにはさまざまな種類がありますが、ここでのマージは、個人のローカル作業用ディレクトリにTrunkの変更箇所をマージする方法を紹介します。
    379391
     
    382394 
    383395  ==== マージ ====
    384 まず、TortoiseSVNでマージする方法ですが、先ほどのブランチでの使い方同様TortoiseSVNのメニューは右クリックをすることでメニューを開くことが出来ます。
     396まず、TortoiseSVNでマージする方法ですが、先ほどのブランチでの使い方同様TortoiseSVNのメニューは右クリックをすることでメニューを開くことができます。
    385397今回はマージさせたいディレクトリの上で、右クリックをし、「TortoiseSVN」を選択し「Merge...」を選択します。
    386398
     
    388400
    389401「Merge...」を選択したらMergeウィンドウが表示されます。
    390 マージをする上で一番分かりにくい点は、このFromとToだと思います。先ほど、「マージは基本的に、あるリビジョンからあるリビジョンでの変更箇所を取り込む作業」の述べましたが、それがここと一致します。このFromとToの間で変更された箇所を取り込みます。URLには、取り込みたい先のリビジョンのURLを指定します。
     402マージをする上で一番分かりにくい点は、この【From】と【To】だと思います。先ほど、「マージは基本的に、あるリビジョンからあるリビジョンでの変更箇所を取り込む作業」の述べましたが、それがここと一致します。この【From】と【To】の間で変更された箇所を取り込みます。URLには、取り込みたい先のリビジョンのURLを指定します。
    391403
    392404{{{
     
    427439次に、SVNのsvn mergeコマンドを使ってマージします。[[BR]]
    428440
    429 svn mergeコマンドは下記のように指定します。この-rオプションというのはリビジョン指定をするときには必要なので忘れないに注意が必要です。[[BR]]
     441svn mergeコマンドは下記のように指定します。この-rオプションというのはリビジョン指定をするときには必要なので忘れないように注意が必要です。[[BR]]
    430442この例を解説すると、trunkの5114から5115の変更点をローカルのprj_remove_globalsディレクトリにマージするという意味になります。
    431443
     
    436448co3k@colinux:~/Programming/sns$ merge -r 5114:5115 https://trac.openpne.jp/svn/OpenPNE/trunk/ prj_remove_globals
    437449}}}
    438 
    439450
    440451
     
    446457
    447458  ==== マージ====
    448 
    449 
    450459マージをするときに、「マージは基本的に、あるリビジョンからあるリビジョンでの変更箇所を取り込む作業」と説明しましたが、このマージの性質を利用して逆マージを行います。[[BR]]
    451460逆マージは、FromとToのリビジョンを変えるだけです。[[BR]]
     
    457466}}}
    458467
    459 この様に、FromとToを逆に指定するだけで、失敗などを取り消す逆マージをすることが出来ます。[[BR]]
    460 また、svnコマンドを使用した場合の逆マージも同じくFromとToを逆に指定するだけで逆マージをすることが出来ます。
     468この様に、FromとToを逆に指定するだけで、失敗などを取り消す逆マージをすることができます。[[BR]]
     469また、svnコマンドを使用した場合の逆マージも同じくFromとToを逆に指定するだけで逆マージをすることができます。
    461470
    462471(画像 逆マージ)
     
    464473 === tags間でのマージ ===
    465474  その他にも、OpenPNE開発でよく使われるのがtags間でのマージです。[[BR]]
    466   簡単にバージョンアップをすることが出来て、便利な機能です。[[BR]]
    467 
    468     例えば、ローカルの開発環境にあるOpenPNE-2.10.3をOpenPNE-2.10.4にバージョンアップしたいときに使用すると、非常に簡単にバージョンを上げることが出来ます。[[BR]]
     475  このtags間でのマージを使用すると簡単にバージョンアップをすることができて、便利です。[[BR]]
     476
     477  例えば、ローカルの開発環境にあるOpenPNE-2.10.3をOpenPNE-2.10.4にバージョンアップしたいときに使用すると、非常に簡単にバージョンを上げることができます。[[BR]]
    469478  それでは実際にOpenPNE-2.10.3をOpenPNE-2.10.4にバージョンアップする方法を見ていきましょう。
    470479
    471480  ==== マージ ====
    472481  これまでのマージと同じように、マージしたいディレクトリ上で右クリックしてメニューをだし、Margeウィンドウを出してください。[[BR]]
    473   先ほどまでは、リビジョンを指定していましたが、このtags間でのリビジョンは基本的にHEAD Rebisionです。ですので、ラジオボタンがRebisionに指定されている場合はFrom、To共にHEAD Rebisionに変更してください。[[BR]]
     482  先ほどまでのマージでは、リビジョンを指定していましたが、このtags間でのリビジョンは基本的にHEAD Rebisionです。ですので、ラジオボタンがRebisionに指定されている場合はFrom、Toの両方をHEAD Rebisionに変更してください。[[BR]]
    474483  そして、次にURLですが、Fromに前のバージョンのURLを指定し、Toに更新したいバージョンのURLを指定します。[[BR]]
    475   あとは、普通のマージと同じで、「Merge」ボタンでマージしてください。[[BR]]
     484  あとは、通常のマージと同じで、「Merge」ボタンでマージしてください。[[BR]]
    476485
    477486  このとき、Toの「Use"From:"URL(revision range is selectable in the above log dialog)」というチェックボックスが外れていないと、URLを入力できないので注意が必要です。
    478  
    479 {{{
     487
     488{{{
     489
    480490例)
    481491From:https://trac.openpne.jp/svn/OpenPNE/tags/stable/OpenPNE-2.10.3/
    482492To:https://trac.openpne.jp/svn/OpenPNE/tags/stable/OpenPNE-2.10.4/
     493
    483494}}}
    484495