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でログイン

2011年11月14日月曜日

平成23年度秋季研究大会の報告

お久しぶりです。
ほぼロム専な管理人その2、関ちゃんですよ。
報告と寄稿をいただきましたのでお知らせします。

平成23年11月11日(金)~13日(日)にいわて県民情報交流センター「アイーナ」で日本経営工学会 平成23年度秋季研究大会が開催されました。

産技からゲーム科2年生 丸山結以さんが「AHPを利用した効果的なクラウドサービス提供の枠組み」のテーマでプレゼンを行いました。
丸山ちゃんおつかれ!(・∀・)ノ
感想を寄稿してもらったので以下に掲載します。

-----

無事に帰ることができ安心しました。

初めての割には、よく出来ていた
こう言ってもらえたことが、とても嬉しかったです。

よく出来たのは協力してくださった先輩や先生、皆さんのおかげです。
スライドの作成や、その内容について、発表の仕方、聞く姿勢など
今日の発表は私の勉強不足を実感しました。

スライドの作成もほぼお願いしてしまいましたし、
質疑応答にも答えられませんでした。
発表中の動作も、欠点がいくつもありました。
反省点しか浮かばないくらいです。

やる気ももちろん大事だけれど
それに見合った実力をつける努力をする
という事が大事であり基本だと強く思いました。

今回発表に参加できたことで、多くのことを学ぶ事が出来ました。
貴重な体験をさせていただけたことに感謝です。
今日の反省点を、今後生かせるように、努力していきたいと思います。

 丸山結以

2011年11月9日水曜日

重複組み合わせの全組み合わせを表示

重複組み合わせの全組み合わせを表示するプログラムです。
今回種類が3なのでループも3重になります。
種類の数でループの深さが決まります。

#include

#define KYOTEN 3
#define NUMBER 5

//3H5=7C5=21通り

int fact(int);

void main() {
int k1, k2, k3, i = 1;

printf("今回はK=%d, N=%dで%dH%d=%dC%dとなり%d通りあります\n", KYOTEN, NUMBER, KYOTEN, NUMBER, KYOTEN+NUMBER-1,NUMBER, fact(KYOTEN+NUMBER-1)/(fact(NUMBER)*fact(KYOTEN-1)));

for(k1 = 0; k1 <= NUMBER; k1++) {
for(k2 = 0; k1+k2 <= NUMBER; k2++) {
for(k3 = 0; k1+k2+k3 <= NUMBER; k3++) {
if(k1+k2+k3 == NUMBER)
printf("%d番目 %d %d %d\n",i++, k1, k2, k3);
}
}
}
}

//階乗関数
int fact(int num){
int i;
if(num == 1){
return 1;
} else {
i = num * fact(num - 1);
return i;
}
}

2011年10月8日土曜日

Windowsタスクスケジューラを利用して姫野ベンチ実行、DBアップロード

Windowsタスクスケジューラを利用して姫野ベンチ実行、DBアップロードをするメモです。

[準備]
・プロジェクトをEclipseにインポート
・Dドライブ直下に(なければCドライブ直下に)Himenoフォルダを設置
・Dドライブ直下に(なければCドライブ直下に)Benchmarkフォルダ設置

1.次のファイルを作成
[Himeno.java]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;

public class Himeno {

String t;

public static void main(String[] args) throws InterruptedException,
IOException {
ProcessBuilder pb = new ProcessBuilder("D:\\himeno\\himenoBMTxp_s.exe");//必要に応じて変更
Process p = pb.start();

BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
Catcher c = new Catcher(br);
c.start();

TimerTask task = new ProcessDestroyer(p);
Timer timer = new Timer("プロセス停止タイマー");
timer.schedule(task, TimeUnit.SECONDS.toMillis(80)); //80秒後にProcessDestroyer#run()が呼ばれる。必要に応じて変更

for (;;) {
try {
p.waitFor(); //プロセスの終了待ち
break;
} catch (InterruptedException e) {
e.printStackTrace();

//waitFor()はInterruptedExceptionが発生する可能性があるが、
//今回の例では、その場合もプロセスの終了待ちを繰り返す。
//(プロセスの強制終了とInterruptedExceptionは無関係)
}
}

timer.cancel(); //タイマーのキャンセル(必須)

// System.out.println(c.out.toString());
// System.out.println(c.out.toString().indexOf("MFLOPS",210)); //最初のMFLOPSは203文字目に出現
int idx = c.out.toString().indexOf("MFLOPS",210);
String t = c.out.toString().substring(idx+10,idx+18);
// System.out.println(t);

Mysql ms = new Mysql();
ms.mysqlInsert(Double.parseDouble(t));

}

int getValue()
{
int value = Integer.parseInt(t);
return value;
}
}


class ProcessDestroyer extends TimerTask {

private Process p;

public ProcessDestroyer(Process p) {
this.p = p;
}

@Override
public void run() {
p.destroy(); //プロセスを強制終了
}
}


class Catcher extends Thread {
Reader in;
StringWriter out = new StringWriter();
public Catcher(Reader in) {
this.in = in;
}

public void run() {
int c;
try {
while ((c = in.read()) != -1) {
out.write((char)c);
}
} catch (IOException e) {
e.printStackTrace();
}

}

}


[Mysql.java]
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

class Mysql {

public void mysqlInsert(double vl) {
String msg = "";
try {
// ドライバロード
Class.forName("org.gjt.mm.mysql.Driver");

// MySQLに接続
Connection con = DriverManager.getConnection("jdbc:mysql://ホスト名/DB名", "ユーザ名", "パスワード");

// ステートメント生成
Statement stmt = con.createStatement();


// SQLを実行
String sql = "INSERT INTO himeno_benchmarks(server_id,MFLOPS_measured) VALUES (40,"+vl+")";//40はID。VPSのIDを調べて変更する
stmt.executeUpdate(sql);

// 接続を閉じる
stmt.close();
con.close();
}catch (ClassNotFoundException e){
msg = "ドライバのロードに失敗";
System.out.println(msg);
}catch (Exception e){
msg = "ドライバのロードに失敗しました";
System.out.println(msg);
}
}
}

2.実行可能Jarファイルの作成
図のように実行可能JARファイルを作成します。


これをD:\Benchmark\Himeno40.jar として保存します。

ここまで確認
javaw -jar D:\Benchmark\Himeno34.jar
が実行され、DBに内容が保存されるか確認
Javaがインストールされていなかったらインストール(パス登録も)

3.タスクスケジューラの登録

重要
外部JARファイルとして利用していた「mysql-connector-java-5.0.8-bin.jar」を
「C:\Program Files (x86)\Java\jre6\lib\ext」にいれておきます。
これがないとスケジューラではDBにアップロードされませんでした。

タスクスケジューラに図のように登録します。

「ログインしているかどうかかかわらず実行する」にチェックをいれる

ファイル名はHimeno**.jar (**はID)
プログラム:javaw
引数: -jar D\Benchmark\Himeno**.jar


これで毎時結果がDBにアップロードされます。
ちょっと不安定ですがこれで様子をみます。

2011年10月3日月曜日

GALAXY Tab Market ID統一管理

はーい。こんにちは。
blog初登場のT09003 萩原健太こと、通称"はぎけん"です。
が、まあ萩原です。よろしくお願いします。
今回Webのandroid marketからGALAXY Tabにアプリのインストールをするとき
1つのIDで多数のGALAXY Tabにアプリをインストールできるよう環境を設定しました。
見にくい画像やらいたらない表現があるかもしれませんが
今回のそのなかで1つの手段について記述します。
今まで使っていたGALAXYにそのまま新たに共通IDを設定してやろうと
考えたのですがWebのmarketのマーケットアカウントというところに
端末が表示されることがなくうまくいきませんでした。
いろいろ調べ、試行錯誤した結果
現在のGALAXYの利用状況でうまく共通IDの設定をするのは無理なのでは?
という見解にたどりついてしまったので1からやり直すことにしました。
そこでまず。
端末の初期化です。
ここでは画面上の設定にある初期化をしてもいまく1から設定しなおすことはできません。
電源を切ります。→ 電源ボタンとVolアップボタンを同時に長押しします。
そうすると今までに見たのとのないこの黒い画面が出ます。
撮影者が写りこんでますがすみません萩原です。
気になさらないでください。
この画面とは初対面だったのでテンション上がりました。
そしてドキドキ感やばかったー。(笑)
※端末横のVolボタンで上下選択できます。
wipe data/factory resetを選びHOMEボタンを押します。
ドロイド君がいる画面に切り替わります。そこで少し待ってから
もう1度HOMEを押します。
この別の黒い画面が現れるのでここでは
Yes -- delete all user dataを選びHOMEボタン。
またドロイド君が出てきます。
さらに少し待ってからHOMEボタンを押します。
reboot system nowを選びHOMEボタン。
ドロイド君の画面が出るのでさらに少し待つ。
もう1度HOMEを押しましょう。
これで端末が起動し始めます。
SIMについてはなくても大丈夫です。
ここからは通常通り設定を進めていきます。
ポイントのみ記述します。
1.インターネット接続はWi-Fiのみでも大丈夫です。
2.Googleのアカウントを新たに作成してください。
これ以外の設定は流れで最後まで進めてください。これで設定は終わりです。
画面が出てきたらマーケットアプリを開いて”同意する”を押してください
次にマーケットを閉じて
Webからandroid marketにいきます。
画面右上のログインをクリックし、先ほど設定したGoogleアカウントでログインします。
その後、マーケットアカウントの端末欄に端末が表示されたら1台目が完了です。
Webでの反映には少し時間がかかる場合があるので少し気長に。
気休めかもしれませんが、端末からマーケットアプリを開いたり閉じたり
Webでログインし直してみたり私はしていました。(笑)
たぶん、いや、確実に気休め。(笑)
2台目以降の設定についてですが。
同じように黒い画面で初期化して端末設定を進めます。
違う点は1つのみで。
Googleアカウントを作成せず、1台目の初期設定で設定したアカウントにログインすることです。
その後も同じように設定したりマーケットにつないだり
Webでandroid marketにログインしたりします。
マーケットアカウントの端末欄に新しく端末が追加されたらこれでOKです。
ここに反映されるまでに1時間近くかかったりしたときもあって結構あせりました。(笑)
ちなみに端末本体の設定でアカウントと同期をとる必要もとくにありません。
こんな感じで端末が追加されていきます。
私はこんな感じで簡単に名前うつけてあります。
Tabにもテプラが貼ってあるので管理は十分できます。
アプリをダウンロードするときに端末を選択できるようになるので
そこで1台ずつインストールすることができるようになります。
こんな感じで。
別の端末に送信
を開くとこんな感じで端末選択できます。
とまあこんな感じで1つのIDでWebから
アプリのインストールができるようになりました。
初期化までしなくとも他にも何かやり方があったかもしれませんが
1つの検証例としてここに投稿させていただきました。
良かったら参考にしてみてください。
以上、萩原がお送り致しました。
いやー、なかなかいい勉強になった。