オープンソースライセンスと著作権

オープンソースライセンス

オープンソースライセンス とは、ソースコードが開示されており修正等が認められているライセンスのことを指します。ソースコードを開示することにより様々な人が多くのソフトウェア開発に関わってもらいたいという精神の元ライセンスを定めています。
様々な形でライセンスを定めることは出来ますが、ライセンスの乱立はオープンソースの精神にそぐわないこともありOpen Source Initiativeではライセンスの精査を行い一覧をまとめています。
https://opensource.org/licenses

主要なライセンス

GNU GPL

GPLのソースコードは自由に改変しプログラムの公開ができますが、修正後のプログラムもGPLにしなくてはいけない事になっています。この為、他のライセンスのプログラムと一緒に出来ないことがあります。

MITライセンス

ソースコードのを自由に変更し別のライセンスを付与して公開できます。極めて緩いライセンスとしてよく用いられます。

著作権

日本における著作権は著作権法にて規定されています。著作権は大きく分けて人格権と財産権があります。財産権は著作者が他の人に渡すことが出来ますが、人格権は他の人に渡せないとされています。

オープンソースライセンスと著作権

オープンソースライセンスのソフトウェアは多くの自由が認められていますが、著作権が放棄されているわけではありません。ライセンスに従って利用する分には著作権を行使しないとしているだけなので、ライセンスに反するのなら著作権違反となります。オープンソースのソフトウェアは様々な人が修正を行いますが、個々の修正箇所は修正した人が著作者となります。その為、状況によっては多くの人の著作権を侵害することになりかねません。

GPLはソースコードの公開が求められる為、ライセンスの問題になることもあります。GPL違反として様々な事例がネット上に公開されていますから確認してみるといいでしょう。

プログラミング言語の選択

はじめに

今現在、多くのプログラミング言語が存在します。
古いものだとよく次の3つが挙げられます。

機械語やアセンブリ言語を除いても数多くのプログラミング言語があります。
この為、「どの言語を学ぶのか」 ということは悩むことではあります。
ここでは、プログラミング言語を選択する考え方を説明します。
ここでは次の4つの視点について考えます。

  • 実装性(作りやすさ)
  • 保守性(修正しやすさ)
  • 移植性(他の機器での動作させやすさ)
  • 継続性(長い期間でも変わらず動作させやすさ)

まず、最も大切なことですが、あるプログラミング言語で作ることが出来る処理は他の言語でも作ることが出来ます。特定の言語でしか行えない処理は存在しません。これは、構造化定理 (または 構造化プログラム定理)から証明出来ます。

実装性

本来、学ぶプログラミング言語を選ぶ基準としては作りたいプログラムにより選ぶ必要はありません。ただし、行いたい処理に対し作りやすい言語と作りにくい言語はあります。この為、行いたい処理により言語を選ぶことはあります。
この事をここでは実装性と呼びます。実装性は、「行いたい処理」と「動作させる環境」、「開発環境」等を考慮します。

保守性

また、プログラムのソースコードは利用している状況に応じてメンテナンスを行いします。原則として全てのプログラムは不具合バグと言います)が存在していると考えます。この為、何か問題があると修正を行う必要があります。この修正のしやすさを保守性と言います。

移植性

異なるコンピュータで動作させることはよくあります。
この時、コンピュータは同じハードウェアで異なるOSの事もあれば、異なるハードウェアで同じOSの場合等もあります。この様な場合、ほかのコンピュータで動作させる為の労力が少なければ移植性が高いと言います。

継続性

今は動作するプログラムがこの先いつまでそのまま動作するかはかなり重要な問題です。動作環境をアップデートすることにより開発したプログラムが動作しなくなることはよくあります。
本来、互換性を考えてOSやプログラムのインタープリタ等の開発を行うべきですが、様々な理由から互換性が切り捨てられることがよくあります。これにより開発したプログラムが動作しなくなり修正を余儀なくされることが発生します。
こういう事があまり起きず、継続してプログラムが動作させ続けることをここでは継続性と呼びます。
継続性はこれから先の事を指す為、考慮されることは少なく重要視されていません。しかし、継続性が低いと新しい機器へ移植する必要があり、開発したプログラム資産が廃棄される事も起こります。

どんなプログラム言語を選ぶか

上記の4つの観点(実装性、保守性、移植性、継続性)を十分に考慮し言語を選択する必要があります。その為に「どんな理由で言語が作られたか」や「どんな考え方で言語の開発が行われているか」を知っておくことは言語選択に重要となります。

エンジニアの能力が十分高ければ4つの観点は次のような重要度になります。

重要度低        重要度高
実装性 < 保守性 < (移植性、継続性)

実装性は一人で作るだけだと自身の能力に依存しますが、保守性は他人が開発したプログラムを読む作業が必要な為、難易度が上がります。
移植性、継続性はプログラム以外の要因も大きく、対処が難しくなりがちで重要度は高くなります。
実際、現代でもCOBOLが動作しているシステムは存在しており、これを現代のコンピュータで動作させる為に右往左往することがあります。この場合、新しい環境にCOBOLの動作環境を構築するか、別の言語で新しく書き直すかを迫られます。
COBOLは実装性が高かった為、多くの処理を書かれましたが、移植性や継続性は低かった為にその資産をいかに使うかを考える必要が発生しています。
この様なこともある為、移植性や継続性はとても重要で出来るだけ考慮するべきことであります。

C言語

コンピュータの歴史の中で長く使われている言語としてC言語が挙げられます。
C言語は1972年にデニス・リッチーが開発し、 半世紀後の現代でも主要な言語に数えられています。
これほどまで長い期間において使われているのは移植性、継続性がとても高い言語であるからです。
開発された頃、様々な種類のコンピュータが乱立していました。そんな中で開発されたこともありプログラムの移植性が高く、OS開発に使われました。
また、規格が国際標準化機構 (ISO) と国際電気標準会議 (IEC)で定められる為、特定の企業の決定に左右されることもなく継続的に利用が出来る状況であることも長く利用される原因になっています。
また、この言語の影響を受けた言語は多くある為、この言語を学ぶのは他の言語を学ぶ上でメリットとなりえます。

AWK

AWK(オーク)は1979年にUNIX上で動作するプログラムとして作られました。
テキストファイルを処理するのに向いており、csvファイル等に様々な処理をかけられます。UNIXを使う上で必要となるプログラムですが、大規模なシステム開発に使われることはほぼ無いでしょう。
ただ、POSIX準拠したシステムには必ず入っている為、作ったプログラムは容易に移植が可能であり、仕様が今後変更される見込みが少ない為に今後もそのプログラムが動作し続けると考えられます。
移植性、継続性は非常に高いですし、ちょっとした処理をさせるのはとても便利なので学んでおく価値はあるでしょう。

Perl

Perl(パール)は1987年にラリー・ウォールによって開発されました。日本では積極的に利用している企業などは少ないですが、世界規模では現役で使われています。
Perlの開発者が自然言語の言語学者でもあることもあり、Perlは自然言語の性質が含まれています。例えば、同じ処理でも様々な書き方があり、色んな部分が省略して描くことも出来ます。この様なことから、自然言語の優しさや難しさ、便利さや不便さも持つこともあり日本では避けられる事が多いようです。
しかし、Perlは移植性と継続性は比較的高い言語です。PerlはAWKの様にPOSIXに含まれてはいませんが、多くのUNIX系OSに初期状態から導入されていることが多く、開発が概ね終わっている為に大きな仕様変更が無いです。これにより今開発したPerlプログラムは今後も様々な機器で動作させるのが容易である事が見込まれます。
Perlはこれ以降のプログラム言語に大きな影響を与えていることも、最初に学んでおくことのメリットとなりえます。
Perlの為の様々なモジュールがCPANと呼ばれるサーバから自由にダウンロードできることもPerlを選択する大きなメリットとなっています。

Python

Python(パイソン)は1991年に登場した言語です。
Perlの後に出来て言語であり、Perlの影響を受けています。
Perlは自由度が高いがゆえ、実装性は高いが保守性は低くなっていましたが、Pythonは記述の仕方に制限をかけ、これにより読みやすいソースコードが作られます。これにより保守性が高く保たれます。
日本ではAIの開発ブームに乗ってPythonが積極的に使われる様になりました。様々な統計処理等のライブラリが多く揃っていることがAI開発の現場でよく使われる理由になっています。
ただ、Pythonのバージョンは2系と3系で互換性がなく、2系のプログラムは書き換えないと3系では動作しません。今は2系の開発は終わり、3系に写っている状況ですが、今後3系からまた互換性がない形でバージョンが上がることがあれば、またプログラム資産が引き継がれないことになるかもしれません。

Java

Java(ジャバ)は 1995年に Sun Microsystems が開発したプログラミング言語です。Javaランタイムがインストール出来れば、どの様な機器でも同じ動作をさせられることもあり比較的使われてきました。スマートフォンのAndroidアプリを開発する言語となった頃に急激に開発者が増えていきました。今でもJavaプログラマの求人は多い状況にあります。
Sun Microsystems を Oracle が買収したことにより今はOracleが権利を持っています。Oracleの都合で仕様が変更になる可能性があり、継続的に使えるかどうかは怪しくあります。実際、OracleはAndroidがJavaの著作権を侵害しているとしてGoogleと裁判を起こしOracleが勝訴しています。この裁判においてプログラムのAPIの扱いについてOracleの権利を認めるようなことになった為、著作権の及ぶ範囲についてまだ議論が続いています。
Androidアプリ開発では需要があるようですが、この先使い続けるかどうかはよく見極める必要があります。

裁判の詳細は以下のサイトから
Google v. Oracle America
https://en.wikipedia.org/wiki/Google_v._Oracle_America

Javascript

Javascript(ジャバスクリプト)は 1995年 にNetscapeに登場しました。今はEcmaインターナショナルが標準化を行っています。Javaから名前をとってJavascriptと付けたが名前以外に関連はありません。
WebブラウザがJavascriptを実行する為、今や多くの環境で動かすことが出来ます。また、ライブラリやフレームワーク等があり、今後も多くの場所で利用されることが多いと思われます。
最大のメリットはブラウザ上で動かす為、ブラウザさえあればOSやハードウェアに影響を受けません。ただし、ブラウザにより動作が異なることもあり注意が必要となります。

注意するべきこと

よくプログラミング言語の人気ランキングなるものがWeb上で目にします。多くは求人情報から集計したもののようですがこの手の情報には注意して見る必要があります。
求人は特定のシステム上で動かしたいプログラムがあって、その開発言語のランキングとなっている為、このページで言うところの実装性と保守性は重要視しているが移植性や継続性は重要視していません。
このランキングを鵜呑みにしてプログラミング言語を学ぶのはよく考える必要があります。今すぐ必要な言語があるのならそれを学べばいいですが、そうでないのでしたら10年後20年後も開発で使える言語を見極めて勉強するほうがいいでしょう。

学校教育でプログラミングを行うという話ですが、実際はアルゴリズムを学ぶ話のようです。
プログラミング言語を学ぶ上で難しいのは、オブジェクト指向や参照、ハードウェアに関する知識に関わる部分が引っかかりやすいので早い段階でこれらに触れられる言語を学ぶほうがいいでしょう。

メモ OSS

web解析

Piwik – Web分析アプリケーション
GoAccess – ターミナルで動作するリアルタイムWebログ分析モニタおよびインタラクティブビューア
Open Web Analytics – JavaScript、PHP、REST APIなどを使っているWebサイトにWeb分析機能を追加するソフトウェア
Webalizer – 高速Webサーバログファイル分析プログラム
AWStats – Web、ストリーミング、FTP、メールなどの統計情報をグラフ化するツール
W3Perl – ログファイルアナライザ
Analog – ログファイルアナライザ

Graphix

2D

Jw_cad

http://www.jwcad.net/

LeoCAD : https://www.leocad.org/

LEGOブロック組立

LibreCAD:https://librecad.org/

ビルや内装、機械のパーツの設計図 や概略図、図表

SagCAD : http://sagcad.sourceforge.jp/

機械系

KiCad EDA : http://www.kicad-pcb.org/

(自動電子設計)用

PythonCAD : https://ja.osdn.net/projects/sfnet_pythoncad/

XTrackCAD : http://www.xtrkcad.org/

鉄道模型向け

線路の図面作成

QCAD:https://www.qcad.org/

3D

OpenSCAD : http://www.openscad.org/

プログラミングで図形を書く

Free CAD:https://www.freecadweb.org/

Blender:https://www.blender.org/

NaroCAD :

グラフィック

Krita : https://krita.org/

GIMP : https://www.gimp.org/

Inkscape : https://inkscape.org/

karbon : https://www.calligra.org/karbon/

Ipe : http://ipe.otfried.org/

xfig : https://www.xfig.org/

LaTeXDraw : http://latexdraw.sourceforge.net/

Link

Saikoku Sanjusansho (the thirty-three Kannon temples in Western Japan)

1300 years since the inception of the pilgrimage to Saikoku Sanjusansho https://www.saikoku33-1300years.jp/en/

西国三十三所草創1300年 https://www.saikoku33-1300years.jp/

西国三十三所 巡礼の旅 https://www.saikoku33.gr.jp/

西国三十三所 – Wikipedia (JP) https://ja.wikipedia.org/wiki/%E8%A5%BF%E5%9B%BD%E4%B8%89%E5%8D%81%E4%B8%89%E6%89%80