東京都防犯機器等購入緊急補助事業で防犯カメラを買う

概要

防犯カメラの要件

希望するカメラの要件は以下の通り。

機能 要件
電源 not 有線。ソーラーあるとよし(現在も電池交換は面倒)
映像確認 スマホアプリ。インターネット経由からできるとよい。
記録 ローカルでOK。クラウド出なくてもよい。1週間くらい保存できるとよい。
検知機能 動体検知だけでもよいが、人とか区別してくれると無駄な記録がなくてうれしい
構成 親機なしでカメラ単体で使えると楽。価格次第では親機ありでもよい
課金 月額無料!

防犯カメラの比較

Amazonから簡単に買える製品から比較します。

Anker Eufy

充電器やポータブル電源でお馴染み、安定のAnker。

月額0円。自動パンチルト型から人感センサー照明とのセット型など幅広いラインナップ。スマホアプリで外出先からの映像確認も可能。別途HomeBase(約13,000円)を設置することで、データ保存をカメラからHomeBaseに変更したり、AIによる家族と見知らぬ人の顔認識などが可能になります。 取付サービスとの連携もあり(他でも使えそうですが)。

Anker Eufyの主なカメラは以下。S340, E30はカメラが360°回転して様々な角度から撮影できます。S120はセンサーライトと同じような見た目でスマートに設置できそうですね。

Tapo

ネットワーク製品に強いTP-Link。

月額0円。スマートAI検知機能で人物、ペット、車両を正確に通知。有料のTapo Careに登録することでデータのクラウド保存やより高機能な検知機能が利用可能です。

Tapoの主なカメラは以下。C660は360度撮影可能です。C460は土台との接続がマグネットなので、ソーラーパネルでの充電が足りなかった時に本体を外して充電するのが容易です。C410は1万円を切る安さが魅力ですね。

Ring

Amazonの監視カメラです。

ローカルストレージがなく、月350円からのサブスク登録しないと録画ができません。Amazonで防犯カメラを探すとよく出てきますが、月額支払いがしたくない人は注意しましょう。ただ、Ringも私が利用しているArloも初めは月額使用料の仕組みはありませんでした。上記で紹介しているAnker EufyやTapoも今後有料にならないとは限らない点については注意してください。

比較

月額支払いのないAnker EufyとTapoの上位機種を比較してみました。基本機能には大きな違いはなく、1点違うところといえばAnker Eufy SoloCam S340 はmicroSDに対応しておらず内臓8GBにしか対応していない点でしょうか。1回の録画が10数秒程度なので1時間に10回録画しても1か月弱くらいは録画できそうなので長期間残す必要がなければ十分かと思います。

機能 Anker Eufy SoloCam S340 Tapo C660 KIT
価格 19,990 22,800
電源 ソーラー。電池取外し不可 ソーラー。電池取外し不可
画角 135°首振り有 105°首振り有
AI 人物、車(HomeBaseと組合せで顔認証) 人物、ペット、車
記録 内臓8GB(24時間) microSD最大512GB(379時間)、クラウド保存(有料)
その他 自動追尾,カラーナイトビジョン,双方向通話,ライト 検知エリア指定,双方向通話,ライト,Alexa連携

設置するときには

Amazonで購入する場合「屋外カメラの設置・設定サービス」が利用可能です。コンセント付けたりする場合は別料金取られるので注意してください。なお、東京都の補助金では施工費も補助対象となります。

また、壁に直接ネジ付けするのは.....という方向けには以下のような突っ張り棒型や、竪樋に括り付けるキットも販売されていたりするので、こちらの活用も検討しましょう。

参考サイト

MacでenthumbleのHJKL(vi) modeをKarabinerで再現

2015/03/15 追記
こちらの方法の方が簡単です!無変換キーも無効にならない!qiita.com

### 追記ここまで ###

Windowsでenthumbleを使っているのですが、無変換キーをベースとしたキーバインドに慣れきってしまっており、Macでも同じように無変換+HJKLで移動したり、無変換+SpaceでEnterにしたくなりました。

そこでKarabiner(旧KeyRemap4MacBook)を使って再現してみました。

無変換(=英数)キーがデフォルトではModifierFlagに登録されていないため、別途登録する必要があるのがミソです。private.xmlは以下の通り。
# 一部オレオレ設定が入っています。

<?xml version="1.0"?>
<root>
  <list>
    <item>
      <name>Private</name>
      <list>
        <item>
          <name>Enthumble Mock</name>
	  <list>
            <modifierdef>JIS_EISUU</modifierdef>
            <item>
                <name>change JIS_EISU to modifier key</name>
                <identifier>private.modifier.jis_eisuu</identifier>
                <autogen>__KeyToKey__ KeyCode::JIS_EISUU, KeyCode::VK_MODIFIER_JIS_EISUU</autogen>
            </item>

            <item>
              <name>EISUU + HJKL -> Left,Down,Up,Right</name>
              <identifier>remap.eisuu_hjkl_to_cursor</identifier>
              <autogen>__KeyToKey__ KeyCode::H, ModifierFlag::JIS_EISUU, KeyCode::CURSOR_LEFT</autogen>
              <autogen>__KeyToKey__ KeyCode::J, ModifierFlag::JIS_EISUU, KeyCode::CURSOR_DOWN</autogen>
              <autogen>__KeyToKey__ KeyCode::K, ModifierFlag::JIS_EISUU, KeyCode::CURSOR_UP</autogen>
              <autogen>__KeyToKey__ KeyCode::L, ModifierFlag::JIS_EISUU, KeyCode::CURSOR_RIGHT</autogen>         
            </item>

            <item>
              <name>EISUU + AE -> Home,End</name>
              <identifier>remap.eisuu_ae_to_home_end</identifier>
              <autogen>__KeyToKey__ KeyCode::A, ModifierFlag::JIS_EISUU, KeyCode::CURSOR_LEFT, ModifierFlag::COMMAND_L</autogen>
              <autogen>__KeyToKey__ KeyCode::E, ModifierFlag::JIS_EISUU, KeyCode::CURSOR_RIGHT, ModifierFlag::COMMAND_L</autogen>         
            </item>

            <item>
              <name>EISUU + UD -> PageUp,PageDown</name>
              <identifier>remap.eisuu_ud_to_page_up_down</identifier>
              <autogen>__KeyToKey__ KeyCode::U, ModifierFlag::JIS_EISUU, KeyCode::PAGEUP</autogen>
              <autogen>__KeyToKey__ KeyCode::D, ModifierFlag::JIS_EISUU, KeyCode::PAGEDOWN</autogen>         
            </item>

            <item>
              <name>EISUU + Spase -> Enter</name>
              <identifier>remap.eisuu_space_to_enter</identifier>
              <autogen>__KeyToKey__ KeyCode::SPACE, ModifierFlag::JIS_EISUU, KeyCode::ENTER</autogen>     
            </item>

            <item>
              <name>EISUU + N -> Backspace (Delete)</name>
              <identifier>remap.eisuu_n_to_backspace</identifier>
              <autogen>__KeyToKey__ KeyCode::N, ModifierFlag::JIS_EISUU, KeyCode::DELETE</autogen>     
            </item>

          </list>
        </item>
      </list>
    </item>
  </list>
</root>

HerokuにJavaアプリをデプロイしてみた。

Herokuを試してみたかったので、https://devcenter.heroku.com/articles/getting-started-with-heroku-eclipseに従ってやってみる。

EclipseにHerokuプラグインをインストールする。

Eclipseの[Help]→[Install new Software] で以下のサイトを追加する。

表示された「Heroku Eclipse Integration」にチェックを入れて[Next]を2回。表示されたライセンスをacceptして[Finish]。インストール後にEclipseが再起動される。

APIキー設定

Ecliseで[Window]>[Preferences]>[Heroku]を選択。[Email]、[Password]を入力して、[Login]ボタンを押す。[API Key]が自動的に入力される。

SSHキーの作成と設定。

eGitを使ってHerokuと接続するために必要。Eclipseで[Window]>[Preferences]>[General]>[Network Connections]>[SSH2]を選択する。[Key Management]タグを選択し、[Generate RSA Key...]を押す。[Save Private Key...]を押して、[OK]を押してファイルとして保存する。保存したファイルをPreferencesの[Heroku]にて、[Load SSH Key]を押して読み込ませ、[Add]ボタンでHerokuにSSHキーを追加する。

テンプレートからアプリを作成する。

[File]>[New]>[Other]>[Heroku]>[Create Heroku App from Template]を選択し、[Next]。テンプレートを選択し、アプリ名を設定する。アプリ名を指定しない場合、Herokuが自動的にアプリ名を設定してくれる。
テンプレートを「Spring MVC & Tomcat application」、アプリ名を「heroku-spring-mvc-sample」とした。
が、失敗。どうやらSSH系の設定が良くないらしい。

Gitリポジトリからcloneする。

ググったところどうやら1回、eGitでHerokuからcloneすると良いらしい。Heroku側にアプリケーションはできていたので、Herokuのアプリケーションの[Setting]>[Info]に記載されているgitのURLからeGitでCloneする。

Protocolなどは選ばずに、そのまま[Next]>[Next]>[Finish]。
Working Directoryを右クリックして、[Import Projects...]。[Import as general project]を選んで[Finish]。
Java EEのPespectiveに戻って、インポートされたプロジェクトを右クリックして、[Configure]>[Convert to Maven Projects]、でMavanプロジェクトとなる。そのままEclipse上で[Run as]>[Run on Server]で、ローカルTomcat上で起動できる。

動作確認

Herokuのアプリケーション管理画面のアプリケーション名の横にあるリンクか、SettingsのDomainsでドメインを確認してアクセスしてみる。こんなページが出れば成功。

「./people」にアクセスすればサンプルのアプリが確認できる。

もし、以下の画面が出てしまったら、デプロイ後に1時間以上アクセスがなくて停止してしまっている。再起動すればOK。

EclipseでHerokuの[My Heroku Applications]Viewを開いて、アプリケーションを右クリック→[Restart]を選択すれば起動する(管理画面からもできそうな気はするが...)。

以上

とりえあずサンプルは動かすことができた。gitリポジトリにコミットするだけでリリースされるのはすごいね。

「Web x Java - HTML5で進化したWeb標準を、Java技術でどう扱うのか? -」に参加してきました。

久しぶりにセミナに参加してきたのでメモ。

今のWeb標準Struts/Javaの問題(仮)

Strtusが対応していないもの。

Strutsが対応していない!
→ 独自flameworkの開発!
→ ベンダー(SIer)ロックイン&技術のガラパゴス化

# カスタムタグ作りすぎて、flameworkに沿ったJSPの書き方を
# 一から覚え直したりね...。


Web界はHTML5ガラパゴス化(ブラウザ間の差異)から脱出(標準化)を進めている。
→ サーバサイド(Java)側はどうする???

Java EE の概要と HTML 5 の取り組み

10年前はStruts+Spring+Hibernate(通称SSH)が流行りだったが今はどうか。


寺田さんがもうやめましょうと訴えたいのは以下の2つ。

  • Struts(1.x はEOL)
  • Tomcat(理由はよくわからんけどGlassFishがあるから?EEのWebプロファイルにしか対応していないから?)

TomcatはともかくStrutsは避けたいな。


2012年のEclipse ServeyでもStruts1.x, 2.xを使いたい人は殆どいなかった。


Struts+Spring+Hibernateはメンテナンスコストが大!
今後Strutsでバグが出たら、誰がその修正の影響範囲を調査・試験する??
→ その点、Java EE ならJSFCDIJPAをトータルで管理してますよー。
JBossの保守はサポートしてくれるらしい。
SAStrutsStrutsにバグ出たら治すって言ってた気がする。
# それなりに保守される上位flameworkを使っていれば平気?


Java EE 7ではWebSocketやJAX-RSが標準装備されているので、viewとmodelをサーバ側で結合せずに、別々に取得することができる(modelだけ取得可能)。


WebSocket vs JAX-RS
→WebSocketはHTTP Headerなどを送信するのがはじめの1度のみなので、パフォーマンス的にはWebSocketが有利か。


Java EE 7の良い所

  • JMSの実行が簡単になった。
  • JAX-RSがWebプロファイルに入った。
  • Java EE上でスレッドを作れるようになった。

# 作ろうと思ったことがなかった...。
# 今までは作るとAPサーバと別プロセスにスレッドができて管理しづらいらしい。

Strutsから移行する人のためのJSF基礎


なぜJSF


作れるUI

# 普通のJavaScriptからのAjaxは使えるのかな?
# その時はJAX-RSでも使えばよいのかしら。


拡張ライブラリ

拡張ライブラリ使用上の注意
「※ただし、ブラウザ最新版に限る。」

移行ポイントの詳細はスライドを参照。

  • managed-baenの定義はXMLでもアノテーションでも。
  • JSPと違ってServletに変換されない→エラー時はStackTraceにXHTMLの行数が表示。
  • 画面側でのvalidationを標準装備。

# サーバ側でのvalidationとエラー時の表示は共通化できるのかしら?

  • RequestProcessor の processXXX 系の処理は全てPhaseListenerで外から実装できる。


JSF利用時の注意

  • JSF 1.x はStrutsよりヤバイ。
  • XHTMLはタグライブラリも良いけど、そのままブラウザで見れるjsfc属性を使うのがオススメ。ただし、EE 6とEE 7で属性名が違う。
  • 独自セッション管理するな!(flameworkがセッションを使いまくります。)
  • メモリを大量に積んでおけ!Strutsより倍から10倍だ!(flameworkがセッションを使いまくります。)

JavaプログラマのためのScalaプログラミング

JavaからScalaへ ~ScalaでWeb開発はこう変わる~

Scala系は気が向いた時にでも。全く知らなかったので勉強になりました。

Maven, Seleniumを使った受け入れテストの自動化

Apache Maven 3クックブック Javaソフトウェア開発のための特選レシピ集

Apache Maven 3クックブック Javaソフトウェア開発のための特選レシピ集

上記の書籍を使ってMavenの勉強中なのだが、「2.6 受け入れテストを自動化する」で書籍の内容通りにコーディングをしてもうまく動作しなかったので、うまく動作した結果を残しておく。

環境

Mavanプロジェクトの生成

Webアプリケーションプロジェクトを生成する

$ mvn archetype:generate -DgroupId=net.kuronicle.maven -DartifactId=webappsample
 -DarchetypeArtifactId=maven-archetype-webapp

jUnitのバージョン設定

pom.xmljUnitのバージョンを4.8.2とする。

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.8.1</version>
      <scope>test</scope>
    </dependency>

Seleniumライブラリの追加

pom.xmlのdependenciesに以下を追加することで、Seleniumに必要なライブラリがインポートされる。

    <dependency>
      <groupId>org.seleniumhq.selenium</groupId>
      <artifactId>selenium-java</artifactId>
      <version>2.24.1</version>
      <scope>test</scope>
    </dependency>

テスト対象の用意

デフォルトで存在する/src/main/webapp/index.jspを利用する。

<html>
  <body>
    <h2>Hello World!</h2>
  </body>
</html>

Seleniumテストコードの作成

/src/test/java/Selenium2Example.javaを作成する。

import static org.junit.Assert.*;

import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

public class Selenium2Example {

    @Test
    public void testHelloWorld() {
        WebDriver driver = new FirefoxDriver();
        try {
            driver.get("http://localhost:8080/webappsample/index.jsp");
            WebElement element = driver.findElement(By.tagName("h2"));
            assertEquals("Hello World!", element.getText());
        } catch (Exception e) {
            fail(e.getMessage());
        } finally {
            driver.quit();
        }
    }
}

integration-testフェーズの設定

pom.xmlにintegration-testの前後でJettyを起動・停止する設定と、integration-testで先ほど作成したSeleniumテストケースを実行する設定を追加する。

  <build>
    <finalName>webappsample</finalName>

    <plugins>
      <!-- JDK1.6でコンパイル -->
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>

      <!-- integration-testフェーズ前後にJetty起動停止 -->
      <plugin>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>maven-jetty-plugin</artifactId>
        <version>${maven-jetty-plugin.version}</version>
        <executions>
          <execution>
            <id>start-jetty</id>
            <phase>pre-integration-test</phase>
            <goals>
              <goal>run</goal>
            </goals>
            <configuration>
              <scanIntervalSeconds>0</scanIntervalSeconds>
              <daemon>true</daemon>
            </configuration>
          </execution>
          <execution>
            <id>stop-jetty</id>
            <phase>post-integration-test</phase>
            <goals>
              <goal>stop</goal>
            </goals>
            <configuration>
              <stopKey>foo</stopKey>
              <stopPort>9999</stopPort>
            </configuration>
          </execution>
        </executions>
      </plugin>

      <!-- integration-testフェーズでSeleniumテストケース(*Selenium*.java)を実行 -->
      <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <executions>
          <execution>
            <id>selenium-test</id>
            <phase>integration-test</phase>
            <goals>
              <goal>test</goal>
            </goals>
            <configuration>
              <includes>
                <include>**/*Selenium*.java</include>
              </includes>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

integration-testの実行

integration-testを実行する。Firefoxが自動的に立ち上がり、試験が実行される。

$ mvn integration-test

以上。
なぜ書籍のサンプルコードが動かなかったのかは結局わからず…。

レジストリをいじってキーボードレイアウトをカスタマイズ


キーボードにHappyHackingKeybordLite2を使っているんだけど、WindowsキーがFnキーを利用しないと機能しないため、面倒。
ということで半角/全角キーと左Windowsキーを入れ替えました。

  • [スタート]→[ファイル名を指定して実行]→「regedit」と入力して[OK]
  • 「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout」を右クリック
  • [新規]-[バイナリ値]
  • 新しい値の名前を「Scancode Map」とする
  • 「Scancode Map」をダブルクリックし、以下の値を設定

00 00 00 00 00 00 00 00
03 00 00 00 5B E0 29 00
29 00 5B E0 00 00 00 00

  • 再ログイン or 再起動

設定値の詳細などは下記のサイトを参照のこと。

Windows Vista/XP/2000/NT4.0のキー配列の変更方法

ちなみに自分は、

  • 無変換キー → IMEオフ
  • 変換キー → IMEオン

に設定しているので半角/全角キーをWindowsキーにしてしまったw