Garage uenoB このページをアンテナに追加 RSSフィード

2011-01-29

[][] FreeBSD-8.1-RELEASEのypservの-Pオプション 21:58  FreeBSD-8.1-RELEASEのypservの-Pオプションを含むブックマーク

ypservの-Pオプション(バインドするポート番号を明示的に指定するやつ)を付けて起動したらNISが使えなくなった,と思ったらypservのtcp側だけが腐っていた.

# rpcinfo localhost | grep ypserv
    100004    1    udp       0.0.0.0.128.0          ypserv     superuser
    100004    2    udp       0.0.0.0.128.0          ypserv     superuser
    100004    1    tcp       0.0.0.0.128.0          ypserv     superuser
    100004    2    tcp       0.0.0.0.128.0          ypserv     superuser
# rpcinfo -T tcp localhost ypserv
rpcinfo: RPC: Remote system error - Connection refused
# rpcinfo -T udp localhost ypserv
program 100004 version 1 ready and waiting
program 100004 version 2 ready and waiting

ソースコードを見ると明らかにダメダメだったのでパッチ.…を書いたんだが,書いた後でCURRENTではすでに修正されていることに気づいた(rev 1.31).しかも1年くらい前に.8.1のソースツリーのうちyp_main.cだけ1.31に差し替えてコンパイルし直したら解決したっぽいので,まあこれでいいかなー,という感じ.

でもせっかくだから書いたパッチも貼っておこう.

--- src/usr.sbin/ypserv/yp_main.c.orig	2010-06-14 11:09:06.000000000 +0900
+++ src/usr.sbin/ypserv/yp_main.c	2011-01-29 21:27:14.000000000 +0900
@@ -308,7 +308,7 @@
 	for (st = stlist; st->st_name != NULL; st++) {
 		/* Do not bind the socket if the user didn't specify a port */
 		if (yp_port == 0)
-			break;
+		{
 
 		sock = socket(AF_INET, st->st_type, 0);
 		if (sock == -1) {
@@ -329,26 +329,38 @@
 			exit(1);
 		}
 		errstr = NULL;
-	}
+		}
 
-	if ((_rpcfdtype == 0) || (_rpcfdtype == SOCK_DGRAM)) {
-		transp = svcudp_create(sock);
+		if ((_rpcfdtype == 0) || (_rpcfdtype == st->st_type)) {
+		if (st->st_type == SOCK_DGRAM)
+			transp = svcudp_create(sock);
+		else
+			transp = svctcp_create(sock, 0, 0);
 		if (transp == NULL) {
 			_msgout("cannot create udp service");
 			exit(1);
 		}
 		if (!_rpcpmstart)
-			proto = IPPROTO_UDP;
+			proto = (st->st_type == SOCK_DGRAM)
+				? IPPROTO_UDP : IPPROTO_TCP;
 		if (!svc_register(transp, YPPROG, YPOLDVERS, ypprog_1, proto)) {
-			_msgout("unable to register (YPPROG, YPOLDVERS, udp)");
+			if ((asprintf(&errstr, "unable to register (YPPROG, YPOLDVERS, %s)",
+			    st->st_name)) == -1)
+				err(1, "unexpected failure in asprintf()");
+			_msgout(errstr);
 			exit(1);
 		}
 		if (!svc_register(transp, YPPROG, YPVERS, ypprog_2, proto)) {
-			_msgout("unable to register (YPPROG, YPVERS, udp)");
+			if ((asprintf(&errstr, "unable to register (YPPROG, YPVERS, %s)",
+			    st->st_name)) == -1)
+				err(1, "unexpected failure in asprintf()");
+			_msgout(errstr);
 			exit(1);
 		}
+		}
 	}
 
+#if 0
 	if ((_rpcfdtype == 0) || (_rpcfdtype == SOCK_STREAM)) {
 		transp = svctcp_create(sock, 0, 0);
 		if (transp == NULL) {
@@ -366,6 +378,7 @@
 			exit(1);
 		}
 	}
+#endif
 
 	if (transp == (SVCXPRT *)NULL) {
 		_msgout("could not create a handle");
トラックバック - http://d.hatena.ne.jp/uenoB/20110129

2010-12-28

[][][] finkのghostscript-esp-7.07.1の64bit対応 08:56  finkのghostscript-esp-7.07.1の64bit対応を含むブックマーク

64 bit onlyのfinkでghostscript-espパッケージをビルドしてインストールしたら動かなかったのでパッチ

--- sw/fink/10.4/unstable/main/finkinfo/text/ghostscript-esp.info.orig	2009-11-15 23:15:09.000000000 +0900
+++ sw/fink/10.4/unstable/main/finkinfo/text/ghostscript-esp.info	2010-12-28 08:40:40.000000000 +0900
@@ -65,7 +65,7 @@
 Source3ExtractDir: Resource
 Source4ExtractDir: Resource
 PatchFile: %n.patch
-PatchFile-MD5: f0054b61269abeaa2152cd6200610b39
+PatchFile-MD5: b350b5775287513b26de3456f9925065
 PatchScript: <<
  # apply tagoh-san's patch series, required for NeverEmbed
  patch -p1 < ../ghostscript-7.07-bigposttable.patch
--- sw/fink/10.4/unstable/main/finkinfo/text/ghostscript-esp.patch.orig	2007-10-10 06:15:48.000000000 +0900
+++ sw/fink/10.4/unstable/main/finkinfo/text/ghostscript-esp.patch	2010-12-28 08:40:11.000000000 +0900
@@ -769,3 +769,15 @@
 +	*)
 +		${show} "usage: ${0##*/} {add|remove}" ;;
 +esac
+diff -u espgs-7.07.1-orig/src/gxobj.h espgs-7.07.1/src/gxobj.h
+--- espgs-7.07.1-orig/src/gxobj.h	2003-08-20 00:32:25.000000000 +0900
++++ espgs-7.07.1/src/gxobj.h	2010-12-28 08:31:46.000000000 +0900
+@@ -117,7 +117,7 @@
+ #endif
+ #define obj_align_mask (obj_align_mod-1)
+ #define obj_align_round(siz)\
+-  (uint)(((siz) + obj_align_mask) & -obj_align_mod)
++  (uintptr_t)(((siz) + obj_align_mask) & -obj_align_mod)
+ #define obj_size_round(siz)\
+   obj_align_round((siz) + sizeof(obj_header_t))
+ 

ghostscriptのバージョンが古いとか,この手の対策はすでに誰かがやってそうな気がするとか,いろいろ思うところはあるけれど,この程度の問題ならその辺の事情を調べるよりパッチを書いた方が早い.

トラックバック - http://d.hatena.ne.jp/uenoB/20101228

2008-06-09

[]世界で最初のGrassプログラム 20:29 世界で最初のGrassプログラムを含むブックマーク

GrassでHelloWorldこことかこことか)繋がりで.

世界で最初のGrassプログラムHelloworldでした*1.せっかくなので晒しておきます.

wwWwwvwwwwWWWwwWwwWWWWWWwwwwWwwvwwwWWwWWWWwvwwWWwWWWwvwwWWwWWWwWWWWwvw
WWWWWWwwwWwwwwWWWWWWwwwwWwwwwwwWWWWWWWWWwwwWwwwwwwwWWWWWWWWWWWwWwwwwww
WWWWWWWWWWWWWwWwwwwwwwwwwwwWWWWWWWWWWWWWWWwWwwwwwwwwwwwwwwWWWWWWWWWWWW
WWWWWwWwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWwwwwwwwWwwwwwwwwwwwwwwwwwwWWWWWWW
WWWWWWWWWWWWWWwWwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwww
wwwwwWwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwwwwwWwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwWwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWW
WWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwWWWWWWWWWWWWwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwWwwWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwWwwWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwWwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWww
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwWwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwww
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwww
wwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwww
wWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwww
wwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwww
wwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

某若手の会の飛び込みセッションで発表したときに,実装のデモのために作ったサンプルプログラムです*2.Grass発表の次の年の夜に再発表してたら速攻で写真撮られてtwitterに晒されたヤツです.

2085文字あります.それが今では738文字まで縮んだってんだから隔世の感がありますw

アナゴルとかでGrass使えるようにならないかなあ(ぉ

*1:作った本人が言うんだから間違いないwww

*2:ちなみに,Grassの最初のバージョンは"v"の代わりに"."を使っていました.このサンプルは現在のGrassに合わせてy/./v/してます."v"を導入したきっかけは若手の会でのどなたかの提案なんですが…どなたでしたっけ?acknowledgement書きますので名乗り出て頂ければ幸いです.

earth2001yearth2001y 2008/06/10 03:32 二回目(つまり2007年)のGrassトークで、「.があるので完全な草ではないです」と言う上野さんに対して「vにしてみたらどうでしょう?」とコメントした記憶がありますが、証拠はないです。ただ、最初の2006年のトークのときにも似たような話をした記憶があって曖昧です。

uenoBuenoB 2008/06/11 19:05 うーん.私の記憶も曖昧ですし(というか酒入ってたから覚えてない),書くとするなら「情報科学若手の会参加者の皆様」で書くのが無難なんでしょうか…

irieirie 2008/07/26 16:12 Emacs LISP で Grass を実装してみました↓
http://www11.atwiki.jp/s-irie/pages/20.html
ついでに Hello, world! も作りました(551文字)。

uenoBuenoB 2008/08/11 17:16 返事が遅くなって申し訳ありません.
これは凄い!!Grassのページからリンクを張りました!
LL Futureでも紹介させて頂きたいと思います.たぶん.

shinichiro_hshinichiro_h 2008/09/02 11:55 LL Future で LT 聞きました。面白かったです。とりあえずゴルフ場につっこんでおきました。

2008-01-07

[][][] 初音ミクパッチ for Wine-0.9.52 19:43  初音ミクパッチ for Wine-0.9.52を含むブックマーク

CrossOverで初音ミクが動くらしいので,当然Wineでも動くはず,と思ってここ数日初音ミクを動かすためのWine環境をIntel Mac上に構築してたんですが,せっかく頑張ってもコントロールトラックが表示されないようでは面白くないのですよ.というわけでパッチ

--- wine-0.9.52/dlls/winex11.drv/xrender.c.orig	2007-12-29 00:26:23.000000000 +0900
+++ wine-0.9.52/dlls/winex11.drv/xrender.c	2008-01-07 11:19:19.000000000 +0900
@@ -1522,6 +1522,7 @@
     Picture dst_pict, src_pict;
     Pixmap xpm;
     DIBSECTION dib;
+    HBITMAP hbitmap = NULL;
     XImage *image;
     GC gc;
     XGCValues gcv;
@@ -1569,8 +1570,36 @@
 
     if (!devSrc->bitmap || GetObjectW( devSrc->bitmap->hbitmap, sizeof(dib), &dib ) != sizeof(dib))
     {
-        FIXME("not a dibsection\n");
-        return FALSE;
+        if (devSrc->bitmap && GetObjectW( devSrc->bitmap->hbitmap, sizeof(dib.dsBm), &dib.dsBm ) == sizeof(dib.dsBm))
+        {
+            void *bits;
+
+            /* FIXME: I don't know whether this way is correct or not. */
+            TRACE("forcely convert bitmap to dib\n");
+            dib.dsBmih.biSize = sizeof(BITMAPINFOHEADER);
+            dib.dsBmih.biWidth = dib.dsBm.bmWidth;
+            dib.dsBmih.biHeight = -dib.dsBm.bmHeight;
+            dib.dsBmih.biPlanes = dib.dsBm.bmPlanes;
+            dib.dsBmih.biBitCount = dib.dsBm.bmBitsPixel;
+            dib.dsBmih.biCompression = BI_RGB;
+            dib.dsBmih.biSizeImage = 0;
+            dib.dsBmih.biXPelsPerMeter = 0;
+            dib.dsBmih.biYPelsPerMeter = 0;
+            dib.dsBmih.biClrUsed = 0;
+            dib.dsBmih.biClrImportant = 0;
+            hbitmap = CreateDIBSection(NULL, (BITMAPINFO*)&dib.dsBmih, DIB_RGB_COLORS, &bits, NULL, 0);
+            if (!hbitmap) {
+                FIXME("Failed to convert bitmap to dib");
+                return FALSE;
+            }
+            GetObjectW(hbitmap, sizeof(dib), &dib);
+            GetBitmapBits(devSrc->bitmap->hbitmap, dib.dsBmih.biSizeImage, bits);
+        }
+        else
+        {
+            FIXME("neighter a dibsection nor a bitmap\n");
+            return FALSE;
+        }
     }
 
     if (xSrc < 0 || ySrc < 0 || widthSrc < 0 || heightSrc < 0 || xSrc + widthSrc > dib.dsBmih.biWidth
@@ -1578,6 +1607,7 @@
     {
         WARN("Invalid src coords: (%d,%d), size %dx%d\n", xSrc, ySrc, widthSrc, heightSrc);
         SetLastError(ERROR_INVALID_PARAMETER);
+        if (hbitmap) DeleteObject(hbitmap);
         return FALSE;
     }
 
@@ -1586,6 +1616,7 @@
 
     if(dib.dsBm.bmBitsPixel != 32) {
         FIXME("not a 32 bpp dibsection\n");
+        if (hbitmap) DeleteObject(hbitmap);
         return FALSE;
     }
     dstbits = data = HeapAlloc(GetProcessHeap(), 0, heightSrc * widthSrc * 4);
@@ -1702,6 +1733,7 @@
 
     wine_tsx11_unlock();
     HeapFree(GetProcessHeap(), 0, data);
+    if (hbitmap) DeleteObject(hbitmap);
     return TRUE;
 }
 

コントロールトラックが出ないのは,DDBアルファブレンディングがWineにまだ実装されていないからのようです*1.このパッチDDBを無理矢理DIBに変換してアルファブレンディングできるようにします.ただし,

  • x11drvのレベルではDIBもDDBも内部表現はほとんど同じはずなのにCreateDIBSectionなんて呼んでるのはどうみても無駄です.きっと偉い人がもっとマシな実装をしてくれるに違いない.
  • このパッチの汎用性は分かりません.とりあえずVOCALOID2 Editorには効く.

しかし,パラダイムの異なるモノを整然としたコードで書き下すWine開発チームは凄いと思います.

*1:逆(DDBにのみ対応)なら分かるんだけど,なんでこうなってるんだろう?どうでもいいけど.

おごちゃんおごちゃん 2008/01/07 22:26 ぶはっ。もう対応コードが!

言ってみるもんだなぁ。

新茶新茶 2008/01/14 13:18 このパッチは本家に送っているのですか?
0.9.53以降も当てる必要あるのでしょうか。。

uenoBuenoB 2008/01/21 21:38 反応遅くて申し訳ありません.
すみません,パッチはまだ送ってないです.ちょっと時間が取れなくて…(git formatとかめんどすぎってのもある
53以降も普通に当たると思うので,当ててください.

MGdeisgnerMGdeisgner 2008/06/26 18:04 Hello,I opened the data in wineHQ: http://appdb.winehq.org/objectManager.php?sClass=application&iId=7554

Please help to report back to wineHQ. Let’s the wine team pay attention to miku.

babasakibabasaki 2008/12/10 22:16 VineでWINEをパッケージしている者ですが、なかなかWINE本家で取り込まれてないようなんで、これを WINE-1.0.1 とWINE-1.1.10 に当てたパッケージを作っています。(※現在テスト中なのでまだ非公開ですが)
半透明が出てなかなか快適です。ありがとうございます。
(ちなみにxrender.cがバージョン毎に微妙に違うのでそのままではパッチが当たりません。そこで手動でパッチを再作成しております、すみません)

トラックバック - http://d.hatena.ne.jp/uenoB/20080107

2007-09-25

ちょっと草植えときますね型言語 Grass 03:21 ちょっと草植えときますね型言語 Grassを含むブックマーク

去年のネタですが.

Grass the grass-planting programming language

今年の情報科学若手の会の夜のセッションa.k.a. 飲み会)で話題に上がったので,この機会に資料を整理して公開することにしました.

Grassは,昨年の若手の会に参加したとき,セッションの合間に企画・設計・実装し,2日目の飛び込みセッションビールを飲みながら発表したプログラミング言語です.ネタに突っ走った見た目とは裏腹に,割とまともな文法と操作的意味論を持たせています…といってもSECD機械のもろパクりですがwwww.一応,Grassを作った当初の目的は形式的な言語仕様の記述に重点を置いた(変態)言語の作り方をデモすることだったので,言語自体はしっかり設計したつもりです.

ドキュメントは何となく英語で書きました.今は反省している.英語で書いたところで非日本語圏の人にはこんなネタ分かんねーよwwwwww