OmniAICreator/Qiita-1.07M huggingface dataset:
Vue.jsとは？？

今回は、Vue．jsについて学習していきたいと思います。
Vue.jsとは、フロントエンドで使われる言語です。Javascriptのフレームワークになります。
HTMLとCSSで書いたあとに、動きを付けることができます。
フロントエンドではよく使われる言語のようです。
他にも、Javascriptのフレームワークはたくさんあり、用途ごとに使い分けて行きます。
また、Vue.jsには更にフレームワークが存在するのですが、ここでは割愛させていただきます。

#Vue.jsを使うメリット
Vue.jsを使うメリットは、いくつかあります。
①HTMLとCSS
②Javascriptの知識があれば割とすんなり入ってくる。
③DOMがを自動的処理してくれる。（JsからHTMLとCSSのデータを取得してくれる）
です。

#導入の仕方
コマンドを使ったりすることは特にないですが
HTMLとVue自体にお決まりのような記述内容があります。

```index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Vue.js practice</title>
</head>
<body>
  <div id="app">
    {{　message }}
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12"></script>
  <script src="script/script.js"></script>
</body>
</html>
```

```script.js
var app = new Vue({
  el: '#app',
  data: {
    message: 'こんにちわ！'
  }
})
```
上記が主なVue.jsの雛形となっています。
ブラウザで表示すると以下のようになります。

![スクリーンショット 2021-03-22 16.17.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033397/e1ca4a1e-ead0-8e11-dde3-a29aaf5d0b3a.png)

#HTML側からのVue.js
① Vue Devtools
これを使うことによりVueアプリケーションのバグを簡単に見つけることができるため、インストールしとくことをおすすめします。
HTMLでは以下のように記述します。bodyタグ一番最後に入力します。
また、その下にJsフォルダとそのファイルを読み込んでくれるように記述します。
"https://cdn.jsdelivr.net/npm/vue@2.6.12"
②divタグ
後で記述しますが、これは、Vue.jsでインスタンスの展開はここだよ〜って意味です。
で、divタグの中に入れてほしい単語などを記述します。
UIの領域になります。Ul/UXについては後ほど学習していきます。

#JS側からの実装
①var
一行目にVarという記述がみられますね。これは、Vueの中核。これがなければそもそも動きません。心臓です。
ちなみにVarとはJsでの変数の宣言の場合に使われます。
②data
これはオブジェクト、配列の指定になります。詳しくは後に学習します。

以上がVue.jsを使うときに主に記入する内容になっています。
Kubernetes　Pod間で通信してみる

# Pod間で通信してみる

[Introduction to Kubernetes](https://cybozu.github.io/introduction-to-kubernetes/introduction-to-kubernetes.html)のチュートリアルを進めながらメモした内容です。

2つのnginxのpodをapplyし、pod間で通信してみましょう。

## nginxのIPアドレスを確認する

```
$ kubectl get pod -o wide
NAME           READY   STATUS    RESTARTS   AGE     IP           NODE       NOMINATED NODE   READINESS GATES
bastion        1/1     Running   0          2d19h   172.17.0.6   minikube   <none>           <none>
my-first-pod   1/1     Running   0          2d19h   172.17.0.5   minikube   <none>           <none>
```

## コンテナに入る

```
kubectl exec -it [pod名] -- bash
```

### コンテナ内での動作

```
# curlをインストールして
root@bastion:/# apt update && apt install -y curl

# curlコマンドを叩く
root@bastion:/# curl -i http://172.17.0.5/
HTTP/1.1 200 OK
<以下略>
```

通信できていることを確認できました。

## Service を使って他の Pod にアクセスする

podの状態は常に変わっているので、Serviceを使って、ラベル情報をベースにアクセスさせるようにします。

```nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-first-service
spec:
  selector: # このセレクタに指定したラベルにマッチする Pod に Service へのアクセスが割り振られます
    component: nginx
  ports:
  - protocol: TCP # このポートの IP プロトコル
    port: 80 # このサービスによって公開されるポート
    targetPort: 80 # サービスの対象となるポッドでアクセスするポートの番号または名前。
```

```
# apply
kubectl apply -f nginx-service.yaml

# 確認
kubectl get service
```

### Serviceを介して、podにアクセスする

```
$ kubectl exec -it bastion -- bash
root@bastion:/# curl -i http://my-first-service/
HTTP/1.1 200 OK
```

## 参考

[Introduction to Kubernetes](https://cybozu.github.io/introduction-to-kubernetes/introduction-to-kubernetes.html)
配列内のオブジェクトの(プロパティの)取り出し


引用元
https://www.yuulinux.tokyo/14877/

dd($attr)

..array:1 [
  0 => {#2063
    +"is_kawaii": 1 ←●
  }
]
 

アクセス方法
echo $attr[0]->is_kawaii; // 1
 

考え方
array直下のものはkey
{key: value}についてはプロパティでアクセスする
切り取り & スケッチを起動する


# クリップボードから画像取り込む機能入れる時にWindows10のWin+Shift+Sで起動する切取りを起動したかった。

基本的には[Windows FormsアプリからWindows 設定を開く](https://qiita.com/mayuco_maid/items/2f25598c23030d219f3b)と同じ

```
Process.Start("ms-screenclip:")
```

切取り実行時にアプリを最小化したい場合、Process.Startする前にWindowStateとかを最小化すれば良いのだけれど
環境によっては最小化アニメーションが終わる前に切取り実行が起動して半透明で残っていたり、
最小化せずにそのまま画面が残る事があった。

なので自分はProcess.Startする前に250msec待ちを入れて対応したけど他にやり方あるのかな（´-`）



ちなみにProcess.Startの戻りはnullになるので終了したらウィンドウを戻すという動作が出来ない。
プロセスIDをプロセス名で探すとかすれば出来そう？


###起動パラメータ色々あるっぽい

https://docs.microsoft.com/ja-jp/windows/uwp/launch-resume/launch-screen-snipping
【Rails】データベースを指定してアプリ作成

##前提
■あくまで個人の備忘録。見やすは非重視
■PostgreSQLが既にインストールされていること
※されていない場合は以下でインストールとPath設定を完了させる
[PostgreSQL インストール方法](https://www.dbonline.jp/postgresql/install/)

##Rubyインストール
★以下のサイトからWITH DEVKITの推奨版をダウンロード
※サイト内左側の一覧に「=>」となっているものが推奨

[Ruby公式サイト](https://rubyinstaller.org/downloads/)　

★ダウンロードしたファイルで設定を進める
※途中コマンドプロンプトにて入力を求められた場合には、各々指定が無ければ「1,2,3」と入力

★ダウンロードが完了したら、コマンドプロンプトを起動し、バージョンを確認し正常に確認出来たらインストールされている

```ruby
# コマンドプロンプト
$ ruby -v
```

```ruby
# 出力結果
ruby 2.7.2p137(2020-10-01 reversion 5445e04352) [x64-mingw32]
```
※「$」は入力不要


##Railsインストール

■以下のコードを実行し、Railsをインストールする

```ruby
# コマンドプロンプト
$ gem install rails
```
■Railsがインストールされたかを確認するために、バージョンを確認

```ruby
# コマンドプロンプト
$ rails -v
```

```ruby
# 出力結果
Rails 6.1.3
```

##Yarnインストール
★以下のコードを実行し、Yarnをインストールする

```ruby
# コマンドプロンプト
$ npm install --global yarn
```

★Yarnがインストールされたかを確認するためにバージョンを確認

```ruby
# コマンドプロンプト
$ yarn -v
```

```ruby
# 出力結果
1.22.10
```

##Node.jsインストール
■以下サイトでNode.jsをダウンロード・インストールを実行

[Node.js](https://nodejs.org/ja/)

■システム詳細設定内の環境変数(ユーザ環境変数)にPathを設定

デフォルトの場合の設定：**C:\Program Files\Nodejs**

■Node.jsがインストールされたかを確認するためにバージョンを確認

```ruby
# コマンドプロンプト
$ node -v
```
```ruby
# 出力結果
v14.16.0
```
##アプリの作成
★コマンドプロンプトで以下のコードを実行

```ruby
# コマンドプロンプト
$ rails new (アプリ名) -d postgresql
```

★アプリケーション毎にGemバージョンを管理する場合は以下を実行

```ruby
# コマンドプロンプト
$ rails new (アプリケーション名) -d postgresql --skip-bundle
```

★インストール完了後にアプリケーションディレクトリに移動し、以下のコードを実行

```ruby
# コマンドプロンプト
# 初回のみ以下
$ bundle install --path vendor/bundle

# 2回目以降
$ bundle install
```

##データベースの連携
■psql.exe が保存されたディレクトリをPatchに設定

デフォルトの場合の設定：C¥:Program Files¥PostgreSQL¥(バージョン)\bin

■作成したアプリケーションの以下のファイルを編集
ルート：(アプリケーション名)\config\database.yml

```ruby
#省略

default: &default
adapter: postgresql
encoding: unicode
username: postgres #デフォルトの場合
password: postgres #デフォルトの場合

#省略
```


##Railsアプリの起動・表示

★cdコマンドでアプリケーションディレクトリに移動

★以下のコードを実行

```ruby
# コマンドプロンプト
$ rails s
```
※「Use Ctrl-C to stop」の出力が表示されたらサーバー接続完了

★ブラウザで以下のURLにアクセスし、画像の表示になれば無事設定完了

```url
localhost:3000
```

![qwe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658097/1bab009f-dd19-6c4a-b0d9-792c227d8d0e.png)

★サーバーとの接続を解除する場合は「Use Ctrl-C to stop」と出力された状態のコマンドプロンプトで「Ctrl」+「C」を入力し停止
⇒コマンド入力待機に切り替わったら接続解除完了
【Python】for文でインデックスを自動採番する（自分でn += 1 とかしない）方法（備忘録）

自分用メモ

` enumerate(iterable, start=0)`を使う。

# enumerate
そもそも` enumerate(iterable, start=0)`とはカウント（デフォルトは0）と、iterable上のイテレーションによって得られた値を含むタプルを返す組み込み関数。

```python
seasons = ['Spring', 'Summer', 'Fall', 'Winter']

seasons_index_0 = list(enumerate(seasons))
seasons_index_1 = list(enumerate(seasons, 1))
seasons_index_5 = list(enumerate(seasons, 5))

print(seasons_index_0)
print(seasons_index_1)
print(seasons_index_5)
```
出力結果

```
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
[(5, 'Spring'), (6, 'Summer'), (7, 'Fall'), (8, 'Winter')]
```

for文と比較すると下記1、2は等価

```python
#1.enumerate
enumerate(seasons)

#2.for文とn += 1
def enumerate(sequence, start=0):
    n = start
    for elem in sequence:
        yield n, elem
        n += 1
```

# enumerateを使ったインデックス付きループ
enumerateを応用してインデックス付きのループを実装する。

```python
seasons = ['Spring', 'Summer', 'Fall', 'Winter']

for i, season in enumerate(seasons):
  print(i, "," ,season)
```
出力

```
0 , Spring
1 , Summer
2 , Fall
3 , Winter
```
インデックスの開始を変えるなら

```python
seasons = ['Spring', 'Summer', 'Fall', 'Winter']

for i, season in enumerate(seasons, 5):
  print(i, "," ,season)
```
出力

```
5 , Spring
6 , Summer
7 , Fall
8 , Winter
```

これは便利。

# 応用
JSON形式の辞書リストデータに対しても実行してみる

```python
member_list = [
    {'No': 1, 'Name': 'Yamada Taro',   'LastLoginTime': '2021-03-16 15:44:16'}, 
    {'No': 2, 'Name': 'Yamada Jiro',   'LastLoginTime': '2021-03-10 00:12:17'}, 
    {'No': 3, 'Name': 'Yamada Saburo', 'LastLoginTime': '2021-03-20 12:01:02'}, 
    {'No': 4, 'Name': 'Yamada Shiro',  'LastLoginTime': '2020-12-24 00:00:13'}, 
    {'No': 5, 'Name': 'Yamada Goro',   'LastLoginTime': '2021-03-17 11:01:55'}, 
]

for i, member in enumerate(member_list):
  print(i, "," ,member)
```
出力

```
0 , {'No': 1, 'Name': 'Yamada Taro', 'LastLoginTime': '2021-03-16 15:44:16'}
1 , {'No': 2, 'Name': 'Yamada Jiro', 'LastLoginTime': '2021-03-10 00:12:17'}
2 , {'No': 3, 'Name': 'Yamada Saburo', 'LastLoginTime': '2021-03-20 12:01:02'}
3 , {'No': 4, 'Name': 'Yamada Shiro', 'LastLoginTime': '2020-12-24 00:00:13'}
4 , {'No': 5, 'Name': 'Yamada Goro', 'LastLoginTime': '2021-03-17 11:01:55'}
```

問題なくインデックスを取得出来る。

**参考リンク**
[Python docs #enumerate](https://docs.python.org/ja/3/library/functions.html#enumerate)

以上
勉強メモ18_「yum -y install」で何かツールを実行して「Another app is currently holding the yum lock; waiting for it to exit...」のエラーがでてしまい、インストールがうまくできない場合

##0 はじめに

件名の通り、「yum -y install ツール名」で「Another app is currently holding the yum lock; waiting for it to exit...」が出てしまい、インストールできない場合

##1 事象(今回はhttpdをインストール)
下記、実行すると、「Another app is currently holding the yum lock; waiting for it to exit...」により、インストールできない

```shell
[rinchome@localhost ~]$ su - root
[root@localhost ~]# yum -y install httpd

読み込んだプラグイン:fastestmirror, langpacks
ロックファイル /var/run/yum.pid が存在します: PID 7341 として別に実行されていま す。
Another app is currently holding the yum lock; waiting for it to exit...
 他のアプリケーション: PackageKit
   メモリー: 166 M RSS (592 MB VSZ)
    開始   : Mon Mar 22 13:17:11 2021 - 13:42 秒経過
    状態   : スリープ中、PID: 7341
Another app is currently holding the yum lock; waiting for it to exit...
 他のアプリケーション: PackageKit
   メモリー: 166 M RSS (592 MB VSZ)
    開始   : Mon Mar 22 13:17:11 2021 - 13:44 秒経過
    状態   : スリープ中、PID: 7341
Another app is currently holding the yum lock; waiting for it to exit...
 他のアプリケーション: PackageKit
   メモリー: 166 M RSS (592 MB VSZ)
    開始   : Mon Mar 22 13:17:11 2021 - 13:46 秒経過
    状態   : スリープ中、PID: 7341
```

##2 対処方法

```shell
[root@localhost ~]# rm -f /var/run/yum.pid
[root@localhost ~]# yum clean all
```


##3 再度実行(httpdをインストール)

```shell
[root@localhost ~]# yum -y install httpd

インストール:
  httpd.x86_64 0:2.4.6-97.el7.centos

依存性関連をインストールしました:
  apr.x86_64 0:1.4.8-7.el7                     apr-util.x86_64 0:1.5.2-6.el7
  httpd-tools.x86_64 0:2.4.6-97.el7.centos     mailcap.noarch 0:2.1.41-2.el7

完了しました!
```
[Symbol]委任したいノードが見つからない時にやること

![スクリーンショット_2021-03-22_14_55_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/3a8a3dda-0fe5-9ced-90a1-1997ea48093f.png)


盛り上がりを見せているSymbolですが、せっかく知り合いがノードを立てたらそのノードに委任ハーベストしたいですよね？

類に漏れず私もノードを自腹で立ち上げたわけですが、
リストに表示されません！って方がいたのでこちらにリストに表示させる方法を記載していきたいと思います。


# まずはそのノードが空いてるか確認しましょう

***http://[ノードのホストやIPアドレス]:3000/node/unlockedaccount***

![スクリーンショット_2021-03-22_15_03_11-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/f3c4cf22-fee2-48db-12b1-e754d4316635.png)

この例だと4人の人がノードに委任ハーベストを行っている事になります。
何人まで許容してくれるのか？はノードの設定に寄るものですが**初期値は10**です。
なので枠がわからない場合は10未満であればほぼほぼ入れると思ってください。
ノード管理者が知り合いの場合は何人まで行けますか？って聞いてみると良いと思います。

# 対象ノードのpeerのホストをコピーする
さて、枠が空いていたら表示させたいノードとpeerになっているノードを探しましょう。

***http://[ノードのホストやIPアドレス]:3000/node/peers***

![210322-0001-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/d64b3e4b-8aa0-fd90-0fe3-faacb4a31862.png)

リストに表示したいノードとpeerになっているホスト一覧なのでなんでも構わないのですが、
すでにノードに登録されているngl*系ではないノードの方が良いかもしれません

# peerノードを追加する

![210322-0002-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/b958aa45-2450-65ae-610e-89ac9e8c5124.png)
***このアカウントはテストで作ったアカウントです！なにも送らないでください！***

セッティングを押して

![210322-0003-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/443d63d8-f5e6-6f02-80a4-12cd9c98e83d.png)

ネットワーク設定へ

![210322-0004-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/58c36471-3ec5-089c-ca76-1580a4aa72fb.png)

先ほどコピーした適当なホストを入れると下に出てきます。
それをクリックしましょう。

![210322-0005-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/309167f2-3241-0653-45f9-23fe04be9049.png)

1秒ほどロードが走って、NetworkTypeとGeneration Hashが入ればおkです。

***Add nodeを押して追加しましょう！！***

# 一度ホームに戻ってから！ノードを変更

![210322-0006-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/ca17f95d-e3d4-46e9-5abf-6d2386344c87.png)

***一度ホームに戻ってからやりましょう***、キャッシュなのかハーベストページでやってしまうとリストが更新されないことがあります。

# ハーベストページに行きリストを確認

![210322-0008-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/a1fa46ed-4015-11fc-1d67-8e0adac7b27e.png)

無事に表示されましたら成功です。

![スクリーンショット 2021-03-22 14.57.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/4c699258-d3d3-cb06-7074-4e192c1c8eb9.png)

私も最近ノードを構築しましたが、まだまだ委任者が少ないノードですので
入居者を募集しております。

是非是非よろしくお願いします！

投げXYMはこちらのアカウントにお願いしますw
NA5IXX-LXCN4S-ELJJHP-AAUMES-JDKC6Q-L2Y44G-4FQ
[C#]ジェネリック型のキャストの仕様に関するメモ


#目標
目標は
MyItem1,MyItem2をMyItemの派生クラスとしたとき、
MyClass＜MyItem1＞,MyClass＜MyItem2＞を同じ型（例 MyClass＜MyItem＞)にキャストすることです。
なかなか情報が見つからなくて苦労したのでシェアしておきます。
#失敗例

```

abstract class MyItem
{}

class MyClass<T>
where T:MyItem //TはMyItemの派生クラスであるという制限を加える。
{}

class MyItem1:MyItem
{}

class MyItem2:MyItem
{}
//テスト
public void GenericTest(){
    MyClass<MyItem1> test1=new MyClass<MyItem1>();
    MyClass<MyItem2> test2=new MyClass<MyItem2>();
    //Debug.Log((test1 as MyClass<MyItem>));  //Compile Error!
    //Debug.Log((test2 as MyClass<MyItem>));  //Compile Error!
}
```
自分が最初に書いたコードですが、残念ながら上手く機能しませんでした。
ちなみにDebug.Logで出力しているのはUnityを使ってるからです。適宜Cosole.WriteLineで読み替えてください。
#解決策
この問題の解決策はinterfaceを用いることです。

```
//インターフェイスの追加
interface IMyItem
{}

interface IMyClass<out T> //out修飾子は必須！
where T:IMyItem
{}
//クラスの定義
abstract class MyItem:IMyItem
{}

class MyClass<T>:IMyClass<T> 
where T:MyItem //T:IMyItemでもok

{}

class MyItem1:MyItem
{}

class MyItem2:MyItem
{}
//テスト
public void GenericTest(){
    MyClass<MyItem1> test1=new MyClass<MyItem1>();
    MyClass<MyItem2> test2=new MyClass<MyItem2>();
    //Debug.Log((test1 as MyClass<MyItem>));  //Compile Error!
    Debug.Log((test1 as IMyClass<MyItem>));   //MyClass'1[MyItem1]
    Debug.Log(test2 as IMyClass<IMyItem>);    //MyClass'1[MyItem2]
 
}
```

だいぶ複雑というか面倒くさくなってしまいましたがこれでうまく動きます。
covariance(共変性)という仕組みが関わっていて、
公式のドキュメントがとても参考になりました。というか、ぶっちゃけ上のコードは公式の二個目の記事を読めばいらないまである。

https://docs.microsoft.com/ja-jp/dotnet/standard/generics/covariance-and-contravariance

https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/concepts/covariance-contravariance/creating-variant-generic-interfaces

最後にMyClassをリストにしてキャストしてみましょう。

```
public void GenericTest(){
    List<IMyClass<IMyItem>> list=new List<IMyClass<IMyItem>>(){
            test1,
            test2
        };
    //Debug.Log((list as List<MyClass<MyItem>>));   //Compile Error!
    Debug.Log((list as IList<MyClass<MyItem>>));    //Null
    Debug.Log((list as IList<IMyClass<MyItem>>));   //Null
    Debug.Log(list as IList<IMyClass<IMyItem>>);    //System.Collections.Generic.List`1[IMyClass`1[IMyItem]]
    var castList=(IList<IMyClass<IMyItem>>)list;
    foreach(var ele in castList){
        Debug.Log(ele); 
    }
    //foreach result
    //MyClass`1[MyItem1]
    //MyClass`1[MyItem2]
}
```

前のコードではIMyClass＜MyItem＞、IMyClass＜IMyItem＞両方とも正しくキャストされていましたが、
今回はIMyClass<MyItem>の場合もNullになってしまいました。

#結論
MyClass＜MyItem＞の型を上手くキャストさせたいなら、
それぞれMyItemとMyClassのインターフェイスを作成して
IMyClass＜IMyItem＞でやりとりしよう。
【Azure】ストレージアカウント経由でWindows環境にデータ転送を試しました

#はじめに
Azureのストレージアカウントサービスを経由して、Azure環境のWindowsサーバーにデータを転送するように試しました。

#１．Azureストレージアカウントでの操作
Azureポータル画面の検索欄に「ストレージアカウント」を入力し、クリックします。
![1112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/6c085ad6-838f-4ef2-8742-a3c39d73a528.png)
***

ストレージアカウント画面に入り、作成されたストレージアカウントにクリックします。
※もし新規のストレージアカウントが欲しければ、ここで追加をクリックし、新規作成していただきます。本手順は新規作成部分を割愛させていただいております。
![1112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/0009fe44-4911-1e18-34be-529d019d7932.png)
***

「ファイル共有」をクリックします。
![1112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/3dc78c73-2886-1051-5423-9466cd1878e4.png)
***

「ファイル共有」をクリックします。
![1112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/6e2581c5-bf10-7d91-85c3-ee659d29f4ff.png)
***

「名前」と「クォータ」を決めて、「作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/18376b0e-6a6a-a34d-c7b7-9d725451869f.png)
***

上記作成したファイルをクリックします。
![1112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/072659cf-f73b-67b4-8e6e-d82b120d8565.png)
***

「アップロード」をクリックします。
ローカルでファイルを選択した上、「アップロード」をクリックします。
![1112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/96390f53-a094-9c6b-a5d9-ae45b12dfb24.png)
***

「接続」をクリックします。
「Windows」をクリックします。
ドライブ文字を選択します。※既存の同じドライブ文字がある場合は、その他のドライブを選択すること。重複しないように。
コマンドのコピーボタンをクリックします。
![1112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/144ab04e-6822-ec4c-c7c2-85b3a8002d92.png)

#２．Windows仮想マシンでの操作
AzureのWindows仮想マシンにログインします。
「Windows PowerShell ISE」を検索し、クリックします。
![1112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/9560704e-a0ff-b887-e45d-3bc7828a75f7.png)
***

ストレージアカウントでコピーしたコマンドをそのまま貼り付けします。
![1112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/35d52dae-f72c-78ac-41da-6157452ba213.png)
***

実行マークをクリックします。
「資格情報を正しく追加しました。」との表示が出ていればOKです。
![1112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/d2fb5ae0-1ca0-3c82-81a3-5c643163299d.png)
****

PCを開き、ドライブが表示されているかどうかを確認し、クリックします。
![1112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/b0a422d3-63ad-e672-18a4-9b42052fd721.png)
***

ストレージアカウントでアップロードしたファイルが見れれば成功です。
![1112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/20366d5a-3346-24d0-6852-5c69d724c365.png)

#思考：AWSとの比較
Azureのストレージアカウントサービスは、AWSのS3、FSx、EFSのストレージサービスに似ていますが、使い方がやはり異なります。
例えばAWSのWindowsサーバーに、共有フォルダとしてAWS FSxを使用したい場合は、Microsoft ADも必要となってくるので、合わせて設定しなければなりません。また、AWS側Windowsサーバーでは、S3を共有ドライブのように使用したい場合は、AWS Storage Gatewayの利用が必要となってきます。
Azureではそういった別のサービスを経由しておらず、直接サーバーにマウントできる点に便利さを感じます。
以上、誰かにご参考になっていただければうれしいです。
php ログイン機能　セッション

<p>index.php</p>
```
<?php
//sessionを使う宣言
session_start();

$username = 'abcd';
$password = 'pass';

//$_SESSION = array(
//    'test' => $username,
//    'test2' => $password,
//);
//$_SESSION['test'] = "テストです";
//$_SESSION['test'] = $username;はサーバのファイルに一時保存する　保存したものはどこでもechoで表示できるので
//今回はmypageでパスとユーザーネームを表示させている
$_SESSION['test'] = $username;
$_SESSION['test2'] = $password;

//header('Location: /mypage.php');
//exit;
?>

<?php if (! $_POST): ?>
<!--action 空だと自分に返ってくる-->
<form action="" method="post">
    <p>ユーザーネーム</p><br>
    <input type="text" name="username" value="">
    <br>
    <p>パスワード</p><br>
    <input type="password" name="password" value="">
    <br>
    <input type="submit" value="送信ボタンです">
</form>
<?php endif; ?>



<?php
$input_name = $_POST['username'];
$input_password = $_POST['password'];



if(isset($input_name) && !empty($input_name) && isset($input_password) && !empty($input_password)) {

    if ($username === $input_name && $password === $input_password) {
        //requireはファイルの呼び出し
        //require './mypage.php';
        //header指定はページに遷移する
        header('Location: /mypage.php');
        //headerの後は必ずexit;を書くこと
        exit;

    } else {
        //ファイルの呼び出し
        require './no_user.php';


    }

}
?>
```
<p>mypage.php</p>
```
<h1>マイページにようこそ</h1>
<?php
session_start();
//表示方法printでもechoでもどちらでもよいがechoが好ましい
if (isset($_SESSION["test"]) && ! empty($_SESSION['test'])) {
    print "<p>";
    print "ログインID：".$_SESSION["test"];
    print "</p>";
}
if (isset($_SESSION["test2"])) {
    print "<p>";
    print "ログインパスワード：".$_SESSION["test2"];
    print "</p>";
}


?>
```

<p>no_user.php</p>
```
<h1>会員ではないので、会員になって下さい。</h1>
```
[ Rails ] turbolinksの概要と一部使い方

RailsでECサイトを作成中に、一部ボタンが動作しないことがあり、turbolinksを一部無効化することで解決しました。
そもそもturbolinksとは何ぞや状態だったので、備忘録として残しておきます。

#turbolinksとは
ページ遷移をAjaxに置き換えることで、JavaScriptやCSSのパースを省略することで高速化するgemのこと。
Railsにデフォルトで入っているやつ。

#完全にturbolinksを無効化する方法
※ turbolinksを完全無効化すると、他の高速化するgemを入れたりする必要があるので、
私のような初心者は、特別なことがない限りおすすめしないです。
###1. gemを無効化する
```ruby:Gemfile
    #コメントアウトをする
    #gem 'turbolinks'
```
```ruby:ターミナル
    $ bundle update
```

###2. application.jsを編集
```javascript:application.js
    // 変更前
    //= require turbolinks　

    // 変更後
    // require turbolinks　
```

###3. application.html.slimを編集

```html:application.html.slim
    / 変更前
    = stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload'
    = javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
    
    / 変更後
    = stylesheet_link_tag    'application', media: 'all'
    = javascript_include_tag 'application'
```

#一部を無効化する方法
###1. JavaScriptを編集する方法

・.jsファイルの場合

```JS:hoge.js
    $(document).on('turbolinks:load', function() {
     // turbolinksを無効化したい処理を入れる
    });
```

・.coffeeファイルの場合

```JS:hoge.coffee
    $(document).on 'turbolinks:load', -> 
      # turbolinksを無効化したい処理
```

###2. リンクを編集する方法
・link_toに追加する場合

```html:hoge.html.slim
    = link_to '', root_path, 'data-turbolinks': false
```
__'data-turbolinks': false__ をlink_toに追加すれば無効化できます。

・divの場合

```html:hoge.html.slim
    div data-turbolinks='false'
      = link_to '', root_path
```
Revit　FilteredElementCollector取得後に不要なElementを除外する

# はじめに
Revitアドイン作成時、レベルや壁（Wall）のFilteredElementCollectorをいっぺんに取得してきたは良いけど、要らないやつを毎回if文で弾くのが面倒だったため、必要なものだけ絞り込む手段が欲しいなあと思いました。
調べて出てきたそれっぽい方法はあまりうまくいかなかったので、上手くいく方法をメモに残します。
そのやり方間違ってるよ、正式なやり方が別にあるよという場合はコメントいただけるとありがたいです。

# 環境
OS: Windows8.1
Revit: 2019.2

# 実装
たとえば、「建物の階」にチェックの入っているレベルを取得したい場合は以下のようにします。
Collector取得時の`doc`はコマンドの引数`ExternalCommandData revit`から取得するものです。
`Document doc = revit.Application.ActiveUIDocument.Document`。

```C#
FilteredElementCollector GetElementsLevel_建物の階だけ(Document doc)
{
	// まず、LevelだけのFilteredElementCollectorを取得する
	FilteredElementCollector collectorLevel = new FilteredElementCollector(doc).OfClass(typeof(Level));

	// CollectorからElementIDのリストを取得する。これを除外リストとして使う
	ICollection<ElementId> exIds = collectorLevel.ToElementIds();

	// Collectorの中身を一つずつ確認
	foreach (Element el in collectorLevel)
	{
		// 念のため
		if (el.Category == null) continue;
		// 建物の階にチェックが入っているものは除外リストから外す
		if (el.LookupParameter(@"建物の階").AsInteger() > 0)
		{
			exIds.Remove(el.Id);
		}
	}
	// もし除外リストの中身があれば
	if (exIds.Count() > 0)
	{
		// 除外実行
		collectorLevel.Excluding(exIds);
	}
	return collectorLevel;
}
```

ちなみに「高さ」による昇順ソートはこう。FilteredElementCollecterではなくなってしまう。
（実際レベルを使うときはソートしてから使いたいだろうと思うのでついでに併記）

```C#
// 高さでソート（昇順）
IOrderedEnumerable<Level> lstLevels = from Level lv in collectorLevel orderby lv.LookupParameter(@"高さ").AsDouble() ascending select lv;
```
降順にしたい場合は`ascending`を`descending`に変更。

# 感想
もっと他にスマートな書き方がある気がバリバリしています。
AWS Cloud9 のディスク容量を増やす

##AWSのcloud9サービスでmysqlを導入しようとしたところ空き容量が足りなかった。
なので以下の方法を試した。

まずは    ```$df```  コマンドで空き容量を確認。

```
Filesystem     1K-blocks     Used Available Use% Mounted on
devtmpfs          485132        0    485132   0% /dev
tmpfs             503448        0    503448   0% /dev/shm
tmpfs             503448      456    502992   1% /run
tmpfs             503448        0    503448   0% /sys/fs/cgroup
/dev/xvda1      10473452 10145328    328124  97% /
tmpfs             100692        0    100692   0% /run/user/1000
```

/dev/xvda1が97%埋まっています。

これを次のシェルスクリプト

```
#!/bin/bash

# Specify the desired volume size in GiB as a command-line argument. If not specified, default to 20 GiB.
SIZE=${1:-20}

# Get the ID of the environment host Amazon EC2 instance.
INSTANCEID=$(curl http://169.254.169.254/latest/meta-data/instance-id)

# Get the ID of the Amazon EBS volume associated with the instance.
VOLUMEID=$(aws ec2 describe-instances \
  --instance-id $INSTANCEID \
  --query "Reservations[0].Instances[0].BlockDeviceMappings[0].Ebs.VolumeId" \
  --output text)

# Resize the EBS volume.
aws ec2 modify-volume --volume-id $VOLUMEID --size $SIZE

# Wait for the resize to finish.
while [ \
  "$(aws ec2 describe-volumes-modifications \
    --volume-id $VOLUMEID \
    --filters Name=modification-state,Values="optimizing","completed" \
    --query "length(VolumesModifications)"\
    --output text)" != "1" ]; do
sleep 1
done

#Check if we're on an NVMe filesystem
if [ $(readlink -f /dev/xvda) = "/dev/xvda" ]
then
  # Rewrite the partition table so that the partition takes up all the space that it can.
  sudo growpart /dev/xvda 1

  # Expand the size of the file system.
  # Check if we are on AL2
  STR=$(cat /etc/os-release)
  SUB="VERSION_ID=\"2\""
  if [[ "$STR" == *"$SUB"* ]]
  then
    sudo xfs_growfs -d /
  else
    sudo resize2fs /dev/xvda1
  fi

else
  # Rewrite the partition table so that the partition takes up all the space that it can.
  sudo growpart /dev/nvme0n1 1

  # Expand the size of the file system.
  # Check if we're on AL2
  STR=$(cat /etc/os-release)
  SUB="VERSION_ID=\"2\""
  if [[ "$STR" == *"$SUB"* ]]
  then
    sudo xfs_growfs -d /
  else
    sudo resize2fs /dev/nvme0n1p1
  fi
fi
```
resize.shとしてどこでもいいのでファイルを作成。

その後　
```$ sh resize.sh 30```
をターミナルに打ってあげて完了。

```
Filesystem      Inodes  IUsed  IFree IUse% Mounted on
devtmpfs        121283    284 120999    1% /dev
tmpfs           125862      2 125860    1% /dev/shm
tmpfs           125862    388 125474    1% /run
tmpfs           125862     16 125846    1% /sys/fs/cgroup
/dev/xvda1     1015248 358584 656664   36% /
tmpfs           125862      2 125860    1% /run/user/1000
```
36%の余裕ができました。☻
心理的戦略で面談（面接）に受かるテク３つ

現在、SESで働いております。
SESは面談が必ずあります。
面談する際に参考にした本。
また、その本で必要だと思ったテクニック３つを紹介したいと思います。
![5178VWPKJYL._SX339_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700700/982d2282-93bb-a0bb-baac-2697715f1c74.jpeg)

#①好感度
簡単に言うと、「好かれる度合い」です。

これは面談（面接）以外でも必要な要素で
（例）恋愛
・好感度が高いとモテるし、低いとモテないということが起こります。

では面談ではどうやって好感度が決まるのか？
（例）面談
・結論：面談してすぐに決まります。

・すぐ決まるとは
面接時の身だしなみ→しっかり整える。
序盤の自己紹介→ハキハキ答える。

基礎はしかっり抑えておこうということです。

※ある実験で初対面の好感度は数秒で決まるという実験結果もあるそうです。

#②ハロー効果（後光効果）
・１つ特徴によってその人の全体を想定してしまうこと。
　　　　　　　　↓
・簡単にいうと
1つ特化（光）しているものがあれば、他の弱点（後）は隠せるということ。

（例）
・英語ができる（話せる）。→　数学、社会などできない。
英語ができる（光）ことで数学、社会（後）ができなくても、できる人だと思われるということ。


・またハロー効果を利用し、自分の長所を考えていきたいと思います。
（実例）
長所は継続することです。（光）
継続することで放射線技師の国家試験を1発合格、野球で右投げから左投げに変更しレギュラーで試合に出ていました。

実は勉強もスポーツもあまりできたわけではありません。（後）

しかし、継続して出来なかったことを分析し、また継続することでできるようになりました。
ですのでどんな困難があっても継続を続ければ乗り越えられる自身はあります。

#③説得力
ここまで、好感度+ハロー効果で好印象は成功していると思います。

あと、トークに説得力があるとほぼ完璧。
逆にトークがうまくできないとせっかくの好印象も台無しなる。
そこでトークに必要なテクニックを紹介します。

■トーク三段階心理テク
長所を参考に解説していきたいと思います。

[長所]
長所は継続することです。（特技）
継続することで放射線技師の国家試験を1発合格、野球で右投げから左投げに変更しレギュラーで試合に出ていました。
（ポジティブ）（最高点）

実は勉強もスポーツもあまりできたわけではありません。（弱点）

しかし、継続して出来なかったことを分析し、また継続することでできるようになりました。
ですのでどんな困難があっても継続を続ければ乗り越えられる自身はあります。（終了点）

１、初頭効果→初めに話した内容は頭に残りやすいということ。
　　　　　　　（特技、ポジティブ）なことから話す。

・いい部分だけだと人間は逆に信用できない。次

２、両面提示→良い面（特技、ポジティブ）、悪い面（弱点、苦手）を見せる。

・素直で包み隠さず話してくれる。→信頼度がアップする。次

３、ピーク・エンド・セオリ→トークの最高点と終了点がよければ記憶に残る。


以上、心理的戦略で面談（面接）に受かるテク３つでした。
この３つだけ意識すれば受かるわけではないですが、こういったテクニックもあるんだということを知って頂ければと思います。
Kubernetes　podを立ててみる

# podを立ててみる

minikubeを使って、KubernetesにKubernetesオブジェクト(yamlファイル)をapplyし、詳細を確認するまでの流れです。


## minikubeでKubernetesを動かしてみる

> Minikubeとは、小規模なKubernetes環境を作成するために作られたパッケージです。 1台のPC上に、仮想的にKubernetesの環境を構築することができます。

> [Minikubeとは | OSSでのシステム構築・デージーネット](https://www.designet.co.jp/faq/term/?id=TWluaWt1YmU)

```
# 起動
minikube start

# ダッシュボードを表示
minikube dashboard
```

## Kubernetes 上にコンテナをデプロイしてみる

```nginx-pod.yaml
apiVersion: v1 # どのバージョンのKubernetesAPIを利用してオブジェクトを作成するか
kind: Pod # どの種類のオブジェクトを作成するか、今回はpod
metadata: # オブジェクトを一意に特定するための情報、文字列のname、UID、また任意のnamespaceが該当する
  name: my-first-pod # 今回だとpodの名前、一意である必要がある。
  labels:
    component: nginx # ラベル
spec: # オブジェクトの望ましい状態
  containers:
  - name: nginx # コンテナの名前
    image: nginx:latest # 実行するdocker image
```


## K8sにyamlをapply

```
kubectl apply -f nginx-pod.yaml
```

### -f オプション

ファイル名を指定して、apply

### -k オプション

ディレクトリを指定して、リソースすべてをapply

## 状態を確認

```
# podの一覧を取得
kubectl get pod

# 詳細情報を確認
kubectl describe pod [pod名]
```

## 詳細を見てみる

さきほどnginx-pod.yamlでapplyしたpodの詳細を見てみましょう

```
$ kubectl describe pod my-first-pod
Name:         my-first-pod
Namespace:    default
Priority:     0
Node:         minikube/192.168.64.2
Start Time:   Fri, 19 Mar 2021 19:24:11 +0900
Labels:       component=nginx
Annotations:  <none>
Status:       Running
IP:           172.17.0.5
IPs:
  IP:  172.17.0.5
Containers:
  nginx:
    Container ID:   docker://71dbbf554ea1c47b679c6a302afd851940aa3bbf4ed11ccd9bf4d83796ce5f6c
    Image:          nginx:latest
    Image ID:       docker-pullable://nginx@sha256:d2925188effb4ddca9f14f162d6fba9b5fab232028aa07ae5c1dab764dca8f9f
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Fri, 19 Mar 2021 19:24:35 +0900
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-mfvdd (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-mfvdd:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-mfvdd
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:          <none>
```


## 参考

[Introduction to Kubernetes](https://cybozu.github.io/introduction-to-kubernetes/introduction-to-kubernetes.html)
[IPython embed] ちょっと便利なデバッグ方法

#プログラムを書くとき
この時に，途中でこのコードが正しいのか確認したい・一応かけたけど途中のとこの数値とかがあっているかの確認したいという場合があります．そんな時，私は以下の手法で確認していました．linux上で動かせるのでかっこいい．
ただし，もっと良い方法とかあるかもしれないのでより良い方法を教えてくださると嬉しいです．

#!!!!!EMBEDDING!!!!!!
この題のようにembedというのを間に打ち込めば，linuxのようなターミナル上で確認することができます．vscodeのデバッグ昨日よりかっこいいと思っているので，私は多用しています．

まずは黙ってインストール
```
pip install IPython
```

> Defaulting to user installation because normal site-packages is not writeable
Collecting IPython
  Downloading ipython-7.16.1-py3-none-any.whl (785 kB)
     |████████████████████████████████| 785 kB 3.3 MB/s
Collecting backcall
・・・・・・・・

こんな感じでインストール完了したらいざ！
まずはサンプルコードembed1.pyがあったとします．

```python:embed1.py
from IPython import embed
cnt = 0
for i in range(10):
    cnt+=i
print(cnt)
```

これはまあ単純にカウントするだけのコード．答えは45．
しかし途中でドンくらいの数字になっているのか確認したい場合，embedが使えます．

↓
↓　これにembedを加えます．
↓

```python:embed2.py
from IPython import embed
cnt = 0
for i in range(10):
    #######
    embed()
    ######
    cnt+=i
print(cnt)
```

↓
↓　そしてターミナルで実行．
↓

```
python .\embed2.py      
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.16.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]:
```

そうすると，
In [1]:
に入力できるようになります．
そこで，cntを入力します．

```

In [1]: cnt
Out[1]: 0

In [2]: exit()

Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.16.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: cnt
Out[1]: 0

In [2]: exit()

Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.16.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: cnt
Out[1]: 1

In [2]: i
Out[2]: 2
```

このようになります．
また現在のデバッグを抜けたい場合は
exit()
といれれば出られます．

他にもこのembedでコードが止まった状態でimportしたり，ファイル情報を読み込みして検算したり，と様々なやり方があるので，是非使ってみて下さい．
Kubernetes　yamlファイルの基礎

# Kubernetesオブジェクトで「意図の記録」をする

Kubernetesオブジェクトは、Kubernetes上で永続的なエンティティ[^エンティティ]です。Kubernetesはこれらのエンティティを使い、クラスターの状態を表現します。

[^エンティティ]: エンティティとは、実体、存在、実在（物）、本質、本体などの意味を持つ英単語。ITの分野では、何らかの標識や識別名、所在情報によって指し示される、独立した一意の対象物をエンティティということが多い。類義語には「インスタンス」（instance）、「オブジェクト」（object）などがある。

下記のような内容が表現できます:

- どのようなコンテナ化されたアプリケーションが稼働しているか(またそれらはどのノード上で動いているか)
- それらのアプリケーションから利用可能なリソース
- アプリケーションがどのように振る舞うかのポリシー、例えば再起動、アップグレード、耐障害性ポリシーなど

一度オブジェクトを作成すると、Kubernetesは常にそのオブジェクトが存在し続けるように動きます。

## Kubernetes APIを使用したKubernetesオブジェクトの操作

Kubernetesオブジェクトを操作する場合、作成、変更、または削除に関わらずKubernetes APIを使う必要があります。

### kubectlコマンドラインインターフェース

kubectlコマンドラインインターフェースを使った場合、このCLIが処理に必要なKubernetes API命令を、あなたに代わり発行します。

あなたのプログラムからクライアントライブラリを利用し、直接Kubernetes APIを利用することも可能です。

## オブジェクト spec とオブジェクト status

ほとんどのKubernetesオブジェクトは、オブジェクトの設定を管理する２つの入れ子になったオブジェクトのフィールドを持っています。

### spec

specには、望ましい状態としてオブジェクトに持たせたい特徴を記述する必要があります。

### status

オブジェクトの 現在の状態を示し、その情報はKubernetesシステムとそのコンポーネントにより提供、更新されます。Kubernetesコントロールプレーンは、あなたから指定された望ましい状態と現在の状態が一致するよう常にかつ積極的に管理をします。

## Kubernetesオブジェクトを記述方法

```nginx-pod.yaml
apiVersion: v1 # どのバージョンのKubernetesAPIを利用してオブジェクトを作成するか
kind: Pod # どの種類のオブジェクトを作成するか、今回はpod
metadata: # オブジェクトを一意に特定するための情報、文字列のname、UID、また任意のnamespaceが該当する
  name: my-first-pod # 今回だとpodの名前、一意である必要がある。
  labels:
    component: nginx # ラベル
spec: # オブジェクトの望ましい状態
  containers:
  - name: nginx # コンテナの名前
    image: nginx:latest # 実行するdocker image
```

### 必須フィールド

フィールド名 | 概要
-|-
apiVersion | どのバージョンのKubernetesAPIを利用してオブジェクトを作成するか
kind | どの種類のオブジェクトを作成するか
metadata | オブジェクトを一意に特定するための情報、文字列のname、UID、また任意のnamespaceが該当する
spec | オブジェクトの望ましい状態

Kubernetesでオブジェクトを作成する場合、オブジェクトの基本的な情報(例えば名前)と共に、望ましい状態を記述したオブジェクトのspecを渡さなければいけません。

KubernetesAPIを利用しオブジェクトを作成する場合(直接APIを呼ぶか、kubectlを利用するかに関わらず)、APIリクエストはそれらの情報をJSON形式でリクエストのBody部に含んでいなければなりません。

specの正確なフォーマットは、Kubernetesオブジェクトごとに異なり、オブジェクトごとに特有な入れ子のフィールドを持っています。Kubernetes API リファレンスが、Kubernetesで作成できる全てのオブジェクトに関するspecのフォーマットを探すのに役立ちます。 例えば、Podオブジェクトに関するspecのフォーマットはPodSpec v1 coreを、またDeploymentオブジェクトに関するspecのフォーマットはDeploymentSpec v1 appsをご確認ください。

## 参考文献

[Introduction to Kubernetes](https://cybozu.github.io/introduction-to-kubernetes/introduction-to-kubernetes.html)

[Kubernetesオブジェクトを理解する | Kubernetes](https://kubernetes.io/ja/docs/concepts/overview/working-with-objects/kubernetes-objects/)
[VisualStudio] ソリューションの中にnugetしたライブラリを入れるpackageフォルダが作られる/作られない、の設定

# もくじ

https://tera1707.com/entry/2022/02/06/144447

# やりたいこと

VisualStudioのソリューションによって、nugetで参照に追加したライブラリのパッケージが保存されるはずの`package`フォルダが、出来ているときと出来ていない時がある。
(出来てなくてもライブラリは使えてる)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/282b9815-89a5-00b4-66a1-881e2cda9595.png)

別にどこにpackageが出来てようとライブラリが動けばよいのだが、稀に、ソリューションのフォルダにpackageフォルダがあって、その中にライブラリ類が配置されるのを前提にバッチファイルが組まれてたりするケースがあったので、そういうときに慌てないようにしておきたい。

→`package`フォルダがソリューションのフォルダに出来てない時は、どうやってnugetで採ったライブラリを使ってるのか？(どこにpackageが置かれてるのか？)調べたい。


# 調べた結果

VisualStudioで、プロジェクトを右クリック > [Nugetパッケージの管理]を押し、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/5a67ac92-a923-4217-b8ed-7915cf3845aa.png)

ここの歯車ボタンを押すと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/b42675ab-fca4-a860-5471-e275e6eaef12.png)

NuGetパッケージマネージャーの設定が開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/3aa9373d-2e99-2dec-756d-2134e2f19552.png)

そこの「全般」の中の「規定のパッケージ管理形式」について、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/2efc2e49-3b35-2b97-0f89-8070a84ff51d.png)

ここの設定を

- Packages.configにすると、  
    - .slnファイルと同じ階層に「packages」フォルダができて、そこにnugetしたライブラリが保存される。
    - globalなフォルダにも保存される。 

- PackageReferenceにすると、
    - ソリューションのフォルダの中に「packages」フォルダはできない。
    - 代わりに、globalなパッケージフォルダ(具体的には`C:\Users\ユーザー名\.nuget\packages`)に保存される。


# 公式ページより

[こちら](https://docs.microsoft.com/ja-jp/nuget/consume-packages/managing-the-global-packages-and-cache-folders)に、詳細が書いてある。

Packages.configを使用する場合、パッケージはglobal-packagesフォルダーにインストールされてから、プロジェクトのフォルダーにコピーされます、とのこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/b2dc3891-5ea5-9fc1-3f00-c2f003df5b9e.png)

つまりpackage.configだと、globalにも保存されるし、slnと同じところのpackagesフォルダにも保存される。packagereferenceだと、globalだけになるっぽい。

どこに何が保存される、とかもおなじ資料に書いてある。
→Windowsでは、`%userprofile%\.nuget\packages`がglobalなpackageのフォルダになる。

# なにげにはまりそうな点
この設定をかえたとき、いったんVisualStudioを終了して起動しなおさないと、上記のpackageフォルダができる/できないが変わってくれない(設定変更についてきてくれない)っぽい。(VS2019時点)

# 参照

■packages.config から PackageReference への移行
https://docs.microsoft.com/ja-jp/nuget/consume-packages/migrate-packages-config-to-package-reference
これによると、どうも「Packages.config」は古い形式で、今後(VS2017以降)では「PackageReference」に移行するのがおすすめっぽい。

■グローバルパッケージ、キャッシュ、および一時フォルダーの管理
https://docs.microsoft.com/ja-jp/nuget/consume-packages/managing-the-global-packages-and-cache-folders
[python glob] 私の好きな複数のファイル読み込みの方法

#python globとは
pythonにはさまざまなモジュールがあり，その中で私はglobというのが結構好きで使っていました．
簡単に説明すると，
glob=掴む
的な意味なので，複数のファイルを探るといったときに使えます．

#使い方
まず，複数のファイルを用意します．
a000.txt
a001.txt
a002.txt
a003.txt
a004.txt
があったとします．

```python:a.py
import glob
a = glob.glob('./a*.txt')
print(a)
```
```
> python .\a.py
```
> ['.\\a000.txt', '.\\a001.txt', '.\\a002.txt', '.\\a003.txt', '.\\a004.txt']

こんな感じで結果が表示されます．
このようにa＊＊＊.txtのファイルを探すことに成功しました．もしディレクトリ内にb＊＊＊.txtといったファイルがある場合，それは読み込みされずa始まりのファイルのみが選択されます．


そして使った後に数値ファイルであれあnumpy.loadtxt，ファイル形式であればfileを使ったおなじみの手法でファイル内のデータを読み込めます．

例えば，file形式でファイル読み込みの場合，

```python:b.py
import glob
a = glob.glob('./a*.txt')
print(a)
for i in a:
    print(i)
    with open(i) as f:
        b = f.read()
        print(b)
```
>['.\\a000.txt', '.\\a001.txt', '.\\a002.txt', '.\\a003.txt', '.\\a004.txt']
.\a000.txt
this is 1
.\a001.txt
this is 2
.\a002.txt
this is 3
.\a003.txt
this is 4
.\a004.txt
this is 5

こんな感じで表示されます．
pi picoでmicropython その16

#概要

picoでmicropythonやってみた。
timer、使ってみた。

#サンプルコード


```
from machine import Pin, Timer
led = Pin(25, Pin.OUT)
tim = Timer()
def tick(timer):
   global led
   led.toggle()
tim.init(freq = 2.5, mode = Timer.PERIODIC, callback = tick)


```


以上。
Xcodeのworkspaceが急に開けなくなった（起動できなくなった）

## 症状
XcodeでiOSアプリを開発してて、ある日Xcodeを起動しようと対象のworkspaceを選択したところ、そのままお亡くなりになられた。。。
何度再起動してもダメで、レポート読んでも

```
IDEAssertionHandler handleFailureInMethod:object:fileName:lineNumber:assertionSignature:messageFormat:arguments
```

うんわからん。

## 解決
https://developer.apple.com/forums/thread/123204
ここに書いてあった

```
I was having the same crash on XCode 11.2.1 . I went on to "Show package contents" of the ".xcworkspace" workspace directory and deleted "xcuserdata" folder. This resolved the crash for me. 
```

で解決！

finderから対象の.xcworkspaceを右クリック、「パッケージの内容を表示」
↓
xcuserdataディレクトリ内の「自分のログイン名.xcuserdatad」ディレクトリを削除
↓
Xcodeからworkspace起動
↓
起動した！！！！！！！！！
【Refile】attachment_image_tag の書き方

# attachment_image_tagの書き方
`<%= attachment_image_tag 保存先インスタンス名, :保存先カラム名, :fill, 幅, 高さ, format:'拡張子', fallback:"代替画像" %>`

例えば、
`<%= attachment_image_tag post_image.user, :profile_image, :fill, 100, 100, format:'jpg', fallback:"no_image.jpg"`

*fillでうまく表示されない場合は、sizeでサイズを指定
 `:fill, 幅, 高さ`→`size: "幅x高さ"`
【Unity】ある水平軸に対して指定オブジェクトが上側にあるか、下側にあるかの判定方法

##はじめに

タイトルの通り、ある水平軸に対して指定オブジェクト（今回はカメラ）が上側にあるか、下側にあるかを判定する方法についてまとめます。
![上下判定01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421073/3fec01c7-0018-98e4-150c-3672531cf46e.png)

##Script及び注意点

まず、スクリプトから

```C#
    public bool  IsUp(Transform Target,Transform Cam)
    {
        var diff = Target.transform.position - Cam.transform.position;
        var axis = Vector3.Cross(Target.transform.forward,diff);
        return axis.x > 0;
    } 
```
判定自体はこの三行で行えます。

しかし、注意点として例えばTargetの原点が以下のように足元（0地点）にある場合、`Target.transform.fowrd`で求まる水平軸は足元にくるため、カメラが真下に潜り込まない限り基本的には判定は常に`True`が返ってきてしまいます。
![上下判定02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421073/5949e71c-15c2-84c2-e31f-be2b99defbcd.png)
よって、Targetの中央高さを基準水平軸としたい場合は、Targetの子として空のオブジェクトを配置し、そのオブジェクトをTargetにセットすることで解決します。
![上下判定03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421073/b6ccfdc6-3815-7039-d208-c05c26256c04.png)

##なぜ、この判定を行う必要があったのか
そもそもなぜこのような判定方法を取る必要があったかというと、Unityにおいて回転の値はEditor上で入力する「-50」と「310」は全く同じ角度となります。

しかしながら、この値をスクリプトから取得すると、返ってくるのはどちらの値でも「310」が返ってきます。
こうなると何が困るかというと、例えば`Cam01`から`Cam02`に回転値「-50」を引き継ぐ場合、以下のような事が起こりえます。
![上下判定04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421073/bfc065e2-9b9f-53a6-90b4-2cae42438da8.png)
そのため、何らかの方法で回転値を判定し、正しい値を受け渡す処理が必要だったわけです。

今回はベクトルから上下を判定しましたが、調べた中でもう一つ簡単に判定する方法も見つけたので、併せて紹介しておきます。

##おまけ（回転値を+180～-180に整える）
```C#
    public float AdjustAngle180(float angle)
    {
        float subNormal = Mathf.Floor((angle + 180f) / 360f) * 360f;
        return (angle > 0f) ? angle - subNormal : angle;
    }
```
`angle`に回転値を渡します、渡す際は`transform.rotation.eulerAngles`でQuaternion型からVecotr3型にキャストしてから渡しましょう。
`subNormal`は「0」または「360」となります、水平軸より上側なら「0」、下側なら「360」です。

これを0以上かどうか判定し、0以上の場合は取得した`angle`から-360してマイナスの値に、そうでなければそのままの値を返します。
![上下判定05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421073/00b5a5f8-7e24-2b03-a3c9-714911ba5240.png)

結果としては先述したベクトルから求める方法と同じ結果となるため、どちらを使っても問題ないと思います。
ProxyベースのReact状態管理ライブラリ「Valtio」v1リリース

Valtioがv1.0.0になりました！ :tada: 

<https://github.com/pmndrs/valtio>

ぜひ試しにでも使ってみてください。

基本的に不具合等の対処が一通り終わって安定してきたのでv1になったのですが、一つだけ隠し機能だったものがオープンになりました。

## `useProxy`マクロ

v0.7.1までは`useProxy`は本体から提供されていましたが、v0.8.0からは`useSnapshot`に改名しました。中身は変わっていません。

代わりに`useProxy`はマクロとして提供されるようになりました。babel-plugin-macrosを使っているのですが、Create React Appを使っている場合はすでに組み込まれています。

この`useProxy`マクロを使うと、

```jsx
import { useProxy } from 'valtio/macro'

const Component = () => {
  useProxy(state)
  return (
    <div>
      {state.count}
      <button onClick={() => ++state.count}>+1</button>
    </div>
  )
}
```

と言うコードが、次のように変換されます。

```jsx
import { useSnapshot } from 'valtio'

const Component = () => {
  const snap = useSnapshot(state)
  return (
    <div>
      {snap.count}
      <button onClick={() => ++state.count}>+1</button>
    </div>
  )
}
```

`useProxy`マクロを使うと、snapshotをほとんど意識せずにコーディングすることができます。snapshotの概念がなくなるわけではありませんが、snapshotの扱いは癖があるので、マクロが使えるケースでは役立つでしょう。ちなみに、[eslint-plugin-valtio](https://github.com/pmndrs/eslint-plugin-valtio)もあります。

## おわりに

valtioのv1リリースが完了したので、次はjotai。こっちは大物。
https://github.com/pmndrs/jotai/issues/333

## React開発者向けオンラインサロン「React Fan」の紹介

最後に、私が主催している「React Fan」というコミュニティをお知らせします。テキストチャットでコミュニケーションできるSlackのワークスペースを用意しています。Slackへの参加は無料ですので、ご興味がある方はぜひご参加ください。詳しくは、下記のページをご参照ください。

[React開発者向けオンラインサロン「React Fan」の入り口ページ](https://react-fan.axlight.com/)

Slackへの招待リンクも上記ページにあります。
統計検定２級をCBT方式で受けて感じたこと（過去問と全然違う）

この記事は
**・CBT方式と過去問の違い
・CBT方式に対応するためには
・おすすめの教材、テキスト、サイト**
の三つを書いていきます。もし興味があればみていってください。


2021年3月19日に統計検定2級を受けてきました。
無事合格できたわけですが、過去問ばかり演習していたため
CBT方式の問題に対応しきれずにぎりぎりの合格でした。

まず、自分は理系大学1年生（新2年）で統計学の知識は0
数学ⅠA、ⅡB、Ⅲの知識はある状態から勉強をはじめました。
大学受験レベルの数学ができなくても少し勉強すれば取れる資格だと思います。
（あとで大学受験レベルの数学ができない人向けの勉強法も書いてます）


**・CBT方式と過去問の違い**
CBT方式では過去の問題からランダムに出題されます。
過去問を演習しているとわかりますが、ほぼ同じ流れで同じような問題が出ます。
なので過去問を解いていくと傾向が掴みやすく自然に点数が上がっていきます。
しかしCBT方式では結構前の問題からもランダムに出題されるので過去問頼りだと躓く問題が多いです。
実際、自分は一問目から「えっ・・・」という感じでした:sweat_smile:

**・CBT方式に対応するためには**
自分は二つの方法があると思っています。
*・昔の過去問まで解きまくる
・問題集を解いて色々な問題に柔軟に対応できるようにする*
の二つだと思っていて、自分は問題集を解いていたおかげで合格できました。
もちろん二つともやるのがベストですが、時間ない人も多いと思うので片方で合格までは十分です。

**・おすすめの教材、テキスト、サイト**
１　*統計WEB*
https://bellcurve.jp/statistics/
お馴染みの統計webです。このサイトは無料で例なども多くわかりやすいので
とてもおすすめです。自分もこのサイトから勉強をはじめました。
統計学の時間の基礎編から入って問題ないと思います。

２　*統計検定2級公式テキスト*
http://www.tokyo-tosho.co.jp/books/978-4-489-02227-2/
コレは賛否両論ある公式テキストです笑
個人的には統計検定受かるため　という面ではいい教材だと思います。
ただ、確かに読みづらさはあります・・
ぜひ買うか迷ったら一度書店に行って読んでみることをお勧めします。

３　*統計学演習*
https://www.amazon.co.jp/%E7%B5%B1%E8%A8%88%E5%AD%A6%E6%BC%94%E7%BF%92-%E6%9D%91%E4%B8%8A-%E6%AD%A3%E5%BA%B7/dp/4563008702
自分はこの問題集を使ってました。とても解説も丁寧で解きやすかったです。
web上に例題などが上がっているので気になる人はみてみるといいです。
http://www.math.s.chiba-u.ac.jp/~yasuda/statEN2/statENSYU.html

４　 *過去問*
https://jitsumu.hondana.jp/book/b496703.html
CBT方式とは言え過去問は解き方などを学べるので必須です。
とても難しい問題が一回に2、３問あります。これは理解するまで考えたり、覚える必要はないです。
6、7割を常に取れるように努力しましょう。満点をとる必要はないです。
ただ、その問題が常にでてくるようなら頑張って解けるようになりましょう。

５　*昔の問題たち*
https://www.amazon.co.jp/%E7%B5%B1%E8%A8%88%E6%A4%9C%E5%AE%9A2%E7%B4%9A-%E6%A8%A1%E6%93%AC%E5%95%8F%E9%A1%8C%E9%9B%861-BellCurve-ebook/dp/B07DNW5S5J
この問題集は昔の問題も多く安いので、演習を積みたい方はおすすめです。

６　*チートシート*
https://qiita.com/moriokumura/items/ed246efe11fc5d3fc760
公式などがとても見やすくまとまってます。
要点整理にもってこいです。

７(例外)　*統計WEB　数学ノート*
https://bellcurve.jp/statistics/course/#step3
高校数学ができない人向けの記事です。わかりやすく最低限のことがわかりやすくまとまってます。
しかし、統計学をしっかり学びたい方はしっかり参考書などで勉強したほうがいいと思います。

以上です。なにかしら参考になれば幸いです。
質問はTwitter(@hiphop_prog)に連絡いただければお答えします。
[Windows] 共有フォルダにアクセスする際のログインIDを変える

# もくじ

https://tera1707.com/entry/2022/02/06/144447

# やりたいこと

1台のPCの複数のユーザー(user1とuser2)で共有フォルダを作成し、そのフォルダを別のPCから見ようとしたときに、例えば

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/3f5b56ef-9eb5-f73e-1f6d-a3207b75faa9.png)


- 最初に、見る側のPCから、見られる側のPCにユーザー：user1でログインする。
- user1の共有フォルダを見る。
- その後、見る側のPCから、見られる側のPCのuser2の共有フォルダを見たい。

となったときに、user2の共有フォルダを開こうとすると、権限がありません、というエラーになってしまう。

user2のフォルダだからuser2でログインしなおせばいいと考えてログインしなおそうとするが、最初に出たようなログイン画面が出てくれず、ログインしなおせない。

見る側のPCを再起動したあとに再度user2のフォルダにアクセスしようとすれば、最初のログイン画面が出てくれるようだが、いちいち再起動していられない。

また、そういう場合に、「資格情報マネージャー」という画面を使ってログインしたときの情報をけせばいい、という情報があるが、資格情報マネージャーを開いてみても、それっぽい資格情報がなぜかないときがある。

https://www.ipentec.com/document/windows-delete-stored-authentication-information
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/c00416c7-8ff3-44e0-43f9-51cd818d3406.png)

どうしたら、再起動なしでuser2のフォルダにアクセスできるようになるのか？

# やったこと

下記のページを参考に、`net use`を使用した。
https://blog.kcmservice.biz/?p=1053

# やったこと詳細

一度IDとPWを入れてしまうと、別のユーザーの管理下の共有フォルダは見えるがアクセスできなくなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/d487f678-5449-2092-9c30-9b0e90f5a878.png)

そのときは、

`net use \\192.168.1.111 /delete`

としてから、

`net use \\192.168.1.111 aaa /user:username`

としてやるとユーザーを変えて、アクセスできるようになった。
(aaaはパスワード、user:usernameはユーザー名だとする)

# 参考

net useでのやり方
https://blog.kcmservice.biz/?p=1053

資格情報マネージャーでのやり方
https://www.ipentec.com/document/windows-delete-stored-authentication-information
ラボ型と、請負型と、どちらのほうがオフショア開発に合うか？

プロジェクトに適したオフショア開発チームを探していくとき、大勢の方が請負型開発（ウォーターフォール・モデル）とラボ型開発（アジャイル・モデル）の[２つの開発形態](https://kaopiz.com/ja-news-%e8%ab%8b%e8%b2%a0%e5%9e%8b%e9%96%8b%e7%99%ba%e3%81%a8%e3%83%a9%e3%83%9c%e5%9e%8b%e9%96%8b%e7%99%ba%e3%81%ae%e9%81%95%e3%81%84/)を迷っているでしょう。一番適切な形態が選択できるように、これらの開発形態についてよくわかったり、そして自分のシステムの目的や状況に応じて適切な開発スタイルがよくわかった利することが必要だと思います。

では、請負型開発、ラボ型開発といえば、詳しく説明していきましょう。

請負開発は、ウォーターフォール・モデルで進めていくことが多いですが、[ラボ型開発](https://kaopiz.com/ja-labo-development/)にウォーターフォール・モデルが用いられることもあります。しかし、ラボ型開発案件に多くの場合は、アジャイル・モデルで実施されています。

ウォーターフォール型は利用ユーザが明確に分かっており、業務フローも固定化されて可変しない場合（勤務管理等の社内で使う業務システムなど）には予算変更も少なく済むため有効ですが、新規事業等でターゲットユーザが不明瞭、かつビジネス環境も日々変わる不確実性の高い場合にはあまり適していません。

まず、請負型開発についてご紹介します。請負型開発、つまり、ウォーターフォール・モデルとは滝の水が上から下へ落ちるのと同じように、初期に膨大な時間をかけて、サービス開発範囲を「全て」定義してから設計、実装、最後にテスト、納品をする形態です。それぞれの工程が終わったら前の工程には戻らず次の工程に進むという開発スタイルです。

一方で、ラボ型開発、すなわちアジャイル・モデルでは、分析、設計、実装、テストを短い期間（1週間〜4週間程度）で行い、その一連のサイクルを繰り返していきます。ユーザーのための価値の高い機能から開発し、短いサイクルで動くソフトウェアを完成させます。

アジャイル型では、ビジネス環境の変動型が起こった場合や当初の想定と異なる事実が見つかった場合には、修正や仕様変更を行うことができます。また、機能の優先順位を途中で変更することになっても、アジャイル開発の場合、開発サイクルが短いためにプロジェクト全体への影響が少なくて済みます。オフショア開発で発生しやすいコミュニケーション不足の課題を避け、安定した開発を行うことが可能です。

[オフショア開発](https://kaopiz.com/ja-offshore-service/)の形態について検討しているなら、ぜひ参考しましょう！
【Windows】IISログ定期削除スクリプト

#はじめに
WindowsのIIS機能では、IISログの定期削除機能がないため、溜まり続けるとドライブがいっぱいになってしまいます。
最近業務上では、IISログを定期的に削除したいとの依頼があり、代わりにスクリプトを作成し、Windowsのタスクスケジューラ機能に登録し、定期的に削除するように設定しました。
何かファイルを定期的に削除する際に、ぜひご参考下さい。


#スクリプト
作成したスクリプトは下記となります。
例として、IISログの保存期間は30日間となっております。

```code
#FILENAME:IISログ自動削除スクリプト
#SUBJECT:IISに出力されているログを30日間保持する
#AUTHOR( ): HYJ
#DATE: 2021.02.16
cd %~dp0

set yyyy=%date:~0,4%
set mm=%date:~5,2%
set dd=%date:~8,2%

set time2=%time: =0%

set hh=%time2:~0,2%
set mn=%time2:~3,2%
set ss=%time2:~6,2%

forfiles /P "C:\inetpub\logs\LogFiles\W3SVC1" /M *.log /C "cmd /c if @isdir==FALSE del /s @path" /D -30

if %ERRORLEVEL% == 0 (
  echo %yyyy%/%mm%/%dd%/%hh%:%mn%:%ss% "IISログ自動削除スクリプトは実行OK、30日間以上のIISログは削除されました" >> IIS-DELET-LOG.log
) else (
  echo %yyyy%/%mm%/%dd%/%hh%:%mn%:%ss% "30日間以上のIISログは存在していないため、IISログ自動削除スクリプトは実行NG" >> IIS-DELET-LOG.log
)
exit /b 0
```

#参考資料
１．https://www.projectgroup.info/tips/Windows/iis_0004.html
基数変換とは

ｎ進数について学習したので、次に基数変換について学習していきます。

#基数変換とは
簡単に言うと１６進数を２進数に変えたり、８進数を１６進数に変えたりします。
１６進数から２進数に帰るときに計算するのは大変ですよね！
では、どうやって使っていくにのかを学習していきます。

#基数変換の構成要素
主に基数変換の要素は３つあります。
１．仮数
▶これは各桁の数になります。1,2,3など。
２．基数
▶桁の上げ下げに必要な数です。10進数なら10、2進数なら2。
３．重み
▶桁数を表すための数です。0から始まります。1桁目の重みは0、2桁目の重みは1、3桁目の重みは2です。

例題)(150)10　（10乗）
1桁目0*(10)0 
2桁目5*(10)1 
3桁目1*(10)2 
=100 + 50 + 0 = 150
となります。 

#①ｎ進数から10進数に変える方法
<桁の重み>
　1101.011　を　10進数に変えて行きたいと思います。
　1の桁から1,2,4,8をかけていきます。小数点以下は、1/2,1/4,1/8をかけていきます。
　答えは１３．３７５になったかなと思います。

#②10進数からn進数に変える方法
この方法は2つほどやり方があります。今回は、掛け算とわり算を使う方法で行います。
整数部は割り算、小数部は掛け算を使います。
13.375という10進数をn進数に変換していきたいと思います。
13には2をかけて割り切るまで計算を行います。
0.375には２をかけて行きます。（0.375 / 0.75 / 0.5）に分けることができます。
すべて計算すると1011.011になります。

#③n進数から8進数に変える方法
1011.011を３桁に区切ります。
これを区切ると以下のようになります。
001/101/010　になります。
あとは桁の重みをかけて行きます。答えが15.2となりましたね。
ではこれを2進数に変える方法は、1/5/2のように分けて考えます。整数部には割り算、少数には掛け算を行います。
001/101./010▶1101.010になります。

#④n進数から16進数に変える方法
こちらは４桁に区切ります。
1101/0100  に区切ります。
あとは上記のように桁の重みをかけていきます。答えがD.4になったかなとおもいます。
上記を２進数に変える場合は一度8進数に変える必要があります。