OmniAICreator/Qiita-1.07M huggingface dataset:
はじめてのプログラミングを「文言」（漢文プログラミング言語）で　１日目

#はじめに
　はい、[前回](https://qiita.com/S_Y15/items/44be8cfc67a18bbcd2bb)はコードを一切書かなかったのにも関わらず、なかなかの反響をいただきました。ありがとうございます。
今回は、環境構築に始まり、ちょっとずつコードを書き始めていきたいと思います。
#環境構築
wenyanリポジトリをクローンして、（私は行儀が悪いのでCドライブ直下に置きました。Program files下はなんかダメでした）
コマンドプロンプトを管理者権限で実行、クローン先ディレクトリで

```bat
npm install -g @wenyan/cli
```

を実行。なんかズザーッっとなったので、

`wenyan`て打つと

```bat
 ,_ ,_
 \/ ==
 /\ []

WENYAN LANG 文言 Compiler v0.3.3

Usage: wenyan [options] [files...]

Options:
  -v, --version        Output the version
  -l, --lang <lang>    Target language, can be "js", "py" or "rb" (default: "js")
  -c, --compile        Output the compiled code instead of executing it
  -e, --eval <code>    Evaluate script
  -i, --interactive    Interactive REPL
  -o, --output [file]  Output compiled code or executing result to file
  -r, --render         Outputs renderings
  --roman [method]     Romanize identifiers. The method can be "pinyin", "baxter" or "unicode"
  --strict             Enable static typechecking (default: false)
  --allowHttp          Allow to import from http (default: false)
  --dir <path>         Directory to importing from, seprates with comma(,)
  --no-outputHanzi     Don't convert output to hanzi
  --log <file>         Save log to file
  --title <title>      Override title in rendering
  -h, --help           Display help
```
いい感じかな？というかwenyanのロゴめっちゃいいよね。かわいいのでもう一回書こう。

```
 ,_ ,_
 \/ ==
 /\ []
```

#さて、「愛おしき教科書」の時間だ！
[文言陰符](https://book.wy-lang.org/)読んでいこうかな。
まあ一回につき二項目ずつくらいかな？
##明義第一
曰く、
>編程者何。所以役機器也。機器者何。所以代人力也。然機器之力也廣。其算也速。唯智不逮也。故有智者慎謀遠慮。下筆千言。

（ゆる訳）プログラミングって何？機械に仕事させることだよ。機械って何？人の代わりに仕事するやつだよ。それから機械の力ってすごいんだよ。計算早くて人間の思考じゃ追いつけないよ、だから頭いいやつは筆でたくさん書くのを遠慮するよ！

にはじまり、ちまちまプログラミングの利点とかあらましについて述べてる。人間の言語わからんから機械にも分かる言語使うよ！でも機械に寄せすぎると読みづらいから中庸を取るよ！とかね。ちなみに西洋人が作ったものだから訳語作るねとか言ってるね。ちなみに「代碼」はコード、「編譯器」はコンパイラー、「運行」は実行、「報錯」はエラーメッセージっぽいね。かっこいいね（小並感）
>古之啟蒙。無不以最易始。
（古の啓蒙、最も易きを以て始めざるは無きなり）

とか言われた。Hello worldの時間だ！
###Helloworld
```
吾有一数。曰三。名之曰「甲」。
為是「甲」遍。
吾有一言。曰「「問天地好在。」」書之。
云云。
```
これが例になってた。これを実行すると、

```
問天地好在。
問天地好在。
問天地好在。
```
まあ、そうよね。

えっと、ループなしはこうで良いっぽいね。

```
吾有一言。曰「「問天地好在。」」書之。
```

あ、一応環境作ったけどめんどいのでオンラインエディタで書いてます。
はい、ちゃんと動くね。

甲は変数で、別に使い回さないなら簡単に

```
為是三遍。
吾有一言。曰「「問天地好在。」」書之。
云云。
```

でもよい。うんうん分かりやすい。

ちなみに、例に千回出力があったのでやってみたらまあまあ処理時間かかったよ。
あと**。**は省いてもいいってさ。鉤括弧は必要だってさ。

##変数第二
やっとプログラミングっぽくなってきたな。
>易曰。變化者。進退之象也。
（易曰く、変化は進退の象なり。）

じゃあないんだよな。易経をお気軽引用するな。**だから執筆者は情報科挙を（）**

ふむ、**「爻」、「列」、「物」、「術」**とな。
「爻」は陰陽、「列」は釈迦の数珠とか長蛇の陣みたいに同種の並び、「物」は姓名とか歯とか男女みたいなペア、「術」は方術と……
例えの癖強いな？

さてさて、
全部

```
吾有一数。曰三。名之曰「甲」。
```
みたいに書けて、名付けないでいいなら単に

```
吾有一数。曰三。
```
はい。

```
吾有三数。曰三。曰九。曰二十七。名之曰「甲」。曰「乙」。曰「丙」。
```
とも書ける。便利ね。
```吾有一数曰``` は```有数```でもいいのね。

```
昔之「甲」者。今四是矣。
```
これで書き換えれるのね。だるそう。

**うーん、まだ何もできないなあ。**
なんかできるんかなあ。

#次回予告
次回、算術と決策！！絶対見てくれよな！
このプログラミング言語をマスターして、他の言語を見たときに**「あー、これを名づけて曰くかあ。」**とか言えるようになりたいですね。
漢文の解説、もっとして欲しい？　え、いらない？　……そっかあ。

[続く](https://qiita.com/S_Y15/items/675f5b927c7cca9b7754)
マスク未着用検知iOSアプリをVisionフレームワークで実装する

iPadやiPhoneのカメラ・フレームを分析して、マスクを着用していない人を検知できるアプリをかんたんにつくることができます。

**GitHubでアプリ公開しています。**
https://github.com/john-rocky/MaskPlease
お店の入り口などに置いてください。
<img width="200" alt="スクリーンショット 2020-07-21 0.56.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/b8854bbb-2538-c550-dce5-a10604034f93.png">

# マスク着用の判定方法

マスクを着用していない人がいるかを特定するためには、**鼻や口がうつっているかどうか**をたしかめればいいです。

Visionフレームワークの顔検出機能は、**マスクを着用していると検知できません。**
ゆえに、Visionで顔を検出できるということは、その顔はマスクをつけていないといえます。
<img width="200" alt="スクリーンショット 2020-07-21 1.01.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/b6d59c46-7bcf-8f0d-73ec-e207cdc07c64.png"> <img width="200" alt="スクリーンショット 2020-07-21 1.04.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/d38d949e-47f0-7fce-a4f0-de14af0f389a.png">

**VNDetectFaceRectanglesRequest**にカメラの映像を１フレームずつ渡します。

```swift:
let detectFaceRequest = VNDetectFaceRectanglesRequest(completionHandler:self.processVisionRequestResults)
```

```swift
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
                 return
             }
    let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: exifOrientation, options: [:])
         do {
             try imageRequestHandler.perform(self.requests)
         } catch {
             print(error)
         }
}
```

##顔がうつっていればアラートを出す
**VNFaceObservation**のresultがあれば、顔がうつっているので、「マスクをつけてください」というアラートをだします。

```swift
guard let observation = results.first as? VNFaceObservation else {
          //顔の結果なし
          imageView.image = UIImage(name:"thanksForWearing")
          }
//顔の結果あり      
imageView.image = UIImage(name:"pleaseWearing")
```
<img width="200" alt="スクリーンショット 2020-05-13 2.06.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/e4c9af2f-d0f0-2843-13b1-c3e8e9c60efb.png"> <img width="200" alt="スクリーンショット 2020-05-13 2.06.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/1c7e69fd-90bd-8f48-f763-8ca81677f1b6.png">

**AVSpeechSynthesizer**を使うと、音声で呼びかけてくれます。

```swift:ViewController.swift
let talker = AVSpeechSynthesizer()
let utterance = AVSpeechUtterance(string: NSLocalizedString("Please wear a mask.", comment: "") )
utterance.voice = AVSpeechSynthesisVoice(language: NSLocalizedString("en-US", comment: ""))
talker.speak(utterance)
```

VNDetectFaceObservationは顔を囲む四角形の座標もくれます。
カメラ画像に「マスク未着用」の四角警告をオーバーラップさせると、アプリがより監視してるテイストになります。




機械学習系の情報を発信しています。
https://twitter.com/JackdeS11

rockyshikoku@gmail.com
読みやすいブログに共通すること

# はじめに
プログラミングをしていて感じたのは、
ドキュメントがとっても読みづらいこと。

上から下まで文字でびっしり。

逆にア●ーバブログとかは、
呼吸をするくらい簡単に読めた。

今回は、そういったブログに共通する特徴をまとめてみた。


### １行に書かれていることが...

大抵の読みやすく感じるブログは、
１行につき１文以下の内容にまとまっている。

１文が長くなってしまう場合は、
読点で改行している。


### 内容が...

死ぬほど薄い。

息を止めて最初から最後まで読み切れてしまうくらい。

それって悪いことではなくて、
誰でもわかるくらい簡単に、
コンテンツを細分化できている、
ということなんだと思う。


### 行間が...

広い。

大抵は句点(。)がついた行の後は、
１行開けている人が多い印象。

不自然なときは、
内容に応じてくっつけるのもあり。


# まとめ

自分は文字を読むのが苦手なので、
自分でも読みやすい文書を書きたいと思っている。

今回列挙した方法を、
すべての文書に適用することはできない。

プログラミングの記事には向いていないかもしれない。

だけど、
何かの参考になればいいと思う。
高専キャリアとマイクロソフトがコラボしたクラウドAI開発講座進捗報告[3]

# クラウドAI開発講座進捗報告- 3週目

[これ](https://qiita.com/teruto725/items/222b011a8dd63bf76158)の続き

## やったこと
### 1. 試作botのデプロイ
 
これがまじでできなかった。10回以上トライしたけどAzureのweb上で動くチャットが動作しなかった。
メンターの方も手伝ってくれたけど結局できなかった。
あきらめてC#でやるしかないかなって感じ。
C#はできた。


## 感想
　やっぱり環境構築が一番だるい。
時間無駄にしてる感がやばいので、精神的なダメージがすごい。
  
## 来週の予定
とりあえずC#でボット作り直す。
Angularでhtmlのcontenteditableを使う方法

#Angularでhtmlのcontenteditableを使う

現在、しっかりメンテナンスされているパッケージはこれ
https://www.npmjs.com/package/@ng-stack/contenteditable

### インストール
`npm install @ng-stack/contenteditable --save`

### モジュールでインポート
`import { ContenteditableModule } from '@ng-stack/contenteditable';`

### あとは使いたいところで[ngModel]や[formControl]を使用して使える

```
<form #testForm="ngForm">
  <p
    contenteditable="true"
    name="myFormName"
    [(ngModel)]="templateDrivenForm"
    ></p>
</form>

```
Typescriptの型ガード

# 型ガードってなんで必要なの？
実装を進めていくと例えば、ある特定オブジェクトのプロパティが数値もしくは文字列の場合があるとしよう。
そのプロパティを参照するメソッドを定義して数値だったら、文字列だったらっていう処理を分岐させたい時ってよくあることだと思います。
そういったときに型ガード(Type Guard)を使用すると、条件ブロック内のオブジェクトの型を制限することができ
型の絞り込みも可能になり、型ごとの処理などを明確の定義できるようになります。

では一般的にどんな型ガード演算子があるのか？

## typeof
typescriptはjavascriptでも使えるtypeof演算子を使用できます。
簡単な例でみてみよう

```ts
type Sample = string | number;

function addSample(a: Sample, b: Sample) => {
  // a,bどちらかが文字列で入ってきた場合
  if(typeof a === 'string' || typeof b === 'string') {
   return a.toString() + b.toString();
  }
  // 数値の場合
  return a + b;
}
```
このように、typeofを使うことによって、引数の型を精査してどちらかが文字列だった場合は文字列に両方とも変換して文字連結してしまう処理、どちらも数値だった場合は単純に足算する処理になります。
typeofのブロックで文字列の場合は吸収してしまってそれ以降の処理は進めないように型でガードしています。
これが一番シンプルな型ガードではないかなと思います。

## instanceof
これは特定のインスタンスがどのクラスから生成されたかで判断する型ガードになります。
簡単な例でみてみよう

```ts
class Hoge {
  hoge = 123;
}

class Fuga {
  fuga = 456;
}

function sample(val: Hoge | Fuga) {
  if (val instanceof Hoge) {
      console.log(val.hoge); // OK
  }
  if (val instanceof Fuga) {
      console.log(val.fuga); // OK
  }
}

sample(new Hoge());
sample(new Fuga());
```
このようにどのクラスから生成されたインスタンスなのかをinstanceof型ガードして処理を変えているのがわかるかと思います。

## in
これは、オブジェクト上のプロパティの存在を安全にチェックし、型ガードとして使用することができます。
簡単な例をみてみよう

```ts
interface SampleA {
  a: number;
}
interface SampleB {
  b: string;
}

function sample(s: SampleA | SampleB) {
  if ('a' in s) {
    // SampleA
  }
  else {
    // SampleB
  }
}
```
オブジェクト上のプロパティの有無で型ガードをしてより安全な処理を実装する際に便利な演算子ではないかと思います。

## おまけ
ちょっと特殊な型定義を紹介！
 
```ts
interface Bird {
  type: 'bird';
  flyingSpeed: number;
}

interface Dog {
  type: 'dog';
  runningSpeed: number;
}

type Animal = Bird & Dog;

const movingAnimal = (animal: Animal) => {
  let speed: number;
  switch(animal.type) {
    case 'bird':    
      speed = animal.flyingSpeed;
      break;
    case 'dog':
      speed = animal.runningSpeed;
      break
    default:
      break;
  }
}
```
これはちょっと面白くて、共通のプロパティを定義することによってこれを型ガードの判断材料にして、
このオブジェクトはBirdかDogかの判断ができるようになります。
判断軸を揃えることによって型定義がより簡単にできるようになる手法の一つかと思います。

## まとめ
TypeScriptにを使っている以上、型を有効かつ安全に使っていかなければなりません。
今回紹介した型ガードは条件分岐の際などに自動的に型を絞り込んでくれ、
より安全なコードに保ってくれるとても便利なものです。
実装をしていく上で扱う方も多くなってくると思いますが、
複雑になってくからこそこういう小技がとても役に立つのではないでしょうか！
ファイルの末尾に「_〇〇〇」をつけるbat

個人メモ

「_〇〇〇」の場所だけ変えればよいだけ！

※batファイルのあるフォルダ内のファイル全てが対象
※既に「_〇〇〇」が末尾のファイルには追加しない
※ファイル名やフォルダ名に半角スペース、()があるとerrorになる
※共有フォルダなど、管理者権限が必要な場合、batが使えない場面がある


```bat
@ECHO OFF
SETlocal ENABLEDELAYEDEXPANSION
REM refrence
REM https://teratail.com/questions/149529
REM https://qiita.com/tomotagwork/items/5b9e08f28d5925d96b5f
REM http://tooljp.com/bat_qa/ECHO-off-errror-3B28.html
REM https://web.plus-idea.net/2016/09/windows-bat-substr/
REM https://qiita.com/plcherrim/items/8edf3d3d33a0ae86cb5c

SET addStr=_〇〇〇
FOR %%i IN (*) DO (
    SET file1=%%~ni
    SET file2=!file1:~-0,-3!%addStr%%%~xi
    IF NOT %%i==!file2! (
        REN %%i %%~ni%addStr%%%~xi
     )
)
```
Salesforceの権限設定について_Part2

#はじめ
[Salesforceの権限設定について_Part1](https://qiita.com/soneonhee/items/b71cc2fe99473a2a63c6)でSalesforceの基本的な設定について説明しました。
Part2ではPart1で設定した基本設定をもとにオブジェクトへの共有権限を制限できる設定に整理してみたいと思います。

 - 共有ルール（Sharing Rules）
 - 公開グループ（Public Group）

Salesforceには取引先（Account）やケース（Case）などを利用し機密性の高い個人情報や営業情報が格納し、管理することが多い。なので情報によっては社内や部署内でもセキュリティ上を理由に公開を制限する必要がある。なのでSalesforceの基本設定でも取引先とケースは非公開になっている。その非公開になっているオブジェクトを**共有ルール**によって部分的に公開するのができる。そしてその共有ルールをもっと柔軟に設定できるように使うものが**公開グループ**である。

**レコード参照・編集権限を持つ条件**
1. プロファイルにて該当オブジェクトへのアクセス権を持っているか
2. 全レコードへの参照権を持っているか
3. 該当レコードの所有者なのか
4. 所有者のロールより上位のロールを持っているか
5. 組織の共有設定状況が「参照のみ」または「参照・編集」なのか
5. 共有ルールの条件を満たしているか
※上記の条件を全部満たす必要がある。



#本文
##共有ルール
>共有ルールは、レコード所有者やその他の条件 (レコードタイプや特定の項目値など) に基づきます。各オブジェクトには最大 300 件の共有ルール (最大 50 件の条件に基づく共有ルールを含む) を定義できます (オブジェクトで使用可能な場合)。
※https://help.salesforce.com/articleView?id=security_sharing_rules_create.htm&type=5

- ルールタイプ
    - レコード所有者（Owner）に紐づく<br>レコード所有者のロールや公開グループに紐づくユーザへの公開を設定
    - 条件に基づく<br>レコードが持つ属性の条件によってユーザへの公開を設定


▼共有ルール作成画面-レコード所有者に紐づく
![共有ルール作成画面-レコード所有者に紐づく](https://d259t2jj6zp7qm.cloudfront.net/images/v1491343707-ownership-sharing-rules_yk9cjp.gif)

▼共有ルール作成画面-条件に基づく
![共有ルール作成画面-条件に基づく](https://i1.wp.com/salesforce-blog.com/wp-content/uploads/2019/04/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2019-04-03-12.04.19.png?resize=751%2C651)

- 共有先のカテゴリ<br>https://help.salesforce.com/articleView?id=security_sharing_data_set_categories.htm&type=5
- アクセス権
    - 参照
    - 参照・更新
    - 非公開

## 公開グループ（Public groups）
>グループは一連のユーザで構成されます。グループには、個々のユーザ、その他のグループ、または特定のロールやテリトリーのユーザを含めることができます。あるいは、特定のロールやテリトリーのユーザと、階層でそのロールやテリトリーよりも下位のすべてのユーザを含めることができます。
https://help.salesforce.com/articleView?id=user_groups.htm&type=5

一つの公開グループを作成する際に複数のユーザ、ロール、公開グループなどが選択できる。

【例】

| ロールA | ロールB | ロールC | ロールD |
|---------|---------|---------|---------| 
| ユーザA1 | ユーザB1 | ユーザC1 | ユーザD1 |
| ユーザA2 | ユーザB2 | ユーザC2 | ユーザD2 |
| ユーザA3 | ユーザB3 | ユーザC3 | ユーザD3 |

公開グループA：ロールA、ユーザB1、ユーザC1
公開グループB：ロールA、ロールC、公開グループA

上記のような設定も可能。



#結び
まとめると以下のような共有ルールを持つ場合、アクセス権限は以下のようになる。

| 共有ルール | 共有先 | アクセス権 |
|---------|---------|---------|
| 取引先のレコードタイプが「ほげほげ」の場合 | 公開グループB | 参照 |
| 取引先のレコードタイプが「ほげほげ」の場合 | 公開グループA | 参照・編集 |

| ロールA（参照・編集） | ロールB | ロールC（参照） | ロールD |
|---------|---------|---------|---------| 
| ユーザA1（参照・編集） | ユーザB1（参照・編集） | ユーザC1（参照・編集） | ユーザD1 |
| ユーザA2（参照・編集） | ユーザB2 | ユーザC2（参照） | ユーザD2 |
| ユーザA3（参照・編集） | ユーザB3 | ユーザC3（参照） | ユーザD3 |



###参考資料
- http://salesforce-blog.com/security_sharing/
- https://help.salesforce.com/articleView?id=user_groups.htm&type=5
- https://help.salesforce.com/articleView?id=security_about_sharing_rules.htm&type=5
Windowsサービスの削除の仕方

先日スマホが壊れまして、スマホからサルベージしたメモ等を、(今後も)少しずつ自分用メモとして投稿していきます。
時間の都合で、説明はほぼ割愛します。
(これらの情報を調べている当時は、外部ネットワークに接続禁止な環境だったため、勤務時にスマホで調べてスマホにメモっていました。なんか、TRUQUEって壊れにくいって聞いてたけど結構高頻度で壊れてない････？)

今回は以下のリンク先の情報を参考にさせていただきました。ありがとうございます。

- [Windowsで登録済みのサービスを削除するコマンド | 初心者SEのとりあえずメモ日記](https://memo.morelents.com/windows-service-delete/)

# Windowsのサービスを削除したい

windowsに登録されたサービスは、GUIでは「開始」や「停止」「無効」はできるが、「削除」ができません。
そんな項目ない。

# 削除方法

コマンドから削除。
cmdかPowershellから実行する。(後述のエラー回避のために、管理者権限で開いておく。)

```text:cmdかPowerShell
sc.exe delete [削除したいサービス名]
```

以下のメッセージが出たら成功。

```text:cmdかPowerShell
[SC] DeleteService SUCCESS
```

- FAILED 5 で失敗する場合は権限がなくて削除に失敗している。cmd自体を管理者権限で開いて再度実行。
アルゴリズムを無料で学ぶときに参考にしたいサイト

ブックマーク整理するための個人的なメモです。
もっといいところがあるよ！っていうコメントあったら遠慮なく教えてくれると嬉しい。

## AIZU ONLINE JUDGE

サイトは[ここ](https://onlinejudge.u-aizu.ac.jp/home)です。
競技プログラミングで実力を確かめながら、アルゴリズムとデータ構造について学べる。学習コースでは先達のつよつよ競プロerのコードが見れるのでひとりで取り組んでも心が折れない。

## AtCorder
サイトは[ここ](https://atcoder.jp/)です。
言わずと知れた競技プログラミングコンテストの開催で有名。最近はツイッタランドのトレンドにもなっている。
周辺にも勉強法ややっておくとよいこと、開発環境の構築などを解説している方が多いので、独学者の味方。
[AtCoderで水色になるまでにやった事とかをまとめる](https://cocodrips.hateblo.jp/entry/2015/10/11/114212#%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E3%81%AB%E5%85%B1%E9%80%9A%E3%81%99%E3%82%8B%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%99)で上達方法を公開している方とかがいるようなコミュニティ。参考にして水色になりたい。

## その他
[強くなるためのプログラミング](https://cocodrips.hateblo.jp/entry/2015/10/11/114212#%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E3%81%AB%E5%85%B1%E9%80%9A%E3%81%99%E3%82%8B%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%99)などは広範にサイトを紹介している。挑戦してみたくなる。

アルゴリズムわからん、となってもめげるのは早い。視覚的に何が起こっているのか説明してくれるサイトもある。
[VisuAlgo](https://visualgo.net/en)

## おわりに
とりあえずこのくらい。そのうち追加するかも。
VirtualBox + Vagrant でMacにsentos/7インストール

## 前提
- VirtualBox,Vagrantはインストール済みであること


# 構築手順
それでは実際の手順を説明していきます

## sentos/7のインストール
```
$vagrant add box sentos/7
//centos/7のインストール

$vagrant up
//インストールしたcentosを立ち上げます
```

ここまでで、centos/7のダウンロードとインストール、そしてインストールしたcentos/7の起動まで完了しました

次の手順でsshで起動したsentosにアクセスしたいと思います

## sentos/7へssh接続
```
$vagrant ssh
```

エラーが出なければ無事接続完了です

お疲れ様でした。
TDD勉強#5(July 18th, 2020)

#新しい知識
###条件演算子(三項演算子)
```java
条件式 ? 式1 : 式2
```
条件式が`true`だった場合に式1，`false`だった場合に式2を処理．
ちなみに論理演算子`a && b`はaとbがともにtrueのときにtrue．
AMD GPUでTensorFlow 1.xを動かす

# はじめに
AMD GPUでTensorFlow 1.xを使いたかったので、ROCm入れて動かしてみました。
いろいろ試行錯誤したのでメモを残します。

## 環境
- OS: Ubuntu 18.04 LTS
- GPU: Radeon RX 560

## 入れたもの
- ROCm: v3.5.0
- tensorflow-rocm: v1.15.4

# 作業記録
目的は「AMD GPUしかないけどTensorFlow 1系を動かしたい」です。
使いたいライブラリがTensorFlow 2系に対応していなかったため、1系縛りです。
AMDなのでCUDAは使えず、代わりにROCmを使うことにします。
（PlaidMLなるものも見かけましたが、そちらはkerasのコードじゃないと動かせなさそうだったので今回は却下）

ROCmを使うにはUbuntu環境が必要とのこと。
DockerやVirtual Boxでできないかなと思ったけど、仮想環境からだとGPUを認識できなかったのでちゃんとUbuntu環境を用意します。
日本語RemixだとROCmが正常に動かないみたいな情報をちらっと見たので以下から通常版の18.04 LTSを準備。
ubuntu-18.04.4-desktop-amd64.isoを使う。

- https://releases.ubuntu.com/18.04/

## ROCmをインストール
基本的に、[公式のインストールガイド](https://rocmdocs.amd.com/en/latest/Installation_Guide/Installation-Guide.html)に従えばOK。
v3.5.0が入った。

## tensorflow-rocmをインストール
以下などを参考に作業。

- https://instanttry.com/gpu/rocm-tensorflow-mac2/

python-devを入れる。

```bash
sudo apt install python3-dev
```

その他必要な諸々を入れる。

```bash
sudo apt update && \
      sudo apt install -y --allow-unauthenticated \
      rocm-dkms rocm-dev rocm-libs \
      rocm-device-libs \
      hsa-ext-rocr-dev hsakmt-roct-dev hsa-rocr-dev \
      rocm-opencl rocm-opencl-dev \
      rocm-utils \
      miopen-hip miopengemm rccl
```
（参考URLにあるrocm-profilerとcxlactivityloggerの2つはパッケージが見つからないと言われて入れられなかったが、特に問題なさそう。rcclは追加。）

venvで仮想環境を作成しておいた。
tensorflow-rocm1.5はPython3.7までにしか対応していなさそうなので、今回はPython3.6環境をそのまま使っている。
作業ディレクトリで以下コマンドを実行して仮想環境を作成。

```bash
python3 -m venv venv
# . venv/bin/activate (有効化)
```

はじめ、tensorflow-rocm1.15.0を入れてみたところ、パッケージのimport時に`ImportError: libmcwamp.so: cannot open shared object file: No such file or directory`なるエラーに遭遇。
調べたところ、ROCmとtensorflow-rocmとの間のバージョン互換性の問題らしい（ https://github.com/RadeonOpenCompute/ROCm/issues/1126 ）。
[互換性の一覧表](https://github.com/ROCmSoftwarePlatform/tensorflow-upstream/blob/develop-upstream/rocm_docs/tensorflow-rocm-release.md)を参考に、今回はROCm3.5に対応しているtensorflow-rocm1.15.4を入れ直した。

```bash
pip install --upgrade pip
pip install tensorflow-rocm==1.15.4
```

## 結果
以上で、今のところはちゃんと動いているように見えています。
【#番外編:Amazon Lightsail】AmazonLightsail＋WordPressでサイトを立ち上げてみた

#はじめに

前章で作成したブログに、ちょこっと手を加える記事です。
（おまけ程度です）


前章はこちら：
> https://qiita.com/sasdos_engee/items/afa29d0654b5b5e38c24


#目次
　1.自サイトにドメインを設定する
　2.WordPress記事投稿時に、twitter投稿を行う


#1.自サイトにドメインを設定する

前章までで、ブログの解説が完了しました！！
....とはいえ、URLはIP直刺しのまま。
>http://176.34.37.122/

これでは格好悪いどころか、Twitterのプロフィール欄に
URL載せようにも　validateで引っかかって登録できない！！！笑

ということで、Lightsailで立ち上げたサーバに、ドメイン登録を行います。

######1.ドメインの取得
Route53を利用して、ドメインを取得しましょう。
以下のRoute53のコンソールから、登録していきます。

<img width="400" alt="スクリーンショット 2020-07-19 21.47.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675004/4b3f6fed-e674-c53d-72ba-43a336697a69.png">

<img width="400" alt="スクリーンショット 2020-07-19 21.49.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675004/b64b4bd7-9183-5b68-348d-145d8e964459.png">

1000円強/年　であれば、全然安い限りですね（年１昼飯我慢ってくらい）
個人情報や、メール認証を画面にしたがって登録していくと、
保留中のリクエストに申請ドメインが入るかと思います。

<img width="400" alt="スクリーンショット 2020-07-19 21.53.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675004/d7ca4d4c-ee15-9691-d1fd-a80dfd8e6088.png">

上記承認されるまで、気長に待ちましょう。


######2.IPとドメインの紐つけ
ドメインが登録されたら、
次はLightsailのコンソールから、IPとドメインを紐つけましょう。
※静的IPの取得も可能なようですが、頻繁に再起動行うこともないので、今回は動的IPへのドメイン紐つけを行います。

<img width="400" alt="スクリーンショット 2020-07-19 23.29.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675004/df8774e4-f0cd-6ec8-7537-489e92e18b8f.png">

以下のネットワークタブから、各種設定を行う。
※インスタンスごとのネットワークタブではなく、Lightsail全体のネットワークタブの部分です。

<img width="400" alt="スクリーンショット 2020-07-19 23.32.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675004/2faee928-fdbf-47bd-b88d-64f0801a4dff.png">

<img width="400" alt="スクリーンショット 2020-07-19 23.33.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675004/5919da4a-e921-967c-5650-6f975688af38.png">

生成を行うことで、DNSゾーンができたかと思います。
このタイミングで作成されたネームサーバーが、Route53にも既に登録されていたので
残りは、Aレコード登録です。
<img width="400" alt="スクリーンショット 2020-07-19 23.34.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675004/c3be2830-2405-1ecb-dd7e-ff2271cf1a0e.png">


Lightsailで立てたサーバのIP（今回は動的IP)を、
AレコードとしてRoute53に登録します。
Route53の 「ホストゾーンタブ>レコードセットの作成」で登録可能です。
※設定値モザイク面倒なので、画像なしで
※DNS周り含めて、一般的な知識の学習は、取りまとめて後日やります

これで、Lightsailで立ち上げたサーバのIPと、
発行したドメインが紐ついたはずなので、接続してみると....

<img width="400" alt="スクリーンショット 2020-07-19 23.47.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675004/8bc1d003-993e-59a2-7ec1-a9855f2a69b2.png">


>http://sasdosblog.com/

いけましたね！


#2.WordPress記事投稿時に、twitter投稿を行う

こちら、色々組み込まないといけないんだろうな〜と
身構えていたのですが、さすがWordPress。
色々なプラグインがあるのですね....!

以下のサイトを参考にさせていただき、無事Twitter投稿の設定も致しました！
>https://bazubu.com/how-to-connect-tw-and-wp-23533.html
Gitの解説動画一覧

# 概要
gitについて勉強しています．Youtubeにある動画の感想を残しておきます．

# 動画一覧
## [gitの目的や考え方など、現役エンジニアが解説](https://www.youtube.com/watch?v=EfWyidlfKxc)
最初にみるのに良いかも

## [【Git入門】サルでも分かるGit入門の前に！Git使い方高速入門編【入門は5分で十分だと思います】](https://www.youtube.com/watch?v=i1L3A0SLDyg)
聞いていてイラつく人もいるかもしれないが，テンポ良く説明してくれてわかりやすい（悔しいかな）．

## [【CC道場 #175】サルでもわかるGitスクール by Adobe x Nulab Creative Cloud -アドビ公式-](https://www.youtube.com/watch?v=4F1dzE_-zZs)
今後みたい動画．VScodeと取り合わせて説明してるっぽい．なんか馴染みやすい．
【五日目】最小限の構成でdocker-composeからKubernetesにデプロイする勉強会

# 概要

表題の勉強会を行った五日目の内容を記載します。全日の内容は以下のまとめページをご覧ください。

[【まとめ】最小限の構成でdocker-composeからKubernetesにデプロイする勉強会] (https://qiita.com/tamoco/items/5a5ffb448d59b3b03831/)


# 五日目のできたこと

- Kubernetes
  - GitLabでDeployTokenの作成
  - secretの作成

# 五日目の内容

四日目では公開されたイメージを元に`Kubernetes`で動作させることができました。ただしコンテナイメージを非公開にするとプルに失敗します。これを解決するため`secret`を作成します。

```bash
$ kubectl get po
NAME                           READY   STATUS         RESTARTS   AGE
express-app-7dc6d9dbcd-hqt7f   0/1     ErrImagePull   0          7s
express-app-7dc6d9dbcd-trxsf   0/1     ErrImagePull   0          7s
```


## GitLabでDeployTokenの作成

`GitLab`のプロジェクトのページ（ソースが格納されている？）から
`Setting > Repository > Deploy Tokens`と辿っていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412322/18ed4cee-5fa5-e4d5-6c7e-a96841208dc9.png)

以下のような設定でトークンを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412322/feba34e2-2ecb-b23e-a290-50afe03f3e8a.png)

表示された`ユーザー名`と`パスワード`をメモしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412322/dda7dbd2-a573-6dd2-90a7-c1fe8fd41c39.png)

## secretの作成

以下のコマンドで`secret`を作成します。

```bash
kubectl create secret docker-registry gitlab-secret --docker-server=registry.gitlab.com --docker-username=[ユーザー名] --docker-password=[パスワード]
```

作成した`secret`を`imagePullSecrets`として設定しておきます。

■ deployment.yml

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: express-app
  labels:
    app: express-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: express-app
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: express-app
    spec:
      containers:
      - image: registry.gitlab.com/tamoco-mocomoco/k8s-test/express
        name: express-app
        ports:
        - containerPort: 3000
          name: express-app
      imagePullSecrets:
        - name: gitlab-secret
```

`imagePullSecrets`を設定したモノを`apply`して`pod`を確認します。これで非公開なイメージでもデプロイすることができます。

```bash
$ kubectl apply -f deployment.yaml
deployment.apps/express-app configured

$ kubectl get po
NAME                           READY   STATUS    RESTARTS   AGE
express-app-7dc6d9dbcd-dsbw7   1/1     Running   0          37s
express-app-7dc6d9dbcd-wxmfl   1/1     Running   0          7s
```

# 五日目を振り返って

`Kubernetes`のサンプルアプリを調べると公開されたイメージから動作させるモノがほとんどなので、今回は非公開のイメージから動作させることにしました。一日一時間程度なので`kind`などの説明ができておらず、もう少し理解を深めつつ情報を展開していきたいところです。
【二日目】最小限の構成でdocker-composeからKubernetesにデプロイする勉強会

# 概要

表題の勉強会を行った二日目の内容を記載します。全日の内容は以下のまとめページをご覧ください。

[【まとめ】最小限の構成でdocker-composeからKubernetesにデプロイする勉強会] (https://qiita.com/tamoco/items/5a5ffb448d59b3b03831/)

# 二日目のできたこと

- GitLabのCI/CD pipelinesによるContainer RegistryへのPush

# 二日目の内容

`pipelines`でビルド及びプッシュするに`.gitlab-ci.yml`を作成しました。ここでのポイントは以下のとおりです。


- `docker-compose`は`docker:dind`に入っていないため追加する
- `$CI_REGISTRY_USER`などで予め`docker login`しておく

■ .gitlab-ci.yml

```yaml
image: docker:latest

stages:
  - test
  - build

variables:
  DOCKER_DRIVER: overlay

services:
- docker:dind

before_script:
- docker info
- apk update
- apk upgrade
- apk add docker-compose
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker-compose build

build:
  stage: build
  script:
  - docker-compose push
```

`.gitlab-ci.yml`によって`Packages & Registries`の
`Container Registry`にコンテナイメージが作成されていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412322/d9bb0848-f553-5b97-2ff2-00d8dd96aacc.png)

# 二日目を振り返って

`.gitlab-ci.yml`については`docker`のサンプルがあり、それを元に作成しました。`CI/CD`の`Pipelines`で成功・失敗が一目でわかるので、トライ＆エラーを重ねながら無事に作成することができました。今回は小規模の`.gitlab-ci.yml`の作成になるので、実際にプッシュして動作確認していますが、実際はGitLab Runnerのコンテナを用いて動作検証した方がよかったりします。

[Run GitLab Runner in a container] (https://docs.gitlab.com/runner/install/docker.html)
【一日目】最小限の構成でdocker-composeからKubernetesにデプロイする勉強会

# 概要

表題の勉強会を行った一日目の内容を記載します。全日の内容は以下のまとめページをご覧ください。

[【まとめ】最小限の構成でdocker-composeからKubernetesにデプロイする勉強会] (https://qiita.com/tamoco/items/5a5ffb448d59b3b03831/)


# 一日目のできたこと

- Node.js(Express)のアプリケーションの作成
- Dockerfileの作成
- docker-compose.ymlの作成

# 一日目の内容

カンタンにNode.jsでアプリケーションを作成しました。

■ アプリケーションフォルダ構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412322/d41eaf99-d540-c3b8-3bad-5c149884196b.png)


それらをコンテナで動作するようにDockerfileを作成しました。
WORKDIRでカレント及びフォルダを作成し、そのフォルダに対して`express`配下のファイルをコピーしています。

■ Dockerfile

```dockerfile
# ベースイメージを指定
FROM node:14.5-alpine3.12

# 環境変数設定
ENV NODE_ENV="development"

# 作業ディレクトリ作成&設定
WORKDIR /src

COPY ./express /src

RUN npm install

CMD npm run start

```

そして最後に`Dockerfile`を`docker-comopse`でも動作させるようにしました。
`GitLab`の`Container Registry`にプッシュするために`image`を設定し`latest`というタグも設定しています。本当はプッシュするときにイメージ名やタグを設定した方がよいのですが、今回は決め打ちで`image`に設定しています。

■ docker-compose.yml

```yaml
version: '3'
services:
  app:
    build:
      context: ./app      # Dockerfile保存場所
    image: registry.gitlab.com/tamoco-mocomoco/k8s-test/express:latest
    ports:                          # ポート接続
      - 3000:3000
```

# 一日目を振り返って

`Express`はサンプルがたくさんあるので手早くできました。`Dockerfile`から`docker-compose`も慣れれば難しくなく`build`と`context`さえ注意すれば大丈夫でした。

悩んだところとしてはフォルダの構成で少しフォルダを整理したりしました。今回の場合はExpress以外にもアプリケーションが増えたことを考えて`app`配下に`Express`という構成にしています。

もし他のアプリケーションが増えた場合は`app`配下に別のフォルダを作成して別に`Dockerfile`を作成することで構成がわかりやすくなると思っています。複数のアプリケーションになった時点で`Dockerfile`自体のファイル名もアプリケーションごとに変えたり、`docker-compose.yml`も`context`の`Dockerfile`を指定する必要が出てくると思います。

この辺については拡張する機会があった場合に、また記事として投稿させていただければ幸いです。
【まとめ】最小限の構成でdocker-composeからKubernetesにデプロイする勉強会

# 概要
`docker-compose`で作った最小構成のアプリケーションを元に`Kubernetes`にデプロイすることを目的に勉強会を行いました。平日のお仕事が終わったあとの１時間くらいを毎日続けて目的が達成できましたので、レポートとして残しておきます。

本来は一日一記事を投稿予定でしたが、平日のお仕事の都合もあるため、投稿までは即座に断念し後で投稿することにしました。一日ごとに記事として投稿し、このページはまとめページとして記載させていただきます。

# 目標

- 最小限の構成で`docker-compose`からアプリケーションを作成する
- `GitLab`の`CI/CD`を使ってみる
- テストコードを作りテストする仕組みを`CI/CD`に組み込む
- `docker-compose`のイメージから`Kubernetes`で動作させてみる

# なぜ開催したか？

以前に「やりたいことを実現するためのワークショップ」を開催しました。そこで興味あることとして「仮想化」が優先してやりたいことに挙がったため、今回その取っ掛かりになるような勉強会を開催いたしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412322/93cd5c96-4d10-8f5c-13d0-3701ebdcb7bc.png)


[やりたいことを実現するためのワークショップをやってみた] (https://qiita.com/tamoco/items/04380288190c0c9b31ba)

# 全日通してできたこと
- [一日目] (https://qiita.com/tamoco/items/090f70e5825fcb18bb44)
  - Node.js(Express)のアプリケーションの作成
  - Dockerfileの作成
  - docker-compose.ymlの作成

- [二日目] (https://qiita.com/tamoco/items/829270d149e72f41b8e1)
  - GitLabのCI/CD pipelinesによるContainer RegistryへのPush

- [三日目] (https://qiita.com/tamoco/items/0662162aa3557fbb5478)
  - テスト用のコンテナイメージの作成
  - CI/CD pipelinesにテストを組み込む

- [四日目] (https://qiita.com/tamoco/items/d9345b065cc6ca74f0f8)
  - Kubernetes
     - deployment.ymlの作成
     - service.ymlの作成

- [五日目] (https://qiita.com/tamoco/items/2a29427e3aaef736d8a6)
    - Kubernetes
     - GitLabでDeployTokenの作成
     - secretの作成

# 成果物

https://gitlab.com/tamoco-mocomoco/k8s-test/

# 全体を通して振り返り

平日の夜間の一時間程度の時間を使って少しずつ理解を深めていきました。もちろんスムーズに行かなかったところもありましたが、ハマったところも含めて勉強になったと思います。

ただ一日一時間だけとはいえ、それなりに目標を達成できたかなと。ちゃんと時間を作ってやることが大切なんだなと思います。

`Kubernetes`については、まだまだ理解できていないことも多く、もっと深く学習を深める必要があると感じました。

この勉強会で終わらせず`AWS EKS`へのデプロイや、データベースを作成して`Kubernetes`で`pvc`を使ったり、それらをどうやって`AWS`のサービスと連携させるのか進めていければと思います。
特定のフォルダに生成される一時ファイルの一括削除コマンド作成

非経験的分子軌道ソフト「Gamess」などでは任意のフォルダに「〜.dat」や「〜.F05」という謎の一時ファイルが生成し、Gamessでの計算が終了しても消えません。(無論、エラー終了でも消えません。)
と、いうことでこれらを一括削除できるコマンドとして「alias」コマンドを採用しました。

aliasコマンドとは、簡単にいうと自分の好きな文字列を使って、自分のよく使うコマンドや操作をターミナルに登録でき、どのディレクトリからでもそのコマンドを実行できるというものです。

では設定しましょう。

Gamessの一時ファイルは以下の場所に生成されるとします。
ユーザー名は「Qiita」にしましょう

/home/Qiita/gamess/tmp

このフォルダ内に生成されたファイルは、あるコマンドを打ったときには無条件に消したい。
ここでは「delete」という文字列をターミナルで打ったら上記のフォルダ内のファイルを全削除するように設定します。

```ruby:alias
alias delete='rm -rf /home/Qiita/gamess/tmp/*'
#alias (1) = '(2)'
```
(1)・・・登録する文字列
(2)・・・(1)を入力したときに実行するコマンド
上記例では、rm　コマンドを delete という文字列と紐付けましたが、別のコマンドでももちろんできます。コマンドが連続しない操作ではこのaliasを活用しても良いと思いました。

また上記のaliasコマンドはログアウトと共に登録は解除されてしまうので、
~/.bashrc に登録しておくと良いと思います。

お読みいただきありがとうございました。
PRML　演習問題 6.24 と解答（基本）

## 問題
>　対角行列 $ \mathbf{W}$ について、その要素 $ W_{ii}$ が $ 0 < W_{ii} < 1 $ を満たすとき、 $ \mathbf{W} $ は正定値行列となることを示せ。
　また、2つの正定値行列の和はやはり正定値行列となることを示せ。


## 方針
　正定値行列の定義は、

```math
\begin{align*}
「\mathbf{W}が正定値　⇔　\mathbf{x}^{\mathrm{T}} \mathbf{W} \mathbf{x} 　>0　　(\mathbf{x} \neq \mathbf{0})」
\end{align*}
```

となります。
　また、対角行列は対角成分以外の要素は全て０です。
　これらの定義や性質にしたがって、証明を行います。


## 解答
まず、行列 $ \mathbf{W} $ が正定値であることを示す。

```math
\begin{align*}
\mathbf{x}^{\top} \mathrm{W} \mathbf{x} &=\sum_{i, j} W_{i j} x_{i} x_{j} \\
&=\sum_{i} W_{i i} x_{i}^{2}>0 \quad\left(\because W_{i i}>0\right.)
\end{align*}
```

次に、２つの正定値行列 $\mathbf{A}, \mathbf{B}$ の和は、やはり正定値行列となることを示す。

```math
\begin{align*}
\mathbf{x}^{\top}\left(\mathbf{A}+\mathbf{B}\right) \mathbf{x}=\mathbf{x} ^{\top} \mathbf{A} \mathbf{x}+\mathbf{x}^{\top} \mathbf{B} \mathbf{x}>0　　　(\because \mathbf{A}, \mathbf{B}は正定値)
\end{align*}
```

よって、題意は示された。
エンジニアから信頼される人事を目指して～AtCoder Beginner Contest 参戦録 #2

# はじめに

社内外の優秀なエンジニア達から「技術トークが多少わかる人事」として信頼を得ることを目指して、AtCoder Beginner Contest（通称ABC）へ参加している。

経緯は前回記事 [エンジニアから信頼される人事を目指して～AtCoder Beginner Contest 参戦録 #1 - Qiita](https://qiita.com/nagamomo/items/b816ee4a42d79221a075) を参照のこと。その記事に書かれているが、最初の3回の戦績は、全てB問題まで。

今回は4,5回目の参加の簡易ふりかえりをまとめる。なお、使用言語は弊社フロントエンドで使われているJavaScript。

# AtCoder Beginner Contest ふりかえり

## 4回目の参加: ABC 173 （7/5開催）

- [公式解説](https://img.atcoder.jp/abc173/editorial.pdf)

### [A問題 - Payment](https://atcoder.jp/contests/abc173/tasks/abc173_a)

- 用意されていた17問のテストケースのうち2つ通らず不正解
   - 1000円札だけで支払えるケースを考慮し忘れた

### [B問題 - Judge Status Summary](https://atcoder.jp/contests/abc173/tasks/abc173_b)

- あまり悩まずに正答！（初）

### [C問題 - H and V](https://atcoder.jp/contests/abc173/tasks/abc173_c)

- 「選び方は何通りでしょうか」という聞き方に詰まってしまい、方針立たず、提出もできず

## 5回目の参加: エイシング プログラミング コンテスト 2020 （7/12開催）

- AIスタートアップ企業エイシング社の名を冠したコンテストだが、レベル感はABCと同等ということで参戦
- [公式解説](https://img.atcoder.jp/aising2020/editorial.pdf)

### [A問題 - Number of Multiples](https://atcoder.jp/contests/aising2020/tasks/aising2020_a)

- `%` と`==0` が使えそうなことが自力でわかり正答
- かなり速く解けた感覚があったが10分かかった

### [B問題 - An Odd Problem](https://atcoder.jp/contests/aising2020/tasks/aising2020_b)

- `%2==1` で奇数を判定できることがすぐわかり、正答
- かなり速く解けた感覚があったが7分かかった

### [C問題 - XYZ Triplets](https://atcoder.jp/contests/aising2020/tasks/aising2020_c)

- 「（条件）を満たすような3つの整数の組`(x,y,z)`の個数」という聞き方に詰まってしまい、方針立たず、提出もできず

# おわりに

最初から5回連続でB問題まで、という結果に終わった。とは言え、最初に比べたらパターンが自分の中に確実に蓄積され、悩む時間が減ってきた。継続は力なりである。

これまで毎週末開催されていたため、今週も参戦する気満々だったのだが、なんでもAtCoder社員の皆さんが外部のプログラミングコンテストに参加するそう[^1]で、今週はスキップ。さすがAtCoderの皆さん、競技プログラミングのプラットフォームを提供する上で、自ら競技者としても進化していこうというスタンスが（競プロひよっこの自分から見ても）かっこいい。

ひとまず目標としていた7月末までの継続参加チャレンジは来週の[M-SOLUTIONS プロコンオープン 2020](https://atcoder.jp/contests/m-solutions2020) で終わり。過去解きかけて諦めてしまったC問題を復習した上で臨み、正答して有終の美を飾りたいところ。もちろん、8月以降も参加を続けるが、6回の挑戦をふりかえった上で、新たな目標を設定するつもりである。

プログラミングを、普段の仕事の自動化できるところに取り入れたい、という欲も出てきたが、まずは目の前の目標のC問題完に集中しようと思う。

[^1]: https://twitter.com/atcoder/status/1283664874627715073
コードブロック(Code Block)とは？

あまり聞きなれない言葉だったので、簡単にまとめてみました。

#コードブロック(Code Block)とは

- プログラミング言語における**コードのまとまり**のこと。

- 単にブロックと呼ばれることもある。

- コードブロックの中に別のコードブロックが入っている入れ子構造の形をすることが多い。

- ブロックでまとまった機能を持ったり、内部の変数やシンボルのスコープ（通用範囲）を制限したりする場合がある。

- 行頭をインデントしたり、｛｝で囲ったりと言語によって表現が異なる。



参考サイト：https://gimo.jp/glossary/details/code_block.html
AtCoder 生活　90日目


[前回](https://qiita.com/flandrescarlet237/items/0890f84e9dc78235fdc1)

#90日目
今回は茶色diffの問題を3問解きました。

|問題|難易度|自力で解けた|かかった時間|
|:-:|:-:|:-:|---|---|
|ABC158|D|◯|21分15秒|
|Code Formula 2014 本選|C|◯|42分5秒|
|CODE FESTIVAL 2014 決勝|C|✕|28分27秒|


##[ABC158_D](https://atcoder.jp/contests/abc158/tasks/abc158_d)

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    string s;
    cin >> s;
    deque<char> ans;
    rep(i,s.size()){
        ans.push_back(s[i]);
    }
    int q;
    cin >> q;
    bool rev = false;
    rep(i,q){
        int t;
        cin >> t;
        if(t == 1){
            if(rev) rev = false;
            else rev = true;
        }
        else{
            int f;
            char c;
            cin >> f >> c;
            if(f == 1){
                if(rev) ans.push_back(c);
                else ans.push_front(c);
            }
            else{
                if(rev) ans.push_front(c);
                else ans.push_back(c);
            }
        }
    }
    int number = ans.size();
    if(rev){
        for(int i = number-1;i >= 0;i--){
            cout << ans[i];
        }
    }
    else{
        rep(i,number) cout << ans[i];
    }
}

```

解くのにかかった時間：21分15秒


##[Code Formula 2014 本選_C](https://atcoder.jp/contests/code-formula-2014-final/tasks/code_formula_2014_final_c)

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    string s;
    getline(cin,s);
    s = s + ' ';
    set<string> ans;
  	int num = 0;
    rep(i,s.size()){
        int j = i;
        if(s[i] == '@'){
            while('a' <= s[i+1] && s[i+1] <= 'z')i++;
            int r = i-j;
           	if(r != 0){
              	ans.insert(s.substr(j+1,r));
              	num++;
            }
          	else continue;
        }
    }
  	auto itr = ans.begin();
    while (itr != ans.end()) {
        cout << (*itr) << endl;
        itr++;
    }
}

```

解くのにかかった時間：42分5秒


##[CODE FESTIVAL 2014 決勝_C](https://atcoder.jp/contests/code-festival-2014-final/tasks/code_festival_final_c)

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(ll i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;
 
const int INF = 2e9;
 
ll f(ll k){
    ll ret = 0;
    ll pow = 1;
    ll k2 = k;
    while(k2 > 0){
        ret += k2 % 10 * pow;
        pow *= k;
        k2 /= 10;
    }
    return ret;
}
 
int main(){
    ll a;
    cin >> a;
    for(ll k = 10;k <= 10000;k++){
        if(f(k) == a){
            cout << k << endl;
            return 0;
        }
    }
    cout << -1 << endl;
}

```

解くのにかかった時間：28分27秒
感想：なかなかこの問題が解けない


###最後に
安定して15分ぐらいで解けることを目標にして頑張っていきたい

難易度|かかった平均時間|解けた問題数|
|:-:|---|---|
|C|42分5秒|2問中1問|
|D|21分15秒|1問中1問|
LaTeX表記の数式を画像で返送するLINE botの作成

`$ax^2+bx+c=0$`のように$記号でLaTeX表記の数式を囲むと、画像が返送されます。なお、1つのメッセージにつき1つの数式を返すことができます。
<img width="954" alt="スクリーンショット 2020-07-19 23.26.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332413/c28d74b1-c19f-61b6-4702-c739f9edb8a3.png">
LaTeX表記については、http://www.latex-cmd.com をご覧ください。

# 友だち追加
[ここから](https://lin.ee/ENQxnBk)友だち追加をすることができます。

## 開発
以下の参考を読み、実装しました。

### 参考
- https://github.com/line/line-bot-sdk-ruby
- https://developers.line.biz/ja/reference/messaging-api/
- https://developers.google.com/chart/infographics/docs/formulas

Google Chart APIの数式は非推奨となったようなので、いつ使えなくなるかはわかりません。
CGIモジュールを使用しているのは、`+`などの記号をエンコードする必要があるためです。

```callback.rb
class LinebotController < ApplicationController
  require 'line/bot'
  require 'cgi'

  protect_from_forgery :except => [:callback]

  def client
    @client ||= Line::Bot::Client.new { |config|
      config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
      config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
    }
  end

  def callback
    body = request.body.read

    signature = request.env['HTTP_X_LINE_SIGNATURE']
    unless client.validate_signature(body, signature)
      head :bad_request
    end

    events = client.parse_events_from(body)

    events.each { |event|
      case event
      when Line::Bot::Event::Message
        case event.type
        when Line::Bot::Event::MessageType::Text
          if event.message['text'].include?('$')
            formula = CGI.escape(event.message['text'].match(/(?<=\$)(.*)(?=\$)/).to_s())
            message = {
              type: "image",
              originalContentUrl: "https://chart.apis.google.com/chart?cht=tx&chl=#{formula}",
              previewImageUrl: "https://chart.apis.google.com/chart?cht=tx&chl=#{formula}"
            }
            client.reply_message(event['replyToken'], message)
          end
        end
      end
    }

    head :ok
  end
end
```
UiPathの実行ログをグリッドビューで確認する

Orchestratorに出力されたログではなく、ローカルに出力されたログファイルを確認する方法


#コード
```powershell
# ログファイルのパスを取得する
# 現在日のログファイルのパスを取得する例
$LogFilePath = $env:LOCALAPPDATA + ("\UiPath\Logs\{0:yyyy-MM-dd}_Execution.log" -f Get-Date)

# PowerShellコンソール上で以下のコードをコピペする
# 表示したい項目(列、カラム)があれば select の引数を追加すること
cat $LogFilePath |
    %{ $_.Split(" ", 3)[2] } | ConvertFrom-Json |
    select @{n="timeStamp";e={([DateTime]$_.timeStamp).ToString("yyyy/MM/dd HH:mm:ss.fffffff")}},
        level,message |
    ogv -Title UiPath実行ログ

```

#実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85927/657449f2-f546-71e5-d939-4c02a40d1e73.png)
JavaScriptのスプレッド構文について

JavaScriptのスプレッド構文について簡単まとめたので、備忘録もかねて記事を書いてみます。

# スプレッド構文の概要

>
スプレッド構文を使うと、配列式や文字列などの反復可能オブジェクトを、 0 個以上の引数 (関数呼び出しの場合) や要素 (配列リテラルの場合) を期待された場所で展開したり、オブジェクト式を、 0 個以上のキーと値のペア (オブジェクトリテラルの場合) を期待された場所で展開したりすることができます。

これだけだとよくわからないので、実際の例を書いていきます。

# 配列

...（ピリオド３つ） と書くことで個々の値に展開することができ、それを結合させることができます。
これだけだと`concat()`と結果は変わらないですね。

```js:例１
const animals = ["犬", "猫"];
const sports = ["野球", "サッカー"];
const foods = ["パン", "ご飯"];

const result1 = [...animals, ...sports];
console.log(result1); // ["犬", "猫", "野球", "サッカー"]

const result1 = [...animals, ...sports, ...foods];
console.log(result1); // ["犬", "猫", "野球", "サッカー", "パン", "ご飯"]
```

　　
以下のようにスプレッド構文は任意の位置で配列を展開させることができます。

```js:例２
const animals = ["犬", "猫"];

const result1 = ["saru", ...animals, "tori"];
console.log(result1); // ["saru", "犬", "猫", "tori"]
```
　　

文字列に対し、スプレッド構文を使用すると文字列が分解されます。
文字列を配列に結合させたい場合は、配列内にそのまま配置すればOKです。　

```js:例3
const animals = ["犬", "猫"];
const koumori = "こうもり";

const result1 = [...animals, ...koumori];
console.log(result1); // ["犬", "猫", "こ", "う", "も", "り"]

const result2 = [...animals, koumori];
console.log(result1); // ["犬", "猫", "こうもり"]
```
　　

重複を排除したい場合はSetを使います。

```js:例4
const animals = ["犬", "猫", "犬", "猫", "鳥"];
const result1 = [...(new Set(animals))];

console.log(result1);    // ["犬","猫","鳥"]
```

# オブジェクト

スプレッド構文を使うとオブジェクトのマージが簡単にできます。
3つ以上のオブジェクトでも同じようにマージすることができます。

```js:例1
const test1 = { name: "犬"};
const test2 = { color: "black"};

const result1 = { ...test1, ...test2 };
console.log(result1); // { name: "犬", color: "black" }
```
　　

プロパティー名が同じ場合はあと勝ちです。

```js:例2
const test1 = { name: "犬", color: "black"};
const test2 = { name: "猫", color: "white"};

const result1 = { ...test1, ...test2 };
console.log(result1); // { name: "猫", color: "white" }
```
　　
  
最後まで読んでいただきありがとうございますm(__)m
#1 Markdown の記載法～自分用メモ～

<br>はじめまして、もえです。
記事をご覧頂きありがとうございます。
# ■ まずは軽く自己紹介
未経験新卒SEとして、今年の4月から東証一部上場企業にSEとして就職しました。
･･･が、何せ未経験。更に4月～最近までほとんど在宅勤務だったため、一人で何も分からぬまま、
ひたすらプログラミングの課題を解く日々。
毎日出社して仕事をするよりは楽なのかもしれませんが、あの時の私は誰にも相談できず、けれど問題は意味すら分からず、毎日絶望していました。涙<br>
まぁそんな中でも書籍やインターネットを駆使してなんとか配属されたのを機に、このブログを書くことにしました。
書こうと思った理由は、その日学んだことを自分なりにまとめることで理解を深めたいということと、少しでも同じような境遇の方の役に立ちたいと思ったからです。<br>
私のブログが少しでも、誰かのお役に立てれば幸いです。<br>
# ■ Qiitaで使うMarkdown
とりあえず自分用に、Qiitaで使えるMarkdownをメモしていこうと思います。<br>
## 1. 見出し
文頭に「#」をつけることで、見出しを付けることが出来ます。
「#」の数によって見出しの大きさが変わります。

># 見出し1
\# 見出し1
>## 見出し2
\# 見出し2
>### 見出し3
\### 見出し3
>#### 見出し4
\#### 見出し4
>##### 見出し5
\##### 見出し5

<br>
## 2. 引用
文頭に「>」を付けることで、引用文を書くことが出来ます。

> 
ここに引用文を書きます。
>>改行する時はその都度「>」を書く必要があります。
>>>「>」の個数によって引用文を増やすことが出来ます。

<br>
## 3. リスト

文頭に「*」「+」「-」のいずれかを入れるとリストになります。

> * 項目1
> + 項目2
> - 項目3

> \* 項目1
> \+ 項目2
> \- 項目3

<br>
#### チェックボックス
「*」「+」「-」で作成したリストの後に[ ]もしくは[×]を入れることでチェックボックスを生成することが出来ます。

> - [ ] チェックボックス(空)
> - [x] チェックボックス(満)

<br>
- 文頭に数字を入れると、数字付リストになります。<br>後からの挿入、移動を考慮して、1. 2. 3. と順番に入れるのではなく、1. 1. 1. と入れておくといいです。

> 1. 項目1
> 1. 項目2
> 1. 項目3

> \1. 項目1
> \1. 項目2
> \1. 項目3

<br>
## 4. イタリック、太字
- 文を「_」または「*」で囲むと、イタリック表記になります。

> _Italic_
> \_Italic_
> *Italic*
> \*Italic*

<br>
- 文を「__」または「**」で囲むと、太字表記になります。

> __Italic__
> \__Italic__
> **Italic**
> \**Italic**

<br>
## 5. 打消し線
文を「~~」で囲むと、打消し線が利用できます。
> ~~あいうえお~~
> \~~あいうえお~~

<br>
## 6. 水平線
「*」または「-」を3つ以上一行に書くと、以下は全て水平線になる。

> \***
> \* * *
> \---
> \- - -
>
> 全部以下の水平線

> ---

<br>
## 7. リンク
- \[リンクテキスト](URL "タイトル")
  - タイトル付きのリンクを投稿出来る。

>Markdown:\[Qiita](http://qiita.com "Qiita")
結果：[Qiita](http://qiita.com "Qiita")

- \[リンクテキスト](URL)
  - タイトルなしのリンク

>Markdown:\[Qiita](http://qiita.com)
結果：[Qiita](http://qiita.com)

<br>
## 8. テーブル
基本的に文を「|」で囲むことで表を作成することが出来ます。
2行目のコロンの位置によって、セル内の文字の配置が変わるのがポイントです。

> |左揃え|中央揃え|右揃え|
|:---|:---:|--:
|align-left|align-center|align-right|
|セルの左揃えです|セルの中央揃えです|セルの右揃えです|

<br>
## 9. コードの挿入
文頭、文末を下記のようにで囲むことで、コードを挿入することが出来ます。
また、「プログラミング言語名:クラス名」を書くことで、クラス名を入れることも出来ます。
クラス名でスペースを使いたい際は、「\&nbsp;」と入力することで全角スペースを入力します。<br>

>(空行)
```java:Main
public static void main(String[] args){
}
```
(空行)

```java:Main
public static void main(String[] args){
}
```

<br>
## 10. 数式の挿入
コードブロックの言語指定に"math"を指定することで、TeX記法を用いて数式を記述することが出来ます。

> \```math
\left( \sum_{k=1}^n a_k b_k \right)^{!!2} \leq
\left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right)
```

```math
\left( \sum_{k=1}^n a_k b_k \right)^{!!2} \leq
\left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right)
```

<br>
## 11. Markdownの無効化
Markdownの前に「バックスラッシュ \」を挿入することでMarkdownを無効化することが出来ます。

> \# 見出し
> \\# 見出し

<br>
## 12. ページをMarkdownで見る
Qiitaなどのサイトで、記法が気になるサイトがある時は、Markdown記法で見たいURLの最後に「.md」を付ければ見ることが出来ます。<br><br>
このページは、[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)を参考に作成しました。
では、また投稿します。<br>
ソフトウェアの品質　～「品質」ってなに？～

# はじめに
ソフトウェアの品質とは何か？という質問に対して、皆様はどうお答えになるでしょうか？
一言に「品質」と言っても、さまざまな答えがあると思っています。

・機能が要求通りに動くこと
・簡単には壊れないこと
・バグが少ないこと
・ユーザの要求にこたえていること

などの回答ができるかと思います。
ソフトウェア以外の分野においても「品質」という言葉は使われますが、
いずれの場合にも「品質」を正しく定義することは非常に難しいことかと思います。

今回はこの「品質」について、少しだけ記事を記述しようと思います。
なおこの記事に**「品質」とはこうだ！**ということは記述していませんので、
予めご了承ください。

# 品質とは
はじめに　でも記述しましたが、「品質」とは何なのでしょうか？
ここでは「品質」についての定義をいくつか紹介しようかと思います。

## ISO9000シリーズ
ISO9000とは、国際標準化機構(ISO)による5つの規格から構成されています。
ここでは、「品質」について以下のように定義されています。
**● 製品またはサービスが所与の品質要求を満たしていることの妥当な信頼感を与えるために必要なすべての計画的および体系的活動**


## JIS Q9000:2015
前述のISO9000は規格の用語集となっており、これを日本語訳したものがJIS Q9000となります。
ここでは、「品質」について以下のように定義されています。
**● 対象に本来備わっている特性の集まりが、要求事項を満たす程度**
とされています。

## クロスビーの定義：「要求に対する適合」
元軍人で朝鮮戦争にも従事した、ソフトウェア工学の専門家P.Crosby博士は
1979年に発行した「Quality is Still Free」の中で品質についてこう述べている。

1. The definition of quality is conformance to requirements (requirements meaning both the product and the customer's requirements)
2. The system of quality is prevention
3. The performance standard is zero defects (relative to requirements)
4. The measurement of quality is the price of nonconformance

顧客のニーズに基づいて自ら設定した要求に対して合致していることが、優れた品質であるとした。

## ワインバーグの定義：「品質は誰かにとっての価値である」
G.Weinberg博士は前述のクロスビーの定義について、
「要求が正しい限り、優れた定義になる」として、
自著「ワインバーグのシステム思考法」の中で、品質についてこう述べている
**● 品質は誰かにとっての価値である**

「誰か」とはユーザであったり、開発であったり、販売元の場合もあり得る。
そのため、クロスビーの言う「要求」はとても曖昧なものとなる。（実際そうだしね）
~~ユーザは使いやすく、開発は保守しやすく、運用はバグがなく止まらないとか~~


## ジェームズ・マーチンの定義：「システムが稼働するとき、どこまで真のビジネス（ユーザ）ニーズに合っているかということ」
Martin.J氏は自著「ラピッド．アプリケーション.ディペロップメント」の中で、
品質についてこう述べている。
**開発期間が長期化すると、当初のユーザーニーズを把握していても、完成する時には変化しているということが良くある**
そのため、ユーザが製品を使用する時点で、そのユーザーニーズをどの程度満足しているかが重要であるとして。
ただし「ユーザ」が誰であるかは重要な問題でもある。
※ワインバーグの定義同様、ユーザとは誰なのかが問題となる

# まとめ
うまく表示されないかもしれませんが、表にまとめてみました。

|品質定義|参考元|
|--------|-----|
|製品またはサービスが所与の品質要求を<br>満たしていることの妥当な信頼感を<br>与えるために必要なすべての<br>計画的および体系的活動|ISO9000シリーズ|
|対象に本来備わっている特性の集まりが、要求事項を満たす程度|JIS Q9000:2015|
|要求に対する適合|クロスビーの定義|
|品質は誰かにとっての価値である|ワインバーグの定義|
|システムが稼働するとき、どこまで真のビジネス（ユーザ）ニーズに合っているかということ|ジェームズ・マーチンの定義|

# 終わりに
今回は品質の定義について簡単にまとめてみました。
ここでは取り上げていない定義や規格もありますが、代表的であろうと思うものをまとめています。

「品質ってなに？」というタイトルにしていますが、これはずっと課題として残るものかと思います。

技術は進化していき、要求されるニーズも変化をし続けていきます。
そのため、「品質とはこうだ！」と決めるのではなく、
「品質とはなにか」を常に問い続けて対応していくことが大切だと思いますし、
そうしていくことが必要だとも思います。
【環境構築】データサイエンス100本ノック（構造化データ加工編） Mac 解説

- データサイエンス100本ノックをやりきる会を作りました🎉
- こちらの[Slack招待URL](https://join.slack.com/t/data-science-100nocks/shared_invite/zt-gfncg9vm-8W8b3UrDg8R~TKaqUkQpgw)からご参加ください！！
- ぜひ一緒に励まし合いながら、データサイエンス100本ノックをやり切りたいと思っています！

#環境構築の手順
・Macユーザーがデータサイエンス100本ノック（構造化データ加工編）を始められるように、環境構築について解説しています。
・以下の手順に沿って、操作してください。[こちらの操作画面動画](https://youtu.be/zQn56uotQRk)も参考にしてください。

##1.workフォルダの作成
・データサイエンス100本ノックのリポジトリからクローンするためのフォルダを作成します
※初めてクローンする人は、わかりやすいようにデスクトップにworkフォルダを作成することをおすすめします

##2.ターミナルでworkフォルダへ移動
・ターミナルを開き、以下のコマンドを入力して、Enterを押します
・workフォルダへ移動することができます

```
cd Desktop/work
```

##3.データサイエンス100本ノックのリポジトリからクローン
・workフォルダ上にデータサイエンス100本ノックのリポジトリからクローンします
※クローンとは、「複製」という意味です。GitHubのリモートリポジトリにあるフォルダやファイルを、ローカルリポジトリに複製します。
リモートリポジトリとは、WEB上に保管している場所のことを指し、ローカルリポジトリとは、PC上で保管している場所のことを指します。

```
git clone https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess
```

##4.クローンしたフォルダへ移動
・ターミナル上でクローンしたフォルダへ移動します。

```
cd 100knocks-preprocess
```

##5.Docker Desktopのインストール
・[Docker Desktop](https://www.docker.com/products/docker-desktop)へアクセスし、ダウンロードボタンからダウンロードを開始する
※[解説動画](https://www.youtube.com/watch?v=OOWazY5pIdA&feature=youtu.be)の4:06〜が参考になります

##6.インストールしたDocker DesktopでDocker imageをbuild
・インストールしたDocker Desktopをダブルクリックして開き、Docker imageをbuildする
※Docker imageとは、Dockerコンテナの実行に必要なパッケージのことを指します。コンテナとは、OS上にアプリケーションの起動に必要なアプリケーション本体・必要なライブラリ・設定ファイルなどをひとまとめにしたものです。
※buildとは、「実際のプログラムを作る」という意味です。
※[操作画面動画](https://www.youtube.com/watch?v=zQn56uotQRk)の0:35〜が参考になります

##7.Docker Desktopへログインする
・IDとパスワードを入力してログインします。
※未登録の方は、Docker Desktopへの登録からしてください

##8.コンテナ作成コマンドの実行
・コンテナ作成コマンドを実行し、コンテナを作成する

```
docker-compose up -d --build
```
※[操作画面動画](https://www.youtube.com/watch?v=zQn56uotQRk)の1:27〜が参考になります

##9.JupyterLabへ移動
・[localhost](http://localhost:8888)へアクセスし、JupyterLabへ移動する

##10.100本ノックを開始
・該当のファイルを開き、100本ノックを開始してください！
・[Youtubeチャンネル](https://www.youtube.com/channel/UCTlYOPxRSD2MWzOCFeaQM1g)やQiita記事にて、問題の解説を行っているので、ご参考にしてください
【勉強】エンジニアの学び方を考える


# 最近

情報工学を勉強する方法が増えたと思う。
同時に
インフラ業務の従事者について思うことがありました。

--------------------------------
# 学習する手段は増えたが

目的を忘れてエンジニアの勉強をする人は多い。
そう感じます。

一応、断っておきますと
目的なく勉強することについては

個人的な趣味の話になりますので
やりたい人はやればいいと思います。

ただ、ちゃんと将来を見据えて勉強するのであれば
業界の市場や自分の得意分野を把握したうえで
何を身につけるかどのように活躍していくか

しっかりと、マネタイズとブランドを考えたほうが良いと思います。

それに加えて思うに「考える力」を
身につけられるように努力をしたほうが良いです。


--------------------------------
# 聞いた話から察するに

エンジニアになるための
学習方法や教材が溢れている。

最近はエンジニアになりたい初学者をターゲットに
**高額でアヤシイ情報商材**を売るということが
横行しているらしい。

聞いていて思うのですが
**高額でアヤシイ情報商材に**
**騙されるようなレベルのITリテラシーの人は**
**エンジニアには到底なれません。**

反対に
**そのような高額な情報商材を売る人に**
**優秀なエンジニアはいません。**

優秀なエンジニアの定義ですが
私が思うに
キャリアの軸足を築いていて
その道の鍛錬を欠かさない存在だと思います。


--------------------------------
# その道の鍛錬とは

学習と勉強です。
そして、ずっと前から
必要であると感じている能力として
**「考える力」**だと私は思います。

最近のことですが
それを改めて痛感したことがありました。

結論から申し上げますと
考えぬく能力を持つエンジニアは身の回りでもそんなに多くないということです。

ある問題に対して
めちゃくちゃ考えていそうな人でも
質問したら何も考えていない。

走りながら考えるということであれば
質問した時に考えていないことは
あるかもしれませんが

**「本当に何も考えていない」**

そんなエンジニアがいらっしゃるのです。

--------------------------------
# そもそも

エンジニア以前に「考える」ことを
放棄してしまう人類が日本には多いような気がします。

こういう話をすると
便利なモノが人をダメにするなどと言って
前時代的なやり方に固執したり強要する人がいますが

私が思うにそれは便利なモノが悪いのではなく
便利なモノを扱う人自体が悪いというだけの話です。

「考える力」があれば人は「考える」ことから逃げないのです。

--------------------------------
# 話は逸れましたが

自分なりに
エンジニアになる為の勉強方法と注意点について書きたいと思います。

勉強方法

>>・公式ドキュメントを読む
>>・日頃からアンテナを張り、IT系の記事を読む
>>・多くの教材に触れて好きな著者を見つける
>>・同じ内容を学習する仲間を作り、共有する
>>・ベテランのエンジニアさんが共有するメディアを積極的に読む聞く

ここまでやったらあとは
読んだり聞いたり共有したことを
自分なりにまとめて記事にしたり実践してみる。

注意すべきこと

>>・ドキュメントや記事読みすぎで何もせずそのままわかった気にならないこと
>>・教材を何週もするような素振りはしないこと
>>・相手の勧める内容を頭から否定することなくまずは聞いてみること
>> ※あきらかに何かを買わせようとする内容やその人物がアヤシイ経歴の人であれば跳ねてヨシッ！

デデデデ

エンジニアの勉強をする上で大事なことは
「考える力」を磨くことです。
エンジニアは考えて何かを全うする仕事です。


---
# インフラ業務の従事者について

> インフラの保守業務は頭の悪い人でもできる

そんな噂を聞いて考えてみたのですが

> 既存のネットワークを手順書通りに変更する業務って
> 考えなくてもできること

手順書をつくるというなどの上位レイヤーに仕事は
頭の良い人の仕事になるのですが
実際にそういう手順書を使う人は頭の悪い人の仕事になる。

実際にそういう手順書を使う人達は
あまり競争性がなく優位性もない。
量産型のエンジニアよりもひどい現状なのではないかなと思います。

私自身、業務を標準化するツールの作成に携わっているのですが

> 実際に作業をする人は手順書外のことが起きると
> 途端に何もできなくなる。

そういう人たくさん見かけます。
結局のところ私や上司に頼る状況になるのですが

正直に思うところを話すと
自分で考えて行動できないのだろうかと
頭を抱えてストレスになるくらい考えてしまいます。

もちろん、上司に指示を仰ぐことは大事なことですが
それ以前に考えていない、業務を理解していないということは
問題提起すべきだなと感じます。

---
# まとめ

学習教材やアヤシイ情報商材の話、学習方法などあれやこれや
お話致しましたが

ずばりここで言いたいことを言うと

「考える力」を身につけようよと
そういう話です。

職場にクレクレやテイカーが増えると
生産性はかなり落ちます。

すげー単純な話、そういう人と一緒に仕事がしたいですか。
もしくは生産性を下げる側の人になりたいですか。
そうならないためにも「考える力」を身につけましょう。


--------------------------------
# おわり

[ドラッカーさんに教わった IT技術者のための50の考える力](https://www.amazon.co.jp/dp/4798047473/ref=cm_sw_r_cp_apa_i_J6ffFbRK4S2CG)