さっしーの技術関連備忘録

技術的な内容を忘れないようにメモ....

SpringBootでアプリケーション起動時と停止時に処理を行う方法

Webアプリを開発している際に、アプリ起動時と停止時になんらかしらの処理を入れたいと思うときがあります。(たとえば、DBのコネクションを破棄したりなど。。。)
 
今回はSpringBootを使用してこれを実現するやり方をまとめました。
 
んで、やり方としては複数パターンあるのですが、
今回はSpringらしく?アノテーションを使用して実現したものを載せます。
 
以下にざっくりですが記述がありますので参考にさせていただきます。
 
まずは、起動時と停止時に呼ばれる処理を管理するためのクラスを作ります。
 
以下に記載されている@PostConstructと@PreDestroyを付与したメソッドの呼び出しタイミングはSpringBootにてBeanの作成後と破棄前管理しているのでクラス名は BeanLifeCycleとでもしておきます。
 
BeanLifeCycle.java
package sample;
 
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
 
import org.springframework.cassandra.config.CassandraCqlClusterFactoryBean;
import org.springframework.cassandra.config.CassandraCqlSessionFactoryBean;
import org.springframework.stereotype.Component;
 
/**
 * アプリケーションのBeanライフサイクルを管理する
 *
 * @author saiki-y
 *
 */
@Component
public class BeanLifeCycle {
 
     /**
     * Beanコンテキスト生成後に呼び出される
     */
     @PostConstruct
     public void initAfterStartup() {
 
          //起動時の処理を記述
          System.out.println("initAfterStartup ");
     }
 
     /**
     * Beanコンテキスト破棄前に呼び出される
     */
     @PreDestroy
     public void cleanupBeforeExit() {
 
          //停止時の処理を記述
          System.out.println(" cleanupBeforeExit ");
     }
 
}
 
作成したコンポーネントをあとはConfigurationクラスに定義すれば完成です。
 
AppConfig.java
@Configuration
public class AppConfig extends WebMvcConfigurerAdapter {
 
     ・・・省略
 
     /**
     * Beanライフサイクル管理インスタンスをアプリケーション起動時にシングルトン生成
     *
     * @return BeanLifeCycle
     */
     @Bean
     public RpBeanLifeCycle BeanLifeCycle() {
 
          return new BeanLifeCycle();
 
     }
}
 
これでWebアプリケーションの起動時にinitAfterStartupメソッド、停止時にcleanupBeforeExitメソッドが呼ばれるようになります。
 
以上

Hyper-vについて調べてみた

今まで仮想化ソフトはVirtualBoxを使用していました。
 
しかし、仕事でHyper-vで仮想環境を構築することになったので、
改めて仮想化とは何かというところから簡単に調査を行ってみました。
 
 
1. 仮想化とは
 
  1台のサーバを複数台のサーバであるかのように論理的に分割できる技術です。
  仮想化には、大きく分けて「ホストOS型」「コンテナ型」「ハイパーバイザ型」が存在します。
  Hyper-vはその中で「ハイパーバイザ型」の仮想化ソフトウェアです。
  VirtualBoxはホストOS型に当たりますね。
 
  通常のサーバーと各仮想化した「ホストOS型」「コンテナ型」「ハイパーバイザ型」のイメージ図としては以下が参考になると思います。

f:id:y_saiki:20170921150837j:plain

 
 
  1-1.「ホストOS型」
 
  PCに仮想化専用のソフトをインストールし、その専用ソフト上にOSをインストールして仮想マシンを稼働させる方式です。
  ハードへのアクセスはホストOSを経由しなく手はならないため、オーバーヘッドがかかりレスポンス性能が高くありません。
 
  1-2.「コンテナ型」
 
  自身の端末上に複数のコンテナを作成して、その中でアプリケーションを動作させる環境を構築します。
  通常の仮想マシンでは個々にOSをインストールして動作させる必要がありますが、
  コンテナ型は1つのOSで複数の環境を構築することができます。
 
  1-3.「ハイパーバイザ型」
 
  ホストOS型の処理性能を補うため、
  ハードウェアへ直接仮想化ソフトウェアをインストールするため、レスポンス性能はホストOS型と比べて高いです。
 
2. Hyper-vとは
 
  Hyper-vは上記に記載した「ハイパーバイザ型」でWindowsの仮想化技術になります。
 
  2-1. 特徴
 
  •   仮想化アプリケーションソフトを間に挟まないため、オーバーヘッドが少なくレスポンス性能が高い。
  •   Windowsに組み込まれているものなのでインストールせずに、Hyper-vの有効化を行うことですぐに利用できる。
 
  2-2. メリット
 
  •   Windowsに組み込まれているものなので導入コストが低く運用担当者も操作しやすい。
  •   また、導入コストが低いため中小企業でも導入しやすい。
  •   Microsoftの仮想化技術のため、バージョンアップも頻繁に行われており安定性がある。
 
  2-3. デメリット
 
  •   既存ホストOSをそのまま利用できなかったり、専用サーバーを用意する必要があったりするためホストOS型と比べると導入にコストがかかることがあります。

Xamp + PHP + knockout.jsでデータバインディングを試してみた。

 
環境
・windows7 32bit
xampp( php 5.2.0 + apache 2.4 )
jQuery 3.2.1
knockout.js 3.4.2
 
前提条件
・xamppインストール済み
・xampp設定済み( php と apache が使用できること
 
概要
入力ボックスにテキストを入力して、「実行」ボタンを押下すると「Hello!!! ○○○」という文字列を画面上に表示するサンプルプログラムです。
内部の流れとしては、PHPで作成したWebAPIにAjaxでリクエストを投げて、受け取ったJSONのレスポンスをknockout.jsで定義したViewModelに設定します。
このViewModelに値を設定するだけで定義したとおりにknockout.jsが自動でレンダリングしてくれます。
この仕組を利用することで、ViewとLogicを分離させることが可能です。
 
内部構成
/project
      |---/index.html
     │
      |---/api
      |       |---/sample.php
     │
      |---/js
            |---/knockout-3.4.2.js
            |---/sample.js
 
 
ソースコード
 
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<!-- JQuery CDN : https://code.jquery.com/ -->
integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
crossorigin="anonymous"></script>
<script src="./js/knockout-3.4.2.js"></script>
<script src="./js/sample.js"></script>
</head>
<body>
<h1 data-bind="text: message"></h1>
<input id="field_name" type="text" value="">
<button id="exec_button">実行</button>
</body>
</html>
 
 
sample.php
<?php
 
//以下のURLでアクセス
 
parse_str($_SERVER['QUERY_STRING'], $query_string_arry);
 
$name = $query_string_arry["name"];
 
$response = array(
     'code' => '200',
     'message' => 'OK!',
     'name' => $name
);
 
echo json_encode($response);
 
?>
 
 
sample.js
$(function() {
 
     function UserNameModel() {
 
     var self = this;
 
     self.name = ko.observable("");
 
     self.message = ko.observable("");
 
     self.exec = function() {
 
          console.log("クリックされました");
 
          var name = self.name();
 
$.ajax({
     'type' : 'GET',
     'url' : 'api/sample.php',
     'dataType' : 'json',
     'data' : {
     'name' : name
},
'success' : function(data) {
 
     console.log("code : " + data["code"]);
     console.log("message : " + data["message"]);
     console.log("name : " + data["name"]);
 
     message = "Hello!!! " + data["name"];
     self.message(message);
},
'error' : function(XMLHttpRequest, textStatus, errorThrown) {
 
     console.log("エラーが発生しました。");
 
}});
}
};
 
$(document).ready(function() {
 
     ko.applyBindings(new UserNameModel());
 
});
 
})
 

vagrantにpython2.7系をインストールしてFlaskの開発環境を構築する

今回はVagrantを用意して、その中にFlaskアプリケーションの開発閑居を作成してこうと思います。
 
以下すべてroot権限で実施
 
1.pipのインストール
 
 
 
2.virtualenvとvirtualenvwrapperのインストール
 
$ pip install virtualenv virtualenvwrapper
 
 
2-1.virtualenv用のディレクトリを作成
 
※今回はvagrantの共有フォルダ内に作成
$ mkdir flask
 
 
2-2.virtualenvの作成
 
$ virtualenv --no-site-packages flask
 
2-3.virtualenvの起動方法と停止方法
 
起動
$ source bin/activate
 
停止
$ deactivate
 
あとは、仮想環境の中にプロジェクトを作成する。
 
3.mod_wsgiのインストール
 
$yum install mod_wsgi
 
3-1.mod_wsgi.soの場所
 
/etc/httpd/modules
 
 
3-2.wsgiファイルの作成
 
/vagrant/project/flask/app
(flask) [vagrant@localhost app]$ ls
app.wsgi  main.py  templates
 
 
3-3.wsgiファイルの中身
 
/vagrant/project/flask/app/app.wsgi
# -*- coding:utf-8 -*-
 
import sys, os
import logging
 
# apacheのログに出すために必要
logging.basicConfig(stream = sys.stderr)
sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))
from main import app as application
 
3-4.起動ファイルの中身
 
/vagrant/project/flask/app/main.py 
import os
from flask import Flask, render_template
from jinja2 import FileSystemLoader
 
app = Flask(__name__)
app.jinja_loader = FileSystemLoader(
    os.path.join(os.path.abspath(os.path.dirname(__file__)), 'templates')
)
 
@app.route("/")
def index():
    return render_template('index.html')
 
@app.route("/foo")
def foo():
    return "foo"
 
@app.route("/foo/bar")
def foo_bar():
    return "foobar"
 
if __name__ == "__main__":
    app.run(host='0.0.0.0')
 
 
3-5.htmlファイルの中身(今回はサンプルなので、、、)
 
/vagrant/project/flask/app/templates/index.html
hogehoge
 
3-6. ApacheのVirtualHostの設定ファイル
 
/etc/httpd/conf./flask.conf
## mod_wsgi
WSGIPythonHome /usr/bin/python2.7
WSGISocketPrefix /var/run/wsgi
 
<VirtualHost *:5000>
LoadModule wsgi_module /etc/httpd/modules/mod_wsgi.so
WSGIDaemonProcess app user=apache group=apache threads=5
WSGIScriptAlias /flask /vagrant/project/flask/app/app.wsgi
<Directory /vagrant/project/flask/app>
  Options +ExecCGI
  SetHandler wsgi-script
  AddHandler wsgi-script .wsgi
  Order deny,allow
  Allow from all
</Directory>
</VirtualHost>
 
4.Flaskアプリの起動
 
main.pyのあるディレクトリ内で下記のコマンドを叩く
 
$python main.py
 
 
0.Tips
 
.confの設定でapache側でエラーが出ている場合は、以下のコマンドでエラー詳細が確認できる。
 
http -t
 
 

Windows10でHyper-vをセットアップしてみた

今回現場でローカル環境で現行システムを動かすのに、
ローカルマシンに仮想環境を構築しました。
その際の仮想化ソフトとして、WindowsのProエディションに標準搭載されている
Hyper-vというソフトを使用して構築したため、そのセットアップ手順をまとめておきたいと思います。
 
環境
  windows10 Pro
 
手順
  1.Hyper-vの有効化
 
        ①PowerShellを管理者として実行する。
 
        ②以下のコマンドを実行して、hyper-vを有効化する。
       
$ Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
 
        ※コマンド終了後にOSの再起動が必要です。
 
  2.Hyper-vの内部スイッチ作成と、NAT作成
 
        ①PowerShellを管理者として実行する。
 
        ②以下のコマンドを実行して、内部スイッチを作成する。
       
$ New-VMSwitch -Name [スイッチの名前] -SwitchType Internal
 
 
        ③作成したスイッチの情報を確認する。
       
$ Get-NetAdapter | ft Name,ifIndex,InterfaceDescription,Status
 
 

出力例)

  +--------------------+---------+-----------------------------------------+------------+
  |Name                | ifIndex | InterfaceDescription                    | Status     |
  |--------------------+---------+-----------------------------------------+------------+
  |vEthernet (internal)| 22      | Hyper-V Virtual Ethernet Adapter #4     | Up         |
  +--------------------+---------+-----------------------------------------+------------+
 
 
        ④作成したスイッチのIPアドレスを設定する。
       
$ New-NetIPAddress -InterfaceIndex [③のifIndex] -AddressFamily IPv4 -IPAddress 192.168.1.1 -PrefixLength 24
 
 
        ⑤NATを作成する。
       
$ New-NetNat -Name VMNatNetwork -InternalIPInterfaceAddressPrefix 192.168.1.0/24
 
 
        ⑥PowerShellを終了する。
       
$ exit
 
 
  3.Hyper-vマネージャを起動
 
           Hyper-vの有効化を行うことで、Hyper-vマネージャアプリが追加されるのでHyper-vマネージャが起動可能になります。
 
 
以上
 

crontabの設定方法について

仕事でcronの設定情報を読む機会があったため、改めて起動や登録方法なども含め調べてみた。

 

まず初めにcronは、スクリプトを定期実行させるためのプロセス(デーモン)である。

 

読み方は「クーロン」。

 

起動&状態確認

 

cronが動いているかを確認する。
$ /etc/rc.d/init.d/crond status

 

もし起動していなかったら
$ /etc/rc.d/init.d/crond start

 

cronの登録

 

※外部ファイルにcron設定を行って読み込ませるやり方です。


$ crontab [外部ファイルのパス](例:hoge/hoge/cron.txt)


時間の書き方

 

【書式】

 

[分] [時] [日] [月] [曜日] [コマンド]

 

【サンプル】

 

30 7 * * * /home/hoge/homge.sh

 

【意味】

 

毎日7時30分に/home/hoge/homge.shを実行する。

 

※[曜日]の設定に関しては、「0、7」が日曜と解釈され、その他1から6までは順番に「月、火、水、木、金」と解釈されるそう。
※[コマンド]は絶対パス、相対パスのいずれかで指定可能。
※すべて「*」を指定した場合には毎分実行される。


以上

はてなブログ(無料)からProへ移行しました。

先ほど、はてなブログ(無料)からProへの移行が完了しました。

 

4月頃からブログを書き始めて、最近は業務が忙しく間隔が空いての更新になっておりました。

 

しかし、アクセス数などは順調に増えており、ここで更にやる気を高めるためにProへの移行を決断しました。

 

また、Proへの移行を持ちまして、当ブログ名は「ITエンジニアSAIの技術関連備忘録」から「さっしーの技術関連備忘録」へ改名致しました。

 

ちなみに、さっしーは職場で呼ばれている、あだ名です(笑

 

今後とも、当ブログをよろしくお願いいたします。

cocos2dxをMacに導入してみた

環境
     cocos2dx(3.15.1)
     macOS Sierra(10.12.5)
     xcode
     C++
    
手順
     
     1.公式サイトからcocos2dxをダウンロードする。
 
     公式サイト
 
     2.ダウンロード後、解凍を行い任意のフォルダへ配置する。
 
     3.ターミナルを開き、配置した「cocos2d-x-3.15.1」のフォルダの中に入り、以下のコマンドを叩く。
     
./setup.py
 
     4.セットアップ完了後、ターミナルを再起動すると、cocosコマンドが利用できるようになっています。
 
     5.任意の場所で以下のコマンドを使用してプロジェクトを作成します。
     
     以下コマンドのオプションはざっくりと以下になります。
     -p -> パッケージ名指定
     -l  -> プログラミング言語指定
     -d -> 保存先フォルダ名
     
cocos new sample -p cocos.sample.saiki-y -l cpp -d ~/cocos2dx_sample
 
     6.作成されたプロジェクトの中に入ると、「proj.ios_mac」があるので「[プロジェクト].xcodeproj」をクリックするとxcodeが起動して作成したプロジェクトがインポートされます。
 
     7.インポート後、アプリケーションを実行するとシミュレータが起ち上がり、cocosの画面が表示されます。
 
 
以上

Fuelphpでメール送信機能を実装する方法

1.環境

  Vagrant1.9.3(CentOS 7.1)
   PHP5.4
   Fuelphp1.7.3
 
 
2.導入方法

app/config/config.phpの下記箇所に `'email',` を追加する必要がある。
  /**************************************************************************/
  /* Always Load */
  /**************************************************************************/
  'always_load' => array(
       'packages' => array(
            ・・・省略
            'email',
       ),
  ),
 
 
3.おまけ

メール送信の処理
※参考程度に以下は自作関数で処理をまとめている
/**
* メール送信
* @param 宛先
* @param 送信者アドレス
* @param 件名
* @param 本文
* @return 送信結果 boolean
*/
  public static function sendMail($to, $from, $title, $body) {
 
       $email = Email::forge();
 
       // アドレスを指定
       $email->from($from);
       $email->to($to);
 
       // 表題を指定
       $email->subject($title);
 
       // 本文を指定
       $email->body($body);
 
       $result = $email->send();
 
       return $result;
  }
 

リモートリポジトリから特定のブランチを指定してcloneする方法

最近仕事の関係で、だいぶ更新が滞ってしまいました。
 
今回はメモ程度ですが、、、
gitにてクローンする際にブランチを指定しないとmasterブランチがクローンされてしまうので、
指定したブランチからクローンするやり方を調べました。
 
コマンドは至って簡単
 
gitコマンドのcloneに「-b」オプションを入れて {ブランチ名} を指定してあげればよいのですね。
 
git clone -b { ブランチ名 } { リポジトリのアドレス }
 
 
また、補足として
cloneする際にフォルダを指定したい場合は、
 
git clone -b { ブランチ名 } { リポジトリのアドレス } {フォルダ名}
 
とすればできます。
 
たとえば、
 
git clone -b { ブランチ名 } { リポジトリのアドレス } sample
 
ならば、sampleフォルダが作成されてその中にcloneされます。