OmniAICreator/Qiita-1.07M huggingface dataset:
Tikzで描く例

こんな図を描きたいとする。

![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6734/ef671c01-a83d-83f3-07c3-2241627d91aa.png)

使うパッケージ

```latex
\usepackage{tikz}
\usetikzlibrary{intersections, calc, arrows}
```

黒塗り三角形を２つ横に並べるコードを描いた。
計算にはcalcを用いた。

# コマンド定義
三角形を描くコマンドを作った。座標を定義して、座標間の関係を定義してfillで塗っている。

```latex
\newcommand{\myTriangle}[1]{
\coordinate (myA) at ($#1+(0,0)$);
\coordinate (myB) at ($#1+(1,1)$);
\coordinate (myC) at ($#1+(2,0)$);
\fill (myA)--(myB)--(myC)--cycle;}
```

#　Tikzの本体

tikzpictureのbeginとend内に諸々の命令を描いていく。

```latex
\begin{tikzpicture}
...
\end{tikzpicture}
```

# ベクトルの定義

ベクトルを定義して、三角形をそのベクトルを足すことで場所を定義

```latex
\coordinate (R) at (2,0);
\coordinate (U) at (0,1);
\coordinate (LD) at (-1,-1);
\coordinate (RD) at (1,-1);

\coordinate (A) at (0,0);
\coordinate (B) at ($(A)+3*(R)$);
\coordinate (C) at ($(A)+3*0.5*(R)+4*(U)$);
```

# 三角形の描画
コマンドを用いて三角形を描画

```latex
\myTriangle{(A)}
\myTriangle{(B)}
\myTriangle{(C)}
```

# 足の描画
ベクトルを足し引きすることで足の座標を指定し、線を引く

```latex
\draw ($(A)+0.5*(R)+1*(U)$) -- ($(C)$);
\draw ($(B)+0.5*(R)+1*(U)$) -- ($(C)+(R)$);
\draw ($(A)$) -- ($(A)-0.5*(R)-4*(U)$);
\draw ($(A)+(R)$) -- ($(A)+(R)+0.5*(R)-4*(U)$);
\draw ($(B)$) -- ($(B)-0.5*(R)-4*(U)$);
\draw ($(B)+(R)$) -- ($(B)+(R)+0.5*(R)-4*(U)$);
```

うまく定義すれば複雑な描画もできるようになる。
【ふくだ学習録】サブスクリプション part3【44日目】

# ふくだ学習録とは？
ふくだが学習したことの備忘録。
目に見える形で残すことによってやる気を出す個人的な作戦です。
他人に見せるように書いているわけではないので、すごく読みにくいです。

### 読了した本
[データベースエンジニア養成読本 [DBを自由自在に活用するための知識とノウハウ満載!]](https://www.amazon.co.jp/dp/4774158062/ref=cm_sw_r_tw_dp_U_x_FPphEbQFPPQRM )
[ゼロから作るDeepLearning](https://www.amazon.co.jp/dp/4873117585/ref=cm_sw_r_tw_dp_U_x_y3UiEbF3P6EG7)
[PHPフレームワーク CakePHP 3入門](https://www.amazon.co.jp/dp/4798048577/ref=cm_sw_r_tw_dp_U_x_.YIjEbS1K4JY2)
[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/ref=cm_sw_r_tw_dp_U_x_XlokEbJQK2N7P )
[Docker入門](https://www.amazon.co.jp/dp/480071091X/ref=cm_sw_r_tw_dp_U_x_xVlmEbN8ZTHZK)
[PHPフレームワーク Laravel入門](https://www.amazon.co.jp/dp/4798052582/ref=cm_sw_r_tw_dp_U_x_zzeyEbJBSQ5Y0 )


### 今読んでいる本

[サブスクリプション](https://www.amazon.co.jp/dp/B07HY1TND9/ref=cm_sw_r_tw_dp_U_x_lp4NEb3EEGD7Y)

# 第8章 所有から利用へ - あらゆるビジネスに広がる成長機会

### ペットケア業界
他の消費者向けパッケージ販売の分野よりも早く成長していっている。ペットフードの小売業界は、デジタル・ペットヘルス・サービス企業へ変わっていっている。

### 公益事業（電気・ガス・水道）
新しい技術のおかげで、供給に合わせて需要を調整できるようになってきている。（逆ではない）
太陽光発電住宅などの台頭によって、使った電気に対する請求書ではなく、売った電力に対する小切手を受け取る人が増えている。

また元々巨大なサブスクリプションモデルであった公共事業だが、一方的なコミュニケーションから、相互コミュニケーションへと移行していっている、それが可能な理由としては、センサー機器などの広まり（IoTの普及）などがある。

### 不動産業界
現代の不動産業界で、若者が求めているものは、柔軟性と多様性である。（昔のように家を所有したいと考えなくなってきている）

# 今日の一言
今日全然進まんかった！泣ける！
【bat】7日より前のバックアップフォルダを削除する

#やりたいこと
C:\tmp下にバックアップ用のログが格納されていくので、
7日より前のフォルダをタスクスケジューラを使って自動で削除したい。


```log_del.bat
 forfiles /P C:\tmp /D -8 /C "cmd /c if @isdir==TRUE rmdir /S /Q @path"
 pushd C:\tmp 
 for /f %%A in ('dir /ad /b') do rd %%A
```

#コード内容
1行目のforfilesコマンドで対象ディレクトリの下を削除する
2・3行目で空のディレクトリを削除する
【GitHub Actions】S3にキャッシュするアクションを作りました

> 「俺はactions/cacheをやめるぞ！〇〇〇〇ーッ!!」

## はじめに

S3にキャッシュするアクションを作成しました。

[![actions-s3-cache](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317369/e59838b0-8300-e0f4-cf69-000b9147744a.png)](https://github.com/marketplace/actions/actions-s3-cache)

https://github.com/marketplace/actions/actions-s3-cache


GitHub Actions公式のキャッシュ機能である`actions/cache`は、

> - Pull Requestでコケた時にRe-run jobsするとactions/cacheアクションが正常に動作しない
> - actions/cacheアクションは時折キャッシュの取得に失敗することがある

などの問題を抱えているようです。

詳しくは、こちらのブログ記事を参照ください。

- [GitHub Actionsの知見ご紹介 - Masteries](https://papix.hatenablog.com/entry/2020/04/14/110000)

加えて、キャッシュの容量はリポジトリごとに5GBとのことなのですが、明らかに容量オーバーしていないはずなのに、キャッシュミスが発生していることがあるような気がします。

そこで、今回S3に独自にキャッシュさせるアクションを作成しました。

今のところ、快適に動いているので、今回その内容を紹介させていただきます。

## 使い方

例として、以下のように記述すると`npm ci`によって作成された`node_modules`をS3にキャッシュし、次回以降はS3からリストアします。


```yaml
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: shonansurvivors/actions-s3-cache@v1.0.1
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_DEFAULT_REGION: ap-northeast-1
        with:
          s3-bucket: your-s3-bucket-name # 必須
          cache-key: npm-v1-${{ hashFiles('laravel/package-lock.json') }} # 必須 ('.zip' は記述不要)
          paths: node_modules # 必須(キャッシュするディレクトリやファイル。複数ある場合はスペース区切りで記述) 
          command: npm ci # 必須(インストールやビルドのコマンドを記述)
          zip-option: -ryq # 任意 (デフォルト: -ryq)
          unzip-option: -n # 任意 (デフォルト: -n)
          working-directory: laravel # 任意 (デフォルト: ./)
```

事前準備としては、

- S3バケットを作成する
- S3バケットを読み書き可能なポリシーを持ったIAMユーザーを作成する
- GitHubリポジトリのsettings画面で上記IAMユーザーのアクセスキーIDとシークレットアクセスキーをsecretsに設定する

が必要となります。キャッシュですので、S3バケットにはライフサイクルポリシーを付けて一定日数でオブジェクトが削除されるようにすると良いかと思います。

以下はIAMのポリシーの例です。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket",
            ],
            "Resource": [
                "arn:aws:s3:::your-s3-bucket-name",
                "arn:aws:s3:::your-s3-bucket-name/*"
            ]
        }
    ]
}
```

なお、アクションの種類には、DockerアクションとJavaScriptアクションが存在しますが、actions-s3-cacheは後者のJavaScriptアクションです。

ですので、GitHubが提供するVM環境で直接実行されます。

## その他公式のactions/cacheとの違い

- Re-run jobsした時も正常に動く
- 後続のステップがエラーになってジョブが失敗したとしても、キャッシュする(公式はキャッシュしない)
- 複数のディレクトリとファイルの組み合わせをまとめてキャッシュ可能(公式でキャッシュできるのは1つのディレクトリのみ。ファイル名指定は不可)

## 実際に使ってみて

正確に測っていませんが、速度的には公式の`actions/cache`と遜色無い気がします。

何より、キャッシュがそこにあるはずなのにヒットしない、という状況にもやもやすることが無いのは快適でした。

良かったら、ぜひ使ってみてください。

>「S3ィィィィィッ！！」
AndroidのversionNameを自動管理する

## 問題

apkを配布するために、app/build.gradle の`versionName`のみをインクリメントしてプルリクエストを出す。
これはなかなか面倒だし、手間だなと思った。

versionName なんて修正するまでもなく、自動で加算されてほしい。

## どうしたか？

そこで`versionName`に日時にしてはどうだろう？

イメージはこんな感じ

```gradle:app/build.gradle

static def getCustomVersionCode() {
    return new Date().format('yyMMddHHmm').toInteger()
}

android {
    compileSdkVersion 29
    defaultConfig {
        applicationId "com.xxxx"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 1
        versionName "1.0-${getCustomVersionCode()}" // <= yyMMddHHmm が追加される
```

これをビルドしたapkの versionName はこうなる

```xml
android:versionName="1.0-2004270921"
```

これでversionNameを毎回修正する必要なくなった。

デメリットは、エラーが発生したときにどのバージョンなのかを特定する必要がある。
エラー情報にversionNameが含まれていれば特定できるんだろうけど。


## 使用コード

https://github.com/ikemura23/Android-Kotlin-Lab/blob/master/app/build.gradle
SupermicroサーバでBootオプションにNVMe M.2が見えない時の対処方法

SupermicroサーバでNVMe M.2にOSをインストールしてBootさせたい場合、OSのインストールは何も気にせず出来たのに、いざインストール後、BootさせようとするとBootオプションにNVMe M.2が見えなくて困ることがあります。私は今まで2回経験しました。

マニュアルにも記載されていないので、数年に1度くらいの頻度でしかサーバのBIOSを触らない立場としては毎回はまってしまいます。今回は作業メモを兼ねて、私のように困る経験をする方のためにこちらで共有します。(次は困らない）

#### Spec of Server
- HDDなし
- SSDなし
- NVMe M.2 512GB

#### 前提
- OSはNVMeにインストール済み

#### 手順

1. サーバ起動時にDELキーを押してBIOSに入る
2. Advanced > PCIe/PCI/Pnp Configurationを選択
<img width="401" alt="supermicro1.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326401/1bfc3650-c910-035e-9299-e9006fef3719.jpeg">

3. NVME Firmware Source > AMI Native Support
Default値はVendor Firmwareになっているのですが、その状態ではBootオプションにNVMeは見えません。
<img width="401" alt="supermicro2.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326401/6c8ded49-5c01-55fa-724c-b314842c265b.jpeg">



4. BOOT>Boot mode select > Legacy
Default値はDualですが、これをLegacyに変えるとBoot Option #1にNVMe M.2が見えます。
<img width="401" alt="supermicro3.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326401/00c900d6-e12b-4c08-f422-dbfeb54c59cb.jpeg">



5. これで設定変更をSaveしたら次はNVMeからBootされます。

以上。
【Rails】devise1つで複数モデルを管理する方法

# 開発環境
・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・OS: macOS Catalina

#1.`devise`を導入

```ruby:Gemfile
gem 'devise'
```

```terminal:ターミナル
$ bundle
```

```terminal:ターミナル
$ rails g devise:install
```

#2.`「devise.rb」`を編集

```ruby:config/devise.rb
# 235行目をコメントアウトして、「true」に変更
config.scoped_views = true
```

#3.モデルを作成

```terminal:ターミナル
$ rails g devise user
```

```terminal:ターミナル
$ rails g devise admin
```

#4.コントローラーを作成

```terminal:ターミナル
$ rails g devise:controllers users
```

```terminal:ターミナル
$ rails g devise:controllers admins
```

#4.ビューを作成

```terminal:ターミナル
$ rails g devise:views users
```

```terminal:ターミナル
$ rails g devise:views admins
```

#5.ルーティングを編集

```ruby:routes.rb
Rails.application.routes.draw do
    devise_for :users, controllers: {
      sessions:      'users/sessions',
      passwords:     'users/passwords',
      registrations: 'users/registrations'
    }

    devise_for :admins, controllers: {
      sessions:      'admins/sessions',
      passwords:     'admins/passwords',
      registrations: 'admins/registrations'
    }
end
```

#6.必要無いビューを削除する

```terminal:ターミナル
$ rails d devise:views
```
Rails：migrationをrollback時にActiveRecord::UnknownMigrationVersionErrorが出たときの対処法

## 概要
`$ rails db:rollback`や`$ rails db:migrate:down VERSION=マイグレーションID`
時に以下のようなエラーで正しくrollback出来なかったときの対処法.

```ruby
ActiveRecord::UnknownMigrationVersionError: 
No migration with version number マイグレーションID
```

## 原因
対象となるマイグレーションIDのマイグレーションファイルが見つからなく、downが出来ないよ、と怒られている.


## 対処法

###  消したいマイグレーションIDを見つける

```bash
$ rails db:migrate:status
```

そうすると

```ruby
status    Migration ID    Migration Name
   ︙          ︙                ︙
  up      200427074212    ********** NO FILE **********
```

上記のように「NO FILE」となっているマイグレーションIDがあるはず.
この例の場合、「200427074212」です.


### マイグレーションファイルを作る
「db/migrate」ディレクトリ内に先程確認したMigration IDのマイグレーションファイルを作成.

``` bash
$ cd db/migrate
$ touch マイグレーションID_tmp.rb
(例： $ touch 200427074212_tmp.rb)
```

### マイグレーションファイルを編集
作成したみグレーションファイルに以下の内容を書き込みます.
※ ActiveRecordのバージョンは他のマイグレーションファイルを見て確認してください.

```ruby:200427074212_tmp.rb
class Tmp < ActiveRecord::Migration[バージョン]
  def change
  end
end
```

### マイグレーションファイルを削除

下記のコマンドでもう一度マイグレーションを確認します.

```bash
$ rails db:migrate:status
status    Migration ID    Migration Name
  ︙          ︙                ︙
  up      200427074212    Tmp
```
そうすると「Migration Name」の欄に「Tmp」と表示されるようになっているはず.
その後、下記のコマンドでこのマイグレーションファイルをのステータスを「up」から「down」の状態にしていきます.

```bash
$ rails db:migrate:down VERSION=マイグレーションID
($ rails db:migrate:down VERSION=200427074212)
```
そしてステータスが「down」になっていることを確認する.

```bash
$ rails db:migrate:status
status    Migration ID    Migration Name
  ︙          ︙                ︙
 down      200427074212    Tmp
```

「down」が確認できたら、マイグレーションファイルを削除します.

```bash
$ rm db/migrate/200427074212_tmp.rb
```
そしてstatusを確認すると

```bash
$ rails db:migrate:status
status    Migration ID    Migration Name
  ︙          ︙                ︙
 (先程のマイグレーションファイルが消えている)
```

これで成功！
`rails db:rollback`等できるようになっているはず！
【ABC164へ参加してみた】在宅勤務になったのでマネジメント系SEが競技プログラミング始めてみた。#3

#今回の記事
ABC164に参加しましたので共有。
C問題までの解説については早ければ本日またお時間あるときに作成して共有させていただきます。

#当日の解答結果
[前回](https://qiita.com/makom/items/ddd0a6424326496b535a#%E5%BD%93%E6%97%A5%E3%81%AE%E7%B5%90%E6%9E%9C)と同様ＡＢＣの3問解くことができました。
また前回の反省を活かして、今回はコンパイルエラーや不正解もなく20分以内で解答できました。
<img width="758" alt="スクリーンショット 2020-05-02 23.09.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509729/78263939-3be8-550a-5805-fed91ac4302b.png">


#気になるパフォーマンスについて
パフォーマンスは前回大会が無効試合だったために非常に気になってました。
私のパフォーマンスはこんな感じでした。順位についてはギリギリ5000番台。
<img width="1066" alt="スクリーンショット 2020-04-27 8.57.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509729/f6221b54-22fa-df6c-238f-b3d08f19b475.png">

@drkenさんの下記記事によれば、茶色コーダ上位の一歩手前。。
ひとまず初心者の壁である茶色コーダにはコンテストに引き続き参加し、
今回のパフォーマンスが維持できればなれそうです。

[AtCoder コンテストについてのtips](https://qiita.com/drken/items/8a6f139158cde8a61dce)

#今後について
今回D問題についても問題が理解できたんで取り組んでみたんですが、TLE(実行時間超過エラー)でダメでした。。
そもそもD問題から実行時間などをより意識しないといけなそうなので
今後はそのためにアルゴリズム等を学ばないと次のステップにはいけないなと感じました。
またC問題についても文字列のソートが思った通りにいかないで無駄な時間を過ごしたり。。標準関数もある程度しっかり復習しないといけないなと思っています。

次回以降は是非より上の緑コーダレベルのパフォーマンスを出せるために頑張りたいと思います。
PHPオブジェクト指向基礎まとめ（２）

『PHPオブジェクト指向基礎まとめ（１）』
https://qiita.com/imayasu/items/03bf73d1d844bef6a194
の続き

# $thisについて
メソッドの中でインスタンスのプロパティやメソッドにアクセスしたい時には$thisという特殊な変数を使う。

```php
class Animal {
  public $name;
  public function hello() {
    echo "私の名前は{$this->name}です"; //hello()の中でnameプロパティにアクセスしたい
  }
}

$cat = new Animal();
$cat->name = 'MIKE';
$cat->hello();
```
# コンストラクタ
__construct()という記述をするとインスタンスを生成した時に自動でメソッドが呼ばれる。
コンストラクタには引数をとることができ、コンストラクタメソッドの中で$thisを用いてプロパティに値をセットすることができる。
※コンストラクタの記述はアンダーバー２つから始まることに注意

```php
class Monster {
  public $name;
  public function __construct($name) { // コンストラクタの引数に$nameを入れる
    $this -> name = $name;　// nameプロパティに引数の$nameを代入
  } 
  public function hello() {
    echo "{$this->name}が現れた！！";
  }
}

$slime = new Monster('スライム');　//Monsterの引数にスライムを入れる
$metal = new Monster('はぐれメタル');

$slime->hello();
echo '<br>';
$metal->hello();
/*結果　
スライムが現れた！！
はぐれメタルが現れた！！*/
```

ちょっと複雑になってきましたが、使い方を覚えればスッキリしたコードが書けるようになりそうです。
自論）プログラムの勉強は、他の言語の勉強と併用すべきだと思う

#プログラム勉強について
　前の記事でも書いたのであるが、ITエンジニアの勉強において、
語学の勉強は、いずれ必要なので，並行して勉強することが大事だと思う。

#これから目指す方向
https://qiita.com/motochan1969/items/bbfe363abf1eed542f98
>まず英語を勉強して、英語の文章を目にするようにする。タイピングするという行為は、言語の学習において、正確性という意味で、非常に練習になると考えられる。

とりあえず、上記の行動目標に従って、独学での勉強を始めている。
これらの目標が、コロナの自粛期間が終了するであろう、
５／６までに完了したいと考えている。

#個人的な話

　昨年から業務で、中国関係への出張が増えて、
ローカルスタッフとのコミュニケーションにおいて、
メール作成や、マニュアル作成で、GOOGLE翻訳にはかなりお世話になった。

　思うに、日本語と言うのは非常に曖昧な文章であって
話すような口調で、徒然なく書き綴っていると、
要旨のハッキリしない結論に至ったりして、
予想もしない内容に行きつくことが多い。

　もちろん、内容的には言いたいことがあるのであるが、
ただ漠然と書いているので、とにかく文章が余分になってしまう。
（日本語の構文と言うものが、悪影響して、とかく外国語に翻訳するにしても、
不都合なことが多い）
　
　そんな訳で、中国語の文章の作成では、いったんGOOGLEで
日本語を英語に変換して、その後、意味が通じるように、
英語を修正して、最終的に英語から中国語に変換するという方法が
すっかり定番になってしまった。
（もちろん、英語に直す部分では、読んで修正するというスキルが必要になるが
これは中学校英語レベルでも、まったく問題ない）

#ここからが本題
　翻訳ソフトで最近、話題になっているサイトがあって、
そちらを使って、前に書いた記事を翻訳することにした。
https://www.itmedia.co.jp/news/articles/2003/23/news093.html

元ネタ
日本語　：　https://qiita.com/motochan1969/items/efec9bfa5a8fca27a32b
英語　：　https://qiita.com/motochan1969/items/8d5c84c516ab7594fa49
中国語　：　https://qiita.com/motochan1969/items/f6a50a80969b8dddb505

#これからの活用
　もちろん、この翻訳が完全とは考えていない。
　なので自分なりに、自分が知っている知識の中で、これらの記事を直していこうとは思う。

　QIITAの良いところは、リポジトリの校正のように、いろんな方の意見を聞くことができることだ。（こういう目的で、技術エンジニアの交流の場を使うというのは、また別の問題なのかもしれないが。GITHUBなんかを使うなど・・・）

　逆を言えば、語学学習においても、プログラム学習と同じで、誰かが校正して
書き直すというのが、非常に重要なのである。

　以降は自分が思う事なのであるが、語学学習とプログラム学習を
コンパイルするようなことを、将来的にはAIが担う時代が来るのではないだろうか？

　例えばであるが、あるサイト上に誰かが、こんなことをしたいというのを
非エンジニアの人が書くと、それを受けて、エンジニアの人が
文章をプログラムに直訳していく。

　前のプログラムの書き出しの話で言えば、
ライブラリをインポート　→　IMPORT　xxx　という風に
　もちろん、エンジニアは外国人と同じく、PYTHON人、c#人などと
その母国の文化で、翻訳することにはなるのだが。

　最終的には、プログラム言語が分からない人間が
こんな処理を実現したい言えば、コンパイラかＩＤＥが
勝手にプログラムを書いてくれる・・・
（その時は、PYTHONなのかC#なのか分からないが、
とにかくＡＩが何かを使って書いてくれる）
　
　そんな時代になってくれることを願っている。

#まとめ

　文章でストーリを語るにしても、プログラムでアプリを動かすにしても、
最終的には、コミュニケーションであることは間違いない。
　ゆえに、コミュニケーションの勉強手法というのは、
どこかプログラムの学習手法に通じるものがあるのである。

　ＩＴエンジニアは数々の人間離れした、インターネットやコンピュータ相手に
コミュニケーションを取ることにおいては、達人だと思う。
　しかしながら、これらは決して人に対しては、優しくないと言える。

　人が必要とするものを作り出すだけでは無くて、
　人にやさしい物を作り出すことが、これからのエンジニアに必要なスキルと考える。
データ統合ソリューション: クラウドプラットフォーム間のデータ移動の自由度

今回のテーマはAWS、Azure、GCPが提供しているデータ統合ソリューションにおけるクラウドプラットフォーム間のデータ移動に関する制約についてです。

クラウド間のデータ統合ニーズを反映し、AWS、Azure、GCPの3者はそれぞれ対応するソリューションを提供しています。しかし、それらの統合ソリューションとそれ以外のXplentyをはじめとする専業ベンダーが提供するデータ移動の自由度には制約があります。今回はAmazon AppFlow、Alooma(Google)、Azure Data Factoryにおける制約について確認したいと思います。

#Amazon AppFlow
最近TechCrunchに**[Amazon AppFlow](https://jp.techcrunch.com/2020/04/23/2020-04-22-aws-launches-amazon-appflow-its-new-saas-integration-service/)**の記事が掲載されましたが、記事にある通り、データのやり取りについて双方向性がサポートされているものではなく、あくまでAWSソリューションへのデータ移動という一方通行を目的としているようです。
>しかし競合製品とやや違ってAWSはこのサービスを、ワークフローを自動化する方法としてよりもむしろ、データ伝送サービスと位置づけている。そしてデータフローは双方向が可能だが、AWSの発表は主に、SaaSアプリケーションからそのほかのAWSサービスにデータを送ってさらに分析する、という使い方にフォーカスしている。

#Alooma（Google）
そしてGoogleもまた昨年Aloomaというクラウド上でデータ統合ソリューションを提供する企業を買収しましたが、**[TechCrunchの記事](https://jp.techcrunch.com/2019/02/20/2019-02-19-google-acquires-cloud-migration-platform-alooma/)**の中でも触れられている通り、
>Aloomaは今後、Google Cloudのコンペティターへのデータ移行を求める新規の顧客は受け入れない。Aloomaの既存のユーザーもGoogle Cloudが引き継いで面倒見る、と考えれば、この方針は意外ではない。しかしAloomaでAWSやAzureを使っていたユーザーは、Googleが今後その部分のお世話も引き継ぐとは考えられないので、ほかのソリューションを探すべきだろう。

こちらも双方向というよりは、Google Cloudへの一方通行のデータ移行に重きを置いている部分が見て取れます。

#Azure Data Factory（Microsoft）
Microsoftについては、Azure Data Factoryのコピーサービスについて**[サイト](https://docs.microsoft.com/ja-jp/azure/data-factory/copy-activity-overview)**で確認したところ、GCP（Google BigqueryやGoogle Cloud Strage）やAWS（Redshift、S3）のような他社クラウドがデータ転送先としてサポートされていないのが確認できます。（2020年4月時点）

こうした3社のメガクラウドベンダーの方針を見ると、当たり前といえば当たり前なのですが、各社やはり自社のプラットフォームから他社への乗換を直接的にサポートする製品機能は提供しないということなのかもしれません。

それぞれのクラウドプラットフォームで完結した形でデータ基盤が作られていく中で、ベンダーロックインの流れを嫌い、マルチクラウドプラットフォームを採用しているお客様にとってはこういった制約を受けずにデータの移動を実現できる製品を検討する機会になるかもしれません。

データ移動の自由度以外にもデータ分析基盤にマルチクラウド戦略を採用する企業には多くのメリットがあります。もし興味のある方はこちらのブログもお読みください。
**[マルチクラウドデータアナリティクス: What, Why, and How](https://www.xplenty.com/jp/blog/multi-cloud-data-analytics-ja/)**

#最後に
Xplentyは、上記3社のクラウド間のデータ統合について双方向でサポートしています。もしマルチクラウドを採用しており、今後もデータ移動の自由度を保証していきたいという方は、是非、この機会にクラウドETL：Xplentyの**[1ヶ月間無償トライアル](https://try.xplenty.com/jp/)**で体験してみてください。
ミニマムなVue.jsコンポーネントプログラミングその３(サブコンポーネント)


今回は「ミニマムなサブコンポーネント」です。

フォルダ構成は現在こんな感じ。

[src/views]
　Home.vue　　　＜＝＝ホーム画面
[src/router]
　index.js　　　＜＝＝ルータ
[src]
　App.vue　　　＜＝＝アプリケーション
　main.js　　　＜＝＝Vueインスタンスの生成(宣言レンダリングといわれるやつ)

ルータを埋め込んだ抽象的なアプリケーションコンポーネントがあり、
ルータにはHOME画面のみ登録されています。

今回はホーム画面にサブコンポーネントを埋め込みます。

#サブコンポーネント定義(src/components/VTuber.vue)

VTuberの名前、年齢、身長をリスト表示するだけのサブコンポーネントです。

```html

<template>
    <div>
        <ul>
            <li>名前:{{vname}}</li>
            <li>年齢:{{age}}</li>
            <li>身長:{{height}}</li>
        </ul>
    </div>
</template>

<script>
export default {
    name: 'Vtuber',
    props: {
        vname: String,
        age: Number,
        height: Number
    }
}
</script>
```

コンポーネント内に埋め込むので便宜的にサブコンポーネントと呼んでいますが、基本的に同じコンポーネントです。

components/なんたら.vue => 他のコンポーネントに埋め込んで使うもの。サブコンポーネント。
views/かんたら.vue => 画面そのものを指すコンポーネント

こんな感じです。画面コンポーネントはサブコンポーネントを埋め込むので、それ自体は空っぽになりがちかも。

コンポーネントには(クラスのような)プロパティを持たせることができて、
コンポーネントインスタンスを通じてアクセスできます。

このケースでは名前、年齢、身長をプロパティとして用意しました。
最新のECMAScript標準仕様により、プリミティブ型でちゃんと型定義されています。(対応していないブラウザ向けにはBabelがよしなに変換してくれる)

String(文字列)、Number(数値、小数点含む)です。
他言語のように、整数(int)、小数点(float)とわかれてないんですね。


#サブコンポーネント埋め込み
作ったVTuberサブコンポーネントをHOME画面(Homeコンポーネント)へ埋め込みます。

```html

<template>
  <div>
      <h1>VTuberプロフィール</h1>
      <VTuber vname="町田ちま" age="16" height="150"/>  ＜＝＝ココ
  </div>
</template>

<script>
import VTuber from '../components/VTuber.vue'

export default {
    name: 'Home',
    components: {
      VTuber
    }
}
</script>
```

このHOME画面は以下のように構成されます。

見出し：VTuberプロフィール(h1)
詳細情報：VTuber詳細情報(VTuberサブコンポーネント)

**VTuberの詳細情報を渡すと、リスト形式で表示してくれる**部品を、サブコンポーネントとして切り出しているわけです。

基本的にコンポーネントとは、それ自身で自律しているべきであり、必要なデータを渡せば勝手に動いてくれるものなので、コンポーネント間の通信はなければないほどよいです。特に子から親への通信は極力ない方がよいですが、サブコンポーネントでデータ取得エラーが起きて、親画面のヘッダに「Warning」と出したい場合等、必要なケースは出てくるかも。（このケースでも、サブコンポーネントをエラー表示デザインすればよいかもですが）

まぁ、必要になったら考えようと思います。

#表示画面
npm run serveして確認。

![範囲を選択_013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244766/f3a610b9-67a5-3870-e266-9b8a4250b8f9.png)

#次回

次は「ミニマムなデータ取得」をしてみようと思います。
tensorflow_quantumでxor

#概要

tensorflow_quantumでxorやってみた。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/4b1f0847-f62c-e529-72ee-d0689a36d470.png)

#環境

tf 2.1.0
tfq 0.2.0
cirq 0.7.0

#サンプルコード


```

import tensorflow as tf
import tensorflow_quantum as tfq
import cirq
import sympy
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
from cirq.contrib.svg import SVGCircuit

x_train_bin = np.array([[0, 0], [0, 1.0], [1.0, 0], [1.0, 1.0]])
x_test_bin = np.array([[0, 0], [0, 1.0], [1.0, 0], [1.0, 1.0]])
y_train = np.array([[1.0], [0], [0], [1.0]])
y_test = np.array([[1.0], [0], [0], [1.0]])

def convert_to_circuit(xor):
	values = np.ndarray.flatten(xor)
	qubits = cirq.GridQubit.rect(2, 1)
	circuit = cirq.Circuit()
	for i, value in enumerate(values):
		if value:
			circuit.append(cirq.X(qubits[i]))
	return circuit

x_train_circ = [convert_to_circuit(x) for x in x_train_bin]
x_test_circ = [convert_to_circuit(x) for x in x_test_bin]
x_train_tfcirc = tfq.convert_to_tensor(x_train_circ)
x_test_tfcirc = tfq.convert_to_tensor(x_test_circ)

class CircuitLayerBuilder():
	def __init__(self, data_qubits, readout):
		self.data_qubits = data_qubits
		self.readout = readout
	def add_layer(self, circuit, gate, prefix):
		for i, qubit in enumerate(self.data_qubits):
			symbol = sympy.Symbol(prefix + '-' + str(i))
			circuit.append(gate(qubit, self.readout) ** symbol)

def create_quantum_model():
	data_qubits = cirq.GridQubit.rect(2, 1)
	readout = cirq.GridQubit(-1, -1)
	circuit = cirq.Circuit()
	circuit.append(cirq.X(readout))
	circuit.append(cirq.H(readout))
	builder = CircuitLayerBuilder(data_qubits = data_qubits, readout = readout)
	builder.add_layer(circuit, cirq.XX, "xx1")
	builder.add_layer(circuit, cirq.ZZ, "zz1")
	circuit.append(cirq.H(readout))
	return circuit, cirq.Z(readout)

model_circuit, model_readout = create_quantum_model()
model = tf.keras.Sequential([tf.keras.layers.Input(shape = (), dtype = tf.string), tfq.layers.PQC(model_circuit, model_readout), ])
model.compile(loss = tf.keras.losses.mse, optimizer = tf.keras.optimizers.Adam(), metrics = ['mae'])
y_test_tf = tf.convert_to_tensor(y_test, np.float32)
qnn_history = model.fit(x_train_tfcirc, y_test_tf, batch_size = 4, epochs = 200, verbose = 1, validation_data = (x_test_tfcirc, y_test_tf))
plt.plot(qnn_history.history['loss'])
plt.title("Learning to Control a Qubit")
plt.xlabel("Iterations")
plt.ylabel("Error in Control")
plt.show()
qnn_results = model.evaluate(x_test_tfcirc, y_test)
qnn_accuracy = qnn_results[1]
print(qnn_accuracy)
pred = model.predict(x_test_tfcirc)
print(pred)

```

以上。
【Java】配列を宣言・初期化する

#配列を宣言する
・データ型を定義する
・変数名を定義する

```java
//データ型=String、変数名=array
String[] array;
```

#配列を初期化する
・要素数を定義する

```java
//要素数=3
String[] array = new String[3];
```

#配列を要素にデータを詰めて初期化する
・要素数の定義は不要
・データ型に一致する要素を定義する

```java
//要素0="a"、要素1="b"、要素2="c"
String[] array = {"a","b","c"};
```
vbscriptでExcelchartをメール本文に貼り付けて送信する方法

#やりたかったこと
Excelの課題管理表の進捗状況を毎日自動で送信することがしたかったこと。
課題管理表の中の見える化自体は、Excelの中でグラフで対応した。
なので、そのグラフをメールの本文に貼り付けメールを見れば課題管理表の進捗がわかるようにしたかった。
※添付するのは、わかっていたのだが本文に貼り付けるのがよくわからず。。

#処理の流れ
* Excel処理
* Excel開く、ブック選ぶ、シート選ぶ、チャート選ぶ 、チャートを任意の場所に画像で保存
* メール送信
* メール宛先書く、本文に画像貼り付ける、送信する

#それぞれひもといていくと

#参考となったリンク
https://stackoverflow.com/questions/30552624/how-to-copy-text-and-charts-in-an-excel-sheet-to-outlook-body
http://atdxfe.hatenablog.com/entry/2015/12/25/234221

#サンプル
IoTを15分で簡単構築！【Balena x Raspberry PI】

#背景
`balena`というサービスを見つけたので使ってみました。
動画にもしてみました。

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/oDrlySQYsnE/0.jpg)](http://www.youtube.com/watch?v=oDrlySQYsnE)

#概要
`balena`はIoT機器を管理するCloudサービスです。
基本的にRaspberryPIなどのデバイスに専用のOSを書き込んで実行すると、Cloudから様々な制御が可能です。
ローカルデバイスの再起動から、デバイスの更新…ターミナル制御までできてしまう便利なやつです。

動画でもお話したとおり、今回は下記のチュートリアルを参考に進めさせていただきました。
https://www.balena.io/docs/learn/getting-started/raspberry-pi2/python/


## 価格
2020/04/26現在、は下記のとおりです。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/19d828e3-a3f9-ca06-12f7-f07f79de9951.png">


### free プラン
10端末までは無料とのこと
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/1da8ea4b-225b-c772-9159-886a1049a46b.png">

個人利用レベルであれば10端末を超えることはあまりないと思います。
それではやっていきましょう。

# 環境構築
## ユーザ登録
まずは、balenaに登録を行います。

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/d0766514-bc9b-e3de-bffb-34af153f7516.png">

私はgithubに連携して行いました

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/db798c52-b976-4b55-d1eb-7feb09c3356e.png">

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/88ce8d92-4caa-d31c-dd52-39105b0d1dbd.png">


## アプリケーション作成
管理するプロジェクトのようなものらしいです。

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/eb0dc950-81c8-6c95-6983-8043dda225ec.png">

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/9a25d1ea-3719-3cd8-11cf-46b3dc13fa67.png">

## デバイス追加
管理を行うデバイスを追加します。

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/d87ec1b5-bda3-e8ef-2ef9-b3c565a7a7df.png">

RaspberryPI2しかないため、これを追加します。

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/a27ef2fa-186f-004a-0714-4e15ae8c75e1.png">

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/1838052e-3c49-f9cf-f1e1-1836ea676fe7.png">


最後の`Download balenaOS`をクリックし、イメージを取得します。

## img書き込み
取得したイメージをSDカードへ書き込みます。
私はEtcherというソフトウエアが推奨のようだったので、そちらで書き込みを行いました。

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/228b6cb7-c09e-e179-690e-fd800f96052c.png">


書き込んだSDカードをRaspberryPIに挿入し、外部に出られるLANを接続し起動します。

## 動作確認
起動して、正常にネットワークに繋がると デバイスのページにRaspberryPI2が追加されます。

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/7d39e210-fb78-d155-0477-69642858a3b8.png">


このデバイスをクリックすると、再起動やログの確認、ターミナルへの接続などが可能です。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/4c3f312f-e24c-78bf-9cef-6bee93c26a79.png">
Rで正規分布グラフで標準化された平均と標準偏差をみる

###### tags: `rBasicLearning`
##  グラフ化
赤い線が平均で、青い線が標準偏差をそれぞれ$x$の値として取った線です！

```r
standard <- {
  curve(dnorm, -4, 4, type="l")
  segments(-1, 0, -1, dnorm(1), col = "blue", lwd = 2)
  segments(1, 0, 1, dnorm(1), col = "blue", lwd = 2)
  segments(0, 0, 0, dnorm(0), col = "red", lwd = 2)
}
```
![](https://i.imgur.com/hSRQtcv.png)
基本無料のPython・機械学習が学べるサイトを25個くらいまとめた

#はじめに
ネットサーフィンして集めたサイトを名前とリンクと簡単な説明だけで紹介します。(随時リンクなどを追加します)
コメントでサイトを紹介してくれると嬉しいです。
Progateやドットインストールなど有名なサイトは入れてません。
ブログも紹介しています。
内容は説明していませんがご了承ください。
では行きます。

#Codeprep
形式：演習
料金：無料
学習範囲：基礎文法・データ操作・NumPy・Pandas・OOP
穴埋め形式で、環境構築不要です。Python以外もあります。
https://codeprep.jp/featured

#Paizaラーニング
形式：演習・動画
料金：Pythonは無料
Pythonは全部無料です。
https://paiza.jp/works

#PythonエンジニアによるPython3学習サイト
形式：ブログ
応用まで詳しく書かれてるブログです。大量に記事があります。
https://www.python.ambitious-engineer.com/

#Leagence(リージェンス)
形式：テキスト・演習
料金：無料
学習範囲：基礎文法・データ操作・Numpy・Matplotlib・Pandas・機械学習・深層学習・スクレイピング・データ分析・OOP
Progateみたいな感じです。全部無料で一応Juliaのコースもあります。
https://leagence-prog.com/

#とある科学の備忘録
形式：ブログ
高校生が書いてるブログです。Python以外のことも多いです。
https://shizenkarasuzon.hatenablog.com/archive

#Pyhoo(パイフー)
形式：ブログ
初心者にも分かりやすいブログです。
https://pyhoo.jp/

#コピペでできる！Tkinter
形式：テキスト
料金：無料
その名の通りです。Python2系のTkinterも説明してます。
https://nnahito.gitbooks.io/tkinter/content/

#とほほのPython入門
形式：テキスト
料金：無料
基本文法が書いてあるサイトです。
http://tohoho-web.com/www.htm

#Python 数値計算入門
形式：テキスト
料金：無料
基本的なことと、数値関連のライブラリについて書かれてるサイトです。
https://python.atelierkobato.com/

#Python-izm
形式：テキスト
料金：無料
入門から応用まで書かれてるサイトです。
https://www.python-izm.com/

#Pythonと機械学習の学習サイト
形式：テキスト
料金：全て無料
Python基礎と機械学習について書かれてます。
https://ruby-de-free.net/wp/

#Aidemy
形式：演習・動画
料金：大半が無料(10コースのうち8コース)
PythonとAIについてです。
https://aidemy.net/courses

#KIKAGAKU
形式：テキスト
料金：無料
主に機械学習についてです。
https://www.kikagaku.ai/

#AI Academy
形式：テキスト
料金：半分くらい無料(45コースのうち21コースくらい)
これも機械学習が主です。
https://aiacademy.jp/

#Chainerチュートリアル
形式：テキスト
料金：無料
深層学習とそれに使う数学について書いてあります。
https://tutorials.chainer.org/ja/

#メディカルAI専門コース オンライン講義資料
形式：テキスト
料金：無料
その名の通りです。
https://japan-medical-ai.github.io/medical-ai-course-materials/

#Codexa
形式：演習・テキスト・動画
機械学習のチュートリアルや記事があります。
料金：大半が無料(一部有料)
https://www.codexa.net/

#松尾研究室
形式：演習・テキスト・動画
料金：無料
深層学習やデータサイエンスの演習などができます。
https://weblab.t.u-tokyo.ac.jp/gci_contents/

#Coursera
形式：動画
料金：基本無料(ライセンス取得は有料)
AI関連など様々な動画があります。
https://www.coursera.org/

#はやぶさの技術ノート
形式：ブログ
Pythonや画像処理などの記事があります。
https://cpp-learning.com/

#独学初心者プログラマーの日英ブログ
形式：ブログ
Pythonを中心に書かれています。
https://akasatanahama.com/

#nkmk note
形式：ブログ
Pythonの機械学習やスクレイピングの記事が書かれています。
https://note.nkmk.me/

#作って遊ぶ機械学習。
形式：ブログ
機械学習の初歩から説明しています。
http://machine-learning.hatenablog.com/

#OpenBook
形式：テキスト
料金：無料
いろんな人が記事を書いています。
https://openbook4.me/


#N予備校
形式：演習・動画
料金：プログラミングコースは基本無料(実際に見にいった方がわかりやすい)
機械学習や高校数学について学べます。
https://www.nnn.ed.nico/home

#ゼロから学ぶPython
形式：テキスト
料金：無料
デザインが良く、シンタックスハイライトも効いているので見やすいです。
https://rinatz.github.io/python-book/

#YOLO
形式：ブログ
データ分析や機械学習用のライブラリを解説しています。
https://yolo.love/

#おわりに
ざっとまとめてみました。
まとめたというよりも、並べたという方が正しいかも。
少しずつ追加していきます。

これのHTML,CSS,JS版です。
https://qiita.com/meganeo/items/18f9072f64915c086a87
Git コマンド

#前提
Gitのコマンドについて記述していきます。

#本題

Gitを使う準備として、下記を入力する必要がある。

```
$ git init
```
※initはinitializeの略で初期化を意味している。

共有の準備として共有したいファイルを選択する。

```
$ git add 変更のあるファイル名

$ git add index.html
```


選択したファイルをメッセージ付きで記録する

```
$ git commit -m "コミットメッセージ" 
```

共有の仕組み
リモートの準備
リモートを登録する際には「origin」とすることが多い。

```
$ git remote add リモート名 URL

$ git remote add origin https://・・・
```

リモートを登録できたのでリモートにファイルをアップロードしていく

```
$ git push origin master
```

リモートのファイルをダウンロードする

```
$ git pull origin master
```

自分が変更したファイルのファイル名の表示

```
$ git status
```

変更内容の表示

```
$ git diff
```
※内容に問題なければ<code>git add</code>する。


自分や他人のコミットを確認する

```
$ git log

$ git log -p #変更内容を確認できる
```
Swift ローカル通知を毎週通知する

# UserNotifications

## Document

<a href="https://developer.apple.com/documentation/usernotifications">https://developer.apple.com/documentation/usernotifications</a>

# ローカル通知を毎週通知する
## Example 毎週月曜日 7:15

```swift
let content = UNMutableNotificationContent()
content.title = "Example"
content.body = "毎週月曜日 7:15"
content.sound = UNNotificationSound.default
        
let notificationCenter = UNUserNotificationCenter.current()

var dateComponentsDay = DateComponents()
dateComponentsDay.hour = 7
dateComponentsDay.minute = 15
dateComponentsDay.weekday = 1

let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponentsDay, repeats: true)

let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)

notificationCenter.add(request) { (error) in
    if error != nil {
        print(error.debugDescription)
    }
}

// 登録されている通知確認        
UNUserNotificationCenter.current().getPendingNotificationRequests {
    print("Pending requests :", $0)
}
```

DateComponentsの年月日等の余計な情報は設定しない。
DateComponentsのweekdayに通知したい曜日を設定。

weekdayの設定値
1：日曜日
2：月曜日
3：火曜日
4：水曜日
5：木曜日
6：金曜日
7：土曜日
Vuetifyで手動入力できるドロップダウンを作りたい時にcomboboxが便利だった


タイトルの通りだけど、テキストフィールドのようにユーザが自分で入力もできるドロップダウンをvuetifyを使って作成する時に少し詰まったのでメモ。

[v-select](https://vuetifyjs.com/ja/components/combobox/)だとテキスト入力できないしなぁて思ってたけど[v-combobox](https://vuetifyjs.com/ja/components/combobox/)使ったらすぐできた。

これに辿り着くのに結構時間を使ってしまったのでメモがてら記事にしておく。
【Unity】switch文の判定を文字列で行う

#環境
Unity 2019.3.7f1

#はじめに
switch文は数値だけでなく文字列でも判定できるのでメモ。

#具体例

```CSharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class test : MonoBehaviour
{
    string a;//string型の変数aを宣言
    
    void Start()
    {
        a="算数";//変数aに算数を代入

        switch (a)
        {
            case "算数": //aが算数の時に実行する
                Debug.Log("電卓を使います"); //コンソールに表示
                break;  //switch文から抜ける

            case "理科": //aが社会の時に実行する
                Debug.Log("薬品を使います"); //コンソールに表示
                break; //switch文から抜ける

            default:    //aが上記以外の場合に実行する
                Debug.Log("そんな教科はありません"); //コンソールに表示
                break; //switch文から抜ける
        }
    }
}
```

####実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/f4c935c5-5de6-675a-6d3d-e4e792def975.png)

#おわりに
数値判定の時と同じ感覚でできちゃいますね。
【JavaScript】URLをコピーするボタンを作る

# 概要
URLをコピーするボタンをJavaScriptで実装する。
実装はとっても簡単なのでサクッと書きます。

## 実装(html)

```html
<button onclick="copyUrl()">Copy URL</button>
```

## 実装(JavaScript)

```javascript
function copyUrl() {
    const element = document.createElement('input');
    element.value = location.href;
    document.body.appendChild(element);
    element.select();
    document.execCommand('copy');
    document.body.removeChild(element);
}
```

URLをコピーするにはテキストボックスを用意し、そこにURL（location.href）を設定します。
テキストボックスをDOMに追加した後、 `select()` で設定したURLを選択した状態にします。

`document.execCommand('copy')` でコピーを実行したら用意したテキストボックスを削除します。

以上、簡単ですね。
如何先开始写出一个程序

#谈谈写出一个方案。
如果你最近一直在做程序，而你认为
我在初中时接触的第一个节目，是我在初中时接触的第一个节目
是N80-BASIC。
我还记得，但下面这句话完全在我的脑海里。

```N88-BASIC
N88-BASIC

WIDTH 80,25.
CONSOLE 0,25,0,1
LOCATE 0,0
PRINT "HELLO WORLD"
宽80,25
```

当然，那时，我只是打出了这样的代码。
解释器只显示了一个无机游标。
我找不到任何帮助。

可以这么说，写出一个程序是
今天还是这个样子，他真的是个无精打采的家伙。

那么，这就是今天的话题。
这要从一种新的编程语言、开发环境说起。
所以，节目先生，好像是在问候。
问候是很重要的。

不仅仅是在编程世界，在现实世界中也是如此。
如果一个问候语被理解了，对方就会以某种方式和你交谈。

哪怕你只是在不了解情况的情况下走到他们面前，也是如此。
那你会得到的，是一脸疑惑的表情，或者是一种
最坏的情况下，他们只是送你回去走人。

#过去的故事D，扯远了一点
我第一次去大学毕业旅行的时候，在美国的机场转机。
我把车票放在了我的行李箱里。
我设法向机场柜台的黑人女士解释了危机。
没有车票！没有车票!
我还记得有一次真的被拒绝了，因为我说："我不想这样做。"我真的被拒绝了。

之后，我去机场的服务台拿了一个
老人走了过来，把我带到了行李提取区。

我拿着一个几乎是银色的包包，所以我
"金子，"他勉强把袋子拉了回来。
我的车票也被我抢到了。

这一切的恐怖，让和我一起去的朋友都笑了起来。
我还记得我第一次出国时的这段插曲。
(这段怀旧视频在同学会上成为了热门话题，现在还在YOUTUBE上流传着)。
https://www.youtube.com/watch?v=joamkkQdKQw

#这个题目的重点
我的意思是说，说编程语言的人，一开始你写什么？
这个规律从古至今都没有改变过
如果你不知道这个道理，那你根本就不能做任何事情。

在这段时间里，聊天机器人那边就能
"先生，我该怎么写呢？　
你就不能好心告诉我怎么开始写代码吗？

等人工智能出来后，至少我们就能真正解决这个工程师短缺的问题。
与计算机交流的缺口。
我是希望他们能够填补这个空缺。

所以今天的话题是我最近一直在学习的话题
以连初学者都能理解的方式来讲解编程语言的出发点
我想用我自己的方式来拼凑一下。

# python ----> import
　在python的情况下，它是一个导入语句。
　这是不可能再错了。

# C# ----> using 句
　在C#的情况下，它是一个使用子句。
它不是恩卡之歌的开头。

# C ----> #include < >
让我补充一下，因为我很早就想起来了。
不过C++可能基本上也是一样的。

# node.js ----> require()
敢不敢提一下陷入HTML中的JavaScript？

# VB.NET----->导入
不幸的是，VBA中没有这样的约定，所以
这是用VB的情况下写的。
　
#JAVA ----> import
　我个人没有用过JAVA，所以就当做知识来写吧。

其他的
Typescript
RUBY
PHP
GO

我想，程序语言有很多，但我不知道更多。

#比如说问候语
当然这是必要的，你和你的neibor自然而然的打招呼。
但它也需要捕捉到别人的谈话的一瞥。
当你看了别人写的绳索，如GITHUB等。

先说说这个开场白吧
因为它是一切的开始。
我们要从这里开始解开它。
这个程序是完全无法理解的。

这个问候是非常重要的。
比如说，对方国家的礼仪和
书中有很多文理科的常识。

尤其是现在这个时代，名字空间什么的都有了。
命名空间都不需要命名。
首先，这只是一个树状结构，有了目录
这是个名字，我也想这么说。

另外，PYTHON在使用ENV之类的虚拟空间等。
会做，但一旦这个也做出来了，就会是
只是临时创建的文件夹的名字而已。
(这个IT工程师真的很难说难听的话。
这是一个很讨厌的套路，所以才会流传这么多。
(这是一种相当恶心的文化，不接受初入职场的学生，这是个相当恶心的文化。

而这年头，对象思维......
以前的时候，一个独身手艺人，自己创业的时候
然后，他们雇佣的人越来越多，工作也越来越有条理。
就好像是建立了越来越多的部门。

这并不像有什么现实世界的规则或
常识、规则、规章制度都陷入了你的电脑存储区。
这只是故事，但不知为何他们不接受初入职场的学生。
这

通过www.DeepL.com/Translator（免费版）翻译
強化学習の手法まとめ（メモ）


強化学習は手法が大量にあって分かりづらいため、まとめてみたいと思います。

動的計画法以外は、近似解法になります。
近似解法はエージェントを動かして、試行錯誤するいわゆる強化学習です。

強化学習について重要な概念は、**マルコフ決定過程**という概念です。
強化学習は、状況がマルコフ決定過程であることを想定した上で最適化を行います。
想定するだけで厳密にその状況である必要はなく、どんな問題にも適応することは可能です。
そのため応用範囲が広く、流行しているのだと思います。
マルコフ決定過程の拡張として、部分観測マルコフ決定過程という概念もあります。
マルコフモデルと隠れマルコフモデルのような関係です。
強化学習は部分観測マルコフ決定過程においても有用です。

#動的計画法
価値反復法、方策反復法があります。
環境に対する完全な理解がある場合にのみ可能です。
厳密解を求めることが出来ます。
エージェントを動かしません。
強化学習に含まないこともあるようです。

#モンテカルロ法
最後まで行動を行います。そのため、一回の試行に時間がかかります。
エピソードが完結するまで、計算できません。
エピソードタスクでなければ適応できません。

#TD学習
オンライン学習が可能です。
価値ベース、方策ベース、2つのハイブリットの3つがあります。
深層学習と組み合わせた深層強化学習へ発展しました。
下記の記事が参考になります。
https://qiita.com/shionhonda/items/ec05aade07b5bea78081

##SARSA
価値ベースで、方策オン型

##Q学習
価値ベースで、方策オフ型

##方策勾配法
方策ベース
REINFORCEアルゴリズム

##Actor-Critic
価値ベースと方策ベースをハイブリッドした手法
競プロで役立つPython3の入力まとめ

#数値
###単一の数値

```python:
I = int(input())
```
###空白区切りでの入力
```
3 5 6 7
```
のような数値が空白区切りで入力される際

```python:
A, B, C, D = map(int, input().split())
```
###改行区切りでの入力


```
3
5
6
7
```
のような数値が改行区切りで入力される際

```python:
A, B, C, D = map(int,open(0))
```

###数値を受け取る数が未定かつリストにしたいとき
例えば入力が

```
3 5 6 7　,,, N
```
の様な時以下の様なlistを作成したい時

```
['3', '5', '6', '7',,,'N']
```

```python:
list = list(map(int, input().split()))
```

##小数


###単一の小数を格納

```python:
from decimal import Decimal
A = Decimal(input())
```

###複数の小数を格納

```python:
from decimal import Decimal
A, B = map(Decimal, input().split())
```

floatでいんじゃね？と思いがちだが例えば以下のような問題
[C - Multiplication 3](https://atcoder.jp/contests/abc169/tasks/abc169_c) 
floatなどで計算しても倍精度浮動小数点数の精度の問題から再提出を食らう。

なぜダメかの解説はその道のオタクに任せます。（丸投げ）
[浮動小数点数オタクが AtCoder Beginner Contest 169 のC問題をガチで解説してみる](https://qiita.com/mod_poppo/items/910b5fb9303baf864bf7)

もしDecimalを使用した場合以下のコードとなる。

```python:
from decimal import Decimal
 
A, B = map(Decimal, input().split())
print(int(A*B))
```


#文字
###文字列
```python:
N = input()
```

###受け取る文字列数が決まっており、リストにしたいとき(Iは回数)

```python:
list = [input() for i in range(I)]
```

例えば３回入力されると決まっており、

```python:
orange
grape
strawberry
```

と入力した場合listの中身は

```python
['orange', 'grape', 'strawberry']
```
が代入される


色々わかり次第追記していきます。
初心者によるプログラミング学習ログ 300日目

#100日チャレンジの300日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
300日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>300日目　2h<br>・xdデザインカンプからのサイト模写<br>・レスポンシブ化<br><br>昨日は日曜で休みだったけど、部屋の片づけメインdayだったからほとんど勉強しなかったわ<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1254503481722892288?ref_src=twsrc%5Etfw">April 26, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
JSで関数を使う

今回はJSでの関数の宣言と使用法をまとめます。
そもそも関数とは、様々な処理を一つの処理としてまとめたものです。
そしてそのまとめたものを呼び出すことで中身の処理を行うというものです。
処理を関数としてまとめておくことでミスも防ぐことができるし、楽に処理の修正もできます。

##1 基本的な書き方

```js
function 関数名(){
   命令文;
}
```

基本的にはこの書き方です。関数名は中でどんな処理をしているかわかりやすいような名前をつけるようにします。

##2 関数の呼び出し方

作成した関数を呼び出す際には

```js
function 関数名(){
   命令文;
}

関数名();
```

のようにするだけで宣言した関数を呼び出すことが可能です。

##3 実際に使用してみる

今回は身長、体重からその人のBMIを取得する関数を作成します。

```js
//calculationBMI関数にheightとweightの引数を受け取れるよう設定
function calculationBMI(height, weight){
//処理の結果をreturnする
  return weight / (height/100)**2; 
}
//BMI関数にname,height,weightを受け取れるように設定
function BMI(name, height, weight){
  //calculationBMI関数を呼び出し、returnされた値を変数BMIに格納
  let BMI = calculationBMI(height, weight);
  document.write(name);
  document.write(height + "cm");
  document.write(weight + "kg");
  document.write("BMI" + BMI);
}
//関数BMIにname,身長,体重の値を渡す。
BMI("太郎",180,60);
BMI("次郎",170,70);
```

##4 出力結果

太郎
180cm
60kg
BMI18

次郎
170cm 
70kg
BMI24

となります。

##5 まとめ

プログラミングの上達にも欠かせない関数ですが、積極的に使用して効率的にコードを書いていきたいと思います。
VSCodeで文字を大きくできない詰んだ for Mac

### はじめに
- VSCodeで文字を大きくする（Zoom In）する方法
- いろいろ調べると「⌘+」とか「⌘Shift=」とか書いてある -> でも動かない -> むしろ文字が小さくなる
- 文字を小さくする方法は「⌘-」とか「⌘Shift-」とか書いてある -> 当たり前だが、やはり文字が小さくなる
- つまり、どうやっても文字がどんどん小さくなっていく（おい！）
- てかそもそも、JISキーボードで「⌘+」って打とうとすると「⌘Shift-」になるんですけど...

### 解決策
1. Code > Preferences > Keyboard Shortcuts
2. Zoom In を編集して、新しいキー（例えば「⌘;」など）を割り当てる

### 参考
- Before (default)  
<img width="989" alt="before(default).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502225/703bb2db-c3ac-2973-dc65-98c527412edd.png">
- After  
<img width="991" alt="after.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502225/9d28c480-9d0f-a548-ca07-c0f5a0a33d50.png">

### ちなみに（原因）
- Visual Studio Codeは、USキーボード前提で作られているので、その兼ね合いが原因でした  
-> 実は、キーボードの設定が「"keyboard.dispatch": "code"」の人は、「⌘^」をタイプすると文字を大きくすることができます  
-> ただし「"keyboard.dispatch": "keyCode"」の人は、本記事の方法を使うしかなさそうです  
-> 「"keyboard.dispatch": "code"」って何？ -> そういう設定があるので、調べてみてください

### もっとちなみに（work around）
- View > Appearance > Zoom In とマウスを使ってサイズを戻すこともできます

最後までお読みいただきありがとうございました。
tumo.jp
javascript var と const

#はじめに
去年、会社の若い人と、javascript のvar と const の違いについて話していた時に気が付いたことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626779/189046c8-3564-f142-f76d-5c07d359b874.png)

ボタンをクリックすると、テキストボックスに数字が出るだけの簡単なjavascriptですが、下記のソースは動きません。

```javascript
<script>
document.addEventListener("DOMContentLoaded", function(event) {

    for(var idx=1;;idx++) {
        var textId = "text" + idx ;
        var text = document.getElementById(textId) ;
        if(text==null)
            break ;
        var buttonId = "button" + idx ;
        var button = document.getElementById(buttonId) ;
        if(button==null)
            break ;
        button.onclick = function() {
            text.value = idx ;
        } 
    }
  });
</script>
```

ボタンが押された時には、

```javascript
button.onclick = function() { text.value=idx; }
```

の text が nullになるためです。

# var を constに変更する

以下は、正しく動作するソースです。

```javascript
<script>
document.addEventListener("DOMContentLoaded", function(event) {

    for(var idx=1;;idx++) {
        var textId = "text" + idx ;
        const text = document.getElementById(textId) ;
        if(text==null)
            break ;
        var buttonId = "button" + idx ;
        const button = document.getElementById(buttonId) ;
        if(button==null)
            break ;
		const idx2 = idx ;
        button.onclick = function() {
            text.value = idx2 ;
        }
    }
  });
</script>
```

varをconstに変更することにより、クロージャ内の text と idx2 が意図したスコープ内の変数を参照するようになったためだと思います。

# google closure compiler

varを使ったまま正しく動作する方法を調べるため、google closure compiler で変換してみました。

https://closure-compiler.appspot.com/home

変換すると、以下のようになりました。

```javascript
<script>

document.addEventListener("DOMContentLoaded",function(event) {
	var $jscomp$loop$0={} ;
	var idx=1;
	for(;;$jscomp$loop$0=
		{
		 $jscomp$loop$prop$text$1 : $jscomp$loop$0.$jscomp$loop$prop$text$1 ,
		 $jscomp$loop$prop$idx2$2 : $jscomp$loop$0.$jscomp$loop$prop$idx2$2
		} ,idx++) {
		var textId="text"+idx;
		$jscomp$loop$0.$jscomp$loop$prop$text$1=document.getElementById(textId);
		if($jscomp$loop$0.$jscomp$loop$prop$text$1==null)
			break;
		var buttonId="button"+idx;
		var button=document.getElementById(buttonId);
		if(button==null)
			break;
		$jscomp$loop$0.$jscomp$loop$prop$idx2$2=idx;
		button.onclick=function($jscomp$loop$0) {
			return function(){
				$jscomp$loop$0.$jscomp$loop$prop$text$1.value=$jscomp$loop$0.$jscomp$loop$prop$idx2$2
			}}($jscomp$loop$0)
		}
	}
);
 
</script>

```

ちょっと、読み取るのが難しいのですが、どうやら

```javascript
button.onclick = function() {
    text.value = idx ;
}
```
を

```javascript
button.onclick = function(text,idx) {
        
    return function() {
         text.value = idx ;
    }
}(text,idx) ;
```

と変更すると良いようです。

つまり、関数を呼び出すことで、呼び出された関数側でも独自のスコープを持つため、元の text,idxとは別のスコープの変数として認識されるようです。

#結論

javascriptのクロージャーのスコープは難しいと思いました。
javaはもう少し簡単ではないでしょうか？
Docker push がうまくいかない時の解決法

# どういう状況だった？
docker image に user_name の指定ができていなかったため、dockerhubにpushできませんでした。

#解決方法
user_nameを指定したのちpushすることで解決しました。

```
# USER_NAME を指定（紐付け）
% dokcer tag IMAGE_ID USER_NAME/REPOSITORY_NAME:TAG_NAME
# ホームページ指定のコマンドでpush
% docker push USER_NAME/REPOSITORY_NAME:TAG_NAME
```

#参考
https://sleepless-se.net/2019/04/14/change-docker-image-and-tag-name/
モジュール 『トランプのカード』

# 概要
トランプゲームなどのカード（山札）のモジュールです。

# 動作環境
Windows 10
DrRacket 7.6

# 内容
(require "./my-lib.rkt") に関しましては、[こちら](https://qiita.com/350MHz/items/bcc4a19fb26fc47b2e6b)をご参照下さい。

```racket


#lang racket

(module cards racket
  (provide deck54
           deck52
           draw-card54
           draw-card52)
  
  (require racket/generator)
  
  (define (make-gen lst)  ; ジェネレータの生成
    (generator ()
               (let loop ([l lst])
                 (if (null? l) '()
                     (begin
                       (yield (car l))
                       (loop  (cdr l)) ) ) ) ) )


  (define (map-mark mark)
    (map (λ (n)(cons mark n))  ; '(マーク . 数字)
         (range 1 14) ) )  ; 1 ~ 13
 

  (define deck54  ;  山札
    (append '((j0 . 0) (j1 . 0))  ; ジョーカー
            (map-mark 's)  ; スペード
            (map-mark 'c)  ; クラブ
            (map-mark 'd)  ; ダイヤ
            (map-mark 'h) ) )  ; ハート


  (define draw-card54  ; 山札から1枚めくる
    (make-gen (shuffle deck54)) )


  (define deck52 (cddr deck54))  ;  山札（ジョーカー無し）  

  
  (define draw-card52  ; 山札から（ジョーカー無し）1枚めくる
    (make-gen (shuffle deck52)) )
  
  )  ; end module
; ----------------------------------------------------------------
(require racket/require 'cards)  ; モジュールの読込
(require "./my-lib.rkt")

; (do-times 60 (displayln (draw-card54)))
#|
;=>
(d . 4)
(d . 2)
(h . 6)
(s . 8)
(c . 3)
(c . 13)
(h . 3)
(j0 . 0)
(d . 5)
(s . 9)
(d . 8)
(j1 . 0)
(h . 10)
(c . 5)
(c . 2)
(d . 6)
(h . 13)
(d . 7)
(h . 9)
(s . 5)
(d . 12)
(c . 6)
(s . 6)
(d . 1)
(h . 1)
(c . 11)
(s . 10)
(c . 4)
(s . 3)
(s . 7)
(c . 9)
(c . 10)
(c . 7)
(d . 11)
(h . 2)
(s . 11)
(h . 5)
(d . 3)
(c . 12)
(s . 4)
(h . 8)
(h . 11)
(s . 12)
(c . 1)
(d . 13)
(d . 9)
(s . 2)
(s . 13)
(s . 1)
(h . 7)
(h . 12)
(c . 8)
(d . 10)
(h . 4)
()
()
()
()
()
()
()
|#

```
A-frame：スマホで開いたときにジャイロセンサーのデータが拾えない問題

#A-frameで作ったものをChromeで開いても、ジャイロセンサーのデータが拾えないと思っていた

これまでGlitchで作品作りの練習をしてきたが、Chromeで開くと、加速度センサーは使えていない様子で、
x方向にスクロールはできるものの、傾けても反応がなかった。

#あれ？加速度センサー使えるの？

しかしこのサンプルはスマホで開いてもぬるぬる方向転換できる。
https://aframe.io/examples/showcase/sky/

あれ？chromeでも反応するの？

#解決策：A-frameの読み込み先を変えたら動いた
```html
    <script src="https://aframe.io/releases/0.5.0/aframe.min.js"></script>
```

だと、ジャイロセンサー使ってもいいですか？のアラートはでない。

```html

　<script src="https://cdn.jsdelivr.net/gh/aframevr/aframe@9d093bbd98ef98fa0ccc7b791a16c066fcafbc29/dist/aframe-master.min.js"></script>
```

こっちだと動いた。version1.0以上じゃないとだめみたい。

＜参考：A-Frameで360度パノラマを表示する＞
https://vr-murakamicastle.jp/sakuji/sakuji_018.html

#問題点：バージョンを変えることによって動かなくなる機能がある

npm経由で読み込んだ機能がいくつか動いていないので、これから紐解き予定。
海外エンジニアのおどろきの仕事スタイル5つ！


こんにちは。

今回は海外（UK）のインフラエンジニアの働き方で、これは日本とちがう！ってところを紹介します。

先進国で日系企業なので少しマイルドなエンジニアたちかもしれませんが、それでも日本のいわゆる常識からすると、「え？そんなのありなの？」ということが多々あります。（主語がでかいですが、ひとつの事例として見てもらえればと思います）

イメージがつかみやすいように実際のコメントもすこし入れています。

では早速見ていきましょう！


#### ドキュメンテーションが苦手
通常システムを構築する際は、設計書を作ってからというのが基本だと思いますが、彼らは作りません。
どうも「作るだけムダだしサーバに入ればわかるやん」というのが持論な模様。。
細々したことが苦手なようです。

一見、技術者ぽいよねって思いがちですけど、移行や調査のときに毎回余計な手間がかかるのはいうまでもありませんよね・・・。

また、チェックリストなんかも作らないので抜け漏れなんかも多いです。。
ここに関しては日本の品質がどれだけ安定してるかってのが目に見えてわかるところです。

反面、「Excelやめて便利なツール使おうよ」とか「自動化した方が楽じゃね？」みたいなマインドは見習えます。
楽したいとか形式に意味はないよねって見方は本質的です。

「ExcelなんてShitだ！」これには同意できますね。


#### 専門分野以外の仕事はしない
基本的にジョブディスクリプションにもとづいて仕事をしていますので、それ以外の仕事はしません。
例えばネットワークエンジニアなら、サーバ側はやらないってイメージです。

平気で「これは自分の仕事じゃない」って言います。

メリットは自分の専門性に集中して高められるところ。雑用や余計な仕事が入ってこないので効率的に専門性を高められますね。
デメリットは視野が狭くなるところ。完全に壁を作ってしまうと利己的になりがちです。


当たり前ですがスペシャリストなので詳しいところは詳しいです。
エンジニアのような尖った専門性が必要なジョブにはちょうど良いでしょう。


#### 残業を一切しない
これも驚くところ！
日本より良い点だと個人的には思っています。

定時になったらすぐ帰ります。
5分前から準備し始めます。
30分前に話しかけても取り合ってもらえません。「うん明日ね」となります。

考え方的にはライフスタイルの中のひとつが仕事というイメージだと思います。
なので仕事も大事だけど定時後までやる必要はないよねって考えです。

いちど残業で飲みに遅れた時は「いつまで仕事してるんだよ笑」って反応でした。



#### 金曜午後は仕事をしない
これはエンジニアに限った話ではないのですが、金曜のお昼休みごろ、パブにはスーツをきたサラリーマンがビールを飲んでいる光景が良く見れます。木曜くらいからちらほら見え始め、金曜は結構なスーツの人が飲んでます。

午後の仕事はどうしてるんでしょうね・・・。
同僚のひとりは「前職では週5でお昼飲んでたよ」って言ってました。


飲まないでも、オフィス内でもあまり仕事に集中している人はいません。
週末の話や世間話が多くなります。昔あった「土曜日の午前中のみの学校」みたいでソワソワしてます。


#### タトゥーや金髪はふつう
しっかり腕や首にタトゥーが入ってます。最初見たときは少し驚きましたが、見慣れると普通ですね。

ある日挨拶したと思ったら「ほら見て！腕に新しいタトゥーいれたんだ」みたいな調子です。
他にもピアス、金髪、髪型、服装も自由です。
いろんな人種がいますので、見た目で制約を持たせると誰も働けなくなるからかもしれませんね。

あまり仕事には関係ない部分なので、個人的にもここは程度の問題はあれ自由で良いと思います。

### まとめ
さて、どうでしたでしょうか。

大きな違いとして5つをピックアップしました。本当はまだまだ書き足りないことはあるのですが、シンプルにするために絞り込んだのが今回の内容になります。

「海外のエンジニア」なんて言っていますが、サンプル数は相当少ないです。身の回りだけなので。
ですのでひとつの事例として捉えてもらえれば良いかと思います。

気になる点があればいつでも問い合わせください。

それではまた。
ｼﾞｬｽﾄｱｲﾃﾞｱ機械学習アプリ

#小池美由AI
コロナウイスルによる自粛が続いている最中、様々なアーティストや芸能人がstayhomeを訴えかけている。

そんな中、小池美由というタレントが始めた[ゆる台所検定]という活動が目にとまった。
ゆる台所検定とは:
調理師免許をもつ小池美由に家で食べたご飯をtwitter、instagramを通して投稿すると、採点つきのコメントが返信されてくるものである。
見ているととても楽しくなり、ついつい自宅で手の込んだ料理でもしたくなってくる。
小池美由のファンはもちろん、それ以外の人にも[ゆる台所検定]の楽しさに触れて欲しい。

そんな思いから、返答と採点を機械学習で再現できないかとおもい至った。

input
コメント
ご飯の画像

output
コメント
点数

自動返答システムについて勉強できる、いい題材かもしれない



#迷い犬、迷子犬のSNSマッチング

今日TwitterでPanasonicワイルドナイツの堀江選手が迷い犬を保護したというツイートを目にした。
リプ欄を見ると、様々なコメントが書き込まれている。
そのなかで、気になったリプが一つ。それは同じ犬種を探しているというアカウントに対して確認をしているリプだった。
この人最も建設的なSNSの使い方じゃないか？
一方でよく情報繋ぎ会わせれたなという思いと、これアプリ化したら喜んでくれる人いそうだなぁと思った。

#「ボケて」の画像と面白い言葉を活用

機械学習で面白い回答を導き出せるか

#GANの音声データ版

機械学習で生成した音声データを音楽共有アプリにアップ
オーディエンスのレスポンスに合わせて聞く人が好む音楽制作はできるのか？

#音楽生成
曲の音声データから歌詞の文字数を予測できるか？
AWS Amplifyで匿名掲示板を作ってみた

以下のURL
https://master.d1cb8uqtyd2rew.amplifyapp.com/

いろんな機能がまったくない。そのうち追加するかも

APIの型は以下のようになっておりまーす

```graphql
type Thread @model {
  id: ID!
  title: String!
  tags: [String]
  Comments: [Comment] @connection(keyName: "byThreadId", fields: ["id"])
  createdAt: AWSDateTime
  updatedAt: AWSDateTime
}

type Comment
  @model
  @key(name: "byThreadId", fields: ["threadId", "createdAt"]) {
  id: ID!
  threadId: ID!
  content: String!
  createdAt: AWSDateTime
  updatedAt: AWSDateTime
  good: Int
}
```

githubはこちら
https://github.com/opvelll/nanasiAmplify