2011年12月20日火曜日

Linuxでシリアル接続:screen利用

Linuxでシリアル接続をするときのメモ

1. screenインストール
atmark@atde3:~$ sudo apt-get install screen

2. screenで接続
$ screen /dev/ttyUSB0 115200

/dev/ttyUSB0 は変わる場合があります。

システムプログラミング:プロセス間通信(メッセージキュー利用)

[msend.c]

#include <stdio.h>
#include <stdlib.h>
#include <="" span="">ipc.h>
#include <="" span="">types.h>
#include <unistd.h>
int main(){
  struct msgbuf{
  long mtype;
  char mtext [256];
  };
  char line [256];
  int msqid;
  key_t msgkey;
  struct msgbuf msgdata, *p;

  p=&msgdata;
  printf (“Enter message: “);
  fflush (stdout);
  fgets (line, sizeof (line), stdin);
  if (sscanf (line, “%[^n]”, p->mtext) >0){
  // プロセスIDmtypeに入れる
  p->mtype=getpid ();
  msgkey=ftok (“mrecv”, ‘a’);
  // メッセージキュー識別子を得る
  msqid=msgget (msgkey, IPC_CREAT | 0666);
  // メッセージを送信する
  msgsnd (msqid, p, sizeof (p->mtext), 0);
  }
  return EXIT_SUCCESS;
}

[mrecv.c]
#include <stdio.h>
#include <stdlib.h>
#include <="" span="">ipc.h>
#include <="" span="">msg.h>
#include <="" span="">types.h>
int main(){
  struct msgbuf{
  long mtype;
  char mtext [256];
  };
  int msqid;
  key_t msgkey;
  struct msgbuf msgdata, *p;

  p=&msgdata;
  msgkey=ftok (“mrecv”, ‘a’);
  // メッセージキュー識別子を得る
  msqid=msgget (msgkey, IPC_CREAT | 0666);
  while (1){ //無限ループ
  // メッセージを受信する
  msgrcv (msqid, p, sizeof (p->mtext), 0, 0);
  printf (“message received from %ldn%sn” ,p->mtype, p->mtext);
  }
  return EXIT_SUCCESS;
}

atmark@atde3:~/Desktop/work$ gcc -o mrecv mrecv.c
atmark@atde3:~/Desktop/work$ gcc -o msend msend.c
atmark@atde3:~/Desktop/work$ ./msend
Enter message: Hello
atmark@atde3:~/Desktop/work$ ./msend
Enter message: Good
atmark@atde3:~/Desktop/work$ ./mrecv
message received from 10658
Hello
message received from 10659
Good

システムプログラミング:シグナル利用

Ctr+Z(SIGTSTP)を押したら経過時間を表示するプログラム


#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
time_t start;
int main(){
  void stop ();
  time (&start);
  // SIGTSTPが発生したら関数stopを実行
  signal (SIGTSTP, stop);
  while (1){
  sleep (1);
  printf (“ . “);
  fflush (stdout);
  }
  return EXIT_FAILURE;
}

void stop (){
  time_t end;
  time (&end);
  printf (“\n”);
  printf (“elapsed time= %ld seconds\n”, end-start);
  exit (EXIT_SUCCESS);
}

atmark@atde3:~/Desktop/work$ ./timer
 .  .  .  .  .  .  .  .  .  . ^Z\nelapsed time= 10 seconds

システムプログラミング:プロセス間通信(pipe利用)

親プログラムで入力したものを、子プログラムを処理し親プログラムに返す

[parent.c]
#include <stdio.h>
#include <stdlib.h>
#include <="" span="">types.h>
#include <="" span="">wait.h>
#include <unistd.h> 
int main(){
  char line[32];
  char read_fd[3], write_fd[3];
  int number, result;
  int fd[2];
  int st;
  if (pipe(fd) <0){
    perror("pipe");
    exit (EXIT_FAILURE);
  }

  snprintf (read_fd, sizeof (read_fd),"%d", fd[0]);
  snprintf (write_fd, sizeof (write_fd),"%d", fd[1]);
  fgets (line, sizeof (line), stdin);
  if (sscanf (line,"%d", &number) >0){
    if (fork () == 0){
      if (execl ("child", "child", read_fd, write_fd, NULL) <0){
        exit (EXIT_FAILURE);
      }
    }
    write (fd[1], &number, sizeof (number));
    wait (&st);
    read (fd[0], &result, sizeof (result));
    printf ("%d x %d = %d\n", number, number, result);
    close (fd[0]);
    close (fd[1]);
  }
  return EXIT_SUCCESS;
}


[child.c]
#include <stdlib.h>


#include <unistd.h>
int main (int argc, char *argv[]){
  int number, result;
  int read_fd, write_fd;
  // 引数の文字列を整数に変換
  read_fd = atoi (argv[1]);
  write_fd = atoi (argv[2]);
  // パイプラインからデータを読み込む
  read (read_fd, &number, sizeof (number));
  result = number*number;
  // パイプラインにデータを書き込む
  write (write_fd, &result, sizeof (result));
  close (read_fd);
  close (write_fd);
  return EXIT_SUCCESS;
}


atmark@atde3:~/Desktop/work$ ./parent
3
3 x 3 = 9\natmark@atde3:~/Desktop/work$

システムプログラミング:環境変数表示(envp[]利用)


環境変数を標準出力に出力

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char * argv[],char *envp[]){
  int i;
  for(i = 0; envp[i] != NULL; i++){
  printf("%s\n", envp[i]);
  }
  return EXIT_SUCCESS;
}

atmark@atde3:~/Desktop/work$ gcc -o newenv newenv.c
atmark@atde3:~/Desktop/work$ ./newenv

システムプログラミング:簡単シェル(execl利用)


forkで子プロセスを生成し、そこでexeclを使ってコマンドを実行する。

#include <stdio.h>
#include <stdlib.h>
#include wait.h>
#include <unistd.h>
int main(){
  char command[256],line[256];
  int st;
  static char prompt[64] = "> ";
  fprintf(stderr,"%s",prompt);
  while(fgets(line,sizeof(line),stdin) != NULL){
    if(sscanf(line,"%s",command) > 0){
      if(fork() == 0){
        if(execl(command,command,NULL) < 0){
          exit(EXIT_FAILURE);
        }
      }
else{
        wait(&st);
      }
    }
    fprintf(stderr,"%s",prompt);
  }
  return EXIT_SUCCESS;
}

atmark@atde3:~/work$ gcc -o nsh nsh.c
atmark@atde3:~/work$ ./nsh
> /bin/ls
lv  lv.c  lv2  lv2.c  nsh  nsh.c  nsh.c~

2011年12月19日月曜日

システムプログラミング:タイマー(スレッド利用)


スレッドでタイマーを走らせる

#include<pthread.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(int argc, char *argv[]){
  pthread_t thread;
  void *print_message(void *args);
  pthread_create(&thread, NULL,
  print_message, argv[1]);
  pthread_join(thread, NULL);
  return EXIT_SUCCESS;
}

void *print_message(void *args){
  int dep_time;
  dep_time = atoi(args)*60-5;
  sleep(dep_time);
  fprintf(stderr, "You have to leave in 5 secondes\n");
  return NULL;
}

$ gcc -o lv2 -l pthread lv2.c
$ ./lv2 1



2011年12月6日火曜日

日本e-learning学会 2011学術講演会レポート

こんにちはー。
またもや情報システムアドバンス科3年、関ちゃんです。
12月2日(水)日本e-learning学会2011学術講演会(産業技術大学院大学@東京)で、
「クラウドを利用した効果的な実習環境の構築」という題で研究発表を行ってきました。
その報告をば。

発表内容は、これまで学生PCや実習室に構築していた実習環境(開発用ソフトやサーバOS)を、クラウド上のVPSに構築しようという提案です。
今回は日本ラッド株式会社のご協力を頂き、共同開発したシステムを紹介しました。
これが普及すれば、実習環境構築や生徒管理の手間が激減するだけでなく、費用削減、遠隔利用などの効果があります。

簡単にいうとこんな感じ。
うん、内容はそれなりに頑張ってまとめたつもり。内容はね。

問題は発表ですよ。
他の発表者の方々、原稿もなしに指示棒持ってペラペラ語るよ、
超分かりやすいよ
私の前に発表した大学院生の人、すごい突っ込んだ質問されてるよ!

私のチキン★ハートが震えるぜ!!
ガクガク(((° Д °;)))ブルブル 

うん、まぁ、どうしようもないので、用意した原稿棒読みしましたけどね。
膝と手が震えるのですごく読みづらかった。
発表時間の目安をオーバーしてましたが、
適当に削ってまとめるとかそんな器用なこと出来ない!
テンパったまま全部読みきりました。
完全に涙目です、ありがとうございました。

・・結構がんばって練習とかしてたんだけど、そう簡単に上手くは行かないもんですね。
おかげでそれほどキツイ質問は飛んで来なかったから結果オーライか。(どこが)

もうちょっと喋る訓練をしなきゃだめだなーと反省した次第でした。
精進します。
以上でレポートをおわります。

AWS SDK for Javaを使うメモ

AWS SDK for Javaを使ってみました。

1.Eclipseの準備
ヘルプ->新規ソフトウェアのインストール->追加
ラベル名:Work with
ロケーション:http://aws.amazon.com/eclipse
AWS Toolkit for Eclipseを選択しインストールします。



2.AWSの設定
Eclipseを再起動し、AWSのアイコンができているのを確認します。
アイコンクリック->設定




ここで入力する情報はAWSにログインし、Security Credentials(セキュリティ証明書)から得られます。
http://aws.amazon.com/security-credentials


設定がされるとexploreに情報がでてきます。


3.サンプルを実行まで
http://aws.amazon.com/jp/sdkforjava/ よりSDKをダウンロード


デスクトップに解凍し、中身を見てみます。Sampleがあるのでそれを利用します。
新規->AWS Java Project->
プロジェクト名:AmazonS3
Amazon S3 Sampleにチェック
アカウントも選択します。


あとはJava Applicationを実行してみます。

2011年12月3日土曜日

MACでVNC接続

MACでは標準でVNC接続ができます。

上部メニュー->移動->サーバーへ移動

サーバアドレス欄に
vnc://サーバのIPアドレス:ポート番号/
ポート番号は、例えば
root:1
で設定した場合は 5901 を指定してrootでログイン