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

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

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

なんとなく作ったサイト

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


Github(注意すること)

https://github.com/mshige1979

java8のLocalDateとLocalTimeを触ってみた

Java 備忘録

Java8から導入された機能

日付制御ではDateやCalendarなどを使用していたがSE8より導入された

サンプルコード

Main.java
import java.time.*;

public class Main {

    public static void main(String[] args) {
        System.out.println("Hello World!");

        // 現在日付
        LocalDate ld = LocalDate.now();
        System.out.println(ld);

        // 日付を指定
        LocalDate ld2 = LocalDate.of(2011, 04, 28);
        System.out.println(ld2);

        // 文字列をパースして日付を設定
        LocalDate ld3 = LocalDate.parse("2014-06-23");
        System.out.println(ld3);

        // 現在年の1月1日
        LocalDate ld4 = LocalDate.now()
                .withMonth(1)
                .withDayOfMonth(1);
        System.out.println(ld4);

        // 前月の末日
        LocalDate ld5 = LocalDate.now()
                .withDayOfMonth(1)
                .minusDays(1);
        System.out.println(ld5);

        // 翌日の月初
        LocalDate ld6 = LocalDate.now()
                .plusMonths(1)
                .withDayOfMonth(1);
        System.out.println(ld6);

        // 現在日時
        LocalTime lt = LocalTime.now();
        System.out.println(lt);

        // 時刻を指定
        LocalTime lt2 = LocalTime.of(10, 34, 45);
        System.out.println(lt2);

        // 文字列をパースして時刻を設定
        LocalTime lt3 = LocalTime.parse("23:44:12");
        System.out.println(lt3);

        // 現在日時の0分0秒
        LocalTime lt4  = LocalTime.now()
                .withMinute(0)
                .withSecond(0)
                .withNano(0);
        System.out.println(lt4);

        // 現在時刻の10時間語
        LocalTime lt5 = LocalTime.now()
                .plusHours(10);
        System.out.println(lt5);

        // 現在時刻の7200秒前
        LocalTime lt6 = LocalTime.now()
                .minusSeconds(7200);
        System.out.println(lt6);

        // 現在日時
        LocalDateTime ldt1 = LocalDateTime.now();
        System.out.println(ldt1);

        // 日時を指定
        LocalDateTime ldt2 = LocalDateTime.of(2012, 10, 30, 03, 50, 12);
        System.out.println(ldt2);

        // 文字列で日時を設定
        LocalDateTime ldt3 = LocalDateTime.parse("2013-10-12T16:04:23");
        System.out.println(ldt3);

        // 現在年の1月1日0時0分
        LocalDateTime ldt4 = LocalDateTime.now()
                .withMonth(1)
                .withDayOfMonth(1)
                .withHour(0)
                .withMinute(0)
                .withSecond(0)
                .withNano(0);
        System.out.println(ldt4);

        // 前年
        LocalDateTime ldt5 = LocalDateTime.now()
                .withMonth(1)
                .withDayOfMonth(1)
                .withHour(0)
                .withMinute(0)
                .withSecond(0)
                .withNano(0)
                .minusNanos(1);
        System.out.println(ldt5);


    }
}

Hello World!
2016-09-24
2011-04-28
2014-06-23
2016-01-01
2016-08-31
2016-10-01
15:22:37.758
10:34:45
23:44:12
15:00
01:22:37.758
13:22:37.758
2016-09-24T15:22:37.758
2012-10-30T03:50:12
2013-10-12T16:04:23
2016-01-01T00:00
2015-12-31T23:59:59.999999999

所感

イミュータブルにしたのでメソッドチェインできるのでちょっとどの変数にどの結果が入っているかが
わかりやすくなった。
単純な日時の制御なら楽にできると思われる
時差などを制御するものもあるのでそれも近いうちちょっと触ってみる

php5.6にvldをインストールして試す

php 備忘録

これ

PHPはどのように動くのか ~PHPコアから読み解く仕組みと定石

PHPはどのように動くのか ~PHPコアから読み解く仕組みと定石

少しずつ読んでるけどオペコードのくだりがいまいち理解できないので実際に実行して試して見る。

環境

ホスト

vagrant

OS

CentOS6.8

php

php5.6
※php7系でのvldインストールはコンパイルエラーになる

インストール

phpのためのリポジトリ
sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
sudo rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm
phpインストール
sudo yum install  \
  php56w php56w-bcmath php56w-cli php56w-common \
  php56w-dba php56w-devel php56w-embedded php56w-enchant \
  php56w-fpm php56w-gd php56w-imap php56w-interbase php56w-intl \
  php56w-ldap php56w-mbstring php56w-mcrypt php56w-mssql php56w-mysqlnd \
  php56w-odbc php56w-opcache php56w-pdo php56w-pear php56w-pecl-apcu \
  php56w-pecl-gearman php56w-pecl-geoip php56w-pecl-imagick php56w-pecl-memcache \
  php56w-pecl-xdebug php56w-pgsql php56w-phpdbg php56w-process \
  php56w-pspell php56w-recode php56w-snmp php56w-soap php56w-tidy \
  php56w-xml php56w-xmlrpc
  
vldインストール
sudo pecl install channel://pecl.php.net/vld-0.13.0

Build process completed successfully
Installing '/usr/lib64/php/modules/vld.so'
install ok: channel://pecl.php.net/vld-0.13.0
configuration option "php_ini" is not set to php.ini location
You should add "extension=vld.so" to php.ini
php.iniにモジュールを追加
sudo vi /etc/php.ini
----
; vld
extension=vld.so
----

実行1

sample1.php
<?php
echo "hello, world";
sample1を実行
$ php -d vld.active=1 -d vld.execute=0 sample1.php
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = -2
filename:       /home/vagrant/sample1.php
function name:  (null)
number of ops:  3
compiled vars:  none
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   2     0  E >   EXT_STMT
         1        ECHO                                                     'hello%2C+world'
   4     2      > RETURN                                                   1

branch: #  0; line:     2-    4; sop:     0; eop:     2; out1:  -2
path #1: 0,
$

実行2

sample2.php
<?php
$aaa = 10;
echo $aaa;

$aaa .= "ccc";
print $aaa;

$bbb = [111, 222, 333];
echo $bbb[0];
echo $bbb[1];
echo $bbb[2];
sample2を実行
$ php -d vld.active=1 -d vld.execute=0 sample2.php
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = -2
filename:       /home/vagrant/sample2.php
function name:  (null)
number of ops:  24
compiled vars:  !0 = $aaa, !1 = $bbb
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   2     0  E >   EXT_STMT
         1        ASSIGN                                                   !0, 10
   3     2        EXT_STMT
         3        ECHO                                                     !0
   5     4        EXT_STMT
         5        ASSIGN_CONCAT                                 0          !0, 'ccc'
   6     6        EXT_STMT
         7        PRINT                                            ~2      !0
         8        FREE                                                     ~2
   8     9        EXT_STMT
        10        INIT_ARRAY                                       ~3      111
        11        ADD_ARRAY_ELEMENT                                ~3      222
        12        ADD_ARRAY_ELEMENT                                ~3      333
        13        ASSIGN                                                   !1, ~3
   9    14        EXT_STMT
        15        FETCH_DIM_R                                      $5      !1, 0
        16        ECHO                                                     $5
  10    17        EXT_STMT
        18        FETCH_DIM_R                                      $6      !1, 1
        19        ECHO                                                     $6
  11    20        EXT_STMT
        21        FETCH_DIM_R                                      $7      !1, 2
        22        ECHO                                                     $7
  13    23      > RETURN                                                   1

branch: #  0; line:     2-   13; sop:     0; eop:    23; out1:  -2
path #1: 0,
$

所感

そこまで厳密に理解する気はないけどあったら便利かもくらいは理解しておきたい。
最近はもうパフォーマンスが上がってきているのでそこまで気にすることはないような気もするので

centos6.8にphp7をyumでインストールする

php php7 備忘録

phpenvなどもありますけど

あれコンパイルなどが必要で時間がかかるのでサクッとphpを入れて使いたい場合はyumでインストールしたい

環境

ホスト

vagrant

OS

CentOS6.8

インストール

リポジトリ
sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
sudo rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm

リポジトリを設定する

yum
sudo yum install php70w php70w-bcmath php70w-cli php70w-common \
  php70w-dba php70w-devel php70w-embedded php70w-enchant \
  php70w-fpm php70w-gd php70w-imap php70w-interbase php70w-intl \
  php70w-ldap php70w-mbstring php70w-mcrypt \
  php70w-mysqlnd php70w-odbc php70w-opcache php70w-pdo \
  php70w-pdo_dblib php70w-pear php70w-pecl-apcu php70w-pecl-imagick \
  php70w-pecl-redis php70w-pecl-xdebug php70w-pgsql php70w-phpdbg \
  php70w-process php70w-pspell php70w-recode php70w-snmp php70w-soap \
  php70w-tidy php70w-xml php70w-xmlrpc

※とりあえず必要そうなものを調べるの面倒なんでいれられそうなやつ全部

結果

$ php -v
PHP 7.0.10 (cli) (built: Aug 20 2016 08:13:48) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
$

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などを使っていないのでなんとも言えないが他の機能と同関連できるか調査することも必要