OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon Linux (DNSキャッシュサーバー構築-BIND)  

![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/55db69d4-d094-4e7b-a89f-2fa6117f795c.png)


**DNSキャッシュサーバー**
「フルサービスリゾルバ」のこと。
つまり
他のDNSサーバさんに答えを教えてもらいに行くDNSサーバさんのこと
であり
IPアドレスとドメイン名の紐付けに関して、まず自身のキャッシュを参照して探し、それでも分からなければ他のDNSサーバに問い合わせを行うDNSサーバのことです。

はあ、、

とりあえずやってみよう。

---
###1.bindをインストールする###
`yum install -y bind`
![スクリーンショット 2018-11-13 19.35.21.png](https://qiita-image-store.s3.amazonaws.com/0/280929/98247917-86d0-1213-5f09-a051d036b270.png)


###2.named.confを編集する###
**named.conf**:BIND自体の基本設定ファイル
`vim /etc/named.conf`
listen-on port 53 { 127.0.0.1; }; から listen-on port 53 { 127.0.0.1; any; }; へ変更
allow-query { localhost; }; から allow-query { localhost; any; }; へ変更
![スクリーンショット 2018-11-13 19.40.21.png](https://qiita-image-store.s3.amazonaws.com/0/280929/1e1692a1-26d6-37bc-b463-bf952f9a9e85.png)

BINDの設定をチェックする。
`named-checkconf /etc/named.conf`


###3.ifcfg-eth0を編集する###
![スクリーンショット 2018-11-13 19.50.26.png](https://qiita-image-store.s3.amazonaws.com/0/280929/673d4c47-f136-c89f-6804-777b43d764cf.png)

`vim /etc/sysconfig/network-scripts/ifcfg-eth0`
DNS=(プライベートIP)　追加
![スクリーンショット 2018-11-13 19.49.03.png](https://qiita-image-store.s3.amazonaws.com/0/280929/48437ae7-31e4-6beb-055e-afac99a75e96.png)


###4.resolv.confを編集する###
`vim /etc/resolv.conf`
![スクリーンショット 2018-11-13 19.51.53.png](https://qiita-image-store.s3.amazonaws.com/0/280929/b706089b-bbb2-6c86-da90-fadd0c66fb93.png)

nameserver を自身の(プライベートIP)にする。
![スクリーンショット 2018-11-13 19.53.39.png](https://qiita-image-store.s3.amazonaws.com/0/280929/7f690777-d4e8-5f13-b0a1-7f7cf6867849.png)


###5.サービスを起動させる###
`service named start`
![スクリーンショット 2018-11-13 19.55.22.png](https://qiita-image-store.s3.amazonaws.com/0/280929/774d52a7-b2bb-0f91-7d45-e31e4412dcef.png)


###6.検証する###
![スクリーンショット 2018-11-13 20.04.25.png](https://qiita-image-store.s3.amazonaws.com/0/280929/e52f4f0d-69a7-02bd-89e7-a687b5dc8844.png)

あれ？

あ、セキュリティグループで53番port開けてなかった。
![スクリーンショット 2018-11-13 20.07.50.png](https://qiita-image-store.s3.amazonaws.com/0/280929/10c71728-84c7-c73f-fdd7-57e15d0678ec.png)

いけた！
![スクリーンショット 2018-11-13 20.09.03.png](https://qiita-image-store.s3.amazonaws.com/0/280929/40f297c2-3416-2e74-06a5-5dd7bf4a47d5.png)
AndroidタブレットのVNCクライアントからLinuxにGUI接続する

最近PC環境の整理中でして、最終的には「手元は超ライトな環境だけ残して、検証や構築はAzure上でやる！」という方針にしたいと思っています。
そんな一環で、AndroidタブレットでノートPCまがいのことをおおよそできるようにしたく、掲題の接続にチャレンジ。

あんまり需要なさそうですが誰かの役に立てば幸いです。

#全体の環境
Androidタブレット　+ VNC Viewer
↓
Ubuntu on Azure　（DNS名で接続）

ちなみにタブレットは[Huawei Mediapad M5 Pro](https://consumer.huawei.com/jp/tablets/mediapad-m5-10-pro/) です。
デザインが素敵すぎて所有欲満たされまくるから壊れるまで使い倒したいくらい愛用している。。。

#手順
##1.Androidタブレット環境作成
Google Playから[VNC Viewer](https://play.google.com/store/apps/details?id=com.realvnc.viewer.android&hl=ja)を探し、Androidタブレットにインストールします

##2.Azure上で適当なLinuxサーバを作ります
ここは手順割愛。

##3.SSHで環境接続します
適当な方法でSSH接続します。
なんとWindows10にはデフォルトでOpenSSHクライアントが入っている（！）ことを知り使ってみました。
コマンドプロンプトから　ssh -l ユーザ名 接続先FQDN　こんな感じで普通に使える！めっちゃ便利～～～～～～

##4.VNCサーバ構築
手順は下記を参照させていただきました。
いつもCentOSしか使わないからコマンド忘れた。。。
http://chie8842.hatenablog.com/entry/2017/03/26/152619

##5.Passwordを入力して接続！
ぶじ接続できました！（画像がなくて恐縮；）
conda activate の CommandNotFoundError への対処方法

## 初回の `conda activate` でエラーが出る

```
conda activate base
```

のようにして Python 仮想環境を切り替えようとすると、初回実行ではおそらく以下のようなエラーが発生する。

```
CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
If your shell is Bash or a Bourne variant, enable conda for the current user with

    $ echo ". /Users/iris/miniconda3/etc/profile.d/conda.sh" >> ~/.bash_profile

or, for all users, enable conda with

    $ sudo ln -s /Users/iris/miniconda3/etc/profile.d/conda.sh /etc/profile.d/conda.sh

The options above will permanently enable the 'conda' command, but they do NOT
put conda's base (root) environment on PATH.  To do so, run

    $ conda activate

in your terminal, or to put the base environment on PATH permanently, run

    $ echo "conda activate" >> ~/.bash_profile

Previous to conda 4.4, the recommended way to activate conda was to modify PATH in
your ~/.bash_profile file.  You should manually remove the line that looks like

    export PATH="/Users/iris/miniconda3/bin:$PATH"

^^^ The above line should NO LONGER be in your ~/.bash_profile file! ^^^
```

どうすればエラーが解消されるかは書いてあるが、具体的にどうすれば良いのかを次で紹介する。



## 解決方法

`.bashrc` や `.zshrc` などに以下を追記すれば良い。リンクを貼る方法も書かれているが、基本的にはこれで大丈夫。

```
. ${HOME}/miniconda3/etc/profile.d/conda.sh
conda activate base
```

追記したら `source ~/.bashrc` や `exec $SHELL` もしくはターミナルを立ち上げなおすなどして設定をロードすることを忘れずに。



## `source` ではなく `conda` を使う

ちなみに Anaconda や Miniconda で Python 仮想環境を切り替える時は

```sh
source activate base
```

のように `source` コマンドを使うのをよく見かけると思うが、 conda 4.4.0 (2017-12-20) からは

```sh
conda activate base
```

のように、 `source` コマンドよりも `conda` コマンドによる Python 仮想環境の切り替えが推奨されている。

- [conda/CHANGELOG.md 4.4.0 (2017-12-20) Recommended change to enable conda in your shell](https://github.com/conda/conda/blob/a4c4feae404b2b378e106bd25f62cc8be15c768f/CHANGELOG.md#440-2017-12-20)

`conda activate` による Python 仮想環境の切り替えを簡単にする方法についても書いています。

- [conda の Python 仮想環境を peco で簡単に切り替える - Qiita](https://qiita.com/peaceiris/items/3e6b682d974544720268)
jsdoでmatter その3

#概要

jsdoでmatterやってみた。
倒立振子やってみた。

#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/G/i/j/Gijf.jpg?t=1542265319)

#サンプルコード

```
var Engine = Matter.Engine,
    Render = Matter.Render,
    Runner = Matter.Runner,
    Body = Matter.Body,
    Events = Matter.Events,
    MouseConstraint = Matter.MouseConstraint,
    Mouse = Matter.Mouse,
    World = Matter.World,
    Constraint = Matter.Constraint,
    Bodies = Matter.Bodies;
var engine = Engine.create(),
    world = engine.world;
var render = Render.create({
    element: document.body,
    engine: engine,
    options: {
        width: 450,
        height: 450,
        showAngleIndicator: true
    }
});
Render.run(render);
var runner = Runner.create();
Runner.run(runner, engine);
World.add(world, [
    Bodies.rectangle(10, 225, 10, 450, { 
        isStatic: true
    }),
    Bodies.rectangle(440, 225, 10, 450, {
        isStatic: true
    }),
    Bodies.rectangle(225, 440, 450, 10, { 
        isStatic: true
    })
]);

var body = Bodies.rectangle(200, 0, 20, 100, {
    collisionFilter: { 
        group: -1
    } 
});
var ball = Bodies.circle(200, 70, 30, {
    collisionFilter: {
        group: -1 
    }
});
var furiko = Body.create({
    parts: [body, ball],
    isStatic: false
});
World.add(world, [furiko]);

var	errd2 = 0;
var	errd = 0;
var setd = 0;
function PDC(dt, input, setPoint) {
    var Kp = 0.03;
    var Kd = 0.0000005;
	var error;
	var u;
	error = setPoint - input;
	u = Kp * error + (Kd * (setPoint - setd) - Kd * (input - errd2)) / dt;
	errd2 = errd;
	errd = input;
	setd = setPoint;
	return u;
}

Events.on(engine, 'beforeUpdate', function(event) {    
    document.getElementById('helloWorld').innerHTML = furiko.angle.toFixed(2) + '<br>' + furiko.angularVelocity.toFixed(3) + '<br>';    
    var u = PDC(0.1, furiko.angle, 0);
    Body.setAngularVelocity(furiko, u);    
});

Render.lookAt(render, {
    min: {
        x: 0,
        y: 0 
    },
    max: { 
        x: 450,
        y: 450
    }
});



```

#成果物

http://jsdo.it/ohisama1/Gijf

以上。
【C#】Project Euler 5,6,7問目

#はじめに
C#を用いてProjectEulerに挑戦している人の記録です。VisualStudio2017で、1つのフォームアプリの中に問題番号のボタンを作成し、そのボタンをクリックすると結果をラベルに表示するという形式でやっています。
#5問目
1 から 20 までの整数全てで割り切れる数字の中で最小の正の数を求めよ

```csharp
 public static long Gcd(long a, long b)
        {
            if (a < b)
            {
                return Gcd(b, a);
            }
            else
            {
                while (b != 0)
                {
                    var tmp = a % b;
                    a = b;
                    b = tmp;
                }
                return a;
            }
        }
public static long lcm(long a, long b)
        {
            return (a * b) / Gcd(a, b);
        }
private void button5_Click(object sender, EventArgs e)
        {
            long i;
            long n = 1;
            for (i = 1; i <= 20; i++)
            {
                n = lcm(n, i);
            }
            label1.Text = "Answer= " + n;
        }
```     
1から20までのLCM（最小公倍数）を求めます。1から20で割り切れるということはその倍数であり、その最小を求めるためです。ユークリッドの互除法でGCD（最小公約数）を求めると、そこからLCMが求まります。
#6問目
最初の100個の自然数について二乗の和と和の二乗の差を求めよ

```csharp
private void button6_Click(object sender, EventArgs e)
        {
            //最初の100個の自然数について二乗の和と和の二乗の差
            int n = 100;
            int Sum = (n * (n + 1)) / 2;
            int SumSquare = Sum * Sum;
            int SquareSum = (n * (n + 1) * (2 * n + 1)) / 6;
            int Answer = SumSquare - SquareSum;
            label1.Text = "Answer = " + Answer;
        }
```
和の公式を用いました。1から100までの和を2乗し、2乗の和から引きました。
#7問目
10001番目の素数を求めよ

```csharp
 private void button7_Click(object sender, EventArgs e)
        {
            int Num = 1000000;//リストの最大値
            int[] IntegerList;
            IntegerList = new int[Num];
            var PrimeNumberList = new List<long>();
            var j = 0;
            for (int i = 2; i < Num; i++) { IntegerList[i] = i; }

            int head = 0;
            double EndNum = Math.Sqrt(Num);

            while (head < EndNum)
            {
                //先頭を探す
                for (int i = j; i < Num; i++)
                {
                    if (IntegerList[i] != 0)
                    {
                        head = IntegerList[i];
                        PrimeNumberList.Add(head);
                        j = i;
                        break;
                    }
                }
                //ふるい落とし。落としたものには0を入れる
                foreach (int i in IntegerList)
                {
                    if (IntegerList[i] % head == 0) { IntegerList[i] = 0; }
                }
            }
            for (int a = 2; a < IntegerList.Length; a++)
            {
                if (IntegerList[a] != 0)
                {
                    PrimeNumberList.Add(IntegerList[a]);
                }
            }
            label1.Text = "Answer = " + PrimeNumberList[10000];
        }
```
エラトステネスの篩を用いています。1から1000000までが入ったリストを作り、エラトステネスの篩でふるい落とされた要素には0を代入し、残った数字を最後に取り出しています。もっと効率の良いエラトステネスの篩の実装方法があると思います。どうか教えてください......。
C# Split int

標準入力で、半角スペース区切りの数字の文字列を取得
例:　2 3 7 4

その数字の文字列を、int型に変換して、配列に降順で格納する



string line = System.Console.ReadLine();

int[] nums = line.Split(' ').Select(x => int.Parse(x)).OrderByDescending(x => x).ToArray();
JavaScriptでdeepなequals

#Javascriptでオブジェクトの中身を比較する方法が無かった
やれJSONで比較しろだの、それはやってはいけないだのいろいろあった
のでdeepなequalsを作ってみた。

``` javascript:deepequals.js
function deepEquals(variable1, variable2) {
    if (typeof variable2 === "undefined") {
        return false;
    }
    if (typeof variable1 === "object") {
        $.each(variable1, function (i, e) {
            if (!deepEquals(variable1[i], variable2[i])) {
                return false;
            }
        })
    } else {
        if (variable1 !== variable2) {
            return false;
        }
    }
    return result;
}
```
functionとかには未対応。普通の配列とかオブジェクトであれば動作するはず。
FTP-GETしたファイルがキャッシュされる

## FTPサーバ止めたのにダウンロードできた？
FFFTPで編集したファイルをアップしたのに
プログラムからダウンロードすると古い内容しか取ってこない。
IIS上のFTPサーバの設定か？と探すがわからず。
FTPサーバ止めたらタイムアウトするよね。。。え；
取得できた・・・

どうやらローカルのキャッシュを見てるようだ。
https://docs.microsoft.com/en-us/dotnet/api/system.net.ftpwebrequest.defaultcachepolicy?view=netframework-4.7.2

サーバがいなくてもダウンロードしているように見えるのは凶悪だ。
以下のようにキャッシュしない設定に書き換えた。

```sample.cs
FtpWebRequest ftpReq = (FtpWebRequest)WebRequest.Create(uri);
ftpReq.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);//キャッシュしない
標準出力をシンタックスハイライトする

# 動機
- 標準出力されたソースコードに色をつけて見やすくしたい
- apt-get install などはしたくない
 - 見慣れたvimのハイライトで表示したい
- わざわざテキストファイルとして保存はしたくない

# やり方
例えばよくあるシチュエーションとして，Gitで過去のバージョンのファイルを単体で見たいときは，

```console
git show <コミットのハッシュ値>:<開きたいファイル> | vim -c 'set filetype=xxx' -
```
とすることでvimで表示できます． (ファイル名は.gitが置いてあるディレクトリからみた相対パス)
ちなみにハッシュ値をブランチ名にすれば別ブランチのファイルを開けます．


毎回打ち込むのは手間なので.bashrcなどに設定しておくと楽です．

```bash:.bash_aliases
function vimgitshow(){
	git show "$1" | vim -M -c 'set nomod' -c "file ${1##*/}" -c 'filetype detect' -
}
```
```console
vimgitshow <ハッシュ値>:<開きたいファイル>
```

<!--

## 複数のファイルを開きたいときは

## 任意のコマンドの出力をvimで開く

-->

# 参考URL
標準入力を読み込んで編集
https://vim-jp.org/vimdoc-ja/starting.html#--
編集できないようにする
https://vim-jp.org/vimdoc-ja/starting.html#-M
https://vim-jp.org/vimdoc-ja/starting.html#-c
[https://vim-jp.org/vimdoc-ja/options.html#'nomod'](https://vim-jp.org/vimdoc-ja/options.html#'nomod')
filetypeを設定する
https://vim-jp.org/vimdoc-ja/editing.html#:file
[https://gnu/bash/manual/Shell-Parameter-Expansion](https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html#Shell-Parameter-Expansion)
https://vim-jp.org/vimdoc-ja/filetype.html#filetype-detect
【SharePoint 2013】SharePoint Designer 2013 で新規作成した Form の日時書式を設定する。

```xml
<xsl:value-of select="ddwrt:FormatDate(@Modified, 1041, 5)"/>
```
# ddwrt:FormatDate関数の定義
## ddwrt:FormatDate(date, lcid, formatflag)
* date
	- 表示形式を変換する日付データ
* lcid
	- ロケール (日本語だと 1041)
* formatflag
	- 表示形式を示すフラグ。1, 3, 4, 5, 7, 12, 13, 15 の数値

| formatflag | 出力
|:-:|---|
| 1 | 2008/1/22
| 3 | 2008年1月22日
| 4 | 0:03
| 5 | 2008/1/22 0:03
| 7 | 2008年1月22日 0:03
| 12 | 0:03:00
| 13 | 2008/1/22 0:03:00
| 15 | 2008年1月22日0:03:00

# 参考サイト
* [Custom Date Formats in SharePoint XSL](https://blogs.msdn.microsoft.com/joshuag/2009/03/25/custom-date-formats-in-sharepoint-xsl/)
* [SharePoint Designer 2007 の「データビュー」 の利用 (2.日付の表示形式の変更)](https://shanqiai.weblogs.jp/sharepoint_technical_note/2008/01/sharepoint-de-3.html)
UIView.addMotionEffect(_:) が main thread checker に引っかかる


UIView.addMotionEffect(_:) 
https://developer.apple.com/documentation/uikit/uiview/1622586-addmotioneffect

これが使われてると main thread checkerが警告を出してくる

```
=================================================================
Main Thread Checker: UI API called on a background thread: -[UIApplication applicationState]
PID: 1778, TID: 142950, Thread name: com.apple.CoreMotion.MotionThread, Queue name: com.apple.root.default-qos.overcommit, QoS: 0
Backtrace:
4   libobjc.A.dylib                     0x00000001f8fc3894 <redacted> + 56
5   CoreMotion                          0x00000001ff840760 CoreMotion + 304992
6   CoreMotion                          0x00000001ff840c94 CoreMotion + 306324
...
略
```

iOS12からだと思われる

- https://github.com/jdg/MBProgressHUD
- https://github.com/SVProgressHUD/SVProgressHUD

この辺の有名OSSでも使われているので困る…

https://github.com/SVProgressHUD/SVProgressHUD/issues/930

main threadで実行させてるのにmain thread checkerに引っかかるので解決策は謎です…
【SharePoint 2013】リボン、アイテムメニューへのユーザー設定のアクション追加 

SharePoint Designer 2013 使用してリボンにボタンを作成したり、アイテムメニュー[…]に項目を追加できます。

# 追加できる場所
![Ribbon01[1].png](https://qiita-image-store.s3.amazonaws.com/0/111975/25fbfc32-be77-b0b2-4c3c-1bdf94048c71.png)![Ribbon02[1].png]
(https://qiita-image-store.s3.amazonaws.com/0/111975/1fe43c45-b7f2-0be1-0b80-5df0e1ca0c27.png)
![Ribbon03[1].png](https://qiita-image-store.s3.amazonaws.com/0/111975/2fce6e03-fa32-efb4-8122-82fce358871b.png)


## リスト アイテム メニュー
* アイテムの編集メニュー[…]の項目にアクションを追加できます。

## フォーム リボンの表示
* 表示フォーム (DispForm) のリボンにボタンを追加できます。

## フォーム リボンの編集
* 編集フォーム (EditForm) のリボンにボタンを追加できます。

## フォーム リボンの新規作成
* 新規作成フォーム (NewForm) のリボンにボタンを追加できます。

## リボンの表示
* リストビューのリボンにボタンを追加できます。

# 準備
* 16px、32px のアイコン画像をサイト内にアップロードしておく。
* ワークフローの起動を設定する際は、対象のワークフローを手動起動できるようにしておく。

# 設定方法
1. SharePoint Designer 2013 で対象のサイトを開き、[サイト オブジェクト] > [リストとライブラリ] から、対象のリストまたはライブラリを選択します。
2. リボンメニューの、[ユーザー設定のアクション] の中から追加したい場所を選びます。
3. [ユーザー設定のアクションの作成] ダイアログで、設定を行い [OK] ボタンをクリックします。

* 名前：
	- 任意のメニュー名を指定する。
* 説明：
	- メニューの説明を入力する。(任意)
* アクションの種類：
	- [フォームへの移動] 移動したいフォームを選択する。
	- [ワークフローの開始] 関連付けられている手動開始のワークフローを選択する。
	- [URLへの移動] 移動したいURLを入力する (javaScript 可能)。
* ボタンイメージのURL：
	- アップロードしておいたアイコン画像を指定する。
* リボンの場所：
	- Ribbon.<表示したい場所のグループ名>.Controls._children
    ※グループの場所は 既定のサーバー リボンのカスタマイズの場所 を参照
* 権限マスク：
	- 表示の権限を設定します。
* シーケンス番号：
	- 表示位置を指定します。※規定は "0"

![Ribbon04[1].png](https://qiita-image-store.s3.amazonaws.com/0/111975/1517bd6d-b8b3-f2e4-8822-a6fc9ad862ae.png)

# 注意点
* リボンメニューを表示したいビューの[Web パーツの編集]で[ツール バーの種類]を[ツールバーなし]にしているとアイコンが表示されないようです。
* リストの列設定やコンテンツタイプを変更した際など、ワークフローが正常に呼び出せない状態になると[リスト アイテム メニュー]に追加したリンクが正常に動作しなくなります。現象としては "/" だけのページに遷移するようになります。Designer で再度設定しなおすと正常に動作するようになります。
* [リスト アイテム メニュー]に追加した場合、新しい表示のモダンUIでも表示されますが、アイコンの表示サイズがおかしいので、アイコン画像は設定しないほうがいいです。

# 参考サイト
* [SharePoint 2013 SharePoint Designer でリボン内にメニュー作成 ワークフロー起動](https://www.illuminate-j.jp/blog/sharepoint-2013-workflowmenu)
* [SharePoint Designer でカスタム アクション作成するときのリボン内の場所](https://www.illuminate-j.jp/blog/sharepoint-designer-custommenu-index)
* [既定のサーバー リボンのカスタマイズの場所](https://docs.microsoft.com/ja-jp/previous-versions/office/developer/sharepoint-2010/ee537543(v%3Doffice.14))
【Unity】簡単なセーブとロードの方法

#セーブ方法
Unityでセーブorロードを実現するのであれば一番楽なものは**PlayerPrefs**が最も楽だと思います。
[Unity PlayerPrefsのリファレンス](https://docs.unity3d.com/jp/460/ScriptReference/PlayerPrefs.html)

**例**

```C#:Save.cs
		PlayerPrefs.SetInt("HP" , 10);
		PlayerPrefs.SetFloat("MP" , 10.0f);
		PlayerPrefs.SetString("名前","Unityちゃん");
```
**PlayerPrefs**でセーブをするにはこのように記述します。

|Setする型|セーブデータの名前|値|
|:---:|:---:|:---:|
|Int|HP|10|
|Float|MP|10.0f|
|String|名前|Unityちゃん|
int型の**HP**という名前の箱に10という値を保存
float型の**MP**という名前の箱に10.0fという値を保存
string型の**名前**という名前の箱にUnityちゃんという値を保存
###注意
**SetInt SetFloat SetString**は加える[+=]のではなく上書き[=]で保存されるので場合によっては

```C#:test.cs
//HP保存されていた値に+10して保存
PlayerPrefs.SetInt("HP",PlayerPrefs.GetInt("HP")+10);
```
このように記述しなければいけなくなります。
(他にも色々と方法はありますが今はこれで…)


#ロード方法
先ほど保存したHP MP 名前を呼び出したいと思います。

```C#:Load.cs
		PlayerPrefs.GetInt("HP");
		PlayerPrefs.GetFloat("MP");
		PlayerPrefs.GetString("名前");
```
これで先ほど保存したHP(10) MP(10.0f) 名前(Unityちゃん)を取得することができます。

|Getする型|セーブデータの名前|保存されていた値|
|:---:|:---:|:---:|
|Int|HP|10|
|Float|MP|10.0f|
|String|名前|Unityちゃん|

#PlayerPrefsで呼び出せるもの

自己解釈した内容で書きます。
ちゃんとした内容が見たい人はこちらから([Unity PlayerPrefsのリファレンス](https://docs.unity3d.com/jp/460/ScriptReference/PlayerPrefs.html))

|PlayerPrefs.|内容|
|:---:|:---:|
|SetInt|設定した名前に対する値を保存します|
|SetFloat|設定した名前に対する値を保存します|
|SetString|設定した名前に対する値を保存します|
|GetInt|設定した名前が存在すれば値を取得します|
|GetFloat|設定した名前が存在すれば値を取得します|
|GetString|設定した名前が存在すれば値を取得します|
|DeleteKey|設定した名前が存在すればそのデータを削除します|
|DeleteAll|すべてのセーブデータを削除|
|HasKey|設定した名前のデータがあるか確認します|
|Save|使ったことないのでわからないです…|

#応用

セーブデータがあるか確認してから保存

```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Test:MonoBehaviour
{
	string userName;	//ユーザーの名前
	private void Start()
	{
		//ユ―ザーネームがあるかチェック
		if (PlayerPrefs.HasKey("UserName"))
		{
			Debug.Log("ユーザーの名前があるよ！");
		}
		else
		{
			Debug.Log("ユーザーの名前がないよ！");

			//ない場合名前を入力させる処理をここから入れる
			//一時的に別の名前を入れるよ！
			PlayerPrefs.SetString("UserName", userName);
		}
	}
}

```

#まとめ
今回の記事を応用したものが[こちら](https://qiita.com/tilyakuda/items/4999bfcfad97dea3d0e8)になります、使い方がある程度理解できたかたはこちらもご覧ください。
Swiftのメソッドで引数の型指定を間違っていてもコンパイルエラーにならないパターンがあった

## はじめに
Selectorのお話。
Swiftでもメソッドで定義している型とはまったく異なるオブジェクトを渡してもクラッシュせずに動いてしまうパターンがあったことに驚いたのでメモ。

## 実装
#### 呼び出し元
```swift

let gesture = UITapGestureRecognizer(target: self, action: #selector(tapped(_:)))
tapView.addGestureRecognizer(gesture)
```


#### メソッドの定義
```swift

@objc private func tapped(_ sender: UIView) {
    self.delegate?.tapped(tapped: sender)
}
```

senderにUIViewなんか渡ってこないけどこんな定義をしていて、基本的に動いていた・・・
delegateに渡したUIViewを取り扱う必要がある一部のケースでクラッシュして判明。
Selectorの引数定義は十分に気をつける。
PHPの月日数(月末日)をgolangで実装

#PHPの月日数(月末日)をgolangで実装する

```php:date.php
$d = date('t');
echo $d
```

```go:date.go
package main

import (
	"fmt"
	"time"
)

func main() {
	t1 := time.Now()
	t2 := time.Date(t1.Year(), t1.Month(), 1, 0, 0, 0, 0, time.Local).AddDate(0, 1, 0)
	d := time.Date(t2.Year(), t2.Month(), 0, 0, 0, 0, 0, time.Local)
	fmt.Println(d.Day())
}
```
ReactNative + TypeScript で PathAliasing

```ts
import TestScreen from '../screens/TestScreen'
import TestComponent from '../../components/TestComponent'
import TestLibrary from '../../../lib/TestLibrary'
```

みたいなのはやりたくないので、 `../` を別の文字(列)に置き換えたい。


## 環境
ReactNative 0.57
TypeScript 3.1.6
(expo v31)

## 目標
`../../` という部分を `AppRoot` という文字列に置き換える。以下のように書けるようにしたい。

```ts
import TestScreen from 'AppRoot/screens/TestScreen'
import TestComponent from 'AppRoot/components/TestComponent'
import TestLibrary from 'AppRoot/lib/TestLibrary'
```

`AppRoot` は文字通り、アプリのルートディレクトリ。慣習的には `@` をつかうことが多いしこっちのが簡潔だけど、これが使えない理由は後述。

## やり方
### tsconfig.jsonの設定
TypeScriptのコンパイルが通るように以下の設定をtsconfig.jsonに追加

```json
{
  "compilerOptions": {
    "baseUrl": "./",
    "paths": {
      "AppRoot/*": ["./*"]
    }
  }
}
```

### tslint.jsonの設定
さらにtslint.jsonも以下のように設定。この設定が無いと`no-implicit-dependencies`ルールに引っかかってlinterに怒られてしまう。

```json
"no-implicit-dependencies": [true, ["AppRoot"]]
```

### babel-plugin-module-resolver をインストール

```
yarn add -D babel-plugin-module-resolver
```

上記のTypeScript関連の設定だけではダメだったので、babelでもimportを解決してくれるパッケージが必要だったので、`babel-plugin-module-resolver`をインストール。
自分の場合はexpo環境下だったので、`expo init` コマンドで作成したときにデフォルトでbabel.config.jsが存在していた。今回はそのbabelの設定ファイルに以下のような設定を追加した。

```js
plugins: [
  [
    "module-resolver",
    {
      root: ["./"],
      alias: {
        AppRoot: "./",
      },
    },
  ],
],
```

これでビルドすればもう `../` 地獄に悩まされずに済む。

### @が使えない理由
https://github.com/palantir/tslint/issues/3364#issuecomment-425058574
このissueにあるように、2018/11現在バグによって `@` という記号が使えないらしい。 `@Component`というような文字列をaliasにしてもダメだった。もうちょっと待ったら治るかも？
【Duktape】C/C++言語でjavascriptを使う

##概要
DuktapeはC言語で書かれていて、javascriptを実行できるライブラリです。
読みは「デュークテープ」でしょうか・・・？これはちょっと曖昧・・・
日本語資料がほとんどないので、自分用に使いながら分かったことを書いていこうと思います。
APIはLuaと似ているのでLuaと比較しつつやっていこうと思います。
純粋にC言語でも使えますが、面倒なのでC++混在で書いていきます。

##実行環境
- Windows10
- VisualStudio 2017 Community

##Duktape公式サイト
https://duktape.org/
こちらよりダウンロードできます。

##Duktapeをビルド
詳しいビルドのしかたは省略しますが
ダウンロードして展開すると「src」というフォルダーの中に必要なソースコードとヘッダーが一式は入っています。そのフォルダーにインクルードパスを設定して「duktape.c」と自分のソースコードファイルを一緒にコンパイルします。それだけ。V8エンジンと比べると簡単だなー


##使ってみる
###ライブラリの初期化と廃棄
- 必要なAPIはヘッダーファイル「duktape.h」にすべてあります。それをインクルードします。
- duk_create_heap_default関数(実際はマクロ)で初期化します。
- duk_destroy_heap関数で廃棄します。

```cpp:duk.cpp
#include <duktape.h>
int main(int argc, char** argv){

	//初期化
	duk_context *ctx = duk_create_heap_default();

	//廃棄処理
	if(ctx){
		duk_destroy_heap(ctx);
	}

	return 0;
}
```

ちなみにLuaの場合↓

- duk_create_heap_default　→　luaL_newstate
- duk_destroy_heap　→　lua_close

```cpp:lua.cpp
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
int main(int argc, char** argv){

	//初期化
	lua_State *L = luaL_newstate();

	if(L){
		lua_close(L);
	}

	return 0;
}
```

カスタムアロケーターを使う場合は
duk_create_heap_default関数　→　duk_create_heap関数
luaL_newstate関数　→　lua_newstate関数
を使います。
これは別の機会に。

###スクリプトを実行
1+1をするスクリプト

- duk_peval_string関数はスクリプトをコンパイルして実行します。そしてスクリプト最後の行の実行結果をスタックに積み増す。
- duk_get_int関数でスタックに積まれた結果をint型(duk_int_tでtypedefされた型)で取得します。bool型ならduk_get_boolean関数、文字列ならduk_get_string関数などがあります。

```cpp:duk.cpp
#include <duktape.h>
#include <iostream>
int main(int argc, char** argv){

	//初期化
	duk_context *ctx = duk_create_heap_default();

	//1+1を実行して返却
	duk_peval_string(ctx, "1+1;");

	//返却された値をint型で取得
	duk_int_t result=duk_get_int(ctx, -1);

	//1+1=2 と表示されます
	std::cout<< "1+1=" << result<< std::endl;

	//廃棄処理
	if(ctx){
		duk_destroy_heap(ctx);
	}

	return 0;
}
```

Luaの場合↓

- duk_peval_string→　luaL_dostring
- lua_tonumber→　lua_tonumber

Luaの場合は明示的に「return」を書かないと結果を受け取れません。

```cpp:lua.cpp
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#include <iostream>
int main(int argc, char** argv){

	//初期化
	lua_State *L = luaL_newstate();

	//1+1を実行して返却
	luaL_dostring(L, "return 1+1;");

	//返却された値をint型で取得
	lua_Number result=lua_tonumber(L, -1);

	//1+1=2 と表示されます
	std::cout<< "1+1=" << result<< std::endl;

	if(L){
		lua_close(L);
	}

	return 0;
}
```
enumをi18n対応させてselectの選択肢として表示させる

## TL;DR

Taskモデルにstatus属性があるとして

```ruby
# app/models/task.rb
...
enum status: { not_stated_yet: 0, started: 1, completed: 2 }
...
```

翻訳ファイルは下記の通り

```yml
# config/locales/models/task/ja.yml
ja:
	activerecord:
		models:
			task: タスク
		attributes:
			task:
				status: 対応状況
				detail: 内容
				due_on: 締め切り
	enums:
		task:
			type:
				not_stated_yet: 未着手
				started: 着手
				completed: 完了
```

ビューファイル内で以下のようにして表示させる

```html
<%= select :task, :type, Task.types.map { |k, v| [t("enums.task.type.#{k}"), v] } %>
```

## 解説

### enumの設定

#### enumカラムの追加

```ruby
class AddTypeToTasks < ActiveRecord::Migration
  def change
    add_column :tasks, :status, :integer, default: 0
  end
end
```

マイグレーションの実行

```sh
$ bin/rails db:migrate
```

#### enumのモデルへの定義

```ruby
# app/models/task.rb
...
enum status: { not_stated_yet: 0, started: 1, completed: 2 }
...
```

### 翻訳ファイルの作成

#### 設定の追加

下記の設定を追加することでデフォルトで日本語の翻訳ファイルを読みに行ってくれる。
また、`config/locales/`配下のファイルを読み込んでくれるようになる。

```ruby
# config/application.rb

...
config.i18n.default_locale = :ja
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
```

#### 翻訳の追加

モデルの属性名の翻訳とenumの翻訳を追加する。

```yml
# config/locales/models/task/ja.yml
ja:
  activerecord:
    models:
      task: タスク
    attributes:
      task:
        status: 対応状況
        detail: 内容
        due_on: 締め切り
  enums:
    task:
      type:
        not_stated_yet: 未着手
        started: 着手
        completed: 完了
```

enumの翻訳の配置は好みの問題。
`config/locales/ja.yml`の中に書いている人もいた。

自分の場合はモデルの翻訳ファイル内に書きたかったが、activerecordの翻訳とは分けたかったので上記の形に落ち着いた。

[enum_help](https://github.com/zmbacker/enum_help)というenumをI18n対応させてくれるgemもあったが、わざわざgemを入れるほどでもなかったので採用しなかった。

ただ、翻訳の配置はenum_helpのものを真似させていただいた。

### ビューファイルでの呼び出し

以下の通り。

```html
<%= select :task, :type, Task.types.map { |k, v| [t("enums.task.type.#{k}"), v] } %>
```

selectのタグ情報として配列を渡してあげると[key, value]として評価されるため、`map`メソッドでenumの属性名をkey、値をvalueとして持つ配列を作成する。

## 参考

- [Railsでenumを使ったselectタグ](https://morizyun.github.io/ruby/rails-function-enum-select-tag.html)
- [Rails enumについてまとめておく](https://qiita.com/shizuma/items/d133b18f8093df1e9b70)
【SharePoint 2013】JSリンクで編集フォームの項目を条件によって読み取り専用にする 

既定の編集フォームを JSリンクで表示を切り替えるサンプルソースです。
サンプルではフィールドの種類を設定していますが、固有の列名を指定してもOKです。

```js
(function () {
	var ctx = {};
	ctx.Templates = {};
	ctx.Templates.Fields = {
		'Text': {// 1行テキスト
			'EditForm': function (ctx) {
				// 判定処理を書く
				var readOnly = false;
				if (readOnly) {
					return SPField_FormDisplay_Default(ctx);
				} else {
					return SPFieldText_Edit(ctx);
				}
			},
		},
		'Note': {// 複数行テキスト
			'EditForm': function (ctx) {
				// 判定処理を書く
				var readOnly = false;
				if (readOnly) {
					return SPFieldNote_Display(ctx);
				} else {
					return SPFieldNote_Edit(ctx);
				}
			},
		},
		'User': {// ユーザー
			'EditForm': function (ctx) {
				// 判定処理を書く
				var readOnly = true;
				if (readOnly) {
					prepareUserFieldValue(ctx);
					return SPFieldUser_Display(ctx);
				} else {
					return SPClientPeoplePickerCSRTemplate(ctx);
				}
			},
		},
	};

	SPClientTemplates.TemplateManager.RegisterTemplateOverrides(ctx);
})();

// コンテンツを正しく表示するには、ユーザーコントロールに特定の書式設定された値が必要です。
function prepareUserFieldValue(ctx) {
	var userFields = ctx.CurrentItem[ctx.CurrentFieldSchema.Name];

	var fieldValue = "";

	for (var i = 0; i < userFields.length; i++) {
		var user = userFields[i];
		fieldValue += user.EntityData.SPUserID;
		fieldValue += SPClientTemplates.Utility.UserLookupDelimitString;
		fieldValue += user.DisplayText;

		if ((i + 1) != userFields.length) {
			fieldValue += SPClientTemplates.Utility.UserLookupDelimitString;
		}
	}

	ctx.CurrentFieldValue = fieldValue;
}
```
# 参考サイト
* [SharePoint のプロバイダー ホスト型アドインを使用して UX をカスタマイズする](https://docs.microsoft.com/ja-jp/sharepoint/dev/solution-guidance/customize-the-ux-by-using-sharepoint-provider-hosted-add-ins)
【マクロマン】計画実行の設定手順

マクロマン触ってみました。
ライセンス費用0のRPAツールで、PoCにはうってつけのツールと言えそうです。

今回、スケジュール実行機能を使ってロボットを実行する方法をメモっておきます。

##スケジュール設定方法
「計画実行」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/c46a61eb-e76a-f14e-24d0-5d6bbfb42f7f.png)

スクリプト名のリストに表示されるスクリプトは、マクロマンをインストール後に自動的に作成された「My Scripts」フォルダ内に配置されたものしか表示されません。
自分の場合は、**C:\Users\XXXXXX\Documents\MACROMAN\My Scripts**配下にファイルを置くことで、リストに表示されました。ここがちょっと分かりづらかったですね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/1d8b3275-5b8a-c485-e45f-da2442ff905d.png)

開始/終了日時、実行間隔を設定後、追加ボタンをクリックしてタスクを追加します。
あとは、ロボットが稼働するのを待つだけです。

##参考サイト
https://docs.macroman.jp/manual/operation/planexecution
[Azure] Azure Functions V2でデフォルトタイムアウト値が変わったので注意(App Serviceプラン利用時に無制限→30分)

[Azure Functions](https://azure.microsoft.com/ja-jp/services/functions/) のランタイムバージョン 2.0が 2018/9月にGAしました。

1.0との違いは [こちら](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-versions) とか [こちら](https://azure.microsoft.com/ja-jp/blog/introducing-azure-functions-2-0/) に詳しく書かれています。

この中で、Azure App Service プランを使った場合のデフォルトタイムアウト値が変わっていたので、これまでV1で30分以上かかるバッチを実行していた場合には注意が必要となります。

# Azure Functionsの実行プランと制限時間

Azure Functionsは2つの異なるホスティングプランで実行可能です。
## 従量課金プラン: 
実行する関数の負荷によってインスタンスは自動的にスケールし、課金は実行時間と実行回数に基づいて行われます。AWS Lambdaと同じ実行イメージです。Lambdaの方は先月(2018/10)最大実行時間が15分になりましたが、Azure Functionsではデフォルト5分、設定により10分まで延長できます。
## Azure App Service プラン:
WebAppなどの他のApp Serviceアプリと同様に、Azure App Serviceプラン(専用VM)上で実行することが可能です。課金もAzure App Service プランのサイズと実行時間に基づいて行われます。専用VMが割り当てられるので、設定により実行時間を無制限に設定することが可能です。

以上が説明ですが、テキストではちょっと分かりづらいので表にするとこのようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/28b60fc8-a10b-bae2-ebf0-4bdbf31e825d.png)

以下、赤字のところの説明です。

# V2でタイムアウト値を延長するには

表に記載した通り、デフォルトタイムアウト値が30分になっているので、V1で30分を超えるような関数を実行していた場合、同じ設定ではタイムアウトしてしまいます。

```
2018-10-23T17:44:46.285 [Error] Timeout value of 00:30:00 exceeded by function 'Functions.testFunc' (Id: 'd58xxxxx-b3xx-49xx-aexx-4c91xxxxxxxx'). Initiating cancellation. 
```

タイムアウト値を延長するには、host.jsonに記載します。ポータルでは Function Appを選択 → Function Appの設定 → host.json で設定できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/8bc0a381-4251-792e-df2c-b86f4cf5d29b.png)

デフォルトでは "version": "2.0" だけの設定になっているので、"functionTimeout"値を設定して Function Appを再起動すれば反映されます。例は10時間にする場合の設定です。

```json
{
  "version": "2.0",
  "functionTimeout": "10:00:00"
}
```

## 無制限にするには？

ドキュメントを探してもV1と同じ「無制限」にする方法が見当たらなかったのですが、テストで色々設定を試していたところ、それらしいエラーメッセージが出ていました。

```
Error: 関数ランタイムを起動できません。 Microsoft.Azure.WebJobs.Script: FunctionTimeout must be greater than 00:00:01 and less than 10675199.02:48:05.4775807.
```

実環境でそんなに長くすることはないと思いますが、このメッセージ通りなら.NETのTimeSpanの最大値(+10675199 02:48:05.4775807)まで設定可能ということになります。

# 参考資料

- [Azure Functions ～サーバーレス アーキテクチャ～](https://azure.microsoft.com/ja-jp/services/functions/)
- [Azure Functions ランタイム バージョンの概要](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-versions)
- [Azure Functions 2.0 のご紹介](https://azure.microsoft.com/ja-jp/blog/introducing-azure-functions-2-0/) 
- [host.json reference for Azure Functions 2.x](https://docs.microsoft.com/en-us/azure/azure-functions/functions-host-json#functiontimeout)
xcodebuildで、「error: unable to attach DB: error: accessing build database 」でビルドできなくなった際の対処。

いままで下記xcodebuildで、ビルドできたいたものが、

```terminal:
$ xcodebuild -target HogeAdView -project HogeAdView.xcodeproj -configuration Release -sdk iphoneos clean build
```


```terminal:
〜省略〜
note: Using new build system

note: Planning build
note: Constructing build description
Build system information
error: unable to attach DB: error: accessing build database "/〜/build/XCBuildData/build.db": database is locked Possibly there are two concurrent builds running in the same filesystem location.

** BUILD FAILED **


** BUILD FAILED **


The following build commands failed:
	PhaseScriptExecution Run\ Script 〜/phalcon-ios/build/HogeAdView.build/Release-iphoneos/HogeAdView.build/Script-394E5FA919763FEA00D1A064.sh
(1 failure)
```

とエラーになってビルドできなくなった。

```terminal:
-UseModernBuildSystem=NO
```

というオプションで、レガシービルドにすると。

```terminal:
$ xcodebuild -target HogeAdView -project HogeAdView.xcodeproj -UseModernBuildSystem=NO -configuration Release -sdk iphoneos clean build
```



無事いままでどおりビルド可能になりました。

**xcode10**〜から新しいビルドシステムにデフォルトで切り替わっているので、
意図的に過去のアプリ等はレガシービルドに指定する必要があるみたい。
【SharePoint 2013】カスタムフォームで文字列の状態で項目の表示・非表示を切り替える 

SharePoint Designer 2013 でリストのカスタムフォームを作成した際に、
ある列の状態によって項目の表示／非表示を制御したいという要望は多いと思います。

文字列を XPath で比較する際のサンプルです。[承認状況(ApprovalStatus)]列の文字列を比較し、それぞれ [一次承認]、[二次承認]、[承認済] の時に表示する項目を切り替えます。

前方一致、部分一致、完全一致のサンプルを書きました。

```xml
<xsl:choose>
  <xsl:when test="starts-with(@ApprovalStatus, '一次承認')"><!-- 前方一致 -->
    <tr>
      <td width="190px" valign="top" class="ms-formlabel">
        <H3 class="ms-standardheader">
          <nobr>一次承認</nobr>
        </H3>
      </td>
      <td width="400px" valign="top" class="ms-formbody">
        <SharePoint:FormField runat="server" id="ff16{$Pos}" ControlMode="Edit" FieldName="PrimaryApproved" __designer:bind="{ddwrt:DataBind('u',concat('ff16',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@PrimaryApproved')}" />
        <SharePoint:FieldDescription runat="server" id="ff16description{$Pos}" FieldName="PrimaryApproved" ControlMode="Edit" />
      </td>
    </tr>
  </xsl:when>
  <xsl:when test="contains(@ApprovalStatus, '二次承認')"><!-- 部分一致 -->
    <tr>
      <td width="190px" valign="top" class="ms-formlabel">
        <H3 class="ms-standardheader">
          <nobr>二次承認</nobr>
        </H3>
      </td>
      <td width="400px" valign="top" class="ms-formbody">
        <SharePoint:FormField runat="server" id="ff17{$Pos}" ControlMode="Edit" FieldName="SecondaryApproved" __designer:bind="{ddwrt:DataBind('u',concat('ff17',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@SecondaryApproved')}" />
        <SharePoint:FieldDescription runat="server" id="ff17description{$Pos}" FieldName="SecondaryApproved" ControlMode="Edit" />
      </td>
    </tr>
  </xsl:when>
  <xsl:when test="@ApprovalStatus = '承認済'"><!-- 完全一致 -->
    <tr>
      <td width="190px" valign="top" class="ms-formlabel">
        <H3 class="ms-standardheader">
          <nobr>承認日</nobr>
        </H3>
      </td>
      <td width="400px" valign="top" class="ms-formbody">
        <xsl:value-of select="ddwrt:FormatDateTime(string(@ApprovalDate), 1041, 'yyyy/MM/dd (ddd) HH:mm')" />
      </td>
    </tr>
  </xsl:when>
</xsl:choose>
```
# 参考サイト
* [XSLにおける条件分岐](https://ymotongpoo.hatenablog.com/entry/20081024/1224871874)
* [論理式、比較式、およびセット式 (XPath)](https://ymotongpoo.hatenablog.com/entry/20081024/1224871874)
* [サンプルで覚えるXSLTプログラミング > 10. 文字列系関数](https://www.atmarkit.co.jp/fxml/tanpatsu/xslt/xslt10.html)
windows10のプロダクトキー確認

#windows10のプロダクトキー確認
###コマンドプロンプトでの確認方法
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/249280/94473d83-1086-4968-c637-899ca118a22f.png)
[windowsキー + R]でファイル名を指定して実行を呼び出し、[cmd]と打つ

![image3.png](https://qiita-image-store.s3.amazonaws.com/0/249280/69db09fe-20fc-820b-d983-33a6bc6823a5.png)
するとコマンドプロンプトが開く
そこに

```
wmic path softwarelicensingservice get OA3xOriginalProductKey
```
と入力すると、

![image2.png](https://qiita-image-store.s3.amazonaws.com/0/249280/673dc8e2-9d4c-e427-108c-80e976e4082c.png)
このようにプロダクトキーが表示される

###powershellでの確認方法

![image4.png](https://qiita-image-store.s3.amazonaws.com/0/249280/6f2dfc25-8bc8-2686-47d6-10feac823cc8.png)
タスクバーのフォームに[powershell]と入力すると、windows powershellが表示されるのでクリック

![image5.png](https://qiita-image-store.s3.amazonaws.com/0/249280/5bb4486d-3a23-4160-ccb2-e88c99ff13af.png)
このような画面が開く
そこに、

```powershell
powershell "(Get-WmiObject -query ‘select * from SoftwareLicensingService’).OA3xOriginalProductKey"
```
と入力すると、

![image6.png](https://qiita-image-store.s3.amazonaws.com/0/249280/e865efce-edd5-e938-9e4b-613d8e543da2.png)
プロダクトキーが表示される
円を周回する　エクスプレッション

#学生時代
高校に晴れて入学した高校一年の初めて学級が発表された時の話。
クラスが決まって教室に入り担任の紹介やら自己紹介やら、ワクワクする時間。
そんな中担任から「このクラスに成績ギリギリでこの高校に入れた人がいます！これから勉強頑張ってください！」
と話を聞かされた。
俺はお調子者だったから、まだ仲良くもなっていないクラスメイトに「おい(笑)！！誰だー！？」何て事を言って、ふざけていた。

俺は遊ぶことばっかに集中して、勉強はほとんどしていなかった。
バンドやスケボーと青春を謳歌していた。
そんな高校ライフの中、高校で初めてのテストが行われた。
俺の学校ではその日の帰りにはテストの答案が貰える事になっている。

テストを終えて、６時限目が終わり、ホームルームでテストの答えが配られる。
しかも、成績がいい順に発表されて「100点　○○君」ってな具合で呼ばれ
教壇まで取りにいかないといけないシステムだ。

俺のクラスは４２名
前半は呼ばれない事ぐらいは当然知っていた。
なぜならテスト中にこれっぽっちも "やってやった感" が無かったからな。

どんどん周りの生徒は名前を呼ばれ残りの数が減っていく・・・
35名38名40名・・・

とうとうワースト２位まで来ていた。
走馬灯のように入学式の担任の発言が頭をよぎる。。。

担任：「このクラスに成績ギリギリでこの高校に入れた人がいます！！」（エコー）
俺：「おい(笑)！！誰だー！？」（エコー）

～～～～～～現実に戻される俺～～～～～～～～～
とうとう最後の一人・・・
32点！！上原君（私）・・・
ドッとクラス内で笑いが起きる。
その瞬間に俺が「この学校に成績ギリギリで入れた人」になったわけだ。

俺：「おい(笑)！！誰だー！？」って発言をすぐさま撤回したかったが
時既に遅し・・・
俺のクラス全員が笑ってやがる。
９クラスある長い廊下を、これでもかってぐらい響き渡る笑い声
俺は笑い声よりも早いスピードで家に帰りたかった。。。

そんな高校生活だった。。。
という事で

#今日のエクスプレッションにほぼ半日かかってもうた・・・
今回はサインコサイン！！
数学が一番苦手だった俺にはハードルが高かった。

とりあえず要点だけメモしておく。

楕円形のサイズに対して
小さな円が周回する感じの物です。

こんなに長い話をしたのに、重要な部分はこれだけだ。

```jsx
a = content("グループ 2").content("楕円形パス 1").size[0]/2 ;
b = content("グループ 2").content("パスのトリミング 1").end;

kakudo =  degreesToRadians(360/100*b-90);

x = a*Math.cos(kakudo);
y = a*Math.sin(kakudo);

[x,y]
```

これを動かしたいオブジェクトの位置にエクスプレッション記述しました。

kakudo　の変数にてラジアンに変換した角度だ。
360/100*b-90　の　-90　はdefaultの位置を上側にしたかったから追加した。

どんな動きかってのは動画で見てくれ。
ちなみにこれでpaticularのパーティクルするポジションも自動化している。


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">AfterEffects<br>Math.cos<br>Math.sin<br>でちょっと作業に時間がかかったのでメモ。<br>詳しくはキータ記事にて<a href="https://t.co/NomMtlJsoB">https://t.co/NomMtlJsoB</a> <a href="https://t.co/ZnSpNsBHud">pic.twitter.com/ZnSpNsBHud</a></p>&mdash; YouTool (@YouTool3) <a href="https://twitter.com/YouTool3/status/1062930777304756224?ref_src=twsrc%5Etfw">2018年11月15日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

画像も貼っておく。

![bandicam 2018-11-15 14-30-58-335.jpg](https://qiita-image-store.s3.amazonaws.com/0/178061/c2a594e4-4d70-1778-4598-b0d19c593977.jpeg)

#サンプルファイルダウンロード先（ドロップボックス）
毎度の事ながら説明不足なのでサンプルファイルも置いておきます。

https://www.dropbox.com/s/fkismfibdjm9yvx/countdown.zip?dl=0
Augurの概要と、よくある誤解

# Augurとは
[Augur](https://www.augur.net/)は仮想通貨を使った、予測市場のプラットフォームです。2018年7月10日にメインネットにローンチしていて、今も開発が続いているプロジェクトです。
オープンソースで、ソースコードは[GitHub](https://github.com/AugurProject)にあります。
予測市場とは、まだ起きていない未来の事象について、どうなるか予想して掛け金を支払い、結果を的中させた人に金銭的報酬を与える仕組みです。
応用として、事態が悪くなるほうにかけておき、実際に悪くなったらお金を得る。という使い方もできます。
予測市場には、集合知としての使い方もあります(今回は割愛)

# マーケットの作成から結果報告まで
Augurを使って予測を取引する際の流れを簡単に説明します。
![augur-summary.png](https://qiita-image-store.s3.amazonaws.com/0/142577/db5215eb-a191-5ba4-b5db-a03c4049fc84.png)



登場人物は大きく３つに分かれます。

- 左上の「マーケット作成者」がお題と選択肢と期間を指定して、マーケット(取引の場)を作成します。

- 「トレーダー」が、各選択肢(この例ではYESかNOか)を、ETHを使って購入します。

- 期限が来たら、「レポーター」が結果を報告します。

- 正解したトレーダーはETHを受け取ります。その時にマーケット作成者は手数料を受け取ります。


# よくある誤解(バージョン1.7での仕様)
Augurは日本語の情報が少ないため、いくつかの誤解が生まれています。現在の最新バージョンの1.7での仕様を元に整理しました。

(誤)参加者はREPトークンを使ってベットする。
(正)ETHを使ってベットする。REPはマーケットの作成や結果のレポートの際に必要。(バージョン2からETHではなくDAI(ステーブルコイン)の使用が予定されています)

(誤)結果は多数決で決める。
(正)結果は一人のレポーターが報告する。報告が正しくない場合、他の参加者は異議をとなえて争うことができる。

(誤)結果が決まるまで、大勢の報告が必要なため、1ヶ月ほどかかる。
(正)結果はレポーターが報告後、次の枠（１週間）以内に異議がなければそのまま最終結果となる。

# まとめ
非中央集権的に予測や賞金のやり取りができるのは、単なるギャンブル的な使い方以外にも応用ができそうですね。
次回は、[AugurにWEBブラウザで接続してマーケットを見る方法](https://qiita.com/jansnap/items/1b82d77827efa306c9a5) を説明します。
層圏トポス: limit と colimit

2018/11/12 (月) 発表分です。

## limit と colimit の定義

圏 $\mathcal{C}$ の部分圏 $\mathcal{D}$ に対して、対象 $X$ が $\mathcal{D}$ の **極限** (_limit_) であるとは、 $X$ から $\mathcal{D}$ の全ての対象への射があり ($X$ と $X$ から $\mathcal{D}$ の対象への射の族を合わせたものを **錐** (_cone_) と呼ぶ)、他の任意の錐からその錐への射が存在することをいう。 (詳しくは https://ja.wikipedia.org/wiki/%E6%A5%B5%E9%99%90_(%E5%9C%8F%E8%AB%96)#%E6%A5%B5%E9%99%90 を参照してください。図式 (関手) ではなく部分圏を考えていること以外は一緒です。) このとき $X = \lim_{\leftarrow} \mathcal{D}$ と表記する。教科書では錐の射は $\nu_i \colon X \to D_i$ と表記される。

**余極限** (_colimit_) については、双対圏の極限という形で定義ができる。 $X$ が 部分圏 $\mathcal{D}$ の余極限であるとき、 $X = \lim_{\rightarrow} \mathcal{D}$ と表記する。このとき双対圏の錐に当たるものを **余錐** (_cocone_) と呼ぶ。教科書では余錐の射は $\mu_i \colon D_i \to X$ と表記される。

## 例
(1) $\mathcal{D} = \\{D_0 \to D_1 \to D_2 \to \cdots, f_{ij} \colon D_i \to D_j\\}$ の場合
limit $$\lim_{\leftarrow} \mathcal{D} = D_0$$ は自明。
colimit $$\lim_{\rightarrow} \mathcal{D}$$ は自明ではない。集合の圏 $\mathbf{Sets}$, 群の圏 $\mathbf{Gr}$, アーベル群の圏 $\mathbf{Ab}$ については、これは **帰納的極限** (_inductive limit_) と呼ばれるものになる。帰納的極限とは以下のようなものである:
$$ D_\infty := \left(\coprod_{i = 0}^{\infty} D_i\right) / \mathord{\sim}$$
ただし、$\coprod_{}$ は集合の[非交和](https://ja.wikipedia.org/wiki/%E9%9D%9E%E4%BA%A4%E5%92%8C)であり、同値関係 $\mathord{\sim}$ は次のように定義される: 0以上の整数 $i, j$ と $x \in D_i, y \in D_j$ に対して、
$$(i, x) \sim (j, y) :\Leftrightarrow \exists k \ldotp k \ge i, k \ge j, f_{ik}(x) = f_{jk}(y)$$

以下のように余錐を定めることにより、 $D_\infty = \lim_{\rightarrow} \mathcal{D}$ が証明できる:
$$ \mu_i \colon D_i \to D_\infty; x \mapsto [(i, x)]$$
証明は $\mathbf{Sets}$ においては普遍性を確かめればよく、 $\mathbf{Gr}, \mathbf{Ab}$ においてはさらに $\mu_i$ および $\mathbf{Sets}$ での議論において普遍性によって定まる射 (教科書では $\sigma$ と呼ばれる) が群の準同型写像であることを証明すれば良い。
【SharePoint 2013】サイドナビゲーションをアコーディオン化する 

以前、「[SharePoint の Web パーツを開閉する](https://qiita.com/MakotoIshikawa/items/f3a33d3aef0013a8fff9)」で紹介したをコードを改良して、
サイドナビゲーションをアコーディオン化します。

※jQuery と他のライブラリがコンフリクト(競合)しないようにしています。

```css
ul.ms-core-listMenu-root li.static {
  margin: 0;
  list-style: none;
}
ul.ms-core-listMenu-root > li.static > span.menu-item {
  position: relative;
  margin: 0;
  padding: 0.5em 1.5em;
  border: 2px solid #0479E7;
  font-size: 110%;
  font-weight: bold;
  background-color: #DDEEFF;
  height: 1.5em;
  display: block;
}
ul.ms-core-listMenu-root > li.static > span.menu-item + ul {
  margin: 1em 0;
}

ul.ms-core-listMenu-root > li.static > span.menu-item:before {
  content: "";
  position: absolute;
  background: #222288;
  top: 50%;
  left: 4px;
  margin-top: -16px;
  height: 32px;
  width: 8px;
  border-radius: 2px;
  -webkit-border-radius: 2px;
  -moz-border-radius: 2px;
}

ul.ms-core-listMenu-root > li.static > span.menu-item:after {
  display: block;
  content: "";
  position: absolute;
  top: 50%;
  right: 10px;
  width: 7px;
  height: 7px;
  margin-top: -4px;
  border-top: solid 2px #7f7f7f;
  border-right: solid 2px #7f7f7f;
  transform: rotate(135deg);
  -webkit-transform: rotate(135deg);
  transition: .2s;
}

ul.ms-core-listMenu-root > li.static > span.closed:after {
  transform: rotate(45deg);
  -webkit-transform: rotate(45deg);
}
```

```js
(function ($) {
  $.fn.extend({
    BodyToggle: function (speed, closedOther) {
      var className = 'closed';
      $(this).toggleClass(className);
      $(this).next().slideToggle(speed);

      if (closedOther) {
        $(this).parent('li').siblings().each(function () {
          var $title = $(this).children().first();
          $title.addClass(className);
          $title.next().slideUp(speed);
        });
      }
    },
  });

  $(window).load(function () {
    $('#DeltaPlaceHolderLeftNavBar span.ms-core-listMenu-item').click(function () {
      $(this).BodyToggle('normal', true);
    }).first().click();
  });
})(jQuery);
```
# 参考サイト
* [スマートフォンにも使える、クリックで開くアコーディオンメニューjQuery](http://web-pc.net/jquery010)
Python3で時間のゾロ目判定

#はじめに
コーディングテストしたらあまりに出来なくて悲しかった…
コーディングテストの練習の備忘録として…

追記
本記事のコメントに3行で実装できるコードも載っております．
初心者（私）と賢い方のコードの違いが見れて面白いですよ！！

#問題
「時　分　秒」（h　m　s）を入力とし，
全ての数字が同じなら「Yes」，一つでも違うなら「No」と出力する．

#条件
python3

0 ≦ h < 24 , 0 ≦ m < 60 , 0 ≦ s < 60

#入出力例
入力「11 1 11」
出力「Yes」

入力「12 11 1」
出力「No」

#コード
```python3
def main():
    # 「h m s」をinputし半角スペースでsplit
    time = input().split()

    # h,m,sが条件であることの確認用に格納
    h = int(time[0])
    m = int(time[1])
    s = int(time[2])

    # 16時なら['1', '6']のように分けて格納．今の段階では文字列（str型）
    hList = list(time[0])
    mList = list(time[1])
    sList = list(time[2])

    # hList,mList,sListを繋げた配列の各要素をint型にして格納
    hmsList = list(map(int, hList + mList + sList))

    # h,m,sが条件であることの確認
    if (0 <= h < 24 and 0 <= m < 60 and 0 <= s < 60):
        pass    # 大丈夫なら以下を行う
    else:
        return  # 大丈夫でないならreturn

    # mdList内が全て同一ならばTrue，一つでも違うならFalseを格納
    # hmsListの先頭（[0]）が全てと同一かどうかをチェック
    judge = all((x == hmsList[0] for x in hmsList))

    if (judge == True):
        print("Yes")
    else:
        print("No")

if __name__ == "__main__":
    main()
```

# 最後に
プログラミング初心者のへぼコードです．
ミスがあっても知ったこっちゃありません．
【SharePoint 2013】SharePoint の Web パーツを開閉する

ページに挿入した [スクリプト エディター] の [スニペットを編集] でコードを挿入するだけで、Web パーツが開閉できるようになります。

※jQuery と他のライブラリがコンフリクト(競合)しないようにしています。

```html
<style>
.ms-webpart-chrome h2 {
  position: relative;
  margin: 0 0 4px;
  padding: 0.8em 0 0.8em 1.5em;
  border: 2px solid #993366;
  font-size: 1.143em;
  font-weight: bold;
  background-color: #FFEEFF;
}
.ms-webpart-chrome h2:before {
  content: "";
  position: absolute;
  background: #882255;
  top: 50%;
  left: 0.5em;
  margin-top: -15px;
  height: 30px;
  width: 8px;
  border-radius: 2px;
  -webkit-border-radius: 2px;
  -moz-border-radius: 2px;
}
.ms-webpart-chrome h2:after {
  display: block;
  content: "";
  position: absolute;
  top: 50%;
  right: 10px;
  width: 7px;
  height: 7px;
  margin-top: -4px;
  border-top: solid 2px #7f7f7f;
  border-right: solid 2px #7f7f7f;
  transform: rotate(135deg);
  -webkit-transform: rotate(135deg);
  transition: .2s;
}
.ms-webpart-chrome .closed h2:after {
  transform: rotate(45deg);
  -webkit-transform: rotate(45deg);
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script>
(function ($) {
  $.fn.extend({
    BodyToggle: function (speed) {
      $(this).toggleClass('closed');
      $(this).next().slideToggle(speed);
    },
  });
  $('.ms-webpart-chrome-title').click(function () {
    $(this).BodyToggle('normal');
  });
})(jQuery);
</script>
```

# javaScript
```js
(function ($) {
  $.fn.extend({
    BodyToggle: function (speed) {
      $(this).toggleClass('closed');
      $(this).next().slideToggle(speed);
    },
  });

  $(window).load(function () {
    $('.ms-webpart-chrome-title').click(function () {
      $(this).BodyToggle('normal');
    }).click();// 閉じた状態で開始
  });
})(jQuery);
```
# CSS
```css
.ms-webpart-chrome h2 {
  position: relative;
  margin: 0 0 4px;
  padding: 0.8em 0 0.8em 1.5em;
  border: 2px solid #993366;
  font-size: 1.143em;
  font-weight: bold;
  background-color: #FFEEFF;
}

.ms-webpart-chrome h2:before {
  content: "";
  position: absolute;
  background: #882255;
  top: 50%;
  left: 0.5em;
  margin-top: -15px;
  height: 30px;
  width: 8px;
  border-radius: 2px;
  -webkit-border-radius: 2px;
  -moz-border-radius: 2px;
}

.ms-webpart-chrome h2:after {
  display: block;
  content: "";
  position: absolute;
  top: 50%;
  right: 10px;
  width: 7px;
  height: 7px;
  margin-top: -4px;
  border-top: solid 2px #7f7f7f;
  border-right: solid 2px #7f7f7f;
  transform: rotate(135deg);
  -webkit-transform: rotate(135deg);
  transition: .2s;
}

.ms-webpart-chrome .closed h2:after {
  transform: rotate(45deg);
  -webkit-transform: rotate(45deg);
}
```
# 参考サイト
* [超簡単jQuery！toggle系メソッドでアコーディオンメニューやタブをさくっと実装する方法](http://liginc.co.jp/web/js/jquery/34048)
Microsoftの技術的なサポートは無償窓口だとTwitterが一番良いかもしれない件(2018/11/15時点、Access2010のパッチ不具合:KB4461522)→Twitterもダメな感じになりました(2019/11/13時点)

#はじめに
Access2010を社内で(やむなく)使ってるのですが、
こんなパッチが先日リリースされたんですよね。
https://forest.watch.impress.co.jp/docs/news/1152086.html

で、ユーザの各マシンに対し、WindowsUpdateによってパッチが入ったのですが、
これがAccess2010と相性が非常に悪く、日付型テキストボックスに書式指定をしている状態の
オブジェクトに対し、マウスカーソルをオンすると

**パッとAccessが落ちます。ヤバい。**

業務にならない…　と現場からクレームが来るわけですよ。
(そもそももうセキュリティアップデートしか提供されないVerのAccessを
 業務アプリの基盤として、なぜずっと使っているんだという突っ込みは自分としてもあるのですが。)

#MSのヘルプデスクに問い合わせてみる
どうしたもんかな…　と思って参考情報を探したわけですが、
https://support.office.com/ja-jp/article/最近の-access-の問題に関する修正プログラムと回避策-54962069-14f4-4474-823a-ff7e5974a570

等には当然新たな問題の対策は載っていないわけですし、ここから行ける
![image.png](https://qiita-image-store.s3.amazonaws.com/0/144657/4fd64906-e8f0-7225-9303-e243e7ed0cf2.png)
問い合わせアプリで、最終的に担当者によるチャットサポートは受けられるのですが、

Accessだと、以下の「プロフェッショナル サポート」に結局誘導されます。(Officeアプリなのに…)
https://www.microsoft.com/ja-jp/services/professional.aspx

なんと質問１回**５万円**。
さすがにアップデートパッチによるしょぼい不具合でこんな額は払ってられないので途方に暮れていたわけです。
(´･ω･`)ｼｮﾎﾞｰﾝ

*そういやTwitterがあったぞ
しょぼくれていると、ふとこんな記事があったのを思い出しました。
https://social.technet.microsoft.com/wiki/contents/articles/15052.microsoft-twitter-ja-jp.aspx

![image.png](https://qiita-image-store.s3.amazonaws.com/0/144657/ec9a9814-611b-8e21-32df-4fe9cea5988f.png)
んん？　サポートがあるぞ？

#まさかのツイッター
とりあえず開いてみました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/144657/e3adce76-8b93-3e00-f0b7-b69e226915d3.png)
**ＤＭでの質問も受けつけている…**　だとっ！

聞いてみました。

![ms.png](https://qiita-image-store.s3.amazonaws.com/0/144657/8b4eb86b-982b-a0b9-8333-af085004f5fd.png)

**返信超早い…！**
とりあえず課題として把握されていることがわかるだけでも、
社内での報告のやりようもあるので大変助かりました。

#結論
マイクロソフトのユーザ対応窓口はエンドユーザ向けの窓口と開発者向けの窓口が一本化されてないので、
おそらくですが、エンドユーザ向けの窓口に開発っぽい質問を投げてもまともな応対が返ってこない…　ということがわかりました。

でもツイッターのサポートアカウントのＤＭだとちゃんと親切な対応がされるので
技術的に切り分けできていて、質問を客観的に投げられる状態であれば、
ツイッターでＤＭしてみるのが現状のベストプラクティスな気がします。