日本の開国

日本は近年まで鎖国状態でした。

鎖国時代の話

1995年にWindows95が販売され、2000年頃に日本全体にブロードバンドの波が押し寄せました。Androidが2008年に登場し、2017年には日本語の漢字約6万文字の国際規格化が完了しました。

その昔のコンピュータは日本語の処理が難しく、Windows95は日本語用が用意され日本で販売されました。コンピュータで文字を扱うには扱う全ての文字に文字コードと呼ばれる数字を割り振る必要がありました。日本語は文字数が多く、日本語を扱うためには欧米で使われる文字コードでは全く足りません。その為、日本ではShift_JISやEUC-JPなどの日本仕様の文字コードを用いる必要がありました。
日本では英文を処理できても外国では日本語の文を処理出来ず、日本国内のソフトウェアは日本国内で作られたものを利用することが多くあり、外国産のソフトウェアは日本のためにローカライズを行うことが多々ありました。

日本語の表示も大変でしたが、入力も特殊な事情がありました。
英文はアルファベットを入力していくだけですが、日本語の入力は平仮名を入力した後に変換を行う必要があります。そのためには日本語変換ソフトが必須となっていました。

表示を行う日本語の文字をまとめたフォントも作成が困難であり、商用のフォントばかりで日本語のフリーフォントは殆どない状況でした。

外国のコンピュータからは日本のウェブサイトを表示するのは難しく、日本とコミュニケーションをとるためには英語で行う必要がありました。
これは良い面もあり、外国からの詐欺やウィルス付きメール等は英語で書かれることが多く無条件で削除を行っていて、脅威にさらされることは少ない状況でした。

開国への道

文字コードが日本独自でありましたが、世界で統一された文字コードUnicodeを作る動きがあり、日本語のほとんどの文字は 2017年 に国際化が完了しました。

「文字情報基盤整備事業」で推進していた漢字6万文字の国際規格化が完了
https://www.ipa.go.jp/about/press/20171225.html

文字コードの整備をすすめる中、日本語フォントも整備されていきました。
IPAでは無料で使えるフォントを公開しています。

IPAフォント新シリーズの公開
https://www.ipa.go.jp/about/press/20100226.html

Web検索サービスの企業として1998年に設立されたGoogleはWebサイトのデータを収集し、この解析した結果を検索サービスに折り込み急激な成長を遂げました。様々なWebサービスを始め、Androidを開発しました。
これらのサービスから集めた情報を活用して日本語変換ソフトをGoogleが開発し、世界中で利用できるようになりました。

文字コードについても多くのOSがUTF-8を標準にするようになり、2019年頃のWindows 10ではメモ帳もUTF-8が標準になるようになっています。これにより、文字コード、日本語フォント、変換システムが世界中で手に入るようになりました。

現在の状況

日本語の扱いが外国のコンピュータでも容易に行えるようになったことで、世界との繋がりが簡単に持てるようになりました。今では、オンライン翻訳もあり、言語の壁はなくなりつつあります。

これにより、日本人をターゲットにした詐欺等も目立ち、日本のサーバへのクラッキングも大きな問題としてニュースで見かけるようになりました。言語の壁により日本語以外を拒絶していた事により外国の悪意を退けていましたが、近年では世界の悪意に晒される様になりました。

それまでは、セキュリティについて重要視されない状況でしたので、システムのセキュリティレベルを挙げ様々な悪意から守ることが現代の急務となっています。しかし、セキュリティに費用をかける企業はまだ少なく、プログラム開発も流行りが重要視されがちです。動作させるシステムの把握を行い無駄なプログラムを導入しない等、セキュリティを意識した開発を行わないとシステム開発は廃れていくかもしれません。

AndroidやMacOSX等、身の回りの多くの機器はUNIX系OSが使われており、自分たちを守る為にもUNIXの知識は必要不可欠になりつつあります。
1970年頃に出来たUNIXが形を少しづつ変えながらも半世紀利用され続けた為、この先もまだまだ利用され続けると考えられます。様々な脅威から守る為、自分たちが攻撃者とならないためにもUNIXの基礎知識は抑えておく必要があるでしょう。

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

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

オープンソースライセンス とは、ソースコードが開示されており修正等が認められているライセンスのことを指します。ソースコードを開示することにより様々な人が多くのソフトウェア開発に関わってもらいたいという精神の元ライセンスを定めています。
様々な形でライセンスを定めることは出来ますが、ライセンスの乱立はオープンソースの精神にそぐわないこともあり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/