OmniAICreator/Qiita-1.07M huggingface dataset:
Gravio HubにBluetoothスピーカーをペアリングする

Gravio の4.3からGravio HubにBluetoothスピーカーをつなぐことができるようになった。
早速やってみる。

今回は適当にあまっていたDIVOOMのAURABOXをBluetoothスピーカーとしてつないでみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/c440ba9d-25f1-86c2-f58e-d76d7e8e2d1d.png)

https://www.divoom.com/product/aurabox.html

# 使用環境

* Gravio Hub (Gravio Standardの契約が必要)
* Gravio HubKit v4.3.0-6722
* Gravio Studio v4.3.4162.0
* Bluetoothスピーカー: DIVOOM AURABOX

# Update Managerにログイン

`http://＜Gravio Hubのホスト名＞.local:8080/` にブラウザからアクセスしてログインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/2fe5c173-3c97-69d3-56c6-d7d7b58bcfb7.png)

「Gravio Hub設定」の一番下に「Gravio Hub Bluetooth設定」が追加されてますね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/772995fd-fd22-96b6-e0cb-c3e907b1b188.png)

# Bluetoothスピーカーをペアリング

Bluetoothスピーカーをペアリングモードにして「スキャン」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/24b4bd5c-2799-9af1-5f3b-66e5ecf1ee7a.png)

`AuraBox-audio`が出ましたので「ペアリング」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/4089868f-1351-b463-857c-aeeee0fa30dc.png)

ペアリングされました！

# 試してみる

早速試してみます。
Gravio Studioでログインし、次のようなアクションを作ってみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/271e7679-2f58-bf01-34e5-a73e41f7d685.png)

コンポーネントは「Sound Effect」を使います。これなら簡単に音を鳴らすことができます。
効果音は適当に選んでみましょう。
アクションを実行するとBluetoothスピーカーから音がなりました！

「Amazon Polly Speech」コンポーネントを使うといろいろ音声を合成することもできますし、「Sound Play」コンポーネントでは好きな音声ファイルを再生することもできます。いろいろ試してみると面白いですよ。

# 参考
* [Gravio][]
* [Sound Effectコンポーネント][Gravio-SoundEffect]
* [Gravio Hubを使ってLAN内にCoordinatorを設置する][Gravio-HubSetting]

[Gravio]:https://www.gravio.com/jp
[Gravio-SoundEffect]:https://doc.gravio.com/manuals/gravio4/1/ja/topic/sound-effect
[Gravio-HubSetting]:https://doc.gravio.com/manuals/gravio4/1/ja/topic/connecting-your-gravio-hub-to-the-network
iOS Simulatorのみでgif画像を録画する

# 概要

Xcode 12.5でiOS Simulatorのgif画像を取得します。
Xcode 12.5から**iOS Simulatorが録画に対応した**ので、そちらの機能を使います。

# Gif画像取得の流れ
1. Xcode 12.5でiOS Simulatorを起動
1. ⌘+Rキーを押下して画面を録画
1. iOS Simulatorを操作
1. iOS Simulatorにある録画停止ボタンを押下
1. 録画結果を右クリックして `Save as Animated GIF` を選択

## iOS Simulatorの録画 
Xcode 12.5から、⌘+Rキーもしくは File→Record Screenで録画ができるようになりました。

## iOS Simulatorの録画の停止
録画中は停止ボタンが表示されるので、停止ボタンをクリックすることで録画が停止します。
<img width="300" alt="録画停止ボタンの表示が上部左に行われる" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687960/6198e6ad-df4a-908e-f449-c17116610bb4.png">

## GIF画像として録画を保存する
録画結果が小さくiOS Simulatorのサイドに現れるので、コンテキストメニューを表示し、`Save as Animated GIF` を選択することで、デスクトップにGIF画像が保存できます。

<img width="300" alt="スクリーンショットのコンテキストメニューに Save as Animated GIF が表れる" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687960/f86d09c1-f87f-6d86-c081-457ca9979be5.png">
スッキリわかるSQL入門　練習問題の実行環境構築

##「[スッキリわかるSQL入門 第2版](https://book.impress.co.jp/books/1118101071)」の練習問題をEqulipseで実行する

インプレス社より、WebのSQL学習環境dokoQLが提供されています。
最初の1章から4章くらいは、dokoQLでも十分ですが、学習がすすむにつれて、自分のPCで実行できた方が、SQLの練習が楽になると思いました。
SQLのプログラムデータをファイルに保存したり、作成したデータベースを保存しておいたりできるので、学習途中のデータ保存などができるため、便利です。
私が実行したSQL環境立ち上げ手順を以下に示します。

### 1. Eclipseのインストール
 SQL実行環境としてEclipseをインストールします。
 ここでは、EclipseのJava用のインストールを行います。
 [Pleiades(Java環境)インストール手順](https://sukkiri.jp/technologies/ides/eclipse/pleiades_install.html)

### 2.EclipseにDBeaverの追加
 上記、Eclipseインストールでは、SQLのコマンドが実行できません。Eclipseに、DBeaverをインストールします。
 Eclipseを立ち上げて、「ヘルプ」→「Eclipseマーケットプレイス」を選択して、DBeaverをインストールします。
 ※「スッキリわかるSQL入門 第2版」で提供されているデータは、PostgreSQLでの実行を前提としています。そのため、**PostgreSQL接続**を実行する必要があります。
 [EclipseのプラグインDBeaverのインストールとSQLiteへのアクセス](https://qiita.com/util15/items/072b7849deffa607ff7d)


### 3.PostgreSQLをインストール＆接続
  2.EclipseにDBeaverの追加後、PostgreSQLに接続します。
 SQLiteは、Eclipseだけでよかったのですが、PostgreSQLは、インストールする必要があります。
　[PostgreSQLののインストール方法](https://sukkiri.jp/technologies/databases/postgresql/postgresql_install.html)

### 4.Eclipseで、データベース作成&スクリプト実行
 Eclipseを立ち上げて、データベースプロジェクトを作成(図中の赤丸部分）。
その後、データベース接続を実行(図中の赤丸部分）。また、スキーマをpublicで作成する。
![DBproject.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1583464/1497752e-9378-1e09-f443-703492f66142.png)

インプレス社より提供されているSQLスクリプト(ddlフォルダ内の該当スクリプト）を実行すると、テーブルが作成される。
上手くいった場合👇
![SQLScript_ok.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1583464/ffc986b1-d26b-bec4-b664-c8dd9d9837b9.png)
３のPostgreSQL接続していないと👇のようなエラーが発生する。
![SQLScript_ng.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1583464/8ea9d83a-3c20-ed30-1fe2-e72b2ec25601.pn「SWL「SWL

※SQLスクリプト実行時は、SQLスクリプト実行を選択する。SQL実行だと上手く実行できないことがある。
![doSQLscript.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1583464/8310b863-e87a-d48f-4ae9-846013aecc84.png)
【論文紹介】Playful Taste Interaction

#論文紹介
論文：Playful Taste Interaction
著者：Christiane Moser, Manfred Tscheligi
https://dl.acm.org/doi/pdf/10.1145/2485760.2485828

#どんなもの
　味覚を動的に変化させるペロペロキャンディデバイスのLOLLioを使ってユーザ(子供)のゲームの体験と味覚の相互作用を調査した。ゲーム中にプレイヤーが障害物にあたった場合や攻撃された場合にクエン酸を提示した。実験の結果、LOLLioを使ってゲームを行うととても楽しいと感じた。また、プレイ中に酸味を感じれば感じるほど、甘味は変わらないのにも関わらず、LOLLioは甘く感じられた。この研究は、ゲーム内の味覚インターフェースとして食べ物や味覚を使用することの可能性を示した。

#先行研究と比較してすごいところ
　人と食べ物との相互作用についての研究は少ない。この論文では、人と食べ物の相互作用と味覚に関する将来の研究を刺激することを目的とした。

#技術や手法のキモ
　LOLLioを使って遊び心のある味覚の相互作用を調査して、子供たちの経験を探り、特に味覚がどのようにフィードバックメカニズムとして使われているのか調査した。
　LOLLioはモーションセンサーによる入力と味覚によるフィードバックの2つの目的がある。LOLLioは加速度センサーを備えたハンドル周りを移動することで、ある程度有形の入力を可能にして、ハンドルに含まれるポンプとリザーバーで味に基づいた出力を提供する。
　　DoodleMazeと呼ばれるゲームを用いて実験を行った。1人のプレイヤーはWiiバランスボードを使って、もう1人のプレイヤーがLOLLioを操作することで体験を比較した。
　プレイヤーが障害物をよけれなかった場合や相手に撃たれた場合にはクエン酸を提示する。


#検証方法
　DoodleMazeを10分間プレーして、1人はLOLLioをもう1人はWiiバランスボードを使って遊んでもらう。LOLLioを使って遊んだ子供に甘味と酸味の強さを感じたか評価してもらう。また、ゲームのプレイ後にゲームの体験(楽しさ、好奇心、共同体験)についても評価してもらう。
　
→LOLLioでゲームはとても楽しいと感じ、Wiiバランスボードを使ったゲームは中立だった。バランスボードは「楽しい」「簡単」「直感的」「素晴らしい」「わくわくする」「少し難しい」「子供っぽい」「退屈」「混乱」などの意見があった。
→この味覚ゲームでは、酸味の濃度変化が正しく認識され、酸味がフィードバックメカニズムとしてうまく利用されたことがわかった。


#議論
　極端に酸っぱい味を好むのは、一般的に極端な刺激を好み、人生の中で新しい刺激的な出来事を求めようとする傾向がある？？


#気になった論文
 LOLLio: exploring taste as playful modality
Power Apps で TextInput のデフォルトの文字を選択時に消す方法

向井です。
社内で質問があったのでこちらにもメモしておきます。

#本記事の内容
Power Apps のテキスト入力(TextInput)のDefaultには「テキスト入力」という文字が入力されています。（この文字列はもちろん変更可能です。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/4975a3ea-8634-941b-cd03-bcd30f5aa9b6.png)


ユーザーがこのTextInputに文字を入力しようとする時、デフォルトではこの「テキスト入力」という文字列を削除してから入力したい内容を入力しなくてはいけません。

ユーザーがTextInputに文字を入力しようとしたとき、このデフォルトの文字を消すように設定できないのかという質問がありましたので回答します。

方法は大きく二つあります。

#1. ユーザーがTextInputを選択したときにDefaultに入っている文字を消す方法
質問に直球で答えるならこの方法です。
**先に書いておくとこの方法は最適解ではないと思うので、もっと簡単・最適な方法を知りたい方は読み飛ばしてください。**

ScreenのOnVisibleに*UpdateContext({ mainText: "テキスト入力" } )*と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/5a2fdf5e-9eab-12f1-9687-670ff8073303.png)

TextInputのDefaultに*mainText*と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/8c039a3b-af42-c6a5-7854-e55edaa1dac1.png)

TextInputのOnSelectに*UpdateContext({ mainText: "テキスト入力" } )*と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/936346e1-31f0-6f53-6eba-c5fb001160bc.png)

完成です。

※テストをするときはいったん他のScreenからNavigateによって該当のスクリーンに移動するようにしてみてください。

この方法はもちろんSet関数でも実現可能ですが、[UpdateContext関数](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-updatecontext)を使うとそのスクリーンの中だけで有効な変数を作成できます。

※この方法は[こちらの記事](https://powerusers.microsoft.com/t5/Building-Power-Apps/Clear-Text-Input-on-Select/td-p/8228)を和訳しまとめ直したものです。

#2. HintText を使う
私的にはこちらの方法の方がスマートだと思います。

まず、TextInputのDefaultを空欄にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/ecf6a803-d8d1-cdc9-f4a5-41f7a46b0588.png)

次に、TextInputのHintTextに"テキスト入力"と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/291224f1-3de6-d19f-44a6-6e2324f6b231.png)

完成です。とても簡単です。

しかも、この方法では、ユーザーがTextInputをクリックすると文字列が消えますが、
文字を入力せずに他の場所をクリックすると、また文字列が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/48294105-de16-e0a3-91f3-688b58582875.png)
↓
クリック
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/f2dbc0bc-e290-606d-3c0d-b31f031519d1.png)
↓
何も入力せずに他のところをクリック
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/974fbc06-c6b9-0a2d-fd79-2ac86326883e.png)

対して１の方法ですと、一度消えてしまった文字列は再度Screenを表示し直さない限り戻ってきません。。

簡単さ、利便性の観点からも２のHintTextを使用する方法がおすすめです。
nasmの作法 その3

#概要

nasmの作法、調べてみた。
msvcrt.lib使ってみた。

#makefileを書く。

```
hello3.exe: hello3.obj
    link.exe /OUT:hello3.exe hello3.obj msvcrt.lib
hello3.obj: hello3.asm
    nasm.exe -fwin32 hello3.asm



```

#サンプルコード

```
global _main
extern _printf
section .text

_main:
	PUSH 	EBP
	MOV 	EBP, ESP
	PUSH 	msg
	CALL 	_printf
	MOV 	EAX, 2
	MOV 	ESP, EBP
	POP 	EBP
	RET

section .data

msg:
	db `Win32\r\nWorld!`, 0



```

以上。
Railsのsprockets4.xでengineの設定を行う方法

sprockets4.xからprecompileの設定方法が変わりましたが、一部機能をengineや別のgemに切り分けている場合、うまくprecompileされない問題が発生しましたので、解決方法をまとめます。

# 環境

- rails 5.2.6
- speockets 4.0.2

# 解決方法

#### Rails（本体）側の設定

- `app/assets/config/manijest.js`に`//=link {engine_name}`を追加

#### Rails(engine)側の設定

- `app/assets/config/{engine_name}.js`を作成
- precompileが必要なファイルを作成したjsに設定する（記法はmanifest.jsと同じ）

# おまけ

- [sprockets3.xから4.xへの移行ガイド](https://github.com/rails/sprockets/blob/master/UPGRADING.md)
husky 4.3.8でフックが機能しない場合の対処方法まとめ

2021年6月14日現在、huskyの最新バージョンは6.0.0ですが、4から６の間で破壊的な変更があり、バージョン4を使っている人もいるかと思います。
今回はバージョン４の最新版であるhusky 4.3.8でフックが機能しない場合の対処をご紹介します。

## ３つの対処方法
### 対処方法1 ： huskyのファイルの有無
作業ディレクトリで、下記コマンドを実行してhuskyのファイルが存在するか確認します。

```bash
ls .git/hooks
```

+ husky.sh
+ husky.local.sh

が存在することを確認してください。
なければhuskyを再インストールして、フックが機能すれば解決です。

### 対処方法2 : gitのフックを一旦削除
下記コマンドでgitのフックを一旦削除します。

```
rm -rf .git/hooks
```

削除したあと、再度huskyをインストールしてフックを作成しなおして、フックが機能すれば解決です。


### 対処方法３ : 
誤ってバージョンを５以降に上げてしまった場合は下記コマンドで解決するはずです。
詳細は参考リンクを参照してください。

```
git config --unset core.hookspath
```

## 参考

https://github.com/typicode/husky/issues/896
JavaScriptの変数定義について

#はじめに

日々忘却曲線との戦い。

学習したら前に学習した事が忘れ。。。

少しも抜け漏れがないように本日もアウトプットしていきます。

#JavaScriptとは

プログラミング言語の1つで主にクライアントサイドにおいて力を発揮します。すなわち、「ブラウザ上でのアプリケーションの使いやすさ」や「リクエストの送り方の工夫」をJavaScriptは担っています。

もっと深掘りしていけば*Node.js*でサーバー側の実装を行う事もでき、*Electron*でデスクトップアプリケーションも作る事ができます。

#変数の定義の方法

JavaScriptでは **`var`** **`let`** **`const`** を ~~演算子~~ 宣言します。

###var

varは再定義、再代入可能な古い書き方です。
過去のアップデートでvarという書き方あまりせず、これから紹介するconst,letがよく用いられます。

```.js
var name = 'Yamada'
name = 'Tanaka'

console.log('hello' + name)

// helloTanaka
```

###let

letは、後で書き換えることができる変数を定義する書き方です。letの特徴として、再代入は可能ですが、再定義は不可という制約があります。

```.js
let name = 'Yamada';
name = 'Tanaka';
console.log('hello' + name)

// helloTanaka
```

###const

constは、後から書き換えることができない変数を定義する書き方です。constの特徴として、再代入、再定義ともに不可という制約があります。

```.js
const name = 'Yamada';
name = 'Tanaka';
console.log('hello' + name)

// Uncaught TYpeError: Assignment to constant variable at ◯◯.js:◯
// 訳）　const nameに新しい値を設置しようとしてますよ！
```

#型について
JavaScriptのデータの型はいくつか存在します。

- 数値を表す*number*

- 文字列を表す*string*

- 真偽を表す*boolean* 

- 未定義を表す*undefined*

- 空のオブジェクトを表す*null*

- 他のシンボルと値が重複しない値を表す*symbol*

JavaScriptは動的型付け言語と言い、定義する時に型を定義しません。
言葉では説明が難しいのでコードで説明します。

*variable*の変数に文字列を格納します。
しかしその後に数値を上書きすることもできます。

```.js
//文字列格納
let variable = 'str';
//数値を上書き
variable = '10'
```

*let*と*const*を使って変数を定義するので定義した時点では型が決まっておらず、格納された値によって変数の型が決まります。

実際に*console.log(typeof variable)*で確認します。

```.js
let variable = 'str';
console.log(typeof variable)

//string

variable = 10;
console.log(typeof variable)

//number


variable = false;
console.log(typeof variable)

//boolean


variable = undefined;
console.log(typeof variable)

//undefined
```
【Rails】エラーメッセージの表示

# 目的
Railsで作成したアプリにエラーメッセージを表示する。

# 開発環境
macOS: *Big Sur*
Rubyバージョン: *2.6.5*
Railsバージョン: *6.0.0*

# 前提
- アプリを作成済み。[【Rails】簡単な投稿アプリの作成](https://qiita.com/oak1331/items/18a4f3a3386aab0fa354)

# 手順

1. [はじめに](#はじめに)
1. [エラーメッセージファイルの作成](#エラーメッセージファイルの作成)
1. [ビューファイルの編集](#ビューファイルの編集)

# はじめに

今回はエラーメッセージの表示を実装していきます。

# エラーメッセージファイルの作成

それでは早速始めていきます！
まずはエラーメッセージを表示させるためのファイルを作成します。

```ruby:
<% if @post.errors.any? %>
  <div class="alert alert-warning">
    <ul>
      <% @post.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
    </ul>
  </div>
<% end %>
```

`errors.full_messages`で全てのエラーメッセージを配列で取得します。
今回は投稿の`post`を例にしています。

# ビューファイルの編集

次にエラーメッセージを表示させたい箇所に、先程作成したファイルを呼び出す記述をします。

```ruby:app/views/posts/new.html.erb
#省略
<%= form_with model: @post, local: true do |f| %>
  <%= render 'layouts/error_messages', model: f.object %>
#省略
```

これでエラーメッセージが表示されると思いますので、確認してみてください。

# 最後に

以上でエラーメッセージの表示実装は完了です。
では。
【合格体験記】未経験でJava Silverに合格・実際の試験内容など

#はじめに
2021年6月にJava SE11 Silverを受験し、合格しました。
勉強方法や実際の試験内容など諸々まとめましたので、これから受験予定の方の参考になれば幸いです。

#Java SE11 Silver概要

**◇試験日程**：通年開催
**◇受験料**：３万円ほど（楽天でオンラインチケットを購入したら3000円ほどお得でした）
**◇受験方法**：会場受験、自宅受験から選べる
**◇出題数**：80問（180分の制限時間）
**◇合格ライン**：63％以上取れば合格

#勉強開始時の私のスペック
Java Silver勉強開始前の私のスペックは下記の通りです。

・HTMLとCSSが書ける
・JavaScriptとSQLを少し勉強したが殆ど忘れている
・実務経験０
・会社で２か月間Java研修を受けた

#使用したテキスト
![bookfan_bk-4295007625.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1280658/32a52469-d803-b4b1-7795-f2dc34ded4c9.jpeg)
使用したテキストは、こちらの**黒本１冊のみ**です。
２か月間Javaの研修を受け基礎は身についていた状態だったので、入門書等は使用せず問題集のみで勉強しました。
完全にJavaを０から勉強される場合は、入門書を読んでから黒本に進まれた方がスムーズかと思います。

#勉強期間と勉強方法

###【勉強期間】
勉強期間は**１か月半**です。

###【勉強方法】
下記の勉強方法が、効果が高かったです。
やはり問題集を眺めるだけではダメで、**実際に手を動かしてコードを書く**ことが大切だと感じました。

**◇勉強方法**
①黒本の問題を１章解く。
②答え合わせ。間違えたものは解説を読んで理解する。
③解説の要点をノートにまとめる。（[ノートはこちらに公開してます](https://qiita.com/mizu4my/items/579e2c69fde35d41a146)）
④実際にコードを書いて、動作確認をする。
⑤①～④が終わったら、次の章に進む。

#実際のところ、黒本は何週すれば良いのか？
私は、５週しました。
ただ、「何週すればよいのか」という問いへの答えはないと思います。
人によっては２周で十分な方もいますし、私のように５週必要な人もいます。
ご自身の**理解度や総まとめ問題の正答率に着目すれば、おのずと何週すれば良いかが見えてくる**と思います。
私が５週必要だった理由は、以下の通りです。

**◇１周目**：とにかく**殆どの問題がわからない。**それでも、**とりあえず１周することが大切**だと思い、なんとか総まとめ問題まで終わらせました。

**◇２周目**：１周目よりはわかる問題が増えたが、劇的に増えたわけではない。２周目にしてようやく**ノートを作り始めました**（１周目の時に作ればよかったと後悔）。わからないところ、初めて知ったところを徹底的に調べてクリアにし、ノートにまとめました。（[まとめたノートはこちら](https://qiita.com/mizu4my/items/579e2c69fde35d41a146)）

**◇３周目**：ようやく総まとめ問題で**正答率が７割に！**合格ラインは63％なので９割を目指してもう１周。

**◇４週目**：総まとめ問題の**正答率は８割後半～９割**に。正直自信はないが、このタイミングで受験予約。

**◇５週目**：試験前日に復習を兼ねて最後の１周。

#試験当日
###◇実際の試験内容
実際の試験内容をざっくりとまとめました。

**①最初の10-20問は精神力を試される**
最初の10-20問は、黒本に似た問題・簡単な問題が少なく、「ナニコレ:sob:」となる問題が多かったです。序盤でメンタルをやられる、というのは他の方も言っていたので覚悟はしていましたが、かなり動揺してしまいました。
**②後半はラクラク。文章問題は黒本と全く同じ。**
後半は黒本と同じ問題や、少し変えた問題が多く、スイスイ進みました。文章問題に関しては黒本と全く同じ問題が多く出ていたので、文章問題は暗記してしまうと強いかと思います。（ただし内容は理解した方が後々のためにもなると思います）
**③時間が１時間も余った。**
私の回答スピードは速くはなかったと思うのですが、見直しをしても１時間余ってしまいました。試験時間に関しては心配する必要はないと思います！

###◇テストセンターでの注意点
①部屋が寒い/暑い場合があるので、脱ぎ着できる服装が良いと思います。
①飲料等持ち込みは一切禁止。
③トイレもおそらく禁止。180分と長丁場になるので事前に済ませておきましょう。直前の水分補給はほどほどに。
④試験前に証明写真を撮られます。身だしなみを整えてから受付に行くことをお勧めします。
⑤ロッカーが小さいので、荷物はコンパクトにしていきましょう。

#落ちた人から学ぶこと
実際にJava Silverに落ちた方がQiitaで体験記を書いていたので、「どういう状態だと落ちるのか」を事前に知ることができました。不合格だった方に共通しているなと思った点は、下記３点です。

**◇総まとめ問題を最後まで解かなかった。
◇答えを丸暗記してしまい、なぜその答えになるのか理解していなかった。
◇さらっと黒本を見ただけだった。**

実務経験のある方でも落ちている方はいたので、やはり真面目に勉強するしかないのだなと思い、上記３点に当てはまっていないか意識しながら勉強しました。
laravel8 jetstream inertia.js環境でapiキーを隠してgitにpushする方法

前回もapiキーを隠す記事に誤りがあったので修正として
再投稿することにしました。

#参考記事

inertia.js公式ドキュメント(共有データ)
https://inertiajs.com/shared-data

#実行環境
laravel8, jetstream, inertia.js, vue3 google-maps(npmパッケージ)

#実装方法
.envで呼び出す方法としては、
１. .envで　MIX_API_KEY=自分のapiキー　を記述
2. resources/app.jsでMIX_API_KEYの前にprocess.env.を記述

この2つだけで呼び出し自体はできるが、public/app.jsでコンパイルされる際に
apiキーが漏れてしまう、、、
※私はこれで実際にgoogleからapiキーが漏れていますとメールがきました（笑）

なので、上記の方法とは別の方法で実装します。
今回はgoogle map apiを使うためそのキーで実装しました。


まず、.envにapiキーを記述します。

``` envファイル.
MIX_API_KEY=自分のapiキー
```
※MIXをつけることで他のファイルでも呼び出せるようにします。



次に、app/http/middleware/HandleInertiaRequests.phpの
shareメソッドにこのように記述。

```HandleInertiaRequests.php
public function share(Request $request)
    {
        return array_merge(parent::share($request), [
            'map_api_key' => env('MIX_API_KEY'),
        ]);
    }
```

このように記述すると、 .envに指定したMIX_API_KEYをmap_api_keyとして
呼び出せます。

最後に、resources/app.jsにmap_api_keyを呼び出せるようにします。

```app.js
require('./bootstrap');

// Import modules...
import { createApp, h } from 'vue';
import { App as InertiaApp, plugin as InertiaPlugin } from '@inertiajs/inertia-vue3';
import { InertiaProgress } from '@inertiajs/progress';
import VueGoogleMaps from '@fawmi/vue-google-maps';

const el = document.getElementById('app');

createApp({
    render: () =>
        h(InertiaApp, {
            initialPage: JSON.parse(el.dataset.page),
            resolveComponent: (name) => require(`./Pages/${name}`).default,
        }),
})
    .mixin({ methods: { route })
    .use(InertiaPlugin)
    .use(VueGoogleMaps, {   // google map api
        load: {
            key: JSON.parse(el.dataset.page).props.map_api_key
        },
    })

    .mount(el);

InertiaProgress.init({ color: '#4B5563' });
```

これでコンパイルされてもapiキーが漏れるリスクが減ると思います。
漏洩したくない情報を扱うときは慎重にやろうと思いました、、、
英文をちゃんとキャピタライズしたい

[![Github](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1646184/0e201e0c-e21f-a715-4353-142b23059ccd.png)](https://github.com/saliton/Capitalize/) [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/saliton/Capitalize/blob/master/Capitalize.ipynb)
ご覧いただきありがとうございます。
Google Colaboratoryにアカウントをお持ちの方は、上の「Open in Colab」という青いボタンを押せば直接notebookをColabで開けます。ぜひ動かしてみてください。
過去の記事も含め、全てのコードを[Github](https://github.com/saliton)で公開しています。

---
ある英語のチャットボットを試した時、以下のように出力してくるものがありました。<br>
> that ' s cool . i like watching sports . do you have any hobbies besides tennis ?

人間なら特に問題なく読めるのですが、これを機械翻訳に連携させた時に困ったことがありました。翻訳の品質が落ちてしまうものがあったのです。ちゃんとキャピタライズさせてから入力したほうがはるかに翻訳品質がよかった。

というわけで、キャピタライズする関数を書いてみました。



```python
import re

def upperEnd(obj):
    '''引数の末尾を大文字にする'''
    return obj.group()[:-1] + obj.group()[-1].upper()

def capitalize(text):
    '''文をキャピタライズする'''
    text = re.sub(r'\s*([\.?!,])', r'\1', text)     # 句読点の前の空白を削除する
    text = re.sub(r"\s'\s", "'", text)            # 'の前後の空白を削除する
    text = re.sub(r'[\.?!:]\s+.', upperEnd, text) # 句点の後の最初の文字を大文字にする
    text = text[0].upper() + text[1:]           # 文の最初の文字を大文字にする
    return text

print(capitalize("that ' s cool . i like watching sports . do you have any hobbies besides tennis ?"))
```

    That's cool. I like watching sports. Do you have any hobbies besides tennis?


以上です。何かの参考になれば。
【Rails6】jQueryの導入

# はじめに
Rails6でjQueryを導入する手順を備忘録としてまとめたいと思います。
バージョンがRails6より前の場合はGemを使うそうですが、Rails6以降では導入する方法が違うようです。
導入にあたりこちらの記事を参考にさせていただきました。
https://ymiyashitablog.com/rails-jquery/

# 導入手順
jQueryを導入したいアプリケーションのディレクトリに移動

```:ターミナル
% cd アプリ名
```
yarnコマンドを実行

```:ターミナル
% yarn add jquery
```
environment.jsファイルにコードを追加

```Javascript:config/webpack/environment.js
const { environment } = require('@rails/webpacker')

const webpack = require('webpack')
environment.plugins.prepend('Provide',
  new webpack.ProvidePlugin({
    $: 'jquery/src/jquery',
    jQuery: 'jquery/src/jquery'
  })
)

module.exports = environment
```

application.jsファイルにrequire("jquery")を追記

```Javascript:app/javascript/packs/application.js
require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")
require("jquery")
```
導入の手順は以上になります。
機械学習勉強記録 外れ値の除去 3σ法

# 1 外れ値とは
外れ値は、統計学において、他の値から大きく外れた値のことです。
モデルに学習させるうえで、精度を下げてしまう要因になるので、学習前に除去しておくことで、モデルの評価値が向上します。

# 2 3σ法
今回は、外れ値を除去するのに3σ法を使う方法を紹介します。
3σ法では、平均と標準偏差を使って、外れ値を除去します。

$\mu$ 平均
$\sigma$ 標準偏差
としたとき、

```math
\mu-3\sigma \leq x \leq \mu+3\sigma
```
という数式です。

```python
# 平均値
mu = df['A'].mean()
# 標準偏差
sigma = df['A'].std()
# 3σ法の中身を取得
df2 = df[(mu - 3 * sigma <= df['A']) & (df['A'] <= mu + 3 * sigma)]
```
この`df2`が上記の数式でいう`x`にあたります。
これで外れ値を除去することができました。

# 2.1 対数変換
対数変換は、きれいに正規分布していないデータを、なんとか無理やり正規分布に近似させたい時に使います。
絶対に正規分布に近づくというわけではないのですが、とりあえず試してみて損はない方法です。
例えば3σ法の前に使うとしたら、コードはこのようになります。

```python
# 対数変換
logA = np.log1p(df['A'])
# 平均値
mu = logA.mean()
# 標準偏差
sigma = logA.std()
# 3σ法の中身を取得
df3 = df[(mu - 3 * sigma <= logA) & (logA <= mu + 3 * sigma)]
```
Raspberry Pi Picoの初期設定してLEDを光らせる

# Raspberry Pi Picoの設定
1.Bootselのボタン押しながらUSBに接続
2.フォルダが表示されたら「BOOTSEL」ボタン離す
3.「INDEX.HTM」のファイルクリック
4.raspberrypiのサイトが表示される
> https://www.raspberrypi.org/documentation/rp2040/getting-started/

5.pythonのインストール
　1.「Getting started with MicroPython」ダウンロード
　　```Download UF2 file```をクリックして「UF2」ファイルをダウンロード
　2.「INDEX.HTM」のファイルが入っているフォルダーに、
　　ダウンロードした「UF2」ファイルを挿入
　3.Raspberry Piが再起動する（ドライブに表示されなくなる）
  4.Windowsの設定で確認
　　01.[コントロール パネル\ハードウェアとサウンド\デバイスとプリンター]
　　02.[「Board in FS mode」選択
　　　　（名前が違う可能性あり。わからない場合USB抜き差しで確認）
　　03.タブの「ハードウェア」選択
　　04.```USB シリアルデバイス(COM3)```が表示されていれば```OK```

# thonny設定
1. Raspberry触るためにthonny設定
1. osに沿ったファイルのダウンロード。（今回はWindows）
1. ファイルを開いて、thonnyのインストールする
1. 「thonny.exe」開く
1. 「ツール > option > インタプリタ」
1. thonnyはコードの実行にどの....```MicroPython（Raspberry Pi Pico）```選択
1. port```USB シリアルデバイス(COM3)```選択



インストール
https://thonny.org/


参考サイト
https://krr910183393.wordpress.com/2021/02/15/raspberry-pi-pico-%e3%81%ae-micropython-%e3%82%92-thonny-python-ide-%e3%81%a7%e9%96%8b%e7%99%ba%e3%81%99%e3%82%8b/

https://krr910183393.wordpress.com/2021/02/14/raspberry-pi-pico-%e3%81%ab-micropython-%e3%82%92%e6%9b%b8%e3%81%8d%e8%be%bc%e3%81%bf-tera-term%e3%81%a7l%e3%83%81%e3%82%ab%e3%81%99%e3%82%8b/
ラズパイでロータリエンコーダ

なんかハマったのでメモ。

（最近はまたメインで使うおもちゃはラズパイ zero に戻ってます。
USB-OTGで一本でつながるの便利だし、OSのアップデートもちゃんとあるし、そこそこ安いし、ノウハウもネットに転がりすぎ...)

さて、本題。あるオモチャにロータリエンコーダをつけてみようと思ってブレッドボードで組んでみた。

イチから書くのもめんどくさいのでネットにあるやつをコピペして試してみたけど、全然うまくいかない。チャタってるのかと思ってコンデンサやらガード定数を変えてもうまく行かない。コードを見てみるとA,Bの波形が50%の方形で均等に出て、しかもABの両方の両エッジでカウントするようになっていた。つまり1デテントごとに4カウント。この想定は私の使ってるエンコーダとはあってなかった。私の買ったのは、BournsのPEC11シリーズのもので、1デテントごとにA,Bにパルスがちょっと出て、その位相がずれているというものだった。

というわけで書き直し。Aのライジングエッジのみで割り込みがかかり、その割り込み時にBの信号を読み、0だったら左回転、1だったら右回転とみなせばいいだけだった。

```python:enc.py
#!/usr/bin/python
import time
import RPi.GPIO as GPIO
# GPIO pin assign
REa= 17
REb= 27
re=0

def callback(callback):
    global re
    if (GPIO.input(REa) == 1) : 
      if (GPIO.input(REb) ==1 ):
         re=re+1
      else:
         re=re-1
    print(re)

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(REa, GPIO.IN)
GPIO.setup(REb, GPIO.IN)
GPIO.add_event_detect(REa, GPIO.RISING, callback=callback, bouncetime=5)

try:
    while(True):
        time.sleep(0.1)
except KeyboardInterrupt:
    print("break")
    GPIO.cleanup()
```
WSL2のUbuntuにTailscaleを使ってSSH接続する

## 環境
Ubuntu 20.04
tailscale 1.20.4

## インストール

まずは、[Tailscale](https://tailscale.com/)にブラウザからログインしましょう。
Google, Microsoft, GitHubアカウントでログインできます。
ログインするだけで特に何かを入力する必要はありません。

次に、公式の[ダウンロードページ](https://tailscale.com/download/linux)にしたがってUbuntuにtailscaleをインストールします。

```bash
curl -fsSL https://tailscale.com/install.sh | sh
```

## 起動
WSLではsystemdが動いていないためサービスを自分で実行します。

```bash
sudo tailscaled
```

ただし上記のコマンドの場合、ターミナルを閉じると`tailscaled`も終了してしまうので以下のコマンドの方が良いかもしれません。

```bash
sudo nohup tailscaled > /dev/null 2>&1 & 
```

以下のコマンドで認証します。

```bash
sudo tailscale up
```

成功すると、[tailscaleの管理ページ](https://login.tailscale.com/admin/machines)にこのマシンが登録されています。
これ以降は`tailscale up`を実行しなくても`tailscaled`が動いていれば自動的にログインされます。

tailscaleのテストサーバーにpingして通ればOKです。

```bash
ping 100.101.102.103
```

IPv6を使っている場合、無効にする必要があるかもしれません（私の環境では動いたので設定していません）。

```bash
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
```

### クライアント側
クライアント側でも同じようにtailscaleをインストールします。
systemdを使っている場合サービスの起動を忘れないようにしましょう。

```bash
sudo systemctl enable --now tailscaled
```

クライアントからWSL2にpingが通れば（もちろんtailscaleのIPを使って）終わったも同然です。

## SSH
WSL2側で忘れずにsshサービスを起動します。

```bash
sudo service ssh start 
```

後はクライアントから`ssh`するだけです。簡単！

## 参考
- [Using Tailscale on Windows to network more easily with WSL2 and Visual Studio Code](https://www.hanselman.com/blog/using-tailscale-on-windows-to-network-more-easily-with-wsl2-and-visual-studio-code)
VScodeでLaTeXのPDFがプレビューされない問題の解決

最近、LaTeXをvscodeで書き始めました。
今回は、いつもPDFでプレビューされていたのに急に空白のタブでプレビューされない問題が発生したので、メモとして残しておきます。

変なテンションで冗長に書いてしまったので、早く解決策を知りたい方は[こちら](#3解決)へジャンプ。

LaTeXをVScodeで書くための環境構築は下記記事を参考にしました。
[VSCode で最高の LaTeX 環境を作る](https://qiita.com/rainbartown/items/d7718f12d71e688f3573)
使用OSはMacです。

##0.問題の発生
実験レポートが立て込み、汗あせとレポートを書いているとある日、PDFビュアーに何も表示されなくなりました。
![スクリーンショット 2021-06-14 14.49.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/727850/ab425fe8-b88a-5f94-198a-3ba93a3393b8.png)

##1.試行錯誤
まずは原因を探るべく、ネットで調べました。
しかし、出てくるのは、どれもlatexmkrcの設定等、僕が環境構築で行った部分。それはわかってるねん。と思いつつ、万が一のこともあるので、latexmkrcの中身やsetting.jsonなども見直しましたが、間違いはあらず。
次に、これはlatex-work-shopの問題だろうと思い、一旦アンインストールして再度入れ直しました。
しかし、相変わらず、表示されませんでした。

##2.解決への糸口
そこで、今一度、ネットでの検索にもどり、1の段階では手を出さなかった英語の文献にもちゃんと目を通しました。
その過程で、以下に出会いました。やっぱりバージョンを疑うのが定石ですか。
https://github.com/James-Yu/LaTeX-Workshop/issues/949
他のパソコンでは正常にpdfを見ることができたし、ファイル外に問題があると考えていた僕は再度環境のバージョンを見直すことにしました。

##3.解決
Latex-work-shopのバージョンを再度確認。
![スクリーンショット 2021-06-14 15.18.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/727850/7ad8bde3-c320-cf2a-f8f3-40adaf97ed59.png)
お、6/11にバージョンアップされてるな。え？ちょうど6/11あたりから表示されなかったはず。ここに問題があると考えた僕はvscodeの更新の確認。
確認をすると、右下にこんなエラーが。

```
Cannot update while running on a read-only volume. 
The application is on a read-only volume. 
Please move the application and try again.
 If you're on macOS Sierra or later, you'll need to move the application out of the Downloads directory. 
See this link for more information.
```

なんだこれと思って、調べると解決策を発見。なるほど、vscodeをダウンロードに入れちゃってたのか・・・
そしてvscodeを更新したら無事に表示されました！
![スクリーンショット 2021-06-14 15.50.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/727850/b54b8b12-5127-9436-2ee0-cb59ed1ac234.png)

今回の教訓は、
・アプリのダウンロード時にはどこに入ったのかを確認する。
・バージョンのをまずは疑う。
・英語の記事も読む。

これからガンガンlatexを使って慣れていきたいと思います！

##参考
https://nullpoint.hatenablog.com/entry/2019/04/06/085430
https://github.com/James-Yu/LaTeX-Workshop/issues/949
Proxy環境下のwsl2 ディストリビューションインストール

# TL;DR

`WSLENV`を使う

# 概要

Proxy環境下でWSL2 ディストリビューションをインストールしてみたところ、AlpineのようにStoreからインストール完了後、初期起動時にパッケージをダウンロードするようなディストリビューションではshell起動までたどり着けませんでした。

Storeからのインストール時はWindowsのProxy設定が効くものの、Alpine初期起動時点ではProxy設定が反映されていないためのようです。

パッケージがダウンロードできずshellも起動しないため、AlpineのProxy設定を書き換えることができません。

対策として、WSLENVを使ってProxy設定の環境変数をAlpine起動前から引き渡すことでAlpineとしてインストール完了までできたため、備忘録として残します

# 方法

1. Windowsのシステム環境変数を開く
1. 各ディストリビューションのパッケージマネージャが参照するProxy接続用の環境変数をセットする
    1. 例: http_proxy など
1. 上記環境変数名を WSLENV に記述する
    1. コロン区切り
1. Microsoft Storeからディストリビューションをインストール

# 注意点

- Windowsは環境変数の大文字小文字を区別しないようなので、http_proxy か HTTP_PROXYのどちらかに一方のみをWSLENVに指定した方が無難
- 参照されるProxy環境変数は、ディストリによって異なると思うので事前に調べておく


# 例

## Alpine Linux

下記相当をWindowsのシステム環境変数でセットする

```
http_proxy=http://some.proxy.host:proxy_port
https_proxy=https://some.proxy.host:proxy_port
WSLENV=http_proxy:https_proxy
```

Microsoft Storeでディストリビューションをインストールする
gitコミットやプッシュ時のフックを無効化する方法

gitのフックを使うことで、コミットやプッシュ時にテストやlintを走らせることができ、
コードの品質をある程度保つことができるため、特にチーム開発などではとても便利なのですが、
一時的にフックを無効化したい場合の対処方法を紹介します。

## 対処方法
gitコマンドのオプションとして
`--no-verify`
をつけることで、フックを無効化することができます。

```
git commit --no-verify
git push --no-verify
```


## 追記：VSCodeでコマンドを実行する場合
VSCodeの設定で`Git: Allow No Verify Commit`にチェックを入れます。

![vscode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416412/a15a6e29-edee-6f46-a27c-c59ea420538c.png)
Gmailに届くAWSの請求書を毎月自動でGoogleドライブに保存する

# はじめに
こんにちは。最近実家の畑に知らない人が勝手に耕したりしているそうで、母親がばちぼこぷんぷんまるで、警察のお世話になりそうです、筆者です :angry: 

さて、今回はみんな大好き**AWS**から、毎月メールで届く請求書を**Googleドライブ**に保存しようと思います！

# 前提
1. 毎月4日に届いている(気がする).
1. 送信元メールアドレスは `aws-receivables-support@email.amazon.com`.
1. メールの件名は `Amazon Web Services Invoice Available [Account: 123456789012] [Invoice ID: 123456789]` な感じ.`

# 手順
1. 当月既に処理済みの場合は正常終了.
2. 当月届いた当該メールを検索.
3. 2のメールからPDFファイルを取得.
4. 3のPDFファイルを指定のGoogleドライブアップロードする.
5. 4のPDFファイル名をYYYYMMに変更.
6. 2のメールをゴミ箱に移動.
7. もし2でメールが存在しなかった場合は翌日の同時刻に再実行トリガーをセットして正常終了.
8. 1-7を毎月5日に定時実行する.

# 実スクリプト

手順8のトリガーは別途設定して下さい！:bow:

```js
const main = () => {
  const now = new Date()
  const ymd = Utilities.formatDate(new Date(now.getFullYear(), now.getMonth(), 1), 'Asia/Tokyo', 'yyyy/MM/dd')
  const folder_id = 'xxxx'
  const file_name = Utilities.formatDate(new Date(now.getFullYear(), now.getMonth(), 1), 'Asia/Tokyo', 'yyyyMM')
  const mail_from = 'aws-receivables-support@email.amazon.com'
  const subject = 'Amazon Web Services Invoice Available'

  // 手順1
  if (0 < DriveApp.getFolderById(folder_id).getFilesByName(file_name).hasNext()) {
    return
  }

  // 手順2
  const threads = GmailApp.search(`from:("${mail_from}") subject:("${subject}") has:attachment after:${ymd}`, 0, 1)
  let messages, message, attachment, uploaded = false
  for (i in threads) {
    if (uploaded) {
      break
    }

    messages = threads[i].getMessages()
    if (messages.length < 1) {
      break
    }

    message = messages[0]
    if (message.isInTrash()) {
      // ゴミ箱にあるメールはスルー.
      break
    }

    // 手順3
    attachment = message.getAttachments()[0]

    // 手順4
    const file_id = DriveApp.getFolderById(folder_id).createFile(attachment).getId()

    // 手順5
    DriveApp.getFileById(file_id).setName(file_name)
    uploaded = true

    // 手順6
    message.moveToTrash()
  }

  if (! uploaded) {
    // 手順7
    ScriptApp
      .newTrigger('main')
      .timeBased()
      .atDate(now.getFullYear(), now.getMonth() + 1, now.getDate() + 1)
      .create()
  }
}
```

# スクリプト実行
初回実行時に、権限を要求されるので許可してください:pray:

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/c0207be9-2c02-2659-969a-fdff9349ae00.png)

実行するとドライブにAWSの請求書が追加されました！
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/f42959ca-c331-9a8c-d482-538a375cb5c4.png)

Gmailも確認すると当該メールがゴミ箱に移動しています:ok_hand:

# おわりに
これでいらないメールが消えて、必要なファイルだけちゃんとドライブにアップロードされるようになりました:v:

皆さんもぜひ！
Larvel8.5.*でTraget Class Does Not Existとでたら

# 前提
Laravel8.5.*

# 事象

Laravelをインストールしてプロジェクトを始めてみたが、以前のLaravelのように
うまくルーティングされない。
エラーとして「Traget Class Does Not Exist」と出る。


# 解決方法

RouteServiceProvider.phpファイルの$namespaceがコメントアウトされています。
コメントアウトを外すと動きます。

```/app/Providers/RouteServiceProvider.php

/**
     * This namespace is applied to your controller routes.
     *
     * In addition, it is set as the URL generator's root namespace.
     *
     * @var string
     */
    // protected $namespace = 'App\Http\Controllers';

```

# 最後に

## 考えた経緯
・エラーメッセージでググってみたら

```
 ->namespace($this->namespace)
```
を付け足すみたいなことを書いてあるのですが、すでに書いてありました。

・動かない理由はつまるところ、$this->namespaceが読み込めてないからだな、と。
・フィールドを読みに行くとコメントアウトされてました。

## 思ったこと
・ある程度柔軟にディレクトリ構造を変えられる便利さを学べてよかったです。
・とはいえ、必要以上の設計は不要かと思います。必要になったら増やす方向で今後もシステム開発したいなと思った次第です。
nasmの作法 その2

#概要

nasmの作法、調べてみた。
makefile使ってみた。

#サンプルコード

```
hello1.exe: hello1.obj
    link.exe hello1.obj /ENTRY:main /SUBSYSTEM:CONSOLE /defaultlib:kernel32.lib
hello1.obj: hello1.asm
    nasm.exe -fwin32 hello1.asm



```

#実行

```
nmake -f make1.txt
```


以上。
react-testing-libraryのクエリで取得できない要素の取得方法

Reactでコンポーネントテストをする際、大抵の要素はreact-testing-libraryのクエリで取得できますが、
BootstrapのCardコンポーネントのテキストなど、要素が取得できないケースがあります。

この記事ではreact-testing-libraryのクエリで取得できない要素の取得方法を紹介します。
####前提
TypeScript, Jest, react-testing-libraryの利用を前提とします。

####　対象のコンポーネント
```tsx
const MyCard: FC<Props> = () => {
 return(
  <Card>
   <Card.Header>header</Card.Header>
   <Card.Body>body</Card.Body>
  </Card>)
}
```

####　テストコード
##### react-testing-libraryのクエリを使用した場合
```tsx
render(<MyCard />)
expect(screen.getByText('header')).toBeInTheDocument()　// テスト失敗
expect(screen.getByText('body')).toBeInTheDocument() 

```

##### react-testing-libraryのクエリを使用した場合

```tsx
const {container} = render(<MyCard />)
expect(container.getElementsByClassName('card-header')[0].textContent)).toBe('header')　　// テスト成功
expect(container.getElementsByClassName('card-body').item(0)?.textContent)).toBe('body')
```
Windows10 PC上の Salome-MecaのPythonのバージョン

# はじめに
Salome-Mecaによる構造解析 入門と初級 を受講することになりましたので、Windows10 PC上へ Salome-Meca2018を インストールしました。
# Python
```python.py
>>> sys.version_info
```
これで実行環境の`Python`のバージョンが確認できます。
# SALOME 8.3.0
![20210614a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/10f606e3-d0c3-8723-d309-05dd59e4cd3a.png)

```cmd.exe
C:\Users\baka>python --version
Python 3.9.5
```
一応Pythonの新しいバージョンを入れているのですが、salomeは`v2.7.10`を読み込んでいるようです。
# SALOME 9.6.0
![20210611a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/279a6f53-8306-564e-6d54-799feca75a9e.png)
別のPCですが、こちらは`v3.6.5`ですね。
# まとめ
+ OpenCAE さんありがとう
+ Salome-Meca さんありがとう
+ Python さんありがとう
Raspberry PIでPython WEB#1（環境構築：Flask）

#概要
今回はRaspberry PIでPython Webを作成のため、環境構築及びサンプルコードを確認します。

#事前作業
次のコマンドで環境を構築します。

~~~bash
# パッケージインデックスファイルのダウンロード
sudo apt-get update
# インストール済みのパッケージ更新をおこない
sudo apt-get upgrade

# Python環境構築インストール
sudo apt-get install python-dev python3-dev python-pip python3-pip

# Python 2.X Flaskインストール
pip install flask

# Python 3.X Flaskインストール
pip3 install flask
~~~

#サンプルソース作成及び起動
①以下のサンプルソースを作成します。
※debug、Host、portを指定すると他のPCでアクセスが可能です。
指定すると同じネットワーク環境内にアクセスができます。
指定しない場合は、実行しているローカル環境のみアクセスが可能となります。

~~~bash
# run.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return '<html><body><h1>sample</h1></body></html>'

if __name__ == '__main__':
    # app.run()
    app.run(debug=False, host='192.168.1.25', port=5000)
~~~

②次のコマンドでサンプルソースを起動します。

~~~bash
pi@raspberrypi:~ $ python run.py
 * Serving Flask app "run" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 # host, portの指定がある場合は、下記のように実行されます。
 * Running on http://192.168.1.25:5000/ (Press CTRL+C to quit)
 # host, portの指定がない場合は、下記のように実行されます。
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
~~~

#他のPCからアクセス
次のURLにRaspberryPIのIPアドレスを入れてブラウザで実行します。

~~~bash
http://xxx.xxx.xxx.xxx:5000
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/0e9e368f-27b3-a0ee-b8a1-ba70d4ebfdd2.png)

#終わりに
環境構築は意外と簡単ですね。
次はHTMLテンプレートに値を渡す方法について説明致します。
Azure Static Web Appsを試してみた

# はじめに
以前より気になっていたサーバーレスの Web アプリ ホスティング サービスである、
「[Azure Static Web Apps](https://azure.microsoft.com/ja-jp/services/app-service/static/)」が2021年05月12日に[GA](https://azure.microsoft.com/en-us/updates/azure-static-web-apps-is-now-generally-available/)されました。
どんなものか触ってみようと思います。

## リソースの作成
### ポータルでの作成
[Visual Studio Codeの拡張機能](https://docs.microsoft.com/ja-jp/azure/static-web-apps/getting-started?tabs=vanilla-javascript)でも出来るのですが、今回はいつもとおり、Azureポータルを利用してリソースを作成したいと思います。

1. ポータルのリソース作成から「Static Web Apps」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/33d33dad-39bb-73d7-6184-cd57b623182c.png)

1. 必要事項の入力
必要を事項を入力し、リソースを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/40307233-2ae4-f979-3c47-8b4cfd5a18ee.png)

- 静的Webアプリの詳細
    - Static Web Appsの名前
- ホスティングプラン
    - Free/Standardが利用可能
    - Free/Standardの違いについては[こちら](https://docs.microsoft.com/ja-jp/azure/static-web-apps/planshttps://docs.microsoft.com/ja-jp/azure/static-web-apps/plans)をご確認ください
- Azure Functions とステージングの詳細（リージョン
    - 2021/6/14 時点では「Central US」「East US」「East Asia」「West Europe」「West US」が選択可能なようです。（日本リージョンは未対応）
- デプロイの詳細
    - GitHubアカウントと連携し、リポジトリーを紐づけます。
- ビルドの詳細
    - フロントエンドに採用しているFWを選択します（今回はAngular
    - アプリの場所(必須)
        - 規定値（/）
    - API の場所
        - 空白
    - 出力先
        - Buildで出力されるディレクトリ(今回はdist/App名）


### 動作確認
作成されたAzure Static Web Appsのリソースに行くと、概要のURLの欄にいつものルールとは異なるURLが払出されています。

- Web Appsの場合
    - https://{webappsの名前*}.azurewebsites.net
- Static Web Appsの場合
    - https://ランダムな文字列.azurestaticapps.net

そのURL「https://ランダムな文字列.azurestaticapps.net」をクリックすると、GitHubに登録してある資材で画面が表示されます。

せっかくなので、[ng new](https://angular.jp/cli/new)で作成したAngularのひな形プロジェクトをポータルで設定したブランチにPUSHしてみようと思います。

すると・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/e3916737-c884-572e-e701-04371bcf9604.png)

ビルド後のAngularのひな形ページが表示されています。

どうも、Static Web Appsを作成した際に指定したリポジトリーの情報と採用したフレームワーク(Angular)で自動Buildと自動Deployを行っているようです。
Build/Deployのルールはyamlファイルとして、リソース作成時にAzureからGitHub上のリポジトリーにPUSHされていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/a172e778-1387-104c-95b2-6be0b50322d1.png)


また、Build/Deployの履歴もGitHub Actionに履歴として保存されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/61874ad5-e06a-eddd-856b-426870360f8f.png)



## まとめ
Azure Static Web Appsのさわりだけ試してみましたが、GitHubとの連携含めて自動Build/DeployまでをUI上だけで実現できるのは、非常に優秀で可能性を感じました。
[次回](https://qiita.com/akihiro-nakano/items/d072542312a2c51a4743)は、GitHub以外でのリポジトリーやFunctionsとの連携を試してみようと思います。
2021年6月1日にてAzureマーケットプレースのLinuxイメージについて

2021年6月1日にて現在のAzureマーケットプレースの最新の主要なディストリビューションイメージSKUとカーネルバージョンのリストです。

ディストロ | イメージのSKU | カーネルバージョン
--- | --- | ---
CentOS 7.9 g2 | OpenLogic:CentOS:7_9-gen2:7.9.2021020401 | 3.10.0-1160.15.2.el7
CentOS 8.3 g2 | OpenLogic:CentOS:8_3-gen2:8.3.2021020401 | 4.18.0-240.10.1.el8_3
Debian 10 g2 | Debian:debian-10:10-gen2:0.20210329.591 | 4.19.0-16-cloud-amd64
Debian 11 g2 | Debian:debian-11-daily:11-gen2:0.20210531.654 | 5.10.0-6-cloud-amd64
Oracle Linux 7.9 g2 | Oracle:Oracle-Linux:79-gen2:7.9.14 | 5.4.17-2102.201.3.el7uek
Oracle Linux 8.1 g2 | Oracle:Oracle-Linux:81-gen2:8.1.11 | 4.18.0-147.8.1.el8_1
RHEL 7.8 g2 | RedHat:RHEL:79-gen2:7.9.2021051702 | 3.10.0-1160.el7
RHEL 8.4 g2 | RedHat:RHEL:84-gen2:8.4.2021052302 | 4.18.0-305.el8
SLES 12 SP5 g2 | SUSE:sles-12-sp5:gen2:2021.03.05 | 4.12.14-16.44-azure
SLES 15 SP2 g2 | SUSE:sles-15-sp2:gen2:2021.03.03 | 5.3.18-18.35-azure
Ubuntu 18.04 g2 | Canonical:UbuntuServer:18_04-lts-gen2:18.04.202105120 | 5.4.0-1047-azure
Ubuntu 20.04 g2 | Canonical:0001-com-ubuntu-server-focal:20_04-lts-gen2:20.04.202105130 | 5.4.0-1047-azure
Gitでリモートブランチの特定ファイルのみをPullする方法

個人的に使い方をｇｇることが多かったためメモ

# 通常のPull
`git pull origin <リモートブランチ名> `
リモート先のすべてのファイルをPullするため必要ないファイルまで取り込んだり，コンフリクトが起きたりする
特定のプログラムだけローカルに持ってきたいときは不便


# 回避策
以下の方法で可能
`git fetch`
最新のリモート追跡リポジトリを取得
`git checkout -m <リモートブランチ名> <指定のファイル名>`　
<-m>オプションでcheckout先のリモートブランチの指定ファイルを現在のブランチにmarge出来るらしい
`git add <指定のファイル名>`
`git commit　-m "コメント"`
変更をローカルブランチにコミット

以上．マージ先のリポジトリとかコンフリクトの処理などはいまいち理解できていないため未来の自分に任せます．

# 参考
[Git-git-checkoutドキュメント] (https://git-scm.com/docs/git-checkout)
[git merge - Gitで1つのファイルだけをプルすることは可能ですか？](https://tutorialmore.com/questions-664395.htm)
[Gitで1ファイルだけをPullしたいときの手順](https://izumii19.hatenablog.com/entry/2020/02/03/165808)
Railsの超基本だけど忘れがちな命名規則

投稿機能を作成していたときにめちゃくちゃつまづいてしまいした

[![Image from Gyazo](https://i.gyazo.com/16267e51d8553200e9cdd4fc6e4d9f8e.png)](https://gyazo.com/16267e51d8553200e9cdd4fc6e4d9f8e)

エラーの内容は初心者でも分かりますね。
'items_path'が定義されてないよ、'items_path'じゃない？
ってことですね。

こういう時はform_withで渡している@itemのスペルミスだったり、controllerで@itemで定義してなかったり、というのがよくあるパターンなのですが、この辺も全部やってた。

で、今回ミスっていた原因はRailsの命名規則に従ってなかったんですね。

controller名が違う！！！！！！！！

そう、対応するcontrollerを「item」で作成していたのですが、これがいけない。

controller名は複数形じゃないといけない。
一方でmodelは単数形。
ちなみにテーブルも複数形。

ということで、今回は
ルーティング、controller名とcontroller内のクラス、ビューのディレクトリ名を変更して、解決。

https://qiita.com/gakkie/items/3afcd505c786364aa5fa
[Linux]シェルスクリプトの基礎知識

#はじめに
前回に引き続き、Linuxのシェルスクリプの基礎知識についてまとめていきます。

#変数の使い方

変数の値を参照するには、変数名の前に`＄`をつけます。

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

appdir=/home/tochi/myapp
echo $appdir
```

####変数の書き方についての注意

- 代入時は`$`はつけないこと
- =の前後にはスペースを入れない
- 変数名に利用できる文字はアルファベットと数値、アンダースコアだけ
- 変数名の区切りは明示する

※区切りを明確にするときは、変数の部分を{}で囲む

#クォーティング

シングルクォートとダブルクォートの違いについて、シングルクォートでは`$`はそのまま$記号として表現されます。

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

country=Japan
echo 'I live in $country'
echo "I live in $country"
```

```:terminal
% ./test.sh
I live in $country
I live in Japan
```

#コマンド置換

コマンド置換では、コマンドの結果を文字列として取得することができます。
なお、これはダブルクォートの中でも有効です。

```:terminal
% echo "Today is $(date '+%Y-%m-%d')"
Today is 2021-06-09
```

#位置パラメータ

こちらは簡単にまとめておきます。
詳しくはこちらの記事が分かりやすかったです。
http://se.cite.ehime-u.ac.jp/~aman/memo/bash/shell_prog1.html

|変数|内容|
|---|---|
|$0|実行時のシェルスクリプト|
|`$1`,`$2`,,|コマンドライン引数の値|
|$#|位置パラメータの個数|
|$@|全ての位置パラメータ、それぞれの位置パラメータがダブルクォートで囲まれる|
|$*|全ての位置パラメータ、全体が一つの文字列としてダブルクォートで囲まれる|

#条件分岐

####if文

if文ではifの後ろにはコマンドをおきます。

```
if <コマンド1>; then
　#処理内容
elif <コマンド2>; then
　#処理内容
fi
```

以下に簡単な例と評価演算子をまとめておきます。

```
#!/bin/bash

int1=$1
if [ "$int1" -gt 3 ] && [ "$int1" -lt 6 ]; then
 echo "int1 > 3 and int1 < 6"
fi
```

|演算子|内容|
|---|---|
|文字列に関する評価演算子||
|s1 = s2|等しい|
|s1 != s2|等しくない|
|-n s1|空文字列ではない|
|-z s1|空文字である|
|数値に関する演算子||
|i1 -eq i2|等しい|
|i1 -ne i2|等しくない|
|i1 -lt i2|i1がi2より小さい|
|i1 -le i2|i1がi2以下|
|i1 -gt i2|i1がi2より大きい|
|i1 -ge i2|i1がi2以上|
|ファイル属性に関する評価||
|-e file|fileが存在する|
|-d file|fileは存在し、ディレクトリである|
|-h file|fileは存在し、シンボリックリンクである|
|-L file|同上|
|-f file|fileは存在し、通常のファイルである|
|-r file|fileは存在し、読み取りパーミッションが与えられている|
|-w file|fileは存在し、書き込みパーミッションが与えられている|
|-x file|fileは存在し、実行パーミッションが与えられている|
|file1 -nt file2|file1の変更時刻がfile2より新しい|
|file1 -ot file2|file1の変更時刻がfile2より古い|
|演算子の結合||
|条件式1 -a 条件式2|両方が真の場合に真|
|条件式1 -o 条件式2|どちらかが真の場合に真|
|!条件式|真偽を逆にする|

#繰り返し構文

####for文

for文は以下のように使用します。

```:terminal
for 変数名　in リスト
do
 繰り返す処理
done
```

```
#!/bin/bash

for name in tanaka yamada toda
do 
 echo $name
done
```

```
#実行結果は以下
tanaka
yamada
toda
```

リスト部分には、コマンド置換をおくことも可能です。

#シェル関数

関数は以下のように定義します。

```
function 関数名　（） 
{
  #処理
}
```

省略形としてfunctionの部分を省くことも可能です。

#おわり

かなりざっくりまとめました。
これらの基礎知識を使って、どんなことができるか次回以降まとめていきたいと思います。
データサイエンス100本ノックの為の Windows Docker 環境構築

# Windows Docker 環境構築

環境構築出来たのでここに記しておきます。

https://qiita.com/karaage0703/items/7b5d54223d06e4b6ef0f

僕は最初、anacondaのJupiternotebookで起動しようとして動かず困っていました（笑）
Docker等を使わないとダメなんですねー
### 手順
①100knocks-preprocessのダウンロード。
②Dockerのダウンロード、インストール。
③Windows 10 用 Windows Subsystem for Linux のインストール。
④Dockerでデータベース構築。

## ①100knocks-preprocessのダウンロード
ダウンロードして任意の場所に解凍。

https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess

## ②Dockerのインストールダウンロード
会員登録しないとダウンロード出来ないかもしれません。

https://hub.docker.com/editions/community/docker-ce-desktop-windows/

## ③Windows 10 用 Windows Subsystem for Linux のインストール
ここと同じようにやりました。

https://docs.microsoft.com/ja-jp/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package

①管理者として実行。

```ruby:コマンドプロンプト
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
```

②管理者として実行。

```ruby:コマンドプロンプト
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```

③x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ
　ダウンロード、インストール。

https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi


## ④Dockerでデータベース構築

①Docker起動。
②チュートリアルが開始されコピーしながら各種インストール。
③cd で 100knocks-preprocessに移動して実行。

```ruby:コマンドプロンプト
docker-compose up -d --build
```

④ブラウザでhttp://localhost:8888に飛ぶ。

```ruby:chrome等
http://localhost:8888
```

このように表示されるはず
workをダブルクリックで開くとファイルが出てきます。
![jupiter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1595099/85b33b38-9a39-0259-2c73-aa5e8563f555.png)

# まとめ
Dockerの環境構築はいろいろな記事を見させて頂いて勉強になりました。
この手順で動作できることを祈っています。
Teamsでユーザがみつからないとき

とあるところで，Teamsのチームにユーザ追加したいのにみつからない，という現象に遭遇したとき，教わった解決法．

1. Teamsで，whoというアプリを探してインストール
1. 登録したいがメンバ追加の検索で出てこないユーザを検索する
1. 該当すると思われるユーザをクリックして情報表示

これで， チームのメンバ追加での検索にも表示されるようになる，というもの．

まぁ，この現象に遭遇したのはユーザ数5桁の環境で，おそらく検索負荷を抑えるための副作用っぽい気もしていて，もっと規模が小さい場合には起こらないかもしれませんが．
【AtCoder】ABC205をPython3で解説

ABC205の解説。

https://atcoder.jp/contests/abc205

## A - kcal
### 解説

100mLあたり$A$kcalなので、Bmlあたり$B \times A \div 100$kcal。

### コード

```python
A, B = map(int, input().split())

print(B * A / 100)
```

## B - Permutation Check
### 解説

数列Aを昇順に並び替えたとき、$(1, 2, ..., N)$となればよいので、Aを`sort()`して、リスト同士を比べる。

### コード

```python
N = int(input())
A = list(map(int, input().split()))
 
order = [i for i in range(1, N+1)]
 
ans = 'No'

A.sort()

if A == order:
    ans = 'Yes'

print(ans)
```

## C - POW
### 解説

$X^Y$の大小を求める問題。
普通に`pow()`を使っても、計算量が多くなるので、制限時間に間に合わない。

そこで、`C`に注目する。
今回大切なのは、`C`が偶数か奇数かということである。
例えば、$2^2$ と $(-2)^2$は$4 = 4$で等しいが、$2^3$ と $(-2)^3$は、$8 > -8$と、答えが異なってしまう。

このときは、`C`が偶数のとき、つまり、2で割り切れるとき、値を2乗した上でそれぞれの大小を判定してあげれば良い。

また、別解として、`C`の値を偶数か奇数か、に置き換えてあげると、`pow()`を使って計算できる。

### コード1
```python
a, b, c = map(int, input().split())

if c % 2 == 0:
    a *= a
    b *= b

if a > b:
    print('>')
elif a < b:
    print('<')
else:
    print('=')
```

### コード2
```python
a, b, c = map(int, input().split())

if c > 2:
    c = 2 + (c % 2)

x, y = pow(a, c), pow(b, c)
    
if x > y:
    print('>')
elif x < y:
    print('<')
else:
    print('=')
```

## 編集後記
今回のC問題は優しかった＆解き方たくさんあった。
MySQL ✕ DjangoのORMで、サブクエリでGROUP BYとかDISTINCTとかにハマる

# やろうとしたこと

例えば、次のような共通部品から、優先(priorityが小さいもの)して使うものを抽出したい。


**products**

| id |
|:-:|
| 1  |
| 2  |
| 3  |

**common_parts**

| product_id | priority | name |
|:-:|:-:|:-:|
| 1  | 1  | ネジa|
| 2  | 1  | ネジb|
| 1  | 2  | ネジA|
| 2  | 2  | ネジB|
| 1  | 3  | ネジα|

このとき、MySQL ✕ DjangoのORMでは色々制約が合って、なかなか満足行くものがすぐに作れなかった。

# NGパターン

## group_byでいいじゃない？
```python
        queryset = Products.objects.all().annotate(
            common_part=Subquery(
                CommonParts.objects.filter(
                    product_id=OuterRef('pk'),
                ).order_by('priority').group_by('product_id').values('name')
            ),
        )
```

DjangoのORMに、group_byは無いそうです(；・∀・)

## distinctで、product_idを指定すればいいじゃない？
```python
        queryset = Products.objects.all().annotate(
            common_part=Subquery(
                CommonParts.objects.filter(
                    product_id=OuterRef('pk'),
                ).order_by('priority').distinct('product_id').values('name')
            ),
        )
```

MySQLが、distinctに引数は指定できないそうです(；・∀・)
PostgreSQLはできるみたいな情報は在った気がする。

# OKパターン
```python
        queryset = Products.objects.all().annotate(
            common_part=Subquery(
                CommonParts.objects.filter(
                    product_id=OuterRef('pk'),
                ).order_by('priority')[:1].values('name')
            ),
        )
```

順番つけた後に、1つ目のものを取ってくる。
まぁ、はじめにこれがすぐ思いつく人も多いか(´Д｀)…

## ポイント
- [1]ではなく[:1]にすることで、共通部品がなくてもエラーにならないようにした。


# 所感
後から考えると、すぐにOKパターンが思いついても良さそうなもんだなと思ったけど、思考の流れ的に「こういう場合Group By使うよな」から始まってたからなかなかたどり着くのに時間がかかった。。
distinctについても、結構

```python
MyModel.objects.all().values_list('hoge', flat=True).order_by('hoge').distinct()
```
で出来る話はたくさん出てきたけど、使いたい項目とdistinctしたい項目が違うことで悩まされた。（↑はPostgreSQLではdistinctに引数指定できるのに、MySQLではできないけどどうするのっていう対処法だった）

今回わかったgroup_byはDjangoのORMにないことと、distinctを引数に使えないという仕様は覚えておこうと思って残しておく。
【Engineer Meetup開催！】エンジニア向けキャリアアップセミナー「エンジニアからプロダクトマネジャーへ〜エンジニアの生存戦略を経験者が語る〜」

イスラエルと日本を拠点にイノベーションプラットフォーム・アドバイザリーサービスを提供するAniwo Ltd.（本社：テルアビブ, イスラエル、代表取締役：寺田 彼日、以下Aniwo）は、エンジニア向けキャリアアップセミナー『Aniwo Engineer Meetup』の第1回目を6/24(木)に開催致します。

昨今のデジタル化拡大に伴い、これまで以上にソフトウェアエンジニアの需要が高まっています。一方で、アメリカやイスラエルと比較すると日本はエンジニア職の人気は低く、需給ギャップが発生している状況です。加えて、開発をリードするプロダクトマネージャー(PMやPdM)がコードを書けないために生じるエンジニアとの齟齬が開発プロセスの中で深刻な問題となっている事例も少なくありません。
今回は、これらの課題を考えた際に浮上してくる「エンジニアがPdMになる」という選択肢をテーマに、リブセンスにてマーケターからエンジニアに転身しPdM、マネジメント経験を経て独立、Udemyの人気講師でもある株式会社ユーブル 代表取締役 山浦氏をお招きし、エンジニアの生存戦略についてお伝えして参ります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645867/92fff360-48c5-2bad-3081-43e6a3e2ffa0.png" width="500">



#イベント概要
【Aniwo Engineer Meetup #1】
エンジニアからプロダクトマネジャーへ：エンジニアの生存戦略を経験者が語る
日　程：2021年6月24日(木) 18:00 - 19:00
申　込：https://aniwo-engineermeetup-1.peatix.com/　
会　場：Zoom Webinar
主　催：Aniwo
参加費：無料

#タイムライン
#####18:00-18:10 講義1：「イスラエルに学ぶ！世界を変えるエンジニアへの道」by 寺田 彼日
AniwoのCEOの寺田より、イスラエルが優秀なエンジニアを次々に輩出する理由をスタートアップエコシステムの観点から解説します。
#####18:10-18:40 講義2：「エンジニアからプロダクトマネジャーへ：エンジニアの生存戦略」by 山浦 清透氏
株式会社ユーブルの代表取締役の山浦 清透氏より、「未経験からエンジニア転職のロードマップ」 、「 エンジニアの生存戦略」、「個人開発・独立のキャリア選択肢」、「エンジニアリングで事業をグロースするコツ」等の経験談をお伝えします。
#####18:40-18:55 Q&Aセッション
#####18:55-19:00 閉会 & アンケート

#登壇者について
#####山浦 清透氏 / 株式会社ユーブル, 代表取締役
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645867/57ad5253-3905-4db1-9200-bf442ff9a669.jpeg" width="200">
1987年生まれ。株式会社リブセンスにてマーケターを経験後、2014年からサーバーサイドエンジニアとしてのキャリアをスタート。主力事業のアーキテクチャのリニューアルプロジェクトを行った後、エンジニアとして新規事業の立ち上げを行う。その後エンジニアリングマネージャー兼プロダクトマネージャーを担当。マネージャーとしてエンジニアの採用、評価、育成も担う。
現在は自身がプログラミング学習で苦労した経験から、プログラミング学習サービスを運営中。Udemyにてプログラミング講座を配信し、7万人が受講中。
#####寺田 彼日 / Aniwo Ltd., Founder and CEO
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645867/76ec67b5-1676-71bb-bd5b-17e64dc5cf83.jpeg" width="200">
2014年日本人として初のVC Backed StartupとしてイスラエルでAniwoを創業。
“Innovation for your smile”をMissionに、 新たな価値創出を加速させるプラットフォーム開発・運営に取り組む。
京都大学 経営管理教育部卒 (MBA) Koç University留学 (日本学術振興会若手研究者海外派遣) 大阪大学 経済学部卒。
 
#Aniwoについて
会社名： Aniwo Ltd. (イスラエル) / Aniwo Co., Ltd. (日本)
説　立： 2014年10月 / 2015年7月
代表者： 代表取締役 Founder & CEO 寺田 彼日
　　　　 代表取締役 副社長・Japan CEO 松山 英嗣
U R L ： https://www.aniwo.co
所在地： 144 Menachem Begin, Tel Aviv, Israel (Israel)
             東京都港区虎ノ門4-3-1 城山トラストタワー (Japan)  
 
Innovation for your smileをコーポレートミッションにイスラエルで初のVC backed日本人創業スタートアップとして2014年に設立。日本企業向けオープンイノベーションアドバイザリー & DX推進サービス、次世代の採用を実現するオンラインプラットフォームAxelnodeの運営、イスラエル Unit 8200出身のエリートハッカーによるサイバーセキュリティサービスを手掛ける。
 
■お問い合わせはこちら
https://www.aniwo.co/contact
 
■採用について
https://www.aniwo.co/recruit
 
■Aniwoプレスリリース一覧
https://prtimes.jp/main/html/searchrlp/company_id/12729