Saturday, December 22, 2018

Spring MVC 5 で文字化け対策

Spring MVCを使う機会があったが、
POSTしたリクエストがいつも文字化けする。

Web上を調べると、server.xmlの値を変えないといけないとか
@RequestMappingにproduces = "application/json; charset=UTF-8"を付けろとか
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>がJSPのヘッダに必要だとかありましたが、
結論としては上記のどれでも無かったです。

私が作成しているプロジェクトの構造ですが、

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "jp.co.jdserve.serviceinfo")

public class AppConfig {

というコンフィギュレーションと

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

というInitializerを使っています。
このInitializerの方に下記のメソッドを追加すると、
全てUTF-8で登録表示できるようになりました。

    /**
     * リクエスト、レスポンス共にUTF8で統一する。
     */
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);
        return new Filter[] {characterEncodingFilter};
    }    

Sunday, December 2, 2018

CircleCIで docker-php-ext-install がフォルダアクセス権限無しでエラー

先週、CircleCIでライブラリの更新があったせいか、ビルドがエラーで落ちまくりましたので、メモしておきます。

Build Fail メールを受けて見に行くと、


/usr/local/bin/docker-php-ext-enable: 108: /usr/local/bin/docker-php-ext-enable: cannot create /conf.d/docker-php-ext-pdo_mysql.ini: Directory nonexistent


 というエラーメッセージが出ていました。

何故今まで普通にインストール出来たのが、急に出来なくなったのか分かりませんが、どうやらフォルダ権限に問題があるようなので、

sudo docker-php-ext-install intl pdo pdo_mysql

としていたところを-Eオプションを付けて、

sudo -E docker-php-ext-install intl pdo pdo_mysql

としたところ、正常にビルドできました。

Monday, November 19, 2018

AWSのインスタンスの更新が永遠に終了しなさそうな時

今日、Elastic Beanstalk の Load Balancer の設定を変更したとき、バランサ側の変更とタイミングが重複してしまったためか、1時間以上ずっと更新中のままになってしまった。

AWSコンソールからは EB だろうが EC2 だろうが、操作のしようが無いので、どうしたものかと考えていたが、この方法がStack Overflowで紹介されていた。

https://serverfault.com/questions/881033/elastic-beanstalk-stuck-for-more-than-12-hrs

要するにインスタンスのスケーリングの最大値をゼロにしてしまえば、それで自動的にインスタンスが停止される。その後、数値を元に戻せば更新の終わった状態で立ち上がって来てくれる。

Sunday, October 28, 2018

PHP 7.2 and CakePHP 3.6, You must enable the intl extension to use CakePHP.

I got this error when I  was deploying CakePHP 3.6 project to AWS EB Environment with PHP 7.2.
Fatal error: You must enable the intl extension to use CakePHP.
the error occurred when deploy process run migrations script.

In /etc, there are PHP-7.1.d and PHP-7.2.d.
I checked configuration with
php -i | grep 7.2
Then console displayed no configuration file and directory.
I changed 7.2 to 7.1 and show the /etc/php-7.1.conf and list of .ini files under /etc/php-7.1.d/.
There is no 20-intl.ini file inside /etc/php-7.1.d/.

Simply changing config to PHP 7.2 solved my problem.

But I don't understand why there are configurations of 2 versions.
I created totally new environment and never installed PHP 7.1.

Saturday, March 10, 2018

chef fails start because of wrong mysql GPG key URL.


We use vagrant and chef for create local developing environment.
As you know, both are nasty developer helping tool,
Today I encountered this nasty error.

Vagrantとchefというツールを使っている現在のプロジェクト。正直こういう便利そうなツールほど落とし穴が多いものです。
今日もchefでのMySQLのインストールと起動に失敗してます。

       
==> develop: Recipe: yum-mysql-community::mysql56
==> develop:   * yum_repository[mysql56-community] action create
==> develop:     * template[/etc/yum.repos.d/mysql56-community.repo] action create (up to date)
==> develop:     * execute[yum clean metadata mysql56-community] action nothing (skipped due to action :nothing)
==> develop:     * execute[yum-makecache-mysql56-community] action nothing (skipped due to action :nothing)
==> develop:     * ruby_block[yum-cache-reload-mysql56-community] action nothing (skipped due to action :nothing)
==> develop:      (up to date)
==> develop: Recipe: trl-lamp::mysql-server
==> develop:   * mysql_client_installation_package[server] action create
==> develop:     * yum_package[mysql-community-client, mysql-community-devel] action install
==> develop:
==> develop:
==> develop:       ================================================================================
==> develop:       Error executing action `install` on resource 'yum_package[mysql-community-client, mysql-community-devel]'
==> develop:       ================================================================================
==> develop:
==> develop:       Chef::Exceptions::Exec
==> develop:       ----------------------
==> develop:       yum -d0 -e0 -y install mysql-community-client-5.6.39-2.el7 mysql-community-devel-5.6.39-2.el7 returned 1:
==> develop:       STDOUT:
==> develop:       STDERR: warning: /var/cache/yum/x86_64/7/mysql56-community/packages/mysql-community-common-5.6.39-2.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
==> develop:
==> develop:
==> develop:       GPG key retrieval failed: [Errno 14] HTTPS Error 404 - Not Found
==> develop:
==> develop:       Resource Declaration:
==> develop:       ---------------------
==> develop:       # In /var/chef/cache/cookbooks/mysql/libraries/mysql_client_installation_package.rb
==> develop:
==> develop:        18:       package new_resource.package_name do
==> develop:        19:         version new_resource.package_version if new_resource.package_version
==> develop:        20:         options new_resource.package_options if new_resource.package_options
==> develop:        21:         action :install
==> develop:        22:       end
==> develop:        23:     end
==> develop:
==> develop:       Compiled Resource:
==> develop:       ------------------
==> develop:       # Declared in /var/chef/cache/cookbooks/mysql/libraries/mysql_client_installation_package.rb:18:in `block in '
==> develop:
==> develop:       yum_package("mysql-community-client, mysql-community-devel") do
==> develop:         package_name ["mysql-community-client", "mysql-community-devel"]
==> develop:         action [:install]
==> develop:         retries 0
==> develop:         retry_delay 2
==> develop:         default_guard_interpreter :default
==> develop:         declared_type :package
==> develop:         cookbook_name "trl-lamp"
==> develop:         flush_cache {:before=>false, :after=>false}
==> develop:         arch [nil, nil]
==> develop:       end
==> develop:
==> develop:       System Info:
==> develop:       ------------
==> develop:       chef_version=12.21.26
==> develop:       platform=centos
==> develop:       platform_version=7.4.1708
==> develop:       ruby=ruby 2.3.5p376 (2017-09-14 revision 59905) [x86_64-linux]
==> develop:       program_name=chef-client worker: ppid=4766;start=01:51:29;
==> develop:       executable=/opt/chefdk/bin/chef-client
==> develop:
==> develop:
==> develop:     ================================================================================
==> develop:     Error executing action `create` on resource 'mysql_client_installation_package[server]'
==> develop:     ================================================================================
==> develop:
==> develop:     Chef::Exceptions::Exec
==> develop:     ----------------------
==> develop:     yum_package[mysql-community-client, mysql-community-devel] (/var/chef/cache/cookbooks/mysql/libraries/mysql_client_installation_package.rb line 18) had an error: Chef::Exceptions::Exec: yum -d0 -e0 -y install mysql-community-client-5.6.39-2.el7 mysql-community-devel-5.6.39-2.el7 returned 1:
==> develop:     STDOUT:
==> develop:     STDERR: warning: /var/cache/yum/x86_64/7/mysql56-community/packages/mysql-community-common-5.6.39-2.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
==> develop:
==> develop:
==> develop:
==> develop: GPG key retrieval failed: [Errno 14] HTTPS Error 404 - Not Found
==> develop:
==> develop:     Resource Declaration:
==> develop:     ---------------------
==> develop:     # In /var/chef/cache/cookbooks/trl-lamp/recipes/mysql-server.rb
==> develop:
==> develop:      20: mysql_client "#{instance_name}" do
==> develop:      21:   version "#{node['trl-lamp']['mysqld']['version']}"
==> develop:      22:   action [:create]
==> develop:      23: end
==> develop:      24: # cli縺ァ蜈・繧九→縺阪�ッmysql -S /var/run/mysql-server/mysqld.sock -u root -pMyPa¥$¥$wordHasSpecialChars!
==> develop:
==> develop:     Compiled Resource:
==> develop:     ------------------
==> develop:     # Declared in /var/chef/cache/cookbooks/trl-lamp/recipes/mysql-server.rb:20:in `from_file'
==> develop:
==> develop:     mysql_client_installation_package("server") do
==> develop:       action [:create]
==> develop:       retries 0
==> develop:       retry_delay 2
==> develop:       default_guard_interpreter :default
==> develop:       declared_type :mysql_client
==> develop:       cookbook_name "trl-lamp"
==> develop:       recipe_name "mysql-server"
==> develop:       version "5.6"
==> develop:       major_version "5.6"
==> develop:       package_name ["mysql-community-client", "mysql-community-devel"]
==> develop:     end
==> develop:
==> develop:     System Info:
==> develop:     ------------
==> develop:     chef_version=12.21.26
==> develop:     platform=centos
==> develop:     platform_version=7.4.1708
==> develop:     ruby=ruby 2.3.5p376 (2017-09-14 revision 59905) [x86_64-linux]
==> develop:     program_name=chef-client worker: ppid=4766;start=01:51:29;
==> develop:     executable=/opt/chefdk/bin/chef-client
==> develop:
==> develop:
==> develop: Running handlers:
==> develop: [2018-03-11T01:52:17+00:00] ERROR: Running exception handlers
==> develop: Running handlers complete
==> develop: [2018-03-11T01:52:17+00:00] ERROR: Exception handlers complete
==> develop: Chef Client failed. 1 resources updated in 48 seconds
 


After the research in internet, I found out that problem is in chef's .

The error occurred because of wrong GPG-Key URL in below file.
/etc/yum.repos.d/mysql56-community.repo

結局、/etc/yum.repos.d/mysql56-community.repoのgpgkeyのURLが間違っているとわかりましたが、このファイルはもとはchefのcookbookから作成されていますので元のファイルを修正する必要があります。

       
# This file was generated by Chef
# Do NOT modify this file by hand.

[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/$releasever/$basearch/
enabled=1
failovermethod=priority
fastestmirror_enabled=0
gpgcheck=1
gpgkey=https://raw.githubusercontent.com/chef-cookbooks/yum-mysql-community/master/files/default/mysql_pubkey.asc


And above repo file is generated from below file
cookbooks/yum-mysql-community/attributes/mysql56-community.rb

こちらがcookbookのrbファイル。
       
efault['yum']['mysql56-community']['repositoryid'] = 'mysql56-community'
default['yum']['mysql56-community']['gpgkey'] = 'http://raw.githubusercontent.com/chef-cookbooks/yum-mysql-community/master/files/default/mysql_pubkey.asc'
default['yum']['mysql56-community']['description'] = 'MySQL 5.6 Community Server'
default['yum']['mysql56-community']['failovermethod'] = 'priority'
default['yum']['mysql56-community']['gpgcheck'] = true
default['yum']['mysql56-community']['enabled'] = true
 

First I thought it is as simple as just overwrite URL.
But every time I run the vagrant provisioning, this .rb file is downloaded and overwritten with wrong URL.

単純に上書きすればそれで解決というわけではなく、chefがmysqlをインストールする前にファイルをサーバからダウンロードしてこちらの修正を上書きしてしまいます。

So I decided to cheat little bit.
This nasty chef downloads cookbook files when console shows below message.


      
==> develop: Starting Chef Client, version 12.21.26
==> develop: resolving cookbooks for run list: ["trl-lamp::selinux-disable", "trl-lamp::build-essential", "trl-lamp::sqlite", "trl-lamp::nodejs", "trl-lamp::mysql-server", "trl-lamp::mysql-database", "trl-lamp::redisio", "trl-lamp::memcached", "trl-lamp::php", "trl-lamp::httpd-web", "trl-lamp::httpd-php", "trl-lamp::minio", "trl-lamp::httpd-vagrant", "trl-lamp::sftp-user"]
==> develop: Synchronizing Cookbooks:
==> develop:   - trl-lamp (0.1.12)
==> develop:   - selinux (2.1.0)
==> develop:   - imagemagick (0.2.3)
==> develop:   - build-essential (8.0.4)
==> develop:   - nodejs (5.0.0)
==> develop:   - httpd (0.6.1)
==> develop:   - php (4.5.0)
==> develop:   - composer (2.6.1)
==> develop:   - mysql (8.5.1)
==> develop:   - mysql2_chef_gem (2.1.0)
==> develop:   - database (6.1.1)
==> develop:   - yum-epel (2.1.2)
==> develop:   - redisio (2.6.1)
==> develop:   - seven_zip (2.0.2)
==> develop:   - memcached (5.0.0)
==> develop:   - mingw (2.0.1)
==> develop:   - yum-remi-chef (2.2.2)
==> develop:   - yum-mysql-community (2.1.0)
==> develop:   - ark (3.1.0)
==> develop:   - windows (3.4.3)
==> develop:   - apt (6.1.4)
==> develop:   - ulimit (0.4.0)
==> develop:   - selinux_policy (2.0.1)
==> develop:   - postgresql (6.1.1)
==> develop:   - compat_resource (12.19.0)
==> develop:   - runit (4.0.4)
==> develop:   - yum (5.1.0)
==> develop:   - ohai (5.2.0)
==> develop:   - openssl (8.1.0)
==> develop:   - mariadb (1.5.3)
==> develop:   - yum-scl (0.2.0)
==> develop:   - inifile_chef_gem (0.1.0)
==> develop:   - packagecloud (0.3.0)
==> develop: Installing Cookbook Gems:
==> develop: Compiling Cookbooks...
==> develop: Converging 138 resources
 

While console output this message, I over wrote the cookbook mysql file as below.

       
default['yum']['mysql56-community']['repositoryid'] = 'mysql56-community'
default['yum']['mysql56-community']['gpgkey'] = 'http://raw.githubusercontent.com/chef-cookbooks/yum-mysql-community/master/files/mysql_pubkey.asc'
default['yum']['mysql56-community']['description'] = 'MySQL 5.6 Community Server'
default['yum']['mysql56-community']['failovermethod'] = 'priority'
default['yum']['mysql56-community']['gpgcheck'] = true
default['yum']['mysql56-community']['enabled'] = true
 

Everything went OK.
Now I could start virtual machine on my local.