読者です 読者をやめる 読者になる 読者になる

hiroshi akutsuの日記

主にプログラミング関係のこと

Bitnami-Redmine【SSLの設定方法】

本日Bitnami-Redmineをインストールし、sslを設定しようとしたところ、何やらエラーしたのでそれを解決したメモ


環境は以下の通り

OS:Linux Centos7
Redmine:3.3.1-0

これってだいぶ昔にもはまったことがあり、解決するのに苦労した記憶があった。
またしてもはまってしまったが、redmineがバージョン2.5系のころ解決して、その時の方法と同じだったので記録に残す。

結論から言うと、
/opt/redmine-3.3.1-0/apache2/conf/httpd.conf
の設定は何も変えず、以下のsslの設定ファイルを書き換えるだけである。

/opt/redmine-3.3.1-0/apache2/conf/bitnami/bitnami.conf 

ネットで調べると、
/opt/redmine-3.3.1-0/apache2/conf/httpd.conf
を編集して
Include conf/extra/httpd-ssl.conf
コメントアウトを外したのち
/opt/redmine-3.3.1-0/apache2/conf/extra/httpd-ssl.conf
を編集して証明書パスを登録するという記事をよく見るがbitnami版をインストールするとこれではエラーする。


なぜかというと、すでに
/opt/redmine-3.3.1-0/apache2/conf/httpd.conf

/opt/redmine-3.3.1-0/apache2/conf/bitnami/bitnami.conf
がIncludeされて実行されているので証明書ファイルが読み込まれていて、さらに
/opt/redmine-3.3.1-0/apache2/conf/extra/httpd-ssl.conf
を読み込もうとするから、「もうすでに読み込んでるよ」とエラーしてアパッチが立ち上がってくれない。

(98)Address already in use: AH00072: make_sock: could not bind to address [::]:443

と怒られてしまう。
しかしなんで調べてもあまり情報が出てないんだろう。
結構調べたけど見つからなかったので、昔自力で解決したような気がする。
あ、自分で記事にして記録しておけば良かったのか。。。

select2【colorboxのモーダルウィンドウでselect2化したセレクトボックスがおかしくなる】

jqueryのcolorboxはライセンスもMITで非常に人気のあるプラグインです。
またselect2も同じくMITライセンスで非常に高機能なUIを提供してくれるいいプラグインです。

モーダルウィンドウをcolorboxで表示して、その中でプルダウンをselect2化したときに、ほとんどのブラウザで動かなくなると思います。
なかなか情報探すのに苦労しましたが、わかってしまえば結構簡単に解決できたので、メモを残します。

環境

・クライアントPC:windows 10
・ブラウザ:IE11、Edge、Firefoxchrome
・サーバ:centos7、apache2.4
jquery:1.10.2
・colorbox:1.6.4
・select2:4.0.3

以下サンプルです。colorboxのパスは適当に読み替えてください。
select2を実行するときに、

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>colorbox and select2</title>
	<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
	<link rel="stylesheet" type="text/css" href="colorbox/colorbox-master/example3/colorbox.css"/>
	<script type="text/javascript" src="colorbox/colorbox-master/jquery.colorbox.js"></script>
	<link href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css" rel="stylesheet" />
	<script src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js"></script>
	<script type="text/javascript">
		$(function(){
			var $colorboxArea = $("div.colorboxArea");
			$(":button.open_cb").colorbox({
				inline : true,
				href : $colorboxArea,
				innerWidth : "80%",
				innerHeight : "80%"
			});
			$("select.target").select2({
				dropdownParent: $(".colorboxArea")
			});
		});
	</script>
	<style type="text/css">
		/*IEは以下のように書かないとwidthが0になる*/
		.select2{
			min-width:200px;
		}
	</style>
</head>
<body>
	<input type="button" class="open_cb" value="show modal window!">
	<div style="display:none;">
		<div class="colorboxArea">
			<select class="target">
				<option value="1">aaa</option>
				<option value="2">bbb</option>
			</select>
		</div>
	</div>
</body>
</html>

といったようにdropdownParentプロパティを指定します。
値は、colorboxの領域を指定します。

IEに対応するためにはwidthをスタイルシートで指定する必要がありますが、これで正常に表示できます。

PHPMailer【isHTML(false)にしてもtext/htmlで送信されてしまう】

あまりwebで検索しても情報が出てこなかったので備忘として残します。

PHPMailerを利用してSMTPサーバにつないでメール送信を行うケースは多いと思います。
でも、ちゃんと理解して使わないと、思った通りのメールが遅れないという事態になるので注意が必要です。

PHPMailerでメールを自動で送信する機能を搭載したシステムを作り運用しているのですが、ある日受信者からメールがおかしいといわれました。。。


調べてみると、text/plainで送る設定になっているはずなのに、メールのソース(ヘッダ)を見てみるとbodyがtext/htmlになっていたのです。

isHTML(false)としているのに。。。


なんでかなと思ってPHPMailer本体のphpのソースを見てみたところ、AltBodyプロパティにテキストが代入されていると、なんとisHTMLの設定は無視して強制text/htmlになってしまうようでした。

考えてみりゃそりゃそうだ、AltBodyは、text/htmlがクライアントの都合で使用できない場合に、text/plainの形式で送るメッセージを指定するところだった。
つまりtext/htmlで送信することを前提にしている。
なのでAltBodyがあるときはtext/htmlに強制的になってしまうという作りだった。

PHPMailer作者は良かれと思ってそうしてくれてるんだろうなあ。。。

ということで、AltBodyに代入している行をコメントアウトして、解決しました。

Centos7【デスクトップを入れたがアプリケーションインストーラが表示されない】

備忘録として

centos6のデスクトップで使用していた「ソフトウェアの追加/削除」(コマンドからはgpk-applicationで起動)のメニューが、こないだインストールしたCentos7のデスクトップで見つからなかった。

$ sudo yum install gnome-software

でアプリケーションインストーラを入れた。


f:id:hakoniwahaniwa:20160413121844p:plain

Excel【VBAでCopyメソッドやPasteメソッド、PasteSpecialメソッドがやたら遅い】

下記は、何も悪いことはしていない、何の変哲もないVBAスクリプトだが、
こんなのの実行に30秒程度かかるなんて信じられるだろうか。

Sub test()

    Dim i As Integer
    Dim ra As Range
    
    Dim myra As Range
    Set myra = Range("A1:K1")
    myra.Value = 1
    For Each ra In myra
        i = i + 1
        ra.Copy ra.Offset(i)
    Next ra

End Sub

環境はWindows7(64bit)、Excel2013(64bit)、RAM:24G、Core i7である。
不思議なことに上記コードが一瞬で終わる人(PC)もいる。

なんでPCスペックは申し分ないのに、こんなに時間がかかるんだろうと思って、調査開始。


2016年3月ぐらいから急にvbaのPaste処理の実行が重くなりだした。
その時たまたま更新プログラムをインストールしたのでそれが原因かと思った。

一旦エクセルの重くなりそうな処理をすべてオフにして、セキュリティもがばがばにして、PC自体パフォーマンス優先にして、ウイルス対策ソフトを停止したり、不要なファイルを削除したりした。

こんだけやっても、遅いまま。。。
さらにofficeをセーフモードで立ち上げてみても変わらず、PCをセーフモードで立ち上げたら今度はofficeのアプリケーションが起動できず、お手上げ状態。

あと考えられるのはクリップボードを経由するので、エクセルとは別のプロセスが悪さしてんだろうなと思って、msconfigを立ち上げて、スタートアップの不要そうなプログラムのチェックを外した。

再起動をかけ、マクロを実行すると、嘘のような速さ。
30秒かかっていた処理が一瞬で終わった!

一つ一つチェック外しては再起動をかけてを繰り返して調べていくと、なんとDropBoxが原因でした。。。

私のPC以外にも同様の現象に遭遇している人がいたので、その人のDropBoxもmsconfigのスタートアップでOFFにしたところ、見事現象が直りました。

f:id:hakoniwahaniwa:20160405150115p:plain

さすがにこれは、原因なかなか気づかないや。まさかDropboxとは。。。
更新プログラムが影響していたのかどうかまでは不明。

perl【CentOS6でText::MeCabを使う】

いつもcpanからText::MeCabのインストールでエラーが出て苦しんでいるので、備忘録としてまとめます。

まず環境

CentOS 6.7
Perl 5.10.1

作業ディレクトリはどこでもいいです。
まずmecabのインストール

wget http://mecab.googlecode.com/files/mecab-0.996.tar.gz
tar xvzf mecab-0.996.tar.gz
cd mecab-0.996
./configure
make
make check
sudo make install

mecab辞書のインストール

wget http://mecab.googlecode.com/files/mecab-ipadic-2.7.0-20070801.tar.gz
tar xvzf mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801
./configure --with-charset=utf8
make
sudo make install


PerlCentOSをインストールした際にデフォルトで入ってくるバージョンが5.10.1だったのですが、この古いバージョンではText::MeCabはインストールできないのでバージョンを上げます。

いくつか方法はあると思いますが、perlbrewというのが簡単そうだったので、これを使います。


[https://www.seeds-std.co.jp/seedsblog/611.html:title]

ユーザーごとにperlの実行環境を切り替えられるのは便利です。

インストール

curl -kL http://install.perlbrew.pl | bash

perlbrewのpathを通す

echo "source ~/perl5/perlbrew/etc/bashrc" >> ~/.bashrc
source ~/perl5/perlbrew/etc/bashrc

利用可能なバージョン一覧

perlbrew available

5.16.3をインストール

perlbrew install 5.16.3

5.16.3に切り替え

perlbrew switch 5.16.3

バージョンおよびパス確認

$ perl -v

This is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-linux
(with 1 registered patch, see perl -V for more detail)

Copyright 1987-2012, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

$ which perl
~/perl5/perlbrew/perls/perl-5.16.3/bin/perl


次にcpanからText::MeCabをインストールしますが、その前にmecabのライブラリへのパスを
/etc/ld.so.conf.d/
に追記し、Text::MeCabをインストールします。

$ sudo su
# echo "/usr/local/lib" >> /etc/ld.so.conf.d/local.conf
# ldconfig
# exit
$ cpan install Text::MeCab


インストールの途中
Encoding of your mecab dictionary? (shift_jis, euc-jp, utf-8) [euc-jp]
と聞かれるので、utf-8を指定します。



これで入ると思います。

テストを実行してみます。

text.plをどこかに作成

#! /home/akutsu/perl5/perlbrew/perls/perl-5.16.3/bin/perl

use strict;
use warnings;
use Text::MeCab;

my $m = Text::MeCab->new();
my $s = "すもももももももものうち。";
my $n = $m->parse($s);
my $t = "";
while ($t = $n->next){

	printf("%s\t%s\t%d\n",
		$n->surface,
		$n->feature,
		$n->cost
	);
	$n = $t;
}
$ perl text.pl
すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ	7263
も	助詞,係助詞,*,*,*,*,も,モ,モ	7774
もも	名詞,一般,*,*,*,*,もも,モモ,モモ	15010
も	助詞,係助詞,*,*,*,*,も,モ,モ	15521
もも	名詞,一般,*,*,*,*,もも,モモ,モモ	22757
の	助詞,連体化,*,*,*,*,の,ノ,ノ	23131
うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ	23729
。	記号,句点,*,*,*,*,。,。,。	22725

snappy【generateFromHtml()で日本語ファイル名を出力した際にエラー】

phpでwkhtmltopdfを使ってpdf出力しようと思って、snappyをcomposerからインストールした。

下記を参考にした。qiita.com

github.com

ファイルで保存したかったのでgenerateFromHtmlメソッドを使った。
サンプルが動くのを確認して、張り切って日本語ファイル名を出力してみたらエラー。。。

たらたらと以下のようなエラーメッセージが

Uncaught exception 'RuntimeException' with message 'The file 'あいうえお.pdf' was not created (command: /usr/local/bin/wkhtmltopdf --lowquality --encoding 'utf-8' '/tmp/knp_snappy56440646c1c9f9.19491186.html' '.pdf')....


仕方がないので調査開始。

まず環境

Centos7
Apache 2.4
PHP5.6
wkhtmltopdf0.12.2

1.wkhtmltopdfがおかしい?

→まず普通にターミナルからwkhtmltopdfコマンドで日本語名のファイル出力
普通にできる。

2.であれば渡すコマンドがおかしい?

→snappyのAbstractGeneratorクラスでコマンドのエスケープ処理に、escapeshellargを使っていて、そこで日本語などのマルチバイト文字が消えていた。

phpにlocaleが設定されていなかったのが原因。

setlocale(LC_CTYPE, "ja_JP.UTF8");

を、呼び出し元のコードに追加し、snappy側では日本語が認識されたようだが、やはりまだ同じエラー。

3.snappyが呼び出しているsymfonyのProcessクラスを疑う

→snappyではマルチプロセスでwk~コマンドを実行している。
マルチプロセス処理にsymfonyのProcessクラスを利用している。
symfonyではproc_openメソッドでマルチプロセスを実行している。
proc_openの第一引数にはきちんとマルチバイトの文字列がコマンドとしてわたっているのでここでもない。
また標準エラー、標準出力も見てみたが、とくにwkhtmltopdfではエラーは吐いていなかった。

4.proc_openで起動されたプロセスのユーザを疑う

→whoamiコマンドをproc_openの第一引数に渡して実行したらapacheと表示された。
→echo $LANGを渡してみたら「C」と表示された。



これが原因でした。。。

「ja_JP.UTF8」

と表示されていてほしかったところ、$LANGの環境変数で、日本語ではない言語がapacheユーザには適用されていた。

5.Processクラスのソースをいじって、試しに、proc_openコマンドでexport LANG="ja_JP.UTF8"を追加してwkhtmltopdfのコマンドを実行

→やっと日本語ファイル名の出力できた。


実運用時にはsymfonyのソースを直接いじりたくないので、パラメータで渡せないか調べたところ、snappyのコンストラクタの第三引数に配列で渡せばいいことが判明。

次のようにsnappyのインスタンス生成時に第三引数を渡す。

$pdf = new Knp\Snappy\Pdf('/usr/local/bin/wkhtmltopdf', array(), array("LANG" => "ja_JP.UTF8"));

これで万事うまくいった。
調査に3日もかけてしまった。