OmniAICreator/Qiita-1.07M huggingface dataset:
AnsibleでのLinux への初回の接続について

#1.AnsibleでのLinuxへの初回の接続

AnsibleはLinuxに対してSSHを使用して接続します。
TelaTerm等でSSHを使ってLinuxに初めて接続するとき、known_hostの保存を要求されます。
AnsibleもSSHを使用しているため、同じように初回のLinux接続時にknown_hostの保存を要求されます。

Ansibleで設定処理の時に新規サーバに対してknown_hostsを取得すればよいのですが、
初回の接続を先に済ませておき、設定作業をするサーバは接続先に間違いがないことを確認しておいたほうが
設定先の間違いがないといった自動化作業の信頼性向上のためにも良いと思います。

例えば、以下の判断材料になります。

- know_hostsの受け入れが確認されたら接続先の設定が間違っていると無条件に判断できる。
- サーバーの再インストールなどがされ、hostkeyが変わってしまった。
　（このまま自動設定の対象にしてよいか確認が必要となる場合がある）


#2.個別のLinuxのknown_host取得方法
　　SSH接続初回

- sshコマンドで事前にLinuxに接続する。
<BR>下記ようにSSHコマンドでLinuxに接続し、known_hostを取得します。

```text
[root@ansible ~]# ssh ホスト名
The authenticity of host 'ホスト名 (IPアドレス)' can't be established.
ECDSA key fingerprint is SHA256:9Slq4b+8j/2GARik07fPMb9mXqV7A+Z86tVO++wX3vw.
ECDSA key fingerprint is MD5:15:60:7c:73:66:4a:16:fc:a9:90:bb:c9:3e:ba:c9:70.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.150' (ECDSA) to the list of known hosts.
root@192.168.1.150's password: 
Last login: Sat Mar 21 21:42:17 2020
```

- Ansibleコマンドで接続して取得する。
    - ansible ホスト名 -m ping -i konon_host取得用インベントリファイル

```text
[root@ansible2 ansible]# ansible ホスト名 -m ping -i インベントリファイル名　
The authenticity of host 'ホスト名 (IPアドレス)' can't be established.
ECDSA key fingerprint is SHA256:9Slq4b+8j/2GARik07fPMb9mXqV7A+Z86tVO++wX3vw.
ECDSA key fingerprint is MD5:15:60:7c:73:66:4a:16:fc:a9:90:bb:c9:3e:ba:c9:70.
Are you sure you want to continue connecting (yes/no)? yes
IPアドレス | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: Warning: Permanently added 'IPアドレス' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", 
    "unreachable": true
}
````

※"msg": "Failed to connect to　～ とエラーが出ていますが、問題なくknown_hostが取得できています。~/.ssh/kwonw_hostsを確認してください。


#3.一括でknown_hostを取得する便利な方法

初めて接続するLinuxが複数あった場合、1つ1つのサーバに対してhostkeyを取得するのは手間がかかる作業です。
Ansibleでサーバ構築、設定の自動化により省力化を行いたいのに、100台の新規Linuxサーバのhostkey取得作業を
行うと大変手間がかかります。
そこで、以下のように環境変数を指定することで一気にknown_hostを取得して省力化が図れます。

- 環境変数 ANSIBLE_HOST_KEY_CHECKING　に、値　false を設定する。
- ansible コマンドでpingを実行する。この時、known_hostを取得する対象を定義した専用のインベントリファイルを作成し、すべてのインベントリファイルを取得する。
- 環境変数 ANSIBLE_HOST_KEY_CHECKING を削除する。

```text
[root@ansible ansible]# export ANSIBLE_HOST_KEY_CHECKING=false
[root@ansible ansible]# ansible ALL -m ping -i host_first
IPアドレス | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: Warning: Permanently added 'IPアドレス' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", 
    "unreachable": true
}
・
・
・
[root@ansible ansible]# unset ANSIBLE_HOST_KEY_CHECKING
```

※ANSIBLE_HOST_KEY_CHECKING=false により、ansibleコマンドがユーザーの確認要求なしにhost_keyを受け入れます。
　(~|/.ssh/known_hostsにキーが追加されます）
※ansible.cfgというansibleの環境設定ファイルで host_key_checkin = false と設定する方法をとっている方も
　おられますが、ansible.cfgの設定を戻し忘れると以降も無条件にknown_hostを受け入れ、接続対象が
　再構築されたり別のホストに転用された場合に検知できなくなるため、個人的にはあまりお勧めしません。
　また、サーバー追加のたびにansible.cfgを編集するとことになりますので、設定ミスの可能性を
　増やすことにもなりますので、ansible.cfgの変更はなるべく避けたほうが良いと思います。
LoadError, Unable to autoload constant ~

#本記事投稿のいきさつ
railsでアプリ作成をしていたところLoadErrorが発生し基礎知識がなかったためにハマってしまいました。
無事解決する事ができましたが忘れないように、書き残します。
また、同じエラーで困っている初心者のためになれば幸いです。

##エラー発生
itemモデルとitem_imageモデルでアソシエーションを組み,以下の記述をしたところエラーが発生

````items_controller.rb
  def new
    @item = Item.new
    @item_images = Item_image.new
  end
````

エラー表示は以下です。

````
LoadError in ItemsController#new
````

````
Unable to autoload constant Item_image, expected *****/models/item_image.rb to define it
````

##解決まで
なるほど。アソシエーションの記入を間違えたのか。
と初学者の自分は考えitem_image.rbを確認します。
item_image.rbの記述は以下です。

````item_image.rb
class ItemImage < ApplicationRecord
  belongs_to :item
end
````
あれ？ちゃんと書けている。
と初学者の自分は思いました。自分の仮説が外れたので、Google先生に聞いてみました。

#解決
Googleで調べたところどうやら
#####モデル名にアンダーバーを使ってもクラス名にアンダーバーはつかないとのことです。
ということでitems_controller.rbを編集。

````items_controller.rb
  def new
    @item = Item.new
    @item_images = ItemImage.new
  end
````

無事解決することができました。
とても基本的なことですが、今までモデル名にアンダーバーを使っていなかったため、気づくこと出来なかった自分にとってはいい経験になりました。

#おわり
最後まで見ていただき、ありがとうございました。
PHPの時間関連の関数について

PHPの時刻関連の処理でわからないことがあったので調べた。

## date関数
ローカルの日付・時間を書式化する。

指定された引数(timestamp)を与えられた文字列によってフォーマットし、日付文字列を返す。
タイムスタンプが与えられない場合は、現在の時刻が利用される。タイムスタンプのデフォルト値は現在のUnixタイムスタンプを返すtime関数となっている。

### 説明
```php
date ( string $format [, int $timestamp = time() ] )
```

#### 引数
##### format
一つ目の引数である`format`で出力される文字列の書式を決定する。
##### timestamp
Unixタイムスタンプを渡す。

#### 返り値
日付を表す文字列が返される。timestampに数字以外が使用された場合は、FALSEが返される。

### 利用例

```php
echo date("m.d.y"); // 3.21.20

echo date("H:i:s");  // 12:40:22

echo date("F j, Y, g:i a");  // March 21, 2020, 12:40 pm

echo date("l"); // Saturday

echo date('l \t\h\e jS'); // Saturday the 21st

```
## mktime関数
日付をUnixタイムスタンプとして取得する。

### 説明
```php
mktime ([ int $hour = date("H") [, int $minute = date("i") [, int $second = date("s") [, int $month = date("n") [, int $day = date("j") [, int $year = date("Y") [, int $is_dst = -1 ]]]]]]] )
```

#### 引数
##### hour
時刻。負の値の場合は、その日の0時から遡った時刻となる。

##### minute
分。負の値の場合は、その前の時刻が表される。59より大きい場合はその次の時刻以降が表される。

##### second
秒。

##### month
月。

##### day
日数。

##### year
年。

##### is_dat
このパラメータはサマータイム (DST) の時に1にセットされ、 そうでない時に0、サマータイムであるかどうかが不明である場合に-1 にセットされる。

#### 返り値
Unixタイムスタンプが返される。

### 利用例
```php
echo mktime(0, 0, 0, 3, 0, 2000); // 95178240
```

## time関数
現在の Unix タイムスタンプを返す。マイクロ秒の単位まで返したいときには、`microtime()`を利用する。

### 利用例
```php
echo time(); // 1584796017

$now = time();
echo date("F j, Y, g:i a", $now); // March 21, 2020, 1:08 pm
```


## getdate関数
日付/時刻情報を取得する

### 説明
```php
getdate ([ int $timestamp = time() ] )
```

#### 引数
##### timestamp
timestamp が指定されなかった場合のデフォルト値は、 現在の時刻

#### 返り値
timestamp に関連する情報を連想配列で返す。

#### 利用例
```php
$today = getdate();
print_r($today);

<!--出力
Array
(
    [seconds] => 27
    [minutes] => 25
    [hours] => 13
    [mday] => 21
    [wday] => 6
    [mon] => 3
    [year] => 2020
    [yday] => 80
    [weekday] => Saturday
    [month] => March
    [0] => 1584797127
)-->
```
blocklyでobjectを動かす。 その12

0
#概要

blocklyでobjectを動かして見る。
youtube、やってみた。

#写真

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/47a0bc66-1933-7cdd-c09f-d8720ea4923d.png)


#ステージを作る。


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

#ブロックを書く。


```
Blockly.Blocks.tube = {
	init: function() {
		this.jsonInit({
			message0: "tube %1",
			args0: [{
				type: "input_value",
				name: "TEXT"
			}],
			previousStatement: null,
			nextStatement: null,
			style: "text_blocks",
			tooltip: Blockly.Msg.TEXT_PRINT_TOOLTIP,
			helpUrl: Blockly.Msg.TEXT_PRINT_HELPURL
		})
	}
};
```

#フローを書く。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/410b34a1-7f35-920a-6533-669d163ea5be.png)


#objectを書く。


```
Blockly.JavaScript.tube = function(a) {
    return "tube(" + (Blockly.JavaScript.valueToCode(a, "TEXT", Blockly.JavaScript.ORDER_NONE) || "''") + ");\n"
};
var out = document.getElementById("outp");

function tube(src) {
	out.innerHTML = '<iframe width="240" height="200" src="https://www.youtube.com/embed/' + src + '" frameborder="0"></iframe>';
}

```

#成果物

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


以上。
【Rails】Nil location provided. Can't build URI.の対処法

こんなエラー文が表示されました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568461/eb0714cc-cf1f-560c-11f3-8c863f0b54ba.png)




こちらを参考に解決しました。
https://simpledancer.hatenablog.com/entry/2019/05/19/Nil_location_provided__Can't_build_URI%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E5%87%BA%E3%81%9F%E6%99%82%E3%81%AB%E3%82%84%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8

投稿したデータを全て削除すれば良いらしいです。


とりあえずターミナルでコンソールに入ります。

```
$ rails c
```



私の場合モデル名はGymのため、

```
>> Gym.all
```

をしたところ、次のように表示されました。

```
=> #<ActiveRecord::Relation [#<Gym id: 3, name: "ゴールドジム", content: "良い", user_id: 1, created_at: "2020-03-20 03:37:09", updated_at: "2020-03-20 03:37:09", picture: nil>, #<Gym id: 4, name: "ゴールドジム", content: "あああ", user_id: 1, created_at: "2020-03-20 04:22:44", updated_at: "2020-03-20 04:22:44", picture: nil>, #<Gym id: 5, name: "ああ", content: "ああ", user_id: 1, created_at: "2020-03-21 12:40:34", updated_at: "2020-03-21 12:40:34", picture: "スクリーンショット_2020-03-20_23.57.2657.png">]>
```

pictureカラムのnilが悪さをしてますので、削除します。

```
Gym.where(id:1..5).destroy_all;
```


これで、エラー部分が動くようになりました。
Herokuのログをリアルタイムで確認する方法

どうも、Shota(@Mii4a_Shota )です
Herokuのログをリアルタイムで確認したいと思ったので備忘録で書き記しておきます。

<h3>確認方法</h3>

Herokuのログをリアルタイムで確認したい場合、

```
heroku logs --tail
```
あるいは、--tailの短縮で

```
heroku logs -t
```

と打ち込めばリアルタイムでHerokuのログを見ることができるようです。
ダックタイピング

# ダックタイピングとは
> もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルに違いない

(wikipediaより)

```ruby:Rubyの例
 def test(foo)
   puts foo.sound
 end
 
 class Duck
   def sound
     'quack'
   end
 end
 
 class Cat
   def sound
     'myaa'
   end
 end

test(Duck.new)
test(Cat.new)
``` 

```:出力結果
quack
myaa
```
wikipedia読んでもだからなんなのというか、なんにも特別なことをしているように感じなかったのですが、調べるとどうやらそうではないことに気づきました。

# 型を意識しなくて良い
[Javaと比較しているサイト](https://blog.mmmcorp.co.jp/blog/2018/10/26/go-duck-typing/)があり、そのコード例によりメリットが理解できました。

```ruby:ruby
def test(foo)
  puts foo.sound
end

```

```java:java
void test(Duck foo) {
   foo.sound();
}
```
> もしもそのオブジェクトが Duckオブジェクト のように Walk()メソッド を呼び出すことができ、Duckオブジェクトのように Sound()メソッド を呼び出すことができるのなら、それは Duckオブジェクト として扱える。

私はpythonを主に使うので、型に対して意識することがほぼありません。rubyも同じでしょう。

しかし、Javaは違います。上記のコードでは、testは受け取るDuckの型を予め指定しています。これにより、型がなんであれ、振る舞いが同じならそれは問題ないという処理ができないわけです。

> 「引数 foo がどのようなオブジェクトであれ、 sound メソッドを呼び出せれば良い」と割り切っていることが、ダックタイピングです。

なるほどと思いました。
Rustは静的型付け言語ですが、トレイトという機能を使うことによりダックタイピングに似たコーディングができます。



# 参考文献
https://ja.wikipedia.org/wiki/ダック・タイピング
https://blog.mmmcorp.co.jp/blog/2018/10/26/go-duck-typing/
BRICKモデルについて

# BRICKの定義
Building関連の統一メタデータのスキーマ
建物内の物理的、論理的な資産の意味モデル。それらをEntityで表現し、Entity間のRelationshipなども含めて標準化するオープンソース。

# 動機
Buildingデータを管理することは以下の3つの理由から非常に困難である。
##### ①個々のBuildingデータは、プロジェクトを担当したエンジニアによって設計が異なり、それに依存しているためである。
##### ②Buildindシステムは長期間動き続け、建物自体の用途が変わるたびにシステムも変更する必要がある。
##### ③Buildingデータの種類が建物ごとに異なり、異なるシステムとアプリがサイロでできてしまう。

# BRICKとは
BRICKスキーマはセマンティックWeb分野で発達した。
※セマンティックWeb=Webサイトが持つ意味をコンピュータに理解させて、人を介在させず、コンピュータ同士で処理を行わせる技術のこと。

RDFやOWL、オントロジー言語を用いて設計されていた。

OWLによって定義されたEntityとEntity間のRelationship(OWLによって定義された)によって柔軟に定義できるようにというコンセプトで作られた。




# メリット
##### BRICKモデルによりビルディングシステムを構築することにより、エネルギー効率の測定やインテリジェント制御などを展開するコストを削減できる。

##### BRICKモデルにより、HVAC、照明、セキュリティなど近代的な建物の多数のサブシステムについて、複数のベンダーも考慮したモデルを表現することができる

##### BRICKは、スマートビルディングの分析および制御アプリケーションの開発を簡素化する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159589/5cd780ed-8e1c-d67d-de59-886403a80ee9.png)

##### BRICKのセマンティックWeb(RDF)基盤は、スキーマとデータの両方に対してクエリ呼び出しが可能で、標準のRDF/OWLツールやSPARRQLなども利用し、相互運用性の向上が見込める。


# モデルの構造

Equipment、Point、Location、Resourceの４つに大別される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159589/0cc01fbc-f1c1-58fe-15a8-f4ba66e3df5c.png)

上の図のような関係性でEntityとEntity間のRelationshipが成り立つ。

#### Equipment
建物内の設備を表す。
HVACやそれらを構成するものなど。

#### POINT
制御するものやセンサーを表す。

#### LOCATION
フロアー、部屋などの場所を特定するもの。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159589/f54fbf66-aaa9-98cd-9da5-8a57978b243c.png)


### ノード
- ビルディングの設備
- サブシステム

### エッジ=Relationship
- 場所
- 制御
- 関連性

だったりする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159589/e34a1c34-45f6-a00d-275f-99381d7dc672.png)

# 参考文献

- https://www.memoori.com/wp-content/uploads/2016/06/Brick_Schema_Whitepaper.pdf
- https://brickschema.org/assets/files/acm-e-energy-2019-portable-brick.67b0971b50acab32634c1edc61807ede.pdf
チーム開発 3/21

3/21
#メモになります
最終課題　四日目
トップページが終わったので
商品詳細ページのビューを作っていきます

ブロックの形を丸くしたい
border-radius
で解決

ボタンを押すと引っ込んだりする
立体的な動きをするようにしたい
:active
を使って擬似要素を使っていく
プラスα
border-bottom: solid 5px #25b8bd;
を使うとボーダーの色を変えて影っぽくして
擬似要素に
border-bottom: none;
を使って押すとボーダーをなくしてボタンを押したようにできる

表っぽく作りたい
border
を使うと解決

ページのソースを表示するためのショートカットキー
「option + command + U」

%li.optionalBtn
 　%a{:href => "#"}
       %i.fa.fa-flag
                   不適切な商品の通報
このコードを=>使わずに使いたい

%li.optionalBtn
 =link_to "#" do
  %i.fa.fa-flag 不適切な商品の通報
これで解決
https://pikawaka.com/rails/link_to
参考したサイト

	%form#new_comment.new_comment{"accept-charset" => "UTF-8", :action => "#", :method => "post"}
	%input{:name => "utf8", :type => "hidden", :value => "✓"}/
	%input{:name => "authenticity_token", :type => "hidden", :value => "UZaji94lj/rTfLW3DcSaCXs2HPv6Ic+zHxCyGaZhfKQcIpGKWGwWxX9gCQcYcZ2SdCqU5NyBOUL3tc3504qWYA=="}/
 	%textarea#comment_body{:name => "comment[body]", :required => "required"}
	 %p.noticeMsg
 		相手のことを考え丁寧なコメントを心がけましょう。
		%br/
		不快な言葉遣いなどは利用制限や退会処分となることがあります。
	%br/
	%button.commentBtn-show{:name => "button", :type => "submit"}
	 	%i.fa.fa-comment
	 	コメントする

この文も直したい
accept-charset属性
form要素のaccept-charset属性は、文字エンコーディングを指定する属性。ほとんどの場合、
サーバーの自動判定に任せておけば問題ないが、文字化けする場合には試してみるとよい。

		%ul.commentContents
             	 %form#new_comment.new_comment{ action: "#",method: "post"}
                %input{name: "utf8", type: "hidden", value: "✓"}/
                %input{name:  "authenticity_token", type: "hidden", value: "UZaji94lj/rTfLW3DcSaCXs2HPv6Ic+zHxCyGaZhfKQcIpGKWGwWxX9gCQcYcZ2SdCqU5NyBOUL3tc3504qWYA=="}
                %textarea#comment_body{name: "comment[body]", required: "required"}
                %p.noticeMsg
                  相手のことを考え丁寧なコメントを心がけましょう。
                  %br/
                  不快な言葉遣いなどは利用制限や退会処分となることがあります。
                %br/
                %button.commentBtn-show{name: "button", type: "submit"}
                  %i.fa.fa-comment
                  コメントする

このコードで解決
とりあえず商品詳細ページが完成！

この後は少し個人アプリをやっていく

改めて個人アプリを見てみると
ビューもサーバーサイトもめちゃくちゃ

データベースから考え直していこうと思う
ER図から考え直す
中間テーブルには
- has_many  :messages,  through:  :messages_tags
と言ったthroughを使って関連づける

使いたい機能を改めて考える
・検索機能
タグとキーワード別に検索を使いたい
キーワードはtextのキーワードにする
・タグ機能
検索しやすくする
・ログイン機能
・いいね機能
わかりやすく纏まっている物をみんなで共有したいため
・ランキング機能
いいねの数が多いほど上位になる
検索で結果を出す時並びはランキングを使いたいなぁ

アプリの概要としては
トップページでいいねのランキングを表示
新規でtextを書くところのページ
検索結果のページ
自分の作った暗記カードを見るところ

のところまで実装したい
付け足したい機能としては
・タイムライン機能
・気に入った人の暗記カードをストックする
みたいなをしてみたいなぁ

アプリのイメージは
Qiitaのタイトルが単語、内容がその意味で
みんなでいい解説している物を共有する物
そしてそれを単語帳みたいに使えるようにしたい



ER図形は作れていたので次の段階
ビューを見ていく
かなり崩れていたり簡素に仕上がっていたので手直しをしていく
ルートを作った後は
rails g controller messages index
boost にある様々な整列アルゴリズム

# これは何？

boost には整列アルゴリズムがたくさんある。

* [spreadsort]( https://www.boost.org/doc/libs/1_72_0/libs/sort/doc/html/sort/single_thread/spreadsort/sort_hpp.html )
* [pdqsort]( https://www.boost.org/doc/libs/1_72_0/libs/sort/doc/html/sort/single_thread/pdqsort.html )
* [spinsort]( https://www.boost.org/doc/libs/1_72_0/libs/sort/doc/html/sort/single_thread/spinsort.html )
* [flat_stable_sort]( https://www.boost.org/doc/libs/1_72_0/libs/sort/doc/html/sort/single_thread/flat_stable_sort.html )

で。上記に `std::sort` と `std::stable_sort` を加えて、100万件の整列に要する時間を測ってみた。

# 整列されるデータ

整列されるデータは、以下の5種類

|名前|特徴|
|:--|:--|
|random|$0 〜 2^{30}$ の値をランダムに入れたもの|
|sorted|0 〜 999999 を順に入れたもの。整列済み|
|almost_sorted|整列済みのデータをつくってから 100回ぐらいランダムに swap したもの|
|reverse|100万 〜 1 を順に入れたもの。逆順|
|few_types|$0 〜 8$ の値をランダムに入れたもの|

コンパイラは g++-9 と clang++。
マシンは MacBook Pro。

# 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6854/8a063bfc-994d-ff58-a552-84f03e601752.png)

## 感想

意外と g++-9 と clang++ で結果が違う。

入力としては `random` と `few_types` がありがちと思うんだけどどうだろう。
boost の `pdqsort` は、この2種類の入力で、g++-9 と clang++ の両者で良い成績を収めている。好印象。

安定ソートでは、 `std::stable_sort` vs boost の `flat_stable_sort` なわけだけど、拮抗している感じなのでわざわざ boost 使うほどじゃないかなという印象。

## 結論

速度が重要で、 boost を使って良い感じなら `std::sort` の代わりに boost の `pdqsort` を試してみる価値は大いにあると思う。

とはいえ。本気で急いでいるならマルチスレッドなソートを試したいところかもね。
Railsアプリを git-flow で管理する

# はじめに

就活用のポートフォリオをGitで管理する際、これまでは全ての作業を同じブランチで行なっていました。
しかし今後現場に入ってチームで開発する際には、issueごとにブランチを切ってそれぞれで作業するということもあると思います。
そうした状況に今から慣れておくために、ポートフォリオを作成する過程のGit管理に、git-flowを活用することにしました。

# issueを作成する
まずはこれから追加したい機能などの内容を記述したissueを作成します。

<img width="1680" alt="スクリーンショット 2020-03-21 18.29.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602172/551d3deb-c1ed-f23c-9de7-a316e7228dd8.png">

# 対象リポジトリに移動する
ターミナル上で対象のリポジトリに移動します。

```
$ cd myapp #自分のアプリの名前 
```

# git-flowをインストールする
ターミナルで下記コマンドを打ち込み、git-flowをインストールします。

```
$ brew install git-flow
```

# ブランチ「develop」を作成

「git checkout」は、gitのブランチを切り替えたい時に使います。

```
$ git checkout master
Already on 'master'
```

で、masterブランチに合わせた上で、

```
$ git branch develop
```

新しいブランチ「develop」を作成します。

# git-flowを導入する
対象のリポジトリに git-flow を導入します！

```
$ git flow init
Which branch should be used for bringing forth production releases?
   - develop
   - master
   - socialization
Branch name for production releases: [master] 

Which branch should be used for integration of the "next release"?
   - develop
   - socialization
Branch name for "next release" development: [develop] 

How to name your supporting branch prefixes?
Feature branches? [feature/] 
Release branches? [release/] 
Hotfix branches? [hotfix/] 
Support branches? [support/] 
Version tag prefix? [] 
```

いろいろ項目を聞かれますが、デフォルトの設定で良いので、Enterを押していきます。

# 「feature」ブランチに切り替える

git-flow には５つのブランチの概念があり、先ほど作成した「develop」は開発用。
そして下記で作成する「feature」は、機能実装用のブランチです。
issue番号を指定することで、issueに紐づけることができます。

```
$ git flow feature start <issue番号>
```

具体的には下記のように書きます。

```
$ git flow feature start 14
Switched to a new branch 'feature/14'

Summary of actions:
- A new branch 'feature/14' was created, based on 'develop'
- You are now on branch 'feature/14'

Now, start committing on your feature. When done, use:

     git flow feature finish 14
```

切り替わったかどうか、確認してみます。

```
$ git branch
  develop
* feature/14
  master
```

切り替わっています。
このままではまだローカル環境内で切り替わっているだけなので、「publish」コマンドでGitHubに反映します。

```
$ git flow feature publish 14
Summary of actions:
- A new remote branch 'feature/14' was created
- The local branch 'feature/14' was configured to track the remote branch
- You are now on branch 'feature/14'
```

# コミットする際に「#issue番号」を入れる

コミットメッセージの中に、「#issue番号」を入れることで自動的にコミットが、該当するissueに紐づきます。
issueごとにコミット内容が確認できるため、コミットの差分が視覚的に分かりやすいです。

例です。

```
$ git add .
$ git commit -m "SpecialBookモデルを追加 #14"
```

<img width="1680" alt="スクリーンショット 2020-03-21 18.30.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602172/59183c8b-3426-9985-b788-f1d90b706d7e.png">

# GitHubの管理画面で、Pull Requestを送信する

該当のブランチからPull Requestを送信します。

<img width="1680" alt="スクリーンショット 2020-03-21 18.37.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602172/27ea1c88-6058-f98f-5d56-53dd0bf41332.png">

# 内容を確認し、Pull Requestをマージする

変更内容を確認し問題がなければ、コミット内容をマージします。

<img width="1680" alt="スクリーンショット 2020-03-21 18.40.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602172/453feabb-6c39-3ac7-e13b-a02523109220.png">

以上です。
今後も現場の開発を意識した学習を進めていきます。
製薬企業研究者がGitの基本についてまとめてみた

# はじめに

Gitは共同開発で使われるバージョン管理ツールです。
ファイルの変更履歴を管理することができます。
ここでは、Gitの基本に絞って解説します。

# Gitの初期化

Gitを使うときは最初に準備として以下のコマンドを実行します。

```bash
$ git init
```

これにより新たにGitリポジトリが作成されます。


# リモートの登録

これからファイルをアップロードするリモートの場所を登録するには以下のコマンドを実行します。
リモート名としては、`origin`を使うことが多いです。

```bash
$ git remote add リモート名 リモートのURL
```

# ファイルの選択

アップロードするファイルを選択するには、以下のコマンドを実行します。

```bash
$ git add ファイル名
```


# コミット

選択したファイルをコミットするには、以下のコマンドを実行します。

```bash
$ git commit -m "コミットメッセージ"
```



# リモートへのファイルのアップロード

コミットしたファイルをアップロード（プッシュ）するには、以下のコマンドを実行します。
ブランチ名は、`master`とすることが多いです。

```bash
$ git push リモート名 ブランチ名
```


# リモートからのファイルのダウンロード

リモートからファイルをダウンロード（プル）するには、以下のコマンドを実行します。

```bash
$ git pull リモート名 ブランチ名
```

# 変更の確認方法

追加されたファイルや、変更が加えられたファイルを確認するには、以下のコマンドを実行します。

```bash
$ git status
```

変更内容の詳細を確認するには、以下のコマンドを実行します。

```bash
$ git diff
```

# コミット履歴の確認方法

コミットの履歴や、コミットメッセージを確認するには、以下のコマンドを実行します。

```bash
$ git log
```


# まとめ

ここでは、Gitの基本的な使用方法について解説しました。
共同開発だけでなく、個人でファイルの変更履歴を把握するときにも使えます。
docker-compose buildでYou must use Bundler 2 or greater with this lockfile.とエラーが出た話


##経緯

「既存の作成済のrailsアプリケーションにDockerを導入してみたい！！でも、いきなり導入していろいろ変なことになったら嫌だな」ということで、[Railsチュートリアルの開発環境をDockerにしてみなイカ？](https://qiita.com/Moo_Moo_Farm/items/0d08da27371272ed1390)という記事を参考にさせていただき、まずはrailsチュートリアルをdockerにのせようと、奮闘している最中、

```console
You must use Bundler 2 or greater with this lockfile.
ERROR: Service 'app' failed to build: The command '/bin/sh -c bundle install --jobs=4' returned a non-zero code: 20

```

というエラーが。。

##解決した方法

```console
You must use Bundler 2 or greater with this lockfile.
```
これは、Bundlerのバージョンが2以上を使わなければならなかったのに、Dockerのimageで1.X.Xを利用していたことが原因だったみたいです。

確かに、Gemfile.lockを見ると、一番最後の行に、BUNDLED WITH　2.1.4の記載が。。。

そこで、docker-compose buildした際に、bundlerをinstallすれば問題ないと知り、
**Dockerfile**にて

```
~~~略~~~
RUN  bundle install 
```

としていたところを


```

~~~略~~~
RUN gem install bundler && bundle install 
```

のように、bundlerをインストールすることで解決しました！！
量子統計2 (テンソル積とエンタングルと量子チャネル)

今回はテンソル積と複合系とエンタングルと通信路の Choi 行列表現， operator sum 表現 , Steinspring 表現．
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">量子統計2. 今回はテンソル積と複合系とエンタングルと通信路の Choi 行列表現， operator sum 表現 , Steinspring 表現．<a href="https://twitter.com/hashtag/%E6%95%B0%E5%AD%A6?src=hash&amp;ref_src=twsrc%5Etfw">#数学</a> <a href="https://twitter.com/hashtag/%E9%87%8F%E5%AD%90%E6%83%85%E5%A0%B1?src=hash&amp;ref_src=twsrc%5Etfw">#量子情報</a> <a href="https://twitter.com/hashtag/%E3%82%A8%E3%83%B3%E3%82%BF%E3%83%B3%E3%82%B0%E3%83%AB?src=hash&amp;ref_src=twsrc%5Etfw">#エンタングル</a> <a href="https://twitter.com/hashtag/%E9%87%8F%E5%AD%90channel?src=hash&amp;ref_src=twsrc%5Etfw">#量子channel</a><a href="https://t.co/bUHcqgwt9D">https://t.co/bUHcqgwt9D</a></p>&mdash; Yamagata (@YamagataTwit) <a href="https://twitter.com/YamagataTwit/status/1241333488030109697?ref_src=twsrc%5Etfw">March 21, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
AWSでDjangoサーバーを立ててみる

Python3、djangoのインストール
以下の場合、/usr/local/bin/にインストールされるのでパスを通しておく。

```
インストール
yum install python3
python3 -m pip install Django
python3 -m django --version

プロジェクト作成
/usr/local/bin/
django-admin startproject mysite

アプリケーション作成
python manage.py startapp polls
```
[Djangoのチュートリアル](https://docs.djangoproject.com/ja/3.0/intro/tutorial01/)通りに進めると「python manage.py runserver」でSQLiteを使用していてもバージョンエラーが発生するのでバージョンを上げる。

SQLiteのバージョンアップ
[https://www.sqlite.org/download.html](https://www.sqlite.org/download.html)

```
パッケージの取得
yum install wget tar gzip gcc make
wget https://www.sqlite.org/2020/sqlite-autoconf-3310100.tar.gz

インストール
tar xvfz sqlite-autoconf-3310100.tar.gz
cd sqlite-autoconf-3310100/
./configure --prefix=/usr/local
make
make install

新バージョンへのシンボリックリンクの作成
mv /usr/bin/sqlite3 /usr/bin/sqlite3_old
ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3

共有ライブラリへパスを通す
vi ~/.bashrc
export LD_LIBRARY_PATH="/usr/local/lib"
source .bashrc
```

サーバー起動
DEBUGモード時はALLOWED_HOSTSの設定が必要になる

```python:settings.py
DEBUG = True
ALLOWED_HOSTS = ["www.example.com"]
```

```
python manage.py migrate

ローカルで起動
python3 manage.py runserver
グローバルで起動
python3 manage.py runserver 0:80
```
代入演算子は*thisへの参照を戻すようにしよう - Effective C++ 第3版 10項-

#　はじめに

Effective C++ 第3版の10項 48ページから勉強していきます。
今回は、「代入演算子は*thisへの参照を戻すようにしよう」についです。

# Effective C++ 第3版 - 10項　代入演算子は*thisへの参照を戻すようにしよう -

## 前置き

今回は、「自分で作成したクラスにコピー代入演算子を実装する場合のルール」について学んでいきます。

## 今回の勉強

### コピー代入演算子

コピー代入演算子は、以下のようにつなげて使用することができます。

```cpp
int x, y, z;
x = y = z = 15; // 代入をつなげる
```

コピー代入演算子は、右結合である。
　→右から左へ結合していく
そのため、上のような連続代入は、以下のように解釈されます。
まず、15がzに代入され、
次に、その結果(更新されたz)がyに代入され、
最後に、その結果（更新されたy)がxに代入される。

```cpp
x = (y = (z = 15));
```

これは、コピー代入演算子が「左辺への参照」を戻すことで実現されています。

自分で作成したクラスにコピー代入演算子を実装する場合は、以下のようになります。

```cpp
class Widget {
 public:
  /* コンストラクタ */
  Widget(int x, int y) : x_(x), y_(y) {}

  /* コピー代入演算子 */
  Widget& operator=(const Widget& rhs) { // 戻り値の方は、自身のクラスの参照型
    x_ = rhs.x_;
    y_ = rhs.y_;
    return *this; // 左辺への参照を返す(自分自身を返す)
  }

  int getX() { return x_; }
  int getY() { return y_; }

 private:
  int x_;
  int y_;
};
```

また、通常の代入(=)に限らず、全ての代入演算子(+=, -= など)に上のように書く必要があります。
また、仮引数の型が違っても、同様に *this を返す必要があります。

```cpp
class Widget {
 public:
  ...

  Widget& operator+=(const Widget& rhs) { // +=, -=, *= でも*thisを返す。
    std::cout << __func__ << std::endl;
    x_ += rhs.x_;
    y_ += rhs.y_;
    return *this;
  }
  
  /* 引数がint型 */
  Widget& operator*=(int rhs) { // 引数の型が違う場合でも *thisを返す。
    std::cout << __func__ << std::endl;
    x_ *= rhs;
    y_ *= rhs;
    return *this;
  }

 private:
  ...

};

```

これらのように、「コピー代入演算子は、*thisへの参照を戻す」というのは、
すべての組み込み型とすべての標準ライブラリの型(string, vector, など）が従っているそうです。

## サンプルコード

以下に、勉強で使用したコードを示します。

```cpp
#include <iostream>

class Widget {
 public:
  Widget(int x = 0, int y = 0) : x_(x), y_(y) {}
  Widget& operator=(const Widget& rhs) {
    std::cout << __func__ << std::endl;
    x_ = rhs.x_;
    y_ = rhs.y_;
    return *this;
  }
  Widget& operator+=(const Widget& rhs) {
    std::cout << __func__ << std::endl;
    x_ += rhs.x_;
    y_ += rhs.y_;
    return *this;
  }

  Widget& operator*=(int rhs) {
    std::cout << __func__ << std::endl;
    x_ *= rhs;
    y_ *= rhs;
    return *this;
  }

  int getX() { return x_; }
  int getY() { return y_; }

 private:
  int x_;
  int y_;
};

int main() {
  std::cout << "10_first.cpp" << std::endl;
  int x, y, z;
  x = y = z = 15;

  Widget b;
  b = Widget(1, 1);
  std::cout << "\noperator= Widget(1, 1)" << std::endl;
  std::cout << "b.x : " << b.getX() << std::endl;
  std::cout << "b.y : " << b.getY() << std::endl;

  b += Widget(2, 2);
  std::cout << "\noperator+= Widget(2, 2)" << std::endl;
  std::cout << "b.x : " << b.getX() << std::endl;
  std::cout << "b.y : " << b.getY() << std::endl;

  b *= 4;
  std::cout << "\noperator*= 4" << std::endl;
  std::cout << "b.x : " << b.getX() << std::endl;
  std::cout << "b.y : " << b.getY() << std::endl;
}
```

## 実行結果

```:実行結果
10_qiita.cpp

operator= Widget(1, 1)
b.x : 1
b.y : 1

operator+= Widget(2, 2)
b.x : 3
b.y : 3

operator*= 4
b.x : 12
b.y : 12
```

## まとめ

今回は、自分で作成したクラスにコピー代入演算子を実装する場合のルールについて学びました。

### 覚えておくこと

- 代入演算子は*thisへの参照を戻すようにしよう。

## 参考文献

[1] https://www.amazon.co.jp/gp/product/4621066099/ref=dbs_a_def_rwt_hsch_vapi_taft_p1_i0
NetworkManagerの使用方法


#NetworkManagerの利用方法

Linuxサーバでネットワーク設定を管理するソフトウェア。
NetworkManagerを利用することで、ファイルの編集等することなくコマンドベースでネットワークを一元管理することができる。
IPアドレスの設定、デフォルトGW、DNS、DHCPの設定など多種多様なことができる。

#オブジェクト
管理コマンドであるnmcliで指定する捜査対象の種別

| オブジェクト名称 | 役割 |
|:--|:--|
| connection | NetworkManagerの接続状況 |
| device | NetworkManagerで管理しているデバイス |
| general | NetworkManagerの全般的な状態と動作 |
| networking | ネットワーク制御に関する全般 |
| radio | NetworkManagerラジオスイッチ |


#使用方法

上記の中で主に使うと考えるものはnetworking,connection,device周り。特にconnectionを元にNICの詳細な設定をカスタマイズしていくことが可能。

###networking/ネットワーク制御に関する全般
```
# ネットワークの有効/無効化状態
nmcli networking

# ネットワークの有効化
nmcli networking on

# ネットワークの有効化
nmcli networking off
```

###device/NetworkManagerで管理しているデバイス

- デバイスとコネクション名は必ずしも一致する必要はない

```
#デバイスの状態
nmcli device status

[root@centos8 ~]# nmcli device status
DEVICE  TYPE      STATE         CONNECTION 
enp0s8  ethernet  connected     eth1       
enp0s9  ethernet  connected     eth2       
enp0s3  ethernet  disconnected  --         
lo      loopback  unmanaged     --         
```

###connection/NetworkManagerの接続状況

- 接続名とデバイス(NIC)の組合せ一覧

```
nmcli connection show

[root@centos8 ~]# nmcli c
NAME  UUID                                  TYPE      DEVICE 
eth1  30421a73-8d4d-3410-8226-66746230a0c5  ethernet  enp0s8 
eth2  93d13955-e9e2-a6bd-df73-12e3c747f122  ethernet  enp0s9 
eth0  332eb1ab-45d0-4950-a671-c511ad189653  ethernet  --    
```

- インターフェイスの起動停止

```
#NIC起動
nmcli connection down eth0

#NIC停止
nmcli connection up eth0
```







###その他

- /etc/resolve.confがNetworkManagerにより更新されることを回避する方法

NetworkManagerの設定ファイル`/etc/NetworkManager/NetworkManager.conf `に以下設定を追加してNetworkManager再起動

```
[main]
dns=none
```
プログラミングについて学ぶ

#AtCorderに挑戦してみた
以前からコードを書く機会が少ないと思っていたので、
AtCorderで問題を解きながらコードを書いていこうと思います

習慣づけるためにQiitaに投稿してみることにしました。
自分が知らなかった知識などについては、記事に書いていこうと思います

##最初に簡単な問題の実装
###文字列と文字の扱い
pythonだと文字列の中の一文字にアクセスしたいときに簡単にできる
下の例では文字列から最初の文字と最後の文字を出力している

```python:sample1.py
str = 'abcdef'

print(str[0])  #a
print(str[-1])  #f
```

##これからやること
AtCoder Grand Contest 043をやってみようと思います。
chrome拡張 "browser_action"と"background"の通信

[chrome 拡張機能でメッセージ送るとき](http://var.blog.jp/archives/52377390.html)
※ "browser_action""background"通信で確認できました
※ "background"から"browser_action"は未確認です

#参考
[Chrome Extension の作り方 (最終話: メッセージパッシング)](https://qiita.com/sakaimo/items/5e41d6b2ad8d7ee04b12)
[Chrome 拡張を使って今開いているタブの DOM を操作する](https://qiita.com/dulltz/items/eada79ee82be34490c2b)
JavaScriptにおけるthisの挙動について

# 対象読者
- JavaScriptのオブジェクトについて理解している初学者
- thisの挙動がいまいちわからないJavaScript初学者

# そもそもJavaScriptにおけるthisって何？
JavaScriptにおけるthisとは、自分自身を表すオブジェクトのことを挿します。重要なポイントは**呼び出し元によって変わる**点です。どういうことか以下に記載していきます。

## グローバルオブジェクトを指すthis
```sayFoo.js
const sayFoo = function () {
  console.log(this["foo"]);
}
foo = "foo";// 予約後であるconst,letをつけない場合はグローバルオブジェクトとして定義される
sayFoo();
```
`sayFoo.js`では、sayFoo()を呼び出した場合、グローバルオブジェクト（`window`オブジェクト）として変数fooを宣言しています。よって、thisの対象はグローバルオブジェクトをさす挙動になっています。
※`this["foo"]`の[]で書く方法は**ブラケット表記法**と呼ばれる書き方です。
[ブラケット表記法](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Property_Accessors)

#インスタンス変数を指すthis①
```sayFooInstance.js
const sayFoo = function () {
  console.log(this["foo"]);
}  
foo = 'foo';
const sayFooInstance = {
  foo: "I'm Instance Object",
  sayFoo
}
sayFooInstance.sayFoo();
```

`sayFooInstance.js`では、sayFooInstanceオブジェクトにて関数`sayFoo`を呼び出しています。`sayFooInstance`内部からの呼び出しなので、`this["foo"]`は`foo: "I'm Instance Object"`を参照しています。

#インスタンス変数を指すthis②
```myObjInstance.js
function MyObj(id) {
  this.id = id;
}
MyObj.prototype.printId = function (id) {
  console.log(this.id);
}
const newMyObj = new MyObj(5);
newMyObj.printId(2);// MyObjでidをthisに入れているため、2ではなく5と表示される
```
実行結果
![スクリーンショット 2020-03-21 20.21.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127391/d40e20bb-3695-e311-885f-3d8c072c5bdf.png)

オブジェクトのプロトタイプに関数を定義して、実行しても、2が表示されず、５が表示されます。
なぜなら、MyObj関数をnewを使ってインスタンス化する際に`this.id　= id`で変数idをMyObj関数に代入しているため、`printId`が実行されても、`this.id`の値に代入されないので、実行結果が5と表示されます。

ちなみに以下の様にClassを使っても同じ形になります。

#インスタンス変数を指すthis③
```myClass.js
class MyClass {
  constructor(id) {
     this.id = id;
  }
  print(id) {
    console.log(this.id);
  }
}
const myClass = new MyClass(5);
myClass.print(3);
```
実行結果
![スクリーンショット 2020-03-21 20.21.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127391/d40e20bb-3695-e311-885f-3d8c072c5bdf.png)

コンストラクターを使ってインスタンス生成時にthis.idの値を代入します。
*インスタンス変数を指すthis②*でご紹介した通り、インスタンス生成時に`this.id`にid値を代入しているため、実行結果は5と表示されます。

クラスについてはMDN Web docに記載があります。
[クラス MDN Web doc](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Classes)

ちなみに、オブジェクト内部で関数を入れ子にした場合はどうなるでしょうか

# インスタンス変数の内部で関数が入れ子になっている場合のthis
```sayFooInstanceNest.js
const nestFunction = {
  nestFunc1: function () {
    console.log(this);// nestFunctionを参照
    const nestFunc2 = function () {
      console.log(this);// グローバルオブジェクトを参照
      const nestFunc3 = function () {
        console.log(this);// グローバルオブジェクトを参照
      }();
    }();
  }
}
nestFunction.nestFunc1();// 実行
```
実行結果は以下の画像の通り。
![スクリーンショット 2020-03-21 19.14.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127391/fb9804de-c677-884b-8fcd-2cead04ac8cb.png)

入れ子にした場合のthisは、グローバルオブジェクトを参照します。

ちなみに以下の形`{}();`と書かれているコードをみて「ん？」と思った人もいると思います。
以下の書き方は**即時実行関数式**と呼ばれ、定義されるとすぐに実行されるJavaScriptの関数となります。

```sokuji.js
const nestFunc3 = function () {
          ・・・中略・・・
}();// <= 波括弧の隣に丸括弧をつけることで、定義されるとすぐに実行される即時実行関数となります。
```
[MDN Web Docs 用語集 IIFE (即時実行関数式)](https://developer.mozilla.org/ja/docs/Glossary/IIFE)

# thisは理解してしまえば、あとは応用が効く
内容に不備があったり、誤字脱字などあれば、コメントをいただければと思います。
Java 14 (OpenJDK: AdoptOpenJDK) を Homebrew で macOS にインストールする

## 今回の環境

- macOS Catalina 10.15.3

## AdoptOpenJDK 14 をインストールする

公式資料を参考にしてインストールする。
[GitHub \- AdoptOpenJDK/homebrew\-openjdk: AdoptOpenJDK HomeBrew Tap](https://github.com/AdoptOpenJDK/homebrew-openjdk)

```
$ brew tap AdoptOpenJDK/openjdk
$ brew cask install adoptopenjdk14
```

## java_home コマンドでインストールされたディレクトリの場所を確認する

```
$ /usr/libexec/java_home -v 14
/Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home
```

## 環境変数 JAVA_HOME と PATH を設定する

必要に応じて ~/.bashrc や ~/.zshrc などに記述する。

```
$ export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home
$ PATH=${JAVA_HOME}/bin:${PATH}
```

## インストールされた AdoptOpenJDK を確認する

```
$ java -version
openjdk version "14" 2020-03-17
OpenJDK Runtime Environment AdoptOpenJDK (build 14+36)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 14+36, mixed mode, sharing)

$ javac -version
javac 14

$ which java
/Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home/bin/java

$ which javac
/Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home/bin/javac

$ ls /Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home/bin/
jaotc		javap		jfr		jmap		jstack		rmiregistry
jar		jcmd		jhsdb		jmod		jstat		serialver
jarsigner	jconsole	jimage		jpackage	jstatd
java		jdb		jinfo		jps		keytool
javac		jdeprscan	jjs		jrunscript	rmic
javadoc		jdeps		jlink		jshell		rmid
```

## 参考資料

- [GitHub \- AdoptOpenJDK/homebrew\-openjdk: AdoptOpenJDK HomeBrew Tap](https://github.com/AdoptOpenJDK/homebrew-openjdk)
Progate 　HTML＆CSS編

ProgateのHTML&CSSを終えたので少し感想を書こうと思います。

やった感想として、中級の道場コースが一番大変だった。
学習コースの初級と中級をやっていくとそれ以外は、だんだんHTMLとCSSなれていって、上級の内容とかはかなり簡単と感じるようになります。

次は、Rubyを触っていく予定です。
フロントエンドエンジニアのスキルセット

フロントエンドエンジニアのスキルセットが曖昧すぎて採用基準等で困るので、何となく個人的なフロントエンドエンジニア像を書いておくことにしました。

僕がフロントエンドエンジニアではないので全く参考にならないかもしれませんが、アメリカのフロントエンドエンジニア達と同じチームで仕事した時を思い出して、彼らとまともに対話しつつ一緒に仕事できるレベルはどれくらいか考えてみました。単純にプログラマとして考えるとこのくらいは軽く超えてくる人達が多かった印象です。畑違いなのでやるなーと思いつつ、知らなかったテクニックをいくつか盗めた気がします。

コメント頂いても反応することはありませんので悪しからず。

## 必須スキル

- 入門書程度の基礎的なプログラミングスキル（制御文、関数、オブジェクト、データ構造、他）を正確に理解した上で、Webアプリケーションフレームワークやライブラリを利用したプログラミングについて理解している。

- リファレンス等を参照して不具合の調査ができる。（英語のドキュメントを含む）

- （単体）テストやデバッグに関して、考え方や手法を理解して活用できる。

- HTML5 (4.01+) の仕様に精通している。
  または、文書構造とセマンティクスを意識したマークアップに関する深い知識があり、それを十分活用できる。

- CSS3 (2+) の仕様に精通している。
  または、クロスブラウザ対応に関する深い知識があり、それを十分活用できる。

- JavaScript の仕様に精通している。
  または、JavaScript を利用したプログラミングに関する高度な知識があり、それを十分活用できる。
  例)
 - this について正しく理解してコーディングできる。
 - apply や call, bind メソッドについて正しく理解して利用できる。
 - bubbling について正しく理解してコーディングできる。
 - イベントとイベントリスナについて正しく理解してコーディングできる。
 - 変数等のスコープについて正しく理解してコーディングできる。
 - 無名関数について正しく理解してコーディングできる。

- ECMAScript 6 (2015) 以降の構文を理解して活用できる。

- Ajax について十分理解して、コーディングできる。

- HTTP 通信の概要を理解して Web API を活用したプログラミングができる。

- React.js や Vue.js にについて基礎的な知識に関して十分理解しており、周辺技術と組み合わせて不自由なくアプリケーションの開発ができる。

- レスポンシブ対応のアプリケーション開発経験がある。
または、レスポンシブ対応に関する十分な知識があり、それを十分活用できる。

## 望ましいスキルや経験

- JavaScript の単体テストの知識や経験があり、イベント処理の単体テストの知見がある。

- Sass の知識や経験があり、適切なクラス設計ができる。

- JavaScript の linter を適切に設定できる。

- CSS の linter を適切に設定できる。

- git の仕組みを理解して適切に利用できる。

- NPM の概要を理解した上でオプション等含め適切に利用できる。

- WebPack の概要を理解した上でオプション等含め適切に利用できる。

- Babel の概要を理解した上でオプション等含め適切に利用できる。

- シンプルで他人が読みやすく理解しやすいコーディングができる。

- 応答性能を意識した正確で効率の良いプログラミングができる。

- 応答性能の課題に関する知見があり、パフォーマンスの課題を解決できる。
#Ruby の tap で ネストされたハッシュのキーを削除しつつ返り値で変更後の値を受け取る

`hash[:foo][:bar]` のキーを削除したい

```rb
{foo: {bar: 1, yah: 2} }.tap { |h| h[:foo].delete(:bar) }
# => {:foo=>{:yah=>2}}
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3041








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Windows Updateでサウンドコントロールパネルをすぐに開けなくて困った場合

#内容
2020/02くらいに行われたWindows Updateで今まで`タスクトレーのサウンドアイコン右クリック→サウンドコントロール`の手順で開いてたコントロールパネルが`サウンドアイコン右クリック→サウンド設定を開く→サウンドコントロールパネル`の手順で開かないといけなくなり、しかも`サウンドコントロールパネルのピン止めができない`から面倒になった。

という呟きを見掛けたので、サウンドコントロールパネルのショートカットキーを作成する手順を纏めようと思います。

#試した環境
Windows 10 Pro

# 手順
[1] デスクトップで右クリック→「新規作成」→「ショートカット」


[2] "項目の場所を入力してください"のテキストボックスに`C:\Windows\System32\mmsys.cpl`と入力→「次へ」
<img width="553" alt="image00.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72559/9524c15e-b1a9-0b52-b100-4de7ac5a6ca1.png">

[3] ショートカット名を適当に設定
<img width="549" alt="image01.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72559/4acb08ec-580e-14e8-3245-93a646a186a5.png">

[4] おわり
<img width="120" alt="image02.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72559/0d3b76ac-7f61-e105-b9db-fa1d3f73a187.png">
C++のstringのinsert(end(), "string")ができない件

#はじめに
VisualStudio2019 C++で躓いたのメモしときます。
__コメントを頂いた@yumetodo様、@amate様、ありがとうございます。__
#問題
C++で以下のコード

```cpp
#include <string>
using namespace std;

int main(void)
{
    string s = "text.txt";
    s.insert(s.end() - 4, "_output");
}
```
を実行すると、エラーC2664が出てきますね。なんかダメみたいです。
![スクリーンショット (109).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/8193f78f-b1c4-049f-51da-b232f09902a4.png)

#解決方法
~~いろいろ試したところ、stringクラスのinsert関数の第一引数はイテレータじゃなくて「文字列の初めからn文字目に挿入」するnの数を入れるみたいです。なのでlength()を使って~~、
とりあえず、以下のようにするとコンパイルが通ります。

```cpp
#include <string>
using namespace std;

int main(void)
{
    string s = "text.txt";
    s.insert(s.length() - 4, "_output");
}
```
とすると通りましたね。
![スクリーンショット (110).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/34e0ffe1-4876-25c2-12b1-ee2fc58f4deb.png)
##原因
どうやら、stringクラスのリファレンス（[https://cpprefjp.github.io/reference/string/basic_string/insert.html](https://cpprefjp.github.io/reference/string/basic_string/insert.html)）を確認した所、insertメンバ関数のうち、今回のように第一引数にイテレータを代入した場合、以下の4つのどれかの書き方にならなければならないみたいです。

```cpp
iterator insert(const_iterator p, charT c);                       // (6) C++11
iterator insert(const_iterator p, size_type n, charT c);          // (7) C++11
template<class InputIterator>
iterator insert(const_iterator p,
                InputIterator first, InputIterator last);         // (8) C++11

iterator insert(const_iterator p, initializer_list<charT>);       // (9) C++11
```
今回の問題は、

```cpp
insert(イテレータ, 文字列）;
```
の形式で書いてしまい、そんな形式の関数はstringクラスのinsertメンバ関数に存在しません。
また、解決方法でコンパイラが通るのは、リファレンスに

```cpp
basic_string& insert(size_type pos, const charT* s); // (4)
```
という関数が用意されていて、たまたま

```cpp
s.insert(s.length() - 4, "_output");
```
の書き方が当てはまったからコンパイルが通ったわけですね。
[Javascript] 要素の外側をクリックした時にremoveする

#概要
例えばモーダルウインドウには×で閉じるボタンがレイアウトされている事が一般的ですが、
ユーザビリティを考えると、ボタン以外でも閉じられるようにしている事が望ましいですよね。
だからといって、どこでもクリックすれば閉じられるような処理では、
そもそも閉じるボタンの意味がなくなってしまいます。

今回はクリックイベントで付与したクラスを、
反応させたくない要素の外側かを判定して取り除く処理になります。
あくまで私が調べた結果ですので、もっとスマートな書き方があるかもしれません。

##制御部分のコード

```Javascript:Javascript
const docOpen = document.getElementById('クラスを付与した要素');
const elemBody = document.querySelector('body');

elemBody.addEventListener('click', e => {
  if(e.target !== docOpen) {
    docOpen.classList.remove('active');
  }
});
```

##解説
```Javascript
elemBody.addEventListener('click', e => {
  if(e.target !== docOpen) {
     docOpen.classList.remove('active');
  }
});
```
今回は全体の指定をbodyにしています。
body要素をクリックした時に、
event.targetプロパティでクリックした要素を取得し、
開いているdocOpenの要素と違う要素なのかを判定しております。

こうする事で、例えば、ドロワーメニュー等を開いた時に、
メニュー部分までクリックしたら閉じてしまうといった動作を防いでいます。

要素が違うのならばremoveされます。
Pythonの基本箇所についての復習（FizzBuzz)

#はじめに
pythonでfizz-buzz的なアルゴリズムを作ったので投稿します。
#前提
2の倍数の時は`〜は偶数です`
3の倍数の時は`〜は３の倍数です`
6の倍数の時は`〜は6の倍数です`
それ以外は`〜はそれ以外の数です`
と表示させます。

いくつまで判定させるかは、最初に入力できるようにします。

#実行

まずは倍数を判定するための関数を作ります。

```python
def sample(x):
  if (x % 3 == 0 and x % 2 ==0):
    print(x,"は6の倍数です")
  elif (x % 3 == 0):
    print(x,"は3の倍数です")
  elif (x % 2 == 0):
    print(x,"は偶数です")
  else:
    print(x,"はそれ以外の数です")
```

`if`や`else`の行の最後には`:`がつく事、
elsifではなく`elif`な事、
&&ではなく`and`を使っていることに注意が必要ですが、
それ以外はrubyと大きな違いはありません。

次に、表示回数を入力するようにします。

```python
print("いくつまで表示しますか？")
y = int(input())
```

入力だけなら`y = input()`でも良さそうですが、数字として判定されなかったのでこういう書き方です。

最後に、入力した回数分、倍数の判定を行うようにします。

```python

for x in range(1, y + 1):
  sample(x)
```

実行回数は`range(1, y + 1)`で決まります。
ここでは、1から先ほど入力したyまでの全ての整数について、sample(x)を行うという処理になります。
sample(x)は、最初に定義した関数を呼び出すということです。

全体のコードは次の通りとなります。

```python
# coding:utf-8
import sys

def sample(x):
  if (x % 3 == 0 and x % 2 ==0):
    print(x,"は6の倍数です")
  elif (x % 3 == 0):
    print(x,"は3の倍数です")
  elif (x % 2 == 0):
    print(x,"は偶数です")
  else:
    print(x,"はそれ以外の数です")

print("いくつまで表示しますか？")
y = int(input())

for x in range(1, y + 1):
  sample(x)
```
Lapack(clapack)を Android arm64 + cmake + NDK r20 or later でビルドする

## 背景

* Lapack(+ BLAS) を使うアプリを Android でビルドせねばならない.
* CMake + NDK r20 or later(clang)でビルドしたい
 
## ビルド

https://github.com/syoyo/clapack-cmake-android-arm64

に上げました.

clapack-3.2.1-cmake をベースにしています.

いくらか warning 出ますが, build できます.

aarch64 linux(Jetson AGX)で unit test を走らせたら, `xeigtstz_***` のテストは実行がコケました.

## 変更したところ

### uninit.c

FPU の設定をします.
使っていないようなので取り除きました.
(Android では FPU control できるかな?)

### `__off64_t`

sysdep1.h で, OFF_T を int64_t にしました.

### arith.h

f2clib で, 実行時にシステムの情報を取得して arith.h を作っています.
cross compile だとコケますので, aarch64 linux(Jetson AGX)ででっち上げました.


## TODO

* [ ] Test を build & 走らせて, 実機で動くか確認する.
* [ ] OpenBLAS とリンクする.
  * OpenBLAS を Android aarch64 + NDK r20 or later でビルドするメモ https://qiita.com/syoyo/items/6f15ddc8eeb260bda433
Djangoのインストール

#はじめに
pythonをインストールした後にDjangoをインストールしようとして詰まったので、
その際の解決法を書いていきます。
#実行
ターミナル上で次のコマンドを入力します。

```
pip install django
```
これでDjangoがインストールされるはずですが、次のエラーが出ました。

```
-bash: pip: command not found
```

「`pip`がインストールされていないのでこのコマンドは使えない」というエラーのようです。
ならばpipをインストールすればいいと、次のコマンドを実行します。

```
python -m pip install -U pip
```
すると今度は次のエラーが出てきます。

```
/usr/bin/python: No module named pip
```
どうやら「pythonにpipなんてないよ」というエラーのようです。

`python`と`python3`が別物だったことを思い出し、次のコマンドを入力しました。

```
python3 -m pip install -U pip
```
今度は上手くいったようで、次のメッセージが表示されました。

```terminal
Collecting pip
  Downloading https://files.pythonhosted.org/packages/(中略) (1.4MB)
     |████████████████████████████████| 1.4MB 1.4MB/s 
Installing collected packages: pip
  Found existing installation: pip 19.2.3
    Uninstalling pip-19.2.3:
      Successfully uninstalled pip-19.2.3
Successfully installed pip-20.0.2

```

改めて次のコマンドを入力します。

```
pip install django
```
これも上手くいき、次のメッセージが表示されました。

```terminal
Collecting django
  Downloading Django-3.0.4-py3-none-any.whl (7.5 MB)
     |████████████████████████████████| 7.5 MB 2.0 MB/s 
Collecting asgiref~=3.2
  Downloading asgiref-3.2.5-py2.py3-none-any.whl (19 kB)
Collecting pytz
  Downloading pytz-2019.3-py2.py3-none-any.whl (509 kB)
     |████████████████████████████████| 509 kB 46.8 MB/s 
Collecting sqlparse>=0.2.2
  Downloading sqlparse-0.3.1-py2.py3-none-any.whl (40 kB)
     |████████████████████████████████| 40 kB 701 kB/s 
Installing collected packages: asgiref, pytz, sqlparse, django
Successfully installed asgiref-3.2.5 django-3.0.4 pytz-2019.3 sqlparse-0.3.1
```

これで完了です。
vue cli: lazy loadって？やっておいたほうがいい理由＆やり方を解説

備忘録です。

vue cliでは、vue-routerを使うことで、いとも簡単にpathがつくれます。
つまりabout, contact, infoなど、プロジェクト内にいくつかページを設定したいときに、

blog.jp/about
blog.jp/contact
blog.jp/info

とそれぞれのリンクをつくれるようになります。

vue cliでプロジェクトを作成するときにvue-routerを含むよう設定しておけば、routerというフォルダが自動的に作成され、そのなかにあるindex.jsからrouterの作成・編集が行えるようになります。この記事はvue-routerについてではないので、細かいところは割愛します。

（vue-routerのドキュメントは、[ここ](https://router.vuejs.org/ja/)から確認できます）

vue-routerで新たなpathをつくる際にlazy loadを設定しておかないと、ウェブサイトを開いたときにウェブサイト全体で使われる全てのJSが一斉に読み込まれてしまいます。

### なぜlazy loadするべきか

一見、「別にいいじゃん」と思うかもしれません。ところがページが重い場合、「ページに必要となるJSを全部ロードしてからページを開く」なんてことをしていると、ページの動作が鈍くなりかねません。

lazy loadであれば、ユーザーがページにクリックした際に、そのページのJSファイルがロードされるよう設定ができます。なので、サイトにアクセスした瞬間から重すぎてページがロードしない、なんて事態を防げます。そうすることで、ユーザーはページ内をスイスイ回遊することができます。

### 方法

たとえばAboutというページがあるとします。
まずはlazy loadをしなかった場合のコードを見てみましょう。
About.vueは、通常通り`import About from〜`というコードでimportされています。

```
import Vue from "vue";
import VueRouter from "vue-router";
import Home from "../views/Home.vue";
import About from "../views/About.vue";//ここでAbout.vueをインポート

Vue.use(VueRouter);

const routes = [
  {
    path: "/",
    name: "Home",
    component: Home
  },
  {
    path: "/about", //パスをつくる
    name: "About", //vueファイル内でアクセスできる名前をつける
  }
];
```

一方でlazy loadをした場合は、`routes`のなかにある`component`というプロパティを通して、About.vueをインポートします。

```
import Vue from "vue";
import VueRouter from "vue-router";
import Home from "../views/Home.vue";//ここでAbout.vueをインポートしない


Vue.use(VueRouter);

const routes = [
  {
    path: "/",
    name: "Home",
    component: Home
  },
  {
    path: "/about", //パスをつくる
    name: "About", //vueファイル内でアクセスできる名前をつける
    component: () =>
      import(/* webpackChunkName: "about" */ "../views/About.vue")　// ここでlazy loadをしている！
  }
];
```

`component`を定義することで、ページが呼び出されたときにだけ、About.vueが読み込まれるようになります。

ちなみに`/* webpackChunkName: "about" */`これはなんぞや？と思うかもしれません。

lazy loadのコードを書いたあと、`Chrome Developer Tools👉network`を開き、Aboutのページをクリックしてみると、app.jsとは別に`0.js`というファイルがロードされていることが確認できるかと思います。つまり`webpackChunkName`を設定しないと、デフォルトとして数字でファイル名が登録されてしまうのです。

`about.js`とわかりやすく表示できるよう、`/* webpackChunkName: "about" */`を付け加えておきましょう。

vue.jsの[公式ドキュメント](https://router.vuejs.org/ja/guide/advanced/lazy-loading.html)にも記載されています。

以上です👋
Cyber Detective CTF suntan 200

#問題

https://ctf.cybersoc.wales/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/4913458f-97ec-c0d9-66e0-53c1b38b37f9.png)

人々は自分の休日について世界中に伝えるのが大好きですが、これは本当に素晴らしいアイデアですか？

サラは2月末に休日に行くのはどの都市ですか？

ヒント：以前にそこに行ったことがなければ、答えを得るためにツールを使用する必要があるかもしれません。

注：この人が誰なのかわからない場合は、他のLife Onlineの課題をご覧ください。これらの人を見つけるためのエントリポイントが提供される可能性があるためです;）。

#解いてみた

サラ？誰？

調べてみると、ひとつ前の問題になったツイートにいいねしている人でした。
https://qiita.com/CTFman/items/6ade2f1d5b10f5759842

サラのツイートを見ると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/1190b85e-4441-25ce-e18b-8c24d327de66.png)

ちょっと日本語訳が変な気はしますが、ここに行こうとしている感はあります。
この場所はどこなんでしょう。

画像からdeloitteとlavanの文字が見えるのでGoogle検索してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/20ccfa9c-ff54-2cde-2947-709dc97c2fb0.png)

右下の画像が同じ場所のようですね。
そのままサイトに行きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/cbf45212-8f31-302b-a3bf-8b882eef2dc5.png)

地名が書かれてました。これが答えです。
エクセルで範囲選択した内容をPythonのリスト初期化コードに変換するマクロ（VBA）

# 概要
エクセル上の選択範囲の内容を、**Pythonのリスト初期化コードに変換してクリップボードにコピーする**VBAコードです。次の図のように選択範囲の先頭行を**変数名**、以降の行をリストの**要素**とするPythonプログラムを生成します。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/228f0b37-fe82-998b-f33d-004ca27d8100.png)

クリップボードにテキストをコピーする方法については「[VBA 失敗しない文字列をクリップボードへコピーする方法](https://info-biz.club/windows/vba/vba-set-clipboard.html)」で紹介されているコードを、そのまま利用させていただきました。

# コード

```vb:選択範囲(Range)をPythonのリスト（初期化コード）に変換
Sub Range2PythonList()

  If TypeName(Selection) <> "Range" Then
    Exit Sub
  End If
      
  sCol = Selection(1).Column               '範囲開始列
  eCol = Selection(Selection.Count).Column '範囲終了列
  sRow = Selection(1).Row                  '範囲開始行
  eRow = Selection(Selection.Count).Row    '範囲終了行
      
  If sRow = eRow Then
    Exit Sub
  End If
      
  pCode = ""
  For c = sCol To eCol
    pCode = pCode & Cells(sRow, c).Value & "=["
    For r = sRow + 1 To eRow
      v = Cells(r, c).Value
      Select Case TypeName(v)
        Case "String"
          pCode = pCode & "'" & v & "'"
        Case "Empty", "Null", "Nothing"
          pCode = pCode & "None"
        Case "Date"
          pCode = pCode & "datetime.datetime(" _
                & Year(v) & "," _
                & Month(v) & "," _
                & Day(v) & "," _
                & Hour(v) & "," _
                & Minute(v) & "," _
                & Second(v) & ")"
        Case Else
          pCode = pCode & v
      End Select
      pCode = pCode & ","
    Next r
    pCode = Left(pCode, Len(pCode) - 1) & "]" & vbCrLf
  Next c
  
  Debug.Print pCode
  SetClip (pCode)

End Sub

'クリップボードにテキストをコピー
' https://info-biz.club/windows/vba/vba-set-clipboard.html
Sub SetClip(S As String)
  With CreateObject("Forms.TextBox.1")
    .MultiLine = True
    .Text = S
    .SelStart = 0
    .SelLength = .TextLength
    .Copy
  End With
End Sub
```

# 実行方法

エクセルを起動して「**Alt+F11**」でVBAコードエディタを起動し、対象のブックをダブルクリックで選択します。

![f1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/553aebcc-81d1-3643-6d11-6d2e893dfbbf.png)

VBAコードを記述するウィンドウが開くので、そこに上記のコードをコピペします。

エクセルに戻って、**範囲を選択してから**「**Alt+F8**」でマクロを起動、「ThisWorkbook.Range2PythonList」を選択して実行します。

![f2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/a8ca65ed-ba19-e422-f539-77a25a70cd9d.png)

選択範囲の内容が、Pythonのリストの初期化コードに変換されクリップボードにコピーされます。あとは、適当なエディタに貼り付けて利用します（必要に応じて `import datetime` を追記してください）。

![f3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/c7d38b1e-34d3-5ad3-3288-635003074ad1.png)

# 参考資料
- [VBA 失敗しない文字列をクリップボードへコピーする方法](https://info-biz.club/windows/vba/vba-set-clipboard.html) @ [情報ビジネス支援クラブ](https://info-biz.club/)