OmniAICreator/Qiita-1.07M huggingface dataset:
【Udemy Python3入門+応用】　59. ジェネレーター

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**

##■ジェネレーター
####◆普通に記述した場合
```python
l = ['Good morning', 'Good afternoon', 'Good night']

for i in l:
    print(i)
```
```:result
Good morning
Good afternoon
Good night
```

####◆ジェネレーターを使って記述した場合
```python
def greeting():
    yield 'Good morning'
    yield 'Good afternoon'
    yield 'Good night'
    
g = greeting()

print(next(g))
print(next(g))
print(next(g))
```
```:result
Good morning
Good afternoon
Good night
```
Pythonでは、 `def` 内に `yield` があると、そのfunctionはジェネレーターとして認識される。
`next()` を用いることで、要素を1つずつ処理することができる。

これだけではあまりメリットは感じないかもしれないが、次のコードを見てみよう。

```python
def greeting():
    yield 'Good morning'
    yield 'Good afternoon'
    yield 'Good night'

g = greeting()

print(next(g))
print('run!')
print(next(g))
print('run!')
print(next(g))
```
```:result
Good morning
run!
Good afternoon
run!
Good night
```
forループを使って記述すると、最初から最後まで一気に処理が走ってしまう。
ジェネレーターを使うと、好きなタイミングで処理を一旦止めて、別の処理を走らせたりできる。
golang-migrateにてDBのマイグレーションを管理する

[golang-migrate](https://github.com/golang-migrate/migrate)を使用したマイグレーションに関して学んだのでメモ

サンプルファイルは[こちら](https://github.com/yutaiii/go-migrate-sample)

## CLI Install
[ここ](https://github.com/golang-migrate/migrate/tree/master/cmd/migrate)を参考にした

```
 brew install golang-migrate
```

確認

```
$ migrate
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]

〜略〜
```

## マイグレーションファイルを配置

```sql:1_create_table_sample.up.sql
CREATE TABLE IF NOT EXISTS
    sample_db.sample(
        id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
        name VARCHAR(255) NOT NULL,
        created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
        updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        deleted_at DATETIME DEFAULT NULL,
        PRIMARY KEY(id)
    )ENGINE=INNODB DEFAULT CHARSET=utf8mb4;
```

```sql:1_create_table_sample.down.sql
DROP TABLE IF EXISTS
    sample_db.sample;
```

## マイグレーションを実行してみる
プロジェクトのルートにいることを想定

```
migrate -source file://db/migrate -database 'mysql://root:root@tcp(127.0.0.1:13306)/sample_db' up
```

### 結果
```
1/u create_table_sample (1.090510742s)
```

エラーが出なかったらOK
これでマイグレーションファイルに記述した `sample` テーブルが作成された！
rubyにおける配列操作

# rubyにおける配列操作


オンラインプログラミングの問題を解いているときに用いた，配列操作のメソッドについてのメモ

# 目次
1. [sort ソート](#anchor1)
1. [max 最大値を取得](#anchor2)
1. [index 指定の値のインデックスを取得](#anchor3)
1. [max+index 最大値のインデックスを取得](#anchor4)
2. [concat 配列中の文字列を結合](#anchor5)
3. [join 配列の要素を結合] (#anchor6)








<a id="anchor1"></a>

# sort ソート

*array*.sort

```ruby:sort.rb
a=[3,5,1,2,4]
a.sort #昇順
# => [1, 2, 3, 4, 5]

a.sort.reverse #降順
# => [5, 4, 3, 2, 1]
```

<a id="anchor2"></a>

# max 最大値を取得

*array*.max

```ruby:max.rb
a=[0,1,2,3]
a.max
# => 3
```

<a id="anchor3"></a>

# index 指定の値のインデックスを取得

*array*.index(*val* or *string*)

```ruby:index.rb
a=["a","b","c","d"]
a.index("b")
# => 1
```

<a id="anchor4"></a>

# max+index 最大値のインデックスを取得

max=*array*.max

*array*.index(max)

```ruby:max_index.rb
a=[1,2,3,4]
max=a.max # 配列中の最大値は4
# => 4

a.index(max) # 4のインデックスは3
#  =>3
```

<a id="anchor5"></a>
# concat 配列中の文字列を結合

```ruby:array_concat.rb
a=["a","b"]
a[0].concat(a[1])
# => "ab"
```

<a id="anchor6"></a>
# join 配列の要素を結合

```ruby:array_join.rb
a=["a","b"]
a.join
# => "ab"

a.join(" ") #空白で仕切って結合
# => "a b"
```
ローカルサーバーがすでに起動していると言われてrails sできない時の対処

# 背景
何らかの理由でローカルサーバーが落ちてしまったが、内部的には起動中となっているときに再度rails sできなかった事があったのでそれを解決した時の方法  

# 対処法
* localhostのタスクを確認  
* 
```
sudo lsof -P -i:3000
```  

* 実行中のタスクidをkill

```
sudo kill -9 <pid>
```
Excelの「F1キー」（強制ヘルプ）を「F2キー」に変えてしまう。

#はじめに
Excelで作業しているときに、セルの編集でよく「F2キー」を使います。
でも間違えて隣の「F1キー」をクリックしてしまったら、、、

ヘルプがどーーん！！
キーボードから消せないいい。
シートにも戻れないいいい。

仕方なくマウスでヘルプを閉じる。。

もう2度とこんな屈辱味わいたくない。

#F1をF2キーに変える方法
マクロで簡単に無効化できます。

【手順】
１．「開発」-「マクロの記録」をクリックし、マクロ保存先を「個人用マクロブック」に変更し、OKをクリックする。
<img width="273" alt="2020-05-13_22h45_59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338998/9dadf40c-f8f7-e1ab-9e45-d261386d82af.png">

２．そのままExcelを閉じ、保存する。
<img width="263" alt="2020-05-13_23h06_43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338998/9f916ada-f299-31df-c267-30927b24b583.png">

３．再びExcelを開き、「開発」-「Visual Basic」からVBEを開き、
先ほど作ったモジュール（VBAProject-標準モジュール-Module1）を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338998/7abe39e9-6445-6973-9bf8-90716e7e83d6.png)


４．開いたら下記コードをコピペします。
> Option Explicit
Sub Click_F2()
SendKeys “{F2}”
End Sub
Sub Auto_Open
Application.OnKey “{F1}”, “Click_F2”
End Sub
<img width="713" alt="2020-05-13_23h16_25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338998/074a121f-d06f-2f54-f2ee-ef1b89a6708e.png">

５．保存して閉じれば完了です。

#最後に
これで「F1」を押しても「F2キー」扱いされるので、不意のヘルプに悩まされることが無くなりました。

同じ要領で他の不要なキーを別のキーに変えることもできますのでぜひ試してみたください。
eInk ESP-32 電子ペーパーモバイルデバイスを作ったよ（PDA)

ESP-32に電子ペーパーを搭載したモバイルデバイスを作りました。
モバイルデバイスと言っても、タッチパネルではありませんのでタブレットと言っていいのか不明です。

2006年ごろに某社で今のiPad miniの原型に近い商品の企画を立ち上げました。
しかし、中国で体調を崩し、退社したために、この企画が成就することはありませんでした
(実際に出ても売れていないと思われる）
それから10年近く経過し今回のモバイルデバイスを製作することにしました。

ちなみに、リベンジのきっかけは展示会にあった電子ペーパーデバイスを見たからです。

#仕様
####・CPU
ESP-32
####・ディスプレイ
4.2インチ電子ペーパー
####・付加機能
加速度センサー
温湿度センサー
ボタン5個
スピーカー
フルカラーLED

![IMG_1523.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/2ca64482-41e8-9e7f-d26b-2ddda4c467c4.jpeg)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/5f38bd8d-4ece-6c79-3c0b-9fccd46841f7.png)

![IMG_1521.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a5325e97-daef-f222-0f38-5278b3648341.jpeg)
![IMG_1522.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f41d370f-2464-b966-e14e-e8eb6dd5cf5c.jpeg)

動作時のLEDがきれいではないのが残念・・・

バッテリー動作時の様子です
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">eInk ESP-32 電子ペーパーモバイルデバイス<a href="https://twitter.com/hashtag/ESP32?src=hash&amp;ref_src=twsrc%5Etfw">#ESP32</a> <a href="https://twitter.com/hashtag/epaper?src=hash&amp;ref_src=twsrc%5Etfw">#epaper</a><a href="https://twitter.com/hashtag/eink?src=hash&amp;ref_src=twsrc%5Etfw">#eink</a><a href="https://twitter.com/hashtag/%E9%9B%BB%E5%AD%90%E3%83%9A%E3%83%BC%E3%83%91%E3%83%BC?src=hash&amp;ref_src=twsrc%5Etfw">#電子ペーパー</a> <a href="https://t.co/QEReqKDzF2">pic.twitter.com/QEReqKDzF2</a></p>&mdash; usashirou (@usashirou1) <a href="https://twitter.com/usashirou1/status/1260561257586802688?ref_src=twsrc%5Etfw">May 13, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Vuejs+TypeScript×Firestoreで、追加,削除,更新を行う方法メモ

# 概要
Vuejs+TypeScriptを使って、Firestoreを扱うときのメモ


#ドキュメント構成
Firestoreで下記のdocを更新したいときの方法

| フィールド論理名 | フィールド物理名  | 型 |
|:-:|:-:|:-:|
| 予算名 | name | string |
| 予算額 | cache | number |
| 色情報 | color | string |

# 画面
新規作成と編集&削除を行う画面は下の感じで作成しました。

### 新規作成画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269756/c77ffd2b-b381-5d46-e75c-4b3572cfed7b.png)

### 編集&削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269756/4364db33-e0bc-e8e8-5646-6ea46721f743.png)

#画面ソース
Vue.jsでのdataの宣言

```ts:/view/plan/edit.vue
export default class PalnEdit extends Vue{

  private plan: Plan = { id : "" , name : "" , cache : 0 , color : "#" + Math.floor(Math.random() * 16777215).toString(16) }

}
```

データベースに合わせたTypeScriptでの方を定義

```ts:Plan.d.ts
export interface Plan {
  id?: string;
  name?: string;
  cache?: number;
  color?: string;
}
```

画面での値はv-modeより受け取る

```vue
<b-form-group class="form-group">
  <b-form-input
   type="number"
   placeholder="必須項目"
   v-model="plan.cache"
   :state="validated ? valid : null"
  />
   <b-form-invalid-feedback>{{ errors[0] }}</b-form-invalid-feedback>
</b-form-group>
```
登録や更新削除ボタンに`@click:add()`等のイベントも追加しておく

#各処理のソース


### 追加
登録ボタンのイベントを定義

```ts:/view/plan/edit.vue
private add(){
    delete this.plan.id;
    firebase
      .firestore()
      .collection("plan")
      .add(this.plan)
      .then(function() {
      })
      .catch(function(error) {
      });
  }
```
### 更新
更新ボタンのイベントを定義
ドキュメントのidはurlパスから取得するように設定した。

```ts:/view/plan/edit.vue
private upd(){
      const docid = this.$route.params.id;
      const paln: Plan = this.plan;
      delete paln.id;
      firebase
        .firestore()
        .collection("plan")
        .doc(docid)
        .update(paln)
        .then(() => {

        })
        .catch(function(error) {
          console.error("Error adding document: ", error);
        }
```

### 削除
削除ボタンのイベントを定義
ドキュメントのidはurlパスから取得するように設定した。

```ts:/view/plan/edit.vue
  private del(){
    this.busy = true;
    const groupid = localStorage.groupid;
    const docid = this.$route.params.id;

    firebase
      .firestore()
      .collection("plan")
      .doc(docid)
      .delete()
      .then(function() {
      })
      .catch(function(error) {
        console.error("Error removing document: ", error);
      });
  }

```
Apple Developer Program未登録者が実機にアプリをインストールできる上限数

# はじめに
短期間にアプリを複数作成して、都度実機にインストールしようとしたら出くわした現象を簡単にまとめます。
原因は発覚済みです。

#現象
ビルド実行およびシミュレーターでの実行も問題なく出来ていたにもかかわらず、
下記のポップアップが表示され、実機にインストール出来ませんでした。

>Unable to install "アプリ名"

(画像アップロードに失敗したので、後日ということで)


#環境
試行して再現した際の環境です。

- 開発端末
    - MacBook Pro (Retina, Mid 2012)
    - macOS Catalina 10.15.4
    - Xcode version 11.4.1
- 実機
    - iPhone SE (第2世代)
    - iOS 13.4.1

#再現条件
- 同一アカウントによる作成したアプリが、実機に(既に)3つあること。
- Apple Developer Programに未登録であること(有料ライセンスなし)

#原因
Apple Developer Programに未登録であり、インストールできるアプリ上限数に達したため、
実機インストールができなかった。

Apple Developer Programでは、いつぞやから有料ライセンスがなくても
実機にインストールできるようになりました。

しかしライセンスを持っていないアカウントでは、
インストール出来るアプリケーションの数があります。

ポップアップで表示される"Details"をクリックすると、下記が表示されます。
(画像アップロードに失敗したので、後日ということで)
>The maximum number of apps for free development profiles has been reached.

#解消策
本現象を解消するためには、(パッと思い付く限り)少なくとも4つあります。

####解消策1
潔く、Apple Developer Programに登録する(有料ライセンスを取得)。

企業や個人開発者で、アプリを公開する予定があるアカウントは、登録しておくことが良いですね。

####解消策2
実機に既にインストールしている3つのアプリのうち、少なくとも1つを削除する。

上限に達してしまったのなら空きを確保する。
そうすれば、インストールすることができます。

####解消策3
(上限に達していない)他の実機にインストールする。

開発用に幾つかの端末がある環境では有効です。
(開発用なのにライセンスないのは非効率とは感じますが)

####解消策4
Apple Developer Program以外の配布サービスの活用

実機インストールの解消効率を考えれば、こちらも非効率ですが1つの策として。

#余談
私は趣味で行なっているため、解消策2にしました。
不便ではありますが。。。

また、参考サイトに以下の記載があります。
>1週間で実機にインストール出来る数に上限がある

１週間待つことはできなかったので、こちらについては確認していません。

（ってか、参考サイトはまずqiitaから探してこいよ...！)

#参考サイト
[swift 実機テストでインストールができない(teratail)](https://teratail.com/questions/252846)
[身内だけで使うiphoneアプリの公開方法(teratail)](https://teratail.com/questions/124913)
【初級】 React HooksでFirabase認証機能実装

# はじめに
React HooksでFirabase認証機能実装できたので紹介したいと思います。

## 実装した機能

- Firabaseメール認証(検証済)

- Firabase Google認証(検証済)

- Firabase Facebook認証(未検証) => Facebook developerの設定がうまくいっていないっぽい？

※一応コードは入れておきます。ちなみにFacebook認証は「HTTPS」でないと認証できないためローカル上では認証できません。

## プロジェクトダウンロード & 構築

```bash
$ git clone https://github.com/dai-570415/react-hooks-firebase-auth.git

$ cd react-hooks-firebase-auth

$ npm install

# 必要なモジュール react-router-dom, firebase
$ npm install --save react-router-dom firebase

# 以下はお好みで入れる bootstrap,reactstrap, react-loading-overlay, formik, yup
$ npm install --save bootstrap reactstrap react-loading-overlay formik yup

$ npm start
```

### Firebase.jsを編集

```js:Firebase.js
//Firebase.js

import firebase from 'firebase/app';
import 'firebase/firestore';
import 'firebase/auth';

const firebaseConfig = {
    // 各自のFirebaseキーを入れる
    apiKey: "YOUR_KEY",
    authDomain: "YOUR_KEY",
    databaseURL: "YOUR_KEY",
    projectId: "YOUR_KEY",
    storageBucket: "YOUR_KEY",
    messagingSenderId: "YOUR_KEY",
    appId: "YOUR_KEY",
    measurementId: "YOUR_KEY"
};

firebase.initializeApp(firebaseConfig);

export const db = firebase.firestore();
export default firebase;
```

以上でFirebase Authenticationに連携できるかと思います。
[Angular] ActivatedRouteまとめ

ActivatedRouteのメモです
`Angular: 9.1.6`を利用して検証しています

## 共通

紹介する各処理はこちらのコンポーネントを共通で利用します

```typescript:test.component.ts
export class TestComponent implements OnInit {

  // ActivatedRouteサービスをDIします
  constructor(private route: ActivatedRoute) { }

  ngOnInit() {
    // 各処理を記載
  }
}
```

## paramMap

- URL 
    - `http://localhost:4200/test/1`
- 実装

```typescript:app.routing.ts
const routes: Routes = [
  {path: 'test/:id', component: TestComponent},
];
```

```typescript:test.component.ts
    this.route.paramMap.subscribe( params => {
      console.log(params);
      console.log(params.get('id'));
    });
```
- 結果

|![スクリーンショット 2020-05-13 22.31.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239707/b55b2f82-99d7-aca8-72f4-95db20cdde0b.png)
|:-:|

## queryParams
クエリパラメータの取得

- URL 
    - `http://localhost:4200/test?param1=foo&param2=hoge`
- 実装

```typescript:app.routing.ts
const routes: Routes = [
  {path: 'test', component: TestComponent},
];
```

```typescript:test.component.ts
    this.route.queryParamMap.subscribe( params => {
        console.log(params);
        console.log(params.get('param1'));
        console.log(params.get('param2'));
     });
```
- 結果

|![スクリーンショット 2020-05-13 22.35.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239707/76c25045-1095-d615-450c-1953c0deaeff.png)
|:-:|

## fragment
※フラグメント、「#〜」以降の文字列

- URL 
    - `http://localhost:4200/test#param1=foo&param2=hoge`
- 実装

```typescript:app.routing.ts
const routes: Routes = [
  {path: 'test', component: TestComponent},
];
```

```typescript:test.component.ts
    this.route.fragment.subscribe( fragment => {
      console.log(fragment);
    });
```
- 結果

|![スクリーンショット 2020-05-13 22.45.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239707/f4f83b95-76d7-d644-cb5a-d15244678318.png)
|:-:|

## url

- URL 
    - `http://localhost:4200/test/1`
- 実装

```typescript:app.routing.ts
const routes: Routes = [
  {path: 'test/:id', component: TestComponent},
];
```

```typescript:test.component.ts
    this.route.url.subscribe( url => {
      console.log(url);
      console.log(url.join(' '));
    });
```
- 結果

|![スクリーンショット 2020-05-13 22.25.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239707/73964314-7350-dfba-6607-c11bc62323d4.png)
|:-:|

## data

- URL 
    - `http://localhost:4200/test`
- 実装

```typescript:app.routing.ts
const routes: Routes = [
  {path: 'test', component: TestComponent, data: {testData: 'test'}},
];
```

```typescript:test.component.ts
    this.route.data.subscribe( data => {
      console.log(data);
    });
```
- 結果

|![スクリーンショット 2020-05-13 22.26.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239707/571ac4ae-80c4-d0e7-48f2-0669b63a5bff.png)
|:-:|

---
以上です
無限スクロールする背景の作り方 [Unity2D]

# サンプル

![roop-background.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/749448a1-2907-68b4-d78f-3a464395e861.gif)

背景オブジェクト が無限にスクロールしながらカメラに追従していきます。

# 実装方法

同じ画像が横にいくつか並んでいるような背景を用意して、
カメラがある程度移動したところで背景を横にずらします。

## 背景画像サンプル
<img width="2880" alt="red-white-background.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/93b38d3b-830d-1c41-b843-f70541798886.png">

# コード

少し変な書き方かもしれないので、気になった方は手直しして使ってください。

## 色々と処理を載せたファイル

```c#

using UnityEngine;
namespace Object.Stage
{
    public class Background
    {
        Camera camera;
        float xMiddleWidth;
        SpriteRenderer sprite;
        public Background(
            SpriteRenderer sprite,
            Camera camera,
            // 連続している画像の数
            int magnifications
        )
        {
            this.camera = camera;
            this.xMiddleWidth = sprite.bounds.size.x / magnifications;
            this.sprite = sprite;
        }

        // カメラ位置と現在の背景画像位置をもとに、背景画像のX座標を更新する
        public void CheckCameraPositionAndUpdate()
        {
            float xPosition = sprite.transform.position.x;
            DirectionMap direction = CalculateDirectionToReplace(xPosition, xMiddleWidth);
            if (direction == DirectionMap.center)
                return;
            sprite.transform.position = new Vector3(
                CalculateTargetPositionX(xPosition, xMiddleWidth, direction),
                sprite.transform.position.y,
                sprite.transform.position.z
            );
        }

        // 移動先のX座標を計算する
        float CalculateTargetPositionX(float xPosition, float xMiddleWidth, DirectionMap direction)
        {
            return xPosition + ((int)direction * xMiddleWidth);
        }

        // 背景画像を動かす方向を計算する
        DirectionMap CalculateDirectionToReplace(float xPosition, float xMiddleWidth)
        {
            float xCameraPosition = camera.transform.position.x;
            if (xCameraPosition > CalculateTargetPositionX(xPosition, xMiddleWidth, DirectionMap.front))
                return DirectionMap.front;
            if (xCameraPosition < CalculateTargetPositionX(xPosition, xMiddleWidth, DirectionMap.back))
                return DirectionMap.back;
            return DirectionMap.center;
        }
    }
    enum DirectionMap : int
    {
        front = 1,
        back = -1,
        center = 0
    }
}

```

## MonoBehaviour

このファイルを背景画像コンポーネントにアタッチする。

```c#
using UnityEngine;

public class BackGround : MonoBehaviour
{
    Object.Stage.BackGround backGround;

    private void Start()
    {
        backGround = new Object.Stage.BackGround(
            GetComponent<SpriteRenderer>(), // 背景画像
            Camera.main, // 基準となるカメラ
            4 // [赤白][赤白][赤白][赤白] と4回繰り返しているので4。画像の大きさと相談しながら調整する。
        );
    }

    private void LateUpdate()
    {
        // カメラ位置と現在の背景画像位置をもとに、背景画像のX座標を更新する
        backGround.CheckCameraPositionAndUpdate();
    }
}
```

# 最後に
なんか変なことやっていましたらご指摘くださいm(_ _)m
【Rails Error】No such table userと言われた

# 【Rails Error】No such table userと言われた
あるとき、Deviseを導入した時に、こんなエラーが出た

```:terminal
> rails db:migrate
== 20190905110927 AddDeviseToUsers: migrating =================================
-- change_table(:users)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: no such table: users:
```
Userテーブルがないとお！
とはいえrails g devise userをしてもrails g model userをしても反応しないじゃないか！

無いからダメって言われて、じゃあ作ろうとしたら怒るってどんなツンデレよ..

あれこれ調べていると、

```:2019*********_add_devise_to_user.rb
class AddDeviseToUsers < ActiveRecord::Migration[6.0]
  def self.up
    change_table :users do |t|
      ## Database authenticatable
      t.string :email,              null: false, default: ""
```

なんかこのコードの３行目にchange_tableってあるぞ
なんか怪しい。
普通、正常にDeviseを導入できれば

```:20200513025737_devise_create_users.rb
class DeviseCreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""
```
このように３行目はcreate_tableのはずだ

試しにchange_tableをcreate_tableに変えると通った！！！！！！！
皆さんも同じように詰まれば試してみてください！
OutSystemsでJavaScriptからScreen Actionを起動する(Traditional Web)

ブラウザ内で動作するJavaScriptの処理を起点として、Screen Actionを動作させてみます。
（Traditional Webの場合）

# FakeNotify Widgetを使う方法
1. RichWidgetsモジュールのFakeNotify Widgetを参照に追加
2. 画面にFakeNotify Widgetを配置し、Nameを設定する
3. Javascript処理中の、Screen Actionを呼び出したい部分で、「"OsNotifyWidget('\<FakeNotify WidgetのId\>', \<パラメーター\>)"」を実行
4. FakeNotify WidgetのOn Notifyに設定したScreen Actionが起動する

Forgeで利用しているモジュールがありましたのでこれを参考に実装方法を確認します。
[Tabs With Fake Notify Widget](https://www.outsystems.com/forge/component-overview/3557/tabs-with-fake-notify-widget)

下の図が、処理の全体像です。図中の○付き数字は上の数字に対応しています。
![qJSToScreenAction_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/7576e828-914f-9558-216a-a85cb2d4700c.png)

画面左側のTabs_ClientSide Widgetのプロパティ「OnTabActivation」には、タブ選択時に動作するJavaScriptコードを指定します。
（クリックしたときに、FakeNotify WidgetのIDをパラメータにOsNotifyWidget関数を呼ぶ処理が設定されている）

OsNotifyWidget JavaScript関数にFakeNotify WidgetのIdを渡すと、該当WidgetのOnNotify（図の④）が動く。このOnNotifyのScreen ActionでNotifyGetMessageすると、第2引数で渡した値を受け取れる。
なお、この関数、_osjs.jsというOutSystemsが自動で読み込ませるファイルに定義されているんですが、APIドキュメントが見つかりません。OutSystemsが提供しているRichWidgetsが指示している方法なので多分大丈夫ですが、重要度の高いシステムでは使用を少しためらいますね。

# 見えないButton/LinkをJavaScriptでクリックする方法
1. 見えないContainer(Display=False)を画面に配置する
2. Container内に以下の要素を配置する
    1. パラメータを受け取るためのInput Widget(Nameを設定する)
    2. ButtonまたはLinke Widget(Nameを設定する)を配置し、On ClickのScreen Actionを定義
3. 任意の場所で以下のJavaScriptコードを動作させる

例として、2.1で「HiddenInput」、2.2で「HiddenButton」というNameを設定したとします。
![qJSToScreenAction_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/c0cab109-d087-896f-fc63-8c87ab2a069c.png)

このとき、Screen Actionに「テスト」という文字列を渡しつつ呼び出すには、

```js
    $('#" + HiddenInput.Id + "').val('テスト');
    $('#" + HiddenButton.Id + "').click();
```

のようにJavaScriptを実行します。
HiddenInput.Idの部分は、WidgetのNameによって、WidgetのオブジェクトからIdプロパティを取得する処理。
これによって、実行時のHTML上のIDが取得できる。

あとは、Screen Action内で、Inputに紐付いているLocal Variableからパラメータを受け取って通常通り処理可能。

サンプルとして、
https://www.outsystems.com/forge/Component_Overview.aspx?ProjectId=7064
のScreenActionFromJavaScriptを参照してください。
[3分で理解]Swiftにおけるアクセスコントロール


最近インターン先でのレビュー時に、アクセスコントロールについての指摘を受けて、普段は雰囲気で使っていたアクセスコントロールについてしっかり学び直したいと思い記事にしました！🙋‍♂️

#目次
・アクセスコントロールとは
・アクセスレベルとは
・アクセスコントロールを使うメリット
・アクセスコントロールの使い分け方法

#アクセスコントロールとは
モジュール内の型や型の要素（メゾットやプロパティ）に対する外部からのアクセスを制限する仕組み

この説明だけだとわかりにくいので、初めはswiftでコードを書く際のclass,func,let,varなどを別のファイルやモジュールでも利用できるかを指定できるって認識があれば大丈夫です。

ios開発駆け出しの人向けに説明を捕捉すると
ファイルはコードを普段書いてある場所で下記画像上でのSignUpviewControllerなどを挿します
<img width="259" alt="スクリーンショット 2020-05-08 23.40.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545228/53329d6a-fff7-117f-5371-4bfbc21f785d.png">

モジュールは配布可能なプログラムの単位でimport xxの　xx部分のライブラリなどがそれに当たります。（画像上のUIComponentなど）
<img width="207" alt="スクリーンショット 2020-05-08 23.30.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545228/62f5671b-4968-8964-062d-846eb1b294f3.png">

#アクセスレベルとは
アクセスコントロールする上での制限範囲を差します。大きく五つあり、公開範囲が広い順に
**・open**
モジュール内外の全てのアクセスを許可する

**・public**
モジュール内外の全てのアクセスを許可するが、モジュール外で継承したり、オーバーライドすることができない

**・internal**
同一モジュール内のアクセスのみを許可する(デフォルトのアクセスレベル)

**・fileprivate**
同一ソースファイル内のアクセスのみを許可する

**・private**
対象の要素が属しているスコープ内のアクセスのみを許可する



#アクセスコントロールを使うメリット
自分は基本的に大きく二つあると考えています

**・コードを書く際の検索範囲を減らす**
コードを書く上でアクセスコントロールなどを一切付けないとコードを書く時の検索候補が増えてしまうことがあります。
そうしたときにアクセスコントロールを使うことで余分な検索候補を減らすことができます。（変数にprivateをつけるなど）

**・第三者がコードを読む上で読みやすくする**   
アクセスコントロールを使うことで、メゾットやプロパティなどをより明示的に書くことができて、コードの可読性が上がります


#アクセスコントロールの使い分け
基本的に
・public（**別のモジュールで使いたい時**）

・internal(**特にアクセスレベル意識しない時**)

・private(**他から実装を隠したい時**)

の三つで使い分け、必要に応じてopen,fileprivateを使って行けばいいと思います🙆‍♂️
【Udemy Python3入門+応用】　58. ラムダ

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**

##■functionを引数に使うとき
####◆普通に記述する
```python
l = ['Mon', 'tue', 'Wed', 'Thu', 'fri', 'sat', 'Sun']

def change_words(words, func):
    for word in words:
        print(func(word))
        
def sample_func(word):
    return word.capitalize()

change_words(l, sample_func())
```
```:result
Mon
Tue
Wed
Thu
Fri
Sat
Sun
```

普通に記述するとこのようになる。

####◆ラムダを使って記述する
```python
l = ['Mon', 'tue', 'Wed', 'Thu', 'fri', 'sat', 'Sun']

def change_words(words, func):
    for word in words:
        print(func(word))

change_words(l, lambda word: word.capitalize())
```
```:result
Mon
Tue
Wed
Thu
Fri
Sat
Sun
```
引数として用いるfuncを
`lambda word: word.capitalize()`
と書くこととで、完結に記載することができる。
2020年のポータブック

#時は2020年5月13日

時は2020年5月13日、そろそろ緊急事態宣言の一部解除されるかとのニュースが流れる今日この頃。



#こんな時だからこそ

自分は在宅勤務という軟禁生活が続いていて、こんな時だからこそ持ってるガジェットを見直してみようと思った。
目についたのはキングジム社製のポータブック、Windows10では使うこともなく、2年ほど前には Windows10 Lean が出るらしいよ！など復活の期待はあったものの、空ぶってしまって、ここのまま電源入れることなく部屋の肥やしになるところであった。

#Serene Linux

んで、何をインストールするかと逡巡して Serene Linux なんかええんちゃう？ってことでインストールしてみました。

ちなみに、私はポータブックを2台持っているので、もし、Windows10に戻したいなんてことはないと思うけど、必要なドライバはもう一台からもってきたらええやんと思い、さくっと「SereneLinux Beta7 19Q4.6.6 (日付: 2020-01-29) 」をポータブックにインストールしてみました。

以前、Ubuntu18.04版を導入された方もいらっしゃって、同様の問題は発生していますが、
ぼちぼち日常使いにしていこうかと思います。（たぶん嘘）
同様の問題：特定のキーが反応しない、Bluetoothが認識しない、音が出ない等。

#感想

感想はやっぱ軽いですね。Poxxxubなんて閲覧したら、CPU使用率100%近く、メモリ使用率は88%いってまいますが、そんなね、そんな用途に使わないのであれば、フツーに使えんじゃね？と思ったりしています。

#インストールのポイント
インストールのポイント、セキュアブートは無効化にすること。
【初心者】GASでメール送信するシンプルなコード

GoogleAppsScriptからメール送信するシンプルなコードです。
メール送信自体は非常に簡単です。

#### コード
```javascript
function sendMail() {
  var recipient = 'test@example.com';
  var subject = 'test subject';
  var body = 'test body';
  var options = {
// attachments: 'an array of files to send with the email',
// bcc: 'a comma-separated list of email addresses to BCC',
// cc: 'a comma-separated list of email addresses to CC',
    cc: 'test.cc1@example.com, test.cc2@example.com'
// name: 'the name of the sender of the email (default: the user's name)',
  };

  GmailApp.sendEmail(recipient, subject, body, options);
}
```

#### 参考
[Class GmailApp](https://developers.google.com/apps-script/reference/gmail/gmail-app#sendemailrecipient,-subject,-body,-options)
pandas-profiling で IndexError: index 0 is out of bounds for axis 0 with size 0 になる

# 事象
pandas-profiling の ProfileReportを実行したら以下のエラーになって1時間くらい悩んだので備忘メモを残します。

`IndexError: index 0 is out of bounds for axis 0 with size 0 "pandas.profiling" profilereport`

# 原因
NaN と False の２値しかもたない項目があったから。
以下の記事が参考になりました。

https://github.com/pandas-profiling/pandas-profiling/issues/120
>In my case I pinned this down to column which only contains two values: NaN and False. Converting that only column to dtype float was workaround for this issue.
（NaN と False の２値しかもたない項目があると発生するよ）

# 対応策

もっといい方法がありそうですが、今回は下記で項目を特定しました。

```
# NaN と False の項目数の取得し、１つの表にする
s1 = df.isnull().sum()
s2 = (df == False).sum()
s_h = pd.concat([s1, s2], axis=1)
print(s_h)

# 全行ががFalse または Nan の行をTrueで表示
s = (s_h.sum(axis=1) == df.shape[0])
print(s)

# DataFrame型に変換し、index関数でTrue行だけを取得
_df = pd.DataFrame(s)
_df.index[_df[0]].tolist()
```

参考
df.index で文字列にマッチした（またはTrue/False）の項目値を取得する方法
https://stackoverflow.com/questions/21800169/python-pandas-get-index-of-rows-which-column-matches-certain-value
【Rails】　.where について

# はじめに

.whereについて調べたことについて自分なりにまとめておきます。


# .where

```
Post.where(title: "food")
```

titleがfoodのレコードを全て取得する

#.where.not

**NOT条件**

```
Post.where.not(title: "food")
```

titleがfood以外のレコードを全て取得する

#.where.and

**AND条件**

```
Post.where(title: "food", price: 1000)
```

titleがfood、なおかつpriceが1000のレコードを全て取得する

#.where.or

**OR条件**

```
Post.where(title: "food").or(where(price: 1000)
```

titleがfood、またはpriceが1000のレコードを全て取得する


#AND条件OR条件

```
Post.where(title: "food", price: 1000).or(Post.where(title: drink))
```

・titleがfood、なおかつpriceが1000のレコード
・またはtitleがdrinkのレコード

　を取得する


#まとめ


**・指定したレコード全てを取得する**

**・NOT条件**
　O以外のレコード全てを取得する

**・AND条件**
　OなおかつXのレコードを取得する

**・OR条件**
　OまたはXのレコードを取得する
[光-Hikari-のPython]02章-02 Pythonプログラムの基礎（文字列の取り扱い）

#[Python]02章-02 文字列の取り扱い
前回は数値同士の演算に関する説明が多かったですが、今回は文字や文字列について扱っていきたいと思います。

##文字列と連結演算子
まず、**Pythonコンソール**から以下のプログラムを入力してみてください。
すると以下のように計算結果が表示されます。

```.py
>>> print(10+20)
30
```

では次に「10+20」の部分を「'」（シングルクオーテーション）でくくって実行をしてください。

```.py
>>> print('10+20')
10+20
```

Pythonでは数値を**シングルクオーテーションでくくると、文字列として扱われます。**
**Pythonコンソール**から以下のプログラムを入力してみてください。
すると以下のように、文字の連結となります。

```.py
>>> print('10'+'20')
1020
```

ここで、+（プラス）は加算ではなく、文字列同士を連結していることになります。これを**連結演算子**と言います。

また、\*（アスタリスク）を用いると、繰り返しができます。
**Pythonコンソール**から以下のプログラムを入力してみてください。
すると以下のように、指定した数の分が表示されます。

```.py
>>> print('Yes' * 3)
YesYesYes
```

##文字列から数値への変換
**Pythonコンソール**から以下のプログラムを入力してみてください。
sという変数に'100'という文字列を代入します。（シングルクオーテーションで囲っているので文字列です）
さらに、sの内容を表示すると以下のように'100'という文字列が表示されます。

```.py
>>> s = '100'
>>> s
'100'
```

ではこの状態で、sから数値（文字列ではない）を減算します。
すると以下のようにエラーとなります。

```.py
>>> s - 10
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'str' and 'int'
```
このエラーは何を意味しているかというと、
「'str'（文字列）と'int'（整数）の演算はサポートはしていません」
という意味です。

つまり、変数sを文字列から数値にすれば計算できるということになります。
では、変換するにはどうすればよいでしょうか？
これは以下のようにして変数sに代入されている文字列を数値に変換してから、減算をします。

```.py
>>> int(s) - 10
90
```

**int関数**は整数に変換するための関数です。これにより、'100'が数値の100となり、計算されるようになります。

##数値から文字列への変換
**Pythonコンソール**から以下のプログラムを入力してみてください。
今回はprint()関数は使用しないで行きたいと思います。（使用しても構いません）

```.py
>>> 'Number is ' + 5
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
```
これも先ほどと同じで、文字列と数値の足し算（もしくは結合）はできないことを意味します。

今回は数値の5のほうを文字列に変換していきたいと思います。
**Pythonコンソール**から以下のプログラムを入力してみてください。

```.py
>>> 'Number is ' + str(5)
'Number is 5'
```

**str関数**は数値を文字列にする関数です。こうすることで結合ができることを確認できます。今回は5という数値で試しましたが、適切な数値の変数を用いても文字列に変換可能です。

##最後に
今回は文字列と数値のそれぞれの変換について触れました。よくプログラムを組んで実行する際にエラーとなるのは変換忘れが原因でなることも多いようです。
この文字列や数値の型変換はよく使われますので是非身に着けてください。
今回出てきた関数は以下の通りです。

- int()
- str()

###[【目次リンク】へ戻る](https://qiita.com/ko0821/items/379e8bd9e6ea01089419)
jetsontx2にrosをインストールしたい 

sudo apt-get install ros-kinetic-desktop-full
を実行すると、
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 ros-kinetic-desktop-full : Depends: ros-kinetic-desktop but it is not going to be installed
                            Depends: ros-kinetic-perception but it is not going to be installed
                            Depends: ros-kinetic-simulators but it is not going to be installed
                            Depends: ros-kinetic-urdf-tutorial but it is not going to be installed
E: Unable to correct problems, you have held broken packages.

というエラーになる問題で困っています。
https://qiita.com/yuki-shark/items/01e5299a9c388b21ff23
こちらの記事と同じエラーでしたので同じように解決策を実行したのですが、またしても同じエラーが発生してしまいました。
1点気になることとしては
sudo apt update
をすると
Err:42 http://ftp.jaist.ac.jp/pub/Linux/ubuntu xenial-updates/main arm64 Packages
  404  Not Found [IP: 150.65.7.130 80]
Ign:48 http://ftp.jaist.ac.jp/pub/Linux/ubuntu xenial-updates/universe arm64 Packages
Ign:52 http://ftp.jaist.ac.jp/pub/Linux/ubuntu xenial-updates/multiverse arm64 Packages
Err:60 http://ftp.jaist.ac.jp/pub/Linux/ubuntu xenial-security/main arm64 Packages
  404  Not Found [IP: 150.65.7.130 80]
Ign:66 http://ftp.jaist.ac.jp/pub/Linux/ubuntu xenial-security/universe arm64 Packages
Ign:70 http://ftp.jaist.ac.jp/pub/Linux/ubuntu xenial-security/multiverse arm64 Packages
Fetched 465 kB in 32s (14.4 kB/s)                                              
Reading package lists... Done
E: Failed to fetch http://ftp.jaist.ac.jp/pub/Linux/ubuntu/dists/xenial/main/binary-arm64/Packages  404  Not Found [IP: 2001:df0:2ed:feed::feed 80]
E: Failed to fetch http://ftp.jaist.ac.jp/pub/Linux/ubuntu/dists/xenial-updates/main/binary-arm64/Packages  404  Not Found [IP: 150.65.7.130 80]
E: Failed to fetch http://ftp.jaist.ac.jp/pub/Linux/ubuntu/dists/xenial-security/main/binary-arm64/Packages  404  Not Found [IP: 150.65.7.130 80]
E: Some index files failed to download. They have been ignored, or old ones used instead.

このようなエラーが出てくることです。

2020/05/15日修正
sudo apt-get updateの実行
→404errorの発生
→古いバージョンのubuntuを使っていると起こりやすい
→source.listの初期化


sudo apt-get install ros-kinetic-desktop-full
→エラーの発生
→ubuntu software center,other software,updatesのすべての欄にチェック

解決しました。






私の環境は以下の通りです。
【jetsontx2,jetpack3.3】
Pythonひよっこが『言語処理100本ノック 2020』に挑戦【06-09】

Pythonひよっこのわたしが、『言語処理100本ノック 2020』の第1章の後半部分に挑戦してみました。
一般の方が公開されている解答と比べながら、1問ずつ学んだことなどをまとめていきたいと思います。

こちらの続きになります。
[Pythonひよっこが『言語処理100本ノック 2020』に挑戦【00-05】](https://qiita.com/tulip_rabbit/items/4327cbb297cdc5e2eec1)

#第1章:準備運動(後半)
##06.集合
```python
#06.
##05.で作ったn-gramの関数
def n_gram(text,n):
    text_len=len(text)
    result=[]
    
    for i in range(text_len-n+1):
        result.append(text[i:i+n])
    
    return result


text1="paraparaparadise"
text2="paragraph"

X=set(n_gram(text1,2))
Y=set(n_gram(text2,2))

##和集合
print(X.union(Y))
##積集合
print(X.intersection(Y))
##差集合
print(X.difference(Y))
##'se'がXとYの和集合に入っているか
print("se" in X.union(Y))
```
union()やintersection()がセット型のみで使えるものだということを失念していたので、はじめはエラーが出てしまいました(><)
ネットで list型→set型 の方法を調べたらすぐに実装できました。

##07.テンプレートによる文生成
```python
#07.
def make_sentence(x,y,z):
    return "{}時の{}は{}".format(x,y,z)
    

x=12
y="気温"
z=22.4
print(make_sentence(x,y,z))
```
文字列メソッド format() を学びました。
型を指定せずに埋められるなんて便利です...

##08.暗号文
```python
#08.
def cipher(text):
    result=""
    
    for i in text:
        ##英小文字のとき
        if 97<=ord(i)<=122:
            result=result+chr(219-ord(i))
        ##それ以外のとき
        else:
            result=result+i
    
    return result


text="I'm 22 years old."
print(cipher(text))
```
似たようなコードをC言語でも書いたことあるな〜って思ったので、あまり悩まずに書くことができましたが、ord()関数やchr()関数を知らなかったのでそこに時間がかかってしまいました。
ほかの方の解答で、関数cipherを3行で書いているものがあってびっくりしました...わたしのコード長いですね....

##09.Typoglycemia
```python
#09.
import random

text="I couldn’t believe that I could actually understand what I was reading : the phenomenal power of the human mind ."
text_split=text.split(' ')
result=""
tmp=""

for x in text_split:
    x_len=len(x)
    
    ##単語の長さが5以上のとき
    if x_len>4:
        ###1文字目
        tmp=tmp+x[0]
        ###2文字目-
        y=x[1:x_len-1]
        tmp=tmp+"".join(random.sample(y,x_len-2))
        ##最後の文字
        tmp=tmp+x[x_len-1]
        
        result=result+tmp
        tmp=""
        
    ##単語の長さが4以下のとき
    else:
        result=result+x
    
    if x!=".":
        result=result+" "
        
print(result)
```
タイポグリセミア現象です。昔(?)2ちゃんのスレで見かけた気がします、懐かしいです。
いちいち変数tmpに入れなくても実装できますね...回りくどいコードになってしまいました。
ほかの方のスマートなコードは
『個々のパーツを作ってから、最後に(return文などで)合体させる』
という構造ですが、わたしのコードは
『先頭からひとつずつパーツを作り、何か(変数tmpや変数result)に積み上げていく』
という構造になっています。
おかげで、わたしのコードはとても冗長なコードになってしまっています....
あと、リストの引数に負の数を入れるのをもっと積極的にやっていきたいです。

#第1章のまとめ(と反省)
第1章はシンプルな構造の問題が多く、(細かい文法や関数を除けば)とくに悩むことなく手を動かすことができたと思います。
ただ、ほかの方のコードと比べてわたしのコードの冗長さが目立っていたので、そのあたりを気にしてコードを書けるようになりたいなぁって思いました。
そのあたりを意識してこれからも練習を続けます！！
Kinx アルゴリズム - 選択ソート

# アルゴリズム - 選択ソート

## はじめに

**「見た目は JavaScript、頭脳(中身)は Ruby、（安定感は AC/DC）」** でお届けしているスクリプト言語 [Kinx](https://github.com/Kray-G/kinx)。「プログラム＝アルゴリズム＋データ構造」。アルゴリズムの実装例をご紹介。

元ネタは「C言語による（30年経っても）最新アルゴリズム事典」。今回はソート（選択ソート）です。

* 参考
    * 最初の動機 ... [スクリプト言語 KINX（ご紹介）](https://qiita.com/Kray-G/items/ca08b6fb40d15dd0ec76)
        * 個別記事へのリンクは全てここに集約してあります。
    * リポジトリ ... [https://github.com/Kray-G/kinx](https://github.com/Kray-G/kinx)
        * Pull Request 等お待ちしております。  

アルゴリズムと言えばソート。選択ソート。

> 何気に実際のコードに対しては色々とアップデート（`DateTime` サポートしてみたり、CSV パーサーをサポートしてみたり、ちょこちょこと最適化してみたり）をしているのですが、機能の紹介記事が追い付いていません。軽い話題で場つなぎみたいな感じですが、今回はこれで。

## 選択ソート

* https://ja.wikipedia.org/wiki/選択ソート
    * 遅いが単純、バブルソートよりは速い
    * $O(n^2)$
    * 安定ではない

### テスト・ドライバ

テスト・ドライバコードは [前回](https://qiita.com/Kray-G/items/fe125ecbdeaf689f491c) と一緒です。

```javascript
function display(name, a) {
    System.println(name, a.map(&(e) => "%2d" % e).join(' '));
}

function demo(N, func) {
    var a = N.times(&() => Integer.parseInt(Math.random() * 100));
    display("Before: ", a);
    a = func(a);
    display("After:  ", a);
}
```

### サンプル・コード

```javascript
function selectsort(n, a) {
    var i, j, k, min;

    for (i = 0; i < n - 1; i++) {
        min = a[i];  k = i;
        for (j = i + 1; j < n; j++)
            if (a[j] < min) {  min = a[j];  k = j;  }
        a[k] = a[i];  a[i] = min;
    }
}

demo(20, &(a) => {
    selectsort(a.length(), a);
    return a;
});
```

### 結果

```
Before: 99 74  0 62 21 49 37 59  5 43 42 49 73  3 11 86 30 75  1 41
After:   0  1  3  5 11 21 30 37 41 42 43 49 49 59 62 73 74 75 86 99
```

## おわりに

元ソース（C言語）からほとんど修正していない点は合格。そして記載通り単純で実装が簡単。

ではまた、次回。
Excel addin sheet一覧

```
''' ThsisWorkBookに追加
''' ^ -> [Ctrl]
''' + -> [Shift]
''' % -> [Alt]
Private Sub Workbook_Open()
	Application.OnKey "^{s}", "Sheet一覧"
End Sub

''' [Alt]+[S]のショートカット割り当てをExcel標準に戻す
Private Sub Workbook_BeforeClose(Cancel As Boolean)
	Application.OnKey "^{s}", ""
End Sub

Private Sub sheetList_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    ActiveWorkbook.Sheets(sheetList.Value).Select
End Sub
''' シートを選択
Private Sub sheetList_Click()
    ActiveWorkbook.Sheets(sheetList.Value).Select
End Sub

Private Sub sheetList_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    ActiveWorkbook.Sheets(sheetList.Value).Select
    Unload UserForm1
End Sub

Private Sub sheetList_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Select Case KeyCode
        Case vbKeyEscape
            Unload UserForm1
        Case vbKeyReturn
            ActiveWorkbook.Sheets(sheetList.Value).Select
            Unload UserForm1
    End Select
End Sub

Private Sub UserForm_Initialize()
    For Each i In ActiveWorkbook.Sheets: sheetList.AddItem i.Name: Next i
End Sub

''' 標準モジュール
'Windows APIの構造体の定義
Private Type POINT
  x As Long
  y As Long
End Type

Private Type RECT
  Left   As Long
  Top    As Long
  Right  As Long
  Bottom As Long
End Type

Private Declare Function SetCursorPos Lib "user32" _
                          (ByVal x As Long, ByVal y As Long) As Long
                          
'フォームサイズ取得関係のAPIの宣言
Private Declare Function GetWindowRect Lib "user32" _
                          (ByVal hwnd As Long, lpRect As RECT) As Long
                          
Declare Function FindWindowA Lib "user32" (ByVal clpClassName As String, _
                                           ByVal lpWindowName As String) As Long
                          
Sub Sheet一覧()
    UserForm1.Show vbModeless
    
    Dim Mp As POINT
    Dim hwnd As Long
    Dim lpRect As RECT
    
    hwnd = FindWindowA("ThunderDFrame", UserForm1.Caption)
    
    'フォームのウィンドウのサイズを取得して構造体にセット
    GetWindowRect hwnd, lpRect
    
    '構造体よりフォームの中央の座標値を計算
    With lpRect
        lngCenterHeight = (.Bottom - .Top) \ 2 + .Top
        lngCenterWidth = (.Right - .Left) \ 2 + .Left
    End With
    
    'その座標値にマウスポインタを移動
    SetCursorPos lngCenterWidth, lngCenterHeight
    
End Sub
```
.Net Core でCOMコンポーネントを利用する

#概要

.Net Core でCOMコンポーネントを参照すると、そのままではプログラム起動時に以下の例外が発生します。
この例外の回避方法を説明します。

```
System.IO.FileNotFoundException
  HResult=0x80070002
  Message=Could not load file or assembly 'office, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'. 指定されたファイルが見つかりません。
  Source=<例外のソースを評価できません>
  スタック トレース:
<例外のスタック トレースを評価できません>
```

#回避方法

参照に追加したCOMコンポーネントのプロパティの、「ローカルにコピー」、「相互運用型の埋め込み」の両方を”はい”に設定する。
これで、例外が発生しなくなります。

確認は .Net Core 3.1で行っています。

#参考

[.NET core 3.0 and MS Office Interop](https://stackoverflow.com/questions/58130446/net-core-3-0-and-ms-office-interop#answer-58130770)
PRML　演習問題 1.25（基礎）　解答 

## 問題 1.25
> 単一の目標変数 $t$ の(1.87)の二乗損失関数のベクトル値 $\mathbf{t}$ で表される多変数の場合への以下の一般化について考える。
$$
> \mathbb{E}[L(\mathbf{t}, \mathbf{y}(\mathbf{x})] = \iint||\mathbf{y}(\mathbf{x}) - \mathbf{t}||^2p(\mathbf{x}, \mathbf{t})d\mathbf{x}d\mathbf{t}
$$
> 変分法によって、この期待損失を最小化する関数$\mathbf{y}(\mathbf{x})$が$\mathbf{y}(\mathbf{x})=\mathbb{E}_\mathbf{t}[\mathbf{t}\ |\ \mathbf{x}]$で与えられることを示せ。単一の目標変数\mathbf{t}の場合はこの結果が(1.89)に帰着されることを示せ。

## 解答
$$
G(\mathbf{y}(\mathbf{x}), \mathbf{x})=\\int||\mathbf{y}(\mathbf{x}) - \mathbf{t}||^2p(\mathbf{x}, \mathbf{t})d\mathbf{t}
$$
とおくと、
$$
\mathbb{E}[L(\mathbf{t}, \mathbf{y}(\mathbf{x})] =\int G(\mathbf{y}(\mathbf{x}), \mathbf{x})d\mathbf{x}
$$
となる。

$\mathbb{E}[L(\mathbf{t}, \mathbf{y}(\mathbf{x})]$を最小化するような$\mathbf{y}(\mathbf{x})$を$\mathbf{y}\_m(\mathbf{x})$とすると$\mathbf{y}\_m(\mathbf{x})$が満たすべき必要条件は変分法により、
$$
\frac{\partial G}{\partial \mathbf{y(\mathbf{x})}}=\\int2\ (\ \mathbf{y}\(\mathbf{x}) - \mathbf{t}\ )\ p(\mathbf{x}, \mathbf{t})d\mathbf{t}
$$
$$
\int2\ (\ \mathbf{y}\_{m}(\mathbf{x}) - \mathbf{t}\ )\ p(\mathbf{x}, \mathbf{t})d\mathbf{t}=0
$$
$$
\mathbf{y}\_m(\mathbf{x}) = \int\frac{\mathbf{t}p(\mathbf{x}, \mathbf{t})}{p(\mathbf{x})}d\mathbf{t}
$$
$$
\frac{p(\mathbf{x}, \mathbf{t})}{p(\mathbf{x})}=p(\mathbf{t}\ |\ \mathbf{x})
$$
のため
$$
\mathbf{y}\_m(\mathbf{x})=\int \mathbf{t}\ p(\mathbf{t}\ |\ \mathbf{x})d\mathbf{t}
$$
$$
=\mathbb{E}_{\mathbf{t}}[\mathbf{t}\ |\ \mathbf{x}]
$$
となる。
さらに、$\frac{\delta \mathbb{E}[L(\mathbf{t}, \mathbf{y}(\mathbf{x})]}{\delta \mathbf{y(\mathbf{x})}}=\\int2\ (\ \mathbf{y}(\mathbf{x}) - \mathbf{t}\ )\ p(\mathbf{x}, \mathbf{t})d\mathbf{t}$
であり

|$\mathbf{y}(\mathbf{x})$  |...  |$\mathbf{y}\_{m}(\mathbf{x})$  |...  |
|---|---|---|---|
|$\frac{\delta \mathbb{E}[L(\mathbf{t}, \mathbf{y}(\mathbf{x})]}{\delta \mathbf{y(\mathbf{x})}}$  |-  |0  |+  |
|$\mathbb{E}[L(\mathbf{t}, \mathbf{y}(\mathbf{x})]$  |$\searrow$  |min  |$\nearrow$  |

ここでは$\delta$は変分法を表す。よって、
$$
\mathbf{y}\_m(\mathbf{x})=\mathbb{E}\_{\mathbf{t}}[\mathbf{t}\ |\ \mathbf{x}]
$$
となる。
某×サーバ宛のdeployerが動かなくなった件

# 事件編

某×サーバへのデプロイ、deploy:vendorsタスクでエラる

エラー概要(意訳 このエラーはパッケージがPHP7.2を要求しているがオメーのPHP環境5.4だぜ！出直してこい！)

```
Loading composer repositories with package information                                                                                                                               
Installing dependencies from lock file                                                                                                                                               
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.                              
Dependency resolution completed in 0.000 seconds                                                                                                                                     
Your requirements could not be resolved to an installable set of packages.                                                                                                           
                                                                                                                                                                                   
Problem 1                                                                                                                                                                          
  - This package requires php ^7.2 but your PHP version (5.4.16) does not satisfy that requirement.                                                                                                                                                               
```

この前まではできていたはず。
なぜか急にできなくなった。
サーバのコンパネ上の設定ではPHP7.3を使う設定になっている。
これに関してはHTTPサーバの設定なのでCLIのPHPバージョンはデフォの5.4というのがよくある症状なのは知っていたし

```
set('bin/php', function () {
    return '/usr/bin/php7.3';
});
```

という感じで指定のPHPを使うように設定していた。
この設定を入れるとphp コマンドを /usr/bin/php7.3 と置き換えてくれる。
いままではこれで問題が発生しなかった。


# 調査編

```
/usr/bin/composer install --verbose --prefer-dist --no-progress --no-interaction --no-dev --optimize-autoloader --no-sug  
  gest
```

失敗したコマンドをよく見る
あれれー？おかしいぞー？

`/usr/bin/composer`

どうやらサーバー側のcomposerを使用しているようである。
おそらくこのcomposerのshebangがデフォルトのphpを指しているのであろう。
このせいで5.4のphpと認識されているようである。

# 解決編

deployerはリモートにcomposerがインストールされていれば
そのcomposerを自動的に使う。
入っていない場合はcomposer.pharをインストールしてつかう。
どうやれば強制的にcomposer.pharを使わせられるか謎だったので
ソースを見ることとする
https://github.com/deployphp/deployer/blob/master/recipe/common.php#L117
ここだ。

set('bin/composer', 'なにがし')

で上書きすることが可能そうだ。
私はめんどくさかったので

```
set('bin/composer', function () {

    run("cd {{release_path}} && curl -sS https://getcomposer.org/installer | {{bin/php}}");
    $composer = '{{bin/php}} {{release_path}}/composer.phar';


    return $composer;
});
```

こんな感じで常にcomposerをインストールするようにと書き換えることにした。

# エピローグ

~~サーバ選定がアレという件はクライアントにいってください~~
チーム開発[共同開発]の最新情報をローカルリポジトリに反映

#[コマンドの流れ]
作業中ブランチへチーム開発(GitHubの最新状況)を取り込みたい場合

```
1.git checkout master //ローカル[master]ブランチへ移動
2.git pull origin master //リモート[master]ブランチの内容をローカル[master]ブランチへ反映
3.git checkout 作業ブランチ名 //作業ブランチへ移動
4.git merge master //作業ブランチへローカル[master]ブランチの内容を反映
```
で反映されます。


#[補足]git pull origin masterとは？中身を見てみましょう
###○git pull origin master
上の`git fetch origin master`と`git merge origin master`を同時に行うコマンド
リモート[master]ブランチ→(ローカル[origin/master]→ローカル[master]ブランチ

となるため共同開発の最新状況を自分のローカルmasterブランチ上に反映させるためにgit pull origin masterコマンドを使います。

---
###・git fetch origin master
リモートから最新情報をローカルに持ってくるコマンド
場所は[master]ブランチではなく[origin/master]ブランチに取り込まれます。
[master]ブランチ・・ローカルの中心ブランチ
[origin/master]ブランチ・・ローカルにあるリモートのmasterブランチを追跡するブランチ

分かりにくいので図で以下の感じです。
https://gyazo.com/c9a78aa0342ca40b1287c762691779bb
ローカルのmasterブランチの1歩リモート寄りにorigin/masterブランチがあってここでリモートとローカルのやりとりをします。

###・git merge origin/master
git fetchでorigin/materブランチに受け取ったリモートブランチの状況をmasterブランチに反映させるコマンド

まとめると
・git getch・・リモートの[master]ブランチ→ローカル[origin/master]ブランチ
・git merge・・ローカルの[origin/master]ブランチ→ローカルの[master]ブランチ
の流れになります。



参考記事
https://qiita.com/wann/items/688bc17460a457104d7d
CSS Basic

CSSの実行方向はtop to bottom

~(tilda) next sibling
.class ~input

#2parts Property and Selector

#####property
property-name : value;
※命名規則
- 空白なし、ハイフンでつなぐ
- all small alphabet 大文字はダメ！
#####selector
ここで選択値　h1
-  # id
- .class


```
h1{
    property-name: value;
}
```


#box model
https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/The_box_model
参照
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209211/511fd483-9fe4-0396-40cb-e98010266601.png)


padding -> 増やしてもContents内容、箱のサイズが伸びるだけ
margin -> 箱の内容物はそのままで、移すだけ

順序は時計周り
↑→↓←
上右下左
Up Right Down Left

padding: 20px 10px'
-> 

```css
element.style {
    margin: 20px 10px;
    margin-top: 20px;
    margin-right: 10px;
    margin-bottom: 20px;
    margin-left: 10px;
}
```

https://www.w3schools.com/css/tryit.asp?filename=trycss_inline-block_span1
    - inline block 
        -□□□　←重なって配置すること
    - block
        - □
        - □
        - □
        - 要素が存在するところには配置できない
    - Inline
        - 全てのpropertyを削除する



#browser CSS初期化
browserが持っているdefaultを相殺するため、

```
height : 100%;
margin :0;
padding : 0;
```
#position
※static(default)の場合、top,bottom,left,rightの属性は効かない
※英語が翻訳間違った
'position:absolute' looks for the closest 'relative' parent
looks for the closest relativeのpositionを持っている一番近い親を基準としてabsoluteのものが配置される


#flex
https://developer.mozilla.org/ko/docs/Web/CSS/CSS_Flexible_Box_Layout/Flexbox%EC%9D%98_%EA%B8%B0%EB%B3%B8_%EA%B0%9C%EB%85%90
APIのみ熟知してもよい＞A<

flexは親で設定して子の配置を変える
display: flex;

flex-direction: row;(default)の場合
justifyは水平
alignは垂直
だが、flex-direction: column;になったら、逆の設定になる
justifyは垂直
alignは水平

練習ゲーム
http://flexboxfroggy.com/


#Pseudo-selector 가상셀렉터  疑似要素。。？
ムズううううう
https://developer.mozilla.org/ja/docs/Web/CSS/Pseudo-elements <- 英語と韓国語では[]そうですけど、
日本は属性セレクタと呼ぶように見える
http://www.htmq.com/csskihon/005.shtml



```css
/* 1. */
selector::pseudo-element {
  property: value;
}
/* 2. */
input[type="password"]{
}

/* 3. */
  .box:nth-child(3n+1){
    background-color: #126411;/*緑色*/
  }
```
3の結果はこんな風に
文字通り3の倍数目の箱が緑色になることを確認できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209211/f300ef34-f58c-e5ca-c8a4-8e4978e3fbb1.png)

input + .className 兄弟の
input > .className 直系のもののみ(下は反映できない) not direct child

#css-states
擬似クラス というように見えるが、こちは日本表記がちょっと難しいそう

```css{
.box:hover{
}
.box:active{
}
/*等*/
}
```

#Transitions animate
Transitions enable you to define the transition between two states of an element. 
Transitionsc statesの間で正義できるもの！
Transitions animate the properties that change between one state the another state.


https://developer.mozilla.org/en-US/docs/Web/CSS/transition


#transform:

https://developer.mozilla.org/en-US/docs/Web/CSS/transform


#animation
https://developer.mozilla.org/ko/docs/Web/CSS/animation

@keyframesでanimationを定義する

```css
@keyframes slidein {
  from { transform: scaleX(0); }
  to   { transform: scaleX(1); }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209211/e7943a73-4cdd-10ff-a517-a55270e223f9.png)


#media query
Markdownの使い方

# コンテンツ
- [ページ内リンク](#ページ内リンク)
- [ディレクトリ構成の書き方](#ディレクトリ構成の書き方)
- [引用の仕方](#引用の仕方)
- [数式の記述](#数式の記述)

# ページ内リンク
リンクは以下のように記述する．

```
[表示文字](リンクURL)
```
## 具体例
1. [タイトル](#タイトル)
2. [タイトル1.1](#タイトル11)
3. [タイトル1-1](#タイトル1-1)
4. [タイトル1 2](#タイトル1-2)

# タイトル
```
[タイトル](#タイトル)
```
# タイトル1.1
```
[タイトル1.1](#タイトル11)
```
# タイトル1-1
```
[タイトル1-1](#タイトル1-1)
```
# タイトル1 2
```
[タイトル1 2](#タイトル1-2)
```
# ディレクトリ構成の書き方


> ┣ ┠ ┝ ├
┫ ┨ ┥ ┤ 
│ ┃
─ ━
┌ ┏ ┓ ┐
└ ┗ ┛ ┘


# 引用の仕方
> 引用

```
> 引用
```
#数式の記述
```math
c=\frac{\sigma_{cr}l_{r}}{G_f}
```

````
    ```math
    c=\frac{\sigma_{cr}l_{r}}{G_f}
    ```
````
上記の記法は,VSCodeには使えない．以下の記法はVSCodeでも使える．

```
$$c=\frac{\sigma_{cr}l_{r}}{G_f}$$
```