OmniAICreator/Qiita-1.07M huggingface dataset:
【Pandas】DataFrameで1つ目のrowデータがheaderに入ってしまったら

（Jupyter Notebookを想定した話となります。）

何かしらの理由で、DataFrameの一行目のデータが、header(columns）に入ってしまった場合の対処法。

改めてreadしたり、DataFrameを構築し直すのが簡単だが、
どうにかコードで直したい場合に、DataFrameでゴニョゴニョして直す方法をまとめた。

例えば、下記のように本来は1行目のデータがheader部分に入ってしまった場合を考える。

|  | a | 0 |
|--:|:--|--:|
| 0 | b | 1 |
| 1 | c | 2 |
| 2 | d | 3 |
| 3 | e | 4 |

headerにある[a,0]を、インデックス=0の位置に挿入したいが、pandasでは、そのような関数は用意されていないようなので、次のように処理する。

```python
df = df.shift()                #行データを下方向に1つずつずらす
df.iloc[0] = df.columns.values #インデックス=0の位置に本来は一行目のデータを代入
df.columns = ["col1", "col2"]  #本来のカラム名を設定
```
（結果）

| |col1	|col2|
|--:|:--|--:|
|0  |a	|0|
|1  |b	|1|
|2  |c	|2|
|3  |d	|3|

以上。
プロジェクト計画でやること色々

## はじめに
プロジェクト計画段階でやることを色々とまとめたのでメモしてみます。自分自身の経験とPMBOKベースで洗い出していますので、プロジェクトによってはこういったものは作らない、こういったものも作る必要がある、ということはあると思います。あくまで参考にしていただければ幸いです。

## プロジェクト計画書の作成
以下を盛り込んだ計画書を作ります。ただ、少し重厚かもしれないので、インセプションデッキ等を用いてもう少し簡素化してみてみよいかもしれません。

* プロジェクト背景 / 目的
* プロジェクト目標
* 体制／役割
* 要員計画
* マスタスケジュール
* フェーズ定義　※各フェーズの開始、終了判定等
* 会議体
* 成果物定義
* コミュニケーションルール
* 振り返りガイドライン
* コンチプラン
* プロジェクト運営方針
    * 進捗管理
    * 課題管理
    * 品質管理
    * 障害レベル定義
    * リスク管理
    * 仕様変更管理
    * 申し送り管理
    * 障害管理
    * 申請管理

上記どれを検討するのも、MECEに検討すること、然るべき人と合意を得ること、最終的にはプロジェクトメンバーに共有することがポイントになってくると思います。

## プロジェクトの進め方の検討
プロジェクト計画書を作成したら、進め方を検討します。例えば以下のようなざっくりしたものでも構いません。

　1. プロジェクト計画書レビュー
　　　↓
　2. プロジェクトキックオフ（プロジェクト計画の共有）
　　　↓
　3. この後の動き方の共有

プロジェクトメンバー1人1人が、この後いつまでに何をすればよいのか、その後は？をしっかり把握して作業を円滑に進められるような状態を作ること、重要になってきます。

以上です。
GASスクレイピングサンプル(ヨビノリのサイトからyoutubeのリンクのみ抜き出し)

GASを使ってヨビノリのサイトからyoutubeのリンクを抽出するPGMを作りました
(scraping0()メソッドから実行)

<p>スクレイピング元ページ</p>
予備校のノリで学ぶ「大学の数学・物理」【ヨビノリ】Official 
Website: https://yobinori.jp/index.html

<p>スプレッドシートのリンク</P>
https://docs.google.com/spreadsheets/d/1eNqRVGQ7ytZpGtPMMdSkThPGYy-WC84AdrU80nhUdEg/edit?usp=sharing

<b>PGM</b>
<pre>
<code class="JavaScript">

function scraping0(){
  var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = objSpreadsheet.getSheetByName("youtubeLink抽出ページ");
  
  var colIdx = 2;
  
  var cellValue = sheet.getRange(2,1).getValue();
  var cellValue2 = sheet.getRange(2,2).getValue();
  while(cellValue != ''){
      cellValue = sheet.getRange(colIdx, 1).getValue();
      cellValue2 = sheet.getRange(colIdx, 2).getValue();
      if(cellValue == ''){
        break;
      }
    
      scraping1(cellValue, cellValue2);
      colIdx++;
  }
}
function scraping1(URL1, sheetName) {
  
  var sclaypingText = "";
  
  var response = UrlFetchApp.fetch(URL1);
  var html = response.getContentText('UTF-8');
  var lines = html.split("\n");
  
  scraping2(sheetName, lines);

}

function scraping2(sheetName, lines){
  
  var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  objSpreadsheet.insertSheet(sheetName);
  var sheet = objSpreadsheet.getSheetByName(sheetName);
  
  var youtubeLinkLine;
  var youtubeTitleLine;
  var regExp = new RegExp('"'+'https://youtu.be/'+'.*?'+'"','g');
  var regExp2 = new RegExp('<p><span>'+'.*?'+'</span></p>', 'g');
  var regExp3 = new RegExp('<p><span>'+'.*?'+'</span><br></p>', 'g');
  var line2;
  var link;
  var title;
  
  var cellRangeStr;
  var colCount = 1;
  
  var videoBlockStr = '<section class='+'"'+'video-block'+'"'+'>';
  for(var i=0; i<lines.length;i++){
    if(lines[i].indexOf(videoBlockStr) != -1){
      line2 = lines[i];
      
      while(line2.indexOf("</section>")  == -1){
        line2 = lines[i]
        if(line2.match(regExp) != null){
          youtubeLinkLine =  line2;
        }
        
        if(line2.match(regExp2) != null){
          youtubeTitleLine = line2;
        }else if(line2.match(regExp3) != null){
          youtubeTitleLine = line2;
        }
           
        i++;
           
      }
      i--;
      
      
      
      //youtubeLinkLine = lines[i+1];
      //youtubeTitleLine = lines[i+3];
      
      link = youtubeLinkLine.match(regExp);
      link = link[0].replace('"', '');
      link = link.replace('"', '');
      
      title = youtubeTitleLine.match(regExp2);
      if(title != null){
        title = title[0].replace('<p><span>', '');
        title = title.replace('</span></p>', '');
      }else{
        title = youtubeTitleLine.match(regExp3);
        title = title[0].replace('<p><span>', '');
        title = title.replace('</span><br></p>', '');
      }
      
      Logger.log(link);
      Logger.log(title);
      
      cellRangeStr = "A"+colCount;
      sheet.getRange(cellRangeStr).setValue(title);
      
      cellRangeStr = "B"+colCount;
      sheet.getRange(cellRangeStr).setValue(link);
      
      
      colCount++;
      
    }
  }
}
</code>
</pre>
【Rails5.2】credentials.yml.encでmaster key設定

## 初めに
設定方法は様々あるが、今回はVSCodeで編集出来る様にして設定を行う。
ターミナルでもいいのだが、インデントが分かりにくく、無駄な時間を費やした経験があるからです。
## VSCodeでcredentialsを編集できるようにする。
１,VSCodeで、「Command + Shift + P」を同時に押してコマンドパレットを開く。
2,「shell」と入力
3,「PATH内に'code'コマンドをインストールします」という項目が表示されるので、それをクリック。
上記の操作でターミナルから「code」と打つことでVSCodeを起動できるようになる。


##  編集の仕方
```ruby:ターミナル
$ EDITOR='code --wait' rails credentials:edit
```
「 rails credentials:edit」が、credentialsファイルを編集するためのコマンド。
使用するエディタにcodeすなわち今回はVSCodeを指定。
下記の様に復号化された内容が表示される。

```ruby:credentilals.yml
# aws:
#   access_key_id: 123
#   secret_access_key: 345

# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: dcb9317dcd2d42d9e045a2cd00c20df0b8109・・・
```

そして、下記の様に編集

```ruby:credentilals.yml
aws:
  access_key_id: (ここにはダウンロードしたAccess key IDを入力)
  secret_access_key: (ここにはダウンロードしたSecret access keyを入力)

# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: dcb9317dcd2d42d9e045a2cd00c20df0b8109・・・
```

## 値の確認

```ruby:ターミナル
$ rails c
$ Rails.application.credentials[:secret_key_base]
$ Rails.application.credentials[:aws][:access_key_id]
```

これで、先ほど見た設定の中身が表示される。

## CarrierWaveの設定
CarrierWavenに「aws_access_key_id」と「aws_secret_access_key」を設定。

```ruby:carrierwave.rb
CarrierWave.configure do |config|
  config.fog_credentials = {
    provider: 'AWS',
    aws_access_key_id: Rails.application.credentials[:aws][:access_key_id],
    aws_secret_access_key: Rails.application.credentials[:aws][:secret_access_key],
    region: 'ap-northeast-1'
  }
end
```
## master keyがプッシュされない様に.gitignoreに記載
これで設定OK。
これでローカル環境の設定は完了。
あとは本番環境にも同じ設定をしたら終了。

```ruby:.gitignore
# Ignore master key for decrypting credentials and more.
/config/master.key
```


## 本番環境の環境変数にマスターキーをセットする

本番環境で環境変数を使用するために、/etc/environmentsファイルで設定を行いため、sshで本番環境にログインする。

```ruby:ターミナル
$ ssh -i ~/.ssh/（pemファイル名） ec2-user@（EC2のElastic IP）
```
```ruby:リモートのターミナル
$ [ec2-user]$ sudo vim /etc/environment
```
ここで「i」キーを押して編集。

```ruby:/etc/environment
（前略）
RAILS_MASTER_KEY='master.keyの値'
```
これで設定終了。exit抜ける。
EC2を一回ログインし直して、下記のコマンドで確認して設定されていればOK。

```ruby:/etc/environment
（前略）
[ec2-user]$ env | grep RAILS_MASTER_KEY
```
javascriptのfor in（オブジェクトのプロパティ名についての繰り返し）

for-in文は、オブジェクトに存在するプロパティについて、プロパティの名前を順不同で取り出していき、処理を実行する構文です。

#for in の書き方

```javascript
for([プロパティ名を格納する変数] in [オブジェクト]) {
  文
}
```
指定したオブジェクトについて、プロパティ名を順不同で取り出し、inの前に定義した変数に格納してから処理を実行します。この時、繰り返しはすべてのプロパティについて処理を行うと終了します。

#for in の例
```javascript

var sum = 0;
var obj = { a:1, b:2, c:3 };
for(var name in obj) { // オブジェクトの中のプロパティ名を取り出す。
  sum += obj[name];
}
```

#参考
http://www.ituore.com/entry/javascript-for#for-in%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E5%90%8D%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AE%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%97
【Tips】Rails の Minitest 実行時に想定外のデータベース名になって ConnectionError となる原因と対処法

# 問題
`rails test`実行時にデータベース名末尾に`-0` `-1`などが付きアクセスが拒否されてしまう。

## 入力
```sh
rails test
```

## 出力
```sh
ERROR["test_【テストの名前】", #<Minitest::Reporters::Suite:0x******** @name="【テストクラスの名前】">, 0.143750600022031]
 test_n【テストの名前】#【テストクラスの名前】 (0.14s)
Minitest::UnexpectedError:         Mysql2::Error::ConnectionError: Access denied for user '********'@'%' to database '【テスト用データベースに設定した名前】-0'

ERROR["test_【テストの名前】", #<Minitest::Reporters::Suite:0x******** @name="【テストクラスの名前】">, 0.143750600022031]
 test_n【テストの名前】#【テストクラスの名前】 (0.21s)
Minitest::UnexpectedError:         Mysql2::Error::ConnectionError: Access denied for user '********'@'%' to database '【テスト用データベースに設定した名前】-1'

ERROR["test_【テストの名前】", #<Minitest::Reporters::Suite:0x******** @name="【テストクラスの名前】">, 0.143750600022031]
 test_n【テストの名前】#【テストクラスの名前】 (0.31s)
Minitest::UnexpectedError:         Mysql2::Error::ConnectionError: Access denied for user '********'@'%' to database '【テスト用データベースに設定した名前】-2'

...
```

# 環境
- Windows 10
    * Ubuntu 18.04 LTS
- anyenv 1.1.1
    * rbenv 1.1.2-20-g143b2c9
        + ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-linux]
            - Rails 6.0.2.1
- MySQL

# 原因
`test/test_helper.rb`で並列実行設定が行われているため複数のデータベースにアクセスされてしまう。

# 解決方法
並列化設定をコメントアウトする。

```test/test_helper.rb
class ActiveSupport::TestCase
  # Run tests in parallel with specified workers
  # parallelize(workers: :number_of_processors)
  # ↑をコメントアウト

  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all

  # Add more helper methods to be used by all tests here...
end
```

並列化設定を行っている`parallelize`メソッドの説明は[こちら](https://api.rubyonrails.org/classes/ActiveSupport/TestCase.html#method-c-parallelize)。

# 補足
おそらく`-0` `-1`などとついたデータベースを作成することでも解決可能。
iPhoneのON,OFFスイッチのようなトグルスイッチを作ってみた

# CSSを使ってトグルスイッチの作り方

## 早速だけどコード

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

## 構成

### HTML

HTMLはシンプルにチェックボックスとラベルのみ。

```html
<div class="switch">
  <input type="checkbox" id="toggle" class="toggle" />
  <label for="toggle"></label>
</div>
```

### CSS

CSSがメインとなる。

```css
 .switch {
        margin-top: 4px;
        margin-left: 2px;
        font-size:24px;
        padding: 2px;
    }
    .switch input[type=checkbox]{
        position: absolute;
        opacity: 0;
    }
    .switch label {
        width: 2em;
        height: 2em;
        position: relative;
        cursor: pointer;
        display: block;
    }
    .switch label:before {
        content: '';
        position: absolute;
        width: 2em;
        height: 1em;
        left: 0.1em;
        transition: background 0.1s ease;
        background: #f1f1f1;
        border-radius: 50px;
        box-shadow: inset 0px 1px 1px rgba(171,66,63,0.5);
    }
    .switch label:after {
        content:'';
        position: absolute;
        width: 1em;
        height: 1em;
        border-radius: 50px;
        left: 0;
        transition : all 0.2s ease;
        box-shadow: 0px 2px 5px 0px rgba(0,0,0,0.3);
        background: #fcfff4;
        animation: swich-off .2s ease-out;
        z-index:2;
    }
    .switch input[type=checkbox]:checked+label:before {
        background:#8ce196;
        box-shadow: inset 0px 1px 1px rgba(84,152,140,0.5);
    }
    .switch input[type=checkbox]:checked+label:after {
        animation: switch-on .2s ease-out;
        left: 1.1em;
    }
```

## ポイント
CSSで何やっているかわからないかもしれないが、
重要なのは元のチェックボックスは非表示にして:beforeと:afterの疑似要素で表現していること

疑似要素とはCSSでHTMLの要素のようなものを表現できる。
contentプロパティによって文などを追加できる。

## 最後に

CSSで分かりやすいデザインを作るのは楽しいのでとりあえず最初になじみのあるこの実装に取り組んでみました。
完成した時は感動しました。。。
他にも簡単に作れるものがあれば教えてください。
【Python】構造化配列作成（NumPyで異種型データ格納）

#0. 概要
名前、年齢、身長と言った具合に、ある人の情報を一括でまとめたいですよね。
そんなときはNumPyの構造化配列を使用しましょう。複合型の異なるデータを効率的に格納できます。せっかくなので乃木坂メンバーで構成してみました。（2020/02/24現在）

#1. コード
```list.py
# -*- coding: utf-8
import numpy as np

#4人の情報を各配列に格納
name = ['mai', 'asuka', 'erika', 'yoda']
age = [27, 21, 23, 19]
height = [162, 158, 160, 152]

#構造化配列の作成(3種類の配列のデータ型を決定）
data = np.zeros(4, dtype={'names' : ('name', 'age', 'height'), 'formats': ('U10', 'i4', 'f8')}) #U10 -> Unicode(10文字まで), i4 -> int32, f8 -> float64

#データ型の確認
print(data.dtype)
#[('name', '<U10'), ('age', '<i4'), ('height', '<f8')]

#構造化配列にデータを格納
data['name'] = name
data['age'] = age
data['height'] = height

#4人の全情報をプリント
print(data)
#[(u'mai', 27, 162.0) (u'asuka', 21, 158.0) (u'erika', 23, 160.0) (u'yoda', 19, 152.0)]

#4人の名前をプリント
print(data['name'])
#[u'mai' u'asuka' u'erika' u'yoda']

#asukaの全情報をプリント
print(data[1])
#(u'asuka', 21, 158.0)

#maiのheightをプリント
print(data[0]['height'])
#162.0
```
#2. 参考書籍
オライリージャパン ： Pythonデータサイエンスハンドブック
Javaでよく使う構文例

# はじめに
Javaで開発することが多くなり、使っている構文などを載せていこうかと思います。
基本的な構文なので、当たり前だと思うこともあると思いますがメモぐらいの気持ちで見ていただければと思います。
# StringUtils.isEmpty()
```
String str = "Hello";
if (StringUtils.isEmpty(str)) { }
```
使い方としては空かnullなどをチェックする時に使います。nullチェックがこれでできるのでよく使ったりします。
最近のJavaであればOptionalを使う方がいいですが、まだまだよく使われる記法
isEmptyというのもありますが、nullチェックはしてないのでStringUtils.isEmptyを使ったほうがいいです。

# ObjectUtils.isEmpty()
StringUtils.isEmpty()と同様の働きをします、Objectに対して行うので、APIなどで取得したデータをEntityに入れたあとにチェックしたりします。APIの取得がうまく行かなくてObjectが正しく作られていない場合にfalseを返すようになります。

# 簡易的な等式チェック strA.equals(strB)
```
private static final String RESULT_CODE = "OK";
// 何かのAPIの結果
String apiResult = nanikanoApi();
if (RESULT_CODE.equals(apiResult)) {}
```
このような使い方をします。RESULT_CODE側はnullにならない定数や決まった値にする必要があります。
nullの値をしてしまうとNullPointerExceptionで落ちますので注意。
比較したい値はapiResult側で処理してください。

# こういうのもあります A == null
~~基本的にはString型のものだけです。他の型でやるとうまく動きません。~~
※ 「==」の特性上、メモリの参照先が同じならtrue、メモリの参照先が違えばfalseとなります。今回はnullの場合ですので頭の片隅に置いていただければと思います。
昔から「null == A」と「A == null」の２つの書き方がありますが、現在のJavaではどちらも同じ動きをします。なので「A == null」でいいと思います。（昔はNullPointerExceptionを防げるとかあったらしい）
ちなみに「null == A」は[ヨーダ記法](https://ja.wikipedia.org/wiki/%E3%83%A8%E3%83%BC%E3%83%80%E8%A8%98%E6%B3%95)と呼ばれています。ヨーダがその昔「強いぞ、ベーダ卿は」といったことにつながるとかなんとか。
Ruby on railsで、プロジェクトにファイルが生成されない時の対処法

![](https://badgen.net/badge/Ruby/2.6/red)
#Ruby on railsで、プロジェクトがうまく作成できない時の対処法

gitでこけていたので

```
rails new --skip-git
```

と打ってgit関連をスキップするとうまくいった。

gitでソースコードを管理したい場合には、このあとプロジェクトフォルダで

```
git init
```
で初期化すればOK。
bootstrap_form を使って devise の form_for を form_with に置き換える

「[Rails中級チュートリアル](https://www.freecodecamp.org/news/lets-create-an-intermediate-level-ruby-on-rails-application-d7c6e997c63f/)」に取り組んでいて実践したことのメモです📝

本文中では、`form_for` が使われていますが、Rails5.1 から`form_with` の使用が推奨されているので、変更に挑戦！

参考 : Railsガイド「[form_forとform_tagのform_withへの統合](https://railsguides.jp/5_1_release_notes.html?version=6.0#form-for%E3%81%A8form-tag%E3%81%AEform-with%E3%81%B8%E3%81%AE%E7%B5%B1%E5%90%88)」
### bootstrap_form gem をインストール

```ruby:Gemfile
gem 'bootstrap_form'
```
[bootstrap_form の GitHub](https://github.com/bootstrap-ruby/bootstrap_form) の README を見ると [`form_with`での使用方法](https://github.com/bootstrap-ruby/bootstrap_form#bootstrap_form_with-rails-51) が書かれているので、それを参考にします。（コピペすると全角記号で死ぬので注意です）
<img width="927" alt="スクリーンショット 2020-02-24 18.03.33.png" src="https://i.gyazo.com/6b70dfce4b176430e6e808cd363f39ac.png">

### devise のフォームを bootstrap_form & form_with バージョンに変更

参考 : [【Rails】deviseのビューのform_forをform_withに置き換える](https://qiita.com/wonder_meet/items/fac07af1edcd79ad102a)

```erb:app/views/devise/sessions/new.html.erb
<%= bootstrap_form_with(model: @user,
                                url: session_path(resource_name),
                              local: true) do |f| %>
        <%= f.email_field :email,
                          autofocus: true,
                        placeholder: 'メールアドレスを入力してください' %>
        <%= f.password_field :password,
                            autocomplete: "off",
                             placeholder: 'パスワードを入力してください' %>

        <% if devise_mapping.rememberable? %>
          <%= f.check_box :remember_me %>
        <% end %>

        <%= f.submit "ログイン" %>

      <% end %>
```


<img width="480" alt="スクリーンショット 2020-02-24 18.20.03.png" src="https://i.gyazo.com/08e99fcd952f7a33b6df1c6c1145241f.png">

🔼こんな感じのフォームが簡単に作成できます ✅

生成される HTML の Eメール入力欄をみてみると、

```html
<input autofocus="autofocus" placeholder="メールアドレスを入力してください" class="form-control" type="email" value="" name="user[email]" id="user_email">
```
となっており、クラスで `form-control`を追加しなくても勝手に付いてくれるようですね！

ログインボタンにはこのようなクラスが付与されています。

```html
<input type="submit" name="commit" value="ログイン" class="btn btn-secondary" data-disable-with="ログイン">
```

ログインボタンのクラスを変更してみました。

```erb

<%= f.submit "ログイン", class: 'form-control btn btn-info' %>
```
<img width="480" alt="スクリーンショット 2020-02-24 18.20.03.png" src="https://i.gyazo.com/70e1492146072ae6892941fd3af1d5b5.png">
Linuxについて

#はじめに
デプロイに取りかかる前に、学んだことをoutput致します。
もうすでにご存知の方、省略の仕方等ご存知でしたら、ご教授願います。

#Linuxについて
- OS（Operating System)の一種
- コンピュータ全体を管理している基本的なプログラム

例）MacOS,Windows10等

##特徴
- オープンソースであり、誰でも自由に無償で利用できる
- 品質の高い多くのソフトウェアが利用できる
- 世界中でサーバ用途として広く利用されているため信頼性が高い
- 操作を自動化するための仕組みが用意されており、サーバの運用が行いやすい

##ディストリビューション
- LinuxはOSの中核である「カーネル」とOSを構成する他のプログラムからできている。
- しかし、実際はこのカーネルだけでは何も動かないので、様々なソフトウェアを組み合わせて動くようになる。
- その作業は一般ユーザには難しく、時間や労力もかかる。
- そこで、すぐに動かすことができるようカーネルと様々なソフトウェアを最初から組み合わせたものを配布するようになった。
- これをディストリビューションと呼ぶ。


#さいごに
日々勉強中ですので、随時更新します。
皆様の復習にご活用頂けますと幸いです。
flutter “idevice_id”は、開発元を検証できないため開けません。 問題解消

Catalina環境で出るぽい？

下記を参考
- https://algorithm.joho.info/flutter/error-mac-osx-xcode/
- https://greentown.tokyo/flutter-device_id/

これを打ち込むとなおる。

```
sudo xattr -d com.apple.quarantine /PATH_FLUTTER_HOME/bin/cache/artifacts/libimobiledevice/idevice_id 

sudo xattr -d com.apple.quarantine /PATH_FLUTTER_HOME/bin/cache/artifacts/libimobiledevice/ideviceinfo
```
CloudFormationで EC2 の`Update requires: Replacement` プロパティを更新した時の流れを追っただけ


CluodFormationで管理しているAmazon Linuxのバージョンを上げたかったので、ついでに挙動をチェックしました。



# CloudFormation Event
新しいインスタンスの作成を伴う更新の場合、まず新規にインスタンスを作成し、それが問題なければ古いインスタンスを削除する、という順番で動作するようですね。

```
| 2020-02-24 17:11:56 UTC+0900 | TestLinux | DELETE_COMPLETE | - |
| 2020-02-24 17:11:08 UTC+0900 | TestLinux | DELETE_IN_PROGRESS | - |
| 2020-02-24 17:11:03 UTC+0900 | TestLinux | UPDATE_COMPLETE | - |
| 2020-02-24 17:10:47 UTC+0900 | TestLinux | UPDATE_IN_PROGRESS | Resource creation Initiated |
| 2020-02-24 17:10:46 UTC+0900 | TestLinux | UPDATE_IN_PROGRESS | Requested update requires the creation of a new physical resource; hence creating one. |
```

# Resource

* Instance ID が新しくなったインスタンスが作成されました。
* 古い Instance ID のインスタンスはterminated状態になっています。


# Amazon Linux の中身

当たり前ですが、初期状態になっていました。
世界最小の人工知能モジュール-Coral Accelerator Module

Murata Electronics Americasは最近、Googleと提携して世界最小の人工知能（AI）モジュールであるCoral Accelerator Moduleを作成したことを発表しました。 カスタムデザインモジュールは、小型化されたフットプリント内にGoogleのEdge TPU ASICをパッケージ化します。 このソリューションは、優れたノイズ抑制を実現し、小さなフットプリントでプリント回路基板の設計を簡素化することにより、AIソリューションの実装における最も差し迫った課題のいくつかを克服します。 

![alt](https://blogimg.goo.ne.jp/user_image/4e/3d/f1519bd2ccd1e810814bf33b203329a3.jpg)

スペースが限られた操作で非常に堅牢な機能を実現するには、すべてのボードスペースを最適化する必要があるため、小型化が重要です。 このコラボレーションの結果は、AIの実行に必要なアルゴリズム計算を高速化するソリューションです。

「Coral Accelerator Moduleは素晴らしい製品であり、MurataはAI Edgeエコシステムの重要なビルディングブロックを提供します。 このモジュールは、次世代のインテリジェントデバイスを実現する上での画期的な製品です。 村田のコネクティビティ製品マーケティンググループのショーンキムは、次のように述べています。

![alt](https://blogimg.goo.ne.jp/user_image/3e/18/9be97289a294f540b97efc2d51c742a6.jpg)

「コーラルは、製造からヘルスケア、農業まで、多くの業界でデバイス上のAIの新しいアプリケーションを可能にします。 村田製作所と協力して、Coral Accelerator ModuleをGoogle Edge TPUで堅牢ではんだ付け可能な統合しやすいパッケージで提供することで、より多くの顧客がより多くの環境で製品にCoralインテリジェンスを組み込むことができます。 コーラルのマネージャー。

Coralの目標は、デバイスレベルで実行されているAIアプリケーションをプロトタイプから実稼働に迅速に移行できるようにすることです。 Coralは、ローカルAIでデバイスを構築するためのハードウェアコンポーネント、ソフトウェアツール、およびプリコンパイルされたモデルの完全なツールキットを提供します。 AIモジュールは、完全に統合されたCoralプラットフォームの不可欠な部分であり、多くの業界の無数のアプリケーションに実装できます。

Murataは、Coralと緊密に連携して、AIモジュールがCoralテクノロジーを展開するアプリケーションへの統合のための柔軟性、スケーラビリティ、および互換性を実現できるようにしました。 この目的のために、村田製作所は、高密度設計とコンポーネント統合の分野で、グローバルリソースと数十年にわたる研究開発を活用しました。

![alt](https://blogimg.goo.ne.jp/user_image/53/6f/9a0bac5c358e3ab5d477c08e6f63d36b.jpg)

Coral Acceleratorモジュールは、2020年初頭にCoral Webサイトで販売されます。Google Coral製品、および大量販売または大量販売（ボリュームディスカウント）の詳細に興味がある場合は、ようこそCoral 海外代理店 [Gravitylink](https://store.gravitylink.com/global)
Ruby/GTK3 - Button

`gem install gtk3`

# Button

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/f82fa747-f18a-f8bb-5b38-b9a4b51935c8.png)

> "Click me" button was clicked
> "Open" button was clicked
> Closing application


```ruby
require 'gtk3'

class ButtonWindow < Gtk::Window
  def initialize
    super
    set_title 'Button Demo'
    set_border_width 10

    hbox = Gtk::Box.new(:horizontal, spacing = 6)
    add(hbox)

    button = Gtk::Button.new(label: 'Click Me')
    button.signal_connect('clicked') { on_click_me_clicked }
    hbox.pack_start(button)

    button = Gtk::Button.new(mnemonic: '_Open')
    button.signal_connect('clicked') { on_open_clicked }
    hbox.pack_start(button)

    button = Gtk::Button.new(mnemonic: '_Close')
    button.signal_connect('clicked') { on_close_clicked }
    hbox.pack_start(button)
  end

  def on_click_me_clicked
    puts '"Click me" button was clicked'
  end

  def on_open_clicked
    puts '"Open" button was clicked'
  end

  def on_close_clicked
    puts 'Closing application'
    Gtk.main_quit
  end
end

win = ButtonWindow.new
win.signal_connect('destroy') { Gtk.main_quit }
win.show_all
Gtk.main
```

* https://python-gtk-3-tutorial.readthedocs.io/en/latest/button_widgets.html
AWSのアカウント作った直後の状態からECS＋FargateでTomcatのDockerコンテナを起動する

超・初心者向け、AWSのアカウント作った直後の状態からECS＋FargateでTomcatのDockerコンテナを起動するまで。
最低限、AWSのマネジメントコンソールをちょこちょこでも触ったことがあるくらいが前提。

全体の流れ。
1. EC2の起動
2. Dockerのインストール
3. セキュリティグループの設定
4. Tomcatの起動
5. CLIの設定
6. DockerコンテナのイメージをECRに登録
7. IAMポリシーとロールの設定
8. ECS on FargateでECRに登録したDockerコンテナのイメージを起動

# 1. EC2の起動 ～ 2. Dockerのインストール
↓この辺の記事を参考にして、EC2でインスタンスを起動してDockerをインストールする
【Qiita】[AWSのEC2でDockerを試してみる](https://qiita.com/yumatsud/items/33bc22f7d8f640a286f4)

EC2へのTelnetログインどうやんねん、って人は↓これを読む。
【AWS公式】[PuTTY を使用した Windows から Linux インスタンスへの接続](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/putty.html)

# 3. セキュリティグループの設定 ～ 4. DockerでTomcatの起動
↓この辺の記事を参考にして、DockerでTomcatを起動する。
【Qiita】[Docker上でnginx+tomcat を構築してみる。](https://qiita.com/hiabe01/items/c8ceb41cb75b7105b82e)

当たり前だが、セキュリティグループでこの辺で使うポートを開放しておかないと通らない。

# 5. CLIの設定
さてDockerコンテナをレジストリに登録するぞ！と思ってもまだ早い。まずはCLIを使えるようにしておかないと、aws ecr のコマンドが実行できない。
今回は、AWS標準のAMIからEC2インスタンスを起動しているので、CLIはデフォルトでインストール済み。↓これを参考にしながら、初期設定を行う。IAMユーザの登録もこの中で説明されている。
【AWS公式】[AWS CLI の設定](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-configure.html)

# 6. DockerコンテナのイメージをECRに登録
↓を見ながら作ってきたDockerコンテナのイメージをECRにPUSHする。
【Qiita】[AWS ECRにdockerイメージを登録する](https://qiita.com/Esfahan/items/2ddc8d481afd012da357)

# 7. IAMポリシーとロールの設定
さて、いよいよECS on Fargateでデプロイだ！と思ったけどちょっと待って。
ECSを実行するためのIAMポリシーとロールを設定しないと、コンテナを起動することができないのである。
【AWS公式】[Amazon ECS タスク実行 IAM ロール](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_execution_IAM_role.html)

# 8. ECS on FargateでECRに登録したDockerコンテナのイメージを起動
↓この辺を参考にしながら、タスク定義→クラスタ作成→サービス作成をする。
【Qiita】[Amazon Fargate でコンテナを動かす](https://qiita.com/NaokiIshimura/items/bf4c21500a5f542dff9a)

気を付けなければいけないのは「ポートマッピングの設定」で、Tomcatは80番ポートを起動することができないので、ポートマッピングでコンテナ側のポートを8080にしないといけない。

あと、タスク定義の↓ここが思いっ切り罠で、イメージのURI間違えてもタスク自体は作れてしまう。で、実行しようとしたときにエラーが出て何のログも吐かないので悩まされるという。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/6b2dd812-ec57-042f-ebaa-06f838630c2c.png)


やったーこれでTomcat起動したぞー！あとは、応用すれば色々起動できるようになるはず。

# その他
###### Dockerのログ確認
試行錯誤しているうちに docker run してもコンテナが起動しない(正確には、おそらく起動後にexitしていたのだと思う)ことがあり、↓この辺をテキトーにやって調べたり直したりはした。
【Qiita】[dockerでコンテナが立ち上がらないときやってみること](https://qiita.com/mom0tomo/items/35dfacb628df1bd3651e)

###### Dockerイメージの掃除
色々と docker run とかやってると、docker images したときに謎のイメージが増殖したりしているので、↓これを参考にキレイにした。別にVMなんだから後生大事にせず潰せばいいんだけどね…。
【Qiita】[Dockerイメージとコンテナの削除方法](https://qiita.com/tifa2chan/items/e9aa408244687a63a0ae)

###### タスク定義の削除
ECSのタスク定義を登録すると、簡単に消すことができなくなる。
↓これで消せる。厳密にはINACTIVEにして見えなくしているだけのようだ。完全に消し去ることはできなそう？
【Qiita】[タスク定義の登録解除](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/deregister-task-definition.html)

###### サービスディスカバリからのサービス名の削除
どうにも、サービスディスカバリに登録したサービスが上手く削除できないことがあるようだ。
Route53の利用料がかかっている気がするのでCLIから以下の手順で削除する。
※しかも同じサービス名で起動できなくなっちゃうし。

```shell:サービス一覧の取得
$ aws servicediscovery list-services
```

```shell:サービス削除
$ aws servicediscovery delete-service --id=[一覧で取得したId]
```
RaspberryPi4でSSHを使用してWindowsモートデスクトップで操作する


<H1>はじめに</H1>
RaspberryPiをWindowsからリモートデスクトップで接続する手順をまとめてみました。
やってみると意外と簡単で拍子抜けしてしまいました。

手順は
・RaspberryPiのSSHを有効にする
・RaspberryPiのIPアドレスを確認する
・RaspberryPiにxrdpをインストールする
・Windows10でリモートデスクトップ接続をする
以上です。（たったこれだけ・・・）

しかし、これは同一LAN内からの接続のみなので、外部から接続しようとした場合は別の設定が必要になります。

<H1>SSHを有効にする</H1>

![11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273281/16b5c46f-1100-9913-9229-b307643d7ac7.jpeg)



![22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273281/9a87fb1b-f488-ced7-4eb2-1e653b8926a8.jpeg)


<H1>WiFiのIPアドレスを確認する</H1>

Terminalを開いてifconfigと入力

~~~
pi@ユーザー名:~ $ ifconfig
eth0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether dc:a6:32:71:d6:87  txqueuelen 1000  (イーサネット)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (ローカルループバック)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.119  netmask 255.255.255.0  broadcast 192.168.100.255
        inet6 2001:268:c1e5:8877:ec89:4673:a5b3:647a  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::b585:966c:8402:2eb0  prefixlen 64  scopeid 0x20<link>
        ether dc:a6:36:70:d6:78  txqueuelen 1000  (イーサネット)
        RX packets 17951  bytes 13939435 (13.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 13100  bytes 2826298 (2.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

pi@ユーザー名:~ $ 
~~~

wlan0のinet 192.168.100.119となっている部分がipアドレス

<H1>Windowsリモートデスクトップで接続してみる</H1>

Terminalを開いてxrdpをインストールする

~~~
pi@ユーザー名:~ $ sudo apt-get install xrdp
~~~
これでRaspberryPi側の設定は終わりです。

次にリモートデスクトップ接続をしたいWindows]パソコンのリモートデスクトップを開き、RaspberryPiのIPアドレスを入力します。
![test.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273281/94a6252d-c27a-d911-aefa-be3d1f2cb290.jpeg)

すると以下のようなウインドウが出てくるのでusernameとpasswordを入力します。
![te1111st.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273281/fba6fbcb-7a7e-b3f3-6aaf-076ae8212fcd.jpeg)


WindowsでRaspbianを開くことができました。

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273281/fcf3a32c-744f-2b7e-dd96-a6280f7b7ff4.jpeg)


<H1>最後に</H1>
いままで、RaspberryPiとWindowsで別々のキーボード、マウス、ディスプレイを使っていましたが、これで同一LAN内でWindows上からRaspberryPiにアクセスすることができるようになりました。
基本情報19週目(2/24)

##目標と結果##

##目標##
•アルゴリズムの勉強(理解度を深める)
•アルゴリズム理解した上で、過去問を解く。

##振り返り##

__TRY__

__KEEP__

__PROBLEM__

##次週 and more...##
[2/17](https://qiita.com/Comitakato0515/items/107c1bca1a469ee84b45)
基本情報18週目(2/17)

##目標と結果##

##目標##

•アルゴリズム問題、ソフトウェア設計問題及びストラテジ系問題の解き方のベースを学習する。(使用テキスト-午後問題が解ける本)
•速習言語テキストの第1章C言語〜第6章JAVAの理解を深める。
##振り返り##
今回のチームミーティングの集まりでアルゴリズムに関しての試験を一問解いたが、5問中1問という無惨な結果で終わってしまった。アルゴリズムを中心的に解いていきたい。
__KEEP__
1日1時間
__TRY__
アルゴリズム問題に挑戦
__PROBLEM__
全く解けていない。
##次週 and more...##

2/24
Node.js (サーバサイド JavaScript) 事始め

#はじめに
TypeScriptを覚えたいのですが、まずはNode.jsの勉強から始めた方が良さそうな感じでしたので、Node.jsの勉強を始めました。

#Noda.jsのインストール
[公式サイト](https://nodejs.org/ja/![nodejs1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/90f4864a-5770-59d6-c522-5aba6749e50a.jpeg)
)からインストーラーをダウンロードしてインストールします。

![nodejs1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/5b143294-a4fb-0951-81c4-b3d491ee83f7.jpeg)



LTS版の方が無難だと思います。
Node.jsはmacやLinuxのイメージが強かったのですが、Windowsでも問題なく動きました。


#環境
OS:Windows 10 Pro 64bit
DB:SQL Server 2019(Cent OS 8 on Hyper-V)
node.js:v12.16.1
npm:v6.13.4
Editor:Visual Studio Code

#作業フォルダの作成
今回は「D:\Node」を作業フォルダにしました。

#Hello World
作業フォルダに以下のファイルを作成します。

```js:sample01.js
var http = require('http');

var server = http.createServer( function(req, res) { 
    res.writeHead( 200, {'Content-Type': 'text/plain'});
    res.write('Hello World'); 
    res.end(); 
}); 

server.listen(3000);
console.log('サーバを起動しました'); 
```

コマンドプロンプトを起動し、作業フォルダに移動します。

```
D:
CD Node
```

Node.jsを起動します。
起動方法は「node ファイル名」です

```
node sample01.js
```

問題がなければ、コマンドプロンプトに以下の様に表示されます。

```
サーバを起動しました
```
http://localhost:3000
にアクセスします
![nodejs2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/b7291623-4701-87ea-f3f5-f8e041b2df9c.jpeg)

ブラウザに「Hello World」と表示されればOKです。
【UE4】ソニックブーム(チャージショット)を出す。

<h2>Event Tickを使わないチャージショット</h2>
UE4はボタン一つでコマンド完了というのが基本のようで、
2つ以上のボタンを組み合わせて一つのコマンドを発行する
というのは用意されていないのでしょうか。
初心者丸出しで恥ずかしいですが、とりあえず考えてみました。
なお、こんな記事も書いています。
上級者の方にご指導いただけると幸いです。

コマンド入力(2つボタンの組み合わせ)
https://qiita.com/KLaboratory/items/db7bb311545ae3447cb7
上段パンチ下段パンチ(2つボタンの同時押し)
https://qiita.com/KLaboratory/items/7194fd32fa2ca51cb33a

<h2>ボタン押しっぱなしの取得</h2>
ストリートファイターのガイルのソニックブームのように、一定時間ボタンを押した後にコマンドを発生する処理です。
![6_タメ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/976c85df-2c1d-038c-3852-1ee1d9eb691e.png)
十字キーの上を押した瞬間に、現在のローカル時刻を取得します。
また、キーを離したときにもローカル時刻を取得します。それぞれ別の変数にセットして、時間差を取ります。
Retriggerable Delayで指定時間以上押していれば、trueに、時間不足のときはfalseになります。
また、キーを離したときに取った時間差を表示します。これでソニックブームのコマンドが出せると思います。

Event Tickを使うともっと簡単に実装できるのですが、常時監視するのは負荷がかかりそうなので、このような方法になりました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ソニックブームを撃てるんじゃないかな。<a href="https://twitter.com/hashtag/UnrealEngine?src=hash&amp;ref_src=twsrc%5Etfw">#UnrealEngine</a> <a href="https://twitter.com/hashtag/UE4Study?src=hash&amp;ref_src=twsrc%5Etfw">#UE4Study</a> <a href="https://t.co/y0JTT8Fpsu">pic.twitter.com/y0JTT8Fpsu</a></p>&mdash; 特命社長 (@tokumeishatyo) <a href="https://twitter.com/tokumeishatyo/status/1231861687331852289?ref_src=twsrc%5Etfw">February 24, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

上キーでチャージするようにしてしまったので、キャラが歩いてしまいますが、
たとえばゲームパッドのＲキーやＬキーにするとか、あるいは十字キーで移動させないようにするという方法を取るといいかもしれません。
Docker run オプション、ステータス遷移まとめ


初めてdocerを使って環境構築をしたので、まとめておこうと思います。


#docker run オプションまとめ
docker runコマンドは少しあとで説明があるcreateとstartを同時に行えるコマンド。
基本はこれを使うと思われるが、オプションが多くてよくわからなかったためまとめておこうと思う。
<img width="512" alt="スクリーンショット 2020-02-24 17.31.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543154/a355d3d8-b985-0e50-de90-717bfb794ed4.png">


#dockerのライフサイクル
コンテナのステータスの繊維について全体像を把握した上で、ターミナル上でどのような状態となっているのかをまとめておきます。
![IMG_0189.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543154/a817bf4e-0771-274d-51ae-db1fdd77a09c.jpeg)


###create(作成)
createはコンテナが作られた状態
今回のコンテナ名は[status-test]としているが、ここは任意のコンテナ名を指定。

```
docker create --name　status-test　-it alpine /bin/sh
```
docker psで起動しているコンテナを確認するが起動はしていない。
<img width="1037" alt="スクリーンショット 2020-02-24 16.27.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543154/eb789dc1-d81e-8040-dd35-b40039026278.png">
docker ps -aでみるとコンテナとして追加されていることがわかる。
<img width="1278" alt="スクリーンショット 2020-02-24 16.27.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543154/2587a26f-5a8d-8535-9c1a-ac3db05a02f7.png">

###start（開始）
runing状態にする

```
docker start status-test
```
docker psで起動していることを確認
<img width="1312" alt="スクリーンショット 2020-02-24 16.31.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543154/762a77eb-e5b1-009a-9ad2-71ec2eddd802.png">

###pause（一時停止）

```
docker pause status-test
```

STATUSに(paused)がついている。
<img width="1158" alt="スクリーンショット 2020-02-24 16.35.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543154/a53f1d7e-184b-1ae2-d9ab-6542cc88d3b2.png">

###unpause(再開)

```
docker unpause status-test
```
STATUSに(paused)が消えている。
<img width="1161" alt="スクリーンショット 2020-02-24 16.39.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543154/633237d7-cbdc-37da-e990-7b35dee9885c.png">

###exited(停止済)

```
docker stop status-test
```
画像のコンテナ名はhello-worldですが、ステータスが変化します。
runでまた開始することができます。
<img width="1266" alt="スクリーンショット 2020-02-24 16.45.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543154/4ea85bb6-f347-2a68-2b14-6d73996fa895.png">
HPEサーバの管理ツール操作方法

## はじめに
* HPEが提供しているサーバ管理ツールとして、`hpacucli`や`hpasmcli`などがあります。
* HWの状態確認に有益な為、利用しないてはありません！
* インストール方法や利用方法を以下に記載します。

## 詳細
### インストール方法
* HPEのWebページからRPMファイルを取得。
	* [HPサポートページ](https://support.hp.com/jp-ja/drivers)から検索して取得するのが一般的
    * もしくはHPE用のyumリポジトリを追加する。
        * [Software Delivery Repository](http://downloads.linux.hpe.com/)
    * その場合はインストールコマンドが`yum`になるので、注意すること。
* インストールしたいサーバへRPMファイルをFTP、もしくはRPMファイルをwgetで取得し、以下のコマンドを実行。
 
```
（例）# rpm -ivh hpacucli-9.40-12.0.x86_64.rpm
```

* モニタリングツールを起動する。

```
（例）# /etc/init.d/hpasm start
（例）# /etc/init.d/hp-health start
```

### hpacucliコマンドリファレンス
#### 物理ディスクのステータス確認

```
# hpacucli ctrl all show config
```

```
■コマンド実行例
[root@tapi04 tmp]# hpacucli ctrl all show config

Smart Array P420i in Slot 0 (Embedded)    (sn: 0014380282D7490)

   array A (SATA, Unused Space: 0  MB)


      logicaldrive 1 (1.8 TB, RAID 1+0, OK)

      physicaldrive 1I:1:1 (port 1I:box 1:bay 1, SATA, 1 TB, OK)
      physicaldrive 1I:1:2 (port 1I:box 1:bay 2, SATA, 1 TB, OK)
      physicaldrive 1I:1:3 (port 1I:box 1:bay 3, SATA, 1 TB, OK)
      physicaldrive 1I:1:4 (port 1I:box 1:bay 4, SATA, 1 TB, OK)

[root@tapi04 tmp]#
```

### hpasmcliコマンドリファレンス
#### 物理メモリのステータス確認

```
hpasmcli -s "SHOW DIMM"
```

```
■コマンド実行例
[root@api04 ~]# hpasmcli -s "SHOW DIMM"

Failed to read embedded NIC status.
This system may not have any embedded NICs installed.


DIMM Configuration
------------------
Processor #:                     1
Module #:                     12
Present:                      Yes
Form Factor:                  9h
Memory Type:                  DDR3(18h)
Size:                         16384 MB
Speed:                        1600 MHz
Supports Lock Step:           No
Configured for Lock Step:     No
Status:                       Ok

Processor #:                     2
Module #:                     12
Present:                      Yes
Form Factor:                  9h
Memory Type:                  DDR3(18h)
Size:                         16384 MB
Speed:                        1600 MHz
Supports Lock Step:           No
Configured for Lock Step:     No
Status:                       Ok


[root@api04 ~]#
```

## 参考URL
* [HP装置 HW確認コマンド](https://it.alohakeakua.net/?p=72)
* [HPEサポートページ（hpacucliインストール）](https://www.hpe.com/jp/ja/search-results.html?client=&qt=hpacucli&search=%26%2362992%3B&cc=jp&charset=shift_jis&hpa=http%3A%2F%2Fwww8.hp.com%2Fjp%2Fja%2Fhpe%2Fcontact%2Fcontact.html&hpn=%8C%C2%90l%8C%FC%82%AF&hpr=http%3A%2F%2Fh41131.www4.hp.com%2Fjp%2Fja&hps=%8C%C2%90l%8C%FC%82%AF&lang=ja&qp=url%3Ah41131.www4.hp.com%2Fjp%2Fja+url%3ANEW+URL+GOES+HERE)
* [電源・ファン等の確認](https://rti7743.hatenadiary.org/entry/20110718/1311018340)

---
以上
Dockerで環境を立ちあげるための手順（個人用メモ）

# はじめに

本稿は、Dockerで環境を立ち上げる際の手順を自分のために書き起こしたものです。このような面倒な手順を踏まないとDockerコマンドを実行できないのは筆者だけかもしれませんが、個人用メモなので悪しからず。なお、本稿においては事前に環境を作成済みであることを前提にしております。

筆者の環境は、以下の通りです。

- Docker Toolbox v19.03.1 (Windows 64bit) 
- Git Bash

# Dockerを立ち上げる手順

最初に、docker-machineの状態を確認します。

```
$ docker-machine ls
```

```
NAME      ACTIVE   DRIVER       STATE     URL   SWARM   DOCKER    ERRORS
default   -        virtualbox   Stopped                 Unknown
```

上記の出力結果から、

1．"default"というdocker-machineが存在し、
2．Activeではない、かつ
3．Stateが"Stopped"であることが分かります。

したがって、まず"default"をStartさせます。

```
$ docker-machine start default
```

```
Starting "default"...
(default) Check network to re-create if needed...
(default) Windows might ask for the permission to configure a dhcp server. 
Sometimes, such confirmation window is minimized in the taskbar.
(default) Waiting for an IP...
Machine "default" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
```

次に、"default"をActiveにします。
これには、evalコマンドを使います。

```
$ eval "$(docker-machine env default)"
```

"default"がActiveになったことを確かめるために、再び一番最初のコマンドを入力します。

```
$ docker-machine ls
```

```
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v19.03.5
```

"default"のSTATEがrunningになっています。また、Activeの欄に"*"がついており、Activeになっていることも分かります。
これでdocker-machineをActiveにする作業が完了しました。

次に、dockerのContainerをstartさせます
まず、現状あるContainerの状態を確認します。

```
$ docker ps -a
```

```
CONTAINER ID        IMAGE           COMMAND                  CREATED　　　　　　　STATUS             　　      PORTS            　　    NAMES
9c68b6037143        1a7             "jupyter lab --ip=0.…"   29 hours ago        Exited (255) 5 minutes ago   0.0.0.0:8888->8888/tcp   my-first-lab
```

my-first-labというコンテナが存在している（runはしていない）ことが分かります。5分前にExitされたようです。
このContainerをStartさせます。

```
$ docker start my-first-lab
```

```
my-first-lab
```

これで環境を立ち上げる作業が完了しました。
筆者の場合は、これでJupyterLabの作業環境にアクセスすることができます。
![JupyterLab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351754/c372dbac-9389-616a-0ec5-f049aade2c3b.png)

# おわりに
本稿が初めてQiitaに投稿した記事になりますが、意外とサクサク書けて楽しかったです（ただの感想）。この記事が誰かの役に立つことを願っております。
ubuntu18.04 GNOME3でのデュアルモニターとワークスペースの諸設定をしたい


#何がしたかったのか

GNOMEにはワークスペース機能があるがデュアルモニター時にプライマリモニタのみワークスペース機能を有効にしたかった


#用意するもの

```bash
$ sudo apt install gnome-tweak-tool
```
gnome tweak toolをインストールする（既に入ってることもある）


#設定

コマンドで

```
$ gnome-tweaks
```

![Screenshot from 2020-02-24 17-23-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232732/96346166-eac6-257b-12b7-a25d4d3909c3.png)

設定画面がでる


ワークスペースの項目に移動

![Screenshot from 2020-02-24 17-24-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232732/b4cb9662-2d24-c19e-5992-dde0afc7ca25.png)



```プライマリディスプレイだけワークスペースを使用する``` に☑を入れるとプライマリディスプレイのみワークスペースを使用可能です
逆にマルチディスプレイ全体でワークスペースを使いたいときは ```ディスプレイをまたいでワークスペースを使用する ```　に☑を入れればOKです。

また静的ワークスペースを使うとワークスペース数が固定になりますが動的ワーススペースを使うと動的にワーススペース数が決まるのでワーススペースを大量に使ったりする人は動的にしておくといいかもしれません
VSCode Remote SSHでmacOS / Windows Serverのホストにアクセスできるようになったぞい

# 先に結論

2020年2月17日に、NightlyビルドでmacOSがサポートされました。
https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh-nightly

### 追記（2020/2/27)
Windows Serverも次のstable版でサポートされるよ
https://github.com/microsoft/vscode-remote-release/issues/25

既存の`Remote SSH`を無効もしくはアンインストールしてください。
`VSCode Insider`が推奨されていますが、`version 1.42.1`のVSCodeでも使用できました。

あくまで開発途中のバージョンなので、使用は自己責任で。

# 問題点

VSCodeには、`Remote Development`という拡張機能の一部として、SSH経由でリモート環境で開発できる`Remote SSH`があります。
サーバーマシンなど安定したスペック環境下で開発ができるのでとても便利です。
https://code.visualstudio.com/docs/remote/remote-overview

しかし、この`Remote SSH`はサーバーマシンでの使用を前提としていたため、CentOSなどのLinuxOSでしか使えませんでした。
僕は自宅でホームサーバを動かしているのですが、宗教上の理由でOSはmacとなっています。よって、これまで`Remote SSH`を使ったリモート開発ができませんでした。

ちなみに同じような境遇の方が、Github上にissueが上げてくれていました。
https://github.com/microsoft/vscode-remote-release/issues/24

# 使えるようになったよ

ネットサーフィンしていたら、たまたまこのissueを目にして、「そういえばどうなったかな」と開いたところ、「対応したよ！」とのこと。
というわけで実際に使ってみました。

## 1. Remote SSHを無効に
すでにインストール済みの方は、`Remote SSH`を無効にしておきましょう。アンインストールしても良いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265811/e7c6c1d0-76fd-765d-c621-b88b9281ea2b.png)

## 2. Nightly版SSH Remoteをインストール

[こちら](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh-nightly)
から、Nightly版の`Remote SSH`をインストールしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265811/f79d467c-e4e9-6243-8d3b-1e17eb82d1a8.png)

## 3. 使ってみる

あとは通常の`Remote SSH`を使う流れ同様に、SSH経由でリモートホストへ接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265811/9c172af9-3322-d00f-5aaa-d13e152646ec.png)

ssh_configを設定していれば、特に問題なくつながります。
しっかりMacOSのリモートホストにSSH経由で接続されました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265811/014522e1-7470-533c-4469-0b170f5a7115.png)

# 終わり

なかなかにニッチな需要かもしれないですが、使えるようになったよ！ということで記事にしました。
冒頭にも書いたようにNightlyビルド版はあくまで開発途中のものなので、使用による不具合等は自己責任で！
Manjaro KDE でWOL(Wake On LAN) を有効にする

#はじめに
KDEには、GUIのネットワーク設定にWOLの項目が無いので
ethtoolをsystemdで自動実行させます。
手打ちでやるには、ちょっとややこしいので、スクリプトにしました。
##WOLを有効化するシェルスクリプト
```
#!/bin/bash
# systemd設定ファイル保存フォルダ
SYSTEMD_PATH="/etc/systemd/system/"
SERVICE_NAME="wol.service"
FILE_PATH=${SYSTEMD_PATH}${SERVICE_NAME}

# tlpの設定変更
sudo sed -i -e "s/WOL_DISABLE=Y/WOL_DISABLE=N/g" /etc/default/tlp
# 設定値確認
echo "tlp設定変更の確認：WOL_DISABLE=N　で成功"
sudo grep "^WOL_DISABLE" /etc/default/tlp

# ethtoolのインストール
sudo pacman -S --noconfirm ethtool

# インターフェイス名を調べて変数に入れる
NIC_LIST=($(for DEV in `find /sys/devices -name net | grep -v virtual`; do ls $DEV/; done))
# 1つ目のインターフェイスを指定
INTERFACE=${NIC_LIST[0]}

# 確認
echo "インターフェイス名："${INTERFACE}
echo ${FILE_PATH}

# ファイルの上書き確認
if [ -e ${FILE_PATH} ]; then
    echo "ファイルを上書きしますか？ [Y/n]"
    read -p "answer[y or n]:" ANSWER
    ANSWER=`echo $ANSWER | tr y Y | tr -d '[\[\]]'`
    if [ ${ANSWER} != "Y" ]; then
        exit 0
    fi
    # 設定がある場合は、サービスを止めておく
    sudo systemctl stop ${FILE_NAME}
    sudo systemctl disable ${FILE_NAME}
fi

sudo tee ${FILE_PATH} <<EOF >/dev/null
[Unit]
Description=Configure Wake-up on LAN
Requires=network.target
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/ethtool -s ${INTERFACE} wol g

[Install]
WantedBy=basic.target
EOF

# 設定のリロード
sudo systemctl daemon-reload
# サービスのスタート
sudo systemctl start ${SERVICE_NAME}
# 自動起動の設定
sudo systemctl enable ${SERVICE_NAME}

# 最終確認
echo "WOL有効化の確認：Wake-on: g で有効"
sudo ethtool ${INTERFACE} | grep Wake-on
```
##シェルスクリプトの解説
- Manajroはデフォルトで、TLP(電源管理)が入っていて、WOLが無効にされてるので有効化する
- ethtoolをインストールする
- ネットワークインターフェイス名を調べる
- systemdの設定ファイルを作る
- systemdのサービスを有効化する

##注意事項
WOLはバッテーリー消費が多くなるらしいので、ノートPCでは使わないほうがいいです。
このスクリプトはデスクトップPCで、有線LANが一つのみの環境を前提にしてます。

##動作環境
Manjaro KDE Edition 19.0.0
Linux Kernel 5.5.2-1
##最後に
おなじKDEのkubuntuも使っていたんですが、あっちはTLPが入っていませんでした。
スクリプト書くのしんどいですが、次から楽できるので頑張って書くようにしてます。
Active record search by JSON and JSONB column

JSONB will helps lots to use PostgreSQL internal functions. But, if you have JSON column only then you need to cast like following.

1. Array of Hashes

    column_name: `[{a: 1}, {b: 2}, {c: 3}]`

    ```ruby
    Model.where('column_name::jsonb @> ', [{a: 1}].to_json)
    ```
1. Select by json column and alias as Model method (TODO)
2. Select by pattern and alias as object (TODO)


Reference: 
https://www.postgresql.org/docs/current/functions-json.html
MacにDocker+Rails6+MySQLで開発環境構築

公式ドキュメント（ https://docs.docker.com/compose/rails/ ） を以下のコンポーネントでやってみた。
- ruby2.6.5
- Rails6系
- MySQL5.7

# 前提
MacにDocker Desktopがインストールされていること。
適宜、プロジェクト用のディレクトリを用意する。

# Dockerfile
```docker:Dockerfile
FROM ruby:2.6.5

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
    && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs yarn

RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]
```

# Gemfile
```Gemfile
source 'https://rubygems.org'
gem 'rails', '~>6'
```

# Gilefile.lock
```shell
touch Gemfile.lock
```

# entrypoint.sh
```shell:entrypoint.sh
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
```

# docker-compose.yml
```yml:docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: root
    ports:
      - "3306:3306"
    volumes:
      - ./docker/db/data:/var/lib/mysql
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
```

# Railsプロジェクトの作成
```shell
# 薄いRailsプロジェクト
docker-compose run web rails new . --force –-database=mysql --skip-action-mailer –-skip-action-cable –-skip-sprockets --skip-test --skip-turbolinks -–skip-bundle
```

# build
```
docker-compose build
```

# database.ymlの修正
```yaml:config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password # docker-compose.yml の MYSQL_ROOT_PASSWORD
  host: db
```

# コンテナ再起動
```
docker-compose down
docker-compose up -d
```

# Webpacker
```
docker-compose run web bundle exec rails webpacker:install
```

# DB作成
```
docker-compose run web bundle exec rails db:create
```
【class名一覧】CSSでよく使うクラス名をたった１枚にまとめてみました。


class命名のときに毎回
「何にしよっかなー？」って迷わないように
一覧にしてみましたのでシェアいたします。

もっと詳しくまとめてくれている
サイトもあるんですけど、情報が多すぎて・・
印刷したら何ページにもなっちゃうし
かといって
毎回サイトを開いて確認するのも面倒くさい。

そこで、
すっきり１枚にまとめてみました。

サイト模写するときに
この一覧を見ながら
まずはclass名やid名を決めてしまえば
HTMLマークアップのとき
class命名で考えこむ時間を短縮できるはずです。


アナログですけど
けっこう便利ですよ:blush:

![class-list.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591746/1e20fa83-b055-0096-f075-7c2c421d5cf3.png)
Nuxt.jsで画像ギャラリーを実装（【vue-image-lightbox】を使用）

##Nuxt.jsで画像ギャラリーを実装
Nuxt.jsで画像がポップアップするギャラリーを作成する方法になります。
イメージは下記の感じです。
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/adc8c615-617c-feb4-6788-a505419fbc2d.gif)


今回は【[vue-image-lightbox](https://github.com/pexea12/vue-image-lightbox?ref=kabanoki.net)】を使用しました。【vue-image-lightbox】は、Vue.jsのLightboxライブラリです。

まずは、【vue-image-lightbox】をインストールします。

```
npm install vue-image-lightbox vue-lazyload
```
(yarnの場合は下記コマンド↓)

```
yarn add vue-image-lightbox vue-lazyload
```
Nuxt.jsのディレクトリ構成は下記のようになっています。
![nuxt.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/9587ed83-6596-832e-70f5-df9679efa064.jpeg)

pluginsディレクトリにファイルを作成しvue-lazyloadをインポートします。
(vue-image-lightboxを使用する為には、vue-lazyloadが必要な為)

今回はmain.jsと言うファイルを作成しました。

```js:main.js
import Vue from 'vue'
import VueLazyLoad from 'vue-lazyload'

Vue.use(VueLazyLoad)
```
次にnuxt.config.jsを編集していきます。

```js:nuxt.config.js
export default {
  plugins: [
    { src: '~/plugins/main.js'}
  ],
}
````
あとは、画像ギャラリーを使用したいcomponentsで【vue-image-lightbox】をインポートします。

```vue:vue

<script>
import LightBox from "vue-image-lightbox";
require("vue-image-lightbox/dist/vue-image-lightbox.min.css");
export default {
    components: {
    LightBox,
  },
};
</script>
```

使用例は下記の通りです。

```vue:vue
<template>
  <button @click="showLightbox(0)"></button>
  <button @click="showLightbox(2)"></button>
  <button @click="showLightbox(3)"></button>
  <LightBox ref="lightbox" :images="images"></LightBox>
</template>

<script>
export default {
  data() {
    return {
      images: [
        { src: 'http://example.com/image.jpg'},
        { src: 'http://example.com/image2.jpg'},
        { src: 'http://example.com/image3.jpg'}
      ]
    };
  },
  methods: {
    showLightbox(index) {
      this.$refs.lightbox.showImage(index);
    }
  }
};
</script>
```
this.$refs.lightbox.showImage()ギャラリーを表示させるメソッドです。他にも、nextImage()、previousImage()と言ったメソッドもあります。
	
また、自動再生やキャプション表示などのオプションの指定も可能です。
例えば下記のような感じです。

```vue
<LightBox ref="lightbox" :images="images" :show-light-box="false" :show-thumbs="false">
</LightBox>
```
詳しいメソッドやオプションの種類は下記に掲載されています。

【[vue-image-lightbox](https://github.com/pexea12/vue-image-lightbox?ref=kabanoki.net)】


##最後に
今回はvue.jsで簡単に画像ギャラリーを実装できる【vue-image-lightbox】を使ってみました。
ちょうどポートフォリオサイトをNuxt.jsで作っており、作品の紹介などで画像ギャラリーを実装したかったので・・・
オプションも豊富なので、かなり使いやすいです。
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/56a13770-7c6d-2713-23e6-e9832ba8a7b4.gif)
Nuxt質問所、aLizサークルを開設しました！！

この度noteサークルを開設しました✨👏
**皆様の質問の、ぜ〜んぶに答えます！！！🔍**

**🎈こんな方にオススメです♪**
・質問できるコミュニティがない…
・ググってみたけど分からない…
・やってみたもののエラーで動かない…
・初学者同士のコミュニケーションを取りたい！
・付け焼き刃の知識ではなく論理的に理解したい！

**🎈参加リンク**
aLiz CLUB
https://note.com/aliz/circle

**🎈以下サークルの詳細です！**
・Nuxtをメインとしたサービス
・Nuxt初心者のサポートが中心
・これからプログラミング始めようとしている方でも参加OK
・質問したり、ディスカッションをするのがメイン

**🎈aLizのポートフォリオ はこちら**
https://note.com/aliz/n/nf1d2b5e16bc1#SsL5X

**🎈入りたい！**
参加していただいた方を
**aLizのSlackにご招待させていただきます。**
noteサークル内の掲示板では
対応しておりませんのでご注意ください。
今後は、「Nuxt案件を受けたけど不安😭」
そんな方のガッツリサポート版も作る予定です！
お楽しみに♪

**🎈サークルに入れないという方はこちら！**
まずnote IDを作る必要があるので
そちらの手順を細かく解説してくれています。
https://note.com/kanoyuri/n/n97c0f4191bb5

**皆様のご参加
お待ちしております🌟🤗**