Xamarinをちょっと触っているのですが、Macを新しくしたらWindows側のXamarin Mac AgentからMacにログインできなくなりました。

20170113_macagenterror

ネットワークとかMacのSharing設定ではなく、なんかライセンスを承認してないとか言うエラーです。でもMac側では普通にXcodeも使える状態ですので調べてみたら、

Xamarin.iOS 10.0.0.6: Mac Agent can’t connect after update

Solution:

  1. Go to Xcode -> Preferences -> Location
  2. Check if “Command Line Tool” set
  3. Run sudo xcodebuild -license in terminal
  4. Follow instructions

こう言うのがあったので試してみいたら接続できるようになりました。

そういえば、Xcodeをインストールする前にCommandlineToolsを入れたような記憶があるのでそれのせいかもしれません。

タブレットで動かすWPFアプリケーションでは、ソフトウェアキーボードを制御できないので、適宜テキストボックスフォーカス時などに、c:\Program Files\Common Files\microsoft shared\ink\TabTip.exeを呼び出すようなことになります。

で、たまたまその仕組みを使っていたアプリケーションを改修していたところ、ソフトウェアキーボードが出ないようになってることに気がつきました。Anniversary Updateのせいみたいです。

調べてみたところ、HKEY_CURRENT_USER\SOFTWARE\Microsoft\TabletTip\1.7にEnableDesktopModeAutoInvokeというキーを作って、DWORD値を1にすれば良いと言うことだったので試してみたら表示されるようになりました。

Show touch keyboard (TabTip.exe) in Windows 10 Anniversary edition

Entity Frameworkは以前から興味があって、隙間を見つけてどういう風に使って、どういう風に動くのか調べてたのですが、途切れ途切れになったままCoreになってしまったので、また試してみました。

大体データベースを扱う場合は、何らかデータがリレーションしていたりして、親子になってるテーブルなんかは普通に出てきます。そういうのを単純なモデルにするとこうなります。

public class Order
{
    public int OrderId { get; set; }
    public DateTime OrderDate { get; set; }

    public List<OrderDetail> OrderDetails { get; set; }
}

public class OrderDetail
{
    public int OrderDetailId { get; set; }
    public stirng ProductCode { get; set; }
    public int Amount { get; set; }

    public int OrderId { get; set; }
    public Order Order { get; set; }
}

これで、Order-OrderDetailで親子になるようなテーブルができてくれます。
データをセットするときは、

var context = SampleDbContext();

context.Order.Add(
    new Order
    {
        OrderDate = DateTime.Now,
        OrderDetails = new List<OrderDetails>
        {
            new OrderDetail
            {
                ProductCode = "A001",
                Amount = 1
            }
        }
    });

context.SaveChanges();

こんな感じで普通にC#でオブジェクトを扱うようにすれば、よしなにしてくれます。
データを取得する場合は、

var context = SampleDbContext();

var orders = context.Orders;

foreach (var order in orders)
{
    Console.WriteLine($"{order.OrderId},{order.OrderDate}");
    foreach (var detail in order.OrderDetails)
    {
        Console.WriteLine($"{detail.ProductCode},{detail.Amount}");
    }
}

とかやると、もうSQLのことを何も考えず、JOINとか気にする必要なくデータが出る……と思いきや、order.OrderDetailsの中身がnullになっててエラーになります。
前やってみたときはこれでさくっと出て、いたく感動したものですが、なんか思った通りに行きません。モデルもきわめて単純だし、データをのぞいてみてもちゃんと入ってるのに……

で、回答はここにありました。

Part 2. Entity Framework Core 1.0 の基本的な使い方

こちらの下の方にある「Lazy Loadingの廃止」というところが参考になりました。

前に行けていたように思えていたのは、Lazy LoadingでEFがあとから引っ張ってきてくれていたおかげなんですね。

var orders = context.Orders
    .Include(o => o.OrderDetails);

こうすると子のデータも取れるようになりました。
もしOrderDetailがさらにリストを持っているような場合は、

var orders = context.Orders
    .Include(o => o.OrderDetails)
        .ThenInclude(d => d.DetailSubItems);

みたいに、ThenIncludeをつないでいくことになります。

また、Orderが複数のリストを持つような場合は、

var orders = context.Orders
    .Include(o => o.OrderDetails)
        .ThenInclude(d => d.DetailSubItems)
    .Include(o => o.Items);

みたいにして、Includeを繋げれば取ってこれます。

Entity Frameworkについてはググると以前のバージョンについての話と、Coreについての話がぱっと見てわかりづらいのでなかなか調べるのもなかなか大変ですね。

Windows10の1607が公開されましたが、Windows Updateで落ちてくる気配がなかったので、VMWare Fusionで使っているWindows10環境を手動でアップデートしたところ、VMWareのファイル共有が効かなくなりました。

Windowsに限らず、VMWareを使っていると時々あることで、そういう場合は何らかの原因でVMWare Toolsがちゃんと動いていないケースがほとんどですので、VMWare Toolsを再インストールとかしてみれば大丈夫なんですが、今回それではダメでした。

ちょっと調べてみたら、共有フォルダが使えなくなる原因は下記の理由みたいです。

3. Re: Shared Folders – Windows 10 upgrade from 15.11.

この書き込み自体は去年末のWindows10-1511のアップデートの時にされたものですが、内容としては「Windowsのアップデートによって、ネットワーク関連のレジストリ設定から、VMWareのファイル共有プロトコルが消えてしまう」ことにあるみたいなので、もしかしたら今回も同じかも知れないと思って、確認してみましたら、確かにvmhgfsというのが無い状態でした。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\NetworkProvider\Order
Name: ProviderOrder
Type: REG_SZ
Data: "RDPNP, LanmanWorkstation,webclient"

Modify to:
Data: "vmhgfs,RDPNP, LanmanWorkstation,webclient"

ということで、先頭にvmhgfsを追加したらすぐに反映されるようになりました。
レジストリ操作にありがちな、再起動/ログオフなどは不要です。
VMWare Toolsの再インストールも不要です。

この書き込みの人は、この共有ファイル機能を担当している開発者みたいで、そりゃもうどんぴしゃな答えですよね。

まとめ

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\NetworkProvider\Order
  • ProviderOrderの値に”vmhgfs”が無ければ、それを先頭に追加する。
  • 再起動やログオフ不要、すぐに反映される。
  • VMWare Toolsの再インストールなども不要。

最近gitの2.8.0がリリースされましたので、作業環境のmacに入っているgitを更新することにしたんですが、3/31現在https://git-scm.com/のダウンロードでは2.6.4が落ちてきます。

なので、Homebrewで更新してみました。

$ brew install git

とりあえずこれでインストールされますが、以前本家サイトのインストーラーで入れたものが有効になっていて、

$ git --version
git version 2.6.2

ってことになってしまいますので、

$ which git
/usr/local/bin/git

で場所を確認して、

$ ls -la /usr/local/bin | grep git

とやると、git関連のコマンドが、/ust/local/git/binにリンクされてることがわかります。
Homebrewでインストールしたものは、/usr/local/Cellar/git/2.8.0にありますので、このリンクを張り替えてやればいいんですが、これもbrewでできます……が、すでにリンクが存在するとエラーになるようです。

$ brew link git
Linking /usr/local/Cellar/git/2.8.0...
Error: Could not symlink bin/git
Target /usr/local/bin/git
already exists. You may want to remove it:
  rm '/usr/local/bin/git'

To force the link and overwrite all conflicting files:
  brew link --overwrite git

To list all files that would be deleted:
  brew link --overwrite --dry-run git

とりあえず強制的にリンクを上書きする、ってことで、

$ brew link --overwrite git

として、やっと

$ git --version
git version 2.8.0

となりました。

« Prev