Category Archives: docker/container

Visual Studio 2019 Release Candidate リリース関連Blogまとめ #vsjp

VS2019がRCとなりました。関連するMS系のBlogへのリンクを、見つけた限りここにまとめていきます。

ダウンロード: https://visualstudio.microsoft.com/downloads/

※日本語のサイトではまだリンクがありませんが、そのうちに登場すると思われます。
※日本語版および日本のロケール設定になっているWindowsからVS2019 RCを入手したい場合には、現状MSDNサブスクライバダウンロードからのダウンロードが必要です(2019/02/28 10:52現在)。

全体

C#/.NET

C++

日本国内の反応

その他

Windowsでpylint実行時にModuleNotFoundError: No module named ‘wrapt.wrappers’のErrorが出る場合の対処方法

情報源: python – Running pylint returns ModuleNotFoundError: No module named ‘wrapt.wrappers’ – Stack Overflow

  File "c:\users\jptais1\appdata\local\programs\python\python36\lib\site-packages\wrapt\__init__.py", line 4, in <module>
    from .wrappers import (ObjectProxy, CallableObjectProxy, FunctionWrapper,
ModuleNotFoundError: No module named 'wrapt.wrappers'

というようなエラーが出た場合、本当にモジュールがないので、以下のフォルダに((…)はあなたのユーザー名)にwraptのGitHubから最新のソースを入手して、解凍した後にsrcディレクトリの内容を以下のフォルダに上書きします。

64bit:
C:\Users\(...)\AppData\Local\Programs\Python\Python36\lib\site-packages\wrapt\
32bit:
C:\Users\(...)\AppData\Local\Programs\Python\Python36-32\lib\site-packages\wrapt\

これで必要なモジュールが書かれたpyファイルが追加されるのでとりあえずpylintは動くようになるはず。

WSL Interoperability with Docker

情報源: [Cross Post] WSL Interoperability with Docker – Windows Command Line Tools For Developers

Memo.

WSL上でDockerが動くというわけではなく、WSLのWindowsプロセスとのパイプ接続の仕組みを利用して、Docker for Windows上でDockerのコンテナが動作する仕組みとなっているようです。下の図が仕組みを表しております。

Announcing .NET Core Tools 1.0 

Memo.

.NET Coreは正式リリースしているものの、ツールはBetaの状態が続いていましたが、正式リリースとなりました。

その他、Docker、VS2017などでの.NET Coreに関する話題。

A first-hand look from the .NET engineering teams

情報源: Announcing .NET Core Tools 1.0 | .NET Blog

MSDNマガジンConnect(); 2016特集号

情報源: Connect(); 2016

日本語版はまだですが、現在開催されているConnect(); 2016のMSDNマガジン特集号が公開されました。

Blogを追いかけるのも良いのですが、全体サマリをそれなりの深度で確認されたい方はまずこれを呼んでから、公開されたセッションビデオを見てみるのも良いかと思います。

セッションビデオは以下で公開されるはず。

https://channel9.msdn.com/Events/Connect/2016

TypeScript 2.0 RC

情報源: Announcing TypeScript 2.0 RC

文法上の変更点については上リンク先を確認してください。

Visual Studio 2015 Update 3以上向けダウンロード

それ以外の環境:

npm install -g typescript@rc


Docker for Windowsのpullコマンド実行時にTime Outエラーでpull出来ないとき

Docker RunコマンドやDocker Pullコマンド実行時に以下のようにPull実行時にTimeOutのエラーが出てPull出来ませんでした。

C:\Users\ishisaka>docker run hello-world
Unable to find image 'hello-world:latest' locally
Pulling repository docker.io/library/hello-world
docker: Network timed out while trying to connect to https://index.docker.io/v1/repositories/library/hello-world/images. You may want to check your internet connection or if you are behind a proxy..
See 'docker run --help'.

Porxyなんてないしさっぱり。。。と思っていたのですが、%USERPROFILE%AppData\Local\Dockerにあるログを確認したところ、レポジトリにIPV6で接続に移行として失敗していました。私が利用しているAsahiネットは現在IPV6に対応していません。そりゃ繋がらない。

という事で、あれ?と思ったときにはIPV6を切ってみるのも一つの方法かも。

Docker for Windowsが正式版となったらしい

情報源: Docker

Hyper-Vを使用するので、Virtual Boxは使用されなくなった。裏を返せばWindows 7やWindows 10でもHOMEエディションでは使用できない。要求仕様もWindows 10 Professional x64, Windows 10 Enterprise x64の何れかとなっている。

.NET Coreでの元号追加

情報源: coreclr/JapaneseCalendar.cs at master · dotnet/coreclr

設定ファイル化されているわけでは無いので、上Core CLRのソース変更が必要なようですね。

internal static EraInfo[] GetEraInfo()
{
    // See if we need to build it
    if (japaneseEraInfo == null)
    {
        japaneseEraInfo = GetJapaneseEras();
        // See if we have to use the built-in eras
        if (japaneseEraInfo == null)
        {
            // We know about some built-in ranges
            EraInfo[] defaultEraRanges = new EraInfo[4];
            defaultEraRanges[0] = new EraInfo(4, 1989, 1, 8, 1988, 1, GregorianCalendar.MaxYear - 1988,
                                               "\x5e73\x6210", "\x5e73", "H");    // era #4 start year/month/day, yearOffset, minEraYear
            defaultEraRanges[1] = new EraInfo(3, 1926, 12, 25, 1925, 1, 1989 - 1925,
                                               "\x662d\x548c", "\x662d", "S");    // era #3,start year/month/day, yearOffset, minEraYear
            defaultEraRanges[2] = new EraInfo(2, 1912, 7, 30, 1911, 1, 1926 - 1911,
                                               "\x5927\x6b63", "\x5927", "T");    // era #2,start year/month/day, yearOffset, minEraYear
            defaultEraRanges[3] = new EraInfo(1, 1868, 1, 1, 1867, 1, 1912 - 1867,
                                               "\x660e\x6cbb", "\x660e", "M");    // era #1,start year/month/day, yearOffset, minEraYear

            // Remember the ranges we built
            japaneseEraInfo = defaultEraRanges;
        }
    }

    // return the era we found/made
    return japaneseEraInfo;
}

ちょうどこの部分かな。

後はこれ。

https://github.com/dotnet/coreclr/blob/master/src/mscorlib/corefx/System/Globalization/JapaneseCalendar.Windows.cs

  private static EraInfo[] GetJapaneseEras()
  {
      int erasCount = WinRTInterop.Callbacks.GetJapaneseEraCount();
      if (erasCount < 4)
      {
          return null;
      }

      EraInfo[] eras = new EraInfo[erasCount];
      int lastMaxYear = GregorianCalendar.MaxYear;

      for (int i = erasCount; i > 0; i--)
      {
          DateTimeOffset dateOffset;

          string eraName;
          string abbreviatedEraName;

          if (!GetJapaneseEraInfo(i, out dateOffset, out eraName, out abbreviatedEraName))
          {
              return null;
          }

          DateTime dt = new DateTime(dateOffset.Ticks);

          eras[erasCount - i] = new EraInfo(i, dt.Year, dt.Month, dt.Day, dt.Year - 1, 1, lastMaxYear - dt.Year + 1,
                                             eraName, abbreviatedEraName, GetJapaneseEnglishEraName(i));    // era #4 start year/month/day, yearOffset, minEraYear

          lastMaxYear = dt.Year;
      }

      return eras;
  }

Windowsの場合、Windows側がWindows Update等で対応すれば問題無いかも。Unix/Linuxもシステム側の同じような感じ。

https://github.com/dotnet/coreclr/blob/master/src/mscorlib/corefx/System/Globalization/JapaneseCalendar.Unix.cs

private static EraInfo[] GetJapaneseEras()
{
    string[] eraNames;
    if (!CalendarData.EnumCalendarInfo("ja-JP", CalendarId.JAPAN, CalendarDataType.EraNames, out eraNames))
    {
        return null;
    }

    string[] abbrevEnglishEraNames;
    if (!CalendarData.EnumCalendarInfo("en", CalendarId.JAPAN, CalendarDataType.AbbrevEraNames, out abbrevEnglishEraNames))
    {
        return null;
    }

    List eras = new List();
    int lastMaxYear = GregorianCalendar.MaxYear;

    int latestEra = Interop.GlobalizationInterop.GetLatestJapaneseEra();
    for (int i = latestEra; i >= 0; i--)
    {
        DateTime dt;
        if (!GetJapaneseEraStartDate(i, out dt))
        {
            return null;
        }

        if (dt < JapaneseCalendar.calendarMinValue)
        {
            // only populate the Eras that are valid JapaneseCalendar date times
            break;
        }

        eras.Add(new EraInfo(i, dt.Year, dt.Month, dt.Day, dt.Year - 1, 1, lastMaxYear - dt.Year + 1,
            eraNames[i], GetAbbreviatedEraName(eraNames, i), abbrevEnglishEraNames[i]));

        lastMaxYear = dt.Year;
    }

    // remap the Era numbers, now that we know how many there will be
    for (int i = 0; i < eras.Count; i++)
    {
        eras[i].era = eras.Count - i;
    }

    return eras.ToArray();
}