OmniAICreator/Qiita-1.07M huggingface dataset:
X-Frame-Optionsについて

#はじめに
先日仕事でセキュリティに関する内容の仕事をしていたがそれまでクリックジャッキングって〜フィシングサイトって〜みたいな概念的な物しか把握してなかったので調べました。
もっと具体的に〜があって〜が問題で、だからこの設定が必要である。というもうちょっと掘り下げた内容を備忘録として残していきたいと思います。

#X-Frame-Optionsって？
ドキュメントより
> HTTP のレスポンスヘッダーで、ブラウザーがページを frame, iframe, embed, object の中に表示することを許可するかどうかを示すために使用されます。サイトはコンテンツ>が他のサイトに埋め込まれないよう保証することで、クリックジャッキング攻撃を防ぐために使用することができます。



つまりは他所のページやコンテンツを自分のページに挿入することができる。(HTML５でframeタグは廃止されています)
これで何が問題かというと、HTMLの仕組み上ページやオブジェクトを透過(opacity: 0;)させて重ねる(positionやz-indexなど)ことができる。

そのためURLは違えど見た目は全く同じなサイトをつくりだすことや、
見た目は違うがその機能が間接的に操作できるページを作ることができ、フィッシングサイトへ誘導したりクリックジャックなどのページができあがってしまう。

挿入していドメインなどを限定して許可または全て拒否するなどの対応ををすることでそれを回避する必要がある。

#X-Frame-Options
ドキュメント
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/X-Frame-Options
基本的にはこのふたつが設定できる
・DENY
　これを設定されたサイトは他サイトの全てにおいてページにコンテンツを表示(挿入)することができない　

・SAMEORIGIN
　これを設定されたサイトは他サイトで**オリジンが同じ**場合のみ許可(つまりオリジンが違うとifraneでページを挿入することができない)

実際にやってみている方もいるようなので試したい方はそちらを参照してください
https://qiita.com/mejileben/items/39d897757d5c3a904721

#X-Frame-Optionsを使いたいが
ただし注意すべき点として自社サイトで複数のオリジンをもっていてそれを表示されたい場合があったとします。
この場合X-Frame-Optionsを使うと他のオリジンに対してiframeなどで表示ができないようになってしまいます。

例
https://sample.com　にて設定
https://sample.jp　で　sample.comのコンテンツをiframeしたい場合

これについては「Content-Security-Policy」を代替手段として活用することができます。


参考URL
https://qiita.com/michiru-miyagawa/items/09b8c38beeb8d596992b
プロパティやメソッドの並び順テンプレート(C#)

## はじめに

以下の記事のC#版です。
[プロパティやメソッドの並び順テンプレート(Swift) - Qiita](https://qiita.com/uhooi/items/582a16f18e5b7b20c216)

## テンプレート

```cs
namespace ProjectName.Foo
{
    public class FooService : IFooService
    {
        #region Classes
        #endregion

        #region Enum
        #endregion

        #region Static Fields
        #endregion

        #region Instance Fields
        #endregion

        #region Static Properties
        #endregion

        #region Instance Properties
        #endregion

        #region Constructors
        #endregion

        #region IFooService Methods
        #endregion

        #region Other Public Methods
        #endregion

        #region Other Private Methods
        #endregion
    }
}
```
Unityでちょっとつまずいたとこまとめ

##はじめに
非プログラマーの初級者がUnity(2D)をいじっていてちょっとつまずいたところや小さい事項のメモです。
ちょくちょく更新する予定です。
基本出先にてスマホから投稿しています。

ほかにもこんなやり方があるよ！という場合は教えていただけるとうれしいです。

##RaycastHit2Dがnull
####やりたかったこと
プレイヤーが敵の索敵範囲内に入り、目視できるとプレイヤーを追いかける。
####実装方法
` Phyics2D.Raycast(Vector2D 敵の位置, Vector2D プレイヤーの相対的な方向, float 検出距離) `にてRaycastする。
プレイヤーのGameObjectが返されたら追尾モードに、壁などそれ以外なら現在の移動を続けるようにする。
####何でつまずいたか
RaycastHit2Dがnullを返す。
ときどきそれ以外が返ってくるが、プレイヤーのGameObjectではない。
####原因
プレイヤーのGameObjectのLayerがDefaultではなかった。
Raycast(2Dも3Dも？)がデフォルトで判定するのはDefaultという名前のLayer0のみである。
####解決方法
Raycastの引数にLayermaskを与えることで解決。
Layermaskはint型のため、
`int Layermask = 1 << プレイヤーのレイヤー番号 | 1 << 壁のレイヤー番号`を作成し、Raycastの第4引数で渡した。

##Interfaceを定義する場所
####やりたかったこと
敵の移動処理(歩く、飛ぶなど)で共通するランダムウォークの方向転換をInterfaceにて定義する。
敵の管理をするclassのUpdateにて一括で呼び出すため。
####何でつまずいたか
どこで定義すればいいのかわからなかった。
####解決方法
class内でないならどこでもいいみたい。
複数のInterfaceをまとめるため、Interfaces.csを作成してそこに記載した。
このスクリプトはGameObjectにアタッチするはない。
ダランベールの原理

# 慣性力

ニュートンの運動方程式
$$
    F=mA
$$
（$m$は質点の質量，$A$は質点の加速度，$F$は質点にかかる外力）を書き換えて，
$$
F-mA = F+I = 0
$$
とする．ここで，$I=-mA$を **慣性力** と呼び，この表式をダランベールの原理と呼ぶ．
これはニュートンの運動方程式の別形式というよりむしろ，より深い原理を表している．
外力$F$のかかる系は，慣性力$I$と釣り合っているとみなすことができる．
慣性力を導入することによって，動力学の問題を静力学と同様に扱うことができる．
**静力学において成立することは，動力学でも成立する**ということになる．

ただし，これによって動力学の問題がすべて即座に静力学の問題に変換され，釣り合いの式だけで定式化できるようになったわけではない．
当然のことながら，動力学の定式化は微分方程式によってなされるものであり，その積分に関して，慣性力がなんらかの示唆を与えるものでもない．

ダランベールの原理はある一瞬について成り立つものだから，時間がずれるとまた別の釣り合い状態に変化してしまう．
そこで，このややこしい問題から目をそらすため，**仮想変位**を導入することにする．
実際に系が運動してしまうと，外力と慣性力の釣り合いが崩れてしまうので，そのような変化の影響を受けず，釣り合いを保ったまま変位が発生したことを考えようというのが仮想変位である．仮想変位と実際の運動は当然異なる．

**仮想仕事**は，現在の力の釣り合い状態に対して仮想変位が発生したときに力がなす仕事のことである．静力学の条件では，系は完全に釣り合い状態にあるから，仮想仕事は必ずゼロになる．
ダランベールの原理から，慣性力を含めてしまえば，仮想仕事は動力学においてもゼロになる．
すなわち，系内$k$個目の質点にかかる「有効な力(effective force)」$F_k^{\rm e}$を
$$
    F_k^{\rm e} = F_k + I_k
$$
と定義する（$F_k$, $I_k$はそれぞれ質点にかかる外力と慣性力）と，
$$
    \sum_{k=1}^N F_k^{\rm e} \delta R_k= \sum_{k=1}^N (F_k + I_k) \delta R_k = 0
$$
が成立する．
「*与えられた幾何的な条件を満たすような変位に対し発生する可逆な変化（仮想変位）について，有効な力がなす仕事はゼロである*」という意味である．

# 運動方程式とは

逆に，ダランベールの原理が満たされているところから出発して考えてみよう．
ある系に外力が加えられたとする．外力は系に対して仕事をするから，仮想仕事はゼロでなくなってしまう．
このままではダランベールの原理が成立しなくなってしまうので，系は有効な力の仮想仕事がゼロになるように慣性力を発生させることになる．すなわち，系に対して外力が加えられたとき，ダランベールの原理が満たされるように，系には慣性力が（すなわち加速度が）発生することになる．
この釣り合いを定式化したものが，ニュートンの運動方程式である．

# Reference

C. Lanczos, "The variational principles of mechanics (Fourth edition)," Dover Publication, 1986.
DCモーターをM5StackでPWM制御してみた

ちょっとずつ電子工作に慣れてきたので、おとこのロマン、モーターの制御に手を出してみました。

モーターはギヤ付きの"タミヤ4速ウォームギヤボックスHE"を買いました。
![72008_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504156/dd16a488-2600-5ca9-af77-99c281acc4c2.jpeg)

# とりあえず動かしてみた
モーターにM5Stackの3.3V電源を与えただけ。当然動きますが、これだけだと速度制御はできないですね。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">PWM制御なし <a href="https://t.co/ybUpKeEdca">pic.twitter.com/ybUpKeEdca</a></p>&mdash; なまやつはし (@5xssUFaTa9UqFJx) <a href="https://twitter.com/5xssUFaTa9UqFJx/status/1325622102452441090?ref_src=twsrc%5Etfw">November 9, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# モーターの速度を変えるには
モーターの速度を変えるには入力電圧を変えれば良いそうで、電圧を低くすれば回転は遅くなるし、電圧を高くすれば速くなる。
ググったところ、M5Stackから出力電圧を変えるのは簡単にはできなさそうです。
そこでPWM制御というやり方があるそうです。
詳細は以下リンク先を参照ください。
https://monoist.atmarkit.co.jp/mn/articles/0706/06/news132.html

大まかにいうと、電圧の入力を高速でON/OFF切り替えて速度を変えるというもの。
周期内でのONの時間が長ければモーターの回転が速くなるし、OFFの時間が長ければ逆に遅くなる、というもの。
M5StackでPWM制御するやり方はネット上でそこそこあったので、これを試してみます。

# モーターの回転の向きを変えるには
PWM制御を試す前に、モーターの回転の向きを変えるにはどうすればいいのでしょうか。答えは簡単で、電流の向きを変えるだけです。
ただ、手動で配線を変えるのは簡単ですが、M5Stack単体で電流の向きを変えるのはできないようなので、これまたググってみたところ、モータードライバーなるものを使えば簡単とのこと。
早速買ってみました。
https://www.switch-science.com/catalog/5522/
![43430017-25d3-49dc-bec9-dc475b9219bb.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504156/ad392876-f7b6-b370-fd43-12eb29837415.jpeg)
2台までモーター制御できて、テストボタンがついていて、簡単にモーターの接続、操作、回転方向のテストできる、という初心者向けのもの。

# PWM制御でモーターを遅くしてみた
モータードライバーをM5Stackに繋げて、PWM制御でモーターの回転速度を落としてみました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">周波数2000hz デューティー比0.25 <a href="https://t.co/fjCHO5Qpe4">pic.twitter.com/fjCHO5Qpe4</a></p>&mdash; なまやつはし (@5xssUFaTa9UqFJx) <a href="https://twitter.com/5xssUFaTa9UqFJx/status/1325619130347606016?ref_src=twsrc%5Etfw">November 9, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ソースコードです。

```.cpp
#include <M5Stack.h>

const double PWM_Hz = 2000;   // PWM周波数
const uint8_t PWM_level = 8; // PWM分解能 16bit(1～256)
const uint8_t PWM_CH = 1;  // チャンネル

void setup() {
  M5.begin();
  M5.Power.begin();

  pinMode(26, OUTPUT); 

  // チャンネルと周波数の分解能を設定
  ledcSetup(PWM_CH, PWM_Hz, PWM_level);
  // モータのピンとチャンネルの設定
  ledcAttachPin(26, PWM_CH);
}

void loop() {
  M5.update();
  
  if (M5.BtnA.wasPressed())
  {
    // デューティー比0.25(64/256)でPWM制御
    ledcWrite(PWM_CH,64);
  }
  else if (M5.BtnC.wasPressed())
  {
    // ストップ
    ledcWrite(PWM_CH,0);
  }
  
  delay(10); 
}
```

# PWM周波数を変えてみた
PWM周波数を変えるとどうなるのか試してみました。

```.cpp
const double PWM_Hz = 20;   // PWM周波数
```

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">周波数20hz デューティー比0.25 <a href="https://t.co/3Q7sDLy9aE">pic.twitter.com/3Q7sDLy9aE</a></p>&mdash; なまやつはし (@5xssUFaTa9UqFJx) <a href="https://twitter.com/5xssUFaTa9UqFJx/status/1325619510804574208?ref_src=twsrc%5Etfw">November 9, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

見た感じ、速度はあんまり変わってませんが、明らかにカクついています。小刻みに震えてちょっとうるさいです。

# まとめ
モータードライバーとPWM制御でモーターの向きと速度を変えることができました。
次ははモーターで具体的な何かしらを作ってみたいと思います。
RailsのURLヘルパーで生成されるURLのスキーマをhttpsにする方法

超小ネタ。
RailsのURLヘルパーで生成されるURLは `http` ベースになってしまします。

```ruby
Rails.application.routes.url_helpers.root_url
=> "http://localhost:3000/"
```

これを `https` ベースにするには `protocol` オプションの指定が必要になります。

```ruby
Rails.application.routes.url_helpers.root_url(protocol: 'https')
=> "https://localhost:3000/"
```

毎回 `protocol` オプションを指定するのが面倒であれば、 `default_url_options` を設定することでデフォルトを変更できます。

```ruby
Rails.application.routes.default_url_options[:protocol] = 'https'
```

ちなみに次期Railsでは `Rails.application.config.force_ssl` が `true` の場合は自動でデフォルトが `https` になるようになりました。
(PR) https://github.com/rails/rails/pull/37480

もはやhttps化は常識ですので今更感はありますが、次期Railsがリリースされるまでは `config/initializers` 以下に書いておくと良いでしょう。

```ruby:config/initializers/protocol_default_to_https.rb
# force_ssl が true なら URL を https にする。
if Rails.application.config.force_ssl
  Rails.application.routes.default_url_options[:protocol] = 'https'
end
```
WindowsマシンでNode-Redインストール&起動

---
# 　WindowsでNode-RED
　　WindowsにNode-Redをインストールしてデフォルト設定で起動確認した時のメモ。

## 1. Node.jsのインストール
まずはNode.jsをインストール。以下でインストーラを取得。
デフォルトのまま次へ次へでOK。
https://nodejs.org/ja/


## 2. Node-REDのインストール
node-redをインストールする。コマンドプロンプトで以下を実行。

    C:\>npm install -g --unsafe-perm node-red

インターネットの接続環境がプロキシサーバーを経由している場合は、プロキシ設定を行う必要がある。
npmのプロキシ設定をする。コマンドプロンプトを開き以下コマンドを実行する。

    (例)
    C:\>npm config set proxy http://プロキシサーバー:8080
    C:\>npm config set https-proxy http://プロキシサーバー:8080


## 3. Node-REDを起動
Node-REDを起動する。コマンドプロンプトで以下を実行。
起動する

    C:\>node-red

コマンドプロンプトに以下のようなメッセージが表示されたら起動している。
実行中はコマンドプロンプトは開いたままにしておく。止める時はCtrl+C。

    5 Oct 15:47:58 - [info] Server now running at http://127.0.0.1:1880/


## 4. Node-REDを開く
WWWブラウザーでnode-redにアクセス。URLは上記の通り「http://127.0.0.1:1880/」
Blueprintの入力ピン出力ピンに同じ名前をつけてはならない（付けれる時がある）

# Blueprintの入力ピン出力ピンに同じ名前をつけてはならない（付けれる時がある）

PIE、Standaloneでの実行では起こらないのにLaunchなどで本番ビルドを実行すると例外を吐いて終了してしまうようになっていたのが、解決したのでメモ。

## 現象

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21596/7716c1c5-b9bd-a7cd-c082-f10dafc10a3e.png)

PIEではなんの問題もないのに、Launchで実行すると上記の箇所、``\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp``の2082行目、``UObject::execLocalOutVariable``内の``Out = Out->NextOutParm;``のところでOutがnullptrであるために例外を送出してクラッシュしてしまう。

## 原因

問題のBlueprint関数は、入力ピンにもValue、出力ピンにもValue、と同名をつけていた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21596/ca9d5a08-6500-8616-82f9-eb14f300dae9.png)

解決してしまったあと、再現しようと同名を設定しようにも上図の通りはねられてしまうので、本来であればこのエディター上でのチェックで同名にならないよう保証されているようなんですが、何らかの手順を踏めばこのチェックをすり抜けて入力ピンと出力ピンに同名を与えることができてしまうようです。

そしてこの状態でもPIEでは意図通りに動作してしまうため、Launchするまで異常に気づかなく、メモリ破壊やタッチの差でインスタンスが制作されてないまま処理が流れてくる時がPIE以外ではある、などの別の原因を疑って全く無意味な検証で時間を無駄にする、というわけです。

Blueprintはできないことはそもそも描けないようになっているはずだから…とデバッガを接続して例外を吐いたノード名は把握しているのにそのBlueprint関数の記述に問題があるなどとは露ほども疑わなかったのが敗因でした。

入出力ピンに同名をつける手順は再現していません。どうやって付けたんだ…？
[ES6] Arrayクラスメソッド超簡易まとめ

### [Array.prototype.forEach](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)
```react
const number = [1, 2, 3, 4, 5];
let result = 0;

number.forEach((num) => {
	result += num;
})

console.log(result);
// => 15
```

### [Array.prototype.map](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map)
```react
const number = [1, 2, 3, 4, 5];

const result = number.map((num) => {
	return num + 2
});

console.log(result);
// => [3,4,5,6,7]
```

### [Array.prototype.reduce](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)
```react
const number = [1, 2, 3, 4, 5];

const result = number.reduce((sum, num) => {
	return sum + num;
}, 0);

console.log(result);
// => 15
```

### [Array.prototype.some](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/some)
```react
const number = [1, 2, 3, 4, 5];

const result = number.some((num) => {
	return num == 3;
});

console.log(result);
// => True
```

### [Array.prototype.every](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/every)
```react
const number = [1, 2, 3, 4, 5];

const result = number.every((num) => {
	return num == 3;
});

console.log(result);
// => False
```

### [Array.prototype.filter](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)
```react
const number = [1, 2, 3, 4, 5];

const result = number.filter((num) => {
	return num % 2 == 0;
});

console.log(result);
// => [2, 4]
```

### [Array.prototype.find](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/find)
```react
const number = [1, 2, 3, 4, 5];

const result = number.find((num) => {
	return num % 2 == 0;
});

console.log(result);
// => 2
```


### 参考
[MDN Array](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array)
Debian上でRaspberry Pi Zero向けクロスコンパイル ～共有ライブラリを使ってみる

# 概要
Debain上でコンパイルしたC言語のプログラムをRaspberry Pi Zeroで動かします。
共有ライブラリとか使える環境にしたいです。
とりあえず、`libusb`とか`libjpeg`とか使えるようにします。

[Ubuntu上でRaspberry Pi Zero向けクロスコンパイル事始め](https://qiita.com/manontroppo1974/items/a6bcef67285c10edff77) の続きですが、ホストマシンをDebianにして再挑戦しています（理由は後ほど）。

# 環境

ホスト： Debian 10.6.0 < Virtual Box 6.1 < WIndows10
ターゲット： Raspberry Pi Zero WH

# 手順
## ARM向けコンパイラのインストール

```shell
$ sudo apt install crossbuild-essential-armel
```

[前回](https://qiita.com/manontroppo1974/items/a6bcef67285c10edff77)は`g++-arm-linux-gnueabi`をインストールしてみましたが、`crossbuild-essential-armel`に含まれているようなのでこちらをインストールしてみます。結局使うのはgccなんであんまり大差ないですけど。

## 共有ライブラリのインストール

アーキテクチャを追加して、、

```shell
$ sudo dpkg --add-architecture armel
```

`sources.list`の編集。`apt`が参照するリポジトリを追加してやります。

```shell
$ sudo nano /etc/apt/sources.list
```

`sources.list`の一番下に以下を追加。
armelの場合はftp.jp.debian.orgも参照するようにします。

```shell:/etc/apt/sources.list
deb [arch=armel] http://ftp.jp.debian.org/debian buster main
```

アップデートして、ライブラリをインストール。
`:armel`を付与することで`armel`向けのライブラリを取得することができます。

```shell
$ sudo apt update
$ sudo apt install libusb-dev:armel
$ sudo apt install libjpeg-dev:armel
```

多分、Ubuntuのarmel向けにパッケージが公開されていればそれを`sources.list`に追加して、Ubuntuでも同じことができると思うのですが、Ubuntu向けのarmelパッケージを公開しているところが見つかりません。

試しにUbuntuでftp.jp.debian.org/debianを追加してみましたが、「署名されてません」みたいなエラーが出てインストールできませんでした。そりゃそうか。

強引にインストールする方法はあるのかな？（.debを持ってきてのインストールはできたけど依存関係が大変なことになったので諦めました）

# ビルド
今回ビルドしてみるプログラムはこちら。

```c:testUsbLib.c
#include <stdio.h>
#include <usb.h>

int main()
{
    printf("call usb_init()\n");
    usb_init();
    printf("OK\n");

    return 0;
}
```

`usb_init()`を呼ぶだけという何の役にも立たないプログラム。
`usb_init()`の後片付けもしません（何かする必要あったっけ、、？）。

こちらをビルド。

```shell
$ arm-linux-gnueabi-gcc -march=armv6 testUsbLib.c -o testUsbLib_armv6 -lusb
```

# 動作させてみる

上でうまくビルドができれば生成された`testUsbLib_armv6`をRaspberry Pi Zeroの適当なフォルダにコピーして、、

```shell
$ testUsbLib_armv6
call usb_init()
OK
```

と、こんな感じで動きます。
何も起こりませんが、、

# まとめ
`libusb`は依存関係が少ないので.debファイルを取得してきての手動インストールでもどうにかなりますが、`libjpeg`などは依存関係が多く、手動では手順が多すぎてあきらめました。今回の方法では依存関係含めてインストールしてくれたのでなんとか動いたようです。

ちなみに今回の方法で`libusb`、`libjpeg`の他に`libtiff`の動作も確認しています。

あとはUbuntuで同様の方法が使えるのか（armel向けパッケージを公開しているところがあるのか等）についてご存じの方がいらっしゃいましたら教えてください。

# 追記
続きの記事を書きました。

* [Debian上でRaspberry Pi Zero向けクロスコンパイル ～自作の共有ライブラリを作ってみる](https://qiita.com/manontroppo1974/items/652d92bad76aaa75e7d9)
『外付けHDDが0バイト/セクタと認識される』からデータを復元する

重要なデータをバックアップした外部ハードディスクが故障し、0バイトが表示され、ファイル形式がRAWに変更されました。 なぜこれが起こっているのですか？<a href="https://jp.bitwar.net/course/format/2571.html">『外付けHDDが0バイト/セクタと認識される』マイクロソフト セーフティスキャナー</a>

外付けハードドライブ0バイト使用/空き容量RAWの場合、データも失われることがわかっています。0バイトを示す外部ドライブからデータを復元する方法は？特定の方法を使用して簡単に実行できます。 データを簡単に復元できるいくつかの方法を次に示します。

0バイトを示す外部ドライブの考えられる理由


●不良セクタとデータがトラップされます！ すべてのデータがRAWになります。 これは、ドライブ内のデータがシステムによって未処理であることを意味します。

●適切にイジェクトせずに外部ドライブを取り外します。

●ウイルスまたはマルウェアが原因。

●使用中に誤って電源が切れる。

●フォーマット中の中断など。


0バイトを示す外付けHDDからデータを復元する方法


私たちは皆知っていますが、パーティションを修復するよりもデータの復元が重要です。したがって、使用済みスペースが0のままである場合にデータを取得する方法がいくつかあります。以下の詳細ガイドに従ってください：


＃1 外付けHDDの名前を変更する


PCのディスク管理ツールを使用して、外付けHDDの名前を変更できます。

 1、WINキー+ Rを押し、Diskmgmt.mscと入力して、[ディスクの管理]ウィンドウを開きます。

 2、PCに存在するすべてのドライブが表示されます。破損したドライブを右クリックします。 「ドライブ文字とパスの変更」をクリックしてください。

  3、次に、「変更」をクリックして、別のドライブ文字を選択します。

  4、[OK]を選択して確認します。次に、プロンプトが表示されたら「はい」をクリックします。もう一度[OK]ボタンをクリックして確認します。


システムを再起動して、名前を変更した外部ドライブ上のファイルを確認します。


＃2 Microsoft Safety Scannerを使用する


マルウェアやウイルスが原因で外部ドライブにこのような状況が発生した場合、このマイクロソフトセーフティスキャナーを使用できます。これは、Microsoftからの無料ダウンロードソフトウェアでもあります。


これにより、システム内のすべてのウイルスが削除されます。部品またはセクターが影響を受ける場合、ソフトウェアはそれを完全に修復し、関連データも削除されます。ソフトウェアをダウンロードして、ウイルス対策プログラムを実行するだけです。次に、システムを再起動してファイルを取得します。


ここで述べたこれらの方法は両方とも、あまり信頼できません。これは、試行錯誤のみの方法です。これらの方法では、破損した外部ドライブからデータを復元することは約束されていません。また、これらの方法はWindows OS専用であり、Mac OS用ではありません。


理想的な選択は、効率的で便利なデータ復元ソフトウェアを使用することです！


＃3 効率的で便利なデータ復元ソフトウェアで外付けHDDが0バイト/RAWと認識されるデータを復元


誰でもいつでもハードディスクの問題を経験できます。これにより、データが危険にさらされ、永久に失われる可能性もあります。


Bitwar Data Recoveryソフトウェアは信頼性が高く、MacまたはPCで使用できます。 0バイトの問題の場合、ソフトウェアは元のファイルシステムを検出できます。 NTFSの場合、ドライブのタイプがNTFS_RAWとして表示され、クイックスキャンモードを使用して元のファイル名、ファイルパス、およびフォルダー構造でデータを取得できます。


また、最高の復元率が必要な場合は、Bitwar Data Recoveryを選択する必要があります！

   詳しくは、「<a href="https://jp.bitwar.net/course/format/2571.html">『外付けHDDが0バイト/セクタと認識される』からデータを復元する方法</a>」をご参照ください。
jQueryを使ったスライダーメニューの実装

# はじめに
ヘッダーバーに、マウスオーバーした際に出現するスライドメニューを作ります。
(自分自身の備忘録として記します）

# 完成イメージ
![dropDownMenu.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683220/ab6287bb-44d6-4a8e-99b5-429e1bacba0b.gif)

# 環境
MacOS 10.15.7
ruby 2.6.5
Ruby on Rails 6.0.0

# 前提条件
jQueryの導入が完了済みであること。

# 作業していきましょう！

### ①htmlを作成

```erb:html.erb
<%# ログインユーザーの名前・アイコン表示 %>
      <div class="loginUser">
        <div class="loginUserInfo">
          <div class="loginUserInfo__Avatar">
            <%= image_tag current_user.image.url, class: "loginUserInfo__Avatar--image" %>
          </div>
          <span class=loginUserName>
            <%= current_user.name %>
          </span>
          <i class="fas fa-caret-down"></i>
        </div>
        <%# スライドメニューバー（マウスオーバー時出現） %>
        <ul class="dropDownMenu">
          <li>
            <i class="fas fa-user"></i>
            <%= link_to "マイページ", "/users/#{current_user.id}", class:"loginMenu" %>
          </li>
          <li>
            <i class="fas fa-plus-square"></i>
            <%= link_to  "投稿する", new_post_path, class: "loginMenu" %>
          </li>
          <li>
            <i class="fas fa-sign-out-alt"></i>
            <%= link_to "ログアウト", destroy_user_session_path, class:"loginMenu", method: :delete %>
          </li>
        </ul>
      </div>
```

scssは次の通りです。

```sass:scss
// ログインユーザーのアイコン・名前
.loginUser {
  width: 200px;
  height: 50px;
  margin-left: 5%;
}
.loginUserInfo {
  display: flex;
  align-items: center;
  &__Avatar {
    width: 40px;
    height: 40px;
    &--image {
      height: 100%;
      width: 100%;
      border-radius: 50%;
    }
  }
}
.loginUserName {
  font-size: 0.7em;
  margin-right: 5px;
}

.dropDownMenu {
  width: 200px;
  display: none;
  margin-left: -5px;
  margin-top: 5px;
  padding: 0;
  text-align: center;
  background-color: rgba($color: #222222, $alpha: 0.95);
}
.dropDownMenu li {
  cursor: pointer;
  width: 100%;
  padding: 2vh 0;
}
.dropDownMenu li a:hover {
  text-decoration: none;
  color: #00bfff;
}
```

以上です。

### ②jsファイルにjQueryにて処理を記述
usermenu.jsというファイルを新規作成して、そこにスライダー処理の記述を行います。

```javascript:usermenu.js
$(function() {
  // loginUser上にオンマウスした時に発動するイベント
  $(".loginUser").hover(function(){
    //slideToggleメソッドを使ってスライドメニューを表示させる。
    $(this).children(".dropDownMenu").stop().slideToggle();
  });
});
```
hoverメソッドを使って、loginUserクラス上にマウスが乗った時に、slideToggleメソッドを使って、
スライドメニュー（.dropDownMenu）を呼び出します。

stopメソッドはhoverするたびに同じ処理が発動しないようにするための記述となります。

以上となります！
[初心者向け] イメージで覚えるデータ構造：static vs dynamic array編

シリーズものです．[前回](https://qiita.com/bridget462/items/019aecae42543b1369e7)は配列のデータ構造について説明しましたが，実は配列には静的`static`，動的`dynamic`の2種類がありメモリの使い方が少し違います．

この記事ではそれの違いをイメージで説明しようと思います．





## `Big O`



| method            | static | dynamic       |
| ----------------- | ------ | ------------- |
| push (to the end) | O(1)   | O(1), or O(n) |
| memory size       | O(n)   | O(2n)         |

違いは要素を最後尾に追加する`Big O`だけです．Arrayの詳しい`BigO`については[前回の記事](https://qiita.com/bridget462/items/019aecae42543b1369e7)で説明しています．



ではなぜこのような表になるのか見ていきましょう．



## static arrayのメモリ

静的配列では配列を作る**前**にその大きさを指定します．何も特別なことではないと感じるかもしれませんが，この場合要素を追加したい時に配列の最後尾の次のメモリが空いている保証はありませんよね．もし既に使われている場合は要素を追加することができなくなってしまいます．

これは配列がメモリを連続で使う，という縛りがあるからです．

```c
myStaticArray[3]; // defining size of the static array
myStaticArray[3] = { "a", "b", "c" };

myStaticArray.append('d') // ?
```

> 参考：[Dynamic vs static array in c [closed]](https://stackoverflow.com/questions/35442414/dynamic-vs-static-array-in-c)


![static-array.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472945/a9873866-3f60-29ea-adcd-9244635d0cac.png)









## dynamic arrayのメモリ

動的配列では配列を編集しようとした際にメモリが他に既に使われてしまっている場合，全く別の，連続で配列の倍の数のメモリが空いているところにコピーして編集します．

こうすることでメモリを連続で使う，という縛りを受けつつ新しい要素の追加などにも対応できるということですね．

ただし配列全体を動かす必要があるので`O(n)Time`かかってしまいます．これは毎回起こるわけではなく，新たにメモリを見つけないと処理できない場合のみに起こるので`dynamic array`で要素を追加する`BigO`は，ほとんどの場合`O(1)Time`だけど，配列を動かす必要のある場合のみ`O(n)Time`となるわけですね．

![dynamic-array.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472945/3e60ca32-fa6f-ad13-b906-e9544093ea64.png)




まとめると：

- `dynamic`
  - メモリを動的に多め（2倍）に確保する
    - Good：配列のサイズを定義していなくても要素を自由に追加できる
    - Bad：メモリ消費が倍
    - 処理によっては配列全体を動かす必要がある
- `static`
  - メモリは配列のサイズを最初に定義した分だけ確保
    - Good：メモリ消費量が少なくて済む
    - Bad：初期サイズを超えるような処理ができない



次はHash Tableについて記事を書こうと思います．
p5jsでの基本的な書き方（メモ）

#p5js
　https://p5js.org/

#p5jsの基本
ランダムに円を描画していくだけならこんな感じ

```html:
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>p5描画メモ</title>
  </head>

  // p5.jsをCDNから読み込み
  <script src="https://cdn.jsdelivr.net/npm/p5@0.10.2/lib/p5.js"></script>

  <script>
      // 最初に一回実行される
      function setup(){
        // キャンバスを作成
        createCanvas(600,425);
        // 背景色
        background(255);
        // 図形の線無し
        noStroke();
      }
      // 1フレーム（1/60秒）ごとに実行される
      function draw(){
        // オブジェクトの色をランダム（透明度70）
        fill(random(255),random(255),random(255),70);
        // キャンバスにランダムの丸を描画
        ellipse(random(width),random(height),random(100));
      }
  </script>
</html>
```

**preloadで画像の読み込みができる**

```javascript:
function preload() {
  // preload() runs once
  img = loadImage('assets/laDefense.jpg');
}
```
**imageで画像を描画できる**
>image（img、x、y、[width]、[height]）
>>img：表示する画像
x：画像の左上隅のx座標
y：画像の左上隅のy座標
width：画像を描画する幅
heifht：画像を描画する高さ

>image（img、dx、dy、dWidth、dHeight、sx、sy、[sWidth]、[sHeight]）

```javascript:
function draw(){
  image(img, 0, 0);
}
```
nginxのk8sコンテナに独自のnginx.confをマウントする

メモがてら投稿です

# 独自のnginx.confをマウントする
通常`/etc/nginx/conf.d`にconfファイルをマウントすることで（デフォルトの）`nginx`イメージにnginx設定を行えます。
ただしこの場合、`worker_processes`などルートに書き込む必要のある設定が行えません

## subPathを使ってマウントする
```
apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
          - name: nginx-root-conf
            mountPath: /etc/nginx/nginx.conf # マウント先指定
            subPath: nginx.conf # 特定のファイルをマウント
      volumes:
      - name: nginx-root-conf
        configMap:
          name: nginx-root-conf
          items:
            - key: nginx_root.conf
              path: nginx.conf # ファイル名を変更
---

```
Scrum Fest Sapporo Day 1 参加レポート「 (自称)エバッキーの愛弟子！が札幌でエンタープライズシステム開発のスクラムマスターをしてみたお話」

# Scrum Fest Sapporo Day 1 「 (自称)エバッキーの愛弟子！が札幌でエンタープライズシステム開発のスクラムマスターをしてみたお話」

2020/11/06に開催されたScrum Fest Sapporoの発表です。
https://confengine.com/scrum-fest-sapporo-2020/proposal/14191

# チーム参加してきました

[aslead Agile](https://aslead.nri.co.jp/solution/aslead_agile.html) のチーム「[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu?slide=3)」にて参加してきました。
チーム7人中、3人で参加して、その場で実況しつつ、記事も作っています。

# トーク概要
大規模なSIプロジェクトにスクラムマスターとして参画している、山本さんのお話。
もともとはウォーターフォール開発のSIを20年ほど経験されていた。

# スクラムに興味を持ったきっかけ
以前いた日本企業の社風や組織風土を外から変えていくとは？を勉強したときに行きついたのがスクラム。
そしてアジャイルというワードをきくようになったこともきっかけのひとつ。

# 今やっていること
フロント・基幹・分析とスコープが幅広いプロジェクト。
プロジェクト人数は400人超える規模で、複数のスクラム・複数のリモートロケーションから成るチーム。

# プロセスとスケジュール
全てをアジャイルでやっているのではなく、
ビジネス計画やテスト・リリースはウォーターフォール、開発はアジャイルというスタイル。
1スプリントはだいたい1から2ヶ月くらい。

# 1年半やっていたこと
コンポーネントチーム、テクノロジカットでチームを作っていた。
だんだんと弊害がでてきたので、いわゆるフィーチャーチームに変わってきた。
コンポーネントチームでの弊害も多かったが、メリットもあった。
技術ありきの雰囲気はよくなったが、チーム間の依存関係性整理がスクラムなのにめんどくさい状態になっていた。繁閑格差も多々。

# 分業体制によるスクラムの不安定化
テストチームは、分業していることでデメリットも多かったが、メリットもあった。
一部はウォータフォール、一部はスプリントで行っている。
単純に、すべてスクラムで対応しても問題は起こる。

# スクラムマスターとして目指すべき方向性、Visionは？
現状を早く論理的に分析して、あきらめずに変えていくことが大切だと思っている。
勇気、精神力、忍耐力、交渉力が大切。
また、可視化、ロジカルシンキングをもって、人に説明していくことが非常に重要と感じている。

# チームメンバーの感想
- ウォータフォール型とスクラム型が混ざっていて、一見アンチパターンのようにも見えるけれども、それでもメリデメがあって面白いなと思いました。
- ウォータフォール型からスクラム型に移行することを検討しているチームにとって、とてもためになる話だったと思います。まだウォータフォール型が主流の企業だと、急にやり方を変えるより、この方法から始めた方がいいと思いました。
- 大規模スクラム難しいんだなとあらためて感じました。。スプリントの期間だったり仕様のまたがりだったり色んな要素があって、スクラム初心者的にはかなり複雑でした。
Pythonでタワレコのサイトから作詞作曲編曲情報を引っ張ってくる

#はじめに
今回は簡単なスクレイピングをやっていこうと思います。
サブスク全盛期にローカルで音源を集めててなおかつ作詞作曲編曲までタグ付けしてる物好きはほとんどいないと思いますが、もしいたらこれで簡単にタグ付けができるので紹介していきたいと思います。

#やってみよう
まずタワレコのサイトの構造です。肝心な情報が詰まってるxpathは調べて見るとつぎのような感じでした。
`//*[@id="RelationArtist_0_1_sub"]/div/div[3]/div[2]/a/text()`
これでDisc1の1曲目の作詞情報を表します。前の数字からDiscNumber,TracNumber,作詞or作曲or編曲ですね。最後の数字は弄らないでください。
では実際にコードを書いてみましょう。使用するライブラリはlxml(スクレイピング)とurllib(ネット周り)とmutagen(楽曲タグ関連)です。

```python:tagget.py
om mutagen.flac import FLAC
from urllib import request
import requests
from lxml import html
import os
import requests
import json

class Net():
    def Tower(self, no, html2, disc, item):
        content = list()
        if item=="W": #作詞作曲編曲のどれかを判断して適切な数字をいれます
            i = "3"
        elif item=="C":
            i = "4"
        elif item=="A":
            i = "5"
        contentr = html2.xpath('//*[@id="RelationArtist_'+str(disc)+'_'+str(no)+'_sub"]/div/div['+i+']/div[2]/a/text()') #場所を指定

        try:
            content.append(contentr[0].strip('\'').strip()) #スマートじゃないですが複数の値が入ってた場合に対応します
            content.append(contentr[1].strip('\'').strip()) #forかWhileを使おうね！
            content.append(contentr[2].strip('\'').strip())
            content.append(contentr[3].strip('\'').strip())
        except IndexError:
            print(content) #値が入らなくなったらErrorを出してどういうタグを取得したのか出力させます
        return content

class Main():
    def Towerget(self,files,url):
        n = Net()
        r = requests.get(url) #ページを読み込む
        html2 = html.fromstring(r.content) #ページをパースにかける
        for f in files:
            tag = FLAC(f) #タグを読み込んでます
            no = tag['tracknumber'][0].lstrip("0") #僕は1桁のDiscNumberを0xと入力してるのでタワレコにあわせて整形
            disc = int(tag['discnumber'][0].lstrip("0")) - 1 #discを表す数字は0からスタートなので調整します
            print(no)
            tag['word'] = n.Tower(no, html2, disc, item="W") #作詞タグ入力
            tag['composer'] = n.Tower(no, html2, disc, item='C') #作曲タグ入力
            tag['arranger'] = n.Tower(no, html2, disc, item="A") #編曲タグ入力
            tag.pprint() 
            tag.save() #タグを保存

os.chdir("E:\music\未整理\打首獄門同好会 - 獄至十五") #タグ付けするファイルのファイルパスです
files0 = os.listdir(os.getcwd()) #フォルダのファイル一覧を収得
files = list()

for f in files0: #同じファイルにGoogleDriveの管理ファイルやジャケット写真等が入ってたりするのでflacだけ取り出す
    if f.endswith(".flac"):
        files.append(f)
        print(f)
    else:
        print("not "+f)

m = Main()
url = "https://tower.jp/item/4936516/獄至十五" #タワレコのページのURLです
m.Towerget(files, url)
```

あんまりキレイなコードではありませんがこれで一応収得できます。

#改善点
・Overtureなど歌なしで作詞の設定がない曲はズレる。
・タワレコが編曲を入力していない事がある。
・タワレコのページのURLも自動収得したいなぁ(これは難しそう)。
【Vue・JS】！(否定)で真偽値を返す際の注意点。式はカッコで囲む。

Vueのif文で`！`を使う際に思った挙動にならなかったので注意点のメモ。

##!（否定）の注意点
if文の式の頭で`！`を使う時は、**式をカッコで囲む**。

例：配列arrの要素数が1以外の場合は処理を実行する場合。

```js:OK
 if(!(this.arr.length == 1)){
        処理
      }
```

```js:NG
 if(!this.arr.length == 1){
        処理
      }
```


##NG内容
上記NG事例のようにカッコで囲まないと、!this.arr.lengthの値が１かどうかを判定することになる。

0, null, undefinedはfalseとみなされるため、配列arrの要素数が空（または0、null、undefined）の時以外、`!this.arr.length`はfalseとなる。

よって、１以外で処理実行したいところが、0のみで処理実行で、１以上は処理実行しない結果となる。


```js:例
arr = [1,2,3]

console.log(!arr.length) 　//false
console.log(!arr.length == 0) 　//true (false == false)
console.log(!arr.length == 1)  //false (false == true)
console.log(!arr.length == 2) //false (false == true)
console.log(!arr.length == 3) //false (false == true)
```



<br>
##OK内容
`!`の後ろの式をカッコで囲むと、その式の結果の否定が返るので、意図した形になる。

`!(this.arr.length == 1)`



<br>
ちょっとしたことだけど、基礎は重要。。
GASやらスプレッドシートやらNuxtjsでなんとかしたイベント予約の設計の話

知り合いからの依頼で作って運用した、
小規模イベント用の予約システムを
設計メモだけでも残して供養します。

## 要望

* イベント内でブースは複数且つ席数上限あり、参加者はあらかじめ**「ユーザー登録」**し**「見たいブースの予約」**をする
* 公開は基本的にLPページのみ。（ユーザーページ？ 作ってもいいよ！）
* 予約は「フォーム送信で仮登録」「ユーザー動作で登録有効化」と段階を踏むこと
* 一定時間は仮予約状態でもブースの席を押さえられるように！
* **仮予約のフォームはLPに埋め込むこと。また、「入力・確認・修正・送信」できるように！**

### ユーザーシナリオ

1. ユーザーがLPページにアクセスし、フォームから「ユーザー登録」「イベント予約」を実行
2. バックエンド側で仮登録処理→本登録用リンクをメール送信
3. ユーザー側で本登録用リンクをクリック（ページにアクセス）
4. ページが開かれた際にバックエンドにユーザー有効化をリクエスト
5. 本登録完了

### 使用したサービス

* Firebase …… ホスティング、運営側の認証で利用。小規模サービスで便利すぎる。
* Nuxtjs …… ページ作成・処理で利用。
* Google Apps Script …… doGet、doPostを用いたNuxtjsのバックエンド処理。
* スプレッドシート …… DBの代わり。また、一部クエリ処理的なものをスプレッドシート関数で代用。
* googleフォーム …… スプレッドシートに新規登録する際の排他処理代わり兼データバックアップ

※当初バックエンドはLaravelで作ることも考えたが、規模が大きくなるのが嫌だったので上記の構成に。
　それに、**スプレッドシートでデータも見えるから、エクセルにコピペもできて便利でしょ？**とか考えてた。

### どう作っていったか

前後するので、各サービスの役割だけ。

#### Firebase

hosting機能はほぼそのまま使った。
せいぜいhostingの設定で、firebase.jsonの「trailingSlash」をfalseにしてURL末尾のスラッシュを失くしたこと、
headersでキャッシュの設定をしたことくらいか。

Authenticationは運営側のみの利用のため今回は割愛。

#### google apps script

色んなサービス連携で便利。
おおまかには以下の内容で処理を行い、データを返す形とした。
また、仮登録・本登録時は「gmailapp」を用いて
本登録用リンク記載メール（仮登録有効時間内アクセスで本登録化）、
本登録完了メールを送信した。

* doGet
    * 予約状況のjson
* doPost
    * ユーザー重複登録チェックのvalidate（OK/ErrorMessage）
    * 予約可否のvalidate（OK/ErrorMessage）
    * ユーザー、ユーザーブース予約の仮登録（true/false）
    * 本登録（true/false）

#### スプレッドシート

googleフォームの保存先をひとつのスプレッドシートにまとめること、
また、VLOOKUPかCOUTIFS等を用いることで
データの集約と、大幅な処理コードの削減ができる。

今回以下のシートを準備した。

1. 席数上限(定数)、仮登録の有効時間の計算用タイマーなどを書いた「設定シート」
2. ユーザー情報、自動作成する識別のための固有ID、登録時の時間、登録時の時間と上記仮登録タイマーを照合する「有効な仮登録」、本予約状態の可否を書いた「ユーザーシート」
3. ユーザーIDと予約ブースの紐づけ。＆そのユーザーが有効(仮登録有効時間内 or 有効化済み)かどうかを書いた「予約シート」
4. (仮登録有効時間内 or 有効化済みの)ユーザーの予約から算出する「予約状況シート」

#### googleフォーム

スプレッドシートへの情報入力時、gasを使って入力処理を行うが、
単純に「最終行+1に新規データを追加」とした場合、
タイミングによっては上書きされる形で処理が終わってしまう。

防ぐためには、登録中は他者の処理にストップをかける
「排他処理」が必要だが、gasのロックでは
複数台でいっせーのーせっでやるとタイムラグがモロにでる……。

代替案で使ったのがgoogleフォーム。
あらかじめスプレッドシートの内容に合致する形でフォームを作成。
フォームの項目のID、また、フォームのpost先URLを調べ、
google apps scriptのfetchを用いて情報をpostする。

フォームの保存先を「既存のスプレッドシート」とし、
上記のスプレッドを選択したらOK。

（現状は）処理もれや同一行登録を防ぐことができた。


#### Nuxtjs

LP(兼仮予約)ページでは
参加ブース指定、ユーザー登録という2つのフォームの
「入力・確認・修正・送信」をまとめるために、
以下の4つのコンポーネントを作成、
データ入力の進捗、操作によってコンポーネントを切り替えた。

1. 参加ブース指定
2. ユーザー登録のための情報入力
3. 確認（修正ボタンあり。操作で1or2に戻る）
4. 送信

また、本予約確定ページでは、アクセスした段階で本予約確定とするため、
mounted時にバックエンドにURLのパラメータをポストする処理を書いた。
（あとはバックエンド側で照合、該当ユーザーを有効化）

※余談だけど、gasとの連携で大分躓いた。
　axiosとgasが絶妙にマッチしない……というより使い方に合致してないのか。
　ちょっと詰まったと思ったら、やり方ごそっと切り替えるのオススメです。
　axiosで書いていたのをfetch apiにしたり
「heroku cors」とか検索してみたりすると幸運があるかもです。

### 評価

スピード重視しようと色んなサービス使った結果、
変に複雑化＆処理の低速なサービスになってしまった。
**小規模サービスなら、もっとシンプルに、もしくは定型のものを使うべきだった。**

ちょっとした推しだった**「データの可視化」「エクセルとの互換」も
「え、自分でやるの？」と不評**だったので
今度からはこのやり方は採用しません。
（美味しいコーヒー奢ってもらったから変な顔はしないけど）
PowerShellでポート状態確認

# 背景
あれ…Windows Serverのあのポート空いてる？というときに。

## Test-NetConnection
TCPで接続確認を行います。-Portオプションに続けて、ポート番号を指定します。

```powershell
Test-NetConnection -ComputerName <対象マシン> -Port <ポート番号>
```
[Test-NetConnection](https://docs.microsoft.com/en-us/powershell/module/nettcpip/test-netconnection?view=win10-ps)

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581105/00738c06-a9cd-558b-d2db-0dbe5e4c4f5f.png)


ちなみにコマンドレット単発で実行すると、デフォルトゲートウェイへのpingを実行します。
こんな感じ（下記の実行結果はいろいろな事情で失敗していますが、、）
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581105/abfc8578-29bc-d31d-92d1-c1dd835be2e4.png)


## ホストの生存監視だけならTest-Connection
pingのようなことができます。ただし応答が返ってくるまでが遅いので、-Quietオプションを付けて、Trueかfalseかだけ取得するのが良いと思います。

```powershell
Test-NetConnection -ComputerName <コンピュータ名> -Quiet
True
```
[Test-Connection](https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/test-connection?view=powershell-5.1)

もう少し実用的に使いたい場合は、下記が参考になると思います。
https://qiita.com/gat3ta/items/67a76d7960ee92c6d99b
初めての個人開発でTwitterで自分と似たようなアカウントを探すWebサービスを作ってみた

## Webサービスの概要

以下のアプリを個人開発で作成しました。
<https://focused-cori-f5cacd.netlify.app/>

利用方法は簡単で、テキストボックスにあなたの先頭の@を除いたスクリーン名を入力してください。
10数秒待つと（Azure Functionsの一番安いプランのためです。ご承知おきください。）、検索ワードと関連づいたユーザー一覧が表示されます。

- 検索されたユーザーには、アカウント名と検索ワードで一致したツイートが表示されます。
- 検索されたユーザーをクリックすると、そのユーザーのタイムラインが右側に表示されます。
- 気に入った方がいらっしゃれば上のフォローボタンからフォローすることもできます。

以下に、 sony_jpn さんのアカウントで検索し、ソニーストア 名古屋 さんをクリックした際の例を示します。
![2020-11-09_11h00_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452291/f742f7da-5dab-17fb-e61b-374107e466fa.png)
sony_jpn さんでは"ブラビア"と"キャンペーン"という語句でツイートが多くなされているようでした。
（なお、形態素解析ライブラリが日本語向けのため、上手く解析できないと変な検索結果が出力されます。ご承知おきください。）

## 利用した技術

上記を作る上での技術要素を整理すると、全体観としては以下の通りとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452291/7bb5f6bb-eaf3-9922-0333-9e90ff4454a3.png)

- ソースコードはGitHubで管理します。
  - netlify, Azure Functionsではリポジトリと紐付けられ、ソースコードの変更(pushされる)ごとに自動でデプロイされるようにしています。
  - 私の場合はnetlify向け(フロントエンド)のリポジトリとAzureFunctions向け(バックエンド)のリポジトリの２つを用意しました。
- フロントエンドを実現する際には、静的ホスティングサービスとしてnetlifyを利用しました。
  - Webページを配置しますので、HTML, CSS, JavaScriptを使います。JavascriptライブラリとしてはReactを利用しました。
  - ユーザーから入力を受けるとAPIリクエストをAzure Functionsに送り、ユーザー一覧を受け取ります。
- バックエンドを実現する際には、サーバーレス コンピューティング サービスであるAzure Functionsを利用しました。
  - Azure Functionsに用意したAPIが実行されるとTwitterにAPIリクエストを送り、必要な情報を取得します。
  - Twitterの情報の取得に便利なライブラリ(CoreTweet)、Tweetの内容を形態素解析するためのライブラリ(MeCab.DotNet)を利用しました。

技術要素の採用理由にあまり深い意図はなく、紹介があったり、自分の使える技術と親和性があったりして使いやすそうだったからぐらいです。

## アプリを作る上でのお役立ちURL

アプリを作る上でのチュートリアル記事が多めです。記事の通りに進めていけば、上図のライブラリ利用部分以外は大体実現できると思います。
わかりやすい記事が多く、大変助かりました。

- netlify
  - <https://crieit.net/posts/Web-1>
      - 上記の記事の[React+Netlifyで最小のアプリを作る]リンクが参考になります。
      - GitHubと連携するところまで親切に教えてくれます。
- Azure Functions
  - <https://www.fenet.jp/dotnet/column/tool/1824/>
     - Azure FunctionsでHello Worldするところまでできます。
     - Visual Studioを利用すれば、かなり簡単に実現できます。
  - <https://qiita.com/maaya8585/items/29301c4f14f34ea6928f>
     - フロントエンドからAzure FunctionsにAPIリクエストを送るにはCORSの設定が必要です。
- Twitter
  - <https://qiita.com/mngreen/items/5a05bd4fc5bbb6567b71>
    - TwitterのAPIを利用できるようになるまでと、そのTwitterのAPIを簡単に扱えるようにするライブラリを使えるようになるところまでを紹介しています。

## まとめ

初めて利用する技術を調べながらではありましたが、個人開発でもそれなりに形にすることができました。
外部APIを利用したり、既にあるライブラリを利用したりすることで自分で自作すると大変そうなところも、割と簡単につくれます。
本記事がなにかWebサービスを作ろうと思った際に参考になると幸いです。
JavaScript 関数の代入でつまづいたこと

#JavaScript 関数の代入でつまづいたこと

最近学校でAjaxとかSevletでWebアプリを作るプロジェクトが始まったので自分でも色々勉強してみる。


###【問題】getElemenByIdでnullしか返ってこない

```index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <script type="text/javascript" src="index.js"></script>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>id textに文字を表示する</title>
  </head>
  <body>
    <p id="text"></p>
  </body>
</html>
```

```index.js
window.onload = start();

function start() {
    var eTex = document.getElementById("text");
    eTex.innerHTML = "Hello";
}
```

###【結論】関数を参照するときは"()"はつけない
お先に結論。
はい。すごい初歩的なことでした。。

```index.js
// window.onload = start(); 代入するときにこの時点で実行してしまっている
window.onload = start; //参照するときは()をつけてはいけない(戒め)

function start() {
    var eTex = document.getElementById("text");
    eTex.innerHTML = "Hello";
}
```
ということでございますね。。

###【理由】htmlファイルを解析する前に要素を取得している
Ajaxとかやり始めた初心者がつまづくテンプレみたいなことですよ。
解析し終わる前に要素取ってこれないことは知ってたんですよ？えぇ。
自分の場合は、それよりJavaScriptの基礎の基礎が分かってなかったってことなんですよね。。。

```index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <script type="text/javascript" src="index.js"></script> <!-- jsはここで読み込まれる -->
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>id textに文字を表示する</title>
  </head>
  <body>
    <p id="text"></p>
  </body>
</html>
```
再掲でございますが。。
まずHTMLと別ファイルのJavaScriptを読み込むタイミングってのは、当たり前ですがscriptタグを描いたところで読み込まれるわけですね。
上のソースだとheadの中で読み込んでいるので、結構早いタイミングで読み込まれるわけです。
そうするとhtmlをすべて解析し終わる前にjavaScriptの解析が終わり、先に実行されてしまうわけですね。
ここで、まだ解析も終わっていないのに下のbodyの中にあるpタグを取ってこれるわけがありません。
なので、`window.onload`で全てhtml解析が終わってから実行しようとしたわけですが。。。

```index.js
// window.onload = start(); 代入するときにこの時点で実行してしまっている
window.onload = start; //参照するときは()をつけてはいけない(戒め)
```

これですよ。
代入する時点で実行しちゃだめでしょ！！
JavaScriptってのは関数も変数に代入してやり取りができるんですね。
そのシステムをよく理解していなかった。。。

関数に()をつけるとその関数を実行するよ！って意味になるんです。

つまり`window.onload`が呼び出されるときに代入した変数を実行しなきゃいけないんですが。
その前に代入する時点で実行してしまっていて、HTMLの解釈が追い付いていないのに、関数Start内の

```index.js
function start() {
    var eTex = document.getElementById("text");
    eTex.innerHTML = "Hello";
}
```
`getElementById`が実行されてしまい、クライアント側のjavascriptは"text"なんでidはありまへんで、
と解釈してしまっていたというわけですね。。。はい。。。。。。。
Db2 V11.5 と Luna HSMの連携 - はじめに


### Db2 V11.5 と Luna ハードウェア・セキュリティー・モジュール (HSM)の連携

# はじめに

Luna ハードウェア・セキュリティー・モジュール (以降 単純に"HSM"と表記します)は、高度なセキュリティ機能を有する環境での鍵管理や暗号化などの処理を行う専用のハードウェアアプライアンス製品です。Db2は ネイティブ暗号化でマスター鍵 (MK) を保管する鍵ストアを、HSM をつかって構成することが可能です。

本シリーズでは　Db2 サーバーとHSMアプライアンス(SafeNet Network HSM 7)で、Db2ネイティブ暗号化のマスター鍵をHSMに生成する方法を示します。 

------------------------------

 本シリーズはタレス社より提供いただきました資料をベースにDb2 V11.5でHSMアプライアンスに鍵ストアを構成した手順をお伝えすることを目的に作成しております。ある特定の環境・使用状況においての正確性が確認されていますが、すべての環境において同様の結果が得られる保証はありません。
これらの技術を自身の環境に適用する際には、自己の責任において十分な検証と確認を実施いただくことをお奨めいたします。

---------------------------------------



## Db2 ネイティブ暗号化での鍵管理方式について

Db2® ネイティブ暗号化では、データ暗号化に 2 層アプローチを使用します。 データがデータ暗号鍵 (DEK) を使用して暗号化され、その DEK がマスター鍵 (MK) を使用して暗号化されます。 暗号化された DEK はデータとともに保管され、MK は Db2 の外部にある鍵ストアに保管されます。
![image-HSM-Db2-MS-DEK.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855502/82236af5-76f7-ba52-ef22-f0623a1816f8.jpeg)



Db2でサポートされるマスター鍵 (MK)が保管される鍵ストアは3種類あります。
![image-HSM-Db2-keystore.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855502/7b15d622-f83d-94db-4c68-0bbb02ca79bb.jpeg)


このシリーズで取り上げるのは２種類です。(指差しマークの部分です)

-  **ローカル鍵管理**: IBM GSKitを用いたローカル鍵ストア (PKCS #12 アーカイブ・ファイル・フォーマットに準拠)
-  **エンタープライズ鍵管理**:  Hardware Security Module上の鍵ストア



## 本シリーズの構成

本手順書では　スタンドアローンのDb2 サーバーとHSMアプライアンス(SafeNet Network HSM 7)1台の構成で、Db2ネイティブ暗号化のマスター鍵をHSMに生成する方法を示します。

- [Db2-HSM 連携の事前準備 (クライアント導入からパーティション作成初期化まで)](https://qiita.com/mi-shimo/private/bf0eb3769fd1c4f2adeb)
- [マスター鍵を直接HSM上に作成する](https://qiita.com/mi-shimo/private/74ad1432a844083bd32c)
- [マスター鍵をローカル鍵ストアからHSMへ移行する](https://qiita.com/mi-shimo/private/24760af8021655b16a75) 

![image-HSM-Db2-HSM-Db2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855502/d10c7402-ad76-a51d-77c9-4c50a9a65eb2.jpeg)



## 検証環境情報

このシリーズは次の環境で検証しました。

- LUNA NETWORK HSM A700
  - Software Version:        7.4.0-226
  - Firmware:              7.3.3
- Luna Client 環境
  - AIX V7.2　(oslevel –s : 7200-03-03-1914)
  - LunaClient_10.2.0-111_AIX610-000399-002_SW_Universal_Client_10.2_AIX_RevA.tar 
  - IBM Db2 Server 11.5 



## 参考文書
### Luna HSMについて

タレス社がHSMについて講演した資料が次になります。

- [JNSA主催セミナー 第３回 鍵管理勉強会（オンライン開催）]( https://www.jnsa.org/seminar/seckey/201013/index.html) -     [暗号鍵管理のためのHSM](https://www.jnsa.org/seminar/seckey/201013/data/4_funaki.pdf)

検証に使用したLUNA NETWORK HSM A700につきましては次をご参照ください。

- [Thales Luna HSMs](https://cpl.thalesgroup.com/encryption/hardware-security-modules/network-hsms)

### Db2 ネイティブ暗号化について

- [Db2 ネイティブ暗号化](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.sec.doc/doc/c0061758.html)
- [Db2 ネイティブ暗号化の概要](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.sec.doc/doc/c0070381.html)
Vue.jsで使用するfirebaseの設定をgitの管理対象から外す

# はじめに

Vue.jsでfirebaseを使用したアプリケーションを作った時に、firebaseの設定をmain.jsにベタ書きしていました。このままgitにあげるのはよろしくないので、firebaseの設定を別ファイルに外出しします。

# 変更前

変更前のソースはこんな感じ。

```javascript:main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import vuetify from './plugins/vuetify';
import firebase from 'firebase/app'

Vue.config.productionTip = false

// Your web app's Firebase configuration
var firebaseConfig = {
  apiKey: "...",
  authDomain: "...",
  databaseURL: "...",
  projectId: "...",
  storageBucket: "...",
  messagingSenderId: "...",
  appId: "..."
};
// Initialize Firebase
firebase.initializeApp(firebaseConfig);

new Vue({
  router,
  store,
  vuetify,
  render: h => h(App)
}).$mount('#app')
```

# 変更後

firebaseの設定は`src/firebase-config.js`へ切り出します。

```javascript:firebase-config.js
/* eslint no-unused-vars: 0 */

// Your web app's Firebase configuration
export const firebaseConfig = {
  apiKey: "...",
  authDomain: "...",
  databaseURL: "...",
  projectId: "...",
  storageBucket: "...",
  messagingSenderId: "...",
  appId: "..."
};
```

```javascript:main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import vuetify from './plugins/vuetify';
import { firebaseConfig } from './firebase-config.js';
import firebase from 'firebase/app'

Vue.config.productionTip = false

// Initialize Firebase
firebase.initializeApp(firebaseConfig);

new Vue({
  router,
  store,
  vuetify,
  render: h => h(App)
}).$mount('#app')
```

# さいごに

firebase-config.jsをgitの対象から外すのをお忘れなきよう。
Twitter APIを利用するための事前準備から実際にC#からAPIを利用するまでやってみた

## はじめに
本記事では、TwitterAPIを実際に使ってみるまでを書いたものになります。
他の方の手助けとなれば幸いです。

## Twitter APIを利用するための事前準備

以下の記事が大変参考になりました。ただ、UIが現在のものとやや異なっているため、お気を付けください。
あと、完了までに軽く1時間はかかります。大変です。
https://www.torikun.com/entry/twitter-developer-api/

全て英語というのが非常にハードルがありますが、日本語で文章を書いて翻訳ソフトにかければ大丈夫かと思います。
私の場合はDeepLを利用しました。
https://www.deepl.com/home

上記の手順で自分が迷ったのは[Website URL]です。
これはTwitterのページで良いとのことでしたので、TwitterアカウントのページのURLを貼り付けで問題ありません。

## Twitter APIを利用してみる
私の場合、C#が使い慣れていましたので、CoreTweetというライブラリを用いてTwitter APIを利用しました。
実際に使える状態になるまでの手順を以下に示します。

1. TwitterのAPIでセキュリティの仕組みが変わったらしく、CoreTweetがそのままでは利用できませんでした。
    以下を参考に、自身でソースコードを修正し、ビルドしなおす必要があります。
    <https://ameblo.jp/ral-puyo/entry-12501861117.html>

1. 以下の記事を参考に、Twitter APIのAPIキーを一通り取得します。
    <https://kitigai.hatenablog.com/entry/2018/04/24/013506>

1. コンソールアプリのプロジェクトを作成し、取得したAPIキーで定数を書き換えます。
   その後、参照に上記で修正したdllを追加し、実行してみてください。
   作成したTwitterアカウントに"test1"とTweetされます。
   なお、全く同じ内容を連続でTweetしようとすると、失敗する場合がありますのでお気を付けください。

```c#
   using CoreTweet;

   namespace TweetConsoleApp
   {
   	    class Program
   	    {
            #region 定数定義

            // 以下は、取得したAPIキーに置き換えてください。
            private const string c_ConsumerKey = "xxxx";
            private const string c_ConsumerSecretKey = "xxxx";
            private const string c_AccessToken = "xxxx";
            private const string c_AccessSecret = "xxxx";

            #endregion

   	    	static void Main(string[] args)
   	    	{
   	    		var t = Tokens.Create(c_ConsumerKey, c_ConsumerSecretKey, c_AccessToken, c_AccessSecret);
   	    		t.Statuses.Update(status => "test1");
   	    	}
   	    }
   }
```

## おわりに

ここまでで、CoreTweetを利用してTweeter APIを利用し、Tweetすることができました。
自分でやった際には色々と躓いてかなり時間がかかってしまいましたが、整理するとすごく単純でした。
是非機会があればお試しください。
Nuxt.js でルーティングを部分的に書き換えたかった

## やりたかったこと
複数種類のユーザーが 1つの Nuxt.js アプリケーション上を利用する場合に、
可読性とユーザビリティを考えて以下のように実現したいと考えました。

### ユーザー種別
- admin （運営管理者）
- manager （会社の管理者）
- employee （従業員=一般ユーザー）

### ディレクトリ構成
わかりやすいように、各ユーザー向けの毎の画面はユーザー種別ごとにディレクトリを切りたい。

```
pages
　├ admin
　│ ├ index.vue
　│ └ login.vue
　├ manager
　│ ├ index.vue
　│ └ login.vue
　└ employee
　　├ index.vue
　　└ login.vue
 
```

### 実現したいルーティング
employee 向けの URL はディレクトリ名を入れたくない。

```
// これらは Nuxt が自動でルーティングしてくれる
http://localhost/admin/  => /admin/index
http://localhost/admin/login  => /admin/login
http://localhost/manager/  => /manager/index
http://localhost/manager/login => /manager/login

// employee は一般ユーザーなので URL のプリフィックスを外したいけど、自動ではルーティングされない
http://localhost/  => /employee/index
http://localhost/login  => /employee/login
```


## 実現方法
Nuxt の設定で router プロパティに [extendsRoutes](https://ja.nuxtjs.org/docs/2.x/configuration-glossary/configuration-router/#extendroutes) を指定します。

```nuxt.config.js
export default {
  // ...
  // 以下を追記
  router: {
    extendRoutes(routes) {
      routes = routes.map((route) => {
        if (!route.path.startsWith('/employee')) {
          return route;
        }
        // /employee/hogehoge => /pages/employee/hogehoge で生成されたルーティングを
        // /hogehoge => /pages/employee/hogehoge のルーティングに書き換える
        route.path = route.path.replace('/employee', '/');
        return route;
      });
    },
  },
};
```

できた！
extendRoutes の引数として受け取る `routes` は VueRouter の routes プロパティと同じで単なる設定オブジェクトの配列なので、 push したり filter したりと他にもいろいろカスタマイズできます。

他にこんな実現方法もあるよ〜とか、もっとスマートなやり方とかあれば教えてください！
Singleton Pattern

#Singleton Pattern
<font color="#00f">一つしかインスタンスを生成しない<br></font>

このページでは以下を記載します
・Singleton Pattern サンプルコード

[Design Pattarm MENU](https://qiita.com/old_cat/items/852d980bedb9100dd7e3)

##
以下のクラス構成で確認します

|クラス|説明|
|-----|----|
|singleton.class|インスタンスを一つだけ生成する|
|user(Main.class)|インスタンスを生成する|
＊user　他の開発者がこのパターンを利用する、という意味合いを含みます

```java:singleton.class
class singleton{
  private static singleton singleton = new singleton();
  private singleton(){}
  public  static singleton newInstance(){return singleton;}
}
```
```java:user(Main.class)
public static  void main(String[] args){
  singleton s1 =singleton.newInstance();
}}
```
[Django] クラス継承によるアクセス制限を実装してみた。

##前書き
メモがてら初心者が書いているので、間違いはご容赦ください。
チャットアプリを作っているのですが、チャットルームを部屋の参加者以外覗けないようにしたくなりました。
クラスビューのメソッドのオーバーライドで実装しようとして、かなり時間を費やしましたが、
めちゃくちゃ簡単な方法がありましたのでご紹介します。


##本題


※中間テーブルで参加者を管理しています。（該当のレコードがあれば参加済）


```python:models.py

class Room(models.Model):
     (略)

class User(AbstractBaseUser, PermissionsMixin):
     (略)

class JoinRoom(models.Model):#中間テーブル
    room = models.ForeignKey(Room,on_delete=models.CASCADE)
    user = models.ForeignKey(User,on_delete=models.PROTECT)
```


本当はここに書かないほうがいいのかもしれませんが、見やすくするためこちらにまとめます。
filterを使うより、getのほうが早くていいらしいのでこうしてます。

```python:views.py

from django.contrib.auth.mixins import UserPassesTestMixin

class OnlyParticipantMixin(UserPassesTestMixin):
    raise_exception = True

    def test_func(self):
        try:
            exist_or_not = MyRoom.objects.get(room=self.kwargs['pk'],user=self.request.user)#代入する必要があるのかはまだ試してません。
            return True
        except MyRoom.DoesNotExist:
            return False

class CommentCreateView(OnlyParticipantMixin,generic.CreateView):#この順番じゃないと機能しないっぽい？
     template_name = 'hogehoge/hogehoge'

```

これで完了。参加者以外が覗こうとしたらエラーが出るようになります。

参考

https://developer.yukimonkey.com/article/20200417/


https://intellectual-curiosity.tokyo/2018/12/06/django%E3%81%AE%E8%A9%B3%E7%B4%B0%E7%94%BB%E9%9D%A2detailview%E3%81%A7%E8%87%AA%E5%88%86%E4%BB%A5%E5%A4%96%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AB%E3%82%A2%E3%82%AF/
【iOS】Pythonista3 でもpipコマンドでモジュールをインストールできる。

# はじめに
iOS/iPadOS用のアプリ<font color="#02b987">**[‎Pythonista 3](https://apps.apple.com/jp/app/pythonista-3/id1085978097)**</font>には様々な[**モジュール**](http://omz-software.com/pythonista/docs/ios/index.html)がインストールされていますが、外部モジュールを**pip**コマンドでインストールすることもできます。

# 必要なもの
- StaSh

#### StaShのインストール
こちらの記事にメモしておいたのですが、**StaSh**をインストールするだけです。
[Pythonista 3 にStaSh をインストールする。 - Qiita](https://qiita.com/maboy/items/cef5dee13d5b2e9ac843)

コンソールに次の呪文をコピペして実行します。

```python:StaShをインストールする呪文
import requests as r; exec(r.get('http://bit.ly/get-stash').text)
```

インストールが完了すると次のメッセージが表示されるので再起動します。

```
Please Restart Pythonista and run launch_stash.py under the Home directory to start StaSh.
```
# pipコマンドでインストール
ためしにpipコマンドで **googletrans** をインストールする手順を説明します。

1. StaShを起動
2. pipコマンド

#### StaShを起動
**launch_stash.py**を実行します。

#### pipコマンド
**StaSh**が起動したらコマンド`pip install googletrans`を入力して実行します。

# インストールできないモジュール
PythonではおなじみのモジュールでもPythonistaにはインストールできないモジュールがあります。

- OpenCV
ServiceNow - Flow Designerでアクションが削除できない

#概要
Flow Designerで不要なアクションを削除しようとすると「Delete of xxxxx not allowed because of a reference in record within the Action Instance file」と表示して削除できない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/e2c7d2b0-dbb3-302b-9471-6fba5de7e044.png)

#原因
削除しようとしているアクションのインスタンスが残っている。通常ではインスタンスは削除されるはずですが、何かの理由で削除されなかった。

#対策
アプリケーションナビゲータから「sys_hub_action_instance.LIST」を開き、該当するアクションインスタンスを削除してから、再度アクションを削除する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/f7aba435-1e5a-46dd-a160-01ef06fae002.png)

#参照
https://hi.service-now.com/kb_view.do?sysparm_article=KB0822588

以上
Numpy 便利なメソッド一覧

# 配列の累計和を算出する
```python
import numpy as np

y = [0, 1, 2, 3, 4, 5]

np.cumsum(y) # 累計和がndarrayで出力される
# [ 0  1  3  6 10 15]

np.cumsum(y).tolist() # リストにもできる
# [0, 1, 3, 6, 10, 15]
```

随時更新中