start

OpenSSHとSOCKSの組み合わせが凄い

会社でSkypeが禁止されてしまった。セキュリティ対策の側面もあるが、ルータの負荷軽減という面が一番大きいように思う。実際、前の会社ではSkypeのせいでルータがよくダウンしていた。

Skypeが使えないと/-友達や他社の知り合いとのやり取り、副業のやり取りなど-/何かと不便なので、どうにか使えないものかと調べてみたらSOCKSを使えば行けそうとな。OpenSSHがSOCKSプロクシ機能を持ってるので、SSHで繋がる自分鯖を外部に持っててSSHの疎通さえできれば、ポート転送との合体技で何も考えることなく使えるのが素晴らしい!素晴らしいを通り越して恐怖すら覚えると同時に、昔の人も同じような状況に陥って編み出したんだろうなぁと少し親近感(恐らくもっと崇高な目的だったろうから、自分の状況と比べるのはおこがましいが…)。

んで、試しにやってみたらマジチョー簡単にSOCKS経由の自宅鯖経由でSkypeが繋がった。マジパネェ……。ついでに、WebブラウザもSOCKSプロクシ設定することで、自宅回線経由でネットができる。ぁゃιぃサイトも見放題だね!

もう全部の通信アプリがSOCKS対応すればいいのに(´・ω・`)

第51回 FreeBSD勉強会に行ってきた〜rerootはヤバい

2016-10-24現在、会場が流動的なので最新の開催概要をよくお読みの上、奮ってご参加下さい。

第51回 FreeBSD勉強会「FreeBSD 10.3R / 11.0 新機能紹介」に参加してきた。

折角東京にいるんだし、前々から参加したいと思ってはいたものの、今までのは内容に付いて行けなさそうだったので見合わせていた。そんなこんなで、今回ようやく参加するに至った次第。

FreeBSD勉強会はもちろんのこと、こういう勉強会に参加するのは生まれて初め・・・そういえば大昔にCocoa勉強会に参加した事があったので、人生2回目ではあるが不安だらけ。無事会場にたどり着けるのか?とか、会場ビルに入れるのか?とか色々心配してしまう。同じような不安を抱えている人の助けになればと、詳しく記事にしてみる。

あえて書くほどでもないが…。

  • ノートPC
    • FreeBSDが動くマシン, 仮想マシン環境があれば尚良し
  • メモ帳

いずれも必須ではない。ただし、開催回によっては書籍の輪読会だったり、実際に手を動かしながら何かするという事もあるので、開催概要をよく読むこと。

今回、自分はメモ帳しか持って行かなかった。デジカメ持って行こうと思いつつ忘れ、ノートPCは会場で他の人が出してるのを見て「あ、そういえば」と思ったという…

麹町のKDDIウェブコミュニケーションズ社の会議室。

路線の関係で四ツ谷駅から徒歩で向かったが、「徒歩11分」の表記通りわりと歩いた。少しくらい乗り換えが面倒でも、できるだけ麹町駅/半蔵門駅から向かったほうが良いだろう。

住友不動産麹町ビル3号館についたら、玄関入って正面にエレベータがあるので、そのまま6Fへ。エレベータを降りてすぐ受付があるので、会費を払っていざ入場。

内容を一言でまとめると、リリースノート読め

煽りでもなんでもなく、リリースノートの各変更点には関連リビジョンへのリンクが張ってあり、文章を読んでもよく分からない場合はソースのdiffを見るのが一番との事。「YYコマンドでXXオプションに対応」と記載されていても、実はオプションスイッチを受け付けるようになっただけで、ソースの当該箇所には「将来実装予定」と書いてる事がままあるそうなので、やっぱりソースを見るのが確実だそうだ。

今回の変更点に挙げられているxzコマンドがまさにそのパターンで、スレッド指定の-Tオプションの中身が実装され、真のマルチスレッド対応になったのだとか。意外とテキトーなんだなーと思ったw

様々な新機能、変更点、加えて脱線話があった中で、個人的に興味深かったのがrerootとFreeBSDのブランド戦略について。

reboot -rとすると、稼働中のシステムをカーネル読み込み直後の状態から再起動することができる。ハードウェアの初期化、ブートローダの起動、カーネルの読み込みなどのブート時の諸々の手順をすっ飛ばせる分、(かなり)高速にシステムをリセットできる。複数のサービスに変更を加え1つ1つ手作業で再起動するのが面倒な時や、起動順番が重要なサービスを再開させる時などに威力を発揮しそう、と参加者の方が仰っていた。

論より証拠ってなもんで、通常の再起動とrerootによる再起動の比較動画を作った。左側がただのrebootで右側がreboot -rで、笑っちゃうほどと言うか最早笑う暇すらもないほどrerootが圧倒的に早い。rerootマジヤバい。

通常rebootとreboot -rの比較

rerootについて、リリースノートではThe initial implementation of “reroot” support has been added to the reboot(8) utility, allowing the root filesystem to be mounted from a temporary source filesystem without requiring a full system reboot. r293744と書かれているので、本来は一時的にルートFSを切り替えたい場合に使う事を想定した機能なのかな?カーネル環境変数vfs.root.mountfromでrerootに使うFSを指定できるようだし。

尚、カーネルそのものは変わらないので、freebsd-updateなどでカーネル更新した場合は従来通り再起動が必要とのこと。

再起動なしにカーネルすらも置き換える仕組みとして、KloadなるものがBSDCan 2012で発表されてはいるが、今のところメインの開発ラインに取り込まれてはいないそうだ。

最近、BSD関連の国際会議では、FreeBSDのマーケティングやブランディングの話が増えてきているそうな。

Free/Net/OpenのメジャーBSD三兄弟の中で、OpenBSDは猛烈な勢いでシェアを獲得しつつあるそうだ。知る人ぞ知るOpenBSDの強烈な姿勢が「セキュリティならOpenBSD」というブランドを確立させ、それがシェアの拡大に寄与しているとのこと。近年は国内でもOpenBSDの商用サポートを行う製品も増えてたり、BSDな学生もOpenBSD使いが圧倒的なんだとか。

対する我らがFreeBSDのブランドはというと、何でもこなせるけどそれが仇になってて目玉がない(いわゆる器用貧乏状態)とか、“Free”って名前が良くない(何がFreeなんや?金払っちゃいかんのか?)とか、マスコットが悪魔なのが悪いんじゃないか?などなど議論されているらしいw

で、改めてFreeBSDの推し機能は何なのか?となると、ZFSとbhyveがそうなってくるんじゃなかろうか、というのが総意に至らずとも概ねの雰囲気だそうで。

確かにFreeBSDってブランド力ないなーと思う。堅牢性が高い、大手サイトのサーバに採用されていると言った宣伝がなされはするものの、一体何年前から同じ事言ってんだって感じだし、現実問題、Linuxが栄華を極めている訳だし…。BSD使いを宣言しようものなら「えーマジBSD!?」「BSDが許されるのは小学生までだよねー」と言われんばかりで、BSD使いへの迫害は日々激しさを増すばかりな訳ですよ。

個人的には、ディストリビューションの興隆・衰退に振り回されずに済む、知識の連続性と蓄積が容易い、というのがFreeBSDの最大のメリットだと思う。この辺は人それぞれだろうけど、良いところは積極的に宣伝していかないと、どんなに良いものでも意味が無いからなー。

後藤さんも仰ってたが、こういう話が開発者の中でも出て来たというのは、良い傾向だと思う。というわけで、今後のFreeBSDのマーケティングに期待。あ、ちなみに後藤さんはマジナイスガイでした。

勉強会と聞くとちょっと堅苦しい感じもするが、どちらかといえば交流会に近い感じかなと。とはいっても、それほど交流交流してるわけでもなく、何とも不思議な空間だった。なんせ、受付でも、勉強会後の酒インストール会でも自己紹介等はなく、お互いがお互いを知らない状態で話してるんだからねw こち亀のネタ「アオいいよね」「いい…」の雰囲気に近いんじゃないかと思ったww

これからは継続的に参加したいと思う。

次回はFreeBSDのドキュメント翻訳ツールの使い方の解説なので、実環境があった方が捗りそう。

C#でローカルのDTDファイルを使うXMLリゾルバを作る

以前、C#でXmlDocumentを作る時にリゾルバでタイムアウトすると書いたが、ようやくローカルのDTDファイルを使ったXMLリゾルバが作れたので、コードをまるっと公開。尚、.NET Framework 4では殆ど同じことを行うXmlPreloadedResolverクラスが追加されているので、使えるならそっちを使うのが良い。悲しいかな、うちは.NET 3.5なのさ……

using System;
using System.Collections.Generic;
using System.Xml;
using System.IO;
 
namespace ProductionKusoGA
{
    class LocalXmlResolver : XmlResolver
    {
        public LocalXmlResolver()
        {
        }
 
        public override System.Net.ICredentials Credentials
        {
            set {  }
        }
 
        public override Uri ResolveUri(Uri baseUri, string relativeUri)
        {
            Uri uri = DocTypeManager.Instance.GetDTDURI(relativeUri);
            return uri != null ? uri : base.ResolveUri(baseUri, relativeUri);
        }
 
        public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
        {
            object entity = DocTypeManager.Instance.GetDTDStream(absoluteUri.AbsoluteUri);
            if (entity == null)
            {
                XmlUrlResolver resolver = new XmlUrlResolver();
                entity = resolver.GetEntity(absoluteUri, role, ofObjectToReturn);
            }
            return entity;
        }
 
        class DocTypeManager
        {
            public static readonly DocTypeManager Instance = new DocTypeManager();
 
            public Uri GetDTDURI(string inFPI)
            {
                Uri dtdURI = null;
                URIForFPI.TryGetValue(inFPI, out dtdURI);
                return dtdURI;
            }
 
            public FileStream GetDTDStream(string inURI)
            {
                FileStream stream = null;
                if (DTDStreamForURI.TryGetValue(inURI, out stream) == false)
                {
                    string dtdFile = null;
                    if (DTDFileForURI.TryGetValue(inURI, out dtdFile))
                    {
                        string RESOURCE_DIR = "...";
                        stream = new FileStream(Path.Combine(RESOURCE_DIR, dtdFile), FileMode.Open);
                        DTDStreamForURI.Add(inURI, stream);
                    }
                }
                return stream;
            }
 
            DocTypeManager()
            {
                URIForFPI = new Dictionary<string,Uri>();
                DTDFileForURI = new Dictionary<string,string>();
                DTDStreamForURI = new Dictionary<string, FileStream>();
 
                AddDTD("-//W3C//DTD XHTML 1.0 Strict//EN",      @"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd",       @"path/to/xhtml1-strict.dtd");
                AddDTD("-//W3C//DTD XHTML 1.0 Trasitional//EN", @"http://www.w3.org/TR/xhtml1/DTD/xhtml1-trasitional.dtd",  @"path/to/xhtml1-trasitional.dtd");
                AddDTD("-//W3C//DTD XHTML 1.0 Frameset//EN",    @"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd",     @"path/to/xhtml1-frameset.dtd");
                AddDTD("xhtml-lat1.ent", @"http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent", @"path/to/xhtml-lat1.ent");
                AddDTD("xhtml-symbol.ent", @"http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent", @"path/to/xhtml-symbol.ent");
                AddDTD("xhtml-special.ent", @"http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent", @"path/to/xhtml-special.ent");
            }
 
            ~DocTypeManager()
            {
                foreach (var pair in DTDStreamForURI)
                {
                    if (pair.Value != null)
                    {
                        pair.Value.Dispose();
                    }
                } 
            }
 
            void AddDTD(string inFPI, string inURI, string inFilepath)
            {
                URIForFPI.Add(inFPI, new Uri(inURI));
                DTDFileForURI.Add(inURI, inFilepath);
            }
 
            Dictionary<string, Uri> URIForFPI { get; set; }
            Dictionary<string, string> DTDFileForURI { get; set; }
            Dictionary<string, FileStream> DTDStreamForURI{ get; set; }
        }
    }
}

DTDファイルのパスを適宜変更し、xmlDocument.Resolver = new LocalXmlResolver();ってな感じで設定してやればおk。DTDを増やしたいときはAddDTDを増やす。DTDが内部で参照しているファイル(上記コードで言えばxhtml-lat1.entとか)も漏れなく追加する必要がある。

一応、コードのライセンスはパブリックドメインってことで。煮るなり焼くなりお好きにどうぞ。

Blueprintで構造体のメンバ変数の値を設定する方法

UE4のBlueprintで、構造体のメンバ変数に値を代入する方法が分かりにくいのでメモ。構造体のインスタンスを新しく作るのではなく、既存インスタンスのメンバを変更するって事ね。

メンバの数がさほどないなら、新たにインスタンスを作って古いインスタンスと全部ピンで繋ぐって方法でも行けなくはない。しかしながら、不要な一時インスタンスは作らないというのがプログラマ的矜持なのである。何より美しくないしねぇ…。覚えておいて損はないよ!

ebayで買い物したらi-Parcelで送られてきたでござるの巻

1月の事になるが、ebayでアメリカの業者からPCのキーボードを購入したらi-Parcelで送られてきた。この配送業者、検索すれば分かる通り評判があまりよろしくない。送料で20ドル払ってるのにこんなのって酷いよ(´;ω;`)。

荷物は無事届いたものの噂通り時間がかかった。参考までに到着までの記録を載せておこう。

日時 状況 場所 備考
2016/1/24注文
2016/1/25Pre-Shipment Info Sent to USPS 配送情報登録
2016/1/26 10:37Accepted at USPS Origin FacilityLAKEWOOD, NJ 08701引受
2016/1/26 11:52Arrived at USPS Origin FacilityKEARNY, NJ 07032発送元配送局到着
2016/1/27 19:30Arrived at USPS Destination FacilityCINCINNATI, OH 45235目的地配送局到着
2016/1/28 07:20DeliveredERLANGER, KY 41025配達済み
⇩i-parcelに引き継ぎ⇩
2016/1/29 20:34Package details received electronically from SellerEdison配送情報登録
2016/2/01 17:51Received at i-ParcelIndianapolis荷物到着
2016/2/01 21:44Exported i-Parcel and in transit to country of destinationIndianapolis日本に向けて出荷
2016/2/05 14:17Package arrived in the destination country and is awaiting release from the Customs clearing agency日本日本到着。通関待ち。
2016/2/05 17:34Completed customs clearance process日本通関手続き完了
2016/2/06 12:49Out for delivery日本持ち出し中
2016/2/07 15:27Delivered日本配達済み

と、まぁこんな感じでまるっと2週間かかった。ネットの情報通り、国内配送は佐川だった。

時間かかるのはいいんだけっともさ、追跡情報の更新が遅いのは頂けないっすねぇ…。中国邮政より精度悪いんですぜ?荷物受領後もしばらくは「日本に向けて出荷」のままだったし……。何のためのトラッキングなんだよっていう。

  • start.txt
  • 最終更新: 2022-07-27 15:26
  • by Decomo