OmniAICreator/Qiita-1.07M huggingface dataset:
Apple Silicon Mac の悲劇

# 初めに
Web系を得意とするフリーランスエンジニアです。
また、今年中に作りたいプロダクトでニューラルネットワークを用いた技術が必要で、10コアCPU,14コアGPU,16コアNeuralEngine搭載Apple M1 pro(14インチ MacBook Pro)を購入しました。

# Apple M1 Pro / Max
詳しい性能は、[Appleの紹介ページ](https://www.apple.com/jp/macbook-pro-14-and-16/)で見ていただきたいですが、一言で言うとCPU,GPUパフォーマンスぶっちぎりで恐るべきスピードを誇るチップ
機械学習のためのパワフルなNeural Engineも、アップグレードされたProRes対応メディアエンジンも持っている。

# 買ってどう?
結論から言うと、かなりの曲者で、買う人によっては後悔する人もいると思います。
良い点と悪い点あるので、順に書いていきます。

## 良い点
機械学習のパフォーマンスは凄い。Tensorflowしか自分は使っていないですが、Intelのmacで機械学習するより遥かに早いです。
Intel mac, Google Colaboratory, M1 macでパフォーマンス比較した記事は、youtubeなり他の方の記事なりたくさんあるので、詳しくは自分でググってください。

## 悪い点
非対応のソフトウェアが結構多いことと、バージョン依存のライブラリが動かせなかったりすることです。

以下が具体例です
- VirutualBoxが動作しない
- Dockerの一部イメージが動作しない
- Tensorflowのバージョン2.4以降しか使えない (miniforge)
- ググっても同じエラーがほとんどヒットしない
etc

開発環境構築でvagrant+virtualboxを使う現場の人はたくさんいると思いますが、残念ながらApple Silicon Macは現状対応していません。また、自分が使いたいと思ったtensorflowやpytorchなどを使ったオープンソースにはApple Silicon Mac非対応のものがほとんどでした。また、新しい故にまだissueに上げっていなかったり、起票されているissueに対して「俺、apple silicon mac持ってないからサポートできない」ってニュアンスの英語が返事されたりしている機械学習用のオープンソースも目にしたりします。
[一例](https://github.com/deepfakes/faceswap/issues/1197)


## 結論
Apple Silicon Mac非対応のソフトウェアが自分にとってクリティカルな問題でないかきちんと吟味する必要があります。もしくは、新しくMacBookを買うとき、それまで使っていたPCを売る人も多いと思いますが、IntelのMacは売らずに持っておいた方が良いと思います。
ハードウェアが素晴らしいのは事実なので、ソフトウェアのサポートが追いつくのを現状待つしかないですね。
PHP 関数で可変長の引数を受け取る

# 概要

- PHPの`...`トークンについて教えてもらったので簡単にまとめる。

# 謝辞

- 本知見は同じ現場で働くエンジニアの方が教えてくださったものです！本当にありがとうございます！

# 可変長の値を引数として受け取る

- 定義した関数の引数部分の前に`...`トークンを記載することで当該の関数が可変長の値を受け取ることができるようになる。
- 引数は配列として渡される。
- 下記に例を記載する。（コードはPHPの公式ドキュメントから抜粋）

    ```php
    <?php
    function sum(...$numbers) {
        $acc = 0;
        foreach ($numbers as $n) {
            $acc += $n;
        }
        return $acc;
    }

    echo sum(1, 2, 3, 4);
    // 10と出力される
    ?>
    ```

- これなら関数呼び出し時に引数の数が変動する場合でも、'...'トークンを記載して、','で区切って値を渡せば、配列状に','で区切られた値を使ってくれる。

# 参考文献

- [可変長引数リスト](https://www.php.net/manual/ja/functions.arguments.php#functions.variable-arg-list)
MacにPython3をインストールする方法

#はじめに
この記事はPython3をインストールする方法を自分流で書いた記事です。
この方法でPythonが使えなくなったり、Macが故障しても責任は負いかねますのでご了承ください。

#インストーラーを使ってPythonをインストールする
指摘があったので無理だと思って試したら普通にできたこのやり方
~~できるなら最初から言ってくれよってかなんでこんな簡単にできるんだよ頭おかし(略~~
##インストーラーをダウンロードする
...まずは下のリンクをクリックしてください。

https://www.python.org/downloads/

リンクをクリックしたら「Looking for a specific release?」より下のリストから、自分のインストールしたいバージョン(よく分からなければ一番上のやつ)の「Download」をクリックしてください。
クリックしたら、下の方へスクロールして、「macOS 64-bit universal2 installer」と書いてある部分をクリックしてください。クリックすると、インストーラーのダウンロードが始まるので気長に待ちましょう。

##インストーラーを実行してインストールする
インストーラーのダウンロードが終わったら、ダウンロードしたインストーラーをクリックしてインストーラーを実行しましょう。~~ダウンロード中にクリックしてしまったあなたは忍耐力が足りてない証拠なのでそっとこのページを閉じましょう~~

インストーラーを実行すると使用許諾契約などが出るので「続ける」をクリックしてください。

何回か押すとインストールするか聞かれるので「インストール」をクリックしてください。このときパスワードを求められるので、パスワードを入力しましょう。(Touch IDでも可能)

インストールが終わったら、「閉じる」をクリックしてください。これでインストールは完了です。環境変数の設定もいらないから簡単だね！
#Homebrewをインストールする
まずはターミナルを起動して、下のコマンドを実行してください。

```
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```
しばらくすると```Press RETURN to continue or any other key to abort```と出るのでEnterキーを押してください。

#Homebrewを使ってPythonをインストールする
Homebrewをインストールしたら、下のコマンドを実行してください。

```
$ brew install python
```
Pythonのバージョンを指定する場合は下記のように指定します。(3.8の場合)

```
$ brew install python@3.8
```

#Python3をデフォルト
このままでは```Python```を実行した際に3系ではなく2系になってしまうので下記のコマンドでシンボリックの向きを変えましょう。

```
ln -nfs /usr/local/bin/python3 /usr/local/bin/python
ln -nfs /usr/local/bin/pip3 /usr/local/bin/pip
```
これでPythonの環境構築は完了です。
#おわり
Pythonをインストールするときにめっちゃハマったので自分流でインストールする方法をQiitaに書いてみました。
それでは、快適なPythonライフを～
[WordPress]抜粋表示にしてみた

```index.php
get_template_part( 'template-parts/post/content',get_post_format());
```

と記述されていたのを

```index.php
get_template_part( 'template-parts/post/content', 'excerpt' );
```

と書き換えるだけでOK

それと[設定]　→　[表示設定]　→　抜粋表示を選択
Mac必須アプリ！shiftit

# shiftitってどんなアプリ？

一言で画面分割アプリです。
使い方としては、右半分をメール、左半分をカレンダーと言った感じにキーボードを押すだけでできます。他にもフル画面に一瞬でできるようになります。

# インストール

ターミナルで以下のコードを打ち込むだけでインストール完了

```
$ brew cask install shiftit
```
他にもzipでやる方法もありますが今回はこれだけ。

# セットアップ

デフォルトのキーだと覚えにくいので私はインストール後変更しています。
私の場合は[command]+[option]+[矢印]で動くようにしています。
右矢印で右半分表示と言ったところです。
他にも全画面表示や、画面の真ん中に表示などと言った機能もあるのでとても便利です。

慣れたら作業効率上がるので是非使ってみてね。
Dash 複数端末で共有する方法

Dashのスニペット機能はとても便利で素晴らしい機能です。
しかしMacをデスクトップとノートパソコンと分けていると2台とも設定するのは面倒です。
クラウドで共有できれば便利ですよね。
と言うことで今回は複数のMac間で共有する方法を紹介します。

# 1.スニペットのデータをクラウドに保存

まずはスニペットのデータをクラウドに保存します。
**[preferences]を開きます。**
開いたら、その項目の中か**[snippets]を選択**します。
そしたら、Snippets Library Locationと表示されます。
これはスニペットのデータの保存場所を示しています。
これをクラウドに変えればよいだけです。
もちろんそこを直接自分でパスを書いてもいいと思います。
でも下**[Save As… ]をクリック**すると保存したいフォルダをFinderと同じUIから選択できるのでこちらが楽です。
そこで他のMacからアクセスできるクラウドに保存すればよいだけ。すごく簡単。

自分はiCloudだけしか試してないのでわかりませんが、Dropboxなど他のクラウド系でもできると思う。

# 2.クラウドデータを使用する

次に先ほどとは別のMacでクラウドのデータを読み込みます。
先ほどと同じような手順になります。**[preferences]を開きます**。
開いたら、その項目の中か**[snippets]を選択**します。
ここまでは同じ。ここで自分でパスを書いてもいいですが、楽にいきたいのでSnippets Library Locationの下にあ**[Open]をクリック**して先ほどクラウド**保存したファイル**を選びます。

以上で共有完了です。すごく簡単ですよね。GUIベースの設定なので誰でもできると思います。

# 最後に

ファイルが保存されているフォルダーの名前を変えると使えなくなるので設定のし直しが必要になります。
スニペットがうまく機能しない時はパスの確認をしましょう。
WordPressがメンテナンスモードから戻らない時の対処法

複数のプラグインを同時にアップデートしようとしたら、メンテナンスモードから戻らなくなった。

そんな時焦らずに対処しよう。

# 解決法

[.maintenance]のファイルを消すだけ

今後同じことを起こさないために、複数のプラグインを同時にアップレート（更新）しないようにする
Mission Controlのデスクトップの順番が勝手に入れ替わるときの対処法

# Mission Controlのデスクトップとは

MacのキーボードのF3キーを押した時に表示されるときの上に表示される（デスクトップ１、デスクトップ２…）ものです。

# 対処法

システム環境設定　→ Mission Control → 「最新の使用状況に基づいて操作スペースを自動的に並び替える(Automatically rearrange Spaces based on most recent use)」のチェックを外す

以上
Macの自動変換(ライブ変換)の設定はどうやってやるの？

メニューバー（右上）に[A]や[あ],[ア]と言った今現在のキーボードの入力言語が表示されていると思います。

そこをクリックすると「日本語」の下に「ライブ変換」というものがあると思います。
そこのチェックを外せば自動変換はされません。
チェックをつけておけば自動変換してくれます。

以上です。
Raspberry PIで「Homebridge Config UI X」を扱う

# 1. Homebridge + Homebridge Config UI Xのインストール

```
$ sudo npm install -g --unsafe-perm homebridge homebridge-config-ui-x
$ sudo hb-service install --user homebridge
```

# 2. 管理画面にアクセス

[http://localhost:8581](http://localhost:8581)

これにデフォルトユーザーでログインしてみる
ユーザー名 :admin
パスワード　:admin

あとは、PQコードをアプリから読み取るだけ。
詳しくはこちホーム App に HomeKit アクセサリを追加する

## TP-LinkのスマートプラグHS105を追加する

「Homebridge Tplink Smarthome」というプラグインを入れるだけで良い。

## NatureRemo　を追加する

### Step1 アクセストークンの取得

ここからアクセストークンを取得してね

### Step2 JSONを取得

```
$ /usr/bin/curl -X GET "https://api.nature.global/1/appliances" -H "Authorization: Bearer ここにaccess-tokenを代入" > appliance_id.json

$ vim appliance_id.json

$ mv appliance_id.json ~/Desktop
```

### Step3 プラグインのインストール

使いたいプラグインをインストール
・Homebridge Nature Remo Cloud
・Homebridge Nature Remo Cloud Aircon

### Step4 cofigを書く

```
{
    "bridge": {
        ... <- Homebridgeの設定が自動入力されている
    },
    "accessories": [
        {
            "accessory": "remo-sensor",
            "name": "室温センサー",
            "mini": true,
            "schedule": "*/5 * * * *",
            "accessToken": "NatureRemoのアクセストークン",
            "sensors": {
                "temperature": true,
                "humidity": false,
                "light": false
            }
        },
        {
            "accessory": "NatureRemoAircon",
            "name": "エアコン",
            "access_token": "NatureRemoのアクセストークン",
            "appliance_id": "個別id",
            "skip_command_request_if_no_change": true
        }
    ],
   ...
}
```

#### Sensor
accessory : プラグインの識別子。remo-sensorを指定
name : HomeKitに表示される名前。Siriにお願いをするときは、この名前を使う
mini : Nature Remoか、 Nature Remo miniかどうか
schedule : センサー情報の更新頻度をcron形式で指定
accessToken : 先ほど取得したアクセストークン
sensors : HomeKitに表示するセンサーの種類。NatureRemoMiniの場合、室温しか検知できない

#### Aircon
accessory: プラグインの識別子
name : デバイス名
access_token : 先ほど取得したアクセストークン
appliace_id : 取得したappliance_idを指定
skip_command_request_if_no_change : ステータスに変更がない場合、APIを叩くのをスキップする
TestCafe逆引きメモ

# 概要
TestCafeの使い方を利用目的から探すためのメモです。
随時更新予定です。

# 逆引きメモ

## ブラウザ設定

### 利用できるブラウザ確認
    
```bash
$ testcafe -b
```
### ブラウザの指定
    
```bash
# Chroeの場合
$ testcafe chrome test.js

# FireFoxの場合
$ testcafe firefox test.js

# デバイスエミュレーションの場合
$ testcafe "chrome:emulation:device=iphone13" test.js

# Chromeのheadlessの場合
$ testcafe chrome:headless test.js

# すべての場合
$ testcafe all test.js

# ローカルにインストールしているブラウザの場合
$ testcafe path:ブラウザのPath ./test.js

# ネットワーク内のリモートブラウザの場合
$ testcafe remote test.js
```

### スクリーン最大化

```javascript
await t.maximizeWindow();
```

## テストのセッティング

### 指定したURLへ遷移

```jsx
fixture('foo')
  .page('https://...');
```

### fixtureやtestの前後処理
    
```javascript
fixture('foo')  // testでも可
  .before(async => t {
    //...前処理
  });
  .after(async => t {
    //...後処理
  });
```
    
### 各testの前後での定形処理
    
```javascript
fixture('foo')
  .beforeEach(async => t {
    //...前処理
  });
  .afterEach(async => t {
    //...後処理
  });
```

## 要素の取得

### テキスト

```javascript
const elem = Selector('a').withText('text')

// 正規表現
const elem = Selector('a').withText(/[tex]+/)
```

### CSSセレクタ

```javascript
const elem = Selector('input');

// nest
const elem = Selector('body > div > div');

// id
const elem = Selector('#id');

// class
const elem = Selector('.class');
```

### nth（n番目の要素）

```javascript
// 2番目
const elem = Selector('input').nth(2);

// 最後
const elem = Selector('input').nth(-1);
```

## 要素の操作

### クリック

```javascript
await t.click('#button1');
```

### 入力

```javascript
// 文字文字列
await t.typeText('#inputbox1', 'foo');

// 特殊キー
await t.pressKey('tab'); // キー名は小文字で
```
    
### 待機

```javascript
// 秒数指定
await t.wait(1000);  // 単位はミリ秒

// 要素が表示されるまで
await Selector('#id').with({visibilityCheck: true})();
```

### プルダウンメニュー
#### 選択

```javascript
const fooSlector = Selector('#dropdownlist')
const fooOption = fooSelector.find('option')

await t
  .click(fooSelector);

  // 表示テキストで選択
  .click(fooSelector.withText('foo'));

  // Value属性で選択
  .click(fooSelector.withAttribute('value', 'foo'));
```
        
### チェックボックス
#### 選択

```javascript
await t.click('#checkbox1');
```
        

## 期待値確認

### 文字列が一致しているか
    
```javascript
const fooText = Selector('#id');

await t.expect(fooText.innerText).eql('foo');
```
    
### チェックボックスがチェックされているか

```javascript
const fooCheckbox = Selector('#checkbox1');

await t.expect(fooCheckbox.checked).ok();
```
    

## その他

### スクリーンショット
    
```javascript
await t.takeScreenshot({path:'foo.png'});
```
2022年に流行る(かもしれない技術)予想

##はじめに
Advent Calenderが終わり、少し目標を見失っていました。
そんな中下記のイベントがあると知り、これは面白そうだと。

https://qiita.com/official-events/5cb794f7cb9ac194ed70

ここで思った。
**予想なら外れても訴えられないし、何とかなるんじゃね？**

というわけで、書いてみることにしました。

##何書こうかな
簡単に流行りそうなものを見つけられたらいいのですが、そんな簡単に物事は運ぶこともなく。自力で探すのは難しいので、TVやネットで話題になっているテーマをヒントに考えてみます。

よく最近耳にする言葉、そういえば「メタバース」が注目されているはず。
TVで聞くぐらいだから、メタバース自体はもう流行っているのは違いない。これからはそれに関連する内容がより注目されるのではないかと思い、まとめることにしました。

###そもそもメタバースって何？
一言で表すなら「非常にリアルな仮想現実(VR)」です。VRにも段階があり、メタバースは最終段階だと思っています。

######空間の共有
これは少し前のゲーム(格闘系など)のイメージ。その場とは違う別空間に入り込んでいるような感覚を味わうことができる。
######感覚の共有
空間の共有だけではなく、感覚(痛いとか)もゲーム上で認識することができる。
######ブランドの共有
VRで人気になったものが現実でも有名になったり、実際の有名人がVR内でも有名になる。どう○つの森なども該当するのでは。
######資産の共有
現実世界の資産とVR内の資産をリンクすることができる。

今までVRで得たお金はその空間内だけでしか使えなかったですが、双方向でやり取りできるというのが大きな進化だと思います。今までだと遊ぶという認識が強かったものが、生活する方向に向かっているのではないでしょうか。

##トレンド予想
前置きがあったところでここからが本題。技術というより概念的なものかもしれませんが、2つピックアップしました。

###①DAO
DAOとは自律分散型組織（Decentralized Autonomous Organization）の略です。
メタバースの発展には仮想通貨(暗号資産)が伴います。仮想通貨は現実の通貨と異なり
データ上のみに存在しているので、改ざんのリスクがあります(現実の通貨に比べて)。

改ざん・不正取引を防ぐためブロックチェーン技術が使われていますが、その中にスマートコントラクト(契約の自動化システム)が含まれています。スマートコントラクトによる、独立かつ分散して取引が行われる組織をここでは指します。
権力の集中がない状態なので、処理の時間短縮、公平な組織運営などのメリットがあります。このようなシステムが、更に注目を浴びるのではと期待しています。

###②VR住所
この題名がいいかはさておき。。。
実際の生活では「衣食住」が欠かせません。このうち衣と食に関してはそこそこ記事を見るのですが、住はあまり見ないなと(探しきれてないだけかもしれませんが)。

今はつながることに重きが置かれている感じありますが、実際の世界では自分の空間も大切ですよね。勝手な予想ですが、VR空間内での住所登記や土地販売など、空間の切り売り及びそれに関連する技術が求められるのではないかと考えています。

##まとめ
ひとまず考えてみました。
**神様、予想が当たりますように:clap:**

##参照
【メタバース】
https://cloud-ace.jp/column/detail227/
https://www.itmedia.co.jp/business/articles/2112/28/news134.html
【DAO】
https://coinpost.jp/?p=292683
https://hedge.guide/feature/the-potential-why-dao-has-nft-bc202111.html 
https://mvno.freebit.com/column/iot-m2m/blockchain-demerit.html
インタープリタを作る その31

#概要

インタープリタを作ってみた。
jsforthを使ってみた。

#数9を4個つかって1から15までの数を表す式を投入。

```
9 9 - 9 9 / .
9 9 / 9 9 / + .
9 9 + 9 + 9 / .
9 9 9 + 9 / dup + .
9 9 9 + 9 / dup + - .
9 dup 9 + 9 + 9 / - .
9 9 9 + 9 / - .
9 9 9 drop 9 / - .
9 9 - 9 * 9 .
9 9 / 9 dup 9 / +  .
9 9 9 + 9 / + .
9 dup 9 9 + + 9 / + .
9 9 9 + 9 / dup + + .
9 dup 9 9 + 9 / dup + - + .
9 dup dup 9 + 9 + 9 / - + .
```

#結果

```
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
```

#成果物

https://embed.plnkr.co/plunk/9nEYnvgDhG2Npxs3

以上。
MacでPlantUMLのインストール

MacでPlantUMLを扱うために、PlantUMLのコマンドとPlantUMLファイルの編集を効率化するために、atomのプレビュープラグインを導入する手順をまとめます。

## コマンドインストール

brewでgraphvizとplantumlをインストールします。

```sh
brew install graphviz
brew install plantuml
```

## atomプラグインのインストール

`atom＞Preferences...>Install`で

- plantuml-preview(PlantUMLのプレビュー)
- language-plantuml(PlantUMLの言語サポート)

をインストールします。

この状態だと、plantuml-previewが実行時にエラーになるので、`plantuml-preview＞Settings`の`PlantUML.jar`の項目に`/usr/local/Cellar/plantuml/1.2021.16/libexec/plantuml.jar`を設定します。

## atomでプレビューの表示

`Packages＞PlantUML Preview＞Toggle(⌃⌥p)`を押します。   
※修正はリアルタイムには反映されません。PlantUMLファイルの保存時に反映されます。

## 画像ファイルの出力

PlantUMLファイルを指定してコマンドを実行します。

```
plantuml <PlantUMLファイル>
```
※画像はカレントディレクトリに出力されます。
PHPでの実行環境を環境変数で切り替える

# PHPで実行環境毎に環境を切り替えたい
切り替えるにはどうするか。色々方法はあるかとおもいます。
おおきく以下かなとおもいます。

- ローカル環境の場合
- 開発サーバー環境の場合
- ステージングサーバー環境の場合
- 本番環境の場合

で、PHPで以下で取得するとよさそうですが、

``$_SERVER["HTTP_HOST"]``

これが良さそうだけど、環境によっては取得できない場合がある。

確実に取得するには、ウェブサーバーに値を設定すればよい。確実にその値が取得できる。


**忘れがちなので環境をコピーしたときに、チェック!**



###nginx 

``` xxx.conf
location ~ \.php$ {
いろいろ設定
    fastcgi_param PROD_STG_ENV production;

  }
```

###apache

``` xxx.conf
<VirtualHost *:80>

   SetEnv PROD_STG_ENV production
</VirtualHost>
```


##　PHPで環境変数を取得する


apacheやnginxでの設定を取得し、環境を切り替える

```php
<?php
if (getenv('PROD_STG_ENV') === 'production') {
    // 本番での設定
}else if (getenv('PROD_STG_ENV') === 'develop') {
    // 開発サーバーでの設定
}else if (getenv('PROD_STG_ENV') === 'staging') {
    // ステージングサーバーでの設定
} else {
    // ローカルでの設定
}
【AzureDevOps】AzureReposのファイルをAzureのLinuxVirtualMachineに展開する

公式ドキュメントを読みましょうって話なのですが、個人的に詰まった部分だけ備忘録として。

### VirtualMachineをAzurePipelineで使えるようにする
基本的には公式Documentのとおり
https://docs.microsoft.com/ja-jp/azure/devops/pipelines/process/environments-virtual-machines?view=azure-devops

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2480223/5b9e3992-96f5-1b4d-e505-d20c1a0e28b1.png)
画面下部の「Registration Script」に対象となるLinux仮想マシンで
実行するコマンドが表示されていますので、これをコピーしてLinux仮想マシンで実行することで、
AzurePipelineから環境を使えるようになります。

**このコマンドの引数で、DevOpsに登録する名前として$HOSTNAMEが使われていますが、
名前が長かったり、.(ドット）などの文字が利用不可なため、Agent登録時にエラーになる場合があります。
その時は、$HOSTNAMEの部分を任意の文字列に置き換えてください。**

問題なければコマンドが完了すれば、Azure Pipelines Agentが実行されます。
これでLinux仮想マシンをAzurePipelineから使うことができるようになります。

### AzurePipelineでのYaml設定
先ほど登録して環境を使うようにYamlを書きます。
公式Docs→ https://docs.microsoft.com/ja-jp/azure/devops/pipelines/ecosystems/deploy-linux-vm?view=azure-devops

```
jobs:  
- deployment: VMDeploy
  displayName: web
  environment:
    name:  [環境名]
    resourceType: VirtualMachine
    tags: web
  strategy:
      runOnce:
        deploy:
          steps:
          - checkout: self
```
<font color="red"><b>checkout: selfでリポジトリの環境をサーバーに展開することができる。</b></font><font color="gray">（これがわからずに数日悩んだ､､､)</font>
サーバー側にgitの導入が必要なので、ない場合は入れておくこと。

```
dnf install git
```
これでパイプラインを実行すると、サーバー側にAzureReposのファイルが展開されます。
展開される場所は自分の環境だと下記でした
[azagentのルート]/_work/1/s
oneWEXでのSPOクローラーでのエラー

oneWEXでSPO(SharePoint Online)クローラーを使用している場合、
コンバーターパイプラインにエラーが発生することがある。

ファイルが正常で壊れてないのにエラーが出ている場合、
詳細なエラー原因はログを確認する必要があるが、以下のものはクロール不可。

・暗号化されているファイルはクロール不可
「Unable to process: document is encrypted」が出力される

・Zipファイル名に全角が使用されているものはクロール不可
「IllegalArgumentException: MALFORMED」が出力される
TypeScriptで可変長のジェネリクスを作る

# コード

2値の型引数を持つ`TargetTypeFuncImpl` があるとき、`VariableLengthTypeFunc` が再帰的に適用するようになっています

```ts
type TargetType = any; // 好きな型を入れてください
type VariableLengthTypeFunc<T extends TargetType[]> = T extends [any, ...(infer A)]
? A extends TargetType[]
  ? A[1] extends undefined　
    ? TargetTypeFuncImpl<T[0], A[0]> // 3番めの要素が空の場合再起の底なので、2値の合成を行います
    : TargetTypeFuncImpl<T[0], VariableLengthTypeFunc<A>> // そうでなければ、先頭とそれ以外の要素で合成します
  : never
: never

// 具体的にやりたい型の処理を書いてください
type TargetTypeFuncImpl<T1, T2> = T1 | T2;

----
type Test = TargetTypeFunc<[number, string, Object]>; // => number | TargetTypeFuncImpl<string, Object>
const test1: Test = 0; // => valid
const test2: Test = ""; // => valid
const test: Test = null; // => invalid

type NullableTest = TargetTypeFunc<[number, string, Object, null]>; // => number | TargetTypeFuncImpl<string, TargetTypeFuncImpl<Object, null>>
const test1: NullableTest = 0; // => valid
const test2: NullableTest = ""; // => valid
const test: NullableTest = null; // => valid
【Rails】「【trタグ】とはなにか？」「【thタグ】と【tdタグ】の違いはなにか？」

##【trタグ】とはなにか？
・行を表すタグです。
・このタグの間に書かれたものが同じ行となります。

（例）商品名や個数を同じ行にする場合

```
<tr>
<th>商品名</th>
<th>個数</th>
<th>価格</th>
</tr>
```

##【thタグ】と【tdタグ】の違いはなにか？
・thタグ：見出し用のタグ。太字で中央揃いになる。
・tdタグ：通常文用のタグ。左揃いになる。

###thタグとは
・セルを意味するタグの1つ
・このタグの間にテキストを書く
・書かれた内容は見出しとなり太字で中央揃いとなる。

（例）「個数」という見出しにする場合

```
<th>個数</th>
```

###tdタグとは
・セルを意味するタグの1つ
・このタグの間にテキストを書く
・書かれた内容は通常の文となり左揃いとなる。

（例）数字を書く場合

```
<td>300</td>
```

>引用元：https://www.hibinokoto01.com/entry/2017/02/27/044737
[py2rb] raw文字列

# はじめに
移植やってます。
# raw文字列 (Python)
```python
r = r'R'
print(type(r))
print(r)
print(r == 'R')

<class 'str'>
R   
True
```
`python`の正規表現でよく`r''`って出てきますが、単なるストリングでした。

https://docs.python.org/ja/3.7/reference/lexical_analysis.html#index-19

# inspecct (Ruby)
```ruby
r = /R/
puts r.class
puts r
puts r == 'R'

puts r.inspect
puts r.inspect.class
puts r.inspect.gsub(/\//, '') == 'R'

Regexp
(?-mix:R)
false

/R/
String
true
```
`Ruby`の`/`で囲まれた文字列はRegexpクラスですので、文字列と比較する場合変換する必要があります。

もしくは、いったん文字列で保管しておいて正規表現で使用する際にインスタンス化するかですね。
# メモ
+ Python の raw文字列 を学習した
+ 百里を行く者は九十里を半ばとす
データサイズはなぜ1024倍なのか

* 1L=1000ml
* 1t=1000kg
* 1m=1000cm
* 1kV=1000V

世の中の単位は、1000倍で単位を変えることで省略されることが多いように思います。
ですが、ことデータのサイズに関しては

* 1KB=1024B

となっています。

というわけで調べてみました。

# PCの世界での数の数え方について
PCの世界では10進法ではなく2進法が利用されています。
つまり、1桁で表現できる数字は0か1しか存在しません。

1桁とはPCでいうと、1bitとなります。
そして桁数を増やした場合に表現できる数は以下のように変化します。
1bit→2、2bit→4、3bit→8、4bit→16、5bit→32、6bit→64

# 現実世界での数の数え方について
PCの世界ではない10進法で表すことができるものについては、
国際単位系（SI単位）といい、10^3毎に区切られているようです。

10^3 → k（キロ）、10^6 → M（メガ）、10^9 → G（ギガ）、10^12 → T（テラ）

# 現実世界での数え方をPCの世界に持ち込む
PCの世界では、数字を2進数で表すことになります。

そして1000という数字を2進数で表すと
1000(10)=1111101000(2)となります。

そして、2進数の10桁で表現できる「1111111111(2)」を
10進数に変換すると1024となります。
(1111111111 = 1023ですが、0が含まれるので1024となります）

# まとめ
前から疑問に思っていた、データサイズについてまとめを行ってみました。
誤りなどありましたら、ご指摘をお待ちしております。

# 参考文献
https://hogehoge.tk/tool/number.html
https://ja.wikipedia.org/wiki/SI%E6%8E%A5%E9%A0%AD%E8%BE%9E
【Unity iOS Build】M1 Macでビルドエラーになった時に見たリンク等

# はじめに（私の環境とか）
M1 Macに変えて初めてだったのと、だいぶ久々だったのでUnity→iOSでビルドエラーが頻発してしまいました。
今後のため備忘録としてまとめます。

環境は以下のような感じです

- Xcode v13.2.1
- Unity Hub 2.4.5
- Unity 2020.3.25f1 (LTS)
- iPhone SE2 バージョンはiOS15.1

#　リンク

- [UNITYがビルドできない　チェックリスト](https://ringonokajitu.com/?p=544)
- [【iOS】Xcodeでビルド時に「The Legacy Build System will be removed in a future release」のエラーが出る場合の対処法](https://develop.hateblo.jp/entry/ios-legacy-build)
- [UnityでiOSビルドするとエラーが出る](https://nn-hokuson.hatenablog.com/entry/2016/12/24/113002)→Signing & Capabilitiesの設定
- [「信頼されていないデベロッパ」の対処法](https://d1v1b.com/swiftui/untrusted_developer)



# おわりに
これにてDone!!
![IMG_9145.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692322/4e4ff8ca-85f9-bca3-2545-dea017af380d.png)
Linux入門 3-5 コマンドラインの操作

[](参照ソース)
[Udemyの動画講座]:https://www.udemy.com/course/linuxlpic/?utm_source=bene-content-marketing&utm_campaign=normal&utm_content=story&utm_term=career&utm_medium=udemyads
[Linux入門 3-4]:https://qiita.com/hoglet/items/70f50d82f5895055b402
[Linux入門 3-6]:https://qiita.com/hoglet/items/3c944e8bc4b8bfa9a230

# はじめに
Linux初学者である自分向け用の記事です。[Udemyの動画講座]を参考にしました。
僕の勉強法は`動画を見る`→`実際に動かしてみる`→`問題演習`という流れです。

前回まで：[Linux入門 3-4]

***
# 3. LinuC 101 Ver .10.0(問題、テスト、演習)
## コマンドラインの操作
```
用語: bash, echo, env, export, pwd, set, unset, man, uname, history, .bash_history, 引用符, 相対パス, 絶対パス
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/9b882a43-b3ea-69b7-b2e1-6ab8bacfa1e4.png)

### 変数の使用方法
値を代入するに場合には、$はつけない
× : `$VAR=apple`
〇: `VAR=apple`
値を参照する場合には、$をつける
× : `echo VAR`
〇: `echo $VAR`

### 代表的な環境変数一覧

```
HOME:ホームディレクトリ
LANG:使用言語
PATH:実行できるコマンドの検索パス
PWD:カレントディレクトリ
USER:ログインユーザ名
```

### 引用符(シングルクォーテーションとダブルクォーテーションの違い)
シングルクオーテーションの場合、中の文字は全て文字列として解釈される

```bash
1) $VARと表示され、変数は展開されない。
VAR=apple
echo '$VAR'
```
ダブルクオーテーションの場合、中の変数は展開される

```bash
2) I like appleと $VAR が展開されて表示
VAR=apple
echo "I like $VAR"

3) I like $VAR と表示される
VAR=apple
echo "I like ¥$VAR"
```
```s
[test@localhost 1]$ msg=Hello
[test@localhost 1]$ echo $msg
Hello
[test@localhost 1]$ new_msg='msg is $msg'
[test@localhost 1]$ echo $new_msg
msg is $msg
[test@localhost 1]$ new2_msg="msg is $msg"
[test@localhost 1]$ echo $new2_msg
msg is Hello
[test@localhost 1]$ new3_msg="msg is ${msg}"
[test@localhost 1]$ echo $new3_msg
msg is Hello
```

### history
現在のbash セッション のコマンド 実行履歴を表示するコマンド。履歴できるコマンドの数は`HISTSIZE` で設定

```s
[test@localhost 1]$ history
    1  ls
    2  ls -la
    3  vi test.txt
    4  exit
    5  ls
    6  groups
    7  exit
    8  ll
    9  cd ..
    .
    .
    .
 1000  ls -la
[test@localhost 1]$ env | grep HISTSIZE
HISTSIZE=1000
[test@localhost 1]$ export HISTSIZE=5
[test@localhost 1]$ history
   33  echo $new3_msg
   34  history
   35  env | grep HISTSIZE
   36  export HISTSIZE=5
   37  history
```

### /home/user/.bash_history
コマンド履歴が保存される（ログアウト時に起動してからログアウトするまで実行されたコマンドを保存する）

*To Be Continued...*
[Linux入門 3-6] へ
***
datファイルの関連付けができないとき(windows11)

windows11(windows10)で
datファイルを関連付けようとしたが、苦戦したためにメモ書きする。
#緒言
txtファイルであれば、
ファイルを右クリック > プロパティ > 全般
ファイルを右クリック > プログラムから開く > 常にこのアプリを使って
　　　　　　　　　　　　　　　　　　　　　　.txtファイルを開く
![スクリーンショット 2022-01-07 112608.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2405683/29077d13-ad4c-7ce7-17b4-1feb19f55187.png)
または
設定 > アプリ > 既定のアプリ

https://dekiru.net/article/22288/

で拡張子とアプリの関連付けをおこなうことができる。

しかしながら、windows11ではこのような方法で.datファイルの関連付けができないようだったので、レジストリを変更する方法で関連付けを行った。
![スクリーンショット 2022-01-07 112441.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2405683/f22ca78a-52a4-b39e-4873-df7dbf705789.png)
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f323430353638332f37643339383734322d623566342d383361362d383834392d333130366266366234383131.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2405683/8d84fea0-594e-5e87-294c-e25bf33638c4.png)
参考にしたページ

https://answers.microsoft.com/ja-jp/windows/forum/all/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE/d321ea5b-367a-4eee-90b6-81c524ba5aef?auth=1
#本題
①windwosキーを押して、"regedit"と検索し、
レジストリエディタ―を開く

レジストリエディターの検索欄に下のパスを貼り付け、ジャンプする

```
コンピューター\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.dat\UserChoice
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2405683/40c03e34-395c-f5c5-c9e3-e7f52dc00da2.png)
UserChoiceは、ダブルクリックしたときに開くファイルを指定するものらしい。
UserChoice内のProgIdがnotepadになっているので、
現在はメモ帳で開く設定になっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2405683/d563ffc9-6a03-4b05-819e-44efd5df86e0.png)
このUserChoiceフォルダを削除することでファイルの関連付けを
初期化することができる。

![スクリーンショット 2022-01-07 122041.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2405683/e2e111e1-4fac-9be2-5216-d861249ee6b3.png)

このようにしてdatファイルの関連付けを初期化ことができたので、
**緒言**の方法に従って既定のアプリを設定することができる。

https://dekiru.net/article/22288/

（レジストリを扱うので、パソコンが正常に動作しなくなったり、起動しなくなることもあります。自己責任でお願いします。）
rails s -e productionでBootstrapが適用されない

#環境
macOS Big Sur(11.6)
rails 6.1.4
bootstrap5

#崩れるbootstrap
普段はrails sでdevelopment環境で確認しているけど、rails s -e productionで本番環境の挙動を確かめたい。
しかし、開発環境ではBootstrap5がちゃんと表示されていたのに、production環境では体裁が崩れる。

#一応事前にはこちらは済んでます。
```
$ rails asset:precompile
```

#なんで？
production.logを見てみると

```:production.log
ActionController::RoutingError (No route matches [GET] "/packs/js/application-81c24075e6920f66b791.js")
```
とかいうのが延々と出ている。
webpackerのコンパイルがうまくいっていないのか？と思い、以下を実行してもNG。
（実際はrails asset:precompile時点でwebpacker:compileも走る)

```sh:
$ rails webpacker:compile
```

#結論
ここ↓の回答にありました。
[RAILS 6 + Webpacker -- route error for packs/css|js/application-* in production environment]
(https://stackoverflow.com/questions/67863081/rails-6-webpacker-route-error-for-packs-cssjs-application-in-production)

"did you set config.public_file_server.enabled to true in production.rb ?"

つまり
config/environments/production.rb　の
config.public_file_server.enabled = true　にすれば良い。
これによって本来コンパイルされたpublic配下にアクセスできるようになる。

```ruby:config/environments/production.rb
  # Disable serving static files from the `/public` folder by default since
  # Apache or NGINX already handles this.
  #config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
  config.public_file_server.enabled = true
```

developmentだとrails sの際に勝手にcompileが走るし、apacheやnginxのwebサーバ環境だとすでに値が設定されている。pumaのproduction環境だけでbootstrapが適用されないのはこれが原因でした。めでたし。
userモデルを作る時にエラー「undefined method `devise'」の解決法

#はじめに
　deviseを介してuserモデルを作る時に、「undefined method `devise'」というエラーが出て作成ができませんでした。ちょっとした記述ミスだったのですが、焦ったので備忘録としてまとめておきます。

#原因
　deviseは導入したはずだったのですが、遡ってみると

```
% bundle install
% rails d devise install
% rails g devise user
```
よくみてみると、「rails d devise install」という記述に「：」がない事に気がつきました。本来は「rails d devise:install」です。したがって今回の原因は「：」が抜けている事でした。。

しかし、問題は中途半端に処理は実行されていて、deviseのマイグレーションファイルは出来上がってしまっている事です。bundle install直後に戻さないといけません。

#対処法
　対処法としては以下の3つの手順を行いました。
①routes.rbに作られた、  「devise_for :installs」 という記述を削除する。
 これを削除しないと次の手順のrailsコマンドが使えません。
（※ 「:installs」という記述は謎だが、中途半端なdeviseを介してuserモデルを作ると出現した・・）

②rails db rollbackコマンドを実行。→devise作成時のマイグレーションファイルを削除する。

③rails destroy devise:installコマンドを実行。→devise関連のconfigファイルの削除

ここまでやってもう一度、「：」をしっかりと入れて、「rails g devise:install」で無事にdeviseの再導入できました。よかった。

#まとめ
　結局は「：」のうち忘れという事で単純な事でしたが、焦りました。model関連の導入は落ち着いてやろうと思います。
以上この記事が少しでも誰かのお役に立てれば幸いです。
プレビューキャンバスが機能しない（Failed to build ContentView.swift）

急にレイアウトプレビューが使えなくなりました。
ビルド、シミュレータ、実機転送は問題なく、キャンバスプレビューのみ失敗します。
他のswiftプロジェクトも同様。

###■試したこと
xcode再起動
Mac再起動
Product＞Crean Build Folder
上記の後も改善せず

【環境】
Xcodeバージョン　13.2.1 (13C100)
MacOS BigSur　11.6.1（20G224）

###■症状　プレビューキャンバスが使えない状態
![スクリーンショット 2022-01-06 22.31.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618527/8d918d05-6627-d0be-4cb7-3ca86cf9057c.png)

###「Diagnostics」の内容を確認
![スクリーンショット 2022-01-07 11.12.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618527/8aab2cd2-c951-7afa-a877-27d4b59582be.png)
![スクリーンショット 2022-01-07 11.13.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618527/a7ee1a12-5174-e99c-c35b-47340037dc5b.png)
何回も出てくる”SwiftShims-2TTN5UXQBRCCQ.pcm”が気になる。
![スクリーンショット 2022-01-07 11.21.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618527/62a8c809-a793-e21f-292f-e168c161efc1.png)

###■解決 SwiftShims-2TTN5UXQBRCCQ.pcmを削除
Finderで「/ var / folder / kv / t_w2wdds3m1_0lr02hcp3dgw0000gn / C / clang / ModuleCache / 12TRQXIDQ8QQD /」へ移動する。
Finderでvarの場所が分からなかったためターミナル（% open）を利用。

```:ターミナル
 % open / var / folder / kv / t_w2wdds3m1_0lr02hcp3dgw0000gn / C / clang / ModuleCache / 12TRQXIDQ8QQD
```


フォルダ展開するので「SwiftShims-2TTN5UXQBRCCQ.pcm」を探して削除する。
プレビューキャンバス成功。
![スクリーンショット 2022-01-07 12.49.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618527/69b858b5-9c22-0f2c-8fc6-1bcd355d4571.png)

###参考URL：
https://developer.apple.com/forums/thread/696726

なぜ今回の症状が起こったのかがわからなくてもやもやします。
Python　JSONデータをソートする

# はじめに

VSCodeのsettings.jsonを編集していて、設定項目が散らばっていたので、ソートさせるために書きました。
調べたところ、簡単な方法がなく、とりあえずPythonで書きました。

もっと簡単な方法があるよ、Pythonだとこう書いたほうがいいよ。ということがあったら教えていただけましたら幸いです。

## Code

```python
from collections import OrderedDict
import json

with open('mydata.json', encoding='utf-8') as file:
    data = json.load(file)
    ordereddictdata = OrderedDict(sorted(data.items(), key=lambda x: x[0]))
    json.dump(ordereddictdata, open('mydata_ordered.json', 'w', encoding='utf-8'), ensure_ascii=False, indent=4)
```
リーダーと言う勿れ ～面接時の注意事項～

QA組織のマネージャとして、かれこれ4～5年ほど、QAスタッフの採用面接を担当してきました。
面接時は、なるべく応募者の良いところを探るように努めているのですが、質問と回答が噛み合わず、良さを引き出せないことがあります(私の質問スキルの問題もありますが)。

この記事では「面接時にこういう回答が出てくるとちょっと困る！」というものを幾つか挙げてみたいと思います。


## リーダーと言う勿れ
業務内容の質問をしたときに、「(テスト)リーダーをやってました」という答えが返ってくることがあります。
これは実は、何の情報も得られないので、結構、困ります。

例えば、あなたが今働いている会社で、テストリーダーのことを「大統領」と呼ぶことにしたとします。
別の会社に転職しようと思って面接を受けたとき、「私は大統領をやってました」と言うでしょうか。
たぶん、言わないですよね。具体的な業務内容を言うはずです。
「社内的には大統領という肩書だったんですけど、具体的には○○の業務を担当してました」みたいな。

大統領はあきらかに違和感あるので、応募者も面接官も気をつけるでしょうが、
「リーダー」とか「マネージャ」とか「ホームラン王」みたいなそれっぽい抽象的な肩書になると、以外に違和感を感じにくく、話し手と受け手で、違うことをイメージしたまま、話が進んでいってしまうことがあります。
>Aさん：私は(草野球の)ホームラン王でした！
Bさん：あなたは(大リーグの)ホームラン王なんですね！

みたいに。

面接の時は、肩書ではなく、何をやっていたか、を話せるように業務を棚卸ししておきましょう！


## 抽象的になる勿れ
前項ともカブるのですが、「管理してました」「マネジメントしてました」という言葉も情報が引き出しにくい＆誤解を生みやすいです。
100人中100人が、やってることを正確にイメージできるような言葉で、業務が説明できるようにしておきましょう！

## 未来を語りすぎる勿れ
面接の場は、基本的に過去を語る場だと考えてます。
過去の職場で、何を見て、何を考え、どう行動したか、を話しましょう。

志望動機やキャリアパスの話も大事ですが、まぁ、嘘をつけるし、そのとき本気でも一ヶ月後にはら嘘になってることもあるので、面接時は、ほどほどに聞くくらいで良いとと思ってます(個人的には、ですが)

これは面接官側にも言えることで、チームのことを聞かれたときは、現在・過去の情報を沢山伝えたほうが良いと思います。
将来やりたいことをベースに話して、応募者の気を引こうとしてしまいがちなのですが、入社後のミスマッチに繋がりがち。


## 自動化・プログラミングに興味がありますと言う勿れ
とあるギャングの言葉を借りるなら、興味があると心の中で思ったなら、その時すでに行動は終わっているはずです。
「興味があるので、個人的にやってます()勉強してます)。具体的には～～」
と語れるようにしておくといいかもしれません。行動力のアピールになるでしょう。


## おわりに
ぜんぶひっくるめて「抽象的になるな。過去のことを話せ」でまとまりそうですね。
それをダラダラと書いてしまいました。
偉そうに書いてますが、私も自分の評価面談や、第三者に自分のお仕事を説明するときに、めっちゃやりがちです。


面接が苦手な人は多いと思いますが(私も受けるのは苦手です。というか面接官も苦手です。面接の予定が組み込まれると、ずっと憂鬱です)、
これは「何を聞かれるかわからない」というのが大きな要因になってる気がします。しかし、「面接というのは、自分の過去のことを話す場である」と認識したら、準備もしやすいし、喋りやすくなるのではないでしょうか。

使い古された言葉ですが、面接はあくまでマッチングの場なので、企業側も応募者側も等身大の自分が出せるよう、双方、良き準備が出来ると良いですね！

それでは！
ウェブアクセラレータのワンタイムURLの動作確認を簡単に

[さくらのクラウドのCDNサービス ウェブアクセラレータ](https://www.sakura.ad.jp/services/cdn/)のワンタイムURL設定時に動作確認のためにURLを生成するWebツールを作った話。 
（ただJavaScriptで書いただけです）

# ウェブアクセラレータ 動作確認用 ワンタイムURL 生成ツール
[ウェブアクセラレータ 動作確認用 ワンタイムURL 生成ツール](https://masa23.github.io/webaccel-onetime-web/)

# そもそもワンタイムURLって？
特定の時間までアクセス可能なURLを使える機能です。  

ざっくりいうと、`http://example.user.webaccel.jp/hoge.zip` などでアクセスすると403となりアクセスできないのですが、
特定のクエリストリングを付けてあげるとアクセスできるようになるURLを使う機能です。  
こんな感じのURLだとアクセスできる（サンプルなのでアクセスできません）
`http://example.user.webaccel.jp/hoge.zip?webaccel_secure_time=5d2d9453&webaccel_secure_hash=21d498aa696c35431cd2f0240d9eeb3a`

この、webaccel_secret_timeは有効期限でwebaccel_secret_hashはファイルパス、有効期限、シークレットなどから
生成するハッシュ値になっています。

生成方法は[こちら](https://manual.sakura.ad.jp/cloud/webaccel/manual/settings-site-onetimeurl.html#step1-url)をご覧ください。

# 今回の本題
ただ、ワンタイムURLの動作確認のためだけに、シェルを実行するのは面倒だなと思ったので、ブラウザ上でJavaScriptで 
生成するものを作りました。

[ウェブアクセラレータ 動作確認用 ワンタイムURL 生成ツール](https://masa23.github.io/webaccel-onetime-web/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117368/ceaf238c-9548-1201-c512-ff776f3822a7.png)


* ブラウザで処理するため、シークレットキーは外部に送信していません。
* シークレットキーは外部に流出すると、URLを生成できてしまうので本番利用時はJavaScirptでURLを  
  生成しないように（ブラウザにシークレットキーを教えない）でださい。

# 公式マニュアル

 * [【TIPS】特定のコンテンツを指定時間のみアクセス可能にしたい(ワンタイムURLを利用する)](https://manual.sakura.ad.jp/cloud/webaccel/manual/tips-onetimeurl.html)
 * [サイト全体ワンタイムURL機能の利用](https://manual.sakura.ad.jp/cloud/webaccel/manual/settings-site-onetimeurl.html)

# 関連記事（非公式）

* [ウェブアクセラレータを使ったコンテンツ保護](https://blog.masa23.jp/posts/2020/12/sakura-advent-calendar/)
* [有償コンテンツのHLS配信に、さくらのクラウド ウェブアクセラレータ（CDN）＋オブジェクトストレージ を組み合わせて使う](https://nozomi1773.hatenablog.com/entry/2021/12/21/120749)
【EBS volumeをsnapshot化して料金を節約する】

EC2は停止しているけれど、EBSの料金が発生してしまっています。
ただ、インスタンスを削除するほどでもないのでEBSの料金を節約したいなーとおもいました。
そこでEBSのvolumeを削除する代わりにsnapshot化してコスト節約します。
ここではそのプロセスを紹介してみようと思います。

## 現状の料金分析

EC2を停止しているのに、毎月この程度の金額がかかっている。

> 01/03 海外利用　１　AMAZON WEB SERVICES 利用国USA本人1回払い **¥ 1,750**
現地利用額 **$ 14.95** 変換レート **¥ 117.057**
> 

#### 為替レートの違和感
なんか若干、為替レートと変換レートがずれてる？と思って調べたらこのような記事が。

https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=GDVF7JHSLREZFKL4

> **注文確定時に表示される為替レートは、オンラインサイトまたは他の金融データベースにて公表されているレートと一致しない場合があります。**これらの公表為替レートは、通常、銀行間でのホールセール決済に適用される為替レートであり、小売り取引に適用できる為替レートではありません。Amazonでは、取引先銀行と交渉してより有利な外国為替レートを適用できるよう日々取り組んでおります。通常、通貨換算の為替レートは毎日更新されます。
> 

なるほど。それで若干金額が公表されてるレートで計算したときと合わなかったのか。

## EBSの料金

**$ 14.95**のうち、**1.92$**がEBSの料金でした。
現状は、**無料枠の30GB**が有効なようです。よって16GBにのみ料金がかかっています。
![C8CA7B97-E7AC-47A5-8FC2-EBD5BA87D747.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530710/38c7779b-6416-8429-f116-e54e0191e16c.jpeg)
> EBSの基本料金 → 1 か月にプロビジョニングされたストレージ 1 GB あたり 0.10USD
>

上記説明を見て、あれ、なんか請求のほうが高くね。と思ったら東京Regionだと **0.12USD/GB** らしい。少し高いんですね。

もし、無料期間が終わったら400円くらい料金が上乗せされてしまうので、今のうちにスナップショット化して料金を節約しようと思います。

### EBSをスナップショット化する

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-creating-snapshot.html#ebs-create-snapshot

volumeをsnapshot化すれば、0.50USD/1GB なので大体半額にコストを節約できるはず。
このあとvolumeは削除しました。
これでコストを節約できるはず。
GithubのDraft Pull RequestをCLIで作りたい

# 要約

GithubにサクッとDraftでPR作りたいだけなのにいちいちブラウザ開いてDraftを指定してPRを作るのが正直めんどいのでCLIでポチッとやるだけで作りたい。DraftでもPull Requestのテンプレートはちゃんと適用したい。

`gh` を入れて以下のコマンドでAliasを登録するだけでハッピーになれる！！！

```
gh alias set draft 'pr create --draft --fill --body-file .github/PULL_REQUEST_TEMPLATE.md'
```

# 今まで

- `git add hoge`
- `git commit -m "hoge"`
- `git push origin hoge`
- `https://github.com/tomtwinkle/xxxx/pull/new/hoge` でブラウザ開く ←めんどくさい
- Create Pull RequestをDraftに選択する ←こいつが地味にめんどくさい
- Create Pull Requestを押す ←めんどくさい
- DraftでPull Requestが出来た！

# これから

- `git add hoge`
- `git commit -m "hoge"`
- `gh draft`
- forkしてる場合はpushするRepositoryを選ぶ
- DraftでPull Requestが出来た！

Happy Hacking!!
IchigoJam Basic でビンゴタイピングゲーム


![スクリーンショット 2022-01-07 11.43.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83787/0e66c7ab-74c3-4278-7ec8-9dd05770513c.png)
# 遊び方
5文字 x 5文字　が出てきます。
下の NEXT KEY? --> のところに、１文字入力してください。
その文字が●に変わります。

たとえば、１列すべて●になったら　ビンゴ！ 
なんて感じで、お楽しみください。

終わるときはESCキーを押してください。

# プログラム
1 'BINGO TYPING GAME
5 CLS
10 FOR I=1 TO 5
20 FOR J=1 TO 5
30 LOCATE J*4,I*3
40 K=I*5+J
50 [K]=RND(25)
60 ?CHR$(65+[K])
100 NEXT
110 NEXT
200 LC 5,20:?"NEXT KEY? -->";
210 C=INKEY():IF C<>0 ?CHR$(C)
220 IF C=0 WAIT20:GOTO210
230 FOR I=1 TO 5
240 FOR J=1 TO 5
250 IF [I*5+J]=C-65 [I*5+J]=168:LOCATE J*4,I*3:?CHR$(65+[I*5+J])
260 NEXT
270 NEXT
2000 GOTO 200

#IchigoJam web でこのプログラムを見る
https://fukuno.jig.jp/app/IchigoJam/

画面右下のゾウさんのマークを押して
「ヒョウ」「アシカ」「オットセイ」
→「このプログラムを見る」
サポートモジュールでヘルパーメソッドの共通化

# 事前準備

-  モジュールを扱うファイルの先頭に下記の記述をする

```ruby
require "rails_helper" 
```

-  spec/rails_helper.rbの下記のコメントアウトを外す

```ruby
#　support配下にあるファイルを一つずつ読み込んでいる
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
```
#　モジュールを作成して使う手順

1. spec/support/[任意の名前]_support.rbのファイルを作成。今回は例として下記のモジュールを作成

```ruby
module SignInSupport
  # OmniAuthの環境をテストに切り替えている今回は例として下記のモジュールを作成
  # OmniAuthをモック化してGitHubのレスポンスとして引数で指定した値を返す
  def sign_in_as(user)
    OmniAuth.config.test_mode = true
    OmniAuth.config.add_mock(
      user.provider,
      uid: user.id,
      info: { nickname: user.name,
              image: user.image_url }
    )

    visit root_path
    click_on "GitHubでログイン"
  end

  def current_user
    @current_user
  end
end
```

2.　作成したモジュールを使うためのincludeをspec/rails_helper.rに下記のように書くことでrails_helper.rbを読み込んだすべてのファイルで使えるようになります。

```ruby
略
Rspec.configure do |config|
  config.include SignInSupport
end
略
```

spec別にモジュールをincludeしてもよい（下記）

```ruby
# （例）spec/system/〇〇_spec.rb
RSpec.feature 'Home', type: :system do
  include SignInSupport
end
```
DockerのPHPイメージのポート番号を変更する

# 背景
（思い出し記事）
コンテナ間通信で複数のPHPコンテナを利用した際、
ポート番号をずらす必要があった

# 問題
単純に `docker-compose.yml` でポート番号を指定しても通信できず…
PHP公式イメージにおいて、イメージ内に含まれている
`zz-docker.conf` で9000番固定となっていたことが原因だった

# 対処
`zz-docker.conf` を複製したファイルを用意し、置き換えることにした

```conf:zz-docker.conf
[global]
daemonize = no

[www]
listen = 9100 ← 任意のポート番号に変更したファイルを用意
```

`docker-compose.yml` の `volumes` の指定で、
上記で用意したファイルを
既存の `/usr/local/etc/php-fpm.d/zz-docker.conf` に対してマウントすることで上書き

該当箇所のみ抜粋

```yml:docker-compose.yml
services:
  php:
    volumes:
      - ./docker/php/zz-docker.conf:/usr/local/etc/php-fpm.d/zz-docker.conf
```

しました。
[Ruby]stringクラスのscanメソッド

学習したことのアウトプットとして


# scanメソッドとは
 Ruby本体に組み込まれているライブラリで、 require を書かなくても使うことが可能。
対象の要素(stringクラス)から引数で指定した文字列を数え、`配列として返す`メソッドです。
正規表現で括弧を含む場合は、括弧で括られたパターンにマッチした部分文字列の**配列の配列**を返します。

（例）

```ruby
"foobar".scan(/../)    # => ["fo", "ob", "ar"]
"foobar".scan("o")     # => ["o", "o"]
"foobarbazfoobarbaz".scan(/ba./)    # => ["bar", "baz", "bar", "baz"]

"foobar".scan(/(.)/)   # => [["f"], ["o"], ["o"], ["b"], ["a"], ["r"]]
"foobarbazfoobarbaz".scan(/(ba)(.)/) # => [["ba", "r"], ["ba", "z"], ["ba", "r"], ["ba", "z"]]
```
【Ruby】繰り返し②　timesメソッド

※初心者向け
※アウトプット練習の為

開発環境
rails 6.1.4.1
ruby 2.6.5


##問題内容##
1〜10までの数値を順番に足し合わせて、最後に全て足した結果をターミナルに出力するプログラムを書いてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2451862/46f590bf-1900-da13-522f-fc6139f48273.png)

**条件**:必ずtimesメソッドを使ってください。以下のようなプログラムはNGです。
**NGなプログラムの例**

```csharp
sum = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
```


##解答##

```csharp
sum = 0

10.times do |i|
  sum = sum + i + 1
end

puts sum

```
もしくは自己代入演算子+=を使って

```csharp
sum = 0

10.times do |i|
  sum += i + 1
end

puts sum

```

##解説##
今回の作成するのは、1〜10までの数字を順番に足し合わせていくプログラムです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2451862/e6523f49-0aa9-b581-cc94-ef811ebd9758.png)
このプログラムの考え方は以下になります。

**①合計値を保存しておく変数sumを用意する**
**②変数sumに1〜10の数値を順番に足していく**
**③順番に足していく処理をtimes文の繰り返しで置き換える**
**④変数sumの値をターミナルに出力**

**①合計値を保存しておく変数sumを用意する**
1に2を足し、
その結果に3を足し、
その結果に4を足し、
その結果に5を足し、...と10まで繰り返していきます。

よって常に結果を保存しておく変数が必要になります。これを変数名sumとして定義しておきます。まだ何も足してない状態なので、sumには0を代入しておきます。

```csharp
sum = 0
```

**②変数sumに1〜10の数値を順番に足していく**
変数sumに1〜10の数値を順番に足していくプログラムをそのまま書いてみましょう。

```csharp
sum = 0

sum = sum + 1
sum = sum + 2
sum = sum + 3
sum = sum + 4
sum = sum + 5
sum = sum + 6
sum = sum + 7
sum = sum + 8
sum = sum + 9
sum = sum + 10
```
自己代入演算子+=を使うことでより短い記述にできます。

```csharp
sum = 0

sum += 1
sum += 2
sum += 3
sum += 4
sum += 5
sum += 6
sum += 7
sum += 8
sum += 9
sum += 10

```

**このコードは非常に長く、かつ同じ処理が続いてるため、timesメソッドを使って効率的なコードに書き換えます。**

**③順番に足していく処理をtimes文の繰り返しで置き換える**
timesメソッドを使えば、何度も繰り返される同じ処理をまとめることができます。今回まとめられるのはsum += 数値の部分です。

timesメソッドは繰り返したい回数.timesと記載して繰り返す数を決めます。今回は1〜10まで順番に足していくため、10回同じような処理が繰り返されます。よって繰り返したい回数は10回です。

```csharp
sum = 0

10.times do |i|
  # 順番に足していく処理を書く
end
```

timesメソッドの中に繰り返したい処理を書きます。今回はsum += 数値を繰り返します。

```csharp
sum = 0

10.times do |i|
  sum += 数値
end

```

数値の部分はどうすればいいでしょうか。繰り返す回数ごとにこの数値は変わります。1回目は1、2回目は2、3回目は3となります。つまり、繰り返しの回数と同じです。
timesメソッドでは、変数iの中に繰り返しの回数が数値として自動で代入されます。よって、変数iを使えば繰り返しの回数を変数sumに足していくことができます。
ただし、プログラムなので1回目のiの数値は0となります。よってsumに足すのは1増やしたi + 1にしましょう。

```csharp
sum = 0

10.times do |i|
  sum += i + 1
end
```

**④変数sumの値をターミナルに出力**
最後にputsメソッドでsumをターミナルに出力すれば終了です。

```csharp
sum = 0

10.times do |i|
  sum += i + 1
end

puts sum

```
C＃でキーワードに基づいてPDFドキュメント内のテキストを検索し、テキストの背景色を設定する方法

##背景
PDFファイルを読んでいる時、コンテンツが多すぎて込んでいるため、閲覧したいコンテンツが簡単に見つからない場合はよくあります。こういう際は、PDF読み取りソフトの検索機能を使って、指定したテキストをすばやく見つけるのは一般的です。この記事では、C＃と無料のSpire.PDFコンポーネントを使用してこの機能を実現する方法を紹介します。

まずはC＃コンソールアプリケーションを作成し、NuGet Package ManagerでFree Spire.PDFを検索してインストールします、以下に示す通り：
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/6162e416-687f-b536-ba4d-f787ecbf2a77.png)

インストールした後、Free Spire.PDF dllはプロジェクトに自動的に参照されます。次は実現するために具体的な手順です。

###手順１　PDFドキュメントをロードする
```
PdfDocument pdf = new PdfDocument();
pdf.LoadFromFile("C:\\Users\\Administrator\\Desktop\\Input.pdf");
```
###手順２　キーワードに基づいてPDFページで一致するテキストを検索し、該当する各テキストの背景色を設定する
```
PdfTextFind[] AllMatchedText = null;
//全てのページをトラバースする
foreach (PdfPageBase page in pdf.Pages)
{
    AllMatchedText = page.FindText("コーギー").Finds;
    foreach (PdfTextFind text in AllMatchedText)
    {
        //デフォルトの背景色を黄色に設定する
text.ApplyHighLight();
    }
}
```
ApplyHighLight()メソッドは、デフォルトで背景色を黄色に設定します。色をカスタマイズする必要がある場合は、次のメソッドを使用します。
```
text.ApplyHighLight(Color.Green);
```
###手順３　ドキュメントを保存する
```
pdf.SaveToFile("FindAndHighlight.pdf");
```
操作した結果は以下のようになります：
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/9e5a50d6-9624-58e1-7c46-eb7d7f4eda11.png)

##完全なるコード：
```
using Spire.Pdf;
using Spire.Pdf.General.Find;

namespace FindText
{
    class Program
    {
        static void Main(string[] args)
        {
            PdfDocument pdf = new PdfDocument();
            pdf.LoadFromFile("C:\\Users\\Administrator\\Desktop\\Input.pdf");

            PdfTextFind[] AllMatchedText = null;

            foreach (PdfPageBase page in pdf.Pages)
            {
                AllMatchedText = page.FindText("コーギー").Finds;
                foreach (PdfTextFind text in AllMatchedText)
                {
                    text.ApplyHighLight();//デフォルトの背景色を黄色に設定する
                             //text.ApplyHighLight(Color.Green); //カスタム背景色を設定する
                }
            }
            pdf.SaveToFile("FindAndHighlight.pdf");
        }
    }
}
```
以上は今回のPDFテキスト検索および背景色の設定方法でした、最後まで読んでいただきありがとうございます。ではまた！
いわゆる強いエンジニアは何が強いのか

## はじめに

強いエンジニアと聞いてどんな人を想像するでしょうか？

「良いコードを書ける人」だったり、「コンピュータの仕組みを深く理解してコードが書ける人」だったりと人によってイメージする像は異なると思います。

幸いにも筆者の周りにはそういった方がたくさんいます。

じゃあ強いエンジニアって具体的に何が強いの？って部分をそんな方々の背中を約半年観察して自分なりに「こういうことか」という結論がついたのでそれを書いてみました。

## 強いエンジニアとは

筆者の結論からまず書くと、**課題解決能力が極めて高いエンジニア**だと捉えています。

それって具体的になんなの？というのを5つに絞って書きました。

:::note warn
エンジニアに対して強いという表現はどうなんだと言われてしまいそうですが、SNS各所でそういった表現を散見するので今回はそう書かせていただきます。
:::

## 1. 経験

まず1つ目は経験です。

なんだ経験なのかと思った方、その通りです。
経験は強いです。
解決してきた課題の数が違うのです。
なので課題解決能力に直結します。

良いコードというのは過去の経験（特に失敗）から生まれることが多いので冒頭でも書いた「良いコードを書ける人」というのはこの経験が積まれた結果なのかなと思います。

### どうしたら身につくか？
これに関してはひたすらトライアンドエラーを繰り返しながらコードを書くに尽きます。

強いていうなら**なるべくレビューをもらいやすい環境でコードを書く**ことだと思います。
レビューをもらうことで他者の経験を自分のコードに反映できるからです。


## 2. アウトプットの質

次にアウトプットの質です。

これはその人が書いたコードの質のことではなく、自分の持っている知識やノウハウを記事としてまとめる能力や、社内向けの開発ドキュメントをまとめる能力のことを指します。

具体的に該当するものは以下になります。

- 技術記事の質
- 社内ドキュメントの質
- 人に説明するときの質

### どうしたら身につくか？

記事、ドキュメントに関しては量をこなすことが1番の近道かなと思います。
筆者の場合はQiitaへの記事投稿を毎週欠かさずやっています。

人に説明する時の質に関しても繰り返しになってしまいますが、量をこなすことだと思います。
あとこれは経験談なのですが、上の記事やドキュメントを書くということをこなしていると自然と頭の中で伝えたいことが整理されていくので上と同じことをやると良いと思います。

良く言われていることですが、質を上げるためにはひたすら量をやるのが良いと思います。
しかし、ただ量をやるのではなく、毎回トライアンドエラーをすること。
これさえやればスピードこそ個人差はありますが必ず上達すると思います。

## 3. インプットの深さ

分かりやすく言うと、「課題にぶつかったときに1つのソースからどれだけ深い部分まで読み取れるか」です。

例えば、Aさんとその先輩のBさんがいるとします。

Aさんはとあるバグを直すために公式のドキュメントを読みましたが、具体的な解決策が見つからず、先輩のBさんに助けを求めました。
すると5分もかからないうちにBさんは同じドキュメントから解決策を立ててくれました。

同じドキュメントを読んでもどれだけ深い部分まで理解できるかです。
それがインプットの深さです。

### どうしたら身につくか？

自分のサービスを持っている人やプロジェクトにアサインされている方は不具合修正を率先してやるのがオススメです。

ただドキュメントを深く読めと言っても目的がないと上達しません。

なので目的を不具合修正において、量をこなすことが良いのかなと思います。

ちなみに筆者は英語のドキュメントが出ると途端にインプットが浅くなるので、英語のドキュメントを読みながらもスケジュール通りプロジェクトを終わらすことを今期の目標においています。


## 4. インプットの広さ

深さの次は広さです

これは解決方法をどこから得てくるかの、バリエーションの多さと言い換えられます。

課題にぶつかった際にまずやるのはググることですが、他にもyoutubeの動画だったり、podcastの音声だったり、Twitterで投げてみるみたいなものがあります。

情報を引っ張ってくるチャネルをどれだけ持ってるかがインプットの広さなのかなと思います。

### どうしたら身につくか？

周りのいわゆる強いエンジニアに聞きましょう、今すぐです。
これは簡単かつすぐできるようになるのでオススメです。

筆者はこれで、音声メディアからインプットする方法とTwitterで有識者をリスト化する方法を教えてもらいました。

## 5. コミュニケーション能力

最後はコミュニケーション能力です。

これはわからないことがあった時に、適切な人に、適切なタイミングで、聞きたいことを正確に聞き出す能力だと思います。

**適切な人**と**適切なタイミング**、**正確に聞き出す**が特に大事だと思っていて、
その課題に関する技術に明るい人に聞かなければ意味がありませんし、
その人にも業務があるので聞いて良いタイミングを知らなければなりません。

また、自分が何で困っているか、何を知れることがゴールなのかを相手に伝え、聞き出す能力も持っていなければなりません。

これがコミュニケーション能力です。

### どうしたら身につくか？

まず前提として必要なのが2で説明した`アウトプットの質`です。

というのも人に説明する能力がまず必要だからです。

それができたらどのタイミングで誰に正確に聞き出すかですが、これは筆者自身も最適解を模索中です。

なので筆者が今やっている方法を共有しようと思います。

1. 着手している課題の経緯を書く
1. それに対して試したことと結果を書いておく
1. 書いたもののリンクと併せて有識者に対して質問する

相談された側をなるべく短い時間で状況が把握できて、どれを試してダメだったかをスムーズに共有できるからです。

## 最後に

自分の中でもまだ整理している途中です。

これを読んで、「こんな特徴もあるよね！」というものがあったらコメントしていただけると新しい発見ができたりするので嬉しいです！

ではまた！
Docker の Jupyter でスクレイピングして KH Coder で解析する(2022)

# これはなに？
KH Coder の環境が整い始めたので、まずは何かをやってみようという事。この記事を読めば歌詞をもってきて解析できる（はず）と思います。

## KH Coder の Docker
[KH Coder を Docker で動かす(2022)](https://qiita.com/ryos36/items/9802b5da6d80d8d73eb5) で書きました。github においた [NL2E](https://github.com/sinchiba-backyard/NL2E) を clone して
その後、

```
$ git submodule init
$ git submodule update
$ docker-compose up -d
```

うまくいけば xeyes がでるので、そして、mysql が立ち上がった頃を見計らって

```
$ do.sh
```

とすれば立ち上がるはずです。（通しは未検証）

## Jupyter の Docker
[公式と思われるイメージ](https://hub.docker.com/r/jupyter/datascience-notebook/) を使いました。

KHCoder/wokrs/jupyter というディレクトリを作って Docker と共有させます。ディレクトリのパーミッションを Docker からアクセスできるようにしておきます。本当は 777 とかいうセキュリティの甘いことをしたくないですが、、、これは今後の改善ポイント。共用サーバなどの他人も使う環境ではこういうことはしないように。

```
$ mkdir KHCoder/works/jupyter
$ chmod 777 KHCoder/works/jupyter
$ docker run --rm -p 8888:8888 -v `pwd`/KHCoder/works/jupyter:/home/jovyan/work jupyter/minimal-notebook
```

この minimal-notebook ですが、どういうわけか jovyan さんのディレクトリとIDを作ります。立ち上げ時になんかすると変えられるのかもしれません。

たりないモジュールがあるので jupyter にインストール。ほんとうは conda を使うのが正しいかも。

```
$ docker exec -it <dockerのiD> /bin/bash
# pip3 install pandas
# pip3 install bs4
```

bs4 が何かは知りません。その後、表示されているホストでトークン付きの URL へ Go!

```
http://127.0.0.1:8888/?token=<表示されているトークン>
```

## スクレイピング
あとは先人の成果をコピペします。

[まとめてスクレイピングしちゃいたいよね](https://qiita.com/Yodaka_ay/items/2da4680917784eb91f49)
[Mr.children桜井さんの20代～50代における変化を歌詞から読み解いてみた　~KH Coder編~](https://qiita.com/mrbabyyy/items/15bd05b938f9db3b94d4)

まとめてスクレイピング超便利。でも対応サイトはそのうちまたどっかの料理サイトみたいにわざと壊れた HTML にしたり形式を変えたりしてスクレイピングできなくなるかもしれません。あと著作権にも注意しないとね。

### jupyter へコピペ
jupyter でいっこノートブックを使くります。そして、おもむろに「まとめてスクレイピングしちゃいたいよね」の Python のコードをコピー。そして貼り付け。中身は(私は)気にしません。URL という list を作ります。

おっとその前に csv というディレクトリを作っておきます。そうしないと折角とってきたのにファイルに落とすところでエラーになります。そんな時は jupyter なので、最後だけやり直せばよい（と思う）.

```
$ mkdir KHCoder/works/jupyter/csv
```

で jupyter にもどって URL という list をつくります。

```
URL= [['yorushika', 'https://www.uta-net.com/artist/22653/']]
```

ヨルシカだれ？という疑問は置いておいて、whole 関数を実行。私は最初ヨルシカという日本語を使ったのでヨルシカ.csv ができました。あとで yorushika.csv に名前を変えました(日本語ファイル名はトラブルのもとだから)。最初からアルファベットにしておいた方が無難です。

```
whole(URL)
```
やった！うまくいけば１曲目、、、とダウンロード(スクレイピング)を始めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99921/6cc287ea-2760-5723-021e-71bf249f1343.png)

### KH Coder で解析
あとは KH Coder で解析

- ヨルシカ.csv だったので事前に yorushika.csv に変更。
- 新規プロジェクトで該当 csv ファイルをオープン。
- 分析対象とする列として Lyric を選択
- 前処理
- ツール -> 抽出語 -> 共起ネットワーク

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99921/ea4cc66b-f62e-fed3-4eb8-08875de924e4.png)

こんな感じで解析するとできたっぽくない？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99921/07b6adf6-f072-453d-b0c6-49000aa66ab0.png)

### つぎは青空文庫だ!
青空文庫から情報を持ってこれそうな気がするので次はそこに行くよ。「こころ」を分析したのなら次は当然、「内田百閒」だよね。とおもって青空文庫調べると、、、ないのかよ。まぁいいや。ラフカディヨ・ハーンのむじな（だと思う）をとりあえず（コピペで)
解析。「顔 -> 撫でる」があって面白い。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99921/7294da11-20ca-2863-0bf3-dab084df8fb7.png)