OmniAICreator/Qiita-1.07M huggingface dataset:
Dagger-Hilt で AppComponent にアクセスする方法

# 背景

今まで Kotlin + Dagger2 で AppComponent にアクセスするコードがあった。

```kotlin
@Component(modules=[ ... ])
interface AppComponent {
    val myModule: MyModule

    // ...
}
```

## dagger2 拡張関数

```kotlin
val Activity.appComponent: AppComponent
    get() = (applicationContext as MainApplication).appComponent

fun <T : Any> Activity.dagger2(block: (AppComponent) -> T) = lazy {
    block(appComponent)
}
```

この dagger2 拡張関数があれば Dagger-Android を使わなくても手軽にインスタンスにアクセスできた。

```kotlin
class MainActivity : Activity() {
    private val myModule by dagger2 { it.myModule }
    // ...
}
```

## 困ったこと

しかし Dagger-Hilt では、 AppComponent は自動生成であり自分で定義しないため、この書き方はできなくなってしまった。

# （更新） ちゃんとしたEntryPointの使い方はこちら

公式ドキュメントが公開されました。

https://dagger.dev/hilt/entry-points

# （古い） 解決方法

## `@EntryPoint` を使う

従来 `@Component` に書いていた記述は `@EntryPoint` を使うと実現できる。

```kotlin
@EntryPoint
@InstallIn(ApplicationComponent::class)
interface AppComponentEntryPoint {
    val myModule: MyModule
}
```

## dagger2 拡張関数を書き換える

拡張関数の実装を少しだけ書き換えれば今までのやり方を活かすことができる。

```kotlin
val Activity.appComponent: AppComponentEntryPoint
    get() {
        // ドキュメントを見て修正
        EntryPoints.get(applicationContext, AppComponentEntryPoint::class.java)

        // @Suppress("UNCHECKED_CAST")
        // return (applicationContext as Hilt_MainApplication)
        //    .generatedComponent() as AppComponentEntryPoint
    }

fun <T : Any> Activity.dagger2(block: (AppComponentEntryPoint) -> T) = lazy {
    block(appComponent)
}
```

## 利用する側は書き換えの必要なし

```kotlin
class MainActivity : Activity() {
    private val myModule by dagger2 { it.myModule }
    // ...
}
```

# なぜこれがうまくいくのか？

MainApplication はソースコード上は Application を継承しているように見える。

```kotlin
@HiltAndroidApp
class MainApplication : Application() {
    // ...
}
```

しかし、 Gradle plugin のパワーにより Hilt_MainApplication という自動生成されたクラスを継承するようにビルド時に書き換わる。

`Hilt_MainApplication` のメソッドである `generatedComponent()` から自動生成されたComponentが取得できる。

自動生成されたComponentは  `@EntryPoint` がついていた AppComponentEntryPoint を継承している。

したがってうまくインスタンスを得ることができる。

# まとめると

AppComponent にアクセスしていたコードも少しの書き換えで Dagger-Hilt させることができ、少しずつ Dagger-Hilt らしい書き方に寄せていくことが可能そうである。

（Dagger-Hilt はまだalpha版であるし、この書き方がいつの間にかできなくなる可能性はある。）

# 最後に

Dagger-Hilt のインストール方法等はこちらの記事を参考にさせて頂きました。

https://aakira.app/blog/2020/05/dagger-hilt/

わかりやすい記事をありがとうございます。
クエリで複数の値を受け取れるか実験してみました

VueRouterで、単一ではなく、複数の値をqueryで受け取れるか、初心者なりに調べてみました。

# はじめに
最初に蛇足を。大学経由で入学時に購入したLet's noteを、この前SSDに換え、メモリも増設しました。

すごい快適！今までのストレスが嘘みたい！！！これでコーディングが捗る！！！！

と思いきや、働き始めて思ったよりも時間を確保できず、疲労もあり思うように進まなくて正直困ってます。


---


……それはさておき、久しぶりにVueRouterの部分をいじる中で、ふと疑問が生じました。

***クエリでは、複数の値をどうやって受け取るの？***

keyとvalueを1:1で受け取るのは何度もしていたものの、key:value=1:多の場合をよく分かってませんでした。

ということで。疑問を持ったらすぐ試すのみ。自分で色々弄ってみることにしました。

# 実験準備

## 実験概要
さて、どう実験したか、まず記します。

ます、簡単なアプリの雛形をVueCLIで作りました。

次に、雛形アプリ内で、メインページ(/)にrouter-link付きのbuttonを用意し、クリックしたらテストページ(/test)へ飛ぶようにしました。

そして今回は、router-linkのtoに書き込む内容を色々変えて、その結果を確かめることにします。

なお、実験の細かい構成などは省略します。

## 使用するもの
主に以下の2つを用います。

- VueCLI
    - VueRouterもこれに含まれます
    - 細かい構成などは今回省略します
- VueDevTool
    - Vueの動作を確認できるFireFoxやChromeの拡張機能
    - 今回はこのツールで、どのような値が渡されたのか確認します

# 実験開始
toに書き込む内容を、5つ考えてみました。1つずつ、その内容と、結果を記します。

## [1]単一の値を渡す
まずは基本の方法を確認します。特に変わったことはしていません。

```html:index
<!-- webページ内にこんなボタンがあると想定 -->
<router-link
:to="{ path: '/test', query: {abc:'def'}}"
>
    <button>Testボタン！押すとtestページへ</button>
</router-link>
```

```javascript:test
// vueインスタンスの設定の箇所を想定
computed:{
    abc(){
        return this.$route.query.abc;
    }
}
```

ブラウザのDevtoolsで確認した結果は……

`abc:"def"`

これが基本形ですね。

## [2]クエリで空の文字列を渡してみる
次に少し変化球をしてみます。

```html:index
<router-link
:to="{ path: '/test', query: {foo:''}}"
>
    <button>Testボタン！押すとtestページへ</button>
</router-link>
```

```javascript:test
computed:{
    foo(){
        return this.$route.query.foo;
    }
}
```

ブラウザのDevtoolsで確認すると……

`foo:""`

無事からの文字列を受け取れました。これは正直、想定内ですね。


## [3]クエリとして渡してないものを受け取る
今度はどうでしょう。nullにでもなるのかな？などと勝手に予想。

```html:index
<router-link
:to="{ path: '/test', query: {}}"
>
    <button>Testボタン！押すとtestページへ</button>
</router-link>
```

```javascript:test
computed:{
    nullQuery(){
        return this.$route.query.nullQuery;
    }
}
```

ブラウザのDevtoolsで確認した結果は……

`nullQuery:""`

空の文字列。こうくるか。

## [4]クエリで配列を渡してみる
これは非常に気になりますね。そもそもクエリで複数の値を指定できるのか……

```html:index
<router-link
:to="{ path: '/test', query: {arr: ['a','b']}}"
>
    <button>Testボタン！押すとtestページへ</button>
</router-link>
```

```javascript:test
computed:{
    arr(){
        return this.$route.query.arr;
    }
}
```

これをdevtoolで確認すると……

```
arr:Array[2]
0:"a"
1:"b"
```

きちんと配列で受け取れています。因みにアドレスバーの表示は`?arr="a"&arr="b"`となっていました。

`&`で囲むことで複数のクエリを書き込めますが、同じkeyを指定すると、配列になる模様？です。


## [5]クエリでオブジェクトを渡してみる
オブジェクトは、さすがに受け渡しが不安ですね。大丈夫かなあ？

```html:index
<router-link
:to="{ path: '/test', query: {obob: { id:'c', value:'d' }}}"
>
    <button>Testボタン！押すとtestページへ</button>
</router-link>
```

```javascript:test
computed:{
    obob(){
        return this.$route.query.obob;
    }
}
```

結果を見る前に、アドレスバーを見ると、`obob=%5Bobject%20Object%5D`となっていました。

デコードすると、[object Object]……え、本当にこれデータ送られているの？？？？

気になるdevtoolを見ると、一応、結果は正しく受け取れている模様。

```
obob:Object
id:"c"
value:"d"
```

でも心配すぎる。

# 終わりに
クエリで値を複数受け取る機会が多いかは分かりませんが、後々使う可能性もあると思うので、調べておいて良かったです。もしかしたら、配列で複数の値を受け渡しする場合もあるかもしれませんし。

正直、重い上に機能が多すぎて、VueCLIは好きじゃないんですけど、こうしてsandboxとして使える手軽さはメリットですね。

他にも色々弄ってみようと思います。
Rust エラトステネスのふるい

# バージョン

- rustc 1.45.0-nightly

# 依存クレート

```toml
[dependencies]
text_io = "=0.1.8"
```

# コード

```rust
use text_io::read;

fn main() {
    let x: usize = read!();
    let mut flags = vec![true; x + 1];
    flags[0] = false;
    flags[1] = false;
    let sqrt_x = (f64::sqrt(x as f64) + 0.1).ceil() as usize;
    for p in 2..=sqrt_x {
        if !flags[p] {
            continue;
        }
        for mult in ((p*p)..=x).step_by(p) {
            flags[mult] = false;
        }
    }

    for (i, v) in flags.iter().enumerate() {
        if *v {
            print!("{} ", i);
        }
    }
}
```

# 入出力

例えば `100` と入力すると

```
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
```

を出力する。

# 参考

https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9
https://qiita.com/peria/items/a4ff4ddb3336f7b81d50
AmplifyでPWAアプリケーションをデプロイしてみた

#Amplify GetStarted

## Amplifyを表示
AWSコンソールにログインし、サービスからAmplifyを選択。
Deployをクリックする。

<img width="1351" alt="スクリーンショット 2020-06-06 19.16.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1553/26e9fa32-37a4-3589-ce67-76a5e0df0851.png">

## GetStarted画面
今回は、受領したソースファイルをデプロイするので、Deploy Without Git Providerを選択する。
<img width="1354" alt="スクリーンショット 2020-06-06 19.23.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1553/c5cf49a2-f11c-e3f1-4b52-0707daa234eb.png">

## Deploy画面
アプリケーション名と環境名（dev,stg,prodなど）を記入。ソースファイル一式をドラッグ＆ドロップし、
Save And Deploy をクリックする

<img width="1354" alt="スクリーンショット 2020-06-06 19.23.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1553/d498b200-5cbd-602e-9dbe-b006dde22d77.png">

これで、フロントサイドはデプロイ完了です！
簡単すぎですな。
ESLint v7.2.0

前 [v7.1.0](https://qiita.com/mysticatea/items/46c93f13776b24b9d1b9) | 次 [v7.3.0](https://qiita.com/mysticatea/items/e155bd2fee35c22ee423)

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">ESLint v7.2.0 has been released!<a href="https://t.co/8dSO0Hc5X7">https://t.co/8dSO0Hc5X7</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/1269061468500213767?ref_src=twsrc%5Etfw">June 6, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint `7.2.0` がリリースされました。小さな機能追加とバグ修正が含まれています。

また、日本語のサポートチャットが Gitter から Discord に移動しました。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

> 🏢 [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
> 👫 [日本語サポート チャット](https://discord.com/channels/688543509199716507/718026066001788958) ([招待リンク](https://discord.gg/wfTnWvE))
> 🏢 [本家リポジトリ](https://github.com/eslint/eslint)
> 👫 [本家サポート チャット](https://discord.com/channels/688543509199716507) ([招待リンク](https://eslint.org/chat))

---

[PR] ESLint は開発リソースを確保するための寄付を募っています。
応援してくださると嬉しいです。

- [ESLint の GitHub Sponsors](https://github.com/sponsors/eslint)
- [私個人の GitHub Sponsors](https://github.com/sponsors/mysticatea)

---

# ✨ 本体への機能追加

## `??`演算子・`import.meta`・`export * as ns from "mod"` をサポートしました
🔖 [#13196](https://github.com/eslint/eslint/pull/13196)

ES2020 で新しく追加された構文のうち、以下の3種類をサポートしました。

- [Nullish Coalescing](https://github.com/tc39/proposal-nullish-coalescing)
- [`import.meta`](https://github.com/tc39/proposal-import-meta)
- [`export * as ns from "mod"`](https://github.com/tc39/proposal-export-ns-from)

これら構文を利用するには、`parserOptions.ecmaVersion`を設定してください。

```yml:.eslintrc.yml
parserOptions:
  ecmaVersion: 2020
```

注: [Optional Chaining](https://github.com/tc39/proposal-optional-chaining/) は [AST 仕様の議論が紛糾している](https://github.com/estree/estree/pull/204)ため、まだサポートしていません。

# 💡 新しいルール

特になし

# 🔧 オプションが追加されたルール

## [no-extra-parens](https://eslint.org/docs/rules/no-extra-parens) `enforceForFunctionPrototypeMethods`
🔖 [#12895](https://github.com/eslint/eslint/pull/12895)

関数式で定義した関数オブジェクトのメソッドを即時呼び出しする際のカッコを無視するオプションが追加されました。[wrap-iife](https://eslint.org/docs/rules/wrap-iife) ルールとの衝突を回避するためです。

```js:例
/* eslint no-extra-parens: ["error", "all", { "enforceForFunctionPrototypeMethods": false }] */

//✔ GOOD
const a = (function () {}).call();
const b = (function () {}).apply();
const c = (function () {}.call());
const d = (function () {}.apply());
```

» [Online Demo](https://eslint.org/demo#eyJ0ZXh0IjoiLyogZXNsaW50IG5vLWV4dHJhLXBhcmVuczogW1wiZXJyb3JcIiwgXCJhbGxcIiwgeyBcImVuZm9yY2VGb3JGdW5jdGlvblByb3RvdHlwZU1ldGhvZHNcIjogZmFsc2UgfV0gKi9cblxuLy/inJQgR09PRFxuY29uc3QgYSA9IChmdW5jdGlvbiAoKSB7fSkuY2FsbCgpO1xuY29uc3QgYiA9IChmdW5jdGlvbiAoKSB7fSkuYXBwbHkoKTtcbmNvbnN0IGMgPSAoZnVuY3Rpb24gKCkge30uY2FsbCgpKTtcbmNvbnN0IGQgPSAoZnVuY3Rpb24gKCkge30uYXBwbHkoKSk7XG4iLCJvcHRpb25zIjp7InBhcnNlck9wdGlvbnMiOnsiZWNtYVZlcnNpb24iOjExLCJzb3VyY2VUeXBlIjoibW9kdWxlIiwiZWNtYUZlYXR1cmVzIjp7fX0sInJ1bGVzIjp7fSwiZW52Ijp7fX19)
JavaFXアプリを動かす(OpenJDK11)

# JavaFX アプリが動かない

jar で配布されている Java アプリについて、Windowsでは JRE / JDK がインストールされていれば jar をダブルクリックして実行することができた…はず。

[AdoptOpenJDK](https://adoptopenjdk.net/) から最新版LTSであるOpenJDK11をインストールしたのだが

```Console
エラー: メイン・クラスXXXX.Mainを検出およびロードできませんでした
原因: java.lang.NoClassDefFoundError: javafx/application/Application
```
となり実行することができない。

## JavaFX が同梱されてない

いろいろ調べた結果、JavaFX がそのままではインストールされなくなったのが原因らしい。
[OpenJFX \+ OpenJDK で JavaFX を動かす \- JavaFX in the Box](https://skrb.hatenablog.com/entry/2018/05/29/210000)

## ざっくりとした手順

* JavaJFXをインストール
* `--module-path`, `--add-modules` で必要な javafx モジュールを指定して java を起動

### JavaFX のインストール

[Getting Started with JavaFX](https://openjfx.io/openjfx-docs/#install-javafx) から必要なパッケージをダウンロードする。動かすだけでもSDKが必要な模様

### 起動オプション

jar をダブルクリックして動かすだけならば

```Console
> java -jar XXXX.jar
```
となるが、JavaFX をモジュールとして明示的に指定してやる必要があるので、次のようなバッチファイルを用意して起動させることにした。なお、ダウンロードした javafx-sdk は `C:\Program Files\AdoptOpenJDK\javafx-sdk-11.0.2` に展開している

```Console
@echo off
set JAVA_FX="C:\Program Files\AdoptOpenJDK\javafx-sdk-11.0.2\lib"
java --module-path %JAVA_FX% --add-modules=javafx.controls,javafx.fxml -jar XXXX.jar
```

対象のアプリが javafx.fxml を必要としていたため、javafx.controls, javafx.fxml の2つを追加モジュールとして指定している。
個人開発のアイデアはGitHubのプライベートリポジトリのissueに書き出すと幸せになれるのかもしれない🥳

こんにちは(๑╹ω╹๑ )

普段個人開発をしていると、
咄嗟に個人開発のアイデア浮かぶことありませんか？🤔

(;・`д・́)...ゴクリ

あります🙋‍♂️

私はGitHubのプライベートリポジトリのissueに書き出しています🙋‍♂️

<img width="1012" alt="プライベートリポジトリ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560692/6e2a0850-f92c-ab6b-e727-5d020e2b7131.png">

```Idea-Room```という個人開発のアイデアを書き出す専用のリポジトリを作成しています(๑╹ω╹๑ )
※コードは何もコミットしていません😅

**GitHub公式アプリ**からのアクセスも結構簡単ですよ🥺

<div style="display:flex">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560692/ba557df0-7b13-6894-fc31-6a9ff49a49f6.png">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560692/ed4f95be-2dd3-cb94-00f1-a327a6430f99.png">
</div>

こんな感じに🤗

![RPReplay_Final1591437733.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560692/ddb9651a-05e2-a49f-69da-24b07452334b.gif)

それとホーム画面でピン留めをしておくと、
アクセスがもっと良きみです🤫

![63B3A14B-A160-47BE-AAD4-7E8EC178C924.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560692/99f31088-8c75-3103-0e11-016591346e8e.png)


記事タイトルとは全然関係ないですが、
```毎日日記をプライベートリポジトリにコミットする```ような使い方も以前行っていました！✏️

マークダウン記法に慣れる手段としてオススメです🤭

めでたし？(๑╹ω╹๑ )
めでたし😋
JavaScriptの勉強

#NODE.JS
これまでPYTHONオンリーでやってきたが、最近はNODE.JSを触り始めている。

NODE.JSについては、周辺のライブラリを組み合わせて
簡単に何でも作ってしまうというのが非常に優れている印象。

PYTHONはFLASK,DJANGOというフレームワークと
PANDAS,AI関連のライブラリがもてはやされているが
node.jsもPYTHONと同じようなところを
目指しているような気がする。

JAVASCRIPTと言えば、これまではWEBのフロント中心であるが、
最近はバックエンドのサーバー側も作れるのであるから、
学習コストは少しは減る
（といっても、PYTHONを新規でやるのと、対して労力は変わらないが）

一点だけ、pythonより優れると思うのは、
ELECTRONでアプリケーションが作れること

これはVS-CODEでも、お馴染みで結構さくさく動かせる
（その根底のデザイン技術は、WEBベースでいいらしい）

そうなってくると、これは完全にマイクロソフトの.NETと
違った世界感になってくる。

もちろんC#や、.NETが使えることは、マイクロソフトの
正式なサポートがあるので、安心感はある。

しかしながら、これからはGITHUBなどのオープンソースな時代なので、
NODE.JSを中心とした、LINUX,MACなどのエンジニアが
参入してきて、とんでも無い時代に突入してきている。

#フレームワーク
 
NODE.JSを触り始めて気づいたのであるが、
とにかくフレームワークと、ライブラリへの依存度が半端ない。

人が作ったものを、再利用するスキルであり、
これは、いかに情報をどれだけ知っているのか？
それに尽きる。

結局は知らない人は、知らないだけ損をする。

そういうことを考えると、エンジニアはこれから
2極分化していくんだろうなあと考える。

・ライブラリ依存型のエンジニア
・自らライブラリを構築できるエンジニア
Nuxt.jsにGoogle Analyticsを導入する

# はじめに
この<a href="https://increment.site">Webアプリケーション</a>を作成する際に、Analyticsの導入に困ったので解決方法を載せます。
また、Firebase-toolsの導入やプロジェクトの作成は省略します。
# 方法
~/pluginsの下にfirebase.jsとga.jsを作成します。

```
my-project
    └ plugins/
          ├ firebase.js
          └ ga.js
```

```firebase.js
import firebase from 'firebase/app'
import 'firebase/analytics'

if(!firebase.apps.length) {
  firebase.initializeApp({
    apiKey: 'プロジェクトのapiKey',
    authDomain: 'プロジェクトのドメイン',
    '以下省略'
  })
}

export default firebase
```
   
```ga.js
import firebase from './firebase'

export default ({
  app
}) => {
  if(process.env.NODE_ENV !== 'production') return
  
  firebase.analytics();
}
```

これを作成した後に、nuxt.config.jsに以下を追加します。

```nuxt.config.js
module.exports = {
  '省略'
  plugins: [
    {
      src: '~/plugins/ga.js',
      mode: 'client'
    }
  ],
  '省略'
````

これでGoogle Analyticsが導入できます。

# 最後に少し宣伝
「はじめに」のところでも少し出したのですが、この度Webアプリケーションを作成しました。
初学者の「みんな技術的情報はどこから得ているの？」という疑問を少しでも解決できるようにという思いで作成しました。
時間がある方や興味がある方はぜひご覧になってください！
<a href="https://increment.site" target="_blank" >increment ~Technical information site for beginners~</a>
Qiitaやはてブロに投稿するようなユーザーはみんなtextlintを使うと捗るぞ！

タイトルでもう目的を果たしました。

簡単な誤字脱字の発見や体裁の統一のため、textlintを使うとめっちゃ捗ります。
ESLintの自然言語版です。日本語もイケます。

[カックさん](https://twitter.com/kakakakakku)に教えていただいて導入しました。
導入方法の解説はすでに有用な記事がたくさんあるのでそれらに譲ります。

- [textlint/textlint](https://github.com/textlint/textlint)
- [textlint と VS Code で始める文章校正 \- Qiita](https://qiita.com/takasp/items/22f7f72b691fda30aea2)
  -   この記事を参考に環境構築しました
- [textlintで日本語の文章をチェックする \| Web Scratch](https://efcl.info/2015/09/10/introduce-textlint/)
- [文書執筆の指南書で解説されている問題点を textlint で発見する \- Qiita](https://qiita.com/azu/items/60764ed6f415d3c748bf)

今は空のテキストと.textlintrcをコミットしたリポジトリをGitHubにPushしています。

私の現段階の.textlintrc はこちらです。

```json:.textlintrc
{
  "filters": {},
  "rules": {
    "preset-ja-spacing": true,
    "preset-ja-technical-writing": true,
    "spellcheck-tech-word": true,
    "ja-technical-writing/no-exclamation-question-mark": false
  }
}
```

Happy Writing!


### こんな記事も書いてます
- [\[個人サイト/ブログ/Qiitaなど\]ゆるふわにGoogle Analytics からSlackに通知したいと思ったら簡単だった \- Qiita](https://qiita.com/fruitriin/items/96b2d828bfb7bda1d6e7)
- - [Google App Script\(GAS\)をローカルで快適に編集して同期しよう！ \- Qiita](https://qiita.com/fruitriin/items/62120f102d50dce5c51a)
- [IFTTTで（特にTwitterを）エゴサする工夫 \- Qiita](https://qiita.com/fruitriin/items/9206bb1849b9051e0ec2)
- [今からVue\.jsを始める人のための「知るのを後回しにしてよい」n個のこと \- Qiita](https://qiita.com/fruitriin/items/3249bb24d60932bb42ee)
EXCEL VBAを使ったRPAを自作してみた（序章）

#VBA開発の現状

今さらながらVBA開発をシコシコとやっている。

たまにシコリ過ぎて、出てくる玉がもうないかと思いきや、
たまに他にはなく、いいものが作れたりする。

VBAの範疇だと、VBA以外の外部アプリケーション制御が必要になった場合に
一歩外に飛び出すことが困難な状況でも、.NETのライブラリを使うと、
意外なほど、簡単に外洋に飛び出せるものである。


#RPAといふもの

今回はRPAを自作という事で、RPAでやりたい部分を列挙してみる。

マウスで画面をクリックする
画面の反応を待つ
キーボート操作をする
などなど

#.NETについて

.NETを使うとC#とVisualBasicが使える。
もちろん.NETと言っても、所詮は呼びだす側の言語は
旧石器時代のVBA（VB6.0)なので、それこそ、人類進化並みの
異次元空間を飛び越えなくてはならない。

しかしながら、RPAで利用する機能は、
所詮はWindowsパソコンの古くから存在している機能なので
.NETを使うといっても、中身はAPIを間接的に使っているに過ぎない。

#OPENCV
VBAばかりやっていると、そもそも技術のアンテナには
オープンソースは引っかからない。
この点はVBA開発者の盲点である。

VBAにこだわらずに、他の未来言語を習得することが大事だ。

#必須な知識

ここからは学習が必須なアイテム

・Visual Studio　→　本格的ＩＤＥなので、まずはここで挫折することを覚悟すること
・C#　→　VB6.0 が出来るからと言って、決して　VB.NET　が良いとはあえて言わない
・OPENCVSHARP　→　OPENCVは原則は、C++からの利用がデフォルトではあるが・・・
・Win32Api　→　結局は.NET以前のライブラリを勉強する羽目になる

#まとめ

今回はまず序盤なので、これからバシバシ書いていく

以上
[技術メモ]HTTPリクエストの中身を構成する3つのパート


「HTTPリクエスト行」、「HTTPリクエストヘッダー」、「HTTPリクエストボディ」の3つです。

詳細は下記ページが参考になります！
↓　↓　↓
https://webtan.impress.co.jp/e/2010/01/12/7156



##HTTPリクエストヘッダーの役割
端的に言えば、HTTPリクエストの2行目以降の情報のことで、ブラウザの
「ユーザエージェント名」や「リファラ」、「クッキー」等の情報をWEBサーバへ
伝える役割を果たしています。
Vimでタブ文字を可視化する

こんにちわ
ゴリラです

みなさんVimではタブ、空白文字を可視化できることは知っていますか？
タブ、空白文字を可視化することによって、空白とタブ文字が混在するのを事前に察知できるので、コーディングするときに役に立つことがあるかと思います。

今日はVimでのタブ、空白文字の可視化のやり方について解説していきます。

## やり方
Vimには`listchars`というオプションがあります。
このオプションにタブや空白をどんな文字で可視化するか、という設定ができます。

`listchars`に設定できる値は次になっています。（ヘルプ抜粋）
他にも設定値がいくつかあるので気になる人は`:h listchars`でヘルプを参照してください。

| 設定値     | 説明                                     |
|------------|------------------------------------------|
| eol:文字   | 行末の表示に使われる文字を指定           |
| tab:xy[z]  | タブ文字の表示に使われる文字を指定       |
| space:文字 | 空白の表示に使われる文字を指定           |
| trail:文字 | 行末のスペースの表示に使われる文字を指定 |

たとえば、タブ文字を`>-`で可視化したい場合は`set listchars=tab:>-`、
複数の設定値を適用したい場合は`set listchars=tab:>-,space:-`というふうに設定します。

例の説明では次の画像のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/dec5832f-c5ec-64a3-ca14-78bb0f6704ef.png)

## さいごに
このオプションは地味ですが、可視化して見やすくなるのに役立ちますので、是非試してみてください。
ちなみに、ぼくはタブと空白文字を`ｳﾎ`にしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/eea9cadc-d404-d6b2-5528-03836ef72e1d.png)
Qiitaでメールアドレス認証が出来ない場合

#概要
初投稿テストです。

#起こったこと
qiitaのメールアドレス設定を行う際に、認証用メールから「メールアドレスを認証」をクリックしてログインしようと思ってもエラーが出て、認証に失敗しました。

#解決方法
pcに送られてきた認証用メールをiPhoneに転送し、iPhoneメールアドレス認証を行うとログイン出来ました。
UnityとDlibFaceLandmarkDetectorでキャラクターのアバターを動かす（CVVTuberExample） 

# はじめに
※今回は有料のアセットを用いております。
※Webカメラが必要です。

VTuberさんが人気ですが、キャラクターのアバターを自由に動かせると楽しいですよね！
今回はWebカメラでキャラクターを動かせるCVVTuberExampleを試しました。  

Dlibで機械学習のアプローチで画像内の顔のパーツを認識し、モデルを動かす仕組みのようです。

# 参考
こちらの記事を参考にさせて頂きました。ありがとうございます。
[UnityでDlibFaceLandmarkDetectorを利用した顔器官検出アプリ事始め](https://qiita.com/utibenkei/items/2f392d6fa00960f39e45)

# キャラクターの作成
[VRoid Studio](https://vroid.com/)を使ってキャラクターを作りました。
※今回はテストなので、VRoidサンプルデータからあまり変更していません。
作成したキャラクターをvrmファイルにエクスポートします。

# Unityプロジェクトの作成
まず新規の3Dプロジェクトを作成します。
以下のアセットをインストールします。※価格は2020年6月時点での税別価格です。
>[UniVRM](https://github.com/vrm-c/UniVRM)
[OpenCV for Unity](https://assetstore.unity.com/packages/tools/integration/opencv-for-unity-21088?locale=ja-JP) ($95)
[Dlib FaceLandmark Detector](https://assetstore.unity.com/packages/tools/integration/dlib-facelandmark-detector-64314)  ($40)
[CV VTuber Example](https://assetstore.unity.com/packages/templates/tutorials/cv-vtuber-example-118186) (FREE)

※Unity 2019.1環境下ではCV VTuber Exampleをインストールした後にTextMesh Pro関連のエラーが大量に出ましたが、
プロジェクト設定のScripting Runtime Versionが書き換えられるためで、
Scripting Runtime Versionを.NET 4.5互換に戻してやると正しく動作するようです。
![プロジェクト設定の画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626158/41881f2f-cd14-c16c-36f8-a0b2788d1302.png)

# WebCamのサンプル
1. `Assets/CVVTuberExample/CVVTuber/Examples/WebCamTextureCVVTuberExample`
にある `WebCamTextureCVVTuberExample.unity` シーンを開きます。

3.
`Assets/DlibFaceLandmarkDetector/StreamingAssets`
フォルダの中身を
`Assets/StreamingAssets`
フォルダに移動します。

2. メニュー内の、
 - `Tools > OpenCV for Unity > Set Plugin Import Settings`  
 - `Tools > Dlib FaceLandmark Detector > Set Plugin Import Settings`  
 - `Tools > CVVTuberExample > Set Plugin Import Settings`  
をそれぞれ実行します。


これを実行すると、カメラの映像に合わせてサンプルキャラクターの顔を動かすことが出来ます。
![screen01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626158/82cc3d1c-a781-6e3c-72e0-cd575157b659.png)


# VRMのサンプル
1. `Assets/CVVTuberExample/CVVTuber/Addons`
にある `VRMCVVTuber.unitypackage` パッケージをインポートします。

2. `Assets/CVVTuberExample/CVVTuber/Addons/VRMCVVTuber/Examples`
フォルダに追加された `VRMCVVTuberExample.unity` シーンを開きます。

3. シーン中にあるMissing Prefab となっているオブジェクトを削除します。

4.プロジェクトに適当なフォルダを作り、先ほど作成したvrmファイルをインポートします。

5.インポートしたvrmファイルからプレハブが作られるので、シーン内に追加します。
![screen03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626158/bf7f0825-25a0-2b22-60eb-2ad8bfe85599.png)

6.VRMControllManagerオブジェクト中のVRMLoaderコンポーネントの値を設定します。
 >Vrm File Name : VRMファイルのパスを指定します。なぜか最初の"Assets/"は不要です。
 Meta : VRMファイルをインポートしたときに作成されたメタファイルを指定します。

これを実行すると、カメラの映像に合わせて自作キャラクターの顔を動かすことが出来ます。
![screen02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626158/049b9399-4790-9b26-5b9e-c72ac59155d9.png)
[技術メモ]ステータスコードについて


##ステータスコードとは
ブラウザのリクエストに対する、サーバーのレスポンスのことです。
 サーバはこのレスポンスを、3桁の数字で返します。
 この数字のことを「HTTPステータスコード」と言います。
 各番号にはそれぞれ意味があり、受信した番号に応じてブラウザの処理が変わります。

下記サイトより引用
https://sem-journal.com/other/status-code/

コード一覧の内容もサイトで確認出来ます。

個人的には、やっぱり「404 Not Found」が身近ですね！
鯖落ち！
AtCoderでRuby学習11 よく使う標準入力の受け取り方

## はじめに
Rubyおよびアルゴリズムの学習の一環として競技プログラミングに参加しています。
ここでは、そのための学習の中で学んだことをアウトプットしていきます。
今回は、これまで問題を解く中で使った「標準入力の受け取り方」をまとめておきたいと思います。


## ひとつの要素を受け取る

### 文字列

```ruby
入力例
Ruby
```

```ruby
s = gets.chomp
# print s
# => Ruby 
```
chompメソッドは、文字列の末尾から改行コードを取り除いた文字列を返します。
受け取りたい文字列のみをしっかり受け取る為に付けておくと安心です。

### 整数

```ruby
入力例
６４
```

```ruby
s = gets.to_i
# print s
# => 64
```
getsメソッドで受け取った標準入力は、String（文字列）型として受け取られます。
to_iメソッドを後ろに付けることで受け取った文字列をInteger（整数）型に変換します。
この場合は、chompメソッドは必要ありません。

## ひとつの要素を任意の形に分割する
問題によっては、要素を分解することで解答に近づけるケースが結構あります。
ここではその例のいくつかを紹介します。

### 文字列を一文字ずつに分割し、配列にする

```ruby
入力例
Ruby
```

```ruby
ary = gets.split("")
ary = gets.split(//) #正規表現
# print ary
# => ["R", "u", "b", "y"]
```
splitメソッドは、文字列を分割して配列にしてくれるメソッドです。
()内の第一引数に区切り文字を指定することが出来ます。
一文字ずつ分割したい場合は("")もしくは(//)で可能です。

### 文字列を任意の規則で分割し、配列にする

```ruby
入力例
RubyRuby
```

```ruby
ary = gets.scan(/../) #①
ary = gets.scan("R") #②
ary = gets.scan(/Ru./) #③
# print ary
#① => ["Ru", "by", "Ru", "by"]
#② => ["R", "R"]
#③ => ["Rub", "Rub"]
```
scanメソッドは引数に指定したパターンを繰り返しマッチし、マッチした部分文字列を配列として返します。
なので、入力を一定の規則に従って分割して扱いたい時に使えます。
その規則を正規表現などで表現するのが慣れるまではちょっと難しいかもです。


## 一行から複数の要素を受け取る
半角スペースで区切られた、複数の要素を一度に受け取るパターンです。

###配列として受け取る(文字列)

```ruby
入力例
Ruby PHP
```

```ruby
ary = gets.split(" ")#ダブルコロンの間の空白は半角スペース
# print ary
# => ["Ruby", "PHP"]
```
splitメソッドの第一引数に上記のように半角スペースを指定することで、
半角スペースで区切られた複数の要素を一度に受け取ることが出来ます。

###変数に受け取る(文字列)

```ruby
入力例
Ruby PHP
```

```ruby
a,b = gets.split(" ")
# print a
# => "Ruby"
# print b
# => "PHP"
```
受け取る要素の数が限られている場合は、それぞれ変数に入れて受け取った方が便利な場合もあります。
そのような場合は上記のように、変数を「,」で区切ることで、それぞれ受け取ることが出来ます。

###整数を受け取る

```ruby
入力例
123 456
```

```ruby
ary = gets.split(" ").map(&:to_i) #①配列で受け取る
a,b = gets.split(" ").map(&:to_i) #②変数で受け取る

# print ary
# => [123, 456]

# print a
# => 123
# print b
# => 456
```
mapメソッドは、配列の要素の数だけブロック内の処理を繰り返し、結果として作られた配列を返します。
各要素にメソッドを適用したい（今回は全ての要素を整数型に変換したい）時は、
&を使って上記のように省略して書けます。


## 複数行に渡る要素をまとめて受け取る

### timesメソッド
競技プログラミングの問題では、
最初に「その後に与えられる要素の数」が入力され、
次の行から「解答に必要な要素」が与えられるというパターンの問題が多いです。
その場合は、timesメソッドを使って要素をまとめて受け取ることが出来ます。

```ruby
入力例
3 #この後に与えられる要素の数
4 8
8 2
5 2
```

```ruby
#整数型で受け取る時
n = gets.to_i #1行目で与えられる要素の数
ary = n.times.map{gets.split.map(&:to_i)}
# print ary
# => [[2, 2], [8, 2], [5, 2]]

#文字列型として受け取る時
n = gets.to_i
ary = n.times.map{gets.split}
# print ary
# => [["2", "2"], ["8", "2"], ["5", "2"]]
```
timesメソッドとmapメソッドの組み合わせで
入力を二次元配列としてまとめられ、様々な判定を行うのに便利です。


## 最後に
以上、よく使う標準入力の受け取り方でした。
問題を解く中で他の方法に出会ったら、その都度追加していきたいと思います。

もし間違いなどございましたら、ご指摘いただけると嬉しいです。
Rails 5.2/6.0 DEPRECATION WARNING: Dangerous query method / orderとpluckのサニタイズ

Rails 5.2以降では、クエリーメソッドのorderやpluckに文字列でSQLを渡すと警告が出ることがあります。

```
DEPRECATION WARNING: Dangerous query method (method whose arguments are used as raw SQL) called with non-attribute argument(s): 略
```

Rails 5.2ではメッセージの続きに次の文句がありますが、6.0ではまだ禁止されていません。

```
Non-attribute arguments will be disallowed in Rails 6.0.
```

Rails 6.0では次のように出るので、6.1で禁止されるのかな。

```
Non-attribute arguments will be disallowed in Rails 6.1.
```

Rails 5.2でorderやpluckの引数をチェックしている箇所は次のコードです。

https://github.com/rails/rails/blob/5-2-stable/activerecord/lib/active_record/attribute_methods.rb#L170

orderの場合は文字列をカンマで分割して次の正規表現に当てはまるかチェックしています。`"name DESC"` や `"name DESC NULLS FIRST"`はOKです。

```ruby
COLUMN_NAME_ORDER_WHITELIST = /
        \A
        (?:\w+\.)?
        \w+
        (?:\s+asc|\s+desc)?
        (?:\s+nulls\s+(?:first|last))?
        \z
      /ix
```

Rails 6.0では、正規表現が大幅に修正され、データベースの種類によって分けられています。PostgreSQLでは次の箇所です。

https://github.com/rails/rails/blob/6-0-stable/activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb#L89

```ruby
        COLUMN_NAME_WITH_ORDER = /
          \A
          (
            (?:
              # "table_name"."column_name"::type_name | function(one or no argument)::type_name
              ((?:\w+\.|"\w+"\.)?(?:\w+|"\w+")(?:::\w+)?) | \w+\((?:|\g<2>)\)(?:::\w+)?
            )
            (?:\s+ASC|\s+DESC)?
            (?:\s+NULLS\s+(?:FIRST|LAST))?
          )
          (?:\s*,\s*\g<1>)*
          \z
        /ix
```

この違いにより、Rails 5.1から5.2に上げたら警告が出るが、6.0に上げると出なくなる、という書き方があります。次のように関数を使った場合です。

```ruby
User.order("lower(name)") # 5.1 OK, 5.2 Warning, 6.0 OK
```

この警告が出るのを回避するには、`Arel.sql()` で囲みます。

```ruby
User.order(Arel.sql("lower(name)")) # 5.1 OK, 5.2 OK, 6.0 OK
```

また、上記5.2と6.0の正規表現を見て気付いた人もいると思いますが、5.2ではカラム名の前後に空白文字を入れるだけで警告が出てしまいます。

```ruby
User.order("name ") # 5.1 OK, 5.2 Warning, 6.0 OK
```

5.2のこの仕様は直してほしいなあ。
[光-Hikari-のPython]05章-04 制御構文（for文～range関数の利用～）

#[Python]05章-04 for文～range関数の利用～
前回はリストと指定して、要素を取り出して出力したり、和の計算を行いました。
少し振り返ってみましょう。リスト内の和を求めるプログラムです。

```.py
sum = 0
numL = [5, 8, 9, 1, 2]

for n in numL:
    sum += n

print(f'{numL}のリスト要素の和：{sum}')
```

今、このリストの要素は5つ指定していますが、これがもしリスト内に100個や1000個の要素があったら毎回指定するのは大変です。
そういった要素を簡単に指定する方法に**range関数**がありますので、それについての説明を行っていきます。

##range関数
指定範囲の数値を繰り返す場合、**range関数**を使用します。一般的には以下のようにしています。

| 関数 | 説明 |
|:--|:--|
|  range(start, end, step) | startから**end-1**までの範囲を表すオブジェクトを返します。各要素の幅はstepとなります。  startとstepは省略可能です。|

startとstepを省略して、**range(10)**と書いた場合、**range(0, 10, 1)**を指定したのと同じになります。
つまり、range(10)は、0, 1, 2, …, 9という10個の数値となります。

実際にプログラムを書いてみます。**Python Console**より以下のコードを入力してください。

```.py
>>> range(10)
range(0, 10)
```
range関数を使用すると、リストみたいな表記でなく、range(0, 10)といった表記になります。（このような表記を**イテラブル**なオブジェクトの表記と言ったりします。）

これをリスト表記するには、以下のように記載します。

```.py
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```

また、startやstepなども指定すると以下のようになります。

```.py
>>> list(range(5, 20, 2))
[5, 7, 9, 11, 13, 15, 17, 19]
```
stepが2となっており、5からのstartなので、5～19までの整数で1つ飛ばしで表示されます。

##range関数のfor文への利用
実際にプログラムを書いてみましょう。<font color="#00cccc">chap05</font>の中に、<font color="#00cccc">05-04-01.py</font>というファイル名でファイルを作成し、以下のコードを書いてください。
**print関数の個所がいつもと異なります**ので注意して入力してください。

```.05-04-01.py
for i in range(10):
    print(i, end=' ')
```
＜05-04-01.py実行結果＞
><font color="#090" bgcolor="black">【実行結果】</font>
0 1 2 3 4 5 6 7 8 9 

実行すると、0から9までの数値が表示されます。なお、**end=10**となっていますが、終わりは10でなくその手前の9となりますので気を付けてください。

また、**print関数**で**end=' '**と記載しています。
**print関数**のみですと、出力結果は改行されて縦に表示されますが、**end=' '**とすることで、改行コードの代わりに半角のスペース' 'を入れることになります。（デフォルトでは改行コードとなります。）

##range関数とfor文を利用して和を求める
では、1以上100以下の値の中で、偶数の合計値を求めるプログラムを考えます。font color="#00cccc">chap05</font>の中に、<font color="#00cccc">05-04-02.py</font>というファイル名でファイルを作成し、以下のコードを書いてください。

```.05-04-01.py
sum = 0

for i in range(1, 101): #1以上101未満（100以下）の間にfor文内実行
    if i % 2 == 0:  #もしiが偶数の場合は加算する
        sum += i

print(sum)
```
＜05-04-02.py実行結果＞
><font color="#090" bgcolor="black">【実行結果】</font>
2550

プログラムを追ってみると、range関数で1以上101未満（100以下）の値をiに代入していき、それが2で割り切れた場合、sumに加算してきます。

##演習問題
演習問題を用意しました。ぜひ解いてみてください。なお、ファイル名は[ ]内に指定したものを使用して、<font color="00cccc">chap05</font>内に作成ください。使用する変数名は好きな変数名を指定してかまいません。
<font color="3333ff">
[05-04-p1.py]
【1】range関数を利用して1～100までの整数値の合計を求めるプログラムを作成してください。結果は5050となります。
</font>
<font color="3333ff">
[05-04-p2.py]
【2】range関数を利用して1～100までの奇数の整数値の合計を求めるプログラムを作成してください。結果は2500となります。
</font>
<font color="3333ff">
[05-04-p3.py]
【3】整数値nを入力して、n未満の整数に3で割ると1余る数がいくつあるかを調べるプログラムを作成してください。
（ヒント：range関数を使用する際にstartを1にしましょう。また、n回繰り返します。）
＜05-04-p3.py実行結果＞
><font color="#090" bgcolor="black">【実行結果】</font>
1以上の整数を入力してください:10
1から10未満の整数で、3で割ると1余る数は3個です。

</font>

###[【目次リンク】へ戻る](https://qiita.com/ko0821/items/379e8bd9e6ea01089419)
Salesforce の JWT ベアラーフローの図を書いてみる

# はじめに

この記事は Salesforce 開発者ブログキャンペーンへのエントリー記事です。

> [Salesforce 開発者向けブログ投稿キャンペーン 第2弾 開催のお知らせ](https://developer.salesforce.com/jpblogs/2020/05/developer-blog-campaign/)

# 今回のテーマ

認定テクニカルアーキテクト（CTA）試験対策として、 `OAuth 認可フロー` のいくつかのパターンに習熟しておく必要があります。今回はその中のひとつ、`JWT Bearer Flow` について図を書きながら理解を進めていきたいと思います。

# OAuth 2.0 JWT ベアラーフロー

> 初めてみたときはなんだかすごそうな名前にただ圧倒されてしまったことを思い出します :relieved:

## シナリオ

Meta & Moose Inc.社（MMI社）は、自社のオンプレミスサーバー上で ERP システムを運用していましたが、今年から CRM システムとして Salesforce を追加導入しました。MMI 社のアーキテクトであるあなたは、ERP システムから CRM システムのデータへアクセスするために、 **Salesforce の対話的なログイン画面を介することなく、特定のユーザーで** ログインしたいと考えています。

## ソリューション

このシナリオの場合、**OAuth 2.0 JSON Web トークン (JWT) ベアラーフロー** を使用できます。

## フロー図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212555/054895f1-8c9b-c72e-444d-b454e7503518.png)

1. この JWT は、オンプレミスサーバー上に保存された非公開鍵で署名されています。

2. 接続アプリケーションの設定値および添付されている証明書を利用して JWT を検証します。
   - コンシューマーキーは正しいか。
   - 存在するユーザ名か。 
   - `管理者が承認したユーザは事前承認済み` が設定されてる前提で、そのユーザは適切なプロファイル or 権限セットを付与されているか。

3. 検証 OKであれば、アクセストークンを発行して返却します。

4. アクセストークンがあればデータにアクセスできるようになります。

## 用語集

英語ドキュメントだけ読んでいれば混乱することはありませんが、日本語ドキュメントを読んでいるとふと「あれ？」とこんがらがって手が止まることがあります :sweat_drops:

| No. | 英語 | 日本語 | イメージ |
|:---:|:----|:------|:-----|
| 1 | authentication | 認証 | アクセスを許可して良い相手なのかを確認してから切符をあげること |
| 2 | authorization | 認可 | 適切な切符を持っていたらアクセスを許可すること |
| 3 | private key | 非公開鍵 | JWT を署名する時に使うもの |
| 4 | certificate | 証明書 | JWT を検証する時に使うもの |

> 例： Authorization Code は、認証コードではなく「認可コード」です。

## おまけ

フロー図を作成するために使用したツールは "Draw.io Integration" です。VS Code をよく使っているかたにはすごく便利ですので、一度使ってみてくださいね :four_leaf_clover:

- [Draw.io Integration](https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212555/ac402dd2-7488-73f1-8322-edfc959b103c.png)

# さいごに

認定テクニカルアーキテクトを目指しているそこのあなた、ドメインアーキテクト資格は 2 つともお揃いですか？ほぼ毎月オンラインで勉強会を開催していますので、ぜひ私たちと一緒に勉強しましょう :raised_hands:

- [Salesforce Architect Group](https://www.trailblazers.jp/group/archjapan_arch)

![image](https://d2ilzzhc7tqhcj.cloudfront.net/wp-content/uploads/2019/08/13232156/SAG_logo.png)
![image](https://tandc.salesforce.com/cert_credentials_12.jpg)

> 出典： [Salesforce 資格一覧](https://tandc.salesforce.com/credentials)

# Acknowledgment

エントリにあたり参考にさせていただきました :bow_tone1:

- [よくわかる認証と認可](https://dev.classmethod.jp/articles/authentication-and-authorization/)
- [電子署名の基礎知識](https://qiita.com/angel_p_57/items/437ca6235defc938b97d)
- [サーバ間インテグレーション用の OAuth 2.0 JWT ベアラーフロー](https://help.salesforce.com/articleView?id=remoteaccess_oauth_jwt_flow.htm&type=5&language=ja)
- [SALESFORCE IDENTITY FLOWS](https://cloudsundial.com/salesforce-identity)
「Webを支える技術」読書録

## リソース

* Web上の名前を持った情報すべて。
* その名前が一意なURIに該当。

## URI(Uniform Resource Identifer)

* リソースを統一的に識別するIDのこと。
* 構成は「スキーム(プロトコル)://(ホスト名orIP)/(パス)
* プログラムがリソースを簡単に指し示すことができる性質を`アドレス可能性(Addressability)`という。
* URIはアドレス可能性を備えており、プログラムから認識できる特定の構造でリソースを表現できる。
* 1つのリソースに複数のURIを当てることも可能だし、さし示す先のリソースの状態をあとから変化させることもできる。

## REST

* RESTは以下のスタイルを全て（または一部）組み合わせたアーキテクチャスタイル。
* 頭文字を並べたULCODC$SS＝REST。
* 除外するスタイルが多くなる場合はそもそもREST以外を検討（P2Pとか）

### クライアント/サーバ構成 _Client(C)_

* 単一のコンピュータ上で処理を行うのではなく、クライアントサイドとサーバサイドで処理を分散すること。
* 種々のクライアント(端末)に対応することができ、影響範囲が小さい。
* サーバの冗長化による可用性向上。

### ステートレス _Stateless Server(SS)_

* アプリケーションの状態(＝セッション状態)をサーバ側で管理しないこと。
* サーバ側で情報を持たないことでサーバの計算リソースを占有しない構成を取れる。

※ ただし、セッション情報を維持した方が利便性が高いケースも当然ある（ログインして入るページなど）。こうしたケースでは一般にCockieが用いられる。

ELBでセッション管理が可能だがDynamoなどに書き出して保持する構成はこのスタイルを意識したもの？

__ステートレスの欠点__

* データ量が多くなることでネットワーク帯域を消費する可能性
* 冪等性がない可能性

### キャッシュ _Cache($)_

* 一度取得したリソースをクライアント側で保持すること。
* クライアント/サーバ間の通信回数を減らし効率化。

### 統一インターフェース _Uniform(U)_

* すべてのサーバは同じ規格のインターフェース(GETやPOSTなど全8種類のメソッドのみ)を有する。
* それ以上の拡張は認められない（柔軟性の制限）。
* 全てのサーバへのアクセスのインターフェースを統一することでクライアントとサーバを分離し、影響範囲を小さくできる。

### 階層化システム _Layered(L)_

* インターフェースの統一によりクライアント/サーバ間の変更を両者とも気にする必要がない。
* システムの階層化(ロードバランサやプロキシを挟んだ構成)をできること。
* 異なるインターフェースのレガシーシステムとの接続が可能。

### コードオンデマンド _Code on Demand(COD)_

* コードをサーバからダウンロードし、クライアント側で実行すること。
* クライアントを後から拡張可能。
* ただし、アプリケーション全体の可視性は低下する(=クライアント側で実行開始後はサーバ側から把握できない？) 。

## RESTとRPCとの比較

### 関数呼び出し

* 通常の関数呼び出しをネットワーク越しに実行するのはオーバーヘッドが大きく、何回も実施するとなると性能面で不安がある。
* RESTのAPI呼び出しではそれより粒度が大きいので比較的問題にならない。

### 変更への強さ

* RPCはAPI使用が変わると互換性が失われ、全てのクライアントの修正が必要になる。→Webサービスに向かない。車内のみのツールやSDKではいい。
* RESTのAPIは規格が厳密で下位互換なためWebサービスに広く用いられる。

## URI設計

* URIはリソースの名前なので動作を示す名称をつけるのは好ましくない。
* 拡張子を用いるのは1つのリソースに対して表現を複数用意する時。  
eg) 言語設定(en/jp)、フォーマット(json/xml)
* 複数のパラメータで表現するリソース(緯度経度で表現する地図座標など)に対してはパラメータをセミコロンで繋ぐ。

なお、リソースの言語選択にコンテントネゴシエーションを用いる方法もあるが、日本語OSの利用者が英語版をみたい時などにブラウザの設定を変更する必要があるなど面倒がある点を考慮する必要がある。

## HTTP

* RESTの特徴を実現するWebの基盤となるプロトコル。

### VSCodeからHTTPリクエストを送ってみる。

ファイル形式をhttpとして`opt+cmd+R`で送信（右クリックから選択も可）。

```test.http
GET /timeline HTTP/1.1
Host: qiita.com
```

* クエリパラメータも指定可能。
* パスは相対パスでも絶対パスでokだが、`Host`の指定は必須。

```http
GET /search?q=test HTTP/1.1
Host: qiita.com
```

### HTTPメソッド

PUTとPOSTの違い：リソース作成時にURIを指定する権限がクライアント側(PUT)にあるかサーバ側(POST)にあるか

### ヘッダ情報

__MIMEメディアタイプ__

* メッセージでやりとりするリソースの表現を指定する。
* `Content-Type` : (タイプ)/(サブタイプ)のように指定。
* サブタイプには`x-`を付すことで独自に拡張できる。
PAST #3 O問題 <怪>

PAST #3 が無料ということでを受けました。AtCoderさんマジ女神 !
というのはいいんだけどO問題クソ難しかったです

誰だこの問題作ったの、これまともな解法ないだろ


[問題リンク](https://atcoder.jp/contests/past202005/tasks/past202005_o)

まず問題見てちょっと考ると簡単なDPが思いつきました
各輪について1投目で使う/使わない、2投目で使う/使わない、3投目で使う/使わないの8通りについてスコアへの寄与が計算できるので
dp[$i$][$j$][$k$][$l$] : $i$番目の輪までで1投目を$j$回, 2投目を$k$回, 3投目を$l$回使ったときの最大スコア
みたいなDPが立ちます
状態数は(ほぼ)$NM^3 \approx 6.2 \times 10^{10}$です。

...

遷移8個もあるしさすがに間に合うわけないので工夫を考えます

$M > \frac{N}{2}$の場合、選ぶ選ばないを全部反転して$M \leftarrow N - M$をすれば上のDPがほとんど同様に適用できます
$M \le 250$になって状態数が$500 \times 250^3$になりました(おいおい)

次に$N$個を半分ずつに分けて先ほどのDPをそれぞれでやることを考えました
そうすればdp1.back()[i][j][k] + dp2.back()[M - i][M - j][M - k]の最大値が答えです
ところで半分に分ける前にランダムシャッフルしておけば、最適解はどうせ3投全てにおいて左右からだいたい半分ずつ選ぶだろうから、左右それぞれのDPにおいては$i, j, k$が最終的に$\frac{M}{2} \pm 20$くらいに収まるやつだけ見ても多分バレないような気がします。うしししし

この条件でdp[$i$][$j$][$k$][$l$]として有効なのはだいたい

 - $j, k, l$が$i$以下($i$個しか見てないので当たり前)
 - $j, k, l$が$\frac{M}{2} + 20$以下
 - $j, k, l$が$(\frac{M}{2} - 20) - (N - i)$以上(以後全部使っても$\frac{M}{2} - 20$に届かないのは見なくていいので)
 
(off-by-oneとかは考えてないのでだいたいで)

実際に見る状態数は最大で$N = 500, M = 250$の場合でだいたい
$2 \times $  (左右で2回やるので)
$(1^3 + 2^3 + ... + 144^3 + 145^3 + 145^3 + ... + 145^3 + 144^3 + 143^3 + ... + 40^3)$
となります
計算すると$4 \times 10^8$くらいになってます、ほれーい !
DPをin-placeで更新して、遷移8個は直書きすると1400msくらいで通ります
やった ! (爆
(SIMDの類は多分役に立たないのでやってません)
$\pm 20$ の $20$ は $10$ くらいまでは減らしても通りました
正しい答えを出す確率みたいなの誰か計算してくれ
($20$ の値に関わらず) $\Theta(N^4)$ですがもとのDPに比べて1 / 150くらいに状態数が減ってます

ふぅ、反省してます
<i>やったやった、全完全完うしししし...</i>
CLI環境でFirebaseへログインする方法

# はじめに
Raspberry pi3（CLI only）にFirebaseの環境を構築しようとした際、Firebaseのログイン処理に苦戦したため、備忘録として残しておきます。


# どこで詰まったか
```
$ firebase login
i  Firebase optionally collects CLI usage and error reporting information to help improve our products. Data is collected in accordance with Google's privacy policy (https://policies.google.com/privacy) and is not used to identify you.

? Allow Firebase to collect CLI usage and error reporting information? Yes
i  To change your data collection preference at any time, run `firebase logout` and log in again.

Visit this URL on this device to log in:
https://accounts.google.com/o/oauth2/・・・・・・

Waiting for authentication...
```
ここでfirebase-cliを利用する装置上で、Webブラウザ（GUI）でURL（`Visit this URL on this device to log in:`の下に記載されている）へアクセスし、Googleアカウントの認証を行う必要がある。
しかし、うちのRaspberry piにGUIは入っていない。

# 解決策
`--no-localhost`オプションを追加し、URLの発行だけRaspberry pi上で行い、他のGUIが入ってる装置でGoogle認証を行う。

```
$ sudo firebase login --no-localhost
[sudo] password for hub:

Visit this URL on any device to log in:
https://accounts.google.com/o/oauth2/auth?・・・・

? Paste authorization code here:
```
`Visit this URL on this device to log in:`の下に記載されているURLに、他の装置上のブラウザでアクセスする。
GoogleアカウントへのログインとCLI利用の許可処理を行うと、パスコードが発行されるのでそれをコピーする。
コピーしたパスコードをRaspberry piに入力すると、「Success! Logged in as username」が表示され、無事Firebaseのログイン処理が完了する。

# 補足

```
Error: Authentication Error: Your credentials are no longer valid. Please run firebase login --reauth
```
上記のエラーメッセージが出た場合は`sudo firebase login --no-localhost --reauth`で改めて試すとログインできる。

# 参考文献
- [Configuration Commands, Firebase CLI (github)](https://github.com/firebase/firebase-tools)
Excel 任意のセルの値を行 / 列数を指定して参照抽出する関数と処理速度

# 目的
Excelで任意のセルの値を参照抽出したい場合の関数がいくつか用意されていますが、それぞれの処理速度を調べました。対象は**INDIRECT関数**、**OFFSET関数**、**INDEX関数**、参考に**VLOOKUP関数**。
例えば、Excelで生データを必要な順番に並び替えた上で解析したい場合などに、「Sheet1に生データを入力し、Sheet2で行数と列数を指定して抽出・解析する」ということを想定しています。
…まぁVBA使えばいいんですけどね。

# 評価方法
評価方法として、下のように**Sheet1**に**被参照データ(100万個)**、**Sheet2**に**参照データ(100万個)**を用意しました。
**Sheet1**には、1行目およびA列目に0～1000の数値が入力されており、B2セルより右下に行×列の数式が入力されています。
**Sheet2**には、A1セルに"Sheet1"の文字列が、1行目およびA列目に0～1000の数値が入力されており、B2セルより右下に各関数を用いた参照式が入力されています。
このExcelを**再計算**したときの**処理時間の10回平均**を3回求めました。

![Sheet1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55744/04e58856-7b91-a825-1a62-54fb7aa2762d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55744/ae0ba2e2-2f8c-e167-aa7a-1d32494cfcd8.png)

# 結果
結果をまとめると下記のようになりました。
**INDIRECT関数**だけがSheet名指定ができる一方で極端に遅く、**INDEX関数**は用途が限られますが非常に高速です。
バランスを考えると**OFFSET関数**が、体感的な処理速度が十分高速で、記述が短くて済み、範囲参照もできるため、汎用的でいいように思います。

|関数|Sheet名指定|範囲参照|数式文字数|処理時間1 [sec]|処理時間2 [sec]|処理時間3 [sec]|
|:--|:-:|:-:|:-:|:-:|:-:|:-:|
|INDIRECT関数 + ADDRESS関数|○|○|36|5.248193|5.297607|5.202295|
|OFFSET関数 + INDIRECT関数|○|○|43|5.235791|5.148193|5.283008|
|OFFSET関数|×|○|32|0.2808105|0.2843262|0.2863281|
|INDEX関数 + INDIRECT関数|○|×|45|5.406054|5.347656|5.247851|
|INDEX関数|×|×|34|0.0008300781|0.001513672|0.00078125|
|VLOOKUP関数|×|×|44|0|0.00078125|0|

# 参考
## B2セルの各関数の数式

```
INDIRECT + ADDRESS
=INDIRECT($A$1&"!"&ADDRESS($A2,B$1))

OFFSET + INDIRECT
=OFFSET(INDIRECT($A$1&"!$A$1"),$A2-1,B$1-1)

OFFSET
=OFFSET(Sheet1!$A$1,$A2-1,B$1-1)

INDEX + INDIRECT
=INDEX(INDIRECT($A$1&"!$1:$1048576"),$A2,B$1)

INDEX
=INDEX(Sheet1!$1:$1048576,$A2,B$1)

VLOOKUP
=VLOOKUP($A2-1,Sheet1!$1:$1048576,B$1,FALSE)
```

## 処理速度計算VBA

```vb
Sub Macro1()
    Dim startTime, endTime, time As Single
    time = 0
    For i = 1 To 10
        startTime = Timer
        Calculate
        endTime = Timer
        time = time + endTime - startTime
    Next
    time = time / 10
    MsgBox (time)
End Sub
```
TechAcademyが無料公開している「HTML・CSS入門講座」を受講する～HTML第1-4回～

# アジェンダ
* ブロック要素
* インライン要素
* HTMLでよく使われるタグ
 * meta
 * title
 * div
 * span
* 実践
 * divとspanの違い

# ブロック要素
それだけで一つの塊となる要素のこと。他の要素とは区別される。

# インライン要素
全体の要素の中にある、一部分の要素のこと。

# HTMLでよく使われるタグ
## meta
文書のメタ情報を示すタグ。文書全体の情報を示すので、\</meta>は存在しない。

## title
文書のタイトルを示すタグ。

## div
一つのブロック要素であることを示すタグ。

## span
一つのインライン要素であることを示すタグ。

# 実践
前回作成したファイルに、上記のタグを追加してみる。

```html:index.html
<!doctype html>

<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>自己紹介ページ</title>
  </head>
  <body>
    <div>おはよう！こんにちは！こんばんは！</div>
    <span>私はマコトです。</span>
  </body>
</html>
```


__\<meta charset="UTF-8">__
この文書の文字コードがUTF-8であることを示している。

__\<title>自己紹介ページ\</title>__
この文書のタイトルが「自己紹介ページ」であることを示している。

__\<div>おはよう！こんにちは！こんばんは！\</div>__
「おはよう！こんにちは！こんばんは！」という文書が、一つのブロック要素であることを示している。

__\<span>私はマコトです。\</span>__
「私はマコトです。」という文書が、一つのブロック要素であることを示している。

さて、このindex.htmlをWebブラウザで開くとこんな感じ。
![index.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648214/ce326746-2a8c-b6bb-6255-d8aa8ee07ac8.png)
タブに表示されているページのタイトルが「自己紹介ページ」となっている。

## divとspanの違い
上記のindex.htmlではdivとspanの違いがイマイチわからない。
そこで、次のdiff.htmlを作成してみる。

```haml:diff.html
<!doctype html>

<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>自己紹介ページ</title>
  </head>
  <body>
    <div>おはよう！<div>こんにちは！</div>こんばんは！</div>
    <div>おはよう！<span>こんにちは！</span>こんばんは！</div>
    <span>私はマコトです。</span>
  </body>
</html>
```

このdiff.htmlをWebブラウザで開くとこんな感じ。
![diff.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648214/7e2bd943-be69-4d94-52b1-8f32f92ed914.png)

なるほど。

divはブロック要素なので、\<div>\</div>の内側と外側が別の要素として区別される。
「こんにちは！」と「おはよう！」「こんばんは！」は別の要素なので、改行で分けられている。

spanはインライン要素なので、\<span>\</span>の内側と外側が区別されない。
「おはよう！こんにちは！こんばんは！」という一つの要素の中で、
「こんにちは！」のみ新たな要素が付与されている。

# おわりに
少しずつ専門的な内容が表れてきた。
ブロック要素とインライン要素を、目的によって使い分ける必要がありそうだ。

次回 >> [ここ](https://qiita.com/MakoMakoMakotsu/items/291cc0e93bed213d540a)

## 参考
[1-4 よく使われるタグ（はじめてのHTML）](https://www.youtube.com/watch?v=-51d4Z3FFw8)
【Unity】GETリクエストで取得したJSON形式のデータをパースする

# はじめに
UnityでJSON形式のデータをパースする方法について簡単にまとめました。

# 環境
Unity : 2017.4.40f1
OS : Windows 10 Home 2004

# 概要
UnityでJSON形式のデータをパースするには、主に2種類の方法があります。
それは、

- [MiniJSON](https://gist.github.com/darktable/1411710)を使う方法
- [JsonUtility](https://docs.unity3d.com/ja/current/ScriptReference/JsonUtility.html)を使う方法

の2種類です。

使い分けとしては、MiniJSONは**GETリクエスト用**、JsonUtilityは**それ以外（自分で用意したJSON形式のデータなど）用**でいいと思います。

なぜかというと、MiniJSONとJsonUtilityには大きな違いが一つあるからです。
MiniJSONは、JSON形式の構造を事前に宣言する必要がなく、JsonUtilityは事前に宣言する必要があります。
JSON形式の構造が複雑な場合それを手打ちで書き起こすのは面倒であり、おそらく多くの場合GETリクエストで取得したJSON形式のデータのうち使いたいものは一部分でしょう。
よって、GETリクエストで取得したJSON形式のデータをパースするにはMiniJSONが適しているといえるでしょう。
もちろん、取得したJSON形式のデータが複雑でない場合は、事前にJSON形式の構造を宣言してJsonUtilityを使ってもいいでしょう。

# コード
Unityプロジェクトはこちらからダウンロードできます。
https://github.com/GuiltyWorks/GetRequestWithJSON

それでは、実際のコードと実行結果を見ていきましょう。
※MiniJSON.csをアセットに入れておきましょう。
※今回は[livedoorの天気情報API](http://weather.livedoor.com/weather_hacks/webservice)を叩いています。適宜URLを変えてください。

【2021年7月追記】
※livedoorの天気情報APIは2020年7月にサービスが終了しました。

```C#:GetRequestWithJSON.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using MiniJSON;

public class GetRequestWithJSON : MonoBehaviour
{
    public string uri = "http://weather.livedoor.com/forecast/webservice/json/v1?city=130010";

    void Start()
    {
        StartCoroutine(GetRequest(this.uri));
    }

    private IEnumerator GetRequest(string uri)
    {
        Debug.Log("-------- GET Request Start --------");
        using (UnityWebRequest request = UnityWebRequest.Get(uri))
        {
            yield return request.SendWebRequest();
            if (request.isNetworkError || request.isHttpError)
            {
                Debug.Log("GET Request Failure");
                Debug.Log(request.error);
            }
            else
            {
                Debug.Log("GET Request Success");
                Debug.Log(request.downloadHandler.text);
                Dictionary<string, object> response = Json.Deserialize(request.downloadHandler.text) as Dictionary<string, object>;
                Debug.Log(response["title"]);
            }
        }
    }
}
```

エラーがある場合はエラーを表示し、エラーがない場合はGETリクエストで取得したJSON形式のデータを表示します。

# 実行結果
![json.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374029/59bf5cdf-db55-bc69-c223-02e0f743e3c8.jpeg)
![json2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374029/c4875d3f-eab4-7a08-fd18-04e21bc4367e.jpeg)

# 参考文献
[公式ドキュメント : UnityWebRequest.Get](https://docs.unity3d.com/2017.4/Documentation/ScriptReference/Networking.UnityWebRequest.Get.html)
[JsonUtility をつかって Unity で JSON を取り扱う方法](https://qiita.com/sea_mountain/items/6513b330983ffa003959)
[MiniJSON](https://gist.github.com/darktable/1411710)
gradleメモ


||Version|
|:--:|:--:|
|Gradle|6.5|

## Windows環境の人は最新化は再ダウンロードしましょう
https://gradle.org/install/#manually

## gradlew 生成

```sh
gradle wrapper
```

## gradlew によるバージョン更新
```sh
./gradlew wrapper --gradle-version=6.5
```

## Executable Fat Jar（実行可能Jar）

implementationの依存関係もちゃんと取り込む。

[Jar Task Document](https://docs.gradle.org/current/dsl/org.gradle.api.tasks.bundling.Jar.html)

```groovy
task fatJar(type: Jar) {
    archiveBaseName = "アーカイブベース名"
//    archiveClassifier = 'アーカイブ分類名'

    from sourceSets.main.output

    dependsOn configurations.runtimeClasspath
    from {
        configurations.runtimeClasspath.findAll { it.name.endsWith('jar') }.collect { zipTree(it) }
    }
    manifest {
        attributes 'Main-Class': "メインクラス完全修飾名"
    }
}

```

### 依存ライブラリをフォルダにかき集める例
```groovy
task fatJarDependCopy(type: Copy){
    println "fatJarDependCopy called."
    from {
        configurations.runtimeClasspath
    }
    into "build/libs/lib"
}
// サブプロくジェクトはJar化して調達すべし。
task fatJar(type: Jar) {
    dependsOn fatJarDependCopy
    archiveBaseName = "アーカイブベース名"
//    archiveClassifier = ''

    from sourceSets.main.output

    dependsOn configurations.runtimeClasspath
    def manifestClasspath = configurations.runtimeClasspath.collect { "lib/" + it.getName() }.join(' ')
    manifest {
        attributes 'Main-Class': "メインクラス名"
        attributes 'Class-Path': manifestClasspath
    }
}
[技術メモ]ブラウザにURLを打ち込んでサイトが表示されるまでの仕組み


初めに、DNSサーバにアクセスし、WebサイトのIPアドレスを特定します。
次に、そのIPアドレスを持つサーバーに対してhttpリクエストを送信します。

サーバーがそのhttpリクエストを元にクライアントの要求を承認すると、
サーバーはクライアントに“200 OK”というメッセージを返します。

承認が行われるとサーバーからWebサイトの情報がデータパケットという形で
転送されてクライアント側に表示されるという仕組みです。

自分は、下記の動画の図解がとてもわかりやすかったです！

https://www.youtube.com/watch?v=6S5MSEMOGqk
VPCについて

#前提
VPCについて学んだことを書いていきます。

#本題
プライベートサブネットを他のAWSと連携したい場合など、セキュリティを保ったままインターネットに接続したいケース。
どうすればいいか。

そこで登場するのが「NAT-GW」。
NAT-GWをパブリックサブネットに配置し、適切にルートテーブルを設定するとプライベートサブネットのインスタンスをインターネットに接続させることができる。
※逆向きは不可。インターネットからインスタンスへ通信することはできない。


#NATゲートウェイとは？
自動でENI（Elactic Network Interface）がアタッチされている。
このENIにサブネットのIPアドレスレンジよりプライベートIPが割り当てられる。

#ENIとは？
IPアドレスを割り当てて、EC2インスタンスやNATゲートウェイにアタッチして使用するもの。
VPC内の仮想NICサービス。

一部AWSサービスはVPCとリージョンの間に存在するものがある。
リージョンサービスという。
リージョンの外に存在するもの（IAMやRoute５３など）をグローバルサービスという。
EC２インスタンスがリージョンサービスを使用するために、必ずアントラセットなインターネットを通過するのはセキュリティリスクが高く、取り扱う情報によっては避けたいところ。
そういった時のために、VPCエンドポイントというサービスを利用すればインターネットを経由することなしに、これらリージョンサービスとプライベートな通信で接続することができる。

#VPCエンドポイントとは
S3などのリージョンサービスに対しVPCからプライベートに接続できる仮想ネットワークサービス。

ルートテーブルに対象のサービスを設定することによりアクセス可能となる。

VPCエンドポイント作成時に、どのサブネットから接続するかを指定するとそのサブネットのルートテーブルにプリフェックスIDというネットポイントが作成され、ルーティングされるようになる。

#プリフェックスリストIDとは
AWSのサービスが使用するパブリックIPアドレスレンジを示すもの。ID形式のこと。

VPCエンドポイントにはGateway型とInterface型の２種類ある。
・Gateway型
S3、DynamoDB
ルートテーブルに設定
安価

・Interface型
実体はENI
対象サービスは２４種類くらい
セキュリティグループをアタッチして使用
時間課金＆転送量課金

#VPCエンドポイントサービスとは
VPCのENIからプライベートな接続でサービス提供者側のVPCエンドポイントへアクセスし、サービス提供者のサービスを利用すること。
セキュリティスキャン系のSaaSサービスなどがあり、例えばCISCOが提供している、ネットワークの脆弱性をモニタリングするパブリッククラウドモニタリングといったサービスがある。

#Direct Connectとは
専用線サービスのこと。
データセンターやオフィスを専用線でつなぐサービス。
通信の帯域が保証されていたり、セキュリティ的安全性がある。
データセンターの物理サーバと大量のデータをやりとりする場合、データ転送料発生を安くできる。
Qiitaの使い方について

* 基本的にメモ。  
過去には@Wiki使ってたんだけど、なんとなく陳腐化してしまい、せっかくならと最近なサイトに移行。

# 過去に作ったページのリンク
* [Let's（ ＾ω＾）Study IT!](https://w.atwiki.jp/skmt200x/)
* [GitHub - skmt200x](https://github.com/skmt200x/)  
今現在は何も格納されてないかも。

# その他の参考にした記事

* [良い記事を書くためのガイドライン](https://help.qiita.com/ja/articles/qiita-article-guideline)
* [Qiitaで良い記事を書く技術](https://qiita.com/t12u/items/8c28484100dfd3a6351b)
* [Qiitaの投稿記事内でページ内リンクや目次リンクを行う方法](https://qiita.com/tsunasandot/items/d0972fb3bfc0d4156b34)  
どうも目次は自動では作れないっぽい？
* [Markdown記法 サンプル集](https://qiita.com/tbpgr/items/989c6badefff69377da7)
【python】所持金で購入できるおもちゃの最大個数を求めるプログラム

#【python】所持金で購入できるおもちゃの最大個数を求めるプログラム

自分用のメモです。


▼設問

- 各おもちゃの価格が入ったlistが与えられる。
- 所持金(ｋ)で購入できるおもちゃの最大個数を求める。


[URL](https://www.hackerrank.com/challenges/mark-and-toys/problem)


▼sample input

```python:
prices = [1,12,5,111,200,1000,10]
k=50
```

▼sample output

```python:
4
```

▼my answer

```python:
def maximumToys(prices, k):
    ans=total=0
    if min(prices) > k:
        return 0
    for price in sorted(prices):
        total += price
        if total <= k:
            ans+=1
    return ans

if __name__ == '__main__':
    fptr = open(os.environ['OUTPUT_PATH'], 'w')
    nk = input().split()
    n = int(nk[0])
    k = int(nk[1])
    prices = list(map(int, input().rstrip().split()))
    result = maximumToys(prices, k)
    fptr.write(str(result) + '\n')
    fptr.close()
```


<br>
一個も買えないパターンも考慮。