Apache2.4のリバースプロキシ設定は最後の「/」が不要!
新規でサーバーを構築する機会があったのでApache2.4でリバースプロキシを設定しました。
Apache2.2の設定をそのまま使ってみるものの、動作せず5時間ほどハマり、結果的に「/」の有無で解決しました。
他の人がこれにハマらないように記事にしておきます…。
設定の比較
Apache2.2の設定
<Location "/ContextRoot">
ProxyPass http://localhost:8080/ContextRoot/
ProxyPassReverse http://xxxxx.com/ContextRoot
</Location>
Apache2.4の設定
<Location "/ContextRoot">
ProxyPass http://localhost:8080/ContextRoot
ProxyPassReverse http://xxxxx.com/ContextRoot
</Location>
相違点
Apache2.4のProxyPass
の最後に「/」を付けてません。
これがあると、ポート8080を使う通常の処理は問題ないのですが、cssやjsなどの静的コンテンツが読み込まれません。
まとめ
リバースプロキシの設定は、バージョンアップしても基本的に使えますが、少しの変更が必要になることがあるので注意が必要です。
Apache2.4を触ってみましたが、最初に設定する項目が減ってて楽でした。
例えば、バーチャルホストだとNameVirtualHost
の宣言は必要ありませんでした。
ディレクトリ構造がかなり変わって違和感ありありです。
yumでインストールした場合、/opt/rh/httpd24/root/
がルートになります。
サーバ構築の実際がわかる Apache[実践]運用/管理 (Software Design plus)
- 作者: 鶴長鎮一
- 出版社/メーカー: 技術評論社
- 発売日: 2012/03/23
- メディア: 単行本(ソフトカバー)
- 購入: 6人 クリック: 109回
- この商品を含むブログ (14件) を見る
CrystalReportsでプリンター名を設定する方法
CrystalReportsで任意で選択したプリンターで印刷を行いたい場合、通常のプリンター指定では認識されないようです。
認識させるには、少し特殊な指定が必要なようです。
動作環境
Windows | 10 |
---|---|
VisualStudio | Community 2015 Update3 |
.NETFramework | 4.6.1 |
CrystalReports | 13.0.20 |
通常の設定方法
こちらの設定で行っても指定したプリンターで印刷はされません。
public void Print(PrinterSettings settings) // デザイナーで定義したレポート TestReport r = new TestReport(); r.Load(); r.Refresh(); // 給紙トレイ設定 r.PrinterOptions.CustomPaperSource = settings.DefaultPageSettings.PaperSource; // プリンター名設定 r.PrinterOptions.PrinterName = settings.PrinterName; // ←設定されない!! // 印刷実行 r.PrintToPrinter(printer.Copies, false, 0, 0); }
正しい設定方法
1.プロジェクトの参照からアセンブリタブにある4項目を追加する
- CrystalDecisions.ReportAppServer.ClientDoc
- CrystalDecisions.ReportAppServer.Controllers
- CrystalDecisions.ReportAppServer.DataDefModel
- CrystalDecisions.ReportAppServer.ReportDefModel
2.プリンター名の設定方法を次のように変更する
public void Print(PrinterSettings settings) // デザイナーで定義したレポート TestReport r = new TestReport(); r.Load(); r.Refresh(); // 給紙トレイ設定 r.PrinterOptions.CustomPaperSource = settings.DefaultPageSettings.PaperSource; // プリンター名設定 // r.PrinterOptions.PrinterName = settings.PrinterName; ISCDReportClientDocument cdoc = r.ReportClientDocument; cdoc.PrintOutputController.GetPrintOptions().PrinterName = printer.PrinterName; // 印刷実行 r.PrintToPrinter(printer.Copies, false, 0, 0); }
VisualStudioのCrystalReportsを配布先のクライアントで動作させる手順
VisualStudioでCrystalReportsを使った開発を行うには「SAP Crystal Reports developer version for Visual Studio」が必要です。
これをインストールすれば開発環境では、問題なく動作します。
しかし、配布するとそのままでは動作しません。
配布先で動作させるためには、CrystalReportsのランタイム「SAP Crystal Reports Runtime」とインストーラーに「SAP Crystal Reports Runtime - Merge Modules」が必要です。
動作環境
開発環境
Windows | 10 |
---|---|
VisualStudio | Community 2015 Update3 |
.NETFramework | 4.6.1 |
CrystalReports | 13.0.20 |
配布先
Windows | 10 |
---|---|
CrystalReports | 13.0.20 |
VisualStudioのインストーラーでCrystalReportsのMergeModulesを適用する
VisualStuidoでインストーラーを扱うには、次の記事を参考にして下さい。
shinsuke789.hatenablog.jp
1.次のURLにアクセスし「SAP Crystal Reports Runtime - Merge Modules」をダウンロードします。
http://www.crystalreports.com/crvs/confirm/
2.ダウンロードしたファイルを解凍し、「CRRuntime_13_0_xx.msm」と「CRRuntime_13_0_xx_ja.msm」のファイルを次の場所にコピーします。
C:\Program Files (x86)\Common Files\Merge Modules
※コピーしなくても動作しますが、ここにコピーしておいた方が使い勝手が良いので
日本語環境なので「ja」のファイルを選択しています。動作環境に言語に合わせて適切なものを選択して下さい。
3.VisualStudioのセットアッププロジェクトを右クリックし、「Add」→「Merge Module...」をクリックします。
4.ファイル選択ダイアログが表示されるので、2のファイルを選択し、プロジェクトに追加します。
5.セットアッププロジェクトをビルドします。いつもより少し時間がかかります。
6.ビルドして生成されたインストーラーを配布します。
配布先には事前にCrystalReportsランタイムがインストールされている必要があります。
配布先でCrystalReportsのランタイムをインストールする
1.次のURLにアクセスし「SAP Crystal Reports Runtime (32Bit)」または「SAP Crystal Reports Runtime (64Bit)」をダウンロードします。
http://www.crystalreports.com/crvs/confirm/
2.ダウンロードしたファイルを解凍し、インストーラーを実行します。
3.ウィザードが開始されるので「Next」をクリックします。
4.「I accept the License Agreement」を選択し、「Next」をクリックします。
5.「Next」をクリックします。
6.インストールが終わるまでしばらく待ちます。
7.「Finish」をクリックし、インストールを終了します。
配布先でのエラー対応
ファイルが見つからない
ファイルまたはアセンブリ'CrystalDecisions,CrystalReports.Engine, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=xxxxxxxx,またはその依存関係の1つが読み込めませんでした。指定されたファイルが見つかりません。
エラーメッセージに表示されている「Version」のCrystalReportsランタイムがインストールされていないのが原因です。
この場合、13.0.20のランタイムをインストールすることでエラーは解消します。
旧バージョンのランタイムをダウンロードする
ランタイム配布サイトでは、最新版しかダウンロードできないと思われますが、URLを書き換えることで可能です。
URLのバージョンを希望のものに変更し、?以降を削除します。
最新版 http://downloads.businessobjects.com/akdlm/cr4vs2010/CRforVS_redist_install_32bit_13_0_21.zip?_ga=2.242728192.309491126.1508199297-555278125.1508199297 旧版 http://downloads.businessobjects.com/akdlm/cr4vs2010/CRforVS_redist_install_32bit_13_0_20.zip
SpringBootのJacksonで日付フォーマットを設定する方法
SpringBootのコントローラーの戻り値に@ResponseBodyを設定して、オブジェクトでJSONを返すとき、日付型はlongで扱われます。
それを適切は日付フォーマットにするには、設定ファイル、アノテーションで設定できます。
application.propertiesによる設定
アプリケーション全体の設定として適用されます。
タイムゾーン設定をしないと、日付がずれるので必ず設定しておきましょう。
application.properties
spring.jackson.date-format=yyyy/MM/dd'T'HH:mm:ss.SSSZ
spring.jackson.time-zone=Asia/Tokyo
PostgreSQLを自己証明書でSSLに対応する
手順通りにすれば、簡単にPostgreSQLをSSLに対応できます。
動作環境
OS | CentOS 6.4 |
PostgreSQL | 9.3.2 |
OpenSSL | 1.0.1e-fips 11 Feb 2013 |
自己証明書を作成する
1.PostgreSQLのdataディレクトリに移動する
$ cd /var/lib/pgsql/9.3/data
# 2048はビット数 $ openssl genrsa 2048 > server.key
3.OpenSSLでCSRを作成する
$ openssl req -new -key server.key > server.csr
4.OpenSSLで証明書を作成する
# 36500は有効期限(この場合100年) $ openssl x509 -days 36500 -req -signkey server.key < server.csr > server.crt
5.作成したファイルの所有権・グループを変更する
$ chown postgres:postgres server.*
6.server.keyのアクセス権限を変更する
$ chmod 600 server.key
PostgreSQLの設定を変更する
1.pg_hba.confでアクセス権を変更する
$ vi /var/lib/pgsql/9.3/data/pg_hba.conf # IPv4 local connections: host all all 127.0.0.1/32 md5 # ローカルはSSL不要 hostssl all all 0.0.0.0/0 md5 # リモートはSSL必須
2.postgresql.confでSSLを有効にする
$ vi /var/lib/pgsql/9.3/data/postgresql.conf # コメントアウトされているので、コメントを外し「ssl = on」にする # ssl = off ssl = on
3.設定を有効にするためPostgreSQLを再起動する
$ service postgresql-9.3 restart
注意事項
TomcatやGlassFishなどのアプリケーションサーバーを利用している場合、PostgreSQLを再起動する前に停止しておく必要があります。
起動したままだと、データベースとの連携が行われなくなり接続エラーが発生します。
PostgreSQLの再起動が失敗した場合、エラーメッセージがログに出力されるので、そちらを参照し問題点を修正して下さい。
pg_logディレクトリ内に発生曜日ごとにログがあります。
/var/lib/pgsql/9.3/data/pg_log
SSL設定後のPostgreSQLへの接続
psqlコマンドで接続する場合、接続情報を「""」で括り、「sslmode=require
」を追加します。
psql "sslmode=require host=xxx.xxx.xxx.xxx user=user1 dbname=db1"
SSL設定後のアプリケーション側での接続文字列変更
.NET
接続文字列に「SSL Mode = Require; Trust Server Certificate = true;
」を追加します。
Host=xxx.xxx.xxx;Database=dbname;Username=user;Password=pass;SSL Mode=Require;Trust Server Certificate=True
PostgreSQLを深く知るためにおすすめの書籍
内部構造から学ぶPostgreSQL 設計・運用計画の鉄則 (Software Design plus)
- 作者: 勝俣智成,佐伯昌樹,原田登志
- 出版社/メーカー: 技術評論社
- 発売日: 2014/09/04
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
- 作者: 鈴木啓修
- 出版社/メーカー: 技術評論社
- 発売日: 2012/11/16
- メディア: 単行本(ソフトカバー)
- 購入: 2人 クリック: 14回
- この商品を含むブログ (5件) を見る
Thymeleaf2.xでの「少し困った!」に役立つミニリファレンス集
Thymeleafを使用した開発で、実際に少し困ったことについてまとめてみました。
これから利用する方の役に立てればと思います。
リンクにパラメーターを含める
変数${}
の前後に__
を追加し、__${}__
の形にする。
<a th:href=“@{/hoge/__${e.no}__/add}">hoge</a>
formタグのactionに文字列変数を展開する
変数に定義した文字列をリンクとして展開する場合、@{}
内に${}
で変数を定義する。
<!-- 通常の文字指定 --> <form th:action=“@{/hoge}” method=“post”> <!-- 変数指定 --> <form th:action=“@{${hoge}}” method=“post”>
「data-」属性に値を設定する
<span th:attr="data-hoge=${hoge}">hoge</span>
変数を含んだ文字列の展開
「|」で括る
<span th:text=“|${hoge}です。|”/>
JavaScriptで変数を扱う
<script>
タグにth:inline="javascript"
を追加し、/*<![CDATA[*/
と/*]]>*/
で括る。
その中での変数は、/*[[
と]]*/
で括る。
<script th:inline="javascript"> /*<![CDATA[*/ /*[[@{/hoge}]]*/ /*]]>*/ </script>
JavaScriptで変数を文字で連結する
変数を/*[+
と+]*/
で括る。
<script th:inline="javascript"> /*<![CDATA[*/ var val = "aaa" + /*[+ [[${hoge}]] +]*/; /*]]>*/ </script>
変数を文字列として扱い比較する
パスを含む変数を比較したい場合、''
で変数を文字列化すると比較できる。
<span th:if="${'__*{path}__' == '/hoge'}">hoge</span>
Thymeleafの記載がある書籍
- 作者: 掌田津耶乃
- 出版社/メーカー: 秀和システム
- 発売日: 2017/05/09
- メディア: Kindle版
- この商品を含むブログを見る
Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発
- 作者: 株式会社NTTデータ
- 出版社/メーカー: 翔泳社
- 発売日: 2016/07/20
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
C#のアプリケーション設定でプリンタ設定(PrinterSettings)を保存・読み込みできるようにする
C#でプリンターの設定(PrinterSettings)を保存する必要があったので、アプリケーション設定で保存するようしました。
しかし、アプリケーションが起動している最中は、設定の読み込み・保存が有効でも、アプリケーションを再起動すると設定が読み込まれない問題に遭遇しました。
いろいろ試した所、標準のやり方ではなく、手動でコードを書く必要があったのでその方法をまとめました。
手順
1.アプリケーション設定で通常通り設定を宣言している場合、削除します
2.アプリケーション設定の上部にある「コードの表示」をクリックします
3.設定用のコードが表示されるので、クラス内に設定名のプロパティで次のようなコードを追記します
[global::System.Configuration.UserScopedSettingAttribute()] [global::System.Configuration.SettingsSerializeAsAttribute(SettingsSerializeAs.Binary)] public PrinterSettings Printer { get { return ((PrinterSettings)(this["Printer"])); } set { this["Printer"] = value; } }
この場合は、PrinterSettingsという型で保存を行います。
プロパティ名・get/setの[]
内には設定名を宣言します。
通常のアプリケーション設定で宣言するとXMLで保存され、それが読み込まれないので設定が復元できないようです。
それを回避するため、上記コードの2行目にある[global::System.Configuration.SettingsSerializeAsAttribute(SettingsSerializeAs.Binary)]
を追加してバイナリで保存するようにします。
単純なプロパティのみのクラスで試した所、XML形式で保存され、読み込み・保存とも可能でした。
ひょっとすると一定の階層を超えると復元できないのかもしれません。
4.設定の読み込み・保存は通常通りのコードで可能です。
// 読み込み PrinterSettings p = Settings.Default.Printer; // 保存 Settings.Default.Printer = printerSettings; Settings.Default.Save();
まとめ
stringやintと同じような形でPrinterSettingsを保存しようとして、1日ぐらい悩みました。
こういうときは一晩おくと冷静になって解決方法が見つかるんですよね。
そのおかけでなんとか解決することができました。
基本的にアプリケーション設定にない型を保存する場合は、手動でプロパティを宣言しバイナリで保存するようにした方が良いでしょう。
参考
調査していると、プリンターの設定方法を質問しているページがあったので参考にしました。
やはり同じようにアプリケーションを再起動すると読み込まれないと書かれています。
上記サイトは、base64に変換して保存・読み込みする方法でしたが、そんなことしなくてもバイナリ設定で解決です。
現場ですぐに使える! VisualBasic 2015 逆引き大全 520の極意
- 作者: 増田智明,国本温子
- 出版社/メーカー: 秀和システム
- 発売日: 2016/06/25
- メディア: 単行本
- この商品を含むブログを見る