yamashiro0110の日記

yamashiro0110の日記です。おもにIT技術のメモを綴っていきます(^o^)

PlayFrameworkインストールめも

f:id:yamashiro0110:20150320055919p:plain


Play2.3を対象にしてます

言語はJava


環境

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.10.1
BuildVersion:   14B25
$ java -version
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)

Activatorのインストール

ここからDL

今回は/Application以下に配置

以下のファイルにパスを通す

/Applications/activator-1.2.2-minimal/activator

プロジェクトを作成

プロジェクト用のディレクトリ作成&移動

mkdir /path/to/play && cd /path/to/play

プロジェクト作成

activator new

対話式で進んでいくので、質問に答えていけば問題なく作成されるはず 今回はplay-javaを選択


起動してみる

cd /path/to/play
activator run

初回実行だからか、ライブラリのDLが始まった 30分くらいかかった気がする・・・

ブラウザで以下のURLにアクセスしてみる

http://localhost:9000


参考

https://www.playframework.com/documentation/ja/2.3.x/Installing

CakePHPのインストールめも

f:id:yamashiro0110:20150119013230p:plain


CakePHPの環境構築のめも(ちょっとハマった・・・)

環境

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.10.1
BuildVersion:   14B25
Server version: Apache/2.4.9 (Unix)
Server built:   Sep  9 2014 14:48:20
CakePHP 2.6.1

インストール

CakePHPのダウンロード

Gitでclone

$ cd /path/to/CakePHP
$ git clone git://github.com/cakephp/cakephp.git

Apacheの設定

ここでドキュメント通りにやってもうまく行かなかったためCakePHP用に以下の設定を行う

  • ポートを10080に設定
Listen 127.0.0.1:10080

<VirtualHost 127.0.0.1:10080>
    # CakePHPを'git clone'したディレクトリの'app/webroot'を指定
    DocumentRoot    /path/to/CakePHP/cakephp/app/webroot
    ServerName      127.0.0.1:10080
    ServerAdmin     webmaster@host.example.com

    <IfModule php5_module>
        AddType application/x-httpd-php .php
    </IfModule>

    <IfModule dir_module>
        DirectoryIndex index.php
    </IfModule>

    # CakePHPの公開用ディレクトリ'app/webroot'を'/'にマッピング
    Alias / /path/to/CakePHP/cakephp/app/webroot/

    <Directory "/path/to/CakePHP/cakephp/app/webroot/">
        AllowOverride None
        Options All
        Require all granted
    </Directory>
</VirtualHost>

2015/01/27 追記

DocumentRootには、Cakeのapp/webrootを指定すること

コントローラを作成したときに、そのコントローラのURLにアクセスできなかったため

上記、設定後にApache再起動

以下のURLにアクセス

http://localhost:10080/

公式のチュートリアルだと、以下のように記述されていたのですが これだとリダイレクトループが発生するためエラーが発生していました

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule    ^$ app/webroot/    [L]
    RewriteRule    (.*) app/webroot/$1 [L]
</IfModule>

参考

URLリライティング — CakePHP Cookbook 2.x ドキュメント

配列のめも


助けてと頼まれたので、書きますφ(..)メモメモ

助けて先輩!俺のPHPの配列の組み直しは最適なのか確認したい - ITの隊長のブログ


環境

$ node -v
v0.10.25

コード

JavaScriptで書いてますが、言語特有の関数とか使ってないし PHPでも似たようなことは出来る(はず)という前提です(-_-;)


流れとしては、未登録の場合は新規追加、 そうでなければ登録済のものを取り出して値を追加としてます。

基本的には、そんな変わらない・・・

変更した点は、エンティティクラスを利用するようにした点ですかね。

table_03というカラムが、idに重複がある場合は配列になるようだったので、 最初からデータを配列で持つようにしました。

genreListという変数のこと。 文字列と配列が混合してしまうようなら、配列で統一したほうが扱いやすいかと思います


補足

あと、元のコードで気になった点が一つ

// 初回のみ$result_arrayは連想配列ではないため、比較するとエラーになる

// なので、配列が空であれば0なので、条件分岐でfalse(初回追加となる)

ループの回数に依存すると、バグの原因になりそうだったので↓のように修正してみました(間違ってたらサーセン

以下の部分

// for文から外に出すためにここで実行

// 整列した配列を格納したい変数です
$result_array = array();

// ****************************
// for文から外に出すためにここで実行

// 初回の追加
$empty_array = array();

array_walk_recursive($v, function(&$value, $key) use (&$empty_array) {
    $empty_array[$key] = $value;
});

array_push($result_array, $empty_array);
// ****************************

// $sql_dataには先程のsql結果のデータが入っています。
foreach($sql_data as $k => $v) {

    $tmp_array_save = array();
    array_walk_recursive($v, function(&$value, $key) use (&$tmp_array_save) {
        $tmp_array_save[$key] = $value;
    });

    // 返す配列にすでに存在しているかチェック
    $contents_id_array = Hash::extract($result_array, '{n}.contents_id');

    if (in_array($tmp_array_save['contents_id'], $contents_id_array)) {

        // 存在している場合は重複なので、追加
        // contents_idから逆引きして格納が必要な配列番号を探す
        $iterator = new RecursiveIteratorIterator(
            new RecursiveArrayIterator($result_array),
            RecursiveIteratorIterator::SELF_FIRST
        );

        // table03が追加される配列番号を格納する変数
        $add_index_number = '';
        foreach ($iterator as $iterate_key => $iterate_leaf) {
            if (is_array($iterate_leaf)) {
                $add_index_number = $iterate_key;
            }
        }

        // table03の値が重複していないかチェック、していなければ追加
        if (! in_array($tmp_array_save['table_03'], $result_array[$add_index_number])) {
            $tmp_tags_data = $result_array[$add_index_number]['table_03'];
            $result_array[$add_index_number]['table_03'] = array();
            array_push($result_array[$add_index_number]['table_03'],
            $tmp_array_save['table_03'],
            $tmp_tags_data);
        }
    }
    else {
        // 存在していない場合は新規追加
        array_push($result_array, $tmp_array_save);
    }
}

// 確認コード
dump($result_array);

H2の使い方めも


Javaで実装されてるデータベース、H2の使い方めも

H2データベースは、組み込みでもサーバモードでも動作するとのこと

今回は、組み込みで利用したときのめも

  • 環境
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.10.1
BuildVersion:   14B25

build.gradle

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'

group = 'h2'

repositories {
    mavenCentral()
}

dependencies {
    compile "com.h2database:h2:1.4.184"
    compile "commons-dbutils:commons-dbutils:1.6"
}

データベースの作成

jarファイルを実行する

$ java -jar ${PATH_TO_JAR}/h2-1.4.184.jar

自分の場合は、Gradleでビルド時にダウンロードされたjarを指定しました。 Windowsの場合はインストーラを実行する必要があるみたいです

ブラウザが立ち上がりログイン画面が表示されるので、テーブル作成を進める

この辺は以下の記事が参考になるかと思いますm(__)m


実際に使ってみる

ソースはGithubに・・・

気軽にJavaだけで、データベースを使えるので便利ですね(^o^)


参考にしましたm(__)m

H2 DB インストール・設定メモ

grunt-connect-proxyのめも

f:id:yamashiro0110:20141209015558p:plain


Gruntで起動したwebサーバにリバースプロキシの設定を追加するめも


プラグインのインストール

$ npm install grunt-connect-proxy --save-dev

設定追加

Gruntfile.jsに追加していく

モジュールの読込

connect:livereload:options:middlewareで読み込める場所に宣言する

var proxySnippet = require('grunt-connect-proxy/lib/utils').proxyRequest;

middlewareの部分に読み込んだモジュールを追加

  connect: {
    options: {
      port: 9000,
      open: true,
      livereload: 35729,
      // Change this to '0.0.0.0' to access the server from outside
      hostname: 'localhost'
    },
    livereload: {
      options: {
        middleware: function(connect) {
          return [
            // 追加
            proxySnippet,
            connect.static('.tmp'),
            connect().use('/bower_components', connect.static('./bower_components')),
            connect.static(config.app)
          ];
        }
      }
    },
    // ~省略~
  }

プロキシの設定を追加

オプションは下記を参照

https://github.com/drewzboto/grunt-connect-proxy#options

  connect: {
    options: {
      port: 9000,
      // change this to '0.0.0.0' to access the server from outside
      hostname: 'localhost'
    },
    proxies: [
      {
        // `localhost:9000/cortex`へのリクエストは`localhost:8080/cortex`へプロキシされるようになる
        context: '/cortex',
        host: 'localhost',
        port: 8080
      },
      // 試しに天気情報を公開しているAPIにプロキシしてみる
      {
        context: '/data/',
        host: 'api.openweathermap.org',
        port: '80'
      }
    ],
    // ~省略~
  }

serveタスクにconfigureProxiesを追加

  grunt.registerTask('serve', 'start the server and preview your app, --allow-remote for remote access', function (target) {
    if (grunt.option('allow-remote')) {
      grunt.config.set('connect.options.hostname', '0.0.0.0');
    }
    if (target === 'dist') {
      return grunt.task.run(['build', 'connect:dist:keepalive']);
    }

    grunt.task.run([
      'clean:server',
      'wiredep',
      'concurrent:server',
      // 追加
      'configureProxies',
      'autoprefixer',
      'connect:livereload',
      'watch'
    ]);
  });

実行

webサーバ起動

$ grunt serve

http://localhost:9000/data/2.5/weather?q=Okinawa,jpへアクセスしたら値が取得できる

実行結果

{
   "coord":{
      "lon":127.8,
      "lat":26.34
   },
   "sys":{
      "type":1,
      "id":7625,
      "message":0.0345,
      "country":"JP",
      "sunrise":1417989865,
      "sunset":1418027821
   },
   "weather":[
      {
         "id":500,
         "main":"Rain",
         "description":"light rain",
         "icon":"10n"
      },
      {
         "id":701,
         "main":"Mist",
         "description":"mist",
         "icon":"50n"
      }
   ],
   "base":"cmc stations",
   "main":{
      "temp":288.78,
      "pressure":1024,
      "humidity":100,
      "temp_min":288.15,
      "temp_max":290.15
   },
   "wind":{
      "speed":3.6,
      "deg":50
   },
   "clouds":{
      "all":1
   },
   "dt":1418055660,
   "id":1894616,
   "name":"Okinawa",
   "cod":200
}

参考にしましたm(__)m

webアプリ開発時の自動化めも(yeoman)

f:id:yamashiro0110:20141207201109p:plain


webのフロントエンド開発時の自動化(Yeoman)についてのメモ

webサーバはPCにApacheをインストールして使ってた

ディレクトリとか変えたらApacheの設定も変更が必要...(><)

MacOSのアップデート時にApacheもバージョンアップされて、これまでの設定が無効にorz

2.2 -> 2.4

ライブラリはダウンロードしてディレクトリに配置してた。。。

手動でやるのめんどい(-_-;)

管理もめんどい...

これからは自動化したい

Yeomanに変更後コマンドで出来るように!!


インストール

必要なもの

Node.jsはインストーラがあるのでそれを利用

Grunt, Bower, Yoは下記でインストール

$ sudo npm install -g  bower grunt-cli yo

Generatorをインストール。今回はwebapp

$ sudo npm install -g generator-webapp

インストールの詳細については下記を参考にさせてもらいましたm(__)m

http://dev.classmethod.jp/etc/yeoman/

http://www.topgate.co.jp/blog/76

http://www.atmarkit.co.jp/ait/articles/1407/02/news040.html


プロジェクトテンプレートを生成する

プロジェクト用のディレクトリを作成 & 移動

$ mkdir $DIR && cd $DIR

テンプレート生成実行

$ yo webapp

実行後のディレクトリ構成

$ ls -1a
.
..
.bowerrc
.editorconfig
.gitattributes
.gitignore
.jshintrc
.yo-rc.json
Gruntfile.js
app
bower.json
bower_components
node_modules
package.json
test

Gruntでサーバを立ち上げて確認する

$ grunt server

するとhttp://localhost:9000/でブラウザが立ち上がる

表示されているページはapp/index.html

試しにapp/index.htmlを編集すると、自動的に更新は反映される

livereloadという機能らしい(すげー)

Luceneめも

f:id:yamashiro0110:20141206105003p:plain


Luceneの使い方めも

lucene.apache.org

試したLuceneのバージョンは4.0.0

LuceneのインデックスをGUIで確認できるLukeが最新版に対応してないようなので・・・


build.gradle


インデックスの作成

IndexWriterDocumentを追加していく


インデックスの検索

インデックスを検索するためにQueryを使う

Queryはいろいろある

  • NumericRangeQuery

    • 数値フィールドの検索に使う
    • 1 ~ 10までとか、検索範囲の絞りこみができる
    • 最小値と最大値を検索結果に含めるかを指定できる
  • WildcardQuery

  • TermQuery

    • Termを検索
  • MatchAllDocsQuery

    • 全件取得
  • BooleanQuery

    • 条件一致検索

インデックスの更新

  • インデックス更新時は、IndexSearcherをリフレッシュする
    • インデックスの再読み込みはmaybeRefreshを実行
    • 今回はIndexSearcherSearcherManagerで管理してるのでSearcherManager#acquireメソッドIndexSearcherインスタンスを再取得

参考


次はSolrいってみたいな〜