Categories: "Freesoftware and Open Source Software" or "Desktop Applications" or "Input Methods" or "OpenOffice.org" or "Distro" or "Debian" or "Ubuntu" or "Linux" or "Programming" or "Erlang" or "Java" or "デバッグ" or "Web Applications" or "b2evolution"

2014/09/06

  14:12:00 by , Categories: Freesoftware and Open Source Software, Linux

Link: http://theandystratton.com/2012/ssh-returns-too-many-authentication-failures-error-hostgator

リンク先の記事のおかげで、問題が解決した件を記します。

情報セキュリティに敏感になってきたので、漏洩リスクを下げるために、SSHキーを使いわけるようになりました。
Publicキーについても、GithubやAWSなど、登録するサービスが有るのですが、別々にするようにしています。

そしたらですね、エラーがでるようになりました

Too many authentication failures for username

なぜそうなるかというと、Gnomeの環境では、.sshの下にあるSSHキーを、ログインのときにすべてssh-agentに登録するわけです。
sshログインの時は、ssh-agentに登録されているキーを順次適用してログインできるか試します。
あまりたくさんのキーが.sshの下にあると、上記のエラーになるというわけです(たくさんと言っても、5ことか6こでエラーになります)

Amazon Web Service EC2を使うと、ログイン用のKey Pairを、Webから創ることができます。
sshコマンドで、 -i オプションをつけることで指定できる、とされています。

しかし、上記のような事象が起こる環境ですと、-i オプションにつけた鍵を試す「前に」,ssh-agentに登録された鍵を試してエラーになっちゃうので、ログインできないという事象が起こります。

そのため、ここ1週間くらい、ちょっと悩んでしまいました。(調べる余裕なかったし)

でも割合簡単に解決しました。

Full story »

2013/09/15

分散タイルサーバを実現するTileManプロジェクトで、つかうため lua-nginx-osm ライブラリというのを、コアライブラリとして開発しています。

この中で、次のような機能を実現しています。

  1.  ポリゴン指定した地域をデータとして持っている。
  2. タイルサーバで、タイル要求されたX/Y/Zoomについて、 そのタイルが、(1)の地域に含まれているかどうかを判定する。
  3. 含まれている場合、タイルを生成する。

地域データは、geofabrikのデータを意識しています。

DBとして、特定の地域のデータだけPostGISに持っておいて、タイル要求がきたときに、それがDBに入っていればレンダリング実施、そうでなければ、アップストリームのtile.openstreetmap.orgへ要求、みたいな処理を実現しています。

typical configuration of tileman

これは、他の製品でもありそうな機能ですよね。

さて、上記の処理を行うために、is_inside_regionという関数を定義しました。計算速度を上げるために、
簡易なアルゴリズムを採用しました。ポイントは以下です

res = (y1 - y2) * nx + (x2 - x1) * ny + x1 * y2 - x2 * y1

(x1, y1) (x2, y2) は、地域を指定するポリゴンの一辺のベクトル
(nx, ny)は、判定するタイル要求の位置

上記は外積をとっており、全ての辺について判定して、すべて負でなければ、
すべての辺の内側に、判定するタイル要求の位置があることが分かります。

しかし、この判定ロジックには、弱点があり、比較するポリゴンは、かならず
convex polygon (凸多角形)である必要があるのです。

そこで、たとえば japan.kmlのような凹凸多角形(concave polygon)を凸多面体に分割することにしました。
単純なケースでは、手作業でも可能ですが、複雑になると、手作業では不可能になります。

このような問題は、計算幾何学で研究されていて、素晴らしいライブラリがすでに提供されています。
例えば、アルゴリズム設計マニュアルの下巻には、第17章計算幾何学の中に、17.11多角形分割 として解説されており、CGALというライブラリがつかえることが記されている。また、上記の判定についても、17.7 点位置決定で詳細に書かれている。

そこで、CGALを用いて、ポリゴンを複数の多角形に変換し、LUAのプログラムを生成するようなユーティリティプログラムを書くことにしました。

$ git clone https://github.com/miurahr/lua-nginx-osm.git
$ cd lua-nginx-osm
$ apt-get install libcgal-dev cmake make
$ make

これでプログラムが生成されるはずです。実行は、

$ utils/poly2lua/poly2lua -t

ここで(-t)をつけると、テストモードで、内蔵の日本の定義データを元に、複数の多角形(緯度経度)を示すデータを生成します。
また、osm/data/*.kml が元データで、 osm/data/*.luaが生成された複数の凸多角形のデータです。

2012/12/02

  18:48:00 by , Categories: Linux
Recent kernel detect MS Hyper-V and use VMBUS technology for disk access. It works fine on Hyper-V VMM but kernel mis-detect Virtual-PC on Windows 7. Because there is not VMBUS technology in Virtual-PC, so kernel cannot find root disk and fails to boot. Kernel should detect Virtual-PC than Hyper-V. It is known that Hyper-V has a bios vendor name 'VRTUAL' now but it is easily changable. Patch is as follows: /drivers/ata/ata_piix.c
static int prefer_ms_hyperv = 1;
 module_param(prefer_ms_hyperv, int, 0);
 
 static void piix_ignore_devices_quirk(struct ata_host *host)
 {
 #if IS_ENABLED(CONFIG_HYPERV_STORAGE)
 	static const struct dmi_system_id ignore_hyperv[] = {
 		{
 			/* On Hyper-V hypervisors the disks are exposed on
 			 * both the emulated SATA controller and on the
 			 * paravirtualised drivers.  The CD/DVD devices
 			 * are only exposed on the emulated controller.
 			 * Request we ignore ATA devices on this host.
 			 */
 			.ident = "Hyper-V Virtual Machine",
 			.matches = {
 				DMI_MATCH(DMI_SYS_VENDOR,
 						"Microsoft Corporation"),
 				DMI_MATCH(DMI_PRODUCT_NAME, "Virtual Machine"),
+				/* DMI_MATCH(DMI_BIOS_VENDOR, "VRTUAL"), */
 			},
 		},
 		{ }	/* terminate list */
 	};
+	static const struct dmi_system_id find_virtual_pc[] = {
+		{
+			.ident = "Microsoft Virtual-PC",
+			.matches = {
+				DMI_MATCH(DMI_SYS_VENDOR,
+						"Microsoft Corporation"),
+				DMI_MATCH(DMI_PRODUCT_NAME, "Virtual Machine"),
+				DMI_MATCH(DMI_BIOS_VENDOR, "American Megatrends Inc."),
+			},
+		},
+		{ }	/* terminate list */
+	};
 	const struct dmi_system_id *dmi = dmi_first_match(ignore_hyperv);
 
 	if (dmi && prefer_ms_hyperv) {
-		host->flags |= ATA_HOST_IGNORE_ATA;
-		dev_info(host->dev, "%s detected, ATA device ignore set\n",
-			dmi->ident);
+               if (!dmi_first_match(find_virtual_pc)) {
+			host->flags |= ATA_HOST_IGNORE_ATA;
+			dev_info(host->dev, "%s detected, ATA device ignore set\n",
+				dmi->ident);
+		}
 	}
 #endif
 }
The patch is not tested and just a concept to fix problem. You can escape the problem with kernel option 'ata_piix.prefer_ms_hyperv=0'.

2012/09/23

  11:20:00 by , Categories: Freesoftware and Open Source Software, Linux, Ubuntu

Link: http://bugs.winehq.org/show_bug.cgi?id=30598

先日、レポートしたEvernoteがUbuntu12.04で動かないよ、という件だが、その後、OpenSSLの問題だというのは濡れ衣で、OpenSSLが TLS1.1/1.2をサポートするようになったけど、WINEでそのあたりをうまく取り扱っていないことが、問題の発端であることがわかった。

すでに、
http://source.winehq.org/patches/
http://source.winehq.org/patches/data/89343

提案をして、議論しているところだ。
ぜひ、パッチをレビューしたり、さらなる改善を提案したり、動作試験をしたりしてほしい。
http://permalink.gmane.org/gmane.comp.emulators.wine.devel/91356

2012/03/24

  14:14:00 by , Categories: Linux, Ubuntu

Link: http://kenichiokuyama.blogspot.com/2011/12/schedclock-overflow-after-2085-days-in.html

"okkyの銀河制圧奇譚"で、Linux Kernelのスケジューラで使用するTSCをns単位に換算するルーチンでの掛け算オーバーフローが起因して、リブートする等の問題があこることの議論がされている。

しかし、問題が発現していない環境もあって、現象の理解が必要だとおもわれた。ブログ上でのコメントでのレポートでは、656日稼動しているという。

こういうときには、実験的に確認するのがよい。

#include<stdio.h>

static __inline__ unsigned long long rdtsc(void)
{
unsigned hi, lo;
__asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
}

int main(){

unsigned long long tick, result;
unsigned long cyc2ns;
unsigned long cpu_khz = 1770000;

tick = rdtsc();
printf("TSC= %llu\n", tick);
cyc2ns = 1000000 * (1 << 10)  /  cpu_khz;
printf("SC= %lu\n", cyc2ns);
result = tick * cyc2ns;
printf("MULT= %llu\n", result);
printf("OVER> %llu\n",  ((unsigned long long) 1 << 63));
}

問題のルーティンに似せた、簡単なこのようなコードを書き、現象の理解をおこなう。 とりあえず、実行したカーネルは、Ubnutu 11.10上の3.0.0である。

miurahr@miurahr-note:~$ ./a.out
TSC= 18906864235232
SC= 578
MULT= 10928167527964096
OVER> 9223372036854775808
miurahr@miurahr-note:~$ ./a.out
TSC= 27953476532
SC= 578
MULT= 16157109435496
OVER> 9223372036854775808

この2つの実行の間に、実行されたPCはスリープされている。このスリープのresume時にcyc2ns_offsetを再計算するようにされている。

上記の結果からわかるように、64bitのTSCが折り返されて、小さくなっている。もちろん、複数CPUが搭載されているので、かならずしも同じCPUの値を取得しているとは言えないのである。とはいえ、得られたヒントは大きい。

static inline unsigned long long __cycles_2_ns(unsigned long long cyc)
{
int cpu = smp_processor_id();
unsigned long long ns = per_cpu(cyc2ns_offset, cpu);
ns += cyc * per_cpu(cyc2ns, cpu) >> CYC2NS_SCALE_FACTOR;
return ns;
}

当該コード部分に注目すると、cyc2ns_offsetに、指摘されている演算結果を加えるコードになっている。どういうことか。ノートPCはとくに、使用時間をのばすために、CPUの速度を動的に変更して、負荷の低い時のCPUの消費電力を削減する。こうすると、当然クロックあたりの時間幅、上記のcyc2nsの値が変化する。したがって、単純にTSCの累計にそのときのCPU速度で計算してしまっては、正しい値になりえない。

で、どうするかというと、CPU速度の変化をさせる時に、そのときの経過時刻をns単位でもとめ、変更後の速度で計算した場合の累計時刻との差分をcyc2ns_offsetに格納する。

2011/12/24

2010年の上半期に、国際化の開発に協力したOSSプロダクトのひとつに、nixnote(旧Nevernote)がある。

Evernoteクライアントのフリークローンで、Java+QtJambiで書かれていて、プラットホームニュートラルに動く。そのころ、KoedoLUGで、紹介したことがあった。しばらく、開発協力した本人も使うことが無くなっていたのだが、KoedoLUG主宰のはとちゃんが地道に使い続けてくれていることが判明、ちゃんとみないと遺憾な、とgit repositoryをおいかけ直すことに。

ところで、この手のドキュメント管理ソフトウエアでは、全文検索のできがとても重要である。nixnoteは、データ保管には、H2 Database を使っている。H2は、Javaで実装されたオープンソースのDBMSである。

さて、nixnoteでは、設定可能な正規表現 [,\\s]+ で単語を切り分けて、インデックスを作成している。ご多分にもれず、これでは日本語の検索ができない。日本語などCJK言語の単語切り分けは、正規表現では表現できず、形態素解析を必要とするからだ。

さて、H2データベースには、内蔵の全文検索が2タイプあり、ネイティブとLucineによるものがある。Apache Lucineは有名な全文検索エンジンで、これを使うように改良できれば、nixnoteの機能も向上させられそうだ。そこで、H2データベースのLucineによるCJK全文検索をしらべると、H2追っかける日記にて全文検索を使う話が掲載されていた。

ということで、nixnoteのこの部分を改良する人、募集中なのである。(自分でやれ?)はとちゃんが、がんばれ!?

2011/06/12

  12:53:00 by , Categories: Freesoftware and Open Source Software, Linux

Link: http://d.hatena.ne.jp/mktredwell/20110611/1307815106

Linux 20周年で、Linus Torvaldsさんが来日し、6/1-3のLinuxCon Japanに参加しました。 この20年に関わった人は、それぞれに感想をもったとおもいます。そのなかのひとりにあかいさんがいます。あかいさんは、LinuxFoundationの20年史をポイントしつつ、それ以外に

20年で記憶に残るマイルストーンには、何があったのだろうか

と提起しています。あかいさんが初めてLinuxを知ったのは、1995年の神戸・阪神大震災のとき、と記しています。わたしが初めてLinuxを知ったのは、1994年の夏くらい、使い始めたのは、1995年4月に社会人となって最初の給料でPCを買って、初日にプレインストールのWindows3.1Jを消し去ったとき、からです。

なぜ、山形浩生氏の活動が、Linux 20年史と関係してくるのだろう。

山形さんには、1990年代後半、TLUGの活動の中で、お話させていただく機会が数度ありました。このときは、TurboLinuxの前身Pacific HiTechのクリフ・ミラーさんとも交流があって、1998年くらいにNTTデータにきていただいて、Linux推進派の社内エンジニアたちと日本の情報産業の構造と、システムインテグレータが取り扱うに必要な環境などについて、意見交換したこともありました。

このころに、エンジニアやLinux開発者は、技術だけではなく、ライセンスや倫理や経営についても理解を深めないといけないと思ったのですが、ここには山形さんの影響を受けている気がします。

私が、OSS/Linuxの世界に深く入っていくきっかけになったのは、1989年前後のGNU Manifestの引地さんの訳だったのだけれども、1990年代前半の東北大学在学中に黒木さんやその辺りの一派による社内掲示板での議論の影響もすごく強かった。

そして、2003年くらいから、あかいさんがLinux/OSSをぐいぐい引っ張っているとき、私も、Linux/OSSを業界の別の地点から押していったんですよね。 てなわけで、2003年以降に互いを認識したあかいさんと私の間には、それ以前に共有するものが結構あったのでした。

::