OmniAICreator/Qiita-1.07M huggingface dataset:
NeurIPS2021の枝刈り論文 (4)

# 概要
この記事では、NeurIPS2021の枝刈り論文をまとめます。[^1]

[^1]: 画像や数式は論文から引用しています。

[その1](https://qiita.com/kyad/items/a998011894d8d9013dfc) [その2](https://qiita.com/kyad/items/c37209de0993fef73a63) [その3](https://qiita.com/kyad/items/0d3a80895e24cca0eb2c)


# DominoSearch: Find layer-wise fine-grained N:M sparse schemes from dense neural networks

https://proceedings.neurips.cc/paper/2021/hash/ad68473a64305626a27c32a5408552d7-Abstract.html

概要：DominoSearch. N:M Sparsityをレイヤ毎に行う。
新規性：N:M Sparsityをレイヤ毎に行うのは初。
キモ：周期的にペナルティ項を入れたり終了チェックをしたりする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/6e9b336f-80e9-9dac-d152-0cb30f794820.png)
評価：ResNetに適用して実験した。


# Why Lottery Ticket Wins? A Theoretical Perspective of Sample Complexity on Pruned Neural Networks

https://arxiv.org/abs/2110.05667

概要：宝くじ仮説の理論解析
研究機関：IBM
新規性：宝くじ仮説で収束に必要なサンプル数を理論的に分析し、刈ったネットワークが速く収束したり精度が上がったりすることを初めて示した。
キモ：AGDのオプティマイザを使うと上記を示せる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/073f7dec-775e-f257-4d8a-6f8236b0669d.png)
評価：MNIST, CIFAR-10, LeNet, ResNetで確かめた。


# RED : Looking for Redundancies for Data-Free Structured Compression of Deep Neural Networks

https://arxiv.org/abs/2105.14797

概要：RED. データなしstructured枝刈り
新規性：
・重みをハッシュ化し、ハッシュ値の近いニューロンをマージする方法を提案した。
・Depthwise Separable Convに対して適用する方法を提案した。
キモ：
重みの分布を極小値で分割して各区間にハッシュ化する方法。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/01a443d9-1cd6-38de-cd30-bd954d216bf5.png)
ハッシュが似たニューロンをマージする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/2b3b0eef-1598-626a-4b48-7c5772efd991.png)
評価：ResNetに適用して、Neuron MergingやSynFlowと比較した。


# Heavy Tails in SGD and Compressibility of Overparametrized Neural Networks

https://arxiv.org/abs/2106.03795

概要：枝刈りの正当性の証明
新規性：SGDを使う場合で、Magnitude-based pruningや、Singular value pruning (共分散行列の固有値による枝刈り) の枝刈りの正当性（ネットワークサイズが大きくなると、刈ることによる圧縮率は任意に大きくできる）を示すフレームワークを提案した。
キモ：SGDのheavy-tailed mean-field property (mean-field分布に収束する) の性質を使う。
評価：簡単なCNN等で実験した。
【Rails】assignsメソッド

# assignsメソッドとは
テストメソッド。
インスタンス変数に対応するシンボルを渡します。例えばcreateアクションで@userというインスタンス変数が定義されていれば、テスト内部ではassigns(:user)と書くことでインスタンス変数にアクセスできます。
<br>

```rb
# @userにアクセス
assigns(:user)
```

rails 5以降だとテストで記述するのは非推奨みたいです。
railsチュートリアルではrails 6ですが使用しているようです。
Androidのスクリーンレコードによる画面録画動画をYoutubeにアップロードできない問題をffmpegのコーデック変換で解決する

# 背景

普段iOS使いの筆者が、Androidの画面録画をYoutubeにアップロードしようとしたときに起きた問題の解決方法を述べたいと思います。

# 画面録画 (スクリーンレコード)

https://kakakumag.com/pc-smartphone/?id=16199

この記事曰く、Androidスマホの画面録画は「スクリーンレコード」でできるとのこと。早速試したらすぐに録画できました。そしてYoutubeにアップロードしてみると...?

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/0ff02cb5-4e09-4c55-2849-9d97a62c9a8d.png)

ずっと、保留中で終わらない...

試しに、他の動画をあげたらすぐアップロードできる。どうやら動画に問題があるようだ。

# コーデックに問題がある説を疑う

https://pc-farm.co.jp/pc_column/trend/4075/

記事を調べてみると、

> ・YouTubeに対応した動画フォーマットに変更
YouTubeの推奨フォーマットは、MPEG4（H.264）です。動画がうまくアップロードできない場合は、MPEG4（H.264）でエンコードしてみてください。MPEG4を（H.264）形式エンコードしてくれる「HandBrake」や「AviUtl」などのツールを使ってみてください。

と書いてあり、該当動画のコーデックを調べてみる。

[【FAQ】マスター動画ファイルのコーデックを確認するには、どうすればいいですか？](https://support.eq.stream.co.jp/hc/ja/articles/223476527)

調べてみると、動画コーデックが存在していない (理由はわからない) では、変換してみよう。

ここでffmpegで変換してみる

```
ffmpeg -i .\input.mp4 -vcodec libx264 -acodec libmp3lame output.mp4
```
これはvideoコーデックはlibx264(=H.264にエンコード)
音声コーデックlibmp3lameにエンコード

このoutput.mp4をYoutubeにアップロードすると、無事アップロードできました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/56f86d69-8471-7470-1bef-49ae4f46952e.png)
公式チュートリアル

UI更新

```dart
setState() 
```

タップ判定の範囲が子で指定される

```dart
 GestureDetector(
              onTap: () {
                setState(() {
                  // Toggle light when tapped.
                  _lightIsOn = !_lightIsOn;
                });
              },
```

タップを検出(親)

```dart
class _ParentWidgetState extends State<ParentWidget> {
  bool _active = false;

  void _handleTapboxChanged(bool newValue) {
    setState(() {
      _active = newValue;
    });
  }
//TapBoxにOnChangedとしてメソッドを渡す
//このメソッドは引数にONOFFフラグを渡すと反対にしてくれる
  @override
  Widget build(BuildContext context) {
    return SizedBox(
      child: TapboxB(
        active: _active,
        onChanged: _handleTapboxChanged,
      ),
    );
  }
}
```

子

```dart
class TapboxB extends StatelessWidget {
  const TapboxB({
    Key? key,
    this.active = false,
    required this.onChanged,
  }) : super(key: key);

  final bool active;
  final ValueChanged<bool> onChanged;

  void _handleTap() {
    onChanged(!active);
  }

  @override
  Widget build(BuildContext context) {
/**GestureDetectorは子のウィジェットのタップを検出する（当たり判定のようなもの）
タップを検出すると引数のメソッドを実行する*/

    return GestureDetector(
      onTap: _handleTap,
      child: Container(
        child: Center(
          child: Text(
            active ? 'Parent' : 'Child',
            style: const TextStyle(fontSize: 32.0, color: Colors.white),
          ),
        ),
        width: 200.0,
        height: 200.0,
        decoration: BoxDecoration(
          color: active ? Colors.lightGreen[700] : Colors.grey[600],
        ),
      ),
    );
  }
}

```

GestureDetectorが複数のタップに合わせて動く

```dart
 return GestureDetector(
      onTapDown: _handleTapDown, // Handle the tap events in the order that
      onTapUp: _handleTapUp, // they occur: down, up, tap, cancel
      onTap: _handleTap,
      onTapCancel: _handleTapCancel,
      child: Container(
        child: Center(
          child: Text(widget.active ? 'Active' : 'Inactive',
              style: const TextStyle(fontSize: 32.0, color: Colors.white)),
        ),
        width: 200.0,
        height: 200.0,
        decoration: BoxDecoration(
          color: widget.active ? Colors.lightGreen[700] : Colors.grey[600],
          border: _highlight
              ? Border.all(
                  color: Colors.teal[700]!,
                  width: 10.0,
                )
              : null,
        ),
      ),
    );
```
Windowsにてポートを管理するサービスの一部停止

phpのlaravelプロジェクトをやり、sail upコマンドより、立ち上げたら、下記のエラーが発生しました。
理由としては、Windowsにて管理されるポート番号を使うからで、回避方法はポート番号を変更することにより、
簡単に回避はできま。
もしくは、Windowsにてポートを管理するサービスを停止する方法もありました。

```
Error response from daemon: Ports are not available: listen tcp 0.0.0.0:80: bind: An attempt was made to access a socket in a way forbidden by its access permissions.
```

しかしながら、セキュリティー面でやりたくないと思って、探してみたら、ライブラリとして、基本提供はしていることがわかりました。
開発者がどうしても、Windowsにてポートを管理されたくない時のためですかね。(笑)

コード： https://github.com/heedaily/ExcludedPortRange

プログラム： https://drive.google.com/file/d/1eVMsnv9U7kHJdAugcOkvCS-BvY9u9rjU/view?usp=sharing

.net 4.8を基盤にしてはますが、昔(?)から提供しているC++のライブラリを利用しているため、コードをダウンロードして、プレームワークは必要に応じて変更して、再ビルドしても良いかと思っています。

:::note warn
プログラムを実行する時は、必ず管理者権限にて実行してください。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516328/0ac18725-1e34-bc43-6697-1814cb9d7b0d.png)

< 各項目の説明 >
・Type：除外したいポートのサービスタイプを選べます。
・Start Port：制御するポートの始まり
・End Port：制御するポートの終わり
・Delete Exclude：Windowsにてポートを管理しないようにする。
・Create Exclude：Windowsにてポートを管理するようにする。
・Confirm Command：実行確認コマンド

タイプを選択して、制御したいポート番号の範囲をStart PortとEnd Portにて記載してください。
例えば、80ポートのみだったら、両方とも80を入れて、80から90番までの場合は、Start Portには80をEnd Portには90を入れてください。
その後、Windowsにてポート管理をしないようにしたい場合は、Delete Excludeを押下して、
管理されたい場合は、Create Excludeを押下してください。
ボタンを押下する前後にて該当確認コマンドをコマンドプロンプトから実行して、確認して見てください。

```:TCPポート番号の場合
netsh int ipv4 show excludedportrange protocol=tcp
```

```:UDPポート番号の場合
netsh int ipv4 show excludedportrange protocol=udp
```

Windowsにてポートを管理しないことはセキュリティー上、よろしくないので、ポート除外の必要が終わったら、元に戻しましょう。
使っているプログラムがあると、戻されないので、ご注意ください。
viteでmpa対応するために簡易プラグインを書いてみた

## 結論


fast-globを使ってroot設定より下のファイルを調べてrollupOptionに突っ込む

https://ja.vitejs.dev/guide/build.html#%E3%83%9E%E3%83%AB%E3%83%81%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%A2%E3%83%97%E3%83%AA

https://rollupjs.org/guide/en/#input

> input
> Type: string | string [] | { [entryName: string]: string }
> CLI: -i/--input <filename>

vite公式のドキュメントにはオブジェクトで指定されてますが、rollup configのinputの型について調べたところ、配列でも良さそうなため配列で指定

```ts
import { Plugin, UserConfig } from 'vite';
import fg from 'fast-glob';

// https://ja.vitejs.dev/config/#root
const generatePathConfig = (root = process.cwd()) => {
  const paths = fg.sync(`${root}/**/*.html`);
  return paths.map((path) => path.replace(root, ''));
};

const resolveMpaConfig = (vitePlugin: UserConfig): UserConfig => ({
  build: {
    rollupOptions: {
      input: generatePathConfig(vitePlugin.root)
    }
  }
})

//https://ja.vitejs.dev/guide/api-plugin.html#規約
export const vitePluginMpa: Plugin = {
  name: 'vite-plugin-mpa',
  config: (vitePlugin, _) => resolveMpaConfig(vitePlugin),
  apply: 'build'
}

/*
vitePluginMpa()として渡したい場合(拡張子指定など今後オプションが増えたらこっち？)
export const vitePluginMpa = (): Plugin  => ({
  name: 'vite-plugin-mpa',
  config: (vitePlugin, _) => resolveMpaConfig(vitePlugin),
  apply: 'build'
})
*/

```

```ts
import { defineConfig } from 'vite';
import path from 'path';
import { vitePluginMpa } from './mpa';

export default defineConfig({
    root: 'src',
    build: {
      outDir: '../dist',
      emptyOutDir: true,
    },
    resolve: {
      alias: {
        '@': path.resolve(__dirname, './src'),
      },
    },
    plugins: [vitePluginMpa]
});

```

サンプル？
https://github.com/taka1156/p5.js-learning

ちょっとしたLPとかでmpaしたい時に使えるかな

(既にあるやつだと設定項目が多かったので勉強ついでに簡単なやつ書いてみました。)
QUESTのIPアドレスを確認する


#参考
https://www.scriptlife.jp/contents/programming/2018/05/12/oculus-go-wifi/#ADB

# IP
adb shell ip addr show wlan0

```
7: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 3000
    link/ether 2c:26:17:7f:d8:11 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.44/24 brd 192.168.0.255 scope global wlan0
       valid_lft forever preferred_lft forever
    inet6 fe80::68fe:2212:4f38:c24a/64 scope link stable-privacy
       valid_lft forever preferred_lft forever

```
【Web】ON,OFFスイッチをアニメーション付きで作ろうとして苦労した話


小生、初心者プログラマーなのですが、簡単なサイト作りなら記事サーフィンしながらで出来るだろうと思い、基礎からHTMLを学んだりしてこなかった。
その付けがでた今回の話。


オルタネイト式（ON、OFF切り替え式）なボタンをアニメーションをつけて用意しようとしたら苦労した。

#jQueryを使おうとする




```javascript:javascript
$(document).ready(function(){
    $('#BottonID').on('click',function(){
        if($("#ID").hasClass("after")){
            $("#ID").removeClass("after")
        }else{
            $('#ID').addClass('after');
        }
    });
});
```

jQueryを使う事によってクリックごとにclassを追加し見た目を変えることは成功
ただ、transitionで時間指定してもアニメーションでは動いてくれなくて失敗

#CSSのanimation:を使おうとする。


```css:css
.ani1{
    animation: mawaru 2s 0s forwards alternate;
}
.ani2{
    animation: mawaru 2s 0s forwards alternate-reverse;
}

@keyframes mawaru {
    0%{
        transform: rotate(0deg);   
    }
    100%{
        transform: rotate(180deg);   
    }
}
```

そしてクラスの切り替えをJQueryで行う


```javascript:javascript
$(document).ready(function(){
    $('#BottonID').on('click',function(){
        if($("#ID").hasClass("ani1")){
            $("#ID").removeClass("ani1");
            $('#ID').addClass('ani2');
        }else{
            $("#ID").removeClass("ani2");
            $('#ID').addClass('ani1');
        }
    });
});
```

だが今回もアニメーションは動かず100%時の形で切り替わった

#HTMLの基礎　input type="checkbox"をつかう


```html:html
<div class="botton">
<input type="checkbox" id="checkID">
        <label for="checkID" >
            <p class="ani"> </p>
        </label>
</div>
```

```css:css
   .botton input[type="checkbox"] {
    display        : none;            /* チェックボックス非表示 */
  }
.ani{
    width: 50px;
    height: 50px;
    background-color: rgb(0, 0, 0);

    transition: 0.5s;
}
.botton input:checked ~ label .ani {
    transform:  rotate(180deg);
 
  }
```
これで想定通りに切り替えで再生、リバースされるスイッチが出来ました。


結局JavaScriptも使わずに出来てしまったという。
やはり基本のHTMLは大事だと痛感……。
set

set<int> a;

a.insert(x) (xを追加する)
(set: xがない場合のみ)
(multiset: 常時)

a.erase(x) (xを削除する)
(set: 1個)
(multiset: すべて)

a.erase(itr) (itrを削除する)

a.lower_bound(x) (x以上である最小の要素のitr)

a.clear()

```c++
auto itr2 = Set.lower_bound(20);
```
ヒューリスティック検知について調べてみた

## 勉強前イメージ

パターンマッチングでもないけど、振る舞い検知でもない、
動きのパターンを検知する方法ってぐらいしか・・・

## 調査

### ヒューリスティック検知 とは

Heuristic は 「経験則の・試行錯誤的な」 という意味で、セキュリティソフトのウイルス検出手法の一つです。
あらかじめウイルスが持つ特徴的な挙動を登録して、その挙動を比較して検知する方法です。
ただ、挙動が似ている正常なプログラムも検出するため誤検知も可能性としてあります。
基本的にはパターンマッチングと併用して使われていることが多いです。

### ヒューリスティック検知の種類

以下の2種類があります。

- 静的ヒューリスティック検知

静的なことから、スタティックヒューリスティックとも呼ばれています。
プログラムが実行する前に分析し検知する方法で、実行する前に排除することができます。
しかしこの段階でウイルスかどうかがわからない時があり、その際は動的ヒューリスティック検知で最終的に確認を行います。

- 動的ヒューリスティック検知

動的なことから、ダイナミックヒューリスティックとも呼ばれています。
こちらは実際にプログラムを実行させてからウイルスかどうか確認する方法です。
しかし実際にプログラムを実行させるのはリスクが高いので、サンドボックスと呼ばれる安全な仮想環境上で実行させてプログラムの挙動を確認します。

実際に実行すると負荷が高くなるので全てのプログラムを動的ヒューリスティック検知で確認するわけにいかないので
静的ヒューリスティック検知から漏れたものを動的ヒューリスティック検知で確認を行います。

## 勉強後イメージ

ヒューリスティック検知にも2種類あって
わかりやすいものは静的ではじかれて
ややこしいやつは静的→動的で確認ってことなのね。

## 参考

- [ヒューリスティック検知とは？他の方式との違いやメリットデメリットについて徹底解説](https://cybersecurity-jp.com/security-measures/29999)
- [ウイルス対策の１種「ヒューリスティック検知」とは？詳しく解説！](https://it-trend.jp/anti_virus/article/58-0005)
Automation Anywhere の変数について学ぶ

# 本日は変数について学ぶ
下記技術ブログにて「変数」について学ぶ。

https://licensecounter.jp/engineer-voice/blog/articles/20200226_AutomationAnywhere-A2019-Variable.html

# １．Automation Anywhere A2019 の変数
基本的な考え方は、別の回に解説されているようなので、まずはそちらを確認。

https://licensecounter.jp/engineer-voice/blog/articles/20190912_automation_anywhere_variables.html

前半の内容だけ読めばいいようだ。（後半はV11で変数の解説が記載されているので、混乱してしまうかもしれない。）

## 型
Automation Anywhereでは11 種類の型が用意されているとのこと。
パッケージによって型が決まっているようなので、注意が必要なようだ。
これは使いながら覚えていくこととしよう。

## 種類
変数の種類は「システム変数」「ユーザー定義変数」の２種類があるとのこと。
読んでみたが、イメージが追い付かない……次が作成に入るようなので、そこでイメージが付くか？！

# ２．変数を作る

# ３．変数を使う
3-1. アクションへのインプット
3-2. アクションからのアウトプット

# ４．実践編
4-1. 変数に値を代入する
4-2. 文字列⇔非文字列の変換

# 本日の学び
「マイクロサービスパターン」の復習 7章 クエリー

## 概要

- Java読書会でせっかく勉強したのにつぎつぎと忘れていくので、印象に残ったところを記録していく

http://www.javareading.com/bof/

## 7章 マイクロサービスアーキテクチャでのクエリーの実装

- テーマはマイクロサービスアーキテクチャでいかにしてクエリーを実現するか

## API Compositionパターン

- 各マイクロサービスの手前にComposerを立てて、ComposerがAPIをクライアントに公開しつつ、各マイクロサービスに必要なクエリーを発行する
    - API GatewayにComposerを埋め込むなり、独立サービスにするなり、役割分担は色々選択肢がある
- 例）ComposerはクライアントにfindOrder()を提供するために、Order、Kitchen、Deliveryなどのマイクローサービスを呼び出して、得られた情報を結合した結果を返す
- 利点：直感的で分かりやすい
- 欠点：ComposerでJoinの処理をするので、大量データを扱うのは難しい


## CQRS(Command Query Responsibility Segregation)パターン

- 概要
  - クエリー専用のサービスと専用のデータベースを用意する
  - クエリー専用サービスは、各マイクロサービスからのイベントを受けて自身のテーブルを更新する
  - クエリー機能は、自身のテーブルに対するクエリーで実現する

- 利点
    - 更新系（Command系）のサービスと、クエリー系のサービスで関心事を分離できる
    - 作り次第でクエリーが高速、かつ多様にできる
        - 事前にイベントを受けて情報を貯めておくので、クエリーに都合のいい形を事前に作っておけるので
- 欠点
    - 複雑。単にクエリー用サービスが増えるだけでなく、既存の各サービスはイベントを発行しないといけないし
    - イベントのタイムラグがあるので、例えばユーザーが自身の行った更新を、即座に見れるか？といったことを考える必要がある
        - クエリーAPIには、直前に行った更新が反映されるのを待ち合わせる仕組みも必要

## 感想

- CQRSは、ちゃんと作れば、それは何でもできるでしょうが、ちゃんと作れるのか？イベントをロストしたら、そのあと全部ずれてしまうけど大丈夫か？
- モノリシックアプリではエンティティの更新イベントのようなものはほとんど無しだけど、マイクロサービスの世界ではイベント作るのってみんなやるものなの？
JSONの中身がプレーンオブジェクトとは限らない

タイトルのとおり、JSONの中身がプレーンオブジェクトとは限りません。配列だけかもしれないし、数値だけかもしれません。

※プレーンオブジェクト：↓こんなやつ

```json
{
    "aa": "bb"
}
```

## どういうこと？

VS CodeでJSONファイルを作って適当に「aaa」と入れると、「Expected a JSON object, array or literal.」という警告が表示されます。「aaa」と書いただけのファイルは無効なJSONファイルですが、警告のとおり、JSONオブジェクト、配列またはリテラルなら何でも入れられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420120/afc804ca-d4dc-a9a3-c84b-933595e2fe15.png)

たとえば、これらは左上の「aaa」以外すべて有効なJSONファイルです。また、画像にはありませんが、``null``のみでも有効です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420120/ba7ccfc2-8b10-74c0-4704-106e03431e9a.png)

実際MDNには、文字列や数値だけでも有効なJSONになると書かれています。

> JSONは、配列やオブジェクトだけでなく、 JSON 内部に入れることができるあらゆるデータ型のデータだけでも有効なものになります。つまり、例えば、単一の文字列や数値も有効な JSON となります。
> 
> — [JSON の操作 - ウェブ開発を学ぶ | MDN](https://developer.mozilla.org/ja/docs/Learn/JavaScript/Objects/JSON#:~:text=json%E3%81%AF%E3%80%81%E9%85%8D%E5%88%97%E3%82%84%E3%82%AA%E3%83%95%E3%82%99%E3%82%B7%E3%82%99%E3%82%A7%E3%82%AF%E3%83%88%E3%81%9F%E3%82%99%E3%81%91%E3%81%A6%E3%82%99%E3%81%AA%E3%81%8F%E3%80%81%20json%20%E5%86%85%E9%83%A8%E3%81%AB%E5%85%A5%E3%82%8C%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8B%E3%82%99%E3%81%A6%E3%82%99%E3%81%8D%E3%82%8B%E3%81%82%E3%82%89%E3%82%86%E3%82%8B%E3%83%86%E3%82%99%E3%83%BC%E3%82%BF%E5%9E%8B%E3%81%AE%E3%83%86%E3%82%99%E3%83%BC%E3%82%BF%E3%81%9F%E3%82%99%E3%81%91%E3%81%A6%E3%82%99%E3%82%82%E6%9C%89%E5%8A%B9%E3%81%AA%E3%82%82%E3%81%AE%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%E3%81%A4%E3%81%BE%E3%82%8A%E3%80%81%E4%BE%8B%E3%81%88%E3%81%AF%E3%82%99%E3%80%81%E5%8D%98%E4%B8%80%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E3%82%84%E6%95%B0%E5%80%A4%E3%82%82%E6%9C%89%E5%8A%B9%E3%81%AA%20json%20%E3%81%A8%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82)

また、TypeScriptの``JSON.parse()``の戻り値の型が``any``なのは、JSONの中身が``object``型とは限らないからと思われます。

## まとめ

JSONファイルの中身は数値だけかもしれないし、真偽値だけかもしれません。プレーンオブジェクトとは限らないので、プレーンオブジェクト前提の処理を書くと困ることがあるかもしれません。
【ティラノスクリプト】背景に動画を流している場面でSEが途中で止まってしまうときの対処法（OSの問題）

#背景
ティラノスクリプトで作ったゲームをiPhoneでもプレイできるようにしたい！
ということでプロジェクトをそのままサーバーにアップロードしブラウザでプレイできるように試みました。
最初は「お、普通に動くじゃん！」と思っていましたが、bgmovieで背景に動画を流している場面で、playseで鳴らしていたボイスが途中で切れてしまうことに気づきました。
こちらの不具合が起きるのは自分が見た限りではiPhoneとiPadのみでした（macでも起きるかも？）。
windowsPCやAndroid端末では後ろで動画を流していてもSEは問題なく再生されました。

#原因
OSの問題。
ティラノスクリプト制のブラウザゲームはiPhoneだとBGMの音量が変更できない等の不具合が起きるので、今回の問題も似たようなものだと思われます。
Androidだと問題ないのに、、、

#解決策
mute=trueを追加しよう。

`@bgmovie storage=haikei.mp4 mute=true`

背景で流している動画をミュートにすることで解決します。
定かではないですが動画による音とSEでならした音はios上では共存できないようです。
背景の動画にたとえ音声がなかったとしてもmute=trueを入れる必要があります。
muteはデフォルトではfalse。

何かお気づきの点がございましたらコメントください。
Pipfileで対象ファイルのhashの変更を無視する

## 背景

- 自作のpythonパッケージ(tar.gz)を別プロジェクトでpipenv installして使いたい
- パッケージをビルドし直す度に、ファイルのhashが変わるためPipfile.lockに記載されているhashと不一致になるためpipenv installでエラーになる
- Pipfileにパラメータを追加するなどして回避したい

## 結果
- Pipfileのパラメータでは対応できなかった
- 回避策として、pipenv installする際に、`--skip-lock`パラメータを使うようにした

## pipenv install --skip-lock
参考：https://pipenv-ja.readthedocs.io/ja/translate-ja/basics.html#pipenv-install

> --skip-lock — Pipfile.lock を無視し、 Pipfile を使ってインストールします。 それに加えて、 Pipfile の変更部分を Pipfile.lock へは反映しません。
動作としては、
- Pipfile.lockが存在しなければ作成しない
- Pipfile.lockが存在しても記載されている内容は無視される。また、変更部分の反映もされない。
Pipfile.lockが存在する状態で`--skip-lock`を使用すると、実態とPipfile.lockが乖離してしまうのでよろしくないと思いました。
Pipfile.lockが無くても困らないのであれば有効かと思います。
PHP cookies 更新と反映

$_COOKIEはブラウザ上に**保存された**情報を読み込む。

setcookie関数で情報を更新する際は更新される予定の情報がまだブラウザ上に**保存されていない**（これから保存される。）
よってsetcookie関数が情報を更新する際に$_COOKIEが読み込む情報はこれまでに既に保存されている更新前のcookie情報となる。
上記がsetcookie関数による情報の更新が$_COOKIEに反映されるのにワンアクション遅れる理由。
【git】git reset とgit revertコマンドの違い


##git reset
git reset  【オプション】【HEAD^ or HEAD~n or @^】
指定した値まで【コミット履歴 + 編集内容】が削除される。
###オプション
--soft →commit履歴のみ削除
--mixed →commit履歴とaddコマンドもキャンセルされる(おpションなしの場合はこれが適用される。)
--hard →commit履歴、addコマンド、編集内容全て削除される。

##git revert
git revert 【commitのハッシュ値】
指定した値の 【編集内容のみ】が削除され、revertコマンドを行ったコミット履歴が積み重なる。



##使い方
チーム開発においてgit resetコマンドを使うのは、履歴を全て消してしまうことになるため、原則禁止
【VSCode】Macでcodeコマンドを使用可能にする方法

## はじめに
M1Macでターミナル（zsh）からVSCodeを開くために`code .`を実行したところ以下のようになり、実行できませんでした。

```:ターミナル
$ code .
zsh: command not found: code
```

## Macでcodeコマンドを使用可能にする
VSCodeの公式サイトにドキュメントがありましたので記載されている通りに進めます。

https://code.visualstudio.com/docs/setup/mac

手順は以下の通りです。
まず、VSCodeを開き、`shift + command + P`でコマンドパレットを開きます。
![スクリーンショット 2022-02-21 23.12.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/7a11b811-58bf-500e-e3f7-21bfad987b49.png)

コマンドパレットに`shell command`と入力します。
すると、`シェルコマンド：PATH内に'code'コマンドをインストールします`と`シェルコマンド：PATH内に'code'コマンドをアンインストールします`が表示されますので、`シェルコマンド：PATH内に'code'コマンドをインストールします`を選択します。

パスワードを求められるので入力し、以下のようなメッセージが表示されれば設定完了です。

![スクリーンショット 2022-02-21 23.19.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/27f2dfed-2e94-7c4f-51d9-34cb56009c1d.png)


再度ターミナルで`code .`を実行します。


```:ターミナル
$ code .
```

エラーが出ることなく、VScodeでディレクトリを開くことができました。
AWSLightsailを使ってWordPressを立ち上げる

# はじめに
夫と家族ブログを立ち上げることにしました。
せっかくなので Lightsail を使って WordPress を立ち上げてみたいと思います。
（仕事で Lightsail を使ったことないので、これを機に使ってみることにしました）

# LightsailでWordpressがインストールされたインスタンスを起動する
マネジメントコンソールの左上 "サービス" をクリックし、 "Lightsail" で検索し、クリック。
Lightsailコンソールが開かれます。

![スクリーンショット 2022-02-21 22.33.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/a7072f13-3769-4767-d98c-a02210c150fc.png)

## インスタンスを作成
![スクリーンショット 2022-02-21 22.33.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/acc02c64-ce60-c473-cc1d-597d9dee95b4.png)

Instance location で Tokyo を選択。
Platform は "Linux/Unix" を選択しました。
Blueprint は "App + OS" で "WordPress" を選択します。

![スクリーンショット 2022-02-21 22.34.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/5610494f-7507-ad67-51d0-3f159d1c7ceb.png)

Planは一番下のプランを選びました。
おそらく、個人ブログであればこのスペックで十分だと思っています。
（最初の3ヶ月は無料なんですね！良心的！）

![スクリーンショット 2022-02-21 22.34.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/42c3bf71-6ed1-b052-4e71-14d016627e60.png)

Lightsailのリソース名を決めます。
リソース名を入力したら、 "Create Instance" をクリック。

## インスタンスの起動

インスタンスを作成すると、インスタンスが起動中になります。
"Pending" になってますね。
![スクリーンショット 2022-02-21 22.34.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/b288b654-873b-6a40-cb70-4c2762df335c.png)

すこし待つとすぐに "Running" に変わります。
![スクリーンショット 2022-02-21 22.35.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/f16f85ac-7f7e-6f83-5640-8c66726eb49b.png)

これでWordPressがインストール済みのインスタンス起動は完了です。とっても簡単ですね。


## インスタンスへ接続
![スクリーンショット 2022-02-21 22.52.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/324e45f2-4549-8948-e7cf-cb452c412b96.png)

赤四角で囲んだターミナルマークをクリックすると、ターミナルが開かれ、インスタンスへ接続することができます。

![スクリーンショット 2022-02-21 22.52.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/8b123eb3-9847-9874-73e8-32386e314299.png)

インスタンスへの接続も簡単ですね！


# WordPressにアクセス

## ブログページにアクセスしてみる
Lightsailのコンソールに戻ります。

![スクリーンショット 2022-02-21 22.52.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/d955cd9f-d2f1-2db6-33f8-de1a1e2d05ad.png)

ターミナルマークの横の ・・・ をクリックし、 "Manage" をくクリックします。

![スクリーンショット 2022-02-21 22.53.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/8614d06b-3a49-78eb-0058-fead4d709b57.png)

赤枠で囲んだ部分にIPアドレスが記載されているので、そこにアクセスします。

![スクリーンショット 2022-02-21 22.53.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/9ee9f7fb-dc73-3b26-c28b-41410d88d160.png)

このようなブログサイトが開かれればOKです。
（バージョンによってはこのブログも微妙に違ったりするのでしょうか）


## WordPressにログイン

 `http://IPアドレス/wp-admin` でWordPress管理画面のログイン画面を開くことができます。
![スクリーンショット 2022-02-21 23.07.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/d69cd4be-e21c-9ed1-2007-37014c14a505.png)

インスタンスに接続し、以下コマンドを打つとパスワードが取得できます

```sh
$ cat bitnami_application_password
```

取得できたパスワードと、ユーザー名: `User` でログインができます。

![スクリーンショット 2022-02-21 23.10.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/9663b913-eb83-8cd9-778d-0436a5d7c885.png)


# おわりに
以上でWordPressの立ち上げは完了です！
思っていた以上に簡単でしたね。

静的IPとDNSの設定ができていないので、次の記事でやっていきます。
Mapped Typesでオブジェクトのvalueの名前をkeyにしたい

## 初めに
この記事は私のTypeScriptに関する備忘録をアウトプットするために使用をしています。
もっといいやり方があれば教えていただけると嬉しいです (　´･‿･｀)

## こんなことがしたい
- リテラルの型をkeyにする
- それぞれのkeyに対して同じ型をつける

下記は例えが悪いので何でこんなことをしたいのだ？となるかもなのですがそこは無視してください..

```typescript
type Servise = {
  online: 'オンライン';
  offLine: 'オフライン';
};

// ↓↓↓↓↓↓↓↓↓　

type OutputServise = {
  オンライン: string[];
  オフライン: string[];
};

```

## こうやって対応をした

```typescript
type ValueOf<T> = T[keyof T];

type ValueOfKey<T extends string, K> = {
  [P in T]: K;
};

// 結果
// type OutputService = {
//     オンライン: string[];
//     オフライン: string[];
// }
type OutputService = ValueOfKey<ValueOf<Servise>, string[]>;

```

## 最後に
すごい細かい内容ではあるのですが、Mapped Typesを用いたアウトプットでした(　´･‿･｀)
[Unity]Sceneを切り替えるEditor拡張

#概要
Sceneを頻繁に切り替えるプロジェクトで出しっぱなしにしておくと便利だと思います。
ボタンを押すごとにシーンが切り替わります。
![スクリーンショット 2022-02-21 22.42.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/bc7a6194-60df-d4d1-89cf-c921c4fc50b7.png)

#本文
Editorフォルダを作成して、
![スクリーンショット 2022-02-21 22.56.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/969aea68-e158-8bd9-916d-1b9b5000fe40.png)
フォルダ内にSelectScene.csファイルを作り、以下のコードを入力します。

```cs
using UnityEngine;
using UnityEditor;

public class SelectScene : EditorWindow
{
    private string[] scenePaths;

    [MenuItem("Window/SelectScene")]
    public static void OpenWindow() {
        EditorWindow.GetWindow<SelectScene>();
    }

    private void OnEnable() {
        string[] guids = AssetDatabase.FindAssets("t:Scene");
        scenePaths = new string[guids.Length];
        for (var i = 0; i < guids.Length; ++i) {
            scenePaths[i] = AssetDatabase.GUIDToAssetPath(guids[i]);
        }
        Repaint();
    }

    private void OnGUI() {
        foreach (var scenePath in scenePaths) {
            int startwordPosition = scenePath.LastIndexOf ("/") + 1;
            if(GUILayout.Button(scenePath.Substring(startwordPosition, scenePath.Length - startwordPosition - 6) + "シーン")) {
                EditorApplication.OpenScene(scenePath);
            }
        }
    }
}
```

後はUnityのメニューからWindow > SelectSceneを選ぶとシーン選択ウィンドウが表示されます。
![スクリーンショット 2022-02-21 22.49.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/d4e99e35-6113-927b-0401-fc9ae455a814.png)
Laravel、FormRequestで$thisにアクセスできない

# エラー
```php
Uncaught Error: Call to a member function get() on null__clone method called on non-object {””, "exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalThrowableError(code: 0): __clone method called on non-object at /var/www/local/vendor/symfony/http-foundation/Request.php:512)
```

# 原因
原因は自作FormRequestの中で定義したconstructorの継承忘れミス。
祖先のvendor/symfony/http-foundation/Requestのcloneで引っ掛かっていた。
メンバ変数が定義できていなかったから？なぜcloneが呼び出されたのかわからないが、
エラーと原因が結び付かずはまった。

```php
public function __clone()
{
　　　　$this->query = clone $this->query;
  $this->request = clone $this->request;
  $this->attributes = clone $this->attributes;
  $this->cookies = clone $this->cookies;
  $this->files = clone $this->files;
  $this->server = clone $this->server;
  $this->headers = clone $this->headers;
}
```
k8sのテストで使える公開されたマニフェスト

テスト時などにマニフェストファイルを作成してkubectl applyせずとも、
kubectl apply -f \<URL\>のようにURLを指定するだけでapplyできる公開されたマニフェストファイル


- job
https://kubernetes.io/examples/controllers/job.yaml
円周率を計算、出力する


- deployment
https://k8s.io/examples/service/access/hello-application.yaml
httpリクエストで"Hello Kubernetes!"を返す

- deployment + service
https://k8s.io/examples/application/php-apache.yaml
↓コマンドで負荷をかけて使う
HPAの動作確認をする際などに使用できる　

```bash
kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
```
バックグラウンド通知のFCMでDataを受け取る。

#はじめに
やりたかったことはCloud Messagingがバックグラウンドで通知を受け、通知をタップして起動した場合値を受け取ることがしたかった。(Cloud MessaginではデータをKey-valueの形で送れる。)そうすれば、起動した際にgooglePlayなどに飛ばして更新を促すことができる。
#問題
公式リファレンスではバックグラウンドで通知を受け取った場合「通知をタップしたときデータをペイロードします」的なことが書かれていた。しかし、具体的な方法までは書かれていなかった。データの送り方はMap型のようにKey-valueという形で送られる。
#解決
そこで、androidでデータを受け取るといえばintentなので試しにデータを送信しintentで送信したデータのkeyを受け取ってみた。

```java
 getIntent().getStringExtra("click_action")
```

そうすると意図したとおり送信した値を受け取ることができた。

#総括
バックグラウンドで受け取った通知をタップしたときにどうやってデータを受け取るかを解説した。
当たり前のことなので公式リファレンスには書かれていなかったのかもしれないがintentで送られることが明記されていないので少々迷った。

以上,初心者の備忘録より。
#宣伝
私のアプリです良かったら遊んでみてください！

https://play.google.com/store/apps/details?id=com.nisinis.brainbreak
郵便のカスタマバーコードをSVGで出力

# はじめに
![2790031_1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223441/dde6c92f-6c5e-5627-6ee4-e554c56d3b94.png)
カスタマバーコード、という、郵便番号と住所を機械で認識しやすくするためのバーコードが存在することを知った。
郵便局のWEBページ→[バーコードマニュアル](https://www.post.japanpost.jp/zipcode/zipmanual/p10.html)

郵便局のWEBページに、一応[カスタマバーコードを作成するページ](https://www.post.japanpost.jp/send/fee/how_to_pay/uke_cyaku/barcode/index.html)も存在するのだけど……
**バラバラの画像の組み合わせになってて、1枚の画像としては簡単に保存できない**のである。どうやって使うことを想定しているのだ…？

仕様を読んだら難しくなかったので、SVGで出力するプログラムを作ってみようと思った。
SVGなら拡大してもきれいだし。

**まぁ、カスタマバーコードを自分で使う予定はないんだけど。**

なので、作ったプログラムを紹介する記事を書いているわけ。

# カスタマバーコードって？

はがきとか、封筒とかについてる、↓こんなバーコードのこと。
![5540031_2-1-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223441/448a720b-c8c7-028b-e30a-248d3babeb2e.png)
これは、企業が出すDMのような、大量に送られる郵便物についてることが多い。これには郵便番号と住所が含まれていて、これを付けて出すと郵便料金が割引される。（大量に出さないと割引されないので、個人でバーコードを付ける意味はないよ。というか、個人で勝手にバーコード付けて出してもいいのかな？）

ときどきTwitterとかに住所塗りつぶした手紙の写真載せてる人いるけど、このバーコードも塗りつぶしておかないと住所バレバレ…というのはちょっと前に話題になったやつ。

# 作ったもの

https://github.com/ShTair/CustomerBarcodeGenerator

コマンドラインで、

```
CustomerBarcodeGenerator.exe <ハイフン無しの郵便番号> <住所表示番号>
```

のように実行すると、カレントディレクトリに`<ハイフン無しの郵便番号>_<住所表示番号>.svg`というファイルが生成される。

レゴランドの場合だと、

```
CustomerBarcodeGenerator.exe 4558605 2-2-1
```
となって、
`4558605_2-2-1.svg`
![4558605_2-2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223441/c91ad60c-206c-de6b-2b5c-cfa3162cf233.png)
が生成される。

住所表示番号は、○丁目とか番地とか、マンションだと棟や部屋の番号をハイフンでつなげたもの。□□町3丁目1番地△△マンションB棟123号室とかだと、`3-1B123`となる。
詳しくは郵便局のWEBページを見てください。

プログラム自体は、ほぼ、この[文字をバーの列に変換する部分](https://github.com/ShTair/CustomerBarcodeGenerator/blob/02d4c855d3d5f123991f42cf8bfca704945c935e/CustomerBarcodeGenerator/BarcodeUtils.cs#L42)がすべてですね。

# 英字と住所表示番号部の13文字目について

カスタマバーコードで表すことのできる文字数は、固定（郵便番号部7文字、住所表示番号部13文字）である。そのため、住所表示番号が13文字に満たない場合は、制御コード『CC4』で残りを埋める。逆に、超えてしまった場合は、13文字までをコード化して、それ以降は省略する。

また、カスタマバーコードで英字を表す場合は、制御文字と数字の2文字を使ってアルファベットを表す。

ということは、住所表示番号によっては、以下のようにアルファベットの途中で切れることになる。
（Cを表すには、制御コード『CC1』と数字『2』の2文字を使う必要があるが、13文字を超えるため、『2』を入れることができない。）
![2019120500040817.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223441/2455edb1-7e38-9519-57d8-22b19642fc12.png)

**で、この場合13文字目はどうするのか？**

以下のページには、コードの片割れを入れろと書いてある。（上記の図のように、『CC1』を入れる。）

https://www.post.japanpost.jp/zipcode/zipmanual/p20.html

しかし、郵便局WEBのバーコード作成するページでは、はみ出す場合は13文字目は空白のコード『CC4』が入る。
どっちやねん
if文の中でuseMemoを使ったときの面白い挙動

# if文の中でuseMemoを使ったときの面白い挙動
## はじめに
if文の中でhooksを使ったらダメなのはみなさんご存知ですよね。
もしif文の分岐でhooksが呼ばれる回数が変わったら以下のようにエラーがでて怒られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235240/50ed2b7c-5c7a-24c9-fd2b-2ccfc06d1207.png)

もしif文の分岐があってもhooksが呼び出される回数や順番に変更がなければどうなるのでしょうか？
そのときの面白い挙動を紹介します。

## 環境

```
"react": "^17.0.2",
```

## やってみた。

以下のようなプログラムを書きます。

```tsx
/* eslint-disable react-hooks/rules-of-hooks */
import React, { useMemo, useState } from "react";
import "./App.css";

function App() {
  const [flag, setFlag] = useState(true);
  let memo1 = 0;
  let memo2 = 0;
  let memo3 = 0;

  if (flag) {
    memo1 = useMemo(() => 1, []);
  }

  memo2 = useMemo(() => 2, []);

  if (!flag) {
    memo3 = useMemo(() => 3, []);
  }
  const value = { memo1, memo2, memo3 };

  return (
    <div className="App">
      <button onClick={() => setFlag((_flag) => !_flag)}>Toggle</button>
      <br />
      {JSON.stringify(value)}
    </div>
  );
}

export default App;
```

`memo1`,`memo2`,`memo3`はそれぞれ0で初期化されており、
`flag`が`true`の場合、`memo1`が`useMemo`からの値を参照し1になり、`flag`が`false`の場合、`memo3`からの値を参照し3になる想定です。`memo2`は常に`useMemo`からの値を参照し2になります。
`flag`の初期値は`true`でToogleボタンをクリックすると`true`と`false`が入れ替わります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235240/5a265536-033f-ddc3-8d54-e4812edaa7e1.png)

初回は上記のような表示になります。
`memo1`,`memo2`,`memo3`は以下の値です。
`{"memo1":1,"memo2":2,"memo3":0}`

別に問題なさそうですね。
ではToogleボタンをクリックして`flag`を`false`にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235240/5a01cc22-da88-4714-542d-9f3dfe9db508.png)

おや...！？
予想だと`{"memo1":0,"memo2":2,"memo3":3}`になると思ったんですが。
memo2に値を代入している`useMemo`常に2を返しているはずなのに値が1になっています。またmemo3に値を代入している`useMemo`も常に3を返しているはずなのに値は2になっています。

これはおもしろいですね。

## 考察
関数の外側からはuseMemoがどこで呼ばれたかではなく、何回よばれたかという情報しかわからないからこういう挙動なんだろうと思う。もしどこで呼び出したかまでわかるようにするとしたら`key`みたいな概念が必要と思われる。きになってReactのリポジトリ見にいったけどさっぱりわかりませんでした。どこ読めばわかるかわかった人いたら教えてください💕
Rust 言語仕様02　所有権と参照と借用

引き続きアウトプットしていきます。

### 文字列スライス

文字列スライスは静的領域に格納されており、参照を意識する必要があります。
ポインタとレングスがあります。

```rust
let s1 = "hello Rust"; // 文字列スライス
println!("Stack address of y is: {:p}", &s1); // 格納されているアドレスをポインタ形式で表示
println!("Stack memory address of y is: {:?}", s1.as_ptr()); // 静的格納領域に紐付いたアドレスの値を取得
println!("Len of s1 is: {}", s1.len()); // スタック内の値を取得
```

### String型

String型はヒープメモリに格納されています。ヒープとは動的に確保と解放ができるメモリ領域のことでデータの仮置き場や、臨時の作業台とも言われております。
ポインタとレングスとキャパシティーがあります。

あと、所有を意識する必要があります。

```rust
let mut s1 = String::from("hello");
let mut s2 = String::from("helloworld");
println!("Stack address of s1 is: {:p}", &s1); //
println!("Stack address of s2 is: {:p}", &s2); //
println!("Stack memory address of y is: {:?}", s1.as_ptr());
println!("Stack memory address of y is: {:?}", s2.as_ptr());
println!("Len of s1 is: {}", s1.len());
println!("Len of s2 is: {}", s2.len());
println!("Capacity of s1 is: {}", s1.capacity());
println!("Capacity of s2 is: {}", s2.capacity());
s1.push_str("_new1"); // 文字追加
s2.push_str("_new2"); // 文字追加
println!("Len of s1 is: {}", s1.len());
println!("Len of s2 is: {}", s2.len());
println!("Capacity of s1 is: {}", s1.capacity());
println!("Capacity of s2 is: {}", s2.capacity());
println!("{} {}", s1, s2);
```

### 所有権を導入する理由

二重開放エラー回避のために導入されていますがどうゆう時に起きてしまうかと言うと、メモリを二重に開放してしまう時に起きます。なので`Rust`は所有者だけがヒープメモリに確保されたメモリを解放できるようにしました。
そして、文字列スライスが参照であり所有なのかですが、静的領域に格納されるとそもそも解放する必要がないのと、String型から作った場合、所有権はString型から移動しないためです。また、所有権を移動させずに参照する権利だけを貸し出す（借用）ことを行っているからです。


## 最後に
今回はメモリ管理についてです、
他にも、アロケーターやメモリリーク、ガベージコレクションなどメモリ管理に関することも学びましが、`Rust`の内容に特化したかったので省きました。
メモリ管理は奥が深く面白いと思いました。
@mixin内部で@functionの定義はできない

## @mixin 
sassの基本的な説明は、ここでは行いません。私が、調べても中々出て来なかったので、このことが誰かのためになれば良いと思います。

タイトルの通り、@mixinの内部では@functionの定義はできないという事
基本的な話はしないと言いつつも、

### @mixinとは
> スタイルの集まり(ルールセット)を定義しておき、他の場所で使える様にしたもの
> 引数を指定できることが@extendとの違い

```scss:@mixinの定義
@mixin ミクシン名($仮引数) {  // $widthを仮引数で定義
  プロパティ: 引数を利用した値; // $width * 3 みたいなことができる
}
```


## @function
### @functionとは
> 関数はmixinと似ているが、mixinがひとまとまりのルールセットを呼び出し側にインクルードするのに対し、関数は何らかの値を受け取って、その演算結果を値として返すために使用する(関数の方が粒度が小さい)。
> 関数は値、Mixinはルールのかたまり(値などもルールの一部)
> @mixin内では定義できない(これは今回のことでわかった)

```scss:@functionで関数の定義
@function 関数名($引数1, $引数2: デフォルト引数) {
  //なんらかの処理をする
  @return 戻り値;
}
```

## 今回やってみたこと
> 要は冗長な書き方を自作関数をつかってmixin内で定義することでシンプルにしたかったという事

```scss:自作のエラーが起きたmixin
@mixin circleOrbit($width, $height, $time, $delay) {
  // 親要素に対する周回軌道をつくる
  $top: 0;
  $left: 0;
  // === 関数を使わない書き方 ====
  // @if $width>=50 {
  //   $left: 25 - ($width - 50) / 2;
  // }

  // @else {
  //   $left: 25 + (50 - $width) / 2;
  // }

  // @if $height>=50 {
  //   $top: 25 - ($height - 50) / 2;
  // }

  // @else {
  //   $top: 25 + (50 - $height) / 2;
  // }
  // ==== ここまで ====

  @function setPosition($whvalue) {
    @if $whvalue>=50 {
      $top: 25 - ($whvalue - 50) / 2;
    }
    @else {
      $top: 25 + (50 - $whvalue) / 2;
    }
    @return $top
  }

  position: absolute;
  left: $left;
  //top: setPosition($top);
  top: $top; 
  width: $width;
  height: $height;

  @keyframes anime {
    0% {
      //回転時の初期値
      transform: rotate(0deg) translate(-100%) rotate(0deg);
    }

    100% {
      transform: rotate(360deg) translate(-100%) rotate(-360deg);
    }
  }

  animation: {
    name: anime; //keyframesで定義した名前, none
    duration: $time; // アニメーションの総時間,s(秒数), ms(1/1000秒)
    timing-function: linear; // イージングの指定
    delay: $delay; // 開始の遅延時間, s(秒数), ms(1/1000秒)
    iteration-count: infinite; // 整数値, infinite(無限に繰り返す)
  }
}
```
このような感じで改めてコードの確認をしたものの動いたとしてもロジックが違うよね！というのはご了承ください。
関数の呼び出しをmixin内で呼ぶことができると思っていたのですが、@functionを外に出すとコンパイルエラーにならず、中に入れるとコンパイルエラーになります。

## 本題
> 結論からいうと正直よくわからないができないということ。VS codeの拡張機能の"Live Sass Compiler"を使ってscssファイルのコンパイルを見守っていただいているのですが、コンパイル時のエラーで以下の様なメッセージが表示されていました。

```shell:エラー文
Compilation Error
Error: Functions may not be defined within control directives or other mixins.

```
> 翻訳すると
> _関数は、制御ディレクティブや他のミキシンの中で定義することはできません。_
> とのことでした。つまり、@if、@for、@while、@eachなどの制御文、およびミクシン内では@functionは定義できない様です。決まりなのでしょうがない。

## まとめ
最近はJavaScriptを勉強していたので、同じ様な発想でSassに挑んでいたのですが、ちょいちょいSassには曖昧な部分が多く、こちらがわで決め事を作らないといけないなぁというもっと縛られたい願望が募っていたのですが、これはこれでわりの合わない決まりだと思いました。またエラー文よりも先にネットの記事を検索していたのですが、エラー文にそのまま答えがのっていたのは反省するものです。
LogAnalyticsのデータ削除

LogAnalystics のデータを削除するには Azure の画面からはできません。
RESTで行えますが、以下のページから条件を指定しても削除できます。

https://docs.microsoft.com/ja-jp/rest/api/loganalytics/workspace-purge/purge

「使ってみる」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/773c45e7-6703-fe23-d46a-ce68c2182f82.png)
削除するテーブルのリソースグループ名、ワークスペース名を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/6fb35df1-cb65-aecf-0c8d-09cba6cae080.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/729f3574-5446-2990-5b56-a6ff55f034f1.png)
本文に削除条件をjsonで記述します。filter と table は空文字だとエラーになります。また、キーはダブルクォーテーションで囲ってください。
「実行＞」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/cb6f3509-e26b-a2f4-e123-836e981979c6.png)
削除が成功すると202ステータスが返ってきます。削除されるには少し時間が掛かる場合があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/f25e2d84-7a78-e41b-93bc-9d5d7f335cd1.png)
apiとか使わずにGoogleAppsScript経由でjava script でgmailを送る方法

apiとか使わずにapp script経由でjava script でgmailを送る方法です。

具体的にどうなってるのかというと

1.javascriptでget送信でapp scriptを起動

2.app scriptがget送信のクエリを取得してgmailを送る.


```GoogleAppsScript:appscript側
function doGet(e) {
  let options = e.parameter.name //送信者の名前
  let body = e.parameter.text   //本文
  let subject = e.parameter.subject //送信先の担当者名   
  let recipient = e.parameter.mail　        　　　　//送信先のメールアドレス

  GmailApp.sendEmail(recipient, subject, body, options);
}
```
上をまずデプロイします。
そして、urlを取得します。

```javascript:javascript側
let name = ""; //送信者の名前
let text = "";//本文
let subject = "";//送信先の担当者名 
let mail = ""//送信先のメールアドレス

let send = "https://script.google.com/macros/xxxxxxxxxxxxxx/exec?name=${name}&text=${text}&subject=${subject}&mail=${mail}"  //appscriptのurl
var data_url = new XMLHttpRequest();
data_url.open('GET', send);
data_url.send();
```

これでapiを使わずにgmailを送れます。

中二が書いたコードなので変なとこがあったら大目にみてください。m＿　＿m
一応サーバーとかに上げてみてもうまくいきました。

追記:よくよく考えたらセキュリティ的にクソ雑魚でした。
40 代おっさん GASのSheetクラスについて学ぶ

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## Sheetクラス

Sheetクラスとは
シートを操作する機能を提供するクラス

＊Sheetクラスの主なメンバーの図はさすがに作るのがきびしいので、参考資料の本を見ていただくか、ネットで調べください。

ちなみにこちらで書いてありました。
<https://hirachin.com/post-4006/>

お試し

```javascript
function toshiki4() {
  const sheet = SpreadsheetApp.getActiveSheet();

  console.log(sheet.getIndex()); 
  console.log(sheet.getName());
  console.log(sheet.getParent().getName());
  console.log(sheet.isSheetHidden());
}
```

### セル範囲を収得する

セル範囲を収得するメソッドはいくつかある。
その中でもスタンダードなのが、getRangeメソッド

セル範囲のアドレスを文字列で渡し、その範囲を取得する方法

```javascript
sheetオブジェクト.getRange(アドレス)
```

他のパターンで行番号、列番号、行数、列数を組み合わせてセル範囲を指定する方法

```javascript
sheetオブジェクト.getRange(行番号, 列番号, [行数, 列数])
```

お試し

```javascript
function toshiki4() {
  const sheet = SpreadsheetApp.getActiveSheet();

  console.log(sheet.getRange('B2').getA1Notation()); 
  console.log(sheet.getRange('D4:F6').getA1Notation());
  console.log(sheet.getRange('2:2').getA1Notation());  
  console.log(sheet.getRange('B:B').getA1Notation()); 

  console.log(sheet.getRange(4, 4).getA1Notation()); 
  console.log(sheet.getRange(4, 4, 3).getA1Notation()); 
  console.log(sheet.getRange(4, 4, 3, 3).getA1Notation()); 
 }
```

### シートのデータ範囲を取得する

アドレスや行番号、列番号が分からない場合、変化する場合のセル範囲を収得する方法

シート上のデータが存在する範囲を自動で判別して収得する
getDataRangeメソッド

構文

```javascript
sheetオブジェクト.getDataRange();
```

セル範囲ではなく、データが存在する最後の行番号または列番号を収得する。
getLastRowメソッド　シートのデータがある最後の行番号を返す

```javascript
sheetオブジェクト.getLastRow();
```

getLastColumnメソッド　シートのデータがある最後の列番号を返す

```javascript
sheetオブジェクト.getLastColumn();
```

お試し

```javascript
function toshiki4() {
  const sheet = SpreadsheetApp.getActiveSheet();

  console.log(sheet.getDataRange().getA1Notation()); 

  const row = sheet.getLastRow();
  console.log(row);
  
  const column = sheet.getLastColumn();
  console.log(column);

  const range = sheet.getRange(1, 1, row, column);
  console.log(range.getA1Notation());
}
```

1行、1列目などを空白行にしてシートを構成するケースがありますが、それだとgetDataRangeメソッドの効果は低下するようです。

### シートに行を追加する

シートを1行1列目から表を構成するとappendRowメソッドを使えるメリットがでます。
appendRowメソッドは引数として与えた配列をそのままシート最終の次の行に使いするメソッドです。

構文

```javascript
Sheetオブジェクト.appendRow(配列)
```

お試し

スプレッドシートにデータを入れてから試してください

```javascript
function toshiki4() {
  const sheet = SpreadsheetApp.getActiveSheet();

  sheet.appendRow(['アッキー', 9, 'リンゴ']);
  sheet.appendRow([null, '=sum(B2:B4)'])
}
```

### シートをクリアする

シートをクリアする方法

cleartentsメソッド
コンテンツのみ、つまり入力されている値や数式などの内容のみをクリアする

構文

```javascript
Sheetオブジェクト.cleartents()
```

clearFormatsメソッド
背景、フォント、罫線などの書式のみをクリアする

構文

```javascript
Sheetオブジェクト.clearFormats()
```

clearメソッド
上の両方をクリアする

構文

```javascript
Sheetオブジェクト.clear()
```

## 参考資料

<https://www.amazon.co.jp/s?k=google+apps+script+%E5%AE%8C%E5%85%A8%E5%85%A5%E9%96%80&adgrpid=110264232688&gclid=CjwKCAiA9aKQBhBREiwAyGP5lSl7AJJLCvOEHb4wQgMlyqW1fll5X8GDTT_Rkd1_soUAyIPMXQr26hoClHEQAvD_BwE&hvadid=553833563682&hvdev=c&hvlocphy=1009076&hvnetw=g&hvqmt=b&hvrand=4378489642044417389&hvtargid=kwd-594191211348&hydadcr=4106_13159878&jp-ad-ap=0&tag=googhydr-22&ref=pd_sl_2x1owglv0s_b_p52>
PowerAutomate: 動的な Excel での更新方法

# 背景
社内で質問される方が多いので、簡単だが残しておく

# 概要
- JSON で定義するだけ

# 詳細
列名と、更新したい値をセットにして定義するのみ。同時に複数列も可能。
複数行更新時は Loop で

```json:更新値
{
  "test": "Value値"
}
```

![2022-02-21_13h49_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/c2631ecd-5a0b-a10b-9b6b-12a7dfd123f6.png)
結果はこんな感じ<br>
![2022-02-21_13h57_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/9e712f7a-90e6-00a1-ef11-38181f356034.png)


同時に複数行更新したい場合は以下かな。

- Graph API
- Office Scripts

# Excel の転記なら以下なんかも
https://qiita.com/baku2san/items/a669f02286bf9116a232

https://qiita.com/baku2san/items/2842e7e4223acab950ed
【メモ】DAOパターンのファイル一例【Java】



## 

```java:TaskDaoImpl
@Repository
public class TaskDaoImpl implements TaskDao {

	private final JdbcTemplate jdbcTemplate;

	public TaskDaoImpl(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

	@Override
	public List<Task> findAll() {

	  String sql = "SELECT task.id, user_id, type_id, title, detail, deadline, "
			+ "type, comment FROM task "
			+ "INNER JOIN task_type ON task.type_id = task_type.id";

	  //削除してください

	  //タスク一覧をMapのListで取得
	  List<Map<String, Object>> resultList = jdbcTemplate.queryForList(sql);

	  //return用の空のListを用意
	  List<Task> list = new ArrayList<>();

	  //二つのテーブルのデータをTaskにまとめる
	  for(Map<String, Object> result : resultList) {

		Task task = new Task();
		task.setId((int)result.get("id"));
		task.setUserId((int)result.get("user_id"));
		task.setTypeId((int)result.get("type_id"));
		task.setTitle((String)result.get("title"));
		task.setDetail((String)result.get("detail"));
		task.setDeadline(((Timestamp) result.get("deadline")).toLocalDateTime());

		TaskType type = new TaskType();
		type.setId((int)result.get("type_id"));
		type.setType((String)result.get("type"));
		type.setComment((String)result.get("comment"));

		//TaskにTaskTypeをセット

		list.add(task);
		}
	  return list;
	}

}
```
TRPGログをmarkdownにするプログラムをつくった 

# こんなものを作りました

https://github.com/msattova/trpgLOG2md

やってることは非常にシンプルです。ざっくり説明するとこんな感じ。

1. HTMLファイルを読み込む

1. `<p>`タグの内側の文字列（HTMLタグ込み）を検索して全部取得
1. 取得した文字列から`<span>`タグの内側の文字列（HTMLタグを含まない）を取得
1. それぞれの文字列を適宜markdownの文法で装飾したりしなかったりの処理をする
1. 処理した文字列をoutputディレクトリ内に.mdファイルとして出力

# なんでこんなものを？

私はHUGOで生成した静的サイト上でTRPGのログを公開しようと考えていました。
[この記事](https://qiita.com/msattova/items/8695ac914d2ee2638e38)にその時やった試行錯誤が書いてあります。

その記事を書いていたときはHTMLファイルの状態で公開しようと考えていたのですが、既存のログコンバーターではあまり満足できず、かと言って自作するのもデザインや機能面での悩みが多く……

平たく言えば**妥協の産物**です。

# 使い方

`py main.py -h`とかやると以下のメッセージが出てきます。

```
usage: main.py [-h] [-l] [-o [OUTPUT]] [--only ONLY] [--exclude [EXCLUDE ...]] [--notab] filename

HTMLファイル形式のTRPGログをmarkdownにするツールです。

positional arguments:
  filename              変換したいログのファイル名

options:
  -h, --help            show this help message and exit
  -l, --leave           出力ファイル名を入力ファイル名と同じにする （-oオプションは無視されます）
  -o [OUTPUT], --output [OUTPUT]
                        出力ファイル名
  --only ONLY           指定したタブのみ変換
  --exclude [EXCLUDE ...]
                        指定したタブを除外して変換
  --notab               タブ名を表示しない
```

基本的な使い方は`-h`メッセージを見ていただければわかるかと思いますので、`-h`メッセージを見てもわからないことについて軽く説明します。

このプログラムの出力ファイルは`main.py`を実行したディレクトリと同じディレクトリに存在する`output`ディレクトリ内に出力されます。

なので、`-o`オプションに続いて`/hoge_dir/hoge.md`とかやると（`output/hoge_dir`が存在する場合を除き）エラーになります。

この点については別に強いこだわりがあって設定した仕様というわけではないので、今後改善する予定です。

# 参考

プログラムの作成にあたり、参考にした記事等の一覧です。

* [argparse --- コマンドラインオプション、引数、サブコマンドのパーサー](https://docs.python.org/ja/3/library/argparse.html)
* [Argparse チュートリアル](https://docs.python.org/ja/3/howto/argparse.html#id1)
* [BeautifulSoup4のチートシート(セレクターなど）](https://python.civic-apps.com/beautifulsoup4-selector/)
* [10分で理解する Beautiful Soup](https://qiita.com/Chanmoro/items/db51658b073acddea4ac)
コード冒頭に"author"と"created date"を付けたい！

#はじめに

こんにちは。
Soohです。
競プロをしている方なら、1度はtouristのコードを見たことがあるのではないでしょうか。
すると以下のようなものが出てきます。
![スクリーンショット 2021-09-03 18.32.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960748/a6043f0d-d2ed-a54f-6386-7c08816bff2b.png)

「ママぁん、これどうやればいいのおお？？？」ということで、ファイルを作った際にタイムスタンプが押されるようにはどうすればいいかを解説します。

#テンプレートファイルを作ろう
自分がコードを書いている際に使っているテンプレートがあると思います。<br>そのテンプレートの冒頭に次のようなものを加えましょう。

* C++の場合

```c++:template.cpp
 /**
  * author  : Sooh
  * created : date
 **/ 
 // 以下普段のテンプレート
```

* Pythonの場合

```py:template.py
##
# author   : Sooh
# created  : date
##
# 以下普段のテンプレート
```

authorの部分には、自分の名前を書いてください。

# ファイルの文字列を置き換えよう
私がMacユーザーなので、以下はMacを使用している仮定のもと話を進めます。
とりあえずターミナルを開くと、ターミナル上部にbashまたはzshのどちらを使っているかが分かると思います。分からなければ、[これ](https://mykii.blog/what-is-shell-bash-and-zsh/)を見ながら確認してください。

* bashの場合


```bash
open ~/.bashrc
```

* zshの場合


```zsh
open ~/.zshrc
```
をするとテキストエディタが表示されると思うので、これに以下を追記します。

```bash
make(){
  time_stamp=$(date +%d.%m.%Y\ %H:%M:%S)
  case $1 in
    *".cpp") cp ~/template.cppまでのパス/template.cpp $1 ;;
    *".py") cp ~/template.pyまでのパス/template.py $1 ;;
  esac
  sed -i "" "s/date/$time_stamp/" $1
}
```
makeは既存のコマンドと被らない限り何を使ってもいいです。よく分からない方は、このままでいいかな。
最後にターミナル(VScode等)を再起動しましょう。

#使い方
準備が整いました。
今いるディレクトリで次のコマンドを叩いてみてください。

```bash
make main.cpp
# Python使ってる場合は make main.py
```
そして、このファイルを開いてみるとタイムスタンプが埋め込まれていることが分かります。
わーい！！！
違った拡張子を持ったファイルでも、同じように書けばなんとかなります。試してみてください。

#まとめ
「ママぁん、ぼくもtouristになれたよおおおおおおん」
FactoryBotのtransientとは

##transientとは
作成時に挙動を変更するためのフラグや追加データとして利用するのが一般的。

実際に作成するデータと直接関係無い新しい``attribute``を定義する機能。

そこで定義されたものは実際の``model``にはセットされず``attributes_for``でも出力されない。

##使用例
``transient``は各``attribute``の値にも利用でき、``callback``でも利用可能。

```rb
FactoryBot.define do
  factory :article do
    sequence(:title) { |n| "title-#{n}" }
    sequence(:slug) { |n| "slug-#{n}" }
    category
  end

  trait :with_author do
    transient do
      sequence(:author_name) { |n| "test_author_name_#{n}"}
      sequence(:tag_slug) { |n| "test_author_slug_#{n}"}
    end

    #build直後に自由にインスタンスを修正することができる。コールバック。
    after(:build) do |article, evaluator|
      article.author = build(:author, name: evaluator.author_name, slug: evaluator.tag_slug)
    end
  end
```

``after_build``のブロック第２引数``evaluator``を渡すことで、``transient``ブロック内の変数にアクセスできる。

##参考記事
[FactoryGirlのtransientとtraitを活用する](https://qiita.com/joker1007/items/da63b8630351c1f3fe1d)
[FactoryBot（旧FactoryGirl）で関連データを同時に生成する方法いろいろ](https://qiita.com/metheglin/items/47116ccbdb26aa00e034)
macOS（Monterey）で日本語入力中に半角スペースを入力したい

# 概要
macOSを使っている人には、「慣れ」なのか、なんらかの解決策を持っているのか不明ですが、私にはQiita投稿をmacOSでやっていると、毎回半角スペース（半角空白）になんとなく「もやっ」とするものがありました。

そう、日本語入力をしている最中に「Abcd Efgh」など入力しようとすると、結構面倒なのです。
解決策の１つとしては、わざわざ「英数」キーを押してアルファベット入力することです。

ただ、こんな方法を毎回やるのはウザい。

そこで、Shiftキーを押しながら入力します。
一見すると、想定通りに入力できているのですが、空白がなぜか全角になります。
Qiita上だと厄介で全角空白のほうが「狭く」見えるので厄介です。

さらに厄介なのは、全角空白として入力されたものを削除して、Shift＋Spaceを入力すると、今度は半角空白になるということ。

まさに、Windowsではできているのに、なんでmacOSではできない！？
ってことですね。

# 解決方法
色々調べてみると設定を変更して対応しているのですが、自分はあまりそういう対応をしたくない（大抵、OSのバージョンが変わると使えなくなってしまう）。

単純な解決方法として、最終的に採用したのは
<font color="red">**「fn＋Space」で半角スペースを入力すること**</font>でした。

Shift＋Spaceでイライラしてましたが、とりあえずイライラは半減しました。