OmniAICreator/Qiita-1.07M huggingface dataset:
IPアドレス / URL / ドメイン

##IPアドレス
インターネットプロトコルにおいて、`ネットワーク上の端末を特定する情報(番号)`である。 
`グローバルIPアドレス`と`プライベートIPアドレス`の2種類がある。
例 135.79.24.68

IPv4では、約43億個のIPアドレスしか使えず、限られたIPアドレスを効果的に割り当てる必要がありました。
その為、インターネット上に出ていく通信(WAN)には一意なアドレス(`グローバルIPアドレス`)を割り当て、LAN内の通信にはLAN内でのみ一意なアドレス(`プライベートIPアドレス`)を割り当てていました。

例えると、`グローバルIPアドレス`は企業の外線電話で、`プライベートIPアドレス`は内線番号に当たります。
外線電話の番号は世界中で重複しませんが、内線番号は他の企業の内線番号と重複していても問題ありません。

ルータが`プライベートIPアドレス`から`グローバルIPアドレス`にアドレス変換してくれるのですが、この変換機能のことを`NAT(Network Address Translation)`といいます。


##グローバルIPアドレス
インターネット上で一意なアドレス。

##プライベートIPアドレス
LAN内でのみ有効なアドレス。

##URL / ドメイン
`「IPアドレス」を人間が読みやすいように変換したもの。`
コンピューターはインターネット上の住所を数字だけの「IPアドレス」で認識しています。 そのIPアドレスを、人間が読みやすいように置き換えたものが`ドメイン`です。

例 URL→ https://www.sample.com/application/index.html
`https:` = `プロトコル名`
`www.` = `ホスト名`
`sample.com` = `ドメイン名`
`application/index.html` = `ファイルパス`

`DHCPが端末に自動でIPアドレスを設定`し、`DNSがドメイン名とIPアドレスを対応させて変換`してくれます。

##DNS (Dynamic Name System)
`ドメイン名とIPアドレスを対応させて変換するシステム。`

##DHCP(Dynamic Host Configuration Protocol)
`Dynamic(動的に) Host(端末情報) Configuration(構成)する為のプロトコル(通信規約)。`
インターネットの普及により、端末の数が膨大に増えたことでこの仕組みができました。

端末電源入→DHCP機能を持ったサーバーにIPアドレスを要求→DHCPサーバーがIPアドレスを割り当てる。
表示されている地図の「1ピクセルは何メートルか？」を計算する

地図の世界の座標は緯度経度や実測のメートルやキロメートルなどがよく使用されますが、地図を使用したソフトウェアでは、しばしば「画面上のピクセル単位」で距離を指定したい場合があります。

例えば地図上の POI をクリックで選択するときの選択可能範囲は実測のメートル指定では地図を拡大するとヒットしやすく、縮小するとヒットしにくくなってしまうのでピクセル単位で指定したいです。

そのためには「1ピクセルは地図上では何メートルか？」を求める必要があります。

- [Get map meters per pixel - JSFiddle - Code Playground](https://jsfiddle.net/amay077/hrgc0fwn/42/)

```javascript
const spanElem = document.getElementById('label');

const map = new mapboxgl.Map({
  container: 'map',
  center: [-122.486052, 37.830348],
  zoom: 15,
  style: {
    version: 8,
    sources: {
      OSM: {
        type: "raster",
        tiles: [
          "https://a.tile.openstreetmap.org/{z}/{x}/{y}.png",
        ],
        tileSize: 256,
        attribution:
        "OpenStreetMap",
      },
    },
    layers: [{
      id: "BASEMAP",
      type: "raster",
      source: "OSM",
      minzoom: 0,
      maxzoom: 18,
    }],
  },      
});

map.addControl(new mapboxgl.NavigationControl({
  showCompass: false,
}));

map.once('load', () => {

  map.on('moveend', e => {
    const clientWidth = window.innerWidth;
    const distance = getMapDistance();
    const metersPerPixel = distance / clientWidth;
    console.log('Meters per pixel = ', metersPerPixel);
    spanElem.innerHTML = `${metersPerPixel.toFixed(2)} meters/pixel`;
  });

});

function getMapDistance() {
  const bounds = map.getBounds();
  const ne = bounds.getNorthEast();
  const sw = bounds.getSouthWest();
  const topLeft = turf.point([ne.lng, ne.lat]);
  const topRight = turf.point([sw.lng, ne.lat]);
  const bottomLeft = turf.point([ne.lng, sw.lat]);
  const bottomRight = turf.point([sw.lng, sw.lat]);

  const middleLeft = turf.midpoint(topLeft, bottomLeft);
  const middleRight = turf.midpoint(topRight, bottomRight);
  const distance = turf.distance(middleLeft, middleRight, { units: 'meters' });
  return distance;
}
```

「地図上の何メートル？」は、地図の縮尺はもちろん、メルカトル図法ですから位置によっても変わります(北へ行けば行くほど小さくなります)。
そのため、``moveend`` イベントで表示地図範囲が変更される度に求める必要があります。

実際の計算は。

- A: 画面上での地図領域の幅(pixel) 
- B: 画面上の四隅を緯度経度に変換し、その(幅の)距離(メートル)

を求めた後に、B ÷ A を行います。
B では2点の緯度経度間の距離を turf.js の ``distance`` メソッドで求めています。
【spring-webflux】WebClientでproxyヘッダをカスタマイズする

# 概要

- 認証があるproxyに対してWebClientを使って接続するときの実装方法をまとめてみました
- basic認証はデフォルトで対応してくれていそうだったが、それ以外の認証方式だと自分で定義してあげる必要がありそうだった

# 依存

```groovy:build.gradle
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-webflux:2.4.0'
}
```

# 実装

認証ヘッダの部分はUUIDで代用しているので、用途に合わせて書き換えをお願いしますm(_ _)m

```java
@Configuration
public class ProxyAutoConfiguration {
    @Bean
    public WebClient proxyWebClient() {
        return WebClient.builder()
                .clientConnector(new ReactorClientHttpConnector(HttpClient.create()
                        .proxy(typeSpec -> {
                            typeSpec.type(ProxyProvider.Proxy.HTTP)
                                    .host("localhost")
                                    .port(8080)
                                    // basic認証は対応している
                                    //.username("username")
                                    //.password(s -> "password")
                                    .httpHeaders(headers -> {
                                        // ここで認証用のヘッダを乗せる
                                        headers.add("uuid", UUID.randomUUID().toString());
                                    });
                        })
                ))
                .build();
    }
}
```
GASで合計2600セルを検索したときにAPIリクエストの遅延がどれだけ発生するのか試してみた

この記事は、[N高等学校 (1) Advent Calendar 2020](https://qiita.com/advent-calendar/2020/n-highschool) 8日目の記事です。

こんにちは、N高等学校2年のたっちです。

今回はGoogle Apps Scriptで、スプレッドシートのA1からZ100までの合計2600セルの検索時間が、
APIリクエストの回数でどれだけ遅くなるのか、はたまたAPIリクエストの回数を減らしたらどれほど速くなるのか、検証してみました。

# はじめに

あくまでも、お遊びでやった実験です。正確な検証ではありません。

しかも超初心者なので、間違っている点があるかもしれません。
その際は、優しく指摘していただけますと幸いです。

# 検証方法
![1c4a938c62aba5412047e75ba8c91c5e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442968/99ae0d27-1bf4-494c-4a87-712725bb5421.png)

スクリーンショット内に収まっていませんが、A1セルからZ100セルまでの100行×26列、セル一つひとつにA1形式の文字列を入力しました。

その中から、「Z100」という文字列を探し出すまでの時間を計測して、どれくらいの差が出るのか、試してみました。

# 検証用コード
この2つのコードを使用して検証しました。

## セルを一つずつ取得(getValue)していく方法

```javascript

function oneByOneCellGetSearch() {
  //スプレッドシート取得
  const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  const mainSheet = spreadSheet.getSheetByName("シート1");

  //検索する値
  const searchValue = "Z100";

  //検索
  loop:
  for (var i = 1; i <= 100; i++) {
    for (var j = 1; j <= 26; j++) {
      //セルの値を取得
      var getCellValue = mainSheet.getRange(i, j).getValue();

      if (getCellValue === searchValue) {
        Logger.log(searchValue + "はありました");
        break loop;
      }
    }
  }
}
```

## 二次元配列(getValues)を使用する方法
```javascript

function searchUsingTwoDimensionalArray() {
  //スプレッドシート取得
  const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  const mainSheet = spreadSheet.getSheetByName("シート1");

  //検索する値
  const searchValue = "Z100";

  //A1からZ100までのセルを二次元配列で取得して一次元化
  const getCellValues = mainSheet.getRange(1, 1, 100, 26).getValues().flat();

  //検索
  if (!(getCellValues.indexOf(searchValue) == -1)) {
    Logger.log(searchValue + "はありました");
  }
}
```

# 結果
```
oneByOneCellGetSearch() time: 10277ms
searchUsingTwoDimensionalArray() time: 594ms


・セルを一つずつ取得(getValue)していく方法
10.277秒
・二次元配列(getValues)を使用する方法
0.594秒

10.277秒 - 0.594秒
= 9.683秒差
```
流石に、合計2600セルを読み込ませようとすると、見えやすい差が生まれました。
9秒もの差が出てくるとは予想していませんでしたが、実験が成功して良かったです。

# 時間計測に使用したコード

```javascript

function logTime() {
  const label = 'myFunction() time'
  console.time(label); 
  myFunction();
  console.timeEnd(label);
}
```
参考にさせて頂いたサイト
→[GASのconsoleクラスのメソッドで実行時間をログ出力する方法](https://tonari-it.com/gas-console-time/)
ActiveHashによるカテゴリー選択

# ActiveHashによるカテゴリー選択
## ActiveHashとは
　都道府県名などの変更されないデータをモデルファイル内に直接記述することで、データベースへ保存せずにデータを取り扱うことができるGemです。また、このGemを使うことでデータベースに47の都道府県名のカラムを作ることなくデータを管理することができます。今回は私が作成中のアプリケーションの例で紹介していきます。
　アプリケーションの説明として、収入の分類（給料、ボーナス、副業etc）など決まった選択肢をカテゴリー選択できること目標とします。

公式ページはこちら↓↓↓
https://github.com/zilkey/active_hash
## Gemのインストール

開発環境　rails 6.0.0

GemfileGemfileに追記する↓↓↓

```ruby
gem 'active_hash'
```
引き続きbundle installを実行します。

## モデルの作成

 Incomeモデルを作成します。

```ruby
rails g model income
```
 マイグレレーションを実行します。↓↓↓

```ruby
class Incomes < ActiveRecord::Migration[6.0]
 def change
   create_table :incomes do |t|
     t.integer    :category_id     , null: false  # 収入分類のカラム
     t.integer    :price        , null: false       # 金額
     t.timestamps
   end
 end
end
```
この時prefectureにアンダーバーでid[_id]を付ける必要があります。idを外部キーとして管理することでActiveHashに紐付いた収入分類を取得する事ができます。
引き続きActiveHashのモデルを作成します。この時、データベースに新たにテーブルを作成する必要はありません。
またその他のファイルのファイルも必要としません。

```ruby
class Category < ActiveHash::Base
  self.data = [
    { id: 1, name: '--' },
    { id: 2, name: '給与' },
    { id: 3, name: '一時所得' },
    { id: 4, name: '事業・副業' },
    { id: 5, name: '年金' },
    { id: 6, name: '配当所得' },
    { id: 7, name: '不動産所得' },
    { id: 8, name: 'アルバイト代' },
    { id: 9, name: 'ボーナス' },
    { id: 10, name: 'その他収入' }
  ]
  # moduleを取り込み↓↓
  include ActiveHash::Associations
  has_many :incomes       # incomeモデルとのアソシエーション
end
```
次にincomeモデルも編集します。

```ruby
class Income < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to :income_category
  # category_idのid:1以外のときに保存できるバリデーションを設定(1は「--」です。)↓↓
  validates :income_category_id, numericality: { other_than: 1}
end
```

## ビューにカテゴリー選択をプルダウンで表示
ルーティングとコントローラーを編集した後、ビューを編集します。

```ruby
<%= form_with model: @income, url:incomes_path, local: true do |f| %>
    <%= f.collection_select(:category_id, Category.all, :id, :name, {}, {class:"income-select"}) %>
    <%= f.text_field :text, class:"text", placeholder:"金額" %>
    <%= f.submit "保存する" ,class:"submit" %>
<% end %>
```
collection_selectとは、データをプルダウン形式で表示させることができるメソッドです。このとき()内は順番に第１引数（保存するカラム名）、第２引数（配列データ）、第３引数（保存される項目、テーブルにはidで保存される）、第４引数（選択肢に表示されるカラム名、ここでは収入区分）、第５引数（オプション）、クラス名となります。

これによって収入区分がプルダウンで選択できます。
このようになります↓↓↓
![スクリーンショット 2020-12-02 23.02.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875779/37444881-7849-91c4-2a46-86ff202139a0.png)

以上です！！！！参考になれば嬉しいです！
また誤り等あればご指摘お願いします。
[小ネタ] 情シスの権限を得るにあたって

## 社内のシステム管理者になったときのこと

記事執筆時点で、私のいる会社は30人前後のベンチャー企業です。その中で私は通常の開発業務に加えて社内の情報システム部門の管理も行っていました。情シス業務は当時のCTOが退職する際にほとんどの権限を引き継ぎました。社内管理のサーバー・GCP・AWS・GitHub・Google Workspace・Office365・…その他いろいろ。

はじめは一人で行っていましたが、さすがに事業が拡大していくにつれ開発業務に支障が出そうなので複数人でやるようになりました。悪用すれば会社のほぼすべてのシステムを破壊することすら可能な権限を持つわけですから、その取り扱いは常に注意が必要です。そのためのヒントは昔からあるものでした。それは一般的なLinuxのディストリビューションで `sudo` を実行したときのメッセージです。

## sudo 起動時のメッセージ

### 英語

> We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things:
>
>    #1) Respect the privacy of others.
>    #2) Think before you type.
>    #3) With great power comes great responsibility.

### 日本語

> あなたはシステム管理者から通常の講習を受けたはずです。これは通常、以下の3点に要約されます:
>
>    #1) 他人のプライバシーを尊重すること。
>    #2) タイプする前に考えること。
>    #3) 大いなる力には大いなる責任が伴うこと。
こんな地図アプリを作ってみたい

# はじめに
　どこかに出掛けるとき、目的地をGoogleマップなどの地図アプリで道を調べる人が多いと思います。この記事は私がスクーターや車で出掛けているときに、地図アプリにこんな機能があったら面白いな、便利だなと思ったものをまとめたものです。
※これらはあくまで私があったらいいなと思っただけで、既存のものもあるかもしれません。ご了承ください。
# 目次
<!-- タイトルとアンカー名を編集 -->
1. [細道案内](#Chapter1)
1. [ランダム](#Chapter2)
1. [経路記憶](#Chapter3)
1. [まとめ](#matome)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 細道案内
　大きな道路をあえて避けて細い道に案内する機能。
　皆さんは好奇心でいつも通ってる道の一本先の道を通ってみたり、知らない道を通ってみたりしたことありませんか？ありますよね？そう、あるんですよ。知らない道はそこを通るだけで新鮮な気持ちになれます。あまり知られていないお店などを見つけるのも醍醐味の一つだと思います。慣れ親しんだ土地でも知らなかった一面を知ることができるというのもおもしろそうです。

<a id="#Chapter2"></a>
# ランダム
　神社や食堂など大まかな行きたい場所を設定して、周囲から1件ランダムで抽出する機能。
　ドライブやツーリング、散歩をよくする人はコースが決まっている人も多いと思います。ランダム機能があればいつもとは違うコースを楽しめるだけでなく、思わぬ発見があるかもしれません。タイマーを設定してタイマーが0になったときの位置で周囲検索をする機能があるとおもしろそうです。
　
<a id="#Chapter3"></a>
# 経路記録
　通った道を記録して見ることができる機能。
　旅行先など土地勘の無い場所で迷ったときに使えそうです。連泊の時などは同じルートを通らないようにするのにも使えそうです。

<a id="#matome"></a>
# まとめ

万人受けするような機能ではありませんが、一味変わったドライブやツーリング、旅行先での街歩きなどのシチュエーションで楽しめる機能なのではないかと思います。現在の私にこのようなシステムが組める技量はありませんがね・・・。
Laravelでsqliteを使う方法

##1. database直下にデータベースファイルを作成

```Ruby:
$touch database/database.sqlite
```

##2. .envを編集

```Ruby:
DB_CONNECTION=sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=homestead
# DB_USERNAME=homestead
# DB_PASSWORD=secret
```
DB_CONNECTIOをsqliteにして、それ以外はコメントアウト

##3.最後にマイグレーション

```Ruby:
$ php artisan migrate
```
IntegromatでCOVID-19の状況を取得する

Integromat Advent Calnedar 2020 2日目です。

Integromatでは新型コロナウイルスの情報を取得するappが用意されています。

通常はOperations数単位で課金されるIntegromatですが、このappについては課金対象外となることが明記されています。

>Free operations. You will not be charged for operations used by any of the modules in the COVID-19 app.

https://support.integromat.com/hc/en-us/articles/360012815840-COVID-19

以下をデータソースとしているそうです。
https://github.com/CSSEGISandData/COVID-19

#使い方

説明することがないくらい簡単です。
日本の場合は都道府県単位で情報取得が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99398/601cccdf-cb77-dbad-f230-89f1ca5e4b0f.png)

いろんな情報が取得できるので、各項目の意味はドキュメントを確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99398/94d2f5c5-aaf1-f4de-a3cb-ed692158b27f.png)

#最後に

このappのステータスはIntegromatのステータス情報でもみられるので
もし動かないことがあれば、こちらを確認してみるといいかもしれません。
https://status.integromat.com/
Illuminate\Database\QueryException SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failedの解決策

##結論
マイグレーションファイルがおかしかった

```Ruby:Before

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('title')/*ここ*/;
            $table->text('content')/*ここも*/;
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}

```

default('')をつけたらエラーが消えた

```Ruby:After
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('title')->default('') /*こんな感じ*/;
            $table->text('content')->default('') /*こんな感じ*/;
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}

```
マンガでわかる肥満児(ブロブ)アンチパターン

![9E99D6D9-5657-4DDE-A78A-50381D20A9D3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11525/357b6301-f5fa-08fd-d27d-a9c18b7edfbc.png)

http://wiki.c2.com/?TheBlob

じっさいこれは、神クラスやファットコントローラーと呼ぶほうが通じやすいパターンです。無理に「肥満児」「ブロブ」と呼ぶ必要はないかもしれません。いずれも、あらゆる知識が、凝集度分布を欠いた手続きとして、ひとつのスコープに取り込まれたものです。

とはいえ、ソフトウェアの知識のすべてを食い尽くし、肥大化して、誰も対処できない巨大モンスターになってしまう恐ろしさは、その当時の呼び名を思い出して、再認識するべきでしょう。

チームのモチベーションではどうしようもなくなるほど巨大化する前に、根気よく分析し、小さなスライムちゃんに分裂させて、やっつけておきたいですね。
Vue CLIでvue3.0を始めてみる(windows VSCode)

#環境
windows 
vscode

#VueCLIのインストール
とりあえずローカルインストール

```
# npm install -g @vue/cli
# vue -V
@vue/cli 4.5.9

```

※グローバルインストールして権限で怒られたら

```
# vue -V

vue : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Users\×××\AppData\Roaming\npm\vue.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.co 
m/fwlink/?LinkID=135170) を参照してください。

```

管理者権限で下記を実行！

```
#PowerShell Set-ExecutionPolicy RemoteSigned
```

Vue3.0は　Vue CLI v4.5.0以降で選択可能

#Vueプロジェクトマネージャーで操作

```
vue ui
```

黒い画面が苦手なおじさんなのでGUIでプロジェクト作成
Vue uiコマンドを実行したら[http://localhost:8000/project/select]でVueプロジェクトマネージャーが起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397300/a8710f8b-4379-5221-1781-e3fec0ad065d.png)

作成タブを選択して、「ここに新しいプロジェクトを作成する」ボタンをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397300/063838d1-b37f-42ae-5672-950d419844f5.png)


プロジェクト名を入れる。
パッケージマネージャは環境に合わせてください。
自分の環境はnpmなのでnpmを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397300/15754dcb-183a-26f1-44bd-66e1fe251b8a.png)

Vue3を選択


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397300/72736e2e-3882-30d0-1bc1-fe5fb5b9f2be.png)

作成まち

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397300/a6e8eb7c-bb3e-3c60-8073-786b91e45da7.png)
【Laravel】DBテーブル作成方法

##1.　マイグレーションファイル作成
```Ruby
$ php artisan make:migration create_posts_table
Created Migration: 2020_12_02_092200_create_possts_table
```

##2. マイグレーションファイルを編集
```Ruby:database/migrations/2020_12_02_092200_create_posts_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('title')->default('');
            $table->text('content')->default(''); 
　　　　　　 $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down() 
    {
        Schema::dropIfExists('posts');
    }
}

```
public function up()の中に書いていく。

```Ruby
public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->bigIncrements('id');
            /*　ここから　*/
            $table->string('title')->default('');
            $table->text('content')->default('');
           /* ここまで　*/　 
　　　　　　 $table->timestamps();
            $table->timestamps();
        });
    }
```

##最後にデータベースに反映
```
$ php artisan migrate
Migration table created successfully.
Migrating: 2020_12_02_092200_create_posts_table
Migrated:  2020_12_02_092200_create_posts_table
```
Pixelシリーズの尿液晶を改善する

# 概要

- GoogleのPixel4a(5G)を購入しました
- Pixelシリーズはディスプレイに有機ELを採用しているようで全体的に黄色味がかっています
- どうにか液晶のような青白い系の色味にしたいです
    - 液晶じゃないのに尿液晶とはこれいかに。

# 解決方法

- [Screen Barance](https://play.google.com/store/apps/details?id=co.uk.quickdoc.screenbalance)をというアプリをインストールします。
- アプリを立ち上げるとOSから許可を与えるかどうか聞かれるので、与える方向で回答します
- アプリが起動したら画面の下の方に4つスライドバーがあります
- そのうち一番上のスライドバーを左右にスライドすると色味が変わります
- スライドさせると色味の名前が表示されますが、「Shade」か「Daylight」あたりが青白い寒色系の色味になります

# 紹介動画

- [Screen Balanceの開発元による紹介動画](https://youtu.be/0zi8LjYbEC4)
- [Improve the Pixel 2 XL Screen Quality for $2.50 - Fix Black Crush Issue](https://youtu.be/dDVHf8BJQwM)
    - iPad Pro風味など色々試しています

# まとめ

- こういう機能はOS標準で搭載してもらえるといいと思うのですが、どうなんでしょう。
Windowsのコマンドプロンプトで文字化けしたときの対処法

##初めに
初めて記事を書くので下手くそですがよろしくお願いします。
僕の経験上、始めたの時はコマンドプロンプト？ターミナル？と分からないと思いますが今はほぼ同じものと考えてください。
違いを書いている記事を載せておきます。
https://qiita.com/Ted-HM/items/9a60f6fcf74bbd79a904

僕がプログラミングを始めたばかりの時にぶつかったのが「ターミナルで実際にコードを実行すると日本語が正しく表示されない」ということでした。

![スクリーンショット (88).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702559/70906821-673c-8d70-001d-5be0aa215176.png)
何も対策をせずにWindowsでC言語を実行するとこのようになってしまいました。
##原因
・WindowsではShift JISという文字コードが採用されている。
・コードはUTF-8という文字コードで書かれている。
　　　　　　　　　　　　
つまり、UTF-8のコードをShift-JISで出力しようとしたためこのようになってしまったのです。

##解決策
ターミナルの文字コードをShift-JISからUTF-8に変更する


※UTF-8をShift-JISに変更すればよいのでは？と僕も最初はおもっていました。
もちろんそれでも解決できますが他のコードを実行するときにいちいち変更する必要があるので面倒です。

なのでターミナルの文字コードをShift-JISからUTF-8に変更する方法を紹介します。
以下のコードをターミナルで入力します。
![スクリーンショット (90).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702559/ad30471d-9495-086b-ae2f-3f7cf49da58d.png)

すると文字化けが解決できました。
![スクリーンショット (92).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702559/7f73c079-6b14-fd9b-3091-1842dc148497.png)

##その他
他に文字コードを指定したい場合はマイクロソフトのドキュメントを参考にしてみてください。
https://docs.microsoft.com/ja-jp/windows/win32/intl/code-page-identifiers

##最後に
プログラミングを始めたばかりだとびっくりするかもしれませんが大した脅威ではないので落ち着いて取り組んでみましょう。
と、半年前の自分にも言いたいです。(笑)
Golangの正規表現でbool値のみを返す

# 概要
タイトルのままですが、goの正規表現でbool値のみを返す方法です。

##コードと解説
goの正規表現でまず思いつくのが`regexp.MatchString`と思いますが、これは２つの返却を行います。
一つはマッチしているかどうかのbool値、もう一つはエラーです。

```main.go
package main

import "fmt"
import "regexp"


func main() {
	str := "abc"
	b, err := IsMatch(str)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(b)
}

func IsMatch(str string) (bool, error){
	return regexp.MatchString(`^[0-9]+$`, str)
}
```
例えるならこんな感じでしょうか？
めんどくさいのでエラーを`_`にしたいな…と思うところです。
が、コーデイング規約等によって、errは握りつぶしてはダメ。という開発現場も多いと思います。(実際`_`して握りつぶすのはどうかと思うわけです)

そんな時は`MustCompile`と`MatchString`を使います。
使い方は以下の通り。

```main.go
package main

import "fmt"
import "regexp"

var r *regexp.Regexp

func init() {
    r = regexp.MustCompile(`^[0-9]+$`)
}

func main() {
	str := "abc"
	b := r.MatchString(str)
	
	fmt.Println(b)
}
```
とてもコードがスッキリしました。
エラーもbuildが通らない時のみのはずですのでerr判定を行う必要もありません。
PHPなんかだと単純に`true`、`false`のbool値だけ欲しい。と言う場合もあるかと思います。
それと同じになりますので今後活用できそうです。

####追記
@nobonoboさんよりご指摘を頂きましたので一部修正を加えております。
init処理で正規表現をコンパイルすることで速度の向上が見込めます。
Kotlin/JSとは何者だ！！

# はじめに
今回はKotlin/JSについてまとめていきます

# Kotlin/JSとは
[Kotlin/JS Overview](https://kotlinlang.org/docs/reference/js-overview.html#kotlinjs-overview)

``Kotlin/JSはKotlinのコード、ライブラリ、JSと互換性のある依存関係をトランスパイルする機能を提供します``

つまりKotlinで書いたコードがJavaScriptにトランスパイルされるのです。

これはブラウザ上でも動きますし、node.js上でも動きます。

Kotlin最強では？？？

# 使用例

こちらも公式ドキュメントに載っています。

[Some use case for Kotlin/JS](https://kotlinlang.org/docs/reference/js-overview.html#some-use-cases-for-kotlinjs)

### Webフロント
DOMを作成し、ブラウザAPIやWebAPIを活用できます。
また型安全なReactの開発にも活用できます

### サーバーサイド
前述でもあるように、Kotlin/JSはnode.jsで動きます。
なので、サーバー上で実行したりサーバーレスアーキテクチャでの活用も見込めます.

### マルチプラットフォーム
Kotlinマルチプラットフォームを使用すると、Kotlin/JSの機能にアクセスできます。

つまりiOS, Android, Webフロントでバックエンド機能(認証やAPI通信など)が共通化できます。

**Kotlin最強では？**

# トランスパイル

Kotlinのコードを直接JavaScriptに置き換えているわけではないそう

KotlinコードをまずはAST(Abstract Syntax Tree)と呼ばれる、意味のない情報を取り除いたものに変換されます。
そしてIRと呼ばれる中間表現へ変換されそこからJavaScriptのコードに変換されるそうです。
現在Kotlin/JVMとKotlin/JSで同じIRに移行しているそうです。
ただKotlin/NativeとKotlin/JSは互いに独立して開発されているため、まだ同じIRを参照するのは難しそう。




# 使ってみた

[Building Web Applications with React and Kotlin/JS](https://play.kotlinlang.org/hands-on/Building%20Web%20Applications%20with%20React%20and%20Kotlin%20JS/01_Introduction)

こちらのCodelabでKotlin/JSを使ってReactアプリケーションを作れます。

# 正直な感想
まぁ便利って感じ。
Kotlinでやる意義が見出せませんでした。

型安全でやりたいのであれば、TypeScriptがあるしわざわざKotlinでやる必要もないのかなと。
ただ僕のようにKotlinでしか業務レベルでコード書けないよ！！（そもそもKotlinで業務レベルのコード書けるのか？）という方にはいいかも。
遊び程度であれば。

サーバーサイドもKotlin/JSを使って書けるが、既にJVM上で動くサーバーサイドKotlinがあるのでこちらもあまり利点が見当たらない......
Javaの資産が使えるのがKotlinの1番のいいところであるのにそれを捨ててまでnode上でKotlinを動かす必要があるのか？

マルチプラットフォームに関してもJavaの資産が使えないのが痛い気がする(試してはないのでわからないが)

# まとめ
まだ業務レベルで使えるほど充実しているわけではない

アルファ版なのでまだまだ改良が必要そうだが、リリースされたら楽しみですね
絶賛開発中なのでOSSコミットしたい人には結構おすすめかも？
あなたの力でKotlinを素晴らしい言語にしてください
[Kotlin](https://github.com/JetBrains/kotlin)

Kotlinには頑張って欲しい！！
~~名前が可愛いので~~
AndroidエンジニアとしてKotlinが大好きなので

続きまして、アルサーガパートナーズ Advent Calendar 2020 4日目の記事は再び @miumi さんのKotlin/JSです :tada:
【2021/01/31迄：更新予定】全国のITを学べる就労移行支援事業所一覧

（※出来る限り随時更新していきたいと思いますが、日本全国各地に所在する事業所を全て網羅するのは難しいかもしれません…）

（※2020/12/31：来年1月末までの宿題にしたいと思います、大変すみません）

###フロンティアリンク キャリアセンター
運営：フロンティアリンク株式会社
https://career.frontier-link.jp/
事業所所在地：札幌・仙台・東京（木場）・横浜・名古屋・新潟・大阪（なんば）・岡山・広島・福岡（赤坂／博多駅前）

###ディーキャリア ITエキスパート
運営：ハッピーテラス株式会社
https://dd-career.com/ad/itex/index.html
事業所所在地：東京（田町・芝浦・中野）

###ジョブトレIT・Web
運営：株式会社ゼネラルパートナーズ
https://www.atgp.jp/training_it/
事業所所在地：東京（渋谷／秋葉原）・千葉（船橋）

###アーネストキャリア
運営：株式会社アーネスト
https://earnest.ac/
事業所所在地：東京（永山駅前／八王子）・福岡（中洲川端）

###ルーツ
運営：LOGZGROUP株式会社
https://roots-lp.logz.co.jp/
事業所所在地：東京（四ツ谷／川崎／北池袋）・神奈川（横浜）・千葉
cloud9でgit cloneしrailsチュートリアルを再開する流れ

railsチュートリアルをcloud9で順調に進めるも、容量不足で先に進めなくなりました。
[AWS Cloud9 の容量不足を解決する](https://railstutorial.jp/help#volume-up-aws-ebs)
上記記事を参考にするも、hello_appやtoy_appを作成していなかった私は消せるファイルがありません(笑)

```
$ sudo growpart /dev/xvda 1
```
上記コマンドがどうしても実行できなかったため、新しいenvironmentを作成してgit cloneをすることにしました。

参照 : [Railsチュートリアル](https://railstutorial.jp/)

#AWSで新しいワークスペースを作成する
1.Cloud9の管理ページに行く。
2.Create environmentをクリック。
3.（AmazonLinuxではなく）UbuntuServerを選択し、Next stepをクリック。

#ボリュームを拡張する
忘れないうちにやってしまいましょう！

1.AmazonEC2コンソールを開く。
2.「ボリューム」を選択し、変更するボリュームを選択。
3.上部にある「アクション」ボタンから「ボリュームの変更」を選択し、サイズを AWS が定める最大無料枠に設定(10→30)
4.「インスタンス」で、該当のインスタンスを選択後、画面上部にある「アクション」ボタンから「再起動」をする。
5.Cloud9に戻り、ターミナルからボリュームを拡張する。
6.lsblkコマンドで、現在のインスタンスに割り当てられているブロックデバイスの情報を確認する。(ルートボリュームである/dev/xvdaは拡張されているが、/dev/xvda1は10のままになっている。)
7."$ sudo growpart /dev/xvda 1" コマンドの実行
8."$ sudo resize2fs /dev/xvda1" コマンドの実行
9.lsblkコマンドで、/dev/xvda1が30になっているか確認する。

#Railsをインストールする
下記コマンドを順に実行していく。

```
$ echo "gem: --no-document" >> ~/.gemrc
```
```
$ gem install rails -v 6.0.3
```
```
$ source <(curl -sL https://cdn.learnenough.com/yarn_install)
```

※RubyやRailsのバージョンを、GitHubの「README.md」から確認し揃えましょう。

```
$ ruby -v
$ rails -v
```

#git cloneを実行
**※herokuを使われている場合、git cloneではなく、heroku git:clone --appをされた方が早いかもしれません。**


```
$ git clone [クローンするソースコードのURL]
```
```
$ bundle install --without production
```
```
$ rails db:create
$ rails db:migrate
```
```
$ rails test
```
ちなみにrails testを実行したらこんなエラーが出ました。

```
FATAL: Listen error: unable to monitor directories for changes.
```
下記の記事通りにコマンドを実行し解決。
[Rails testで「 FATAL: Listen error: unable to monitor directories for changes.」のエラー](https://qiita.com/yusuke_mrmt/items/b567e329a9bf16d4e53a)
#heorokuのセットアップ
既存のherokuのアプリにつなげる方法がよく分かりませんでした。
そのため１から作ります。

まずはherokuのインストールから

```
$ source <(curl -sL https://cdn.learnenough.com/heroku_install)
```

一応インストールされているか確認

```
$ heroku --version
```
```
$ heroku login
```
```
$ heroku create
```

#herokuへデプロイ

```
$ git push heroku main
```
```
$ heroku run rails db:migrate
```
これで終わりです！
無事できたか確認...

```
$ heroku open
```

お疲れ様でした！
技術選定の汎用的な観点

アドベントカレンダー9日目です。
[パーソンリンク](https://www.person-link.co.jp/)では[Kibela](https://kibe.la/)を使って知見の共有をしているのですが、そこで社内共有した内容を書いていこうと思います。

# はじめに
これから初めて技術選定をする人、技術選定で悩んでる人向けにまとめた乱文です。
私個人の観点なのでこれが正解というわけではないのですが、大きく分けて3つの観点で技術選定しています。

# 観点1：要件を満たしている

- ユースケースにマッチしているか
- サービス要件を満たしているか
- 金銭的・時間的なコストを考慮できているか

# 観点2：デファクトスタンダードである

- 技術的負債になるリスクを減らしたい

## 要素1：信頼できる

- 本番環境での利用事例が多いか
- 開発母体がどこか
    - メンテナが個人より組織のほうが信頼しやすい
- 定期的にアップデートされているか

## 要素2：広く普及している

- 本番環境での利用事例が多いか
- リソースの確保が容易か
    - 増員や穴埋めのときに「他に使える人がいない」状態だと困る
- 情報が多いか

# 観点3：ROI（投資収益率）が高い

- 金銭的・時間的コスト低かつリターン高がベスト
    - リターンが何かは目的や状況によって異なる
    - 「金銭的なコスト削減」かもしれないし、「エンジニアとしての市場価値向上」かもしれない

# さいごに

上記の観点をすべて満たす必要はなく、状況に応じてどの観点の比重を高めるかが重要です。
例えば、個人開発であれば観点3の比重が高くなるかもしれませんし、ビジネスとしてのプロダクト開発であれば観点1、2の比重が大きくなるかもしれません。

技術選定で悩んでる人の参考になれば幸いです。
TCP/IP　その２

#【TCP/IP　その２】

##IPアドレス

<strong>クラス</strong>

・Aクラス　0.0.0.0 〜 127.255.255.255 
　　サブネットマスクは、255.0.0.0

・Bクラス　128.0.0.0 〜 191.255.255.255
　　サブネットマスクは、255.255.0.0

・Cクラス　192.0.0.0 〜 223.255.255.255
　　サブネットマスクは、255.255.255.0

・Dクラス　224.0.0.0 〜 239.255.255.255

・Eクラス　240.0.0.0 〜 255.255.255.255

##プライベートアドレス

IPアドレスのうち、ローカルネットワークでのみ使用が許可されているアドレスのこと。
IANAによって予約されている。

<strong>範囲</strong>

クラスA 　10.0.0.0 〜 10.255.255.255
クラスB　172.16.0.0 〜 172.31.255.255
クラスC　192.168.0.0 〜 192.168.255.255

##ポート番号

<strong>割り当て</strong>

・ウェルノウンポート、システムポート　0 〜 1023
　→システム、root権限を持つプロセスに割り当てられたポート番号

　例）Webサーバ

・レジスタードポート、ユーザーポート　1024 〜 49151
　→よく使われるプログラムに割り当てられたポート番号

　例）Oracle、SQL Server

・ダイナミックポート、エフェメラルポート、プライベートポート　49152 〜 65535
　→自由に使用可能なポート番号
Magento 1のサポート終了からの脱出：データを失うことなくMagentoをShopifyに移行する方法

ご存知かもしれませんが、MagentoからShopifyへの移行は、Magento 1のサポート終了の発表以来、2番目に人気のあるリクエストです。

Shopifyは、オンラインストアの機能をカスタマイズするのに役立つ何百もの便利なアプリを備えた多機能プラットフォームです。 Nescafe、Red Bull、Tesla Motorsなどのeコマースの巨人でさえ、Shopifyで正常に動作しており、長年にわたって運用を行ってきました。

ここでは、Magento1からShopifyへの移行コストに関する完全な情報を入手できます。

Magentoからの移行：Shopifyを選択する理由

実際、Magento 1の代替として提供される可能性のあるプラットフォームは約10種類あります。大きなプラットフォームは、Shopify、WooCommerce、Bigcommerce、Salesforce、およびMagento2です。

ShopifyはSaaSプラットフォームです。利用可能なプランのいずれかを選択することにより、信頼性の高いホスティングをすぐに利用できます。つまり、ホスティングを選択、維持、支払いする必要も、ホリデーシーズンやブラックフライデーなどの季節的な売上のピークに合わせてスケーリングする必要もありません。

おそらくこれは、MagentoからShopifyへの移行の最大の利点の1つです。現在のストアに数百の商品があり、高品質のShopifyテーマテンプレートを購入している場合、必要なすべてのデータを移行して、数週間以内に新しいShopifyストアを立ち上げることができます。

Magento 1からShopifyにデータを移行するために市場が提供するツールは何ですか？

現在、MagentoからShopifyへの製品のインポートに大いに役立つ3つの人気のあるデータ移行ツール/アプリがあります。これらは：

Excelify
Litextension
Cart2Cart

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705866/667573b3-8f95-9836-1a07-84d63635a2f9.png)

Excelifyは、MagentoからShopifyへの移行アプリです。 Magento（およびその他のプラットフォーム）からShopifyにデータを移行するための優れたツールセットを提供します。 このアプリを使用すると、製品、顧客、注文、ページ、ブログ投稿、割引、および間違いなく持っている他のすべての貴重なコンテンツなどの重要なデータをエクスポートおよびインポートできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705866/95f0bfd1-d9df-7c27-6cb4-181a7b617fe7.png)

Litextensionは、ショッピングカートからShopifyへのデータ移行のための完全なソリューションです。 このサービスは自動モードで動作し、起動すると、コンピューターの電源を切ったり、インターネット接続が失われたりしても、移行が処理されます。 Litextensionを使用して、次のデータを移行できます：製品、製品カテゴリ、注文、顧客、レビュー、クーポン、SEOURLなど。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705866/857858c6-3ae3-4c07-c46a-11f4f9a49d34.png)

Cart2Cart –MagentoからShopifyへの移行ツール。すでに数年前から誰もが利用しています。 Cart2Cartは、3DCartからX-CartおよびYahoo Storeまで、80を超えるeコマースプラットフォーム間のデータ移行を専門としています。

提示された各ツールには、他の長所と短所もあります。 ただし、確かなことが1つあります。いずれも、データ移行段階の完全な自動化を保証することはできません。 いずれの場合も、データのエラーを手動で確認する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705866/a6d3c829-043c-11b7-9f5a-667db359e5b3.png)

これは、Whidegroupブログに公開された記事の簡単な要約です。 MagentoをShopifyに移行する方法の詳細を知りたい場合— [記事全文を読む](https://whidegroup.com/blog/magento-to-shopify-migration/)
中の人から見た42Tokyo

## はじめに
この記事は、[42tokyo Advent Calendar 2020](https://adventar.org/calendars/5125)の12月1日の記事です。

フランス発のエンジニア養成機関である**謎の集団**42Tokyoについて書かせていただきます。


## そもそも42Tokyoって?

この手の記事は大量にあると思うのでさらっと説明していくと、[42Tokyo](https://42tokyo.jp/)によると、

>42 Tokyo（フォーティーツー）は、フランス発のエンジニア養成機関です。
「挑戦したいすべての人に質の高い教育を」を理念にシリコンバレーをはじめ、世界各国でエンジニア教育をおこなっています。
24時間利用可能な施設、学生同士で課題を克服するピアラーニング、学費完全無料など新しい仕組みで、社会で活躍するエンジニアを数多く輩出しています。


つまり、42の本部はフランスがあって、それが世界各地にあって、そのうちの一つが、42Tokyoですよという感じ。あとはググれば出てくると思うので、割愛する。


[ここ](https://www.42.fr/42-network/)を見ると、世界各地に有るのがわかる、シリコンバレーにももちろんある。


## 42Tokyoに入るには?

募集要項を見れば、わかりますが、webテスト -> **piscine** -> 42Tokyo

みたいなフローになっています。


**piscine**は4週間もかかるので大変です。これはフランス語でスイミングプールという意味があり、プールをもがきながら泳ぎきりましょうという意味みたいですね。興味があればぜひ応募してみましょう。



## 42Tokyoって実際どんなことをやっているのか？

大まかにやっていることは2つ。

- 課題を解く
- P2P(peer to peer)コードレビュー


### 課題を解く?

[42Tokyo](https://42tokyo.jp/)によると、

>42には実践的なカリキュラムが用意されています。プロジェクト単位で登録して、自分が解きたい問題を設定していきます。カリキュラムの前半はC言語に取り組んで、その後は、自分で学びたい言語を選択することができます。


どんな課題があるのかと言うと、

例えば、

```

コマンドライン引数を受け取り、文字列とその長さを出力してください。

使用可能関数
write()

Ex
$ ./a.out test 42 echole
test 4
42 2
echole 6
```

みたいになります。

この課題だと、

まずは、

- コマンドライン引数って？
- 文字列出力するには？
- 文字列の長さを得るには?

みたいなのを調べるのですが、ここから、P2P Learningが始まります。

まずは、色々とググったりして、関数の使い方を調べる、それでもわからなかったら誰かに聞く。

逆にわかっている人は、わかってない人に教えたりします。

ということが、P2Pでは行われます。

P2Pでは、

```
分からない人 - 色々質問したりして、なんとか自分の知識にしようとする
分かる人　　 - 教え方、伝え方を工夫して、自分の知識を整理することができる
```

双方向で学習ができるので、P2P Learningは素晴らしいですね。


上記の課題だと、

```C
#include <unistd.h>

int str_len(char *str)
{
	int l = 0;
	while (str[l])
		l++;
	return (l);
}

void print_num(int num)
{
	if (num > 9)
		print_num(num / 10);
	char c = num % 10 + '0';
	write(1, &c, 1);
}

int main(int argc, char *argv[])
{
	int i = 0;

	while (i + 1 < argc)
	{
		int sz = str_len(argv[i + 1]);

		write(1, argv[i + 1], sz);
		write(1, " ", 1);
		print_num(sz);
		write(1, "\n", 1);
		i++;
	}
	return (0);
}

```

```shell
$ gcc print_42.c
$ ./a.out test 42 echole
test 4
42 2
echole 6
```

になります。


### P2P(peer to peer)コードレビュー

課題を解き終わったら、課題を提出して、コードレビューを行います。

42Tokyoではコードレビューする人をそれぞれ、レビュワー(課題を評価する人)、レビュイー(課題を提出した人)と呼んでいます。

(ちなみにですが、最低限何人かにコードレビューを行わないと次に進むことができません。)

まず、コードは変数、関数の名前の付け方から十人十色なので、相手が理解できるようにコードのロジックを説明していきます。


もしも、相手に説明が通らない(理解ができなければ)不正解なんて言うこともあります。

具体的には、この関数はどういう意味ですか？ここはどういう原理で動いていますか？などなどの質問に答えていって、動作なども確認しつつ、コードレビューが行われていきます。


なので、自分だけが理解できるコードではなく、人が読んでも理解がしやすいコードを書かないといけません。

例えば、上記のコードだったら、レビュイーは

```
str_len()は文字の長さを求める関数で、print_num()はint型の数字を出力する関数になります。
str_len()は1文字1文字見ていって、null文字が来るまで、文字をカウントしていきます。
(NULLが来ることはないので、エラー処理はしてない。)

print_num()は数字を出力する関数で、再帰的に呼び出しを行って、最上位の桁から出力を行えるように実装しています。


みたいな.....

説明を行います。
```

レビュワーだったら、ここはどうやって動いていますか、とか、間違っている場合は、ヒントを与えつつ、答えを一緒に考えたりします。(個人によってやり方は多々あります。)

これで何人かのコードレビューが終わったら、その後は機械判定が行われます。

機械判定がPASSできれば、次の課題に取り組むことができます。FAILすると再TRYとなります。
　


基本的に進め方は個人の裁量に任せれています。なので、猛烈に早い人もいれば、マイペースに進めていく人もいます。


---

とこんなことが42Tokyoでは行われています。

他にも様々なコンテストに参加したりだったり、アプリ開発したりだったりいろんなことが行われています。



## まとめ
いろいろ書いてありますが、**picine**を受ければ、たいていのことを経験することができます。42Tokyoでやってることも、**picine**の延長でしかないです。

なので、興味があれば受けてみてください〜


中の人から見た42Tokyoでやっていることの説明でした~
GitHubリポジトリをローカルGitサーバーに移行する方法

etckeeperで設定ファイルをGit管理していましたが、Privateなリポジトリにしたとしても大事な内容が書かれているファイルをクラウド上に置くことに抵抗を感じて、ローカルのGitサーバーに移行しようと思いました

# 前提

ローカルのGitサーバーは設置済でSSH経由でアクセスできるようにしてあることとします

# 作業内容

以下のURLにある通り、既存リポジトリの `.git` 以下のファイルをローカルGitサーバーのディレクトリに配置するだけで良いそうです

> そうすると、Git ディレクトリのデータを my_project.git ディレクトリにコピーできます。
>
> これは、おおざっぱに言うと次の操作と同じようなことです。
>
> $ cp -Rf my_project/.git my_project.git
> 設定ファイルにはちょっとした違いもありますが、ほぼこんなものです。 作業ディレクトリなしで Git リポジトリを受け取り、それ単体のディレクトリを作成しました。

https://git-scm.com/book/ja/v2/Git%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E7%94%A8%E3%81%AE-Git-%E3%81%AE%E5%8F%96%E5%BE%97

## 1. 既存リポジトリの取得

普通にGitHubからcloneすればいいです。普段使っている一般ユーザーのターミナルで `git clone` を実行します。 `username` と `my_project` は適宜読み替えてください

```shell-session
$ git colne git@github.com:username/my_project.git
```

clone したコードの `.git` ディレクトリに入り、中身を圧縮ファイルでまとめます

```shell-session
$ cd my_project/.git
$ tar zcvf ../my_project.tgz .
```

## 2. Gitディレクトリの作成

ローカルGitサーバーにGitリポジトリのディレクトリを作成します。ここでは、 `/opt/git` 配下にGitリポジトリを作っているものとします。場所は適宜読み替えてください

```shell-session
$ sudo mkdir /opt/git/my_project.git
```

既存リポジトリの圧縮ファイルを展開します。1. の手順で作成した圧縮ファイルのある場所 (my_project のディレクトリ) へ移動します。 `../` は 1.の手順の状態で `my_project/.git` にいることを想定しています

```shell-session
$ cd ../
$ sudo tar zxvf my_project.tgz -C /opt/git/my_project.git
```

Gitリポジトリのオーナーを git ユーザーに変更します

```shell-session
$ sudo chown -R git.git /opt/git/my_project.git
```

オーナーが変わったことは `ls` コマンドで確認できます

```shell-session
$ ls -lR /opt/git/my_project.git
```

## 3. リポジトリのconfigファイルの変更


`.git/config` に今までのリポジトリの情報が入っているので、一旦消して、以下の内容だけにします

```
[core]
        repositoryformatversion = 0
        filemode = true
        bare = true
```

## 4. 確認

ローカルGitサーバーのリポジトリが clone 出来ることを確認できれば移行完了です。ローカルサーバーのIPアドレス `192.168.10.1` は適宜読み替えてください

```shell-session
$ git clone git@192.168.10.1:/opt/git/my_project.git
```

確認できれば、今まで使っていたGitHub上のリポジトリは削除しても大丈夫です
【読書記録】Kotlinイン・アクション -第8章-


書籍「Kotlinイン・アクション」を読んで個人的に疑問に思った点や調べたことについて記載する読書記録です。
書籍の内容については記載しません。

# 第8章の内容

第8章　高階関数：引数と戻り値としてのラムダ
https://book.mynavi.jp/ec/products/detail/id=78137

# Kotlinイン・アクション 第8章 高階関数：引数と戻り値としてのラムダ

## 高階関数とは何か？

別の関数を引数にとったり、戻り値として関数を返す関数

## 関数を返す関数を定義したいシーン

関数を返す関数は多様するとコードの見通しが悪くなりそう。
引数に関数を取るメソッドを使う場合かつ、引数に渡す処理が長い場合はコードを簡略化するために導入を検討しても良さそう。

## ラムダを引数に取るメリット

柔軟性を持たせた共通化が可能

## ラムダの仕組み

コンパイル時にラムダは無名関数に置き換えられる。
無名関数が大量に作られることによるオーバヘッドを防ぐために、インライン展開を検討することができる。

## インライン展開

コンパイル時にinline関数の中身がそのまま使われるよう埋め込まれることをインライン展開という

### メリット

余分な無名クラスが作成されない

### デメリット

インライン展開することでバイナリサイズが大きくなる

### インライン関数の利用を検討する場所

ラムダを引数として取るメソッドではインライン関数にすることを検討することでパフォーマンスの向上が見込める。

### ラムダを使う時はreturnに気をつける

returnは最も近くのfunキーワードを使って宣言された関数からリターンする。
ラムダの場合はfunキーワードを利用しないので、外側の関数からリターンする点に注意。
エンジニアとしてキャリアを考える

みなさんこんにちは、グリドンです。

これから、qiitaで僕が学んだことをアウトプットしていこうと思います！
なお、全て自分の解釈、自分の意見ですので、間違ってる部分もあるかと思いますが、暖かく見守っていただければと思います。コメントでどんどん指摘して下さい。

さて、先日t_wadaさんによる、エンジニアとしてこれからどういうキャリアを築いていくか、というトピックの講演を聞いてきました！

恥ずかしい話、t_wadaさんの事はこの講演まで知りませんでした(速攻でTwitterフォローしました)😅

本題ですが、講演の中でt_wadaさんおっしゃられていた３つのこと

1. アウトプットをすること
2. 学び続ける姿勢
3. 技術の学び方を学ぶこと

全て「なるほどー」と、タイトルを見るだけで思いますが、t_wadaさんが5つ分けて話されていたので、ひとつづつ書いていきたいと思います。
<dl>
<dt>1. 月に1冊のペースで技術書を読む</dt>
<dd>月に1冊って結構多いような、、、
でもこれは、僕自身も最近意識していました。月に1冊は少しきついんですが、一日少しづつ本を読んでいます。
最近、プログラミングとは関係ないですが、「人材マネジメント入門」という本を読みました。
いつか人事として活躍したいと思っているので、人事の方たちがどのような仕事しているのか、とても勉強になりました。
また、t_wadaさんおすすめのJavaの本も紹介してくださいました！

- すっきりわかるJava
- Effective Java

一つ目は初心者の方にお勧めで、二つ目はキャリア5~6年目の方にお勧めとのことです。
</dd>
<dt>2. 手を動かして学ぶ</dt>
<dd>これは、プログラミングを勉強したことのある方たちはよく聞いたことがあるかもしれないですね。
講演のなかで印象的だったのは、

**「何かをやることによって、それができるようになり、そしてそれが好きになる。」**
やる→できる→好きになる（また「できる」に戻る）

ということ。
やはり、能動的に学んでいかないと、自分のスキルとしては定着しないよ、ということですね。
よくやってしまいがちですが、コードをGoogleで調べて、そのままコピペ・・・なんてこと
よくないですよね。自分の手で書くことによって、より頭に入りやすくなるということです。

余談ですが、大学時代、よくわからないメモ帳並みのIDEを使ってJavaを書かされていたのを思い出しましたｗ
```System.out.println()```これ書くだけで嫌になっていたのを覚えています。</dd>
<dt>3. 毎年少なくとも１つプログラミング言語を勉強する</dt>
<dd>これは、キャリア3~年目以降の方向けだと思います。
新人のかた、プログラミングを始めたばかりの方は、まずは一つの言語に集中して学習するのが良いと思います！
私は、まだ2年目なのですが、大学ではJavaとPython、一社目の会社ではJsをメインに使っていたので、JavaとJsを中心に1.2年勉強していきたいと思っています。</dd>
<dt>4. 身の回りをプログラミング対象にする</dt>
<dd>少し２番目と似ているようにも感じるのですが、普段からプログラミングをしなさい、ということだと私は思っています。
私は普段から、競技プログラミング的なやつをやっているのですが、これを機に定期的に小さなプロジェクトをやっていこうかなと思います！
初めて作るものは何がいいのかなー？おすすめのプロジェクトあれば教えてください！
</dd>
<dt>5. アウトプットを行う</dt>
<dd>僕がQiitaを始めようと思った理由です。
結構有名な話だとは思いますが、人ってアウトプットするときに一番自分のスキルとして身につくんですよね。
ただ、僕みたいに新人ぺーぺーに、「情報は発信する価値はあるのかな？」と思ったりもしました。ですが、自分のアウトプットの場所を作るということがメインなので、地道に頑張っていこうとおもいます。
冒頭でも言ってますが、もし間違っていたりしたら、ご指摘を頂けると嬉しいです。
ちなみに、t_wadaさんのおすすめは、ライブコーディングだそうです！僕もいつかできるくらいスキルをつけたいです。</dd>
</dl>　

以上です。
学び続けることは大変だと思います。ですが、常に新しいことに挑戦したり、プログラミングで自分の生活を効率化したり、楽しく勉強すると長く続けられるかもしれませんね。

また、学んだ事をアウトプットしにきます。
ではまた。
micro:bit v2 新機能 マイクの動作メモ

2020年11月に発売されたmicro:bit v2。
様々な機能が追加されました。

この記事ではマイク＝音量センサーについてまとめました。


#音量の幅
音量の値として入力されるのは0-255の値となります。

下記のようにグラフで見れるようなプログラムを作り、試してみたところ、大きな音をだしても通常出せる値としては195程度がマックスのようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71746/afe29806-a8bb-1488-43ca-f9eac642ddb7.png)


#音がしたときブロックの仕様
シミュレーターで少しずつ音量を変え試しましたが、音がしたときブロックの閾値は165程度でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71746/66ac690d-618a-ac3a-6750-c0a7f5345ceb.png)


#大きな音の認識のさせ方
指でマイク部分を叩いても息を吹きかけるだけでも195程度のマックスが出ます
.ssh/configで、IPv4とIPv6指定する方法

最近はサービスをIPv4、IPv6の両方で提供しているケースも多いですよね。
でも、ssh接続ではIPv4でのみ接続許可のままなんて設定のサーバなどあると思います。

そんな場合、アドレスファミリーを指定しないで接続すると場合によってはIPv6で接続され、タイムアウトし`client_loop: send disconnect: Broken pipe`なんて言われちゃうケースもあるのでは？

なのでアドレスファミリを指定するsshオプションのメモ書きです。

# まずはIPv4、IPv6を指定してSSH接続する方法

sshコマンドで、アドレスファミリーを指定するオプションは以下の通り。

| アドレスファミリー |  オプション  |
| ---- | ---- |
|  IPv4  |  -4  |
|  IPv6  |  -6  |

例えばIPv4を指定してssh接続するときは、以下のように指定します。

```bash
$ ssh -4 -i ~/.ssh/id_rsa -p 1234 -l hage www.hoge.com
```
ちなみに上記のその他のオプションは参考までに

### オプション
| オプション | 内容 |
| ---- | ---- |
| -i | 秘密鍵を指定|
| -p | ポート番号を指定|
| -l | ログインユーザー名を指定|

# .ssh/configでIPv4、Ipv6を指定する方法

さて、本題のアドレスファミリの指定の書式は以下となります。

```
AddressFamily [接続アドレスファミリ]
```

### 設定値

| AddressFamily | 設定値 |
| ---- | ---- |
| default | any |
| Ipv4 | inet |
| Ipv6 | inet6 |

### config記述例(IPv4を指定)
```
Host hoge
    HostName www.hoge.net
    User hage
    Port 1234
    IdentityFile ~/.ssh/id_rsa
    ServerAliveInterval 60
    AddressFamily inet
```
ここまで設定しておけば、接続は以下のコマンドで済みます

```bash
$ ssh hoge
```
以上です。

`man ssh_config`でも確認できますね。

```bash
   AddressFamily
             Specifies which address family to use when connecting.  Valid arguments are any (the default), inet (use
             IPv4 only), or inet6 (use IPv6 only).
```
AWSis何？を営業さんにもわかるように説明したい人生だった


## AWSis何？

先日、営業さんにこう尋ねられてうまく答えられなかったので、
いい感じの説明を考えてみる。
個々のサービスの詳しい説明は全力で端折ながら、
とりあえずはなんとなくこういうものなんだを掴んでもらうための記事。

「全然違ぇよ！」とグーパンが飛んできそうな記事だし、本当に全然間違ってる。
とはいえ、最短で説明することに全力を尽くしたのでそのへんは許してほしい

## AWS...いうて別に要らんやろ？

「Webサイトなんて別にさくらとか、Xサーバーで簡単に公開できるやん。」
個人で作るちっちゃいホームページならそれでもありかもしれない。

しかし、業務で作るアプリケーションはたくさんの人が使っても、
いつでも問題なくアクセスできることようにしなくてはならない
あとこれを限られた予算でやらなくてはならない。
キーワードは「限られた予算で」「いつでも問題なくアクセス」である。

## 「限られた予算」を果たすために　〜伸び縮みするAWS〜

AWSのない時代、それは例えると
いつもクリスマスに売れ行きに合わせてケーキを作っているケーキ屋みたいなもの。
本当はクリスマスはケーキをいっぱい作って、ほかは少なく作る
ってしたいがマックスの売れ行きに合わせざる負えなかった、そんな感じ。
めっちゃ損。

Webシステムもそのビジネスによって
「朝はめっちゃアクセス多い」とか
「月末にとにかくアクセスが集中する」とか実に繁忙期は様々だ。
だがいつでもMAXに合わせて備えておかなければならないとしたら？
そんな融通の効かなさ、膨大なコストの無駄。

その点、AWSはちゃんと多いときはいっぱい用意して少ないときには無駄な在庫はつくらない
みたいなことができる。

もちろん。いつでも問題なくアクセスできるようにするためには
いっぱいリソース（＝在庫）を確保しておけば良い、簡単だ。
だけどそんなことしていたらお金がいくらあっても足りない。
だからこの仕組みがありがたい。

## ...無理だった

AWSというかサーバレスの説明みたいになってしまった。ひどい記事だ。
短く正確に書くと「Amazonの作っている色々なサービス」ってことになるけど、
それだと全然イメージが伝わらないので難しいですよね。
Recursive Fibonacci (フィボナッチ数列)



# Fibonacci数列とは

    fib(0) = 0
    fib(1) = 1
    fib(n) = fib(n-1) + fib(n-2) (n >= 0)
    0 1 1 2 3 5 8 13 21 34 55 ...

の漸化式で定義される数列である.


# お題

フィボナッチ数列をrecursion(再帰)で求める．

動作確認には assert\_equal を使用

    require './assert_equal'


# fib(0) = 0

まずは初項の0から表示してみる

関数 fib を作成する

```ruby
def fib(n)
  if n==0
    return 0
  end
end
```


# fib(1) = 1

次はfib(1) = 1を表示させる

```ruby
def fib(n)
  if n==0
    return 0
  end
  if n==1
    return 1
  end
end
```


# fib(2) = fib(1) + fib(0) = 1

```ruby
def fib(n)
  if n==0
    return 0
  end
  if n<=2
    return 1
  end
end
```

これでは正常に動作確認できないので，以下のように変更する.

```ruby
require './assert_equal'
[[0,0],[1,1],[2,1]].each do |index, expected|
  puts assert_equal(expected, fib(index))
end
```

  puts assert\_equal(expected, fib(index))end\#+end\_src


# コード削減

```ruby
def fib(n)
  return 0 if n==0
  return 1 if n<=2
end
```

これで2行に削減できる．このほうがスマートで見やすい. 見やすさを意識してコーディングする.


# fib(n) =  fib(n-1) + fib(n-2)

第1項は n = 1 なら 1 を返すようにし, 第2項以降は再帰で値を返すようにすると以下のようになる

```ruby
def fib(n)
  return 0 if n==0
  return 1 if n==1
  return fib(n-1) + fib(n-2)
end
```

となる.

そうすると最終的なコードは，

```ruby
require './assert_equal_richer_output.rb'

def fib(n)
  return 0 if n==0
  return 1 if n==1
  return fib(n-1) + fib(n-2)
end

[[0,0],[1,1],[2,1],[3,2],[4,3],
[5,5],[6,8],[7,13],[8,21]],[9,34].each do |index, expected|
  puts assert_equal(expected, fib(index))
end
```

となる．

実行結果

    ["expected", 0]
    ["result", 0]
    succeeded in assert_equal
    
    ["expected", 1]
    ["result", 1]
    succeeded in assert_equal
    
    ["expected", 1]
    ["result", 1]
    succeeded in assert_equal
    
    ["expected", 2]
    ["result", 2]
    succeeded in assert_equal
    
    ["expected", 3]
    ["result", 3]
    succeeded in assert_equal
    
    ["expected", 5]
    ["result", 5]
    succeeded in assert_equal
    
    ["expected", 8]
    ["result", 8]
    succeeded in assert_equal
    
    ["expected", 13]
    ["result", 13]
    succeeded in assert_equal
    
    ["expected", 21]
    ["result", 21]
    succeeded in assert_equal
    
    ["expected", 34]
    ["result", 34]
    succeeded in assert_equal


# 参考ページ

[チャート式ruby-IV(Recursive Fibonacci)](https://qiita.com/daddygongon/items/1bb27b8920c201d5c520)



------
 - **source** ~/grad_members_20f/members/djj31370/c5_fibonacci.org
【JavaScript】Backbone.jsとは何か

#プログラミング勉強日記
2020年12月2日
JavaScriptを調べていたときにBackbone.jsを初めて知ったので、Backbone.jsについてまとめる。

#Backbone.jsとは
　Backbone.js(読み方：「バックボーン」)は、2010年に公開したWebアプリ構築のためのJavaScriptのフレームワーク。オープンソースのフレームワークで、[こちらのサイト](https://backbonejs.org/)で公開されている。フロントエンドで動作する必要最小限のシンプルなフレームワークなので、他のフレームワークに比べて設計が自由にできる。

　Backbone.jsはjQueryと一緒に利用させることが多い。jQueryのみで大規模なアプリ開発のプログラム全体を管理することは難しい。Backbone.jsはプログラムをModel・View・Controllerの3つの役割に分けて記述するように設計されているので、大規模開発の場合でもプログラム全体を一定のルールに従って管理できるようになる。なので、Backbone.jsはjQueryと一緒に利用されることが多い。

#Backbone.jsの特徴

- フロントエンドで動作する必要最小限のシンプルなフレームワーク
- 他のフレームワークと比べて設計の自由度が高い
- JavaScriptプログラムをModel・View・Controllerの3つに分けて記述する
- 大規模開発の場合でもプログラム全体を一定のルールに従って管理できる
- jQueryと一緒に利用されることが多い
- Backbone.jsを利用するためには、Underscore.jsが必要

#Backbone.jsのメリット

- コードを簡単に書ける(※)
- 配列が使いやすい
- 既存のデータベースとの接続ができる
- MVCモデルを理解できる

##コードを簡単に書ける
　※<b>jQueryをインストールすることができることもあり</b>、JavaScriptの実行時に必要な記述を削減することができる。開発規模や設計によるが、決まったテンプレートにデータを書き込むスタイルのページではコードの見通しが良くなる。


##配列が使いやすい
　Backbone.jsはModelやCollectionをJSON形式で記述することでわかりやすく配列を作成することができる。データベースを使わなくてもいい場合には、配列を使うことで演算や処理が簡単になる。

##既存のデータベースとの接続ができる
　Backbone.jsはREST形式に対応したインタフェースやサーバーとの通信用関数が用意されてるので、ローカルやサーバーでの更新が可能になり、データベースを利用したアプリ構築ができる。

##MVCモデルを理解できる
　Backbone.jsは2010年に登場した少し古いフレームワークなので、他のフレームワークへの移行が進んでいる。ただ、2020年の現在でも主流になっているJavaScriptのフレームワークはBackbone.jsと同じMVCモデルで設計されているので、MVCモデルの基本的な考え方や構造を理解することで、他のフレームワークにも対応できる。


#Backbone.jsができることとできなこと

- 中規模から大規模なプログラムの長期的な生産背の向上はできる
- 短期的な生産性の向上ができない
- コード量を削減することができない

　Backbone.jsでは、中規模から大規模なJavaScriptのプログラムを実装してメンテナンスしていくうえでの長期的な生産性を上げることはできる。

　jQueryを使うと、アコーディオメニューを開発するときなど格段に生産性が上がって、コードを削減することができる。しかし、<b>Backbone.jsの導入をしたからといってさらに改善することはできない</b>。


#Backbone.jsで作れるサービス
　JavaScriptだけでは実装が難しかったWebサービスを作成できる。

- Todoリスト
- 複数人で管理するプロジェクト管理ツール
- ポートフォリオ作成・保存サービス
- ネットショップ


#参考文献
[Backbone.jsの特徴とできることをまとめてみた](https://engineers-hack.com/backbone-js/)
[Backbone.jsとは？JavaScriptフレームワークについて解説](https://programming-world.net/jsframework/backbone/)
[第1回 Backbone.jsとは](https://app.codegrid.net/entry/backbonejs-intro)
UbuntuにArduino IDEをインストールして使えるようにするまで


# 概要
タイトル通りだが、Arduino IDEをUbuntuで使えるようにするまでの流れ。
最近環境構築をする機会があったため備忘録として。

# 環境
* OS: Ubuntu 18.04.2 LTS　(MacbookにUSBブート)
* CPU: i5 64bit

# 手順
## Arduino IDEをダウンロード

[公式サイト](https://www.arduino.cc/)からダウンロードしてくる。
今回は`Linux 64bits`を選択

![Screenshot from 2020-12-02 21-49-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84072/684084b7-5074-16d6-bd5b-ded0fd51b593.png)

## 解凍する
ターミナルを開き、ダウンロードフォルダに移動。

```
cd ~/ダウンロード
```

解凍コマンドにて圧縮ファイルを解凍する。
`tar`コマンドはつけるオプションによって圧縮/解凍などを選択できるらしい。`tar.xz`形式を解凍するためには`-Jxvf`が必要。

```
tar -Jxvf arduino-1.8.13-linux64.tar.xz 
```

## インストールスクリプトを実行する

`install.sh`を実行することでシンボリックリンクを貼ったりして`arduino`コマンドを使えるようにしてくれる。
自分は管理者権限が必要と怒られたのでsudoをつけて実行した。

```
cd arduino-1.8.13/
sudo ./install.sh
```

# 起動
正しくインストールできていれば起動できるようになっている。

```
arduino
```
postmanのクッキーをクリアする

以前に[Springを使ってトークンをイントロスぺクトしてみる](https://qiita.com/zhang_yid/items/85dad87dc00955842317)という記事を書きました。
これにより自分が書いたAPIをサードパーティーの認証サーバーで保護できます。

また、postmanを使って認証が効いてるかどうかを検証しました。
でもpostmanを使う時にある問題が発生しました、今回の記事はその問題と解決方法について話します。

## 1 cookiesによる問題

postmanではリクエストするたびにクッキーが生成されます。
これで該当のリクエストに対するキャッシュが生成されます。

https://stackoverflow.com/questions/49509992/how-to-disable-cookies-in-postman-application

ネッドで調査したのですが、このようなクッキーをディスエーブルする設定がそもそもpostmanにはないらしいです。
ちょっとショックでした。

普段ならばクッキーがあっても問題ないし、むしろいろいろキャッシュしてくれて速度改善も期待できます。

しかし、今回は認証のエンドポイントをテストしたいので、クッキーが残り続けると認証の`失敗する`ケースがテストできなくなります。

### 1.1 postmanでテストを書く

![image-20201202213932647.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774617/4ddea986-b8cb-fbf3-07be-7581eb32e741.png)


こういうふうに成功する場合のテストケースを書きました。
Authorizationタブに正しいトークン情報を入れています。
実行すると該当のテストがパスしました。

![image-20201202214105162.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774617/50c7e047-930c-3d5b-24ea-7b527b14a460.png)

同じくAuthorization情報を提供しない場合のテストを書きます。
リクエストを送信すると`Test Results`のところに該当のテストがパスしたことを確認しました。

### 1.2 Collection Runnerで実行してみる

ここまではうれしいですが、

![image-20201202214241124.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774617/c81ea36d-5be7-b722-0e9e-ffc43c3ddaa1.png)

コレクションランナーで複数テストを実行してしまうと、
もともの401のテストがなんと200になりました！

## 2 複数テスト実行失敗の原因

最初はいろいろ調査したけれど、
クッキーが存在することでもともと認証失敗するはずのリクエストが成功するようになったことがわかりました。

もう一度失敗するテストを実行してもずっと200が返されます。

![image-20201202214555324.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774617/be3c6ab0-f136-7c34-ffbc-37635ccdc3e7.png)

`MANAGE COOKIES`ダイアログで確認すると、localhostドメインに`JSESSIONID`というクッキーが存在しました。

このクッキーを削除してもう一度認証失敗するテストを実行すると、401が返されました。
やはりクッキーが原因ですね。

## 3 問題解消

今回はpostmanのスクリプトで自動でクッキーをクリアします。

### 3.1 スクリプトを有効にする

デフォルトではスクリプトを使ってクッキーを操作できないのでまず有効にします。

![image-20201202215005948.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774617/80218411-fe00-f092-3e74-0974b93a90cc.png)

![image-20201202214928685.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774617/95865da2-b63a-abc6-b858-fb42220d1ebe.png)

私は`localhost`を利用しているのでlocalhostを`whitelist domains`に追加します。

### 3.2 スクリプトを書く

```javascript
const jar = pm.cookies.jar();
jar.clear(pm.request.url.getRaw(), error => {
    console.log(error);
})
```

![image-20201202215621946.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774617/fbcd12d2-da1d-f2cf-a318-701fc2a26477.png)

`Pre-request Script`にクッキーをクリアする。
これは文字通りリクエストする前に実行されるスクリプトになります。

## 4 修正後結果

![image-20201202215736001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774617/cd8878db-cf1a-775c-4112-c541e691b855.png)

これでクッキー依存せずに楽しくテストできますね。
Go: Typeにかっこで優先度をつける

## はじめに

本記事は[Go 2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/go2)の3日目の記事です。

以前Goの仕様を眺めていたところ、型はかっこをつけることでパースの優先度をつけることができることに気付きました。

```
Type = TypeName | TypeLit | "(" Type ")" .
                            ~~~~~~~~~~~~
```
https://golang.org/ref/spec#Types

確かにいつも型を書いているところにかっこをつけても、普通にコンパイルできました。（`go fmt`をかけるとかっこは1ペアになります。）

```go
package main

import (
	"fmt"
)

func main() {
	var a ((((((((((((((((((((string)))))))))))))))))))) = "マカンコウサッポウ（写真）みたいだな"
	fmt.Println(a)
}

```

## 送信専用channelのchannel
この仕様を見つけた時は実際にかっこが必要になるような型が全然思いつかなかったのですが、

その後精神と時の部屋で修行を続ける中で（大嘘）、ようやく一つだけ見つけることができました。それは送信専用channelのchannelの場合でした。

```go
var c chan <-chan string
```
上のコードはこのままだとstringの送信専用channelのchannelに見えますが、実はstringのchannelの受信専用channelとして扱われます。`go fmt`をかけると下のようになります。

```go
var c chan<- chan string
```
これは`Type`の中の`TypeLit`の中の`ChannelType`が以下のようになっていて、一つ目の`chan`のあとにそのまま`<-`も読まれるからですね。

```
ChannelType = ( "chan" | "chan" "<-" | "<-" "chan" ) ElementType .
                         ~~~~~~~~~~~
```
https://golang.org/ref/spec#Channel_types

なので、送信専用channelのchannelを用意したい時は、かっこをつけて優先度をつけてあげる必要があるということでした。

```go
var c chan (<-chan string)
```


ちなみに送信専用channelの送信専用channelにはかっこはいらないですね。

```go
var c <-chan <-chan string
```

## さいごに
channel系の型は2つ以上のトークンで、型になるのが面白いですね。
では良いお年を -> <-
MacはダークモードだがChromeはダークモードにしない方法

## 結論
ターミナルにて

```bash
defaults write com.google.Chrome NSRequiresAquaSystemAppearance -bool yes
```

を入力後、Chromeを再起動。以上！

## なぜこの設定を行いたかったか

MacOSの夜になると自動ダークモード表示は基本的に好きなのですが、Chromeの開発者ツールは常に明るく表示させたかったのです。