OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】データサイエンス100本ノック（構造化データ加工編） 015 解説

- データサイエンス100本ノックをやりきる会を作りました🎉
- こちらの[Slack招待URL](https://join.slack.com/t/data-science-100nocks/shared_invite/zt-gfncg9vm-8W8b3UrDg8R~TKaqUkQpgw)からご参加ください！！
- ぜひ一緒に励まし合いながら、データサイエンス100本ノックをやり切りたいと思っています！

##Youtube
[動画解説](https://youtu.be/W5K26k-nByg)もしています。

##問題
P-015: 顧客データフレーム（df_customer）から、ステータスコード（status_cd）の先頭がアルファベットのA〜Fで始まり、末尾が数字の1〜9で終わるデータを全項目抽出し、10件だけ表示せよ。

##解答
```:コード
df_customer.query("status_cd.str.contains('^[A-F].*[1-9]$')", engine='python').head(10)
```

##出力
|  | customer_id | customer_name | gender_cd | gender | birth_day | age | postal_cd | address | application_store_cd | application_date | status_cd |
|--:|:--|:--|--:|:--|:--|--:|:--|:--|:--|--:|:--|
| 12 | CS011215000048 | 芦田 沙耶 | 1 | 女性 | 1992-02-01 | 27 | 223-0062 | 神奈川県横浜市港北区日吉本町********** | S14011 | 20150228 | C-20100421-9 |
| 68 | CS022513000105 | 島村 貴美子 | 1 | 女性 | 1962-03-12 | 57 | 249-0002 | 神奈川県逗子市山の根********** | S14022 | 20150320 | A-20091115-7 |
| 71 | CS001515000096 | 水野 陽子 | 9 | 不明 | 1960-11-29 | 58 | 144-0053 | 東京都大田区蒲田本町********** | S13001 | 20150614 | A-20100724-7 |
| 122 | CS013615000053 | 西脇 季衣 | 1 | 女性 | 1953-10-18 | 65 | 261-0026 | 千葉県千葉市美浜区幕張西********** | S12013 | 20150128 | B-20100329-6 |
| 144 | CS020412000161 | 小宮 薫 | 1 | 女性 | 1974-05-21 | 44 | 174-0042 | 東京都板橋区東坂下********** | S13020 | 20150822 | B-20081021-3 |
| 178 | CS001215000097 | 竹中 あさみ | 1 | 女性 | 1990-07-25 | 28 | 146-0095 | 東京都大田区多摩川********** | S13001 | 20170315 | A-20100211-2 |
| 252 | CS035212000007 | 内村 恵梨香 | 1 | 女性 | 1990-12-04 | 28 | 152-0023 | 東京都目黒区八雲********** | S13035 | 20151013 | B-20101018-6 |
| 259 | CS002515000386 | 野田 コウ | 1 | 女性 | 1963-05-30 | 55 | 185-0013 | 東京都国分寺市西恋ケ窪********** | S13002 | 20160410 | C-20100127-8 |
| 293 | CS001615000372 | 稲垣 寿々花 | 1 | 女性 | 1956-10-29 | 62 | 144-0035 | 東京都大田区南蒲田********** | S13001 | 20170403 | A-20100104-1 |
| 297 | CS032512000121 | 松井 知世 | 1 | 女性 | 1962-09-04 | 56 | 210-0011 | 神奈川県川崎市川崎区富士見********** | S13032 | 20150727 | A-20100103-5 |

##解説
・PandasのDataFrame/Seriesにて、条件に当てはまる先頭データを確認する方法です。
・条件に当てはまる情報を確認したい時に使用します。
・**'contains(<文字列>)'は、指定した文字列が含まれているどうかを判定する関数**であり、含まれる場合はTrue、含まれない場合はFalseを返します。
・ただし、**'.query('---.str.contains(<文字列>))'は、指定した文字列が含まれることを条件として指定します。**
**・今回の場合、status_cd を文字列に置換するために'status_cd.str'とし、'.contains('^[A-F].*[1-9]$')'を続けることで、「A-F」が先頭に、「1-9」が末尾にある status_cd を指定しています。**
**・'.'は一文字を表す正規表現であり、'*'は前の文字が0回以上繰り返されることを表す正規表現**です。正規表現とは、「複数の文字列を1つの記号で表す方法」のことを指します。
**・'.*'で、０文字以上の文字が間に入ることを表しています。**
**・'^'は先頭文字であることを、'$'は末尾文字であることを表す正規表現です。**

※正規表現については、[こちら](https://qiita.com/hiroyuki_mrp/items/29e87bf5fe46de62983c)の記事が参考になります。

**・'regex=True'は、正規表現を扱う際に必要とされていました。解答例では'^''$''-''.''*'が正規表現として扱われています。現在は、書かなくても正規表現として扱われるようになっているので、なくても問題ないです。**
・'engine = 'python''について、query の引数である engine には'python'か、'numexpr'かを選択することができますが、strを用いる場合は、'python'を指定してあげないとエラーが発生してしまいます。
Linuxについて簡単まとめ

#Linuxとは？

- Unixをベースにして開発されたサーバーOSで、Windows Serverと並ぶ代表的なサーバーOSである。

- Linuxはあくまでも**総称**であり、Linuxという名称のOSが存在するわけではない。

※ 一口に「Linux」と言っても、広義のLinuxの意味と狭義のlinuxの意味があるので注意。
広義のLinux：サーバーOSとしてのLinux
狭義のLinux：カーネルとしてのLinux


#Linuxの特徴は?

主に以下の3つの特徴がある。

1. オープンソース(世間に公開されていて、誰でも自由に改変して配布できるソースコードのこと)であること。

2. フリーソフトウェアとして提供されている場合が多いこと。

3. Windows Serverの場合はMicrosoftの1社提供であるのに対して、Linuxはそれぞれのディストリビューションごとに提供者が存在し、各ディストリビューションごとに特徴がある。Linuxのディストリビューションは、主に`「Red Hat系」`、`「Debian系」`、`「Slackware系」`、`「独立系」`の４つのタイプに別れる。



例：Red Hat Enterprise Linux(提供者：Red Hat)→サーバー用に特化
　：Debian GNU/Linux(提供者：Debian Project)→クライアントPC用とサーバー用どちらでも可
　：Ubuntu(提供者：Canonical UK Ltd.)→クライアントPC用とサーバー用で別れている


#なぜLinuxは人気なのか？

理由は主に以下の３つがある。

1.使い始めてから廃止するまで費用を必要としない(無料で使える)

2.目的に合わせてOSを選択できる(ディストリビューションが豊富である)

3.サーバーソフトウェアが豊富(大抵のサーバーが構築可能である)

#中には有料のLinuxも存在する

例：Red Hat Enterprise Linux
　：SUSE Linux Enterprise Server
　：Turbolinux
　：Oracle Enterprise Linux
　
#有料のLinuxを使う理由

- 有料だと提供元からのサポートが受けられるから

- 無料の場合はバグなどの障害が起きて開発コミュニティに問い合わせても対応してもらえるとは限らないから
VBScriptでひらがな・カタカナ変換を行う関数

下記の記事のロジックの応用で、ひらがな・カタカナ変換を行う関数も作成しました。
[VBScriptで全角・半角変換を行う関数](https://qiita.com/takahasinaoki/items/4ff08f0b733ddc6c6927)


#ソースコード

```vb
Option Explicit

'*****************************************************************************
'[概要] 全角ひらがなを全角カタカナに変換する
'[引数] 変換対象文字列
'[戻値] 変換後文字列
'*****************************************************************************
Function StrConvKana(ByVal strWord)
    Dim i, strChar, lngChar
    For i = 1 To Len(strWord)
        strChar = Mid(strWord, i, 1)
        lngChar = Asc(strChar)
        If Asc("ぁ") <= lngChar And lngChar <= Asc("み") Then
            strChar = Chr(lngChar + Asc("ア") - Asc("あ"))
        ElseIf Asc("む") <= lngChar And lngChar <= Asc("ん") Then
            strChar = Chr(lngChar + Asc("ン") - Asc("ん"))
        End If
        StrConvKana = StrConvKana & strChar
    Next
End Function

'*****************************************************************************
'[概要] 全角カタカナを全角ひらがなに変換する
'[引数] 変換対象文字列
'[戻値] 変換後文字列
'*****************************************************************************
Function StrConvHira(ByVal strWord)
    Dim i, strChar, lngChar
    For i = 1 To Len(strWord)
        strChar = Mid(strWord, i, 1)
        lngChar = Asc(strChar)
        If Asc("ァ") <= lngChar And lngChar <= Asc("ミ") Then
            strChar = Chr(lngChar - Asc("ア") + Asc("あ"))
        ElseIf Asc("ム") <= lngChar And lngChar <= Asc("ン") Then
            strChar = Chr(lngChar - Asc("ン") + Asc("ん"))
        End If
        StrConvHira = StrConvHira & strChar
    Next
End Function
```
　



途中の`ミ`と`ム`で判定を区切っているのは、以下のコードの実行結果で分かるように、カタカナのみミとムの文字コードが1文字分とんでいるためです。

```vb
Sub DumpChar()
    Dim i, str
    str = ""
    For i = Asc("ぁ") To Asc("ん")
        str = str & Chr(i)
    Next
    Debug.Print str
    str = ""
    For i = Asc("ァ") To Asc("ン")
        str = str & Chr(i)
    Next
    Debug.Print str
End Sub
```
実行結果は以下となります。
`ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん`
`ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミ・ムメモャヤュユョヨラリルレロヮワヰヱヲン`

#関連記事
[VBScriptで全角・半角変換を行う関数](https://qiita.com/takahasinaoki/items/4ff08f0b733ddc6c6927)
[VBScriptでカタカナの全角・半角変換を行う関数](https://qiita.com/takahasinaoki/items/8e57b58e634a11c1a080)
[VBScriptでひらがな・カタカナ変換を行う関数](https://qiita.com/takahasinaoki/items/51746404092ce741ceda)　※この記事
【Auth0】アプリケーションからWeb API向けのアクセストークン（JWT形式）を取得する

# はじめに
Auth0では管理画面の`APIs`メニューに登録した独自のWebAPI向けのアクセストークンを取得できます。
Auth0が発行するWebAPI向けのアクセストークンはJWT形式となっていて、WebAPIからAuth0に問い合わせなくてもユーザーIDなどの情報をアクセストークンから取得できるようになっています。
本記事ではM2MではなくAuth0の認証機能を組み込んだアプリケーションを利用するユーザー用のWebAPI向けアクセストークンを取得する方法を紹介します。

# 事前準備
## アプリケーションとAPIの関連付け
Auth0の管理画面でアプリケーションとAPIの登録と関連付けをします。
本記事では事前に用意した`My App`というRegular Web Applicationと`Sample API`という名前のAPIを例として使用します。

`Sample API`の設定画面を開いて`My App`のトグルスイッチをON(AUTHORIZED)にします。

![スクリーンショット 2020-07-27 17.04.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653972/5781146f-0550-a3f8-921e-ee02bcf63897.png)

すると、権限（Permissions）を設定する画面が表示されます。

![スクリーンショット 2020-07-27 17.05.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653972/d0d2dd81-3c2d-0dc7-1ff6-d345d8827444.png)

しかしこの画面で設定する権限はアプリケーション自体が持つ権限のことを指していてユーザーの権限とは異なるものになります。
ユーザー用のアクセストークンを取得する時には設定不要です。

## アプリケーションとAPIの関連付けが不要なケース
関連付けを行う画面の上部にも書いてありますが、アプリケーションのタイプがSPAやNativeの場合はここで明示的に関連付けを行わなくてもAPI向けのアクセストークンを取得することができます。
SPAやNativeなどのPublicクライアントに分類されるアプリケーションはログインフローの中でクライアント認証が行われないのでAPIとの紐付けを保証することができないため設定が不要になっていると思われます。

# JWT形式のアクセストークン取得
## ログイン時のパラメーター
ログイン時のリクエストに`audience`パラメーターとしてAPIの`Identifier`を設定するとログイン処理の完了時にJWT形式のアクセストークンが取得できます。
Auth0の[API仕様](https://auth0.com/docs/api/authentication#authorization-code-flow)に記載されていた内容にaudienceの値を設定したものを例として以下に記載します。
Auth0のSDKを使う場合でも同じようにログイン処理のパラメーターに`audience`を追加してください。

```
GET https://YOUR_DOMAIN/authorize?
  audience=https://example.com/&
  scope=SCOPE&
  response_type=code&
  client_id=YOUR_CLIENT_ID&
  redirect_uri=https://YOUR_APP/callback&
  state=STATE
```

本記事では扱いませんが、もしもログインするユーザーにRoleやPermissionなどを付与していれば、このリクエスト時の`scope`パラメーターにその値を含めることでアクセストークンに権限の情報を含めることができます。
ユーザーのRoleやPermissionの設定については機会があればまた別記事で紹介したいと思います。

## アクセストークンのペイロード
ここまでの設定がうまくいけばJWT形式のアクセストークンが取得できます。
取得したアクセストークンのペイロード部分をデコードすると以下のような情報を含んだjsonが取得できます。

```json
{
  "iss": "https://YOUR_DOMAIN/",
  "sub": "auth0|5f14f3b8afdb6c0.........",
  "aud": [
    "https://example.com",
    "https://YOUR_DOMAIN/userinfo"
  ],
  "iat": 1595848832,
  "exp": 1595935232,
  "azp": "IuEp7tQh9GQ1zh.........",
  "scope": "openid"
}
```

このアクセストークンを受け取るWebAPI側ではJWTの署名や`iss`の値を検証して正統なユーザーからのアクセスかを判断します。また、`audience`にAPIの`Identifier`の値が設定されてるかを検証することで、自分自身向けに発行されたアクセストークンかを判断することができます。

`sub`がユーザーIDを表しているため、この値をキーとしてWebAPI側でユーザーのデータを保存しておけば、アクセストークンに含まれる情報だけでユーザーのデータの出し入れができるようになります。

# おわりに
アプリケーションからログインユーザー用の独自WebAPI向けアクセストークンを取得する方法を紹介しました。
要件によってはJWT形式のアクセストークンのほうが扱いやすいこともあると思うので試してみてください。
ゼロからのプログラミング学習　DAY 2 

二日目無事達成
本日は10時退社であったため30分今日の学習が限界であった
ホリエモン曰く、少しの時間でも良いから毎日やることが非常に大事であるとのこと。
これをやめたら人生終わり。
なんだか自分のコードで形作られていくのが面白い
今までJW Playerを使っていたけどplyr.jsをカスタマイズしてみた（１）

# プロローグ

今までは有料のJW Playerを使っていました。
有料なだけあり、ドキュメントなどもしっかりしていたが、最近無料の動画プレイヤーライブラリも増えてきたことだし、そろそろ乗り換え時かと思い、plyr.jsを使ってみました。

だが！！

あまりに日本語のドキュメントが少ないので、備忘録的に残すことにしました。

# 動画再生まで

公式サイト（ https://plyr.io/ ）からZIPで落とすなりする。
落としてきたら、distフォルダにある「plyr.min.js」と「plyr.css」を読み込める場所におく。

htmlフォルダをトップとするなら、下記のような感じで読み込める。

```txt:フォルダ構成
html/
　├ css/
　│　└ plyr.css
　├ js/
　│　├ jquery.min.js
　│　├ myplayer.js
　│　└ plyr.min.js
　├ index.html
　└ test.mp4
```

```html:index.html
<html>
  <head>
    <link rel="stylesheet" media="all" href="css/plyr.css">
    <script type="text/javascript" charset="UTF-8" src="js/jquery.min.js"></script>
    <script type="text/javascript" charset="UTF-8" src="js/plyr.min.js"></script>
    <script type="text/javascript" charset="UTF-8" src="js/myplayer.js"></script>
  </head>
  <body>
    <video id="video_player" controls>
      <source src="test.mp4" type="video/mp4" />
    </video>
  </body>
</html>
```

```js:js/myplayer.js
$(function() {
  player = new Plyr('#video_player');
});
```
<img width="1440" alt="スクリーンショット 2020-07-27 22.48.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118515/809b375b-49a0-2aaf-4315-eb0f133c1890.png">
とりあえず再生ができるようになりました。

これだけでも十分にかっこいいプレイヤーなのですが、サイト全体の色味と合わせたいなどあると思います。

[次回](https://qiita.com/nishidataishi/items/666305bf13983169524f)から本格的なカスタマイズに入ります。

参考URL：
https://www.datastadium.co.jp/engineer/e-reports/5627
オムニホイール搭載のJetbotの兄弟機! NVIDIA Kayaを作ったよ

nVidiaが提唱するNVIDIA Kayaを板金で製作しました。

#NVIDIA Kayaとは
KayaはnVidiaが提唱している自律走行ロボットであり、Isaacというロボット開発のプラットフォームを使用している。
Kayaは３Dプリンタで製作したシャーシにオムニホイールと、JetsonNano、Realsenseを組み合わせたものです。
https://docs.nvidia.com/isaac/isaac/doc/tutorials/assemble_kaya.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f76bbfab-e4c3-5a98-4591-4deed2c6b5dd.png)
#完成イメージ
3Dデータです。
![Kaya-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/b41ed930-10c1-e083-7997-93ba7cbc3967.jpeg)
紙で試作品を作ります。
ROTSONとの比較です。
![nVidiaKaya](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a9661f21-acd2-0a1f-7d63-8938f2752f79.jpeg)
当初はこのサイズを考えていました。
しかし、搭載するバッテリーのサイズから一回り大きくなることに
##サーボモータ
KayaはDynamixel MX-12Wが推奨されていますが、シリアルサーボTS-315でも使えるようマウントを設計しました。
###360度回転対応ワンワイヤー（１Wire）シリアルサーボ TS-315を使う
https://qiita.com/usashirou/items/478d971efa1b46ba0bae
##オムニホイール
オムニホイールは、アダプターを３Dプリンターで作るようになっていますが、今回は、58mmのものを使用しました。
###360度サーボモーターに58mmオムニホイールを使う
https://qiita.com/usashirou/items/a8665f94892964827613
以上で金額をかなり抑える事が可能です。
##筐体の製作
今回も、協和工業さんに製作して頂きました。
http://www.bankin.co.jp/
材料はアルミのA5052　t1.5です。
![DSC_0032.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/089608f5-5a08-b5da-8716-d303074949a3.jpeg)
当然ですが紙で作ったものと同じですね
![DSC_0040 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/5578413f-8de0-2e08-15ce-e6c5e79a7691.jpeg)
##アルマイト
Kayaはイメージカラーが緑のようなので緑アルマイトにしてみました。
![DSC_0097.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/e46ffd66-cbb6-3175-277c-589a137cfee1.jpeg)
#全景
標準構成のRealsenseD435を搭載した状態です。
RPLidarA1もYDLidarX2も搭載可能です。
![nVidiaKaya](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/03643f0e-af2c-2471-1d23-1437cb05f17d.jpeg)
連載：「DevOpsどうやってやろう」を理論に沿って考察＆トライしてみる（第0回：きっかけ）

# 概要

## 偉そうに歴史
2008年あたりのITバブル突入とともに、ITベンチャーが立ち上がり、それとともに様々なWEBサービスが立ち上がって早10年超。
なんとなく周辺の概況を見るに、サービス開始後5年を経過したWEBサービス（とそこに携わるエンジニア達）が、運用と開発の間で藻掻き足掻く様をちょっとずつ見るようになった気がする。

## WEB業界の2025年問題
そして、おそらくそれはここから更に顕著になっていくような気がする。
「2025年問題」なんて話もあるけれど、それはシステム業界全体での話で団塊の世代エンジニアの退職が鍵だった。
しかしことWEB業界の開発においては、その何倍も開発スピードのサイクルが早く、ビジネスサイドからの要求スピードも衰えを知らない。
「システムを作った当の本人がいなくなる」なんて事態をまたず、シンプルにサービス改善のサイクルを高速で回し続けた結果、運用開始から4～5年経過してサービスの運用について大きな障害が立ちはだかるのが「WEB業界の2025年問題」なのでは、なんて最近感じているこの頃。やはりシステム開発は未成熟な業界です。

## 「銀の弾丸」は何処に
「やっぱりマイクロサービスアーキテクチャかなあ」

と、安直にここ最近のモダンなウェブ系自社開発企業のカンファレンス記事などを読みつつ、これからのWEBサービス開発の未来について安直に考えつつ

「それに合わせて諸々組織体制とか教育とかも当然考えていかないといけないんだよな。そこまでいくと本当にもうわけわかめ」

と悶々としていたところ、ふと出会った1冊の本がこちら。

## とりあえずやってみようと思った
「The DevOps ハンドブック 理論・原則・実践のすべて」
https://amzn.to/2OWmvps

冒頭読んで、

「これです、これです、この体系的な感じをインプットしたかった。『マイクロサービスアーキテクチャ』みたいな1点ものでなく、概念とか体系が知りたかった。そしてそれを使いこなしてこれからのWEBサービス開発を照らしたかった」

となった次第。そんなわけで、これから自分がこの理論を実践していくに当たり、考察やチャレンジしたいことをまとめていくことにしました。
一応連載記事にして備忘を綴るつもりです。

体力が続くこと、一つずつのチャレンジがうまくいくこと、乞うご期待。

# 参考図書

「The DevOps ハンドブック 理論・原則・実践のすべて」
https://amzn.to/2OWmvps
React.jsでlocation.hrefを用いた外部URLへの遷移

React.jsにてクリックイベント等でページ遷移させたい場合、```window.location.href```が利用できます。
Vue.jsの場合はwindowオブジェクトからの指定は不要だったため、備忘録として残します。


```javascript:Googleへ遷移させたい場合
window.location.href = "https://google.com";
```


```react:reactでの使用例
import React from "react";

function Google() {
  const redirectToGoogle = () => {
    window.location.href = "https://google.com";
  };
  return (
    <div>
      <div onClick={redirectToGoogle}>Googleへ</div>
    </div>
  );
}

export default Google;

```
atomからgithubのリモートリポジトリをクローンする方法

#はじめに
githubを使用するにあって毎回リモートリポジトリからクローン後ブランチ切ってから作業に入る。
その際に以下の手順で行っていた。
①github上のURLコピー（下画像赤枠）
![github画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663519/d026370e-9703-4c5d-b014-4ef5588ecba6.png)

②前にクローンしたフォルダ削除
③gitbush立ち上げて`git clone URL`コマンド実行
正直めんどい。簡単にしたい。と思って調べたらatom上で上記の操作ができる方法があったため簡単にまとめる。

#対象とする方
・atomからの操作だけでgithubのリモートリポジトリをクローンしたい方
・新しいrepositoryを作成してそれをAtomと連携したい方

#環境
・Windows10
・Atom 1.48.0

※atom,githubアカウント,git,gitbushはインストール済みであることとします。

#手順
##手順①：github上のクローンしたいリポジトリのURLコピー
これは上記で記載した①と同様
##手順②：Atom起動
##手順③：コマンドパレットを開く（shift+ctrl+Pで開ける）
##手順④：`github:clone`を実行（alt+Gで実行可）
##手順⑤：必要事項を入力
手順④を実行すると`clone from` と　`To directory`　を入力を促される（下画像赤枠箇所）
![atom画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663519/b950cc2c-8182-ab04-611f-93391fd7f504.png)

`clone from`には手順①でコピーしたURLを入力
`To directory`にはクローンしたい場所(path)を指定
それぞれ入力後`clone`を実行すると指定した場所にリポジトリがクローンされている。
※同じリポジトリ名のフォルダがあるとエラーがでるためあらかじめ削除しておくこと。

#参照URL
以下の方のHPを参考にしましたので載せておきます。
・ [【GitHub】リポジトリをコピーする「clone」コマンドの紹介](https://vector-ium.com/github-clone/)
・ [【Qiita】atomと新たに作成したrepositoryを再連携する方法（github）](https://qiita.com/ohenzi/items/66d6e9b6da6eadd315e4)
EC2,Docker,Github,Codedeploy,Codepipeline まわり個人的メモ

## AWS + Docker デプロイ手順　神記事
https://qiita.com/dnnnn_yu/items/0037c531a4c0842b76a8


## credentials.yml.encによるBadgatewayのエラーの対処方法
原因：GitでPullした際に、他人のcredentialsファイルをプルっているのから

①credentialsファイルを消す

①念のため、最新の状態にbuildしとく。

```terminal:
docker-compose build
```

②credentialsファイルを生成する

```terminal:
docker-compose run -e EDITOR="vim" app rails credentials:edit
```

③繋がる

```terminal:
docker-compose up
```


## EC2とGithubの接続に関するエラー解消
https://qiita.com/hisayuki/items/1f608f70a212982b23d5

## dockerで作成したRailsをデプロイする手順
https://qiita.com/at-946/items/1e8acea19cc0b9f31b98

## EC2上でコンテナの起動

```terminal:gitlabの場合
[myuser@xxx.xxx.xxx.xxx ~]$ exit
$ scp -i ~/.ssh/myapp.pem ~/myapp/config/master.key myuser@xxx.xxx.xxx.xxx:./myapp/config/
[myuser@xxx.xxx.xxx.xxx ~]$ cd myapp
[myuser@xxx.xxx.xxx.xxx ~/myapp]$ docker-compose build
[myuser@xxx.xxx.xxx.xxx ~/myapp]$ docker-compose run web rails db:create
[myuser@xxx.xxx.xxx.xxx ~/myapp]$ docker-compose run web rails db:migrate
[myuser@xxx.xxx.xxx.xxx ~/myapp]$ docker-compose run web rails assets:precompile
[myuser@xxx.xxx.xxx.xxx ~/myapp]$ mkdir tmp/sockets
[myuser@xxx.xxx.xxx.xxx ~/myapp]$ touch tmp/sockets/puma.sock
[myuser@xxx.xxx.xxx.xxx ~/myapp]$ docker-compose up
```
Hyperapp 2.0.5から動作が変わったという話

Hyperapp 2.0.4では正常に動作していたのに、2.0.5以上にあげたら動かなくなったという報告が上がっている。

https://github.com/jorgebucaran/hyperapp/issues/966

私の所でも、見事に動かなくなった。どうやら、仕様が変わったようだ。せめて2.1.0とかにしてくれれば良いのに…。

ということで、私が気付いた変更点をあげてみる。

* テキストノードを作成のための`text()`関数が追加された。テキストノードは文字列"hoge"ではなく`text("hoge")`というように記述する必要がある。
* `Lazy()`は`memo()`と名前が変更された。(動作が変わったどうかまでは未確認)
* DOM以外のVODMは`h()`関数を経由せずに直接関数として呼び出すようになった。
* `h()`関数において第四引数以降が無視されるようになった。子ノードが複数ある場合は配列にする必要がある。
* `app()`の`subscriptions`に指定する関数は、subscriptionsの配列を返す必要がある。subsciptions自体は`[sub, props]`という配列であるため、二重配列ということになる。
* ノードのonイベントに渡すのは`[action, props]`または`(node, evente) => [action, props]`になったっぽい。イベントオブジェクトをアクションに渡したいときは`(_, e) => [Action, {value: e.target.value)]`みたいな書き方が必要。

もしかしたら、他にもあるかも知れない(Effect周りはまだ未確認)。Reactとの互換性が崩れたため、JSX表記ですっきり書けるようにはならなくなったと思われる。

詳しくは下記のリファレンスを参照して欲しい。

https://github.com/jorgebucaran/hyperapp/blob/master/docs/reference.md

---

全体的にはよりシンプル、かつ、明確な仕様に立ったような気がする。個人的にはHyperappはお勧めなのだが、使っている人はあまりいないようなのよね。hyperappの使い方講座とか書きたいな…。
PWAアプリを個人開発したけどマネタイズで詰みそうな話

## 概要

PWAって良いですよね。
スマホでもPCでもタブレットでも関係なく同じUIで利用できて。

最近自分は本格的に起業まで視野に入れたサービス開発に取り組んでいて、
昨今はPC用のWebサービスを提供せずにスマホアプリのみ提供しているアプリも多いですが、
技術的にPWAの制約に引っかからないような内容のアプリであればスマホアプリとWebサービスを
両方開発するより一度で作れる方が合理的だと思ったのでPWAとして開発をはじめました。


## ぶつかった壁

問題にぶつかりました。
APS、つまりはGoogle Adsenseを始めとした広告ネットワークサービスの審査に落ちまくるのです。
審査がなく利用可能、もしくは通過するASPもありましたが、配信内容がアダルト寄りだったり
単価がかなり低めだったりとマネタイズを目指す当たってかなりの障害になりそうでした。


私の作ったサービスは決して不健全だったり賭博や飲酒に関わるものではありません。
審査の落ちる理由として一番の理由は「コンテンツの価値がない」というものです。

ファーストビューの要素を増やしたり機能を増やしたりして何度か再申請してみたが結果は変わらず。。。

このときになってようやくAdsense等の言っている『価値のあるコンテンツ』とは
『ぱっと見一定以上の文字数で埋まっているサイト』であって、
決して『使い勝手のいいアプリケーション』のことではないのだと私は気づきました。



例えばQiitaやニュースサイトのような文字が中心として構成されたWebサービスのPWAなら多分問題ないですが、
私が作っていたのは機能としてはそれなりに多いですが文字が少なく数ページで完結するような
ブラウザゲームやメモ帳のような本当にスマホアプリらしいアプリでした。
このようなサービスの場合多くの広告サービス(というか主にはAdsense）の審査を通過することが難しいようです。


海外サイトなどで検索すると自分と同じような壁にぶつかっている人も見つけました。
PWAで配信するゲームはマネタイズに向かないので企業としては扱わない、と明言しているITエンジニアの方もいました。


同じ仕様でもネイティブアプリとして配信すればアプリ向け広告は多くのASPで別途提供されているので、
多分そちらで申請を出せば審査基準も変わってくるので恐らく通るのですが、
残念なことにPWAではネイティブやハイブリッドアプリ向けの広告を載せることができません。
これは技術的な問題で、TWAでも同様のようです。



## 対策

とりあえずは審査に通過した低単価なASPで食いつなぎながら
一定規模以上のPV数があれば審査が優しくなるというのも聞いたので
コンテンツを拡充してサービスとして成長させつつどこかのASPかSSPが拾ってくれるのを待つか、

APIは使い回せるのでそこは流用しつつネイティブアプリとして全く同じ仕様のアプリを開発して
高単価なアプリ向け広告はそっちに貼るというめちゃくちゃ非合理的な作業を多分やることになりそうです。。うーん。。。


## 所感

PWAが未だにぱっとしない理由ってこういう背景が少なからずありそうですね。
世に溢れるいかがでしたかブログですらマネタイズできてるものも多いのに
ITエンジニアが人生削って作った渾身のアプリがこんなにマネタイズで頭悩ませられなきゃいけないってなんか歪だなぁって思いました。
GoogleもPWA推してるなら時代遅れな審査基準変えてくれよと。。。


この辺ってどうしたもんですかねぇ……
もし「こうやったら良いと思う」とか「ここのサービスはおすすめだよ！」みたいな話があればコメント頂ければ凄く助かります。


コメントでもいただきましたが結局ガワネイティブしか選択肢はなさそうな気が……
PowerAutomate Selection を使用する時の 日付の引用

#PowerAutomate でWord Template を使ってExcelのリストをPDF化する
主題そのまま、Excel である受講生の出席簿リストから受講生毎に1シートとしてPDFで発行する。
Power Automate を使う理由は、PowerAppsからのトリガーにて受講生本人に作成させたいのと、電子印を押させたいから。
##全体Flow
こういうFlowを組んだ↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/dfa5bef0-587b-5aed-d987-a5c8e71c8f78.png)
この時に、配列として複数行のデータを引用する必要があるが、Select（選択）アクションを使って↓↓この様に引用する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/2030346c-0107-9ee2-12eb-a9380e8d194f.png)
この場合、「Date」 に引用されたデータはExcel内部では日付形式(yyyy-MM-dd) であるが、PowerAutomate で引用されるとシリアル番号形式になってしまう。
##日付をシリアル番号から日付形式に直す
結論から言うと↓↓こう書く

```
formatDateTime(addDays('1899-12-31',int(item()?['11_Date of Study'])),'yyyy-MM-dd')
```

|式|説明|
|:--------------|:--------------|
|formatDateTime|日付の形式を変更。'yyyy-MM-dd' で2020-07-27 の様に表記|
|addDays|基準日（エクセルの場合1900-1-1が最初の日(= 1)なので、1899-12-31）にシリアル番号を足していく|
|int|文字列シリアル番号を数字に変換する|
|item|今回ハマった。Select アクションの中なので bodyでもなく、valueでもなく、***item()? で列名を指定して引用する***|

ちなみに、時刻は HH: mm: ss と表記されてしまうので、「秒」が不要な場合は同様に formatDateTime()を使用して HH:mm に変更する。
##Word Template を使うには
***[Microsoft Power Automate Tutorial - Microsoft Word Connector Pt. 2](https://youtu.be/VYs-SnflUpQ)*** (https://youtu.be/VYs-SnflUpQ)
↑↑　この動画を観るのが分かりやすい。
linuxでvscodeの更新

linuxではvscodeの自動更新はないっぽい
macならできるのに。。。

更新の方法がわからず使っていたら、Goのエクステンションがうまく動かなくなって、更新したら動作した事象を確認

amazon linuxを使用した場合のコマンドに関して記述

## コマンド
ripository登録済みの場合は3つ目のコマンドからでOK

```
$ sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
$ sudo sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo'
$ yum check-update
$ sudo yum install code
$ code .
```

## 参考
- CentOS7 Visual Studio Code をインストール / アップデートする
    - http://sh-yoshida.hatenablog.com/entry/2016/09/26/120000
- Visual Studio Code on Linux
    - https://code.visualstudio.com/docs/setup/linux#_updates
S3 アクセスを特定IPアドレスのみに制限する

アクセス権限→バケットポリシーに以下を設定。※アクションは用途に合わせて変更してください

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AccessControl-From-IPaddress-001",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "s3:GetObjectVersion",
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::{バケットネーム}/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "{IPアドレス}"
                    ]
                }
            }
        }
    ]
}
```
JS初心者がKintoneカスタマイズ行うために プラグイン編

###こんばんみ。「りょうちん」です。今日初めて在宅ワークを経験しました。家の隣工事でめっちゃうるさかったけど。笑

#####今日からKintoneのプラグイン作成の課題に入りました！むずい！！
というのも、初めは何が出来るのか分からずJavaScriptカスタマイズと比べて何のメリットがあるの？状態でした。
今日調べてて分かったことは、

####プラグインは汎用的な機能を追加したい時、同じ機能を色んなアプリに追加したい時、に使うと良さそうです。
そしてプラグインの製作には、初心者の方はKintoneに用意されている「create-plugin」というツールを使うのがおすすめです！
プラグイン製作のための型を用意してくれますし、何より「自動パッケージング & 自動アップロード」で随時デバックを行いながら開発出来るのが扱いやすいです。
残念ながら本日はプラグインの概略を把握するのに殆どの時間を費やしてしまいました...
明日は実際に開発を進めて学んだことをアウトプットしたいと思います！
gawk で NFに入る最大値を調べてみた。


# きっかけ
以前、以下のようなファイルを、

```text:sample.txt
1 2 3 4 5 6 7 8 9
```

以下のように3桁づつ改行を入れたくなるときがあり、

```text
1 2 3
4 5 6
7 8 9
```

以下のような、awkスクリプトを書きました。

```awk
{
    for(i=1; i<=NF; i++) {
        printf "%d ", $i;
        if((i % 3) == 0) print "";
    }
}
```

「あれ、これって入力ファイルがいくつまで対応できるのでしょう？」とふと思いました。
こんなファイルでも大丈夫なのかなと。。。

```text:sample.txt
1 2 3 4 5 6 7 8 9 ... /* このあと大量に数字がつづく*/ .... 9999999999999999999
```

# 調査(ドキュメント)

ドキュメントの NF の記載になにか書かれているかも。

https://www.gnu.org/software/gawk/manual/gawk.html#index-NF-variable

> NF is a predefined variable whose value is the number of fields in the current record. awk automatically updates the value of NF each time it reads a record. No matter how many fields there are, the last field in a record can be represented by \$NF. So, \$NF is the same as \$7, which is ‘example.’. If you try to reference a field beyond the last one (such as $8 when the record has only seven fields), you get the empty string. (If used in a numeric operation, you get zero.)

「NFに入る最大値は・・・」みたいな記載を期待したが、特になし。

# 調査(ググる)

ここに、気になる記述が。

https://stackoverflow.com/questions/8857866/printing-long-integers-in-awk#comment11152277_8858003

> Correct. According to info gawk: "The internal representation of all numbers, including integers, uses double-precision floating-point numbers. On most modern systems, these are in IEEE 754 standard format."

たしかに、ドキュメントにも記載がある。

https://www.gnu.org/software/gawk/manual/html_node/Scalar-Constants.html#DOCF30

# ということで、最大どこまで？

ヒントになりそうなページがあった。

https://kumikomiya.com/mastering-float/

気が向いたら、もう少し調べる。

# 追記(2020/08/04)

[ときどきの雑記帖 Re*](http://www.kt.rim.or.jp/~kbk/zakkicho/post/2020/07/31/test-2007-3/) にてコメントをいただけていた。
ありがとうございます。

> 実はマニュアル The GNU Awk User's Guide にこの辺の制限は明記されている (バージョン5になるまではマニュアルではなくソースアーカイブ中のLIMITATIONSというファイルに記載)。

ホントだ。(気づかなかった:sweat:)
https://www.gnu.org/software/gawk/manual/gawk.html#Implementation-Limitations
深層学習でdepthを求める1例を実行してみた


## 参照したリポジトリ
https://github.com/iro-cp/FCRN-DepthPrediction

## 実行した動作環境
Ubuntu 16

python 3.7

動作に利用したライブラリの状況

```
absl-py==0.9.0
astor==0.8.1
cycler==0.10.0
gast==0.3.3
google-pasta==0.2.0
grpcio==1.30.0
h5py==2.10.0
importlib-metadata==1.7.0
Keras-Applications==1.0.8
Keras-Preprocessing==1.1.2
kiwisolver==1.2.0
Markdown==3.2.2
matplotlib==3.3.0
numpy==1.19.1
Pillow==7.2.0
protobuf==3.12.2
pyparsing==2.4.7
python-dateutil==2.8.1
six==1.15.0
tensorboard==1.14.0
tensorflow==1.14.0
tensorflow-estimator==1.14.0
termcolor==1.1.0
Werkzeug==1.0.1
wrapt==1.12.1
zipp==3.1.0
```

## 補足
上記のリポジトリは tensorflow　ver1を利用しており, tensorflow  ver2では動作しなかった。

そのため venv を用いて環境を設定し、動作させた。

```
$ python -m venv .venv_tf1
としてこれから構築する環境を準備する。

$ source .venv_tf1/bin/activate
を実行して、venv 環境下のpythonを起動させる。

$ pip install tensorflow==1.14.0
として、tensorflow のver1の版をインストールする。

モデルファイルをダウンロードし、所定の場所に置く。

サンプルスクリプトを実行し、ライブラリが不足していることが判明したら、
そのつど、pip でインストールする。


```

関連情報

[OpenCVのDNNモジュールで深度推定してみる](https://qiita.com/UnaNancyOwen/items/b2954f05af714e779466)
【Googleスプレッド】あるセルに任意の文字列が何個存在しているかカウント

```
( LEN(対象セル) - LEN( SUBSTITUTE(対象セル,文字列,"") ) ) / LEN(文字列)
```

## 理屈

LEN = 指定文字列の長さ

SUBSTITUTE = 第1引数：検索対象。第2引数：検索文字列。第3引数：置換文字列

カウントしたい任意の文字列を空白に置換することで、その分の文字数が削除される。  
そのため、「元の文字列長 - 置換後の文字列長」で何文字分削除されたをチェックすることで、何文字分が検索にヒットしたか？がわかる。  
ただ、このままだと"何文字分ヒットしたか"なので、結果を文字数で割ることで検索文字列が何回分ヒットしたか？を算出する

## まとめ
古典的なテクニックだけど使わないと忘れるのでメモ
アウトプット

# railsのアウトプット
## コントローラーのアクション
- index :一覧ページを表示をする
- new :新規投稿ページを表示する
- create :データ投稿を行う
- show :個別詳細ページを表示する
- edit : 編集ページを表示する
- update :データ編集を行う
- destroy :データを削除する
Microsoft Teamsでの分報(導入例)

分報を導入してみて、1っか月ほどたったので内容など、
投稿練習も兼ねてどうだったかを備忘録として記載する。(何かあれば更新予定)

#目次
1. 背景
2. 内容
3. 導入してみてどうだったか
4. メリット
5. デメリット

#1.背景
私の仕事場では、webアプリケーションの保守運用を行っており、
5人程度のメンバー1人1人が複数の案件を並行してうけもっている。
1つの業務は、数分～数時間で終わる業務がほとんどであり、1日に数多くの業務を行っている。
例えば、1日の間に午前中は仕様書を書いて、急遽、他案件の問い合わせ対応をして、
午後に2時間テスト行って、終わり次第他案件の見積もりを行う感じである。

新規に参画した方の業務の進捗が良くなく、業務に時間がかかりすぎている
というのが話に上がり、対策をとることとなった。
ヒアリングをしてみると、総じて相談がしづらいといのがあり、
相談の準備や確認相手の確認に時間がかかっていそうであった。

その方にも対策をしてもらっているが、そもそも相談しづらい部分は、
チーム全体で取り組んでいく必要があると考え**分報**というの導入してみることとした。
※Microsoft Teams（以下、Teams）のトークの使用状況は必要最低限の業務連絡で使う程度である
#2.内容
**分報**には様々やり方はあるようだが、随時メンバーのなどにもヒアリングしながら運用方法を作成していった。
##狙い
・Teamsを使い、話やすい（情報を発信しやすい）環境を作る
※もともとTeams を仕事場で使用していたため、Teamsを使った
##運用方法
※「流す」＝報告を送信
・Teamsにて専用のトークを作成しメンバーが流す（参加者はメンバーと上長）
・フォーマットを使用
・流すタイミングは人ごとに変えている（原則、30分毎に1回or作業の開始時終了時）
・打ち合わせや時間のかかる作業を行う場合は、事前に連絡すれば間隔はのばしてOK
・1分弱で書く、記載に悩まない、記載に悩むなら記載に悩んでると書く
・運用方法は随時変更する

＝＝＝＝＝フォーマット＝＝＝＝＝＝＝＝＝＝＝＝
■＜作業内容＞
＜だいたいの進捗＞％：＜コメント＞
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝


＝＝「＜だいたいの進捗＞％：＜コメント＞」部分の例＝＝＝＝＝＝＝＝
80%：これから2時間集中
70%：××わかるようになった
70%：△△、これ使える
30%：打ち合わせのため次は1時間後
10%：〇〇作業中、順調
20%：割り込み作業○○対応中
50%：●●苦戦中
50%：〇〇あまり進んでないです。。。
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
#3. 導入してみてどうだったか
1か月やってみて、**分報**を導入した価値はあったというのが私の感想です。
導入した狙いであった`Teamsを使い、話やすい（情報を発信しやすい）環境を作る`という部分は
少しづつでも根付いてきているというのもあるが、下記のようなこともあった

・上長が必要な時に分報を見ることでメンバーの状況が把握できる
・誰が何の作業をやっているのか見えるため、優先してやってほいいことを言える
・そもそも分報が出てない＝何か問題があるというアラート代わりになる
・分報を出すことにより自らの作業状況の確認となっている

#4. メリット
 `3. 導入してみてどうだったか`に書いたので割愛

#5. デメリット
デメリットがあれば随時運用方法を変更しているため、現状はないが、
どうしても工数はかかるため下記デメリットがある。
・分報を流す時間がかかる（一日15分程度）
GCPで使用可能なGPU

TensorFlow (GPU)のビルドは時間がかかるため、できる限りCPUを積んで並列処理したい。
しかし、ビルドするには何らかのGPUを接続している必要があるようだ。
ところが、GPUを搭載すると、1個あたりのGPUに対して、積めるCPUの個数に制限がかかってしまう。
そのため、できるだけ安く、搭載可能なCPUの数が多いGPUを選びたい。

以下に、GCPにて利用可能なすべてのGPUと、その料金、CPU個数制限等を列挙する。
TensorFlow (GPU)ビルド時に指定するCompute Capabilityも明記した。
なお、料金はus-central1リージョンにおけるものである。

|GPU|料金|CPU個数制限|Compute Capability|
|---|---|---|---|
|Tesla T4|$0.35/時間|24|7.5|
|Tesla V100|$2.5/時間|12|7.0|
|Tesla P100|$1.5/時間|16|6.0|
|Tesla P4|$0.61/時間|24|6.1|
|Tesla K80|$0.46/時間|8|3.7|

上表より、TensorFlow (GPU)をビルドする場合は、
「Tesla T4 &times; 4, CPU &times; 72」（メモリ等含めトータルで$3.5/時間）
がおすすめである。
なお、「Tesla T4 &times; 3」は選択できない。

## 参考

* https://www.tensorflow.org/install/source?hl=ja
* https://cloud.google.com/compute/docs/gpus?hl=ja
* https://developer.nvidia.com/cuda-gpus
問題集への解答

#C016 文字列の置き換え

|置き換え前|置き換え後|
|:--:|:--:|
|A|4|
|E|3|
|G|6|
|I|1|
|O|0|
|S|5|
|Z|2|

```php5
    $input_line = fgets(STDIN);
    $array=array(
        "A"=>	4,
        "E"=>	3,
        "G"=>	6,
        "I"=>	1,
        "O"=>	0,
        "S"=>	5,
        "Z"=>	2  
        );
    
    $newword=$input_line;
    for ($i = 0; $i < strlen($input_line); $i++) {
        foreach ($array as $key=>$value) {
            if($newword[$i]==$key){
                $newword[$i]=$value;
            }
        }
    }
    echo $newword."\n";

```

#C019
```php5
<?php
$count=(int)fgets(STDIN);
for ($i=0; $i <$count ; $i++) {
    print res((int)fgets(STDIN));
}
function res($num)
{
    $sum=0;

    for ($i=1; $i <$num ; $i++) {
        if ($num%$i==0) {
            $sum+=$i;
        }
    }
    switch ($sum) {
      case $num:
      print "perfect\n";
      break;
      case abs($num-1):
      print "nearly\n";
      break;

      default:
      print "neither\n";
      break;
    }
}

```
#C024
```php5
<?php

function toArray($input){
  $s=explode(' ',trim($input));
  return $s;
}

$n=(int)fgets(STDIN);
$x1=0;
$x2=0;
for ($i=0; $i <$n ; $i++) {
  $query=toArray(fgets(STDIN));
  switch ($query[0]) {
    case 'SET':
      if($query[1]==1){
        $x1=$query[2];
      }else {
        $x2=$query[2];
      }
      break;
      case 'ADD':
        $x2=$x1+$query[1];
        break;
        case 'SUB':
          $x2=$x1-$query[1];
          break;
  }
}
print $x1.' '.$x2."\n";
```
#C034
```php5
<?php
function toArray($input){
  $input=trim($input);
  return explode(' ',$input);
}
// $input='3 + 1 = x';
// $nums=toArray(fgets(STDIN));
$input=toArray(fgets(STDIN));


$x=array_search('x', $input );
$i=1;
if($input[1]=='-')  $i=-1;



switch ($x) {
  case 0:
    $x=$input[4]-$input[1]*$i;
    break;
    case 2:
      $x=$input[4]*$i-$input[0]*$i;
      break;
      case 4:
        $x=$input[0]+$input[2]*$i;
        break;
        
      
}
print $x;
```

#C035
```php5
<?php
function toArray($input){
  $input=trim($input);
  return explode(' ',$input);
}
// $input='3 + 1 = x';
// $nums=toArray(fgets(STDIN));
$count=0;
$n=fgets(STDIN);
for ($i=0; $i <$n ; $i++) {
  $res=[];
  $s=explode(" ",trim(fgets(STDIN)));
  $key=$s[0];
  unset($s[0]);
  $res[$key]=$s;
  
  
  $num=0;
  if(array_sum($res[$key])>=350){
    // print_r($res);
    
    if($key=='l')$num=2;
      $sum=$res[$key][2+$num]+$res[$key][3+$num];  
      if($sum>=160){
        $count++;
        // print "\n\n\n\n".($i+1)."\n";
      }
  }
}
print $count."\n";
```

#C043
```php5
<?php
$n=(int)fgets(STDIN);

$array=toArray(fgets(STDIN));

$array=array_count_values($array);




  foreach ($array as $key=>$value) {
    if(max($array)==$value){
      $res[]=$key;
    }
  }
  
  for ($i=0; $i <count($res) ; $i++) {
    print $res[$i];
    if(count($res)-$i==1){
      print "\n";
    }else{
      print " ";
    }
  }



function toArray($input){

  $s=explode(' ',trim($input));
  return $s;
}
```
pygameを使ったインタラクティブな手書き文字認識アプリ

#初めに
pygameを用いてDNNによる簡単な手書き文字認識アプリを作ってみたので軽く解説していきます。
pygameを使ってpythonだけで簡単にインタラクションのあるアプリを簡単に開発できるので、これからpythonを勉強していく人や初心者の方のモチベーションになれば嬉しいです。
コードは全てgithub上に載せています。勝手に使ってもらって大丈夫です。

Github : https://github.com/ozora-ogino/predict-handdrawingNumber_NN

今回の開発では、DNNの構築にTensorflow、ゲーム開発でpygameを使っています。
また、DNNの学習のためにmnistデータセットを使用しています。

#Pygameとは
Pygameは、Pythonで2Dゲームを制作する際の最も有名なゲームライブラリです。
Pythonで2Dゲームを作るには、ゲームライブラリを使うのが一般的で、簡単なブロック崩しゲームならば160行くらいのソースコードで作成できます。

#使い方
Githubにも載せていますが、こちらで改めて説明します。

最初に、リポジトリをクローンしていただきます。

```bash
git clone https://github.com/ozora-ogino/predict-handdrawingNumber_NN/ 
```

requirements.txtから必要なパッケージをインストールします。

```bash
pip install -r requirements.txt
```

draw.pyがメインになります。
すでに学習済みのモデルを用意しているので実行していだだければ機能します。

```bash
python draw.py
```

改めてモデルを学習したい際はcreateModel.pyでモデルを作り直してください。

```bash
python createMain.py
```

モデルの定義はmodel.pyの中の関!
数で行なっているので変更してもらえればお好きなようにNNで実行できます。

[github](https://github.com/ozora-ogino/predict-handdrawingNumber_NN) に実行結果のスクリーンショットを載せています。

実行していただくと、数字を描くための酢sクリーンが表示されます。
数字を描いていただいて、Enterを押していただくと文字の認識を行い、予測結果をterminal上に表示します。
終了の際にはスクリーン閉じてください。

#終わりに
今回はpygaemを用いて簡単な手書き文字認識アプリを作ってみました。
この程度のアプリなら簡単に作れますのでぜひアレンジしたりして試してみてください。
今回の記事はpython初学者の方やpygameでどんなことができるのか知りたい方むけに作ってみました。
誰かの手助けになれば幸いです。

[instagram](https://www.instagram.com/ogino_mup/)でpythonやプログラミング、エンジニアとして必要な情報の配信を始めたのでフォローしてもらえると嬉しいです。！
Ruby Error[Your Ruby version is 2.6.3, but your Gemfile specified 2.6.5] とでた時



ユーザー認証機能を実装中サーバーを再起動した時にそれは起きました。

```
Ruby Error[Your Ruby version is 2.6.3, but your Gemfile specified 2.6.5]
```
本来であればruby 2.6.5のはずなのに。。なにもいじっていないのに。。環境設定の画面を確認します。

```
%less ~/.zshrc
```

Linuxコマンドlessでファイルの中身を確認することができます。

```
export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"
export BASIC_AUTH_USER='admin'
export BASIC_AUTH_PASSWORD='2222'
```

どうやら環境変数を定義した際にrvenvの設定を変えてたみたいです。

```
eval "$(rbenv init -)"
export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"
export BASIC_AUTH_USER='****'
export BASIC_AUTH_PASSWORD='****'
```

設定を変えて更新したいと思います。

```
% source ~/.zshrc
```

```
 % ruby -v
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-darwin19]
```

無事元に戻りました。Macでは元々rubyの環境が元々インストールされているみたいで環境を変えたことによりそっちの方が適応されてたみたいですね。
vscodeでエディタ,ターミナル,エクスプローラー間の移動

```
[
{
    "key": "ctrl+`",
    "command": "workbench.action.terminal.focus"
},
{
    "key": "ctrl+`",
    "command": "workbench.action.focusActiveEditorGroup",
    "when": "terminalFocus"
},
{
    "key": "ctrl+j",
    "command": "workbench.action.focusActiveEditorGroup",
    "when": "filesExplorerFocus"
},
{
    "key": "ctrl+j",
    "command": "workbench.action.focusSideBar",
    "when": "editorTextFocus"
},
]
```

Ctrl+shift+@でターミナル、エディタ間の移動
Ctrl+jでエクスプローラー、エディタ間の移動

参考
https://qiita.com/m1ul24/items/c0a53885b893f121082f
初心者のためのseaborn基礎②ヒストグラム（distplot）

#seabornとは
Pythonのグラフ描画のためのライブラリです。。最も有名なライブラであるmatplotlibのラッパー関数(内包プログラム)という位置づけ。簡単に見た目綺麗なグラフの描画が出来る他、一括での処理などの機能もある程度充実しています。細かく指定して描画するならmatplotlib、簡単に綺麗にならseabornのです。

#ヒストグラム（distplot）
今回のテーマはヒストグラムです。ヒストグラム作成には`distplot`を使用します。見た目やパラメータの違いは｢matplotlib｣を用いた下記の記事と比較してみて下さい。
★[初心者のためのpandas基礎matplotlibでヒストグラム作成](https://qiita.com/Yanagawa_Yoshihisa/items/0bde331e5d41e2c28fe6)

#準備
まずは、pipで`seaborn`のライブラリをインストールして下さい。pip?って方は[こちら]('https://qiita.com/Yanagawa_Yoshihisa/items/35e6f70a8411277282ce')。

ライブラリをインポートします。`seaborn`に`sns`という名前をつけて`import`します。

```python:
import seaborn as sns
```
サンプルはタイタニックのデータで試してみます。タイタニックがわからない人は｢kaggle タイタニック｣で調べて下さい。
pandasでデータフレームを作ります。

```python:
dataframe = pd.read_csv('train.csv')
```

#基本作成
ヒストグラム作成には`distplot`を使用します。例としてAge(年齢)別のヒストグラムを作成します。
 `kde`では、密度近似関数の描画の有無をしています。難しいので呪文のように設定して下さい。
`rug`をTrueにするとY軸の総計が1になるように正規化されます。難しいので呪文のように設定して下さい。

```python:
sns.distplot(dataframe['Age'],kde=False, rug=False)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/b35905e5-4ce0-68e0-2720-e064f1e0bd16.png)

#binsの設定
`bins`を用いて棒の数を設定します。例として10を設定します。

```python:
sns.distplot(dataframe['Age'],bins = 10,kde=False, rug=False)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/d3775b6b-794c-cc0a-f7fc-dbdc8893259b.png)

binsの数はいくつがいいの？って疑問を感じ際は、スタージェスの公式というのを調べて下さい。

#(応用)複数を重ねる
あまり用途はないかも知れませんが、重ねるには、2回構文を書くだけです。Sex(性別)で分けてみましょう。
前準備としてデータを分けます。

```python:
malelist_m = dataframe['Sex'] == 'male'
malelist_f = dataframe['Sex'] == 'female'
```
連続で構文を書きます。

```python:
sns.distplot(dataframe[malelist_m]['Age'],bins = 10,kde=False, rug=False )
sns.distplot(dataframe[malelist_f]['Age'],bins = 10,kde=False, rug=False )
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/1fe5fee6-d8e3-7b48-ec47-d31c0b662e2e.png)
ラベル等を使いたい場合は｢matplotlib｣の機能を使う必要があります。
以上です。

#最後に
初心者にもわかるように、Pythonで機械学習を実施する際の必要な知識を簡便に記事としてまとめております。
目次は[こちら](https://qiita.com/Yanagawa_Yoshihisa/items/a3fa521d89c471b3e71f)になりますので、他の記事も参考にして頂けると幸いです。
プログラミング初心者がUnityでゲームをつくってみる　その（2）

みなさんこんばんは。お母さんです。
昨日から少しずつUnityの勉強を進めています。

『Unityふりがなプログラミング』というKids向けの本を参考に進めています。

起動中・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296644/9f500767-b267-539f-70dc-f831174c323c.png)

起動しました。
画面のレイアウトを変えていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296644/c06f4adc-3961-a006-6c55-1f60c4f0f376.png)

「Layout」→「2by3」をクリックして、編集用の画面と、カメラから見た画面の2つの視点が分かるレイアウトになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296644/6fa974a8-5da0-eb70-9cae-eef4b6421f2d.png)

昨日の続きで、オブジェクトを作成していきます。
「Hierarchy」ウィンドウの「3Dオブジェクト」→「cube」を選択すると、四角い小さな箱ができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296644/057de0c9-9a2a-9274-209a-92fadfddb500.png)

赤と緑と青の矢印が、それぞれX軸、Y軸、Z軸となっているようです。

次に、このオブジェクトを動かしたり、大きくしたりします。
左上のツールバーの「MoveTool」をクリックすると、矢印をドラックして好きな方向に動かすことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296644/952bda72-6c8b-fd2b-4903-496da15ae708.png)

その二つとなりの「ScaleTool」をクリックして、出ている□の矢印をドラッグして好きな大きさに変えることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296644/11c760eb-f1e7-b58d-2b36-04777164106b.png)

右の「Inspector」ウィンドウの「Transform」で、値を入力して形を作ることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296644/9849f3c4-f833-1a6c-663e-41bece344855.png)

形ができたので、このオブジェクトを「Cube」から「Ground」と名前を変えてておきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296644/2f7f26f7-e564-90d8-c5b8-79c6e846603c.png)

次に、「Ground」に色を塗ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296644/0f663043-6b96-1417-610a-ecaf6d1d7f8f.png)
「Project」ウィンドウから、「create」→「material」とすすみます。
「Project」ウィンドウに、「Newmaterial」が表示されるので、「Gcolor」と名前を変えておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296644/ed68ec4b-38b4-2d32-e290-7711e90b584d.png)

次に、「Gcolor」をクリックすると、inspectorウィンドウに、「Albed」というところがあるので、
その左側の□をクリック。カラーウィンドウが出てくるので、好きな色を選びます。
すると、「Material」の「Gcolor」の色が選んだ色に変わります。

ここで、「Gcolor」を「Hierarchy」の「Ground」にドラッグ＆ドロップすると、「Ground」の色が変わります！しばふの生えたグラウンドって感じ＾＾
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296644/5aaf3d55-c404-f151-2107-25b8564bd0c1.png)

今日は、これでおしまい。
Lenovo P340 Tiny 購入ガイド


Lenovoのワークステーション P340 Tinyを購入したので購入ガイド的なメモ。

# 構成

下記構成で￥238,700(税込)。
22時から利用できるクーポンを適用して-￥88,319され、合計は￥150,381(税込)。

```
プロセッサー : インテル Core i7-10700T プロセッサー (2.00GHz, 16MB)
初期導入OS : Windows 10 Home 64bit
導入OS言語 : Windows 10 Home 64bit - 日本語版/英語版選択可能
フォームファクター : Tiny
メモリ : 8GB PC4-23400 SODIMM
グラフィックカード : NVIDIA Quadro P1000 4GB (Mini DisplayPort x 4)
1st ハード・ドライブ : 256GB ソリッドステートドライブ (M.2 2280, PCIe-NVMe) OPAL対応
イーサーネット : 内蔵ギガビットイーサネット
無線LANアダプター : インテル Wi-Fi 6 AX201 + Bluetooth
Power Adapter : 230W ACアダプター
スピーカー : 内部スピーカー
Publications Pack : 日本語
標準保証 : 3年間 オンサイト修理
```

# ポイント

- CPUまたはグラフィックカードを上位に変更した場合はPower Adapterを230W ACアダプターに変更する
- キーボード/マウスを除外、ツールレスオープンシャーシも除外
- Core i7 モデルだけはOSをProからHomeに変更できるので変更

# 互換パーツ


<dl>
  <dt>メモリ</dt>
  <dd>Crucial PC4-25600 (DDR4-3200)260pin SODIMM 8GB CT8G4SFS832A </dd>
  
  <dt>DPケーブル</dt>
  <dd>Cable Matters Mini DisplayPort DisplayPort 変換ケーブル 8K 双方向 1.8m Mini DisplayPort DisplayPort 1.4 ケーブル DisplayPort Mini DisplayPort 1.4 変換ケーブル Thunderbolt 2対応 ブラック</dd>
</dl>


# 追加パーツ

<dl>
  <dt>ThinkCentre Tiny VESA マウントブラケット</dt>
  <dd>ディスプレイの背面に設置する。机の上がスッキリしてとてもよい</dd>
</dl>

# 所感
- ゲームやっている時以外はすごく静か
- ゲームやりはじめるとグラフィックカード向けにファンが全開で回り始めるので結構うるさい

# Thunderbolt + eGPU 構成

P340には5C50W00872というThunderboltポートを追加するパーツがあるので、これを取り付けてeGPU構成にしても良いかと思う。
https://support.lenovo.com/jp/ja/partslookup

# Document

https://psref.lenovo.com/syspool/Sys/PDF/ThinkStation/ThinkStation_P340_Tiny/ThinkStation_P340_Tiny_Spec.PDF

# 運用
## Windows10
Windows10の対応状況は次のページで確認できる。
https://pcsupport.lenovo.com/us/ja/products/workstations/thinkstation-p-series-workstations/thinkstation-p340-tiny

https://pcsupport.lenovo.com/us/ja/products/workstations/thinkstation-p-series-workstations/thinkstation-p340-tiny/solutions/windows-support

P340が対応している最新バージョンはWindows 10 20H2
[Windows 10 20H2で検証済みのLenovo デバイス一覧](https://support.lenovo.com/us/ja/solutions/HT511260)

## SoftwareUpdate
M2WKT36AのBIOSアップデートが来てた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576356/6dd951b9-b77e-234a-94ce-d82f381e0928.png)

リリースノートを確認したらBugfixらしい。

```
CHANGES for M2WKT36A
  - Fix some BIOS flash issue.
```


リリースノートを確認するにはドライバをダウンロードして、インストーラーを展開モードで実行して中に入っている```changes.txt```を確認する。

https://support.lenovo.com/jp/ja/downloads/ds544121/
Xcodeショートカットまとめ

#コード編集
| ショートカットキー     | 結果               |
|:-----------------|------------------:|
| Ctrl + I           |            インデント整理 |
| Cmd + /           |            コメントアウト |
| Cmd + Click（※）           |            定義へ移動 |
| Cmd + Shift + J | 表示しているファイルに移動 |
| Opt + Click           |            Quick Help（リファレンス） |
| Cmd + Ctr + E           |            ファイル内変数のRename |
| Cmd + Ctr + ←             |              ジャンプ前のコードに戻る |
| Cmd + Ctr + →             |              進む（上記の逆） |
| Opt + ←          |            左の単語にカーソル移動 |
| Opt + →          |            右の単語にカーソル移動 |
|Cmd + [           | インデントを下げる |
|Cmd + ]           | インデントを上げる |
| Cmd + ← | カーソルを行頭へ移動 |
| Cmd + → | カーソルを行末へ移動 |
| Ctrl + D | 右の1文字削除 |

※Cmd + Click で Jump to Definition を押せば、定義元に移動できます。
これが面倒な方は、上部メニュー Xcode > Preferences > Navigation > Command-clock on Coder を Jump to Definition に変更すれば、Cmd + Click するだけで、定義元に移動できます。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590610/565d5563-f969-a2c7-4979-b169cda05cab.png">


#検索
| ショートカットキー     | 結果               |
|:-----------------|------------------:|
| Cmd + Shift + O             |              プロジェクト内検索 |
| Cmd + F           |            ファイル内検索 |


#ウィンドウ・エリア
| ショートカットキー     | 結果               |
|:-----------------|------------------:|
| Cmd + 0           |            ナビゲートエリア表示|
| Cmd + Opt + 0           |            ユーティリティーエリア表示 |
| Cmd + Shift + y           |            デバッグエリア表示 |
|Cmd + Opt + Ctr + Return|アシスタントエディタ表示/非表示|


#実行・ビルド・デバッグ
| ショートカットキー     | 結果               |
|:-----------------|------------------:|
| Cmd + R           |            実行 |
| Cmd + B           |            ビルド |
| Cmd + Shift + K           |            クリーンビルド |
| Cmd + .           |            停止 |
| Cmd + \           |           　ブレイクポイント設定/解除 |
| Cmd + Ctr + Y             |              ブレイクポイントで止まった処理をコンテニュー |
| F6 | ステップオーバー |
| F7 | ステップイン |


#シミュレータ
| ショートカットキー     | 結果               |
|:-----------------|------------------:|
| Cmd + Shift + H             |              ホーム |
| Cmd + L             |              ロック |
|Cmd + ← |反時計回りに回転|
|Cmd + → |時計回りに回転|
|Cmd + Ctr + Z |振る|
|Cmd + K |キーボード表示/非表示|
|Cmd + Shift + K |Macのキーボードから入力|
| Cmd + S             |              スクリーンショット |


#参考記事
[【開発効率アップ↑】Xcodeでよく使うショートカットまとめのまとめと解説](https://qiita.com/snow_richisland/items/0df7764938e59a8572b3)
[Xcodeの基本ショートカットまとめ](https://qiita.com/shikichee/items/348bbdfcf099a8f6d315)
Swiftメソッド内nameを間違えた時の対処方

#Swiftでitemなどをドラック アンド ドロップし,UIパーツとプログラムを関連付けした後nameなど間違った場合の対処方

##例えば
<img width="1440" alt="スクリーンショット 2020-07-27 21.14.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636534/f246e339-837c-8bd5-8097-2ac069dfef33.png">

コード上部にエラーが発生している。
エラー文は　Use of unresolved identifier 'timerSettingPicker'
　　　　　　未解決の識別子 'timerSetting' の使用と言ってます。
現状私が直面してるエラーは、言い方変えればtimerSettingPickerなんて無いですよと言われています。
おかしいと思いPickerと関連付けしたコードを確認しました。
<img width="1440" alt="スクリーンショット 2020-07-27 21.22.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636534/95fa838f-e887-7eba-bf13-6bfa2b49112a.png">

##timerSettingPickerとしたいのに、timeSettingPickerとしてしまっていました。rをつけ忘れてしまった。

###一度関連付けをしてしまったらコードを書き直すだけでは解決できません。
対処方は
①まず、コードを削除します。関連付けを削除@IBOutlet weak var timeSettingPicker: UIPickerView!
の行を全て削除

②<img width="1440" alt="スクリーンショット 2020-07-27 21.33.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636534/e12934e9-e41d-8578-ca8d-7866adb77396.png">
写真のように、黄色の部分（control)にカーソルを合わせ、キーボードでcontrolを押しながらタップすると
図のような画面になります。
その中に、三角の形をした黄色いマーク部分が先ほど関連付けを削除した部分です。
関連付けが無効な場合は黄色の三角マークが出ます。

③後は、×マークをクリックすれば、完全に関連付けを削除できます。

④再度UIパーツをドラックアンドドロップし、name部分を書き換えればエラーは解除されます。

＃＃説明がわかりずらく申し訳ありません。
初心者のためのseaborn基礎①データ件数を集計グラフ化（Countplot）

#seabornとは
Pythonのグラフ描画のためのライブラリです。。最も有名なライブラであるmatplotlibのラッパー関数(内包プログラム)という位置づけ。簡単に見た目綺麗なグラフの描画が出来る他、一括での処理などの機能もある程度充実しています。細かく指定して描画するならmatplotlib、簡単に綺麗にならseabornのです。

#準備
まずは、pipで`seaborn`のライブラリをインストールして下さい。pip?って方は[こちら]('https://qiita.com/Yanagawa_Yoshihisa/items/35e6f70a8411277282ce')。

ライブラリをインポートします。`seaborn`に`sns`という名前をつけて`import`します。

```python:
import seaborn as sns
```
サンプルはタイタニックのデータで試してみます。タイタニックがわからない人は｢kaggle タイタニック｣で調べて下さい。
pandasでデータフレームを作ります。

```python:
dataframe = pd.read_csv('train.csv')
```

##データ件数集計（Countplot）
最も基本的なデータの件数の集計可視化です。これには`Countplot`を使います。基本的にはY軸は件数なので、X軸のみを指定します。
例として、Pclass(部屋の等級)と件数の関係を描画します。X軸`x`に`Pclass`、元データ`data`に`dataframe`を指定します。

```python:
sns.countplot(x="Pclass", data=dataframe)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/c870c9af-e45f-f738-e8fc-dc59f8cdb791.png)
Y軸を指定すると横になります。

```python:
sns.countplot(y="Pclass", data=dataframe)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/6dbbdcc8-fabd-6576-30d1-2a811a64bf39.png)

系列を追加する場合は`hue`を追加します。（例として`hue`にSex（性別）を追加します。）

```python:
sns.countplot(y="Pclass", data=dataframe, hue='Sex')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/9ea40cd2-913f-8bf9-73f1-7c391132db00.png)

その他にも軸の中の順序や色の変更は可能なので、興味があれば調べてみて下さい。
また、ラベルの変更などは、元ラッパー元であるmatplotlibを修正すれば可能ですが、複雑なので省略します。
`Countplot`だとメリットは感じにくいかもしれません。他の`distplot` `pairplot` `jointplot`等の方がメリットを感じられると思います。

#最後に
初心者にもわかるように、Pythonで機械学習を実施する際の必要な知識を簡便に記事としてまとめております。
目次は[こちら](https://qiita.com/Yanagawa_Yoshihisa/items/a3fa521d89c471b3e71f)になりますので、他の記事も参考にして頂けると幸いです。
【Mac】MacのWiFiを設定する

<< [【Mac】MacOSの基本操作を覚える](https://qiita.com/hiroyuki-eguchi-0731/items/99a0d771fda18adac9f0)

# MacOSをインターネットにつなげる

とにもかくにもインターネットにつなげないと何もできないので、さっそく繋げてみます。

## WiFiを設定する

最近はスマホでも同じようなことをよく実施するので、あまり難しさはないですね。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406574/a3867003-bf16-1755-28ff-d997a597e47e.png)のマークを![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406574/56ec30cb-4b69-d676-4b01-a10a9bde36f4.png)のマークにすればよいのですから。

- グレーアウトされているWiFiの扇マークをクリックして周辺にあるWiFiのリストを表示する
- 自分が認識しているSSIDを選択する
- WiFiのパスワード入力画面が表示されるので、パスワードを入力して接続ボタンをクリックする
- 正常に接続ができればグレーアウトされたWiFiの扇マークが着色される

## 接続確認を行う

とりあえずWebページをつなげることで接続確認はできますね。
あれ？Webブラウザどれだっけ・・・？あぁ、Safariか・・・。

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406574/6d58132c-cdbb-02a9-e08d-8f25fe9fcb92.png)

無事、Appleのホームページが表示できることを確認しました。

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406574/46b71116-c3cb-58f0-0d3b-bee3b0fd765b.png)

お疲れ様でした。

---

2020-07-27 初稿
CVAE-GAN: Fine-Grained Image Generation through Asymmetric Training のメモ

Jianmin Bao, Dong Chen, Fang Wen, Houqiang Li, Gang Hua

https://arxiv.org/pdf/1703.10155.pdf

- 2017年の論文 MSR中国
- Conditional VAEとGANを組み合わせてコンディションを入れて画像生成する。

- 図中のC はクラス分類、Dはディスクリミネータ。ざっくりいうと、CVAEの後ろに、GANのディスクリミネータを入れると同時にクラス分類タスクを入れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412142/101fbf4d-5c13-7710-0ef9-7285a4ab6d8b.png)

上の図には書かれていないが、クラス分類にはxそのものも入れているようだ。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412142/b5b79fc8-5efa-ed85-ce0d-007b4dead114.png)

VAE/GANに素直にコンディションを足した、という感じか。
【Swift】スコープについて

##スコープの種類
スコープは以下の２種類に分類することができる
・ ローカルスコープ
・ グローバルスコープ

##ローカルスコープ
`if`や`for`などの制御構文や関数内で定義されるスコープ
制御構文や関数内などで定義された定数・変数はその外部から使用することができない

#### 制御構文の例

```.swift
if true {
    
    // hoge関数内で定数a、変数bを宣言
    let a = 100
    var b = 200
    
}


print(a) // エラー！
print(b) // エラー！
```

上記の様に、制御構文内で定義された（= ローカルスコープ）定数や変数を関数外で使用することはできない

```.swift
if true {
    
    // hoge関数内で定数a、変数bを宣言
    let a = 100
    var b = 200

    print(a) // -> 100
    print(b) // -> 200
}
```
上記の様に、関数内であれば使用することができる

#### 関数の例
```.swift
func hoge() {
    
    // hoge関数内で定数a、変数bを宣言
    let a = 100
    var b = 200
    
}

print(a) // エラー！
print(b) // エラー！
```

上記の様に、関数内で定義された（= ローカルスコープ）定数や変数を関数外で使用することはできない

```.swift
func hoge() {
    
    // hoge関数内で定数a、変数bを宣言
    let a = 100
    var b = 200
    
    print(a)
    print(b)
}

hoge() // -> 100
       //    200
```
上記の様に、関数内であれば使用することができる

##グローバルスコープ
制御構文や関数など、どの範囲にも含まれないスコープ

```.swift
let a = 100
var b = 200

if true {
    print(a) // -> 100
    print(b) // -> 200
}

func hoge() {
    print(a)
    print(b)
}

print(a) // -> 100
print(b) // -> 200
hoge()   // -> 100
         //    200
```
上記の様に、どこからでも使用することができる
どこからでも使用できるグローバルスコープは便利である反面、意図しない変更が生じるリスクがあるので使用する際は注意が必要