OmniAICreator/Qiita-1.07M huggingface dataset:
RailsアプリのAPM

## APMってなに？
アプリケーションにとってパフォーマンスは重要な数値で、パフォーマンスが悪ければ、サービスの離脱率にも影響があります。APMとはアプリケーションのパフォーマンスを測定することで、処理が遅い部分や、想定外の動作による速度低下を発見し、修正することです

## 測定ツール
Railsでよく利用されるGemとして、「Skylight」や「rack-mini-profiler」があります。
今回は、ローカル環境でも動かしたかったので、後者を選択しました。
めちゃくちゃ簡単です。

__公式ドキュメント__
[Skylight](https://www.skylight.io/support/getting-started)
[MiniProfiler](https://github.com/Miniprofiler/rack-mini-profiler)
# 開発環境
macOS Big Sur 11.3.1
ruby 2.6.5
rails 6.0.0
bundler 2.2.11

## 実装
基本的には公式ドキュメント通りです。
①Gemをdevelopment環境に追加

```Ruby:Gemfile
gem 'rack-mini-profiler', require: false
```

追加後は忘れずにbundle install

②必要なファイルを作成するために、ターミナルで以下のコマンドを実行

```Linux:ターミナル
user@macmini app_name % bin/rails g rack_profiler:install
Running via Spring preloader in process 56493
create  config/initializers/rack_profiler.rb
```

③rails surverを起動して動かすと、画面左上にプロファイルが表示されるようになります
コンピュータ基礎①

コンピュータ基礎概念の理解のためにまとめました。
参考になる部分があれば幸いです。
長くなると理解が追いつかないので、シンプルにまとめています。
少しずつ、コツコツ投稿していきます。


#コンピュータの中身ってどうなっている？
一般的なコンピュータ（普段私たちが使っているWindowsやMacなど）は、基本的に5つの装置で構成されています。

①中央処理装置（制御装置・演算装置）
CPU(Central Processing Unit)
コンピュータの中心となるもの。
これがないとコンピュータは使い物にならない。
形状としては画像のようなものになります。
![Qiita]https://www.google.com/search?q=cpu&sxsrf=ALeKk03WwFe9jN0O68HN6msbsK4gAbgnfQ:1622847223952&source=lnms&tbm=isch&sa=X&ved=2ahUKEwjX4rqCif_wAhX3zIsBHZuzA8sQ_AUoA3oECAEQBQ&biw=1067&bih=744#imgrc=hvXZXewCqbgbEM!

・制御装置では、プログラムの命令を解釈して、コンピュータ全体の動作をコントロールする役割を担う。

・演算装置では、四則演算をはじめとする計算、データの処理を行う。
　ALU(Arithmetic and Logic Unit)とも呼ばれる。

②記憶装置
主記憶装置、補助記憶装置がある。

・主記憶装置：データを一時的に保存するところ。
　「メモリ」が一番有名。
※メモリに関しては範囲が広いため、別記事で扱うことにします。

・補助記憶装置：データを長期的に保存するところ。
主記憶装置ではコンピュータの電源を切るとデータは消えてしまいますが、補助記憶装置の場合は初めから長期保存を前提に作られているので、電源を切ってもデータが消えることはありません。
例：CD-ROM, DVD-ROMなど

③入力装置
コンピュータにデータを入力するための装置
例：キーボード、マウス、スキャナ

④出力装置
コンピュータのデータを出力するための装置
例：ディスプレイ、プリンタ


#コンピュータの中のデータやプログラムはどんな風に流れているの？
文字では複雑で分かりづらいと思うので、画像を参考にしていただけるとイメージが掴みやすいかと思います。
![Qiita]https://www.google.com/search?q=cpu%E3%80%80%E6%B5%81%E3%82%8C&tbm=isch&ved=2ahUKEwiQhbyDif_wAhXky4sBHTPBCSIQ2-cCegQIABAA&oq=cpu%E3%80%80%E6%B5%81%E3%82%8C&gs_lcp=CgNpbWcQAzIECAAQGDoCCAA6BAgAEAQ6BggAEAgQHjoGCAAQBBAYUJ_BP1jGzT9guNE_aABwAHgAgAGTAYgBvAaSAQMxLjaYAQCgAQGqAQtnd3Mtd2l6LWltZ8ABAQ&sclient=img&ei=-q66YJCgA-SXr7wPs4KnkAI&bih=744&biw=1067#imgrc=baW-O8cHFuUDfM
C#のExpressionTreeでin/ref/outパラメータを使う

C#のExpressionTreeでrefやoutの引数を使うときは`Type.MakeByRefType()`を使う。

ActionやFuncは使えないのでdelegateを定義する必要があることにも注意。

```cs
/// <summary>
/// ExpressionTree経由でTargetMethodを呼び出すだけのサンプル
/// </summary>
public class Test
{
    /// <summary>
    /// ExpressionTree経由でTargetMethodを呼び出して結果を出力する
    /// </summary>
    public void InvokeTargetMethodWithExpressionTree()
    {
        // 呼び出すメソッド情報を取得
        MethodInfo methodInfo = typeof(Test).GetMethod(nameof(TargetMethod));

        // out引数を定義(MakeByRefTypeを使う)
        ParameterExpression valueArg = Expression.Parameter(typeof(int).MakeByRefType());

        // ExpressionTreeでdelegateを作成
        TestDelegate compiled = Expression.Lambda<TestDelegate>(
            Expression.Call(
                Expression.Constant(this),
                methodInfo,
                valueArg
            ),
            valueArg
        ).Compile();

        // 呼び出して結果を出力
        compiled.Invoke(out int intValue);
        Console.WriteLine($"intValue={intValue}");
    }

    /// <summary>
    /// ExpressionTreeで呼び出されるメソッド
    /// </summary>
    public void TargetMethod(out int value)
    {
        value = 100;
    }

    private delegate void TestDelegate(out int value);
}
```
パスワードに使ってはいけない記号

# パスワードに使ってはいけない記号

　パスワードを推測されにくいものとする、という口実で記号を入れることが推奨されている。ただしどうやら誰かの思いつきを無批判的に踏襲しているようで、なぜなら使ってはいけない記号があることについて誰も述べていない。
　パスワードとしては使えるが、実運用では使えないという記号、あるのだ。
;（セミコロン）
である。

　セミコロンを含むパスワードに変更は可能である。が、シェルスクリプトはそれを扱ってくれない。シェルは論理的には２行に渡る入力を物理的に１行で受け付ける事ができる。そのとき;（セミコロン）を改行の記号とみなす。つまりシェルへの命令の中に;（セミコロン）があればシェルはそこで２行に分けて取り扱うのだ。
　であるからシェルスクリプト中で「パスワードを入れてログイン（リモートなりsuなりで）」している場合、そのパスワードに;（セミコロン）が入っていると、;（セミコロン）までを一つの命令とみなし、つまり間違ったパスワードを入力したと判断するのだ。;（セミコロン）のあとに'del *'があるなんてパスワードでなくて本当に良かった。

　実績のあるシェルスクリプトがいきなり止まって！なぜだろう？１分で気がついたことは褒めてくれ、ひょっとしてパスワードに制御文字が入っているのではなかろうか？でもエスケープシーケンスを使えば行けそうな気がするだろ。;（セミコロン）だけはダメみたいだ。コーテーションでくくっても受け付けてもらえない。

　ではなぜパスワード変更は受け付けたのか？疑問が湧くよね。簡単だ、シェルを通してないからだ。つまりpasswdコマンドでパスワードを変更しようとすると、そのときターミナル画面に出てくるのは
```
新しいパスワード：
新しいパスワードを再入力してください：
```
である。ここで見慣れたプロンプト、つまり（シェルやユーザーによって違いはあるが）
コマンドを打つのはここだよ、と表示される#とか$とかいう文字がパスワード変更では出てこない。つまりシェルを通してないのだ。だからシェルでは行の切れ目とみなされる;（セミコロン）があっても受け付けてくれるわけである。

　このくらいのこと誰か警鐘を鳴らしているかと思ったのだが、いない？まあ無意識的に避けるだろうなあ。事実上の素人でなければ。

　ということで
　&（アンパーサンド）, ;（セミコロン）、 `（バックコーテーション）、'（シングルコーテーション）、"（ダブルコーテーション）、\（バックスラッシュ）、|（パイプ）、~（チルダ）、<（リダイレクション）、>（リダイレクション）、{（ブレイス）、}（ブレイス）は避けたほうが無難でしょう。
　え、bashのメタ文字はもう１種あるでしょって？
　確かに()があるのだが、記号の読みを書く時に使っちゃって・・・これがメタ文字が生まれた理由なのだろうなあ。

　これ、UNIXの世界特有のものかもしれません。でもそれ以外の人にも知っといてほしいと思って最後まで伏せておきました。なのでUNIXを使わない人も、パスワードにはそれ以外の記号を使うようにしましょう。（UNIXからWindowsにシェルスクリプトでログインすることはまずないと思いますが。）

　それでも*（アスタリスク）を使いたいという人はいなだろうなあ。
BastilleBSDでLinux環境

BastilleBSDを使ってjail自体をLinux環境(LinuxJails)にする事もできるようです。私の場合、gccなどのツールが動けばよい事と、Linuxのコマンドに不慣れなのでバイナリ互換機能(Linuxulator)の方が便利です。

普通のLinuxバイナリ互換のjailを作ってみます。

```
% sudo bastille create c7jail 13.0-RELEASE 192.168.10.51
% sudo bastille template c7jail develop/setup
% sudo bastille pkg c7jail install linux_base-c7
```

以前はlinux_base-c6を使っていましたが13Rではc6は無くなったようなのでc7にしてみました。

ホストのrc.confでlinux_enable="YES"しておけばこれで完了です。

```
% sudo bastille console c7jail hiroki
> file mips-linux-gcc
mips-linux-gcc: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, for GNU/Linux 2.2.5, stripped
> ./mips-linux-gcc -v
Using built-in specs.
Target: mips-linux
Configured with: RSDK Builder release 1.5
Thread model: posix
gcc version 4.4.5-1.5.5p4 (GCC) 
```

newlib-2.5.0.20171222をコンパイルしてみました。

|OS|CPU|TIME|
|:--|:--|:--|
|FreeBSD|Core i5-460M 2.53GHz/2コア/4スレッド 64bit(Arrandale)|701秒|
|Debian|Celeron D 335J 2.8GHz/1コア/1スレッド 32bit(Prescott)|2400秒|

CPUのスペックがまったく違うので比較になりませんが目安です。

newlibはパラレルビルドに対応しているようで、Core i5でj8を付けてnewlib-3.0.0.20180831をビルドしたところ389秒でした。newlibはconfigureがいろいろ使われていて、これはシングルで実行しているようなので、4スレッドでも半分以下にならないのかもしれません。

ホストではLinuxバイナリ互換を使わない場合はrc.confにlinux_mounts_enable="NO"を入れておくと良いです。

Linuxのプログラムでprocfsを使用している場合は、bastille editでmount.procfsを追加しておく必要がありました。
メモ: Swagger

## Swagger

```sh
# WebUI
docker run -d -p 8002:8080 swaggerapi/swagger-ui

# Editor
docker run -d -p 8003:8080 swaggerapi/swagger-editor
```

### docker-compose.yml

```yml
swagger-editor:
  image: swaggerapi/swagger-editor
  ports:
    - "8003:8080"

swagger-ui:
  image: swaggerapi/swagger-ui
  ports:
    - "8002:8080"
  volumes:
    - ./swagger/test.json:/test.json
  environment:
    SWAGGER_JSON: /test.json
```

## VSCode

* Visual Studio CodeにはSwagger Viewer（プラグイン）がある
Import "requests" could not be resolved from sourcePylancereportMissingModuleSource



##現象
importの失敗

```
Import "requests" could not be resolved from sourcePylancereportMissingModuleSource
```
pipしても、既にあると表示

```
pip install requests
Requirement already satisfied: requests in  ***************
```

pathの確認↓


```py
import sys
import pprint
for place in sys.path:
    print(place)
```

##原因

Python2系と3系が混在していて、VSコード内部でターミナルを起動したため、Python2系を参照していた
（ターミナル単体で起動すると、Python3系を呼ぶのでややこしい...）

##解決方法

VSコードの`Setting`に`python.pythonpath`と検索
`python`を`python3`に変更する
1,000円前後で利用可！おすすめのレンタルサーバー

<h2>1,000円前後で利用できるおすすめのレンタルサーバー</h2>

<h3>エックスサーバー</h3>

【おすすめポイント】
・国内シェアナンバーワン
・独自ドメインの永久無料サービスあり
・運用実績が長く情報量が多い
・高スペックでコストパフォーマンスが高い
・アクセス集中時も安定稼働
・自動バックアップと復元が無料
・セキュリティ強度が高い
・初期費用無料
・10日間の無料お試し期間が付いている

<h3>mixhost</h3>

【おすすめポイント】
・独自ドメインの永久無料サービスあり
・HTTP/3に対応（国内初）
・ストレージにSSDを採用して読み込みが早い
・高スペックでコストパフォーマンスが高い
・WebサーバーにLiteSpeedを採用していて表示速度が速い
・安定稼働
・自動バックアップと復元が無料
・初期費用無料
・30日間返金保証制度あり
・アダルトサイトの運営もOK

<h3>Conoha WING</h3>

【おすすめポイント】
・独自ドメインを2つまで永久無料で利用できる
・国内レンタルサーバー最速
・ストレージにSSDを採用して読み込みが早い
・高スペックでコストパフォーマンスが高い
・安定稼働
・初期費用無料
・WordPressの有料テーマ（JIN、SANGO、THE SONIC）を割引価格で利用できる

<h3>ロリポップのハイスピードプラン</h3>

【おすすめポイント】
・格安サーバーの代表格
・独自ドメインの永久無料サービスあり
・36ヶ月契約だと550円で利用でき、長期利用に最適
・WebサーバーにLiteSpeedを採用していて表示速度が速い

<h3>さくらのレンタルサーバ</h3>

【おすすめポイント】
・WordPressが高速動作
・安定稼働
・2週間の無料お試し期間あり

参考：<a href="https://www.xserver.ne.jp/">エックスサーバー</a>
参考：<a href="https://mixhost.jp/">ミックスホスト</a>
参考：<a href="https://www.conoha.jp/wing/">Conoha WING</a>
参考：<a href="https://www.sakura.ne.jp/">さくらのレンタルサーバ</a>
参考：<a href="https://lolipop.jp/">ロリポップ</a>
plunkerでvue その47

#概要

plunkerでvueやってみた。
練習問題、やってみた。

#練習問題
ipアドレスを表示せよ。

#サンプルコード

```
Vue.createApp({
  el: '#app',
  data() {
    return {
      ip: 'ここにIPが表示されます'
    }
  },
  methods: {
    getIp() {
      this.ip = 'IPを取得しています';
      axios.get('https://httpbin.org/get').then((response) => {
        this.ip = response.data.origin;
      }).catch((reason) => {
        this.ip = 'IPの取得に失敗しました';
      });
    }
  }
}).mount('#app')
```

#成果物

https://embed.plnkr.co/plunk/9i2MVKTibbrLIPfZ


以上。
【Ruby on Rails Tutorial】HerokuにデプロイしたらApplication error[H10 (App crashed)]が発生したときの対処法

#はじめに
Ruby on Rails チュートリアルに沿って学習を進めていました。
エラーが発生した際の対処方法をメモしておく。

#環境
Cloud9
Ruby 2.6.3
Rails 6.0.3


#現象
1.5.2にて、HerokuへRailsアプリケーションをデプロイしてページを開こうとすると、エラー画面が表示された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1382306/2114cd42-d628-7d62-0510-d1a341446d54.png)

#結論
database.ymlを下記のように書き換えた

```config/database.yml
# SQLite. Versions 3.8.0 and up are supported.
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
#
default: &default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: db/test.sqlite3

production:
  <<: *default
  adapter: postgresql  #追記
  database: db/production.postgresql #修正後
  # database: db/production.sqlite3 #修正前
```

#解決までの流れ
####ログを確認する
エラー画面にログを見ろと書かれていたので、確認してみることに。

```
$ heroku logs -t
```

結果はこちら

```
・・・
2021-06-04T19:28:08.413724+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=infinite-earth-10732.herokuapp.com request_id=07713d54-3627-4199-8471-a0611bacfb48 fwd="36.2.154.134" dyno= connect= service= status=503 bytes= protocol=https
2021-06-04T19:28:08.683679+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=infinite-earth-10732.herokuapp.com request_id=ae2b39f4-9b4d-44c3-a769-3b37dd15dc51 fwd="36.2.154.134" dyno= connect= service= status=503 bytes= protocol=https
```

error code=H10,　App crashedと言われた。
よくわからないのでググってみると、エラーの詳細内容を確かめるためにHeroku上でコンソールを開くことが出来るとのこと。
これも試してみます。

```
$ heroku run rails c
```

結果はこちら

```
・・・
/app/vendor/bundle/ruby/2.6.0/gems/bundler-1.17.3/lib/bundler/rubygems_integration.rb:408:in `block (2 levels) in replace_gem': 
Error loading the 'sqlite3' Active Record adapter. Missing a gem it depends on? sqlite3 is not part of the bundle. Add it to your Gemfile. (LoadError)
```

どうやらsqlite3まわりが原因のようだ。
引き続きネットで情報を検索すると、以下の情報を発見。

[https://tex2e.github.io/blog/ruby/rails-on-heroku](https://tex2e.github.io/blog/ruby/rails-on-heroku)

これやん！！！ってことで、`database.yml`を修正しました。

#原因
Ruby on Rails チュートリアルでは、Herokuで使うデータベースとの競合を防ぐため、
production環境では、sqlite3ではなく、PostgreSQLを使用する。
Gemfileではそのように指定したが、database.ymlではsplite３を使用するようになっていた。
その不一致が原因ではないかと考えています。
（詳細はチュートリアルの1.3.1や1.5.1を参考に）

どこかでチュートリアルの手順を間違えてしまっていたのかもしれませんが、
無事エラーが解決されて満足です。
SSLを導入する意義

<h2>SSLを導入する意義</h2>

SSLを導入する意義についてまとめました。

・ブラウザとサーバ間での通信データの暗号化
・Googleの検索ランキングへ影響
・HTTP/2を利用できる

<h3>ブラウザとサーバ間での通信データの暗号化</h3>

ブラウザとサーバ間での通信データを暗号化することで安全なWEBサイトの運用が可能になる。

<h3>Googleの検索ランキングへ影響</h3>

HTTPS通信はGoogleランキングのシグナルになっていて、SEO効果を期待できる。
ただ、検索ランキングへの影響はそれほど大きくはない。

<h3>HTTP/2を利用できる</h3>

HTTPS通信により通信プロトコルHTTP/2を利用できる出来るようになる。
HTTP/2はHTTP/1よりも効率的な通信でサイトの高速化を期待できる。

参考：<a href="https://knowledge.sakura.ad.jp/7734/?_ga=2.63607279.1735223377.1622838131-415344951.1622838131">普及が進む「HTTP/2」の仕組みとメリットとは</a>
pyenv備忘録

pyenvを使うときのあれこれ

## インストール
「pyenv install」で検索

## アップデート
「pyenv update」で検索

## 色々なコマンド
```console
pyenv
```
で、可能なコマンドが表示される。

```console
pyenv install 3.11.3 #Python-3.11.3をインストールする
pyenv uninstall 3.11.3 #Python-3.11.3をアンインストールする
```

## 環境名を自分で指定

```console
pyenv virtualenv 3.9.5 project
```
とすると、python3.9.5(既にpyenvで3.9.5をインストールしてある必要がある)で作った環境を`project`という名前で設定できる。(**プラグイン要**)
ECR のパブリックイメージのビルドに403エラーが出る解決策

# エラー

以下の Dockerfile をもとにビルドする

```dockerfile
FROM public.ecr.aws/lambda/python:3.8

COPY . ${LAMBDA_TASK_ROOT}
RUN pip install -r requirements.txt
CMD ["app.handler"]
```

すると以下のようにエラーが出た
アクセス権がない様子

```shell
$ docker build -t lambda-func .
[+] Building 1.1s (3/3) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                                                                    0.0s 
 => => transferring dockerfile: 31B                                                                                                                                                                                     0.0s 
 => [internal] load .dockerignore                                                                                                                                                                                       0.0s 
 => => transferring context: 2B                                                                                                                                                                                         0.0s 
 => ERROR [internal] load metadata for public.ecr.aws/lambda/python:3.8                                                                                                                                                 0.9s 
------
 > [internal] load metadata for public.ecr.aws/lambda/python:3.8:
------
failed to solve with frontend dockerfile.v0: failed to create LLB definition: unexpected status code [manifests 3.8]: 403 Forbidden
```

# 解決策
以下を叩いて認証を得る

````shell
aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws
````
VPN接続でファイルを送受信できない話

基礎的な内容ではありますが、備忘録として書きました。

環境:Windows10
# 結論
MTUの値を下げると解決しました。
` netsh interface ipv4 set interface {hoge} mtu={N}`
hogeにはVPN接続のIdxを入れてください。
値を確認するには
`netsh interface ipv4 show interface `
で確認できます。
NにMTUの値を入れればOKです。

# 問題
## 概要
コロナで大学に入れなくなり、研究が進めれなくなっていたがやっとリモートで入る準備ができたので試していた。
VPN接続を行いJupyterが入っているコンテナを起動してブラウザでJupyterに入ろうとすると読み込み中のまま動かずタイムアウトしてしまった。
仕方ないのでCUIでプログラムを動かすようにし、結果をファイルに出力しSCPで落とそうと試みたが、ダウロードを始めても一切進まなかった。

## 原因
院生の先輩も同様の症状が発生しており、研究室側に問題があるのではないかと疑った。
しかし、同級生が接続したところJupyterに入ることができ、ファイルをダウンロードすることもできたため、私と先輩の設定に問題があることが疑われた。
設定を見直したが特に問題はなかった。
そこで院生の先輩がスマホのデザリングで試したところ上記の問題は発生しなかった。
このれにより***大学の寮の回線が原因***であることが判明した。（私と先輩は寮に住んでいるが同級生は寮ではなかったため）

# 解決法
VPN接続の詳細を確認
`netsh interface ipv4 show interface `

```
Idx     Met         MTU          State                Name
---  ----------  ----------  ------------  ---------------------------
 24          35        1400  connected     VPN
  8          35        1500  connected     イーサネット
```
VPN接続が24でMTUが1400であることがわかります。
MTUを下げるため今回は1350に変更しました。
`netsh interface ipv4 set interface N mtu=1350`
上記を実行したところ無事Jupyterに入ることができ、またSCPでファイルをダウンロードすることができました。
Flexboxが当たり前になった今、floatっていつ使うの？

## これは何

- 要素のレイアウトで`display: flex`が大活躍している2021年において、`float`プロパティをどう使うかを書いた記事です
- また、記事投稿イベント「[3000文字Tips - 知ると便利なTipsをみんなへ届けよう](https://qiita.com/official-events/d523df99d6479293ffa7)」への投稿記事でもあります

## リポジトリとGitHub Pages

この記事を書くために書いたコードは全て公開しています。

https://github.com/xrxoxcxox/qiita-css-float

実際の見た目はGitHub Pagesからどうぞ。

https://xrxoxcxox.github.io/qiita-css-float/

## 画像にテキストを回り込ませたいときが1番使うと思われる

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/372c38ea-0b0a-ee8a-cbfe-42993b217f90.png)

このようなレイアウトを組むときに`float`が使えます。
以下に簡略化したコードを載せておきます。

```html
<body>
  <h1 class="title">floatをあえて使うなら</h1>
  <div class="container -left">
    <img src="https://picsum.photos/160?random=1" alt="" width="160" height="160" class="image -float-left" />
    <h2>float: left</h2>
    <p class="paragraph">Lorem ipsum ~~~</p>
  </div>
  <div class="container -right">
    <img src="https://picsum.photos/160?random=2" alt="" width="160" height="160" class="image -float-right" />
    <h2>float: right</h2>
    <p class="paragraph">Lorem ipsum ~~~</p>
  </div>
</body>
```

```css
body {
  background-color: #f2f2f2;
  display: grid;
  gap: 16px;
  grid-template-columns: 1fr 400px 400px 1fr;
  padding: 32px;
}

.title {
  grid-column: 2 / 4;
}

.container {
  background-color: #fff;
  border-radius: 8px;
  padding: 24px;
}

.container.-left {
  grid-column: 2 / 3;
}

.container.-right {
  grid-column: 3 / 4;
}

.container.-two-column {
  grid-column: 2 / 4;
}

.image {
  background-color: #dcdcdc;
  border-radius: 4px;
}

.image.-float-left {
  float: left;
  margin-right: 16px;
}

.image.-float-right {
  float: right;
  margin-left: 16px;
}

.paragraph {
  margin-top: 2px;
}
```

## 昔ながらの、要素を横並びにする使い方は駄目？

駄目というほどではありません。
思った通りのレイアウトができて、コードを書く人同士が上手く連携できるなら何も問題は無いはずです。

しかし複数の要素を`float`で横並びにする際、最後の要素のfloatは解除してあげる必要があります。

| 画像に一律で`float: left` | 最後の画像にはfloatをかけていない |
| --- | --- |
| ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/8642ac30-28ad-cf87-2d94-02c05a122701.png) | ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/3aa783d5-5b3c-95db-bd83-e2e2f6d90f29.png) |

実現したいのが左のレイアウトなら良いのですが、どちらかといえば右のレイアウトを意図する方が多いのではないでしょうか？
ちなみに右のコードは以下のように書きました。

```html
<div class="container -two-column">
  <img src="https://picsum.photos/160?random=3" alt="" width="160" height="160" class="image -traditional-float" />
  <img src="https://picsum.photos/160?random=4" alt="" width="160" height="160" class="image -traditional-float" />
  <img src="https://picsum.photos/160?random=5" alt="" width="160" height="160" class="image -traditional-float" />
  <h2 class="traditionl-float-headline">横並びとしてのfloat</h2>
  <p class="paragraph">Lorem ipsum ~~~</p>
</div>
```

```css
.image.-traditional-float:not(:last-of-type) {
  float: left;
  margin-right: 16px;
}
```
差分で出力を変える

# 問題
正の整数を入力します。その整数が、
10の倍数（10,20,30...）からの差が2以内であるときはTrue
それ以外はFalse
と出力するメソッドを作りましょう。

出力例：
near_ten(12)→True
near_ten(17)→False
near_ten(19)→True

```　○○.rb
def near_ten(num)
  quotient = num % 10
  if quotient <= 2 || quotient >= 8
    puts "True"
  else
    puts "False"
  end
end
```
# 解説
「10の倍数からの差」を考えるためには、一の位の値に着目します。すなわち、
一の位が「0,1,2,8,9」のどれかであれば「10の倍数からの差が2以内」と判断することができます。
したがって、変数quotientに一の位の値を代入し、quotient <= 2 || quotient >= 8で「0,1,2,8,9」
のどれかに当てはまるかどうかを確認しています。

# 終わり
今日はオリジナルアプリの作成が捗らず、rubyの復習をかねて練習問題を行いました。
Golang  で struct を embed する際の注意点

# TL;DR

[embed](https://golang.org/doc/effective_go#embedding) する際に型を指定した場合としていない場合で、フィールドへの参照の仕方が異なる。

# struct を embed する

Go には継承という概念はないが、その代替手段として embed（埋め込み）という手段がよく使われる。struct の場合、 embed は下記のようになる。

~~~go
type Person struct {
	Name string
	Age  int
}

type Account struct {
	Person
	Field1 string
	Field2 string
}
~~~

この場合、`Account` の `Person.Name` フィールドへのアクセスは、`Account.Name` のような形でできる。（`Account.Person.Name` **としなくてよい**）

# 型を指定して struct を embed する

しかし、型を指定して下記のように定義した場合は、`Account.Person.Name` としなくてはならない。

~~~go
type Person struct {
	Name string
	Age  int
}

type Account struct {
	Person Person // 型指定
	Field1 string
	Field2 string
}
~~~

## サンプルコード

https://play.golang.org/p/53ixTCjksvs

~~~main.go
package main

import "fmt"

type Person struct {
	Name string
	Age  int
}

// 型指定なし
type Foo struct {
	Person
	Field1 string
	Field2 string
}

// 型指定あり
type Bar struct {
	Person Person
	Field1 string
	Field2 string
}

func main() {
	foo := Foo{
		Person{"型指定なし", 10},
		"a",
		"b",
	}

	bar := Bar{
		Person{"型指定あり", 20},
		"a",
		"b",
	}

	fmt.Println(foo)      // {{型指定なし 10} a b}
	fmt.Println(bar)      // {{型指定あり 20} a b}
	fmt.Println(foo.Name) // 型指定なし
	fmt.Println(bar.Name) // bar.Name undefined (type Bar has no field or method X)
}
~~~
contextがわからない人へ

#contextって何？
contextをググると文脈、環境、状況などが出てきました。

contextは変数名なので、contextについて考えても理解が深まらないです。

contextは``BuildContext型``です。
では、BuildContext型について話していきます。

#BuildContext型って何？
ドキュメントを見ていく！
>A handle to the location of a widget in the widget tree.
This class presents a set of methods that can be used from StatelessWidget.build methods and from methods on State objects.

>Google翻訳
ウィジェット ツリー内のウィジェットの位置へのハンドル。
このクラスは、StatelessWidget.build メソッドおよび State オブジェクトのメソッドから使​​用できる一連のメソッドを提供します。

「ふむふむ、、、全くわかりません！」

できるだけわかりやすく説明していきます。

contextは``先祖の情報を持ったクラス``と言えます。
widget自体は親のクラスにアクセスすることはできません。
だから、親クラスにアクセスしたい場合、contextを利用して親にアクセスすることになります。

#contextが親のクラスを本当に持っているの？
それでは実際contextのメソッドを使って、親の情報を取得して行こう！
まずはコードを見ていきます。

```Dart
void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        theme: ThemeData(primaryColor: Colors.red),
        home: Scaffold(
          appBar: AppBar(),
          body: Column(
            children: <Widget>[
              Theme(
                  data: ThemeData(primaryColor: Colors.green),
                  child: const WidgetA('green')),
              Column(
                children: <Widget>[
                  const WidgetA('red'),
                  Theme(
                    data: ThemeData(
                      primaryColor: Colors.blue,
                    ),
                    child: const WidgetA('blue'),
                  )
                ],
              )
            ],
          ),
        ));
  }
}

class WidgetA extends StatelessWidget {
  const WidgetA(this.text);
  final String text;
  @override
  Widget build(BuildContext context) {
    return Center(
      child: SizedBox(
        height: 100,
        width: 200,
        child: Card(
          color: Theme.of(context).primaryColor,
          child: Center(child: Text(text)),
        ),
      ),
    );
  }
}

```

今回は、赤色、青色、緑色のカードを表示するコードを書きました。

contextが出てきている箇所は2つあります。
1つ目はMyAppクラスの中のbuild関数の引数
2つ目も同様にWidgetAの中のbuild関数の引数になります。

1つ目の先祖を調べていきましょう。

```Dart
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    print(context.findAncestorWidgetOfExactType<MyApp>());
//省略
}
```
上記のように``findAncestorWidgetOfExactType<調べたいクラス>()``で先祖のWidgetにアクセスできます。
結果は``null``でした。

何故でしょうか？

実は、contextは今いるクラスのより上のクラスしか探せません！
(以上じゃなくてより上なんです)

つまり、MyAppを探すには、MyAppの中のcontextじゃ探せないんです。
(MyAppより上にMyAppは存在しないからです。)

じゃあ、どうすればいいのか?

WidgetAのcontextを利用します。
MyAppとWidgetAは別々のクラスです。だから、WidgetAのcontextからMyAppクラスを探せるのは不思議に思えるかもしれません。これは、私も理解が不十分ですが、インスタンス化するとFlutter内で自動的にcontextが繋がるようになっているのだと思います。

WidgerA内のcontextで以下を実行します。

```Dart
class WidgetA extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    print(context.findAncestorWidgetOfExactType<MyApp>());
//省略
}
```
``MyApp``と出力されました.
ここで,context内には先祖の情報探せることを確認しました。
他にも色の情報を出力できたりします。
インスタンス化した地点より上の色を取得できるので,
green,red,blueの色が順番に出力されます

```Dart
    context.findAncestorWidgetOfExactType<Theme>().data.primaryColor;
```

contextはより詳しく理解するにはElementの知識が必要になります。
その内、詳しい記事も書いてみたいと考えてます
ユースケース図についてわかりやすく説明する

## ユースケース図
ユースケース図とは要件定義等前の要求定義の要求分析で使われる。次のような図のことをいいます。
![349A9895-68A6-4DE7-BF7F-53260467AF35.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296562/6ddc9525-c535-8892-7d2d-501597302453.jpeg)

ユースケース図とはユーザ視点でシステムの機能を把握するのに役立つダイアグラムです。
何かシステムを作る上で便利になりそうなダイアグラムですね。
UML(統一モデリング言語）の一つです。

## アクター
アクターは、システムの利用者を指したりします。UML2.x系では、外部システムやハードウェアなどもアクターとして使用できるように表現できるようになったようです。
![F7EDDEFD-96A4-4E7D-B78D-F28523134066_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296562/7d9b1cfc-c376-fad4-ff5d-d4c8455f51ae.jpeg)

## ユースケース
ユースケースは、アクターから見たシステムの機能を示します。
例としてATMのシステムの場合、ユーザはお金を預ける、お金を引き出す等のユースケースが書けると思います。
ユースケースはそのままテストにも使えそうなので便利ですね。
ちなみにユースケースがまとめられている一覧をユースケース一覧といいます。
![EFFED988-9074-4F8F-9254-B5D3EA947BD4_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296562/e6fe4fb4-2566-e612-d9fc-2e03360cc946.jpeg)

## システム境界
ユーザと、システムとの境界を表します。この場合、ユーザが使うのはATMを想定しているので、システム境界にATMと記述します。
![063AA9A3-B362-4BE9-969C-6C524E6506C9_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296562/8db67914-5ab2-0806-9377-6bdcb006f4c1.jpeg)

## 関連
関連は、アクターとユースケースとの関連を示します。
アクターとユースケースを関連で紐づけたとき、アクターからの反応や、ユーザからユースケースを実行することを示すことができます。
![43D28553-F0C9-47AF-B5D9-C0F9D6430ACB_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296562/cefc289a-893f-bedc-1fb1-017dabf12c16.jpeg)

## 汎化
汎化は、アクター同士や、ユースケース同志の共通部分を抽象化することです。
これによって管理者やメンバーによって実行できるユースケースを分けたりできます。
この場合、メンバーには社員情報を閲覧、管理者はメンバーを汎化しているので社員情報を閲覧できますし、編集、削除ができます。しかしメンバーは社員情報の編集と削除はできません。
![1420776E-1E3D-445C-9699-38EB425F0FE9.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296562/385ba48d-63df-1682-edf3-e992e870c5c3.jpeg)

## 包含
包含はユースケースが別のユースケースを内部に含むことです。
手順として、〇〇をするならば、必ず□□する。といった場合。　　
◯◯は、□□に包含（インクルード）するといいます。
わかりやすく言えば、◯◯は、□□に含まれるということです。
たとえば、ATMで振り込みや引き出しを行う場合、``必ず``金額の指定をする必要があります。
つまり、ATMの振り込みや引き出しは、金額の指定に包含するということですね。
![2B4CD1C1-D8F3-4998-B591-B333CAE35EB9_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296562/4dbafe62-c8f2-f92d-470e-fff490204373.jpeg)

## 拡張
拡張は、既に存在するユースケースに、別のユースケースによって拡張することを言います。
包含との違いが結構難しいですが。元々あるユースケースに、機能を追加する場合などに使います。
しかし、ユーザはその機能を必ず使う必要はありません、あくまでオプションとしてのユースケースです。
![EB46263A-54BB-4461-82B5-B91D97155DA6.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296562/97024907-36dd-8684-d0ac-c2c140384aa4.jpeg)

## 終わりに
今回はユースケース図について書きました。
実際に仕事のフローなどをユースケース図に書くと膨大な量になりそうですね。粒度などが問題になりそうです。
意識することは、ユースケースは``アクターから見たシステムの機能``です。アクターから意識して行わない機能のユースケースは書くべきではありません。
ユースケースの機能について詳細に書かれたものをユースケース記述と言います。
次回はユースケース記述について書こうと思います。　　
　　
では。
GPUを割り当てたDockerコンテナを扱う際によく使うコマンド

# はじめに
私が普段よく使うコマンドをまとめています。
DockerイメージからGPUを割り当てたコンテナ生成は別のスクリプトファイルを用意しているのでそこは覚えていないです。

## dockerのイメージの一覧を見る

```bash
$ docker image
```

## dockerコンテナの一覧を表示する

オプションをつけないと起動中のコンテナのみ表示する。"-a"をつけること停止中のもの含めてすべてを表示する。

```bash
$ docker ps
$ docker ps -a
```
## dockerのリソースの使用率を監視する

```bash
$ docker stats
```
## 作成済みのコンテナを起動する。

```bash
$ docker start vm
```

## dockerを停止する。削除する。

```bash
$ docker stop vm
```
## コンテナ「vm-name」に入るためのコマンドの実行する。
コンテナから抜けてもコンテナは停止しない。

```bash
$ docker exec -it vm-name bash
```


## GPUの情報を表示する。2秒おきに監視する。

```bash
$ watch -n 2 nvidia-smi
$ nvidia-smi --l 2
```


## ストレージの使用率の確認方法。

```bash
$ sudo du -h -d 1
$ df
```

## 用法がわからないとき
わからないときは調べる。

```bash
$ du --help
```

# 実行中のプロセスを見る
```bash
$ ps aux | grep httpd
```
# ログの場所を調べる
```bash
$ ls -l /proc/{プロセスのID}/fd
```

# 再帰的にパーミッション変更
```bash
$ find /path/to/dir -type d -exec chmod 777 {} +
$ find /path/to/dir -type f -exec chmod 777 {} +
```
ドメインの最大長はわかったけど、ぶっちゃけ普通の長さが知りたいので調べてみた

## ドメインの最大長

ドメインやメールアドレスの入力フォームを作るとき、データベースや入力画面設計するために、最大長を知る必要があります。

これは、ちょっと調べるといろいろ情報が出てきます。

`.`と`.`の間が63文字、全体で253文字です。
メールアドレスは`@`より左側のLocal Partは64文字、全体で254文字です。

では、入力画面は254文字入力できるように横長に作ればいいのでしょうか。
いやいや、そもそも、253文字とかそんなに長いドメインは見たことがありません。

8割くらいの人が気持ちよく入力できればよくて、ぶっちゃけ残り2割くらいの人には諦めてもらってスクロールしたり改行したりしてもいいとすると、何文字くらい確保すればいいのでしょうか。

## 一般的なドメインの長さ

ということで、今回はドメインについて、どのくらいの長さが一般的なのか調べてみました。

データとしては[Cisco Umbrella](http://s3-us-west-1.amazonaws.com/umbrella-static/index.html)にある100万ドメインを対象に調査しました。
Cisco Umbrellaのドメインは、実際にDNSサーバにクエリされたドメインのランクだそうです。


結果は、次のようになりました。
横軸がパーセンタイル順位で、縦軸がドメインの長さです。

![100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245486/d9c07574-98fa-b8ef-e9eb-7b8818f4e2d4.png)

長いドメイン名は100パーセンタイルあたりに集中しているのがわかります。

もっと80%あたりを見たいので、99パーセンタイル以上を捨てます。

![99.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245486/b3153ba7-1b02-ae4f-c60e-eab05ed45d9c.png)

これを見ると、60文字もあれば99%の人は満足するようです。
80%の満足度でよければ、30文字くらいでよさそうです。

逆に、253文字入力できるような画面を作ってしまったら、99%の人には長すぎるということになります。

## まとめ

肌感覚の通り、そんなに長ったらしいドメインはあまり存在しないらしいということが、データで示すことができました。

メールアドレスのローカルパートについては、公的に使えるデータはないでしょうが、自分のメールボックスから取り出して調べてみてもいいかもしれません。
pyenv global,localが使えなくなったときの対処法

# はじめに
Macでpyenv+pipenvでPythonの仮想環境等の管理をしているのですが、気付いたらpyenv global(pyenv local)をしてもPythonのバージョン変更が反映されませんでした。

# 実行環境
Inter Mac
pyenv + pipenv

# 原因

とりあえず、pythonのバージョン自体の確認

```
$ python -V
>>> Python 2.7.10
```
あれれ？Macのデフォルトのバージョンになってしまっている、、、。
どのpythonを使っているのかの確認

```
$ which python
>>>/user/bin/python
```

ほーそこのを使っているのか
パスの指定が```/Users/xxx/.pyenv/shims/python```じゃないとpyenvでpythonを使えないのでzprofileの確認

```
export PYENV_ROOT=${HOME}/.pyenv
if [ -d "${PYENV_ROOT}" ]; then
  export PATH=${PYENV_ROOT}/bin:$PATH
  eval "$(pyenv init -)"
fi
```
これで問題ないはずなんですが
[pyenvの公式github](https://github.com/pyenv/pyenv)を見ていくと

先ほどの下から二行目の部分が違ったので変更

```
eval "$(pyenv init -)"
```
を

```
eval "$(pyenv init --path)"
```

に変更して反映させる

```
$ source　.zprofile

# 反映されたかの確認
$ python -V
>>> Python 3.6.7

$ which python
>>>/Users/xxx/.pyenv/shims/python
```

おかえりpython
# 最後に
１ヶ月くらい前(2021/4/30)に初期化したときは問題なかったので
[pyenv](https://github.com/pyenv/pyenv)の仕様が最近変わったっぽいですね
# 参考
[pyenv](https://github.com/pyenv/pyenv)
webpush:vapidでのopenssl_pkey_new()のエラー

プログラミング初心者です。

WebPushをLaravel（5.8）で実装したい過程で、

```
php artisan webpush:vapid
```
実行したら

```php
 ErrorException  : openssl_pkey_new(): private key length is too short; it needs to be at least 384 bits, not 0

vendor/web-token/jwt-core/Util/ECKey.php:157
$key = openssl_pkey_new([
    156|             'curve_name' => self::getOpensslCurveName($curve),
  > 157|             'private_key_type' => OPENSSL_KEYTYPE_EC,
    158|         ]);

```
というエラーが出ました。
エラー文検索しても解決できず、メンターさんと1時間以上格闘しましたが、それでも解決できませんでした。
「メンターさんが解決できなかったら私にできるわけないだろうと」諦めかけてました。
でもvapid作成できなきゃ進まないため、検索してったらこのサイトを見つけました。

http://phpdoc.m-takagi.org/function.openssl-csr-new.html

bitsが関係してるだろうから、エラーが出てる場所の```ECKey.phpの$key = openssl_pkey_new([]);```の[ ]中にこれを入力してみたら・・・

```php
"private_key_bits" => 2048,
```
まさかの

```
VAPID keys set successfully.
```
衝撃すぎて、体が飛び起きました。


ちなみにマニュアルサイトにある
```OPENSSL_KEYTYPE_RSA```ではダメで```OPENSSL_KEYTYPE_EC```じゃないと 

```
ErrorException  : Undefined index: ec
```
というエラーが出ちゃいました。返されるキーのデータが違うみたいですよ（正直違いよくわかりません）。
【Unity(C#)】ネットワーク接続の状態に応じて処理を行う

##はじめに
OculusQuestでアプリがオフラインかオンラインかに応じた処理が必要になったので調べました。

##Application.internetReachability
結論、`Application.internetReachability`を使えばOKです。
状態に応じてEnumを返します。

| Enum | 状態 |
|:-:|:-:|
|NotReachable    | インターネットに接続していない  |
|  ReachableViaCarrierDataNetwork  | キャリアネットワークで接続している  |
|  ReachableViaLocalAreaNetwork  | Wi-Fiでネットワークに接続している  |

【参考リンク】：[Unityで作成したアプリにおいて、ネットワーク接続を確認する場合に使う「Application.internetReachability」!](https://qiita.com/Toriniku_Unity/items/1d10ed9036e0c97bb803)

##バージョン情報
UniRx 7.1.0
Unity 2019.4.8f1

##コード

ネットーワークの状態に応じてテキストを変更する簡易サンプルです。
ReactivePropertyで状態が変わった時だけ処理するようにしています。

```C#
using UniRx;
using UnityEngine;
using UnityEngine.UI;

/// <summary>
///　インターネット接続をチェックするサンプル
/// </summary>
public class NetworkConditionChecker : MonoBehaviour
{
    [SerializeField] private Text networkConditionText;

    private readonly ReactiveProperty<NetworkReachability> _networkReachReactiveProperty = new ReactiveProperty<NetworkReachability>();

    private void Start()
    {
        _networkReachReactiveProperty
            .SkipLatestValueOnSubscribe()
            .Subscribe(condition =>
            {
                if (condition == NetworkReachability.NotReachable)
                {
                    networkConditionText.text = "接続無し";
                }
                else
                {
                    networkConditionText.text = "接続有り";
                }
            })
            .AddTo(this);
    }

    private void Update()
    {
        _networkReachReactiveProperty.Value = Application.internetReachability;
    }
}
```



##デモ
画面下の接続の状態に応じてテキストが変更されました。成功です。
エディター上でも実機上でも変わりなく動作してくれてありがたいです。

![NetworkCondition.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/758e09bf-5e6c-42f4-a09d-b62b519156c2.gif)
Traitの関数をconst fnとして実装できるようになる(かもしれない)話

**注意**
この内容は2021/06/04時点での内容です。今後変更される可能性があります。
またNightly Buildでしか使用できない機能が使用されています。

---

タイトルだと分かりづらいですが
`std::ops::Add`を例にすると

```rust
struct A(i32);

const A1: A = A(1);
const A2: A = A(2);
const A3: A = A1 + A2; // A(3)になる
```
上記のようにユーザー定義の型に`+`演算子を定義してその結果を`const`として扱えるようになるという話です。

## 実装してみる
とりあえず型Aを定義して`std::ops::Add`を実装してみます。

```rust
struct A(i32);

impl std::ops::Add<A> for A {
    type Output = Self;
    
    fn add(self, other: Self) -> Self::Output {
        A(self.0 + other.0)
    }
}

fn main() {
    const A1: A = A(1);
    const A2: A = A(2);
    const A3: A = A1 + A2;
    println!("{}", A3.0);
}
```

当然コンパイルエラーになるのでimplした`add`を`const fn`として実装する必要があります。
ではどのように実装するかというと

```rust
// implとtrait名の間にconstを入れる
impl const std::ops::Add<A> for A {
    type Output = Self;

    fn add(self, other: Self) -> Self::Output {
        A(self.0 + other.0)
    }
}
```
こうです。
注意しなければいけないのは`const fn add(...)`のように関数に`const`をつけるのではなく`impl const Trait`のように`impl`と`trait`名の間に`const`を入れる必要があります。

またこの機能を使用するには`#![feature(const_trait_impl)]`を追加する必要があるのでコード全文は以下のようになります。

```rust
#![feature(const_trait_impl)]
struct A(i32);

impl const std::ops::Add<A> for A {
    type Output = Self;
    
    fn add(self, other: Self) -> Self::Output {
        A(self.0 + other.0)
    }
}

fn main() {
    const A1: A = A(1);
    const A2: A = A(2);
    const A3: A = A1 + A2;
    println!("{}", A3.0);
}
```
[Rust Playground](https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=ec3504c5cdbc302d38825daaff137982)

## まとめ
- `impl const Trait`と書くことでTraitの関数を`const fn`として使用できるようになる
- `#![feature(const_trait_impl)]`が必要
- 現時点(2021/6/5)ではNightly Buildのみ

## おまけ
[Tracking issue for RFC 2632, impl const Trait for Ty](https://github.com/rust-lang/rust/issues/67792)というGitHubのissueがあるので気になる方はそちらを覗いてみてください。
【Python】for文でもwhile文でもない、再帰関数を使ったループ処理

# 概要
コードを書くときに度々登場するfor文やwhile文ですが、
実は再帰関数を使ってもループ処理ができるのです。



# 目次
1. [再帰関数によるループ処理](#1-再帰関数によるループ処理)
2. [処理速度の比較](#2-処理速度の比較)


# 1. 再帰関数によるループ処理
```Python:再帰関数によるループ処理
def loop(i):
    i -= 1 
    print('hello world')
    if i:
        return loop(i)
    return True

loop(3)
# 出力結果
# hello world
# hello world
# hello world
```
## コードの説明
loop(3)を実行すると、loop(2),loop(1)と自身の関数を返し続ける。
loop(0)でif文を満たさないので、Trueを返す。


# 2. 処理速度の比較
それぞれ1万回2の1000乗を繰り返し計算して、処理速度を比較する。

```Python:処理速度の比較
import time
import sys
sys.setrecursionlimit(100000)

# 処理回数
n = 10000


def loop(i):
    i -= 1
    hoge = 2 ** 1000
    if i:
        return loop(i)
    return True


# loop（再帰関数）
start_loop = time.time()
loop(n)
print('loop:{:.5f} sec'.format(time.time() - start_loop))

# forループ
start_for = time.time()
for _ in range(n):
    hoge = 2 ** 1000
print('for:{:.5f} sec'.format(time.time() - start_for))

# whileループ
start_while = time.time()
while n > 0:
    n -= 1
    hoge = 2 ** 1000
print('while:{:.5f} sec'.format(time.time() - start_while))

# 出力結果
# loop:0.02358 sec
# for:0.01002 sec
# while:0.00886 sec
```
## 結果
|ループ名            |処理時間(sec)|
|:-----------------|------------------:|
|再帰関数              |            0.02358|
| for文             |            0.01002|
| while文           |            0.00886|

再起関数はfor文、while文に比べて2、3倍程度処理速度が遅い結果となった。実際に関数のループ処理を使う場面は少ないだろう。


## 補足
コード3行目の「sys.setrecursionlimit」は、関数の呼び出し回数の制限に関するもので、詳しくは[Pythonの再帰回数の上限を確認・変更](https://note.nkmk.me/python-sys-recursionlimit/)を参照されたい。

# 参考記事
[Pythonで理解する再帰関数](https://qiita.com/dhirabayashi/items/2f079e62fa2e286f1766)
コードレビュー時に意識していること

コードレビューをやるようになってから1年ちょい経ったので、レビュー**観点**とレビューをするときに**意識していること**を書く。
歴1年のペーペーが書いている記事なので、参考までに。
* * *

#観点
レビュー観点は、言語化できないところもあり、ここに書いていることが全てではないが、大体毎回こんなところを観ている。
* * *
###要件を満たしているか
プルリク飛んできた時は、コードを読む前に要件を満たしているかを確認する。
ブランチ切り替えてローカルで実際に動かしてみる。
要件を満たしていなければコードを読むまでもない。
ここをクリアしてからコードを読み始める。
* * *
###コーディング規約に沿っているか
コーディング規約をドキュメントに記載しているプロジェクトであれば誰でもチェックできる観点。
レビューで何を見ればいいか分からなければ、まずこれを確認してみるといいと思う。
* * *
###デザインパターンに沿っているか
コーディング規約と似たような観点だが、そのプロジェクトで採用されているデザインパターンに沿った実装ができているかを確認する。
* * *
###変数名・関数名
ぱっと見で理解できる命名をしているか。
自分で命名した変数は、少しおかしくても理解できてしまっているので、レビューで拾って欲しいところ。
* * *
###同じようなコードを書いていないか
同じようなコード、もしくは「今後違う箇所でもつかいそうだなあ〜」と思うようなコードは切り出すこと(共通化)ができないかを考える。
* * *
###コメントが正しいか
コメントが間違っていてもコードは動くので、ミスしやすいところ。
実装に沿っていないコメントが1つでもあると、全てのコメントを疑わなければならなくなってしまう。
* * *
###削除できないか
関数を使用しているコードが削除された差分があれば、その関数自体を削除できないのかを確認する。
関数に限らず、cssとかも。
とにかくいらないものは消す！
* * *
###省略できないか
これは、好みとかプロジェクトのコーディング規約によると思うのですが、アロー関数で「return」を省略できないか、
スプレッド演算子使えないか、オブジェクトのプロパティ名を省略できないか。
(ES6の書き方が使えないか？と言った方が良いかも...)
あとは閉じタグとか色々。
* * *
###テストコードが足りているか
if文があれば、その分テストを書いているのか。など、テスト観点として足りているのかを確認する。
* * *
###余分なテストを書いていないか
テストはあればあるだけ良いというわけではなく、意味のあるテストだけを書く必要がある。
なぜなら、テストコードも保守するコストがかかるから。
意味のないテストは書かない！
* * *
###軽くテストしてみる
コードを一通り見終えると、「ここをこうしたらどうなるんだ？」「ここをこう動かしたらバグるんじゃね？」
みたいなところが出てくるので、そのような場合は実際にローカルで試してみる。
あとは、ユーザーが行わないような意地悪な動作とかも試してみる。
時間をかけすぎると、それはレビューではなくテストになってしまうので注意。
* * *
#意識していること
###分からないところは聞く
当たり前だが、分からないところを分からないまま承認ボタンを押してはいけない。
分からないところがあれば、質問のコメントをする。
プルリク内のやりとりだけでは難しい場合、slackや通話で直接聞く。
* * *
###早めにレビュー着手する
PRがとんできたら、できるだけ早くレビューを行うようにしている。
これは、自分がそうされたら嬉しいからやっている。
即反応があるのは気持ちいい。
* * *
###解決方法が分からなくてもコメントを残す
``微妙なコードだけど、代替案が思いつかない！``
という時は、代替案を考えるのに時間をかけ過ぎずに、微妙だと思っているコメントだけ残す。
実装者がサクッと直してくれるかもしれないし、他のレビュアーが代替案を提示してくれるかもしれない。
* * *
###意見を押し付けない
自分の意見が100%正しいとは思ってはいけない。
一人でコードを書くなら好きな書き方をすれば良いが、チームの場合はそうではない。
それぞれ考えを持っていると思うのでリスペクトを持ってレビューをする。
意見が別れそうなコードがあれば、指摘というよりは提案のような形でコメントを残す。
`こう書くのはどうでしょう？`
`ここは、こうだと思うのですがいかがでしょう？`
など。
* * *
###優しめな印象のコメントを残す。
責めるべきは、実装者ではなくコード。
「別に、あなたを責めているのではないですよ。」ということをわかって欲しいので、できるだけ優しい文章を心がける。
`ここのコード、削除してください。`
ではなく、
`ここのコード、削除できますかね？`
こっちの方がなんとなくだが、やさしい表現だと感じる。
回りくどいと言われればそうかもしれない。。

あとは、！つけるのは定番。印象がだいぶ違う気がしている。
`ここのコード、削除できます！`
* * *
###お礼をする
指摘したコメントに対して、修正をしてもらえたら、その修正に対してお礼のコメントを残す。
これは正直、毎回できていることではない。
最低でも、「修正しました」というコメントにはいいねを押すようにしている。
指摘を受けるということ自体が、マイナスなイメージなので、
お礼をすることでそのマイナスがプラマイ0になってくれないかなー。という想いがある。
* * *
#終わり
どう実装すれば良いかは教わるが、どうレビューすれば良いかは教わらなかったので、
最初はとりあえず自分が受けた指摘をレビュー観点として持ち、それを段々と増やしていった。
なので、レビュー観点といいつつ、自分がこれまで受けた指摘リストでもある。
あとは、他のレビュアーがどんなことをコメントしているのかを観て、それを自分の中に取り入れたりもした。
(優しめな文章とかお礼コメントとかは、完全に他のレビュアーから盗んだもの)

こんな感じで、あくまで自分流のレビュー観点なので参考までに。
GraphViewでTextureNodeを作る方法

GraphViewを勉強中です。

https://qiita.com/ma_sh/items/7627a6151e849f5a0ede

を一通り試した後で、では「テクスチャを持ったTextureNodeを作ろうとした時にどうしようかな？」と色々試行錯誤した結果、とりあえず実装出来たのでメモしておきます

![スクリーンショット 2021-06-05 000109.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61266/539ef95c-39ed-4f43-d9b3-c26fd652b87d.png)

```cs:TextureNode.cs
using UnityEditor.Experimental.GraphView;
using UnityEditor.UIElements;
using UnityEngine;
using UnityEngine.UIElements;

namespace ScreenPocket
{
    /// <summary>
    /// テクスチャノード
    /// </summary>
    public sealed class TextureNode : NodeBase
    {
        private Image _image;
        public Texture texture => _image.image;

        public TextureNode() : base()
        {
            title = "Texture";

            var outputPort = Port.Create<Edge>(Orientation.Horizontal, Direction.Output, Port.Capacity.Multi, typeof(Texture2D));
            outputContainer.Add(outputPort);

            var objectField = new ObjectField
            {
                objectType = typeof(Texture2D),
                allowSceneObjects = false
            };
            
            _image = new Image(); //表示用

            objectField.RegisterCallback<ChangeEvent<Object>>(e =>
            {
                _image.image = (Texture2D)e.newValue;
            });

            mainContainer.Add(objectField);
            mainContainer.Add(_image);
        }
    }
}

```
ポイントはRegisterCallbackでしょうか。
テクスチャを扱うObjectFieldが欲しかった事もあり

```cs:
objectField.RegisterCallback<ChangeEvent<Texture2D>>(e =>
            {
                _image.image = e.newValue;
            });
```
としようとした所、コールバックが呼ばれず、

```cs:
objectField.RegisterCallback<ChangeEvent<Object>>(e =>
            {
                _image.image = (Texture2D)e.newValue;
            });
```
こうしなければならなかった点で少し時間を食いました。

ちなみにこの状態だと、テクスチャが原寸大に表示されてしまい、1024x1024だと大きすぎるので

```cs:
objectField.RegisterCallback<ChangeEvent<Object>>(e =>
            {
                _image.image = (Texture2D)e.newValue;
                _image.sourceRect = new Rect(0f,0f,100f,100f);
            });
```
として100x100で縮小表示しようとしましたが、どうにも上手く縮小できないので調査中です。
いっそプレビューはノードから外した方が良いかも？？
残人生のためのプログラミング　第-3回

# 早速プログラムの紹介だ！！

今回紹介するのはこいつだ！！TaskNotify.py！！
前回からの変更点はtaskLoad関数の追加と，csv中のisRoutine列を使って期限日の自動更新機能の実装だ！！

datetimeやdateオブジェクトの更新にはtimedeltaオブジェクトを使う必要があるから覚えておいてくれよな！！


~~~TaskNotify.py
import requests
import datetime
import pandas as pd

class Task:
	def __init__(self, name, date):
		self.name = name
		self.date = date
		self.sentence = "{}まで残り{}日\n".format(name, abs(self.date-today).days)


def loadTasks(path_csv):
	csv_tasks = pd.read_csv(path_csv)
	list_tasks =[]
	for row in csv_tasks.itertuples():
		date = datetime.datetime.strptime(row.deadline, '%Y年%m月%d日').date()
		if row.isRoutine and (date < today):
			date += datetime.timedelta(days=row.isRoutine)
		list_tasks.append(Task(row.name, date))
	return list_tasks


def createSend(tasks):
	sentences = "\n"
	for s in tasks:
		print(s.date)
		if s.date >= today:
			sentences += s.sentence
	return sentences


if __name__ == '__main__':
	today = datetime.date.today()

	list_tasks = loadTasks("tasks.csv")

	send_dict = {'message': createSend(list_tasks)}

	TOKEN = 'hoge'
	url = 'https://notify-api.line.me/api/notify'
	TOKEN_dict = {'Authorization': 'Bearer ' + TOKEN}

	requests.post(url, headers=TOKEN_dict, data=send_dict)
~~~


~~~tasks.csv
name,deadline,isRoutine,priority
Qiitaの記事を投稿する,2021年6月3日,1,low
課題を提出する,2021年6月9日,,high
Toeicの試験,2021年6月20日,,high
コインランドリー,2021年6月3日,4,mid
~~~


![TaskNotify_csv_isRoutine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578927/212b644f-2d8e-9def-8edd-29362ef9e757.png)


# 次回　第-4回は!!

タスクの登録・削除部分を実装していきます．とりあえずはtkinterとかでGUIとして実装しようかなって感じです．
【Swift】enumで文字列を受け取って文字列で返す

# どういうことか

たとえば `"りんご"` という文字列を受け取ると `"アップル"` を返してくれる。
その翻訳処理を切り出したファイル（クラス）を作成した想定で書く。

## 受け取るほう

```swift
import Foundation

final class Translation {
    enum EnglishName: String {
        case apple = "アップル"
        case grape = "グレープ"
        case orange = "オレンジ"

        init?(fruit: String) {
            switch fruit {
            case "りんご":
                self = .apple
            case "ぶどう":
                self = .grape
            case "みかん":
                self = .orange
            default:
                return nil
            }
        }
    }
}
```

## 送るほう

```swift
let japaneseName = "りんご"

var translate = Translation.EnglishName(fruit: japaneseName).rawValue
print(translate) // "アップル"
```

`.rawValue` をきちんと付けないとStringにならなくてハマる（ハマった）。
`func` で引数受け取って書くこともできるけど、可読性を考えるとこのほうが良いのかなと思いました。

おわり(´・ω・｀)
Ubuntuで画面が白っぽいときの対処法

# はじめに
業務でUbuntuを使用しており、エディタでダーク系のカラーテーマを使った際、画面表示が少し白っぽい感じがしたので、そのときの対処法をまとめます。
アドバイス等あればお気軽にコメントお願いします。誰かの役に立てば幸いです。
# TL;DR
Ubuntu(Linux系 OS)、HDMI接続、Intel系オンボードグラフィック環境下で、画面描画のRGB階調がデフォルトで制限されている場合がある。
下記コマンドで画面描画の制限を解除できます。

```sh
$ xrandr --output DP-2 --set "Broadcast RGB" "Full"
# --outputには設定を変更したいディスプレイ出力を指定
```
# 設定の確認方法
下記コマンドで現在使用しているプライマリモニタを調べる。

```sh
$ xrandr --props | grep primary
# DP-2 connected primary 3840x2160+0+0
```
上記例であればDP-2がプライマリモニタ。下記コマンドでディスプレイ設定を表示。

```sh
$ xrandr --props
```
先程確認したプライマリモニタの`Broadcast RGB`を確認します。
HDMI接続、Intel系オンボードグラフィック環境下で設定が`Automatic`もしくは`Limited 16:235`になっている場合は描画が制限されています。

# 設定を保存する場合
システムを再起動すると設定が元に戻ってしまうので、設定を保存したい場合はホームディレクトリに`.xprofile`を作成します。

```sh
$ cd ~
$ touch .xprofile
$ vi .xprofile
```
ここに設定したい内容を記載すれば、再起動した場合も設定が維持されます。
また、以下のように記載することで、モニタを接続している場合のみ設定を有効にすることも可能です。

```sh
if xrandr --query | grep 'DP-2 connected'; then
  xrandr --output DP-2 --set "Broadcast RGB" "Full"
fi
# DP-2は設定したいディスプレイ出力を指定
```
設定は以上です。快適なUbuntuライフをお送りください。
＃Twitter転職で転職したお話

##1.自己紹介
初めまして。KAORUです。26歳の会社員です。
IT業界に飛び込んで1年と9ヵ月になります。

####簡単な経歴
- 文系Fラン大学卒業
- Sier企業（新卒）3ヶ月退社
- SeS企業（中途）1年半
- SeS企業（中途）2021.06～

年齢の割に社会人経験が浅いのは大学を留年していたり、
転職までの期間が空いたりと色々ありました。（深くは語らない）

##2.前職がヤバすぎた
###IT未経験の方には知っておいて欲しいので話します。

前職はインフラの底辺、開発系エンジニアを目指す上で1番浸かってはいけない業務系システムの監視保守
を1年経験しました。ここでは社会人として最低限のスキルは身についたものの、正直無駄だった。

以下理由

- IT関連のスキルがほぼ身につかない。
- Excelとメモ帳使ってコピペの作業のみ
- 先輩社員の理不尽なパワハラ
- 夜勤明けの残業エグくて最長32H起きてた。
- 日勤夜勤が1日おき。1日12H勤務

実は丁度1年経った頃にストレスでおかしくなって夜勤前に家の物に当たり散らかして自分で首締めて自殺しかけました。ただ後にその一件が会社にバレて部署異動（総務）になるわけですが、自社勤務になったもののコロナ化なので週一出社でした。一見働く環境は最高だけど、僕は配属された半年後にこの会社を辞めました。

以下理由
 
- 2020.10 総務転属 
- 2020.11 OJT中に上司と論争
- 2020.12 上司が経営会議に僕との論争を告発
- 2020.12.25 社長からのパワハラという名のクリスマスプレゼントをもらう。（説教+反省文）

前の現場は同期が全員辞める中1人戦い抜いた。（他社の方も合わせて1年以内に15人以上離脱）ところが社長は僕に『君は会社に貢献するどころか満足な実績も出せぬまま現場を離れた。だが、そんな君にも仕方なく総務という場を与えてやったのに君のその上司に対するその態度はなんだ？君には悪いけど然るべき罰を受けてもらう。』と言われました。
この優しさの欠片もない言葉に仕事に対するモチベーションや長所の熱意が無くなりました。当然音声を録画出来る程の余裕もなく、一方的に責められました。今でもトラウマです。

- 2021.01 同じ部署の方と論争。
- 2021.02 部署内で僕を扱いきれないと判断される
- 2021.03 インフラに戻るか退職を迫られ退職

論争の内容は基本くだらなかったです。この後上司という上司に気遣いをかけて奮闘しますが、扱いずらいと言われ嘘の内容まで流されて幹部に『その話は嘘です。違います。』と言い張るも信じて貰えず。部署異動か退職を迫られたので退職しました。

# ※注意
### あくまでこんなやばい会社もあるって事だけ認識しておいて下さい。
###『IT業界会社って結局全部ブラックじゃん！』は違います！良い会社もあります。
### 僕のガチャ運が悪かっただけです。
### 転職時、ほぼ全ての採用担当の方から『やばい』と言われました。つまりそういうこと。

###熱く語ってしまいました。ごめんなさい。

##それでは本題です！

##3.学習記録
2019.05 プログラミング学習を本格的に開始
2021.10 やんばるエキスパート受講（受講継続中）

一応学習記録だけ書いておきます。

- 言語：Ruby,HTML/CSS,
- フレームワークはRuby on Rails
- 環境構築：WSL（PC自作）
- その他：Git,Heroku
  
これらはある程度触りました。
ただ、ポートフォリオは未作成。これが一番ダメなとこ。
攻略本だけ読んでゲームしてないのと同じ。今月からゲーム（コーディング）始めます！

##4.転職活動
1番気になる箇所載せておきます。今回はWantedlyメインで応募しました。
ただ、最終的にはTwitter転職で採用していただきました。

以下概要

転職時期︰2021.03.10～2021.05.17（約2ヵ月）
Twitterからのオファー：3社
Wantedly 応募：68社
見送り：6社
内定：1社
辞退：17社

#余談︰何故Wantedlyのみの応募を考えたか
- 前職で転職失敗した
- エージェントを通すより直接応募した方が興味持ってもらえると思った

この2点が主な理由です。
実際Wantedly経由で面談等しましたが、かなり好印象でした。
僕の場合は実務経験があったのも要因の1つかも知れませんが、
実務経験なんか無くても気持ちが大事だと思います。
ただ、僕も決して胸張ってアドバイスできるような立場ではなく、
特に開発系志望であれば必須とされる**熱意**、**良質なポートフォリオ**、**何らかの実績**の内
現状、僕は熱意しか持ち合わせてないので今後は残りの2つを掴みにいきます！

# ※転職時期は注意

特に4月～6月頃まではどこも新卒の教育期間に充てているため、
SESに限った話かも知れませんが、今の時期に紹介できる開発案件はないと言われました。

##5.転職した現在
『ブラック企業からの脱出！転職も出来て無事開発系に！おめでとう！』って思ってたらごめんなさい！
実は開発系のエンジニアにはジョブチェンジできていません。正確には1年越しでポートフォリオを作成してプログラマーとしてではなく、その先の上流工程（PM補佐あたり）の確約をもらってます。ただ、あくまでポートフォリオ次第なので要件定義から設計までほぼ自力って状況。つまりこの先は自分次第。正直これが正解かは分からない。僕の価値観も変わるかも知らないし、
どうなるかは分からない。でも今はとにかく突き進む事だけを考えてます。

#今何してるの？
現在、大手ネットワーク企業でOJTを受けてます。
業務内容としてはネットワーク関連の障害対応です。

#IT業界あるある
僕の業務内容がエンジニアかと言われてたら正直怪しいです。ただ、エンジニアというくくり自体は広いため、
業務からしてエンジニアとは言えなくても現場で働かれている方々がエンジニアと言い切っていたらエンジニアです。
僕は前職の現場の上司に文句言ってかなり怒られました。

#さいごに
最後まで読んでいただきありがとうございます！
今後は学習内容を積極的にアウトプットしていくので良ければまた覗いてみて下さい！
bash で引数付きのエイリアスを作成したい！

メモです。自分の使っているサブネットが 192.168.1.0/24 だったとします。ここで 192.168.1.52 や 192.168.1.103 に ssh したい！そういうエイリアスを作成したい！

そう思ったことはありませんか？そんな時は .bashrc にこんな風に書くと良いそうです。

``` .bashrc
function s() {
    command ssh root@192.168.1.$1
}
```

上記を読み込むと以下のように例えば ```s 52``` と実行した際に ```ssh root@192.168.1.52``` と実行されます。

```
$ s 52
root@192.168.1.52's password:
```

```.bash_alias``` にこう書くのはダメなようです。```echo``` してみるとわかりますが ```ssh root@192.158.1. 52``` と $1 の前にスペースが入ってしまうようです。

```
alias s='ssh root@192.168.1.$1'
```

詳細は[参照](https://hacknote.jp/archives/8043/)から。

参照: [bashで引数つきのエイリアスを設定する](https://hacknote.jp/archives/8043/)
REST APIについてアウトプット

自分の知識と勉強のためのアウトプットの記事です。
間違ってるところもあると思うので、もし認識違いがあればご指摘お願い致します。。。
ザックらばんにふわふわしているところもあるので
自分のものより他の人の記事の方が分かりやすくなっていると思うのでそちらをご覧ください。。(´;ω;｀)

～～～「REST API」について～～～

REST APIとは、「REpresentational State Transfer」の略

REST APIはアプリケーション内をURLで示せる

　　画面　  →　     API      →      DB
　　　 　RESTAPI　
→画面のインターフェースで「GET(取得)」、「PUT(更新)」、「POST(登録)」、「DELETE(削除)」
 を行うことで、設定したURLにどこのDBのところに入れるか指定が出来る。



もう少しきちんと書きたいですが、とりあえずここまで
その内しっかり描きたいと思います。。m(__)m