2018年5月27日日曜日

GPLについてのまとめ

GPLについて、理解が浅いと勘違いしそうな部分をまとめてみました。
<参考>
https://www.gnu.org/licenses/gpl-faq.ja.html
http://www.itmedia.co.jp/enterprise/articles/0504/29/news003.html

■再配布について
 複製、再配布が可能。
 再配布するときは、ソースコードと実行モジュールのセットでなければならず、
 実行モジュールだけの再配布はできないということです。

 ここで、もうひとつ大事なことは、GPLでライセンスされたものを、
他のライセンスに変えることはできないということ。
 他のライセンスに変えると、著作権違反で訴えられる可能性がでてきます。
 (著作権についてを参考にしてください。)

■公開について
 必ず広く不特定多数の人に公開しなければならないわけではない。
 公開するかどうかは、自由に決められるということです。
 ただし、公開するときはソースコードと実行モジュールのセットで公開しなければならず、実行モジュールだけの公開はできません。
 
■有償、無償について
 日本では、オープンソースは無料というイメージが強いが、
GPLに関しては無償でなければならないという定義はまったくなく、
有償でもライセンスには抵触しません。
 オープンソースソフトウェアをどうマネタイズするかは、ソフト自体を有償にする方法もあるが、他のいろいろな方法もあります。

■LGPL
 主にライブラリとして扱われるプログラムに付与されるライセンス。
 たとえば、ある暗号化プログラムAがLGPLだったとします。
 このプログラムAを利用して、通信ソフトBを作成したとします。
 この場合、通信ソフトBは、プログラムAをライブラリとして使っているだけであれば
 通信ソフトBのプログラムの公開や配布をする必要はなく、通信ソフトBをGPL以外の独自のライセンスとすることもできます。

■Webサイトでの公開とAGPL
 AGPLと新たなライセンスについてです。

 オープンソースのWebプログラムで、Webサイトのすべてのプログラムがオープンソースであるとき、そのプログラムを改変した第三者が改変したプログラムでデモサイトを公開したとします。

 この場合、Webサイトが実行モジュールと考えられるが、その実行モジュールを配布しているわけではなく、プログラムを配布する必要はないとされているし、時代的な背景もあって、GPL2は、Webサイトのような仕組みを規定していません。
  ただし、AGPLとしては、この部分の規定が明記され、デモサイトを公開しただけでも
ソースの公開が必要となるようで、非常に厳しいライセンス体系となっています。

■GPL2とGPL3について
 GPL2とGPL3の大きな違いは、特許についてのようです。
 GPL2では、特許についての言及はないが、GPL3では、特許について言及されています。
 詳細については、下記、著作権についてのあとで、特許権についてで記述します。

■著作権について
 GPLの著作権については少々難しいです。
 
 まず、GPLに関係なくプログラムの著作者には、自動的に著作権が与えられます。
 なので、他人がつくったプログラムを勝手に複製、改変すると著作権侵害になります。
 これに対して、GPLでは、複製や改変をしても著作権侵害になりません。
 ただ、注意しなければいけないのは、GPLが著作権を放棄しているわけではないということです。
 どういうことかというと、もし、他人がつくったGPLのプログラムを勝手に複製、改変して、GPLを受け入れなければ、つまり違うライセンスにするなどすれば、
著作権で訴えられる可能性がでてくるということです。
著作権侵害になりたくなければGPLを受け入れなければなりません。

 GPLを受け入れた場合のみ、自由にプログラムの複製、改変、再配布が可能で、受け入れなければ著作権侵害となるということのようです。
 つまり、GPLが著作権を放棄しているわけではありません。

■特許権について
 まず、特許権について言及されているのは、GPL3からです。
 そして、特許権についても、著作権と似たような考え方のようです。
 (私は、法律家でないので、各自で詳細は確認してください。)

 GPL3が特許権を放棄しているわけではなく、
 GPL3を受けいれた場合のみ、特許権侵害で訴えることはないですよ、
 もし、受け入れなければ、特許権侵害になりますよということのようです。

■サブスクリプションによるマネタイズ
 マネタイズについては、いろいろあるがサブスクリプションによるマネタイズが最も成功したモデルのひとつといえます。
 基本的には、サポート契約として年間サポート料によって収入を得ます。
 プログラムは、複製、再配布が可能だが、プログラム内に商標つきのロゴを含めていたりします。
 そのため、再配布をおこなう場合は、そのロゴを入れ替えて再配布する必要があります。
 これは、ロゴを入れ替えずに再配布すると、ユーザがそのプログラムの作成者を誤認する可能性があるため
 ロゴを入れ替えて再配布することを義務付けているようです。
 
 一方で、ロゴを入れ替えるためには、技術的な知識が必要なため、
 プログラムを入手したものが誰しもこのプログラムを再配布して新たなマネタイズを試みることは難しいといえます。
 
 仮に、技術を持っていたとしても、後発のディスアドバンテージがあったり、
 結局、そのプログラムをどれだけ知っているかがビジネスのコアコンピタンスとなり、オープンソースに対する知識・経験が勝負の決め手になるといえます。

2017年10月17日火曜日

ADempiereのJasperで使うImageのパス

■Jasper内で使うイメージのファイルパス
JasperReportで、静的イメージファイルを貼り付けたときに注意することとして
そのイメージのパスの問題がある。

通常、JasperReportをデザインするのは、iReportというツールを使う。
iReportで、静的イメージを貼り付けるには、パレットからImageオブジェクトを選択して
デザイン中のレポートへドラッグすることで貼り付けることができる。

このときに、ダイアログが出て、静的ファイルを選択することとなる。
しかし、この動作によって、設定されるファイルパスは、使用中のiReportがある環境でのファイルパスとなる。
つまり、このJasperReportとImageファイルをサーバなどへ配置した場合、ここで設定されたパスでは、Imageファイルが見つからないことになってしまうことも多く、最終的な実行環境を想定したパスをここで設定しておかなければならない。


■ADempiereでのJasperイメージパスの設定方法
ADempiereでは、AP辞書で登録したJasperファイルやイメージファイルをReportStarterというクラスが処理して、JasperReportのアウトプットを作成する。
このときに、使用されるパスは、以下のようになる。

System.getProperty("java.io.tmpdir") + System.getProperty("file.separator")+"ABCDEFG.png"

つまり、システムプロパティの「java.io.tmpdir」に、Jasper関連のファイルが一時保存されて使用されている。
(C:\Users\ユーザ名\AppData\Local\Temp)

なので、iReportでデザインするときに、ImageオブジェクトのImageExpressionプロパティにも、上記のパスを設定しておけば、ADempiereでうまく表示することができる。


2017年7月26日水曜日

ADempiereのIEブラウザ対応


ADempiereは、FireFoxやChromeには対応しており問題なく動作するが
IEとなると少し問題がある。
グリッド表示やテキストボックスの表示がおかしくなったり、画面が真っ白になってしまうことがある。

ただし、これは、コミュニティ版のADempiereの場合で、SMBアソシエイツ社では、IEでも問題なく正常動作するように修正を加えている。

ADempiereをIEで正常動作させるためには、以下の対応が必要となる。


■Compatible対応のヘッダー出力をしない
 WebUIプロジェクトのindex.zulで、IE8へのCompatible対応タグが記述されているので、これを削除する。
 具体的には、index.zulの7行目あたりの以下の部分を削除する。
  <?meta http-equiv="X-UA-Compatible" content="IE=8" ?>

■拡大、縮小時のエラー対応
 上記の対応をすれば、IEでもほぼほぼ正常動作が可能になるが
 Ctrl+マウスホイールを使った拡大縮小時にエラーが発生してしまう。
 
 これに対応するには、以下のソースの修正が必要である。
 zk.jarの中にある「MouseCommand.java」に以下の修正をおこなう。
 processメソッドの中で、NumberForamtExceptionが発生しないように対処をおこなっている。
 
        // SMBA_CHG IE対応(NumberFormatExceptionの回避)
        MouseEvent event = null;

        if( data == null || data.length == 0 )
        {
            event = new MouseEvent(getId(), comp);            //no area, no coord
        }
        else if( data.length == 1 )
        {
            event = new MouseEvent(getId(), comp, data[0]);    //by area
        }
        else
        {
            BigDecimal bdVal1 = new BigDecimal(data[0]);
            BigDecimal bdVal2 = new BigDecimal(data[1]);

            event = new MouseEvent(getId(), comp,            //by coord
                bdVal1.intValue(), bdVal2.intValue(),
                data.length < 3 ? 0: Commands.parseKeys(data[2]));
        }

//        final MouseEvent event =
//        data == null || data.length == 0 ?
//            new MouseEvent(getId(), comp):            //no area, no coord
//        data.length == 1 ?
//            new MouseEvent(getId(), comp, data[0]):    //by area
//            new MouseEvent(getId(), comp,            //by coord
//                Integer.parseInt(data[0]), Integer.parseInt(data[1]),
//                data.length < 3 ? 0: Commands.parseKeys(data[2]));
        // CHG_END
 

  ちなみに、zk.jarは、通常はjarとして参照していることが多いが、ZK関連のjarもEclipseプロジェクト化しておくと、デバッグができるので便利である。



■メッセージの非表示
 最後に、ログインページで表示されるメッセージを非表示にする。
 IEでログインページにアクセスすると、「一部機能が正常に動作しない可能性がある」という旨のメッセージが表示されてしまう。

 これを表示しないようにしておくには、webuiプロジェクトのWLogin.javaを修正する。
 81行目あたりでメッセージを表示している部分を削除しておく。
 
        /*
        if (!AEnv.isBrowserSupported())
        {
//            String msg = "You might experience slow performance and user interface anomalies using your current browser to access the application. We recommend the use of Firefox, Google Chrome or Apple Safari.";
            String msg = "You might experience slow performance and user interface anomalies using your current browser to access the application. We recommend the use of Firefox, Google Chrome or Apple Safari."
                + "<BR>現在のブラウザはADempiereの一部機能が正常に動作しない可能性があります。ADempiereのすべての機能を使用するにはFirefoxやGoogle ChromeまたはSafariなどのブラウザをお勧めします。";
            browserWarningWindow = new Window();
            Div div = new Div();
            div.setStyle("background-color:#FFFFCC; font-size: " + (AEnv.getFontSize() - 1) + "pt");
            div.appendChild(new Text(msg));
            browserWarningWindow.appendChild(div);
            browserWarningWindow.setPosition("top,right");
            browserWarningWindow.setWidth("550px");
            browserWarningWindow.setPage(page);
            browserWarningWindow.doOverlapped();
        }
        */

これらの対応をしておけば、ADempiereにInternet Explorerでアクセスしても、正常に動作させることが可能である。