OmniAICreator/Qiita-1.07M huggingface dataset:
C#9.0 マイナーだけど有用な機能

ついに登場したC#9.0ですが、皆さんはもう使いこなしていますか？
9.0の目玉機能といえば、Record型やSource Generatorだと思います。ですが、ほかにも便利な機能が追加されたので個人的にいいなと思ったものをピックアップして紹介したいと思います！
[NEXT SCAPE Advent Calender](https://qiita.com/advent-calendar/2020/nextscape)の[14日目の記事](https://qiita.com/ryuichi111std/items/0b27d8996f01408f4564)でもC#9.0について紹介しているのでぜひ見てみて下さい。

##パターン マッチングの拡張機能
パターンマッチングの機能が強化されました。
中でも`not`はかなり使える場面が多いでしょう。

```C#
        void NotPattern(object x)
        {
            if (x is null) return; //C# 8.0まで
            if (x is not null) return; //C# 9.0からnotが使える！ 
        }
```
`and`や`or`も使えるようになりました。

```C#
        static void OrAndPattern(object x)
        {
            if (x is double or string) return;
            if (x is int and 1) Console.WriteLine("intの1");
        }
```
switch式と組み合わせて以下のように書けるようにもなりました。例があまりよくないですが、`and`や`or` 、`not`とも組み合わせることができます。

```C#
        static string Age(int age) => age switch
        {
            <= 12 => "小人",
            <= 18 => "中人",
            60 or 77 or 88 => "めでたい",
            >= 30 and < 40 and not 31 => "31歳以外の30代",
            _ => "大人"
        };
```
##ラムダ ディスカード パラメーター
ラムダ式を書くときにパラメーターを使わない場合がかなりあると思います。.NETのライブラリのイベントは大体`(object sender,EventArgs e)`で定義されていますしね。
**使わないという意図を明示して書きたい。**そんなあなたにいい機能が入りました。
パラメーター定義をすべてアンダースコアにすることで、未使用ではなく破棄されることになります。

```C#
        private static event EventHandler hogeevent;

        static void EventHandle()
        {
            hogeevent += (_, _) => //すべてのパラメーターを_にすることでラムダのスコープ内で使えなくなります。
            {
                Console.WriteLine("");
            };
        }
```
##静的匿名関数
最近のC#はパフォーマンス改善と、といかに状態を排除するコードを書けるようにするかにご執心です。個人的にはいいことだと思います。
LINQに渡すラムダ式等でラムダ式の外の変数を使おうとするとコピーが発生していました。

```C#
        static void StaticAnonymousFunction()
        {
            var p = 1; //定数のように利用する想定
            var data = Enumerable.Range(1, 10).Select(x => x * p).ToArray(); //pがヒープにコピーされる。
        }
```
以下のように、ラムダ式の直前に`static`をつけることで無駄にヒープを使うことを回避できます。

```C#
        static void StaticAnonymousFunction()
        {
            const int p = 1; //定数のように利用する想定
            var data = Enumerable.Range(1, 10).Select(static x => x * p).ToArray(); //ヒープアロケーションを回避
        }
```

ILを見ると上の例ではラムダ式と一緒に作られるクラスのフィールドに1をセットしているのがわかります。
下の例では単純に定数の1をスタックにプッシュするようになります。
パフォーマンスを気にしたい場合は検討してみましょう。

##最後に
.NET 5は長期サポートされません。お仕事で使う方は.NET 6への移行を視野に使いましょう。
自分も早くお仕事で使いたいな。
chrome拡張機能自作手順（作成→公開まで）

# はじめに

社内でChatWorkを使っているのですが、少しでも便利にできたらなと思い、chromeの拡張機能を自作しました。

本記事では以下の３つについて書きます

* 作成した拡張機能の説明
* chrome拡張機能の開発環境、開発手順
* chrome拡張機能のストアへの公開手順

# 何を作った？
### [これです。](https://chrome.google.com/webstore/detail/chatwork-quick-input/ijgidfcngbfcicilenkdngepclpkabom?hl=ja&authuser=1)

ChatWork用のchrome拡張機能です。
具体的にはリンク先の概要に書いてありますが、できることを箇条書きで書いてみます。

* 定型文を設定
* 定型文をボタン(*1)クリックで呼び出し
* キーボードショートカットにも登録できる

(*1)テキストエリア上の「TO」とかがある部分

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393930/8b23acdd-8100-4629-d5b4-39237ec36c73.png)

↑ボタン部分をHTMLで設定できるようにしてあるので、見た目の自由度が高くていい感じです！

# 実装手順

chatWork用の拡張機能はすでにいくつか公開されており、その中でライセンスがMITのものがあったのでそれをもとに作成しました。
https://github.com/YukiAsano/CW_QuickInfoInput

## 使用技術

* Chrome-Javascript-API
* Svelte
* sass
* webpack

## 実装！

chrome拡張機能はすべて**manifest.json**というファイルから始まります。
このファイルに

* バージョン
* 拡張機能の名前、概要
* アイコン画像の設定（16×16, 48×48, 128×128の3サイズ用意しないといけない、これがめんどくさい！ ）
* 設定画面のパス
* いつ、どのタイミングでjsが実行されるか

等設定します。

実際の**manifest.json**のソースがこちら

```manifest.json
{
    "name": "ChatWork Quick Input",
    "version": "0.2",
    "manifest_version": 2,　//最近3が発表されたらしい
    "description": "ChatWorkのテキスト入力をサポートする拡張機能",
    "permissions": ["storage"], //使用するChrome-Javascript-APIによって権限をリクエストする必要がある
    "content_security_policy": "script-src 'self'; object-src 'self'",
    "icons": {
        "16" : "images/icon_16.png",
        "48" : "images/icon_48.png",
        "128": "images/icon_128.png"
    },
    "content_scripts": [{　// chatworkページ上で実行されるjsの設定
        "matches": ["*://*.chatwork.com/*","*://chatwork.com/*","*://kcw.kddi.ne.jp/*"],
        "js": ["scripts/jquery-3.5.1.min.js", "scripts/core.js"],
        "run_at": "document_end",
        "all_frames": true
    }],
    "options_page":"pages/public/index.html"　// 設定画面
}

```

あとは実装するだけ！

# 公開手順

[公式の公開手順](https://developer.chrome.com/docs/webstore/publish/)に従って公開しました

大まかに以下の流れで公開します。

1. 拡張機能のzipファイルを作成
2. デベロッパーアカウントを作成
3. zipファイルをアップロード
4. ストアでの説明を記述
5. 申請→承認
5. 公開！

## ソース
https://github.com/SHNakajima/CW_QuickInput

# 参考
https://developer.chrome.com/docs/webstore/publish/
curlコマンドでDatabricksのJobをコールする

こんにちは、ちゅらデータshinyashikiです。
この記事は [ちゅらデータアドベントカレンダー](https://qiita.com/advent-calendar/2020/churadata) 21日目の記事となります。


#やりたいこと
Databricksでは作成したジョブをREST APIでコールすることができます。
https://docs.databricks.com/dev-tools/api/latest/jobs.html

今回は、curlコマンドを使ってジョブ`MyJob(job_id:12345)`をREST APIでコールしてみます。
なお、`MyJob`は`MyNotebook`をコールしていて、`MyNotebook`は渡ってきたパラメータをprintしています。
↓こんな感じですね。

```python:MyNotebook
dbutils.widgets.text("param1", "val1")
dbutils.widgets.text("param2", "val2")

param1 = getArgument("param1")
param2 = getArgument("param2")

print('param1={0}, param2={1}'.format(param1, param2))  
```

#アクセストークンの発行
REST APIでジョブをコールする際に、アカウント名とパスワードを指定してリクエストすることもできますが、アクセストークンを使うことが推奨されています。
https://docs.databricks.com/dev-tools/api/latest/authentication.html#use-a-personal-access-token-to-access-the-databricks-rest-api


#ジョブの実行

- APIエンドポイント
`POST http://<databricks-instance>/api/2.0/jobs/run-now`

- リクエストヘッダ
`-H 'Authorization: Bearer <発行したアクセストークン>'`

- リクエストボディ
`{"job_id":<ジョブID>, "notebook_params":{Notebookに渡すパラメータ（keyと値のペア）}}`

早速実行してみます。
リクエストヘッダに発行したアクセストークンを設定し、リクエストボディにJobからNotebookへ渡すパラメータを指定することで、curlコマンドでJobをコールすることができます。

```shell
curl 
-H POST 'http://<databricks-instance>/api/2.0/jobs/run-now' 
-H 'Content-Type: application/json;charset=utf-8' 
-d '{"job_id":12345,
  "notebook_params": {
    "param1":"val111",
    "param2":"val222"}
  }' 
-H 'Authorization: Bearer <発行したアクセストークン>'
```

#おわりに
こんな感じで作成したJobとNotebookの疎通確認は、あっさりと行うことができます。
ざっくりとした内容ですが、こちらからは以上です。
Clojureの剰余を求める関数、remとmodの違い

# はじめに

FizzBuzzの実装のため、色々とリファレンスや技術記事を調べ、読み込んでいったのですが、
剰余を求める関数が『rem』『mod』と複数存在していることを知り、その違いについて戸惑ってしまいました。

今回は、これら2つの関数の違いについて調べたことを書きます。

# remとmodの違いとは

結論から先に述べます。

remとmodでは、剰余の正負の符号決定のされ方が異なっており、
**remでは被除数、modでは除数と同じ符号となるように剰余が計算されます。**

## そもそも負の数が割り算にでてくるってどういうこと？

"そもそも負の数を割る、負の数で割るってなんなんだ！" という方は、
下記サイトが参考になりましたので、ぜひ御覧ください。
私も数学に明るくないため、今回FizzBuzzを実装するまで知りませんでした。

[負の数の割り算と余り　～整数と余りの問題【数学まるかじり】](https://naop.jp/topics/topics46.html)


## remとmodで、挙動が同じ（ように見える）とき

"なんか適当に、かんたんな割り算の式を頭に思い浮かべてみてよ！"と言われたら、
皆さんはどんなものを想像しますか？

私なら、`30 ÷ 3 = 10`とか、
あるいは剰余の話をさきほど行ったので、`30 ÷ 4 = 7 余り2`
のようなものを想像します。

このような`正の数 ÷ 正の数`の場合、remとmodでは挙動に違いが見えません。

```clojure
user=> (rem 30 4) ;; 被除数である30に依存し、剰余の符号は正となる
2
user=> (mod 30 4) ;; 除数である4に依存し、剰余の符号は正となる
2
```

## remとmodで、異なる結果となるとき

remとmodの挙動の違いが見えてくるのは、
被除数（割られる数）や除数（割る数）に負の数が入るときです。

rem, modは同じ剰余を求める関数ではあるものの、
前述のように、**remでは被除数、modでは除数との符号と一致するように、それぞれ剰余が決定されます。**

そのため、`正の数÷負の数`や`負の数÷正の数`のケースでは、remとmodはそれぞれ異なる結果を示すこととなります。

下記に具体的な例として、
`(-10) ÷ 3`と`10 ÷ (-3)`のremとmodでの挙動の違いについて示します。


```clojure
user=> (rem -10 3) ;; 剰余の符号は被除数である-10に依存し、負となる
-1
user=> (mod -10 3) ;; 剰余の符号は除数である3に依存し、正となる
2
user=> (rem 10 -3) ;; 剰余の符号は被除数である10に依存し、正となる
1
user=> (mod 10 -3) ;; 剰余の符号は除数である-3に依存し、負となる
-2

```

その他の様々な具体例は、[#参考](#参考)に示した ClojureDocs というサイトにたくさんまとまっていますので、
参照していただけたらと思います。


# 参考
- [負の数の割り算と余り　～整数と余りの問題【数学まるかじり】](https://naop.jp/topics/topics46.html)
- [rem - clojure.core | ClojureDocs - Community-Powered Clojure Documentation and Examples](https://clojuredocs.org/clojure.core/rem)
- [mod - clojure.core | ClojureDocs - Community-Powered Clojure Documentation and Examples](https://clojuredocs.org/clojure.core/mod)
javasript, jquery（テーブルタグ）

### ①html、 javasriptのツールの開発
　→オンラインツールを使えるため、ツールのダウンロードが不要です。
　　　https://jsfiddle.net/

![スクリーンショット 2020-12-21 10.23.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965456/f1eea67f-b1b5-cb0e-569d-d28db2bae1f8.png)


### ②HTML分にHTMLソースを追加してから、実行する
```html
<html>

  <head>
    <title>Hoge</title>
  </head>

  <body id="main-id">

    <table>
      <tr>
        <td>hoge</td>
      </tr>
    </table>

  </body>

</html>
```
イメージ
![スクリーンショット 2020-12-21 10.40.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965456/76c47653-61ef-50c9-a8d7-890355d16b06.png)

### ③HTMLのかわり、JQUERY(OOP)でページを表示する

　①HTMLのTABLEがJQUERYのTABLEに変換する
　②HTMLのTRがJQUERYのTRに変換する
　③HTMLのTDがJQUERYのTDに変換する

```javascript

//マインオブジェクト
var $main  = $("#main-id");

//オブジェクトに変換する
var $table = $("<table>");              //テーブルオブジェクト
var $tr    = $("<tr>");                //行オブジェクト
var $td    = $("<td>") .html("hoge");  //カラムオブジェクト

//親オブジェクトに子オブジェクトを追加
$tr.append($td);
$table.append($tr);
$main.append($table);
```
イメージ
![スクリーンショット 2020-12-21 10.59.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965456/c84decdd-9fae-2029-2819-08318f3d6bf2.png)

### ④実行した後、HTMLの表示の結果と同じ
![スクリーンショット 2020-12-21 11.08.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965456/5c76e4e4-9370-b882-0683-a51da84baaed.png)


### ⑤JQUERY(OOP)のclickのメソッド
```javascript

var $table = $("<table>"); //テーブルオブジェクト
$table.click(function() {
    //todo
});

var $tr    = $("<tr>"); //行オブジェクト
$tr.click(function() {
    //todo
});

var $td    = $("<td>") .html("hoge"); //カラムオブジェクト
$td.click(function() {
    //todo
});
```

以上
前年に引き続き、toioコミュニティのこれまでとこれからについて

### 前年に引き続き、toioコミュニティのこれまでとこれからについて

これは[「toio™(ロボットトイ | toio（トイオ）) Advent Calendar 2020」](https://qiita.com/advent-calendar/2020/toiotomo)最終日の記事になります。

#### まずはじめに

toio™(ロボットトイ | toio（トイオ）) Advent Calendar 2020の投稿が、全て埋まりました、、執筆者の皆さん本当にお疲れ様でした。昨年に引き続き運営の勢いで立ち上げてしまいすみません。今年はUnityとの連携や公式のキャンペーンもあり多くその辺りのノウハウがまとまった気がします。

#### toio™で作ってみた！友の会（非公式）についての紹介

”（非公式）”と書いてある通り、完全に趣味のメンバーで構成され…構成されっ…?うん。構成されており？いや（笑）toioの可能性にチャレンジしていく集まりでございます。コミュニティルールを守り、toioに興味がある方であれば、どなたでも参加が可能です。投稿をずっと見る参加スタイルも全然構いません。まもなく200名に突破する形で、入会時簡単な質問を設けるようにしております。どうしてもオープンにしていると、前澤氏の動画で溢れてしまったり、怪しい方が出て止めるのに時間を使ってしまうので、、なのでもし何度か申請しているけど入れない人がいましたら連絡ください、もしくは質問にその旨を書いていただければ幸いです。

toio™で作ってみた！友の会（非公式）
https://www.facebook.com/groups/toiotomo/

#### ゆるい"運営体制

あえて昨年と同じ内容を書きますｗ **ゆるい**という言葉は人によって誤解も生みそうなので、少し補足すると、”作りかけ”、”役に立たない”みたいなものづくりを当たり前に推奨してます。ものづくり界隈の皆さんにあえて言うまでもないですが（笑）何かしらやりたいことにチャレンジしたり、思いついた事をやってみて共有しよう！みたいな場所で、オンラインでもリアルでも細々と続けていければと思っております。LT会を過去数回行ってきまして、参加した方であればその居心地は分かってくれると思うのですが、どなたでも、そんなにハードルを感じず楽しめるような運営体制です。たまに運営で至らない点（バグ）が起きますが、温かい心で見逃してもらえると助かります。（反省）

イベントの連絡の通知が欲しい方は下記フォローいただけますと幸いです。

なお、過去の様子は #toiotomo でTwitterを見てもらえると良いかなと思います(^^)

https://toiotomo.connpass.com/

#### イベント出展について

##### 過去出展したもの

- [Tsukuba Mini Maker Faire 2020](https://tmmf.jp/2020/)

- [Maker Faire Tokyo 2020](https://makezine.jp/event/mft2020/)

##### 今後出展エントリー予定なもの

- [Maker Faire Kyoto 2021](https://makezine.jp/blog/category/maker-faire)

**Maker Faire Kyoto 2021**
日時：2021年5月1日（土）12:00-17:00（予定）
2021年5月2日（日）10:00-16:00（予定）
会場：けいはんなオープンイノベーションセンター（KICK）
京都府木津川市木津川台9丁目6番地、京都府相楽郡精華町精華台7丁目5番地1

上記に一応エントリーを予定しております。決定しましたらお知らせします・・・Unityの事例も展示の機会作ってぜひ色々な人に見てもらいたいものです。


※上記以外にこれ出れそうですよ！みたいなものがあればFacebookグループにてお知らせいただけますと幸いです(^^)

来年は2021年。コロナの状況も気になる所で、ワークショップや展示もさらなる工夫が必要になる年になりますが我々もハックしながら面白い仕掛けを1つでも、2つでも多く出せていければと思います。

来年もよろしくお願いいたします。それではよいお年を!!!
（UE4）マウスの移動量がクリックし続けていないと取得できない

##◇問題
![スクリーンショット 2020-12-21 11.23.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939279/11375769-578e-f4da-5aa2-de2f9682e342.png)
玉転がしゲームを制作中。
ボールを転がす方法として、マウス操作でステージを縦横に傾けるノードを組む。
![スクリーンショット 2020-12-21 11.43.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939279/d5a17c7c-3652-94bd-dffa-6886bbccc71d.png)
想定ではマウスの移動のみで操作可能のはずが、実行したところ何故かクリックを押し続けている状態でしか操作できない。
##◇原因
自作したプレイヤーコントローラーの設定が原因らしかった。
![スクリーンショット 2020-12-21 11.01.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939279/627e52ac-b11b-e71e-326d-131f7dc36984.png)
Input内のMouseInterfaceにて。Show Mouse Cursor（ゲーム中にマウスカーソルを表示させる）にチェックが入っていると、何故か上記のような仕様になる。理屈は不明。
##◇解決法
Show Mouse Cursorのチェックを外して実行すると、クリックを要せずに想定通りマウスの移動だけで操作できたが、よく見直したらコントローラーを自作した意味が特になかった為、普通にデフォルトのPlayerControllerを設定しても同様に動作できた。
##＜感想＞
凝ったことをしない限り、モードとかコントローラーとか下手に自作しない方がいいなと思いました。
【FlutterWeb】キャッシュを明示的に更新する

[前回](https://qiita.com/fukusin/items/c5f5592b50101dfaea25)、Firebase HostingでWebアプリを公開する方法を紹介しましたが、コードを修正してもサイトに反映されないことがあると書きました。今回は、その対処法を紹介します。
もっと良い方法があったら、コメントで教えてください。

#原因
FlutterWebはPWAに対応しているため、Service Workerによってリソースがブラウザにキャッシュされます。一度訪れたページはオフラインでも表示できるというメリットがありますが、24時間以内はブラウザキャッシュが優先される仕様なので、開発時にハマるポイントになっています。
明示的にキャッシュを更新すればいいようです。

Service Workerの動作については、こちらが詳しいです。
[Service Worker スクリプトのインストールと更新処理](https://nhiroki.jp/2018/02/15/service-worker-install-and-update-scripts)

#明示的にキャッシュを更新する
onupdatefoundメソッドを使うことで、Service Workerの更新を確認できます。
Service Workerのスクリプトは、Flutterによってビルド時に毎回書き出し直されるので、Service Workerが更新された時はサイトが更新されたとみなして良さそうです。

次のコードでは、Service Workerに更新がある場合は更新を実行して、キャッシュを取得し直します。
flutterのwebフォルダに作成された index.html を下記のように書き換えます。

```index.html
  <script>
    if ('serviceWorker' in navigator) {
      window.addEventListener('flutter-first-frame', function () {
        navigator.serviceWorker.register('flutter_service_worker.js').then(registration => {
          //登録成功
          registration.onupdatefound = function () {
            console.log('Update found');
            registration.update();
          }
        })
          .catch(err => {
            //登録失敗
          });
      });
    }
  </script>
```
##参考
[PWAにおけるキャッシュの更新方法](https://blog.htmlhifive.com/2018/08/27/pwa-cache-update/)
PrettierとESLintの設定ファイルを.vscodeフォルダに入れて適用させる方法

#そもそも.vscodeフォルダとは何？
.vscodeフォルダの中には、vscodeの設定をするファイルがあります。

[.vscodeディレクトリは何の役割があるの？](https://qiita.com/kokogento/items/9791cdc3aef309fbbed4)
:point_up:詳しくは上記の記事を参考にしてみてください。

#PrettierとESLintの設定ファイルを.vscodeフォルダにまとめたい！
`.prettierrc`と`.eslintrc.js`を.vscodeフォルダに入れると、設定が一切効かなくなってしまいました。。。
![スクリーンショット 2020-12-21 11.21.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/c3e162d5-5958-548d-698b-355f83aed47a.png)
上記のような構成で設定ファイルを有効化するにはどうするか？

vscodeの設定ファイルである`.vscode/settings.json`をこのように編集しましょう。

```json:.vscode/settings.json
{
    "editor.formatOnSave": true,
    "editor.codeActionsOnSave": {
      "source.fixAll.eslint": true
    },
    "eslint.options": {
      "extensions": [".js", ".vue"],
	"configFile": ".vscode/.eslintrc.js",
    },
}
```

`"configFile": ".vscode/.eslintrc.js",`の部分を追加すると、PrettierとESLintが有効になりました。
PyYAMLでYAMLに埋め込まれた環境変数をロード時に展開する

この記事は[Python3 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/python3)の20日目の記事です。

# はじめに

コンテナなどを使っているとYAMLファイルに環境変数を埋め込んでロード時に展開したくなることがあります。PyYAMLで環境変数の展開を行なうには以下のようなコードで実現できます。

```python
import os
import re

import yaml

ENV_PATTERN = re.compile(r'\$\{(.*)\}')
ENV_TAG = '!env_var'

yaml.add_implicit_resolver(ENV_TAG, ENV_PATTERN, None, yaml.SafeLoader)

def env_var_constructor(loader, node):
    value = loader.construct_scalar(node)

    matched = ENV_PATTERN.match(value)
    if matched is None:
        return value
    proto = matched.group(1)

    default = None
    if len(proto.split(':')) > 1:
        env_key, default = proto.split(':')
    else:
        env_key = proto
    env_val = os.environ[env_key] if env_key in os.environ else default 

    return env_val

yaml.add_constructor(ENV_TAG, env_var_constructor, yaml.SafeLoader)
```

上記のコードを実行した状態でSafeLoaderを使うとロード時に環境変数を展開してくれるようになります。

```python
example = """
a: ${EXAMPLE_A:default}
b: ${EXAMPLE_B:default}
"""
os.environ["EXAMPLE_A"]="from_env"
print(yaml.safe_load(example))
```

結果

```python
{'a': 'from_env', 'b': 'default'}
```

環境変数を設定している場合はロードしてくれて、そうでない場合はデフォルト値が設定されています。

# 解説

## add_implicit_resolverについて

`add_implicit_resolver` はYAMLの特定の値に対してタグを暗黙的に付与する設定です。

https://pyyaml.docsforge.com/master/api/yaml/add_implicit_resolver/

YAMLにはキーと値以外にもタグという値の型を明示的に示す文法があります。
`add_implicit_resolver` を使って環境変数のパターン(`\$\{(.*)\}`)にマッチする値に暗黙的に環境変数用のタグ(`!env_var`)を付与する設定をSafeLoaderに設定しています。

つまり例で上げたexampleというYAMLファイルは、add_implicit_resolverによって以下のような状態になります。

```yaml
a: !env_var ${EXAMPLE_A:default}
b: !env_var ${EXAMPLE_B:default}
```

これによって環境変数の値に対してカスタムコンストラクタを適用できる状態になります。

## add_constructorについて

`add_constructorについて` は特定のタグのついた値に対してカスタムコンストラクタを設定する関数です。

関数`env_var_constructor`はカスタムコンストラクタの実装になっており、`${環境変数名:デフォルト値}`の文字列を正規表現マッチさせて、パースし、実際に環境変数を解決して値を返す実装になっています。

この関数を`!env_var`のタグに対してマッピングすることで、例で上げたYAMLファイルは、最終的に環境変数が展開され以下のような状態として値が返ります。


```yaml
a: from_env
b: default
```

# 参考

- https://pyyaml.docsforge.com/
- https://stackoverflow.com/questions/52412297/how-to-replace-environment-variable-value-in-yaml-file-to-be-parsed-using-python
- https://github.com/elastic/curator
リモートワーク環境でのチームマネジメントについて

# リモートワーク環境でのチームマネジメントについて
こんにちは、株式会社オールアバウト 開発部の@moggyです。
この記事は、All About Group（株式会社オールアバウト） Advent Calendar 2020 21日目の記事となっております。

# はじめに
新型コロナウイルスの流行により、これまでとは異なる環境での働き方を余儀なくされている方も多いかと思います。私自身もその中の一人であり、2020/02から現在までフルリモートでの業務に完全にシフトしています。日々の業務を通じて環境の変化により様々な問題が起きていると感じており、その中でもコミュニケーションやマネジメントといった点で悩みました。私と同じ悩みを持つ方もいらっしゃるかと思います。

本記事は以下のような悩みを抱えている方を対象に、少しでも参考になればと思い執筆しました。

- リモートワークでチーム開発している方（マネージャー、メンバーどちらでも）
    - メンバーのメンタルが把握できていない
    - チームとしての開発スピードが下がっているまたは上がらない
    - コミュニケーションに不安を感じている

内容は全て私自身の普段の取り組みを元にしているため、間違っていたり納得できない部分もあるかと思いますが、ご容赦ください。


# ペアプロ、モブプロの導入
### なぜ導入したのか
在宅勤務に切り替わる前から、現在のチームにおいてはペアプロやモブプロについては導入していましたが、在宅勤務を機にほぼ全ての開発業務をペアプロ、モブプロとしました。理由として、一番に挙げられるのは「チーム内コミュニケーションの活性化」です。在宅勤務になり、基本的に人との会話数は激減していると考えています。作業に集中できる時間が増えたと感じる面もありましたが、レビュー工数などを考えるとトータルでは開発に時間がかかる状況になっていました。上記の問題を解消するため、単純作業（コピペレベル）以外は基本的にペア、モブプロで作業を行いチームとしての認識統一、レビュー工数の削減を目指しました。

### 結果
チームとしての認識の共通化やコミュニケーションについては意図した通り行える環境ができているかと思います。
2-3年目の若手から10年以上のベテランまで、お互いに実装について言いたいことが言い合える環境になり、誰かが何かを知らない状態だったり、一人で困っているという状況がなくなり、心理的な安全性は非常に高い環境になっています。

### 新たな課題
現在のチームが新規開発のプロジェクトということもあり、今後人員を拡大していく計画です。中途入社や業務委託、オフショアの検討などこれまでのように少人数のペアプロ、モブプロでは解消できない問題が起き始めているので、こちらへの取り組みは継続して考える必要があります。


# スケジュール表の作成、工数見積もりと実績の記入
### なぜ導入したのか
現在のチームでは２週間を１回のスプリントとする開発体制で開発を行っています。プランニングの際には２週間分の作業できる時間を把握し、適切な仕事量を決定する必要がありました。工数見積もりについては特にやり方を決めたわけではなかったですが、チーム内で検討していくにつれて自然と「プランニングポーカー」に近い形で見積もりが行われるようになりました。チーム内の各メンバーが作業できる時間を適切に把握できていないとせっかくの精緻に見積もっていたとしても計画が崩れることになります。私のチームでは現在以下のようなスプレッドシートで各メンバーの２週間分の予定を把握しています。
![スクリーンショット 2020-12-21 10.23.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314190/ba4a3eff-1abc-0b1f-7bc5-67cb4658d8ad.png)
前スプリントの最終日、次のスプリントの各個人の予定が大体決まったタイミングで上記の雛形からぞれぞれのmtgや予定を入れ込み、スプリント内で稼働できる時間を予め算出しておきます。
![スクリーンショット 2020-12-21 10.24.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314190/7ceaa843-a566-2f62-5fc9-169d00bcbccc.png)

上記で決定した時間を元にスプリント内で実現可能な範囲を決定し、常に仕事量が一定の水準で調整されている環境を目指しています。

### 結果
初めのうちはチーム内での見積もり精度の問題で、作業が遅れてしまったり逆に巻き過ぎてしまうなどの問題もありましたが、見積もりに対しての結果を常に記載するようにしてからはこちらの問題も改善されつつあります。

### 新たな課題
個人的にスプレッドシードでの管理に限界を感じるところもあるので、何か良い方法がないかと常に探している状態です。
また、ペアプロやモブプロができない時間帯も存在するので、ここの部分がより有効に使えるような方法がないかと日々モヤモヤしています。（現状はレビューや別作業の時間として割り振っています）

# 週１振り返り＆毎日の夕会実施
### なぜ導入したのか
チーム開発をする中で振り返りを実施するのはチームをより良い状態にするために必須な工程かと思います。我々のチームでは基本的に週1回、「KPT」と「モチベーショングラフ」を用いて振り返りを実施していました。振り返りを続けていく中で、月曜に行ったことを金曜日まで詳細に覚えているメンバーがいないなー、月曜日どんな気持ちで仕事していたか忘れた、というような意見がチームメンバーほぼ全員から上がるようになりました。それからは毎日仕事終わりの10分間に夕会という形でその日のモチベーション、keepとproblemの記入を行うようになりました。

### 結果
週１回の振り返りの内容が、毎日の積み重ねのおかげで精緻に行えるようになりました。次へのtryの質も向上し、振り返りの役割をより果たせていると感じています。また、毎日夕会することにより、メンバーのメンタル面の問題なども素早くキャッチアップできるようになり、フォローがしやすい状態になっています。

### 新たな課題
こちらも要員が増えるにつれて今の会議体では収まらなくなって来ることが今後の懸念です。

# 最後に
モチベーションやコミュニケーションにフォーカスした内容になりましたが、私自身これらが充実していないとチームとして最大限のパフォーマンスを出すことは難しいと考えています。
今回の記事でどれか一つでも試してみようと思えたことがあれば幸いです。
[解決] Rails6 Webpacker::Manifest::MissingEntryError

[webpackerとは]
(https://kazumawada.hateblo.jp/entry/2021/03/07/Rails%E3%81%ABJS%E3%82%92%E6%9B%B8%E3%81%8F%E5%89%8D%E3%81%AB%E3%80%81yarn%2C_npm%2C_webpack%2C_webpacker%2C_ES6%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B%E3%80%82)

## 方法
cloneするたびに毎回起こるエラー。解決したい。


>yarn ないし npm はruby でいうところのbundlerで、ライブラリを管理してくれるnodejsのツールのこと。
bundle installしないと ruby のライブラリが利用できないのと同じようにyarn installを実行しないと、 package.json によって指定されている nodejs ライブラリがダウンロードされず実行できないらしい。
webpack はnodejs のライブラリやから、このエラーを解消するためにはyarn install を bundle install と同じような取り扱いで実行する必要があるらしい。


https://qiita.com/ashketcham/items/48d64e960d436f8b6f78

```
 $  docker-compose run --rm web yarn install 
                                or
                                yarn upgrade
```

これでエラーが出なくなりました。
Windows 10 20H2 記憶域の移行メモ(体験記)

# 概要
- Windows Server 2012R2(Win2012R2)で利用していた記憶域(Storage Space) を Windows 10(20H2) に移行しました。その時の体験談です。

# 環境
- (移行前）Windows Server 2012R2(Win2012R2)
- (移行後) Windows 10 20H2 Pro
    - 後述する理由により Windows 10 Pro for Workstations(Win10P4WS) にアップグレード

# 移行理由
- PCが古くなってきた・OSのサポート切れが近づいていてきたので移行を決意。
- Server OS を購入しようとしたけど高いので断念。Home Server あればよかったのに。

# 利用用途
- ファイルサーバ

# 入れ替え手順
- 昔はServer OSからハードドライブを付け替えても認識しなかったが、普通にマウントした。

# 構成
- ハードドライブ 6TB を 5枚 挿入
![記憶域.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94366/bf715239-b8ca-8e47-2e24-2d780f7ed2b9.png)

# ReFS への移行
- 「あとで仮想ディスク増やせばいいや」と思っていてせっかくの機会なので仮想ディスクを拡張しようとしたら、16TB を超えるとエラーが発生した。
- NTFSフォーマットで仮想ディスクを作ると、仮想ディスクの限界点は 16 TBになる模様 (https://phst.hateblo.jp/entry/2019/12/08/000000)
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94366/8c11d4eb-55dc-1605-9ff2-1daccad5a1a6.png)

## Windows 10 Pro For WS へのアップグレード
- 解決策としては ReFS へのフォーマットが必要になった。Windows 10 Pro には ReFS をフォーマットする機能が外されたので、WSアップグレードをマイクロソフトストアからダウンロード。OSの再起動は不要。
    - 逃げ道として Windows Server や古いWindows 10 ではReFSにフォーマットできるので、それを20H2にマウントする技もあるようだが、「非推奨」になっており将来的に削除される可能性がある。マイクロソフト語の「非推奨」は削除予定リストという意味なので
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94366/115885e9-b624-9e8f-3ad8-3971ad3ca711.png)

- アップグレード後は無事にフォーマットを [ReFS] を選択できるようになる
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94366/7c45d315-72b9-aa91-0089-9d633e5fdec9.png)

# データ移行
- データ移行はNTFS仮想ディスクとReFS仮想ディスクをファイルベースでコピーした。

## 注意点
- ReFS仮想ディスクの物理領域が足りなくなったときに、両方の仮想ディスクがオフラインになってしまった。なので、移行時は注意。

# 性能
- ファイルサーバ用途なので、パリティ（RAID5相当）で性能調査。RAID5なので読み込みはソコソコいい。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94366/43d9611e-82c0-1992-8719-4fad63670e5f.png)

# 比較
- 移行前のディスク性能（パリティ・NTFS）。ReFSのほうが若干性能がいい？
![hiryu-party4DISC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94366/a6b6823f-b82a-f197-bef2-daa6f865950c.png)

- 参考：移行前のディスク性能（シンプル・NTFS）。書き込み性能を重視するならシンプル（冗長化なし）。ただし、ディスクが1つでも壊れると復旧不可になるのでおすすめはしない。
![HIRYU-SIMPLE-DISC4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94366/e4802893-516f-beb2-c774-3888d07408c8.png)

# 最後に
- NASつくるならLinux・・という話もありますが、ソフトウェアRAIDがあるのでWindowsが便利です。RAIDカードは地味に高いので。
Laravel,Graghql,phpunitでテストする。

##/tests/TestCase.phpに下記を追加

```tests/TestCase.php
<?php

namespace Tests;

use Nuwave\Lighthouse\Testing\MakesGraphQLRequests; // 追加
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

abstract class TestCase extends BaseTestCase
{
    use CreatesApplication;
    use MakesGraphQLRequests; // 追加
}

```

##phpunit.xmlに下記を追加

```phpunit.xml
    <testsuites>
        <testsuite name="Unit">
            <directory suffix="Test.php">./tests/Unit</directory>
        </testsuite>
        <testsuite name="Feature">
            <directory suffix="Test.php">./tests/Feature</directory>
        </testsuite>

       <!--  下記の三行を追加 -->
        <testsuite name="Graghql">
            <directory suffix="Test.php">./tests/Graghql</directory>
        </testsuite>
    </testsuites>

```

## 上記でtests/Graghqlの中を見るようになります。

```tests/Graghql/UserTest.php

    <?php

namespace Tests\Unit;

use Tests\TestCase;
use App\Models\User;

class UserTest extends TestCase
{
    /**
     * A basic unit test example.
     *
     * @return void
     */
    public function test_loginUser()
    {
        $res = $this->graphQL(/** @lang GraphQL */ '
            query(
                $user_name: String!
                $password: String!
                ){
                loginUser(
                    user_name: $user_name
                    password: $password
                ) {
                    result
                }
            }
          ', [
                'user_name' => 'テストユーザー',
                'password' => 'testpassword'
              ]
          );
        $res->assertStatus(200);
    }
}


```
【Laravel】500エラーページに飛ばす

#概要
Laravelで500エラーページに強制的に飛ばす方法をメモ。

結論を言うと、コントローラーで1行書くだけでページに飛ばす事ができる。


```php
abort(500);
```
こちらを記述すると下記のようなページに飛ぶ。
![te.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526290/347efdbf-ae23-0303-673a-72896d8a4ac9.png)

#使用例
例えばAuth::user()などで、ログイン中のユーザーから値を取る際、ログイン中のユーザーが管理者の権限で削除されたり、存在しない状態となった場合、WEBアプリが開発者用のエラーを吐いてしまう。

これを防止するために、コントローラーのメソッドの先頭にabort(500);を利用する。

```php
// ユーザー情報が存在するか確認
        if (empty(Auth::user()->id)) {
            abort(500);
        }
```


これでユーザー情報が存在しない場合、500ページに飛ばす事ができる。
ちなみにabort(404);などで他のエラーページを表示する事も可能。

```php
abort(404);
```

jsonの中に入れることもできる。

```php
return response()->json(['message' => 'error'], 500);
```
VScodeでcode runner使ってたらlinker command failed with exit code 1って言われた話(C/C++)

VScodeでC/C++の環境構築したら思わぬところでハマった話です

#MacにVScodeでC/C++書く環境構築する
まずどういう環境構築しようとしたかというお話

わかりやすかったのでこの記事を参考に環境構築しました
[Visual studio codeで競プロ環境構築[mac OS]](https://qiita.com/EngTks/items/ffa2a7b4d264e7a052c6)

流れとしては
・Macにgccインストール
・（VScodeにC/C++の拡張機能,code runnerを入れる)
・code runnerの設定をしてあげる
といった感じです

ここまではすんなりOK

#何にハマった？
いろいろやり始めて自作の関数作って複数ファイルにコードを分割したとき起こりました
run codeするとlinker command failed with exit code 1と言われてうまく実行されない。
どうやらmainではない別ファイル.cが呼び出されてないことが原因っぽい

ここからtasks.jsonだ-launch.jsonだーとかいろいろいじくり回したんだけどどーもうまくいかない。
それもそのはず。
run codeはcode runnerの内部処理でコンパイルされているからでした

#どうやって解消した？
実を言うと最初の参考URLにほぼ答えが載ってたんですが気づかなかったー
いろいろ探してこのページを見て答えにたどり着きました
[Visual Studio Code Mac 開発環境構築[C++]](https://westhillworker.com/visualstudiocode-cpp/#Code_Runner)

code runnerのconfigurationにもしっかり書いてあるのですが
code runnerではrun codeしたときの動作が言語ごとにしっかり決まっちゃってるんですね。
![スクリーンショット 2020-12-21 10.31.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/56c68a25-9f9d-3e0a-b17e-9dc60a89421c.png)
cの場合これが実行されちゃう

```
cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt
```
目的のディレクトリに移動→runcodeしたファイルをコンパイルしてそのファイル名の実行ファイルを生成→プログラム実行
と言う流れです。
コンパイルするところを複数ファイルコンパイルしてくれるように書き換えねば！というわけです

■code runnerのページの上部，歯車マークを押してExtension settingsを選ぶ
![スクリーンショット 2020-12-21 10.48.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/75dbc333-0bb2-e5e8-0074-085f4ad5e29b.png)

■code-runner: Executor MapのEdit in settings.jsonを選ぶ
![スクリーンショット 2020-12-21 10.50.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/960f3910-b656-d1c8-4b48-8917f54dc404.png)

■目的フォルダ内の全部の.c,.cppプログラムを実行してくれるように書き換える
![スクリーンショット 2020-12-21 10.54.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/cea481b1-276e-732e-f9d4-908c201b475a.png)
元々 g++ $fileName　となっていたものを　g++ *.cppと書き換えて目的フォルダ内の全ての.cpp(もしくはc)のファイルをコンパイルしてくれるようにしちゃいます

これでOK

#おわりに
おかげさまでcode runnerいれない場合のコンパイルの設定方法にも詳しくなってしまいましたとさ
おしまい
JavaでHashMapの初期化

> Map<String,String> paramMap = new HashMap<>();

csvから番号のリストを読み込んで、その中からユニークなものだけに対して次の処理にすすませたいときにHashMapを使おうとしたが、、

> Map<String, String> paramMap = null;
> while((record = reader.readNext()) != null){
> if(paramMap.get(record[0]) != null {
> continue;
> }
> paramMap.put(record[0],record[0]);
> 次の処理
> }

とすると、paramMap.getの部分でnullpointer.exceptionでエラーが発生します
対処はわかると簡単で

> Map<String, String> paramMap = null;

これではpramMapが初期化できておらず、呼び出すとnull参照が起きてしまうので
ここを
> Map<String,String> paramMap = new HashMap<>();

とすると正常に動作します

他にユニークなレコードのうまい取り出し方があればおしえていただけたら嬉しいです^_^
【Python】エクセルファイルをとにかく結合したい（pandas.merge）

# エクセルファイルを結合する
ExcelとかCSVとかをそれぞれの特定の列を基準に結合・連結したいときによくつかった流れを関数にした。

流れとしては

1. pandas.DataFrameとして結合したい２つのExcelファイルを読み込む
2. pandas.merge( )で結合
3. 結合されたデータをExcelファイルとして保存
4. 結合されたデータを返す

以下に引数の概要ととコードをのせておく。

|variable|explaination|
|-------|:------|
|a|結合したいファイルで左におきたいやつ|
|b|結合したいファイルで右におきたいやつ|
|left_on|aの基準にしたい列の列名|
|right_on|bの基準にしたい列の列名|
|how|inner：共通するものだけ残して結合<br>left：aは絶対残って、bのうち共通するものだけ残す<br>right：bは絶対残って、aのうち共通するものだけ残す<br>outer：全部残す|
|where_name|結合したファイルの保存先の絶対パス|

```python:in
import pandas as pd
def merge_2Excelfiles(a,b,left_on,right_on,how,where_name):
    df_a = pd.read_excel(a)
    df_b = pd.read_excel(b)
    c = pd.merge(df_a, df_b, left_on=left_on, right_on=right_on, how=how,)
    c.to_excel(where_name)
    return c
```
プログラミング言語やツールのアイコン集「Devicon」のススメ

# この記事について
この記事は、[aslead Agile](https://aslead.nri.co.jp/solution/aslead_agile.html)の開発チーム「[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu)」にて行っているアウトプット企画である
「[チーム「オキザリス」Advent Calendar](https://qiita.com/advent-calendar/2020/oxalis)」の21日目の記事です。


# 言語やツールのアイコンを使いたい！
勉強会や学会の資料、ポートフォリオサイトのスキル紹介などなど...
プログラミング言語やフレームワーク、ツールのアイコンを入れたい場面って結構あると思います。
そんな時に、学生の頃に友人に教えてもらった [Devicon](https://devicon.dev/) がかなり役に立ってくれているので、ご紹介しようと思います。

# [Devicon](https://devicon.dev/)

![Screenshot 2020-12-21 0.30.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696809/5f45a344-4035-cdce-b942-1564a4adbc18.png)

Deviconはプログラミング言語やフレームワーク、各種エディタやブラウザ等のツールのアイコン集です。
アイコンはMITライセンスで公開されています。[^1]

アイコンには複数バージョンが用意されていて、オリジナルのデザインのものだけでなく、
線画バージョン、モノクロバージョン、言語やツールの名前入りバージョンなんかも用意されています。

![Screenshot 2020-12-21 1.06.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696809/12083baf-4757-b687-8824-83b7a5fc1a74.png)

例えばDockerだと、
色の塗り方のパターンが少し違ったり、名前あり/なしバージョンが用意されていたり、

![Screenshot 2020-12-21 0.42.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696809/54982b0d-fafc-e3de-3cd7-b88fefa2d784.png)

Gopherくんだと、水色、まっしろ、まっくろ、線画バージョンがあったり。

![Screenshot 2020-12-21 1.14.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696809/904095de-f212-b0d8-749e-189d66afcaa5.png)

Jetbrainsも結構いろんなパターンが用意されていたり。~~なお筆者は目が悪いので違いがあまりわからず...~~


このDeviconでは、フォント形式とSVG形式の2種類が用意されていて、
使いたいアイコンをクリックするだけで、コードスニペットが入手できます。

```html

<!-- in your header -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/devicons/devicon@master/devicon.min.css">

<!-- in your body -->
<i class="devicon-atom-original"></i>
```
こちらはフォント形式版のスニペット。親切にヘッダ用のタグも書いておいてくれてますね。


シンプルに画像として保存して使いたい人は、SVG形式のアイコンを右クリックして保存すればOKです。

![Screenshot 2020-12-21 1.17.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696809/589b90d0-bc60-cf8b-33da-5be2bf4397ac.png)

SVG形式だと、アイコン拡大しても画像がざらざらにならず、綺麗に見えるので嬉しい。
アイコン画像、検索して出てきた画像だとちょっと小さくて、拡大すると汚く見えちゃう...ということも多々あったんですが、
Deviconに出会ってSVG形式でダウンロードできるようになってからはそのお悩みも無事に解消されました。

# おわりに
いかがでしたでしょうか。
アイコン探しで苦労されている方、是非Deviconをお試ししてみてください。

[^1]: リポジトリは[こちら](https://github.com/devicons/devicon)
lambdaとfargateの性能テストを行ったので


lambda + serverless framework + node express と ecs + fargete + node express
で性能比較をしたので、メモ

処理時間 100ms/req ほど、処理時間の大半はcpuはほぼ使わずDB待ち

ざっくり lambda 512MB 300台(?) と fargate 2core 1台で同程度の負荷に耐えられた

アプリのタイプによって比率は大きく変わると思うけど、参考までに
Rails：You need to supply at least one validationというエラーが出た話

# 最初に

**カレンダー企画2020の21日目**
プログラミングの勉強を始めて3ヵ月程経ったので学んだことのメモをアウトプットとして記事に残します。
これからプログラミングの世界に入る人の手助けになれたら嬉しい限りです。
間違っていたり、言葉が違っていたり、誤解されるような言葉があったら教えてください^^
言葉を長々と読みづらかったら申し訳ありません。少しずつなれてがんばります。

## You need to supply at least one validationというエラーが出た話

このエラーが出たにはバリデーションをカスタムで作成した時でした。
（完全な私の凡ミスです^^;）

## 環境

```ruby:環境
Rails 5.2.4.4
ruby 2.6.3
```

## 原因

```ruby:demo.rb

validates :demo
validates :body, presence: true

def demo
  #本件には関係ないので割愛
end
```

これでは

![スクリーンショット 2020-12-20 21.52.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838465/8251241c-b3bc-67ae-24c7-1ad843c1e0a3.png)


こんなエラーが出てしまう^^;


## 解決

```ruby:demo.rb

validate :demo
validates :body, presence: true

def demo
  #本件には関係ないので割愛
end
```

以上！


`validates`ではなく`validate`だったみたいです。
`s`が余分だったという問題でした。

標準的なバリデーションは`validates`みたいです。
（よく使うものだと、空白はダメという例の2行目にあるもの）

カスタムしたバリデーションは`validate`にするようです。


## 最後に

同じようにミスをしてしまった人が早期解決できるようにメモがてら書いてみました。
良かったら参考にしてください。
スクリプトでnlコマンドを代替する

nlコマンドを用いずにテキストに行番号をつける方法をまとめます。あまり細かい挙動にはこだわりません。今回はスクリプト編です。


# AWK

ワンライナースクリプトの定番といえばAWKですね。

## `NR`

```console
$ yes | head | awk '$0=NR"\t"$0'
1	y
2	y
3	y
4	y
5	y
6	y
7	y
8	y
9	y
10	y
```

`NR`(Number of Records)はレコードの番号が格納されたビルトイン変数です。デフォルトのレコードセパレータが改行なので、そのまま行番号に対応します。
上記はアクションレス記法ですが、ちゃんと書くなら以下のようになります。デフォルトのフィールドセパレータはスペースなので、ビルトイン変数の`OFS`をタブで上書きしています。

```console
$ yes | head | awk -v OFS='\t' '{print NR, $0}'
1	y
2	y
3	y
4	y
5	y
6	y
7	y
8	y
9	y
10	y
```

この例では書式は`ln`です。さらに`printf`関数を使えば書式の自由度は格段に上がります。たとえば｀rz｀書式にするなら以下のようにします。

```console
$ yes | head | awk '{printf("%06d\t%s\n", NR, $0)}'
000001	y
000002	y
000003	y
000004	y
000005	y
000006	y
000007	y
000008	y
000009	y
000010	y
```

# Perl

Perlもワンライナーでは定番ですね。

## `$.`

```console
$ yes | head | perl -pe 's/^/$.\t/'
1	y
2	y
3	y
4	y
5	y
6	y
7	y
8	y
9	y
10	y
```

`$.`=`$NR`です。そして書式は`ln`です。
さらに`printf`関数で`rz`書式を指定するならこんな感じでしょうか。

```console
$ yes | head | perl -pe 'printf "%06d\t",$.'
000001	y
000002	y
000003	y
000004	y
000005	y
000006	y
000007	y
000008	y
000009	y
000010	y
$ yes | head | perl -le 'printf "%06d\t$_",$.while<>'
000001	y
000002	y
000003	y
000004	y
000005	y
000006	y
000007	y
000008	y
000009	y
000010	y
```

Perlは雰囲気で動いてしまうので、使っていながらなぜこれで動くのかよくわかりません。可読性は微妙ですが、Perlは（バージョンの差はありますが）AWKと違って実装が複数あるわけではないので、移植性の面では優れているのかもしれません。

>There’s not a GNU Perl and a BSD Perl – there’s the Perl.
 ― GNUのPerlもBSDのPerlもなく、ただ『Perl』があるだけだ。


Perlワンライナーの詳細はこちらが参考になると思います。

- [第29回シェル芸勉強会まとめ](https://b.ueda.tech/?post=09922)
- [jus共催 第30回危念シェル芸勉強会の報告](https://b.ueda.tech/?post=10195)
- [jus共催 第32回全くインスタ映えしないシェル芸勉強会](https://b.ueda.tech/?post=20171203_shellgei_32_summary)

勉強会の「午前の部」でPerlについて解説されています。

---

この他にも[シェル芸bot](https://twitter.com/minyoruminyon)などでおもしろい方法を見つけたら追記していこうと思います。
expo initでyarnではなくnpmを使用するコマンド

## expo initでnpmを選択する方法

以前まではReact Native Expoで`expo init`をすると、対話方式で`yarn`と`npm`どちらを使ってパッケージをインストールするか選べたが、お使いの環境によってはデフォルトで`yarn`が選択される。

`expo init --npm`,あるいは`expo init YourProjectName --npm`とすると`npm`が使用されるようになる。

## yarnだと依存関係がバグるようになった

個人的には`yarn`を使う方が好きだったが、ここ半年ほど`yarn`だとパッケージの依存関係がバグることが増えてきた。手動で修正していたが、素直に`npm`を使うとすんなり行くので、最初から`npm`を使用した方が良いと宗派替えをした。

特にGastby.jsは公式ドキュメメントでも`yarn`推しなのに,`yarn`だとパッケージの依存関係がバグりやすい。

## 参考

[React Native 入門：ニュースアプリを作りながら覚えよう/Hooks 対応 2020 年版](https://px.a8.net/svt/ejp?a8mat=3BK8OP+16V8C2+3L4M+BW8O2&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Freact-native-first-step%2F)
[実践編：React Native と Firebase で作る iOS/Android アプリ：お店レビューアプリ開発編](https://px.a8.net/svt/ejp?a8mat=3BK8OP+16V8C2+3L4M+BW8O2&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Freact-native-firebase%2F)

[Node.jsデザインパターン 第2版 ](https://amzn.to/2KJCqIM)
<a href="https://www.amazon.co.jp/Node-js%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-%E7%AC%AC2%E7%89%88-Mario-Casciaro/dp/4873118735/ref=as_li_ss_il?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=node&qid=1608514650&sr=8-4&linkCode=li2&tag=fden02-22&linkId=083c04e94bfdb9b64c3425bdb470c7e9&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4873118735&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=4873118735" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
[React Native 　～ JavaScript による iOS／Android アプリ開発の実践 ](https://amzn.to/3aoon6u)
<a href="https://www.amazon.co.jp/React-Native-%EF%BD%9EJavaScript%E3%81%AB%E3%82%88%E3%82%8BiOS%EF%BC%8FAndroid%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E3%81%AE%E5%AE%9F%E8%B7%B5-%E9%AB%99%E6%9C%A8-%E5%81%A5%E4%BB%8B-ebook/dp/B088BLSH9V/ref=as_li_ss_il?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=YWBNJTG3RG0Q&dchild=1&keywords=react+native&qid=1608514704&sprefix=REact+na,aps,329&sr=8-1&linkCode=li2&tag=fden02-22&linkId=12a9c96dbb0765632a53950763106002&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B088BLSH9V&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=B088BLSH9V" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
VSCode + Remote Containerで環境構築(go編)

ｎ版煎じかなとも思いつつ、md思い出しがてらとか鮮度とかいろいろ考えてとりあえず書いてみる。

-----

# 0. 最新記事への誘導

簡単なgoスクリプトを試すだけならこの環境でも十分ですが、本格的にアプリを開発しようとするときにはきちんとした環境を構築したほうがいいということで、別途後続記事を書いたのでリンクを張っておきます。

VSCode + Remote Containerで環境構築(Go・応用編)
https://qiita.com/honami/items/139ef1e5dc0e9f2caf27

# 1. 前提環境

- [VSCode](https://code.visualstudio.com/download)
- [Docker Desktop](https://www.docker.com/products/docker-desktop)

これ以外には基本的に準備不要。VSCode必要プラグイン（Remote Containers）については次項で途取り上げる。

Windows 10(Pro)で動作確認しているが、恐らくhome含め他OSでも問題ない（homeの場合は別途WSL2が必要）。

# 2. 必要プラグインの導入

[Remote - containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)

拡張機能(Extension)のタブを開き、検索欄に"Remote Containers"と入力する（記述現在では一番上に出てくるが、念の為同一かどうかを確認すること）。

![remote-containersプラグイン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17827/96a13c2c-de5a-4303-c575-e8bb789210ee.png)

当該プラグインのインストールを実施する。

# 3. 作業フォルダの準備

> $ mkdir test-go

任意の場所に作成。以降、このフォルダを基準とする（CUIで書いているが、Windowsから作成しても良い。フォルダ名は任意。余談だが筆者はgitbashで作業した）。

# 4. 作業フォルダに設定ファイルを生成

"Remote-Containers:Add Development Container Configration Files..."を実行（画像一番下）。恐らくコマンドパレットを"Ctl+Shift+p"で開いて補完を効かせるのが早い。

![設定ファイルの追加](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17827/15dbb6c5-3697-7892-c0e1-2ac5e7751f57.png)

初回は作業フォルダを要求されるため、先程mkdirしたフォルダを開く。

![2020-12-18-10-05-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17827/6203e3e9-ad22-c1d0-0ffc-7663be0bf365.png)


再度"Add Development..."を実行すると、いろいろな言語名がアルファベット昇順で出てくるので、goを選択（クリック）。

![設定する言語の選択](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17827/abf82f60-9692-61dd-c6ec-174031678204.png)

バージョンを聞かれるので選択。基本的にはデフォルトで良いので今回は1をクリック。直後にnode.jsを入れるか聞かれるが、ひとまず今回はチェックを付けずにOKを押下して進める。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17827/b71b9254-e6c2-48bc-11c2-90d7b32d1efc.png)

".devcontainer"フォルダと、その中にファイルが２つ（画像左）生成されていることを確認する。このとき右下に"reopen（再展開）"を要求するダイアログが出るので押下する。

![生成されたファイル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17827/496f47f2-5c99-02b0-8008-1207ddb312ab.png)


# 5. コンテナの生成

前項最後のダイアログ、もしくはコマンドパレットから"Remote-Containers: Reopen in Container"を実行。

初回起動はコンテナの生成とコンテナ内でのインストールが走るため時間がかかる（参考までに筆者環境で約５分）。二回目以降は処理済みとなり起動が早くなる。

終了するとVSCodeはコンテナ内部になっている。

# 6. Hello Worldを作成して動かす

（コンテナに入ったVSCodeで）ターミナルを開き、hello.goを作成。そのままエディタで編集（viで作ってもいい）。なお、以降のコマンドはVSCode内のターミナルで実行しているものとする。

> $ touch hello.go

```go:hello.go
package main

import "fmt"

func main() {
	fmt.Printf("Hello world\n")
}
```

作成した"hello.go"を実行。

> $ go run hello.go

ビルドして実行する。

> $ go bulid hello.go
> $ go ./hello

windows向けのexeを作る場合、一手間必要。

> $ go set -w GOOS=windows
> $ go build -o hellowin.exe hello.go

（このhello.goの実行ファイルだと処理実行後一瞬で消えてしまうため、cmdから動作確認するのが吉）。

> D:\hoge\test-go>hellowin
flask-paginateで検索結果をページネーション

# 概要
flaskで作成した検索のWEBアプリを、flask-paginateでページネーション(ページ割り)しました。
ページ遷移で少し詰まったので、記事にします。

# 環境
* flask 1.1.2
* flask-paginate 0.7.1

# 初回作成(不具合あり)
～/resultページから検索条件をPOSTでrequest.formとして取得し、検索した結果がresults(リスト)として得られる状態です。

```python
from flask import Flask, request, redirect, url_for, render_template, flash, session
from flask_paginate import Pagination, get_page_parameter

app = Flask(__name__)

@app.route('/result', methods=['GET', 'POST'])
def show_results():

    # request.formを用いた、なんらかの検索

    results = [...]    # 検索結果(リスト)

    page = request.args.get(get_page_parameter(), type=int, default=1)
    per_page = 1
    res = results[(page-1)*per_page: page*per_page]
    pagination = Pagination(page=page, total=len(results), per_page=per_page, css_framework='bootstrap4')

    return render_template('index.html', books=res, request_form=request.form, pagination=pagination)

if __name__ == '__main__':
    app.run(debug=True)
```

上記コードにより、次のようなページネーションが表示されます。
　![paginate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641825/7292beb9-98da-e91e-8b45-feb451e3796d.png)

resultsが検索結果の場合、数字の2，3をクリックしてページ遷移すると、正しい結果が表示されません。
検索条件を保存していないので、ページ遷移すると検索条件なしで再検索が行われてしまいます。
(flask-paginateのページ遷移はGETなので、検索条件を取得できません。)

# 改良(セッションを利用)
検索条件を保存するため、検索の前に以下の処理を入れました。

1. POSTの場合のみ、request.formをsessionに保存する。
2. POSTでもGETでも、sessionからrequest.formを割り当てる。session.get('request_form')がなかった場合はNoneが返る。

```python
from flask import Flask, request, redirect, url_for, render_template, flash, session
from flask_paginate import Pagination, get_page_parameter

app = Flask(__name__)
app.secret_key = b'XXXXXXXXX'                     # 追加　sessionを利用するために必要

@app.route('/result', methods=['GET', 'POST'])
def show_results():
    if request.method == 'POST':                  # 追加　
        session['request_form'] = request.form    # 追加　

    request.form = session.get('request_form')    # 追加　

    # request.formを用いた、なんらかの検索

    results = [...]    # 検索結果(リスト)

    page = request.args.get(get_page_parameter(), type=int, default=1)
    per_page = 1
    res = results[(page-1)*per_page: page*per_page]
    pagination = Pagination(page=page, total=len(results), per_page=per_page, css_framework='bootstrap4')

    return render_template('index.html', books=res, request_form=request.form, pagination=pagination)

if __name__ == '__main__':
    app.run(debug=True)
```

これで、ページ遷移すると、sessionに保存された検索条件で検索が行われるので、正しい結果が表示されます。

# 参考
[Flask Paginate(公式)](https://pythonhosted.org/Flask-paginate/)
[FlaskのページネーションはFlask-paginateを使うと簡単に実装できる](https://www.ravness.com/posts/flaskpaginate)
[検索結果のページネーションについて(stack overflow)](https://ja.stackoverflow.com/questions/50120/%E6%A4%9C%E7%B4%A2%E7%B5%90%E6%9E%9C%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%8D%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)　：Djangoの例
roman numerals

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# 課題

[アラビア数字(arabic numerals)を受け取って，ローマ数字(roman numerals)を返すmethodを作成する．](https://qiita.com/daddygongon/items/2d0a73a51ddab2d9da1b)


# コード

```ruby
def to_roman(num)
  roman=['I','V','X','L','C','D','M']
  num_s=ARGV[0]
  num=num_s.to_i
  x=num/1000  #1000の位
  num=num%1000
  y=num/100   #100の位
  num=num%100
  z=num/10    #10の位
  num=num%10
  w=num       #1の位
  case x
  when 1,2,3 then
    result=roman[6]*x
  end

  case y
  when 1,2,3 then
    result+=roman[4]*y
  when 4 then
    result+=roman[4]+roman[5]
  when 5 then
    result+=roman[5]
  when 6,7,8 then
    result+=roman[5]+roman[4]*(y-5)
  when 9 then
    result+=roman[4]+roman[6]
  end

  case z
  when 1,2,3 then
    result+=roman[2]*z
  when 4 then
    result+=roman[2]+roman[3]
  when 5 then
    result+=roman[3]
  when 6,7,8 then
    result+=roman[3]+roman[2]*(z-5)
  when 9 then
    result+=roman[2]+roman[4]
  end

  case w
  when 1,2,3 then
    result+=roman[0]*x
  when 4 then
    result+=roman[0]+roman[1]
  when 5 then
    result+=roman[1]
  when 6,7,8 then
    result+=roman[1]+roman[0]*(x-5)
  when 9 then
    result+=roman[0]+roman[2]
  end
  return result
end

puts "#{to_roman(ARGV[0])}"
```


# 結果

    >ruby roman_numeral.rb 1960
    
    MCMLX



------
 - **source** ~/grad_members_20f/members/Kenny0704/roman.org
ServiceNow - csv,xlsxエクスポート

#ServiceNowから次のようなURIでCSV及びxlsxファイルをダウンロードできます。

```
https://<インスタンス名>.service-now.com/＜テーブル名＞_list.do?<形式>
```
対応している形式：CSV,XLSX,XML,PDF,JSON （すべて大文字で指定する）
例：
https://<インスタンス名>.service-now.com/sys_user_list.do?CSV

本記事ではURIに指定できるパラメータを説明します。

#パラメータ

|No.|パラメータ|値|例|
|---|---|---|---|
|1|sysparam_query|クエリー|sysparm_query=serial_numberISNOTEMPTY|
|2|sysparm_orderby|ソートする列|sysparm_orderby=serial_number|
|3|sysparm_fields|取得する列|sysparm_fields=name,email|
|4|sysparm_display_value|true:表示される値、false:sys_id、all:両方|true:ACME South America、false:227cdfb03710200044e0bfc8bcbe5d6b|
|5|sysparm_export_column_header_label|true:ラベル名、false:列名|true:Employee number、false:employee_number|

#プロパティ
|No.|形式|プロパティ|説明|デフォルト値|
|---|---|---|---|---|
|1|CSV|glide.csv.export.limit|最大行数|10,000行|
|2|XLSX|glide.xlsx.export.limit最大行数|10,000行|
|3|XLXS|glide.xlsx.max_cells|最大セル数|500,000セル|

#余談
ServiceNowがSSO対応している場合にバッチファイルからcsv及びxlsxファイルをダウンロードする場合は次の記事を参照
https://qiita.com/htshozawa/items/24cb8ec093491511384c
c++言語とは

#C言語の上位セットであるC++言語
1972年にC言語が開発されると、瞬く間に各方面で利用されるデファクトスタンダードの言語となりました。しかし、それにつれ、この言語の問題と限界が露呈するようになりました。

そのひとつは、C言語は、大規模な開発には、必ずしも向かないということです。時代の変化とともにコンピュータの性能が向上すると、多数のプログラマが参加する大規模開発が主流になってきました。しかし、C言語はそういったプログラミングを行ううえでは、必ずしも効率的な言語とはいえませんでした。そこで、C言語にオブジェクト指向的な拡張を施したC++(シー・プラス・プラス）言語が開発され、利用されるようになったのです。

#オブジェクト指向
C++言語について詳しく説明する前に、オブジェクト指向とは何かということについて詳しく説明していきましょう。

オブジェクト指向の「オブジェクト」とは、英語で「もの」とか「物体」などを表す言葉で、データを現実世界のものに置き換える考え方です。

たとえば、オブジェクト指向プログラミング言語で、テレビを操作するプログラムを作成したと仮定します。そのとき、オブジェクト指向では、テレビを象徴する「テレビ」というオブジェクトを用意します。また、「テレビ」には、「スイッチを入れる」、「チャンネルを変える」などといった動作が伴います。これら動作のことを「メソッド」と言います。

オブジェクト指向では、これら「オブジェクト」とその動作である「メソッド」の組み合わせと、その相互作用でプログラムを記述します。

このような考え方が、現在のプログラミング言語の考え方の主流なのです。現在、主なオブジェクト指向言語には、以下のようなものがあります。

| 言語名 | 特徴 |
|:----------:|:------------|
| C++       | C言語を更に拡張した言語。 オブジェクト指向といった考え方に対応。       |
| Java     | C/C++をベースにして、SunMicrosystemsによって開発された、Androidなどで用いられている言語。      |
| C#      | Microsoft社がJavaなどをベースに独自に開発した言語。        |
| Objective-C         | Apple社がC言語を独自に拡張した言語。iPhoneやiPadのアプリ開発に用いられる。          |
| Swift       | Apple社によって開発されたObjective-Cの後継言語。iPhoneやiPadのアプリ開発に用いられる。       | 
| Perl    | スクリプト言語として、CGIなどに多用される。バージョン5よりオブジェクト指向になった。     |
| JavaScript | HP作成に用いられるスクリプト言語。jQueryなどに応用される。アプリ開発では,React.jsやVue.jsがある。 |
| Python | Web開発などによく用いられる言語。拡張性に定評がある。また、機械学習のライブラリが豊富。 |
| Ruby | この中では、唯一日本人によって作成された言語。Pythonと共通点が多い。|
| PHP | ウェブ開発に特化した言語。サーバーサイド側の処理を記述する。|

現在使用されている主要なプログラミング言語は、ほとんどがオブジェクト指向言語です。したがって、C++でオブジェクト指向プログラミングを学べば、広い範囲に応用可能なのです。

#C++言語の特徴
ここでは、C++言語の特徴について説明します。一般に。C++言語には、以下の長所・短所があるといわれています。簡単にまとめると、以下のようになります。

###C++言語の長所
- C言語と互換性があり、ソースコードを再利用できる。
- 他のオブジェクト指向言語と違い独自のフレームワーク必要とせず、ネイティブコードを得られる。
- C言語よりもセキュリティの面が優れている。

これに対しデメリットは以下のものがあげられます。

###C++言語の短所
- 他の言語に比べ、言語使用が複雑。
- 標準で利用できるライブラリが少ない。
- メモリ管理機能（GC機能）が存在しない。

といった点があげられます。

#オブジェクト指向
### オブジェクト指向の考え方
では、次にC++言語の特徴である、オブジェクト指向について、詳しく説明しましょう。オブジェクト指向とは、あらゆるものを、すべて「モノ」として表現するという考え方のことを言います。オブジェクト指向の、オブジェクト（Object）とは、英語で「モノ」を表す言葉です。

例えば、自動車を運転する際には、自動車内部の仕組みを理解する必要はありません。ただ運転方法だけを知っていれば、それだけで自動車を使うことができます。

つまり、「自動車」というオブジェクトは、動作させる仕組みがすでに内部に組み込まれていることから、それを利用するためには、仕組みを知る必要は一切なく、ただアクセルを踏む、ハンドルを切るなどといったような適切な操作をすればよいことになります。

![c++_picture_001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515195/61ce5836-2b4d-9238-062c-5675db9c067c.jpeg)



オブジェクトには、操作にあたる、メソッドと呼ばれる部分と、属性（ぞくせい）があります。自動車の例で言えば、「発進する」「停止する」などがそのメソッドで、データは、スピード、走行距離、といったところでしょう。

<dl>
  <dt>属性</dt>
  <dd>スピード</dd>
  <dd>走行量</dd>
  <dd>排気量</dd>
  <dt>メソッド</dt>
  <dd>発信する</dd>
  <dd>停止する</dd>
  <dd>曲がる</dd>
</dl>

### クラスとオブジェクト
以上で、だいたいオブジェクト指向の考え方が理解できたかと思います。そこで、ここではさらに、クラスという概念について説明します。前述の、自動車という例を用いて説明すると、通常、世の中には、自動車がたくさん存在します。

オブジェクトは、こういった、個々の物体をさす場合に用いられる概念で、このほかに、インスタンスという呼び名もあります。

ただ、こういった自動車も、もとはひとつの設計図を元に大量生産されているはずなのです。この、設計図にあたるものを、クラスと言います。つまり、クラスがなければ、オブジェクトもありえないのです。以上が、基本的なオブジェクト指向の考え方です。オブジェクト指向には、このほかに様々な概念がありますが、今後適宜紹介していきます。

![c++_picture_002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515195/3542785f-245f-4fd7-5f2c-2c4e436846e0.jpeg)
AtCoder ABC186をPythonで解く

D問題が解けたらいいな，という程度の初学者の記事です．
今回はA, B, Cの3問は割と早く解けたのですが，Dでつまづきました．

# A
割ったあまりが答え．
```
N, W = map(int, input().split())
print(N // W)
```

# B
なんかすごく効率の悪いコードを書いてしまった．皆さまの解答を参考にさせて頂きます．
```
L = []
H, W = map(int, input().split())
for _ in range(H):
    S = list(map(int, input().split()))
    L.append(S)

mx = 100
for l in L:
    ml = min(l)
    if ml < mx:
        mx = ml
    

ans = 0

for l in L:
    for i in l:
        diff = i - mx
        ans += diff

print(ans)
```

# C
これは割といい感じだった．
```
N = int(input())
t = len(str(N))
# for i in t:
L = []
for i in range(1, N+1):
    ten = str(i)
    if '7' in ten:
        L.append(i)
    eight = oct(i)
    if '7' in eight:
        L.append(i)

seven = len(set(L))
print(N - seven)
```