OmniAICreator/Qiita-1.07M huggingface dataset:
Windows10パフォーマンスアップ

メモリを圧迫するWindows10
----
Windows10では以前のバージョンと比較すると使いやすくなりましたが、その一方いろいろなところに負荷がかかっています。
そのひとつに「System」というプロセスがあり、作動するためには必要不可欠なメモリ領域なのですが、これがメモリを食いつぶしていることがあり、多いときだと1GBを超えることもあります。
使用しているパソコンのメモリが2GBなど容量の低いものだと致命的で、かなり重い状態になると思います。
ブラウジングしながら別のアプリで作業していたら、重い動作に過度なストレスがあります。
そんな動作の遅いパソコンを軽くできるようにWindows10高速化できる内容をまとめました。

Windows Defenderを無効にする
----
Windows DefenderはWindows10にプリインストールされているセキュリティプログラムです。
これが常時ウイルススキャンが起動していてパソコンの動作に影響を与えてしまっています。
別のセキュリティソフトをインストールしている場合、同種のアプリが重複して動作しているのでWindows Defender を無効にすることをおすすめします。
※セキュリティソフトをインストールしていない方は控えましょう。

1. レジストリエディターを立ち上げる
「Windowsキー＋Rキー」で「ファイルを指定して実行」を立ち上げる　→
「regedit」と入力し「OK」をクリック →　管理者権限を求められるので「続行」をクリック　→　レジストリーエディターが立ち上がる

2. Windows Defenderを開く
「\\HKEYLOCALMACHINE\SOFTWARE\Policies\Microsoft\Windows Defender」を選択　→ 　Windows Defenderのレジストリエディターが開く

3. 追加して値を変更
画面中央空白の部分で右クリック　→ 「新規」を選択　→ 「DWORD」を選択　→ レジストリが追加されるので名前欄に「DisableAntiSpyware」と入力　→ 新しく作成したレジストリで右クリック　→ 「修正」を選択　→ 値の編集画面が表示されるので、値のデータ欄に数字の「1」を入力（※値が1で無効、0で有効）　→ 　Windows Defenderの完全無効化が完了！

これでWindows Defenderの完全無効化が完了しまた。
※ちなみにレジストリとは各プログラムの情報を格納している場所なので、適当にいじっているとプログラムに支障をきたす恐れがあります。
知識なく使用するのは控えましょう。


常駐アプリケーションを無効にする
---
常駐アプリケーションとは常にバックグラウンドで作動しているアプリケーションです。
Windows10のシステムに関わる重大なものから、停止してもなんら問題のないものまでいろいろ存在します。
デフォルトの場合、不要なアプリケーションが多く常駐しているので無効にすることにより動作を軽くできます。
無効にしていいものとしてはいけないものがあるので十分に注意しましょう。

アニメーションエフェクトを無効にする
---
Windows10ではアニメーション効果があります。
これはメモリに負担を与えている原因です。
簡単に無効にできますので、特にこだわりがなければ実施した方がいいとおもいます。

バックグラウンドアプリの設定を変更する
----
Windows10では、「アプリのバックグラウンド実行」がデフォルトですべて許可されています。こちらもメモリを食いつぶしている原因となっていることが多いです。

1. 「設定」を開く
2. 「プライバシー」を開く
3. 左サイドバー「バックグラウンド アプリ」を開く
4. バックグラウンドでの実行を許可しないアプリをオフに

スタートメニューの透明効果を無効にする
---
Windows10のスタートメニューやタスクバーには半透明エフェクトが設定されています。
これを無効にすることによりメモリへの負担を軽減します。
スタートメニューを開き、「設定」をクリックしてください。
もしくは「Windowsキー+Iキー」で設定画面を立ち上げても構いません。

設定画面から
「パーソナル設定」→「色」→「スタート、タスクバー、アクションセンターを半透明にする」を「オフ」

これで無効になります。

フォルダーオプションを無効にする
----
フォルダーオプションはエクスプローラーなどの表示方法を指定するオプションです。
いくつか不要なオプションをオフにすることでメモリへの負担を軽減します。

「Windowsキー+Eキー」を押してエクスプローラーを開く →　上部タブの「表示」をクリック>詳細設定にある下記の項目をオフにしましょう。

1. 空のドライブは表示しない
2. 登録されている拡張しは表示しなし
3. フォルダーの結合の競合を非表示にする
4. フォルダーのヒントにファイルサイズ情報を表示する
5. 暗号化や圧縮されたNTFSファイルをカラーで表示する
6. フォルダーとデスクトップの項目の説明をポップアップで表示する

これらのオプションのチェックを外し、「適用」を選択すると不要なオプションが無効になります。
※デフォルトに戻す場合「既定値に戻す」を選択します。


以上のことからメモリ使用量が快適になってくると思うので、マシンスペックが弱い場合は試してみるのもいいと思います。
ubuntu スクロール速度を変更する

ubuntu でマウスのスクロール速度を変更する


imwheelを使用する。

参考
https://wiki.archlinux.org/index.php/IMWheel
https://askubuntu.com/questions/285689/increase-mouse-wheel-scroll-speed
http://pagent.github.io/2015/05/13/mouse-wheel-scroll-speed/


sudo apt-get install imwheel

インストール後、~/.imwheelrcファイルを作成（/home/ユーザー名/下に.imwheelrcファイル）。
touch ~/.imwheelrc
gedit imwheelrlrc


".*"
None,      Up,   Button4, 3
None,      Down, Button5, 2

閉じたあと、下記のコマンドで起動
imwheel -b "4 5"

imwheelだけだと戻るボタン等が使用できなくなる。
シミュレータも実機も起動するのに Android のリリースビルドができなかった件

## 前提
* AndroidStudio: 3.1 
* Gradle version: 4.4
* ReactNative: 0.57.1
* リリースに必要なもろもろ [参考サイト](https://qiita.com/wktq/items/6c83f17ccb68dc7dd666) は実施済み

## エラー内容
```cli
error: failed linking references.

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':react-native-config:verifyReleaseResources'.
> com.android.ide.common.process.ProcessException: Failed to execute aapt
```

## 解決策
android ディレクトリ直下の `build.gradle` を開き、 `allprojects` の下あたりに以下の記述を追加

`compileSdkVersion` と `buildToolsVersion` の値は、それぞれ `buildscript` の中にある `ext` 内の同じ項目をコピペする。


```/android/build.gradle
subprojects {
    afterEvaluate {
        project ->
            if (project.hasProperty("android")) {
                android {
                    compileSdkVersion = 27
                    buildToolsVersion = "27.0.3"
                }
            }
    }
}
```

## 原因
利用しているライブラリに設定してあるビルド条件と、ビルドするマシンに入っているビルドツールのバージョンが不一致することに起因するっぽい。
気の利いたライブラリは、ビルドツールの指定などを本体に合わせるような記述をしてあるのだけど、中にはバージョンをハードコーディングしているものもあるらしい。つらい。

## 参考
* https://github.com/facebook/react-native/issues/19239
force cli : logout用の便利ツール

#初めに
本番環境、各種Sandoboxに接続しながら作業している時に簡単にlogoutできるようにシェルを作りました。その時の備忘録です。

通常は、以下のようにユーザIdを指定してlogoutします。毎回ユーザIdを入力するのが少々面倒です。

```
$force logout -u=admin@xxxxxx.co.jp
```

#処理の流れを考える

ForceCLIではlogin しているユーザは、以下で確認できるので、その出力結果からユーザIdを取得して入力の手間を省くことにしましょう。

```
#force logins
admin@xxxxxx.co.jp (active) https://xxxxxx.my.salesforce.com

```

#実際のシェルのサンプル
```

#!/bin/sh
tmp=/tmp/tmp-$$
force logins     |
sed '/^$/d'      | ## 空の行を抜く
tee $tmp-message |
cat

cat $tmp-message |
awk '{print $1,0}'|
awk '$1 ~ "admin@xxxxxx.co.jp"{$2=1}
     $1 ~ "admin@xxxxxx.co.jp.partial" {$2=2}
     $1 == "no"{$2=0}
               {print $0}'|
cat > $tmp-select

sw=`echo | cat $tmp-select | self 2`
if [ $sw -eq 1 ]
then
force logout -u=admin@xxxxxx.co.jp
fi

if [ $sw -eq 2 ]
then
force logout -u=admin@xxxxxx.co.jp.partial
fi

# 終了処理
rm -f $tmp-*
exit 0
```
autowireされたTranslatorInterfaceの行方

## 発端 ##

symfonyのcommandで作ったバッチでメモリ不足発生。本番環境では発生しない。
自分にとって「またか」の現象です。その都度対策はしているので、今回は新たな原因があるのでしょう。

さっそく原因を調べていきます。調査過程は省略しますが、translatorの呼び出しで少しづつメモリが減っていることがわかりました。

## 追跡 ##

translatorは普通にTranslatorInterfaceでautowireしています。

debug:autowiringコマンドで何が注入されているか見てみます。

```
> php bin/console debug:autowiring translator
Autowirable Services
====================

 The following classes & interfaces can be used as type-hints when autowiring:
 (only showing classes/interfaces matching translator)

 ---------------------------------------------------
  Symfony\Component\Translation\TranslatorInterface
      alias to translator.data_collector
 ---------------------------------------------------
```

prod環境では結果が変わることに注意です。

```
> php bin/console debug:autowiring translator --env=prod
Autowirable Services
====================

 The following classes & interfaces can be used as type-hints when autowiring:
 (only showing classes/interfaces matching translator)

 ---------------------------------------------------
  Symfony\Component\Translation\TranslatorInterface
      alias to translator.default
 ---------------------------------------------------

```

translator.data_collector, translator.defaultが実際どのクラスなのか、debug:containerコマンドで調べます。

```
> php bin/console debug:container translator.data_collector                                  

Information for Service "translator.data_collector"
===================================================

 ---------------- -------------------------------------------------------
  Option           Value
 ---------------- -------------------------------------------------------
  Service ID       translator.data_collector
  Class            Symfony\Component\Translation\DataCollectorTranslator
（略）

> php bin/console debug:container translator.default

Information for Service "translator.default"
============================================

 ---------------- -------------------------------------------------------
  Option           Value
 ---------------- -------------------------------------------------------
  Service ID       translator.default
  Class            Symfony\Bundle\FrameworkBundle\Translation\Translator
（略）
```

dev環境では Symfony\Component\Translation\DataCollectorTranslator がautowireされることがわかりました。
このクラスのコードを見た瞬間、メモリが消費されていく原因がわかりました（笑）

## 対応 ##

```yaml
services:
    Symfony\Component\Translation\TranslatorInterface: '@translator.default'
```

もしくは、コマンドを--no-debugで実行する

一番最後で核心をついてしまいましたがsymfonyのコンテナはvar/cache以下に(envのパターン)×(debug or no-debug)の組み合わせ別にphpファイルにコンパイルされているのです。

いろいろ寄り道をした気がしますが、symfonyのサービスコンテナとautowireの内部に一歩踏み込んだとは思います。
DjangoでWebアプリを作成してみた

#はじめに
興味本位でWebアプリを作成してみました．
普段は制御系やデスクトップアプリの作成，ちょっとした自動化用のスクリプト作成をやっており，webアプリに関しては完全に未経験でした．


![9c28027d-b29a-4b35-bd0e-e89d944496e3.jpg](https://qiita-image-store.s3.amazonaws.com/0/249420/055b2298-5f35-afad-b8d6-785441dee654.jpeg)

#いきさつ
普段[読書メーター](https://bookmeter.com)というサイトで読んだ本を管理しているのですが，このサイトでは今月先月分の読書数か記録を始めてからのトータルの情報しか見ることができませんでした．
そこで記録を始めてからの月ごとの読書データを取得し，グラフ化するようなスクリプトを作成して使用していました．ついでに勉強がてらやってみるかと思い作ってみました．

#環境  
・Heroku
・python-3.6.6
・Django-2.1.1 

#Djangoの勉強にて参考にしたサイト  
Django Girlsのチュートリアルを一通りやったのですがいまいち理解しきれず，paizaの2系対応の記事も参考にしました．
・[Django Girls のチュートリアル](https://tutorial.djangogirls.org/ja/)
・[Django2.1入門: 初心者でも10分でWebサービスを作れる！PythonフレームワークDjangoとPaizaCloudの使い方](https://paiza.hatenablog.com/entry/2018/02/28/paizacloud_django)
・[Django ドキュメント](https://docs.djangoproject.com/ja/2.1/)

#つまずいた点・対応策
- ajax  
解析に時間がかかるため，非同期にしなきゃと思ってajaxってのでできるらしい程度の知識しかなかったので，それで調べてやってみました．  
・[Djangoで、Ajax](https://torina.top/detail/333/)
- heroku環境でのファイルの扱い  
AmazonS3を使えばよいとのことでしたがどうすればいいのかわからず調べ回った結果，一番わかりやすかったのが以下でした．  
・[How to Setup Amazon S3 in a Django Project](https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html)
- heroku環境にて実行時のタイムアウト対策  
読書メーターから読書データを解析するのにデータが多いとherokuのタイムアウト時間である30秒を超えてしまいます．そのためには一旦30秒以内にレスポンスを返してやる必要があるとのことで，わからないながら調べた結果celeryにて非同期処理を実施し以下のような処理を行うようにしました．(正直何が正しいのか全くわかってないのでもっと良い方法があるのかも知れない・・・．)  
![seq.png](https://qiita-image-store.s3.amazonaws.com/0/249420/713a6885-8ae9-1284-0efc-74e23fc13a63.png)  
・[【Django】Celeryを試してみる](http://www.chitana.me/entry/2016/12/28/021505)  
・[Djangoで非同期処理 - Celery, Redisを使って](https://whiskyfun.herokuapp.com/blog/detail/10/)  
・[Celery](https://celery.readthedocs.io/en/latest/)

#反省点
・フロントエンドの知識不足
htmlもcssもjsもほぼわからないままで手をつけて見よう見まねでとりあえず動くものは出来たものの，ちょっと理解不足感が否めないことに・・・．
いったんちゃんと勉強しないといけないと思いました。
What is Haskell anyways?


Haskell (with the GHC compiler) is a lot faster than you'd expect. Used correctly, it can get close-ish to low-level languages. (A favorite thing for Haskellers to do is to try and get within 5% of C (or even beat it, but that means you are using an inefficient C program, since GHC compiles Haskell to C).) My question is, why?

Haskell is declarative and based on lambda calculus. Machine architectures are clearly imperative, being based on turing machines, roughly. Indeed, Haskell doesn't even have a specific evaluation order. Also, instead of dealing with machine data types, you make algebraic data types all the time.

Weirdest of all though is higher order functions. You would think that creating functions on the fly, and throwing them around, would make a program slower. But using higher order functions actually makes Haskell faster. Indeed, it seems that, to optimize Haskell code, you need to make it more elegant and abstract instead of more machine-like. None of Haskell's more advanced features seem to even affect its performance, if they don't improve it.

Sorry if this is sounding ranty, but here is my question: Why is Haskell (compiled with GHC) so fast, considering its abstract nature and differences from physical machines?

Note: The reason I say C and other imperative languages are somewhat similar to Turing Machines (but not to the extent that Haskell is similar to Lambda Calculus) is that in an imperative language, you have a finite number of states (a.k.a. line number), along with a Tape (the ram), such that the state and the current tape determine what to do to the tape. See the Wikipedia entry, Turing machine equivalents, for the transition from Turing Machines to computers.


***

I am so glad that you know about Haskell. :)
What is category theory, Man?

At a certain level, mathematician study structures. In a very small nutshell, category theory allows you to talk about structures recurring throughout other disciplines of mathematics; it's a kind of unifying theory. Much like Algebra studies various arithmetic structures and distills their properties without having to worry about whether you're talking about integers, matrices, families of functions, etc. which in the specifics are quite different, so category wishes to distill properties across various disciplines of mathematics.

***

What is the problem, Sir?
復習 Django チュートリアル ：コードをいじるまでの環境設定

## 目的
現段階（チュートリアル(4))までを復習して、自分で使いこなせるという実感を持ちたい。入力するコマンドと最低限の説明のみで整理したい。もうすでにどんなコマンド使ったか忘れてしまっているので…。作業場はtestdirectory、プロジェクト名は littleproject、アプリ名はlitteleappとする。(2019/09/18 改訂)

## 環境
ThinkPad T440p
Ubuntu Linux 18.04 日本語 Remix
Python 3.6.7
pip 18.1
Django 2.1.4

## pip をインストールする

```
Debian/Ubuntu
Python 2:
$ sudo apt install python-pip
Python 3:
$ sudo apt install python3-venv python3-pip
```
参考 : [Installing pip/setuptools/wheel with Linux Package Managers](https://packaging.python.org/guides/installing-using-linux-tools/#installing-pip-setuptools-wheel-with-linux-package-managers)

参考 : [よく使うpipコマンド](https://qiita.com/Masaaki_Inaba/items/fe4a246a7e6fcd9c4726)

**上記でvenvをインストールしたのでvirtualenvは不要なはず　(2019/09/18 改訂)**
~~virtualenv をインストールする~~
```
$ sudo -H pip install virtualenv
```

~~以下は -H つけなかったら出てくる表示。~~
~~>The directory '/home/***/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.~~

 ~~-H つけると出ない。何の意味があるのか良くわかっていないが、つけたほうが精神衛生上いい。~~

参考 : [sudo -Hと環境変数($PATH)ではまった話](https://diary.masasuzu.net/entry/2015/01/20/sudo_-H%E3%81%A8%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%28%24PATH%29%E3%81%A7%E3%81%AF%E3%81%BE%E3%81%A3%E3%81%9F%E8%A9%B1)

## Django をインストールする
```
$ mkdir testdirectory
    # testdirectory 作成
$ cd testdirectory
    # testrirectory に移動
$ python3 -m venv env
    # testdirectory に venv 環境を作る
    # env という名前のディレクトリが作成される
$ source bin/activate
    # venv 起動
(env)$ pip install Django
    # (env)$ は venv 上でやってますよの証
    # Django がインストールされる
```
## Django で project をつくる
```
以下$の前に(env)が付く＝ venv 上で作業する
$ django-admin startproject littleproject
    # littleproject ディレクトリと manage.py が作成される
    # ファイル構成は以下の通り
littleproject
├── littleproject
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py
$ python manage.py runserver
    # サーバーが立ち上がる
    # 127.0.0.1:8000 にアクセスするとロケットの絵が表示される
```

## Django で application をつくる
```
$ python manage.py startapp littleapp
    # littleapp と db.sqlite がつくられる
    # ファイル構成は以下の通り

littleproject
├── db.sqlite3
├── littleapp
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── littleproject
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-36.pyc
│   │   ├── settings.cpython-36.pyc
│   │   ├── urls.cpython-36.pyc
│   │   └── wsgi.cpython-36.pyc
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py
```

以上がコードをいじるまでの環境設定。
【VR学まとめ】4.3.4 人物のシミュレーション

# はじめに

この記事は[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の22日目の記事です。

[バーチャルリアリティ学](https://www.amazon.co.jp/バーチャルリアリティ学-舘-暲/dp/4904490053)の4章「バーチャル世界の構成手法」の内容をまとめていきます。
書籍の方も是非ご購入いただいた上でご利用ください。

# 4 バーチャル世界の構成手法

## 4.3 シミュレーション

### 4.3.4 人物のシミュレーション

#### (1) 人体物理モデル

- 剛体リンク系
    - 現実的な計算時間でシミュレートするために使う
    - 球面関節
        - 3自由度回転
    - 回転関節
        - 1自由度
    - 実際は回転中心が移動したりする

![JPEG image-E230E8ACB49C-1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/55365/9653cdce-d3c0-49f4-7928-6a8bac129b9b.jpeg)
引用元: [バーチャルリアリティ学](https://www.amazon.co.jp/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%AA%E3%82%A2%E3%83%AA%E3%83%86%E3%82%A3%E5%AD%A6-%E8%88%98-%E6%9A%B2/dp/4904490053)

#### (2) 計算アルゴリズム

- 力学シミュレーション(4.3.3参照)
- 逆運動学
    - リンクの位置と姿勢に対応する関節角を計算する
    - 解析的手法
        - 逆関数を求める
    - 数値的手法
        - ヤコビ行列と位置誤差の2上を評価関数とした最適化問題を解く方法
        - ニュートン法を用いて方程式の解を求める方法
        - 汎用性が高く応用も聴く
    - 解が無限に存在する
        - 手の位置・姿勢を変えずに肘の位置を変えられるなど


![JPEG image-ADFEE35BDD67-1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/55365/92aebc8f-1cbd-3606-0759-a1a22d006d54.jpeg)
引用元: [バーチャルリアリティ学](https://www.amazon.co.jp/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%AA%E3%82%A2%E3%83%AA%E3%83%86%E3%82%A3%E5%AD%A6-%E8%88%98-%E6%9A%B2/dp/4904490053)

#### (3) 運動生成

- 映画などではアニメーターがキーフレームを補間して制作する方法が主流
- リアルタイム生成する必要がある

- 力学シミュレーション
    - 人間らしい運動をするための関節トルクを計算する制御系が必要
        - 転倒しないための制御
    - 関節制御
        - 各関節は与えられた目標値に追従する
        - 全体のバランスは考慮されていない
    - バランス制御
        - 重心位置を目標位置に戻すための仮想的な力を計算し、各関節のトルクに変換する
        - 外力に対する反応の運動を生成できる
        - バランス制御は保証されていない
    - 有限状態機械
        - 各状態の制御系は事前に用意しておく

![JPEG image-ADFEE35BDD67-2.jpeg](https://qiita-image-store.s3.amazonaws.com/0/55365/7402a0ee-b3af-466e-c0a0-3bb5c1102631.jpeg)
引用元: [バーチャルリアリティ学](https://www.amazon.co.jp/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%AA%E3%82%A2%E3%83%AA%E3%83%86%E3%82%A3%E5%AD%A6-%E8%88%98-%E6%9A%B2/dp/4904490053)

- モーションキャプチャを利用する方法
    - 計測したデータを加工するので基本的に転倒などがない
    - モーショングラフ
        - クリップを複数用意して状況に応じた順序で再生する方法
        - 似た姿勢で遷移すれば滑らかになる

![JPEG image-ADFEE35BDD67-3.jpeg](https://qiita-image-store.s3.amazonaws.com/0/55365/31ee65f6-0481-62c1-d9ac-711766046a68.jpeg)
引用元: [バーチャルリアリティ学](https://www.amazon.co.jp/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%AA%E3%82%A2%E3%83%AA%E3%83%86%E3%82%A3%E5%AD%A6-%E8%88%98-%E6%9A%B2/dp/4904490053)

# まとめ

バランス制御は難しいですね。

[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の23日目は[第15回VR技術者認定試験（セオリーコース） 模範解答の予想](https://qiita.com/nkjzm/items/d4fd092623fbf09cd104)です
IT技術者が不足している現状についてのコンサルティングレポート

【問題】
現在、日本の情報サービス産業界ではシステム開発現場において技術者の労働環境の悪化が深刻化しており、多くの離職者が発生している。その結果、業界全体で技術者が不足している

【コンサルタントとしての見解】
システム開発会社は、会社組織の垣根を超え、全社横断的な行動を今すぐとる必要がある

【経営戦略案】
システム開発会社が現在の経営環境で生き残るために必要な施策を以下に示す

1.経営・財務部門
⑴効率的な組織運営
⑵堅実な財務体制の確保
⑶有能な現場要員や外部の有識者を経営部門へ登用する

2.人事・事業部門
⑴高いスキルを持った技術者の確保
⑵多様な人事制度と公正な人事考課の実施
⑶技術者の特性を活かした事業運営

3.企画・営業部門
⑴緻密なマーケティング戦略立案
⑵機動的な営業力の維持
⑶未開拓分野に対する積極的な情報収集

【分析】
1.職種が階層型
→技術者の職種が多様化している中で、業界の収益構造の歪みにより技術者の職種がヒエラルキー化し、その結果、開発現場にカースト制度が生まれている。

⑴会社が所属する階層に職務が固定化する
→プロジェクト管理、設計の上流工程の業務をやれるのは主契約者プロパーで下請け会社は製造、試験の下流工程の業務だけしかやれない。

⑵現場要員のスキルアップに対する意欲の低下
→技術者が情報処理に関する高度な資格を取得しても下請け会社では同じ職種しかやれない。そのため下請け会社では現場要員の仕事に対するモチベーションが暴落している。

⑶生産性の低下
→システム開発工程全体が労働集約的な事業構造になり、コストダウンが進んだ結果、高度なスキルを持った技術者の雇用が業界全体として困難であり、特に下請け会社では顕著である。そのため、スキルやリテラシーが低い要員が開発案件に参画することになりデスマーチが常態化している。

2.垂直型の収益構造
現場の開発要員が一番低い賃金で働かされる構造

⑴主契約者が一番儲かる
ITゼネコンと呼ばれる大手SIerが大規模開発案件では主契約者になることが多いため、大手SIerによる利益の寡占化が進行している

⑵逆階層型の要員構成
大規模システム開発案件における主契約者は大企業、下請けは中小企業で構成されている。

⑶利益の寡占化
商流構造がピラミッド型であるのに対して、要員構成の構造は逆ピラミッド型であるため、案件から得られる収益の取り分は主契約者が多くなり、下請けに十分な利益が回らない

3.市場構造
→技術仕様の汎用化によりシステム開発のコストが安くなった

⑴OpenSourceSoftwareの普及によりPropertieSoftwareの優位性が低下した。

⑵ERPに代表される半完成品のパッケージが増えたことにより新規開発する部分が少なくなったため、技術者の稼働が減った。

⑶システム開発工程の標準化が進んだことにより技術者が単純労働者になっている。

#コンサルティング
lucky_cliをビルドツールとして使う



この記事は Crystal Advent Calendar 2018 の21日目を埋める記事です。

Crystalのビルドツールは何をつかっていますか？

自分は、以下のような編纂をたおどり、今は[lucky_cli](https://github.com/luckyframework/lucky_cli)をビルドツールとして使用しています。
> Shell -> Makefile(Cmake) -> [※cake](https://github.com/axvm/cake) -> lucky_cli

lucky_cliはWeb frameworkである[lucky](https://luckyframework.org/)のモジュールの１つです。
簡単にluckyの特徴を説明しますと、Railsをほどよくリスペクトして、合理的な独自機能の導入、品質を意識し、Bugを極力コンパイル時に排除することに力をいれているWeb frameworkです。

### lucky frameworkの構造
lucky自体は主要な機能がモジュール単位で分割されています。lucky_cliもその１つで単体での利用も可能です。

* lucky: lucky frameworkの本体
* lucky_cli: lucky frameworkのタスクマネージャー
* lucky_record: DB、ORM
* lucky_flow: 自動ブラウザテスト、E2Eテスト
* lucky_router: URLルーティング

### 使い方
lucky_cliのインストールが完了していること前提で、まずは作成されたばかりのプロジェクトフォルダ内で、タスクファイルを作成します。

```bash

lucky_cli init
```


以下のような選択肢がでますので、 `tasks.cr`  を選択する

```bash

 Full web project, or just tasks.cr file? (web or tasks.cr)
```
これで、タスクファイルのテンプレートができあがります。

```ruby

require "lucky_cli"

# Uncomment to require your lib or app's source code
# require "./src/my_project_name"

# Uncomment this to include tasks from the tasks directory of your project
# If you have a lot of tasks, this can be cleaner than putting them in this file
# require "./tasks/**"
・
・
・
```

以下のコメントアウトを外して、カレントディレクトリに `tasks/` ディレクトリを作成します。

```
#require "./tasks/**"
```

```bash

mkdir ./tasks
```

このtasksディレクトリのなかに、tasks.crのコメントを参考にビルドファイルを作成していきます。

試しに、以下のようなtasks/build.crファイルを作成してみます。

banner macro は `lucky --help` した際のタスク説明になるので、適当に説明分を記入しておきます。タスクを定義するクラス(ここではBuild)は必ず、LuckyCli::Taskクラスを継承しないといけません。実際のビルド処理の内容は、callメソッドが実行します。それ以外は
自由に拡張できます。Buildタスクで初期化入れたい場合は、constructorが作成できます。

```ruby

class Build < LuckyCli::Task
  banner "Build Crystal program files"
  
  def call
    puts "Build success!"
  end
end
```

lucky --helpでさきほど記述した、タスクの説明(banner)が表示されるので、第３者の人にも何を行うタスクなのか伝わりやすいです。

```bash
$ lucky --help

Available tasks:

  ▸ build       Build Crystal program files

```

そして、後はコンソール上でluckyコマンドを実行するだけで、こんなに簡単にビルドツールがつくれます。

```bash

$ lucky build

Build success!
```

lucky_cliの一番のメリットは自由度の高さと、拡張性だとおもいます。たとえば、
共通の処理もあるが、タスク自体は別々にわけたい、だけどタスクファイル自体を別々にわけるほどでもないケース。
BuildクラスとFullBuildクラスを用意し継承させることで、共通機能をもたせ再利用度を高めます。

```ruby

class Build < LuckyCli::Task
  banner "Build Crystal program files"

  @app_name = "DemoApp"

  def call
    puts "Build success! #{@app_name}"
  end
end

class FullBuild < Build
  banner "Build C++/Crystal program files"

  def call
    puts "Full build success! #{@app_name}"
  end
end
```

### 自分の構成

普段自分のタスク構成はこんな感じで使っています。ビルドだけでなく他のコマンド処理も全てlucky_cliによせることで、脳内コンテキストSwitchを最小限にしています。

```bash
tasks/
├── build.cr・・・crystal build以外にも、外部ライブラリ(C/C++)とかのビルド
├── clean.cr・・・Executable binaryのclean up ./bin/*、/tmp/*の中をclean
├── run.cr・・・crytal run、 ./bin/* の実行
├── spec.cr・・・crytal spec spec、 crystal spec spec/*のspecを実行
└── tool.cr・・・crytal tool format、 ameba(code analyze)などの便利ツールの実行
```
### まとめ
* crytalで処理をかけるので自由度が高く、拡張しやすい
    * Colorize moduleをつかえば、正常終了、異常終了でターミナルにカラー表示も簡単
* 責務毎にタスクファイルをわけれるので保守性、可読性が良い
    * 巨大なMakefileのような秘伝のタレになることを防げるきがする
 

※cakeを辞めた理由・・・Cakefileという専用のテキストファイルを用意しないといけないのと、タスクを１ファイルに書かないといけず保守性も微妙に感じました。自分の書いたビルドコードとcakeのmacroでエラーになったり、、があり１ヶ月くらいで使用をやめました。
rails5 includeメソッドとSessionshelperについて

##【includeメソッドとSessionshelperについて】

logged_in?メソッドを使った時に、
**「なぜSessionsHelperで定義したlogged_in?メソッドを、UsersControllerで使えるのかな？」**という疑問が湧いたので調べてみました。

「UsersControllerはapplicationControllerを継承してるけど、SessionsHelperは継承してないから使えないんじゃないの？」と思い、UsersControllerでを見ると、

```
class UsersController < ApplicationController
```

やっぱりSessionsHelperは無い。

ですが、ApplicationControllerを見に行くと、

```
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  include SessionsHelper
```

ApplicationControllerの中に、【include SessionsHelper】と書いてある。

**「これはSessionsHelperのメソッドも使えるよう拡張していますよ」という意味。**

**だからUsersControllerでもSessionsHelperのメソッドが使えるということだった。**

「どのページでも使うようなメソッドはSessionsHelperに書くことが多いよ」と聞いたことがありましたが、その意味が理解出来ました。
【VR学まとめ】4.3.3 物体のシミュレーション

# はじめに

この記事は[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の21日目の記事です。

[バーチャルリアリティ学](https://www.amazon.co.jp/バーチャルリアリティ学-舘-暲/dp/4904490053)の4章「バーチャル世界の構成手法」の内容をまとめていきます。
書籍の方も是非ご購入いただいた上でご利用ください。

# 4 バーチャル世界の構成手法

## 4.3 シミュレーション

### 4.3.3 物体のシミュレーション

#### (1) 剛体のシミュレーション

- 剛体で事は足りることが多い
- 物体の位置や速度で決まる力は簡単
    - 重力
    - バネ
    - 動摩擦力
- 拘束力はめんどくさい

![JPEG image-73A9DCAA802D-1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/55365/64a60bc2-7691-ccbe-38f8-3ee29f4f9724.jpeg)
引用元: [バーチャルリアリティ学](https://www.amazon.co.jp/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%AA%E3%82%A2%E3%83%AA%E3%83%86%E3%82%A3%E5%AD%A6-%E8%88%98-%E6%9A%B2/dp/4904490053)

- ペナルティ法
    - 計算せずに違反の量を単純に加える
    - 計算量がO(n)
    - 収束する保証がない
- 解析法
    - 運動方程式を連立させて解く
    - O(N^3)
        - O(n)で打ち切ることもできる
        - 更新周期△tを大きくとって負荷軽減
    - ゲームの物理エンジンなどによく使われる
- 接触検出
    - 大まかに判定して枝切りしていく
        - 分割された空間毎
        - bounding volume

#### (2) 変形のシミュレーション

- 変異が微小だと弾性変形をする
    - 弾性変形や塑性変形(そせい)を経て破壊に至る
- 変形モデル
    - バネ質点モデル
        - 弾性力で物体変形を表現
    - 有限要素モデル
        - 3角形要素の集合を連立方程式を解いて表現
        - 高精度だが計算量が多い

![JPEG image-5D1331675A60-1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/55365/d296abb6-4c5f-09ae-045d-4160c7329638.jpeg)
引用元: [バーチャルリアリティ学](https://www.amazon.co.jp/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%AA%E3%82%A2%E3%83%AA%E3%83%86%E3%82%A3%E5%AD%A6-%E8%88%98-%E6%9A%B2/dp/4904490053)

- 忠実性と実時間性はトレードオフ

#### (3) 流体のシミュレーション

- ナビエ・ストークス方程式
    - 差分法
    - 速度及び圧力の分布が求められる
- 実際は形状や時間変化も考慮する必要がある

# まとめ

剛体以外は中々大変そうですね。

[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の22日目は[【VR学まとめ】4.3.4 人物のシミュレーション](https://qiita.com/nkjzm/items/01c1f2962b3ec7a704b3)です。
jsdoでblockly その11

#概要

jsdoでblocklyやってみた。
pi求めてみた。
python出力してみた。

#参考にしたページ

https://qiita.com/shin27/items/a06eb3b2cf61d47c64c0

#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/K/z/T/KzTd.jpg?t=1545434004)

#成果物

http://jsdo.it/ohisama1/KzTd

#pythonコード

```
import random
from numbers import Number

m = None
n = None
x = None
y = None


m = 1000000
n = 0
for count in range(int(m)):
  x = random.random()
  y = random.random()
  if x * x + y * y < 1:
    n = (n if isinstance(n, Number) else 0) + 1
print((n / m) * 4)
```

#paizaで実行。

https://paiza.io/projects/wdWMIPwARBvLgKAcZI5RrQ

以上。
冬休みにmicro:bitで遊ぶなら ～オススメのアクティビティ～

Qiitaでの初記事です。お手柔らかにお願いします！
Markdownでなんて書くのはじめてです。バックスラッシュ使ったのもはじめてです。笑
バックスラッシュの入力のしかたをググった34歳。
さて、教員の私が実践して、子どもたちにウケたものを紹介します。
#子どもが一瞬でハマったアクティビティ
12月8日に、TFabworksさんによるmicro:bit研修に参加させていただきました。
最後に教わったアクティビティが、子どもたちを虜にしたので、ご報告致します。
##振ってハートを飛ばす（だけ）
2学期最後のコンピュータークラブで行いました。
自分と相手のmicro:bit同士で通信を行います。
自分のmicro:bitを振ると、表示されていたハートが消える（ハートが飛んだように見える）
数字を受信するとハートが表示される（ハートが飛んできたように見える）
というだけのアクティビティなのですが、とても簡単なのに、子どもたちはmicro:bitを振り続けて笑ってます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/327531/66aa6351-0a0b-bc07-cc55-4347739a86f3.png)
[MakeCode - 振ってハートを飛ばそう](https://makecode.microbit.org/_6EWFoj3bV1Xm)
QiitaっぽくJavaScriptで置いておきましょう。

```Javascript:
input.onGesture(Gesture.Shake, function () {
    radio.sendNumber(0)
    basic.clearScreen()
})
radio.onReceivedNumber(function (receivedNumber) {
    music.beginMelody(music.builtInMelody(Melodies.PowerUp), MelodyOptions.Once)
    basic.showIcon(IconNames.Heart)
})
radio.setGroup(1)
radio.setTransmitPower(7)
basic.showIcon(IconNames.Heart)
basic.forever(function () {
	
})
```
はい。
##こうしたい！発生
さて。ここで問題が発生します。
どういうことかと言えば、子どもたちは特定の相手と通信することを楽しみたいようで、要らんメッセージは受け取りたくないと。
ということで、第1次改良策。
送信チャンネルを子どもたち同士で話し合って設定。
先ほどの中身で言うと、この行です。

```JavaScript:
radio.setGroup(1)
radio.setTransmitPower(7)
```
`radio.setGrpup(1)`が送信チャンネルの設定なので、0から255までの好きな数字に変えさせます。
さすがに子どもたちはJavaScriptのエディタで操作しません。MakeCodeのブロックモードでも柔軟に変えられます。素敵です。
`radio.setTransmitPower(7)`は、送信強度の設定なのですが、研修では1がオススメされていました。7にすると教室くらいなら端から端まで普通に届くみたいです。チャンネルを統一して取り組むときは1にするのが無難な気がします。
##こうしたい！発生（2回目）
誰からメッセージが来たのか、知りたい！とのこと。
確かに、受信したら表示されるアイコンも、自分でプログラミングしてますからね。
相手によって柔軟に変える方法については（もちろん出来ますけど）、子どもたちはすぐには思いつきません。
じゃあ根本的に変えてしまいましょう。
送信する内容を、番号ではなく、文字列にしてしまいましょう。
そして、変数に入っているその文字列を表示させれば、良いはずです。
こんな感じに。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/327531/a96e583d-1e04-0e15-6f1e-3dee02be6cac.png)
[MakeCode - 振って文字を飛ばそう](https://makecode.microbit.org/_WVKXVkL4M51p)

```JavaScript
input.onGesture(Gesture.Shake, function () {
    radio.sendString("I love you.")
    basic.clearScreen()
    basic.pause(10000)
    basic.showIcon(IconNames.Heart)
})
radio.onReceivedString(function (receivedString) {
    music.beginMelody(music.builtInMelody(Melodies.PowerUp), MelodyOptions.Once)
    basic.showString(receivedString)
    basic.pause(1000)
    basic.showIcon(IconNames.Heart)
})
radio.setGroup(1)
radio.setTransmitPower(7)
basic.showIcon(IconNames.Heart)
```
これで文字列を自由に入れ替えて遊べるようになりました。
一時停止は、振りすぎて送りすぎるので休憩時間です。
こうなるともう、子どもたちの遊び場です。
文字列に何を入れるか。送信側で制御が出来るので、ローマ字での送り合いが始まります。
「ユー・エヌ・ケー・オー？（UNKO）って送ったの誰だよー！」
（苦笑）
micro:bitは（何もしなければ）日本語の文字列は送れませんので、子どもたちはローマ字を駆使しようと必死になります。得てしてローマ字の学習を勝手にやっている状態。
送るためにもローマ字が必要だし、送られたものを読むためにもローマ字が必要。
あら。これって、ローマ字の学習で使えるじゃないか。
あ、すみません、書きながら今、ローマ字の学習にmicro:bit使ったらいいじゃんと思いつきました。笑
##試行錯誤・改造・創意工夫の余地をあげること
子どもたちはこうやって、少し余白のある状態で渡してあげると、好きに遊び始めます。
でも、遊んでいるように見えて、頭はフル回転。何でも吸収していきます。
この前のクラブでも、「先生、サッカー盤の得点表示をmicro:bitにさせたいんだけど…」って相談され、「どうやってカウントするの？（工作的に）」と聞いたら、「P0に電流が流れたときにカウントしたい。（プログラムの中身的に）」と返答されました。どうやら、工作の素案はとっくに出来ているようです。
私はP0がタッチされたら変数に1を足していくプログラムを教えるだけで用済みに。
（本当はここも考えさせれば良いのかも知れませんが）
###まとまっていないけどまとめ
こんな感じで、子どもたちは楽しみながら学習します。
初回は楽しいアクティビティをして虜にしちゃいましょう。
あなたなら、どんなメッセージを送りますか？
【VR学まとめ】4.3.2 空間のシミュレーション

# はじめに

この記事は[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の20日目の記事です。

[バーチャルリアリティ学](https://www.amazon.co.jp/バーチャルリアリティ学-舘-暲/dp/4904490053)の4章「バーチャル世界の構成手法」の内容をまとめていきます。
書籍の方も是非ご購入いただいた上でご利用ください。

# 4 バーチャル世界の構成手法

## 4.3 シミュレーション

### 4.3.1 シミュレーションのためのモデル

- モデルが巨大化すると計算負荷も増大する
- 剛体
    - 位置・向き
    - 速度、角速度
    - 形状
- 柔軟物
    - 剛体に加え、変形情報が必要
    - 計算負荷が大きい
    - 水や空気はもっと大きい

### 4.3.2 空間のシミュレーション

#### (1)  座標・移動モデル

- ユークリッド座標と姿勢(ロール、ピッチ、ヨー)で表現される
- フライトスルー
    - 鳥瞰的視点が重要な場合
- ウォークスルー
    - 都市景観シミュレーション
    - 障害物との衝突などはユースケースに依る
    - 衝突判定にはbounding volumeなどが用いられる(4.3.3参照)

#### (2) 広い範囲の移動、時間遅れ、ハンドリング

- 広大な空間を描画するのは無理なので空間を区切る
    - グリッドベースが簡単
- Level Of Detail (LOD)
    - 遠くからでも見える場合に有用
    - 遠くのものは精密さを落とす

![JPEG image-9BCED788A5BF-1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/55365/5271a28b-49ec-45dd-106a-41218724e448.jpeg)
引用元: [バーチャルリアリティ学](https://www.amazon.co.jp/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%AA%E3%82%A2%E3%83%AA%E3%83%86%E3%82%A3%E5%AD%A6-%E8%88%98-%E6%9A%B2/dp/4904490053)

- scene graph
    - オブジェクトをツリー構造で表現
    - 効率的な管理やレンダリングの取捨選択に用いられる
    - LODも1つのnode

![JPEG image-9BCED788A5BF-2.jpeg](https://qiita-image-store.s3.amazonaws.com/0/55365/e40de468-0667-2484-d5cf-9fa3a61a5a1a.jpeg)
引用元: [バーチャルリアリティ学](https://www.amazon.co.jp/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%AA%E3%82%A2%E3%83%AA%E3%83%86%E3%82%A3%E5%AD%A6-%E8%88%98-%E6%9A%B2/dp/4904490053)

- バーチャル世界の構築
    - CADや3DCGソフトが用いられる
    - カメラやセンサーから再現する手法も


# まとめ

[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の21日目は[【VR学まとめ】4.3.3 物体のシミュレーション](https://qiita.com/nkjzm/items/8c2cf43f19ee845b9964)です。
[python]GoogleCloudShellでcommandnotfoundばかり、奮闘記

#[python]GoogleCloudShellでcommandnotfoundばかり、奮闘記
![Screenshot 2018-12-22 at 06.59.41.png](https://qiita-image-store.s3.amazonaws.com/0/255049/3e19b4ef-8a5b-5f4f-b4ad-00f1122fa56f.png)

見ていただくとわかるかもしれませんが、やりたかったのは
beautifulsoup4を使用してのwebスクレイピングです
ただ
・from bs4もだめ
・from urllibもだめ
・requestsもimportできない（せっかくインストールしたのに、、
・...
八方塞がりです。とにかく仕入れた情報がパーツすぎ（バラバラすぎ）て、自分でも何やっているかよくわかっていません
※当方pythonを開始して5時間目の赤ちゃんなので、長い目で見守ってあげてください。

##18.12.22朝
###とりあえず今認識しているのは
・GoogleCloudShellを使っている
・pythonは3.6.5がインストールされている
・pipもヴァージョンアップした
![Screenshot 2018-12-22 at 07.07.01.png](https://qiita-image-store.s3.amazonaws.com/0/255049/6e275e10-8f01-2ae5-1b53-c8f55adede0d.png)
・仮想環境にBeautiful Soupをインストールされている
###このあとは
####参考にさせていただいています
https://qiita.com/ktgwaaa/items/6d1f54d5ff3c4559f96c
https://qiita.com/liston/items/896c49d46585e32ff7b1
https://www.htmllifehack.xyz/entry/2017/10/07/010341
https://qiita.com/matsu0228/items/edf7dbba9b0b0246ef8f

##つづく、、
インメモリDB　VoltDBでプロシージャの実行計画を出力する

# はじめに

VoltDBの実行計画を出力してみます。
VoltDBの実行計画の出力方法は、以下の3つがあります。

- sqlcmdのexplainまたはexplainprocディレクティブを使用する。
- `@Explain`または`@ExplainProc`システムプロシージャーを呼び出す。
- VoltDB Management Centerの「スキーマ」タブで確認する。

Voterサンプルアプリケーションを用いて、それぞれの実行方法を説明します。


# sqlcmdのexplainまたはexplainprocディレクティブを使用する。

explainprocディレクティブで、ストアドプロシージャの実行計画を表示する場合

```
$ sqlcmd
SQL Command :: localhost:21212
> explainproc Vote;
STATEMENT_NAME       SQL_STATEMENT                   EXECUTION_PLAN                 
-------------------- ------------------------------- -------------------------------
checkContestantStmt  SELECT contestant_number FROM contestants WHERE contestant_number = ?; RETURN RESULTS TO STORED PROCEDURE
 INDEX SCAN of "CONTESTANTS" using its primary key index
  uniquely match (CONTESTANT_NUMBER = ?0)

checkStateStmt       SELECT state FROM area_code_state WHERE area_code = ?; RETURN RESULTS TO STORED PROCEDURE
 INDEX SCAN of "AREA_CODE_STATE" using its primary key index
  uniquely match (AREA_CODE = ?0)

checkVoterStmt       SELECT num_votes FROM v_votes_by_phone_number WHERE phone_number = ?; RETURN RESULTS TO STORED PROCEDURE
 INDEX SCAN of "V_VOTES_BY_PHONE_NUMBER" using its primary key index
  uniquely match (PHONE_NUMBER = ?0)

insertVoteStmt       INSERT INTO votes (phone_number, state, contestant_number) VALUES (?, ?, ?); INSERT into "VOTES"
 MATERIALIZE TUPLE from parameters and/or literals


(Returned 4 rows in 0.00s)
```

explainディレクティブでSQLを指定して実行する場合

```
> explain SELECT contestant_number FROM contestants WHERE contestant_number = ?;
EXECUTION_PLAN                 
-------------------------------
RETURN RESULTS TO STORED PROCEDURE
 INDEX SCAN of "CONTESTANTS" using its primary key index
  uniquely match (CONTESTANT_NUMBER = ?0)


(Returned 1 rows in 0.01s)
```


# `@Explain`または`@ExplainProc`システムプロシージャーを呼び出す。

sqlcmdのexplainまたはexplainprocディレクティブを使用する場合とほぼ同様です。
実行計画は同じなので省略。

```
$ sqlcmd
> exec @ExplainProc Vote
> exec @Explain 'SELECT contestant_number FROM contestants WHERE contestant_number = ?';
```

# VoltDB Management Center（Web管理コンソール）の「スキーマ」タブで確認する。

Web管理コンソールのURLは以下になります。

　http://[VoltDBサーバのIPアドレス]:8080

Schemaタブの「Procedures & SQL」を選択すると、「Statement SQL」に実行計画が表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/70b70ef8-f3a7-4d39-bc92-abb6409ae157.png)
※ハードコピーの取得に失敗して表示されていなかった。本当はSELECT文の下に実行計画が表示されます（後で修正します）
【VR学まとめ】4.2.4 力触覚レンダリングとモデル

# はじめに

この記事は[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の19日目の記事です。

[バーチャルリアリティ学](https://www.amazon.co.jp/バーチャルリアリティ学-舘-暲/dp/4904490053)の4章「バーチャル世界の構成手法」の内容をまとめていきます。
書籍の方も是非ご購入いただいた上でご利用ください。

# 4 バーチャル世界の構成手法

## 4.2 レンダリング

### 4.2.4 力触覚レンダリングとモデル

- 物体の形状、硬さ、粗さ、重さなどの属性を表現する
- 感覚と運動が双方向に影響を及ぼす
- インタラクションにおける流れ
    - 力覚ポインタ(指先などの接触点)の位置と方向の検出
    - 力覚ポインタと物体の接触検出
    - 反力計算、物体変形
    - 力およびトルクの提示
- 1kHz以上が必要
    - 視覚よりも時間分解能が高いため
    - 視覚と別スレッドで動作させる必要あり

#### (1) 干渉計算とモデル

-　インピーダンス提示型
    -　侵入距離に応じて押し戻す力を操作者に返す
    -　力覚ポインタと物体業免状のポインタを提示して侵入距離を算出する)
-　道具を介するとトルク計算が必要になる場合も
-　プリミティブな形状は計算しやすいが汎用的でない
-　多面体は境界が不連続なので補間などが必要
    -　視覚レンダリングの輝度計算などでも用いられる

![JPEG image-A4DF86144F4B-1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/55365/3dd18d53-ee51-d62f-0f61-e1c443896a61.jpeg)
引用元: [バーチャルリアリティ学](https://www.amazon.co.jp/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%AA%E3%82%A2%E3%83%AA%E3%83%86%E3%82%A3%E5%AD%A6-%E8%88%98-%E6%9A%B2/dp/4904490053)


#### (2) 表面情報のレンダリング

- 摩擦力
    - なぞり方向と反対方向
    - クーロン摩擦でシミュレート可能
- テクスチャ勾配のシミュレート
- スティックスリップ現象
    - 固着と滑りが繰り返し発声する振動現象
    - 黒板にチョークを使う時など

#### (3) 現実感を高めるレンダリング

- 人間の感覚特性やハードウェア、計算コストを考慮した上で利用する必要がある
- 接触の際の振動で材質感を知覚している
    - 振動の記録でより高い材質感の提示も可能

# まとめ

表面ポインタを置くアプローチが面白いと思いました。

[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の20日目は[【VR学まとめ】4.3.2 空間のシミュレーション](https://qiita.com/nkjzm/items/ed83fd7c87270d92a171)です。
あえて自腹でAWSで安価にWebサイトをたててみた(その2兼最終話)

★2018年12月5日に投降した [あえて自腹でAWSで安価にWebサイトをたててみた(その1)](https://qiita.com/S_Katz/items/6324c25da6199adc5162) の続きです。

# 前回までのおさらい
詳細は[前回記事](https://qiita.com/S_Katz/items/6324c25da6199adc5162)をご参照ください。

## 構成イメージ
![kousei-image.png](https://qiita-image-store.s3.amazonaws.com/0/316764/31e0d436-4994-2d71-1511-22b0f5f42ed6.png)

## 配信コンテンツ区分
全て静的コンテンツ(=HTML、CSS、フロントJavaScriptのみ)です。単純な情報アウトプットのみで、問い合わせフォームも設置していません。

## 実装する内容
- オリジナルドメインを取得します。
- HTTPSで配信します。もちろんSSL証明書もきちんと入れます。
- DNSはAWSに新たに構築します。

## 利用したAWSサービス
- Amazon S3
- Amazon CloudFront
- AWS Certificate Manager
- Amazon Route53

# で、結局いくらかかってるのさ？
2018年12月1日～2018年12月21日までの実績ベースですが次のとおりです。利用したサービス別に示します(AWSの利用料は1米ドル=115円換算で消費税相当額(8%)込みとなります)。

| サービス名|初期費用(円)|ランニングコスト(円)|
|:------------------|------------------:|-------------------:|
| Amazon S3         |                 0 |                  0 |
| Amazon CloudFront |                 0 |       0       |
| AWS Certificate Manager |              0 |        0        |
| Amazon Route53    |                0 |         62         |
| AWS通信トラフィック従量 |             0 |       0       |
| お名前.com        |           325 |      0       |
| 合計 | 325 | 62 |

【AWSの請求ダッシュボード】
![AWS請求書.png](https://qiita-image-store.s3.amazonaws.com/0/316764/a4405d01-ca37-33ab-e96c-7d40f68e3083.png)

【お名前.com】
![お名前.com.png](https://qiita-image-store.s3.amazonaws.com/0/316764/e126f7b0-c53d-3f01-554a-2205672b0469.png)

今回はお試しということで拡散もとくにしていなかったためアクセス数はさんざんたるものですが、AWSのランニングコスト、本当に安いですよね！ お名前.comの初期費用にはドメイン初年1年分の1円/年を含みますが、こちらも[「シンカンセンスゴイカタイアイス」](https://item.rakuten.co.jp/maruhiro-dep/sice01/?s-id=step0_pc_itemname)を1回我慢する程度です。
DNSを自由に触れて独自ドメインのSSLも使えて、しかもサービスはフルマネジメントで基本はおまかせ！
今回は利用しませんでしたが、問い合わせフォームをつけるなら上記サービスに Lambda、SNS、SES、DynamoDBあたりのフルマネジメントサービスを、ユーザ認証機能をつけたいのであればCognito (こちらもフルマネジメントサービス)あたりを追加利用すればよく、こちらも今回の規模であれば、今回利用のサービスを含めてもワンコイン(100円?、最近は500円が相場でしょうか)程度のランニングコストで行けると思います。
ちょっとしたアイデアを形にするのにはすごく敷居が低いと思います。気になったらまずは気軽にトライできるのがAWSをはじめとするクラウドサービスの強みですね。

# 最後に
技術の習得が大切であるのは普段から痛感してはいるものの、お客様提案などではコストも重要なポイントとなりますので、こちらも普段からキャッチアップしなきゃと思いなおしました。

\# サーバに触ってシェルをごにょごにょするのは嫌いではないのですが、サーバのお守りは極力やりたくない・・・ので、**フルマネジメントサービスばんざい！**なのです。
【VR学まとめ】4.2.3 聴覚レンダリングとモデル

# はじめに

この記事は[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の18日目の記事です。

[バーチャルリアリティ学](https://www.amazon.co.jp/バーチャルリアリティ学-舘-暲/dp/4904490053)の4章「バーチャル世界の構成手法」の内容をまとめていきます。
書籍の方も是非ご購入いただいた上でご利用ください。

# 4 バーチャル世界の構成手法

## 4.2 レンダリング

### 4.2.3 聴覚レンダリングとモデル

#### (1) 3次元音空間の聴覚レンダリングモデル

- 両耳の2入力から3次元音空間を知覚
- 広帯域音を音空間全域に渡り高精度でレンダリングするのは現段階で不可能
- 聴覚ディスプレイで用いるモデル
    - 音場再現モデル
        - 音場全体を再現するモデル
        - 立体分割法
        - 音場直接合成法
    - 両耳間伝達関数モデル
        - 音源からそれぞれの耳まで音を計算
        - 音像定位伝達関数合成法
        - 両耳型聴覚ディスプレイ

#### (2) 音響物理現象のレンダリングモデル

- 音場直接合成法や音像定位伝達関数合成法では伝達関数を用いる
    - 室伝達関数 (RTF)
    - 頭部伝達関数(HRTF)
- 音響物理現象を伝達関数の形で表現する
    - 伝達遅延
    - 減衰
    - 反射
    - 回折

![JPEG image-73D0F7290EA7-1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/55365/f8af355f-f78c-b8ce-4087-725e4ad9d807.jpeg)
引用元: [バーチャルリアリティ学](https://www.amazon.co.jp/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%AA%E3%82%A2%E3%83%AA%E3%83%86%E3%82%A3%E5%AD%A6-%E8%88%98-%E6%9A%B2/dp/4904490053)

- 距離減衰と遅延
    - 直接音に対し距離に応じた減衰と遅延を加える
    - 高周波数では空気吸収が結構あるので考慮する
- 反射波
    - 幾何音響理論
        - 音線法
            - 音源から放射された音線を追跡して時間範囲内の音線を計算
            - 反射音の次数によらず計算量が一定
            - ある時刻、ある点の音を求めることができないため不向き
        - 虚像法
            - 反射面の無効に虚像を定義して、反射の次数を決めて計算
            - 次数に対して指数関数的に計算量が増加する
        - 音の波動性は考慮されていない
            - 低周波数の精度が低い
            - 小さな反射面では拡散を考慮する工夫なども
- 後部残響音
    - 時間経過に伴い反射波の密度が上昇するため波面は方向性が弱まる
    - 丁寧な取扱は大きな手間がかかり、効果も少ない
- 回折
    - 人の気配などをレンダリングするために必要
    - 解析解を使い物体の端線毎に信号処理を行う
    - 低周波数で起こる低域通過型の現象
- ドプラ効果
    - 音源か聴取点が移動する場合に必要
    - 通常の信号処理は線形時不変を仮定しているため工夫が必要
    - 直接法
        - 移動速度に応じて周波集を直接シフトさせる
        - 汎用性に難あり
    - バーチャルな音伝搬路を設ける方法
        - 遅延線の形で設け相対速度に応じて読み込みポインタを移動させる、など

#### (3) 聴覚ディスプレイの将来像

- DSPチップなどハードウェア的に行うことも可能
- PCミドルウェアとしてパッケージ化すると低コストで利用可能に
- 境界要素法(BEM)は数値解析法に酔って波動性も考慮した総合的な形
- 音場全体の空気粒子のふるまいとして高速計算する検討も進んでいる

# まとめ

音には時間差があるため、視覚レンダリングと違い計算が複雑になる場合があると思いました。

[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の19日目は[【VR学まとめ】4.2.4 力触覚レンダリングとモデル](https://qiita.com/nkjzm/items/89186ed21bd89310e71b)です。
高速RDB VoltDBのサンプルアプリケーションを動かしてみる

# はじめに

超高速RDB VoltDBのサンプルアプリケーションを動かしてみます。

環境は以下の記事で構築した、v8.3.1を用います。

- [インメモリデータベース　VoltDBの最新バージョン（v8.3.1）をインストールする（シングル構成）](https://qiita.com/mkyz08/items/47fa33cd715178a50df3)


# 超高速RDB VoltDBのサンプルアプリケーションを動かしてみる

投票のサンプルアプリケーションを動かしてみます。

まず、スキーマが空のVoltDBノードを起動します。

```bash
# voltdb create --force
```

サンプルアプリケーションはVoltDBのインストールディレクトリ（今回は/opt/voltdb）のexampleディレクトリ以下にあります。
そのうちの１つ、voterアプリケーションを動かしてみます。
まず、以下のようにDDLを読み込みスキーマを作成します。

```
# cd /opt/voltdb/examples/voter
# sqlcmd < ddl.sql
```

以下のコマンドで実行します。実行すると、投票アプリのクライアントが動き、スループットがコンソールに出力されます。

```
# ./run.sh client

～省略～

--------------------------------------------------------------------------------
 Starting Benchmark
--------------------------------------------------------------------------------

Warming up...

Running benchmark...
00:00:05 Throughput 38590/s, Aborts/Failures 0/0
00:00:10 Throughput 45848/s, Aborts/Failures 0/0
00:00:15 Throughput 51128/s, Aborts/Failures 0/0
00:00:20 Throughput 51626/s, Aborts/Failures 0/0

```

Web管理コンソールで確認すると、VOTESテーブル等に約5百万レコードが挿入されていますね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/53eeb8b0-ad63-703d-a379-1468da1b1ece.png)

アプリケーションの詳細は、example以下にソースがあるので確認してください。
VirtualBox上のVMで秒間5万トランザクション/秒もでているのが驚愕。
【VR学まとめ】4.2.2 視覚レンダリングとモデル

# はじめに

この記事は[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の17日目の記事です。

[バーチャルリアリティ学](https://www.amazon.co.jp/バーチャルリアリティ学-舘-暲/dp/4904490053)の4章「バーチャル世界の構成手法」の内容をまとめていきます。
書籍の方も是非ご購入いただいた上でご利用ください。

# 4 バーチャル世界の構成手法

## 4.2 レンダリング

### 4.2.1 レンダリングのためのモデル

体験者の位置や姿勢、バーチャル世界の変化に応じてレンダリングする必要がある。

### 4.2.2 視覚レンダリングとモデル

以下の3つの処理からなる

#### (1) 投影処理

![JPEG image-FCBB93589FF1-1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/55365/624f9a0b-4aad-8684-7713-5fd2f23e1d73.jpeg)
引用元: [バーチャルリアリティ学](https://www.amazon.co.jp/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%AA%E3%82%A2%E3%83%AA%E3%83%86%E3%82%A3%E5%AD%A6-%E8%88%98-%E6%9A%B2/dp/4904490053)

- 視点座標系に変換
- 投影処理によりスクリーン上の座標を求める
    - 透視投影
        - z_sが0の時の(x_s, y_s)が当英語のスクリーン座標
        - z_sはZ値と呼ばれ、Zバッファ法などに使われる

<img width="374" alt="スクリーンショット 2018-12-22 5.59.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/55365/bfb7161b-dcda-4cfc-4715-c63c356329ea.png">

#### (2) 陰影消去

![JPEG image-4C64173E7A83-1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/55365/27db8aa9-a1d5-6ba9-3846-70f48e064d3b.jpeg)
引用元: [バーチャルリアリティ学](https://www.amazon.co.jp/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%AA%E3%82%A2%E3%83%AA%E3%83%86%E3%82%A3%E5%AD%A6-%E8%88%98-%E6%9A%B2/dp/4904490053)

- Zバッファ法
    - スクリーンと同じサイズ
    - 大きな値で初期化
    - Zバッファが書き込まれている数値より小さかったら描画しZバッファを更新する

#### (3) 輝度計算

- シェーディング (shading)
    - 物体表面の材質や輝度
- シャドウイング (shadowing)
    - 他の物体に落とす影
- シェーディングの代表的なモデル
    - Iは物体表面の輝度
    - 右辺は環境光成分、拡散反射光成分、鏡面反射光成分

<img width="378" alt="スクリーンショット 2018-12-22 6.01.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/55365/ac2bc16d-8084-8764-648c-3c1ec7fb1008.png">

- シャドウイング計算
    - 計算点から光源が可視かどうかで判定
    - 一般に負荷が高い
    - 点光源や平行光源のような単純なものはZバッファを用いて高速計算可能
        - 光源位置に仮想と視点を配置しZバッファを生成しておく(シャドウマップ)
        - 各点の描画時にシャドウマップを参照する

![JPEG image-4C64173E7A83-2.jpeg](https://qiita-image-store.s3.amazonaws.com/0/55365/bcc463ad-7a3f-517e-56b1-e21fcfccd1b1.jpeg)
引用元: [バーチャルリアリティ学](https://www.amazon.co.jp/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%AA%E3%82%A2%E3%83%AA%E3%83%86%E3%82%A3%E5%AD%A6-%E8%88%98-%E6%9A%B2/dp/4904490053)

# まとめ

視覚レンダリングの基本的な流れを理解できました。

[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の18日目は[【VR学まとめ】4.2.3 聴覚レンダリングとモデル](https://qiita.com/nkjzm/items/5ae01203c0f93baa9c13)です。
【VR学まとめ】4.1 総論

# はじめに

この記事は[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の16日目の記事です。

[バーチャルリアリティ学](https://www.amazon.co.jp/バーチャルリアリティ学-舘-暲/dp/4904490053)の4章「バーチャル世界の構成手法」の内容をまとめていきます。
書籍の方も是非ご購入いただいた上でご利用ください。

# 4 バーチャル世界の構成手法

## 4.1 総論

### 4.1.1 バーチャルリアリティのためのモデリング

- モデル
    - 物のある性質、側面、一つの見方を表現したもの
    - 力学モデルの例
        - 質量や跳ね返り係数は含まれる
        - 色、匂いの情報は捨てられる
- バーチャル世界
    - 実世界と同等な体験を再現
    - 知覚可能な情報のみをモデル化して提示すれば良い(可視光など)
- 目的・用途によってモデリングを絞ることも可能

### 4.1.2 レンダリング、シミュレーションとモデル

- レンダリング
    - バーチャル情報をディスプレイで提示できる形に変換する処理
- シミュレーション
    - 物理法則や科学法則などを用いてモデルを変化させること

### 4.1.3 処理量とデータ量とトレードオフ

- レンダリングにおいて、事前計算しておくとデータ量は増すが処理量が減る
    - 事前の作り込みが必要
    - リアルタイムに計算すると表現できることが減る
- シミュレーションでも同じことが言える(物理演算など)

![JPEG image-435CB5D69130-1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/55365/b549ab55-21d3-38ff-5f4f-8ca1eb267da1.jpeg)
引用元: [バーチャルリアリティ学](https://www.amazon.co.jp/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%AA%E3%82%A2%E3%83%AA%E3%83%86%E3%82%A3%E5%AD%A6-%E8%88%98-%E6%9A%B2/dp/4904490053)

# まとめ

3Dモデルだけでない広義のモデルの概念を理解することが出来ました。

[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の17日目は[【VR学まとめ】4.2.2 視覚レンダリングとモデル](https://qiita.com/nkjzm/items/29bb8495ed25cc2e6212)です。
DjangoのCustom ManagerとCustom QuerySetについて

## はじめに
この記事は、[Django Advent Calendar 2018](https://qiita.com/advent-calendar/2018/django) 21日目の記事です。

## 話すこと

全然たいしたことじゃないですけどtipsとして、最近気に入ってるカスタムManagerの書き方を紹介します。

## Manager.from_queryset

「Managerで定義したメソッドをQuerySetとしても使いたい(逆のパターンも然り)」といったユースケースけっこうあると思います。そんなときに、`Manager.from_queryset`を使ってManagerを生成するとシンプルに実装できておすすめです。

公式ドキュメント: https://docs.djangoproject.com/en/2.1/topics/db/managers/#from-queryset

> you might want both a custom Manager and a custom QuerySet. You can do that by calling Manager.from_queryset() which returns a subclass of your base Manager with a copy of the custom QuerySet methods:


`Manager.from_queryset`を呼び出すことで、カスタムQuerySetのメソッドを備えているManagerのサブクラスを取得できるよって書いてます。

実際にコードに落とし込んで見てみましょう。

```python
class Todo(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField(blank=True, default='')
    assignee = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, on_delete=models.SET_NULL)
    start = models.DateField(null=True, blank=True)
    end = models.DateField(null=True, blank=True)
    is_active = models.BooleanField(default=True)
```

このようなTodoモデルを用意します。ここでアクティブなTodoだけ(`is_active=True`)を取得したいという要望がでてきたとしましょう。さっそく`Manager.from_queryset`を使って追加実装してみます。

```python
class TodoQuerySet(models.QuerySet):
    def filter_active(self):
        return self.filter(is_active=True)


class TodoQueryManager(
        models.Manager.from_queryset(TodoQuerySet)):
    pass


class Todo(models.Model):
    objects = TodoQueryManager()

    name = models.CharField(max_length=100)
    description = models.TextField(blank=True, default='')
    assignee = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='todos', blank=True, null=True, on_delete=models.SET_NULL)
    start = models.DateField(null=True, blank=True)
    end = models.DateField(null=True, blank=True)
    is_active = models.BooleanField(default=True)
```

これで以下のようにManager, QuerySet両方で、アクティブなTodoを取得する`filter_active()`メソッドを使うことができるようになります。

* `Todo.objects.filter_active()`
* `user.todos.filter_active()`

同じ実装を2回しないで済むので、シンプルでいいですね。

## 終わりに

このやり方は、[TakesxiSximada](https://twitter.com/TakesxiSximada)に教えてもらいました 。ありがとうございます :pray:
それでは メリークリスマス :christmas_tree:
Go1.10と1.11は独自型で値を制限できないから気をつけて


昨日、バグを踏んでしまったので記事にしておきます。アドベントカレンダー空いてたし。
Twitterにも以下のようにアップしています。

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/golang?src=hash&amp;ref_src=twsrc%5Etfw">#golang</a> で独自型作って値制御するやつやってたらきかなかったので、調べてたら1.10から発生してるtype alias周りのバグらしい。もう直して入るんだけど、リリースされるのは1.12みたい<br>あぁ〜、バグ踏んだぁ(´・ω・`) <a href="https://t.co/BrqbFWB3T9">https://t.co/BrqbFWB3T9</a><br> <a href="https://t.co/goaBEtg71L">https://t.co/goaBEtg71L</a></p>&mdash; Y.Komatsu (@yusuke_k0matsu) <a href="https://twitter.com/yusuke_k0matsu/status/1076077649968037888?ref_src=twsrc%5Etfw">December 21, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# きちんと説明してみる

例えば以下のような処理があるとします。

```golang
package main

import "fmt"

type MyString string

const (
	YES      MyString = "yes"
	NO                = "no"
	DONTKNOW          = "i dont know"
)

func foo(arg MyString) {
	fmt.Println(arg)
}

func main() {
	foo(YES) //success, prints "yes"

	foo("jop") //fails to compile
}
```
https://t.co/goaBEtg71L

`MyString`　は独自型です。取りうる値は、`YES`, `NO`, `DONTKNOW`の3種類です。
fooの引数は`MyString`なので、`YES`は正常に動きますが、`jop` はただのstringなのでコンパイルエラーを起こします。
これが正しい処理で、いままでもそのように動いていました。
この処理が正しく動いてる環境においては、独自型で取りうる値を制御できるので、引数の値をバリデーションする処理は不要です。

ですが、 `1.10` もしくは `1.11` を動かすと以下のような結果になります。

```bash
yes
jop
```

jopが返ってきてしまっています。これは正しくありませんね。

もう一つ似たような処理を書きます。

```golang
package main

import "fmt"

type MyString = string

const (
	YES      MyString = "yes"
	NO                = "no"
	DONTKNOW          = "i dont know"
)

func foo(arg MyString) {
	fmt.Println(arg)
}

func main() {
	foo(YES) //success, prints "yes"

	foo("jop") //success, prints "jop"
}
```
https://play.golang.org/p/ah5qyFnoot_L

型指定のところが `type MyString string` だったところが、 `type MyString = string` になっています。
とても似ていますが、これはGo 1.9で導入された。 `Type Alias` と呼ばれる処理で、`MyString`は`string`と同じ型として扱われます。
こちらに関しては、詳しく書かれている方がいるのでそちらを参照してください。

go言語1.9で追加予定の新機能 型エイリアス
https://qiita.com/weloan/items/8abbb4003cfa1031a9e9

こちらは、`MyString`は`string`と同等ですので結果は

```bash
yes
jop
```

で、これが正しい結果です。

Goのリポジトリにもissueとしてあがっていますが、この`Type Alias`が問題を引き起こしているようです。
https://github.com/golang/go/issues/26390

問題はすでに修正済みで`1.11`のマイルストーンとして解決しているようです。
ですが、このようにも記載されていました

> the real fix is slated for 1.12
>  -- 実際の修正は1.12に予定されています

1.12.1 では、直ってなさそうです

## 結論

`1.10`及び`1.11`では独自型で値の制限はかけられません。
値を制限したい場合はバリデーション処理を独自に作ってください。