OmniAICreator/Qiita-1.07M huggingface dataset:
【AWS認定試験】DAS-C01取得しました

# はじめに
先日、DAS-C01に合格しました。(めちゃめちゃギリギリでしたが。。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/c91166e6-448f-d5f4-15f3-0cfad7bfa099.png)


合格するまでやったことを記載します。

## これまでのAWS認定受験歴
|年月|試験|点数(合格点)|合否|
|---|---|---|---|
|2020/08|[AWS認定クラウドプラクティショナー(CLF)][link-1]|809/1000(700)|〇|
|2020/11|[AWS認定ソリューションアーキテクトアソシエイト(SAA)][link-2]|753/1000(720)|〇|
|2021/01|[AWS認定デベロッパーアソシエイト(DVA)][link-3]|862/1000(720)|〇|
|2021/02|[AWS認定SysOpsアドミニストレータアソシエイト(SOA)(C01)][link-4]|731/1000(720)|〇|
|2021/04|[AWS認定ソリューションアーキテクトプロフェッショナル(SAP)][link-5]|698/1000(750)|×|
|2021/06|[AWS認定ソリューションアーキテクトプロフェッショナル(SAP)][link-5]|832/1000(750)|〇|
|2021/06|[AWS認定DevOpsエンジニアプロフェッショナル(DOP)][link-6]|821/1000(750)|〇|
|2021/09|[AWS認定セキュリティ専門知識(SCS)][link-7]|798/1000(750)|〇|
|2021/11|[AWS認定データベース専門知識(DBS)][link-8]|756/1000(750)|〇|

## 試験対策
### 学習時間
約1週間(約15~20H)

### やったこと
まず、[試験ガイド][link-9]を確認し、出題されるであろう内容とサービスを確認しました。
今までに触れたことのないサービスが多く出題されることが判明した為、BlackBeltをとりあえず一通り確認しました。

Amazon EMR,Amazon Redshift,AWS Glue等は何となくの理解でしかなかったためBlackBeltを確認しておいてよかったと思います。

次に以下のUdemyの問題集をやりました。

https://www.udemy.com/course/aws-certified-data-analytics-specialty-practice-exams-amazon/

問題1は力試し,2が模擬問題,3~6がトピックに着目した内容となっています。

購入前は問題数が少なく感じ、どうなのかな？と思っていましたが、難易度がちょうどよく解説も充実していたので良かったです。
解いてみてわからなかったサービスや仕様について、改めてBlackBeltなどを読み直して理解しながら進めました。

問題集+今までの知識でギリギリ合格できたレベルだったので、初めてAWS認定を受ける方が問題集一本で行こうとすると結構厳しいと思います。
### 最低限やるべきこと
再三ですが[試験ガイド][link-9]は学習に入る前に読んでおくべきだと思いました。

特に付録の「AWS のサービスと機能」で試験に出る可能性のあるものの記載があるので、ここにあるサービスを名前を聞くだけでどういうものか説明できるくらいにはすべきだと思います。
できるならばすべてのサービスを試しに動かすことお勧めします。

私はやりませんでしたが、Hands-on-for-beginnersにデータ分析ハンズオンがありましたので、やってみるのも良いかと思います。 

https://aws.amazon.com/jp/blogs/news/aws-hands-on-for-beginners-13/

# 感想
データのETLの良い勉強になったかな？という試験でした。このケースならこのサービスだよね、といったパターンが存在しており、そこを抑えておくと選択肢が絞れたりするので模擬問題を沢山解くのもお勧めです。
難易度的にはDBSより難しいがプロフェッショナルレベルよりかは簡単かな？といった印象でした。

<!-- link -->

[link-1]:https://aws.amazon.com/jp/certification/certified-cloud-practitioner/
[link-2]:https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/
[link-3]:https://aws.amazon.com/jp/certification/certified-developer-associate/
[link-4]:https://aws.amazon.com/jp/certification/certified-sysops-admin-associate/
[link-5]:https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/
[link-6]:https://aws.amazon.com/jp/certification/certified-devops-engineer-professional/
[link-7]:https://aws.amazon.com/jp/certification/certified-security-specialty/
[link-8]:https://aws.amazon.com/jp/certification/certified-database-specialty/
[link-9]:https://d1.awsstatic.com/ja_JP/training-and-certification/docs-data-analytics-specialty/AWS-Certified-Data-Analytics-Specialty_Exam-Guide.pdf
ホリデープロジェクトの安全性を確保する

今年もまた、一年間待っていたプロジェクトを中断することなく進められる季節がやってきました。新しいコンテンツ管理システムの構築でも、お気に入りのオープンソースプロジェクトのプラグインでも、ホリデーシーズンは開発者が1年中待っていた特別なプロジェクトを作り上げることができる時期です。

ただし、プロジェクトの安全性を確保すること、特にオープンソースのライブラリやコンポーネントに可能な限り脆弱性がないことを確認することが重要であることを忘れないでください。脆弱性の可能性がないかコードをスキャンするだけでなく、プロジェクトを安全に保ち、エンドユーザーを可能な限り安全にすることが非常に重要なのです。 

この記事では、Snyk CLIを使ってSCAとSASTのスキャンを行うことで、プロジェクトの安全性を保つ方法を見ていきたいと思います。このツールを使うと、パッケージマニフェストをスキャンしてオープンソースの脆弱性を探したり、コードをチェックして安全性を確認したりすることができます。

## いくつかのコードで遊んでみましょう

休暇中の最大の問題は、どのプロジェクトを行うかを選ぶことです。アイデアはたくさんあるのに、時間はほとんどありません。私はこれまでに多くのプロジェクトを手がけてきましたが、その中には、LEDライトを搭載したWIFI IOTボード（ESPdevkitC）をウェディングケーキの上に設置し、ゲストが携帯電話でライトの色を変えられるようにするというものもありました。

![45517134274_d8bc4cb7fe_c.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345032/96cbb57a-6239-10f5-6157-ff10afe122c5.jpeg)

この休日には、私がボランティアで参加しているプロジェクトのひとつである[Barayamal](https://barayamal.com.au/)（First Nations Innovation Hub）の新しいコミュニティプラットフォームの構築を終える予定です。私は、できる限りコミュニティに貢献したいと思っているので、このようなプロジェクトが大好きです。

新しい[Barayamal](https://barayamal.com.au/)のプラットフォームは、Wordpressをベースに、いくつかの無料プラグインとカスタムプラグイン、そしてオープンソースのテーマで構築されています。これは、コミュニティの成長に合わせてサーバーインフラを成長させるために重要なことです。

それでは早速、このプラットフォームを使ってセキュリティチェックを行ってみましょう。まず、ローカル環境にgit cloneを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345032/3321f1c5-d6d6-881e-ceba-9b702b580b6b.png)
これはPHPベースのプロジェクトなので、composerを使って必要なパッケージをすべてインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345032/66cceb46-c462-2b59-6143-1c965ed8ee82.png)

## セキュリティの脆弱性をチェックする 

プラットフォームのセキュリティは重要です。ユーザーを安全に保ち、アプリケーションのウェブサイトに脆弱性がないようにする必要があります。

今回のセキュリティスキャンには、Snykの無料版を使用します。Snykの導入については、こちらのブログ記事をご覧ください(https://qiita.com/SnykSec/items/aa80a976eb17299fff62)。

オープンソースパッケージの脆弱性をスキャンするために、まずSnyk CLIを使ってPHP composerのパッケージマニフェストをスキャンします。私はMacを使用しており、homebrewがインストールされているので、インストールするために以下を実行します。

コマンドラインで "snyk auth "を実行すると、自分のアカウントに接続できるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345032/38a5b89e-bc6d-51e1-ae6c-64a2b098cef7.png)

これでスキャンの準備が整いました。必要なのは、プロジェクトのルートディレクトリでsnyk testを実行してスキャンすることです。CLIは、composerのパッケージマニフェストを自動的に検出し、脆弱性をチェックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345032/395ee03b-6c5c-9299-5cf3-6c94096ab9aa.png)

この例ではすべてクリアされていますが、新たな脅威が検出されるように、チェックを続ける必要があります。

非常に便利なのは、私の無料アカウントでSnykプラットフォームを使用して、あらゆるオープンソースリポジトリをスキャンすることができることです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345032/584f7ce8-9c2a-150a-0f49-c07e118cd3be.png)

## あなたのホリデープロジェクトを教えてください 

休日のプロジェクトをスキャンして、安全なコードを使っているかどうかを確認することを忘れないでください。

私はいつでもオープンソースプロジェクトの話を聞くのが大好きです。
[2021年末版]React Native アプリの開発環境

この記事は 2021 年 React Native アドベントカレンダーに登録しています。私はモバイルアプリエンジニアで、普段の業務でReact Nativeを使ってアプリを開発しています。日々の開発の中で使っているツールなどを紹介してみます。これから React Native を使い始める人や、すでに使っている人のお役に立てるといいな。それでは Let’s get started!

# Expo

まずはこれ。Expo です。 [公式ページ](https://expo.dev)。最初から素のReact Nativeは使わず、Expoで開発しています。Expo を使っていて便利だと思うことを挙げてみました。

* 付属するライブラリが豊富
* クラウドでビルドされる

Expo はReact NativeのSDKに加えて、開発によく使われそうなライブラリを提供してくれています。例えば、 WebView, Map, Stripe などが提供されています。全てのライブラリをExpoが開発しているわけではない（例に挙げた WebView はコミニュティが主導して開発している[React Native WebView](https://github.com/react-native-webview/react-native-webview)）ですが、Expo のSDKに組み込まれているので簡単に使うことができるようになっています。

また、Expoを使っていると、Expoが管理するサーバーにアプリをビルドさせることができます。弊社はスタートアップということもあり、主に私一人でアプリを開発しています。一人で開発をしていると、CI環境を構築する手間も惜しいので初めからクラウドでビルドする環境が付属しているというのは魅力的です。

Expo のManaged Workflow + EAS Buildを使っています。従来のManaged Workflowではネィティブコードを含むライブラリが使えないという大きな欠点があったのですが、EASの登場によりその欠点も解消されました。手前味噌ですが、EASについては今年の[React Native Matsuri](https://reactnative-matsuri.com/ja)で紹介いたしました。その際に使用した資料を公開していますので、詳細は[こちらの資料](https://speakerdeck.com/tasugi/10fen-dewakaruexpoeas)もどうぞご覧ください！

# VS Code 

どんどん紹介していきます。次はエディタです。VS Codeを使っています。React Nativeに関連する拡張機能では、[VS Code Expo](https://github.com/expo/vscode-expo)を入れています。Expoを使うと、アプリ名など各種設定は `app.json` ファイルに書くのですが、VS Code Expoを入れていると `app.json` を編集するときに補完及び検証が働きます。

# TypeScript

言語はJavaScriptではなくTypeScriptを使っています。React Native本体の開発ではMeta社が開発しているFlowが使われていますが、アプリケーションを開発する上ではTypeScriptも全く問題なく使うことができます。動的型付け言語では現代の複雑なアプリケーション開発に耐えられないと思っている（もちろん個人の感想です）ので、TypeScriptは必須です。型はいいぞ。

# AWS Amplify

もはやReact Nativeとは関係ないですが、モバイルアプリは往々にしてバックエンドも必要とすると思うので紹介しておきます。弊社ではバックエンドの開発にAWSの[Amplify](https://aws.amazon.com/jp/amplify/)を使っています。Amplifyを使うと素早くバックエンドを構築することができます。データベースやAPIの構築がAmplify経由で可能です。

# GraphQL

アプリを開発していて一番便利だと思っている技術です！これがなかったら同じ機能を作るのに今の倍の時間がかかるんじゃないかと思うくらい。それくらい便利だと思っているので特筆していますが、Amplifyの一機能という形で使っています。

AmplifyではGraphQLのAPIを作ることができます。実態はAWSのAppSyncです。GraphQLの形式でスキーマファイルを記述すると、AmplifyがAPIの構築及び、DynamoDBのテーブル作成を自動的にやってくれます。また、Amplifyに内包されているCodegenのおかげでGraphQLクエリとTypeScriptで解釈できる型（`type`）も自動的に生成されます。APIから返されるJSONに対して静的に型情報を付けられるので、不具合も減って開発速度も上がると信じています。型はいいぞ。

# Next.js

紹介するツールはこれで最後です。最終的にモバイルアプリの開発ツールですらありません。しかしFlutterなど他のクロスプラットフォーム技術とReact Nativeを比較したときに、ReactはWeb開発でも使われる技術というのは一つのメリットだと思うので紹介しておきます。

私はモバイルアプリ開発をメインとしていますが、会社のプロジェクト進行状況に応じてwebの開発に参加することも多いです。Webの開発にはReactベースのNext.jsを使っています。もちろんWebアプリを開発するためにはモバイルとは違う知識が必要になりますが、どちらもReactの文法で記述できるというのは大きなメリットです。個人的にアプリ開発において難しいところは状態管理と非同期処理だと思っています。状態管理と非同期処理が難しいのはWebでもモバイルアプリでも変わりません。Reactでは `useState` や `useEffect` に代表されるhookなどを使って状態管理と非同期処理を実現しますが、hookはモバイルのReact NativeでもWebのNext.jsでも同じように使えます。
そのため、普段はモバイル開発をメインにしているけどWebもやる、ということがやりやすいと感じます。同様に弊社ではWeb開発をメインにしているエンジニアにモバイル開発を手伝ってもらうこともあります。スタートアップ企業に代表されるような、人が少ない＆作るサービスが頻繁に変わるチームでは、Web開発とモバイル開発間の障壁が低いのは大きなメリットだなと感じています。

# まとめ

私が普段の開発で使っているツールを羅列いたしました。皆様のお役に立てることがあったならこの記事を書いた甲斐があります:relaxed:

コメント欄などで皆様が使っているツールもぜひ教えてください！それでは良いクリスマスを！
SPIRE: v1.1.1 変更内容

## はじめに
SPIRE 1.1.1 の変更内容を紹介します。

内容は下記CHANGELOGの翻訳です。
https://github.com/spiffe/spire/blob/v1.1.1/CHANGELOG.md

:pencil: がついた文章は、CHANGELOGの公式内容ではなく筆者の補足です。

以前のバージョン(v1.1.0)は[こちら](https://qiita.com/inajob/items/b546f11471083b1e4a1c)をご参照ください。

※この記事は、[Z Lab](https://qiita.com/organizations/zlab)の業務の一環として作成したものです。


## Added

- SPIREエージェントはGoogle Cloud Secrets ManagerにSVIDを保管できるようになりました。[#2595](https://github.com/spiffe/spire/pull/2595)
  - :pencil: SVIDStore catalogにgcloud_secretsmanager pluginが追加されました。これまではAWS secrets managerのみサポートしていました。

## Changed

- SPIRE Serverは、federateされた情報が追加・更新されたらすぐに、federateされたbundleをダウンロードするようになりました。[#2585](https://github.com/spiffe/spire/pull/2585)

## Fixed

- Percona Xtra DB Clusterをサポートするため、0.12.2で導入された機能をデグレードする修正をしました。[#2605](https://github.com/spiffe/spire/pull/2605)
  - :pencil: MySQLのトランザクションの分離レベルをSERIALIZABLEにしていましたが、MySQL compatibleなDB(Percona XtraDB Cluster)でサポートされていない機能であるため、FOR UPDATE時にロックするようになりました。
- Kubernetes 1.21のサポートのため、Kubernetes Workload Attestationを修正しました。[#2600](https://github.com/spiffe/spire/pull/2600)
  - :pencil: Kubernetes 1.21では、cgroups namespaceの利用方法が1.20と異なり、pod/containerのpathからattestする時に失敗していましたが、修正されました。
- SPIRE AgentはSVIDStore pluginによって保持されているSVIDを削除する時に失敗した場合、リトライしないようになりました。[#2620](https://github.com/spiffe/spire/pull/2620)
  - :pencil: SVIDの削除と書き込みが同時に走るようなエッジケースの対応です。何かしらの理由でSVIDの削除に失敗した際、SVIDの書き込みがちょうど同タイミングで実施された場合、直後に削除のリトライが発生することで、意図せず削除されてしまい、データの不整合が発生するのを避けるための修正のようです。
【CodeIgniter3(コードイグナイター)】のテーブルヘルパー(クエリをテーブルにする)

```PHP
$table = array('table_open' => '<table class = "tableLine all-center">',);
                    
$this->table->set_template($table);
$query = $this->db->query('SELECT * FROM M_sobi_data');
echo $this->table->generate($query);

```

#結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/bfac777f-0ebd-f15a-6584-c9eb3b388442.png)
学校のproxy下でRaspbianインストール

# 目的
学校のproxyのおかげで少しRaspbianの導入に手間取ったので記事にします。
Raspberry Pi Imagerを使用してmicroSDにイメージを書き込む

# 事前準備
PCのネットワーク設定
microSDのアダプター
microSD

# 目次
①raspi公式イメージャーのインストール
②raspbianのイメージダウンロード
③microSDにイメージ書き込み

# 手順
## ①raspi公式イメージャーのインストール
Raspberry Pi Imagerというものが存在している。
Raspberry Piに対応したOSのイメージをネットからひっぱてきて簡単に書き込める大変便利なもの
ただ、proxyの関係でネットからイメージを引っ張ってこれないみたいなので
イメージを手動でダウンロードしてきて、インストールはこいつに任せよう
以下のURLからダウンロード

https://www.raspberrypi.com/software/

### インストーラ実行
![キャプチャ68.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/825ca9d7-c7e0-8275-650f-8744abe2b4d8.png)

### インストール開始
赤枠をクリックしてしばらくすると次の画像のようになる
![キャプチャ69.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/d2c23311-6d77-88cd-d04b-f05029324ded.png)

赤枠をクリックするとRaspberry Pi Imagerが立ち上がる
のちほど使用するため終了せずに最小化でもさせとくとよいだろう。
![キャプチャ70.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/0a691067-f2bc-02fd-6d82-cdde08a082aa.png)

## ②raspbianのイメージダウンロード
以下のURLからimageをダウンロードできるが時間がかかるため共有ファイルにimageがある
最新版のOSを使いた理由がなければこちらを使ったほうが良いだろう

https://www.raspberrypi.com/software/operating-systems/#raspberry-pi-os-32-bit


![キャプチャ71.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/2087ab92-d3d3-33c1-22c9-77844983061e.png)

## ③microSDにイメージ書き込み
ダウンロードしたraspbianのイメージをRaspberry Pi Imagerを使ってmicroSDに書き込む

### OSの選択
以下を押しOSを選ぶ
![キャプチャ72.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/df6807ed-fd53-fb2f-f8cc-20e9f9252616.png)

一番下までスクロールし以下の項目を選択する。
![キャプチャ73.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/6f008967-a1d2-728d-6cf9-34aefca7035c.png)

手順①でダウンロードしたファイルを選択する。
![キャプチャ74.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/1fc2b6ed-35f6-d541-b809-73f91825a72b.png)

### 書き込むストレージを選択
書き込みたいmicroSDを選択する。
![キャプチャ75.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/9609b775-3717-f68a-77c2-8c24e5cdf549.png)

現在PCに接続させているストレージが表示されるので対象を選択する。
![キャプチャ76.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/343c121a-b440-d4d9-c957-5bdeba151b03.png)

### 書き込み開始
書き込みイメージとストレージを選択したら書き込めるようになる。
![キャプチャ77.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/66a3cf7d-7203-fdb0-a5c6-6f72055892bd.png)

すべてのデータが消えますという警告が出ます。
microSDに大切なものがないか確認してYESを押しましょう。
![キャプチャ78.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/45716356-643f-342b-f861-07c7e39d759d.png)

### 書き込み完了
PCからフォーマットの指示などが出ますがそのまま抜いて構いません。
![キャプチャ79.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/65c9bb38-94de-d74c-572e-75c00bdf0d0b.png)

# 最後に
おのれproxyめんどくさい手順を増やしやがって
位置情報と商圏分析

こんにちは。技研商事インターナショナル株式会社の秋葉です。
弊社はGIS・位置情報分析のなかでエリアマーケティングを中心にビジネスを行っていますが、そもそもエリアマーケティングとはなんぞやという方も多いと思います。
そこでエリアマーケティングの概要と位置情報とエリアマーケティングの今後の展望について話したいと思います。


## そもそもエリアマーケティングとは

弊社の[用語集](https://www.giken.co.jp/glossary/areamarketing/)から抜粋しますが、エリアマーケティングは下記のように定義されます。

>エリア・マーケティングとは、地域単位での需要・供給を考慮したターゲット・マーケティングのことです。

要は、知りたい場所の詳細をよく知ってマーケティングをするということです。
場所に関することなのでGIS（地理情報システム）を使います。
実際に、実店舗の開発や出店戦略・売上予測・販促の最適化などによく使われています。

### 商圏分析

エリアマーケティングの中でも代表的な商圏分析について説明したいと思います。
商圏分析の前にそもそも商圏とはというところを先に説明します。

#### 商圏とは
また弊社の[用語集](https://www.giken.co.jp/glossary/areamarketing/)から抜粋しますが、商圏は以下のように定義されます。

> 小売店舗や外食店舗などの店舗施設にお客様が来店する可能性のある範囲のこと

一般的にコンビニのような近くのお客様が主な顧客層となる店舗は商圏が狭く、遠くのお客様も来るホテルのような店舗は商圏が広いと言えます。
また、同じコンビニでもロードサイドと繁華街などの立地差などの要因で商圏は変化します。

#### 商圏の可視化
商圏分析のおいての基本である、商圏の可視化をしたいと思います。
たとえばある地域に出店している同業種の小売店舗に対し、それぞれ最低でも3000人は居住者がいると思われる範囲を商圏としてそのラインを引いてみるとします。
![商圏の可視化_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266180/d95581de-0682-76b4-9970-3d9d7a49e2e7.png)

このように、コンビニは商圏内人口が2000～3000人で事業が成立すると言われていますが、地図上でそれを可視化することができます。
特に商圏の重なった部分は顧客を奪い合っているエリアです。
同一企業店舗同士で奪い合っている状態は、通称でカニバリ（カニバリゼーション（共食い）の略）と呼ばれます。
店舗を急拡大する時に起こりがちですが、商圏を可視化することでそういった状況に陥っていないか？の把握に役立てることができます。

### 競合店分析

前項では、商圏の可視化について簡単に説明しましたが、競合店が存在する中で自社の店舗がどれだけ売上げられるか、などを分析することもできます。
代表的な競合店の分析手法に、ハフモデルがあります。

#### ハフモデル

ハフモデルとは1960年代からあるモデルです。
消費者は近くにある大きな店舗へ行くという一般的な傾向を前提にしており、複数店舗からある店舗を選択する確率を、店舗の売場面積に比例し、そこまでの距離に反比例するとした吸引モデルです。
ある消費者が店舗を選択する確率のことを吸引率と呼びます。
弊社HPでは、ホームセンターの出店前後での勢力変化を推計した例を挙げていますが、吸引率と様々なデータを駆使して需要の予測などを行うことができます。

 [ハフモデル参考](https://www.giken.co.jp/glossary/huff_model/)


### エリアマーケティングのこれから

上記に挙げた内容はごく一部ですが、エリアマーケティングの手法を用いることで店舗の売上や販促効率の向上につながる知見を得ることができます。
次項で簡単に述べますが、位置情報データをエリアマーケティングで使うことで、より多様な分析をすることができるようになっています。

## エリアマーケティングにおける位置情報
### 位置情報が活用される前まで
エリアマーケティングは、位置情報の活用が活発になるまで公的統計データを使用しての分析がメインでした。
公的統計データは、調査する時のサンプル数が多いためデータを取得した時点での精度が良い半面、更新が1年に1回や5年に1回など、更新頻度が低い点が欠点でした。
位置情報データを用いることで、よりリアルタイム性のある分析が可能になっています。

### 位置情報×エリアマーケティングの今後
今後位置情報データが発展することで、エリアマーケティングがどう変わっていくのかについて話したいと思います。

個人的には位置情報によって、エリアマーケティングにおける新しいデータ分析が注目されると思っています。
というのも位置情報データが増えていくことで、時系列を扱う時に用いられる分析手法がより活用される可能性があるからです。
今でも位置情報データを用いて来訪者の変化を判断することができますが、たとえば、来訪者数の増減とキャンペーン等なんらかの施策との因果関係の判断に差分の差分法（DID）が使えるかもしれません。

[差分の差分法とは](http://yukiyanai.github.io/jp/classes/econometrics2/contents/slides/metrics2_topic06_slides_pub.pdf)

DIDとは簡単に言うと、時系列的に似たような条件（並行トレンドの仮定を満たす条件）の2要素のうち1つを変えた時に、変えた後の時系列の変化を見ることでどこに因果関係があるか推定する計量経済学の分析手法です。

東京大学先端科学技術研究センターから、街路を非歩行者空間から歩行者空間にしたことが小売店・飲食店の売り上げに影響したかどうかを、DIDを用いて評価するという研究結果が発表されています。

[東京大学 先端科学技術研究センター：街路の歩行者空間化は小売店・飲食店の売り上げを上げるのか、下げるのか？](https://www.rcast.u-tokyo.ac.jp/ja/news/release/20211028.html)

この研究結果は都市開発のための定量的なデータ分析を行うために用いられていますが、位置情報の時系列データを分析するという点でエリアマーケティングへの利活用も進んでいくのではないかと思っています。
研修中勉強したObserverパターンについて

# はじめに
初めまして！
[CYBIRD Advent Calendar 2021](https://qiita.com/advent-calendar/2021/cybird)　21日目を担当します、@R_araiと申します。
20日目は@cy_seiyanさんの[初めての負荷試験とパフォーマンスチューニングで得た苦戦・快感・理解](https://qiita.com/cy-seiyan/private/0c68b1d5d09076153fcd)でした！バックエンド側の苦労や工夫が知れて勉強になる記事でした！

## 自己紹介
ゲーム系専門学校を卒業後、新卒でCYBIRDに入社した社会人1年目のエンジニアです！
配属部署はゲーム開発系ではなくほぼ未経験の分野で記事に出来る事がまだあまりないので今回は新卒研修でゲームを作る機会がありその時勉強した事を記事にしたいと思います！
## 概要
ゲーム開発をしていると〇〇した瞬間を検知したくなる時が度々あると思います。
学生時代自分は変化があるたびに条件書いたりしていましたが流石に面倒になってきたので新卒技術研修を機に勉強したので自分なりの解釈で今回の実装についてまとめようと思います。
尚、今回の実装の仕方は自分が理解しやすい形で実装したので一般的なオブザーバーパターンとは違うところがあるかも知れませんがこういう考え方もあるのか程度で見て頂けたら嬉しいです。
## 目次
1.Obeserverってなに？
2.実装内容
3.最後に

## 1.Observerってなに？
Observerとは観察される者(Observable)と観察する者(Observer)が存在し、観察される側に変化があったら観察する側に通知を送るというものになります。
自分もこの説明で理解出来れば苦労しなかったのですが正直この説明でもよく分からなかったのでRPGの戦闘終了時の処理に例えて解説してみます。
作りたい仕様は、Enemyが存在し、EnemyのHPが０になったらGameManagerは戦闘を終了させたい。
この仕様の場合、Enemyが観察される者（Observable）でGameManagerが観察する者（Observer）になります。
Enemy(Observable)は体力が０になったという変化が起きたのでGameManager(Observer)に変化があった事を通知するという流れになります。
## 2.実装内容
では次にさっきの仕様を実装してみます。
※UnityC#を使っていきます。

``` 

//観察する側インターフェース
public class IObserver : MonoVehavior
{
	//変更があった時に呼ばれる仮想関数
	public virtual void ChangeUpdate()
	{
	}
}

//観察される側
public class Observable
{
	private List<IObserver> observerList = new List<IObserver>();
	
	//観察してくる者を追加する関数
	public void Add(IObserver observer)
	{
		observerList.Add(observer);
	}
	
	//自分に変化があった時、観察している者達に通知する
	public void ChangeUpdate()
	{
		foreach(var observer in observerList)
		{
			observer.ChangeUpdate();
		}
	}
}

public class GameManager : IObservar
{
	//シングルトンもどき
	public static GameManager instance { get; private set; }
	
	void Awake()
	{
		//この実装法は危険なのでシングルトンで調べて実装してね
		instance = this;
	}

	public override void ChangeUpdate()
	{
		//ゲーム終了処理
	}
}

Public class Enemy : MonoBehaviour
{
	private int health;
	
	private Observable observable = new Observable();
	
	void Start()
	{
		health = 100;
		observable.Add(GameManager.instance);
	}
	
	//現在の体力をチェック
	private void CheckStatus()
	{
		if(health <= 0)
        {
			observable.ChangeUpdate();
		}
	}
}
```
 
実装はこんな感じで、コツとしては観察される者は観察する者のインスタンスを持っている事にあります。自分が変化したタイミングで観察する者の関数を呼んで上げれば通知が出来ます。呼ばれた時の振る舞いはIObserverを継承したクラス毎にoverrideして実装する事によって別々の定義が出来ます。さらにこのObserverの特徴がObservable(観察される者)が観察している者のインスタンスを複数持てる所で複数持てる事によってGameManagerからゲーム終了処理を呼ぶと同時にScoreManagerなどからスコアアップ関数やEffectEmitterからエフェクト生成関数など同時に行う処理をAddで追加するだけで簡単に仕様変更ができ多様性も高く作れます。
## 3.最後に
実際に初めて勉強して実装したのでObserverパターンというものがどんなモノかは理解しましたが、う〜ん…あんまりスマートな実装じゃないかも。概念としては間違っていないはずなのですが使いやすいかと言われると微妙な感じ…3~4週間という短い期間にゲームを作る研修という事もあってあまりここだけに時間が割けなかったというのもありますが、気が向いたら作り直したいです。
明日のCYBIRDエンジニア　Advent Calendar　22日目　の担当は、@cy-naullさんのUnity初心者がImageを発光させるです。Unityで手軽にビジュアルをこだわりたい方は勉強になりそうですね！
パワポの各スライドの原稿をコマンド一行でまとめて出力する方法

##やりたいこと
パワポの各スライドの原稿（発表者ノートに書いた文章）を、まとめて一気に出力する

##使用環境
Python 3.8.5
macOS Big Sur バージョン 11.2
Apple M1

###1, Pythonファイルを1つ準備
以下のスクリプトをコピペして、"manuscript_extraction.py"というファイル名で対象のパワポファイルと同じフォルダ内に配置。

```:manuscript_extraction.py
from pptx import Presentation
#同じディレクトリにあるpptxファイルを指定すること
presentation = Presentation('プレゼンファイル.pptx')
for slide in presentation.slides:
    if slide.has_notes_slide and slide.notes_slide.notes_text_frame.text:
        append_file = open('manuscript.txt', 'a')
        append_file.write(slide.notes_slide.notes_text_frame.text)
        append_file.write('\r\n')
        append_file.write('-----')
        append_file.write('\r\n')
    append_file.close()
```
フォルダ構造はこんな感じ。
![スクリーンショット 2021-08-23 23.33.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1733765/fee41a79-6114-c271-dfd1-c49164394fc2.png)

###2, python-pptxをインストール
PythonでPowerPointを操作するに、「python-pptx」という外部ライブラリをTerminal上でインストール。

```:Terminal
% !pip install python-pptx
``` 

###3, スクリプトとパワポファイルのあるディレクトリに移動


```:Terminal

% cd Desktop/slide_note_script
% ls
manuscript_extraction.py		プレゼンファイル.pptx
``` 
###４, 先程のプログラム"manuscript_extraction.py"をpythonで実行。

```:Terminal
% python3 manuscript_extraction.py
% ls
manuscript.txt				プレゼンファイル.pptx
manuscript_extraction.py

``` 
以下の通り、同じディレクトリー内にmanuscript.txtという原稿のファイルができました。
![スクリーンショット 2021-08-23 23.32.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1733765/29a32137-6f09-b341-3fc2-fab01f69a738.png)

こちら中身を確認するとこんな感じで原稿ができてます。

![スクリーンショット 2021-08-23 23.31.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1733765/ad64360d-3249-792a-8a3f-963e57b51ec4.png)

完璧ですね！
【CodeIgniter3(コードイグナイター)】のテーブルヘルパー 空のセル埋める

```PHP

$this->load->library('table');

$table = array(
    'table_open' => '<table class = "tableLine all-center">',
);

$table_data = array(
    array( '会員ID', '名前', '年齢'),
    array( '200001', '山田 太郎', ''),
    array( '200002', '鈴木 一郎', NULL),
);
$this->table->set_empty('[不明]');
echo $this->table->generate($table_data);

```

#結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/a10bdeac-4b41-ef0e-52f3-8d9d74561d17.png)
Javaを使用してバッチでWordの空白の段落を削除する方法

##テストドキュメント、期待される目標ドキュメントの削除した結果

テストに使用されたWord文書を以下のように示します。含まれている空白の段落は、記事の全体的なレイアウトと美的な効果に影響を与えます。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/d5b7da9b-03c9-8adc-3428-77c739d12e2a.png)
**目標ドキュメントの削除した結果**
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/200bae8c-205e-0fc7-6d70-462bd212eac3.png)
##補助ツール
クラスライブラリを使用する：**[Free Spire.Doc for Java](https://www.e-iceblue.com/Download/doc-for-java-free.html)**（無料版）
クラスライブラリjarファイルのインポート（参照用の2つのインポートメソッド）
1 公式Webサイトからjarパッケージをダウンロードして解凍し、libフォルダー内のSpire.Doc.jarをJavaプログラムに手動でインポートします。
2 Mavenプログラムにjarをインポートするには、最初にpom.xmlファイルを構成してから、プログラムをインポートし、次のように構成する必要があります。
```
<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.com/repository/maven-public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.doc.free</artifactId>
        <version>3.9.0</version>
    </dependency>
</dependencies>
```
**インポートした結果：**
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/214daf3d-fd77-f77c-ccb2-441ad18086b0.png)

##Javaコード例
```
import com.spire.doc.*;
import com.spire.doc.documents.DocumentObjectType;
import com.spire.doc.documents.Paragraph;

public class DeleteBlankParas {
    public static void main(String[] args) {
        //Wordテストドキュメントをロードする
        Document doc = new Document();
        doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\Sample.docx");

        //セクションをトラバースする
        for(int i = 0; i< doc.getSections().getCount();i++)
        {
            //sectionを取得する
            Section section = doc.getSections().get(i);

            //セクション内のオブジェクトをトラバースする
            for (int j = 0;j<section.getBody().getChildObjects().getCount();j++)
            {
                //オブジェクトのタイプを取得する
                Object object = section.getBody().getChildObjects().get(j).getDocumentObjectType();

                //段落をトラバースする
                for(int z = 0 ; z<section.getParagraphs().getCount();z++)
                {
                    //段落を取得する
                    Paragraph paragraph = section.getParagraphs().get(z);

                    //オブジェクトタイプが段落かどうかを判断する
                    if(object.equals(DocumentObjectType.Paragraph))
                    {
                        //段落の内容が空かどうかを判断する
                        if(paragraph.getChildObjects().getLastItem() == null)
                        {
                            //空白の段落を削除する
                            section.getBody().getParagraphs().remove(paragraph);
                            z--;
                        }
                    }
                }
            }
        }
        //ドキュメントを保存する
        doc.saveToFile("DeleteBlankParas.docx",FileFormat.Docx_2013);
        doc.dispose();
    }
}
```
以上は今回の記事でした、最後まで読んでいただきありがとうございます。
[py2rb] sliceクラス

# はじめに
移植やってます。
# slice (Python)
```python
s = slice(0, 10, 3)
print(type(s))

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10][s]
# a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10][s.start:s.stop:s.step]
print(a)

# <class 'slice'>
# [1, 4, 7, 10]
```
`Python`って`slice`クラスがあるんですね。
３つの数値を持ったタプルなんだと思いますが。
# どうする？ (Ruby)
```ruby
slice = Struct.new(:start, :stop, :step)
s = slice.new(0, 5, 3)
puts s
puts s.class
puts s.instance_of?(slice)

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10][s.start, s.stop]
print(a)

# #<struct start=0, stop=5, step=3>
# #<Class:0x000001e08c9f3260>
# true
# [1, 2, 3, 4, 5]
```
`Struct`で代用できそうな気もします。
`Slice`クラスを作る？

```ruby
class Slice
  attr_reader :start, :stop, :step

  def initialize(start, stop, step)
    @start = start
    @stop = stop
    @step = step
  end

  def slice(array)
    @start = 0 if @start.nil?
    @stop = -1 if @stop.nil?
    if @step.nil?
      array[@start..@stop]
    else
      array[@start..@stop].select.with_index{ |num, i| i % @step == 0 }      
    end
  end
end

s = Slice.new(0, nil, 3)
puts s.class

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(s.slice a)

# Slice
# [1, 4, 7, 10]
```
# メモ
+ Python の sliceクラス を学習した
+ 道のりは遠そう
【CodeIgniter3(コードイグナイター)】のテーブルヘルパー(列数を統一して空白のtdを埋める)

```PHP
$this->load->library('table');

$table = array(
    'table_open' => '<table class = "tableLine all-center">',
);
$th = array('会員ID', '名前', '年齢');
$td = array('one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight');
if(count($td)%3 > 0){
    array_push($td, '調査中');
    if(count($td)%3 === 2){
        array_push($td, '調査中');}
}

$this->table->set_template($table);
$this->table->set_heading($th);
$new_list = $this->table->make_columns($td, 3);
echo $this->table->generate($new_list);

```

#結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/d9491ec2-3305-1ffe-4b22-9f11f494f2b4.png)
映像から中指🖕を検出して先っちょにモザイク処理を施すクソアプリをつくった

こんにちは、今年もやってまいりました [クソアプリアドベントカレンダー2021](https://qiita.com/advent-calendar/2021/kuso-app) 14日目担当の 黒神 (@kokushin) と申します。

今回で4回目の参加になります、今年もよろしくお願いします！



## 過去作

https://qiita.com/kokushin/items/d413464b1d98162d07ad

https://qiita.com/kokushin/items/253ef1d5bd90d4c68d14

https://qiita.com/kokushin/items/54894b6ff9a4b24c0855


## 今回作ったもの

「**映像内で「🖕（中指を立てる）」動作をした際に、自動的に指の先端にモザイク処理を入れてくれる**」クソアプリをつくりました。

![fuckman_3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57867/20d646b1-a4b3-dd4f-7649-ec8c180d013f.gif)

デモ:

https://editor.p5js.org/kokushin/sketches/AVofVpyoN

クソみたいな仕草に対して、クソ役に立たない機能を実現した、正真正銘のクソアプリです。

![8b8ee77d.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57867/df68c6d1-f30a-c12e-e316-22c03fbffb23.jpeg)

## 使った技術

- [ml5.js](https://learn.ml5js.org/)
    - [Handpose](https://learn.ml5js.org/#/reference/handpose)
- [p5.js](https://p5js.org/)
- [p5.js Web Editor](https://editor.p5js.org/)

映像内の手の形を検出するために、ml5.jsという機械学習系のライブラリの**Handpose**を利用しています。

軽量かつ高速で動作し、検出精度もなかなか高かったので驚きました。クライアントサイドで完結して組み込めるのは本当にラクで良いですね。

映像とモザイクの描画にはp5.jsを利用しました。初めて使ったのでガッツリコード書いたわけではありませんが、メソッドなど直感的なものが多く非常に扱いやすい印象でした。

公式で提供されている[Web Editor](https://editor.p5js.org/)も使いやすかったです。

## 実装

とりあえず中指の検出から行いました。

Handposeは手を検出すると、オブジェクト形式で座標を返してくれます。

```js
[
    {
      handInViewConfidence: 1, // The probability of a hand being present.
      boundingBox: { // The bounding box surrounding the hand.
        topLeft: [162.91, -17.42],
        bottomRight: [548.56, 368.23],
      },
      landmarks: [ // The 3D coordinates of each hand landmark.
        [472.52, 298.59, 0.00],
        [412.80, 315.64, -6.18],
        ...
      ],
      annotations: { // Semantic groupings of the `landmarks` coordinates.
        thumb: [
          [412.80, 315.64, -6.18]
          [350.02, 298.38, -7.14],
          ...
        ],
        ...
      }
    }
  ]
```

指の種類や関節毎に検出することが可能なので、今回は中指の第2関節より先が伸びていれば「🖕」という状態である...と判定しています。

```js
for (let i = 0; i < predictions.length; i += 1) {
  const prediction = predictions[i]; // ここにHandposeの検出結果が格納される

  if (prediction.annotations.middleFinger[3][1] < prediction.annotations.middleFinger[2][1]) {
    const x = prediction.annotations.middleFinger[3][0] - (size / 2);
    const y = prediction.annotations.middleFinger[3][1] - (size / 2);

    // モザイクを描画
    // ...
  }
}
```

あとは、取得した関節の座標に対してモザイクを描画してあげるだけです。p5.jsの `loadPixels` メソッドを利用すれば、簡単にcanvas内のイメージをpixelの配列で取得することができます。便利！

モザイクのドット描画をもっと細かくやりたかったのですが、計算式を考えるのに時間を費やしそうだったので今回はクソデカ1ドットにしています。

普段からもっと触っていればよかった...

## あとがき

今年もクライアントサイドで動作する機械学習系のライブラリを使って遊んでみました。クソアプリアドベントカレンダーは普段触らない技術やアイデアを扱えるのでやはり楽しいですね。

今回のクソアプリはデバッグの際、Macに対して中指を立てまくったので、周りの人からやべーやつだと思われていないかだけ一点心配です。

お疲れさまでした！

## 参考にさせていただいた記事

- [Handpose](https://learn.ml5js.org/#/reference/handpose)
- [Camera mosaic](https://editor.p5js.org/haschdl/sketches/k9auULM3r)
- [ブラウザだけで指数えを検出](https://zenn.dev/tkyko13/scraps/b028812b0b9dc3)
Laravel Carbon Period 期間を配列取得

#### CarbonPeriodって？
* [公式ドキュメント](https://carbon.nesbot.com/docs/#api-period "CarbonPeriod")
* **CarbonPeriod**
  * Carbonのライブラリに含まれている期間を扱うためのクラス

#### 使いどころ
20XX年X月度日別アクセス数の集計するときとか…
年代別にユーザーを取得するときとか…
要するに特定の期間を指定した間隔で取り出して配列でゴニョゴニョしたいとき

#### 前提条件
* Carbonのversionが1.29以降

#### 個人的によく利用する方法
* 秒単位

```
$period = CarbonPeriod::create('2021-12-01 00:00:00', '2021-12-01 00:01:00')->seconds()->toArray();

// 2021-12-01 00:00:00, 2021-12-01 00:00:01, 2021-12-01 00:00:02…
```
* 分単位

```
$period = CarbonPeriod::create('2021-12-01 00:00:00', '2021-12-01 00:30:00')->minutes()->toArray();

// 2021-12-01 00:00:00, 2021-12-01 00:01:00, 2021-12-01 00:02:00…
```
* 時間単位

```
$period = CarbonPeriod::create('2021-12-01 00:00:00', '2021-12-01 23:59:59')->hours()->toArray();

// 2021-12-01 00:00:00, 2021-12-01 01:00:00, 2021-12-01 02:00:00…
```
* 1日単位

```
$period = CarbonPeriod::create('2021-12-01', '2021-12-31')->toArray();

// 2021-12-01 00:00:00, 2021-12-02 00:00:00, 2021-12-03 00:00:00…
```
* 週単位

```
$period = CarbonPeriod::create('2021-12-01', '2021-12-31')->weeks()->toArray();

// 2021-12-01 00:00:00, 2021-12-08 00:00:00, 2021-12-15 00:00:00…
```
* 月単位

```
$period = CarbonPeriod::create('2021-01-01', '2021-12-31')->months()->toArray();

// 2021-01-01 00:00:00, 2021-02-01 00:00:00, 2021-03-01 00:00:00…
```
* 年単位

```
$period = CarbonPeriod::create('2019-02-01', '2021-12-31')->years()->toArray();

// 2019-02-01 00:00:00, 2020-02-01 00:00:00, 2021-02-01 00:00:00…
```
* 〇日おき

```
$period = CarbonPeriod::since('2021-12-01')->days(3)->until('2021-12-31')->toArray();
$period = CarbonPeriod::create('2021-12-01', '3 days', '2021-12-31')->toArray();

// 2021-12-01 00:00:00, 2021-12-04 00:00:00, 2021-12-07 00:00:00…
```

* 特定の日から今日まで or 今日から特定の日まで

```
$period = CarbonPeriod::start('2021-12-13')->untilNow()->toArray();

// 2021-12-13 00:00:00, 2021-12-14 00:00:00, 2021-12-15 00:00:00…

$period = CarbonPeriod::untilNow()->end('2021-12-31')->toArray();

// 2021-12-15 00:00:00, 2021-12-16 00:00:00, 2021-12-17 00:00:00…
```

#### おまけ

* 期間の最初と最後

```
$period = CarbonPeriod::create('2020-01-01', '2021-12-31')->first();

// 2020-01-01 00:00:00

$period = CarbonPeriod::create('2020-01-01', '2021-12-31')->last();

// 2021-12-31 00:00:00
```
* 逆にして取り出す

```
$period = array_reverse(CarbonPeriod::create('2021-12-01', '2021-12-31')->toArray());

// 2021-12-31, 2021-12-30, 2021-12-29, 2021-12-28, 2021-12-27…
```
以上
スタックのアップグレード：Newfrontのケーススタディ

今回はNewfrontの事例つについて、ご紹介いたします:loudspeaker:

マーケティングチームとプロダクトチームを切り離さなければならないときはどうしますか？そういう場合はスタックをアップグレードしましょう。

著者：Bruno Aderaldo 2020年8月10日
原文：https://bejamas.io/blog/upgrading-the-stack-newfront-case-study/

![Upgrading-the-Stack-Newfront-Case-Study.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242415/be4d7e34-dfc3-682c-6999-ee753f7e18d1.jpeg)

以前、ウェブサイトの再構築の必要性と、古いウェブサイトがビジネスに悪影響を及ぼす可能性があることをお話しました。Newfrontのサイトではそうではありませんでしたが、使用しているスタックのせいで、ワークフローがやや大変でした。

このマーケティングサイトでは、もともと複雑なテンプレートシステムが使われており、何かを公開したいときにはチーム間でのやりとりが必要でした。その上、チームは自動再構築とデプロイに凝ったウェブフックを設定していたので、完成までに時間がものすごくかかっていました。結局、エンジニアリングの速度、ウェブサイトのパフォーマンス、そしてユーザーエクスペリエンスにまで影響を与えました。

使ったスタックが間違っていたわけではありません。というよりも、その能力を十分に発揮できなかったということです。

##1. ニューフロントストーリー

保険業界は、旧態依然としていて硬直した業界のため、テクノロジーの導入が遅れているといわれています。Newfrontは、自分たちの仕事に現代的なアプローチを取り入れ、テクノロジーを活用して顧客やブローカーの体験を簡素化することを決めた、業界でも数少ない企業の一つです。

特に保険のような広大で複雑な業界では、変革を提唱することは決して容易ではありません。初日から明確なビジョンとミッションを持つことで、Newfrontは革新的で効果的なソリューションを提案するだけでなく、業界を変革することができました。

##2. 概要

同じような考え方やワークカルチャーを持つ会社と一緒に働くことで、コミュニケーションやコラボレーションがよりスムーズになります。初日から、彼らのニーズを明確に理解することができましたし、我々の提案した変更がどのように役立つかを彼らも理解することができました。

>ウェブサイトの表示速度や反応が遅く、私たちが気にかけているクラフトマンシップのレベルからはかけ離れていました。
Anthony Short
Newfront保険会社のエンジニアリング・マネージャー

彼らのウェブサイトは、Next.jsを使って1つの巨大なアプリとして構築されていました。つまり、Webサイト、クライアントのダッシュボード、内部のアプリがすべて1つの大きなNext.jsアプリになっていたのです。そのため、構築に時間がかかり、操作性も悪くなっていました。また、パフォーマンスやSEOを考慮して作られていなかったので、これも変更する必要がありました。

もう一つの問題は、このアプリが古いバージョンのNext.jsを実行していたことです。性能が低いだけでなく、彼らの生活をより快適にすることができる新機能もありませんでした。

最終的には、ウェブ開発チームが更新情報を本番環境に公開することではなく、マーケティングチームが自由に実験できるソリューションに重きをおくことにしました。

##3. 使用したスタック

同社のベーススタックは、アプリのReactフレームワークとしてのNext.js、コンテンツ管理のPrismic、CI/CDソリューションのVercelなど、すでに充実していました。そのため、スタックを維持しており、Next.jsを最新のバージョンにアップグレードするなど、いくつかの変更を行ったことで、スタックの良さを最大限に引き出すことができました。

##4. 今回のプロジェクトでの最大の課題

最大の課題は、CMSユーザーがページを追加・編集し、その変更をすぐに本番で確認できるようなウェブサイトを作ることでした。社内のアプリと一緒にサイトが詰まっているため、ビルドが遅いという問題がありました。このサイトを別のプロジェクトとして扱い、移動させる必要がありましたが、これにより彼らはより多くのコントロールと迅速なビルドが可能になりました。

また、両方のテーマに対応したコンポーネントを用意することも考えました。このブランドではダークな色調を使用していますが、特定のページではライトなテーマをサポートしたいと考えました。つまり、両方のテーマに対応するためには、再利用可能なコンポーネントにもっと注意を払う必要があったのです。そのために、テーマ性のあるユーザーインターフェースを簡単に作れる「Theme UI」と、CSS-in-JSが使える「Emotion」を使うことにしました。その結果、ダイナミックで再利用可能なコンポーネントを作ることができました。

ナビゲーションメニューや一部のページタイトルなど、特定の要素にアニメーションを使用することで、モダンなデザインを実現しています。framer-motionを採用したことで、パフォーマンスを落とさずにアニメーションを追加することができました。

##5. 結果

Newfront保険会社にとって最大の収穫は、マーケティングチームとプロダクトチームを切り離すことができたことです。Anthonyの説明によると、マーケティングチームが自分たちでCMSを使い、変更を加え、それをすぐにサイトに反映させることができるようになったのです。

>私は、クラフトマンシップと品質の価値が同じチームと仕事をしたいと思いました。また、Next.jsを使ってサイトを構築するチームが社内で使われているテクノロジーの数を減らすことも望んでいました。
Anthony Short
Newfront保険会社のエンジニアリング・マネージャー

新しいウェブサイトでは、ワークフローが簡素化され、より迅速な作業が可能になったため、エンジニアリングチームは本来の仕事である製品の開発に専念できるようになりました。

最後まで読んで下さり、ありがとうございました:bow_tone1:

Jamstackに関心がある方はこちらまでお問合せください！
**株式会社ヒューマンサイエンス
https://www.science.co.jp/**
ngrokでlocalhost(127.0.0.1)をHTTPS化する

## ngrokとは

ローカルのサーバを外部に公開するツールです。

詳しくは公式サイトを見てください。

[ngrok公式サイト](https://ngrok.com/product)

## 環境

Ubuntu 20.04 LTS

Nginx 1.18.0

## 導入方法

### wgetコマンドをインストール（既にある場合は必要ない）

```bash
#homeへ移動
$ cd ~
$ sudo apt-get install wget
```

### ngrokをダウンロード

wget後ろのリンクは以下のページ「Download」ボタンを右クリックして「リンクのアドレスをコピー」を選択したもの

[https://ngrok.com/download](https://ngrok.com/download)

```bash
#ngrokをダウンロード
$ wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.tgz

#ダウンロードできているか確認。
$ ll
->ngrok-stable-linux-amd64.tgz   //これがあればおｋ
```

### ダウンロードしたngrokのファイルを解凍して/usr/binへ解凍されたファイルを移動

```bash

#ngrok-stable-linux-amd64.tgzを解凍
tar -xzvf ngrok-stable-linux-amd64.tgz

#/usr/binへ解凍されたngrokファイルを移動
sudo mv ngrok /usr/bin/

#移動できてるか確認
which ngrok
→/usr/bin/ngrok

#アクセスできるか確認
ngrok version
→ngrok version 2.3.40
```

### 80番ポートを外部に公開する

```bash
#80番ポートを外部に公開する
ngrok http 80
```

```bash
ngrok by @inconshreveable                                       (Ctrl+C to quit)

Session Status                online
Session Expires               7 hours, 59 minutes                            
Version                       2.3.40                                             
Region                        United States (us)                                
Web Interface                 http://127.0.0.1:4040                             
Forwarding                    http://XXXXXXXX.ngrok.io -> localhost:80        
Forwarding                    https://XXXXXXXX.ngrok.io -> localhost:80
```

### ngrokアカウントを作成し認証する

認証を行わずとも外部公開を行うことは可能ですが、8hで強制的に接続を切られてしまうので、今回はアカウントを登録します。

1. [ngrok公式サイト](https://dashboard.ngrok.com/user/signup)からユーザ登録します。Githubアカウント、Googleアカウントでも登録できるのでお好みで登録。
2. ngrokのダッシュボードへリダイレクト後、左メニューの「setup and install」をクリックし、「2. Connect your account」のコマンドをコピー
3. shellにコピーしたコマンドを実行し、認証する。

```bash
$ ./ngrok authtoken [トークン]
```

### 再度80番ポートを外部に公開する

```bash
#80番ポートを外部に公開する
ngrok http 80
```

```bash
ngrok by @inconshreveable                                       (Ctrl+C to quit)

Session Status                online                                            
Account                       XXXXXX@gmail.com (Plan: Free)                             
Version                       2.3.40                                             
Region                        United States (us)                                
Web Interface                 http://127.0.0.1:4040                             
Forwarding                    http://XXXXXXXX.ngrok.io -> localhost:80        
Forwarding                    https://XXXXXXXX.ngrok.io -> localhost:80
```

[ Forwarding     https://XXXXXXXX.ngrok.io -> localhost:80へアクセス ]

![キャプチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2091855/31dabcc4-6f13-33b9-c87b-44fc076776fc.png)


しっかりとHTTPSになってます！
CLIでSpannerエミュレータを立てる

2021年[NI+C Advent Calendar 2021](https://qiita.com/advent-calendar/2021/niandc_teamgcp)の16日目です

#はじめに
最近はミニマムなサイズのSpannerが選択できるようになりましたが、まだまだお高い+開発環境としてローカルにSpannerがほしいっていうニーズがあるかと思います。
ちょっと前まではコンテナベースでエミュレータがあったのですが、今はCLI(gcloudコマンドで完結)でできるようになったので流れをまとめたいと思います。

#確認環境
- Cloud shell
- gcloud コマンド導入済み

#準備
多分こちらのコマンドを打つと、Spannerのエミュレータの最新版が入るはず。

```shell
sudo apt-get install google-cloud-sdk-spanner-emulator
```

もし後続でうまく行かないことがあれば下記のコマンドで、各種コンポの最新化を実施してください。（このコマンドを打つとこれを実施してね、とapt-get コマンドが表示されます）

```shell
gcloud components update
```

#エミュレータ起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299211/5fd43e0c-dcc7-6909-2fc5-c89145143106.png)



流れとしては下記になります。
  
1. エミュレータサービスの起動（Google CloudのSpannerサービスをローカルに起動する）
1. Spanner APIのコール先の指定（ローカルに向ける）
1. エミュレータにSpannerインスタンスを立てる
1. 内製プログラムの実行

## 1. Spannerエミュレータサービスの起動
まず、ローカル(今回はCloud Shell)にエミュレータを下記コマンドで起動します。

```shell
gcloud emulators spanner start
```

こちらのコマンドを実施すると、サーバ（サービス）が起動するので、後続の作業は別プロンプト等を使用してください

## 2. Spanner APIのコール先の指定（ローカルに向ける）
通常gcloudコマンドを実施すると、本物のGoogle Cloudに命令がとどいてしまいます。今回は、gcloudコマンドをローカルのエミュレータに到達させてたいです。
そのため、Spannerに関するAPIのエンドポイントを下記コマンドにてローカルにひん曲げます。

```shell
gcloud config configurations create emulator
gcloud config set auth/disable_credentials true
gcloud config set project your-project-id
gcloud config set api_endpoint_overrides/spanner http://localhost:9020/
```
- 1行目の confifurations craete で専用のプロファイルを別途作成
- 4行目で SpannerのAPI エンドポイントをローカルホストの9020ポートでオーバライドしている感じです。

## 3. エミュレータにSpannerインスタンスを立てる
上記の手順までは、まだ、空のSpannerサービスがローカルにある状態です。
ここから、具体的にSpannerのインスタンスを立てることになります。

```shell
　gcloud spanner instances create test-instance \
   --config=emulator-config --description="Test Instance" --nodes=1
```

一旦サンプルを記載しますが、後続で影響があるポイントとしては、下記になります。

- create [instance_name]
    - DB作成時や、コード実施時に影響。本気でやろうとしたときは環境変数化が吉
- --nodes= [n]
    - 今回はパフォーマンス検証を目的にしていないので、言及しないですが、パフォーマンスも含めて挙動確認が必要ならnodesを増やしてみてください。（そもそも今回の検証はCloud shell上ですので、、、1で実施しています）

## 4.内製プログラムの実行
手順3までで、Spannerのインスタンスの作成ができました。
この後実施するのがDBの作成・・・となります。

今回は実行環境が比較的ライトに揃うPythonを使って確認します。

### 環境変数設定
サンプルのpythonコードのSpanner参照先を指定しています。
手順2で実施したのは、あくまでgcloudコマンドのAPIエンドポイントをオーバライドしましたが、この手順では、Pythonの実行向き先を変更している形になります。

```shell
export SPANNER_EMULATOR_HOST=localhost:9010
```

### ソースコード取得及びpython実行環境用意
Gitに公開されているサンプルコードを取得し、pipにてライブラリを取得しています。

```shell
　mkdir tmp_spanner_emu_test
  cd tmp_spanner_emu_test
　git clone https://github.com/googleapis/python-spanner
　cd python-spanner/samples/samples
　virtualenv env
　source env/bin/activate
　pip install -r requirements.txt
```

### コード実行
下記コマンドを実行し、DBを作成するサンプルコードを実行します。

**※もし、PJ IDがyour-project-id以外を向いていたら、再度手順2を実施してください**

```shell
python snippets.py test-instance --database-id example-db create_database
```

- 第2引数で手順3で指定したインスタンス名を設定しています。

下記の戻り値があれば成功です。
`Created database example-db on instance test-instance`

#終わりに
いかがでしょうか。結構簡単にローカル環境にSpanner環境が構築できたと思います。
分散RDBで世界を変えてくれそうなSpannerさん。でも開発環境の用意が費用の関係でできないことも多々あるかと思います。
そういったときに上記の手順で、ローカル環境にエミュレータを構築し、開発を促進していければと思います。

## 追伸
gcloud上で "your-project-id"ってなにか特殊だったりするのかなぁ。
Rails Googleフォント 使い方（初心者）

#Google Fontとは
Googleが提供するWebフォントのサービスです。
基本無料で使用できます。
下記GoogleフォントのURL

https://fonts.google.com/

###Webフォントとは
Webフォントはネットワーク上からフォントデータを読み込みWebサイトやブログに表示する仕組みを利用しています。
異なるデバイスで見ても意図したWebフォントを表示することが可能。
##実装の手順
①使いたいGoogleフォントを探す（　link　と　CSS rules to specify familiesをコピー）
②app/views/layouts/application.html.erb　のheadの中にlinkを貼り付ける
③app/assets/stylesheets 内にある使いたいscssにCSS rules to specify familiesを貼り付ける

###①
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2274768/5c3dcc34-baed-b064-52bd-34b7f22a8f13.png)
上画像Googleフォントのページです
ここから使いたいフォントを選びます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2274768/f0f1546f-7a4a-c339-9287-59a8434ee934.png)
選んでみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2274768/8964d366-ae73-f83a-6dcd-30e7c593ea93.png)
右下の方にあるselect this style を押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2274768/78568f37-eda7-4628-88c0-d54728c9e89c.png)
押すとこのように"link"と"CSS rules to specify families" が表示されます
この２つが必要になります。

:::note warn
注意
ページを翻訳するとコピーする内容も翻訳される場合があります。
:::
###②
```
<!DOCTYPE html>
<html>
  <head>
    <title>Unkoapp</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
    <%= stylesheet_pack_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <link rel="preconnect" href="https://fonts.googleapis.com"> #headの中に先ほどコピーしたリンクを差し込む
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>　 #同じく
    <link href="https://fonts.googleapis.com/css2? family=Kaisei+Decol:wght@500&display=swap" rel="stylesheet"> #同じく
  </head>

  <body>
    <%= yield %>
  </body>
</html>
```

###③
```
.title {
  font-family: 'Kaisei Decol', serif; #コピーしたCSS rules to specify families
}
```
##なぜこの記事を書いたか
今、初めてオリジナルでアプリを作っています。
その中でGoogleFontを使うのに時間がかかってしまったので
1ページでわかりやすい記事を書いてみようと挑戦してみました。
他にもGoogleFontの使い方は多数あるので、追記して出来るだけわかりやすいページに仕上げていきたいと思います。
iOS版MSリモートデスクトップでAzureAD参加PCに接続する方法

インターネット上にもMicrosoft公式にも無い方法を見つけたので記載します。

#ハマりポイント
１．ユーザーアカウント名：メールアドレス　は駄目。

２．PC版でのAzureAD参加PCに接続方法の「azuread￥メールアドレス」も駄目。

３．原因はiOSの文字の「￥」と「@」がMicrosoft側で認識できないこと

#結論（接続方法）
１．azureadアカウントでログインしているPCで、コマンドプロンプトでwhoami

２．１の結果（例：hogead\123456）をユーザーアカウント名に指定する
　※「￥（円マーク）」ではなく「\（バックスラッシュ）」
neosでlogix その26

#概要

niosでlogixやってみる。
websocketclientコンポーネント
websocket connectノードを使ってみた。

#写真

![2021-12-14 01.26.30.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/9008eba0-5be8-26f1-a1c8-35cace883e2c.jpeg)

#手順

- devtooltipを装着
- 新規->空のオブジェクト->network->websocketclientをスポーン
- インターフェースを取り出す
- logixtooltipを装着
- network->websocket->websocket connectをスポーン
- つなぐ


以上。
lazygitのカスタムコマンドでデフォルトコマンドを上書きする方法

皆さん[lazygit](https://github.com/jesseduffield/lazygit)使ってますか？
私はCliでやる派閥なのですが、コマンドだと他の方に見せる時や駆け出しエンジニアの方を教育する際に「何やってるかまるでわからん」と言われてしまい、泣く泣く導入しました(T_T)

最初は面倒だった`lazygit`ですが、もう今となっては、とても見やすく、これ無しでは辛くなってきています。
結局は使い続けていたら手に馴染むものですね！

ちなみに`lazygit`は`vim`との親和性が高く、こちらの[vimプラグイン](https://github.com/kdheepak/lazygit.nvim)を導入すれば`vim`の中から`lazygit`が呼べるので、一度vimを起動すればもうvimを閉じる必要がありません。

いやしかし、それでも毎分 `git commit` する生活をしていると、コマンドのカスタマイズが必要になってきて、結局`vim`を閉じてコマンドを直接打つ機会が増えてきます。

そんな時に[lazygitのドキュメント](https://github.com/jesseduffield/lazygit/blob/master/docs/Custom_Command_Keybindings.md)を読んでいたところ、カスタマイズできるじゃないですか！

ということで早速試してみましょう。

今回は`git　commit`する際のHookに何かしらのチェックが入っていた際にそれを無効化するようなオプション（`--no-verify` or `-n`）を付ける設定に上書きしましょう！
（無効化するくらいなら始めから入れるなよ、というのは置いておいて）

以下ファイルを作成する or lazygit上で`o`を押す

```yaml:~/.config/lazygit/config.yml
customCommands:
  - key: 'c'
    prompts:
      - type: 'input'
        title: 'Commit message'
        initialValue: ''
    command: "git commit --no-verify -m '{{index .PromptResponses 0}}'"
    context: 'files'
    description: 'commit changes(Custom Command)'
  - key: 'C'
    command: "git commit --no-verify"
    context: 'files'
    subprocess: true
    description: 'commit changes using git editor(Custom Command)'
```

これで保存して実行するだけでOKです！

![スクリーンショット 2021-12-14 10.23.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155341/24787e88-2fc0-6c99-e7ca-c6c68f9a87a5.png)

このように`c`と`C`が上に2つ追加されました。
下にも元々のコマンドは残ってしまうのですが、上に書いてあるものが優先されそうです。

注目すべきは`c`と`C`でそれぞれ設定方法を変えていることです。

`prompts`を使わずに直接`command`のみだとエディタが立ち上がってしまいます。

`c`の場合はlazygitのinputを利用するために`prompts`で実行しています。

それではまた！
「設計」で大事なのはこれだった！半年間で40本レビューして分かった 5つのポイント


<!-- 
まさかmarkdownを素で読んでくださる方がいるとは思っていませんでした....!!
いいなと思ったらぜひLGTMをお願いします！！w
-->


この記事は[リンクアンドモチベーションアドベントカレンダー2021](https://qiita.com/advent-calendar/2021/mcs)の16日目の記事です。

https://qiita.com/advent-calendar/2021/mcs


この記事は以下の [Link and Motivation DEVELOPERS' BLOG](https://link-and-motivation.hatenablog.com/)に移行しました。

https://link-and-motivation.hatenablog.com/entry/2022/10/05/181858
@nuxtjs/axiosにおけるgetと$getの違い（備忘録）

## 結論

getと$getでは返ってくるレスポンスに含まれるものが異なる。
公式ドキュメントには下記のように書いてある。

> Axios plugin also supports shortcuts with $ prefixed methods to directly get data:

つまり下記のようになる
 - `get` : headers等も一緒にレスポンスされる
 - `$get`: dataのみレスポンスされる。

## 参考文献
[nuxt/axios公式ドキュメント](:https://axios.nuxtjs.org/usage)
ワークフロールールで「契約終了日」前に自動的にToDoを作成する方法（契約が期限切れになる前日に自動的にTodoを割り当てる方法）

今回はワークフロールールの時間ベースのワークフロールールの作成方法について説明します。

今回の自動化の設定として
1.取引先オブジェクトにカスタム項目（日付型）「契約終了日」作成
2 1のカスタム項目「契約終了日」が間もなく切れそうな場合、自動的にToDo作成をしたい

とします。

さあ上記設定を満たすためにどうするか考えていきましょう。

例えば、今は2021年12月だと仮定します。
今（2021年12月）取引先レコードを作成し、2022年2月1日に契約終了日を設定したとします。

その際、2022年1月31日になにかしらのアクションをしたい場合（今回の場合ToDo自動作成）の場合、どうするか
というお話です。

では実際に見てみましょう。

##ワークフロールール作成（条件）

まずはワークフロールールの作成です。
ワークフロールールの作成です。
条件設定は以下の数式となります
契約完了日＞TODAY()

さて、上記関数「TODAY()」とは、レコード作成時点の日付を表します。
つまり、今が2021年１月１日なら「TODAY()」は2021年1月1日。
今が2021年２月１日なら「TODAY()」は2021年２月1日。となります
つまり、（今が2021年12月の場合） 契約完了日が今日より後（例：2022年2月1日）の場合起動。
 契約完了日が今日より前（例：2021年11月）の場合起動はされないです。
![契約1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/dcdf08f7-09ef-5437-3927-41667941ad18.png)

##ワークフロールール作成（アクション）
次にアクションの作成です
まずは時間ベースのワークフローを作成しますので「タイムトリガの追加」をクリックします
![契約2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/e9c6b7d5-945b-cbea-1eec-baca27ae7fc1.png)

カスタム項目「契約終了日」の1日前に設定し「保存」をクリックします

その後時間ベースのアクションから「新規ToDo」をクリックし設定をします
![契約4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/173a62b3-91db-0586-2a3d-adbe457a1eb8.png)

あとはこのワークフロールールを「有効化」すれば完了です。

では実際に今（2021年12月）取引先レコードを作成しカスタム項目「契約終了日」を2022年2月1日にしましょう

「時間ベースのワークフロー」から実際に時間ベースのワークフローが待機されていて、1月31日にメールが送信されるように設定されていることが確認できますね。
![契約5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/fd6198db-7a93-dee1-f12e-11e52e18273c.png)


##確認

改めまして、
契約完了日＞TODAY()
の内容を確認しましょう

例１　
今日が2022年1月1日
契約完了日　2022年2月1日の場合
契約完了日（2022年2月1日）＞今日（2022年1月1日）
なので、
契約完了日＞TODAY()　が満たされる

例２
今日が2022年3月1日
契約完了日　2022年2月1日の場合
契約完了日（2022年2月1日）＜今日（2022年3月1日）
なので、
契約完了日＞TODAY()　が満たされない
Salesforceの設定メニューショートカット

# 概要
Salesforceの設定メニューにアクセスするためには、セットアップページを開いて項目を検索して遷移する必要がありLightning Experienceだと画面自体重いので開くだけで時間がかかります。
ちょっとでも時間短縮したいのでブックマークレットを使って目的の設定ページに直接飛べるようにしています。
Chromeで動作確認しています。

# 設定方法
Lightning Experienceのユーザー設定ページに飛ぶメニューの例です

1. ブックマークを追加し下記JavascriptをURLに設定
 
```
javascript:document.location.replace('https://'+location.hostname.split('.').shift()+'.lightning.force.com'+'/lightning/setup/ManageUsers/home');
```

1. Chromeで目的の組織にログイン
1. Salesforceのページを開いている状態で上記のブックマークレットを選択

現在開いているSalesforceのドメイン部分を取得して使用しているので必ずログインしてページを開いている必要があります。

# ブックマークレットの一括登録
ブックマーク用のhtmlファイルを作成し、Chromeの設定とインポートからブックマークレットを一括でインポートできます。

```Bookmark.html
<DL><p>
<DT><H3>Setup Lightning</H3>
<DL><p>
<DT><A HREF="javascript:document.location.replace('https://'+location.hostname.split('.').shift()+'.lightning.force.com'+'/lightning/setup/ManageUsers/home');">Users</A>
<DT><A HREF="javascript:document.location.replace('https://'+location.hostname.split('.').shift()+'.lightning.force.com'+'/lightning/setup/PermSetGroups/home');">Permission Set Groups</A>
<DT><A HREF="javascript:document.location.replace('https://'+location.hostname.split('.').shift()+'.lightning.force.com'+'/lightning/setup/PermSets/home');">Permission Sets</A>
</DL><p>

<DT><H3>Setup Classic</H3>
<DL><p>
<DT><A HREF="javascript:document.location.replace('https://'+location.hostname.split('.').shift()+'.my.salesforce.com'+'/005?isUserEntityOverride=1&setupid=ManageUsers');">Users</A>
<DT><A HREF="javascript:document.location.replace('https://'+location.hostname.split('.').shift()+'.lightning.force.com'+'/_ui/perms/ui/setup/PermSetGroupsPage?setupid=PermSetGroups');">Permission Set Groups</A>
<DT><A HREF="javascript:document.location.replace('https://'+location.hostname.split('.').shift()+'.lightning.force.com'+'/0PS?setupid=PermSets');">Permission Sets</A>
</DL><p>
</DL><p>


```

LightningとClassicでフォルダ分けしています。