A certain engineer "COMPLEX"

開発メモ その168 Windowsコンテナを使ってみる

Introduction


開発中のOSSでWindows Server Coreへの対応についてのissueがあったので、調査がてら導入してみる。
Windows Server 2016を使います。
評価版で検証を行います。

How to


下記の方が教えてくれました。

この記事は、(http://www.takanyan.net/windows-server-container-1/)の記事を転記したものです。Windows Server 2016からDocker...

Windowsの最新化

全てのセキュリティパッチを含む更新を行います。

コンテナの有効化

役割と機能の追加からコンテナを有効化します。

インストール

管理者権限でPowerShellを起動。
場合によっては下記のように*Nuget**の更新が必要になりますが、その場合はYesと答え、もう一度コマンドを実行します。


> Install-Module -Name DockerMsftProvider -Repository PSGallery –Force

NuGet provider is required to continue
PowerShellGet requires NuGet provider version '2.8.5.201' or newer to interact with NuGet-based repositories. The NuGet provider must be available in 'C:\Program Files\PackageManagement\ProviderAssemblies' or
'C:\Users\Administrator\AppData\Local\PackageManagement\ProviderAssemblies'. You can also install the NuGet provider by running 'Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force'. Do you want PowerShellGet to
install and import the NuGet provider now?
[Y] Yes [N] No [S] Suspend [?] Help (default is "Y"): Y
> Install-Module -Name DockerMsftProvider -Repository PSGallery –Force

パッケージソースからのインストールを信頼するかどうかの確認。
Yesと答えます。
少し時間がかかりますが、待っているとインストールが完了します。
完了後、再起動します。
再起動後、dockerをインストールします。


PS C:\Users\Administrator> Install-Package -Name docker -ProviderName DockerMsftProvider

The package(s) come(s) from a package source that is not marked as trusted.
Are you sure you want to install software from 'DockerDefault'?
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "N"): Y

Name Version Source Summary
---- ------- ------ -------
Docker 18.09.3 DockerDefault Contains Docker EE for use with Windows Server.

確認


> docker version
Client:
Version: 18.09.3
API version: 1.39
Go version: go1.10.8
Git commit: 142dfcedca
Built: 02/28/2019 06:33:17
OS/Arch: windows/amd64
Experimental: false

Server:
Engine:
Version: 18.09.3
API version: 1.39 (minimum version 1.24)
Go version: go1.10.8
Git commit: 142dfcedca
Built: 02/28/2019 06:31:15
OS/Arch: windows/amd64
Experimental: false

実行

コードの用意

動かしたいサンプルは

  • Windows Server Core 2016
  • dotnet core のコンソール

となります。
コードは下記になります。


using System;

namespace Sample
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(System.Environment.OSVersion.Platform);
}
}
}

コンテナ内でソースを用意するのは面倒なので、あらかじめ用意しておいて、ビルド時にコピーするようにします。

サンプル実行

下記のDockerfileを作成します。


FROM mcr.microsoft.com/windows/servercore:10.0.14393.2665

SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

# Install .NET Core SDK
ENV DOTNET_SDK_VERSION 2.2.104

RUN Invoke-WebRequest -OutFile dotnet.zip https://dotnetcli.blob.core.windows.net/dotnet/Sdk/$Env:DOTNET_SDK_VERSION/dotnet-sdk-$Env:DOTNET_SDK_VERSION-win-x64.zip; \
$dotnet_sha512 = '2e73f64a7fdf0f9e03a58a1824375dab91cae658c1863d5130047064643a5c035db25251c443e9e0eded73ffe7b33ae6e1be4e16083da6122dfc1a7d6e2f1564'; \
if ((Get-FileHash dotnet.zip -Algorithm sha512).Hash -ne $dotnet_sha512) { \
Write-Host 'CHECKSUM VERIFICATION FAILED!'; \
exit 1; \
}; \
\
Expand-Archive dotnet.zip -DestinationPath $Env:ProgramFiles\dotnet; \
Remove-Item -Force dotnet.zip

SHELL ["cmd", "/S", "/C"]

RUN ["C:/Program Files/dotnet/dotnet.exe", "new", "console", "-n", "Sample"]
COPY ["Program.cs", "c:/Sample"]
WORKDIR Sample

そして実行。
dotnetの初回起動時の復元処理に時間がかかります。
終わらなかったら、一度Ctrl+CでbuildをキャンセルするとOKです。


$ docker build -t test .
$ docker run -t test cmd
> "C:\Program Files\dotnet\dotnet.exe" run -c Release
Win32NT

詳細なバージョン情報も表示してみます。


powershell [System.Environment]::OSVersion

Platform ServicePack Version VersionString
-------- ----------- ------- -------------
Win32NT 10.0.14393.0 Microsoft Windows NT 10.0.14393.0

開発メモ その167 Raspberry Pi 3をWindows 10でエミュレートする

Introduction


備忘録。
RaspberryPIを仮想環境で使いたくなったのでメモ。
ただし、現時点ではARM64のエミュレートはできませんでした。

How to


下記の方が教えてくれました。

どうも、ビンの王冠をスプーンで開けようとして指を怪我したニンゲンです。(怠慢ヨクナイネ)ちなみにビンの王冠と芥川龍之介は同い年なんですよ、知らなくて良い雑学で...

QEMUのインストール

下記から最新版をダウンロードしてインストール。

Raspbian Jessieのダウンロード

下記からダウンロード。
最新のStrechは動かなかったので断念。

QEMU用カーネルとDevice Treeファイル

下記から、

  • versatile-pb.dtb
  • kernel-qemu-4.4.34-jessie

をダウンロード。
kernel-qemuはバージョンが随時変わります。

Qemu kernel for emulating Rpi on QEMU. Contribute to dhruvvyas90/qemu-rpi-kernel development by creating an account on GitHub.

下準備

仮想マシンでも何でも良いのでダウンロードしたRaspbianのイメージを仮想マシンにコピー。

セクターの確認


$ fdisk -l 2017-01-11-raspbian-jessie-lite.img
Disk 2017-01-11-raspbian-jessie-lite.img: 1.3 GiB, 1390411776 bytes, 2715648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x244b8248

Device Boot Start End Sectors Size Id Type
2017-01-11-raspbian-jessie-lite.img1 8192 137215 129024 63M c W95 FAT32 (LBA)
2017-01-11-raspbian-jessie-lite.img2 137216 2715647 2578432 1.2G 83 Linux

マウント


$ sudo mount -v -o offset=$((512*137216)) -t ext4 ./2017-01-11-raspbian-jessie-lite.img /mnt/
mount: /dev/loop0 mounted on /mnt.

ファイルシステムテーブルの編集


$ sudo vi /mnt/etc/fstab

proc /proc proc defaults 0 0
-/dev/mmcblk0p1 /boot vfat defaults 0 2
- /dev/mmcblk0p2 / ext4 defaults,noatime 0 1
+ #/dev/mmcblk0p1 /boot vfat defaults 0 2
+ #/dev/mmcblk0p2 / ext4 defaults,noatime 0 1

ld.so.preloadの編集


$ sudo editor /mnt/etc/ld.so.preload

- /usr/lib/arm-linux-gnueabihf/libarmmem.so
+ #/usr/lib/arm-linux-gnueabihf/libarmmem.so

アンマウント


$ sudo umount /mnt

起動

-hdaでダウンロードしたRaspbianのイメージを指定します。これがHDDになります


set QEMU="C:\Program Files\qemu\qemu-system-arm.exe"
%QEMU% -kernel kernel-qemu-4.4.34-jessie ^
-cpu arm1176 ^
-m 256 ^
-M versatilepb ^
-serial stdio ^
-append "root=/dev/sda2 rootfstype=ext4 rw" ^
-hda 2017-01-11-raspbian-jessie-lite.img ^
-net nic ^
-net user,hostfwd=tcp::20022-:22

開発メモ その166 重すぎるリポジトリをgit fetchする

Introduction


備忘録。
自宅のライブラリ保存用リポジトリが巨大化してpullできなくなりました。
その際の対策。


$ git fetch
remote: Enumerating objects: 8824, done.
remote: Counting objects: 100% (8821/8821), done.
error: RPC failed; curl 56 Failure when receiving data from the peer
fatal: the remote end hung up unexpectedly
fatal: protocol error: bad pack header

How to


下記の方が教えてくれました。

git clone http://example.com/fuga.git remote: Counting objects: 3203, done. remote: warning: suboptimal pack - out of memory remote: fatal: Out of memory, ma...

徐々にfetchしてpullすればよいと。


$ git fetch --depth 1
remote: Enumerating objects: 8374, done.
remote: Counting objects: 100% (8374/8374), done.
remote: Compressing objects: 100% (6008/6008), done.
remote: Total 8356 (delta 2189), reused 8277 (delta 2170)
Receiving objects: 100% (8356/8356), 1.31 GiB | 28.65 MiB/s, done.
Resolving deltas: 100% (2189/2189), completed with 9 local objects.
From https://hogehoge:3000/git/Lib
+ 67ccf8298...3fb81d65f master -> origin/master (forced update)
* [new branch] develop -> origin/develop
$ git fetch --depth 10
remote: Enumerating objects: 332, done.
remote: Counting objects: 100% (331/331), done.
remote: Compressing objects: 100% (154/154), done.R
remote: Total 310 (delta 166), reused 262 (delta 149)
Receiving objects: 100% (310/310), 66.85 MiB | 25.18 MiB/s, done.
Resolving deltas: 100% (166/166), completed with 10 local objects.
$ git fetch --depth 100
remote: Enumerating objects: 6031, done.
remote: Counting objects: 100% (5332/5332), done.
remote: Compressing objects: 100% (4312/4312), done.
remote: Total 5107 (delta 1739), reused 2367 (delta 531)
Receiving objects: 100% (5107/5107), 208.07 MiB | 14.61 MiB/s, done.
Resolving deltas: 100% (1739/1739), completed with 120 local objects.
$ git fetch
$ git pull origin master

cloneの場合も同様。


$ git clone --depth 1 http://example.com/fuga.git

開発メモ その165 gitで全ブランチをpullする

Introduction


備忘録。
UbuntuGit for Windowsで使えました。

How to


下記の方が教えてくれました。

すごく久々の投稿。 とりあえずコマンドを先に。 for branch in `git branch -r | grep -v HEAD | awk -F'/' '{print $2}'`; do git checkout ...


for branch in `git branch -r | grep -v HEAD | awk -F'/' '{print $2}'`; do git checkout $branch; git pull; done

Googleでgit 全ブランチで検索してトップに出てくるページのスクリプトは使えませんでした。

開発メモ その164 Ubuntu 18.04にCUDA 9.2をインストール

Introduction


CUDAのダウンロードページでCUDA 9.2にアクセスすると

Ubuntu 18.04に対応していないように見える。
そこはかとない不安を感じながら9.2をインストールしたのでメモ。

How to


17.10を選択し、runfile [local]を選択しダウンロードするだけです。
パッチもあるので忘れないこと。

インストール


sudo sh cuda_9.2.148_396.37_linux

でインストールを開始する。
最初にEULAの承諾を求められるので末尾に移動する。
Ctrl+Fで一気に末尾に。


Do you accept the previously read EULA?
accept/decline/quit:accept

EULAの承諾に対してはacceptと押下してENTER。
以降は、質問に答えていく形で、yまたはnEnterを駆使します。
途中でドライバーのインストールを聞かれますが、既に入っているなら無理してインストールする必要はないです。


You are attempting to install on an unsupported configuration. Do you wish to continue?
(y)es/(n)o [ default is no ]: y


Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 396.37?
(y)es/(n)o/(q)uit: n


Install the CUDA 9.2 Toolkit?
(y)es/(n)o/(q)uit: y


Enter Toolkit Location
[ default is /usr/local/cuda-9.2 ]:


Do you want to install a symbolic link at /usr/local/cuda?
(y)es/(n)o/(q)uit: y


Install the CUDA 9.2 Samples?
(y)es/(n)o/(q)uit: y


Enter CUDA Samples Location
[ default is /home/takuya ]:


Installing the CUDA Toolkit in /usr/local/cuda-9.2 ...
Installing the CUDA Samples in /home/takuya ...
Copying samples to /home/takuya/NVIDIA_CUDA-9.2_Samples now...
Finished copying samples.


===========
= Summary =
===========


Driver: Not Selected
Toolkit: Installed in /usr/local/cuda-9.2
Samples: Installed in /home/takuya


Please make sure that
- PATH includes /usr/local/cuda-9.2/bin
- LD_LIBRARY_PATH includes /usr/local/cuda-9.2/lib64, or, add /usr/local/cuda-9.2/lib64 to /etc/ld.so.conf and run ldconfig as root


To uninstall the CUDA Toolkit, run the uninstall script in /usr/local/cuda-9.2/bin


Please see CUDA_Installation_Guide_Linux.pdf in /usr/local/cuda-9.2/doc/pdf for detailed information on setting up CUDA.


***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 384.00 is required for CUDA 9.2 functionality to work.
To install the driver using this installer, run the following command, replacing with the name of this run file:
sudo .run -silent -driver


Logfile is /tmp/cuda_install_2992.log

パッチのインストール

こちらもEULAの承諾が必要です。


sudo sh cuda_9.2.148.1_linux

承諾方法は同様。
聞かれるのはインストール先のみ。


Enter CUDA Toolkit installation directory
[ default is /usr/local/cuda-9.2 ]:


Installation complete!
Installation directory: /usr/local/cuda-9.2

簡単ですね。
aptを使うインストールよりも、こちらのが簡単な気がしないでもないです。