OmniAICreator/Qiita-1.07M huggingface dataset:
NextJSと[FireBase]Firestore Ver9とTypeSriptとCSSフレームワークのコピペで快適コーディング



### 今回作成したSample （ https://github.com/yahsmassa/FireStore9BasicTechnique ）
サンプルと、今回のポイントを見て、興味が出た方は GitHubのコードをご覧いただき、それでも興味が持続している場合はクローンしてVsCodeをご覧ください。フォルダ構造を単純にしてますので、リファクタリングも簡単に行えます。実際に試したい場合は .env.local.sampleをenv.localにリネームして、FireStoreのアカウント情報を記述してください。

Read.meはいけてない英語です。以前Githubでポルトガル人の書いたコードを読んだとき、謎の単語がたくさんあって大変だったので、多少デタラメでも、英語で記述することにしてます。ご了承ください。間違いの指摘大歓迎です。

![screen1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259753/53b2ee76-ca0f-d530-de54-8869be86b133.png)

### Sampleのポイント　

データベースを使う目的はやはり、状況に応じてデータを引っ張りだして、表示させることです

| ポイント                       | 対策                                                         |
| :----------------------------- | ------------------------------------------------------------ |
| 効率良いデータ登録             | Jsonからのアップロード                                       |
| Interface定義の省力化          | WebサービスでJsonから自動作成 (https://app.quicktype.io)                            |
| 現実的なデータ                 | ３階層のJsonデータ https://jsonplaceholder.typicode.com/users               |
| キレイな画面デザインを高速に！ | TailwindCSS、DaisyUI、Material UI、Swal2のサイトのサンプルをコピペして、リファクタリング、コンポーネント化 |
| 手コーディングの最小化         | 型付けで、自動補完入力                                       |
| データハンドリングのTopic      | Try,Catchで処理、promise.allで一括削除、queryでSQLっぽくデータ取得、xxx.data()  as MyInterfaceみたいな型定義 |
| テーブルグリッド      | Material UIで、ソート、フィルタリング、ページ送りが自動で設定されるのでコンポーネント化することで、かなりすっきり書けます。 |

### 今回悩んだ件

#### IDをオートナンバーにするか、指定するか
下の図の、８YJHｃと続く記号がIDで、横の列（＋コレクションを開始）の部分が実際のJsonデータの中身となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259753/25a7d288-de85-f322-a258-7a63c8e27e2c.png)


FireStoreはデータが階層になってて、最上位が一意のKey（ID)、その次にDataの階層と続きます。最上位のKey（ID）は指定しても、オートナンバーでもいいのです。

ログインしたユーザーの情報登録なら、Keyはメールアドレスとかになるし、意識しなければオートナンバーにすればいいのですが、重複データも登録されてしまったりするので設計が悩ましいところですね。

#### 知らない間に何回もFireStoreにリクエストしていないか？

これが行われると、本番環境では多大なリクエストが行われて、料金が膨大になるので、最新の注意が必要です、データを取得する部分にconsole.log("getData")みたいなログを入れて、何回もリクエストしているようなら、useEffectなどを使って調整しましょう。何回かやれば慣れます。

### 最後に

以前はWindowsのVisual Studioを使いC#で主に開発しておりました。自動補完がビシバシ効くので、コード量は増えても実際に自分でコーディングするのはわずかという感じが好きでした。JavaSriptはその点、厳しい環境です。１文字違うだけのエラー探しが大変すぎ、定義に飛ぶなどが中途半端、リファクタリングが大変。

TypeScriptはマイクロソフトで開発されたのでC#に近く、NextJSは環境構築がシンプル、Firestore Ver９はTypeScriptと親和性が高いということで、この３つの組み合わせは、C#で開発していた快適環境に近く、かなり開発効率が高まります。コピペしたコードへのリファクタリングか超快適です。

おまけにVueやReactには、固有の文法がかなりありますが、TypeScriptを使うことで、かなり共通な文法で記述できるようになります。TypeScriptの記述に慣れておけば、VueとReactで同時に開発を行う場合にも、違和感はあまり感じなくなりそうです。

私はコア部分の実装以外は、コピペで効率的に作成するという開発スタンスなのですが、同じようなスタンスの人には参考になると思います。
入れ子のHashにおける値の取得

# 目的
- 入れ子構造の連想配列から任意の値を取得する
# ポイント
- 入れ子とは、オブジェクトの値にさらにオブジェクトを指定したもの
- dig メソッドでも取得できる
# 具体例１
```ruby

#以下の変数hashから、値"USA"を取得する

require "pry"

hash = {
  sports: {
    soccer: {
      origin: "England"
    },
    volleyball: {
      origin: "USA"
    }
  }
}

binding.pry

puts hash[:sports][:volleyball][:origin]
```
~実際の表示~
    31:   }
    32: }
    33: 
    34: binding.pry
    35: 
 => 36: p hash

[16] pry(main)> hash.class
=> Hash
[17] pry(main)> hash[:sports].class
=> Hash
[18] pry(main)> #Hashなので、keyの指定で値を取得できる
[19] pry(main)> hash[:sports][:volleyball][:origin]
=> "USA"
# 具体例2
```ruby
# 以下の変数hashから、値"USA"を取得する

hash = {
  sports: {
    soccer: {
      origin: "England"
    },
    volleyball: {
      origin: "USA"
    }
  }
}

puts hash.dig(:sports, :volleyball, :origin)

```
~実際の表示~
USA
jQueryで画像一括アップロードを作ったよ

# 解説

ファイルを複数選択してドラッグ＆ドロップしてファイルを一括アップロードする処理を書きました。
Deferredを使って、ファイルアップロードが全部終わったらローディングアイコンを消すようにしました。
※サーバ側の処理は自分で実装してください…。

# 実装

## HTML

```html
<!-- 画像ドラッグ&ドロップ -->
<div class="drop_area_multiple">
    <input type="file" name="file" multiple="multiple" class="inputfile">
    <div class="drop_text1">ここにファイルをまとめてドロップ</div>
</div>
```

## CSS

```css
.drop_area_multiple {
  border: 2px dashed gray;
  text-align: center;
  background: #ffffff;
  width: 447px;
  line-height: 150px;
}
.dragtarget {
    background: #EDEDED;
}
.enter {
  background: linear-gradient(
    -45deg,
    rgb(218, 215, 215) 25%,
    #f5f1f1 25%,
    #f5f1f1 50%,
    rgb(218, 215, 215) 50%,
    rgb(218, 215, 215) 75%,
    #f5f1f1 75%,
    #f5f1f1
  );
  background-size: 40px 40px;
  animation: anime_stripe_1 0.8s infinite linear;
}
.disabled_drag_drop {
  pointer-events: none;
  opacity: 0.4;
}
@keyframes anime_stripe_1 {
  0% {
    background-position-x: 0;
  }
  100% {
    background-position-x: -40px;
  }
}
.pointer_off {
  pointer-events: none;
}

.drop_text1 {
  text-align: center;
  pointer-events: none;
  padding-bottom: 5px;
  color: #8A87B6;
}
.drop_input {
  text-align: center;
}
input.inputfile {
 display: none;
}
```

## JavaScript


```javascript
// ドラッグしている要素がドロップ領域に入ったとき・領域にある間
$('.drop_area_multiple').on('dragenter dragover', function (event) {
    event.stopPropagation();
    event.preventDefault();
    $(this).addClass('enter');
});
$('.drop_area_multiple').on('dragleave', function (event) {
    event.stopPropagation();
    event.preventDefault();
    $(this).removeClass('enter');
});

// 画像一括アップロード
$('.drop_area_multiple').on('drop', function (event) {
    event.preventDefault();

    var files = event.originalEvent.dataTransfer.files;
   
    showLoading();// ローディングアイコン出したり…

    // 並列処理
    var promises = [];
    for (var i=0; i<files.length; i++) {
        var file = files[i];
        promises.push(ajax_upload(file));
    }

    $.when.apply(null, promises).then(function() {
        hideLoading();
    });
    
    $(this).removeClass('enter');
});

// 画像アップロード
function ajax_upload(file) {
    var deferred = $.Deferred();

    let fd = new FormData();
    fd.append("file", file);
    
    let options = {
        type:'POST',
        url: '/upload_image.php',
        data: fd,
        cache: false,
        contentType: false,
        processData: false,
        dataType: 'json'
    };

    $.ajax(
        options
    ).done(function(d){
        console.log(d)
        deferred.resolve();
        
    }).fail(function(d){
        deferred.reject();
    }).always(function(){
        //完了
    });

    return deferred.promise();
}
```
連想配列(Hash) の 基本的な扱い方

# 目的
- 連想配列のメリットと使い方を理解する

# ポイント
- 連想配列は、値(value)にラベル(key)をつけた 配列 のこと
- 各要素に意味を持たせることができる
- 要素の順序を気にする必要がない

# 書き方の例
```ruby
#連想配列の初期化
hash = {}

#配列の場合
array = [20, 30]
#連想配列の場合
hash = {english: 20, japanese: 30}
#hash = {"english" => 20, "japanese" => 30}

p array
puts hash
puts hash[:japanese]


```
~実際の配列~
[20, 30]
{:english=>20, :japanese=>30}
30

# 注意するポイント
- key は文字列で書くより、シンボル（コロンで指定）で書いたほうが内部的な処理がはやい
- 文字列で配列の key を指定したら、取得する際も文字列で取得しないといけない

# 具体的な例
```ruby
hash = Hash.new

#要素の追加
hash[:apple] = 200
p hash

#要素の更新
hash[:apple] = 300
p hash

#要素の削除
hash.delete(:apple)
p hash
```
~実際の表示~
{:apple=>200}
{:apple=>300}
{}
読んだら忘れない読書術

https://honto.jp/netstore/pd-book_27091315.html

背景
先日サンカクという社会人インターンシップイベントプラットフォームのリブ・コンサルティング回に参加したとき、凄まじい能力を持った人がいて、読解力の重要性を感じました。
情報をくまなく集め、そこからアイデアを発案できる能力は読解力がポイントになりそうだと思ったので、ここの領域を深めたいと思いました。

なにで勉強すべきか調べていたところ、以下の動画に出会いました。
https://www.youtube.com/watch?v=wgj6Cde1T70
この方の言っていることが腑に落ちて、本書を手に取るに至りました。

以下に本の内容をまとめます。

本書の目的
読解力をつけるには読書量が大事。
読書量を増やす方法、いつ本を読むのか、読んだ本を忘れないようにするには何をすべきかについて事細かく書かれているのがこの本です。

本書に記載されていること
・読書によって得られること
・読んだら忘れない読書術
・本の選択術
・電子書籍と紙の本の違い

個人的なポイント
1.月に７冊読めばライバルとの差がつく
インターネットで何でも調べられる現代。読書をする人も少なくなってきたように感じますが、私もその一人でした。仕事で必要になった情報を都度都度調べていたのですが、継続して読書をするとか、好きな本を読むということはあまりしてきていません。
本書には読書をすることで仕事上のメリットも書かれており、月に７冊以上読む人は文化庁の調査だと３％くらいになっているそうです。
本を効率的に読み、内容を忘れず、仕事に活かすことができれば、間違いなくライバルとの差をつけられる。
私は、資格取得とかのほうが明確に人との差がつけられると感じていましたが、こういう観点がなかったので衝撃を受けました。

2.読書で記憶力、思考力、集中力、情報処理能力、共感力、コミュニケーション能力、創造力が鍛えられる
ビジネスにはどれも必要な能力ですよね。これらが読書で得られるなら嬉しい限りです。
思い返してみると、読書を趣味としている方ってこういう部分に長けているな〜と思ったりしました。

3.本を読んだの定義は「内容を説明できること」「内容について議論できること」
これも今の仕事に直結してて、感銘を受けました。
調べたはいいものの、適切な情報共有をできなかったり、それについて議論できなければほぼ意味がありません。
そレができるようになる訓練のためにも読書は有用なのかもしれません。

4.読書は量よりも質
ここが読解力に関わってくる部分かと思います。
前段で量の話をしておきながら、さらに質にもこだわるという読書に慣れていない人間にとっては「そうですよね。。。」という感じるところです。
でも、説明や議論ができるようになるにはここが大事ですよね。

5.たくさん読むよりも何を読むか
やはり量より質なんだなということがこのあたりでわかってきました。
自分が楽しいと思える本を読むことで、本に対して真剣に向き合える。
それが血となり肉となり、ビジネスに活かせるのだと思います。

本の主題「読んだら忘れないようにするには」
アウトプットが最も重要と述べています。
学んだことを忘れないようにするには３回位復習する必要があるという情報は耳にしたことがある人もいるかと思いますが、本書では１週間に３〜４回のアウトプットを実施するということでした。
アウトプットの方法は
・本にマーカーを付ける
・人に進める
・SNSで発信する
・ブログに記事を書く
等が挙げられていましたが、これらを１週間に実施することで忘れづらい内容になっていくのです。

まとめ
読解力をつけたいと思って手にした本ですが、読書術を色々学べて非常に有益でした。
仕事でも「一度調べたことを忘れないようにするにはどうしたらいいんだろう？」と思うことが多々有り、アウトプットがポイントなんだとすごく身にしみました。
そういえば、仕事ができる人もアウトプットの重要性を説いていたなと思い出しました。

あと、仕事で以下のようなアウトプットを出すのですが、これらを実施した調査対象は記憶に残っているなと感じます。
・社外ブログの作成
・検証内容をリーダーに報告
・検証内容をチームに共有
・お客さんとの打ち合わせのために調べたこと

自分以外の人に見せたり聞いてもらったりするアウトプットほど身につきますが、自己完結してしまうと忘れてしまうケースが多いのかなと思います。

読書によりジェネラルな能力をもっと培って行きたいと思います。
AWS Organizationsを使って、AWSメンバーアカウントを登録し、ある組織単位に所属させる

# AWS Organizationsの組織を作る
AWSマネジメントコンソールにログインします。
AWS Organizationsダッシュボードを表示します。
[組織を作成する]をクリックしてください。
![スクリーンショット 2022-09-11 6.44.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/9ecd02ae-a889-e3b3-8c08-01875ed0c893.png)

組織が作成され、管理アカウント(マスターアカウント)が表示されます。
![スクリーンショット 2022-09-11 6.46.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/f7976253-1558-9680-24eb-68cc9c4ce968.png)

# メンバーアカウントを登録する
AWS Organizationsダッシュボードの[招待]をクリックしてください。
![スクリーンショット 2022-09-11 6.54.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/30928806-01b0-172d-6dd0-8e140447d6ab.png)

招待ページが表示されます。
[AWSアカウントを招待]をクリックしてください。
![スクリーンショット 2022-09-11 6.56.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/4a125787-8437-b6d8-e9e5-3ccb6dbd5275.png)

AWSアカウントを追加ページが表示されます。
招待したいAWSアカウントのEメールアドレスを入力してください。
[招待を送信]をクリックしてください。
![スクリーンショット 2022-09-11 6.59.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/ff75315d-4c9f-1524-dbb7-8e9f377f27b8.png)

AWSマネジメントコンソールからサインアウトしてください。

招待メールを送信したEメールアドレスを表示してください。
招待メールの本文にある[Accept invitation]をクリックしてください。
![スクリーンショット 2022-09-11 7.05.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/bf77386c-52f0-8bd0-2f2f-25a2c5bbbf38.png)

招待したAWSアカウントでログインしてください。
招待ページが表示されます。
[招待を承認する]をクリックしてください。
![スクリーンショット 2022-09-11 7.07.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/fd6495e2-0712-6f05-f8de-e5697530c1b7.png)

AWSマネジメントコンソールからサインアウトしてください。

# AWSメンバーアカウントの登録を確認する
管理アカウント(マスターアカウント)でAWSマネジメントコンソールにログインしてください。
AWS Organizationsダッシュボードを表示してください。
管理アカウト(マスターアカウント)に加えて、メンバーアカウントが1アカウント追加されています。
![スクリーンショット 2022-09-11 7.12.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/b64a9148-aeff-d8d7-3fc9-0e4e65df224f.png)

# 組織構造を作成する
[Root]をチェックし、[アクション]-[組織単位]-[新規作成]をクリックしてください。
![スクリーンショット 2022-09-11 7.17.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/c7e4e837-a295-f290-7dc2-c82db2da2b7b.png)

組織単位の作成ページが表示されます。
[組織単位名]を入力し、[組織単位の作成]をクリックしてください。
![スクリーンショット 2022-09-11 7.19.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/138febe9-4011-d787-c261-d530ebdcb0e8.png)

AWSメンバーアカウントを組織単位に移動します。
作成した組織単位の[開発グループ]と移動させるAWSメンバーアカウントをチェックしてください。
[アクション]-[AWSアカウント]-[移動]をクリックしてください。
![スクリーンショット 2022-09-11 7.21.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/1cb7daa7-8d2d-5c16-a2c9-17898af8f10e.png)

AWSアカウントを移動ページが表示されます。
[AWSアカウントを移動]をクリックしてください。
![スクリーンショット 2022-09-11 7.21.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/07be8837-2fe8-28ba-b187-7a62a4c6739d.png)

以上です。
git push した時に起きるYour branch is ahead of 'origin/main' by 1 commit の原因と解決方法

## エラーの内容と推察

git commit -a -m "comment" でｺﾐｯﾄをしようとしたところ次のメッセージが出てきてしまいました。

~~~
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)
~~~

読み解くと
`今のあなたのブランチは"main"です。`
`あなたのブランチは以前1つのコミットを行っています。`
`（"git push"を使ってローカルコミットを公開してください）`
と書いてあります。

つまり*コミットされた内容がpushされていないよ。*と言う事。

## 解決方法

書いてある通り、git push しましょう。

~~~
git push origin [ローカルブランチ名]：[リモートブランチ名]

~~~

すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822365/d511ab88-0cda-2c3c-0a27-d231993930a7.png)
上手くいきました。

## 原因

どうやら遡っていくと、作業ブランチからコミットをマージしたのちプッシュをし忘れていた様子です。
こまめに作業の区切りではプッシュもしくはステータスの確認をしましょう。

~~~
git push

[or]

git status
~~~
Databricksコミュニティエディションへのサインアップ

[Sign up for Databricks Community edition \| Databricks on AWS](https://docs.databricks.com/getting-started/community-edition.html) [2022/5/9時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

本書では**Databricksコミュニティエディション**にサインアップする手順を説明します。Databricksのフリートライアルと異なり、コミュニティエディションでは、あなたのAWSアカウントやAWSの計算資源、ストレージ資源を提供する必要はありません。しかし、Databricksプラットフォームのフリートライアルでは利用できる、[REST API](https://docs.databricks.com/dev-tools/api/latest/index.html#rest-api-latest)のようないくつかの機能はDatabricksコミュニティエディションで使用することはできません。詳細は、[Databricks Community Edition FAQ](https://www.databricks.com/product/faq/community-edition)をご覧ください。

**訳者注** こちらもご覧ください。

https://qiita.com/taka_yayoi/items/800fd2714f460a9a1c40

サインアップするには、

1. [Try Databricks](https://databricks.com/jp/try-databricks)をクリックします。
1. 氏名、企業名、メールアドレス、タイトルを入力し、**GET STARTED FOR FREE**をクリックします。
1. **Choose a cloud provider**ダイアログで、**Get started with Community Edition**リンクをクリックします。
![try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4ddcb428-adaf-f04f-4a91-f162b3c72c0c.png)

    指定したメールアドレスにメールが送信されたことを告げるページが表示されます。
1. ウェルカムメールを開き、メールアドレスを確認するためにリンクをクリックします。Databricksパスワードを作成するプロンプトが表示されます。
1. **Submit**をクリックすると、Databricksコミュニティエディションのホームページに移動します。
![](https://docs.databricks.com/_images/landing-aws-ce.png)
1. Databricksに慣れるために[Get started with Databricks as a data scientist](https://docs.databricks.com/getting-started/quick-start.html)クイックスタートを実行してください。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
LPC812MAXとOLED、OLED096UNO-Aで12345678を表示(16x24)



x mbed2リビジョン144
x リビジョンを変更できる人むけ


x なんかリセットで失敗する　電源を入れ直すと動く(おおむね解決した2022/8/5)
x SMALL_SSD1308_128x64_I2Cのライブラリディレクトリを作ってライブラリを入れてください。
x または、ライブラリーインストール。
x 長いです。

目的
OLEDのテスト
1バイト単位でちまちま削っていたら出来た。


![o_con740.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f7787542-d007-0355-0355-ea2bce18d6c8.jpeg)


![o_con741.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4b4b8397-b89a-8cdc-7780-8428122b4608.jpeg)



参考


https://qiita.com/caa45040/items/4e18961edb3d3500b87d



```c++




//oled_test2_16x24_812_1

#include "mbed.h"
#include "SSD1308.h"

//i2c initialization
//       SDA    SCL
I2C i2c(P0_10, P0_11); //812


//メイン関数
int main()
{

    wait_ms(500); //0.5秒の待ち

    int ii; //ループカウンター
    int nn; //文字カウンター

    // Instantiate OLED
    SSD1308 oled = SSD1308( &i2c , SSD1308_SA0);

    //char n1_8[] = "12345678";
    char n1_8[] = "87654321";
    //char n1_8[] =   "88888888";

    ii=0;
    for(nn=0; nn<8; nn++) {
        //                y   x
        oled.writeBigChar(0, ii*16,n1_8[nn]);
        ii = ii + 1;
    } //for
        
    while(1) {}

}//main







```


![o_con833.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/fd969607-a171-1aff-3a88-8b89da4e2b75.jpeg)


-22-
「第I幕　Netscape：マネージャー」からの学びメモ(3)(リーダーの作法／マイケル・ロップ)

マイケル・ロップ氏の「リーダーの作法　ささいなことをていねいに」を読み解きながら、メモを残しています。

:::note info
各章ごとにまとめていますが、章の原題ではなく**私にとってのまとめ**をタイトルにつけなおしています。
:::

https://www.oreilly.co.jp/books/9784873119892/

この本との出会いと、アウトプットしながら読み解く経緯はこちらの記事で。

:::note warn
本文で登場する「ランズ」は、ロップ氏のネット上のハンドルネームです。
「はじめに」で、自身を「ロップ」とも「ランズ」とも呼ぶと宣言しています。
:::

https://qiita.com/w2mjra555/items/73fcac51e65dc20e8cba

# 第I幕　『人の気持ちが分かる』基本的で難しいこと

「リーダーの作法　ささいなことをていねいに」は、大きくは3部構成になっています。

- 第I幕　Netscape：マネージャー
- 第II幕　Apple：ディレクター
- 第III幕　Slack：エグゼクティブ

今回は **「第I幕　Netscape：マネージャー」の7章～9章**について学びメモを残します。

```
第I幕　Netscape：マネージャー

7章　パフォーマンスに関する質問
    7.1　チェックリスト・センテンス
    7.2　すべてが変わる

8章　ランズおすすめの時間節約術
    8.1　ブラウザ
    8.2　スマホ
    8.3　電子メール
    8.4　人生

9章　新任マネージャーのデス・スパイラル
    9.1　よーい、ドン
    9.2　最初は面と向かって
    9.3　やがて、陰で
    9.4　管理職に就くことは昇進ではない

第II幕　Apple：ディレクター
```

# 前の記事

https://qiita.com/w2mjra555/items/7ad432dbc99dd2a921c0

## 7章　死神になるな、コーチであれ

ロップ氏は**上司からのフィードバックを、毎月受ける**ことを推奨しています。
![パフォーマンス質問.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/4f3ce79b-907a-9f37-c4ca-d9a21126cf22.png)

**「コーチか死神か」** と、シェイクスピアのようにインパクトあるフレーズが登場します。

> あなたはコーチのような姿勢や態度で臨まなければなりません。パフォーマンス管理のスイッチが入っていれば、あなたの態度は**死神のようなもの**になってしまいます。コーチか死神かによってどう思われるかが決まります。

- パフォーマンスに関わる状況は、多くの場合**コーチングの余地**がある。
- **様々な視点の価値**を学び、**共感**を築き上げ、より良いコーチ、より良いリーダーになる。
- パフォーマンス管理なんて **「しなくてよい」** 状態にする。

:::note info
コーチングはときに**嫌な気持ちになるし複雑で時間がかかる。
その上、手ごたえもつかみにくい**とはっきり書かれています。
それでも**積み重ねる価値がある**ということですね。
:::

## 8章　1分1秒大切に(そして嵐の前の静けさ)

ロップ氏は**自身の時間の節約に投資する**ことを推奨しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/6e756868-73a0-30be-a528-6dc50921dc21.png)

この章はとにかく**具体的(過ぎるくらい)な実践方法**が展開されます。

全体的にピリ辛というか、なんとなく**ヒリヒリした読後感の示唆**が多いこの本。
その中で比較的、**読者への攻撃力(？)** が柔らかい章だと思います。

- 時間を適切に使うことに徹底的にこだわる。
- **1分1秒大切に。塵も積もれば山となる。**

:::note info
続く9章を読んでから改めてふりかえると、ここは**嵐の前の静けさ**感があります。
:::


## 9章　任せるのは、不安になるほど、たくさん！

ロップ氏は**聴き、伝え、任せ、多様性あるチームをつくる**ことを推奨しています。
![デススパイラル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/ecc5a11c-abc6-79b6-c8c6-7e1e82d726e6.png)

**「第I幕　Netscape：マネージャー」の終幕(いわばクライマックス)** だけあります。
8章の無風・凪ぶりは一体なんだったんだ…？　と思うくらい**怒涛のデス・スパイラル**です。

内容の本質は、とてもよくある新任マネジャーのやらかし代表例みたいなもの。
ほかの本でも同じようなことは書かれているかもしれませんが、実感というか、**ああ、あれね！**　というリアリティが、**エンジニアにはたまりません。**

この本の魅力は **『自分ごと化』をうながす強烈な説得力**だと、とくに実感する章でした。
おかげさまで、グラレコもどきも**じゃっかん渋滞気味**ですね。

- マネジャーはプレイヤーの延長線にはない。**レベル1になる**意識と覚悟で再出発。
- **チームは自分より多くの情報を持っている**と理解し、耳を傾けて視点や判断を変える。
- 意見は**賛成によっては洗練されない。健全な不一致を通じて**より力のあるものになる。
- 質の高い仕事を自分が、ではなく、**仕事の量が増えても質を維持できるチーム**をつくる。

:::note info
読むと**なにかしらの古傷が疼く**人も多そうな章ですが、それだけに**おすすめ！**
:::

## ここまでの雑感
「第I幕　Netscape：マネージャー」読了！
ここまでに語られたことは、当たり前で、ささやかで、でも実践が難しいことばかり。

サブタイトルを見返すと… **「ささいなことをていねいに」** と。
なるほど。**タイトルに偽りなし**なのだな、とここまでだけでもわかります。


**がぜん、第II幕と第III幕も楽しみです！**

## 続きの記事

https://qiita.com/w2mjra555/items/c33f2069262d53b6c818
クロスブラウザメモ

クロスブラウザ対応について実装メモ。

１．colタグにwidth要素を付与しても一部想定外のレンダリングになる
safari,Edge(EdgeHTML)では指定した幅通りにレンダリングされない。
とりあえずtd要素に対してwidth styleを個々に指定していくことで対応する。

２．一部チェックボックスが表示されない
safari,Edge(EdgeHTML)ではappearance:noneをappearance:checkboxで
上書きできてない？ベンダーサフィックスの設定がないから？
appearance:auto(!important)だったり-Webkit-appearance:auto(!important)
みたいな対応を行ってみる
【随時更新】プログラミングの公式サイトまとめ

## 背景
- プログラミングの公式サイトは英語が基本なので、検索でトップに出てこないことも多い。
- よく使用するようなプログラミングの公式サイトをまとめておいて、検索で困ることがないようにしたい。

## 各種公式サイト
- UCI Machine Learning Repository
    アメリカの大学が運営している機械学習のデータセットを配布しているサイト。
    商用利用も可能なデータセットも多いので、教材作成に役立つ。

https://archive-beta.ics.uci.edu/

- pythonの標準ライブラリの公式サイト

https://docs.python.org/ja/3/library/index.html

- AWS CDKのAPIリファレンス

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-construct-library.html

- pandasの公式サイト

https://pandas.pydata.org/

- matplotlibの公式サイト

https://matplotlib.org/

- serbornの公式サイト

https://seaborn.pydata.org/

- numpyの公式サイト

https://numpy.org/

- Fortranの公式サイト

https://fortran-lang.org/en/

- jupyterの公式サイト

https://jupyter.org/

- AWSのドキュメントのトップページ

https://docs.aws.amazon.com/ja_jp/index.html

## 参考資料

## 個人ブログ

https://takuma-tech.com/2022/09/27/192/
【随時更新】無料で学べるプログラミングの優良教材まとめ

## 背景
- インターネットには、びっくりするぐらい優良な学習教材が無料で転がっていたりする。
- 自分が将来勉強したい、こういうサイトがあるのは知っておいた方がいいなと思ったサイトをストックしておこうと思った。

## 各種教材、サイト
- quita、いつもお世話になっている。
  ナレッジシェアサイトなので、体系だった教科書のような記事は少ないが、実務ではクリティカルな問題への対処法とかが多いので助かっている。

https://qiita.com/

- zenn
    quitaのライバル、書籍の販売とかgithub連携ができるのが強み。
    元々個人開発でスタートしたサービスらしいが、クラスメソッドに買収されたらしい。
    個人開発の夢が広がる話ですよね〜。

https://zenn.dev/

- stackoverflow
  世界最大？と勝手に思っているが、プログラミングのQ&Aサイト、英語圏のサイトなので、基本は英語だけどG翻訳とコードを見てフィーリングで情報をサルベージしている。

https://stackoverflow.com/

- 京都大学の運営しているyoutubeチャンネル
    普通に大学の講義が無料で見えたりする動画もある。

https://www.youtube.com/user/KyoDaiOcw

- AWSによるクラウド入門
    東京大学の先生が作成したAWSの教材。授業で使ってるものを有難いことに無料で公開してくれている。
    さらっと見た印象だが、AWSのことが体系的に学べそうな教材になっている。
    最初は、AWSの書籍なんか買わなくてもこの先生の教材をするだけで良いかも？

https://tomomano.gitlab.io/intro-aws

- AWSの公式youtubeチャンネル
    AWSの現役のエンジニアがセミナーしてくれている動画などが豊富。
    どういうサービスなのかまず知りたいときなどに該当サービスのセミナーなんかを見たりしている。
    また、ゲストを呼んだバージョンなどもあるので、AWSエンジニアの情報収集する番組としても面白いと思う。

https://www.youtube.com/c/JPAmazonWebServices

- DevelopersIO
    クラスメソッドが運営する技術メディア
    AWSのインフラエンジニアになってからすごくお世話になっている。
    マニアックな実装の記事なども豊富で、日本のAWSエンジニアは全員知っている気がする。
    本当にいつもありがとうクラスメソッドさん。

https://dev.classmethod.jp/

- UTokyo OCW
    東京大学が無料で講義資料を公開しているサイト。

https://ocw.u-tokyo.ac.jp/

- Linux標準教科書
    Linuxの標準教科書。
    全部読み込みたい。
    
chrome-extension://dnkjinhmoohpidjdgehjbglmgbngnknl/pdf.js/web/viewer.html?file=https%3A%2F%2Fwww.cse.ce.nihon-u.ac.jp%2Fdownload%2Flinux.pdf

- 予備校のノリで学ぶ「大学の数学・物理」
    大学の理系の数学・物理を予備校のテンションでわかりやすく教えてくれる。
    学生時代のテスト期間にすごくお世話になった。
    今でも数学系の話の解説はよく見てお世話になっています。

https://www.youtube.com/c/yobinori

- シキノート
    gunplotで困ったことがあればここ。
    すごいというかもはやgunplotへの執念を感じるレベル。

https://slpr.sakura.ne.jp/qp/home/gnuplot/

- 偏微分方程式の教科書の一部？
    偏微分方程式の教科書の一部と思われるPDFファイル
    結構丁寧に解説されていると思う。

chrome-extension://dnkjinhmoohpidjdgehjbglmgbngnknl/pdf.js/web/viewer.html?file=http%3A%2F%2Fwww.cc.u-ryukyu.ac.jp%2F~simabuku%2Fden3pdf%2Fnote-5.pdf

- 熊本大学が公開している統計学の演習問題

http://msec.kumamoto-u.ac.jp/problem/problem3.html

-　統計学の演習問題

http://www.math.s.chiba-u.ac.jp/~yasuda/statEN2/statENSYU.html


## 何かを調べるときのコツ
- 大学教員の手づくり教材や教科書の一部だと思われるPDFファイルは結構ネット上にある印象。
- 大学の授業の教材でありそうな内容については、結構転がっているので本を買う前に良さげなPDFファイルがないか探すのはアリだと思う。

## 参考資料

## 個人ブログ

https://takuma-tech.com/2023/01/11/362/
Blender奮闘記①

# Blenderの勉強を始める
自分が何をやりたいかを考えたときに、Blenderを用いてオブジェクトを作れるようになっていた方がいいなと思い、手を付けだしました。

大昔に何度か触ったくらいで、もはや塵一つも知識は残っていないです。

ひとまず、わかりやすい動画があるので、そちらを参考に作成、見ずに作成、新しいものを作成でおさらいの順でどんどん作ってみようかと思う。

今回自分が使用するのはBlenderのVersion 3.1.0です。

# 参考

とても分かりやすく、どのような手順で作成すればいいのかがわかるため、yukiさんのyoutube動画を元に作成させていただく。
元の動画は以下に。
<iframe width="560" height="315" src="https://www.youtube.com/embed/aPpg456Qdr4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# 途中経過

クリームソーダを作ってみよう!で、クリームソーダといえば、やっぱりメロンソーダでしょと、動画とは違う色を設定。![クリームソーダ途中.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782192/ae6be155-1ed2-b8f5-2184-140b42bfb99f.png)

なんだか青汁っぽい気がしますが、メロンソーダだと言い張り、とりあえずそのまま進めます。

![クリームソーダ途中_氷まで.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782192/f28ab67e-f6c3-1b10-5309-67b743d82cb8.png)

氷ができました。それっぽくなってきました。

![アイスクリームができた.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782192/de09bb30-92dc-4dd9-3ab0-0f00cd69324f.png)

アイスが載ると本当にメロンソーダっぽくなってきました。

![完成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782192/6258f8bf-24ed-a9db-326b-d38bafa80c55.png)

UV球を生成し、形を歪ませてサクランボを作りました。[マテリアル]設定で赤色に塗り、アイスの横に置くと動画のメロンソーダ作成部分は完了!!

背景を作成し、見やすくします。自分はメロンソーダを作成したため、光が反射し緑色っぽい背景になるかなと作成しました。

![背景付き.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782192/4a00ba74-a37c-8bf4-ffcb-7ce869de9964.png)

動画の最後のようにカメラの設定をし、カメラからのぞいたらこんな感じになりました。

![F12を押して完成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782192/cbfb3ce0-83e5-00ad-77d8-acc27b4a1dd2.png)

これで初めてのBlender勉強は完了。yukiさんの動画は本当にわかりやすくてよかったです。どんどん作っていきたいと思います。

# 補足

動画の中に出てくるIORとは、屈折率（Index of Refraction）のことらしい。
[たまたくのblender備忘録的な物。](http://tmtk3dcg.blog.fc2.com/blog-entry-3.html)
によると似たようなIORを設定することで、より似せた表現ができるそうだ。
今回の場合は
|対象物|屈折率(IOR)|
|:--:|:--:|
|ガラス|1.51714|
|水|1.33335|
|氷|1.309|

を設定すればよりリアルなものが作れるのかもしれません。

# サブディビジョンサーフェス
動画の中で何度も適用していますが、これが何なのかを調べました。
サブディビジョンサーフェスはモディファイアの一つのことだそうです。
モディファイアとは下記のサイトによると、「オブジェト自体には手を加えずに、様々な効果を適用する事があできる」(抜粋)ものだそうです。便利ですね。
[神音の社](https://shion-no-yahiro.com/subdivision-surface/)

その中でもサブディビジョンサーフェスは少ないポリゴン数で滑らかな表面を作成することができるため非常によく使う機能だそうだ。
ただし、デメリットとしてサブディビジョンサーフェスを適用すると適用物は多少小さくなってしまうそうだ。
オブジェクトそのものに手を加えないモディファイアではあるが、メッシュを小さくすることで滑らかな表面を実現するのがサブディビジョンサーフェスという認識でいいんでしょうかね。そうなら適用するとどうしてもオブジェクトが小さくなってしまうのもうなずけます。[神音の社](https://shion-no-yahiro.com/subdivision-surface/)さんの中では、割と初期段階からかけ、変形後の姿を見ながらモデリングするのがおすすめとのこと。だからyukiさんの動画でも個々の物体を作る度にサブディビジョンサーフェスを適用していたのかと納得しました。

# ベベル
これまた動画の中で何度も設定されていますが、ベベルという機能についても調べました。
[Blender modeling](https://docs.blender.org/manual/ja/3.1/modeling/meshes/editing/edge/bevel.html)
上記サイトによると、面取りのことをベベルと言っているようです。

滑らかな角を作るためにベベルを適用しているようですね。

# 終わりに
今回はyukiさんのBlender動画を見ながら作りました。
次は、見ずに同じものを作成して知識の定着具合を確認したいと思います。
go言語で新しいプロジェクトを作る(go v1.18)

### プロジェクト作成とHello World
Go(v 1.18)で新しいプロジェクトを作るにはまずプロジェクト用に適当なフォルダをつくります。
たとえばwebappフォルダを作ります。私はubuntuを使っていますが、Windowsを使っている人はGUIからフォルダの作成をしてください。
```
$ mkdir ./webapp
```
そしたらまずはここがgoのプロジェクトのフォルダだと宣言します。
```
$ cd ./webapp
$ go work init
```
実際に作業をするのはモジュールのフォルダなのでモジュール用フォルダを作ります。
```:webapp
$ mkdir ./helloworld
```
ここでここがモジュールのフォルダだと宣言します。
```:webapp
$ cd ./helloworld
$ go mod init example.com/webapp/helloworld
```
なお、パッケージとして一般公開したい場合はモジュール名にちゃんと命名規則があるようです。
参考： https://go.dev/blog/package-names

できたらここがプロジェクトの一部だと宣言します。
```:webapp/helloworld
$ go work use .
```
できたらプロジェクトの準備ができたのでmain.goを書きます。
```:webapp/helloworld
$ touch ./main.go
```
このmain.goを開き、こう書いてください。
```go:webapp/helloworld/main.go
package main

func main() {
	fmt.Println("Hello World")
}
```
できたらビルドして実行しましょう。するとHello Worldが出力されます。
```:webapp/helloworld
$ go build .
$ go run .
Hello World
```
なお、実行はこういうやり方でもできるはずです。
```
$ go build example.com/webapp/helloworld
$ go run example.com/webapp/helloworld
```

### サブパッケージ
今度はサブパッケージをつくってみます。
```:webapp/helloworld
$ mkdir ./subpackage
$ cd ./subpackage
$ touch subpackage1.go
```
このsubpackage1.goの中にこう書きます。
```go:webapp/helloworld/subpackage/subpackage1.go
package subpackage

func Hello1() (str string)  {
	return "Hello subpackage 1"
}
```
もうひとつサブパッケージをつくります。
```
$ touch subpackage2.go
```
```go:webapp/helloworld/subpackage/subpackage2.go
package subpackage

func Hello1() (str string)  {
	return "Hello subpackage 2"
}
```
これだけでサブパッケージの呼び出しができるようになります。
main.goを書き換えて呼び出してみます。
```go:webapp/helloworld/main.go
package main

import (
	"fmt"
	"example.com/webapp/helloworld/subpackage"
)

func main() {
	fmt.Println("Hello World")
	fmt.Println(subpackage.Hello1())
	fmt.Println(subpackage.Hello2())
}
```
これを実行してみます。
```:webapp/helloworld
$ go build example.com/webapp/helloworld
$ go run example.com/webapp/helloworld
Hello World
Hello subpackage 1
Hello subpackage 2
```
ちゃんとstringの値がサブパッケージから取得できていることが確認できました。

### 最後に
モジュールをうまくわけてかいてマイクロサービス的な作り方ができればモダンでいいと思います。
アヘ顔をDCGANで自動生成しようとした。

どうも、山田永昌です。

突然ですが、アヘ顔はご存知ですか？

ウィキペディアによるとアヘ顔とは
```
ポルノグラフィのコンピュータゲーム（アダルトゲーム）、漫画、アニメ（ヘンタイ）でしばしば使用されて
いる、性行為の最中における架空のキャラクターの表情を表現した日本のポルノの用語。
```
らしいです。

ということで今回はDCGANを使って、アヘ顔を自動生成させていきたいと思います。


コードは以下をパクって改造したやつを使いました。
https://www.kaggle.com/code/aneesh10/dcgan-on-pok-mon-images

トレーニングデータとして、ネットから一枚一枚保存していった画像７０枚ほどを使いました。
数が非常に少ないのは、これ以上すると中学生である私のパソコンの履歴が１８禁ものばかりになってしまうのでしょうがありません。

# 上手くできたやつ
100エポックほど回しましたが、それを全部載せるのは面倒なので、良さげのを２つだけ載せます。
![ダウンロード (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/795753/ddf984dc-7075-090c-7bb8-f2d52087f225.png)
![ダウンロード (17).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/795753/5fe4cb5e-a0a9-34da-1cf7-ac9559f0312e.png)
かなり荒い原因は、やはりデータ数が足りないことが大きいでしょう。

今度、エロ漫画を大量に保有してる友人からデータをもらおうとしているので、もらい次第学習させたいと思います。それを次回書こうと思っています。
【数学】テイラー展開（Taylor expansion）の復習とPythonでテイラー展開をする方法

## 背景
- 久々に、学生時代に研究していた流体解析がしたくなった。
- 学生時代は、流体解析に使用する数式の導出や原理の理解までできていなかった。
- 流体解析をなんとなくではなく、自分なりに理解して楽しく分析して記事にしたいと思った。
- 復習しはじめたが、数値解析の基本となるテイラー展開への理解が浅かったので復習してみた。

## お願い
- 数学科出身とかいうわけではないので、解釈違いや間違いがあれば是非優しくご指摘ください。

## 目標
- 数値解析に必要なテイラー展開の知識を復習する。

## テイラー展開と数値解析の関係
- そもそも、数式の解は

    1. 解析解：理論的・代数的に算出できる解のこと
        - 厳密に求められるが式の形状によっては導出が困難になる。
     
    2. 数値解：数値計算によって得られる解のこと
        - 計算機でゴリゴリ計算するので、大抵の解は求められるが誤差を含む。
    
の2種類に分けられる。

- パソコンは最終種的に全ての情報を2進数（01）で処理する都合上、解析解を求めるのは不得意である。
- 基本的にパソコンで使用されているπなどは何かしらの方法で近似された有限な数字で置き換えられて計算されている。
- その中でも、微分方程式を離散化する際にテイラー展開はよく使用されている。
    離散化：連続した関数などを何かしらパソコンが処理できるような別の数式への変換を行うこと
- 物理の基礎方程式は大抵、微分方程式なので、差分法で数値解析をするならテイラー展開を使用する。

■基礎方程式の例
- ニュートンの運動方程式

$$ma = m\frac{d^2\vec{r}}{dt^2} = \vec{F}$$


- 今回はそもそもテイラー展開ってなんだっけ？ということを復習して、数値解析への理解を深めようと思う。

## テイラー展開
- とりあえず、説明の前に公式をドン。

===テイラー展開の公式===
無限回微分可能な関数$f(x)$について、

$f(x) = f(a) + f'(a)(x-a)+\frac{f''(a)}{2!}(x-a)^2 + ··· + \frac{f^{(n)}(a)}{n!}(x-a)^n + ···$

$ =  \sum_{n=0}^{∞} \frac{f^{(n)}(a)}{n!}(x-a)^n$

を$f(x)$の$x=a$のテイラー展開という。
特に$a=0$としたものをマクローリン展開という。

引用：https://w3e.kanazawa-it.ac.jp/math/category/suuretu/suuretu/henkan-tex.cgi?target=/math/category/suuretu/suuretu/taylor.html

- なぜ、テイラー展開が成り立つかの証明はわかっていないので、スルーする。
- とにかく数値解析的に大事なことは、連続な関数$f(x)$を右辺のような多項式で近似（離散化）できるということである。
- これで難しい微分方程式も、テイラー展開で離散化して、差分法を適用すれば数値解を求められるようになる。
- 微分方程式の差分をどう使っていくのかという話は勉強してまた記事にする予定。

## pythonでテイラー展開をする
- pythonには、テイラー展開を実現できるsympyというライブラリがある。
- テイラー展開ができるsympyのseriesを紹介する。
- 説明には、例として$f(x)=e^x$のテイラー展開を行う。

```Python:テイラー展開をpythonでする方法
#sympyをインポートする
from sympy import*

# 変数として使用するシンボルを定義
x = Symbol('x')

#引数は series(展開する関数, x=使用する変数, x0=展開点, n=展開次数)
taylor_result = series(exp(x), x=x, x0=0, n=3)
print(taylor_result)
```

```:結果
1 + x + x**2/2 + O(x**3)
```

- 結果を見やすくしたもの
$1+x+\frac{x^2}{2}+O(x^3)$

- $f(x)$をつけて表記
$f(x) = 1+x+\frac{x^2}{2}+O(x^3)$

- $o(x^3)$は剰余項。
- テイラー展開はあくまで関数の近似なので、どこかで展開を打ち切ることになる。
- 剰余項はその打ち切り誤差分を表す記号。

## テイラー展開前の式と展開後の式にx=1を代入にして値を比較してみる。

（1）展開前式に$x=1$を代入

$f(1) = e^1= 2.718・・・$

（2）展開後の式に$x=1$を代入（剰余項は無視）

$f(1) = 1+1+\frac{1^2}{2} = 2.5$

- 3次までの近似しか行っていないので、まだ誤差が大きい。
- 更に展開する次数を上げていけば精度は良くなる。
  
## おまけ
- sympyを知った時は「こやつすげぇな」と思った。
- 数学系の記事を書いたのは初めてだったが、流れに沿って綺麗に数学の理論を伝えるのはすごく難しいと感じた。
- 後、lataxの数式記述するのすごくめんどくさかった。lataxの生成ツールはどこかにないですかね？


## 参考資料
https://masa-cbl.hatenadiary.jp/entry/20130429/1367247054#:~:text=%E8%A7%A3%E6%9E%90%E8%A7%A3%E3%81%AF%E7%90%86%E8%AB%96%E7%9A%84,%E8%A7%A3%E3%82%92%E5%BE%97%E3%82%8B%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81%E3%81%A7%E3%81%99%E3%80%82

https://ja.wikipedia.org/wiki/%E6%95%B0%E5%80%A4%E8%A7%A3%E6%9E%90

https://w3e.kanazawa-it.ac.jp/math/category/suuretu/suuretu/henkan-tex.cgi?target=/math/category/suuretu/suuretu/taylor.html

https://watlab-blog.com/2020/05/05/sympy-taylor-series/

https://qiita.com/sci_Haru/items/33b8e36655f20f7f3c12

https://docs.sympy.org/latest/modules/series/series.html

## 個人ブログ

https://takuma-tech.com/2023/01/10/361/
【Rubocop】rubocop -Aを実行する前はexcludeを設定しておく

# Rubocopの自動修正
Rubocopの自動修正、rubocop -a や rubocop -Aは痛快なコマンドで、間違っているところを一括で全部直してくれる。使った後はなんか清々しい気持ちになる。
ただし、初めて利用する際の注意点もある。
それは、実行前にRubocopをよく設定していなければ、Rubocopの対象とすべきでないファイルにも自動修正をかけてしまうことである。
これをやってしまうとgithubでPRした時にchangedのファイル数がえげつないことになる.


# rubocop.yml
rubocop.ymlにあらかじめ対象から除外したいファイルを指定しておくのが良い。
以下は設定の一例である。
```AllCops:```の下に```Exclude```とある。この下に除外したいファイルを指定していく。ここで```*``` はワイルドカードなので```bin/**/*```と指定しておくことでbin以下のファイルを全て対象外とすることができる。
```yaml:rubocop.yml
inherit_from:
  - .rubocop_airbnb.yml

Rails:
  Enabled: true

AllCops:
  Exclude:
    - 'bin/**/*'
    - 'db/**/*'
    - 'config/**/*'
    - 'vendor/**/*'
    - 'tmp/**/*'

Layout/LineLength:
  Max: 120

Airbnb/ModuleMethodInWrongFile:
  Description: Define a module method in the file that defines the module, not a file that
    happens to use the module as a namespace.
  Enabled: false
  Include:
    - 'app/**/*'
    - 'lib/**/*'
  ```
【Python】二次元配列の標準入力をリストの内包表記で受け取りたい【AtCoder】

# 書いてあること
* 二次元配列の入力の受け取り方
* リストの内包表記
# 記事執筆の経緯
こんな入力を受け取りたいのですが…
```python:input.py
H W
A11 A12 ... A1W
A21 A22 ... A2W
AH1 AH2 ... AHW
```
「え、どうすればいいの？？」
とやり方をど忘れしたので、備忘録がてら記事を書くことにしました。
# 環境
Python(3.8.2)
~~※実行速度のこと考えるならPyPy3の方がいいです、多分動きます。~~
⇒PyPy3(7.3.0)でも動きました
# 本題のコード
```python:main.py
H, W = map(int, input().split())
A = [[int(x) for x in input().split()] for i in range(H)]
```
# リストの内包表記とは
:::note info
簡潔に言えば、for文を使って配列を生成する方法です。
:::
以下のように使えます。
> `[式 for 任意の変数名 in イテラブルオブジェクト]`
> （[note.nkmk.me](https://note.nkmk.me/python-list-comprehension/ "Pythonリスト内包表記の使い方")さんからの引用です、いつもお世話になっております）
<dl>
  <dt>式</dt>
  <dd>int()とか、この式の出力結果がそのまま配列の要素となる</dd>
  <dt>任意の変数名</dt>
  <dd>iとかkとか、イテラブルオブジェクトの中身が一つずつ順番に入る</dd>
  <dt>イテラブルオブジェクト</dt>
  <dd>配列とかrange関数とか、for文で回せるやつ</dd>
</dl>
実際に使ってみます。

```python:ex1.py
x = [i*3 for i in range(10)]
print(x)
>>> [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
# 0-9までの要素を一つずつiに取り出し、i*3に入れている
# i*3の結果を一つずつ新たに生成する配列の要素として格納している
```
```python:ex2.py
# 以下の入力を受け取りたい
# 1 2 3 4 5 6 7 8 9 10
A = [int(x) for x in input().split()]
print(A)
>>> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 入力を空白区切りでイテラブルオブジェクトとして取得
# それを一つずつint()に渡し、
# その出力結果(int型にキャスト)を新たに生成する配列の要素として格納している
```
見た目難しそうなのに結構中身単純ですね。

# 本題のコードの解説
内包表記がネストになっていて少し複雑ですが、ネスト外側の内包表記から見ていくと理解しやすいかも。以下、コード再掲。
```python:main.py
H, W = map(int, input().split())
A = [[int(x) for x in input().split()] for i in range(H)]
```
## 外側の内包表記の意味
```python
A = [[内側の省略] for i in range(H)]
```
range(H)を式[内側の省略]に入れて繰り返すよって意味。でも、式[内側の省略]にはiが使われていないため、式[内側の省略]をただただH回繰り返すよって意味になっている。
## 内側の内包表記の意味
```python
A = [[int(x) for x in input().split()] 外側の省略]
```
リストの内包表記を解説したところで出したex2.pyと同じ意味。
一行の空白区切りの入力を受け取って、それを配列化する。
## 本題のコードの動き
外側のfor i in range(H)のiが一つ進む度に読み込む入力の行が一つ進み、
入力を一行もらっては一次元の配列にし、それを二次元配列の要素として組み込む。
# 終わりに
誰かの参考にしてもらおうと言うより、自分自身のメモとして自己満足のために書いた記事です。ミスがあってもスルーしていただくか、お手柔らかにご指摘をしていただけると幸いです。
AWS Step FunctionsとAmazon Pinpointでプッシュ通知処理を実装した

## 概要
複数の通知をそれぞれの対象者に向けてプッシュ通知する流れを実装しました。

### 使用したサービス

- AWS Step Functions
- Amazon Pinpoint
- AWS Lambda

## アーキテクチャ
 
[AWS workshop](https://catalog.us-east-1.prod.workshops.aws/workshops/070a93a2-3373-4736-8af0-f7a08c9eb08a/en-US/marketing-automation#use-cases)にあったものを参考にしています。

![push_notice_qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192406/e2e91cc9-1ccb-f195-c12d-cd0e6a548f5e.png)


## 処理の流れ

流れとしては先程のとおりなのですが

1. 通知対象のリストを取得
1. (各通知に対して)対象ユーザーリストを取得、S3にファイル保存
1. S3に保存したファイルをもとにセグメント作成
1. セグメントが作成できたら
1. セグメントをもとにキャンペーンを作成
1. キャンペーンが成功したら
1. 終了

という流れです。
今回は通知する件数が複数ある想定なのでmapを使用して処理を実装しています。

## つまづいたところ
### VPC lambda内でpinpointに接続するのは辛い
ユーザーの管理をRDSで実施していたのですが、セグメント作成するlambdaでターゲットユーザーの取得をしてセグメントを作成する、となるとVPC lambdaからpinpointへ接続する必要がありました。ただその場合、NATゲートウェイを用意してインターネット経由でアクセスしないといけない、とややこしい設定が必要でした。(9月10日に[公式](https://docs.aws.amazon.com/ja_jp/vpc/latest/privatelink/aws-services-privatelink-support.html)を確認したらpinpointもVPC endoint対応していたので不要かもです...)
なので今回はworkshopにあったアーキテクチャよりlambdaを増やしてRDSの操作をするlambdaとpinpointの処理をするlambdaを分けました。

### S3に配置したファイルからセグメントを作成する時に使うのはcreate_segmentではない
今回のlambdaはpythonで実装しているのですが、セグメント作成では名前的に`create_segment`を使うのだろうと勝手に思い込んで実装を進めていました。ところがどっこい、S3に配置したファイルを使ってセグメント作成するには`create_import_job`を使うのです。

### StepFunctionsのmapとparallel内でのエラーハンドリングは大切

今回は複数の通知を処理する必要があったため、StepFunctions内でmapを使用しました。
実装をして動作確認をしている中で通知Aの処理中にエラーが発生してしまったことで、全体の実行が失敗に終わってしまい、並行で処理されている通知Bの処理が途中で強制終了されてしまう。ということがありました。
map処理では並行に複数の処理が走っている場合、どれか一つがエラーになると他の処理が強制終了されて失敗のステータスになってしまいます。そうすると、通知Bは正常に送信されるはずだったのに送信されなかった、、、ということが発生してしまいます。それは困るのでエラーハンドリングをきっちりする必要があります。
lambdaのtaskにcatch処理を追加するのです。lambda内でエラーが発生した場合に遷移する先なのですが、こちらの遷移先をfailにしてしまうとやはり全体が失敗となってしまうので、passのステートを遷移先に設定します。これにより、エラーが発生しても実行自体は失敗にならずに他の処理に影響を与えずに済みます。
ただし、今回はエラーが発生したことは把握したかったのでLambda内でput metric dataを使用してエラー監視をするようにしました。

## 悩んだところ
### lambda部分をAPIを直接呼び出す形にするかどうか
StepFunctionsのいいところのひとつはLambdaを作成せずに直接APIを呼び出せることかなと思います。
そこで、セグメントやキャンペーンの作成をAPIで完結してしまおうかとも思いました。
しかし、以下の理由から今回はlambdaを使って実装することにしました。
- StepFunctionsは途中のステートから実行することができない
API指定にすると各処理ごとでの動作確認ができず、毎度最初から実行する必要があります。Lambda実装にするとそれぞれの処理での動作確認ができてデバッグしやすいと思ったので今回はLambda実装にしました。
もっとシンプルな設計だとAPIでもいいかなぁと思います。
- pinpointで.syncを使えなかった
stepfunctionsでAPI実行にすると、サービスによっては.syncを使用することができます。これを使用することで、例えばsagemakerで学習をする場合、stepfunctions内で定期的に学習ジョブのステータスを確認する処理を入れなくても.syncを設定することで学習ジョブが完了するまでステートがそこで待ってくれます。[workshop](https://catalog.us-east-1.prod.workshops.aws/workshops/070a93a2-3373-4736-8af0-f7a08c9eb08a/en-US/marketing-automation)の設計にもある通り、lambdaでセグメントやキャンペーンのステータスを確認する処理を入れているのですが.sync使ったらこのlambdaいらないじゃん！！と感動しました。しかしなんと、pinpointはこの.syncに対応していなかったのです...([参考](https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/connect-supported-services.html))API使用を検討する前にLambdaで実装しはじめてしまっており、設計がシンプルになるならAPIに変更しようと思っていたのでシンプルにならないならLambdaのままでいいやーとなりました。
- (API使用の設計に変更してからの動作確認が面倒だった)
前項にも記述したとおり、すでにLambdaで実装を進めていた状態だったのでAPIに変更した後に動作確認するのが面倒だなー()と思ってしまったので諦めましたw
検討タイミングが実装前でもっとシンプルな設計だったらAPI使用で実装したい！！
【MySQL】mysql-serverパッケージとmysql-clientパッケージ

# mysql-server
データを永続的に管理し、クエリ（コマンド）を使って処理するためのデータベースを提供する。データの入れ物を用意する。
# mysql-client
その上記のデータベースに接続して、クエリを送信するインターフェースを提供する。
入れ物に入ったデータを取り出したり整理したりするための道具を用意する。
Jetpack Composeのbuild.gradleをKotlin 1.7.10に対応させる。

業務でSwiftUIを１年半ほど触っていたのですが、最近Jetpack Composeに触り始めて、そのCodelabの充実とモジュールの柔軟さに衝撃を受けております。

# Firebaseを使いたい
趣味で開発しているアプリのデータベースにFirebaseを使いたいなと思い、調べていたところ、Firebaseから素晴らしい[公式のサンプルプロジェクト](https://firebase.blog/posts/2022/04/building-an-app-android-jetpack-compose-firebase)が出ていました。こちらを写経しつつ自分のアプリに組み込もうとしていたら、ビルドで詰まりました。

# エラー内容
どうやらどこかのmetaデータのKotlinバージョンと実際のバージョンが合っていない模様。

```kotlin
/Users/(username)/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.7.0/(hash)/kotlin-stdlib-common-1.7.0.jar!/META-INF/kotlin-stdlib-common.kotlin_module: 
Module was compiled with an incompatible version of Kotlin. 
The binary version of its metadata is 1.7.1, expected version is 1.5.1.
```

# デフォルトではKotlin 1.5.31
なんでか「Empty Compose Activity」で自動的に設定されるCompose Compilerのバージョンは1.1.0-beta01、Kotlinのバージョンは1.5.31となっております。そのままではFirebase用のimplimentationを色々追加した後だと、ビルドが通りません。

# 結論：build.gradle(Project)
Kotlinのバージョンを1.7.10に上げて、それに合わせてCompose Compilerのバージョンを1.3.0にします(20220911時点で最新安定版)
KotlinとCompose Compilerの対応関係は[こちら](https://developer.android.com/jetpack/androidx/releases/compose-kotlin)を参照。


```kotlin
buildscript {
    ext {
        compose_version = '1.3.0' // <- 変更箇所１
    }
    ....
}
plugins {
    id 'com.android.application' version '7.2.2' apply false
    id 'com.android.library' version '7.2.2' apply false
    id 'org.jetbrains.kotlin.android' version '1.7.10' apply false // <- 変更箇所２

}

task clean(type: Delete) {
    delete rootProject.buildDir
}
```

# 結論: build.gradle(App)
この部分がこの記事の肝です。compose_versionの箇所を具体値(1.2.1)に変更します。(compose_versionだと1.3.0になるが、これに該当するものが(20220911時点で)ないため -> [参考](https://developer.android.com/jetpack/androidx/releases/compose-ui?hl=ja))





```kotlin
dependencies {
    implementation 'androidx.core:core-ktx:1.7.0'
    implementation 'androidx.appcompat:appcompat:1.4.1'
    implementation 'com.google.android.material:material:1.5.0'
    implementation "androidx.compose.ui:ui:1.2.1" // <- 変更箇所１
    implementation "androidx.compose.material:material:1.2.1" // <- 変更箇所２
    implementation "androidx.compose.ui:ui-tooling-preview:1.2.1" // <- 変更箇所３
    implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.0'
    implementation 'androidx.activity:activity-compose:1.5.0-alpha01'
    implementation "androidx.navigation:navigation-compose:2.5.0-alpha01"
    implementation 'androidx.preference:preference-ktx:1.1.1'

    ....

    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
    androidTestImplementation "androidx.compose.ui:ui-test-junit4:1.2.1"　 // <- 変更箇所４
    debugImplementation "androidx.compose.ui:ui-tooling:1.2.1" // <- 変更箇所５
    debugImplementation "androidx.compose.ui:ui-test-manifest:1.2.1" // <- 変更箇所６
}
```

# まとめ
デフォルトで古いバージョンになるの、何故なんでしょう...。
build.gradle関連むずいです。
20代後半のインフラエンジニアが転職した話①　　勝手に転職エージェント比較

参考になれば！！（あくまで個人の感想）
・勝手に転職エージェント比較します
・おすすめ度を記載
・各エージェントのメリット、デメリットを記載
※エージェント社員さんごとの力量/得意業界によって合う合わないもあるので、この比較が全てではないです
※エージェント社員さんにとっては転職者は商品みたいなものなので、社員さんに「この人はできる！」と思ってもらえると対応がよくなるらしいです

前提
・20代後半インフラエンジニア
・SIerからの転職
・転職先候補は広めに見てた（外資ベンダ、ITコンサル、事業会社、SIer）
・転職動機は、給与≒スキル身に着けたい＞労働環境（ほぼ全部同じくらい欲張った結果、最後まで絞り込みずらかった。。）
・都内で転職

| エージェント会社 | おすすめ度 | メリット | デメリット | 感想 |
|:-:|:-:|:-:|:-:|:-:|
| リクルートエージェント  |◎  | 紹介企業数が多く、質も高い。情報を持っている/共有してくれる。 | 選択肢が多い分、自身で選択する必要がある  | 自分で選択できるなら、正直ここだけで賄える！あとは担当エージェント社員さん次第  |
| レバテック  | ◎  | エンジニア転職に特化、相談しやすい  | 紹介企業数はやや少ない  | 相談しやすい！（LINEでやりとり可）。業界知識がある  |
| マイナビエージェント  | △  | 紹介企業数が多い  |　紹介される企業の質（合う、合わない）がよくないことがある  | リクルートエージェントの方がクレバーに情報出してくれる分やりやすい  |
| クライス＆カンパニー  | 〇  | エージェントさんの質が高い  | ハイキャリア/30代～管理職向け（デメリットではないけど、20代後半には若干ハードル高め）  | 視座？高めな印象。20代には早かったかも。それでも印象◎  |
| JAC  |△  | 本人の希望に沿った企業紹介をしてくれる  | ITには強くない印象  | エージェントさん次第。。自身の希望をしっかり伝えることができれば、動いてもらいやすかったかも  |
| en world japan | 〇 | 外資系の企業に明るい  | システムが微妙（全てメールベース）  | 正直メールでも問題ない。。けど、リクルートエージェントでも外資系は賄えてしまう。。  |
| doda  | △  | 地方だと強いのかも？  | 書類通過率低めな印象  | あまり使わなかった。。  |
| Geekly  | △ | システムが使いやすかったような。。  | 紹介企業が微妙（合わない）  | あまり使ってない。。  |


番外編（スカウト）
| 会社| おすすめ度 | メリット | デメリット | 感想 |
|:-:|:-:|:-:|:-:|:-:|
| ビズリーチ  | 〇 | それなりに需要が分かる  | ヘッドハンター（エージェント）からの連絡がほとんど  | 使い方次第だが、結局エージェント使っているのと差がなかったりする。JAC、マイナビ以外はビズリーチからお声がけいただいた。  |
| Linked IN  | ？  | エンジニア同士の繋がりで転職できそう  | 繋がりの少ない20代は使いずらいかも  | 転職では使ってないので、正確な評価できない。。  |
| その他エージェント  | △  |   | 上記2つを使えばよさそう  | ビズリーチで事足りてしまう  |

（総評）
本当は転職エージェント使わずに、行きたい会社に直接応募がよいらしい。。（エージェントのビジネスモデル的にも、応募先に伝わる熱意的にも）
とは言え、ある程度選択肢を広げる/情報収集という意味ではエージェント使うのも個人的にはありかなと思います。
転職動機、目的を満たすことはできたので、エージェントを利用して満足はしてます。
とりあえず1社エージェント登録して職務履歴書作る→ビズリーチに載せる→反応のあった企業orエージェントに連絡もありかなと
エージェントからしてもよくわからない人より、ビズリーチで何かしら興味のあった人の方がやる気になりやすい気がするので。

普通はこんなにエージェント使う必要ないです笑
エージェント社員の当たりはずれ、合う合わないを考慮してもエージェントは2,3社で十分。
試しに色々連絡したら増えちゃいました笑
転職先候補の絞り込み方については、②転職先候補の絞り込み編で書こうかなと思ってます。

②転職先候補の絞り込み編はこちら

https://twitter.com/UmaUuma321/status/1571868754342215680
【TwitterAPI】Github草みたいなTwi草を作ってみた件

こんなのを作ってみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521440/9e432547-07c1-79d9-b23d-b06c8d12205f.png)

# Githubの草とは
GithubのOverviewで見れるこいつのことです。（プライベートアカウントなので緑地少なめです）
今回はASP.NET MVC 5（C#）で作ってみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521440/4da06931-aac0-a21e-9fef-87acc15c193f.png)

# TwitterAPIを使うには
APIキー・トークンです。詳しくは「[はじめてのTwitterAPI（やさしめ解説）](APIキー・トークン)」を読んでみてね。

# TweetinviAPIを使う
楽したかったので「[TweetinviAPI](https://github.com/linvi/tweetinvi)」というNuGetパッケージを使っています。

## NuGetパッケージの入れ方
ここから開いて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521440/f988dee7-5569-989a-18fc-ee8a3084c647.png)

「TweetinviAPI」で検索すると出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521440/9dacc8cf-6568-2c98-4d42-4b2aebdcaf97.png)

## 実際のコード
こんな感じで各種キーを渡せば認証ができます。
今回は指定したツイッターアカウントのタイムラインを取得する「Tweetinvi.Timeline.GetUserTimeline」メソッドを使っています。
※どうやら取得できる最大が200件のよう

レスポンスで投稿時間とかが取得できるのでいい感じに割り振って画面表示させています。

``` C#
using System;
using System.Collections.Generic;
using System.Web.Mvc;
using Tweetinvi;
using Tweetinvi.Models;

namespace SETools.Controllers
{
	public class WeeklyTwitterContributionsController : Controller
	{
		[HttpPost]
		public ActionResult Result(string twitterAccount)
		{
			//Twitter認証用セッション変数
			string api_key = "hogehoge";
			string api_secret_key = "hogehoge";
			string access_token = "hogehoge";
			string access_token_secret = "hogehoge";

            // 認証
            Auth.SetUserCredentials(api_key, api_secret_key, access_token, access_token_secret);

			// 直近200件のtweet取得
			var tweets = Tweetinvi.Timeline.GetUserTimeline(twitterAccount, 200);
```

# 成果物
今回作ったプログラムは以下のページにあります。
是非使ってみてください。
https://setools.tokyo/WeeklyTwitterContributions
【Googleスプレッドシート】Query関数が便利そうなので使い方を整理する

## 目次
[1. はじめに](#1-はじめに)
[2. 利用するデータ](#2-利用するデータ)
[3. 使い方（コピペ可）](#3-使い方コピペ可)
[4. 参考にしたサイト](#4-参考にしたサイト)

## 1. はじめに
Googleスプレッドシートの「Query関数」でselect句が使えるとの事で、Vlookup関数より便利そうなのでこの機会に使い方を整理する

:::note alert
EXCELで「Query関数」は使えません
:::

**↓** こんな感じで書ける
```sql
=query('シート1'!A:C,"select A,B,C where A='うんこ'")
```

## 2. 利用するデータ
スプレッドシートの「シート1」、「シート2」にデータ入力して「シート3」でQuery関数を使う
##### 表1：シート1
||A列|B列|C列|
| ---- | ---- | ---- | ---- |
|1|物|色|状態|
|2|うんこ|茶色|健康|
|3|おしっこ|茶色|健康|
|4|おしっこ|赤|危険|

##### 表2：シート2
||A列|B列|
| ---- | ---- | ---- |
|1|物|臭い||
|2|うんこ|強い||
|3|おしっこ|普通||


## 3. 使い方（コピペ可）

##### 1. where句でキーワードと一致する行を抽出する 
A列の`うんこ`のある行を抽出する
```sql
=query('シート1'!A:C,"select A,B,C where A='うんこ'")
```
[結果]
||A列|B列|C列|
| ---- | ---- | ---- | ---- |
|1|うんこ|茶色|健康|


##### 2. where句でキーワードと一致する行を抽出する（見出しあり） 
A列の`うんこ`のある行を抽出する（見出しあり）
```sql
=query('シート1'!A:C,"select A,B,C where A='うんこ'",true)
```
[結果]
||A列|B列|C列|
| ---- | ---- | ---- | ---- |
|1|物|色|状態|
|2|うんこ|茶色|健康|


##### 3. where句でキーワードと部分一致する行を抽出する 
A列の`う`の部分一致で行を抽出する
```sql
=query('シート1'!A:C,"select A,B,C where A like'%う%'")
```
[結果]
||A列|B列|C列|
| ---- | ---- | ---- | ---- |
|1|うんこ|茶色|健康|


##### 4. where句でキーワードで複数条件が一致する行を抽出する 
A列の`おしっこ` かつ B列の`茶色`のある行を抽出する
```sql
=query('シート1'!A:C,"select A,B,C where A='おしっこ' and B='茶色'")
```
[結果]
||A列|B列|C列|
| ---- | ---- | ---- | ---- |
|1|おしっこ|茶色|健康|


##### 5. 複数テーブルを結合して表示する
表1と表2のA列の`うんこ`をキーワードに結合して表示する（見出しも表示）
```sql
=query({'シート1'!A:C,'シート2'!A:B}," select Col1,Col2,Col3,Col5 where Col1='うんこ'",true)
```
:::note info
where句で指定する結合列（Col1（シート1：A列）、Col4（シート2：A列））はどちらを指定してもOK
:::
キーワードの結合列を「Col1」 → 「Col4」に変更しても結果は同様となる
```sql
=query({'シート1'!A:C,'シート2'!A:B}," select Col1,Col2,Col3,Col5 where Col4='うんこ'",true)
```
[結果]
||A列|B列|C列|D列|
| ---- | ---- | ---- | ---- | ---- |
|1|物|色|状態|臭い|
|2|うんこ|茶色|健康|強い|

##### 6. 見出しを別名にして表示する
見出しを別名にして表示する
```sql
=query('シート1'!A:C,"select A,B,C label A 'objec',B 'color',C 'status'",true)
```
[結果]
||A列|B列|C列|
| ---- | ---- | ---- | ---- |
|1|objec|color|status|
|2|うんこ|茶色|健康|
|3|おしっこ|茶色|健康|
|4|おしっこ|赤|危険|

##### 7. group by句で集計し、order by句で並び替えをする
A列`うんこ`と`おしっこ`のカウントを集計し、数の大きい順（降順）に並べる

:::note warn
空白行までカウントされてしまうので「 where A is not null 」を含める
:::

```sql
=query('シート1'!A:C,"select A ,count(A) where A is not null group by A order by A desc ",true)
```
[結果]
||A列|B列|
| ---- | ---- | ---- |
|1|物|count 物|
|2|おしっこ|2|
|3|うんこ|1|

##### 8. pivot句でクロス集計する
A列`うんこ`と`おしっこ`、C列`健康`と`危険`のカウントをクロス集計する

```sql
=query('シート1'!A:C,"select A ,count(A) where A is not null group by A pivot C",true)
```
[結果]
||A列|B列|C列|
| ---- | ---- | ---- | ---- |
|1|物|健康|危険|
|2|うんこ|1||
|3|おしっこ|1|1|


## 4. 参考にしたサイト
- [スプレッドシートquery関数の使い方！vlookupより断然オススメ！](https://xn--t8j3bz04sl3w.xyz/spreadsheet/query/1893/)
- [【QUERY関数⑤】コピペ可｜複数範囲を参照・結合する方法（データ集約）](https://pumpuppineapple.com/query5/)
- [スプレッドシート】Query関数のpivotの使い方と例４つ](https://strategy-conference.com/analysis/spreadsheet/1260/)
numpyで第一要素でSortし，同一値の場合は第二要素でSortする方法

`np.lexsort` によってargsortができるようです．
ただし，一番最初にSortをするKeyが引数の最後に来ることに注意が必要です．

```python
import numpy as np


a = np.array([ 
    [2, 1, 2, 3, 1, 4, 3],
    [4, 1, 3, 2, 3, 3, 5],
]).T

order = np.lexsort((a[:, 1], a[:, 0]))

>>> a[order]
array([[1, 1],
       [1, 3],
       [2, 3],
       [2, 4],
       [3, 2],
       [3, 5],
       [4, 3]])
```
【TwitterAPI】はじめてのTwitterAPI（やさしめ解説）

最新のTwitterAPI利用手順をまとめてみたよ

# Twitter Developerサイトで手続き

## サインアップ
[Twitter Developerサイト](https://developer.twitter.com/en/portal/projects-and-apps)でapiを何に使うのか？とかの質問に答えて「Let's do this」で進むよ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521440/2fb6b2af-6d6f-6c1d-bfec-426574d4a460.png)


## 利用規約に同意
利用規約をしっかり読んだら☑を付けて「Submit」するよ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521440/2866ec75-1d9f-0f4d-d383-7b0a140c2f0f.png)

## メール認証
こんな画面が出てくるよ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521440/fd0fa980-3b37-03a5-e1fb-6c043f9ecf10.png)

登録済のメールアドレスにこんなのが届くから「Confirm your email」するよ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521440/d4e8d091-6b7a-30a8-89fb-a5af9b33413b.png)

# アプリケーションの登録
「Confirm your email」するとこんな画面に飛ぶので好きなアプリケーション名をいれて「Get keys」するよ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521440/3e41f5ca-270a-d5f8-7806-4896e4dcfd17.png)

キー情報が表示されるからメモっておいてね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521440/f15a3a95-e527-4eab-d457-4d3938ee30de.png)

メモったら「API playground」を押してみよう

# さっそくTwitterAPIを使ってみよう！

## ユーザー情報を取得するAPIを使ってみよう
とりあえず初期表示されるエンドポイントを「×」ボタンで消しておくよ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521440/8a4b5bfe-5a72-1612-3919-ff165c148315.png)

「username」って入れると「GET /2/users/by/username/:username」が出てくるから選択してね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521440/ded54a20-b61a-b7d1-4a86-2ca45c6b77f5.png)

## ユーザー情報を検索しよう
「username」欄に好きなツイッターユーザーネームを入れて「Run」するよ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521440/af3bc0d9-4604-3dd7-6711-233ef20f3da6.png)

おめでとう！TwitterAPIが使えたね！
他にも便利なAPIがあるから[ドキュメント](https://developer.twitter.com/en/docs/twitter-api/data-dictionary/introduction)を読んでみてね