著者アーカイブ takahashi

takahashi 著者:takahashi

【これはスゴイ】MSがARM版Windows10を発表。win32アプリケーションも動くぞ!

今朝ふとSNSを見ていたら、何気なく凄いニュースが出ていました。

明らかになってきたArm版Windows 10の課題とそのメリット – PC Watch

以前から登場が噂されていたARM版Windows10が、Snapdragonの大手開発元の一つであるQualcommのイベントで発表されたとのこと。これだけ聞くと、ユーザーが増えず、失敗に終わったといわれるARM専用の “WindowsRT” の二の舞感がありますが、今回は一味違うようです。


Windows RTは機能制限版で、x86命令のWin32のデスクトップアプリケーションは使うことができず、利用できるのはWindows Store経由で提供されるストアアプリケーション(現在UWPと呼ばれているアプリケーションの前身)のみだった。しかし、Arm版Windows 10では、前述のとおり、x86命令(32bit)をArm v8命令(64bit)に変換して実行できるため、32bitのデスクトップアプリケーションをそのままで実行できる。

また、OSのSKUも、今回の2製品にプリインストールされていたのはWindows 10 Sだったが、Windows 10 Home、Windows 10 Proも用意されており、ユーザーはMicrosoft StoreでWindows 10 Proへのアップグレード権を購入して、OSをWindows 10 Proにアップグレードして利用することができ、その場合は任意のWin32のデスクトップアプリケーション(たとえばAdobeのCreative Cloudなど)を実行できるようになる。


なんと、ARMのCPU上でもintel向けにビルドされた従来のWindowsアプリケーション(win32アプリケーション)が動作できるらしい!!
今までデスクトップ向けでARM上で動作するOS自体は出ていました。

特に、カーネルや周辺パッケージのソースが公開されているLinux系OSでは、ARM系のCPUが出始めたころから対応しているディストリビュージョンも複数出ていました。
ところが、Linuxではアーキテクチャ間の互換機能はなく、ARMでアプリを動作させるにはARM向けにビルドする必要がありました。(実はLinuxの場合、同じintel系向けでも、32bit用、64bit用それぞれ向けにビルドされたものでないと動作しない場合がほとんどです。)

Windowsでは今までにも64bitのintel系CPUでも32bitアプリが動作するような仕組みを導入していたり、最近では、LinuxそのものをWindows上で動かしてLinuxアプリを実行させる環境を提供するwindows subsystem for linuxなど、他のシステム向けのものをWindows上で簡単に動作できるようにいろいろ工夫してきていました。

まさかそれが完全にアーキテクチャの壁も超えて行われるとは想像してもいなかったですが、これならARMでも安心して使えるようになるかもしれませんね。
なお、動作できるのはintel 32bitCPU向けにビルドされたアプリのみで、64bit向けのアプリは残念ながら非対応とのことです。

同ニュースによると、動作した感じは

OEMメーカーの関係者によれば、OEMメーカーで一般的に言われているのは、Cherry Trailよりは速いが、Coreプロセッサよりは遅い、そのあたりの性能だと認識されている点。実際筆者もさわって、Officeの起動などを行なってみたが、Cherry Trailよりは速いかなという印象だった。実際、手持ちの第7世代Core i7と比べてみたが、Officeの起動は俄然Coreプロセッサのほうが速かった。

とのこと。
重い処理は依然としてx86系CPUの方が優れていますが、モバイルPCとしてなら非常に優れたガジェットになるかもしれませんね。

ARM版Windows10の発売が楽しみです。

※ Windows は米国 Microsoft Corporation の米国およびその他の国における登録商標です。
takahashi 著者:takahashi

mac OSのchromeで、アプリモードでWebサイトを開く方法

高橋です。

僕は普段からブラウザにGoogleChromeを利用しています。
GoogleChromeはWindowsでもMacでも動作するので、どちらのOSを使うときもChromeをメインで使っているのですが、PCではWebアプリを使う機会が多いので、Chromeのアプリモードを愛用していました。

ところが…

Windows版にはあるこのメニューが

Mac版だとありません…
Chromeのアプリ一覧画面にもショートカットを作成するメニューが無いので、Mac版がてっきり非対応なのだと思っていたのですが、最近いろいろ調べていたらたまたま情報を発見しました。

Google Chrome のアプリモードでウェブページを開く – mattintosh note

例えばターミナルで

open -n -a 'Google Chrome' --args '--app=http://example.com'

のようにすればアプリモードで起動できました。

ただ、ショートカットの作成は行ってくれないので

MacのGoogleChromeをDockから起動オプション付きで開く方法- karakaram-blog

上記サイトで掲載されているAutomaterを使用すればapp化もできます。

MacでWebアプリを愛用している皆さん、ぜひお試しあれ!

takahashi 著者:takahashi

モバイル版Chrome/SafariでWebページをWebアプリケーション表示させる方法

高橋です。

モバイル版のChromeやSafariには、特定のページのショートカットを作る機能がついています。

使ったことがある方もいらっしゃるのではないでしょうか?
僕もキャリアが提供するWebメールなどで、画面をすぐに開けるようにするためによく使っています。

さて、このショートカットを作る機能ですが、サイトによって動作が異なることはご存知でしょうか?
例えば、ショートカット化したAmazonのショッピング画面を開くと、

こんな感じで通常のブラウザ画面で表示されます。
一方、Softbank のS!メールどこでもアクセス をショートカット化すると…

開いたときにスプラッシュ画面が!

ブラウザのアドレスバーの表示も消え、まるでアプリのような見た目になりました。

この表示の違いは、対象のページのheadタグに次のようなmetaタグが入っていると起こります。

<head>
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-title" content="サイト名">
</head>

この2行を入れておくと、モバイル版のSafari、Chromeで作成したショートカットから起動すると、URLバーが消え、アプリのような表示になるというわけです。
もし、スマホ・タブレット向けに作っているページがあり、Webアプリとして使ってほしい、URLバーを消した状態で使ってほしい、というときに便利です。

一方で、ブラウザ側でこの切替を行う設定は今のところないようなので、ユーザー側ではコントロールを行うことができません。
この点は注意が必要そうです。

モバイル用のWebアプリを作成している方は、一度試してみてはいかがでしょうか。

takahashi 著者:takahashi

オープンソースでも有料ソフト並み 現像ソフト”RAW Thrapee”

高橋です。

皆さんは写真編集をされる際、普段どんなツールをお使いでしょうか?
以前まで、僕はWindows10に付属の”フォト”アプリを使って編集していました。


写真について知識がなくても簡単に触ることができますし、標準でありながら非常に使いやすい完成度の高いアプリとなっていて、ずっと愛用していました。
ところが、最近になって写真を大量に編集する機会が出てきまして、写真を一枚一枚開いて編集するのが大変な場面が徐々に出てきました。

そんななか、知人から無料でありながら超高性能な写真編集ツールを教えてもらいました。

RAWTherapeeです。
RAWTherapeeはオープンソースで開発が進められている現像、つまり写真編集に特化したソフトウェアです。

Windows標準の写真調整ツールとの大きな違いは、写真編集機能に加えて、ファイル管理機能が搭載されていること。
編集済み/未編集の管理や削除、保存の操作をすべてソフト上から一括で行うことができます。勿論、単体での保存も可能です。

左上にヒストグラムも搭載されています。

他にも、明るさや露出の調整や、色の濃さの調整など、Windows フォトアプリよりもさらに細かい調整が可能です。
比較として、有料の現像ソフト”Adobe Lightroom”とよく比較されますが、基本的にはほぼ同等の機能を持つといわれているようです。

僕みたいな初心者でも直感的に触れますし、機能的にも充実しているので、非常に優秀なアプリだと思います。

写真編集にお悩みの皆さん、是非一度試してみてはいかがでしょうか?

——————————————
RAW Therapee Blog(公式サイト)
http://rawtherapee.com/

フリーのRAW現像ソフト RawTherapee(RAWセラピー) – ぼくんちのTV別館
https://freesoft.tvbok.com/freesoft/image/rawtherapee.html

takahashi 著者:takahashi

【現在は解決済】mac OS High Sierraに深刻な脆弱性が発覚 root権限への昇格がだれても可能に

高橋です。
先週、macOS High Sierraのバージョン10.13.1で、とんでもない脆弱性が発覚しました。

今回問題になったのは、macでアプリのインストールや設定変更の際にパスワードを求めるこの画面。
管理者権限へ昇格する際の認証の画面なのですが、ここでidをrootとし、パスワードを何も入力せずに”ログイン”を連打するとログインできてしまうという状態だったとのこと。

macOSはUNIX系のOSなので、rootでかんたんに不正ログインできてしまうというのはかなりまずい事態です。
幸いなことにログインできてしまうのはこの認証画面に限られるので、外部からrootアカウントで直接侵入される…という心配はなかったようですが、セキュリティに厳しいイメージのあるAppleの製品からこの不具合が出たことに、かなり驚いた方も多かったのではないでしょうか。

不具合発覚後、Appleは緊急でセキュリティアップデートを発行し、合わせて謝罪のコメントを出しています。

現在は自動アップデート機能により何もしなくても適用されている状態とのことですが、アップデート配信後にmacOSを10.13.1へアップグレードした方はセキュリティアップデートが適用されていない可能性があるので、アップグレード後に再起動を行ってほしいとのことです。

Apple公式サイトによると、アップデートが適用されているかどうかは下記の方法で確認できるとのことです。


お使いの Mac にセキュリティアップデート 2017-001 が適用されているか確認するには、以下の手順を実行してください。
1.ターミナル App を開きます (「アプリケーション」フォルダの「ユーティリティ」フォルダにあります)。
2.「what /usr/libexec/opendirectoryd」と入力して「return」キーを押します。
3.セキュリティアップデート 2017-001 が正常にインストールされている場合は、以下のいずれかのプロジェクトバージョン番号が表示されます。
opendirectoryd-483.1.5 on macOS High Sierra 10.13
opendirectoryd-483.20.7 on macOS High Sierra 10.13.1
Mac でルートユーザアカウントが必要な場合は、このアップデートを適用した後で、ルートユーザを有効にし直して、ルートユーザのパスワードを変更する必要があります。


参考サイト:
http://www.itmedia.co.jp/enterprise/articles/1711/30/news065.html
http://jp.techcrunch.com/2017/11/30/2017-11-29-apple-releases-a-macos-security-update-to-fix-huge-login-security-flaw/
https://support.apple.com/ja-jp/HT208315
takahashi 著者:takahashi

nginxでSSL設定をするときに気を付けたいこと

高橋です。

以前家で趣味でnginxを使ってサーバーを建てたときの話。
Nginxを後ろに控えているWebサーバー(Apache)のリバースプロキシとして構築していました。

構成としてはサブドメインを割り当てたバーチャルホストが複数稼働している環境だったため、nginx側もバーチャルホストに対応すべく下のような設定にしていました。

 #省略...
 server {
  server_name  .example.com;

  listen          80;
  listen          443 ssl;

  ssl on;
  ssl_certificate      /ssl/to/path/example.com/fullchain.pem;
  ssl_certificate_key /ssl/to/path/example.com/privkey.pem;

  client_max_body_size 1g;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # クライアントの IP アドレス
  proxy_set_header X-Forwarded-Host $host; # オリジナルのホスト名。クライアントが Host リクエストヘッダで渡す。
  proxy_set_header X-Forwarded-Server $host; # プロキシサーバのホスト名
  proxy_set_header X-Real-IP $remote_addr;
  location / {
    proxy_pass https://xxx.xxx.xxx.xxx;
  }

}
   server {
  server_name  .a.example.com;

  listen          80;
  listen          443 ssl;

  ssl on;
  ssl_certificate      /ssl/to/path/a.example.com/fullchain.pem;
  ssl_certificate_key /ssl/to/path/a.example.com/privkey.pem;

  client_max_body_size 1g;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # クライアントの IP アドレス
  proxy_set_header X-Forwarded-Host $host; # オリジナルのホスト名。クライアントが Host リクエストヘッダで渡す。
  proxy_set_header X-Forwarded-Server $host; # プロキシサーバのホスト名
  proxy_set_header X-Real-IP $remote_addr;
  location / {
    proxy_pass https://xxx.xxx.xxx.xxx;
  }

}
#省略...&lt;span data-mce-type="bookmark" style="display: inline-block; width: 0px; overflow: hidden; line-height: 0;" class="mce_SELRES_start"&gt;&lt;/span&gt;

すると..

Bad Requestのエラーが発生。
いろいろ試してもエラーが解消されず頭を抱えていたのですが、調べていたら以下のサイトを発見。

nginx連載6回目: nginxの設定、その4 – TLS/SSLの設定 – インフラエンジニア way
https://heartbeats.jp/hbblog/2012/06/nginx06.html

>sslディレクティブをonに設定すると、SSLが有効になります。ただし、listenディレクティブでsslパラメータを指定したときには不要です。

>ssl on;

>listenディレクティブにsslパラメータを付けると、そのポートでSSLを有効にして待ち受けるようになります。そのポートに関して後述するsslディレクティブをonにしたのと同じ動作になるため、sslディレクティブの記述は不要になります。

>listen 443 ssl;

なるほど、
ssl on;
の記述をしてしまうと
server{}
内で定義されている全ポートにsslが有効になるので、80番ポートでアクセスしてもssl通信と解釈されてしまい、エラーが出ていたようです。
443ポートだけsslにしたい場合は

listen 443 ssl;

とだけ指定しておけば443ポートだけsslを有効にできるようです。
てっきり

“ssl on;”

を入れないとsslが有効にならないものと勘違いしていました(汗

さっきの設定を修正すると以下のようになりました。

 #省略...
 server {
  server_name  .example.com;

  listen          80;
  listen          443 ssl; #これは残しておく

  #ssl on; コメントアウト
  ssl_certificate      /ssl/to/path/example.com/fullchain.pem;
  ssl_certificate_key /ssl/to/path/example.com/privkey.pem;

  client_max_body_size 1g;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # クライアントの IP アドレス
  proxy_set_header X-Forwarded-Host $host; # オリジナルのホスト名。クライアントが Host リクエストヘッダで渡す。
  proxy_set_header X-Forwarded-Server $host; # プロキシサーバのホスト名
  proxy_set_header X-Real-IP $remote_addr;
  location / {
    proxy_pass https://xxx.xxx.xxx.xxx;
  }

}
   server {
  server_name  .a.example.com;

  listen          80;
  listen          443 ssl; #これは残しておく

  #ssl on; #コメントアウト
  ssl_certificate      /ssl/to/path/a.example.com/fullchain.pem;
  ssl_certificate_key /ssl/to/path/a.example.com/privkey.pem;

  client_max_body_size 1g;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # クライアントの IP アドレス
  proxy_set_header X-Forwarded-Host $host; # オリジナルのホスト名。クライアントが Host リクエストヘッダで渡す。
  proxy_set_header X-Forwarded-Server $host; # プロキシサーバのホスト名
  proxy_set_header X-Real-IP $remote_addr;
  location / {
    proxy_pass https://xxx.xxx.xxx.xxx;
  }

}
#省略...

これでnginxを再起動したところ、無事80番ポートの平文通信と443ポートのSSL通信両方ともできるようになりました。

Nginxは非常に細かい設定ができるのが人気の理由の一つですが、その分設定の仕方を理解しておかないとハマってしまうことも…

もっと勉強が必要だなぁ、と感じた瞬間でした…

takahashi 著者:takahashi

【使わないと3か月でデータが消える!?】SSDの意外な弱点

高橋です。


引用元:Gigazine

最近安価になりつつあることで普及し始めたSSDですが、以前からHDDと比較して様々な弱点があるといわれていました。
その中でも、一時期特に話題になっていたのが書き換え可能回数の問題。
フラッシュメモリが出てきたときにもよく言われていましたが、NAND型メモリには一定の回数書き換えを行ってしまうと、データが記憶できなくなるという特性があります。
メーカーやものによって耐久度は違ってきますが、同じNAND型メモリを使うSSDもまた、例に漏れずこの制限が存在しています。
ただ最近は、この寿命を伸ばす技術が発達してきていて実用上で心配をしなくても大丈夫になってきたようです。

SSDにデータを書込みまくり再起不能に追い込む耐久試験で分かった信頼性に関する真実とは? – Gigazine
> 余力を十分残しつつもエラー発生の可能性を検知すると、ストップをかけて最も早く脱落したIntel 335でさえ、毎日10GBのデータ書き換えを行っても7万日つまり約190年もつという計算になるため、SSDの書き換え寿命を心配する必要はほとんどないことは確実です。

これでSSDの弱点は目立つところは”HDDと比べて高い”という部分だけになったと考えていたのですが、先日ある事実を知りました。

先にも書いたように、SSDにはNAND型メモリがよく使われているのですが、この前ふと気になってNAND型メモリについてWikipediaで調べていたら、気になる記述を発見しました。

NAND型フラッシュメモリ – Wikipedia
>浮遊ゲート内の電子は、浮遊ゲートを覆う絶縁体により保持されるため、電源を供給することなくデータを数年間程度保持することができる。

お分かりいただけただろうか…

それってつまり、逆に言ってしまうと、”非通電状態では数年間しかデータを保持できない可能性がある。”
ということではないのか…?

気になったのでさらにいろいろ調べてみました。
すると、下記のような説明をしているサイトを発見。

SSDの基礎知識でパソコン購入をガイド – パソ兄さん
> トンネル酸化膜の絶縁によって電子の放出を防いでいますが、長期間書き換え作業が行われないと自然放電が起き、データ化けの原因になります。

と説明されていました。
SSDは電子を放出させないようにすることでデータを保持していますが、長期間通電を行わないとこの電子が放出されてしまい、データが消失してしまうようです。

どれぐらいの期間放置するとデータが消失してしまうのかは議論が分かれるところですが、最小(最も保管条件が悪かった場合など)で”3か月”しかデータが保持できない可能性もあるという話があります。
『中古SSD 無通電時間が長いとデータが消えますか?』 – 価格.com

僕はSSDにこのような特性があったことを恥ずかしながら今回初めて知ったのですが、僕以外にも”SSDは使っていなければ半永久的にデータが保存できる”と、それとなく思っていた方は少なくないのではないかな、と思います。

OSをインストールして使うような使い方であれば、3か月も電源を入れないということは少ないとは思うのですが、データ保存用となるとあり得ない話ではないな…と思いました。
ただ、データ保管用に…と使わないときはSSDを外して保管している方も、中にはいらっしゃるかもしれません。

それ故に、
「大事なデータをバックアップしておいたはずが…なんてこった…」
なんてことになる可能性もゼロではないかもしれませんね。

SSDはあくまで”一時保管用”という意識を頭の片隅に置いておいて、大事なデータは光学ディスクなどのより長持ちするメディアに退避しておくのが一番のようです。
どのメディアにも適材適所があり、用途に合わせて使い分けないといけないんだな、と改めて感じました。

今後SSDを購入予定の方はお気を付けください。

 

※この記事は、以前私が書いたものを一部修正したものです。
takahashi 著者:takahashi

【遂に動き出した5G通信】政府が5Gの新規参入を促進

高橋です。

Twitterモーメントで携帯回線の新通信規格 “5G” が取り上げられていました。


5G(5th Generation=第5世代移動通信システム)とは、4Gに続く現在規格化が進行中の次世代無線通信システムのこと。

第5世代移動通信システム – Wikipedia

4Gのアップグレード版になるので、当然4Gよりも性能が高くなるのですが、その上がり幅が凄い。
なんと理論値10Gbps以上の通信が行えるようになるとのこと。
現在の固定回線のFTTH(光ファイバー)も、大体理論値が1Gbpsぐらいなので、5Gが実稼働すればそれを大きく上回ることになります。
一方で、多接続可能かつ低遅延化と、IoT機器を意識した仕様も取り入れる予定だそうです。

そんな5Gですが、いままでMNO大手3社による寡占状態から脱却するために、政府が5Gに使われる電波帯域の割当制度を見直し、大手3社以外の新規参入を促進しようとしているとのこと。

次世代移動通信「5G」って何? 2020年の暮らしはどう変わる? – 価格.comマガジン

いままでも新しい通信業者を増やして価格競争を生むために、SIMロック解除義務化やMVNOの参入など、いろいろ措置は取られていましたが、携帯回線は飽くまでMNOの通信網をまた貸ししてもらう方法しかなく、根本的な解決になっていませんでした。

一方、今回は基地局が使う電波の割り当てを、現在のMNO以外にも行うかもしれないとのことで、これが実現すればもっと激しい価格競争が生まれて高い通信量が値下げされる可能性も出てきそうです。

5Gは2020年の実用化を目指しているということで、オリンピックが始まる頃には、大容量の通信網でいろいろなことができるようになっているかもしれませんね!

takahashi 著者:takahashi

Internet Explorer でGETが予期しない動作をする

高橋です。

現在開発中のシステムで、サーバー側のプログラム(PHP)へGETで値を渡す処理を書いていたのですが、InternetExplorerで実行すると何故か正常に値が渡せないという現象が発生していました。
他のブラウザでは問題なく動作するので、プログラム側の不具合ではないようなのですが、IEでアクセスする方も少なくないので、解決策を調べてみました。

1.URLが約2083文字を超えるとIEで扱えない

IE11で使用可能なURL文字数が2083文字しかない件 – 文系プログラマによるTIPSブログ
によると、InternetExplorerでは、URLの最長文字列長は2083文字までらしく、それ以上は認識できないとのこと。
GETでパラメーターを複数入れると、URLがどんどん長くなっていってしまうため、あまり渡す値が多い場合は注意が必要かもしれません。

2.Eで2番目以降のGETパラメータが実体参照になり値が取得できない

少し古い記事ですが
IEで2番目以降のGETパラメータが実体参照になり値が取得できないバグ – DevAchieve

によると、GETで渡すパラメーターの1個目と2個目の間にいれる&記号によって、2個目以降の値が実体参照として処理されてしまうことがあるとのこと。

他にもGETで渡したパラメーターの値が文字化けしてしまうケースなど、IEでは予期しない動作をしてしまうことがあるようです。

いろいろ考えた結果、デバッグの際はIE以外のブラウザでURL直打ちで値を渡せるGETを使い、うまく動くことを確認したらPOSTに切り替える方法で運用することにしました。

大抵のフレームワークではメソッドの判定を簡単に行うことができるように関数が用意されています。
例えばfuelでは

if( Input::method() == 'POST' ) {
   //POSTされた場合の処理
}
if( Input::method() == 'GET' ){
  //GETされた場合の処理
}

のように、メソッドに応じて処理を書き分けることもできます。
中の処理を同じものにしておけば、クライアント側の使用するメソッドを切り替えるだけで済むので便利です。

今後はIEを考慮しないWebアプリも増えていきそうですが、現時点ではIEがまだ現役で使われているところも多いかと思います。
他のブラウザとIEの互換性を確保するためには、いろいろ工夫していく必要がありそうです。

takahashi 著者:takahashi

位置情報配信プロトコルのNTRIPをNginxでリバースプロキシする方法

高橋です。

ご存知の方もいらっしゃるかもしれませんが、静岡大学浜松キャンパスに設置された高精度のGNSSアンテナを用いた測位情報を配信するシステム(hamamtsu-gnss.org)が整い、ついに浜松市内でRTK(リアルタイムキネマティック)ができる環境が整いました。

詳しくは
https://hamamatsu-gnss.org/
をご覧いただけましたら幸いです。

ざっくり説明するとRTKを行う際、実際に自分の位置を計測する”移動局(ローバー)”と、厳密な位置情報が既にわかっている場所に置かれた”固定局(ベース)”の2つが必要となってきます。したがって移動局は何らかの方法で固定局の情報を受信し続ける必要があるのですが、その方法として、”インターネット”経由で受信を行う方法があります。
今回開設されたhamamatsu-gnss.org局もインターネット経由で位置情報を配信するタイプの固定局で、配信プロトコルとして”NTRIP”と呼ばれるものを利用しています。

さて、そのhamamatsu-gnss.orgを開設する際に、”大学などでも受信できるように80番ポートで通信できるようにしてほしい。”という話がありました。
大学などの教育機関では、ネットワークに制限を設けているところが多く、80(http)、443(https)あたりの必要最低限のポートしか開けていないところも多くあります。
しかし、hamamatsu-gnss.orgのホームページも同様に80番ポートを使用するので、このままでは両立ができません。

最近はNode.jsやRuby on Railsなどが出回ってきて、同ホストに複数のWebサーバが立つことも少なくはなくなってきているので、今回のように一つのポートを取り合ってしまうような事態も往々にしてあります。こういう場合は”リバースプロキシ”という仕組みを用いることで一つのポートを複数のサーバープログラムで共有することができます。

今回も、まず思いついたのはこの方法だったのですが、今回共有させたいのはNTRIPという得体のしれないプロトコル。
いろいろ調べてみてもNTRIPとHTTPを同時にプロキシできるソフトやプログラムは見つけられませんでした。

どうしよかと困っていたところ、あることが判明。

http://gpspp.sakura.ne.jp/diary200703.htm
こちらのサイトで解説されているようにNTRIPはなんとHTTPベースのプロトコルでした…!(プロジェクトを共同で進めている木谷先生に教えていただきました。)

一応実験としてブラウザからNtip配信のポートに直繋ぎしてみたら、ちゃんとレスポンスが返ってきました。

telnetでも確認しましたが、ちゃんと応答が返ってきます。

しかし、NTRIPがHTTPのデータとして扱うことができるというのであれば話は早い。
上にあげたのと同様にリバースプロキシしてやれば共存させられます。

ということで早速設定。
リバースプロキシには非常に柔軟な設定ができる有能なNginxを使います。
(NginxはWebサーバーでありながらHTTP以外にもimapやpop、さらにはtcp(ドメインベースは不可)のプロキシができたりする、いい意味でかなり変態なソフトです。)

早速設定していきます。
一部省略してますが、以下のような設定にしました。

バーチャルホスト(https)

server {

  listen 443 default_server; #443番にアクセスされた時のデフォルトのバーチャルホストに設定

  ssl on;
  ssl_certificate /path/to/ssl.pem; #SSL証明書のパス
  ssl_certificate_key /path/to/sslkey.pem; #SSL証明書の秘密鍵のパス

  client_max_body_size 1g;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # クライアントの IP アドレス
  proxy_set_header X-Forwarded-Host $host; # オリジナルのホスト名クライアントが Host リクエストヘッダで渡す。
  proxy_set_header X-Forwarded-Server $host; # プロキシサーバのホスト名
  proxy_set_header X-Real-IP $remote_addr;
  location / {
    proxy_pass https://localhost:8081; #プロキシの向き先の設定(https)
  }
}

バーチャルホスト(NTRIP)

server {
    listen 80 default_server; #80番にアクセスされた時のデフォルトのバーチャルホストに設定
    server_name .ntrip.hamamatsu-gnss.org;

        client_max_body_size 1g;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Connection "";

     #伝送を効率化するチューニング
        keepalive_timeout 0; #キープアライブ無効化
        tcp_nodelay on; #パケットを極力まとめて送付するNagleアルゴリズムを無効化
        tcp_nopush off; #関係なさそうだが一応設定
        proxy_buffering off; #バッファリング無効化(重要)
        #効率化設定ここまで
        location / {
                proxy_pass http://localhost:2101; #プロキシの向け先をNTRIPサーバーに設定
        }
}

当環境では今後を考えてhamamatsu-gnss.org:80へのアクセスはhamamatsu-gnss.org:443へリダイレクトさせてますが、80番でWebページを待ち受けることも可能です。

回線の輻輳を防ぐためにある程度データをまとめて送付しようとする機能がNginxにありますが、ストリーミングの場合は遅延につながってしまいます。
チューニングはこの設定の無効化が主となっています。

HTTPに準拠している以上はhostヘッダーにアクセス時のホスト名を含めるルールになっているのですが、一部のNTRIPクライアントでアクセスしたときは何故か判定がうまく行かずにデフォルトのバーチャルホストへつながってしまうことがありました。
Webページの方は最近のブラウザであればデフォルトでなくても問題なくつながるので、80番ポートのデフォルトをNTRIP側に設定してあります。

これで無事NTRIPが一般配信できるようになりました。

今後、RTK-GNSS向けの位置情報の配信サービスを構築予定…という方は是非参考にしていただけましたら幸いです。

hamamatsu-gnss.orgはGPS以外にも複数の測位衛星から受信したデータを配信していて、RTK-GPSよりも高い精度で測位ができます。
全国には他には殆どない設備ですので、是非ご活用いただけましたら嬉しいです。

———————————————————-

位置情報の精度、センチ単位に 静大准教授ら研究 – @S
http://www.at-s.com/news/article/education/college/367429.html

※この記事は、以前私が書いた記事の本文を一部修正したものです