グループウエアは、jqueryなど機能を増やすとその分どうしても遅くなっていくようだ。高速化のためには、.jsや.cssなどを圧縮するとか、一つのファイルにまとめるとかいろいろ細かい調整があるようだ。あと、tomcat7にはExpiresFilterという機能を使って、静的コンテンツはキャッシュにできること、テキストデータは圧縮をかけること(tomcatのfilter)を知った。早速試してみたい。
というか、もとはといえばjspのサイズが大きくなってしまったのが原因。こんなことになるんだったら、もう少しファイルを切り分けるとかすればよかった。
Gtmetrix,yslowなど使うと、どこが遅くなる原因かつかめるようだ。
****************
その後、いろいろ試してみたが、JAVAのガベージコレクションの問題もあるのかと思い、CATALINA_OPTS="-server -Xms512m -Xmx1024m 云々の設定も試してみた。Ubuntuの場合
/etc/environmentに環境変数を設定できるようだ。
いちおう、やれることはすべてやってみたが、PCの性能によってやはりレスポンスの差はどうしてもあるようだ。シングルコアのメモリが1GBにも満たないものだと、大きなWEBファイルのせいか?(機能を盛り込みすぎたか)最大で10秒ほど待たされてしまう。それより、ちょっぴりCPUとメモリがよいPCで、最大5秒前後。スムーズな時は、1秒もかからず反応するのだけど、この違いは何なのか、いまひとつはっきりわからない。
グループウエアというのは、最初のうちは、機能がいろいろあって便利だといいだろうと思っていたが、実際にはレスポンスの良さが、ユーザーにとってはより重要なことなのかもしれない。
2015年8月22日土曜日
2015年8月17日月曜日
slickの設定
ネット上の情報をもとに、slickの設定しようとしたが、うまくいかない。どうやら、バージョンをplayに合わせる必要があるようだ。最新版のバージョンを調べて、設定してみたら、なんとかなった。
以下build.sbtの中身
libraryDependencies ++= Seq(
jdbc,
cache,
ws,
specs2 % Test,
"com.typesafe.slick" %% "slick" % "3.0.2",
"org.slf4j" % "slf4j-nop" % "1.6.4",
"com.typesafe.play" %% "play-slick" % "1.0.1"
)
このあと
activator update
activator eclipse
を実行することで、eclipseでの編集ができるようになるようだ
*************
このあと、ネットを参考に、サンプルプログラムを試してみるが、うまくコンパイルできない。
import play.api.db.slick.Config.driver.simple._と
あるけれど、実際には
import slick.driver.H2Driver.api._
import slick.lifted._
などが必要?でも、slickのバージョンが少し違うといろいろなところで、はじかれてしまう?依存関係がいまいちよくわからない。まだまだ実用的なソフトをscalaでつくるには壁がありそうだ。
以下build.sbtの中身
libraryDependencies ++= Seq(
jdbc,
cache,
ws,
specs2 % Test,
"com.typesafe.slick" %% "slick" % "3.0.2",
"org.slf4j" % "slf4j-nop" % "1.6.4",
"com.typesafe.play" %% "play-slick" % "1.0.1"
)
このあと
activator update
activator eclipse
を実行することで、eclipseでの編集ができるようになるようだ
*************
このあと、ネットを参考に、サンプルプログラムを試してみるが、うまくコンパイルできない。
import play.api.db.slick.Config.driver.simple._と
あるけれど、実際には
import slick.driver.H2Driver.api._
import slick.lifted._
などが必要?でも、slickのバージョンが少し違うといろいろなところで、はじかれてしまう?依存関係がいまいちよくわからない。まだまだ実用的なソフトをscalaでつくるには壁がありそうだ。
2015年8月16日日曜日
今年の畑の状況
今年は、小玉スイカを試しに植えてみた。つるの伸びがすごい。1畝に1株しか植えなかったのだが、それでも別の畝のトマトまで越境していく始末。でも、1株から10個近くとれたので、十分もとはとれた。ナスは、昨年ほどでないが、平年並み。トマトも順調で、食べきれないので、ジューサーでトマトジュースにしている。
小玉スイカとダダチャ豆の収穫が終わり空いたところには、これから大根を植える予定。残ったのはインゲン、トマト、ナス、ゴーヤ。トマトはそろそろおしまいだが、ゴーヤは今が最盛期。
小玉スイカとダダチャ豆の収穫が終わり空いたところには、これから大根を植える予定。残ったのはインゲン、トマト、ナス、ゴーヤ。トマトはそろそろおしまいだが、ゴーヤは今が最盛期。
2015年8月15日土曜日
scala playをeclipseで使ってみる
scalaでplayを利用してみた。コマンドラインからは、ネットの情報でなんとか使えるようになったが、eclipseの設定については、試行錯誤が必要なようだ。
とりあえず、以下のリンクを参考にさせていただいた。
http://qiita.com/Orfeus/items/84635a5ff86ba093f408
・java、javac、activatorのフォルダのパスは通しておいた。playのminimum版を解凍。
・やはりaddSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")をplugin.sbtの中に追加しないとだめだった。
・activator newで6)play-scalaを選択 適当な名前(今回はtest)をつける cd test
でactivator runで 実行できることを確認する。
・activator compileを行ってから、activator eclipseでプロジェクトファイル作成ができるようだ。そしてeclipseでimport と、ここまでは前回の復習。
・緑に白抜き三角と鞄のアイコンのわきの▼をクリック>外部ツールの構成で、プログラムを右クリック>新規>ロケーションで、activator.batを選択、作業ディレクトリは、同じフォルダ指定、引数にrunとしてみたら、いちおう動いたようだ。
が、止め方がまだよくわからない。コマンドプロンプトであれば、CTRL+Dで止めるのだが、、、。
ソースを修正して、再コンパイルするとエラーとなる。ただ、再表示させると、自動的にリロードしてくれるので、修正は反映されるようだが。。。
とりあえず、以下のリンクを参考にさせていただいた。
http://qiita.com/Orfeus/items/84635a5ff86ba093f408
・java、javac、activatorのフォルダのパスは通しておいた。playのminimum版を解凍。
・やはりaddSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")をplugin.sbtの中に追加しないとだめだった。
・activator newで6)play-scalaを選択 適当な名前(今回はtest)をつける cd test
でactivator runで 実行できることを確認する。
・activator compileを行ってから、activator eclipseでプロジェクトファイル作成ができるようだ。そしてeclipseでimport と、ここまでは前回の復習。
・緑に白抜き三角と鞄のアイコンのわきの▼をクリック>外部ツールの構成で、プログラムを右クリック>新規>ロケーションで、activator.batを選択、作業ディレクトリは、同じフォルダ指定、引数にrunとしてみたら、いちおう動いたようだ。
が、止め方がまだよくわからない。コマンドプロンプトであれば、CTRL+Dで止めるのだが、、、。
ソースを修正して、再コンパイルするとエラーとなる。ただ、再表示させると、自動的にリロードしてくれるので、修正は反映されるようだが。。。
2015年8月11日火曜日
Vb.net メニューアイテムを動的な配列にしてみた
メニューアイテムは通常は、動的に変化させてつかうことは少ないかもしれないが、設定ファイルサイズに合わせて、動的に項目数を変化させられれば便利かと思い、試してみました。
Public Class Form1
.......
Dim snm() As String
Dim sumax as Integer
Dim DpItem As ToolStripMenuItem() = New ToolStripMenuItem() {}
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
...............ここで、sumax行のデータをファイル(SURLP)から読み出し、snm()がデータだとすれば
Try
snm = Split(SURLP, vbCrLf)
sumax = snm.Length
ReDim DpItem(sumax)
For i As Integer = 0 To sumax - 1
..............
ToolStripMenuItem4.DropDownItems.Add(snm(i))
DpItem(i) = ToolStripMenuItem4.DropDownItems(i)
AddHandler DpItem(i).Click, AddressOf DpItem_Click
Next
...........
Try
......snumをファイルから読み出す
For i As Integer = 0 To sumax - 1
If i = Int(snum) Then
DpItem(i).Checked = True
Else
DpItem(i).Checked = False
End If
Next
Catch ex As Exception
End Try
End Sub
Private Sub DpItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim ic As Integer
For i As Integer = 0 To sumax - 1
If sender.ToString = snm(i) Then
Try
....ここでiをファイルに保存
ic = i
Catch ex As Exception
MsgBox(snm(i) + "ログインのショートカットがありません")
End Try
End If
Next
For i As Integer = 0 To sumax - 1
If i = ic Then
DpItem(i).Checked = True
Else
DpItem(i).Checked = False
End If
Next
End Sub
Public Class Form1
.......
Dim snm() As String
Dim sumax as Integer
Dim DpItem As ToolStripMenuItem() = New ToolStripMenuItem() {}
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
...............ここで、sumax行のデータをファイル(SURLP)から読み出し、snm()がデータだとすれば
Try
snm = Split(SURLP, vbCrLf)
sumax = snm.Length
ReDim DpItem(sumax)
For i As Integer = 0 To sumax - 1
..............
ToolStripMenuItem4.DropDownItems.Add(snm(i))
DpItem(i) = ToolStripMenuItem4.DropDownItems(i)
AddHandler DpItem(i).Click, AddressOf DpItem_Click
Next
...........
Try
......snumをファイルから読み出す
For i As Integer = 0 To sumax - 1
If i = Int(snum) Then
DpItem(i).Checked = True
Else
DpItem(i).Checked = False
End If
Next
Catch ex As Exception
End Try
End Sub
Private Sub DpItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim ic As Integer
For i As Integer = 0 To sumax - 1
If sender.ToString = snm(i) Then
Try
....ここでiをファイルに保存
ic = i
Catch ex As Exception
MsgBox(snm(i) + "ログインのショートカットがありません")
End Try
End If
Next
For i As Integer = 0 To sumax - 1
If i = ic Then
DpItem(i).Checked = True
Else
DpItem(i).Checked = False
End If
Next
End Sub
2015年8月5日水曜日
Poiでエクセルデータ読み込みの工夫(グループウエア)
グループウエアへのスケジュールデータをpoiを使って、ふだん使っているエクセルデータから読むようにしている。WEBで入力したり、インポートしたりという手間を省くためだ。ただ、残念ながら、データベースにくらべ、読み込みにどうしても負荷がかかるようだ。(これも、グループウエアが遅くなる原因か?)
そこで、キャッシュデータを使う方法を考えてみた。
public void doGet(..................
Calendar calendar = Calendar.getInstance();
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
int cmin=hour*60+minute;//現在時刻 整数値
ServletContext sc = getServletContext();
String ptime = (String)sc.getAttribute("time");//前回のキャッシュ時の時刻
String Cachex=(String)sc.getAttribute("cache");
if(cmin>=Integer.parseInt(ptime)&&cmin<=5+Integer.parseInt(ptime) && Cachex!=null){
//前回のキャッシュ作成から5分以上経過してないときは、キャッシュ利用
out.print(Cachex);
return;
}
Cache=ここで、poiの機能を使って読み取った 表示させたいデータ をセット
..............................................
ServletContext scc = getServletContext();
scc.setAttribute("cache", Cache);
String pptime="";
pptime=Integer.toString(cmin);//hhmm形式の時刻記録
scc.setAttribute("time",pptime);
そこで、キャッシュデータを使う方法を考えてみた。
public void doGet(..................
Calendar calendar = Calendar.getInstance();
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
int cmin=hour*60+minute;//現在時刻 整数値
ServletContext sc = getServletContext();
String ptime = (String)sc.getAttribute("time");//前回のキャッシュ時の時刻
String Cachex=(String)sc.getAttribute("cache");
if(cmin>=Integer.parseInt(ptime)&&cmin<=5+Integer.parseInt(ptime) && Cachex!=null){
//前回のキャッシュ作成から5分以上経過してないときは、キャッシュ利用
out.print(Cachex);
return;
}
Cache=ここで、poiの機能を使って読み取った 表示させたいデータ をセット
..............................................
ServletContext scc = getServletContext();
scc.setAttribute("cache", Cache);
String pptime="";
pptime=Integer.toString(cmin);//hhmm形式の時刻記録
scc.setAttribute("time",pptime);
2015年8月2日日曜日
グループウエアのアクセス集中緩和策
アクセス集中時の対策として、WEBサーバーとDBサーバー、どちらも分散化する方向で考えてみた。ゆくゆくはロードバランサーということなんだろうが、はたして、中古のPCでそれは可能か微妙である。
とりあえず、グループウエアのデータベースの書き込みと添付ファイルのアップーロードはマスターのサーバに送り、分散したサーバには、読み取り専用のスレーブDB、添付ファイルを置くことにした。Mysqlのレプリケーション、ファイルに対するrsyncで対処しようと考えている。うまくいけばいいのだが。
そういえば、アマゾンなども、情報をアップしても反映されるまで、時間がかかる。世界規模で、閲覧されるわけだから、多少の時間差もないとレプリケーションのようなこともむずかしいだろう。今回の件で、そのへんの事情がよくわかる気がする。
とりあえず、グループウエアのデータベースの書き込みと添付ファイルのアップーロードはマスターのサーバに送り、分散したサーバには、読み取り専用のスレーブDB、添付ファイルを置くことにした。Mysqlのレプリケーション、ファイルに対するrsyncで対処しようと考えている。うまくいけばいいのだが。
そういえば、アマゾンなども、情報をアップしても反映されるまで、時間がかかる。世界規模で、閲覧されるわけだから、多少の時間差もないとレプリケーションのようなこともむずかしいだろう。今回の件で、そのへんの事情がよくわかる気がする。
2015年8月1日土曜日
rsyncを使ってみた
rsyncで、特定のファイルを、更新したときだけ、コピーすることを考えてみた。-uでコピー元とコピー先を比較し、追加・更新されたファイル・ディレクトリのみをコピーします。
crontabで、5分間隔でチェックした場合
*/5 * * * * rsync -au --include="file.txt" --exclude="*" /mnt/windows/ /tenpu/
という具合でうまくいった。
リモートでもできるようだったが、面倒なので、共有を/mnt/windowsにマウントしている。
ポイントとして、コピー元の最後に/をつけるのを忘れないようにすること。(コピー先はつけてもつけなくてもいいらしい)
なかなか便利だが、いろいろ設定ができるため、使いこなすのもそれなりに知識がいる。
************
ちなみに、ディレクトリ内のすべてのファイルやその中のディレクトリ内も再帰的に指定したい場合は-rオプションをつかうようだが、-aオプションに含まれているらしい。-deleteはコピー元にない(削除された)ファイルをコピー先で削除します。コピー元とコピー先を同期します。-zで通信の圧縮が可能とか。
*/5 * * * * rsync -auz --delete /mnt/windows/ /tenpu/
といった具合にすれば5分間隔でフォルダ内のファイルの同期がとれる。
crontabで、5分間隔でチェックした場合
*/5 * * * * rsync -au --include="file.txt" --exclude="*" /mnt/windows/ /tenpu/
という具合でうまくいった。
リモートでもできるようだったが、面倒なので、共有を/mnt/windowsにマウントしている。
ポイントとして、コピー元の最後に/をつけるのを忘れないようにすること。(コピー先はつけてもつけなくてもいいらしい)
なかなか便利だが、いろいろ設定ができるため、使いこなすのもそれなりに知識がいる。
************
ちなみに、ディレクトリ内のすべてのファイルやその中のディレクトリ内も再帰的に指定したい場合は-rオプションをつかうようだが、-aオプションに含まれているらしい。-deleteはコピー元にない(削除された)ファイルをコピー先で削除します。コピー元とコピー先を同期します。-zで通信の圧縮が可能とか。
*/5 * * * * rsync -auz --delete /mnt/windows/ /tenpu/
といった具合にすれば5分間隔でフォルダ内のファイルの同期がとれる。
Mysql レプリケーション
Mysqlのレプリケーションの設定をやってみた。
以下のリンクを参考にさせてもらった。
http://dotnsf.blog.jp/archives/1028720878.html
1 マスターで
mysql > GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.0/255.255.255.0' IDENTIFIED BY 'password';
ネットワークアドレスの指定のため、192.168.1.0の最後は0とすることに注意
/etc/mysql/my.cnf
[mysqld]
log-bin=mysql-bin →もとのファイルではlog_binとなっていたが、log-binでいいようだ。
server-id=1001
として、service mysql restart
2 スレーブで
mysql > GRANT ALL PRIVILEGES ON *.* TO 'repl'@localhost IDENTIFIED BY 'password';
my.cnfの編集
[mysqld]
log-bin=mysql-bin
server-id=1002 として service mysql restart
3 マスターで
mysql > FLUSH TABLES WITH READ LOCK;
mysql > SHOW MASTER STATUS;
このとき、Fileのmysql-bin.00000?(6桁数字) Positionの3桁数字 をメモしておく
別のコンソールで
# mysqldump -u root -p mydb --lock-all-tables > mydbdump.db によりデータを保存
もとのコンソールで
mysql > UNLOCK TABLES;
4 データの移動
mydbdump.dbをスレーブに移動
5 スレーブで
# mysql -u repl -p mydb < mydbdump.db
mysql > CHANGE MASTER TO
MASTER_HOST='192.168.1.XXX',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000031', ←3でメモした値
MASTER_LOG_POS=285; ←〃
mysql > START SLAVE;
※以上だが、実際にはうまくいかなかった。原因はいくつかあった。
・http://pyoonn.hatenablog.com/entry/2015/01/09/133102が参考になりました。どうやらコネクトしてないようだった。
# mysql -h 192.168.*.* -u repl で、接続確認しても、エラー
マスターで
grant all privileges on *.* to repl@"192.168.58.%" identified by 'password' with grant option;
で特権を与える。192.168.58.*のワイルドカードのホストのreplからアクセス可能に
スレーブで確認するには
mysql>SHOW SLAVE STATUS\G
このとき、Slave_IO_Running: Yesが表示されればOKだが、まだ、だめ
・さらに、iptablesがじゃましてないか確認したが、ディフォルトでOFFなってたので、関係なかった。
・そこで、
http://d.hatena.ne.jp/uriyuri/20081024/1224798772を参考にさせていただいた。
/etc/mysql/my.cnfの設定では
bind-address = 127.0.0.1
bind-address = (接続したいマシンのIPアドレス)
と、接続先を追加していくか、または、どのIPからも接続許可したいなら、いっそbind-addressをコメントアウトすればよいということらしい。
これで、なんとか、動くようになった。
※ひとつレプリケーションで注意が必要なことがあるようだ。
http://nippondanji.blogspot.jp/2009/03/mysql10.html にあるように
スレーブのデータは変更しないということ。
グループウエア等の設定では、十分注意が必要なところなようだ。
以下のリンクを参考にさせてもらった。
http://dotnsf.blog.jp/archives/1028720878.html
1 マスターで
mysql > GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.0/255.255.255.0' IDENTIFIED BY 'password';
ネットワークアドレスの指定のため、192.168.1.0の最後は0とすることに注意
/etc/mysql/my.cnf
[mysqld]
log-bin=mysql-bin →もとのファイルではlog_binとなっていたが、log-binでいいようだ。
server-id=1001
として、service mysql restart
2 スレーブで
mysql > GRANT ALL PRIVILEGES ON *.* TO 'repl'@localhost IDENTIFIED BY 'password';
my.cnfの編集
[mysqld]
log-bin=mysql-bin
server-id=1002 として service mysql restart
3 マスターで
mysql > FLUSH TABLES WITH READ LOCK;
mysql > SHOW MASTER STATUS;
このとき、Fileのmysql-bin.00000?(6桁数字) Positionの3桁数字 をメモしておく
別のコンソールで
# mysqldump -u root -p mydb --lock-all-tables > mydbdump.db によりデータを保存
もとのコンソールで
mysql > UNLOCK TABLES;
4 データの移動
mydbdump.dbをスレーブに移動
5 スレーブで
# mysql -u repl -p mydb < mydbdump.db
mysql > CHANGE MASTER TO
MASTER_HOST='192.168.1.XXX',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000031', ←3でメモした値
MASTER_LOG_POS=285; ←〃
mysql > START SLAVE;
※以上だが、実際にはうまくいかなかった。原因はいくつかあった。
・http://pyoonn.hatenablog.com/entry/2015/01/09/133102が参考になりました。どうやらコネクトしてないようだった。
# mysql -h 192.168.*.* -u repl で、接続確認しても、エラー
マスターで
grant all privileges on *.* to repl@"192.168.58.%" identified by 'password' with grant option;
で特権を与える。192.168.58.*のワイルドカードのホストのreplからアクセス可能に
スレーブで確認するには
mysql>SHOW SLAVE STATUS\G
このとき、Slave_IO_Running: Yesが表示されればOKだが、まだ、だめ
・さらに、iptablesがじゃましてないか確認したが、ディフォルトでOFFなってたので、関係なかった。
・そこで、
http://d.hatena.ne.jp/uriyuri/20081024/1224798772を参考にさせていただいた。
/etc/mysql/my.cnfの設定では
bind-address = 127.0.0.1
bind-address = (接続したいマシンのIPアドレス)
と、接続先を追加していくか、または、どのIPからも接続許可したいなら、いっそbind-addressをコメントアウトすればよいということらしい。
これで、なんとか、動くようになった。
※ひとつレプリケーションで注意が必要なことがあるようだ。
http://nippondanji.blogspot.jp/2009/03/mysql10.html にあるように
スレーブのデータは変更しないということ。
グループウエア等の設定では、十分注意が必要なところなようだ。
VirtualBoxでUbuntu2台同時実行
VirtualBoxにホストオンリーアダプタを有効にして、2台のUbuntuを動かしてみた。実環境でテストもできないので、2台のMysqlサーバーのレプリケーション、Webアプリを試験的に動かすためです。
職場のグループウエアが、Mysqlがネックになってきて、混雑時に表示が遅くなってきたためだ。いまだに、メモリ1GB未満で、CPUも1Coreの一世代前のものなので、複数台で対処するしかないようだ。
とりあえず、グループウエアのほうは、DBの書き込みと読み込みを別のサーバに設定できるようにした。あとは、マスターのDBサーバとスレーブのDBサーバのレプリケーションがうまくいけばOKだ。
職場のグループウエアが、Mysqlがネックになってきて、混雑時に表示が遅くなってきたためだ。いまだに、メモリ1GB未満で、CPUも1Coreの一世代前のものなので、複数台で対処するしかないようだ。
とりあえず、グループウエアのほうは、DBの書き込みと読み込みを別のサーバに設定できるようにした。あとは、マスターのDBサーバとスレーブのDBサーバのレプリケーションがうまくいけばOKだ。
登録:
投稿 (Atom)