パピーでプログラミングしてみる(初級編)

パピーを名犬にするための技、テクニック

モデレータ: 暇人, YoN, nyu

新谷
記事: 934
登録日時: 08/10/09(木) 18:52
お住まい: 大阪

パピーでプログラミングしてみる(初級編)

投稿記事 by 新谷 »

あくまで初級編ということでお願いします<(_ _)>
新谷
記事: 934
登録日時: 08/10/09(木) 18:52
お住まい: 大阪

パピーで使用されている言語

投稿記事 by 新谷 »

・シェルスクリプト
多用されている。
パピー431日本版ヘルプファイル(/usr/share/doc/help/ja/HOWTO-program.htm)より引用
シェルスクリプトはコンパイルせずに実行可能なテキストファイルのプログラムです。シェルスクリプトはとても洗練された書き方が可能で、パピーにはそれらのプログラムが多数存在しています。
・C言語
本家フォーラムメンバーでは達者な方々が使用。バリーさんもたまに使用。
同ヘルプファイルより引用
全ての C/C++ アプリケーションをコンパイルするためのツールは devx_xxx.sfsと名付けられたアドオンファイルの中に見付けることができます。SFS(と呼ぶ) ファイルの概要はオンラインのこのページで読むことができます: http://puppylinux.com/development/packa ... gement.htm
・Vala/Genie
非常に期待されている。現在はまだ発展途上。
同ヘルプファイルより引用
これこそ未来です。ValaとGenieはあらゆる面で C/C++を凌ぐプログラミング言語です。 Valaは C#に似た構文であり、Genieは Pythonに似た構文です。これらは実は同じ一つのコンパイラが異なる2とおりの構文を受け入れているのです。

Vala/Genieは真のコンパイラ言語で、非常に効率のよいコードを生成します。いずれもとくにGTKアプリケーションを書くのに優れています。私は「devx」SFSファイルにVala/Genieコンパイラーを、そのドキュメントとValaIDEとともに入れておきました。

・GTK
グラフィカルなインターフェイスを作成するためのツールキット。シェルスクリプトでもC言語でも書ける。

・Xdialog
グラフィカルなインターフェイスを作成するためのツールキット。シェルスクリプトで書く。補助的に使用。

・その他メッセージ出力系のコマンド
yaf-splash、dialog、xmessage、gxmessage ....などなど。

・やや敬遠されているもの
Tcl/Tk、Python、QT ....などなど。
最後に編集したユーザー 新谷 [ 10/02/20(土) 00:30 ], 累計 1 回
新谷
記事: 934
登録日時: 08/10/09(木) 18:52
お住まい: 大阪

有益なリンク

投稿記事 by 新谷 »

・C言語
ウェブ上で見つけた超シンプルな入門チュートリアル http://www.nmn.jp/~hidai/c/

・Vala/Genie
バリーさんが簡易的な入門チュートリアルを書いてます。 http://bkhome.org/genie/index.html

・GTK (シェルスクリプトの場合)
devxを使用しているなら、/usr/share/doc/gtkdialog3/examples/ に豊富なサンプルコードがあります。
新谷
記事: 934
登録日時: 08/10/09(木) 18:52
お住まい: 大阪

有益なリンク・GTK (C言語の場合)

投稿記事 by 新谷 »

先日、「入門GTK+ 」(菅谷保之・著、オーム社、3000円) という本を買ったのですが、ウェブ上でそのサンプルコードが公開されていました。書籍の内容も一部公開されています。
結構太っ腹なんじゃないだろうか。
http://www.iim.ics.tut.ac.jp/~sugaya/wi ... 0#s8b2472b
新谷
記事: 934
登録日時: 08/10/09(木) 18:52
お住まい: 大阪

とりあえずC言語でハローワールド

投稿記事 by 新谷 »

hello.c の内容

コード: 全て選択

#include <stdio.h>
 int main(void)
{
 	printf("Hello, world!\n");
}

コンパイルと実行

コード: 全て選択

# gcc -o hello hello.c
# ./hello
Hello, world!
新谷
記事: 934
登録日時: 08/10/09(木) 18:52
お住まい: 大阪

とりあえずC言語でハローワールド(メンドクサイ編)

投稿記事 by 新谷 »

ところで、下記のようにするとシェルスクリプト的にコマンドが使えます。
面倒くさい時にいいんじゃなかろうか...。

コード: 全て選択

#include <stdio.h>
#include <stdlib.h>  /* これを入れて置くと..... */

int main (void)
{
	system ("echo Hello World!");  /* system()関数でコマンドが使える */ 
}

Endeavor_wako
記事: 380
登録日時: 09/09/18(金) 01:54

Re: パピーでプログラミングしてみる(初級編)

投稿記事 by Endeavor_wako »

>hello.c の内容
>コード: 全て選択
>#include <stdio.h>
>int main(void)
>{
> printf("Hello, world!\n");
>}

int なら return で値を返すべきではないでしょうか?
ついでに void main( void ) ってLinuxでは反則なんでしょうか?(Cは知っていてもLinuxでまとまったものを書いたことがないので)

MS-DOS時代、system なんぞメモリが気になって滅多に呼べなかったなあ(遠い眼)
Main:NEC VersaPro VB-B (Core i5, RAM4GB, SSD, LinuxMint (xfce4,amd64))
Sub:Fujitsu note pc (Celeron、RAM8GB, SSD, LinuxMint (xfce4, amd64))

Puppyを使わなくなって久しい今日この頃。Raspiや32ビットPCにdebian入れてヘッドレスで
遊んでます。
アバター
シノバー
記事: 3139
登録日時: 09/03/21(土) 00:05
連絡する:

Re: パピーでプログラミングしてみる(初級編)

投稿記事 by シノバー »

Endeavor_wako さんが書きました:>int なら return で値を返すべきではないでしょうか?
ついでに void main( void ) ってLinuxでは反則なんでしょうか?
Endeavor_wako さんのおっしゃってることは正しいと思います。main()もひとつの関数ですから、終了コードを返し、これは int です。

returnが無い場合は最後に実行された文の終了コードが返されるので、いちおう動きます。
また int main( void ) でなく void main( void )でも動くみたいですが、intのほうが良いのでしょうね(Dosでも)。
http://www.6809.net/tenk/html/cgokai/int_main.htm
The bar master, Shino's Bar
http://shinobar.net/
新谷
記事: 934
登録日時: 08/10/09(木) 18:52
お住まい: 大阪

Re: パピーでプログラミングしてみる(初級編)

投稿記事 by 新谷 »

諸先輩方、つっこみありがとうございます!!
なにせトピックを立てた人の技術力が圧倒的に不足してますので、これからも鋭いツッコミをして頂ければ有難いです<(_ _)>
新谷
記事: 934
登録日時: 08/10/09(木) 18:52
お住まい: 大阪

とりあえずC言語でハローワールド (ちゃんとしたやつ編)

投稿記事 by 新谷 »

Endeavor_wakoさん、シノバーさん、ツッコミ有難うございます。勉強になりました。

コード: 全て選択

#include <stdio.h>
int main(void)
{
   printf("Hello, world!\n");

  return 0;
}

最後に編集したユーザー 新谷 [ 10/02/20(土) 13:03 ], 累計 1 回
新谷
記事: 934
登録日時: 08/10/09(木) 18:52
お住まい: 大阪

とりあえずC言語でハローワールド (超ちゃんとしたやつ編)

投稿記事 by 新谷 »

なぜかGNUプロジェクトの一環としてメンテナンスされているパッケージがあります。
http://ftp.gnu.org/gnu/hello/

コンパイルの仕方、パッケージの構成、シンプルなコードの書き方、などを学ぶいい教材ではなかろうか....。
新谷
記事: 934
登録日時: 08/10/09(木) 18:52
お住まい: 大阪

ネットラジオを聴くアプリ (前フリ)

投稿記事 by 新谷 »

ところで、ある日僕は

コード: 全て選択

#wget -q -O - http://anime.com.pl:8000/radioLQ.mp3 | madplay - &
とか、コマンドラインから実行することでネットラジオが聴けることを発見しました。

色々調べて、色々試してうまくいった時は「やったぜ!」と思いました。
で、毎回コマンドを打つのは面倒なので、これをGTKを使ったアプリケーションにしたいと思ったのでした。
新谷
記事: 934
登録日時: 08/10/09(木) 18:52
お住まい: 大阪

ネットラジオを聴くアプリ (プロトタイプ)

投稿記事 by 新谷 »

で、とりあえず超シンプルなスクリプトで実装してみた。
madplay-radio-000

コード: 全て選択

#!/bin/sh

export MAIN_DIALOG="
<window title=\"ラジオ000\">
<vbox>
<hbox>

	<button>
	<label>ネットラジオを聴く</label>
 	  <action>wget -q -O - http://anime.com.pl:8000/radioLQ.mp3 | madplay - &</action>
	</button>

	<button tooltip-text=\"停止 - このボタンで停止させてからウィンドウの「x」ボタンでアプリを終了して下さい\">
	<input file stock=\"gtk-media-stop\"></input>
	<action>killall madplay &</action>
	</button> 

</hbox>
</vbox>
</window>
"

I=$IFS; IFS=""
for STATEMENTS in  $(gtkdialog3 --program=MAIN_DIALOG --center ); do
   eval $STATEMENTS
done
IFS=$I
最後のほうがよく分かってない.....。が、分からないなりに結構応用が効くのではないだろうか.....。

実行するには、上記のコードを適当な名前(例えばmadplay-radio-000)で保存して、

コード: 全て選択

# chmod +x madplay-radio-000
# ./madplay-radio-000
↓こんな感じになります。
画像
アバター
シノバー
記事: 3139
登録日時: 09/03/21(土) 00:05
連絡する:

シェルから gtkdialog3 を使う

投稿記事 by シノバー »

新谷 さんが書きました:最後のほうがよく分かってない.....。
ここですか?

コード: 全て選択

I=$IFS; IFS=""
for STATEMENTS in  $(gtkdialog3 --program=MAIN_DIALOG --center ); do
   eval $STATEMENTS
done
IFS=$I
IFSはシェル変数で、区切り符号ですね。それを変更してるのか、デフォルトにしてるのか?その上で gtkdialog3の標準出力を一行ずつ eval で評価してますね。

ここは for を使わず、単純に次の1行でOKです。

コード: 全て選択

eval  $(gtkdialog3 --program=MAIN_DIALOG --center )
上記コードは gtkdialog3の出力が 「変数=値」の羅列であることを前提にしています。
そうでない出力が出るような使い方では、もう少していねいにフィルタを掛けると良いかもしれません。たとえば

コード: 全て選択

eval  $(gtkdialog3 --program=MAIN_DIALOG --center| grep '^EXIT=' )
gtkdialog3の出力を使わない場合(どのボタンが押されたか知る必要がない場合)はもっと単純に

コード: 全て選択

gtkdialog3 --program=MAIN_DIALOG --center >/dev/null
「>/dev/null」は標準出力を無間の闇に葬る常套のコードです。Xアプリの出力は /tmp/xerrs.log に残ります。ここに書き出されることが嫌でなければ「>/dev/null」も不要です。
最後に編集したユーザー シノバー [ 10/02/20(土) 14:20 ], 累計 1 回
The bar master, Shino's Bar
http://shinobar.net/
アバター
シノバー
記事: 3139
登録日時: 09/03/21(土) 00:05
連絡する:

ネットラジオを聴くアプリ (もっと単純版)

投稿記事 by シノバー »

コード: 全て選択

#!/bin/sh

export MAIN_DIALOG="
<window title=\"ラジオ000\">
<vbox>
<hbox>

	<button>
	<label>ネットラジオを聴く</label>
 	  <action>wget -q -O - http://anime.com.pl:8000/radioLQ.mp3 | madplay - &</action>
	</button>

	<button tooltip-text=\"停止 - このボタンを押すと演奏が停止します\">
	<input file stock=\"gtk-media-stop\"></input>
	<action>killall madplay &</action>
	</button> 

</hbox>
</vbox>
</window>
"
gtkdialog3 --program=MAIN_DIALOG
killall madplay
停止ボタンを押さずに右上「×」でウィンドウを閉じるとシェルスクリプトに戻ってくるので、そこで killall madplay を実行してやれば演奏が停止します。ウィンドウを閉じると無条件に停止させるので、ボタンの状態を見る必要はないですね。
The bar master, Shino's Bar
http://shinobar.net/
返信する