OmniAICreator/Qiita-1.07M huggingface dataset:
監視ツールから通知こないから安心してたら動いていなかった件

# なにがあった

バッチ処理が正常に完了しているかチェックしてNGだったらメールを送る監視ツールをshellで開発し、cronで定期実行するように設定。

リリース以来、エラーメールも来てないし順調！

***7年後・・・***

バッチ処理増えたからcronに監視設定追加するか〜。
設定追加して、念の為動作確認！

あれ？

`-bash: mail: command not found`

**mailインストールしてなかった**

# どうしてそうなった

**本番環境にmailインストールするの忘れてました。**
メールが飛ぶことのテストもしてませんでした。

そういえば、これまでにエラーメールが来ても良いタイミングがあったような・・・。

# どうすればよかった

意図的にエラーの状態作って、ちゃんとエラーメールが飛ぶとこまで確認しないとダメでした。

また、cronで実行すると実行したいコマンドのパスが通ってなくてエラーになる場合があるので、コンソールではなくcronで実行して動作するかも確認しましょう。
Obsidianの小技その4｜マンスリーノートからはじめる

### はじめに

つねに開きっぱなにしているMarkdownメモツール[Obsidian](https://obsidian.md)。1年以上使い続けて発掘した、ストレスフリーにちょっとでも近づける、いいかんじのつかいかたをご紹介します。

### マンスリーノートからはじめる

Obsidianの解説を読んでいるとよく「デイリーノートがおすすめ」と書いてあります。標準プラグインもデイリーノート用につくられています。わたしもいまはデイリーノートをつかっていますが、半年ぐらいはマンスリーノートでつかっていました。マンスリーノートでObsidianに慣れる期間があったからこそ、デイリーノートをうまく使えるようになったんじゃないかとおもいます。「デイリーノートはちょっとハードル高いなあ」という場合、マンスリーノートからはじめるのもおすすめです。

### 具体的な手順

#### マンスリーノートをつかう準備

- 設定 > オプション > コアプラグインで`デイリーノート`をONにします
- 設定 > プラグインオプション > デイリーノート > 日付の書式を`YYYY-MM00`とします

<img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/masatora_bd5/20211222/20211222184721.png" width=60%>

- 設定 > ホットキーで検索窓に`デイリーノート`と入力し、`今日のデイリーノートを開く`にショートカットキー`cmd + T`を割り当てます

<img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/masatora_bd5/20211222/20211222184714.png" width=60%>

#### マンスリーノートを実際につかう

##### マンスリーノートをひらく

Obsidianのどこにいても`cmd + T`を押すと、マンスリーノートが開きます。ファイル名は、`2021-1200`のようになっています。

<img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/masatora_bd5/20211222/20211222185215.png" width=60%>

2021年の12月のあいだは、`cmd + T`を押すと、`2021-1200`ファイルにジャンプします。2022年1月になると、`2022-0100`ファイルにジャンプするようになります。

##### マンスリーノートの実例

ChangeLogメモスタイル

<img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/masatora_bd5/20211222/20211222190119.png" width=60%>

内部リンクスタイル

<img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/masatora_bd5/20211222/20211222190615.png" width=60%>

Obsidianでは、「メモはどこかからリンクされている」のがありがたいです。ですので、あたらしいメモをつくろうとおもったとき、下記のいずれかを選択します。

1. いま現在のメモから内部リンクを貼れば済む→`[[`と打ってファイル名を入力し、新しいメモファイルに書き込みます
1. どこかのメモから内部リンクを貼りたい→そのメモに移動し、`[[`と打ってファイル名を入力し、新しいメモファイルに書き込みます
1. どこからリンクを貼ればいいかすぐにわからない→マンスリーノートをひらいて、そこに書き込む（changelogスタイル）か、`[[`と打ってファイル名を入力し、新しいメモファイルに書き込みます。


### おわりに

メモツールをつかうときに「どこに書くか」を検討するのに、意外と脳のリソースを消費します。マンスリーノートを用意しておけば、ともかく`cmd + T`を押せば、わたしの限られた脳のリソースを消費せず、次に進めるので、ストレスフリーに一歩近づけて、たいへんありがたいのです。

### ご参考

[横着プログラミング 第1回: Unixのメモ技術](http://0xcc.net/unimag/1/)
→われわれ世代のエンジニアのメモ技術に大きな影響を与えた`ChangeLogメモ`の原典。長年つかっているうちに形式はすっかり独自になってしまいましたが、基本的思想はこの20年、ずっとTakabayashi氏の記事から変わっていないとおもいます。

[Obsidian｜使いかたとコツ（目次）](https://qiita.com/hann-solo/items/ac8fa75394813e8adcf4)
ITフリーランスのおまえらに来年初からの電子帳簿（≒レシート）保存法について渋谷税務署に確認したことをシェアする

## はじめに
法律は無駄に複雑でよくわからんよな。なんであんなに難しく書けるんだろう。電子帳簿保存法を覚えるとむしろ手間は省けるぞ

## サマリー
- 紙
    - 必要なものを買ったり取引先とメシを食った
    - 領収書をもらう
    - ファイルに閉じる
        - [コクヨ ファイル 領収書ファイル](https://www.amazon.co.jp/KOKUYO-%E6%98%8E%E7%B4%B0%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB-%E3%81%8B%E3%81%9F%E3%81%A5%E3%81%91%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB-24%E3%83%9D%E3%82%B1%E3%83%83%E3%83%88-%E3%83%A9-YR510B/dp/B000VAEQ4A?pd_rd_w=j7BIS&pf_rd_p=20aad79e-ae62-44d5-9c8a-50217a7d3e27&pf_rd_r=EDQYQAZ78YSSVRXWYRT0&pd_rd_r=e1b85aa3-834d-420c-865b-85697a5c4570&pd_rd_wg=h0Biq&pd_rd_i=B000VAEQ4A&psc=1&ref_=pd_bap_d_rp_3_i) がおすすめ
    - freeeで記帳（ソフトは好きにせい）
- アマゾン（とかフルデジタルで済んでしまうもの）
    - 必要なものを買った
    - 領収書をPDFで発行
    - クラウドドライブ（OneDriveとかGoogleドライブとか）に保存するとタイムスタンプがつく
        - ファイル名はこう「20221130_Amazon_20000.pdf」
        - 修正が発生したら同じ名前で保存すればバージョン管理されている
    - freeeで記帳（ソフトは好きにせい）

かんたんだろ？
いままではアマゾンのPDF領収書をプリントアウトして、領収書ファイルに綴じ込んでいたはずだ。むしろ事務ステップは減る

ちなみに、freeeで電子帳簿保存法に対応するためにプランのアップグレードを検討すると、それだけのためにプレミアムプランにしなくてはならなくなり、つらい

1月アップデートでスタータープランでもできるようになったみたい（月5回）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94562/eb8b0ea5-8905-6491-a6de-b64ca6122e22.png)
C++Builder小ネタ集

# はじめに
C++Builder固有のよくあるHow To集です。
# Windowメッセージハンドラの追加
Delphiは言語機能で持ってるけど、C++ではウインドウ(フォーム)のメッセージマップを作成する必要があります。
以下は`WM_DROPFILES`を処理する例です。
`TWMDropFiles`型がVCLで宣言されていない場合は、一般的な`TMessage`型で受ける必要があります。

```C++:form1.h
class TForm1 : public TForm
{
protected:
  void WMDropFiles(TWMDropFiles& mes);  //実際の処理関数

  //メッセージマップ
  BEGIN_MESSAGE_MAP
    //                  メッセージ定数  処理関数の型   処理関数名
    VCL_MESSAGE_HANDLER(WM_DROPFILES, TWMDropFiles, WMDropFiles)
  END_MESSAGE_MAP(TForm)
}
```
[DocWiki：新しいメッセージ処理メソッドの宣言](https://docwiki.embarcadero.com/RADStudio/Alexandria/ja/%E6%96%B0%E3%81%97%E3%81%84%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E5%87%A6%E7%90%86%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AE%E5%AE%A3%E8%A8%80)

# DLLとの暗黙的リンク
暗黙的リンクとは、実行ファイルのロード時にDLLが必要なリンク方式で、`LoadLibrary()`を使わない方式です。
使用するDLLが存在しない場合は、実行ファイルは起動出来ません。

DLLとリンクするためには、インポートライブラリ(.lib)が必要です。
インポートライブラリはリンカに入力ファイルとして指定します。
一般的に配布されているDLLにはVC++で生成されたインポートライブラリが添付されていますが、フォーマットが違うためC++Builderのリンカでは使用できません。
インポートライブラリは使用したいDLLから簡単に生成出来ますが、32bit/64bitで方法が異なります。

## インポートライブラリの生成(32bit)
32bit版のインポートライブラリは`implib.exe`で生成します。
FTDIのD2XX-API DLLのインポートライブラリ生成の例です。

```
>implib ftd2xx.lib ftd2xx.dll
```
[DocWiki：Win32 用インポート ライブラリ ツール：IMPLIB.EXE](https://docwiki.embarcadero.com/RADStudio/Alexandria/ja/Win32_%E7%94%A8%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88_%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA_%E3%83%84%E3%83%BC%E3%83%AB%EF%BC%9A_IMPLIB.EXE)

## インポートライブラリの生成(64bit)
64bit版のインポートライブラリは`mkexp.exe`で生成します。
64bit版は.libではなく、.aを生成します。

```
>mkexp.exe ftd2xx.a ftd2xx64.dll
```
[DocWiki：64 ビット Windows 版 C++ インポート ライブラリ ツール：MKEXP.EXE](https://docwiki.embarcadero.com/RADStudio/Alexandria/ja/64_%E3%83%93%E3%83%83%E3%83%88_Windows_%E7%89%88_C%2B%2B_%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88_%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA_%E3%83%84%E3%83%BC%E3%83%AB%EF%BC%9A_MKEXP.EXE)
## リンク方法(プロジェクトに追加)
生成したインポートライブラリ(.lib/.a)をプロジェクトに追加すれば、リンク時に使用されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256050/229bb08d-d93d-0dd4-e59e-9badc5497ee0.png)
ただし、この方法では32bit固有のインポートライブラリを追加しているので32bit/64bitの両方に対応できません。
## リンク方法(pragmaで指定)
`#pragma comment (lib, "<ライブラリ名>")`をソース中で指定すれば、32bit/64bitの両方に対応できます。
32bit版リンカでは.libが、64bit版では.aが適切に読み込まれます。
インポートライブラリ(.lib/.a)はプロジェクトディレクトリに置く必要があります。

```C++
#pragma comment (lib, "ftd2xx")
```
2021年度　Iotの素晴らしさと未来

# 一問一答式で理解する「IoT」
【Q1】そもそも**IoT**とは何ですか？
【A1】**IoT**とは(**I**nternet **o**f **T**hings)の略称であり、IoTという言葉ができる以前、インターネットは**コンピュータ同士**を接続するためのものでした。よって、従来は主にパソコンやサーバー等の**IT関連機器**が接続されていました。しかし、現在では新たに**スマートフォン**や**タブレット端末**も接続されています。テレビやデジタルカメラ、デジタルレコーダーや最近話題のスマートスピーカー等のデジタル情報家電をインターネットに接続する傾向が高くなってきている現在、デジタル化された映像、音楽、音声、写真、文字情報や様々なデータがインターネットを介して伝達されるシーンは今後ますます増えて行くでしょう。


【Q2】IoTで何ができるのですか？
【A2】簡単に説明すると、以下の3点が挙げられます。
　　　モノをリモコンで操作できます。![](https://mono-wireless.com/jp/products/MoNoStick/monostick-control.png)
　　　　　　　　　　　　　　　　　　　　　図1　リモート操作
　　　モノにセンサーを付けてデータを収集できます。![](https://mono-wireless.com/jp/products/MoNoStick/monostick-monitor.png)
　　　　　　　　　　　　　　　　　　　　　図2　データ収集
　　　IoTで離れたモノ同士で任意データ送受信ができます。![](https://mono-wireless.com/jp/products/starter/start-step1-3.png)
　　　　　　　　　　　　　　　　　　　　　図3　データの送受信

【Q3】もう少し具体的な例を知りたいです。
【A3】わかりました。例えば(**冷蔵庫**+**インターネット**)ｘ**アイデア** →**献立ナビ**というイノベーションの創造があります。説明すると、冷蔵庫に「献立何にしよう」と問いかけると、いくつかのレシピが提案されるシステムで、過去の相談リストから中身が被らないレシピを提案してくれる、というものです。Iotをこれから先学んでいけば、こんな**夢**のような冷蔵庫を作ることができるのです。IoTは私たちの「あんなものがあればなぁ」という夢をかなえてくれる、素晴らしい技術なのです！

【Q4】イノベーションの創造とは何ですか？
【A4】イノベーションとは、「革新」「一新」といった意味で、イノベーションの創造とは先ほどの
　　　(**冷蔵庫**+**インターネット**)ｘ**アイデア** →**献立ナビ**　
の献立ナビが相当します。
　　　
【Q5】IoTのダメなところはありますか？
【A5】**あります**。今回は3つの問題を挙げようと思います。
　　　**1.セキュリティ問題**
　インターネットに接続することで外部から攻撃されるリスクを抱えることになります。
　IoTが攻撃されると現実世界に影響を及ぼします。例えば、工場の設備にIoTを導入し、そのIoTが攻撃されれば生産が止まり納期に間に合わなくなります。さらに、病院の遠隔医療に導入したIoTが攻撃されると、システムを利用することができなくなり**人命**にかかわります。

　　　**2.プライバシー問題**
　IoTを使用するには、個人情報を登録する必要があることもあります。
　例えば、家の鍵のサービスであれば、どんなカギを使っているのか、どの時間帯に鍵を開けたり閉めたりしているのかという情報を提供するかもしれません。
　**個人情報**をどこまで提供するのか、どのように管理をするのかをしっかりと考えなければいけません。

　　　**3.人手不足**

　IoTの導入が進んで利便性や生産効率が上昇しますが、システムを管理するのは結局、人です。
AIやロボットが人の代わりに仕事をするという話もありますが、まだまだ先の話です。**IoTの管理をする人は、だれでもいいというわけではありません**。IoT技術に精通したエンジニアやトラブルが起きたときに的確に対処できる人材が求められます。
　また、大量のデータを扱うことになるのでデータ分析に詳しい人材も求められます。しかし、**こうした人材はなかなかいない**のが現状です。
　IoTを導入する際は、トラブルを対処することができるのか、大量のデータを分析できる人がいるのかを考えるのが大切になるでしょう。

　他にも電波問題、電力供給問題など様々な問題があります。技術が発展していけばしていくほど私たちの生活に深くかかわってきますし、生活がより便利になるなど、様々な利点があります。しかし、利点が増えれば欠点も出てきてしまいますので、対策をしっかり考えないと、とんでもない事件になってしまう可能性があります。「IoTって凄そう」、「便利そうだなぁ」で終わるのではなく、問題点も含めてよく調べる必要があります。
　
　参考文献
[IoTとは？...IoT：モノのインターネット](https://mono-wireless.com/jp/tech/Internet_of_Things.html)

[IoT導入で起こる、デメリットとの付き合い方](https://www.mtl.jp/company/archives/4763)
ちょっとした羅列を手で作るのはやめようって話

# 概要
例えば特定のIDをもったデータを参照したいとかで

```ruby
[1725,1726,1727]
```

みたいなものが入ったスクリプトやSQLなどを書いたりすることがあると思います。

自分は1回これを

```ruby
[1725.1726,1727]
```

みたいな感じでタイポし、盛大にバグを出しました。
そこで再発防止でこういうものはすべてプログラムで出力してコピペするようにしています。

自分はirbでワンライナーを書いて出力をコピペしています。ターミナルに3文字打つだけで起動してくれますし、多少数が増えるとプログラムを書く方が早く、また応用も効くのでおすすめです。

# 例
## 配列の中身
```ruby
(1725..1727).to_a.join(',')
=> "1725,1726,1727"
```

## 長い配列の中身
```ruby
(1725..1735).to_a.join(',')
=> "1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735"
```

## 間が抜けた数字の列挙
```ruby
[*1725..1727,*1750..1752].join(',')
=> "1725,1726,1727,1750,1751,1752"
```

## 条件をつけて絞り込む(3の倍数の列挙)
*@scivolaさんから指摘していただきました、range型にselectが使えて返り値が配列なのでto_aが消せます

```ruby
(1725..1735).select{|n|n%3==0}.join(',')
=> "1725,1728,1731,1734"
```

>前のコード

>```ruby
>(1725..1735).to_a.select{|n|n%3==0}.join(',')
>=> "1725,1728,1731,1734"
>```


## 改行を入れて縦に並べる
*@scivolaさんから指摘していただきました、putsに配列を渡すと改行して表示されるため改行コードでのjoinが不要です。また[*1725..1727,*1750..1752]の時点で配列なのでto_aも不要です。

```ruby
puts [*1725..1727,*1750..1752]
1725
1726
1727
1750
1751
1752
=> nil
```

>前のコード

>```ruby
>puts [*1725..1727,*1750..1752].to_a.join("\n")
>1725
>1726
>1727
>1750
>1751
>1752
>=> nil
>```

## 文字に番号がついている場合
*@scivolaさんから指摘していただきました、改行コードでのjoinが不要なほか、ruby2.7以降なら番号指定パラメータを使い記述を減らせます

```ruby
puts (1..15).to_a.map{"id_#{_1},"}
id_1,
id_2,
id_3,
id_4,
id_5,
id_6,
id_7,
id_8,
id_9,
id_10,
id_11,
id_12,
id_13,
id_14,
id_15,
=> nil
```

>前のコード

>```ruby
>puts (1..15).to_a.map{|n|"id_#{n},"}.join("\n")
>id_1,
>id_2,
>id_3,
>id_4,
>id_5,
>id_6,
>id_7,
>id_8,
>id_9,
>id_10,
>id_11,
>id_12,
>id_13,
>id_14,
>id_15,
>=> nil
>```

初心にかえって、普段ミス防止にやっていることを書いてみました。今回はレンジ型を主に使う例をあげましたが、csvを読み込んで使ったり、DBからcsvを出力して使ったりするともっといろいろなものが作れます。手で列挙したものから目検などでミスをみつけようとすると非常に大変なので作れるものはできる限りプログラムで作るのが良いです。
NuxtLinkのページ遷移で今見ているページをフェードアウトさせたい。

最近よく見るページ遷移する際に今見ているページをフェードアウトやつ
あれをNuxtLinkとGSAPでやろうとした際の備忘録。
NuxtLinkのページ遷移をpreventするのにはどうすればよいかわかりませんでしたが、
参考リンクがとても参考になりました。
SEO的にはどうなるのでしょうか、わかりません。

```html:page.vue
<NuxtLink to="/page2" event="" @click.native="link">
 page2
</NuxtLink>

```

```javascript:page.vue
methods: {
    link (e) {
      e.preventDefault()
      gsap.to('#loading', {
        opacity: 1,
        width: '100%',
        height: '100%',
        duration: 1
      })
      setTimeout(() => {
        this.$router.push({ path: e.target.attributes[1].nodeValue })
      }, 1000)
    }
}

```

参考リンク
https://qiita.com/1994spagetian/items/be1de1189a3a31147805
誰よりも綺麗にジェネリックなReactコンポーネントをstories化する【ジェネリクス/Storybook/TypeScript/Generics】



こんなコンポーネントがあったとする

```ts:MyComponent.tsx
export interface MyProps<T> {
  count: number,
  generic: T
};
export const MyComponent = <T extends string | number>({
  ...props
}: MyProps<T>) => {
  return (
    <>
      <p> {typeof props.count} </p>
      <p> {typeof props.generic} </p>
    </>
  );
};
export default MyComponent;
```

従来の、ジェネリックではないコンポーネントのstoriesの書き方を踏襲するならこんな感じ

```ts:stories.tsx
import { Meta } from "@storybook/react";
import { MyComponent } from ".";

export default {
  title: "MyComponent",
  component: MyComponent,
} as Meta<typeof MyComponent>;

const StrTemplate = () => {
  return MyComponent<string>({
    count: 1,
    generic: "str",
  });
};

const NumTemplate = () => {
  return MyComponent<number>({
    count: 1,
    generic: 1,
  });
};

export const str = StrTemplate.bind({});
export const num = NumTemplate.bind({});
```

⇑
ただこれだとTemplateに値を直書きしてしまっているためcontrolが効かない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1869061/fbb004cd-081e-4086-20b0-fe2783060815.png)

# 綺麗にする

こうなる

```ts:stories.tsx
import { Meta, Story } from "@storybook/react";
import { MyComponent } from ".";

type BindTemplate = <T extends Story<any>>(template: T, args: T["args"]) => T;

const bindTemplate: BindTemplate = (template, args) => {
  const boundTemplate = (template as any).bind({});
  boundTemplate.args = args;
  return boundTemplate;
};

const config: Meta = {
  title: "mycomponent",
  component: MyComponent,
};
export default config;

export const str = bindTemplate((args) => <MyComponent<string> {...args} />, {
  count: 1,
  generic: "str",
});
export const num = bindTemplate((args) => <MyComponent<number> {...args} />, {
  count: 1,
  generic: 1,
});
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1869061/800ad9f0-f7a1-d00e-08cb-679035c1add8.png)

テンプレートとargsを受け取ってバインドする関数を用意して、そこに諸々一気に渡しちまおうぜって思想
コントロールも効く
転職後１年を振り返り｜苦労しながら学んだ「仕事をうまく回す」ためのコツ

## はじめに
オークファンの@nakamurak_aucfanです。
昨年12月より開発部に所属し、プロマネ的な立ち位置で色々やっています。

転職は複数回しており、過去には

- 旅行会社の営業職
- クライアント企業へのWebコンサルティング業務
- 事業会社でプロマネ／DX担当（新システム導入の旗振り役等）

などを経験してきています。

## オークファンでの業務内容
オークファンでは開発部に所属していますが、コードを~~書けない~~書かない非エンジニア的な存在です。
（開発の専門知識が必要な場面では日々上司やチーム、協力会社に確認を取りながら進めています。）

もともと業務上の課題を見つけて改善していくのが好きだったりするので、そこを業務に活かしてプロジェクトがうまく回るように裏方で色々頑張っています。

ということで、今回はオークファンで約１年間働いた経験をもとに、特に意識するようになった仕事のコツみたいなところを整理してみました。（プロマネ的な話の一歩手前のところです。）

- 仕事をコツコツ進めていたら、突然ちゃぶ台返しをくらった！
- 認識違いが多発してもういや！！

こんな方に見てもらえると嬉しいです。

## 日々の業務で心がけておきたいこと
若い時は日々猪突猛進的な仕事の仕方をしてきましたが、、、
40代に突入して体力が落ちてきたり、子育ても忙しく家事もしなければなので、残業でカバーも限界があります。

そうした状況でも生産性を落とさないためには、関わるプロジェクトの状況に合わせて、仕事の仕方を適宜アップデートしていく必要性を強く感じます。

- 効率を上げる！
- 短い時間で成果を出す！

そのための王道は**無駄を極力削ること**にあるかと思うので、そんな時に意識したい心がけを３点紹介します。

### 骨子を作って早めに確認
前職では細部まで自分で考えた上で意見を戦わせるみたいな進め方が良しとされていましたが、
現在はかなり違ったやり方で仕事を進めています。

- 完成度30％程度でレビューする
- わからないところは少し考えて／調べて聞く（30分迷ったら聞く）

最初は少し抵抗がありましたが、方向性がズレたままに無駄に悩んだりする時間が減るので、実際にやってみるとかなり助かります。
ただ、「なんでもかんでも答えを聞く」と、いわゆる丸投げになってしまうので注意が必要ですね。

NG：どうすればいいですか？
OK：こう思うんですけど、どうでしょうか？

あくまで自分が主体で考え、その方向性にズレがないかの確認をする。
バランス感や柔軟性が求められるところですが、生産性を上げるためには必須かなと思いました。

### ３週間先のアジェンダを作る
仕事において、目的を明確にすること＝非常に重要であることに異論はないかと思います。
でも一方で、日々仕事をしている中で「いつまでに・誰が・何をするか」に振り回され、「何のために」が置き去りにされることがありませんか？

- プロジェクトの目的
- MTGの目的
- ドキュメントの目的

自分も追い詰められてくると手段の目的化が進行しやすいので、

- このプロジェクトはXXまでに〇〇というゴールを達成したい
- そのために、このMTGでは〇〇を決めたい
- そのために、このドキュメントをこうやって作る

という感じの逆算を自己流でやっていました。

ただ、この場合は自分の中で完結してしまっていて、時折関係者への共有が漏れたり、読み違えて遠回りしてしまうこともあります。
その解決策として学んだのが、**「３週間先のアジェンダを作る」**ということでした。

プロジェクトにおいて、少し先の後続タスクを共通認識として持つことができるので、

- 会議の論点が明確になり、無駄な議論になりにくい
- 進捗が明確になり、事前に対策を立てやすい
- ３週程度なら書く側も書きやすい

メリット多いので、すべての仕事に組み込んでいきたい考え方ですね。
（ここはまだまだ苦戦していますが。。）

### 最適な言葉を選ぶ
ここは前職の経験や、自分の強みの部分が出ているところかもです。
前職では海外在住のスタッフと連携して仕事をしていたのですが、メールで漏れや不明確な記述があると、時差の関係で１日を無駄にしてしまうことがありました。（修正依頼したのに質問が返ってきて修正は進まず・・とか）

そのため、資料作成やチャットなどでは**極力認識違いが発生しないような伝え方**を意識しています。

- 言った、言ってない論争
- あれって結局どうなったっけ？
- 双方にとって都合の良い解釈

やり取りする人や会社が増えると、こういったすれ違いがたくさん発生していきますよね。
**「伝えても理解しているとは限らない。依頼通りに行動してくれるとは限らない。」**

相手が疑問に思いそうなことを、先回りしてつぶしておく。
プロジェクトの業務知識や開発知識などを総動員しながら、相手にとって心地よい伝え方を目指しています。（遠い目。。。）
もちろん一人ではできないので、骨子を考えて早めに上司に確認するを忘れないようにしています。

## おわりに
今年は41歳になって、人生の後半戦がそろそろ始まるのか（もう始まっている？）と感じていますが、
それでもまだまだ失敗し、その都度学んでいます。

人には人のやり方や強みがあるので、色々試しながら自分に合った武器を拾っていくイメージですかね。
自分の強みがわからない場合は、周りに聞いてみるのもいいかもしれません。

もし、こっそり知りたいならストレングスファインダーがおすすめです。
強みを気づけばそれを伸ばして成果を出し、弱みは打ち明けてフォローをお願いする。
そんな仕事の進め方がチームでできるのが理想ですね。

https://www.gallup.com/cliftonstrengths/ja/253634/ホーム.aspx

自分は共感性・協調性・コミュニケーションがトップ３の資質。
引き続き日々学び、周りと協力しながらうまーく回せる「柔軟なプロマネ」を目指していきます。
【初心者向け】WebAPIについて簡単にまとめてみた。

#はじめに
まず初めに、APIとは"Application Programming Interface"の略で、ソフトウェアやプログラム間をつなぐインターフェースのことを指します。定められた手順や規約に則ることで、あるプログラムの機能を別のプログラムから呼び出したりすることができます。
APIの基本的なプロセスは、呼び出した側からのリクエスト(要求)と呼び出された側からのレスポンス(応答)によって構成されます。


#WebAPIとは
WebAPIとは、APIの中でもHTTP・HTTPS通信によってリクエストとレスポンスのやりとりを行うものです。送受信されるデータはJSON形式や画像など様々です。
WebAPIを使用することで、Webサイトに外部のソフトウェアやプログラムが提供する機能を組み込んだりすることができます。
有名なものではAmazonのAPIやTwitterのAPIがあり、自身のWebサイトに商品情報を表示したり、ツイートの投稿・取得といったことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513585/930c2ab3-50c1-164f-5dae-ea181a112e37.png)

#RESTとSOAP
WebAPIの構成法としてよく知られるものに、RESTとSOAPがあります。
SOAPは"Simple Object Access Protocol"の略で、「ソープ」と読みます。XMLベースで記述されたもので、2000年代初頭まで主流でしたが、仕様の複雑から近年ではあまり使われなくなっています。
RESTは"Representational State Transfer"の略で、「レスト」と読みます。RESTは軽量で状態管理を行わないなど、シンプルさを重視した設計となっています。現在では"Web API"="REST"といえるほど主流なものです。

#WebAPIの例
##Google API
現在、GoogleはGmailやGoogleMapなど様々なサービスを提供していますが、それらのAPIを利用することで様々なことをすることができます。本当にいろいろなAPIが提供されているので、ここではGoogle Maps APIの一部を取り上げて紹介したいと思います。
###JavaScript API
ウェブサイトにインタラクティブな地図を追加することができます。また地図を表示させるだけでなく、マーカーの変更やルート表示など独自のカスタマイズをすることができます。

###Directions API
複数の場所間の公共交通機関、自転車、車、徒歩でのルートが提供されます。

###Geolocation API
携帯電話の基地局や Wi-Fi ノードからの位置データを利用して、GPS に依存せずにデバイスの位置が返されます。

#さいごに
いかがだったでしょうか。WebAPIにはほかにも世界中のニュース情報を取得できる"News API"、
WebAPIをうまく使いこなせば、自分で複雑な機能を作らなくともアプリケーションを作成することができます。
WebAPIを利用するためには、APIキーの取得やプログラミング言語へのある程度の理解などといったWeb開発初心者にはハードルがありますが、これができれば脱初心者の第一歩になると思います。



#参考
[Web API(ウェブAPI)とは](https://e-words.jp/w/Web_API.html)-IT用語辞典
複数のバージョンのDenoをインストールする

Node.jsやPythonには、複数のバージョンをインストールして使うためのツールがあります。
例）

- [Windows で複数バージョンの Python を使う](https://qiita.com/landwarrior/items/1b5e0f9af5316a025fe0)
- [複数のバージョンのNodeJSをインストール](https://qiita.com/rkunihiro/items/28ba01deaf0798f05b31)

Node.jsやPythonのように、複数バージョンのDenoをインストールするためにはどうすればいいかについて解説します。

## 複数のバージョンのDenoをインストールする

Denoはシングルバイナリなので、**実行ファイルをリネームして置いておくだけ**で大丈夫です。

例えば、linuxの場合は下の画像のように、denoという名前の実行ファイルをコピーして、バージョン番号付きの名前に変え、パスの通ったところに置くだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678625/7d41ada5-afa3-ed37-82c1-8c0838bb25c7.png)

Windowsの場合も、`C:\Users\<ユーザー名>\.deno\bin`以下にあるdeno.exeをコピーし、バージョン番号付きの名前に変えておけば完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678625/361abc5c-11c0-fac7-8b40-ea648580bee8.png)

実行する際は、リネームした後の名前（ここでは`deno.1.17.0`）を指定すれば通常のdenoバイナリと同じように扱えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678625/1956d71e-b138-3a05-e780-e3055c5853f5.png)

過去バージョンのバイナリを取ってくるには、

- `deno upgrade --version <バージョン番号>`コマンド
- [githubのリリースページ](https://github.com/denoland/deno/releases)からzipファイルをダウンロードして解凍する

の2つの方法があります。


探せば便利なツールとかがあるのかもしれませんが、自分はずっとこの方法を使っています。

以上、小ネタでした。
RidgeをAI on Browserで動かしてみた！

今回はRidge回帰を紹介したいと思います。

#目次
- 回帰分析について
- Ridgeとは？
- AI on Browserで動かしてみた
- ビジネスシーンでの活用方法
- さいごに

# 回帰分析について
回帰分析とは、大まかに説明すると、とある物事を

```math
Y = f(X)
```

の形に当てはめることを言います。
このとき、Yを「目的変数」、Xを「説明変数」といい、Xが1次元の場合は「単回帰」、2次元以上の場合は「重回帰」といいます。

# Ridgeとは？
回帰分析の手法として、今回は「Ridge」という手法に着目してみたいと思います。
似たような仲間に「Lasso」、「ElasticNet」というものがありますがこの3手法は全て、
最小二乗法の式にもうひと手間を加えることで表現されます。
最小二乗法の式は以下になります。

```math
\sum_{i=1}^{n}\lbrace{y_i-f(x)}\rbrace^2
```
これにL1正則化項(ノルムともいう)を加えるのがLasso、L2正則化項を加えるのがRidge、2つを複合的に加えるのがElasticNetとなります。
正則化項には過学習を抑える働きがあります。
せっかくモデルを作っても、未知のデータに対して使い物にならない…となるのは悲しいですよね。
L1正則化項とL2正則化項の違いは、この中での説明変数の扱い方になります。
L1正則化項は、過学習を防ぐために「いくつかの説明変数を無視する」可能性があります。
逆に、L2正則化項は、「全ての説明変数を無視しない」という仕組みになっています。

つまり。Ridgeを活用する場合は、
**「過学習は防ぎたいが、全ての説明変数が重要である」**
というシーンが想定されます。

# AI on Browserで動かしてみた
AI on Browserで動かしてみると以下のようになります。

今回はワインの品質予測を実施してみます。

![wine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321646/637b3fd4-7a6e-d270-dcdf-53e75c4ea633.png)

画面下部にRMSE（二乗平均平方根誤差）が表示されています。
今回のデータセットでは非常によい予測ができていることがわかります。

誰でも利用できるので、Ridgeの他にも様々な手法を利用することができるのでぜひアクセスしてみてください！
https://ai-on-browser.github.io/?data=manual&task=RG&model=ridge&dimension=2

また、コードは以下にあるので良かったらご参照下さい。
https://github.com/ai-on-browser/ai-on-browser.github.io/blob/v0.0.20/lib/model/ridge.js


# ビジネスシーンでの活用方法
先に挙げた特徴から、「ある程度重要な説明変数の見当がついてる」場合にRidge回帰を活用できると考えられます。
例えば、「製品不良の予測モデルを作成するときに、これと、これと、これのセンサーデータが関係ありそう」というような場合です。

#さいごに
ビジネスシーンではニューラルネットワークの活用が注目されていますが、モノによっては十分Ridge回帰などの統計的手法で表現することができる可能性が大いにあります。
そのため、なんでもすぐニューラルネットワーク！という風に考えずに、回帰モデルなどで表現できないかを検討することが重要となってきます。
さらに、アルゴリズムを選択する前に投入するデータの選定、加工が重要となってきます。
わたくしのおすすめ3DCG素材サイトを紹介しますわ！

※この記事はNCCアドベントカレンダー22日目の記事です。


***読者の皆様、ごきげんよう。***


花山院家(かさんのいんけ)の令嬢、**花山院 櫻子(かさんのいん　さくらこ)**と申しますわ。
![名称未設定のアートワーク 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354915/1291f630-4770-3085-45bc-d83e59f63624.png)



*↑わたくしの自画像ですの。おイラストがお上手ではないので許して欲しいですわ（照）*


**今回は、わたくしが普段3dモデルを制作する際に愛用しているサイトを紹介しますわ。**

##Substance 3D Assets

https://substance3d.adobe.com/assets/

王道のサイトですわよね。

わたくしはSubstance Painterを使うために「Substance 3D テクスチャリング」のライセンスに契約しているのですけれど、このライセンスを持っていると、1ヶ月につき30個、Substance3Dにあるマテリアル素材をDLできるトークンがもらえるんですの。

マテリアルってプロシージャルで一から作ろうとすると結構めんどくさかったりしますから、これはめちゃくちゃ役に立ちますわ。![スクリーンショット 2021-12-22 17.36.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354915/1f258dec-c005-009c-359b-6421b1dd0070.png)

わたくしがM→Fesというイベント向けに映像を作った時も、ブラウン管のテレビのテクスチャにここのマテリアルを使いましたの.

https://www.youtube.com/watch?v=q7gJLfWArZE

（音楽が最高なので観てほしいですわ）


ちなみにSubstance 3D Collectionという上位ライセンスに契約すると、1ヶ月にもらえるトークンの数が増えるだけでなく、3Dモデルのようなマテリアル以外の素材もDLできるようになりますわ。

私はお金がないので我慢していますの（泣）

##Texture.com

https://www.textures.com/

これも有名なサイトですわよね。
名前の通り、テクスチャの素材が豊富にありますの。中国の雑居ビルのテクスチャとかもありますわ。

テクスチャの他にも、HDR画像とかマテリアルの素材もありますわ。
無料でDLできる数は限られていますので、本格的に使うのであれば有料ライセンスの購入をおすすめしますわ。

私はお嬢様なので余裕で契約しましたわよ。（えっへん）

###poly haven

https://polyhaven.com

無料で色々な素材をダウンロードできる超優れものサイトでしたわ。
少し前まで「HDRI haven」という名前でして、いつの間に名前が変わっていてびっくりしましたわ。

8kサイズとか大きい素材はあまりないんですけれど、無料でかつ高品質なのが最高ですわ。

##Blender market

https://www.blendermarket.com/

これは素材というよりBlenderのアドオンのサイトでして、無料有料関わらずいろいろなアドオンが掲載されていますわ。こんなものまであるんでして！？というアドオンもあって見ているだけで楽しいですわ。

ただ、物によっては購入後のサポートとか返金(refund)が受けられなかったりするので注意が必要ですの。

わたくしも一度アセット系のアドオンを購入した時にそれが正常に動作しなかったことがあって、その旨を慣れない英語で伝えたらガン無視を決められたことがありましたわ。会社ではなく個人が作っていることもありますので、基本的に自己責任という感じですわ。

##おわりに
***いかがでして？***

今回は、わたくしが愛用している素材サイトを紹介しましたわ。

「これわたくしも使っていますわ！」等、3DCGお嬢様部の方々のおコメントをお待ちしてますわ。

以上、花山院 櫻子_NormalMapがお送りしましたわ。
![Bump.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354915/d3b17317-7dc7-4c29-35ed-1e61d5849dd7.png)
shallow clone 後にすべてのリモートブランチを取得する

## shallow clone だとリモートブランチが取得されない

```shell
$ git clone --depth 1 git@github.com:MtDeity/example.git
Cloning into 'example'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
```

shallow clone した後に

```shell
$ git fetch --unshallow
```

をしても、

```shell
$ git branch --remote
  origin/HEAD -> origin/main
  origin/main
```

リモートブランチの一覧を表示すると、デフォルトブランチしか取得されていない。

## すべてのブランチをリモートで追跡する

下記のコマンドで、すべてのブランチをリモートで追跡するように変更する。

```shell
$ git remote set-branches origin '*'
```

その後、

```shell
$ git fetch
```

をすると、すべてのブランチが取得される。

```shell
$ git branch --remote
  origin/HEAD -> origin/main
  origin/develop
  origin/main
```

## 参考

[branch - git shallow clone (clone --depth) misses remote branches - Stack Overflow](https://stackoverflow.com/questions/23708231/)
【Ruby】複数の配列を同時にループさせたいときはzipメソッドを使う

##zipメソッド
複数の配列を同時にループされられる。


```ruby
#　各配列の要素がインデックス0から取り出されて配列になる
array1 = [1, 2, 3]
array2 = [4, 5, 6]

p array1.zip(array2)
# => [[1, 4], [2, 5], [3, 6]]
```

```ruby
@articles = ['article1', 'article2', 'article3']
@authors = ['kato', 'yamada', 'suzuki']

@articles.zip(@authors) do |article, author|
  puts article
  puts author
end

# => [["article1", "kato"], ["article2", "yamada"], ["article3", "suzuki"]]
```

https://docs.ruby-lang.org/ja/latest/method/Array/i/zip.html
面白い数式項目を作ってみた

Salesfroceの数式項目で面白い項目を作成したので残します


項目その１
項目A、項目B、項目Cがあります（すべて選択リスト）
項目の選択リストで何個の項目が「YES」なのか計算する数式です
IF( AND( ISPICKVAL(test1__c, "YES"), ISPICKVAL(test2__c, "YES"), ISPICKVAL(test3__c, "YES")),3, IF( AND( ISPICKVAL(test1__c, "YES"), ISPICKVAL(test2__c, "YES"), ISPICKVAL(test3__c, "NO")),2, IF( AND( ISPICKVAL(test1__c, "YES"), ISPICKVAL(test2__c, "NO"), ISPICKVAL(test3__c, "YES")),2, IF( AND( ISPICKVAL(test1__c, "NO"), ISPICKVAL(test2__c, "YES"), ISPICKVAL(test3__c, "YES")),2, IF( AND( ISPICKVAL(test1__c, "NO"), ISPICKVAL(test2__c, "NO"), ISPICKVAL(test3__c, "YES")),1, IF( AND( ISPICKVAL(test1__c, "NO"), ISPICKVAL(test2__c, "YES"), ISPICKVAL(test3__c, "NO")),1, IF( AND( ISPICKVAL(test1__c, "YES"), ISPICKVAL(test2__c, "NO"), ISPICKVAL(test3__c, "NO")),1,0)))))))



項目その２
項目A、項目B、項目Cがあります（すべてチェックボックス）
項目の選択リストで何個の項目が「チェック済み」なのか計算する数式です

IF( AND( test11__c = TRUE, test22__c = TRUE, test33__c = TRUE),3,  IF( AND( test11__c = TRUE, test22__c = TRUE, test33__c = FALSE),2, IF( AND( test11__c = TRUE, test22__c = FALSE, test33__c = TRUE),2, IF( AND( test11__c = FALSE, test22__c = TRUE, test33__c = TRUE),2, IF( AND( test11__c = TRUE, test22__c = FALSE, test33__c = FALSE),1, IF( AND( test11__c = FALSE,test22__c = TRUE, test33__c = FALSE),1, IF( AND( test11__c = FALSE,test22__c = FALSE, test33__c = TRUE),1,0)))))))
Denoを半年使ってみた感想

:::note warn
この記事はただの感想なので、暇な人だけ読んでください。
:::

Denoを使い始めて半年以上経っているので、これから使い始める人向けにDenoを使ってみた感想を書いていきたいと思います。

## Denoのいい所

### URLを使ったimportは便利

Denoの特徴の一つが、URLを使ったブラウザ互換なimport文です。

```ts
// このコードを実行すると自動でlodashがインストールされる
import * as lodash from "https://deno.land/x/lodash@4.17.15-es/lodash.js"     
```

一見するとアップデートのたびに手動で書き換える量が多く、面倒ではないかと思うのですが、自分の場合は下の画像のように、**依存関係のアップデート作業をGitHub Actionsで自動化**したことで便利になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678625/64529e56-4d11-e835-7f66-598c8518a7af.png)

特に、モジュールの指定と実装が同じファイルに存在するので、アップデートした時に影響を受ける箇所が一目でわかるのが有難いです。
上の例だと、`media_types`モジュールに依存しているのは`serve.ts`だけなので、依存関係のアップデートでコードの書き換えが必要な場合は`serve.ts`だけを見ればいいことが分かります。
「依存関係のバージョン指定箇所とソースコードの距離が近い」というのはコードを書く上ですごくメリットだと感じました。

:::note info
※ちなみに、GitHub Actionsで自動アップデートをかける方法は<a href="https://zenn.dev/kawarimidoll/articles/c68204d248c107">@kawarimidollさんの記事</a>や<a href="https://github.com/hayd/deno-udd">deno-uddのGutHubリポジトリ</a>が参考になりました。また、<a href="https://github.com/ayame113/deno_deploy_template/blob/663b6bde7765c5d2572cd9edee166dc6c288d512/.github/workflows/update.yml">自分が使っているworkflowのyamlファイル</a>も参考になると思います。
:::

また、例えばNode.jsではnode_modulesフォルダ内に全ての依存関係をダウンロードするため、semverを使ってライブラリのバージョンを「いい感じに」解決する必要がありました。しかし、Denoではそもそも複数のバージョンが依存関係に含まれていても特に問題ないため、semverを使う必要はありません。
これも、Denoの依存関係の解決方法を気に入っている理由の一つです。

### DX（開発者体験）がよい

自分がこれまで使ってきた他の言語と比べると、Denoは明らかにDXがよいです。

- 環境構築が簡単
- リンター、フォーマッター、テスター、language serverが同梱されている
- 設定ファイル不要
- アップデートが簡単（`deno upgrade`コマンド）

設定ファイル不要なので、書いたコードがそのまま動いてくれるのが嬉しいポイントです。
自分は簡単な四則演算はブラウザコンソールでやってしまうのですが、「四則演算するのと同じくらいの手軽さでサーバーが建つ」というくらいの手軽さ（自分の感覚ですが）なので、書き捨てスクリプトからwebのバックエンドまで幅広く利用しています。

## Denoのつらいところ

上ではDenoのいい所を紹介しましたが、つらいところもあります。

### 日本語情報が少ない

Denoは新しいランタイムなので、Node.jsや他の言語と比べると検索してもまだ情報がヒットしづらいです。
また、[日本語版の公式サイト](https://deno-ja.vercel.app/)のバージョンが古くなってしまっていたり、標準ライブラリのドキュメントが英語版しかないため、最新情報を得るのが大変かもしれません。（もちろん、OSSなので文句を言う前に自分でcontributeすべきなのですが）

これとは直接関係はありませんが、[language serverで日本語を使うと時々クラッシュする](https://github.com/denoland/deno/issues/10891)問題や、[prompt関数が日本語入力に対応していない](https://github.com/denoland/deno/issues/11046)問題もあります。特に、prompt関数は標準入力の受け取りという便利な関数なので、早く修正されて欲しいです。

こうした、「日本語環境特有のつらさ」みたいなものを感じる時があります。

### 標準ライブラリがバージョン0

Denoの標準ライブラリはまだバージョン1に到達していないため、破壊的変更が入る可能性があります。
基本的にコードを書く上で標準ライブラリは必須なので、早くバージョン1になって安定してほしいです。

### モジュールごとのパーミッション指定ができない

Denoはコマンドラインフラグで`--allow-write`等のフラグを指定して、パーミッションを制御することができます。しかし、ここで指定した権限はプログラム全体に適用されるため、「このモジュールはread権限だけ」というような指定ができません。
どうやら[技術的に不可能](https://github.com/denoland/deno/issues/410)という事らしいですが、これ何とかならんのかなぁと思っています。

## まとめ・雑感

- 結局従来の`require()`や`experimentalDecorators`を捨てるためには全体的にコードを書き換える必要があるので、それならNodeを捨ててみんなでDenoに移行してしまったほうが色々と楽な気がした
- Node.jsでよくありがちだった「インストール時にbabelやtscでトランスパイル」「サーバーへのデプロイ時にトランスパイル」みたいなものをDeno界隈では嫌うイメージ。そういう変換が前提だったNode.jsライブラリはDenoで使うのが辛いかも？

色々書きましたが、総合的にはDenoは良いソフトウェアだと思うので、今後も使っていきたいです。
kintoneのダウンロード操作をUiPathで自動化してみる

[kintone Advent Calendar 2021](https://qiita.com/advent-calendar/2021/kintone) の 23日目の記事です。

#内容
kintoneのダウンロード操作をUiPath（RPA)で操作してみます。
kintoneには各種APIが備えられているので、UiPathからAPIでkintoneの値を取得して、それをExcelに出力する方がスマートかもしれませんが、APIを使うには一定のプラグラミングの知識が必要になるので、今回は画面操作をしてみます。
どちらかというとUiPath寄りの記事ですが、こんな感じでkintone操作の自動化ができるのかっていう感じで何かの参考になれば幸いです。

#kintoneでのダウンロード操作
まずはダウンロードに必要な操作をまとめてみます。
1.ファイルに書き出すをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79724/ff116a04-88f1-c76b-9ca7-f250adc86c87.png)

2.書き出すをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79724/14a7e57c-18d6-f3ae-1114-a855161d8cf8.png)

3.ファイルができるまで待つ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79724/1c9c28eb-3f9f-b690-56a7-56bb518c9209.png)
4.そろそろできたかなと思ったら、再読み込みをクリック。それを何度か繰り返す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79724/c6828945-fad7-fa62-2a64-679359e229bf.png)
5.ファイルができるとこんな感じの画面になるので、ダウンロードしたいファイルをクリックしてダウンロードする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79724/b566bc7e-8a09-ccb2-615a-fd50b81319c8.png)

#UiPathで実装していきます。
##ファイルに書き出すをクリック
ここは簡単ですね。単純にクリックするだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79724/6495041e-cb7f-9d57-ff7e-552095e72a86.png)

Selectorはこんな感じです。赤で塗りつぶした部分はアプリによって変わるのでご注意。* でワイルドカード指定してもよいかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79724/95e67707-90e1-ca95-b5de-a6e9a6c57709.png)

##書き出すをクリック
ここも簡単です。クリックするだけ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79724/6d6594c2-3732-5778-eb04-96029731b66e.png)
Selectorはこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79724/8d3ebe0e-83ff-60c4-1708-b4508e2457b6.png)

##ファイルができるまで待ちつつ、そろそろできたかなと思ったら再読み込みをクリック。それを繰り返す。

ここがちょっと複雑です。普通に考えると、下図の様なダウンロード可能なファイルができるのを待てばよいのですが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79724/48fc42f5-445a-47a8-b7d7-52ac7390b6e7.png)
kintoneは一定時間ダウンロードファイルが残るため、下図の様にダウンロードファイルが積みあがっていきます。つまり、一番上のファイルが今からダウンロードしたいファイルなのかどうか、存在確認だけではわからないという事です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79724/382fe935-8e9b-b59c-aea4-ecf3e03dae0c.png)
ということで、ファイルができるのを待つのではなく、発想を変えて、下図の様な、待機中・作成中枠が消えるまで、再読み込みをクリックし続ける。という形にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79724/2c81cad2-c2fa-0cd6-2d52-0a4eb846340c.png)
下図の様な感じですね。作成中の枠がきえたら、ダウンロード可能なファイルの一番上の行のリンクをクリックするという流れです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79724/9d823c1e-dccb-c7a9-85ff-7da8033dca9f.png)
#最後に
kintoneとUiPathの組み合わせは、割と面白いかなと思っています。
もうすぐ年末ですね。皆様良いお年をお迎えください。
VisualStudio2022でMVC5のビューを追加できない

##事象
VisualStudio2022の場合、MVC5のビューを追加できない事象が発生した。
![image-20211222170214478.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34678/0f32b7c1-c14d-cc8a-7720-41f8ee8ab42d.png)

##原因と対処
MVC5のテンプレートがインストールされていないため。
VisualStudio Installerで「.NET Framework プロジェクトと項目テンプレート」を追加すれば解決した。

![クリップボード一時ファイル01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34678/72345e09-1ff8-a17c-b619-3474462b9685.jpeg)
![クリップボード一時ファイル02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34678/a1630270-76d5-d57e-890c-4f088bdfa1a5.jpeg)
![image-20211222170255887.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34678/4a631f03-4171-e76d-74bc-acb00e944e7c.png)

##参考サイト
https://developercommunity.visualstudio.com/t/VS-2022-Add-View-to-MVC-project-doesnt-/1577500?viewtype=solutions
https://www.howtosolutions.net/2021/11/visual-studio-missing-asp-net-web-application-template-dotnet-framework/
Automation AnywhereでVBScriptを使用して曜日を求めてみた！

Automation Anywhereをお勉強中のものです。どうぞよろしくお願いいたします。

#はじめに
以前投稿した「[Automation Anywhereで「ツェラーの公式」で曜日を求めてみた！](https://qiita.com/auco67/items/7f508af083c7d2c39e42)」では、公式から曜日を求めましたが、Automation Anywhereには、VBScriptの関数を実行するアクションが備わっています。今回は、VBScriptの関数を使用して曜日を求めてみようと思います。

#用意したVBScript
**関数名**:　getWeekday
**パラメーター**:　日付を表す式
![VBScript.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1477705/90307a19-5612-7cc9-9fcb-df1255658a9d.png)

:::note info
VBScriptには日付処理の関数が用意されています。今回上記で使用した関数は、以下２つになります。
Weekday関数:　何曜日であるかを表す 1 (日曜) ～ 7 (土曜) の範囲の値を返します。
WeekDayName関数:　指定された曜日を表す文字列を返します。
:::

(参考にさせていただいたサイト:[VBScript関数リファレンス](https://www.kanaya440.com/contents/script/vbs/function/date/weekday_name.html))

#使用したAutomation Anywhereのバージョン
Automation360
Community Edition ビルド 11457
Bot エージェント バージョン 21.118

#曜日算出手順
1. システム日時を「yyyy/MM/dd」形式で文字列型に変換する
1. VBScriptファイルを開く（※今回は「手動インポート」としました）
1. 関数名、パラメーター、戻り値の変数を設定する
1. VBScriptを閉じる
1. 戻り値をメッセージボックスで表示する

#処理全体
![処理全体.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1477705/3cd81a6e-73c3-86c6-3db9-9ba9a19bbdd5.png)


#現在日時2021/12/22で実行した結果
![実行結果_20211222.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1477705/bd92e32e-a26c-869b-49db-23caff1f38ab.png)

#テストするためにステップを以下の通り変更
　変更前：システム日付を「yyyy/MM/dd」形式で文字列型変数に設定する
　変更後："1000/03/15"を「yyyy/MM/dd」形式で日時型変数に変換し、
　　　　　その日時型を「yyyy/MM/dd」形式で文字列型に変換する
![変更後.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1477705/e9d1598c-ae61-4182-1fab-6142690a5861.png)

![実行結果_10000315.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1477705/402c9bb8-6851-b1ab-4577-2693b0982a10.png)

>1000/03/15が土曜日であるかどうかは、前回記事の検証結果の一覧からご確認いただくか、ネット検索願います。

#注意事項
Automation AnywhereにはVBScriptの関数を実行するアクションが備わっていますが、関数で引き渡せるパラメーターは、現時点では１つのみです。

1. VBScript:開く
![VBScript開く.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1477705/974bdce5-b9bc-f103-de77-be6eb3287e2a.png)

1. VBScript:関数を実行
![VBScript関数を実行.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1477705/acacd992-7508-a6b6-3e94-0376c2ac0318.png)

#Tips
今回、VBScriptは「手動インポート」といって入力エリアに記述するやり方をしました。その他に、VBSファイルをインポートする事も可能ですので、もし今後このVBSファイルに改修することがある場合を考慮すると、後者の方が、VBSファイルのみを変更するだけで対応できるので、運用保守からですと後者が良いと考えます。

#最後に
曜日を求める処理としても、公式を使用するのか、それともVBScriptにある関数を使用するのか、その他Pythonを扱うアクションも備わっているので、色々な方法で対応することができるようです。運用と引継ぎを意識した開発を心がける事が何より一番かと思いました。
（注：Pythonを使用する場合は、開発環境にPythonをインストールする必要があるようです。）

最後まで読んでいただきまして、ありがとうございました。
Slackのpostを扱うアプリを作るときの考慮事項について

ユーザーがSlack上でpostした内容に関するSlackアプリを作る場合にはいくつか考慮すべき事が発生するのでそのまとめ。

アプリ自身がpostした瞬間のみに作用する一過性のものであるなら関係ない話なのだが、これをDBに何らかの形で保存している場合には使えるTIPSだと思います。

## メッセージイベントに何が入ってくるのか

```Python:
@bolt_app.event("message")
def handle_message_events(client, event, body, logger, view, payload, context):
    print('---------------------------')
    print('event message--------------')
    print('---------------------------')
```

メッセージに関するイベントはこのような形で受けるのですが、そこには

- postされたメッセージ
- 編集されたメッセージ
- 削除されたメッセージ

が入ってきます。

編集及び削除については以下のようにsubtypeで判定できます。

```Python
if event.get('subtype') == 'message_changed':#編集の場合
 #編集時の処理
if event.get('subtype') == 'message_deleted':#削除の場合
 #削除時の処理
```

アプリの開発したては編集時の事を考慮せずに書き始めると思いますが、最終的にはこういった分岐が必要になってきます。
気ままに書いていたら、重複処理が増えすぎてリファクタで死にました。




### 以下については @seratch さんのコメント前に書いていたことなので無視して下さい

編集及び削除については


```Python:
if event.get('previous_message') is not None:#編集の場合
```

このように、previous_messageが存在するか否かで判定します。
更に、削除された場合はこのようにdeleted_tsの有無で判定できます。

```Python
if event.get('deleted_ts') is not None:#メッセージが削除された場合
```

~~
自動テストと業務自動化 ～どんどん垣根が取り払われてゆかんとす～

[『Using RPA as a tool for testing』](https://www.infosys.com/services/it-services/validation-solution/white-papers/documents/rpa-tool-testing.pdf)というレポートや、[”世界のテスト現状調査レポート。3～5年で重要になる新しい技術->RPA (slide #29)”](https://qablog.practitest.com/wp-content/uploads/2021/06/State_of_Testing_2021_Japanese.pdf)からも分かるように、システムテストを中心にしたテスト自動化において、手動テスターの仕事を、ソフトウェアロボットに代替させること、つまりは、（ルー大柴の言い方：ココカラ）Robostic にProcess をAutomation させる（ココマデ）ことは、黒歴史が積み重なってきている自動テストの歴史を前進させる技術因子の一つとして注目を集めてきました。

2021年は、まさにその技術因子が、ヨチヨチ歩きながら、立ち上がり始めた年になったのではないでしょうか。
![001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261711/ae5aa4ea-40ec-58ce-9c5f-12386345f3f1.jpeg)




![baby_aruku.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261711/a1eb2b22-8c0b-6d76-e66e-22a53efd4155.png)





UiPath のStudio というツールでもって、人間のアクション摸すためのロボットをローコーディング開発できます。そのツールの可能性を、業務自動化のみならず、IT運用の業務自動化（≒Infrastructure as code (IaC））そして、IT開発の業務自動化：特にシステムテストを中心にした人間系のテストの自動化へエレガントに解放しはじめるチームが生まれ始めています。この試みによって、RPA CoEは、Automation CoEへとワンダフルに拡大進化を果たして、企業活動において、更に、確固たる地位を確立しはじめいています。（＊下図のようにUiPath社の事例紹介ページが、「RPA」そして「Automation」と区分して明記されていることからもそれは明らかです）
![003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261711/d575c529-c76a-d646-de6c-86c585184dcb.jpeg)


日本国内においては、まだまだ業務自動化チームと、テスト自動化を担当するチームが、ガラガラポンと、1チームにマージさせて活動させていくようなケースは、多くありませんが、「パンが無いならケーキを食べればいいじゃない」ではないですが（？）「Studio で作れるなら、作ればいいじゃない」という経済合理性、あるいは、バイアス・レスでもって、Automation CoEとしてバリューを最大化しているお客様が、Japan においても誕生しはじめています。例えば、UiPath Reboot Work Festival 等にも登壇されていた[OKストア](https://japan.zdnet.com/article/35178708/)さん等が代表的な事例です。講演内容でもCIOの方が語られていましたが、Studio を使いこなす若手エンジニアが、Studio のスキルを武器に社内のあらゆる自動化のニーズを吸い上げ、実装しているようです。

このように、業務自動化と自動テストの垣根が取り払われていくことは、まさにUiPath で自動化を開発するメリットを最大化するアプローチですね。（なぜなら、[UiPath Test Suite](https://twitter.com/mochimaru_robot/status/1456848121502191617)ソリューションのアプローチの逆パターン＝自動テストツールでもって、RPAを開発している例は、未だ聞いたことがありません）

2022年は、もっと自由闊達に、もっとエレガントに、腹落ち感をもって、どんどん垣根が取り払われてゆかんとす:relaxed:


![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261711/cb157f96-6dbd-2e60-7558-f361b675ef07.jpeg)
MediaPipe HandTrackingであっち向いてほい

MediaPipe HandTrackinを活用してあっち向いてホイ
![あっち向いてほほい.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900714/6167bd97-0fed-380b-6e5a-4846055ef616.gif)
projenでCDK v2.0が使えるのか試してみた

# はじめに

このアドベントカレンダーでは今更な話だと思いますが、CDK2.0が一般公開されたことを記念して早速試してみようという内容です。

https://aws.amazon.com/jp/about-aws/whats-new/2021/12/aws-cloud-development-kit-cdk-generally-available/

また、2020年くらいに紹介されたprojenというCDK（に限らずですが）のプロジェクト構成管理をより快適にするためのツールがあるので、そのprojenでも既にcdk2.0に対応しているのかを確認してみました。

https://www.youtube.com/watch?v=SOWMPzXtTCw

# projenとは

https://github.com/projen/projen

projenはソースコードの開発を行うために設定するプロジェクトファイルを自動管理してくれる開発ツールです。例えばCDKに限らない話だと思いますが、一つのプロジェクトを構成するときに色んな設定ファイルをいじることになると思います。

- .gitignore
- package.json
- tsconfig.json
- etc...

設定したは良いものの他のプロジェクトで一々ファイルコピーするのは面倒で、この設定ファイル群をまとめて使いまわしたい！という要望を叶えてくれるのがこのprojenです

# 使ってみる

以下のコマンドで導入です！

```bash
mkdir my-cdk-project && cd my-cdk-project
npx projen new awscdk-app-ts
```

これでCDKのプロジェクトの準備は完了です。若干`aws-cdk`のデフォルトのプロジェクト構成と異なりますが、いつものCDKの初期のコードが↓のような感じで用意されています。cdk2.0の特徴として、他の標準のConstructのライブラリを`aws-cdk-lib`でモノリシックに管理するようになりました。

```ts:src/main.ts
import { App, Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class MyStack extends Stack {
  constructor(scope: Construct, id: string, props: StackProps = {}) {
    super(scope, id, props);

    // define resources here...
  }
}

// for development, use account/region from cdk cli
const devEnv = {
  account: process.env.CDK_DEFAULT_ACCOUNT,
  region: process.env.CDK_DEFAULT_REGION,
};

const app = new App();

new MyStack(app, 'my-stack-dev', { env: devEnv });
// new MyStack(app, 'my-stack-prod', { env: prodEnv });

app.synth();
```

projenで特にバージョンを指定していなかった場合、もうCDK2.0以降のバージョンで構成されるようになったみたいですね。projenに関する設定ファイルは`.projenrc.js`で編集できます。

```js:.projenrc.js
const { awscdk } = require('projen');
const project = new awscdk.AwsCdkTypeScriptApp({
  cdkVersion: '2.1.0',
  defaultReleaseBranch: 'main',
  name: 'my-cdk-project',

  // deps: [],                /* Runtime dependencies of this module. */
  // description: undefined,  /* The description is just a string that helps people understand the purpose of the package. */
  // devDeps: [],             /* Build dependencies for this module. */
  // packageName: undefined,  /* The "name" in package.json. */
  // release: undefined,      /* Add release management to this project. */
});
project.synth();
```

`cdkVersion`で指定されているのがCDKのバージョンです。デフォルトで`2.0`以降のバージョンになっていることが確認できました。

# さいごに

かなり薄い内容になってしまいました。ごめんさない。。。
せっかくprojenも2.0に対応していたみたいなので、色々やってみたいと思います！
初学者がウェブサイト作るとき、最低限知っておくべき事 

# はじめに
私は広島で駆け出しエンジニアをやっている学生インターンです！今までいくつかのウェブサイトを作成してきて、特に便利、大切だと感じた技術を自分の経験と一緒に紹介したいと思います。これからウェブサイトを作りたい！PHPでポートフォリオを作っているが、何をして良いかわからない。そんな方の少しでも助けになればと思います！

# 目次
1. 自分が作成したウェブサイトの概要
2. セッション
3. 正規表現
4. トランザクション
5. PDO
6. 最後に
7. 参考文献

#1 自分が作成したWebサイトの概要
- #####サイトの目的
    - 部活動紹介ができるサイト

- #####開発環境
    - エックスサーバー
    - データベース
        - MySQL(phpmyadmin)
    - フロント
        - HTML
        - CSS
        - ちょっとJavaScript
    - バック
        - PHP

- ######実装した機能
    - ユーザー管理機能(サインアップ、サインイン)
    - 投稿機能

#2 セッション
セッションとは、通信の開始から終了までのことです。 クライアントとサーバーで通信を行う場合であれば、クライアントからサーバーへ接続した時点でセッションが始まり、サーバーから切断するとセッションが終了します。 この一連の流れを管理することをセッション管理と言います。
#### 実際に利用できるところ
PHPでセッションに変数を持たせることができます。変数を持たせることで、ページ遷移しても、指定されたページから現在のページに遷移してきたのだということが確認できます。ログインの時などにIDとパスワードを入力した後ページ遷移すると思いますが、これにより他ページからの侵入を防ぐことができます。似たもので、トークンなどもあるので調べてみてください。


#3 正規表現
正規表現とは、ある特定のパターンを持つ文字列を指定する表現記法の一つです。
####実際に利用できるところ
ログイン時に、ID,パスワードを入力すると思います。それにデータベースを操作するSQL文などが含まれていたとします。すると、悪意のある人に、簡単にデータベースに保存されていた個人情報を抜き取られてしまいます（SQLインジェクション）。これを防ぐため、IDやパスワードにSQL文で使われるような文字が含まれている場合はログインができないようにしなければなりません。そこで使えない文字を指定する必要性が出てきます。その使えない文字を正規表現で表現することができます。
[こちらに正規表現がチェックできるアプリがあるので、参考にしてみてください！](https://www-creators.com/tool/regex-checker)

#4 トランザクション
トランザクションとは一連の複数処理をひとまとまりとしてまとめたもののことです。
####実際に利用できるところ
具体例をいうとデータベースの処理をする過程にデータベースに接続する過程、データベースの情報を探す過程、その情報を変数に格納する過程の３つがあるとしましょう。すると、PCなどの環境的問題や、間違えて変な入力をしてしまい、処理が途中で止まってしまった場合、データベースの情報が壊れてしまったり、流出してしまったりということがあります。それらを防ぐためにトランザクションを利用します。トランザクションは上の例で言えば一連のデータベースの処理において途中で処理が終わってしまった場合は、その途中の処理を破棄して、トランザクションが始まる前に戻すという目的で利用します。それによりデータベースが壊れてしまったり、情報が流出してしまったりすることを防ぎます。逆にデータベースの処理が正常に行われたときはトランザクションを終了し、次の処理に移ります。

#5 PDO
PHPを使ってポートフォリを作成する初学者も多いと思います。データベースを利用するといったらMySQLかPostgreSQLが主流なのではないかと思います。PHPではSQLが利用できる関数があります。例えば、mysql_connect関数や、pg_connect関数などです。これらはSQLごとに使えるハンドラですが、もし違うデータベースを利用したいとなったときどうするのか、という問題が出てくると思います。
####実際に利用できるところ
PDOは何のデータベースを使っているかを隠蔽してくれるもので、PDOを使うことで、どのデータベースを利用する場合でも同じ関数を使うことができるので、将来データベースを変更することがあっても、PDOオブジェクトを作成する時に指定したパラメータだけを変更するばいいことになります。そのため変更をしやすくなるという利点があります。

#6 最後に
自分はまだまだ未熟なため、自分の成長を楽しみながらやっていければと思います。初学者の皆さん一緒に楽しみましょう！

#7 参考文献
https://www.javadrive.jp/php/pdo/

https://e-words.jp/w/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE.html

https://news.mynavi.jp/article/20200902-1251247/
Webの勉強はじめてみた その15 ～シェルプログラミングと通信編～

N予備校「プログラミング入門 Webアプリ」を受講しています。
今回は第2章7節~9節の内容になります。

<h2>通信</h2>
<h3>コマンド</h3>
:::note
tcpdump : TCPやUDPで行われる通信のパケット内容を見る
curl : 第一引数に指定されたURLにアクセスしコンテンツを取得する
ping : ネットワーク疎通を確認したいホストに対して、パケットが届くかどうか、またはその応答時間を調査する
:::

<h3>通信方法</h3>
:::note
回線交換方式 : 相手との通信を始める前に回線の占有を行う。
パケット交換方式 : 情報を細かくパケット単位に分割して送信する。
:::

電話は回線交換方式、インターネットはパケット交換方式。

<h3>プロトコル</h3>
:::note
TCP : 確実に送信するために通信コストがかかる。
UDP : 転送効率を重視。
:::

https://hldc.co.jp/blog/2019/07/11/2819/

プロトコルに関しては別の講座があるみたいなのでそっちで勉強しようかな。

<h3>tmux</h3>
仮想端末ソフト。複数のウインドウを開くことでコンソールを操作できる。特にインストールは必要なく`tmux`と打てば使える。

`tmux a` : アタッチ 再接続する
`tmux ls` : 現在開いてるtmuxを確認する

<h4>tmuxコマンド</h4>

:::note
[ctrl + b] + d : デタッチ 元の画面に戻る
[ctrl + b] + c : 新しいウインドウを作成
[ctrl + b] + ページ番号 : 指定したウインドウを表示
[ctrl + b] + x : ウインドウを閉じる
[ctrl + b] + ? : tmux ヘルプ
:::

慣れるまで大変かも。

<h3>その他コマンド</h3>
ncコマンド : NetCat。TCPやUDPの読み書きを行う。
telnetコマンド : リモートのコンピューターにアクセスしてターミナルのセッションを開始する。


<h2>bash シェル</h2>
:::note
シェル : LinuxOSのカーネルを包み込み、OSと対話する機能
:::

`touch my-first.sh` でshファイルを作成

:::note
touch : 引数で渡された名前のファイルが存在しなかった場合には、空ファイルを作成。存在した場合には、そのファイルやディレクトリの更新日時を更新する。
:::

```bash
#!/bin/bash
ls
date
echo メッセージを入力してください。
read message
echo 入力されたメッセージ: $message
```

:::note warn
改行コードは「LF」にすること
:::

<h3>シバン(shebang)</h3>
`#!/bin/bash`
このシェルスクリプトを /bin/bash にある bash シェルで実行してほしい、という記述

<h3>権限</h3>
`chmod a+x`
a: すべてのユーザーに
+: 指定した権限を付与する
x: 実行

https://qiita.com/shisama/items/5f4c4fa768642aad9e06

<h3>コマンド</h3>
:::note
echo : 第一引数で与えられた文字列をそのまま標準出力に出力。
read : 第一引数で与えられた名前の変数に、標準入力で与えられた文字を代入する。
:::

read コマンドは、 `-p` "表示したい文字列" というオプションをつけることで文字を表示しながら入力を変数に受け取る。

<h3>shファイルの実行</h3>
実行するためには、`./`を含んだ相対パスで実行する必要がある。

:::note warn
./ を付けずに実行できるのは、どのディレクトリにいる時にも共通して使えるように設定した、特定のディレクトリ内にある実行ファイルのみ。たとえば /bin ディレクトリにある実行ファイルは、コマンドとして使うことができる。
:::

<h3>if文</h3>

```bash
#!/bin/bash
read -p "日本で二番目に高い山は槍ヶ岳でしょうか？ [y/n]" yn
if [ $yn = "n" ]; then
    echo 正解です。日本で二番目に高い山は北岳です。
else
    echo 不正解です。日本で二番目に高い山は北岳です。
fi
```

:::note warn
[] と変数、演算子 の間には必ず半角スペースを入れること
:::

<h3>for文</h3>
```bash
#!/bin/bash
read -p "テンプレートディレクトリのディレクトリ名を入力してください" dirname
mkdir $dirname
#mkdir ./$dirname/1
#mkdir ./$dirname/2
#mkdir ./$dirname/3
for ((i=1 ; i<4 ; i++))
do
mkdir ./$dirname/$i
done
```

for文の記述は自分で調べました。

<h3>参考</h3>
シェル変数はすべて文字列扱いであるため、数値計算のためには専用のコマンドを用いる必要がある。

https://www.qoosky.io/techs/285360168e

https://qiita.com/akinomyoga/items/9761031c551d43307374


<h2>まとめ</h2>
ネットワークに関しては別で本を読んだほうがいいかもしれない。何かお勧めがあれば教えてください。
bashシェルはもっといろんなことができそうでわくわくします。
Rubyのclass

## はじめに
rubyのclassについてまとめてみた
JavaScriptと似てる。

## clsss
@ nameはインスタンス変数
アクセサーの設定なしだとインスタンス変数は内部でしか参照できない

```rb
class Menu

#initializeメソットで引数を受け取る
  def initialize(name, price)
    @name = name 　　# 属性(メンバ変数)
    @price = price　# 属性(メンバ変数)
  end
  
  # インスタンスメソットを作成
  def cal_tax
    p @price * 1.08
  end
  
  def cal_sum(item1, item2)
    p item1 + item2
  end
  
  # アクセサーを記述(外部から参照したい場合)
  attr_accessor :name, :price
  
end
```
## インスタンス化
```rb
# インスタンス生成時にインスタンス変数を設定
menu1 = Menu.new('高級寿司', 1800)
```

## classの継承
```rb
class Menu ...

# 新しいクラス > 親クラスで継承できる
# 親クラスのインスタンス変数とメソットを継承できる
class Food > Menu

#新たなインスタンス変数を追加
attr_accessor :calorie

#新たなメソットを追加
def calorie_info 
  return "#{self.name}は#{self.calorie}kcalです"
end

end
```

**オーバーライド**
子クラスのメソットを親クラスのメソットと同じにして上書きする

---
## superで親クラスの同名のメソッドを呼び出す
親クラスのメソッド内の重複

```rb
class Food < Menu
  attraccessor :calorie
  
  def initialize(name:, price:, calorie:)
  
  # 親クラスの同名のメソッドを呼び出す
    super(name: name, price: price)
    
    self.calorie = calorie
    
  end
  
end
```

---
外部から参照したい場合はアクセサーを使う
キーワード引数も使える
クラスメソッドを追加する

```ruby
class Menu

#アクセサーを記述
  attr_accessor :name
  attr_accessor :price
  
# initializeメソットで引数を受け取る
# selfはthisみたいなもの
  def initialize(name:, price:,)
    self.name = name
    self.price = price
  end
  
  ## クラスメソッドを追加
  # def クラス名.メソッド名 もしくは def self.メソッド名
  def Menu.class_name?
    # 処理
  end
  
end

# インスタンス生成時にインスタンス変数を設定
menu1 = Menu.new(name: "ピザ", price: 800)

# インスタンスの変数を参照する
puts menu1.name

# クラス名を呼び出す
# クラスメソッドはクラスの中でも呼び出せる
puts Menu.class_name?


# インスタンスに対して呼び出すメソット →　インスタンスメソット
# クラスに対して呼び出すメソッド　→　クラスメソッド
```

## JavaScriptと比較

```js
// JavaScript
class Person = {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
  
  hello() {
    console.log(`私は${this.name} ${this.age}です`)
  }
}

```

```rb

# Ruby
class Person
  def initialize(name, age)
    @name = name
    @age = age
  end
  
  def hello
    p "私は#{@name} #{@age}です"
  end
  
end
```

すごく似てる。
JSの場合class外部からデフォルトでプロパティを参照できる
Rubyは外部からインスタンス変数を参照したい場合、アクセサーが必要

## 終わりに
始めてプログラム言語を学んだ時と比べて格段に理解しやすい。
基礎を固めるのは大事だとよく言われているので、Rubyは書籍を使って詳しく学んでいきたい。