OmniAICreator/Qiita-1.07M huggingface dataset:
MVVMについてざっくり調べたこと。

Vue.jsに入門するに当たり、MVVMという言葉をまったく知らなかったので簡単に調べてみました。

#MVVMとは
Model、View、ViewModelという3つの要素を持ったデザインパターン。
Vue.jsはMVVMを採用している。
ModelはViewModelとつながっていて、ViewModelとViewが双方向にデータバインディングしている。

##Model
　Modelはビジネスロジックやデータを指す。
　Webアプリケーションだとjsオブジェクトやそのオブジェクトを作るために利用するHTTP通信などで通信した先も含む。

##View
　Viewはフォームも含む、表示するものを指す。
　WebアプリケーションだとHTMLやブラウザに当たる。

##ViewModel
　ViewとModelの間の情報の伝達と、Viewを表示するための状態保持の役割を担う。

##データバインディング
　ViewとViewModelを紐付ける仕組みで、どちらかの値が変化するたびにViewとViewModel両方の値が変更される。

#参考資料
- [RACCOON TECK BLOG>Vue.jsが採用しているMVVMパターンとは【目的を重点に解説】
](https://techblog.raccoon.ne.jp/archives/1570147207.html)
- [DigitalMarketingblog>ソフトウェアアーキテクチャー…？MVCやMVVMってなに！？
](https://digitalidentity.co.jp/blog/creative/mvc-mvvm.html#MVC)
初心者がhamlの書き方まとめてみた

## はじめに
最近、railsの勉強をしています。少し前までは、`erb`を使っていたのですが,
`haml`に最近切り替えたので、自分なりにまとめてみたいと思います。
文章ところどころ、おかしいところあるかもしれませんがご了承ください。

## hamlとは
HTML abstraction markup language
HTML/XHTMLを生成するためのマークアップ言語
HTMLを効率的に生成するための記法。

## hamlの書き方
* HTMLのタグを使いたい場合

下記は、pタグを使って、hogeという内容を出力

```haml:
%p hoge
```
* クラス,IDを定義したい場合

```html:
<div class="hoge">hoge</div>
<div id="huga">huga</div>
```
:arrow_double_down:　hamlに変換します。

```haml:
.hoge hoge
#huga huga
```

* Rubyの文法、変数を使いたい場合

```haml:
 - hoge = "fuga"
 
 - @tasks.each do |task|
    %tr
      %td= link_to task.name, task
      %td= task.created_at
```

`=`を使うことによって、`=`以降の内容が`=`前のタグの内容として、出力されます



## 私が思うhamlの魅力
* HTMLタグを省略できる
hamlだとHTMLの閉じタグを省略したり、`div`などを省略することができるので、閉じ忘れをする心配などがないので、私的にはとてもありがたいです:relaxed:

* erbよりスッキリして見える
個人的な考えなのですが、erbよりかなりタグが少ないので、スッキリしてコードが読みやすいです。

* Rubyの文法が簡単に呼び出せる。
for文などの繰り返し文書いたりする際、簡単に書くことができます。

## 導入方法
*  `Gemfile`に下記を書く

``` ruby:Gemfile
gem 'haml-rails'
```

*  `bundle install`します
*  `rails haml:erb2haml`をターミナルで実行して、`erb`を`haml`に置き換える



##最後に
私は、`haml`とても書きやすいと感じます。
よかったら、皆さんも`haml`入門してみてください！！
Github一切わからない初心者が翻訳を頼まれたのでやってみた

この記事の対象
GitHub使ったことない人

#翻訳の流れ
とりあえずやり方だけ書いておきます。

##Forkする
特段の権限が与えられていない場合はまず最初にこれをやります。
（頼まれていても権限を与えられていない場合はこの方法になると思います。知らんけど。）

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625910/cb7e883e-360c-145f-65ca-30fbf3d63972.png)

この上のほうにあるForkってやつを押します。

Forkっていうのは人のものを自分のところにコピーして自分でいじれるようにすることだと解釈しています。

##翻訳するところをいじる
翻訳したいところをいじります。
翻訳したいファイルに移動します。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625910/4b1c28a9-0687-9243-24d2-ae04b7306eab.png)

鉛筆のマークのところを押すと編集できます。
編集し終わったら下のほうにある緑色の「Propose file change」というボタンを押します。

##プルリクエストを送る
変更したものをプルリクエストします。
編集した後にこのようなページに移動するので緑色の「Create pull request」のボタンを押します。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625910/b4501de1-0ffd-72f7-80da-5b0bee61669b.png)

この後テキトーなタイトルをつけておくればおｋです。

プルリクエストがどういううものかわからないのですが個人的な解釈としては「ここ変えてみたから本家本元のほうでも使ってクレメンス」って感じです。

参考
[フォークを使って作業する](https://help.github.com/ja/github/collaborating-with-issues-and-pull-requests/working-with-forks)
[フォークからのプルリクエストの作成](https://help.github.com/ja/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request-from-a-fork)
PKCS #12形式のファイルをPEM形式に変換し、RubyでSSLクライアント認証する

自分への覚え書きを兼ねてまとめてみた。
#証明書のファイル形式の変換

`OpenSSL`コマンドを使う。

拡張子が.p12場合

```
$ openssl pkcs12 -in sample.p12 -out sample.pem
```

拡張子が.pfxの場合

```
$ openssl pkcs12 -in sample.pfx -out sample.pem
```

この場合、__クライアント証明書__、__ルート証明書__、__秘密鍵__がすべて出力されてしまうのでオプションを使う。

| オプション | 意味 | 
|:-----------|:------------:|
| -clcerts     | クライアント証明書を出力（ルート証明書は出力されない） | 
| -cacerts     | ルート証明書を出力（クライアント証明書は出力されない） | 
| -nokeys      | 秘密鍵が出力されない | 
| -nocert      | 証明書が出力されない | 
| -nodes       | 秘密鍵が暗号化されない |

今回は、__クライアント証明書__と、__暗号化された秘密鍵__が欲しかったので、

```
$ openssl pkcs12 -in sample.p12 -out sample.pem -clcerts
```

秘密鍵のpassphraseが聞かれるので、入力すると変換終了。

#RubyでSSLクライアント認証
`net/https`ライブラリを使う。
基本は[リファレンス](https://docs.ruby-lang.org/ja/1.9.3/library/net=2fhttps.html)を参考にすればよい。
アクセスを確認するためにGETメソッドを叩く。

```certification.rb
require 'net/https'
require 'openssl'
require 'uri'

uri = URI.parse("アクセス先のURL")
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
cert_file = './sample.pem'
pass = 'パスワード'
https.key = OpenSSL::PKey::RSA.new(File.read(cert_file), pass)       #秘密鍵の作成
https.cert = OpenSSL::X509::Certificate.new(File.read(cert_file))    #証明書の作成
https.verify_mode = OpenSSL::SSL::VERIFY_PEER
https.verify_depth = 5
https.start do
    request = Net::HTTP::Get.new(uri.request_uri)
    response = https.request(request)
    puts response.body
end
```

無事にレスポンスボディが返ってくれば成功。
JanusGraphのスキーマ③ - Property Key Cardinality


[公式ドキュメント - Schema and Data Modeling](https://docs.janusgraph.org/basics/schema/)


## Cardinality

ここでいうCardinalityとは、データベース用語のカーディナリティ(データのバリエーション数)ではなく、ER図におけるカーディナリティの方であり、プロパティと値の対応関係を示すものである。

JanusGraphにおけるCardinalityの定義は以下の3種類である。


|設定値|説明|
|---|---|
|Cardinality.SINGLE|**[デフォルト]**1つのプロパティは1つの値を持つ。1つのプロパティに対して、複数の値を対応付けることはできない|
|Cardinality.LIST|1つのプロパティに対して、複数の値を対応付けることができる。同じ値が重複してもよい|
|Cardinality.SET|1つのプロパティに対して、複数の値を対応付けることができる。同じ値が重複することはできない|

`LIST`と`SET`は最近のプログラミング言語には大体備わっているList,Setだと思ってよい。


## 試す

例によって、Docker Composeを使いながらデータベースを構築して検証する。手順は[こちらを参照](https://qiita.com/chromia/items/8c70ca78df62c47dcae2#%E5%AE%9F%E9%A8%93%E7%94%A8%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E7%AB%8B%E3%81%A1%E4%B8%8A%E3%81%92%E6%96%B9%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E6%96%B9%E6%B3%95)。

Gremlinコンソールを立ち上げ、以下のようにスキーマの設定を行う

```groovy
gremlin> :remote connect tinkerpop.server conf/remote.yaml
==>Configured localhost/127.0.0.1:8182-[0216e5fe-069a-49ee-849b-d67b88d5f7b6]
gremlin> :> m = graph.openManagement()
==>org.janusgraph.graphdb.database.management.ManagementSystem@4ceeb465
gremlin> :> m.makePropertyKey("single").dataType(String.class).cardinality(org.janusgraph.core.Cardinality.SINGLE).make()
==>single
gremlin> :> m.makePropertyKey("list").dataType(String.class).cardinality(org.janusgraph.core.Cardinality.LIST).make()
==>list
gremlin> :> m.makePropertyKey("set").dataType(String.class).cardinality(org.janusgraph.core.Cardinality.SET).make()
==>set
gremlin> :> m.commit()
==>null
```

`single`,`list`,`set`の、それぞれカーディナリティが異なる3種類のプロパティを定義した。注意点だが、公式ドキュメントにあるように`.cardinality(Cardinality.SINGLE)`のように記載すると、違う`Cardinality`クラスが使用されてエラーになるので、上記のように名前空間込みで記述すること([参考](https://github.com/JanusGraph/janusgraph/issues/1222))。

### Cardinality.SINGLE

1つのプロパティは値を1つだけ持つ

```groovy
gremlin> :> g.addV("sample").property("single", "a").next().values()
==>a
gremlin> :> g.addV("sample").property("single", "a").property("single", "b").next().values()
==>b  // 2個設定しても、1個しか持たない
gremlin> :> g.addV("sample").property("single", "b").property("single", "a").next().values()
==>a  // 後に指定した方が残る
```

### Cardinality.LIST

1つのプロパティに対して、複数の値を対応付けることができる。同じ値を複数持てる。

```groovy
gremlin> :> g.addV("sample").property("list", "a").next().values()
==>a
gremlin> :> g.addV("sample").property("list", "a").property("list", "b").next().values()
==>a
==>b  // 2つ持っている
gremlin> :> g.addV("sample").property("list", "a").property("list", "b").property("list", "b").next().values()
==>a
==>b
==>b　// 同じ値を複数持てる
```

### Cardinality.SET

1つのプロパティに対して、複数の値を対応付けることができる。同じ値を複数持てない。

```groovy
gremlin> :> g.addV("sample").property("set", "a").next().values()
==>a
gremlin> :> g.addV("sample").property("set", "a").property("set", "b").next().values()
==>a
==>b
gremlin> :> g.addV("sample").property("set", "a").property("set", "b").property("set", "b").next().values()
==>a
==>b  // 同じ値は複数持てない
```
【C#】親クラスの全プロパティの値を子クラスに簡単にコピーできるようにする方法

# 親クラスのインスタンスが持っている全プロパティの値を子クラスに簡単にコピーできるようにしたい

何かしらのライブラリ等に存在するクラスにちょっとした拡張を加えた子クラスを用意して使う、という場面はたまにあります。
そういう場合、（使い方にもよりますが）既存のインスタンスにすでに持たれている各プロパティの値を子クラスにもコピーしたい、ということがあります。

そのような場面に直面した場合の手軽な対応方法を紹介します。
以下のようなクラスを例として説明します。

```csharp:Parent.cs
// 親クラス
public class Parent
{
    public int Prop1 { get; set; }

    public string Prop2 { get; set; }

    public object Prop3 { get; set; }
}

// 子クラス
public class Child : Parent
{
    // 子クラスで付け足すプロパティ
    public object OriginalProp { get; set; }

    // 子クラスで付け足すメソッド
    public void OriginalMethod()
    {
        // Do something
    }
}
```

# 良くない方法（ゴリ押し実装）

以下のように、子クラスのコンストラクタで引数として親クラスのインスタンスを受け取り、プロパティを1つ1つ代入していく方法でも実現はできます。
ですが、この方法には以下のような問題があります。

* 親クラスがアップデートされてプロパティに変更が加えられる（またはプロパティが増える）たびに子クラスのメンテナンスが必要になる。
* プロパティの数が多いと実装が面倒。

```csharp:Parent.cs
// 子クラス
public class Child : Parent
{
    // 子クラスのコンストラクタ内でプロパティを1つ1つ代入させるように実装する。
    public Child(Parent parent)
    {
        this.Prop1 = parent.Prop1;
        this.Prop2 = parent.Prop2;
        this.Prop3 = parent.Prop3;
    }

    /* 以下略 （独自に足したプロパティやメソッド） */
}
```

```csharp:BusinessLogic.cs
// 子クラスを使用する業務ロジッククラス
public class BusinessLogic()
{
    // このメソッドの中で子クラスを生成して使用する。
    public void SomeMethod(Parent parent)
    {
        var child = new Child(parent);

        // Do something
    }
}
```

# （多分）良い方法

子クラスのコンストラクタを以下のようにすることで、親クラスがメンテナンスされた場合でもそのまま動いてくれるようになります。

```csharp:Parent.cs
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

// 子クラス
public class Child : Parent
{
    public Child(Parent parent)
    {
        // 親クラスのプロパティ情報を一気に取得して使用する。
        List<PropertyInfo> props = parent
            .GetType()
            .GetProperties(BindingFlags.Instance | BindingFlags.Public)?
            .ToList();

        props.ForEach(prop =>
        {
            var propValue = prop.GetValue(parent);
            typeof(Child).GetProperty(prop.Name).SetValue(this, propValue);
        });
    }

    /* 以下略 （独自に足したプロパティやメソッド） */
}
```
[RSpec]NameError:   uninitialized constant Rspecというエラーの対処法

Rspecではなく
RSpecにすれば直ります。

```ruby
Rspec.describe "HomesController", type: :controller do
#=> NameError: uninitialized constant Rspec
# ./spec/controllers/homes_controller_spec.rb:3:in `<top (required)>'
# ------------------
# --- Caused by: ---
# NameError:
#   uninitialized constant Rspec
#   ./spec/controllers/homes_controller_spec.rb:3:in `<top (required)>'

RSpec.describe "HomesController", type: :controller do
#=> Finished in 1.77 seconds (files took 8.81 seconds to load)
# 14 examples, 1 failure
```

なんとまさかSを小文字にしてたなんて・・・・（泣）

この記事を見てハッと気づきました。
https://stackoverflow.com/questions/28487983/uninitialized-constant-rspec

小1時間も無駄に・・・
どなたかのためになれば幸いです。

ちゃんと見てたつもりでも、「NameError: uninitialized constant」を見たら、もう絶対何か名前つけ間違えてると思ってチェックするようにします。
NTFS-3Gでマウントしたディレクトリにファイルを書くと所有者がrootになってしまった話

# 何が起きたのか
NTFS-3G で UserMapping を使ってWindowsのNTFSパーティションをマウントした。
既存のファイルはちゃんとユーザーが自分のものになっていたが、新しくファイルを書くと全部所有者がrootになってしまって困った。

# どうしたのか
Linux のアカウントのPrimary Group をユーザー名と同名のものにしたら直った。
UserMapping にはユーザー名しか書いてなかった。UserMappingにないグループのファイルを作っちゃったからダメだったんだろう。
Gridsomeのvue-remarkプラグインでPageをtypeNameとして使うとエラーが出る

Jamstackで多分人気な[Gridsome](https://gridsome.org/)の話題です。
MarkdownにVueコンポーネントを使える様にする[@gridsome/vue-remark](https://gridsome.org/plugins/@gridsome/vue-remark)というものがあります。
このtypeNameのオプションに`Page`を使うとエラーが出てコンパイルできなくなります。

``` gridsome.config.js（悪い例）
...
  plugins: [
    {
      use: '@gridsome/vue-remark',
      options: {
        typeName: 'Page',
        baseDir: './content/pages',
        pathPrefix: '/',
        template: './src/templates/MarkdownPage.vue'
      }
    },
  ...
  ],
...
```

``` エラー出力内容
coder@vbx:/var/samba/jamstack-sites/$ gridsome build
Gridsome v0.7.14

Initializing plugins...
Load sources - 0.11s
Error: Cannot get field 'id' from type 'Page'. Field does not exist.
```

`typeName`を`MarkdownPage`などに変更すると、コンパイルできる。

``` gridsome.config.js（大丈夫な例）
...
  plugins: [
    {
      use: '@gridsome/vue-remark',
      options: {
        typeName: 'MarkdownPage',
        baseDir: './content/pages',
        pathPrefix: '/',
        template: './src/templates/MarkdownPage.vue'
      }
    },
  ...
  ],
...
```
[ruby]Rubyの分数の計算

# 1.何があってこの記事を書いたか

下記のコードを書いたら無限ループしてしまい理由が意外だったからです

```
n = 0
i = 0
while  i < 8
  n += 1
  i = i + (1/n)
  puts "#{n}"
end
```

# 2.無限ループ回避
~~どうやら`(1/n)`と書くと1かnが文字として認識されるらしく計算が永遠に終わりませんでした。~~
→2020/4/24にご指摘をいただき、文字ではなく、（分数が正の値の場合）切り捨てとして扱われることが判明しました。また負の値の場合は取り扱いが変わるそうなので注意が必要となります。


そこで分数の表示を`Rational(1, n)`と書くことで正常に動きました。
下記が正しいコードです。

```
n = 0
i = 0
while  i < 8
  n += 1
  i = i + Rational(1, n)
  puts "#{n}"
end

```
Enumeratorを返すArray#flatten（Ruby）

@kts_h さんの
[複数の Enumerable なオブジェクトで tally したい【追記あり】](https://qiita.com/kts_h/items/246a9af2834544ea0b24)
の記事でコメントのやり取りをしていて、`Array#flatten`に Enumerator を返すメソッドがあるとおもしろいと思ったので、適当に実装してみました。

##コード
```ruby:Ruby
class Array
  def flatten_to_enum
    Enumerator.new do |y|
      doit = ->(e) {
        if e.class == Array
          e.each {doit.(_1)}
        else
          y << e
        end
      }
      each {doit.(_1)}
    end
  end
end
```

##使い方

```ruby:Ruby
ary = [0, 1, [2, [3], [4, 5, [6], 7, 8], 9, 10], 11]

ary.flatten
#=>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

ary.flatten_to_enum.to_a
#=>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
ary.flatten_to_enum.map {_1 ** 2}
#=>[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121]
```

もし巨大な Array で複雑に入れ子になっているものがあったら、平坦化して利用するのにメモリを節約できます。ただ、この実装は再帰を使っているので、あまりにも深くネストしている配列は平坦化できないかも知れませんが、まあ実際上は大丈夫でしょう。

しかし、そんな需要があるのかというと、まずないだろうなあ（笑）。

##追記
@kts_h さんのコメントを受けてコードを修正しました。それから、上のリンク先の記事のような場合の例を挙げておきます。

```ruby:Ruby
ary = Array.new(200000) {Array.new(20) {rand(5)}}
ary.flatten_to_enum.tally
#=>{2=>800022, 1=>799687, 4=>798559, 0=>800752, 3=>800980}
```

こうした巨大な Array がネストしている場合、`Array#flatten`だとまた巨大な配列を作ってしまって`tally`することになります。こうした場合にメモリ使用量の点で有用かなということです。Enumerator だし頻繁に Proc をネストして呼び出すので、速度は遅いです。

##再追記
Proc 呼び出しの回数が減るように修正しました。

```ruby:Ruby
class Array
  def flatten_to_enum
    Enumerator.new do |y|
      store_array = ->(ary) {
        ary.each do |e|
          if e.class == Array
            store_array.(e)
          else
            y << e
          end
        end
      }
      store_array.(self)
    end
  end
end
```

こちらの方が速いと思います。
HAADJ について簡単にまとめたメモ


## Hybrid Azure AD Join

略して **HAADJ** と呼ぶことも。

完全に個人的な興味だけでとりあえずこの単語にまつわる色々を調べたのでメモです。
（特にAAD構築したいとかそういう目的があってのものじゃないので中途半端なメモです…）

## AD

**AD(Active Directory)** が何かと言うと、ざっくり言うとユーザーとか認証とかパソコンとかを（ディレクトリ的な解層構造で）管理する仕組みです。もしイメージつかなければ、乱暴に、ユーザー管理（認証）の仕組みと思ってくれても良いです。 通常はオンプレミス、つまり、自前のサーバー上でこの **AD** の仕組みを動かしています。

社内のネットワークにログインする（パソコンを接続）ことで、社内ネットワーク上のプリンタや社内システムなどが使えるようになります。

## Azure AD

**Azure Active Directory** つまり Azure上で動く **Active Directory(AD)** です。 **AD** を **Azure** 上で提供してくれるサービスです。 つまり **Azure** 上でユーザー管理をしてくれるサービスです。

インターネット上にあるAzureを使うのでインターネット上のサービスが使えます。乱暴に言ってしまうと、ブラウザ上からログインしてブラウザ上のサービス（Office365やAzureや）を使えるようになります。

特に最近はWindowsマシンだけではなく、AndroidやiPhoneのような非Windowsマシンやインターネット上のサービスなど多様な環境・デバイスで作業をすることが多くなってきているので **Azure AD** のようなクラウド上の仕組みが重要になってきてます。

## Azure AD join

**Azure AD** にユーザーとしてログインしてインターネット上のサービスを使うだけではなく、**Azure AD** にパソコン自体を参加させる仕組みです。

ブラウザ上でユーザーログインするのではなく、パソコン自体がインターネットに参加する＝パソコンの管理もインターネット上で行う感じです。

## Hybrid Azure AD Join

やっと **HAADJ** つまり **Hybrid Azure AD Join** です。

上で説明した **（Hybridじゃない）Azure AD join** は、あくまで **Azure AD** につなぐだけです。 すべてが **Azure AD** で管理されていればいいのですが、世の中の会社ではすでに　**オンプレミスのAD** が構築されていますのでその資産は使いたいです。

そんな、社内システム／社内ネットワークの仕組みもそこそこあって、でも、インターネット上のサービスもそこそこ使いたい。こういう状況では、どちらかの **AD** だけではなく、**オンプレミスの AD** と **Azure の AD** の両方使えると便利です。

そこで使えるのが **Hybrid Azure AD** です。 ハイブリッドという響きの通りで、**オンプレミスの AD** と　**Azure AD** の両方を使う事が出来る仕組みです。 例えば、**Azure AD** でログインすることで **AD** 側とも認証情報が同期されます。

これで、インターネット上のサービスも、オンプレミス上のサービスも、１つのユーザー（ID）で自由に、かつ、安全に使えるようになります。（Office365のブラウザ上のSharePoint上のファイルをPC上のデスクトップアプリでも編集する、みたいな透過性を**しっかり管理された状態のもと安全に**作業することができます。）

# さいごに

あってるかどうかちょっと自信がないです。。けれど、まあ、イメージとして大枠とらえるのが目的だったのでとりあえず目的は果たせたかと。。
Tclで指定ディレクトリ配下のファイルを再帰を使わずリストアップ

指定ディレクトリ配下にあるファイルを再帰を使わずにリストアップする関数です。

```tcl
proc find {{pattern "*"} {dir ""}} {
	set depth -1
	set retry -1
	while {$retry} {
		set wildcards [lrepeat [incr depth] *]
		lappend found {*}[glob -nocomplain -directory $dir -type f -join {*}$wildcards $pattern]
		set retry [llength [glob -nocomplain -directory $dir -type d -join {*}$wildcards *]]
	}
	return $found
}
```

dirを省略するとカレントディレクトリを起点に検索を始めます。

patternを省略すると全てのファイルをリストアップします。

patternには`*.tcl`のようなglobパターンを指定できます。Windowsで試したら大文字と小文字は区別されませんでした。Linuxでは試していませんが、たぶん大文字と小文字は区別されると思います。

再帰を使わず実現できているカラクリはglobコマンドの-joinオプションです。globコマンドのヘルプには

> -join
> The remaining pattern arguments, after option processing, are treated as a single pattern obtained by joining the arguments with directory separators.

と書かれています。

どういう事かというと、`-join * * * *.tcl`と書くと`*/*/*.tcl`というパターンでファイルを検索するという意味になり、同じ深さの異なるディレクトリそれぞれでファイル検索を行うことになります。

この機能を利用して、

1. `-type f`オプションでファイルをリストアップ
2. `-type d`オプションでディレクトリが見つかったら`-join`に与える`*`を増やして1に戻り、ディレクトリが無かったら終了

というループを回しているだけです。

Tclって、ちょくちょくこういう強引・・・もとい、強力な機能が地雷のようにシレッと用意してあったりして、そういうところも魅力のひとつだと思います。
[Android]公式のOSS表示ライブラリ

はじめに
===
Androidアプリを作成していると様々なライブラリを使用する中で、
ライブラリを表示する必要があるかと思います。
今回はAndroid公式のライブラリを使用して表示する方法を記載していきます。

公式
[Including Open Source Notices](https://developers.google.com/android/guides/opensource)

環境
===
OS:Windows 10
Android Studio:3.5
言語:Kotlin

導入
===
1．build.gradle (Project)
-

```gradle
buildscript {
    
    repositories {
        // なければ追加
        google()
        mavenCentral()
    }

    dependencies {
        // 追加
        classpath 'com.google.android.gms:oss-licenses-plugin:0.10.6'
    }
}
```
2．build.gradle (app)
-

```gradle

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
// 追加
apply plugin: 'com.google.android.gms.oss-licenses-plugin'
```

```gradle
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.core:core-ktx:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'com.google.android.material:material:1.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    // 追加
    implementation 'com.google.android.gms:play-services-oss-licenses:17.0.0'
}
```

3．Build実行
-
`Project/app/build/generated/third_party_licenses/res/raw/`に以下の2ファイルが生成
・third_party_license_metadata
・third_party_licenses

4．ライセンス画面の呼び出し
-

```kotlin
import com.google.android.gms.oss.licenses.OssLicensesMenuActivity

val intent = Intent(this, OssLicensesMenuActivity::class.java)
startActivity(intent)
```
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487320/7aab435b-ba4b-99d1-0498-2850643d0af8.png width="300">


参考文献
===
Including Open Source Notices (公式)
https://developers.google.com/android/guides/opensource
swiftのextensionとは何か？ 超初心者のメモ

swiftでは、すでに存在している型にプロパティやメソッドやイニシャライザなどの型を構成する要素を追加出来ます。
こうした型の拡張のことをえくテンションと言います

要するにメタプログラミングだから出来るだけ使用しない方が良さそうですね。

## 定義方法
extensionは、extensionキーワードで宣言でき、{}内に型を構成する要素を定義します。

```swift

extension 型 {
  対象の型に追加したい要素
}
```

次の例では、標準ライブラリのString型に対するエクステンションを宣言しています。

## メソッドの追加
エクステンションでつい生かしたメソッドは、通常のメソッドと同様に使用出来ます。
次の例では、String型を拡張してprintSelf()というメソッドを追加しています。

```swift

extension String {
    func printSelf() {
        print(self)
    }
}

let str = "abc"
str.printSelf() => "abc"
```
コンピューテッドプロパティも追加可能です。

```swift

extension String {
    var enclosedString: String {
        return "[\(self)]"
    }
}
```

print("重要".enclosedString) // => [重要]


## 参考
Swift実践入門　石川洋資　西山勇世　著
【出社したくない】受信FAXをクラウドサービスに自動的にアップロードできるサービス【Box編】

# はじめに
新型コロナウィルスの蔓延と関連して、多くの企業がテレワーク・在宅勤務にシフトしている言われています。
その中で、判子の押印やFAXの確認のために出社するといった声も聞こえており、紙の存在が注目されています。

FAXでのやりとりについては、本当はFAXをやめてEDIや電子ファイルでやりとりできればいいですが、相手もあることなので明日からすぐにFAXやめますというのは難しいと思います。

そこで、受信FAXをクラウドサービスやメールに添付して送ってくれるサービスをピックアップしました。

# 選定のポイント
- 従来のFAX番号を変えないで運用することができるサービス。
- 新たに追加の機器が不要なサービス（複合機＋サービスだけで実現できる）
- 自分自身で簡単にできるもの（または、メーカーが設定してくれるもの）

# 今回のサービス

今回はBox編です。

# Box

Box社のBoxです。
https://www.box.com/ja-jp/home
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/532bf39e-59f1-7104-7e74-24052b2686b7.png)

Boxは容量無制限のコラボレーションプラットフォームです。
ただのクラウドストレージサービスではなく、BoxRelayというワークフローの機能やBoxCaptureといったモバイルデバイスで撮った写真をタグ付けして共有するといった機能も有しています。

Boxには特定のメールアドレスにきたファイルをフォルダにアップロードする機能があります。
最近の複合機の多くには指定したメールアドレスにFAXをPDF化して転送する機能があるのでそれを利用します。

# BoxにFAXを保存する

BoxへのFAX保存の流れとしては
**1.複合機がFaxを受信**
↓
**2.Faxを指定のメールアドレスに転送する(メールアドレスはBoxで生成したもの)**
↓
**3.メールアドレスに転送されたファイル（FAX）がBoxのフォルダに入る（おわり）**
となります。

このフローは以下の３つの設定だけで実現できます。

###**①Boxの対象フォルダにメールアップロードを許可する**
Webブラウザでの操作が必須です。クライアントツールの「Box Drive」からは設定できません。
1.Boxにログインします。

2.[すべてのファイル]ウィンドウで、フォルダを右クリックし、[設定]を選択します。

3.[アップロード]セクションの[メールアップロード]の隣にある[このフォルダへのメールによるアップロードを許可する]チェックボックスをオンにします。[メールアドレスのアップロード]に一意のメールアドレスが表示されます。このアドレスにファイルを送信すると、このフォルダにファイルをアップロードできます。このメールアドレスをクリップボードにコピーして、メールアドレス帳に連絡先として入力するか、または単に添付メールの[宛先]行に貼り付けます。

4.ウィンドウの右上で、[変更を保存]をクリックします。
[メールを使用したBoxへのアップロード]
(https://support.box.com/hc/ja/articles/360043697534-%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9FBox%E3%81%B8%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89)
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/f6a633e4-6ac8-4331-ece3-029f59402dbe.png)
※日本語設定にしていると説明文も日本語で表示されます。

###**②許可時に生成されるメールアドレスをメモする**
上のイメージだと[Karma_~@u.box.com]のアドレスです。

###**③複合機側にFAXの転送先として②のメールアドレスを指定する。**
複合機各種設定手順が異なるのでご利用機種マニュアルを参照してください。（すいません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/bed0eff7-b82c-7099-383d-2abfa2c8a2cc.png)
※イメージ画像です

多分、この作業で一番大変なのは複合機側の作業と言えるくらいBox側の設定は簡単です。

Boxのフォルダは予め共有フォルダ化しておくことで複数人で確認することができます。
本設定はBusiness以上のプランでできることを確認しています。

# 注意点
動作確認済みですがこの機能はFAX用に作られたわけではないため、将来的に動作が保証されない可能性があります。
自己責任での利用をお願いします。

# まとめ
設定も簡単＋そのままファイル共有ができるという点で非常に有用なソリューションです。
テレワークの為にクラウドストレージも導入するというケースも増えていると思いますので、このような機能にも注目してサービス選定をしてみるのも良いと思います。
【備忘録】各フェーズのクライテリア

##はじめに
ウォーターフォールで開発するときのクライテリア（判断基準）をべき論としてちゃんと整理しようと思い、書きました、
こういうことを定期的に書く時は、たいてい、何かあったときです(笑)

##1.ウォーターフォールの工程
システム開発にはいくつかの工程があります。

①要件定義→基本設計→詳細設計
②製造
③単体テスト→結合テスト→総合テスト（システムテスト）→運用テスト（受入テスト）
④リリース
⑤運用・保守

それではさっそく、各工程のクライテリアを見ていきましょう

##2.要件定義
:rolling_eyes:どうなれば要件定義が完了したといえるのか。
:poop:開発するシステムの対象機能、目的、範囲を決定すること。
ユーザの要求を整理し、整理した内容をもとに業務フローや業務シナリオを作成する。
整理した要求の解決策を提示する。
ユーザおよび関係各所と認識合わせをし、進めていく。

##3.基本設計
:rolling_eyes:どうなれば基本設計が完了したといえるのか。
:poop:要件定義で決まった要件を具体化し、ユーザと合意すること。
ユーザ側に向けて、業務フローや連携システム設計を作成し
プロジェクト要員向けにアーキテクチャ構成やシステム構成図を作成する。
ユーザから見える部分を決定する。

##4.詳細設計
:rolling_eyes:どうなれば詳細設計が完了したといえるのか。
:poop:基本設計フェーズで決定された事項をより詳細な単位（画面単位、帳票単位、プログラム単位など）に機能分割して設計し、ユーザと合意すること。
内部の動作を確認すること。

##5.製造
:rolling_eyes:どうなれば製造が完了したといえるのか。
:poop: プログラムを作成すること。

##6.単体テスト
:rolling_eyes:どうなれば単体テストが完了したといえるのか。
:poop: ロジック網羅、条件分岐、限界値・代表値などのテスト内容を実施して、そのすべての消化すること。

##7.結合テスト
:rolling_eyes:どうなれば結合テストが完了したといえるのか。
:poop: 各プログラムを統合し、画面遷移やデータの受け渡しなど、画面・プログラム・サブシステム間の連携が正しく行われているかどうかを確認できること。

##8.総合テスト（システムテスト）
:rolling_eyes:どうなれば総合テストが完了したといえるのか。
:poop: 実際にユーザーの環境と同じかそれと同等の環境において行うテスト。主に処理速度や障害発生時の処理、実際の他システムと連携して正しく動作すること。

##9.運用テスト（受入テスト）
:rolling_eyes:どうなれば運用テストが完了したといえるのか。
:poop: 総合テストをパスしたシステムを実際にユーザーに使用してもらい、要求機能を満たしているか、操作感はどうかなどを確認し、承認してもらうこと。

##10.リリース
:rolling_eyes:どうなればリリースが完了したといえるのか。
:poop:新システムを本番環境にリリースすること。

##11.運用・保守
継続して運用していこう。
SQLデータ型

##SQLのデータ型についてまとめ

###データ型とは
SQLで扱うデータには「データ型」というデータを表す種類あります。それぞれの種類にあったデータを格納する必要があります。
データ型には大きく4つのデータ型があり、さらにその中で細かい型に分かれています。

・文字列型
・数値型
・日付型
・倫理/ビット型


###文字列型
文字列を格納。
バイト・・・１バイト（英数字、記号など半角文字)、２バイト（ひらがな、カタカナ、漢字など全角文字）
固定長・・・決められたサイズのデータ領域。それ以上の文字列は格納できない。あまりは余白が入る。
可変長・・・文字列によってサイズが変わる。データの無駄がない。

| データ型 | 説明 |
|:-:|:-:|
|  CHAR | 固定長、バイト単位  |
|  VARCHAR | 可変長、バイト単位  |
|  NCHAR |  固定長、文字単位 |
|  NCHARCARYING | 可変長、文字単位  |

###数値型
数値を格納。
整数・・・小数点を含まない数値型
概数・・・符号を持つ整数または、固定小数点の１０進数のデータ型
真数・・・符号を持つ浮動小数点

| データ型| 説明 |
|:-:|:-:|
|  INT |  整数 |
| SMALLINT  | 整数、INTより範囲が小さい  |
| FLAOT  | 概数、標準  |
|  REAL |  概数、倍精度 |
|  DOUBLEPRECISION |概数、高精度   |
|  NUMBER,DECIMAL |  真数 |



###日付型
日付（年月日）、時刻（時分秒）、ゾーン格納。
ゾーンとは、日付のGMT（グリニッジ標準値：天体観測によって決められる）、UTC（世界標準時：現在世界の基準）

| データ型 | 説明 |
|:-:|:-:|
|  DATE | 日付  |
|  TIME | 時刻  |
|  TIMESTAMP | 日付、時刻  |
|  TIME WITH TIMEZONE | 時刻、ゾーン  |
|  TIMESTAMP WITH TIMEZONE |  日付、時刻、ゾーン |]


###倫理/ビット型
０と１で表現。ビット数は数値型で表現できるので、基本は、１桁で定義し、真（１）偽（０）で倫理値として扱う。

| データ型 | 説明 |
|:-:|:-:|
|  BIT |  固定長、ビット |
|  BITVARYING |  可変長、ビット |
[Rails]サーバ立ち上げ時のエラー

#サーバ立ち上げ時のエラー
##開発環境
ruby 2.5.0
rails 5.2.4
OS Catarina

##エラーコード 
久しぶりにアプリを作成し、rails sをしたら...

```terminal:terminal
$ rails s
[WARNING] Could not load command "rails/commands/server/server_command". Error: uninitialized constant URI::Generic.
```
色々試しても治りませんでした泣

##解決
自分の開発環境ではrubyのバージョンが2.5.0でした。
**そのバージョンを2.6.3に変更して、サーバをもう一度立ち上げたらうまく行きました。**

####Rubyのバージョン変更の仕方
以下をターミナルで打ち込んでいきます。
バージョン確認
```$ ruby -v```

指定のバージョンをインストール
```$ rbenv install 2.6.3```

バージョンを確認
```$ rbenv versions```

特定のディレクトリだけで利用するバージョンを変更
```$ rbenv local 2.6.3```

rehashを行う
```$ rbenv rehash```

###Gemfileの編集
Gemfileに書いてあるRubyのバージョンをインストール後のバージョンに変更してterminalにて
```$ bundle i```
を行う。

以上で行けました！


<img width="780" alt="スクリーンショット 2020-04-23 23.06.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244234/f3ff6900-f756-0cbc-93cf-bc4d1f69a134.png">
Float計算回路の(ry-その１.１(float値の16進数表記)

# 浮動小数点数の１６進数表記を得る（SW）

前回
[Float計算回路のVerilog-HDL実装について -その１](https://qiita.com/Soleiyu/items/5bbb991de443e61e318e)

4/26 シミュレーション結果を追記
5/17 負の数のバグを修正
# 今回の内容
32bit float (single)  が正しい値なのか
float値と16進表記値を相互変換するツールを作成する

cgo 使います
## 偉大な先駆者様（参考文献）
[浮動小数点数の内部表現を取得してみよう](https://qiita.com/nia_tn1012/items/d26f0fc993895a09b30b)

## コード全体
今回作成したコード

```check.go
package main

/*
union {float f; unsigned i;} uv;

int f2b(float inp) {
	uv.f = inp;
	return uv.i;
}

float b2f(unsigned inp) {
	uv.i = inp;
	return uv.f;
}
*/
import "C"
import (
	"fmt"
	"os"
	"strconv"
)

func main() {
	if os.Args[1] == "f" {
		fmt.Println("float -> hx")
		fv, _ := strconv.ParseFloat(os.Args[2], 32)
		f2h(float32(fv))
	} else if os.Args[1] == "h" {
		fmt.Println("hx -> float")
		hv, _ := strconv.ParseUint(os.Args[2], 16, 32)
		h2f(uint(hv))
	}
}

func h2f(inp uint) {
	float := float32(C.b2f(_Ctype_uint(inp)))
	fmt.Println(float)
}

func f2h(inp float32) {
	bits := int(C.f2b(_Ctype_float(inp)))

	fmt.Printf("Hex:%08X\n", bits)
	fmt.Printf("Exp:%02X\n", bits >> 23 & 0xFF)
	fmt.Printf("Fra:%X\n", bits & 0x7FFFFF)
}
```

共用体で値をコンバートしている

特殊なことはしていないのでCでも実装できると思う
（むしろGoだけで実装できるのか？）

## テスト
```
$ go run check.go f 7.25
float -> hx
Hex:40E80000
Exp:81
Fra:680000
```
Exp のバイアス値 127 は 7F であるため
+2 された 81 が指数部の値となっている

また、680000 = 110 1000 0 0 0 0 なので
7.25 = 111.01 = 680000 x 2^2 となっていることがわかる

```
$ go run check.go h 40E80000
hx -> float
7.25
```
正しく戻せていることがわかる

# シミュレーション結果の検証
### 7.25 + 11.625
```math
7.25 + 11.625 = 18.875 \\
-> 40E8\_0000 + 413A\_0000 = 4197\_0000\\ 
```
![Screenshot from 2020-04-26 20-05-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253609/5cf69188-6336-90d5-8c70-80932ea66640.png)

あってるっぽい

### 12.345 + 3.1415926

```math
12.345 + 3.1415926 = 15.4865926\\
-> 4145\_851F + 4049\_0FDA = 4177\_C915
```
![Screenshot from 2020-04-26 20-09-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253609/7dacb429-89ae-1b5b-358e-5109878ebb08.png)

あってるっぽい
FileMakerで工事契約情報を管理する(4)

#目的
いろいろ試行錯誤の末ある程度実用に使えるファイルができたので、ファイルメーカーで開発する際の自分なりのルールなどをまとめたいと思います。



#環境
windows10(windows7からのアップグレード)
FileMaker 16 pro

#サンプルファイル
https://www.dropbox.com/s/bzj0rd051v9bqmi/%E5%B7%A5%E4%BA%8B%E5%A5%91%E7%B4%84%E7%AE%A1%E7%90%86%E3%81%9D%E3%81%AE4.zip?dl=0
layout_constructionがユーザーが使用するファイルとなります。
アカウントは　admin pass:admin、user1 pass:user1 の２つを作成しています。



#0.前提条件
あくまで素人考えになりますので、参考程度に見てもらえればと思います。


##1.命名規則
###1-1.テーブルオカレンス

**TO_{A001}_{機能名}_{テーブル名TB}_{目的など}**

例えば下記の画像のようにアルファベットと数字で名前を付ける。テーブル名には**TB**とつけてどのテーブルのオカレンスかわかりやすくする。この方法は**fmstarting point**を参考にしています。フィールドを指定する際などに関連あるTO順に表示されるのでとても管理がしやすいです。

![キータ1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213168/e6b41af5-06be-5d26-d56d-584b1af4d655.png)

###1-2.フィールド
計算field：**c_{フィールド名}**
グローバルfield：**g_{フィールド名}**

データベースの管理画面で上記のフィールドは、下部に種類ごとにまとめておくようにしています。こうすることでexcelなどからインポートする際に対応させるフィールドが選択しやすくなります。計算フィールド、グローバルフィールドはインポートする必要がないため。

###1-3.スクリプト
**(A0001)フォルダ名_{機能名}**

フォルダ名はスクリプト整理するフォルダの名前。またスクリプトの中で実行するスクリプト（直接ボタンなどに割り当てないもの）には機能名の前にアンダーバーを付ける。
例(A0001)フォルダ名_\{\_機能名}
そうすることで、ボタンにスクリプトを割り当てる際に、アンダーバーがついているスクリプトは除外できるので管理しやすいと思います。


##2.グローバルフィールドを作成するテーブルの場所
###2-1.原則
ユーティリティーTBの中に作成する。
使用例：検索機能を作成する際の検索用のフィールドなど。

###2-2.例外
コンテキストに依存するもは必要となるTBに作成する。例えば、下記の画像のようにグローバルフィールドを用いてリレーションを作成してデータのフィルタリングをしたい場合はそのデータがあるTBの中に作成する（そうしないとリレーションが結べないため）。

![キータ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213168/a020f510-d5f7-eb55-e43a-c25bce852fec.png)


##3.グローバル変数は作成しない
###3-1.理由
グローバル変数は複数のスクリプト、レイアウトで使用しているとどこで使用されているのかが分からなくなることがある。それを解決するためにBaseElementsというプラグインが発売されているが個人又は中小企業では購入できないと考えるため。

###3-2.代替案
グローバル変数の変わりにグローバルフィールドを使用する。理由はテーブル定義を見ればグローバルフィールドの存在が一目瞭然であるし、~~削除使しようとすると影響のあるスクリプト、TOが警告されてど
こで使用されているかが分かる。どのレイアウトに設置されているかまでは不明だが、グローバル変数を使用するよりも保守しやすい。~~
2020/04/27　訂正
分離モデルで作成すると警告はされなかったので訂正します。あくまで同一ファイルにあるものだけ警告されるようです。

##4.ファイルの使い方
###4-1.初期設定
自社情報、個人情報、社員情報、顧客情報を登録。

###4-2.工事登録
工事名、金額、工期などを登録。
顧客情報に支払条件を設定していればコピーボタンがあるので転記できます（同じ顧客でも工事によっては条件が異なる場合があるので、顧客情報とは別に工事にも支払い条件を持たせています）。
入金、原価、完成日などを登録。
請求書タブでは、支払条件を設定していれば自動で条件にあった回収予定を登録できます。

###4-3.締処理
データを修正できないようにするために締処理ができます。
金額工期は受注計上月（西暦4桁月2桁）、それ以外は日付で締処理をしています。
また、締め処理後にその締め処理対象の日付などでレコード登録した場合は翌月の締め処理で締めがされるようにしています。
例：202004月の締処理を行ったあとに2020/04/30の入金があった場合、202005月の締処理を実行すると締めがされます。
さらに、工事自体の締処理は工事詳細レイアウトの工事締日タブで入力した日付で締処理されます。工事が完成して全額入金があったものを締処理対象としたいため、下記の画像のボタンで締処理すべき工事を検索できるようにしています。
![キータ4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213168/c299cfc9-f785-714f-e29f-90c211201d66.png)


###4-4.会計年度の工事台帳
自社情報で設定した会計年度に応じて、年度で表示すべき工事を表示できるようにしています。決算変更届などのため作成する工事経歴書に活用できると思います。
【今日のアブストラクト】Explaining and Harnessing Adversarial Examples【論文 DeepL 翻訳】

1 日 1 回 論文の Abstract を DeepL 翻訳の力を借りて読んでいきます.

この記事は自分用のメモみたいなものです.
ほぼ [DeepL](https://www.deepl.com/home) 翻訳でお送りします.
間違いがあれば指摘していだだけると嬉しいです.

翻訳元
[Explaining and Harnessing Adversarial Examples](https://arxiv.org/abs/1412.6572)

# Abstract

### 訳文

ニューラルネットワークを含むいくつかの機械学習モデルは, 常に敵対的な例を誤って分類する---データセットのサンプルに, 小さな, しかし意図的に最悪のケースの摂動を適用することによって形成された入力で, そのような摂動された入力の結果, モデルは高い信頼性で不正確な答えを出力する. この現象を説明するための初期の試みは, 非線形性とオーバーフィッティングに焦点を当てていた. 我々は, ニューラルネットワークが敵対的摂動に対して脆弱である主な原因は, その線形性にあると主張する. この説明は, それら: アーキテクチャとトレーニングセット間での一般化, について最も興味をそそられる事実の最初の説明を与えながら, 新しい定量的な結果によって支えられている. さらに, この見解は, 敵対的な例を生成するためのシンプルで高速な方法を提供する. このアプローチを用いて, MNIST データセット上の maxout ネットワークのテストセット誤差を削減する.


### 原文

Several machine learning models, including neural networks, consistently misclassify adversarial examples---inputs formed by applying small but intentionally worst-case perturbations to examples from the dataset, such that the perturbed input results in the model outputting an incorrect answer with high confidence. Early attempts at explaining this phenomenon focused on nonlinearity and overfitting. We argue instead that the primary cause of neural networks' vulnerability to adversarial perturbation is their linear nature. This explanation is supported by new quantitative results while giving the first explanation of the most intriguing fact about them: their generalization across architectures and training sets. Moreover, this view yields a simple and fast method of generating adversarial examples. Using this approach to provide examples for adversarial training, we reduce the test set error of a maxout network on the MNIST dataset.
Macの音声読み上げ機能を限界を超えて爆速にする方法(自己責任)

## 2020/10/21追記

OSのアップデートでこちらの編集方法では編集できなくなったため、以下のコマンドを使用して、plistファイルを編集するのが良いです。
[Mac　PlistBuddyコマンドを使ってplistファイルを自由に編集しよう - Qiita](https://qiita.com/keitean/items/6972b8f34636a88bae74)

# plistファイルの探索

関係してそうなファイルを調べる

```terminal
find ~/ | grep -F 'speech' | grep 'plist$'
```

com.apple.speech.voice.prefs.plistというファイルが見つかった。

plutilコマンドを使って中身を見る。

```terminal
plutil -p ~/Library/Preferences/com.apple.speech.voice.prefs.plist
```

該当するっぽいところが見つかった。

```terminal
  "VoiceRateDataArray" => [
    0 => [
      0 => 1886745202
      1 => 369275107
      2 => 360
    ]
    1 => [
      0 => 1886745202
      1 => 369275117
      2 => 360
    ]
    2 => [
      0 => 1886745202
      1 => 184868045
      2 => 181
    ]
    3 => [
      0 => 1886745202
      1 => 369338093
      2 => 360
    ]
    4 => [
      0 => 1836346163
      1 => 2
      2 => 150
    ]
  ]
```

ここを書き換えれば変更できるはず。
下記のコマンドを入力。

```terminal
plutil -convert json ~/Library/Preferences/com.apple.speech.voice.prefs.plist -o - | python -c 'import json, sys;d=json.load(sys.stdin);[x.__setitem__(-1, 720) for x in d["VoiceRateDataArray"]];json.dump(d, sys.stdout)' | plutil -convert binary1 -o ~/Library/Preferences/com.apple.speech.voice.prefs.plist -

killall com.apple.speech.speechsynthesisd
killall SpeechSynthesisServer
```

もう一度checkしてみると、変わっていますね。

```terminal
  "VoiceRateDataArray" => [
    0 => [
      0 => 1886745202
      1 => 369275107
      2 => 720
    ]
    1 => [
      0 => 1886745202
      1 => 369275117
      2 => 720
    ]
    2 => [
      0 => 1886745202
      1 => 184868045
      2 => 720
    ]
    3 => [
      0 => 1886745202
      1 => 369338093
      2 => 720
    ]
    4 => [
      0 => 1836346163
      1 => 2
      2 => 720
    ]
  ]
```

音声も早くなっています。
設定ファイルを直接いじるので、やる場合は自己責任でどうぞ。

##参考
macos - Speed Up Rate of Text To Speech via Terminal - Super User
https://superuser.com/questions/1051883/speed-up-rate-of-text-to-speech-via-terminal
rails+cloudinaryでOGP画像作成

# この記事の目的

下記の実装のための知見をまとめてみた

* OGP画像に可変のテキストを入れたい
* dynamic URLを使い、加工したい
* ただし、他のユーザーがURLをいじって画像を大量に作成できないように制限をかけたい
* transformationをサービスドメインから出ないとできないようにしたい
* 閲覧には逆に制限をかけたくない（少なくともOGPを取得するであろうtwitterからは見れるように）

# cloudinaryの用語解説

## dynamic URLとは？

URLを変更することで画像を加工できる機能。今回はogpに記事のタイトルを入れて動的にしたいんだけどこのdynamicurlでテキストをoverlayでいれる。

## signed delivery urls

下記のsigneddeliveryurlを使うことでtagで作成しないと画像を生成できないようにする。これで他人に勝手に大量生産される心配がなくなる。

「Signed delivery URLs」
https://cloudinary.com/documentation/control_access_to_media#signed_delivery_urls

# railsでOGP生成の全体仕様

全体の流れとしては下記

* cloudinary_gemの導入
* cloudinaryのdashboardからcloudinary.ymlを設置
* metatagsの導入
* ogptagにcl_image_pathでurlを生成し、いれる

# gemの導入

rails導入ドキュメント
https://cloudinary.com//documentation/rails_integration

```
gem 'cloudinary'
```

# cloudinaly初期設定

## cloudinaryのdashboardからcloudinary.ymlを設置

![スクリーンショット 2020-04-23 12.53.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193389/cdd35504-3452-3f5b-ed3e-efe12ba37fea.png)

ここのymlを落としてconfigディレクトリ内に設置

## cloudinary内の設定

* Strict transformationsをenabledに
  * Strict transformationsは許可された変換のみできる。ユーザーがurlを変更したら自由に画像変換できるだと変な画像を意図的に作られたり大量に画像を生成されてしまう恐れがるため、それを避けるための機能
  * https://cloudinary.com/documentation/control_access_to_media#strict_transformations
* Restricted media typesにfetchedurlなど対象を

# carrierwaveをいれるか

「CarrierWave integration」
https://cloudinary.com/documentation/rails_carrierwave

model経由でuploadしたい場合はcarrierwaveでやると簡単。基本、form_withなどでuploadする場合はこのパターンかなと。今回OGPの生成はすでにuploadずみの画像を加工するのでuploadではない。よって今回はcarrierwave経由ではない。

# OGP変換の場合はuploadじゃなくてimageの変換になる

rubyでcloudinaryのurlを生成する場合

* imgタグごと発行するなら→cl_image_tag
* urlのみなら→cl_image_path

https://cloudinary.com/documentation/rails_image_manipulation#direct_url_building

## 画像pathの設定

```ruby
<% set_meta_tags title: "",
description: "",
image: cl_image_path("question_ogp.png",
  :transformation=>[
    {:width=>500, :crop=>"scale"},
    {:width=>470, :overlay=>{:font_family=>"Arial", :font_size=>25, :text=>""}, :crop=>"fit"}
  ],
  :sign_url=>true
)
%>
```

* cl_image_pathでurlのみ生成
* 外側の画像自体の大きさを設定し、内側を470で設定し、その中で文字をcropで折り返されるように設定している

# 参考資料

gem
https://rubygems.org/gems/cloudinary

cloudinary自身が公式のgemを出してくれている

document
https://cloudinary.com//documentation/rails_integration

「Cloudinary + Rails 画像アップロード」
https://qiita.com/ttexan/items/a1004121e806c477d030

「Rails + Cloudinaryで画像を最適化しよう！」
https://blog.favy.co.jp/8554/
MacOS Mojave 10.14.6でIntel C/C++コンパイラを使ったときにCannot open include file: 'math.h': No such file or directoryと言われる現象について

#はじめに

こんにちは。

Intelコンパイラは学生に対して無料で配布されているので筆者はよくLinuxで利用していました。

この度MacにIntelコンパイラを入れたのですが、標準ヘッダファイルのincludeで少しハマったのでメモ。

#環境

- Macbook Pro (13-inch, 2019)
- MacOS Mojave 10.14.6
- xcode-select Ver. 2354
- icc version 19.1.1.216

#問題点

いつものように[Intelのホームページ](https://software.intel.com/en-us/articles/qualify-for-free-software#student)を訪れ、Cコンパイラをインストール完了[^1]。

    $ icc -v
    icc version 19.1.1.216 (gcc version 4.9.0 compatibility)

ところが、いざコンパイルしようとしたらmath.hがありませんと怒られてしまいました。

####Mojaveでは/usr/includeがデフォルトで存在しない

どうやらXcode10から/usr/includeを作成しないようになっているようで、コンパイラがヘッダファイルを見つけられなかったようです。

というわけで以下を実行。

    $ sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -tgt "/Volumes/Macintosh HD"

macOS_SDK_headers_for_macOS_10.14.pkg は/usr/includeに標準のヘッダーファイルのコピーを作ってくれます。

というわけで無事コンパイルが通るようになりましたとさ。めでたしめでたし。



#参照

https://qiita.com/yoya/items/630c991a98e4554e6e87


[^1]: 大学のメールアドレスがあれば誰でも無料でインストールすることができます。ありがてぇ。。。
PyCaret を使ってみた

## 1. 環境とversion

- PyCaret 1.0.0
- Python 3.7.6
- Jupyter lab
- OSX Catalina 10.15.3

## 2. インストール
```zsh
pip install pycaret
```
Jupyter labからの場合

```
!pip install pycaret
```

## 3. 起こり得るエラー
scikit-learnのバージョンが0.22ではないとエラーが出るので気をつけてください

## 4. データ
今回は既存の糖尿病のデータを使います。PyCaretのget_dataから直接データフレームで取得可能。

```python
from pycaret.datasets import get_data
df = get_data("diabetes")
```

## 5. 前処理
回帰問題の場合は

```python
from pycaret.regression import *
```

分類問題の場合は

```python
from pycaret.classification import *
```

setup()はカテゴリーデータのエンコーディング，欠損値処理，データの分割(train_test_split)を行ってくれます。target= でターゲットを指定する。

```python
experiment = setup(df, target="Class variable")
```
## 6. モデル比較

以下を行うだけでモデルの比較が可能です。便利ですねぇ。
k-foldはデフォルトで10なっています。fold数などは指定可能です。

```python

compare_models()
```

一番いい結果を黄色でハイライトしてくれます。

## 7. モデリング
これも簡単で以下の一行でモデリングできます。

```python
model = create_model("ada")
```
classificationの略は以下です。

| Estimator | Abbrev. String |
|:--|:--|
| Logistic Regression | ‘lr’ |
| K Nearest Neighbour | ‘knn’ |
| Naives Bayes | ‘nb’ |
| Decision Tree | ‘dt’ |
| SVM (Linear) | ‘svm’ |
| SVM (RBF) | ‘rbfsvm’ |
| Gaussian Process | ‘gpc’ |
| Multi Level Perceptron | ‘mlp’ |
| Ridge Classifier | ‘ridge’ |
| Random Forest | ‘rf’ |
| Quadratic Discriminant Analysis | ‘qda’ |
| AdaBoost | ‘ada’ |
| Gradient Boosting Classifier | ‘gbc’ |
| Linear Discriminant Analysis | ‘lda’ |
| Extra Trees Classifier | ‘et’ |
| Extreme Gradient Boosting | ‘xgboost’ |
| Light Gradient Boosting | ‘lightgbm’ |
| Cat Boost Classifier | ‘catboost’ |

今回はAda Boost Classifierを選択しました。
Regressionの略は以下です。

| Estimator | Abbrev. String |
|:--|:--|
|Linear Regression|	‘lr’|
|Lasso Regression	|‘lasso’|
|Ridge Regression|	‘ridge’|
|Elastic Net|	‘en’|
|Least Angle Regression|	‘lar’|
|Lasso Least Angle Regression	|‘llar’|
|Orthogonal Matching Pursuit	|‘omp’|
|Bayesian Ridge	|‘br’|
Automatic Relevance Determination	|‘ard’|
Passive Aggressive Regressor	|‘par’|
Random Sample Consensus	|‘ransac’|
TheilSen Regressor	|‘tr’|
Huber Regressor	|‘huber’|
Kernel Ridge	|‘kr’|
Support Vector Machine	|‘svm’|
K Neighbors Regressor	|‘knn’|
Decision Tree	|‘dt’|
Random Forest	|‘rf’|
Extra Trees Regressor	|‘et’|
AdaBoost Regressor	|‘ada’|
Gradient Boosting Regressor	|‘gbr’|
Multi Level Perceptron	|‘mlp’|
Extreme Gradient Boosting	|‘xgboost’|
Light Gradient Boosting	|‘lightgbm’|
CatBoost Regressor	|‘catboost’|


## 8. チューニング

チューニングも一行です！楽すぎます。

```python
tuned_model = tune_model("ada")
```

パラメーターも取得できます。

```python
tuned_model.get_params
```

## 8. モデルの評価と可視化と解釈
上から順に評価と可視化と解釈ができます。plotとinterpreにはplot="boundary"などを入れることによって別のグラフが所得できます。

```python
evaluate_model(tuned_model)
plot_model(tuned_model)
interpret_model(tuned_model)
```

## 9. 予測

```python
model_pred = predict_model(tuned_model)
```

splitしたデータに対して予測値を返してくれます。

```python
predictions = predict_model(tuned_model,data=df)
```

data=で新しいデータをしてして予測を行える。

##参考サイト
[最速でPyCaretを使ってみた](https://qiita.com/s_fukuzawa/items/5dd40a008dac76595eea　"Qiita")
自分のポートフォリオページを作成した件

自分のポートフォリオを作成してみました。

まだ全然イケてないけど、内容としては公開できるレベルになったので公開。

<a href="https://jaappao.github.io/web_portfolio/">[ここ]</a>からアクセスできます。

ちょっとだけ工夫した点を以下。

# 構成
今回は静的サイト。使用したフレームワークは`Bootstrap`。

**サイト自体の枠組み・レスポンシブデザイン・サイト内を飾る部品の多くはBootstrapを使用**して、**背景色・フォントとかサイトのグリッドとかに関係ない部分を`CSS`に**書きました。大きなデザイン崩れはないと思うが、小さな崩れはまた修正します。

フロントエンドの練習も兼ねているので、HTMLを割と真面目に書きました。

ちなみに、HTMLの`Sanitize` ( `Normalize` )は`Bootstrap`が担ってくれているので、やっぱり何かしらのフレームワークは入れた方が無難。

# Bootstrap臭を抜く
Bootstrapは標準の物をそのまま使うと、「ああ、Bootstrap使ったのね」っていう見栄えになっちゃいます。

そこで、**Bootstrapっぽさをなくすために、カスタマイズすることができます**。

一番地道な手法は**CSSでゴリゴリにいじる**。ただ、これは一つの変更がどこまで影響するのかわかりません。僕はCardの四隅をもうちょっと丸くしようとして手動でいじってみたところ、Cardの上部の写真が飛び出ました。これは写真も四隅を丸めて一件落着で良かったのですが、こういうことが起こりかねないのでCSSでいじるのはちゃんと学んでからにした方がいいと判断しました。

そこで、**Bootstrapをカスタマイズしてテンプレートの形で提供している**サービスがあります。
私は <a href="https://startbootstrap.com/">startbootstrap.com</a> から `SB Admin 2` というテンプレートをダウンロードして使用しました。

これは `Bootstrap　カスタマイズ` ってぐぐるとあっという間に詳しいやり方が出てくると思うので、申し訳ないですけど説明割愛。

かなり簡単にカスタマイズできるのでお試しください！


# Bootstrapの `Carousel` にYoutubeの動画を埋め込む
`Carousel` とは
![A9408030-B48D-45B5-8006-39F580FAD508.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529674/a27aba65-0017-99a9-f95b-d9e07b2a908f.jpeg)
画像がスルスルと左右に移動するようにJSが組み込まれた部品ですが、これにも<b>Youtubeの埋め込みを入れる</b>ことができます。(Bootstrap 公式Document `Carousel` https://getbootstrap.com/docs/4.4/components/carousel/)

やり方はimgの部分を埋め込みリンクに変更すればうまくいくはずです。

```HTML

<div class="carousel-item">
    <img class="d-block w-100" src="XXXX.jpg" alt="Third slide">
</div>
<div class="carousel-item">
    {{ ここに<iflame></iflame>のYoutubeの共有埋め込みリンクを放り込む }}
</div>

```

ちなみに動画のサイズを変更するには<iflame>のタグ内にwidthとheightの数値をいじる部分があるので、それで変更してください。


# フォントの変更
工夫でもなんでもないですが。

`Google Fonts`をCDNで利用するのはもはや定石なのかもしれませんが、使用していることは申し上げておきます。

# 挿絵を入れる
無機質なページになることは想像がついたので、`Adobe Fresco`(iPad お絵かきソフト)で謎の桜(?)の盆栽を書きました。ほぼ絵を描くのは初心者ですので、これだけ映えるように見えるのは、相当ソフトが優秀ということでしょう。

ちょっと華やかになったかな。意外と上手に描けた気がします。線がところどころ迷子にっているのはご愛敬。

ちなみに、index.htmlの最初のページのJappao's Portfolioは`GIMP`で画像編集して作りました。実はAdobe系よりGIMPの方が使用歴が長く操作に慣れているのでGIMPでさくっと作りました。（フリーソフト万歳）
本当はちゃんと文字も盆栽画像も元ソースのまま貼り付けるべきなのですが、ちゃんとやる方法が思い浮かばなかったので。これは改良点として次の課題にします。

# おしまい
以上。

もうちょっと頑張れよって言われると思いますが、今回はここまでで。

このポートフォリオに乗せるためにこれからも開発頑張れそうです。

まだネタがあるので随時ポートフォリオ更新していきます。ぜひご覧になってください。
【Ruby】Ruby入門

#【Ruby】Ruby入門

##実行
```ruby:Hello.rb
print "Hello"
print "Hello!"
puts "Hello"
p "Hello!"
```
```:出力
HelloHello!Hello
"Hello!"
````

##条件分岐
```ruby:Humidity.rb
hum = 70

if hum >= 60
    p hum.to_s + "%"
    p "ジメジメです"
elsif hum <= 60 && hum >= 40
    p hum
    p "快適です"
else hum <= 40
    p hum
    p "カラカラです" 
end
```
```:出力
"70%"
"ジメジメです"
````



##環境構築
windowsで[VScode](https://code.visualstudio.com/download)と[Ruby](https://rubyinstaller.org/downloads/)をインストールしました。

##参考文献
この記事は以下の情報を参考にして執筆しました。
[キノコード / プログラミング学習動画のYouTuber](https://www.youtube.com/c/kinocode)
Node.js: 子プロセスの例外を親プロセスに送る方法

Node.jsの`child_process`モジュールの`fork`で起動した子プロセスにて、例外が発生したとき、その例外を親プロセスに送る方法です。

```js
const { fork } = require('child_process')

if (process.send) {

  // 子プロセスの処理
  process.on('uncaughtException', error => {
    process.send(error) // 例外はメッセージとして送る
    process.exit(1)
  })
  throw new Error('Something wrong')

} else {

  // 親プロセスの処理
  const childProcess = fork(__filename, [], {
    serialization: 'advanced' // このオプションが必須
  })

  // 例外はメッセージとして受け取る
  childProcess.on('message', message => {
    if (message instanceof Error) {
      console.log('Child process error:')
      console.error(message)
    }
  })

}
```
[Unity初級]マウスドラッグの距離を求める

#概要
マウスボタンを押した地点とマウスボタンを離した地点の距離からドラッグの距離を求める
#本文
```cs
    Vector2 mouseStart;
    Vector2 mouseStop;
    float length;

    if(Input.GetMouseButtonDown(0)){
        mouseStart = Input.mousePosition;
    } else if(Input.GetMouseButtonUp(0)){
        mouseStop = Input.mousePosition;
        length = (mouseStop - mouseStart).magnitude;
    }
```
【PHP】PHP入門

# 【PHP】PHP入門


## 実行
```php:Hello.php
<?php echo "Good morning"."\n";?>
<?php echo "Good evening"."\n";?>
<?php echo "Good Hello"."\n";?>
```
```:出力
Good morning
Good evening
Good Hello  
````



## 配列
```php:Array.php
<?php
    $a = Array(8,12,21);

    echo ("朝食は".$a[0])."時です"."\n";
    echo ("昼食は".$a[1])."時です"."\n";
    echo ("夕飯は".$a[2])."時です"."\n";
```
```:出力
朝食は8時です
昼食は12時です
夕飯は21時です
````



## 条件分岐
```php:Humidification.php
<?php
    $hum = 30;

    if ($hum >= 60) {
        echo "湿度が".$hum."％です"."\n";
        echo "ジメジメしてます"."\n";
    }else if ($hum <= 60 && $hum >=40) {
        echo "湿度が".$hum."％です"."\n";
        echo "快適です"."\n";
    }else if ($hum <= 40) {
        echo "湿度が".$hum."％です"."\n";
        echo "カラカラしてます"."\n";
    }
?>
```
```:出力
湿度が30％です
カラカラしてます
````


## 環境構築
・windowsで[PHP](https://www.php.net/downloads.php)をインストール

## 参考文献
・この記事は以下の情報を参考にして執筆しました。
[キノコード / プログラミング学習動画のYouTuber](https://www.youtube.com/c/kinocode)

## 環境構築の追加(2022/08/09)
■下記URLより開発環境(XAMPP)をインストール
・[XAMPPバージョン：8.1.6](https://www.apachefriends.org/jp/download.html)

■【環境準備】XAMPPのコントロールパネルから、Webサーバー(Apache)を起動
・[JavaDrive - XAMPPコントロールパネルを起動する](https://www.javadrive.jp/xampp/install/index3.html)

■PHPを記述するための統合開発環境
・[VScode](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)

■プラグイン
・Japanese Language Pack for VS Code
・PHP Intelephense

■計算式　(print関数で出力する場合です
```php:calculation.php
<?php
$a = 5;
$b = 3;
$c = 2;
$d = 8;

$x = 10;
$y = 20;
$z = 7;

print($x + $y)."\n";
print($y - $z)."\n";
print($a * $b)."\n";
print($c % $a);"\n";
print($d / $b);"\n";
?>
```
```:出力
30
13
15
2
2.6666666666667
````
Hyper-V上に構築したpfSenseでCARPを利用する際、ネットワークアダプターに設定すること

#事象
Hyper-V上にpfSense2台を構築し、冗長化のためにCARPを設定したがVIPに対して通信ができない

#原因
Hyper-VではMACアドレスのスプーフィングがデフォルトでoffとなっているため

#対処方法
1.Hyper-Vマネージャーより仮想マシンの設定を開く

2.ネットワークアダプターの高度な機能の中にある「MACアドレスのスプーフィングを有効にする」をチェック


![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624314/0259e795-069f-caae-c9e0-535993838727.png)


これで冗長化OK
CARPに限らずVRRPだとか仮想MACアドレスを使うような仕組みに対しては上記設定が必要と思われる
セキュリティの兼ね合いもあるので状況に応じて設定を
【Kotlin】Kotlin入門

#【Kotlin】Kotlin入門

##実行
```kotlin:Hello.kt
fun main(){
    println("Hello")
}
```
```:出力
Hello
````



##配列
```kotlin:Array.kt
fun main(){
    val arr = arrayListOf("sato","suzuki","takahashi");
    println("朝食担当は" +arr[0] + "です")
    println("昼食担当は" +arr[1] + "です")
    println("夕飯担当は" +arr[2] + "です")
}
```
```:出力
朝食担当はsatoです
昼食担当はsuzukiです
夕飯担当はtakahashiです
````



##条件分岐
```kotlin:Humidity.kt
fun main(){
      val hum = 50;

      if (hum >= 60){
        println("湿度が" + hum + "％です");
        println("ジメジメしてます");
      }else if((hum <= 60) && (hum >= 40)){
        println("湿度が" + hum + "％です");
        println("快適です");
      }else if(hum <= 40) {
        println("湿度が" + hum + "％です");
        println("カラカラしてます");
      }
}
```
```:出力
湿度が50％です
快適です
````

##環境構築
windowsで[JDK](https://www.oracle.com/java/technologies/javase-downloads.html)とエディターの[VSCode](https://code.visualstudio.com/download)とkotlinの[コンパイラ](https://github.com/JetBrains/kotlin/releases/tag/v1.3.72)をインストールしました。

##参考文献
この記事は以下の情報を参考にして執筆しました。
[キノコード / プログラミング学習動画のYouTuber](https://www.youtube.com/c/kinocode)
【JavaScript】JavaScript入門


##【JavaScript】JavaScript入門

##実行
```javascript:Hello.js
console.log("Good afternoon");

console.log("Good evening");

console.log("Hello");
```
```:出力
Good afternoon
Good evening
Hello
```


##条件分岐
```javascript:Humidity.js
var hum = 50;

if(hum >= 40 && hum < 60){
    console.log("快適です");
}else if (hum < 40){
    console.log("加湿して下さい");
}else {
    console.log("喚起して下さい");
}
```
```:出力
快適です
```



##環境構築
windows、コードエディア[VSCode](https://code.visualstudio.com/download)、サーバ側で動くJavaScript環境[Node.js](https://nodejs.org/ja/)をインストール

##参考文献
この記事は以下の情報を参考にして執筆しました。
[キノコード / プログラミング学習動画のYouTuber](https://www.youtube.com/c/kinocode)