OmniAICreator/Qiita-1.07M huggingface dataset:
Tensorflow2.x + JupyterLab Docker環境を作る

# Abstract
通常、Tensorflowの開発環境はJupyter Notebookですが、最近はJupyter Labがデファクトスタンダードになりつつある感じが個人的にあります。
自分のリマインダーも兼ねて、Docker設定周りをまとめてみます。
（Docker/docker-composeの導入はご自分の環境に合わせて予め導入をお願いします）

# Results
希望するディレクトリに以下のDockerfileとdocker-compose.ymlを作成します。
## Dockerfile
```Dockerfile:Dockerfile
# python3をベースにする
FROM tensorflow/tensorflow:latest-devel-py3

RUN apt-get update && apt-get install -y \
    curl \
    git \
    tree \
    vim
# RUN pip install --upgrade pip
RUN pip3 install --upgrade pip setuptools
RUN pip3 install jupyterlab
RUN pip3 install matplotlib # デフォルトのTensorflowにはmatplotlibがない！！ <- 実際に遊んでいて初めて気付きました。。
RUN jupyter serverextension enable --py jupyterlab

# 作業ディレクトリを指定
WORKDIR /workdir

# コンテナ側のポート番号
EXPOSE 8888

ENTRYPOINT ["jupyter-lab", "--ip=0.0.0.0", "--port=8888", "--no-browser", "--allow-root", "--NotebookApp.token=''"]

# Jupyterlabのルートとなるディレクトリを指定
CMD ["--notebook-dir=/workdir"]
```
## docker-compose.yml
```yaml:docker-compose.yml
version: '3'
services:
  dev:
    build:
      context: .
      dockerfile: Dockerfile
      # container_name: tf-container
    ports:
    - "8888:8888"
    volumes:
    - ./workdir:/workdir
```

# 起動
同ディレクトリ階層で下記のコマンドを実行します。

```
$ docker-compose up -d
```
初回は基盤イメージのDLから行われるので時間がかかります（作業ログがterminal内で表示される）が、次回以降はすぐに起動します。
無事に起動したら、localhost:8888でJupyter Labにアクセスできます。

上記の方法では、/workdirがローカルストレージと接続しているため、container / imageを後で削除しても作成したファイルは残ります。
後日、gpu対応に変更したり、TensorboardをJupyter Lab Extensionsで結合する処理をDockerfile内に追記してコンテナを再作成する等、行う場合も気兼ねなく環境を再編することができるので便利だと思います。

他にも良い書き方があると思います。Better ideaあれば教えて頂けると嬉しいです。
サーバ証明書の種類とそれぞれの違い（DV,OV,EV）

#概要
SSL証明書の種類とその違いについてまとめました。

#SSL（TLS）とは
SSLは、webブラウザでwebサーバーにアクセスするときに、データを暗号化して安全性を高めるための技術。

#SSL証明書の機能
####①暗号化機能
　…公開鍵暗号と共通鍵暗号の技術によって、通信を暗号化する
　　　→web上での取引によりデータ通信が発生するサイトでは、データが暗号化されないと第三者からユーザーの情報が漏洩してしまう。
####②サイト証明機能
　…第三者機関が電子証明書を発行することで、webサイトが本物であることを保証する
　　　→本物のwebサイトそっくりに作られたフィッシングサイトと見分けやすくなり、ユーザーに信頼感を与えることができる。

#証明書の種類
##クイック認証「DV」（Domain Validation）
####◎主な目的
・暗号化
####◎年額料金（目安）
・無料～数万円
####◎特徴
・ドメインを所有していることだけを確認
####◎用途
・暗号化や改ざん検知による安全な通信だけを実現したいときに利用
・個人サイトなど、本物証明がそこまで必要ないときに使うことが多い

##企業実在認証証明「OV」（Organization Validation）
####◎主な目的
・暗号化と実在性証明
####◎年額料金（目安）
・数万円～
####◎特徴
・運営組織が実在していることを確認
　→企業の登録情報確認や電話連絡で行う
####◎用途
・サイトの証明までしたいとき
　→しかし、DVとURLの表示が変わらないため、ユーザーからはわかりづらい

##EV認証証明「EV」（Extended Validation）
####◎主な目的
・暗号化と厳密な実在性証明
####◎年額料金（目安）
・十数万円～
####◎特徴
・運営組織が実在していることを厳格に確認
　→第三者機関のデータベースを使用して確認
　→ブラウザのURL欄に組織名と国名が表示される
####◎用途
・ユーザーに対して、きちんと実在性を示したいときに利用する


#まとめ
・SSL証明書の役割は、「通信の暗号化」と「サイトの存在証明」
・証明書の種類によって、認証局がwebサイトの存在を確認する度合いが異なる
　→高いやつほどユーザーからすると安心感ある

#参考サイト
以下のページを参考にさせていただきました。
https://www.idcf.jp/rentalserver/aossl/basic/ssl-type/
【備忘録】Android Studioで「Error:Kotlin: Unsupported plugin option: org.jetbrains.kotlin.android:enabled=true」が出たときの解消法

#はじめに
Android StudioのProblem欄に以下が表示されていました。
> Error:Kotlin: Unsupported plugin option: org.jetbrains.kotlin.android:enabled=true

正直なところ、このProblemが出たからといって、ビルドができないとか困っていたわけではないんですが、
ずっと表示されるのも嫌だったので解消方法を調べることにしました。

調べてすぐ解消できたのですが情報があまり多くなかったので、今後また同じProblemが表示されたときのために備忘録として残します。

#解消法
[stackoverflow](https://stackoverflow.com/questions/49789802/errorkotlin-unsupported-plugin-option-org-jetbrains-kotlin-androidenabled-tr)に答えが載っていた。
いくつか解消方法がある中で、自分が試したものを記載します。

1. 以下Kotlinフォルダを削除する
`~/ライブラリ/Application Support/AndroidStudio3.2/Kotlin`

2. Android Studioに戻り、Clean Projectを実行する

これでProblemから消えているはずです。

#おわりに
Android Studioで「Error:Kotlin: Unsupported plugin option: org.jetbrains.kotlin.android:enabled=true」が出たときの解消法でした。
備忘録として残すほどのことか？という感じはしますが…。
以上、備忘録でした。
iPadをサブディスプレイにする際に「Mountie+」を使ってみた

急にリモートワークになって環境が整えられてないまま仕事をしている方に向けてです。

# 対象
サブディスプレイが欲しいけど
・家のスペースがない方
・iPadが余っている方

# 背景
外部ディスプレイを買おうか悩んでいる時に、一つの方法に行き着いたのでご紹介

# ソリューション
お手持ちのiPadをサブディスプレイにしましょう！
iPadをサブディスプレイにする方法は2つ
Macならば [Sidecar](https://support.apple.com/ja-jp/HT210380)
Windowsならば [Duet Display](https://duetdisplay.com/)

# iPadのスタンドに「Mountie+」
PCとiPadを挟むクリップ
![Alt text](https://arigato-ipod.com/news-image/180323mountieplus.jpg)
https://www.amazon.co.jp/dp/B07BHKGSLH/ref=cm_sw_r_tw_dp_U_x_npeLEbZCGVR93
画期的な商品だけど値段がそれなりにするので躊躇します...

# 「Mountie+」の使用感
・iPad Proをサブディスプレイにして使っているが概ね良い
・画像ではディスプレイの右に付けているが、ディスプレイの上に付けられるが、バランスを取るのが難しい
・「Mountie+」のクリップの力が強いのでiPadのディスプレイ負荷がかかっている感じがする


# 感想
やはり、サブディスプレイがあるのとないのとでは全然違いますね
ドキュメントを読みながら作業できるので、サブディスプレイがあるだけでかなり効率があがります
VBAパスワード解除方法


```
Option Explicit

Private Const PAGE_EXECUTE_READWRITE = &H40

Private Declare PtrSafe Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As LongPtr, Source As LongPtr, ByVal Length As LongPtr)

Private Declare PtrSafe Function VirtualProtect Lib "kernel32" (lpAddress As LongPtr, _
ByVal dwSize As LongPtr, ByVal flNewProtect As LongPtr, lpflOldProtect As LongPtr) As LongPtr

Private Declare PtrSafe Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As LongPtr

Private Declare PtrSafe Function GetProcAddress Lib "kernel32" (ByVal hModule As LongPtr, _
ByVal lpProcName As String) As LongPtr

Private Declare PtrSafe Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As LongPtr, _
ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _
ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer

Dim HookBytes(0 To 5) As Byte
Dim OriginBytes(0 To 5) As Byte
Dim pFunc As LongPtr
Dim Flag As Boolean

Private Function GetPtr(ByVal Value As LongPtr) As LongPtr
    GetPtr = Value
End Function

Public Sub RecoverBytes()
    If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6
End Sub

Public Function Hook() As Boolean
    Dim TmpBytes(0 To 5) As Byte
    Dim p As LongPtr
    Dim OriginProtect As LongPtr

    Hook = False

    pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")


    If VirtualProtect(ByVal pFunc, 6, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then

        MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6
        If TmpBytes(0) <> &H68 Then

            MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6

            p = GetPtr(AddressOf MyDialogBoxParam)

            HookBytes(0) = &H68
            MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4
            HookBytes(5) = &HC3

            MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6
            Flag = True
            Hook = True
        End If
    End If
End Function

Private Function MyDialogBoxParam(ByVal hInstance As LongPtr, _
ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _
ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer

    If pTemplateName = 4070 Then
        MyDialogBoxParam = 1
    Else
        RecoverBytes
        MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _
                   hWndParent, lpDialogFunc, dwInitParam)
        Hook
    End If
End Function

Sub unprotected()
    If Hook Then
        MsgBox "VBA Project is unprotected!", vbInformation, "*****"
    End If
End Sub

```
![20170608171113.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197416/ba3da91c-d03a-a2ff-bad4-e502bbf4ab66.png)
下記の文章を転記

http://puu-0328.hatenablog.com/entry/2017/06/08/171725
Google Drive File Streamでクラウドへ移住

# はじめに
今回は、[Google Drive File Stream](https://support.google.com/a/answer/7491144?hl=ja)を使うことで、Google Drive内のファイルをローカルのドライブのように使うことが可能になります。
ちなみにDropboxでも同じようなことができます。
# 環境
MacOS Catalina
Windows10
# 使い方
[ドライブ ファイル ストリームを導入する - Google Support](https://support.google.com/a/answer/7491144?hl=ja)

macは、途中でセキュリティとプライバシーの設定が必要です。
[Mac版 ドライブ ファイル ストリーム で不具合が出た際の対処方法](https://ischool.co.jp/2019-05-20-drive-file-stream-bug-fix/)

# メリット
## powershellやターミナルからクラウド上のファイルの操作や実行が可能になる
いままでは、Google Driveからソースコードをダウンロードして使っていましたが、ローカルに置いているソースコードと同様、直接PowerShellやターミナルから実行が可能になります。
## テキストエディタでの編集も便利になる
ローカルに置いたファイルと同じように扱えるので、エクスプローラから直接開けます。

# まとめ
私は、ソースコードだけでなく、vagrantのローカル開発環境などもクラウド上にあげてから使ってます。こうすることで、ローカルの空き容量を広げることができ、他デバイスからも同じものが扱えるので、重宝しています。
[Django] createしたいモデルのフィールド数が多い時の対処法

# オブジェクトを作成したい

```python:models.py
from django.db import models

class Human(models.Model):
     name = models.CharField('名前', max_length=200)
     age = models.IntegerField('年齢', null=True, blank=True)

     def __str__(self):
         return self.name
```

普通Djangoでオブジェクトを作成するとき、以下のように書く。

```python
taro = Human.objects.create(name='太郎', age=30)
taro.save()

hanako = Human(name='花子', age=2)
hanako.save()
```

何の問題もないだろう。

# こんな時どうする？

```python:models.py
class TestModel(models.Model):
    field_1 = models.CharField('フィールド1', max_length=255)
    field_2 = models.CharField('フィールド2', max_length=255)
    ...
    field_50 = models.IntegerField('フィールド50', null=True)

    def __str__(self):
        return self.field_23
```

項目が50個あるCSVファイルから、DjangoのORMを通してDB投入したいというケース。
上のHumanモデルみたいにやろうとすると

```python
df = pd.read_csv('test_data.csv')

for _, row in df.iterrows():
    t = TestModel.objects.create(field_1=row[0], field_2=row[1], field_3=row[2]....)
```

50個も書くなんて正気の沙汰じゃない。

# 辞書にして展開しながら引数に渡す！

```python
df = pd.read_csv('test_data.csv')

for _, row in df.iterrows():
    dict_data = row.to_dict()
    t = TestModel.object.create(**dict_data)
```

スマート！

Pythonでは関数の引数にリストやタプル、辞書を展開しながら渡すことができる。

# 参考
https://note.nkmk.me/python-argument-expand/
Railsでbootstrapが効かない、destroyが効かない

Ruby on Rails初心者です。

Ruby on Railsでログイン機能付きの本の感想を登録できるアプリケーションを作成しています。

ログインしているユーザーが投稿した本の内容を削除できるようにdestroyメソッドを実装したのですが、エラーが出ないのに削除できないという現象に陥ってしまい、詰まってしまったのでここにメモしておきます。

今回の不具合として、
・destroyアクションが効かない、destroyボタンを押すとshowページにいってしまう
・bootstrap,CSSが効かない
という2点がありました。

まずコントローラーですが、

```books_controller.rb
def destroy
    @book = Book.find(params[:id])
    respond_to do |format|
        if @book.destroy
  		    format.html{redirect_to books_path, notice: "Book was successfully destroyed."}
  		    format.html{render :index}
  	    end
    end
end
```

という感じで、コントローラーのdestroyアクションも間違っていなさそう、、
また、bootstrapも調べた通りに行ったのですが、効きません、、
エラーが出なかったことで私はここで詰まってしまったのですが、そもそもの問題に気が付きました。

それは、「application.html.erbにheadタグやbodyタグなどを入れていなかった」ことです。

これは結構致命的で、基本的にhtmlの型に合わせて裏側でプログラムが走ってくれるので、htmlタグ、headタグ、bodyタグは必ずつけないとですね。笑

そこで、下記を追記しました。

```application.html
<!DOCTYPE html>
<html>
<head>
    <title>Bookers</title>
    <%= csrf_meta_tags %>
    <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
</head>
<body>
    (中略)
</body>
</html>
```

これを追記すると、destroyもbootstrapもきちんと動きました。超単純だった、、笑

エラーが出ないとどこが間違っているのか分かりにくいですが、意外と根本のところにミスがあったりするんですね笑
とても勉強になりました。


ちなみに、application.html.erb以外のviewファイルを読み込むためには、読み込みたい場所に

```application.html
<%= yield %>
```

を入れなければなりません。

私は初めこれを記述していなくて、なんでヘッダーしか表示されないんだよ！！！
と、ますます混乱したので(ド初心者)、忘れないように気を付けます笑
python環境設定のコピー

#Pythonの環境設定のコピー
別の環境に移行する時に現環境における設定をコピーするコマンドをメモリます．

```python
#現環境設定の書き出し
pip freeze > requirements.txt
#現環境設定のインストール（書き出したrequirements.txtを新環境にコピーして以下を入力）
pip install -r requirements.txt
```
html template

よく使うhtmlの枠。
bootstrap4入り。

```html
<!doctype html>
<html lang="ja">
  <head>
    <title>タイトル</title>
    <meta charset="utf-8">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
    <!-- 日本語フォント -->
    <link href="https://fonts.googleapis.com/css?family=Sawarabi+Gothic" rel="stylesheet">
    <style>
      body {
        font-family: "Sawarabi Gothic";
      }
    </style>
  </head>
  <body>
    <h1>あいうえおカキクケコ漢字</h1>
    <div class="alert alert-primary" role="alert">alert</div>
    <button type="button" class="btn btn-primary">Primary</button>
    <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
  </body>
</html>
```
【Day52】積み上げ日記

##予定
■カウントアップアプリ作成
■Udemy動画学習
■スッキリわかるJava入門本
−オブジェクト指向

##完了
■カウントアップアプリ作成
■Udemy動画学習


##学習時間
４h

##学習ポイント
■画面上部にbackできるボタン作る
view controller→Editor→Embed in →Navigation controller 

■変数
var = “値”

■定数
let = “値”

■変数と定数で扱うデータ種類
・整数　→　int型（整数）
・実数　→　Double型（小数点）
・文字列→   String型（文字列）
・真偽　→   Bool型（真か偽か）

var data1 : Int =1
※ 「：int」は省略可能！ 

■関数（メソッド）
func 関数名（）{
//このブロック内の仕事を発動
}
※関数名でこの動きの意味がわかる 

■クラスとオブジェクト
クラス　＝　設計図
オブジェクト＝動くもの（部品）

■IBOutlet
プログラム側からコントロールする時に使用
（目では見えないもの、内部で動かしたいとき）

■IBAction
ユーザー操作によって何かしたい時に使用

■処理を書くとき
①何がタップされた時の処理か
②どう中身を処理するか
③どう表示するか

##計画通り進んだか？
進んでいない。自分の完璧主義な部分が少し出ていて、わからない点を理解するまで先に進まない時間の使い方をしている。わからない点は一旦置いておいて、できるところを進んで行っていく。加えて、必要なところだけ補完して進むようにする。
ImageMagick で channel ごとの画像を指定して RGBA 画像を生成するメモ

## 背景

RGB 画像の特定の channel を入れ替えたい.

glTF で metallicGlossness texture を作りたい. B channel に metalness, G channel に glossiness を指定する必要がある.

## ImageMagick

https://www.imagemagick.org/discourse-server/viewtopic.php?t=13534

`-channel`, `-combine` あたりを使う.

元データが grayscale の場合

```
$ convert metalness.png glossiness.png -background black -channel GB -combine metallicRoughness.png
```

として, G に metalness.png, B に glosiness.png の RGBA 画像が生成できる. 

## TODO

* [ ] RGB(A) 画像の G channel を A に差し替えなど. `-channel-fx` を使うといけるか?
【Day51】積み上げ日記

##予定
■オンラインもくもく会
■Swift基礎動画学習

##完了
■オンラインもくもく会
■動画学習

##学習時間
２h

##学習ポイント
■変数と定数（Swift）
・Int
・String
・Float
・Bool

##計画通り進んだか？
進んだ。しかし、メソッドやらクラスがどの配置でどのように呼び出すのか、なぜこの記載方法なのかなど「わからないことがわからない」状態になっていたので、かなり混乱している。良い教材があれば、すすんで取り入れたい。
メモ: windows 10 開発環境の用意

* Windows 10 2004 にて確認

## WSL と Virtual Machine Platform の有効化

* PowerShellを起動し以下

```vb
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

```

* OS再起動


## Linuxをダウンロード

PowerShellにて以下

```
wsl -l
```

* https://aka.ms/wslstore

にアクセス。



* Microsoft Store から Ubuntu 18.04 をダウンロード
* Ubuntu を実行
    * User名とパスワードを設定


## Terminal をインストール

* [MobaXterm](https://mobaxterm.mobatek.net/)が一番使いやすいと感じた。
* ssh接続先で日本語が文字化けする場合はWSLのUbuntu側でLANGの設定が必要。

```sh
sudo dpkg-reconfigure locales
```

* ~/.bashrc に以下追記

```sh:~/.bashrc
export LC_ALL=ja_JP.UTF-8
export LANG=$LC_ALL
```

* 日本語フォントの見た目を良くする

![mobaxterm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/3ac0c705-13ab-45a7-7a6f-4cba15ac5dd6.png)


## VS Code の設定

* 文字コードを自動判別 (sjisを標準にもする)

![vscode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/c97fd835-9e88-054f-4825-cdf5157c0082.png)

入れた Extension

* Browser Preview

## RLogin

* http://nanno.dip.jp/softlib/man/rlogin

`RLogin.ini` があるとレジストリを使わない


## Windows 10 標準のsshクライアントを使う

* `C:\Windows\System32\OpenSSH\` にすでに入っている。
* 鍵は `.ssh\` に置く。


## Vagrant

* https://www.vagrantup.com/downloads.html
* 

## Docker Desktop (win10 proが必要) <= 古い

* https://hub.docker.com/editions/community/docker-ce-desktop-windows/

## Docker Toolbox

* https://github.com/docker/toolbox/releases


## Edge chrominium版 オフラインインストーラー

* https://www.microsoft.com/en-us/edge/business/download
tarコマンドのよく使う（個人的に）メモ

# ファイルのアーカイブ（新規書庫）
```bash
tar cvf アーカイブファイル名 [アーカイブするファイル]...
```
ただファイルを一つにまとめるだけ、容量は入れた分だけ増える。
# ファイルのアーカイブ（既存書庫への追加）
```bash
tar rvf アーカイブファイル名 [アーカイブするファイル]...
```
既存のアーカイブファイルにファイルを追加する。こっちも圧縮しない。
#ファイルのアーカイブ（新規書庫・圧縮）
```bash
tar czvf アーカイブファイル名 [アーカイブするファイル]...
```
ファイルを一つにまとめて(tar)圧縮(gzip)する。
これで書庫を作るとオプション-rで追記することが出来ない。
しかし、容量が減るので長期的かつ不変で保存するならばこの方がよい。

# アーカイブファイルの展開
```bash
tar xvf アーカイブファイル名
```
圧縮するのには、ひとオプション必要なのに、展開する場合は何故かこのコマンドで、tar(無圧縮)もtar.gz(圧縮済)も展開してくれた。なんで・・・。

#最後に
-vオプションは処理だけさせるなら別にいらない。
まあオマジナイみたいなもんだよね。

今日から古戦場です。
Visual Studio Code のタブのスクロールを高くする

# 概要
VSCodeでたくさんのファイルを開いた場合に、タブのエリアをスクロールが出来るのですが、そのスクロールの高さが狭すぎて困っていました。（スクロールしようとするとタブをつかんでしまう。）
スクロールの高さを高くできるようになったようです。下記のイメージです。
![settings.json-myext-Visual-Studio-Code-2020_04_13-19_06_41.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246278/50d13c6d-4f98-a167-a488-0db765f4ccce.gif)

https://code.visualstudio.com/updates/v1_44
version 1.44 にアップデートする必要があります。

# 方法
settings.json を開き下記を追加します。

```json
    "workbench.editor.titleScrollbarSizing" : "large"
```
以上です！
Vue.jsの基礎

# Vueインスタンスの作成
new VueでVueインスタンスを作成することができ、その中のel要素でhtmlのどこの部分をターゲットにしてVueを使用するか定義します。

```html:html
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<div id="app">
</div>
```

```javascript:JavaScript
new Vue({
  el: '#app'
})
```

# テンプレート構文とは
htmlに書いてある3行がテンプレートである。html書いているわけではなく、テンプレート構文を用いてテンプレートを書いている。Vue.jsがテンプレートを判断して、最終的にhtmlとして出力してる。

```html:html
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<div id="app">
  <p>{{ message }}</p>
</div>
```

```javascript:JavaScript
new Vue({
  el: '#app',
  data: {
    message: 'Hello World!'
  }
})
```

```:ブラウザ
Hello World!
```

# ディレクティブ
v-からはじまるviewの要素に特別な属性を付け加えられるもの。

# v-on
イベントが発生した瞬間に関数を実行したいという時に使用する。

```html:html
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<div id="app">
  <p>現在{{ number }}回クリックされています</p>
<button v-on:click="countUp">カウントアップ</button>
</div>
```

```javascript:JavaScript
new Vue({
  el: '#app',
  data: {
    number: 0
  },
  methods: {
    countUp: function() {
      this.number += 1
    }
  }
})
```

[![Image from Gyazo](https://i.gyazo.com/1368a109e135e03605fddb2a006fb3a4.gif)](https://gyazo.com/1368a109e135e03605fddb2a006fb3a4)


# v-bind
属性に対してdata内のurlプロパティなどを使って表示させるのに向いている。

```html:html
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<div id="app">
  <a v-bind:href="url">Google</a>
</div>
```

```javascript:JavaScript
new Vue({
  el: '#app',
  data: {
    url: 'https://google.com'
  }
})
```
[![Image from Gyazo](https://i.gyazo.com/01c432c643e5f1add813c3131d9da4c3.gif)](https://gyazo.com/01c432c643e5f1add813c3131d9da4c3)

# v-model
双方向データバインディング実現できる。dataとhtmlの双方向に影響します。htmlの値に変更があった場合、自動でdataの値を更新します。

```html:html
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<div id="app">
  <input type="text" v-model="message">
  <h1>{{ message }}</h1>
</div>
```

```javascript:JavaScript
new Vue({
  el: '#app',
  data: {
    message: 'Hello World'
  }
})
```
[![Image from Gyazo](https://i.gyazo.com/bd0bf31b916aa1542b6409a26f517cdc.gif)](https://gyazo.com/bd0bf31b916aa1542b6409a26f517cdc)

# 今回学習するうえで使用した環境
[JSFiddle](https://jsfiddle.net/boilerplate/vue) 
Vueだけに限らずReactなどの言語に関しても、アカウント登録なしで簡単にコードを試すことができます。
とても使いやすいのでぜひ使ってみてください！
[![Image from Gyazo](https://i.gyazo.com/af843ae76de1483e91e6975eba16c2d0.png)](https://gyazo.com/af843ae76de1483e91e6975eba16c2d0)

# 参考サイト
* [Vue.js](https://v1-jp.vuejs.org/)
【self,__init__(),super】Pythonのクラスの疑問解決！

# はじめに

Pythonのクラスを学んだときに持ちそうな様々な疑問とそれに対する回答をまとめてみました。間違い等ございましたら、コメントください。

# Q1: `self`とは何ぞや

Pythonではインスタンスのメソッドを呼び出したとき、そのインスタンス自身が第一引数に渡されることになっています。これを`self`という変数で受け取っているというだけのことなのです。`self`はただの名前だったのです。ちゃんちゃん

「ちょまてよ、メソッドを使うときわざわざ第一引数にインスタンスなんて渡したことないぞ」という疑問を持つ人もいるでしょう。`instance.function()`のような場合、第1引数にインスタンスが渡されることになっています。Pythonで決められているのは第1引数にインスタンスが入るということだけなので、別に`self`以外の名前を使ってもいいですよ。Pythonでは慣例的に`self`を使うようにしているようです。また、`class.function()`とした場合、引数は自動的に渡されません。この辺について[拙著](https://qiita.com/basashi/items/9d13fb6310b3f42363a3#%E7%AC%AC%E4%B8%89%E3%81%AE%E5%8B%98%E9%81%95%E3%81%84-%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AE%E9%96%A2%E6%95%B0%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99%E3%81%A8%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E7%AC%AC%E4%B8%80%E5%BC%95%E6%95%B0%E3%81%8C%E8%A3%9C%E5%AE%8C%E3%81%95%E3%82%8C%E3%82%8B)で解説しています。

# Q2: `__init__()`とは何ぞや

変な下棒がついてるからって敬遠しないで、意外と簡単！この下棒はアンダースコア、アンダーバーと言われます。前後に２つづつ付いているのは、Pythonにとってこの関数が特別な機能を持つことを表しています。特別な機能を具体的に説明すると、クラスがインスタンス化されたときに自動的に実行されるという機能です。その際、インスタンス化するときに括弧の中に書いた引数が、`__init__()`に引数として渡されます。ふつうはインスタンス変数の定義をするために使われます。

一般的にこのような機能を持つメソッドはコンストラクタと呼ばれます。

名前につくアンダースコアについてさらに知りたい方は[こちらの拙著](https://qiita.com/basashi/items/8c57eaf55daa57a847c7)もどうぞ

# Q3: クラス変数とインスタンス変数の違い

単純に、「クラスの変数に代入するか、インスタンスの変数に代入するか」の違いです。`instance.function()`とするか、`class.function()`の違いです。

```python
class Person:
    __init__(name. age):
        self.name = name
        self.age = age
```

上のコードのように、たいてい`__init()__`の中でインスタンス変数を定義しますが、インスタンスが入っている`self`の`name`と`age`に代入しているので、これはインスタンス変数を定義しています。もちろん、クラスからインスタンスを作った後で、`instance.function()`としても、インスタンス変数を定義しています。ちょっと回りくどい書き方ですが、下のコードのようにして`__init__()`内でクラス変数を定義することもできます。コンパクトな書き方を[こちらの拙著](https://qiita.com/basashi/items/9d13fb6310b3f42363a3#%E7%AC%AC%E4%B8%80%E3%81%AE%E5%8B%98%E9%81%95%E3%81%84-%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AF%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%98%E3%82%83%E3%81%AA%E3%81%84)で解説しています。

```python
class person:
    def __init__(self, class_, name):
        class_.name =  name

ken = person(person, "hoge")
print(person.name)
```

結果

```
hoge
```



クラス直下に書いた変数はそもそもクラスに所属しているのでクラス変数ですね。

# Q4: 継承ってどうやって使うんや？



クラス定義は最も単純に書くと

```python
class Food:
```

となりますが、

```python
class Food(item):
```

とすることで、クラスの親を指定することができます。

継承した場合、クラス内に存在するメソッド、クラス変数は引き継がれます。もちろん`__init__()`も引き継がれます。また、メソッドの機能を少し変えたい場合は、同じ名前のメソッドを定義することで上書きすることができます。もちろん新たなメソッドを定義することで、メソッドを追加することもできます。

`__init__()`も上書きすることで新たにインスタンス変数を決めることができますが、インスタンス変数の追加のみを行いたい場合は、`super().__init__()`を使うことで重複するコードを書かずに済みます。

# Q5: `super()`って何ぞや

`super()`の引数にクラスを与えると、親クラスが返ってきます。クラスの中で使用すると引数を与えなくても自動的にそのクラスが与えられます。よく使われるのは、親クラスのコンストラクタを呼び出すときです。`super().__init__(name,price)`と書くのですが、selfを書かなくていいのは、通常のメソッドがselfを書かないのと同じと考えていいと思います。

# Q6: .pyファイルってどうやって分ける？(超個人的見解)



基本的には1.pyファイル1クラスでやる。その他によく使う処理をまとめたファイルを一つ作ってもいい。それらをコントロールするファイルも必要になる。
IQ Bot の誤り検知：型による誤り検知

[IQ Bot](https://qiita.com/IQBotter/items/fab5f59230ff38a98bbd)のマッピング設定画面では、取得項目に対して型を指定することができます。

このページでは、IQ Botの項目の型指定についてまとめていきます。

#型指定のやりかた

取得項目の型は、マッピング設定画面の以下の場所から「データタイプ」のリストを選択することで指定できます。
![型指定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/851126f3-e3d2-1c03-7dd2-930eafde23c4.jpeg)

#型指定は何のために行う？

IQ Botで型を指定するのは、**誤りの検知のため**です。
誤り検知については[こちらの記事](https://qiita.com/IQBotter/items/4e220a9bd6e337de4508)に詳細をまとめていますので、そちらを参照してください。

よくある勘違いとして、型を指定することでOCRに対して正解の母数を限定させて精度を上げるような仕組みをイメージする人がいるようですが、IQ Botの型指定はそういう意味合いではなく、あくまでも**誤り検知のための機能である**という点がポイントです。

以下の表にも記載しましたが、number型を指定しておくとゼロとオーなど、数値か文字かきわどい項目を若干数値に寄せて読んでくれるそうですが、１００％ではありません。

また、date型を指定しておくと、たとえばOCRが「12 F<font color="Red"><b>3</b></font>B 2015」のように読んだ結果を「12 F<font color="Red"><b>E</b></font>B 2015」のように読み替えてくれる機能があるそうですが、これも特定のパターンに対してだけ有効で、日付に**１００％寄せて読んでくれる機能ではない点に注意してください。**

#選択できる型の種類

|型|説明|
|:-----------------|:------------------|
|text|ドメインを「その他」で指定した場合、デフォルトはこの型になっています。<br>あらゆる文字を許容するので、**text型を指定しておくと、型としての誤り検知はしない**という意味合いになります。<br>(パターン指定による誤り検知は可能)|
|date|入ってきた値が日付であれば許容し、それ以外であれば誤りとして検知します。<br>YYYY/MM/DD型だけではなく、13.Apr.2020のような書式など、幅広い書式に対応しており、**和暦にも対応。**<br>[IQ Botのdate型が対応している和暦表記の一覧](https://qiita.com/IQBotter/items/1d9ed784fbf35361ffb7)|
|number|入ってきた値が数値であれば許容し、それ以外であれば誤りとして検知します。**整数でも小数でもOK。**<br>number型を指定しておくと、桁区切りのカンマや、¥,$,¢,£,€などの通貨単位は除外されます。<br>(xx円の"円"は除外されないので、除外したい場合は[カスタムロジック](https://qiita.com/IQBotter/items/1d8e7c77ad47e838476c)を利用)<br>number型を指定しておくと、ゼロとオーなど数値か文字かきわどい項目を若干数値に寄せて読んでくれるそうです（１００％ではない）。|
|checkbox|この型を指定しないとチェックボックスの抽出ができません。<br>この型を指定してチェックボックスを抽出すると、チェックの有無がYesかNoで返ってきて、チェックボックスを認識できなかった場合はNo checkbox found.という値が返ってきます。<br>**ただし、これ以外の値が入ってきても型違反としての検知はされません。**|
|checkbox group|checkbox型の項目をグループに囲んでCSVを見やすくするための型。あまり使うことはないと思いますが、そのうち別途記事を書くかもしれません。|

#まとめ

- IQ Botのマッピング設定画面では、項目に応じて型を指定することができる
- 型を指定すると、その型に該当しない値が入ってきたときに[誤り検知](https://qiita.com/IQBotter/items/4e220a9bd6e337de4508)をしてくれる
- 指定できる型にはtext,date,number,checkbox,checkbox groupがある
pytorchのインストール

#pytorchのインストールコマンド
pytorchのインストールに少し手間取ったのでメモを残します．
環境は以下のようになります．
OS:Windows10
Python3.6.6
Pytorch==1.1.0
Torchvision==0.3.0

単純に以下のように入力すればいいかと思いきや

```python
pip install torch
pip install torchvision
```

tools.nnwrapのModuleNotFoundErrorが出てインストールできずバージョン指定も意味がなかった．

うまくいったコマンドはこちらです．

```python
pip install https://download.pytorch.org/whl/cu90/torch-1.1.0-cp36-cp36m-win_amd64.whl
pip install https://download.pytorch.org/whl/cu90/torchvision-0.3.0-cp36-cp36m-win_amd64.whl
```
Wi-Fiに繋いだMacから有線LAN経由で他の端末とインターネット共有する方法

ちゃお・・・†

※この記事はあまりソフトウェア開発者向けのものではありません。

# はじめに
この記事を書いている現時点 (2020/04/13) では、新型コロナウイルス感染症 (COVID-19) が流行していて、感染を防ぐために様々な会社がリモートワーク (あるいはテレワーク) による勤務をするようになりました。しかしその一方で、リモートワーク用のパソコンを用意することが難しい会社もあるそうです。その中には有線LAN接続でしかネットワークを利用出来ないデスクトップパソコンしか用意出来ない会社があります。さらに、これまで4GやWi-Fiなどの回線しか使っていない方々が、リモートワークのために光回線などの固定回線を利用するために回線の工事まで何日も待たされることがあります。

そのため、固定回線の工事が終わるまでの繋ぎとして、縛りなしWiFiなどのモバイル回線サービスを一時的に利用してリモートワークするケースがあります。しかし、こうしたサービスでは有線LANポートが付いていないモバイル回線利用端末を貸与されることがあります。

そこで、この記事では有線LANポートが付いていないモバイル回線利用端末から有線LAN接続でしかネットワークを利用出来ないデスクトップパソコンなどを接続するための方法を記します。

# Wi-Fiに繋がっているMacから有線LAN接続で他の端末とインターネットを共有する方法
ここでは、Macのパソコンを持っている方を前提とします。Macを持っていない方は

## 画面の左上の林檎マークをクリックしてシステム環境設定を選ぶ
<img width="287" alt="cap 2020-04-13 17.30.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48207/899be380-2e9f-2920-18b3-6b0ef93d2313.png">

## システム環境設定から共有を選ぶ
<img width="670" alt="cap 2020-04-13 17.31.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48207/ddc15a69-f24a-1d4c-5618-34c58f2aa073.png">

## インターネット共有での設定
<img width="671" alt="cap 2020-04-13 17.32.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48207/ca380294-f1c1-dce2-d355-ebedd4ffd9d5.png">

1. `共有する接続経路` からWi-Fiを選ぶ
2. `相手のコンピュータでのポート` から有線LANっぽいものをONにする

これで無線LANが使えないパソコンでもWi-Fiが使えるはずです。

もし手元のMacに有線LANポートがなかったり、USBなどで有線LANを繋ぐデバイスを持っていない場合は、Amazonなどの通販サイトで "USB 有線LAN mac" と検索しましょう。候補の中で "Mac OS対応" あるいは "MacBook対応" などと書かれているものが良いと思います。最近のUSB-CしかないモデルのMacでしたら "[Anker 5-in-1 プレミアム USB-Cハブ](https://www.amazon.co.jp/dp/B07NRYRNC5/)" をおすすめします。これは、有線LANポートや4K対応HDMI出力ポートやmicroSD&SDカードスロットや2つのUSB-Aポートなど色々なものを接続できるので便利です。わたしも使ってます。

# Macを持っていない方へ
Amazonなどの通販サイトで "無線LAN 中継器" と検索しましょう。そして有線LANポートの付いてるものを買って、設定をすれば多分大丈夫だと思います (無線LAN中継器使ったことないので憶測です)

# 最後に
残念ながら、日本ではCOVID-19に対する対応が遅れているので長期戦となる可能性があります。なので、なるべく早めに感染リスクを下げる行動をするように意識しましょう。また、二度とこのような事態にならないように、有権者は非常事態でも責任を持ってくれそうな頼りになりそうな方/政党へ選挙時に投票しましょう。
通称visually-hiddenについて

## これはなに
アクセシビリティ対応意識でのマークアップとして非常に利便性のある通称`visually-hidden`というCSSスニペットがあります。
Qiitaで検索した際に特段ヒットしなかったので備忘録件、皆さんもぜひ使ってみてください！

## どういう恩恵があるか
視覚的には要素を見えないように非表示にしたいけど、スクリーンリーダーでは読ませたい場合。
`visually-hidden`を書いてclassをつけるだけで視覚的にだけ表示させなくできます。
メリットはこれだけではないと思いますが。(SEOとか)

## どういう時に使えるか
デザイン上はない、ブラウザの表示上いらない要素だけどHTMLの構造をきちんと書く場合です。
例えば見た目明らかに見出しコンテンツ(h2,h3)に見えるけどやむを得なくh2,h3でマークアップできない状況や、
インプットフォームでlabel要素が、デザイン上テキストが無い時にスクリーンリーダーでは読み上げさせることができます。

- `display:none`は読み上げはされません。
- `visibility: hidden`は要素のスペースができてしまう。
- `visually-hidden`は読み上げができてスペースはできません。

汎用性があるのでいろいろな場面で活用できると思います。

## コード
```css
/**
 * Makes elements visually invisible but still accessible to screen-readers.
 *
 * This Css has been carefully tested to ensure screen-readers can read and
 * activate (in case of links and buttons) the elements with this class. Please
 * use caution when changing anything, even seemingly safe ones. For example
 * changing width from 1 to 0 would prevent TalkBack from activating (clicking)
 * buttons despite TalkBack reading them just fine. This is because
 * element needs to have a defined size and be on viewport otherwise TalkBack
 * does not allow activation of buttons.
 */
.visually-hidden {
  position: fixed !important;
  /* keep it on viewport */
  top: 0px !important;
  left: 0px !important;
  /* give it non-zero size, VoiceOver on Safari requires at least 2 pixels
     before allowing buttons to be activated. */
  width: 4px !important;
  height: 4px !important;
  /* visually hide it with overflow and opacity */
  opacity: 0 !important;
  overflow: hidden !important;
  /* remove any margin or padding */
  border: none !important;
  margin: 0 !important;
  padding: 0 !important;
  /* ensure no other style sets display to none */
  display: block !important;
  visibility: visible !important;
}
```
*コード内容更新しコメントも残しておきます。class名はそのまま。
越智さんありがとうございます！

## おわりに
とても便利なスニペットですが、もちろんただ使えば良いわけではないのできちんとスクリーンリーダー対応するならスクリーンリーダーでのコンテキストをきちんと確認してから使用しましょう！！

### 参考
- https://coliss.com/articles/build-websites/operation/work/guidelines-to-improve-web-accessibility.html
- https://frasco.io/writing-css-with-accessibility-in-mind-4fc82b26aecb
- https://github.com/ampproject/amphtml/blob/2e9a940e78df8de38a6c06a0772aeaa4839a24d1/css/ampshared.css#L164-L194
Test source folder 'src/test/java' in project 'プロジェクト' must have an output folder that is not also used for main sourcesとなった時の対応方法

- 環境
    - CentOS Linux release 7.6.1810 (Core) 
    - Eclipse Version: 2019-03 (4.11.0)

# 事象 : EclipseのプロジェクトでMavenの`Update Project...`をしたら怒られた

```text
Test source folder 'src/test/java' in project 'プロジェクト' must have an output folder that is not also used for main sources
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/e8145ccf-a58a-ecb3-b9cf-17de27238a97.png)



# 原因 : `.classpath` に設定されている `path`のディレクトリがないから
- 参考
    - [eclipse - How to fix the error &quot;test source folder &#39;src/test/java&#39; in project &#39;mahout-flink_&#39;must have an output folder that is not also used for main source&quot;? - Stack Overflow](https://stackoverflow.com/questions/51608935/how-to-fix-the-error-test-source-folder-src-test-java-in-project-mahout-flin)
    - [Mark test source folders · Issue #677 · eclipse/xtext-eclipse](https://github.com/eclipse/xtext-eclipse/issues/677)

最初は`path="src/test/java"`のある`classpathentry`タグの`output`に書いてある`target/test-classes`がないのが原因かと思ったが・・・
プロジェクトのプロパティを見ると赤バツのついていて「(missing)」となっているのが`src/test/resources`だったのでこのディレクトリがないことに気が付いた。
SVNからGitへ移行する時に空ディレクトリを漏らしてしまったようだ・・・

```xml:.classpath
...省略...
    <classpathentry kind="src" output="target/test-classes" path="src/test/java">
...省略...
    </classpathentry>
    <classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
...省略...
    </classpathentry>
...省略...
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/4ba4c29f-6b53-6781-c0a8-5fe1312a54cd.png)

## 対応 : 必要なディレクトリを作成する
1. 必要なディレクトリを作成する
2. [Project] > [clean]
1. 今一度Mavenの`Update Project...`をする
IQ Bot：date型が対応している和暦

[IQ Bot](https://qiita.com/IQ_Bocchi/items/26c4a7065e4c8e64a427)の項目に対して指定できるdateという型は、なんと和暦に対応していました。

A2019.11で試した結果を以下にまとめます。

#IQ Botが対応している／対応していない和暦の一覧

「対応有無」が〇のものは対応している（この形式であれば誤りとならない）、×は対応なし（この形式は日付と認定されず誤りとして検知してしまう）という意味です。

以下の表にない形式はテストしていないので、わかり次第アップします。
「この形式はどうなんですか？」と思ったら、編集リクエストをください。

|日付の形式|対応有無|補足説明|
|:-----------------|------------------|:------------------|
|2020年4月13日|〇|通常のYYYY年MM月DD日形式|
|令和2年4月13日|〇|元号つきでもOK|
|R2年4月13日|〇|元号をアルファベット表記しても大丈夫|
|R2/4/13|〇|元号のアルファベット＋スラッシュ区切りでも大丈夫|
|R2.4.13|〇|元号のアルファベット＋ドット区切りでも大丈夫|
|令2年4月13日|〇|元号を最初の１文字に略記しても大丈夫|
|令和元年5月1日|×|「元年」という表記には対応していない<br>→[カスタムロジック](https://qiita.com/IQBotter/items/1d8e7c77ad47e838476c)を使って「元」を「1」に置き換えれば日付として扱い可能|
|令和元年5月末日|×|「末日」という表記には対応していない<br>→[カスタムロジック](https://qiita.com/IQBotter/items/1d8e7c77ad47e838476c)を使って「末日」を具体的な日付に置き換えれば日付として扱い可能|


#補足

- 元号は明治まで対応（慶応以前は誤りとして検知）
- 元号的にありえない日付（令和1年4月30日や昭和65年など）は違反として検知**しない**
- 漢数字や全角表記には対応していない（[カスタムロジック](https://qiita.com/IQBotter/items/1d8e7c77ad47e838476c)による置換が必要）
- 年、月、日の途中に半角スペースが入っても大丈夫だが、全角スペースが入ると型違反になる
コロナウイルスに伴う現金給付対象者かんたん測定ツールを作った話

#はじめに
**「30万円の現金給付の対象者ややこしすぎん？」**
ネットニュースを見ててそう思い、今回アプリケーションを作ることにしました！！
技術的な話ではないですが、リモートワークの息抜き程度に読んでみてください:raised_hand::raised_hand:


**「コロナウイルスに伴う現金給付対象者かんたん測定ツール」**
https://coronavirus-cash.herokuapp.com/

#アプリケーション概要
<img width="1431" alt="スクリーンショット 2020-04-12 22.06.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501638/2811ed3e-c4b8-12f5-3f1c-f14c9a39da96.png">
<img width="1425" alt="スクリーンショット 2020-04-12 22.06.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501638/ac8dc6b3-448f-3f1e-909e-60ee415b077e.png">

**「世帯人数と月収を入力すれば、自分が現金給付の対象者かわかるアプリ」**
それだけです！！はい。これだけのアプリです。
ロジックは基本if文で条件分岐を繰り返してるだけの超簡単アプリです。

とりあえず普段使い慣れているRailsで作ろうと思って、
気がついたら*rails new*してましたが、Rails使うまでもありませんでした（笑）
vueとかでSPAにすればよかったかな、、、と思いますね（笑）

#経緯
###菊水酒造
「高知県の菊水酒造が消毒用アルコールと全く同じ度数のアルコールを販売し始めました。」
TVでニュースを見ていて私は釘付けになりました。
詳しくはネットで検索するか[この記事](https://www.itmedia.co.jp/business/articles/2004/09/news124.html)を読んでみてください。


**簡単説明すると、菊水酒造というお酒メーカーが飲料用として消毒用アルコールと全く同じ成分の物を2ヶ月くらいで製造/販売しはじめたらしいのです。**

ご存知の通り、消毒用アルコールはドラックストアでもスーパーでも品切れ状態で市場に出回っていません。
その事態をなんとかしようと、
小さな酒造メーカーが短い期間で独自に製造/販売することに踏み切ったのです。
（医薬用だと検査にかなり時間がかかるため、飲料用で販売したそう、、、）

この菊水酒造という会社は2018年の西日本豪雨で多大な被害を被り、
一時は会社が潰れかけたらしいのですが、
たくさんの人の支援と暖かい声のおかげでなんとか会社を立て直すことができたそうです。
一度は潰れかけた会社を救ってくれた世間になんとか恩返しがしたいと思っていて、
今回の英断を行うことになったそうです。

**湿っぽい話とか熱い友情物語とか苦手な私ですが、正直結構心を打たれました。**
（外出自粛で心が弱ってるんですかね？歳のせいですかね？（笑））

*「多くの人が力を合わせて頑張っている！！」*
*「僕にできることはないかな？」*
ちょっと考えてみようとおもいました。
自分がこの文章を後から見返したら気持ち悪いなと思うかもしれませんが、この時は本気で思いました。

そこで出来たのがこのアプリです。

###現金給付
**「結局私は30万円貰えるの？貰えないの？」**
私のように感じた人は結構多いはず。
実際周りの友人でも困惑していた人が多かったです。

詳しい基準はここで説明する必要もないと思うので、
ニュース等を検索してみてください！！

この現金給付対象者を簡単にわかるツールを作ろうと4/10(金)の夕方に思い、実装をはじめました。
そして次の日、4/11(土)の夕方にリリースしました。

**できるだけ早く、かつ多くの人に使ってもらいたいと思ったので、
「入力ページはできるだけ少なく」「迅速に実装する」ことを念頭において開発しました。**

結局UIもシンプルで、入力項目や表示項目もできるだけ少ないアプリケーションになりました。

デプロイもherokuで行い、リファクタリングとかもせずコードを書きました（中身ぐちゃぐちゃすぎて見せられないです（笑））

#アクセス
<img width="1142" alt="スクリーンショット 2020-04-12 23.25.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501638/5546b5c5-adce-af59-cc40-8a7d38eaddcb.png">
公開してすぐに自分のtwitterで周知しました。
**ありがたいことにちょこちょこリツイートしてもらえ、一時間くらいで50ユーザーくらい？の方に使ってもらえました**:raised_hand::raised_hand:

#今後は？
結構コロコロ現金給付の基準を国が変えています。
明日、明後日にはまた基準が変わっているかもしれません。
その度に改修していこうと思います。

**実際に使ってみて不満や改善点があればどしどしコメントください！！待ってます！！
また、多くの人に使ってもらいたいのでtwitterのリツイートやQiitaのいいねもしていただけると幸いです**:relaxed::relaxed:


**「コロナウイルスに伴う現金給付対象者かんたん測定ツール」**
https://coronavirus-cash.herokuapp.com/

#おわりに
最近家から出てなさすぎて狂いそうになってきました、、、
焼肉かお寿司食べたいです:meat_on_bone::sushi:

#追記（2020/04/18）
<img width="1173" alt="スクリーンショット 2020-04-19 12.25.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501638/a42bb41d-519c-a2a7-6230-38b447ce7b8f.png">
**Qiitaのデイリートレンドに掲載してもらった効果もあって、計1000アクセスほどしていただけました！！！**
ありがとうございます:boy::boy:

しかし、、、
現金一律10万円給付に伴って、30万円の給付が無くなりそうですね、、、
う〜ん。なんだろ、、、
嬉しさ40%悲しさ60%ってかんじですね。

作ったアプリケーションが3日でゴミになった僕は明日からどんな顔をして開発していけばいいのでしょうかね？:relaxed::relaxed:
そんなこともありますね。
精進します、、、:crossed_swords::crossed_swords:
mac ターミナルでjpgとpngの圧縮

homebrewを使ってmacのターミナルでjpgとpng画像を圧縮する方法。
## jpg
homebrewで**jpegoptim**をインストール。

```terminal
$ homebrew install jpegoptim
```
```terminal:インストールの確認
$ homebrew list
```
### コマンド
ファイル名を指定すればOK

```terminal
$ jpegoptim filename.jpg
```
```terminal:画質を0〜100で指定。数字が大きいほど画質が荒くなる。
$ jpegoptim -m50 filename.jpg
```
```terminal:最適化
$ jpegoptim -strip-all filename.jpg
```
```terminal:指定バイト以上のファイルサイズの画像のみ対象(100kb以上)
$ find . -type f -name "*.jpg" -size +100000c | xargs jpegoptim -m50
```

## png
homebrewで**pngquant**をインストール。

```terminal
$ homebrew install pngquant
```
### コマンド
ファイル名を指定すればOk。
ただしオプションを指定しないと**新しいファイルが作成される**。

```terminal
$ pngquant filename.png
```
```terminal:上書き指定
$ pngquant --ext .png --force filename.png
```
```terminal:ファイル名の指定
$ pngquant --ext -new.png filename.png
```
出力はfilnename-new.pngとなる

```terminal:圧縮率指定
$ pngquant --quality=65-80 filename.png
```
```terminal:圧縮スピードを1〜10で指定。10が最も圧縮率が高くスピードが速い
$ pngquant --speed 1 filename.png
```
FlutterをWindows10に導入してみる 

#初めてのネイティブアプリ開発
業務でReactを使ったWebアプリ開発を行っている。
趣味や興味あるネイティブアプリを開発したいと思っていた。
コロナウィルスの感染拡大により私の勤務する会社でもリモートワークとなり
通勤時間の減った分を個人の開発に充てることにした。
Androidユーザであるが、アプリはAndroid/iOSどちらでも使えるものを作りたい。
クロスプラットフォームを採用して進めてみることにする。

##開発環境の選定
業務でReact/JavaScriptを使っているためReactNativeをまずは考えてみたけれど、、、

###Flutter
2019年よく聞いたこのパワーワードに惹かれた。
言語はdart、もちろん使ったことがない。
けど、C#やJAVAによく似てるとか似てないとか。
C#経験者なのでなんとなくかけるんじゃないかなというノリでこれから始めてみる^^

##初投稿
今回が初投稿。
他の方の記事はよく見るが、自分で記載すると大変だなと感じました。
ABC備忘録[ABC158 C - Tax Increase] (Python)

>#問題文
消費税率が$8$%のとき$A$円、$10$％のとき$B$円の消費税が課されるような商品の税抜き価格を求めてください。
ただし、税抜き価格は正の整数でなければならないものとし、消費税の計算において小数点以下は切り捨てて計算するものとします。
条件を満たす税抜き価格が複数存在する場合は最も小さい金額を出力してください。また、条件を満たす税抜き価格が存在しない場合は$-1$と出力してください。

>#制約
$0\leq A\leq B\leq 100$
$A,B$は整数である

[C - Tax Increase](https://atcoder.jp/contests/abc158/tasks/abc158_c)

#解法
求める価格を$N$としたとき、条件から$0.08N=A,0.1N=B$が成り立つような$N$を求めればよい。よって求める価格をループで回して総当たりで試していく。
$0\leq A\leq B\leq 100$の条件があるのでループの回数は$10000$を上限にする。


```Python
A, B = map(int,input().split())

for i in range(10000):
  if int(i * 0.08) == A and int(i * 0.1) == B:
    print(i)
    exit()
    
print(-1)
```
Paizaのスキルチェックで使えるメソッド集

よく忘れる標準入力関係とかPaizaで使えるメソッドメモ。


## gets
- 入力した値の後ろが改行される。

```ruby
name = gets 
puts "私の名前は" + name + "です"
```
```
=> 佐藤
   私の名前は佐藤
   です
```




## gets.chomp
- chompをつけることで入力値の後ろの改行をなくす。

```ruby
name = gets.chomp 
puts "私の名前は" + name + "です"
```
```
=> 佐藤
   私の名前は佐藤です
```




## split
- カンマや空白で区切られた文字列から、splitメソッドを使って配列を作る。(使用頻度高め)

下記のように一行で入力した情報を配列にしたい時などに使用。

```
# 標準入力時
佐藤 鈴木 高橋 山本 田中
```
```ruby
users = gets.chomp.split
p users

=> ["佐藤","鈴木","高橋","山本","田中"]
```

#### paizaでよく使うsplitの使い方いろいろ
たとえば友達の人数と名前と年齢を表示するプログラムを組む際、

```
3
田中 ２１
高橋 18
坂本 24
```
のように入力しなくてはいけない場合、

```ruby
num = gets.to_i
num.times do
  s = gets.chomp.split(" ")
  print "名前： #{ s[0] } , 年齢： #{ s[1] }\n"
end

```
とする。



## map
- 配列の要素の数だけブロック内の処理を繰り返し、結果として作成された配列を返す。

```ruby
name = ["1", "2", "3"]
name.map{|n| n.to_i}
=> [1,2,3]

# 上と同じ結果になる
name.map(&:to_i)
=> [1,2,3]
```

## chars
- 文字列に対して使用でき、string.charsとすることで文字を１文字ずつ分割する。

```ruby
number = 12345
p number.to_s.chars.map(&:to_i)
=> [1,2,3,4,5]
```


## digits
- integerに使えるメソッドで、数字の各桁を取り出したい時に使う。数字は逆からになる。

```ruby

number = 123456
p number.digits
=> [6,5,4,3,2,1]
```

digitsを使わないやり方だと少し遠回りになる

```ruby
number = 123456
p number.to_s.chars.map(&:to_i).reverse
```

## transpose
- 列と行を入れ替えるメソッド。
- 縦の票の合計とか計算するのに使える。

```ruby
ary =[[1, 2],
      [3, 4],
      [5, 6]]

p ary.transpose
=>[[1, 3, 5],[2, 4, 6]]
```

## count
- 引数を渡さない場合はレシーバの要素数を返す。
- 引数を１つ指定した場合はレシーバの要素のうち引数に一致するものの個数をカウントして返す(一致は == で判定)。
- ブロックを指定した場合は、ブロックを評価して真になった要素の個数をカウントして返す。

```ruby
ary = [1, 2, 4, 2]
ary.count             # => 4
ary.count(2)          # => 2
ary.count{|x|x%2==0}  # => 3
```




## 上記メソッドを使用した応用
### 配列の中に特定の数字が2個あるか確認(にじ)

```ruby
array = [[1,2,4],[3,3,5]]
if array.map{|a| a.count(3)}.count(2)
```
Uno Platform 入門

ということで、技術書典で出そうと思ってた Uno Platform 入門ですが将来的に検索結果にひっかかったりしたほうが有用かな？と思ったので PDF や ePub などの単一ファイルではなく Qiita 上の記事として公開することにしました。

対象となる Uno Platform はバージョン 2.1 を使っています。

以下の 4 記事構成となります。

- [Uno Platform 概要](https://qiita.com/okazuki/items/d0af3b35ba65c4d6c663)
- [Uno Platform 基本](https://qiita.com/okazuki/items/b81bd6d66b4ae6997534)
- [XAML について](https://qiita.com/okazuki/items/aa16b2d5daa0e170408f)
- [Uno Platform 応用 & Tips](https://qiita.com/okazuki/items/893d1af0e998244be711)


今回技術書典向けの書籍を書くにあたっては以下の 3 人でチームを組んで行いました。

- ひらりんさん([@himarin269](https://twitter.com/himarin269))
- ちょまどさん([@chomado](https://twitter.com/chomado))
- かずき(私)([@okazuki](https://twitter.com/okazuki))

素敵な機会をありがとうございました。
CSSのリストマークの消し方

##リストマーク
HTML上で黒点が出てしまうことです。
例えばHTMLの記述だけだと以下の場合だと
HTML

```index.html
<ul>
 <li>aaa</li>
 <li>bbb</li>
 <li>ccc</li>
</ul>
```
・aaa
・bbb
・ccc
と表示されてしまいます。
なのでCSSで
CSS

```stylesheet.css
li{
  list-style: none;
}
```
と記述すると
aaa
bbb
ccc
となります。
formボタンを押しても動かない際の対処法【原因はturbolinks・<div class="actions">】

こちらの記事の通りでした。
https://qiita.com/d0ne1s/items/5a4122d2972be3812986

備忘録としてtturbolinksの無効化方法を自分用にメモします。


環境
Rails6.2.0

###Gemを削除し、bundleupdateする

```
#gem 'turbolinks', '~> 5'
```



```
$ bundle update
```

###application.jsを編集する


```app/assets/javascripts/application.js
//= require turbolinks #この行を削除
```

###2箇所の'data-turbolinks-track': 'reload'の部分を削除する

```app/views/layouts/application.html.erb
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>

<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>

```

###formを編集する

form_withを使って作成したformがある場合、全てのformにlocal:trueオプションをつける必要があります。

###これでも動かない際の対処

```<div class="actions"></div> ```でformボタンを囲んだところ、うまく動く場合があります。
マークダウン記法って、いつ使うの？①

# 後でしょ。それもかなり後でしょ。

と思ったあなた。

ビジネスマンとして、特にエンジニアとして活躍したいのであれば

### 今すぐ使うクセつけたほうがいいですよ


なぜか。


マークダウン記法には*ものすごい可能性*が秘められているからです。


#### 1. 要点がつかみやすい

文章ってそもそも、相手に伝わってなんぼですよね。伝わる文章って、要点が明確になってます。じゃあ、どうやって要点を明確にするか。シンプルに。

- **文字を太字にする**
- **`背景をつける`**
- **箇条書きにする**

でいいんです。

上の文章をマークダウンを使わずに書くと、以下のようになります。

1. 要点がつかみやすい

文章ってそもそも、相手に伝わってなんぼですよね。伝わる文章って、要点が明確になってます。じゃあ、どうやって要点を明確にするか。シンプルに。

文字を太字にする
背景をつける
箇条書きにする



### いかがでしょうか？

全然違いますよね。私も今まで使う機会が少なかったのですが、このQiitaの記事を通じて、マークダウンマスターになります！

すみません、こんなとこで切ります！w

###### 第二弾、近日更新しまーす！
Ruby CGIプログラムを条件分岐で実行させる方法

Rubyで作ったプログラムをWebプログラムとして動作させる方法を書いていきます。
###CGIとは
Webサーバーと連携してプログラムを動作させる仕組みです。
ブラウザからWebサイトへアクセスがあった場合、CGIプログラムでは、コンテンツを動的に変化させて表示させることができます。

###RubyのCGIで条件分岐
ある変数の状態で真か偽かを判定し、条件に合わせた処理を実行させます。Rubyでは、if (elsif) else でそれぞれの条件に合わせた処理をコーディングします。

```ruby

if cgi.has_key?('dog')# フォームに 'dog' という変数(ハッシュ)があるときに真
  cgi.out("type" => "text/html", "charset" => "UTF-8") {
  # 情報の目印とした"dog"のデータを cgi['dog']と言う記述で取り出し、ローカル変数に代入する
    get = cgi['goya']
    # HTMLでレスポンスを返却する
      "<html>
        <body>
          <p>あいうえお</p>
          文字列：#{get}
        </body>
      </html>"
  }
elsif cgi.has_key?('dog1')
  cgi.out("type" => "text/html", "charset" => "UTF-8") {
    get = cgi['dog1']
      "<html>
        <body>
          <p>かきくけこ</p>
          文字列：#{get}
        </body>
      </html>"
  }
elsif cgi.has_key?('dog2')
  cgi.out("type" => "text/html", "charset" => "UTF-8") {
    get = cgi['dog2']
      "<html>
        <body>
          <p>さしすせそ</p>
          文字列：#{get}
        </body>
      </html>"
  }
end
```
key?メソッドで変数（ハッシュ)の中にキーがあるかを判定し、あった場合にif以下のブロック内の処理を実行します。
else以下のブロックは処理されないため、表示されません。
【文系向け・教師なし学習】　クラスタリングと次元削減について解説

機械学習は「教師あり学習」と「教師なし学習」に大別されます。

この記事では、「仕事では使わないけれど最近はやりの機械学習について何となく知っておきたい」という方でも理解できるように、「教師なし学習」について基本的な説明を行います。

「教師あり学習」について知っていた方が理解がスムーズかと思いますので、
「まだ知らないよ」という方は[こちらの記事](https://qiita.com/undead_ban/items/f62bf9ace1d0cd7bc193)をご覧ください。

#### この記事の内容
- 教師なし学習とは
- クラスタリングについて
- 次元削減について

## 教師なし学習とは
教師なし学習とは、コンピュータに「正解となるデータ」を与えない学習方法のことです。

教師あり学習では、訓練データを与えることによって、コンピュータに「知識を与える」ことが必要でした。一方、教師なし学習では、人間があらかじめ何かを教えることはありません。

データの分析や情報の抽出といった場面で活躍することが多く、
「処理したいデータを渡せば、あとは難しい計算を勝手にやってくれる！」というイメージです。
以下におおまかな手順をまとめておきます。

#### 教師なし学習の手順
1. 学習アルゴリズムを選ぶ
2. 処理したいデータをコンピュータに渡す
3. 分析や情報処理をコンピュータが行い、その結果を受け取る


<br/>
教師なし学習が使われる場面として、
・**クラスタリング**
・**次元削減**

があります。

これらについて具体例を挙げながら以下で解説していきます。


## 教師なし学習 ①クラスタリング
クラスタリングとは、教師なし学習を通してデータをいくつかのグループに分けることを指します。

例えば、動画配信サービスの利用者を、閲覧履歴などから数種類のグループに分類する場合などが想定されます。クラスタリングを行うことによって、分類された利用者ごとに最適な「おすすめ動画」を表示できるといったメリットが想定されます。

クラスタリングには、「**階層型クラスタリング**」と「**非階層型クラスタリング**」の2種類があります。

###階層型クラスタリング

階層型クラスタリングは、以下のような樹形図型の分類を行うクラスタリングです。

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616177/0e851101-9ffc-50e0-76fe-4572434868e4.png)

与えられたデータに対して、似ているデータ同士を同じクラスターとして分類し、クラスター同士の類似性によって樹形図を作成します。



階層型クラスタリングの仕組みについては少々煩雑なので省略しますが、気になる方は[こちらの記事](https://www.albert2005.co.jp/knowledge/data_mining/cluster/hierarchical_clustering)をご覧ください！

階層型クラスタリングの特徴は、**人間が結果を視覚的に理解しやすい点**です。
「動画ジャンルの好み」のように、ある程度まとまりを持ったデータを処理するのは得意ですが、「動画に対するコメント」などのランダム性の強いデータや莫大な量のデータを処理するのは苦手としています。

後者の場合には、次に説明する非階層クラスタリングが一般的です。


### 非階層型クラスタリング

一方、樹形図型ではなく、いくつかの対等なグループに分けたい時には「非階層型クラスタリング」を使用します。

![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616177/588c7c2f-506d-631c-c2bb-e05010552148.png)


非階層型クラスタリングでは、幾つのグループに分けたいのか人間があらかじめ設定する必要があります。設定した数に応じて、グループ間の違いができるだけ大きくなるようにクラスタリングを行います。


「ある漫画に対するコメント」のような**境界線が曖昧で漠然としたデータや、ランダム性が高いデータなどを、強制的に何種類か分けたいといった場面**で利用されます。一方、人間には「なぜこんな風に分かれたの」とわかりにくいことも多いのがデメリットです。


非階層型クラスタリングの仕組みについても省略しますが、気になる方は[こちらの記事](https://www.albert2005.co.jp/knowledge/data_mining/cluster/non-hierarchical_clustering)をご覧ください！





## 教師なし学習 ②次元削減

次元削減とは、教師なし学習を通して「変数の数を減らす」ことです。
例えば、気温や降水量、土の中のカリウムの量などのトマトの生育に関する100種類のデータがあるとしましょう。この中から、重要な情報がどれなのかを抽出したいとします。

こういった時に、次元削減によって100個から5個のデータに減らせばたくさんのメリットが生じます。
・ ほとんど影響のない質の悪いデータを排除できる
・ データ数が減ることによって、人間が把握しやすくなる
・ コンピュータにとっても計算しやすくなる

次元削減の際には、100個のデータから重要な5個を選ぶのではなく、100個のデータを使って新しく5個のデータを生成します。この新しいデータを**潜在変数**と呼びます。

今回はイメージしやすいように、「2個のデータを1個にする」際の次元削減を例にみてみましょう。

トマトの赤さと甘さの関係をプロットすると、以下のようになったとします。
「赤いトマトほど甘い」という傾向がわかりますね。

![jigen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616177/553c28da-e186-e8da-66a0-d157d6fd3c33.png)

点の分布を見ると、左下から右上に一本の帯ができているのがわかります。
この帯に沿う形で、新しい軸を下のように引いてあげます。

![jigen2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616177/eaf8d09e-4046-8ca9-dfa2-9acc9d637f54.png)

この新しい軸は「赤さと甘さ」を同時に評価できるモノサシです。
このモノサシのメモリを読むことによって、新たな数値「赤くて甘い度」が得られます。
「赤くて甘い度」を新たな潜在変数とすれば、「赤さ」と「甘さ」の2つのデータを1つに減らすことができます。
このように複数のデータの内容を1つにぎゅっと凝縮することが次元削減のおおまかな流れです。


## まとめ
- 教師なし学習は訓練データのない機械学習で、クラスタリングや次元削減などに使われる。
- クラスタリングは、データをいくつかのグループに分類する手法。樹形図型に分類するのが階層型クラスタリング、並列関係のグループに分類するのが非階層型クラスタリング。
- 次元削減によって、情報密度の濃い少数の変数に置き換えることができる。
Maya でテクスチャの UV Set を切り替えるメモ

## 背景

* ベイク用と, shading 用で, テクスチャの UV を分けたい
  * shading は shading 用の UV を使い, 結果をベイク用の UV で焼き付けたい
  * たとえば, shading では procedural な UV を使っているとか, ベイクではゆがみの少ない UV を使いたいとか.
  
## テクスチャが使う UV を切り替える.

Attribute Editor でお手軽にはできず, Relation editor などを使います.

https://knowledge.autodesk.com/support/maya/learn-explore/caas/CloudHelp/cloudhelp/2017/ENU/Maya/files/GUID-6D11C4C7-F72C-425A-BCC8-0FF6C9C72966-htm.html

## その他

使っている texture が多くなってきたら, マテリアルを別で作るのも手かもしれません.

幸いなことに, Arnold の Render to texture では, Shading に使うマテリアルを, `Shader overrde` で指定することができます.

https://docs.arnoldrenderer.com/display/A5AFMUGJPN/Render+Selection+to+Texture
設定を間違ってfork爆弾的なものを作ってしまった話

# 事の顛末

## ターミナルを全画面で開きたい
```bash
gnome-terminal --maximize
```
で最大化したターミナルを開く

## 端末を開いたら全画面表示のターミナルが開くようにしたい

![Screenshot from 2020-03-19 19-26-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350506/9ddc861f-68dc-376e-378d-7dca2f6f99b4.png)

こんな設定をした

## どうなったか

1. ターミナルを開く
2. `$SHELL`の代わりに`gnome-terminal --maximize`が実行される
3. `gnome-terminal --maximize`で開かれたターミナルで2が実行
4. 以降繰り返し（開いた端末はそのまま）

[Fork爆弾](https://news.mynavi.jp/article/dont_run_on_linux-6/)的なものができてしまい、かつ最大化されたターミナル画面でGUIの設定を開けない状況になってしまった

# 直し方

1. gnome-ternimal以外のターミナルで`dconf dump /org/gnome/terminal/ > ~/tmp`

/org/gnome/terminal/はターミナルの設定が書いてあるdconfデータベース（よくわかってない）
2. 書き出した`~/tmp`を編集


```diff:tmp
+ use-custom-command=false
- use-custom-command=true
```

3. データベースを書き換え`dconf load /org/gnome/terminal/ < ~/tmp`

多分`dconf write`でも書き換えられるがキーの指定がうまくいかなかったため、こんな方法を取った。

# やりたかったことはこうやったらできた

```bash:bash
touch ~/.config/autostart/gnome-terminal.desktop
cat << EOS >> ~/.config/autostart/gnome-terminal.desktop
[Desktop Entry]
Exec=gnome-terminal --maximize
Type=Application
EOS
```
【ReactNative】run-androidでINSTALL_FAILED_VERSION_DOWNGRADEエラーが出る

# 概要
`react-native`で開発をしていると割と遭遇する事象なので備忘として。

# 何が起きたか
例えば、製品に何らかのバグが発生したとの報告を受けたので、とりあえず`Git`から製品版のソース(以下`product`)を取得してきて再現させた場合を想定。

```
git checkout product
react-native run-android
```

バグが再現されることを確認したので、ブランチ(以下`xx-hogehoge`)を切ってそちらで作業することにした。

```
git checkout xx-hogehoge
react-native run-android
```

ここで下記のエラーが発生。

```
* What went wrong:
Execution failed for task ':app:installDebug'.
> com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: INSTALL_FAILED_VERSION_DOWNGRADE
```

なんだかよく分からないエラーがズラーっと表示されてビルドが通らない。

# INSTALL_FAILED_VERSION_DOWNGRADEとは
もうそのまんまの原因なのだが、今まさにインストールしようとしているアプリのバージョンが、
端末にインストールされているアプリのバージョンよりも古いため**「ダウングレードはできない」**と怒られている状態です。

`GitLab CI/CD`を使って`product`に何らかのコミットが適用される度にバージョンをインクリメントするような運用を取っており、`product > xx-hogehoge`というバージョン関係になっているため発生した次第でした。
※そもそも`product`をローカルでがちゃがちゃ動かすのがあまり良くはないですね・・・
備忘録　lan内にラズパイでsmtpサーバ(postfix)を立てる方法　gmailでリレー

# 動機
自宅でwebアプリを立てようとおもいまして、認証機能でメールを送る必要があるのでlan内にsmtpサーバーを立てようと思ました。しかし、op25bなどが障壁となり、また、debian系でpostfixを立てたという情報が少なく、なかなかてこずったので大雑把にまとめておきます。
# 手順
１、postfixのインストール、sasl暗号化のためのモジュールインストール（apt install libsasl2-modules sasl2-bin)　libsasl2-modulesをインストールしてなくてかなりてこずりました
２、ルーターのポート開放&転送（５８７番）
３、サーバーのポート開放（ufwで)
４、postfixの設定を以下の参考サイトをもとにやる
５、sasl暗号の設定など
６、gmailのアカウント設定で安全性の低いアプリを許可する
７、必要なサービスを起動する（とくにsaslauthd)
８、
mail hogehoge@hogehoge.com
subject 
内容
.

# 無事成功しました

# 参考にしたサイト

https://mseeeen.msen.jp/how-to-relay-from-postfix-to-gmail/

http://wpress.biz/blog/2016/09/18/postfix%E3%81%A7gmail%E3%81%AB%E9%80%81%E4%BF%A1%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B/

https://ayokoyama.hatenadiary.org/entry/20061207/p1

http://blog.livedoor.jp/hiroumauma/archives/1477658.html

https://centossrv.com/op25b.shtml