2018年1月アーカイブ

思うように書けない。

最近は久々に技術ブログっぽくなってきました。先進かつ有用なネタは全くないのだけど。
(釣り目的でこのサイトに訪れている方には申し訳ないのだが。)

前の記事に書いた通り、そのサイトはGoogle App Engineで動かしているので、処理には少し気を使います。
とはいえ、弱小サイトなので無料運用は余裕ですが...。
ただ、本人的にはもう少し利用者を増やすぞという気持ちもあるので、利用者が増えても大丈夫にしたいと思っています。

Google App EngineではDatastoreへのアクセス回数を減らしてMemcacheにデータを乗せるというのがセオリーです。
Datastoreへのアクセス回数は可能な限り少なくできれば、無料運用しやすいので。

Slim3 ModelのModelRefでレイジーロードするときにDatastoreにアクセスするので、そこを改造していました。
ModelRefを継承したCachedModelRefを作成し、refreshメソッドの処理を書き換えて...と。

作成したクラスは以下みたいな感じで書きましたが、呼び出し元での書き方がわからず...。
package xxx.base.datastore;
import org.slim3.datastore.ModelRef;
/**
* CachedModelRef
*/
public class CachedModelRef<M> extends ModelRef<M> {
  private Class<CachedDaoBase<M>> daoClass;
  @Override
  public M refresh() {
    try {
      return daoClass.newInstance().get(key);
    } catch (InstantiationException | IllegalAccessException e) {
      throw new RuntimeException(e);
    }
  }
  public CachedModelRef(Class<M> modelClass, Class<CachedDaoBase<M>> daoClass) throws NullPointerException {
    super(modelClass);
    this.daoClass = daoClass;
  }
}

結局、コンストラクタのClass<CachedDaoBase<M>>をClass<?>にしちゃいました。

久々のGoogle App Engineではまりまくり。

Google App Engineで構築しているサイトがあるのですが、2014年に構築して以来、放置状態でした。
放置状態なのでアクセス数もほとんどないのですが、スマホ対応化&広告付与をしようと思って久々に触ってみました。

Eclipseを最新化して、Google App EngineのEclipse Pluginを導入して...と環境構築に勤しんでから、
Subversionのリポジトリからコードをチェックアウト。

動かしてみるとまともに動かない...。

はまりポイント① java.lang.NoClassDefFoundError

とりあえず動かしてみたら、いきなり例外発生。
あまり真面目に解析しなかったがSlim3内部で使っているのだろうか?
Base64DecorderExceptionが見つからないみたいなエラー。

Google App Engineをむやみやたらと更新したのが裏目に出たのと反省。
とりあえず稼働実績のあるGoogle App Engine 1.7.0にしてみることに。

はまりポイント② org.apache.jasper.JasperException

今度こそと思い、動かすと新たな例外発生。その名もJapserException。
調べたらJava7にしたら治るらしい。そもそもGAEの推奨はJava7らしい。
というわけでJava7にしたらエラーはでなくなりました。

はまりポイント③ 500 Internal Server Error

今までのエラーを解消してローカル環境では動くようになりました。
とりあえずの既存コードのデプロイを試してみると、デプロイは成功したもののHTTPステータスコード500が返ってくる。
ログを見てみるとjava.lang.UnsupportedClassVersionErrorが出ていて、Unsupported major.minor version 52.0とのこと。

JSPのバイトコードは52.0(Java8)で生成されてしまっているらしい。
Java7に変えたのに何故だろうと思っていたが、どうやらEclipseが動作しているJavaのバージョンでコンパイルされている様子。

eclipse.iniを弄ってJava7に振り替えるとEclipseが起動しない。
どうやらEclipse 4.6(Neon)はJava7で動作はできないのだろうか。

というわけで諦めてEclipse 4.3(Kepler)としました。
そうしたところ、正常に動作しましたとさ。

今回の結果から、Slim3構成 かつ JSP使っている場合は以下の組み合わせがよさそうですね。
IDE:Eclipse 4.3(Kepler)
JDK:JDK7 Update80
GAE SDK:1.7.7
Slim3:1.0.16

ほんと、非互換って恐ろしい。
Xperia Z3 Compactの画面のクラックが大きくなり、タッチ切れの範囲が拡大していったため、液晶の交換を行いました。

2015年2月に格安シム(Biglobe)に乗り換えたタイミングで白ロムを購入したので、もう3年近く使っています。
修理ではなく新機種購入も考えたのですが、スペック的な不満がないのと、欲しいスマホがなかったので修理することにしました。
(最近のスマホって全部サイズが大きいので、小さいのがあればよかったのですが。)

修理業者に出すと1.5万~2万ぐらいするらしいので、自分で直してみることにしました。
直すのにあたっては以下のサイトがわかりやすくて参考になったので、詳しくは書きません。
【自分で修理】Sony Xperia Z3のフロントパネルを交換【ディスプレイ】 | マガリスギ.net

材料はAmazon.comで以下のパーツを購入しました。


こんな感じで届きます。
2017-11-04-004.JPG

カメラ別で用意していなかったので、修理前後の写真はありません...。

修理はできたのですが若干問題があります。
液晶とスマホ本体を固定するために両面テープで接着していますが、購入したテープの粘着力が弱く、若干浮いてきます。

どうやら製造時は工場では特殊なレーザーを用いた圧着を行っているようです...。
というわけで応急処置的には何とかなりましたが、気にする人にはお勧めできませんね。

iPhone6Sのようにねじ止めされているタイプでしたら、画面が浮くような現象は発生しないんでしょう。

旧バージョンのKernelインストール

新年あけましておめでとうございます。

年が明けて何を思ったのか自宅サーバ(CentOS6)のアップデートをしていました。
そうしたらサーバがリブートできなくなり、「init: Re-executing /sbin/init」まで表示されてハングするようになりました。
仮想マシンのログには次のように出力されているので、サポートされていないCPU(AMD FX-6300)を使っているのがダメなんでしょう。
vcpu-0| PerfCtrK7_EvtSelWrite: unimplemented event selector: 130076 rip=0xffffffff810410c8

あれこれと調査して/etc/init.d/haltを追ってみましたが、よくわからず。
結局、CentOS 6.5のKernelまで戻せば正常に再起動できるようになりました。

一応、備忘としてやり方を書いておきます。

/etc/yum.repos.d/CentOS-Base.repoの修正

CentOSのリポジトリは最新バージョンしか置いていないのでvault.centos.orgを見に行くように変えます。
mirrorlistをコメントアウトして、baseurlの箇所をvault.centos.orgに書き換えます。
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#
[base]
name=CentOS-$releasever - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
baseurl=http://vault.centos.org/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
#released updates
[updates]
name=CentOS-$releasever - Updates
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
baseurl=http://vault.centos.org/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
baseurl=http://vault.centos.org/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
baseurl=http://vault.centos.org/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib&infra=$infra
baseurl=http://vault.centos.org/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

/etc/yum/vars/releaseverの作成

戻したいバージョンのreleaseバージョンを書いたファイルを作ります。
# echo "6.5" > /etc/yum/vars/releasever

yumコマンドの実行

古いバージョンを見れるようになったので、yumコマンドでインストールします。
# yum clean all
# yum install kernel

Kernelバージョンの固定

Kernelが更新されないように/etc/yum.confに以下の行を追加します。
exclude=kernel*

うーん。そろそろVMware Serverから乗り換えないと新しいOS動かせないな...。