OmniAICreator/Qiita-1.07M huggingface dataset:
VS Codeの.jsx拡張子のファイルのアイコンをReact("javascriptreact")に変えたいとき

## はじめに
まず、今回はコーディングとはあまり関係なく、何方かと言えば環境設定の話です。

タイトル通りですが、VS Codeの.jsx拡張子のファイルのアイコンをReactに変えたくなって悶々としておりました。

なんでこんな状況になったかというと、今学習しているUdemyのコースで講師の`.jsx`ファイルのアイコンと自分の`.jsx`ファイルのアイコンが何故か違ったからです。

↓講師の画面
![スクリーンショット 2021-05-09 18.42.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711874/f817d44e-a9e4-4f1f-97f5-8dd5f2f5d32b.png)
↓自分の画面
![スクリーンショット 2021-05-09 18.42.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711874/b282add7-4bf4-9fc7-6ae6-3e2e3083d1be.png)

こっちは`.js`も`.jsx`のファイルも同じアイコンなのに…
自分のもReactのアイコンにしたい…（だって見た目かっこいいもん）

## 解決策
ということで、いろいろと調べながら試してみました。
（意外に日本語の情報はありませんでした。多分使っているエクステンションが違うのかな。それともわざわざ書くまでもないから記事になってないのかな…）

もったいぶらずに結論からいうと`setting.json`ファイルで以下の記述を入れればいいんですね。

```json
{
  "files.associations": {
    "*.js": "javascript",
    "*.jsx": "javascriptreact",
    "*.ts": "typescript",
    "*.tsx": "typescriptreact"
}
```
これで、ファイルを見てみると...
![スクリーンショット 2021-05-09 18.36.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711874/d52e4bef-fdb0-efe5-5ea5-1f639807ea83.png)
できましたっ！

VS Code画面左下の設定（⌘,) > 検索画面で `associations` と記入すると前述の`setting.json`の該当箇所を見つけることができます。

![65949086-ce7cce80-e43b-11e9-83ea-8ad07e27fb57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711874/3465b3b3-bdbd-c22d-bb8d-cfe257f11404.png)



ちなみにはじめは`vscode-icons`のエクステンションをインストールしているので、それ関連の設定を変更することを試してみてましたが、、、ダメでした。（以下試した設定）

```json
{
"workbench.iconTheme": "vscode-icons",
"vsicons.associations.files": [
        {
          "*.js": "javascript",
          "*.jsx": "javascriptreact",`
          "*.ts": "typescript",
          "*.tsx": "typescriptreact",
        }
      ]
}
```

参考にしたGitHubのvscode-iconsのレポジトリのIssueによると、どうやらVS Codeにインストールしていた`Babel JavaScript`エクステンションの設定が干渉しているようでした。
URL: https://github.com/vscode-icons/vscode-icons/issues/859

![スクリーンショット 2021-05-09 19.32.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711874/f849752c-d78c-0888-830d-082ababe6d9c.png)


自分のエディタで確認してみると、画面右下のとこで確かにファイル名の言語拡張子が`Babel JavaScript`として認識されていました。
![スクリーンショット 2021-05-09 18.46.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711874/1757558a-ae7d-0192-3476-6d66ee9b1cc8.png)

ちなみに設定を上記の解決できた記述に直したら、`JavaScript React`にちゃんと変わっていました。
![スクリーンショット 2021-05-09 18.46.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711874/eeb38d7a-e8cb-3c7d-be7d-90e7939ac3c1.png)

ちなみにvscode-iconsの設定でもカスタマイズ設定でできるみたいです。どうやら私がはじめに試した記法は間違っていたみたいですが、解決したのでその正しい記法は試していません。興味がある方はリンク先のイシューを見てみてください（該当のところのスクショを貼っておきます）
URL: https://github.com/vscode-icons/vscode-icons/issues/859
![スクリーンショット 2021-05-09 19.39.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711874/245cc263-e8b3-ec04-120a-c73bf4ced6e3.png)


## 参考記事
GitHub `vscode-icons/vscode-icons`
**After last update individual icons for jsx are gone #859**
URL: https://github.com/vscode-icons/vscode-icons/issues/859

### フロントエンド強化月間参加中！！
また**Qiitaのフロントエンド強化月間**にも参加中です！
なんというタイミング...これを機にフロントエンド技術を一気に学んでいきます。
コチラ→[Qiita フロントエンド強化月間][4]

[4]:https://qiita.com/official-events/b9ad63394fa2635dfca9
【学习笔记】Ansible

# 概要
最近Y社内的自己的项目开始转型，
由于chef（社内的）存在admin的管理问题，
考虑转移到别的PF上。
以前就用过ansible，现在重新买一节课温习一下。

FYI
- Terraform学习：https://qiita.com/yaoluffy/items/9db0cc7eeabbd321e9b5
- 教材Udemy： https://www.udemy.com/course/learn-ansible/learn/lecture/11060794

# 正文
## Inventory
放host信息的文件，一般长成这样

```
# Sample Inventory File

# Web Servers
web1 ansible_host=server1.company.com ansible_connection=ssh ansible_user=root ansible_ssh_pass=Password123!
web2 ansible_host=server2.company.com ansible_connection=ssh ansible_user=root ansible_ssh_pass=Password123!
web3 ansible_host=server3.company.com ansible_connection=ssh ansible_user=root ansible_ssh_pass=Password123!

# Database Servers
db1 ansible_host=server4.company.com ansible_connection=winrm ansible_user=administrator ansible_password=Password123!


[web_servers]
web1
web2
web3

[db_servers]
db1

[all_servers:children]
web_servers
db_servers
```

## Playbook
把一系列的操作（install，config，start，shutdown等等）写到一个yaml文件里面，长成这样

```
-
    name: 'Execute two commands on localhost'
    hosts: localhost
    tasks:
        -
            name: 'Execute a date command'
            command: date
        -
            name: 'Execute a command to display hosts file'
            command: 'cat /etc/hosts'

```

- 相当于Chef的cookbook
    - FYI： https://www.simplilearn.com/ansible-vs-chef-differences-article
- 用`ansible-playbook`启动（而非`ansible`命令）
- task的执行顺序很重要，所以用队列来写（不能用map）

### Jinja2
playbook里面用了{{}}来做vars，这里用的就是jinja2
FYI： https://www.jianshu.com/p/f04dae701361

### Conditional
ansible里面也有条件语句（when）和循环语句（loop）
loop里的值需要被调用时用item，例

```
tasks:
 - user: name='{{ item }}' status=present
   loop: 
     - joe
     - george
```

还能通过register把结果暂存起来，例

```
-
    name: 'Add name server entry if not already entered'
    hosts: localhost
    tasks:
        -
            shell: 'cat /etc/resolv.conf'
            register: command_output
        -
            shell: 'echo "nameserver 10.0.250.10" >> /etc/resolv.conf'
            when: 'command_output.stdout.find("10.0.250.10") == -1'

```

### Role
Role说白了就是共享包，类似于import
方便引用别人的东西， 然后自己再customise一下具体用哪些功能或者改哪些功能。

# 感想

- 如果真的打算将postgresql移植到k8s上，ansible也没有必要使用了
    - 想象一下，如果要用ansible又不想维护，那ansible在k8s的deployment将成为必要
    - 直接写postgresql的deployment岂不是更加省事
    - 因为容量之类的问题，导致无法在k8s上装postgres，那还是建议保持现状（因为ansible和chef的差别就不大了）
- ansible的应用场景是建立在架构需要从实力开始的情形，即IaaS
    - 换句话说，PaaS，CaaS都不需要ansible这项工具
    - IaaS的话，感觉和Terraform一起食用更佳
- Katacoda
    - 一个免费的一次性建立环境的在线工具
genericsについて調べてみたり、使ってみたり

## 初めに

こちらの記事はgenericsについて調べてみたち、使ってみたりという自分の備忘録です。

## genericsとは

型を引数で渡すことができるというもの

```typescript
function func<T>(value: T) {
  return  value;
}

func<string>("hello") // hello
func<number>(1) // 1
func<{ name: string }>({ name: "keisei" }) // { name: 'keisei' }
```

ちなみに関数を実行をする時に型を指定しなかった場合は勝手に注釈してくれます。

```typescript
function func<T>(value: T) {
  return  value;
}

func("hello") // hello
func(1) // 1
func({ name: "keisei"}) // { name: 'keisei' }
```

## extendsを使って型に制約をつけてみた

```typescript

// extendsを使って呼び出し時にnameを必ずつけないといけないようになる。
function func<T extends { name: string }>(value: T) {
  return  value.name;
}

func({ name: "名前", age: 10 }) // OK！
```

下記はコンパイルエラーになる。

```typescript
function func<T extends { name: string }>(value: T) {
  return  value.name;
}

func({ age: 10 }) // NG！
```

![スクリーンショット 2021-05-09 12.23.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305148/42c06975-c807-954c-638d-5d6d6d473a77.png)


## keyofを使ってみる

```typescript
  // 型引数の『U』の部分でkeyofを使ってオブジェクトのキーをユニオン型にする // key: "namge" | "age" となる。
  type TUser =  { name: string, age: number }
  function getValue<T extends TUser, U extends keyof T>(user: T, key: U) {
    return user[key]
  }

  const user = {
    name: "tanaka",
    age: 20,
  }

  console.log(getValue(user, "name"))  // 第二引数は "name" か "age" しか受け付けない。

```

## アウトプット

#### ジェネリクスでユーザーの型を選択してみた。

おそらくこんな感じで使うだろうと思っている。

```typescript

type TUser = {
    name: string,
    age: number
  }

  // 前提：好きなゲームにどのようなユーザーでログインをするかという事を想定している。。
  type TAppUser<T> = { 
    name: string;
    loginUser: T
  } 
 

  type TAdminUser = TUser & {
    role: string,
    status: string
  }

  const normalApp: TAppUser<TUser> = { // ストリートファイターを通常のユーザーでやりたい
    name: "ストリートファイター",
    loginUser: {
      name: "kekek",
      age: 1
    }
  }

  const adminApp: TAppUser<TAdminUser> = { // サモンナイトを管理ユーザーでやりたい
    name: "サモンナイト",
    loginUser: {
      name: "kekek",
      age: 1,
      role: "super",
      status: "fine"
    }
  }  
```

## Utilityで個人的に失念しそうだが使えそうと思っているもの

| 名前 | 使いどころ  |
|:-----------|:------------|
| Pick       | 指定した型を追加した新たな型を構築 |
| Omit     | 指定した型を除去した新たな型を構築 |
| Exclude  | 割り当て可能な型を除外することにより、キー名を使った新たなユニオン型を構築 |
| Extract  | Excludeの反対、共通する型に絞り込んだ、キー名を使った新たなユニオン型を構築 |


## 合わせて勉強になった記事やドキュメント

- [Utility Typesをまとめて理解する](https://qiita.com/k-penguin-sato/items/e2791d7a57e96f6144e5)
- [Utility Types](https://www.typescriptlang.org/docs/handbook/utility-types.html)
【動画あり】whonixで仮想マシンを匿名化しよう

#Whonixとかいう最強の匿名化OS
##※詳しいことは動画で説明しています。
https://www.youtube.com/watch?v=fPkyOjDiW9U

###1.whonixダウンロード
https://www.whonix.org/wiki/VirtualBox

###2.whonixをvirtualboxにいれる
ファイル→「ファイル仮想アプライアンスインストール」

###3.whonix-gateway設定
初期アカウント
user : changeme

sudo apt-get-update-plus dist-upgrade
パッケージを最新

sudo apt-get install -y im-config ibus-mozc fonts-ipafont fonts-vlgothic
※im-configは入力メソッド設定

sudo apt-get install -y kde-l10n-ja mozc-utils-gui mozc-server ibus-mozc uim-mozc
※kde-l10n-jaは入力を日本語化

###4.whonixのtorrcの設定

nano /etc/tor/torrc
※細かい過去動画を参照してください

###5.kalilinuxとWhonixを連携

ネットワークを【内部ネットワーク】に変更
名前はWhonix

IPアドレス『10.152.152.50』
サブネットネットマスク『255.255.192.0』
デフォルトゲートウェイ『10.152.152.10』
DNSサーバー『10.152.152.10』

https:// check.torproject.org/
【Vue.js】computedについての理解を整理してみた

#はじめに
この投稿ではcomputed（算出プロパティ）について自分の理解を整理してみました。

#そもそもプロパティとは
computedの説明に入る前にプロパティについて簡単に整理します。
プロパティとはひとことで言えば「オブジェクトを定義するもの」です。

オブジェクトは下のsample.jsでいうところの{ }（波カッコ）で定義されます。
{ }の中にはプロパティ（sample.jsではel）と値（sample.jsでは'#app'）を記述します。

```vuejs:sample.js
new Vue({
    el: '#app'
});
```

#computedとは
では、本題に入っていきます、

computedとはVue.jsに用意されているプロパティの一つで、
「算出プロパティ」とも呼ばれます。

computedはdataプロパティと同様にデータの変化を画面に即時反映しますが、
computedはデータそのものに何らかの処理を与えたいものをプロパティにしたいときに使用します。

使用例は以下の通りです。
こちらは簡単なカウンターアプリで
10を超えると「10以上です」という文字が表示されます。

```vuejs:index1.html
<body>
    <div id="app">
        <button @click="increment">+1</button>
        <p>{{ count }}</p>
        <div v-if="isOver">10以上です</div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script src="./script/script.js"></script>
</body>
```

```vuejs:script1.js
new Vue({
    el: '#app',
    data() {
        return {
            count: 0
        };
    },
    methods: {
        increment() {
            this.count++;
        }
    },
    computed: {
    		isOver() {
        	return this.count >= 10;
        }
    }
});
```
（JSFiddleにそのままコピペして挙動を手元で確認できます！）
#HTMLに条件式を書き込めば良くないか？
先ほどのcomputedを使ったカウンターアプリについて、
以下の実装でも良いのではないか？と思った方もいらっしゃるのではないでしょうか。

```vuejs:index2.html
<body>
    <div id="app">
        <button @click="increment">+1</button>
        <p>{{ count }}</p>
        <div v-if="count >= 10">10以上です</div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script src="./script/script.js"></script>
</body>
```

```vuejs:script2.js
new Vue({
    el: '#app',
    data() {
        return {
            count: 0
        };
    },
    methods: {
        increment() {
            this.count++;
        }
    }
});
```
そうです、computedなんて使わず、
HTML側のコードに直接 "count>=10" と書く込む方法です。

実際にこの実装でもアプリは想定通りの挙動をしてくれます。

しかし、このような実装は「良くない」とされています。
理由は「HTMLの可読性が下がるため」です。

今回例として示しているのは単純な条件式ですが、
これが更に複雑になり条件式の記述が長くなると、HTMLの可読性を保つことは難しくなります。

以上の観点からv-ifの条件をHTMLのタグには記述せず、
そのようなロジックは冒頭で示した通り算出プロパティを使用して
JavaScript側に分離して実装すべきでしょう。

#参考資料
・Vue.js公式ドキュメント
　https://jp.vuejs.org/v2/guide/computed.html
・書籍「Vue.js入門 基礎から実践アプリケーション開発まで」
・書籍「たった1日で基本が身に付く！ Vue.js 超入門」
Cloud Foundryのデプロイで急にNode.jsが動かなくなった件


いつも通りにCI経由でデプロイしてたらデプロイが失敗してました。

`.nvmrc`にバージョンを記載するやり方でバージョン指定をしていましたが、突如指定しているバージョンが利用できなくなってフェイルするという事案が発生しました。

> 参考: [Cloud Foundry（IBM Cloud）でNode.jsのバージョン指定【.nvmrc】](https://qiita.com/n0bisuke/items/8fc4d2c1b032e1c35206)

## no match found for 15.12.0

以下が急に発生したデプロイエラーです。

`.nvmcr`には確かにv15.12.0で記載してました。

```bash
API がファイルの処理を完了するのを待機しています...

アプリをステージングし、ログをトレースしています...
   Downloading nodejs_buildpack...
   Downloaded nodejs_buildpack
   Cell f4f7f92d-7651-4673-be44-27fba5eccf8c creating container for instance 92dbe423-2c84-410c-9721-b2ebe13f7c1f
   Cell f4f7f92d-7651-4673-be44-27fba5eccf8c successfully created container for instance 92dbe423-2c84-410c-9721-b2ebe13f7c1f
   Downloading app package...
   Downloading build artifacts cache...
   Downloaded build artifacts cache (43.6M)
   Downloaded app package (13.4M)
   -----> Nodejs Buildpack version 1.7.48
          **WARNING** buildpack version changed from 1.7.46 to 1.7.48
   -----> Installing binaries
          engines.node (package.json): unspecified
          engines.npm (package.json): unspecified (use default)
          **WARNING** Using the node version specified in your .nvmrc See: http://docs.cloudfoundry.org/buildpacks/node/node-tips.html
          **ERROR** Unable to install node: no match found for 15.12.0 in [10.24.0 10.24.1 12.22.0 12.22.1 14.16.0 14.16.1 15.13.0 15.14.0]
   Failed to compile droplet: Failed to run all supply scripts: exit status 14
   Exit status 223
   Cell f4f7f92d-7651-4673-be44-27fba5eccf8c stopping instance 92dbe423-2c84-410c-9721-b2ebe13f7c1f
   Cell f4f7f92d-7651-4673-be44-27fba5eccf8c destroying container for instance 92dbe423-2c84-410c-9721-b2ebe13f7c1f
アプリケーションのステージング時にエラーが発生しました: App staging failed in the buildpack compile phase
失敗
```

特に何も記載の変更はしてなく、 急に15.12.0が使えなくなるという。。 こんなことあるんですね。

## buildpacksの指定

結局前にやったBuildpacksの指定をするのとpackage.jsonに指定をすることで回避ができました。

> 参考: [Cloud Foundry（IBM Cloud）でNode.jsの最新バージョンを利用する](https://qiita.com/n0bisuke/items/cf435ab9a24836513d14)

```manifest.yml
applications:
 - name: My-APP
   random-route: true
   memory: 128M
   command: npm start
   buildpacks:
    - https://github.com/cloudfoundry/nodejs-buildpack
```

package.jsonでバージョン固定にすると今回みたいな事象が起こるかも知れないなと思い、最新の一つ前くらいを指定して、それ以上という指定の仕方にするようにしました。

```package.json
  "engines": {
    "node": ">=15.0.0"
  },  
```

[nodejs-buildpackの現状の最新](https://github.com/cloudfoundry/nodejs-buildpack/releases/tag/v1.7.50)を見ると16.1.0まで対応してるっぽいので最新版を使えそうです。

```bash
//省略

-----> Installing node 16.1.0
          Download [https://buildpacks.cloudfoundry.org/dependencies/node/node_16.1.0_linux_x64_cflinuxfs3_aebbbe59.tgz]
          Using default npm version: 7.11.2
```

デプロイすると16.1.0がインストールされてました。

## まとめ

`特定のNode.jsのバージョン固定で指定している`かつ`Buildpacksの指定をしていない状態`で発生する問題なのかもしれません。

Cloud Foundry側で自動的に読み込むbuildpacksのバージョンに対応しているNode.jsのバージョンと、手元で指定したNode.jsのバージョンの食い違いが発生するといった感じでしょうか。

他のPaaSなどを使ってても出会ったことがない初めてのケースでビビりました。

`15.0.0`などの固定ではなく、`>=15.0.0`などの指定にした方が無難ですね。
Cでポインタから変数の値を知る方法

Cでポインタから変数の値を知る方法です

```C
#include <stdio.h>

int main(void)
{
    int a;
    int *pX;

    a = 7;
    pX = &a;

    printf("変数aの値は%dです。\n",a);
    printf("変数aのアドレスは%pです。\n",&a);
    printf("ポインタpXの値は%pです。\n",pX);
    printf("*pXの値は%dです。\n",*pX);

    return 0;

}
```
AWS ubuntu


AWS ubuntu wordpress構築

```

sudo apt-get update
sudo apt-get -y upgrade

sudo timedatectl set-timezone Asia/Tokyo

sudo apt-get -y install apache2

sudo apt-get -y install php php-mysql

データベース(MariaDB)のインストール

sudo apt -y install mariadb-server mariadb-client

sudo mysql_secure_installation
パスワード入力

WordPress用データベースの作成
sudo mysql -u root -p
CREATE USER 'ユーザー名'@'localhost' IDENTIFIED BY 'パスワード';
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8;
SHOW DATABASES;

実行してデータベースが作成されたか確認します。

WordPressで使用するデータベースユーザーの作成(SQL)
grant all privileges on wordpress.* to 'ユーザー名'@'localhost';
FLUSH PRIVILEGES;

quit

フォルダの所有者の変更
cd /var/www
sudo chown ubuntu:ubuntu html

WordPressのダウンロード、展開
cd /var/www/html
sudo wget https://ja.wordpress.org/latest-ja.tar.gz
sudo tar xf latest-ja.tar.gz

sudo rm latest-ja.tar.gz
sudo chmod -R 777 wordpress
sudo chown -R www-data:www-data wordpress

パブリックDNS/wordpess


```
【初心者向け】id名・class名で使えない文字

#どうも7noteです。id名・class名で使えない文字について

HTMLを書く際にidとclassはほぼ必須といっても過言ではありません。

しかし、idやclass名を書く際に**使えない文字がある**ことを覚えておく必要があります。

## id名、class名で使えない文字

### 数字から始まるもの

数字から始まるid名やclass名は使えません

`<div class="123">これはダメ</div>`
`<div class="abc123">これはOK</div>`

調べたところ、**どうしても数字から始まるid名やclass名を使いたい場合の方法もある**ようです。
https://qiita.com/ka-ko/items/feacb4d3ff22666d51b1

### ハイフン(-)、アンダースコア(_)以外の記号

使える記号はこの2つだけです。それ以外の#だったり&を入れてしまうと効かなくなってしまいます。
エラーの原因になる可能性があるので、記号はこの2つのどちらかのみを以外使用します。

ただし、ハイフン(-)１つだけのクラス名はNGです。
`<div class="-">これはダメ</div>`
`<div class="--">これはOK</div>`


### 半角スペース

これも、使えません。
半角スペースについては、入れてしまうと半角スペースの前と後で別々のクラス名と認識されてしまいます。

`<div class="hello world">helloとworldの2つのクラス名扱いになる</div>`


### 改行

これも半角スペース同様に2つのクラス名扱いになります。

`<div class="hello
world">helloとworldの2つのクラス名扱いになる</div>`



### 同一ページで複数の同じid名

要検証
同一ページ内で、同じid名を複数使うことはできません。
エラーの原因になるので必ずid名は同一ページ内では固有のものにしましょう。

## 使えなさそうで実は使えるもの

### 日本語(全角文字)・全角スペース

**これ、実は使えます。**しかし一般的に使ってるサイトはほぼありません。

HTML5・CSS3から使えるようになっていますが、それまでは基本英語で指定していたこともありますし、ソースを見るのが日本人とは限らないこともあるので、現状英語を使うのが無難でしょう。

全角スペースだけでもクラスとして使用は可能だが、だれもこんな指定はしない。
`<div class="　">一応OK。でもだれも使わない。</div>`

## まとめ

細かいルールの通りでいくと以下の記事でまとめられていたとおりになります。

https://gist.github.com/think49/d8fbcf7f1c743e21bc79bb7d16178cad

>引用:
1. 文字[a-zA-Z0-9]およびISO 10646のU+0080以上の文字、さらにハイフン（-）およびアンダースコア（_）のみを含むことができる
2. 数字([0-9])、2つのハイフン(--)、ハイフンの直後の数字(-[0-9])で開始できない
3. バックスラッシュ(\)で文字をエスケープできる(例: \- は - を表す)
4. Unicodeエスケープシーケンスを利用できる(例: \\0030 は 0 を表す)


物によって、またブラウザによってここで書かれているものでもちゃんと認識して動くものがあるかもしれません。
しかし、一般的に使えないものであり、全てのブラウザで対応していないため、**この記事で紹介したものをid名・class名として使用することはおすすめしません。**


---
【フロントエンド強化月間に参加中↓↓】

https://qiita.com/official-events/b9ad63394fa2635dfca9

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
【覚書】Gist を簡易的な DB として使う

個人的な利用の範囲で、めちゃくちゃ楽な方法でクラウドにデータを保管したいと思ったので、Gist を使ってみた。

# GitHub 側の設定

1. https://github.com/settings/tokens でアクセストークンを取得して控えておく。
1. https://gist.github.com/ で db.json を作成して URL を控えておく。

# JS 側の実装

```js
/**
 * Gist の db.json の内容を取得
 * @param {string} id Gist ID /Example: https://gist.github.com/username/{HERE}
 * @returns {Promise<object>} 内容
 */
const getGist = async (id) =>
  (await (await fetch("https://api.github.com/gists/" + id)).json()).files[
    "db.json"
  ].content;

/**
 * Gist の db.json を書き換え
 * @param {string} id Gist ID /Example: https://gist.github.com/username/{HERE}
 * @param {string} token アクセストークン
 * @param {object} body 書き換える内容
 * @returns {Promise<object>} レスポンス
 */
const setGist = async (id, token, body) =>
  await (
    await fetch("https://api.github.com/gists/" + id, {
      method: "PATCH",
      headers: {
        Accept: "application/vnd.github.v3+json",
        Authorization: "token " + token,
      },
      body: JSON.stringify({
        description: "Updated at " + new Date().toLocaleString(),
        files: {
          "db.json": {
            content: JSON.stringify(body),
          },
        },
      }),
    })
  ).json();

```

これで OK 。

# 注意

アクセストークンが漏洩すると色々とヤバいので、見えるところに置くのはガチでやめたほうがいい。
【laravel】ルーティング、絶対正しい！いつも通りなのに動かん？！

#結論：バージョンの問題
##バージョン8からルーティングの書き方が変わっている



```php:バージョン8から
Route::get('/user', [UserController::class, 'index']);
```
↓今まで

```php:バージョン7まで
Route::get('/user', 'UserController@index');
```
バージョン8でこの書き方をすると、「コントローラーが見つからない」って怒られる←当然
<br>

今までがバージョン7以下だったからか。
（※バージョン8は2020年9月8日からリリース）
Angularアプリ開発手順

## プロジェクト作成
[Angularプロジェクト作成](https://qiita.com/ishibe-m/items/e9aa3f510f7679325526)

launch.jsの記述内容

```launch.json
{
  // IntelliSense を使用して利用可能な属性を学べます。
  // 既存の属性の説明をホバーして表示します。
  // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "type": "pwa-chrome",
      "request": "launch",
      "name": "Launch Chrome against localhost",
      "url": "http://localhost:4200",
      "webRoot": "{プロジェクトのルートURL}"
    }
  ]
}
```
XMC4800 Relax EtherCATキット ④EtherCATサンプルプログラムを動かす(マスタースレーブ組み合わせ)

#ケーブル接続
USBケーブルとLANケーブルを接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/18591aa6-8421-c9cd-a3af-b7c2632ff922.png)

#ビルドとソフト書き込み
リビルドする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/9b8cc6c3-f95a-230f-42d2-27b28e40ac7e.png)
デバッグボタンを押してソフトを書き込む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/dcbea6d0-fa88-9626-19b9-763253ad3c04.png)
実行ボタンを押してプログラム動作を開始する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/7554edcd-ec7f-0d5d-0d9a-ee91b02601fe.png)

#マスタからスレーブの状態を読み取り/指令を与える
### TwinCAT3を起動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/47b64724-a2e8-7937-5dbc-db02aef1a2ae.png)
### 新しいプロジェクトを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/c9c83983-2be1-4b7b-48dd-78a3f6fab0e8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/f54c8479-f056-9e88-0dbf-8e06b8a468e7.png)
### EtherCATデバイスをスキャン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/9c7f954f-4b4c-ca53-45d7-f7b9cf5dff22.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/2e559c7b-fe98-da6b-b36f-8da7170f887e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/c2cda75f-4b6e-a13c-809d-23f39b00fa32.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/a04a806e-7a9f-06e2-408a-b9195118cd6b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/53b20846-b5a5-a0d5-c2e2-b4b4fecfe7ec.png)
スキャンが終わるとソリューションエクスプローラーにEtherCATデバイス(マスタ)とEtherCATボックス(スレーブ)が追加されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/80637177-0cf9-3858-1135-123b98ede400.png)
### スレーブの状態を読み取る
IN_GEN_Bit1をウォッチに追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/51cb0502-5c51-c192-1874-90886b9ce313.png)
スレーブのButton1の状態がマスタからはIN_GEN_Bit1として読み取れます。スレーブのButton1を押すことでオンライン波形が変化します。
同様に、スレーブのButton2の状態がマスタのIN_GEN_Bit2に対応しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/0ac6251f-ce60-07dd-45f0-73028f1e61f2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/7caa80c0-97fb-a0ee-acb2-dbdaa513bfbc.png)
### マスタから指令を与える
OUT_GEN_Bit1に1オンラインライトするとスレーブのLED1が点灯します。同様にOUT_GEN_Bit2～8によりスレーブのLED2～8を制御できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/4ae1fd98-ba0a-b417-98d4-d1949904038a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/83518e24-4126-590f-5fc4-f9862884043e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/e3617bb3-abfc-8654-9f4c-b2dfef57fdc7.png)
OUT_GEN_INT1に50000をオンラインライトするとスレーブのLED2の点灯光量が小さくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/969e8b40-28a6-09ff-4489-937906e28015.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/3f4204b9-f0a5-3dd0-424c-83ad75f8b25d.png)
【JavaScript】配列の差分を取得する

# はじめに

2つの配列から差分を取得したいと思い、調べたので実装方法をメモしておきます。
「2つの配列の差分を取得する」というのは例えば以下のような例を想定しています。

### 例
配列1
[1, 2, 3, 4, 5]

配列2
[1, 2, 3]

この2つの配列の差分[4, 5]を取得したい、ということです。

# 実装方法
今回の実装方法では `filter` 関数を使います。(もっと楽な方法があればぜひ教えてください)

```js
const array1 = [1, 2, 3, 4, 5]
const array2 = [1, 2, 3]

const array3 = array1.filter(i => array2.indexOf(i) == -1)
console.log(array3) //[4, 5]
```

`indexOf`は値が見つからない場合に-1を返します。
`filter`と`indexOf`を利用することで、配列の差分を取得できました。
WordPressのホスト名変更方法

WordPressのローカル検証環境を作成する際、Admin画面へのアクセスが本番に向いてしまい、アクセスできなくなったのでその対応方法の覚書

## 検証したWordPressのバージョン
* 5.7.1

## ホスト名の管理元
ホスト名はデータベース上で管理されているため、データベースの値を書き換える必要がある

## データベース上の値を変更
`wp_options` テーブルの `siteurl` と `home` を書き換える
以下のクエリで書き換え可能

```sql
update wp_options set option_value = 'http://{変更先ホスト名}' where option_name = 'siteurl';
update wp_options set option_value = 'http://{変更先ホスト名}' where option_name = 'home';
```

* 変更先ホスト名
    * `localhost` など、変更先のホスト名を入力
例外処理に強くなるにはこちらから。

# はじめに
開発する上で、避けたいけど避けられない。エラー。。
どんな優秀なエンジニアもエラーには何度も遭遇します。
例外処理を記述しておくことで、デバッグや想定外のエラーにも対応できたりとメリットがたくさんあります。
例外処理を書けるようにしておくと良いでしょう！

# 例外処理について
まず、「例外」とはなんらかの異常が発生したことを表すオブジェクトです。
例外が発生すると、例外はコールスタックまで遡り、トップレベルまで伝播して行きます。

```ruby
メソッド②で例外発生
↓
メソッド①呼び出し
↓
トップレベル呼び出し
```

例外オブジェクトは、`Exception`またはそのサブクラスのインスタンスです。

![例外.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622448/21fc81ab-4684-0b81-5bca-5bdb11f4eee3.jpeg)

（出典： [Ruby Exceptions](http://rubylearning.com/satishtalim/ruby_exceptions.html)）

## 例外の制御
### 例外を発生させる

`Kernel#raise`を使用する。

```ruby
# 第一引数に文字列を指定すると、RuntimeErrorが発生
raise 'error!' #=> RuntimeError: error!

# 第一引数に例外クラスを指定出来る
raise StandardError, 'error!' #=> StandardError: error!
```

### 例外を捕捉する
例外の発生する可能性のある式は`begin〜end`に記述する。

```ruby
begin
  do_process
rescue => e # 例外オブジェクトを変数eに代入
  puts "puts #{e.class}"
end

# 例外を指定すると、指定したクラスとそのサブクラスの例外が捕捉される
begin
  do_process
rescue Exeption => e # 例外オブジェクトを変数eに代入
  puts "puts #{e.class}"
ensure # 最後に必ず実行する処理
  puts 'ここまでで処理は終了しました'
end
```

例外オブジェクトの主な操作は以下の通りです。

```ruby
# クラス名
e.class #=> StandardError

# エラーメッセージ
e.message #=> "error!"

# コールスタック
e.backtrace #=> ["sample.rb:9:in 'maaain'", "sample.rb:11:in '<main>'"
```

















# 終わりに
開発において例外処理をすることは、かなり重要になってきます。
ここを怠ると、自分で発見出来ていないバグによって、サービス利用者に迷惑をかけたりすることもあるので、意識して記述して行きましょう！！
【Java】MapでforEachメソッドを使う方法

# はじめに
本記事では、Java8で追加されたListやMapなどを巡回（Iterate）するためのforEachメソッドについてアウトプットします。
以下ではMapを巡回するための方法について書きます。

#①Lambdaを使用する場合

```java
Map<String, String> capitalsMap = new LinkedHashMap<>();
		capitalsMap.put("Paris", "France");
		capitalsMap.put("Beijin", "China");
		capitalsMap.put("Berlin", "Germany");
		capitalsMap.put("Canberra", "Australia");

		capitalsMap.forEach((k, v) -> {
		    System.out.println("key: " + k + ", value: " + v);
		});
```

##出力
```
key: Paris, value: France
key: Beijin, value: China
key: Berlin, value: Germany
key: Canberra, value: Australia
```

#②entrySetを使用する場合

```java
Map<String, String> capitalsMap = new LinkedHashMap<>();
		capitalsMap.put("Paris", "France");
		capitalsMap.put("Beijin", "China");
		capitalsMap.put("Berlin", "Germany");
		capitalsMap.put("Canberra", "Australia");

		capitalsMap.entrySet().forEach(entry -> {
		    System.out.println("key: " + entry.getKey()
		            + ", value: " + entry.getValue());
		});
```

##出力
```
key: Paris, value: France
key: Beijin, value: China
key: Berlin, value: Germany
key: Canberra, value: Australia
```

# まとめ
個人的にはentrySetを使った方が分かりやすいですが、
Lambdaを使った方がコードがスッキリして良いと思いました。

#参照
[Java Platform SE8 #Map](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Map.html)
Geekbench(cross-platform)を使ってみる

# Geekbench(cross-platform)を使ってみる
Wikipedia( https://en.wikipedia.org/wiki/Geekbench )の説明を引用する。

>Geekbench is a cross-platform utility for benchmarking the central processing unit of computers. Geekbench began as a benchmark for Mac OS X and Windows[2] and was created by John Poole who ran the now defunct Geek Patrol website,[3] which reviewed hardware and software designed for Macs, and featured editorials and interviews of interest to the Mac community.

<font color="orange">**CPUに関するcross-platformのベンチマーク**</font>である。 

身近なところで、WindowsのノートPCと、Xpediaのスマホで試してみた。

# 結果
https://browser.geekbench.com/v5/cpu/search で、先日実行した結果をブラウズ、以下のとおり。（自動で結果がアップされる/されてしまう。無償版だから？）

■スマホ
![aaa1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/0d8b762a-defe-12c2-7cf5-195c590b5987.png)



■WindowsノートPC
https://browser.geekbench.com/v5/cpu/search



![aaa2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/322c6bd9-6747-8d17-0536-e3b4c6bd53a8.png)


# 実行中のwindow
特に意味ありませんが、実行させると、3分ぐらい、実行される。↓が画面例。



![aaa3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/78d666d0-d90b-1ee1-8513-5d0b8a2bde37.png)

# 所感
cross-platformであり、また、シンプルでいいと思った。お薦め。
[win vs mac] windowsのキーボード入力の設定をmacに近づける

#はじめに
こんにちは．今回は超短い記事になるはず．
各所で**「winとmacどっちがいいの？」「＊＊＊のOSはクソだ」「やっぱubuntuでしょ」**という声が聞こえます．正直どれでもいいと思います．**所属しているとこ（会社・チーム・研究室・ゼミ）の使用率，もしくは尊敬する先輩に合わせてがベスト**だと思っています．
私は全て使った結果，winをメインに使用しています．（ただRobotのソース作製は主にubuntuです．）winを選ぶ理由は機械科の授業でCADのアプリインストールに必須だったため，最近anacondaやWSLの環境が増えてきたのでプログラミングやファイル処理がやりやすくなった（WSLでもROS使えそう？！）`macのキーボード設定に近づけられるようになったため`です．
まあ色々とありますが，最後の理由のキーボード設定に関して，ちゃちゃっとまとめます．

#やり方
1. 設定で**「IME」**と検索し**「日本語IME設定」**をクリック．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106935/60bfbde7-b4e6-c0b9-7ef4-ff0e776f20fc.png)

1. **「キーとタッチのカスタマイズ」**をクリックして**「キーの割り当て」**まで移動．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106935/a2e3dbfb-9687-2571-ffa6-1171856af256.png)


1. **「各キーに好みの機能を割り当てる」**をオンにする．もし日本語版macキーボードと同じ設定にしたいなら
**無変換キー⇒INE-オフ**
**変換キー ⇒INE-オン**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106935/c7d0191c-0fee-bc6d-9640-a2a6165bd958.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106935/c1179b3a-e861-55d5-7512-23edb6e1601e.png)

---
**以上です**
下の2つの設定（[Ctrl + Space] or [Shift + Space]）でもonとoffの切り替えができます．まあ変えるなら上記に紹介した方法で十分かと思います．（他にも面白いセッティングがあればコメントください）
．．．とこんな感じで書きましたが，まとめると
「相手に迷惑かけない＋仕事の効率を上げる」という条件の下であれば好きなPCと設定を使えばよい．だと思います．皆さんゴールデンウィークは終わりです😓お仕事頑張りましょう！
【Java】正規表現及びその具体例のまとめ

#正規表現（Regular expression）まとめ
正規表現：
・文字列のパターンをまとめたもの
・不正な文字列がないかの入力チェックを容易に行える

正規表現の数は膨大だが、よく使うものを次節以降にまとめる。

＊正規表現すべての一覧はjava.util.regex.PatternクラスのAPIドキュメントに載っている
https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/regex/Pattern.html

##パターンの例⓵
| パターン文字 | 意味 |
|:-:|---|
| xyz  | xyzという文字列  |
| [xyz]  |  x,y,zのどれか一文字 |
| [^xyz] |  x,y,z以外のどれか一文字 |
|  [a-z]|a-z(小文字アルファベット)のどれか一文字|
| [a-z][A-Z]  |  小文字アルファベットまたは大文字アルファベットのどれか一文字 |
| [a-zA-Z]  |  ↑に同じ |

##パターンの例②（数量子）
数量子…任意の数の文字を表現する

| パターン文字 | 意味 |
|:-:|---|
| x?  | xが0または1回<br>(例："ax?z" -> "az" or "axz")  |
| x*  | xが0回以上<br>(例："ax*z" -> "az", "axxxxxz" etc)  |
| x+  |  xが1回以上<br>(例："ax+z" -> "axz", "axxxxxz" etc) |
| x{n}  | xがn回<br>(例："ax{3}z" -> "axxxz")  |
| x{n,}  | xがn回以上<br>(例："ax{3,}z" -> "axxxz", "axxxxxz" etc)  |
| x{n,m}  | xがn回以上m回以下<br>(例："ax{3,4}z" -> "axxxz" or "axxxxz")  |

##パターンの例⓷（定義済み文字列）
定義済み文字列…[a-z]や[0-9]といった文字集合を省略して表記

| パターン文字 | 意味 |
|:-:|---|
| . | 任意の文字  |
|  \d | 数字[0-9]  |
|  \D | 数字以外[^0-9]  |
|  \s | 空白文字[\t\n\x0B\f\r] |
|  \S | 空白文字以外[^\s]  |
|  \w | 単語構成文字[a-zA-Z_0-9]  |
|  \W | 単語構成文字以外[^\w]  |


#Javaで正規表現を用いる具体例
##具体的なメソッドの例
- クラスPatternのメソッド
 - static Pattern compile(String regex)
    - 指定された正規表現をPatternにコンパイルする

- クラスMatcherのメソッド
    - public boolean find()
        - 入力シーケンスからこのパターンとマッチする次の部分シーケンスを検索する
    - public String group()
        - 前回のマッチで一致した入力部分シーケンスを返す


- Stringクラスのメソッド
 - public String replaceAll​(String regex, String replacement)
     - 指定された文字列（あるいは正規表現）に一致する各部分文字列に対し、指定された置換を行う
    - public String[] split​(String regex)
     - 文字列を指定された正規表現に一致する位置で分割する
    - public boolean matches​(String regex)
     - 文字列が指定された正規表現と一致するかどうかを判定する

##具体例⓵
電話番号をハイフンで分割

```java
public class ApiSample {
	public static void main(String[] args) {
		String str = "000-0000-0000";
		String[] str2 = str.split("-");
		for(String s :str2) {
			System.out.println(s);
		}
	}
}
```

```:実行結果
000
0000
0000
```

##具体例②
文字のみを取り出したい

```java
public class ApiSample {
	public static void main(String[] args) {
		String str = "a. b. c. b. e";
		String[] str2 = str.split("\\.\\s");
		for(String s :str2) {
			System.out.println(s);
		}
	}
}
```

```:実行結果
a
b
c
d
e
```

##具体例⓷
アルファベット以外の文字で分割

```java
public class ApiSample {
	public static void main(String[] args) {
		String str = "abc$de@fgh0ijk^lmn";
		String[] str2 = str.split("[^a-zA-Z]");
		for(String s :str2) {
			System.out.println(s);
		}
	}
}

```

```:実行結果
abc
de
fgh
ijk
lmn
```

#おわりに
参考書籍：Java SE8 Silver　黒本
ABC200

# はじめに
はじめまして

現在は京都に住んでいる大学院生です。atcoderに関する投稿を行っていきたいなと思っています．

つい先月まで就活をしていました．多浪ということで、ただでさえハードな就活がコロナによってさらにベリーハードになるのではと不安になりました．しかし、特につまずくことなく無事終えることができました．

内定くださった企業さんありがとうございます．

atcoderの現在のレートは下図のような感じです．多浪らしく残念なくらいのんびりした成長スピードですが、頑張っていきます

![スクリーンショット (111).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465908/4141a3eb-3092-4909-6d40-82c5145eb186.png)


自習をしリハビリしてからABCに参加しようか悩みましたが、実践あるのみということでとりあえず記念すべきABC200に参加させて頂きました.

ABC200[https://atcoder.jp/contests/abc200]

#全体の感想
A、B、C問題は15分程で解答できました．しかし、D問題はさっぱり分からず1時間考えた後、諦めてお風呂に入りました。

順位を途中見た感じ、他の人もD問題で苦戦してるように見えました。

# 各問題の感想
### A問題

100で割って，割り切れるかどうかで1を足すか判別させました。

```python
n=int(input())
if n%100==0 :
    print(n//100)
else :
    print(n//100+1)
```

### B問題

操作通りに実装しただけです．200の倍数であれば、200で割り、そうでなければ1000倍した後に200を加えました。

```python
n,k=map(int,input().split())
for i in range(k) :
    if n%200==0 :
        n=n//200
    else :
        n=n*1000+200

print(n)
```

### C問題

200という数字がやたら出てくるのは200回目だからかな、と思いつつC問題を解きました。

「差をとった際に200で割り切れる組み合わせの個数は」という問題でした．差をとって200で割り切れるということは、言い換えれば「200で割った際、余りが同じ数字の中から2組を選んだ場合の数」かなと考えました。

そこで、countというリストを作り、余りがiとなる数字が数列にあればcountのインデックスiに1を加えて個数を数えました。

最後にcountリスト内に2以上の数字nが出てくれば、nC2で計算しました。

```python
n=int(input())
a=list(map(int,input().split()))
count=[0]*200
ans=0

for i in a :
    count[i%200]+=1
for i in count :
    if i==0 or i==1 :
        continue
    else :
        ans+=i*(i-1)/2
print(int(ans))
```

### D問題

これに関しては解いている最中はさっぱり分かりませんでした．数列B、Cはなんか個数も異なる場合があるみたいだし何でもありなのか？と思い、どうすればいいか全くでした．

解説を読むとどうやら鳩ノ巣原理を使うようです．競プロというよりもはや数学だ、、、
8種類の余りが存在すれば、2**8=256で一応256種類の数字が出てくることから、少なくとも余りは0から199まで存在し、256-200=56で56個はどこかの余りと被るようです．

はじめは256種類の数字について、そもそもすべて異なる余り（0から199の余りが出現）になる保証はあるのか？とか、その場合8種類の選び方にも何かしら条件があるのでは？とか、余計な事を考えました。

ここの範囲については高校数学Aの整数分野について学習しなおした方が良さそう、、、



```python
n=int(input())
a=list(map(int,input().split()))
m=min(n,8)
count=[0 for _ in range(200)]

for i in range(1,2**m) :
    cnt=0

    #----enumerateはインデックスと要素を出力----#
    for j,k in enumerate(a) :
        if i>>j&1 :
            cnt+=k
    cnt%=200
    if count[cnt]==0 :
        count[cnt]=i

    #----同じ余りが二つある場合----#
    else :

        #----先にi番目について----#
        print("Yes")
        blst=[]
        clst=[]
        for l in range(m) :
            if i>>l&1 :
                blst.append(l+1)
        i=count[cnt]

        #----次にcount[cnt]に書かれている順番について----#
        for o in range(m) :
            if i>>o&1 :
                clst.append(o+1)
        print(len(blst),*blst)
        print(len(clst),*clst)
        exit()

print("No")
```

### E、F問題

まだ僕には解くのは早いようです．精進してからまたいつの日か解きます．

修論書く前には解けるようになりたいなあ（願望）

# 最後に
久しぶりのABCでしたが、思いのほか解けました．レートも上がって万々歳です．9月以降は修論が本格的に始まり、そちらのコードを書かないといけないので、恐らくABCに参加できる頻度は下がるかなあと．

7月中にはぜひ緑まで行きたいですね．
Gitコマンドまとめてみた



# はじめに

これから就職するにあたって、いままで個人開発だけで済んでいたところ
チーム開発をする必要が出てきたので、使いたいコマンドをまとめてみた。使えるコマンド一覧という形で簡単にまとめたので、詳しく知りたい場合は調べていただくとより理解が深まると思います。


# 解説

1. ```git status``` どのファイルが変更されたかを確認するコマンド

2. 実際どんな変更を加えたか差分を見るコマンド

## addする前の変更分
```git diff```
```git diff <ファイル名>```

## addする後の変更分
```git diff --staged```

3. 変更履歴を確認する
```git log```
```git log --oneline``` 一行で簡潔に表示する←これが便利そう
```git log -p index.html```ファイルの変更差分を表示する
```git log -n <コミット数>``` 

4. ファイルの削除を記録する
```git rm <ファイル名>``` 
```git rm -rf <ファイル名>``` 上記のコマンドがうまくいかんかった時
```git rm -r <ディレクトリ名>```
```git rm --cached <ファイル名>``` ファイルを残したいけどgitの記録からは消したい場合
```git reset HEAD``` rmを取り消す場合

5. ファイル名の変更を記録する
```git mv <旧ファイル> <新ファイル>```

git add とかcommitとかpushは割愛

とにかく当面はこれらのコマンドを頻繁に使って、慣れていこうと思います

6. バージョン管理したくないファイルを無視する
バージョン管理したくないファイルとは
➀passwordなどの、秘密情報が記載されて流出してはいけないファイル
例：AWSのpasswordなど
➁チーム開発において不要なファイル
例：キャッシュやWin, Macなどで自動生成されるファイル

- .gitignoreファイルの描き方
```<ファイル名>``` 指定したファイルを除外
```dir/``` ディレクトリ以下を除外

7. ファイルへの変更を取り消す
```git checkout -- <ファイル名>```
```git checkout -- <フォルダ名>```
```git chechout --.``` 全変更を取り消す

8. ステージした変更を取り消す
```git add```したけど間違えたときに使う取り消しコマンド
```git reset HEAD <ファイル名>```
```git reset HEAD <ディレクトリ名>```
```git reset HEAD .``` 全変更を取り消す
9. 直前のコミットを取り消す
```git commit --amend``` ※pushする前のみ使える
```git commit --amend```

10. リモートの情報を確認する
```git remote```
```git remote -v``` 対応するURLを表示

11. リモートリポジトリを複数持つこともできるよ
使い方→チーム開発と個別にいじりたいとき用で使い分けたい時

12. リモートから情報を取得する場合
```git fetch <リモート名>```
```git fetch origin```

13. リモートから情報を取得する場合(pullの場合)
マージするまでを一発でする方法
```git pull <リモート名><ブランチ名>```
```git pull origin master```
```git pull```　省略コマンド

14. fetchとpullの使い分け
　pull = fetch + merge

15. merge
```git merge <branch name>```
```git merge <remote name/branch name>```
```git merge origin/master```

masterにfeatureをmergeする場合
```git pull origin master```
```git checkout feature```
```git git add featureでの変更分```
```git commit```
```git checkout master```
```git merge feature```
　

15. コンフリクトどうしよう問題
 
 15.1 コンフリクト解決方法
 同じ行を複数人が変更した場合など、どちらのブランチを優先すべきかとなりコンフリクトが起こる
　※github上のコンフリクトしているメッセージのリンクに飛ぶと、解決方法が出てくる
 developブランチでgit pull
 git checkout コンフリクトしているブランチ
 git merge develop
 git statusで確認すると、コンフリクトしているファイルが確認できる
 vscodeでコンフリクト箇所修正
 ファイルをgit add⇨commit⇨push
 解決！

 ## コンフリクトの予防法
　- 複数で同じファイルを変更しない
　- pullやmergeする前に変更の状態をなくしておく(commitやstashをしておく)
　- pullするときは、pullするブランチに移動してからpullする
　
16. ブランチを変更・削除
```git branch -m 新しいブランチ名```　ブランチ名の変更
```git branch -d ブランチ名```　ブランチの削除
```git branch -D ブランチ名``` 強制的に削除 

17. プルリクの流れ
プルリク⇨コードレビュー⇨マージ⇨ブランチを削除
18. タグをつける
リリースポイントなどにつけるとおすすめ
19. 作業を一時非難させる
```git stash```
```git stash save``` 上と同じコマンド
20. git stashしたものを確認
```git stash list```
21. stashした作業を復元
```git stash apply```
```git stash apply スタッシュ名``` 特定の作業を復元する
22. stashした作業を削除する
```git stash drop```
```git stash drop スタッシュ名```
```git stash clear```　全削除

## 追記
- githubのソースコードコピペはRawからCtrl+Aの方が早いぞ！！
~~(筆者は今までこれを知らず、長いコードも必死にドラッグしてコピペしてた)~~

- コマンドにエイリアスを付けると、コマンド入力が短く楽になるぞ！！(いちいちcheckoutとかstatusとか打つのめんどい)

```git config --global alias.br branch```

これで以降、```git br```で```git branch```と同じコマンドとして使える

この要領でckeckout→co, stasus→st, commit→ciという感じで設定していこう(備忘録→自分ではcommitはcmで設定している)
バックスラッシュ記法早見表

# 主なバックスラッシュ記法

| 表記 | 意味 |
|:-:|:-:|
| \t  |  　　　　　　　　　　　　　　　タブ　　　　　　　　　　　　　　　　　 |
| \n  |  　　　　　　　　　　　　　　　改行　　　　　　　　　　　　　　　　　 |
| \r  |  　　　　　　　　　　　　　 キャリッジターン　　　　　　　　　　　　　　　　　 |
| \f  |  　　　　　　　　　　　　　　　次ページ　　　　　　　　　　　　　　　　　 |
| \b  |  　　　　　　　　　　　　　　バックスペース　　　　　　　　　　　　　　　　　 |
| \a  |  　　　　　　　　　　　　　　　ベル　　　　　　　　　　　　　　　　　　 |
| \e  |  　　　　　　　　　　　　　　　エスケープ　　　　　　　　　　　　　　　　　 |
| \s  |  　　　　　　　　　　　　　　　空白　　　　　　　　　　　　　　　　　 |
| \nnn  |  　　　　　　　　　　　　　　8進数表記(n=0〜7)　　　　　　　　　　　　　　　　　 |
| \xnn  |  　　　　　　　　　　　　　 8進数表記(n=0〜9、a〜f)　　　　　　　　　　　　 |
| \cx  |  　　　　　　　　　　　　  　コントロール文字　　　　　　　　　　　　　　　　　　　 |
| \unnnn  |  　　　　　　　　　　　　Unicodeエスケープ(n=0〜9、a〜f)　　　　　　　　　　 |
【TypeScript】TypeScript の交差型


# 交差型 ( Intersection Types )
* `&`で複数の型を結合する事ができます
* オブジェクト型で使う場合、複数のオブジェクトのプロパティが結合されたオブジェクトになります
    * `type ManagerEmploee = Admin & Employee;` 
* Union型で使う場合、複数のUnion型が共通で保持する型になります
    * `type Universal = Combinable & Numeric; ` // number型

```ts
type Admin = {
  name: string;
  privileges: string[];
}

type Employee = {
  name: string;
  startDate: Date;
}

type ManagerEmploee = Admin & Employee;

const e1: ManagerEmploee = {
  name: 'ManagerCat',
  privileges: ['create-server'],
  startDate: new Date(), //現在日時を生成
}

```

* インターフェースを使う事もできます

```ts
interface Admin  {
  name: string;
  privileges: string[];
}

interface Employee  {
  name: string;
  startDate: Date;
}

interface ManagerEmploee extends Employee, Admin {} //複数のinterfaceを実装

```

* 交差型は、型の定義に使う事もできます

```ts
// union型
type Combinable = string | number;
type Numeric = number | boolean;
type Universal = Combinable & Numeric; // 交差部分がnumberのみであるので number型になる 
```
[Ruby]モジュールを使いこなしてみた。

# はじめに
現場の開発においてモジュールはかなり使う技術だと思います！
よく使うだからこそ、細かい使い方まで知っていることが開発スピードの向上や、他の人のコードの読解にも役立ちます。

# モジュールについて
簡単に説明すると、「インスタンス化出来ないクラスのようなもの」です。
モジュール定義の中に、別のモジュールやクラスを定義したり出来るので、名前空間として利用できます。

```ruby
module FooModule
  class FooClass
    ...
  end
end

FooModule::FooClass #=> FooModule::FooClass
```

## 特徴

- インスタンスを生成出来ない
- 継承する事は出来ない
- 名前空間を作ることが出来る
- モジュールのメソッドを、、
    - あるクラスのインスタンスメソッドとして取り込む
    - あるオブジェクトの特異メソッドとして取り込む
- モジュール関数を定義して使う

## クラスにモジュールを取り込む
モジュールに定義されたメソッドを、クラスのインスタンスメソッドとして取り込むことを`Mix-in(ミックスイン)`と言います。

### include
モジュールをクラスに取り込むには`include`を使用します。
インスタンスメソッドとして取り込むので、メソッドのレシーバはインスタンスです。

```ruby
module Hello
  def foo
    puts 'hello! foo!'
  end
end

class Sample
  include Hello
end

sample = Sample.new
sample.foo #=> 'hello! foo!'
```

### prepend
モジュールのメソッドをクラスのインスタンスメソッドとして継承ツリーの下位に取り込みます。
前述のincludeと比べて、こちらの方がメソッドの実行順として優先されます。

```ruby
module Foo
  def foo_method
    p 'foo_method!'
    super
  end
end

class Bar
  prepend Foo

  def foo_method
    p 'bar_class!!!'
  end
end

bar = Bar.new
bar.foo_method #=> "foo_module!!!", "bar_class!!!"
```

### extend
モジュールに定義されたメソッドを、オブジェクトの特異メソッドとして取り込むこともできる。
`extend`により、そのオブジェクトにだけ特定の振る舞いを与えることができます。

```ruby
module Greet
  def greet(name)
    puts "hello! #{name}"
  end
end

class Sample
  extend Greet
end

sample = Sample.new
sample.greet('World') #=> 'hello! World'
```

## モジュール関数
privateなインスタンスメソッドであると同時に、モジュールの特異メソッドであるメソッドのこと。

```ruby
# 定義方法
module SampleModule
  def hello(name)
    puts "Hello #{name}"
  end
  module_function :hello #helloメソッドをモジュール関数とする。
end

# まとめて定義する方法
module SampleModule
  module_function #これ以下にメソッドを定義することでモジュール関数となる

  def hello(name)
    puts "Hello #{name}"
  end

  def greet(name)
    puts "Good Morning #{name}"
  end
end
```

### モジュール関数の呼び出し方

```ruby
#直接的にモジュールから呼び出す。
SampleModule.hello('Tanaka') #=> Hello Tanaka

#includeする。
include SampleModule
hello('Tanaka') #=> Hello Tanaka
```

# 終わりに
モジュールは奥が深いけど、確実に自分の武器になるので扱えるようになりたいものですね！
少しずつ頑張りましょう。。！
継承について理解したい！

# はじめに
皆さんは、「継承」を使いこなせていますでしょうか？
開発において使わないことはないのですはないか、というくらいに頻繁に利用します。
確実に抑えておきたい技術です！

# 継承について
Rubyは単一継承をサポートしています。
継承された方のクラスを`スーパークラス`、した方を`サブクラス`と言います。
サブクラスには、スーパークラスのメソッドが継承されます。

```ruby
class Parent
  def parent
    puts 'hello parent!'
  end
end

class Child < Parent
  def child
    puts 'hello child!'
  end
end

child = Child.new
child.parent #=>'hello parent!'
child.child #=>'hello child!'
```

## オーバーライド
スーパークラスに定義済みのメソッドを、サブクラスで定義することをオーバーライドという。
オーバーライドすることで、スーパークラスを引き継ぎながら追加で新たな処理を追加できる。

```ruby
class Parent
  def hello
    puts 'hello parent!'
  end
end

class Child < Parent
  def hello
    super #=> Parent#helloが呼び出される

    puts 'hello child!'
  end
end

child = Child.new
child.hello #=> 'hello parent!' 'hello child!'
```

スーパークラスを調べるには、`クラス名.superclass`で取得できる。

```ruby
Child.superclass #=> Parent
```

## 継承されるもの
サブクラスは、スーパークラスのインスタンスメソッド、クラスメソッド、定数を継承します。

```ruby
class Parent
  PARENAT = 'PARENT'
  def initialize
    @foo = 'foo'
  end
end

class Child < Parent
end

Parent.new #=> #<Parent...@foo="foo">
Child.new #=> #<Child...@foo="foo">

Child::PARENT #=> "PARENT"
```












# 終わりに
継承をすることで、リファクタリングにもつながるので正しく利用しましょう！
LeafletでGPSログ(GPX)地図：クライアントローカルGPXファイルを指定可能に。

地図データを扱うJavaScriptライブラリ「Leaflet」を使って、GPSログ(GPXファイル)の地図表示を試している。

今回、パソコン等のクライアントローカルにある任意のGPXファイルを指定して地図表示ができるようにした。GPXファイルはサーバーに送られるわけではない。すべてJavaScriptでクライアントサイドで処理を行っている。

詳細は以下。
「LeafletでGPSログ(GPX)地図：クライアントローカルGPXファイルを指定可能に。」
https://2ndart.hatenablog.com/entry/2021/05/09/165116

![20210509165849.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374794/1687c032-aac2-5b02-6e67-a04eaee1af5f.jpeg)
Docker 操作コマンド

様々なOS環境を用意するのに何かと便利なDockerです。
主なコマンドを振り返ってみました。


１　イメージの取得

```
docker pull （イメージ名）
```
例 centos7イメージをcentos という名前のコンテナで取得

docker pull centos:centos7

Docker はDockerイメージをもとにDockerコンテナを作成します。そこで利用したいDockerイメージをDocker Hubから入手する必要があります。

１−２　使われていないimageを一括削除する

```
docker image prune
```

２　起動中のコンテナを確認

```
docker ps （オプション）
```
-a を付けることで全てのコンテナを確認できます。


３　以前起動していたコンテナを起動

```
docker restart コンテナID
```

４　起動したコンテナに入る

```
docker exec -it コンテナ名（コンテナIDでも可） コマンド名
```



例
docker exec -it （コンテナID） /bin/bash（コマンド名）


コマンド名はPCのシェルに合わせます。bash等
これでコンテナ操作できます。

５　コンテナから抜ける

```
exit
```
FlutterWebで画像リンクを実現する

## 概要
Webページでよくある、ハイパーリンク付きの画像。これをFlutterWebで実現するとどうなるかというのを書いてみます。


## 前提
* Flutterのバージョンは2.0で動作確認しています。（1系のバージョンでも変わらないとは思うけど）

## 要件とその対応
* 当然ですが、画像をタップしたら設定したリンクのページに飛べることが要件です。それを実現するために`GestureDetector`というWidgetを使ってそれがタップ（クリック）されたら、そのURLを開くという動作を実装します。実装の詳細は[Hyperlinking an image to an URL in Flutter](https://stackoverflow.com/a/51708997)にて紹介されています。

* 画像にホバーしたら、カーソルの形も変わってほしいところです。これは[How to change Flutter Desktop cursor pointer?](https://stackoverflow.com/a/62587283)の記事にある通り、`MouseRegion`というWidgetを使って、そこにカーソルの形を設定します。設定できるカーソルの形は[SystemMouseCursors class](https://api.flutter.dev/flutter/rendering/SystemMouseCursors-class.html)にまとめられています。


## 実装サンプル
外部のURLに画像を格納している前提としているので、画像の読み込みに`Image.network`を使用しています。

```dart:sample.dart
import 'package:url_launcher/url_launcher.dart';
・
・
・
new MouseRegion(
  cursor: SystemMouseCursors.click,
  child: GestureDetector(
    onTap: () async {
      await launch(displayPost["https://遷移先URL"]);
    },
    child: Image.network(
      "https://画像の格納先URL",
      width: 500,
      fit: BoxFit.fitWidth,
    )
  ),
)

```
【Windows】SHA256などのファイルハッシュ値を確認する方法

Windows10の標準機能でファイルのハッシュ値を確認する方法を紹介します。
コマンドプロンプトでcertutilコマンドを実行すると、ファイルのハッシュ値を調べることができます。

```
certutil -hashfile ＜ファイルパス＞ [ハッシュアルゴリズム]
```
ここではダウンロードフォルダにダウンロードした「7z1900-x64.exe」というファイルのハッシュ値（SHA256）を計算する例で解説します。

#ハッシュ値の計算方法
デスクトップの左下の検索画面に「cmd」と入力して『Enterキー』でコマンドプロンプトを開きます。
![ハッシュ値1 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646368/a55dd2a4-5dcd-1fdf-5c45-83e90af25300.png)

コマンドプロンプトに「certutil -hashfile 」と入力します。
![ハッシュ値2 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646368/7d4cae41-7cae-e088-7a2c-f8c2af0cfda6.png)

ダウンロードフォルダの「7z1900-x64.exe」をコマンドプロンプト内にドラッグ＆ドロップします。
![ハッシュ値3 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646368/17f02088-9e69-6825-719f-14cb986739d5.png)

![ハッシュ値4 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646368/60a28f3f-c67a-550e-e921-0591eb3df887.png)

![ハッシュ値5 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646368/54f83710-522d-f09c-d637-f8f236c6f3de.png)


ファイルパスの後ろに「SHA256」を入力します。
![ハッシュ値6 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646368/65c4da74-a0bb-cc32-9406-853d6e88e63c.png)

これで『Enterキー』を押せばファイルのハッシュ値が表示されます。
![ハッシュ値7 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646368/fbca709a-25f5-acc8-501c-766fef9d11c1.png)


#ハッシュアルゴリズムについて
上記で解説したようにファイルパスの後ろにハッシュアルゴリズムを記載することで指定することができます。
※Windows10の場合、ハッシュアルゴリズムを指定しない場合はデフォルトの「SHA1」となります。

ハッシュアルゴリズムは以下のものが指定可能です。
・MD2
・MD4
・MD5
・SHA1
・SHA256
・SHA384
・SHA512
[Ruby]変数の違いを理解していますか？？

# はじめに
Rubyにはいくつもの変数の種類があります。
理解して使いこなすことが、開発レベルやコードの綺麗さが向上します。
スコープによって、いくつかの種類に分けられていますので、使いこなせるようにしましょう！

## ローカル変数
最もスコープの狭い種類の変数。

スコープの範囲は、、、
・ブロック
・メソッド定義
・クラス、モジュール定義
・トップレベル

```ruby
foo = 'foo'

def puts_foo
  puts foo #=> NameError
end

puts foo #=> 'foo'と表示
```

## グローバル変数
非常に広いスコープを持つ変数。存在しないグローバル変数を指定するとnilを返す。
※可読性が下がる可能性があるため、あまり使用しない

スコープの範囲は、どこからでも参照可能です。

```ruby
$foo = 'foo'
puts $bar #=> nil
```

## 定数
変化しない値を扱う変数。大文字で定義するのが慣習です。
※再代入すると、警告が出るが禁止はされていない。

```ruby
FOO = 'FOO'

puts FOO #=> 'FOO'

def bar
  BAR = 'BAR' #=> 文法エラー
end
```

## インスタンス変数
インスタンスの中でのみ参照できる変数。「@〜」から始まる変数。

```ruby
class Ruler
  def length=(val)
    @length = val
  end

  def length
    @length
  end

ruler = Ruler.new
ruler.length = 30
ruler.length #=> 30

end
```

`attr_accessor`を利用することで、簡単に定義出来ます。

```ruby
class Ruler
  attr_accessor :length
・
・
・
end
```

## クラス変数
クラスとそのインスタンスをスコープとした変数。「@@〜」から始まる変数。

```ruby
class Foo
  @@foo = 'foo'

  def foo
    puts @@foo
  end

  def self.foo
    puts @@foo
  end

foo_class = Foo.new

foo_class.foo #=> 'foo'
Foo.foo #=> 'foo'
```

## 終わりに
普段使うもの、あまり使わないもの、いろいろありますが知識として持っておくことで、使い分けが可能になります！