OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity】キャラクタにアニメーション（ゾンビ）

環境メモ
⭐️Mac OS Mojave バージョン10.14
⭐️Xcode version 10.0(10A255)
⭐️Unity 2018.2.13f1
⭐️iPhone7 IOS11.4.1

実際に動かした動画はこちら↓↓
https://twitter.com/nonnonkapibara/status/1054509185478537218


<img width="375" alt="IMG_0046.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/a7b777b7-b578-f3fa-1889-b41f1428dc42.png">


<img width="375" alt="IMG_0043.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/672f9c4a-d0ec-ba22-f9f4-2b4a1277cd46.png">
DjangoのCreateViewでユーザーを外部キーを挿入する方法


## やりたいこと
Djangoで以下のようなmodelとformがあってCreateViewを使いたい。
author_idはuserテーブルのidと外部キーになっているので作成時に現在ログイン中のuser_idを作成時に挿入したい。

### models.py
```py
class Post(models.Model):
    postid = models.AutoField(primary_key=True)
    author = models.ForeignKey(
        'accounts.User', on_delete=models.SET_NULL, null=True)
    picture = models.ImageField(
        upload_to="image/posts/", blank=True, null=True)
    text = models.TextField(blank=True)

```

### forms.py
```py

from .models import Post


class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ("picture", "text")
```

## 解決策
stackoverflowに良さそうな解決方法があった。
formのバリデーション実行時に現在ログイン中のidを差し込んで返す。

```py
class New(generic.edit.CreateView):
    template_name = 'post/new.html'
    form_class = PostForm

    def form_valid(self, form):
        form.instance.author_id = self.request.user.id
        return super(New, self).form_valid(form)


```


## 参考
https://stackoverflow.com/questions/10382838/how-to-set-foreignkey-in-createviewa
Workflowを使ってiPadで再生中の曲情報をTwitterに投稿してみた

普段PCで再生している音楽をNowplayingアプリを使ってTwitterにちょくちょく投稿しているので外に出ているときに音楽再生プレイヤーとなっているiPadでもたまにしたくなる時がある。
ただ、AppStoreに気に入るアプリがなかったのでWorkflowを使って2ステップで投稿できるようにしてみた。

# 使用するアプリ
[WorkFlow](https://itunes.apple.com/jp/app/workflow-powerful-automation/id915249334?mt=8&ign-mpt=uo%3D4)

[Twitter](https://itunes.apple.com/jp/app/twitter/id333903271?mt=8)

#動作確認環境
iPad mini4

# 設定内容
流れは以下みたいな感じで考えてみた

現在再生中の曲情報を取得 -> もし最大数文字数を超えそうだったらアーティストを削ってアルバム名にする -> アルバムアートワークを取得 -> Twitterに投稿する

<img width="768" alt="IMG_0467.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/270528/71f00130-37c2-5763-e5d0-e1e11ba87c84.png">

<img width="768" alt="IMG_0468.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/270528/68db8d81-393b-8dba-fbd1-1674a6939d89.png">

<img width="768" alt="IMG_0469.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/270528/43dff399-7aec-8e1c-d147-f7c352c37224.png">

# 作ってみての感想

### 満足した点
文字を打つ必要がなくなったので気軽に投稿ができるようになった

### 不満点
投稿する際にツイートボタンを押さないといけないので1ステップにできなかったこと
削除のとこで時間がかかってしまう

どうやら「現在の曲を取得」の部分が、曲が変更されてからある程度時間が経たないと次の曲に変わらないっぽくて無理くり起動時に削除処理を入れたのが一番の不満点

ただ、Workflowが林檎に買収されたこともあって純正アプリの動作が充実してるのがすごいいい印象
また時間があったらいろいろ作ってみたいですね
指定文字を前後に含まないKEYを検索する

# パターン
```Regex-Pattern
(?<![指定文字])KEY(?![指定文字])
```
## 何ができるか
タイトルのとおり、**指定文字**を前後に**含まないKEY**を検索します。
**KEY**だけヒットします。置換には適さないかもしれません。

### サンプル
```
(?<![\w"'])[\d\.]+(?![\w"'])
```
前後に``[\w"']``がない``[\d\.]+``を検索します。[^1]
#### 結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/306574/f50781d9-7419-0e09-4f02-7e607bbbd219.png)
超テキトーなテストですが上手くいきました。[^2]

### 経緯
業務でホスト系システムを触っていたのですが、固定長ファイルやCSVの走査をする必要がありました。
文字列数値ではなく、数値項目が欲しかったため作りました。
>*要は``"123"``ではなく``123``が欲しいということ。*

もっと簡単なパターンがあると思いますが、これはこれで汎用性が高そうなのでご活用ください。

## え？逆パターンが欲しい？
おまかせあれ、否定を肯定に変えるだけで・・・
### 逆パターン
```
(?<=[\w"'])[\d\.]+(?=[\w"'])
```
#### 結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/306574/7a13603b-ff65-fa17-6af1-876944db7777.png)
**なんか思っていたんと違う！！！！**

それもそのはず``\w``は**文字、数値、アンダースコア**のいずれかにヒットするからです。[^3]

### 正しい逆パターン
```
(?<=["'])[\d\.]+(?=["'])
```
#### 結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/306574/56b2a6b1-fd6f-6492-eac6-73261cdfa127.png)
これで無事に文字列数値が取得できました。
めでたしめでたし。

---
##最後に
今回しれっと書いていた``(?<!pattern)``を始めとした「先読み・後読み」は正規表現を上手く使うためにかな～り重要です。
正直、完全には理解できていないので、自分の知識が固まったら記事にしようと思います。

##参考
[良い記事を書くためのガイドライン](https://help.qiita.com/ja/articles/qiita-article-guideline "良い記事を書くためのガイドライン")
[正規表現メモ](http://www.kt.rim.or.jp/~kbk/regex/regex.html "正規表現メモ")
[正規表現の先読み・後読みを極める！](https://abicky.net/2010/05/30/135112/ "正規表現の先読み・後読みを極める！")

[^1]: ``\.``で小数点も含めていますが、リージョンによって小数点記号は変わるので注意。あれ、そのリージョンのcsvはどう出るんだ？
[^2]: 水色背景色のブロックがヒットした文字列です
[^3]: 便利だからとよくわからずに使うと痛い目を見る
なぜかRustで言語処理100本ノック ～第3章 前編～

Rustで[言語処理100本ノック](http://www.cl.ecei.tohoku.ac.jp/nlp100/)しています。
# 第3章: 正規表現
この章ではgzipの読み込みとしてflate2を、jsonの読み込みとしてserde_jsonを、正規表現のライブラリとしてregexを使用しています。
[後編はこちら](https://qiita.com/kbone/items/6c61df1c1ec5caab0982)

## 20. JSONデータの読み込み
> Wikipedia記事のJSONファイルを読み込み，「イギリス」に関する記事本文を表示せよ．問題21-29では，ここで抽出した記事本文に対して実行せよ．

取得したファイルを見てみると`{"text": "本文","title": "タイトル"}`が列挙されているという形だったので、この形に限定して考えました。

```rust
#[derive(Deserialize)]
pub struct Article {
    pub text: String,
    pub title: String,
}

pub fn json_read_about(path: &Path, about: &str) -> Option<Article> {
    File::open(path).ok()
        .and_then(|file| Some(GzDecoder::new(file)))
        .and_then(|gz| Deserializer::from_reader(gz).into_iter::<Article>()
                        .filter(|v| if let Ok(v) = v { v.title == about } else { false })
                        .map(|v| v.unwrap())
                        .next())
}
```

serdeの扱いって(慣れの問題かもしれないですが)少し面倒ですね...

## 21. カテゴリ名を含む行を抽出
> 記事中でカテゴリ名を宣言している行を抽出せよ．

Wikipediaの[「ページの編集」](https://ja.wikipedia.org/wiki/Help:%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AE%E7%B7%A8%E9%9B%86)によると、カテゴリ名というのは`[[Category:hoge]]`という形のものだそうです。これを正規表現で表すと、`\[\[Category.*\]\]`となります。

```rust
pub fn category_line(article: &Article) -> Vec<&str> {
    let regex = Regex::new(r"\[\[Category.*\]\]").unwrap();
    article.text.lines().filter(|l| regex.is_match(l)).collect()
}
```

raw string便利ですね。

## 22. カテゴリ名の抽出
> 記事のカテゴリ名を（行単位ではなく名前で）抽出せよ．

正規表現無しでも上のを用いればいけるような気がしましたが、せっかくなので正規表現をちゃんと使ってみました。
正規表現のうち前回との差分だけを取り出すと、`([^|\n]*)\|?.*`で、簡単に説明すると、
前半の`([^|\n]*)`の部分は、`|`(縦棒)と改行を除いた0文字以上の文字列にマッチしてキャプチャということで、ここがカテゴリ名本体となり、
後半の`\|?.*`の部分は、`|`(縦棒)はない場合もあるのでそのための`?`と、有った場合にはその後に任意の文字列が続くので、この形にしました。

```rust
pub fn category_name(article: &Article) -> Vec<&str> {
    let regex = Regex::new(r"\[\[Category:([^|\n]*)\|?.*\]\]").unwrap();
    regex.captures_iter(&article.text).map(|captures| captures.get(1).unwrap().as_str()).collect()
}

```

## 23. セクション構造
> 記事中に含まれるセクション名とそのレベル（例えば"== セクション名 =="なら1）を表示せよ．

[「ページの編集」](https://ja.wikipedia.org/wiki/Help:%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AE%E7%B7%A8%E9%9B%86)によるとセクションは行の先頭において`=`で囲まれた部分ということだったので、`^(=+)([^=]+)=+`という部分が決まりました。これでほぼ完成なのですが、空白類は自由に挿入可能ということでその部分のマッチを加えました。

```rust
pub fn sections(article: &Article) -> Vec<(usize, &str)> {
    let regex = Regex::new(r"^\s*(=+)\s*([^=]+)\s*=+").unwrap();
    article.text.lines()
        .filter(|line| regex.is_match(line))
        .map(|line| regex.captures(line).unwrap())
        .map(|captures| (captures.get(1).unwrap().as_str().len() - 1, captures.get(2).unwrap().as_str()))
        .collect()
}
```

## 24. ファイル参照の抽出
> 記事から参照されているメディアファイルをすべて抜き出せ．

ほとんどセクション名の抽出と同じになりました。

```rust
pub fn files(article: &Article) -> Vec<&str> {
    let regex = Regex::new(r"\[\[(?:File|ファイル):([^|]*).*\]\]").unwrap();
    regex.captures_iter(&article.text).map(|captures| captures.get(1).unwrap().as_str()).collect()
}
```
【G's Lab6】jQueryによる神経衰弱の基礎

#はじめに
G's Academyの世界を変えるGEEKを目指すプログラミングスクールで、
jQueryの補講で簡易的な神経衰弱を作ることになったのですが
時間切れで皆かけていないと思うので、答えの一つとして公開します。
写経をするも良し、自分で動かしてから確認で見るも良し、何か力になれたら嬉しいです。

#HTML
まず、補講授業にいなかった人の為に、HTMLの中身はこちら。

```index.html
<meta http-equiv="content-type" charset="utf-8">
<body>
    <p></p>
    <div id="result">
        <div class="item">
            小菅
        </div>
        <div class="item">
            山崎
        </div>
        <div class="item">
            小菅
        </div>
    </div>
</body>
```
最初にmetaタグがあるのは、文字化け防止なので、そんなに気にしなくて大丈夫です。

# やりたいこと
上のコードをブラウザで確認すると、以下のように表示されると思います。
<img width="159" alt="スクリーンショット 2018-10-25 23.26.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/216701/e3953324-4c5c-9395-cdc4-e4c37d0c0f0a.png">
この「小菅」、「山崎」、「小菅」の中で、
「小菅」と「山崎」を選択をした場合、アラートで「違うよ」と出し
<img width="543" alt="スクリーンショット 2018-10-25 23.26.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/216701/b3683894-7b73-5f35-5324-df819f62afe1.png">

「小菅」と「小菅」を選択をした場合、アラートで「同じだ」と出したいですよね。
<img width="539" alt="スクリーンショット 2018-10-25 23.26.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/216701/933e1c5a-0036-c1f5-d8e5-1044cf5c15c4.png">
#JavaScript
ここからは、全てjavascriptでの処理になります。
続いてscriptタグの中身を書いて行くのですが、私は以下の中身で動きました。

```test.js
let name1  = "";
let name2  = "";
let count  = 0;
let num    = 0; // 最初のクリックの時を、0（何もしない）。次のクリック1の時を、1(同じか違うか判断)
$(".item").on("click", function(){
    count++;
    name1 = $(this).text();
    if(num == 0){
        num++;
        name2 = $(this).text();
    }else if(name1 != name2){
        num = 0;
        name2 = "";
        alert("違うよ");
    }else if(name1 == name2){
        num = 0;
        name2 = "";
        alert("同じだ");
    }else{
        console.log("漏れがあるよ！");
    }
    $('p').text("現在のクリック数："+count);
});
```

# 簡単な解説
name1を、最初に選んだ名前
name2を、次に選んだ名前
countを、クリック回数
numを、最初に選んだか次に選んだかの判定に使います。

あとは、名前をクリックした後の時の処理を、
まずクリックしたカウントを数えさせてから、
name1にクリックした時の名前を入れ、
if文を使って条件分岐させて行きます。
①「最初に名前をクリック」
②「2回とも同じ名前をクリック」
③「違う名前をクリック」
④多分ないけど「その他」
以下の処理を通した後、カウント数をブラウザに表示（おまけ）

#最後に
もし何かご指摘や、「俺はこう書いた！」などあれば、ご意見ください！！

G's Academy チューター 
仲条高幸
画像形式の特徴と誤解されがちなファイルサイズについて

とても基本的なことだけど、誤解している人も居そうなのでまとめ

| 画像形式 | 特徴 | アルゴリズム |
|:-------:|:------------------:|:------------------:|
| JPEG    | 不可逆圧縮。色の多い写真に向いている | 離散コサイン変換、ハフマン符号|
| GIF     | 可逆圧縮。色の少ないロゴや図、表、文章に向いている。アニメーションできる。 | LZW（辞書式圧縮） |
| PNG     | 可逆圧縮。色の多いロゴや図、表、文章、単調なイラストに向いている | Deflate (LZ77とハフマン符号) |

特に、ファイルサイズは誤解されていることが多く、
ほとんどの画像で GIF よりも PNG のほうが圧縮率が高い。
もし、GIF よりサイズの大きい PNG が出てきたら、設定を見直したほうが良い。

また、写真のような画像は JPEG が最も適しているが、
図や表、文章などは JPEG より PNG のほうが圧縮率が高くなる。
（このため、単調なPC画面のスクリーンショットは PNG の方が綺麗でサイズも小さい）

おまけ
https://www.labnol.org/software/tutorials/jpeg-vs-png-image-quality-or-bandwidth/5385/
Railsのmigrationにロックが掛かっているのか調べた(Mysqlの場合)

テーブルロックとかかけているのかな？と思って追ってみた。


# 処理の様子

[migrationの処理の起点](https://github.com/rails/rails/blob/master/activerecord/lib/active_record/migration.rb#L1216-L1222)

ロックがサポートされていたらロックをかけるようす。

Advisory Lockという概念が出てきた。「助言ロック」という概念らしい。

[MySQLアダプタのsupports_advisory_locks?](https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb#L111-L113)
MySQLはその仕組みがある、とされている。

[with_advisory_lockの実装](https://github.com/rails/rails/blob/master/activerecord/lib/active_record/migration.rb#L1365-L1378)

ロックを取得して、解放するようになっている。

[generate_migrator_advisory_lock_id](https://github.com/rails/rails/blob/master/activerecord/lib/active_record/migration.rb#L1382)
ロックのキーは`current_database`から生成されている。

[MySQLのget_advisory_lock, release_advisory_lock](https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb#L123-L129)

MySQLの場合は`GET_LOCK` `RELEASE_LOCK`で為されている。
これらは、引数の文字列の一致でロックを同定するようだ via: [MySQLのロック機能](https://qiita.com/a_yasui/items/0f29ecc4c9ed36816da9)

# 結論

- **テーブルロックではない**
- MySQLのDatabase単位で、ロックを取得するようになっているが、あくまでRailsのmigration同士がぶつからないようにするため
- 他の手段(mysqlコマンド直とか)で触ることはできる

# ちなみに

postgresqlも、`supports_advisory_locks`は`true`で、実装として`pg_try_advisory_lock`を使うようだ。
オブジェクト指向を理解するには「神」になればよい

最近「**オブジェクト指向とは何ぞや**」を書くのが流行ってるらしいので、自分なりの理解を書いてみる。一言でまとめると、

**オブジェクト指向でコードを書くときは、「神」になるべきである。**

# オブジェクト指向言語＝創世記

まずは、何も言わずに次のドキュメントを見てほしい。

```
1 はじめに神は天と地とを創造された。
2 地は形なく、むなしく、やみが淵のおもてにあり、神の霊が水のおもてをおおっていた。
（中略）
11 神はまた言われた、「地は青草と、種をもつ草と、種類にしたがって種のある実を結ぶ果樹とを地の上にはえさせよ」。そのようになった。 
```
出典：[wikisource](https://ja.wikisource.org/wiki/%E5%89%B5%E4%B8%96%E8%A8%98(%E5%8F%A3%E8%AA%9E%E8%A8%B3))

これはある「神」というプログラマが「世界」というプロジェクトを実装したときのドキュメントで、「**創世記**」という名前で知られている。

これこそ「オブジェクト指向」の典型だと思う。なぜなら、このドキュメントからコードを書き起こすことができるからだ。

# 創世記を実装してみる（？）
とはいえ、このままだと「は？意味わかんないんだけど」「飛ばし記事乙」「ゴミ記事を増やしてんじゃねえ」となるので、もう少し解説する。

## ヘッダ
ここでのポイントは「**xxとはこういうものだ**」という表現にある。そのxxが**クラス**と呼ばれる。

たとえば、項番1,2を実装するとしたら次のようになる。まず、出てくるもの、つまり実装すべきクラスを整理する。ここでは**天**（heaven）と**地**（earth）を実装すると書いてある。つまり、C++で言うと**ヘッダでクラスを定義する**ことにあたる。

## 委譲
「地は（中略）やみが淵のおもてにあり」ということから、地はやみ（dark）というメンバ関数を持っていることがわかる。このようにクラスが他のクラスのメンバを持つことを**集約**（**コンポジション**）とか、特にそのメンバの機能を用いて元のクラスの実装を簡単にしているような場合は**委譲**[^1] と言ったりする。

以上をまとめると、例えば地の実装は次のようになる。

```c++
class earth{
   dark m_dark;
};
```

## メンバ関数、メソッドの実装
「地」の実装では、変数だけがまとめられている。これは別にオブジェクト指向でない言語での構造体でも実装できる。

11番を実装しよう。

```
神はまた言われた、「地は青草と、種をもつ草と、種類にしたがって種のある実を結ぶ果樹とを地の上にはえさせよ」。そのようになった。 
```

ここで果樹を実装することを考えると、「実を結ぶ」という機能が果樹に備わっている、ということがわかる。これを実装すると、

```c++
class fruitTree{
   fruit m_fruit;
   void bearFruit(void);
}
```
となる。

# 「もの」を宣言していく作業こそ「オブジェクト指向」
オブジェクト指向とは何ぞやという話に戻ろう。

オブジェクト指向では、

* こういう「もの」があって
* それはこういう変数を持っていて
* こういう機能がある

ということを設計していく。つまり、プログラムの中の世界を作り上げていくということである。これが「神になれ」という所以である。*すべてのプログラマは自身のコードの中では造物主である*。

# じゃあどうやって神になるか
* 根本的に、抽象化力を磨く。
* 鍛錬を積む。何度も世界を作って壊す。
* うまい神の世界を見てみる。うまい神と一緒に世界を作ってみる。
* デザインパターンを勉強してみる。

# 参考文献
* Getter/Setterは悪だ。以上。<br>https://www.kaitoy.xyz/2015/07/22/getters-setters-evil/

[^1]: C#では委譲というと単にメンバを持つということではなく、また別の機能を指すので注意（本質的には同じなのかもしれないが）。
PWAオフラインGA送信備忘録

# PWAとは
アプリみたいなUIのくせに審査いらないし、簡単にオフラインキャッシュできるし最高！

詳しくはほかの方が書いているのでそちらをご覧ください。

# オフラインGoogleAnalyticsについて
workboxプラグイン使用すると、簡単に実装できるんだーへー

▼公式サイト
https://developers.google.com/web/tools/workbox/modules/workbox-google-analytics

これだけでできるんだへー

```
workbox.googleAnalytics.initialize({
  parameterOverrides: {
    cd1: 'offline',
  },
});
```

## うまく飛んでない、、、？
offlineうまく飛んでないやんなんでやねん！
と思ったら、原因はworkboxプラグインのRoutingする関数のせいでした、、、

```
workbox.routing.setDefaultHandler(({url, event, params}) => {
  ...
});
```

>ルートと一致しない要求に対して「ハンドラ」を提供する場合は、デフォルトハンドラを設定できます。

GAとかGTMのJSって、
https://www.googletagmanager.com/gtm.js?id=xxx&...
https://www.google-analytics.com/analytics.js
とか、GoogleのURLで、setDefaultHandlerの関数内の処理に入っちゃうみたい、、

外部URLのRouting1個ずつ定義しなくても、
これだけでできるじゃん！って思って書いてたら見事にハマったわ、、

# 結論
- workboxのドキュメント誰か日本語訳して
- workboxプラグイン便利だけどデバッグしづらい

# 参考サイト
https://developers.google.com/web/tools/workbox/
https://developers.google.com/web/fundamentals/primers/service-workers/?hl=ja
URLをwwwなしに統一とURLのSSL化を同時に行うhtaccessの記述についてこれで合っていますか？

URLをwwwなしに統一とURLのSSL化を同時に行うhtaccessの記述についてこれで合っていますでしょうか？
---------------------------------------------------------------------
<!-- wwwなしに統一 -->
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]
<!-- SSL化 --> 
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

---------------------------------------------------------------------
　バリューサーバーを使っているのですが、サーバーの方でSSLの設定をドメインに行い、
Wordpress側でもhttps://~と一般設定でURLのhttpにsを加えました。
また、サーバー内に上げている各種ファイルURLの一括置換もSSLの方のURLに行くように
すべて置換しました。

https://example.comでは表示されるのですが、http://www.example.comからhttp://example.com
へのリダイレクトが上手くいってなく、404エラーで返されます。

　そして、もちろん、http://www.example.comからhttp://example.comがリダイレクトできていないので、
http://www.example.comからhttps://example.comもつながっていません。


GMOのバリューサーバーでは、SSL化にはhtaccessをいじる必要はないとあったのですが、
サーバーの仕様なのではないか※と思いました。（主にドメイン設定で行います。）
（※ここはこの場とは関係ない話ですので聞き流してください。）

　ちなみに、ほかのレンタルサーバー会社に乗せているドメインのSSL化はすべてうまくいっています。

若干話がずれてしまいましたが、上記のhtaccessファイルの記述に誤りがあるかどうかを知りたいので、詳しい方、お力添えいただけないでしょうか？
どうぞよろしくお願いいたします。
Spring Boot の .originalファイルとは何か

Spring Bootプロジェクトを作成し、`mvn clean package`コマンドを実行すると、targetディレクトリ内に以下のように`.original`ファイルが作成されています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/133607/bd24a65d-13a0-c2e5-e7ac-6022a88147da.png)

これはなんぞや、ということで調べてみました。

# `.original`ファイルはただのJarもしくはWar
はい、ただのJarファイル、Warファイルです。

Spring BootはExecutable Jar(War)を作成することができます。
この形式になっているのが、`.original`ではない方のJarやWarです。

`.original`はExecutableではない、ただのJarやWarということです。

JarやWarを解凍して中身を比較するとわかりますが、Executable Jar (War) は実行に必要なSpring Boot関連のクラスを含んでいたり、ディレクトリ構成が異なっていたりします。

詳細は公式ドキュメントに説明があります。
https://docs.spring.io/spring-boot/docs/current/reference/html/executable-jar.html

# Spring Boot Maven Pluginが作っている
このファイルはSpring Boot Maven Pluginが作成しています。
このPluginには`spring-boot:repackage`というゴールがあり、ここでExecutable Jar (War) を作成し、もともとMavenでpackageされていたJarやWarを`.original`という名称にリネームしています。

なぜ、`mvn clean package`という感じに、`spring-boot:repackage`を指定していないのに作成されてしまうのかというと、spring-boot-starter-parentのpom.xmlに以下のような設定が行われているからです。

```xml:pom.xml(抜粋)
<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <executions>
    <execution>
      <id>repackage</id>
      <goals>
        <goal>repackage</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <mainClass>${start-class}</mainClass>
  </configuration>
</plugin>
```

`repackage`は`package`フェーズで実行されるので、`mvn clean package`すれば、`repackage`も実行されます。

# `.original`ファイルを作成しないようにするためには
Executable Jar (War) を作成する必要があるのであれば、`.original`ファイルは必ず作成されてしまいます。
しかし、ただのJarやWarを作成するだけにしたいのであれば、以下のいずれかでExecutable Jar (War) の作成をスキップできます。

* コマンドの引数で指定する場合

```
mvn clean package -Dspring-boot.repackage.skip=true
```

* pom.xmlで設定する場合

```xml:pom.xml
<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <configuration>
        <skip>true</skip>
      </configuration>
    </plugin>
  </plugins>
</build>
```

# `.original`ファイルの使いみち
組み込みTomcatを利用せず、Warファイルをアプリケーションサーバにデプロイする運用なのであれば、Executable Warである必要はありません。
（もちろん、Executable Warでもデプロイは可能です。）

Executable Warは、実行するために必要なSpring Bootのクラスや、Mavenでprovidedスコープにしたライブラリも含んでいるため、通常のWarファイルよりもファイルサイズが大きくなりがちです。
そのため、このような運用を行っている場合であれば、`.original`ファイルをデプロイしたり、上述の設定を行って、Executable Warを作成しないようにすることで、ファイルサイズを抑えることができます。

ただ、javaコマンドでサクッと実行できるのがSpring Bootの良さだと思いますけど。
Windows標準のイベントビューアーをコマンドラインからアレコレする。

ちょっと昔の退勤時間思い出せなくて、Windowsのシャットダウン時間を確認する時だけに使われるイベントビューアーくん。

**イベントビューアーをコマンドラインから呼び出す際のアレコレを調べたのでまとめます。**


知ってる人にとってはなんてことない知識だとは思うんですが、調べても纏まってる日本語ドキュメントでてこなかったんですよね。
僕の調べ方がイケなかったんでしょうか？

# イベントビューアーを起動する

## eventvwr
コマンドプロンプトまたはPowerShellから下記のいずれかを叩けば起動します。

```
eventvwr.exe
```
  
```
eventvwr.msc
```

拡張子".msc"というのはWindowsの管理ツール類につく拡張子らしいです。  

実態は下記にあります。
`C:\Windows\System32`

基本的にはパスが通ってるはずなのでフルパス入れなくても問題ないです。

## Show-EventLog
PowerShell限定で下記コマンドでも呼び出すことが出来ます。

```
Show-EventLog
```

リファレンス[^1]見る限りでは`eventvmr.exe`のエイリアスのようです。
どちらを使っても変わらなそうですが、こちらの方がPowerShell使いこなしてる感が出てる気がします。

# オプションについて

イベントビューアーを呼び出す際にオプションが指定できます。
コマンドラインだけでここまでやれるとは思っていませんでした。

## `eventvwr.exe /?`  
"/?"と文字列を追加することでヘルプを表示させることができます。
あまり見慣れない画面ですよね。
隠しコマンド見つけたみたいでわくわくします。 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/243634/02d6f982-49ba-2920-6aee-af8e838bea77.png) 

## `eventvwr.exe <コンピュータ名>`
イベントを取得する端末を指定します。未指定の場合はローカルを参照します。

## `eventvwr.exe /v:<クエリファイルまたはビューファイル>`
渡した定義したカスタムビューを表示した状態でイベントビューアーを起動します。
XMLはGUI操作でカスタムビューのプロパティから参照したり、エクスポートすることが出来ます。

## `eventvwr.exe /c:<チャネル>`
指定したチャネルを表示した状態でイベントビューアーを起動します。

## `eventvwr.exe /f:<フィルター>`
表示するイベントに対してフィルターをかけます。記述方法はXMLと同じ形式です。

# イベントログを取得するだけでよいのなら…
イベントログを取得するだけでよいのであれば下記のようなコマンドがPowerShellにあります。


```
Get-WinEvent
```

このコマンドで調べるといろいろと出てくるのでイベントビューアーを開くこと自体が目的でないのならこちらでもよいかもしれません。
https://forsenergy.com/ja-jp/windowspowershellhelp/html/62e7642c-51d4-47d1-97fe-62b08197896a.htm

# おわり

`/?` でヘルプが出てくるの知りませんでした。
~~ちらっとタスクマネージャーやらデバイスマネージャーやらの他のマイクロソフト産Windowsツールでも試してみたんですけどヘルプでてこないんですよね。~~
~~イベントビューアーだけ(と思われる)の謎仕様。不思議だなぁ。~~
⇒どうやらほかのWindowsツールやコマンドでも一部`/?`使えるみたいです。
困ったら/?も試してみるといいかもしれないですね。


[^1]: https://docs.microsoft.com/ja-jp/powershell/module/Microsoft.PowerShell.Management/Show-EventLog?view=powershell-5.1
Docker Toolboxでlaradockを動かそうとしたらmysqlが起動しなかった

Docker Toolboxでlaradockを動かそうとしたらmysqlが起動しない！
エラーメッセージでググったらこちらの記事がヒット。
https://qiita.com/lara_bell/items/d4bd1340a5cc7dfcfcb4
この記事を参考に修正したところ、今度は違うエラーが。

```
$ docker logs 2f9127b2dd11
Initializing database
2018-10-25T13:48:24.815150Z 0 [Warning] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
2018-10-25T13:48:24.815204Z 0 [Warning] 'NO_AUTO_CREATE_USER' sql mode was not set.
2018-10-25T13:48:24.826043Z 0 [Warning] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
2018-10-25T13:48:25.379538Z 0 [ERROR] InnoDB: Operating system error number 22 in a file operation.
2018-10-25T13:48:25.379677Z 0 [ERROR] InnoDB: Error number 22 means 'Invalid argument'
2018-10-25T13:48:25.379721Z 0 [ERROR] InnoDB: File ./ib_logfile101: 'aio write' returned OS error 122. Cannot continue operation
2018-10-25T13:48:25.379756Z 0 [ERROR] InnoDB: Cannot continue operation.
```

再度エラーメッセージでググって解決方法を探したところ、docker-compose.ymlをいじれば良さそう。

```
    mysql:
      build:
        context: ./mysql
        args:
          - MYSQL_VERSION=${MYSQL_VERSION}
      environment:
        - MYSQL_DATABASE=${MYSQL_DATABASE}
        - MYSQL_USER=${MYSQL_USER}
        - MYSQL_PASSWORD=${MYSQL_PASSWORD}
        - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
        - TZ=${WORKSPACE_TIMEZONE}
      volumes:
        - ${DATA_PATH_HOST}/mysql:/var/lib/mysql
        - ${MYSQL_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
      ports:
        - "${MYSQL_PORT}:3306"
      networks:
        - backend
      command: --innodb-use-native-aio=0 #コイツを追加！！！！！
```

一番最後のを追記したら無事動いた。
Amazon の本をヨドバシ.comで検索するブックマークレット

![search-amazon-book-on-yodobashi-dot-com.gif](https://qiita-image-store.s3.amazonaws.com/0/67627/8c4e39fa-4d6e-0d05-3374-29b64f8ddb65.gif)

Amazon のデリバリープロバイダから本を受け取る難易度が高すぎるので、Amazon で見つけた本をヨドバシ.comで検索するブックマークレットをメモっとく。

商品ページ内の ISBN を正規表現で抽出し、その ISBN をクエリにしたヨドバシ.comの書籍検索ページに遷移するだけのブックマークレット。

ヨドバシ.com以外の書籍通販サイトで検索するブックマークレットを希望する人はコメントに書いてもらえたらベストエフォートで対応する予定。

# ブックマークレットを登録する

下記のコードを URL としたブックマークを適当な名前で作成する。

## ヨドバシ.com

```js
javascript:location.href='https://www.yodobashi.com/category/81001/?word='+document.body.innerText.match(/\d{3}-\d{10}/)
```

# Amazon の本をヨドバシ.comで検索する

Amazon でほしい本を表示し、作成したブックマークレットをクリックするとヨドバシ.comでの検索結果画面に遷移する。
Ruby 論理演算子を理解する

#論理演算子の特徴

- 左側から順番に評価されていく
- 式の真偽が決定すると残りの式は評価しない
- 最後に評価された式の値が論理式全体の値になる
- falseとnill以外は真

※orとandに関してはド・モルガンの法則を調べてください

---
- || (or)について

 `条件1 || 条件2`

条件1,条件2の順に真偽が判定されます。

||の場合どちらかの条件の結果が真であれば結果は真になります。
なので、条件1の結果が真であれば条件2を見なくても全体は真になることがわかります。
逆に言うと条件2を評価する必要があるのは条件1の結果が偽の場合のみです。

---

- && (and)について

 `条件1 && 条件2`

条件2は||とは逆に条件1の結果が真の場合にのみ評価されます。

---
- 変数の論理式
 
`var || "Ruby"`

varの真偽が判断され、nilかfalseの場合のみ"Ruby"が評価される。
このときは戻り値として考えます。

■ varがオブジェクトを参照していればその値を返す（最後に評価された式がvarの場合）
■ varの結果がnilまたはfalseの場合は、文字列"Ruby"(次の式の値)を返す


 >応用


```
name ="Ruby"
#変数nameにRuby(デフォルト値)を代入します
if var
#varが真のとき(nil,false以外)
 name = var
#変数nameにvarを代入する
end
```
上記でやりたいことは||を使えば下記のようにかけます。

```
name = var || "Ruby"
#varの値がnilとfalseの場合(偽)はnameにRubyを代入する
```

以上です。
swiftかじってみたまとめ② 

自身の備忘録程度です。
使用した教材：
　絶対に挫折しない iPhoneアプリ開発「超」入門 第5版
 (ISBN: 4797389818)
今回はストーリボード上の設定値や画面遷移の実装を行なったため、
そのあたりの基礎について学んだ用語のまとめです。

### self ↔︎ super
- selfはViewControllerクラスのインスタンス(自分自身のインスタンス)
- suoerは親クラスのインスタンスを表す。

### モーダルビュー
- アクティビティービューのように「現在の画面の上に覆いかぶさって表示される一時的な画面」のこと。
- モーダルビューが表示＝モーダルビューより下の画面をユーザは操作できなくなる。<br>
 【使用用途】ユーザに向けてなんらかの注意を促したり、あるコンテンツに意識を集中させたい時

### imageView
- iPhoneの画面に画像を表示するためのUI部品
- ストーリーボードの画面上で直接画像を指定することはできない。
 
### contentModeプロパティの役割
- ビューに表示するコンテンツをどのように配置するのか

|   プロパティ設定値    |  役割 |
|:-----------------|:------------------|
| scale to Fill    |イメージビューのサイズ＝画像のサイズ(縦横比は変化する) |
| Aspect Fit       |縦横比を変えずに画像の全体がイメージビュー内に収まるように拡大/ 縮小。<br>そのためイメージビューに余白が生じる場合がある。 | 
| Aspect Fill      |縦横比を変えずにイメージビューを全て埋めるように画像を拡大/縮小。<br>そのため画像の一部がイメージビューに入りきらない場合がある。 |
swiftかじってみたまとめ① 

自身の備忘録程度です。
使用した教材：
　絶対に挫折しない iPhoneアプリ開発「超」入門 第5版
 (ISBN: 4797389818)

### UIActivityViewController
- アクティビティービューと呼ばれるiPhoneで下からスワイプした時に表示される
 機能一覧を自動で表示するクラス。
- ViewControllerの子クラスにあたる。
 
### activityItems
- 動作の対象となるコンテンツを配列で指定する

### イニシャライザ
- クラスの初期設定を実行するメソッド

### Any型
- どんな型でも、iOSが扱うことのできる全てのデータ(インスタンス)に対応する型
 
### オプショナル
- 不確定要素。存在していないかもしれない。
- オプショナルは宣言した型 or nil「？」をつけて存在していたら、という扱いにしている。
- 参照する際は都度中身を問い合わせなければならない＝重くなる
- オプショナル＝複数の形を持てるように「wrap」されている状態
- 中身が確定していると判断できるものは「wrap」→「unwrap」してから使う方が効果的<br>
 →ImplicitlyUnwrappedOptional(構文的には「!」)
 結論：確定＝！　/  　未確定＝？
 
 基本的な用語からさらってみました。。。。
引き続き勉強頑張ります。。。
PHPでセッション

#PHPのセッションの使い方
セッションとは、サーバーにデータを保存する仕組みのことです。
他のページをまたいでデータを使用する時に便利な機能です。
今回はセッションの使い方をまとめました。


##session_start()
session_start()は文字通り、セッションを使い始めるときにまず実行します。
セッションIDが作成されクライアント側に保存されます。

また、セッションIDをクッキーとしてもっているクライアントが、session_start()を実行すると、セッションで保存した変数を利用できるようになります。


##$\_SESSION
セッションでサーバーにデータを保存するときに使う変数\$\_SESSIONを紹介します。
\$\_SESSIONは連想配列として扱うことができます。


```php:
  session_start();
  $_SESSION['name'] = "Hanako";
  $_SESSION['number'] = "0934";
  $_SESSION['age'] = 22;
  $_SESSION['remark'] = "大学生";
```
これでセッションに変数が保存できました。

このデータを他のページで読み込むときは、session_start()でセッションが利用できるようにして、\$\_SESSIONにキーを渡します。

```php:
  session_start();
  $number = $_SESSION['number'];
  $name = $_SESSION['name'];
  $age = $_SESSION['age'];
  $remark = $_SESSION['remark'];
```
##unset(変数)
使い終わったら、片付けもしましょう。
unset()は引数で渡した変数を空の状態にすることができます。

```php:
  unset($_SESSION['number']);
  unset($_SESSION['name']);
  unset($_SESSION['age']);
  unset($_SESSION['remark']);
```
英語圏のTaiga.ioコンテナを使ったら日本語周りでハマった件について

これが、無知の恥...(；´Д｀)
## 動機
今いるプロジェクトで、プロジェクト管理にTaiga.ioを使うことになり、そのセットアップを行ったのですが、少しハマったので、調べた結果をメモ程度に。

## 教訓(せっかちさんのために、最初に書いておく)
* Dockerコンテナ内の環境は最低限のものしかない（基本インストール必須）
* 英語圏の物を使うときは、ロケールに気を付ける。
* インストールされていないロケールを設定すると、LANG=C扱いになりPythonはASCIIで読み書きする（？）
* Dockerfieを編集したら、buildしましょう。（今回は、docker-compose up --build）


## 問題発生
英語圏のtaigaioのDockerコンテナ：*[benhutchins/taiga](https://hub.docker.com/r/benhutchins/taiga/)*を使ってセットアップ
試用中にプロジェクト名に日本語を使ったら、メンバーの招待機能で障害発生（エンコードエラーで落ちる）

```bash:エラーログ（抜粋
  File "/usr/src/taiga-back/taiga/projects/services/invitations.py", line 34, in send_invitation
    email.send()
  File "/usr/local/lib/python3.5/site-packages/django/core/mail/message.py", line 342, in send
    return self.get_connection(fail_silently).send_messages([self])
  File "/usr/local/lib/python3.5/site-packages/django/core/mail/backends/console.py", line 36, in send_messages
    self.write_message(message)
  File "/usr/local/lib/python3.5/site-packages/django/core/mail/backends/console.py", line 23, in write_message
    self.stream.write('%s\n' % msg_data)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 618-620: ordinal not in range(128)
[
```

## ロケールを変えるも・・・
* ロケール設定を疑って、"ja_jp.utf-8"に設定すると、そんなものはないと怒られる。

```bash
root@754a0075dd4f:/usr/src/taiga-back# export LC_ALL="ja_JP.utf8"
bash: warning: setlocale: LC_ALL: cannot change locale (ja_JP.utf8): No such file or directory
```

## 確認は大事です。
`locale -a`で、利用可能なロケールを確認すると、無い。
日本語がありません。そりゃあ、動きませんわ・・・
コンテナに割と入ってないもんなんだな・・・。（英語圏だし、これが当然？）

```bash
>locale -a
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory
C
C.UTF-8
POSIX
```

## 無いなら、入れるまで。
ようやっとDockerFileをいじいじするお時間です。

``` docker
RUN apt-get update &&  apt-get install -y locales locales-all
RUN localedef -i ja_JP -f UTF-8 ja_JP.utf8
(中略)
ENV LC_ALL ja_JP.utf8
```
このあと、`docker-compose up`で、コンテナ立ち上げても、インストールが走らねぇ！？と泡食いました。
（ビルドするという発想が頭に再ロードされるまで）

## かくにんは大事です（2回目

```bash
root@a1ef238657c9:/usr/src/taiga-back# locale -a | grep "ja"
ja_JP.eucjp
ja_JP.utf8
root@a1ef238657c9:/usr/src/taiga-back# locale
LANG=ja_JP.utf8
LANGUAGE=
LC_CTYPE="ja_JP.utf8"
LC_NUMERIC="ja_JP.utf8"
LC_TIME="ja_JP.utf8"
LC_COLLATE="ja_JP.utf8"
LC_MONETARY="ja_JP.utf8"
LC_MESSAGES="ja_JP.utf8"
LC_PAPER="ja_JP.utf8"
LC_NAME="ja_JP.utf8"
LC_ADDRESS="ja_JP.utf8"
LC_TELEPHONE="ja_JP.utf8"
LC_MEASUREMENT="ja_JP.utf8"
LC_IDENTIFICATION="ja_JP.utf8"
LC_ALL=ja_JP.utf8

```
今度は、警告も出ずに、ロケールの変更に成功しました！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/83578/a567c998-c5a9-aba2-4a50-8ba7de543db6.png)
そして、日本語のプロジェクト名でも、メンバーの追加ができました！！

## おまけ
最初は*[accon/taiga](https://hub.docker.com/r/accon/taiga/)*の方を使って、セットアップをしたんだけど、ユーザー登録画面で”プライバシーポリシーと利用規約に同意しろ”とエラーメッセージが出て進めない・admin画面がNotFoundで利用できなかったので、英語圏のコンテナを出したんです。
今回使ったコンテナでも、admin画面が出てこないんだよね・・・なんで？？

## 参考リンク
Python 3の各種エンコーディングについて
https://qiita.com/methane/items/6e294ef5a1fad4afa843)
Dockerfileで日本語ロケールを設定する方法。およびロケールエラーの回避方法。
https://qiita.com/YuukiMiyoshi/items/f389ea366060537b5cd9
実機でビルドしようとすると「task failed with exit 1 signal 0 」

証明書関連をいじる記事がよく出てくるが、自分の環境では問題無いようだった。

↓にしたがって、キーチェーンアクセス周りをいじって再度ビルドしたところ、通った。３時間くらい悩んだ…。

***

ios - Xcodeは、キーチェーンにアクセスするためにCodesignを拒否した後にDeviceをビルドできません。 https://stackoverrun.com/ja/q/13079600
HTML メモ

### for属性とは
formパーツと要素を関連づけるための属性
同じ内容のid属性をもつ要素と結び付く

```html
<form>
  <label for="name">名前</label>
  <input type="text" id="name">
</form>
```


### button要素
※typeの初期値は <font color="red">**submit**</font>のため、<font color="red">**type="button"**</font>にするのを忘れないように!!

```html
<button type="button" class="btn">クリックしてね</button>
```

### tabindex属性
<font color="blue">**グローバル属性**</font>
要素が入力フォーカスを持てる場合に、キーボードの順次ナビゲーション (ふつうは名前の由来である Tab キーによる) に加わるかどうか、どの位置に加わるかを示す。

```html
<input name="search_query" tabindex="0" type="text">
```

### spellcheck属性
<font color="blue">**グローバル属性** **列挙型**</font>
要素内容のスペルチェックや文法チェックの有無を指定します。

```html
<textarea cols="50" rows="5" name="message" spellcheck="true">
</textarea>
```
[Document](https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/spellcheck)

<font color="red">※スペルチェック後にどういう挙動をするかは、ユーザエージェントによる</font>

### autocapitalize属性
<font color="blue">**グローバル属性** **列挙型**</font>
ユーザーによって入力／編集されたとき、入力文字列の先頭大文字化が自動的変換するかどうか

```html
<input name="search_query" type="text" autocapitalize="none">
```
**capitalize**　の意味 「~を利用する」
[Document](https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/autocapitalize)

### autocomplete属性
入力値としてテキストまたは数値を取るいくつかの種類の **\<input\> 要素**で利用できます。 autocomplete を使用すると、ウェブ開発者は入力欄にどの種類の情報が期待されているかをブラウザーに示唆するのと同様に、ユーザーエージェントがフォーム入力欄の値を埋めるための自動支援を提供する必要があることを指定します。

```html
<input name="search" type="text" autocomplete="none">
```
[Document](https://developer.mozilla.org/ja/docs/Web/HTML/Attributes/autocomplete)


### autocorrect属性
<font color="red">**標準外属性 Safariで利用**</font>
ユーザーが **\<input>** にテキストを入力または編集した際にオートコレクトを実行するかを制御します
autocorrect属性はiPhoneまたはiPad上で動作し、オートコンプリートはAndroidを実行するすべてのデバイス用です。

```html
<input name="search" type="text"
  autocorrect="none"
  autocomplete="none">
```

### aria-haspopup属性
<font color="blue">**WAI-ARIA属性**</font>
ポップアップメニューが存在するかどうかを示すためのWAI-ARIAの属性です。

```html
<input name="search" type="text" aria-haspopup="false">
```
[Document](https://developer.mozilla.org/ja/docs/ARIA/Accessible_Rich_Internet_Applications)


### dir属性
<font color="blue">**グローバル属性** **列挙型**</font>
要素のテキストの書字方向を示す

```html
# 左から
<input name="search" type="text" dir="ltr">
```
[Document](http://www.html5.jp/tag/attributes/dir.html)


### aria-autocomplete属性
<font color="blue">**WAI-ARIA属性**</font>
入力補完のサジェストを提供するための属性です

| value | 説明 |
|:-----------------|------------------:|
|inline|	カレットの後に入力補完のテキストを提供する|
|list|	ユーザが選択できるリストで提供する|
|both|	ユーザが選択できるリストで提供され、現在選択されているテキストもインラインで表示する|
|none (default)|	サジェストは提供されない|

```html
<input name="search" type="text" aria-autocomplete="list">
```

### role=combobox とは
コンボボックスの見た目はプルダウンメニューと同じです。
選択肢から選ぶ以外に**キーボード**から文字を入力することができるのが「コンボボックス」となります。

```html
<input name="search" type="text" role="combobox">
````
[Document](https://wa3.i-3-i.info/word11628.html)
[UniRx.Async]UniTaskでUniTaskをキャンセルする

`UniTask`をキャンセルするためには通常`CancellationToken`を使用します。
例えば以下のような感じです。

```csharp
var cts = new CancellationTokenSource();
// 三秒後にキャンセル
UniTask.Delay(3000).ContinueWith(() =>
{
    cts.Cancell();
}).Forget();

// asyncなメソッド
HogeAsync(cts.Token).Forget();
```

参考:[【UniRx.Async】UniTaskのキャンセル覚書【Unity】](https://qiita.com/su10/items/ccb12742ad0be790b323)

`Observable`に比べてちょっと面倒ですね。
`Observable`であれば以下のように書けます。

```csharp
// 3秒後に発行
var delay = Observable.Timer(TimeSpan.FromMilliseconds(3000));

// delayが来るまで出力する
Observable.Interval(TimeSpan.FromMilliseconds(100))
    .TakeUntil(delay)
    .Subscribe(i => Debug.Log(i));
```

## UnitTaskでUniTaskをキャンセルする

`UniTask`が`CancellationToken`に変換できれば簡単に実現できます。
この変換は簡単に行うことができます。

```csharp
public static CancellationToken ToCancellationToken(this UniTask task)
{
    if (task.IsCompleted)
    {
        return cancelledToken;
    }

    var source = new CancellationTokenSource();
    Fire(source, task).Forget();
    return source.Token;
}

static async UniTaskVoid Fire(CancellationTokenSource source, UniTask task)
{
    try
    {
        await task;
    }
    catch
    {
    }

    source.Cancel();
}
```

(`UniTask.ToObservable`とほぼ同じ実装です)

これを使用すると最初のサンプルはこうなります。

```csharp
var token = UniTask.Delay(3000).ToCancellationToken();

// asyncなメソッド
Fuga(token).Forget();
```

簡単になりました:dizzy:

## 最後に

ソースコード全体は以下にあります。

[yaegaki/UniTaskCancellationTokenExtensions.cs](https://gist.github.com/yaegaki/4bd3082f70dd65dc58eeaed88aa24326#file-unitaskcancellationtokenextensions-cs)

あまり調べずに書いたのですでに同じような関数が実装されているなら教えてください。:bow:
[Java]半角・全角混合でも文字位置を合わせる

# はじめに

Java で半角と全角が混ざった状態で String#format を使うと文字の位置がずれてしまうことが起きました。
あまり調べても簡単に解決する方法がなかったので，パッと関数を組んでみました。

## 解決策

早速だけれど，以下が解決策です。
（とりあえず以下の`format()`と`getByteLength()`だけコピー&ペーストすれば解決します）

```java:main
    public static void main(String[] args){
        //ずれるformat文
        System.out.println(String.format("%-20s", "あああああ")+" | ");
        System.out.println(String.format("%-20s", "aaaaa")+" | ");
        //ずれないformat文
        System.out.println(format("あああああ", 20)+" | ");
        System.out.println(format("aaaaa", 20)+" | ");
    }

    private static String format(String target, int length){
        int byteDiff = (getByteLength(target, Charset.forName("UTF-8"))-target.length())/2;
        return String.format("%-"+(length-byteDiff)+"s", target);
    }

    private static int getByteLength(String string, Charset charset) {
        return string.getBytes(charset).length;
    }
```

```markdown:result
あああああ                | 
aaaaa                | 
あああああ            | 
aaaaa                | 
```

(Qiita へコピー&ペーストした時に`|`がずれたのは内緒...)
以下余談です。

## ずれる理由と対策法

そもそもなぜ半角と全角でずれるのかというと，`UTF-8` などで文字を表現すると`byte` の数が以下のように異なるからです。

* 日本語 : 3byte
* 英数字 : 1byte

なので，`main`中の`int byteDiff`で調整しています。
また，以下の関数より、日本語は 3byte で、英語は 1byte であることが分かります。

```java:analyze
    public static void main(String[] args){
        analyze("あああああ");
        analyze("aaaaa");
    }

    private static void analyze(String target){
        System.out.println("\n"+target);
        int length=20;
        System.out.println(format("length()", length)+":"+target.length());
        System.out.println(format("UTF-8 length()", length)+":"+getByteLength(target, Charset.forName("UTF-8")));
        System.out.println(format("diff", length)+":"+(getByteLength(target, Charset.forName("UTF-8"))-target.length())/2);
    }

```

```markdown:result
あああああ
length()            :5
UTF-8 length()      :15
diff                :5

aaaaa
length()            :5
UTF-8 length()      :5
diff                :0
```


# 参考

* [Java：ゼロ埋め、半角スペース埋めする方法](http://write-remember.com/program/java/format/)
* [[Java] Stringのバイト数を取得する](https://qiita.com/hecateball/items/d0edb6ff65d8f6b18ec4)
Rails CTI用のストロングパラメータ

Qiita初投稿なので、間違っていたら、ガンガンご指摘ください！

## TL;DR

Railsを使ってアプリケーションを作るときは
ストロングパラメータを通さないと、Railsさんから怒られる仕様になっています。(Rails ver4以降)

「モデルのカラムをそのままフィールドにするんでしょ？」みたいな勘違いや、ブラックボックス化されている気がして、初心者が打破するのはかなり難しい気がするので、少し記事にまとめていきたいです！

あくまで、対象は初心者の方です！

## ストロングパラメータの意味

僕も正確に理解しているわけではないですが、

*「送られて来たparameterの中で許容するフィールドを絞るメソッド」*

と認識しています。
例を挙げて説明していきます。

## 普通のストロングパラメータ

blogsテーブルのカラムはcontentとimageの二つを考えます！

```app/controllers/blogs_controller.rb
def create
  @blog = Blog.new(blog_params)
  @blog.save
  render :create, formats: :json
end

private
def blog_params
  params.require(:blogs).permit(
    :content,
    :image
  )
end
```

みたいな感じだと思います！
このとき、クライアントからのパラメータで許容されるのは、

```
{
  blogs: {
    content: "あの映画、面白かった",
    image: "https://image.png"
  }
}
```

この形で送られて来たパラメータできます！

このとき例えば、以下のように titleフィールドを追加して、送ったとします！

```
{
  blogs: {
    title: "映画",   # => これを追加
    content: "あの映画、面白かった",
    image: "https://image.png"
  }
}
```

もし、これを送っても

```
{
  blogs: {
    content: "あの映画、面白かった",
    image: "https://image.png"
  }
}
```

だけです！

要は、*ふるいにかけています！*

ストロングパラメータは、ふるいにかけるためのメソッドという事です！

なので、DBのカラムと直接的な関係はないです！

### CTI用のストロングパラメータ

さきほどの設計だと、Blogsテーブルの一つのレコードに、一つのimageしか付与する事ができません。

そのため、今回は
BlogsテーブルとBlogImagesテーブルと２つのテーブルを考えます！
また、この二つのアソシエーションは１対多を考えます。

Blogsテーブルのカラムは *content*、
BlogImagesのテーブルのカラムは *image* とします。

このときのストロングパラメータは、

```app/controllers/blogs_controller.rb
private
def blog_params
  params.require(:blogs):permit(
    :content,
    blog_images: [
      :image
    ]
  )
end
```

このとき、以下を送ると通ると思います。

```
{
  blogs: {
    content: "あの映画、面白かった",
    blog_images: [
      { image: "https://image1.png" },
      { image: "https://image2.png" }
    ]
  }
}
```

これで、一回のリクエストで、
一つのBlogに複数のimageを付け加える事ができました。
[Rails]POSTで送ったboolean値がおかしかった原因

久しぶりの備忘録。
RailsでPOSTで送った **false** がif文にて **true** になってしまう問題に遭遇し、解決までにちょっと悩んだので記事にしました。(検索した限りではQiitaでの記事が無かったので)

# バグ

```AAA.html.erb
~省略~
<%= link_to stock_path(num: num, is_sum: false), method: "post", class: "btn btn-success btn-block" do %>
	<i class="glyphicon glyphicon-ok"></i> stockから減らす
<% end %>
~省略~
```

```BBB_controller.rb
def stock
	if !params[:is_sum]
		stock -= params[:num]
	else
		stock += params[:num]
	end
end
```

~~適当に書いたsampleなので間違ってたらごめんなさい~~
上記のコードは、AAA.html.erbのViewにある「stockから減らす」ボタンを押すと、stockからnum個減らすというものです。
`BBB#stock` は、is_sumが`true`ならstockにnumを加算、is_sumが`false`ならstockからnumを減算するアクションです。
AAA.html.erb上のボタンでは、**is_sum == false** であるので、当然ボタンを押すと減算されるはず......だったのですが、実際に動かしてみると**else文の方に入っていき、numが加算されてしまう**のでした。
logを使って見てみるも、きちんとis_sumにはfalseが入っていた...

# 原因

答えから言えば原因は

* Rubyでは、falseになるのは**FalseClassかnilの場合のみ**(0や"false"はtrue)
* paramsとして論理値を渡す時、**勝手にstringになっている**

そう、is_sumに入っていたのは、`false`ではなく`"false"`であった...

# 解決
stringになっているだけなので

```
if params[:is_sum] == "false"
	stock -= params[:num]
else
	stock += params[:num]
end
```

のように、文字列一致を条件にすれば、キチンと動作しました。
また、helperとかにstringからBooleanに戻す関数を用意するのも良いと思います。
※RubyにはString→Booleanの型変換ができる関数がないので、自作する必要があります

参考資料　：　http://portaltan.hatenablog.com/entry/2015/07/29/130359

# 最後に
勝手にstringに変換されるのは盲点でした。
もしかするとPOSTではboolean型をパラメータとして送ることが出来ないのかもしれません。
上記以外にも、もっとスマートな解決策があれば、コメントいただければ幸いです。
Nuxt ver.2 へプロジェクトを移行したときにCSSで対応したこと（PostCSS編）

## 前提条件
Nuxtのver.1を使って個人的なプロジェクトを作っていました。SSRは使わずSPAモードでGenerateして、静的ファイル一式をサーバーにアップする形です。
しばらくプロジェクトを進めて、一旦区切りが出来たので、使っているモジュール（node_modules）を全てアップデートしました。その中でも、すんなりとは行かなかった**Nuxt**のアップデートについて書きたいと思います。

**アップデートしたバージョン**：1.4.1から2.2.0へ

## アップデートしたら起きたこと

私はNuxtでスタイリングするときに、NuxtのデフォルトであるPostCSSとcssnextの組み合わせで書いていました。ですので、nuxt.config.jsにはCSS周りの設定は入れていません。
各コンポーネントのスタイリングは、下記のようにvueファイルに書いていました。

```html:sample.vue
<template>
  <h1>
    タイトル<span class="sub-title">（サブタイトル）</span>
  </h1>
</template>
<script>
  //スクリプト
</script>
<style scoped>
h1 {
  color: #000;
  & .sub-title {
    font-size: .9em;
    color: #444;
  }
}
</style>
```
この状態でNuxtをアップデートしたところ、`cssnext`の**ネスト（入れ子）**が機能しませんでした。cssは書き出されますが、`&`は残ったまま書き出されてしまいます。

## 原因と対応

#### 原因
調べてみたところNuxt2からは`cssnext`ではなく、`postcss-reset-env`というのに変わっているからでした。
参照：[feat: use postcss-preset-env instead of postcss-cssnext (#3291) · nuxt/nuxt.js@8acef8d · GitHub](https://github.com/nuxt/nuxt.js/commit/8acef8d01ec77e24cc930e6025e324d277af57a1)

#### 対応
結果から言うと`postcss.config.js`もしくは`.postcssrc.js`というPostCSSの設定ファイルに、postcss-preset-envの設定を書けば大丈夫でした。
私が書いた内容は下記になります。

```js:postcss.config.js
module.exports = {
  plugins: {
    'postcss-preset-env': {
      stage: 0,
      importFrom: 'assets/css/_variables.css'
    }
  }
}
```

ステージはトランスパイル時のレベルです。stageが高いほど新しいブラウザ向けになるようです。デフォルトが2に設定されており、2だとnestingが解決されません。nesting rulesは`state:0`です。
参照：
[nesting rules](https://preset-env.cssdb.org/features#nesting-rules)
[postcss-preset-env](https://preset-env.cssdb.org/)

## その他
#### importFrom
postcss-preset-envの`importFrom`は共通で使う変数とかを読み込んでおくことができます。便利！
ver.1の時は、変数を書いたcssファイルを各コンポーネントで`@import`して読み込んでいました。
（ver.1でも何かのやり方で出来たのかもですが、今回知ることが出来て嬉しかったです）
#### ~/assetsと~assets
また、地味ですが、css内では~/assetsを~assetsに変更する必要があります。それだけですが、地味に手間です。
[アセット - Nuxt.js](https://ja.nuxtjs.org/guide/assets/)

---
CSSですこし躓きましたが、それ以外は特に引っかからずにver.2へ移行出来ました。
【Xcode】UIActivityIndicatorViewをextensionにして簡単にぐるぐるを表示する

## UIActivityIndicatorViewを簡単に表示したい

<img width="375" alt="001.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/7d3853a9-6f4e-ecc1-f794-264cb874e9b6.png">

こういうぐるぐるを表示したくて調べたら、こちら↓の記事を見つけました。

[LoadingView表示用のUIViewのExtensionを作る](https://qiita.com/iganin/items/f413f0ddb68317dfb2af)

ありがとうございます！

## UIViewControllerのextensionにしてみた

記事を参考にして、 UIActivityIndicatorView を UIViewController の extension にしてみました。

``` Swift
 extension UIViewController {
 
     func showLoading(style indicatorStyle: UIActivityIndicatorView.Style) {
         let overLayView = LoadingOverlayView(frame: view.frame, indicatorStyle: indicatorStyle)
         view.addSubview(overLayView)
         DispatchQueue.main.async {
             overLayView.startAnimation()
         }
     }
 
     func hideLoading() {
         view.subviews.forEach { subView in
             if let subView = subView as? LoadingOverlayView {
                 DispatchQueue.main.async {
                     subView.stopAnimation()
                     subView.removeFromSuperview()
                 }
             }
         }
     }
 
 }
 
 fileprivate final class LoadingOverlayView: UIView {
 
     private var indicatorView: UIActivityIndicatorView!
 
     init(frame: CGRect, indicatorStyle: UIActivityIndicatorView.Style) {
         super.init(frame: frame)
 
         indicatorView = UIActivityIndicatorView(style: indicatorStyle)
         indicatorView.hidesWhenStopped = true
         addSubview(indicatorView)
         indicatorView.center = center
         backgroundColor = UIColor.black
         alpha = 0.5
     }
 
     required init?(coder aDecoder: NSCoder) {
         fatalError("init(coder:) has not been implemented")
     }
 
     func startAnimation() {
         indicatorView.startAnimating()
     }
 
     func stopAnimation() {
         indicatorView.stopAnimating()
     }
 
 }
```

## UIActivityIndicatorViewを表示するには

UIActivityIndicatorViewを表示するには、 ViewController の好きなところで showLoading 呼び出すだけです。

止めるときには、 hideLoading を呼び出してください。

``` Swift
     func showActivityIndicator() {
         showLoading(style: .whiteLarge)
     }
 
     func hideActivityIndicator() {
         hideLoading()
     }
```
Deploymentにlabel書く部分がやたら多いけどそれ必要？

## 対象

異常なめんどくさがりの人

## 疑問

kubernetesのDeployment
代表的な記述例がここ
https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
にあるこちらですが

```yaml:controllers/nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.4
        ports:
        - containerPort: 80
```

__なんか `app: nginx` 多くないですか？__
と思ったので少し調べました。

## それぞれの役割
まずはそれぞれにどういう意味があるのかを確認します。
これはわかりやすく書いてある記事があるのでそちらを読みましょう。

https://44smkn.hatenadiary.com/entry/2018/07/30/235030
https://medium.com/@zwhitchcox/matchlabels-labels-and-selectors-explained-in-detail-for-beginners-d421bdd05362

`.metadata.labels` と `.spec.template.metadata.labels`については問題ないですね。
（余談ですが`.metadata.labels`は必須のフィールドでないので特に必要なければ設定しなくてもよいみたいです）
少し引っかかるのが`.spec.selector.matchLabels`

基本的に`.spec.template.metadata.labels`と同じものを書くものみたいです。
というか両者が一致しないとエラーになってapplyできません。（厳密に言うと`.spec.selector.matchLabels`が`.spec.template.metadata.labels`に含まれていればapplyは通る）
省略もできません、必須のフィールドです。

必要なのは先程の記事を読めばわかるのですが、
__なぜ同じことを2回書かなくてはいけないのか！内部でよしなにやってくれ！__

と思ったので続いてその理由も調べました。

## 両方書かせる理由

（個人的には納得できた）答えがありました
https://stackoverflow.com/questions/50309057/what-is-the-purpose-of-a-kubernetes-deployment-pod-selector

要約すると

- `apps/v1beta1`までは`spec.selector.matchLabels`の指定がない場合`spec.template.metadata.labels`と同じものを展開してくれていた（実際に`apps/v1beta1`でdeployすると確認できます）
- `kubectl apply`を使った時に設定は`metadata.annotations.kubectl.kubernetes.io/last-applied-configuration`に保持されるが、ここには実際に記述したものしか保持されない（上の勝手に補完される`spec.template.metadata.labels`は保持されない）
- `kubectl apply`で`spec.template.metadata.labels`を変更した時に、前回補完された`spec.selector.matchLabels`と一致せずにエラーになる！
- で、`apps/v1beta2`からは`spec.selector.matchLabels`もちゃんと書いてもらうことになった、あと`spec.template.metadata.labels`は変更禁止になった

ということみたいですね、
変更できなくしたならbeta1の頃のように補完してくれても問題ないような気がするんですが。

これだけだと`kubectl apply`の実装に合わせて取り繕ったように見えてしまいますし、ちゃんと調べたらもっと深い部分の話が出てきそうです。
が、全部書かないといけない理由としては納得できたので一旦ここで終了。気が向いたら更に追ってみようかと…
非同期でjsonをcurlでpostするシェルスクリプト

```curl_exec.sh
URL="http://example.com"
BODY='{"param1":"a","param2":"b"}'
NUMBER_OF_TIMES=10

i=0
while [ $i -lt $NUMBER_OF_TIMES ]
do
  curl -w "\t%{http_code}\t%{time_total}\n" -X POST -H "Content-Type: application/json" -d $BODY $URL &
  i=$((i+1))
done
```

10回バックグラウンドジョブとしてcurlでコールします。
バックグラウンドなので出力結果はしばらくしてからヌルヌル表示されます。

出力結果：

```
$ 結果①   200   1.402
結果②   200     2.491
```

出力結果としてステータスコードとレスポンス時間を出力します。
Gource バージョン管理システムの履歴情報をアニメーションで見る

* 以下の記事に載っていて面白そうなので触ってみました
  * [オープンソースプロジェクトのすゝめ](https://qiita.com/kaitoy/items/91cf5290af0c813ab1ed)



# ツール概要

*  [Gource](https://gource.io/)
* バージョン管理システムのリポジトリ情報をアニメーションで可視化してくれるツール

  > Gource includes built-in log generation support for Git, Mercurial, Bazaar and SVN. Gource can also parse logs produced by several third party tools for CVS repositories.

* こんな感じ
  * Minecraftのリポジトリを可視化したもの

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Minecraft gets the Gource treatment <a href="http://t.co/8PPBajM3N7">http://t.co/8PPBajM3N7</a></p>&mdash; Andrew (@acaudwell) <a href="https://twitter.com/acaudwell/status/312133563443183616?ref_src=twsrc%5Etfw">2013年3月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# インストール

* Windows10
* 公式サイトから`zip`をダウンロードし解凍
  * PATHは適宜・・・
* ヘルプが出ればOK

```
gource -h
```

# 使い方

1. 対象のリポジトリを用意
1. リポジトリのディレクトリに移動
1. 実行
  * オプションは[wiki > Controls](https://github.com/acaudwell/Gource/wiki/Controls)

```
git clone hogehoge
cd hogehoge
gource
```

### アニメーション中の操作

* パン
  * 左クリックでドラッグ or 矢印キー
* ローテーション
  * 右クリックでドラッグ
* ズーム
  * マウスホイール
* ポーズ
  * スペースキー
Railsでdelegateを使って簡単にメソッドにアクセスする

## delegateとは
[Railsガイドによると](https://railsguides.jp/active_support_core_extensions.html#%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E5%A7%94%E8%AD%B2)
> delegateマクロを使用すると、メソッドを簡単に委譲できます。

というものらしいです。

---

だいぶ無理がありますが、下記の条件のもと、delegateメソッドを使って移譲を試してみます

- Student(生徒)モデルと　Address（住所）モデルがあり、生徒はそれぞれ１つの住所を持つとする
- この時、Addressモデルはcountry, prefecture, city, townなどのカラムをもっている

```ruby
class Student < ApplicationRecord
  has_one : address
end

class Address < ApplicationRecord
  belongs_to :student

　　 def country_name
    "#{country}に住んでいます"
  end

  def prefecture_name
    "#{prefecture}に住んでいます"
  end

  def city_name
    "#{city}に住んでいます"
  end

  def town_name
    "#{town}に住んでいます"
  end
end
```

この場合**生徒の住んでいる市**を知りたい、とか**町だけ**の情報を取ってきたい時があるとすると、
普通だと
`student.address.city`　とか　`student.address.town`としなければなりません。

しかし、下記のようにdelegateメソッドを使用して移譲してあげると

```ruby
class Student < ApplicationRecord
  has_one :address

  delegate :country_name, :prefecture_name, :city_name, :town_name, to: :address
```

`student.city_name`　や `student.town_name`　で
生徒の市や町の情報を取得することができます。


今回の例のような形では使うことは少ないと思いますが、
複雑なメソッドを切り出したい時など、処理が複雑になってくると、
delegateメソッドは非常に使い勝手のいいメソッドだと思います。

ただ、影響範囲が見えずらくなるきっかけになるので、使いすぎには注意が必要そう。。。
OSとは何か

昨年海外に行き、様々な人たちに教わりました。

その後、技術そのものを見直す必要が出て、
OSって何だろう？と考えました。

海外の知見も加えて、OSとは何か、
ざっくりと説明します。

世界に、国を持たない人たちがいて、
国と国を行き来する必要がありました。
差別や迫害を受けることもある民族です。
彼ら彼女らは、貴金属や宝石など、
持ち運びできる財産を重要視します。

一方、財産が奪われても最後まで残るもの、
「頭脳」に注目します。
「頭脳」を鍛えることで、世界有数の知的民族に育った人たちが、

そうだ、「頭脳」のコピーができないのだろうか？

と考えます。

その「頭脳」の分身に当たる原型がOSです。
どのように作られているか非公開。商用OSが基本です。
UNIXなどです。

商用OSで、「頭脳」のコピーがどのように作られているか
気になった人たちがいます。

「頭脳」のコピーを「商用化」という縛りから解き放ったのが、
Linuxの産みの親、リーナス・トーバルズです。

「頭脳」派民族の独占物であったOSを、
Linuxが解放したのです。

どういう意味を持ちますか？というと、
OS製造者は、【仕様】を握ります。

例えば、OSが英語ベースで作られるということは、
英語圏の都合で【仕様】が決まっています。

非英語圏の都合は後回しにされることもありますし、
使い勝手も開発も検証も後回しにされることがあります。

もし、国産OSがあれば、
このパソコンももっと使いやすくなったのに、、、
※当時の事情は一旦省きます。

そういう不便の中で、
英語がわかる人たちは、ネイティブにプログラミングを使い、
わからない人たちは、
言葉の理解と使われ方の理解からはじめて、
「遠回りに」プログラミングを覚える。

そういう大人の事情が、IT業界の現状にあります。

商用OSも、良くできたオリジナルと、
「オリジナルの対抗馬としてできた」コピーOSがあって、

私は「オリジナルとの細かい仕様の違いが、性能の違いを生んでいる」
と仮説しています。

このOSという「頭脳」コピーの原型が、
現在のAIという考え方に引き継がれています。

「頭脳」コピーが、
全てのソフトウェアの土台としてのOSから、
プログラミングとしての人工知能AIに、
移行したのです。

OSの原型は、フォン・ノイマンという人が作っています。
ノイマン型コンピュータ、という単語だけ勉強される方もいます。

数学含め、多分野の「頭脳」派の天才の一人、
フォン・ノイマンが作っています。

OSは、特定民族の「独占」物だったのです。
Linuxが現れるまでは。

そういうわけで、OSには、
「一般の人には想像もつかない隠れ【仕様】がたくさん存在する」
と考えると、自然です。

今日はここまで、です。