SSブログ

golangでUPnPのポートフォワーディングをしてみる4−不定形のXMLをどうにかしたい [プログラミング]

これまでにGolangでXMLを細かく扱うには、UnmarshalXML()を定義すればいいと分かりました。

http://golang.rdy.jp/2015/11/08/anyxml/

不定形のXMLでもこれは使えると思っていたのですが、他のXMLにはそのままで使えないUnmarshalXML()であったのです。具体的にはxmlnsが邪魔してすんなりデータが取れないのです。というか、名前空間とか本来的にはデータを取ってくるだけのことではあんまり関係ないのですよね。面倒なことに定義されたあとすべてに絡んでくるので、無視するのにも手間がかかりそうですね。

サンプルとして提示されたもののXMLにはいちいちタグの属性として打ち込んでいるタイプだったので、それが問題にならなかったのでしょうけど、普通だったらいらないものとして抽出時に捨てられるものなんでしょう。

とりあえず実証コードを示します。ただ制限というか問題があります。

1. 最初のXMLを取りに行くSSDPの送受信は含まれず、コード内でURL決め打ちなので状況に合わせて書き直さないといけない。取ってくるコードは以下
https://miff.blog.so-net.ne.jp/2019-07-14-1

2. 特定のNECのAtermぐらいにしか使えないかもしれない。そして
SCPDURL
controlURL
eventSubURL
などのセットが複数ある場合は、最後のデータに上書きされる可能性がある(検証してないけど)

3. UnmarshalXMLに渡すデータ型がイマイチよくわからなかったので、SCPDURLなどを収納する変数をグローバルにして通しているので、ソースコードとして行儀が悪い。
さらにt *Tag を本質的に使っていない。本来ならこれを使ってSCPDURLなどを格納すればいいのだけれど、入れた後に使うことを考えると、特定の項目を検索したりするのが面倒だ。




1. の問題は自分がコードに落としていないだけでできないことはないのでしょうが、少々込み入ってしまう可能性があるので、目で見てLocation: ってところのURLを取ってきています。ここのところがSSDPの仕組みがどうなっているのかわからないので、別のクライアントが投げてくるメッセージをより分ける方法がわかってません。xmlUrlという変数を書き換えれば、任意の環境で動くかもしれません。

2, はルーターだと1組だけな場合が多そうなので気にする必要はないかもしれません。

3. はそもそもxmlパッケージの問題なのかもしれないので、UnmarshalXML()を使う限りは無理かもしれません。前提として不定形のXMLというものを前提としているので、そもそも定型なXMLを前提としているxmlパッケージの作りでは無理があるのかもしれません。


あと動作状況を知るためPrintfデバッグ的に埋め込んでいます。検証コードですので、最終的に得られる情報よりも過程が重要かと思われるので。



UnmarshalXMLが返してくるデータを手探りで抜き出しているので、先ほども言ったようにグローバル変数を関数の中に使うなど、Golangというかプログラミング言語的に悪手ではあるのは了解してください。その前にXMLの階層がまちまちというのが非常に問題なのだが、最近のルーターだとそういうこともないかもしれない。ただUPnPをサポートしているルーターで動かない例はそもそもXMLが腐っている可能性は高いので、対応アプリケーションに文句を言っても仕方ない可能性はある。

タグ:Golang
コメント(0) 
共通テーマ:パソコン・インターネット

Twitterまとめ投稿 2019/07/23 [Twitter]


コメント(0) 

PS4のバックアップで受け側のSSDをMacでフォーマットしたらハマった話。 [ソフトウェア]

基本的にPS4用のメディアのフォーマットをMacでフォーマットしたらいけません。結果から言うとGPTでフォーマットされてしまうから。そうなるとWindowsのGUIからでも直せない。

PS4のバックアップ先はパソコンでフォーマットしてあげないといけないという話は前にしました。なんでかPS4内で完結できていないのね。まぁそれはそれでExtFATにすればいいという話なのですが、MacでExtFATにしてもPS4では使えないという話がありまして、MacでフォーマットしてしまうとWindowsでもGUIでは直せなくなってしまうので注意が必要です。

問題はPS4がMBRという形式のメディアにしか対応していないため。HDDやSSDは古いMBRと、新しめのGPTという形式の二つがあり、一回GPTにしてしまうとMBRにするにはGUIのメニューからは直せないという状況になっています。具体的にいうと「ディスクの管理」で「MBRディスクに変換」が淡色表示になっていて使えない状態なのです。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12160380177

このように使えないことが報告されています。
下のようなツールを使うか、Windowsに付いているdiskpartコマンドを使うしかなさそうです。MacでMBRにするってのはちょっとわからない(後記:前はMBRの設定にできたけど、今は選択できずGPT一択)。

https://jp.easeus.com/partition-manager/how-to-delete-efi-system-partition.html

そんでいらないGPT用のパーティションを削除する。システム用のパーティションは削らないように。

https://qiita.com/aoi70/items/75f61ec679c1c1b71f8e

そうすれば、あとはWindowsの「ディスクの管理」からMBRのディスクを作るのを選択して、ExtFATでフォーマットすれば使えるようになります。面倒くさいなあ。これだからMacを使うのって汎用性がないんだよなぁ。

コメント(0) 
共通テーマ:ゲーム

Twitterまとめ投稿 2019/07/22 [Twitter]


コメント(0) 

golangでUPnPのポートフォワーディングをしてみる3−不定形のXMLをどうにかしたい [プログラミング]

前回、とりあえずXMLをパースする方針ができました。できたのですが、ルーターのXMLには数々の問題があり一筋縄にはいきません。問題を挙げておきます。

1. XMLが定型ではなく、ルーターによって構造がまちまち。
2. XMLがUTF-8でない場合があって読み込み時にエラーが出る。

というかなりクソッタレな状況になっていて、まともにUPnPを使ってポートフォワーディングができる状況ではありません。各メーカーが決まりを守っていれば問題ないのですが、やりたい放題でまともに動く状況になってはいません。

自分の状況を述べますと、無線LANルーターを二つ見ました。NECのAtermとIOデータのWN-G300Rです。AtermはXMLの構造がどうにも深くて、Golangでは構造体を規定してのデータ取り込みが困難でした。このネスト構造が本当にXMLのフォーマットとして規定されているものなのか疑問に思い、他のルーターを見てみました。

WN-G300Rを見てみると、ネストもそんなに深くなくシンプルだったので、Atermの深さがちょっと異常というのが何となく分かりました。その後のパースを比較的シンプルなXMLだったWN-G300Rに変えて検証してみていると、UTF-8以外のコードが含まれており、やり方によってはGolangで以下のようなエラーが出てしまうのでした。

panic: XML syntax error on line 15: illegal character code U+0018


そもそもXMLのURLをブラウザでアクセスしても、パーシングでエラーが出ていたのでおかしいなとは思ってはいたのです。

XML パースエラー: 整形式になっていません。
URL: http://192.168.1.202:49152/wps_device.xml
行番号: 11, 列番号: 18:bLy￿
-----------------^


IOデータの作った技術者が日本語エディタかなんかで編集してUTF-8の設定にしていなかったんですね、たぶん。そうじゃないとUTF-8外のデータが入り込むということは考えにくい。技術者だったら日本語の取り扱いぐらいは慎重にしておくべきですよね。ちょっと恥ずかしい。

XMLの形がちょっと独自すぎたり、そもそもXMLの体をなしていなかったりするので、正直言ってUPnPをポートフォワーディングで使うのは厳しい。問題を乗り越えるのにすべきことはいくつかあり、それを全部乗り越えるには正規の手続きではやりにくいと思われます。やれることとしては

・XMLにUTF-8以外のキャラクターが出てきても無視できるようにする。
・XMLの構造はあてにできないので、タグを一つ一つクロールして該当の部分だけ抜き出す。

ぐらいのものでしょうか。ポートフォワードが可能でなくても、決め打ちでメッセージを発行できるところはあるものの、ルーターごとに違う設定になっている部分はやっぱりXMLから抽出しないとできないので、パーシングは必要不可欠なのです。というか、完全に開発者のXMLの理解不足がアダとなっているなこりゃ。

そんなわけで、UPnPが可能としているルーターでも、UPnPをイネイブルにしたところでちっとも反応しないという状況が眼に浮かぶわけで。だから、あるソフトを使ってUPnPを有効にしたルーターで上手くいかないとしても何の疑いもなく動かないということはあり得るということをみなさんにも知っていただきたい。

とりあえずAtermのXMLはUTF-8ではあるので、それで動くかどうか確かめてみましょう。というか、こんな適当すぎる杜撰な仕様のソフトは一般的なんでしょうかね。まぁUPnPの成り立ちが微妙なのは否めませんけど。

タグ:Golang
コメント(0) 
共通テーマ:パソコン・インターネット

Twitterまとめ投稿 2019/07/21 [Twitter]


コメント(0) 

golangでUPnPのポートフォワーディングをしてみる2−不定形のXMLをどうにかしようとする [プログラミング]

ルーターの持っているXMLが不定形なので、XMLとしては悪手なのではと思わざるを得ないのだけれども、DTDがあるわけでもなさそうなので、XMLの中を検索する他なさそうな気がします。構造化されているXMLをパースする例はいくらでもあるけど、不定形のXMLをどうにかするという記事がこれまたない。ググり方が悪いのかな?

一番雑音が少なさそうなコードがこれあたりで
https://hogesuke.hateblo.jp/entry/2014/08/25/012114
やっぱり構造体ときちんと定義しないといけないみたい。


Unmarshal()が出力するのはinterface{}で、具体的には構造体のようです。ふつう構造体自体は検索して使うものでもないので、XMLの型を作っておいてそこに当てはめるという方法は当然だったりします。実際、XMLからデータを引っ張ってくるサンプルはほぼ全部構造体を定義していますね。まぁXHTMLみたいな不定形なXMLも存在するので、そこのところを拾えない作りになっていると汎用性がない気がするんですがね。

Golangの構造体の検索を調べた方が良さそうな気がしますが、なんかなさそうな気がするんだよなぁ。LL言語あたりだと言語仕様か標準ライブラリのあたりにありそうな気はする。ググっていたらJSONをUnmarshalするということが書いてあって、JSONだと不定形なことも多いだろうと思って読んでみた。

https://www.kaoriya.net/blog/2016/06/25/

ゆるふわ、ねぇ。XMLでもできそうだなと思ったができなかった。

具体的には空のinterface{}にUnmarshal()で入れたんだけど、nilが返ってきました。よく読んだらきちんと構造体を作らないと空で返すよと書いてありました。形式は合っていてもvalに適合しないデータは破棄されます、って書いてあった。

http://golang.jp/pkg/xml

ううむ、一つずつ要素をクロールして行くような方法でいいからないのかな? でも、英語の文章を読んでいくのはしんどい。日本のリファレンスだってサンプルコードがない関数なんて暗闇の中で手探りしているようなもんだし。あんまり試行錯誤はしたくないんだよね。




不定形のXMLを扱う方法があった。

http://golang.rdy.jp/2015/11/08/anyxml/

UnmarshalXML()を独自に定義すればいいらしいんだが、サンプルではUnmarshalXML自体は呼んでない。Golangの仕組みとライブラリの問題なんだろうけど、いまいち細かくはよくわからない。

xml.Marshaler と xml.Unmarshaler interfaceを明示的に定義するっていうのがあったけど、別にこれはしなくてもいいってことなのかな。

https://qiita.com/ono_matope/items/70080cc33b75152c5c2a#xmlmarshaler-%E3%81%A8-xmlunmarshaler-interface

とにかく一つずつ拾っていく方法をとれるっぽいので、forで該当の情報を取れるまでぐるぐる回してみれば良さそうな気がする。そうなるとUnmarshalXMLは使わないでできるのかもしれない。使った方が楽かな? よくわからないけど実装できればいいや。

http://golang.rdy.jp/2015/11/08/anyxml/
のUnmarshalXML()だけをとって、情報を構造体にぶっこみたかったんだけど上手くいかず。
MarshalXML()もコピペして入れ込んだんだけど、内容が重複したり入れ子部分がざっくり無くなっていたり、まともに動いてくれていなかった。これは上のコードに自分が取ってきたXMLぶっ込んで試してみた方が良さそうだな。

やっぱり自分が取ってきたXMLを喰わせたら、階層を無視して途中でぶっちぎれて途中から続いた。汎用性がないらしい。あ〜自作かぁ。プログラミングするの面倒くさいなぁw。始めてしまえば楽しくなってきたりはしたりもするのだが、自分の用をなすものを作っても汎用性のあるコードは書きそうもないな。

とにかく、普通の正攻法ではできないとわかったので、地道にカスタマイズをかけるようにやるしかないかなと思ったり。なんとなくやり方の方針はわかったので、あとは似たようなコードとリファレンスを首っぴきにしてやるしかないかな。XMLだからもうちっとやり方が提供されていると思ったけど、薄っぺらなそこはGolangであるってことなんだろうな。

タグ:Golang
コメント(0) 
共通テーマ:パソコン・インターネット

Twitterまとめ投稿 2019/07/20 [Twitter]


コメント(0) 

Twitterまとめ投稿 2019/07/19 [Twitter]


コメント(0) 

ホモショタと燃える京アニ [徒然]

ジャニー喜多川が死んで褒め称えられていたが、現実的にはホモショタのおじいちゃんだったんだもんね。その上、ジャニーズ事務所をやめた人たちをテレビから干すとかものすごくえげつない人だったわけだ。

元スマップの3人の仕事を干しているとジャニーズ事務所が独禁法に触れた。まぁ悪いことをしていたら罰を受けるのは必至だろうが、おそらくジャニーが糸を引いていたのは間違いない。というか、日本のテレビはホモショタの件を全く伝えないんだよな。どんだけジャニーズに依存しているのか知らないけど、いわゆる大人の事情によって真実が伝えられないというのはテレビには良くあることではあるんだけどね。


京アニに基地外が入って、ガソリンかなんか撒いて燃やした。またオタクがなんとか言われるんだろうけど、オタクとかそういうの関係ないぐらい逸脱したことですから。むしろオタクの方が凶悪犯罪は少ないんじゃないかと思うんだけど、こういうことがあるとテレビは騒ぎ立てるよね。そんでオタク趣味にも文句を言いだすと。というか、現在の世界は昔ほどオタク趣味はマイナーではないからね。

これまでも色んなものが原因として取り立たされてきたけど、全くサンプルが足りない状態で断罪をしようとするテレビなどのマスコミの愚かさは散々見てきた。なんというかステレオタイプである上に頭の悪い立証の仕方をしているので、SNSですぐに叩かれるテレビの今の状況はいくらか健全なんだと思う。

まだ京アニで捕まった奴の言い分は出てきていないのでなんとも言えないけど、全く京アニを知らない人ではないわな。変なこと言わないといいけど、まぁこんなことしている時点で変だからどうしようもないか。


松本人志の消したツイートではないが、たくさん人がいると不良品みたいな考えを持つ人間が出てきてしまうのはいくらか仕方ないことなのかもしれないとは思う。ぶっ壊れた考えを持つ人は少なくないけど、他の人に迷惑をかけるかどうかは分かれ目になるんじゃないかと思ったりはする。発覚するかどうかは、実際のポテンシャルとはかなり違う気はする。

ある業界にいた時、年明けの3ヶ月に4人も業務で死んで、それ自体はテレビに少しも出ていなかった。まぁ業務上で人死が出る分には、必要悪だと言わんばかりだったが、あまりにも悪条件すぎて仕事を辞めた。ニュースで一人死んだだけで何日もやることは少なくないが、仕事で不運な事故で死んだ場合は全くマスコミに出ない。まぁ建築業とかもそうかもしれないけど、そこまでひどくないだろうしな。

テレビは一般性のあることを放送したいのか、一般性のないことを放送したいのか、よくわからないことが多い。具体的には視聴率が出ればいいのと、関係者の利害関係によって揉み消されたり、目を引くために必要以上に報道されていたりするわけで。

まぁひどいことに巻き込まれたくはないが、テレビでいくら報道したところでなくならないものは無くならないし、見たくなくても知っておかなければならないことはたくさんあるということだ。


コメント(0) 
共通テーマ:ニュース