WiFiが遅い…..混信….チャンネルの変更

最近自宅のWiFiの接続状況が悪く、パケットの遅延とかロスが多発。
ケーブルで繋いだPCは問題ないのでもしやWiFiのルータが故障気味なのかと考えていましたが、自己解決。
PCで自宅のWiFiの状況を見てみると電波は弱いですが、アクセス可能なWiFiネットワークの多いこと、多いこと。数えてみると22もありました。
よく見てみると、そのうちチャンネル1がいくつかありました。
私の家のルータもチャンネル1….
ためしに私の自宅近辺で私用されていないチャンネル6に変更してみると問題は一気に解消。とても快適にアクセスできるようになりました。
いまやWiFiは一家に一台は常識、マンションのような集合住宅では電波の届く範囲に10以上あることも珍しくないでしょうね。WiFiルータもチャンネルは自動になっているので本当に競合するものがあればそのチャンネルは避けると思うのですが、それほどでなければ自然にチャンネル1が使われてしまうのしょう。私の環境でもチャンネル1を使用しているルータが一番多そうです。
WiFiも電波を使用しているシステムですので、混信には気をつけるべきでした。

Tomcatが落ちる…

最近サーバのリソースの消費が多くなってきたのでしょうか、知らない間にTomcatがダウンしていることがしばしばあります。
Tomcatのログを見ても特にエラーなどは出さずに終了しています。
messageには以下が残っていますので、単純にメモリーが少ないのでしょう。

Jan 28 08:17:10 ip-10-162-38-78 kernel: [2488146.192205] Out of memory: Kill process 1012 (java) score 173 or sacrifice child
Jan 28 08:17:10 ip-10-162-38-78 kernel: [2488146.192217] Killed process 1012 (java) total-vm:1009532kB, anon-rss:105084kB, file-rss:0kB
Jan 28 11:09:04 ip-10-162-38-78 kernel: [2498460.384918] java invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=-17, oom_score_adj=-1000
Jan 28 11:09:04 ip-10-162-38-78 kernel: [2498460.384935] java cpuset=/ mems_allowed=0
Jan 28 11:09:04 ip-10-162-38-78 kernel: [2498460.384941] Pid: 20190, comm: java
Not tainted 3.2.34-55.46.amzn1.x86_64 #1
Jan 28 11:09:04 ip-10-162-38-78 kernel: [2498460.384948] Call Trace:
Jan 28 11:09:04 ip-10-162-38-78 kernel: [2498460.384960]  [<ffffffff810acbc8>] ? cpuset_print_task_mems_allowed+0×98/0xa0

システムのチューニングなどでなんとか少ないメモリを共有していきたいのですが、とりあえず、Tomcatやmysqlがダウンしたときに自動的に再起動するスクリプトを作りました。とりあえずはこのスクリプトを10分ごとにcronで動作させて様子をみようと思います。
Tomcat及びMysqlのプロセスの動作確認スクリプト:
!/bin/ksh
HOME=/root/manager
RESTART=0
cd $HOME
TPID=`ps -ef|grep tomcat|grep -v grep|awk ‘{print $2}’`
print tomcat: $TPID
MPID=`ps -ef|grep mysqld|grep plugin|grep -v grep|awk ‘{print $2}’`
print mysqld: $MPID
if [[ $TPID = "" ]]; then
  print  Tomcat is down
  ./mail.ksh Tomcat7
  RESTART=1
fi
if [[ $MPID = "" ]]; then
  print  MySQL is down
  ./mail.ksh MySQL
  RESTART=1
fi
if [[ $RESTART = "1" ]]; then
/etc/init.d/mysqld stop
/etc/init.d/tomcat7 stop
sleep 3
/etc/init.d/mysqld start
/etc/init.d/tomcat7 start
fi
メールによるアラームのスクリプト:
#!/bin/ksh
mail -s ProcessDown:$1 dummy@example.com << _EOF
$1 is down!
_EOF
[

Jboss Hibernate上でのKeep Alive

先日の、Jboss上のHibernateがMySQLにアクセスできなくなるという話。
Jboss上のDBにアクセスできない
一つの解決方法として、Keep Aliveを組み込んでみました。
Jboss上にServletを作成し、起動時での自動起動及び、Threadの無限ループで30分ごとにサーチを掛けるだけの物です。このKeep Aliveを導入するまでは毎日朝、サーバにアクセスしようとするとHibernateがMySQLにアクセスできない現象が発生していましたが、このKeep Aliveを組み込んでからはその現象は解消しました。サーブレット内のコードはこんな感じです。

public class KeepAlive extends HttpServlet {
 private static final long serialVersionUID = 1L;
 static KeepAliveMain t = null;

    public KeepAlive() {
        super();
    }

  public void init(ServletConfig config) throws ServletException {
  t = new KeepAliveMain();
  t.start();
 }

 }
class KeepAliveMain extends Thread{

 public KeepAliveMain() {
  // TODO Auto-generated constructor stub
  super();
 }
 public void run(){
  Logger logger = Logger.getLogger(“mylog”);
  Date d = new Date();
  logger.warn(“”+d+”: “+this.getClass().getName()+” KeepAliveMain(service) started”);
  for (int i=0;;i++){
   d = new Date();
   logger.warn(“”+d+”: KeepAliveMain(service):”+i);
         YearDao yearDao = new YearDao();;
      List<Year> yearList = null;
   yearList = yearDao.searchAll();
   yearList.isEmpty();
   try {
    Thread.sleep(30*60*1000);
   } catch (Exception e){
    e.printStackTrace();
   }
  }
 }
}

GetやPostは実装しないで、init()だけで、localのThreadクラスに起動をかけているだけです。

自分のHackとしてはこれでもいいのですが、平行してネットで現象を調べていくと要は、Hibernateにデフォルトで付属しているコネクションプールは試験的なのもで長時間未使用状態が続くとMySQL(DB)側でコネクションを切断してしまうのにたいして、Hibernate側ではまだコネクションが残っていると考えて問題が発生するようです。
また、Jbossのログにはこんなメッセージが出ています。

09:26:48,260 INFO  [DriverManagerConnectionProvider] Using Hibernate built-in co
nnection pool (not for production use!)

Hibernateを使うのであればコネクションプールはThirdPartyのものを使えということのようです。Hibernateのマニュアルにもそのあたりの記述がありました。
次はこのコネクションプールの設定方法が調査項目になります。

Kindle版 私本太平記⑨ 建武らくがき帖

本日青空文庫を覗いてみると、私本太平記の新刊が刊行されていました。

私本太平記⑨ 建武らくがき帖

早速ファイル変換を実施して私のKindleにメールすると供に、サイトにもアップしておきました。私も毎日読んでいるのですが、今は③みなかみ帖です。しばらく追いつけそうにありませんが、自分が読んでいる本の続きが刊行されるような経験は久しぶりなので楽しいです。Kindleのおかげで久しぶりに読書の楽しみを満喫しています。
平家物語や信長、秀吉、家康などの戦国物語で平安から鎌倉、あるいは戦国時代の知識は世間一般に広まっていますが、鎌倉末期から室町初期のこの太平記が著している時代の知識はあまり一般に普及していないように思います。もちろん、私も教科書などで読んだ単語としての知識程度を散発的に知っている程度です。
その意味で、この太平記を読みながら、悪党とか田楽とか教科書で出てきた言葉の意味というか背景といったものが生き生き描かれると今までは無味乾燥としていた言葉が何か色づき始めます。また、吉川英治あるいは、原本の太平記での創作なのか分かりませんが、吉田兼好が出てきたり、あるいは後に中国の毛利家の祖となる人が出てきたり、読者の興味を外さないストーリーとしての面白さもあります。さらに、鎌倉時代という武士の時代でも、実は、朝廷側の力もあり、また、一部、両者からも独立した人たちがそれぞれ時代を生きていて、強い統治力は朝廷、鎌倉ももてないながら、あるいはそれゆえに、後の戦国の実力の時代につながっていくのだなぁと理解することが出来ます。
さらに、この時代の六波羅探題はゲシュタポのような秘密警察、スパイ活動などを行っていることが分かります。ストーリーとしても面白いし、歴史の勉強にもなってわくわくします。
しばらくはこの話で楽しめそうです。

Jboss上のDBにアクセスできない

最近、Jboss上のDBにWebService経由でアクセスしようとするとExceptionが発生してデータベースにアクセスできません。Jbossを再起動すれば解消するのですが、今日は少し調査してみました。
Jbossのコンソールログに現れるのは以下のメッセージです。

09:24:14,157 INFO  [STDOUT] Hibernate: select temperatur0_.date as date30_, temp
eratur0_.average as average30_, temperatur0_.high as high30_, temperatur0_.low a
s low30_ from temperature temperatur0_ where temperatur0_.date=?
09:24:14,371 WARN  [JDBCExceptionReporter] SQL Error: 0, SQLState: 08S01
09:24:14,371 ERROR [JDBCExceptionReporter] Communications link failure

The last packet successfully received from the server was 83,742,985 millisecond
s ago.  The last packet sent successfully to the server was 69 milliseconds ago.
09:24:14,466 ERROR [STDERR] AxisFault
 faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
 faultSubcode:
 faultString: org.hibernate.exception.JDBCConnectionException: could not execute
 query

おそらく、HibernateからMySQLへのコネクションがMySQL側では切断されているのにHibernate側ではまだそれが使用可能と思っているような気はします。Tomcatではこの現象は観察していません。もし、そうであれば、Hibernateが使えなくなったコネクションを切断して、最終的には新たなコネクションを再作成して動きそうな気はするのですが、一旦この状態になると自律的には解消しないようです。
Hibernateのマニュアルを少しみると、Connection Poolに関して、実装は試験用なのでThirdpartyのコードを使うことを推奨しているようにも見えました。そのようなライブラリもパッケージには入っているようです。
そのあたりも学習するとして、本当にIdle時間が長くてTimeoutしているのかどうか、ダミーのThreadから定期的にDBへのアクセスをさせてみようかなと思います。所謂KeepAliveですね。KeepAliveで状況が変わるかを確認してさらにTuningしてみようと思います。

EBSの追加

以前にも実施していますが、EBSの追加方法。
最近、サーバ上での毎日のバックアップ量が増えてきましたので、一月以上古いバックアップは別ディスクに移行することにしました。
S3が重要なバックアップ先と考えていましたが、EBSにバックアップしてさらにその後EBSのSnapshotだけを保管するのも同じことかなと思い始めました。ちょっと価格と使い勝手を考えながら平行して使っていこうと思います。

EBSをAWSのManagement Consoleで作成して、Attachします。
その後はサーバ上で以下の手順でマウントされます。

[root@ip-10-162-38-78 manager]# ls /dev/xv*
/dev/xvda1  /dev/xvdf  /dev/xvdg
[root@ip-10-162-38-78 manager]# fdisk /dev/xvdg
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x080502b7.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won’t be recoverable.

Warning: invalid flag 0×0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It’s strongly recommended to
         switch off the mode (command ‘c’) and change display units to
         sectors (command ‘u’).

Command (m for help): m
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition’s system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[root@ip-10-162-38-78 manager]# !ls
ls /dev/xv*
/dev/xvda1  /dev/xvdf  /dev/xvdg
[root@ip-10-162-38-78 manager]# mkdf -t ext4 /dev/xvdg
-bash: mkdf: command not found
[root@ip-10-162-38-78 manager]# mkfs -t ext4 /dev/xvdg
mke2fs 1.42.3 (14-May-2012)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
524288 inodes, 2097152 blocks
104857 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2147483648
64 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

[root@ip-10-162-38-78 manager]# mount /dev/svdg /disk2
mount: you must specify the filesystem type
[root@ip-10-162-38-78 manager]# mount /dev/xvdg /disk2
[root@ip-10-162-38-78 manager]# df -k
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/xvda1             8256952   2820236   5352856  35% /
tmpfs                   304364         0    304364   0% /dev/shm
/dev/xvdf              8256952   4358108   3479416  56% /disk1
/dev/xvdg              8256952    149492   7688032   2% /disk2

カテゴリー: AWS

青空文庫からKindle用のファイルを作成

Kindleはtextやhtmlファイルが読めるので青空文庫のファイルをそのまま読めますが、その場合、横書きになってしまいます。
内容によってはそれでもかまいませんが、やはり、日本語の文学ですので、縦書きで読みたい。青空文庫の書籍も徐々にKindleのファイルになっていくのだとは思いますが、おそらく縦書き変換の方法があるのだろうと調べたところ色々なサイトで紹介されていました。
大まかな流れは青空文庫に帰属しているアプリで縦書きフォーマットに変換し、それをさらにAmazon提供のKindle用のアプリで再変換することでKindle用のフォーマットに加工できました。アプリ名を所在は以下になります

AozoraEpub3 このアプリで青空文庫のzipファイルを.epubというファイルフォーマットに変換します。青空文庫提供
Kindle Previewer このアプリで.epubを.mobiファイルに変換します。実際には.epubを開くと、自動的に.mobi形式のファイルが作成される動作になります。Amazon.com提供。

細かい問題はあるかも知れませんが、とりあえず、これで吉川英治の「私本太平記」をKindle化できました。吉川英治はこれから三国志なども青空文庫に登場しそうなのでとても楽しみです。
追記:
私本太平記の.mobiファイルをサイトにアップロードしました。
http://www.nantoka7.com/kindle/
青空文庫には以下の注意書きがあります。
、「有償、無償を問わず、著作者人格権を侵害しない範囲でなら自由に加工して、使って良い。その際、事前にも、事後にも、青空文庫への連絡の必要はない。」
これ以外にも説明を読むと青空文庫の目的の一つが著作権の切れた作品をデジタルアーカイブ化して広く社会での再利用を促進することがあるようです。私もこの趣旨に賛同して微力ですが、変換したファイルを自分のサイトに置いてみました。

追記2:青空文庫コンテンツのファイル変換の方法
ファイルの変換方法に関してPDFにまとめてみました。
青空文庫の作品が単なるデータ変換しただけでKindleストアに有償で提供されています。
ささやかな抵抗としてこちらの手順を利用してくれる人が増えると嬉しいです。

http://kindleforeveryone.s3-website-ap-northeast-1.amazonaws.com/MobiTransform.pdf

 

AWS S3 bucketのdelete

このサイトの諸々のバックアップをdailyでS3に保存しています。
毎日バックアップしていますので、2週間も何もしないとフォルダ数も増えますし、最近はデイリーでのバックアップ量も増えてきましたのでS3上での使用領域も心配になります。1週間に1回程度適当にパージを手動で実施していたのですが、これを自動化するためにjavaでツールを作りました。
私のバックアップの仕組みは毎日、PreFixとしてbackupに日付の文字列をつけ、さらにUUIDを生成したstringをバケット名として作成し、その日のバックアップデータをそのバケットに格納する仕組みです。
ですから、パージの仕組みもS3上でバケット名をサーチしながら、バケット名からバックアップの日付を確認し、条件にマッチすればそのバケット内のオブジェクトを全て削除した上でバケットも削除という仕組みです。
そのようなツールを作成してバケットとオブジェクトの削除を実施しました。削除自体はうまく動作したようでGUIのManagement Consoleでは該当バケットが削除されているのを確認しました。

しかし….バケットの削除を実行したのち、似たようなツールでS3上のバケット及びオブジェクトの検索をおこなったところ以下のようなエラーが出てしまいました。

[root@ip-10-162-38-78 purger]# ./dailyPurger.ksh
===========================================
Getting Started with Amazon S3
===========================================

Listing buckets
Purge Threshlod PreFix: backup20130113

 - backup20120808-8720d155-036e-4aaa-8515-c89a22821d3d
..older than Threshold…
..Neither MMD0/MMD5…Candidate for purge
..Listing objects in this bucket
Caught an AmazonServiceException, which means your request made it to Amazon S3, but was rejected with an error response for some reason.
Error Message:    The specified bucket does not exist
HTTP Status Code: 404
AWS Error Code:   NoSuchBucket
Error Type:       Client
Request ID:       2526BFC1E7F3EAF8

最初の行で出力されているのは今回削除したバケット名です。
パージツールの実行で削除されたバケットの名前がなぜか、S3のバケットのリストの取得を実行すると名前だけは残っているようです。バケット名があるので、そのバケット内のオブジェクトを確認に行ったルーチンで、バケットが実際には存在しないのでこのようなエラーになっている様に思われます。
うーん、現時点では理由が分かりません。実体の更新がAPI上の情報を同時には反映しないのかも知れません。ToolはワンショットのJavaのアプリケーションで実行しているのでClient側にキャッシュがあるわけではありません。AWS全体の仕組みのどこかに時間差があるのでしょうか?

 追記:
とりあえず、解決策と思われる部分を見つけました。
以前、S3のバックアップツールを作成した際に、デフォルトでバケットを作成すると日本ではなくUSになってしまうことを発見。そのため、S3のオブジェクトにendpointを明示的に設定しています。
s3.setEndpoint(“s3-ap-northeast-1.amazonaws.com”);
この設定によって、バケットは期待通りに日本のエリアに作成されたのですが、AWSのManagement Consoleでみると、S3に関してはRegionの設定はありません。
おそらく、S3に関してはManagementはGlobalのデータをRegionごとのデータが存在し、Globalのデータは瞬時に反映されるのに対し、各RegionごとのManagement dataには若干時差があるのかも知れません。
とりあえず、この部分を修正して安定したツールにしたいと思います。

久しぶりにMySQLと格闘

格闘と言うほどのことはありませんが、久しぶりにMySQLを触りました。
このブログが載っているサーバでは簡単ですが、Apacheのログから日々アクセス情報を取得してDB(MySQL)に格納しています。
今までも日々のアクセス数などはViewを作ってさらにhtmlで確認できるようにしていました。最近Googleのアクセスが非常に多いことは感じていましたが、少しずつですが、見知らぬアドレス、おそらく一般の方のアクセスが増えてきたように思います。
もちろん、それらのアクセス比率は微々たるものですが、サイトへの本当のアクセスともいえます。そのあたりのアクセスの様子、傾向が分かるようにアクセスデータの後処理を少し工夫してみました。
毎日のアクセス件数をGoogle, MSNなどのbotと私個人のPrivateのアクセス、そしてそれらの件数をトータルから引けば一般のアクセス数が計算できます。
出来上がりのテーブル、viewはこんな感じになります。

DATE TOTAL GOOGLE MSN PRIVATE OTHER
20130116 628 469 2 109 48
20130115 1318 939 8 142 229
20130114 2300 1206 12 512 570
20130113 950 881 8 19 42
20130112 989 810 4 157 18
20130111 1106 961 6 47 92
20130110 1348 927 19 236 166
20130109 1200 956 12 85 147

このviewを一つのSQLコマンドで作成しようと考えたのですが、今の私の能力では作れませんでした。仕方が無いので以下のステップで作成しました。
Google, MSN, Privateに関してそれぞれ日付で集計したViewを作成。SQL文の例は以下
create view google_view (DATE,COUNT) as select DATE,SUM(COUNT) from access_view6 where URL like ‘%google%’ group by DATE;
これらとTotal数を含めて4つのviewを作成して以下のようにテーブルをjoinしてみました。
create view daily_view (DATE,TOTAL,GOOGLE,MSN,PRIVATE,OTHER) as select a.DATE, a.COUNT, COALESCE(b.COUNT,0), COALESCE(c.COUNT,0), COALESCE(d.COUNT,0) ,(a.COUNT – COALESCE(b.COUNT,0)-COALESCE(c.COUNT,0)-COALESCE(d.COUNT,0))from ((total_view a left join google_view b on a.DATE = b.DATE) left join msn_view c on a.DATE = c.DATE) left join private_view d on a.DATE = d.DATE;
joinは遥か昔にOracleを使った環境で使用した記憶がうっすらとありますが、今回、久しぶりに使用して少しは知識が深まったので良かったと思っています。もう一つは結合したテーブルにはNULLのフィールドができてしまい、そのままでは算術処理がうまく動かないことです。この問題もCOALESCEを使用すれば解決できることが分かりました。

概算ですが、トータル数-(Googleなどのbotアクセス数)-(個人のアクセス数)が一般のアクセスと考えてみると、以前は多くても一日100件程度でしたが、最近では200件とか最大で500件を超える日もありました。私のサイトの一体どこに興味を持ってアクセスしてくれるかは分かりませんが、少しでも皆さんの役に立っている部分があれば嬉しいです。

 

 

 

カテゴリー: AWS

Kindle Paperwhite購入!

久しぶりにGadgetを購入してどきどきしています。
Kindleは1年位前でしょうか、外国人の人が電車の中で使っていたのを見てそのディスプレィ上の文字がクリアに見えたので非常に気になっていました。
今回購入に当たって、Kindle Paperwhite, Kindle Fire HDなどを検討しましたが、タブレットよりも、電子書籍リーダーとしての機能を重視して、Kindle Paperwhiteにしました。
タブレットの方が当然、付加機能に優れているわけですが、結局それではパソコンやスマホと競合してキックがなくなってしまいます。また、折角私が感激した差別化されたスクリーンもエンジョイできないからです。3Gについても、自宅もオフィスもWifiは完備されていますし、基本的にはダウンロードしておいた本を読むのが目的ですからスキップしました。
購入してとりあえず、青空文庫の無料コンテンツを主にダウンロードしていますが、使い勝手はかなりいいですね。まずは実際の本のようにページを維持する必要がありません。閉じたり、しおりを入れる必要が無い。明るいところでも暗いところでもストレス無く文字を読むことができます。今は自宅で使っているだけですが、片手で保持できますし、今のところ重さは気になりません。文庫と比べるとあまり変わらないかも知れませんが、表紙がしっかりした厚めの本、たとえば、塩野七生のローマ人の物語の単行本などはやはり通勤に持って行くのはちょっと無理ですよね。そのあたりは非常に快適と思います。
一方で今ひとつなのは自分の文章、特に仕事関連の英語のマニュアル類をアップロードしたのですが、PDFの場合、当然ですが、画面の拡大、縮小はできますが、文字レベルでの拡大縮小はできません。本文のフォーマットによっては文字が小さくて読み辛かったり、文字を大きくすると両サイドがはみ出してしまうこともあります。このあたりはもう少し使いこなしながら何かいい方法はないかを探っていこうと思います。
コンテンツに関しては現在の膨大な書籍数に比べれば微々たる量であるのは仕方が無いと思いますが、そのため、かえって、夏目漱石や宮沢賢治を読み返してみるチャンスになったのは嬉しい誤算でした。大昔に教科書で呼んだ「坊ちゃん」の文章がとても生き生きして感じられます。宮沢賢治もいいですね。実際の書籍の装丁を楽しむ面も確かにありますが、Kindleによって、逆に文章そのものに集中できる面もあると思います。
少し日常生活に楽しみが増えた感じです。