読者です 読者をやめる 読者になる 読者になる

m_shige1979のささやかな抵抗と欲望の日々

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

なんとなく作ったサイト

http://www.it-check-matome.info/


Github(注意すること)

https://github.com/mshige1979

JavaEEによるレルム認証を試しました

Java JavaEE JavaEE7

元にしたものは以下

www.slideshare.net
※今回はダウンロードしました

4時間がかかりました。

これって実際のセミナーとかではどんな感じだったのかな?
結構時間がかかった
1時間とか2時間では無理な感じがしました。まあ、私がよくわかっていないのかもしれませんけど。

簡単な認証手段はない?

資料を見る限り手動で暗号化を行っていた。
phpとかではハッシュ関数で簡単に暗号化の文字列を取得できていないので。
もう少し簡単な手段は欲しかった。

所感

本などを読んだりするだけではいまいちピンとこないので実際に作ってみるのは
勉強になる。
JSFEJBの使いどころもなんとなるわかってきた感じがする。参考書と合わせて勉強していくことにする。

今更ながらJavaEEのWebscoketのサンプルを試してみた

Java JavaEE JavaEE7

当時はJavaEEってわかってなかった

今でもきちんとわかっているわけではないがプロジェクトを構築してサンプルを起動できるようになっているので
資料見ながらやってみた

ハンズオン用と思われるので資料がどこかにあったかも

実際、全部見ながらやってコピペしていないのでそこそこ手間取った

所感

不慣れであるため手間取りはしましたがソースコードの記述はほとんどないので
楽といえば楽できた感じがあります。
websocketとかはサーバで実行するときはヘッダーとかなんかいろいろやらないといけない感じがしたけど
特に意識せずに作成できたのが良かった感じ。
作り方を覚える必要があるけど覚えていくことで生産性があがるかもしれないので期待したい

どうでもいいこと

スライドシェアって下スクロールできたんですね…

androidでローカルhtmlを表示する

android

cordovaでも良いかもと思われましたが

なんとなるやりたくなったので調べ直しました。

環境

android2系
エミュレータが新しくなってなんと動くようになっていた

やること

  1. test.htmlを作成してtwitter bootstrapのcssを組み込む
  2. javascriptのイベントをandroid側で実行

です

手順

プロジェクトを作成

f:id:m_shige1979:20160604070801p:plain
※ブランクアクティビティでいいかと

app直下にassetsディレクトリを作成してtest.htmlやtwitterbootstrapのcssなどを配置

f:id:m_shige1979:20160604070901p:plain

buildファイルを修正

app/build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "jp.mshige1979.app.samplelocalhtml1"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        debug {
            debuggable true
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    sourceSets{
        main{
            assets.srcDirs = ["assets"]
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:22.2.1'
}

※sourceSetsを追加してassetsディレクトリを指定しておく

MainActivityを修正
package jp.mshige1979.app.samplelocalhtml1;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.webkit.JavascriptInterface;
import android.webkit.WebView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Webbiewを生成
        WebView oWebView = new WebView(getApplicationContext());

        // javascriptを有効にする
        oWebView.getSettings().setJavaScriptEnabled(true);

        // ローカルのhtmlを読み込む
        oWebView.loadUrl("file:///android_asset/test.html");

        // コールバック用クラスを定義
        class MyJavaScriptInterface {
            /**
             * アラートを表示します。
             *
             * @param message メッセージ。
             */
            @JavascriptInterface
            public void showAlert( String message ) {
                // アラート表示処理 ...
                Log.d("test", "hogehoge start");

                Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();

                Log.d("test", "hogehoge end");
            }
        }
        MyJavaScriptInterface obj = new MyJavaScriptInterface();
        oWebView.addJavascriptInterface(obj, "appJsInterface" );

        // ビューを設定する
        setContentView(oWebView);
    }
}
app/assets/test.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Bootstrap 101 Template</title>
    <link href="css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
    <h1>Twitter Bootstrap Sample</h1>
    <button type="button" class="btn btn-primary" id="btn1">btn1</button>
</div>
<script src="js/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script>
    $(function(){
        $("#btn1").on("click", function(){
            appJsInterface.showAlert(String((new Date())));
        });
    });
</script>
</body>
</html>

※appJsInterface.showAlert(String((new Date())));でJavaで定義したメソッドを呼び出せる

実行

f:id:m_shige1979:20160604071506p:plain

所感

javaで実装したい部分もあったりする場合はこんな感じでhtmlの処理をjavaで検知できるのはいいかも
cordovaでプラグインを使って行うのとまあ同じ感じはするけど…

JavaEEでRestfulを使って見る

Java JavaEE JavaEE7

Restful

WebサービスAPIのやつでURLにパラメータを付与してXMLjsonを返すやつです

環境

Netbeans8.1

プロジェクトを作成

mavenで作成

f:id:m_shige1979:20160602065847p:plain

f:id:m_shige1979:20160602065907p:plain

f:id:m_shige1979:20160602065922p:plain

pom.xmlを修正
    <dependencies>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

※「javaee-web-api」→「javaee-api」に変更する

再ビルド

f:id:m_shige1979:20160602070237p:plain

サンプル

SampleRest.java
package com.mycompany.restful01;


import javax.ws.rs.ApplicationPath;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Application;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 */
@Path("/MyRest")
@ApplicationPath("/resources")
public class SampleRest extends Application{
    
    // http://localhost:8080/Restful01/resources/MyRest/hello
    @GET
    @Path("/hello")
    public String say(){
        return "hello,world";
    }
    
}

※パッケージは必ず指定しないとうまく動作しない感じです

f:id:m_shige1979:20160602072351p:plain

パラメータ指定

SampleRest2.java
package com.mycompany.restful01;


import javax.ws.rs.ApplicationPath;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Response;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 */
@Path("/MyRest")
@ApplicationPath("/resources")
public class SampleRest2 extends Application{
    
    @GET
    @Path("/echo")
    public Response message(@QueryParam("message") String msg){
        return Response.ok("msg = [" + msg + "]").build();
    }
    
}


f:id:m_shige1979:20160602073201p:plain

json/xml

User.java
package com.mycompany.restful01;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class User {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
    private String email;

    public User(){
    }
    public User(String name, String email) {
        super();
        this.name = name;
        this.email = email;
    }
    
    
}
SampleRest3.java
package com.mycompany.restful01;


import javax.ws.rs.ApplicationPath;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.MediaType;

/**
 */
@Path("/MyRest")
@ApplicationPath("/resources")
public class SampleRest3 extends Application{
    
    @GET
    @Path("/user.xml")
    @Produces({MediaType.APPLICATION_XML})
    public User getUserXml(){
        return new User("hoge", "hoge1@test.com");
    }
    
    @GET
    @Path("/user.json")
    @Produces({MediaType.APPLICATION_JSON})
    public User getUserJson(){
        return new User("hoge", "hoge1@test.com");
    }
    
}


f:id:m_shige1979:20160602074813p:plain

とりあえずここまで
1つのメソッドでjsonxmlを変えたかったけどあとで調べる

所感

結果を返すだけなら意外と簡単な感じ。
CDIなどを使っていないのでなんとも言えないが他の機能と同関連できるか調査することも必要

JavaEEのサンプルアプリをCentOSに入れてみる

Java JavaEE JavaEE7

公開前の予行演習

実際にどうするかはわからないけどNetBeansで作成だけというのも変なので
ちょっとwarファイルをあげてみる

環境

vagrantのCentOS6.7
Java8
glassfish4.1

Vagrantの設定ファイル

Vagrantfile
#-*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
 # Every Vagrant development environment requires a box. You can search for
 # boxes at https://atlas.hashicorp.com/search.
 config.vm.box = "centos67_01"

 # Create a private network, which allows host-only access to the machine
 # using a specific IP.
 config.vm.network "private_network", ip: "192.168.33.10"

 # Share an additional folder to the guest VM. The first argument is
 # the path on the host to the actual folder. The second argument is
 # the path on the guest to mount the folder. And the optional third
 # argument is a set of non-required options.
 config.vm.synced_folder "./", "/vagrant", \
       create: true, owner: 'vagrant', group: 'vagrant', \
       mount_options: ['dmode=777,fmode=777']

 # Provider-specific configuration so you can fine-tune various
 # backing providers for Vagrant. These expose provider-specific options.
 # Example for VirtualBox:
 #
 config.vm.provider "virtualbox" do |vb|
   # Customize the amount of memory on the VM:
   vb.memory = "1024"
 end

end

ツールインストール

Java8
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u91-b14/jdk-8u91-linux-x64.rpm
sudo rpm -ivh jdk-8u91-linux-x64.rpm
Glassfish4.1
wget http://download.java.net/glassfish/4.1/release/glassfish-4.1.zip
unzip glassfish-4.1.zip
sudo mv glassfish4 /usr/local/.
apache
sudo yum install httpd httpd-devel -y
sudo service httpd start
sudo chkconfig httpd on

glassfish設定

glassfishlocalhost以外で使用する場合はちょっと制限がある

起動
sudo /usr/local/glassfish4/bin/asadmin start-domain
管理者パスワード変更
$ sudo /usr/local/glassfish4/bin/asadmin change-admin-password
Enter admin user name [default: admin]>
Enter the admin password>
Enter the new admin password>
Enter the new admin password again>
Command change-admin-password executed successfully.
$

※ユーザーは"admin"、パスワードは空文字になっているのでそれ以降のところにパスワードを設定する

ログインストアにパスワードを登録
$ sudo /usr/local/glassfish4/bin/asadmin login
Enter admin user name [Enter to accept default]> admin
Enter admin password>
Login information relevant to admin user name [admin] for host [localhost] and admin port [4848] stored at [/root/.gfclient/pass] successfully.
Make sure that this file remains protected. Information stored in this file will be used by administration commands to manage associated domain.
Command login executed successfully.
$

※管理者パスワードと同じものにする

SSLを有効化
$ sudo /usr/local/glassfish4/bin/asadmin enable-secure-admin
You must restart all running servers for the change in secure admin to take effect.
Command enable-secure-admin executed successfully.
$
glassfish再起動
$ sudo /usr/local/glassfish4/bin/asadmin stop-domain
Waiting for the domain to stop .
Command stop-domain executed successfully.
[vagrant@localhost ~]$ sudo /usr/local/glassfish4/bin/asadmin start-domain
Waiting for domain1 to start .....
Successfully started the domain : domain1
domain  Location: /usr/local/glassfish4/glassfish/domains/domain1
Log File: /usr/local/glassfish4/glassfish/domains/domain1/logs/server.log
Admin Port: 4848
Command start-domain executed successfully.
$

JavaDB制御

/usr/java/jdk1.8.0_91/jre/lib/security/java.policy
grant {
        // 追加
        permission java.net.SocketPermission "localhost:1527", "listen,resolve";
};

※最後の方に追加する

JavaDB起動
sudo /usr/local/glassfish4/bin/asadmin start-database
データベース作成
$ /usr/local/glassfish4/javadb/bin/ij
ijバージョン10.10
ij> connect 'jdbc:derby://localhost/MemoDB;create=true';
ij> create table memo(
>   id int not null generated always as identity ( start with 1, increment by 1),
>   memo varchar(512),
>   constraint pk_memo primary key(id)
> );
0行が挿入/更新/削除されました
ij> select * from memo;
ID         |MEMO
--------------------------------------------------------------------------------------------------------------------------------------------

0行が選択されました
ij> exit;
$

デプロイ

アプリケーションを指定してデプロイする

f:id:m_shige1979:20160601210839p:plain

warをアップロード

f:id:m_shige1979:20160601211011p:plain

パラメータ設定

f:id:m_shige1979:20160601211226p:plain

プロキシ設定

/etc/httpd/conf/httpd.conf
<IfModule mod_proxy.c>
ProxyRequests Off
<Proxy *>
    Order deny,allow
    Allow from all
</Proxy>
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
ProxyPassReverseCookieDomain 127.0.0.1:8080 192.168.33.10
ProxyPassReverseCookiePath / /
</IfModule>

※末尾に追加

再起動
sudo service httpd restart

確認

f:id:m_shige1979:20160601211901p:plain

所感

とりあえずこんな感じで対応する。
http://ほげほげ/の場合の画面をどうするか考えないといけない
なかなか設定サンプルがないのでいろいろ探して考えてみる

JavaEE7でJavaMailを試す

Java JavaEE JavaEE7 メール

環境

NetBeans8.1
Glassfish4.1

問題点

Glassfish4.1.1ではなぜかglassfishのメールセッションの設定ができない

参考

www.youtube.com
※英語でも動画で作業をなぞるとできるもんです

画面設定

index.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form prependId="false">
            <h:commandButton value="送信" action="#{mailBean.send()}"></h:commandButton>
        </h:form>
    </h:body>
</html>
MailBean.java
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package bean;

import javax.annotation.Resource;
import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
 *
 */
@Named(value = "mailBean")
@RequestScoped
public class MailBean {

    @Resource(name="mail/gmail")
    private Session session;
    
    public void send(){
        Message msg = new MimeMessage(session);
        
        try{
            msg.setSubject("aaaaa");
            msg.setText("aaaaaaa");
            msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("送信先のメールアドレス@gmail.com"));
            
            Transport.send(msg);
            
        } catch(MessagingException e){
            e.printStackTrace();
        }
    }
     
}

glashfish設定

f:id:m_shige1979:20160529220519p:plain
f:id:m_shige1979:20160529220529p:plain
f:id:m_shige1979:20160529220538p:plain

ここまで

所感

Javaの場合は最新の技術というより保守に向けてのやり方の方が安定しているので
あまり最新のことに凝った情報が見つけきれない感じがする。
あったと思ってもちょっとコアすぎでで???って状態があるので
自分がつまづいている部分が本来ありえない場所だからかな…

JavaEEでのサンプルとしてメモアプリを作成してみた

Java JavaEE JavaEE7

Javaでの開発は基本的にはほとんどない

ちょっとやってみた

開発環境

Mac
Java Version8
NetBeans8.1

参考情報

Javaエンジニア養成読本 [現場で役立つ最新知識、満載!] (Software Design plus)

Javaエンジニア養成読本 [現場で役立つ最新知識、満載!] (Software Design plus)

※mevenでのチュートリアルをやってみたけどエラー出まくったので作成方法は変えてある

できたもの

https://github.com/mshige1979/javaee_memoapp
※ちょっとこれじゃない感あるけど

デモ


プロジェクトを作成

f:id:m_shige1979:20160528162930p:plain
f:id:m_shige1979:20160528162938p:plain
f:id:m_shige1979:20160528162945p:plain
f:id:m_shige1979:20160528162951p:plain
f:id:m_shige1979:20160528163001p:plain
f:id:m_shige1979:20160528163008p:plain
f:id:m_shige1979:20160528163014p:plain

ソースコード

githubをみてください
基本的には同じ感じ

問題点・所感など

なんかビルドしても前のものが残ってたりして動かないことが多かった。
一度、glashfishを再起動したり、netbeansを再起動とかすると動くので結構解決しか感じがない。
flashオブジェクトのデータの生成やaction時の挙動などPHPと違ってなかなか手軽に実行できないのがネックかもしれない。

参考

わかりやすいJavaEEウェブシステム入門

わかりやすいJavaEEウェブシステム入門

Java EE 7徹底入門 標準Javaフレームワークによる高信頼性Webシステムの構築

Java EE 7徹底入門 標準Javaフレームワークによる高信頼性Webシステムの構築

HTMLやcssの情報はリソースファイルはどうするくらいでちょうど良かった気がする

デバッグでどうすんだろ?

途中で変数などを確認したいけどダンプの取り方がわからん。なんかログ出力のやつでもあるのかな…