OmniAICreator/Qiita-1.07M huggingface dataset:
mac版のzoomのダウングレード

# こちらの手法は非推奨です。
古いバージョンのzoomでは会議に参加できなくなりました。
https://pc.watch.impress.co.jp/docs/news/1255936.html
また、最新のzoomではSnap Cameraに対応しています。

## はじめに
現在(2020/04/18 15:37)mac版zoomの最新版とSnap Cameraの組み合わせでカメラを切り替えられない不具合があるようです。
https://twitter.com/search?q=zoom+snapcamera+mac

古いバージョンの利用はリスクを伴いますが、試験的に利用するためにダウングレード用の古いpkgのURLを探しました。


## 利用できました
### 4.6.19178.0323
https://d11yldzmag5yn.cloudfront.net/prod/4.6.19178.0323/Zoom.pkg

## 利用できませんでした
### 4.6.20561.0413(最新版)
April 12, 2020 Version 4.6.11 (20561.0413)
こちらのバージョンも利用できませんでした。

### 4.6.20041.0408
https://d11yldzmag5yn.cloudfront.net/prod/4.6.20041.0408/Zoom.pkg

### 4.6.19273.0402
https://d11yldzmag5yn.cloudfront.net/prod/4.6.19273.0402/Zoom.pkg

## 探し方
homebrew caskのconfig fileから特定しました。

4.6.20041.0408
https://github.com/Homebrew/homebrew-cask/blob/0c61ccb9b5/Casks/zoomus.rb
4.6.19273.0402
https://github.com/Homebrew/homebrew-cask/blob/62c4c44a7b/Casks/zoomus.rb
4.6.19178.0323
https://github.com/Homebrew/homebrew-cask/blob/fdfb7319b7/Casks/zoomus.rb

## 動作を確認した環境
* macOS Catalina 10.15.4 (19E287)
* Snap Camera 1.7.0
* zoom 4.6.8 (19178.0323)

## 追記
4/12にリリースされたバージョンでも試したところ動作しませんでした。
https://support.zoom.us/hc/en-us/articles/201361963-New-Updates-for-macOS
[Unity初級]キャラの前後左右移動

# 概要
キャラクター（３Dオブジェクト）を平面上で上下左右に移動させる。
おまけでマウス左クリックで回転します。



# 本文

```cs
void Update () {
	var x = Input.GetAxis("Horizontal");//左右
	var z = Input.GetAxis("Vertical");//上下
	var force = new Vector3(x, 0f, z);//(x, y, z)平面方向がx,z上空方向がy
	GetComponent<Rigidbody>().AddForce(force * 2000);
    if (Input.GetMouseButton(0) == true){
        this.transform.Rotate(0, 5, 0);
    }  
}
```
赤と青2つの箱（キャラクター）にスクリプトを適用して動かしてみると、土台が安定した赤い箱はしっかり動きますが、青い箱は土台が狭いため転がってしまいます。
![スクリーンショット (47).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/f18d429e-bec3-7532-1410-34c2dcb2cb4c.png)

RigidbodyのFreezeRotationのXYZ全てにチェックを入れると
![スクリーンショット (50).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/5ae4be1b-1429-1bf1-1eb9-6f3a5fda9aad.png)

物理演算による回転が禁止されて転がらなくなりました。

![スクリーンショット (51).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/f270062a-ca88-1752-e668-1eea88ec06a0.png)



（パソコンが自動でやってくれる）物理演算による回転が禁止されただけなので、コードによる命令で回転させることはできます。
マウスの左クリックをすると回転することが確認できます。
ActiveRecord::StatementInvalid (Mysql2::Error: …でサインインできない件〜備忘録〜

デプロイ後、サインインしようと思ったらRailsアプリケーションのエラーが出たためサイトに入ることができなかった。

Railsエラーログの確認

```:ターミナル
$ sudo tail -f log/production.log   
```
エラーの該当箇所

```:ターミナル 
（略）
ActiveRecord::StatementInvalid (Mysql2::Error: Incorrect string value:（略）
```

こちらの記事（こちらで解決できます。ありがとうございます。）を参考に
https://qiita.com/tomaaaaaaaaa/items/08ce75b95df3d310817a

DBの削除→アプリの再起動

エラー

```:ターミナル
（略）
$ ActiveRecord::StatementInvalid (Mysql2::Error: Table（略）  
```

マイグレーション

```:ターミナル
$ bundle exec rails db:migrate RAILS_ENV=production
```

無事マイグレーションファイルの反映。

アプリの再起動

```:ターミナル
$ kill $(cat tmp/pids/puma.pid)
$ rails s -e production
```

表示完了。:relaxed:



おしまい
Vagrant provision でディスク容量を拡張する(CentOS7)

Vagrant provision によりゲストOS(CentOS7)のディスク容量を拡張する方法です。

# 確認環境
Windows10
VirtualBox  5.2
Vagrant 2.2.0
ゲストOS  CentOS 7.2

# 経緯

Vagrant でディスク容量を拡張する方法を調べていて以下の記事を見つけました。
[Vagrantで初期にディスク拡張を自動化するプロビジョニングコードを作ってみた(制約あり)](https://qiita.com/kitamin/items/9beb58139c1d6f2f08c0)

この記事では作業途中にOS再起動を挟むため改善点として、OS再起動後に残りの処理を1回だけ自動実行する案が示されています。
さらに調べたところ以下の記事でOS起動時に1回だけ自動実行する方法がありました。

[CentOS 7起動時にプログラムを1回だけ自動実行する（RunOnceのように）](https://qiita.com/3244/items/b1f25705563da15879bd)

この2つの記事の方法を組み合わせて1回のprovisionでディスク容量を拡張できるようにしてみました。

# 方法

## 準備

Vagrantを実行できる環境があること。
vagrant-disksize プラグインがインストール済みであること。
Vagrantfileと同じフォルダに以下のファイルを用意する。(内容は後述)

- resize.sh OS再起動後に行う処理スクリプト
- resize.service OS起動時にresize.shを実行するためのservice


## スクリプトの内容

Vagrantfile

```
Vagrant.configure("2") do |config|
  config.vm.box = "centos7"
  config.vm.network "private_network", ip: "192.168.33.16" 
  config.vm.hostname = "green"
  config.disksize.size = '100GB'
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "1024"
    vb.cpus = 2
  end
  config.vm.provision "file", source: "resize.sh", destination: "/tmp/resize.sh"
  config.vm.provision "file", source: "resize.service", destination: "/tmp/resize.service"
  config.vm.provision "shell", inline: <<-SHELL

  START=$(parted -l /dev/sda | grep lvm | head -1 | awk '{ print $3 }' || exit 1)
  parted -s -a optimal /dev/sda -- mkpart primary ext4 $START 100G

  chmod +x /tmp/resize.sh
  cp /tmp/resize.service /etc/systemd/system/
  systemctl enable resize.service

  reboot
  exit 0

SHELL
end
```

config.disksize.size = '100GB' でディスクサイズを指定する。今回の例では100GB。
config.vm.provision "file" でプロビジョン時にゲストOSに resize.sh resize.service を送り込む。
parted でパーティションの処理。
次回、OS起動時にresize.sh が実行されるように resize.service を設定する。
OS再起動。

```resize.sh
#!/bin/bash

pvcreate /dev/sda3
vgextend centos /dev/sda3
lvextend -l +100%FREE /dev/mapper/centos-root
xfs_growfs /dev/mapper/centos-root
```

OS再起動後にファイルシステムの拡張などを行う。

```resize.service
[Unit]
After=network-online.target

[Service]
User=root
ExecStart=/bin/bash -c "/tmp/resize.sh \
        && /usr/bin/systemctl disable resize.service \
        && rm -f /etc/systemd/system/resize.service"

[Install]
WantedBy=multi-user.target
```

OS起動時にresize.shを起動する。その後、再度実行されないようにdisableにし、ファイルも削除する。(/tmp 配下の resize.sh などは削除していない)

# 実行

vagrant up 
するだけ。一度、OS再起動が入るので少し待つ。

ゲストOSにログインして確認してみる。

```
[root@green ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   92G  1.5G   91G   2% /
devtmpfs                 488M     0  488M   0% /dev
.....
```

# 参考

本文中にも書きましたが以下の記事を参考というかベースにさせていただきました。
[Vagrantで初期にディスク拡張を自動化するプロビジョニングコードを作ってみた(制約あり)](https://qiita.com/kitamin/items/9beb58139c1d6f2f08c0)
[CentOS 7起動時にプログラムを1回だけ自動実行する（RunOnceのように）](https://qiita.com/3244/items/b1f25705563da15879bd)
#Rails の preload では関連先テーブルの絞り込みはできず、eager_loadでは可能 ( joins / includes の違いや merge の作用を知りたい )

```rb
# preload では 自分からの検索は可能
users = User.where(id: [1,2,3,4,5]).preload(:books)

# preload では 関連先のテーブルからの検索は不可能
users = User.preload(:books).where(books: { name: "Alice Wonder Land" }).first
# ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column ...


# preload  + joins で関連先のテーブルからの検索が可能だが、 join の作用で 関連先テーブルの数だけ返ってくる結果数も多くなる
# 同じUserのインスタンスが大量に返ってきたり
# merge でも where でも書けるが、どちらでも挙動は変わらないっぽい？
users = User.joins(:books).preload(:books).where(books: { name: "Alice Wonder Land" })
users = User.joins(:books).preload(:books).merge(Book.where(name: "Alice Wonder Land" ))

# preload  + joins 
# uniq すれば User もユニークになるが、なんだか無理やりな気もする
users = User.joins(:books).preload(:books).merge(Book.where(name: "Alice Wonder Land" )).uniq

# eager_load では関連先テーブルからも検索も可能
users = User.eager_load(:books).where(books: { name: "Alice Wonder Land" })


# includes は preload と eager_load のどちらかを自動で切り替えてくれるので、関連先テーブルから検索しようとすると、eager_load と同じクエリ、同じ挙動になる
users = User.includes(:books).where(books: { name: "Alice Wonder Land" })

```

# ヒント

`.to_sql` メソッドでクエリの中身を見てみたり、そのSQLを直接 DB に発行して、返ってくるDBの結果を見てみよう。

# 参考

[ActiveRecord ～ 複数テーブルにまたがる検索（preload, eager_load, include, joins） - Qiita](https://qiita.com/leon-joel/items/f26556c9e56833983856)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3062








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ファイナンス基礎

### 基本
* 事業や企業の将来生み出す価値を現在の価値に換算して投資とかの判断基準に使う

###企業価値の出し方
* FCFを求める
    * FCF ＝ 営業利益×（1－税率）＋減価償却費－投資－△運転資本
* WACCを求める
    * WACC = rD*(1-税率)*(D/D+E)+rE*(E/D+E)
* 残存価値の求め方
    * 予測期間以降のFCFを仮定し、永久年金法などで求める
* NPV = Σ{FCF/(1+WACC)^t}

###FCF

* 予測期間は成長中の会社であれば安定すると思われる期間まで、すでに安定してる会社では5年程度が多く、それ以降は永久年金や割増永久年金を使う

###複雑なNPV算出を簡単にしてくれる式たち
* 永久年金
* 割増永久年金
* 年金型

###投資判断の手法一覧
* DCF法
* 回収期間法
* ROI
* 予測PL法

### NPVとIRR
####NPV
* NetPresentValue。初期投資分を考慮に入れた、予測期間内での事業の現在価値。

####IRR
* NPV=0となる割引率。IRR>0は必須。WACC等で出した割引率とIRRを比較し、投資判断に利用する。


####留意点
* **投資判断の際には、サンクコストや投資の是非に関わらず一定の人件費や販管費などは考慮に入れない。**
* ハードルレート
    * ハードル・レートは、債権者や株主など会社への資本提供者の期待する利回りを満たすような割引率のこと。資本コストとも。

* spreadsheetでNPV関数を使うときは、**初期投資分（-1000万とか）を関数に含めないこと。**
    * https://support.google.com/docs/answer/3093184?hl=ja

### 残存価値の求め方
* 継続法
    * 予測期間以降もキャッシュフローが一定額で続く場合
* 清算法
    * 予測期間終了時にCFがなくなると考える場合

### 税金を考慮に入れた場合のNPVの算出で気をつけること
* 減価償却費を考慮に入れる


###疑問
* FCFには直接法と間接法の二つの算出方法があり、今回のFCFの算出方法は後者。前者はより一般的な（営業CF-投資CF）で算出されるもの。より正確な企業価値算定にはどちらを利用するのが好ましいのか？
    * https://www.tabisland.ne.jp/tdb/kiso/kiso_003.htm
dockerのwordpressコンテナが落ちる原因

# 結果
プラグインやテーマが原因でコンテナが落ちることがありそうです。
自分の場合以下のようなタイポがあり
おそらくそれが何らかの形でdocker側のキャッシュに記録されてしまったような感じでした。

# タイポしてしまった部分

```misstype.php

switch ($type):
        case 'miss':
            return 'miss';
            break;
        default;//←コロンをセミコロンでタイポしている
            break;
endswitch;

get_template_part('no', 'file');//←存在しないファイルを呼び出している

```

# 状況
ローカルで運用していたwordpressコンテナが落ちるようになりました。
原因がよくわからない状態。
直前の作業はいつもやっているプラグインやテーマの編集作業でした。

# 環境
nginxプロキシコンテナ　→　wordpressコンテナ　→　mysqlコンテナをdocker-composeで運用
立ち上げ時セッティングするためDockerfile＋シェルスクリプトファイルからイメージを作成しています。

同様の環境で複数のwordpressサイトを運用しており
nginxプロキシでURL振り分けをしている。

ただし運用ルールとしてdocker-compose upするサイトは１つとし
docker container ls した際に３つ以上のコンテナが表示されることはないように運用している。

# エラーの具体的な動作
docker-compose up -d --buildで立ち上げると
wordpressのコンテナだけがrestartされ(restartは繰り返される)
ブラウザでアクセスすると502になるという現象。

# 最初に探ったこと
以前似たようなエラーの際、イメージを作り直したら治ったという経験があったので試すも改善されず。

```remake.sh

$ docker image rm wordpress
$ docker build --no-cache

```

# ２番目に探ったところ
volumeも削除して検証。(この時imageも再度削除して検証)
テストやエラーで自動生成されたよくわからない乱数volumeもこの機会に整理してみました。
[>>docker volumeの中身を確認してみました](https://qiita.com/SwuBHj8aKGqBKHet/items/0f2377fdd61b692efe84)
結果は改善されず。

# 3番目に探ったところ
docker-compose.yml
Dockerfile
docker-entrypoint.sh
apacheのconfファイル（バインドマウントで最初に読み込んでいてバーチャルホストを設定している）
全てdiff、目視で確認するも以上なし。

# 4番目に探ったところ
エラーの動きから可能性は薄いと思いながら
バインドマウントしているwp-contentを
docker-compose.ymlで指定せず立ち上げてみる。

結果立ち上がりました。。。
~~具体的な原因は現在調査中です。~~

# 最終的に解決した流れ
その後git logなどをみながら原因を探っているところ冒頭のタイポを発見。
修正しdocker-compose up -dをしたり、docker-compose build --no-cacheしたり
試すも状況は変わらず。

タイポする前までコミットを巻き戻し
docker image rm
docker volume rm
DockerFileでwordpressのバージョンをあげて立ち上げ
つまり全く違うイメージを立ち上げてみたところ
無事立ち上がるようになりました。

# 原因っぽいところ
最初に書いたタイポした部分がおそらくdockerのキャッシュに入ってしまった！？
もしかするとプラグインも関係しているかもしれません。
ヌルッと治ってしまったので原因が特定できませんでした（汗
PythonでMongoDBに接続して、条件を指定して、DataFrameに格納  

##PythonでMongoDBに接続して、条件を指定して、DataFrameに格納します。

```python:connect.py
import pymongo
import pandas as pd

client = pymongo.MongoClient('localhost', 27017)#localを想定
db = client['#db名']
co = db['#コレクション名']

query  = { "orderDatetime" : { "$gte" : "2019-11-01T00:00:00+09:00" } }
#検索条件
#keyはorderDatetime
#valueは　"2019-11-01T00:00:00+09:00" 以上("$gte")

df = pd.DataFrame(co.find(query))
Red Hat 関連


# Red Hat Customer Portal サブスクリプションをシステム側へ登録する方法

参考
`https://access.redhat.com/ja/articles/3221791`

※register時のユーザー名はログイン用のメールアドレスではない

```ruby:登録
# 使用中のシステムをRed Hat Customer Portal へ登録
subscription-manager register --username=yourusername --password=yourpassword

# 使用中のシステムをRed Hat Customer Portal へ登録
subscription-manager register --username=yourusername --password=yourpassword --auto-attach
```

```ruby:利用可能なサブスクリプション一覧
subscription-manager list --available
```

```ruby:サブスクリプションのattach
# Pool 指定
subscription-manager attach --pool=<Pool ID>

# 自動
subscription-manager attach --auto
```

```ruby:attachして利用中のサブスクリプション一覧
subscription-manager list --consumed
```

## Red Hat の特定のバージョンの AWS AMI を検索する方法。

```ruby:RedHat社の所有者IDが309956199498。
aws ec2 describe-images --owners 309956199498 --query 'Images[*].[OwnerId, ImageId, Name]' --filters "Name=name,Values=RHEL-7.1*" --output  table
-----------------------------------------------------------------------------------
|                                 DescribeImages                                  |
+--------------+---------------+--------------------------------------------------+
|  309956199498|  ami-4eee514e |  RHEL-7.1_HVM-20150803-x86_64-1-Hourly2-GP2      |
|  309956199498|  ami-b1b458b1 |  RHEL-7.1_HVM_GA-20150225-x86_64-1-Hourly2-GP2   |
+--------------+---------------+--------------------------------------------------+
```
`参考`
https://access.redhat.com/ja/solutions/274443
集中力上げはイージーゲーム！？皆さんやってる最強トレーンング

みなさん今日はいいことありましたか？(●´ω｀●)
自宅学習が増え、独学に悪戦苦闘中だと思います。

人は見られていないと欲望をどれだけでも爆発させちゃいます。
あれ？これ僕だけですか？笑(● ˃̶͈̀ロ˂̶͈́)੭ꠥ⁾⁾

ですが、自宅学習で自分の時間をコントロールしやすい、今だからこそ。
良い習慣を身につけましょう。

人生は良い習慣が左右するみたいな名言いっぱいありますよね(*^ω^*)

#瞑想やってますか？

瞑想は、回数を重ねるごとに集中力がどんどん増していき、同じ５分間でも、集中力の上昇率が増していきます。

毎日スライム倒してるのに、スライムの倒し方のコツがわかってきて、倒す度に経験値が増していくイメージですね
ゲームなら完全にぶっ壊れてますねwww

なので、瞑想ヘビロテでガンガン集中力あげちゃいましょう( ͡° ͜ʖ ͡°)
注意　みなさんご存知の赤いだるまは実在する人物で
　　　メチャクチャ長い間、瞑想していて手足が退化したそうです。

　　　適度な運動は大切ですね(☝︎ ՞ਊ ՞)☝︎

自宅学習期間でレベルアップしてやりましょう！！！
２年後シャボンディ諸島で！！！
Python #外部パッケージの利用

# パッケージとモジュール
パケージとモジュールは、ファイルとディレクトリの関係に相当する。_モジュールは単一のファイルを指し示す_のに対して、_パッケージは複数のモジュールを含む_ことができる。ファイル単位でプログラムを構造化することができる。

`Python`には標準パッケージ以外に豊富な外部パッケージが存在する。この外部パッケージはインポートして利用する。

## モジュールのインポート
~~~python:file_test1.py
def printmsg():
    print('Hello, World')
~~~
`import`文を用いることで、上記のようなファイルをモジュールとして読み込むことができる。

~~~python:test1.py
import file_test1

file_test1.printmsg()
~~~

## モジュール内の変数
モジュール内でグローバル変数を定義した際、インポート先で同一名の変数を定義したとしてもモジュール内の変数が書き換えられることはない。すなわち、モジュールで定義された変数はモジュールごとに有効である。

~~~python:file_test2.py
msg = 'Hello, World'
def printmsg:
    print(msg)
~~~

上記のファイルではグローバル変数`msg`を定義している。

~~~python:test2.py
import file_test2

msg = 'Goodbye, Python'
file_test2.printmsg()
~~~
実行結果
>Hello, World

インポート先でも変数`msg`を定義しているが、モジュール内の変数`msg`とは区別される。

## モジュールをテストする
モジュールとして使用するファイルも一つのPythonプログラムとして記述することができるため、それぞれを個別に実行することも可能である。
Pythonプログラムを個別に実行する際には、変数`__name__`に`__main__`が代入されるので、以下のようにしてテストコードを記述することができる。

~~~python:test.py
def printmsg:
    print('Hello, World')

if __name__ == '__main__':
    print('test')
~~~

## パッケージの作成
ディレクトリをパッケージ化するには、`__init__.py`という名前のファイルを作成する必要がある。`__init__.py`には変数`__all__`に含まれるモジュールの名前をリストとして記述しておく。
例えば、`__init__.py`と同じディレクトリに存在する`test3.py`と`test4.py`という名前のモジュールを一つのパッケージに含めたい場合、`__init__.py`は以下のように記述される。

~~~python:__init__.py
__all__ = ['test3.py', 'test4.py']
~~~

## パッケージ内の要素をリストアップ

パッケージに含まれる要素をリストアップしたい場合には関数`dir()`を用いれば良い。パッケージをインポートして、引数にパッケージ名を指定する。
Docker Desktop for WSL 2でApache Supersetを動かす:前編

#自己紹介
初めましてLil vizです。初投稿です。緊張してます。
Hiphopと肉をこよなく愛する35歳です。

#何を紹介するか
データの可視化は、状況を理解したり伝達するのに有効な手段ですよね。
皆様が勤めている会社にもさまざまなダッシュボードがあるのではないでしょうか。
ダッシュボードも有料なものから無料なもの、いろいろなデータベースを接続できたり、
データガバナンス、データの前処理ができるもの。色々ありますよね。。。

###有象無象ありすぎ！


私も約8年間の中でTableau, DOMO, redash, metabase, dash, detoramaなどのツールを使ってダッシュボードを一通り構築してきました。スクラッチでhtml,css.jsから作ったりもした時期もありました。複数のダッシュボードのお作法を学ぶということは学習コスト高いというか、効率悪いです。

私は自分の中でのこのダッシュボード戦争をこれで終わらせたい。これ一本に賭けます。

###Apache Superset
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105685/bfb72b77-daeb-bb5b-5915-5c13efdd4d72.png)

#Apache Supersetとは
もともとはAirbnb社内で開発されていたOSSだったのですが、いつの間にかApacheプロジェクトの仲間入りをしていました。まだincubatingといってApacheプロジェクトの仲間の中でも新入り扱いです。
下のリンクからプロジェクトに飛ぶことができます
https://superset.incubator.apache.org/index.html#

#なぜSupersetがよいのか
いくつか理由がありますが、
###1.めちゃくちゃかっこよい
個人的には一番大事なことだと思ってます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105685/1c42d4ef-6055-7630-c6f7-ffdcc8aa087a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105685/00365cc5-e5a4-b181-6e91-5a228cf6f270.png)

すでにいろんなサンプルがデフォルトで用意されていて、普通にテンションが上がります。
###2.様々なデータソースにつながる
下記のデータソースがサポートされています:

Amazon Athena
Amazon Redshift
Apache Drill
Apache Druid
Apache Hive
Apache Impala
Apache Kylin
Apache Pinot
Apache Spark SQL
BigQuery
ClickHouse
Elasticsearch
Exasol
Google Sheets
Greenplum
IBM Db2
MySQL
Oracle
PostgreSQL
Presto
Snowflake
SQLite
SQL Server
Teradata
Vertica
Hana
###網羅性エグくないすか

それ以外にも、費用が掛からないこと、大規模ユーザー向けにロードバランスできるような環境も作れたりとても良いのではないでしょうか。

後編では、実際にインストールするところまでを見ていきたいと思います。
【UE4】HUDを使用してマテリアルを画面に直接描画する方法【UI】【UnrealEngine】

ブループリントでマテリアルを直接画面に表示させる方法を紹介します。

直接画面にUIとして表示するのでマテリアルの設定をUserInterfaceにする
---
![mat.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/d13b2241-ebde-e6d5-ef01-43e5824fdf09.png)

デフォルトの設定のままだと空間の陰影の効果が付いてしまう

HUDのブループリントで描画命令を呼び出す
-------------
HUDを継承しているBlueprintの中には DrawHUDというイベントが追加できるので、
そこからDrawMaterialノードを呼び出し描画する内容を書き込めば終了。
![oya.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/33506429-7e75-5a2c-0b43-a4d2286188a0.png)

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/f9885da8-d5f2-2abe-ad0a-39fcef9f7d55.png)

結果
--
![screen.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/6af5bd37-ee80-1b0c-aef8-6010ed962e0f.png)

その他 追記
----
#####下の項目でマテリアルのUV値を書き換えれる
![uv.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/94ccdacd-8273-e479-f644-f69e4bed6c05.png)
![sc.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/3f5f11ca-8cd1-53fe-36d9-87717a45cfe5.png)


##### 描画したマテリアルの色が暗くなる

![_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/125910dd-9ef2-0e7c-4c63-c7d5fa16c3b5.png)
そのまま描画した時
![_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/449df213-bace-fbd8-4eb1-4a2cef4f2acc.png)
sRGBのチェックを外した時

この問題ですがベースとなるテクスチャの設定で sRGBのチェックを外し、マテリアル側のSamplerTypeをLinearColorに変更すれば治ると教えて頂きました。圧倒的感謝
TWELITE の簡単アプリを独自プロトコルに

# はじめに

TWELITE の標準に入っている「超簡単！標準アプリ（App_Twelite）」（以下簡単アプリ)は便利で、ちょっとしたアイデアを、TWELITE＋簡単アプリの組み合わせで実現できる。

簡単アプリのうち、「相手端末からの状態通知：ステータス 0x81」を使うと親機と子機との間でIOのリンクができる。

これは便利であるが、TWELITEがたくさんあると混信する。

周波数チャンネルやアプリケーションIDを変更するなどの解決策があるが、ここでは簡単アプリを書き換えて独自プロトコルを作ってみる。

# 方法

MWSDK/MyProjects/App_Twelite_Test/Common/Source/common.h
の
100行目

```

/*
 * シリアルコマンドの定義
 */
#define APP_PROTOCOL_VERSION 0x01 //!< プロトコルバージョン

```
を

```

/*
 * シリアルコマンドの定義
 */
#define APP_PROTOCOL_VERSION 0x82 //!< プロトコルバージョン

```

とする。

# 動作確認

2 つのTWELITE を上記のように書き換えて、親機と子機になるように配線、親機のシリアル出力を見てみます。

```

!INF MONO WIRELESS TWELITE APP V1-08-3, SID=0x810CD221, LID=0x00
!INF Default config (no save info). ..
!INF DIO --> 00000000010000000000
:78811582B181000F97001247000CB3120000FFFFFFFFFF73
:788115826C81000F9700127F000CB3130000FFFFFFFFFF7F
:788115829681000F970012B9000CB2120000FFFFFFFFFF1D
:788115829081000F970012F1000CB2130000FFFFFFFFFFEA
```

子機からの状態通知電文において、オリジナルでは

```

:78811501・・・
```
となっているところが、

```

:78811582・・・
```

となっていることがわかります。
ステータス 0x81 の受信処理において、プロトコルバージョンが異なる通信は処理しないようになっているので、これで目的に達したことになります。
【ruby】『ruby入門(メモ2)』文字列(恐竜)を表示しよう(windows10+ruby2.3.3)


###文字列表示プログラム

```ruby:ruby_string
# '' 文字列を全て出力
puts "Tyrannosaurus #{3*4}"
puts 'Tyrannosaurus #{3*4}'

print 'Tyrannosaurus_print '
#文字列おける+,*
#+:文字列の連結
puts "Tyrannosaurus "+"Rex"

#*の後ろの数字の数だけ表示
puts "Tyranosaurus "*5
```

###実行結果

```
c:\ruby_pg>ruby ruby_string.rb
Tyrannosaurus 12
Tyrannosaurus #{3*4}
Tyrannosaurus_print Tyrannosaurus Rex
Tyranosaurus Tyranosaurus Tyranosaurus Tyranosaurus Tyranosaurus
c:\ruby_pg>
```

###３．実行結果からわかること

__(1)ｐrintでは「文字列表示のみ」だがputsは「文字列の後ろに改行を出力する」__
__(2)’’(シングルコーテーション)に囲まれている文字列はそのまま出力され、””(ダブルコーテーション)は式展開されて出力される。__
__(3)文字列+文字列は文字列を連結して表示する。__
__(4)文字列*数字で指定した数字分文字列を出力する__
GUI で ubuntu の apt の取得先をミラーに変更する

# GUI で ubuntu の apt の取得先をミラーに変更する

コマンドラインによる方法は [こちら](https://qiita.com/m-tmatma/items/506ed55fc6986170e52a)

## 1. 設定アイコンを押す

※ 1 ～ 3 は `software-properties-gtk` をコマンドラインで実行するので代用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/d00eb308-75e7-3f76-edd3-826ceefb7fb9.png)

## 2. 次のページに移動する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/5185fbb5-6913-f571-a803-c228e0132a7d.png)

## 3. `Software & Up...` を押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/686ba2a5-08b1-d551-64df-1944bee4e553.png)

## 4. `Download From`  のコンボボックスをクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/19c5e445-854d-a2f8-a48e-83ed881cb251.png)

## 5. `Other...`  を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/86fbee78-21be-e632-e4ba-4826f621409e.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/a29e1590-71bd-52cf-f74b-7e868bbfbc36.png)

## 6. j を押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/36b0a168-163a-543c-7dde-afb6a051f6a8.png)

## 7. 右三角を押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/0a98dabf-ba23-2513-261c-febe13642c7e.png)

## 8. 日本のミラーサーバーを選ぶ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/bfd6df05-db56-53f3-081c-521ff52356aa.png)

## 9. `Choose Server`  を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/9104828c-4660-7b21-3d2c-ea0851f46aeb.png)

## 10. ログインユーザーのパスワードを入力して `Authenticate` を押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/624d9f12-88dd-d2bd-214d-0031ed6e626c.png)

## 11. `Close`  を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/63a129b2-cef4-b29d-458f-251c1cfb2a67.png)

## 12. `Reload`  を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/82d8efd0-39bd-5ea6-3234-d2306d357260.png)

## 13 .キャッシュの更新処理が走る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/5099755c-83cb-081a-8afe-8933ace008da.png)

## 14. `apt update -y` で更新する

選択したミラーサーバーから取得している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/ded09eed-0388-e9fa-03b8-3e901c7cd93f.png)

## 15. `/etc/apt/sources.list` の差分内容

`meld /etc/apt/sources.list.save  /etc/apt/sources.list`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/adf673ce-cda1-f8be-623b-7d20fdd3e319.png)
[Nuxt] 記事投稿後にthis.$router.pushできなかった件について

## きっかけ
railsとNuxtを使用してWebメディアもどきを作成しています。
admin画面で記事を投稿(=axiosでpost)したあとにtopへリダイレクトさせようと
`this.$router.push("/")`を記載しましたがうまく機能しませんでした。

## 問題
以下のようなコードを書いていました。

```javascript
  methods: {
    async onSubmitted(data) {
      await this.$axios
        .$post('/api/v1/articles', data)
        .then( data => {
          this.$router.push("/")
        })
        .catch(e => {
          console.log(e)
        })
    }
  }
```

axiosでpostしたあと、成功すればtopへ飛ばすという実装です。
これが飛んでくれません。

## 解決策1
data使ってないのにthenの引数にdataを渡すのもおかしいよな、と思い
普通のアロー関数`() =>`に直したところ、動きました。

```javascript
  methods: {
    async onSubmitted(data) {
      await this.$axios
        .$post('/api/v1/articles', data)
        .then( () => {
          this.$router.push("/")
        })
        .catch(e => {
          console.log(e)
        })
    }
  }
```

## 解決策2
念の為、dataを使用することもあるだろうと思い
`(引数)`としたところこちらもうまくいきました。

```javascript
  methods: {
    async onSubmitted(data) {
      await this.$axios
        .$post('/api/v1/articles', data)
        .then( (data) => {
          this.$router.push("/")
        })
        .catch(e => {
          console.log(e)
        })
    }
  }
```


## けど
アロー関数の引数ってたしか`()`省略できるんじゃなかったっけ…
=> 思い込みかと感じ調べたところ、やっぱり省略できるらしいです。
https://jsprimer.net/basic/function-declaration/

うーん、、
Leetcode 30 天挑戰, Week 2 Day 3, Min Stack, in Swift

今天也是跟 stack 有關係 :rabbit: 

## 題目

- 挑戰頁面 - <https://leetcode.com/explore/featured/card/30-day-leetcoding-challenge/529/week-2/3292/>
- 題目原頁面 - [155. Min Stack](https://leetcode.com/problems/min-stack/)

## 思維

看到 stack 類型的實作，直覺是想到用 linked list 實作，雖然這可能有點個人喜好的成份在裡面。
由於同時需要追蹤最小值，所以在 node 的基本實作中就加上一個 minValue 屬性。

### 用 Linked List 實作部分 Stack ADT

- ADT: 抽象資料型別, Abstract Data Type
- Stack ADT - <https://www.tutorialspoint.com/stack-adt-in-data-structures>

#### Linked List 的實作

Stack 有兩個基本特性：

- 需要可以快速的取的頂部的值
- 移除頂部的值，需要可以知道新的頂部的值

因此在串 linked list 的時候， 新的值或說是 node 必須放在最前面而不是最後面。因為以單向鏈結 (singly linked list) 的特性，是無法回溯前一個 node 。不過當然也可以實作雙向鏈結只是不想把解法弄的那麼複雜。

#### 追蹤最小值

由於題目期望每一個 method 的動作都是 constant time (O(1)) ，白話說就是在執行的時候希望你不要動用到任何 loop 。

因此，在每一次 push 的時候，就需要 **比較** 新的值和最小值，並 **紀錄** 下來比較出來的最新最小值。而這樣子做會有兩個好處。

- 移除 top 節點的時候，不需要再重新去找最小值。
- 因為有逐步紀錄最小值，因此可以像是 `top()`  (以 ADT 的定義的話就是 `peek()` )一樣達成 constant time 快速取得。

資料結構的部分，原先有想到拿另外一個陣列來追蹤最小值，但是這樣子需要另外一個變數來追蹤，放兩邊管就容易會產生問題，因此把它併入 Node 裡面一併紀錄。這樣就可以讓 `getMin()` 也可以享受到像是 `top()` 一樣的好處。

#### 節點的實作

以原始的 linked list 節點為基礎，幫他多加一個 minValue 的屬性。因為沒有變更的可能性，所以這邊就全部宣告為 `let` 。

``` swift
class Node<ValueType> {
    let value: ValueType
    let minValue: ValueType
    var next: Node<ValueType>?

    init(_ value: ValueType, _ minValue: ValueType) {
        self.value = value
        self.minValue = minValue
    }
}
```

## 完整的程式碼

``` swift
class MinStack {
    private var topNode: Node<Int>?

    init() {}

    func push(_ x: Int) {
        let node = Node<Int>(x, min(x, topNode?.minValue ?? Int.max))
        node.next = topNode
        topNode = node
    }

    func pop() {
        topNode = topNode?.next
    }

    func top() -> Int {
        return topNode?.value ?? 0
    }

    func getMin() -> Int {
        return topNode?.minValue ?? Int.max
    }

    class Node<ValueType> {
        let value: ValueType
        let minValue: ValueType
        var next: Node<ValueType>?

        init(_ value: ValueType, _ minValue: ValueType) {
            self.value = value
            self.minValue = minValue
        }
    }
}
```

### 複雜度分析

- 時間複雜度：每一個都是 O(1)
- 空間複雜度：如果全部都是 push ，令 n 為 push 的數量。雖然 value 和 minValue 為 2n，簡化後空間複雜度為 O(n)

### 結果

- <https://leetcode.com/submissions/detail/322705070/>

``` text
Runtime: 96 ms (94.4%)
Memory Usage: 22.9 MB
```

### 抱怨

由於 stack 可為空，所以 getMin() 和 top() 的回傳型別應該要是 Optional Int 呀！
スパコン ITO のフロントエンドで Jupyter を使う

[スパコンITO](https://www.cc.kyushu-u.ac.jp/scp/index.html) では [フロントエンド](https://www.cc.kyushu-u.ac.jp/scp/system/ITO/frontend/) を利用することで，ログインノードではできない，比較的長時間で大規模な仕事をインタラクティブに実行できます．事前に利用する資源をフロントエンド予約システム（[日本語環境](https://ito-portal.cc.kyushu-u.ac.jp/cgi-bin/reserve.ja/index.cgi?)，[英語環境](https://ito-portal.cc.kyushu-u.ac.jp/cgi-bin/reserve.en/index.cgi)）で予約します．割り当てられた `Floating IP` を用い，SSHエージェントフォワーディング と X11フォワーディング を利用して，ログインノード経由でフロントエンドノードにログインします．

予約に際しては，ハードウェアと利用形態や契約条件に応じてオプションを選択します．予約可能な最小利用時間は4時間，最大利用時間は7日間です．システムの準備に以前は1，2時間要しましたが，今は割とすぐ使えるようです．`Floating IP` はIPアドレスでメールで通知されます．

クライアント（Windows 10 Pro）の [MobaXterm](https://mobaxterm.mobatek.net/) を利用し，Chrome からフロントエンドの Jupyter （Jupyter Notebook または JupyterLab）に接続する方法を紹介します．[公式ガイド](https://www.cc.kyushu-u.ac.jp/scp/support/faq/faq008.html) の方法2です．

## 事前の準備：SSHエージェントの有効化
スパコンITOで Miniconda をローカルインストールし，仮想環境においてJupyterlab等の必要なパッケージをインストールしておきます．

[MoberXterm](https://mobaxterm.mobatek.net/) の `Settings -> Configuration -> SSH` をクリックします．一番下にある `SSH agents` の `Use internal SSH agent "MobAgent"` にチェックを入れ，その下のボックスの右にある `+` のマークをクリックし，秘密鍵を（拡張子は ppk です）追加して，`OKボタン` （`OK button`）をクリックします．
加えて，タイムアウトで SSH が切れるのを抑制するため，MobaXterm の `Settings -> Configuration -> SSH` において，`SSH keepalive` にチェックを入れておくとよいでしょう．
これらの作業は一度だけ必要です．

## 毎回の手順
メールで送られてくる，`Floating IP` は毎回異なりますが，`172.18.32.191` のようなIPアドレスです．以下ではこれを `Floating_IP` と読み替えることにします． 

### ログインノードからフロントエンドノードにSSHでログイン
ITOのログインノードのターミナルにおいて，フロントエンドノードにログインします．もし，フロントエンドノードにログインするだけでよければ，手順はこれで終わりです．

```bash
ssh -A -Y Floating_IP
# Floating_IP はメールで送られてくる，172.18.32.191 のようなIPアドレスに置換します．
```

### フロントエンドノードで Jupyter を起動
ログインしたフロントエンドノードにおいて，ブラウザを立ち上げずに（`--no-browser`） Jupyter を起動します．

```bash
# JupterLab の場合
jupyter lab --ip=127.0.0.1 --port=8888 --no-browser
# Jupyter Notebook の場合
jupyter notebook --ip=127.0.0.1 --port=8888 --no-browser
```

これにより以下のような表示が最後の方に現れます．この部分を後ほどクライアントのブラウザのURLにコピーペーストします．

```bash
[I 2022-04-24 13:39:11.990 ServerApp] http://127.0.0.1:8888/?token=...
```

### ローカルポート転送で，Jupyter へのアクセス経路を構築

MobaXterm のタブ横の `+` をクリックして，新しいローカルターミナルを開き，以下を実行します．

```bash
ssh -o ProxyCommand='ssh -W %h:%p %r@ito.cc.kyushu-u.ac.jp' Floating_IP -l Account -L 8888:localhost:8888
# Floaint_IP はメールで送られてくる，172.18.32.191 のようなIPアドレスで置換します．
# Account は m99999a のようなユーザアカウントで置換します．
```

スパコンのターミナルが現れるまで，しばらく待ちます．

### クライアントのブラウザで先のURLにアクセス

フロントエンドノードで Jupyter を起動した際に現れた URL（`http://127.0.0.1:8888/?token=...`）をクライアントのブラウザ（例えば，Windows の Chrome）の URL にペーストしてアクセスします．これで，クライアントのブラウザ内で Jupyter が起動します．少し時間がかかります．
注意： MobaXterm で URL をコピーする際は，マウスで URL を選択するだけです．Ctrl-C ではありません．
javaのコンストラクタを理解する

##はじめに
簡単なことからコツコツとjavaのアウトプットをします。
javaシルバーに合格することを目標に勉強中。

##コンストラクタとは
インスタンス化されたときに必ず実行されるメソッド
変数の初期化などに使用される。

##書き方
```
修飾子 コンストラクタ名(){
  処理内容
}
```

コンスタラクタ名はクラス名と同じになる。

##書いてみる
```Main.java
class Cat {
	String name;
	int age;
	
	//コンストラクタ
	Cat() {
		System.out.println("newされると実行されるにゃ〜");
	}
}

public class Main {
	public static void main(String[] args) {
		Cat obj = new Cat();
	}
}
```

実行結果

```
newされると実行されるにゃ〜
```

newした際にコンストラクタが正しく実行されています。

引数を渡すこともできます。

```Main.java
class Cat {
	String name;
	int age;
	
	//コンストラクタ
	Cat(String msg) {
		System.out.println("newされると実行されるにゃ〜" + msg);
	}
}

public class Main {
	public static void main(String[] args) {
		Cat obj = new Cat("ゴロゴロするにゃ〜");
	}
}
```

実行結果

```
newされると実行されるにゃ〜ゴロゴロするにゃ〜
```

##おわりに
コンストラクタを定義しなかった場合はコンパイル時にデフォルトコンストラクタが定義されます。
引数ももたず実装も空になります。

```
class Cat {
  Cat(){
  }
}
```

##参考文献
この記事は以下の情報を参考にして執筆しました。

- [オラクル認定資格教科書 Javaプログラマ Silver SE11](https://www.shoeisha.co.jp/book/detail/9784798162041)
Python #インヘリタンス（継承）

##### Python基礎

## インヘリタンス（継承）
継承元となる基底クラスの名前を`()`で指定する。
`__init__`は`Python`の予約語。
変数は`__init__`内で`self`のなかに定義する。

~~~python
class Say:
    def printHello(self, msg):
        print(msg)

class SayHello (Parent):
    def __init__(self):
        super(SayHello, self).__init__()
        self.say = 'Hello'
        self.target = 'World'

h = SayHello()
print(h.say)
print(h.target)
h.printHello(h.say + ',' + h.target)
~~~
実行結果
>Hello
>World
>Hello,World

### 多重継承
複数のクラスを基底クラスとして新しいクラスの作成ができる。
指定する順序は基底クラス間で共通のメソッドを呼び出した際に呼び出される_優先度_を意味するので重要である。

~~~python
class Howareyou:
    def printmsg(self):
        print('How are you')

class Nicetometyou:
    def printmsg(self, target):
        print('Nice to meet you, ' + self.target)

class Say(Howareyou, Nicetomeetyou):
    pass

a = Howareyou()
a.printmsg()

b = Nicetomeetyou()
b.printmsg('Python')

c = Say()
c.printmsg()
# c.printmsg('Python')    これはエラーになる。
~~~
実行結果
>How are you
>Nice to meet you, Python
>How are you
UnicodeDecodeError: 'utf-8’ codec can’t decode byte 0x91 in position 1: invalid start byte

エラー
UnicodeDecodeError: 'utf-8’ codec can’t decode byte 0x91 in position 1: invalid start byte

解決方法
df = pd.read_csv('data.csv', encoding='shift_jis')


参考記事
https://insilico-notebook.com/python-unicodedecodeerror/
Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | 授業日程(定期開催)を登録する #2

関連記事は[**「Microsoft Teams の授業での活用」**](https://qiita.com/hisaho/items/12837a169bd6f1d90d5c)をご参照ください。

#はじめに

[「Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | 授業日程を登録する #1」](https://qiita.com/hisaho/items/fa57301d79b64ced3568)　では、Teams アプリから授業日程を登録する方法を紹介しました。ここでは授業のようにある一定期間は同じ曜日の同じ時間に開催するようなイベントの登録方法に関して解説いたします。

#授業日程の登録 
- このシナリオは既にチーム(クラス)に児童・生徒が登録されている場合を想定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/48ec4ea1-cf1d-e985-9d43-39c9f03136e0.png)

- Teams アプリを起動し、画面左のメニューの**[予定表]**をクリックし、画面右上の**[新しい会議]**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/a6144785-4717-31aa-b6b5-c282f8fa4d68.png)
- **「新しい会議」**の画面が開いたら、**「タイトル」**に授業名を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/5389aacd-098e-bbc9-3734-d0c2a2b1102c.png)
- 授業の開催日時を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/955e95ae-e3a2-9a6e-4024-3ebf4fa7ad27.png)
- **[繰り返しなし]**をクリックし、プルダウンメニューが出てきたら、**[ユーザー定義]**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/b526fcb2-e3b3-bd10-49d4-0c6b7869dad3.png)
- 開始日と終了日を設定し、繰り返しは**[週]**を選択し、**[保存]**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/f1a87b03-2e94-39dd-f4fb-7ee63d9f02f5.png)
- このように**「04/13から07/27まで、毎週月曜日に開催」**と表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/2a202578-07af-dfa5-46f4-3465de4d2ca9.png)
- チャネルを追加で、授業を受講するチームの**「一般」**チャネルを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/87a72c65-a942-331d-375b-f8dd60f22d4e.png)
- 最後に画面右上の**[保存]**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/224557d6-6c53-e933-8f94-28cd2115642c.png)

#ハッピーマンデーで授業日程を変更したいとき
ハッピーマンデーで授業日を変更する手順を解説します。
-　カレンダーで、授業日を変更したい日時を表示し、表示されいる授業をダブルクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/d6764080-5d94-cb04-43c7-700aa5c406c7.png)
- スケジュールの詳細が表示されますが、この予定は定期開催の予定ではなくその日の予定となっています。定期開催の予定を見たい場合には、**[定期的な予定を表示]**をクリックしてください。※ここでは5/4のスケジュールのみを変更したいので、**[定期的な予定を表示]**はクリックしません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/049cb2fa-2585-a151-6d55-85dc4ee43f1b.png)
-ここで開催日時を変更すると、5/4の設定のみが変更されます。
-定期開催の日程を全部変更したい場合には、、**[定期的な予定を表示]**をクリックしてから予定を変更してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/dc0cb22b-8e52-cd05-24eb-fa06686b53d4.png)



-
macOSでの開発に欠かせないHomebrewパッケージマネージャー　yumやapt-getのmac版?

# はじめに
CentOSでは[yum](https://ja.wikipedia.org/wiki/Yellowdog_Updater_Modified)、Ubuntuでは[apt](https://ja.wikipedia.org/wiki/APT)でアプリのパッケージ管理をしていると思います。macOSでもLinuxのようなコマンドや開発ツールを使うためにパッケージマネージャーがあります。

[Homebrew](https://brew.sh/index_ja.html)というツールでyumやapt-getのように使う事ができます。

## Homebrewとは

Rubyでできているパッケージ管理ソフトです。Ruby開発はもちろん、PythonやNode.jsもパッケージが用意されています。ホームページに用意されている[パッケージの一覧](https://formulae.brew.sh/formula/)があります。あまりやらないとは思いますが、macOSにnginxやmysqlのインストールも可能です。

# Homebrewのインストール

## 環境

- OS: macOS Catalina バージョン 10.15.4 |
- Xcode: バージョン 11.4(11E146)

## Xcodeのインストール
<img width="148" alt="スクリーンショット 2020-04-11 10.07.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434973/92510bf7-3281-f47e-1d08-cf812c6dc35f.png">

Homebrewを使用するためにはmacOS標準の[Xcode](https://apps.apple.com/jp/app/xcode/id497799835?mt=12)が必要です。

App Storeからダウンロードしてインストールしてください。1GB以上有るのでダウンロードにまあまあ時間かかります。

インストール後は一度アプリを起動して規約に同意する必要があります。

## Homebrewのインストール

```
% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```
ターミナルを開いて下記のコマンドを入力します。

``` install.sh
Press RETURN to continue or any other key to abort
Password:
```
と聞かれるのでリターンキーを入力して、パスワードを入力。

``` install.sh
==> Installation successful!

==> Homebrew has enabled anonymous aggregate formulae and cask analytics.
Read the analytics documentation (and how to opt-out) here:
  https://docs.brew.sh/Analytics
No analytics data has been sent yet (or will be during this `install` run).

==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
  https://github.com/Homebrew/brew#donations

==> Next steps:
- Run `brew help` to get started
- Further documentation: 
    https://docs.brew.sh
```
Installation successful!と表示されたらインストール成功です。

# Homebrewのコマンド
| コマンド | 機能 |
|---|---|
| brew help | ヘルプ表示 | 
| brew search [パッケージ名] | パッケージを検索 |
| brew info [パッケージ名] | パッケージのバージョンなど情報表示 |
| brew install [パッケージ名] | パッケージのインストール |
| brew update | パッケージ全体のアップデート |
| brew upgrade [パッケージ名] | 指定パッケージのアップグレード |
| brew uninstall [パッケージ名] | 指定パッケージのアンインストール |
| brew list | インストールされているパッケージ表示 |

パッケージがあるかどうかをsearchで調べてinstallするのがよいと思います。

# 試しにHomebrewでインストールしてみる

ここではwegetをインストールしてみます。

```
% brew install wget
```
これでインストール完了です。

```
% wget https://google.com/
```
Homebrewで提供していないパッケージはコンパイルしてインストールという方法になります。
Vue.js コンポーネント入門

## コンポーネントとは

- ページを構成するUI部品
- 再利用可能なVueインスタンス
- HTMLのテンプレートとJavaScriptのロジックを持つ

## Vue.jsのコンポーネントの特徴

- 再利用ができる
- メンテナンス性が高まる
- テンプレートとJavaScriptが1つのセットになっていて管理がしやすい

## コンポーネント定義（グローバル）

`Vue.component`メソッドで生成されたコンポーネントは全てのVueインスタンスから利用できる

第一引数に`コンポーネント名`、第二引数の`template`に表示させるテンプレートを記述する。

また、コンポーネントはVueインスタンス生成よりも前に定義する

```js:js
Vue.component('hello-component', {
  template: '<p>Hello</p>'
  })

// インスタンス生成より上に記述

var app = new Vue({
  el: '#app',
})
```

HTMLにタグを挿入してコンポーネントの表示ができる

```html:html
<!-- <p>Hello</p> -->
<hello-component></hello-component>
```

## コンポーネント定義（ローカル）

特定のVueインスタンス配下でしか利用できないように`ローカル定義`もできる

定義したコンポーネントは`components`オプションに定義することにより利用できる



また、グローバルでの定義と同様、Vueインスタンス生成よりも前に定義する

```js:js
var helloComponentLocal = {
  template: '<p>Hello</p>'
}

var app = new Vue({
  el: '#app',
  components: { // 利用するタグ : 定義した変数
    'hello-component-local': helloComponentLocal
  }
})
```

```html:html
<!-- <p>Hello</p> -->
<hello-component-local></hello-component-local>
```

## コンポーネント名のルール

ハイフンを一つ以上含む`ケバブケース`を利用する必要がある

```html
<vue-component></vue-component> <!-- OK -->

<component></component>       <!-- NG -->
<vueComponent></vueComponent> <!-- NG -->
```

将来的に追加されるHTMLタグと衝突しないように`ケバブケース`を採用しているらしい

## コンポーネントオプション

以下のようなボタンをクリックするとクリック数をカウントするコンポーネントがあるとする

```js
Vue.component('button-counter', {
  data: function () {
    return {
      count: 0
    }
  },
  template: '<button v-on:click="count++">{{ count }}</button>'
})
```

```html
<!-- クリック数のカウントは、各コンポーネントが独自に保有できる -->
<button-counter></button-counter>
<button-counter></button-counter>
<button-counter></button-counter>
```

**各インスタンスが独自のデータを利用できる**

コンポーネントが作成されるたびに、新しいインスタンスが作成されるので、各インスタンスが独自のデータオブジェクトを利用できるようになる

同じコンポーネントでも、各インスタンスが独自のデータを利用できるように`data`は関数である必要がある

**いろんなオプション使えるよ**

その他にも`new Vue()`する時と同じオプションが利用できる
※`el`のようなルート保有のオプションを除く

### 補足

テンプレートのルート要素は`単一`である必要がある

複数の要素を使用したい時は`div`タグなどで囲う必要がある

複数の要素でコンポーネントを定義したい時はテンプレートリテラル使うと便利

```js
template:
  `<div> <!-- テンプレートリテラルも使える -->
    <span>count: </span><button v-on:click="count++">{{ count }}</button>
  </div>`
```


## まとめ

コンポーネント楽しい:v:
Rails チュートリアル　9.31: 永続的セッションのテスト

個人的にわかりづらいと思ったのでテストを付け足し。


```ruby
  test "current_user returns nil when remember digest is wrong" do
    @user.update_attribute(:remember_digest, User.digest(User.new_token))
    assert_nil current_user
  end

```

update_attributeでremember_digestを変更したらそりゃfalseになるよね、
remember_digestが一致しないんだからnilが返ってくるよねって話。

```ruby


  test "current_user returns nil when remember digest is wrong" do
    assert @user.authenticated?(@user.remember_token)
    @user.update_attribute(:remember_digest, User.digest(User.new_token))
    assert_not @user.authenticated?(@user.remember_token) 
    assert_nil current_user
  end
```
MacでCronを動かす

#はじめに
定期的にスクレピングしたいものがあったので、定期実行しようと思ってcronを使用しました。

#cronを動かす

```bash:terminal
# 何も設定していない人は何も記述されていない状態からスタートします
$ crontab -e
~                                                                                                                                                          
~                                                                                                                                                          
~                                                                                                                                                          
~                                                                                                                                                          
~                                                                                                                                                          
~                                                                                                                                                          
~                                                                                                                                                          
~                                                                                                                                                          
~  
```

#cronの記述方法

```bash:crontabコマンド入力後の画面
# (分)(時)(日)(月)(曜) (実行したいコマンド)
# 例) 毎日午前8時にPuppeteerのスクレピングファイルを実行したい
0 8 * * * /usr/local/bin/node [実行したいファイルの絶対パス]
```

- **`*`** : 全ての値(トランプでいうジョーカ的役割)


##注意点
**▶︎ `/bin/sh: ～～: command not found`エラー**

`which`でコマンドの絶対パスを確認して、絶対パスで記述する必要がある

```bash:terminal
# NG
# crontab設定
0 8 * * * node [実行したいファイルの絶対パス]

# OK
$ which node
/usr/local/bin/node

# crontab設定
0 8 * * * /usr/local/bin/node [実行したいファイルの絶対パス]
```


#番外編
**ログを出力してあげる**

```bash:terminal
$ crontab -e

0 8 * * * /usr/local/bin/node 
[実行したいファイルの絶対パス] >> [出力したいログファイルの絶対パス] 2>&1
```
Redmineで件数を取得するスクリプト

■Redmineで件数を取得するスクリプト

```javascript:sample.js
    //URLを指定
    var arrayURL = [
        "https://www.redmine.org/projects/redmine/issues?query_id=84",
        "https://www.redmine.org/projects/redmine/issues?query_id=1"
    ]        

    //件数を取得
    $.each(arrayURL,function(index,element){
      $.ajax({
        url: element, 
        type:'GET',
        datatype: 'html',
        cache: false
        })
        .done(function(data){
            //件数を取得
            var buff = $(data).find('.items').text();    
            var total = buff.substring(buff.indexOf("/")+1,buff.indexOf(")"));
            document.write("<li>"+total+"</li>");
//            console.log("件数:"+total);
        })
        .fail(function(data) {
            alert('Error');
        });
      });
```

○注意点
下記手順で実行すること。
１．ChromeでstrUrlに指定しているURLにアクセスする
２．Chrome開発者ツール上でsample.jsのコードを実行する
※上記手順でないとクロスドメインのエラーが出る。
`test.html:1 Access to XMLHttpRequest at 'https://www.redmine.org/projects/redmine/issues?query_id=84&_=1586578917844' from origin 'null' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.`
Lagom with Scalaやってく！【その1:環境構築】

こんにちわ！gakuです。
ひっさしぶりに新しいFWと格闘しています。
その名も「lagom」!

Golang+ginでDDDでCQRSな実装をしていたのですが、どうしても辛いところが出てきたため、なんか良いのないかな〜と思って探していたところlagomと出会いました。
まだ、全く理解できておらず、日本語文献も皆無に等しいので、自分の備忘録程度に記載していければと思ってます。

## モチベーション
@negokaz さんのこちらの動画がものすごくわかりやすかったので、こちらの動画を元にし勉強していきたいと思ってます。
https://crash.academy/video/59/341

## 環境
・JDK11(AdoptOpenJDK11)
・sbt 1.3.9
・Intellij

## HelloWorld
「lagom/lagom-scala.g8」にHelloWorkdテンプレートがあるので以下コマンドでPJを作成します。

```
sbt new lagom/lagom-scala.g8
[info] Loading global plugins from /Users/gaku/.sbt/1.0/plugins
[info] Set current project to gaku3601 (in build file:/Users/gaku/src/github.com/gaku3601/)
[info] Set current project to gaku3601 (in build file:/Users/gaku/src/github.com/gaku3601/)
name [Hello World]: study lagom
organization [com.example]: 
version [1.0-SNAPSHOT]: 
package [com.example.studylagom]: 

Template applied in /Users/gaku/src/github.com/gaku3601/./study-lagom
```

Intellijで展開すると自動で依存ライブラリをinstallしてくれます。数分かかりますが、気長に待ちます。

## デバッグ設定
Run/Debug Configureでこんな感じで設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47132/173af703-15c5-178f-14cb-6ce0907671ea.png)

## 実行
実行ボタンをクリックし、立ち上がったら「src/main/scala/com/example/studylagom/api/StudyLagomService.scala」のコメント部にあるcurlコマンドを叩きます。

```
gakumbp:study-lagom gaku$ curl http://localhost:9000/api/hello/Alice
Hello, Alice!
````
なんか返ってきます！

ここまでのコードはここに置いときます
https://github.com/gaku3601/study-lagom/tree/step1

## おわり
はい。まだ何もわかってません。新しい知見をキャッチでき、やる気があればシリーズ化したいと思います。
Ubuntu 18.04 に Cmake の Latest Release をインストールする

# 前置き
Ubuntu 18.04 に CMake の Latest Release をインストールする方法をメモとして残しておきます。

# 実行環境
```
$ uname -a
Linux JetsonNano 4.9.140-tegra #1 SMP PREEMPT Mon Dec 9 22:47:42 PST 2019 aarch64 aarch64 aarch64 GNU/Linux
```

# CMake の Latest Release のインストール
https://cmake.org/install/ を参考にしました。

まず、https://cmake.org/download/ から CMake のソース **Unix/Linux Source (has \n line feeds)** をダウンロードし、解凍します。以下、CMake Latest のバージョンに関する部分は、https://cmake.org/download/ を参考に適宜変更して下さい。

```
$ wget https://github.com/Kitware/CMake/releases/download/v3.17.1/cmake-3.17.1.tar.gz
$ tar zxvf cmake-3.17.1.tar.gz
```

次に、ダウンロードしたソースをビルドします。

```
$ cd cmake-3.17.1/
$ ./bootstrap
$ make
$ sudo make install
```

# CMake のパスを通す

```
$ echo 'export PATH=$HOME/cmake-3.17.1/bin/:$PATH' >> ~/.bashrc
$ source ~/.bashrc
```

# CMake のバージョンの確認

```
$ cmake --version
cmake version 3.17.1

CMake suite maintained and supported by Kitware (kitware.com/cmake).
```
.NetFreamwork4.0以上の環境で2.0dll参照時の設定

## 概要
個人的メモ。
.NetFreamwork4.0での開発時にビルドが通らず。
.NetFreamwork2.0で作成しているdllを参照していたのが原因の様子。
対策を調査し対応

## エラー内容

1.「ファイルまたはアセンブリ '***'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。」

２:FileLoadException:「混合モード アセンブリはバージョン 'v2.0.50727' のランタイムに対して作成されており、追加の構成情報がないと 4.0 ランタイムでは読み込めません。」

## 回避策
ソリューションを開き「app.config」に追記

```vb:appconfig.vb
<startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
</startup>
```


## 参考サイト

[混合モードアセンブリはバージョンのランタイムに対して作成されており、追加の構成情報がないと 4.0 ランタイムでは読み込めません。](http://bellyoshi.b.osdn.me/2014/09/19/%E6%B7%B7%E5%90%88%E3%83%A2%E3%83%BC%E3%83%89%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%AA%E3%81%AF%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%AE%E3%83%A9%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0/)
Djangoで複数のモデルオブジェクトをランダムに取得する方法

# 開発環境
- Python 3.7.3
- Django 3.0.5

※Class-Basedで開発していきます。

# 一番簡単な書き方

```python:views.py
from django.views.generic import ListView

from .models import SampleModel


class SampleListView(ListView):
    model = SampleModel

    def get_queryset(self):
        return SampleModel.objects.order_by('?')[:5]

```

- ```.order_by('?')``` オブジェクトの並び順をランダムにする
- ```[:5]``` 配列の先頭から５番目まで（[0]~[4]）スライス

# ちょっと長い書き方

```python:views.py
from django.views.generic import ListView

from .models import SampleModel

import random


class SampleListView(ListView):
    model = SampleModel

    def get_queryset(self):
        pks = SampleModel.objects.values_list('pk', flat=True)
        pks_list = list(pks)
        pks_random = random.sample(pks_list, 5)
        queryset = SampleModel.objects.filter(pk__in=pks_random)

        return queryset

```

- ```.values_list('pk', flat=True)``` 各オブジェクトのpk値だけリストで取得
- ※```flat=True```を指定しないと、タプルのリスト "([ ], [ ], )" が返ってきます。
- ```list(pks)``` あくまでQuerySetのリストが生成されるので純粋なリストに変換
- ```random.sample(pks_list, 5)``` 取得したpk値リストからランダムに５つ選択
- ```.filter(pk__in=pks_random)``` ランダムに選択した５つのpk値を持つオブジェクトを取得

# 最後に

以上の２つよりスマートな書き方があれば、コメントで教えてください。
JupyterLab 自分用メモ

# Jupyter Notebookの先頭

```
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import japanize_matplotlib
import scipy.stats as st

def plt_legend_out(frameon=True):
    plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0, frameon=frameon)
```

```
plt.rcParams['font.size'] = 15
```

```
from IPython.display import HTML

HTML('''
<script>  
code_show=true; 
function code_toggle() {
  if (code_show){
    $(\'div.input\').hide();
  } else {
    $(\'div.input\').show();
  }
  code_show = !code_show
}  
$( document ).ready(code_toggle);
</script>
<form action="javascript:code_toggle()">
    <input type="submit" value="Toggle code">
</form>
''')
```

# マル秘マーク

```
<font size="5"><div align="right"><span style="border: 1px solid red; color: red">秘</span></div></font>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278468/5d0526ef-0b43-9ff6-401f-40b5ffff8f3c.png)

# LaTeX

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278468/db705057-4f23-7b82-adc4-eef265a652e7.png width=500>

```
$
f(x)=
\left(
\begin{array}{ccc}
  f_1(x) \\
  f_2(x)
\end{array}
\right)=
\left(
\begin{array}{ccc}
  x^3-2y \\
  x^2+y^2-1
\end{array}
\right)=
\left(
\begin{array}{ccc}
  0 \\
  0
\end{array}
\right)
$
```

# Python 自作関数

有効桁数を3桁に

```
def sig_dig(x):
    return np.float('%s' % np.float('%.3g' % x))
```

# ggplot

文字の大きさのデフォルト値

```
theme_set(theme_bw(base_size = 20))
```

グラフの大きさ

```
options(repr.plot.width=7, repr.plot.height=4)
```
Windows 10 の PowerShell から Android の Termux に SSH 接続したメモ

遅ればせながら Termux という Android のアプリを見つけ、Windows の PowerShell から接続してみたので、その時のメモを投稿します。（自分メモです）

# 秘密鍵を準備
今回、Android 及び Windows とは、異なる Linux 環境で鍵ファイルを作成しました。

`ssh-keygen -t rsa` で秘密鍵を作成（ファイル名を「digno」としました）
鍵ファイルは、`.ssh`ディレクトリに作成されるので、`ls .ssh`とすると、秘密鍵（digno）と公開鍵（digno.pub）が作成されているのが確認できます。

秘密鍵は Windows へ、公開鍵は Andoid へそれぞれ配置します。具体的な配置方法は、今回省略します。

# Android での作業
Termux を Android にインストールします。
Termux で `termux-setup-storage`を実行し、Android のダウンロードフォルダへのシンボリックリンクを作成します。この作業は、公開鍵の配置に役立てました。
Termux で openssh をインストールします。
公開鍵を`cat ./storage/downloads/digno.pub >> .ssh/authorized_keys`で取込みます。
`sshd`でデーモンを起動します。

# Windows 10 PowerShell で ssh 接続
`.ssh`フォルダに秘密鍵を配置します。
`> ssh -p 8022 -i .ssh\digno %AndroidのIPアドレス%`で接続します。

### Windows 10 での ssh コマンドの簡素化
`ssh`コマンドので秘密鍵ファイルの指定を省略したい場合、`.ssh\config`を作成します。

```text:.ssh\config
Host %AndroidのIPアドレス%
  Hostname %AndroidのIPアドレス%
  IdentityFile ~/.ssh/digno
```
`> ssh -p 8022 %AndroidのIPアドレス%`で接続できるようになります。
この設定は、鍵ファイルが複数存在する場合、接続先と秘密鍵ファイルの対応を定義するため、今後は接続先だけ記憶しておけば良いことになります。