OmniAICreator/Qiita-1.07M huggingface dataset:
divタグを使わずに表現


HRタグはHorizontal Ruleの略で水平の罫線を表します。

```vuejs
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
<div id="app">
<template v-for="fruit in fruits">
<ul>
  <li>{{fruit}}</li>
  <hr>
</ul>
</template>
</div>
```
```
new Vue({
  el: '#app',
 data: {
    fruits: ['りんご','バナナ','キィウイ']
       }
})
```
![20210507-181740.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/7931b1ec-f980-6515-88bf-9156c5f9f7ce.png)
Fargateで起動したコンテナ内を覗きたい


https://aws.amazon.com/jp/about-aws/whats-new/2021/03/amazon-ecs-now-allows-you-to-execute-commands-in-a-container-running-on-amazon-ec2-or-aws-fargate/

DockerのVolumeがきちんとマウントできているか、どんなプロセスが動いているか、などの確認のため重宝しました。



# 参考サイト

初心者故に、公式記事よりも解説記事の方が理解しやすかったです。

独自に変更したい箇所があれば公式サイトを参照しました。

記事をまとめてくださった方々に感謝します。


https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-exec.html

https://dev.classmethod.jp/articles/ecs-exec/
pandas DataFrameでの条件抽出

すぐ忘れてしまいそうなので、忘備録及び

https://qiita.com/s_katagiri/items/4cd7dee37aae7a1e1fc0

にそこまで載っていなかったので。

レファレンス：

https://pandas.pydata.org/docs/reference/index.html

困ったら、ここで調べるととりあえずは載っている。

https://colab.research.google.com/notebooks/intro.ipynb?hl=ja

で実施

#元のデータのダウンロード
```python:data_dl.ipynb
import pandas as pd

url_train = "http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data"
url_test = "http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test"


cols= ["age", "workclass", "fnlwgt", "education",
"educationnum", "maritalstatus", "occupation",
"relationship", "race", "sex", "capitalgain",
"capitalloss", "hoursperweek", "nativecountry","incomelevel"]

df_train = pd.read_csv(url_train, names=cols)
df_test = pd.read_csv(url_test, names=cols, skiprows=1)
```
[1994 US Census Income Data](https://archive.ics.uci.edu/ml/datasets/Census+Income)を使用

`read_csv()`が便利すぎ

#nominal(名義尺度)な列の確認
```python:df_nominal.ipynb
df_nominal=df_train.describe(include='all').head(4).dropna(axis=1)
df_nominal
```

| index | workclass | education | maritalstatus | occupation | relationship | race | sex | nativecountry | incomelevel |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|count|32561| 32561|32561|32561|32561|32561|32561|32561|32561|
|unque|9|16|7|15|6|5|2|42|2|
|top|	Private|	HS-grad|	Married-civ-spouse|	Prof-specialty|	Husband|	White|	Male|	United-States|	<=50K|
|freq|	22696|	10501|	14976|	4140|	13193|	27816|	21790|	29170|	24720|

`describe()`を`include='all' `で基本統計量を出すと、数値の列は`unique`の行が`NaN`になるので、それを`axis=1`で列を指定して`dropna()`で落としている。

#binary(２値)な列の抽出
```python:df_binary.ipynb
df_binary=df_nominal.loc[:, (df_nominal.loc['count'] == 32561) & (df_nominal.loc['unique']==2)].T.drop(['unique','top'], axis=1)
df_binary
```

| index | count | freq |
|:-:|:-:|:-:|
|sex|32561|21790|
|incomelevel|32561|24720|

調べるのに結構苦労した、２つの条件による抽出

**`(df_nominal.loc['count'] == 32561) & (df_nominal.loc['unique']==2)`**

`()`で囲うのと`&`や`|`を使用しなければいけない。

**`loc[行,列]`**の指定なので、`[:,条件式]`としている。

#新な列の作成と条件による値の変更
```python:balanced.ipynb
df_binary=df_binary.assign(balanced=lambda df: df["freq"] / df["count"])
df_binary
#
# いったん数値列を作成
#
df_binary["balanced"]=df_binary["balanced"].apply(lambda x: "balanced" if x > 0.4 and x < 0.6 else "imbalanced")
df_binary
```
| index | count | freq |balanced|
|:-:|--:|--:|--:|
|sex|32561|21790|0.669205|
|incomelevel|32561|24720|0.75919|


| index | count | freq |balanced|
|:-:|--:|--:|:-:|
|sex|32561|21790|imbalanced|
|incomelevel|32561|24720|imbalanced|

`assign()`で新しい列を作成。 `lambda`の引数はこの場合_DataFrame_（らしい・・・）

そのあと`apply()`で条件により値を文字列に変更。
いろいろ試したところ、_Series_でやらないとうまくいかなかった。

ここでは`and`が使えている。`0.4 < x <　0.6`とやりたかったけど、なんかうまくいかなかった。

#まとめ
**pandas**の_DataFrame_内での条件判定は`and`や`or`ではなく`&` や`|`を使用するところや、列の値によって条件判定して値を変えるのはそれなりに使うと思います。
Raspberry Piを使って屋外利用可能なIoTゲートウェイを作る（Pi-protect）

屋外のセンシングシステムを組もうとしたときにノウハウが多いラズパイを使用したいと思うことがあります。
しかしラズパイを屋外で使うには、いくつかクリアしなければならない課題があります。

## ラズパイの屋外設置を検討する

### 電源をどこからとるか
今回は商用電源が使える環境を想定します。

### 機器の防塵・防水
ラズパイ本体や周辺機器を防塵・防水ケースで保護する必要があります。

### 安定したインターネット接続
Wi-Fiアクセスポイントがない環境では4G/LTE回線を使用することにより安定したインターネット接続が可能です。

### 電波法（屋外無線LAN利用）を守ること
Wi-Fiで使う電波は2.4GHz帯と5GHz帯がありますが、
電波法によると2.4GHz帯は屋外利用可能です。
一方で5GHz帯無線LANの屋外利用は一部を除いて禁止されています。

[無線LANの屋外利用について（総務省）](https://www.tele.soumu.go.jp/j/sys/others/wlan_outdoor/index.htm)

ラズパイはモデルによって2.4GHz帯のみ対応のもの（Rasberry Pi 3Bなど）と、
2.4GHz帯・5GHz帯の両方対応のもの（Rasberry Pi 3B+、Raspberry Pi 4Bなど）があります。
屋外利用の場合は2.4GHz帯のみ対応のモデルを使う必要があります。

以上を踏まえて、ラズパイを用いた屋外利用可能なIoTゲートウェイの構成を考えてみます。

## 必要なもの
- [Pi-protect](https://mechatrax.com/products/pi-protect/)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1283849/9499874f-b9bf-d03a-2b07-31635a6a81c6.png" width=100%">

今回準備したものは以上です※[^1]。
[Pi-protect](https://mechatrax.com/products/pi-protect/)は防塵・防水ケースにRaspberry Pi 3Bと、[4GPi](https://mechatrax.com/products/4gpi/)（4G/LTE通信モジュール）を搭載した製品で、屋外で4G/LTE通信が可能です。

[Pi-protect](https://mechatrax.com/products/pi-protect/)のハードウェア構成をみてみます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1283849/07c19699-ef9a-f854-b1d4-5d200ef04369.png" width=70%">

[4GPi](https://mechatrax.com/products/4gpi/)以外には[slee-Pi3(電源管理/死活監視モジュール)](https://mechatrax.com/products/slee-pi/)を搭載しています。
またバックアップキャパシタにより、停電発生時には自動でOSシャットダウンが可能です。
大中小（計6個）のケーブルグランドからLANケーブルやセンサケーブルを引き込むことができます。

## IoTゲートウェイ(Wi-Fi・LTE)作成

付属の電源ケーブルを使って[Pi-protect](https://mechatrax.com/products/pi-protect/)の電源を投入し、ラズパイにログインします※[^2]。
以下の記事を参考にLTEモバイルルータ機能を実装しました。

https://qiita.com/ieking/items/5c976d09c3ca55a649e5#fn2

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1283849/5ee83001-f352-04a7-bbdc-9c8a91f6a770.png" width=90%">

好きなWi-FiデバイスのデータをLTE回線を介してクラウドサーバに送信することができます。


# まとめ
[Pi-protect](https://mechatrax.com/products/pi-protect/)を活用することで屋外の柔軟なセンシングシステムを構築することができそうです。

[^1]: SIM同梱プランではない場合は別途SIMカードを用意する必要があります。
[^2]: Pi-protectには構築済(Raspberry Pi OS)のSDカードが付属します。
【JavaScript】繰り返し処理を利用し、西暦2000年から本日までの西暦の年のみを全て表示

```javascript
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>2000年から本日までの年だけを全て表示</title>
</head>
<body>
    <script>
        document.write('<p>' + '↓現在日時分秒を取得(new Dateメソッド)' + '</p>') // ←任意行
        var date = new Date();   
        document.write('<p>' + date + '</p>')                               // ←任意行
        document.write('<p>' + '↓現在日時から「年」のみを取得(getFullYeaメソッド)' + '</p>') // ←任意行
        var year = date.getFullYear(); 
        document.write('<p>' + year +'がyaerに入る' + '</p>') // ←任意行
        document.write('<p>' + '↓初期値を設定' + '</p>')      // ←任意行
        for (var i = 2000; i<= year; i++) {
        document.write('<p>' + i + '</p>')
        }
    </script>
</body>
</html>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/4d27d750-d29c-a62b-619b-90f4acec839a.png)
MacにNode.jsをインストールする

Webシステム開発において、色々なサーバサイドJavaScript実行環境が登場してきていますが、その中でもNode.jsは根強い人気があります。

MacにNode.jsをインストールするために、nodebrewを利用してインストールする方法をまとめました。

## nodebrewをインストールする
Node.jsのバージョンを切り替えやすくするため、まずはnodebrewをインストールします。

```terminal
$ curl -L git.io/nodebrew | perl - setup
```

~/.bash_profileに環境変数を追加します。

```terminal
$ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile
```

設定を反映させるために、以下のコマンドを実行するか、ターミナルを再起動します。

```terminal
$ source ~/.bash_profile
```

## Node.jsをインストールする
nodebrewを使ってNode.jsをインストールします。

```terminal
$ nodebrew install-binary stable #安定版の場合
$ nodebrew install-binary latest #最新版の場合
$ nodebrew install-binary v14.7.0 #バージョン指定する場合
```

以下のコマンドでインストールされているか確認します。
初めてのインストールの場合、まだ利用するように設定していないため、「current: none」になっていると思います。

```terminal
$ nodebrew ls
v14.7.0

current: none
```

「nodebrew use」で利用したいバージョンを指定します。

```terminal
$ nodebrew use v14.7.0
```

再度バージョンを確認してみると、以下のように「current」にバージョンが表示されているはずです。

```terminal
$ nodebrew ls
v14.7.0

current: v14.7.0
```

以上で設定は完了です。
v-forでオブジェクトを表示


オブジェクトとは
-

全てのデータはオブジェクトです。配列やHash、数字や文字列も、オブジェクトです。


```vuejs
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
<div id="app">
<ul>
<li v-for="value in object">{{ value }}</li>
</ul>
</div>
```

```vuejs
new Vue({
  el: '#app',
 data: {
   object: {
   firstName: '太郎',
   lastName: '田中',
   age: '20才'
           }
       }
})
```

![20210507-180504.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/e0230cf5-88e2-0cfc-2ccd-c50bd901a0c2.png)


表し方
-

|v-for 適当に名前をつけて（valueで）　in 設定オブジェクト名|
|--|

*firstName,lastName,ageがキーで太郎,田中,20才がバリューと言います。

第2引数を表現
-
```vuejs
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
<div id="app">
<ul>
<li v-for="(value, key) in object">{{key}},{{ value }}</li>
           第1引数　第2引数
</ul>
</div>
```

![20210507-180257.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/82240768-08be-ac1a-8613-fea551c4fb72.png)

第３引数を取得
-

```vuejs
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
<div id="app">
<ul>
<li v-for="(value,key,index) in object">({{index}}){{key}},{{ value }}</li>
</ul>
</div>
```

![20210507-180806.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/67f5a06e-0acd-3cdb-722e-01f3d78bdd39.png)
YAMAHAのルーターで、IPv6のDNSを広告させないようにする

フレッツでIPv6接続している際、フレッツ網のDNSサーバが降ってきてしまい
自宅運用のDNSがあるのに、、、、と困っていました。
YAMAHAに問い合わせたところ、IPv6のDNSを広告させないことはできることがわかりました。
逆に言うと、ローカルなどの、自分の好きなIPv6DNSの広告はできないとのこと。

コマンドは、これだけ。
dns notice order dhcpv6 none

これで広告されなくなります。
IPv6のDNSは空欄になってしまいますが、IPv4のDNSに問い合わせしてくれるから問題なし。
ずっと悩んでいたけど簡単だった笑
MacでFortranとC++コードをコンパイルできない問題

私のMacBook Pro(MacOS Big Sur, ver11.3)で1年以上ぶりにfortranのコードをgfortranでコンパイルしようとしたところ、以下のようなエラーが発生。

```
$ gfortran ex_sum.f90 
ld: library not found for -lSystem
collect2: error: ld returned 1 exit status
```
よくわからんが、ライブラリが見つからんとのこと。
いろいろ調べた結果、gccのバージョンが古い(ver. 7だった)ことに気づき、とりあえずアップデートしたら解決しました、という話です。
gccをアップデートしたらgfortranもアップデートされました。


下のコマンド

```
$ brew upgrade gcc
```
でHomebrewを使ってgccをアップデートしようとしたらいくつかエラーが出てきました。
その中に

```
Error: gcc: the bottle needs the Xcode CLT to be installed.
```
があったので、これを調べたら

```
$ xcode-select --install
```
で解決するという記事を見つけました[1,2]。
途中、command line developer toolsをインストールしろと言われたので指示通りインストールしました。次に

```
$ brew upgrade gcc
```
で無事gcc(gfortran含む)のバージョンをアップデートできました。
最後にgfortranでコンパイルしてみました。

```
$ gfortran hello.f90 
$ ./a.out 
 HELLO WORLD
```


参考：
[1] https://qiita.com/takepan/items/2ceeab4690e726a08c57
[2] https://rcmdnk.com/blog/2019/02/26/computer-mac-homebrew/
Rails Gem JSONをシリアライズする active_model_serializersを学ぶ

## はじめに

RailsでAPIモードでアプリケーションを作ったことすらないですが
active_model_serializersというGemについて学んだことをまとめておきます。

---

### シリアライズとは
>シリアライズとは、複数の並列データを直列化して送信することである。

>具体的には、メモリ上に存在する情報を、ファイルとして保存したり、ネットワークで送受信したりできるように変換することである。他方、既にファイルとして存在しているデータや、一旦シリアライズされたデータがネットワークから送られてきた際に、プログラムで扱えるようにする作業をデシリアライズと呼ぶ。

とのことですが、データをJSONで返すのもシリアライズされた結果のようです。
今回は置いておきます。。

----

　　
## active_model_serializersとはどんなGem?
active_model_serializersとはJSONを簡単にいい感じに整形してくれるGemらしいです。
他にも同じようなGemやjbuilder(APIの記事によく出てきました)のような機能はありますが

- **レスポンスが早い**
- **SerializerクラスにJSONを整形する処理をまとめられる**
- 直感的にわかりやすい書き方ができる

というメリットがあるようです。



## active_model_serializersの導入
`Gemfile`に記述してbundle installして導入します。

```ruby:Gemfile
gem ' active_model_serializers'
```

```console
% bundle install
```

## モデル生成
```console
% rails g serializer モデル名
```
このコマンドを実行することで、appディレクトリ下にserializersディレクトリが自動的に作成され、
指定したモデル名のファイルも作成されます。
例えば
```console
% rails g serializer user
```
とするとuser_serializer.rbが作成されます。
自動生成されたserializerファイルにいろいろな記述をすることで自由にJSONを整形することができます。

### JSONに含める値を追加、削除する
```ruby:app/serializers/user_serializer
class UserSerializer < ActiveModel::Serializer
  attributes :id
end
```
初期状態ではこのような形になっていますが
ここに表示したいモデルのカラム名を入れることでJSONに含めることができます。

```ruby:app/serializers/user_serializer
class UserSerializer < ActiveModel::Serializer
  attributes :id, :name, :email
end
```
nameとemailを追加しています。

controllerにシリアライザーを指定します

```ruby:users_controller.rb
class UsersController < ApplicationController
  def index
    users = User.all
    #このように指定します
    render json: users, each_serializer: UserSerializer
  end
end
```

```json:json
{
  "id": 1,
  "name": "Tom",
  "email": Tom@example.com
}
```

まだまだ理解が足りないので
随時追加していきます。

＊追記

現在active_model_serializersは更新されていないようです。
ご指摘ありがとうございます。

active_model_selializersの[GitHub](https://github.com/rails-api/active_model_serializers/blob/master/README.md)に代わりになるGemが書いてありました。
記載します。


- [jsonapi-rb](http://jsonapi-rb.org/)は、高いパフォーマンスとモジュール化されたJSON:API専用の実装。
JSON:API Suiteのようなプロジェクトが生まれ、活発なコミュニティが存在します。
- [fast_jsonapi](https://github.com/fast-jsonapi/fast_jsonapi)は、Rubyオブジェクト用の超高速なJSON:APIシリアライザです。
- [jsonapi-resources](https://github.com/cerebris/jsonapi-resources)は、JSON:API サーバーを実装するための、リソースに焦点を当てた人気のフレームワーク。
- [blueprinter](https://github.com/procore/blueprinter)は、高速で宣言的な、API仕様にとらわれないシリアライザーで、コンポーザブルビューを使って重複を減らします。




> 参考サイト
[Rails 6で認証認可入り掲示板APIを構築する #9 serializer導入](https://qiita.com/rf_p/items/be2c97c85253f4a1a914)
[gem Active Model Serializers のドキュメントを翻訳しました](https://qiita.com/ikamirin/items/be809c845f6104aa6f48#attributes%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88)
[Rails – ActiveModelSerializers gemでサクサクAPI開発](https://rooter.jp/programming/rails-activemodelserializers/#theme1)
[Railsのactive_model_serializerについて学ぶ_100DaysOfCodeチャレンジ10日目(Day_10:#100DaysOfCode)](https://qiita.com/yuta-ushijima/items/5bb947cedd96c01d75ca)
【shopify開発備忘録】固定ページのschema設定をページごとに変えたい時の応急処置

## はじめに
shopifyをつかったECサイトを構築案件にて、
TOPページ並びに各固定ページにヒーローヘッダーに、それぞれ違う画像を表示させたいと要望がありました。
しかし、既存テーマではこの要件を満たすものがありません。

どのように実装したかのを記録として残します。
## 課題点

- 先方はhtml記法ができない
- 同一テンプレートから作成した場合、他のページも変更が反映される
- 管理画面上に項目を追加するの方法が容易ではない
- 今後画像を変更する可能性があり、簡単に行いたい。

ヒーローヘッダー付きテンプレートの作成自体は
TOPページで使用していたセクションがあったため問題はありませんが、
schemaで設定した画像が固定ページで共通になってしましました。


## 対策
全ページ共通設定になる原因は、schemaの設定データがページ毎ではなくsectionファイル単位での保存となっていることでした。
ページ依存ではなくファイル依存であることから、単純にテンプレートファイルを複製すれば一応は機能します。
よって、sectionファイルとそれを呼び出すtemplateファイルを必要分複製することにしました。

なお、sectionファイルを共通としてtemplateのみ複製した場合でschemaの設定は共通になります。

## さいごに
あくまで応急処置的対応です。
ページ数が増えるたびにtemplateとsectionにファイルが増えていく事になり、スマートではない印象です。
TOPページでセクションを使用した時はそれぞれの内容が保存されているので方法はあるのではないかと、確認中です。
簡単に管理画面側へ項目を追加できるといいのですが...
LINUXのシステムアーキテクチャ

LPICに即したメモです

#ハードウェアの基本知識
ハードウェアはudevという仕組みで管理されている
##lsでデバイス情報を確認する
###lsでデバイス一覧を表示
```
ls -dev
```
##catでデバイス情報を確認する
###CPUデバイス一覧を表示
```
cat /proc/cpuinfo
```
###IRQ　※割り込み処理の回数表示
```
cat /proc/interrupts
```
###メモリデバイス一覧を表示
```
cat /proc/meminfo
```
###USBデバイス一覧を表示
```
cat /proc/bus/usb/*
```
###PCIデバイス一覧を表示
```
cat /proc/bus/pci/*
```
##lspciでデバイス情報を確認する
###lspciで表示
```
 lspci
```
詳細を表示

```
 Lspci -v
```
より詳細を表示

```
lspci -vv
```
##起動と終了
###起動関連メッセージの確認方法
dmesg：カーネルが出力したメッセージを表示する。バッファ情報のため、起動時間が長いと消える

```
 dmesg
```
Catでメッセージログを確認する

```
 cat /var/log/messages
```
ジャーナルログを確認する
※　-k カーネルのログ、-b 起動時からのログ

```
 journalctl -kb
```

###シャットダウン　基本はshutdown
通常のシャットダウン

```
 shutdown -h
```
5分後にシャットダウン

```
 shutdown -h　+5
```
再起動する

```
 shutdown -r
```
即時、再起動する

```
 shutdown -r　now
```

#1.3 起動方法
Linuxのシステム起動には２種の方法が混在している。

それぞれ起動の方法が異なる。
・SysVinit系：古いシステム
・systemd：主にCentOS 7以降

##SysVinit系の起動プロセス
1.	BIOS起動
2.	ブートローダ起動、カーネルをメモリに展開
3.	カーネル起動
4.	ドライバ等をロード、initプロセス起動
　　initプロセスで各種自動起動を設定する
5.	指定されたランレベルに応じた起動処理を実行
6.	ログイン受付開始

●各種ファイル
・/etc/rc.sysinit　基本の設定ファイル
　ファイルシステムのマウント等、基本的な処理を行う。
　ランレベルに依存しない。
　RedHat系ディストリビューションでは/etc/rc.d/rc.sysinitのシンボリックリンク
・/etc/rc0.d 〜 rc6.d ディレクトリ
　ランレベル別起動スクリプトがある。例えばランレベル3のときは、/etc/rc3.dディレクトリ以下のスクリプトが実行される。
　ファイル名がS（Start）開始だと該当ランレベルで開始されるスクリプト。
　ファイル名がK（Kill）開始だと該当ランレベルで終了されるサービス。
・/etc/rc.local
　起動時に実行するホスト固有の処理。

●ランラベル
　レベルごとにどのサービスを起動できるか定義する
0:停止
1:シングルユーザモード
2:マルチユーザーモード（テキストログイン、NFSサーバは停止）
3:マルチユーザーモード（テキストログイン）
4:未使用
5:マルチユーザーモード（GUI）
6:再起動
S or s：シングルユーザモード※起動時にパスワード設定可能。ディストリビューションによって違う

・現在のランレベルを確認する

```
 runlebel
```

・ランレベルを変更する※実行後、全ユーザは強制ログアウトされる

```
 init 【数値 1~5】
```

・自動起動の設定　httpdの場合

```
chkconfig httpd off
```


・自動起動の設定ランレベルを指定は --levelオプション　httpdの場合

```
chkconfig --level 3 httpd on
```

##SysSystemd系の起動プロセス
1.	BIOS起動
2.	ブートローダ起動、カーネルをメモリに展開
3.	カーネル起動　※ここまではSysVinitと同じ
4.	ドライバ等をロード、systemdプロセス起動
5.	Unit（default.target）が処理される
default.target（/etc/systemd/system/default.target）は他のターゲットへのシンボリックリンク
6.	システムの用途に適したターゲットが処理される
7.	ログイン受付開始

##サービスの自動起動 Systemd
・自動起動設定

```
systemctl enable サービス名.service
```

・自動起動解除

```
systemctl disable サービス名.service
```


・自動起動設定の確認

```
systemctl is-enabled サービス名.service
```

###関連コマンド
start：サービス起動
stop：サービス終了
restart：サービス再起動
reload：サービス設定の再読み込み
status：サービスの状況を表示する
enable：自動起動を有効にする
disable：自動を無効にする
list-unit-files：すべてのUnitを表示する


●参考記事
https://eng-entrance.com/linux_startup

●履歴
作成：2021/5/7
更新：2021/5/9 SysVinit.Systemd、サービス等を追記
駆け出しpythonエンジニアのまとめ デザインパターンまとめ4(prototype)

# 趣旨
駆け出しエンジニアの備忘録の垂れ流し。
　※ 出典漏れがあればご指摘ください

> 出典: 
https://yamakatsusan.web.fc2.com/
https://dackdive.hateblo.jp/
https://www.oreilly.co.jp/books/9784873117393/

# prottypeパターン概要
生成に関するデザインパターンの１つ。
「生成すべきオブジェクトの種類を原型となるインスタンスを作り、それを複製することで目的のオブジェクトの生成を行う」
インスタンスの生成にコスト（時間的や資源的)がかかる場合や、クラスとして規定するまでもないが(もしくはすべての種別をクラスとして実装するのが現実的ではないが）複数のインスタンスに個別の属性値を付与したい、異なる振る舞いのメソッドを実装する場合などに利用する。
~~利用頻度はそんなに高くなさそう~~


## クラス図とシーケンス図
![640px-Prototype_UML.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382557/85174ad7-5648-3adc-1024-ec1729191e65.png)

![W3sDesign_Prototype_Design_Pattern_UML.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382557/bb4c8b9f-6cb0-8fb6-41d4-a287fecb3dfb.jpeg)


[wikipedia][wikipedia]より引用

## 実装方針
- Prototypeクラスはインスタンスを複製するための基底メソッド(clone)を規定する(template methodパターン)。※インスタンスを利用するための規定メソッド(use)も必要であれば規定する。
- Prototypeサブクラス(ConcretePrototypeクラス)にインスタンスを実際に複製する責務を持たせる。cloneメソッドをオーバーライド。 selfをdeepcopyしたオブジェクトを返すメソッドとする。
- オブジェクトの生成を管理するManagerクラスがあると便利。Managerクラスは、複製元のインスタンスを保持させ、指定に応じたインスタンスを複製するメソッドを実装する。
- Client側ではManagerのIFを呼び出す処理を実装する。

```python:実装例1
# prototype側
class Prototype:
  @abstractmethod
  def use(self):
    pass
  @abstractmethod
  def create(self)
    pass

class ConcretePrototype1(Prototype):
  def use(self):
    do_something1()

  def create(self)
    clone = copy.deepcopy(self) # deep copyとshallow copyに注意
    clone.set_parameter1(some_args)
    return clone

class ConcretePrototype2(Prototype):
  def use(self):
    do_something2()

  def create(self, some_args)
    clone = copy.deepcopy(self)
    clone.set_parameter2(some_args)
    return clone

# Manager側(例)
class CreatingPrototypeManager:
   def __init__(self):
        self.__ins_dict = {}
   def register_ins(self, prot_ins_key: str, prot_ins: Prototype):
       self.__ins_dict[prot_ins_key]
   def create_ins(self, prot_ins_keye, some_args: obj) 
       ins = self.__ins_dict[prot_ins_key]
       ins.set_params(some_args)
       return ins
# client側
def main():
 prot1 = ConcretePrototype1()
 prot2 = ConcretePrototype2()
 prot_mgr = CreatingPrototypeManager()
 prot_mgr.register_ins("prot1", prot1)
 prot_mgr.register_ins("prot2", prot2)
 # register_insまでの処理はManagerに持たせても良い) 

 ins1 = prot_mgr.create_ins("prot1", params1)
 ins1 = prot_mgr.create_ins("prot1", params2)
 ins1 = prot_mgr.create_ins("prot1", params3)
 ins2 = prot_mgr.create_ins("prot1", params4)
 
```

## 使い所
- 使い所
 - インスタンスの生成にコスト（時間的や資源的)がかかる、かつ、複数のインスタンスを生成するケース　 
 - クラスとして規定するするまでもないが(もしくはすべての種別をクラスとして実装するのが現実的ではないが）複数のインスタンスに個別の属性値を付与したい、異なる振る舞いのメソッドを実装したいケース


[wikipedia]:https://en.wikipedia.org/wiki/Prototype_pattern
iPad 起動しない原因及び解決する方法


iPadを使って一年ぐらいのことでした。iPadは電池残量がゼロになり、家に帰って充電しても電源が入らないようです。慌ててネットで対策案を調べてみたら、十分ほど充電せれば正常モードに入るということを知って安心しました。アップルユーザーは、このようにiPad 起動しないか、リンゴループやブルースクリーンなどの状態に陥り、悩んだことがありますか。この文章により、iPhone 起動しない時の原因と対策案についてみなさんに簡単にご紹介したいと思います。

iPad 起動しない原因：
一、iPad 電源が入らない
iPad 電源が入らない場合は、まず充電器、ケーブルの状態、iPhoneの充電状況をご確認ください。バッテリーがゼロに近い状態で長時間続くと、充電を始めてもiPhoneやiPadに充電表示が出なかったり、アップルマークが表示されないことがあります。

二、iPad フリーズして起動しない
iPadを長く使い続けると、デバイスが重くなり、アプリやデバイス本体が起動しなくなる恐れがあります。このような時、以下の対策案を試してみてください。

強制再起動

iPadフリーズして起動しない場合は、まずデバイス本体を再起動してみてください。電源ボタンとホームボタンを同時に長押しして、画面にアップルロゴが表示されたら指を離れればいいです。

ストレージ容量を確認

iPadが無事に起動できたら、まずデバイスのストレージ容量が不足しているかどうかを確認します。「設定」から「一般」、「情報」に入り、使用可能という項目の数値が極端に低いと、iPad 起動しない問題を招く可能性があります。

最新機種に変更

iPadが古すぎる場合は、システム状況がアプリ側の要求するハードウェア性能に対応できず、うまく起動できないのも当然のことです。このような場合は、このアプリの使用を諦めるか、最新機種に変更するのがよい選択の一つかもしれません。

iPad 起動しない問題を解決する方法：
例えばiOSが破損してしまい、リンゴループに突入して起動できなくなり、強制再起動しても無駄である場合、諦めるしかないのかでしょうか。実は専門的なソフトにより、壊れたiOS デバイスを正常モードに修復できます。例えばiMyFone社開発のiOSシステム修復ソフト（https://jp.imyfone.com/ios-system-recovery/）なんですが、iPad 起動しない、リンゴマーク、ブルースクリーンなどの問題を簡単に解決できるので、実用性が高いと思います。
ミニプログラムの取引コンポーネントについて

背景

ユーザーのショッピング行動を把握し、ミニプログラムのエコロジー内でユーザーのショッピング体験を確保するために、ミニプログラムの取引が標準化されたソリューションが登場しました。アクセスプランによって、動画投稿用のアカウント「視頻号」との連携とライブ配信販促を実現できます。異なる企業の要件を満たすために、このソリューションは2種類のアクセス方法に対応しており、2つのアクセス方法と適用されるシナリオの比較を次の表に示します。
![jp 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347627/08aaf0c9-c32d-80c8-badb-d27f6a51676a.png)
紹介

取引コンポーネントの標準版

取引コンポーネントの標準版は、ミニプログラム内の取引が標準化されたアクセス方式の1つで、WeChatの公式コンポーネントです。ミニプログラムの開発者は、自社のミニプログラムで取引コンポーネントの標準版を利用して、自社のミニプログラムに商品購入機能や注文リスト表示機能を導入することができます。同時に、取引コンポーネント標準版の管理バックエンドが、商品、注文、配達、店舗などの管理機能のような基本的な運営機能を備えており、開発者はコンポーネントにアクセスしてから直接利用することができます。WeChatは、バックエンドの機能を継続的にアップデータしています。

特徴：
1. 「視頻号」アカウントを連携して「視頻号」のライブ配信販促を行うことができる。元のミニプログラムから2. アクセスできます。それによって、オリジナルのユーザーを保有することができます。
3. 開発者が直接利用できるコンポーネントとインターフェースの標準版を公式に提供し、コンポーネントの機能を継続的にアップデートして、開発コストを下げます。
4. ストアの標準的なショッピングプロセスとサポート機能を直接に利用することができます。注文はオーダーセンターに同期されます。
![gouwuzujian.c299115a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347627/9e2be4f1-c5c5-47ce-fd7d-acc2736a3d49.png)

取引コンポーネントの標準版には2つの部分があり、そのすべてを導入する必要があります。
購入コンポーネント：商品詳細ページ、ショッピングバッグ、商品のチェックから購入完了までの完全なプロセスページと機能が含まれています。

注文コンポーネント：すべての注文、未払い、配達中、返金/アフターサービス、注文詳細ページ、アフターサービス詳細ページと機能が含まれています。
![dingdanzujian.31183a1b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347627/5db0a693-8294-6d06-d9fa-72c9409cf419.png)

取引コンポーネントのカスタム版

取引コンポーネントのカスタム版は、ミニプログラム内の取引が標準化されたアクセス方式の1つで、ミニプログラムのオリジナルのインターフェイスと機能を使用しています。ミニプログラムの開発者は、アクセスインターフェースでアクセスし、或いはWeChat公式プラットフォームにログインしてアクセスの申請を完了して、商品、ブランド資格、企業販売資格、商品カテゴリの合格証明などの情報をアップロードすることで商品のアップロードを完了します。注文関連のインタフェースにアクセスすることで、ユーザーが注文した商品の支払いを完了させます。 WeChatは、今後もインターフェース機能の改良を進めていきます。

特徴：
1. 「视频号」アカウントを連携して、「视频号」ライブで商品を販売することができます。
2. 元のミニプログラムからアクセスできます。それによって、オリジナルのユーザーを保有することができます。
3. 元のミニプログラムの機能や画面をそのまま保有することができます。
4. 開発者が直接利用できるコンポーネントとインターフェースの標準版を公式に提供し、コンポーネントの機能を継続的にアップデータして、開発コストを下げます。
5. 注文はオーダーセンターに同期されます。

ミニプログラム開発ソリューション
現在、利用者10億人を超えるWeChatユーザー。そのWeChatユーザーが手軽に様々なサービスを利用することができるのが、ミニプログラム（小程序）です。

ミニプログラムで展開できるサービスは、飲食、旅行、ゲームをはじめ金融、交通、などの人々の生活に密着したものまで利用されています。

インバウンドが叫ばれている昨今、中国で日常的に利用されているミニプログラムをいち早く導入し、中国インバウンドビジネスの一歩先を進みませんか？
![1617961642751.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347627/d8adeb5a-d907-68b2-77b3-18db5151da0f.png)

ミニプログラム開発プロセス
詳細を見る：https://www.monstar-lab.com.cn/insights/miniprogramblog/

WeChat公式文章より転載
https://developers.weixin.qq.com/miniprogram/dev/framework/ministore/minishopopencomponent2/Introduction.html
Railsチュートリアルで早速Railsがインストールできなかった話

# 背景
Railsのチュートリアルをチュートリアル通り進めると、早速Railsのインストールでエラーが出たので、対処法。

https://railstutorial.jp/chapters/beginning?version=6.0#cha-beginning

# 実行したコマンド
```
gem install rails -v 6.0.3
```

# エラーの内容
```
ERROR:  Error installing rails:
	ERROR: Failed to build gem native extension.

    current directory: /Users/tomoki.katsu/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/mimemagic-0.3.10/ext/mimemagic
/Users/tomoki.katsu/.rbenv/versions/2.6.0/bin/ruby -rrubygems /Users/tomoki.katsu/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/rake-12.3.2/exe/rake RUBYARCHDIR\=/Users/tomoki.katsu/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/extensions/x86_64-darwin-19/2.6.0/mimemagic-0.3.10 RUBYLIBDIR\=/Users/tomoki.katsu/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/extensions/x86_64-darwin-19/2.6.0/mimemagic-0.3.10
rake aborted!
Could not find MIME type database in the following locations: ["/usr/local/share/mime/packages/freedesktop.org.xml", "/opt/homebrew/share/mime/packages/freedesktop.org.xml", "/opt/local/share/mime/packages/freedesktop.org.xml", "/usr/share/mime/packages/freedesktop.org.xml"]

Ensure you have either installed the shared-mime-info package for your distribution, or
obtain a version of freedesktop.org.xml and set FREEDESKTOP_MIME_TYPES_PATH to the location
of that file.

This gem might be installed as a dependency of some bigger package, such as rails, activestorage,
axlsx or cucumber. While most of these packages use the functionality of this gem, some gems have
included this gem by accident. Set USE_FREEDESKTOP_PLACEHOLDER=true if you are certain that you
do not need this gem, and wish to skip the inclusion of freedesktop.org.xml.

The FREEDESKTOP_PLACEHOLDER option is meant as a transitional feature, and will be deprecated in
the next release.

Tasks: TOP => default
(See full trace by running task with --trace)

rake failed, exit code 1

Gem files will remain installed in /Users/tomoki.katsu/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/mimemagic-0.3.10 for inspection.
Results logged to /Users/tomoki.katsu/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/extensions/x86_64-darwin-19/2.6.0/mimemagic-0.3.10/gem_make.out
```

調べてみるとどうやら、`shared-mime-info`をインストールするか、インストールするRailsのバージョンを変更する必要があるみたい

# 解決方法
解決方法は以下２通り
## インストールするバージョンを変更
Rails `5.2.5` / `6.0.3.6` / `6.1.3.1`をインストールする

## `shared-mime-info`をインストールする
下記コマンドで`shared-mime-info`をインストールします。

```
brew install shared-mime-info
```

# 参考記事
https://weblog.rubyonrails.org/2021/3/26/marcel-upgrade-releases/

https://hackmd.io/@mametter/mimemagic-info-ja
建築塗装業向け見積書作成ツールを開発するにあたって苦労した話

# 背景
私は2020年10月から6ヶ月間、エンジニア起業家養成スクール「ジーズアカデミー東京」のLABコースを受講し、起業目的の同期（発案者）とチームを組んで、建築塗装業向け見積書作成ツールを開発しました。
**開発にあたって特に苦労した①サービス設計②データベース設計③開発体制構築の3点(コードを書く以前の話)について、個人的な振り返りとして、概要を整理します。**

#作成したプロダクト
建築塗装業の零細企業向けに見積書作成ツールを開発しました。発案者は、塗装業界に16年間従事しており、その現場経験から着想を得たプロダクトです。また、発案者の人脈からテストユーザーが存在しており、テストユーザーへのヒアリングと改善を繰り返しながら開発しました。

###プロダクトの機能
建築塗装業では、現場調査(現場で塗装に必要な材料の確認)を行った後、事務所に戻って見積書を作成します。本プロダクトを使用すると、現場調査時にスマホで見積書を作成できるので、大幅な時間短縮となります。

※プロダクトサムネイル
<img width="400" alt="白色バージョン-small-15666.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1444862/62ae6042-c5a7-0b33-b362-7f105043d3f1.png">

# ①サービス設計について

###設計開始時の課題

1. 発案者は、これまでの経験から建築塗装業界に対して、多くの課題感を持っていたが、どの課題から解決していくべきなのか、整理できていない状態だった。
2. 私が建築塗装業についてあまり知らなかった(合板関連の案件に携わったことがあったので、建築現場の雰囲気は知っていましたが、、)

###設計方法
下記の手順で整理を行い、また自分自身の業界理解を深めました。

1. 発案者の最終ゴール設定
発案者のゴールを言語化するために、ディスカッションを繰り返し、「建築業界の下請けを強くする」を最終ゴールと設定。

2. 建築業界のビジネスフロー/プレイヤー等を整理し図式化
建築業界にはどんなプレイヤーが存在するのか？
案件の起点は誰か？　
建築物はどの様に作られるのか？　
お金は誰から誰に支払われるのか？
...などなど湧いて出る疑問を、発案者やテストユーザーへのヒアリングを行い整理。複雑な多重下請け構造に驚愕しました、、、

3. プレイヤー毎の課題の洗い出し
洗い出した各プレイヤーが抱える課題を発案者の経験や推測で洗い出しました。ここでは、塗装業において未使用在庫のロスが多いなど、様々な課題が浮き彫りになりました。
※建設業許可区分の整理
![スクリーンショット 2021-04-28 14.06.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1444862/39b30feb-359c-e7d4-694a-5a2841baa021.png)
※ビジネスフローとプレイヤー整理の一例
![スクリーンショット 2021-04-28 14.07.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1444862/462d174f-b2bd-9c97-fc9b-81ae6e13e648.png)

###サービス内容の決定
最終ゴール「建築業界の下請けを強くする」への第一歩として適正であること(=サービスの拡張性が高い)、またチームメンバーのスキルで実装可能であること、から見積書作成に焦点を当て、開発を行いました。

#②データベース設計について

見積書の出力に必要なデータの整理と正規化を行い、ER図やテーブル定義書を作成しました。

###データの整理
見積書作成の疑似体験やヒアリングを行いデータを約900通りに整理。ある項目が決まれば何が決まるのか？を一つ一つ紐解いて行きました(ここが一番大変だった、、)。

※データの一例
![スクリーンショット 2021-04-28 14.31.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1444862/b2165c8b-2da4-5fc2-a860-6129f58b25ae.png)

###データの正規化
整理したデータを基に第1正規化〜第3正規化を行い、データの重複を排除したテーブルを設計。

1. 第1正規化
非正規形から繰り返し項目を削除する。

2. 第2正規化
部分関数従属を別テーブルに外だしする。部分関数従属とは、主キーを構成する一部のカラムによって決定するもの。

3. 第3正規化
推移的関数従属を別テーブルに外だしする。推移的関数従属とは、主キー以外のカラムによって決定するもの。

#③開発体制
開発期間が2ヶ月と短いこと、テストユーザーの意見を柔軟に取り入れる必要があることから、アジャイル開発のスクラムのような方式で開発を進めました。具体的には、タスクを洗い出すことで、プロジェクトを小分けに区切り、タスクごとの担当とスケジュールを設定し、タスクの進捗管理を実施しました(Notionを利用)。
また、チーム間でのコミニケーションを重視する為に、slackにチームの日報チャンネルを作成し、日次のtodoと進捗を共有することで、チーム内でのコミュニケーションを活発化させ、問題の即時共有等を行いました。

※タスクの洗い出し
![スクリーンショット 2021-04-27 18.38.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1444862/84e18c04-8915-c4d5-e251-ed40f2fdc34b.png)
※タスク毎のスケジュール設定
![スクリーンショット 2021-04-27 18.40.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1444862/4f33e7fa-07a0-5e42-56b2-2fccf8d42097.png)
※タスクの進捗管理
![スクリーンショット 2021-04-27 18.37.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1444862/5070ae8f-37b2-be1c-77d7-e4a60eeee28f.png)

# 振り返り
今回、起業目的のプロダクト開発に携わり、複雑な業界/データ構造の整理など苦労は多々ありましたが、その分、たくさんの学びがありました。特に、テストユーザーへヒアリングできる環境はありがたく、ユーザーが求めていることは何か？という目線を常に意識する大切さが身にしみて分かりました。**今後の開発においても、ユーザー目線の重要性を忘れず、またユーザー目線を持てるように業界理解や情報inputを怠らないようにしたいと思います。また、今回は、手探りの状態でデータベース設計や開発体制を構築したので、さらに経験を積んで、拡張性のあるデータベース設計方法や体系だった開発手法を学んでいきたいと思います。**
forループを用いて辞書のキーとバリューを同時に表示させる(今日のPython Day7)

#0. はじめに
　ついに1週間たちました。投稿している本人が一番驚いています。だってまだ7回しか投稿してないから。自分はもう100件くらい投稿したと思っていたらまだ7件とは。
　話は変わりますが、1週間に1回くらいはやや難しめの問題を出そうと記事投稿をする前から考えていました。とりあえず1週間記念ということで今日はやや難しめの問題を出題です。でも、きちんと[『入門Python3 第2版』](https://www.amazon.co.jp/%E5%85%A5%E9%96%80-Python-%E7%AC%AC2%E7%89%88-Bill-Lubanovic/dp/4873119324/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E5%85%A5%E9%96%80python&qid=1620373766&sr=8-1)の第11章までの知識で解けます。

#1. 問題
以下の辞書dのキーとバリューを1つずつ出力せよ (以下のようになっていれば正解)。


```python
# 辞書d
d = {"C++": "ネコ", "Java": "ヤギ", "JavaScript": "サイ", "python": "ニシキヘビ"}

# 結果
# C++ ネコ
# Java ヤギ
# JavaScript サイ
# python ニシキヘビ
```

#2. ヒント
辞書のキーとバリューをすべて取得するにはitems()関数を用います。


#3. 解答
```python
d = {"C++": "ネコ", "Java": "ヤギ", "JavaScript": "サイ", "python": "ニシキヘビ"}
for k, v in d.items():
    print(k, v)
```

#4. 解説
　まず辞書dのキーとバリューを1つずつ出力するのでfor文を用います。次に辞書のキーとバリューをすべて取得するにはitems()関数を用います。ここが難しかったかもしれません。

#5. まとめ
・反復処理にはfor文を用いよう (今回はwhile文よりもfor文の方がやりやすいと思います)。
・辞書のキーとバリューをすべて取得するにはitems()関数を用いよう。

#6. おまけトーク
　なんでPythonのイメージはニシキヘビなんですかね？最後まで読んでいただき本当にありがとうございます。
Markdown テーブル記法 メモ

# 目的

- Markdown記法にてテーブルを記載する方法をメモ的にまとめる

# 方法

- 下記のように記載することでテーブルを作ることが出来る。

    ```markdown
    | 項目 | 情報 | 備考 |
    | :-- | --: | :-: |
    | OS | macOS Catalina(10.15.5) | 特になし |
    ```

- 下記のようにプレビューされる。

| 項目 | 情報 | 備考 |
| :-- | --: | :-: |
| OS | macOS Catalina(10.15.5) | 特になし |

- テーブル記法の2行目で記載データの寄せ位置を設定することが出来る。
    - `:--`と記載することで左より
    - `--:`と記載することで右より
    - `:-:`と記載することで中央より
Macターミナルで任意の位置にカーソルを移動する方法

## 結論
option + マウスカーソルで選択
## 質問
打った後に、ああ、ヘッダーだけ欲しいんだったとなった時とか皆さんはどのように打ち直ししてますか？

```
curl https://www.google.com/
```

僕の場合は、control + Aを打った後、→キーを数回うって「-I」をタイプしてました。

```
curl -I https://www.google.com/
```

もしも、マウスを使ってもいいよという人は　option + マウスカーソルで選択してみてください。
今回の例のような短い文であればそこまで速度に変化はありませんが、50文字くらいのコマンドの真ん中あたりに追加しないといけない場合など威力を発揮すると思います。
コンピューテッドプロパティ　swift

#■計算されたプロパティ
■基本
コンピューテッドプロパティは、プロパティ自身では値を保存せず、すでに存在するストアドプロパティ
などから計算して値を返すプロパティです。
関数に似ている。

■書き方

``` swift
var 変数名:型名 {
      get {
           return 文によって値を返す処理
      }
      set {
           値を更新する処理
           プロパティに代入された値には定数newValueとしてアクセスできる
        }
       }
```

#■getとset
コンピューテッドプロパティにはgetとsetというものがある。

■get
ほかのストアドプロパティなどから値を取得して、コンピューテッドプロパティの値として返す処理です。
と書いてる
■細かく言うと
コンピューテッドプロパティにアクセスした時にgetの中で他のストアドプロパティを使って計算文を書いてそれの計算結果をreturnで返す。
 getするぜ！！

■set
プロパティに代入された値を使用して他のストアドプロパティを更新する。
ここ重要:他のストアドプロパティを更新する！！
■細かく言うと
コンピュテッドプロパティに新たな値が代入されました。
その新たな値はsetの中にsetの特殊引数(newValue)としてされます。
newValueの型はコンピュテッドプロパティの型と同じものです。
setするぜ！

#■とりあえずコードを書いてみよう！

``` swift
//他のストアドプロパティ
var price = 100
var taxRate = 1.08

//コンピューテッドプロパティ
 var taxPrice:Double {
      get{ return Double(price) * taxRate}
      set{ price = Int(newValue * 3)}
}

//ただ単にコンピュテッドプロパティにアクセス
print(taxPrice)
//結果: 108.0

//コンピュテッドプロパティに値を代入してるからsetが呼ばれ値は引数のnewValueになる。
//他のストアドプロパティpriceが変更されている。
taxPrice = 200

//priceの値が変更されてから新たな値がreturnされている。
print(taxPrice)
//結果: 648.0    
```

#■縮めた書き方

``` swift
var price = 100
var taxRate = 1.08

//getのみでも書ける。
 var taxPrice:Double {
      get{ return Double(price) * taxRate}
}

//getとreturnを省いてもgetとなり同じ動きになる。
 var taxPrice:Double {
      { Double(price) * taxRate}
}

```
注意:setのみを書くことはできないsetを使うときは必ずgetが必要


#■カプセル化(変更しないように)

コンピューテッドプロパティは値をカプセル化もできる。

getはただ単に中身の値を返すものなのでgetだけの場合使用上中身を絶対変更できない。

``` swift
var loginkey:String {"key"}

//変更しようとするとエラー
loginkey = "aaa"
//エラー:Cannot assign to value: 'aaa' is a get-only property
//getしかないでそこ代入できへんってマジでって言ってそう...
```

とりあえずアウトプットです。
何かあればまた更新します。
静的なToDoリスト

#概要

HTMLとCSSでToDoリストを作りました。
JSで動きを付ける前の静的なサイトです。

![スクリーンショット 2021-05-07 16.04.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033397/f803a5a1-4ab0-37d4-b4ea-264e20a8849a.png)

①タスク入力欄
②タスクの優先度をラジオボタンで作りました。
③inputから入力された値がテーブルタグに追加されます。
④完了したタスクはチェックボックスをクリックすることにより削除されます。

#HTML(入力欄)

ToDo入力欄です。

```index.js
<section1>
  <div class="form">
    <label for="todo" class="todos">ToDo</label>
    <input type="text" placeholder="タスクを入力してね" id="todo">
      <input type="radio" name="todo" value="high" class="radio1">
      <label>高</label>
      <input type="radio" name="todo" value="medium" class="radio2">
       <label>中</label>
       <input type="radio" name="todo" value="low" class="radio3">
       <label>低</label>
    <button class="submit">DO</button>
  </div>
</section1>
```

1,ラジオボタン
input要素のtype属性にradioを追加するとラジオボタンになります。ラジオボタンは、複数の選択項目のうち１つだけ選択できる形式のボタンです。共通項目に使用するラジオボタンにはすべて同じ名前を指定する必要があります。
またデータが送信されたときにどの項目が選択されたのかを判別するためにvalue属性には個別の値を指定します。
今回のnameはtodo、valueは優先度の高さheigh,medium,lowとしました。

#HTML（テーブル）

次にデータ追加後のデータが反映される、テーブルです。

```index.html
<section2>
  <table>
    <caption>リスト</caption>
    <tr>
      <th class="col-1">日付け</th><th class="col-2">ToDo</th><th class="col-3">重要度</th><th class="col-4">完了</th>
     </tr>
     <tr>
       <td>5/5</td><td>ご飯を食べる</td><td>高い</td><td><input type="checkbox" name="do" value="Done"></td>
      </tr>
   </table>
</section2>
```

1,trタグ
テーブルタグの行に当たります。

2,th
table headerの略です。
このリストの見出しに当たります。また,各見出しの幅を設定するためにclass属性を付与しました。

CSSでは以下のように設定しました。

```style.css
.col-1 {
  width: 10%x;
}

.col-2{
  width: 60%;
}

.col-3 {
  width: 10%;
}

.col-4{
  width: 10%;
}
```
3,td
テーブルタグのデータです。
ToDoフォームに入力されたデータが反映されます。

4,チェックボックス
input属性にcheckboxを指定するとチェックボックスになります。チェックボックスは、複数の選択項目の中で個数を限定せずに選択できるようにする場合に使用します。
name,value属性はラジオボタン同様です。
Node.js 10→14にアップデートしてみた

#背景
備忘録。
AWSLambdaの対応ランタイムは10が、7月ごろ対応期限だったから急遽アップデート。

# 1. brewのアップデート
brew update
brew upgrade
brew doctorでこの際にチェック

# 2. nodenvにnode 14の最新を入れる
nodenvで最新バージョンが取得出来ないので、これを参考してany envを使えるようにした。https://qiita.com/turara/items/6b7f4a8e3770a7074072

Node.js 14.16.1を選択。LTSだから長期サポート。

# 3. パッケージをメンテナンス
パッケージ・モジュール・ライブラリ。言葉統一しよう。これからはパワーリフティングしよう。

ncuコマンドでマイナー・バッチアップデートから順にアップデートしつつ、gitへコミットしていく。
UITableViewで⌘かshiftを押しながら複数のセルを選択するAPI

iOS13では、主にCatalystでの体験の統合を目的として`UITableView`や`UICollectionView`に対して幾つかの拡張が加えられました。

この記事ではそのうちの1つの「iPadでショートカットキーを押しながら画面をタップ」を提供するAPIについて記載します。

# 記事の目的
- 辿り着きにくいマイナーAPIの一次情報への到達補助、情報統合
- APIの扱い方や注意事項の記載

# WWDC
https://developer.apple.com/videos/play/wwdc2020/10109/?time=401

言及されているWWDCセッションは上記です。このセッションはResponder Chainについても解説をしている貴重なセッションのため、勉強になりオススメです。

このセッションの6:35~ぐらいから該当の内容が始まります。

# 実行可能なジェスチャ
UITableView、もしくはUICollectionViewに対して以下の3つを実行することができます。

1. shiftを押しながら項目をタップすることで編集モードに自動突入しつつ選択できる
2. 2本指でスクロールダウンかスクロールアップをすると、その編集モードに自動突入しつつ指定範囲を選択できる
3. ⌘キーをホールドしながら複数のセルをタップして編集モードに自動突入しつつ選択する。

詳しい挙動はAppleの[ファイルアプリ](https://apps.apple.com/jp/app/ファイル/id1232058109)で挙動をお試しください。

# 利用するAPI
APIは非常にシンプルで、[UITableViewDelegate](https://developer.apple.com/documentation/uikit/uitableviewdelegate)に3つのデリゲートメソッドがあるのみです。

1. [tableView(_:shouldBeginMultipleSelectionInteractionAt:)](https://developer.apple.com/documentation/uikit/uitableviewdelegate/3183943-tableview)
2. [tableView(_:didBeginMultipleSelectionInteractionAt:)](https://developer.apple.com/documentation/uikit/uitableviewdelegate/3183942-tableview)
3. [tableViewDidEndMultipleSelectionInteraction(_:)](https://developer.apple.com/documentation/uikit/uitableviewdelegate/3183944-tableviewdidendmultipleselection)

このshoudBeginでtrueを返すことによって、システムが自動で選択をonにしてくれます。
例えば「このデリゲートによって複数選択に突入した場合にnavigationBarのボタンをdoneやcancelに変えたい。終わったら戻したい」などの対応をする必要が出てくると思うのですが、それはdidBeginとdidEndのタイミングで実装可能です。

UICollectionViewの場合も同様に、[UICollectionViewDelegate](https://developer.apple.com/documentation/uikit/uicollectionviewdelegate)にて3種類のデリゲートメソッドがあります。

1. [collectionView(_:shouldBeginMultipleSelectionInteractionAt:)](https://developer.apple.com/documentation/uikit/uicollectionviewdelegate/3183916-collectionview)
2. [collectionView(_:didBeginMultipleSelectionInteractionAt:)](https://developer.apple.com/documentation/uikit/uicollectionviewdelegate/3183915-collectionview)
3. [collectionViewDidEndMultipleSelectionInteraction(_:)](https://developer.apple.com/documentation/uikit/uicollectionviewdelegate/3183917-collectionviewdidendmultiplesele)

# 扱い方・注意事項
## 編集モード
これらのデリゲートは、viewやviewControllerの[setEditing(_:animated:)](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621378-setediting)を自動で呼び出してくれるわけではありません。(UITableViewControllerを利用している場合はスワイプの時のように自動でeditingを設定してくれるかもしれませんが、未検証です)なので、基本的には以下のように編集状態の設定を行う実装が必要です。

```swift:ViewController.swift
func tableView(_ tableView: UITableView, didBeginMultipleSelectionInteractionAt indexPath: IndexPath) {
    self.setEditing(true, animated: true) // ViewControllerのsetEditingを呼び出し
}
```

# 公式解説付きサンプル
この解説ページを開き、上部の「Download」を実行することでサンプルがダウンロードできるので、お手元のシミュレーターや実機にて挙動を確かめられます。
[Selecting Multiple Items with a Two-Finger Pan Gesture](https://developer.apple.com/documentation/uikit/uitableviewdelegate/selecting_multiple_items_with_a_two-finger_pan_gesture)

# 関連セッション
https://developer.apple.com/videos/play/wwdc2019/224/

こちらのセッションでセルのセレクションに関する新しいジェスチャーが紹介されています。
Charlesを使ってスマホ実機でhostsを確認する方法

##Charelsの使用方法
###基本的な設定方法

- [iPhoneを脱獄せずにhostsを書き換える方法](https://www.futaego.com/2017/iphone%E3%82%92%E8%84%B1%E7%8D%84%E3%81%9B%E3%81%9A%E3%81%ABhosts%E3%82%92%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B%E6%96%B9%E6%B3%95/)

※Charlesは30日間無料で使えます。
 試用期間中は、5分後くらいに強制ログアウトするので要注意。
 1ライセンスで50ドルします。


###最新のCharelsの細かい設定方法
上の記事は古いので、最新のCharelsの細かい設定方法はこちらを確認してください。

- [通信系のデバッグには Charles が便利](https://qiita.com/usagimaru/items/d340e87da98e62f99b60)

##スマホ実機の画面が変わらない時は？

**VPN接続を解除**しないと見れません！
これで何時間もロスしました。。。
VPN接続の解除方法は以下のサイトを確認してください。
（一時的な解除方法から永久的に解除する方法まで書いています。）

- [iPhoneでVPN接続を解除できない時の対処法！【1分でできる！】](https://bestvpn4you.com/unlockvpn/)

##スマホ実機で確認し終わったら...

セキュリティ対策で以下の設定を戻しましょう。

- VPN接続

- スマホ実機「プロキシの構成」をオフにする。
Wi-Fi > 該当のWi-Fi > 手動 → オフ
Couchbase Server固有のJOIN句〜実例による解説

# はじめに

ここでは、Couchbase ServerのN1QLで利用することのできる、二つの特殊なJOINのタイプについて解説します（CouchbaseのJOINには３つの種類が存在し、もう一つはANSI JOINです）。

この二つのJOINは、それぞれ混同しやすいCouchbase独自のキーワードを持ちます。すなわち、`ON KEYS`と`ON KEY`です。

公式ドキュメント（後掲）にあたることにより、構文の理解（句中の右辺、左辺の意味）を得ることができますが、ここでは、直感的な理解を助ける事を意図し、実例による解説を行います。

# Lookup JOIN

`ON KEYS`句を用います。

### 利用例
```SQL
SELECT DISTINCT airline.name, airline.callsign, route.destinationairport, route.stops, route.airline
FROM `travel-sample` route
  JOIN `travel-sample` airline
  ON KEYS route.airlineid
WHERE route.type = "route"
AND airline.type = "airline"
AND route.sourceairport = "SFO"
AND route.stops = 0
LIMIT 4;
```
#### データモデル
- 「ルート」と「エアライン」という、二つの種類のデータモデルがある
- 「ルート」モデルのデータ構造は、「エアライン」（への参照）を含む

#### クエリの目的
- 特定の条件（SFO発の直行便）を満たす「ルート」の情報とともに、その「ルート」が持つ「エアライン」の情報を取得する


# Index JOIN

`ON KEY`句を用います。

### 利用例
```SQL
SELECT * FROM `travel-sample` airline
  JOIN `travel-sample` route
  ON KEY route.airlineid FOR airline
WHERE route.type="route"
AND airline.type="airline"
AND airline.icao = "MLA";
```
## データモデル
#### データモデル
- 「ルート」と「エアライン」という、二つの種類のデータモデルがある
- 「ルート」モデルのデータ構造は、「エアライン」（への参照）を含む

#### クエリの目的
- 特定の条件（ICAOコード「MLA」）を満たす「エアライン」から、「ルート」で用いられているものを抽出し、その情報を取得する

#### 注意

上記のクエリを実行するためには、下記のインデックスが必ず必要になります（ `travel-sample`バケットのプライマリーインデックスで代替することはできません）。

```
CREATE INDEX airline_icao ON `travel-sample`(icao) WHERE type="airline";
```

# 最後に
なぜ、それぞれのキーワードに、単数形・複数形が用いられているかを考えてみるのも、興味深い試みかと思います。

最後に、蛇足となりそうですが、公式ドキュメントの[Adaptive Index](https://docs.couchbase.com/server/current/n1ql/n1ql-language-reference/adaptive-indexing.html)の章では、ここで扱ったINDEX JOINでは、Array Index（Adaptive Indexを含む）を利用できない、とされています。現実のプロジェクトでの応用の経験がないため、確定的なことは言えませんが、おそらくあまり意識しなければならない場面はないのではないかとも思われます。

# 参考情報

### 公式ドキュメント
[JOIN Clause](https://docs.couchbase.com/server/current/n1ql/n1ql-language-reference/join.html#index-join-clause)
ElixirでUnknown CAが出るときの対処法

独自の証明書などを使っていないのに`TLS :client: In state :wait_cert_cr at ssl_handshake.erl:1895 generated CLIENT ALERT: Fatal - Unknown CA` が出てHTTPoisonなどのライブラリが使用できない。

# 解決策

`mix deps.update certifi` を実行する。
JavaScriptの基礎を改めて Part3

* JavaScriptを学習して重要だと感じた点をまとめていく。

# 正規表現
* 正規表現と文字列のパターンを定義したもの。  
正規表現オブジェクトはリテラルかRegExpコンストラクタで作成する。

```JavaScript:例1
const patternA = /a+/;
// aという文字列が1回以上連続している文字列を表現
const patternB = new RegExp("\s{4}");
// スペースが４回以上連続している文字列を表現
```
* 正規表現を用いることでより広範囲な文字検索ができるようになる。
正規表現の種類については[こちらに網羅されている。] 
(https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions)

# クロージャー
* JavaScript Primerでは以下のように解説している。  

> クロージャーとは「外側のスコープにある変数への参照を保持できる」という関数が持つ性質のことです。
※ JavaScript Primerの項目クロージャーより抜粋。 
https://jsprimer.net/basic/function-scope/#closure

* クロージャーはガベージコレクションと静的スコープの性質を利用しているので、  
まずはガベージコレクションと静的スコープについてまとめていく。  
※ ガベージコレクションと静的スコープが理解できているなら後述の「クロージャー（続き）」に飛んでください。

# ガベージコレクション
* メモリ上に展開されている使わなくなった変数などを開放すること。  
（前提知識：プログラム上で定義された変数などのオブジェクトはメモリ上に展開される）  
具体的にはメモリ上に展開されているオブジェクトが「どのオブジェクトからも参照されない状態」になるとガベージコレクションが動く。

```javascript:例２
let str = "abc";
/* "abc"という文字列データがメモリ上に展開される。
   この時点では変数ｓｔｒが"abc"を参照している。 */
ｓｔｒ = "def";
/* "def"という文字列データがメモリ上に展開される。（変数ｓｔｒの中身が変わる）
   この時点で文字列"abc"を参照しているオブジェクトはないためガベージコレクションによって
   文字列"abc"がメモリ上から開放される。 */
console.log(str);
>> "def"
```

* 逆に「何かしらのオブジェクトに参照されている状態」をキープすればメモリ上に残しておきたいオブジェクトを  
ガベージコレクションの対象外にすることができる。

```javascript:例３
const createString = () => {
  let str = "abc";
  return str;
}

const getString = createString();
// 変数getStringに関数createStringの結果を代入。
console.log(getString);
>> abc
// 文字列"abc"は変数getStringに参照されているためガベージコレクションの対象外となる。
```

# 静的スコープ
＊ オブジェクト呼び出し時に参照する範囲（スコープ）および順番を静的に決定しているもの。  
JavaScriptはオブジェクト呼び出し時にまず呼び出されたスコープ内で対象となるオブジェクトを参照（探す）する。
オブジェクトが呼び出されたスコープ内で対象オブジェクトが見つからなかった場合は、  
一つ外側のスコープで対象オブジェクトを参照（探す）する。 
<b>この参照範囲が遷移する動きをスコープチェーンという。

```javascript:例４
const x = "エックス";
const y = "ワイ";
// グローバルスコープ内で変数ｘ,yを定義。
const callXY = () => {
  const x = "えっくす";
  // 関数callXYの関数スコープ内で変数ｘを定義
  console.log(x);
  // 変数ｘを呼び出す。
  >> "えっくす"
  // 変数ｘを呼び出したスコープ（今回の例だとcallXYの関数スコープ）内にある変数ｘを参照。
  console.log(y);
  >> "ワイ"
  /* 変数ｙが関数callXYの関数スコープ内に無いため一つ外側のスコープ（今回の例だとグローバルスコープ）で
     定義されている変数ｙを参照する。 */
}
```

# クロージャー（続き）
＊ クロージャーを使うことによって関数内に残しておきたいオブジェクトをガベージコレクションされずに  
保持することができるようになる。

```javascript:例５
const createCount = () => {
  let count = 0;
  // 関数createCountのスコープ内に変数countを定義。
  return function plusCount() {
    count += 1;
    /* 関数plusCountのスコープ内に変数countが定義されていないのでスコープチェーンによって
       関数createCountのスコープ内に定義されている変数countが参照される。 */
    return count;
  };
};

const myCount = createCount();
console.log(myCount);
>> 1
console.log(myCount);
>> 2
console.log(myCount);
>> 3
/* 変数countは関数createCountに参照されているためガベージコレクションされずに
   関数plusCountで＋１された変数countを保持することができる。 */
```
Java HTMLをPDFに変換　

<p><strong>今日は Spire.PDF for Javaという無料のライブラリを使って、HTMLをPDFに変換する方法を紹介します。今回はSpire.PDF for Java　3.6.6以上のバージョンが必要なので、要注意です。また、従来の方法とは違って、今度はGUI機能も必須だから、Xvfbといったようなプログラムをダウンロードしておいてください。</strong></p>
<p><strong>下準備</strong></p>
<p><strong>1.E-iceblueの公式サイトから<a href="https://www.e-iceblue.com/Download/pdf-for-java.html">Free Spire.PDF for Java</a>無料版をダウンロードしてください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210507/20210507154602.png" alt="f:id:lendoris:20210507154602p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
<p><strong> </strong></p>
<p><strong>2.IDEを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいSpire.PDF.jarを参照に追加してください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210507/20210507154606.png" alt="f:id:lendoris:20210507154606p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
```JAVA

import com.spire.pdf.graphics.PdfMargins;

import com.spire.pdf.htmlconverter.qt.HtmlConverter;

import com.spire.pdf.htmlconverter.qt.Size;

 

public class HtmltoPDF {

    public static void main(String[] args) {

        //HTML を名付ます。

        String url = "https://www.google.com/";

        String fileName = "Result.pdf";

       

        String pluginPath = "D:/Qt/plugins_32";

        HtmlConverter.setPluginPath(pluginPath);

        //PDFで保存ます。

        HtmlConverter.convert(url, fileName, true, 1000000, new Size(600f, 900f), new PdfMargins(0));

    }

}
```
<h4><strong>実行結果</strong></h4>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210507/20210507154732.png" alt="f:id:lendoris:20210507154732p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
<p><strong> </strong></p>
[Rails/devise] アカウント情報の編集・変更機能の実装

#概要
deviseでユーザー管理機能を実装した際、

「ユーザーがパスワードやアイコンの画像を編集・変更が行える機能は必須では・・・」

と考えられたため実装しました。deviseで作成したupdateの設定やapplication_controller.rbに追記を行えば簡単に実装できましたのでここに記述します。

#環境
- macOS Big Sur バージョン 11.2.3

- Ruby 2.6.5

- Rails 6.0.3.6

- Mysql  Ver 14.14 Distrib 5.6.51

#前提
- deviseをインストールし、モデルを作成している。  
※この記事ではコントローラーの作成から始めます。

#流れ
１．deviseのコントローラーを作成
２．edit.html.erbにformを記述
３．routes.rbにupdateのルーティングを記述
４．application_controller.rbにてupdateによるパラメーターの変更を許可する
５．registrations_controller.rbに上書き後の遷移先を記述

#１．deviseのコントローラーを作成
deviseのコントローラーを作成します。

```ターミナル.
rails g devise:controllers users
                           ↑ユーザー情報に関わるモデル名
```
これでregistrations_controller.rbを含むdeviseのコントローラーが作成されます。

#２．edit.html.erbにformを記述

```erb:edit.html.erb
<%= form_with model: @user, url:user_registration_path, class: 'registration-main', local: true do |f| %>
　　　　　　　　　　　　　　　　　　　　　　　　　↑ 「rails routes」で表示されるusers/registrations#updateのPrefixを記述。
```
#３．routes.rbにupdateのルーティングを記述
edit.html.erbで設定したボタンを押すとregistrations_controller.rbを経由してデータが上書きされるようにします。

```rb:application_controller.rb.
Rails.application.routes.draw do
  devise_for :users, controllers: {
    sessions: "users/sessions",
    registrations: "users/registrations" #　registrations_controller.rbに導くためのルーティングを記述
  }

# 中略

  root to: 'photos#index'
end
```
registrations_controller.rbを経由するためのルーティングを設定しました。

#４．application_controller.rbにてupdateによるパラメーターの変更を許可する
sign_upの際に「初期設定のないカラムを保存するための許可」を記述されたと思われます。
updateの際も同様に「上書きする許可」を記述します。
今回は「nickname,imgae,password」の編集・変更機能を実装することが目的だったので以下のようにしました。

```rb:application_controller.rb
class ApplicationController < ActionController::Base
# 中略
    private
    def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :nickname, :self_introduction, :image, :twitter, :facebook, :instagram])
      devise_parameter_sanitizer.permit(:account_update, keys: [:nickname, :image]) #account_updateにつづいて編集・変更したいカラム名を入れる。

    end
    
# 中略

end
```
これで編集・変更機能の内容は終わりました。最後に「上書きを行った後、どこに遷移するのか」を記述します。

#５．registrations_controller.rbに上書き後の遷移先を記述
今回は上書き後に確認が行えるようcurrent_user（ログインしているユーザー）のマイページに遷移するようにします。

```rb:registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
#中略
  
  protected

  def after_update_path_for(resource)
    user_path(current_user)
  end
#中略
```
これでregistrations#updateアクション後に、after_update_path_forのパスにリダイレクトします。以上

#参考
https://qiita.com/saik/items/ae7c57e26037115ed2fc
Linux Mint P2V

Mintで作ったパーティション毎に dd で取り出して Virtual Box で動かそうとしたが失敗。
結局 sda　全部を dd で img にして、 Virtual Box　付属ツールで変換して　Virtual Box　で動かした。
やってみると、仮想ディスクは圧縮されるようで実サイズは小さくなり、sda まるごとで何の問題もなし。

ホスト：Windows10
Virtual Box 設定
・Accel　Hyper-V

最初は文字がボケていたが、
Virtual Box　のサイズを　100%　にして解決。

各パーティションのサイズは拡大した。
まず仮想ディスクのサイズを大きくしてから、
Linux 起動 CD の イメージファイル を Virtual Box に設定し、
そこから起動して仮想ハードディスクを操作可能にして、
パーティションの移動や拡大を実行。