OmniAICreator/Qiita-1.07M huggingface dataset:
Hackerとは　サイバーセキュリティのキャリアのはじめ方

# はじめに
本記事はHackerをテーマにサイバーセキュリティのキャリアのはじめ方について記載しています。

論理的なハッカーとして、サイバーセキュリティを学ぶ方法を目的としています。

## Hackerとは
現代でHackerと言うと、ネガティブなイメージで解釈されることが多いですが、本来の意味ではWikipediaの[ハッカー](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%AB%E3%83%BC)のような一般の人よりコンピュータについて詳しい人のことを指すのが語源です。

ハッカーの世界や歴史に興味がある場合は、オーム社より出版されている「ハッカーと画家 コンピュータ時代の創造者たち」がお勧めです。

オタクの話からインターネット黎明期の話や富の創り方の話など、2000年代の前半を舞台にコンピュータの世界で当時、何が起こっていたかについて書かれています。

https://www.ohmsha.co.jp/book/9784274065972/

### When Hackers Were Heroes
歴史を覗くと40年前、「ハッカー」という言葉はほとんど知られていませんでした。
ハッカーという言葉が浸透した背景には、技術ジャーナリストのSteven Levy氏の功績が大きいとのことです。

https://cacm.acm.org/magazines/2021/4/251341-when-hackers-were-heroes/abstract

### How To Become A Hacker
以下はHow To Become A Hackerの翻訳です。

インターネット黎明期から普遍的なハッカーになるためのマインドが学べます。

https://cruel.org/freeware/hacker.html

## Career in Cybersecurity
サイバーセキュリティを学ぶために役立つコンテンツの情報を以下に記載します。

### Learning Platform
倫理的ハッキングについて学べる学習プラットフォームは、以下2つが有名です。

TryHackMeはTHM、Hack The BoxはHTBと略します。
基本的に2つとも無料で利用できますが、学習の幅を広げるためには課金が必要です。

https://tryhackme.com/

以下はこれまで書いたTryHackMeのWriteupです。参考になれば幸いです。

- [TryHackMe Writeup：RootMe](https://qiita.com/Brutus/items/1f9b1db93482ffbca6c2)
- [TryHackMe Writeup：Lian_Yu](https://qiita.com/Brutus/items/f18513530c1183046056)
- [TryHackMe Writeup：AttackerKB](https://qiita.com/Brutus/items/edb933fb2770ffaa9b9f)
- [TryHackMe Writeup：Ice](https://qiita.com/Brutus/items/abf042cb9cf5c02be2a5)
- [TryHackMe Writeup：Badbyte](https://qiita.com/Brutus/items/4681cf3d49e17184c20f)

https://www.hackthebox.com/

::: note
Hack The Boxを始める場合、かつてはInvite Codeを自分で見つけて登録するステップが必要でしたが、現在は登録不要になったようです。
:::

### GitHub
ハッカー、侵入テスター、セキュリティ研究者のための素晴らしいリストのコレクションです。

https://github.com/Hack-with-Github/Awesome-Hacking

### YouTube
YouTubeを利用することで無料で学べます。

John Hammond氏の動画は楽しく学べるのでお勧めです。
@ippsecの動画はHack The Boxのwalkthroughについて学べます。

https://www.youtube.com/@_JohnHammond

https://www.youtube.com/@HackTheBox

https://www.youtube.com/@ippsec

### Udemy
Udemyでもサイバーセキュリティに関する様々なコンテンツが存在します。

Udemyの概要やセキュリティに関するおすすめの講座について[「これから新人エンジニアになるあなたへ　本質的な勉強法」](https://qiita.com/Brutus/items/34cf3c74f3351ad891e0)に記載しています。

### Certifications
ホワイトハッカーの国際資格として、Certified Ethical Hacker (CEH)が認知されています。

CEHについては以前書いた[「Certified Ethical Hacker (CEH)　ホワイトハッカーとは」](https://qiita.com/Brutus/items/0157d153da4d6821a102)をご参照ください。

## Kali Linux
セキュリティを学ぶ場合、Kali Linuxは必須です。

https://www.kali.org/

仮想マシンでもKali Linuxを動かすことはできますが、不自由なくパフォーマンスを発揮するためには自作PCなどで動かすのもお勧めです。

以前書いた以下の記事では、自作PCにKali Linuxを導入及び構築する方法について記載しています。

- [自作PCの組み立て方　ベアメタルで構築するKali Linux【PC組み立て編】](https://qiita.com/Brutus/items/4d6da6a989f2a64ec9a2)
- [自作PCの組み立て方　ベアメタルで構築するKali Linux【構築編】](https://qiita.com/Brutus/items/a35654b7644fb358b9cd)

## News
セキュリティ関連の情報源はたくさんありますが、Hackerが名前となっているニュースサイトを以下に記載します。

https://news.ycombinator.com/

https://thehackernews.com/

# おわりに
以下はAbraham Lincolnの有名な名言です。

>"Give me six hours to chop down a tree and I will spend the first four sharpening the axe."

セキュリティは学ぶことが多いですが、分からない時があっても、斧を研いでいる時間だと考えれば、その時間では苦ではないと思います。
PHPの正規表現のuフラグっていつ使うの？

PHPの`preg_*`系関数で使う正規表現は、区切り文字の後ろにいろいろなフラグを付けることができます。
その中で私が用途をすぐ理解できなかった`u`フラグについて書きます。

## tl;dr
- `u`フラグなしだと、マルチバイト文字のマッチが思った通りにできない可能性がある
- `u`フラグによって`\d`や`\w`の挙動が変わる

注：以降の記述では、扱う文字列はすべてUTF-8であることを前提とします。

## preg正規表現の`u`フラグ
なにはともあれ公式マニュアルを確認します。

> u (PCRE_UTF8)
この修正子は、Perl 非互換な PCRE の機能を有効にします。パターンと対象文字列は、 UTF-8 として処理されます。 無効な対象文字列を preg_* 関数に渡しても、何もマッチしません。 無効なパターンを渡すと、E_WARNING レベルのエラーが発生します。 5オクテットおよび6オクテットの UTF-8 シーケンスは無効とみなされます。

https://www.php.net/manual/ja/reference.pcre.pattern.modifiers.php

👨「つまりマルチバイト文字を含む正規表現には`u`をつけなきゃいけないんだな」
👨「`u`フラグ完全に理解した」

## uフラグがなくても動く？？
では実際に動かしてみます。

```php
<?php

function test(string $regexp, string $subject)
{
    preg_match($regexp, $subject, $match);
    var_dump($match[0]);
}

test('/^あ/', 'あいう'); // uなし、マッチしない？
test('/^あ/u', 'あいう'); // uあり、マッチするはず
```

実行結果
```
string(3) "あ"
string(3) "あ"
```

👨「？？？」
👨「`u`フラグなんもわからん」

## 正しく動かないパターン
`u`フラグはあってもなくても一緒？と思うのはまだ早いです。

```php
test('/^[あい]/', 'あいう');
test('/^[あい]/u', 'あいう');
```

実行結果
```
string(1) ""
string(3) "あ"
```

### 解説
PHPの文字列というのは、実際には文字列というよりバイト列です。
なので、バイナリファイルも`file_get_contents`でそのまま文字列（バイト列）として読み込むことができます。

`"あ"`という文字列は、PHPインタプリタでは`"\xE3\x81\x82"`というバイト列として認識します。
`/^[あい]/`という正規表現は実際には`/^[\xE3\x81\x82\xE3\x81\x84]/`、つまり先頭にある`\xE3`,`\x81`,`\x82`,`\x84`いずれかのバイトにマッチします。
実行結果の`string(1) ""`の正体は、文字列`"あいう"`の先頭1バイトなのです。

ということで、こんなコードは意図しない動きになります。

```php
$input = 'い';
if (preg_match('/^[あ]/', $input)) {
  echo "マッチしました！";
} else {
  echo "マッチ失敗……";
}
```

実行結果
```
マッチしました！
```

文字クラスだけでなく、繰り返しの`+`,`*`なども同じ理由で問題になります。
つまり`/あ+/`が「あ」の繰り返しではなく、末尾のバイトの繰り返しになってしまいます。
また、`.`は`u`なしだと1バイトにマッチしてしまいます。

## `u`フラグの注意点（2023/07/23 追記）
（@tadsan に[指摘いただいた内容](#comment-97e96d63c2a2641d9516)を追記します）

じゃあ常に`u`フラグをつければいいか、というとそうとも限りません。

`\d`が全角数字にもマッチするようになってしまいます。
https://3v4l.org/vBbh0#v8.2.7

同様に、`\w`も全角数字・全角アルファベットにマッチするようになります。

これを避けるためには、`[0-9]`のような指定を行う必要があります。

## まとめ
- `u`フラグがないと、文字単位ではなくバイト単位で処理される
- ただし、場合によっては`u`があってもなくても同じ挙動をするように見えることもある
- `\d`など一部の正規表現の挙動が変わってしまう
- ~~マルチバイト文字を扱うなら常に`u`を付ける、と思っておけば良さそう~~
WindowsでBluetoothイヤホンの音量を最小にしても大きすぎる場合の対処法

# 環境
・Windows 11
・ELECOM LBT-HPC14 Series

# 状況
Bluetoothイヤホンを接続して、Windowsの音量設定を最小設定である1にしても、出力される音量が大きすぎる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1278153/9a082b18-8a66-1daf-f238-c3b566bed371.png)


# 解決法
1. Windowsのレジストリエディタを開き、以下の場所にアクセスする。
`HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Bluetooth\Audio\AVRCP\CT`

2. 「DisableAbsoluteVolume」をクリックして値を1に変更する。これを行うことで絶対音量が無効になり、パソコン側とイヤホン側で独立して音量を変更できるようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1278153/e98ce97c-b8a2-840c-140a-d8f193f1e746.png)
3. 設定を反映するためにWindowsを再起動。


# 最後に
説明不足な点がございましたら、コメントよろしくお願いします、
rails モデル作成まとめ

### rails モデルについて

rails g model モデル名の後に下記のように記述すると作成されるマイグレーションファイルにカラムを追加するコードが自動で書かれた状態でマイグレーションファイルが作成される。

```
$ rails g model モデル名 カラム名:カラムの型

# 複数のカラムも追加が可能
$ rails g model モデル名 カラム名:カラムの型 カラム名:カラムの型
```
例

```
$ rails g model Article text:text name:string 
```

- このようにターミナル上に作成すると、マイグレイーションファイルが作成される。また、作成後は`rails db:migrate `を忘れずに行う。

```
rails db:migrate
```
<font color= "#FF0000">※カラムの型を書かずにカラム名だけで指定すると全てstring型になる。</font>

- マイグレーションファイルがこんな感じで作成される。
```ruby
class CreateArticles < ActiveRecord::Migration[5.2]
  def change
    create_table :articles do |t|
      t.text :text
      t.string :name

      t.timestamps
    end
  end
end
```

### モデルの命令規則


| 種類	 | 名前	| 例 |
| :--- | :---: | ---: |
| モデル名 | 大文字から始まる単数形|　Tweet |
| コントローラー名| 小文字から始まる複数形　| tweets |
| テーブル名| 小文字から始まる複数形　| tweets |

### 作成したモデルを消去する方法

```
$ rails d model モデル
```

### 作成一覧

[![Image from Gyazo](https://i.gyazo.com/eb0dffd1eda8dd60b5cce984a96edb76.png)](https://gyazo.com/eb0dffd1eda8dd60b5cce984a96edb76)


### 指定できる型の一覧

- string : 文字列
- text : 長い文字列
- integer : 整数
- float : 浮動小数
- decimal : 精度の高い小数
- datetime : 日時
- timestamp : タイムスタンプ
- time : 時間
- date : 日付
- binary : バイナリデータ
- boolean : Boolean
gitに極力改行コードを変換させないための設定(最終版)

# Windows

```
git config --global core.autocrlf false
git config --global core.eol lf
```

# Mac/Linux

何もしなくて良い

# 解説

gitの改行コード自動変換は以下の2つです。

- チェックアウト時：LF → CRLFに変換
- コミット時（正確にはgit add時）：CRLF → LFに変換

:::note info
リポジトリ内のコードをLFに統一するための補助機能です。そのため、逆方向への変換、すなわちチェックアウト時にCRLF → LFや、コミット時にLF → CRLFの変換機能はありません。そして、取り出した時にLFだと困る、またCRLFを新たに作ってしまいがちなWindowsへの対策として自動変換があります。
:::

リポジトリに`.gitattributes`が存在する場合、まずその設定が捜査されて、指定のされ方によってはこの段階で変換するかどうかが確定します。不特定多数の人がコミットするリポジトリで、絶対にCRLFを紛れ込ませたく無い場合は、`.gitattributes`でガチガチに設定します。

確定しない場合に初めて、`core.autocrlf`および`core.eol`の設定が参照されます。このとき`core.autocrlf`を`false`、`core.eol`を`lf`にしておくと変換されません。Mac/Linuxはデフォルトでこの設定と同等の動作になります。

# 補足

Windowsでgit add時に以下の警告が出るのは、`core.eol`を`lf`に設定できていないためです。

```
In the working copy of 'xx', LF will be replaced by CRLF the next time Git touches it.
```

これは次回チェックアウト時にLFがCRLFに変換されるという警告です。`.gitattributes`に`* text=auto`が設定されていると発生することがあります。例えば、Laravelのプロジェクトはデフォルトでこの設定がなされています。

# 参考

詳細を知りたい方は、こちらの解説が詳しいです。
http://ogawa.s18.xrea.com/tdiary/20200828p01.html
Rails 7のimportmap-railsとは何なのか？

# はじめに

Rails 7で`rails new app_name`をすると、`Gemfile`に`importmap-rails`が入っています。`importmap-rails`とは何なのか？

この記事では、[importmap-rails](https://github.com/rails/importmap-rails)とは何かを説明し、それを使うことによる変化を書きます。

# importmap-rails

importmap-railsは、[import maps](https://github.com/WICG/import-maps)という仕組みをRailsで使いやすくするgemです。

## import maps
import mapsとは、JavaScriptモジュールの実体とその論理名のマッピングです。例えば、以下のようにしてマッピングします。
```html
<script type="importmap">
{
  "imports": {
    "react": "https://ga.jspm.io/npm:react@17.0.2/index.js",
  }
}
</script>
```
"react"が論理名で、URLの方がJavaScriptモジュールの実体です。

このようにマッピングすれば、他のファイルからこのJavaScriptモジュールを論理名を使ってインポートできます。
```js
import React from "react" 
```

## importmap-railsを使えば楽
`importmap-rails`を使えば、上記のようなscriptタグをわざわざ書く必要がなくなります。まず、`config/importmap.rb`に以下のように書きます。
```rb:config/importmap.rb
pin "react", to: "https://ga.jspm.io/npm:react@17.0.2/index.js"
```
そして、`application.html.erb`上の`<head>`タグ内に、`<%= javascript_importmap_tags %>`を書くだけです。
```erb:app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    ...
    <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
    <%= javascript_importmap_tags %>
  </head>
  <body>
    <%= yield %>
  </body>
</html>
```
これだけで、Rails上のJavaScriptファイルで、`react`をインポートできます。

# importmap-railsを使うことによる変化([参照](https://world.hey.com/dhh/modern-web-apps-without-javascript-bundling-or-transpiling-a20f2755))

`importmap-rails`を使うことによる変化に以下があります。
- 複数のJavaScriptファイルを１つのファイルにまとめる必要がなくなる(bundling不要)
- 1モジュール変更したら、そのモジュールのキャッシュだけ期限切れにできる

1つ目に関しては、ブラウザの`import`機能が依存しているモジュールをよしなに取得してくれるので、JavaScriptのbundlingが不要になります。

２つ目もbundlingが不要になったことによる効果です。変更があった１モジュールだけブラウザに送信すればいいので、アセットの送信量が削減されます。

# まとめ

`importmap-rails`とは何か、それを使うことによる変化について書きました。

`importmap-rails`と似たようなものがRails 7以前にはなく、前々から興味があったので、調べて記事にしてみました。調べていくと、`importmap-rails`を使えばJavaScriptのbundlingをしなくて済むという発見がありました。やらなくていいことが増えるというのはいいことです。

今後は、`importmap-rails`を使う構成を実際に試して、ノウハウを蓄積していきます。
WordPressで発生した「一時フォルダーが見つかりません」に対する解決策とそれまで試した手順

## 問題発生の背景
[WebArena SuiteX V2](https://web.arena.ne.jp/suitex/?argument=vUrp7v4z&dmai=g_10000185&gad=1&gclid=Cj0KCQjw2eilBhCCARIsAG0Pf8tuiW5YFuSHBPdpuorSOSmEj9VtwPjJA1-nv9jz3zldpHtvcbCyKfYaArBCEALw_wcB)のサービスで、レンタルサーバーでホームページを作成しようと奮起していた。
しかし、画像のアップロードがうまくいかない。
「一時フォルダーが見つかりません」というエラーを吐いていた。
アップロード制限となるメモリーの上限は超えていない。

このエラーに対して色々と調べて解決にまで至ったので、まとめる。

## 「一時フォルダーが見つかりません」の対処
解決までに試した行動は以下の４つである。
どれも問題解決するサイトに記載されていたものである。
もし同様のエラーが起きていたときには、このいずれかの手段で解決できるかもしれない。

* 再ログイン
* サーバーの容量を確認
* wp-config.phpの設定見直し
* php.iniの追加編集

まずは、基本中の基本ログインし直したらうまくいく。
だが、これでは解決しなかった。

二つ目のサーバーの容量を確認。
レンタルサーバーを契約しているが、容量300GBに対して、使用容量70MB。
どう考えても、これが原因ではない。

https://fumitakablog.com/missing-a-temprary-folder/

三つ目の方法。
wp-config.phpファイルに下記を追記する。
```php:wp-config.php
define('WP_TEMP_DIR', dirname(__FILE__) . '/wp-content/temp/');
```
wp-contentフォルダ直下にtempフォルダを作成する。
だが、これで解決には至らなかった。
参考にした英語サイトを以下に示す。

https://rankmath.com/blog/fix-missing-a-temporary-folder-error/

そして最後。
php.iniファイルに下記を追記。
```ini:php.ini
upload_tmp_dir = /tmp
```
これでうまくいった。
参考サイトを以下に示す。

https://kurafuto.org/post-61/

-----
## 追記

上記の作業で問題解決したところ以外の変更した所を元に戻すと、プラグインがインストールされないなどの問題が発生。
tempフォルダを削除することが要因となるため、削除しないようにする。（同手順で記入したコードも変更しないこと）

以下には、それ以降でやる必要あることを記入する。
* 仮HPの公開用URLを設定する（www.example.comみたいに）
* DNSサーバーにTXTレコーダを設定できるようにする（Googleインデックスに登録される）
    → Google Search ConsoleでURLをインデックスするためには、DNSサーバーを外部から借りるかDNSアウトソーシングが必要のようだ。
* SSLを取得して、httpsで表示されるようにする

## 参考記事
　* ~~https://web.arena.ne.jp/suitex/spec/index.html#fdomindns~~
    　* ~~Webサービスの標準搭載を確認。DNS設定が標準機能内であるのか、そうでなければ追加料金でサービスを利用しなければならない。~~
    　* WebArena SuiteX V2は標準搭載機能ではDNS設定が行えないため、ブラウザからサイトが検索することはない。その際、月額500円ほどのDNSアウトソーシングを用いることでできるらしいが、ちょっと高い。GMOのサイトなら月額110円程度で他社ドメインでもDNS設定が行えるらしい。

https://www.onamae.com/option/dns/?psafe_param=1&banner_id=1104_comnetwork_1&waad=kmaqQHPQ&network=google_x&placement=&keyword=&device=&gad=1&gclid=CjwKCAjwlJimBhAsEiwA1hrp5iVDIVp3t4QOBcYBJYdPACyXsKQF5-64hrMjEcq2-9cnO3k0awSkQBoCt0UQAvD_BwE
    
* WordPressでGoogle Search Consoleに登録する方法

https://www.conoha.jp/lets-wp/wp-search-console/#section05-05
Kaggle Dockerからmeta Llama2を試す

## 0.Intro
僕は何かしら機械学習関係の作業をするときは基本的に全部揃っているkaggle Dockerに入ってから適宜必要なものをインストールして行うようにしています。
kaggleDockerをベースに、その時の目的の作業に向かってバーション間の齟齬を埋めていく感じです。
僕が今現在使用しているkaggle Dockerのバージョンはv135です。
今回はnpaka先生のサンプルコードを動かすところを目標に。
https://note.com/npaka/n/n79eebc29366d
※モデル名は｢*meta-llama/Llama-2-7b-chat-hf*｣に変更してます。
結果動きましたが、色々ありました。

## 1.必要モジュール
transformersを使うに昔はさほど苦労した覚えはないのですが進歩が著しいからか厄介になりましたね。今回は

```
pip install -I transformers --no-cache-dir --force-reinstall
pip install -U accelerate
```

が必要でした。こちらでtransformersのImportが可能になりました。
その後実行時にエラーが出ましたが、どうやらurllibのバージョンがイケてないらしく

```
pip uninstall urllib3
pip install 'urllib3<2'
```
でいけました。

## 2.HugginFacePrivateリポジトリから取得
https://huggingface.co/meta-llama
はプライベートリポジトリなのでアクセストークンが必要なんですね。
ここがハマりました。

from_pretrained等の時に引数として**use_auth_token***を設定する必要があります。
方法は
1.use_auth_token=XXXX とアクセストークン直書きする(こちらは動作未確認)

2.use_auth_token=Trueとし、
以下を実行
```
huggingface-cli login
```
IDとアクセストークンを入力
して認証をキャッシュするか、のどちらかです。

ただどちらにしても
__メールでアクセストークンでのアクセスが来ていることの確認が来るのでそちらで許可しないとプログラムからはプライベートリポジトリにアクセス出来ません。__

## 3.その他
冒頭にv135のkaggle Dockerを使用していると書きました。
こちらググったところ他に同様の方いなかったのですが、tensorflowを読み込むと

```
UserWarning: unable to load libtensorflow_io_plugins.so: unable to open file: libtensorflow_io_plugins.so,
```
となります。
対応方法は

```
pip3 install --force-reinstall tensorflow-io
```
です。
何度もDocker作成しても変わらなかったのでイメージの方の問題かとは思うのですが。
RailsでECサイト作成の練習をするなり。その1

誤った箇所やアドバイスを優しく教えていただけるとありがたいです。また、業務では行政系やっていたので細かいところは勘弁してください。
(※Rails7系は、初触りなので他の情報があったらそっち参考にしてください！)

# 大まかな設計
## 画面
- トップページ
- 新規登録ページ
- ログインページ
- マスタページ(出品者画面)
- 商品一覧ページ
- 商品詳細ページ
## 機能 
- 新規登録
- ログイン
- メール認証
- 商品登録
- 購入手続き

## データベース
- ユーザーの情報
- 商品情報
(細かいところは下で...)

ここらで終了。他は、新規機能追加みたいな感じで進めていきます！

# 環境
- Ruby 3.0.0
- Rails 7.0.6
- PostgreSQL 14.8
(自分はM1のMacBook使ってます。コマンドがうまく動かない時は、自分の環境に合わせたコマンドを叩いてください！)
Windowsの民は、WSLをおすすめします！Windows上でLinux使えます！(自分はUbuntu使っていました。)

# Railsの最初のアプリケーションを作成
```
rails new myapp --database=postgresql
cd myapp
bundle install
rails db:create
```
PostgreSQLが起動していない場合、
(BrewでPostgreSQLを構築した場合は↓)
```
brew services start postgresql
rails db:create
```
## 起動確認
```
rails s
```
[localhost:3000](http://localhost:3000)
上にアクセスするか``localhost:3000``を開いてください。(ポート番号を変更している場合は、そのポート番号に変更してください。)
下の画面が出てきたら起動できています！
![rails起動！rails日の丸確認やったね！](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1788322/a2b5ccbe-ab7d-2672-1764-64e9ec362ccd.png)
(余談ですが、``localhost``は、``127.0.0.1``です。簡単にいうと、自分自身を指すIPアドレスなのでネット上のIPアドレスとは別物です！)

## エラーが発生して赤い画面が出る場合
#### databeseやmigrateなどの文字が見える場合
データベース関連のエラー
- PostgreSQLが起動できていない。
=> brewで環境構築している場合、``brew services restart postgresql@14``のコマンドを叩いてみて、``Successfully``の文字が見えたら、``rails db:create``を叩いた後にrailsの起動確認をしてください。
- config/database.ymlでPostgreSQLを使う設定ができていない。(アプリケーション作成時に``rails new myapp --database=postgresql``が正確にで生きている場合は、この可能性はほぼなし。)
=> config/database.ymlの``adapter: ``を探して、``adapter: postgresql``に変更する。

# コントローラーとモデル作成する
## コントローラー編
``` 
rails g controller products
rails g controller users
```
## モデル編
```
rails g model user
rails g model product
```
``db/migrate``と``app/views``と``app/controllers``の配下にファイル2個作成されていたら成功です。

# ルーティング設定
表示したいファイルをルーティング設定で一番最初に表示されるようにしましょう。
## 表示できているか確認するためにビューを変更する
``app/views/products/index.html.erb``を最初に表示させるために、routes.rbを変更します。
app/views/products/index.html.erbに下を追記する。
```
このページはproducts#indexです。
```
config/routes.rbに下を追記する。このファイルでパスとかを設定します。
```
root "products#index"
```
## 表示されているか確認
``rails s``して、localhost:3000で確認！(起動しっぱなしの人はCtrl+cで停止できます。)
むむむ。
![マイグレーションエラーが発生](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1788322/1c9b541f-24a7-8d5a-69a8-2cab39c5a450.png)
MigrationErrorは、データベース系の問題です！
解決は簡単で、マイグレートするだけ！(自分のポンコツミスです。)
```
rails db:migrate
```
railsを停止して、上のコマンドを叩いて、もう一度起動して確認してみましょう！
![ルーティング確認完了](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1788322/be492454-e313-9694-4d26-80b607e71808.png)
成功ですね！
# 終わりに
次回は、マイグレーションとページの移動までしていきます。
Githubも更新していく予定です。[こちらから確認できます！](https://github.com/takumi000000/rails_ec_shop)
2nd commitというコメントでプッシュしてます。
MySQL/AuroraにDeep Diveするためのリンク集

MySQL 8.0 Reference Manual 
https://dev.mysql.com/doc/refman/8.0/en/

High Performance MySQL
https://www.amazon.com/High-Performance-MySQL-Strategies-Operating-dp-1492080519/dp/1492080519/

Efficient MySQL Performance
https://www.amazon.com/Efficient-MySQL-Performance-Practices-Techniques/dp/1098105095/

MySQL Documents by Rick James
https://mysql.rjweb.org/

Jermy Cole on InnoDB
https://blog.jcole.us/innodb/

Aurora User Guide
https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_AuroraOverview.html

Planning I/O in Amazon Aurora
https://aws.amazon.com/jp/blogs/database/planning-i-o-in-amazon-aurora/

Hyperscaling Aurora MySQL-Compatible to handle sudden traffic growth
https://docs.aws.amazon.com/prescriptive-guidance/latest/hyperscale-aurora-mysql/introduction.html

Amazon Aurora: Design considerations for high throughput cloud-native relational databases
https://www.amazon.science/publications/amazon-aurora-design-considerations-for-high-throughput-cloud-native-relational-databases

Amazon Aurora: On avoiding distributed consensus for I/Os, commits, and membership changes
https://www.amazon.science/publications/amazon-aurora-on-avoiding-distributed-consensus-for-i-os-commits-and-membership-changes

AWS re:Invent 2018: Deep Dive on Amazon Aurora with MySQL Compatibility (DAT304-R1)
https://m.youtube.com/watch?v=U42mC_iKSBg

AWS re:Invent 2019: [REPEAT 1] Amazon Aurora storage demystified: How it all works (DAT309-R1)
https://www.youtube.com/watch?v=DrtwAOND1Pc

AWS re:Invent 2022 - Deep dive into Amazon Aurora and its innovations (DAT326)
https://www.youtube.com/watch?v=pzZydB78Eyc
スマート地図道場の概念

![DP-15584-008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102082/77a80ffd-ba01-847f-56e6-65549994822e.jpeg)

# 日本語版
スマート地図道場（Smart Maps Dojo）は、ウェブ地図における地理空間情報技術のオープンな普及を目指すコンセプトです。それは、理念、実演、説明のバランスを重視し、新たな技術を試し、未来の地理空間運用を可能にし、究極的にはウェブ地図をオープンに保つ実践共同体の形成を促進します。

### 理念
スマート地図道場は、ウェブ地図における地理空間技術のオープンな発展を見据えています。共同体の成長を意識したうえで、従来の枠に囚われず、革新的なアイデアや手法を追求することを技術者に奨励します。

### 実演
スマート地図道場は、具体的なプロジェクトや例を通じて地理空間情報技術の実演を行います。これにより、共同体は具体的な成果を共有し、お互いから学び合い、更なる発展を促進します。

### 説明
スマート地図道場の技術者は、地理空間情報技術を明確でわかりやすく情熱的に説明することを目指します。理論や手法を共有することで、他の参加者が共同体に参加し、共有されたビジョンに参画しやすくなることを目指します。

### 共同体の形成
スマート地図道場の目的は、共通の目標を持った統合された共同体の形成です。技術者たちは情報を交換し、相互に関わり合い、共有された経験やアイデアを通じて地理空間技術の進化を促進します。

スマート地図道場は、地理空間技術の愛好者が協力し、お互いから学び合い、より良い未来を共に築くことを志しています。

# 英語版
Smart Maps Dojo is a concept that aims to promote open dissemination of geospatial information technology for web maps. It seeks to strike a balance between philosophy, demonstration, and explanation, fostering the formation of a community of practice that test new technologies for future geospatial operations and ultimately keep web maps open.

### Philosophy
Smart Maps Dojo envisions an open approach to advancing geospatial technology for web maps. It encourages practitioners to break free from conventional boundaries and explore innovative ideas and methods, all with the collective growth of the community in mind.

### Demonstration
Smart Maps Dojo involves concrete demonstrations of geospatial information technology through practical projects and examples. These demonstrations allow the community to share tangible results, learn from each other, and inspire further development.

### Explanation
Practitioners of Smart Maps Dojo strive to provide clear, accessible, and passionate explanations of geospatial information technology. By sharing the underlying theories and methodologies, they aim to make it easier for others to join the community and participate in the shared vision.

## Formation of the Community
Smart Maps Dojo's purpose is to create a united community with a common goal. Practitioners exchange information, interact, and stimulate each other, facilitating the evolution of geospatial technology through shared experiences and ideas.

Smart Maps Dojo aspires to empower geospatial technology enthusiasts to collaborate, learn from one another, and collectively shape a better future.

### About the image
https://www.metmuseum.org/art/collection/search/44696
Databricksアシスタントを試してオッサンびっくり

こちらにあるように、新機能が公開されたので早速試してみます。

https://qiita.com/taka_yayoi/items/30357095822cd0c0ecb1

https://qiita.com/taka_yayoi/items/edf92ee3b738751b819b

:::note
**注意**
本書執筆時点では、日本リージョンではまだDatabricksアシスタントを利用できません。もうしばらくお待ちください。
:::

Databricksアシスタントを有効化すると、ノートブックの左側のメニューに学帽マークが表示されます。
![Screenshot 2023-07-21 at 21.29.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/eff1b8e9-d33b-88cd-b696-daee8746fd95.png)

# はじめてのDatabricksアシスタント

上のようにコードを入力しセルを選択した状態で、以下のようなプロンプトを入力します。

> generate pandas code to convert the pyspark dataframe to a pandas dataframe and select the 10 most expensive trips from df based on the fare_amount column

これを日本語に訳すと、

> pysparkデータフレームをpandasデータフレームに変換し、fare_amountカラムに基づいてdfから最も高価な移動のトップ10を選択するpandasコードを生成してください

ということです。アシスタントに入力します。
![Screenshot 2023-07-21 at 21.30.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/51c892bd-6a63-dc4b-83f2-c9fbf1a1ffdf.png)

すると、コードを提示してくれます。長生きするものです。
![Screenshot 2023-07-21 at 21.30.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/14215843-c510-5d19-fcaa-f1f06948fb75.png)

これを新しいセルに挿入して実行します。
![Screenshot 2023-07-21 at 21.31.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1a34bb58-d8fd-9822-4b8e-027c47ec968f.png)

結果を確認すると、ちゃんと動いています。
![Screenshot 2023-07-21 at 21.32.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4a3425f3-8c7b-a687-4bea-c0f852ccc8f9.png)

以下のようにファイルを参照する例でも。

![Screenshot 2023-07-21 at 21.33.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c9bd50c5-d1bf-983c-560c-0920658143f3.png)

**コード**

```py
display(dbutils.fs.ls("dbfs:/databricks-datasets/bikeSharing/data-001/"))
```

プロンプト: bikeSharingデータセットのday.csvを読み込むコードを生成してください。

```
Generate code to read the day.csv file in the bikeSharing dataset
```

これもちゃんと動く訳です。何だこれ。
![Screenshot 2023-07-21 at 21.33.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/bd703741-c6ac-a066-79a2-2e93cd4d5d28.png)

# 日本語は？

じゃあ、日本語はどうだという話です。

```
pysparkデータフレームをpandasデータフレームに変換し、fare_amountカラムに基づいてdfから最も高価な移動のトップ10を選択するpandasコードを生成してください
```

![Screenshot 2023-07-21 at 21.52.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/77c9b69d-bc12-0315-2f55-35267f282311.png)

これも動いてしまう。背後ではOpenAIが動いているので言語の壁も何のそのです。
![Screenshot 2023-07-21 at 21.54.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6001da22-0b1b-bfbf-d74a-85abcc3d899e.png)

本当にコーディングが捗るなーというのが正直な感想です。自然言語とプログラミング言語でロジックを織りなすような感覚。もっと色々活用してみます。

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
AWSに入門する前に知っておきたいネットワーク基礎知識

# はじめに

急遽 AWS でインフラを構築しないといけない機会が訪れ、AWSに再入門しました。僕のAWSの経験は初心者向けハンズオンを何個か試した程度だったのでとても浅く、ネットワークの知識も忘れかけていたので、この機会に取り急ぎネットワーク基礎知識を復習から始めました。

その後どうにかAWSでインフラを構築できたので、これからAWSに入門しようとしている方の役に立てばと思い、記事にまとめました。

:::note warn

本記事には AWS に入門する際に必要な最低限のことしか書いてありません。可能ならネットワークについて体系的に勉強してから AWS に入門するのがオススメです。また、僕は AWS の経験も浅いので、場合によってはこの記事に書いていてある知識だけでは足りない可能性もあります。

:::

# ネットワーク基礎知識

ネットワークとは、簡単に言うと複数のコンピュータを接続する技術です。複数のコンピュータが接続できるようにするためにルールが定められており、それぞれのルールは **プロトコル** と呼ばれ、たくさんのプロトコルによってネットワークが成立しています。有名なものだと `HTTP(Hypertext Transfer Protocol)` や `IP(Internet Protocol)` などがあります。どんなプロトコルがあるのか気になる方は、`OSI参照モデル` や `TCP/IP` で検索しましょう。

さて、本記事では AWS に入門するための最小限の知識に絞っています。具体的には `IPアドレス` とそれに関連する `サブネット` についてです。

# IPアドレス

IPアドレス は通信の相手先を識別するための番号です。IPアドレスといっても様々な種類があります。IPv4 と IPv6という分け方や、グローバルIPアドレス と プライベートIPアドレスといった分け方があります。それぞれについて簡単に説明します。

## IPv4 と IPv6

初めに IPv4 (Internet Protocol version 4) ですが、これは 32bit の値です。種類は約43億個なのですが、それだけでは足りなさそうということで 128bit の IPv6 (Internet Protocol version 6) が生まれました。

IPv4 は 32bit を 4分割して 8bit ずつに分けて表記します。(例: `192.168.1.1`)

## グローバルIPアドレス と プライベートIPアドレス（ローカルIPアドレス）

ネットワークには主に *グローバルエリアネットワーク* (インターネット) と **ローカルエリアネットワーク** (LAN) の2種類です。グローバルエリアネットワークで試使用される IP アドレスが **グローバルIPアドレス**、ローカルエリアネットワークで使用される IP アドレスがプライベートIPアドレス（ローカルIPアドレス）となります。

インターネットで使用されるグローバルIPアドレスはICANNという組織によって管理されており、さらにそこから各地域・各国の組織がそれぞれの地域のIPアドレスを管理しています。日本ではJPNICという組織が管理しており、最終的にISP(インターネットサービスプロバイダ)から各家庭・会社にIPアドレスが分配されます。

プライベートIPアドレス（ローカルIPアドレス）は各家庭・会社内のLAN内で使用される IP アドレスです。LAN内の機器がインターネットへの接続を行うためには、プライベートIPアドレスをグローバルIPアドレスに変換する必要があります。変換方法として、NAT や NAPT(IPマスカレード) などがあります。

AWS EC2 のインスタンスのアドレスなど、ローカルなのかグローバルなのか、わからないと接続することができないので、これらの違いを知っておく必要があります。

# サブネット

1つのネットワーク内の一部を、部分的なネットワークとして扱うサブネットというものがあります。IPアドレスを「ネットワーク部」と「ホスト部」に分けることで、ネットワーク部が同じものを同じサブネットとして扱うことができます。「ネットワーク部」と「ホスト部」に分ける方法として、クラスフルアドレッシングやCIDRが代表的です。

クラスフルアドレッシングは「クラスA」から「クラスＥ」のように5種類存在し、それぞれの「ネットワーク部」と「ホスト部」をどのように分けるかが決まっています。一方CIDRは「ネットワーク部」と「ホスト部」をどのように分けるかが決まっていないため、追加で **サブネットマスク** というもので、どこまでが「ネットワーク部」なのかを示す必要があります。例として、`192.168.1.1` のネットワーク部が上位24ビットの場合はサブネットマスクは `255.255.255.0` となります。サブネットマスク込みで IPアドレスを表記する方法として CIDR表記というものがあり、上位24ビットがネットワーク部の場合は `192.168.1.1/24` のように書きます。

AWSを使う上で、CIDR表記がいたるところで出てくるので、覚えておく必要があります。

## ドメイン

さいごにドメインについて軽く触れておきます。ここまでIPアドレス関連のことを紹介してきましたが、IPアドレスは数字なのでどのIPアドレスが何を指しているのかわかりにくいです。そこで、それぞれのIPアドレスに紐づけた名前がドメインです。

AWS でもドメインを設定することなどあると思うので、覚えておくとよいでしょう。

# おわりに

ここまで説明した知識があれば、AWSに入門することができると思います。僕はこの辺がうろ覚えだったので、AWSで最初にVPCを作る際や、その中でサブネットをどう作ればいいのか、EC2にアクセスするためにはどうすればいいかなどかなり苦戦しました。ですので、AWS に入門しようとしている人のために、前提知識としてこれらのネットワーク知識が必要であることを伝えたいと思いました。AWSは専門用語や様々なサービスの特徴など慣れるまで大変ですが、使いこなすことでインフラを自由自在に構築することができます。（もちろん Google Cloud や Azure も便利だと思いますが、僕はまだ使ったことがないです...）。クラウド時代の今だからこそ、それらを身に着けるためにも基礎となるネットワークはしっかり勉強しておきたいですね！

また気が向いたら、付け焼刃のネットワーク基礎知識で苦戦しながらAWSでインフラを構築した話を記事にまとめたいと思います！
米国の輸出入額の推移

# はじめに
米国の輸出入額の推移をグラフ化する。
データは、BEA（U.S. Bureau of Economic Analysis、米国商務省経済分析局）の四半期データ（季節調整値）をFRED経由で取得。

# コード
```Python
# ライブラリのインポート
import pandas as pd
import pandas_datareader as pdr
import matplotlib.pyplot as plt
import datetime

# FREDからデータの取得
start_date = '1947-01-01'  # 開始日
end_date = datetime.datetime.now().strftime('%Y-%m-%d')  # 今日の日付を終了日として設定
data = pdr.get_data_fred(['EXPGS', 'IMPGS'], start_date, end_date)  # 輸出'EXPGS'、輸入'IMPGS'のデータを取得

# データのプロット
plt.figure(figsize=(12,6))
plt.plot(data['EXPGS'], label='Exports')
plt.plot(data['IMPGS'], label='Imports')

# タイトル内の期間を動的に更新
start_quarter = pd.Timestamp(start_date).to_period("Q")
end_quarter = pd.Timestamp(data.index[-1]).to_period("Q")
plt.title(f'U.S. Exports and Imports({start_quarter}-{end_quarter})')

plt.xlabel('Year')
plt.ylabel('Billions of Dollars')
plt.legend()
plt.grid(True)
plt.ylim(bottom=0)  # 縦軸の範囲を0からに設定
plt.show()
```

# 出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3305624/758d4512-56e5-e503-6549-6612767f1045.png)

# おわりに
次は、日本のデータで同じことをしたい。
CSS だけでモーションブラー風のエフェクトをつける

## この記事の概要

アニメーションにおいて、モーションブラーという概念があります。
現実世界で動いているものを撮影すると残像が尾を引くので、それを再現した効果です。

同じ速度・動き方でも、モーションブラーをつけた方が素早く動いているような印象を出しやすいです。
通常 CSS アニメーションではモーションブラーが再現できないのですが、やりたくなったのでどうにかそれっぽくしてみました。

備忘録がてら記事にします。

## 完成品

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/a1d95798-1ae9-024a-89f0-251da6b00f28.gif)

動く距離、速度、イージングはすべて同じなのですが、左の方が「ビュンッ」て感じが出ているのではないでしょうか。

## 全体の説明とコード

- 通常の CSS アニメーションを実装する
- アニメーションする方向と逆に `box-shadow` や `drop-shadow` をつけて残像を再現する
    - 動き始めや動き終わりのときにはオフセットをつけない
    - 加速が大きいタイミングでオフセットを大きくする
- 外連味で `blur` もかける
    - 「無しより有りの方がそれらしい気がした」程度の内容

```css
@keyframes motion-blur {
  0% {
    filter: drop-shadow(0 0) blur(0);
    translate: 0 0;
  }
  45% {
    filter: drop-shadow(0 -4px 0 rgb(0 0 0 / 0.8)) blur(1px);
  }
  100% {
    filter: drop-shadow(0 0) blur(0);
    translate: 0 200px;
  }
}

.blur-element {
  animation: 250ms motion-blur infinite ease-in-out;
}
```

:::note warn
`drop-shadow` のオフセット距離やブラー半径は、アニメーションする時間や距離によっても変わります。
計算でどうこうというより、目で見ながらの調整になると思います。
:::

`translate` は移動しているだけなので説明を省略し、`filter` だけに焦点を当てます。

まず、 `0%` の時点ではまだ動いていないのでボケは発生しません。
そのため `drop-shadow(0 0)` つまり 「何も無い」を指定しています。

次に、加速が大きくなるタイミングにあわせてボケた影をつけます。
イージング関数などによっても気持ち良いタイミングが変わると思いますが、ここでは `45%` の時点でボケ幅が最大になるようにしました。

そして `100%` つまり停止時に向けてボケを 0 にします。

本来の CSS アニメーションに 3 行程度コードを足しただけですが、それなりに視覚効果としてフックになった気がします。

## 最後に

今回の手段だと安っぽく見えてしまう条件も結構あると思います。
アニメーション時間が長いとか、複雑な動きをするとか、要素が非常に大きいとか……。

ただ「CSS でもちょっとしたモーションブラーっぽいことならできる」と思って制作に向かうと、変に視野狭窄にならずに済む気がします。
何かのときに役立てば良いなと思ってこの記事は終わりにします。

---

最後まで読んでくださってありがとうございます！
[Twitter](https://twitter.com/xrxoxcxox)でも情報を発信しているので、良かったらフォローお願いします！

[Devトーク](https://jobs.qiita.com/employers/qiita-inc/dev_talks/489)でお話してくださる方も募集中です！
[React×TypeScript]propsでデータを渡す際の型定義について

## はじめに
propsでコンポーネントにデータを渡す際の型定義のテクニックについて書いていきます。

## 型定義について
コードを書いていきます。
``` page.tsx
type text = {
    name: string;
    age: number;
}
  
return (
    <>
      <Practice name={"hukuryo"} age={25}/>
    </>
)
```
まずは、親コンポーネントであるpage.tsxでpropsで送るデータの型を決めます。
そして、子コンポーネントであるPractice.tsxにpropsを渡します。
この時に、nameはstring型に、ageはnumber型に設定してるので、それ以外の型のを渡そうとすると、以下のようにエラーになります。
![スクリーンショット 2023-07-21 20.57.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/3d7fdaad-633e-1955-e8b3-45c76adb5d65.png)


``` /components/Practice.tsx
type practiceText = {
    name: string;
    age: number;
}

export function Practice(props: practiceText) {
    const { name, age } = props;
    return(
        <div className="text-center mt-10">
            <h1 className="mb-10">Practice props</h1>
            <h4 className="font-bold mb-5">名前：{name}</h4>
            <p></p>
            <h4 className="font-bold">年齢：{age}歳</h4>
            <p></p>
        </div>
    )
}
```
データを受け取った子コンポーネント側では、以下のコードで、親コンポーネントと同じように型定義を行います。
```
type practiceText = {
    name: string;
    age: number;
}
```
そして、受け取ったpropsに対して、型を定義します。
```
export function Practice(props: practiceText) 
```
例えば、以下のように違った型を定義すると、親コンポーネントでエラーになります。
![スクリーンショット 2023-07-21 21.08.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/1da4e87a-16ec-89da-b6dc-2b33def2a7bc.png)

## まとめ
このように、TypeSciptを使って、propsで渡すデータに型を定義するのは、安全に値を渡すことができるようにして、バグのリスクを減らしたり、開発効率の向上が期待できるのです。


## 最後に
他にも記事を書いているので、良ければ見ていってください。

[基本設計について](https://qiita.com/hukuryo/items/97797a91d7e2ee0bcabc)
[Vue.jsとNode.jsでチャットアプリを作った](https://qiita.com/hukuryo/items/265c676d17fe21e75242)
[Next.js×TypeScriptでTODOアプリを作成する](https://qiita.com/hukuryo/items/ebeb26823f944f143b11)
RECOROKU を触って感じたサービス価値とは

RECOROKU というた新しいナレッジベース体験を提供すると謳うサービスについて、ドッグフーディングをした気づきを投稿します。

本投稿は、[RECOROKUを使ったナレッジ管理や情報共有のユースケースを投稿しよう！ \- Qiita](https://qiita.com/official-events/f501b76c23086931fb42) というキャンペーンへ向けた記事になります。

# はじめに
私は RECOROKU で Zoom の録画動画と書き起こしスクリプトをアップロードして、書き起こしサービスにあるメモなどの機能を試してみました。

ある程度機能を試した後で、https://recoroku.com/ を見てみます。
![CleanShot 2023-07-21 at 19.00.57@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1624/0a8d8e5a-c467-0116-f493-4ed59587537c.png)

- 会議録画
- 文字起こし
- 映像シーン検索

`すべての発言がナレッジに` とあります。

私は感じたことがあります。キャッチコピーのすべてが、`How` になっていないか？ということです。

# サービスの特徴と機能紹介は正しいか
RECOROKU では、「新しいナレッジベース体験」を提供するという名目で、それぞれ機能、How を掲載しています。私はこの How のメッセージについて注目することになりました。

一般的に機能はプロダクトのコアであり、プロダクトを比較する際の多くは機能比較から入るのが一般的です。

しかし、たしかに How はわかるのですが RECOROKU というプロダクトがどのようなユーザー価値や組織価値を提供するのかがわかりませんでした。

そのため、私の興味は次第に RECOROKU のサービス価値を模索することに移っていったのです。

# 実際に使ってみた感触
Zoom から動画をアップロードして、RECOROKU の機能をいくつか試行錯誤してみたところ、機能の動きはあらかた試すことができました。一方で、せっかくのサービスにある機能の意味や位置づけがあまり刺さってきませんでした。

例えば、動画の書き起こしの精度などはこの手のツールで一定のテーマに感じますが、そもそも Zoom などのビデオチャット機能には書き起こしがついているため、明確に付加価値の判定ができないように感じます。
また、AI 技術の進化は非常にはやいため、精度について語るのはユーザー視点からむずかしく、機能の実力はプロダクトの価値とはまた別の論点のように感じたのです。

# 利用し、キャッチコピーをみて変化した目線
このあたりで、私の興味は、RECOROKU　の機能がどういうユーザー価値をもたらすのか、「新しいナレッジベース体験を提供する」というキャッチコピーが最も刺さるユースケースやマーケットはどこなのか考え出しました。
機能を模索するような試行錯誤をする視点から、マーケティング寄りの目線に変化していきました。

# Who や What を考えよう
RECOROKU って誰のために何のためにあるサービスなのでしょうか。
機能はなんとなくわかります。一方で、最も刺さる人は誰で、どんなケースなのでしょうか。

つまり、私は新しく可能性のあるサービスにおいても、運営はターゲットユーザーやユーザー価値をなるべく明確なメッセージで伝える努力をするのが良いと考えます。

そして、誰のために何を提供するのかを明確にするということは、それはマーケの範疇ではないかということです。
マーケティング目線でサービス価値を考えることは、よりよい視点を与えるのではないかと感じました。

# ユーザーやユースケースのおすすめポイント
ユーザー価値について考えたくなったので、ここからは機能から想像したアイデアを考えていきます。

RECOROKU 動画のスクリプト検索やコメントの共有ができるので、動画の中身の深掘りやディスカッションが可能です。ですので、動画自体の価値を模索することや、動画プロセス自体を改善するイメージが浮かびました。
具体的には、ディスカッションの深掘りや教育プロセスの改善に可能性を感じました。

すぐに考えられるのは、以下のようなジャンルです。

- 教育
- 人材育成
- 営業支援

人材育成やロープレ改善など教育や支援周りの生産性向上に、様々な可能性があるように感じます。
どのターゲットがもっとも可能性があるのか、あるいはプロダクトの思想に近いのかはわかりかねますが、ターゲットにより伝え方や付加価値も変わってくるはずです。

# キャンペーン振り返り
RECOROKU を体験して感じた部分をざっと書いてみました。

最初は機能についてあれこれ調べようと思ったのですが、キャンペーンサイトのメッセージや LP について興味がうつりました。

RECOROKU さんの活躍イメージについては私は主に教育周りの市場をイメージしましたが、動画サービスは多くのマーケットでの活用が期待されますので、「映像の議事録とがとれる」それってどんな人のどんな課題を解決できるの？みたいな部分を模索していくと、今後の展開が面白いように感じました。

以上よろしくお願いいたします。

# 参考文献
- [レコロク｜すべての発言がナレッジに](https://recoroku.com/)
- [ありそうでなかった「映像議事録」体験に感動！ レコロクはオンラインミーティングの「何」を変えてくれたのか？　Qiita社員が使ってみた \- Qiita Zine](https://zine.qiita.com/interview/202306-recoroku/)
チームビルディングを試行錯誤したら最高のチームになった

こんにちは、ベンチャー企業でPjMをしている江端といいます。

日頃はクライアント様とのやりとりや、課題の振り分けから工数見積もり、課題進捗の管理からチーム内で発生する課題（非機能要件や資料の作成）などを主に行っています。

簡単に言えば、開発業務が円滑に行えるように開発以外の業務をやっている人です。
元々は開発者として同プロジェクトに参画したのですが、参画から1年後にPjMになりました。

そんな中で、「心理的安全性の高いチームづくり」をすべく、PjMになった時から試行錯誤してきたのですが、結果として自他共に認める最高のチームになることができましたので、その時に意識したことを書いていきます。

## チームの概要

自分の所属しているチームはWEBアプリの開発を行っているエンジニアチームで、自分以外に3人のエンジニアがいます。
チーム構成としては、業務委託の方が2人、自社の社員が1人いる形になっていて、全員自分よりも年上です。

- PjM（自分） ← 1番年下
- エンジニア（社員）
- エンジニア（業務委託）
- エンジニア（業務委託）

余談になりますが、PjMになった当時は、一番年下の自分が進捗の管理をすることをよく思われないこともあるのではないかと危惧していた時期もありました（全くの杞憂でしたが）。

## 意識したこと

チームの概要を紹介できたところで、続いてチームビルディングとして意識してきたことについてです。
今回紹介する内容以外にも、多くの試行錯誤があり、多くの空振りがありましたが、主に3つのことを紹介します。

1. オフラインでの会話を大切にした
1. 迷わずに頼るようにした
1. 毎週の振り返りを実施した

## オフラインでの会話を大切にした

僕たちのチームは、それぞれ住んでいるところが違ければ、業務委託契約としても出社しなくて良い形になっていますので、基本的にオンラインでのやり取りが多くなっています。
しかし、オンラインでのやり取りは「相手の感情が分かりにくい」だったり「パーソナルな部分が見えない」といったデメリットがありました。

:::note warn
書かずとも分かることかとは思いますが、
オンラインが悪いと言うわけではなく、「**違ったコミュニケーションの属性を持っているよね**」というお話です。
:::

そこで、たまにはプライベートでも話がしたいなと思い、オフラインでご飯を食べながら色々な話をしました。
これがかなり良く、前職の話やプログラミングを始めたばかりの時はMySQL3系だった話など、その人のバックボーンをたくさん知ることができました。

その後はチーム全員でご飯に行ったり、業務委託の方と一緒にオフラインで仕事をしたりと、コミュニケーションのハードルがかなり低くなったと感じています。

もちろん、人によってはオフラインで会うことがNGの場合もあるかと思いますので、チームメンバーのことをよく知ってから提案することを意識しました。

## 迷わずに頼るようにした

このプロジェクトで自分が最も古株だったので、自然とドメイン部分などは頼られる形が多かったのですが、自分よりもエンジニア歴が長いメンバーもいたので、積極的に頼るようにしました。

「メンバーに嫌われてからが勝負」と言われる中で、メンバーの長所を認めて頼る姿勢を見せることはかなり大事だと思います。言われたことだけをやる（元々そうだったわけではないですが）と言う状態から、主体性を持ってプロジェクトに向き合うようになった大きなきっかけでした。

これを通して、メンバーからの提案が増え、チーム内の議論が目に見えて増えました。
今まで曖昧になっていたものを、議論を通してしっかりIssueとして起票して管理するようになり、どのように取り組めば良いのかが明確になりました。

## 毎週の振り返りを実施した

今まであまり振り返りを行ってこなかったのですが、弊社でスクラムマスターをしている先輩（@yum_3）に依頼し、毎週の振り返りを実施するようにしました。
振り返りのツールとしては、バーチャルオフィスのGatherとMiroを使いました。

週次の振り返りを実施するようになったことで感じたメリットとしては以下の通りです。

- コミュニケーションの場になった
- 各メンバーがやっている業務を共有できた
- 相談がしやすい
- 週ごとのネクストアクションが明確になった
- **楽しい！**

この記事内で取り上げている意識しているポイントは、どれもコミュニケーションについてのものが多いのですが、この週次の振り返りが個人的には最も大きな要素だったと思っています。

各メンバーがやっている業務を共有できたことで、他のメンバーがその業務で発生するであろう問題点について考えるきっかけになり、相談 → 解決までがとてもスムーズになりました。

「さっき振り返りで話した〇〇の機能についてですが、前やったことあって〜...」

といった会話が多くされるようになりました。
自分がPjMになった時、メンバー間での会話があまりなかった（僕とメンバーではあったが）ので、とても大きな進歩だと感じています。これは構造上の問題もあるので、今後はそこについても良くしていきたいと考えています。

また、振り返りをもとに来週するネクストアクションについても決めているおり、ただ課題を消化する日々ではなく、先週よりもチームが良くなっていくのを感じられるので、本当の意味で「**最高のチーム**」になりました。

## 終わりに

最高のチームの定義は多くあると思いますが、自分は「明日働くのが楽しみになるチームが最高なんじゃないか」と思っています。コミュニケーションが変わったことで、チームの雰囲気が変わり、議論が増えたことで課題が浮き彫りになってその課題が解決するまでの時間が短くなりました。

弊社の他のエンジニアや上長からも良いチームと言われることが多くなり、自分のチームがとても好きになりました。
明日からもより良いチームになるように、チーム内で議論していきます。

最後まで読んでくださりありがとうございました。
スクラムイベント単位でふりかえってみたら、ふりかえりが活性化した

# 事の始まり
スクラムの重要なイベントであるレトロスペクティブ。私の所属するスクラムチームでは毎回KPTを少しアレンジしたフレームワークで進めていたのですが、大きな課題が発生していました。
それは**一部メンバーから全く課題が出てこないこと**。KPTのPにあたるものを全然出さないメンバーが出てきてしまいました。
もちろん全く課題がないのならいいのですが、正直そんなことはありえないと思っています。課題はあるはずなのに、ふりかえりの場で全く思いつかないという現象が起きているのではと推測しました。
# 原因を考える
ではなぜあるはずの課題が思いつかないのか。現在使っているフレームワークを眺めて考えました。
そこで気づいたのが今使っているフレームワークはざっくりと**何か課題ありますか**と聞いているだけということ。ざっくり質問って答えづらいですよね…
そこでざっくり質問を脱出するためのフレームワークを探すことにしました。
# 採用したフレームワーク
先輩スクラムマスターの意見なども聞きながらフレームワークを探し、たどりついたのが「**スクラムイベントごとに点数をつけてもらう**」というやり方でした。
![スクラムイベントごとのレトロすぺくてぃぶ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491598/ee901b6a-7883-284b-4f7d-82cceb30475f.png)
図のようにスクラムイベントをずらっとならべそれぞれに10点満点で点数をつけてもらうという形式です。
このやり方なら「スプリントプランニングはどうだったかな？」「デイリースクラムに問題はないだろうか？」といったようにそれぞれのイベントにフォーカスして考えることができるため、課題に感じていることを発見しやすいのではと考えました。
# やってみた
早速このフレームワークを試してみました。スクラムイベントだけだと絞りすぎかなと思ったので開発チームで取り入れているペアプログラミングなども採点対象に加えてトライ！
すると**普段のレトロスペクティブでは一つもプロブレムを上げないメンバーの採点が結構厳しめ**。
点数を一通りつけてもらった後に深堀りすると**今まで見えていなかった課題がいくつも浮かび上がってきました**。
個人的にはかなり**手ごたえあり**なレトロスペクティブを行うことができました。
# 最後に
スクラム開発にたずさわって1年以上。何十回もレトロスペクティブに参加していますが、課題を見つけるというのはとても難しいです。ノーテーマで「さぁ、改善したいことを話してみて！」ってすごい無茶ぶりに思えてなりません。課題を見つけることが苦手なチームに対して適度に対象を絞ってあげることで考えやすくするこの手法は有用なのではないかなと思います。
この手法の欠点としては対象を絞るため、それ以外の取り組みに対する課題が浮かび上がりづらいということがあります。毎回このふりかえりをやるとマンネリ化一直線なので最近いまいちだなというときに気分転換程度にやるのがよいように思えました。
【必見】python勉強法！

# はじめに
今回、久々の投稿になります。
内製でやっていることも多くテクニカルな記事でも書こうと思いましたが体調不良や繁忙期が重なり
ズルズルと・・・（時間の使い方悪い）
なので今回はちょっとポエマーチックではありますが、私がこよなく愛しているPythonについてどうやって習得したのかを紹介したいと思います・・！ある意味有料級かもしれないですよ（笑）
今回はへび(python)をtargetに記載していますが、どの言語でも通じるものもあるのでぜひ参考にしてみてください。

## へび使いになるためにはへびを知る前に常識を知る
初心者の方は必ずと言っていいほど、じゃ言語を学ぼうと思ったら、速攻で本屋さんに行って、「××　超入門！！」的な本を絶対立ち読みして、「これめちゃくちゃ分かりやすいな！じゃ買おう！」ってなりますよね。（というか私がそうです）。
そしておうちに帰って、パソコン開いて何をするかとしたら
* まずは読む
* 書いてあるソースコードを模写してコンパイル⇒よし動いた！
と絶対するはずです。
これ、一見いいと思いますが、絶対ぶち当たる壁があると思います。

じゃ、学んだことを自分から作ったり、形にしたいときどうロジックをコードに落とすか

これできない方、いっぱいいると思います（はい僕でした）

そんな時、おすすめしたい本がこれです。

https://amzn.asia/d/0gp1jqA

「基礎の基礎」！！
プログラミングの根源はアルゴリズムだったりします。
でもアルゴリズムを語る書籍って非常に難しいんですよね。
そんなとき、この書籍は非常に身近なものをロジック的に考えていくかを図式で公開されています。
これを読んでから、改めてへび使いの習得学習をしていくとまた違った自分に生まれ変わります。

## 入門書
さて、ロジックとはなんぞやを知れたら、ようやくへび使いになるために入門書で学んでいきます。
これに関しては本屋さんに行って「立ち読みして、なんとなく分かりやすくて、そこまで分厚くない」ものをお勧めします。なんでもいいですが、少なくともオラ〇リーは絶対やめましょう。立ち読みしたら分かります。そしておうちに帰ったら読んだり、ソースコードをまねたりしてみましょう。すべて完璧に理解する必要は絶対にないです。この本ここの部分分かりにくいな飛ばそう。そんなスタンスでいいです。

## 実践
さてへび使いになるために入門書を読んだり、書いてあるコードを模写してみたりとかやってみたと思います。しかし実際に本物のへびを見た(＝コードで何か作ってみる）あなたは確実に何もできないと思います。そう、今まではいわば座学だったのです。何も太刀打ちできないと思います。かと言って、じゃ師匠のへびを容易にお借りするわけ(＝業務レベルのコード開発)にはいきません。なのでここでおもちゃへびを使うか(演習形式)とかになります。
そんなのどーすんのですが、めちゃくちゃおすすめのサービスがあります。

https://prog-8.com/

「プロゲート」というサービスです。このサービスですが、疑似的な環境が用意されているので、この世で一番めんどくさいと言わんばかりの環境構築をせずともへび使いの練習ができるという優れものです。
僕はこれをこよなく使いこなしていました。演習もできますし、また説明資料もあるので、入門書で取りこぼした内容だったり、違う視点で説明された資料を見たりすることでより理解が深まってきました。

## 実践を繰り返す
あとは、自分の実務でひたすら、コードを書いていきました。
このころになるとへびも自分に懐いてくるはずです。

## 大道芸人デビュー後も・・
といっても、懐いてきたへびですが、やはり熟練していくほど色々詰まったり、頼りになる相方も必要になってきます。
今もずっと愛している書籍を紹介します。

https://amzn.asia/d/ewZkSKr

有識者がレシピとして集約された内容が詰まっております。

## おわりに
以上、私がPythonを使いこなせるまでにしたことを記載させてもらいました。
Pythonは無限の可能性があります。ぜひ少しでもお役に立てていただければ幸いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187693/c02bde7c-035e-6f1d-45ea-807a0c20e389.png)
【解説】URLからドメイン名のみを抽出する関数

特定のドメインをブロックするためにURLからドメインのみを抽出したい場面がありました。考えるのは面倒なのでエクセルの関数でいい感じにつくってくれるようにChatGPTにお願いしました。

# URLからドメイン名のみを抽出する関数

```
=IF(ISNUMBER(SEARCH("/", MID(B2, SEARCH("//",B2) + 2, LEN(B2)))), MID(B2, SEARCH("//",B2) + 2, SEARCH("/", B2, SEARCH("//",B2) + 2) - SEARCH("//",B2) - 2), MID(B2, SEARCH("//",B2) + 2, LEN(B2)))
```


## 関数の解説

ChatGPTによる解説です。

まず、この関数はURLが「//」の後に「/」を含むかどうかを判断します。

```
ISNUMBER(SEARCH("/", MID(B2, SEARCH("//",B2) + 2, LEN(B2))))
```


「MID(B2, SEARCH("//",B2) + 2, LEN(B2))」の部分では、「//」の後からURLの最後までを抜き出しています。そしてその結果に対して、「/」があるかどうかを検索（SEARCH）します。存在すればその位置を数値で、存在しなければエラーを返します。その結果が数値（つまり「/」が存在する）かどうかを「ISNUMBER」で確認しています。

### 「/」が存在する場合

「/」が存在する場合（URLにサブディレクトリやファイルパスが存在する場合）は、ドメイン名を「//」の後から最初の「/」までの文字列として抽出します。

```
MID(B2, SEARCH("//",B2) + 2, SEARCH("/", B2, SEARCH("//",B2) + 2) - SEARCH("//",B2) - 2)
```


「//」の後から「/」までの文字列を取得して、それがドメイン名となります。



### 「/」が存在しない場合

一方、「/」が存在しない場合（URLがドメイン名だけの場合）は、ドメイン名を「//」の後からURLの最後までの文字列として抽出します。

```
MID(B2, SEARCH("//",B2) + 2, LEN(B2))
```


「//」の後からURLの最後までの文字列を取得して、それがドメイン名となります。

以上の流れでこの関数は動作します。つまり、「//」の後に「/」があるかどうかで、どの部分をドメイン名として抽出するかが変わります。


# もっと簡単にURLからドメイン名のみを抽出する方法
ラッコツールズでテキストベースで貼り付けてもできました。

https://rakko.tools/tools/62/
Google Analyticsでよく聞くワードたち（用語集と備忘録のために）

## Google Analyticsと日々格闘する著者の備忘録

[コチラの記事](https://qiita.com/Rekt-Order/items/8b0c1c67215d967648ee)で公開中ですが、Googleアナリティクスのレポートを自動化する過程で、「アナリティクスでアクセス数を見る時って…どうすればよかったんだっけ？」と格闘すること数分。

https://qiita.com/Rekt-Order/items/8b0c1c67215d967648ee

「そうそう、エンゲージのあったセッション数だ！」…と答えに辿り着いた経験を踏まえて、一度アナリティクスの用語に関するまとめを残しておきたいと考えるようになりました。

その都度、検索して探すのが非常に手間なので、きちんと覚えるようになるまでは、この「用語解説」と共にネットの荒波を渡っていきたいと思います。


そこで、今回は私が過去に検索した記憶のある言葉を中心に、「アナリティクスの用語集」を作成しました。

※都度、更新していきます。

![kakou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/b262e37c-dc44-aab9-05d5-f7a9b932c50b.png)

毎朝自動で送られてくるレポートにも、「用語解説」のボタンをきちんと仕込んでおきました。

※このボタンをクリックすると、Github Pageに格納したMarkdownファイルをWebページとして閲覧することができます。

![スクリーンショット 2023-07-21 19.48.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/341e2737-27b5-3048-38b9-de354c9611db.png)


###  ユーザー数
****ある期間内にWebサイトを訪れた人の総数****
※ユーザー＝人ではなく、ブラウザ
※同じ人でも、2回アクセスするとユーザー数は「2」
※同じ人でも、スマホとパソコンからアクセスするとユーザー数は「2」
※同じ人の同じパソコンでも、Google ChromeとSafariのブラウザそれぞれからアクセスするとユーザー数は「2」

### 新規ユーザー数
****ある期間内に初めてWebサイトを訪れた人の総数****
※初めて＝過去2年間に訪問履歴がないこと

### セッション数
****Webサイトへのアクセス数****
※セッションには、開始／終了という概念がある
※30分ページを開いたままにすると、セッションは終了する
※日付またぎ／参照元の変更では、セッションは継続する
※Google検索で1回目の訪問をし、30分以内にYahoo!検索で再訪問した場合は、１つのセッションとしてカウント


### エンゲージ
****エンゲージメントの略＝サイトやアプリに対するユーザーの操作を指す****

### エンゲージのあったセッション数
webサイトで何かしらの操作を検知できたセッション数
****「意味のあるアクセス数」と考えればOK！****


### セッション継続時間
****滞在時間****
（セッションの終了時間から開始時間を差し引く）ことにより算出

### 平均セッション継続時間
****滞在時間の平均****
（エンゲージメントのあったセッションの合計滞在時間／セッション数）により算出


### 表示回数（インプレッション数／PV数）
****Webサイト内のページが表示されたのべ数****


### アクティブユーザー数
****ある期間内にWebサイトを訪れた人のユニーク総数****
※期間内であれば同じユーザーが何度訪問しても、アクティブユーザー数は「1」


### イベント
****サイトやアプリにアクセスしたユーザーが取った行動のデータ****

### イベント数
****ユーザーが取った行動のデータの合計数****
※【初めてサイトを訪問した場合】
「first_visit」「session_start」「page_view」が計測される＝イベント数は「3」


### コンバージョン
****サイトやアプリにアクセスしたユーザーが取った「価値のある行動のデータ」****
※何をコンバージョンとして設定するのかは、運営者が決定する
※【例】新規顧客だけを対象としたLPの場合
必要な指標は、「初回訪問者数」「問い合わせ数」「購入者数」とした場合、コンバージョンは「初回訪問者数」「問い合わせ数」「購入者数」を追うことができるイベントと言い換えることができる。（ゴールや中間ゴールなどを設定することが多い）

### コンバージョン数
****ユーザーが取った「価値のある行動のデータ」の合計数****
※つまり、コンバージョン数を上げることが重要

### 直帰率
****そのページだけ見て、サイトを離れてしまったセッションの割合****
（1ページだけ見てサイトを離れたセッション数／合計セッション数）により算出
※直帰率が高い＝ユーザーが満足できなかった、わけではないことに注意！

（例）「交通アクセス」のページでは、直帰率が高くなる傾向にあるが、決して満足していないワケではない。知りたい情報を得ることができたから、直帰できるパターンも考慮すること。
Cognos Analytics の IISでのSSL化設定のメモ

# Cognos Analytics の IISでのSSL化設定のメモ
Cognos Analytics 11.2.4.1.1でやったので、自分のメモを兼ねて投稿しておきます。

基本はこちらの記事の通りでOKです。
**How setup SSL for CA 11 on Microsoft Windows IIS**
https://cogknowhow.tm1.dk/archives/1219

記事の後半にあるPDFレポートに画像を表示させるために、証明書をThirdPartyCertificateToolで取り込む作業は不要でした。
普通にPDF形式で画像表示できましたので、実際にやってみて判断ください。

# 負荷分散装置を用いる冗長化構成の場合
例えば、CognosHost01ノードとCognosHost02ノードがあって、どちらにも仮想のホスト名のCognosHost00でSSLアクセスしたい場合、CSR作成時はCognosHost01のIISで実施して、一般名はCognosHost00のFRDNでSSL証明書を1個購入になります。
※コピーして利用可能かを提供元に要確認

サーバー証明書のインポート時、CognosHost01には前述の記事の手順でインポート可能ですが、CognosHost02ではCSR作成していないので、CognosHost01でエクスポートしてCognosHost02にインポートが必要です。

**エクスポート手順**
CognosHost01のIISマネージャーでサーバー証明書をダブルクリック
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/47b2add3-2b36-498e-1d2e-e3d3767f3bb2.png)

サーバー証明書を選択し「エクスポート」
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/81e9c026-3980-7151-3e72-020ced4c448a.png)

エクスポート先とパスワードを指定してOK
![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/43a11f43-8a06-7247-444b-312166271d00.png)

**インポート手順**
CognosHost02に.pfxファイルをコピーします。

CognosHost02のIISマネージャーでサーバー証明書をダブルクリック
![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/197cded7-3729-37fa-5b82-d87a4c2d19fb.png)

インポート
![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/8f3cb257-16ef-65da-e0fd-1c50177f1c0a.png)

.pfxファイルを指定し、パスワードを入力しOK
![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/6bb87a25-275d-3af3-3597-4be0146f67bd.png)

インポート後は前述の記事に戻って、引き続きバインド処理以降を進めて下さい。
完全自己満足、gitコマンドでイキるためにやっておくべき事3選

# はじめに
この記事では少々個人的なgitの準備や設定を紹介したいと思います。紹介する内容は全て自己満足の範疇であり、必須ではありません。この記事を読まなかったとしても何ら皆さんの未来に影響はありません。それでも少しでも快適なgitライフをお過ごしいただくために、ポイントをいくつかピックアップしてみました。よろしければ最後までご覧ください。

# gitコマンドでイキるためにやっておくべき事
## その1:iTerm2を導入し、背景を透過させる
私の1つ目のお勧めは、iTerm2というターミナル導入を導入することです。標準のターミナルでも十分ですが、iTerm2を使うとさらに便利な機能が使えます。



iTerm2では、例えば背景の透過が可能です。これにより、ターミナルと他のアプリケーションを同時に見ることが可能になり、~~完全に``俺仕事できる感``が手に入ります~~ 作業効率が上がります。

まずは[公式サイト](https://iterm2.com/)からダウンロードします。
ダウンロードができたら、アプリを開き、メニューからiTerm2→Settingで設定を開きます。
設定画面が開いたら、Profiles→Window→Transparencyで透過率を変更できます。
![スクリーンショット 2023-07-21 19.13.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582866/de240251-0433-52e7-afd4-9d97014b794e.png)

![スクリーンショット 2023-07-21 19.18.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582866/b0c3a064-9a05-8cba-1c31-8ba9006af674.png)



## その2:checkoutは使わずにswitchを使う
gitのcheckoutコマンドは、ブランチの切り替えためによく使われます。しかし、checkoutコマンドはブランチの切り替え以外にも特定のコミットに移動するといった機能も含まれているため、理解しずらいという問題がありました。そのため、ブランチ切り替え用のコマンドとしてswitchコマンドが登場したという経緯があります。
switchコマンドはcheckoutコマンドに比べて、名前からもその機能が直感的に理解しやすく便利です。

ブランチを切り替えるときは
```
git switch <ブランチ名>
```
新しいブランチを作成するときは
```
git switch -c <ブランチ名>
```
で操作できるように矯正してみると良いでしょう。

## その3:エイリアスを使ってswitchコマンドをswで使えるようにする
最後に、エイリアスの設定をお勧めします。ここで紹介するのは、先ほど述べたswitchコマンドにエイリアスを設定し、"sw"という短縮形で使えるようにする方法です。

このエイリアスを設定することで、よく使うコマンドを短縮形で入力できるようになり、~~エイリアスを使っていない人の前で謎の自信が湧くようになります~~ 大幅に時間を節約できます。

エイリアスを設定するためには.gitconfigに以下のように記述するだけでOKです。ついでに-cコマンドもエイリアス設定しておくとより便利になります。
```.gitconfig
[alias]
	sw = switch
	swc = switch -c
```

# まとめ
gitに限らず、どのようなツールを使うにも、自分自身が使いやすいと感じる設定を探し、自分の手に馴染むようにカスタマイズすることが重要です。ぜひ、皆さんも自分だけの最高のgitコマンド環境を追求してみてください。

以上、少しでも皆さんの参考になれば幸いです。ありがとうございました。
【Swift】シュミレーターを判定する

# はじめに
カメラを使うアプリを作成してる時に、シュミレータービルド時だけカメラの初期をスキップしたいことがありました。

# やりかた
```swift
#if targetEnvironment(simulator)
  // シュミレーター
#else
  // 実機
#endif
```

# おわり
知りませんでした
Tips: RubyでCloud Functionsを書くときに、ライブラリを使っている場合のレスポンスを返すのを高速化したい時のテクニック

## この記事は何

https://qiita.com/getty104/items/f66fca9fd622f37f1ea3

でレスポンスだけ先に返すことで、slackのスラッシュコマンドのタイムアウトを逃れる方法を紹介しました。
また、Cloud Formationの立ちたがりを早くする方法として

https://qiita.com/getty104/items/1d43da1cf830cc5b99ea

で記事にしました。

しかし、処理の実装にライブラリを使っていると、上で紹介している方法でもスラッシュコマンドのタイムアウトを逃れられない場合があります。
この記事では、そのような場合に追加で行える高速化についてご紹介します。


## 方法

方法は、https://qiita.com/getty104/items/1d43da1cf830cc5b99ea で紹介した`Thread`による非同期化に加え、`Thread`内でライブラリのロードを行うようにすることです。これにより、よりCloud Functionの立ち上がりのスピードが早くなり、レスポンスを返すのが早くなります。

↑の記事で書いている例を使うと以下のようなイメージです。

```rb
require 'functions_framework'

FunctionsFramework.http 'function' do |request|
  Thread.new do
    require 'some_library'
    require 'some_library2'
    ...

    very_long_transaction
    'OK'
  end
  
  'Running...'
end
```