OpenLayersの地図ドラッグでスクロールしすぎ!

OpenLayersの地図をdrug panすると、暫くスクロールが続いて予想以上はなれた位置まで飛んでしまう。
これを防ぐ方法はいかのようにenableKineticを無効にする
map_canvas = new OpenLayers.Map(id_map, { controls: [] });
map_canvas.addControl(new OpenLayers.Control.Navigation(dragPanOptions: {enableKinetic: false}}));

※上記の記述ではNavigation以外の全てのコントロールが無効になるため必用なコントロールを適時追加

map_canvas = new OpenLayers.Map(id_map, { controls: [] });
map_canvas.addControl(new OpenLayers.Control.Navigation({mouseWheelOptions: {interval: 1000},dragPanOptions: {enableKinetic: false}}));
//map_canvas.addControl(new OpenLayers.Control.DradPan({interval: 0}));
map_canvas.addControl(new OpenLayers.Control.PanZoomBar());
map_canvas.addControl(new OpenLayers.Control.KeyboardDefaults());

OpenLayersの円の半径

半径100mの円を表示

GoogleMap

var p = new google.maps.LatLng(y,x);
var options = {
	clickable: false,
	strokeColor: "#FF0000",
	strokeOpacity: 1.0,
	strokeWeight: 4,
	fillOpacity: 0.0,
	center: p,
	radius: Number(100)
 };
var circle = new google.maps.Circle(options);
circle.setMap(get_map());

google

OpenLayers(その1)

var style = { 
	strokeColor: '#FF0000', 
	strokeOpacity: 1.0,
	strokeWidth: 5,
	fillOpacity: 0
};

var lonlat =  layer_lonlat_to_map_lonlat(x, y);
var circle = OpenLayers.Geometry.Polygon.createRegularPolygon
(
	new OpenLayers.Geometry.Point(lonlat.lon, lonlat.lat),
	100,
	20,
	0
);
var feature= new OpenLayers.Feature.Vector(circle, null, style);
layer_vector.addFeatures(feature);

osm1

何か半径が違う!

OpenLayers(その2)

以下にしたがって各頂点の座標を求めてVectorとして表示

var apex = 40;
var latlon = new OpenLayers.LonLat(x, y);
var angle;
var new_lonlat;
var points = [];
for (var i = 0; i < apex+1; i++) {
	angle = (i * 360 / apex) + 0;
	new_lonlat = OpenLayers.Util.destinationVincenty(latlon, angle, radius);
	points.push([new_lonlat.lon, new_lonlat.lat]);
}

黒い円(ちょっと切れているが)

osm2
どうやら、こちらのほうがよい。
OpenLayers.Util.destinationVincentyは測地線からの距離と角度を指定して座標を求めるらしい。
今度、値を確認しよう

QGIS フィールド計算機で文字列結合

QGISでString型のフィールド同士を結合して別のフィールドを更新するにはフィールド計算機で
以下の計算を実行

例)「N03_003」と「N03_004」を結合して「NAME」を更新

スクリーンショット 2014-05-22 07.55.28

しかし「N03_003」、「N03_004」のいづれかの値がNULLの時は結合結果もNULLになってしまう

スクリーンショット 2014-05-22 08.26.09

「CASE WHEN 式 THEN 値1 ELSE 値2 END」を使用してNULLを空文字に変換して対応 

スクリーンショット 2014-05-22 08.34.25

EPPlus ExcelPackage を使用してグラフの載ったExcelのWorksheetをコピー

EPPlus ExcelPackage を使用してExcelのWorksheetを行うにはExcelWorksheetsの関数Copyを使用する

string dstName = “新しいシート”;
ExcelPackage ep = new ExcelPackage(new FileInfo(@”c:\public\template.xlsx”));
string srcName = ep.Workbook.Worksheets[1].Name;
ep.Workbook.Worksheets.Copy(srcName, dstName);

コピー対象のWorksheetにグラフがなければ上記の方法でコピー可能。
Worksheet上にグラフがあるとグラフ上のオブジェクトの参照先が

EPPlus ExcelPackage を使用してExcelのWorksheetを削除

シート名を指定して削除


ExcelPackage ep = new ExcelPackage(new FileInfo(@"c:\public\book1.xlsx"));
ExcelWorksheet ws = ep.Workbook.Worksheets[シート名];
ws.WorksheetXml.RemoveAll();
ep.Workbook.Worksheets.Delete(ws);
ep.SaveAs( new FileInfo (@"c:\public\book1.xlsx"));

シートポジション(※先頭が1)を指定して削除

ExcelPackage ep = new ExcelPackage(new FileInfo(@"c:\public\book1.xlsx"));
string name = ep.Workbook.Worksheets[シートポジション].Name;
ExcelWorksheet ws = ep.Workbook.Worksheets[name];
ws.WorksheetXml.RemoveAll();
ep.Workbook.Worksheets.Delete(ws);

gettextを使用してPHPを多国語対応(windows版)

gettextは様々な環境、言語に対応した多国語対応のライブラリ。
PHPも拡張機能として標準で提供されている。
※PHPのextディレクトリにあるphp_gettext.dllが実装
※php.iniのphp_gettext.dllのコメントを予め外して置く
※PHPファイルはUTF-8に設定

カタログファイルについて
gettextでは各言語ごとに辞書ファイル(gettextではカタログと呼ぶ)を用意する。
※拡張子はpo
カタログは全て共通のファイル名。(カタログのファイル名はドメインとして後ほど設定)
カタログファイルの作成方法は後述する。

カタログファイルのディレクトリ構成
実行環境(ここではWindowsサーバー、IISを想定)では各カタログのファイルを以下に従って配置する。
例)
c:¥temp¥locale¥言語¥LC_MESSAGES¥カタログファイル
※1.c:¥temp¥localeは任意のパスを設定可能。(ドメインのパスと呼ぶ)
※2.言語は言語コード_国コード。(日本はja_JP、英語は)

PHPでの実装
PHPでは以下を各PHPの最初に挿入する。


多国語対応の文字は以下のように埋め込む

カタログの作成
カタログはpoEditで作成する。
poEditをダウンロードサイトよりダウンロード
poEditはソースファイルを解析してカタログファイルを作成する

poEditを使用してカタログファイルを作成する際には実行環境とは別に以下のディレクトリ構成で作業することを前提に説明。
c:¥workにカタログファイルを保存
c:¥work¥root以下にソースファイル(*.php)を配置

poEditを起動
スクリーンショット 2014-04-18 05.25.19

メニューの新規作成を選択
言語にカタログ作成対象の言語を指定(最初は日本語)
poedit1

カタログの設定メニューで以下を設定
「プロジェクトの名前とバージョン」任意の名称
「文字符号化法」UTF-8
「ソースコードの文字符号化法」UTF-8
それ以外はデフォルト値
poedit2

ファイルを保存
一旦、ファイルを上述のC:¥workに保存。
ファイル名はdic.poとする。(既に述べた通り、ファイル名=ドメイン名)
poedit3

カタログの設定メニューで以下を設定
「ソースの検索パスーベースのパス」ピリオド(=C:¥work)を指定。
「ソースの検索パスーパス」各ソースのフォルダの絶対パス(=root)
「ソース中のキーワード」アンダーバーを指定
poedit3

poedit4

翻訳を入力
スクリーンショット 2014-04-18 07.10.19

カタログの更新を実行するとカタログファイル「dic.mo」に反映される。

カタログファイルを以下にコピー
c:¥temp¥locale¥jp_JA¥LC_MESSAGES¥dic.mo

以上

カテゴリー: PHP

log4netを使用するとSystem.Security.SecurityExceptionが発生

log4netを使用した実行ファイルを管理者権限以外で実行すると以下のエラーが発生。

log4net:ERROR XmlHierarchyConfigurator: Could not create Appender [EventLogAppender] of type [log4net.Appender.EventLogA
ppender]. Reported error follows.
System.Security.SecurityException: ソースが見つかりませんでしたが、いくつかまたはすべてのログを検索できませんでした。ア
クセス不可能なログ: Security
場所 System.Diagnostics.EventLog.FindSourceRegistration(String source, String machineName, Boolean readOnly)
場所 System.Diagnostics.EventLog.SourceExists(String source, String machineName)
場所 log4net.Appender.EventLogAppender.ActivateOptions()
場所 log4net.Repository.Hierarchy.XmlHierarchyConfigurator.ParseAppender(XmlElement appenderElement)
失敗したアセンブリのゾーン:

調査するとイベントログにアクセスしようとして発生するらしい

確認するとconfigファイルにイベントログに関する記述が残っていた。これを削除して解決

ApacheとTOMCATを連携(Windows)

TOMCATは単独でWEBサーバーとして機能するが、今回はApacheとの連携を設定。
※TOMCATのインスト-ルについてはGeoServerをインストールを参照
Apache、TOMCATのバージョン

Apache2.2.25
httpd-2.2.25-win32-x86-openssl-0.9.8y.msi
Apacheは正式には64bit版は存在しないので32bit版を使用
TOMCAT7.0.47

Apacheのインストール
Apacheのサイトよりインストーラ「httpd-2.2.25-win32-x86-openssl-0.9.8y.msi」をダウンロードして実行。
インストールは全てデフォルトのまま実行
よって「C:\Program Files (x86)\Apache Software Foundation\Apache2.2」にインストールされる

TOMCATの設定
TOMCATのプロトコル(AJP/1.3)の待ちうけポートを確認
TOMCATの設定ファイル
C:\Program Files\Apache Software Foundation\Tomcat 7.0\conf\Server.xml

<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

Apacheの設定
Apacheの設定ファイル「C:\Program Files (x86)\Apache Software Foundation\Apache2.2\conf\httpd.conf」を
以下に従って編集

以下の2行のコメントを外す

#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

以下をhttpd.confに追加

<IfModule mod_proxy_ajp.c>
	<Location />
		ProxyPass ajp://localhost:8009/
	</Location>
</IfModule>

ブラウザ上で以下のURLを開くと、localhost:8009にマッピングされる
http://ホスト名orIPアドレス/
※ちなみにhttp://ホスト名orIPアドレス/tomcatをlocalhost:8009にマッピングした時は
httpd.confを以下のように修正

<IfModule mod_proxy_ajp.c>
	<Location /tomcat/>
		ProxyPass ajp://localhost:8009/
	</Location>
</IfModule>

LOG4PHPで出力フォーマットに日付を指定したらエラー

LOG4PHPで出力フォーマットを指定しないとログには日時は出力されない
以下はLOG4PHPに渡す設定ファイル(config.xml)の内容

<configuration xmlns="http://logging.apache.org/log4php/">
	<appender name="myAppender" class="LoggerAppenderFile">
		<param name="file" value="c:/phplog/myLog.log" />
	</appender>
	<root>
		<appender_ref ref="myAppender" />
	</root>
</configuration>

設定ファイルを以下に変更して日時を出力指定する

<configuration xmlns="http://logging.apache.org/log4php/">
	<appender name="myAppender" class="LoggerAppenderFile">
		<layout class="LoggerLayoutPattern">
			<param name="conversionPattern" value="%d %-5p %m%n" />
		</layout>
		<param name="file" value="c:/phplog/myLog.log" />
	</appender>
	<root>
		<appender_ref ref="myAppender" />
	</root>
</configuration>

すると以下のエラーが表示された

Warning: date(): It is not safe to rely on the system's timezone settings. 
You are *required* to use the date.timezone setting or the date_default_timezone_set() function. 
In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. 
We selected 'Asia/Tokyo' for '9.0/no DST' instead in C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\php\php\log4php\pattern\LoggerPatternConverterDate.php on line 74 Warning: date(): 
It is not safe to rely on the system's timezone settings. 
You are *required* to use the date.timezone setting or the date_default_timezone_set() function. 
In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. 
We selected 'Asia/Tokyo' for '9.0/no DST' instead in C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\php\php\log4php\pattern\LoggerPatternConverterDate.php on line 74 Warning: date(): 
It is not safe to rely on the system's timezone settings. 
You are *required* to use the date.timezone setting or the date_default_timezone_set() function. 
In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. 
We selected 'Asia/Tokyo' for '9.0/no DST' instead in C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\php\php\log4php\pattern\LoggerPatternConverterDate.php on line 74 Warning: date(): 
It is not safe to rely on the system's timezone settings. 
You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. 
We selected 'Asia/Tokyo' for '9.0/no DST' instead in C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\php\php\log4php\pattern\LoggerPatternConverterDate.php on line 74

メッセージに従ってphp.iniに以下を追加して対応

date.timezone = Asia/Tokyo