OmniAICreator/Qiita-1.07M huggingface dataset:
[C#] もうとにかく今すぐデバッグのためのログを出力したいときのクラス/メソッド

# もくじ

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

# やりたいこと

C#でアプリをつくっているときに、もう何でもいいから今すぐ簡単にログを出力させて、それを見たい。
例えば、VisualStudioでデバッグ実行がしたくてもできないけど、どの経路を通ったかを知りたくて、でもMessageBoxは出したくない、というとき。

# やり方

下記のような簡単なログ用クラスを貼り付けて使用する。

`public static class LogOnDesktop`のクラスがそれ。

終わったら、クラスごと消す。

```cs
namespace ConsoleApp1
{
    internal class Program
    {
        static async Task Main(string[] args)
        {
            var t1 = Task.Run(() => log("thread1"));
            var t2 = Task.Run(() => log("thread2"));
            await Task.WhenAll(t1, t2);
        }

        static void log(string str)
        {
            for (int i = 0; i < 10; i++)
            {
                LogOnDesktop.WriteLine($"{str} {i}");
            }
        }
    }
    
    public static class LogOnDesktop
    {
        private static object lockObj = new object();
        private static string logPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\mylog.log";

        public static void WriteLine(string line)
        {
            lock (lockObj)
            {
                var now = DateTime.Now.ToString("HH:mm:ss.fff");
                var thid = Thread.CurrentThread.ManagedThreadId;

                File.AppendAllText(logPath, $"{now} {thid} {line}{Environment.NewLine}");
            }
        }
    }
}
```

で、このクラスの`WriteLogToDesktopLogFile()`を実行するとデスクトップに`log.log`ファイルができるが、そいつを以前書いた[「Tailっぽくログを監視できるバッチファイル」](https://qiita.com/tera1707/items/00f6ba4cf9a0a4d497b8)を使ってリアルタイムで見てやれば、簡易的にログ監視体制の完成。

もしログに、ログを残したメソッド名を記録したければ、`WriteLogToDesktopLogFile()`を呼ぶときに下記のようにしてやればよい。

```cs
// using System.Reflection;
LogOnDesktop.WriteLogToDesktopLogFile(MethodBase.GetCurrentMethod().Name);
```

# 追記

下記ページのような方法もよさそう。

https://atmarkit.itmedia.co.jp/fdotnet/dotnettips/143debugoncon/debugoncon.html

https://www.fenet.jp/dotnet/column/language/9676/
[C#/WPF] 自分以外のウインドウを最前面にもってくる

# もくじ

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

# やりたいこと

自分以外のアプリのウインドウが、ほかのウインドウの後ろに回っていたら、最前面に表示させたい。

このページに、様々なやり方が書かれているので、そちらを見ればわかってしまうが、自分でもやって試したときのメモ。
https://dobon.net/vb/dotnet/process/appactivate.html

# やり方

`Microsoft.VisualBasic.Interaction.AppActivate()`を使う。

- 最前面に表示させたいアプリ(プロセス)のプロセス名を調べておく。
- その名前を`Process.GetProcessesByName()`に渡して、プロセス(の配列)を取得
- 取得したプロセスに対して、`Microsoft.VisualBasic.Interaction.AppActivate()`を行う。

※他にもやり方はいろいろある様子。上のページを参照。

# サンプル

例えば、自分と同じプロセス名を持つプロセス(同じexeを二つ起動してるときなど)を取得してきて、全部を最前面に出す、ということをしようと思うと、下記のようになる。

```cs
var current = Process.GetCurrentProcess();
Process.GetProcessesByName(current.ProcessName)
.ToList()
.ForEach(p => Microsoft.VisualBasic.Interaction.AppActivate(p.Id));
```

取得したプロセスの情報を使って対象を絞ってやれば、同じexeがすでに起動してたら、そっち側を最前面にもってくる、みたいなこともできる。

```cs
var current = Process.GetCurrentProcess();
Process.GetProcessesByName(current.ProcessName)
.Where(p => p.Id != current.Id) // ←自分以外を指定(プロセス名は同じでも、プロセスIDはそれぞれ異なる)
.ToList()
.ForEach(p => Microsoft.VisualBasic.Interaction.AppActivate(p.Id));
```

# 注意

普通にウインドウを持ってるアプリを普通に起動して、そこから上のようにしてやれば、ほかのプロセスを最前面にもってくる、ということはできるっぽい。

ただし制限事項もあるようで、その辺が下記にまとめられていた。
https://docs.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-setforegroundwindow#remarks
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/33d60db5-7e9e-3ee7-abf1-3a5ee9815d4c.png)

上に参考であげさせて頂いている[dobon.net](https://dobon.net/vb/dotnet/process/appactivate.html)のページでも、「アクティブ化することができないときのやり方」ということでまとめられているくらいなので、この条件の何かに引っかかってうまくアクティブ化できないことはあるんだろうと思う。

私個人的には、これまで最前面に持ってこれなかったことはあまりなかったが、1回だけ、どうしても最前面に出せないこケースがあった。

具体的には、
Windows10で、**アクションセンターの中のトーストを押して起動したアプリのWindowが表示される前(Loadedイベントの中)で`AppActivate()`をやっても、ほかのウインドウを最前面に出すことができなかった。**
(記憶がはっきりしないが、たしかそのケースでも、一度ウインドウがでてきて、ボタンを押したときに`AppActivate()`をすると、うまくいっていた)

上の制限事項をまとめた備考から考えるに、トーストが押されたことを検知してアプリを呼び出してくれるWindowsの機能が「バックグラウンドプロセス」で、バックグラウンドプロセスから呼んだプロセスの中では「ほかのウインドウをアクティブ化」するような処理はできない、ということなんだろう、と予測した。(本当にそうかどうかは不明...)
RailsのDocker化 〜その1〜

## はじめに
`Docker`はなんとなく聞いたことがあって、使うと便利なんだなーという印象があると思います。Ruby on RailsをDocker化するとどんなことが便利になるのか、検証していきたいと思います。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174291/024d7f0c-69f1-4c7e-58bf-74caafe448c4.png"  width=50%>


## Dockerとは
エンジニアでコードを書いたことがある人なら経験があると思いますが、開発環境を作るまでに時間かかりませんか？
* これが足らない！ってなんかエラーが出て進まない！！
* 私はMacだけど、○○さんはWindowsで環境構築してるから勝手が違う！！
* 先輩に私のときはこれでうまく動いたって言われた、、、。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174291/cc1da15b-b9e5-e525-6d9e-96d254d2c9e9.png"  width=30%>


### そこでDockerの登場
簡単にいうと、誰かが作ってくれた`dockerのimage`を使えば、環境に作用されず、ぽんっとコマンドを叩くだけで**localに開発環境が出来てしまいます**！！便利！！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174291/38c0e92c-cecb-7b04-b302-c8356f4ded28.png"  width=30%>


その２へつづく...
https://qiita.com/k-tetsuhiro/items/b84123d6e38150fb8a87
PyTorch 1.7でtorch-scatterをインストール

#環境
- Windows 10
- python 3.6.11
- Pytorch 1.7.0
- torch-scatter 2.0.5

#取り急ぎ成功したので急いでメモ。

```sh
$ pip install torch-scatter -f https://pytorch-geometric.com/whl/torch-1.7.0.html
Looking in links: https://pytorch-geometric.com/whl/torch-1.7.0.html
Collecting torch-scatter
  Downloading https://pytorch-geometric.com/whl/torch-1.7.0/torch_scatter-2.0.5%2Bcu110-cp36-cp36m-win_amd64.whl (2.4
MB)
     |████████████████████████████████| 2.4 MB 544 kB/s
Installing collected packages: torch-scatter
Successfully installed torch-scatter-2.0.5
```

#しかし動かそうとすると失敗
```
$ python natura/bin/pytorch_sample.py
Traceback (most recent call last):
  File "natura/bin/pytorch_sample.py", line 9, in <module>
    from torch_scatter import scatter_max
  File "C:\Users\dff40\.conda\envs\pytorch04gpu\lib\site-packages\torch_scatter\__init__.py", line 12, in <module>
    library, [osp.dirname(__file__)]).origin)
  File "C:\Users\dff40\.conda\envs\pytorch04gpu\lib\site-packages\torch\_ops.py", line 105, in load_library
    ctypes.CDLL(path)
  File "C:\Users\dff40\.conda\envs\pytorch04gpu\lib\ctypes\__init__.py", line 348, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: [WinError 126] 指定されたモジュールが見つかりません。
(pytorch04gpu)
```

#あきらめず
エラー内容はGPU関連っぽい。CPU版をインストールすればよいかも。そこでアンインストールして以下を実行

```sh
$ pip install torch-scatter==latest+cpu -f https://pytorch-geometric.com/whl/torch-1.7.0.html
Looking in links: https://pytorch-geometric.com/whl/torch-1.7.0.html
Collecting torch-scatter==latest+cpu
  Downloading https://pytorch-geometric.com/whl/torch-1.7.0/torch_scatter-latest%2Bcpu-cp36-cp36m-win_amd64.whl (289 k
B)
     |████████████████████████████████| 289 kB 364 kB/s
Installing collected packages: torch-scatter
Successfully installed torch-scatter-2.0.5
```

これでさっきのコマンドを動かすと無事動いた！
プライベートアドレスをもう一度ちゃんと理解してみる

## tl; dr

- ipアドレスが何かなんとなく知っている人対象
- 実践で参考になる用
- 文字ばかりになってしまったので若干読みにくいかも。。

## アドレスの範囲

プライベートアドレスは、以下の範囲で使うことができます

10.0.0.0 ~ 10.255.255.255 (約1677万アドレス)
172.16.0.0 ~ 172.31.255.255 (約104万アドレス)
192.168.0.0 ~ 192.168.255.255 (約6万アドレス)


## CIDR表記

たまーに、`192.168.10.4/24` みたいな表現をみることがあります
このipに`/24`の部分を足した形式が、CIDR表記になります

範囲はサブネットマスクによって分けられます
例えば、

255.255.255.0(10進数)
 =
(2進数)11111111.11111111.11111111.00000000
ですが、

例えば、こんな定義があったとします。
inet 192.168.10.4 netmask 0xffffff00
というのが自分のアドレスだっとします。

ちなみに
0xffffff00（16進数） = 255.255.255.0 = `11111111 11111111 11111111 00000000` = 256（10進数）
になります。


この場合範囲表記として以下
192.168.10.0/24 
ネットワークアドレスとして以下になります
192.168.10.0

/24はサブネットマスクの左からの1の数をを表してます。
ちなみにこの1の部分は「ネットワーク部」と呼びます。

このサブネットをみて、254個(※256-2をする)がipaddressとして使える範囲で使っているとわかることができます。

ネットワーク範囲
192.168.10.0 - 192.168.10.255

※256-2
先頭のアドレスは「ネットワークアドレス」
最終のアドレスは「ブロードキャストアドレス」
になるため利用できないため

## 応用した使い方

例えば、nginxのip制限とかでこの表記を使うことができます。

下記みたいな表記があったとします。
location /check {
 allow 10.6.0.0/16;
}

/16 = 255.255.0.0 = 65,536 = 0xffff0000 = `11111111 11111111 00000000 00000000`
なので、
10.6.0.0 - 10.6.255.255
の範囲で許容することがわかります。

では、`10.x.x.x`全て許可したいという場合はなんと書けばいいでしょうか？

考え方としては、ネットワーク部の左8個は変えないので、それ以外が0
11111111 00000000 00000000 00000000
となる。 これが /8として表現できる
なので正解は
10.0.0.0/8 
になります。

以上です


参考）
https://www.bungu-do.jp/tools/netmask
https://wa3.i-3-i.info/word11990.html
SAM が自動生成するリソースの調べ方

# tl;dr

AWS でサーバレス開発するときによく使う SAM (Serverless Application Model)、いろいろリソースを自動的に作ってくれて便利なんですが、ときどき自動で作成されるリソースの論理 ID がドキュメントされてなくて、自動作成されたリソースが参照できなくて困るときがあります。

そんなときは、 `sam deploy` の出力にある **LogicalResourceId** を見れば論理 ID がわかります。ここに出てるの LogicalResourceId を指定することで、 `template.yaml` からそのリソースを参照することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141307/be2d72bd-8e06-d677-e8c6-c6a4879e829b.png)

この例の場合 `AWS::ApiGateway::RestApi` が自動で作られたリソースなんですが、その ID が "`ServerlessRestApi`" というのがわかる、という寸法です。

LogicalResourceId は、 `sam deploy` の出力に加えて、 AWS マネジメントコンソールからも見ることができます。

# 細かい説明

## AWS SAM?

AWS が提供している Serverless Application Model (SAM) は、サーバレス開発で使うリソースのデプロイを宣言的に書くための仕組みです。 AWS で Infrastruture as Code を実現する仕組みである CloudFormation の拡張として実装されています。SAM を使うと、簡単な定義で Lambda や APIGateway など、必要なリソースをいろいろと立ち上げてくれて、けっこう便利です。

## 自動生成リソースと、まれにある困ったこと

この自動で作られるリソースをテンプレート内で参照したい場合、基本的にはドキュメントにかかれているので、その値を使えばよいのですが、たまーにリソース名がドキュメントに書かれていないものがあります。

たとえば下記のような `template.yaml` を用意して、`sam-cli` を実行することで、Lambda 関数に加えて、API Gateway の RestApi や、実行に必要なロールなど諸々のリソースが一発で作ってくれ、 `https://......./api_endpoint` という Web API が立ち上がります。

```template.yaml
AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Description: CloufFormation Template for project_name

Resources:
  EndPointFunction:
    Type: AWS::Serverless::Function
    Properties:
      Runtime: python3.8
      CodeUri: src
      Handler: lambda_handler.lambda_handler
      Events:
        API:
          Type: Api
          Properties:
            Path: /api_endpoint
            Method: post
```

このとき、実際に生成された API のフルパスを出力しようとすると、API Gateway の RestApi リソースを参照する必要があるのですが、[SAM のドキュメント](https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#api) には `a default AWS::Serverless::Api resource is created` とあるのみで、テンプレート内から参照するための論理 ID は書かれていません（2020/11 現在）

これまで、どうやって自動で作られるリソースを参照したいときにどうすればいいのか途方に暮れてしまい、手動でリソースを作るようにしていたのですが、、、

## 解決策

ある日、**LogicalResourceId** をみればよいことに気づきました。

ここの値を使うことで、例えば

```template.yaml
Outputs:
  ApiEndpointURL:
    Description: API Endpoint URL
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/${ServerlessRestApi.Stage}/api_endpoint"
```

といったように、 `ServerlessRestApi` を参照して、必要な情報を出すことができます！

## 余録

まあ、こういうドキュメントをみても論理 ID がわからないものがあれば、ドキュメントに PR を投げる、というのが本筋ではありますが、どう直せばよいかを知るのと、当座の作業を進めるための方法として、残しておきます。

StackOverflow でも困ってる人がいたので、[回答しておきました](https://stackoverflow.com/a/63532871/7449523)。
そこらへんにあるXMLファイルをC#でXElementを使って読み込むときの注意点 ～ xmlns

# まえがき

ノードの検索が引っかからなくて調べたら、
xmlns(namespace)の指定(`<hogefoobar xmlns="http://example.com">`みたいなの)が含まれるXMLファイルの場合、
`XElement`の`.Elements(ノード名)`などを指定するときの「ノード名」として、ネームスペースを含めた文字列をしてしないと抽出できないということが分かったので、備忘を兼ねて記事を書いておきます。

「`XElement`」とタイトルに書いてますが、`XElement`使わない場合もxmlnsには気を付けたほうがよさそうな予感。


# ソース(雰囲気)

```csharp:C#

XElement rootNode = XElement.Load("ほげほげ.xml");
XNamespace ns = rootNode.Name.Namespace;

IEnumerable<XElement> items = rootNode.Elements(ns + "ノード名");
```

# 参考サイト

- [LINQで名前空間がついたXMLをあつかう場合の注意 - Neareal](http://neareal.net/index.php?Programming%2F.NetFramework%2FLINQ%2FLinqAndXmlNamespace)
- [C#でxmlを読み書きする最もシンプルな方法はこれ！ - Samurai Blog](https://www.sejuku.net/blog/86867)
VPNとVPCの違いって？

## 勉強前のイメージ

VPNはネットワーク間を仮想なネットワーク回線を引く
VPCはAWSのサービス？

## 調査

### VPNとは

Virtual Private Network の略で、仮想専用線と呼ばれることが多い。
インターネット上に仮想的なプライベートネットワークを設け、その"経路"を使ってデータのやり取りをする。
環境間はインターネットを介してアクセスを可能にする。

![VPNUntitled Diagram.drawio - diagrams.net - Google Ch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/b1975d7e-e3e9-d1a1-a9c2-96439c963893.png)


### VPCとは

Virtual Private Cloud の略。
AWS上に構築する、プライベートなネットワーク"空間"のことです。

![VPCUntitled Diagram.drawio - diagrams.net - Google Ch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/0df254dc-d5dd-edf3-b600-04e7e5853d26.png)


## 勉強後イメージ

全く別物でした....
ﾊｽﾞｶｼｲ.....
でも、今までAWS触っててVPCはちゃんと空間として認識してたし
VPNは仮想の専用線みたいなのが引いてるっては分かってた....
恥ずかしい....恥ずかしいけどこの記事も出す...

## 参考

- [VPNとは何か？ 基礎からわかる仕組みとセキュリティの対策を解説](https://www.sbbit.jp/article/cont1/36318)
- [AWS初心者 入門編
脱・知ってるつもり！AWSのネットワーク関連用語を基礎からおさらい](https://www.bit-drive.ne.jp/managed-cloud/column/column_31.html)
[ Ruby ] 特異メソッドと特異クラス

# はじめに
特異クラス、特異メソッドについて、ふと調べてみようと思ったので、その内容をまとめてみます。

## 特異メソッド
`オブジェクト固有`のメソッドのことです。
定義するメソッド名の前に、オブジェクト名を書くことで定義できます。
なお、定義する際に、そのオブジェクトが既に存在していないといけません。

```
class Klass
end

apple = Klass.new
orenge = Klass.new

def apple.tokui_method
  puts "I'm apple"
end

apple.tokui_method
# => I'm apple
orenge.tokui_method
# => undefined method `tokui_method'
```

もしも定義する際にその指定するオブジェクトが存在していなかった場合、エラーとなります。

```
class Klass
end

def apple.tokui_method
  puts "I'm apple"
end

apple = Klass.new

apple.tokui_method
# => undefined local variable or method `apple' for main:Object (NameError)

````

特異メソッド内で`super`を呼ぶと、クラスに定義されている同名のメソッドが呼ばれます。
また、そのメソッドのオーバーライドが出来るという便利な点もあります。

```
class Klass
  def my_name
    puts "I'm fruits"
  end
end

apple = Klass.new
orenge = Klass.new

def apple.my_name
  super
  puts "I'm apple"
end

apple.my_name
# => I'm fruits
# => I'm apple
orenge.my_name
# => I'm fruits
```

##特異クラス
あるオブジェクトに`特異メソッド`を定義した際に、そのメソッドが定義されるクラスが`特異クラス`です。 

通常のクラスとは違い、特異クラスはあるオブジェクトだけが使用するクラスです。
そのため、特異クラスからオブジェクトを作成したり、サブクラスを作成することは禁止されています。

オブジェクトの特異クラスを確認するには
`Object#singleton_class`を使用します。

```
class Klass
end

obj = Klass.new
# => #<Klass:0x00007f8fb584cc08>

TokuiClass = obj.singleton_class
# => #<Class:#<Klass:0x00007f8fb584cc08>>

TokuiClass.new
# => can't create instance of singleton class (TypeError)

class SubTokuiClass < TokuiClass
end
# => can't make subclass of singleton class (TypeError)
```

また、前述した特異メソッドは特異クラスに定義されています。
特異メソッドに関しては
`singleton_class.method_defined?`で確認することができます。

```
class Klass
end

obj = Klass.new

def obj.tokui_method
  :tokui_method
end

p obj.class.method_defined? :tokui_method
# => false
p obj.singleton_class.method_defined? :tokui_method
# => true
```

###特異クラスが作成されるタイミング
オブジェクトが生成されたタイミングでは、そのオブジェクトの特異クラスは存在していません。
特異クラスは以下の場合に作成されます。

1, 特異メソッドを定義するタイミング
2, 特異クラス定義式を評価したタイミング
3, `Object#singleton_class`でオブジェクトに対して特異クラスの確認をするタイミング

##### 特異メソッドを定義するタイミング

```
obj = Klass.new

def obj.tokui_method
  :tokui_method
end
```

##### 特異クラス定義式を評価したタイミング
```
class << obj
end
```

##### `Object#singleton_class`でオブジェクトに対して特異クラスの確認をするタイミング
確認しようとしたタイミングで、特異クラスが存在していなければ新たに作成されます。

```
obj.singleton_class
```

## オブジェクトと特異クラス
特異クラスは、オブジェクトのクラスのサブクラスになります。

```
class Klass
end

obj = Klass.new
obj.singleton_class.supperclass
# => Klass
```
特異クラスがあるオブジェクトに対して作成されると、そのオブジェクトは特異クラスのインスタンスになりますが、Rubyの中では
特異クラスのインスタンスであるということは無視されるようになっており、常にオブジェクトのクラスのインスタンスとして扱われます。
`Object#instance_of?`で引数の直接のインスタンスか確認できるため、これを使用してみます。

```
obj.instance_of? obj.singleton_class
# => false

obj.instance_of? Klass
# => true
```

## 特異クラスをもてないオブジェクト
Rubyで以下のオブジェクトは特異クラスを持つことが出来ません。

- 数値
- Symbol
- true, false, nil

##### 整数とsymbleはエラーが返ってきます
```
1.singleton_class
# => can't define singleton (TypeError)
:symble.singleton_class
# => can't define singleton (TypeError)
```

##### true, false, nil は自身のクラスが特異クラスとして返ってきます

```
p true.singleton_class
# => TrueClass

p false.singleton_class
# => FalseClass

p nil.singleton_class
# => NilClass
```
無料でpmmp、nukkit鯖を立ててみる

# 最初に
初投稿です
よろしくお願いします<(_ _)>
https://ree-jp.net/build_pmmp_and_nukkit_servers_free/

# 何をするのか
[OracleCloudAlwaysFree](https://www.oracle.com/jp/cloud/free/)という無料でいろいろもらえるやつがあります
そのもらえる中にコンピュートVMが...!!!!!!!!!!!!!!!!!!!
それを使って鯖を立てちゃおう

# 必要な物
1. カード(持ってないくても大丈夫)
1. 電話番号

# Oracleアカウントを作成しよう
メールアドレス、電話番号、住所、カードが必要ですがカードは持ってなくても大丈夫
プリペイドカードでも登録できます(kyashだとはじかれるので[6gram](https://6gr.am/)を使おう)

# サーバーを建てよう

注意
このやり方はカスタマイズがめんどくさいです
普通のやり方は今度書きます

そしたらインスタンスを作成して実際に鯖を立ててみよう
名前を分かりやすいのに、osをCanonical Ubuntu 20.04(自分の好きなやつでおk)
あとはssh秘密鍵をダウンロードして作成!
立ち上がったらsshにログインして

```
mkdir pmmp
cd pmmp
wget https://jenkins.pmmp.io/job/PocketMine-MP/lastSuccessfulBuild/artifact/PocketMine-MP.phar
sudo chmod -R 777 .

sudo apt update
sudo apt install docker.io
sudo docker run -it -p 19132:19132/udp -v $PWD:/data -v $PWD/plugins:/plugins -v $PWD:/pocketmine --name pmmp pmmp/pocketmine-mp
```
（一部変更しました）

しばらく待つと勝手にサーバーが始まってるはず
サーバーの自動再起動のやり方は後ろに書いておいたから是非
ちなみにコンソールから抜けるには`ctrl`+`p`と`ctrl`+`q`を押すと出れて`sudo docker attach pmmp`と入力するとコンソールにもう1度アクセス出来るよ

# サーバーに入ろう
これでサーバーを建てることができました
しかしipとポートを入力しても入れない....

そんなあなた!
firewall設定を忘れてませんか?
インスタンスの詳細->プライマリvnicと書かれているとこのサブネットをクリック->セキュリティ・リストのDefault Secu.....をクリック->イングレスルールの追加
でポート開放出来るよ
![2020-11-12_22h23_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451005/059de109-0a20-9dfb-0a11-17dff4619ef7.png)

# コマンドの説明
```
wget https://jenkins.pmmp.io/job/PocketMine-MP/lastSuccessfulBuild/artifact/PocketMine-MP.phar
sudo chmod -R 1000:1000 .
```
最新のpharを[ここ](https://jenkins.pmmp.io/job/PocketMine-MP/lastSuccessfulBuild)からダウンロードしてきて誰でも使えるように権限を設定したよ

```
sudo apt install docker.io -y
sudo docker run -it -p 19132:19132/udp -v $PWD:/data -v $PWD/plugins:/plugins -v $PWD:/pocketmine --name pmmp pmmp/pocketmine-mp
```

[docker](https://docker.com)をインストールしてぽぽぽぽーんってコンテナを起動させたよ
細かい所(オプションとか)は自分で調べてるのも大事
決してメンドクサイとかじゃない

# 自動再起動のやり方
```
sudo docker run -it -p 19132:19132/udp -v $PWD:/data -v $PWD/plugins:/plugins -v $PWD:/pocketmine --name pmmp pmmp/pocketmine-mp
```

を`--restart=always`と付け加えるだけ

```
sudo docker run -it -p 19132:19132/udp -v $PWD:/data -v $PWD/plugins:/plugins -v $PWD:/pocketmine --name pmmp --restart=always pmmp/pocketmine-mp
```

するとあら不思議
サーバーが止めてもすぐ起動するようになっちゃった
サーバーを停止させるにはには`sudo docker stop pmmp`
gdal_mergeで巨大ファイルが生成されるときの対処法

# gdal_mergeで巨大なファイルが生成されてしまう...
tifデータなどを扱うgdalモジュール. 
gdal_merge.pyはそのモジュール内にある、tifデータを位置情報に基づいて結合するスクリプト. 
>[公式ドキュメント](https://gdal.org/programs/gdal_merge.html)

ドキュメント内のスクリプト（以下）を実行したところ...

```
python gdal_merge.py -init 255 -o out.tif in1.tif in2.tif
```

150MB程度のファイルを2つ結合しただけなのに、30GBを超える超巨大ファイルが生成された
（GとMをFinderが間違えているのではと何回も見返しました）

# 解消法
tifファイルは基本的に圧縮されているものらしく、先ほどのスクリプトに圧縮方法を表すタグをつけると圧縮してくれるらしい.
値がない部分などを圧縮するため、離れた地点の画像を合成すると大きなファイルになるらしい.

```
python gdal_merge.py -init 255 -o out.tif in1.tif in2.tif -co COMPRESS=DEFLATE
```

これで150MB程度の合成されたファイルが生成されました.
ちなみに圧縮率は多少少なくなるもののファイル互換性が高い圧縮方法などもあるそう
```
python gdal_merge.py -init 255 -o out.tif in1.tif in2.tif -co -co COMPRESS=LZW
```
Windows10の標準機能でZIP圧縮するぞい（手動とコマンド両方のやり方）

#バージョン
Windows10 Pro バージョン1909 OSビルド18363.1198


#手動
ファイル右クリック ⇒ 送る ⇒ 圧縮（zip形式）フォルダー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/27ae5c3f-2bb2-1343-8278-0711e0f9d74c.png)
ファイルと同じフォルダーにzipができる。


#コマンドプロンプトで
環境変数使いつつファイル名に現在日付を埋め込む、というオマケ付のコマンドがこちら。

```
powershell compress-archive %USERPROFILE%\Desktop\ぺこりーぬ.png %USERPROFILE%\Desktop\ぺこりーぬ_%date:~0,4%%date:~5,2%%date:~8,2%.zip
```


#PowerShellで
コマンドプロンプトと同じことをPowerShellでやる場合はこちら。

```
compress-archive $env:UserProfile\Desktop\ぺこりーぬ.png ($env:UserProfile + "\Desktop\ぺこりーぬ_" + (Get-Date).ToString("yyyyMMdd") + ".zip")
```


#蛇足
powershellではなく、コマンドプロンプトで実行できるコマンドは、レガシーな仕様や要件に対応できるから、個人的には使い勝手いいなあって思います。

コマンドはデータベースの定期バックアップファイルを圧縮するバッチで使ってます。
（データベースのdumpファイルは圧縮するとがっつり容量小さくなる場合がありんす）

zipパスワードの方法は残課題。
xcode playgroundでcocoapodライブラリを使用する。

swiftのライブラリの動作検証を行う時どうしていますか？
実機/エミュレーターで確認していますか？
xcode playgroundを使用する事で、より簡易にCocoapodライブラリの動作検証を行う事ができます。


## cocoaodをplaygroundに連携させる。
xcodeでnew frameworkを選び、プロジェクトを作成する。
![スクリーンショット 2020-11-12 21.56.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183835/fc695f4b-8d77-ebdb-7840-b8242a253786.png)

このチュートリアルでは、プロジェクトの名前は、cocoaPlaygronudとして進める。

## cocoapodを初期化
$ cd cocoaPlayground
して、プロジェクトのルートに移動する。
$ pod init
してpodFileを作成した後
以下のように書き換える。

ここでは、playgroundに通信ライブラリのalamofireを使用しようとしている。

```ruby

 target 'cocoaPlayground' do
    pod 'Alamofire', '~> 4.7'
 end
```

$ pod install
でライブラリをインストールする

# cocoapod対応ファイルをxcodeで開く
その後一旦xcodeを終了し、白いファイルであるcocoaPlayground.xcworkspaceを開く。
File < new < playgroundを作成する。

![スクリーンショット 2020-11-12 22.05.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183835/a013c228-7ceb-0f69-b319-d2ec1ae5e5fe.png)



その後manage schemeを開き、Alamofireにチェックを入れる。
![スクリーンショット 2020-11-12 22.07.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183835/e76943a7-d640-0fbe-5605-af18160bda5a.png)




先ほど作成した、playgroundに、
```
import Alamofire
```
の宣言を加えた後、runしてみよう。
正常に動作するはずだ。


「既存プロジェクトのviewControllerを、playgroundで0秒で走らせる。」（執筆中）
へと続く

## 参考
https://qiita.com/banjun/items/f8a5df4ddef3e9d2405b
https://medium.com/@ant_one/adding-cocoapods-library-to-a-playground-in-3-easy-steps-8a0f22150803
Macのターミナルのプロンプト名の変更方法

Macのターミナルの`$`の左側を色々いじっていたら変えたいときに分からなくなった。bashrcを変更する記事が多いように見えたが過去にいじった影響か.bash_profileだった。

```terminal
#Before
Takuya-no-Macbook-Pro: ~ takuya $ 

#After
takuya: ~$
```

結局、僕の場合は`.bash_profile`を変更すればよかった。`PS1='\[\e[33m\]\h: \W \u\[\e[0m\] $ '`が該当箇所であり

- \h 端末名？
- \u ユーザー名
- \W カレントディレクトリ名

それ意外の`e[33m\]`みたいなのはおそらく色を変更したときの名残だ。結局以下のように変更した。


```
#.bash_profile

if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi

##
# Your previous /Users/takuya/.bash_profile file was backed up as /Users/takuya/.bash_profile.macports-saved_2019-06-24_at_17:30:49
##

# MacPorts Installer addition on 2019-06-24_at_17:30:49: adding an appropriate PATH variable for use with MacPorts.
# export PATH="/opt/local/bin:/opt/local/sbin:$PATH"
export PATH="~/.rbenv/shims:/usr/local/bin:$PATH"
# Finished adapting your PATH environment variable for use with MacPorts.

export PS1='\[\e[33m\]\u:\W\[\e[0m\]$ ';

eval "$(rbenv init -)"
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"
```

.bashrcは以下のようになっており、このPATHがなぜ.nodebrew配下を参照しているのか不明であった。

```
#.bashrc

export PATH=$PATH:/Users/takuya/.nodebrew/current/bin
```

試していないが以下は参考になるかも
https://qiita.com/thinkalot/items/91c607919b8fcc29c55b
DiscordでLaTeXを表示できるChrome拡張機能

##はじめに
DiscordでLaTeXを表示できるChrome拡張機能を紹介します

チャットで数式を埋め込みたい場合に使えます

LaTeXの書式に慣れていたり、勉強中の人にオススメです

##環境
- [Google Chrome](https://www.google.com/chrome/)
- [Discord(ブラウザ版)](https://discord.com/)
- [LaTeX in Discord](https://chrome.google.com/webstore/detail/latex-in-discord/bejfcabcmhackmcaaclgiocgfpmpnaml)


##手順
1.Discordにログイン

2.Discordでサーバー立ち上げ

3.Chrome拡張機能　[LaTeX in Discord](https://chrome.google.com/webstore/detail/latex-in-discord/bejfcabcmhackmcaaclgiocgfpmpnaml)をダウンロード&拡張機能に追加

##表示
`$e^x$`と`$$e^x$$`を表示
![Screenshot (571).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844927/dd321a7c-dd3c-8d9d-aca2-7dc7d30593f2.png)
yarnのバージョンが低いってばよ

```
rake routes
error Couldn't find an integrity file                                                                                                                                                              
error Found 1 errors.                                                                                                                                                                              


========================================
  Your Yarn packages are out of date!
  Please run `yarn install --check-files` to update.
========================================


To disable this check, please change `check_yarn_integrity`
to `false` in your webpacker config file (config/webpacker.yml).


yarn check v1.22.10
info Visit https://yarnpkg.com/en/docs/cli/check for documentation about this command.


koyoishikawa@ishikawyounoAir Ruby_on_rails_task_2 % yarn install --check-files  
yarn install v1.22.10
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
warning " > webpack-dev-server@3.11.0" has unmet peer dependency "webpack@^4.0.0 || ^5.0.0".
warning "webpack-dev-server > webpack-dev-middleware@3.7.2" has unmet peer dependency "webpack@^4.0.0".
[4/4] 🔨  Building fresh packages...
✨  Done in 341.25s.

```
TableViewのヘッダーではなくNavigationItemのTitleだった件

iOS標準のメモアプリやメッセージアプリなど
TableViewのHeaderViewっぽいのがスクロールするとNavigationItemのTitleに表示される動きについて、TableViewのHeaderViewを触るものと思い込んでしまったせいでハマったので覚書き。
![NavigationTitle.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/750891/72073d6b-cf59-04ef-12fb-1d81925ff9af.gif)

## 実装手順
 - NavigationBarの**Prefers Large Titles**にチェックを入れる
 - NavigationItemのTitleにタイトルを入力
 - NavigationItemのLargeTitleを**Automatic**に。
 
以上！！
一瞬でした。



参考記事
https://qiita.com/mcz9mm/items/cd005814550087c7c707
Pester5対応

プロダクトスクリプト側の読み込みがPester5でうまく動かなくなったので、次のように修正した。

```PowerShell
#旧
$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path).Replace(".Tests.", ".")
. "$here\..\src\$sut"
```


```PowerShell
#新
BeforeAll {
  $sut = (Split-Path -Leaf $PSCommandPath.Replace(".Tests.", "."))
  . "$PSScriptRoot\..\src\$sut"
}
```
CSSが反映されない時の対処法

CSSがブラウザに反映されない時はいくつか原因があります。
今回は、考えられる原因とその対処法をご紹介します。

##反映されない原因
・キャッシュが残っている。
・CSSが機能していない。
・他の記述が優先されている。
・書いたCSSが確認できない。
・レイアウトのミス。

##キャッシュが残っている場合
`キャッシュ` = 過去に閲覧したWebサイトのファイルデータ（htmlファイルやcssファイル、画像など）を
　　　　　　パソコンの容量として一時的に保存してからブラウザに再利用させる機能。
つまり、簡単にまとめると`過去の閲覧情報を残すことで、次のサイト表示速度を上げる`ということです。

「解決方法」
`スーパーリロードする。`
スーパーリロード = `キャッシュを破棄して最新のデータを読み込む。`
・Windows：`CtrlキーとF5キーを同時押し`
・Mac ：`commandキーとshiftキーとRキーを同時押し`

##CSSが機能していない
CSSがしっかり機能しているかは、デベロッパーツールで確認できます。
`デベロッパーツール` = `無料でWEBサイトの状態確認や検証ができる。`

「確認方法」
ブラウザ上で右クリック→検証→反映されてないコードは黒線で囲んである所のように、`⚠︎注意マークと横線`が入っています。
`スペルミスや全角スペースが入っていないか、記述が間違っていないか`などを確認しましょう。
![スクリーンショット 2020-11-12 20.40.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601015/bd7d070b-fe27-d685-6fc1-9f2954e08101.png)
![スクリーンショット 2020-11-12 20.47.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601015/39a28f17-cbcc-1c8a-32b6-77aa75b061c5.png)



##他の記述が優先されていないか
先程と違って横線のみの場合は、`書き方に間違いはないが、この記述は反映されていない`ということです。
原因はCSSの`適用優先順位`によるものです。

![スクリーンショット 2020-11-12 20.40.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601015/abca6181-6c55-3067-ad51-1af336b9710c.png)

「解決方法」
・上の方に同じCSSが反映されていることがある為、反映されているCSSを削除する。
・削除したくない場合は、CSSの優先順位を上げる。
→セレクタを長くする、もしくはIDで指定する。

```
<div id="menu"> // htmlでid指定。

#menu {         // cssは#から記述。
 color: red;   // セレクタ：menu プロパティ：color 値：red 
}
```

##CSSが確認できない
書いたはずのCSSがデベロッパーツールで確認できない場合は、そもそも`CSSが読み込まれていない`か、`セレクタ名を間違えている`可能性があります。
・CSS読み込み　→　`<link rel="stylesheet" href="sample.css">`
・セレクタ名ミス　
　1.ID名の前に「#」をつけていない。
　2.class名の前に「.」をつけていない。
　3.つづりミス。

```
<html>
  <head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="sample.css">
    <title>CSS読み込み方法</title>
  </head>
  <body>
    <h1></h1>
  </body>
</html>
```
##レイアウトのミス
上記の方法でも解決できないということは、記述ミスではなくCSSの仕様に問題があるかもしれません。
具体的には下記のことが考えられます。
・float、positionの解除忘れ。
・幅や高さの指定による問題。
・ブロック要素とインライン要素による問題。etc...

こちらの解決方法に関しては、この記事では省かせていただきます。
なお、下記のサイトにて詳しく解決方法が記載されていますのでご覧になってみてください。
対処法：(https://www.sejuku.net/blog/100015)


参考元はこちら
対処法：(https://www.sejuku.net/blog/100015)
セレクタ：(https://www.asobou.co.jp/blog/web/css-selectors#CSSHTMLCSS)
CSS読み込み：(https://techacademy.jp/magazine/9647)
朝活LINE Botを開発しました！

![10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574568/de7450c3-7edd-bee4-fd96-83e767fc4520.jpeg)
#記事の概要
開発した朝活LINE Botについて、以下の項目に沿って説明します。
####開発の背景
開発に至った経緯について説明します。
####朝活LINE Botの機能
朝活LINE Botの機能について説明します。
####今後のアップデート項目
今後加えていきたい機能について説明します。
####開発環境
開発環境を簡単に説明します。
#開発の背景
朝活をやりたいメンバーでライングループを作り、朝活に励んでいました。
そこでは毎朝6時台に起きて、「おはよう」とメッセージを送り、各々朝活をしています。
寝坊した場合は罰ゲームとして、飲みに行ったときに「寝坊した回数×1杯」を他のメンバーに奢るというルールがありました。
実際に何度か寝坊するメンバーがいましたが、寝坊回数を集計するのがとても面倒でした。
そのとき、「集計するシステムを作っちゃえばいいじゃん！」ということで、このLINE Botを開発することにしました。
何かを始めるときはノリと勢いが大事ですね！
#朝活LINE Botの機能
###朝活への参加登録
![IMG_0289.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574568/0d989438-4996-0f9e-d650-aa157180ad55.jpeg)
「朝活に参加する」とメッセージを送信すると、参加登録をしてくれます。
処理としては、メッセージを送信した人のプロフィールを取得し、データベースに登録します。
自分の意志で朝活をやるんだという思いを持ってほしいので、この機能を実装しました。
###寝坊回数を集計する
このLINE Botの機能の根幹となる部分です。
6時台にメッセージがなかった人は寝坊したとカウントします。
処理としては、6時台のメッセージをデータベースに保存し、7時になったら寝坊判定の処理を実行します。
###寝坊回数の表示
![13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574568/908a9b30-4f16-844d-6e77-11ad81ec5e78.jpeg)
「寝坊回数を教えて」とメッセージを送信すると、参加者全員の寝坊回数を教えてくれます。
###朝活のお休み
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574568/10c4666e-a501-181f-5408-07f697766485.jpeg)

ときには朝活をせずにゆっくり寝たいときもありますよね。
そんなときには、「明日はパスします」や「明日は休みます」と言えば、朝活を免除できます！
###プッシュメッセージ送信 (1/6追記)
寝坊した場合は、その人の名前を通知します。寝坊せずに起きることができれば、お褒めの言葉をいただけます。
![CE12264F-FB74-42F6-A402-5119BFAD4BE4_1_102_o.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574568/9505d783-20be-a331-03dc-a69d94350335.jpeg)

#今後のアップデート項目
####朝活開始時間の選択
現在は6時台に設定されていますが、ティム・クックさんみたいに4時に起きて朝活をしたい人もいると思います。
お好みに合わせて設定できるようにする予定です。
####~~プッシュメッセージ送信機能~~
~~午前7時に実行する集計処理の結果と、起きれなかった人の名前を通知する機能を実装したいと思います。~~
→1/6実装完了
####寝坊回数リセット機能
罰ゲームを終えたあとは寝坊回数をリセットする必要があります。全員一括でリセットするのか、個人ごとにリセットするのか、仕様を検討します。
####朝活をする曜日の選択
毎日朝活をやりたい人や、土日くらいはゆっくり寝たいという人もいると思うので、選択できる機能を追加する予定です。
#開発環境
言語：PHP7.4
フレームワーク：Laravel5.5
データベース管理システム：MySQL8.0
サーバー：ConoHa VPS

#最後に
完成までに、webhookURLがエラーとなったり、DBへデータをインサートできなかったりと他にも様々なエラーに遭遇し、何回か心が折れそうになりました。それでも完成までこぎつけることができたのは、周りの方の支えがあったからです。助けていただいた方々、ありがとうございました！おかげで素晴らしいものができました。今後こういったシステムを作っていって、困っている人の助けになれるように頑張ります！

以上で朝活LINE Botの説明を終わります。最後までお読みいただきありがとうございました！
Autohotkeyでトースト湯婆婆

# はじめに
　皆さまの湯婆婆のコードを見てみると、ついつい作ってしまいました。[Javaで湯婆婆](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2)が最初でいいんですよね。
[【毎日自動更新】湯婆婆 LGTMランキング！](https://qiita.com/torifukukaiou/items/c8361231cdc56e493245)を見ると、いまや、あらゆる言語、あらゆる処理系で湯婆婆が走るという。
これは令和時代の hello,worldかもしれない。

# Autohotkey とは
　Autohotkeyとは、シンプルにキーフックのコードが書けるWindows用のスクリプト言語です。シンプルすぎるぶん、クラスライブラリを作りにくいとか、リソースの概念がないので画像を埋め込めないとか、GUIは殆ど手作業のコードで書いていく必要があるとか色々と問題はありますが、一応ギリギリ実用ツールも作れるレベルです。
　詳しくは、[Autohotkey](https://www.autohotkey.com/)から処理系をダウンロードして遊んでください。
　マニュアル本は売られてないので、[Autohotkey Wiki](http://ahkwiki.net/Top)へどうぞ。

# 標準出力の代わりにトースト通知
　Autohotkeyに、標準入出力が標準であるか否か不明ですが、すくなくとも今まで使ったことがありません。また、外部ライブラリを組み込めば標準入出力がありそうですが、シンプルに作りたいのに、外部ライブラリを組み込むのは馬鹿らしい。そこで、Autohotkey が標準で持っているWindows10のトースト通知で湯婆婆のセリフを表示します。これが標準出力の代わりです。
なお、ジブリのフリー素材から湯婆婆アイコンを作って載せました。

![thumb-chihiro016_256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266273/a617bbfa-3487-543b-ab2d-c41c557407f0.png)

アイコン作成には、マルチアイコン生成ウェブアプリを使用させていただきました。この場を借りて感謝いたします。
https://kantaro-cgi.com/webappli/multiicon-maker/

yubaba.exe を実行すると、最初、湯婆婆は契約書へのサインを要求します。
![湯婆婆１A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266273/62988f32-3d07-2bd5-a388-713814fa0ac8.png)


# 標準入力の代わりにダイアログ＋テキストボックス
標準入力の代わりに、入力ダイアログ＋テキストボックスとＯＫボタンを設けました。

![契約書3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266273/abd1b45a-c3b1-3213-1e27-d1f887d9a502.png)

契約書のテキストボックスに名前を入れて、ＯＫボタンをクリックします。

すると、トースト湯婆婆のダメ出しを喰らいます。
![湯婆婆2a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266273/55e10b91-72f1-1d4b-fab4-35127f0e93be.png)


３秒後に、トースト湯婆婆が新しい名前を付けます。
![湯婆婆３a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266273/91813065-1cee-f0f3-87a6-75640c418c97.png)

ラテン文字の名前ならば、Autohotkeyの機能で強制的に入力置換とかもできた筈です。
例えば、Elizabethと入力すると Beth に置換するなどです。これにより、名前が強制的に置き換えられる筈でした。
しかし、日本語の２バイト文字では、IMEとカナ漢字変換が絡むので、Autohotkeyでは流石に操作できません。
よって、湯婆婆の最後のセリフの後、yubaba.exe は終了します。

# トースト湯婆婆のソースコード解説

ソースコードを以下に示します。

```ruby:yubaba.ahk
	TrayTip,湯婆婆,契約書だよ。そこに名前を書きな。
	Sleep,1000
	Gui, Default
	Gui, New
	Gui, Font,s10 c000000
	Gui, Add, Edit,vvName X60 Y20 W260 H20 -Vscroll,
	Gui, Add, Button,ggButtonOk X300 Y60 W80 H22,ＯＫ
	Gui, Show, W420 H90, 契約書
	return


gButtonOk:
	Gui, Submit, NoHide
	Gui, Destroy
	TrayTip,湯婆婆,フン、%vName%というのかい。贅沢な名だねぇ。
	Sleep,3000
	len := StrLen(vName)
	Random,sPos,1,%len%
	NewName := SubStr(vName,sPos,1)
	TrayTip,湯婆婆,今からお前の名前は%NewName%だ。いいかい、%NewName%だよ。分かったら返事をするんだ、%NewName%！！
	Sleep,3000
	exitapp

```
TrayTip文が、トーストを通知します。第１引数がトーストのタイトル、第２引数がトーストのメッセージです。
Sleep文は、第１引数だけ待ちます。単位はミリ秒です。
一連のGui文は、契約書ダイアログを表示したのち、Return して常駐します。
なお、ＯＫボタンをクリックすると、gButtonOK: ラベルに飛びます。

gButtonOK:の最初の Gui,Submit,NoHideは、テキストボックスに入力された名前を変数vNameに設定するものです。
Gui,Destroy は、ダイアログを閉じるものです。
StrLen() は、文字列長を取得する関数です。
Random文は、第１引数の変数に、第２引数から第３引数までの整数をランダムに設定します。
SubStr() は、文字列の一部を取得する関数です。
exitappは、トースト湯婆婆を終了する文です。

なお、名前がないときには一応クラッシュしているようですが、何も言わずに落ちるので派手さはないです。
この湯婆婆、ずいぶんと寡黙です。

OSDNにソースコードと実行ファイル一式をアップロードしました。
https://osdn.net/projects/toast-yubaba/releases/
環境変数について

##環境変数とは
変数：
　ソースコード内に格納する変数。

環境変数：
　OSに格納する変数。開発環境により値が異なる。ソースコードには、値が記載されないため値がコードから値がバレることはない。

$pass = 'asdf'  →　バレる。（変数）

＄pass = ＄_PASSWORD →　バレない（環境変数）　※OS内で　＄_PASSWORD = 'asdf'を定義。

##.envファイルについて
phpでは環境変数を使用する時**【.env】**を使用する。
.envファイルに記載された設定はOSに保存される。

例）

```
.env

PASSWORD=password
```

取り出し方

```
$_ENV['PASSWORD']
```

###phpdotenvについて
実際に.envに定義された環境変数をOSに反映させるためのライブラリ。

【インストール手順】

1)　composer.jsonの設定

```
composer init
```

```composer.json
#作成される。

{
    "name": "root/html",
    "require": {}
}
```

インストールする。

```
composer require vlucas/phpdotenv
```

```composer.json
#反映される。

{
    "name": "root/html",
    "require": {
        "vlucas/phpdotenv": "^5.2"
    }
}
```
実際のインストール先は**vendor**ディレクトリの中。
vendor / vlucas / phpdotenv / src 配下に格納される。

2).envの設定

ルート直下に .env を作成。

実際の環境変数を記載

```
.env

DB_HOST="db"
DB_USERNAME="user"
DB_PASSWORD="pass"
DB_DBNAME="books"
```

phpdotenvを用いて環境変数をロードする記載

```php
#オートロードを読み込む。個別のライブラリを読み込まなくてすむ。
require __DIR__ . '/vendor/autoload.php';

$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
#( .env　があるディレクトリを指定)
$dotenv->load();
```
link_toメソッドでmethod: :deleteにしても、HTTPがGETになってしまう現象

#はじめに
　link_toメソッドを使って、削除機能を実装しようとしたときに、つまずいたこととその解決法についてまとめておく。

##エラー内容
　「HTTP[GET]を探したけれど、そんなものないよ」みたいな感じのルーティングエラーが出た。

##link_toメソッドのHTTPメソッドのデフォルト
　link_toメソッドはHTMLでいうところのaタグの役割なので、ページを遷移させるときに使いことが主になる。そのため、特にmethodを指定しなければ、HTTPメソッドはGETとなる。

##method: :deleteにする理由
 先に挙げたように、link_toメソッドはデフォルトでGETになっているので、methodを別に指定する必要があるから。

##エラーの解決方法
　荒技になるが、link_toメソッドをbutton_toメソッドに変える。多少、デザインが変わるが、機能は意図したものが実装できる。

##最後に
　Rails6では、webpackがデフォルトであり、何やらうまく読み込まなくなってしまっているようだった。今まで、このエラーはでなかったのに、オリジナルアプリケーションを作るようになってから、見かけるようになった…。いまだに原因は謎に包まれている。
【Java】toString()メソッドの使い方

#プログラミング勉強日記
2020年11月12日
数値を文字列に変換するためのtoStringメソッドについてまとめる。

#toStringメソッドとは
　数値型などをString型に変換するために使う。引数にString型の文字列に変換したい引数を指定し、戻り値はString型の文字列を返す。

```java:数値を文字列に変換する
public class Main {
  pubic static void main(String[] args) {
    int num1 = 1234;
    int num2 = 5678;
    System.out.println(num1 + num2);

    // 数値を文字列に変換する
    String str1 = Integer.toString(num1);
    String str2 = Integer.toString(num2);
    System.out.println(str1 + str2);
  }
}
```

```:実行結果
6912
12345678
```

#toStringメソッドをオーバーライドして使う
　自作クラスでtoStringメソッドを使うためには、オーバーライドする必要がある。オーバーライドするときは`@Override`をつける。

```java:自作クラスでtoStringメソッドをオーバーライドする
class Age {
  int age = 21;
  @Override 
  public String toString() {
    return "age =" + age;
  }
}
public static Main() {
  public static void main(String89 args) {
    Age age = new age();
    String str = profile.toString();
    System.out.println(str);
  }
}
```

```:実行結果
age = 22
```

#HashMapでtoStringメソッドを使う
　toStringメソッドはjava.lang.Objectクラスで定義されているので、どのクラスでも使うことができる。そのため、無意識にtoStringメソッドを使っていることもある。

```java:
import java.util.HashMap;
 
public class Main{
	public static void main(String[] args){
		HashMap<String, String> map = new HashMap<>();
		map.put("key1", "value1");
		map.put("key2", "value2");
		map.put("key3", "value3");
		System.out.println(map);
	}
}
```

```:実行結果
{key1=value1, key2=value2, key3=value3}
```
　このコードでは最後に`System.out.println()`の引数の中にjava.util.HashMapのオブジェクトを指定して、オブジェクト内の要素を確認するコードになっている。java.lang.String以外の参照型が引数に指定された場合は、`System.out.println(map.toString());`と記述しているのと同じようになり、そのオブジェクトのtoString()メソッドで文字列が出力されている。




#参考文献
[【Java入門】toStringで数値を文字列へ変換(オーバーライドも解説)](https://www.sejuku.net/blog/51067)
[[Java]toString()メソッドの有用な使い方](https://www.kenschool.jp/blog/?p=4020)
Laravel5.5 config プルダウンメニュー/ラジオボタン

Laravelの便利機能configでプルダウンメニューやラジオボタンつくってみました！
今回は血液型を血液方のテーブルを作成せずに、Usersテーブル内で血液型データを保管したい！
テーブルをいっぱい作るのはイヤだ！という方のために書きました！


##configを使ってプルダウンメニューをつくろう！
####作業の流れ
1.configにプルダウンメニューに入れたいリストを作成。
2.Usersテーブルに専用カラムを作成
3.コントローラーで呼び出し、viewにデータを渡す。
4.viewで表示し、セレクトボックスで表示。選択後はそのデータを再度コントローラーに渡す。
5.コントローラにて選択されたデータをうけとる。（その後、DBに保存など行う）
6.DBに入れた数字に伴ったデータを取得

####1.configにプルダウンメニューに入れたいリストを作成。
作成する場所
``Laravel->config->ここにファイル作成``
プルダンメニューに表示させるものは下記のように配列でかきます！

````php:blood.php
<?php
return array(
	'1' => 'A型',
	'2' => 'B型',
	'3' => 'AB型',
	'4' => 'O型'
);
?>
```
####2.Usersテーブルに専用カラムを作成
まず、Userテーブルに血液型とついになっている数字が入るようなカラム作成をします。
カラム名には縛りがあります。
`/config/blood.php`のファイル名からもじる必要があります。
ファイル名が`blood.php`なら、カラム名は`blood_id`
また、この後にUserモデルに関数を書きますが、そこのメソッド名の命名法にも縛りがあります。
（6.にて説明）

####3.コントローラーで呼び出し、viewにデータを渡す。

``config('ファイル名')``で、さっき作成したプルダウンメニューが呼び出されます！
※ファイル名とはconfigディレクトリ内に作成したファイルの名前。今回だと**blood.php**なので、`config('blood') `となります！
その後は、いつも通りにコントローラーからビューへデータを飛ばします=33
 
```php:コントローラー
public function add() {
		$blood_types = config('blood');
		return view('viewの指定', compact('blood_types'));
	}
```
####4.viewで表示し、セレクトボックスで表示。選択後はそのデータを再度コントローラーに渡す。

```view.blade.php
<select name="blood">
@foreach ($blood_types as $blood_type)
<option value="{{ $blood_type }}">{{ $blood_type }}</option>
@endforeach
</select>
````
####5.コントローラにて選択されたデータをうけとる
送信されたデータはコントローラーの$requestから取ってこれるんで、以下のように血液型のデータを取ってこれる。

```php:コントローラー
dd($request->blood);
//(例)1
//A型を表す数字。DBに入れるデータはこの数字
```
この方法では、A型をあらわす`1`をコントローラーで受け取れます！

####6.DBに入れた数字に伴ったデータを取得
どういうことかといいますと。
取得したのはA型を表す``1``
DBに保存されるデータも``1``
では、そのDBに保存されている``1``からそうやって``A型``というデータを取得すればいいのでしょうか？
今回はそのお話。

関数は`get[ほにゃらら]Attribute（）`で、[ほにゃらら]の部分になんの情報かわかるような単語を入れます。後にviewで使うので、何のデータかわかるような名前にした方が無難ですね。
今回は`BloodType`でいきます！

```php:User.php

public function getBloodTypeAttribute() {
    return config('blood.'.$this->blood_id);
}

```

```User.blade.php
血液型：{{ $user->bloodType }}　//A型
血液型：{{ $user->blood_id }}　//1
```
##おまけ~configを使ってラジオボタンを実装！~

```view.blade.php

@foreach ($blood_types as $blood_type)
<ul style="list-style: none;">
<li><input type="radio" name="blood" value="{{ $blood_type }}">{{ $blood_type }}</li>
</ul>
@endforeach
````
`<ul style="list-style: none;">`は`<li>`によってリスト化した際に、冒頭の`・`を消すコード。今回はラジオボタンなのであると邪魔なんで消しました。
また、コントロールでは`$request->blood`でデータが取得できます！

以上になります！
これでconfigを使って、プルダウンメニューやラジオボタンを作成していただければ幸いです！
LGTM大好物なんで、ポチッと投げ銭感覚でおねがいします〜！ :sunglasses:
ActiveHashの活用

#はじめに
Railsでオリジナルアプリを制作しています。このアプリにActiveHashを適用しました。プルダウン形式でActiveHashで設定したデータを選択できるようにしました。忘れても思い出せるよう書き残します。

※ActiveHashは都道府県名一覧のように変更されないデータを扱います。変更されないデータなので、データベースには直接保存する必要がないです(都道府県毎に用意したidは保存されます)。

**開発環境**
ruby 2.6.5
Rails 6.0.3.4


#目次
1.ActiveHashの導入
2.モデルの準備
3.コントローラーの準備
4.ビューの表示

#1.ActiveHashの導入
ActiveHashはGemの1つ。Gemファイルに追記し、ターミナルでインストールする。

```ruby:Gemfile
gem 'active_hash'
```

```bash:ターミナル
bundle install
```

#2.モデルの準備
ここではday(日数)をActiveHashの対象とする。モデル作成時--skip-migrationを追加するとマイグレーションファイルは作成されない。他にもActiveHashの対象があるなら、その数だけモデルを作成する。

```bash:ターミナル
rails g model day --skip-migration
```
モデル内ではActiveHashを継承するすること。self.dataはハッシュ形式のデータが格納された配列になる。ハッシュ内はidとname(日数)が紐づく。

```ruby:app/models/day.rb
class day < ActiveHash::Base #←ActiveHashを継承する
 self.data = [
   { id: 1, name: '--' },
   { id: 2, name: '1日' },
   { id: 3, name: '1週間' },
 ]
 end
```
続いて上記で設定した日数のidをデータベースに保存する設定を行う。ActiveHashが紐づくテーブルとしてarticleを例にする。

```ruby:2020***********_create_articles.rb
class CreateArticles < ActiveRecord::Migration[6.0]
 def change
   create_table :articles do |t|
     t.string     :title        , null: false
     t.text       :text         , null: false
     t.integer    :day_id       , null: false #ActiveHashのidが保存されるカラム 
     t.timestamps
   end
 end
end
```

忘れずマイグレーションを行う。モデルのアソシエーションも。


```bash:app/model/article
validates :day_id # _idをつける
belongs_to_active_hash :day # _idは不要
```

#3.コントローラーの準備
ストロングパラメータにday_idを追加して、保存できるようにする。

```ruby:article.controller.rb
例:
  def new    
    @article = Article.new
  end

  def create    
    @article = Article.new(article_params)
  end

  private
  def article_params
    params.require(:article).permit(:title, :text, :day_id)
  end
```

#ビューの表示
collection_selectによってプルダウン形式で表示できる。引数は第一から第五まである。

| 引数 | 値 | 
|:-:|:-:|:-:|
| 第一引数(保存されるカラム )  |  day_id | 
| 第二引数(オブジェクトの配列) | Day.all  |   
| 第三引数(カラムに保存される項目)  | id  |   
| 第四引数(選択肢に表示されるカラム名)  | name  |   
| 第五引数(オプション)  | {}  |   
| htmlオプション  | {class:"day-select"}  | 

```
<%= f.collection_select(:day_id, Day.all, :id, :name, {}, {class:"day-select"}) %>
```

以上
既存システムを Mendix に移行する

# はじめに

Mendixでアプリを作成する時、新規に作成する場合以外にも、既存の古いアプリをMendixプラットフォームに乗せ換えたいという場合があると思います。古いアプリは、ExcelやAccessで作られていたり、VBやJavaだったりするかと思います。システムの移行はどの場合も大変ですが、ローコードプラットフォームのMendixの場合も同様です。移行について検討してみましょう。


# システム移行について

システムが長く使われていればいるほど、正式な設計書などのドキュメントが残っていなかったり、コードには複雑なロジックが埋め込まれていたりします。ハードウェアやミドルウェアなどの実行環境のサポート終了に伴って移行が必要になった時に、システムの中身はブラックボックスでも、ユーザーは現行踏襲で、などと言ったりします。しかし、Mendixに移行する場合、既存のリソースはほとんど役に立ちません。Mendixなどのローコードプラットフォームは独自のアーキテクチャで構成されているので、既存のロジック、画面定義などは使うことができません。

これはあくまで捉え方次第であり、DX時代に既存のリソースに足を引っ張られる必要はなく、新しいビジネスモデルが要求されているのだからシステムも新しくすべきというふうに捉えることもできます。


# システム移行の流れ

Mendixへのシステム移行に既存のリソースがほとんど使えないと言いましたが、比較的安定しているデータモデルについては活用することができます。既存のデータモデルを分析して、新しいビジネスモデルに向けて見直しを行います。Mendixのようなローコード開発ではモデルの分析などいわゆる上流工程の重要性が高まります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751319/cb422dbe-ea5f-31be-bb8c-8c36a02b57b6.png)

# ERMaster

ERMasterはオープンソースのデータベース設計ツールです。歴史のあるツールですが、最近でも記事が記事が書かれているほど人気があります。EcliplseベースでMac、Window、Linuxなどで利用できます。

（参考サイト）

- [Eclipse + ERMasterで既存DBからER図をリバース](https://qiita.com/homelan/items/4ef2022ef60375aa40fe)
- [Pleiades(Eclipse)にERMasterをインするトールする方法](https://www.sym.me/archives/209)
- [ER図を作成するためのツール「ERMaster」をインストールしてみた](https://www.purin-it.com/install-ermaster)
 
# リバースエンジニアリング

ERMasterを使用して既存アプリのデータベースからデータベース定義書やER図を作成することができます。既存アプリから作成したデータベース定義書やER図を作成した後に、新しいビジネスモデルの視点でデータモデルを見直して、新しいデータベース定義書やER図を作成します。

### 大まかな流れ

　既存アプリの分析　→ データモデル見直し　→ 新しいモデルの作成

### リバースエンジニアリングのポイント

- 辞書の利用 - ERMasterを使用したリバースエンジニアリング時に辞書を使うと、データベース項目から日本語項目名を生成してくれます。この機能をうまく使うことで、項目名の標準化を効率的に行うことができます。

　こちらの　[サンプル辞書](https://ja.osdn.net/projects/ofbiz-jp/downloads/57177/ermaster_dictionary.zip/)　を参考にしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751319/dd0a8f5c-8c32-dc56-a2c6-782e2f304824.png)

```text:dic_tables
party,取引先
party_acctg_pref_and_group,取引先会計設定およびグループ
party_and_geo_point,取引先および位置地点
party_and_group,取引先およびグループ
party_and_person,取引先および個人
party_and_user_login,取引先およびユーザログイン
party_and_user_login_and_person,取引先およびユーザログインおよび個人
party_attribute,取引先属性

...

```

```text:dic_columns
abbrev,略
abbreviation,省略
about_content_id,コンテンツIDについて
acc_dep_gl_account_id,減価償却累計GL勘定
acceptance_condition,受付状態
accept_coupons,受付クーポン

..

```


- Excelテンプレート - Excelテンプレートを使用してリバースエンジニアリングしたデータベース設計からデータベース定義書を作成することができます。

　[サンプルExcelテンプレート](https://github.com/naofum/mendix-excel2entity/blob/master/template.xlsx?raw=true)　はこちら。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751319/e0f37f57-a08e-71fd-a170-cfdb44bdfbd9.png)


# Mendixアプリ作成

Mendixはスプレッドシートからアプリを作成することができます。ERMasterで作成したデータベース提議書のExcelを編集してこのインプットに用いることができます。
PythonのSeleniumでよく使うであろう備忘録

# 参考URL

|タイトル|URL|
|---|---|
|Selenium for Python Elementにフォーカスを当てる|https://qiita.com/BlueSilverCat/items/e1dc9ec65f235a7fff01|
|【Python】SeleniumでHeadless Chromeを使おう|https://qiita.com/derodero24/items/9e9567790bde9e4b9d0c|
|Pythonで文字列を検索（〜を含むか判定、位置取得、カウント）|https://note.nkmk.me/python-str-search/|
|Pythonでファイルの読み込み、書き込み（作成・追記）|https://note.nkmk.me/python-file-io-open-with/|
|Pythonで実行中のファイルの場所（パス）を取得する__file__|https://note.nkmk.me/python-script-file-path/|
|Python】文字列が空白・NULLか判定する|https://pg-chain.com/python-null|
|比較演算子の使い方|https://www.javadrive.jp/python/if/index4.html#section2|
|論理演算子の使い方|https://www.javadrive.jp/python/if/index6.html#section1|
|Seleniumを安定稼働させるために行うべき３つの設定(Headlessモードにも対応)|https://tanuhack.com/stable-selenium/|
|Pythonで文字列を検索（〜を含むか判定、位置取得、カウント）|https://note.nkmk.me/python-str-search/|
|【Python】get_attribute・・・属性名から属性値を取得する|https://www.seleniumqref.com/api/python/element_infoget/Python_get_attribute.html|
|Python 重複を削除する方法|https://qiita.com/ShinichiIt0/items/419af2f6342bd50923a8|
ASP.NET 無印 と Core  のサポート期間まとめた

選定していく中で .NET Frameworkベースのものと .NET Coreベースのもので、大きく考え方が異なるようだったので、まとめておきます。

マイクロソフト社の複数の戦略（その時々の）と、密接に関わっているようで、ただ数字をおいかけるだけでもわからず、理解が大変でした。

※英語を意訳しての理解となるので、間違いあればご指摘もらえると幸いです。


# ASP.NET ✕ .NET Framework

ASP.NET MVC 5 や ASP.NET Web API 2 の土台になってる側です。

.NET Framework を別途提供される、External Componentsと紹介されているので .NET Frameworkのサポートをおいかけて判断することになりそう。


| フレームワーク | サポート期限 | メモ |
|:-----------|:------------|:------------|
| ASP.NET    | 未決        | .NET Framework 4.8 の EoS と等しくなるだろう |
| ASP.NET MVC 5     | 未決      | １２ヶ月前通知あり  |
| ASP.NET Web API 2 | 未決      | １２ヶ月前通知あり  |
| Entity Framework  | 未決      | １２ヶ月前通知あり  |
| Microsoft OWIN v4 | 未決      | １２ヶ月前通知あり  |


※.NET Framework 4.8 がでてきてるのは、11/12現在での最新として、[こちら](https://dotnet.microsoft.com/platform/support/policy/dotnet-framework)に記載があるためです。


## ASP.NET Support Policy

こちらを参照して、読み解いてみました。

- [ASP.NET Support Policy](https://dotnet.microsoft.com/platform/support/policy/aspnet)


ASP.NET の多くの部分（ASP.NET Web Forms, Controls, Modules, Handlers, etc）は .NET Framework の一部なので [.NET Framework のサポートポリシー](https://dotnet.microsoft.com/platform/support/policy/dotnet-framework)を参照とのこと。

.NET Framework側を参照すると .NET Framework 4.5.2 以降は、初期導入されていた Windows OS のライフサイクルに基づくとあります。また、.NET Frameworkは、Windows OS の コンポーネント扱いになることも書かれていました。


また External Packages となる ASP.NET MVC 5 や ASP.NET Web API 2 は、マイクロソフト社のサポートライフサイクルポリシーでは "Tool" 扱いとなり、最低でもサポート終了前12ヶ月に通知があるとのこと。

個人的な結論としては、利用している WindowsOS のサポート期限と、利用している .NET Framework のサポート期限を見るということになりました。

IISで動作させることを考えると WindowsOS と .NET Framework のサポート期限は ANDの関係（両方を満たす必要あり）かなと。


なお、各Windows OS に初期導入されている .NET Framework は、こちらで確認ができます。

- [.NET Framework のバージョンおよび依存関係](https://docs.microsoft.com/ja-jp/dotnet/framework/migration-guide/versions-and-dependencies)



# ASP.NET Core ✕ .NET Core

.NET Core は、 .NET Core, ASP.NET Core and Entity Framework Coreなどのいくつかの技術をさしますとありました。

[ASP.NET Core 2.1 on .NET Framework](https://dotnet.microsoft.com/platform/support/policy/aspnetcore-2.1) 以外は、次に基づくとの理解です。


| フレームワーク | サポート期限 | メモ |
|:-----------|:------------|:------------|
| .NET Core 3.1	  | 2022年12月3日  | LTS |
| .NET Core 3.0	  | 2020年3月3日  | サポート終了 |
| .NET Core 2.2	  | 2019年12月23日  | サポート終了 |
| .NET Core 2.1	  | 2021年8月21日  | LTS |


※ASP.NET Core 2.1 だけ、なぜ .NET Coreベースじゃないのかは知らないので、誰か教えて下さい


## .NET Core Support Policy

こちらを参照して、読み解いてみました。

- [.NET Core Support Policy](https://dotnet.microsoft.com/platform/support/policy/dotnet-core)

LTS（長期サポート）リリース と Currentリリースの２種類があるとのこと。OSSと同じモデルをとってると考えていいのかなと思いました。

.NET Core各バージョンが、どのOSをサポートしているかは、こちらにリストがあります

- [.NET Core Supported OS Lifecycle Policy](https://github.com/dotnet/core/blob/master/os-lifecycle-policy.md)


# .NET 5がきになった

公開前に、次のページみたら、 .NET 6以降の計画がでてました。


.NET 5 , 11/10にリリースされていたのですね。（これを書いている間に。。。笑い）

- https://dotnet.microsoft.com/download/dotnet/5.0


Windows Forms , WPF (デスクトップ向けコンポーネント）は含まれてないけど、ほぼほぼすべての統合？のようです。

速報など：

- https://www.publickey1.jp/blog/20/net_51windowsmaclinuxweb.html
- https://japan.zdnet.com/article/35162284/


# その他

過渡期ですねぇ〜

どっちを使えばいいのか？というのは、ケースバイケースとしか言いようが無いように思いました。

維持するのも大変だけど、新しいこと始めるときの入り口みつけるのも、なかなか大変。。
【pytorch】max_pool2dしてmax_unpool2dする意味ってなんだろう？

<h1>背景</h1>
encoderとdecoderのネットワークでmax_poolしてからmax_unpoolしてるのを見て、これは一体なんの意味があるのか気になったので実験してみた



<h2>実験</h2>
test code

```
x_4, indices_4 = F.max_pool2d(x_42, kernel_size=2, stride=2, return_indices=True)
x_4d = F.max_unpool2d(x_4, indices_4, kernel_size=2, stride=2, output_size=dim_4)
print("x_4d.shape=",x_4d.shape)
print("x_42.shape=",x_42.shape)

save_image(x_4d[0,0,:,:],"x_4d.png")
save_image(x_42[0,0,:,:],"x_42.png")
```
output

```
x_4d.shape= (8, 512, 14, 14)
x_42.shape= (8, 512, 14, 14)
```

<h2>結果</h2>
x_4d[0,0,:,:]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/e8d1a6ce-ef11-fd4f-3471-e2829df82469.png)

x_42[0,0,:,:]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/bf611bf8-034d-567b-f607-e03dfb75b817.png)


数字で表すとこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/b80c8c7f-5c3a-61dd-061f-7bbee95fdf9d.png)



<h1>結論</h1>
max poolしてmax unpoolすると、windowの中の最大値以外が0になる。
機能的には強い特徴が強調されるという事だろうか。

<h1>参考文献</h1>
http://usagisagi.hatenablog.com/entry/2018/07/04/212940
Red Hat社製品のサポート期間を確認する

製品のサポート期間を確認しようとして、どこを見たらいいんだろう？とちょっと探してたので。

このサイトを見ると良さそうなので、メモとして。

[Product Life Cycle Checker](https://access.redhat.com/labs/plcc/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/2124ac57-5cbf-666a-da62-2ae14f6c03f1.png)

製品ごとに調べられて、便利。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/152c31cf-066c-e1c0-f986-385b4b862b55.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/02f885d0-f603-6cfc-4950-30fffc962b2c.png)