OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu20.04 Desktopで日本語入力

# Ubuntu20.04で日本語が入力できない
## 現象
* 半角キーを押しても日本語入力できない
* Win+Spaceでも駄目
* OS入れるときに日本語にしたはず...
* SettingsのRegion&LanguageではJapaneseになっているのに...
* まず画面右上に言語のマークが無い

## やったこと
1. 調査
  * 調べたら下記のコマンドがでてきたが、せっかくなのでGUIで操作したい

    ```bash
    sudo dpkg-reconfigure keyboard-configuration
    ```

2. 言語の設定
  * Show Application（画面左下の□）でアプリ一覧を表示
  * Langage Supportを検索＆クリック
  * 言語サポートのダウンロードが不完全との表示が出たらインストール
  * Keyboard input method systemをIBusに変更
  * 画面右上の電源マークからLog Out

3. 設定の変更
  * 再ログインした後、画面右上の電源マーク→Settings
  * Region&Language
  * Input Sourcesのプラスマーク
  * Japanese(Mozc)を追加

4. 動作確認
右上に言語のマークが出ていれば成功。日本語(Mozc)を選択すればOK
元からあったJapaneseはそのまま置いておいて良い。削除したら半角キーが効かなくなる。
[GitHub Actions] Goプログラムを定期実行する

[Fringe81 アドベントカレンダー2020](https://qiita.com/advent-calendar/2020/fringe81)の15日目の記事です。

これまで何かのプログラムを定期実行させるときは、[AWS Lambda](https://docs.aws.amazon.com/ja_jp/lambda/index.html)と[AWS CloudWatch](https://docs.aws.amazon.com/cloudwatch/?id=docs_gateway)を使ってましたが、GitHub Actionsだけでできそうだなと思ったのでやってみました。

GitHubに[サンプルコード](https://github.com/kakke18/github-actions-practice)を公開しています。

## 実装
以下のようなYAMLファイルを`${root}/.github/workflows`ディレクトリに配置し、`${root}/main.go`に実際に処理したいGoプログラムを配置します。

```.github/workflows/job.yaml
on:
  push:
  schedule:
    - cron: "*/5 * * * *"

jobs:
  run:
    name: run
    runs-on: ubuntu-latest
    steps:
      # GOPATH等のセットアップ
      - name: Set Up
        uses: actions/setup-go@v2
        with:
          go-version: ~1.15

      # repositoryの中身にアクセスするためにチェックアウト
      - name: Checkout
        uses: actions/checkout@v2

      # 実行
      - name: Run
        run: go run main.go
        env:
          WEBHOOK_URL: ${{ secrets.WEBHOOK_URL }}
```

### 定義ファイルの設定
詳しくは[こちら](https://docs.github.com/ja/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions)

- on: ワークフローをトリガーするGitHubイベントの名前
    - 上記ファイルの場合は、リポジトリにpushした時と5分に1回イベントが発火する。
- jobs: 各jobを設定
    - 上記ファイルの場合は、以下のようなjobを設定した。
        1. セットアップ
        2. repositoryの中身に移動
        3. 実行(secretsから環境変数に代入し、プログラム側では`os.Getenv()`で実際の値を取得)

## 実装時にはまったこと
### onの設定
サンプルコードでは、`push`と`schedule`を設定しました。
pushはどのブランチでも実行されますが、scheduleは**デフォルトまたはベースブランチ**の直近のコミットで実行されるので、デフォルトまたデフォルトまたはベースブランチ以外で作業している場合は注意が必要です。

### 環境変数の設定
今回はサンプルとして、Slackにメッセージを送信するプログラムを用意しました(Slackにメッセージを送信するだけならcurlで良いが、今回はGoプログラムを実行したのであえてGoプログラムを用意した)。
Slackにメッセージを送信するためには、Webhook URLが必要になるが、このURLのように外部に公開したくない変数を用いる場合は、[リポジトリの暗号化されたシークレットの作成](https://docs.github.com/ja/free-pro-team@latest/actions/reference/encrypted-secrets)を参考に環境変数を設定し、`os.Getenv()`を使う。

### 定期実行できる最短の間隔は、5分に1回であり、厳密には設定できない
これはめっちゃハマった。
デバッグしようと思ってpushして10分たっても実行されずプログラムがおかしいのかなと思って時間を溶かしてしまった、、、

定期実行するためにはcron構文を使う([参考](https://docs.github.com/ja/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions#onschedule))が、docにも記載がある通り、**5分に1回よりも短く**設定することはできません。また、5分に1回と設定(`*/5 * * * *`)しても、5分に1回実行されるわけでは**ありません**(なんで？最大18分遅延した)。

## 感想
時間を厳密にする必要のない場合は、コードの管理とcronの設定を同一リポジトリで行えるので便利だなと思いました。
cronの時間が厳密でない理由をどなたかご存知でしたら教えてください:bow:

## 参考
- [GitHub Actionsのワークフロー構文](https://docs.github.com/ja/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions)
- [https://docs.github.com/ja/free-pro-team@latest/actions/reference/encrypted-secrets](https://docs.github.com/ja/free-pro-team@latest/actions/reference/encrypted-secrets)
- [Github actionsでgo mod download, test, lint](https://qiita.com/0daryo/items/045be6ef98ae8164e8e7)
[Laravel]早めのクリスマスviewが真っ白問題


#Laravelのviewが真っ白だ。
題名の通り、なぜかLaravelのviewが真っ白になったので、そのことについて残しておきます。ちなみに原因はめちゃめちゃ単純なことでした。

##環境

- windows10
- Laravel6
- php(7.4.6)

##やろうとしていたこと

```TestController.php

class TestController extends Controller
{
  public function index($id)
  {
   $users = Users::find($id);

   return view('test',['users' => $users]);
  }

  public function post()
  {
   return view('test.view');
  }
```


```web.php

Route::get('/test/{id}', 'testController@index');

Route::get('/test/post', 'testController@post');
```

てきな記述をしていたのですが、真っ白状態です。。。。
ググっていったところ、web.phpの順番が問題そう。

```web.php

Route::get('/test/post', 'testController@post');

Route::get('/test/{id}', 'testController@index');
```


変えてみたら、直った！

##原因

結果原因はweb.phpの順番というよりは、{id}の部分が邪魔していたそう。
最初の通り、

```web.php

Route::get('/test/{id}', 'testController@index');

Route::get('/test/post', 'testController@post');
```

このように記載していると、最初のRouteで/test/{id}を読み込んでしまい、test/postと送っても、ルーティングでpostをidと判断してしまい、そのようなidはないため、真っ白になっていた。
そのため、順番を変えると、先にtest/postが先に読み込まれるので、viewを返したのですね。
このままでも動くのですが、何かの間違いでまたidを読み込まれてもめんどくさいので、このように直しました！

```web.php

Route::get('/test/{id}', 'TravelController@showDetail')->where('id', '[0-9]+');
```

こうすると、idは数字しかとってこなくなり、先ほどの順番を変えても、先に読み込まれることはなくなりました。

##まとめ

以上がLaravelからのクリスマスプレゼントでした、この先も色々なプレゼント（エラー）をいただくと思いますが、ありがたく受け取ってうまく使いこなしていこうと思います。



##参考

[ルーティングを書く順番をミスって画面真っ白から抜け出せなくなった話](https://qiita.com/u-dai/items/966673ae1eb6c2613da8)
GoでJsonをUnmarshalする際にプリミティブ型のデータ欠損を検知する方法

# 概要

タイトル通り、GoでJsonをUnmarshalする際にプリミティブ型のデータ欠損を検知する方法を紹介します。

## TL;DR

データ欠損を検知したいフィールドをポインタ型で定義しよう。


## 説明

前提知識として、Goでは変数宣言時にゼロ値で初期化します。(参考記事: [ゼロ値を使おう #golang](https://qiita.com/tenntenn/items/c55095585af64ca28ab5)）

==本題==
以下のような構造のJsonを受け取って処理を行うAPIがあるとします。
(具体的に、受け取ったjsonを元にユーザ情報を更新するAPIのようなものを想像してください)

```input.json
{
  "id": 4,
  "name": "木板 太郎",
  "age": 24,
  "profile": "僕はGopherくんがあまり好きではありません" 
}
```

これをパースするGoプログラムは以下です。(httpサーバを実装するのが面倒だったので、そこは割愛します。)

```golang
type InputJson struct {
	ID int `json:"id"`
	Name string `json:"name"`
	Age int `json:"age"`
	Profile string `json:"profile"`
}

func main() {
	var input InputJson
	json.Unmarshal([]byte("{\n  \"id\": 4,\n  \"name\": \"木板 太郎\",\n  \"age\": 24,\n  \"profile\": \"僕はGopherくんがあまり好きではありません\" \n}"), &input)

	fmt.Printf("%+v\n", input)
}

// Output
// {ID:4 Name:木板 太郎 Age:24 Profile:僕はGopherくんがあまり好きではありません}
```

うまくパースできていますね。


今度は以下のJsonがリクエストされたと想定します。

```json
{
  "id": 5,
  "name": "禅 太郎",
  "age": 22,
  "profile": "最近の趣味はGopher君を愛でることです" 
}
```

しかし、HTTP通信中に何らかの原因で、一部のフィールドが欠損してしまいました。

```json
{
  "id": 5,
  "name": "禅 太郎",
  "age": 22
}
```

欠損したフィールドの値がnilなってくれれば、Goアプリケーション側でエラーを返すことができます。
しかし、Goでは先述した通り、フィールドにはゼロ値が設定されます。
この場合、欠損したprofileには空の文字列が設定されます。

```golang
type InputJson struct {
	ID int `json:"id"`
	Name string `json:"name"`
	Age int `json:"age"`
	Profile string `json:"profile"`
}

func main() {
	var input InputJson
	json.Unmarshal([]byte("{\n  \"id\": 5,\n  \"name\": \"禅 太郎\",\n  \"age\": 22 \n}"), &input)

	fmt.Printf("%+v\n", input)
}

// output
// {ID:5 Name:禅 太郎 Age:22 Profile:} ← nilにならない！！
```

これでは、意図的に空文字をリクエストしたのか、欠損による空文字なのかを判別できません。

このように、jsonをUnmarshalする際に欠損したデータがあった場合、そのフィールドにはnilを設定したいと思う場面があります。

## 解決策

以上の問題はフィールドをポインタ型にすることで解決することができます。

以下のように、リクエスト時にゼロ値を許容したくないフィールドをポインタで定義します。

```go
type InputJson struct {
	ID int `json:"id"`
	Name string `json:"name"`
	Age int `json:"age"`
	Profile *string `json:"profile"` // 欠損して欲しくないフィールドをポインタ型にする
}

func main() {
	var input InputJson
	json.Unmarshal([]byte("{\n  \"id\": 5,\n  \"name\": \"禅 太郎\",\n  \"age\": 22\n \n}"), &input)

	fmt.Printf("%+v\n", input)
}

// output
// {ID:5 Name:禅 太郎 Age:22 Profile:<nil>} ← nilになった！
```

このように、欠損したフィールドがnilに設定されるようになりました。

あとは `if input.Profile != nil {return fmt.errors.New("データが欠損してるよ")}` のようにエラーを返すようにすれば、誤ったデータのまま更新が行われずにすみますね。

## 結び

今回はGoでJsonをUnmarshalする際にプリミティブ型のデータ欠損を検知する方法の紹介でした。
正直、そもそもAPIの設計段階でゼロ値を許容しないようにすればいいじゃないかという気持ちもあります。。。（そもそも空文字や0が設定されない前提の設計にする）

誤字脱字などありましたらコメントいただけると助かります。
[Cocoa][ObjC]iOS 12以前のUISceneへの対処

<p>確かXcode 11からだったと思うが、XcodeのiOS Appの雛形から生成されるプロジェクトでビルドしたアプリがiOS12以前だと正しく描画できない状態となる。</p>

<p>自分の記憶だとビルドエラーになったと思っていたのだが、Objective-Cだからか警告メッセージが表示されるだけで、実機での起動はできる。</p>

<p>原因は、同一アプリの画面を複数表示するために導入されたUISceneがiOS13以降でないと対応していないためだ。</p>

<p>以前のAppDelegateで行われていた画面周りのコードがSceneDelegateに移動し、iOS12以前だとAppDelegateに画面周りのコードが存在しないため、表示がおかしくなっている。</p>

<p>試行錯誤した結果、対処方法は簡単だった。SceneDelegateで定義されているwindowプロパティをAppDelegateでも定義するだけでOKだった。</p>

<pre><code>@interface AppDelegate : UIResponder &lt;UIApplicationDelegate&gt;
 
@property (strong, nonatomic) UIWindow * window;
 
@end
</code></pre>

【関連情報】
<a href="https://qiita.com/advent-calendar/2020/cocoa">Cocoa Advent Calendar 2020</a><br />
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />
RhinocerosでモデリングしたネットワークをPythonで読み込む①

建築・都市計画数理のなかでも、特にポピュラーなものがネットワーク分析でしょう。建築や都市を、ネットワークとして抽象的に表現することにより、数理的に扱いやすい形にしたうえで分析やシミュレーションを行うことは常套手段です。

# 目標
1. Rhinocerosでネットワークを描く
1. Rhinocerosで描いたネットワークをPythonで読み込めるように書き出す
1. 書き出したファイルをPythonで読み込んで隣接配列を作る

本記事では第1項に取り組みます。

# 建築・都市の中のネットワーク
建築や都市の中には、様々なネットワークが織り込まれています。

|対象|ノード|エッジ|
|:-----------:|:-----------:|:-----------:|
|建築平面|部屋,開口部|廊下,通路|
|道路|交差点,建物出入口|道路|
|鉄道|駅|線路|

ネットワークはノードとエッジからなっており、エッジには（時にはノードにも）"重み"が与えられています。重みは、そのエッジを通過するのに必要な移動距離、時間（時間距離）、費用（金銭距離）などを設定できます。重みの与え方ひとつで、分析の幅と面白さはぐんと上がります。

# Rhinocerosでネットワークを描く
とにもかくにも、ネットワークを描いてみましょう。今回はRhinocerosというCADソフトを使ってネットワークを描いてみます。建築界隈の人の中には、Rhinocerosに明るい人がいるかもしれません。Rhinocerosは、そのなかでPythonを動かすことができるので、建築・都市計画の数理的な研究をする上では非常に使い勝手が良いです。今回は、下の地図（国土地理院地図）をもとに歩行空間ネットワークを描いてみます。
[](![Fig. 1](https://tbt-goat.github.io/home/tips/20201215/fig1.png "Qiita")
<img src="https://tbt-goat.github.io/home/tips/20201215/fig1.png" width=50%>

## ネットワークを描くルールは統一する
道路中心線などの公のベクターデータがあればそれを用いれば良いですが、ない場合には自分で線を引っ張る必要があります。そのときに大事なのが、**自分で決めたルールを守ること**です。おそらく、皆さんがご自身でネットワークを描くときには、「曲がった道路をどうしようか」とか「建物をネットワークにどう接続しようか」とかに頭を悩ませることでしょう。実際、ネットワーク分析はネットワークの描き方に結果が大きく影響されることがあります。重要なのは、その結果がネットワークの描き方によるものなのか、本質的なものなのかを判別できるようにしておくことです。そのためにも、一度決めたルールをネットワーク全体で統一させておく必要があります。

今回は歩行空間ネットワークを描きますが、これに関して国土交通省より示されている整備仕様案[^1]に従います。すると、下の図のようなネットワークになります。
<img src="https://tbt-goat.github.io/home/tips/20201215/fig2.png" width=50%>
今回、ネットワークは平面上にあるので、自己交差するようなエッジはありません。歩道橋や地下道などがある場合には、それらも含めてモデリングすると、より精緻な分析ができます。

# 【次回】Rhinocerosで描いたネットワークを<br>Pythonで読み込めるように書き出す
さて、Rhinocerosでネットワークを描き終えた後、分析するにあたり、そのネットワークをプログラミング言語が理解できるようなデータに翻訳してあげる必要があります。次回は、そのデータ構造と、データの作り方について説明します。
[→RhinocerosでモデリングしたネットワークをPythonで読み込む②](https://qiita.com/TBT-GOAT/items/974778883968e31ff886)

# ホームページのご案内
建築・都市計画数理に関する私の研究の内容や、研究にまつわるtips等は、個人ホームページにて公開しています。ゆくゆくは、気軽に使える分析ツールも作っていきたいと思っているので、ぜひ覗きに来てください。
[→田端祥太の個人ホームページ](https://tbt-goat.github.io/home/index.html)

### 参考文献
[^1]: [国土交通省政策統括官付、歩行空間ネットワークデータ等整備仕様案、2018.3](https://www.mlit.go.jp/common/001177504.pdf)
【Ruby】present/blankメソッドと後置if。

個人メモです。

if文と`present?`や`blank?`メソッドを使うことで、変数に値がセットされているかどうかで処理を分岐できる。

rubyではifを後ろに書くことができる（後置ifという）。これを使うとシンプルな記述ができる。


##present?とblank?

・`object.present?`
objectに値が存在するとtrueを返す。

・`object.blank?`
objectに値がない、または空だとtrueを返す。
値なしになるのは、nil、empty（""）の場合。


```ruby:値なしの場合
irb(main):333:0> x
=> nil

irb(main):333:0> x.present?
=> false

irb(main):334:0> x.blank?
=> true
```

```ruby:値ありの場合
irb(main):335:0> test
=> "テスト"

irb(main):336:0> test.present?
=> true
irb(main):337:0> test.blank?
=> false
```


###補足
blank?と似たメソッドでnil?やempty?もある。
検証するオブジェクトと出力の関係は以下。

| メソッド | nil | empty ("") |
|:-:|:-:|:-:|
| blank?  | true  | true  |
| nil?  | true  | false  |
| empty  | false  | true  |
| present?  | false  | false  |



```ruby:値がemptyの場合
irb(main):340:0> z = ""
=> ""
irb(main):341:0> z.empty?
=> true
irb(main):342:0> z.nil?
=> false
```

<br>
##後置if
処理の後ろに条件式をかける。従来の記述の改行やendを省略できる。

・`処理 if 条件式`


```ruby:後置if
def jadge(x)
  "exist" if x.present?
end
```

```ruby:通常のif文
def jadge(x)
  if x.present?
    "exist"
  end
end
```


<br>
##変数の値有無による条件分岐
blankやpresentを使うことで条件分岐ができる。
後置ifを使えばスッキリ記述できる。

```ruby:
def jadge(x)
  y = "No" if x.blank?
  y = "Exist" if x.present?
  p "回答は #{y} です"
end
```
Nimの便利な標準ライブラリ sugar

#はじめに
こんにちは、meganeoです。
[sugar](https://nim-lang.org/docs/sugar.html)というNimの面白い標準モジュールを見つけたので紹介します。

## 環境
Nim 1.4.2

#sugarとは
`sugar`は、Nimの標準モジュールの1つです。
macroを使い、複雑なものを簡潔に書けるようにしています。

##import

```nim
import sugar
```
# `=>`
`=>`は、JavaScriptでいうところのアロー関数です。
無名関数を簡潔に書くことができます。

```nim
proc TwoFunc(f: proc(int, int): int): int =
  f(2, 2)

TwoFunc((x, y) => x + y)
```

#`->`
`->`は、↑のような高階関数を定義するとき、引数を簡潔に書くことができます。

```nim
proc TwoFunc(f: (int, int) -> int): int =
  f(2, 2)
```

#`dump`
`dump`は、引数に入れた式とその結果を出力します。

```nim
let
  x = 10
  y = 5
  a = "a"
  b = "b"

dump(x + y) # output: x + y = 15

dump(a & b) # output: a & b = ab
```

#`capture`
`caputure`は、ループ内で任意の条件に当てはまる場合に、グローバルスコープに値を返すのに便利です。

```nim
# グローバルスコープで関数型の変数を先に定義しておく
var MyClosure: proc
for i in 3..5:
  for j in 4..8:
    if i * j == 28:
      capture i, j: #キャプチャーしたい値を引数にする
        MyClosure = () => dump(i * j)

MyClosure() # output: i * j = 28
```

当たり前ですが、当てはまる条件が複数の場合は最後にループした方が優先されます。

```nim
var MyClosure: proc
for i in 3..5:
  for j in 4..8:
    if I * j in [28, 32]:
      capture i, j:
        MyClosure =  () => dump(i * j)

MyClosure() # output: i * j = 32
```

#`dup`
`dup`は、引数として渡した変数を内部で変更してしまう関数(いわゆる破壊的メソッド)を、元のデータに影響なく使うことができます。

```nim
import algorithm

var a = @[5, 4, 3, 2, 1]
echo sorted(a) # output: @[1, 2, 3, 4, 5]
echo sorted(a) == a.dup(sort) # output: true
```

#`collect`
`collect`は、Pythonの内包表記のように、配列を元に配列や辞書を生成できるマクロです。
`collect`のブロック内の最後の式が評価され、その配列が指定した関数(ここではnewSeq)に渡されるようです。
つまり、自作のコンテナ型のコンストラクタも使うことができるということです。

```nim
let nineNum = @[1, 2, 3, 4, 5, 6, 7, 8, 9]
let oddNum = collect(newSeq):
  for i in nineNum:
    if i mod 2 == 1: i

echo oddNum # output: @[1, 3, 5, 7, 9]


let evenNum = collect(newSeq(4)): # 長さ指定もできる
  for i in nineNum:
    if i mod 2 == 0: i

echo evenNum # output: @[2, 4, 6, 8]
```

また、`table`の`{key:value}`や`set`の`mySet.incl`のように`table`と`set`を生成するには、ブロック内の最後の式を次のように書きます。

```nim
import sets, tables

let nineTable = collect(initTable(9)):
  for i, d in nineNum.pairs: {i: d} # {key: value}のように書く

echo nineTable # output: {}

let nineSet = collect(initHashSet):
  for d in nineNum.items: {d} # 入れたい値を {} で囲う
```

#まとめ

アドベントカレンダーに参加すること自体初めてなので至らない点もあるかと思いますが、これをきっかけに、少しでもNimに興味を持っていただけたら嬉しいです。最後までお読みいただきありがとうございました！
deepchemのNormalizationTransformerはtransform_X = Trueにしようという話

# ことの発端
RDKitDescriptorsを用いてtraining回したらtestデータの結果が余りにもバリデーションと乖離してる……一体何故……？ 
 
こんなissueを見つけた 
[Transforming datasets before or after Split? #1556](https://github.com/deepchem/deepchem/issues/1556) 

# Transformer
[Deepchem](https://github.com/deepchem/deepchem)の前処理では, [Transformer](https://deepchem.readthedocs.io/en/latest/api_reference/transformers.html)  というパイプラインを一般に用います. 
LogTransformer, ClippingTransformer, NormalizationTransformer, BalancingTransformer, MinMaxTransformer, などの既存のTransformerに加え、Transformerクラスを継承することで様々な前処理ができます ([DeepChemで欠損値を含む列を除去するTransformerを書いてみる](https://qiita.com/kimisyo/items/29c70a9cb2f535884686)).


Transformerはdeepchem特有のデータセット型`dc.data.Dataset`に対して適用されます.
`Dataset`の中身はnp.array型のX, y, w, ids, などです.
一回の前処理で適用できるデータは一つで, どのデータに対してTransformerを適用するのかを引数で指定します.

```python:deepchem.trans.transformers.py
class Transformer(object):
  def __init__(self,
               transform_X: bool = False,
               transform_y: bool = False,
               transform_w: bool = False,
               transform_ids: bool = False,
               dataset: Optional[Dataset] = None):
    """Initializes transformation based on dataset statistics.
    Parameters
    ----------
    transform_X: bool, optional (default False)
      Whether to transform X
    transform_y: bool, optional (default False)
      Whether to transform y
    transform_w: bool, optional (default False)
      Whether to transform w
    transform_ids: bool, optional (default False)
      Whether to transform ids
    dataset: dc.data.Dataset object, optional (default None)
      Dataset to be transformed
    """
    if self.__class__.__name__ == "Transformer":
      raise ValueError(
          "Transformer is an abstract superclass and cannot be directly instantiated. You probably want to instantiate a concrete subclass instead."
      )
    self.transform_X = transform_X
    self.transform_y = transform_y
    self.transform_w = transform_w
    self.transform_ids = transform_ids
    # Some transformation must happen
    assert transform_X or transform_y or transform_w or transform_ids
```

# 使用上の注意
NormalizationTransformerは平均を0, 標準偏差を1に変換するTransformerです.
`transform_y = True`を指定している参考コードが多く, そのままコピペするとおそらく意図しない結果が得られます. 
`transform_X = True`を設定する必要があります.
なぜならたいていの場合, 私たちは目的変数を標準化したいのではなく, 説明変数を標準化したいからです.

考えてみれば当たり前ですが, 結構重要なことだと思ったので, 記事にしました.

# 結論
コピペするときは理解してから使おう
レガシーな静的サイトを作る環境のボイラープレートを作ってみた

[生産性向上のための環境整備2020 【PR】 Lenovo Advent Calendar 2020](https://qiita.com/advent-calendar/2020/lenovo_env)の15日目の記事です。

## はじめに
Reactや、Vuejsなどのモダンな開発環境では、linterやビルドツールは簡単に導入できます。
しかし、VueやReactなしの環境でlinterやビルドツールを導入するとなると、
なかなかまとまっている記事がないため、環境を準備するのに時間がかかってしまいます。
かといって、それらを導入せずに開発を行うと、普段と違って生のCSSを書くのに苦戦したり、linterで防げていたミスなどが頻発してしまいます。
それらを解決するために、レガシーな環境でも、できるだけReactやVuejsに負けないDXの環境を作ってみました。

## ディレクトリ構成
ディレクトリ構成は以下のようになっています。
基本的に、ビルド対象は、srcに格納し、`.cache`(開発時)または`dest`(リリース時)ディレクトリに出力するようになっています。

```
ProjectRoot/
　├ .cache/				・・・ 開発用ビルド結果出力ディレクトリ
　│						    src内の資産がビルドされた結果の資産が格納される
　├ dest/				・・・ リリース資産出力ディレクトリ
　│						    public内の資産(.から始まるファイルは除く)がコピーされたもの
　│						    + src内の資産がビルドされた結果の資産が格納される
　├ node_modules/		・・・ npmでインストールしたパッケージの格納ディレクトリ
　├ public/				・・・ 静的資産配置ディレクトリ
　│						    ビルド対象とならない、HTMLや画像、ライブラリなどを配置する
　├ src/					・・・ 開発用資産配置ディレクトリ
　│						    ビルド対象となるstyleなどを配置する
　├ .bs-config.js		・・・ Browsersync(開発用ローカルサーバ)設定ファイル
　├ .browserslistrc		・・・ browserslist設定ファイル
　├ .editorconfig		・・・ editorconfig設定ファイル
　├ .eslintignore		・・・ ESLint除外設定ファイル
　├ .eslintrc.js			・・・ ESLint(JS用のlinter)設定ファイル
　├ .gitattributes		・・・ Git設定ファイル 
　├ .gitignore			・・・ Git除外設定ファイル
　├ .postcssrc.js		・・・ PostCSS設定ファイル
　├ .prettierignore		・・・ Prettier除外設定ファイル
　├ .prettierrc.js		・・・ Prettier(コードフォーマッター)設定ファイル
　├ .stylelintignore		・・・ stylelint除外設定ファイル
　├ .stylelintrc.js		・・・ stylelint(css用のlinter)設定ファイル
　├ LICENSE
　├ package-lock.json
　├ package.json
　└ README.md
```


## 使い方

### 事前準備
この環境は、[Node.js](https://nodejs.org/ja/)を利用しますので、インストールしておいてください。
また、バージョン管理ツールとしてGitを利用することを想定しています。

**補足**
Node.jsの普通のインストーラーを使ってもいいですが、nodenvなどのバージョン管理ツールを使うことを推奨します。
※普通にインストールすると案件毎にバージョンが異なる場合につらい思いをするため:disappointed_relieved:

### ダウンロード&実行
コンソールで以下のコマンドを実行します。

```sh:console
# 環境のダウンロード
% git clone https://github.com/ohnaka0410/web-starter-kit.git
% cd web-starter-kit
# 初期構築
% npm ci
# 開発サーバ起動(２回目以降はこれだけで大丈夫)
% npm run serve
```

### 表示確認
ブラウザで以下のURLを開けばページが確認できます。

```
http://localhost:3000
```

## リポジトリ
[ohnaka0410/web-starter-kit](https://github.com/ohnaka0410/web-starter-kit)

## まとめ
11tyやsass、babelを使いたい方など、案件や好みによって環境は多少変わってきますが、
使いたいpackageをインストールしたあと、package.jsonに`src`から`dest`に出力するように少し追記するだけで
簡単に使えるようになりますので、自分なりにカスタマイズして、快適に開発していただければと思います:innocent:
Xcode12.3 への XVim2 導入メモ

Xcode へ Vim ライクな機能を入れるプラグイン [XVim2](https://github.com/XVimProject/XVim2) をインストールする方法を毎回探しに行くのが面倒だったので、備忘録としてここにまとめようと思います。

# 実行環境

MacOS 11.0.1(Intel)
Xcode12.3

# 参考

ここに記載する内容は本家 GitHubリポジトリ を参考にしています。
[https://github.com/XVimProject/XVim2](https://github.com/XVimProject/XVim2)

# 1.証明書の作成

キーチェーンアクセス.app を開き、メニューから 「キーチェーンアクセス」 > 「証明書アシスタント」 > 「証明書を作成...」 を選択。

![スクリーンショット 2020-12-15 15.58.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565474/d9961621-d923-c2be-5d05-43ca6b63cace.png)


名前と証明書のタイプを変更し、次へ次へと進んで作成を完了させます。

![スクリーンショット_2020-12-15_16_01_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565474/a813d55f-fbe3-5c43-de2d-70729a9d2228.png)

# 2.Xcodeを自己署名

続いて次のコマンドをターミナルで実行します。

```zsh
sudo codesign -f -s XcodeSigner /Applications/Xcode.app
```

AppStoreからインストールした場合は上記ディレクトリにあるはず。
※ Xcodeがある場所が異なる場合は適宜パスを変更してください。
※ 完了まで結構時間がかかります。。

# 3.XVim2 を clone し、 make を実行

```zsh
git clone git@github.com:XVimProject/XVim2.git
```

↑の [2.Xcodeを自己署名](#2xcodeを自己署名) が完了していることを確認し、clone したディレクトリに移動して `make` を実行です。

```zsh
cd XVim2
make
```

# 4.Xcode起動 -> Load Bundle を選択

Xcode を起動するとダイアログが出てくるので「Load Bundle」を選択します。
（「Skip Bundle」がアクティブになっているので注意！）

![スクリーンショット_2020-12-15_12_22_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565474/c0e0f2d1-ff27-3d1e-2ff1-b6c369faa6d7.png)

以上でカーソルがブロックになって Vim と同じような操作が可能になります。
自分のプロジェクトを開いて確認してみましょう！

# (番外編) ちなみに、Xcodeアップデート後に必要なことはある？

Xcodeのアップデートをインストールした場合は、再び Xcode の自己署名、XVim2 ディレクトリでの `make` 操作が必要です。

この記事を書くタイミングで AppStore でインストールした Xcode12.2 を 12.3 へアップデートをしましたが、アップデート直後に起動すると機能が解除されていました。XVim2 ディレクトリへ移動し、 `make` を実行しても機能せず。。

しかし、[2.Xcodeを自己署名](#2xcodeを自己署名) からやり直したところ、今まで通り動作することが確認できました。
cubic-bezier を知る。

## 前提
CSS でのアニメーション実行スピード調整に cubic-bezier を使用したとき、何をしているのかあまり理解ができていなかったので既出の記事も多くあるかと思いますが自分の中で咀嚼するため書きました。

## cubic-bezier
CSS3 でアニメーションを行うときのイージングの値は linear, ease, ease-in, ease-out, ease-in-out が用意されており、用意されいてるイージング以外を設定したい場合に `cubic-bezier(x1,y1,x2,y2)`を用います。

名前の通りベジェ曲線の X軸, Y軸 を使ってイージングスピードの設定を細かくおこなう。

## イージングの値
| 値 | どういう動きなのか |
|:-----------|:------------|
| ease       | 【初期値】開始と完了を滑らかにする |
| linear     | 一定の速度  |
| ease-in | ゆっくり 始まる|
| ease-out | ゆっくり 終わる      |
| ease-in-out   | ゆっくり 始まり ゆっくり 終わる    |
| cubic-bezier(x1,y1,x2,y2) | 数値で細かく指定 |

## アニメーションさせたいときのプロパティ
animation は `animation-timing-function`,
transition は `transition-timing-function` の値に入力する。
※ブラウザは IE11, Edge も対応しているのでべンダープレフィックスは基本的には不要

## 使い方
SCSS で使用したい数値をまとめて変数化しておくと便利。

```hoge.scss
$easeInQuad: cubic-bezier(0.550, 0.085, 0.680, 0.530);

.hoge {
  transition: all .2s $easeInQuad;
}
```

## 数値入力がよくわからん
細かなイージング調整に数値入力が必要なので扱いが難しく感じますが、ジェネレータに頼れば視覚的に操作できます。積極的に使用します。
https://cubic-bezier.com/

イージング参考に素晴らしいページ
http://easings.net/

## まとめ
アニメーションさせるときに cubic-bezier 以外の値ばかり使っていたので、これからは積極的に使っていきます。
rails のアプリケーションサーバについて

お久しぶりです。井出です。
前回の記事から１年経ちましたね。

今年もやってきましたアドベントカレンダー！
昨日は若手のホープ、ダニエル・バレンボイムが大好きなダニーさんが記事を書いてくれました。
記事は[こちら](https://tech.pla-cole.co/%e3%82%a8%e3%83%b3%e3%82%b8%e3%83%8b%e3%82%a2%e3%81%a8%e3%81%97%e3%81%a6%e5%85%a5%e7%a4%be%e3%81%97%e3%81%a6%e3%81%8b%e3%82%89%e3%81%ae%ef%bc%94%e3%83%b6%e6%9c%88%e3%82%92%e6%8c%af%e3%82%8a%e8%bf%94/)

中途で入ったイケイケ系の彼ですが、
サーバばりばり触れるようになってきていて将来有望です！

入社してからの振り返り記事とのことで
プラコレが気になる方は、ぜひ雰囲気を感じてもらえたらと思います！

ダニーさんの流れで、自分も今年の振り返りをしてみようと思います。

去年まで自分のメイン言語はPHPでしたが、今年からRubyをメインにシステム開発していました。
記載方法が独特で最初は苦しめられましたが、振り返ってみると凄い楽しい言語です。
まだまだ理解できていない部分もあるので、来年はより深く理解できるよう進めていきます！

そんなこんなで、rubyのFWであるRailsで有名なサーバアプリケーション
puma / unicorn について、先日というか昨日なんですが
コマンドを調べる機会があったので
機能の違いとあわせてまとめてみようと思います。

## unicornについて
##### 前提：unicornはマルチプロセス/シングルスレッドです。

Unicornはプロセスごとに通信処理を行います。
そのため低速なio処理があった場合そこで足止めを食らい全体が重くなってしまいます。
これを回避するためにorkerの数を増やす必要がありますが
workerはCPUのコア数に依存する部分もあります。

### コマンド
#### 起動
```
bundle exec unicorn -E production -c config/unicorn.rb -D
```
-E 実行環境変数
-c 設定ファイルの位置
-D デーモン化

#### 停止
```
kill -QUIT cat pidファイルのパス
kill -QUIT masterのpid
```

#### 再起動
```
kill -HUP cat pidファイルのパス
kill -HUP masterのpid
```

#### 緩やかな再起動
```
kill -USR2 cat pidファイルのパス
kill -USR2 masterのpid
```

旧プロセスを保持した状態で、新プロセスを起動
起動後旧プロセスに停止シグナル(QUIT)を実施し停止させる。

(仕様は https://github.com/phusion/unicorn 参考)

## pumaについて

##### 前提：pumaはマルチプロセス/マルチスレッドです。
rails5.2から標準機能となった。
リクエスト処理をスレッド単位で溜めて、それをマルチに実行することでの並列処理を可能としています。
リソースが少ない中でも効率的にリクエストをさばくことが可能になります。

### コマンド
#### 起動
```
bundle exec puma -C config/puma.rb -d
```
-C 設定ファイルの位置
-d デーモン化

#### 停止
```
kill -QUIT cat pidファイルのパス
kill -QUIT masterのpid
```

#### 再起動（設定ファイルリロード無）
```
kill -USR1 cat pidファイルのパス
kill -USR1 masterのpid
```

#### 再起動（設定ファイルリロード有）
```
kill -USR2 cat pidファイルのパス
kill -USR2 masterのpid
```

使用用途によって使い分けることができれば素敵ですが
大規模システムでもない限り、パフォーマンスへの影響は無さそうですね。
[こちら](http://blog.s21g.com/articles/2346)の記事が、両者の性能部分などをまとめてくださっています。



明日はフロントの将来有望株の好君が記事を書いてくれるので、ご期待を！
それではまた1週間後に会いましょう！:raised_hand:


Now hiring！
プラコレでは、自由な未来をつくるために
一緒に冒険したいエンジニア・デザイナーを募集しています！
https://www.wantedly.com/projects/262436
運営サービス
[PLACOLE(プラコレウェディング)](https://pla-cole.wedding)
[DRESSY(ドレシー)byプラコレ](https://dressy.pla-cole.wedding)
[farny(ファーニー)byプラコレ](https://www.farny.jp)
RでUMAPを使ってみる(次元削減)


# はじめに
本稿は[R Advent Calendar 2020](https://qiita.com/advent-calendar/2020/rlang), 16日目の記事です。
昨日は@statdittoさんによる[「[R] [Shiny] 情報処理技術者試験の合格率simulatorを作りました!」](https://qiita.com/statditto/items/6b455182897234766d25)という記事でした。Shinyでのwebアプリ開発。憧れます。
 
さて、以前次元削減の手法としてt-SNEについての記事を投稿したのですが、
以下の記事によると、新たに**UMAP(Uniform Manifold Approximation and Projection)**という手法が2018年に登場していたんだそうです。
なんでも生成までの速度が速いんだとか。
[最新の次元圧縮法"UMAP"について](https://qiita.com/cheerfularge/items/27a55ebde4a671880666)

pythonでの使い方は何件か見つかったものの、Rでの例は見受けられなかったので、今回はggplotを使った実行例をまとめてみたいと思います。

# UMAPについて
Leland McInnes氏らによる[UMAPの論文はこちら](https://arxiv.org/abs/1802.03426)で読むことができます。
提出が18年、閲覧時点で最後のリバイスが20年9月とホントに出来立てホヤホヤですね。

概要を見てみると、UMAPはリーマン幾何学と代数トポロジーに基づいて構築された次元削減の為のminifold学習手法とあります。
(´Д` )?

筆者曰く

- tSNEにひけをとらない可視化の品質(基データの特徴をできるだけ失わないということ)
- 実行時間の短さ
- 埋め込み次元数に制限がない  

というのが強みらしいです。

# パッケージ
[こちら](https://cran.r-project.org/web/packages/umap/vignettes/umap.html)によると、Rでは`umap`と`uwot`の２つのパッケージがあるようです。
今回は[`umap`]()を使用します。

# 使用データ
以前作ったt-SNEと比較したかったので、同じmtcarsのデータセットを使用します。
詳細は下記記事を参照してください。
[Rでt-SNEを使ってみた(高次元データの圧縮)](https://qiita.com/warawa_abnormal/items/cad4f9bc2d2408dd69f6)

#使ってみよう
使い方は超シンプルです。

```r
library(umap)

mt<- read.csv("mtcars.csv")#データ読み込み

mt.umap<- umap(mt[,2:12])#データフレームから解析する部分だけ選択
```
これでほぼ終わりです。
データ入れるだけで色々とチューニングが必要ないのは有難いですね。
再現性を気にする場合は`preserve.seed = TRUE`にするようです。

UMAPの座標データは生成されたリスト`mt.umap`のlayoutに格納されています。

```r
head(mt.umap$layout,3)#3行目まで表示

          [,1]       [,2]
[1,] -1.489809 -0.9945762
[2,] -1.138094 -1.2561847
[3,] -2.525882 -0.5043327
```

それでは可視化してみます。

```r
library(ggplot2)
library(dplyr)

mt.cord<-mt.umap$layout %>% as.data.frame()#座標取得してdfに変換

#作図
p<- ggplot(mt.cord,mapping = aes(V1,V2,color = mt$Region))+
geom_point()+
stat_ellipse(type = "norm",linetype=1)
p
```
できた図がこちら。

![umap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683885/6a65c434-1b01-a5c1-132c-d067f790bb88.png)


なかなかよさそうですね。
やはり日本車(JP)とアメ車(US)の集団が異なっています。

せっかくなのでいくつかの手法と比べてみます(コードは省略)。
![comp2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683885/ee4283d2-0774-6c43-e8e0-3511ccee14c4.png)
こうしてみるとUMAP(左上)とt-SNE(右上)はほぼ遜色ない結果が得られていますね。
(距離の問題なので軸が反転しているのは大きな問題ではないと思われます。）
左下はバイオインフォマティクス分野で使われるBray-Curtis indexを用いた主座標分析(PCoA)です。
さらに右下は主成分分析(PCA)の結果です。

どのプロットが最も基データの特徴を表現できているのかというのは難しいのですが、少なくともUMAPを使うのは問題ないように感じます。

# 最期に
使い方が簡単な点でUMAPはとても良かったです。色々と活用できそうですね。
生命科学分野の論文でも色々と使われているようなので、今後使用を検討される場合は以下も参考にしてくださいませ。
[Scientific Papers](https://umap-learn.readthedocs.io/en/latest/scientific_papers.html)

12月も折り返しましたね。年末に向けて頑張りましょう!!
明日は@Ringa_hyjさんです。
【BigQuery】Javascript UDFで外字変換してみた

# 概要
興味本位で調べた、BigQueryの[Javascript UDF]("https://cloud.google.com/bigquery/docs/reference/standard-sql/user-defined-functions?hl=ja#javascript-udf-structure","Javascript UDF")を使用して、BigQueryのテーブルデータの外字を内字に変換する方法をメモします。

# 外字を使用したデータの取得

## クエリ

１文字目を「希」、２文字目を外字にして取得する。

```sql:
SELECT '\u5E0C\uE757' AS char
```

## 結果
２文字目が外字のため、画面上だと文字化けしている。
![スクリーンショット 2020-12-15 19.08.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436850/ca95e5c3-9218-30b1-3947-fe423f03ab19.png)

# 外字を内字に変換してデータ取得

## クエリ

Javascript UDFで、外字と内字のマッピング表を定義し、外字を内字に変換する。

```sql:
CREATE TEMP FUNCTION CONVERT_EXTERNAL_CHAR(input STRING)
RETURNS STRING
LANGUAGE js AS
"""
const convert_list = [
{ gaiji: "\uE757",naiji: "\uFA93"} // 望
];

convert_list.forEach(function(item,index,array) {
  input = input.replace(item.gaiji, item.naiji);
});

return input;
""";
SELECT
  CONVERT_EXTERNAL_CHAR(char) AS char
FROM
  ( SELECT '\u5E0C\uE757' AS char );
```

## 結果
「希望」と出力された！
![スクリーンショット 2020-12-15 19.09.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436850/290f23ab-a26a-b9a4-5619-6dd354735d04.png)
Pythonの容易性について

大変遅くなりすいません。
実は昨日ブリッジ（ArcherC81)交換してまして。
申し訳なかったです。
本来なら [Python Advent Calendar 2020](https://qiita.com/advent-calendar/2020/python "Python Advent Calendar 2020")15日目ですが16日目に書いてます。
#Pythonなら簡単
正直言うとPythonは簡単ですが。
PHP同様フレームワークが多くてどれを使えばよいのかわからなくなることありませんか。
実は俺は素のものを使うのであんま感じません。
素のほうが簡単で楽なものを書けますから。
#Pythonは思ったとおりに書ける。
しょうじきPHPと同じくらいPythonが好きになりました。
なぜなら簡単でしかも自分のやりたいことを実現できるから。
ガリガリに書かなくてもいい所が良いところですね。
Javascriptははっきり言って変になりすぎました。
だからこそPythonに移動してきたわけです。
#もっと気楽に書きましょう
正直MSOfficeにPythonでプログラミングしてやりたいくらいですよ。
VBAって全然改変もなにもない言語で危ないことだらけですから。
これからはVBAじゃなくPythonでMSOfficeのコード書きましょう。
安定して良いコードが書けると思いますよ。
どうですかMSさん。
VBA捨ててPythonに乗り換えましょうよ。
#じつはPython初めて二年目です。
ここにも書きましたが本当にPython書き始めて二年目の初心者ですｗｗｗｗｗ。
正直言うともとのきっかけは今はさびしきPepperくんのブロックプログラミングがPythonで良いコード書いてるなって機がしたのでやって見る機会ないかなと思ったら。
安達さんに誘われてPythonやるようになってからでしょうね。
正直きれいにコードが書けるスクリプトと思いますよ。
PHP同様にPythonもC#も初心者に推したい言語の一つです。

あ思う一本書かないといけないので今日はここまでです。
一日遅くなりすいませんでした。
テスト工程のまとめ

#テストの必要性
プログラムの中にある、記述ミスや欠陥のことを**バグ**と呼びます。
プログラムというものは人の手によって書かれたものになるので、どうしてもミスをなくすことはできません。したがって、「ミスはある」という前提のもとで、バグを根絶するためにテストを繰り返します。これがテスト工程の役割です。
テストの工程をおざなりにしてしまうと、「どの機能が正常に動くのか」は一切分からないシステムができあがります。とても怖くて使えないです。
そんなわけで、正しい品質のシステムを提供するために、テストはとても重要な工程と言えます。

#テストの流れ
テストは基本的に以下流れで作業されます。

##①単体テスト
テストはまず、部品単位の信頼性を確保するところから始まります。
そのために行われるのが**単体テスト**です。このテストでは、各モジュールごとにテストを行って、問題がないかを検証します。
そして単体テストでは`ブラックボックステスト`や`ホワイトボックステスト`という手法を使用して検証を行います。

**ブラックボックステスト**
ブラックボックステストでは、`モジュールの内部構造は意識せず`、入力に対して適切な出力が仕様書通りに得られているかを検証します。
内部構造は考慮しないため、プログラムが内部でどのような動きをしているのかわかりません。そのため、情報の処理前と処理後の値の変化や、画面の状態といったインプット・アウトプットの結果のみを確認することで検証を行います。


**ホワイトボックステスト**
ホワイトボックステストでは、逆に`モジュールの内部構造が正しく作られているか`を検証します。
網羅的なテストのため、条件分岐を基準としたテストや例外処理を重視したテストなど、あらゆる事態に対して動作確認を行えます。バグと呼ばれるプログラム上の記載ミスや処理間違いによるエラーがないかなど、単純なミスがないかを検証します。

上記のことから、**ブラックボックステストは利用者目線でのテスト**になり、**ホワイトボックステストは作成者目線**でのテストと言えます。

##②結合テスト（統合テスト）
単体テストが終わると、次に待つのが**結合テスト**です。RSpecでは`フィーチャスペック(feature specs)` と呼ばれることも多いようです。
結合テストでは、開発したソフトウェア全体が一つのシステムとして期待どおりに動くことを検証します。
単体テストだけでは、結局アプリケーションのごく一部をテストしているに過ぎないので、結合テストでより広い部分をカバーし、実際のユーザーがあなたのコードとどのようにやりとりするのかを表現します。言い換えるなら、フィーチャスペックではたくさんの異なる部品が結合されて、一つの アプリケーションになっていることを検証するためのものです。


##③システムテスト（総合テスト）
結合テストが終わると、最後に**システムテスト**です。
すべてのプログラムとハードウェアを合わせてシステム全体のテストを行います。システムテストが、開発者側の最終テストです。ハードウェアを実際に動かしながら、すべてのサブシステムで想定される処理を一通り実施します。
具体的には以下のようなテストを行います。

- 機能テスト（要求された機能がちゃんと動くか）
- 性能テスト（処理能力は十分か）
- 負荷テスト（高い負荷の下でも問題ないか）
- セキュリティテスト（セキュリティ的に安全であるか）
- ユーザビリティテスト（ユーザーにとって本当に使いやすいか）

これらのテストを全て検証を経てようやく、ソフトウェアがリリースされます。
以上となります。

本記事を最後まで読んで頂きありがとうございました。
【ネットワーク基礎】デジタルとアナログの違い

####※はじめに
本記事は、筆者が備忘録として残しているものです。
記載されている文書及び内容に関して、その正確性、有用性、完全性等、如何なる保証をするものではありません。
たとえ記載内容に誤りがあった場合も筆者は、一切責任を負えませんので予めご了承下さい。

#ネットワークでは、「デジタルデータ」を取り扱っている
現在のコンピュータの主流であるデジタルコンピュータ(以下PC)では、デジタルデータを取り扱っています。
すなわち、PC等の機器間のデータ送受信を担うネットワークもまた、デジタルデータを取り扱っていることになります。
今後ネットワークの仕組みを理解するには、運ぶデータそのものに関する知識と理解が必要です。
「デジタルデータ」の正体は、具体的にどの様なものなのかをしっかりと理解する所からスタートしましょう。

# 「アナログ」との比較を行う事でより理解しやすくする
「デジタル」と対をなして比較される言葉に「アナログ」があります。アナログとの対比を行う事で、デジタルに対する理解も深まるため、両者に言及していきたいと思います。

###「アナログ」とは
引用元　[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%8A%E3%83%AD%E3%82%B0 "Wikipedia") より
>アナログ（英: analog、英語発音: [ˈænəˌlɔːg] アナローグ）は、連続した量（例えば時間）を他の連続した量（例えば角度）で表示すること。デジタルが連続量をとびとびな値（離散的な数値）として表現（標本化・量子化）することと対比される。時計や温度計などがその例である。エレクトロニクスの場合、情報を電圧・電流などの物理量で表すのがアナログ、数字で表すのがデジタルである。元の英語 analogy は、類似・相似を意味し、その元のギリシア語 αναλογία は「比例」を意味する。

つまり、小数点以下の数値も使い、無限桁に近い数字で表すことができる量を、アナログデータと呼びます。
(例：時間は秒の下にも、ミリ秒、マイクロ秒、ナノ秒、ピコ秒、フェムト秒と存在します)


###「デジタル」とは
引用元　[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB "Wikipedia") より
>デジタル（英語: digital, 英語発音: [ˈdiʤətl]。ディジタル）とは、整数のような数値によって表現される（飛び飛びの値しかない）ということ。工業的には、状態を示す量を量子化、離散化して処理（取得、蓄積、加工、伝送など）を行う方式のことである。計数（けいすう）という訳語もある。古い学術文献や通商産業省の文書などで使われている。語源はラテン語の「指 (digitus)」であり、指で数える、といった意味から派生して、（離散的な）数あるいは数字というような意味となった。

つまり小数点以下の数値は使わず、きりの良い飛び飛びの数値で表している量を、デジタルデータ呼びます。
PCが二進法でのデータ処理を行っている事から、「デジタル = 0 or 1」と理解している人もいるかもしれませんが、それは間違いです。二進法はあくまで、デジタルの一部をであり、デジタルそのものではありません。

アナログとデジタルの違いは、下図の高度の違いで表せます。
デジタルは高度を、[0m,1m,2m,3m,4m,5m]でしか表すことが出来ませんが、アナログは[0m,5m]の範囲の任意の実数値を取ることができます。これがデジタルとアナログの違いです。

<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/950910/b0c80db1-d577-eff0-8eb7-21b59a064649.png" alt="属性" title="タイトル">
</div>


# 最後に
デジタルとアナログの大まかな説明は以上になります。次回以降
・コンピューターはデジタルデータをどのようにして受け取るのか？
・アナログデータの送受信を行っている機器は何か？
・デジタル⇆アナログの変換はどの様に行っているのか？
といった内容の記事を作成していきます。


#記載内容引用元一覧
引用元　
[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%8A%E3%83%AD%E3%82%B0 "Wikipedia")
[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB "Wikipedia")
新機能QuickSight Qとは？？

#はじめに
**この記事は株式会社ナレッジコミュニケーションが運営する Amazon AI by ナレコム Advent Calendar 2020 の 15日目にあたる記事になります。**

現在開催中のre:Invent2020にて発表された新サービス「QuickSight Q」について、調べたことを簡単に書いていきます。
#そもそも「QuickSight」とは？
QuickSightとは、AWSが提供するBIツールであり、RDSやS3など様々なデータソースと接続し可視化&分析することができます。
機械学習ベースの異常検知、予測、自動ナラティブ（サマリ文章作成）機能が備わっており、専門家でなくても非常に使いやすい仕様となっているのが特徴です。

#本題「QuickSight Q」とは？
QuickSight Qとは、QuickSightに新たに搭載された機械学習(ML)を利用した自然言語クエリ(NLQ ※Natural Language Queryの略)機能のことです。
これによりQuickSightを使用して日常の言語でデータに関する質問を尋ねることで、数秒で正確な回答を得ることが出来るようになりました。
例えば、「昨年と比較して売上高の伸びはどうなった？」や「昨年と比較して最も売上高が伸びた製品は？」といった質問に対して、
Qが自然言語処理を行って質問の意図を解釈し、QuickSightで数値、グラフ、テーブルの形で質問に対する回答を返すことができます。
以下の例では「show monthly gaming revenue for california for last 3 years(過去３年間のカリフォルニアのゲーム収益を表示して！)」というNLQを投げています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593135/6e595972-9141-1311-5b8e-af61627c6ef8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593135/93a9019a-e75c-1c39-c6ca-02b4a61f90a0.png)

従来であれば主要な指標や監視したい項目ごとにダッシュボードを作成するのが一般的であったため、意思決定者からダッシュボードに見つからない質問がされた際はその都度新たにダッシュボードを作成する必要がありましたが、このQ機能によってこのようなシーンにも即座に対応が可能となります。


#使用に関して
Qのプレビューは、米国東部 (バージニア北部)、米国西部 (オレゴン)、米国東部 (オハイオ) および 欧州 (アイルランド) で利用可能とのことですので、現状対応している言語は英語のみだと思われます。(そもそも日本語の自然言語処理は難しいので日本語対応は少し先になるかもしれません、、、)
Qの使用を開始するにはまずはQuickSightを使用しているという前提が必要となりますので、まだ使用していないという方は以下から以下を参考にQuickSightを始めましょう。
https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/example-create-an-analysis.html
QuickSight Qの詳細な使用手順に関しては以下URL記載の内容を参照いただければと思います。
https://aws.amazon.com/jp/blogs/news/amazon-quicksight-q-to-answer-ad-hoc-business-questions/


#終わりに
本記事ではQuickSightの追加機能である、QuickSight Qについて簡単にご紹介いたしました。
日常で使用している言語(現時点では英語のみですが)を使用してデータ活用ができるという非常に魅力的な機能でした。
そのうち音声で同様のことができる日も近いかもしれません。
BIツールに悩まれている方はぜひ、QuickSightを検討してみてはいかがでしょうか？

参考記事
https://aws.amazon.com/jp/blogs/news/amazon-quicksight-q-to-answer-ad-hoc-business-questions/
KyotoExpo CTF Write-up

# はじめに

この記事は [N予備校受講者 Advent Calendar2020](https://adventar.org/calendars/5171)
の 14日目 の記事です。

今回は先日開催されていた、 KyotoExpo CTF の Write-up を投稿させていただきたいと思います。

よろしくお願いします :laughing:

# 自己紹介

はじめまして！　プログラミングを勉強している yu1k です :raised_hands:

## N予備校との関わりについて

去年の3月くらいからN予備校のプログラミング入門コースを受講して、プログラミングを勉強させていただいています。

# KyotoExpo CTF とは

京都の ハッキングコンテスト in 京都スマートシティエキスポ2020　です。

2020/12/12 ~ 2020/12/13 にオンラインで開催されていました。

## 参加結果

チーム yu1k で参加しました。5問解くことができ、89チーム中　52位（350ポイント）でした。

以下解けた問題の write-up です。

# [Crypto] 0 decode(Very Easy)

## 問題内容

```
RkxBR19reW90b3NtYXJ0Y2l0eWV4cG8=

 ハッカー集団によりハッキングされたホームページに謎の文字列が表示されている。
 調査の結果どうやらbase64でエンコードされているようだ。デコードしてみよう。
```

## 解き方

base64 デコードする。 ソースコードは [こちら（GitHub）](https://github.com/yu1k/ctf/blob/master/KyotoExpoCTF2020/crypto/0decode.py) です。

## フラグ:

```
FLAG_kyotosmartcityexpo
```

# [Network] 1-1 FTP(Very Easy)

## 問題内容

```
NASサーバに対して不正なアクセスの痕跡が見つかった。
通信内容を解析すれば何かが分かるかもしれない。pcapファイルを調べてみよう。
```

## 解き方

pcapファイルが渡される。そのpcapファイルを解析するとパケットのなかに平文でフラグが入っていました。

### フラグ:

```
FLAG_biHehUUnazQPt
```

# [Misc] 1-2 SSH avoidance(Very Easy)

## 問題内容

```
引き続きNASサーバの不正アクセス状況を調査している。
このSSH、簡単に侵入できそうだ。
```

## 解き方

サーバのIPアドレスと接続できるポートが渡される。

脆弱そうかつ適当なパスワードを入力し、侵入を試みてみる。

```
ユーザ:admin
パスワード:password
```

で侵入できた。

で以下の操作をし、フラグを得る。

```
admin@58d2aec14ceb:~$ ls

flag.txt  q6

admin@58d2aec14ceb:~$ cat flag.txt

FLAG_jbSSTdXTLCc4a
```

## フラグ:

```
FLAG_jbSSTdXTLCc4a
```

# [Web] 6-2 authentication avoidance(Easy)

## 問題文

```
ルータのログイン認証は簡単に突破できそうだ。

問題サーバー
http://18.177.208.49/
```

## 解き方

SQLi問題だと予想。

問題サイトのフォームに対して、SQLインジェクションを行う。

ユーザ名に `1' or '1' = '1';--` と入力したらログインをすることができました。

## フラグ:

```
FLAG_RqWGsVKFAQMUn
```

# [Network] 2-1 basic authentication(Easy)

## 問題

```
Webカメラへの不正アクセスの痕跡が見つかった。
通信をキャプチャしたので分析してみよう。
```

## 解き方

pcapファイルが渡される。そのpcapファイルを解析する。

問題の名前から basic認証を用いた認証だと予想。そこでpcapファイルの中に残されている、HTTPの通信のログを解析し、フラグを見つけました。

### フラグ:

```
FLAG_9sdnR5MH4iiGW
```

## 感想

何問か解けたのでうれしかったです。運営, 関係者の方々、ありがとうございました。
【Ruby】if文の条件式で変数を代入する。

個人メモです。

`if(x = test)`が何をしているかについて。rubyでは変数の条件式で代入が使える。


##実例

```
if x = test
  p x
end

=> nil
```

`if x = test`で、変数`test`の値を変数`x`に代入している。

もし代入元の変数`test`がfalseなら結果はfalseになる。

・`p x`
「p」は出力。変数xを出力するとの意味。


<br>
変数テストに値が存在すれば、if文の結果はtrueになる。

```
test = "テスト"

if x = test
  p x
end

=> "テスト"
```
【Ruby】シンボルの変数と文字列の変数の違い。[:a]と['a']の違いについて。

個人メモです。

オブジェクトの値の取得方法で、`obj[:a]`と`obj['a']`では対象となるデータの構造が異なる。

オブジェクトが**シンボル**で作成されているか**文字列**かによる。

文字列を使ったオブジェクトを**ハッシュ**と呼ぶ。


<br>
##シンボルを使ったオブジェクト

`obj = {a:1, b:2}`の場合、プロパティ名はシンボルとなる。
データ取得時の指定もシンボルで行う。

```ruby:オブジェクト
obj = {a:1, b:2}
=> {:a=>1, :b=>2}
```

```ruby:データの取得
##OK
obj[:a]
=> 1

##NG
obj['a']
=> nil
```

シンボル形式のオブジェクトのプロパティ名を`' '`で指定するとエラーになる。



<br>
##文字列を使ったオブジェクト

`obj2 = {"a" => 1, "b" => 2}`のように文字列で作成したオブジェクトのデータ取得は文字列で指定する。

```ruby:
##オブジェクト定義
obj2 = {"a" => 1, "b" => 2}
=> {"a"=>1, "b"=>2}

##データ取得
obj2['a']
=> 1
obj2["a"]
=> 1


##NG
obj2[:a]
=> nil
```

シンボルを使うとエラーになる。
バーチャル学会2020における発表者が会場に入場できない場合の音声ブリッジを使用した代理発表方法

#概要
[バーチャル学会2020](https://sites.google.com/view/virtualconference2020)運営のさいんす(@signs0302)です．
発表形式のイベントをVR空間で開催する場合，VRChatのインスタンスが一杯で入場できなかったり，回線状態が悪くて落ちてしまったりなどの問題が起きる場合があります．
その場合に運営側のアバターを中継しての音声ブリッジを使用した代理発表形式を構築し，バーチャル学会2020で使用したので方法を共有します．
実際にバーチャル学会2020では数名使用し，Discordを中継して双方向インタラクションが実施できていました．

#VRChat開催の場合
YAMAHA SYNCROOMとDiscordを経由して，運営スタッフの体と目を使用して代理発表を行います．
以下の手順を踏むことで，運営スタッフのVRChatの画面と音声を共有し，参加者側がマイクを通して会話することでVRChat会場に音声を出力することができます．
注意点としては参加者の音声は運営スタッフからは聞くことができないので，Discordのチャット欄で確認を行う必要があること，VRChat側で音声が聞こえているか確認が必要であることです．
また，VRChat側から聴講している他の参加者からは運営スタッフが発表しているように見えてしまうので注意が必要です．バーチャル学会2020ではワールドに[かた湯様制作の黒板](https://twitter.com/Ka_Ta_Yu/status/1242887431889637376?s=20)を設置していたので，黒板に代理発表中と表示して知らせていました．
##運営スタッフ側
1.[YAMAHA SYNCROOM](https://syncroom.yamaha.com/play/dl/)を予めインストールしておく
2.VRChatのインスタンスに予め入っておく
3.Discordの音声出力をYAMAHA SYNCROOMに設定
4.VRChatの音声入力をYAMAHA SYNCROOMに設定
![image (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454308/e37ad305-98af-ac52-1a48-2fae2e4d5b2a.png)
5.代理発表を行う参加者とDiscordのボイスチャンネルで通話を始める
6.運営側のVRChatの映像をDiscordのボイスチャンネルで画面共有を行う

##参加者側
1.運営スタッフに代理発表することを伝える
2.代理発表を行う運営スタッフとDiscordのボイスチャンネルで通話を始める
3.運営側のVRChatの映像をDiscordのボイスチャンネルで画面共有してもらう

#Cluster開催の場合
Clusterでは音声入力がPCのデフォルト設定になってしますため，うまくYAMAHA SYNCROOMを経由することが困難でした．
そのため，事前に回線状況が悪くなる可能性がある参加者には携帯回線(4G)を使用した発表を行ってもらいました．
注視点としてはスライドをスマホアプリからではめくれないので，運営がスライドを予めアップロードしておき，操作する必要がありました．
##運営スタッフ側
1.発表者のスライドファイル（pdf）を入手し，アップロードしておく
2.発表者の発表に合わせてスライドをめくる

##参加者側
1.スマートフォンに[Cluster](https://cluster.mu/)アプリをダウンロードしておく
2.Clusterアプリを通して発表を行う


#その他の対応
これらがうまく行かなかった場合に備えて，発表者が発表している様子を動画形式で受け取るように呼びかけていました．
Notionのボードを投票者数でソートする

アルプ株式会社でエンジニアをしています、集約のエンティティ@pictinyです。
これは[Notion Advent Calendar 2020](https://qiita.com/advent-calendar/2020/notion) 15日目のエントリです。
14日目は[Notionでボードの並び順を固定する](https://qiita.com/pictiny/items/50ba43bc4ac99d3ff819)でした。

# 投票
12日目の[NotionでKPTボードを作る](https://qiita.com/pictiny/items/d2a3774d6eeadcb2c2e5)では、KPTに投票する[+1プロパティ](https://qiita.com/pictiny/items/d2a3774d6eeadcb2c2e5#1%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3)を紹介しました。
KPTボードでは、投票数の多いKPTを優先的に表示したい、といった状況があるかと思います。

## 投票者数プロパティ
+1プロパティでソートしても、投票者数の順番には並びません。
投票数でソートするためには、投票者数をカウントするプロパティを追加する必要があります。

プロパティの値を使って何か計算をする場合、 `Formula` というプロパティタイプを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/eb88d781-3f40-93b1-4d8d-c09510e020bb.png)

Formulaは簡単な計算式を記述することができ、メニューから `Edit formula` を選択すると簡易エディタで編集ができます。
+1プロパティの投票者数をカウントする場合、計算式は以下のようになります。

```c
if(length(prop("+1")) > 0, length(replaceAll(prop("+1"), "[^,]", "")) + 1, 0)
```

## まとめ
Formulaで計算したプロパティを使うと、ボードを投票者数でソートすることができます！

公式ドキュメントは[Formulas](https://www.notion.so/Formulas-28f3f5c3ae644c59b4d862046ea6a541)にありますので、そちらもご覧ください。
LINE WORKSひとり管理者に聞いた、社内利用ルールのヒント

画面越しの皆さん、こんにちは。

LINE WORKSに2つあるコミュニティのうちの1つ、テック系の「LWTT」じゃない方のコミュニティ「[LWUG（えるわぐ）](https://lwug.connpass.com/ "LWUG（えるわぐ）")」のマネージャーやっています、たなはるです。

この記事は「[LINEWORKS Advent Calendar 2020](https://qiita.com/advent-calendar/2020/lineworks "LINEWORKS Advent Calendar 2020")」の15日めですー。

本日（12/15）LINE WORKSひとり管理者交流会を開催したので、交流会中に参加者（LINE WORKSユーザー、属性管理者）の方々とディスカッションした内容をレポートします。
ナイスタイミング！

運用・管理に悩む、LINE WORKSひとり管理者に届けば幸い！

##ちょっと待った、ひとり管理者交流会とは？
![無題212.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921197/0663f52e-0e30-d0d6-b01e-5e9b3af5a34f.png)
>会社やチームのメンバーと使う「LINE WORKS」。
「使う人は複数人だけど管理者は自分ひとりで管理や運用に悩んでる...」そんな方いませんか？
大丈夫です。会社やチームではひとりでも、同じ悩みを抱える仲間がいる！
LINE WORKSの管理における悩みやノウハウを、ランチを食べながら話し合いましょう！

> 〜 「[交流会ページ](https://lwug.connpass.com/event/197789/"交流会ページ")より」〜

##今日の交流会で話したこと
マニュアル作りや活用促進など、話したことは色々ありましたが（交流会の時間オーバーしてしまい、すみません...）、特に管理者メンバーたちの中で盛り上がったのがこちら。

* 活用付けるための社内利用ルール、どんな内容入れてる？
* LINE WORKSを社用スマホでで使う時、どんなルール作ってる？


###社内利用ルール、ある管理者の話
「ガチガチはしてないけど、みんなの意識合わせのマニュアルがあります」と一人のひとり管理者が教えてくれた社内利用ルール。内容は、主に「チャット（トーク）のコミュニケーションにおけるルール」や「通知設定の紹介」。

#####チャット（トーク）のコミュニケーション
例：
* 「おつかれさまです」「お世話になっています」は使わなくてOK。
→ 本題から入る直接入るコミュニケーションにすれば、業務はもっと気軽になるはず。

*「今いいですか？」を聞かなくてOK。
基本、今いい時にしかトークは見ない。
確認しなくても本題から入ってOK。どうしても確認したいという場合は電話機能や通話を。

*スタンプを使ってOK。


##### 「通知OFF」「おやすみモード」の紹介
手軽なのでかかってきてしまう...。通知がたくさんきて嫌な場合は自分で設定してね、と案内。

そのほか、 大人数のトークルームでは既読がつけば返信不要&トークルームの名前に「返信不要」も付ける。
→ 大人数のトークルーム、全員返信がきたら通知が鳴りっぱなしに...対策。


###社用スマホ利用におけるルール、ある管理者の話
「そこに関するガチガチなルールやガイドラインはないですが、管理者画面からの設定でファイルがスマホでダウンロードできないようにしています。ガイドラインで管理するというよりは、管理画面側で大事なデータを自社スマホに落とさないようにするなど、管理者側で設定を行っています。」



以上、管理者における管理話の一部を紹介させていただきました。
チャット（トーク）のルール作り、こう言うルール作りがあると、「こう言う風に送って良いんだ」と言うコミュニケーションにおける安心感があるよなあと思いました。もちろん、会社によって組織文化は異なるので、「これが正解！」と言う話はありません。ただその文化を明文化して、「こうして良いんですよ」と言うルールがあると従業員にとって気持ちは楽になるかもしれません。
ひとり管理者の皆さん、ありがとうございました！


そんなこんなで次の人に回します！お次の方、よろしくお願いいたします！
Git Hubのチーム開発での使い方〜ブランチを切る、プルリクをあげる、マージする〜

Git Hub使い方まとめ　

Git HubのIssueに対応する作業ブランチをmasterブランチから作成　

```git:feature
feature/add-name_column
```
　のように　feature/XXX　でブランチを切って作業。　

git statusで変更したファイル一覧を見て、git diffで差分確認。　

問題なければ、git add -Aして、git commit -m “MESSAGE”して　git push origin HEAD して　

GitHubのリモートブランチにpushする。　git push origin HEADというコマンドは

ブランチ名を指定しなくてもカレントブランチをリモートにpushすることが出来る。　

Pushしたブランチからプルリクエストを作成。

```ruby:qiita.rb
puts 'The best way to log and share programmers knowledge.'
```






プルリク画面でマージを実行して完了。

git checkout master, git pull origin master,コマンドの実行。

masterブランチを更新して次のタスクに備える。

コンフリクトに遭遇することもチーム開発の醍醐味。

ボタンを押すだけでコミットできるような
ツールもあるそうですが、しっかりコマンドラインを覚えて
コマンドで作業できるようにしておいたほうが
良いと思います。
TypeScript で　Let’s クラッシュ湯ばあば

何かと有名な湯ばあばプログラム

せっかくなので、TypeScriptで実装してみました。


#ロジック
```
// 1.出力「契約書だよ。そこに名前を書きな。」
// 2.ユーザからの入力を待つ
// 3.受け取った文字列からランダムに1文字抽出
// 4.出力「フン。入力した文字列というのかい。贅沢な名だねぇ。」
// 5.出力「今からお前の名前は抽出した1文字だ。いいかい、抽出した1文字だよ。分かったら返事をするんだ、抽出した1文字!!」
```


#実装
```typescript
// const input = fs.readFileSync("/dev/stdin", "utf8");//簡潔だがWindowsでは動かない
console.log("契約書だよ。そこに名前を書きな。(入力後Ctrl+C)");
const lines: string[] = [];

const reader = require('readline').createInterface({
input: process.stdin,
output: process.stdout
});

reader.on('line', function (line: string) {
lines.push(line);
});

reader.on('close', function () {
// この中に入力が終わった後のロジックを記載する。
const input = lines[0] as string;
const index: number = Math.floor(Math.random() * input.length);
const result = input[index];

console.log(フン。${input}というのかい。贅沢な名だねぇ。);
console.log("今からお前の名前は " + result + "だ。いいかい、" + result + "だよ。\n" +
"分かったら返事をするんだ、" + result + " !!");
});
```

ところどころで、小技を使ってるので
ぜひ使ってみてね
毎日Atcoder #1 ABC-002-d

# 問題概要
- N人の国会議員とM個の人間関係
    - N <= 12
    - M <= N * (N - 1) / 2
- N人の中で何人かを選び派閥を作る
    - 派閥条件：派閥内の議員はお互いに知り合いである
- 最大派閥の議員数を求める

# 考え方
## まともに考えた場合
- グラフ問題
    - 各関係をグラフにして，一番大きいグラフを求める
    - 最大クリーク問題
    - NP困難問題

真剣に考えるなら論文だったり読みながらやるのかな…？


## 今回の問題では…？
- N <= 12　M <= 66
- O(NM)，O(N^2)，O(M^2) : OK
- **O(2^N)** : OK（重要）

N, M共に条件が緩いため，**全探索**が可能であることに着目する．

### 解き方
- 国会議員の組み合わせを全て出す
    - 全探索
    - **O(2^N)**
    - 例：(1), (2), (3), (1,2), (1,3), ...
- その組み合わせが条件に満たしているか比べる
    - **O(N^2)**
    - 例：(1,2,3,4)の場合：
        - if (1,2) in 条件
        - if (1,3) in 条件
        - etc...


全ての組み合わせが条件を満たしているものの内，**最も多い要素数**が答え

### 実際に解いたコード
```Python
faction_result = 0


# 深さ優先探索を行う関数
def dfs(xy_list: list, member_count: int, position: int, member_list: list):
    # 探査範囲外に探査した場合
    # 選択した人と人の組み合わせを全てxy_listと比較する
    # xy_list内になければそれは条件に合致しないとわかる
    # print(member_list)
    if member_count < position:
        for first_member in range(len(member_list) - 1):
            for second_member in range(first_member + 1, len(member_list)):
                disc_list = [member_list[first_member], member_list[second_member]]
                # print(Disc_list, xy_list)
                if disc_list not in xy_list:
                    return

        # faction_resultと値を比較して小さい値を代入する
        print(member_list)
        global faction_result
        if faction_result < len(member_list):
            faction_result = len(member_list)

    # dfsを利用する
    # その人を選択しないか，するかの2通り
    else:
        # 選択しない
        dfs(xy_list, member_count, position+1, member_list)
        # 選択する
        dfs(xy_list, member_count, position+1, member_list + [position])


# [1], [2], [3], [1,2], [1,2,5]
def main():
    # 標準入力
    N, M = map(int, input().split())

    # 標準入力を入れる配列
    xy_list = []

    # M回入力を受け付ける
    for _ in range(M):
        xy_list.append(list(map(int, input().split())))

    # 深さ優先探索にて再帰計算
    dfs(xy_list, N, 1, [])

    # 結果出力
    print(faction_result)


if __name__ == '__main__':
    main()

```
執筆したいメディアが豊富な今だからこそMarkDownでネタを書き溜めてコンパイルするだけにしちゃおう！

[クソアプリ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/kuso-app) 18日目の記事です。


文字で自分の考えを発信する場所は今や数多く存在します。僕が主に使うのは以下です。

- [はてなブログ](https://www.shibuya24.info/)
- [Qiita](https://qiita.com/ohbashunsuke)
- [Zenn](https://zenn.dev/ohbashunsuke)
- [note](https://note.com/ohbashunsuke)
- [Twitter](https://twitter.com/ohbashunsuke)
- ※他今後も追加されるかも

## 執筆文章は一元管理したい

執筆内容とそのターゲットでメディアを変える事になるのですが、**執筆ファイルは一元管理**且つMarkDownにしたいです。

というのもこの記事はQiita、これはZennとか事前に考えておくことは難しくて、リリースする前に**「やっぱりこれは、はてブログかな」**ってなっちゃう時がよくあります。

という事で執筆フォーマットは書きやすさからMarkDownにして、リリースする前にメディアを選ぶという事をしたいです。


ただしお気づきかと思いますが、MarkDownをそのままコピペすれば成り立つというわけでもなく、各メディアの文法というものがあって適切にリライトしてあげないと**読みづらさ**があったり、**そもそも表示されない**といった事が発生します。


このリライト作業は正直**とても面倒くさい**ですし、全く生産性がありません。

ということでMarkDownでオリジナルの文章を管理しつつ、各メディアに適した文章に整形したファイルを作成すればよいのではないか？

と考え今回コンパイラを作成しました。

## 本記事のターゲットメディア

- はてなブログ
- Qiita
- Zenn

この3つに絞ります。


## 各メディアの記法の違い

各メディアの記法をまとめてみます。

メディア | 文法 
--- | --- 
はてなブログ  | はてな記法 + MarkDown + HTMLも可 
Qiita | Qiita記法 + MarkDown 
Zenn | Zenn記法 + MarkDown 

といった感じだと認識しています。


具体例を紹介します。

### 画像の表示記法

#### はてな

慣れると便利なはてな記法。画像サイズ指定もできちゃいます。[^1]

```markdown
[はてなの画像ID:w550]
```
[^1]: はてなの画像IDとは画像をアップロードすると出力されるID

#### Qiita

全力でMarkDown。ただし画像サイズの指定が出来ない。

```
![](画像URL)
```

サイズ指定したい場合はHTMLで記述。

```html
<img src="画像URL" width=550 />
```

#### Zenn

さすが後発サービス。MarkDownを拡張して画像サイズ指定が可能。

```markdown
![](画像URL =550x)
```

### その他様々な記述がある

画像の埋め込み以外にも、ハイパーリンク、TwitterやYoutubeの埋め込み(埋め込めないものもあるのも判定)などがあります。

## コンパイラ作成

コンパイラを作成するわけですが、工夫したポイントをかいつまんで説明していきます。

### FrontMatterで記事情報を定義

[Zennで執筆](https://zenn.dev/ohbashunsuke/articles/20200917001-deploy-with-github)した時に学んだのですが、MarkDownファイルの先頭に上記のような`--`で囲んだ区画を作ります。この区画を**FrontMatter**と呼びます。

```yaml
---
title: "記事のタイトル"
emoji: "🍀"
type: "tech" # tech: 技術記事 / idea: アイデア
topics: []
published: false
filename: kijino-filename
---
```

ここにyaml形式でパラメータを設定して**コンパイラで読み取る**ようにします。
※だいぶZennの文法に引きづられております


### コンパイラはPythonで作成

各メディアのコンパイラは**粛々**と正規表現などを使って実装します。

#### はてなブログ画像表示記法の例

※以下の変数`line`にはオリジナルのMarkDownの各一行毎の文字列が格納されています

```python
# はてな記法のサイズ指定付き画像置き換え
match = re.match(r'\!\[.*\]\((http.*)\#\w([0-9]*)\)', line)
if match:
    img_url = match.group(1)
    width = match.group(2)
    result += '<img src={} width={} />\n'.format(img_url, width)
else:
    result += line
```

※Python選択理由は勉強したかったからで、特に理由は無いです

## まとめ

今回文章の発信を効率化するためのコンパイラを作ってみました。
自分としては無駄な事が多少減り、文章を書くのが楽しくなった気はします。


ただし、このアプリ(コンパイラ)がクソなのは人様に見せられるクオリティには至っていないことです。もう少し頑張って公開できるところまで持っていけたらとは思っています。