AWS Educateのキャリアパス、バッジ

そういえば、私は学生であり、過去には研修会社でエンジニアの技術研修に関わってたりしたので、教育には興味もってる。

ということで、AWS Educateのアカウントを作ったままにしており、放置してたので今日1日使った。

ソフトウェアエンジニアを目指している学生が読むかもしれないから、一言書いておく。
学生のうちにAWS Educateくらいは履修完了を簡単にできるくらいの知識もってるとソフトウェアエンジニアの日々を送りやすいのではないかな。

AWS Educate

aws.amazon.com


学生や、教員がクラウドを学ぶためのWebサービス
「ac.jp」ドメイン(大学・専門学校・学校法人など)のメールアドレスを持っているのであれば、登録し使える。

詳細な登録手順は下記を参考に。
新入生の皆様、Cloudを学んでみませんか? | Amazon Web Services ブログ

やったこと

やったことは2つ。

どちらも、eラーニング。

キャリアパス

12の学習コースが提供されている。

  1. クラウドコンピューティング 101
  2. アプリケーションデベロッパ
  3. クラウドサポートアソシエイト
  4. クラウドサポートエンジニア
  5. サイバーセキュリティスペシャリスト
  6. データインテグレーションスペシャリスト
  7. データサイエンティスト
  8. DevOpsエンジニア
  9. マシンラーニングスペシャリスト
  10. ソフトウェアデベロップメントエンジニア
  11. ソリューションアーキテクト
  12. Webデベロップメントエンジニア

1コース目安が40-50hとのこと。

内容は、eラーニングの類で、日本語を選択できる。文章、小テストが連続し、最後に全テストという構成。
公式のAWSドキュメントへのリンクや、YouTubeに投稿されている動画コンテンツが多く紹介されている。

私の場合は、現役のエンジニアということもあり、文章飛ばし読みし、即小テスト、全テストで1コースにおおよそ30-45minくらいかけた。

確かに、このコースを情報系ではない大学生で、かつエンジニア経験無い場合には、目安通り40h-50h学習しないと履修終えれないだろう。情報系の学部生なら10-20hで履修できると個人的には思った。

AWS Educate日本語の学習コースがリリース | Amazon Web Services ブログ

バッチ

バッチもキャリアパスのコースとほぼ同様。
現在11バッジある。

  1. Cloud Literacy (Inventor)
  2. DeepLens Badge
  3. AWS RoboMaker Badge
  4. AWS DeepRacer Badge
  5. Sumerian Badge
  6. Alexa Badge
  7. ゲームバッジ
  8. IoT バッジ
  9. スタートアップバッジ
  10. Datapalooza Badge
  11. American Heart Association: PMP Badge

キャリアパスと違ったのは、eラーニングそれ自体がFlash?のコンテンツでインタラクティブ入力が求められる。
もう一つは、日本語化されてなく英語のみ。

履修結果

1dayでキャリアパス5つ、バッジ1つを完了

f:id:rokujyouhitoma:20190810230708p:plain

キャリアパスは下記5つ完了。

  1. アプリケーションデベロッパ
  2. サイバーセキュリティスペシャリスト
  3. ソフトウェアデベロップメントエンジニア
  4. ソリューションアーキテクト
  5. Webデベロップメントエンジニア

バッジは、誤って選択したので1つ完了。

  1. Cloud Literacy (Inventor)


履修するとポートフォリオのページ(マイページ)にデジタル認証情報に記載される。

f:id:rokujyouhitoma:20190810224256p:plain

評価

AWS製品についての教材だというのはおいておいて...。

残念な点

  • 日本語化が不十分。翻訳が意味不明
  • 設問などの質が微妙。というかたまに明らかに設問と答えが間違ってる
  • 同じ問題が何回も出現する

良い点

  • ある程度知識体系がまとまってる
  • 知らないAWSのサービスを概要だけでも知ることができた

まとめ

大卒新卒の採用する側を想定すると、学生がしっかり取れるレベルだったら、少しは安心する。
が、内容は基礎の基礎で、業務の習得はもっと厳しいので、これぐらいは当たり前に習得できる状態であってほしい。という意味でも学生にはおすすめ。

最後に

飽きた、心は豊か。好きなサッカー選手は、元日本代表の秋田豊

さて「Share Profile With Recruiters」を有効化したので、リクルーターが連絡くれるのだろうか。

書籍「できる 仕事がはかどるPython自動処理 全部入り。」の執筆に携わりました

株式会社インプレス出版の「できる 仕事がはかどるPython自動処理 全部入り。」の執筆に携わりました。

共著となります。

概要

単行版/電子版(Kindle)での出版です。

想定読者

想定する対象読者は、Pythonの入門書を読み終えた方=非エンジニアを想定しています。

この書籍で少しでも読者のみなさんが仕事、業務を自動化し、本来の注力すべきことに向かえることを願っています。

目次

  • Chapter 1 Pythonのプログラムを利用する前に
  • Chapter 2 コマンドラインインターフェース
  • Chapter 3 サードパーティライブラリのインストール
  • Chapter 4 Pythonのおさらい
  • Chapter 5 ファイルの操作と圧縮・展開
  • Chapter 6 画像の加工
  • Chapter 7 CSVファイルの処理
  • Chapter 8 テキストデータの処理
  • Chapter 9 Microsoft Excelとの連携
  • Chapter 10 Webスクレイピング
  • Chapter 11 Web API

携わる経緯

携わる経緯としては、友人である森本哲也( id:t2y )さんに執筆の協力を求められたためです。

謝辞

執筆のラストスパートにおいては、仕事を優先したので、共著者の森本さん、岡田さん、中野さん、そしてレビュワーの皆さん( takanoryと愉快な仲間たちをはじめとした方々 )、出版社の柳沼さん、家族には多大なご迷惑をおかけしたことを、この場をもってお詫びします。

もちろん感謝をしております。

最後に

反省

最後に、告白です。実は共著者には名を連ねてるものの負い目があります。
というのは、もともと個人としては1/4(25%)を書くのを目標としてたのですが、10%書けたかどうかです。

この点は、反省です。

嬉しかったこと

f:id:rokujyouhitoma:20190616161008p:plain

関わった書籍3冊目にして、Amazonでのカテゴリーランキングで1位を取れたことは嬉しい出来事でした。

個人的な想い

書籍の趣旨とは、ずれるかもしれませんが、読者の方がこの書籍を読むことによって、プログラミングやPython言語に興味を持っていただければ幸いです。

並列プログラミング、並列処理の基礎知識を動画でちょっと学ぶ

知人とスパコンの話をしていて、そういえば、並列プログラミング・並列処理の基礎知識足りてないなと思ってググってたらよい資料に遭遇した。

東京大学情報基盤センタースーパーコンピューティング部門 講習会教育教材

講習会教育教材| 東京大学情報基盤センター スーパーコンピューティング部門

東京大学情報基盤センタースーパーコンピューティング部門?が動画の教育教材を配信している。

公開されている動画の教育教材一覧

感想

1つ目の教育教材をみた感想。
並列処理解説Ⅰ 並列プログラミングの基礎 | 東京大学情報基盤センター スーパーコンピューティング部門

  • 並列プログラミングの用語、概念が整理されている
    • 逐次実行、実行時間、並列化
    • 並列計算機の分類(SISD、SIMD、MISD、MIMD)
    • 並列計算機のメモリ型による分類(共有メモリ型、分散メモリ型)、SMP、メッセージパッシング、MPI
    • 並列プログラミングのモデル(SPMD、Master / Workerの仕組み)
    • 並列プログラミングの種類(マルチプロセス、マルチスレッド)、MPI、OpenMP、HPF、Pthread(POSIXスレッド)、Javaの言語仕様としてスレッドを規定している話
    • 並列処理の実行形態(データ並列=SIMDと概念は一緒、タスク並列)
  • 平易な解説でわかりやすい
  • 動画なので図もありわかりやすい

総じておすすめ。

東京大学情報基盤センタースーパーコンピューティング部門 講習会開催予定

下記見てたら、大学生だと参加資格あるようなので、参加検討して、講義受けるのはありかもしれない。

講習会 | 東京大学情報基盤センター スーパーコンピューティング部門
講習会開催予定 | 東京大学情報基盤センター スーパーコンピューティング部門

...のだけど、スーパーコンピュータを使う予定はないから、受ける意味がなかった。
スーパーコンピュータを使う機会があったら、思い出す。

その他

そのほかに見ていた資料。

放送大学と調べ物と私

pyspa Advent Calendar 2018 9日目を担当する池です。放送大学の選科履修生、科目履修生で2015年から学生になってもうすぐ4年経ちます。

なぜ「放送大学と調べ物と私」を書こうと思ったのか

2015年の上期から放送大学を活用しており、4期通ってみて知見が溜まってきたので知見を公開しようと思ったから。
小難しい話は後半に書いており、前半はCons/Pros(メリット/デメリット)を書いてる。

放送大学のPros/Cons(メリット/デメリット)

体感したPros/Consをざっと洗い出してみた。

Pros・メリット

- 基礎教養を体系だって、比較的安価に学ぶことができる
- 放送大学附属図書館のデータベースが利用可能になる
- 身分は学生。学生証、ac.jpメアドが貰える
- 各種学割が受けられる
- 学習センターが使える

Cons・デメリット

- 多少なりとも金銭的なコストはかかる
- 単位取ろうと思ったら、当然時間使う(そりゃそうだ)
- オンラインのみでは完結しない
- 例えば、単位認定取得試験は、実施日程・会場が決まっており、試験を受けに行く必要がある

放送大学とは

放送大学とはなんであるか?誰が設置したのか。どうしても気になってしまうので調べた。

放送大学は、放送大学学園法に基づき設置された学校法人放送大学学園が運営する大学。*1
設置の趣旨としては、大学教育を広く国民にもたらすために設置された。

国立大学なのかな?と当初私も思ったわけだが、放送大学学園法の第三条で定義されている通り私立大学。*2*3*4

教養学部と大学院が設置されており、学位としては、学士(教養)、修士(学術)、博士(学術)が授与される。

以降は、教養学部生に関して。

教養学部生の区分としては、全科履修生、選科履修生、科目履修生、集中科目履修生がある。*5

全科履修生は、卒業を目指す学生であり、最大10年在籍可能です。卒業には4年以上各コースに在籍し、124単位の取得が必要になる。
選科履修生は、一年在籍可能な学生です。科目は自由に選択できる。
科目履修生は、半年在籍可能な学生です。科目は自由に選択できる。
集中科目履修生は、夏季に集中し3ヶ月司書教諭資格取得・看護師資格取得に資する科目を履修する学生を対象にしている。

放送大学と私

放送大学生になった背景と今

いまから5年ほど前に、前々職の社員総会があり、その帰りがけに先輩3人とランチを食べに行った。

その三人は1、2歳差と、年代もほとんど一緒で、更に出身大学・学部が一緒なので、大学の話になった。
その際に、偶然にも2名が放送大学修士課程に在籍しているというので、放送大学の話題になった。

どうやら、話を聞いていると、好きな講座だけ取ることができ知的好奇心は満たされるし、ソフトウェアの学割が効くという話だったと記憶している。

そのころ大学・大学院の教育を受けたいと思っていた私は、産業技術大学院や東工大の社会人が多そうな専門性が高いコース調べていた。
放送大学は、当時テレビ放送とインターネット配信、一部面接事業での講義を受けられた。

幅広い教養を学ぶにはうってつけだと考え、まずは半年間在籍できる科目履修生として履修を開始した。
科目履修生として4上下期(2年)なり、その後は、一年間在籍できる選科履修生として履修を続けている。

履修してきた/している授業

履修してる授業は、多岐にわたる。

履修した講義を列挙すると、下記。

- 身近な統計(’18)
- エネルギーと社会(’15)
- 情報ネットワーク(’18)
- データベース(’17)
- コンピュータの動作と管理(’17)
- 情報のセキュリティと倫理(’14)
- 入門線型代数(’14)
- 初歩からの数学(’12)
- 情報学へのとびら(’16)
- 感性工学入門(’16)
- Javaプログラミングの基礎(’16)
- Webのしくみと応用(’15)
- データ構造とプログラミング(’13)
- 自然言語処理(’15)

単位は落としたのもあるが、大部分は取れている。

目的別には、

  • 京大黒橋教授が自然言語処理の講義を開講しており、当時NLPに今日持っていたので
  • 以前ゲーム開発で必要になった教養として、線形数学や数学
  • プログラマーで、CSの講義を受けてない負い目あるので、基礎として。ただ、流石に現職のプログラマーなので、たいていは授業みてなく、教科書を読んでおけば単位取得試験受けるだけで単位は取れた

特に良かった授業

黒橋講師(京大教授・放送大学講師)の自然言語処理(’15)は、NLPに興味持っていたタイミングで受講したが大変よかった。
教科書の質も高く。大満足。*6

また、黒須講師(放送大学名誉教授)の感性工学入門(’16)もまた大変よい講義だった。
黒須講師と外部の方々との対談は聞く価値があり、そして、感性に関してフォーラムで他学生と議論を行うのは大変ためになった。
(オンラインのフォーラムではなく、直接対面でゼミ形式で論じることができればよりよいのだが、放送大学の特性上難しいだろう...今後に期待)

コスト面

放送授業は2単位11000円のコストが掛かるわけだけど、費用対効果高い。

今後の課題

一番の敵は、仕事などを優先して、学習時間を確保できていないこと。あとは、仕事優先して、単位取得試験を受けに行けていない場合。これは課題である。

継続の意思

今後も継続して放送大学の学生を続けていくか?
現在のところは、お金が尽きたり、放送大学の制度が変わらない限り、放送大学の学生を続けていく考え。

調べ物と私

人生様々なことを調べる機会はある。時事や企業、人物などなど。

新聞のデータベースがほしいと思うこともあるし、論文をちょっとみてみたいと思うこともある。
古事記などの古典を全文検索したい場合だってある。

本買うまでではないが、書籍をちょっと見たい場合だってある。

放送大学と調べ物

さて、放送大学を活用した調べ物。
実際の図書館も千葉の本部にはあるが、オンラインで使える放送大学図書館がある。

このオンラインの図書館をデータベースとして使うと、結構調べ物ができたりする。

放送大学図書館

オンラインで使える放送大学図書館。
調べ物をするには、まさにうってつけ。ビバ学生。

この記事を書いている現在は以下のサービスが利用可能。*7

  • 放送大学ディスカバリーサービス(EBSCO社が提供する統合データベース)
  • 放送大学電子資料タイトル検索(放送大学で見られる電子ジャーナル・電子ブックを検索)
  • ScienceDirect(エルゼビアサイエンス社が提供する電子ジャーナル・電子ブック)
  • SpringerLink(シュプリンガーグループが提供する電子ジャーナル・電子ブック)
  • Cambridge Journals Online(ケンブリッジ大学出版局が提供する電子ジャーナル)
  • IEEEIEEE Computer Societyが発行する電子ジャーナル)
  • JSTOR(JSTORが提供する電子ジャーナル)
  • IOP (英国物理学会が提供する電子ジャーナル)
  • NII-REO(NII 電子ジャーナルリポジトリ)
  • 1999年以前のSpringer電子ジャーナルアーカイブ (NII-REO)
  • 1999年以前のSpringer Lecture notes in computer science (NII-REO)
  • 1996年から2003年までOxford University Pressの電子ジャーナルの一部タイトル(NII-REO)
  • CiNii Articles(国立情報学研究所(NII)が提供する国内の学術雑誌論文記事検索・全文提供サービス)
  • Maruzen eBook Library(丸善㈱が提供する日本で出版された学術電子ブック・電子ジャーナル)
  • EBSCO eBOOKs(NetLibrary)(EBSCO社が提供する電子ブック)
  • JapanKnowledge(約30種類の辞書・辞典を集積したデータベース)
  • 聞蔵IIビジュアル(朝日新聞記事データベース)
  • 日本古典文学大系本文データベース(国文学研究資料館
  • OPAC放送大学附属図書館蔵書検索)(※外部リンクから電子ブック等全文を読む場合はこちらから)

希望・要望

もっともっと使えるジャーナルやデータベース、サービスが増えるといいなぁ。
例えば、下記が読める・連携されると嬉しい。

放送大学学長。お願いします。

まとめ

書きなぐって、整理されてなく申し訳ないけど、最後に伝えたいことを。

- 放送大学いいよ
- 放送大学めっちゃいいよ
- 放送大学おすすめだよ

PySpaアドベントカレンダー

さて、明日はのアドベントカレンダーは頭脳明晰で生物として死んでもbotとして生きながらえると思われるしうまちです。

pyspa Advent Calendar 2018 - Adventar

*1:e-Gov法令検索e-Gov法令検索

*2:https://www.ouj.ac.jp/hp/toiawase/other/02.html

*3:第二章 放送大学学園 (目的) 第三条 放送大学学園は、大学を設置し、当該大学において、放送による授業を行うとともに、全国各地の学習者の身近な場所において面接による授業等を行うことを目的とする学校法人(私立学校法(昭和二十四年法律第二百七十号)第三条に規定する学校法人をいう。)とする。

*4:設立当初は国立大学の扱いでした。現在は法改正を経て私立大学となっています。

*5:学生の種類 | 放送大学 - テレビ・ラジオで学ぶ通信制大学

*6:放送大学 自然言語処理('15) - rokujyouhitoma's blog

*7:放送大学附属図書館

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

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

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。現状使える状態なのかは不明。