OmniAICreator/Qiita-1.07M huggingface dataset:
CloudFormationの実験をラクにするMyスクリプト

AWS CloudFormationの挙動確認をするために、自分のアカウントで実験して見ることってないですか？ 私は週に3回くらいあります。

CloudFormationのデプロイを簡単にするMyスクリプトを作成してみました。

# CloudFomationのデプロイを簡単にするスクリプト

こんな感じでデプロイできる、AWS CLIのラッパースクリプトです。
`cfn update hirogaVpc ./vpc.yaml ./vpc.json`


`aws cloudformation ...`と都度打たなくて済みます。また、指定するオプションは決まっているので都度打たないでいいようにしました。

以下がスクリプト本体です。

```cfn.sh

cmd=$1
stack_name=$2

if [ -z $cmd ]; then
    echo "Error: Command is required"
    exit -1
elif [ $cmd = "create" -o $cmd = "update" ]; then
    case $3 in
        "") echo "Error: Please give a template file path!"; exit 0;;
        /*) absolute=$3 ;;
        *) absolute=$PWD/$3 ;;
        # S3にはこれから対応する、かも
    esac
    case $4 in
        /*) absolutejson=$4 ;;
        *) absolutejson=$PWD/$4 ;;
    esac
fi
if [ $cmd = "create" ]; then
    aws cloudformation create-stack --stack-name $stack_name --template-body file://$absolute --capabilities CAPABILITY_IAM --cli-input-json file://$absolutejson
elif [ $cmd = "update" ]; then
    aws cloudformation update-stack --stack-name $stack_name --template-body file://$absolute --capabilities CAPABILITY_IAM  --cli-input-json file://$absolutejson
elif [ $cmd = "delete" ]; then
    aws cloudformation delete-stack --stack-name $stack_name
elif [ $cmd = "status" ]; then
    aws cloudformation describe-stacks --stack-name $stack_name | jq .Stacks[] | jq '.StackId, .StackStatus'
fi
```

改善点もいくつかあって、
* create/updateを別にしているのがダサい。 `aws cloudformation deploy`のように、スタックがあるかどうかに関わらずデプロイできるようにしたい。
* "直前に実行したデプロイ" のステータスが一発でわかるようにしたい（デプロイコマンドの結果を自動的に環境変数に代入する）
* stack-nameとtemplate-urlはjsonの中にまとめてしまっていい気がする。

という感じです。いずれバージョン２を出しますのでお楽しみに！

# お約束
こういう自炊スクリプト書くの好き！どんどんラクしたい！という方、justInCaseではSREメンバーを募集中です！ぜひ一緒にお仕事させてください！
[保険APIで保険フィンテック先駆けを作るサーバーサイドエンジニア！](https://www.wantedly.com/projects/251106)

# 余談
※本当はStepFunctionsでRDS→Dynamoにデータ連携した話を書きたかったんですが、そもそもRDSを立てるVPCがCFnで定義されていない→VPCをCFnに立てるトライ＆エラーが面倒→じゃあそれをラクにするスクリプトを作ろう、という流れでこの記事を書きました。
org.junit.jupiter.api パッケージが見つかりません。

Eclipseで、コード実行時に、以下のえらーが出る。

```
org.junit.jupiter.api パッケージが見つかりません。
```

※jupiter は JUnit5 のモジュール。

# 解決策

1. プロジェクト右クリック→プロパティ
2. Java のビルド・パス→順序およびエクスポート
3. JUnit5 にチェック→適用して閉じる
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/227525/74414731-1280-15c1-5097-53f06a599087.jpeg)
Rails5でJqueryを利用しようとして少しハマった件（Uncaught ReferenceError: $ is not defined）[Rails]

# **はじめに**
Rails5では、`jQuery`に関するgemは`rails new`コマンドで標準でインストールされなくなりました。そこで`jQuery`をプロジェクト内で利用できるようにするにあたって、少しハマってしまいました。そこで、今回は、その解決方法をここで共有しておきたいと思います。

## **gemの導入**
`rails new`コマンドでアプリケーションフォルダを作成した後に、下記記述を`Gemfile`に追記して、`bundle install`を行います。

```Gemfile
# jQuery
gem 'jquery-rails'
```

## **application.jsファイルに追記**
次に、jqueryのコードを各ファイルが認識できるように、下記の2行を`application.js`に記述します。

```application.js
//= require jquery
//= require jquery_ujs
```

# **Rails関連記事**
[正規表現まとめ（基礎）[Ruby編]](https://qiita.com/takuyanin/items/2918ffb3151dcfa88565)
[配列で利用できる主なメソッドをまとめてみた[Ruby編]](https://qiita.com/takuyanin/items/3ca4cd7067b7b9e7e9b6)
[Mysql2::Error: Duplicate entry for key.. エラーを撃退した話(validationの設定)](https://qiita.com/takuyanin/items/b28d5111447d4dedc39d)

# **おわりに**
フレームワークのバージョンアップによって、標準でインストールされるライブラリも変更しますよね。
yarnやWebPackの導入が進んでいることもあり、今後は`jquery-rails`などのjQuery/JavaScriptライブラリ導入用のgemはだんだん使われなくなっていくことが予想されます。
ですので、今のうちになるべく`yarn`でJavaScriptライブラリを管理するのがよいでしょう。

少しでも役にたったよー、て方は「いいね」お願いします(^^)
uGUIのToggleのOnValueChangedイベントに列挙型引数を与える

こんにちは、タケシです。

今日バイトの仕事やってるとき、``UnityEvent``デフォルトでは列挙型引数を与えることができないのを気づいて、しかし、どうしてもインスペクターで選択したいと思って、ネットで調べてみたので、メモする。

## uGUIのボタンのOnClickイベントに列挙型引数を与える
最初は”unity button onclick enum”で検索したら[こちらの記事](http://hoppoco.blogspot.com/2017/01/unitybuttononclick.html)が出てきた。

記事の内容に従ってやってみると
![スクリーンショット 2018-12-05 午前2.46.18.png](https://qiita-image-store.s3.amazonaws.com/0/259886/5352ef70-40a2-5d74-3173-69496394fb1d.png)
すごいなぁ本当に列挙を選択できるようになってる。


### ToggleのOnValueChangedイベントに応用してみた　 
![スクリーンショット 2018-12-05 午前2.42.49.png](https://qiita-image-store.s3.amazonaws.com/0/259886/bbb5a15b-5831-603f-dbd3-c2232861283b.png)
えっうそ？約束と違うじゃね？なんでうまくいかないんだろう、どこが違うんだろうか、と思って検索してみた。どうやら両者の差は引数の数だけで、``OnClick``は``UnityEvent``で、``OnValueChanged``は``UnityEvent<T0>``を継承した``ToggleEvent``。ではなぜボタンだけうまくいくんだろうか。先の記事のどころからもらった``UnityEventDrawer.cs``をちらっと読んでみて、半分以上はわからないが、これだけいじって
みるとできました。

```cs:UnityEventDrawer.cs

...

[CustomPropertyDrawer(typeof(UnityEvent), true)]
[CustomPropertyDrawer(typeof(UnityEvent<bool>), true)] //　この行を追加
public class UnityEventDrawer : PropertyDrawer
{
    private Dictionary<string, State> m_States = new Dictionary<string, State>();
    ...
}
```
![スクリーンショット 2018-12-05 午前3.11.05.png](https://qiita-image-store.s3.amazonaws.com/0/259886/5f7f9950-cab3-1ac5-e4fd-97bfbde439fe.png)
ちゃんと選択できるようになった、めでたしめでたし。

ジェネリック記法で書きたいんですが、調べてみてもうまくかけないので、とりあえず今度の目的は達成したから、次の課題にすることにした。


####2020/10/17追記
`Unity2020.1.7f1`では`UnityEventBase.MethodInfo`のシグネチャーが変わったため、スクリプトがバグってる。対策法調査中・・・
Unity開発するにあたって知っておきたいコンパイラのすゝめ(Part0.7～JITとAOT概要編～)

#最初に

この記事はUnityで使用されているコンパイラについてまとめた記事のうちの、土台部分である**JIT**と**AOT**について簡単にまとめた記事です。そのため、Part1ではなく、とっかかりという意味で0.7と記載させて頂きました。

- [Part0.5〜.NET Frameworkの概要編〜](https://qiita.com/4_mio_11/items/89fd91ef8ede02bfdd46)
- [Part1～Mono編～](https://qiita.com/4_mio_11/items/716d28add984405a80cc)
- [Part2～IL2CPP編～](https://qiita.com/4_mio_11/items/d5d7b4e879a8341595cd)
- [Part3～Burst編～](https://qiita.com/4_mio_11/items/cda0c8aa4c77a7748418)

## JITって何？

前回.NET Frameworkの概要を解説した際に、VES(仮想実行環境)でマシン語をJITで実行すると書きました。

JITとは**Just-In-Time**の略称で、「実行時コンパイラ」とも呼ばれています。ニュアンスとしては「ちょうどよい時に」となります。

このJITコンパイル方式では、コードの中で実際に実行されるILコード部分が都度都度マシン語に翻訳され、メモリの実行領域にvtableとネイティブコードが生成され、実行されます。逆にいえば、初期状態のメモリの実行領域には、フレームワーク側のコードだけしか読み込まれていません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/36899/fb37754f-160f-39e4-20b9-81c6218b5412.png)

クラスA初回読み込み時にクラスAに関するvtable(①)を作成します。次にHogeが初めて呼ばれた場合はHogeのネイティブコード化(②)を行い、クラスAのvtableにHogeのネイティブコードを指すメモリアドレスを格納します。こうして、2回目以降は直接Hogeのネイティブコードを呼び出すため、初回以降は高速に実行が可能です。

このJITコンパイルによって、プラットフォームに依存しないILコードのまま.NET製のプログラムやライブラリ等を配布することが可能です。

## AOTって何？

AOTコンパイラとは**Ahead-Of-Time**の略称で、「事前コンパイラ」とも呼ばれています。Jソースコードから中間コードを生成した後にネイティブの機械語も一緒に生成します。
 
C/C++ではAOTが主流で、これらの言語でコンパイラと言った時はAOTコンパイラのことを指すことが多いです。

## JITとAOTのメリットデメリット

- JITコンパイラが部分的な最適化だけを行うのに対し、AOTコンパイラは生成されたネイティブコードをプロセッサに合わせて全体の最適化が可能なので、異なるプロセッサごとに複数のコードを作成する必要がありません。そのためパフォーマンス面では基本的にAOTコンパイラが勝ります。ただしJITならば実際にそのコードを実行しているPCのCPUやメモリの情報を知ることができるので、それに応じたコードを生成したり最適化することができルため、AOTよりも優れたコードを生成できる可能性があります。

- JITコンパイルの場合は最適化を行わないため非常に多くのメモリを消費します。できるだけアプリ自体のサイズを小さくしたいようなスマホ向けのアプリにはAOTコンパイルが相性が良いでしょう。

- JITの性質上、ILをネイティブコード化する初回のタイミングで遅くなります(C#であればJITの中でも高速な部類です)。

- ただ前述した通り、JITコンパイラではILコードをネイティブコードに翻訳しているので、プラットフォームに依存せず配布することが可能です。

- JITの方がリフレクションなどの動的な処理を容易に扱いやすいです。ただしリフレクション自体実行速度が落ちがちなので基本的には避けますが…。

- さらに、JITはセキュリティが担保しやすいため、ストア審査が通りやすいです。

# 最後に

JITとAOTの基礎的な概念は理解できていてもメリット・デメリットまでは確認していなかったため、今回調べてみたことで良い勉強になりました。


 
# 参考
- [意外と知らないJITコンパイラとAOTコンパイラの違い](https://furien.jp/columns/338/)
- [実行時コンパイラ](https://ja.wikipedia.org/wiki/%E5%AE%9F%E8%A1%8C%E6%99%82%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9)
- [事前コンパイラ](https://ja.wikipedia.org/wiki/%E4%BA%8B%E5%89%8D%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9)
- [JITコンパイル](https://ufcpp.net/study/csharp/framework/fwjitcompilation/)
Next.jsのエラーハンドリング

Next.jsを実践投入するには、エラーハンドリングまわりも考えないといけません。関心事は、サイト独自のエラーページデザインであったり、Sentryなどでのエラー通知だと思います。
まずはNext.jsが用意しているエラーページを見ていきましょう。

本記事は公式ドキュメントのエラーハンドリングの項目を一部翻訳しています。
https://github.com/zeit/next.js#custom-error-handling

# エラーハンドリングのカスタマイズ
Next.jsではデフォルトのエラーハンドリングページが用意されています。ステータスコードが404もしくは500のエラーをキャッチし、クライアントとサーバーサイドの両方でハンドリングされます。
もしデフォルトのエラーコンポーネントをオーバーライドしたいのなら、`_error.js`というファイルをpagesフォルダーの中に定義しましょう:

```react:pages/_error.js
import React from 'react'

export default class Error extends React.Component {
  static getInitialProps({ res, err }) {
    const statusCode = res ? res.statusCode : err ? err.statusCode : null;
    return { statusCode }
  }

  render() {
    return (
      <p>
        {`${this.props.statusCode}エラーが起こりました。`}
      </p>
    )
  }
}
```

エラーハンドリングは、独自の`_error`コンポーネントをインポートして行います。

```react:pages/index.js
import React from 'react'
import Error from './_error'
import fetch from 'isomorphic-unfetch'

export default class Page extends React.Component {
  static async getInitialProps() {
    const res = await fetch('https://api.github.com/repos/zeit/next.js')
    const statusCode = res.statusCode > 200 ? res.statusCode : false
    const json = await res.json()

    return { statusCode, stars: json.stargazers_count }
  }

  render() {
    if (this.props.statusCode) {
      return <Error statusCode={this.props.statusCode} />
    }

    return (
      <div>
        Next stars: {this.props.stars}
      </div>
    )
  }
}
```

ここで少し注意したいのは、`_error.js`の`getInitialProps()`はサーバから直接レンダリングされた場合のみ機能します。例えば存在しないページ[http://localhost:3000/hogefuga](http://localhost:3000/hogefuga)にアクセスしたときは`getInitialProps()`を通過し、statusCodeを取得して404ページがレンダリングされます。逆に、`pages/index.js`の例のように、ページの処理途中にエラーが起こった場合は`_error.js`は普通のReactコンポーネントと同じ扱いで呼び出されるため、`getInitialProps()`は実行されません。

また、Next.jsが用意するエラーページを再利用したい場合は`'./_error'`ではなく`'next/error'`から同様にインポートしましょう。

# Sentryの導入
[前日の_app.jsについての記事](https://qiita.com/tetsutaroendo/items/c7171286137d963cdecf#_appjs)でも触れましたが、`<App>`コンポーネントは全てのページにおいて、初期化時に利用されます。
ですので、このコンポーネントのライフサイクル`componentDidCatch`でエラーハンドリングを行えば、全エラーの捕捉が可能です。

[公式の例](https://github.com/zeit/next.js/blob/canary/examples/with-sentry/pages/_app.js)より

```react:pages/_app.js
import App from 'next/app'
import * as Sentry from '@sentry/browser'

const SENTRY_PUBLIC_DSN = ''

export default class MyApp extends App {
  constructor (...args) {
    super(...args)
    Sentry.init({dsn: SENTRY_PUBLIC_DSN})
  }

  componentDidCatch (error, errorInfo) {
    Sentry.configureScope(scope => {
      Object.keys(errorInfo).forEach(key => {
        scope.setExtra(key, errorInfo[key])
      })
    })
    Sentry.captureException(error)

    // This is needed to render errors correctly in development / production
    super.componentDidCatch(error, errorInfo)
  }
}
```

しかし、上記例の場合だと実はサーバーサイドのエラーもクライアントと同じように拾ってしまいます。`'@sentry/browser'`はサーバーサイドでも一応動くようです。
一旦入れる場合にはよいかもしれませんが、サーバーとクライアントを区別してエラーハンドリングを行う方法を、まさにIssueで議論が行われています。注視していきたいです。
[Improve with-sentry example #5727](https://github.com/zeit/next.js/pull/5727)
Essential Phone(PH-1)のroot化とroot環境のでアップデートする方法メモ

# 前提
- adbコマンドが使用できるPC
- 万が一データが消えてもめげない覚悟(バックアップ)

# root取得
## 用意するもの
- Magisk Manager: [ここ](https://forum.xda-developers.com/apps/magisk/official-magisk-v7-universal-systemless-t3473445)からダウンロードする。

- bootイメージ: [Essential公式](https://www.essential.com/developer/current-builds)の__Current Builds>Download(Fastboot)__からファクトリーイメージをダウンロード(~~面倒くさかったら[\[GUIDE\] Rooting your Essential PH\-1 \| Essential Phone](https://forum.xda-developers.com/essential-phone/how-to/guide-rooting-essential-ph-1-magisk-t3701976)のNOTES>2のstock boot imageのリンクからbootイメージだけダウンロード。~~)

## root取得
1. Magisk Managerのアプリから__インストール>Bootイメージのパッチ__でpatched_boot.imgを作る。たぶんDownloadフォルダにある。
2. `adb reboot bootloader`でbootloaderに入る。
3. `fastboot flash boot <パッチ済みのbootイメージ>`でpatch済みのbootイメージをboot領域に焼く。
4. `fastboot reboot`で再起動。
5. Magisk Managerを起動してroot権限があることを確認する。

# root取得後のアプデ
## 用意するもの
- ~~現バージョンのbootイメージ~~
- Magisk Managerで__パッチ済み__のアプデ後のバージョンのbootイメージ(patched_boot.img)
- Essential公式の[Developer Overview](https://www.essential.com/developer/current-builds)からOTAファイルをダウンロード(PH1-OTA-***********.zip)

##アップデート方法
1. ~~`adb reboot bootloader`~~
2. ~~`fastboot flash boot <現バージョンのbootイメージ>`~~
3. ~~音量キー操作で__recovery mode__を選択し~~`adb reboot recovery`で、リカバリーに入る。
4. ドロイド君が倒れてる画面になったら、電源ボタンを押したままボリュームアップボタンを押すとリカバリーメニューがでる。
5. __Apply update from ADB__を選択。
6. `adb sideload <OTAファイル.zip>`でアップロードを適用する。
7. sideloadが終わったら、音量ボタン操作で__reboot to bootloader__を選択する。
8. `fastboot flash boot <パッチ済みのbootイメージ>`
9. `fastboot reboot`
10. Magisk Managerを起動してroot権限があることを確認する。


# 18/12/6追記
~~カメラのシャッター音のファイルを消したところ純正のカメラアプリが起動しなくなった。何をしても正常に動作しなくなったため初期化した。何か対処法をご存知の方は教えてくださると助かります。~~
コメントにてXperd様から教えていただきました。そもそもファイルを消すのではなくMagiskのモジュール"Disable screenshot and camera sounds"でシャッター音を無効化すると良いです。ありがとうございました。(19/5/16追記)
polyfill.io が便利すぎた

# 2019-03-28 追記
[@babel/polyfill](https://babeljs.io/docs/en/babel-polyfill) を import しとくだけでいいんじゃないかというマイブームが来ています。

IE で [Array.prototype.flatMap()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap) は使えた。詳しくは知らない。

# TL;DR

index.html に下の 1 行を追加しただけ[^1] で各種ブラウザ対応終わった。

```html
+  <script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script>
```

# IE 対応

社内で真面目に IE 対応する雰囲気が出てきてしまってどうしようかと思ってたところ [noteをNuxt.jsで再構築した話](https://speakerdeck.com/fukuiretu/notewonuxt-dot-jsdezai-gou-zhu-sitahua?slide=89) を思い出したので、とりあえず [polyfill.io](https://polyfill.io/) 入れてみようかってことで入れてみた。

> Polyfill.io reads the User-Agent header of each request and returns polyfills that are suitable for the requesting browser.
> （Polyfill.ioは、各リクエストの User-Agent ヘッダーを読み取り、要求元のブラウザに適した polyfills を返します。）

**便利すぎかよ。**

[こういうこと](https://speakerdeck.com/fukuiretu/notewonuxt-dot-jsdezai-gou-zhu-sitahua?slide=92)ね。すごい。

src の後ろで `?features=` に続けてポリフィルしたい機能を指定することができるので、ソースコードの中で使ってる機能に限定してポリフィルすることもできる。こうすることで余計に大きなファイルはロードしなくて済むのでファイルサイズの最適化ができそう。
だけど、そんなの [features](https://polyfill.io/v2/docs/features/) の中から選んでちまちま指定するの嫌だったし、どこまでポリフィルしてるかを気にせずにコードを書いていきたかったし、polyfill.js は CDN (Fastly) から配信されるのでどうせ速いしパフォーマンスは誤差やろ（計測しろや）と思ったので、今回はグループエイリアス `es6` とだけ書いて祈ることにした（便利） 

IE 対応、javascript に関してはもうこれに任せて安心して寝たい気持ちがある。

もしかしたらポフィリル自体が低品質だったせいで結局うまく動作しないってことがあるかも知れないけど、今回は対応コスト超〜低めでやれたんで、あとは何か起きたときの自分のカバー力に託したいと思います。それでは、おやすみなさい。

[^1]: うちは React 製 SPA なので
コンパイルターゲットとしてのWebAssembly

# WebAssemblyをターゲットにコンパイルする

WebAssemblyはブラウザの上で動作可能なバイナリフォーマットです。ネイティブコードと同様、大半の場合はコンパイラを使って作成します。

コンパイラを動かすアーキテクチャとは異なるCPUアーキテクチャ向けにバイナリを出力することがあります。これをクロスコンパイルと呼びます。クロスコンパイルの例の1つがiOS向けの開発です。コンパイラの動くMacBook ProのCPUアーキテクチャと、iPhoneのCPUアーキテクチャは異なります。それでもコンパイルを行うと、iPhone向けのバイナリファイルが出力されます。

クロスコンパイルをして得られるバイナリが動作するCPUアーキテクチャのことを、ターゲットアーキテクチャ、または略してターゲットと呼びます。[先ほどのiOSアプリの例だと、ターゲットアーキテクチャはARM64、もしくはARM64e](https://qiita.com/takkyun/items/814aa45beee422a5f0c6)となります。

WebAssemblyの開発も、iOSアプリと同様です。つまりソースコードを、WebAssemblyをターゲットとしてクロスコンパイルします。

# wasm32とwasm64

使えるメモリのサイズ上限に応じて、WebAssemblyには2種類のアーキテクチャがあります。

|アーキテクチャ|上限メモリサイズ|メモリのインデックスサイズ|
|-----------|--------------|-----|
|wasm32|4GiB|32bit|
|wasm64|1680万TiB|64bit|

WebAssemblyでは、メモリを巨大なバイトの配列として扱います。特定の領域に値をメモリサイズの上限は、メモリにアクセスす

2018年末現在でwasm64に対応したコンパイラはありません。そのため、wasm32をターゲットとしてクロスコンパイルすることになります。

# wasm32の特徴

wasm32の特徴は次の通りです。

* 1バイトは8ビット
* メモリのアクセスはバイト単位。アラインしてなくてもいい
* 32bitと64bitの符号付整数型が使える
* IEEE 754-2008の32ビット/64ビット浮動小数点
* バイトオーダはリトルエンディアン
* 32ビットのインデックスによるメモリアクセス
* 8ビット/16ビット/32ビットアクセスは、ロックフリーのアトミックな演算が可能
MPE最終版仕様について


https://adventar.org/calendars/3353 の5日目エントリーです。

## MPEとは

本章で扱うMPEとは、MIDI Polyphonic Expressionのことであり、MMA (MIDI Manufacturers Association) が承認したMIDI仕様の拡張のひとつです。MPEは、既存のMIDIメッセージ機構を利用しつつ、本来ノートごとに設定できないピッチベンド、チャンネル・プレッシャー（CAf）、CC74（一般的にはカットオフ）の値をノートごとに設定できるようにするためのものです。

MPEを実現する具体的な方法をひとことで説明すると、「MPEモードで動作している音源では、MPEゾーンに割り当てられたチャンネルがひとつひとつのノートとノート別の表現を処理する」ということになります。MIDI音源には16チャンネルあることが想定されているので、同時に15音まで発音することが可能ということになります。

1音色のために最大16チャンネルを使用する、というのは、贅沢なチャンネルの使い方であり、標準MIDIメッセージだけで再生できる楽曲のためではなく、DAWなどを想定したDTM環境向けの仕様であるといえます。入力デバイス側からの多様な入力方法を実現する手段として策定されたものでもあります。

MPE仕様はROLIのサイトからダウンロードできます。（MMAのサイトはまともに資料公開する気が無いので無視していいです。） https://rolisupport.freshdesk.com/support/solutions/articles/36000027933-what-is-mpe-

## 個別化できるメッセージ

MPEを解説するWebサイトによっては、いかなるCCなどのメッセージもノートごとに設定できるようになるかのように読めるものがありますが（「従来のMIDIメッセージではチャンネルごとにしか設定できなかったものがMPEではノート毎に設定できるようになる」と書いておきながらMPEで具体的に「何の」メッセージが処理できるか書いていないものはわたしはNGだと思っています…）、少なくとも最終的なMPE仕様で規定されているのはPitchBend, Channel Pressure, CC 74の3種類のみです（仕様書2.3にあるTable 1参照）。モジュレーション、ヴォリューム、ダンパーペダルなどは、明示的に**Send: Not Recommended**、**Receive: Cannot expect to be responded**と書かれています。

これは、音源側でありとあらゆるメッセージがノートごとに処理されることは期待できない、というMPE仕様策定チームの意図を表したものであるといえます。

## CAfとPAf

CAfを個別のノートに設定できる、というのは、実質的にはMPEのCAfはPAfと変わるところが無い、ということを意味しています。それどころか、MPEゾーン（個別のノート）に対する**PAfの送信は想定されていません**。要するに、MPEという仕様を策定するのであれば、MPEモードにあってはPAfはCAfによって一貫性のある処理で実現するのが筋である、とされているのです。そして、MPEモードにおけるPAfの用途は仕様によって予約されています。

ユーザーから見て、MPEによるCAfのサポートは、何ら機能的なアドバンテージをもたらすものでは無いでしょう（それどころか、間にMPE非対応のパスが含まれていると、メッセージが損なわれる可能性があります。もっとも普通のMIDIメッセージとしてスルーしてくれる処理系なら問題ないでしょう）。

## Pitch BendとBend Cent Mode

ピッチベンドは、通常はそれ単体で調整するものではなく、ピッチベンドの効果の大きさを（通常）半音階単位で調整するピッチベンド・センシティビティと合わせて調整するのが一般的です。MPEモードでは、全体的なピッチベンド・センシティビティとノートごとのピッチベンド・センシティビティを、両方指定することができます。この場合、音源側は、これらを両方考慮して出力を決定する必要があります。

ピッチベンドの値も、もちろん全体的な値とノートごとの値を両方指定される可能性があります。送信側デバイスはどちらかのみを送信するかもしれませんが、受信して処理する音源側は、これらを両方処理することが期待されます。

## CC 74（カットオフ）

CC74はMIDI標準仕様ではいかなるメッセージとしても規定されていないものですが、RolandやCASIOがFilter cutoffに、YamahaもBrightnessに割り当てているので、およそ同じ目的のものとして規定されていると考えてもよいでしょう。

## 拡張性

MPE仕様に拡張性はありません。これらの3種類の表現以外は、将来の仕様で策定されるかもしれない、とだけ書かれています。
PyTorch is 何

PyTorch #とは　
どうも、PyTorch Advent Calendar　1日目担当のアンサンブル提案おじさんです。
初日ということで、**PyTorchの最速入門**を目指す記事になっております。
#　PyTorch is 何

>**PyTorchとは、DeepLearningフレームワークである。**

DeepLearningフレームワークとは、ニューラルネットを簡単に構成できるフレームワークのことで、構築から、入出力、そして学習までをトータルでお任せできるソフトウェアになります。有名なプロダクトで言えばTensorFlowやKerasといったものが存在します。　PyTorchには元となるフレームワークTorchの存在があります。　TorchはLua言語で書かれたDeepLearningフレームワークです。そのTorchをPythonで使いたいと開発を始めたのがPyTorchです。

#　PyTorch の特徴

PyTorchの特徴は、

・ Defined by Run
・ 自由にグラフ構築
・ 直感的でわかりやすい実装
・ 比較的早い

などがあります。
KerasのDataloader関連で遅すぎてブチギレたことのある人なら、ぜひPyTorchを使ってみることをオススメします

## PyTorch is Smart : Defined by Run

PyTorchの一番の特徴にDefined by Runがあります。これはTensor計算をするごとに自動的にモデルを組むことができるというもので、最近のDeepLearningフレームワークでは多く採用されている形になります。このため、コードが非常に読みやすく、Keras並みに直感的なグラフ構築をすることが可能です。

## PyTorch is Flexible : 自由にグラフ構築が可能

Kerasでも、自由にグラフ構築が可能でしたが、もちろんPyTorchでもかなり自由にグラフが構築できます。

PyTrochでは、**forward関数作ることでモデル出力を定義します。** 具体例としては以下な感じ

```{Python}
class FC_model(nn.Module):
    def __init__(self):
        super(FC_model,self).__init__()#ここはお決まりの書き方
        self.FC = nn.Linear(512,1)#重みを学習するためにインスタンスを保持
    
    def forward(self, x):
        #ここで入出力モデルを定義。
        #入力はxに入り、出力はreturnで返すことでモデルの入出力を定義
        x=self.FC(x)
        return torch.sigmoid(x).squeeze(1)

```
つまり、ここの部分を見れば、具体的に何を行なっているのかがわかるという訳で、非常に分かりやすいです。
また、このforward関数、なんでも挟むことができて、

```{Python}    
    def forward(self, x):
        #ここで入出力モデルを定義。
        #入力はxに入り、出力はreturnで返すことでモデルの入出力を定義
        x=self.FC(x)
        print(x.shape) #(batch_size,1)
        return torch.sigmoid(x).squeeze(1)

```

printデバッグを挟むことも、if文を組むことだって可能です。

## PyTorch is Beautiful : 可読性の高さ

PyTorchはコードの可読性が非常に高いです。
例えば、ResNetで有名なSkip-Connectionであれば

```{python}
def forward(self,x):
    
    f_x=self.ResBlock1(x)
    x = f_x + x #connection
    f_x=self.ResBlock2(x)
    x = f_x + x #connection
    f_x=self.ResBlock3(x)
    x = f_x + x #connection
    
    return x

```
といった非常に直感的な書き方で書くことができます。アンサンブルだって簡単

```{Python}
def forward(self,x):
    #word2vec 単体
    emb_vec = self.Embedding_Layer(x)
    emb_mean = torch.mean(emb_vec, dim=1).squeeze(1) 
    #文章のword2vec平均を出力 (batch,seq,emb_dim)データなので、dim=1で平均化
    #(batch,1,emb_dim)=>(batch,emb_dim)に圧縮
    after_w2v = self.FC_w2v(emb_mean) #(batch,emb_dim) => (batch, FC_dim)
    
    #conv1d
    conv_vec = self.Conv1d(emb_vec)#(batch,seq,emb_dim) => (batch,after_conv_dim)
    after_conv = self.FC_conv(conv_vec)#(batch,after_conv_dim) => (batch,FC_dim)

    
    #lstm
    hidden = self.LSTM_layer(emb_vec) #(batch,seq,emb_dim) => (batch,hid_dim)
    after_lstm = self.FC_lstm(hidden) #(batch,hid_dim) => (batch, FC_dim)


    # Ensemble
    # それぞれの結果をFC_dimに揃えて加算して平均化
    ensemble_vec = (after_w2v + after_conv + after_lstm)/3 #(batch, FC_dim)
    result = self.FC_last(ensemble_vec) #(batch,FC_dim) => (batch, 1)
    return torch.sigmoid(result) 
    
```


グラフのコード自体が非常に読みやすいので、実装のイメージがつきやすいのがPyTorchの一番の特徴と言えるでしょう。



#　PyTorchを最速で入門してみよう。

**これは後ほど！**
リモートチームで見積りするときに使うツール

この記事は、[Business Bank Group Developers Advent Calendar](https://qiita.com/advent-calendar/2018/bbg_developers) 5日目の記事です。


チームで作業の見積りを行うとき、指で数字を出したりプランニングポーカーを使いますよね。でもリモートチームの場合は少し工夫が必要になります。
私のチームでの見積りのやり方がどう変わっていったか書いておきます。

# [Zoom](https://zoom.us/)
リモートでのビデオ会議は[Zoom](https://zoom.us/)を使っています。最初は[Zoom](https://zoom.us/)の画面の中で指で見積りを出していました。

![IMG_5080.jpg](https://qiita-image-store.s3.amazonaws.com/0/62293/a26ee22b-caf8-de94-25a5-ec1bc079e024.jpeg)
（いいスクリーンショットがなかったのでイラストでご勘弁ください）

これでもだいたいオーケーなのですが、出し続けると腕が疲れるし、誰が何本指を出しているかよくわからないこともあったので、別のやり方を試してみることにしました。

# [Slack](https://slack.com/)と[Simple Poll](https://simplepoll.rocks/)

チャットは[Slack](https://slack.com/)を使っています。[Slack](https://slack.com/)の中で使える投票アプリで[Simple Poll](https://simplepoll.rocks/)というものがあります。本来の使い方とは違うかもしれませんが、[Simple Poll](https://simplepoll.rocks/)を見積りに使っています。

![slack_somplepoll.png](https://qiita-image-store.s3.amazonaws.com/0/62293/1b341b0a-87de-5065-d771-10244992bcc6.png)

フィボナッチ数（1,2,3,5,8,13,...）を投票できるようにして、いっせいにそれぞれボタンを押します。
誰がどこに入れたかわかるし、気が変わったら別の数字にすることもできます。
一回の見積りが終わったら、全員投票を取り消して、同じ投票を再利用するという使い方もできてかなりお手軽でした。

ちなみに、[Simple Poll](https://simplepoll.rocks/)を無料で使えるのは一月あたり、全員の投票の合計が100までです。ご注意ください。

# Googleスプレッドシート

見積りした結果を取っておきたい、という意見が出て、今はGoogleスプレッドシートを使っています。
見積り用のシートに各自の列を作っておいて、いっせいに値を選択することで見積りをします。

![spreadsheet.png](https://qiita-image-store.s3.amazonaws.com/0/62293/0c2e0303-6037-1835-cc21-0cf158e48c43.png)

参考のために平均値、中央値、最頻値の列も作ってあります。
面白いのはSPARKLINEという機能で、見積りの値を折れ線グラフにしてくれます。
この折れ線グラフが大きくギザギザしていたら、みんなの意見がバラバラだというわけで、もうちょっと内容を話し合うというきっかけにしていますよ。

明日は寿司ジニア @tronperidot です。よろしくです。
[Rails] JSONをアップロードしてDBに保存する

# 目標

ユーザーがアップロードしたJSONファイルをDBに保存する



# やること

今回のやること

・[JSONファイルをアップロードする](#アップロード)

・[JSONファイルをディコードする](#ディコード)

・[テーブルの作成](#テーブルの作成)

・[DBに保存する](#DB保存)

# サンプルファイル

```Sample.json
[{
  "text" : "hogehogeho",
  "name" : "Nick"
}, 
{
  "text" : "fugafugafugafuga",
  "name" : "Reversal"
}]
```

# ルーティング

```routes.rb
get '/upload', to: 'tweet#upload'
post '/import', to: 'tweet#import'
```

# アップロード

まずViewを作ります

アップロード出来るファイルの拡張子を`json`に指定しています

```upload.html.erb
<h1>気味の悪い拡張子のファイルをアップロード</h1>

<%= form_tag({controller: "tweet", action: "import", method: "post"}, {multipart: true}) do %>
  <div class="field"> 
    <%= file_field_tag :file, accept: ".json, text/json" %>
  </div>
    
  <div class="actions">
    <%= submit_tag "気味の悪い拡張子のファイルを読み込む"%>
  </div>
<% end %>
```

これでアップロード画面が出来ました

# ディコード

次にアップロードしたJSONファイルをコンソールに表示出来るようにします

Controllerを作る

```tweet_controller.rb
def upload

end

def import
  upload_file = params[:file].path
  json = ActiveSupport::JSON.decode(File.read(upload_file))
  json.each do |data|
    p data['text']
end
```

コンソールに以下が表示されると思います

```console
hogehogeho
fugafugafugafuga
```

# テーブルの作成

コンソールに表示することが出来たので今度はテーブルを作ります。

今回作るテーブルは以下です

| Field |  Type  |
| :---: | :----: |
| text  | string |
| name  | String |

```
$ rails g model Tweet text:string name:string
```

忘れずマイグレーションもしておきましょう

```
$ rails db:migrate
```

# DB保存

```tweet_controller.rb
def import
  upload_file = params[:file].path
  json = ActiveSupport::JSON.decode(File.read(upload_file))
  json.each do |data|
    p data['text']
    
    # 下記を追記
    @tweet = Tweet.new(
      text: data['text'],
      name: data['name']
    )
    
    # 確認
    if @tweet.save
      p 'DB保存に成功'
    else
      p 'DB保存に失敗'
    end
end
```
超基礎編：「返り値・スコープ」の概念を知ろう！

#「返り値・スコープ」の概念を知ろう！
問題
以下のコードを実行すると、ターミナルにはなんと表示されるでしょうか？

```rb:
def rename(name)
  name = "#{name}::CAMP"
  return name
end

name = "TECH"
rename(name)
puts name
```
##解くまでの流れ
［ざっくり全体のコードを見る］→［雰囲気で判断してしまい引っかかる］→［読み直して理解する］

###1.ざっくり全体のコードを見る
パッと見た時にメソッドを用いて、何かを出力するんだなと認識する

###2.雰囲気で判断してしまい引っかかる
このメソッドはリネームするためのもので下の"TECH"が引数として渡され"TECH::CAMP"と表示されると思っていた
###3.読み直して理解する
順に見ていくと、まず変数nameに"TECH"が代入される。続いて`rename(name)`メソッドを呼び出す。メソッド内の変数は「引数::CAMP」となっていて、それを`return`返り値として返しているだけなので出力はされない。そして最後の`puts name`ではメソッドは関係ないのでそのまま"TECH"が出力される。
Pythonでシグモイド関数

```python
import numpy as np

def sigmoid(x):
    return 1 / (1 + np.exp(-x))
```

返り値の特性。xが0のとき、0.5を返す。xが負の数のときは 0より大きく0.5より小さい数、正の数のときは0.5よりも大きく1より小さい数を返す。

``` 
>>> sigmoid(0)
0.5
>>> sigmoid(-6)
0.0024726231566347743
>>> sigmoid(6)
0.9975273768433653
```

追記。ラムダ式で書けば１行で書ける。

```python
import numpy as np
sigmoid = lambda x : 1 / (1 + np.exp(-x))
```

おまけ。Kotlinでシグモイド関数。

```kotlin
import kotlin.math.exp

fun sigmoid(x: Double): Double = 1 / (1 + exp(-x))
```

### シグモイド関数の微分

```python
def derivative_sigmoid(x):
    return sigmoid(x) * (1 - sigmoid(x)
```
[AWS]EC2インスタンスがハイバネーションをサポート

# はじめに
Black Beltで「AWS re:Invent 2018 アップデート速報」のセミナー動画を観ていて、気になったアップデートがあったので備忘。

# 新機能 – EC2インスタンスの休止
（AWSブログ）
https://aws.amazon.com/jp/blogs/news/new-hibernate-your-ec2-instances/

ハイバネーション、という言葉はぶっちゃけ初めて聞きましたが、要するにスリープのことらしいです。
http://e-words.jp/w/ハイバネーション.html

（何回聞いても覚えられない……）

既に仮想サーバとなっている時点でOSの起動は（物理OSに比べて）格段に早くなっているので、この上何をそんなに急ぐのか、という気もしますが、24時間365日サービス提供していて、OS起動後の立ち上がりにやたら時間がかかるシステムだと有用かもしれません。
自分のところの現場にも稼働するアプリが重過ぎてWASの起動に30分ぐらいかかるシステムがあります。

長時間稼働が前提のサーバー製品ではあまり見ない機能だったので、ちょっと「おっ」と思いました。
Kotlin  画面回転後、横画面のみにする

画面回転後、縦画面をせず、横画面のみにする

# AndroidManifest.xml
```
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.nagatadaisuke.sampleorientation" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity android:name=".MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN"
                        android:configChanges="orientation|screenSize"/>

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</

``` 

# MainActivity
```
package com.example.nagatadaisuke.sampleorientation

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.content.pm.ActivityInfo
import android.content.res.Configuration


class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE)
    }

    /*
     * 画面回転を検出
     *
     */
   override fun onConfigurationChanged(newConfig: Configuration) {
        when (newConfig.orientation) {
            Configuration.ORIENTATION_PORTRAIT -> {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE)
            }
            Configuration.ORIENTATION_LANDSCAPE -> {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE)
            } else -> {
            }
        }
        super.onConfigurationChanged(newConfig)
    }
}

```
モブプログラミングを実施した感想とその有用性を考察

## はじめに

今までに何回かモブプロを行なったのですが、その時に得た知見と、有用性を自分なりに考えたものをまとめようと思います。

## 手記

### 1回目

1回目は、内輪の勉強会でモブプロを体験してみようといった会で行いました。
その時は、10名弱ほどでドライバーは10分で挙手制で交代するというルールで、全員が知らない言語と簡単な課題を持って挑もうといったものでした。
最初の方は席に座ってエディタが自分好みでないとその使い勝手の悪さに翻弄され、自分担当の目的が明確化されない、もしくはナビゲーターの多方面の観点からの意見に翻弄されグダグダでした。
作業半ばの頃に課題でやりたいことを細分化させ、自分が行うことをコメントないし声出しで周知することを心がけるようになってからは、方向性が見えモブプロ参加者の団結感が生まれスムーズに進むようになりました。
その後何人かが入れ替わり無事課題を達成させ仲間同士で喜び合う有意義な会となりました。

### 2回目

2回目モブプロを行おうとなったきっかけは、転職して2ヶ月目の時の話です。
簡単なプロフィールは以下です。

- 転職し、2ヶ月目
- なので、業務知識のところはあまり持っていない
- かつモブプロした時は自分が熟知してない言語だったので構文的なところは知識として足りない
- 開発はスクラムで1週間スプリントで個々に看板を割り振って開発を行う

その週はプロダクトの中でもかなり業務知識が複雑な機能部分の改修を行う週で、私がその月、火で業務知識についていけず全然生産性を出せていなかったのがきっかけでした。
水曜日に私含めて３名でモブプロを行いましたが、業務知識を熟知している2人がドライバーとして中心にたち、私は業務仕様の説明を受けて頷きながら、時折仕様とロジックを照らし合わせて意見を出すような会でした。
結果的にうまくハマり、その日は1日で3人分の成果を出すことができました。それを2日間行いました。

### 3回目

3会目はvscodeを利用して2人で同時にコーディングを行うということを行いました。
これはモブプログラミングとは言い難いかも知れません。
その時は、割と単調に近い実装で数だけが多いような状態だったので、unitテストの作成と、実装作成に別れて行いました。
これも結果として成功でした。あらかじめ2人で作りの認識を合わせる必要がありますが、その最初に認識さえ合えば作られるものは決まっているので、単純作業効率は上がってまあまあ成功を納めました。


## 感想

上手くいかなかった例が出せなかったので、偏った意見になってしまうと思いますが、、

- モブプロを行うにはまず、常に方向性を定めることが特に重要
    - そのために、絶えずドライバーはナビゲーターに今やること、考えていることを伝える義務がある感じます。
    - また、ナビゲーターはドライバーを補う役割なので、そのドライバーを尊重し、ドライバーがやろうとしていること以外の発言を抑える必要があると思いました。
- 教育として成果を発揮すると感じました。
    - 業務知識であったりアーキテクトであったり、必要な情報はすぐ得られるのでかなり良いものだと思います。
    - 教育としてみた時、モブプロが有用である場合というのは、チームとしてレベルに差がある状態であると思います（全員が同じスキル、知識なら個々人で作業を行うのが一番生産性が高いはずだからです）。

とした上で、実際は私は1人で音楽を聴きながら黙々とコーディングをするのが大好きなので、モブプログラミングを強く推すことは考えていないです。
ただし、教育としては有用性を感じているので、自分がウィークポイントだと感じている箇所があれば、教育のためのモブプロというのは行なっていきたいなと思いました。
webpackerでcssとimagesを参照したい

webpackerを新規で導入した時につまずいたのでメモ

# 構成
[webpacker](https://github.com/rails/webpacker) のREADMEと同じ構成で試してみた。

ディレクトリ構成

```
app/javascript:
  ├── packs:
  │   # only webpack entry files here
  │   └── application.js
  └── src:
  │   └── application.css
  └── images:
      └── logo.svg
```

# 先に結論
application.jsに以下を追記

app/javascript/packs/application.js

```javascript
import '../src/application.css'
const images = require.context('../images/', true)
```

erbから呼び出し

```erb
<%= stylesheet_pack_tag 'application' %>
<%= image_pack_tag 'images/logo.svg' %>

# READMEではこのように呼べるよと書いてますね。
<link rel="prefetch" href="<%= asset_pack_path 'application.css' %>" />
<img src="<%= asset_pack_path 'images/logo.svg' %>" />
```

webpackでbuild

```sh
$ ./bin/webpack
```

# 背景
READMEの構成でapplication.cssを配置してbuild後、参照するとapplication.cssが見つからないと言われた。

```
Webpacker::Manifest::MissingEntryError in TopPages#index
Showing /Users/XXX/app/{app_name}/app/views/layouts/application.html.erb where line #9 raised:

Webpacker can't find application.css in /Users/XXX/app/{app_name}/public/packs/manifest.json. Possible causes:
```

出力先をみてみると確かにない。。

```console
$ ll public/packs/
total 40
-rw-r--r--  1 XXX  staff  5598 12  5 00:42 application-a5d1ad856f093264b17a.js
-rw-r--r--  1 XXX  staff  4941 12  5 00:42 application-a5d1ad856f093264b17a.js.map
-rw-r--r--  1 XXX  staff   236 12  5 00:42 manifest.json
```

manifest.jsonをみてもない。。

```
$ cat public/packs/manifest.json
{
  "application.js": "/packs/application-a5d1ad856f093264b17a.js",
  "application.js.map": "/packs/application-a5d1ad856f093264b17a.js.map"
}
```

よくよく調べてREADMEを読んでみると


> README:
> If you have styles imported in your pack file, you can link them by using stylesheet_pack_tag
> 訳:
> packファイルでスタイルシートがインポートされる場合は、stylesheet_pack_tagでリンクできます。

な、なるほど。  
ということでした。

# 参考:
* cssについて  
https://stackoverflow.com/questions/46004615/stylesheet-pack-tag-not-finding-app-javascript-src-application-css-in-rails-5-1  
* imagesについて  
https://stackoverflow.com/questions/50701797/rails-webpacker-images-not-loading-unless-manually-defined-with-import  
* webpackerについて
https://github.com/rails/webpacker/blob/master/docs/assets.md  

* こちらはwebpackerのREADMEを翻訳してくださっていました。大変参考になりました。ありがとうございます。
https://techracho.bpsinc.jp/hachi8833/2018_05_24/56977
カシオのカラーグラフ関数電卓 fx-CG50 に MicroPython がのったゾ

MicroPython Advent Calendar 2018の４日目が埋まってなかったので、小ネタ埋めておこうかと書き始めたら、初日から連投の boochow さんが４日目を埋めてくれました。せっかく書き始めたことと、日付も変わっていることですし、5日目投稿します。

カシオ計算機の公式Twitterで１２月４日に[こんな](https://twitter.com/CASIOJapan/status/1069761266040750080)発表がありました。

はい、カシオのカラーグラフ関数電卓 fx-CG50 で Python が使えるようになりました。Pythonといっても、実際はMicroPythonです。MicroPython には組込み用途以外にも軽量Pythonとして使われることがあるのですが、電卓にのっかるのもその例でしょう。

実はヨーロッパあたりでは昨年から出すぞ出すぞ予告されていて、今年9月の OS 3.20 アップデートで公式にサポートされました。日本で今頃発表されたのは、たぶんマニュアルの[翻訳が完了](https://support.casio.jp/manualfile.php?cid=004006006)したからでしょうね。

私は９月に安いUS版をを購入してOSアップデートしました。日本版との違いはたぶんカシオ電卓間のファイル転送に使うとかいう３ピンケーブルが付属しないことと、日本語説明書が付かないことぐらいでしょうか。OSのメニューは日本語版でも日本語表示にできないはずです（そもそも日本語フォントが入ってないらしい）。電卓間のファイル転送することはまずないですし、日本語マニュアルはPDFでダウンロードできるので、個人的にはUS版で十分でした。

fx-CG50 はけっこうデカイです。以下に比較写真出しておきます。中央が fx-CG50、左が iPhone XS Max、右がシャープ最後のポケコン PC-G850VS です。

![IMG_0017.jpg](https://qiita-image-store.s3.amazonaws.com/0/106817/1ad2f321-0b54-36f8-8576-a4c8f91f9414.jpeg)

使い方の簡単な説明は[ここ](https://web.casio.jp/dentaku/fxcg50/python.html?tw)で見れます。マニュアルには１７章にPython機能の説明があります。さらっと目をとおして、気づかれる方もいると思いますが、カラーグラフ関数電卓なのにグラフィックがらみの命令が無いみたいです。help()関数もないので、何のモジュールが標準入っているのかよくわからないのですが、マニュアルを読むかぎり、math と random ぐらいしか見つかりません。せっかくのカラー画面がもったいないので、次のOSバージョンではぜひともグラフィック機能と cmath ぐらいはサポートしていただきたいと思っています（あと、ソース公開もぜひとも)。

※ ちなみに fx-CG50 には元々 CASIO BASIC なる一風変わった BASIC 言語がのっています。これだとグラフィックも扱えます。

電卓キーボードからのプログラム入力はかなり苦痛ですが、入力支援のための CATALOG 機能があります。SHIFTキーと4を押すと、Pythonの予約語や組込み関数をメニューから選んで入力できるので、キーでポチポチ入力する苦労がだいぶ軽減されます。それでも苦痛なら、PCで編集してUSBケーブルでつないで転送するという方法もあります。

欧米では理数の授業に関数電卓が取り入れられていたり、大学入試試験で関数電卓が持ち込み可能だったりするので、高機能電卓はまだまだ需要があり、TI, HP, CASIO, そして新興の numworks などが教育市場に高機能電卓を供給しています。日本だとそういう需要がほとんど無いので、fx-CG50 のような電卓が日本で売られていることは、私のような物好きには大変嬉しいことです。できればポケコンも復活してほしいなと切に願っております。
pythonからDLL(C++)をコールして文字列を受け渡す

# 試したサンプル
pythonからDLL(C++)をコールして文字列を受け渡す。
また、DLLで受け取った文字列をメッセージボックスで表示する。

# 環境
 - Windows10pro(64bit)
 - Python3.6.2 64bit
 - Microsoft Visual C++ 2017 Community

　※DLLの作成方法は先人の記事をご参考↓
　　https://qiita.com/tibigame/items/da0e50f59fb0b9fac540

# C++コード(DLL)


```c++:testDll.cpp
// testDll.cpp : DLL アプリケーション用にエクスポートされる関数を定義します。
//

#include "stdafx.h"
#include <tchar.h>

extern "C" __declspec(dllexport) void __stdcall mbox(LPCTSTR in, LPTSTR out) {
	_tcscpy_s(out, 32, _T("戻り値:"));
	_tcscat_s(out, 32, in);
	::MessageBox(NULL, in, _T("test"), MB_OK);
}
```

# Pythonコード
※ロードするDLLがマルチバイト文字セットを使用している場合

```python:test_call_multibyte_dll.py
# -*- coding: utf-8 -*-
import ctypes
import sys

user32 = ctypes.cdll.LoadLibrary("testDll")
user32.mbox.restype = ctypes.c_void_p
user32.mbox.argtypes = (
    ctypes.c_char_p,ctypes.c_char_p
)
print('defaultencoding:'+sys.getdefaultencoding())

outmsg = ctypes.create_string_buffer(32)
inmsg = 'DLLコールテスト'

user32.mbox(inmsg.encode('mbcs'), outmsg);

print(outmsg.value.decode('mbcs'))
```
※ロードするDLLがUnicode文字セットを使用している場合

```python:test_call_unicode_dll.py
# -*- coding: utf-8 -*-
import ctypes
import sys

user32 = ctypes.cdll.LoadLibrary("testDll")
user32.mbox.restype = ctypes.c_void_p
user32.mbox.argtypes = (
    ctypes.c_wchar_p,ctypes.c_wchar_p
)
print('defaultencoding:'+sys.getdefaultencoding())

outmsg = ctypes.create_unicode_buffer(32)
inmsg = 'DLLコールテスト'

user32.mbox(inmsg, outmsg);

print(outmsg.value)
```

# 実行結果
```
defaultencoding:utf-8
戻り値:DLLコールテスト
```

# ポイント
- `argtypes` でコールするDLL関数の引数の型に合わせて設定する
- DLLからの受取用のバッファを`ctypes.create_xxxx_buffer()`で設定する（xxxxは文字設定に応じたもの）
- マルチバイト文字列の場合は、引数を文字列→バイト列に変換して関数をコールする

# 参考
https://docs.python.jp/3/library/ctypes.html#fundamental-data-types
typeormでclass-validatorを使う



Entity Listenerの[@BeforeInsert()](http://typeorm.io/#/listeners-and-subscribers/beforeinsert)と[@BeforeUpdate()](http://typeorm.io/#/listeners-and-subscribers/beforeupdate)を使って自動でvalidateする。手動でもできるのでおすすめ。

```typescript
import { IsNotEmpty, validate } from 'class-validator';
import { BeforeInsert, BeforeUpdate, Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn() 
  id: number;

  @Column()
  @IsNotEmpty()
  firstName: string;

  @BeforeInsert()
  @BeforeUpdate()
  async validate(): Promise<void> {
    for (const error of await validate(this)) {
      throw new Error(JSON.stringify(error.constraints));
    }
  }
}
```
Fizz_Buzz問題にチャレンジ！

#Fizz_Buzz問題
<p>問題文</p>
1〜100までの数字をターミナルに出力してください。ただし、「3の倍数」のときは数字の代わりに文字列でFizzと、「5の倍数」のときはBuzz、両方の倍数である「15の倍数」のときはFizzBuzzと出力してください。

```rb:ひな形は以下です。
def fizz_buzz
# ここに処理を書き加えてください
end
fizz_buzz
```

##解くまでの流れ
［とりあえず問題文を最後まで読む］→［情報を分けて考えてみる］→［情報とヒントを元にコードを書く］→［組み合わせて実行］→［実行結果から修正を加える］

###1.とりあえず問題文を最後まで読む
文を最後まで読んでみるものの、あまり分からない。特に「1〜100までの数字をターミナルに出力してください。」や「倍数の条件式」に引っかかる。
###2.情報を分けて考えてみる
全体を読んでも理解できなかったので分けて考えてみることにした。「1〜100までの数字をターミナルに出力してください。」の文では繰り返しの処理で最後に1ずつ足していけばいいと分かった。倍数の条件式では考えてもピンと来る式を思いつかなかった。

###3.情報とヒントを元にコードを書く
ヒントの繰り返し処理`while`と

```rb:
while num <= 100 do
  num += 1
end
```
倍数の条件式

```rb:
if num % 3 == 0
  puts "Fizz"
elsif num % 5 == 0
  puts "Buzz"
elsif num % 3 == 0 && num % 5 == 0
  puts "FizzBuzz"
else 
  puts num 
end
```
###4.組み合わせて実行
完成したプログラム

```rb:
def fizz_Buzz
  num  = 1
  while num <= 100 do
    if num % 3 == 0
      puts "Fizz"
    elsif num % 5 == 0
      puts "Buzz"
    elsif num % 3 == 0 && num % 5 == 0
      puts "FizzBuzz"
    else
      puts num
    end
    num += 1
  end
end
fizz_Buzz
```
コンソール

```
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
Fizz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
Fizz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
Fizz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
Fizz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
Fizz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
Fizz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
```
###5.実行結果から修正を加える
問題点、条件分岐を小さい数字から3の倍数、5の倍数、15の倍数の順に書いている。これでは15の倍数の時に3の倍数である”Fizz”が出力されてしまう。だから先に15の倍数を条件分岐を始めに持ってくる。

【修正後プログラム】

```rb:
def fizz_Buzz
  num  = 1
  while num <= 100 do
    if num % 3 == 0 && num % 5 == 0
      puts "FizzBuzz"
    elsif num % 3 == 0
      puts "Fizz"
    elsif num % 5 == 0
      puts "Buzz"
    else
      puts num
    end
    num += 1
  end
end
fizz_Buzz
```
【コンソール】

```
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
```
解答は以上になります
スクラムは問題を可視化するフレームワーク

## はじめに

ここ数年でアジャイル開発への期待が高まっています。
その中でもフレームワークとしてやることが明確なスクラム開発に人気があります。

しかしスクラムはその本質を理解しないと失敗するケースが多く、
かくいう私も一番最初に取り組んだスクラム開発ではうまくいきませんでした。

今はCSM、CSPOの取得とスクラムの実践を通して理解が進んだので、
自分のなかの「スクラムとはなんなのか」をまとめてみました。
事前に[スクラムガイド](https://www.scrumguides.org/docs/scrumguide/v2017/2017-Scrum-Guide-Japanese.pdf)を読んでいると理解がしやすいと思います。

## スクラムの真髄は問題の可視化

スクラム自体は問題解決をしません。
**スクラムは問題を見えるようにするもの**です。
スクラムのチームもツールもイベントもすべて問題の可視化のために貢献します。
継続的に問題を可視化できる仕組みを保つことによって問題が小さなうちに直していくのです。

ウォーターフォール（以下WF）との一番の違いはここだと思っています。
設計時に埋め込んだバグが実装やテストの時に見つかることはよくある話です。
以下はエンタープライズ系のシステム開発における工程ごとのバグの埋め込み比率です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89911/d6925940-8e72-111f-0828-9690fba0f120.png)
出典： https://www.ipa.go.jp/files/000004039.pdf

上流で埋め込んだバグに気づけないまま下流に行けば行くほど、改修コストは増大します。
システムが大きければ大きいほど埋め込むバグの数は増え、後にかかるコストも増大します。

スクラムでは1～4週間周期でその期間内に収まる規模の機能を順次リリースします。
小さな単位でリリースをするので改修コストは当然抑えられます。
この1回リリースする期間の単位をスプリントと呼びます。

## イベント（プロセス）

スクラムには先程説明したスプリントを含め以下のイベントがあります：

- スプリントプランニング （計画）
- スプリント 
- デイリースクラム （毎日の振り返りと共有と計画）
- スプリントレビュー （リリースの検査）
- スプリントレトロスペクティブ （振り返り）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89911/e0fe98f6-a9f6-5977-60ea-d1a692368c36.png)
出典： https://www.scrum.org/resources/what-is-scrum

イベント名を見ると解るかもしれませんが、PDCAサイクルを回すための仕組みが整っています。

スプリントプランニングで計画(PLAN)し、
スプリントで実行(DO)に移し、
スプリントレビューで検査(CHECK)し、
スプリントレトロスペクティブでカイゼン行動(ACTION)を決めます。
こうしてスプリント単位でチームが抱える問題を洗い出し改善していくのです。

これもWFに対する大きなメリットです。
WFにおけるプロダクトや工程の単位は大きすぎてPDCAを回しづらいです。
プロダクト・工程が変わると前回のACTIONを活かすのが難しいことは想像に難くありません。

小さなデイリーベースの問題はデイリースクラムにてチームで共有し、対処します。
フィードバックを受ける機会を明確に定義することで、問題の可視化を促します。

## チーム

スクラムチームには以下の役割があります。

- プロダクトオーナー
- 開発チーム（3～5人）
- スクラムマスター

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89911/1f47f556-046a-865d-c6f4-5efa607e6ffb.png)
出典： https://www.scrumalliance.org/agile-resources/scrum-roles-demystified

それぞれの役割が持つ責任は異なります。

プロダクトオーナーはプロダクトの価値を最大化すること。
開発チームはプロダクトバックログの見積もりとそのリリースにコミットすること。
スクラムマスターはチームがスクラムプロセスを守ること。

チームはお互いの問題に気づき共有しあえるような信頼できる関係が必要です。
そのため、スクラムではチームを固定することを推奨しています。
固定されたチームで長期間働き関係を構築するのです。
当然役割ごとの上下関係もあってはなりません。

WFのようにマネージャーが管理するのではなく、
チームの一人一人が責任を果たすために自発的に動くことが求められます。
難しいことですが、自己組織化した暁にはチームの問題解決能力は高いものになっているはずです。

## ツール

スクラムで利用するツールも問題可視化に役立ちます。

- プロダクトバックログ（以下PBL）
- スプリントバックログ（以下SBL）
- バーンダウンチャート（以下BDC）
- プロダクト

重要なのはPBLもSBLもBDCもチームの目が届く場所にあることです。
これらのツールを見ることで以下のような事がわかります：

- 分割すべき大きすぎるPBIやタスクがあるか
- 誰がどのタスクで手が止まっているか
- チームのバックログの消化スピードは適切か

問題があることがわかれば、レトロスペクティブまで待たずともカイゼンは可能です。
問題を検査しすぐに対応しましょう。

動くプロダクトが常にあるのであれば、プロダクト自体も良いツールです。
ステークホルダーに触れてもらうことで早い段階で問題をフィードバックしてもらえます。

人はドキュメントを渡されると真面目に読み込んで細かい指摘をならべますが、
実際のソフトウェアを渡されるとマジになって本当に欲しいものについて真剣に考えるそうです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89911/09df591b-2e6c-be68-bc73-fd4a9154aa54.png)
出典： https://speakerdeck.com/kawaguti/jikkankudo2016-bpstudy?slide=9

これもスプリントレビューにて動くソフトウェアを見せる大きなポイントの一つです。

## まとめ

以上のようにスクラムはプロセス、チーム、ツールを明確に定義することで、
問題の可視化を実現し結果アジリティを高めるフレームワークとして構成されています。

スクラムガイドにもある通り、「理解は容易、習得は困難」なのですが、
問題が可視化しカイゼンしていくプロセスは参加している身としてとても楽しいです。
この記事が「習得」の一助になれば幸いです。
PDFにノンブルをつける「PDFOperation」

~~（技術同人誌 その2 Advent Calendar 2018参加作品です。）~~（取り消しました。）

技術同人誌を初めて書くときに困るのが、「ノンブル」です。
それを解消するために、PDFにノンブルをつけるWebアプリ「[PDFOperation](https://kauplan.org/pdfoperation/)」を公開しています。

* https://kauplan.org/pdfoperation/


## ノンブルとは？

[ノンブル](https://www.google.com/search?q=ノンブル)とは、書籍の（表紙と裏表紙を除いた）すべてのページにつけられた番号です。ページ番号とよく似ていますが、ページ番号だとたとえば

* まえがきや謝辞や目次は i、ii、iii、・・・
* 本文が開始されると 1、2、3、・・・

というページ番号になることがあります。また空白ページや章タイトルページでは（デザイン上の都合から）つかないことがあります。

これに対し、ノンブルは必ず 1、2、3、・・・という順番を守ります。また（表紙と裏表紙を除いて）どのようなページでも飛ばすことなく、必ずつけられます。

ノンブルは、印刷所の人がページ順番を確認できるようにするためにつけられます。そのため「i、ii、iii、・・・」と「1、2、3、・・・」が混じっていたりついていないページがあると、印刷時にページの順番を間違う可能性があります。そのようなトラブルを避けるために、通し番号をすべてのページにつける必要があります。それがノンブルです。

言い方を変えれば、**読者のためにつけるのがページ番号、印刷所のためにつけるのがノンブル**です。

そしてこのノンブルは、印刷所によっては必須です。具体的には、技術書典でお世話になる[「日光企画」さんがノンブル必須](https://www.google.com/search?q=日光企画+ノンブル)です。
なので、日光企画さんで印刷するときはノンブルをつけましょう。つけてないと、差し戻しになります。


## 「PDFOperation」とは？

「PDFOperation」とは、PDFにノンブルをつけてくれるサービスです。PDFをアップロードするだけで、次の画像のようなノンブルをつけてくれます。

![nombre-sample.png](https://qiita-image-store.s3.amazonaws.com/0/224266/a792235f-9da1-85c7-0bf7-26b3113c06e2.png)

ちょっと見づらいですが、ページの左下に小さく数字がついてますよね？これがノンブルです。これがすべてのページに付きます。

ノンブルは、読者のためにではなく印刷所のためにつけます。そのため、印刷所の人には見えるけど読者には見えにくい場所につけます。

具体的には、見開きの真ん中の部分ですね。ここは紙に印刷したときは見えるけど、本にすると綴じ代の部分になるので読者からはほとんど見えません。上のサンプルのように奇数ページ（見開きで右ページ）だと左下の隅にノンブルがつき、偶数ページ（見開きで左ページ）だと右下につきます。こうすると、紙に印刷した段階（製本する前）だと問題なく見えるのに、本にすると読者からはほぼ見えなくなります。

また上のサンプルでは、数字が縦に並んでますよね？これも製本したときに、綴じ代に隠れて目立たなくするための工夫です。

このように、読者からは見えないようにつけられたノンブルを特に「[隠しノンブル](https://www.google.com/search?q=隠しノンブル)」といいます。
そしてPDFファイルに隠しノンブルをつけてくれるのが、「PDFOperation」の機能です。


## ノンブルのつけ方

PDFファイルにノンブルをつけるのはとても簡単です。「PDFOperation」のサイト（https://kauplan.org/pdfoperation/ ）にアクセスし、PDFファイルをアップロードするだけ。これで隠しノンブルが入ったPDFがダウンロードできます。

なおPDFOperationでは、アップロードされたPDFファイルを一切保存していません。とはいってもこれを証明する方法はないし、変なトラブルを抱えたくないので、機密情報や個人情報の入ったPDFファイルはアップロードしないようお願いします。なにか問題があったとしても、一切の保証はできません。


## 注意点や制限事項

* ノンブルに使ったフォント（Helvetica）の埋め込みができません。
  PDFの仕様では、どのPDFビューワも持っておくべきフォントがいくつかあって、Helveticaはそのうちの1つです。なので、本来ならHelveticaの埋め込みは必要ないはずです。しかし印刷所に出すPDFファイルではたとえHelveticaであっても埋め込みが必要なので、各自でフォントを埋め込んでください。

* 横書き用（左綴じ用）のPDFにしか対応していません。縦書き用（右綴じ用）への対応はToDoです。

* フォントサイズや色や、ノンブルを埋め込む位置などは、現在は固定です。これらを指定する機能は、Todoです。

* 表紙と裏表紙にはノンブルをつけないのが一般的です。印刷所に入稿するときも、本文と表紙は別ファイルとして入稿するはずです。なので表紙や裏表紙にノンブルがつくことは、通常はありません。

* ノンブルは、通常は「1」から始めますが、表紙1と2を考慮して「3」から始める流儀もあります。PDFOperationにはノンブルを「3」から始める機能は特にはないですが、要望があればつけます。

* すでに説明したように、ノンブルは印刷所のためにつけるものです。そのため、電子書籍用のPDFファイルではノンブルは必要ありません。

* ノンブルをうまく埋め込めないPDFがあるかもしれません。自分が試した範囲では問題なくノンブルをつけられましたが、実績としては不十分です。
  もしうまくいかなければ、かわりに[I Love PDF](https://www.ilovepdf.com/ja)というサイトの「[PDFページ番号を設定](https://www.ilovepdf.com/ja/add_pdf_page_number)」という機能を使うといいでしょう。

* ノンブルがついたPDFファイルは、ファイルサイズが思ったより大きくなります。もっと効率のよい方法があると思いますが、PDFの内部構造に詳しくないので、当分はこのままになりそうです。
  （いろんなPDFライブラリを試してみたいところ。）

* 繰り返しになりますが、機密情報や個人情報の入ったPDFファイルはアップロードしないようお願いします。なにか問題があったとしても、一切の保証はできません。


## 余談

本文開始時にページ番号をリセットせず、まえがきから最後までページ番号を順番につければ、印刷所がページ番号をノンブルとして使ってくれます。[TechBoosterが提供している書籍テンプレート](https://github.com/TechBooster/ReVIEW-Template)は、この方法を使っています。そのため、一般の書籍のようにまえがきや目次でページ番号を「i、ii、iii、・・・」にすることは、この書籍テンプレートでは期待すべきではありません。
GitHub Pagesしてみる

#GitHub Pagesとは
GitHubアカウントを持っていれば[GitHub Pages](https://pages.github.com/)で超簡単に自分のWebsiteが作成できます。[Electron](https://electronjs.org/)や[YEOMAN](https://yeoman.io/)や[Bootstrap](http://getbootstrap.com/)などが利用しています。(そのほかの[Example](https://github.com/collections/github-pages-examples)。)
個人のWebSiteとしては申し分ないですね。

#早速作ってみた

##Create a repository
username.github.ioという名前のレポジトリをつくります。usernameがアカウント名と一致していないと動作しません。
<img width="738" alt="スクリーンショット 2018-12-05 0.10.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/fe044d79-eac8-2ade-7152-2ad9ac68714c.png">

##Clone the repository
作成してプロジェクトをcloneします。

```
$ git clone https://github.com/uguisuhohokekyo/uguisuhohokekyo.github.io
Cloning into 'uguisuhohokekyo.github.io'...
warning: You appear to have cloned an empty repository.
```
##Push
index.htmlを作成してpushします。

```
$ echo "Hello World" > index.html
$ git add --all

$ git commit -m "Initial commit"
[master (root-commit) 9e3adff] Initial commit
 1 file changed, 1 insertion(+)
 create mode 100644 index.html

$ git push -u origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 222 bytes | 222.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: 
remote: Create a pull request for 'master' on GitHub by visiting:
remote:      https://github.com/uguisuhohokekyo/uguisuhohokekyo.github.io/pull/new/master
remote: 
To https://github.com/uguisuhohokekyo/uguisuhohokekyo.github.io
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
```
#結果
わーい、自分のWenSiteが作成できました。
サーバーやらDBやら立てる必要ないので便利です。
<img width="400" alt="スクリーンショット 2018-12-05 0.18.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/e88d05e3-b983-afd3-a938-7b71838b03f6.png">
DXOpalをオンラインでコーディング&実行できるようにしてみた

# はじめに

この記事は、Opal (Ruby-to-JavaScript compiler) Advent Calendar 2018 の5日目の記事です。

以前書いた、[RailsでDXOpalを使ってみた](https://qiita.com/S_H_/items/3752810b56483b53e9c1)の時の経験をベースに、Rails と Vue.js でDXOpalのオンライン環境っぽいものを作ってみました

# つくったもの

デモ

![dxopaleditor.gif](https://qiita-image-store.s3.amazonaws.com/0/191521/e20cc85d-f859-515f-25ec-0da833316e34.gif)




デモには[こちらのソースコード](https://yhara.github.io/dxopal/examples/triangles/index.html)を使用させていただきました。
誠にありがとうございます。

[ソースコード](https://github.com/S-H-GAMELINKS/DxOpalEditor)


# 実装など

Webpackerを使い、Vue.jsでフロントエンド、Railsでバックエンドをそれぞれ実装している。

`/api/sources`というAPIを作成し、`axios`経由でフロントエンドからDXOpalのソースコードをやり取りしている。

エディター部分は [vue2-ace-editor](https://github.com/chairuosen/vue2-ace-editor)にて実装。

実装で一番苦労したのが、DXOpalのソースコードをAPIを経由し、どうやって受け取るか

まず、コントローラーを以下のように変更

```ruby:api/sources_controller.rb
class Api::SourcesController < ApplicationController
    before_action :set_source, only: [:code, :show, :edit, :hashtags, :update, :destroy]

    #省略

    def code
      render json: @source.code
    end

    #省略
  
    private
      # Use callbacks to share common setup or constraints between actions.
      def set_source
        @source = Source.find(params[:id])
      end

    # 以下省略

end
```

```ruby:routes.rb
Rails.application.routes.draw do

  #省略

  namespace :api, format: 'json' do
    resources :sources
    get "/sources/:id/code", to: "sources#code"
  end
end
```

`code`というアクションを作成し、`/api/sources/:id/code`というルーティングを追加。

あとは、DXOpalのソースコードを実行する各Showページを下記のように変更

```vue:Show.vue
<template>
    <div class="container">
        <h1><p> Name: {{name}} </p></h1>

        <h2><p> Code </p></h2>
        <p>{{code}}</p>

        <h2><p> Game </p></h2>
        <script type="text/ruby">
            require 'native'
            DXOpal.dump_error{ require_remote "/api/" + String($$.location.pathname) + "/code" }
        </script>

        <canvas id="dxopal-canvas"></canvas>
        <div id="dxopal-errors"></div>
        <input type='button' id='pause' value='Pause/Resume'>
    </div>
</template>
```

肝は、下記の部分。

```javascript
            require 'native'
            DXOpal.dump_error{ require_remote "/api/" + String($$.location.pathname) + "/code" }
```


まず、`require `native``で`$$.location.pathname`が使えるようにする。

そのあと、以下のコードで、`/api/sources/:id/code`にアクセスし、DXOpalのソースコードを読み取り実行

```javascript
DXOpal.dump_error{ require_remote "/api/" + String($$.location.pathname) + "/code" }
```

これで、DXOpalの実行が確認できる

# おわりに

まだ基礎的な部分しか出来上がっていないので、まずはデザインなどをよしなにしていきたいと思う。

あと、実際にコーディングしている際に実行して確認できるような環境構築もしていきたいと思う。

# 参考リンク

[yhara/dxopal](https://github.com/yhara/dxopal)

[opal/opal](https://github.com/opal/opal)
Open CVで円を描いてみた➀

## Open CVとは？
画像処理が行える膨大な関数が用意されたライブラリ。数行のコードで簡単な画像処理プログラムが開発できます。


## 実際にやってみた
1. ライブラリのインポート

~~~Python
import numpy as np  
import cv2
~~~


2. 黒色の画像を生成して、円を描く

~~~Python
img = np.zeros((600,600, 3))                   #黒色の画像を生成
cv2.circle(img , (300,300), 60 , (0,0,255),5)  #円を生成
~~~

上記のコードにより、600×600の黒色の画像を生成して、その上に中心の座標が(300,300)、半径60ピクセル、赤色、太さ5ピクセルの円を描きます。

3.画像の保存、表示

~~~Python
cv2.imwrite('./data/pict/circle1.jpg' , img)   #保存
cv2.imshow('img1' , img)                       #表示
~~~

cv2.imwrite関数で保存して、cv2.imshowで表示します。
すると、上記のパスに下のような赤い円が描かれた画像が保存されていることを確認できます。

![circle2.jpg](https://qiita-image-store.s3.amazonaws.com/0/317125/dec4531b-f1bf-7dec-b689-34433b96f706.jpeg)