ゲーム関連の蔵書洗い出し。

持ち腐れするぐらいなら、欲してる人へ。

f:id:rokujyouhitoma:20180916193707j:plain

一覧

macでdotnet/coreの環境構築、Nugetの導入、自作ライブラリを組み込む

MacC#である。dotnet/coreをMacで実行するとは、つまりそういうことだ。

近年のMicrosoftは大好きだ。

概要

環境

dotnet/coreの環境構築

  • dot net SDK 2.1.301

インストーラーに従いインストール。

$ curl -O https://download.microsoft.com/download/D/0/4/D04C5489-278D-4C11-9BD3-6128472A7626/dotnet-sdk-2.1.301-osx-gs-x64.pkg
$ open dotnet-sdk-2.1.301-osx-gs-x64.pkg

dotnetコマンドを実行し、バージョンの確認。

$ dotnet --version
2.1.301
$ dotnet

Usage: dotnet [options]
Usage: dotnet [path-to-application]

Options:
  -h|--help         Display help.
  --info            Display .NET Core information.
  --list-sdks       Display the installed SDKs.
  --list-runtimes   Display the installed runtimes.

path-to-application:
  The path to an application .dll file to execute.
$ dotnet help

.NET Core へようこそ!
---------------------
.NET Core についての詳細情報: https://aka.ms/dotnet-docs
'dotnet --help' を使用して利用可能なコマンドを確認するか、次にアクセスしてください: https://aka.ms/dotnet-cli-docs

テレメトリ
---------
.NET Core ツールは、エクスペリエンスの向上に役立つ利用状況データを収集します。データは匿名で、コマンドライン引数が含まれません。データは Microsoft によって収集され、コミュニティと共有されます。テレメトリをオプトアウトするには、お好きなシェルを使用して、DOTNET_CLI_TELEMETRY_OPTOUT 環境変数を '1' または 'true' に設定します。

.NET Core CLI ツールのテレメトリに関する詳細情報をお読みください: https://aka.ms/dotnet-cli-telemetry

ASP.NET Core
------------
ASP.NET Core HTTPS 開発証明書が正常にインストールされました。
証明書を信頼する (Windows および macOS のみ) には、まず 'dotnet tool install dotnet-dev-certs -g --version 2.1.0-preview1-final' を実行して dev-certs ツールをインストールし、次に 'dotnet-dev-certs https --trust' を実行します。
HTTPS を構成する方法の詳細については、https://go.microsoft.com/fwlink/?linkid=848054 をご覧ください。
.NET コマンド ライン ツール (2.1.301)
使用法: dotnet [runtime-options] [path-to-application]
使用法: dotnet [sdk-options] [command] [arguments] [command-options]

path-to-application:
  実行するアプリケーション .dll ファイルへのパス。

SDK コマンド:
  new              .NET プロジェクトを初期化します。
  restore          .NET プロジェクトに指定されている依存関係を復元します。
  run              .NET プロジェクトをコンパイルして、直ちに実行します。
  build            .NET プロジェクトを構築します。
  publish          展開用の .NET プロジェクトを発行します (ランタイムを含む)。
  test             プロジェクトに指定されているテスト ランナーを使用して、単体テストを実行します。
  pack             NuGet パッケージを作成します。
  migrate          project.json ベースのプロジェクトを msbuild ベースのプロジェクトに移行します。
  clean            ビルド出力を消去します。
  sln              ソリューション (SLN) ファイルを変更します。
  add              参照をプロジェクトに追加します。
  remove           参照をプロジェクトから削除します。
  list             プロジェクトの参照またはインストール済みツールを一覧表示します。
  nuget            追加の NuGet コマンドを提供します。
  msbuild          Microsoft Build Engine (MSBuild) を実行します。
  vstest           Microsoft Test Execution Command Line Tool を実行します。
  store            指定されたアセンブリを実行時ストアに格納します。
  tool             .NET のエクスペリエンスを向上するツールをインストールするか、使用します。
  build-server     ビルドによって開始されたサーバーとやり取りします。
  help             ヘルプを表示します。

共通のオプション:
  -v|--verbosity        コマンドの詳細レベルを設定します。使用可能な値: q[uiet]、m[inimal]、n[ormal]、d[etailed]、diag[nostic]。
  -h|--help             ヘルプを表示します。

コマンドに関する詳細情報については、'dotnet COMMAND --help' を実行します。

sdk-options:
  --version        使用中の .NET Core SDK バージョンを表示します。
  --info           .NET Core 情報を表示します。
  --list-sdks      インストール済み SDK を表示します。
  --list-runtimes  インストール済みランタイムを表示します。
  -d|--diagnostics 診断出力を有効にします。

runtime-options:
  --additionalprobingpath <path>    調査ポリシーと調査対象アセンブリを含むパス。
  --fx-version <version>            アプリケーションを実行するために使用するインストール済み Shared Framework のバージョン。
  --roll-forward-on-no-candidate-fx 候補がない Shared Framework に対するロールフォワードが有効です。
  --additional-deps <path>          追加の deps.json ファイルへのパス。

Additional tools ('dotnet [tool-name] --help' for more information):
  dev-certs      Create and manage development certificates.
  ef             Entity Framework Core command-line tools.
  sql-cache      SQL Server cache command-line tools.
  user-secrets   Manage development user secrets.
  watch          Start a file watcher that runs a command when files change.

dotnet/coreを実行

.NET and C# - Get started in 10 minutes を試し、dotnet/coreを実行。

  • dotnetコマンドでアプリケーションを作成
  • 作成されたテンプレートの確認
  • 実行

コンソールアプリケーションの作成

$ dotnet new console -o App
準備しています...
テンプレート "Console Application" が正常に作成されました。

作成後のアクションを処理しています...
'dotnet restore' を App/App.csproj で実行しています...
  /path/to/App/App.csproj のパッケージを復元しています...
  Microsoft.NETCore.DotNetAppHost 2.1.0 をインストールしています。
  Microsoft.NETCore.DotNetHostResolver 2.1.0 をインストールしています。
  Microsoft.NETCore.DotNetHostPolicy 2.1.0 をインストールしています。
  Microsoft.NETCore.Targets 2.1.0 をインストールしています。
  Microsoft.NETCore.App 2.1.0 をインストールしています。
  MSBuild ファイル /path/to/App/obj/App.csproj.nuget.g.props を生成しています。
  MSBuild ファイル /path/to/App/obj/App.csproj.nuget.g.targets を生成しています。
  /path/to/App/App.csproj の復元が 5.97 sec で完了しました。

正常に復元されました。
作成されたテンプレートの確認
$ cd App/
$ ls
App.csproj	Program.cs	obj
App.csprojの中身を確認
$ cat App.csproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>

</Project>
Program.csの中身を確認
$ cat Program.cs 
using System;

namespace App
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}
実行
$ dotnet run
Hello World!

Nugetの導入、自作ライブラリを作成

macOS での .NET Core の概要 | Microsoft Docs をなぞり、Nugetを組み込む。
Nugetはパッケージマネージャ。

dotnet new sln

$ dotnet new sln
テンプレート "Solution File" が正常に作成されました。
$ ls
App		dotnetcore.sln

dotnet new classlib -o library

$ dotnet new classlib -o library
テンプレート "Class library" が正常に作成されました。

作成後のアクションを処理しています...
'dotnet restore' を library/library.csproj で実行しています...
 /path/to/library/library.csproj のパッケージを復元しています...
  MSBuild ファイル /path/to/library/obj/library.csproj.nuget.g.props を生成しています。
  MSBuild ファイル /path/to/library/obj/library.csproj.nuget.g.targets を生成しています。
  /path/to/library/library.csproj の復元が 275.86 ms で完了しました。

正常に復元されました。
$ dotnet sln add library/library.csproj
プロジェクト `library/library.csproj` をソリューションに追加しました。

Newtonsoft.Jsonをインストール

$ dotnet add library package Newtonsoft.Json
  Writing /var/folders/jn/zrzfgbbd07s_ph4wgm70dsx40000gn/T/tmpPbxSjT.tmp
info : パッケージ 'Newtonsoft.Json' の PackageReference をプロジェクト '/path/to/library/library.csproj' に追加しています。
log  : /path/to/library/library.csproj のパッケージを復元しています...
info :   GET https://api.nuget.org/v3-flatcontainer/newtonsoft.json/index.json
info :   OK https://api.nuget.org/v3-flatcontainer/newtonsoft.json/index.json 175 ミリ秒
info : パッケージ 'Newtonsoft.Json' は、プロジェクト '/path/to/library/library.csproj' のすべての指定されたフレームワークとの互換性があります。
info : ファイル '/path/to/library/library.csproj' に追加されたパッケージ 'Newtonsoft.Json' バージョン '11.0.2' の PackageReference
$ dotnet restore
  /path/to/library/library.csproj のパッケージを復元しています...
  /path/to/library/library.csproj の復元が 231.68 ms で完了しました。
$ dotnet build
.NET Core 向け Microsoft (R) Build Engine バージョン 15.7.179.6572
Copyright (C) Microsoft Corporation.All rights reserved.

  /path/to/library/library.csproj の復元が 57.28 ms で完了しました。
  library -> /path/to/library/bin/Debug/netstandard2.0/library.dll

ビルドに成功しました。
    0 個の警告
    0 エラー

経過時間 00:00:04.29

作成したlibraryを使う

macOS での .NET Core の概要 | Microsoft Docs をなぞり、作成したLibrary.Thingを使い、実行する。

ソリューションを追加

$ dotnet sln add app/app.csproj
プロジェクト `app/app.csproj` をソリューションに追加しました。

ライブラリの依存関係を追加

$ dotnet add app/app.csproj reference library/library.csproj
参照 `..\library\library.csproj` がプロジェクトに追加されました。

実装。libraryを実際に使うコードに変更

Library.Thingを実際に使う。

$ git diff
diff --git a/path/to/App/Program.cs b/path/to/App/Program.cs
index 227ce6d..ae778b9 100644
--- a/path/to/App/Program.cs
+++ b/path/to/App/Program.cs
@@ -1,4 +1,6 @@
using System;
+using static System.Console;
+using Library;
 
 namespace App
 {
@@ -7,6 +9,7 @@ namespace App
         static void Main(string[] args)
         {
             Console.WriteLine("Hello World!");
+            WriteLine($"The answer is {new Thing().Get(19, 23)}");
         }
     }
 }

実行

$ dotnet run -p app/app.csproj
Hello World!
The answer is 42

まとめ

RestrictedPython。

RedashやPloneで使われているRestrictedPython。使う機会あったのでまとめる。

とりわけ、自前RestrictionTransformerクラスによるpolicyの設定方法は情報がネット上に皆無だったので、残しておけれればと思う次第。

...諸兄姉においては、RestrictedPythonさらにはexec、evalを使わざるおえない局面が来ないことを祈る(セキュリティ観点で)

環境

RestrictedPython

概要

Pythonソースコード文字列の実行時評価(e.g. exec、eval)する際に、評価するコードに制約(e.g. for statementの禁止)をかけるためのライブラリ。

CPython 2.7、3.4、3.5、3.6がサポートされている。PyPyをはじめとしたCPython以外のPython処理系は、サポート外。*1

注意点・観点

第一に、exec、evalは使うのは避けるのがよい。

理由としては、安全性・セキュリティの観点から、そもそもexec、evalは使うのは避けるるべきである。

避ける方法としては、VMを実装するのが一つ。
それ以外にも、ast.literal_eval使う方法や、別プロセスやコンテナの中など、限定された環境で評価を行うのがよい。

もし、言語ランタイムがサンボドックス実行の手段を提供してくれているのであれば、検討すること。

たとえば、言語ランタイムが提供するサンドボックスで知っている限りだと、Javaアプレット時代のサンドボックスや、PyPyが実験的に実装したサンドボックス*2

インストール

pip install RestrictedPython

今回は、4.0βで試した。

pip install RestrictedPython==4.0b4

from RestrictedPython import compile_restricted

source_code = """                                                               
def add(x):                                                                     
  return x + 1                                                                  
"""

context = {}
try:
    byte_code = compile_restricted(source_code, '<inline>', 'exec')
    exec(byte_code, None, context)
except SyntaxError as e:
    raise e
assert 2 == context['add'](1)

制約をかける

文・式の制約を加えたい。
RestrictedPythonではPolicyという概念があり、事前定義された組み込み関数が3つ(safe_builtins、limited_builtins、utility_builtins)を使うことで制約をかけられる。

safe_builtinsを使う

execの第二引数のdictで__buildins__にsafe_builtinsを設定する。

from RestrictedPython import compile_restricted
from RestrictedPython import safe_builtins

source_code = """                                                               
def add(x):                                                                     
  return x + 1                                                                  
"""

context = {}
try:
    byte_code = compile_restricted(source_code, '<inline>', 'exec')
    exec(byte_code, {'__builtins__': safe_builtins}, context)
except SyntaxError as e:
    raise e
assert 2 == context['add'](1)
safe_builtinsで制約がかけられているimport文を呼び出す

さて、safe_builtinsでは、import文が禁止されている。
試してみよう。

from RestrictedPython import compile_restricted
from RestrictedPython import safe_builtins

source_code = "import this"

context = {}
try:
    byte_code = compile_restricted(source_code, '<inline>', 'exec')
    exec(byte_code, {'__builtins__': safe_builtins}, context)
except SyntaxError as e:
    raise e

上記を実行した際はImportErrorが排出される。

ImportError: __import__ not found
本題。Policyに自前のRestrictingNodeTransformerを指定し制約をかける

RestrictedPythonの提供するcompile関数群(compile_restricted、compile_restricted_exec、compile_restricted_eval、compile_restricted_single)は、policyにRestrictingNodeTransformerを指定できる。

RestrictedPythonはRestrectedPytohnが提供している。親クラスは、標準モジュールastが提供するast.NodeTransformer。このクラスを継承して、自前のクラスを作ることによって制約をかけることができる。

例えば、import文を自前のOwnRestrictingNodeTransformerクラスで禁止したい場合は下記。

from RestrictedPython import compile_restricted
from RestrictedPython import RestrictingNodeTransformer

class OwnRestrictingNodeTransformer(RestrictingNodeTransformer):
    def visit_Import(self, node):
        self.error(node, 'Import statements are not allowed.')
    visit_ImportFrom = visit_Import

source_code = "import this"

try:
    byte_code = compile_restricted(
        source=source_code,
        filename='<inline>',
        mode='exec',
        policy=OwnRestrictingNodeTransformer)
    exec(byte_code)
except SyntaxError as e:
    raise e

実行すると下記となる。

SyntaxError: ('Line 1: Import statements are not allowed.',)

この要領で文、式の制約をかければいい。むろん特定のモジュールがインポートされた場合に対してだってなんだってやりたい放題。Pythonのビルドインライブラリast様様。

私感

astモジュール駆使して、制約かけるのはgoodではあるが...やはりそもそも論として、RestrictedPythonさらにはexec、evalを使わざるおえない局面が来ないことを祈る(セキュリティ観点で)

それるが、RestrictedPythonは、Zope Foundationが提供している。個人的な推測だが、Ploneで使う前提で作られ、ライブラリとして切り出されたと思われる。

Pythonを使ってるとZopeは避けられない。

*1:ソースコードぱっと見た限りはPyPyのサポートを頑張っている痕跡はある

*2:PyPy’s sandboxing features — PyPy documentation。現状使える状態なのかは不明。

macのセットアップ

連れ添った先代mac book airが不慮の事故で、使用不可となったので、新たなmac book airをセットアップ。

mac book air

- macOS Sierra 10.12.4
- MacBook Air (13-inch, Early 2015)
- 1.6 GHz Intel Core i5
- 8 GB 1600 MHz DDR3

インストールしたソフトウェア

- Chrome
- Google IME
- Slack(from App store
- XCode(from App store)
- Python 3.6.5
- g01.10.12(from go1.10.2.darwin-amd64.pkg )
- Steam

設定

ダッシュボードの不要ショートカットを全削除

IME

標準のIMEはoff。

キーボード/ショートカット

control + ↑↓←→はすべて外す。emacsとバッティングするため。

ssh key

ssh-keygenしなおした。

ターミナル

Proが好き。ちょっとフォントサイズ大きくして保存。

brew

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

OpenSSL

brew install openssl

Python3

curl -O https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz
tar zxf Python-3.6.5.tgz 
cd Python-3.6.5
vi Modules/Setup

Modules/Setup修正前

#SSL=/usr/local/ssl
#_ssl _ssl.c \
#        -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
#        -L$(SSL)/lib -lssl -lcrypto

Modules/Setup修正後

SSL=/usr/local/Cellar/openssl/1.0.2o_1
_ssl _ssl.c \
        -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
        -L$(SSL)/lib -lssl -lcrypto

./configure & make & make install

./configure --prefix=/path/to/bin/Python-3.6.5 --with-ssl
make
make install

venv & virtualenvwrapperの設定

デフォルトPython3系にしてしまう。

/path/to/bin/Python-3.6.5/bin/python3 -mvenv ~/.virtualenv/python3.6.5
source ~/.virtualenv/python3.6.5/bin/activate

.bash_profile

export WORKON_HOME=~/.virtualenv
export VENV=python3.6.5
source $WORKON_HOME/$VENV/bin/activate
source $WORKON_HOME/$VENV/bin/virtualenvwrapper.sh

GNU Emacs

emacsはひとまず、ビルドインので我慢できる...と思ってバージョン確認したらemacs22.11.1...流石に24以降使いたいから、インストール。

手抜きしてbrewで入れる。

brew install emacs --with-cocoa

.bash_profile以下を追加

export PATH=$PATH:/usr/local/Cellar/emacs/25.3/bin/
alias  emacs='emacs -nw'

その他

- ただの個人的な習慣だが、~/wok/以下に原則置く(例えばPythonは~/work/bin/Python3.6.5)。一部.dotfiesは~/以下はやむを得ない
- 話それるが、連れ添った携帯も移行しないとならない局面に

直近読んだ技術書籍

更新が滞っていたので一括で。

エキスパートPythonプログラミング改訂2版

改訂2版が出版されたので、読了。
Python3の時代になったんんだなぁ。と思う次第。
C/C++による拡張や、散らばって述べられる処理系の話は興味あるだけに楽しかった。

仕事ではじめる機械学習

基礎教養として読了。

みんなのGo言語【現場で使える実践テクニック】

Goになれるために読了。
ツール、文化を学んだ点が大きい。

プログラミング言語Go

Goの公式こなしたあとに読了。きっちりまとまっている良著。
言語の文法、基本的なライブラリを学ぶって意味だとこの書籍一冊で良さそう。

プロフェッショナルSSL/TLS

特に公開鍵ピンニングを学ぶ必要があったので、その周辺に絞って、部分的に読了。

ユビキタス時代の著作権管理技術―DRMとコンテンツ流通

DRM、コンテンツの秘匿、管理技術を学ぶ必要があったので、読了。
2006年出版と若干古い書籍では有るが、大系だって学べる良著。

画像電子学会が電子透かし関連の書籍を出版していることを知る。

ビットコインはどのようにして動いているのか?

基礎教養を得る意味で読了。

暗号技術のすべて

暗号技術に関する書籍でよいとの評判を聞
き、基礎教養を得る意味で読了。

プログラミングMICROSOFT ASP.NET MVC

dot net/dot net coreを触る機会があったので、技術習得のために。
msdn最強なのは否めない。

プログラミング MICROSOFT ASP.NET4

同上。

Learning NGUI for Unity

UnityのNGUIを学ぶ必要あったので、キャッチアップ目的で。流し読み。
なかなかNGUIに特化した情報リソースないので助かる。

NGUI for Unity

同上。

改訂3版 パーフェクトC#

C#を大系だって書籍使って学びたかったので、読了。

Learn Pixi.js

Pixi.jsチュートリアルこなし終わったので、購入した。
実際にはPixi.jsLearning Pixi を元に加筆、修正して出版されているので、
Learning Pixi以上に得れたものがあったかといえば、微妙。

Game Programming Patterns ソフトウェア開発の問題解決メニュー

かなりおすすめ。ゲームプログラミングでよく使わせるパターンがきれいにまとめられている。
実際にgameのメインループや、コマンドパターン、VM実装はかなり楽しかった。

一覧

エキスパートPythonプログラミング改訂2版

エキスパートPythonプログラミング改訂2版

仕事ではじめる機械学習

仕事ではじめる機械学習

みんなのGo言語【現場で使える実践テクニック】

みんなのGo言語【現場で使える実践テクニック】

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

プロフェッショナルSSL/TLS

プロフェッショナルSSL/TLS

ユビキタス時代の著作権管理技術―DRMとコンテンツ流通

ユビキタス時代の著作権管理技術―DRMとコンテンツ流通

暗号技術のすべて

暗号技術のすべて

プログラミングMICROSOFT ASP.NET MVC (Microsoft Press)

プログラミングMICROSOFT ASP.NET MVC (Microsoft Press)

プログラミング MICROSOFT ASP.NET4 (Microsoft Press)

プログラミング MICROSOFT ASP.NET4 (Microsoft Press)

Learning NGUI for Unity

Learning NGUI for Unity

NGUI for Unity

NGUI for Unity

改訂3版 パーフェクトC# (PERFECT SERIES 1)

改訂3版 パーフェクトC# (PERFECT SERIES 1)

Learn Pixi.js

Learn Pixi.js

Game Programming Patterns ソフトウェア開発の問題解決メニュー (impress top gear)

Game Programming Patterns ソフトウェア開発の問題解決メニュー (impress top gear)

所感

時間経った後に一括でまとめるのは、だめだ。だめな理由は、

  1. 一冊一冊に対する書評や、行ったことのまとめの質が極めて低下
  2. そもそも何冊も抜け漏れがある
  3. 以上の結果から、行動履歴残すために記事化しているという目的を持っているのだけど、満たせてない。これは書評とは言えない。

よって、

  1. 小分け、一冊一冊に注力し記事にまとめる

例えば、下記ぐらいの密度でかければ満足。
e.g. http://rokujyouhitoma.hatenablog.com/entry/20120512/1336824901


放送大学の2017下期の受講候補

下期の受付けが始まるので、受講候補を整理。

所感

さて、時間は有限(予算もまた...)なので、どれを優先しようか。いくつ選択しようか。