OmniAICreator/Qiita-1.07M huggingface dataset:
メルカリShopsで自分のショップに誘導するまでのあれこれ

## はじめに

[bocci bocci](https://boccibocci.com)を運営している@shoji-kaiです。
今年からメルカリShopsにてショップを開設して、自分のお米を販売することにしました。

親類や知人などにお知らせしようと思ったのですが、メルカリShopsで自分のショップに誘導するのが一筋縄では行かずに苦労したので、そのことについて書きます。

## ショップURLでの誘導がうまくいかない

ショップを開設するとショップURLというのが割り当てられます。

私の場合、[https://mercari-shops.com/shops/BaUb4miDEjn3qtr6x5yfrV](https://mercari-shops.com/shops/BaUb4miDEjn3qtr6x5yfrV) がショップURLになります。

このURLをシェアすればいいのかなと思っていたのですが、実はこれではうまくいきませんでした。

### 問題点1. 「アプリで開く」をクリックしてもメルカリShopsのTOPページにリダイレクトされる

ショップURLをiPhone(私の場合はiOS 14.8)で開くとブラウザが開きます。

ブラウザからはきちんと私のショップが表示されるのですが、そこから「アプリで開く」をクリックしてメルカリアプリで開くとメルカリShopsのTOPページにリダイレクトされます。

メルカリShopsのTOPページから検索すれば当然自分のショップにたどり着けるわけですが、直接開いてほしいところです。

ちなみに、手元のPixel6(買ってしまった😇  バージョンはAndroid v12)ではこのような現象は起きず、ショップURLをクリックすると(ブラウザ経由せずに)自動でメルカリアプリが起動して、私のショップを直接開くという期待通りの動作をしました。

### 問題点2. ショップURLからログインするとメルカリShops TOPページにリダイレクトされる

PC・スマホ(iPhone)ともにブラウザからショップURLを開くときちんと私のショップが開くのですが、そこからログインするとメルカリShopsのTOPページにリダイレクトされます。

PCの場合、2021/11/11時点では検索機能がないので、再度ショップURLを入力する必要があります。

実はアプリの場合も同様で、アプリでログインしていないとメルカリShopsのTOPページにリダイレクトされますが、アプリの場合は基本的にログインしっぱなしだと思うのであまり問題にはならないかと思います。(インストール直後くらい)

この問題は現時点(2021/11/11)でも解決されておりません。

メルカリ(mercari.com)とメルカリShops(mercari-shops.com)でドメインが異なり、認可サーバはメルカリ側にあるようなのでそこらへんが関係あるのでしょうか？

私はここらへんはあまり詳しくないのであれですが、セッションとかに保持しておけばいいだけじゃないのかなと思ったりもするので、早めに対応をお願いしたいところです。

## Firebase Dynamic Linksを見つける

さて、そんなこんなで結局のところ、親類・知人にはメルカリShopsのTOPページにて"bocci bocci"と検索してもらって、私のショップにたどり着いてもらっていました。

一方で、私もしつこく直接開く方法はないだろうかと探していたところ、ようやくと見つけました。

1. メルカリアプリでショップページにある「共有する」をクリック
2. 自分のMacbookにAirDropで送る
3. Macbookでブラウザが起動して、そこにURLが書いてある！

URLは以下のような感じです。

[https://goto.mercari-shops-static.com/?url=https://mercariapp.page.link/?isi%3D667861049%26ibi%3Dcom%2Ekouzoh%2Eios%2Emercari%26link%3Dhttps%3A%2F%2Fmercari%2Dshops%2Ecom%2Fshops%2FBaUb4miDEjn3qtr6x5yfrV%26amv%3D89000%26si%3Dhttps%3A%2F%2Fassets%2Emercari%2Dshops%2Dstatic%2Ecom%2F%2D%2Fsmall%2Fplain%2FwSfrdHvvBPYpRwk2jWWpdg%2Epng%26st%3Dbocci%20bocci%26apn%3Dcom%2Ekouzoh%2Emercari](https://goto.mercari-shops-static.com/?url=https://mercariapp.page.link/?isi%3D667861049%26ibi%3Dcom%252Ekouzoh%252Eios%252Emercari%26link%3Dhttps%253A%252F%252Fmercari%252Dshops%252Ecom%252Fshops%252FBaUb4miDEjn3qtr6x5yfrV%26amv%3D89000%26si%3Dhttps%253A%252F%252Fassets%252Emercari%252Dshops%252Dstatic%252Ecom%252F%252D%252Fsmall%252Fplain%252FwSfrdHvvBPYpRwk2jWWpdg%252Epng%26st%3Dbocci%2520bocci%26apn%3Dcom%252Ekouzoh%252Emercari)

これの、url=以降がFirebase Dynamic Linksとなっておりました。

このURLをデコードしてiPhoneからクリックしたところ無事にメルカリアプリが起動して、私のショップを直接開いてくれました。

## まとめ

メルカリShopsはこれ以外にも本当に使いづらくてストレスが溜まっていたのですが、徐々に改善されてきているようです。

ですので、上記のような手順を踏まずとも、そのうち正式なショップURLやカスタムドメイン機能が提供されるのだろうと思います。

今回の記事は、それまでの繋ぎと思ってもらえれば幸いです。
mysql8.0

####ubuntuでインストール
```
sudo apt install mysql-server
```
####パスワード初期化など
```  
sudo mysql-secure-installation
```
####ログイン

```
sudo mysql -u root -p
```
sudoが必要なので注意
####ユーザー作成  

```
create user 'tomoya'@'localhost' identified by 'Password1!';
```
```
create user 'tomoya'@'%' identified by 'Password1!';
```

####権限付与
```
grant all on *.* to 'tomoya'@'localhost' with grant option;
```
```
grant all on *.* to 'tomoya'@'%' with grant option;
```
allはすべての権限を意味している。はじめの`*`はデータベース、次の`*`はテーブルを意味している。
`%`は外部サーバーからの権限行使の許可を意味している。

####認証プラグインの確認
```
select user,host,plugin from mysql.user;
```
デフォルトで認証プラグインは`caching_sha2_password`になっているので変更する
####認証プラグインの変更

```
alter user 'tomoya'@'localhost' identified with mysql_native_password by 'Password1!';
```
```
alter user 'tomoya'@'%' identified with mysql_native_password by 'Password1!';
```
[Drupal]フィールドフォーマッターとは

## フィールドフォーマッターとは
フィールドの値を表示するときに、どのように表示するかを決めるもの
Drupalの場合、エンティティのフィールドを作成するとフィールドタイプに応じていくつかのフィールドフォーマッター（以下フォーマッター）が使えるようになっている

## 設定方法
サイト構築 > コンテンツタイプ > [任意のコンテンツタイプ] > 表示設定から行う

![フォーマッター.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/0c43d53b-26cb-750e-ee91-346bea1c0237.png)

## フォーマッターによる見え方の違い
例えばフィールドタイプが「画像」の場合、「画像」、「画像のURL」というフォーマッターが最初からインストールされており、それぞれ以下のように表示のされ方が違う。
###  フォーマットされていない状態（編集画面）
![スクリーンショット 2021-11-11 6.23.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/2f9f58d4-965f-f312-a83b-cd940d18649d.png)

### 画像
![スクリーンショット 2021-11-11 6.24.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/6ea696c8-9ef4-6970-f062-e8b1fff76587.png)

### 画像のURL
![スクリーンショット 2021-11-11 6.26.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/71d68309-232b-7b57-356c-d570441e1098.png)

### まとめ（イメージ）
![スクリーンショット 2021-11-11 7.01.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/96e3d6fd-89a5-e545-fb3e-51cc227bb6c9.png)

## フォーマッターが便利な訳
### 管理画面で確認できる
さきほど書いたように、「表示設定」からどのフォーマッターを使っているのか一目瞭然なので、表示時にどんな処理がされているか把握しやすい。フィールドタイプごとにデフォルトでインストールされるフォーマッターがいくつかあるのでフィールドの表示はサイトビルディングで完結できる場合も多い

### エンティティのディスプレイモードに紐付けられている
「このディスプレイモードのときは、このフィールドはこの方法で表示する」というように紐付けて管理できるので、あらかじめディスプレイモードごとのフィールドフォーマットの設定をドーンと作っておけばhook_preprocessやTwigでちまちまフィールド値を加工する必要がなくなる

![ディスプレイモード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/3f1fb49e-059c-0c57-26e8-dfe5be084b16.png)

- Twigでフォーマットした値を表示する場合

```twig
<!--あらかじめコンテンツタイプの表示設定からフォーマッターを指定しておく-->
<!--contentにノードエンティティが入っている場合-->
{{ content.field_name|view }}
```
- フィールド単体のレンダリング配列を取得する場合

```php
// my_image_formatterでフォーマットした画像フィールドのレンダリング配列を取得する.
$node->get('field_image')->view('my_image_formatter');
```

- ノード全体のレンダリング配列を取得する場合

```php
// 特定のノードを特定のディスプレイモードのレンダリング配列を取得する.
// 各フィールドの値はフォーマッターでフォーマットされた値が表示される
$view_builder = \Drupal::entityTypeManager()->getViewBuilder('node');
$view = $view_builder->view($node, 'my_display_mode')
```


### Viewsで使える
「表示設定」で使えるフォーマッターはViewsのフィールドの設定でも選択できる。
![スクリーンショット 2021-11-11 7.09.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/3170b290-5ad4-6fc6-7171-018bbd065a16.png)

### 簡単にカスタムフォーマッターを作ることができる
プラグインを作成することで、比較的簡単にカスタムフォーマッターを作成できる。デフォルトでインストールされているフォーマッターに要件に見合うものが無ければ自分で追加すればOK

[Creating a custom field formatter](https://www.drupal.org/docs/creating-custom-modules/creating-custom-field-types-widgets-and-formatters/create-a-custom-field-formatter)
「世界で一番やさしい会議の教科書」を読んだので、その要点

https://qiita.com/9boz/items/f1c624c1b425ba78f373

というような記事に共感しつつ自分も苦手である。開発としてどう会議をサバイブしたら良いのか... 評判の良い以下をさらったので要点。

https://www.amazon.co.jp/%E4%B8%96%E7%95%8C%E3%81%A7%E4%B8%80%E7%95%AA%E3%82%84%E3%81%95%E3%81%97%E3%81%84%E4%BC%9A%E8%AD%B0%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E6%A6%8A%E5%B7%BB-%E4%BA%AE/dp/4822271781

<img src=https://img.honto.jp/item/2/265/360/27500531_1.webp>

## 内容

表紙と絵柄は好みが分かれるかもしれない、が、ストーリー仕立てで以下。

- 初めてのダメ会議
- 確認するファシリテーションを始める
- 書くファシリテーションを始める
- 隠れないファシリテーションを始める
- Prepするファシリテーションを始める


## 確認するファシリテーションを始める

### 課題

- **決まったことが明確になっていない**
    - **結局何も決まってない**
    - **何か決まったけど、具体的に何をすればいいのかよく分からない**
    

### ファシリテーションの入門

- ファシリテート
    - 用意にする・促進する
- ファシリテーション
    - あるゴールを達成するための活動を、促進する、容易にするための技術
- 会議ファシリテーション
    - 何かを決めることを促進する、容易にする技術

### ファシリテーションのテクニック

- 決まったことの確認
- やるべきことの確認
- 終了条件の確認

いきなり下っ端が、口出ししづらいというのが最大の難関であるファシリテーション。「すみません、ちょっと理解が追いついていないので教えて下さい」などと効果的にクッションを挟んで、隠れファシリテーションする。

## 書くファシリテーションを始める

### 書く

- 意見
- 論点
- 決定事項

を書く。
個人的には、

- 事実
- 意見

も区別できたほうがいいと思うのだがどうか。スクライブ会議とは？
 
### スクライブ

- 会議中に書く3つのこと
    - 意見: 発言をそのまま書く
    - 論点: 質問や議題を「問」として明記する
    - 決定事項: 決まったことを「結」として明記する
        - 終了条件、時間配分、結論、やるべきこと
- これだけでも議論が "見える" ようになる
- 見えるだけで議論が楽になる

重要なのは、会議で出た意見などの内容をホワイトボードに見える化し、終了条件を明確にすること。



## 隠れないファシリテーションを始める

ここからは本格的な内容。実際にファシリテーターとして任命された場合に有効になってきそう。

### 進め方

終了条件を明確にした上で、以下など。

- 振り返り 20分
- 検討課題の絞り込み 10分
- 改善策の討議 30分 * 3テーマ
- まとめ 10分


## Prepするファシリテーションを始める

- フォーマットが、ここでダウンロードできる
    - https://www.ctp.co.jp/strong_point/facilitation/useful_contents/


## 書評

以下がわかりやすかった。

>【ファシリテーションを良く知らない人】

> - 一度読んだ方が良い
> - 会議の世界が変わる可能性がある
> - チームの人の何人かが読めば間違いなく会議が変わる
> - 結局、良くわからなくても会議を良くしようとさらに思える
>
>【ファシリテーションを良く知っている人】

> - 世界では知らないが、たぶん日本で一番わかりやすいファシリテーションの本だから理解が深まる
> - 間違って理解している点について学び直せる
> - 上手くファシリテーションを発揮できてない人でも発揮できるようになるかも・・・

https://twitter.com/ijyu1120/status/1442957449535709186?s=20

Prepシートのようなものは

https://qiita.com/e99h2121/items/190de25a79701baa4122

でもまとめた通り、よく用意されるが、それ以前にマインドの部分で発見があった本。参考になればさいわいです。
[rviz] 点の描画 

rviz上に点を描画するだけのプログラム

```python:pub_point.py

import rospy
from visualization_msgs.msg import Marker

rospy.init_node("marker_pub")

pub = rospy.Publisher("sphere_pub", Marker, queue_size = 10)
rate = rospy.Rate(25)

w=0

while not rospy.is_shutdown():
    marker_data = Marker()
    marker_data.header.frame_id = "map"
    marker_data.header.stamp = rospy.Time.now()

    marker_data.ns = "basic_shapes"
    marker_data.id = 0

    marker_data.action = Marker.ADD

    marker_data.pose.position.x = 0.0
    marker_data.pose.position.y = 0.0
    marker_data.pose.position.z = 0.0

    marker_data.color.r = 1.0
    marker_data.color.g = 0.0
    marker_data.color.b = 0.0
    marker_data.color.a = 1.0

    marker_data.scale.x = 0.3
    marker_data.scale.y = 0.3
    marker_data.scale.z = 0.3

    marker_data.lifetime = rospy.Duration()

    marker_data.type = 2

    pub.publish(marker_data)

    rate.sleep()

```

rvizで表示すると以下のようになります

![Screenshot from 2021-11-11 04-02-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/350b6247-8b2c-c5ee-8bfe-d2b9db8fff8f.png)

(参考)https://www.robotech-note.com/entry/2018/04/15/221524
【SwiftUI】複数ActionSheetの利用

#何をやるのか？
SwiftUIで実装する一つのViewに対して、ActionSheetを複数実装すると最後に書いたものだけが適応され、それ以外のActionSheetは無効扱いになります。
そのため、ここでは複数のActionSheetの実装方法を備忘録として残しておきます。

```swift
// 無効になる
.actionSheet(isPresented: self.$showActionSheet1) {
                ActionSheet(
                    title: Text("Title1"),
                    message: Text("Message1"),
                    buttons: [
                        .default(Text("Button1"),
                        action: {
                            print("done1")
                        }),
                        .default(Text("Button 2"),
                        action: {
                            print("done2")
                        })
                    ])
            }
// 以下だけ有効
.actionSheet(isPresented: self.$showActionSheet2) {
                ActionSheet(
                    title: Text("Title2"),
                    message: Text("Message2"),
                    buttons: [
                        .default(Text("Button1"),
                        action: {
                            print("done1")
                        }),
                        .default(Text("Button2"),
                        action: {
                            print("done2")
                        })
                    ])
            }
```

#解決策
以下のように分岐処理で任意のActionSheetを返すだけでいいみたいでした。

```swift
@State var showActionSheet = false
@State var optionsMenu: OptionsMenu = .action1

enum OptionsMenu { case action1, action2 }

///////////////////////////////////////////////////////////////

.actionSheet(isPresented: $showActionSheet) {
    if self.optionsMenu == .action1 {
        return ActionSheet(title: Text("Action1"), buttons: [
            .default(Text("ButtonTitle")) {
                print("tapped Button")
            }
            .destructive(Text("Close"))
        ])
    } else {
        return ActionSheet(title: Text("Action2"), buttons: [
            .default(Text("ButtonTitle2")) {
                print("tapped Button2")
            },
            .default(Text("ButtonTitle3")) {
                print("tapped Button3")
            },
            .destructive(Text("Close"))
        ])
    }
}
```

#参考
https://stackoverflow.com/questions/58367086/swiftui-one-view-with-2-or-3-actionsheets
【SwiftUI】TextField&TextEditorのキーボード出現時のViewの動きを制限

#何をするのか？
SwiftUIではTextFieldやTextEditorをタップした際に表示されるキーボードにViewが隠れないように、自動でViewのレイアウトを調整してくれます。ですがモーダル（フルスクリーンじゃない）を表示した場合などにレイアウトの調整が行われると、表示しておきたいViewが画面外に追いやられてしまうことがあります。
そのため今回はあえて自動のレイアウト調整を無効にする方法を備忘録としてまとめておきます。

#解決策
キーボードは SafeArea を基準にビューを伸縮させています。iOS 14 から追加された View.ignoresSafeArea() を利用してキーボードの表示に対し任意のビューを SafeArea から除外できるようになりました。
どのsafeAreaを指定するかは状況に応じて使い分けてください。

```swift
var body: some View {
    VStack {
        ...
    }
    .ignoresSafeArea(.keyboard, edges: .all)
}
```

#参考
https://teratail.com/questions/359043
react-infinite-scrollerを使って無限スクロールを実装する

#はじめに
Reactでチャットアプリを作成する際に無限スクロール欲しいよなあと思い作成したので記録しておく。

#仕様
https://github.com/danbovey/react-infinite-scroller

使用するコンポーネントはInfiniteSchrollerのみ。スクロールイベントで発火する仕組みのよう。主にpropsとして使用するものを紹介する。

###loadmore
ロードする際に実行する関数。

###hasMore
loadMoreを実行するかどうかを判断するboolean。のはずなのだが、falseにしてもloadmoreが一回だけ動いたりした。要検証。

###initialLoad
初回にロードするかどうかを決めるboolean。初回時と読み込み時で処理が違う場合はfalseにした方が良さそう。

###loader
ローディング中のUI。

###threshold
スクロールイベントを検知するためのスクロールバーとウィンドウ下の距離。大きくしたり小さくしたりするとエラーが出ることがあるのでテスト必須。

#コード

```react
export const FirebaseChatDisplayArea = () => {
  const { chatData } = useChatDataSelector();
  const { hasMore } = useHasMoreSelector();
  const { isChatsCompleted } = useIsChatsCompletedSelector();
  const { lastChatOrder } = useLastChatOrderSelector();
  const { dispatch } = useAppDispatch();

  //初回時のみ実行、それ以降はDBに変更があった時のみ動作
  useFetchData();

  console.log("チャット表示領域のレンダリング");

  return (
    <SChatListContainer>
      {isChatsCompleted ? (
        <InfiniteScroll
          loadMore={() =>
            loadMore({
              dispatch,
              chatData,
              lastChatOrder,
              hasMore,
            })
          }
          hasMore={hasMore}
          loader={<CircularProgress key={0} />}
          initialLoad={false}
          threshold={50}
        >
          {chatData.length === 0 ? (
            <div>チャットはありません</div>
          ) : (
            chatData.map((item) => {
              return (
                <SChatContainer key={item.key}>
                  <SContent>{item.user_name}</SContent>
                  <SContent>{item.text}</SContent>
                  <SContent>{moment(item.createdAt).fromNow()}</SContent>
                  <SContent>{item.order}</SContent>
                </SChatContainer>
              );
            })
          )}
        </InfiniteScroll>
      ) : (
        <CircularProgress />
      )}
    </SChatListContainer>
  );
};
```
特に変わったところはないと思います。

#遭遇したエラーと対策
###keyを設定しろと言われる
公式のコードや、issueにも載っているが、loaderに`key={0}`としないと怒られる。

###同じデータを読んでしまい、同じkeyが存在すると言われる
thresholdの値が大きすぎるとloadmoreの実行中にもう一度イベントが発生し、同じデータを読んでしまうことがある。このエラーはロジック上の問題であるときもあるので十分な分析が必要。

#おわりに
意外とめんどくさかった。みんな手動で実装してるんだろうか。
Xcode13でInfo.Plistがない。どこ？

Xcode13で新しいプロジェクトを作ると、Info.Plistがない。
CameraUsageDescriptionとか追加できへんやん。
安心してください、**追加方法が変わっただけです**。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/f9a78478-d32b-f98e-43d0-d31e42cc1a4c.png" width="300">

#Info追加方法

Xcodeの左のペインのアプリのトップレベルを選択し、**TARGETSでInfoタブを選択**する。

![スクリーンショット 2021-11-11 2.09.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/1b6384cb-bcf0-4ae0-a23e-50febb9cb5a1.png)

ここで、これまで通りPrivacy Camera Usage Descriptionなどを設定すればOKです。

焦るよね、こういうの。
🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
【Blender】キラキラ⭐️キャンディ🍭に被写界深度を設定してみた

環境メモ
⭐️Mac OS Catalina
⭐️Blender2.94.4

↓↓↓完成内容
![rendaring.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/125e1372-1b5e-c24e-2a93-2fe1758b7330.png)

# レンダリング 
まず、レンダーエンジンをCyclesにする
![000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/6e8e99bf-3ba8-2892-d5ce-c20f74a8cf38.png)

# レンダープロパティ
デバイスを`GPU演算`にする
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/810ae042-b5db-1126-8a62-424cc60d177c.png)


# キャンディのマテリアルをキラキラに設定する
サーフェスを`グラスBSDF`
粗さ`０`
IOR`1.450`
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/428aafa4-a264-a256-64f2-7a87456e22ca.png)

# 被写界深度を設定する
まず①カメラを選び、②カメラプロパティを選択する
③被写界深度チェックONにする
焦点を当てるオブジェクトを選択します。この場合、手前のキラキラキャンディを１つ選びました。
被写界深度の絞り値（F値）を`0.5`にする
![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/0f4e83c8-ae8d-3f47-39ff-0eeb242720d0.png)


完成！！
RequestsとBeautifulSoupを使用してニュースをスクレイピングし、CSV出力する

ニュースのURLとタイトルをスクレイピングし、CSVファイルを出力します。
言語はpythonを使用します。
今回は、はてなブックマークとHackerNewsを対象に行います。

### 下記をインストールしておく
```
pip install requests
pip install BeautifulSoup4
pip install numpy
```

### crawler.pyを作り、ニュースをスクレイピングする
```
import requests
from bs4 import BeautifulSoup

def crawl_hatena():
    data = []
    title_list = []
    url_list = []
    load_url = "https://b.hatena.ne.jp/hotentry/it"
    html = requests.get(load_url)
    soup = BeautifulSoup(html.content, "html.parser")

    # セレクタを指定してデータを取得して格納する
    topic = soup.find_all("a", class_="js-keyboard-openable")
    for element in topic[:30]:
        if not element:
            continue
        title_list.append(element.get("title"))
        url_list.append(element.get("href"))
    for (i, j) in zip(title_list, url_list):
        data.append("[タイトル]" + i)
        data.append("[URL]" + j + "\n")
    item = "\n" + "-----【はてなブックマーク】-----" + "\n" + "\n".join(data)
    return item, title_list, url_list

def crawl_hacker_news():
    data = []
    title_list = []
    url_list = []
    load_url = "https://news.ycombinator.com/"
    html = requests.get(load_url)
    soup = BeautifulSoup(html.content, "html.parser")

    # セレクタを指定してデータを取得して格納する
    topic = soup.find_all("a", class_="storylink")
    for element in topic[:50]:
      title_list.append(element.get_text())
      url_list.append(element.get("href"))
    for (i, j) in zip(title_list, url_list):
        data.append("[タイトル]" + i)
        data.append("[URL]" + j + "\n")
    item = "\n" + "-----【Hacker News】-----" + "\n" + "\n".join(data)
    return item, title_list, url_list
```


### main.pyを作成して、crawler.pyで抽出したデータをCSVへ出力する
```
import numpy as np
import csv

# NewsタイトルとURL取得(別ファイルに記述)
cr_hatena = crawler.crawl_hatena()
cr_hacker_news = crawler.crawl_hacker_news()

# URLとタイトルをまとめる
hatena_data = [list(e) for e in zip(cr_hatena[1], cr_hatena[2])]
hacker_news_data = [list(e) for e in zip(cr_hacker_news[1], cr_hacker_news[2])]

# はてなブックマークとHackerNewsのデータをまとめる
bk_news_data = np.concatenate((hatena_data, hacker_news_data))
bk_news_header = ['Title', 'URL']
bk_news_path = 'bk_news/bk_news_'

# CSVへ書き込む
with open(bk_news_path + str(time) + '.csv', 'w') as f:
    writer = csv.writer(f)
    writer.writerow(bk_news_header)
    writer.writerows(bk_news_data)
```

上記を実行すると、指定したパスにスクレイピングをしたデータがCSVファイルに書き込まれていると思います。
【Flutter】プラグインでAndroidのActivityとContextを取得する方法

#概要
FlutterプラグインでAndroidネイティブ画面を利用するために、プラグイン側でActivityとContextを取得する方法を整理します。
プラグイン作成時にはthis経由でActivityを取得できず、代替手段が必要になるため、その補足記事となります。
本記事は[公式ドキュメント](https://flutter.dev/docs/development/packages-and-plugins/plugin-api-migration)を参考にして記載しています。

#環境

```shell-session
$ flutter --version
Flutter 2.5.3 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 18116933e7 (3 weeks ago) • 2021-10-15 10:46:35 -0700
Engine • revision d3ea636dc5
Tools • Dart 2.14.4
```

#実装

以下の手順で実装するといいかもしれません。説明の番号とコードのコメントに付与する番号は、内容を合わせています。

① プラグインのクラスにActivityAwareのインタフェースを追加する(必要なimport文は、中略ここから〜中略ここまでを参照ください)
② ActivityとContext用のメンバ変数を定義(特定のコールバック関数以外でAcitivity, Contextを使用するため)
③ Contextをメンバ変数に格納
④ onAttachedToActivityのコールバック関数の引数で渡されるbindingから取得できるActivityをメンバ変数に格納
⑤ ActivityAwareインタフェースを利用する上で、今回使用しない分の定義必須のコールバック関数を実装する。
⑥ ContextやActivityを使用して各々好きに実装する

```kotlin

// ✨✨①中略ここから✨✨
import io.flutter.embedding.engine.plugins.activity.ActivityAware
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding
// ✨✨①中略ここまで✨✨

/** ① AcitvityAwareのインタフェースを追加する。クラス名は適宜変更すること */
class PluginTest2Plugin: FlutterPlugin, MethodCallHandler, ActivityAware {
  private lateinit var channel : MethodChannel

  // ② 他のメソッドでも利用できるようにプラグイン用のクラスのメンバ変数を定義
  private lateinit var activity : Activity
  private lateinit var context : Context

  override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
    channel = MethodChannel(flutterPluginBinding.binaryMessenger, "plugin_test2")
    channel.setMethodCallHandler(this)

    // ✨✨ ③ Flutterエンジンにattachされたタイミングでメンバ変数にbindingされたContextを格納
    context = flutterPluginBinding.applicationContext
  }

  override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
    // ✨✨ ⑥ ContextやActivityを使用して各々好きに実装する
    // 中略
    if (call.method == "getPlatformVersion") {
      result.success("Android ${android.os.Build.VERSION.RELEASE}")
    } else {
      result.notImplemented()
    }
  }

  override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
    channel.setMethodCallHandler(null)
  }

  //
  override fun onAttachedToActivity(binding: ActivityPluginBinding) {
    // ✨✨ ④ Activityがattachされたタイミングでメンバ変数にbindingされたActivityを格納
    activity = binding.activity
  }

  // ✨✨ ⑤ 以下のコールバック群は、ActivityAwareのインタフェースを実装する上で定義必須だが今回は使用しないため、TODOレベルで記載しておく
  override fun onDetachedFromActivityForConfigChanges() {
    TODO("Not yet implemented")
  }

  override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
    TODO("Not yet implemented")
  }

  override fun onDetachedFromActivity() {
    TODO("Not yet implemented")
  }
}
```
ReactでGoogleMapsAPIを使う（#1地図表示だけ）

公式ドキュメントに記載されたやり方（に準じる形）でReactアプリケーションにGoogleMapsAPIを使ってみましたのでやり方を簡単にメモします。
公式はTypeScriptで記載されていましたが、ここではJavaScriptで書いていきます。

###必要なコンポーネントをインストール
```
npm install @googlemaps/react-wrapper
```

###必要なコンポーネントを作っていく（その①）

```Test.js
import { Wrapper} from "@googlemaps/react-wrapper";
import Map from "./Map";

export default function Test(){
      
return (

<Wrapper apiKey={ここにAPIkey} >
  <Map/>
</Wrapper>
)
}
```

###必要なコンポーネントを作っていく（その②）
```Map.js
import {useRef,useEffect,useState} from 'react';

export default function Map(){
  const ref = useRef(null);
  const [map, setMap] = useState();
  
 useEffect(() => {
  if (ref.current && !map) {
    setMap(new window.google.maps.Map(ref.current, {
       center:{
          lat: 35.6809591,
          lng: 139.7673068,
      },
      zoom:8,
    }));

  }
}, [ref, map]);

return(
    <div ref={ref} style={{height:500, width:500}} />
  )
}
```
※divタグにheight,widthを指定していますが、ここでサイズ指定しないと正しくレンダリングれません。

###完成！！
これだけで簡単に表示できました。
<img width="400" alt="2021-11-11 0.22.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627012/3648bb80-41b8-ff50-e420-e2c6c466ca29.png">


###補足：マップコントロールを消す
上記の通り簡単にマップ表示はできましたが、地図内のコントロールボタン（左上の「地図/航空」、右上の「フルスクリーン」、右下上段の「ストリートビュー」）が不要だったので、消してしまいます。
※右下の縮尺ボタン（+-）は残します。
この場合は先程のMapコンポーネントのuseEffect内にあるnew window.google.maps.Mapの第二引数に現在渡しているオプションに追記します（現在はcenterとzoomだけを指定しており、zoomの直後にmapTypeControl,streetViewControl,fullscreenControlをfalseで追記）。

```Map.js
import {useRef,useEffect,useState} from 'react';

export default function Map(){
  const ref = useRef(null);
  const [map, setMap] = useState();
  
 useEffect(() => {
  if (ref.current && !map) {
    setMap(new window.google.maps.Map(ref.current, {
       center:{
          lat: 35.6809591,
          lng: 139.7673068,
      },
      zoom:8,
      mapTypeControl: false,
      streetViewControl: false,
      fullscreenControl: false,
    }));

  }
}, [ref, map]);

return(
    <div ref={ref} style={{height:500, width:500}} />
  )
}
```
###こちらも完成！
少しスッキリさせられました。
<img width="400" alt="2021-11-11 0.23.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627012/dd17bbb7-0ee9-0043-4660-8d700c2a0744.png">
Docker Desktop for Windows / Version 4.2.0


- Docker Desktop for Windows / Version 4.2.0
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1349578/eaf42503-c79b-1adb-5793-4cda0d315d04.png)
    - cf. GitHub
        - https://github.com/docker/for-win
    - cf. DockerHub
        - https://hub.docker.com/editions/community/docker-ce-desktop-windows
AtCoder ABC224B を Ruby らしく

問題は以下を参照して下さい。

https://atcoder.jp/contests/abc224/tasks/abc224_b

たんに四重ループ総当りで解ける簡単な問題ですが、Rubyらしくというのにこだわってみました。コードは以下です。

```ruby:atcoder224b.rb
h, w = gets.split.map(&:to_i)
a = h.times.map { gets.split.map(&:to_i) }

def selected_loop(x)
  x.pred.times do |i1|
    (i1.next...x).each do |i2|
      yield(i1, i2)
    end
  end
end

e = Enumerator.new do |y|
  selected_loop(h) do |i1, i2|
    selected_loop(w) do |j1, j2|
      y << (a[i1][j1] + a[i2][j2] <= a[i2][j1] + a[i1][j2])
    end
  end
end

puts e.all? ? "Yes" : "No"
```

総当りの四重ループですが、行方向と列方向のループが同様に書けるので、自分でイテレータ（繰り返し用のメソッド）を定義してみました。それが`selected_loop`メソッドで、「ブロック」のついたメソッドとして定義されています。`yield`がありますよね。ブロック変数には、行あるいは列方向に、あらかじめ条件を満たした数値が順に入ります。

もうひとつ工夫したのは、すべての判定を`Enumerator`化しているということです。変数`e`がそれです。問題の条件は、すべての判定が真なら Yes を出力せよということなので、それを`Enumerable#all?`メソッドでやりたかったのですね。

競プロで自分でイテレータ用メソッドを定義したり、`Enumerator`をそれらしく使えたりする問題はあまりないので、趣味的にこだわってみました笑。

なお、この解法は短くもありませんし、速くもありません。ただ、可読性は多少よいのかなと思っています。
Azure Synapse Apache Spark PoolsにてDelta Lake形式のテーブルにおけるファイル数を最適化するOptimizeについて

## 概要
Azure Synapse Apache Spark Poolsにて、Delta Lake形式のテーブルにおけるファイル数を最適化するOptimizeの実行する方法として、Optimizeを利用できるようです。ドキュメント等では確認できないのですが、ライブラリの中をみていたところ、偶然にもみつけました。

```python
from delta import *

help(DeltaTable.optimize)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/830b2160-a42b-f4e4-a53e-2d8d665227a6.png)


Delta lake形式のテーブルでは、データを追加することによりファイル数が増大することから、ファイルの圧縮の実施が推奨されております。delta lakeのドキュメントでは、すべてのデータを読み取り再パーティション後に書き込む方法が紹介されています。


```python
path = "..."
numFiles = 16

(spark.read
 .format("delta")
 .load(path)
 .repartition(numFiles)
 .write
 .option("dataChange", "false")
 .format("delta")
 .mode("overwrite")
 .save(path))
```
引用元：[Best practices — Delta Lake Documentation](https://docs.delta.io/latest/best-practices.html#compact-files&language-python)

Optimizeを利用することで、下記のようなシンプルなコードの記載のみでよくなります。

```python
DeltaTable.forName(spark, {table_name}).optimize()
```
rosbridgeをnoeticで動かす

##rosbridgeをnoeticにインストール


```
sudo apt install ros-noetic-rosbridge-server
```
##ライブラリのインストール
pip3で以下のライブラリをインストールしてください．

```
pip3 install pyyaml rospkg twisted cryptography six pyopenssl autobahn tornado bson pymongo 
```

pip3 インストールはこちら

```
sudo apt install python3-pip
```
##実行
```
roslaunch rosbridge_server rosbridge_websocket.launch
```
Linux(Ubuntu)のUnityHubで, アーカイブバージョンのUnityをインストールする方法

# 環境
Ubuntu 20.04
UnityHub(AppImage) 2.4.5

# 事の発端
某所でUnityのバージョンを指定され, Ubuntuでの導入で躓いた.
Win/MacでアーカイブされたバージョンのUnityをインストールする時は, UnityHub->Installs->ADDから, 上の方の[download archive](https://unity3d.com/get-unity/download/archive)からバージョンを選んで一番左の黄緑の「Unity Hub」ボタンを押せばUnityHubが勝手に開いてダウンロード&インストールをしてくれる. しかし, UbuntuではAppImageで実行していたため(UnityHubをコマンドとして実行できないため), xdg-openからUnityHubを開いて…とはできないらしい.

# 解決法
1. [download archive](https://unity3d.com/get-unity/download/archive)ページでインストールしたいバージョンの黄緑の「Unity Hub」ボタンを右クリ→「リンク先のアドレスをコピー」
1. ターミナルで`$ ./path/to/UnityHub.AppImage コピーしたURL`(chmodで実行権限を付与した前提)

これで任意のアーカイブバージョンのUnityをインストールできる.
回帰係数は相関関係によって決定される(RとPythonのコードつき)

#　はじめに
　今回は単回帰・重回帰分析における回帰係数についてのお話です。最適解についての記事ではないので最急降下法とか最小二乗誤差についてのお話はしません。来週その辺りについて記事を書けたらと考えていますが、今回はまず回帰係数について扱おうぜって記事になります。文章で読むとごちゃごちゃしちゃう部分もあるので数式を用いながら見てきます。もし数式苦手って人はスルーで大丈夫です、というより見ないことをお勧めします。わかりにくいものをわからないもので説明されてわかるはずがないですから。まあ、参考程度に。
　では、始めていきましょう！！

#　回帰係数とは
　そもそも回帰係数とはなんでしょう。簡単に言えば回帰問題における説明変数それぞれにおける係数のことですね。これが一個の時が単回帰、複数個の時が重回帰になるんでしたね。ここは大丈夫でしょうかね。まあ、一応数式で見て見ましょうか。

```math
\mathbb{R}:ベクトルであることを明示しています\\
t_i:目標値(従属変数) ただし、t_i\in 	\mathbb{R}^1 \\
x_i:特長量(独立変数) ただし、x_i \in \mathbb{R}^D (D=1の時単回帰)\\
w_i:回帰係数(ただし、w_0はバイアス)\\
単回帰分析:t = w_0 + w_1x_1\\
重回帰分析:t = w_0 + w_1x_1 + w_2x_2+...+w_nx_n = w_0 + \Sigma_{d=1}^D w_dx_d\\
```

　ここでは、行列表記については避けます。今回の本質はそこでないのと、回帰係数を理解する上では少し複雑になってしまうので。
　はい、まあ数列で表記するとこのようになります。今回のお話は回帰係数なのでwの部分だけ着目してもらえると。ただし、w_0はバイアスと呼ばれ導出方法が回帰係数と異なります。バイアスについて少しだけ触れておくと独立変数が全て0の時にとりうる最適の値をバイアスとしてw_0にします。例えば、年齢(独立変数)から身長(従属変数)を求める単回帰の場合、0歳でも身長はある程度ありますよね。その身長の部分をw_0として保存します。そして、これを**バイアス**と呼びます。さらに年齢の部分につく係数が**回帰係数**になります。
　となると、回帰係数とバイアスを求めたくなりますよね。ってことで求めてみましょう。ただし、今回は回帰係数のみ取り扱います。

#　回帰係数の求め方
　まずは回帰係数についてです。本当は残差を定義して、それを最小化したいから、、という話があるのですが今回は割愛します。今回は2つの特長量を持つとします。

```math
S_{x_1}^2:特長量x_1の分散\\
S_{x_1x_2}:特長量x_1,x_2の共分散\\
S_{x_2}^2:特長量x_2の分散\\
w_1:特長量x_1の回帰係数\\
w_2:特長量x_2の回帰係数\\
S_{x_1t}:特長量x_1と目標値tの共分散\\
S_{x_2t}:特長量x_2と目標値tの共分散\\
\begin{pmatrix}
S_{x_1}^2 & S_{x_1x_2} \\
S_{x_1x_2} & S_{x_2}^2 \\
\end{pmatrix}
\begin{pmatrix}
w_1 \\
w_2\\
\end{pmatrix}
=
\begin{pmatrix}
S_{x_1t} \\
S_{x_2t}\\
\end{pmatrix}
```

　回帰係数は上記の行列を解くことによって求められます。先ほども言いましたが導出をしたいわけではありません。重要なのは回帰係数を解く際に**分散・共分散行列**を利用していることにあります。次はこの点に着目して回帰係数についてもう少し話を進めてみようと思います。

#　回帰係数が分散・共分散から導かれるとは
　先ほども述べましたが、今回は導出を省略しているためなぜ回帰係数が分散・共分散から導かれるのかは一旦置いておいて分散・共分散から回帰係数が導出されることに着目してこれが持つ特性についてみていきましょう。
<dl>
  <dt>1.相関関係によって回帰係数が決定される</dt>
  <dd>　回帰係数の本質は相関関係であるということです。つまり、目標値と特長量を標準化した際はそれらを入れ替えても回帰係数は変わりません。参考部分でRとPythonを用いて計算しています。今回は簡単のため単回帰についてみています。(コードについての説明は省きます)</dd>
  <dt>2.相関係数に関する注意事項は回帰係数においても同じ</dt>
  <dd>　a)いくら変数を増やそうとも直線的な関係のみ(非線形回帰という手段は存在しますが、今回は省略します)
      　b)グループによる分割によって結果が変わる可能性

　c)信頼性の低い項目間で相関係数をとると、実際（真の値の間の）相関係数よりも低い値が生じてしまう可能性(希薄性と言います)

これらの相関係数における問題点は回帰係数にも同様に問題になります。
</dd>
  <dt>3.相関係数は因果関係を表すわけではない</dt>
  <dd>　これがめちゃくちゃ重要ですね。1.で見たように回帰係数はあくまで「相関関係」を見ているだけです。つまり、「独立変数⇒従属変数」という因果関係が存在すると断言することはできません。もし因果関係があるとするならば単回帰において標準化したとしても独立変数と従属変数を入れ替えたら回帰係数は変わるはず。
</dd>
</dl>

　これら3つが回帰係数が分散・共分散行列から計算されることで導かれるものになります。特に3番目の**因果関係を表すわけではない**ことはよく言われてはいますがなんとなくでしか理解をしていなかった部分ではないでしょうか。

#　さいごに
　今回は回帰係数は相関関係にすぎないことを説明していきました。案外知らなかったのではないでしょうか。データ分析をする際にもこういった知識を持っていると注意しなければならない点にも気づけるように思います。よく回帰係数は因果関係を表すわけではないと言われますが、今回の記事で理解してもらえれば幸いです。
　今回省略した回帰係数の導出と最小二乗誤差や最急降下法に関しては次回・次々回で深く触れていこうと思います。気になる方はそちらを参照いただければと思います。もしご覧になられた時点で記事作ってなかったらごめんなさい、、


　最後まで見てくだり、ありがとうございました！！
　みなさんの理解の一助になれば幸いです

##　参考(Rコード)
![スクリーンショット 2021-11-10 22.07.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2135815/98a3b92e-464b-70fc-10d5-d14592e083b9.png)

##　参考(Pythonコード)
![スクリーンショット 2021-11-10 22.15.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2135815/25d68538-b83a-f602-5134-d127be4988a8.png)
Goland学習1日目

# Go言語とは
Googleが開発した言語
基本的にimportでパッケージを読み込み実行する
# 学習内容
## fmt
Cに似たprintf と scanf に似たフォーマット I/O 関数を実装する。

 https://xn--go-hh0g6u.com/pkg/fmt/
## Println
fmt.Println()は引数の間にスペースを入れ、最後に改行文字 “\n” を出力します。 https://www.flyenginer.com/low/go/go%E8%A8%80%E8%AA%9E%E3%81%AEprint%E3%83%BBprintln%E3%83%BBprintf%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6.html

## 変数
### 宣言する方法

 var 変数名 データ型
で変数のデータの型を漸減できる。
例

```go:
 var name string
 name = "Jon"
```

### 型推論

:= を使用することでデータ型の宣言せずに型推論でデータを自動で認識できる。

例

```go:
   name := "Jon"
```
rds mysqldumpでハマった

備忘録です。

ほんの出来心で

rds mysqlでdumpで抜いて、リストアしようとしただけなんです、、、


```ERROR 1227 (42000) at line 18: Access denied; you need (at least one of) the SUPER, SYSTEM_VARIABLES_ADMIN or SESSION_VARIABLES_ADMIN privilege(s) for this operation```

くっそぅ、、、

いろいろ調べて、rdsにはそれなりのdumpの取り方があるそうで、、、

環境差はあるものの、、、

``mysqldump --single-transaction --skip-triggers --set-gtid-purged=OFF -h xxxxxxxxx -u xxxxx -p db_name | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > xxxxxxxxx.dump.sql``

これで、下記で素直にリストア完了

``mysql -h xxxxx -u xxxx -p db_name < xxxxxx.dump.sql``
VirtualBoxでネットワーク学習 1110

・VirtualBox
使用しているPC上に仮想的なPCを作成して、別のOSをインストール・実行できるフリーのPC仮想用ソフト

PCの上にVirtualBoxの上にゲストOS

・VirtualBoxの特徴
①スナップショット
仮想環境の状態を丸ごと保存しておく機能
②シームレス・モード
ホストOS(使っているPC）とゲストOS（仮想マシンのOS）間で同時並行で作業することが可能
③共有フォルダ
共有フォルダを設定しておくことで、ホストOSとゲストOSで同じファイルを共有することが可能
④クリップボードの共有
ホストOS→ゲストOSへ文字をコピー&ペーストをすることが可能
Dockerコマンド まとめ

## 目次
1. [基本的なコマンドの形](#1-基本的なコマンドの形)
1. [コンテナ操作コマンド](#2-コンテナ操作コマンド)
1. [イメージ操作コマンド](#3-イメージ操作コマンド)
1. [ボリューム操作コマンド](#4-ボリューム操作コマンド)
1. [ネットワーク操作コマンド](#5-ネットワーク操作コマンド)
1. [その他コマンド](#6-その他コマンド)

## 1. 基本的なコマンドの形

```powershell
# 基本の型
$ docker コマンド(上位コマンド + 副コマンド) オプション 対象 引数

# 例
# コマンドによっては、上位コマンドを省略することができる
$ docker container run -d penguin --mode=1
```

## 2. コンテナ操作コマンド

```powershell
# 上位コマンドは、「container」
$ docker container 副コマンド オプション 対象 引数
```

### コンテナ操作コマンド一覧
|副コマンド|内容|省略|
|:------|:--|----|
|start|コンテナを開始する|可|
|stop|コンテナを停止する|可|
|create|Dockerイメージからコンテナを作成する|可|
|run|Dockerイメージをダウンロードし、コンテナを作成して起動する(image pull, create, startをまとめたもの)|可|
|rm|停止したコンテナを削除する|可|
|exec|実行中のコンテナ内でプログラムを実行する|可|
|ls|コンテナ一覧を表示する|可(省略形はdocker ps)|
|cp|DockerコンテナとDockerホスト間でファイルをコピーする|可|
|commit|Dockerコンテナをイメージに変換する|可|

### docker runについて

### docker runのオプション
|オプション|内容|
|:------|:---|
|--name コンテナ名|コンテナ名を指定する|
|-p ホストのポート番号:コンテナのポート番号|ポート番号を指定する|
|-v ホストのディスク:コンテナのディレクトリ|ボリュームをマウントする|
|--net=ネットワーク名|コンテナをネットワークに接続する|
|-e 環境変数名=値|環境変数名を指定する|
|-d|バックグラウンドで実行する|
|-i|コンテナに操作端末(キーボード)をつなぐ|
|-t|特殊キーを使用可能にする|
|-help|使い方を表示する|

```powershell
# オプション
$ docker run (オプション) イメージ (引数)

# 例:Apacheコンテナを作成する
$ docker run --name apa000ex2 -d -p 8080:80 httpd
```

## 3. イメージ操作コマンド

```powershell
# 上位コマンドは、「image」
$ docker image 副コマンド オプション 対象 引数
```

### イメージ操作コマンド一覧
|副コマンド|内容|省略|
|:------|:--|----|
|start|コンテナを開始する|可|
|pull|Docker Hubなどのリポジトリからイメージをダウンロードする|可(省略形はdocker rmi)|
|rm|Dockerイメージを削除する|可|
|ls|自分がダウンロードしたイメージ一覧を表示する|可|
|build|Dockerイメージを作成する|可|

## 4. ボリューム操作コマンド

ボリュームという機能を使うことで、ホストや外部のストレージをコンテナにマウントできる。

```powershell
# 上位コマンドは、「volume」
$ docker volume 副コマンド オプション 対象 引数
```

### ボリューム操作コマンド一覧
|副コマンド|内容|省略|
|:------|:--|----|
|start|コンテナを開始する|不可|
|create|ボリュームを作る|不可|
|inspect|ボリュームの詳細情報を表示する|不可|
|ls|ボリュームの一覧を表示する|不可|
|prune|現在マウントされていないボリュームをすべて削除する|不可|
|rm|指定したボリュームを削除する|不可|

## 5. ネットワーク操作コマンド
Dockerネットワークとは、Docker同士が接続するのに使う仮想的なネットワークのこと。

```powershell
# 上位コマンドは、「network」
$ docker network 副コマンド オプション 対象 引数
```

### ネットワーク操作コマンド一覧
|副コマンド|内容|省略|
|:------|:--|----|
|start|コンテナを開始する|不可|
|connect|コンテナをネットワークに接続する|不可|
|disconnect|コンテナをネットワークから切断する|不可|
|create|ネットワークを作る|不可|
|inspect|ネットワークの詳細情報を表示する|不可|
|ls|ネットワークの一覧を表示する|不可|
|prune|現在コンテナがつながっていないネットワークを全て削除する|不可|
|rm|指定したネットワークを削除する|不可|

## 6. その他コマンド

### その他の上位コマンド一覧

|上位コマンド|内容|
|:------|:--|
|checkpoint|現在の状態を一時的に保存し、後でその時点に戻ることができる|
|node|DockerSwarmのノードを管理する機能|
|plugin|プラグインを管理する機能|
|secret|DockerSwarmのシークレット情報を管理する機能|
|service|DockerSwarmのサービスを管理する機能|
|stack|DockerSwarmやKubernetesで、サービスをひとまとめにしたスタックを管理する|
|swarm|DockerSwarmを管理する機能|
|system|DockerEngineの情報を取得する|

### 単独コマンド一覧
|単独コマンド|内容|
|:------|:--|
|login|Dockerレジストリにログインする|
|logout|Dockerレジストリからログアウトする|
|search|Dockerレジストリで検索する|
|version|DockerEngine及び、コマンドのバージョンを表示する|

※単独コマンドとは、上位コマンドを持たないコマンドのこと。
AfterEffects 画像や動画のサイズを増やす。モーションタイル

#■モーションタイル(エフェクト)
画像や動画のサイズを増やす。

こんな時に使える。
3Dレイヤーで奥行きを出した時にサイズが小さくなったりした時

![スクリーンショット 2021-11-10 22.28.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/2210c219-9b54-af23-3231-d67f71edb40d.png)

![スクリーンショット 2021-11-10 22.30.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/f60bdf29-ca09-229f-8d71-d641a1dda68b.png)



###▼出力値変更時
横幅増える。
![スクリーンショット 2021-11-10 22.32.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/de17a956-5eb0-ce56-cc0b-fa91c9098486.png)

###▼出力高さ変更時
高さが増える。

![スクリーンショット 2021-11-10 22.33.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/edfba7b8-89ed-91cc-ae43-521b78800f01.png)

###▼ミラーエッジにチェックマーク
反転し馴染む

![スクリーンショット 2021-11-10 22.34.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/a1f2ff43-e20b-f60c-91e8-6c4964fb1b95.png)


###■参考Youtube
https://www.youtube.com/watch?v=0Mj876R47CA&list=PLY9G_9MgrJ8gOkHk3auSds49vyECYeOhy&index=10
【Gnuplot】【備忘録】球面上を大円を描いて移動する点のgifの作成方法

何かと簡単に図が描けるGnuplotは、非常に便利な反面機能が多いので、試行錯誤しながら覚えていく必要がある。

今回は、球面を描いて、球面状を大円を描いて移動する点を描写するグラフのプログラムを作成した。

わからなくなったときに見直す用なので特に説明無し。

```gnuplot:sphere.gp
#!/usr/bin/env gnuplot -dc -persist

set term gif animate optimize delay 5 size 960,720
set output 'sphere.gif'

set parametric
set view equal xyz
#set isosample 20,20
#set sample 20

set urange [0:2*pi]
set vrange [0:2*pi]

omega = pi/1000
do for [it = 1: 1000] {
	splot cos(v)*cos(u), cos(v)*sin(u), sin(v)
	set label 1 point pt 7 ps 2 at cos(pi)*cos(omega*it), cos(pi)*sin(omega*it), sin(pi) # このプログラムの一番の特徴。ポイントを球面に沿って移動させている。
}

set output
```

![sphere.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62130/d6a3a85f-c71e-d95f-8b9c-f29ccbaa9529.gif)
ボタンを押したら背景色がグラデーションでランダムに変わるアプリを作りました（+ CSS Animationをちょっと）

# 作ったアプリ
[https://awesome-engelbart-e06e16.netlify.app/](https://awesome-engelbart-e06e16.netlify.app/)
画面中央の文章がずっと点滅します。
ボタンを押すと、背景色が左から右にグラデーションでランダムに変わります。
ライブラリやフレームワークは使わずに、HTML、CSS、Vanilla JavaScriptで作成（リセットCSSだけ使ってます）。

# 特記事項
### 文章を点滅させる
`@keyframes`で点滅のパターンを指定して、`animation`プロパティに指定しました。

```css
.description {
    animation: blink 2s ease 0s infinite alternate none running;
}

.hex-gradient {
    animation: blink 2s ease 0s infinite alternate none running;
}

@keyframes blink {
    0% {
        opacity: 0;
    }

    100% {
        opacity: 1;
    }
}
```

### 背景色をグラデーションにする
こちらは`background`プロパティに`linear-gradient`関数を使用しました。カラーコードをランダムに取得するため、6桁の16進数を取得する必要があり、`Math.random().toString(16).slice(-6)`で対応しました（でも、これでできる理由はよくわかっていない・・・）。

```JavaScript
clickMe.addEventListener('click', () => {
  const left = Math.random().toString(16).slice(-6)
  const right = Math.random().toString(16).slice(-6)
  const colorCode = document.getElementById('color-code')
  document.body.style.background = `linear-gradient(to right, #${left}, #${right})`
  colorCode.textContent = `#${left}, #${right}`
})
```

### ボタン押すとレイアウト崩れる問題
地味にはまったのが、ボタンを押したときに中央の文章がひょこっと上に動くことです。これは`button:active`に太めの`border`を設定しているのが原因っぽいので、`outline`というプロパティに変えたところうまくいきました。
> 輪郭線は領域を占有せず、要素のコンテンツの外側に描かれます。- 仕様によれば、輪郭線は矩形である必要はありませんが、ふつうは矩形です。

```css
.click-me:active {
    outline: 3px solid #ABB2B9;
}
```

# 参考にさせていただいたところ
[要素を点滅させる](https://code-log.net/css/blink/)
[JavaScriptで超簡単にランダムで数桁の16進数を作成する方法](https://iwb.jp/javascript-easy-random-hexadecimal-number-digits/?utm_source=rss&utm_medium=rss&utm_campaign=javascript-easy-random-hexadecimal-number-digits)

JavaScriptの練習ネタ
[25 Beginner JavaScript Project Ideas](https://dev.to/codefoxx/25-beginner-javascript-project-ideas-3m9h)

そして、もちろん[MDN](https://developer.mozilla.org/ja/)
Niantic Lightship ARDK の注意点ピックアップ

Niantic から Lightship ARDK が公開されましたので、
ドキュメントを読む中で注意が必要だなと感じた部分をピックアップしておきます。
（2021/11/10現在の情報です）

2021/11/17更新
- ランドスケープモードをサポートしていないことを追加

## Lightship ARDK
https://lightship.dev/

## 注意点

> iOS向けに開発するときは、次の考慮事項に留意してください。
> 
> ARDKは、AppleSiliconと互換性のないUnity2019.4 LTSバージョンを必要とするため、Apple Siliconプロセッサ（「M1チップ」）を搭載した特定のMacモデルではサポートされていません。Nianticチームはこの問題を認識しており、将来のバージョンでこれをサポートするよう取り組んでいます。

https://lightship.dev/docs/system_reqs.html

---
> ARDKおよびAndroid 11を実行している電話との競合があります。ARDKアプリがUnityからターゲットAPIレベル30で構築されている場合、Android 11では、ARCoreインストールされているかどうかに関係なく、デバイスは使用できないように見えます。

https://lightship.dev/docs/system_reqs.html

---
> ノート
> 現在、ARDKはiPadデバイスをサポートしていません

https://lightship.dev/docs/system_reqs.html

---
> Windowsでの開発
> ARDKのネイティブプラグインはiOS、Android、およびMacOS用に構築されており、Windowsマシンには読み込まれません。Windowsでの開発中に、DllNotFoundExceptionsネイティブ呼び出しが試行されたためにUnityコンソールに表示される場合があります。これらはビルドや開発をブロックしませんが、UnityEditorのネイティブネットワークは機能しません。また、リモートデバッグアプリケーションは、Windowsマシンに接続しているときにARFrameを圧縮しないため、フレームレートが低下して実行されます。

https://lightship.dev/docs/system_reqs.html

---
> アンドロイド
> 以下は、認識機能をサポートするために検証されたチップセットとデバイスのリストです。他のハードウェアで認識機能を使用すると、パフォーマンスが低下したり、クラッシュしたりする可能性があります。
> 
> Adreno 630、Mali G-72（Google Pixel 3、Samsung GalaxyS9およびS9 +、Samsung Note 9）
> Adreno 640、Mali G-76（Google Pixel 4、Samsung Galaxy S10、Samsung Note 10）
> Adreno 650、Mali G-77（Samsung Galaxy S20、注20）
> Adreno 660、Mali G-78（Samsung Galaxy S21、Note 21）

https://lightship.dev/docs/system_reqs.html

---
> ノート
現在、ARDKはモバイルデバイスでランドスケープモードをサポートしていません

https://lightship.dev/docs/system_reqs.html

---
> 利用規約のセクション3に従い、iOSストアとAndroidストアに公開することができます。
> 
> 限定ライセンス
> 
> このライセンス契約を順守し、その条件に定められた制限を条件として、Nianticは、Niantic Developer Platformにアクセスするための、テリトリー内の個人的、非独占的、譲渡不可、サブライセンス不可、取り消し可能、制限付きライセンスを付与します。サンプルコードの全部または一部をアプリケーションとマージすることを含め、Niantic SDKを使用および複製すること。これは、設計、作成、開発、テスト、保護、リリース、公開、配布、マーケティング、宣伝、強化、および/または該当するすべてのドキュメントに従ってアプリケーションをサポートする。ここで特に付与されていないすべての権利は、明示的に留保されます。
> 
> 出典：https：//lightship.dev/terms/

https://community.lightship.dev/t/publishing-to-ios-and-android-stores/344/2

## さいごに

いろいろ注意点（特にM1チップ問題）がありますので、気を付けないといけませんね。
WindowsはEditor実行できないようなので、Intel Macが最強？
楽天ブックスCD検索APIから曲名を取得した時に起きた事について

#今回の内容

以前投稿した[楽天ブックスCD検索APIから画像、タイトル、アーティスト名、レーベル、説明文、曲名を取得](https://qiita.com/HiroUrata/items/c017ce812e0f1da5843a)を作成した時に起きた事についての内容です。

* 今後、同じ様な事があった場合に少しでもヒントになればと思い書きます。

* アプリの機能自体は,`UITextField`に入力された値と`CD検索API`を使用して`画像、タイトル、アーティスト名、レーベル、説明文、曲名`を取得して表示するだけのシンプルな作りです。

#曲名を取得した時に起きた事

* 楽天ブックスCD検索APIから曲名を取得した際に、取得される値は以下の様になります。

```:取得結果
   曲名01###曲名02###曲名03###曲名04###曲名05###曲名06###曲名07###曲名08###曲名09###曲名10###曲名11
```

* 曲名の間に`###`が含まれている`String型`になります。 

##今回の対処

* `.components(separatedBy: "###")`を使用して、文字列内から`###`だけを削除しました。
* 同時に、配列に値を入れていきます。

```Swift:例文
    let testString = "曲名01###曲名02###曲名03###曲名04###曲名05###曲名06###曲名07###曲名08###曲名09###曲名10###曲名11"

    override func viewDidLoad() {
        super.viewDidLoad()

        let testResultArray = testString.components(separatedBy: "###")
        print(testResultArray)
        
        testResultArray.forEach { result in
            
            print(result)
        }
    }
```
```:print結果
["曲名01", "曲名02", "曲名03", "曲名04", "曲名05", "曲名06", "曲名07", "曲名08", "曲名09", "曲名10", "曲名11"]
曲名01
曲名02
曲名03
曲名04
曲名05
曲名06
曲名07
曲名08
曲名09
曲名10
曲名11
```

* `print結果`では値を分けることが出来ました。


# 終わり

ご指摘、ご質問などありましたら、コメントまでお願い致します。
いまどきの Ruby なフィボナッチ数列

`Enumerator.produce`を使います。

```ruby:fib.rb
fib = Enumerator.produce([1, 1]) { |a, b| [b, a + b] }.lazy.map(&:first)

#最初の10個
fib.first(10)
#=>[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

#数列の100以上3000未満の部分
fib.drop_while { _1 < 100 }.take_while { _1 < 3000 }.force
#=>[144, 233, 377, 610, 987, 1597, 2584]

#1000未満で素数であるもの
require "prime"
fib.select(&:prime?).take_while { _1 < 1000 }.force
#=>[2, 3, 5, 13, 89, 233]
```
応用情報技術者試験に滑り込みセーフで受かった記録

## 1. はじめに
令和3年春期の応用情報技術者試験に合格したのですが、その際滑りこみセーフで合格したので、ある意味最短ルートなのかもしれんと思い、今更ですが勉強法を記す事にしました。

**点数**
午前: 76.25/100
午後: 60.00/100


午前問題はともかく、午後問題は衝撃の滑りこみセーフ

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266010/2cc30494-7514-174d-459c-97c1ba2178cd.jpeg">

## 2. スペック
若手フロントエンドエンジニアだが、上流工程のタスクが増え悩んでいたこともあり応用情報の受験を決意

以前AWS SAAに合格した際の学習内容や、日々の業務での知見があったためセキュリティ・情報システム開発周りは多少有利に・・


## 3. 勉強時間
平日: 朝2h, 仕事終わり3h
土日祝: 8h
期間: 3/18~4/18 (試験当日),超短期集中

## 4. 目的
とにかく最短で受かるための一例として書きます。
そういうケースもあるんだな〜くらいに思っていただければ幸いです。

## 5. 勉強法
### 1. 午前対策
先ずは、試験範囲全体を把握するために、シラバスを読みたい・・ところですが
さっぱりなので、以下の参考書でざっと周辺知識をつけます。
[キタミ式イラストIT塾　応用情報技術者 令和03年](https://www.amazon.co.jp/%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88IT%E5%A1%BE-%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E4%BB%A4%E5%92%8C03%E5%B9%B4-%E3%81%8D%E3%81%9F%E3%81%BF%E3%82%8A%E3%82%85%E3%81%86%E3%81%98/dp/4297117835/ref=asc_df_4297117835/?tag=jpgo-22&linkCode=df0&hvadid=342428724851&hvpos=&hvnetw=g&hvrand=9897905296399551982&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009300&hvtargid=pla-990222923427&psc=1&th=1&psc=1)
各専門用語が図解されており、非常にわかりやすいと評判の良い参考書です。

とはいえ、初めから完全に理解することを目指す必要は無いかと思われます。
IPAのスキルレベル3相当とはいえ、試験範囲はとても広いので、一度で完全に理解するのは不可能かなと・・
むしろ、合格した現在でも全範囲を完全に理解しているとは言えません。というか業務で使わない分野から忘れます。

ですので、何度か目を通して、[過去問道場](https://www.ap-siken.com/apkakomon.php) を解いた時にメンタルが折れないくらいに分かるレベルで十分です。
後は演習を通して、出題されやすい問題を把握・整理をしていきたいところです。

また午前試験は過去問と同じ内容が出ることも多々あるため
先ほどの [過去問道場](https://www.ap-siken.com/apkakomon.php) で直近3年分くらいを3周ほどしつつ、弱い分野を重点的に整理して行けば良いかと思います
(技術は移り変わりが早く、古すぎる過去問は再出題の可能性も低いので効率が悪いと考えました)

短期集中であれば、得点率は安定して7~8割を越えれば後は定期的に演習を行いレベルを維持するだけで十分だと思います。
午前問題だけ極めても仕方がありません、**大事なのは午後**です。


### 2. 午後対策
[2021 応用情報技術者　午後問題の重点対策 重点対策シリーズ](https://www.amazon.co.jp/2021-%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E5%8D%88%E5%BE%8C%E5%95%8F%E9%A1%8C%E3%81%AE%E9%87%8D%E7%82%B9%E5%AF%BE%E7%AD%96-%E5%B0%8F%E5%8F%A3-%E9%81%94%E5%A4%AB-ebook/dp/B08NJ15483)

上記の問題集を2,3周解きました。
この際、1度目の演習で全分野の得点率を分析
明らかに苦手な分野は切り捨て、2度目・3度目の演習を行いました

自分は一応技術者ということもあり、最終的に以下の6分野に絞りました。 
(解く際の優先度順。計画通り本番ではネットワークを捨てました)
> 1.情報セキュリティ
2.プログラミング
3.組み込みシステム開発
4.情報システム開発
5.データベース
6.ネットワーク

本番前に得意分野を基に優先順位をつけておくと、本番迷わなくて済むので決めた方が良いです。
寧ろ、やはり最短と言えども、これを決められるくらいには勉強を行うのが最低限のボーダーな気がします。


## 6. 本番
前日はとにかく、よく寝ましょう。
あと古い腕時計を使うのはやめましょう。本番の朝に会場で電池が切れます (笑)
但し、当日は時計がなくても退出可能時間のアナウンスがあるので、ある程度ペースを算出する事が可能だということがわかりました。 (個人的感想)

## 7. まとめ
あくまで、最短で受かるための方法です。
Power BI: オンプレミスゲートウェイ パーソナル版アップデートで接続出来なくなっていた

# 背景
On Premises Data Gateway (Personal 版) を利用していたのですが、いつものようにアップデートしたらWeb版の Power BI が繋がらなくなっていたので、その対処記録



# 必要な設定変更
1. ゲートウェイ接続
    1. 利用ゲートウェイを Personal Gateway (名無し？）に再選択<br>Personal なので個人で名称も要らんだろってことですかね<br>![2021-11-10_11h08_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/11bc3595-cfdb-c4bd-61b1-1e8c93492dd8.png)
1. データソースの資格情報
    1. 資格情報を編集
        1. User/Password を再設定<br>![2021-11-10_11h23_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/8cf96a6a-2c6d-bf50-e9f4-34b0fb5ca13c.png)


# ゲートウェイ設定からはPersonal版は反映されなくなった？
通常のゲートウェイ（Enterprise版？）なら今まで通りここで設定変更がそのままできるんだと思われる。
![2021-11-10_11h04_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/f3d67d9c-2081-9baf-9c66-8be1e252d38f.png)

# download

https://www.microsoft.com/en-us/download/details.aspx?id=53127

# 基本はここ
https://docs.microsoft.com/ja-jp/data-integration/gateway/service-gateway-install
【情報収集ツール】GoogleNewsとFeedlyを使ってみた

社会人として働いていくにあたり情報収集は欠かせないと思う方は多いのではないでしょうか？
商談で同僚がタイムリーなニュースを引き合いに出して取引先の方を納得させている姿に憧れます。
情報収集のコツを聞いたところ、二つの情報収集ツールを使っているということで私も使ってみました。

## ツール
ニュースアグリゲーターサービスというジャンルのツールで、
ウェブの中から関心のある情報だけにフィルタして1つの便利な場所に集約することができるようです。
ソースはニュース、ブログ、ソーシャルメディアの投稿、RSSフィードなど様々。

・Feedly
https://feedly.com/i/welcome/

・Google News
https://news.google.com/

## こんな使い方をしてます

・Feedly
フィルタ機能にGoogleの検索結果を登録でき、かつ、他のフィルタ条件のソースからの情報を一緒の画面で表示してくれる点が便利です。

・GoogleNews
エンジニアとして働く上で、英語の情報ソースにあたることが多くありますが、
言語や地域を変更することで、英語圏の情報ソースを集約してくれるところが便利です。
【Vue.js】システム修飾子

#はじめに
こんにちは！
今回は【Vue.js】システム修飾子についてアウトプットしていきます！

#システム修飾子とは
システム修飾子キーは用いることで、同じイベントでも異なったイベントとして扱うことができるようになる修飾子です。
＜記述方＞
`v-on:イベント.修飾子="イベントハンドラ名"`

#書き方・解説
今回は`ctrlキー＋cキー`が押されたらテキスト入力欄の文字をクリアさせるプログラムを書いていきます。

```HTML:HTML
  <input type="text" v-on:keyup.ctrl.67="clear" v-model="message">
                                 <!--⏫cキーのキー番号 -->
```
```Vue.js
 　　　　data: {
     message: ''
   },
　　　　　　　methods: {
     clear: function() {
      this.message = ''
   }
```

記述方法はキー修飾子の時と同じような感じですので解説は省略します。

また、表示されている文字を`shift＋click`でイベントハンドラを実行させるのもやっておきます。

```HTML:HTML
  <div v-on:click.shift="clickHandler ">
    Click you!
  </div>
```
```Vue.js
     clickHandler: function() {
       alert('shift + click')
     }
```

上の記述はClick you!を`shift`を押しながらクリックすると`alert``（shift + click）`が鳴るプログラムです。実行すると、

![スクリーンショット 2021-10-26 7.00.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/7ecabab4-d505-8a86-97d0-b7498b9d9aaa.png)
を`shift`を押しながらクリックすると、

![スクリーンショット 2021-10-26 7.00.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/5d70a44a-627f-4f63-58d8-d8a2d0f46188.png)

このようにアラートがなります。

#まとめ
・システム修飾子もキー修飾子のような記述法で実行されます。
・システム修飾子は意図的でしは発動されないものなので、異なったイベントを実行させたいときに使用するのが推奨されます。

#最後に
今回はシステム修飾子についてアウトプットしました。
今回の記事を読んで質問、間違い等あればコメント等頂けると幸いです。

今後ともQiitaにてアウトプットしていきます！

最後までご愛読ありがとうございました！
JavaScriptの勉強のため、ボタンを押したら背景色がランダムに変わるだけのアプリを作りました。

# 作ったアプリ
[https://festive-austin-0206b7.netlify.app/](https://festive-austin-0206b7.netlify.app/)
Netlifyでデプロイしました。
めちゃくちゃ単純で、画面中央のボタンを押したら背景色がランダムに変わるだけのアプリ。
連続で押したら目がチカチカします。
ライブラリやフレームワークは使わずに、HTML、CSS、Vanilla JavaScriptで作成（リセットCSSだけ使ってます）。

# ランダムな背景色の作成
0～255のランダムな整数を3つ取得して、RGB関数に値を渡してcontainerの背景色に適用しています。

```JavaScript
const clickMe = document.getElementById('click-me')

clickMe.addEventListener('click', (e) => {
  const container = document.querySelector('.container')
  const red = Math.floor(Math.random() * 256)
  const green = Math.floor(Math.random() * 256)
  const blue = Math.floor(Math.random() * 256)
  container.style.background = `rgb(${red}, ${green}, ${blue})`
})
```

# 参考にさせていただいたところ
JavaScriptの練習ネタ
[25 Beginner JavaScript Project Ideas](https://dev.to/codefoxx/25-beginner-javascript-project-ideas-3m9h)

今回投稿するにあたってアプリを公開しておきたいなーと思い、Netlifyというサービスを初めて利用しました（ねっとりふぁい？）
[Netlifyで静的サイトのホスティングをする](https://qiita.com/sugo/items/2ee64887d682b0dae635)