unhurried

コンピュータ関連ネタがほとんど、ときどき趣味も…

Visual StudioサブスクリプションでMicrosoft Azureを利用する

Visual Studioサブスクリプション(旧MSDNサブスクリプション)にはMicrosoft Azureを利用できるクレジットが付いてくるものがある。(例えば、Visual Studio Professionalサブスクリプションでは月間50ドルのクレジットが付く。)

ただし、このクレジットで利用できるサービスには以下の制限があることに注意が必要である。

  • 開発もしくはテストでのみ使用でき、運用目的では使えない。
  • SLAの保証はなく、120時間以上の連続稼働が禁止されている。
  • 利用できないリージョンがある。
    • 例えば、仮想VMは米国東部、米国中南部、ヨーロッパ西部、東南アジア、米国西部2、米国中西部のリージョンにのみ作成できる。
  • 利用できないサービスがある。
  • 有料サブスクリプションよりクォータが低いものがある

参考

Tomcatのlogging.properties設定方法

Tomcat 7/8のログ出力設定ファイル(logging.properties)の定義方法をまとめています。

Tomcatjava.util.logging API実装(JULI)での設定方法拡張(一部抜粋)

  • .handlersプロパティを設定することでルートLoggerのHandlerが定義できる。
  • Handler名にプレフィックスを付けることで同じHandlerクラスを複数回利用できる。
    • プレフィックスは数字で始まり.で終わること。
  • あるLoggerにHandlerが設定されている場合は親のLoggerの処理は実施されない(設定で変更可能)。

デフォルトのlogging.properties設定内容

# 利用するHandlerを指定する。この設定方法はjava.util.loggingと同様。
# org.apache.juli.FileHandlerクラスを"1catalina"、"1localhost"、"3manager"というプレフィックスをつけることで3つのHandlerとして利用している。
handlers = 1catalina.org.apache.juli.FileHandler, \
           2localhost.org.apache.juli.FileHandler, \
           3manager.org.apache.juli.FileHandler, \
           java.util.logging.ConsoleHandler

# ルートLoggerが利用するHandlerを指定する。
# Loggerに個別にHandlerを指定していない場合は、ルートLoggerのHandlerに渡される。
.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler

# 各Handlerに対して設定値を指定する。
# level:出力するログレベル
# directory:ログファイルを出力するディレクトリ(FileHandler)
# prefix:ログファイルのファイル名のプレフィックス(FileHandler)
# bufferSize:ログ出力処理のバッファサイズ(FileHandler)
# formatter:ログの整形を行うクラス

1catalina.org.apache.juli.FileHandler.level = FINE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina.

2localhost.org.apache.juli.FileHandler.level = FINE
2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.FileHandler.prefix = localhost.

3manager.org.apache.juli.FileHandler.level = FINE
3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.FileHandler.prefix = manager.
3manager.org.apache.juli.FileHandler.bufferSize = 16384

java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

# 各Loggerに対して設定値を指定する。
# level:記録対象となるログのログレベル
# handlers:Loggerが利用するHandler

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = \
   2localhost.org.apache.juli.FileHandler

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = \
   3manager.org.apache.juli.FileHandler

参考

シェルスクリプトでの正規表現を使ったバリデーション

exprコマンドを使う方法

target='aa bbcc'

# 正規表現をクォートする。
# 変数展開時はワード分割を避けるためにクォートする。
if expr "${target}" : "^a\+ [b-c]\{4\}$" > /dev/null; then
    echo "match"
fi

# 正規表現にマッチしない条件分岐をするには!を使う。
if ! expr "${target}" : "^a\+ [b-c]\{3\}$" > /dev/null; then
    echo "mismatch"
fi

[[ ]] 構文を使う方法(bashzshなど)

target='aa bbcc'

# bash: 正規表現をクォートしない。
# zsh: 正規表現をクォートする。
# 変数展開時のクォートは不要。
if [[ ${target} =~ ^a+' '[b-c]{4}$ ]]; then
    echo "match"
fi

# 正規表現にマッチしない条件分岐をするには!を使う。
if [[ ! ${target} =~ ^a+' '[b-c]{4}$ ]]; then
    echo "mismatch"
fi

参考

Spring FrameworkにおけるBeansとは

Spring Framework初心者である私がSpring BootのGetting Startedガイドを読んでみたときに、いきなり躓いたのがSpringのBeansという概念でした。これまでSpring Frameworkに触ったことがなければ、Beansと聞くとJava Beansをイメージするかもしれませんが、Spring Frameworkでは独自の概念として使われているので注意が必要です。

Spring FrameworkにおけるBeans

Beansとは、Sprint IoC(DI)コンテナが管理(インスタンスの生成や保管)する、アプリケーションを構成するオブジェクトのこと。従来のXMLで設定する方法の他に、Javaアノテーションでも設定できる(現在はこちらが主流)。

JavaアノテーションでのBeans設定例

Beansを設定するには@Configurationを付与したクラスに@Beanを付与したメソッドを定義する。公式リファレンスでは同じ設定をJavaアノテーションXMLで定義した以下の例が紹介されている。

@Configuration
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}
<beans>
    <bean id="myService" class="com.acme.services.MyServiceImpl"/>
</beans>
参考

自転車保険調査

これまで契約していた自転車保険の更新時期なので、契約を見直そうと少し調査してみました。

要件

  • 個人賠償は1億円以上
  • 死亡保障・入院保障は不要

一覧

今回調査した中で最もお得なのは全日本交通安全協会が販売するサイクル安心保険であった。その他は自動車・火災・傷害保険に付け足せるものがコストパフォーマンスが良い。(以下では東京海上日動のものだけを記載しているが、その他のカードや保険会社にも同様のオプションがある。)

名称 提供元 月額 年額 個人賠償 死亡・後遺症 入院 示談交渉 メモ
サイクル安心保険 プランA 全日本交通安全協会 1230円 1億円 なし なし あり 自転車に係る事故のみ補償
トータルアシスト 個人賠償責任補償特約 東京海上日動 1530円 無制限(国外1億円) なし なし あり 東京海上日動 保険契約者向け
ラクラク WEB サイクルアシスト 朝日火災 1620円 1億円 100万円 日額1000円 あり 2・3年契約割引あり
トッピング保険 日常生活賠償プラン JCB 150円 1800円 1億円 100万円 なし あり JCBカード保有者向け
CYCLE PARTNER サイクルベースあさひ 170円 1920円 2億円 最大400万円 日額2000円 あり 自転車に係る事故のみ補償
超かんたん保険 自転車保険プラン 楽天 140円 1960円 1億円 100万円 日額1500円 あり
eサイクル保険 価格.com専用プラン 東京海上日動 2030円 無制限(国外1億円) なし なし あり

参考

API for DMM Mobile

Node.jsからGoogle ChromeChromium)を操作するライブラリpuppeteerを試してみるついでに、スクレイピングを利用したアプリケーションを開発しました。DMM Mobileのマイページを操作することで以下の機能をAPI化しています。

  • 高速通信容量残高の取得
  • 通信モード(高速・低速)の取得
  • 通信モード(高速・低速)の切り替え

ソースコードhttps://github.com/unhurried/api-for-dmm-mobile

※ あくまでpuppeteerでのスクレイピングのサンプルコードですので、実行する際にはサービスの最新の利用規約に従ってください。

Node.jsでURLからファイル名の拡張子を抽出する

ファイルシステムのパスからファイル名の拡張子を抽出するときにはpathのみで対応できますが、URLの場合にはクエリやフラグメントが付くので最初にurlでパス部分を抽出する必要があります。単純な問題ですが実装するときに少し悩んだので、備忘録としてまとめました。

app.js
const path = require('path');
const url = require('url');

const targetUrl = 'http://example.com/a.b?c=d#e'

const parsedUrl = url.parse(targetUrl)
const ext = path.extname(parsedUrl.pathname)
console.log(`ext: ${ext}`)
実行結果
$ node app.js
ext: .b