OmniAICreator/Qiita-1.07M huggingface dataset:
Animationを使いこなしてみる。

2Dゲームを勉強の為に作成している最中に、爆発等のアニメーションを作成方法がわからなかったので備忘録として記事にします。

#Unityのバージョン
Unity2019.2.17f1

#アニメーションさせる素材
今回はAnimationをわかりやすくするためにカウントダウンを使います。
以下が使用素材です。自由に使ってもらって問題ありませんが、それによって起こった問題に関しては一切の責任を負いかねます。

![AnimationTest.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307841/dffef5e3-614c-214e-a531-7d0dc74129a0.png)

#流れ
上の素材をProjectにインポート（ドラッグ&ドロップでもOK）したら以下の設定を行う

-　Texture Typeを**Sprite(2D and UI)**
-　SpriteModeを**Multiple**

全てを設定後SpriteEditorを起動。

![InspectorSelect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307841/a15a7b2c-e52a-bb7a-c628-962db2ff7589.png)

バージョンによってはインストールしないと起動しないことがあるので、PackageManagerを使ってインストールを行う。以下がPackageManagerの場所になる。今回のバージョンは追加インストールが必要。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307841/3ea0f0c1-99d0-6d86-a4e3-f81d3f374c34.png)

2D spriteを選択してInstallボタンを押す。2019.2.17f1ではSpriteEditorが初期で入っていないためインストールする必要がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307841/3c6ae98c-8c0f-3d9f-e8a2-d29236152429.png)

マウス左クリックしながら数字を囲んで話すとSpriteが作成される。アニメーションで使いたい絵に対して全て行い、Applyを押すと囲んだ画像毎にSpriteが作成される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307841/16f153c0-49b9-5c5a-22e4-f5b39cbad01f.png)

Animationを選ぶ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307841/e25e59c5-bcfb-356b-60d4-59997b720741.png)

Spriteを作成した画像の親を、ヒエラキーにドラッグ&ドロップするし、選択するとAnimationでCreateが選択できるので、アニメーションファイルを作成。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307841/2a991f6b-3f38-7c51-4bed-e881047fa603.png)

以下の画像を等間隔刻みで配置。

![animationdrag.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307841/08b499b8-18bb-be6b-8670-65a14b9b9de4.png)

再生を押すと以下のGif動画のようになる。

![u3nar-zocyy.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307841/1bb6a327-89dd-e455-6405-44466fb4cda7.gif)

#まとめ
アニメーションは個人的に苦手分野だと思ったが、Qiitaでのネタを目標にしていくと、割とすんなりいける印象を持った。バージョンによる操作の変更にも少々手間取ったがいい勉強になった。
注意点としては、Windows→2D→SpriteEditorでも起動できるが、その場合なぜかうまくいかなかったことが多かったので、Inspector上で選んだ方がいいと思います。

SpriteEditorはオートでSpriteを作れるが、爆発の場合は破片まで選ぶことになるため、手作業でやったほうがいい。

#参考サイト
ひよこのたまご：https://hiyotama.hatenablog.com/entry/2015/05/06/103657
FTPの動作

#FTPについて
Firewallの設定でFTPの設定の仕方が複雑だったので、簡単ではありますがまとめました。
もし環境構築、運用をする際にあなたの役に立てれば幸いです。

####FTPとは
ファイル共有を行うためのプロトコルになります。
ファイル共有する際に使用するポートの1種。

FTPのコネクション

- コントロールコネクション (21ポート)
- データコネクション (20ポート、ランダムポート)

FTPの2種類のモード

- アクティブモード
- パッシブモード

####アクティブモード
データコネクションの際にサーバからクライアントへとセッションを行う。
Windowsではデフォルトで設定されている。


送信: クライアント　TCP　21　→　受信: サーバ　TCP　21
送信: サーバ　TCP　20　→　受信: クライアント　TCP　ランダムポート

####パッシブモード
データコネクションの際にクライアントからサーバへとセッションを行う。
Linuxではデフォルトで設定されている。
Windowsはパッシブモードの変更することができますが、うまく機能されないそうです。

送信: クライアント　TCP　21　→　受信: サーバ　TCP　21
送信: クライアント　TCP　ランダムポート　→　受信: サーバ　TCP　ランダムポート

##終わりに
コントロールコネクションで接続する動きは基本的に同じです。
ただデータコネクションでモードの違い、ランダムポートを使用するために、
その設定の仕方が異なったり、思い通りにファイル共有ができないことがありますので、
ぜひ上記を参考にして設定を入れてみてください。
プログラミングって「英語がきついんだよなー」と悩んでしまう方へ

# タイトルは、何ヶ月か前の私のことです。

なぜこんなことを思い出したかというと、今エラーが解決できていない状態だからです。そうです、エラー画面というのは**onlyEnglish**です。以前の私なら、「こんなとき外人だったらふつうの文章読む感覚でエラー解決できるのかな」とかいらぬこと考えてました。

この考えがよぎってしまったあなたと過去の私に言いたい。

## 日本に生まれただけで恵まれていますよ

スピリチュアル的な内容に寄ってきそうですが、続けます。

もし、自分が生まれた地域が英語圏で

*とても治安が悪かったら*

*生活するのもギリギリで、学校もまともに通えなかったら*

きっと、日本人のことを羨ましがりますよね

そもそも日本で生活できてるだけで、宝くじに当たったぐらいラッキーなんです

少し脱線しましたが、私が言いたいのは、その悩みを解決しようと努力したのか

過去の変えようのない事実を**悩み**と表現して、```できない言い訳を作っているだけ```ではないか

時間をかけて、自分自身と対話してみる、ということですね

このあたりのお話は、かの有名な**"嫌われる勇気"**の、アドラー心理学から勉強させていただきました。

結果、自分自身と対話したその頃の私はどうなったかというと、

**英語の勉強も楽しもう！**

ということで、Instagramで英語の発信を始めましたw

コツコツ継続すると自分に自信がつくのでオススメです

興味がある方は覗いてみてください😊

https://www.instagram.com/iec_kojimaru/

それでは、もっと技術的な内容書けるように、毎日勉強楽しみます！！
キュー

```py
import logging
import queue
import threading
import time

logging.basicConfig(level=logging.DEBUG, format='%(threadName)s: %(message)s')


def worker1(queue):
    logging.debug('start')
    queue.put(100) #[100, 200]
    time.sleep(5)
    queue.put(200)
    logging.debug('end')


def worker2(queue):
    logging.debug('start')
    logging.debug(queue.get())
    logging.debug(queue.get()) #キューに値(200)が入るまで待機してくれます
    logging.debug('end')


if __name__ == '__main__':
    queue = queue.Queue()

    t1 = threading.Thread(target=worker1, args=(queue,))
    t2 = threading.Thread(target=worker2, args=(queue,))
    t1.start()
    t2.start()
```

```txt
Thread-1: start
Thread-2: start
Thread-2: 100
Thread-1: end
Thread-2: 200
Thread-2: end
```
『デジタルマーケティングで売上の壁を超える方法』が4/21まで無料で全文公開

知り合いの呟きで、表題の本が無料公開ということで読んでみました。

[デジタルマーケティングで売上の壁を超える方法](https://co-learning.jp/column/417?utm_source=facebook&utm_medium=SNS&utm_campaign=01-1tx01cr&fbclid=IwAR2wAcnC8V4w-WGBvNwi_QvecGCLnjVK-aO2pBOl1x-JGwOJpywvDufm0Kw)

マーケティングの現状(2017年の本ですが)が、どうなっているのか、どんな手段を取っていけばいいかを、とてもわかりやすく解説されています。

フリーランスとしてやっていると、小さいものを売っている会社との取引も出てきて、結構マーケティング的なことも相談されることが多いので、こういった知識もつけておかないといけないですね。

コロナで、特に今オンラインの需要は増えているので、デジタルマーケティングの重要性も増しているのではないかと思いますので、マーケティングの勉強の取っ掛かりには良い本じゃないかなと思いました。
【2021年最新】AWSでPublic DNS(パブリックDNS)が割り当てられない時の解決法



下記記事が参考になりました。
https://qiita.com/sunadoridotnet/items/4ea689ce9f206e78a523

##コンソールを使用してVPCの設定を更新する

やることは変わらないのですが、AWSの画面の配置、言葉が微妙に変更されていました。

1.Amazon VPCコンソール(https://console.aws.amazon.com/vpc/ )にアクセス。
2.画面左枠のVPCをクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568461/4323be92-d4cd-fc8a-fb0a-2a40dd5d1abd.png)

3.自分が使っているVPCを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568461/c13c4ca3-6dbf-d49b-2b01-50789d34bbb6.png)
画面下についてる説明をクリック。

下記画像で、
DNS解決名:無効
DNSホスト名：無効

になっているのが悪さをしているので有効に変えてあげます。（下記画像はすでに無効になっていたのを有効に変えてあります。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568461/67ee3aa9-5773-a53e-91db-13b05fd130e3.png)

自分が使っているVPCを選択してアクションを押せばそれぞれ編集できます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568461/54d27bd4-af81-753d-cfc5-96d592eca1f5.png)


有効にした後、EC2の作成したインスタンスを確認できる画面に飛ぶと。パブリックDNSが確認できるかと思います。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568461/d5e63905-79d6-a12b-8712-f809217123e9.png)


間違いがあったらコメントください。










（AWSやLINEDeveloperなどの言葉がコロコロ変わる件、使いにくいと思うのですがなぜ変わるのでしょうか？）
vueのclass componentをjsで使う

vueでclass componentを使うにはtypescriptを有効にする方法とBabelを有効にする方法があります。

Javascriptから使いたい場合は、Babelを有効、typescriptを使わない設定にすればOK.

https://class-component.vuejs.org/guide/installation.html#manual-setup
この説明では、.babelrcに追加が必要とありましたが、私が試した状況では、この作業は不要で、逆に設定すると、次のようなエラーでした。

```console
error  Parsing error: Using the export keyword between a decorator and a class is not allowed. Please use `export
 @dec class` instead.
```
Hangouts で、特定のスペースの最新メッセージを取得（未解決）

Hangoutsで投稿した文章を別のサーバーで取得して、使いたい。というような相談が来たので、色々調べてみました。
結果的には、結構規模が大きくなるんじゃないかなと思って、解決まではしてないです。

# ドキュメント
Hangouts Chat API自体使った事がなかったので、まずはドキュメントを読みます。
https://developers.google.com/hangouts/chat

まずはHangouts Chat APIの使用イメージを掴むために、
https://qiita.com/iitenkida7/items/3c8f9f8f6ee1e809558d
こちらの記事を参考にしてやってみました。
botがタイムラインに呟くのは超簡単にできますね。

で、今回やりたいのはタイムラインのメッセージの取得です。
ドキュメントでは
https://developers.google.com/hangouts/chat/reference/rest/v1/spaces.messages/get
この辺りでしょうか。

サーバーをできれば立てたくない。ということだったので、Google Apps Scriptでなんとかできないかな。と色々みてみましたが、日本語のドキュメントは中々ないですね。
あってもbotを作成する系か、Hangoutsの方に投稿する系が多かったです。

結局HangoutsChatのAPIを使用しないと無理そうで、リアルタイムにメッセージを取得したければ、WebSocketを使用する必要もありそうで、そうなるとサーバー立てて、とかやらなければいけなくなるため、2〜3日でできないかな。という相談だったので、難しいと判断しました。
古いWindows PCにCentOS 7を入れる

Linuxを作るのに少しトラウマを思っていたが、MacのコンソールでperlやPythonを動かすようになって、少しトラウマも薄れてきたのと、親父のWindows機が余ったので、CentOSにチャレンジしてみようと思った次第。
使用用途は、自宅ネットワーク内でウェブ、クーロンで自動処理、簡易的なデータベースができればと思っている。

# マシンスペック
```
CPU : Intel(R) Core(TM) i3 CPU 530 @ 2.93GHz
メモリー : ２G
HDD : ２５6G(SSD) + 3T(SATA)
```

# 参考にした書籍
<a target="_blank" href="https://www.amazon.co.jp/gp/product/4797397640/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4797397640&linkCode=as2&tag=shotate07-22&linkId=3ace544017507cbebd3d1a9a3c8f9b67">本気で学ぶ Linux実践入門 サーバ運用のための業務レベル管理術</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=shotate07-22&l=am2&o=9&a=4797397640" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

# 使用バージョン
最新の8を考えたが、参考情報が少ないように感じたので、7にした

インストール：
https://www.centos.org/download/ からダウンロードすると最新版になるので7は、↓からダウンロードした
https://ftp.riken.jp/Linux/centos/7.7.1908/isos/x86_64/
※**CentOS-7-x86_64-DVD-1908.iso**をダウンロードして、DVD−Ｒに焼いておいた。
（2020/4/19時点で7の最新版）

# インストール

BIOSで起動ディスクがDVDドライブ→HDDになるように設定変更して、PCを起動して画面の指示に従ってインストールを進める。

インストールするのに参考にしたサイト：
https://eng-entrance.com/linux-centos-install
※インストール先のSSDに入っている古いWindosを消す必要があるので、インストール先の設定のところでゴニョゴニョした。
※インストール先の設定で**パーティションを自動構成する**にチェックを忘れずに
※ソフトウェアの選択は**サーバー（GUI）**を選択

# インストール後
お作法があるようなので以下を行う。
## アップデート
スーパーユーザーに切り替えて、以下のコマンドを実行する。
```# yum update```
## SENinuxの状態確認と無効化
自宅ネットワーク内での運用なので、無効にしておく。
```# getenforce ← 状況確認```
```Enforceing ← 有効```
```# sestatus ← より詳細な情報```
```SELinux status: enabled```
### 一時的に無効にする場合
```# setenforce 0 ← 無効化```
```# getenforce ← 状況確認```
```Permissive ← 無効```
### 永続的に無効化する
一時的に無効した場合、PCを再起動するともとに戻ってしまう。設定を永続させるためには以下を行う。
```# vi /etc/selinux/config```
```#SELINUX=enforcing```
　↓
```SELINUX=disabled ← コメントを削除してdisabledに書き換える```
ここまでやったら以下を実行する
```# reboot```
【Javascript】DOM基本操作まとめ

#はじめに
この記事は、Javascript１年生の私が基本的に自分の学習アウトプットとメモを兼ね合わせて作成しておりますが、同様にこれからJavascriptを学びはじめたい方や、学びはじめの方の参考になれば僥倖でございます。

#目次
1.DOMってなに？
2.なんでDOMを使うの？
3.DOMの基本操作まとめ



##1.DOMってなに？
そもそもDOMとは何か？というところからはじめていきたいと思います！
D・O・Mと書くだけあって、それぞれ何かの単語の頭文字をからきているのではないかと推測できます。
その単語とは“Document Object Model”のことで、Javascriptを通してHTML・XMLの操作を可能にする仕組みのことらしいです。
つまり、DOMを使用することで、JavaScriptを使ってウェブページとその要素にアクセスすることができます。


##2.なんでDOMを使うの？
DOMがどういうものなのか？ということが大まかにわかったかと思いますが、実際にDOMが使われている理由とは一体なんでしょうか？
これはDOMの持つ特徴からわかるかと思います。
・階層構造を持っている
・JavascriptからHTMLの操作が可能
言葉だけで説明するのは私の実力では難しいので、次のDOMの基本操作のまとめで実際のコードをもとに見ていきたいと思います。

##3.DOMの基本操作まとめ
可能な基本操作
・HTML要素の取得
・HTML要素の追加
・HTML要素の削除
・HTML要素内のテキスト変更
・HTML要素の属性に値をセット・変更


###・HTML要素の取得
使い方：メソッドを使用してid名やclass名を取得して、そこから追加・削除・属性変更・テキスト変更が可能

メソット：

```
document.getElementById(id)
document.getElementsByClassName(class)
document.getElementsByTagName(name)
document.querySelector(css)
document.querySelector(css)
```


###・HTML要素の追加

使い方：divタグ等の要素を追加

メソット：
・createElement
…DOMの新規作成・追加
・appendChild
…DOMを別のDOMに追加

書き方：例）createElement

```javascript:dom.js
//DOMを新規作成
const divDom = document.createElement('div');
```


###・HTML要素の削除

使い方：divタグ等の要素内にhタグやpタグを削除

メソット：
・removeChild
…DOMの削除

書き方：例）removeElement

```javascript:dom.js
//DOMを取得
const dom = document.getElementById('id');

//Nodeプロパティから親要素のDOMを取得
dom.parentNode.removeChild(dom);
```


###・HTML要素内のテキスト変更

使い方：divタグ等の要素内にhタグやpタグを変更

メソッド：
・innerHTML
…HTML要素を含んだ内容の取得
・innerText
…HTML要素を含まずにテキスト内容を取得
・textContent
…HTML要素を含まずにテキスト内容を取得

書き方：例）innerHTML

```javascript:dom.js
//DOMを取得
const dom = document.getElementById('id');

//DOMのテキスト内容を取得
console.log(dom.innerHTML);

//DOMのテキスト内容を変更
dom.innerHTML = '<strong>テ</strong>キスト'
```





###・HTML要素の属性に値をセット・変更

使い方：aタグ等の要素内にあるsrc属性を変更してリンク先を差し替える

メソット：
・setAttribute
…指定の要素属性を追加変更

書き方：例）imgタグ

```javascript:dom.js
//DOMを取得
const imgDom = document.getElementById('id');

//画像URLをsrc属性へ
imgDom.setAttribute('src', 'https://******.png')
console.log(dom.innerHTML);

//DOM要素がセットされたかの確認
conosle.log('imgDom');
```



#参考文献
[DOMとは](https://www.javadrive.jp/javascript/dom/index1.html)：Let`sプログラミング
[JavaScript初心者でもすぐわかる！DOMとは何か？](https://eng-entrance.com/what-is-dom)：エンジニアの入り口
[DOMの紹介](https://developer.mozilla.org/ja/docs/Web/API/Document_Object_Model/Introduction)：公式ドキュメント



#おわりに
Javascript学び途中の未熟者で申し訳ないのですが、今回はDOMの基本操作についてまとめてみました。
ここでまとめたDOM操作を使いこなすことで、Javascriptのレベルを上げていきたいものですね。
ありがとうございました！
2020年フロントエンドの就職事情

昨年9月に会社を辞めて、しばらく家のことをやったり、ちょこっとフリーで仕事受けたりと、のんびりしてたんですが、そろそろ就職活動をちゃんとしないと。と思って、dodaに登録して就職活動始めたんですが、あっという間にコロナの影響で、就職難に。。。

いや、元々年齢も年齢なので（今年46）活動自体難しいかなとは思っていたんですが、さらに難しくなってしまいました。。。
フリーランスも10年ほどやっていたので、フリーでやりつつの就職活動なので、焦ってはないんですが。

で、本題としては、今現在フロントエンドという職種に求められている要件をdodaで見ると、大体ReactかVueが必須になっていたりしますね。
サイトだけを作っている会社も少なくなってきて、フロントエンドといえばもう、SPA関連の技術がないといい所にはいけなさそう。

企業サイト案件ばっかりやってたので、SPAは全く手をつけられてなかったので、家で時間のあるこの機会にReactとかを勉強してみようかな。
実戦で使えないと就職は難しいけど。

因みに、デザイン系でいえばUX/UIデザイナーの募集が目につきました。
dodaの人曰く、UX/UIデザイナーを求めているところは、求めてるレベルが高いので、中々決まらない。とは言ってましたが、今UX/UIをきちんと勉強してやっていれば、デザイナーの人は転職に有利になるかもですね。
【Python】PythonからGoogle翻訳を使ってみたらあまりにも簡単だった

Pythonのパッケージ[googletrans](https://github.com/ssut/py-googletrans)を使って翻訳をしてみたら、あまりにも簡単だったので書き留めておきます。

# googletransとは
pythonでgoogle翻訳を使うなら[Google Translate API](https://cloud.google.com/translate/?hl=ja&utm_source=google&utm_medium=cpc&utm_campaign=japac-JP-all-ja-dr-bkws-all-super-trial-e-dr-1008074&utm_content=text-ad-none-none-DEV_c-CRE_314712311019-ADGP_Hybrid+%7C+AW+SEM+%7C+BKWS+~+T1+%7C+EXA+%7C+ML+%7C+1:1+%7C+JP+%7C+ja+%7C+Translation+%7C+google+translator+api+%7C+en-KWID_43700031334293414-kwd-74703397964&userloc_1009241&utm_term=KW_google%20translator%20api&gclid=EAIaIQobChMIk-7p49Dz6AIVGXZgCh2nlAOdEAAYASAAEgKsevD_BwE)を使えばいいじゃん。

って思うかもしれませんが、これお金かかるんですよね。
セコい話ですけどお金かけずに遊び感覚でpythonからGoogle翻訳使いたかったんです。

いろいろ調べてたら[googletrans](https://pypi.org/project/googletrans/)なるものがあったので使ってみようと思いました。


# googletransの特徴
- 無料
- Google翻訳に文字列をHTTPで渡す
- 1つのテキストの最大文字数は15k
- google translateのウェブバージョンの制限により、このAPIはライブラリが常に適切に動作することを保証しない
 - つまり安定性が必要ならGoogle Translate APIを使った方がいい

ざっとこんな感じ。
では早速パッケージをインストールしていくところから説明します。


# googletransのインストール
以下のコマンドをコンソールに入力して、Enterキーを押すだけ。

```
pip install googletrans
```

超簡単。

# googletransを使って翻訳してみる
```python:trans.py
from googletrans import Translator

str = 'これはバナナです。' #翻訳したい文字

translator = Translator()
trans_text = translator.translate(str) #デフォルトでは英語へ変換
print(trans_text.text)
```

基本的な使い方はこんな感じ。
<br>
`translate(str)`のところはオプションをつけることによって翻訳先の言語を指定することも可能。

```python:trans.py
from googletrans import Translator

str = 'これはバナナです。' #翻訳したい文字

translator = Translator()
trans_text = translator.translate(str,src='ja',dest='de') #日本語からではドイツ語へ変換
print(trans_text.text)
```

<br>
翻訳したい文字列にはリストも渡せるみたいです。
>
```
>>> translations = translator.translate(['The quick brown fox', 'jumps over', 'the lazy dog'], dest='ko')
>>> for translation in translations:
...    print(translation.origin, ' -> ', translation.text)
# The quick brown fox  ->  빠른 갈색 여우
# jumps over  ->  이상 점프
# the lazy dog  ->  게으른 개
```
>

# まとめ
ざっとではありますがGoogle翻訳を使えるPythonパッケージ「googletrans」をご紹介しました。
特徴としては

- 無料
- 安定性に欠ける
- 記述量が少ない

こんな感じでしょうか。以上です。
JavaScriptでHTMLの要素を抜き出す

下記でh2要素の中身を抜き出して列挙できる

```javascript
for (let doc of document.getElementsByTagName("h2")) { console.log(doc.innerText) }
```

- JavaScriptのfor文でofは値、inはプロパティをとるので注意→[参考](http://www.ituore.com/entry/javascript-for#for-in%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9)
Ruby on Rails チュートリアル 7日目

##7日目
今日は、チュートリアルの4章を終わらせました。
感想としては、Rubyの基礎的な部分がかなり書かれてあっただけという感じが、しました。
RubyをProgateで軽く触っていたのでそんなに難しくなかったです。ただ量が多かった。
明日からは5章をやっていきます。
TECH CAMP入校前

TECH CAMPのカリキュラムを2週間終え感じたことは、

「ある程度勉強していて良かった‥。」

受講を悩んでいる方や、これから受講するって方は”未経験からエンジニアへ”という謳い文句を勘違いして知識ゼロで臨むとなかなか苦労すると思います。カリキュラムの進行はスピーディで、合間にあるテストや試験もなかなか難しいです（検索はOKです）。
一度でも内容に触れたことがあれば記憶の定着もしやすいですし、理解度も増します。


TECH CAMP受講前の自分の学習内容（3ヶ月間）としては、
・プログラミングとは何か？みたいな本
・初心者向けのRubyの本
・Progate
・Youtube
・ITパスポートのテキスト



プログラミングを学ぼうと決めたのが11月下旬で、12月に入って退職届を会社に提出。
TECH CAMPの無料カウンセリングを受けて受講が決まったのが12月。すぐに開始かと思いきや4月スタートという事で、だったらその間に知識ゼロの状態から何かひとつでも作ってやろうと思い2冊の本を買いに行きました。（ちなみにそのタイミングでパソコンをWindowsからMacへ）

**・プログラミングとは何か？みたいな本**
これが漫画形式で説明されていて、超初心者の自分としても理解しやすかったです。主人公がプログラミング知識ゼロの状態から、仕事の効率化を図る為にプログラミングを学びその技術を高めていく、というストーリー。これがこれから学びはじめる自分自身と重ねてやる気が向上！そこまで中身の深堀は無いのですが、これを読んでプログラミングを学ぼうというビジネスマンもいるのでは？

**・初心者向けのRubyの本**
そして上記の本と同時に購入したこの本。ペラペラとページをめくりながら、まだ使い方もおぼつかないMacをポチポチ、そして”Hello world.”と出力され感動（笑）


この2冊の本を購入後、ふと考えました‥

「言語毎に本を買っていくのか‥？」


**・Progate**
ということで調べて見るとProgateというもので学べることがわかりました。これがすごくわかりやすく、書いたコードの動きもそこで体感できゲーム感覚で進めることが出来ます。ちなみに現在Lv135、修了レッスン数21です。

**・Youtube**
ここではプログラミング学習というよりWebエンジニアとは何か？IT業界とは？等に特化して学びました。現役の方や元々やっていた方の話が直接（じゃないか笑）聞けて、自分のこれから進んで行く道をじっくり考える時間となりました。

**・ITパスポートのテキスト**
資格試験を受けないのにそのテキストを買う、というなかなか謎の行動をしてしまいました。しかしITの基礎知識を蓄える為にこの本は役立っています。わからないことは簡単に検索可能な世の中ですが、何がわからないのかがわからない or どんな知識が必要なのかがわからない、という状態の初心者にとっては、このテキストはわかりやすくまとめられているのかな、と感じます。




そして！本格的に学習を開始してから約3ヶ月後の3月の半ばに、Rubyで簡単なアプリケーションを作ってみました。たったひとつのエラーに2時間悩んだり、と苦労しましたがようやく完成。
https://twitter.com/ruby55tomo/status/1239141960662695937?s=20

コードの中身はめちゃくちゃだと思います。もっとスッキリさせられるはず。でも自分が成長出来た時のゼロ地点の証としてこれはこのまま残しておきます。

冒頭で「ある程度勉強していて良かった‥。」と言いましたが、後悔している点としてはCSSとRuby on Railsが勉強不足で、これが最初の苦労につながったことですね。
テキストファイルの読み込みマクロ

#初めに
テキストファイルをExcelシート上に読み込むマクロ。

#注意事項
1. テキストファイル内にタブが存在する場合は空白に変換してから読み込む

#ソースコード

```vb:ReadTextFile.bas
Option Explicit

Sub テキストファイル読込()

    Dim FilePath
    Dim ResultRange As Range

    FilePath = Application.GetOpenFilename("Text File(*.txt),*.txt,All Files(*.*),*.*")

    If FilePath = False Then
        Exit Sub
    End If

    Set ResultRange = ReadTextFile(ActiveCell, CStr(FilePath), 4)

    If Not ResultRange Is Nothing Then
        Call ResultRange.Select
    End If

End Sub

Private Function ReadTextFile(TargetCell As Range, FilePath As String, Optional TabSize As Long = 4) As Range

    Dim fso As Object
    Dim TextStream As Object
    Dim Text As String
    Dim TabPos As Long
    Dim Cell As Range

    Set Cell = TargetCell.Cells(1)

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set TextStream = fso.OpenTextFile(FilePath, 1, False)

    Do Until TextStream.AtEndOfStream
        Text = TextStream.ReadLine

        TabPos = InStr(Text, vbTab)
        If TabPos > 0 Then
            Text = TabToSpace(Text)
        End If

        If Left(Text, 1) = "'" Then
            Text = "'" & Text
        End If

        Cell.NumberFormat = "@"
        Cell.Value = Text

        Set Cell = Cell.Offset(1, 0)
    Loop

    Call TextStream.Close

    If TargetCell.Cells(1).Row = Cell.Row Then
        Set ReadTextFile = Cell
    Else
        Set ReadTextFile = Application.Range(TargetCell.Cells(1), Cell)
    End If

End Function

Private Function TabToSpace(Text As String, Optional TabSize As Long = 4) As String

    Dim CurrPos As Long, PrevPos As Long, FindPos As Long
    Dim SpcSize As Long, SubStr As String, Result As String

    CurrPos = 0
    PrevPos = 0
    FindPos = InStr(PrevPos + 1, Text, vbTab)

    Do While FindPos > 0
        SubStr = Mid(Text, PrevPos + 1, FindPos - PrevPos - 1)
        Result = Result & SubStr
        CurrPos = CurrPos + LenB(StrConv(SubStr, vbFromUnicode))

        SpcSize = TabSize - (CurrPos Mod TabSize)
        Result = Result & Space(SpcSize)
        CurrPos = CurrPos + SpcSize

        PrevPos = FindPos
        FindPos = InStr(PrevPos + 1, Text, vbTab)
    Loop

    If PrevPos = 0 Then
        TabToSpace = Text
    Else
        TabToSpace = Result & Mid(Text, PrevPos + 1)
    End If

End Function

```
VirtualBox上のcentOS環境構築における検証(2020.4時点)

Linux環境が欲しくてVirtualBoxでCentOSを使おうとしたら結構ハマってしまい。時間がかかってしまったので、共有のために記事を書きます。（環境はsurface Laptop Win10pro 1909）

##当初予定

最新版の資材(virtualbox6 & CentOS8)で構築する予定でしたがインストールの途中で落ちてしまってまともに動きません。またGUIインストール時の画面描画もずれてしまってよろしくありません。hyper-vサービスのON/OFFやメモリ設定など変えてましたが改善が見込めないので、諦めて動作する組み合わせを探しました。

##インストーラ
[CentOS8](https://www.centos.org/download/)
[CentOS7](http://isoredirect.centos.org/centos/7/isos/x86_64/)
[virtualbox6.1.6](https://www.oracle.com/virtualization/technologies/vm/downloads/virtualbox-downloads.html)
[virtualbox5.2](https://www.virtualbox.org/wiki/Download_Old_Builds_5_2)

##試したケース
結論として、virtualbox5とCentOS7の組み合わせにしました。

| 仮想環境化ツール|OS|結果|
|:--------------------|:---------------------|:----------------------|
| virtualbox6　　　　　|CentOS8|×　インストール中に異常終了　　　　　　　|
| virtualbox6　　　　　|CentOS7|×　インストールはなぜか一回だけ成功。がまともに起動できない|
| Hyper-V3.0　　　　　 |CentOS8|×　インストール画面で異常終了|
| Hyper-V3.0　　　　　 |CentOS7|〇　これでいこうかと思ったけど、Hyper-Vからの接続だと画面が小さいのでやめました。別IP割り振ってXRDPでアクセスする手もありますが|
| virtualbox5　　　　　|CentOS8|×　インストール画面で異常終了|
| virtualbox5　　　　　|CentOS7|〇 問題なくインストールできたので、決まり|

##備考
####その１　Hyper-Vとの競合について
　VirtualBoxとHyper-Vは基本的に共存できません。VirtualBoxを起動しようとすると、エラーを吐きます。あと仮想スイッチもブリッジの場合に競合してしまいました。調べるとサービスを切って再起動せよと出てきますが、Hyper-Vは使う気がなくなったので、落としてしまいます。
`「Raw-mode is unavailable courtesy of Hyper-V. (VERR_SUPDRV_NO_RAW_MODE_HYPER_V_ROOT)」`
　`コントロールパネル→プログラムと機能→Windowsの機能の有効化または無効化
　　一覧からHyper-Vのチェックを外して、再起動（1回だと解決しなかったので2回再起動）。

####その２　仮想CentOS7でいつも最低限やっていること
- **ゲストOSを抜けるときのキーを変更。サーフェスにはRight_CTRLが存在しません。タッチスクリーンでも抜けることは可能ですが、Right_Shiftに変更しておきます。**

　　<img width="278" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/697382dc-9eaf-3326-5fa2-e989e65a1bba.png">

- Guest Additions
 
　`デバイス → CD/DVDデバイス → Guest Additions のCDイメージを挿入`　で実行します。
　　保存してRunでもいいと思います。

- ホストOSとゲストOS間の共有フォルダ

　`VirtualBoxマネージャー→仮想OS→選択→共有フォルダー` でホストOS上にフォルダを割り当てます。
　デフォルト自動マウントで、`/media/sf_{共有フォルダ名}`が表示されます。CentOSのDeskTopにも表示されるので確認できると思います。後は、以下のコマンドでユーザにアクセス権限をつければOKです。

```　
  #substitute userでrootになる。
  $su -   
  #vboxsfグループに対象のユーザを追加する。
　$gpasswd --add {ユーザ名} vboxsf
```

- CentOSで右クリックメニューの新規ファイル作成

　これはテンプレートのディレクトリに空のテキストファイルを入れればOK。
　端末からtouchしたらって話かもしれませんがあくまでGUIを使いたいので。


###参考
---
 こちらの記事を参考にさせていただきました。有難うございました。
[VirtualBox (Windows) 上に CentOS 7 をインストールする]
(https://qiita.com/100/items/80a899fbaeb1e82b3f67)
[Hyper-Vで構築した環境でインターネット接続が出来るようにする]
(https://qiita.com/nomurasan/items/3c58b964943a24751802)
[VirtualBoxにおいて、ホストOSとゲストOS (CentOS) 間の共有フォルダを作成する方法](https://qiita.com/SUZUKI_Masaya/items/fb2d3c8141ba82d16801)
CSNF(CLIP STUDIOネームファイル)を作る

2013年にワコムが発売したAndroid搭載の液晶タブレット Cintiq Companion Hybrid には、専用アプリが何本かプリインストールされていました。その中の一つ「Wacom Manga Canvas」という漫画のネーム作成ツールのために作られたのが、CSNFというフォーマットです。拡張子は.csnf。

https://www.clip-studio.com/clip_site/mypage/newsdetail?publish=201308&f=2013082001

もう使ってる人もいないのでは？　と思うのですが、最新版のクリスタでも問題なく [ファイル]->[開く] で読み込むことができます（EX版限定ですが）。

せっかく使えるのに、誰も使わないのはもったいないですよね。
ワコムの代わりに、誰かが最高にクールなネーム作成ツールを開発しちゃえばいいと思うのですが……まあ……とりあえず、npmに[CSNFのライブラリ](https://www.npmjs.com/package/csnf)があるので、これを広めていきたいと思います。
CLIP STUDIO PAINT EX のユーザーで興味のある方は、お試しを。

##インストール

```
$ npm i ｃsnf
```

##使用例
まずテキストとフレームを表示する例です。

``` js
const CSNF = require('csnf')

// ドキュメント設定 
// 単位はpx。72dpiで、1pt=1pxです
// B4=投稿用（内枠18x27cm）
// A4=同人誌用（内枠１５x２２cm）
const csnf = new CSNF({ template: 'B4' })

// 最初のページを作成
const page = csnf.addPage()
 
// テキストレイヤーを追加
const size = 12 // フォントサイズ
const vert = true // 縦書き
page.addTextLayer([
  csnf.text([100, 100], size, vert, '縦書き\nテスト'),
  csnf.text([200, 100], size, vert, 'わからない……\n文化が違う!')
])

// フレームレイヤーを追加
const rect = csnf.baseframeRect() // 基本枠
const lineWidth = 4 // 枠線の太さ
page.addFrameLayer([
  csnf.polygon(lineWidth,
    [rect.x, rect.y],
    [rect.x + rect.width, rect.y],
    [rect.x + rect.width, rect.y + rect.height],
    [rect.x, rect.y + rect.height])
])

// ファイルに書き出し
csnf.writeFile('test.csnf')
```
![スクリーンショット 2020-04-18 18.18.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617427/5f40f986-74e1-6b9c-b831-def896c10f2e.png)

簡単ですね。
CSNFのレイヤーは、用途別にテキスト、フレーム、ドロー、ノートの４種類があって、各3枚、最大12枚まで表示できます。レイヤーの色は、ドキュメント設定で変更することができます。

``` js
  const csnf = new CSNF({
    frameColor: '#86ae00',
    textColor: ['#bf0058', 'red', 'black'], // 複数の場合は配列で
  })
```

残りの２種類（ドローとノート）は、どちらもグレースケールのビットマップ用です。
とりあえず何か表示したいので、[get-pixels](https://www.npmjs.com/package/get-pixels) で適当な画像を取得して、ドローレイヤーに表示してみます。

``` js
const CSNF = require('csnf')
cosnt getPixels = require('get-pixels')

const csnf = new CSNF()
const page = csnf.addPage() 

const file = "stayhome.png" // 適当な画像
getPixels(file, (err, pixels) => {
  if (!err) {
    // グレースケールに変換
    const bitmap = CSNF.Bitmap.fromNdarray(pixels)
    page.addDrawLayer(bitmap)

    // ファイルに書き出し
    csnf.writeFile('test2.csnf')
  }
})
```
![スクリーンショット 2020-04-18 18.47.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617427/b35aad39-7862-87d1-b449-aec086868282.png)

##というわけで
ネームファイルと言っても、ルビや縦中横などの書式設定はできないようで、未完成というか、あんまり実用性はないのかなあと思います。このへんがもっと整備されて、ツールとか開発者が増えてくると個人的には嬉しいのですが。
一番高さがある要素にあわせてcssを指定

```script.js
jQuery(function ($) {
  window.addEventListener('load', function() {
    var maxHeight = 0;
    $('.slider li').each(function(idx, elem) {
      var height = $(elem).height();
      if(maxHeight < height) {
        maxHeight = height;
      }
    });
    $('.slider li').height(maxHeight);
  });
});
```

これでできた。

.sliderという親要素の中にある、子要素liの中で、高さが一番高い要素にcssを合わせる。(height)

↓


私が実際に使用したのは、slickだったので、
以下のようなコードだったけど。

`$('.slider .slider-box .slider-list').height(maxHeight);`

親要素.slider
子要素.slider-box > .slider-list

.slider-boxはslick導入による形が崩れるのを防ぐ(必須)
.slider-listはpaddingや指定してる要素


これ、色々考えた末、できなかったやつ

出来なかったやつだからね。

```script.js
jQuery(function ($) {
const lists = document.querySelectorAll('.slider-box');
  for (let i = 0; i < lists.length; i++) { //高さ取得
  const h = lists[i].clientHeight;//css指定
    console.log(h);
    if($(this).height() > h){
     h = $(this).height();
    }
   $(".slider .slider-box").css("height", h + "px");
  };
});
```


##cssでもできる

```index.html
<div class="wrap">
  <div class="contents">
    <h3>タイトル</h3>
    <div class="text">
     <p>テキストテキストテキストテキストテキストテキスト</p>
    </div>
  </div>
</div>
```

```style.scss 
.wrap {
  display: flex;
  .contents {
   flex: 1;
   display: flex;
   flex-direction: column;
   padding: 40px;
  }
   .text {
   height: 100%;
  }
}
```

.wrapの.textのエリアの高さが均一になる。


####参考サイト

https://www.growupfa5hi0n.com/2020/01/jquery-height.html


プラグインも一応あるみたい
https://www.start-point.net/blog/web/jquery/hight_js/
Unity：2DShootingの作り方　#1

#解説動画
https://youtu.be/9vskzEccnpk

つづき：https://qiita.com/simanezumi1989/private/d6c6d9358dd5d096f03f

#画像や素材
https://github.com/unity3d-jp-tutorials/2d-shooting-game

#ソースコード

```PlayerShip.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


// PlayerShipを方向キーで動かす
//　・方向キーの入力を受け取る
//　・Playerの位置を変更する

// 弾をうつ
// ・弾を作る
// ・弾の動きを作る
// ・発射ポイントを作る
// ・ボタンを押したときにたまを生成する：Instantiate
// -------------//

public class PlayerShip : MonoBehaviour
{
    public Transform firePoint; // 弾を発射する位置
    public GameObject bulletPrefab;

    // 約0.02秒に一回実行される
    void Update()
    {
        Shot();
        Move();
    }

    void Shot()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Instantiate(bulletPrefab, firePoint.position, transform.rotation);
        }
    }
    void Move()
    {
        float x = Input.GetAxis("Horizontal");
        float y = Input.GetAxis("Vertical");

        transform.position += new Vector3(x, y, 0) * Time.deltaTime * 4f;
    }
}

```


```Bullet.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bullet : MonoBehaviour
{
    // 上に動く
    void Update()
    {
        transform.position += new Vector3(0, 3f, 0)*Time.deltaTime;
    }
}

```


#スタジオしまづからのお知らせ
スタジオしまづ は「プログラミング未経験でもゲームをリリース」をコンセプトに集まるオンラインサロンを運営しています。
https://camp-fire.jp/projects/view/149191
対象は以下の方としています。興味のある方はぜひ！
・独学でゲームを作れるか心配な方
・コミケで出展側として参加したい方
・一度でいいから自分のゲームを世に出したい方
・ゲームを作って憧れのゲーム会社に就職したい方
[linux] CapsLockとCtrlを入れ替える

# 開発環境
Linux
Ubuntu
bionic
xfce

# 方法
1. localectl
2. Xmodmap　（非推奨）

# localectl
実はxmodmapは使わないやり方があった！
その名も**localectl**!!!!!!!!!
こいつで勝つる！

```:US配列キーボードの設定例
localectl --no-convert set-x11-keymap us pc105 "" ctrl:swapcaps   
```

```:設定内容を確認
localectl status
```
```
System Locale: LANG=ja_JP.UTF-8
   VC Keymap: n/a
  X11 Layout: us
   X11 Model: pc105
X11 Options: ctrl:swapcaps
```

## 設定(config)ファイルの場所
- `/etc/default/keyboard`
- `/etc/default/locale`

直接編集して変更することも可能。

# Xmodmap (このやり方は古い！おじいさんの古時計並に）
1. 変更対象のCapslockとcontrolのキーコードをしらべる
2. ~/.Xmodmapに２行記述する。
3. ~/.Xmodmapを再読込する。   

## キーコードを調べる

```
xev
```


自分のキーコードは

- Caps_Lock が 66
- Control_L が 37

でしたので、これを入れ替えるだけです。

- Caps_Lock を 37　に変更
- Control_L を 66　に変更



## ~/.Xmodmapに記述
```:設定例
keycode 37 = Caps_Lock
keycode 66 = Control_L
```

## ~/.Xmodmapを再読込
```
xmodmap ~/.Xmodmap   
```
SwiftGifを利用してGIFアニメーションを表示する【Swift】


#はじめに
<a href="https://github.com/swiftgif/SwiftGif" target="_blank">SwiftGifライブラリ</a>を利用したところ、ローカル環境でGIFアニメーションを超簡単に表示できたので、手順を紹介します。
![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227611/c9f92448-9e03-5085-53f6-95d6e91f0fc9.gif)

それではいってみましょう^^

#STEP1 プロジェクトを作成する
何はともあれ、SingleViewAppでプロジェクトを作成します。
<img width="732" alt="スクリーンショット 2020-04-19 9.14.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227611/61fd0d4b-ed37-bceb-bb74-faf3824396c2.png">


#STEP2 プロジェクトフォルダに移動し、PodFileを作成する
今回は、cocoaPodsでSwiftGifライブラリをインストールします。

そのため、まずはプロジェクトフォルダに移動し、pod initでPodFileを作成します。

※ cocoaPodsの導入方法については、<a href="https://qiita.com/satoken0417/items/479bcdf91cff2634ffb1" target="_blank">こちらの記事</a>を参考にしてください。

#STEP3 PodFileを編集し、SwiftGifライブラリをインストールする
作成したPodFileに以下の通り追記し、pod　installをします (versionは<a href="https://github.com/swiftgif/SwiftGif" target="_blank">こちら</a>のInstallationを参照し、適宜修正してください)。
<img width="655" alt="スクリーンショット 2020-04-19 10.37.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227611/1bbbd0ef-fd49-1241-b434-a584525b1739.png">


#STEP4 UIImageViewを配置し、Outlet接続する
xcworkspaceファイルを起動した後、Main.storyboardにUIImageViewを配置します。
その後、ViewController.swiftにoutlet接続します。
<img width="1175" alt="スクリーンショット 2020-04-19 11.01.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227611/e950bc9d-1f4a-100f-f64e-81ef1411f42b.png">

#STEP5 プロジェクトフォルダにGIFファイルを配置する
プロジェクトフォルダにGIFファイルをドラッグ&ドロップで配置します。
<img width="1173" alt="スクリーンショット 2020-04-19 11.15.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227611/d5ce95fa-8baa-48c9-c99b-d038e650fbd5.png">

#STEP6 SwiftGifOriginをインポートする
ViewController.swiftにSwiftGifOriginをインポートします。

```Swift
import UIKit
import SwiftGifOrigin

class ViewController: UIViewController {

    
    @IBOutlet weak var gifImage: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
```

#STEP7 loadGifメソッドを追記し、引数としてGIFファイル名を与える
ViewController.swiftのviewDidLoadにloadGifメソッドを追記し、引数としてGIFファイル名を与えます。


```Swift
import UIKit
import SwiftGifOrigin

class ViewController: UIViewController {

    
    @IBOutlet weak var gifImage: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //loadGifメソッドを追記し、引数としてGIFファイル名を与える
        gifImage.loadGif(name: "hourglass")
        
    }
```

#STEP8 完成！
ビルドし、シュミレーターで動作を確認します。
![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227611/76261560-5265-5840-60f2-2b07cc53d98e.gif)
シュミレーターでGIFアニメーションが動作することを確認できました。

#終わりに
私自身まだまだSwiftに慣れていません。
こうした方が良いなどアドバイスがありましたら、お気軽にコメントお願いします！
MySQLで0から始まる値をINSERTしても0が表示されない問題を解決する

<h2>経緯</h2>
表題の問題を解決するためのSQLをメモとして投稿


<h2>解決したい事象</h2>
IDカラムに0から始まる値をINSERTしても0が表示されない場合のSQL例。

```
/* 新しいDBとしてmydbを定義、使用宣言をする */
create database mydb;
use mydb;

/* sampleテーブルを作成 */
create table mydb.sample(id int(3) UNSIGNED PRIMARY KEY,
name varchar(10) not null, sex char(1) not null);
```



```
/* 値をINSERTする */
insert into sample
values ('001', "田中太郎", "男");

/* 中身を表示する */
select * from sample;
```
結果、idカラムにはINSERTした'001'ではなく、'1'が表示されてしまう。
<img width="154" alt="スクリーンショット 2020-04-19 12.03.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401208/5ba8e442-c1cf-ff4c-1f99-a9d49e508f7a.png">


<h2>解決方法</h2>
結論、INSERT文ではなくTABLE作成時の定義に問題がある。
解決するにはid列を定義するとき、<b>ZEROFILL</b>を指定する必要があった。

実際にZEROFILLを指定してINSERTし直してみる。

```
/* sampleテーブルを一度削除しておく */
drop table sample;

/* idに ZEROFILL を指定したsampleテーブルを作成 */
 create table mydb.sample(id int(3) ZEROFILL PRIMARY KEY,
 name varchar(10) not null, sex char(1) not null);
```

```
/* 値をINSERTする */
insert into sample
values ('1', "田中太郎", "男");

/* 中身を表示する */
select * from sample;
```
カラム定義時にZEROFILLを指定しておくと、データINSERT時に上の桁を0で埋めて文字列長さを固定してくれるため、値をinsertする際には上の桁の0を入力する必要がない。
idカラムには指定した通りの'001'が表示される。
<img width="152" alt="スクリーンショット 2020-04-19 12.27.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401208/4a332c02-5607-3e13-c718-2b13d55db053.png">

<h3>補足＆参考サイト</h3>
https://qiita.com/sunnyG/items/a0097a83b2a879b22ab9
ZEROFILL属性を入れたときにUNSIGNED属性を入れていない理由も書かれています。

http://dbinfo.sakura.ne.jp/?contents_id=102
mysqlでカラムを定義するときのint()のカッコ内の数値の意味がわかります。
今回のようにZEROFILLを付けたとき、0を補完する桁数としてカッコ内の数値が意味を持つんですね。

例えば今回はidカラムをint(3)としているので、1を挿入したときに'001'がフィールドの値として入ります。もしこれがint(5)で、1を挿入した場合は'00001'がフィールドの値として入ります。
[Python] [R] tensorflow-2.xでGPUを認識させる

# 環境
- Ubuntu 18.04 LTS
- GeForce GTX 1050
- NVIDIA driver version: 435.21
- conda 4.8.3
- R version 3.5.3

# tensorflow-2.xでは一発でGPUが認識されました

```shell
conda create -y -n tf2 -c anaconda tensorflow-gpu
```

```shell
conda activate tf2
python -c '
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"]="3" # Tensorflowのログメッセージをオフにします
import tensorflow as tf
print("Num GPUs Available: ", len(tf.config.experimental.list_physical_devices("GPU")))'

# Num GPUs Available:  1
```
GPUが認識されました！:smiley: 

パッケージを確認してみます。

```shell
conda list -n tf2 | grep -e python -e cud -e tensorflow

# cudatoolkit               10.1.243             h6bb024c_0    anaconda
# cudnn                     7.6.5                cuda10.1_0    anaconda
# python                    3.7.7           hcf32534_0_cpython    anaconda
# tensorflow                2.1.0           gpu_py37h7a4bb67_0    anaconda
# tensorflow-base           2.1.0           gpu_py37h6c5654b_0    anaconda
# tensorflow-estimator      2.1.0              pyhd54b08b_0    anaconda
# tensorflow-gpu            2.1.0                h0d30ee6_0    anaconda
```

[昨年の今ごろはCUDA, CuDNNがインストールされなかった](https://qiita.com/akikuno/items/8decc00c9dbe26284813)のですが、
いまは一発で全てインストールされています:clap: 

# Rでも同じです

```shell
# Rのインストール
conda install -y -n tf2 r-essentials r-base

cat << 'EOF' > r_env.R
options(repos = "https://cran.rstudio.com")
if (!requireNamespace("reticulate", quietly = T)) install.packages("reticulate")
reticulate::use_condaenv("tf2")
library(reticulate)

# tf2の環境が呼び出されているか確認します: 
print(reticulate::py_config()[1])

# GPUが認識されているか確認します。
Sys.setenv(TF_CPP_MIN_LOG_LEVEL = 3) # Tensorflowのログメッセージをオフにします
tf <- import("tensorflow")

print(sprintf("Num GPUs Available: %d", 
length(tf$config$experimental$list_physical_devices("GPU"))))
EOF

Rscript r_env.R

# 実行結果
# $python
# [1] "XXX/anaconda3/envs/tf2/bin/python"

# [1] "Num GPUs Available: 1"
```

Rでも同様にGPUが認識されました！
これでGPUを使ってゴリゴリ計算を回すことができますね！
RedHat 7でアップデートしたらrhsmdでエラー


RedHat ES7.7でyum updateしたら
root宛に以下のメールがでるようになりました
－－－－－－－
sleep: オペランドがありません
Try 'sleep --help' for more information.
/etc/cron.daily/rhsmd: 19 行: 30556 Terminated              /usr/libexec/rhsmd -s
－－－－－－－

なので、該当の/etc/cron.daily/rhsmdのシェルを見てみたら
－－－－－－－
config=$(grep -E "^processTimeout" /etc/rhsm/rhsm.conf | grep -Po "[0-9]+")
if [ -n $config ]; then　　★
  rhsmd_timeout=$config
else
  rhsmd_timeout=300
fi
/usr/libexec/rhsmd -s &
sleep $rhsmd_timeout;
※このあと、rhsmdのプロセスが残っていたらkillする処理
－－－－－－－

となっていて
/etc/rhsm/rhsm.confに proceessTimeoutの記述がないとき
★の行が、　if [ -n ] ; thenで実行されてしまい、
このifが本来なら偽になってrhsmd_timeout=300が代入されるべきところ、
誤って真となり、 rhsmd_timeoutに空文字が代入されて
sleep
のみ（オペランドなし）が実行されてしまっているようです。

一応、yum update時には/etc/rhsm/rhsm.conf.rpmnewはできていて
これにはprocessTimeoutが追加されてはあるのですが、
もともとrhsm.confを加工していた関係で
/etc/rhsm/rhsm.confにはprocessTimeoutがないままでした。

シェルにもprocessTimeoutがない場合の対応は書いてあるのですが
これが
if [ -n $config ]; then
となっているのが　多分バグなのでしょう。

###なので
if [ -n $config ]; then
↓
if [ -n "$config" ]; then
に修正して　緊急対策しました。

最終的には、
/etc/rhsm/rhsm.conf.rpmnewを参考にして
/etc/rhsm/rhsm.conf
に追加された命令を書き加えるのがよいのでしょう。
STM32でできるだけ動作に影響を与えずにデバッグしたい

マイコンのプログラミングをしてるときに、ペリフェラルのレジスタとかを見たいことがありますよね。デバッガやprintfを使う手もありますが、往々にして「printfを入れると動く」という事態になりかねません。これはprintfの処理を行っている期間が適当なディレイとして機能して「動いてしまう」例です。リアルタイム性が重要な状況の場合、この影響を可能な限り小さくしたいわけです。

ところで、STM32には大変便利なSPIという機能があります! これを使うと極めて少ない処理で32bitの値を出力できます!! 早速使ってみましょう!!!

***

デバッグ用に一時的に使いたい、という場合を想定して、最低限必要な初期化コードだけを書いていきます。

```c++:初期化
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_SPI1_CLK_ENABLE();

GPIO_InitTypeDef gpio = {
    .Pin = GPIO_PIN_3 | GPIO_PIN_5,
    .Mode = GPIO_MODE_AF_PP,
    .Pull = GPIO_NOPULL,
    .Speed = GPIO_SPEED_HIGH,
    .Alternate = GPIO_AF5_SPI1,
};
HAL_GPIO_Init(GPIOB, &gpio);

SPI_HandleTypeDef hspi = {
    .Instance = SPI1,
    .Init = SPI_InitTypeDef{
        .Mode = SPI_MODE_MASTER,
        .Direction = SPI_DIRECTION_2LINES,
        .DataSize = SPI_DATASIZE_16BIT,
        .CLKPolarity = SPI_POLARITY_LOW,
        .CLKPhase = SPI_PHASE_1EDGE,
        .NSS = SPI_NSS_SOFT,
        .BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2,
    },
};
HAL_SPI_Init(&hspi);

__HAL_SPI_ENABLE(&hspi);
```

この設定により、コアクロック168MHzであればSCLKが42MHzで駆動され、1回毎に16bitのデータが出てきます。

あとは、必要なときに以下のように出力を行います。

```c++:I2C割り込みを出力する例
extern "C" void I2C1_EV_IRQHandler(void)
{
    SPI1->DR = I2C1_EV_IRQn;
    __NOP();
    __NOP();
    __NOP();
    __NOP();
    SPI1->DR = i2c.SR1 & 0xFFFF;
    // 以下、割り込み内での処理
```

SPIの通信が行われていないとき(BSYがクリアされているとき)にDRへ書き込んだ場合、ほぼ即時に送信バッファへの転送が行われ、その時点でTXEがセットされます。ただ、さすがにノーウェイトで連続して書き込むと間に合わないことがあるので、NOPで待っています。とりあえず4サイクルくらい待てば足りそうな感じですが、このあたりは必要に応じて調整してください。
whileでTXEがセットされるのを待つのが確実ですが、ビットテストとループはそれなりのサイクル数が必要なので、必要以上の待ち時間が発生してしまいます(それでも数百ナノ秒程度ですが)。
今回はプリスケーラを2に設定していますが、この値を大きくする場合(ビットレートを下げた場合)はDRの転送により長い時間が必要なため、その場合はwhileで監視したほうが確実です。

前述の例では、1回目にIRQnを出力し、2回目にステータスレジスタの下位16bitを出力しています。これにより「場所」と「値」を出力できます。ただし、Cortexコアに関わるIRQn(`SysTick_IRQn`等)は負数が指定されているため、これを使う場合は注意が必要です。
他にも、`SPI1->DR = __LINE__ & 0xFFFF;`のようにすればソースコードの通過位置を出力することもできます(あまり高頻度にやると出力が間に合わないので注意が必要ですが)。



あとは、SPIをロジックアナライザで監視して、仮想スレーブセレクト、ビット長32、といった設定でデコードすれば、4オクテットを見ることができます。

雰囲気としては、4オクテットの送信に40コアクロック未満で足りそうな感じです。それすらも避けたい場合は、2オクテットに限定すればさらに少ないコアクロックで転送できます。printfのような高コストな方法と比べると、ほぼ無負荷に近いレベルで値の出力が行なえます。

割り込みハンドラ内で使うと、割り込みの発生したタイミングとステータスレジスタの中身を同時に出力できるので便利です。GPIOのトグルでもタイミングは確認できますが、あくまでも「ここで割り込みが発生した」ということしかわかりません。SPIで4オクテット転送を使った場合は「どの割り込みが発生したか」「ステータスレジスタの値は何か」という情報の出力が行えるようになります。
もちろん、16bitのステータスを2本、あるいは32bitのステータスを1本出力する、といった使い方もできます。しかし、この場合はどこで発生したイベントか特定するのが難しいという欠点があります。

また、この方法は簡易的なデバッグ手段の提供が目的なので、イベントレートが高くなると正常に動作しなくなります。特に複数のペリフェラルの割り込みを出力する場合、それぞれの割り込みタイミングが接近してSPIの転送が間に合わない、といったことも考えられます。不必要に多用しないようにしましょう。
初めてのFirebaseを触ってみる(Functions - REST API)

#はじめに
おはようございます。こんにちは。こんばんは。
今回は前回発生した緊急クエストです。
では、早速行って見ましょう。
#REST APIとは
[こちら](https://qiita.com/masato44gm/items/dffb8281536ad321fb08)の記事が参考になります。
#expressを使ったREST API
##expressとは
[express](https://expressjs.com/ja/)はNode.jsで利用できるWebアプリケーションフレームワークです。
##インストール
```console
$ npm install express --save
```
##API開発
``functions``ディレクトリの配下に``router/index.js``を作り、そこにルーティングの設定を書きます。

※ルーティングの実装はルーティング用のオブジェクトを別ファイルで管理するとコードが読みやすくなるのでおすすめ

```js:functions/router/index.js

const express = require("express");
const router = express.Router();

router
    .route("/")
    .get((request, response) => {
    // ここにコレクション等の取得を書く
        response.json({
            "message": "call by the GET method"
        })
    })
    .post((request, response) => {
    // ここデータ送信の処理を書く
        response.json({
            "message": "call by the POST method"
        })
    })

router
    .route("/:id")
    .put((request, response) => {
    // ここデータ更新の処理を書く
        response.json({
            "message": "call by the PUT method ID:" + request.params.id
        })
    })
    .delete((request, response) => {
    // ここデータ削除の処理を書く
        response.json({
            "message": "call by the DELETE method ID:" + request.params.id
        })
    })

module.exports = router
```

最後にこの設定をCloud Functionsに組み込みましょう。

```js:functions/index.js

const functions = require('firebase-functions');
const express = require("express");
const app = express();

const router = require("./router/index"); 
app.use("/", router);
 
exports.api= functions.https.onRequest(app);
```

以上がCloud Functionsとexplessを組み合わせるAPI(REST API)の作り方でした。
解説が浅いところとか、間違い等があれば教えてください。
次回は最終回のFirebaseのHostingです。
最後まで読んでいただきありがとうございました。

[Twitter](https://twitter.com/watataku9)やってます。良ければチェックして見てください。:point_up::point_up::point_up:

#リンク
- [初めてのFirebaseを触ってみる(導入編)](https://qiita.com/watataku/items/94274031a4e49c9cc9a0)
- [初めてのFirebaseを触ってみる(Authentication)](https://qiita.com/watataku/items/9f134b44ead087abe68b)
- [初めてのFirebaseを触ってみる(Database)](https://qiita.com/watataku/items/ac040f4671c0f9a62bd4)
- [初めてのFirebaseを触ってみる(Storage)](https://qiita.com/watataku/items/7292a04590aad5b4dd19)
- [初めてのFirebaseを触ってみる(Functions)](https://qiita.com/watataku/items/6d5fd6bfe5c4adf1b71b)
【ReactNative】react-native-mapsで地図上に被せてボタンを表示する

# 概要
先日[【ReactNative】react-native-mapsを導入する](https://qiita.com/nekoniki/items/61bfa4245c88a5ca0408)という記事を書いて、`react-native-maps`を導入しました。
しかしながら、大概のアプリは**地図を表示する+何かしらのUIを重ねて表示する**のではないでしょうか？
例えば下の画像のように、地図の右上に検索ボタンを設置する等です。
<img width="416" alt="hoge.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435429/c0df1bc2-54fc-b9ba-c298-0d233487a91a.png">

今回は、`react-native-maps`の`MapView`に独自のUIを重ねて表示させた時のコードを紹介します。

# バージョン情報

```
"react-native": "0.61.5",
"react-native-maps": "^0.26.1",
"native-base": "^2.13.8",
```

# コード

まずボタンのコンポーネントを作ります。
`View`のスタイルを`absolute`かつ`right : '0%'`とすることで常に右上に来るようにします。
内部の`Button`側で適宜`margin`を取ったりして表示を調節しましょう。
複数のボタンを横並び、縦並びにさせることもできます。

```javascript:ButtonView.tsx

import React from 'react';
import { StyleSheet } from 'react-native';
import { Text, View, Button, Icon } from 'native-base';

// 地図の右上に表示する用のコンポーネント(FC)
const ButtonView : React.FC<{onPressIcon : () => void}> = (props : {onPressIcon : () => void}) => {
    return (
        <View style={{position : 'absolute', right : '0%'}}>
            <Button style={{margin : 5}} onPress={props.onPressIcon} >
                <Icon type='FontAwesome5' name='search' />
            </Button>
        </View>
    );
}

export default ButtonView;
```

あとは`ButtonView`を`MapView`に重ねるだけです。
`MapView `のスタイルを`StyleSheet.absoluteFillObject`にするのを忘れずに。


```javascript:MapComponent.tsx
import React from 'react';
import { StyleSheet, Alert } from 'react-native';
import MapView from 'react-native-maps';
import { Container } from 'native-base';
import ButtonView from './ButtonView';

class MapComponent extends React.PureComponent<{}> {

    constructor(props : {}) {
        super(props);
    }

    render() {
        return (
             <Container>
                <MapView style={{...StyleSheet.absoluteFillObject}} />
                <ButtonView onPressIcon={()=>{ Alert.alert("アイコンをタップしたよ!!") }} />
             </Container>
        );
    }
}

export default MapComponent;
```

# おわりに
今回は地図右上に独自のコンポーネントを表示する例を紹介しました。
ちょっと手を加えれば、左上や下部、あるいは真ん中に表示させることも可能です。
ちょっとしたTerminalコマンド【Mac OS X】

#Appleのアプリを閉じて(cmd+q)開けたら以前使っていたものが開く問題
```defaults write com.apple.[App Name] NSQuitAlwaysKeepsWindows -bool false```
([App Name]はアプリの名前、例：Preview)と書くと開かなくなる。逆に、元に戻したい場合は
```defaults write com.apple.[App Name] NSQuitAlwaysKeepsWindows -bool true```
と書けばよい。

#PLAYボタンを押してもiTunesを開かないようにする

```
launchctl disable gui/"$(id -u)"/com.apple.rcd
launchctl kill SIGTERM gui/"$(id -u)"/com.apple.rcd
```

元に戻す：

```
launchctl enable gui/"$(id -u)"/com.apple.rcd
launchctl kickstart gui/"$(id -u)"/com.apple.rcd
```

#PDFやmp3などのサムネールの矢印ボタンを消す
```defaults write com.apple.finder QLInlinePreviewMinimumSupportedSize -int 514```
元に戻す：
```defaults write com.apple.finder QLInlinePreviewMinimumSupportedSize -int 0```

#おまけ：システム起動音がなくなった？復活方法
```sudo nvram StartupMute=%00```
と書けば起動後に「ブーン」となる。音は前と少し変わってる....。
Vue.js Transition概要

Vue.jsのTransition機能についてまとめる。(超基礎の学習記録)


## 基本的な使用方法

**1. transitionタグで囲む**

* トランジションを適用したい範囲を`transition`タグで囲み、コンポーネントを作成。

* このコンポーネント内要素に、アニメーションなどの動きをCSSで記述していくためのクラスを自動的に付与。

  
  ```vue
  <transition>
      <p v-if="show">Transition Test</p>
  </transition>
  ```

  

**2. v-show/v-ifディレクティブの適用**

* CSSによって動きを制御したい要素には、`v-show`または`v-if`ディレクティブで表示・非表示する挙動を実装。
* ディレクティブの機能により、クラスの切り替え機能を割り当て。


**3. クラス（CSS）記述**

* 付与されるクラスは、以下２つの状態に大別される。
  * **Enter**
  * **Leave**
* 上記状態は、`v-show`および`v-if`によって切り替わるように処理。
* 以下の例では、ボタンをクリックすると下記図の流れでクラスを適用。
  1. `.v-enter`時には、文字`Test`は透明状態(`opacity:0`)となっている。
  2. `Transition`ボタンをクリックすると`.v-enter-active`処理が実行される。`.v-enter-to`状態となり文字`Test`が表示される。
  3. `Transition`ボタンを再度クリックすると`.v-leave-active`処理が実行され、`.v-leave-to`状態に遷移する。

```vue
<template>
  <div id="app">
    <button v-on:click="show = !show">
        Transition
    </button>
    <transition>
        <p v-if="show">Test</p>
    </transition>
  </div>
</template>
<script>
export default {
  name: 'test',
  data :function (){
    return {
      show: false
    }
  }
}
</script>
<style scoped>	
.v-enter-active, .v-leave-active {
  transition: opacity .5s;
}
.v-enter, .v-leave-to{
  opacity: 0;
}
</style>
```

![Vue-transition-image](![Vue-transition-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/e7caf97b-6c18-263c-e98a-c9aa0cd1072c.png)
)

## Transitionの識別

複数のtransitionを利用する際、`name`属性を追加して識別する。以下の例では、`test1`をプレフィックスとしたクラスが生成される。

`.test1-enter-active`のように記述してデフォルトの`.v-enter-active`とは別のコンポーネントとして識別可能。

```vue
<template>
  <div id="app">
    <button v-on:click="show = !show">
        Transition
    </button>
    <transition name="test1">
        <p v-if="show">Test1</p>
    </transition>
  </div>
</template>
<script>
export default {
  name: 'test1',
  data :function (){
    return {
      show: false
    }
  }
}
</script>
<style scoped>	
.test1-enter-active, .test1-leave-active {
  transition: opacity 1s;
}
.test1-enter, .test1-leave-to{
  opacity: 0;
}
</style>
```



## 初期描画時のTransition

ノードの初期描画時にトランジションを適用したい場合、`appear` 属性を追加する。

`appear` 属性を指定された `transition` タグは、ページを開いた時に、要素が追加される。

```vue
<transition appear>
  <!-- ... -->
</transition>
```



## 参考

* [トランジション](https://v1-jp.vuejs.org/guide/transitions.html)

* [Enter/Leave とトランジション一覧](https://jp.vuejs.org/v2/guide/transitions.html)

* [Vue.jsのtransitionによるアニメーションの基礎を学ぶ](https://noumenon-th.net/programming/2019/05/25/transition/)

* [Vue.js の transition ってなに？]([https://python.ms/transition/#_1-%E5%8B%98%E9%81%95%E3%81%84%E3%81%97%E3%81%A6%E3%81%84%E3%81%9F%E3%81%93%E3%81%A8](https://python.ms/transition/#_1-勘違いしていたこと))
短縮URLに対応していないスマフォ、ブラウザ、ネット設定など

短縮URLに対応していないブラウザ、スマフォ、ネット設定などを調査中です。

http://bit.ly
を使ってきました。

スマフォ利用者から短縮URLが繋がらないという声をいただいたことがあります。

原因解明をこれまでしてきませんでした。

スマフォの設定なのか、ブラウザの設定なのか、ネットの設定なのか。

URL共有に役立つ短縮URL作成サービス7選
https://ferret-plus.com/8419

短縮URLおすすめ5選、一芸に秀でた国産サービスで長い地図URLもスッキリ！
https://news.mynavi.jp/article/20190706-854464/

短縮URLはなぜ「使ってはいけない」といわれるのか？　セキュリティ面から考える
https://techtarget.itmedia.co.jp/tt/news/1710/02/news03.html

Googleも手を引いた「URL短縮サービス」、終了後にユーザーはどうなる？
https://nlab.itmedia.co.jp/nl/articles/1804/12/news079.html

bitly短縮URLを独自ドメインで使用する
https://asumeru.net/bitly

短縮URLならbitlyが最強！Googleなき今bitly一択の理由
https://www.grosme-fukugyo.com/marketing/tool/bitly

この項は書きかけです。順次追記します。
＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
# 文書履歴(document history)
ver. 0.01 初稿 20200419
ver. 0.02 URL追記　20230307

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
MacOS用SourceTreeでAzureDevOpsのリポジトリをクローンする

SourceTreeはプログラムのソースコードを管理するGitを簡単に使うためのツール。
GUIじゃないと嫌という人は使うべき。
Winだと簡単に使えるけどMacはクローンの段階でハマりポイントがある。

# SourceTreeでAzure DevOpsのリポジトリのクローンの際に起こること
- win
普通にクローンできる
- mac
パスワードを求められる。もしくは問答無用で資格エラーになる。

## パスワードを求められる時
そもそもパスワード設定なんてしていないためMSアカウントのパスワードを入力してみるもエラー。

### パスワードはどこにあるのか？
DevOps上でブランチをクローンするURLを確認する際にでてくるボタン
`Generate Git Credentials`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315936/ca8341b3-d9cd-933b-e63f-88b57c967333.png)

クリックすると中にパスワードがある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315936/ae505e3f-123e-7268-d88b-71c054306b03.png)



## パスワードすら求められない時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315936/f01e4cfc-c9cb-355f-42a0-dc3ca6fad467.png)

キーチェーンアクセスの中に
`dev.azure.com Access Key`から始まる鍵設定がすでに設定されている可能性が高い。これを削除してからもう一度↑の作業をするとクローン時にパスワードを聞かれる。