OmniAICreator/Qiita-1.07M huggingface dataset:
Zoom 提携開発パートナー 富士ソフト

## はじめに

本記事では Zoom の提携開発パートナーの各社に記事中にテキストでインタビューを行います。 Zoom 提携開発パートナーは Zoom Developer Platform のさまざまな API や SDK でシステムを構築した実績があり、Zoom の審査を通った実績がある開発パートナーです。また、提携開発パートナーの各社は日々進化を遂げている Zoom Developer Platform の最新のアップデートにも常にキャッチアップしていただける体制を構築していただいています。

:::note warn
Zoom Developer Platform (API/SDK)の詳細については Zoom Japan の Qiita Organization Pageをご確認ください。
https://qiita.com/organizations/zvc
:::

今回は提携開発パートナーの富士ソフト株式会社にインタビューをさせていただければと思います。回答いただくのはシステムインテグレーション事業本部ネットサービス事業部の小一原様です。よろしくお願いいたします。

## 会社紹介について

>富士ソフトは、1970年に創業した独立系のITソリューションベンダーです。
グループ1万人を超えるエンジニアの力を結集し、通信インフラ、社会インフラ、機械制御などの組み込み系ソフトウェア開発のほか、業務系ソフトウェア開発やネットビジネスソリューションに至るまで、幅広い技術を提供しています

## 提携開発パートナーになった経緯について

>2020年の世界規模の感染症流行により、私たちは従来の働き方を大きく変える必要に迫られ、社内のコミュニケーションも取りづらい状況が続きました。
そのような中、富士ソフトではオフィスにいるときと同じようにコミュニケーションが取れる仕組みを開発したいと企画し、仮想オフィス空間「FAMoffice（ファムオフィス）」のサービスを立ち上げました。
さらに、日常的に行われていたイベントや懇親会も同じ様に仮想空間上で実現できないかと考えて立ち上げたのが、仮想イベント空間の「FAMevent（ファムイベント）」でした。この仕組みは社内で多くの反響を呼び、もっと多くの方々に使って貰いたいとサービス化しました。

>当初は1フロア50名の小規模イベントでの利用を想定していましたが、お客様から100名を超えるようなイベントのリクエストを頂くことが多く、その実現にはZoom Developer Platformを利用したZoom Meeting SDKが不可欠だったのです。

>サービス化に向けては、Zoom様の多大なるご支援を頂いたことで技術的な課題をクリアでき、無事に2022年11月にサービスインしました。

## Zoom Developer Platform の開発実績について

>Zoom Developer Platformは、Web、Windows OS、mac OS、Android、iOSと多彩なプラットフォームがサポートされています。Zoomの高品質、多機能なビデオサービスを活用することで、アイデア次第で様々なサービスを実現できることが最大の魅力と考えています。
今回FAMeventの開発にあたっては、Zoom Developer Platformの様々な機能を検証し、その魅力を確かめてきました。
今後も魅力的な機能がアップデートされることを楽しみにしています。


## 読者へのアピールポイントについて

>今回ご紹介したFAMeventは、Zoom機能の活用により、1,000名規模の大規模なイベントでも仮想空間上で開催できます。社外向けのウェビナーや研修会、商談会、社内向けのイベントや懇親会など、「たくさんの人と気軽にコミュニケーション」できます。
是非皆さんも一度体験してみませんか？
また、 Zoom Developer Platformに関する開発でのお困りごとなども、是非ご相談ください。


## お客様からの問い合わせ先について

>Zoom Developer Platformに関する開発プロジェクトをご相談頂く際には、下記FAMeventの「お問い合わせ」ページよりお問い合わせください。是非お待ちしております。

>（お問い合わせ先）
https://www.fsi.co.jp/famevent/


## まとめ
いかがでしたでしょうか。Zoom Developer Platform で Zoom の API や SDK を利用したシステムを企画しているのだけれども、社内に開発エンジニアがいない、あるいは足りないという場合は、ぜひ Zoom 提携開発パートナーに開発をご依頼することも検討ください。

なお、 Zoom Developer Platform の利用には Zoom のライセンスや契約が必要となりますので、詳しくはこちらの記事もご確認いただければと思います。
https://qiita.com/kensano/items/554a4ad5725d8b2e6b7d

最後に開発会社で Zoom 提携開発パートナーになりたいという企業のご担当者様はこちらからご連絡ください。
https://explore.zoom.us/ja/contactsales/
PHP ファイルパス（文字列）のファイル部分以外を取得する

:::note info
この記事は[miriwoお一人様 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/miriwo)の22日目の記事です
:::

# 概要

- PHPの組み込み関数を使ってファイルパスから、ファイル名を除いたパスを取得する方法をまとめる。

# 方法

- 組み込み関数の`dirname()`を使う。
- `dirname()`は下記のように使う。

    ```php
    dirname（ファイルパス, 階層指定[オプション])
    ```

- 例えば`foo/bar/hoge/piyo/test.csv`というファイル名込のパス情報があったとする。これのファイル名を除いたパスを取得したい場合下記の様に記載し実行する。

    ```php
    $fullPath = 'foo/bar/hoge/piyo/test.csv';

    echo dirname($fullPath);
    // foo/bar/hoge/piyoが出力される
    ```

- 階層指定を行うことでパスのどの階層までを取得するかを設定する事ができる。階数はintで設定する。階数は「カレントディレクトリから何階層上までを取得するか」を設定する。
- 今回でいうとカレントディレクトリが「test.csv」ということになるので、第二引数に1を設定したら「test.csv」 から1階層上のパスを出すので指定しなかった場合と同じで`foo/bar/hoge/piyo`が出力される。第二引数に2を設定したら「test.csv」 から2階層上のパスを出すので`foo/bar/hoge`が出力される。例を下記に記載する。

    ```php
    $fullPath = 'foo/bar/hoge/piyo/test.csv';

    echo dirname($fullPath); // foo/bar/hoge/piyoが出力される
    echo dirname($fullPath, 1); // foo/bar/hoge/piyoが出力される
    echo dirname($fullPath, 2); // foo/bar/hogeが出力される
    echo dirname($fullPath, 3); // foo/barが出力される
    echo dirname($fullPath, 4); // fooが出力される
    ```

# 参考文献

https://www.php.net/manual/ja/function.dirname.php
3ヶ月で100記事投稿達成した私がアウトプットについて語る

## はじめに

こんにちは！
未経験から転職したバックエンドエンジニア2年目の @kat0 です。

2021年9月からQiitaでアウトプットし始めて1年数ヶ月経ちました。
- 3ヶ月で100記事投稿を達成
- 2021年記事投稿数ランキング42位
- 現在の投稿数217記事

https://qiita.com/Qiita/items/28e1aa0967e607d145fa


## アウトプットし始めたきっかけ
きっかけは、入社したばかりの3ヶ月間の目標を決める1on1で
>「駆け出しだからこそ何かアウトプットして習慣をつけよう」
→「そのために期限を決めてQiitaで記事を書こう」
→「3ヶ月で100記事投稿しよう！」

ということで私のアウトプット人生が始まりました。
最初はエラーで詰まることが多く、その解決方法をメモ的に書き始めました。

3ヶ月で100記事投稿は結構かなりきつかったですが、
- 記事を投稿したら社内のSlackで「投稿しました！」と報告
- 毎週のプロジェクト定例でQiitaでのアウトプット状況を報告
(「今週○記事投稿しました」「いいねもらえました！」「めっちゃ編集リクエストしてくる人います…」など)

をやることでなんとか達成できました！

## アウトプットで得られたこと
- 調べて「ふーん」でわかった気になっていたことをちゃんと言語化することで理解を深められる
- 過去の自分が書いていた記事のおかげで、同じところで詰まったときに以前より秒速で解決できる
- アウトプットに抵抗がなくなった
- アウトプットしてきたという目に見える実績や、アウトプットしてきた記事自体が資産になる
- 社内で「Qiitaといえば、アウトプットといえばこの人」という存在になれる


## アウトプットしていて嬉しかったこと
- 毎朝Qiitaのマイページを開いていいねやストック、コメントの通知があると嬉しい
- 反応があると「誰かに何かしらの影響を与えられているんだ」と実感できる
- 社内で「ひとりで200記事も書いてるのすごい！」と褒められる
- 社内で誰も見てないと思っていたけど「記事見てるよ」と言ってもらえる


## アウトプットしてみたいけど気が乗らない人へ
「へ〜こんなふうに書けるんだ」
「エラー解決するためにいろいろ調べたことまとめとこ」
「詰まったところ全部、未来の自分のためにメモしとこ」
くらいの気持ちで書き始めれば大丈夫です！

**正直誰も見てません！！**(意外とそんなことない)
タイムラインに流れてくる、いいね数100超えのような立派な記事じゃなくてもいいんです！
「しょうもない、こんなこと誰の役に立つのか」という内容でもどんどん投稿してみましょう！

私の最初の方の記事を見てもらえれば分かる通り、本当にしょうもないことでも投稿してます(笑)
でも意外とそういう記事に限っていいねされるし閲覧数も多いので、自分が思っている以上に人の役に立っているのかなと思います。

## さいごに

アウトプットはいいぞ！
Zoom 提携開発パートナー プラムザ

## はじめに

本記事では Zoom の提携開発パートナーの各社に記事中にテキストでインタビューを行います。 Zoom 提携開発パートナーは Zoom Developer Platform のさまざまな API や SDK でシステムを構築した実績があり、Zoom の審査を通った実績がある開発パートナーです。また、提携開発パートナーの各社は日々進化を遂げている Zoom Developer Platform の最新のアップデートにも常にキャッチアップしていただける体制を構築していただいています。

:::note warn
Zoom Developer Platform (API/SDK)の詳細については Zoom Japan の Qiita Organization Pageをご確認ください。
https://qiita.com/organizations/zvc
:::

今回は提携開発パートナーの株式会社プラムザにインタビューをさせていただければと思います。回答いただくのはプラムザの辰巳様です。よろしくお願いいたします。

## 会社紹介について

>弊社は1998年創業の受託専門のシステム開発会社です。業種業界問わず幅広いジャンルの業務システムの開発、BtoBシステム、BtoCのWebサービスの開発を得意としています。
受託専門、といいつつも最近は自社内で新サービスやパッケージ商品の開発、ITと親和性の高い新規事業に取り組むなど、日々新しい価値を皆様に提供できるように取り組んでいます。


## 提携開発パートナーになった経緯について

>Zoomの [@yosuke-sawamura](https://qiita.com/yosuke-sawamura) さまからお問い合わせフォーム通してご連絡いただいたのがきっかけです。
弊社としても新しいことにチャレンジする機会を模索している中で、大変ありがたいオファーでした。その後Zoomさんの営業用サンプルの作成、ウェビナーへの登壇、定期的な情報交換などをさせていただくようになりました。

## Zoom Developer Platform の開発実績について

>上記でも言及しました営業用サンプルの作成をはじめ、Zoom様よりご紹介いただくクライアント様の要件ヒアリングから実施検証、受注したお客様にはゼロイチからフルスクラッチでのシステム開発、既存のシステムの組み込みなど、どんなものにも積極的に関わらせていただきます。言語も弊社はPHPが得意ではあるのですが。TypeScript、Node.jsなど近年人気のある技術にも触れる機会を作って間口を広く保つようにしています。

## 読者へのアピールポイントについて

>受託開発という枠組みを超えて、弊社では24時間365日のサーバ有人監視サービス　https://cover365.plumsa.co.jp/ 、ECサイトなどのカゴ落ち等トラブルを未然に防ぐパッケージ https://jinriki.plumsa.co.jp/ 、そしてこのZoom様との提携 https://zoom.plumsa.co.jp/ と幅広くチャレンジをありがたいことにさせていただいております。
かつ社内では事業部制を採用しており、クライアント様にあったチーム及びPMが親身になって業務にあたらせていただきます。
もしご興味ある方はぜひともお問い合わせください。

## お客様からの問い合わせ先について

>https://www.plumsa.co.jp/contact/
こちらから弊社のウェブサイトの問い合わせフォームにアクセスすることができます。
https://www.plumsa.co.jp/download/
弊社のことをよりもっと知ってもらうための資料もこちらにご用意しております。

## まとめ
いかがでしたでしょうか。Zoom Developer Platform で Zoom の API や SDK を利用したシステムを企画しているのだけれども、社内に開発エンジニアがいない、あるいは足りないという場合は、ぜひ Zoom 提携開発パートナーに開発をご依頼することも検討ください。

なお、 Zoom Developer Platform の利用には Zoom のライセンスや契約が必要となりますので、詳しくはこちらの記事もご確認いただければと思います。
https://qiita.com/kensano/items/554a4ad5725d8b2e6b7d

最後に開発会社で Zoom 提携開発パートナーになりたいという企業のご担当者様はこちらからご連絡ください。
https://explore.zoom.us/ja/contactsales/
IBM RPAのスクリプトをコピー&ペーストする方法

## はじめに
IBM RPAにはリポジトリーという機能が存在し、他のユーザーが公開したスクリプトをダウンロードし動かすことができます。その一部を活用し、新しくスクリプトを作成したいという時もあるのではないでしょうか。そこで今回は、スクリプトをコピーする方法をご紹介したいと思います。

## よくあるスクリプトのコピーの間違い
普段スクリプトを作成する時はDesignerビューで作業されていると思います。ここで、コピーしたいコマンドを選択しコピーし、作成しているスクリプトにペーストします。この方法でも出来たように見えるのですが、類似性によるイメージの検索コマンド(findImage)で領域セレクターを活用した場合や、以下のように任意のコマンド内で新規変数を追加した場合などは、その内容をコピーすることができません。
![スクリーンショット 2022-12-22 170530.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737895/7569327a-aae2-cb1f-bb8e-ee2796dde010.jpeg) ![スクリーンショット_20221222_172129.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737895/a587a058-e45d-7e2b-d2bb-481ea92f9ab5.png)

そのため、以下のようなエラーが出てしまいそのボットを動かすことができません。
![スクリーンショット_20221222_173845.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737895/752a93ec-1da2-e937-e5d1-b616ab64bb44.png)


## 正しいスクリプトのコピーの仕方について
スクリプトビューに切り替えると、新規変数として追加した内容も確認することができます。その場合の注意点としては、使用したいコマンドの行(以下の写真だと3,4行目)のみコピーするのではなく、冒頭にある変数の定義の行(以下の写真だと1,2行目)もコピーする必要があります。
![スクリーンショット_20221222_174016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737895/0ac67785-eab0-6da7-2b3e-b58fb0562850.png)
ペーストする先は、Designerビューでもスクリプトビューでもどちらでも問題ありません。

## おわりに
他のスクリプトをコピーすることで効率的な開発をすることができるようになるのではないでしょうか。

ご覧いただきありがとうございました。
セキュリティ・パッチ

[Teradata Vantage - セキュリティ管理ガイド](https://docs.teradata.com/r/bA1wB88x_bsZxqkhvCF0mQ/D5QuHHrmM30Jny4hP_yWrg) [2022/12/08時点]の翻訳です。

VantageCloudにおける、システムセキュリティについてご説明させていただきます。

:::note information
各機能の詳細な説明に関しては、段階的にリンクを追加していきますので、リンクから詳細ページを参照してご利用下さい。
:::

# セキュリティ・パッチ
もし脆弱性が発見された場合、VantageCloudは脆弱性のレベルに合わせて、お客様への影響が大きいものからパッチ対応を実施していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962009/0de5263f-3a8c-c84e-d424-473ab7b0d9a7.png)
VantageCloudでは、標準でプレミアサービスが付帯しています。日本語サービスが必要な場合は、これにプラスしてエッセンシャルサービスをご契約いただく必要がございますが、いずれのサービスにもセキュリティパッチ含む「ソフトウェアパッチアップ」サービスが標準で含まれております。

脆弱性管理のプロセスで、脆弱性が発見され、対応が必要と判断された場合、次のステップとして「セキュリティパッチの作成およびパッチ適用」を実施することなります。セキュリティパッチの作成が必要と判断された場合は、脆弱性のレベルに合わせて対応を実施します。


## おわりに
:::note warn
警告
この本書は[Teradata Vantageドキュメンテーション](https://docs.teradata.com/)よりトピックに必要な情報を抜粋したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
脆弱性管理

[Teradata Vantage - セキュリティ管理ガイド](https://docs.teradata.com/r/bA1wB88x_bsZxqkhvCF0mQ/D5QuHHrmM30Jny4hP_yWrg) [2022/12/08時点]の翻訳です。

VantageCloudにおける、システムセキュリティについてご説明させていただきます。

:::note information
各機能の詳細な説明に関しては、段階的にリンクを追加していきますので、リンクから詳細ページを参照してご利用下さい。
:::

# 脆弱性管理
VantageCloudは脆弱性を日々モニタリングして、日々対応を実施しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962009/76a8ce92-9184-10ed-71c3-62738db63021.png)

テラデータ社は、PCIDSSに準拠した、APPROVED SCANNING VENDOR (ASV)脆弱性スキャンを定期的に実施しております。

:::note information
ASV脆弱性スキャンとは？
PCI DSSに認定されたベンダーによる、システム脆弱性スキャンのことであり、認定ベンダーはこれを定期的に実施・報告することが義務付けられています。
:::

このスキャンは、VantageCloudを構成するシステムの、すべてのIPアドレスに対して、最新の脆弱性スキャナー構成を使用して実施されます。スキャン結果をレビューすることで脆弱性を特定し、これをお客様に対するリスクの観点から評価・分類したうえで対応が決定されます。

高リスクの脆弱性は、30 日以内に対応、中リスクの脆弱性は 90 日以内に対応されます。 


## おわりに
:::note warn
警告
この本書は[Teradata Vantageドキュメンテーション](https://docs.teradata.com/)よりトピックに必要な情報を抜粋したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
ウィルス対策

[Teradata Vantage - セキュリティ管理ガイド](https://docs.teradata.com/r/bA1wB88x_bsZxqkhvCF0mQ/D5QuHHrmM30Jny4hP_yWrg) [2022/12/08時点]の翻訳です。

VantageCloudにおける、システムセキュリティについてご説明させていただきます。

:::note information
各機能の詳細な説明に関しては、段階的にリンクを追加していきますので、リンクから詳細ページを参照してご利用下さい。
:::

# ウィルス対策
VantageCloudはすべてのサーバでウィルス対策を行っており、安心してサービスをご利用いただけるようにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962009/ee3cf4b4-b330-f2fa-3228-2ebda75bea56.png)
ウィルスの定義情報は毎日自動で更新されたうえでスキャンが実施されております。
各サーバからのウィルススキャン結果は前述のセキュリティインシデント管理システム（SIEM）に連携されたうえで、不正検知に生かされます。

## おわりに
:::note warn
警告
この本書は[Teradata Vantageドキュメンテーション](https://docs.teradata.com/)よりトピックに必要な情報を抜粋したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
Athena の mismatched input 'EXTERNAL'. Expecting: 'OR', 'SCHEMA', 'TABLE', 'VIEW' に終止符

# 背景
Athena テーブルを作成する際にクエリを流すと次のようなエラーが出て失敗する必要があります。

```
mismatched input 'EXTERNAL'. Expecting: 'OR', 'SCHEMA', 'TABLE', 'VIEW'
```

# 課題
ググると主に以下のような内容が散見しています。

- テーブル名にハイフンが入ってはダメ
- 先頭が数字だとダメ
- etc...

さて、これは本当でしょうか？
結論を先に言うと間違ってます。

ハイフンも使えますし、先頭に数字も使えます。

# 解決
テーブル名を `` ` ``（バッククオート）で括りましょう。
```
`database`.`table`
```

としてあげれば大丈夫です。
テーブルが作れないのではなく、クエリを解釈できないというのが正しいですね。

# 一言

`` ` ``（バッククオート）で括っても `.`（ドット）が使えないとかあるので気を付けましょう！
不正アクセス検知

[Teradata Vantage - セキュリティ管理ガイド](https://docs.teradata.com/r/bA1wB88x_bsZxqkhvCF0mQ/D5QuHHrmM30Jny4hP_yWrg) [2022/12/08時点]の翻訳です。

VantageCloudにおける、システムセキュリティについてご説明させていただきます。

:::note information
各機能の詳細な説明に関しては、段階的にリンクを追加していきますので、リンクから詳細ページを参照してご利用下さい。
:::

# 不正アクセス検知
VantageCloudは不正アクセス検知を実施しており、脅威を検出し、お客様に通知するとともに、プラットホーム側での改善策を日々講じています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962009/8872de16-afa1-92bf-2a58-49caab669f51.png)

具体的には、IPS（intrusion prevention system）を導入してネットワーク上の不正パケットを検知し、不正アクセスを発見した場合はパケットをドロップすることで防御します。IPSの検知パターンは、毎日自動で更新されており、新たな不正アクセスへの対応を図っています。

また、IPSの結果含め、すべてのログおよびイベント情報はセキュリティインシデント検知システム（SIEM）に連携されます。SIEMは集まったログおよびイベント情報をリアルタイムで正規化（フォーマット統一等）したうえで分析します。複数のイベントログを組み合わせて相関分析をすることにより、結果の可視化および対応ルールの策定を行うことが可能となります。

テラデータのセキュリティチームはSIEMのレポートおよび検出されたセキュリティインシデントをもとに重要度を判断、個々の対応を検討します。


## おわりに
:::note warn
警告
この本書は[Teradata Vantageドキュメンテーション](https://docs.teradata.com/)よりトピックに必要な情報を抜粋したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
セキュリティインシデント検知

[Teradata Vantage - セキュリティ管理ガイド](https://docs.teradata.com/r/bA1wB88x_bsZxqkhvCF0mQ/D5QuHHrmM30Jny4hP_yWrg) [2022/12/08時点]の翻訳です。

VantageCloudにおける、システムセキュリティについてご説明させていただきます。

:::note information
各機能の詳細な説明に関しては、段階的にリンクを追加していきますので、リンクから詳細ページを参照してご利用下さい。
:::

# セキュリティインシデント検知
VantageCloudはセキュリティ・インシデントを常にモニタリングしており、不正なアクセスや、システムレベルの改善すべき箇所を確認することで、日々セキュリティ性を高めています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962009/7d5c43b5-0fec-18c9-858c-daf3a02f4043.png)

監視対象としては、「成功失敗したログオンイベント」「アカウントの管理イベント」「ポリシー変更」「システムイベント」「管理者アクティビティ」「認証チェック」「権限チェック」「アクセス許可の変更」等、多岐にわたります。

これに加えて、「お客様からの報告」「運用担当者からの報告」「24時間365日稼働のヘルプデスクを通じた報告」および、自動でログ収集等を行う「セキュリティインシデント検知システム（SIEM）からのアウトプット」を監視しています。

これらを監視することで、潜在的なセキュリティインシデントの検出およびセキュリティパッチの作成を日々行っております。

## おわりに
:::note warn
警告
この本書は[Teradata Vantageドキュメンテーション](https://docs.teradata.com/)よりトピックに必要な情報を抜粋したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
vue2 input要素のイベントハンドラにvalue以外の第二引数を渡す方法


# やりたいこと
・vue2でinput要素のイベントハンドラにvalue以外の第二引数を渡す

# 解決方法
$eventと渡したい引数を入れる

```
@input="onInputEvent($event,n)
```

<a id="#reference"></a>
# 参考文献
- [【Vue.js】イベントオブジェクトと任意の引数を同時に受け取る](https://negalog.com/vue-event-object-argument/)
auひかりのHGWの接続上限問題を解決する

# はじめに
直接プログラミングに関することではないが、在宅勤務が増えた家庭内のネット環境構築のために参考になればと思い、記事に残すこととした。

# HGWの問題点
auひかりを利用している方はご承知の通り、auひかり指定のHGW（ホームゲートウェイ）を使用しなければならないようになっている。このHGWがちょっと曲者で以下の特徴がある。

- ルータ機能を含んでいて、オフにすることができない
- Wi-Fiアクセスポイントとして利用するには有料

そのため、シンプルに利用するには、課金した上でこのような構成にする。
```
ONU──HGW─[Wi-Fi]─各種機器
        └─[有線]─各種機器
```

でも搭載されているWi-Fiはしょぼいし、課金はしたくないので大半の人はこういう構成で使用していると思う。私も最近までこの構成だった。

```
ONU──HGW───自前ルータ(ブリッジ/APモード)─[Wi-Fi]─各種機器
        │                └─[有線]─各種機器
        └─[有線]─各種機器
```

※有線接続機器は、HGWと自前ルータのどちらに接続してもネットワークとしては同じ。

しかし、この構成ではHGWのルータ機能がしょぼすぎるという問題に行き着く。
個人的に致命的となったのは、接続機器が10数台あたりを超えると、
新たに接続された機器はインターネットに接続できなくなる問題が発生する点である。
しかも確実ではなく、できたりできなかったりとかなり動作が不安定。
例えば、接続できていたスマホが突然インターネットにアクセス不能になる。
（ただし、Wi-Fiや有線でリンクそのものは維持される）

他の機器を切断して、台数を減らしても一度除外された機器は
二度とインターネットに接続できない。
解決するには、HGWを再起動する以外に手はない。
再起動すれば、１日～数日レベルで全部の機器が接続出来たりする。
（これも台数次第では、何台かは絶対に接続できないのだろう）

十数台以上の機器を使っているお前が悪いと言われそうだが、
15年くらい前ならたしかにPC以外で接続する機器はあまりなく、
普通の家なら10台も繋がれば十分すぎただろう。
でも令和の今の時代、スマートデバイスが増えていて、
さらに在宅勤務に伴って職場機器も接続するので、どんどん接続台数は増えている。
普通の家庭でも下記くらいルータにつながっていてもなにもおかしくない。

- PC:2~4台
- スマホ:2~4台
- タブレット:1~2台
- プリンタ、NAS類：1~2台
- テレビ、Chromecast類：1~2台
- スマートスピーカー：1~3台
- スマート家電：1~10台

どう考えても簡単に20台近くは行く。

# 解決方法
結局、二重ルータしかない。
ただ、自前ルータをDMZにおいてしまえば二重ルータの弊害はなく、
実質的にHGWのルータ機能を切っているのとほぼ同等の動作になる。
（HGW側に自前ルータ以外の機器を接続しなければ）

```
ONU──HGW──(DMZに設定)─自前ルータ(ルータモード)─[Wi-Fi]─各種機器
                               └─[有線]─各種機器        
```

HGWのDMZホスト機能をオンにして、DMZホストのIPアドレスに自前ルータのIPアドレスを指定する。
自前ルータのIPアドレスは固定にしておく必要がある。

DMZホスト機能の設定はBL900HWの場合は、
管理画面⇒詳細設定⇒その他の設定⇒DMZホスト設定にある。

配線、設定が完了したら、HGWを再起動する必要がある。
これをやっていなくてしばらく繋がらないと慌ててしまった。

# DMZってなに？
DeMilitarized Zoneの略で直訳すると「非武装地帯」（なにそれかっこいい！？）
LAN側から隔離されたネットワーク上の区域のことらしい。

外部にサーバを公開する場合に、攻撃対象となったり、セキュリティリスクがある。
公開するサーバをDMZに入れておけば、たとえそのサーバが攻撃されても
LAN側のほかの機器からは隔離されているので影響が及ばないってのが本来の用途。

また、外部への公開が前提なので、外部からは直接アクセスできる。
そのため、セキュリティ対策をしていない機器を入れるのは危険（非武装なのに）
今回の場合は、自前ルータに当然FWがあるので、そこは心配ないはず。

# 備考
BL900HW/BL1000HW世代まではすべて同様の現象が発生する。
BL1500HM/BL3000HM世代はもしかしたら解決しているのかも。期待薄だが。

HGW以外のNEC製ルータも同様なのかはわからない。
少なくともNEC製は怖くて買えない。

# KDDIさん
回線は速くていいのに、しょぼいルータを強制されることで、
普通の家庭でも使用しづらいものになっている。
HGWのルータ機能を強化するか、ルータだけオフにできるようにして、
好きなルータを使わせてください。
Illustratorで簡単カレンダーづくり

突然ですがみなさんは来年のカレンダーはもう購入済みでしょうか。
用意が済んでいる人もまだこれからの人も、Illustratorで自分だけのカレンダーを作ってみませんか？
というわけでIllustratorを使った簡単なカレンダーの作り方をご紹介いたします🎍

## 準備
日〜月、1〜31まで曜日・日付ごとに改行されたテキストを用意して、コピーしておいてください。
※月曜はじまりがいい！という方は曜日の部分を月〜日の順番にしておきます。

## Illustratorでの作業
![スクリーンショット 2022-12-22 2.41.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889741/75c2a790-88c5-8206-af30-114cbf1501f5.png)
長方形ツールで四角を作成します。
![スクリーンショット 2022-12-22 2.42.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889741/3e652e4d-867d-9399-c031-1cb5ca78a64f.png)
[オブジェクト]→[パス]→[グリッドに分割]をクリックします。
行と列の段数をそれぞれ7にしてOKをクリックします。（間隔は0で大丈夫です）
![スクリーンショット 2022-12-22 2.43.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889741/779d1170-7646-eebd-0be0-8801aec4f8e3.png)
つづいて、[書式]→[スレッドテキストオプション]→[作成]をクリックします。
上図のようになるので、先ほどコピーしたテキストを左上からペーストします。
![スクリーンショット 2022-12-22 3.12.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889741/a33d21dc-4cac-67c4-b46a-35d85a206866.png)
上図のようになるようにテキストサイズを調整したら、お好みのフォントを選んで自分だけのカレンダーを作ってみましょう☺️
![スクリーンショット 2022-12-22 3.24.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889741/73eecdcc-f9be-b370-c67c-f69d2121401f.png)
土曜や日曜の列は色を変えるとさらにカレンダーらしくなります。
色を変えたい列全体を選択し（空の行も選んでおきましょう）、文字色ではなく、アピアランスの塗りを追加・好きな色に変更します。
![スクリーンショット 2022-12-22 3.25.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889741/e9298858-67a3-e43f-4c22-19a8b1d225b1.png)
日付のはじまりは土と1の間を改行することでずらすことができますが、文字色ではなくアピアランスで塗りを追加しておいたことで、日と土の列の色がずれないのでカレンダーの複製が簡単になります。
逆に、毎月固定の日にちの色を変えたいなという時はアピアランスの塗りではなく文字色を設定することで、毎月ずれずにその日にちの色を変えられます。
![スクリーンショット 2022-12-22 16.34.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889741/c6e13edd-402d-c4c5-bbe6-56ce4132629c.png)
曜日部分の文字サイズを調整してアピアランスでざぶとんを追加したり、好きなイラストを付けてみたりと調節をして、カレンダーの完成です！
## まとめ
他にも、印刷して書き込めるように日付の部分を大きくつくったり、罫線をくわえたりなどして自分にとっての理想のカレンダーを作ってみると、新年がより楽しみになるかと思います！
ぜひ、年末年始など少しゆとりのある時に試してみてはいかがでしょうか🐇
それではみなさまよい年末年始をお過ごしください♪
NVDA + VSCodeでプログラミングする時に導入したい設定・アドオン

スクリーンリーダーを使ってプログラミングをやる場合、環境はNVDA+VSCodeが第一選択になると思います。
VSCodeはアクセシビリティにとても力を入れてくれていて
* 単語移動の時の読み上げがちょっとおかしい（後述のアドオンで治る）
* 統合ターミナルがバグってる 
以外は大体いい感じです。

ただ、より効率良く作業するためには数々の追加の設定・アドオンが必要になるので、以下に2022年12月現在に僕が使ってる物をまとめます！
筆者は展示キーボードを使っていないため、それとの互換性はよく分りません。

## 目次
* [NVDA自体の設定](#nvda自体の設定)
* [NVDAのアドオン](#nvdaのアドオン)
* [VSCodeのアドオン](#vscodeのアドオン)
* [終わりに](#終わりに)

## NVDA自体の設定
* 当たり前かもしれませんが、NVDA+Pキーで記号の読み上げを「全て」にしておきます。これでコード内の記号を全て読み上げてくれるようになります。
NVDAの設定→句読点/記号読み辞書をいじって、「ほとんど」を日本語の「、（てん）」と「。（まる）」以外の全ての記号を読むようにして「ほとんど」で運用するのもオススメです。日本語のプログラミング関連記事が読みやすくなります！

* NVDAの設定→書式とドキュメントにある行インデントを「ビープ音」に設定しておきます。これをすることで、コード内のインデントが音で通知されるようになります。浅いインデントは低い音、深いインデントは高い音で表現されます。

## NVDAのアドオン
### [nvda-word-nav](https://github.com/mltony/nvda-word-nav)
・VSCodeはそのままだとctrl+矢印キーでの単語移動がバグっています。例えば下のような場合、
```typescript
const hoge = 1;
```
本来なら、コンスト→ホゲ→イコールと読み上げられていくべきです。しかし、実際はコンスト→ホゲイコール→ホゲイコールと読み上げられます。
これを直してくれるのがこのアドオンです。ついでに右コントロールキーや、コントロールｷｰとwinキー同時押しで独自ルールで単語移動する機能も搭載しています。

### [nvda-tonys-enhancements](https://github.com/mltony/nvda-tonys-enhancements)
* 細かい機能の寄せ集めのアドンですが、使いたい機能は一つだけです。
VSCodeのアドオンのショートカットキーでカーソルを動かしたとき、このアドオンなしだと移動した先の行が即時に読み上げられません。
このアドオンはショートカットｷｰを動的キーストロークとして登録することでそれを解決してくれます。
後述するVSCodeアドオンのIndentNavのショートカットキーはデフォルトで登録されています。動的キーストロークを編集するには設定の「edit dynamic kystrokes table」から行います。

### [nvda-phonetic-punctuation](https://github.com/mltony/nvda-phonetic-punctuation)
* "{}"、"."、"()"等のプログラミング中に出てくる記号を効果音として出力してくれるアドオンです。中かっこ、中括弧とじ等と読まれるよりも短い音になるので、コードを読むスピードが上がります！
注意点は、全ての記号の音が最初から入ってる訳じゃないので、デフォルトの分で物足りなかったら自分で音源を追加しないと行けないことです。

## VSCodeのアドオン
### [IndentNav](https://marketplace.visualstudio.com/items?itemName=TonyMalykh.indent-nav)
* コード内をインデントを頼りにスピーディに移動できるようになるアドオンです。上述したnvda-tonys-enhancementsを入れていないと、ジャンプした先の行が即時読み上げられないので注意です。また、インデントを頼りに移動するのでprettier等のコードフォーマッターを使う必要があります。
主なショートカットキーは以下です。

| ショートカットキー | 使い道 |
|:-:|:-:|
|  Alt+Up/Down | 前or後の同じインデントレベルの行に移動  |
|Alt+Home/End | 前or後の一段階浅いインデントレベルの行に移動  |
| Alt+PageUp/PageDown | 前or後の一段階深いインデントレベルの行に移動  |
| Alt+Shift+Home/End  | 同一インデントブロック内の最初or最後に移動  |
| Alt+Shift+PageUp/PageDown   | 前or後の同一イデントレベルの行に移動(Alt+Up/Down との違いは、こっちは浅いインデントの行が間にあっても飛び越えられること）  |

### [Error Lens](https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens)
* VSCodeはエラーがある行にカーソルが当たった時に音で教えてくれますが、その行のエラー内容を読むのがデフォルトだとちょっと大変です。ctrl+k, ctrl+iで一応エラー文を表示させることができますが、場合によっては使い方の説明が長文で付随してくるため読みづらいです。それを解決してくれるのがこのアドオンです。
このアドオンを入れると、「Error Lens: Copy Problem Message」というコマンドが使えるようになります。これを任意のショートカットキーに登録しておけば、いつでもエラー行のエラー文をクリップポードにコピーできるようになります。
僕は「ctrl+shift+Alt+O」に登録しています。コピーしたエラーをメモ帳などに貼り付けて読む感じです！

## 終わりに
間違ってるとことか、こっちのほうがいいよ～というのが分かる方いましたらぜひ教えて頂きたいです！
疑問点などあれば、Twitterで@hjakkvhyui31にDM頂ければ分る範囲で答えます！

# no plan株式会社について
- no plan株式会社は、ブロックチェーン技術、Webサイト開発、ネイティブアプリ開発、チーム育成、などWebサービス全般の開発から運用や教育、支援などを行っています。よくわからない、ふわふわしたノープラン状態でも大丈夫！ご一緒にプランを立てていきましょう！
- [no plan株式会社について](https://noplan-inc.com)
- [no plan株式会社 | ブロックチェーン実績](https://noplan-inc.com/blockchain)
- [no plan株式会社 | ブログ一覧](https://noplan-inc.com/blog)
React Native のログを Cloud Watch Logs に送信する方法

私が実装するうえで大変苦労した React Native アプリのログを Cloud Watch Logs に直接送信する方法をご紹介します。
とは言っても、 React Native アプリから直接ログを送信したい場合は稀かもしれませんが...

# 前提

この記事では以下の環境で実装を行なっております。 
* OS：MacOS Monterey 12.6.1の M1チップ
* Android Studio：Chipmunk 2021.2.1
* Node.js：16.16.0
* DB：Firestore

# 苦労した理由

1. React Native のライブラリで Cloud Watch Logsと連携するものが少ない
2. ライブラリがあったとしても、ログを送信するものではなくログを取得するもの
4. Firestore へ書き込み、読み込み、削除したときのデータと Cloud Watch Logs に送信されたデータの順番や値が合わない
5. そもそも技術力が不足している

3について、データは送信した順番で受信されるとは限らないことが勉強となりました。

# 使用したライブラリ
https://github.com/ckckchoudhary/aws-cloudwatch-logger-browser

AWS CloudWatchLogs と Reacr Native の架け橋となるライブラリを使用します。

# ライブラリに変更を加えた箇所
* 「addLogsToStreamメソッド」のエクスポート
    * ファイルのパス
    /~プロジェクトへのパス~/node_modules/aws-cloudwatch-log-browser/index.js
    * 追加したコード
        ```javascript:addLogsToStreamメソッドのエクスポート
        module.exports = {
            addLogsToStream, // ←この1行を追加
        }
        ```
「addLogsToStreamメソッド」をエクスポートすることで、実装の際にログストリームへログを追加することができます！

# 実装手順
## 1. AWSに関しての設定
以下の手順でAWSのアカウントを作成します。
1. [AWS アカウント作成の流れ](https://aws.amazon.com/jp/register-flow/) を参照し、AWS のアカウントを作成
1. [AWS アカウントでの IAM ユーザーの作成](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users_create.html) を参照し、 IAM ユーザーを作成
1. [IAM ユーザーのアクセスキーの作成](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_access-keys.html) を参照し、 アクセスキーを作成

## 2. ライブラリのインストールと依存関係を設定
```
$ npm install aws-cloudwatch-log-browser --save
$ npx react-native link aws-cloudwatch-log-browser      
```
※私の環境の場合「npx」を付けておりますが、環境によっては付けなくても実行できます。

## 3. 「ログストリームの作成」を実装
```javascript
import {createLogStream, addLogsToStream} from 'aws-cloudwatch-log-browser';

const config = { 
	logGroupName: 'ロググループの名前', 
	region: 'ap-northeast-1', 
	accessKeyId: 'アクセスキーID', 
	secretAccessKey: 'シークレットアクセスキー', 
}

createCloudWatchLogsStream = () => {
    createLogStream('ログストリームの名前', config)
      .then(data => console.log('ログストリームの作成に成功しました。', data))
      .catch(err => console.log('ログストリームの作成に失敗しました。', err));
};
```
configのパラメータは適宜変更してください。

## 4. 「ログストリームへのログ追加」を実装
```javascript
import {createLogStream, addLogsToStream} from 'aws-cloudwatch-log-browser';

addLogsToLogStream = () => {
    const entry = 'ログ';
    const logGroupName = 'ロググループの名前';
    const logStreamName = 'ログストリームの名前';
    const region = 'ap-northeast-1';
    const keys = {
      accessKeyId: 'アクセスキーID',
      secretAccessKey: 'シークレットアクセスキー',
    };

    addLogsToStream(entry, logGroupName, logStreamName, region, keys);
};
```
addLogsToStreamの変数の値は適宜変更してください。

# まとめ
今回は React Native アプリのログを Cloud Watch Logs に送信する方法を紹介いたしました。
ライブラリに変更を加える箇所があったりと一筋縄では実装ができず、実装に時間を要しました。
この記事が同じ実装を行う方の手助けになれば幸いです。
[Excel VBA]列番号（数値）をアルファベット表記に変換

たまに忘れた頃に必要になるので、メモとして残す。

**（2022/12/23 追記）**

バグっていたので修正。。。

**（2022/12/26 追記）**

列番号の取り回しの型変更（Long ⇒ Integer）、および、範囲チェック追加

``` VB:toAlphabet
'アルファベット表記変換
Function toAlphabet(piNumber As Integer) As String

    Const COL_LOWER As Integer = 1
    Const COL_UPPER As Integer = 16384
    Const RADIX     As Integer = 26
    Const CHR_BASE  As Integer = &H40

    Dim iNumber As Integer
    Dim iUpper  As Integer

    toAlphabet = ""
    If (piNumber < COL_LOWER Or piNumber > COL_UPPER) Then
        '範囲外（空文字列を返す）
        Exit Function
    End If

    iNumber = piNumber
    If (piNumber > RADIX) Then
        iUpper = piNumber \ RADIX
        iNumber = piNumber Mod RADIX
        If (iNumber = 0) Then
            iUpper = iUpper - 1
            iNumber = RADIX
        End If
        toAlphabet = toAlphabet(iUpper)
    End If
    toAlphabet = toAlphabet + Chr(iNumber + CHR_BASE)

End Function
```

なんとなく再帰で作ったけど、もっと単純な方法もありそう。。。

**（2023/1/24 追記）**

[ChatGPT先生](https://chatgpt.openai.com "ChatGPT") による模範解答

``` VB:ColumnNumberToName
Function ColumnNumberToName(colNum As Integer) As String
    ColumnNumberToName = ""
    Do While colNum > 0
        colNum = colNum - 1
        ColumnNumberToName = Chr((colNum Mod 26) + 65) & ColumnNumberToName
        colNum = Int(colNum / 26)
    Loop
End Function
```

ああ、先に -1 してしまうとスッキリするのか。
やっぱり再帰は大袈裟だったか。。。
アイン・ランド著「肩をすくめるアトラス」

ジョブズが好きだったらしい。

読みたいが売ってない？ 絶版？ 古本だと高い？

そもそも長くて厄介そうなので山形浩生の書評で要点をつかんだ気になる。

https://cruel.org/cut/cut200005.html
コンパイラの処理内容

### コンパイラとは？
```ソースコードを実行可能な形式に変換してくれるプログラム```です。この```変換作業を「コンパイル」```と呼び、```コンパイルできるプログラミング言語のことを「コンパイラ言語」```といいます。

ソースコード全体を```一度に変換し、その結果を実行ファイルとして出力```するというのがコンパイラの基本的な動作です。
#### 出典
https://www.pasonatech.co.jp/workstyle/column/detail.html?p=8279#:~:text=%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C,%E7%9A%84%E3%81%AA%E5%8B%95%E4%BD%9C%E3%81%A7%E3%81%99%E3%80%82

*　 プログラム言語で記述された```原始プログラムを翻訳```して```目的プログラムを生成```するためのソフトウェアである。コンパイラの処理過程において、```構文解析は字句解析が字句を読み込みながら構文木を生成```し、その字句の列が```文法で許されているかどうかを解析```する。

#### 出典
https://gihyo.jp/book/2022/978-4-297-12377-2

### 原始プログラムとは？
ソースコード」のこと。用語の中身としては人間語で書いたプログラムの元ネタのこと
#### 出典
https://wa3.i-3-i.info/word17203.html#:~:text=%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%80%8D%E3%81%AE,%E3%83%8D%E3%82%BF%E3%81%AE%E3%81%93%E3%81%A8

### 字句解析
原始プログラムの文字列から、字句（変数名、演算子、予約語、定数など）を切り出す

### 構文解析
切り出した軸の構成が、構文規則に従っているかどうかを検査する。構文上の誤りを見つけると報告する。構文解析の結果は構文木で表す。

### 構文木
構文木（こうぶんぎ）とは、```構文解析の経過や結果（またはそれら両方）を木構造で表した```もの。
#### 出典
https://ja.wikipedia.org/wiki/%E6%A7%8B%E6%96%87%E6%9C%A8#:~:text=%E6%A7%8B%E6%96%87%E6%9C%A8%EF%BC%88%E3%81%93%E3%81%86%E3%81%B6%E3%82%93%E3%81%8E,%E6%A7%8B%E9%80%A0%E3%81%A7%E8%A1%A8%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE%E3%80%82
### 目的プログラムとは？
ソースコードをコンパイルしたものだよ
#### 出典
https://wa3.i-3-i.info/word17206.html#:~:text=%E7%94%A8%E8%AA%9E%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88-,%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE%E3%81%A0%E3%82%88,-%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%AF

### 後置表記法(逆ポーランド表記法)
```演算子（＋，－，×，÷など）を被演算子（数値や変数，また計算の結果）の後ろ```に書くことで数式を表現する方法です。


* 一般的に 1*2 + 3*4 と記載すると、数学的には演算子の優先順位を考慮して、(1*2)+(3*4) のように乗算を先に行う。このような優先順位を表現する時に、()を使わない方法として、逆ポーランド記法がある。
演算子の書き方には、前置記法、中置記法、後置記法があり、```後置記法は、「2と3を掛ける、それに1を加える」と捉える```と、日本語の処理と似ている。
    * 中置記法 1+2*3
    * 前置記法 +,1,*,2,3
    * ```後置記法 1,2,3,*,+　　# 1と「2と3をかけた値」をたす。```

* 後置記法は、一般的に逆ポーランド記法(Reverse Polish Notation)とも呼ばれ、式を機械語の命令に置き換える際に役立つ。
演算子の右結合・左結合
例えば、”1/2*3″という式が与えられたとする。この結果は、1/6だろうか？3/2だろうか？
一般的な数学では、```優先順位が同じ演算子が並んだ場合、左側から計算を行う```。つまり”1/2*3″は、”(1/2)*3″を意味する。こういった左側の優先順位が高い演算子は左結合の演算子という。
ただしC言語では、”a = b = c = 0″ と書くと、”a = (b = (c = 0))” として扱われる。こういった代入演算子は、 右結合の演算子である。

#### 出典
https://www.ei.fukui-nct.ac.jp/tag/%E6%A7%8B%E6%96%87%E6%9C%A8/

### ２分木を深さ優先で探索するとは？
p144 根から始めて、左の方からかつ、葉のほうから巡回する方法。
#### 出典
https://gihyo.jp/book/2022/978-4-297-12377-2

### BNF/バッカス・ナウア記法
https://fkgtinfo.com/2019/10/27/bnf/#index_id2

https://okwave.jp/qa/q6958748.html

# 感想
BNF/バッカス・ナウア記法を理解するのに苦労したが理解できてよかった。
字句解析して構文解析してそれを逆ポーランド記法で表現していた。

# 出典
https://gihyo.jp/book/2022/978-4-297-12377-2
マークダウン


### リンクの付け方
[リンクタイトル](https://www.google.co.jp/)

### 見出し	
# テキスト1
## テキスト2
### テキスト3
#### テキスト4
	
### フォント関連	
文字を**太字**にします
文字を*shatai*にします
文字を~~訂正~~します

### その他

#### 引用
>引用した文章です。

コードブロック
```
h1{
           color : red ;
}
```

#### インラインコード
これは`インラインコード`です
brew linkage コマンド（Broken dependenciesの有無を調べる）

こんにちは
```brew linkage``` コマンドを用い、```Broken dependencies```の有無を調べました[^1]。

[^1]: 調べ終わるまで時間を要しました（多数をインストールしていた場合）。

```console
$ brew info --installed --json | jq "map(.name)[]" | xargs -L1 brew linkage --test
```

### Broken dependencies の修復
下記例は、```Broken dependencies```が見つかったので、reinstall して修復しています。

```console
$ brew linkage --test llvm
Broken dependencies:
  /usr/local/opt/z3/lib/libz3.4.11.dylib (z3)
$ brew reinstall z3
```

* 下記例は、```xz``` を upgrade した際に、上記の修復をしないでいると、```llvm``` の reinstall が走った例です。

```console
$ brew upgrade xz
 :
 :
==> Checking for dependents of upgraded formulae...
Disable this behaviour by setting HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
==> Reinstalling 1 dependent with broken linkage from source:
llvm
 :
 :
```
TypeScript で google cloud functions を使う

## 手順

下の記事にまとまっていた。。やや古いようなので若干追記。

https://github.com/GoogleCloudPlatform/functions-framework-nodejs/blob/master/docs/typescript.md

1. npm の環境を作る
    ``` bash
    mkdir typescript-function
    cd typescript-function
    npm init -y
    ```

2. typescript とcloud functionsのフレームワークをnpmでインストールする。
    ``` bash
    npm install @google-cloud/functions-framework
    npm install --save-dev typescript
    ```

3. `tsconfig.json` をつくる。`src`以下のコードをコンパイルして`dist`以下に書き込むように指定している。
    ``` json
    {
      "compilerOptions": {
        "target": "es2016",
        "module": "commonjs",
        "esModuleInterop": true,
        "strict": true,
        "outDir": "dist"
      },
      "include": ["src/**/*"],
      "exclude": ["node_modules"]
    }
    ```

4. package.json に追記
    ``` json
    {
      "main": "dist/index.js",
      "scripts": {
        "build": "tsc",
        "start": "functions-framework --target=TypescriptFunction",
        "prestart": "npm run build",
        "gcp-build": "npm run build"
      },
      ...
    }
    ```
    - main は、コンパイル済みのJavaScript ソースコードを指すようにする。
    - "gcp-build" は、デプロイ時に自動的に呼ばれる。

5. `.gitignore` を次のように書いて、npmがインストールしたパッケージやビルド済みのコードがgitにアップロードされないようにする。
    ```
    node_modules/
    dist/
    ```

6. `src/index.ts` にコードを書く

    ``` typescript
    import * as ff from '@google-cloud/functions-framework';

    ff.http('TypescriptFunction', (req: ff.Request, res: ff.Response) => {
      res.send('OK');
    });
    ```

7. デプロイする。この際、deploy の後ろに書いた文字列が関数名になる。同じ関数名だと古いのを書き潰すので注意。

    ``` bash
    gcloud functions deploy TypescriptFunction \
    --gen2
    --runtime nodejs16 \
    --trigger-http \
    --allow-unauthenticated
    ```

8. コンソールでデプロイされていることを確認。HTTPトリガの場合は、コンソールでURLを確認。このURLにアクセスすると動作が確認できる。
今さらJavaラムダ式


## 1. ラムダ式とは
- JavaSE8から導入された構文
- 関数型インターフェースを簡潔に記載することができる

```java
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));

// こういうやつ
list.forEach(i -> System.out.println(i));

// 結果
// A
// B
// C
```

## 2. 無名クラス（匿名クラス）と関数型インターフェース

### 無名クラス（匿名クラス）とは
- 名前がないクラスのこと
- 一度きりしか使わないといった場合に使用する
- コードの記載が綺麗になる

無名クラスを使用する場合、new class名()の後に{}を記載します
※関数型インターフェースのConsumerを使用していますが後で説明あります

*無名クラスを使用しない場合*
```java
class CustomConsumer implements Consumer<String> {
    @Override
    public void accept(String s) {
        System.out.println(s);
    }
}

List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
CustomConsumer consumer = new CustomConsumer();
list.forEach(consumer);

// 結果
// A
// B
// C
```

*無名クラスを使用した場合*
```java
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
Consumer consumer = new Consumer<String>() {
    @Override
    public void accept(String s) {
        System.out.println(s);
    }
};
list.forEach(consumer);

// 結果
// A
// B
// C
```

### 関数型インターフェースとは
抽象メソッドを一つのみ持つインターフェースのこと
※抽象メソッド：メソッド名のみ定義されているメソッドのこと


```java
// 例
interface Runnable {
    // 抽象メソッドは一つのみ
    void run();
}
```

JavaAPIには関数型インターフェースがいくつか用意されています
https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html

*代表的な関数型インターフェース*

- Runnable: 実行可能
引数はなく、結果を返さない
run()を関数メソッドに持つ

- Consumer: 消費者
引数があり、結果を返さない
accept(Object)を関数メソッドに持つ

- Supplier: 供給者
引数がなく、結果を返す
T get()を関数メソッドに持つ

- Predicate: 断言する
引数があり、結果をbooleanで返す
boolean test​(T t)を関数メソッドに持つ

## 3. ラムダ式
- 関数型インターフェースを簡潔に記載することができる

無名関数を使用する場合、しない場合、ラムダを使用する場合までの変化を以下サンプルで記載

*1. 無名クラスを使用しない場合*
```java
class MyRunnable implements Runnable {
	@Override
	public void run() {
		System.out.println("Runnable is run!");
	}
}

MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
```

*2. 無名クラスを使用する場合（そのまま引数に設定）*
```java
new Thread(new Runnable() {
	@Override
	public void run() {
		System.out.println("Runnable is run!");
	}
}).start();
```

*3. ラムダ式を使用した場合*
```java
// クラス名の記載は不要
// 引数があれば()に記載する
new Thread(() -> {
	System.out.println("Runnable is run!");
}).start();

// 引数がないので()も不要
new Thread(System.out.println("Runnable is run!")).start();

// 備考
// 引数が一意かつ処理内容のメソッドが一つのみのためクラス名::メソッド名のような書き方が可能
new Thread((string) -> System.out.println(string)).start();
↓
new Thread(System.out::println).start();
```
データ型と参照型 Java

### データ型
Javaにはデータ型が2種類あります
- 基本データ型（プリミティブ型）
```java  
byte short int long
float double boolean char
```
    
- 参照型（クラス型）
```java
String Array Class
```

### 基本データ型と参照型のデータ保存方法の違い

- 基本データ型
    メモリ領域に格納するのはデータの値
    
- 参照型
メモリ領域に格納するのはデータの値とデータを格納した番地の値
格納順序（Arrayを例にした場合）

```java
// Arrayの宣言
// この時点ではデータの格納領域がどれくらいかがわからないため変数aを入れるためだけのメモリを確保する
int[] a;

// データの格納
// 変数へデータを格納した時点でメモリ上では格納した値の数分メモリを確保する
// 1で確保したメモリには2で確保したメモリの最初の番地を格納する
a = { 100, 200, 300 };
```
   
参照型は上記のような特性があるためデータの更新は注意が必要
参照型はメモリの番地を保存しているために意図しない更新が発生する

```java
// 意図しない更新
int[] a = { 100, 200, 300 };
int[] b = a;
b[0] = 1000;

System.out.println(a[0]); // 1000
System.out.println(b[0]); // 1000
```

String型については上記の更新を行なった場合でも元の変数は更新されない
String型は元の変数を違う変数へ格納、更新のタイミングで元の変数と値が異なる場合に新たにメモリ領域を確保する

```java
// String型のデータ更新
String a = "hello";
String b = a;
b = "world";

System.out.println(a[0]); // hello
System.out.println(b[0]); // world
```

### ラッパークラス
基本データ型の値をラッピングしてオブジェクトとして利用できるようにするクラスが用意されている。
基本データ型にはそれに対応する参照型のクラスが用意されている

|  基本型  |  ラッパークラス  |
| ---- | ---- |
|  byte  |  Byte  |
|  short  |  Short  |
|  int  |  Integer  |
|  long  |  Long  |
|  float  |  Float  |
|  double  |  Double  |
|  boolean  |  Boolean  |
|  char  |  Character  |

```java
// 基本データ型をIntegerクラスにしたい場合
Integer i = new Integer(32);

// Integaerクラスを基本データ型にしたい場合
int n = i.intValue();
```

実は上記は不要、ラッパークラスから基本データ、基本データ型からラッパークラスに自動変換される

- 基本データ型 → ラッパークラスへの変換: auto boxing
- ラッパークラス → 基本データへの変換: auto unboxing

nullの場合は自動変換時にエラーになる

```java
// 基本データ、ラッパークラス間の変換は不要
Integer i = 32;
int n = i;
```

### String型の比較

String型の比較の場合String型の特性上意図しない比較になることがある
String型は基本メモリの番地を参照するが基本データ型に寄せているので同じ値のString型を複数定義した場合に最初に定義したString型のメモリを共有する
別のメモリを使用したい場合は明示的にString型を宣言する必要がある
同じ文字列か比較したい場合は `equals`メソッドを使う。

```java
public class Main {
    public static void main(String[] args){
        // 以下二つのString型の変数は同じメモリ番地を参照している
        String ab1 = "ab";
        String ab2 = "ab";

        System.out.println(ab1 == ab2); // 結果: true

        // メモリを分ける場合
        String ab3 = new String("ab");
        String ab4 = new String("ab");

        System.out.println(ab3 == ab4); // 結果: false
        System.out.println(ab3.equals(ab4)); // 結果: true
    }
}
```
rails チュートリアル　〜1日目〜

### rubyのバージョンを見る方法
- 現在使ってるrubyのバージョンを確認する
- 「0.0.0」特に左の数字がズレてるとやばいらしい
- 一旦左の数字だけは必ず合わせるようにする
```
$ ruby --v
```
更新日時を全部更新しないようにするためのupdate_attributeとupdate_columnsの違い

🎅＜ [WEBCAMP ENGINEER COMMUNITY Advent Calendar 2022](https://qiita.com/advent-calendar/2022/webccamp-engineer-community) 23日目の記事です。
## 背景
大量のテーブルのとあるカラムを全て更新しようと思いました。

ただ、テーブルの`updated_at`が全部更新されてしまうのはちょっと怖いな...と思ったので良いメソッドがないか探したところ、ちょうどよく2種類用意されていたので、ここに簡単にまとめてみます📝

## 結論
https://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-update_attribute
こちらを読んでいただければ正確にわかります。

せっかくなので一部説明します。

### update_attribute(name, value)

```
Updates a single attribute and saves the record. 
This is especially useful for boolean flags on existing records. Also note that

Validation is skipped.
Callbacks are invoked.
updated_at/updated_on column is updated if that column is available.
```

バリデーションはされず、コールバックは呼ばれ（カラム更新後に何かをするみたいな実装があれば、それを呼んでくれるのだと思います）、`updated_at`または`updated_on`のカラムがあれば更新がされるようです。

今回の期待にはそぐわないですね。

### update_columns(attributes)

```
# 中略

In particular:

Validations are skipped.
Callbacks are skipped.

updated_at/updated_on are not updated.
```

バリデーションもコールバックもスキップされ、updated_atまたはupdated_onのカラムがあっても更新されないようです。こちらを使用しました。

`updated_at`は、データの変化を追う際にキーとなるカラムになり得ます。今回前者のメソッドで実行していただ場合、全てのカラムが同じ時刻になってしまうのでちゃんと探してみて良かったです。
Rootless Docker with NIS users

# 背景

研究室の計算機でdockerを使いたいといわれたがdockerグループなんて設定したくないのでrootless dockerを使いたい. sshでログインすることを前提. 

# 問題

`XDG_RUNTIME_DIR`がうまく設定されないせいで動かない. 調べたらを設定すればいいらしいがそんな物はなく, どうもPAMがそれを作るらしい. ローカルでログインするとPAMが叩かれるっぽいのだがなぜかsshだと動かない. `sudo loginctl enable-linger <user名>`で特定のuserのsshログインで`/run/usr/$UID`が生成されるように設定できるっぽいのだがno such fileとかいわれる. 

# 原因

systemdのバグ
https://bugs.launchpad.net/ubuntu/+source/nis/+bug/1934393
https://bugs.launchpad.net/ubuntu/+source/systemd/+bug/1915502
要は起動時にネットワークにアクセスできないようになっているので, NISからデータが取り込めず, `loginctl`を叩いてもNIS上のアカウントは設定できなくなっていた. 

# 解決策
NISサーバはIPv4の範囲にたっているので, IPv4のアクセスをとりあえず全部許可すれば解決. 上のlaunchpadでもちょっとセキュリティ的にどうなんだろうねとなっているworkaround. そのうち直るのかな......

```
$ sudo systemctl edit systemd-logind
(opens an editor, put in the text below and save it)

[Service]
RestrictAddressFamilies=AF_INET
IPAddressAllow=any

$ sudo systemctl daemon-reload
$ sudo systemctl restart systemd-logind
```

これでssh越しでもログイン時に`/run/usr/$UID`が作られるようになるのでこれを`XDG_RUNTIME_DIR`に設定すれば良い.
Fast API x Lambdaでmono lambdaができるMangum

# お約束
* 本記事は ARISE analytics Advent Calendar 2022 の22日目の記事です
* 昨日は @skybee8  さんの [強化学習を用いたレコメンドを検証してみた件](https://qiita.com/skybee8/items/c8dd2bb3038eb30d1b5c)
* 明日は、@tsukasaI さんの [Goでの日付比較チートシート](https://qiita.com/)

# はじめに
皆さん、AWS Lambdaはお好きですか？私は大好きです。
さて、皆様はPython x lambdaでAPIをつくるときどうしてますか？
Chaliceを使う？シングルlambdaでルーティングはAPI gateway任せてますか？

多分、皆様の誰でも普段使ってるフレームワークのdjangoやStarlette、FastAPIとかをそのままlambdanに持っていきたいと思ったことないでしょうか？けど、なんか無理ぽいなと試したり、感覚で感じ取られてないでしょうか？

その夢叶えられます。そうMangumならね
https://mangum.io/asgi-frameworks/

# Mangum使ってみた
さて、案ずるより産むが易しでコードを見てみましょう！
```
from fastapi import FastAPI
from mangum import Mangum

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

handler = Mangum(app, lifespan="off")
```
これだけで、lambdaでFastAPIが使えるようになります！
簡単でしょ！
# 終わりに
サーバーレスフレームワーク大好きな皆様は、資産の移行性やベンダーロックについて認識しておりながらも渋々便利だか使っていたかと思います。Mangumを使えば最初はlambda上でAPIを作って規模が大きくなったり、非機能要件が上がった際にはECSに切り替えるなどして移行性やベンダーロックを気にしないでソリューションを作れるようになります。ぜひ、使ってみて下さい！
自分のエンジニア観

:::note info
この記事はあくまで個人の見解ですので、会社を代表してとか、誰かにやってほしいとかそういうもんじゃないです。そういう考え方もあるんだな、ぐらいの参考になればとても嬉しいです
:::


こんにちは、豊濱です。
ディップ株式会社で執行役員CTOをやっていますが、冒頭書いたように立場がどうとかではなく、自分がいつも考えていることをお話したいなと思います。
本当はPostmanとかElectronで遊ぼうと思ってたんですが、12月色々と振り返る機会があり、一度自分の思考を棚卸しするのもありかなーと思いこんな記事にしてみました。

## ここでのエンジニアの定義
- Web/IT領域に関わる方

## エンジニアという生き物

### エンジニアとは
経験・知識・分野・感性・勘みたいな要素で、時間あたりの仕事量(成果)が全然違う生き物だと考えています。
もちろん他職種もそうだと思いますが、正解に至るプロセス・アプローチが星の数ほどあり、その差がより顕著に現れるんじゃないかなと。
加えて、例えばコードの行数みたいな成果物の量が多いほど成果が高いとも限らない、むしろシンプルに書けたほうが成果が高いこともよくあるな、と思ってます。

### ヘッドカウントで性能を測っちゃいけない

なので、よくエンジニアの人数(いわゆる「人月」)で判断することがありますが、個人的にはこれをやってしまった瞬間にいい成果物につながらないと考えています。
高い性能を持ったエンジニアと駆け出しのエンジニアで同じ仕事を同じ期間アサインすることがベストではない、というのは誰しも理解いただけると思います。

### 他職種に成果が伝わりづらい
なのに、なぜいまだに「人月」計算が幅広く使われてるのか、というと「それ以外に測る指標がわからない」からだと考えてます。
ここはエンジニアリングマネージャやCTO、VPoEといったレイヤが頑張るところかなと思うので、自分もその一員として指標の定義やエンジニアリングについての発信を続けているところです。


### 自分がエンジニアに向いてるなと思うところ
- めんどくさがり
- なまけたい
- 昨日と同じことがしたくない

こんな性格だからコードを書いて楽したいって思うんだろうなと考えてます(笑)


## 意識していること

自分としてのエンジニアの定義は以上となりますが、ここからはイチエンジニアとして意識していることを挙げてみます。
書き起こしてみると、本当に20年以上、自分の価値観が変わってなくてびっくりします。変わらないのがいいのかどうかはわかりませんが……。


### 引き出しを多くする
よりシンプルに、より楽に、よりスピード感をもって成果を出すには、知識経験の幅と深さ、新しさ(引き出し)が重要です。
今の時代、人が苦労しなくてもクラウド*IaCでインフラ構築し、SaaSで各種複雑な機能を担保し、デプロイも人が関わらないほうがいいぐらいの環境が整っていますが、そういった引き出しがないと高い成果は出ず、レガシーな運用にもつながっていくのかなと。

一言でいうと「学び続ける姿勢」ってなるんだと思いますが、特にエンジニアは学んだことを自分の手を動かして確認することも大事だと考えています。

### 「できない」といわない
無茶な、と思われるかもしれませんが、言い方のお話です。
「その期間でその要件はできません」ではなく「これをここまで、こういう形ならできます」のほうが前向きだし、プロジェクト全体の意思決定もスムースになっていきます。
上述したとおり、エンジニアの仕事はわかりづらく、できるできないの判断は任せられることが多いからこそ、ごまかさずしっかり伝えることが必要だなと考えています。

### 同じことを2回やるなら自動化・省力化を考える
これはもう見出しの通りですね。
ただ、1回きりの作業であれば、手でやったほうが速いこともあるので、その見極めもスキルのひとつかなと思います。


### 環境は常に変化・進化するということを意識する

![1980to2022.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102801/18b98212-a645-71f0-cd33-1c8b65060ce5.png)


スマートフォンの普及は、この図にある通り我々のライフスタイルに大きな変化をもたらしました。いまやスマートフォンを「電話をかけるもの」だと認識している人はそれほど多くないのではと。
自分がどういうスタンスだろうが世の中は常に変化・進化します。その変化についていけなかったとしたら、時代遅れのエンジニアになってしまいます。求められるものを正しく理解し、自身も進化していくことが、まとめの項目につながると考えています。


## 一生エンジニアとして生きていきたい

[CTO協会のアドベントカレンダー](https://qiita.com/toyohama/items/a9e169b598b785194842)でも書いたんですが、自分は一生エンジニアと呼ばれる仕事をして生きていきたいと思っています。
前項で書いたとおり、エンジニアの役割・定義は数年でガラッと変わりますし、20年後なんて言うともう手とか使わずに何かをしてるかもしれません(何かってなに）。

ただ、意識していることに挙げたようなものはこの先も変わらないのかな、と考えているので、来年も5年後も同じ気持ちで仕事や人生に向き合えたらいいなというふうに思ってます。

## まとめ

長文読んでいただきありがとうございます。
2022年も沢山の人に助けられ、お世話になった1年でした。2023年はこれまで以上にみなさんにフィードバックできることを増やしていきたいと思いますので、よろしくお願いいたします。

メリークリスマス :christmas_tree:
【初心者向け】Wordpressテーマを自作する［index.php］

ファイルの構造や解説等、Wordpress（以下、WP）のテーマを自作する際の基本的な部分は、こちらの記事で紹介しています。

https://qiita.com/makkie/items/dc764c2845492079c0af

ここでは、WPのテーマを作る上で必須の`index.php`のコードを交えた解説を行います。
とりあえず解説はいいからコードだけ、の方は以下をどうぞ。
## コード（HTMLとPHP）
ファイルの先頭には、テーマカスタマイザーからもわかるように`Template Name: Index(汎用Temp)`を入れています。

```diff_php
<?php
//====================================================
//  Template Name: Index(汎用Temp)
//====================================================
get_header(); ?>
<main>
    <section class="content">
        <?php
        if ( have_posts() ) :
            while ( have_posts() ) : the_post();
        ?>
            <h2><?php the_title(); ?></h2>
            <?php the_content(); ?>
            <?php the_posts_pagination(); ?>
        <?php
            endwhile;
        elseif('404'):
        ?>
            <h2>お探しのページは見つけることができませんでした。</h2>
            URLが変更されたか、削除された可能性があります。<br>
            トップページ戻ってご確認ください。<br><br>
            <p><a href="<?php echo home_url('/'); ?>">トップページへ戻る</a></p>
        <?php
        endif;
        ?>
    </section><!--//class="content"-->
    <section class="sidebar">
        <?php get_sidebar(); ?>
    </section>
</main>
<?php
get_footer(); ?>
```
## 解説
### index.phpとは
WPのテーマを自作する際の**必須ファイル**です。
`header.php` `footer.php` `sidebar.php`を除く、全てのテーマファイルを兼用できるファイルとなっています。

https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E9%9A%8E%E5%B1%A4

テーマフォルダの中に`index.php` `header.php` `footer.php` `sidebar.php` があればとりあえずのテーマができます。

### index.phpはindex.htmlではない
ここで注意して欲しいのが、`index.php`と言うファイル名であっても、HTMLだけのサイトにある**index.htmlとは違う**と言う事です。私もWPを覚えたての時は、このファイルは`index.html`と同じだと思っていました。

**一番最初に読み込まれるファイル**と言うので`index.php`の様です。

なので、TOPページのデザインはここでは書かないでください。
なぜかと言うと、条件分岐でコードの分岐条件から外れてしまった投稿等が表示されるのがこの`index.php`だからです。
もし`index.php`にTOPページのコードを書いていたら、条件分岐から外れていた場合、TOPが表示されるだけでユーザーからは何が起こっているのかわからなくなってしまうからです。
TOPページ専用のテーマファイルは`home.php`なので、そちらに書いた方が安全です。

### 必須コード
`get_header();` `get_sidebar();` `get_footer();`は必須です。
ワンカラムサイトの場合は、`get_sidebar();`はいらなそうですが、記述がないとエラーメッセージが出るので必須のようです。当然ですが、`get_sidebar();`を書くと`sidebar.php`を読みに行きますので、このファイルも必須です。（中身は空でもOK）

### 基本ループ
個別ページや固定ページ等、すべてのページの内容が表示されるように、`the_title()` `the_content();`をループの中に入れて表示する様にしています。
`the_posts_pagination();`はページネーション（ページ番号）を表示する関数です。
```diff_php
        <?php
        if ( have_posts() ) :
            while ( have_posts() ) : the_post();
        ?>
            <h2><?php the_title(); ?></h2>
            <?php the_content(); ?>
            <?php the_posts_pagination(); ?>
        <?php
            endwhile;
        ?>
```
もし表示しようとしているページが見つからなかった場合、`404エラー`として`404.php`と言うファイルを用意することが多いですが、`index.php`が`一番最初に表示されるファイル`と言うルールを利用して、ここに条件分岐を書いています。
```diff_php
        <?php
        elseif('404'):
        ?>
            <h2>お探しのページは見つけることができませんでした。</h2>
            URLが変更されたか、削除された可能性があります。<br>
            トップページ戻ってご確認ください。<br><br>
            <p><a href="<?php echo home_url('/'); ?>">トップページへ戻る</a></p>
        <?php
        endif;
        ?>
```

## まとめ
汎用性を重視しているので、HTMLタグもシンプルにしています。
デザインに合わせて`id`や`class`を付与してください。

10年以上WPでWEBサイト制作をしていますが、独学のため、色々間違えている個所などありましたらご指摘いただけますと幸いです。
長年運用しているプロジェクトがPeripheryを導入してスリムアップした話


# これは

この記事は、[Yamapエンジニア Advent Calendar 2022](https://qiita.com/advent-calendar/2022/yamap-engineers)の12月23日の記事です。

こんにちは、YamapでiOSエンジニアをやっている竹ノ内です。

普段はiOSアプリの開発に従事しています。

Yamapアプリは、歴史のあるアプリで元々はObjective-Cで書かれていましたが、それをSwift化したり、度々のリファクタリングと並行しながら、機能追加を重ねて成長してきました。

ただ、長年運用されている影響で全体を通して、
使われていないコードががそのままになっているところもあり、見通しが悪い箇所がありました。

なので、Peripheryを導入して、シェイプアップを図ることにしました。

# そもそもPeripheryとは

[Periphery](https://github.com/peripheryapp/periphery)とは使われていないコードに対して、警告を出してくれるライブラリです。

> The goal of Periphery is to report instances of unused declarations. A declaration is a class, struct, protocol, function, property, constructor, enum, typealias, associatedtype, etc. As you'd expect, Periphery is able to identify simple unreferenced declarations, e.g a class that is no longer used anywhere in your codebase.
(Peripheryの目的は、使用されていない宣言のインスタンスを報告することです。宣言とは、クラス、構造体、プロトコル、関数、プロパティ、コンストラクタ、enum、typealias、associatedtypeなどのことです。予想通り、Peripheryは参照されない単純な宣言を特定することができます。例えば、コードベースのどこでも使用されなくなったクラスなどです。)

とのことで、
宣言して使われてない変数だけでなく、メソッドの不要な引数に対しても警告を表示してくれます。

Homebrew, SPM, CocoaPodsからインストールすることができます。

日本語だとこちらがわかりやすいかと思います。

https://qiita.com/shtnkgm/items/a14a704e00fe247970fa

# 実際に導入してみた

## 元々どんな状態だったのか

プロジェクト内で、Peripheryを実行すると、約1000件の警告が出ました。
![Periphery実行前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393442/703218e3-cf41-db20-3000-fdfd37523788.png)

## 導入後はどうなったのか

リファクタリングも同時に並行しながら進めていたので、全てを消したわけでないですが、
最終的に、数千行のコードの削減をすることができました🤝

![Periphery導入後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393442/45eb2fa3-b8db-c3f1-23d7-6647c4cf1882.png)
(最終的なPRです)

### ビルド時間は影響あった？

Periphery導入後で、**約6秒**くらいビルド時間が短くなりました。

正直微妙な差ではありますが、各メンバーやCIでのビルド時間が短くなることを考えると、
もっと大きな差になりそうです。


# 導入してみての感想

- 意外と機械的に消すことはできなかった
   - 誤検知されているパターンもあった
   - 想定より時間がかかった
- 実装ミスに気が付くこともできてよかった
   - Protocolではなくて、Classを参照してるところなども修正できた
- リファクタリングを並行することができたので、コード削減以上のものができた


# 今後は？

毎回のビルドでPeripheryを走らせると、CIが厳しいので、1日一回実行して、Slack等に通知できれば、継続的に改善することができそうです。


以上

終わり
自動化の相談を受けたら気をつけろ！自動化が失敗する上司の「あるある」話

本記事は、『テスト自動化失敗談を共有しよう！ by T-DASH Advent Calendar 2022』に参加しています。
よろしくお願いいたします！！
2022/12/20を担当しております。

https://qiita.com/advent-calendar/2022/t-dash03

『テスト自動化ツールT-DASHの良い点・悪い点をレビューしてみた！ by T-DASH Advent Calendar 2022』にも参加しております。

https://qiita.com/advent-calendar/2022/t-dash01

『テスト自動化ツールT-DASHの活用方法や事例を記事にしよう！ by T-DASH Advent Calendar 2022』にも参加しております。

https://qiita.com/advent-calendar/2022/t-dash02

# 自動化の相談を受けたら気をつけろ！自動化が失敗する上司の「あるある」話

テスト自動化へ取り組み場合は動機と目標が大切ですが、
意外なところから突然自動化の話題が降り掛かってくることがあります。
動機が不純だと自動化は徒労に終わるでしょう。
ということで、**こんな上司からテスト自動化の相談を受けたら気をつけろ！**　という切り口のちょっとしたお話です。

- テスト業務の経験が浅い上司
- 自分で自動化に取り組んだことのない上司
- 企業のDMやWebニュースで見かけた自動化ツールを「こんなのあるよ」と自分で何も調べずに投げ付けてくるだけの上司
- 自動化のセミナー情報を投げ付けてくるだけの上司
- 自動化の実現性や自動化の初期コスト、メンテナンスコストを考えずに、「自動化で人件費削減できるんじゃない？」と相談してくる上司
- 「バージョンアップで追加される新機能を自動化でテスト出来ないか」と相談してくる上司
- 自動化作業の進捗確認をしてこない上司
- 毎年同じような目標を掲げる上司


こういう上司からテスト自動化の相談を受けたら気をつけてください。
たまたま見聞きしたニュースなどで自動化が取り上げられていたから、あなたに思いつきで話している可能性が高いです。
たいした関心もないのに、流行だから、なんか成果がほしいから、といった本末転倒な願望のために取り組む自動化に意味はありません。

相手する時間すらもったいない場合は、高い有償ツールの見積もり金額を見せれば、静かになるかも。