今回は私の体験を利用してLinux開発現場の作業内容をイメージして頂ければと思います。
Linuxは他のMicrosoft Windows、Android、iOSと同じようにオペレーティングシステムです。
1995年頃まではLinuxというと一部のコンピュータマニアが使用しなくなったPCにインストールして個人的に触れてみる程度のものでしたが、今では今日のIT社会において様々な生活家電の中身となり、欠かせないものへと成長しました。最近では急速に進む社会のIoT化(モノのインターネット)における開発環境としても広く普及しています。
Linuxの優位性はしばらくは(私が生きている間は?)揺るがないことから、まだLinux開発の経験がない人、または経験が限定されている人向けにLinux開発現場の内容について自身の体験を振り返る形で紹介したいと思います(記憶がおぼつかない点もあり、一部、内容が薄いと感じられる点もあるかもしれませんが、ご了承ください)。
PCアプリケーション開発現場編
GUIアプリケーション開発
2010年前後に経験した開発事例について紹介します。
正確にはGTKアプリケーションと呼ばれますが、Windows上でVisual C#、Visual C++、Visual Basicを利用して操作画面をもつアプリケーション開発のLinux版というイメージになります。
なおGTKというのはC言語などから利用できるフリーのライブラリで主にLinuxアプリケーション開発時の画面表示機能を提供してくれるものです。
利用にはインストールが必要です。
共有ライブラリ開発
2000年半ばぐらいに経験した開発事例について紹介します。
前段ではGTKというフリーのライブラリを利用した事例でしたが、ここでは逆に開発者向けのライブラリを開発していた時期があります。
ハードウェア(デバイスドライバ含む)を開発する会社に在籍していた時に新たに制御対象として追加となったカメラなどの外部機器を制御するためのライブラリでデバイスドライバをラッピングする形で設計を進めました。また、様々な画像処理を行うライブラリについてもほぼ同時期に設計に関わっていました。
なお、Linuxでの共有ライブラリ開発ではコンパイル作業を通してsoファイル(拡張子がso)を作成することが基本的な流れとなります。
カーネルバージョンアップ
2010年前後に経験した開発事例について紹介します。
カーネルのバージョンアップ作業を行いましたが、コンパイル作業を伴うものでした。
実はカーネルのコンパイル(チューニング)が行えるのも、Linuxの特権でもあります。
Linuxはオープンソースのため、他のOS、Windows、iOSなどと異なり、カーネルのコンパイル、商用利用は規定のライセンスの範囲で自由に行うことができます。
私が関わったカーネルバージョンアップの内容は主に次のようなものだったと記憶しています。
X Window Systemのバージョンアップ
X Window Systemは前段のGTKライブラリのさらに下の階層に位置するライブラリでもあります。
Linuxの画面表示の根幹をなすライブラリでこちらもオープンソースで規定のライセンス内でコンパイル、商用利用が可能です。
実際にX Window System関連で次のような作業を行った記憶があります。
デバイスドライバ開発
話が少し横道にそれますが、カーネルとアプリケーションのメモリ空間は全く別領域に厳格に分断されています。そしてデバイスドライバはカーネル側のメモリ領域に展開されます。
このため個人的にはデバイスドライバ開発=カーネル開発という認識をもっており、デバイスドライバ開発時はほぼ、カーネルのコンパイル作業も伴うことがよくあったことを記憶しています。
なお、Linuxでのデバイスドライバ開発ではコンパイル作業を通してkoファイル(拡張子がko)を作成することが一般的な流れとなります。
プログラミング言語
当時、メインで使用していたプログラミング言語はC言語、C++言語です。
ポータルサイトアプリケーション開発現場編
2014年頃に経験した開発事例について紹介します。
主に企業様の社内の様々な管理のために使用されるグループウェアの開発に関わりました。
オープンソースのリバースエンジニアリング
昨今、グループウェアを含むポータルサイトを開発する際、スクラッチで開発すること(一から開発をすること)は非現実的と思っています。
私の時も基本的な機能をあらかじめ備えたポータルサイトのオープンソースを元に機能拡張する方法で開発が進みました。
話が横道に少しそれますが、昨今のグループウェアに求められる機能はどんどん多様化しており、ひと昔前の一方向の情報伝達手段(掲示板等)だけでは十分ではなく、双方向の情報伝達機能が標準になっています。
例えばリアルタイムでのチャット機能やスマホなどに届く様々なメッセージ通知(一般的にはプッシュ通知といわれている。届く内容例としてはチャットメッセージやスケジュール時刻などがある)、GPSを利用した旅費自動決済機能、ビジネスホンとの連携機能(一般にCTI機能といわれている)、安否確認機能などなど。
これら多種多様な機能は裏では膨大な数のモジュールの組み合わせから構築されていることが一般的で様々なプログラミング言語が同時に使われていることはめずらしくありません。(例えば、Javascriptライブラリ(jqeury)、Apache Velocity(html)、css,Java等々)
私が関わったオープンソースに関するベンダーからの情報は開発環境構築情報までは比較的、具体的に紹介されていましたが、オープンソースの情報はソースコード以外ない状態で、カスタマイズにはまず、同ソースコードの設計内容を理解する必要がありました。
しかし、当初は困難を極めました(なにしろJavascriptファイル、Javaファイル、velocityファイル、cssファイルあわせて数千ファイルもありました)。後でファイル数の多さの原因は機能単位の各ファイルの設計思想が理解できると、機能の数に比例していたことがわかりました。
ポータルサイトの開発について素人同然だったこともあり、個人的に理解できたのは、オープンソースの調査を始めてから約3ヶ月ぐらいたった頃でした。
プログラミング言語
ポータルサイトアプリケーションの開発言語としては私の場合、Javascript(jqeury等のライブラリ、オープンソースベンダ独自のライブラリを利用)、Java、velocity、html、cssでした。
ポータルサイトアプリケーションをオープンソースベースで開発する場合はこれらのような言語で書かれたファイルを並行して、理解していかなければならないでしょう。
※WordPress(ワードプレス)等を利用した個人的なブログであれば、文書を書く能力さえあれば、上記のようなプログラミング言語を覚えなくても作成できます。さらに必要最低限のhtml,css、必要であればjqueryの理解があれば、十分でしょう。
IoTアプリケーション開発現場編
開発環境の差分インストール
私が経験したIoTアプリケーションの開発では既存のIoT端末(サードパーティ提携先)を利用したため、Linuxはプリインストールされていました。
そこへ、今回、独自に追加する機能(Bluetooth(ブルートゥース)デバイスやAndroidスマホアプリ/iOSスマホアプリとの連携機能)に必要なライブラリを追加でインストールする必要がありました。
イメージ的にはJavaコンパイル環境、Webコンテナ(Apache Tomcat)、データベースサーバ、その他、Javascript関連のライブラリなどありました。
なおインストール自体はLinuxの各ディストリビューションで利用できるパッケージ管理コマンド(apt-getまたはyum等)を利用してネットワーク経由で自動で最新版をインストールすることが可能です。
スクラッチ開発
IoTアプリケーションの場合も、実はポータルサイト同様、サーバーアプリケーションに分類されます。
前述のポータルサイトとの違いはポータルサイトではサーバー側で画面を生成する必要があるのに対して、IoTアプリケーションではそれがないことです。
この画面生成が必要ないことで、ポータルサイトに比べ、IoTアプリケーション開発規模は格段に小さくなります。
イメージ的には画面生成に関係したファイル(Javascriptファイル、html/cssファイル)は必要なくなり、基本的にはjava(場合によってはサーバーサイドで動作する"特別な"Javascript(node.js))だけで開発できるできます。
このため、この時の開発ではスクラッチ開発でしたが、ポータルサイトアプリケーションと比較するとデバッグ作業を進めやすい(開発しやすい)状況だったと記憶しています。
個人的にサーバーアプリケーションの開発の醍醐味(達成感)を味わうにはポータルサイトのような巨大なアプリケーションよりもIoTアプリケーションのようなコンパクトにまとまったアプリケーション開発が向いていると思います。サーバーアプリケーションの全体の流れをしっかり身につけるにはIoTアプリケーションの開発経験は有効だと思っています。
プログラミング言語
IoTアプリケーションの開発言語は私の場合、Java、bash、Javascript(node.js)、sql、若干のhtmlでした。その中でもメイン言語はJava(※)でした。
※メイン言語はJavaではなく、C系言語、PHPなどといった方もいらっしゃると思います。
まとめ
個人的なLinux開発体験の記憶を思いおこしながら、すすめてまいりましたが、いかがでしょう。
Linuxを利用した開発現場のイメージの一助になれば幸いです。
今回紹介したLinux開発現場例
- PCアプリケーション
・Windows上でVisual C#、Visual C++、Visual Basic環境によるGUIアプリケーションのLinux版
・共有ライブラリ開発(デバイス制御、画像処理)
・カーネルのチューニング(X Window Systemの改造、デバイスドライバ開発)。 - ポータルサイトアプリケーション
・基本的な機能を備えたオープンソースの利用
・開発規模が巨大
・必要となる言語の種類が多い。 - IoTアプリケーション
・スクラッチ開発が可能。
・開発規模もそれほど大きくない(コンパクト)。
・サーバーアプリケーション開発の基本をしっかり身につけるには有効な経験。
・スクラッチ開発、開発規模も適度で醍醐味を感じる人も多いのでは。
別の機会に、今回紹介した内容(ライブラリのインストール、bashなど)について、個別に取り上げてみる予定です。