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

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

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

アバター
シノバー
記事: 3139
登録日時: 09/03/21(土) 00:05
連絡する:

Re: grep の巻 (C言語・簡易)

投稿記事 by シノバー »

新谷 さんが書きました:grepコマンドってUTF-8環境だと遅いので、簡易grepをC言語で書いてみたいなぁと思っていた
簡易grepがいちばん早いのはもちろんですが、ASCIIに限るならシェルコマンドで次の方法があります。

コード: 全て選択

LANG=C grep <pattern> <file>
LANG=C はこの文にだけ有効で、他には影響を及ぼしません。
The bar master, Shino's Bar
http://shinobar.net/
新谷
記事: 934
登録日時: 08/10/09(木) 18:52
お住まい: 大阪

grep の巻 (C言語・簡易・プロトタイプ)

投稿記事 by 新谷 »

最終的にこうなりました。

grep-simple-20100225.c

コード: 全て選択

#include <stdio.h>
#include <string.h> // strstr()
#include <stdlib.h> // exit()
#define SIZE 256

int main(int argc, char *argv[]) {

int line;
char *key_word, read_buff[SIZE];
FILE *fp;

if (argc != 3) {printf("Usage: grep-simple [Keyword] [File]\n"); return 0;}

fp = fopen(argv[2], "r");
if (fp == NULL) {printf("file not found. %s\n", argv[2]); exit(1);}

/* メイン・プログラム */
key_word = argv[1];
line = 0;
fgets(read_buff, SIZE, fp);
	while (!feof(fp)) 
	{
		line += 1;
	if (strstr(read_buff, key_word) != NULL)
		printf("%s", read_buff);
		fgets(read_buff, SIZE, fp);
	}
fclose(fp);

return 0;
}

ペットパッケージも一応作りました。
http://groups.google.co.jp/group/koropu ... rep-simple

あとは「cut」と「tr」も簡易化したいなぁ....。
新谷
記事: 934
登録日時: 08/10/09(木) 18:52
お住まい: 大阪

Re: grep の巻 (C言語・簡易)

投稿記事 by 新谷 »

シノバー さんが書きました:ASCIIに限るならシェルコマンドで次の方法があります。

コード: 全て選択

LANG=C grep <pattern> <file>
LANG=C はこの文にだけ有効で、他には影響を及ぼしません。
そのとおりなのですですが :lol: :lol:
えー、あと一つ前のエントリでもちらっと触れましたが、パピーって
「grep と tr と cut のコンボ技」って結構多いじゃないですか。あれを何か一つのコンパクトなバイナリでやりたいなぁ....とぼんやり思ったりもしてるのです。
新谷
記事: 934
登録日時: 08/10/09(木) 18:52
お住まい: 大阪

grep ちょっといい使い方

投稿記事 by 新谷 »

前にパピーのinitrd.gzの中のスクリプトを読んでいて、多分シノバーさんが書いたとおぼしき部分に、メカラ・ウロコ :shock: な箇所がありました。

コード: 全て選択

# 01jul09 copy prefered in case cd or flash #v431jp except flash
[ $PUPMODE -eq 12 ] && echo "$PMEDIA" | grep -q 'cd' && PCOPY="yes"
こーゆーgrepの使い方がサッとできればいいなぁ、と思いました。

備考:
grep -q
-qは検索結果を表示しないオプション
'cd' という文字列の有無によって、grep -q 'cd' && の部分で分岐が成立している。
新谷
記事: 934
登録日時: 08/10/09(木) 18:52
お住まい: 大阪

ポインタ (C言語)

投稿記事 by 新谷 »

初心者の例に漏れず、ポインタの理解にとまどってます。
うまく説明しているページを見つけたのでリンク http://www9.plala.or.jp/sgwr-t/c/sec10.html

リンク先にある図解:
画像
新谷
記事: 934
登録日時: 08/10/09(木) 18:52
お住まい: 大阪

echo コマンド (C言語 簡易)

投稿記事 by 新谷 »

パピーでは、echoコマンドは/bin/echoにあり、これはbusyboxのシンボリックリンクになってます。
ということで、自前でechoコマンドを実装してみようという試み.....。

echo-simple.c

コード: 全て選択

#include <stdio.h>

main(int argc, char* argv[]) {
int i;

for(i=1; i<argc; i++) { printf("%s ",argv[i]); }

printf("\n");
return 0;
}

コンパイル

コード: 全て選択

#gcc -o echo echo-simple.c
試してみる

コード: 全て選択

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

cut コマンド (C言語 簡易)

投稿記事 by 新谷 »

個人的に念願だったcutコマンドのシンプル版を実装することができました。

ペットパッケージも作成しました。
cut-simple-0.0.1.pet http://groups.google.co.jp/group/koropu ... cut-simple

使い勝手はcutコマンドを単純にしたような感じです。

コード: 全て選択

#cut-simle "区切り文字" "フィールド番号" "文字列" 
例えば、

コード: 全て選択

#cut-simple "|" 3 "abiword|7764K|wordprocessor|puppy4|"
だと、

コード: 全て選択

wordprocessor
が出力されます。

コードは以下のようになりました。

cut-simple.c

コード: 全て選択

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (int argc,char *argv[])
{
	if (argc != 4)
	{
	printf("cut-simple ヘルプ:\nこれはcutコマンドのシンプル版です。\n\n");
	printf("使用法: \n");
	printf("cut-simle [区切り文字] [フィールド番号] [文字列] \n\n");
	printf("例1:\n#cut-simple A 2 xxxAyyyyAzzzzA \n");
	printf(".....この場合、文字列「xxxAyyyyAzzzzA」からAで区切られた2番目のフィールドを取り出す、という意味です。\n");
	printf("yyyy が出力されます。\n\n");
	printf("例2:\n");
	printf("#cut-simple \"|\" 3 \"abiword|7764K|wordprocessor|puppy4|\" \n");
	printf("wordprocessor \n\n");
	printf("注意: デフォルトの区切り文字は設定されてませんので必ず指定して下さい。\n");
	exit(1);
	}

	int cont;

	char buff1[10];	//第1引数のために使用するグループ
	char *pb1;

	char buff2[10];	//第2引数のために使用するグループ  
	char *pb2;
	int i;

	char buff3[256];	//第3引数のために使用するグループ
	char *pb3;

	char temp[256];	//繰り返し処理のために使用するグループ
	char *iii;


		/*****  第2引数から数字を変換、最終的に i に代入される、なんか納得いかない処理  ******/
	pb2 = buff2;
		strcpy(pb2,argv[2]);
	i = (buff2[0] - 48);	//'0'の文字コードが48なので
		// printf("第2引数の数字: %d\n",i);


	pb1 = buff1;
	strcpy(pb1,argv[1]);	//ポインタの初期化と引数1の前処理

cont = 1;

	if(i != cont){

	pb3 = buff3;
	strcpy(pb3,argv[3]);	//ポインタの初期化と引数3の前処理 (第2引数が2以上の場合)

	iii = temp;			//第2引数が2以上の場合の場合の1回目のソート
	iii = strstr(buff3,buff1);
	++iii;
	++cont;
	}

	else{
	iii = temp;		//ポインタの初期化と引数3の前処理 (第2引数が1の場合)
	strcpy(iii,argv[3]);
	}
	

				/***** 第2引数が2以上の場合の場合の2回目以降のソート *****/
	while(i > cont){
		strcpy(pb3,iii);
		iii = strstr(buff3,buff1);
		++iii;
		++cont;
	}

		//最終処理
		// 例: #cut-simple A 2 xxxAyyyyAzzzzA    ならばこの時点で yyyyAzzzzA までソートされている
	while(*iii != *pb1 ){
		printf("%c",*iii);	// ↑の例だとAに出会うまで1文字づつ出力
		++iii;
	}
					// ↑の例だと最終的に yyyy が出力される

printf("\n");
return 0;
}
エラー処理とかが無いに等しいですが....^ ^;

自分の知ってる関数、(strcpy,strstr,printf)の三種類しか使ってない.....ので、初心者にやさしいんじゃないでしょうか.....(言い訳)。
あんまり美しくない部分もあるので、もっとビシッとした感じで書けないかなぁ.....。

関数についての簡単な説明:
strcpy()関数.....文字列をコピーする。
strstr()関数......文字列を比較して、重複文字以降を返す。
printf()関数......文字列を出力する。

ちなみに以前は、こんな感じのもうちょっとだけ大きなプログラムが /usr/local/petget/find_cat として収録されていたと記憶してます。
ペットパッケージ情報をソートするため専用にバリーさんがCで書いたプログラムで、ソースも同梱されていました。
現在の /usr/local/petget/find_cat は、ちょっと意味合いが違うみたいです(GUI表示を支援するプログラムみたい)。
最後に編集したユーザー 新谷 [ 10/03/02(火) 07:09 ], 累計 1 回
新谷
記事: 934
登録日時: 08/10/09(木) 18:52
お住まい: 大阪

C言語 ポインタについて

投稿記事 by 新谷 »

初心者がつまづく定番ポイントとして有名な、「ポインタの概念」ですが、例に漏れず僕もだいぶ理解に苦しんだです(今でも怪しい理解)。

一個づつずらしていったり、strcpy()関数で文字列を流し込んだりするのは、何かイメージ的に「そろばん」の操作に似てるなぁ.....なんて思いました。
.....公文式でちゃんと習っとけばよかった :cry:

慣れてる人は、ポインタの指すアドレスが「カシャ、カシャッ」という感じで頭の中で動いてるんだろうか.....動いてるんだろうな.....。
Endeavor_wako
記事: 380
登録日時: 09/09/18(金) 01:54

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

投稿記事 by Endeavor_wako »

>慣れてる人は、ポインタの指すアドレスが「カシャ、カシャッ」という感じで頭の中で動いてるんだろうか.....動いてるんだろうな.....。

その程度の理解では早晩行き詰まるかとw

僕がプロだった当時(20年くらい前)、BASICでプログラミングを覚えたやつは仕事ができない、とCOBOL使いに馬鹿にされてました。

僕自身、高級言語のポインタを覚えたのはCが最初だったのですが、今考えるとCでポインタ(の概念)を覚えるのは余り賢明でないような気がします...

Cでプログラミングを覚えたやつは仕事ができない(時間的な意味で)、現在ならこの位言われるのかなあ。
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入れてヘッドレスで
遊んでます。
新谷
記事: 934
登録日時: 08/10/09(木) 18:52
お住まい: 大阪

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

投稿記事 by 新谷 »

>慣れてる人は、ポインタの指すアドレスが「カシャ、カシャッ」という感じで頭の中で動いてるんだろうか.....動いてるんだろうな.....。

その程度の理解では早晩行き詰まるかとw
だめっすか.....orz。
いやー、なかなか難しいものです。霧が晴れるようにパッと理解が進む瞬間がいつか訪れればいいのですが。
僕自身、高級言語のポインタを覚えたのはCが最初だったのですが、今考えるとCでポインタ(の概念)を覚えるのは余り賢明でないような気がします...
C初心者の僕にはまだピンときませんが、しかしこれは良いアドバイスを頂いたかもしれません。頭の片隅に留めておくです。
新谷
記事: 934
登録日時: 08/10/09(木) 18:52
お住まい: 大阪

ネットラジオを聴くアプリ (GUI シェルスクリプト)

投稿記事 by 新谷 »

ということで、しつこくネットラジオを聴くアプリを追求してるんですが、まずは機能的に完全なものをシェルスクリプトで完成させよう......と思ったら、サクサク書けてしまって
「やっぱりシェルスクリプトは楽しいなぁ(゚∀゚)」ということになりました。

ペットパッケージはみのむしさんのサイトにアップさせて頂きました<(_ _)>
madplay-radio-0.5.pet http://www.mland.jp/pub/Linux/Puppy/use ... /file/431/

画像
ソースをここに張るにはちょっと長過ぎ(250行くらい)になってしましましたので、
↓に張りました。
http://groups.google.co.jp/group/koropu ... 0.5.sh.txt

でも、文法的には簡単なことしかしてないし、スカスカだし、初心者向きなんじゃないだろうか....。
いわゆるひとつのケーススタディなんで、おかしな部分があれば、ツッコミ歓迎です。

あとはCで書き直すか.....どれくらいの行数になるんだろう.....。
最後に編集したユーザー 新谷 [ 10/03/02(火) 07:02 ], 累計 1 回
新谷
記事: 934
登録日時: 08/10/09(木) 18:52
お住まい: 大阪

バリーさんによるプログラミング指南書

投稿記事 by 新谷 »

いつかどなたが書いておられたか忘れてしまったのですが、バリーさんの本をAmazonで検索してみた、という文章を見た記憶があります。

で、僕も検索してみたらいくつかヒットしました。

「Windows Assembly Language and Systems Programming: 16- and 32-Bit Low-Level Programming for the PC and Windows」 (初出は1993年?)
http://www.amazon.co.jp/Windows-Assembl ... 957&sr=8-3

「PC Architecture and Assembly Language」 (1992)
http://www.amazon.co.jp/Architecture-As ... 957&sr=8-5

「Flow Design for Embedded Systems: A Radical New Unified Object-Oriented Methodology」 (1997)
http://www.amazon.co.jp/Flow-Design-Emb ... 957&sr=8-2

アセンブリばっかりのような気がする......。
あまり初心者に役立つとは思えませんが、まぁ。
アバター
みのむし
記事: 1164
登録日時: 08/09/10(水) 13:56
お住まい: 福岡市中央区草香江1-2-40-101号
連絡する:

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

投稿記事 by みのむし »

>ということで、しつこくネットラジオを聴くアプリを追求してるんですが、...

新谷さん、お疲れ様でした。
早速、ダウンロードして試してみました。

・Madplay の終了はどのように :?: ウィンドウ右肩の×をクリックして :?:
・Newsで、AUTHOR、COPYRIGHTが不明なタグと出ています。
・Madplayとは無関係ですが、私の環境では音量を大きく出来ません。
 音は聞けるのですが、ボリュームを100%にしても大音量になりません。
みのむし
Notebook PC HP G62
CPU: Intel(R) Core(TM)i5 M450 @ 2.40GHz
MEM: 4GB
Puppy Linux Quickset 5.1.1 JP
PC内蔵無線LANデバイス RTL8171(r8192se_pci)
新谷
記事: 934
登録日時: 08/10/09(木) 18:52
お住まい: 大阪

Re:ネットラジオを聴くアプリ

投稿記事 by 新谷 »

みのむしさん、お試し有り難うございます。
Madplayの終了はどのように?
停止ボタンで再生停止、ウィンドウの右上「x」ボタンで再生停止&アプリ終了、という感じです。
Newsで、AUTHOR、COPYRIGHTが不明なタグと出ています。
これはGxineの仕様なんじゃなかろうかと....(再生には問題ないと思います)。

....という感じになってますがいかがでしょう?
新谷
記事: 934
登録日時: 08/10/09(木) 18:52
お住まい: 大阪

setvol ボリューム調整

投稿記事 by 新谷 »

みのむし さんが書きました:音は聞けるのですが、ボリュームを100%にしても大音量になりません。
やや話が逸れますが、パピーには「setvol」というちょっと面白いボリューム調整プログラムが収録されています。
端末から

コード: 全て選択

#setvol 0 80 80 
とかしてみて下さい。うまくいくかもしれません。
/usr/share/doc/setvol.txt により詳しいドキュメントがあります。

ところで、この「setvol」のソースを参照したいのですが、どなたかソースのある場所をご存知ないですか?
返信する