絶対PATH,相対PATHの演習
絶対PATH,相対PATHの理解のため、コマンドラインを用いた演習も行う。
ファイル関連コマンドの基本
(( まずは cmd.exe の起動 )) メニュー検索より、"cmd.exe" を探して起動 (( ファイル操作命令の基礎 )) dir PATH ディレクトリの一覧を表示 例:dir C:¥Windows type PATH ファイルの内容を表示 例:type Z:¥sample¥sample.c mkdir PATH ディレクトリを作成 例:mkdir Z:¥foo rmdir PATH ディレクトリを削除 例:rmdir Z:¥foo echo "abc" > Z:¥sample¥data.txt テキストファイルに出力
演習
(( 絶対PATH )) Z: dir ¥ mkdir ¥fukui echo "fukui" > ¥fukui¥fukui.txt type ¥fukui¥fukui.txt mkdir ¥fukui¥sabae echo "sabae" > ¥fukui¥sabae¥sabae.txt dir ¥fukui¥sabae type ¥fukui¥sabae¥sabae.txt (( 相対PATH )) cd ¥fukui¥sabae dir . dir .. type sabae.txt type ..¥fukui.txt dir ..¥..
ファイル入出力
今日は、ファイル入出力のプログラム演習。
ファイル入出力
// 基礎的なファイル入力 #include <stdio.h> void main() { FILE* fp ; if ( (fp = fopen( "data.txt" , "rt" )) != NULL ) { char name[ 100 ] ; int age ; while( fscanf( fp , "%s%d" , name , &age ) == 2 ) { printf( "%s %d\n" , name , age ) ; } fclose( fp ) ; } }
// 入力したデータから条件を満たすデータだけを出力 #include <stdio.h> void main() { FILE* fp_in ; FILE* fp_out ; if ( (fp_in = fopen( "in.txt" , "rt" )) != NULL ) { if ( (fp_out = fopen( "out.txt" , "wt" )) != NULL ) { char name[ 100 ] ; int age ; while( fscanf( fp_in , "%s%d" , name , &age ) == 2 ) { if ( age >= 18 ) fprintf( fp_out , "%s %d\n" , name , age ) ; } fclose( fp_out ) ; } fclose( fp_in ) ; } }
テキストモードとバイナリモード
前述プログラムでは、fopen のファイルモードで、"rt" , "wt" のように 文字"t"をつけている。これは、OSによる行末文字の取り扱いの トラブルを防ぐためのもの。
OSの成り立ちの違いで、Windows と Unix では、行末文字の取り扱い方法 が違う。
Windows では、次の行の先頭に移動するには、"\r"(キャリッジリターン)と "\n"(ラインフィード)が必要となる。
一方、Unix では、次の行の先頭に移動するには、"\n"(ラインフィード)だけ でいい。
この違いがあるため、Unixで開発されたC言語で書いたプログラムを Windows で動かそうとすると、
// Unix Windows printf( "Hello\n" ) ; // Hello Hello printf( "World\n" ) ; // World World
と異なる表示になってしまう。これでは、WindowsでC言語を書く場合は、 printf( "Hello\r\n" ) といった書き換えが必要になってしまう。
これを防ぐために、fopen で "…t" 書くことで「テキストモード」に 指定すると Windows で printf( "\n" ) を出力すれば、 "\r\n" に変換して出力してくれる。入力時にも同様に、"\r\n" があると、 "\n" に変換してくれる。
絶対PATHと相対PATH
前述のプログラムで、fopen( "data.txt" , "rt" ) と指定すると、 プログラムの保存しているディレクトリと同じ場所から、"data.txt" を 探そうとする。(相対PATH)
しかし、別のディレクトリにあるデータを読む場合には、 場所を明記するために、Z:\directory\data.txt のように、 ルートディレクトリからの場所(Windowsではドライブ名付きで)を 指定する。(絶対PATH)
ただし、Windows でのディレクトリ区切り文字 '\' は、C言語の文字列内では、 特殊文字を指定する時に使われる。このため、文字列内では \\ の様に 書く必要がある。
fp = fopen( "Z:\\directory\\data.txt" , "rt" ) ;
この場合、"\\"と2重で書くことで、Unix と Windows のプログラムの 書き換えが必要となるのを防ぐため、上例は、Unixのディレクトリ区切り文字"/"を使って、以下のように書いても良い。
fp = fopen( "Z:/directory/data.txt" , "rt" ) ;
太陽電池測定システム
短期留学生の Joi さんが来校中。 自国でのプログラミングでは、色々と経験がありそうだったので、 当初予定していた実験課題は簡単に終わってしまう。
そこで、少しづつ説明を加えながら、レベルアップしてもらった。
当初は、組み込み系の開発経験が無いとのことだったので、 Arduino で太陽電池の観測システムを作ろうというのが、 ことの始まり。
でも、Arduino + Processing(PC)での観測は、簡単に完成。
そこで、Raspberry-Piを出してきて、継続的に観測するシステムに 予定変更。Raspberry-Pi と Arduino を接続して動かす実験を 体験してもらい、それを記録させる。
さすがに記録させてグラフ表示まで作ろうとすると時間が 足りないので、この部分は Raspberry-Pi に munin をインストールし、 サクっと動かしてもらう。
といっても、Arduino と接続する処理で、シリアルポートの 読み書き権限やら、munin から呼び出される時の、読み書き権限に ついては、分かりにくいので私がサポートした。
情報処理センターのパスワードの失効対策
総合情報処理センターでは、2015年4月にシステムの更新を 行いましたが、稼働からほぼ400日を経過し、学生アカウント では、パスワードの有効期限から変更の警告が届いていたり、 アカウントロックとなったと表示される場合があります。
有効期限の警告の場合
通常ユーザが教育システムのパスワードを変更する場合は、 下記のURLにアクセスしてください。
https://kauthsv.fukui-nct.ac.jp/iumus/
このページは、学内からしかアクセスできません。
アカウントロックされている場合
総合情報処理センターにパスワードロックの解除を依頼して ください。解除後に伝えられるパスワードは暫定パスワード ですので、上記「有効期限の警告の場合」と同様に、 パスワードの変更を行ってください。
年度初めにパスワード変更を…
本校では、パスワード有効期限が400日となっていますので、 ほぼ1年間(+猶予期間一ヶ月)となります。つきましては、 年度始めにには、必ずパスワード変更をするようにお願いします。
Google検索をPerlでやってみる
卒研でデータ検索のプログラムを作ってもらおうとしているが、 Google Search API などは、1日100回制限もあるので、 少しマナーが悪いけど、LWPでアクセス。 UserAgent が libwww-perl だと検索を拒否されるので、一工夫。
#!/usr/bin/perl use LWP::Simple ; use Jcode ; ######################## # LWP でアクセス # ######################## # ユーザエージェントを libwww-perl から変更しないとGoogleに拒否される。 my $ua = LWP::UserAgent->new( agent => 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; NP06; rv:11.0) like Gecko' ) ; # 問い合わせ文字 my $query = '猫 OR ネコ' ; # 問い合わせ文字をURLエンコード $query =~ s/([^ 0-9a-zA-Z])/'%'.unpack('H2',$1)/eg ; $query =~ s/ /+/g ; print $query."\n" ; # 問い合わせのURLを作る my $query_url = 'http://www.google.co.jp/search' .'?hl=ja&q='.$query.'&lr=' ; print $query_url."\n" ; # 問い合わせを実行 my $response = $ua->get( $query_url ) ; # 問い合わせ失敗時の処理 die $response->status_line unless( $response->is_success ) ; my $content = $response->content ; ################################ # 検索から必要な情報を抜き出す # ################################ # 参考: http://dqn.sakusakutto.jp/2010/06/perlhtml.html use HTML::TreeBuilder ; my $tree = HTML::TreeBuilder->new ; $tree->parse( $content ) ; my @items = $tree->look_down( 'class' , 'st' ) ; foreach my $item ( @items ) { print "-------------\n" ; print $item->as_text."\n" ; } ### Local Variables: ### ### mode: perl ### ### End: ###