レッツノート CF-W7にWindows10をインストールしてみた

レッツノート CF-W7というノートPCを入手したのでSSDに換装して64bit Windows10 professional をインストールしてみた。
大体のスペックは
・CPU:Core 2 Duo U7500
・メモリ:3GB
・SSD:intel 40GB

このノートPCを入手するときにはCPUの性能は把握せずにいて、Coure2Duoで2コアならまあなんとかなるかな・・・と楽観していたが、このCPUはノートPC用の低電圧タイプで処理能力はかなり控え目になっている。デスクトップ用のCore 2 Duoなら性能的にはWindows10を問題なく動かせることができるだろうが(Win10の対応CPUにはなってないが)、このノートPC用のCore2DuoでWin10を使うにはかなりギリギリといった印象。Core2Duo U7500の性能はどれくらのものかというとAtom330と大体互角ぐらいの模様。Atom330はWinXPならまずまず快適に動くが、Win7は現実的ではないとされるような性能だったのでU7500も同様に現実的ではないのかもしれない。

実際にCF-W7にWin10proをインストールしてみて使って見た感じでは、初期のクリーンインストールした状態で既に重くて使えたものではなかった。システムをパフォーマンス重視の設定にしてWindows Defenderのリアルタイム保護や重そうなもの全部オフにしてWin10のビジュアルのエフェクトとか透明化とかも全部オフにしてスタートアップの不要なそうなものも全部オフにして、そこまでしてようやくなんとかサクサクと動くようにはなった。動くだけ、使えるだけマシといったところでyoutubeで動画再生などはできないことはないがそれだけでファンが全開になるのでマルチメディア系の処理は諦めた。音楽を聞くぐらいなら大丈夫だと思うが。

今回の作業でわかったことは、

  • Core2Duo U7500 でWindows10はギリギリ動かせる程度の性能
  • Core2Duo U7500とAtom330は同程度の性能
  • Core 2 Duo でもWindows10は動く様子
  • レッツノートって見た目分厚くて重そうだが意外と軽い

ということぐらい。このノートPCにはやはりWindowsXPかVistaまたはLinux系のなんか軽そうなOSをインストールして使うのが性能的に無難かもしれない。

HTML要素自体にCSSを適用する

HTMLのスタイルシートについて、今までHTML要素とbody要素には特にスタイルシートを設定することは意図的に避けていたが、適用するとまずいこととかあるのだろうか。そういうことをしている人があまりいないというのもあって、そういうものというかbody要素の中の要素に対してだけスタイルシートを当ててデザインするのが当たり前だと思っていた。body要素にはせいぜいmargin:0;padding:0;という設定をするぐらい。

で、HTML要素とBody要素にcssを適用してレイアウトしてみたらどうなるか試してみた。


<html>
<head>
<title>css テスト</title>
<style>
html{background-color:#000;padding:0;margin:0;}
body{background-color:#fff;width:700px;margin:20px auto;padding:0;}
h1{background-color:#ccc;}
</style>
</head>
<body>
<h1>CSS テスト</h1>
</body>
<html>

テストしてみたところ、上の画像とソースのように特に問題はなさそうに見える。これでいいのなら今度からhtmlt要素とbody要素にもcssを適用していこうかと思う。div要素が一つ減らすことがきてソースが簡潔になるし。ただやってる人がいなさすぎて大丈夫かなというのはあるが、多分大丈夫だろう。

amazonaws.comをアクセス拒否

apache2のログを見ていたらamazonaws.comからのクローラーがやたらと目につくようになった。robots.txtに見つけるたびにクローラー名を追記していってもあまりにも種類が多いのでいっそのことamazonaws.comをアクセス禁止にしてみた。

<Location />
Order allow,deny
allow from all
deny from amazonaws.com
</Location>

ぐぐってみたら他の人もamazonaws.comからのクローラーやスパムに困っている人が多数いる様子。これ、みんながamazonaws.comに対してアクセス禁止していったらどうなるんだろうか。Amazon EC2自分が借りるかもしれないときにいろんなサイトからアク禁されまくってると思うとちょとためらうかも。

最近のJavascriptはvarで変数宣言はだめらしい

Javascriptの変数宣言はvarとletとconstの3種類がある模様。varだけは知っていたがletとconstは新しくできた仕様で最近のブラウザでは大体サポートされているとのこと。

letでの変数宣言はブロック内でのスコープで有効となる変数とされる。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

The let statement declares a block-scoped local variable, optionally initializing it to a value.

constはletに似ていてブロック内スコープだが再代入は不可
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const

Constants are block-scoped, much like variables declared using the let keyword. The value of a constant can’t be changed through reassignment, and it can’t be redeclared.

プログラミング作法的には変数のスコープを意識して宣言するのが正しいのだろうけれど、個人的にはvarでの変数宣言で十分ではないかなと思う。javascript使ってウェブページをアプリケーションにしてしまおうとか無茶なことしない限りは。

E: https://packages.cloud.google.com/apt/dists/kubernetes-xenial/main/binary-armhf/by-hash/SHA256/f840280436b5a28e352a584ead923e2554ddb4156b458f1205534af1f9db56d9 の取得に失敗しまし た

raspberry pi3にkubernetesを公式の通りにインストールしようとしたら下記エラーが出た。

E: https://packages.cloud.google.com/apt/dists/kubernetes-xenial/main/binary-armhf/by-hash/SHA256/f840280436b5a28e352a584ead923e2554ddb4156b458f1205534af1f9db56d9 の取得に失敗しまし た  404  Not Found [IP: 2404:6800:400a:80b::200e 443]
E: いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。
root@raspberrypi:/home/nakahira# sudo apt-get install -y kubelet kubeadm kubectl
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
E: パッケージ kubelet が見つかりません
E: パッケージ kubeadm が見つかりません
E: パッケージ kubectl が見つかりません

公式の手順は

$ sudo apt-get update && sudo apt-get install -y apt-transport-https curl
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
$ cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF

$ sudo apt-get update
$ sudo apt-get install -y kubelet kubeadm kubectl
$ sudo apt-mark hold kubelet kubeadm kubectl

となっているが
deb https://apt.kubernetes.io/ kubernetes-xenial main
の部分を下記のように変更する。

$ sudo apt-get update && sudo apt-get install -y apt-transport-https curl
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
$ cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb http://packages.cloud.google.com/apt/ kubernetes-xenial main
EOF

$ sudo apt-get update
$ sudo apt-get install -y kubelet kubeadm kubectl
$ sudo apt-mark hold kubelet kubeadm kubectl

これでファイル取得できるようになってインストールが無事完了できた。インストールの段階で公式の通りにやっていかないとこの先大丈夫だろうかと不安になるな・・・。

JAVA DataSouceオブジェクトをBasicDataSourceへキャストする

DataSouceオブジェクトというのはJNDIでコンテキストファイルからDBの接続情報を参照してきてその情報をセットするものでこんな感じで私は使っている。

		try {
			InitialContext ictx = new InitialContext();
			DataSource ds = (DataSource) ictx.lookup("java:comp/env/jdbc/connect-db");
			con = ds.getConnection(); 
		} catch (Exception e) {
			throw new Exception(CLASS_NAME + "/getDBConnection() failure:"
					+ e.getMessage());
		}

このlookupしてきた情報はDataSourceオブジェクトの型で取得することになるが、これをDBCPのBasicDataSourceオブジェクト型で取得するには、コンテキストファイルのResourceの情報にfactoryの属性を追加するとできるようになる。

	<Context path="/my-proj" reloadable="true" docBase="C:\eclipse\workspace\my-proj" workDir="C:\eclipse\workspace\my-proj\work">

    	<Resource name="jdbc/connect-db"
                auth="Container"
                type="javax.sql.DataSource"
                driverClassName="com.mysql.jdbc.Driver"
                url="jdbc:mysql://my-address:3306/db?autoReconnect=true"
                username="user"
                password="pass"
		validationQuery="select 1"
                maxActive="100"
		factory="org.apache.commons.dbcp.BasicDataSourceFactory"
                maxIdle="100" />

	</Context>

上の記述のfactoryのところがポイント。で、下記のような感じでキャストしてBasicDataSourceオブジェクトとして使えるようになる。


	public static Connection testConnection() throws Exception {
		Connection con = null;
		try {
			InitialContext ictx = new InitialContext();
			BasicDataSource bds =  (BasicDataSource) ictx.lookup("java:comp/env/jdbc/connect-db");
			con = bds.getConnection(); //
			
		} catch (Exception e) {
			throw new Exception(CLASS_NAME + "/getDBConnection() failure:"
					+ e.getMessage());
		}
		return con;
	}

コンテキストファイルからJNDIで接続情報を取得してきてBasicDataSourceオブジェクトとして使えるのならコードに接続情報直書きよりかは便利かなと。Common DBCPを使ってみたかったのもあってコネクションのプールとか性能が今までより(?)上がってるといいのだけれど。

この実行テスト環境はJAVA 1.6、tomcat5.5、common-DBCP 1.4 といった感じ。

JAVAサーブレットクラスの初期化

JAVAサーブレットのクラスを初期化するときの方法について何種類かあるので迷ったので覚書き。
かんたんなサーブレットクラスを作ってテストしてみた。

public class InitTest extends HttpServlet{
	
	static{
		System.out.println("static medhod called");
	}
	
	public void init() throws ServletException{
		System.out.println("init medhod called");
	}
	
	public InitTest(){
		System.out.println("class constructor called");
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("http doGet called");
	}
	
}

1番めはstaticメソッド。initilizerとも呼ばれる。staticなinitilizerで呼ばれるタイミングは一番早い。
2番めはinitメソッドでインスタンス作成後に一度だけ呼び出されるらしい。
3番めはコンストラクタでインスタンス作成したときに呼び出される。

で、上記クラスをTomcatで実行してhttpでアクセスしてみたら

static medhod called
class constructor called
init medhod called
http doGet called

という順番で呼び出された。staticメソッドとクラスのコンストラクタのどちらを使おうかと迷っていたらクラスのinit()メソッドというのも存在していて余計にややこしくなった。init()メソッドは今まで使ってこなくても何の問題もなかったのでJAVAサーブレットで開発をしている上では無視しておいてもいいんじゃないだろうか(適当)
JAVAサーブレット自体がクラスのインスタンスを1つしか作成しないようになっていていくつもインスタンスを作るようなものだったらstaticメソッドを使うかコンストラクタを使うかとか迷わないんだが。

eclipseのプロジェクトのソースファイルが全部消えた

eclipseで普通にデバッグ作業していただけなのにいきなりワークスペースのプロジェクトのフォルダ内のファイルが全部消えた。今までこんなことは経験がなかったので焦った。

消えるきっかけとなった原因

jdbcのドライバを間違って接続しようとしたときに発生したような気がするが、定かではない。具体的にはmysqlのDBに対してmariadbのドライバで接続しようとしたら、その結果は当然接続はできないわけだけれど、特にそれに関するエラー表示もなくいきなり全消しになった。ぷよぷよかよ。そんなことでソースファイルが消えるはずがないと思うが他に思い当たることがない。

幸い、ソースファイルは復元することができた。eclipseのパッケージエクスプローラから中身が全部消えてしまったプロジェクトを右クリックして、ローカルヒストリーからの復元を選択すると以前のソースファイルが残っていてなんとか復元することができた。(速攻でバックアップとったけれども)

で、復元したプロジェクトでもう一回同じこと(mariadbのドライバでmysqlDBに接続)してみたらまた消えた。まさか再現できるとは思わなかった。バックアップとっていたので今度は楽に復旧できたが、さすがにもう一回やる気にはならない。古いバージョンのeclipseを使っているせいかもしれないがjdbcドライバーでDBに接続しようとしてそこでエラーとかソースのリロードとかがあったらこの全消しが発生するような気がする。mariadbのドライバとmysqlのドライバを併用して切り替えて接続するとかいうのはeclipse的に何かまずいのかもしれない。

mariadbのポートを変更する

mariadbのコンフィグファイルであるmy.cnfにポートの設定を追加する。mysqldセクションとportを下記のように追加して再起動する。そしてmysqlにログインして show variables like ‘port’; を実行して反映されているか確認。

# nano /etc/mysql/my.cnf

# The MariaDB configuration file
#
# The MariaDB/MySQL tools read configuration files in the following order:
# 1. “/etc/mysql/mariadb.cnf” (this file) to set global defaults,
# 2. “/etc/mysql/conf.d/*.cnf” to set global options.
# 3. “/etc/mysql/mariadb.conf.d/*.cnf” to set MariaDB-only options.
# 4. “~/.my.cnf” to set user-specific options.
#
# If the same option is defined multiple times, the last one will apply.
#
# One can use all long options that the program supports.
# Run program with –help to get a list of available options and with
# –print-defaults to see which it would actually understand and use.

#
# This group is read both both by the client and the server
# use it for options that affect everything
#
[mysqld]
port=10456

[client-server]

# Import all .cnf files from configuration directory
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mariadb.conf.d/

シンプルな家計簿(仮) バージョン0.940公開

シンプルな家計簿 バージョン0.940はこちらから
https://www.crossdrive.net/wp/software/cdn-01

バージョン0.940の変更点は主にホームタブ画面の再構成です。総資産額を折れ線グラフで累積表示化、費目を棒グラフでグループ表示化、収支一覧表の省略化、概要のデザイン調整などなど。左上のカレンダーで日付を選択するとそれぞれ表示内容が変わります。

今後の予定は
バージョン0.950 → 入力画面の再構成
バージョン0.960 → 抽出タブ・予算タブのグラフ再構成
バージョン1.000 → やることなくなったら

繰り返し入力機能について

機能として実装は多分可能ですが、仕様がやや複雑にならざるをえないので最善な方法が見つかるまで保留します。

例えば、繰り返し入力のデータは即時反映させるか、当該月に入ってから反映させるか、キューとして保持しておくか、いつでも確認できる形で未来のレコードとして反映させるかなどなど。