ホーム » スタッフ » 斉藤徹 » Computer

Computer」カテゴリーアーカイブ

2019年6月
« 5月    
 1
2345678
9101112131415
16171819202122
23242526272829
30  

最近の投稿(電子情報)

アーカイブ

カテゴリー

福井高専の対外接続の速度

福井高専ではSINETによって接続されているけど、次の更新の際に十分な性能があるかのために、ネットワーク利用状況の確認。

瞬間最大風速で、150Mbps 。ムーアの法則に従うとすれば、2年で2倍と考えると、2022年で約500Mbps, 2025年で1.2Gbps 程度となる。特に今後 学内でBYODが拡大すると、さらなる通信速度が必要と考えられる。

gcj (GNU Compiler for Java) の使い方

いつもは Java を使わないけど、久々に java のプログラムの動作実験と思い、サーバ機に gcj (GNU Compiler for Java)を入れて使おうとしたら、コンパイラ javac とバイトコードインタプリタ java のつもりでコマンドを探すけど、見つからない。

gcj を見つけて “gcj HelloWorld.java” ってやってみたけど動かない。あらためて確認したら、バイトコード生成もできるし、直接機械語も生成できるけど、色々とオプション指定がいるみたい。なるほど。

// HelloWorld.java
public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello World!");
  }
}
# 機械語を直接生成する場合
$ gcj -o HelloWorld --main=HelloWorld HelloWorld.java
$ ls
HelloWorld  HelloWorld.java
$ ./HelloWorld
Hello World!

# バイトコードを生成して動かす場合
$ gcj -C HelloWorld.java
$ ls
HelloWorld.class HelloWorld.java
$ gij HelloWorld
Hello World!

緊急連絡システムでrblsmtpd

メモ:緊急連絡システムで、迷惑メールが届いている。変なリレーはされていないけど、エラーメールが配送できずに溜まってる。

設定を改めて確認して、迷惑メール対策が弱いのでブラックリストなメールサーバからの受信をしないように、rblsmtpd を導入。rblsmtpdの設定は、以前の運用経験からすぐに設定できるかと思ったけど qmail が systemd 用に設定ファイルが変わっているので、修正場所を探すのに手間取った。

プロセス状態 I (Idle Kernel Thread)

自宅のサーバの状態を見ていたら、青:sleep 灰:total の間の差が大きい。

変なプロセス走っていないかと心配したら、ps ax の出力でのステータスがIとかI< となっている項目。日本語のマニュアルを見ても意味不明。

英語のマニュアルを見たら、”Idle Kernel Thread”らしい。

Office365のOneDriveの設定

学生の皆さんも BYOD でパソコンを活用しているけど、Windows10 を使っているなら、OneDrive を使うとデスクトップのパソコンと持ち運びのノートパソコンでファイル共有ができて便利。すでに、自分のパソコンで Microsoft ID を登録していれば、すでに標準の OneDrive が使えているはず。

この状態で、高専機構の OneDrive も登録すると、高専の学生さんであれば、1TB/人が使えるので、容量を気にせず使える。設定は以下の通り。

高専機構のOneDriveの追加設定

最初にタスクバーに表示されている、OneDrive のアイコンの上で、右ボタンでメニューを表示し、設定。

アカウントのタブを選び、「アカウントの追加」を選び、

サインインの入力欄に、高専機構のメールアドレスを入力し、サインインを押してパスワード設定をすれば、タスクバーに青色の OneDrive が追加されます。

ただし、このままこの設定では、すべてのファイルが同期されるため、情報処理センターのパソコンを起動すると、大量のファイル転送が発生してログインに時間がかかる。

このため、OneDrive のアカウントタブの、「フォルダの選択」を選び、情報処理センターでは不要のファイルは同期しないように設定をすること。

GASを使ってLINEボットを作る

高専の KOSEN ハッカソン LINE にて、学生さんがいろいろと作品を作る間、自分でも LINE メッセージAPIで遊んでみた。

LINEボットのオーム返しの例

参考にしたサイトのプログラムを若干修正してある。

// line developersに書いてあるChannel Access Token
var access_token = "xxxxxx";

// pushしたいときに送る先のuser_id or group_idを指定する
var admin = "Uxxxx";

// postされたログを残すスプレッドシートのid
var spreadsheet_id = "xxxx";

// スプレッドシートの"user-db"シートにユーザIDと名前の対応表を保存
//   通常のサーバ処理なら、データベースに保存なんだろうけど、
//   すべてをGoogle Driveで完結させたいので、Google Spredsheed を
//   データベースのように使う。
var user_db_size = 10 ;

function get_user_name(source) {
  // スプレッドシートのuser-dbシートに、IDと名前の一覧を記録
  //  Uxxxxxxxx なまえ
  var array = SpreadsheetApp.openById(spreadsheet_id)
                .getSheetByName('user-db')
                .getRange(1,1,2,user_db_size).getValues() ;

  for( var i = 0 ; i < array.length ; i++ ) {
    if ( array[i][0] == "" ) // 無記入欄で終了
      return source.userId ;
    else if ( array[i][0] == source.userId )
      return array[i][1] ;   // 対応するものを見つけた
  }
  return source.userId ;
}

/**
 * 指定のuser_idにpushをする
 */
function push(text,to) {
  var url = "https://api.line.me/v2/bot/message/push";
  var headers = {
    "Content-Type" : "application/json; charset=UTF-8",
    'Authorization': 'Bearer ' + access_token,
  };
 
  var postData = {
    "to" : to,
    "messages" : [
      {
        'type':'text',
        'text':text,
      }
    ]
  };
 
  var options = {
    "method" : "post",
    "headers" : headers,
    "payload" : JSON.stringify(postData)
  };
 
  return UrlFetchApp.fetch(url, options);
}
/**
 * 管理者宛にメッセージを送る
 */
function push_admin(text){
  return push(text,admin);
}
 
/**
 * reply_tokenを使ってreplyする
 */
function reply(event,text) {
  var url = "https://api.line.me/v2/bot/message/reply";
  var headers = {
    "Content-Type" : "application/json; charset=UTF-8",
    'Authorization': 'Bearer ' + access_token,
  };

  var postData = {
    "replyToken" : event.replyToken,
    "messages" : [
      {
        'type':'text',
        'text':text ,
      }
    ]
  };
 
  var options = {
    "method" : "post",
    "headers" : headers,
    "payload" : JSON.stringify(postData)
  };
 
  return UrlFetchApp.fetch(url, options);
}

function do_reply(event) {
  // リプライの処理
  var text = '' ;
  switch( event.message.type ) {
    case 'text' : // メッセージ
      text = event.message.text ;
      break ;
    case 'sticker' : // ステッカー
      text = 'すてっかーID=' + event.message.id ;
      break ;
    case 'image' : // 画像
    default :
      text = 'event.message.type=' + event.message.type ;      
      break ;
  }
  return reply(event,'りぷらい:'+text);
}

/**
 * push api で beacon 受信時の処理
 */
function do_beacon(event) {
  var text = '' ;

  var user = get_user_name( event.source );

  var bcn = event.beacon ;
  switch( bcn.type ) {
    case 'enter' :  // ビーコン領域に入った
      text += 'ENTER' + bcn.hwid ;
      break ;
    case 'leave' :  // ビーコン領域を抜けた(実験したけど通知は実質来ない!?)
    case 'banner' : // ビーコンバナーをタップした
    default :
      text += bcn.type + '=' + bcn.hwid ;
      break ;
  }
  
  return push_admin( 'びーこん=' + text + '(' + user + ')' , admin ) ;
}

/**
 * postされたときの処理
 */
function doPost(e) {
  var json = JSON.parse(e.postData.contents);
  
  // 利用者のuseridを取得するためのlog
  var data = SpreadsheetApp.openById(spreadsheet_id)
               .getSheetByName('log')
               .getRange(1, 1).setValue(json.events);

  // 1回のPostで、メッセージと画像が複数のイベントで来る場合がある
  for( var i = 0 ; i < json.events.length ; i++ ) {
    var event = json.events[i] ;
    switch( event.type ) {
      case 'message' : // Message API の処理
        do_reply(event);
        break ;
      case 'beacon' : // Beacon API の処理
        do_beacon(event);
        break ;
      default: // デバッグのため
        push_admin( 'それ以外=' + event.type ) ;
        break ;
    }
  }
}
 
/**
 * pushをしてみる
 */
function test() {
  push_admin('test()の実行');
}

/**
 * getされたときの処理
 * URL?message=テキスト
 */
function doGet(e) {
  // var data = SpreadsheetApp.openById(spreadsheet_id)
  //              .getSheetByName('log')
  //              .getRange(2, 1).setValue(e.parameter.message);

  // https://script.google.com/macros/s/..../exec?message=メッセージ
  if ( "message" in e.parameter )
    push_admin(e.parameter.message);
}

香港のSTEM事情

APIEMSの発表会場近くのショッピングモールで、子供向けのパソコン教材のお店。STEM教材のロボットや、交換パーツまで売ってて驚き。
日本なら大きい電気屋の一角なんだろうけど。
{CAPTION}

{CAPTION}

{CAPTION}

緊急連絡システムのOS更新など

緊急連絡システムのOSが、Ubuntu/trusty でそろそろ、サポート期間に近づいているので、OS の更新を行った。

Ubuntu 更新

更新自体は、do-release-upgrade コマンドで、xenial に更新が進む。

$ sudo do-release-upgrade

しかしながら、openssh-server が、更新でエラーがでて、かなり悩んだ。解ってみれば、単純なミスで、自作の /etc/init.d/script を書いてあったけど、その insserv ヘッダで、ssh をコピーしてヘッダ部の # Provides: sshd の行を書き換えてなかった。

このおかげで、insserv が、ssh はすでに登録されている…と勘違いしていた。

緊急連絡システムの文字コードUTF-8 に変更

Ubuntu の更新をかけたら、php5 が使えなくなったため、php7.0 に更新を行うが、これに合わせ、取り扱い文字コードを EUC-JP から UTF-8 に変更を行った。

緊急連絡システムは、内部でデータベースを利用せず、テキストファイルですべてを管理しているが、最初は利用組織毎の設定ファイルや、データファイルをエディタでチマチマと修正を始めたけど、大量の組織のため、途中で断念。perl でファイル名や記載時のエンコーディングを修正するスクリプトを書いて一発変換。

あとは、プログラム中のエンコーディング依存の部分を修正し、送信できることを確認してひとまず移行作業完了。

Ubuntuを最新版にアップグレード(メモ)

Azure 上のサーバから、ubuntu を最新版にアップグレードするために、do-release-upgrade を実行せよとのメールが来た。Debian を使っていると、”aptitude update ; aptitude safe-upgrade”を定期的に実行して、大幅アップグレードの時には、/etc/apt/sources.list.d/* を触ってアップグレードを行っているけど、こういうプログラムがあるみたい。

管理している他のサーバは、すでに Ubuntu 16.04 xenial を導入済みで、最初に Azure を使い始めたこのサーバだけ、未だに Ubuntu 14.04 trusty 。

# lsb_release -a        # 現在の情報の確認
# do-release-upgrade -c # 更新が可能かチェック
# do-release-upgrade -s # 更新を実行

ただし、”do-release-upgrade -s” を実行したら、途中で ssh のコネクションが切れておかしくなる可能性があるから、以下のようなメッセージが表示される。Azure 上のサーバなので、1022 のポートを開けたりといった手間が必要そうだし、もう少し状況確認が必要かな。Ubuntu は慣れないなぁ…

SSH経由で実行していますが、続けますか? 

このセッションはSSH上で実行されているようです。アップグレードをSSH越しに行うことは推奨されません。アップグレードに失敗した時の復元が困難になるからです。 

続行する場合、追加のSSHデーモンをポート '1022' で起動します。 
本当に作業を進めてよろしいですか? 

続行する[yN] 

Googleスピードテスト

ブラウザを用いた Google によるインターネット速度テストの結果。

自宅、500Mbps超えてたのに比べたら…(x_x;