パソコンオタクになりたい

難しいことは抜きにしてソフトからハードまでパソコンを楽しんでいます。Linuxが好きなのでLinuxの記事多めです。もっとデスクトップとしてのLinuxが普及すればいいのになと思っています。

ジョークコマンドの定番slっぽいものを自分でも作ってみた

図書館でLinuxの入門本を2冊借りました。

だいぶと古い本ですが、そのどちらにも「sl」コマンドが紹介されていました。

ジョークコマンドでslと打つと、端末上でSL機関車が走り出す、というもの。

一覧表示のlsをタイプミスしたときに出るっていうのが狙いのようです。

日本の方が作ったんかな?

ぶっちゃけ何の実益もないですが、入れたくなったので入れてみました。

 

ということでキャプチャがこちら。

画像だと伝わらないですが、この機関車が右から左に走っていくアニメーションが見れます。

ターミナルでアニメーションが見れるなんて感動です。

ちなみにインストールは以下のコマンドです。

sudo apt install sl

 

もし、見つからない、って言われた場合は更新してみてください。

sudo apt update

 

ここまで豪華なアニメーションはめんどいけど、ちょっとなにか表示するくらいのコマンドなら自分も作れそうな気がする、と思ったけど、よくよく考えたらHello,Worldの延長なんや、ということに気づいたので作ってみました。

さすがにアニメーションはしないけど、Linuxのマスコット、タックスのテキストアートが5秒間表示されます。

もとのテキストアートはこちら

ASCII Art Linux - asciiart.eu

組込をやっていたので、C言語自体は大丈夫なんやけど、printとか使わんので文字列出力でえらい苦労した…

ほんとは日本語のアスキーアートにしたかったけど、文字化けの直し方がわからんかったので断念。

 

curses ライブラリ、というライブラリを使いますが、これの使い方も全然わからんかったので苦労しました。

gccでのライブラリを使ったビルドの仕方も知らなかったので。

ちなみに以下のような感じになります。

test.cというファイルをapptestというコマンド(オブジェクト)にビルドしたい場合です。

gcc -o apptest test.c -l curses

 

slコマンドのように、コマンド実行時に端末の表示を一旦全部消すっていうやり方が全然わからなくて、clear関数を試したりとか、かなり試行錯誤しました。

結果的には、cursesの描画関数(自分の場合はmvprintw() )を使えばいいだけでした。

 

パスを通せば、slコマンドみたいにどこでもコマンドを打つだけで表示されるようになりますが、それはまた別の記事でまとめるかな。

 

curses ライブラリについては、以下のサイト様を参考にさせていただきました。

Programming Essentials - curses library

curses

 

ということで、せっかくなのでコード全文です。

誰かのお役に立てれば。

#include <stdio.h>
#include <curses.h>	/* curses */
#include <unistd.h>	/* sleep */

/* 表示位置 */
#define DISP_ROW	2
#define DISP_CLM	5

/* テキストアート */
#define TEXTART_ROW	16
#define TEXTART_CLM	37

char textart[TEXTART_ROW][TEXTART_CLM] = {
{"         _nnnn_                      "},
{"        dGGGGMMb     ,.............. "},
{"       @p~qp~~qMb    | Linux Rules! |"},
{"       M|@||@) M|   _;..............'"},
{"       @,----.JM| -'                 "},
{"      JS^\\__/  qKL                   "},
{"     dZP        qKRb                 "},
{"    dZP          qKKb                "},
{"   fZP            SMMb               "},
{"   HZM            MMMM               "},
{"   FqM            MMMM               "},
{" __| \".        |\\dS\"qML              "},
{" |    `.       | `'\\Zq               "},
{"_)      \\.___.,|     .'              "},
{"\\____   )MMMMMM|   .'                "},
{"     `-'       `--' hjm              "}
};

/* メイン処理 */
int main(int argc, char *argv[])
{
	int i;

	initscr();	/* スクリーンを初期化する */
	curs_set(0);	/* カーソル非表示 */
	
	/* 端末の上から2行目、左から5文字目から描画 */
	for( i=0; i < TEXTART_ROW ; i++ ){
		mvprintw(DISP_ROW + i, DISP_CLM, "%.37s", textart[i] );
	}
	
	refresh();	/* リフレッシュして表示 */
	sleep(5);	/* 5秒まち */

	endwin();	/* cursesの終了処理 */
}