OmniAICreator/Qiita-1.07M huggingface dataset:
docker環境を一度取り壊してきれいにする

## 環境
- Amazon Linux 2

## 削除

### docker

```
sudo yum remove docker -y
sudo rm -rf /var/lib/docker
```

### docker-comopose

```
sudo rm /usr/local/bin/docker-compose
```

## 再インストール

### docker

```
sudo yum -y install docker
```

### docker-compose

```
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
```
【jQuery】FAQアコーディオンの作成方法

#完成形
* SCSSを使用
* jQueryを使用

<p class="codepen" data-height="492" data-theme-id="dark" data-default-tab="html,result" data-user="c-koch0514" data-slug-hash="abJKBrL" style="height: 492px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="abJKBrL">
  <span>See the Pen <a href="https://codepen.io/c-koch0514/pen/abJKBrL">
  abJKBrL</a> by c-koch0514 (<a href="https://codepen.io/c-koch0514">@c-koch0514</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

#HTML
```html:html
<section id="faq">
  <dl id="faq-item">
    <dt class="question">
      <p class="question-text">質問１</p>
      <p class="plus">+</p>
    </dt>
    <dd class="answer">回答１</dd>
    <dt class="question">
      <p class="question-text">質問２</p>
      <p class="plus">+</p>
    </dt>
    <dd class="answer">回答２</dd>
    <dt class="question">
      <p class="question-text">質問３</p>
      <p class="plus">+</p>
    </dt>
    <dd class="answer">回答３</dd>
  </dl>
</section>
```

#SCSS
```scss:scss
/***********************************************************************/
/**********                FAQの全体                       *************/
/***********************************************************************/
#faq {
  #faq-item {
    width: 250px;
    margin: 0 auto;
    background-color: #eee;
    font-size: 15px;
    cursor: pointer;

    .question {
      display: flex;
      justify-content: space-between;
    }

    .answer {
      display: none;
    }
  }
}
/***********************  ena of faq    ********************************/
```
#jQuery
```js:jQuery
$(function(){  

  /***************** FQAアコーディオン **********************/
  $('.question').on('click', function () {
    $(this).next().slideToggle();

    if( $(this).hasClass('close')){ 
      $(this).find('.plus').text("+");
    }
    else{
      $(this).find('.plus').text("－");
    }
    $(this).toggleClass('close');
  });
  /*********************************************************/

});
```
Lisp に無理を言う

Lisp に**いたずらしたい**と思ったら評価しようにもしきれない循環リストを作ればよい。
循環リストは次のようにして簡単に作れる.

```
(setf test '(1 2))
(rplacd (cdr test) test)
```
## SBCL の場合
この２行をsbcl 上で評価すると (その様子を[htop](https://ja.wikipedia.org/wiki/Htop)等で眺めると) CPU の負荷を100%に張り付かせ、メモリーを喰いつくした挙げ句「**sbcl terminated by signal SIGKILL (Forced quit)**」と言って絶命する。

## LispWorks の場合
LispWorks 7.1 Personal (64-bit) で同じことをやると

    "You are approaching the heap size limit for the Personal Edition of LispWorks.
    If you choose to continue now you are advised to save your work at regular intervals."
    「LispWorks Personal Edition のヒープサイズの限界に近づいています。
    このまま続行する場合は、定期的に作業内容を保存することをお勧めします。」

と言って終了してしまう。
"LispWorks Personal Edition の" という言葉がさらりと入っているあたり、「もしかしたら有料版だったら…??」という淡い期待を抱かせてくれる。

## Allegro の場合
Allegro CL 10.1 Express では、

```
CG-USER(1): (setf test '(1 2))
(1 2)
CG-USER(2): (rplacd (cdr test) test)
(2 1 2 1 2 1 2 1 2 1 ...)
CG-USER(3):
```
とケロリ🐸としている。

```
(inspect 'test)
```
で内容を観察すると**symbol-value**は「#1=(1 2 . #1#)」と表示され、循環リストであると認識されている。
東京都 新型コロナウイルス感染症 対策サイトの(distフォルダに)静的ファイル生成方法

## Github

https://github.com/tokyo-metropolitan-gov/covid19

## 起動

```sh
git clone https://github.com/tokyo-metropolitan-gov/covid19

cd covid19
```

```sh
docker-compose up -d
```

```sh
docker exec -it covid-19 /bin/sh
```

```sh
# yarn build

# 静的ファイルの生成
yarn generate
```

* `dist`フォルダがあるので、これをWEBサーバーのDocumentRootに置けば表示できる。

----

また、`package.json`の中身を確認すると、"scripts"に定義があることがわかる。

```sh:package.jsonの中身抜粋
yarn cp : 最新データー を取得 (./bin/cp_data.sh)
yarn generate:deploy : yarn cp した後、nuxt-ts generateする
```

## Nuxt.jsについては以下ページが詳しかった。

https://blog.cloud-acct.com/posts/u-nuxtjs-v213-versionup/
traditional CMS vs headless CMS

# CMSとは
Content Management Systemの略です。ウェブサイトに掲載するコンテンツ（テキスト・画像・レイアウト）を効率よく保存・管理することができるシステムのことを言います。

CMSにはtraditional CMSとheadless CMSがあります。

### traditional CMS 
従来のCMSのことを指します。バックエンドのみならず、フロントエンドも管理してくれるためエンジニアじゃなくてもサイトを作ることができます。代表的なサービスはWordPress。

### headless CMS
フロントエンドの管理機能がないCMSのことを指します。フロントエンドはReactやVueなどのSPAで代用します。contentfulやmicroCMSなどのサービスがあります。

# traditional CMSを使うメリット・デメリット
### メリット
- エンジニアじゃなくてもウェブサイトを作ることができる

### デメリット
- バージョンが古いと攻撃の対象になったりする
- 動的ファイルとコンテンツデータファイルのやり取りがあるため、表示に時間がかかる


# headless CMSを使うメリット・デメリット
### メリット
- デザインを自由にカスタマイズできる
- フロントエンドの改修を行いやすい
- 高いセキュリティーで設計できる
- 静的ファイルを表示するだけで良いので表示が速い


### デメリット
- フロントエンドを書く知識が必要

# どちらを選ぶべき？
自社にフロントエンドエンジニアがいる場合は、headless CMSを採用すべきでしょう。
暗号文を元に戻す[Ruby]

## 問題

```
あなたは友達と秘密を共有するために暗号文を作り、その暗号文を元に戻すプログラムを作成することになりました。暗号文を元に戻す際のルールは以下の通りです。

・全ての文は大文字アルファベットのみを使う。
・文字の番号は左から順番に 1 番目から数え始めるものとする。
・暗号文の元に戻す操作として...
奇数番目の文字に対しては、アルファベットの逆方向に N文字ずらし、
偶数番目の文字に対しては、順方向に N 文字ずらしたものにそれぞれ変換する

暗号化された文字列と、元の文をずらした文字数 N が、与えられる
→　元に戻された文字列を出力するプログラムを作成してください。
ただし、文字をずらした時、アルファベットの先頭、及び末尾をはみ出してしまった場合、
それぞれ、アルファベットの末尾、アルファベットの先頭から続きを数える。
```

## 入力される値

```
入力される値
X
Y
・1 行目には、ずらした文字数を表す整数 X が与えられます。
・2 行には、暗号文字列を表す文字列 Y が与えられます。
　入力は 2 行となり、末尾に改行が 1 つ入ります。
・Y は暗号化文字された文字列を表す 英字大文字 からなる文字列
```

## 条件

```
・1 ≦ X ≦ 25
・S は 英字大文字 で構成される文字列。
・1 ≦ (Y の長さ) ≦ 500
```

## 例

```
入力例1
4
QEPG
出力例1
MILK

入力例2
19
KXKPMQVI
出力例2
RQRITJCB
```

## 回答

```ruby
input_lines = readlines.map { _1.chomp }
count = input_lines[0].to_i
word = input_lines[1].chars
array = [*"A".."Z"].map.with_index { |i, num| [i, num] }
answer = []
word.each.with_index(1) do |alph, num|
    ans = array.select { |u| u[0] == alph }.flatten
    if num % 2 == 1
        index = ans[1] - count
    elsif num % 2 == 0
        index = ans[1] + count
        index -= 26 if index > 25
    end
    answer.push(array.values_at(index).flatten[0])
end
puts answer.join
```

## 学び

### values_atメソッド

https://docs.ruby-lang.org/ja/latest/method/Hash/i/values_at.html

```
ary = %w( a b c d e )
p ary.values_at( 0, 2, 4 )          #=> ["a", "c", "e"]
p ary.values_at( 3, 4, 5, 6, 35 )   #=> ["d", "e", nil, nil, nil]
p ary.values_at( 0, -1, -2 )        #=> ["a", "e", "d"]
p ary.values_at( -4, -5, -6, -35 )  #=> ["b", "a", nil, nil]
p ary.values_at( 1..2 )             #=> ["b", "c"]
p ary.values_at( 3..10 )            #=> ["d", "e", nil, nil, nil, nil, nil, nil]
p ary.values_at( 6..7 )             #=> [nil, nil]
p ary.values_at( 0, 3..5 )          #=> ["a", "d", "e", nil]
```

配列のインデックスを指定する事で、配列の要素を柔軟に取り出すメソッド

## 反省

```ruby
array = [*"A".."Z"].map.with_index { |i, num| [i, num] }
#=> [["A", 0], ["B", 1]..["Z", 25]]
```

アルファベットの大文字とそのインデックスを合わせた配列を生成する為に、`map`メソッドと`wih_index`メソッドを組み合わせて冗長的な方法を選択している。

もっとスタイリッシュに書けそう...
FactoryBot・Fakerの導入

# 目的
Railsで作成したアプリに`FactoryBot`と`Faker`を導入する。

# 開発環境
macOS: *Big Sur*
Rubyバージョン: *2.6.5*
Railsバージョン: *6.0.0*

# 前提

- アプリ`test-app`が作成されている。
[【Rails】簡単な投稿アプリの作成](https://qiita.com/oak1331/items/18a4f3a3386aab0fa354)
- `devise`が導入されている。
[【Rails】ユーザー管理機能(devise)の導入](https://qiita.com/oak1331/items/0759bd297e9fd3b81ed2)

# 手順

- [FactoryBotとは](#factorybotとは)
- [Fakerとは](#fakerとは)
- [Gemのインストール](#gemのインストール)
- [記述法](#記述法)

# FactoryBotとは

インスタンスをまとめることができるGemです。
あらかじめ各クラスのインスタンスに定める値を設定しておき、テストコードで使用します。

# Fakerとは

ランダムな値を生成してくれるGemです。
[FakerのGitHub](https://github.com/faker-ruby/faker)
こちらの公式GitHubにもあるように、様々な値が生成可能です。

# Gemのインストール

Gemfileを以下のように編集します。
この時、`group :development, :test do`の中に記述するように注意してください。

```ruby:Gemfile
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'rspec-rails', '~> 4.0.0'
  gem 'factory_bot_rails'
  gem 'faker'
end
```

```:ターミナル
% bundle install
```

これでインストールできました!

# 記述法

以下のように記述することができます!

```ruby:spec/factories/users.rb
FactoryBot.define do
  factory :user do
    nickname              {Faker::Name.initials(number: 2)}
    email                 {Faker::Internet.free_email}
    password              {Faker::Internet.password(min_length: 6)}
    password_confirmation {password}
  end
end
```

# 最後に

以上で導入は完了です。
Gemでインストールするのみなので非常に簡単に実装できます。
では。
APIキーを非表示にする方法

create-react-app にて、GitHubにコミットできるようAPIキーを非表示にする方法を簡単にまとめておきます。

#①プロジェクトのディレクトリのルートに .env ファイルを作成

![スクリーンショット 2021-06-07 18.59.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234382/6c6ba3ca-b425-8fa2-d76c-3d2e9418199a.png)

#② .envファイル内で、選択したAPIキー名にREACT_APP_を追加して割り当てる。

.env 内に、下記を記入。

```javascript
React_APP_OPENWEATHERMAP_API_KEY = (ここにAPIキーを書く)
```

※React_APP_ こちらを書き忘れないこと。

#③ .envファイルを.gitignoreファイルに追加。
gitignoreはGitで使われる特殊なファイル名で、このファイルに書かれたファイルは上から順に処理されて、Gitのトラッキングの対象外になる。 Gitのトラッキングの対象外になるということは、Gitで管理していたディレクトリの中にあっても無視されるということ。

```javascript
# api keys
.env
```

#④使用する
process.envオブジェクトを介してAPIキーにアクセスできる。

```javascript
const APIKEY = process.env.React_APP_OPENWEATHERMAP_API_KEY;
```

#デプロイ時は...
ページをデプロイする前に、.envファイルを削除し、プラットフォームのキー管理システムを使用する。

#その他注意点
○チーム開発時の注意点
githubには上がらなくなるから、git pullしても、他の人の環境には入らない。
APIキーは、別で教えないといけない。

○.env を作ったあとは、再起動をすること。
（ yarn start やり直すの忘れない）
OpenCVとPillowで画像データに取得日時を書き込み

画像データ（フォルダ内の一連のjpegファイル）をモノクロ化して取得日時を書き込み、別のフォルダに出力します。
ファイルのプロパティを見ると、「変更日時」が取得日時に相当していたので、[こちら](https://axa.biopapyrus.jp/ia/opencv/puttext.html)のコードからちょっと変えます。
Windows 10、Python 3.8.5で実行しました。
英数字だけを書き込んでいますが、OpenCVのデフォルトのフォントではなくArialを使いたかったので、[日本語の書き込み方](https://qiita.com/goodboy_max/items/d5e7f1c0ecd3d446c4d0)を参考にしました。

```python:Python
import cv2 as cv
import numpy as np
import PIL
from PIL import ImageFont, ImageDraw, Image
import os
import glob
import datetime

# 出力先フォルダを指定
output_path = './output/'

# ファイルの変更日時を取得
def get_exif(image_path):
    t = os.path.getmtime(image_path)
    d = datetime.datetime.fromtimestamp(t)
    captured_datetime = d.strftime("%Y/%m/%d %H:%M:%S")
    return captured_datetime

# 各ファイルに変更日時を書き込む
def write_text(input_path):
    captured_datetime = get_exif(input_path)
    image_name = os.path.split(input_path)[1]
    img = cv.imread(input_path)
    
    # モノクロ化
    img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    
    # 文字入れ
    fontpath ='C:/Windows/Fonts/arialbd.ttf' #Arial Bold
    font = ImageFont.truetype(fontpath, 64) # フォントサイズ64
    
    # 表示位置：画像に合わせて調整
    position = (30, 1820)
    
    img_pil = Image.fromarray(img_gray)
    draw = ImageDraw.Draw(img_pil)
    draw.text(position, captured_datetime, font = font , fill = 255) # fill = 255で白

    img_gray = np.array(img_pil) # PIL を配列に変換
    cv.imwrite(os.path.join(output_path, image_name), img_gray) # ファイル名は同じ

# 元フォルダから一括変換
# 一括変換する前に1枚テストしてフォントサイズや位置を確認しましょう
for f in glob.glob('./input/*.jpg'):
    write_text(f)
```

# 出力結果イメージ
文字部分だけ切り取っています。
![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820036/bbd06f66-4dea-82a7-467a-02d520c903bf.png)


# 参考
- [Python, OpenCV, NumPyでカラー画像を白黒（グレースケール）に変換](https://note.nkmk.me/python-opencv-numpy-color-to-gray/)
- [画像にテキストを書き込む方法](https://axa.biopapyrus.jp/ia/opencv/puttext.html)
- [Pythonでファイルの作成・更新日時を取得する（os.path.getmtimeなど）：作成日時の取得はOSごとに変わるので注意](https://www.mathpython.com/ja/file-date/)
- [TypeError: Can't convert 'datetime.timedelta' object to str implicitly](https://stackoverflow.com/questions/42398902/typeerror-cant-convert-datetime-timedelta-object-to-str-implicitly)
- [strftime() と strptime() の振る舞い](https://docs.python.org/ja/3/library/datetime.html#strftime-strptime-behavior)
- [OpenCV 3.4 + Python3 文字を描画する](https://symfoware.blog.fc2.com/blog-entry-2129.html)
- [Python + OpenCV でWindowsの日本語フォントを描画する](https://qiita.com/goodboy_max/items/d5e7f1c0ecd3d446c4d0)
- [pythonでフォルダ内のファイル名のみ取得する方法](https://qiita.com/d_desuyon/items/94eb52394a8152143f63)
laravel 作成されているroute情報の一覧を出力する

# 目的

- laravelにて作成されているroute情報の一覧を出力するコマンドを紹介する

# 方法

- アプリ名ディレクトリで下記コマンドを実行して作成されているroute情報を出力する。

    ```terminal
    $ php artisan route:list
    ```
SysML インターフェイスブロック



**<<Interface block**>>

- ブロック定義図で使われる 動作や内部パーツがないブロック
- 代理ポートを入力するために使われれる
- フロープロパティがコンパートメントに表示される


**参考ページ**

https://docs.nomagic.com/display/SYSMLP190/Interface+Block
[Rails]ransackで複数ワードAND検索を作ってみた。

## はじめに
Rails初学者です。
以下の記事を参考にさせていただきAND検索を実装したので、メモ
追加情報として、AND検索を実装したときにある不具合が起こったので、そこについても記していきます。

https://qiita.com/EastResident/items/54047e6e85dda0418dad

## やり方
ransackを用いたビューとコントローラーの実装は以下のようになっています。

```:ビュー
<%= search_form_for @search , url: posts_path do |f| %>
  <%= f.search_field :title_or_body_cont, placeholder: "キーワードで質問を探す" %>
  <%= f.submit%>        
<% end %>
```

``` :コントローラ
class PostController
  def index
    @search = Question.ransack(params[:q])
    @posts = search.result
  end
end
```

これに対して、複数のワード用いてAND検索を行いたい場合は、以下のようにパラメータを渡す

```
def index
  keyword = params[:q][:title_or_body_cont].split(' ') # 'hoge hige'
  @posts = Post.ransack({ combinator: 'and', groupings: { 'a' => {title_or_body_cont: keyword[0]}, 'b' => {title_or_body_cont: keyword[1]}} })
end
```
上記の例では、Postモデルのtitleカラムとbodyカラムに対して'hoge'と'hige'の二つの文字列でAND検索を実行しています。
※groupings内の'a'や'b'の部分は、一意であれば何でも良い。

これらを踏まえた完全版が以下になります。

```
def index
  key_words = params[:q][:title_or_body_cont].split(/[\p{blank}\s]+/) #'hoge hige'
  grouping_hash = keywords.reduce({}){|hash, word| hash.merge(word => { title_or_body_cont: word })}
  Post.ransack({ combinator: 'and', groupings: grouping_hash }).result
end
```

1行目、params[:q][:title_or_body_cont]には半角スペースあるいは全角スペースで区切られた形で、複数の検索ワードが入っています('hoge hige')。2行目は検索ワードを分割し、配列に格納している。3行目は、ransackに渡すgroupingsパラメータの中身を組み立てている。

ちなみにsplitの引数にある`/[\p{blank}\s]+/`はよくある正規表現で半角スペースと全角スペースを認識します。

これで以下のようなハッシュが生成されます。

```
{
  'hoge' => {title_or_body_cont: 'hoge'},
  'hige' => {title_or_body_cont: 'hige'},
}
```

## 不具合の解消
これにて実装完了と思いきや以下のような不具合がおきました。

![スクリーンショット 2021-06-07 18.41.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991598/76fa50db-89d5-173d-1185-59d2e8588a1b.png)

検索を実行すると。。。

![スクリーンショット 2021-06-07 18.41.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991598/255a5fb7-627b-bb85-5a88-d00456b63093.png)

検索フォームが空に。。。

しかしこの解決方法は簡単です。
viewをいじるだけです。

```
<%= search_form_for @search , url: posts_path do |f| %>
  <%= f.search_field :title_or_body_cont, placeholder: "キーワードで質問を探す" ,value: params[:q][:title_or_body_cont] %>
  <%= f.submit%>        
<% end %>
```
`f.search_field`に`value`を追加して`params[:q][:title_or_body_cont]`を指定するだけ解消できます。
Node.jsからPostgreSQLへ　トランザクション管理メソッド実装

# はじめに

トランザクション内で処理を行いたいとき、BEGINして～クエリ書いて～COMMITして～エラーならROLLBACKして～を毎回書くのは大変ですし、抜け漏れが発生する恐れがあるので、メソッドとして共通化してしまうことにしました。

環境としては、Node.jsからpgモジュールを使用して、Linuxサーバ上のPostgreSQLへの接続となります。

ちなみに前回までの記事はこちらになるので、参考にしてみてください。
　[LinuxサーバーにPostgreSQL導入～外部サーバー接続まで](https://qiita.com/sa9ra4ma/items/7c67cd8a368f2bd2dd88)
　[Node.jsからPostgreSQLへコネクションプールを使った接続](https://qiita.com/sa9ra4ma/items/6d61ae046daeadde68e2)

# 実際のコード

```pool.js
const { Pool } = require("pg");

// 接続先文字列
const connectionString = 'postgres://user:pass@DBのアドレス:ポート/DB名';

// DB情報をもったプールを生成
const pool = new Pool({
    connectionString: connectionString,
    max: 2          // 保持するコネクション数
});

pool.tx = async (cb) => {
    const connection = await pool.connect();
    let res;
    try {
        await connection.query('BEGIN');
        try{
            res = await cb(connection);
            await connection.query('COMMIT');
        } catch(err) {
            await connection.query('ROLLBACK');
            throw err;
        }
    } catch(err) {
        throw err;
    } finally {
        connection.release();
    }
    return res;
}

module.exports = pool;
```

```index.js
const express = require('express');
const app = express();
const pool = require('./pool.js');

app.get('/', async function(req, res, next) {
    let result;
    try {
        result = await pool.tx(async client => {
            const res1 = await client.query('SELECT NOW()');         // ➀
            const res2 = await client.query('SELECT NOW()');         // ➁
            const res3 = await client.query('SELECT NOW()');         // ➂
            return res1;
        });
    } catch(err) {
        console.error(err);
        res.sendStatus(500);
        return;
    }

    res.status(200).json({data: result.rows})
});

app.listen(3001, () => console.log(`listening on port 3001!`));
```

コールバック関数内に複数のクエリを書くことで、それらが1つのトランザクション内のクエリとなります。
上のソース内で言うと➀➁➂が1つのトランザクション内にまとまるということです。



# 最後に

pg-promiseモジュールだとtxっていうメソッドで、たしか勝手にトランザクション管理してくれるんですよね。
そのうち、pgとpg-promiseの違いについてもまとめてみようと思います。
（ほかにもpg-poolとかあるっぽいので、できればそれも…）
【初心者】パスを通す

PATHとは、
フォルダの住所のことで、
XXXXXX/XXXX/XXXX/sample.phpや￥XXXX￥XXXX￥XXXX￥sample.php
で表される。

PHTHを通すとは、
~~XXXXXX/XXXX/XXXX/や￥XXXX￥XXXX￥XXXX￥を実行ファイルにおき、
sample.phpに簡単にアクセスできるようにする。~~
ファイル名のみで任意のファイルを実行させようとした際に検索されるパスを
PATHという名前の環境変数に登録することをパスを通すと言います。

つまり、デスクトップにファイルを置いて、
ダイレクトに飛ぶようにするのと近しい感じ？で理解しておきます。
こんなことも分からなかったのかと少しショックでした。

https://wa3.i-3-i.info/word18471.html
「警告: 潜在的なセキュアリティリスクあり」への対応

「警告: 潜在的なセキュアリティリスクあり」という警告が出た時の対応です。
![security_jun07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/9babee5d-78ee-55ac-1b79-477c1947ea96.png)

暫定的な対応
>ルーターの再起動ボタンを押せば治ります。


>ルーターは NTT 東日本から借りている
>RS-500MI
>製造年月　2015年09月
>です。


SSL 証明書には問題はありません。
![letsencrypt_jun07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/09390a97-be69-e55e-b38a-5a3fc66af9c1.png)

根本原因は、ipv6 の設定ミスでした。

```text
$  dig -t AAAA ekzemplaro.org +short
2400:8500:1301:736:133:130:98:29
2400:8500:1302:802:133:130:124:85
```

こういうことが起きる原因は、お名前.com のインターフェースにあります。

まず、ホスト名として、hello.ekzemplaro.org を入れます。
![dns_aa_jun08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/6848f2f7-1473-56df-1704-1ca8915d367b.png)

次に、TYPE を AAAA に変更するとホスト名が、ekzemplaro.org になってしまいます。
![dns_bb_jun08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/9a39231f-5b9c-eda5-4c26-32457ed1ad3a.png)
TabBarのtabControllerをstatelessWidgetで使う方法(Flutter)

# tabControllerをstatelessWidgetで使う方法

TabBarで**tabController**を使おうと思って公式ドキュメントを読んだが、

with TickerProviderStateMixinが**statefulWidget**でしか使えないためvsync:thisが利用できなかった。

##### TabBarの公式ドキュメント

https://api.flutter.dev/flutter/material/TabBar-class.html


しかしtabControllerの公式ドキュメントをよく見ると下の方にstatelessWidgetでもtabControllerを使う方法が記されていた。


##### tabControllerの公式ドキュメント
https://api.flutter.dev/flutter/material/TabController-class.html

以下、ほとんど公式のコピペ↓

```dart
@override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: tabs.length,
      child: Builder(builder: (BuildContext context) {
        final TabController tabController = DefaultTabController.of(context)!;
        tabController.addListener(() {
          if (!tabController.indexIsChanging) {
            //ここでcontrollerの値が変わった時の処理を書く。
          }
        });
        return Scaffold();
```

このように、DefaultTabController()の中でadd.Listener()をすることで、controllerの値が変わった時に処理が走る。

### 最後に
そもそもtabControllerがstatefulWidgetでしか使えない、ということがなんとなくおかしいと推測するのが順当な考え方だと思った。おおもとを辿れば全てstelessWidgetなのでstatelessでも使えるはずということを前提におきつつ検索をかけにいくという姿勢が大事なのかな？と思った。
【AppSync】Amplify push でAppSyncのフィールドにリゾルバを追加する

Amplify＋AppSyncの話です。
AppSyncのフィールドにリゾルバを付けるに当たって、少し詰まったので備忘録

`Amplify push`でAPIを作っていく際、`amplify/backend/api/appName/stacks`配下にCloudFormationのテンプレートを置かないと、AppSyncのコンソールからリゾルバを追加しても`Amplify push`を叩いたタイミングで消えちゃいます。
なんで`amplify/backend/api/appName/stacks`配下にリゾルバ追加用のテンプレートを追加することに

#
下記のようなスキーマの`hoge`にリゾルバを当てたい場合、

```GraphQL
type Sample @model{
  hoge: String!
  huga: String!#こいつにリゾルバを当てたい
  hogehoge: String!
}
```

CloudFormationのテンプレートで追加する場合、"Resources"の下に下記を追加することで
`Amplify push`時にリゾルバを追加することができました。

```json
"hugaField": {
    "Type": "AWS::AppSync::Resolver",
    "Properties": {
        "ApiId": {
            "Ref": "AppSyncApiId"
        },
        "DataSourceName": "SampleTable",
        "TypeName": "Sample",
        "FieldName": "huga",
        "RequestMappingTemplateS3Location":"リクエストマッピングテンプレート",
        "ResponseMappingTemplateS3Location":"レスポンスマッピングテンプレート"
    }
}
```

CloudFormationからQueryにリゾルバを付与するやり方を考えてみれば当たり前のことでした。。
【Rails】ルート設定できないときに確認すること


元々root以外に設定していたページをrootに書き換えるときによくやってしまうミス
`Missing :controller key on routes definition, please check your routes. (ArgumentError) `


```ruby:config/routes.rb
root 'inquiries/new'

```

![e0cb8699015d1f37a90ae1398775721b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1210417/656ebf02-19e9-2f15-fd57-ba8578760dc4.png)

##解決策

　`/`を`#`書き換えれば解決します。

```ruby:config/routes.rb
root 'inquiries#new'
```

![ef16e4c38edc2d82d144285ec6f5b9d1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1210417/66e5ebc2-a60f-b689-73b5-ea9cc4262d37.png)


無事、viewが表示されました。

##余談

初学者なため何も考えずに、rootに書き換えたときに、postで設定していたページまで`#`を使用した記述にしていて、`rails model`コマンドを使用したところ作成できない事象が発生しました。

`Missing :controller key on routes definition, please check your routes. (ArgumentError)`


```ruby:config/routes.rb
Rails.application.routes.draw do
  root 'inquiries#new'
  
  post 'inquiries#confirm' #本来は#でなく/を記述
  post 'inquiries#thanks'  #本来は#でなく/を記述
end
```

###解決策
下記、記述に直したところ、`rails model`コマンドを使用できるようになりました。

```ruby:config/routes.rb
Rails.application.routes.draw do
  root 'inquiries#new'
  
  post 'inquiries/confirm' 
  post 'inquiries/thanks'  
end
```

![1418dbdbac65a7c7a07b1a91e9738fb0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1210417/16dc12de-999d-1129-058f-933157863967.png)
Arch Linux で 蒸気機関車に出会った話（小ネタ）

# 初めに

ファイル情報を表示する「lsコマンド」。

これを間違えて「sl」と入力したときの小話です。


# 蒸気機関車に出会った流れ

「どんなファイルがあったかな～」

```bash:
$ sl
```
「？？？」
「画面が暗くなった...」
![install-03-sl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690399/d41a6228-c6ec-6863-ac87-95024f367dda.png)
「！？！？！？」
「列車が右から左に...流れていった...」
「なんだこれは...？」


# slコマンド

**1970年代前後の「sl」コマンドのないコンピュータ**を想像してください。

「ls」を「sl」と**ミスタイプすることにより**、コンピュータは「sl」コマンドを探し求めます。
当時のコンピュータは処理能力が乏しく、処理に時間がかかり、**作業が停滞してしまう**ことがあったそうです。

これを防ぐために「sl」コマンドというダミープログラムを用意する必要があったそうです。


現代では、コンピュータの**処理能力が上昇し**た結果、「sl」コマンドが不必要となり、**ジョークプログラムとして知られる**ようになりました。

## オプション

他のコマンドと同じようにオプションもあります。

文字 | 説明
:-- | :--
-l | 細長いSLが走る
-a | 車内の客が「HELP!」と叫んでいる
-F | 空（画面の上のほう）へ飛んでゆく


# 最後に

本当に偶然出会ったので「何事か」と思いました。
他にも多くのジョークプログラムが存在しているらしいので、調べると面白いかもしれませんね。

## 参考
Wikipedia：[sl (UNIX)](https://ja.wikipedia.org/wiki/Sl_(UNIX))
if文でinclude?(xxx)のor条件を連続で何度も書くのを、簡潔でシュッとした書き方にする。

備忘録用。

# 前提条件
例えば、「メッセージ文の中に、東京・神奈川・千葉・埼玉が含まれるか」の場合、

```
if msg.include?("tokyo") || msg.include?("kanagawa") || msg.include?("chiba") || msg.include?("saitama")
```
となってしまい、ちょっと見づらい。
少し見やすい書き方として、

```
if msg.include?( "tokyo" || "kanagawa"  || "chiba" || "saitama" ) 
```

なんて書き方も悪くないかもしれないけど、チェックする県が増えたらどんどん横長ブサイクになってしまう。


# .any? とブロックを使えばシュッとなる

```
list = [ "tokyo",
         "kanagawa",
         "chiba",
         "saitama"
       ]

if list.any? { |n| msg.include?(n) }
```

「msg.include?(n) がtrueとなる要素」が**1つでもlistにあればtrue**を返す。
CentOS8で実行サーバー時刻がずれていた際の対応

- 実行環境
  - CentOS 8
  - Plesk

#### 経緯
- 最近、CentOS 8 にしたサーバーでサイト構築中に表示する時間がどうも時間がずれて気づいた。
- 例えば、指定時刻を過ぎると登録者が表示から消えていく処理でリアル世界から体感4、5分ほど遅い間隔で消えていっていた。
- とはいえ、処理自体は動作している状況。
- 気になって、サーバー時刻を調べた結果が下記。リアルな時刻は 19:28 だったので相違があった。

```
# timedatectl
       Local time: Fri 2021-06-03 19:22:55 JST
   Universal time: Fri 2021-06-03 10:22:55 UTC
         RTC time: Fri 2021-06-03 10:27:23
        Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: no
      NTP service: n/a
  RTC in local TZ: no
```


#### 解決方法

CentOS8ではntpdがプリインストールされず、同等機能のchronyていうのが推奨されててインストールする必要がある模様

以下記事を参照
https://genchan.net/it/server/18479/

Pleskを使っている場合は、以下手順で解決した
>
「NTP Timesync」拡張でサーバの時刻と同期することが出来ます。
Plesk管理画面の「拡張」で「NTP Timesync」を探索し、インストールします。
「拡張」＞「自分拡張」でNTP Timesyncを開き、NTPサービスとNTPサーバを設定し適用してください。
時刻は同期されます。
Cross-Origin Read Blocking (CORB) 

# Cross-Origin Read Blocking (CORB) 
## とは何か
怪しいCross-Originなリソース取得を検知するアルゴリズムで、Chromium系やSafariなどのWebブラウザにセキュリティ機構として組み込まれているもの。

（「怪しいCross-Originなリソース取得」として検知された結果、）  
この機構が作動すると、取得されてたリソースは（`200 Success` & `レスポンスデータあり` であっても）JavaScirptからはあたかも空レスポンスだったかのように見えてしまう。  
（= CORBを回避しない限りレスポンスデータを読めない、使えない、**予期せぬ情報漏えいからデータを保護できる**）

### 目的（なぜ必要か）
異なるOriginをまたいだ（Cross-Originな）リソース取得は、（様々な攻撃手段によって）予期せぬ情報漏えいなどの脅威につながる。  
これらの脅威からユーザを保護するためのセキュリティ機構として、CORBが一部ブラウザに実装された。（その後[Fetch Standard](https://fetch.spec.whatwg.org/#corb)に取り込まれた。）  

#### 防げるセキュリティ上の脅威
- （[Spectre](https://qiita.com/toshi00ysm/items/5766ece276d9e05956bf)を含む）サイドチャネル攻撃
-  クロスサイト・スクリプト・インクルージョン(XSSI: Cross-Site Script Inclusion)

### CORBによりレスポンスがブロックされるとどうなるのか
- レスポンスボディが空に置き換えられる
- レスポンスヘッダが削除される（何が返ってきたかわからなくなる）

## CORBが作動した際に起こるエラー
### Google Chrome
コンソール上に以下のwarnが出力される
```
Cross-Origin Read Blocking (CORB) blocked cross-origin response https://www.example.com/example.html with MIME type text/html. See https://www.chromestatus.com/feature/5629709824032768 for more details.
```

#### Chrome 66 以下の古いver.の場合
```
Blocked current origin from receiving cross-site document at https://www.example.com/example.html with MIME type text/html.
```

## 参照
- [Cross-Origin Read Blocking (CORB)](https://chromium.googlesource.com/chromium/src/+/master/services/network/cross_origin_read_blocking_explainer.md)
- [Cross-Origin Read Blocking for Web Developers - The Chromium Projects](https://www.chromium.org/Home/chromium-security/corb-for-developers)
- [Fetch Standard #corb](https://fetch.spec.whatwg.org/#corb)
- [Cross-Origin Read Blocking - Google 検索](https://www.google.com/search?q=Cross-Origin+Read+Blocking)
インタープリタを作る その15

#概要

インタープリタを作ってみた。
avrインタープリター書いてみた。

#参考にしたライブラリ

https://github.com/andormade/avr-simulator


#投入したソース

```
avr.mov(31, 31)
```

#成果物

https://embed.plnkr.co/plunk/AA1bglj4DPCGPYwr

以上。
BAT 複数のフォルダやファイルやサイトを同時に開く


```bat
@echo off

start "" "開きたいファルダまたはファイルのパス"
start "" "開きたいファルダまたはファイルのパス"
start "" "開きたいファルダまたはファイルのパス"
start chrome "https:開きたいサイトをクロムで開きます"

```
50歳から始める Power BI 

## 0. ご挨拶

　こんにちは、なんでもやる系社会人29年生の kamitoda と申します。
　この度は、私が2021年のGWに、
　　1. ある勉強会で Power BI と出会い、
　　2. 立っている地面が崩れた感覚に等しい衝撃を受け、
　　3. その後一念発起し、どのように技術を修得してきてたか、そしてこれから・・・
を備忘録して残したいと思います。
もし同年輩の方々の参考になれば、望外の幸せです。

## 1. ある勉強会とは
　[Power BI 勉強会](https://powerbi.connpass.com/)です。
　この界隈では最も有名で、国内で最古最大の勉強会です。
　日本国内に2人しかいない MVP が両名とも在籍しておられ、毎回のように知見を披露してくださいます。
　ほかの方もツワモノぞろいで、**武術場**をイメージしておくといいかもしれません。
　なお、**教室ではない**ので、しかるべき鍛錬をしてから望まないと組手すらしてもらえません。

## 2. 勉強会で受けた衝撃
### 2-1. まず、なんといっても、[**Power Query**](https://support.microsoft.com/ja-jp/office/excel-%E3%81%AE-power-query-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6-7104fbee-9e62-4cb9-a02e-5bfb1a6c536a) 

  > - これまで手作業もしくはマクロで実装していたような処理を自動化できる。
  > - CSV、Excel、Access といったデータソースから直接データを取得できる。
  > - これらが「標準機能」として実装されており、Modern Excel と呼ばれる。

　これを目の当たりにしたときの衝撃は、サイド7で初めて〇ンダムに会敵した際、愛機頭部のエアインテークを手で引きちぎられて木っ端みじんに破壊されたザクの搭乗員のような気持ち・・・と言えばご理解いただけるでしょう。

## 2-2. 次に[**コネクタ類**](https://docs.microsoft.com/ja-jp/power-query/connectors/#letter-t)

  > - CSV、Excel、Access、そして**データベース**に直接接続できる。

　紙の入管申請書に記入していた時代から、一気にICカードをかざしてピッに変わった気分です。

## 2-3. 最後に、[**分析レポート作成**](https://docs.microsoft.com/ja-jp/learn/paths/create-use-analytics-reports-power-bi/)に要する時間の短さです。

  > - データの結合
  > - グラフ表現

　これらがあっという間にできてしまうのを目の当たりにしました。
　**すばらしい！、これこそテクノロジーだ！**と思うと同時に、**やばい・・・世の中の変わり目だ**と感じて背中から汗が出たのです。　

***
長くなりましたので、続きは別記事にさせて頂きます。
Ubuntu > 20.04 突然音でなくなる問題

Ubuntuでは最近になって以前使っていたBlutoothのやっすいパワーアンプがUSB接続で認識されるようになった。
うれしい。とおもっていたのだが、ちょいちょい音がでなくなる問題に遭遇した。
サウンド設定ではちゃんと機器の認識もできているのだがボリュームをどうこうしてもうんともすんともいわない。
こんなときはこれでなんとなかるかも？
あまり深堀してないので結果だけ。


```sh
$ alsamixer
```

上記コマンドでミキサーがGUI上に表示されたと思う。
そこでF6を押すとサウンド関連のデバイス一覧が表示される。
対象のデバイスを数字を押して選択するとそのスライダーの値が０になっていればそれをあげるだけ。

以上。
【Athena】enumを使ったパーティショニング



## 概要

AWSのAthenaで、Partition Projectionを使ってパーティショニングする際のenumを使った例をまとめます。
enumは、連続しておらず、列挙可能なカーディナリティが低いカラムに適しています。
今回はinstance_idに対して適用しています。

S3バケットの構成は以下の通りです。

`s3://backet-name/object-name/instance_id/year=yyyy/month=mm/day=dd/`

例：
`s3://backet-name/object-name/i-xxxxxxxxxxxxxxxxx/year=2021/month=5/day=1/`

instance_id, year, month, dayでパーティショニングします。

## テーブル作成の構文

テーブル作成の構文の例は以下の通りです。
`PARTITIONED BY`と`TBLPROPERTIES`にパーティショニングに必要な情報です。
TBLPROPERTIESの中身は[参考記事](https://qiita.com/yoshiyama_hana/items/2b6d9427f2aec44ac09e#ctas%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90)に記載されています。


```sql
CREATE EXTERNAL TABLE `table_name`(
  `foo` string, 
  `bar` string
)
PARTITIONED BY (instance_id string, year int, month int, day int)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY ' ' 
  MAP KEYS TERMINATED BY 'undefined' 
LOCATION
  's3://backet-name/object-name/'
TBLPROPERTIES (
  'projection.enabled' = 'true',
  'projection.instance_id.type'='enum', 
  'projection.instance_id.values'='i-xxxxxxxxxxxxxxxxx,i-yyyyyyyyyyyyyyyyy',       
  'projection.year.type' = 'integer',
  'projection.year.range' = '2021,2030',
  'projection.year.interval' = '1',
  'projection.month.type' = 'integer',
  'projection.month.range' = '1,12',
  'projection.month.interval' = '1',
  'projection.day.type' = 'integer',
  'projection.day.range' = '1,31',
  'projection.day.interval' = '1',
  'storage.location.template' = 's3://backet-name/object-name/${instance_id}/year=${year}/month=${month}/day=${day}/'
  )
```

## 参考URL

https://docs.aws.amazon.com/ja_jp/athena/latest/ug/partition-projection-supported-types.html

https://qiita.com/yoshiyama_hana/items/2b6d9427f2aec44ac09e
SpringBootポートフォリオ作成


#理由・背景
SpringBootのポートフォリオを作成したいと思います。
テストが今回は非常に重要な要素です。
#ハマったこと。
postgresのユーザーを使用してという意味
psql -U postgres
データベース使用
\c spring-demo
Grantなどもあるが一旦スルー
参考アドレス
https://zenn.dev/junki555/articles/de2c9844a1d101
データベースごとに違いについての比較
https://www.ashisuto.co.jp/tech-note/article/20141006_db.html

#テーブル定義
![スクリーンショット 2021-06-07 17.28.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271383/bd51fbff-974b-1b6c-be75-ba3503283d53.png)
#URL設計
![スクリーンショット 2021-06-07 21.56.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271383/fa8eb138-fe93-e640-06f4-076b61554439.png)


#H2
application.properties
mybatis.configuration.map-underscore-to-camel-case=true
spring.datasource.url=jdbc:h2:mem:testdb
##手順の確認
SpringoBootアプリケーション起動後
http://localhost:8080/h2console
#事前準備
・不要ソース削除
・コードの整形
・知識の整理
Spring Data JPA (Java Persistence API)
#Githubにあげる
・ライセンス
・クラスの名前を実態に即したものにする。
・targetは.gitignoreに入れてコミットしないようにする。
・mainにあげるようにする。
##手順
・vi .gitignoreを作る。
・空のものをGithubに作ってからpushする。
・MITライセンスを付け加える。


#AWS上にあげる
##キーワード
ElasticBeanstalk

package
セキュリティ設定　ポート番号
RDS

application.yml
pom.xml
#TakeAway&今後
画面遷移は気をつける
日付をつける
審査完了フラグをつける
#アウトプット
http://springmybatis-env.eba-fb6zgdsj.ap-northeast-1.elasticbeanstalk.com/
https://github.com/noikedan/spring-mybatis-crud

#感想
GITはいいGUIツールあれば使ったほうがいいような気がします。
https://samuraism.com/2020/10/01/11854
#参考
注意：プロジェクト直下
vi .gitignore

target

*.class

echo "# springmybatisRest" >> README.md
git init
git add README.md
git add .
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/noikedan/springmybatisRest.git
git push -u origin main
遠隔でJetsonの管理を実現する方法(1)

#はじめに
[前回の投稿](https://qiita.com/Koharu1993/items/4750101500404ab34f7c)でご紹介させて頂いたOTAについて、皆様はご理解頂けましたでしょうか。
早速ですが、今回は[Allxon DMS](https://dms.allxon.com/next/signup)を利用して、NVIDIA Jetsonの遠隔管理を、
3つのステップに分けてご紹介していきたいと思います。
今ご登録して頂く方には30日間無料のお試しプランがついております。
使い方もとても簡単ですので、ぜひ最後まで見て頂けたら嬉しいです。

#Allxon DMSについて
Allxon Device Management Solutions (Allxon DMS) は、
多数のデバイスを容易に一元管理できるサービスです。
SIer企業及びサービスプロバイダ企業に対して、
シンプルにナビゲートしやすいデバイス管理サービスを提供します。
事業部をまたぐ多用なデバイス管理すらもひとつのAllxonアカウントから実行できるため、
デバイス上の問題解決のみならず、人件費と運用コストの大幅削減にも実現可能です。

#手順の流れ
[Step1.アカウント申請](#step1アカウント申請)
[Step2.デバイス登録](#step2デバイス登録)
[Step3.利用開始](#step3利用開始)
#Step1.アカウント申請
__サインアップ__
①[サインアップページ](https://dms.allxon.com/next/signup)にアクセスをする
②“メールアドレス” を入力したら“アカウント作成”をクリックする
![擷取.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509678/8e223a61-83b2-ea2f-8105-cd75fdcd1ea9.png)

#Step2.デバイス登録
①Linux環境にAllxon DMS エージェントをインストールをする、
ターミナルで下記のコマンドを入力してください。コマンドを実行すると、
Allxon DMS エージェントおよび関連パッケージが自動でインストールされます。
![擷取.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509678/a00340dc-7fd2-bb74-86d1-e52095ea89d6.png)

②[Allxon DMS](https://dms.allxon.com/next/signup) にサインインしたら、左側のナビゲーションパネルの、
[デバイス]をクリックしてデバイス登録画面へ移動します。
![擷取.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509678/5a823fc2-ae8a-eec1-e557-2f876a41c9cc.png)
③“追加” をクリックして指示に従いデバイスを追加します。
詳しい操作について、[こちら](https://www.youtube.com/watch?v=Ie9mgA3fiwo)の動画をご覧になってください。
![擷取.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509678/af5d94ae-15b5-8111-7c7b-0ddd9737aa95.png)
④デバイスが正常に登録できたら、
アカウント内に登録され、[デバイスリスト]のページにオンラインしたデバイスが表示されます。
![擷取.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509678/6562b216-59b1-6949-9dca-9e58facee05b.png)

#Step3.利用開始
アカウント申請及びデバイスの登録が完了できましたら、
デバイスのマネジメント操作が開始可能になります。
まずOSのリーブートから始めてみましょう！
![messageImage_1623036029547.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509678/e8d7dbc2-f8e1-feb1-44ac-6f60ca198df4.png)


#終わりに
さて、Allxon DMSに対してより理解できましたでしょうか。
質問やIoTについて今後こういうことをもっと詳しく知りたい！などがあれば、
下のコメント欄に意見を頂ければ嬉しいです。
次回はAllxon DMSのログ収集、アラート通知機能などをご紹介致します。
ぜひ、楽しみにしてください！
【GCP】Connected Sheetsの使い方

#参考URL
https://www.gixo.jp/blog/14487/

#Connected Sheets を使う準備
①Connected Sheets を使うには Google Workspace の Enterprise プランに申し込む
②BigQueryにデータを格納する
③BigQueryなどに対して、必要な権限を付与する。

#BigQuery に接続する
①Enterprise プランのアカウントからスプレッドシートを作成
②Enterprise プランのアカウントでは 「データ」 を選択した時の一番下に 「データコネクタ」が追加されており、こちらをクリック。ここから BigQuery に接続することが可能。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/9789bf4b-dd9d-8f7f-f9e2-a285611af070.png)

③「BigQuery に接続」後、GCP のプロジェクト、BigQuery のテーブルセット、テーブルの順に適宜選択し、テーブルを選ぶ。
※写真では、オープンデータの「covid19_open_data」を使用します。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/2147f7a6-b97f-c0eb-bdd7-fde8dc5f0bce.png)

④接続に成功すると次のような画面が表示される。
※この画面からピボットテーブルやグラフを作成することができます。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/da984612-f187-c3cc-7a5e-52c7c120cf65.png)

#Connected Sheets でピボットテーブルを作成する
①上記の画面の「ピボットテーブル」を選択。
※以降は、スプレッドシートでピボットテーブルを作成するのと同じ操作が可能。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/32287a21-1693-1669-3047-3e29be56c0e0.png)

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/00037f81-eb07-3655-2fa8-74ba9398a2dd.png)

②冒頭でお見せした目標のピボットテーブルを作るにはピボットテーブルに項目を追加して「適用」を押します。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/474a8f8f-f78b-03b7-b5ca-d48fbd5a219d.png)

③BigQuery でクエリを発行するためスキャン量（データの大きさ）が右下に表示されます。
※今回の場合だと271.33MB と表示されていることが確認できます。
※Connected Sheets の機能で作成したピボットテーブルの値は参照することが可能です。例えばこのピボットテーブルを作ったシート名とセルの位置を指定して値をそのまま使うことも可能ですし、このピボットテーブルの値を利用してグラフを作成することも可能です。

#Connected Sheets のピボットテーブルを利用してグラフを作成する
①今回は事前にグラフに用いるデータの範囲を選択して、「挿入」から「グラフ」を選択して作成可能。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/6dfacc6f-ae7a-6599-fe3c-0bea9b935d23.png)

②グラフを挿入したら、グラフエディタから以下の手順を実行することで冒頭のグラフが完成します。
「グラフの種類」を折れ線グラフに変更
「行と列を切り替える」をチェックする
「列 B を見出しとして使用」をチェックする
「行 2 をラベルとして使用」をチェックする

#その他 Connected Sheets でできること
###カスタムクエリを利用して任意のクエリを発行した後のテーブルに接続する
接続するテーブルを選択する画面で「カスタムクエリを作成」を選択することで BigQuery のクエリエディタが表示されます。ここにクエリを書くことで、事前にテーブルの結合をしたり集約した後のテーブルに接続することが可能です。この機能により Connected Sheets の使い方が広がります。

###Connected Sheets の API を使用する
Google Sheets API や Google Apps Script には Connected Sheets の API が用意されています。スプレッドシートのインターフェースのままでは要件を満たせない場合にこちらの API の使用を検討してください。
リモートワークでコミュニケーションが増えたことによるデメリット

#はじめに
[以前の記事](https://qiita.com/GENZ_INC/items/dc055c120695aea8deb8)でリモートワークに移行するとコミュニケーションが増えた結果、管理者とテスト項目設計者が増えたりメンバー間の関係が良くなったりなどメリットを紹介してきました。

ただ、その反面コミュニケーションが増えたことによるデメリットが浮き彫りになってしまったのでその紹介をさせて頂きます・・・

#コミュニケーションが増えたデメリットとは
####雑談が多くなったことです・・・
本来であれば雑談が増えてコミュニケーションが取れるようになるのは雰囲気が良くなって良い事ですよね！
ただ、雑談が盛り上がりすぎてしまうこともしばしばあり、肝心な仕事の話が割り込めないなんてことも発生しているとメンバーから話が上がっていました
だからと言って雑談を完全禁止にするのも違うしなぁなどそんな事で頭を抱えておりました・・・

#リモートワークでの雑談とは
リモートワークの雑談がなぜここまでの問題になり影響がでるのか考えたところ↓のような要因があるのではと思いました。
1. 同じ通話内だと同時に1つの会話しかできない
2. 顔を合わせていないと会話の止めるタイミングの判断が難しい
2つともリモートワーク特有な問題で特に会話の止めるタイミングについては一時期流行っていたzoom飲み会をしたことある方だと分かるのではないでしょうか・・・(終わるタイミングが絶妙に無いんですよね:sob:)
#程よい雑談の止め方とタイミングを考える
雑談を止める際に大切なのは雰囲気を壊さないようにすることなのですがこれが難しいです、
そもそも雑談は悪いものではないので一方的に雑談をやめさせることはチームワークの低下につながってしまいます、これは避けたいので自分たちのチームでは**一部のメンバーが**意識して下記のようなことを実践するようにしました。(一部メンバーのみの理由として全体周知をしてしまうと、雑談を禁止しているような雰囲気になってしまうのでこのようにしています)

- 仕事の話をして業務に戻る
 - 一番効果的かつ簡単、立場も関係なく入り込めるけど使えるタイミングが限られる
- やんわりと話をそらす
 - 流すような相槌を打つ、誰でも使えて簡単だけど時としては無関心にとられてしまう
- 「そろそろ仕事もどりますか！」的な締めの言葉を言う
 - これが言えたら一番いい、けど使うには相手との関係や立場を気にする必要がある(管理の人ならいいやすい)

まあこんなところが無難ですが、やはり人間関係や立場などもありますから雑談との闘いはリモートワークをするにあたっての永久の課題かもしれません・・・
#最後に
雑談が全く無いというのも寂しいんですがありすぎるのも考え物ですね、皆様のチームでも程よい雑談を心掛けて業務に取り組んで行きましょう！
それでは皆様よきリモートワークライフをお送りください！
<br>
# We are recruiting !
株式会社GENZでは現在キャリア採用を行っております。
ご興味がある方は以下をご確認ください！
[株式会社GENZ - 採用情報]
 (https://www.genz.jp/recruit/?qirecruit=20210607)
[株式会社GENZ - ブログ]
 (https://www.vamp.jp/?qi=20210607)
【salesforce】グローバル化！見るユーザの言語設定によって、カスタマイズしたテキストを変える方法


この記事では、Salesforceで環境をカスタマイズする際に役立った小ネタをご紹介したいと思います。


#レコードページにテキストを表示

レコードページにメッセージを表示したいとき、リッチテキストコンポーネントを使えば実現することが出来ます。

今回の前提となるその記事は作成しているので、まずは[そちら](https://qiita.com/Supply-net/items/318b3fc1471c12719baf)を見てください。


さて、レコードページにメッセージを表示できるのは良いですが、この方法には少し問題があります。
それは見る人の言語設定によって、表示される文言が変わらないことです。

例えば、日本人のユーザは日本語で、アメリカ人のユーザは英語で言語設定していると思います。
このとき、上記で見ていただいた過去記事のやり方では、文字をベタ打ちしてしまっているため、誰もが同じ文字を見ることになります。
つまり、もし文字を日本語で書いていれば、アメリカのユーザが同じページを見たとき、その部分だけが日本語で表示されるということですね。


これでは、色々な国のユーザが想定される環境では使えないですね。
1か国限定の環境です。

この問題を解決するには、「カスタム表示ラベル」と「トランスレーションワークベンチ」を使う必要があります。


#ベタ打ち対策にカスタム表示ラベル

まず、リッチテキストコンポーネントの文字ベタ打ちを対策します。

①「設定」のクイック検索から「カスタム表示ラベル」を検索し、作成していきます。
ラベルの名前や表示する文言を入力して保存します。

![①カスタム表示ラベル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/7921c476-6d59-79f0-518b-5e510a76c5b7.png)

②過去記事同様、表示させたい画面の編集ページを開き、配置したい場所にリッチテキストを置きます。
そして、ここで**先ほどのカスタム表示ラベルを表示するための文字**を入れます。
その文字は**{!$Label.カスタム表示ラベルの名前}**です。
過去記事との違いは、ここで出したい文言をベタ打ちせず、カスタム表示ラベルを表示している点です。

![②編集ページ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/bb2c9b39-d881-c247-ca93-c58e0ec9fae1.png)

③「保存」と「有効化」をして、画面に戻ります。
ちゃんとカスタム表示ラベルの文言が表示されています。
これで文字ベタ打ち対策は完了です。

![③レコードページ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/a2cadfbe-dd2e-f2a8-21e2-4a5fd5cbea49.png)

さて、本題に入るために一度、現状を確認します。
ユーザ設定から「言語とタイムゾーン」を現在の言語とは変えてみます。
今回は英語で設定していきます。

![④言語設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/e47f0073-8eb1-2078-cba8-79a803622642.png)

すると、画面は設定の通り英語ベースの環境になりますが、先ほど自分でカスタマイズした**カスタム表示ラベルは日本語のまま**です。

![⑤日本語のまま.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/ff437aad-7ee8-e633-8806-bef21ac292bc.png)


#トランスレーションワークベンチで言語ごとに文言を変える

では、異なる言語設定のユーザごとに、その言語で文言が表示されるよう設定していきましょう。

①「設定」のクイック検索から「トランスレーションワークベンチ」を検索し、「有効化」します。

![⑥翻訳有効化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/1e14a1e3-8ee8-9272-828a-112bd1b2b093.png)

②「トランスレーションワークベンチ」では使用したい言語を「追加」ボタンから追加できます。
今回は英語を追加したいのですが、有効化しただけでデフォルトで使えるようになっています。
![⑦翻訳言語設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/d7c6eb57-ea54-8173-f19d-7db9ba8e016b.png)

③「設定」のクイック検索から「カスタム表示ラベル」を検索し、先ほど作成したカスタム表示ラベルを選択します。
ここでお気づきかと思いますが、下に**「翻訳」という項目が増えています**。
その枠にある「新規」ボタンを押します。

![⑧翻訳追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/11e0f4ee-675f-1049-3e92-9337f73f59ad.png)

④「言語」と「翻訳テキスト」という項目があるので、**表示したい言語を選択し、表示したい文章をその言語で記述**して保存しましょう。

![⑨翻訳文.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/1bad7456-54a6-cf52-de55-726f0ac0345e.png)

⑤配置している画面に戻ります。
ユーザの言語設定に合わせたカスタム表示ラベルが表示されていることが確認できます。

![⑩レコードページ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/524c245a-d29e-10ea-028b-0a92914928df.png)

これで、見る人の言語設定によって、表示される文言を変えることができました。
VBS 自動サイトログイン


```vb
Dim ie

Dim WshShell
Set WshShell = Wscript.CreateObject("Wscript.Shell")
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True 
call ie.Navigate("http:/ログインサイト")

'ページが読み込まれるまで待機
Do While ie.Busy = True Or ie.readyState <> 4
    WScript.Sleep 100        
Loop

WScript.Sleep 500
Dim txt1
Dim txt2
Dim txt3
Dim doc
Dim btn

'ログイン処理適時変更

Set doc = ie.Document

Set txt1 = doc.getElementsByName("")
txt1.item(0).Focus
WScript.Sleep 500
WshShell.SendKeys("")
WScript.Sleep 500
Set txt2 = doc.getElementsByName("")
txt2.item(0).Focus
WScript.Sleep 500
WshShell.SendKeys("")
WScript.Sleep 500
Set txt3 = doc.getElementsByName("")
txt3.item(0).Focus
WScript.Sleep 500
WshShell.SendKeys("")



WScript.Sleep 1000


Set btn = doc.getElementsByClassName("")
btn.item(0).click()

'ログイン処理終了










```
Windows Server 2019でSambaへのゲストアクセス不可

Windows server 2019にてlinux上に構築したsmbサーバに認証なしアクセスができませんでした。
※2012、2016は可能であった。

どうもWindows Server 2019ではSMBのゲストアクセスが無効となっている模様です。

1.ローカル グループ ポリシー エディター (gpedit.msc) を開きます。
2.コンソール ツリーで、[コンピューターの構成] [管理 用テンプレート] > > [ネットワーク > Lanman ワークステーション] を選択します。
3.この設定では、[セキュリティで保護されていないゲスト ログオンを有効にする] を右クリックし 、[ 編集] を 選択します。
4.[有効 ] を選択し**、[OK] を選択します**。

https://docs.microsoft.com/ja-JP/troubleshoot/windows-server/networking/guest-access-in-smb2-is-disabled-by-default



※SMBサーバ側にこんなログが記録されておりました。
　サーバ側の問題かと思いconfigを確認したけど、クライアント側でしたとさ。
 ../../source3/auth/auth.c:347(auth_check_ntlm_password)
  check_ntlm_password:  Authentication for user [Administrator] -> [Administrator] FAILED with error NT_STATUS_NO_SUCH_USER, authoritative=1
GitHubアカウントの作成方法 (2021年版)

皆さん、こんにちは。戸倉彩です。

今回は、GitHubアカウントの作成方法についてステップバイステップ(画面付き)でご紹介していきます。
※画面は、2021年6月7日現在のものになります。

# GitHubとは
https://github.co.jp/
GitHub社が提供しているオープンソースプロジェクトなどのソースコードを公開し、管理することができるプラットフォームです。

# GitHubアカウントの方法
1. GitHubサイト (https://github.com/) へアクセスする
2. ボックスに**登録用のメールアドレス**を入力し、**[Sign up for GitHub]** ボタンをクリックする。※フリーアドレスでも登録可能です。
<img src="https://bl6pap004files.storage.live.com/y4m-v7MM2BK7xX-WL9lN2dW0_UCpXGebbVhkk8tS55I9ZoSF70Eix7wovY4jPxQ16ourqjB3kqRwtLGUICryjQwIkeRKf-4RvjuPqrkqngR9xWCh7nePSa3ao-XnHAdHw2jOKK8AEghOc8wYBf7iH6iwtUL8K_0MwhAkDXl4xVbK22JFahNJMVKuzHW-01Xb52t?width=1749&height=1029&cropmode=none" width="600">
3. **[Create your account]** 画面が表示されたら必要項目を入力する。*は必須項目です。  
    * **Username** * : 任意のユーザー名
    * **Email address** * : GitHub登録用メールアドレス
    * **Password** * : 文字数は15文字以上、または数字と小文字を含む8文字以上のパスワードを指定する)
    * **Email preferences** : 製品の最新情報、お知らせなどを不定期にメール受け取りたい場合にはチェックを入れる
    * **Verify your account** * : **[検証する]** ボタンをクリックし、画面の指示に従って画像を選択することで、ロボットではないことを証明する
<img src="https://bl6pap004files.storage.live.com/y4mxeEaOLQc00AKUvcyeOXUxiI9fnVc7E6B8x_lTYBNLfzEXx0ZHxURLSpOGLnKR52dPQaI8SX3dLsNDw5xGjFhx84nVbLv8lesWNN2qmK_xYYmO4DW0AkLVcJdbiJnv3M-F-A0Y5HFMj1cp8UvMafEyvcowiI5Nqr3odvCIbJ11T3UDgdG_M1TqcgjcLnjWm8n?width=1152&height=977&cropmode=none" width="600">
4. 入力後、アクティブになった **[Create account]** ボタンをクリックする。
<img src="https://bl6pap004files.storage.live.com/y4mOlKxR0rR5RoVs3GSHiBDLvMUTS-agZfPj--T5RbKqMpb1aCY7_8GUGx_Ag0h82q6HhiOeI7rqsSU1qHQ3m6n0r8vqKwaUVCG9uOPW3uniTcDrpNWzgfFsk_qxEYrkrZShAKsMwIIQsYGY7275q1tzqKDfyXXVhlOSKq57uMsxYFTtb_incClTUmcuTrb85WQ?width=1266&height=1037&cropmode=none" width="600">
5. **[Welcome to GitHub]** 画面が表示される。下のほうにスクロールして **[Complete setup]** ボタンをクリックする。  
<img src="https://bl6pap004files.storage.live.com/y4m6x2lbrEjag5UTlh4OZMbsAd7J8r56ZYLELAqDI33GaWrZnQL75uJrIPSAyulJ1iID0xE7QpGBZ-9dzH6PUNMhsQzScQzb9YpxAjxC8YvT9Z4ycL58CrYeNlzNZyuNQLm5MK-x5g23ZrvwcWGb0U1K8GT7rbnLSyE3Yk8g3Pc1wdhhl9tQdrl3uDAts9F5zca?width=1545&height=956&cropmode=none" width="600">
6. **[Please verify your email address]** 画面が表示される。登録用に入力したメールアドレス宛に、GitHubからメールが届いていることを確認する。※必要に応じてメール設定で、下記のメールを受信できるようにしておいてください。  
    * **メール件名**: [GitHub] Please verify your email address.
    * **送信メールアドレス**: GitHub (noreply@github.com)   
7. メール本文の **[Verify email address]** ボタンをクリックする。
<img src="https://bl6pap004files.storage.live.com/y4m-Hb2cqd1BSaK-x65DWoZTzMvgaR-7SMOseMO0S-vbImyGm8q8noyItjePx6qAgHBkprVyoF0COXCclo9Uy8wQYG3QJKjpmx-16atdAtdCcVNld-U1kO8RB-TCkTRFd3n_b6Jt2NjMXceAxvAaAP_VcNAyBdBCZv0ntJOAzmzwJBVhKc_ghCs-VE3UyapH5GA?width=1212&height=1129&cropmode=none" width="600">  
8. GitHub画面上で **[Your email was verified.]** メッセージが表示されれば成功です。
<img src="" width="600">
9. ここで操作を終了する場合は、　**[skip this for now]** ボタンをクリックする。
<img src="https://bl6pap004files.storage.live.com/y4mp3s4gdDBPEgnynwf7YEKgZ8Tvd8T6j8xIPtLkCPwHqKrGaVopW347uVvwJiMDIg_jc_iwO1LdaPsN4bXc0mLAgbIol6mp0F4rS-j9GWaOLC35-BOUNwimoDpgsl20Xmxt3RS7cXhUWO7zE36tXryXpRilyDx4XwUu1tTrPras4n6RwmxTbU5mjiJIRyXP5Fz?width=1837&height=1129&cropmode=none" width="600">

今回は以上となります。

Have a nice Geek day♪
※Twitterで最新情報配信中 [@ayatokura](https://twitter.com/ayatokura)
SELECTした結果をJSON文字列にして保存する

## 概要
SELECTした結果をJSON文字列にして他のテーブルに保存する必要がありました。
そのため、調べたことをメモしておく。

## SELECT結果をJSON文字列にする
`JSON_OBJECT` 関数を使ったら、サクッと作れた。

```sql:test.sql
-- hoge_logsテーブルにhogeテーブルの一部データをINSERTする
INSERT INTO `hoge_logs` (`status`, `hoge_id`, `json`)
SELECT 
    'error' AS `status`,
    `id` AS `hoge_id`,
    JSON_OBJECT(
        'id', `id`, 
        'code', `code`, 
        'name', `name`
    ) AS `json`
FROM
    `hoge` 
WHERE
    `hoge` = '1'
;
```

こんな感じ...

何かしらの処理に失敗したデータを簡易にJSON文字列にしてログ出力しておくには便利かも♪。
※ スクリプトが使えず、SQLで処理する必要がある場合にしか使わないだろうけど...

## JSON文字列を展開する
逆に、保存したJSON文字列を再展開したい場合はどうするんだろうと思い調べる。
`JSON_EXTRACT`と`JSON_UNQUOTE`を使ったらできそうです。

```sql
SELECT
    JSON_UNQUOTE(JSON_EXTRACT(`data_json`, '$.id')) AS `id`,
    JSON_UNQUOTE(JSON_EXTRACT(`data_json`, '$.code')) AS `code`,
    JSON_UNQUOTE(JSON_EXTRACT(`data_json`, '$.name')) AS `name`
FROM 
    `hoge_logs`
WHERE
    `hoge_id` = '1'
;
```

結構、JSON文字列を扱う関数が合っていろいろできるんですね。

## 参考サイト
* [12.18.2 JSON 値を作成する関数](https://dev.mysql.com/doc/refman/8.0/ja/json-creation-functions.html)
* [MySQL5.7でJSONを使ってみる](https://qiita.com/yuji0602/items/a43f593ee2542c6a3bb2)

以上
【Samba】ゴミ箱機能の作成方法

# 概要
Sambaを使用したファイルサーバーにゴミ箱機能を追加する

# 環境
* windows10
* VMware Workstation 16 Playerで作成した仮想マシン
* CentOS7
* Samba 4.10.16

#手順
##１．VFSモジュールが使用できるか確認する
`samba-vfs-glusterfs.x86_64`があるかどうか確認する

```
# yum list installed samba*
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: d2lzkl7pfhq30w.cloudfront.net
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
インストール済みパッケージ
//ここから探す
```
無かったら＝＞２へ
あったら　＝＞３へ

##２．パッケージをダウンロード
`Samba VFS module`を以下のコマンドで探す

```
# yum search samba
...
samba-vfs-glusterfs.x86_64 : Samba VFS module for GlusterFS
...
```

インストールする

```
# yum -y install samba-vfs-glusterfs.x86_64
```
確認する

```
# yum list installed samba*
...
インストール済みパッケージ
...
samba-vfs-glusterfs.x86_64 ←これがあるかどうか
...
```

##３．/etc/samba/smb.confを設定する
`vi /etc/samba/smb.conf`で設定を入れていく

* 全てのフォルダに追加したい場合＝＞[global]下に設定
* 一部のフォルダのみに追加する場合＝＞[フォルダ名]下に設定

```:/etc/samba/smb.conf
[〇〇〇]
    vfs objects = recycle
    recycle:repository = .recycle
    recycle:keeptree = no
    recycle:versions = yes
    recycle:touch = no
    recycle:maxsize = 0
    recycle:exclude = *.tmp ~$*
```

###意味一覧

| コード | 意味 |
|:-:|:-:|
| vfs objects = recycle  | ごみ箱の有効化  |
| recycle:repository  |  ごみ箱のディレクトリ名 |
| recycle:keeptree  | ごみ箱へ移動時にディレクトリ構造を維持するかどうか  |
| recycle:versions  | 同名のファイルがごみ箱にある場合に別名で移動するかどうか  |
| recycle:touch  | ごみ箱へ移動時にタイムスタンプを更新するかどうか  |
|  recycle:maxsize | ごみ箱へ移動するファイルのサイズ上限(0:無制限)  |
| recycle:exclude | 指定したファイルはごみ箱へ移動せずに即削除する |

##３－１．ゴミ箱フォルダを作成し指定するとき
XXXフォルダ専用のごみ箱を作成する
###(１)ゴミ箱フォルダを作成する

```
# cd 作りたい場所
# mkdir XXX
# chown -R nobody:nobody ゴミ箱
```
###(２)`/etc/samba/smb.conf`の設定
３で設定したディレクトリ名を変更する

```:/etc/samba/smb.conf
[XXX]
    recycle:repository = ./ゴミ箱
```

##４．sambaの再起動
設定を変更したら、必ず再起動しましょう！

```
# systemctl restart smb
```

##５．機能確認
エクスプローラーで、適当にファイルやフォルダを作成して削除する
　　　　　　　　　　　　　　　↓
削除後に、`.recycle`フォルダがなければ作成され、その中に削除したファイル・フォルダが格納されていることを確認。
※`.recycle`は隠しファイルであるため、表示から隠しファイルにチェックを入れないと見ることができない

※CentOS側から`rm`コマンドで削除しても、ゴミ箱へは行きません。

#参考サイト
* VFSモジュール：https://blog.goo.ne.jp/pcsetup/e/b36981d34cb504a58dd08285000e9ad1
* ゴミ箱機能：https://centossrv.com/samba.shtml
* ディレクトリの指定：http://kt-hiro.hatenablog.com/entry/20160125/1453728590
Vue.js vue-star-ratingの導入方法

# 背景
vue.jsにて星評価を実装する必要があり、備忘録として導入方法を残します。

#環境
vue@2.6.12

# 導入方法
### ターミナルにて以下コマンド実行
```
npm install vue-star-rating --save
```
### router/index.jsに以下を記述
```javascript:index.js
import StarRating from 'vue-star-rating'

Vue.use(StarRating);
```
### Views側の記述方法 ※コンポーネントと同じ記述方法
```vuejs:views/xx.vue
<template>
<star-rating></star-rating>
</template>

<script>
import StarRating from "vue-star-rating"
export default{
  components:{
     StarRating
  }
}
```

以上です。

##補足
星の値を取得したい場合は、
・v-model="rating"
・detaプロパディにrating :0 

##参考記事
(https://www.kabanoki.net/4632/)