2016年10月26日水曜日

<Java>EJBだとアクセス修飾子でコンパイルエラーにならない?

最近、プログラミングで困ったことをアップしておきます。

Stateless EJBから、同パッケージの別クラスのメソッドへのアクセス不可でもコンパイルエラーにはならなず、実行時エラーになる。

説明が難しいですね。。。
まず、アクセス修飾子についておさらいですが、
protectedが付与されたメンバには、自クラス・同パッケージ・サブクラスからアクセスできます。

Oracle The Java™ Tutorials Controlling Access to Members of a Class

antのビルドは通ったのですが、 実行時、stateless EJB bean からアクセスする際に下記のエラーが出ました。

java.lang.IllegalAccessError: tried to access method Connected.getString(Ljava/lang/String;)Ljava/sql/ResultSet; from class sample

先輩に教わりましたが、publicにすると問題なく実行できました。
protectedだから問題ないと思ってましたが、実行時のエラーから問題のあるメソッドは特定できていたので、試してみるべきでした。。。
同パッケージなのに、protectedでアクセスできないというのは、クラスローダーが違うからみたいです。 java EEのデバッグしんどい。。。

参照: stack overflow / java.lang.IllegalAccessError: tried to access method

テンションリダクション効果

本日は、広告業界・心理学用語です。

テンションリダクション効果

心理的に緊張している状態が続いた後に、ほっと一息ついた瞬間は注意力が落ちる、 というごくまっとうな傾向のことだそうです。

Amazonの「他の人はこれも見ています」、が一例です。

参照:
テンション・リダクションの効果と具体例。マーケティング応用
”無防備な状態”に付け込む心理学「テンション・リダクション効果」とは?【コピーライティング×心理学】

2016年10月22日土曜日

"Brave Shores" has a good vive !

<JavaScript>boolean以外の変数も判定できるんですね

自分のメイン言語はJavaのため、JavaScriptにはびっくりさせられることがある。
判定式にboolean型以外の型の変数だけを入れることができるとはね。。。

if ( var ) {
  // procedure
}
変数の型判定
文字列空文字以外はtrue
数値0かNaN以外はtrue
objectnull以外はtrue
undefinedfalse
nullfalse

Javaだとメソッドでbooleanを戻すようにしているから、こっち方が楽ですね

<JavaScript>JavaScriptの月インデックスはゼロ始まり

ドットインストールでJavaScript入門を連続再生させて聞いていて、気をつけなきゃなと思ったことのメモ

JavaScriptの月インデックスはゼロ始まり

JavaScriptでは、月はゼロから始まります。 次のように、getMonthを使った時は、インデックスに1を足しましょう。

//JS
var date  = new Date();
var month = date.getMonth()+1;

違う例えとして、特定の日付オブジェクト生成時を、ブログ更新中の今の時間にしてみる。
※ 2016/10/22 17:50

var date = new Date(2016, 9, 22, 17, 50, 00);

参照:

先人の知恵に、ひたすら感謝です

ノルマ

SEのための会計の教科書という本を読んでいて、「おっ」と思った、『ノルマ』の語源。

このノルマの語源はロシア語で、決められた時間内に行うべき作業量を意味し、
シベライ抑留者によって日本に伝わったといわれている。

そりゃ、なんとも達成せんとな。。。

<Java>ResultSetからのデータ抽出は、カラム番号ではなくカラム名で!

Javaの小ネタ。実装時にどのメソッドを使うべきか、という低レベルな話です。

ResultSetからのデータ抽出

JavaでデータベースにSQLのSELECT文を流す際、PreparedStatementとResultSetを使います。
ResultSetから値を取り出す際は、引数はカラム番号ではなくカラム名にしましょう。

例えば、ResultSetには、文字列を取り出すメソッドが2つ用意されています。
正確には、オーバーライドされて、カラム番号(int)とカラム名(String)のどちらも引数に取れるということです。

  • String getString(int columnIndex)
  • String getString(String columnLabel)

columnIndex(カラム番号)は、1始まりなので、配列のインデックスと間違えて、ゼロ始まりとしてしまう可能性があります。
また、columnLabel(カラム名)としておけば、可読性も増します。
まとめとして、ResultSetから値を取り出す際は、引数はカラム名を使いましょう。

<Java>コンストラクタの継承はない

Javaの入門書を読み直して、「あー、そうだったね。」という点を書いてみます。

  • メソッドのシグネチャは下記3つ
    1. 戻り値の型
    2. メソッド名
    3. 引数の型
  • 親クラスが持つ、引数の数が違うコンストラクタは、子クラスでは呼び出せない
    ※ メソッドとは違って、引き継がれない(透けて見えることがない) ※ superで呼び出すことはできます。
    ※ (追記)まぁ、コンストラクタ名が違うので当たり前ですよね。。。
  • 親クラスで引数を持つコンストラクタが定義された場合、子クラスで呼び出さないとコンパイルエラーとなる
    ※ 正確にいうと、親クラスに対応するコンストラクタがないと、子クラスのインスタンス生成時にコンパイルエラーになるよって話

継承は、メソッドだけでなく、コンストラクタにも縛りがあり、親子間の共通化が徹底されている(保証されている)ことを再認識しました。

2016年10月3日月曜日

PS/2端子って、プラグアンドプレーに対応してないのな

PCの立ち上げ(キッティング)やPC自作している人には、常識かもしれませんが、
PS/2端子でキーボードやマウスをつなげた場合、PCの再起動が必要なんですね。

つまり、プラグアンドプレー(周辺機器をPCにつなげたら自動認識・設定する機能)に対応していない。
前の会社は、ノートパソコンメインで使っていたので、全然知らなかった。

2016年10月1日土曜日

vagrant upで"Failed to mount folders in Linux guest."

勉強のため、Postgre SQLを玩ぼうと、久々にvagrantを立ち上げたら、virtual machineは立ち上がるものも、マウントに失敗しる模様。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'bento/centos-6.7' is up to date...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => /Users/user/myvagrant/mycentos
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device

$ 

下記のブログを参考になんとか解決しました。

事象内容

1. guest osとhost osでvirtual boxのvirtual boxのバージョンが違うと、共有ディレクトリがリンクできない。
2. vagnrat vbguest installによりguest osのvirtual boxのバージョンアップを試みたが、カーネルの更新で失敗していた。

対応内容

まずは、2から。
2. guest osにvagrant sshしてyumでカーネルを更新※今回のguest osはcent os 6.7でしたので、yum。
$ sudo yum -y update kernel
念のため、下記も実行しました。
yum -y install kernel-devel kernel-headers dkms gcc gcc-c++
1. guest osを再起動したら直りました。
$ vagrant reload