OmniAICreator/Qiita-1.07M huggingface dataset:
Bootstrap4 Carouselでサムネイル画像を表示

最近はもっぱらBootsrap4をメインにコーディングしています。
Carouselでサムネイル画像を表示する方法を探してみたのですが、見つからなかったので。
インジケータ付きのサンプルのコードは

```
<div id="carouselExampleIndicators" class="carousel slide" data-ride="carousel">
  <!-- インジケータの設定 -->
  <ol class="carousel-indicators">
    <li data-target="#carouselExampleIndicators" data-slide-to="0" class="active"></li>
    <li data-target="#carouselExampleIndicators" data-slide-to="1"></li>
    <li data-target="#carouselExampleIndicators" data-slide-to="2"></li>
  </ol>
  <!-- スライドさせる画像の設定 -->
  <div class="carousel-inner">
    <div class="carousel-item active">
      <img class="d-block w-100" src="images\image001.jpg" alt="slide1">
    </div><!-- /.carousel-item -->
    <div class="carousel-item">
      <img class="d-block w-100" src="images\image002.jpg" alt="slide2">
    </div><!-- /.carousel-item -->
    <div class="carousel-item">
      <img class="d-block w-100" src="images\image003.jpg" alt="slide3">
    </div><!-- /.carousel-item -->
  </div><!-- /.carousel-inner -->
  <!-- スライドコントロールの設定 -->
  <a class="carousel-control-prev" href="#carouselExampleControls" role="button" data-slide="prev">
   <span class="carousel-control-prev-icon" aria-hidden="true"></span>
   <span class="sr-only">前へ</span>
 </a>
 <a class="carousel-control-next" href="#carouselExampleControls" role="button" data-slide="next">
  <span class="carousel-control-next-icon" aria-hidden="true"></span>
  <span class="sr-only">次へ</span>
 </a>
</div><!-- /.carousel -->
```
となっているので、インジケータをサムネイル画像に変えて、表示位置を下にずらせば完成。
画像はimg0001.jpgのサムネイル画像をthumb_img0001.jpgとする。
インジケータのコードにサムネイルを背景画像として表示させるように変更。

```
<li data-target="#carousel-example-generic" data-slide-to="0" class="active" style="background-image: url(./images/thumb_image001.jpg);"></li>
<li data-target="#carousel-example-generic" data-slide-to="1" style="background-image: url(./images/thumb_image002.jpg);"></li>
<li data-target="#carousel-example-generic" data-slide-to="2" style="background-image: url(./images/thumb_image003.jpg);"></li>
```
次にCSSを修正する。
bootstrap4のCSSを読み込んだ後に、独自のCSSを追加して、
以下のコードを追加する。

```
.carousel-indicators{
　 bottom:-150px;
}
        
.carousel-indicators li{
　　width: 332px;　/*サムネイル画像の幅*/
   height: 114px; /*サムネイル画像の縦*/
   background-size:contain;
}
```

最終的には以下の画像のようなサムネイル付きCarouselが完成する。

![sample.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392985/1d3f77de-57e0-f937-0920-cf2b248a940d.jpeg)

プログラムは独学で、文系で業務もマネジメントなので、これが正しいとは言い切れないが
コンポーネントはかなり数が用意されているが、実際にサイトを制作をおこなっていると
既存のコンポーネントだけでは対応しきれいないが、ちょっとしたカスタマイズ方法をおぼえておくと便利かもしれない。
WordPressプラグイン「Favorites」をお気に入りされた総数順に出力する

今回はこちらのプラグインについて。
https://wordpress.org/plugins/favorites/

お気に入りされた総数順の出力は[公式マニュアル](https://favoriteposts.com/)にはありません。
ショートコードは諦めて、テーマ内にPHPを書いて出力しましょう。



## お気に入りされた数を管理画面から見る
Favoritesはお気に入りされた総数をカスタムフィールドで見れるようにしてくれています。
`simplefavorites_count`というキーで登録されています。

ちなみに数をここで改変することもできますが、元の数がわからなくなるのでやめましょう。
改変した場合、新しくお気に入り登録されても+1されるだけで元の数には戻りません。
![スクリーンショット 2020-04-23 19.07.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236778/56f02df2-d61e-071e-4800-86674c9b1426.png)

## 出力方法
お気に入りされた総数TOP５を出力する場合は下記。ループ部分は省いています。

```php
$args = new WP_Query(
    array(
        'post_type'      => 'post',
        'posts_per_page' => 5,
        'meta_key'       =>'simplefavorites_count',
        'orderby'        =>'meta_value_num',
    )
);
```
## ポイント
カスタムフィールドで並び替えする場合に必要な記述でよく見かけるものは`'orderby'=>'meta_value'`ですが、これは日付順などに有効な方法で、数で並び替えたいときには使えず下記のような並びになります。

- 199
- 20
- 300
- 4
- 500

ということで`meta_value_num`を使いましょう。

参考：[私的マニュアル カスタムフィールドで並び替え](https://elearn.jp/wpman/column/c20130809_01.html)
pytest-covでflaskのカバレッジを見る

# はじめに
[前回](https://qiita.com/mink0212/items/34b9def61d58ab781714)では、簡単な関数のカバレッジをpytest-covで確認しました。flaskでも同様にpytest-covでカバレッジをチェックできるのか確認してみます。

# 環境
 - python:3.6.5
 - flask:1.0.2
 - pytest:5.3.5
 - pytest-cov:2.8.1
 
# 簡単なflaskのカバレッジ確認
pytest-covを使用するためには、テスト対象とテストソースが必要なので作成します。
[ [pytestでflaskの単体テストをする](https://qiita.com/mink0212/items/40e4f796eb4ba7868c08) ]で作成方法を書いているため分からない方はそちらを見てください。

## テスト対象のソース
テスト対象のソースは取得したmessageがbyeだったときは、see youに変えて、それ以外の時はそのままmessageを返却しています。

``` flask_mod.py

from flask import Flask, jsonify
import datetime

app = Flask(__name__)

@app.route('/greeting/<message>')
def sample(message):
    if message == 'bye':
        message = 'see you'
    return message
```

## テスト方法を書いたソース
messageがbyeとそれ以外のパターンの2通りのテストソースを作成しました。ヘッダをちゃんとすれば答えのb'see you'のb(バイナリ)はなくても良いです。

``` pytest_flask_fixture.py

import pytest
from flask_mod import app

@pytest.fixture
def client():
    app.config['TESTING'] = True
    test_client = app.test_client()
    yield test_client
    test_client.delete()

def test_greeting_bye(client):
    result = client.get('/greeting/bye')
    assert b'see you' == result.data

def test_greeting_hello(client):
    result = client.get('/greeting/hello')
    assert b'hello' == result.data
```

## 単体テストの実行
テスト対象とテスト方法のソースができたため、実行します。

```
# pytest --cov --cov-branch -v pytest_flask_fixture.py

～～～～　略　～～～～～

collected 2 items

pytest_flask_fixture.py ..                           [100%]

----------- coverage: platform win32, python 3.6.5-final-0 -----------
Name                          Stmts   Miss Branch BrPart  Cover
---------------------------------------------------------------
flask_mod.py                  7      0      2      0   100%
pytest_flask_fixture.py      13      0      0      0   100%
---------------------------------------------------------------
TOTAL                            20      0      2      0   100%


====== 2 passed in 0.74s ======
```

結果を見ると、flaskの処理を書いた``` flask_mod.py ```のBranchが2でCoverが100%になっていることからflaskのテストもできていることがわかります。

# VSCodeで実行する方法
コマンドでpytestを打っても良いのですが、VSCodeで実行できる方法もあるためまとめておきます。

## 手順
### 定義の作成手順
1. Ctr + Shift + p でコマンドパレットを開く
2. python:Configure Tests を選択
3. pythest を選択
4. テストソースのディレクトリ(テストソースのディレクトリがルートの時は . Root Directory) を選択
5. テストソースのディレクトリに``` pytest.ini ```を作成する。(名前は固定)

``` pytest.ini

[pytest]
junit_family = legacy
addopts = -ra -q --cov --cov-branch
```

### 実行手順
1. Ctr + Shift + p でコマンドパレットを開く
2. python: Run All Tests
3. python: Show Test Output

## VsCodeでの注意事項
テストソースのファイル名はtestXXXXというようにtest始まりである必要があるようです。

# おわりに
pytest-covがflaskでも可能なことを確認できました。WEBサービスは変更や修正等が激しい上に対象にAPIやWEBページがあるため、下手な修正をすると別の場所まで影響がでる可能性があります。そのためにテスト自動化が良くされますがそれと同時にカバレッジのチェックもすればより精度の高い影響確認テストができるのではないかと思います。
AppGoat：認証制御や認可制御の欠落


# 認証制御や認可制御の欠落とは
認証制御の欠落とは、第三者が知りうる情報での認証、本来認証が必要なページから飛ぶべきページに認証無しで直接URL指定で移動することを許してしまう脆弱性である。
認可制御の欠落とは、権限の付与・管理が甘いことにより、ログインしているユーザが権限外のページにアクセスできてしまう脆弱性である。

# 脆弱性の原理
##### 認証制御の欠落
ログイン情報を用いたユーザの識別を、認証が必要なページで行っていない、行っていても不十分であることが原因。
その場合、認証無しで直接URL指定することで、認証無しで認証が必要なページにジャンプできてしまう。

そもそも認証に必要な情報が第三者が知りうる情報のみである場合、攻撃者による不正なログインを許してしまう。

##### 認可制御の欠落
アクセス権限の確認が不十分なことが原因で、アクセスに権限が必要なページでへと本来権限のないユーザがURL指定でジャンプできてしまう。

# 脆弱性が悪用された際の影響
共通して、本来非公開である情報に対して、攻撃者が閲覧、改ざん、消去してしまう危険性がある。

# 検査方法
##### 認証制御の欠落
ログイン画面を確認し、秘密情報無しでログインできるかどうかを確認。
ログインできる場合は脆弱性がある。
ログインに失敗したときのエラーメッセージから、情報が得られるかどうかを確認。
ID、パスワードの存在、一致不一致について情報が得られる場合は脆弱性がある。

認証せずにURL指定で路銀語にアクセス可能なページにジャンプできる場合、脆弱性がある。

##### 認可制御の欠落
ログイン後に、本来権限がないはずのページをURL指定でジャンプした際にページを閲覧できる場合、脆弱性がある。

# 対策方法
##### 認証制御の欠落
ログイン時にはパスワードのような本人しか知り得ない情報を用いてログインさせるようにする。
また、ログイン後にアクセスできるページでは、アクセスの際にログイン情報を確認するようにする。

ログイン時に発生させるエラーメッセージの中に、IDやパスワードの情報を含ませない。

##### 認可制御の欠落
アクセスに特別な権限が必要なページでは、ログイン情報に加えて権限の確認も行う必要がある。
データの読み込み・単純集計

# 概要
データの読み込みから，簡単な統計量の算出．
* python3
* pandas



# データの読み込み

```python3:

import pandas as pd
# csvの場合
data = pd.read_csv('test.csv')

# excelの場合
data = pd.read_excel('test.xlsx')
```
# データ連結（ユニオン・ジョイン）
* ユニオン：行を追加するイメージ．　

|id|氏名|数学 |英語|
|:--:|:--|--:|--:|
|1|A |80 | 40 |　　　　　
|2|B |66 |50|
|3|C |70 |00|

|id|氏名|数学 |英語|
|:--:|:--|--:|--:|
|1|D |100 | 100 |　　　　　
|2|E |69 |30|


```python3:
union_data = pd.concat([table1, table2],  ignore_index=True)
```
ignore_index=trueにより，Index(id)を再度振り直してくれる．
table2の属性が足りない場合は，nullがセットされる．

* ジョイン：列を追加するイメージ．<br>

|id|氏名|数学 |英語|
|:--:|:--|--:|--:|
|1|A |80 | 40 |　　　　　
|2|B |66 |50|
|3|C |70 |00|

|id|氏名|年齢|出身|
|:--:|--:|--:|--:|
|1|A |20| 北海道|　　　　　
|2|B |21 |沖縄|
|3|C |20 |京都|

```python3:
join_data = pd.merge(table1,table2[['年齢','出身']], on='id', how='left')
```
table2の一部をジョインする場合は配列で指定する．
onは，ジョイン時に両テーブルを結びつけるところ．
howは突合方法（説明すると長いから別途記事書く必要ありそう）
<br>
ジョインするテーブルて列名が異なる場合は以下のように指定する

```python3:
join_data = pd.merge(table1,table2, left_on='id', right_on='item_id' how='left')
```

# 各種統計量の計算
```python3:test.py
# 各行の統計量（平均・標準偏差等）
data.describe()

# 欠損値(nullとか)の簡単な確認
# 各カラムのtrue・falseを表示
data.isnull() 
# 各列のisnullの数を表示
data.isnull().sum()
```

# データの一部抽出
特例の年月のデータの合計とかが知りたい時には、groupbyを利用
as_indexをTrueにするとグループラベルがIndexになる。
```python3:
join_data.groupby(['まとめる列名'], as_index=False).sum()
```

一部抜粋して別テーブルの作成
fill_value=0にすることで、NaNのカラムを０にしてくれる
aggfuncは他に， max, minの値も取得できる

```python3:
# 任意の行・列の出現回数だけ求める場合
byState = pd.pivot_table(data, index='行になる値', columns='列になる値', aggfunc='size', fill_value=0)

# 任意の行・列の合計値を求める場合
byState = pd.pivot_table(data, index='行になる値', columns='列になる値', values='合計する値' aggfunc='sum', fill_value=0)
```
右Alt + {n} で仮想デスクトップ n 番目に切り替える。Windows 10

## ゴール

タイトルのまんまです。実現のために `右alt -> F13` キーマッピングを変更してます。(`右alt`なのは個人的にほとんど使っていなかったため)

1. `F13(右alt) + o` (右のデスクトップへ)
1. `F13(右alt) + i` (左のデスクトップへ)
1. `F13(右alt) + 1` (１番目のデスクトップへ)
1. `F13(右alt) + 5` (５番目のデスクトップへ)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134761/9e8b3000-775d-0104-382e-96fb8b896e1f.gif" width="550">

## 背景

`Win + ctrl + 矢印←→` のショートカットしんどいっていうのが動機。
同様のこと (仮想デスクトップ n 番目に切り替え) ができるツール https://github.com/sdias/win-10-virtual-desktop-enhancer/releases を試してみたけど、
デスクトップ切り替え時、既に起動してるアプリが
![asadf.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134761/91be6aef-41e3-3263-fe68-3da3c9de12dd.gif)
になるので使用を断念した。

## 手順

1. インストールする -- https://autohotkey.com/download/

    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134761/41550bf7-97b9-83d3-d42d-e4c3fc01074c.png" width="550">

1. 定義スクリプト `C:\Program Files\AutoHotkey\MySettingKey.ahk` を作成して右クリック `Run Script`

    ```MySettingKey.ahk
; move active window to adjacent desktop
F13 & I::Send,{Blind}#^{Left}
F13 & O::Send,{Blind}#^{Right}
F13 & 1::Send,{Blind}#^{Left}#^{Left}#^{Left}#^{Left}#^{Left}#^{Left}#^{Left}
F13 & 2::Send,{Blind}#^{Left}#^{Left}#^{Left}#^{Left}#^{Left}#^{Left}#^{Left}#^{Right}
F13 & 3::Send,{Blind}#^{Left}#^{Left}#^{Left}#^{Left}#^{Left}#^{Left}#^{Left}#^{Right}#^{Right}
F13 & 4::Send,{Blind}#^{Left}#^{Left}#^{Left}#^{Left}#^{Left}#^{Left}#^{Left}#^{Right}#^{Right}#^{Right}
F13 & 5::Send,{Blind}#^{Left}#^{Left}#^{Left}#^{Left}#^{Left}#^{Left}#^{Left}#^{Right}#^{Right}#^{Right}#^{Right}
    ```

    ※OS起動時に毎回実行するのはめんどいので`MySettingKey.ahk`ショートカット作成して実行するようにしてます。

1. `右alt -> F13` キーマッピングを変更

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134761/3556ff77-9885-d136-e7db-52215c313bef.png)

    `コンピューター\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout`
    新規->バイナリ値: 「名前：`Scancode Map`」を作成する。

    `Scancode Map` 値

    ```
  00 00 00 00 00 00 00 00
  02 00 00 00 64 00 38 E0
  00 00 00 00
    ```

1. PCを再起動すると `右alt -> F13` が有効になってデスクトップ切り替えができる

## (必要なら) デスクトップ番号表示

`SylphyHorn` 使わせてもらってます (インストールするとデフォルトのままで番号表示される)

<div>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134761/72fae51a-818c-99f9-acb9-256238245487.png" width="650">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134761/ab90f172-5956-98a8-1bab-42978fe89c99.png" width="420">
</div>
Microsot MakeCode Arcade - Meowbit が届いたのでファーストインプレッション

[Meowbit](https://www.kittenbot.cc/products/meowbit-codable-console-for-microsoft-makecode-arcade) が届きましたので、ファーストインプレッション的なご紹介です。

![IMG_E7280.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/f3fe64ed-848d-cd1f-bb4e-2db6140b5929.jpeg)

# Meowbit とは

オープンソースのプログラミング学習プラットフォーム [Microsot MakeCode](https://www.microsoft.com/ja-jp/makecode) のうち [Arcade](https://arcade.makecode.com/) 規格のハードウェアです。160 x 128 ドットのカラーディスプレイ、四方向の操作ボタン、AB のアクションボタンと各種センサーを装備しています。ブロックを使ったビジュアルコーディングや MicroPython でゲームを開発することができます。

* [Scratch3](https://scratch.mit.edu/) with [Kittenblock](https://www.kittenbot.cc/pages/software)
* [MicroPython](https://micropython.org/) with [MU EDITOR](https://www.kittenbot.cc/pages/software)

以下、[販売サイト](https://www.switch-science.com/catalog/6077/) からの引用です。

> Makecode ArcadeやPythonでレトロゲームを作ることができるカードサイズのコンピュータで、本製品はスカイブルー色です。 micro:bit用の拡張基板と接続することができるので、ゲームプログラミングとハードウェアデバイスを組み合わせた用途に使用できます。

> 1.8インチのフルカラーディスプレイ、プログラムで設定可能なボタン（6個）、ブザー（1個）、光センサ、温度センサ、SDカードスロット（外部ストレージ用）、マルチコネクタ、エッジコネクタが搭載されています。 エッジコネクタは、ほとんどのmicro:bit用の拡張基板と接続することが可能です。

# ハードウェア説明

マニュアルが付属しておらず操作方法が不明だったので [Meowbit 公式サイト](https://www.kittenbot.cc/products/meowbit-codable-console-for-microsoft-makecode-arcade) にあったハードウェア図を翻訳してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/9fc783fa-5f50-f726-0485-35e1b1fb881c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/25977cc6-699f-e2e7-bec8-a05c867a6d36.png)
いろいろ面白そうなセンサーが付いていますが、温度センサーはカバーの中に隠れているけど大丈夫なのかな？光センサーや他の端子はカバーにちゃんと穴あいているんだけど…

# PC に繋いでみた

Windows 10 PC に繋いでみたところ、以下のように USB メモリのように認識されました。SDカードを刺していないので、本体に 4MB 程度のフラッシュメモリが実装されているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/5e1e5e73-f61b-78fd-d4e5-b60816a277f4.png)

上のハードウェア図の19番は 2MB と書いて(たぶん winbond 25Q16) あり、MCU である [STM32F401RET6](https://www.stmcu.jp/stm32/stm32f4/stm32f401/12226/) に内蔵されているのは 512KB のようだし、ちょっと計算合わないですね。15番と17番の間にあるのは TP4056 で、充電モジュールっぽいし。見えないトコにチップ積んでいるのかな？

で、実際のファイルの様子がこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/025bedd8-4e6a-8b7c-8535-ca87d5fdb401.png)
CURRENT.UF2 という大きなファイルが、起動時に実行されている、このサンプルプログラムのコードでしょうかね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/06fd50a2-8761-0461-5c7c-9371009f0b17.png)

# そして…

いい感じだったので、調子にのってオレンジ色を追加注文してしまいましたー。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/ce08d110-cf66-1ac1-2798-c9fb0ee3b20d.png)

# というわけで

コロナウィルスの影響か配送に時間がかかりましたが、ゴールデンウィーク前に届いて良かったです。いろいろ遊んでみて、面白そうなネタがありましたら投稿しますね。

それではまた！
Django公式ドキュメントの翻訳活動に参加してみた

# Djangoはいいぞ！

と考えていて趣味で使っているのですが、いかんせん公式ドキュメントに英語が多いな、これが新しく始める人の障壁になっているともったいないなと感じていました。

もちろん、Qiitaに記事を書くのもいいですが、そもそもドキュメント自体を翻訳してしまえばいいのでは？
更に言えばその手法を記事にすれば興味がある人が他にも出てくるのでは？
と思ったので記事にします。

# どうやって参加するの？
[DJANGO PROJECT.JP](https://djangoproject.jp/howtotranslate/)

こちらにアクセスすると以下のようなページが表示されます。

![スクリーンショット 2020-04-21 2.20.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412789/8ff5efcf-722a-3aa3-c4ba-11674a23b33a.png)


Transifexのアカウントを作成し、チームへの参加を申請します。

承認されると実際に翻訳が可能になります。

私の場合は申請から2日後くらいに認証されました。

# いざ翻訳

まず、先に色々先人たちの取り組みを見てやってはいけないことを学びました。

- 何も許可を取らずにGoogle翻訳に突っ込むの、ダメ、ゼッタイ。

これは色々と権利関係で問題が生じたりするのを防ぐためらしいです。
まぁそもそもGoogle翻訳に突っ込んではいお終いってなったらアレですしね。それに翻訳ソフト独特の癖みたいな物がある気がするのでレビューでバレると思います。

- 技術的、専門的な語句はそのアプリで使われている様式でそのまま使う。

他のOSSプロジェクトがどういう仕組みを作っているのかは知りませんが、Djangoではそのままにしておいて欲しい語句に関してはきちんと指定されているので迷うことはありませんでした。


# やってみてどうだった？

まず第一に、

- 翻訳した分野について詳しくなる

翻訳活動に参加する最大のメリットはこれかなと思います。好きなフレームワークをどういったものかを文章化するというのはなかなかなかなか得られる経験ではないため、改めて該当範囲について勉強します。時間がない時の自習でやりがちなインプットのみの形式だと知識がどんどん抜け落ちていくのがネックですが、知識を得た上できちんと理解をし、それを更に分かりやすく日本語で組み立てるというのは理解度を高める上で非常に大きな助けとなったと思います。

そして第二に、

- 英語力が伸びる 

正確に書くとするならば技術周りの英語に詳しくなる、というのが正しいかもしれません。また、元のドキュメントは英語であり、それを翻訳するのでひとまず英語で意味を取らなければなりません。なので英語を読むことに対しての抵抗感が薄れるというのも大きなポイントです。

きっと他にもあるとは思いますが、以上の二点が主要なメリットかなと思います。

# OSSに参加できるほど技術力に自信がないよ・・・

熱意を持ってしっかり勉強すれば大丈夫だと思います。
少なくともDjangoに関して言えば申請した翻訳がレビューされる形式になっていますし、私も技術力はないですが、好きだからとりあえず関わってみようと思ったクチです。

コミュニティ側も関わる人が増えれば良い影響を受けますし、自身も何かしらの形で参加できることがOSSの良さではないでしょうか？

この記事を読んで興味を持ったそこのあなた、是非一緒にDjangoに関わりましょう!
Vuetify のメニュー(v-menu)を DOM 内のスクロールに追随させる方法

# はじめに

Vuetify の `v-list` 内で `v-menu` を表示したときに、スクロールに応じてメニューが追随しない問題の対応方法を記載します。
実装内容は大したことはないですが、思いのほか調査に時間がかかりましたので、誰かの参考になればと投稿します。

# 実現方法

[v-menu](https://vuetifyjs.com/en/components/menus/#menus) の `attach` オプションを指定するだけでした。

`attach` の説明文は以下の通り。

> Specifies which DOM element that this component should detach to.String can be any valid querySelector and Object can be any valid Node. This will attach to the root v-app component by default.

結局は `v-menu` の DOM をどこに格納するか、ってだけの話ですね。
今まで jQuery で散々こういった対応をしてきたはずなのに、流行りのフレームワークを利用した開発だと最終的に出来上がる DOM をイメージする機会が減っているようで、盲点でした。

最終的な Vue template の抜粋配下通りです。
ポイントは `v-list-item` に適当なクラスを定義して `v-menu` の `attach` を指定するところです。
Vuetify を使ったの開発で css selector を書いたのは初めてかも？

```html
<template>
  <v-layout>
    <v-navigation-drawer>
      <v-list>
        <v-list-item-group>
          <template v-for="item in items">
            <v-list-item :class="`list-item-${item}`">
              <v-list-item-content>
                <v-list-item-title>{{ item }}</v-list-item-title>
              </v-list-item-content>
              <v-menu
                :attach="`.list-item-${item}`"
                left
                offset-y
              >
              </v-menu>
            </v-list-item>
          </template>
        </v-list-item-group>
      </v-list>
    </v-navigation-drawer>
  </v-layout>
</template>
```

## ちょっとしたポイント

メニューを追随させるだけなら `attach` の指定だけでいいですが、
`v-navigation-drawer` と併用した場合、ドロワーからはみ出た DOM は表示されないため、ドロワー内に収める必要があります。
そのため、ここでは `v-menu` に `left` を指定しています。

# おわりに

記載内容は、https://markdown.aprifield.com (Markdown でメモを取って Google Drive に保存するサービス) を開発中に調査した内容です。
JestでVuetifyのcomponentsが読み込めないconsole.errorが表示される話

# JestでVuetifyのcomponentsのerrorが出る

適当なテスト用のコードを書いて見るとテストはPASSするけどconsole.errorが吐かれる

```
console.error {path}
[Vue warn]: Unknown custom element: <v-card> - did you register the component correctly? For recursive components, make sure to provide the "name" option.
```

## 解決: localVue.use(vuetify)

`localVue.use(vuetify)`を書き忘れていただけだったようです。

```javascript:test/pages/index.spec.js
import Vuetify from 'vuetify'
import { mount, createLocalVue } from '@vue/test-utils'
import IndexPage from '@/pages/index.vue'
const localVue = createLocalVue()

describe('pages/index.vue', () => {
  let vuetify
  let wrapper

  beforeEach(() => {
    vuetify = new Vuetify()
    // これを追加
    localVue.use(vuetify)
    wrapper = mount(IndexPage, {
      localVue
    })
  })

  describe('template', () => {
    it('「Hellow World」の表示', () => {
      expect(wrapper.text()).toBe('Hellow World')
    })
  })
})

```
SSH接続で許可するIPを指定する設定

サーバに接続すると下記のメッセージが。。

「最後の正しいログインの後に xxx 回の失敗ログインの試行があります」

私の場合、6万回とかいってたので怖くなりすぐにセキュリティを見直すことに。

#IPアドレス指定許可
特定のIPの接続を許可する

####hosts.allowファイルを編集する
`$vi /etc/hosts.allow `

####元の記載
`all: 127.0.0.1`

####追記した内容

`sshd: xxx.xx.x.xx`


#IPアドレス拒否

許可したIP以外からの接続を拒否する

####hosts.denyファイルを編集する
`$vi /etc/hosts.deny `

####元の記載
`all: all`

####追記した内容

`sshd: ALL`

--------------------

これで一応解決。ログイン失敗のメッセージも表示されなくなった。一安心。



#参考サイト
・[グローバルIPアドレス指定時](https://www.cman.jp/network/support/go_access.cgi)
・[hosts.allowファイル、hosts.denyファイルってなんぞや](https://linuc.org/study/knowledge/512/)
CSS3 transform translate系まとめ

transform: translate系

x,yは普通に効くけどx座標はブラウザによって表示が異なる。

使える関数

・translate(x, y=0)

・translateX(x)

・translateY(y)

・translateZ(z)

・translate3d(x, Y=0, z=0)

transform系の要素について
適用する要素のpositionはabsoluteにする必要がある。


検証
わかりやすいようにアニメーションをしているが、下記のCSSのままではアニメーションしない。


trasnlate(x, y=0)
yが未指定の時は0扱い。
/* x方向に30px, y方向に20px */
.translate {
transform: translate(30px, 20px);
}


traslateX(x)
そのまんま、x座標の移動。translateY, translateZも同様。

/* x方向に30px */
.translateX {
transform: translateX(30px);

translate3d(x, y = 0,z = 0

x,y,z座標の移動。y,zが未指定の場合は0扱い。
赤いブロックはz=10pxなのだが、紫のブロックがz=20pxに移動しても変化
はない。


<div class='div-frame'>
   <svg><rect width="80" height="80" class='red'></rect></svg>
   <svg class="translate3d"><rect width="80" height="80"></rect></svg>
</div>


/* x,y,z方向に20pxずつ */
.translate3d {
  transform: translate3d(20px, 20px, 20px);
}
/* 赤いブロックは10px前に出ているはずだが */
.red {
  fill: red;
  transform: translateZ(10px);
}
Nullと空文字と空白と

<p>どこかの小説とかで、こんな感じの文章があったような…（笑）</p>
<p>さて、Springのバリデーション（入力チェック）に関する学習をしているのですが、ふと気になったので備忘録として残しておきます。</p>
<p>参考：<a href="https://yaginoblog.com/null-blank-chigai/">『NULL』『ブランク』の違いを解説　『スペース』『空文字』との違いも</a></p>
<ul>
<li>Null：存在しない状態を指すよ。</li>
<li>空文字：長さ0の文字列のことだよ。</li>
<li>空白：半角スペース"_"や全角スペース"＿"のことだよ（アンダーバーは見えやすくしただけなので間違えないでね）。</li>
<p>これを理解しないと不具合の原因になるらしいので、気を付けておこう。特にDBを扱うときにエラー要因になったりするらしい。</p>
nuxt/jestでテストしたいstoreをモックを使わずにそのままをテストする

# やりたいこと
 - storeに入れている固定データがちゃんと取得できるかのテストをしたい


# コード

```js:テスト対象
const state = () => ({
  data: {
    hoge: 'hoge',
    foo: 'foo'
  }
})

const getters = {
  find: state => (id) => {
    return state.data[id]
  }
}

export default {
  namespaced: true,
  state,
  getters
}
```

```js
import Vuex from 'vuex'
import { createLocalVue } from '@vue/test-utils'
import * as targetModule from '@/store/hoge/foo/index'

describe('store/hoge/foo', () => {
  const localVue = createLocalVue()
  localVue.use(Vuex)

  const store = new Vuex.Store({
    modules: {
      "hoge/foo": targetModule.default
    }
  })

  describe('find', () => {
    test('test', () => {
      const result = store.getters['hoge/foo/find']('hoge')
      expect(result).not.toBeNull()
    })
  })
})
```
自動車関連ソフトウェアの今後


経済産業省に関連した事項で、自動車関連ソフトウェアの今後についての資料を整理中。

# 国際規格適合　および　ISO9000
1994年 - 1995年 異機種間ネットワークによる品質管理システムの構築の指導 通産省  技術指導

本事業では、WTO/TBT協定に基づいた国際調達においては、国際規格との違いを記述することが重要であることを示した。特に、ISO/IEC Directivesにあるように、第1者による自己宣言と、第二者による検査と、第三者による審査登録が、技術的には同等であるように国際規格を決めるようにしていることを説明した。

1995年に開催した講演会に参加いただいたトヨタ自動車、中部電力、中部経済産業省などでは、自己宣言の重要性を理解され、第三者検証一本やりな動きには距離を置いている。

# 組み込み技術
2002年 - 2005年　組込みシステム・オープンプラットホームの構築とその実用化研究　経済産業省  平成14年度 地域新生コンソーシアム事業

オープンソースによるリアルタイムOSの展開を行った。
主にMISRA C対応、Automotive SPICE対応などを行った。

# 環境対策 および　ISO 14000
2006年 - 2009年　機能安全対応車載プラットフォームの開発　経済産業省  サポートインダストリー

主にHAZOPによる分析、MISRA C対応、Automotive SPICE対応などを行った。


# 道具類
平成23年度 市場競争環境評価調査事業 中小ものづくり産業IT基盤ツールに係る環境競争調査 報告書,平成24年3月, https://bit.ly/2x3N3PN 経済産業省 中部経済産業局,2011

調査から約１０年。その後の動向と現状の課題、将来への展望を整理してみる。

以下の６つの分類を取っている。
(1)クラウド・コンピューティング
(2)ITS(Intelligent Transport Systems)
(3)スマートグリッド・スマートコミュニティ 
(4)CPS(Cyber-Physical Systems) 
(5)機能安全
(6)TERAS・第三者検証

ここでは、少し分類し直してみる。

(1)クラウド・コンピューティングとIoT
(2)遠隔作業・テレビ会議とスマートコミュニティ 
(3)自動車安全
(4)自動運転とITS(Intelligent Transport Systems)
(5)CPS(Cyber-Physical Systems) 
(6)規格適合の自己宣言と第三者検証

自動車関連の規格をJIS化する際に作成した資料はこちらい。

自動車産業におけるソフトウェア製品の出荷額の見積もりと改善の方向性, 小川清 ,2017/01/15 
https://researchmap.jp/blogs/blog_entries/view/78772/9799d73e597efe8bce37d838a7218274?frame_id=416173

AUTOSARがこれらの６項目にどれくらい関与しているか、どれくらい関係があるかについても記述していく。

# (1)クラウド・コンピューティングとIoT
クラウドコンピューティングにはセキュリティとシステムの継続性が課題かもしれない。

AUTOSARの弱みは、クラウドとIoT規格等および生産性との関係についての取り組みはこれから。

ただし、Adaptive PlatformはPOSIX適合なLinux系により、
docker, github/gitlab/bitbucketの利用が進展している。

開発環境も、当初の報告書時代から、ネットワークコンパイラなどの進展がある。

自動運転では、クラウドとの連携が鍵となっており、標準化が役立つことが期待されている。

# (2)遠隔作業・テレビ会議とスマートコミュニティ 

# (3)自動車安全
自動運転の前提として自動車安全について整理しておくとよい。
機能安全では部品の納入手続き上の課題しか解決せず、自動車安全にどれくらい貢献できるかを確認しているとよい。当初から、機能安全が自動車安全との連動についての資料がないと役立たないという発言がOEMからあった。

# (4)自動運転とITS(Intelligent Transport Systems)

# (5)CPS(Cyber-Physical Systems) 

# (6)規格適合の自己宣言と第三者検証

第三者検証よりも、自己宣言の方が有用であることは、
1998年の名古屋市工業研究所の講演で紹介している。

MISRA Cなどのコーディング標準では基本が自己宣言であり、
逸脱の手続きも欧州を中心に幅広く展開されてきた。

特に、//コメントのように1990年からすぐにほとんどのCコンパイラで利用できたのに、
30年近く、利用を禁止していた組織があることは驚きかもしれない。
欧州では早くからStanding Deviationとして逸脱することを宣言していたらしい。


上記報告で、十分自己宣言の役割が展開できなかった点は反省点である。

p.60
>ISO23152(Machine tools -- Safety -- Turning machines:工作機械-安全性-旋盤) 《機能安全が主体の規格》自己宣言で OK であるが、2011 年中に対応する。

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
# 文書履歴(document history)
ver. 0.01 初稿 20200423
ver. 0.04 URL追記　20230308

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
AppGoat：セッション管理の不備


# セッション管理の不備とは
利用者のセッションIDを攻撃者が取得、利用することで、攻撃者が利用者になりすますことをセッションハイジャックと呼ぶ。
セッション管理の不備は、セッションハイジャックを許してしまう脆弱性である。

# 脆弱性の原理
Webサーバは基本的にクライアントを識別しないステートレスな状態だが、SNSやショッピングサイトをはじめ、個人を識別する必要のあるアプリケーションでは、個人の識別子を発行するセッションという動作を行う。
セッションIDはCookieを使用して各ユーザのブラウザに保存される。

本来、ログイン前後でセッションIDは推測困難なものを再発行するべきだが、不十分なセッションIDな管理だと攻撃者に利用される危険性がある。
攻撃者が他の利用者のセッションIDを利用する手段は以下の3種類となる。

##### セッションIDの漏洩
セッションIDをURLに埋め込んでいる場合、外部にセッションIDが漏洩してしまう可能性がある。
特に、情報を読み取るための罠のリンクを踏み悪意のある外部サイトに飛ばされ、Referer値を読み取られる危険性がある。
URLにセッションIDを格納していること、Cookieを外部から読み取れるようにしていることが原因である。

##### セッションIDの固定化
セッションIDの再発行が不十分だと、攻撃者が発行していたセッションIDを利用者に利用させることで、利用者のアカウントのハイジャックが発生しうる。
外部から固定化する手段は多岐にわたり、根本的な解決は困難。

##### セッションIDの推測
セッションIDの発行に、推測が可能なパラメータを使っている場合、攻撃者が生成されるセッションIDを推測し、不正に利用してしまう可能性がある。

セッションIDの発行には以下のものが使われることが多い。

- ユーザID、メールアドレス
- リモートIPアドレス
- 日時
- 乱数

特に乱数以外は推測されやすく、乱数を絡ませてセッションIDの発行を行っていない場合、推測されやすくなる。


# 脆弱性が悪用された際の影響
セッションハイジャックによる影響は以下のものが挙げられる。

1. ログイン後の利用者のみが利用可能なサービスの悪用
2. ログイン後の利用者のみが編集可能な情報の改ざん、新規登録
3. ログイン後の利用者のみが閲覧可能な情報の閲覧

攻撃者がログインしている利用者と同等の操作を行ってしまう可能性がある。




# 対策方法
基本的にログインのたびに異なるセッションIDを推測困難な形で発行することで、セッションIDの不正利用のリスクは小さくなる。
新規開発の場合は、開発ツールにはセッション管理機能を持つものが多く、それを利用して開発するのが良い。

既存の脆弱性を持つアプリケーションを修正する場合は、セッションIDの不正取得の手段に注意して対策する必要がある。
すでにサービスが運用されており、セッションIDが存在している場合、不正に取得された際に被害が出ないようにログイン後に再設定するようにする。

##### セッションIDの漏洩
情報を覗き見るための罠サイトで、情報を抜き取られないようにする仕組みが必要である。
セッションIDをURL中のクエリストリングに格納せず、CookieやPOSTメソッド中のhidden属性に格納する。
HTTPS通信で利用するCookieにはセキュア属性を付与し、Referer値を読み取られないようにする。

##### セッションIDの固定化
固定化の手段は多岐にわたるので、セッションIDの変更をログイン認証のたびに行う。
セッションIDの固定化ができない場合は、セッションIDに代わる推測困難な秘密情報を作成し、Cookieにセットする必要がある。


##### セッションIDの推測
開発ツール中のセッション管理機構を利用することで防ぐことができる。
セッション管理のメソッドを自作する場合は暗号論的擬似乱数生成器を使う。
nginxでwebサーバ構築

#はじめに
こちらではnginxでwebサーバ構築を紹介していきたいと思います。


#環境
CentOS7

#手順

[ここに](https://nginx.org/en/linux_packages.html)手順があるので言うほど書くほどではないのですが
レポジトリの作成

```
$ sudo vim /etc/yum.repos.d/nginx.repo
```
保存

```repo:nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
```
インストール

```
$ sudo yum install nginx
```
起動

```
$ sudo systemctl start nginx
```

```
$ sudo systemctl start nginx
```

http://[IPアドレス]

接続し「Welcome to nginx!」でてきたら成功

#まとめ
いかがだったでしょうか、簡単にまとめてみましたが次はロードバランスやリバースプロキシとしての記事も書きたいと思います。
ImportError: cannot import name 'six' from 'django.utils' 

# 環境

Python 3.8.1
Django 3.0.5

# Djangoを2から3にアップグレードしたらタイトルのようなエラーが出た

スタックトレースをみてみると以下の一文が。
.../corsheaders/checks.py", line 8, in <module>
    from django.utils import six

どうやら`corsheaders`のcheaks.pyの中でimportしようとしたらそれないよって言われたみたいです。

ひとまず[公式ドキュメント](https://docs.djangoproject.com/en/3.0/releases/3.0/#removed-private-python-2-compatibility-apis)を確認してみると、

>Removed private Python 2 compatibility APIs¶
While Python 2 support was removed in Django 2.0, some private APIs weren’t removed from Django so that third party apps could continue using them until the Python 2 end-of-life.

>Since we expect apps to drop Python 2 compatibility when adding support for Django 3.0, we’re removing these APIs at this time.

>- django.test.utils.str_prefix() - Strings don’t have ‘u’ prefixes in Python 3.
- django.test.utils.patch_logger() - Use unittest.TestCase.assertLogs() instead.
- django.utils.lru_cache.lru_cache() - Alias of functools.lru_cache().
- django.utils.decorators.available_attrs() - This function returns functools.WRAPPER_ASSIGNMENTS.
- django.utils.decorators.ContextDecorator - Alias of contextlib.ContextDecorator.
- django.utils._os.abspathu() - Alias of os.path.abspath().
- django.utils._os.upath() and npath() - These functions do nothing on Python 3.
- django.utils.six - Remove usage of this vendored library or switch to six.
- django.utils.encoding.python_2_unicode_compatible() - Alias of six.python_2_unicode_compatible().
- django.utils.functional.curry() - Use functools.partial() or functools.partialmethod. See 5b1c389603a353625ae1603.
- django.utils.safestring.SafeBytes - Unused since Django 2.0.

どうやらPython2に互換性のあるAPIを削除したようです。
代わりとしてしてこれ使ってね！ってことみたいですね。

そこでエラーを出してる`corsheaders`がDjango3.0に対応しているか調べてみると、
>Requirements
Python 3.5 to 3.8 supported.
Django 1.11 to 3.0 suppported

[django-cors-headers 3.2.1](https://pypi.org/project/django-cors-headers/)

あれ・・・？対応してるやん・・・？

なんで？？？なんで？？？

まさか、最新版がインストールされてない？
と思い
`pip freeze`
してみると

```
........
django-cors-headers==3.0.2
........
```

あっ・・・

恐る恐る

```
pip install django-cors-headers==3.2.1
```

を実行してみると・・・


通りました。
Django2系でずっと作業していたのでアップグレードしたらちゃんと他のパッケージもアップグレードしましょうね、という教訓を得ました。

他にももしかしたら詰まっている人がいるかもしれないと思ったので記事にしました。
私のように`corsheader`ではない可能性もあるのできちんとエラーを見てから対応すると解決も早いかと思います！
Androidアプリ開発に於ける備忘録

#記事概要
本記事では、初めてのAndroid開発に於いて、私が「そんな仕様なのね」と、逐一詰まった部分を纏めようと思う。
強いてこのページの対象読者を示すなら、初のAndroid開発で、何か知ってた方が良いことはあるか？と考えている人。
基本的には自分向けの備忘録である。そのため、今回の開発をスムーズに行えるようになった時点での解釈を記載する。
#本題
それでは、以下に詰まった箇所と、解決後のそれらに対する解釈について記載していく。
##Activity
PC向けアプリ開発でよく言われる「画面」に相当すると解釈。
アプリを起動したら出てくる奴らで、ユーザインタフェースに相当し、以下の特徴がある。

###Activityのライフサイクル
Activityが呼び出されてから居なくなるまで、大まかに説明すると以下のようになる。
####Activityの作成
onCreateメソッドが呼び出されてActivityが作成される。
アプリを作るにあたっては、このメソッドをオーバーライドして処理を記載した。
今回はPC向けのアプリ開発に於けるメインメソッドの感覚で扱った。
####Activityの実行
onStartメソッドが呼び出されて作成されたActivityが実行される。
特に明示的に呼び出す必要はなく、onCreateが完了するとそのまま実施される。
####Activityの終了
onDestroyメソッドが呼び出されてActivityが終了する。
タスクキル時をはじめ、メモリを解放するために呼び出される。要するに終了処理。
特に明示的に処理を記載する必要はない。


と、大体こんな感じで扱った。実際はこのほかにonResume・onPause・onStopがあるわけだが、これらは意識せず今回作成したプログラムは作成できたため、割愛する。
###何が何でもここ(Activity)に物を載せる
ちょろっと感じたのが、何かにつけて表示するにはここに載せる必要があるということだ。
主にAlertDialogを表示するときに感じたのだが、何もないところに直接それを表示することはできない。
何かしら画面上に表示したかったら、兎に角Activityを作り上げてそこに載せる必要がある。
だから、背景が見えるようにダイアログを表示するには、裏で走ってるserviceとかに、背景を透過したActivityを呼び出させる必要があった。
##スレッド
HTTP通信を頑張ってみてた当初に引っかかった制限事項。
メインアクティビティで呼び出された処理は、何もなければメインスレッドで処理される。そしてここでは時間がかかる処理が実施できない。
つまり、ここで相手のレスポンスを待つ行為が発生し時間がかかるHTTP通信処理が実施できなかった。
そのため、別スレッドを実施するserviceを継承したクラスと、裏で処理を走らせてくれるAsyncTaskを継承したクラスを用いることにより実施した。
しかし何となく「わざわざ継承されたクラス作らずとも、新しいスレッド作れば行けるんじゃね？」とか思ったが、今回は試さなかった。
##XMLファイルたち
正直、こいつらの存在が一番苦戦した。雑ながら、それぞれのファイルについてちょっと言及しとこうと思う。
今回触ったのは以下のファイルたち。
###AndroidManifest.xml
基本的なアプリケーションのルールを記載する箇所。
具体的に言うと、バックグラウンドでの処理や、インターネットの接続を許可したり、ActivityのStyleを設定したりする。
###styles.xml
名前の通り、AndroidManifest.xmlで設定するStyleの設定、作成を行う。
例えば、完全に透過したActivityを作成する場合、こちらでそのStyleを作成し、Manifestで設定すると言った具合だ。
#あとがき
以上、初のAndroidアプリ開発で詰まった部分と解決後の解釈一覧でした。
裏取りをちゃんとやったわけではないので、間違っている可能性がある点だけご注意ください。
一応、参考にしたページは以下になります。

アクティビティの概要
https://developer.android.com/guide/components/activities/intro-activities
【Java】char型の変数に文字列を代入したらincompatible typesエラーが発生した 

##環境
・ホストOS: Windows10 Home
・ゲストOS: WSL2 Ubuntu18.04 LTS
・VScode ver 1.44.2
・Java openjdk11

#エラー内容

```java

public static int execute(int firstNum, char operator, int secondNum) throws ArithmeticException{
        switch (operator) {
            case "+":　//1
                return firstNum + secondNum;
                break;
```

上のコードを実行したところ、//1の箇所で下記のエラーが発生した。
・incompatible types
・Type mismatch: cannot convert from String to char

"+"がchar型ではなく、String型の文字列として認識された模様。


##解決法

・文字をchar型の変数として扱う際はシングルクォーテーションでくくる。

```java

public static int execute(int firstNum, char operator, int secondNum) throws ArithmeticException{
        switch (operator) {
            case '+':　//修正箇所
                return firstNum + secondNum;
                break;
```

上のように修正した結果コンパイルエラーがなくなった。



##考察等

>>ソースコードに「文字」データを記述する場合は引用符(')で囲みます。そして「文字列」データを記述する場合は二重引用符(")を使います。
>(中山清喬, 国本大吾 『スッキリわかるJava入門 第2版』p.50)

ということで
String型の文字列→""で囲む
char型の文字→''で囲む

と覚えておきたい。

##参考資料

[スッキリわかるJava入門 第2版](https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BJava%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1-%E6%B8%85%E5%96%AC/dp/484433638X)
Laravelの環境構築いろいろ

開発していく上で、自分が主なソースコードの管理者でないことって、
多々出てくると思います。
テストしてみたり、ブランチを切ってエンドユーザーに共有したり、などなど。

そんなとき、しっかりと環境構築しておいても色々不備が出て、
ちゃんとブラウザで見れない、動作しないなどが起きないように色々準備しておきましょう。

開発している環境と同じOS、ミドルウェアのバージョンであることを前提としますので、特定のバージョンはここでは指定しません。


1.git cloneはclone用のディレクトリでした後、作業用ディレクトリにコピーする。

```
$ git clone URL アプリ名
$ sudo cp -pR -f 作業用ディレクトリ/* アプリ名
```

2.基本vagrantの仮想環境を想定しています。/var/www/の下などに作業用ディレクトリを作っているかとおもいます。移動しましょう。

```
$ cd ~/アプリ名
```
3.管理者権限でcomposerを入れます。

```
$ su
$ composer install
```
4.MySQLを簡易パスワードで入れるようにします。

```
$ sudo vi /etc/my.cnf
# default-authentication-plugin=mysql_native_password
default-authentication-plugin=mysql_native_password 追加

validate_password.length=4
validate_password.mixed_case_count=0
validate_password.number_count=0
validate_password.special_char_count=0
validate_password.policy=LOW
```
5.保存したら再起動します。

```
$ systemctl restart mysqld
```
6.MySQLを起動してDBの初期設定をします。

```
$ MySQL
> create database DB名;
> create user 'XXX'@'localhost' identified  by 'パスワード';
> grant all on DB名.* to 'XXX'@'localhost' with grant option;
> exit
```
7.アプリの権限を変更する

```
$ sudo chmod 777 -R storage
$ sudo chmod 777 -R bootstrap/cache
```
8.ファイル.envを編集する

```
$ cp .env.example .env
$ sudo vi .env
http://localhost
という部分を
http://アプリ名
などに変更

DB_DATABASE
DB_USERNAME
DB_PASSWORD
をアプリ名などに変更
```
9.アプリケーションキーを作成

```
$ sudo php artisan key:generate
```
ここまで問題なくできていれば、キーは作成されるはず。

続きをやっていきます。ここまでくれば後少しです。

10.Apacheの設定

```
$ sudo vi /etc/httpd/conf/httpd.conf
DocumentRootの

DocumentRoot "/var/www/html"
を
DocumentRoot "/var/www/作業ディレクトリ+アプリ名"
に変更する。

また

<Directory "/var/www">
    AllowOverride None                                                      
    # Allow open access:
    Require all granted
</Directory>

を

<Directory "/var/www/作業ディレクトリ+アプリ名/public">
    AllowOverride All   ここを変更                                                   
    # Allow open access:
    Require all granted
</Directory>

に変更。
```
11.OSの時刻合わせ

```
$ timedatectl set-timezone Asia/Tokyo 時刻を東京に（パスワード要求されるので入力）
$ yum install chrony
$ /etc/chrony.conf
#時刻同期対象サーバーを日本国内に限定する
server 0.jp.pool.ntp.org iburst
server 1.jp.pool.ntp.org iburst
server 2.jp.pool.ntp.org iburst
server 3.jp.pool.ntp.org iburst

#時刻同期サーバーの候補が2個以上の場合のみ、時刻同期を行う
minsources 2

#アクセスを許可するNTPクライアントのIPアドレス or サブネットを指定
#複数指定する場合は複数行に分ける
allow 192.168.1.0/24
allow 10.0.0.2

#NTPサーバとして使用しない場合は以下のように指定する
port 0

$ systemctl start chronyd
```
12.アプリの権限設定

```
sudo chown -R vagrant:vagrant ./
```
をvagrant上のアプリ直下とhome直下行うと、rootだった権限がvagrantに変わり、色々と操作ができるようになります。
13.gitの初期設定

```
vagrant上でなくローカル環境で、
$ ls -al ~/.ssh
>id_rsaとid_rsa.pub
みたいなのがでてきたらすでに作成されています。できていなかったら、
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
を打つと3回質問が出るのでenterを3回うつと完了します。
$ $ clip < ~/.ssh/id_rsa.pub
でコピーして、リポジトリを管理するサービス(githubなど)に貼り付けておきましょう。
```
こちら、ローカルでだめな場合はvagrant上でやりましょう。
作成すると、home/vagrant/.sshに表示されます。known_hostsは消してもいいです。
コピーのコマンドは使えないので、catでファイルを見て手動コピペしましょう。
14.gitのHEADをあわせる

```
git fetch --all
sudo git reset --hard origin/master
git checkout -b master origin/master
git pull origin master
```

以上は私が作業の忘備録で書いたものでもあるので、
すべて合致しない可能性もあることご承知おきください。
PythonのGUIライブラリ「PySimpleGUI」を触ってみた

![undefined]()
プログラミングど初級者ですが, PythonでGUIアプリケーションを作りたいと思い, 「PySimpleGUI」について勉強したのでまとめてみたいと思います．

## 参考にさせていただいたサイト
●[PythonでGUIライブラリはどれがおすすめ？](https://techplay.jp/column/552):
GUIとは何ぞや？から，PythonでGUIアプリケーションを作成するためのライブラリが４つ紹介されています．

●[Tkinterを使うのであればPySimpleGUIを使ってみたらという話](https://qiita.com/dario_okazaki/items/656de21cab5c81cabe59):
Pythonで標準で組み込まれている「Tkinter」よりも簡潔な記述でGUIを作成できる「PySimpleGUI」の紹介記事です．今回はこの「PySimpleGUI」を使ってGUIを作ってみようと思います．

●[公式ドキュメント](https://pysimplegui.readthedocs.io/en/latest/):
前述の「PySimpleGUI」の公式ドキュメントです．

## 開発環境

- Windows10 64bit
- Python3.7.3
- Anaconda
- PySimpleGUI 4.18.2

## PySimpleGUI
まずはpipによってインストール

```
pip install pysimplegui
```
これでOK

## 作成するもの
今回は初めてなので, ２つの値の入力して, ボタンを押したらその和が表示されるシステムを作りたいと思います．

## 作成したコードと結果
書いたコードと結果がこちらです．
ほとんど下記のサイトのコードを転載しています．
[Tkinterを使うのであればPySimpleGUIを使ってみたらという話](https://qiita.com/dario_okazaki/items/656de21cab5c81cabe59)

```calcGUI.py
#! -*- coding:utf-8 -*-
import PySimpleGUI as sg

sg.theme('DarkAmber') # かっこいいのでテーマはダークにする
# テキストやボタンのレイアウト
layout = [[sg.Text('aとbの和を求めます')],
          [sg.Text('a'),sg.InputText(key='num1')],
          [sg.Text('b'),sg.InputText(key='num2')],
          [sg.Button('計算実行')],]

# ウィンドウを表示
window = sg.Window('window1',layout)

# イベントループ
while True:
    event, values = window.read()
    if event == '計算実行':
        result = float(values['num1'])+float(values['num2'])
        show_message = "答えは"+str(result)+"です。"
        print(show_message)
        
        sg.popup(show_message)
        
# ウィンドウを閉じる
window.close()
```

何故かポップアップを表示させるのにprint(メッセージ文)を書かないとプログラムが動いてくれませんでした.

計算画面
![result1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436070/d5c2d75c-f580-77ed-d569-4244700539a7.png)


結果表示
![result2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436070/22e0af9a-f756-8551-de51-90244fa7b980.png)

ちゃんと計算結果が表示されてます

## まとめ
PySimpleGUIの構文は直感的にも理解しやすく、簡単にGUIを作成することができました.
できることがたくさんありそうなので勉強していこうとおもいます.
2020年4月23日 Google Chrome で CSSの scroll-bevavior が効かなくなった？

JSを使わず、CSSだけでスムーススクロールを実現させる方法として
`scroll-behavior: smooth;`
とするものがありました。

(IEとSafari以外の)主要ブラウザで効果があるとの説明でしたので
手軽だし気に入って使用していました。

ところが、2020年4月23日、GoogleChrome(バージョン: 81.0.4044.122)にて効果が無くなっているようでした。
間違いなく2020年4月22日までは効いていたのですが。

それ以外にも、Chrome（81.0.4044.122）ではおかしなことが起こっています。
・AmazonやYahooで、CSSが反映されておらず、テキストサイトのような表示になっていた

こういうことがあったので、もしかしたらCss周りの一時的なバグなのかも知れませんね。
タッチバーにCPU使用率を表示する！

##この記事を読む事で出来るもの😎

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550573/fb928a37-934f-d74a-40c1-1365baa725d5.jpeg" width="400">

####CPU使用率が見えちゃいます！！！
####実用性高いしイケてますよね〜〜🥴


##下準備
・BetterTouchToolをインストール！！

・[Mac神アプリ！BetterTouchTool（BTT）の使い方と導入方法を解説。](https://tekuten.com/bettertouchtool)

##早速実装！！

#####１、BetterTouchToolを起動
#####２、画面左上プルダウンからタッチバーを選択


<img width="600" alt="スクリーンショット 2020-04-23 16.02.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550573/e94d27ee-6ee4-97f4-75d5-fb9ccc27c183.png">




#####3,画面右上 SelectTriggerのタッチバーウィジェットのシェルスクリプト/タスクウィジェット選択


<img width="600" alt="スクリーンショット 2020-04-23 16.17.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550573/b637b24c-63ca-e12a-4d6f-6da74893ae64.png">




#####4,スクリプトを編集

```ruby:スクリプト
ps -A -o %mem | awk '{s+=$1} END {print s "%"}'
```


<img width="600" alt="スクリーンショット 2020-04-23 16.19.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550573/08617d2c-0e09-6bbc-4307-ddc484f2f5eb.png">




#####5,タッチバーアイコン設定
　- Widget Identifierの「No Name」の文字は消す！
　- アイコンは好きなやつでオッケーです😄


<img width="600" alt="スクリーンショット 2020-04-23 16.21.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550573/ddb48330-3d66-6d53-2c31-8caf1686a889.png">



#####6,トリガーに操作の割り当て
<img width="600" alt="スクリーンショット 2020-04-23 17.01.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550573/4fa2f186-facb-1955-bfdd-95830d0093cd.png">


###7,アクテビティモニタを選択　完成！！！
 　-この設定ををすることでタッチバーでCPUの異変に気づいたら、
　　すぐにアクティビティモニタに飛べます😎
<img width="600" alt="スクリーンショット 2020-04-23 17.24.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550573/86e5ec6e-d6ae-0186-900e-419157ed54f2.png">

##さいごに
BetterTouchTollは他にも便利な機能満載です😄
自分好みにカスタム楽しんでください⭐️⭐️


【参考記事】
[MacBook ProのTouch BarにCPU、メモリ使用率、バッテリー残り時間、日時、ESCキーを表示して、メニューバーをスッキリさせる](https://ottan.xyz/touchbar-macbookpro-bettertouchtool-7084/)
【Nginx】Basic認証をかけたい

# 必要なパッケージをインストールする

###httpd-toolsってものを入れます###

```
$ sudo yum install httpd-tools
```

ちなみに、
Basic認証と言えば、真っ先に**.htaccess**って浮かぶと思うんですけど、
あれ、**apatch特有のもの**なんですよね。知らなかった…
そうすると今回はnginxなので、それは使えないわけですが、
apache由来の**htpasswdコマンドだけは使わせてもらう**ことで
Basic認証を実現させるわけです。
そのためのツールが、httpd-toolsなんですね。

# ユーザーとパスワードを準備する
###任意のディレクトリに、.htpasswdファイル＆ユーザー作成###
ここでは仮に `/etc/nginx/` に作成することにします

```
$ sudo htpasswd -c /etc/nginx/.htpasswd [username]
```
その後パスワード設定の流れになるので設定してください

# 設定を反映させる
###nginx設定ファイルを開き、二行追加します###

```
$ sudo vi /etc/nginx/nginx.conf
```

```nginx.conf
# こんな記述箇所があるはず
server {
　 listen       80 default_server;       # 触らない
　 listen       [::]:80 default_server;　# 触らない
　 server_name  _; 　　　　　　　　　　　　# 触らない
   root         /usr/share/nginx/html; 　# 触らない                                         
　 # Load configuration files for the default server block.
　 include /etc/nginx/default.d/*.conf;  # 触らない

　 location / {
　　　　# 以下二行追記
　　　　auth_basic "Restricted";                   # 認証時に表示されるメッセージ
　　　　auth_basic_user_file /etc/nginx/.htpasswd; # .htpasswdファイルのパス
　 }
   ...
}
```
###保存して閉じたら、再起動###

```
$ sudo service nginx restart
```
以上で完了です。

# 確認する
ブラウザでアクセスしてBasic認証画面が出るか確認してください。
(初心者向け)【UiPath】エラー解決へ向けたポイント・コツ_その②：エラーマーク後編

#エラーを解決してみよう
今回の記事では、エラーマークが表示される、よくある例をご紹介します。

エラーマークのエラーメッセージの確認はできるのだが、
- エラーメッセージの内容がよく分からない
- エラーの解決になかなか至れない
という方に向けて参考になれば、幸いです。

　※エラーマークのエラーメッセージの確認方法や要因場所の特定が分からない方や不安な方は、
　前回の記事をご参照ください。
　→[(初心者向け)【UiPath】エラー解決へ向けたポイント・コツ_その①：エラーマーク前編](https://qiita.com/chi_inamori/private/210d4f5f07af8e5f1092)

前回の記事でも述べましたが、
エラーマークの場合は、「実行する前の開発中に表示されるエラー」のため、
基本的に、値の『設定ミス』がほとんどかと思います。

そのため、下記のよくあるエラーメッセージ例をご参考頂ければ、
エラーマークのエラー解決の糸口を見つけることが出来るのではないでしょうか。

**使用した環境**
参照画像として使用したUiPath Studioのバージョンは、コミュニティライセンスのv2020.2.0-beta108となっています。

##よくあるエラーメッセージ<エラーマーク編>
###1. 「'○○'から'△△'への暗黙の型変換はできません。」や「型'○○'を'△△'へ変換できません。」
　　　　![ERROR1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614942/86b29600-2940-5fc1-7058-98cf3b44b9ea.png)

このエラーメッセージは、セットした変数の**型の不一致**が原因です。
したがって、「○○　△△に変換　UiPath」などでWeb検索し、適した変数の型で値をセットしなおしてみましょう。

【上記画像の場合】
　要因　　：
数値(Int32型)の変数に文字列(String型)の変数の値を入れようとしている(型の不一致）

　解決策　：
文字列(String型)を数値(Int32型)に変換する
→右辺値を「 int32.Parse(strTarget)」にする、あるいは、「 Cint(strTarget) 」にしても解決できます。
　　　　![ERROR1解決例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614942/514346df-6424-e2b1-576b-768de0110e83.png)



　
###2. 「式の終わりが必要です。」
　　　　![ERROR2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614942/373668bc-0b18-91a2-7006-07ed003702c3.png)

このエラーメッセージは、値が正しくセットできていないことを示しています。
例えば、String型の値をセットする際に「""」がきちんと値の両端に入っていない場合や、
条件文にセットする式の一部分が間違えている場合等に、よく見るエラーメッセージとなります。
再度、セットした値を確認してみましょう。

【上記画像の場合】
　要因　　： 
ファイルパスを指定する欄は文字列(String型)として表記する規定なのに、文字列として表記していない

　解決策　： 
ファイルパスを直接指定する際は、ファイルパスの両端を「"(ダブルクォーテーション)」で囲み、
文字列として表記する
　　　　![ERROR2解決例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614942/04619756-1366-1687-8056-6dd6decf6322.png)

###3. 「'(変数名)'は宣言されていません。」
![ERROR3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614942/d86ae16a-d501-64a1-d60e-95e9e3a1acaa.png)

このエラーメッセージは、**指定した(変数名)で変数が正しく作成されていない**ことを示しています。
作成していない場合は、変数をセットしたい欄を選択後、「Ctrl + K」を押下して変数を作成する、
または、変数パネルより作成してください。

作成したが、上記のようなメッセージが出てしまった場合は、
変数名が正しいか、またその変数のスコープ範囲が狭い範囲になっていないかを
変数を作成したアクティビティに戻り、変数パネルを確認してみましょう。
![変数パネル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614942/d2acac86-ffce-2136-a468-576b8721a0c5.png)


#　最後に
最後までお付き合い頂きまして、ありがとうございます！

「UiPathをやり始めたけど、エラーばっかで嫌になってた」
「UiPathのエラーで止まって、右往左往もいかない、、」
って方のご支援に少しでもなっていれば幸いです。

もっとこういうところも知りたいや、ここって間違ってません等、本記事にご意見ある方は
ぜひコメントで教えてください。
【Rails】画像アップロードの実装（自分用メモ）

#はじめに
アプリを作成する中で、画像を投稿する。といった実装は比較的必要になってくる知識だと思っています。
なので、この実装方法について定着するまでのメモとして、手順をまとめておこうかと思っています。

#導入までの手順

##1.gemをインストール

Gemfileに対象のgemを記述

```Gemfile
gem 'carrierwave'
gem 'mini_magick'
```
gemはアルファベット順に並べる方が良いらしい（ボソ）

その後、ターミナルで `bundle install`

##2.`.gitignore` に記述
投稿する画像をGithubで管理する必要がなければ、`.gitignore`に以下の記述を追加しましょ。

```app/.gitignore
public/uploads/*
```
public/uploads/を指定する理由は、アプリケーションのpublic以下に溜まってくみたいなのです。

##3.アップローダーの作成
末尾の `image` は任意の文字列でOK。
でも基本的に画像に紐づいた名前にしてあげましょ。

```
rails g uploader image
```

##4.画像を扱うテーブルに紐づくモデルにマウント

`mount_uploader :image, ImageUploader`そういう言葉だと覚えちゃいましょ

```(例)item.rb
class Item < ApplicationRecord
  belongs_to :user

  validates :content, presence: true, unless: :image?

  mount_uploader :image, ImageUploader #←これを記述じゃ
end
```

##5.`image_uploader.rb`に`minimagic`使うよ。の記述をする

```/app/uploaders/image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base
  # Include RMagick or MiniMagick support:
  # include CarrierWave::RMagick
  include CarrierWave::MiniMagick
  # storage :fog
# 〜省略〜
  process resize_to_fit: ["任意の数値", "任意の値数値"]
# 〜省略〜
end
```

`include CarrierWave::MiniMagick`と`process resize_to_fit: [50, 50]`については実は最初から記述されていたり。
なので、コメントアウトを外すだけでもOK。

##補足
###riseze_to_fitですが、実は他にも種類があるようで。

|名前            |意味                                           |引数[第一引数,第二引数,第三引数,第四引数]                                 |用途                                  |
|:-------------:|:--------------------------------------------------------------|:----------------------------------------------------------------------|:------------------------------------|
|resize_to_fit  |指定した大きさより小さい場合、指定した大きさまで拡大|[width,height]|縦横比を維持してフレキシブルに表示したい時とか|
|resize_to_limit|指定した大きさより小さい場合なにもしない。でも余白を塗り潰したりもできるぞ|[width, height, 余白の色, どの位置を中身に画像を表示するか]|縦横比を維持して、固定の領域に画像全体を表示したいときとか|
|resize_to_fill |指定の場所から、指定しただけの幅高さで画像をカット|[width,height,どの位置を中心に画像を表示するか]|画像見切れても良いから、指定の領域に同一のサイズで表示したいとき|
(これ以外にもたくさんあるようだ）

###拡張子の指定なんかもできちゃうみたい
生成した`image_uploader.rb`をよ〜〜〜〜くみると、拡張子を指定するような記述が。
どうやらこのコメントアウトを外せば拡張子も指定できるようです。
事故防止のためにもここで指定してしまってもいいかもしれないですね。

```/app/uploaders/image_uploader.rb
   def extension_whitelist
     %w(jpg jpeg gif png)
   end
```

#最後に
なんとなーく言われるがママに使ってましたが、こうやっておさらいしてみると実装中にこまった部分なんかもCarrierWave側で色々対応できそうです。
あと、記事書いている内に少しググったりしましたが、同じような記事いっぱいありました（笑
わざわざやる必要なかったな・・・笑

ではでは、ありがとうございました。
AppGoat：ディレクトリ・トラバーサル


# ディレクトリ・トラバーサルとは
ウェブアプリケーション上のファイル名を指定可能な機能を利用した場合、入力されたファイル名へのチェックが不十分だと非公開なファイルへのアクセスなどを許してしまう脆弱性。

# 脆弱性の原理
ウェブアプリケーションの入力欄、URL中のクエリストリングを用いた入力でファイル名を指定する場合、パスを書き換えることにより公開していない部分のファイルにアクセスすることで被害が発生しうる。
入力されたファイル名のチェックが不十分で、公開していない部分にパスを用いてアクセス可能なことが原因である。

# 脆弱性が悪用された際の影響
被害を受けるのはウェブサーバである。
悪用された際はサーバ内の非公開も含めたファイルの閲覧、改ざん、削除が起きうる。

# 対策方法
可能ならば外部の入力値で直接ファイル名を指定できないようにすることが有効。
リスト形式で選択したり、番号で指定するようにする方法などが考えられる。

外部からの入力が必要な際は、ファイル名にディレクトリ名が含まれないようにし、攻撃者によるパスの指定で非公開な部分にアクセスできないようにする必要がある。
PythonとSympyで重積分

ここではPythonを使った重積分について書いていきたいと思います。

## 基本の形

```python:

from sympy import *

x = symbols('x')
y = symbols('y')

f = x**2 + y**2 + 1

integrate(f,(x, 0, 1),(y,0,1))
```

因みに

```python:

x = symbols('x')
y = symbols('y')
```
の部分は

```python:

x = Symbol('x')
y = Symbol('y')
```
または

```python:

x,y = symbols('x y')
```
でも大丈夫です。

また以下の様に書けばz=fの曲面を描けます。

```python:
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D

x = y = np.linspace(-5,5)
X,Y = np.meshgrid(x,y)
f = X**2 + Y**2 + 1
fig = plt.figure(figsize = (10,10))
ax = fig.add_subplot(1,1,1,projection="3d")
ax.plot_surface(X, Y, f)
```
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359600/adbc46d2-2092-32c5-df47-fa7a748f6e19.png)


## 積分領域が三角形

```python:
from sympy import *

x = symbols('x')
y = symbols('y')

f = x**2 + x*y*2 + 1

#左に書いてある変数から積分する。
integrate(f,( x, 0, 2-y),(y, 0, 2))
```

##積分領域が扇形

```python:
from sympy import *

x = symbols('x')
y = symbols('y')

f = x**2 + y**2 + 1

#積分領域を不等式で書いてもうまくいかない。
integrate(f,(x, 0, sqrt(1-y**2)),(y,0,1))
```


## スカラー場の面積分

```math:

\vec{r}(u,v) = ( \cos u, \sin u, v)\\
D:0 \leq u \leq \pi,~~0 \leq v \leq 1\\
におけるスカラー場~f=\sqrt{x^2+y^2+z^2}の面積分の値を求めよ。
```
```python:
from sympy import *

u = symbols('u')
v = symbols('v')

r =Matrix([ cos(u), sin(u), v])

A = [0]*3
A[0] = diff(r,u)[0]
A[1] = diff(r,u)[1]
A[2] = diff(r,u)[2]
B = [0]*3
B[0] = diff(r,v)[0]
B[1] = diff(r,v)[1]
B[2] = diff(r,v)[2]

C = np.cross(A,B)
print(C)
#よってAとBの外積の長さは1

#pythonはcos(u)**2+sin(u)**2=1を使ってはくれないので自分で式変形。
f = sqrt(1+r[2]**2)
integrate(f,(v, 0, 1),(u,0,pi))
```
VirtualBoxでACPIシャットダウンが効かない時のコマンド

##「あれ、いつもみたいにシャットダウンできないぞ、、？」
いつもならVMを終了する際、ACPIシャットダウンを押して終了させるだけだが、新たに入れたVMでは何故か反応がなくシャットダウンできなかった。解決策をメモ書きしておく。

##解決策
とりあえずログインしたままで、以下のコマンドを入力し、Enterを押す。
`yum install acpid`
色々文字がざーっと出てきて、「y/n」が聞かれるが「**y**」と入力してEnter。

完了したら次に、以下のコマンドを入力してEnter。
`service acpid start`

処理が終わったら、左上の「仮想マシン」メニューから「ACPIシャットダウン」を押して、無事電源が切られれば終了！
（終了の際、普段の画面と違い色々ログみたいなのが流れてきますが、「OK」がついていれば無視してOK）

###補足

そもそも上の作業は何やってたの？っていう疑問があるかもしれないので補足。（間違いあればご指摘ください）
【流れ】
acpidをインストール→起動させた。
（要は、電源を扱うプログラムを入れて、働けー！と指示を出したみたいなイメージです。）

【単語】
・acpid
ACPIイベントを受け取り、電源関係の仕事を行う常駐プログラム
・ACPI
コンピュータの電源管理をしたり、ハードウェアの構成管理を行うための標準規格の一つ。

以上！
サーバーって何？

# サーバーって何なの？
サーバーについて学んでいて中々複雑なので１から急遽まとめることにした。
結論から言うと、**サーバーはサービス自体そのものを提供するコンピューターのこと**です。
ちなみにコンピューター＝パソコンではないので注意。

## 具体例
・ゲームしていたらサーバーが落ちた
　→このサーバーはゲームのオンライン環境を提供しているものと思われる。

# サーバーの役割は何なのか
主に以下の２つになる
①データの管理、保存(データベースサーバー)
②パソコン同士の通信（WEBサーバー）
この２つについて詳しく見ていきましょう。

## データベースサーバーとは
正直、このサーバーって別にWEB（アプリ）サーバーと一緒でよくない？と思ったのですが、
全くその通り。ただ、**サーバーの負担を減らすため**にデータベースの物だけ別に作ったよという感じ。

## WEBサーバーとは
結論から言うと**リクエストに対してのレスポンスを返すため**のサーバー。
ちょっと簡潔すぎたので以下の具体例でも見てください。
・ブラウザにある「マイページを表示するためのボタン」をクリックした。（リクエスト）そうするとWEBサーバー側は「マイページを表示する画面に移せってリクエストがきた！」と受け取り、そのための情報をリクエスト側に返します。（レスポンス）

このリクエスト、レスポンスをするためにWEBサーバーがあると考えてください。
そうするとWEBサーバーが情報を受け取ったり、または送ったりするために
**IPアドレスというものが必要**になってきます。これについては次回、説明します。