投稿

RFC 7230 HTTPのABNF拡張を考えている

最近ABNF界隈のテストでRFCに書かれているABNFをいろいろ実装してみているのですが、ABNFを拡張したものがいくつかあり、RFC 7230 HTTPでは *の他に#というのが追加されていて、ABNFをわかっていないのか、なぜか中途半端なところまでしか書かれていない。 というわけでどうやって実装しようか悩んでみて拡張を投入してみた。 RFC 2373 IPv6 RFC 2396 URI RFC 3986 URI RFC 3987 IRI RFC 6874 RFC 7230 HTTP RFC 8259 JSON このあたりのABNFを実装したりしなかったりしてGitHubへ投下してみたり。

NFCからIFTTTのIoTへ繋げるヒント

Google Homeなどで家電の操作ができ、ほとんどリモコンは必要なくなってきていたりしますが、素早く操作したいこともあるのでAndroidで操作画面を開いてアプリを開いてボタンを押す、みたいな長々とした操作をなんとかしたいところ。 というわけで、イベント駆動にNFCタグを使ってIFTTTをつつく方法を探してみたりしていました。IFTTTから先は連携できる機器が沢山あるので省略。 AndroidのIFTTTでもトリガーにNFCタグを読み取るという機能はないので、 NFCタグ側でなんとかしてみたいところです。 部屋の前で電気をつけたり、音楽を再生したり、音声操作が苦手でもNFCタグにタッチでできるようになったりならなかったり。 NFCタグ→URL→IFTTT NFCに埋め込めるのは、アプリ固有の情報、URLなどいくつかあります。NFCからIFTTTに連携できそうなアプリはないようです。IFTTT側ではURLをトリガーにすることができるようなのでNFCタグにURLを埋め込み、タッチしてAndroidのブラウザで開くとIFTTTが動くという方向で考えてみます。 前提条件(制限事項) FelicaではないのでAndroid画面が使える状態でしかNFCタグには反応しません。たぶん。 数回操作があります。 ブラウザで開くので閉じるのが面倒です。 IFTTTのWebhooks IFTTTをURLからつつくには、Webhooksというのがあるようです。IFTTTの画面が迷路のようなのでどこに何があるのかさっぱり…。 Appletにする PCだと、IFTTTサイトのCreate でAppletを作ることができます。 If +This then That ThisでWebhooksを探します。基本設定があるかもしれません。(Step 1 of 6) ひとつしかないので Receive a web request を選び、英数で?イベント名を入力します。(Step 2 of 6) Thatで操作対象サービスを選びます (Step 3 of 6) 操作を選びます。(Step 4 of 6) ボタンなどを選択します (Step 5 of 6) できあがった機能に名前をつけて確認してFinish (Step 6 of 6) 追加した...

Raspberry PiのTomcat 9にLet's Encryptを

Raspberry Piといえども最近はTLSが必要らしいので早々にTLS化する必要があります。 Let's Encryptを使用してみました。 # apt-get install python-certbot-apache というのでいろいろインストールされた。 いろいろつついてしまった中で、最初はメールアドレスやライセンスの質問があった気がします。 とりあえず全部rootで実行してしまいましたがtomcatかなにかで使えるのかな? 何度か試してみた後… # certbot certonly -d siisise.net How would you like to authenticate with the ACME CA? (認証方法どないする?) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: Apache Web Server plugin (apache) (Apacheのプラグイン使う) 2: Spin up a temporary webserver (standalone) (仮の独立Webサーバ立ててサインアップする) 3: Place files in webroot directory (webroot) (webのrootディレクトリにファイル置いて認証する) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 3つの選択肢、サーバを止められるなら2、止められないなら3かな とりあえず2と3で試してみた。ワイルドカード証明書はこれとは別でDNSを使うと取れるらしいです。 2の場合はポート80を使っているサーバを止めてから実行するだけ。 # service tomcat9 stop を先に実行しておく 仮のサーバが起動し、ドメイン接続確認後、 /etc/letsencrypt/live/siisise.net/ に各種ファイルを作ってくれました。developer.jpも同じように作成。 3の場合は Plugins selected: Authenticato...

Raspberry PiでTomcat 9とPostgreSQLをぐりぐりする

Raspberry Pi Zero WでJava SE 8が使えるようになったところでApache TomcatやPostgreSQLを使いたいのです。アクセス負荷に耐えられるようmicroSDカードは大容量や高耐久のものにしてみたのでした。 Tomcatは9だった tomcatはパッケージを入れても動くのですが、常時動いてほしいのでaptで取ってくるとどうなるのかというお試し。最新のTomcat 9はJDK 8でも動きます。 # apt-get install tomcat9 で、だいたい入ります。tomcat9-admin も入れてみるといいのでしょうか。 他のパッケージはtomcat9-docs, tomcat9-examples, tomcat9-users とあるようです。 /usr/share/tomcat9 がCATALINA_HOME、/var/lib/tomcat9 がCATALINA_BASE となり、tomcatグループとユーザも作られ、サーバもtomcat権限で動いています。アプリ系のアカウントは基本rootやsudoで作業すればいいのでパスワードを設定してはいけません。 CATALINA_HOMEは基本的に触れません。CATALINA_BASEのconf内をいろいろカスタマイズすることで、いろいろと動いてくれます。/etc/tomcat9 にリンクされています。 初期ポートは8080なので、conf/server.xml でport 80にしたり、複数仮想サーバを作ったりできます。 サービス開始/停止は # service tomcat9 start # service tomcat9 stop でできるようです。どこに設定があるのかよくわからない。 RedHat系で/etc/rc.d/init.d/ にあるようなものは /etc/default/ にあるのかな。 Webはオートデプロイにして、webapps相当のグループをtomcatにして書き込みもできるようにしておくと、管理も楽かもしれませぬ。 PostgreSQLはもう11か Raspberry Pi Zero WとWH、ふたつあるのでTomcatとは別の方にPostgreSQL入れます。 # apt-get install postgresql...

RazpberryPi Zero WでJavaを使おう

というわけでRaspberryPiどころか家でPCにも触ってなかったのですが最近Ryzen 5 2600XなPCを組んでからプログラミングやらいろいろ再開中で、RaspberryPiでWebサーバでもと思ったら2Bが行方不明なのでZero Wを買って挑戦してみることに。 いろいろ罠にはまります。 RaspberryPi Zero WとWHをスイッチサイエンスで1つずつ購入 microSDXCカード 128GBを2枚購入していた(危険 class 10、UHS-Ⅰ Speed Class 1、A1対応) microSDHC 8~32GBが推奨 USBキーボードがなかった(Logiのワイヤレスドングルので可。SANWAのキーボードもあった) てきとーなmicroUSBで繋がる電源 PuTTYとWinSCPでリモート接続 本体の選択 まずは本体の選択、初心者はできれば3B+かな。Zeroは2台目以降でもいいのかもしれない。 フルサイズUSB端子がある、有線LANがある、無線LANもある、HDMIがフルサイズ、などの理由です。変換ケーブル類も高いので予備がないなら3B+です。 Zero Wは、シングルコアARMv6、microUSB OTGがある、有線LANがない、無線LANがある、HDMIがminiサイズ、といろいろと不便です。Zeroになると無線LANまでないので別途用意しないといけません。 Javaを動かしたいならARMv7以降のCPUのものを選ぼう。NOOBSにはARMv7対応のJava11くらいが入っていた。Zero WはARMv6です。あとで対応したJavaを探します。 メモリーカード、OSの選択 メモリーカードの設定から入ります。microSDHC、microSDXCが使えますが、推奨は8GB以上のようです。microSDXCはフォーマットがFAT32ではないという理由で初心者にはおすすめしません。というわけで、初心者向けの容量は8GBから32GBの間で選びます。挑戦したい人はmicroSDXCも今は512GBくらいまであるので選び放題です。 速度など容量以外の選択基準では、class10、UHS不要、A1かA2対応のスマホ用に最適化されているようなものや、書き換えに高耐久なもの、がおすすめです。PCで最初に書き込むのが速...

Ryzen 5 2600XでAndroid Studio のx86エミュレータを使えないWindows May 2019 Update

WindowsのAndroid StudioではAndroidのエミュレータが使えるのですが、x86版のエミュレータにはIntelのVT-xかAMDのSVMをUEFI(BIOS)上で有効にする必要があります。 今回はAMD Ryzen 5 2600xなので初回セットアップでVT-xつかえないよといわれ、UEFI上でSVMを有効にしてみました。OSのバグかなにかで失敗したのですが、いろいろ調べた挙げ句のメモです。 AndroidエミュレータがAMD CPUとHyper-V に対応した、というニュースのAMD CPUとHyper-Vは別々の話なので混ぜるな注意です。Hyper-VはAMD CPUにたいおうしていないっぽいたぶん。 Android Studioでエミュレータを動かす条件 3種類 Intel VT-x AMD SVM Microsoft Hyper-V どれかが必要、ということらしいので今回はAMD SVMを有効にする方法 今回の前提 AMD Ryzen CPU Windows 10 Pro April 2018 Update 以降 (Homeでも可?) Windows 10 バージョン 1903 (OS ビルド 18362.239) (失敗するバージョン) Android Studio 3.4.2 (3.2 Beta以降) Avastかなにかのソフト使ってないこと 状態の確認 Windowsのバージョンを確認します。 スタートメニューを右クリックで「システム(Y)」を開き、Windowsの仕様というところにバージョンとOSビルドがあります。 コマンドプロンプトでwinver と入力してもバージョンが確認できます。 バージョン1903 (OS ビルド 18362.239) と出てくればバグ持ちなのでエミュレータは動きません。(注 : 7月末のKB4505903のアップデートでOS ビルド 18362.267になり修正されました) エミュレータが実行可能なのは現状では1803と1809です。 Windows Insider Programで18932を使用するとエミュレータが利用可能という情報もありますが、元には戻せません。 AMD RyzenでAndroid x86エミュレータの利用可能状況(1803以降...

MavenでTomcatにJAX-RSのせるだけ

TomcatにはJava EE 改め Jakarta EEのWeb系の機能しか載っていないので、その他のサービスを利用するにはwarの中に封じ込めてあげるのが楽です。 とりあえずJDK 12 + Apache NetBeans IDE 11.0の場合 Mavenで構築、Tomcatに公開する場合です。 GlassFishのJAX-RSライブラリを使います。 MavenでWebつくる JAX-RS の機能でRESTfulなものを作る Servlet相当のクラスをひとつ作り、タグだけつけます。Applicationというクラスを継承するようです。@ApplicationPath で公開パスを決めます。 package net.siisise.example.rest; import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; @ApplicationPath("/api") public class RestSetup extends Application { } 次に機能のclassを作ります。 @の機能は推測どおりかと思うので GET /api/menu/hello に公開されます。 package net.siisise.example.rest; @Path("/menu") public class Mmmmm {     @Path("/hello")     @GET     @Produces(MediaType.TEXT_PLAIN)     public String exHelloName() {         return "おはよう";     } } そのまま公開してもTomcatではライブラリ等不足しています。 web.xml の編集。GlassFishサーバの設定をしていると、<dependencies> にjavaee-web-api があるかもしれません。 ...