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!
プロセス状態 I (Idle Kernel Thread)
自宅のサーバの状態を見ていたら、青:sleep 灰:total の間の差が大きい。
変なプロセス走っていないかと心配したら、ps ax の出力でのステータスがIとかI< となっている項目。日本語のマニュアルを見ても意味不明。
英語のマニュアルを見たら、”Idle Kernel Thread”らしい。
緊急連絡システムの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]
iPadでlinux仕事-Shelly Pro
仕事用の Surface Pro のキーボードがクソで、「T」の反応がダメダメなので、Bluetooth キーボードを購入。以前に、iOS,Windowsといった複数接続に切り替え可能で、接続相手に合わせてキーアサインも変更してくれる小型キーボードを購入していたけど、小さすぎてメールを打ったり、Linux サーバを触るときに、思うように打てずあんまり使わなくなっていた。
今回、Logicool の K380 を購入したけど、Mac のキーボードと同じ配列で複数のBluetooth接続を切り替えられるもの。OSに合わせてキーアサインを切り替える機能はない。
やはり、いつも使っているキーボードと同じなので、手に馴染む。それならばということで、iOS に ssh ターミナルソフト入れたら、Linux 仕事で違和感なく使えるか試したくなった。
日本語が使えるiOS用sshクライアント
以前に、ある程度日本語が使えるということで Termius という無料アプリを使っていたけど、emacs で漢字をつかっていると、文字位置がずれるので今ひとつ。
今回、”iOS ssh 日本語”で検索をかけたら、この記事が比較や有料ソフトの値段なども記載してあってわかりやすかった。
最終的に入れたのは、Shelly Pro となりました。
実際に、ベッドで寝ながら複数のサーバ更新作業をやったけど、Ctrl-Caps交換ができないし、iPad は記号が英字キーボードの配置なので、キートップを確認しながらになったけど、まあまあ使える。
K380 には、iOS のキー配置も刻印されているので、便利。
ただし、iPad に入れて、”Pro” にアプリ内課金でバージョンアップ(¥600)したけど、iPhone に 同じく Shelly を入れたら、バージョンアップしようとしたら、¥480 の課金の画面が出てきた。値段も違うし、タブレット版とスマホ版は別物扱いしてるんだろうなぁ。
次の出張では、iPad mini とキーボードだけ…を試そうかな。
php5からphp7に移行
自宅サーバにて、毎朝 apache2 が止まる症状が続いた。調べてみると、php5 との相性が悪いみたい。
んで、当然ながら、他の管理しているサーバも動かないものが出てきた。ということで、職場の関連サーバも php7 に移行作業を行った。
Ubuntu(trusty) は、PHP5 で問題なし。
moodleサーバは、切り替えたら色々と表示されたな。
切り替えたら、アップロードできるファイルサイズ上限が2MBに減ってしまっていた。
(( /etc/php/7.0/apache2/php.ini )) upload_max_filesize = 400M post_max_size = 450M memory_limit = 500M # upload_max_filesize < post_max_size < memory_limit で要設定 (( apache 再起動 )) $ sudo /etc/init.d/apache2 restart
OpenDNSによるセキュリティ対策
先日参加した、高専機構の情報担当者研修では、新しく導入された統一システムの機能説明や今後について色々と説明を受けた。
でも、興味深かったのは、OpenDNSとも呼ばれているCisco Umbrella 。DNSを使ったセキュリティ対策で、ブラックリストに掲載されているホストへの問い合わせがあったらブラックな正規IPアドレスを返さないことで怪しいホストに接続させない。また、怪しいか判断が困難なグレーゾーンのホスト名なら、OpenDNSのProxyのアドレスを返し、ユーザを怪しいサイト接続させず、実際はOpenDNSが怪しいサイトに接続しグレイな内容を分析して、最終的にブラック/グレイ/ホワイトを判断するというシステム。
設定は、DNS サーバのアドレスを、208.67.222.222 にするだけ。
学校では色々と問題がありそうだし、自宅でこの機能を試してみる。
(( /etc/bind9/named.conf.options ))
options {
:
forwarders {
# Google public DNS
#8.8.8.8;
#8.8.4.4;
# OpenDNS (Cisco Umbrella)
208.67.222.222 ;
208.67.220.220 ;
};
:
};
動作確認は、https://welcome.opendns.com にアクセスして、以下の表示になればいい。
Wikipedia の説明を見ると、以前はブラックなアドレスを引くと、Yahooの広告ページにリダイレクトされるので….といったことが書いてあるけど、今はどうなんだろ。”nslookup www.xxx”で、いかにも怪しいサイトのアドレスをひいたけど、同じだな。Cisco に OpenDNS が買収されてるから、変な広告はなくなったと思うんだけど。
サーバのメンテナンス
Azureサーバのバックアップ
管理しているAzureサーバだけど、クラウドだし簡単には落ちないとバックアップ処理を真面目にしてなかったけど、そろそろ対策をと設定を行った。
- 各仮想サーバの定時処理で、主要データディレクトリを .tar.gzでバックアップ
- 自室のサーバで、RAID-NAS上に仮想サーバのバックアップを rsync
- 仮想サーバの容量逼迫を防ぐために、2月以上は削除。自室サーバは空き容量をみて削除時期を考えよう。
差分バックアップを加える(2017/10/19追記)
バックアップ処理、2週間おきに設定していたけど、いざという時のためにもう少し頻繁にバックアップを取りたい。
そこで、1週間毎に差分バックアップを取るように、処理を追加する。
MovableTypeの記事を復活
サーバ故障による移行作業で、CMS を MovableType から WordPress に変更したけど、古い記事の移行ができていなかった。自宅サーバも同様の移行作業を行い、過去記事の吸出しがうまくいったので、同様に電子情報の過去記事を吸い出し、WordPress にインポート。
# メモ
((追記))
古い記事を抽出する際に、preタグ内の空白が削除されてらぁ。おかげで、プログラムのコードのインデントが消えてしまってる。(x_x;;
自宅で監視カメラを動かしてみた
今度の週末は、家族旅行の予定。 だけど、子どもがその間、最近病院に連れて行った婆ちゃん猫を 心配している。
そこで、使っていなかったWebカメラで、急遽、監視カメラを動かしてみた。 奥さんからは、解像度低いじゃんとツッコミを受けるが、 もともとのWebカメラの性能だと思うし…
余りにも他愛もないコードだけど、 この手のお遊びプログラムは、 学生さんに「こんなこと簡単にできるよ」と見せることも多いので、 PHPコードに改良&コメント付けをしておく。

監視カメラを動かすまで
fswebcamが一番簡単に使えそうだったので…
(( fswebcamをインストール)) $ sudo aptitude install fswebcam
fswebcamの出力をそのまま画像形式で返すプログラム。
(( webcam.php )) <?php // 画像形式、キャッシュさせない header( "Content-Type: image/jpg" ) ; header( "Cache-Control: no-store, no-cache, must-revalidate" ); // 連続読み出し用にファイルロック $flock = fopen( "/var/www-support/.webcam.lock" , (file_exists( "/var/www-support/.webcam.lock" ) ? "rb+" : "wb+" )) ; if ( flock( $flock , LOCK_EX ) ) { system( "/usr/bin/fswebcam -q -d /dev/video1" ." -p YUYV" // 画像形式 ." -D 0" // delay ." -S 3" // skip frame ." -r 320x240" // 解像度 //." -r 640x480" ." --title \"tsaitoh.net's webcam\"" ." --jpeg 75 -" ) ; fclose( $flock ) ; } ?>
webcam.php の出力画像を、連続で読み出すように、 JavaScriptで設定を書き加える。 <meta http-equiv=”refresh” content=”5″> みたいな方法だと、reload の度に画像がちらつくので、JavaScriptで reload させることになった。
(( index.php )) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" id="sixapart-standard"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta name="viewport" content="width=320,height=320,initial-scale=1"/> <title>自宅監視カメラ</title> <script type="text/javascript"> <!-- var count = 0 ; function reload() { count = (count + 1) % 100 ; // 画像を更新(キャッシュ画像を使わないように番号付) var img = document.getElementById( "image" ) ; img.src = "webcam.php?"+String(count) ; img.id = "image" ; // 動きの少ない相手用に確認表示 var txt = document.getElementById( "text" ) ; txt.innerText = "自宅監視カメラ: "+String( count ) ; } // --> </script> </head> <body> <p align="center"> <img id="image" src="webcam.php" onload="reload()" /> <div id="text"></div> </p>
8/17(Wed) 9:00-13:00 まで作業停電
学校内の基幹設備点検が8/17に実施され、このため学内全域が停電となります。 これに伴い電子情報のサーバも、8/17 8:45 には shutdown をかけますので、 ご利用の方はご注意ください。
atコマンドで停止
といっても、私の管理しているサーバは、それなりに台数も多いので、 (緊急連絡システム×2,授業アンケート,Moodle,電子情報×2)、 自動でシステムを停止させるようにしておいた。 at コマンドは、日付記載方法を、毎度調べることになるので、以下にメモ。
# echo "/sbin/shutdown -h now" | at 08:45 08/17/11