OmniAICreator/Qiita-1.07M huggingface dataset:
[初心者向け]C++/Cにおける、Cannot assign to variable 'ptr' with const-qualified type 'int *const'

#事の起こり
C++のconst修飾子を勉強してみました!!
少しややこしい仕様になっているのでの忘備録としてメモします。
#環境
・IDE:xcode
・コンパイラ:Default compiler(AppleのClangですね。)
・言語:C++ 14
#問題
「とりあえず値変えたくない時は、適当にconst付けておけば良いや」と甘い考えを持っていたら、次の2つのエラーに苦しめられてしまいました。

1.Cannot assign to variable 'ptr1' with const-qualified type 'int *const'
2.Read-only variable is not assignable

問題のコードはこちらです。皆さんは原因が分かりますか?

```cpp

int main(int argc, const char * argv[]) {
    
    int value = 128;
    int* const ptr1 = &value;
    ptr1 = nullptr;//ここで1番のエラー
    *ptr1 = 5;
    
    int const* ptr2 = &value;
    ptr2 = nullptr;
    *ptr2 = 5;//ここで2番のエラー
    
    return 0;
}
```
#原因
実はC/C++において、「int* const」と「int const*」は別の意味を持っています。

・「int* const」はその変数(ptr1)のアドレスが不変であること示す。(アドレス変更NG)
・「int const*」はその変数(ptr2)の値が不変であることを示す。(値変更NG)

今回の例では、int* constで宣言したアドレス不変のptr1にnullptrを代入しようとして1番のエラーが、int const*で宣言した値不変のptr2に5を代入しようとして2番のエラーが発生していたようです。
ちなみに、アドレスも値も変更不可としたい場合は、
　　　　　　　　　　　const int* const 変数名
としてやれば良いそうです。

#まとめ
正直、分かりづらいですよね・・・。しかし、constが右側にかかることを意識して、次のように読み方を覚えてしまえば楽!!(なのかも)。読み方のポイントは「constが右側にかかる」という点です!! 

(例1) int* const 変数名
constは右側にかかる。constがかかるのは「変数名」なので、その変数が示すもの、すなわち「アドレス」が不変であると解釈。


(例2) int const* 変数名
constは右側にかかる。constがかかるのは「* 変数名」なので、その変数のアドレスが示すものすなわち、「値」が不変であると解釈。

(例3) const int* const 変数名 
２番目のconstは「変数名」にかかる。すなわち、その変数が示すもの「アドレス」が不変である。さらに、1番目のconstは「* const 変数名」にかかるのでその変数のアドレスが示すもの「値」が不変であると解釈。

以上。
Vueでリロードを表現する２つの方法

# はじめに
jQueryや生のJSでは、ページ内の要素が持っているデータを初期化するのに、よくリロードさせていましたが、Vueだとどう表現すべきなのかやってみました。

# 1. 変数の初期化
ページ内で使用する変数に初期値を与える事で疑似リロードを表現できます（検索ページのリセットでも使う方法）

```
例）
<template>
  <p><input v-model="params.text"></p>
  <p class="btn" @click="reset()">リセット</p>
</template>
<script>
export default {
  data: function () {
    return {
      params: {
        text: ''
      }
    }
  },
  methods: {
    reset: function () {
      this.params = {}
    }
  }
}
</script>
```
ボタンクリック時にparamsを初期化するメソッドを用意することで疑似リロードを表現できます。
ただ、API等でデータを取得している場合やGETでデータを取得している等が初期表示で必要であるとこのメソッドでは対応しきれなくなります。


# 2. router.goを利用
vue-routerをインストールしている環境であればrouterメソッドが使用できるかと思います。
その中でrouter.goを使用することで想定していたリロードを表現できます。

```
例）
<template>
  <p><input v-model="params.text"></p>
  <p class="btn" @click="reset()">リセット</p>
</template>
<script>
export default {
  data: function () {
    return {
      params: {
        text: ''
      }
    }
  },
  methods: {
    reset: function () {
      this.$router.go({path: this.$router.currentRoute.path, force: true})
    }
  }
}
</script>
```
currentRoute.pathで現在のパスを渡す事でリロード処理をしてくれる模様。
vue-routerのAPIリファレンスでは数字を引数としていたgoメソッドですが、オブジェクトを渡せるようなので、他のメソッドでも色々できそうな予感。こういうのどうやって調べるんだろう。。。

以上、リロードを表現する２つの方法でした！
Reactをわかった気になる #2 コンポーネント

## はじめに
前回はReactの特徴についてまとめました(前回の記事は[こちら](https://qiita.com/fiftie/items/37b2212739b29f3e79cc))。
今回は前回の記事でも触れた「コンポーネント」についてより詳しく説明していきたいと思います。非エンジニアや初心者の方向けの記事になりますので、技術的に深いところまでは触れませんのでご了承ください。

## コンポーネントとは
コンポーネントとはWebページの1つの部品です。
Reactは、1ページを作るために複数のコンポーネントを組み合わせていきます。
![コンポーネント例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389383/b87cd337-b0d4-35db-6692-1262967a9485.png)
例えばReactの[ホームページ](https://ja.reactjs.org/)では上記のようにコンポーネントを組み合わせて作られています(便宜上、元ページの両端をカットしています)。
開発のときはだいたい、1ページに1つの大きなコンポーネントを用意して、その中にたくさんの小さなコンポーネントを組み合わせて作成していくことが多いです。上記の画像では画像左側が1つの大きなコンポーネントであり、その中には画像右側のような小さなコンポーネントが格納されているイメージです。

## 共通化
コンポーネントを使って開発をしていく際の利点として、部品の共通化が挙げられます。
ボタンやフォームなど、ページ内で複数回使うことが考えられる部品は予めコンポーネントとして括っておくことで共通部品として様々な場所から呼び出し、使い回すことができます。作業が短縮されるだけでなく、デザインのトンマナが乱れることへの一定の制御が働くなど様々な恩恵を受けることができます。
さらにReactでは、コンポーネントに引数を渡すことでその挙動を制御することができます。<img width="1405" alt="スクリーンショット 2019-07-15 17.37.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389383/ea0d0026-8b61-156c-edba-196c6ecbe543.png">
※ボタンの画像は[こちら](https://saruwakakun.com/html-css/reference/buttons)からお借りさせていただきました。
例えば上記の画像では、Buttonコンポーネントに引数「blue」を渡すと青いボタンに、引数「red」を渡すと赤いボタンになります。このような引数の事をReactでは「props」といい、propsを使うことでコンポーネントの共通化をより柔軟にこなすことができます。

## ステートレスな実装
コンポーネントによる利点として、他にステートレスな実装が挙げられます。
基本的に個々のコンポーネントは独立していて、独自の状態を持ち、管理しています。なので親のコンポーネントは子のコンポーネントの内部状態について関心を持たなくて良いため、とてもシンプルな実装になります。ここで言う状態とは、例えばButtonコンポーネントでいうとクリックされたかどうかのフラグや、何回押されたかの情報などです。
Reactではコンポーネントに付き1つの「state」を持ち、そこで状態を一元管理しています。

## Atomicデザインとの親和性
最後の利点としてAtomicデザインとの親和性が挙げられます(AtomicデザインについてはDeNAさんの[こちら](https://design.dena.com/design/atomic-design-%E3%82%92%E5%88%86%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%A4%E3%82%82%E3%82%8A%E3%81%AB%E3%81%AA%E3%82%8B/)の記事がおすすめです)。
Atomicデザインは簡単に言うと、原子を組み合わせて分子、分子を組み合わせて生体…のようにデザインをしていく手法です。Reactでも言い方が違うなれど、孫コンポーネントを組み合わせて子コンポーネント、子コンポーネントを組み合わせて親コンポーネント…というように開発していきます。つまりデザイン手法と開発手法のプロセスがほぼ同じなので、デザイナーが新規ページを作る際に実装側の共通部品を活かしたデザインをおこしたり、ページ内の部品の名前がデザイナーとエンジニアでブレないためチーム内の共通言語のルール決めが楽になるなど様々な恩恵を受けることができます。

## 最後に
このようにコンポーネントをつかって開発していく設計手法のことを「コンポーネントベース」といったり「コンポーネント指向」と言う場合があります。2019年7月現在のWebフロント界隈では、このコンポーネントベースの設計が一般的になっています。今回は非エンジニア向けということもあり、viewに重点を置いて説明しましたが、Reactはコンポーネントベースな設計手法によって従来のMVC系の設計手法を置き換えていきました。いつかそのことについても記事を書きたいと思います。
初心者向け！広告用語集 (随時更新)

#はじめに
WEB系のIT企業で働く上で、広告に関する最低限の知識はどの部署でも必須です。
今回はその中でも基本的な用語をまとめました！
私自身が忘れやすいのでメモです！:girl_tone1:

#基本用語
###マネタイズ
ネット上の無料サービスから収益をあげること。


###インプレッション
広告が実際にWeb上に表示されること。
表示された回数をインプレッション数（表示回数）という。

###CPC
１クリック当たりの広告料金のこと。
費用（コスト）÷クリック数で算出。

###CTR
クリック率のこと。表示された広告に対して、クリックされた割合を指す。
クリック数÷インプレッション数で算出。

###CPM
1,000回表示あたりの広告費用のこと。

###CV（コンバージョン）
Web上で獲得する最終的な成果のこと。
商品購入や資料請求、問い合わせ等広告主によってゴールは異なる。

###CVR（Conversion Rate）
コンバージョン率ともいう。広告がクリックされた後、何％がコンバージョンに至るかを割合で示す。
コンバージョン数÷クリック数で算出。

###RPM
広告１０００回表示当たりの収益のこと。

###UU(ユニークユーザー)
ある期間内にWEBサイトやその特定のページを訪問したユーザーの数。
同じ人が同じ期間内に複数回来たとしても、カウント数は１である。

###PV
そのサイトの訪問者が閲覧した全てのページ数の合計のこと。
同じページを見直した場合も追加でカウントされる。

###アクティブユーザー
計測期間中にWEBサイトを基準となる回数以上利用しているユーザーのこと。

###ユニークブラウザ
WEBサイトへの訪問回数をそれぞれのブラウザごとに記録すること。
どのブラウザがサイトにとって訪問者を集めるのに有効か判断する指標。

###直帰率
初めてサイト内のページに訪問してきて、そのページから他のページに遷移せずに離脱するユーザーの割合。

#さいごに
ここに乗せた用語は、見なくても意味を答えられるようにした方が良さそうです。
当たり前の知識として会議などで頻繁に出てきます！
また追加の用語があれば随時更新していきます！
StoryboardでUIButtonの見た目を編集したい(グラデーションとか)

# customClassを作る
`cocoaTouch`から新規の`swift`ファイルを作成して、下記を全コピペ
(どうせコピペするから、あんま意味ないけど選ぶならクラスのとこは`UIButton`)

```GradientButton.swift
@IBDesignable
class GradientButton: UIButton {
    let gradientLayer = CAGradientLayer()
    
    @IBInspectable
//両端の色を定義
    var topGradientColor: UIColor? {
        didSet {
            setGradient(topGradientColor: topGradientColor, bottomGradientColor: bottomGradientColor)
        }
    }
    
    @IBInspectable
//両端の色を定義
    var bottomGradientColor: UIColor? {
        didSet {
            setGradient(topGradientColor: topGradientColor, bottomGradientColor: bottomGradientColor)
        }
    }
    
//storyboardで設定できる項目を定義
    private func setGradient(topGradientColor: UIColor?, bottomGradientColor: UIColor?) {
        if let topGradientColor = topGradientColor, let bottomGradientColor = bottomGradientColor {
            gradientLayer.frame = bounds
            gradientLayer.colors = [topGradientColor.cgColor, bottomGradientColor.cgColor]
            gradientLayer.borderColor = layer.borderColor
            gradientLayer.borderWidth = layer.borderWidth
            gradientLayer.cornerRadius = layer.cornerRadius
            layer.insertSublayer(gradientLayer, at: 0)
        } else {
            gradientLayer.removeFromSuperlayer()
        }
    }
}
```

# 配置して設定
storyboardにUIButtonを配置し`Custom Class`を`GradientButton`に設定して
少し待てば設定が可能に


# 参考記事
**・[How to Add a Rounded Gradient Button in Xcode’s Interface Builder](https://spin.atomicobject.com/2017/12/14/gradient-uibutton-swift/)**
Table.Distinct(List.Distinct)の使用例

第二引数の書き方にちょっと苦労したので、まとめておきます。

###はじめに
マウス操作での「重複の削除」は使ったことがあると思います。
列のタイトルバーで右クリックすると、下図のようなメニューが出て、重複の削除ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/00f6251f-4fb9-4f88-858d-a5ebf8fac4e3.png)

###やりたいこと1：複数列をまとめて比較
これはまだ、マウスでできます。複数列選択した状態で実行すれば、選択中の列をまとめて比較してくれます。
できあがるコードはこんな感じです。

```pq:複数列まとめて
Table.Distinct(Source, {"Column2", "Column3"})
```

###やりたいこと2：値を加工してから比較
列追加とかしないで、ということです。これはもうコードを書くしかない。
####テーブル
例えば、こんなコードが通ります。（サンプルデータを含む）
並び替えて比較させています。

```pq:加工後の値で比較
let
    Source  = Table.FromColumns({{1..3}&{1..3},{2,3,1}&{3,1,2},{3,1,2}&{2,1,3}}),
    Custom1 = Table.Distinct(Source,
                             {each List.Sort(Record.ToList(_)), Comparer.Ordinal}
              )
in
    Custom1
```
↓実行前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/41d04a56-91a4-44b7-ec50-4ffde41360e2.png)
↓実行後。行内容の組合せが重複しないようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/2768af38-8569-d94d-91ef-06ae2865ce9d.png)


####リスト
こちらも同じように書けます。

```pq:加工後の値で比較～リスト
let
    Source  = {[a={1..3},b={2,3,1}],[a={1..3},b={3,1,2}]},
    Custom2 = List.Distinct(Source,
                            {each List.Sort([b]), Comparer.Ordinal}
              )
in
    Custom2　//[a={1..3},b={2,3,1}]が返ります。
```
###若干の解説
公式レファレンスにある関数の構文では、

```
List.Distinct(list as list, optional equationCriteria as any, criteria as any) as list

Table.Distinct(table as table, optional equationCriteria as any) as table
```
となっています。この「equationCriteria」引数の書き方が問題です。
試した限りでは、下記2通りの用法があります。
1. 列名の文字列のリストを入れれば、列の組合せを見てくれる。（Table.Distinctの方だけ。やりたいこと1参照）
2. {加工内容,比較方法}という形で入れてやれば、加工後の値での比較になる。

加工内容は関数で書きます。

- List.Distinct　⇒各要素がそのまま関数に渡されるので、それが引数になるつもりで書く。
- Table.Distinct ⇒各行の値がRecordとして関数に渡されるので、Record型の引数を処理できるように書きます。

比較方法は上記のコードでは「Comparer.Ordinal」だけ使いました。Comparer関数は他にもあるので、興味があれば使い分けたらいいんじゃないでしょうか。
[Comparer functions| Microsoft Docs](https://docs.microsoft.com/en-us/powerquery-m/comparer-functions)

ちなみに、比較方法にカスタム関数が入るのでは？と思ったのですが、エラーになりました。カスタムできるのは、加工内容の方だけのようです。

###レファレンス
Power Query M Reference | Microsoft Docs
[List.Distinct関数](https://docs.microsoft.com/en-us/powerquery-m/list-distinct)
[Table.Distinct関数](https://docs.microsoft.com/en-us/powerquery-m/table-distinct)
laravel 5.7 多対多

多対多のテーブル構築は、必須。
しかし、非常に分かりづらい。
ということで極力シンプルにまとめた。


・User 1 に 対して 複数のRole を持つ
・Role 1 に 対して 複数のUser を持つ

これが多対多。


# まずはテーブルを作成

・users

|id|user_name|
|:-----------------|------------------:|
|50014|ひでまん|
|50015|たろすけ|
|50017|ありか


・roles

|id|title|
|:-----------------|------------------:|
|5|りんご|
|6|みかん|


・role_user

中間テーブル。命名規則として、role と user をアルファベット順に並べ_で区切る

|id|user_id|role_id
|:-----------------|------------------:|------------------:|
|1|50014|6|
|2|50014|5|
|3|50017|5|





# model を作成


```app\User.php

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    //hoge2 以外のフィールドはすべて保存できる
    protected $guarded = ['hoge2'];
    
    
    public function roles()
    {
        return $this->belongsToMany('App\Role');
    }
    
}


```



```app\Role.php

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;

class Role extends Model
{
    //hoge2 以外のフィールドはすべて保存できる
    protected $guarded = ['hoge2'];
}



```

以上。

で適当なコントローラーで
`use App\User;` をして、


```

$res = User::query()

    //ロールケーキを持っているユーザーのみ読み出す
//            ->has('roles')


    //ロールID5を持っているユーザーのみ読み出す
//            ->whereHas('roles', function ($q) {
//                $q->where('role_id',5);
//            })

    ->with('roles')//roles モデルも読み出す。
    ->where('id','>=',50014)//User.id が 50014 以上のユーザーのみ読み出す
    ->get();







//        ロールケーキを持っている場合はロールケーキも表示
foreach ($res as $v) {
    echo $v->id." : ".$v->user_name."<br>";
    if(count($v->roles) != 0){
        echo "<b>ロールケーキを持っています</b><br>";
        foreach ($v->roles as $s) {
            echo $s->id.":".$s->title."<br>";
        }
    }
}

```

これでOK！
SwiftでWeb扱う際の優良記事まとめ

### Safari
**・[SFSafariViewControllerをとりあえず使ってみた - Qiita](https://qiita.com/okuderap/items/3bd2fa0cb508cbd00ffd)**

### アプリ
**・[Swift &#8211; URLをSafariで開く方法 | WEB ARCH LABO](https://weblabo.oscasierra.net/swift-shared-openurl-safari/)**

### RxWebKit
**・[RxWebKitがいい感じだったよ - タマネギプログラマーの雑記](http://gaopin1534.hatenablog.com/entry/2017/05/31/225807)**
memo: ChainerRLでCuPyのエラー

ChainerRLについてのメモです。

# 環境
sudo pip3 freezeで調べたもの。

- chainer==6.1.0
- chainerrl==0.7.0
- cupy==6.1.0


# 概要
ChainerRLのTRPOでMountain Carを解くプログラム([参考コード; ほぼ同一](https://github.com/chainer/chainerrl/blob/master/examples/mujoco/train_trpo_gym.py))を実行したら、こんなエラーが出ました。

```shell
Traceback (most recent call last):
  File "mc_trpo.py", line 211, in <module>
    main()
  File "mc_trpo.py", line 158, in main
    policy.xp.zeros_like(obs_space.low, dtype=np.float32)[None],
  File "/usr/local/lib/python3.5/dist-packages/cupy/creation/basic.py", line 205, in zeros_like
    order, strides, memptr = _new_like_order_and_strides(a, dtype, order)
  File "/usr/local/lib/python3.5/dist-packages/cupy/creation/basic.py", line 35, in _new_like_order_and_strides
    order = chr(_update_order_char(a, ord(order)))
TypeError: Argument 'x' has incorrect type (expected cupy.core.core.ndarray, got numpy.ndarray)

```

変えたところといえば環境の引数くらい（自作MC環境）でして、あとはExampleまんまなんですけど……

# 解決策（暫定）
CuPyを5.4.0（適当）にダウングレード。

```shell
sudo pip3 install cupy==5.4.0
```

すると、バージョン不整合の警告は出るものの、動きました。うーん……？
動いたのでよしとします。なんかよい解決策を見つけたら追記します。
MacでGroovyを動かす

# 目的

MacでGroovyを動かした際の備忘録です

> [Groovy](https://ja.wikipedia.org/wiki/Groovy)
> Groovy（グルービー）は、Javaプラットフォーム上で動作する動的プログラミング言語である。

TIOBE index としてはGroovyは2019年度15位である

> [TIOBE Index for July 2019](https://www.tiobe.com/tiobe-index//)
> 15  Groovy 
# 準備

groovyをインストールします。

▪️homebrewを使う場合

```
$ brew install groovy
$ groovy --version
Groovy Version: 2.5.7 JVM: 1.8.0_201 Vendor: Oracle Corporation OS: Mac OS X
```

▪️curlを使う場合

```
$ curl -s "https://get.sdkman.io" | bash
$ source ~/.sdkman/bin/sdkman-init.sh
$ sdk install groovy
$ groovy --version
Groovy Version: 2.5.7 JVM: 1.8.0_201 Vendor: Oracle Corporation OS: Mac OS X
```

# テスト

groovy起動

```
$ groovyConsole &
```

下記のように起動すればOKです。
<img width="240" alt="スクリーンショット 2019-07-13 16.55.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/9e1ca154-d7ac-58aa-e2b8-d26e990db720.png">

# 備考
次のステップとして何をすればよいのだろう

# 参考
[Macにgroovyをインストールする](https://confrage.jp/macにgroovyをインストールする/)
[インストールと実行（プログラミング入門 with Groovy）](https://qiita.com/saba1024/items/66c7154608ed52363e8f)
[Mac OS X 開発環境構築手順：Groovyインストール(※導入バージョン切替方法含む)](https://absj31.hatenadiary.com/entry/20120804/1344076566)
[Web上で始めるgroovy再入門。](https://qiita.com/Nimimal/items/050de82a80d4928f5302)

[[Groovy]席替えスクリプトを実装](https://qiita.com/saba1024/items/4245b7442e4f2d8c7993)
[Groovyの人気が急上昇!!(2013年)](http://orangeclover.hatenablog.com/category/GROOVY?page=1382175038)
[Groovy の Interceptor](https://www.bucyou.net/blog/1006)
[Groovyを知らない人のためのbuild.gradle読み書き入門](https://qiita.com/opengl-8080/items/a0bb31fb20cb6505188b)
[Gradle User Guide](http://gradle.monochromeroad.com/docs/userguide/userguide.html)
[Groovyを知らない人のためのbuild.gradle読み書き入門](https://qiita.com/opengl-8080/items/a0bb31fb20cb6505188b
)
C言語でOpenGL：Visual Studio 2019のclコマンドでGLUTを使う

C言語でお絵描きしたい。
Windowsで統合開発環境を入れたけど、エディタで手軽にコンパイルしたい。
そんな物好きさんのために。

## 使うもの

- GLUT : The OpenGL Utility Toolkit
- エディタ（Sublime Text Build 3207 x64）

## 環境

- Windows 10 Pro 64bit
- OpenGL ver4.6.0
- Visual Studio Community 2019
	+ 「Desktop development with C++（C++によるデスクトップ開発）」ワークロードをインストール済

## GLUTの設定[^1]

Windows 32bit向けのファイルを[Nate Robins氏のサイト](https://user.xmission.com/~nate/glut.html)からダウンロードする。
READMEに従って次のようにコピーする。

| ファイル | コピー先 | メモ |
|:--|:--|:--|
| glut.h | C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\XX.XX.XXXXX\include\GL\ | includeフォルダ内にGLフォルダを作成 |
| glut32.lib | C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\XX.XX.XXXXX\lib\x86\ |  |
| glut32.dll | ‪C:\Windows\System\ | コンパイル済ファイルの実行に必要 |

## エディタ（Sublime Text 3）の設定

Tools -> Build System -> New Build System... でsublime-buildファイルを作成し[^2]、\\(Sublime Textのフォルダ)\Data\packages\Userに保存する。これでCtrl+bでコンパイル～実行まで行うことができる。

```C.sublime-build
{
    "selector":"sourse.c",
    "cmd":["C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\Common7\\Tools\\VsDevCmd.bat","&&","cl","-Wall","$file","&&","${file/c/exe/}"]
}
```

ここで、clはDeveloper Command Prompt（開発者コマンドプロンプト）上で動くコマンドなので、

```
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools\VsDevCmd.bat"
```

を実行して普通のコマンドプロンプト上で使えるようにしている[^3] 。

## 動作確認

[「CによるカオスCG」のコードをGLUTで書く](https://qiita.com/enonoco/items/10a0471d0252452d7c5e)のコードをコピペして、Ctrl+b。
これがやりたかったんですよ…！

## 参考

Visual Studioのバージョンによってコピー先のディレクトリが違うみたいです。
[Visual Studio 2017でOpenGLを動かせるようにする](https://qiita.com/SonoT/items/4387ec1c8d7af8979b35)



[^1]: [Nate Robins - OpenGL - GLUT for Win32](https://user.xmission.com/~nate/glut.html)

[^2]: [Build Systems – Sublime Text 3 Documentation](https://www.sublimetext.com/docs/3/build_systems.html)

[^3]: [方法: Visual Studio のコマンドラインのための環境変数を設定する](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/compiler-options/how-to-set-environment-variables-for-the-visual-studio-command-line)
Swiftベースアップ用勉強予定記事まとめ

随時、**当記事からは消してまとめたものを別でアップする**というルーティンにしたい、、

## 19/07/15 登録
**・[sho-ito-1027/Study-Swift: Swift勉強、テストコード用](https://github.com/sho-ito-1027/Study-Swift)**
**・[Swift Algorithm Club – Switで実装された代表的なアルゴリズムとデータ構造の一覧](https://www.swift-study.com/swift-algorithm-club/)**
**・[Rotate Arrays in Swift - Swift Coding - Medium](https://medium.com/swift-coding/rotate-arrays-in-swift-7f223007ad6f)**

## 19/07/28-8/3 登録
**・[SwiftでClassだけでなくStructも積極的に使う方がコードの可読性が上がる話　その1 - Qiita](https://qiita.com/Ryo_Toronto/items/bbdd04ef4207ce9fcdb9)**
**・[定数を定義する](https://www.swift-study.com/constants/)**
**・[どこよりも分かりやすいSwiftの"?"と"!" - Qiita](https://qiita.com/maiki055/items/b24378a3707bd35a31a8)**
**・[【Swift】「Unexpectedly found nil while unwrapping an Optional value」エラーの対処法 – 株式会社シーポイントラボ ｜ 浜松のシステム開発会社](https://cpoint-lab.co.jp/article/201807/3844/)**
#### view
**・[Swiftでビューを操作する - Qiita](https://qiita.com/h_nagami/items/7485cee8b73849f0c847)**
#### 型(とRx)
**・[Swiftの値型と参照型、値渡しと参照渡し - Qiita](https://qiita.com/chihayafuru/items/f6bb38c4a34d8cf62aa9)**
**・[参照型のプロパティを持つstructについて考える - Qiita](https://qiita.com/shtnkgm/items/2063b3b389f7f27d49e2)**
**・[RxSwiftでTableViewに精神を殺された😇（解決していない）←した - Qiita](https://qiita.com/K_Kyohei/items/005872ba847f9c2c1e51)**
**・[【Swift】Codableについて備忘録 - Qiita](https://qiita.com/s_emoto/items/deda5abcb0adc2217e86)**
#### 設計
**・[iOSアプリを作るときのおすすめ構成 - Swift・iOSコラム - Medium](https://medium.com/swift-column/ios-2017-4f04d00a5804)**

# ML
**・[iOSエンジニアのための、SwiftからPythonのライブラリを使って機械学習する方法 / Machine Learning using Python from Swift for iOS Engineer - Speaker Deck](https://speakerdeck.com/koher/machine-learning-using-python-from-swift-for-ios-engineer?slide=39)**

## 8/10 登録
#### 総合(応用気味)
**・[https://blog.ishkawa.org](https://blog.ishkawa.org/)**
【Java】ChronoUnitのbetween関数は比較内容に合わせて入力を変換しなければ求めたい値にならない場合がある

# TL;DR
`LocalDateTime`に対して月の差を取得するために`ChronoUnit.MONTHS.between`関数を用いた場合、0.1秒でも期間に足らなければ差が1減ってしまうため、求めたい値になりません。
正確に計算しようと思えば型を変換するなどして、余計な情報を無くした上で比較する必要があります。

# 起きた問題
以下のようなコードを書いたところ、`plusMonths(3)`しているにも関わらず2が表示されました。

```java
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.concurrent.TimeUnit;

public class Main {
  public static void main(String[] args) throws InterruptedException {
    LocalDateTime endDateTime = LocalDateTime.now().plusMonths(3);
    TimeUnit.MILLISECONDS.sleep(1); // 時間差の再現
    LocalDateTime startDateTime = LocalDateTime.now();

    // 2が出力される
    System.out.println(ChronoUnit.MONTHS.between(startDateTime, endDateTime));
  }
}
```

# 原因
公式ドキュメントでは以下のように説明されています。

> 計算では、2つの時間的オブジェクト間の完全な単位の数を表す整数を返します。たとえば、時間11:30と13:29の間の量は、2時間には1分足りないため、時間数では1時間だけになります。
[ChronoUnit \(Java Platform SE 8 \)](https://docs.oracle.com/javase/jp/8/docs/api/java/time/temporal/ChronoUnit.html#between-java.time.temporal.Temporal-java.time.temporal.Temporal-)

つまり、たとえ1msであっても月の差に足りなければ切り捨てられてしまうということです。

# 対処
`YearMonth`にすることで日時情報を切り捨てることで確実に欲しい値が出ます。

```java
import java.time.LocalDateTime;
import java.time.YearMonth;
import java.time.temporal.ChronoUnit;
import java.util.concurrent.TimeUnit;

public class Main {
  public static void main(String[] args) throws InterruptedException {
    LocalDateTime endDateTime = LocalDateTime.now().plusMonths(3);
    TimeUnit.MILLISECONDS.sleep(1); // 時間差の再現
    LocalDateTime startDateTime = LocalDateTime.now();

    // 3が出力される
    System.out.println(
        ChronoUnit.MONTHS.between(
            YearMonth.from(startDateTime), YearMonth.from(endDateTime)
        )
    );
  }
}
```

## 補足
公式ドキュメントには以下のように

> 実装では、2番目の型を最初の型のインスタンスに変換してから、量を計算します。
[ChronoUnit \(Java Platform SE 8 \)](https://docs.oracle.com/javase/jp/8/docs/api/java/time/temporal/ChronoUnit.html#between-java.time.temporal.Temporal-java.time.temporal.Temporal-)
Raspberry piで apt upgradeがconnection time outになるとき

## 背景
- また、新しくRaspberry piフォーマットし、インストールしたので、いつもの儀式で`sudo apt update`と`sudo apt upgrade`を行いましたが、うまくいきませんでした。
- 大体以下のようなエラーでした。 

``` shell
Err:319 http://ftp.tsukuba.wide.ad.jp/Linux/raspbian/raspbian buster/main armhf sc3-plugins-server armhf 3.9.1~repack-3
  Unable to connect to ftp.tsukuba.wide.ad.jp:http:

39% [Working]
             
Fetched 204 MB in 3min 9s (1,078 kB/s)
E: Failed to fetch http://ftp.tsukuba.wide.ad.jp/Linux/raspbian/raspbian/pool/main/c/cron/cron_3.0pl1-134_armhf.deb  Could not connect to ftp.tsukuba.wide.ad.jp:80 (203.178.132.80), connection timed out
E: Failed to fetch http://ftp.tsukuba.wide.ad.jp/Linux/raspbian/raspbian/pool/main/e/expat/libexpat1-dev_2.2.6-2_armhf.deb  Unable to connect to ftp.tsukuba.wide.ad.jp:http:
```

## 解決
- 以下のファイルを開き、mirrorサイトを変更して解決しました

``` bash
 sudo nano /etc/apt/sources.list
```

- 書いてあるURLをコメント処理して、新しいミラーサイトを入力します
- https://www.raspbian.org/RaspbianMirrors/ にミラーサイトの情報が載っているので、適当なサイトを選びます
    - もともと繋ごうとしていたhttp://ftp.tsukuba.wide.ad.jp も乗っていますが、ブラウザ上でも入れないですね…
    - いくつか選択してみて、Yamagata University( http://ftp.yz.yamagata-u.ac.jp/pub/linux/raspbian/raspbian/ ) には入れたのでそっちのURLを選びました。
    
``` vim
#deb http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
deb http://ftp.yz.yamagata-u.ac.jp/pub/linux/raspbian/raspbian/ jessie main contrib non-free rpi
```

- もう一回`sudo apt update`と`sudo apt upgrade`したら、うまくいきました。

## まとめ
- デフォールトの http://raspbian.raspberrypi.org/raspbian/ は近くのミラーサイトにつないでくれるようですが、登録されているサイトに接続できなかったので、update&upgradeに失敗していたようです
- 利用するミラーサイトを直接指定することで、update&upgradeができるようになりました
Pythonで分数を取り扱う話

# はじめに
[前回](https://qiita.com/sakabe/items/60e5042ec406c02c3d04)、小数をpythonで扱うことを書きました。

今回は小数ではなく、分数の表し方を調べました。


# fractions
fractionsはpythonの標準ライブラリに属する、
有理数(分数で表現できるような値)を扱うためのモジュールです。

```python
from fractions import Fraction
```

以下のようにFractionに二つの数値型の引数を渡すか、
文字列型で直接分数を渡すことで表現できます。

```python
x = Fraction(1, 3)
print(x)

y = Fraction('1/3')
print(y)

# 1/3
# 1/3
```

また、この分数に対し計算することも可能です。

```python
print(x * 3)

# 1
```

また、以下のメソッドで分子、分母を表現します。

```python
print(x.numerator)
print(x.denominator)

# 1
# 3
```

さらに以下のように小数を渡すことで、

```python
y = Fraction(1.1)
print(y)

# 2476979795053773/2251799813685248
```

あれ？

## 小数→分数は注意が必要 (2020/10/05に修正)

前回と同様の流れですが、小数をPythonで取り扱う時、正確な値ではなく近似値であることを注意しなければいけません。

 ~~そこで前回使用したDecimal型を経由することで、(有理数の)小数を分数で表現することができます。~~

文字列型をそのまま渡すことで表現可能です。
(※ @BlueRayi さんにコメントにて正しい方法を教えていただきました。)

```python
y = Fraction("1.1")
print(y)

# 11/10
```

# 終わりに
実際に分数をプログラム中で扱いたいような場面というのは限定的ですが、
覚えていても損はないかと思います。
jetson nanoにROS2をインストールする

#初めに
友人がROS2をjetson nanoにインストールしようとして失敗まくっていたので覚書程度に。

##前提条件
jetsonnanoの初期設定は終わっていて、update,upgradeはできているものとします。（英語環境）
sshのためにいちいちipアドレス調べるのめんどくさいのでavahi-daemonを導入済み。
(というかjetson "nano"なのにnano入ってないのね、入れときます。)

#入れてみる（参考文献は[ここ](https://index.ros.org/doc/ros2/Installation/Dashing/Linux-Install-Debians/)）
実際に入れていきますが、自分のROS2の知識が浅いので間違ってるかもしれません。(ROS1ならある程度分かるのに…)
##言語設定
utf-8じゃないと動かないようですね。

```shell
$ sudo locale-gen en_US en_US.UTF-8
Generating locales (this might take a while)...
  en_US.ISO-8859-1... done
  en_US.UTF-8... done
Generation complete.
```
次にこれ

```shell
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8
```
#リポジトリの追加
リポジトリを追加します。いつもの奴ですね。

```shell
sudo apt update && sudo apt install curl gnupg2 lsb-release
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
sudo sh -c 'echo "deb [arch=amd64,arm64] http://packages.ros.org/ros2/ubuntu `lsb_release -cs` main" > /etc/apt/sources.list.d/ros2-latest.list'
sudo apt update
```
##インストールします
ROS2はGUIの有無を選択できます。当然ながらGUI無しのほうが軽量です。
###desktop用(GUI込み)のコマンド
```shell
sudo apt install ros-dashing-desktop
------ 省略 ------
Need to get 193 MB of archives.
After this operation, 1,256 MB of additional disk space will be used.
```
さすがに大きい。いい産業用microSD買っといてよかった。
###Base(no-GUI版)はこっち
```shell
sudo apt install ros-dashing-ros-base
```

このjetson nanoは画像認識に使うと思うのでとりあえずDesktop版を入れました。

##argcomplete(補完機能)のインストール（オプション）
```shell
sudo apt install python3-argcomplete
```
ROS2のコマンドライン上での補完機能を使いたいときはこれをインストールします。
（pythonってことはコマンドラインツールもpython製になったのか？）
##PATHを通す
コマンドのためのPATHを通します。

```shell
source /opt/ros/dashing/setup.bash
echo "source /opt/ros/dashing/setup.bash" >> ~/.bashrc
```
<!-- #追加のRMWをインストールします
ROS1では独自に実装されていたトピック周りを
-->
##ROS1のパッケージを使う
うちにあった某研究室では互換性の問題でいまだにindigo(!?)を使ってましたが互換性というのは大切です。これを使えばある程度のROS1(Kinetic or melodic)パッケージがつかえる、らしい？

```shell
sudo apt update
sudo apt install ros-dashing-ros1-bridge
```
何も考えずにインストールしようとしたら弾かれました。
melodicのパッケージ群が必要なようで…

#おわりに
結構さらっとインストールできました。
日本語で軽くググっても出てこなかったので書いてみたわけですが、需要なさそうだなとは思ってます。
#追記
##通信周りについて
ROS２ではデフォルトのDDSにFastRTPSが採用されています。(DDSは分散型のネットワーク通信ミドルウェアでリアルタイムに通信できるよう)
これはApache2ライセンスで提供され軽量なためマシンパワーの低いマシンもネットワークに参加させることができます。
分散型であることと組み合わせてかなり便利そう。
ネットワークのすべてのアドレスを列挙する

#ネットワークのすべてのアドレスを列挙する。
### 自宅内のIoT機器をメンテナンスするのにarp -a コマンドだけでは、足りない。Windows 10とRaspberry Piで動作するスクリプトを作成した。
# 準備
```
sudo pip install kamene #python3 で動作するscapy
```
[kamene (formerly known as "scapy for python3" or scapy3k)](https://github.com/phaethon/kamene)

```discover.py
# -*- coding: utf-8 -*-
import logging,requests
logging.getLogger("kamene.runtime").setLevel(logging.ERROR)
from kamene.all import *
import netifaces
from netifaces import interfaces, ifaddresses, AF_INET
_ip=lambda ip:(int(ip.split(".")[0]),int(ip.split(".")[1]),int(ip.split(".")[2]),int(ip.split(".")[3]) )
'''
ネットワークに接続されている機器のアドレスの取得
'''
def discover():
    s,ip = ip_addr()
    n=[(x[1][ARP].psrc,x[1][ARP].hwsrc) for x in arping(ip, timeout=1, verbose=0)[0]]
    return '.'.join(map(str,s)),ip,(sorted(n,key=lambda ip:(int(ip[0].split(".")[0]),int(ip[0].split(".")[1]),int(ip[0].split(".")[2]),int(ip[0].split(".")[3]) )))
'''
ネットワークアドレスの取得
'''
def ip_addr():
    nx=[netifaces.ifaddresses(iface)[netifaces.AF_INET][0]['addr'] for iface in netifaces.interfaces() if netifaces.AF_INET in netifaces.ifaddresses(iface)]
    nxx=nx[0] if nx[0]!="127.0.0.1" else nx[1]
    n=_ip(nxx)
    mask='.'.join(map(str,n[:3]))+".*" #ネットワーク検索用　マスク 例　192.168.1.*
    return n,mask
'''
Mac address to company
'''
def MacInfo(mac):
    r = requests.get('http://macvendors.co/api/%s'% mac)
    return  (r.json()['result'])['company']

if __name__ == '__main__':
    ip,mask,adresses=discover()
    print("My IP:%s"%ip)
    print("Mask :%s"%mask)
    for i,x in enumerate(adresses):
        print("%3s %-15s %-18s %s"%(i,x[0],x[1],MacInfo(x[1])))

```
結果

```
pi@raspberrypi:~/tools$ sudo python discover.py
My IP:192.168.1.10
Mask :192.168.1.*
  0 192.168.1.1     58:52:8a:3f:8a:21  Mitsubishi Electric Corporation
  1 192.168.1.90    b0:e8:92:10:3c:f6  SEIKO EPSON CORPORATION
  2 192.168.1.104   e4:e4:ab:58:7e:36  Apple, Inc.
  3 192.168.1.108   b8:27:eb:97:47:1a  Raspberry Pi Foundation
  4 192.168.1.111   b8:27:eb:97:47:1a  Raspberry Pi Foundation
  5 192.168.1.151   78:0f:77:17:5d:70  HangZhou Gubei Electronics Technology Co.,Ltd
  6 192.168.1.155   84:0d:8e:a7:d8:3a  Espressif Inc.
  7 192.168.1.158   b4:e6:2d:67:92:c2  Espressif Inc.
  8 192.168.1.199   00:04:13:21:11:fd  SNOM Technology AG
pi@raspberrypi:~/tools$ 
```
GASで「Hello,World!」を出力するまでをまとめてみた。

# 目的
自分がGASの記事を書くことが多くなるかな、と感じたため参考にしてもらえるような簡単なチュートリアルを作りました。
この記事は、GASで「Hello, World!」を出力できるようになることを目標としています。
# 実装
## 1. GASのスクリプトエディタを開く
スクリプトエディタの開き方は何種類かあるため、いくつか手法を記載する。
### スプレッドシートから...
**1.任意のフォルダでスプレッドシートを開く**
**2.画面上の「ツール」→「スクリプトエディタ」**
![Screenshot_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247753/34ae0711-bd18-59fe-350d-c35d36161ff7.png)

### Google Apps Scriptから...
**1.任意のフォルダでGoogle Apps Scriptを開く**
![Screenshot_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247753/94f8c2f0-fc7e-be7b-64ad-432fdc20c878.png)
Google Apps Scriptが上記の通りに存在しない場合は、「アプリを追加」から、Google Apps Scriptを選択し接続する。

### Google フォームから...
**1.任意のフォルダでGoogle フォームを開く**
![Screenshot_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247753/92036562-176a-1c2e-e63c-c752770b5efc.png)
Google Apps Scriptが上記の通りに存在しない場合は、「アプリを追加」から、Google Apps Scriptを選択し接続する。
**2.画面右上の「メニュー」→「スクリプトエディタ」**
![Screenshot_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247753/b9cc371c-4234-a3b7-7b79-0a43065ceb75.png)

## 2.Hello, World!を出力する
### logに出力する
**1.スクリプトエディタに下記のように記述する。**

```javascript
function myFunction() {
  Logger.log('Hello, World!');
}
```
**2.左上の「無題のプロジェクト」を選択し、適当な名前に変更し保存する。**
**3.Ctrl+sでコードを保存する。(MacならCmd+s)**
**4.下記のデバックボタンをクリックする。**
![Screenshot_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247753/9564ce75-e95f-2aa5-1db9-19f060a1ada0.png)
**5.Ctrl+Enterでログを確認する。(MacならCmd+Enter)**
![Screenshot_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247753/2184a7a5-d1ef-4934-d161-4974e68b6130.png)

# 終わりに
以上でチュートリアルは終了です。
他の記事でGASを使った手法などを書いていきますので、よかったら見てみてください。
しりとりゲームで人が無意識に行っていること～RPAで一人しりとりロボットを開発してみる～

UiPathというRPAツールを使って、一人しりとりロボットを作成してみました。

ワークフローを全て説明すると長くなるので、手順だけ説明します。

しりとりをRPAで作成するときに、手順やルールを全て教え込まないといけないので、「しりとり」で人間が無意識に行っていること、無意識に準じているルールについて気づいたことがありました。

ではまず、一つ一つ説明していきます。

# どんなロボットができたか

Qiitaには動画を載せられないので、Twitterでシェアした動画をご覧ください。

[一人しりとりロボットを作った - Twitter -](https://twitter.com/hilhilyzyan/status/1150650134998372352)

# どのような手順のワークフローを作成したか

## しりとりをするために一番必要な「知識」を収集する

まず、しりとりを行うために必要不可欠なものが一つあります。

それは**知識**です。

もちろんロボットに知識はありません。ではどうするかというと、まず辞書から単語を持ってきて、「あ」から始まる単語、「い」から始まる単語...という風にExcelに単語を整理しながら入れるロボットを作りました。

シート名を「あ」「い」「う」として、そのシートの中にロボットが単語をばーーっといれました。

## いつも通りのしりとりの手順でワークフローを作成してみる

しりとりの手順はこうです。

1. 最初は「しりとり」から始める
2. ひとつ前の単語の語尾を認識する（この場合だと「り」）
3. ひとつ前の単語の語尾から始まる単語を探す（例えば「リス」）
4. 探した単語を声で発する or 文字に起こす
5. 2番へ戻る


語尾が「ん」になったら負けです。ですが、今回はそもそも語尾が「ん」のものをExcel（データベース）に記入しないような作りにしました。

## 実際に作ってみると思ったより大変だった

以下のことに注意して作成しました。

1. 語尾が「ん」のものが来たらゲーム終了（そもそもその単語をExcelにいれていないが念のため）
2. 語尾が「ー（伸ばし棒）」だったら後ろから二番目の文字をとる（「ルビー」だったら「ビ」）
3. 「ゃ」のような小さい文字が来ると「や」のように大きい文字として扱う
4. 文字だとカタカナで来る場合もあればひらがなで来る場合もある
5. 毎回違う単語が出るように、「あ」から始まる単語を書く場合は、「あ」から始まる単語をランダムで取得するようにする


簡単だろうと思って作り始めると、思ったより制約が多くてびっくりしました。（ゲームの中では制約は少ないほうだと思いますが。。。）


# おわりに

しりとりを自動化するな！という方もいらっしゃいると思います。

僕もそう思います。ゲームはゲームのままで、自動化すべきではありません。

でも、これは自分の趣味用作成しただけなので、許してくださいまし。

というわけで、次は何を作ろうかな～～
ansibleで/etc/sdoersのsecure_pathをもとの情報を壊さずに追記する

# 本記事のサマリ
ansibleでrbenvをシステムワイドでインストールして、そのままrubyのinstallもしようとしたら、sudo経由(ansible的には `become: yes` では動かなかったので、 `/etc/sdoers` のsecure_pathに、rbenvのパスを追加して、動くようにした。正規表現で頑張らずに、/etc/sdoersをgrepして上げて、なかったら追記すればよいだけの話でした。

### 対象読者
- ansibleでsecure_pathを設定する際に、正規表現で頑張ろうとしたけど、良い解決策が見つからなかった方向け

### 動作確認バージョン
`ansible --version`

```
ansible 2.7.4
  config file = None
  configured module search path = ['/Users/yukimura1227/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/Cellar/ansible/2.7.4/libexec/lib/python3.7/site-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 3.7.1 (default, Nov 28 2018, 11:51:47) [Clang 10.0.0 (clang-1000.11.45.5)]
```

### 経緯
サマリに代替書きましたが、ansibleでsecure_pathの設定をしようとしていて、rbenvがsecure_pathになかったら、他の部分を壊さずに(つまり、pyenvとかの設定があったら、それはそのままにしておく)rbenvのパスを設定しようとしたが、正規表現の否定先読み・否定後読みなどを使って、なんとかしようとしたけど、うまく行かなかったので、最終的に正規表現でがんばらんでええやん。。。ってなった。

# こうすればよい
## playbookの抜粋

```rbenv.yml
# システムワイドにrbenvをinstall
- name: git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv
  become: yes
  git:
    repo: 'https://github.com/sstephenson/rbenv.git'
    dest: /usr/local/rbenv

# /etc/profile.d/rbenv.sh に RBENV_ROOTとPATHを設定する処理を追加
- name: add rbenv initialization to profile
  template:
    src: etc/profile.d/rbenv.sh.j2
    dest: /etc/profile.d/rbenv.sh
    owner: root
    group: root
    mode: 0644
  become: yes

# /etc/sudoers のsecure_path にrbenvのパスが設定されているかをチェック
# チェックしかしないので、changedにはしない
# grepの結果が1を返却した場合(設定がなかった場合)にfailed扱いにならないように failed_whenを工夫
- name: check rbenv path to /etc/sudoers
  command: "grep ':/usr/local/rbenv/bin:/usr/local/rbenv/shims' /etc/sudoers"
  register: grep_rbenv_result
  changed_when: False # because only checking
  failed_when: grep_rbenv_result.rc not in [0, 1] # avoid failed if grep returns 1(string not exist)
  become: yes

# 前述のrbenvのパスをgrepした結果がなかったら追記する
# backrefsを使うと、\１のように、regexpでグルーピングした値を参照できる。
- name: allow rbenv on sudo
  become: yes
  when: grep_rbenv_result.rc != 0
  lineinfile:
    path: /etc/sudoers
    state: present
    regexp: '^(Defaults\s+secure_path\s*=\s*.*)'
    backrefs: yes
    line: '\1:/usr/local/rbenv/bin:/usr/local/rbenv/shims'
```

```shell:etc/profile.d/rbenv.sh.j2
if [ -d "/usr/local/rbenv/" ]; then
  export RBENV_ROOT="/usr/local/rbenv"
  export PATH=$RBENV_ROOT/bin:$PATH;
  eval "$(rbenv init -)";
fi
```
言語処理100本ノック(4本目)

#撃沈した続き

[100本ノックの4本目](https://qiita.com/seno0x00/items/e74c7ae1880d10d65efc)で何これ怖いってなった続きを書いていきます

## 04. 元素記号
"Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."という文を単語に分解し，1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字，それ以外の単語は先頭に2文字を取り出し，取り出した文字列から単語の位置（先頭から何番目の単語か）への連想配列（辞書型もしくはマップ型）を作成せよ．

## 番号を振る

```python:knock4.py
moji = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
temp= moji.split(" ")

for (i, x) in enumerate(temp,1):
    print(i, x)
```

splitでスペース区切りで配列に分けた後、1番目から列挙していくためenumerateで(temp,1)のように1,2...と番号を振っていきます

```python:実行結果
1 Hi
2 He
3 Lied
4 Because
5 Boron
6 Could
7 Not
8 Oxidize
9 Fluorine.
10 New
11 Nations
12 Might
13 Also
14 Sign
15 Peace
16 Security
17 Clause.
18 Arthur
19 King
20 Can.
```

## リストを作る
次にリストに文字を入れていきます

```python:knoc4.py
moji = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
temp1= moji.split(" ")

list = {}

for (i, x) in enumerate(temp1 ,1):
    list[x[:]] = i

print(list)
```

```python:実行結果
{'Hi': 1, 'He': 2, 'Lied': 3, 'Because': 4, 'Boron': 5, 'Could': 6, 'Not': 7, 'Oxidize': 8, 'Fluorine.': 9, 'New': 10, 'Nations': 11, 'Might': 12, 'Also': 13, 'Sign': 14, 'Peace': 15, 'Security': 16, 'Clause.': 17, 'Arthur': 18, 'King': 19, 'Can.': 20}
```

## 文字を切り取る
最後に文字を切り取ります。1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は1文字、それ以外は2文字なのでif文で処理を分けていきます


```python:knoc4.py
moji = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
temp1= moji.split(" ")
first_num = (1, 5, 6, 7, 8, 9, 15, 16, 19)

list = {}

for (i, x) in enumerate(temp1 ,1):
    if i in first_num:
        list[x[:1]] = i
    else:
        list[x[:2]] = i

print(list)
```

```python:実行結果
{'H': 1, 'He': 2, 'Li': 3, 'Be': 4, 'B': 5, 'C': 6, 'N': 7, 'O': 8, 'F': 9, 'Ne': 10, 'Na': 11, 'Mi': 12, 'Al': 13, 'Si': 14, 'P': 15, 'S': 16, 'Cl': 17, 'Ar': 18, 'K': 19, 'Ca': 20}
```

できました。
問題を最初見たとき何じゃこりゃってなりましたが、少しずつ切り分けて解いていくと良いのかなと思いました。

次回は5問目をやっていこうと思います。どれどれどんな問題……

## 05. n-gram
与えられたシーケンス（文字列やリストなど）からn-gramを作る関数を作成せよ．この関数を用い，"I am an NLPer"という文から単語bi-gram，文字bi-gramを得よ．

………えぬぐらむって何ですか？（無知グラマー）

では次回orz

#参考サイト
[note.nkmk.me](https://note.nkmk.me/python-enumerate-start/)様
[HEADBOOST](https://www.headboost.jp/python-how-to-slice-strings/)様
[鎖プログラム](https://pg-chain.com/python-list-in)様
ROSでチュートリアルをダウンロードしようとすると404エラー

#症状
研究でROSを使おうと思いurdfのチュートリアルをapt-getで手に入れようとしたところdebファイルが見つからないと怒られた。

```
$~/catkin_ws/src$ sudo apt-get install -y ros-kinetic-urdf-tutorial

パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージはアップグレードされます:
  ros-kinetic-urdf-tutorial
アップグレード: 1 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。
750 kB のアーカイブを取得する必要があります。
この操作後に追加で 0 B のディスク容量が消費されます。
エラー:1 http://packages.ros.org/ros/ubuntu xenial/main amd64 ros-kinetic-urdf-tutorial amd64 0.3.0-1xenial-20190320-182040-0800
  404  Not Found [IP: 2600:3404:200:237::2 80]
E: http://packages.ros.org/ros/ubuntu/pool/main/r/ros-kinetic-urdf-tutorial/ros-kinetic-urdf-tutorial_0.3.0-1xenial-20190320-182040-0800_amd64.deb の取得に失敗しました  404  Not Found [IP: 2600:3404:200:237::2 80]

E: いくつかのアーカイブを取得できません。apt-get update を実行するか --fix-missing オプションを付けて試してみてください。

```
#対処法
最後にapt-get updateしろって書いてあったのでおこなった。

```
sudo apt-get update

取得:7 http://packages.ros.org/ros/ubuntu xenial InRelease [4,678 B]
エラー:7 http://packages.ros.org/ros/ubuntu xenial InRelease
  公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY F42ED6FBAB17C654
4,678 B を 0秒 で取得しました (4,890 B/s)
パッケージリストを読み込んでいます... 完了
W: 署名照合中にエラーが発生しました。リポジトリは更新されず、過去のインデックスファイルが使われます。GPG エラー: http://packages.ros.org/ros/ubuntu xenial InRelease: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY F42ED6FBAB17C654
W: http://packages.ros.org/ros/ubuntu/dists/xenial/InRelease の取得に失敗しました  公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY F42ED6FBAB17C654
W: いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。
```

どうやら公開鍵でコケているみたいだったので鍵を消してからもう一度取得してapt-get updateした。

```
$ sudo apt-key del F42ED6FBAB17C654
OK
$ sudo apt-key adv --keyserver 'hkp://ha.pool.sks-keyservers.net:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
$ sudo apt-get update
```

そしてもう一度apt-get

```
$ sudo apt-get install -y ros-kinetic-urdf-tutorial
```
すると無事に成功した。
Python の__main__関連。import __main__でできること。

#目的
Pythonにおいて、以下の1行の意味の説明には、わりと最初に出会う。

```
if __name__ == '__main__':
```

これで、\_\_main\_\_の特殊性を理解するが、

すぐには説明に出会わない以下の２つの例に出会ったのでメモを残す。

　・\_\_main\_\_.pyファイルの意味
　・import \_\_main\_\_

#\_\_main\_\_.pyファイルの意味

たとえば、「pip」に関して、
以下のディレクトリに\_\_main\_\_.pyというファイルがある。
・・・・\Python37\Lib\site-packages\pip

この\_\_main\_\_.pyの作用に関しては、stackoverflowの以下の記載が参考になる。
https://stackoverflow.com/questions/4042905/what-is-main-py
翻訳して引用する。

>多くの場合、Pythonプログラムはコマンドラインで.pyファイルを指定することによって実行されます。
$ python my_program.py
コードでいっぱいのディレクトリまたはzipファイルを作成し、__ main__.pyを含めることもできます。 その後、コマンドラインでディレクトリまたはzipファイルに名前を付けるだけで、自動的に__main__.pyが実行されます。
$ python my_program_dir
$ python my_program.zip
＃または、プログラムがモジュールとしてアクセス可能な場合
$ python -m my_program
あなたのアプリケーションがこのように実行されることから利益を得ることができるかどうかあなた自身で決める必要があるでしょう。

ちなみに、内容は、以下(全文）。

```python
from __future__ import absolute_import

import os
import sys

# If we are running from a wheel, add the wheel to sys.path
# This allows the usage python pip-*.whl/pip install pip-*.whl
if __package__ == '':
    # __file__ is pip-*.whl/pip/__main__.py
    # first dirname call strips of '/__main__.py', second strips off '/pip'
    # Resulting path is the name of the wheel itself
    # Add that to sys.path so we can import pip
    path = os.path.dirname(os.path.dirname(__file__))
    sys.path.insert(0, path)

from pip._internal import main as _main  # isort:skip # noqa

if __name__ == '__main__':
    sys.exit(_main())

```

#import \_\_main\_\_ の使い方

以下の書籍で説明されている例を示す。

 Effective Python ―Pythonプログラムを改良する59項目
 Brett Slatkin (著), 石本 敦夫 (監修), 黒川 利明 (翻訳) 

製品コードとデバッグコードの使い分けとして、

```dev_main.py
TESTING = True
import db_connection
db = db_connection.Database()
```

```prod_main.py
TESTING = False
import db_connection
db = db_connection.Databese()
```

```db_connection.py
import __main__ #★★これ

class TestingDatabese(object):
    # ...

class RealDatabese(object):
    # ...

if __main__.TESTING: #★★これ
    Database = TestingDatabase
else:
    Database = RealDatabase
```

これで合理的に運用できるでしょうという説明。
しかし、**複雑なものの場合は、専用の設定ファイルへの移行と考えるべき**
とのコメントあり。


#まとめ
\_\_main\_\_に関して、理解していなかったものに出会ったので、メモを書いた。


#関連（本人）

[pythonをストレスなく使う！（generatorに詳しくなる。since1975らしい。)](https://qiita.com/enoughspacefor/items/524a76fcde2610b9da8a)
[pythonをストレスなく使う！（Pythonでは、すべてがオブジェクトとして実装されている)](https://qiita.com/enoughspacefor/items/0c6118da4c228226a65f)
[pythonをストレスなく使う！（Pylintに寄り添う)](https://qiita.com/enoughspacefor/items/df692b27bb58ca1ffa1d)
[pythonをストレスなく使う！（ExpressionとStatement)](https://qiita.com/enoughspacefor/items/1a11f553c265a2c703f2)
[英語と日本語、両方使ってPythonを丁寧に学ぶ。](https://qiita.com/enoughspacefor/items/d4b49747773e2d0285f9)

#今後
コメントなどあれば、お願いします。:candy:
勉強します、、、、
[matplotlib]サンプル２群の散布図をサンプル群ごとに色を変えて描画する

## 1.matplotlibのscatter()で散布図を描画する
```python:test.py
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.ticker import ScalarFormatter

# X軸の指数表記用Formatterクラス
class FixedOrderFormatter(ScalarFormatter):
    def __init__(self, order_of_mag=0, useOffset=True, useMathText=True):
        self._order_of_mag = order_of_mag
        ScalarFormatter.__init__(self, useOffset=useOffset, 
                                 useMathText=useMathText)
    def _set_orderOfMagnitude(self, range):
        self.orderOfMagnitude = self._order_of_mag
                                                    
#サンプル群１
lst1 = [1000000,50000,900000,20000]
df1 = pd.DataFrame()  
df1['u'] = [390000,250000,400000,5000] #x1
df1['b'] = [0.4,0.3,0.5,0.25]  #y1
df1['p'] = [x/1000 for x in lst1]

#サンプル群２
lst2 = [50000,200000,9000,160000]
df2 = pd.DataFrame()  
df2['u'] = [80000,30000,120000,50000] #x2
df2['b'] = [0.2,1.3,0.1,0.5] #y２
df2['p'] = [x/1000 for x in lst2]

#print(df1,df2)

## グラフ描画
#大枠
fig = plt.figure()
ax = fig.add_subplot(1,1,1)

#サンプル２群のプロット
ax.scatter(df1['u'],df1['b'], s=df1['p'], c='Blue',alpha=0.3)
ax.scatter(df2['u'],df2['b'], s=df2['p'], c='Red' ,alpha=0.3)

#装飾その１:表題、XY軸ラベル、X軸の目盛り
plt.title("This is a title")
plt.xlabel("x axis:u")
plt.ylabel("y axis:b")                                          
ax.xaxis.set_major_formatter(FixedOrderFormatter(4)) #指数表記:10^4 
                              
#装飾その２:グリッド
ax.grid(which='minor', alpha=0.2)                                                
ax.grid(which='major', alpha=0.5)    

```
　例えば、ページ数が8を超える群と、ページ数が４以下の群の２群のサンプルがあって、そのサンプル群のKPI(uとbとp)が３つ所与のものとした場合、uを散布図のX軸、bをY軸にした散布図は上記のようなスクリプトで描画可能。

　で、上記ではマーカーの大きさをpによって可変にしている。(<font color='blue'>scatter()の引数sで指定</font>）。当初対数logにしようかと思ったのだけれども、あまり大きさに差が出なかったので、上記では単純に1000で割っている。ここはもう少し改善の余地あり。
　またサンプル群1の色をblue、サンプル群2の色をredにしている。(<font color='blue'>scatter()の引数cで指定</font>）。あとマーカーが重なる場合があるので、透明度alphaを設定している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91974/1324cfdf-d47c-ff6e-46bc-3a499301f7a9.png)
　なお上記ではX軸のbの桁数が多いので、ゼロが横に長く並ぶのと可読性に欠けるので、[X軸を指数表記に変更している](https://qiita.com/Fortinbras/items/50500423888ef21429be)。

## 2.参考
※参考その1：
matplotlib_scatter()について
https://pythondatascience.plavox.info/matplotlib/%E6%95%A3%E5%B8%83%E5%9B%B3)

※参考その2：
media×tech「[記事のリード文にライターの自己紹介は必要か](https://www.mediatechnology.jp/entry/2019/06/19/165303)」:
→ このブログ記事では、**リード文に自己紹介あり**がサンプル群1で、**リード文に自己紹介なし**がサンプル群2で、サンプル群1とサンプル群2の、2つのサンプル群の散布図を描画している模様。
Qiitaのtagsページで特定のユーザーを非表示にするユーザースクリプト

# はじめに

Qiitaの投稿を非表示にしたいと思ったことがなかった。
どの投稿もすばらしく読み応えがあった。

そのような投稿を非表示にするなどということは考えたこともなかったが、ある投稿との出会いが発作的にユーザースクリプトを作らせた。
コメントするのもいいが、このユーザースクリプトであれば人知れず精神的に解消できることがいい :blush:

普段見ているのはtagsのページ[^tags]だが、参考にした[Qiitaのフィードから特定ユーザーの投稿を非表示にするユーザースクリプト](https://qiita.com/khsk/items/392ec147c4962caed9ca)はtagsのページに対応していないようだった。

tagsのページはQiitaがXHRでデータを取ってきている。
変更のたび毎回全チェックしたくなかったので、最後1回だけチェックするように工夫してみた :sunglasses:

tags以外のページ[^nottags]にも対応するように頑張ってみたら、Qiitaのページが統一されていなかったので`querySelector`が長くなってしまった。

このユーザースクリプトはtagsのページと他のページにも対応し、変更のたび全チェックしないように工夫したものだ。


# 動作検証環境

* Google Chrome	75
* Tampermonkey 4.8.41


# GitHubで公開中

https://github.com/querykuma/snippets/blob/master/qiita/qiitaHideNGUsers.user.js


[^tags]: https://qiita.com/tags/userscript 。
[^nottags]: @\matchで対象に指定しているページ。organizations、qiita.com、items。
Vagrantで仮想環境の立て方

## 前提条件
VirtualBoxとVagrantをインストール済み

## 必要な環境をインストールする
`$ vagrant box add 【環境の名前】 【boxURL】`
（サンプル）
`$ vagrant box add myCentos https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box`

## 環境設定ファイルを編集
プロジェクトフォルダに移動して
`$ vagrant init myCentos`
出来たVagrantfileを編集

```
# Vagrantfile ローカルのブラウザからIPアドレスでアクセスできるようにする設定を有効化
config.vm.network "private_network", ip: "192.168.33.10"
~ ~ ~
# config.vm.synced_folder "../data", "/vagrant_data" この行をプロジェクトの構成に合わせて編集（第1引数の部分が仮想環境にコピーされる）
config.vm.synced_folder "./", "/home/vagrant/src", create: true, owner: "vagrant", group: "vagrant"
```

## Vagrantの起動

```
$ vagrant up
$ vagrant ssh
```

無事起動してサーバーに入れたら、必要なものをインストールする

```
$ sudo yum install wget
$ sudo yum install npm
など
```

## ブラウザ確認
必要なものをインストール出来たら、プログラムを起動してブラウザから確認する。
（サンプル）

```
$ cd myCentos
$ node server.js
```

プログラムで設定したポートでアクセスして意図した表示がされればOK
`192.168.33.10:【ポート番号】`
Chainer と tflite でグラフ内のデータをダンプするメモ

# 背景

Chainer で学習し TensorFlow-lite で推論するための準備メモ
https://qiita.com/syoyo/items/e84d66b2a938843c1594

により, Chainer で学習したモデルを tflite に変換して推論したが, 結果が合わない.
単体の function/op 単位では chainer2tflite でテストして一致しているが, 複数の function/op を評価するところでなにかおかしいようである.

推論時の, function/op の個々の結果(output)をダンプして比較できるようにしたい.

## Chainer

Chainer では, FunctionHook 機能により, `forward` などの実行時にフック関数(コールバック関数)を使うことができます.

https://docs.chainer.org/en/stable/reference/generated/chainer.FunctionHook.html

with 構文を使ってフックを実現(with で呼ばれたときに Chainer のグローバルコンテキスト(?)に Hook を登録する)するため, モデルの定義をいじる必要がないのが特徴です.

`forward_postprocess` をフック関数として使うのがよいですが, 現状ではフック関数に input しか渡ってこないため, `forward` を呼び出し output を取得する必要があります(内部 state を変えるようなものがあると, `forward` を二回呼び出すことになるのでうまくいかないかも)

output を `forward_postprocess` に渡す PR がありますが, なかなかマージされていません.

https://github.com/chainer/chainer/pull/6252

### Chainer-TRT 

Chainer-TRT では, 上記 FunctionHook を使い, output を retain しておき, 推論が終わったあとにグラフをトラバースして中間の結果をダンプしています.

https://github.com/pfnet-research/chainer-trt


とりあえずテンソル(weight)データだけダンプできればよければ, chainer-trt を使うのが手っ取り早そうです. graph の情報は JSON で, weight の情報は簡単なフォーマットでバイナリ形式で出力されます.

ModelRetriever のコンストラクタには `verbose=True` を指定しましょう. 途中のテンソル(各 function/link の output)を出力してくれます. また, 生成されるモデルの JSON も indent が有効になり読みやすくなります.

## tflite

グラフ定義で, 中間計算結果のバッファ(テンソル)を使い回していなければ(たとえばメモリ消費を抑えるために使いまわしているとか), 推論したあとにテンソル(バッファ)のデータをダンプすればよいです.

### Python

https://www.tensorflow.org/api_docs/python/tf/lite/Interpreter

interpreter の `get_tensor_details()` でモデル内のテンソル情報を取得できます.

`get_tensor(tensor_id)` で, テンソルの配列(`numpy.ndarray`)を取得できます.

`invoke` したあとに, これら関数を呼んでダンプしましょう.

### C++

C++ の場合も, Python のように tensor のリストをダンプすればよいでしょう.
Windows 10 Version 1903 ではWPFでTargetPlatformVersionが使えない

WPFアプリ（.Net Framework）からUWP APIの Windows.Devices.Sensors を使うには、下記サイトに記載の通り、「*.csproj」に「TargetPlatformVersion」を追加します。

[Send a local toast notification from desktop C# apps - Windows UWP applications | Microsoft Docs](https://docs.microsoft.com/en-US/windows/uwp/design/shell/tiles-and-notifications/send-local-toast-desktop)

しかし、Windows 10 Version 1903 では下図のように参照マネージャーを開くと、「参照が Windows SDK に見つかりませんでした。」と表示されます。
※Windows 10 Version 1809 では上記サイトのように、一覧が表示される

![2019-07-15_161609.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460904/d57a7764-fcf9-4d7a-08e8-a6f97664d145.png)

原因は Windows 10 Version 1903 の問題のようで、下記リンク先に記載がありました。

[c# - No references were found in the windows sdk (Windows 1903) - Stack Overflow](https://stackoverflow.com/questions/56560024/no-references-were-found-in-the-windows-sdk-windows-1903)