OmniAICreator/Qiita-1.07M huggingface dataset:
NGINXで中間証明書を指定する


## Let's Encryptから取得した証明書
```
# ls -1
cert.pem　　# SSL証明書
chain.pem   # 中間証明書
private.pem # 秘密鍵
```

## 指定することはできない
- のでSSL証明書と中間証明書をvimで合体する
- 上と下をくっつければOK
- Apacheだと中間証明書を指定するオプションがあるがNginxだとない

```
-----BEGIN CERTIFICATE-----
SSL証明書
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
中間証明書
-----END CERTIFICATE-----
```

## config設定
```nginx

    server {
        listen       443;
        server_name  vamdemicsystem.black;
        root         /usr/share/nginx/html;

        ssl_certificate     "/etc/nginx/cert/cert.pem";    # SSL証明書+中間証明書
        ssl_certificate_key "/etc/nginx/cert/private.pem"; # 秘密鍵
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers PROFILE=SYSTEM;
        ssl_prefer_server_ciphers on;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            proxy_pass https://192.168.11.254;
            proxy_set_header X-Forwarded-Proto    $scheme;
            proxy_set_header HOST                 $host;
            proxy_set_header X-Real-IP            $remote_addr;
            proxy_set_header X-Forwarded-Host     $host;
            proxy_set_header X-Forwarded-Server   $host;
            proxy_set_header X-Forwarded-For      $proxy_add_x_forwarded_for;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
```
pathの書き方

```
prototypes GET    /prototypes(.:format)  prototypes#index

```
ターミナルでパスを見つける際、rails routesをする。今回はその解説をしていく。
/の後のprototypes(.:format)/:id で：idがついた場合は、パスはprototypes(prototype.id)という書き方にしなければならない。（.:format）は拡張子である。例えば、今回の場合はhtmlが入っている拡張子である。
【Ruby】バイナリーサーチを使用して配列内の要素の検索

## 概要

少々複雑に感じることも言語化することで理解をを深くできると思いまとめました。もっと良い表現や間違えなどご指摘いただけたら幸いです。

## 目次

- バイナリーサーチとは
    - 検索プロセス

- 実践
    - 問題
    - 解答

- まとめ

- 参考文献

## バイナリーサーチとは
ソート済みのリストや配列に入ったデータを検索するときに使用する手法です。対象のデータを半分に絞り込むことで検索していきます。

#### 検索プロセス

- **二分割したときの値**と**検索したいデータが一致**するまで繰り返し検索するように **while** を使用

    - 検索したいデータが半分より**右にあるか？　左にあるか？**
    - もしくは**配列内に存在しないのか？**
    

## 実践

#### 問題

>配列に任意の値が存在するかどうか、そして何番目に存在するのか、検索してください。

#### 解答

```ruby
def binary_search(ary, target)

  left = 0                # 配列は0番目スタート
  right = ary.length - 1  # 配列の最後尾（番目）

  while left <= right           # 目的の値を見つけるまで
    center = (left + right) / 2 # 配列の真ん中を取得

    if ary[center] == target                              # 配列の添字と検索したい数字が揃ったら
      return "#{target}は配列の#{center + 1}番目に存在します"  # returnで結果を返す

    elsif ary[center] < target # 検索したい数字が半分より右側にあったら
      left = center + 1        # 半分より右側を検索するように添え字に1を足す

    else                       # 検索したい数字が半分より左側にあったら
      right = center - 1       # 半分より左側を検索するように添え字から1を引く
    end
  end

  return "#{target}は配列内に存在しません" # whileの条件を外れ、検索に引っかからなかった時
end

# 配列
ary = [1, 3, 5, 6, 9, 14, 24, 33, 45, 53]

# ターミナルで検索したい数字を入力する
p '検索したい数字を入力してください'

# 数字なのでto_iを使用
target = gets.to_i

# ソート済みの配列と検索したい数字をbinary_searchメソッドに渡す。
p binary_search(ary, target) 
```

## まとめ

- バイナリーサーチとはソート済みのリストや配列に入ったデータを検索するときに使用する手法
- 二分割しながら値を絞り込む

## 参考文献

- [Rubyで二分探索法（バイナリサーチ）を書いてみた](https://qiita.com/ryosuketter/items/2798b09330e7102b6cfe)
【初めてのチーム開発①】仲間と一緒にHello, World!する

<div>
<p>Qiita初投稿です。<br>
この度初めて本格的にチーム開発をすることになったので、<br>
準備手順を自分用の備忘録として残しときます。</p>
</div>

<p>（※ 適宜編集します）</p>

<h2>0. 手順</h2>
1. GitHubリポジトリ作成〜招待
2. 自分のローカル環境にクローン
3. index.htmlなどを追加してpush

<h2>1. GitHubリポジトリ作成〜招待</h2>
<p>
（リードプログラマー）<br>
・GitHubリポジトリ作成<br>
・チームメンバーをリポジトリに招待<br>
<br>
（メンバー）<br>
・招待メールを開き、招待をacceptする<br>
・リポジトリをforkする<br>
</p>

<h2>2. 自分のローカル環境にクローン</h2>
```
$ mkdir (ディレクトリ名)
$ git clone git@github.com:リードプログラマーのユーザー名/リポジトリ名.git
```
<h2>3. index.htmlなどを追加してpush</h2>
```
$ git init
$ git remote add リモート名 https://github.com/リードプログラマーのユーザー名/リボジトリ名.git
$ git remote -v
```
```
$ git checkout -b develop
$ touch index.html
（index.htmlを編集。[下記参照]）
```
```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  <title>Vue.js test</title>
</head>

<body>
  <div id="app">
    <!-- testValの内容を表示 -->
    {{ testVal }}
  </div>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        testVal: 'Hello World!' //testValを定義
      }
    });
  </script>
</body>
</html>
```
```
$ open index.html (→ Hello,World!が表示されることを確認)
$ git add -A
$ git commit --allow-empty -m "first commit"
$ git push -u origin develop
```

<h2>【参考記事】</h2>
・<a href="https://qiita.com/s56258/items/f650b3e2b3d76c433e6c">「githubで共同開発 招待方法」</a>
・<a href="https://qiita.com/masamitsu-konya/items/abb572337156e4d003cf">「GitHubにあるリポジトリをローカルにcloneする方法」</a>
・<a href="https://qiita.com/syougun360/items/013229aeddec08121474">「チーム開発 GitHubの使い方」</a>
・<a href="https://qiita.com/hyaroy_pg/items/ecb60ee3971e059507bd">「Vue.jsで Hello World!」</a>
・<a href="https://qiita.com/NorsteinBekkler/items/b2418cd5e14a52189d19">「Gitの最初のコミットは空コミットにしよう」</a>
・<a href="https://qiita.com/infratoweb/items/5021a36f69f26dc7f0b9">「gitを使用したブランチ作成からpushまでの簡単な流れ」</a>
macOS Big Sur で poetry を使って numpy をインストールできなかったので無理やり回避した

## 環境

- OS: macOS Big Sur
- Python : 3.8.7 (from Homebrew)
- pip : 20.2.3
- shell : zsh

## 発生した事象

`pyproject.toml` に次のような記述が含まれている状態で、 `poetry install` を行ったところ

```toml
[tool.poetry.dependencies]
python = "3.8.*"
pip = "^20.3.3"
gcsfs = "^0.7.1"
lightgbm = "^3.1.1"
pandas = "^1.2.0"
matplotlib = "^3.3.3"
seaborn = "^0.11.1"
```


```console
% poetry install

Python 2.7 will no longer be supported in the next feature release of Poetry (1.2).
You should consider updating your Python version to a supported one.

Note that you will still be able to manage Python 2.7 projects by using the env command.
See https://python-poetry.org/docs/managing-environments/ for more information.

Installing dependencies from lock file

Package operations: 80 installs, 0 updates, 0 removals

  • Installing lazy-object-proxy (1.4.3)
  • Installing six (1.15.0)
  • Installing wrapt (1.12.1)
  • Installing certifi (2020.12.5)
  • Installing astroid (2.4.1)
  • Installing chardet (3.0.4)
  • Installing idna (2.10)
  • Installing isort (4.3.21)
  • Installing mccabe (0.6.1)
  • Installing pyasn1 (0.4.8)
  • Installing pycodestyle (2.6.0)
  • Installing pyflakes (2.2.0)
  • Installing toml (0.10.2)
  • Installing urllib3 (1.26.2)
  • Installing cachetools (4.2.0)
  • Installing flake8 (3.8.4)
  • Installing multidict (5.1.0)
  • Installing numpy (1.19.5): Failed

EnvCommandError
```

## 回避策

poetry を使わずに pip 20.3.3 を使うとインストールできる (python 3.9 を用いているものの、python 3.8 でも同様)

```console
% python3.9 -m venv --upgrade-deps venv
Collecting pip
  Downloading pip-20.3.3-py2.py3-none-any.whl (1.5 MB)
     |████████████████████████████████| 1.5 MB 4.9 MB/s 
Collecting setuptools
  Using cached setuptools-51.1.1-py3-none-any.whl (2.0 MB)
Installing collected packages: pip, setuptools
  Attempting uninstall: pip
    Found existing installation: pip 20.2.3
    Uninstalling pip-20.2.3:
      Successfully uninstalled pip-20.2.3
  Attempting uninstall: setuptools
    Found existing installation: setuptools 49.2.1
    Uninstalling setuptools-49.2.1:
      Successfully uninstalled setuptools-49.2.1
Successfully installed pip-20.3.3 setuptools-51.1.1
% source venv/bin/activate
(venv) % pip install numpy
Collecting numpy
  Downloading numpy-1.19.5-cp39-cp39-macosx_10_9_x86_64.whl (15.6 MB)
     |████████████████████████████████| 15.6 MB 411 kB/s 
Installing collected packages: numpy
Successfully installed numpy-1.19.5
```

ので、pip を使えば解決は一応できます。**が、おすすめしません**。poetry で `requirements.txt`を出力するようにすればまあなんとか…。

```console
% poetry config virtualenvs.create false
% python3.8 -m venv .venv && source .venv/bin/activate && pip install -U pip && (poetry export --without-hashes > requirements.txt) && pip install -r requirements.txt && deactivate
```

このあと `poetry install` すると通りますし、`poetry shell` も通りますが、なんかコレジャナイ感がすごいです。よりよく解決したいですね。

## 関連

- [Which pip version does poetry use? · Issue #732 · python-poetry/poetry](https://github.com/python-poetry/poetry/issues/732)
- [poetry install uses an old pip version · Issue #1661 · python-poetry/poetry](https://github.com/python-poetry/poetry/issues/1661)
Herokuの概要

##目的
Herokuについての概要を知ること、自身の学習の糧とすることを目的としております。

##Herokuとは
アプリケーションの公開、運用を行うための**サーバーを提供してくれる**サービス。
基本的には無料で使用することができる。デプロイの手間が少なくなる。

##デプロイとは
ネットワークを通じてWebアプリケーションなどのシステムを公開し、利用可能な状態にすること。

##ClearDBアドオン
MySQLを使用するためのツール。Herokuではデータベースの設定がデフォルトでPostgreSQLになっているため、開発環境でMySQLを使用する際に必要。

##流れ
1.ターミナルにて下記のコマンドを入力する。

    % brew tap heroku/brew && brew install heroku     

2.インストールできているか確認する。

    % heroku --version
※heroku/◯.◯.◯ ~~~など、数字が記述された表示がされればインストール完了。

3.ログイン

    %  heroku login --interactive
   メールアドレス、パスワードを記述する。

4.Heroku上にアプリケーションを作成する。

    % heroku create 'アプリケーション名'

5.確認

    % git config --list | grep heroku
※fatal: not in a git directory以外が表示されれば完了。

6.ClearDBアドオンの追加

    % heroku addons:add cleardb
7.設定変更
    
    % heroku_cleardb=`heroku config:get CLEARDB_DATABASE_URL`
ClearDBデータベースのURLを変数に格納した。

８.データベースの再設定
    
    % heroku config:set DATABASE_URL=mysql${heroku_cleardb:5}

##一言
ひとまず、簡単に流れのみを記述してみました。
まだまだ記述すべき箇所あるかとは思いますが、随時アップデートできたらと思います。
[Swift] プロパティオブザーバ　willSetとdidSet

#プロパティオブザーバとは
格納型プロパティの値が更新される時、それをきっかけにして処理を書く事が出来ます。
例えば、プロパティオブザーバを使用する事で
var price = 100 の値を更新した時に、更新の回数をカウントする処理を書く事が出来たりする訳です。
このプロパティオブザーバには、値が変更される直前に呼び出される`willSet`と変更後に呼び出される`didSet`があります。
これらはどちらか一方だけ書くこともできます。
書き方は以下の通りです。

```swift
var プロパティ名: 型 = 初期値 {
    willSet (仮引数) {
         変更直前に呼ばれる処理
   }
    didSet (仮引数) {
         変更直後に呼ばれる処理
   }
}
```

#それぞれの仮引数
`willSet`と`didSet`にはそれぞれ仮引数を指定する事が出来ます。
`willSet`では、プロパティに格納される直前の新しい値を仮引数で参照する事が出来ます。
仮引数を省略する場合は、`newValue`という名前で参照できます。
`didSet`では、プロパティに今まで格納されていた古い値を仮引数で参照できます。
省略する場合は、`oldValue`で参照できます。
#willSet使ってみた
textFieldに購入金額を入力して、ボタンを押すとその回数と前回の金額との差を表示するアプリを作成してみました。

```swift
class ViewController: UIViewController {
    @IBOutlet var label: UILabel!
    @IBOutlet var priceTextField: UITextField!
    @IBOutlet var countLabel: UILabel!
    @IBOutlet var hikakuLabel: UILabel!
    var count = 0
    var  priceDifference = ""
    let minPrice = 1.0
    
    var buyingPrice: Double = 0 {
        willSet {
            count += 1
            guard newValue > buyingPrice else {
                priceDifference = "前回より\(buyingPrice - newValue)円低い購入価格です"
                return
            }
            priceDifference = "前回より\(newValue - buyingPrice)高い購入価格です"
        }
    }

    @IBAction func countUpButton(_ sender: Any) {
        buyingPrice = Double(priceTextField.text!) ?? 0
        countLabel.text = "購入回数は\(count)回です"
        hikakuLabel.text = priceDifference
    }
}
```

#####実行結果
`willSet`内で購入回数を取得し、価格差を計算して表示する事が出来ました。

![スクリーンショット 2021-01-06 19.55.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755375/c7a7d241-6c7b-3725-9a74-ffafbd580325.png)

![スクリーンショット 2021-01-06 19.55.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755375/3b637790-4fe9-f762-6d39-d65af68b8bb6.png)

![スクリーンショット 2021-01-06 19.56.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755375/2d253054-3f7d-263f-bd11-887f5e7ab20a.png)

#didSet使ってみた
`didSet`を使用して数字の最低値を設定し、それ以下にならないようにコードを書いてみます。

```swift
class ViewController: UIViewController {
    @IBOutlet var numberTextFIeld: UITextField!
    @IBOutlet var numberLabel: UILabel!
    let minNumber = 1
    
    var seisuu:Int = 1 {
        didSet {
            if seisuu < minNumber {
                seisuu = minNumber
            }
        }
    }

    @IBAction func button(_ sender: Any) {
        seisuu = Int(numberTextFIeld.text!) ?? 0
        numberLabel.text = String(seisuu)
    }
}
```

######実行結果
変数seisuuに数字がセットされた時に、最低値以下の場合は最低値になるように指定しているので、ボタンを押した時に１以下の数字は１と表示する事ができた。

![スクリーンショット 2021-01-06 20.33.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755375/0984b013-3e9d-d718-783c-bf64c53bfc37.png)
-30と入力しても１と表示する。↓
![スクリーンショット 2021-01-06 20.33.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755375/ec9fe2ac-3d0f-b0a7-b597-be422490ab0b.png)

#メリット
これらを使用する事で、コードがかなりコンパクトになります。
別のフィールドを作成する事なく、値を保持して取り出す事が出来ます。

#参考文献
https://qastack.jp/programming/24006234/what-is-the-purpose-of-willset-and-didset-in-swift

荻原　剛志、『詳解 Swift 第５版』、SBクリエイティブ株式会社、２０１９年11月25日、557ページ
git push herokuし、herokuのURLを開くとMethod Not Allowedが出る問題

## 問題
git push herokuすると以下のような表示が出ますよね
ここの下から2行目を開くと**Method Not Allowed**がでます。

![スクリーンショット 2021-01-06 20.13.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699910/35d1265f-cdf5-edeb-14e4-4cc732d0e152.png)

## 解決法
上の写真の下から2行目はgit用のファイルなので、remote:の後のURLを開きましょう。

リンクを確認せずに開くとこういうことになってしまいます。
気をつけましょう（戒め）

## ちなみに

このgitのリンクはデプロイ用のgit repositoryらしいです。
なんらかの問題があった場合の最終手段としてcloneしたりするのはいいらしいですが
正規の”オリジン”リポジトリとしては使用してはいけないそうです。
詳しくは以下のリンクを参照してください。

## 参照

[herokuにgit pushしたURLを開くと、Method Not Allowed と表示されてしまう
](https://qiita.com/kodai_0122/items/a1f01b18bb3e0ddde62a)

[Git での既存の Heroku アプリケーションの複製](https://devcenter.heroku.com/ja/articles/git-clone-heroku-app)
画像の投稿機能

## はじめに
オリジナルアプリ制作にあたり、画像を投稿する機能を実装したので、忘れないように載せておこうと思います。
Qiitaなどで調べるといろいろな方法があったが、今回はRailsのActive Storageという機能を使用しました。

## 1.Active Storageと画像加工ツールの導入
1.ターミナルでImageMagicをインストール

```言語:ターミナル
% brew install imagemagick
```
<br>
2.Gemfileにmini_magick , image_processingのGemを記述し、bundle installする

```ruby:Gemfile
gem 'mini_magick'
gem 'image_processing', '~> 1.2'
```
<br>
3.ターミナルでActive Storageをインストールすると、マイグレーションが作成されるので、マイグレートする

```言語:ターミナル
rails active_storage:install
```

```言語:ターミナル
rails db:migrate
```

##2.画像の保存
今回はPostテーブルと絡めると仮定して実装する
<br>
1.Active StorageテーブルとPostテーブルを has_one_attachedメソッドを用いてアソシエーションする

```ruby:Postモデル
class Post < ApplicationRecord
  has_one_attached :image
end
```
<br>
2.Postのストロングパラメーターにimageを追加して、保存出来るようにする

```ruby:Postコントローラー
# 中略
  private
  def post_params
    params.require(:post).permit(:hoge, :fuga, :image)
  end
```

##3.画像の表示
image_tagメソッドを用いて画像を表示する

```html:Postビュー
# 中略
  <div class='post'>
    <%= image_tag post.image, class: 'post-image' %>
  </div>
```
RustでunsafeもRefCellも用いずにリンクリストの末尾に要素を追加する

```rust
#[derive(Debug)]
struct List<T> {
    root: Option<Box<Node<T>>>,
}
#[derive(Debug)]
struct Node<T> {
    value: T,
    next: Option<Box<Node<T>>>,
}
impl<T> List<T> {
    fn push_back(&mut self, value: T) {
        let mut node : &mut Option<Box<Node<T>>> = &mut self.root;
        let mut s = Vec::new();
        
        s.push(node);
        
        while s[0].is_some() {
	        if let Some(ref mut b) = s.pop().unwrap() {
		       	s.push(&mut b.next);
	    	}
	    }
        
        let mut node = s.pop().unwrap();
        
        *node = Some(Box::new(Node {
            value: value,
            next: None,
        }));
    }
}
fn main() {
	let mut l = List {
		root:Some(Box::new(Node {
			value: 1,
			next: None
		}))
	};
	
	l.push_back(2);
	
	println!("{:?}",l);
}
```

要素を一旦Vecに突っ込んでループの先頭でpopで取り出し、次の要素をVecにpushすることで実装できた。
【Java】JavaBeansとは

#プログラミング勉強日記
2021年1月6日
今日初めてJavaBeansについて知ったので、JavaBeansとはなにか簡単にまとめる。

#JavaBeansとは
　簡単に言うと、データを保存しておくための倉庫みたいなもの。Javaで書かれた再利用できるソフトウエアコンポーネント、その技術仕様のことをいう。ソフトウエアコンポーネントはクラスのことで、JavaBeansはWebアプリでデータを操作するときによく使われる。

##JavaBeansの仕様

- クラスをpublicで指定する
- プロパティはprivateで指定する
- public指定で引数なしのコンストラクタを定義する
- プロパティにアクセスするためのgetter、setterメソッドを用意する
- パッケージ化する
- クラス名の最後は慣例的にBeanにする
- 必須ではないが、java.io.Serializableインターフェースを実装する


[参考文献](https://www.sejuku.net/blog/60374)


#JavaBeansを使うメリット
　データの糸氏に書きかえを防ぐことができる。各データ属性はprivateなので外部からアクセスすることができず、必ずインスタンスを生成してからセッターを呼ばないとデータ属性を書きかえられない仕組みになっている。(このように外部からデータ属性を保護することをカプセル化という)


#JavaBeansの注意点
　セッターを誤って使うと簡単にカプセル化が壊れてしまう。なので、セッターを用いる際には必ず正しい値が設定されているのか注意する必要がある。






#参考文献
[JavaBeansとは？仕様や使い方、永続化について解説](https://www.sejuku.net/blog/60374)
[JavaBeansの使用方法を現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/34816)
[Angular] 「基本的なAngularアプリをはじめる」をやってみる(3)子コンポーネントにデータを渡す

#「基本的なAngularアプリをはじめる」をやってみる(3)

[[Angular] 「基本的なAngularアプリをはじめる」をやってみる(準備)](https://qiita.com/IwashiMorino/items/3325a4a3f7fe6692c259 "[Angular] 「基本的なAngularアプリをはじめる」をやってみる(準備)")

[[Angular] 「基本的なAngularアプリをはじめる」をやってみる(1)](https://qiita.com/IwashiMorino/items/91da278069abff1f500d "[Angular] 「基本的なAngularアプリをはじめる」をやってみる(1)")

[[Angular] 「基本的なAngularアプリをはじめる」をやってみる(2)](https://qiita.com/IwashiMorino/items/a11376f060639c3b4c74 "[Angular] 「基本的なAngularアプリをはじめる」をやってみる(2)")

Angular のチュートリアルをやってみています。

##子コンポーネントにデータを渡す

Angular公式ページ ： [子コンポーネントにデータを渡す](https://angular.jp/start#%E5%AD%90%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E6%B8%A1%E3%81%99 "子コンポーネントにデータを渡す")

>このセクションでは、親コンポーネントである ProductListComponent からデータを受け取ることができる子コンポーネント ProductAlertsComponent を作成する方法を説明します。

#####1.Angular Generator を使って product-alerts という名前の新しいコンポーネントを生成

チュートリアルの指示の通り product-alerts コンポーネントを生成します。
すると、自動的に以下の3つのファイルが作成されます。

>product-alerts.component.ts
product-alerts.component.html
product-alerts.component.css

#####2.まず @angular/core から Input をインポート

```typescript:product-alerts.component.ts
import { Input } from '@angular/core';
```

product-alerts.component.ts に、上記のように Input をインポートするための記述を追加します。

#####3.product という名前のプロパティに @Input() デコレーターを付けて定義

```typescript:product-alerts.component.ts
export class ProductAlertsComponent implements OnInit {
  @Input() product;
  constructor() { }

  ngOnInit() {
  }

}
```

上記のように @Input() product; という記述を追加します。

>この @Input() デコレーターは、プロパティの値がコンポーネントの親である ProductListComponent から渡されることを示します。

#####4.product-alerts.component.html に button タグを記述

```html:product-alerts.component.html
<p *ngIf="product.price > 700">
  <button>Notify Me</button>
</p>
```

product-alerts.component.html を開き、デフォルトに書かれているものを、上記のように書き換えます。

#####5.product-list.component.html にセレクター <app-product-alerts> を追加

>ProductListComponent の子として ProductAlertsComponent を表示するには、product-list.component.html にセレクター <app-product-alerts> を追加します。

```html:product-list.component.html
<button (click)="share()">
  Shareボタン
</button>

<app-product-alerts
  [product]="product">
</app-product-alerts>
```

（プロパティバインディングなるものを使用しています。この [] の使い方のことですね。）

ここまでやりますと、下図のように Notify Me というボタンが表示されるようになります。
![021a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/897250/93051dbd-fffc-6ba9-7961-4f3aeb547d9c.png)
この時点では、まだ Notify Me をクリックしても何も起きません。

次の記事 ： [[Angular] 「基本的なAngularアプリをはじめる」をやってみる(4)親コンポーネントにデータを渡す](https://qiita.com/IwashiMorino/items/61ea0aa0eefef101ce40 "[Angular] 「基本的なAngularアプリをはじめる」をやってみる(4)親コンポーネントにデータを渡す")
vimで正規表現を使った大文字/小文字変換

# やりたいこと
* 正規表現にマッチした部分の文字列のみを対象に、アルファベットの大文字小文字を変換したい
* vimでやりたい

# 例
* こんな文字列があったとする

```
Vim\u3063\u3066\u6700\u9AD8\u3067\u3059\u3088\u306D
```

* これのUnicodeのアルファベット部分([a-f])だけを小文字にしたい
  * `Vim`は変換したくない
  * `\u`も変換したくない（元々小文字だけど）

# 解決方法
## コマンド
* コマンドモードで以下を実行

```
:%s/\\u\(\w\+\)/\L\0/g
```

## 結果

```
Vim\u3063\u3066\u6700\u9ad8\u3067\u3059\u3088\u306d
```

## ポイント
* 置換後のパターンに `\L`をつけると小文字に変換してくれる。
    * `\U`だと大文字
* `\l`や`\u`だと先頭の文字のみをそれぞれ小文字/大文字に変換してくれる
* `sed`コマンドと同じなのかな？やったことないけど

```
this is test text
```

に対して

```
:%s/\(\w\+\)/\u\0/g
```

とすると

```
This Is Test Text
```

になる。

# 余談
* `vim 置換 小文字`とかでぐぐると選択して `U`とか `Shift + U`の話ばかりがヒットして目的のことが調べられなかったが、英語で検索したら一髪で参考記事に辿り着いた
  * 私のぐぐり力の問題かもしれないが…

# 参考
* https://vim.fandom.com/wiki/Changing_case_with_regular_expressions
ES6 moduleのexportとimportについて

## 本日のゴール
- export / import について理解を深める

## アジェンダ
- export について
- import について

## 1. export について

変数、関数、クラスの宣言文の先頭に `export` を付けると、その名前で外部ファイルにエクスポートすることができる

```javascript
export const foo = foo => {
  console.log()
}

export default class bar {
  constructor() {}
  init() {}
}
```

## 2. import について

外部モジュールや他のスクリプトなどからエクスポートされた関数、オブジェクト、プリミティブをインポートするために使用

```javascript
import foo from './foo'
import {foo, bar} from './foo'
```

## 参考
[MDN - export](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/export)
[MDN - import](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/import)
ExposedでDATE_FORMAT関数を使ってグループ化する

# 環境
- exposed: 0.28.1
- DB: mysql

# 実装

```DateFormatFunction.kt
import org.jetbrains.exposed.sql.CharColumnType
import org.jetbrains.exposed.sql.ExpressionWithColumnType
import org.jetbrains.exposed.sql.QueryBuilder
import org.jetbrains.exposed.sql.append
import org.joda.time.DateTime

class DateFormatFunction<T : ExpressionWithColumnType<DateTime>>(private val exp: T, private val format: String) :
    org.jetbrains.exposed.sql.Function<String>(CharColumnType()) {
    override fun toQueryBuilder(queryBuilder: QueryBuilder) = queryBuilder {
        append("DATE_FORMAT(", exp, ", '$format')")
    }
}
```
日別のコミット数を取得するコード

```Example.kt
val dateFormatFunc = DateFormatFunction(Commits.createdAt, "%Y/%m/%d")
Commits.slice(dateFormatFunc, Commits.id.count())
    .selectAll()
    .groupBy(dateFormatFunc)
    .orderBy(Commits.createdAt, SortOrder.ASC)
    .toList()
```

実行されるSQL

```sql
SELECT DATE_FORMAT(commits.created_at, '%Y/%m/%d'), COUNT(commits.id)
FROM commits 
GROUP BY DATE_FORMAT(commits.created_at, '%Y/%m/%d') 
ORDER BY commits.created_at ASC
```

# 参考
- https://github.com/JetBrains/Exposed/issues/367
ニコニコ動画apiを使って埋もれてる面白い動画を発掘する

#はじめに
- ニコニコが好きなので作ってみました。

#背景
- ニコニコ動画のとりあえずマイリストの廃止で動画のマイリスト数が激減した
- マイリストは面白い動画を見分ける判断材料になっていたのでとても残念
- とりマイの代わりにできた「いいね」の数はなぜか非公開（意味がわからない）
- 良質な動画を発見する機会と材料がなくなった

#概要
- ニコニコのスナップショットAPIを使って、動画のタグ検索を行い動画リストを作成する
- 埋もれている動画の基準として、"(コメント数+マイリスト数×100)/再生数"が60%以上で、かつ再生数が500以上の動画
- csvファイルにて出力

#開発環境
- 言語
    - ruby

#検索例(一部)
"実況プレイ動画"タグで検索。
対象の投稿日時は、2020年1月から12月末まで。
全部で1053件の動画が抽出されました。
![niconico.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784464/54196c32-c13b-9444-56fc-2e5513c95fc0.png)

#最後に
スナップショットapiは一度に取得できる動画の数が最大100でyoutubeDataAPIのようにnext_page_tokenがなく、大量のデータを取得するには指定した日付で1週間ごとのループ行ったが少し面倒だった。
とりあえずマイリストを消した運営の判断は本当に意味がわからないし、いいねも機能しているとは思えない。いいね数を開示するか、いいねとマイリストを合算した数を開示しないと、いいねをする理由にはならないと思う。（ユーザーがいいね機能を使う理由が今のところ存在しない。）
.DS_Storeをコマンド一発で再帰的に消す

ファイル納品の時とか邪魔でしょうがないのでaliasを切ってカレント配下全部消すようにする。

.bashrcに以下追記

```bash
alias rmds='find . -name ".DS_Store" -print -exec rm {} ";"'
```

remove ds の略

.DS_Storeを消したいディレクトリに移動してrmdsするだけ。

**新年一発目の記事、おわり。**
pytorchを使うときの小さな高速化

# はじめに
pytorchなどを使ってモデルの学習をする際は場合によっては学習に数時間かかったり，何だったら数日かかったりすることがザラにあります．そういう場合は実行時間の定数倍の影響が大きくなってきます．例えば，計算量の定数倍が2から1に変わるだけでも，2日かかっていた学習が1日に短縮できたりします．競技プログラミングとかだと，主に計算量のオーダーの勝負になるのでそういった点では雰囲気が違いますね．今回はよく使える事例での簡単なを紹介します．

# コード例
np.arrayのリストをTensor型に変換するコードはよく見ると思います．今回はこういう場面で使える高速化になります．

```python3
import time
import numpy as np
import torch

a = [np.ones([100]) for _ in range(100)]

# 8.44s
start = time.time()
for _ in range(10000):
    b = torch.tensor(a)
print(time.time()-start)

# 0.44s
start = time.time()
for _ in range(10000):
    b = torch.tensor(np.array(a))
print(time.time()-start)

# 0,32s
start = time.time()
for _ in range(10000):
    b = torch.from_numpy(np.array(a))
print(time.time()-start)
```

上の3つのコードの違いはほとんどないですが，実行時間では大きな差があります．どういう理由かは知らないですが，np.arrayのlistをTensor型に変換する場合は，直接torch.tensor()を使って変換するよりも，一旦np.array()を使って全体をnp.arrayに変換した実行時間が短くなります．

これは大きめのlistをTensor型に変換する場面が多い画像関連の学習の際には，割と目に見えて差が実感できると思います．ちなみにtorch.as_tensorを使った場合でもtorch.tensorを使って場合と同様の処理ができ，単体で使うと少し遅いです．

個人的には以下のようなコードで使っています

```python3
def convert2tensor(x, device):
    return torch.tensor(np.array(x, dtype=np.float32), device=device)
```

# おわりに
人生は有限なのでモデルの学習に時間を溶かしすぎないようにしましょう．
manimの作法 その11

#概要

manimの作法、調べてみた。
Animation、使ってみた。

#サンプルコード


```
from manimlib.imports import *

class FuncRotater(Animation):
	CONFIG = {
		"rev_func" : lambda x : x,
	}
	def interpolate_submobject(self, submobject, starting_submobject, alpha):
		submobject.points = np.array(starting_submobject.points)
	def interpolate_mobject(self, alpha):
		Animation.interpolate_mobject(self, alpha)
		angle_revs = self.rev_func(alpha)
		self.mobject.rotate(angle_revs * TAU, about_point = ORIGIN)

class test(Scene):
	def construct(self):
		circle = Circle()
		dot = Dot()
		dot2 = dot.copy().shift(RIGHT)
		self.play(GrowFromCenter(dot))
		self.wait()
		self.play(Transform(dot, dot2))
		self.wait()
		self.play(MoveAlongPath(dot, circle), run_time = 1, rate_func = linear)
		self.wait()
		self.play(Rotating(dot, about_point = [2, 0, 0]), run_time = 1)
		self.wait()
		self.play(FuncRotater(dot, rev_func = lambda x : x % 0.25, run_time = 2))
		self.wait()
		self.play(ApplyMethod(dot.scale, 2))
		self.wait()
		self.play(FadeOut(dot))
		self.wait()


```

#生成した動画

https://www.youtube.com/watch?v=0aBAezBXB-w


以上。
Cソースコードのテスト自動化をgoogletestで行う(googletest導入編)(1/3)

#概要
##経緯
[__モダンC言語プログラミング__](https://www.amazon.co.jp/%E3%83%A2%E3%83%80%E3%83%B3C%E8%A8%80%E8%AA%9E%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E8%8A%B1%E4%BA%95%E5%BF%97%E7%94%9F/dp/4048913093) を一通り読み、大変面白かったので自分の環境で構築した際の備忘録
googletestの導入が本の内容通りには進まないこと、
また本書ではEclipseで環境構築していましたが、今回はVSCodeで行おうと思うため、記事を書くことにしました。
最終的には、githubにプロジェクトを登録し、プッシュと同時にJenkinsサーバーによるテスト自動化を目指します。

##全体の流れ
1. [__googletest導入編(本記事の内容)__](https://qiita.com/denden14/items/bd1d313bf57f806bba9d)
1. [VSCodeでgoogletestを実行する編](https://qiita.com/denden14/items/9594e7309167e82933e4)
 1. サンプルプログラムの作成
 1. ビルドの設定
 1. 実行
 1. ソースコードの修正
 1. intellisenseの設定
1. テスト自動化(作成予定でしたが、[別記事](https://qiita.com/denden14/items/30cbe6d327a404aaa2a7)で似た内容を記載しました。)
 1. GitHubの導入
 1. Jenkinsサーバーの導入

##環境
__OS__ : Linux ubuntu 18.04.5 LTS
__テストツール__ : google test release-1.10.0
__コンパイラ__ : gcc version 7.5.0
__IDE__ : VSCode

#テストツール(googletest)の導入
##googletestのクローン
適当なフォルダからGitHubからgoogletestのリポジトリをクローン
ブランチは、最新版に適宜変える

```
git clone https://github.com/google/googletest.git -b release-1.10.0
```

##googletestのインストール
- クローンしたフォルダに移動
- cmakeでmakefile作成
- makeでコンパイル
- make installでコンパイルされたgoogletestをインストール

```
cd googletest
mkdir build
cd build
cmake ..
make
sudo make install
```
CMakeが未インストールの場合は、下記コマンドでインストールしてください。

```
sudo apt-get install cmake
```

インストール後はC++のソースコードからimportすることでgoogletestのライブラリが使用可能になります。

環境によって違いがあると思うので、上手く行かない場合は、[googletestのGitHubページ](https://github.com/google/googletest/blob/master/googletest/README.md)を適宜参照してください


#参考
[Google Testを導入してみた](https://qiita.com/y-vectorfield/items/6238cfd2d9c34aefe364)
[Google Testの使い方](https://qiita.com/shohirose/items/30e39949d8bf990b0462)
launchファイルでワイルドカードを使う

ROSのlaunchファイルでは，ワイルドカード（グロブ， `*.bag` のような表現）が使えません．例えば，気持ち的には

```xml
<?xml version="1.0"?>
<launch>
  <arg name="bag_dir" default="." />

  <node name="rosbag_player" pkg="rosbag" type="play"
    args="$(arg bag_dir)/*.bag" />
</launch>
```

というようなことがやりたいのですが， `*.bag` は展開されずに文字列として `rosbag` ノードの引数になってしまいます．

これを **無理矢理** 展開させるようにする方法を本記事で紹介します．かなりHackyな方法なので，推奨はしません．

## TL;DR

Pythonの標準モジュールの一つである `glob` をインポートして，展開します．ただし， `import glob` や `__import__("glob")` が使用不可なので，`eval` をネストすることでインポートしています．

```xml
<?xml version="1.0"?>
<launch>
  <arg name="bag_dir" default="." />
  <arg name="bag_path" value="$(eval eval('_' + '_import_' + '_(&quot;glob&quot;).glob(' + 'bag_dir + &quot;/*.bag&quot;)[0]'))" />

  <node name="rosbag_player" pkg="rosbag" type="play"
    args="$(arg bag_path)" />
</launch>
```

## 解説

本当なら以下のようにしたいですよね．

```xml
<?xml version="1.0"?>
<launch>
  <arg name="bag_dir" default="." />
  <arg name="bag_path" value="$(eval import glob; glob.glob(bag_dir + '/*.bag')[0]))" />

  <node name="rosbag_player" pkg="rosbag" type="play"
    args="$(arg bag_path)" />
</launch>
```

でも，Pythonでは `eval("import glob")` が不正なので，エラーが出ます．

```
RLException: Invalid <arg> tag: invalid syntax (<string>, line 1).
```

じゃあ `__import__("glob")` でいいじゃない．

```xml
<?xml version="1.0"?>
<launch>
  <arg name="bag_dir" default="." />
  <arg name="bag_path" value="$(eval __import__('glob').glob(bag_dir + '/*.bag')[0])" />

  <node name="rosbag_player" pkg="rosbag" type="play"
    args="$(arg bag_path)" />
</launch>
```

しかし，roslaunchのevalではアンダースコアを二つ含む表現を使ってはいけない模様．

```
RLException: Invalid <arg> tag: $(eval ...) may not contain double underscore expressions.
```

ならばevalをevalしてアンダースコアを連結させるしかない．

```xml
<?xml version="1.0"?>
<launch>
  <arg name="bag_dir" default="." />
  <arg name="bag_path" value="$(eval eval('_' + '_import_' + '_(&quot;glob&quot;).glob(' + 'bag_dir + &quot;/*.bag&quot;)[0]'))" />

  <node name="rosbag_player" pkg="rosbag" type="play"
    args="$(arg bag_path)" />
</launch>
```

XMLのダブルクォートのせいで `&quot;` を使っていますが，実行しているPythonコードは以下の通りです．

```python
eval(
  eval(
    '_' + '_import_' + '_("glob").glob(' + 'bag_dir + "/*.bag")[0]'
  )
)
```

展開されたあと，roslaunchが実際に実行するコードは

```python
__import__("glob").glob(bag_dir + "/*.bag")[0]
```

で， `bag_dir` は [roslaunchのarg展開](http://wiki.ros.org/roslaunch/XML#substitution_args)により，argとして事前に設定されている `bag_dir` に展開されます．

## おまけ

`[0]` を変えることで複数マッチがあった場合にどれを使うかや， `/*.bag` を変えることでグロブ表現を変えることもできます．これらをargにして展開するようにしたら親切かも……？

```xml
<?xml version="1.0"?>
<launch>
  <arg name="bag_dir" default="." />
  <arg name="index" default="0" />
  <arg name="glob_pattern" default="*.bag" />
  <arg name="bag_path" value="$(eval eval('_' + '_import_' + '_(&quot;glob&quot;).glob(' + 'bag_dir + &quot;/&quot; + glob_pattern)[index]'))" />

  <node name="rosbag_player" pkg="rosbag" type="play"
    args="$(arg bag_path)" />
</launch>
```

## おわりに

可読性がかなり低いので，利用するときは気をつけましょう．．．
Zsh で $EPOCHREALTIME を使いたい

# 答え
```zsh
$ zmodload zsh/datetime
```

# $EPOCHREALTIME とは？
`$EPOCHREALTIME` はその瞬間の UNIX 時間を浮動小数点数で取得できるシェルの組み込み環境変数です。Bash では、バージョン 5 から追加されました。

```bash:Bash
$ echo $EPOCHREALTIME
1609927363.589775
```

Zsh では、バージョン 4.3.13 から追加されたようです。

しかし、Zsh の場合、デフォルトではこの環境変数は有効ではありません。

```zsh:Zsh
$ echo $EPOCHREALTIME
# 何も出ない
```

この環境変数を有効にするには以下を実行します。

```zsh:Zsh
$ zmodload zsh/datetime
```

これで使えるようになりました。

```zsh:Zsh
$ echo $EPOCHREALTIME
1609927355.8729970455
```

常にこの環境変数を使いたい場合は、上記の設定を `~/.zshrc` などに書き込めば OK です。

# 余談
Bash よりも Zsh のほうが浮動小数点以下が細かいですね。

# 参考サイト
- [zsh: 22 Zsh Modules](http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html)
- [Unixエポックからミリ秒を取得する方法は？](https://www.it-swarm-ja.tech/ja/bash/unix%E3%82%A8%E3%83%9D%E3%83%83%E3%82%AF%E3%81%8B%E3%82%89%E3%83%9F%E3%83%AA%E7%A7%92%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F/956726274/)
- [Bash/Zsh + POSIX で sleep 0.01 する方法](https://qiita.com/akinomyoga/items/cddd837140aa0d57839f)
Using cgo with the go command

#GoからC/C++を扱う

##とりあえずここ読む
[Using cgo with the go command](https://golang.org/cmd/cgo/#hdr-Using_cgo_with_the_go_command)

##Cのコードが認識されない
//とimportの間に空行が入ってると前文(preamble)として認識されないようだ。

```go:c.go
// #include <stdlib.h>
import "C"
```

##.so(SharedLibrary)でDllMain的なモノはないのか？
Attach相当はGoのinitが使えるけど、Detach相当がない。
ってことで、gccの属性使ってみたらできた。

```go:so.go
// static void _attribute__((constructor)) constructor() {
//     // Attach相当処理
// }
//
// static void __attribute__((destructor)) destructor() {
//     // Detach相当処理
// }
import "C"
```

なぜか2回ずつ呼ばれる気がする…。Go側でsync.Onceかましてごまかすw
Git Bashで.batや.lnkを使うとき拡張子を省く

Git for Windows付属のBashは、Gitの動作に必要なためと思いますが、perlなどmsys由来のユーティリティがついてくるのがちょっと便利です。

ただ、msysはWindows上でUNIXっぽい環境を再現する物のためWindowsネイティブと噛み合わない部分があり、普段作業環境として使うにはコマンドプロンプトに比べて多少不便なことがあります。

* バッチファイルを呼び出すときは`./foo.bat`など拡張子をつけてやらねばなりません。
* ショートカットファイルを起動する時は、`start ./foo.lnk`のようにコマンドプロンプトを挟む必要があります。
* 当然ながら(実行ファイルではないため)PATH検索も働きません。

(`.exe`だけは補完してくれるのですが、exeだけの特別扱いのようで、PATHEXTのように他の拡張子を足す方法は見当たりませんでした)

この点が馴染めずコマンドプロンプトから離れられなかったのですが、先日`command_not_found_handle`というものを知りました。

# command_not_found_handle フックが使える

Bash 4.0以降では [`command_not_found_handle`][b] というフックがあり、この名前で関数を定義しておくとコマンドが見つからないときに呼び出されます。

この関数に拡張子が`.bat`や`.lnk`のときの扱いを書いてやれば、毎度拡張子をつけずとも普通のコマンドっぽく使うことができます。

## command_not_found_handle の定義例

```bash:.bashrcなどに追記
command_not_found_handle ()
{
    # 拡張子が書いてあったりパスを含んでいるようならスキップ
    if [[ $1 == *.* || $1 == */* ]]; then
        echo "$1: command not found"
        return 127
    fi

    local name=$1
    shift

    # 優先順序はここの並べ方で決まるので好みに合わせて要調整
    if [[ -f ./$name.bat ]]
    then
        exec "./$name.bat" "$@"
    elif [[ -f ./$name.lnk ]]
    then
        exec start "./$name.lnk" "$@"
    elif [[ -f $(type -P $name.bat) ]]
    then
        exec "$(type -P $name.bat)" "$@"
    elif [[ -f $(type -P $name.lnk) ]]
    then
        exec start "$(type -P $name.lnk)" "$@"
    else
        echo "$name: command not found"
        return 127
    fi
}
```

\# Git Bashで動作を確認しています。Cygwinでは`start`を`cygstart`に置き換えればいけると思います。WSLは試していませんが、同様に調整が必要そうな雰囲気がします

# 参考リンク

* [Cygwin to execute windows shortcut files (.LNK) - Super User](https://superuser.com/q/790128/165849)
* [Command Search and Execution (Bash Reference Manual)][b]

[b]: https://www.gnu.org/software/bash/manual/html_node/Command-Search-and-Execution.html#:~:text=command_not_found_handle
【Android】スイッチボタンのつまみの画像をON/OFFで変更

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/de77d665-5b69-380a-7438-aa248fe3f346.gif" width=30%>

まず、つまみ用の画像の設定

```thumb_switch.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/sun" android:state_checked="false" />
    <item android:drawable="@drawable/night" android:state_checked="true" />
</selector>
```

次に、背景設定

```background_switch.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="false">
        <shape android:shape="rectangle">
            <solid android:color="@color/white" />
            <corners android:radius="20dp" />
        </shape>
    </item>
    <item android:state_checked="true">
        <shape android:shape="rectangle">
            <solid android:color="@color/black" />
            <corners android:radius="20dp" />
        </shape>
    </item>
</selector>
```

透明なスタイルに変更

```style.xml
    <style name="Switch" parent="Theme.AppCompat.Light">
        <item name="colorControlActivated">#00000000</item>
        <item name="android:colorForeground">#00000000</item>
        <item name="colorControlHighlight">#00000000</item>
    </style>
```

これらを組み合わせて、スイッチボタンを作成。

```switch.xml
<androidx.appcompat.widget.SwitchCompat
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:background="@drawable/background_switch"
	android:theme="@style/SlideButton"
	android:thumb="@drawable/thumb_switch"/>
```
unzip が文字化けしてる (-O オプションがない, Arch Linux)

Windowsで作られたzipファイルを解答しようとしたら，文字化けしていたので，それに対する対策

### 手元の環境
```console
$ more /etc/arch-release                                                               
Manjaro Linux
$ yay -V                                                        
yay v10.1.0 - libalpm v12.0.2
```

### やったこと
デフォルトのunzipコマンドでは， -O オプションがなかったので，[AUR (en) - unzip-iconv](https://aur.archlinux.org/packages/unzip-iconv/) を入れ直す．


```console
$ yay -S unzip-iconv
```
-O オプションが使えるようになりました

```console 
$ unzip -O sjis hoge.zip
```

### 他ディストリ
[unzipによる文字化け - なんかいろいろ書き込んでみるテスト](https://yosi-zou.hatenadiary.org/entry/20101207/1291650603)
Azure ストレージ (Blob) の暗号化状態を確認する方法

## 概要

Azure portal で確認する方法について記述する。

## 方法

1. Azure portal を使用して BLOB が暗号化されているかどうかを確認するには、次の手順を実行します。
1. Azure Portal のストレージ アカウントに移動します。
1. [コンテナー] を選択して、アカウント内のコンテナーの一覧に移動します。
1. BLOB を探して、その [概要] タブを表示します。
1. [暗号化されたサーバー] プロパティを表示します。 "SERVER ENCRYPTED" が [TRUE] の場合、BLOB は暗号化されています。 BLOB のプロパティには、BLOB が作成された日時も含まれていることに注意してください。

## 参考資料

- [BLOB の暗号化状態を確認する](https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-blob-encryption-status?tabs=portal)
【CSS・JS】テキストの選択を解除する方法。（文字列の選択を禁止する方法）

ドラッグである要素を選択したときに、その中の要素が選択状態になってしまう。この**文字列の選択状態を解除する方法**。

例えば、テーブルのセルをドラッグで複数選択すると下図のように、セルの中のテキストが選択されて見づらい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/19d14a7d-55c7-ffc7-f6c7-497452064bac.png)

↓ 実現したいこと（文字列は選択しないようにする）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/a789c764-bccf-8a73-6314-5483877feb28.png)

主な実現方法は以下２つ。１が圧倒的に簡単。２は参考程度に。

1. [cssでuser-selectプロパティの設定](#1-cssでuser-selectプロパティの設定)
2. [JacaScriptで選択解除](#2-jsで選択解除)


<br>
##1. cssでuser-selectプロパティの設定
`user-select: none;`

対象の要素に上記を適用するとテキスト選択を解除できる。

コピペ防止でテキストの選択が全くできないページがあるが、その設定と同じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/dec5824d-4440-994a-7722-6ae91779c889.png)


###user-selectプロパティのその他オプション
user-selectプロパティは、none以外にも選択できる値がある。


| 値 | 概要 | 詳細 |
|:-:|:-:|:-:|
| none  | 選択禁止  | 対象要素とその子孫要素の文章を範囲選択できなくする  |
| all | 全選択  | どれか一つの文字を選択するとすべて選択する。  |
| text  | テキスト選択可  | デフォルトの状態  |
| contain | 要素の内部から選択  | 要素の内部から選択を始めることができます。しかし、選択範囲は要素の境界内のみに限定。  |
| auto  | 要素の種類や親要素のプロパティにより変化  |  編集可能な要素の場合、使用値は containになる。親要素の user-select の使用値が all の場合、対象要素の使用値も all になる。など、 |

＞[moz公式 user-select](https://developer.mozilla.org/ja/docs/Web/CSS/user-select)

**▼user-select:all**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/e5b8fed0-35cd-44ec-2fbd-d61d22e59785.png)


<br>
##2. JSで選択解除
以下処理を実行することで選択状態を解除できる。

```js:
const clearSelection = () => {
  //旧IE
  var sel
  if ( sel = document.selection ) {
      sel.empty();
  }
  //旧IE以外のブラウザ 
  else {
      //選択解除
      if (window.getSelection) {
          window.getSelection().removeAllRanges();
      }
      //入力中のテキストボックスの選択解除
      var activeEl = document.activeElement;
      if (activeEl) {
          var tagName = activeEl.nodeName.toLowerCase();
          if ( tagName == "textarea" ||
                  (tagName == "input" && activeEl.type == "text") ) {
              // Collapse the selection to the end
              activeEl.selectionStart = activeEl.selectionEnd;
          }
      }
  }
}
```

####・`document.selection`
旧IE（IE９〜10）のみ。ユーザーが選択した文字列範囲を指す。
IE11以降は`window.getSelection()`を使用。


####・`window.getSelection()`
ユーザーが選択した文字列範囲を指す。

`if (window.getSelection){処理}`は、選択範囲が存在するなら処理を実行。


####・`empty()`
emptyメソッドは指定した要素の子要素を削除。対象の要素自体は削除しない。

####・`.removeAllRanges()`
対象の選択範囲を解除する。
`window.getSelection().removeAllRanges()`ですべての選択範囲を解除。


####・`document.activeElement`
テキスト入力中の要素を返す。
inputタグやtextareaタグ内を選択している場合に、選択中の要素がわかる。

取得したデータの中には、対象のノード名やテキストの何文字目を入力中かなどのデータが入っている。


####・`document.activeEl.nodeName.toLowerCase()`
現在テキスト入力中のノード名（nodename）を取得し、小文字に変換（toLowerCase）する。


####・`activeEl.selectionStart = activeEl.selectionEnd`
選択中のテキストをなしにする。（始まり＝終わりにする）
Azure Pipelines で object 型のパラメーターを JSON に変換する

# object 型パラメーターの定義
Azure Pipelines ではテンプレートを使って Object 型のパラメーターを作ることができます (Variable では今のところ文字列しか定義できません)。
したがって、Object を定義するにはテンプレートにパラメーターとして渡すしか方法がありません。
次の例では obj という object 型のパラメーターを定義して、template.yml というテンプレートを実行しています。

実行用 YAML ファイル (ci.yml)

```yaml
name: convert_to_json
trigger: none

jobs:
  - template: template.yml
    parameters:
      obj:
        name: Alice
        country: Japan
        prefecture: Tokyo
        friends:
          - Bob
          - Carol
          - Dave
```

# function を使って object を JSON に変換する
Azure Pipelines の YAML では Expression という表記方法の中で built-in の function を使うことができます。
JSON への変換は convertToJSON() という function を使って実行します。
function の一覧は[こちら](https://docs.microsoft.com/en-us/azure/devops/pipelines/process/expressions?view=azure-devops#functions)にありますが、convertToJSON() という function はありません・・・
次のテンプレートを使って JSON を出力します。

テンプレート YAML ファイル (template.yml)

```yaml
parameters:
  - name: obj
    type: object

jobs:
  - job: ConvertToJson
    pool:
      vmImage: "windows-latest"
    variables:
      output_path: '$(Build.ArtifactStagingDirectory)\output.json'
    steps:
      - task: PowerShell@2
        inputs:
          targetType: 'inline'
          script: |
            # Print JSON and save as a file
            $str = '${{  convertToJson(parameters.obj) }}'
            Write-Host "$($str)"
```

実行結果

```
Starting: PowerShell
==============================================================================
Task         : PowerShell
Description  : Run a PowerShell script on Linux, macOS, or Windows
Version      : 2.179.1
Author       : Microsoft Corporation
Help         : https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/powershell
==============================================================================
Generating script.
========================== Starting Command Output ===========================
"C:\windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command ". 'D:\a\_temp\c3f8672b-faf6-4539-9529-c0ff6834e8fc.ps1'"
{
  "name": "Alice",
  "country": "Japan",
  "prefecture": "Tokyo",
  "friends": [
    "Bob",
    "Carol",
    "Dave"
  ]
}
Finishing: PowerShell

```

# 参考
- [検証に使ったコード](https://github.com/t104/azure-pipelines-yaml-sample/tree/main/samples/convert-object-to-json)
- [Allow type casting or expression function from YAML pipeline object to String](https://developercommunity.visualstudio.com/idea/880210/allow-type-casting-or-expression-function-from-yam.html)
WordPress5.6でembedブロックをフィルタリングする

案件ではGutenbergの不要なブロックをdisabledにすることが多いと思うが、embedはWordPress5.6から`allowed_block_types`のhookで`core-embed/youtube`のようにフィルタリングがかけられなくなってしまった。
が、`enqueue_block_editor_assets`のhookで下記のjsを読ませればフィルタリングできる。

```
wp.domReady(() => {
    //デフォルトのバリエーションをチェックするとき
    //console.log(wp.blocks.getBlockVariations('core/embed'));

    //ホワイトリスト
    const allowedEmbedVariation = [
        'youtube',
        'vimeo'
    ];
    wp.blocks.getBlockVariations('core/embed').forEach((valiation) => {
        if (allowedEmbedVariation.indexOf(valiation.name) !== -1) return;
        wp.blocks.unregisterBlockVariation('core/embed', valiation.name);
    });
});
```
Lifecycle ~Android初学者のアウトプット~

~Lifecycleについてのアウトプット~
---

<dl>
<dt>重要だと思ったことは、以下3つあります</dt>
<dd>・1つ目→ライフサイクルに応じた処理を実行する</dd>
<dd>・2つ目→ライフサイクルの変化を監視させる</dd>
<dd>・3つ目→画面切り替え時に、切り替え前のデータを損失させない</dd>
</dl>

今回学習した中で重要だと感じた上記3点を画像を中心にアウトプットしていきます。

##ライフサイクルに応じた処理

![ActivityLifecycle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975701/cd2296f2-d11e-cba7-15a8-da5c84265a69.png)

onCreate()→は、Activityが生成されるときの処理
バックグラウンド状態のときは
onPause()→onStop()のように、一連のライフサイクルに応じた処理を各メソッドごとに記述していく必要があります。


![FragmentLifecylce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975701/7235b6b0-d48f-52c5-ae92-293ba9909f47.png)

次に、Activityと同様にフラグメントにも同様のライフサイクルを考える必要があります。

参考URL→https://developer.android.com/codelabs/kotlin-android-training-lifecycles-logging?index=..%2F..android-kotlin-fundamentals#4

##ライフサイクルの変化を監視

#####ライフサイクルを誰に監視させるのか?
→LiveDataが監視する。

<dl>
<dt>どのように監視するのか?</dt>
<dd>・LiveDataは、ライフサイクルを監視可能でデータを持つ</dd>
<dd>・ライフサイクルの変化に応じて、オブザーバーに変更を伝える</dd>
</dl>

##画面切り替え時に、切り替え前のデータ損失に注意

![スクリーンショット (347).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975701/ce7a6b3b-a332-7162-553c-2765a45b7075.png)

onSaveInstanceState()では、保持するデータが大きくなるとメモリリークなど予期せぬ事態を引き起こす可能性を秘めているので解決策としてViewModelに、データを失わない処理を実行させることができる。

####ViewModelProviderの利用
生成したインスタンスを、onCreate()メソッドに渡し画像のようにViewModelProviderを利用すると画面切り替えが起きてもViewModelは新しく作られることはない。


以上が、Lifecycleを学んだときに重要だと感じたことです。
別のアウトプットができるよう、理解と勉強を頑張ります。
WEBデザイン便利サイト

# 画像系
## 素材
### 写真AC
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/34a97f54-cc8a-f331-a775-7d9f5c7614a2.png)

https://www.photo-ac.com/
商用フリーの写真が検索可能

### イラストAC
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/72bef998-5fe9-8059-55a2-53854d49b838.png)

https://www.ac-illust.com/
商用フリーのイラストが検索可能

### icooon-mono
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/252b2b8a-e299-6fe3-67a9-2f0fd3c241d8.png)

https://icooon-mono.com/
商用フリーのイラストアイコンが検索可能

### shutterstock
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/e80c9916-27d0-2ff4-ccbd-954c8370c9cc.png)

https://www.shutterstock.com/ja/home
有料だが、画面映えする写真やイラストが多数取り揃えてある

## 画像圧縮
### tinyjpg
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/7ccd4eba-784c-6870-fd3e-7870c08fdf44.png)

jpg、pngの画像の圧縮が可能
無料版は1ファイル5MBの上限がある
https://tinyjpg.com/

# デザインの参考
### LPアーカイブ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/6e04b980-4003-fec5-da81-e30198619163.png)

https://rdlp.jp/lp-archive
条件にあったLPを検索できる
和風系、シンプル系、黒系などすでにイメージが固まっている場合に使いやすい

### csswinner
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/711188b2-e132-97e2-5627-50b9a0546bf0.png)

https://www.csswinner.com
優れたデザインのWEBサイトが掲載される
検索も可能

### awwwards.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/e0a66d63-0cc2-d0d0-7b19-64848666289d.png)

https://www.awwwards.com/
優れたデザインのWEBサイトが掲載される
検索も可能

# 悩んだ時
## ロゴの作成に悩んだ時
### ロゴメーカー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/1a6e79f9-2c39-1450-df00-1e2a8f840e29.png)

https://hatchful.shopify.com/ja/
業界、スタイルなど作成したいイメージを入力するとロゴの例が表示される

## 変数名、クラス名に悩んだ時
### ネーミング
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/9a3d10c0-9475-af3a-a7cc-042c6086a6c9.png)

https://codic.jp/engine
日本語を入力するとキャメルケース、スネークケースなどで英訳してくれる
【Python】エラー発生時に関数内の変数を知りたい！

#はじめに
皆さんはデバッグをどのように行っていますか？
デバッガとか使ってするのが一般的でしょうか、`Pdb`とか？

それはさておき、エラー発生時ってとりあえず関数内のローカル変数を見たくなりますよね。
でも”ローカルな”変数ですので、関数外からは見られず結局`print`に走る、あるあるだと思います。

今回は、せめてエラー発生時の変数だけでもまとめて出力できたら…と思いデコレータを作成しました。

#つくったもの

```python
def raise_locals(f):
    import sys, traceback
    def wrapper(*args, **kwargs):
        try:
            return f(*args, **kwargs)
        except Exception:
            exc_type, exc_value, exc_traceback = sys.exc_info()
            ext = traceback.StackSummary.extract(traceback.walk_tb(exc_traceback), capture_locals=True)
            locals_ = ext[-1].locals
            if locals_:
                print('{' + ', '.join([f"'{k}': {v}" for k, v in locals_.items()]) + '}')
            raise
    return wrapper
```

構造としては、実行してみてエラーが発生したらtracebackを通じてローカル変数を拾ってくるって感じです。
では使ってみましょう。

```python
@raise_locals
def f(x):
    a = x
    b = 1 / a
    a = 1
    
f(0)
```

```:out
{'x': 0, 'a': 0}
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-137-16e1baa342f5> in <module>
      5     a = 1
      6 
----> 7 f(0)

<ipython-input-136-f595b8b52afb> in wrapper(*args, **kwargs)
      3     def wrapper(*args, **kwargs):
      4         try:
----> 5             f(*args, **kwargs)
      6         except Exception as e:
      7                 exc_type, exc_value, exc_traceback = sys.exc_info()

<ipython-input-137-16e1baa342f5> in f(x)
      2 def f(x):
      3     a = x
----> 4     b = 1 / a
      5     a = 1
      6 

ZeroDivisionError: division by zero
```

いつものエラー文の前にエラー発生時のローカル変数が表示されていますね。

```python
def f(x):
    a = x
    b = 1 / a

@raise_locals
def main():
    f(x=0)

if __name__=='__main__':
    main()
```

一番親となる関数につけておけば、どこでエラーが発生してもそのエラーが発生した関数のローカル変数を見ることができます。