MacでJavaの起動がすごく遅いことに気づいた。
Javaのアプリケーションが重いのではなく、JavaのJVMそのものの起動が遅い。
java -version するだけでも10秒ほどかかった。
原因はアンチウイルスソフトだった。
リアルタイム保護機能が効いており、JVMを起動時にチェックしていたようだ。
私の場合はFortiClientというアンチウイルスソフトを使っていたが、これのリアルタイム保護を無効にすることでちゃんと1〜2秒で起動してくれるようになった。
2015年7月19日日曜日
2015年7月11日土曜日
ChromeのPush APIで「This site has been update in the background」という通知が表示される原因
「This site has been update in the background」はPUSH通知が来たが表示するメッセージがなかった場合に表示されるデフォルトのメッセージだ。
pushイベント内で showNotification() が確実に実行されるようにすることで、このメッセージを回避できるようになる。
evt.waitUntil() に渡すPromise内でshowNotification()することになるが、ちゃんと各箇所でPromiseをreturnしているか確認する必要がある。
私はfetch()のPromiseをリターンしていなかったためにこのメッセージ表示されており相当な時間ハマってしまった。
pushイベント内で showNotification() が確実に実行されるようにすることで、このメッセージを回避できるようになる。
evt.waitUntil() に渡すPromise内でshowNotification()することになるが、ちゃんと各箇所でPromiseをreturnしているか確認する必要がある。
私はfetch()のPromiseをリターンしていなかったためにこのメッセージ表示されており相当な時間ハマってしまった。
2015年4月26日日曜日
Amazon SESのTXTレコード設定、Value-Domain版
Amazon SESではドメインの認証をすることで、そのドメインからのメール送信ができるようになる。
ドメインの認証をするにはSESに指定された値をDNSのTXTレコードに設定する必要がある。
下記のように設定しなさい、と指示されるがValue-Domainの管理画面から設定する場合はどうするのか?
Name: _amazonses.example.com
Type: TXT
Value: <認証コード>
結論。
TXT _amazonses.example.com <認証コード>
で、認証が通りました。
SPFの設定だと v=~~ ~all とか書式があるから、なにかそういう書式が必要なのかと思って迷いました。
DNSは苦手です。
ドメインの認証をするにはSESに指定された値をDNSのTXTレコードに設定する必要がある。
下記のように設定しなさい、と指示されるがValue-Domainの管理画面から設定する場合はどうするのか?
Name: _amazonses.example.com
Type: TXT
Value: <認証コード>
結論。
TXT _amazonses.example.com <認証コード>
で、認証が通りました。
SPFの設定だと v=~~ ~all とか書式があるから、なにかそういう書式が必要なのかと思って迷いました。
DNSは苦手です。
さくらのメールを使おうとしたら「550 5.7.1 Command rejected」と言われてメールを送信できなかった。vultrのせいだった。
さくらのメールボックスを借りてPEAR::Mailでメールを送信しようとしたところ、メールが送信できず困った。
PEAR::MailはMail::factoryの第2引数に渡すパラメーターで 'debug' => true を設定することでSMTPのやりとりを出力してくれる。
これでやりとりを見てみると Authentication OK という文字が見えることから、認証は成功しているようだが、そのあとすぐに「550 5.7.1 Command rejected」というメッセージがでて接続が切れていた。
なんとも不可解な動作にずっと悩んでいたが、どうもvultrというクラウドを使っていたことが原因のようだった。
こちらのブログを見つけられなかったらずっと悩んでいたかもしれない。感謝。
Vultrからメールが送れないのでSendGridを使う
このブログのリンク先の公式サイトにて、下記のメッセージを確認。
解決策としては、やはりクラウドサービスを利用することにした。AWSは使い慣れているのでAWSのSESを使うことにした。EC2以外から使う場合は無料枠がないようなのでちょっと微妙だけれどほとんどメールなんて飛ばないだろうからいいやという判断。
PEAR::MailはMail::factoryの第2引数に渡すパラメーターで 'debug' => true を設定することでSMTPのやりとりを出力してくれる。
これでやりとりを見てみると Authentication OK という文字が見えることから、認証は成功しているようだが、そのあとすぐに「550 5.7.1 Command rejected」というメッセージがでて接続が切れていた。
なんとも不可解な動作にずっと悩んでいたが、どうもvultrというクラウドを使っていたことが原因のようだった。
こちらのブログを見つけられなかったらずっと悩んでいたかもしれない。感謝。
Vultrからメールが送れないのでSendGridを使う
このブログのリンク先の公式サイトにて、下記のメッセージを確認。
Do you allow outbound SMTP?しかし認証までうまくいくのは何故なのか謎すぎる。接続もできない状態であればすぐ気づいたのだけど。。。
Outbound SMTP is blocked by default. To lift this restriction, you must contact our support team and fill out an authorization form.
解決策としては、やはりクラウドサービスを利用することにした。AWSは使い慣れているのでAWSのSESを使うことにした。EC2以外から使う場合は無料枠がないようなのでちょっと微妙だけれどほとんどメールなんて飛ばないだろうからいいやという判断。
2015年4月24日金曜日
Androidでリンクを強制的にChromeで開く方法
リンクを強制的にChromeで開く方法を30分くらい探しまわったところやっとこさStackOverflowで見つけた。
http://stackoverflow.com/questions/29250152/what-is-the-intent-to-launch-any-website-link-in-google-chrome
とても助かります。。。
フォーマット:
<a href="intent://<URL>#Intent;scheme=http;package=com.android.chrome;end">
実例:
<a href="intent://stackoverflow.com/questions/29250152/what-is-the-intent-to-launch-any-website-link-in-google-chrome#Intent;scheme=http;package=com.android.chrome;end">テスト</a>
強制的にChromeで開くのではなく、ユーザーにURLを開く方法を選択させる方法。
<a href="intent://stackoverflow.com/questions/29250152/what-is-the-intent-to-launch-any-website-link-in-google-chrome#Intent;scheme=http;action=android.intent.action.VIEW;end;">テスト</a>
Chromeでしか動かないWebアプリに飛ばす場合なんかに使いたいですね。
ちゃんと理解すると色々応用が効きそうです。
http://stackoverflow.com/questions/29250152/what-is-the-intent-to-launch-any-website-link-in-google-chrome
とても助かります。。。
フォーマット:
<a href="intent://<URL>#Intent;scheme=http;package=com.android.chrome;end">
実例:
<a href="intent://stackoverflow.com/questions/29250152/what-is-the-intent-to-launch-any-website-link-in-google-chrome#Intent;scheme=http;package=com.android.chrome;end">テスト</a>
強制的にChromeで開くのではなく、ユーザーにURLを開く方法を選択させる方法。
<a href="intent://stackoverflow.com/questions/29250152/what-is-the-intent-to-launch-any-website-link-in-google-chrome#Intent;scheme=http;action=android.intent.action.VIEW;end;">テスト</a>
Chromeでしか動かないWebアプリに飛ばす場合なんかに使いたいですね。
ちゃんと理解すると色々応用が効きそうです。
2015年4月22日水曜日
Docker を利用した Web アプリケーションのデプロイ(私の場合)
先日、「クックパッド開発者ブログ」で「Docker を利用した Web アプリケーションのデプロイ」という記事があがっていた。
僕の関わっているプロダクトでもDockerを採用していて、ほとんどデプロイの仕方が同じだった。
・Nginxもコンテナとして起動している
・UnixソケットではなくコンテナのIPを直接してアプリケーション・サーバーと繋げている
というところ。
あと環境変数の共有とかはいまのところ必要性を感じていないのでやっていない。
うちのNginxの設定はちょっとトリッキーかもしれない。
設定ファイルはerbテンプレートから出力する。変数は環境変数として持っておく。
Nginxの向き先を新しいアプリケーション・サーバーに向けるスクリプトはこんな感じだ。
そしてこれがNginxの設定ファイルのテンプレートの一部
Nginxに限らず多くの設定ファイルがerbテンプレートを使用している。
基本的に設定の変数には環境変数を使っていきたいと考えたが、多くの設定ファイルは環境変数を参照するといったことはできない。sedなどでは対応しにくいパターンもある。なのでなるべく柔軟に対応できるようにテンプレートシステムを使うことにした。erbにこだわりがあるわけではなくphpでもよかったと思う。
最初に導入したのがruby製であるfluentdの設定ファイルを作成していたときなので自然と?erbになってしまっただけだ。
だから新しいAPIサーバーをデプロイするには下記のようなコマンドを実行するだけでいい。(versionはコンテナ名のSuffixになる)
ansible-playbookを実行するWebフロントエンドも開発済みで開発環境では既にAnsibleのコマンドを叩く必要もないところまで自動化できている。
ソースを修正して環境に反映するのには下記の手順が必要になる。
たった1行のコード修正であろうと 2~4 の手順にどうしても時間がかかってしまう。
git pullするだけで反映が終わるような仕組みも用意すべきか否か悩んでいる最中だ。
僕の関わっているプロダクトでもDockerを採用していて、ほとんどデプロイの仕方が同じだった。
私の構成
クックパッドさんと異なる点としては・Nginxもコンテナとして起動している
・UnixソケットではなくコンテナのIPを直接してアプリケーション・サーバーと繋げている
というところ。
あと環境変数の共有とかはいまのところ必要性を感じていないのでやっていない。
うちのNginxの設定はちょっとトリッキーかもしれない。
設定ファイルはerbテンプレートから出力する。変数は環境変数として持っておく。
Nginxの向き先を新しいアプリケーション・サーバーに向けるスクリプトはこんな感じだ。
# switch.sh
export WEBAPP_HOST=${1}
erb /docker/etc/nginx.conf.erb > /etc/nginx/nginx.conf
/etc/init.d/nginx reload
そしてこれがNginxの設定ファイルのテンプレートの一部
#
/docker/etc/nginx.conf.erb
location / {
proxy_pass http://<%= ENV['WEBAPP_HOST'] %>/;
}
Nginxに限らず多くの設定ファイルがerbテンプレートを使用している。
基本的に設定の変数には環境変数を使っていきたいと考えたが、多くの設定ファイルは環境変数を参照するといったことはできない。sedなどでは対応しにくいパターンもある。なのでなるべく柔軟に対応できるようにテンプレートシステムを使うことにした。erbにこだわりがあるわけではなくphpでもよかったと思う。
最初に導入したのがruby製であるfluentdの設定ファイルを作成していたときなので自然と?erbになってしまっただけだ。
実際のオペレーション方法
基本的なオペレーションはAnsibleで包んでいる。だから新しいAPIサーバーをデプロイするには下記のようなコマンドを実行するだけでいい。(versionはコンテナ名のSuffixになる)
ansible-playbook -i hosts/production playbooks/api-server-start.yml -e "version=1"
ansible-playbook -i hosts/production playbooks/reverse-proxy-switch.yml -e "version=1"
ansible-playbookを実行するWebフロントエンドも開発済みで開発環境では既にAnsibleのコマンドを叩く必要もないところまで自動化できている。
課題
Dockerによるデプロイ体制は整ってきたが、気になっているのが修正の反映をするのにかかる時間だ。ソースを修正して環境に反映するのには下記の手順が必要になる。
- ソースを修正する
- Dockerイメージをビルドする
- docker pushする
- docker pullする
- イメージを起動する
- リバースプロキシの向き先を変える
たった1行のコード修正であろうと 2~4 の手順にどうしても時間がかかってしまう。
git pullするだけで反映が終わるような仕組みも用意すべきか否か悩んでいる最中だ。
2015年4月21日火曜日
Materialize - マテリアルデザインのためのCSSフレームワーク
Materialize
http://materializecss.com/
Bootstrapに飽きてきたので別の何かを探していて行き着いたのがMaterializeだった。
マテリアルデザイン用のCSSフレームワークだとGoogleが作っているPolymerがあるけどシングルページアプリケーションが前提の設計になってて使いにくい。
さらにBootstrapみたいなグリッドシステムがないのでグリッドシステムが欲しい場合は別途導入する必要がある。
Materializeはシングルページではないウェブアプリケーションでも使えてグリッドシステムも備えている。
Material UIという競合フレームワークがあるけどReactベースなので単純に適用できない。
2015年4月7日火曜日
2015年2月28日土曜日
[CentOS7]Systemd環境でsshd設定(sshd_config)を反映するにはsystemctl reloadを使う
CentOS7環境でsshd_configを編集しsshdを再起動したが、sshd_configが反映されないくて困った。
どうもSystemd環境で systemctl restart sshd としても設定が反映されないようだ。
systemctl reload sshd とすることで設定が反映されたことを確認できた。
これ、多くの人がハマるだろうなぁ。。。
どうもSystemd環境で systemctl restart sshd としても設定が反映されないようだ。
systemctl reload sshd とすることで設定が反映されたことを確認できた。
これ、多くの人がハマるだろうなぁ。。。
2015年2月27日金曜日
Sakura CloudのCentOS7.0におけるディスク拡張(parted/gdiskによるGPTディスク拡張)
CentOS7ではfdiskによるディスク拡張ができない
CentOS6.5のときは下記の記事通りにすればディスク拡張することができた。http://knowledge.sakura.ad.jp/tech/925/
しかし、CentOS7.0でディスクを作成した場合、記事通りにfdiskを使ったディスクをすることができない。
ディスクパーティションがMBRからGPTという仕組みに変わっているためだ。
partedとgdiskを使う
GPTのディスクのパーティションを行うにはpartedとgdiskというツールが使えます。さくらの記事のfdiskによる作業の変わりに以下の作業を行うことでディスク拡張ができました。
partedによる使用可能セクターの変更
[root]#parted /dev/vdb
GNU Parted 3.1
Using /dev/vdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Error: The backup GPT table is not at the end of the disk, as it should be. This might mean that another operating system believes the disk is smaller. Fix, by moving the backup to the end (and
removing the old backup)?
Fix/Ignore/Cancel?
Fix/Ignore/Cancel? Fix
Warning: Not all of the space available to /dev/vdb appears to be used, you can fix the GPT to use all of the space (an extra 83886080 blocks) or continue with the current setting?
Fix/Ignore? Fix
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 64.4GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: pmbr_boot
Number Start End Size File system Name Flags
1 1049kB 2097kB 1049kB Linux filesystem bios_grub
2 2097kB 4301MB 4299MB linux-swap(v1) Linux swap
3 4301MB 21.5GB 17.2GB ext4 Linux filesystem
(parted) q
gdiskによるパーティションの再作成
[root]#gdisk /dev/vdb
GPT fdisk (gdisk) version 0.8.6
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help): p
Disk /dev/vdb: 125829120 sectors, 60.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 30A18C9A-0775-4F3C-A870-92BF1D93F0C1
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 125829086
Partitions will be aligned on 2048-sector boundaries
Total free space is 83888094 sectors (40.0 GiB)
Number Start (sector) End (sector) Size Code Name
1 2048 4095 1024.0 KiB EF02 Linux filesystem
2 4096 8400895 4.0 GiB 8200 Linux swap
3 8400896 41943006 16.0 GiB 8300 Linux filesystem
Command (? for help): d ^H
Partition number (1-3): 3
Command (? for help): n
Partition number (3-128, default 3):
First sector (34-125829086, default = 8400896) or {+-}size{KMGTP}:
Last sector (8400896-125829086, default = 125829086) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'
Command (? for help): p
Disk /dev/vdb: 125829120 sectors, 60.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 30A18C9A-0775-4F3C-A870-92BF1D93F0C1
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 125829086
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)
Number Start (sector) End (sector) Size Code Name
1 2048 4095 1024.0 KiB EF02 Linux filesystem
2 4096 8400895 4.0 GiB 8200 Linux swap
3 8400896 125829086 56.0 GiB 8300 Linux filesystem
Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/vdb.
The operation has completed successfully.
その他
e2fsckでブロックのカウントが違うと言われましたがFixにしたら問題なく動きました。
原因がよくわからないので怖いですが。
[root@]# e2fsck -f /dev/vdb3
e2fsck 1.42.9 (28-Dec-2013)
/dev/vdb3: recovering journal
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Free blocks count wrong (3587294, counted=3587642).
Fix? yes
Free inodes count wrong (996737, counted=996734).
Fix? yes
/dev/vdb3: ***** FILE SYSTEM WAS MODIFIED *****
/dev/vdb3: 51842/1048576 files (0.1% non-contiguous), 605121/4192763 blocks
2015年1月4日日曜日
AS3「サポートされていないサンプリングレート」のもう一つの原因
AS3でmp3を埋め込み(embded)で使用すると正しいサンプリングレートであるにも関わらずコンパイル時に「サポートされていないサンプリングレート 」と表示され、コンパイルが成功しないことがある。
「サポートされていないサンプリングレート (32000Hz)」
のように現在のサンプリングレートらしきものが表示される場合や、
「~をトランスコードできません。」
のように原因が表示されない場合もある。
単純にサポート外のフォーマットになっている場合がほとんどであろうが、正しいフォーマットであるにも関わらずこれらのメッセージが表示されることがある。
それは、MP3のメタ情報などに日本語などのマルチバイト文字を含む場合だ。(含んでいても問題無い場合もある)
信じられないことに、AS3のコンパイラはMP3のメタ情報にマルチバイト文字がある場合に正しく処理できないのである。
信じられないことに!
「サポートされていないサンプリングレート (32000Hz)」
のように現在のサンプリングレートらしきものが表示される場合や、
「~をトランスコードできません。」
のように原因が表示されない場合もある。
単純にサポート外のフォーマットになっている場合がほとんどであろうが、正しいフォーマットであるにも関わらずこれらのメッセージが表示されることがある。
それは、MP3のメタ情報などに日本語などのマルチバイト文字を含む場合だ。(含んでいても問題無い場合もある)
信じられないことに、AS3のコンパイラはMP3のメタ情報にマルチバイト文字がある場合に正しく処理できないのである。
信じられないことに!
登録:
投稿 (Atom)