Hatena::Groupprogram

ひとり開発日記。 このページをアンテナに追加 RSSフィード

2016/01/01 (Fri)

2016年に求められていること

| 2016年に求められていること - ひとり開発日記。 を含むブックマーク はてなブックマーク - 2016年に求められていること - ひとり開発日記。

2015年は、チーム開発に入っちゃったので、途中からあんま日記を書かなくなりましたね…。

以下は、中小企業/予算少ない、ちょっと硬めのドメイン領域の開発/運用改善で、これから意識しなくちゃいけないだろうなぁ、と言うところです。*1

モダンレガシー

こう言うの、多いんじゃないでしょうか。 ここら辺を、モダンに、スマートに再設計/再構築する必要がありますよね。*2

作らない開発

IaaS/PaaS/SaaSなんかは、普通に使うことになるでしょうね…。 と言うか、社内に閉じた運用ツール云々は、全部Google AppsとかAWS Lambda辺りに移行しても良いんじゃないでしょうか。

勿論、そういうクラウド/揮発性のリソースに、システム置くことを、エンジニアの思考の中心に置かなければいけないので、そういうパラダイムの変化についていけない人も出てくるかもですね…。

業務アプリUI/UX

そういう箇所に予算割けないのは、重々承知なんですが、これで、業務効率全然違ったりするので、専門家とのコネ作っておく必要あるんじゃないかな…。

*1:個人視点です

*2Seasar2サポート終わりますしね http://itpro.nikkeibp.co.jp/atcl/column/15/031800050/031800002/

トラックバック - http://program.g.hatena.ne.jp/halflite/20160101

2015/10/14 (Wed)

Vagrantで起動したCentOS6.7にMySQL5.6をAnsibleでインストール

| Vagrantで起動したCentOS6.7にMySQL5.6をAnsibleでインストール - ひとり開発日記。 を含むブックマーク はてなブックマーク - Vagrantで起動したCentOS6.7にMySQL5.6をAnsibleでインストール - ひとり開発日記。

VirtualBoxCentOSインスタンスを作って、Vagrantで起動し、それにMySQLインストールして、ローカル試験環境として使ってるのですが、誤って vagrant destroy してしまうこともありますよね…?*1

折角の仮想環境なので、すぐに作ったり壊したり出来たほうがいいよなぁ、と言うことで、手順をここに書いておきます。

方針
  1. ホストOSWindows7、ゲストOSはCentOS6.7
  2. VagrantVirtualBox を起動
  3. 仮想環境にSSHログイン
  4. Ansibleをインストール
  5. Ansible Playbookをコピー
  6. hosts設定
  7. AnsibleでMySQLインストール

お仕事でMacじゃなくてWindowsマシンの人、多いでしょう? で、WindowsにAnsible入れるのってのも無謀な気がしましたし。 試験環境として、MySQLだけ動けば良いわけですので、ベストプラクティス*2は無視して、一枚ペラのPlaybookをローカル実行、と言う方針で。

環境
VagrantVirtualBox を起動
  • Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.define :server_db do |node|
    node.vm.box = "box-cutter/centos67"
    node.vm.box_version = "2.0.5"
    node.vm.network :private_network, ip:"192.168.33.15"
  end

  config.vm.provider "virtualbox" do |v|
    v.gui = true
  end

end

Vagrantfileはこんな感じで。 boxは、Atlas上にあるミニマムCentOS環境 box-cutter/centos67 v2.0.5 を使い、固定IPは 192.168.33.15 で。

vagrant up

で起動します。

仮想環境にSSHログイン

仮想環境へSSHログインします*3 ユーザー:vagrant / パスワード:vagrantログインできます。

Ansibleをインストール
sudo yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo yum -y install ansible

ミニマム過ぎて、EPELリポジトリも入ってないので、まずEPELリポジトリインストール。 その後でAnsibleをインストールします

[vagrant@localhost ~]$ ansible --version
ansible 1.9.4
  configured module search path = None

この時点でのAnsibleのバージョンは 1.9.4

Ansible Playbookをコピー
  • playbook.yml
- hosts: all
  remote_user: vagrant
  sudo: yes

  tasks:
    - name: yum update all
      yum: name=* state=latest

    - name: install MySQL Yum Repository
      yum: name=https://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm state=present

    - name: install MySQL/MySQL-python/libselinux-python
      yum: name={{ item.name }} enablerepo={{ item.repo }} state=present
      with_items:
        - { name: "mysql-community-libs-compat", repo: "mysql56-community" }
        - { name: "mysql-community-client", repo: "mysql56-community" }
        - { name: "mysql-community-server", repo: "mysql56-community" }
        - { name: "MySQL-python", repo: "epel" }
        - { name: "libselinux-python", repo: "epel" }

    - name: add my.cnf character-set-server
      replace: dest=/etc/my.cnf regexp="^\[mysqld\]$" replace="[mysqld]\ncharacter-set-server=utf8"

    - name: start MySQL service
      service: name=mysqld enabled=yes state=started

    - name: add MySQL work user
      mysql_user: name=dbuser password=dbpassword1 host={{ item }} priv=*.*:ALL,GRANT state=present
      with_items:
        - "localhost"
        - "%"

vi等でコピー。*4

hosts設定
echo "127.0.0.1" | sudo tee /etc/ansible/hosts > /dev/null

/etc/ansible/hostsにローカルIPだけ設定*5

AnsibleでMySQLインストール
sudo ansible-playbook playbook.yml -c local

playbookが反映され、MySQLが起動されている(はずです)

*1:本日のワタクシがそうでした…

*2:Best Practices — Ansible Documentation http://docs.ansible.com/ansible/playbooks_best_practices.html

*3クライアントTeraTerm 等で https://osdn.jp/projects/ttssh2/

*4:本当はGitHubとかにコミットしておいて、git cloneで持ってくるのが良いのかもですけど

*5sudoリダイレクトが Permission denied になる件 | CUBE SUGAR STORAGE http://bit.ly/1VSAkPS

トラックバック - http://program.g.hatena.ne.jp/halflite/20151014

2015/10/01 (Thu)

EclipseLink/JPAのエンティティクラスから作成したDDLを、flywayでマイグレーション

| EclipseLink/JPAのエンティティクラスから作成したDDLを、flywayでマイグレーション - ひとり開発日記。 を含むブックマーク はてなブックマーク - EclipseLink/JPAのエンティティクラスから作成したDDLを、flywayでマイグレーション - ひとり開発日記。

EclipseLink/JPAのエンティティクラスから、CREATE TABLEのDDLを、Mavenで作成 - ひとり開発日記。 - プログラマの秘密のあれこれ の続きです。

DBマイグレーションツールflywayは、Mavenプラグイン形式でも提供されているので、別個インストールしなくても、pom.xmlに記述するだけで実行OKなんですね。

そして、結構面倒くさいConfiguration設定も、必要なだけ properties の中で flyway.*** 形式で記述するだけで良いのです。

    <properties>
        <flyway.url>jdbc:mysql://127.0.0.1:3306/testdb</flyway.url>
        <flyway.user>testuser</flyway.user>
        <flyway.password>testpassword</flyway.password>
        <flyway.locations>filesystem:${project.basedir}/db/migration</flyway.locations>
    </properties>

    <build>
        <plugins>
             <plugin>
                <groupId>org.flywaydb</groupId>
                <artifactId>flyway-maven-plugin</artifactId>
                <version>3.2.1</version>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.36</version>
                    </dependency>
                </dependencies>
            </plugin>
       </plugins>
    </puild>

JDBCURL、ユーザー、パスワードDBのドライバーは、それぞれ自分の環境に合わせて頂いて…。

mvn flyway:migrate

上記を実行すると、DDLDBに流し込まれて、各種テーブルが出来上がります。

トラックバック - http://program.g.hatena.ne.jp/halflite/20151001

2015/09/23 (Wed)

EclipseLink/JPAのエンティティクラスから、CREATE TABLEのDDLを、Mavenで作成

| EclipseLink/JPAのエンティティクラスから、CREATE TABLEのDDLを、Mavenで作成 - ひとり開発日記。 を含むブックマーク はてなブックマーク - EclipseLink/JPAのエンティティクラスから、CREATE TABLEのDDLを、Mavenで作成 - ひとり開発日記。

  1. JPA2.1形式のエンティティクラスを作成
  2. そのエンティティクラスから、CREATE TABLE文のDDLを自動作成
  3. DDLDBに流して、テーブル作成

上記のようなこと、早い話Seasar2でのS2JDBC-Genのようなことを、JPA2.1環境でやりたかったのですが、なかなか大変でした…。*1

結局、eclipselink-ddlgeneration-maven-pluginを使って、DDLを作成するのが簡単、と言うことに。

  • src/main/resources/META-INF/persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
	version="2.1">
	<persistence-unit name="testdb" transaction-type="RESOURCE_LOCAL">
		<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
		<exclude-unlisted-classes>false</exclude-unlisted-classes>

		<properties>
			<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
			<property name="javax.persistence.jdbc.url" value="jdbc:mysql://127.0.0.1:3306/testdb" />
			<property name="javax.persistence.jdbc.user" value="testuser" />
			<property name="javax.persistence.jdbc.password" value="testpassword" />

			<!-- Logging -->
			<property name="eclipselink.logging.level" value="INFO" />
			<property name="eclipselink.logging.timestamp" value="true" />
			<property name="eclipselink.logging.session" value="true" />
			<property name="eclipselink.logging.thread" value="true" />
			
			<!-- add semicolon -->
			<property name="eclipselink.ddlgen-terminate-statements" value="true" />
		</properties>
	</persistence-unit>
</persistence>

eclipselink.ddlgen-terminate-statements プロパティに true を設定しておくと、CREATE文の末尾に、セミコロンが付加され、一気にDDLが流せるようになるのです。*2

	<build>
		<plugins>
			...
			<plugin>
				<groupId>us.hornerscorners.mojo</groupId>
				<artifactId>eclipselink-ddlgeneration-maven-plugin</artifactId>
				<version>1.8</version>
				<configuration>
					<jdbcDriver>com.mysql.jdbc.Driver</jdbcDriver>
					<jdbcUrl>jdbc:mysql://127.0.0.1:3306/testdb</jdbcUrl>
					<jdbcUser>testuser</jdbcUser>
					<jdbcPassword>testpassword</jdbcPassword>
					<outputDir>db/migration</outputDir>
					<createFilename>V2__schema.sql</createFilename>
					<deleteFilename>drop-schema.sql</deleteFilename>
					<unitName>testdb</unitName>
				</configuration>
				<executions>
					<execution>
						<id>ddl-generation</id>
						<goals>
							<goal>execute</goal>
						</goals>
						<phase>process-classes</phase>
					</execution>
				</executions>
				<dependencies>
					<dependency>
						<groupId>mysql</groupId>
						<artifactId>mysql-connector-java</artifactId>
						<version>5.1.36</version>
					</dependency>
					<dependency>
						<groupId>org.eclipse.persistence</groupId>
						<artifactId>org.eclipse.persistence.jpa</artifactId>
						<version>2.6.0</version>
					</dependency>
				</dependencies>
			</plugin>
		</plugins>
	</build>

pom.xml に eclipselink-ddlgeneration-maven-plugin の設定を書きます。 ここで注意して欲しいのが、プラグイン内の依存関係に、EclipseLinkの2.6.0を指定しないと、CREATE文の末尾に、セミコロンが付加されないのです。 ソースコードコンパイルの依存関係と、プラグイン内の依存関係が別なので、注意が必要ですね。

後、DDLJAR/WARに含めたくないので、outputDirは、プロジェクト直下に db/migration というディレクトリを作って、そこに書き出すようにし、CREATE文のファイル名は、flywayで実行しやすいように、"V2__***.sql"としています。

mvn process-classes

pom.xml と同じディレクトリで、上記コマンド実行すると、DDLファイルが書き出されます。

*1:「金魚本」 asin:4798124605 にも載ってないですしね

*2:EclipseLinkのDDLにsemicolonを付与する | Monotalk http://www.monotalk.xyz/blog/eclipselink%E3%81%AEddl%E3%81%ABsemicolon%E3%82%92%E4%BB%98%E4%B8%8E%E3%81%99%E3%82%8B/

トラックバック - http://program.g.hatena.ne.jp/halflite/20150923

2015/09/09 (Wed)

Guice-Persistで、トランザクションが有効にならない その2

| Guice-Persistで、トランザクションが有効にならない その2 - ひとり開発日記。 を含むブックマーク はてなブックマーク - Guice-Persistで、トランザクションが有効にならない その2 - ひとり開発日記。

Google Guice/Guice-Persist*1 + EclipseLink(JPA) + Querydsl でアプリケーションを作っていて、「あれれ?トランザクションが有効にならない」と言うような目に…。

@Singleton
public class AccountLogic {

	@Transactional
	public void add(String name, String mail) {
		// do something
	}
}

これ、最初どこが悪いのか、サッパリだったんですけどね。

早い話、トランザクション境界メソッドに付ける @Transactional は、 @com.google.inject.persist.Transactional が正解。 JTA標準の @javax.transaction.Transactional だと動かない、と言うことです。 EclipseLinkをMavenで入れると、依存関係解決で @javax.transaction.* が入っちゃうので、誤りがち、と言う話でした。

*1Guice 4.0

トラックバック - http://program.g.hatena.ne.jp/halflite/20150909