OmniAICreator/Qiita-1.07M huggingface dataset:
気になる記事メモ(ウェブサイト制作編)

# この記事のモチベーション
最近調べ物をしているときにQiitaの記事に出会うとラッキー！と思う。
なぜならQiitaは記事のストックが簡単だからだ。
自分だけのメモ帳ができるこの感覚がたまらなく好き。

一方でQiitaでないところで役立つ記事を見つけると、もどかしさを感じる。
ストックしたい。だったら、いっそのことQiitaにまとめてしまえ。

きっと将来、まとめた自分に感謝する日がくるかもしれない。しらんけど。

# ウェブサイトを作成したい
[静的ページと動的ページの違いとメリット・デメリット](https://www.itra.co.jp/webmedia/static-dynamic-difference.html)
<要約>
- 静的ページとは、いつどこでアクセスしても毎回同じものが表示される、HTMLファイルで作成されたWebページ。ユーザーの要求に対して、Webサーバーが要求されたデータをそのままブラウザに送信し、表示する。
- 動的ページとは、アクセスしたときの状況に応じて異なる内容が表示されるWebページのこと。

[GitHub Pagesでブログを運用し始めてから4年くらいたった](https://masamichi.me/development/2019/12/14/github-pages-blog.html)
<感想>
静的ページで作るぶんには GitHub Pages がお手軽そう。まずはこれでいいかも。

[Bootstrapのグリッドシステムの使い方を初心者に向けておさらいする](http://websae.net/twitter-bootstrap-grid-system-21060224/)
<感想>
PCやスマホに対応するレイアウトづくり。実例を使った視覚的な説明がわかりやすい。

# Pythonを使いこなしたい
[Pythonの軽量webフレームワーク「Flask」でフォーム送信　GET/POST通信を行うサンプルコード](https://karupoimou.hatenablog.com/entry/2019/07/11/110018)
<感想>
Flaskを理解するのにぴったりのサンプル。テンプレートにもなる。

[Python で別ファイルの import](https://tex2e.github.io/blog/python/import-files)
<感想>
同じ階層にないときのtipsが役立った

[Python3 + FlaskでテンプレートエンジンJinja2を利用する](https://kenteiblog.hatenablog.com/entry/python-flask-temp-engine)
<感想>
同じく階層問題. Jinja2でファイル構造が決まってるから注意しようね.
(こういうのってググる前にdocumentationを読んだほうが早いかもしれない)

#複数のファイルを扱いたい 
[相対パスとルートパス、絶対パスについてのメリット・デメリット](https://sunsukeblog.com/html_path)
そんなに難しくはないはずなのに、案外ここでひっかかったりする。備忘。
Float計算回路のVerilog-HDL実装について -その1.5 (LeadingZeros)

前回
[Float計算回路のVerilog-HDL実装について -その１](https://qiita.com/Soleiyu/items/5bbb991de443e61e318e)

# 今回の内容
前回の補足
LeadingZeros消去について

# 前回の補足
## 5.型の生成について
桁上がりを考慮してfloat型を生成する.

```
 //TIM5
reg [31:0] res;

always @(posedge clk) begin
    res[31] <= 1'b0;

    if (r[24]) begin
        res[30:23] <= vexp3 + 8'b1;
        res[22:0] <= r[23:1];
    end else begin
        res[30:23] <= vexp3;
        res[22:0] <= r[22:0];
    end
end
```
7行目の if 文で
2数の加算結果が繰り上がりを起こすか起こさないかを判定している.

```math
01XX + 0XXX\\
= 01XX\ or\ 1XXX
```
繰り上がりを起こした際に 1bit シフトして調整を行う.
繰り上がりを起こさない場合は通常通り処理を行う.
(正規化というのかな)

# LeadingZeros 消去について
## LeadingZeros について

左の0を LeadingZeros というらしいよ.

### 例
```math 
8'd\ 8 = 8'b\ 0000\_1000
```
このときの上位 4bit の 0　のこと (らしい）.

## なぜ消去するのか
減算時にはどの位置に初めて 1 が出現するか予測できない.
float 型を生成するためには最上位の 1 を探す必要がある(?).
  
## LeadingZeros 切り出しモジュール
```leadingzero.sv
module lzsv(
	input wire clk,
	input wire [23:0] v,

	output wire [4:0] num,
	output wire [23:0] res
);

	// {num5, res24}
    reg [28:0] cnum;
    assign num = cnum[28:24];
    assign res = cnum[23:0];

always @(posedge clk) begin
	if (v[23]) cnum <= {5'd0, v};
	else if (v[22]) cnum <= {5'd1, v[22:0],  1'b0};
	else if (v[21]) cnum <= {5'd2, v[21:0],  2'b0};
	else if (v[20]) cnum <= {5'd3, v[20:0],  3'b0};
	else if (v[19]) cnum <= {5'd4, v[19:0],  4'b0};
	else if (v[18]) cnum <= {5'd5, v[18:0],  5'b0};
	else if (v[17]) cnum <= {5'd6, v[17:0],  6'b0};
	else if (v[16]) cnum <= {5'd7, v[16:0],  7'b0};
	else if (v[15]) cnum <= {5'd8, v[15:0],  8'b0};
	else if (v[14]) cnum <= {5'd9, v[14:0],  9'b0};
	else if (v[13]) cnum <= {5'd10, v[13:0], 10'b0};
	else if (v[12]) cnum <= {5'd11, v[12:0], 11'b0};
	else if (v[11]) cnum <= {5'd12, v[11:0], 12'b0};
	else if (v[10]) cnum <= {5'd13, v[10:0], 13'b0};
	else if (v[ 9]) cnum <= {5'd14, v[ 9:0], 14'b0};
	else if (v[ 8]) cnum <= {5'd15, v[ 8:0], 15'b0};
	else if (v[ 7]) cnum <= {5'd16, v[ 7:0], 16'b0};
	else if (v[ 6]) cnum <= {5'd17, v[ 6:0], 17'b0};
	else if (v[ 5]) cnum <= {5'd18, v[ 5:0], 18'b0};
	else if (v[ 4]) cnum <= {5'd19, v[ 4:0], 19'b0};
	else if (v[ 3]) cnum <= {5'd20, v[ 3:0], 20'b0};
	else if (v[ 2]) cnum <= {5'd21, v[ 2:0], 21'b0};
	else if (v[ 1]) cnum <= {5'd22, v[ 1:0], 22'b0};
	else if (v[ 0]) cnum <= {5'd23, 24'h800_000};
	else cnum <= {5'd24, 24'd0};
end

endmodule
```
この記述どうにかなりませんかね...

## シミュレーション結果
![lz1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253609/2dc8ecb4-2cf8-b64b-5e83-730ee16c4637.png)
カウントアップされる acnt が1クロック遅れで 0 を消去しシフトした値が res に得られていることが確認できる.

![lz2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253609/52bb45b2-297b-02a9-49e0-f9bd299ad268.png)
桁数の更新が指数関数的に長くなるのに対し、数値の更新が毎クロック行われていることが確認できる.
初心者が月10万稼ぐ為の記録２

#本日の学習
・PHPのif文、switch文の違い【YouTube】

・関数、引数、返り値【YouTube】

・HPのトップ画面にアニメーションで動きを表現

#今後の予定
・HPのトップ画面をボタンなしで3枚くらいの画像がフェードイン、アウトで常に切り替わるようにする。
・if文を使用して簡単なログイン機能を作成してみる。（恐らくよく使用するので理解を深める為）
・クラス、オブジェクトについて学習

#本日の学習記録

##if文
イメージとして
**上から順番にチェックして→どれかの条件に合致したら→【チェック停止】（それ以降の条件はチェックしない）**

##switch文
**上から順番にチェックして→どれかの条件に合致したら→【それ以降の処理を行う】
ただし、【brea】が書いてある場合はそこで停止**

##関数、引数、返り値
**①引数（材料）を入れる
↓
②関数（処理）をする
↓
③返り値（結果）がでてくる**

####ソースコード
```
     関数、引数、返り値

    //引数$num1,$num2を「Calc」という関数に渡す。
    function calc ($num1 , $num2) {

	//処理を行う。$num1と$num2を足して$totalという変数（箱）に渡す
	$total = $num1 + $num2;

	//$totalを返り値として返す
	return $total;

    }

     //例えば39598+469074を計算したい時、「calc」関数を使う
　　 //関数を呼び出す
     $kekka = calc(9598, 469074);

     //実行すると「478672」となる
     echo $kekka;
```

##HPのトップ画面にアニメーションで動きを表現

とりあえずCSS3の Transitionというのを使用しました。
動きはfadeというボタンを押してフェードイン、フェードアウトをしてみた。

準備：公式ページから
①「Download the compressed, production jQuery 3.5.1」ダウンロード
という部分を右クリックし、「リンク先を別名で保存」をクリックします。
②jQueryをインストールするには、先ほどダウンロードしたファイルを配置する。
③htmlファイルと同じフォルダにjquery-3.5.1.min.jsを配置します。
④ダウンロード完了

###ソースコード
```
//ボタン作成
<button id="fade">fede</button>

//jQueryのファイルを読み込む
<script src="jquery-3.5.1.min.js"></script>

<script>
//とあるサイトを参考
	$('#fade').on('click' , function() {

		if($('.main').hasClass('open')) {

			$('.main').removeClass('open');

		} else {
			$('.main').addClass('open');
		}
	});	
</script>

```
Realtime Database + Vue.js TODOアプリ

* 作るもの
![realtimedb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500676/a8e27171-0f2c-78d3-1e7d-ec5039078716.png)

* Realtime Databaseの設定例
![db.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500676/7d5598f5-d893-4300-3788-dde8f6b35f66.png)

```vuejs:vue.js

<html>
  <head>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <meta charset="UTF-8">
  </head>
  <body>
    <div id="app">
      <input type="text" v-model="text1">
      <input type="button" @click="put()" value="PUT">
      <table border="1" v-if="items">
        <tr v-for="(item, i) in items">
          <td>{{ item.name }}</td>
          <td><input type="button" @click="del(i)" value="DELETE"></td>
          <td><input type="button" @click="update(i)" value="PUT"></td>
        </tr>
      </table>
    </div>
  </body>
</html>

<script>

const baseUrl ='https://test-0000.firebaseio.com/'; // Realtime DatabaseのURLを設定

const app = new Vue({
  el: '#app',
  data: {
    text1: '',
    items: []
  },
  mounted() {
    this.find();
  },
  methods: {
    async find() {
      const url = baseUrl + '.json';
      const res = await axios.get(url);
      this.items = res.data;
      console.log(111, res.data);
    },
    async put() {
      const url = baseUrl + Date.now() + '.json';
      const params = { name: this.text1 };
      const res = await axios.put(url, params);
      this.find();
    },
    async update(i) {
      const url = baseUrl + i + '.json';
      const params = { name: this.text1 };
      const res = await axios.put(url, params);
      this.find();
    },
    async del(i) {
      const url = baseUrl + i + '.json';
      const res = await axios.delete(url);
      this.find();
    },
  }
})
</script>
```
Next.jsでModal実装したときのLayout Componentのあり方について

Next.jsでLayout Componentを実装する際、公式を参考にするとこんな感じで実装すればいいかと思います。

```javascript:MyLayout.jsx
const layoutStyle = {
  margin: 20,
  padding: 20,
  border: '1px solid #DDD'
}

const Layout = ({ children }) => (
  <div style={layoutStyle}>
    {children}
  </div>
)

export default Layout
```

```javascript:pages/index.jsx
import Layout from './MyLayout'

export default () => (
    <Layout>
       <p>Hello Next.js</p>
    </Layout>
)
```

瞬殺で作業が終わるわけですが、modalを実装した際にそのmodalもchildrenの中で管理してしまうとmodalを表示しているときcontainer部分にstyleを当てるなどの何かしらの処理をさせたいときに厄介になります。
なので、childrenとmodalを分けたLayout Componentが望ましいと思い、実装しました。
このようにしたいです。

```javascript
<div>
    {children}
    {modalContainer}
</div>
```

## 考え方

- modalが開いてるかどうかをstoreから取得するComponentを作成(親Component)
- modalが開いてるかをpropsとして受け取ってStyle制御するComponentを作成(子Component)

要はstoreからdataを取得するComponentとStyleを当ててLayoutを生成するComponentを分けるってことですね。

## 実装

### 親Component

```javascript
const LayoutStyle = styled.div`
  margin: 20px;
  padding: 20px;
`;

const LayoutWrapper = (props) => {
  const { children, modalContainer, isOpenModal } = props;
  return (
    <LayoutStyle>
      <LayoutComponent
        childComponent={children}
        modalContainer={modalContainer}
        isOpenModal={isOpenModal}
      />
    </LayoutStyle>
  );
};

const mapStateToProps = (state, { modalContainer }) => {
  if (!modalContainer) {
    return {
      isOpenModal: false,
    };
  }
  return {
    isOpenModal: state.modal.isOpenModal,
  };
};

const enhance = compose(connect(mapStateToProps));

const Layout = enhance(LayoutWrapper);
export default Layout;
```

### 子Component

- styled-componentsでpropsを受け取って表示非表示を制御しています。

```javascript
const ChildrenDiv = styled.div`
  display: ${(p) => (p.isOpenModal ? 'none' : 'block')};
`;

const Layout = (props) => {
  const { childComponent, modalContainer, isOpenModal } = props;
  return (
    <>
      <ChildrenDiv isOpenModal={isOpenModal}>{childComponent}</ChildrenDiv>
      {modalContainer}
    </>
  );
};

export default Layout;
```

これでpagesのComponentで親Componentを呼べば実装されます

```javascript:pages/index.jsx
<Layout modalContainer={modalのcomponent}>
    // children
</Layout>
```

以上となります。
sshのX11 Forwarding経由でGazeboを起動する際の注意点

# 背景
ssh経由でGazeboを起動しようとしたら以下のエラーに遭遇。

```bash
(抜粋)
X Error of failed request:  BadValue (integer parameter out of range for operation)
  Major opcode of failed request:  154 (GLX)
  Minor opcode of failed request:  3 (X_GLXCreateContext)
  Value in failed request:  0x0
```

# 対策
X11のIndirect renderingをonにする。

```bash
$ sudo vi /usr/share/X11/xorg.conf.d/10-xxxx.conf 
# xxxxは任意
# 以下を記載する。

Section "ServerFlags"  
    Option "AllowIndirectGLX" "on"  
    Option "IndirectGLX" "on"  
EndSection  
```
MeCabのデフォルト辞書を変更する【Mac】

#概要
MeCabのデフォルト辞書を`mecab-ipadic-NEologd`に変更するために、自分の環境（macOS）でやったことのメモです。
多くの方がすでに書いてくださっているように、デフォルト辞書は`mecabrc`というファイルを編集すると変更できるのですが、自分の環境だと`mecabrc`が複数あってどれを編集すればよいか迷ったので、どのファイルを編集すべきかの調べ方も含めて、実際にうまくできた方法について書いています。

#環境
* OS
    * macOS Catalina 10.15.4
* MeCab
    * mecab 0.996 (brewでインストール)
    * mecab-ipadic-NEologd

インストールは下記サイトの手順にほぼ倣いました。
https://qiita.com/taroc/items/b9afd914432da08dafc8

#mecabのデフォルト辞書の更新
##現在使っているmecabのバイナリソースの確認
brewでインストールしたmecabをちゃんと使っているか一応確認しました。

```
% which mecab
/usr/local/bin/mecab

% ls -l /usr/local/bin/mecab
lrwxr-xr-x  1 xxxx  yyyy  XX  M dd hh:mm /usr/local/bin/mecab -> ../Cellar/mecab/0.996/bin/mecab

```
`/usr/local/Cellar`の中を参照しているので、ちゃんとbrewでインストールしたものが使われているようです。
##現在のデフォルト辞書の確認
ターミナルで`mecab -D`とタイプし、現在のデフォルト辞書を確認しました。
`filename:`の部分から`/usr/local/lib/mecab/dic/ipadic/sys.dic`が使われていることがわかります。

```
% mecab -D
filename:	/usr/local/lib/mecab/dic/ipadic/sys.dic
version:	102
charset:	utf8
type:	0
size:	392126
left size:	1316
right size:	1316
```

一応、この状態で「インスタ映え」が正しく解析されないことも確認しておきました。
間違いとまでは言えないですが、「インスタ」と「映え」が別々の単語として認識されてしまっています。

```
% echo 'インスタ映え' | mecab
インスタ	名詞,一般,*,*,*,*,*
映え	名詞,一般,*,*,*,*,映え,ハエ,ハエ
EOS
```


##mecabrcを探す
デフォルト辞書の参照先は`mecabrc`というファイルに記述されています。
そこで`find`により検索しました。
下記のようにいくつか候補が出てきました。

```
% sudo find / -name mecabrc
/usr/local/etc/mecabrc
/usr/local/Cellar/mecab/0.996/.bottle/etc/mecabrc
/System/Volumes/Data/usr/local/etc/mecabrc
/System/Volumes/Data/usr/local/Cellar/mecab/0.996/.bottle/etc/mecabrc
```

一瞬「どれだ？」と思ったのですが、軽く調べるとbrewでインストールした場合は`/usr/local/etc/`に設定ファイルが置かれていると、書いているところが多かったです。

参考
https://ichibariki.hatenablog.com/entry/2017/01/09/150542
https://qiita.com/takaheraw@github/items/286cdb27887bd00e2245

一応、ちゃんとした根拠がないか調べてたら、`mecab-config --sysconfdir`でわかるという情報を見つけました。

参考
https://rooter.jp/data-format/mecab_install/

僕の環境でも実行してみたところ、やはり`/usr/local/etc`が格納先になっているようでした。

```
% /usr/local/Cellar/mecab/0.996/bin/mecab-config --sysconfdir
/usr/local/etc
```

ついでにですが、辞書ファイルの参照先も下記コマンドで調べることができました。

```
% /usr/local/Cellar/mecab/0.996/bin/mecab-config --dicdir
/usr/local/lib/mecab/dic
```
##mecabrcの編集
`/usr/local/etc/mecabrc`をエディタで開き、`dicdir = `となっている部分を書き換えます。

```
% nano /usr/local/etc/mecabrc

#書き換え前
dicdir =  /usr/local/lib/mecab/dic/ipadic

#書き換え後
;dicdir =  /usr/local/lib/mecab/dic/ipadic
dicdir =  /usr/local/lib/mecab/dic/mecab-ipadic-neologd
```

編集後、`mecab -D`でデフォルト辞書が変更されていることを確認します。

チェックのため、「インスタ映え」を形態素解析してみました。固有名詞として一単語で認識できていました。

```
% echo 'インスタ映え' | mecab             
インスタ映え	名詞,固有名詞,一般,*,*,*,インスタ映え,インスタハエ,インスタハエ
EOS
```

なおpythonからMeCabをつかうときのデフォルト辞書については、上記だけでは変更されませんでした。pythonに関しては、`MECABRC`という環境変数に参照すべき`mecabrc`のパスを代入することでデフォルト辞書を変えることが出来ました。詳細は[別記事](https://qiita.com/shimajiroxyz/items/3b475da3b6cd850d2c22)にまとめました。

#おわりに
mecabのデフォルト辞書をmecab-ipadic-neologdに変更する方法に関して、自分の環境で行ったことをメモしました。
編集すべき`mecabrc`を`find`で検索したら候補が複数出てきて、一瞬困りました。
ネットの情報を信じて`/usr/local/etc/mecabrc`を決め打ちで編集してみるのでも良かったのですが、`brew`でインストールしたバイナリの設定ファイル置き場が本当に`/usr/local/etc`なのか少しだけ不安に感じてしまいました。そこで、折角の機会なので、自分の環境のmecabがどこの設定ファイルを読んでいるのか、`mecab-config`で一応調べてみました。結果、多少ですが、納得性の高い情報が得られたので良かったです。

本記事は以上です。
ここまでお読みいただきありがとうございました。
バージョン違いによるSpring Bootの機能について

[前回](https://qiita.com/wataru908/items/239404926f926743e65b) の続きです。
今回はSpring Boot2になったことで、使用できるメソッド等が変更されていることについてです。

#変更点
##1.findOne
教材には、findOneメソッドを使用しているが、これをそのまま使用すると、
findByIdメソッドへの変更を促されます。
また、戻り値もOptional型になっています。


```java:教材（以前のバージョン）
public MeetingRoom findMeetingRoom(Integer roomId) {
	return meetingRoomRepository.findOne(roomId);
}
```

```java:SpringBoot2変更点
public Optional<MeetingRoom> findMeetingRoom(Integer roomId) {

	return meetingRoomRepository.findById(roomId);
}
```

Optional型の値を取得する際は、get()を付ける必要があります。

##2.WebMvcConfigurerAdapter
こちらも非推奨になっています。
WebMvcConfigurerを使用します。

```java:教材（以前のバージョン）
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter{
}
```

```java:SpringBoot2変更点
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer{
}
```
画像を含むページ内遷移がズレるんでなんとかしたい

画像を含むページ内遷移をしたいとと思ったら、やっぱり基本は `<a href="#hoge">` と `<div id="hoge">` とかだと思うんですよ。それか `<a name="hoge">` でもいいです。

で、遷移先までの途中に画像が差し込まれていると、ハッシュ付きURLで開いた時、
画像の読み込みによって遷移先がズレることがありませんか？

# 基本
- 画像はサイズ指定するべき←サイズが指定されていればこの問題は起きないはず
- 画像のサイズが読み込まれてからでないと決定しないときズレがち
- アニメーションでサイズが可変になることでも生じる

## 対応策

```.js
function tryToScroll(img){
  leftImages--;
  if(leftImages === 0) scrollTo(img)
}

function scrollTo(el){
   el.scrollIntoView()
}

const imgs = document.querySelectorAll("img") //対象のタグは任意に変えること
let leftImages = imgs.length
imgs.forEach(img, () => {
  img.addEvemtListener("load", tryToScroll(img));
  img.addEvemtListener("error", tryToScroll(img));
})
```

多分これでうまくいくはず？
（空でタイプしたのでちょっと確認してないです。うまくいかなかったらコメントください）

アイデアとしては最初にimgタグの個数を数えて、読み込みおわりもしくはエラーならデクリメントし、
残っている画像の数が0個になったら再度スクロールを試みるというものです。

これで多分うまくいくんじゃないでしょうか

## アニメーションするときの備え
cssアニメーションなどで画像を可変サイズにしたいとかもありますよね！
そういう時にもこの問題にぶちあたります。

まず確認するのは、アニメーション秒数が固定秒かどうかです。
たとえば0.2秒固定なら、0.2秒遅延して scrollTo() を試みましょう

```.js
function tryToScroll(img){
  setTimeout(() => {
    leftImages--;
    if(leftImages === 0) scrollTo(img)
  }, 200)
}

```
こんな感じでうまくいくんじゃないでしょうか。
試してみてください。

# SPAとかありがち
APIリクエストの結果で画像の数とか変わるので、よしなに頑張りましょう(๑•̀ㅂ•́)و✧
Pythonから呼び出すMeCabのデフォルト辞書を変更する

# はじめに
ターミナルなどで使うMeCabのデフォルト辞書は`mecabrc`を編集することで変えられますが、`mecab-python3`をインストールしてpythonプログラムからMeCabをつかうときのデフォルト辞書はそれだけでは変えられません。"-d"オプションで毎回指定するのも面倒です。
やり方を調べても日本語記事がぱっと見つからなかったので、最終的に自分の環境でうまくできた方法をメモとして残しておきます。

# 環境
* OS
    * macOS Catalina 10.15.4
* MeCab
    * mecab 0.996 (brewでインストール)
    * mecab-ipadic-NEologd
* Python
    * python3.8.0 (pyenvでインストール）
    * mecab-python3 (pipでインストール）

MeCabなどのインストールは下記サイトの手順にほぼ倣いました。
https://qiita.com/taroc/items/b9afd914432da08dafc8
# やったこと

`MECABRC`という環境変数に読み込むべき`mecabrc`のパスを設定したところ、pythonから呼び出すMeCabのデフォルト辞書を変える事ができました。

参考
https://pypi.org/project/mecab-python3/

具体的に、僕の環境では下記のような操作をしました。

### 1.通常のmecabが読み込む`mecabrc`を編集してデフォルト辞書を変更する

```
% nano /usr/local/etc/mecabrc

#書き換え前
dicdir =  /usr/local/lib/mecab/dic/ipadic

#書き換え後
;dicdir =  /usr/local/lib/mecab/dic/ipadic
dicdir =  /usr/local/lib/mecab/dic/mecab-ipadic-neologd
```

### 2.環境変数`MECABRC`に1で編集した`mecabrc`のパスを代入する

```
% nano ~/.zshrc

#下記を追記
export MECABRC=/usr/local/etc/mecabrc
```

ターミナルを再起動（または`source ~/.zshrc`）したあと、「インスタ映え」などの新語が一単語として認識されれば成功です。

```
% python
>>> import MeCab
>>> MeCab.Tagger().parse('インスタ映え')
'インスタ映え\t名詞,固有名詞,一般,*,*,*,インスタ映え,インスタハエ,インスタハエ\nEOS\n'
```
# 補足(興味ある人向け）
以下、余談ですが、「`MECABRC`という環境変数を設定する」という解決方法だけわかっても今ひとつピンとこなかったので、ライブラリソースも参照しつつ、mecab-python3のデフォルト辞書がどのように決定されているのか調べてみました。不正確な点や補足すべき情報があればご指摘いただけると幸いです。

下記のサイトが参考になりました。
https://pypi.org/project/mecab-python3/

このサイトよると`mecab-python3`はipa辞書のコピーをパッケージ内にもっていて、デフォルトではその辞書を使うようです。

ためしに僕の環境（pyenvで管理しているpipでmecab-python3をインストール）でのMeCabライブラリをみてみます。

```
% cd ~/.pyenv/versions/3.8.0/lib/python3.8/site-packages/MeCab
% ls
_MeCab.cpython-38-darwin.so
__init__.py
__pycache__
dic
mecabrc.in
```

ここにある`dic`がpythonから呼び出すMeCabがデフォルトで参照する辞書です。同様に設定ファイルは`mecabrc.in`の情報を使っています。

これらのファイルをデフォルト値として参照する手続きは`__init__.py`にかかれています。（下記、5、6行目)。

```Python:__init__.py
def _init_bundled_info():
    global BUNDLED_DICDIR
    global _BUNDLED_MECABTMPL
    pkgdatadir = os.path.dirname(__file__)
    dicdir = os.path.join(pkgdatadir, "dic")
    mecabtmpl = os.path.join(pkgdatadir, "mecabrc.in")
    if os.path.isdir(dicdir) and os.path.isfile(mecabtmpl):
        BUNDLED_DICDIR = os.path.abspath(dicdir)
        _BUNDLED_MECABTMPL = os.path.abspath(mecabtmpl)
    else:
        BUNDLED_DICDIR = None
        _BUNDLED_MECABTMPL = None
```

またその数行下には以下の記述があり、4行目のif文で`MECABRC`という環境変数がないときにはデフォルト値を使うような挙動になっていることが分かります。

```Python:__init__.py
@contextlib.contextmanager
def _mecabrc_for_bundled_dictionary():
    dicdir = BUNDLED_DICDIR
    if dicdir is not None and "MECABRC" not in os.environ:
        mecabtmpl = _BUNDLED_MECABTMPL
```

したがって`MECABRC`という環境変数を明に設定すると、デフォルトの辞書を変更できるようです。
よくわかっていないのは、環境変数の値（`os.environ['MECABRC']`)を具体的に取得している記述がどこかということですが、`__init__.py`や他のファイルをみてもそういう場所が見つけられなかったので、`pip install`ではダウンロードされないファイルにかかれているのかもしれません。
# おわりに
pythonからMeCabを使うときのデフォルト辞書の変更方法について、自分の環境でうまくいった方法についてまとめました。
ついでにせっかくなので、mecab-python3のソースを読んで、デフォルト辞書がどのように決定されているのか調べてみました。完全な理解には至りませんでしたが、調べる前よりはいくらかスッキリできました。
なにかの参考になれば幸いです。
機械学習 回帰問題の評価方法（平均二乗誤差と決定係数）

○この記事の要点
回帰問題の評価方法について学習したのでメモ。

#○ソースコード(Python)：線形回帰モデルの場合
```ruby:回帰問題の学習と評価
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score
from sklearn.svm import SVR
%matplotlib inline

# データ準備。ボストンの住宅価格
data = load_boston()
X = data.data[:, [5,]] # 説明変数として、部屋数だけを抽出
y = data.target

# 単回帰モデルでの学習
model_l = LinearRegression()
model_l.fit(X, y)
# 回帰直線y=ax + bの傾きと切片の値
print(model_l.coef_) # a：傾き
print(model_l.intercept_) #b：切片

# 予測
l_pred = model_l.predict(X)

# グラフ表示
fig, ax = plt.subplots()
ax.scatter(X, y, color='red', marker='s', label='data')
ax.plot(X, l_pred, color='blue', label='regression curve')
ax.legend()
plt.show()
```
結果
[9.10210898]
-34.67062077643857
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628917/a0147073-9c61-382f-d5ca-3c2a8f961095.png)

それなりな感じ？

# 平均二乗誤差
予測値と実際の値の誤差二乗をすべて計算し、その平均をとったもの。小さいほど予測値が正しい。
※予測する値が大きい場合、相対的に値が大きくなるので、異なる値を比較する場合は単純に大きい／小さいと判断ができない。

```ruby:平均二乗誤差
mean_squared_error(y, l_pred)
43.60055177116956
```

# 決定係数
平均二乗誤差を使って予測の正確さを示す数値。0～1の値になる。異なる値を比較する場合にも相対的に比較できる値となる。

```ruby:決定係数
r2_score(y, l_pred)
0.48352545599133423
```

線形回帰モデルの結果が良い結果なのか。次は他のアルゴリズムも試してみる。
#○ソースコード(Python)：SVRモデルの場合
```ruby:SVRの学習と評価
# SVR(サポートベクトルマシン（カーネル法）)での学習
model_s = SVR(C=0.01, kernel='linear') # 正則化パラメータが0.01で線形カーネルを使用
model_s.fit(X, y)

# 回帰直線y=ax + bの傾きと切片の値
print(model_s.coef_) # a：傾き
print(model_s.intercept_) #b：切片

# 予測
s_pred = model_s.predict(X)

# グラフ表示
fig, ax = plt.subplots()
ax.scatter(X, y, color='red', marker='s', label='data')
ax.plot(X, l_pred, color='blue', label='regression curve')
ax.plot(X, s_pred, color='black', label='svr curve')
ax.legend()
plt.show()
```
結果
[[1.64398]]
[11.13520958]
![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628917/fd0af68a-4e3e-d4fb-dfea-32c43cab9421.png)

SVRの方が微妙？？

```ruby:平均二乗誤差と決定係数
mean_squared_error(y, s_pred)
72.14197118147209
r2_score(y, s_pred)
0.14543531775956597
```
線形回帰の方が優秀。ただし！！SVRのハイパーパラメータ（正則化パラメータやカーネル手法）を変更するとわからない。

#○ソースコード(Python)：SVRモデルの場合
```ruby:SVRの学習と評価（ハイパーパラメータを変える）
model_s2 = SVR(C=1.0, kernel='rbf') # 正則化パラメータが1でrbfカーネルを使用
model_s2.fit(X, y)

# 予測
s_pred2 = model_s2.predict(X)

# グラフ表示
fig, ax = plt.subplots()
ax.scatter(X, y, color='red', marker='s', label='data')
ax.plot(X, l_pred, color='blue', label='regression curve')
ax.plot(X, s_pred, color='black', label='svr curve')
ax.plot(X, s_pred2, color='orange', label='svr_rbf curve')
ax.legend()
plt.show()
```
結果
![ダウンロード (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628917/285dea41-0f53-9c72-72b5-2b389e271ddc.png)

なめらかでいい感じ？？

```ruby:平均二乗誤差と決定係数
mean_squared_error(y, s_pred2)
37.40032481992347
r2_score(y, s_pred2)
0.5569708427424378
```

線形回帰よりも優秀。ハイパーパラメータ次第ということ。

■感想
・回帰問題の評価方法について勉強。平均二乗誤差も決定係数も「予測値と実データの差」を元に良し悪しを決めている。プログラムとしては、「正解データのリスト」と「予測データのリスト」を比較してそれぞれのデータで差を出して二乗して平均出してる。感覚的にわかりやすい。
sprockets::rails::helper::assetnotfound エラーの原因

完全にメモベースですが、念のため記録。

【原因】
追記してあった”the asset "no_image.jpg" is not present in the asset pipeline.”の表記の通り、no_image.jpgがフォルダーに追加されてなかったため。

フォルダーに追加後、無事解決。

以下その際に記述した周辺コード。

<%= form_for(@user) do |f| %>
    <%= f.text_field :username, autofocus: true, placeholder:"名前"%>
    <%= attachment_image_tag @user, :profile_image, :fill, 60, 60, fallback: "no_image.jpg"%>
    <label class="control-label sr-only" for="inputEmail">ProfileImage</label>
    <%= f.attachment_field :profile_image, placeholder: "プロフィール画像" %>
    <%= f.submit "保存" %>
<% end %>
Apache + Django + Shibboleth on Windows Server 2016 関連記事まとめ

#目的
題名に関係する記事をいくつか書いたが、見通しが悪くなってきたので一旦まとめる。



#1. [Django + Apache with mod_wsgi on Windows Server 2016](https://qiita.com/hiro-jp/items/5bdc11dada4e0fccf97f)
ApacheとDjangoを接続する方法を説明した。この段階ではShibbolethは関係ない。

その中で遭遇するInternal Server Errorについて説明したのが、[mod_wsgi 500 Internal Server Errorの対処法](https://qiita.com/hiro-jp/items/03a1718c6a524920de30)。

その後、ほぼ必ず躓くことになるstaticファイルの利用について説明したのが、[Django staticファイルをデプロイ環境で利用する方法](https://qiita.com/hiro-jp/items/8d467ccd9e945db864c2)。

#2. [Apache + OneLogin SSO with Shibboleth](https://qiita.com/hiro-jp/items/096bbaf647a9e4a3ae18)
Apache上でShibbolethを用いてSAML認証を実装する方法を、OneLogin IdPへの接続を例に説明した。

Shibbolethに備わっている便利ツールに軽く触れたのが [Shibboleth便利ツール](https://qiita.com/hiro-jp/items/cbec4a7ebfa12e1f4109)。

#3. [Django + Shibboleth with RemoteUserMiddleware](https://qiita.com/hiro-jp/items/9d5a20baebc1c7d8f911)
Shibboleth認証でIdPから提供されたAssertionを用いて（自動的に）Djangoのログインを行う方法を説明した。

その中で遭遇するValueErrorについて説明したのが [ValueError at set_wakeup_fd only works in main thread の対処法](https://qiita.com/hiro-jp/items/1a15ac51165f5af395f3)。

[RemoteUserMiddlewareとDjango認証を併用する方法](https://qiita.com/hiro-jp/items/e29b514ddf17045d3bd3)の解説を分離した。

[Shibboleth SPにおけるIdP独自attributeへの対応方法](https://qiita.com/hiro-jp/items/cbf1a8ec68132dd25b85)の解説を分離した。

また、RemoteUserMiddlewareを改造してログイン時にID情報以外の部分も更新できるようにする方法を説明したのが [Django RemoteUserMiddleware ログイン時にユーザ情報を更新する方法](https://qiita.com/hiro-jp/items/4ca6d8c9c9a0690b4d7b)。
JavaScriptの関数の理解

##関数とは
処理に名前をつけてまとめているもの。

###関数には大きく分けて２つ
・JavaScriptにデフォルトで用意されている関数
・自作の関数

##基本のかたち

よく使われているfunction()は関数を定義する時の基本のようなものです。

```main.js
  //シンプルに書くとこんな感じ
function 関数名(){
  処理
}

  //関数を実行する時はこんな感じ
  関数名();
```
###シンプルな例
```main.js
//helloConsoleは自作の関数
function helloConsole() {
  console.log("こんにちは");
}

//関数を実行する
helloConsole();
```

そうすると

```
こんにちは
```

コンソールに「こんにちは」が表示されます。

###引数を受け取る関数を追加した例

```main.js
//()内には引数を追加
function helloConsole(name) {
  console.log( `こんにちは、${name}さん！`);
}

//関数を実行する
helloConsole("一郎");
helloConsole("二郎");
```

コンソール内

```
こんにちは、一郎さん！
こんにちは、二郎さん！
```

###応用（引数を受け取って戻り値を返す）

```main.js

function size(length) {
  return length * length;//引数をかけて戻り値として返す
}

const result = size(5); //戻り値をresult変数に代入
console.log(result)
```

コンソール内

```
25
```
YOLOv3(TensorFlow 2.1)で自分のモデルをトレーニングする

## 目的
自分のモデルをトレーニングして火事を認識できる
![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632066/f3a911f2-e17b-eaad-d153-be638a710573.jpeg)


## 事前用意
~~[windowsでYOLOv3(TensorFlow 2.0)で物体検出（CPUバージョン）](https://qiita.com/plseal/items/1c61098925c6468bde46)~~

[windowsのGPUでYOLOv3(TensorFlow 2.1)で物体検出をやってみた！](https://qiita.com/plseal/items/a6417bd3b8058a77ad4f)

※CPUのトレーニング速度は遅いのため、GPUでトレーニングする。


## training用写真用意
https://pan.baidu.com/s/1G2Qh-V8kyLOq4oDbTwK6HQ
提取码（パスワード）:vogw
ファイルは「yolo_tf2\VOCdevkit_fire\VOC2012\JPEGImages」

## labelImg.exeでラベル
上記「yolo_tf2\VOCdevkit_fire\VOC2012\Annotations」の資材流用

## tools/voc2012.py修正

下記ファイル名はfire_開始しているのため、修正必要
yolov3-tf2\VOCdevkit_fire\VOC2012\ImageSets\Main\
fire_train.txt
fire_val.txt

```
# ９６行目
        FLAGS.data_dir, 'ImageSets', 'Main', 'fire_%s.txt' % FLAGS.split)).read().splitlines()
```

## tfrecordファイル作成(train and val)

```
python tools/voc2012.py --data_dir ./VOCdevkit_fire/VOC2012 --split train --output_file ./data/voc2012_train_fire.tfrecord --classes ./data/fire_voc2012.names

python tools/voc2012.py --data_dir ./VOCdevkit_fire/VOC2012 --split val --output_file ./data/voc2012_val_fire.tfrecord --classes ./data/fire_voc2012.names
```

## tfrecordファイル作成の確認

```
(keras_work) C:\temp\yolov3-tf2\data>dir /B *.tfrecord
voc2012_train_fire.tfrecord
voc2012_val_fire.tfrecord
```

## トレーニング
--epochs 20:トレーニング回数

```
cd..

python train.py --dataset ./data/voc2012_train_fire.tfrecord --val_dataset ./data/voc2012_val_fire.tfrecord --classes ./data/fire_voc2012.names --num_classes 1 --mode fit --transfer darknet --batch_size 4 --epochs 20 --weights ./checkpoints/yolov3.tf --weights_num_classes 80
```

## windows7のGPU使用率確認
http://www.elsa-jp.co.jp/support/download/driver/elsa_system_graph/

## GPUでトレーニング時間
20分

## 自分のモデルの確認
```
python detect.py --classes ./data/fire_voc2012.names --num_classes 1 --weights ./checkpoints/yolov3_train_19.tf --image ./fire.jpg
```
--weights ./checkpoints/yolov3_train_19.tf
※自分でトレーニングしたのcheckpointを指定（最大の番号19を指定）


## 確認結果
```
I0505 22:21:46.660045  7024 detect.py:35] weights loaded
I0505 22:21:46.662045  7024 detect.py:38] classes loaded
I0505 22:21:47.962119  7024 detect.py:55] time: 1.21506929397583
I0505 22:21:47.963119  7024 detect.py:57] detections:
I0505 22:21:48.174131  7024 detect.py:66] output saved to: ./output.jpg
```
detections:内容なし？認識できないみたい

output.jpg
![output.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632066/3da86993-eb02-7f4f-26a0-f68411c1fedb.jpeg)

認識できない？yolo_score_threshold 指定必要


```
python detect.py --classes ./data/fire_voc2012.names --num_classes 1 --weights ./checkpoints/yolov3_train_19.tf --image ./fire.jpg --yolo_score_threshold 0.3
```

output.jpg
![output.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632066/a5fb8394-6ba8-ad19-1ef3-571663e53abe.jpeg)
Laravel + DockerでMailHogの使用

Laravelを用いてメール送信の確認をしたいとき、homesteadに同梱されているMailHogを使用して確認したいとき
ドキュメント：https://readouble.com/laravel/6.x/ja/homestead.html
参考：https://qiita.com/munimuni/items/b902f2c3ec643ed78e4a


laravelプロジェクト内の `.env`を編集
 
```/laravelプロジェクト/.env
MAIL_DRIVER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=root  # 任意
MAIL_PASSWORD=root  # 任意
MAIL_ENCRYPTION=null
```

MailHogをローカルで起動
`docker-compose up -d mailhog`
起動後、ポート番号`8025`でMailHogを開き、laravelからテスト実行
【Laravel】Laravel Modelからデータを取得し表示する方法

#①ControllerにてModelからデータを取得しViewに渡す

▪︎Controllerファイル開く
エディタでControllerファイルを開く

```
（公式）
app/Http/Controllers/[コントローラ名].php
（例）
app/Http/Controllers/TestController.php
```

▪︎ControllerにてModelからデータを取得しViewに渡す

```php:app/Http/Controllers/TestController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Test;

class TestController extends Controller
{
    //
    public function index() {
        $values = Test::all();

        // dd($values);

        return view('tests.test', compact('values'));
    }
}
```

#②Viewにてデータを表示

▪︎Viewファイル開く
エディタでViewファイルを開く

```
（公式）
resources/views/[ビユー名].php
（例）
resources/views/tests/test.blade.php
```

▪︎Viewにてデータを表示

```php:resources/views/tests/test.blade.php
@foreach($values as $value)
{{$value->id}}<br>
{{$value->text}}<br>
@endforeach
```
【VRChat】VRChat SDKのアバターアップロードが出来ない場合

環境メモ
Unity開発環境　MacBookPro
⭐️Mac OS Mojave バージョン10.14

VRChat環境
⭐️Windows 10 ノートPC

# ランク
UnityでVRChat SDKを使って、VRChatのアバターをアップロードするために、VRChatにログインすると下記のエラーが出て、アップロードができない場合、ここはひとまず、OKを押して、ダイアログを閉じます。
<img width="521" alt="スクリーンショット 2020-05-05 17.32.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/774160d3-1a79-cf50-7fdd-882fcb640fbb.png">

<img width="527" alt="スクリーンショット 2020-04-30 1.50.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/b55dce61-5e63-cde7-8ada-8903fce611f8.png">


VRChat SDK
Welcome the VRChatSDK!
Before you can upload avatars or worlds to VRChat, you'll need to spend more time enjoying the app. We do this for security reasons, and so you can learn more about us.
When you get the ability to upload, we will notify you via email and in VRChat. For now, you can learn and test on your own device.
To get started, check out the resources below.
Thank you for your patience, we can't wait to see what you'll build!


ランクがビジター（VISITOR）の場合、アバターのアップロードができないようです。
New User以降からアバターのアップロードが可能となります。
ある程度、VRChatで遊んで、友達（友達申請）を作ると、New Userにランクアップします。

<img width="1064" alt="004.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/7b61183b-9892-a5f9-63f1-46c7b24c272e.png">

VRChatの　[JP] Tutorial World　で教えて頂きました。
↓チュートリアルワールドの壁をスクショで撮影しました。
なるほどぉ(o￣▽￣o) 
![VRChat_1920x1080_2020-05-03_21-37-50.078.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/0db1407f-40af-cecf-4588-c40ced8b7533.png)



自分のランクの確認方法はメニューを出して、
Social >  自分のアバターを選択します

名前の下に、ランクがのっています。
<img width="453" alt="005.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/0c0661a3-ecc2-59d4-6fcd-1d7aaebe81a2.png">


#　Future Proof Publish
下記エラーで、アップロード出来ない場合

<img width="431" alt="スクリーンショット 2020-05-05 2.18.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/cfd21600-99be-f5eb-6ab3-85c2a58a0f50.png">

VRChat SDK
Error updating content. Unity package upload failed.Failed to optimize file fo upload.

VRChat SDK の「Settings」タブの「Future Proof Publish」のチェックをオフにする
<img width="562" alt="スクリーンショット 2020-05-05 18.00.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/2afd39f0-803e-2a1d-5094-3cfde8801531.png">

# 「Build & Publish」でエラーになる
ビルド出来ない場合、
Unity Hubで「Windows Build Support(Mono)」を選択する必要があります。
VRChatは、これがないと、ビルドできない。
<img width="978" alt="009.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/8f5e72cd-3f8f-0f56-9768-c860c4d486b8.png">

#同じモデル名の場合、エラーとなる
下記のエラーが出る場合は、名前の重複がある場合に出ます。

<img width="424" alt="スクリーンショット 2020-05-05 18.09.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/bf623562-2844-f035-c7af-495520c159ef.png">

VRChat SDK
Error saving blueprint.

Content Manager > 重複しているなら、Deleteを選んで、削除する
<img width="517" alt="スクリーンショット 2020-05-05 18.15.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/b69900c0-ce1a-1964-38de-023eb12e84f6.png">

<br>
【VRChat】Blenderで作ったモデルをUnityからVRChatにアバターをアップロードする方法
https://qiita.com/nonkapibara/items/0a366ff86e97d690feac
素人基盤エンジニアがDockerでDjangoを触るシリーズ④：urls.py

# TL;DR
[素人基盤エンジニアがDockerでDjangoを触るシリーズ③：django admin](https://qiita.com/LittleGreenMen/items/85d41c1fa6bb9bf4da42)の続き。
１から読みたい場合は↓こちら。
[素人基盤エンジニアがDockerでDjangoを触るシリーズ①：DockerでDjangoを作る](https://qiita.com/LittleGreenMen/items/660c27669214da1c9613)
今回も[Django Girls](https://tutorial.djangogirls.org/ja/)のサンプルを作りながらdjangoと戯れる。
ユーザがアクセスしてきたURLによって処理を行うviewを決定するために使う、urls.pyというファイルについて学ぶ。元々その③と一緒に投稿しようとしていたが長すぎて分割したという経緯もあり、短めな回。


# urls.py
ユーザがアクセスしたURLに対してどのviewで処理するかを決めるために、urls.pyというファイルを編集してマッピングを行う必要がある。
第三回までの手順をなぞっていると、`http://IPADDRESS:8000`にアクセスしたとき、まだロケットのページが見えていると思うが、これはurls.pyを編集していないため。（TemplateやViewも必要だが。。）

### ①プロジェクトのurls.pyの編集
#### urls.py
さっそく編集しよう。…と思ったところで異変に気付く。
下記はデフォルトのurls.py。

```python:composeexample/urls.py
from django.conf.urls import url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
]
```
django 1.X系では、URLを指定する際、`django.conf.urls.url`というメソッドを使い、正規表現を利用してURLを表現してやる必要があった。django 2.X系からはパスコンバータという機能が備わっていて、正規表現を使わないでもこのファイルを記載できるようになっているらしいのだが、私の環境ではなぜかデフォルトのひな型が1.X系のものになっているようだった。
Django Girlsのサンプルも2.X系の書き方になっているし、どちらかといえば新しいほうがいいだろう。。
今回起動しているdjangoのバージョンは2.2.12なので、パスコンバータは問題なく動作するはず。ということで中身をそっくりそのまま下記に書き換えてしまう。

```python:composeexample/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog.urls')),
]
```

#### よくわかる解説

```python
from django.contrib import admin
```
デフォルトのadmin画面のモデルを指定する際に利用するモジュール。

```python
from django.urls import path, include
```
pathは前述したパスコンバータを利用するためのメソッド。1.X系のurlと比べて、正規表現を利用せずに指定できていることがわかる。
includeは、別のurlsファイルへ転送するためのメソッド。blogに関する設定はできる限り一つのディレクトリにまとめたほうがわかりやすいということもあり、今回はルートパスへのアクセスはすべて`blog/urls.py`に記載した設定を反映することとする。

### ②アプリケーションのurls.pyの編集
#### urls.py
ということで、blogディレクトリの下に新しくurls.pyというファイルを作成し、下記の通り記載する。

```python:blog/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.post_list, name='post_list'),
]
```

#### よくわかる解説
```python
from . import views
```
同一ディレクトリ上のviews.pyをimportする。

```python
urlpatterns = [
    path('', views.post_list, name='post_list'),
]
```
ルートパスにアクセスが来た場合、views.pyの中の、post_listで処理を行う。

もちろん、post_listなぞまだ作ってすらいないので、この状態で起動をするとエラーが発生する。

次回はお待ちかねのViewを作成していく。あと少しでwebアプリケーションが出来上がる予定なので、頑張っていこう。
[つづく](https://qiita.com/LittleGreenMen/items/1d11d1ed8c7e4b2094e0)
エクセルファイルから値を取得する

```vba:openFile.vba
Sub openFile()

    'ファイルパスの取得
    Dim strPath As String
    strPath = Sheets("Sheet1").Range("B2").Value 'C:/test/
    Debug.Print (strPath)
    
    '現ブックのシートを取得
    Dim workSheetData As Worksheet
    Set workSheetData = ThisWorkbook.Worksheets("Sheet1")

    'FileSystemオブジェクト変数の準備
    Dim objFSO As Object
    Set objFSO = CreateObject("Scripting.FileSystemObject")

    'ファイル一覧を格納するオブジェクト変数
    Dim objFileList As Object
    Set objFileList = objFSO.GetFolder(strPath).files

    'ファイルを格納するオブジェクト変数
    Dim file As Object
    
    'ファイルパスの全ファイル
    For Each file In objFileList

        'ファイルを開く
        Dim wb As Workbook
        Set wb = Workbooks.Open(file, ReadOnly:=True)

        'シートのセルを取得
        Dim s As String
        s = wb.Worksheets("Sheet1").Cells(1, 1).Value
        's = Worksheets(1).Range("A1").Value
        's = wb.Worksheets(1).Cells(1, 1).Value
        Debug.Print (s)

        workSheetData.Cells(1, 1).Value = s

        '保存せずに閉じる
        Call wb.Close(SaveChanges:=False)

    Next file

End Sub



```
MacでISOを焼いてブート可能なUSBを作る

しばしば忘れるので、備忘録として…

# 実行時の環境

macOS 10.14.6 Mojave

# 準備

- iTerm2などのコンソールが利用できること
- 対象ISOイメージはカレントディレクトリにあるものとして、予めcdしておくこと

# USBメモリのフォーマット

USBメモリを接続し、ディスクの一覧を取得します。

```
$ diskutil list
```

今回は16GBのメモリを接続したので、対象のディスクは `/dev/disk2` となります。

```
/dev/disk0 (internal):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                         251.0 GB   disk0
   1:                        EFI EFI                     314.6 MB   disk0s1
   2:                 Apple_APFS Container disk1         250.7 GB   disk0s2

/dev/disk1 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +250.7 GB   disk1
                                 Physical Store disk0s2
   1:                APFS Volume Macintosh HD            47.7 GB    disk1s1
   2:                APFS Volume Preboot                 46.3 MB    disk1s2
   3:                APFS Volume Recovery                510.5 MB   disk1s3
   4:                APFS Volume VM                      3.2 GB     disk1s4

/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.9 GB    disk2
   1:             Windows_FAT_32                         15.9 GB    disk2s1
```

対象ディスクを `MS-DOS` 形式でフォーマットします。

```
$ diskutil eraseDisk MS-DOS UBUNTU /dev/disk2
```

仕様上、マウントポイントとするボリューム名を省略できません。
今回は ubuntu 20.04 のイメージを焼くので、適当に `UBUNTU` とします。
(ちなみにディスクユーティリティのデフォルトは `UNTITLED` なので、この辺はお好みで…)

出力例…

```
Started erase on disk2
Unmounting disk
Creating the partition map
Waiting for partitions to activate
Formatting disk2s2 as MS-DOS (FAT) with name UBUNTU
512 bytes per physical sector
/dev/rdisk2s2: 30522224 sectors in 1907639 FAT32 clusters (8192 bytes/cluster)
bps=512 spc=16 res=32 nft=2 mid=0xf8 spt=32 hds=255 hid=411648 drv=0x80 bsec=30552064 bspf=14904 rdcl=2 infs=1 bkbs=6
Mounting disk
Finished erase on disk2
```

# ISOイメージの書き込み

ddを使うので、対象ディスクは先にアンマウントしておきます。
アンマウントしないと `Resource busy` と怒られてしまいます。

```
$ diskutil unmountDisk /dev/disk2
```

ddは sudo で実行する必要があります。

```
$ sudo dd if=./ubuntu-20.04-live-server-amd64.iso of=/dev/rdisk2 bs=16m
```

### ofオプションについて

**/dev/rdisk2** と指定しています。

両者の違いは、

- disk … 通常のランダムアクセス
- rdisk … シーケンシャル(順次)アクセス

ということです。ddでランダムアクセスをしてしまうと<font color="red">**激遅**</font>になります…

### bsオプションについて

転送バイト数を指定しますが、**デフォルトは512バイト**です。
効率が悪いはずなので、ある程度上げます。

USB2.0 の実効上の最大転送速度が 40MB/s くらいなので、その半分弱程度…ということで適当に `16m` としています。

どうしても遅ければ環境に合わせた検証が必要なはずですが……

出力例…

```
56+1 records in
56+1 records out
952107008 bytes transferred in 28.497026 secs (33410750 bytes/sec)
```

私の環境では、950MBで30秒弱でした。
結果を見ると、転送速度は自動調整されているみたいですね。。

# USBの取り出し

完了したら、USBは取り出します。

```
$ diskutil eject /dev/disk2
```

エラー表示も出ると思うので、そちらの画面のボタンから取り出しても大丈夫です。
![boot_usb_error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631706/060ab8d2-18ed-a5ea-642a-397a005a33aa.png)

Fin ❤︎
Synergy使用時にUbuntuデスクトップのマウスポインタが表示されない

# 背景

SynergyのクライアントPC(Ubuntu)にマウスを接続していないと、Synergyサーバからポインタを移動させてもマウスポインタが表示されない(マウス操作は可能)。対策方法を忘れてしまうので備忘録として残します。

# 対策
```bash
$ gsettings set org.gnome.settings-daemon.plugins.cursor active false
```
PhpStorm／WebStormのLiveEditを活用しよう！リアルタイム反映でコーディング効率アップ！

HTMLやCSSの動作確認をしたい時、

 - ソースコードを書く
 - ウインドウを切り替えてブラウザリロード

この繰り返しが面倒くさい。
かと言ってGulpのようなタスクランナーを準備するのも面倒くさい。
そんな面倒マンにうってつけなのが、PhpStormやWebStormに搭載されている「Live Edit」。

この機能、**ソースコードを書くと、ブラウザ側にリアルタイムで反映されます！**
設定にかかる時間もわずか5分程度。
これから学習を始める方、サクッと動作確認をしたい時にめちゃくちゃ便利な機能をご紹介します。

## この記事によって実現できること
まずはこちらをご覧ください。
左側にPhpStorm、右側にChromeのウインドウを並べたものです。

![May-05-2020 18-41-33.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632153/1fa6e9fb-4061-2208-9048-e8715afb2fca.gif)

編集しているファイルはスタイルシートですが、エディタで加えた変更点がすぐ反映されているのがわかります。

## 設定方法
プラグインをインストールするだけで設定完了します。
> 使用したソフトウェア：Php Storm
> バージョン：PhpStorm 2019.3.4　Build #PS-193.6911.26, built on March 18, 2020


### PhpStormに「LiveEdit」のプラグインをインストール
Php Storm > Preferencesを選択し、設定画面に遷移します。
<img width="1111" alt="スクリーンショット 2020-05-05 18.34.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632153/f48ae5dd-e5a8-02b1-2b0f-353c9e5d4038.png">


左側からPluginを選択し、検索窓に「live」を入力。
「LiveEdit」（※日本語化している場合は「ライブ編集」）」を選択してインストール、PhpStormを再起動します。
<img width="1112" alt="スクリーンショット 2020-05-05 18.35.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632153/58085278-3bb4-504d-c1f0-ff32aca8f049.png">


### デバッグ実行
対象ページを選択し、デバッグで実行。
自動でChromeのブラウザが立ち上がり、以降はソースコードに手を加えると、リアルタイムで反映されます。
<img width="1112" alt="デモ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632153/0c918964-bf0e-b469-dde4-271df5169e7b.png">


## まとめ
HTMLやCSSをこれから学習する方、またサクッと動作確認したい時にはとても便利な機能です。
PhpStormやWebStormをお持ちの方、ぜひお試しください。
【Quiver】テーマの変更・初期設定・基本操作

#Quiverについて

Qiitaだと、下書きが10個までしか保存できなかった。

記事として残したい事を下書きとして、ちょくちょく記録していくとすぐにいっぱいになり、下書き新規作成ボタンが押せなくなる、、

そこでマークダウンが使えるノートアプリを検索すると、こちらの[**Quiver**](<http://happenapps.com/>)が無料でも使える事がわかった。


#テーマの変更・初期設定

Preferencesから、Themesを選択。すでに用意するものから選択することもできるし、**Duplicate**（コピーする）を選択して、そのコピーしたものの中身を**Edit**で編集することも可能。


<img width="437" alt="スクリーンショット 2020-05-05 19.35.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597926/b4bedbce-9e2b-238a-7785-937cce645466.png">



また、このアプリでは、以下の様にまずセルを選択しその中にコード等を書いていく。

<img width="120" alt="スクリーンショット 2020-05-05 19.35.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597926/29695f6b-fdec-33f3-8dc7-6c52051f515a.png">


基本的にすべてマークダウンで書いてしまって問題ないので。
**General**タブで初期設定を**Markdown Cell**にする。
<img width="435" alt="スクリーンショット 2020-05-05 19.35.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597926/17a1ff4a-8894-e3fc-2d30-3e35fdd8b861.png">


**Gesture**の'Swipe to change layout'にチェックを入れておくと、2本指でサイドバーの表示非表示を切り替えることができる。
<img width="437" alt="スクリーンショット 2020-05-05 19.36.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597926/642b723d-0f3d-ce19-0a87-08566b2b950f.png">

#主な操作

**⌘+n**: で新規記事作成
**⌘+f**: 開いているノートから検索
**⌘+⌥+f**: 全てのノートから検索

#終わりに。
最後まで読んで頂きありがとうございます:bow_tone1:
転職の為、未経験の状態からRailsを学習しております。正しい知識を着実に身に着け、実力のあるエンジニアになりたいと考えています。継続して投稿していく中で、その為のインプットも必然的に増え、成長に繋がるかと考えています。
今現在、初心者だからといって言い訳はできないですが、投稿の内容に間違っているところや、付け加えるべきところが多々あるかと思いますので、ご指摘頂けると幸いです。この記事を読んで下さりありがとうございました。
MDB   自分用リンク集

https://mdbootstrap.com/docs/jquery/forms/basic/
↑
MDBでフォームを作る際のサンプル

https://webst8.com/blog/bootstrap4-form/
↑
form-control,form-group　などのクラスの使い道と使い方の説明

#ただの気付き
class名「md-form」って**M**aterial **D**esign の　Formってことか！
Resilience4j の RateLimiter を用いた Rate-Limitting

https://github.com/resilience4j/resilience4j

resilience4j は主に Java 向けの Circuit Breaker 実装として著名なものになる。Rate-Limitting 関連の機能も存在している。

https://github.com/resilience4j/resilience4j#ratelimiter



以下では以下のサンプルプログラムをベースに検証を行っている。

https://github.com/resilience4j/resilience4j-spring-boot2-demo

# Configuration
## build.gradle

Spring Boot と連携をする場合は `io.github.resilience4j:resilience4j-spring-boot2` を使用する。

```
dependencies {
        compile('org.springframework.boot:spring-boot-starter-webflux')
        compile('org.springframework.boot:spring-boot-starter-actuator')
        compile('org.springframework.boot:spring-boot-starter-aop')

        compile("io.github.resilience4j:resilience4j-spring-boot2:${resilience4jVersion}") // <-
```

## application.yml
```
resilience4j.ratelimiter:
    configs:
        default:
            registerHealthIndicator: false
            limitForPeriod: 3
            limitRefreshPeriod: 2s
            timeoutDuration: 0
            eventConsumerBufferSize: 100
    instances:
        backendA:
            baseConfig: default
        backendB:
            limitForPeriod: 6
            limitRefreshPeriod: 500ms
            timeoutDuration: 3s
```
`limitForPeriod: 3` , `limitRefreshPeriod: 2s` だと、２秒以内に３回を超えるアクセスがあると Rate-Limitting が行われる。


## Java
Rate-Limitting を設定する処理に、＠RateLimiter アノテーションを設定する。

```
    @Override
    @RateLimiter(name = BACKEND_A) // <--
    @CircuitBreaker(name = BACKEND_A)
    @Bulkhead(name = BACKEND_A)
    @Retry(name = BACKEND_A)
    public String success() {
        return "Hello World from backend A";
    }
```

# Running
今回の設定では、２秒間に３回を超えるアクセスをすると500エラーが返却される。

## 通常時（200）
```
< HTTP/1.1 200 OK
< Content-Type: text/plain;charset=UTF-8
< Content-Length: 26
< 
* Connection #0 to host localhost left intact
Hello World from backend A
```

## Rate-Limit 時（500）

```
< HTTP/1.1 500 Internal Server Error
< Content-Type: application/json
< Content-Length: 235
< 
{
  "timestamp" : "2020-05-05T09:23:13.530+0000",
  "path" : "/backendA/success",
  "status" : 500,
  "error" : "Internal Server Error",
  "message" : "RateLimiter 'backendA' does not permit further calls",
  "requestId" : "b372ed49"
}
```

内部的には `RequestNotPermitted` という RuntimeException が発生するため、Controller 層などで適切なエラーハンドリングと HTTP StatusCode の返却処理をする必要がある。

# Monitoring
`/actuator/ratelimiters` で Rate-Limit 関連の設定内容を取得することができる。

```
{
  "rateLimiters" : [ "backendA", "backendB" ]
}
```

# Conclusion

resilience4j ならびに resilience4j-spring-boot2 を用いると、かなり簡単に既存の Spring Boot アプリケーションに Rate-Limiting の機能を追加することができる。

bucket4j との差は、URL の Path やユーザー単位の Rate-Limitting 処理は標準では対応していないこと、になります。

本格的に Rate-Limiting の処理をシステム全体に適用する場合は、Ambassador Pattern や Side-Car Pattern を用いて API Gateway のミドルウェアを導入した方が望ましいと思います。
Django staticファイルをデプロイ環境で利用する方法

#問題
Djangoアプリを作成した際、runserver環境では問題ないのに、デプロイ環境ではstaticのcssが読み込まれず、殺風景なHTMLが表示される。原因と対処法は他記事にて詳しく解説してくれているので、ここでは自分用のメモを残すことを目的とする。

例）殺風景なadmin画面：
![ss21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117020/bac666f6-4fb3-96e6-95d5-235719244cab.png)

例）正常なadmin画面：
![ss22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117020/6650f3bc-0f91-dfae-1e9e-468d18996b6f.png)

#環境
- Windows Server 2016
- Apache 2.4
- Django 3.0

#原因
Djangoではrunserver環境とapacheなどの本番環境で、staticの保管場所が原則異なる。これについては下記が詳しい。
- [Djangoのstaticファイルが404から復活した話](https://qiita.com/ShortArrow/items/d9377f2453e2cf9314be)
- [djangoは誰が動かしているのか？（デプロイのための俯瞰）](https://qiita.com/ming_hentech/items/9e21fe175988448e204b)

#対処法
設定変更。最終的には下記のようにすることになる。

##STATIC_URL
Djangoからstaticファイルにアクセスするurlを決める。`/static/`とすると、Djangoのappnameというアプリのtemplate上でstaticファイル`{% static 'css/base.css' %}`は、HTML上では`http://localhost/static/appname/css/base.css`とレンダリングされる。

```python:settings.py
STATIC_URL = '/static/'
```

##STATIC_ROOT 
次の`collectstatic`を実行するにあたって、staticファイルを集める場所を指定する。

```python:settings.py
STATIC_ROOT = 'D:/static/shib_test/static/'
```

##collectstatic
runserver環境では、配布性の観点からそれぞれのappがstaticフォルダを持っており、Djangoはそこにアクセスしている。一方、デプロイ環境ではセキュリティの観点から公開用staticファイルは一箇所で提供するのが普通。`collectstatic`は、それぞれのappが持っているstaticファイルをSTATIC_ROOTで指定したディレクトリに集めてくる。

```console:console
> python manage.py collectstatic
```

##Alias /static/

```httpd.conf
Alias /static/ D:/static/shib_test/static/ # ←追加
```
Apacheに対して、例えば`http://localhost/static/appname/css/base.css`へのGETリクエストがあった場合に、ディスク上のどのリソースを読みに行けばいいか指定する。

以上。
Windows10でAnaconda python環境構築

#Windows10にpython環境を整える

今回はAnacondaをインストールしてpython3.7の開発環境を整えた。

Anaconda 環境のインストールは以下を参考に行った。
[参考URL](https://sukkiri.jp/technologies/ides/anaconda-win_install.html)

##１．仮想環境を作成
Anaconda Promptを起動して仮想環境を作成

```
$conda create --name DL python=3.7
```

##２．仮想環境を有効化
```
$conda activate DL
```
##３．必要なパッケージのインストール
とりあえずjupyterlab, numpy, matplotlib

```
$pip install jupyterlab

$pip install numpy

$pip install matplotlib
```
##４．Jupyter Lab 起動

```
$jupyter lab
```

##５．確認 Hello world
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631693/e540d798-4ceb-e960-2c76-3da02cb707de.png)
vue-cli-service serve実行時に途中で処理が止まる

#1.事象
vue-cli-service serve を実行時にビルドが途中で止まる。止まる場所は毎回異なる。（毎回40%前後)
node.jsプロセスはCPU使用率は15％くらいで常に動き続けているが、何も変化はない。
![2019-07-29_20h07_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338998/6e22f964-26bf-9eb8-4a17-758b186e5286.png)

vue-cli-service buildは問題なく実行できる。
nodeを再インストールしても解決せず。

#2.原因
vueファイルのコンパイルエラー。
自分の場合は、使用していたElementUIのタグを配置が悪かったみたいです。

#3.解決
該当箇所を修正。
エラー箇所は地道に探すしかないかもですね。
うーーん。。

#4.参考
https://stackoverflow.com/questions/56219332/vue-js-stuck-on-serving-at-40-how-to-recover
Whitelabel Error Pageの解決方法 

#経緯
現場で初めてSpringを使うことに。自宅でもいじらないと。
まずお決まりのHello Worldから

#何これ・・・
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287651/069ef333-d258-24e9-5e2e-4fd1a720f19b.png)


#ググってみた
どうやらMVCでいうところのControllerでエラーになっているらしい。
エラーが発生したのに、エラーが発生したよ～と表示させる画面部分がないといわれているみたいだ。
とりあえずtemplatesフォルダにerror.htmlを作ってみる。



![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287651/11877b41-8adf-dd43-eda3-7f1f0974e496.png)


一応解決したけど、本来の目的は世界に挨拶することなんだよね

#根本的な解決
どうやらControllerが含まれているフォルダの位置がおかしいようで。
mainクラスが入っているフォルダにControllerが含まれているフォルダを移動させた。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287651/042afa3e-2e17-efb5-0ef1-e23f72bae019.png)


#こんにちは、世界！
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287651/f55c63b2-2ac6-6ff6-857e-8d5f8278ec25.png)


#参考文献・サイト
http://hxn.blog.jp/archives/19187397.html
https://pointsandlines.jp/server-side/java/spring-boot-controller-load-error