OmniAICreator/Qiita-1.07M huggingface dataset:
プログラムはなぜ動くのか？を読んでみてまとめることで知識の定着を図る投稿#7

[プログラムはなぜ動くのか第２版](amazon.co.jp/プログラムはなぜ動くのか-第２版-知っておきたいプログラムの基礎知識-矢沢久雄/dp/4822283151/ref=sr_1_1?adgrpid=53631245656&gclid=Cj0KCQjw0pfzBRCOARIsANi0g0tajATNcn3H7Ogokqrdst5O2JctSzMRb6A0XyW5GegcPbJwaEvZO84aAlK8EALw_wcB&hvadid=338517958683&hvdev=c&hvlocphy=2392&hvnetw=g&hvqmt=e&hvrand=9776556383623440456&hvtargid=kwd-334563073858&hydadcr=27265_11561134&jp-ad-ap=0&keywords=プログラムはなぜ動くのか&qid=1583760691&sr=8-1)

を僕が師匠と読んでいる方に進めていただき、読んでみようと思いました。
そこで、僕的にはかなり難しいこともあり、この本をまとめながら読み進めていくことによって理解度を高めようと思いました。

こちらはあくまでも推奨する記事ではなく、僕がこうした方が定着しやすいかもと思い、記録に残すことにしました。

#データを２進数でイメージしよう

##コンピュータが情報を2進数で取り扱う理由

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/5dea5295-026a-d608-8b5e-2aeb04bb942c.png)

コンピュータの内部が、ICと呼ばれる電子部品で構成されていることをご存知でしょう（知らねーよ）

第1章で説明したCPU（マイクロプロセッサ）やメモリーもICの一種です。（へぇ〜）

ICは、黒いボディーの両側に数本〜数百本のピンがついたムカデのような形状や

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/5ae64023-ec66-2afe-5bcb-7c840ffbf23a.png)

ボディーの裏にピンが並んだ剣山のような形状をしています（これかな？）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/5c2237a0-1aaa-cdb0-944c-ca8c226a1ffa.png)

ICが持つ全てのピンは、直流電圧0Vか＋５Vのいずれかの状態になっています。

つまり、ICのピン１本では、2つの状態しか表せないのです。（へぇ〜）

このようなICの特性から、コンピュータでは、必然的に情報を2進数で取り扱わなければならないことになります。（なるほど）

1桁（１本のピン）で2つの状態しか表せないので、0,1,10,11,100とカウントする２進数になるのです。

###2進数は別にICのために考案されたものではない

ICの特性がたまたま２進数にあっていたのです。

コンピュータが取り扱う情報の最小単位であるビットは、２進数の1桁に相当します。

ビット(bit)は、binary digit(２進数）を略した言葉です。

２進数の桁数は、8桁、16桁、32桁と8の倍数とするのが一般的です。（へぇ〜）

これは、コンピュータで取り扱う情報の単位が、8桁の２進数を基本としているからです。

8桁の２進数のことをバイト（byte）と呼びます。

バイトは、情報の基本単位となります。

ビットが最小単位で、
バイトが基本単位です。

メモリーやディスクにはバイト単位でデータが格納され、

バイト単位でデータが読み書きされます。

ビット単位では、読み書きできないので基本単位がバイトになる。

##まとめ

ビットとバイト

そして２進数とICは本当に運命の出会いであったこと

なんかロマンチックで素敵やん！！
iCheckを使用したチェックボックスでチェックの数を制限する方法

iCheck.jsを使用したチェックボックスでチェックの数を制限したいと思ったのですが、
iCheckだと普通のclickやchangeイベントなどは使えないんですよね。

そこでiCheckの場合のチェックボックスのチェックの数を制限する方法をご紹介します。

前提として、jQueryとiCheck.jsは既に読み込んでいるものとします。

```index.html
<div class="limit-checkbox-group">
  <label><input name="" value="その１" type="checkbox" class="flat">その1</label><br>
  <label><input name="" value="その2" type="checkbox" class="flat">その2</label><br>
  <label><input name="" value="その3" type="checkbox" class="flat">その3</label><br>
  <label><input name="" value="その4" type="checkbox" class="flat">その4</label><br>
  <label><input name="" value="その5" type="checkbox" class="flat">その5</label><br>
</div>
```

```script.js
// ここはiCheckのカラー設定
$(function () {
    $('.limit-checkbox-group input[type="checkbox"].flat').iCheck({
      checkboxClass: 'icheckbox_flat-red',
      radioClass: 'iradio_flat-red'
    });
});

// ここのコードに注目（チェックは３つ制限）
$(".limit-checkbox-group").on("ifToggled", function() {
    checkboxes = $(this).find("input:checkbox");  
    if (checkboxes.filter(":checked").length >= 3) { 
        checkboxes.not(":checked").iCheck('disable'); 
    } else { 
        checkboxes.not(":checked").iCheck('enable');
    } 
});
```

## 解説

onchangeイベントではチェック状態変更の検知ができないので、`ifToggled`というイベントを使用します。
これで`limit-checkbox-group`クラスの範囲内で入力のチェック状態が変更されたのを検知できます。

次は`$(this).find("input:checkbox")`でチェックボックスを取得して`checkboxes `に格納しています。
この`checkboxes`に`filter`メソッドと`length`プロパティ使い、チェックされたチェックボックスの数を検出してif文で比較します。

チェックが既に３つであればiCheckのチェックボックスを`disable`にして無効化に、
３つ未満であればiCheckのチェックボックスを`enable`にして有効化にしています。


#### 参考にさせていただいたURL
[iCheck.jsを使ってる時のchangeイベント](https://inter-arteq.com/2016/07/07/icheck-js%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%8B%E6%99%82%E3%81%AEchange%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88/)
https://stackoverflow.com/questions/18906657/limit-number-of-checked-checkboxes-using-icheck
[漏洞通告]通达OA任意文件上传并利用文件包含导致远程代码执行漏洞(0day)

### 漏洞描述
通达OA是一套办公系统.近日通达OA官方在其官方论坛披露了近期一起通达OA用户服务器遭受勒索病毒攻击事件并发布了多个版本的漏洞补丁.
经过亚信安全网络攻防实验室分析,该0day漏洞真实存在,漏洞类型为任意文件上传,受影响的版本存在文件包含漏洞.成功授权的远程攻击者可以通过精心构造的请求包进行文件包含并触发远程代码执行.

### 漏洞编号
无

### 漏洞威胁等级
高危

### 受影响范围
V11版
2017版
2016版
2015版
2013增强版
2013版

### 漏洞验证

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/d37dab2c-53a8-97bd-a3b2-9b7586cc7017.png)



### 修复建议
及时更新漏洞补丁
http://www.tongda2000.com/news/673.php

### 时间轴
[0] 2020/03/13 通达OA论坛发布紧急通知
[1] 2020/03/17 亚信安全网络攻防实验室分析&复现该漏洞并发布漏洞通告

### Reference
http://club.tongda2000.com/forum.php?mod=viewthread&tid=128372
http://club.tongda2000.com/forum.php?mod=viewthread&tid=128377
PythonとAPIでディレクトリ内の最新の人物画像の背景除去を自動化する

# やりたいこと
1. 人物画像の背景除去
2. 背景除去する画像のインプット先と背景除去した画像のアウトプット先を細かく指定
3. フォルダ内の最新の画像の参照
4. それらの自動化


OpenCVやらfacenetやらを使って画像から顔認識を行い、なんらかの処理を行いたいことがたまにはあるでしょう。もちろんそれらのツールで顔を認識してくれますが、画像内の背景などの不要なものによって “顔認識の精度が劇的に落ちるときがある” ことがわかりました。では、予め背景を取り除いておいてあげて、顔認識の精度を安定させよう！ということで背景除去を行います。まぁ動機はなんでもいいです。

# remove.bg
背景除去そのものは[remove.bg](https://www.remove.bg/ja)というWebアプリケーションを使います。どんなもんかは見た方が早いです。
before
![Lenna.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515144/198ac520-d6a2-302f-cbd1-359b354acf59.jpeg)
after
![Lenna-removebg-preview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515144/a9d05011-1228-957f-862c-5d77616ae2b7.png)
[remove.bg](https://www.remove.bg/ja)はこんな精度の高い背景除去がWeb上で簡単に行えます。

# 背景除去の自動化
自分が実装中のシステムの一部として、画像が格納されているディレクトリ内の “最新の” 画像を参照して、背景除去を行い、別のディレクトリに結果を返すという構造を自動化していきます。

[remove.bg](https://www.remove.bg/ja)はAPIを公開しているので、それを使って背景除去は自動化できます。会員登録し、通常のアカウントで1ヶ月50回まで無料でAPIを呼び出せます。

```py
# Requires "requests" to be installed (see python-requests.org)
import requests

response = requests.post(
    'https://api.remove.bg/v1.0/removebg',
    files={'image_file': open('/path/to/file.jpg', 'rb')},
    data={'size': 'auto'},
    headers={'X-Api-Key': 'INSERT_YOUR_API_KEY_HERE'},
)
if response.status_code == requests.codes.ok:
    with open('no-bg.png', 'wb') as out:
        out.write(response.content)
else:
    print("Error:", response.status_code, response.text)
```
'INSERT_YOUR_API_KEY_HERE'の部分に[remove.bg](https://www.remove.bg/ja)で取得したAPI Keyを挿入します。
画像のインプットとアウトプットの自動化はパス指定で簡単にできます。
'/path/to/file.jpg'の部分に背景除去を行いたい画像のパスを指定します。
'no-bg.png'の部分でアウトプットしたい画像のファイル名を決めてディレクトリのパスを指定できます。

# 最新画像の参照

今回はmac標準のPhoto Boothというカメラアプリで撮影した“最新の” 画像をインプットしたいので、パス指定は少しだけ工夫します。

```py
i_path = '/Users/username/Pictures/Photo Boothライブラリ/Pictures/*'
list_of_files = glob.glob(i_path) 
latest_file = max(list_of_files, key=os.path.getctime)
```
i_pathで取得したい画像が格納されているディレクトリを指定しています。
glob関数でディレクトリ内の画像一覧を取得しています。
max関数とオプション指定でファイルの日時の最大値、つまり最新の画像が取得できます。

# 全体のコード

```py
import glob
import os
import requests

i_path = '/Users/username/Pictures/Photo Boothライブラリ/Pictures/*'
list_of_files = glob.glob(i_path) 
latest_file = max(list_of_files, key=os.path.getctime)

# RemoveBgAPI
response = requests.post(
    'https://api.remove.bg/v1.0/removebg',
    files={'image_file': open(latest_file, 'rb')},
    data={'size': 'auto'},
    headers={'X-Api-Key': 'INSERT_YOUR_API_KEY_HERE'},
)
if response.status_code == requests.codes.ok:
    with open('/Users/username/output/no-bg.png', 'wb') as out:
        out.write(response.content)
    print('Success!')
else:
    print("Error:", response.status_code, response.text)
```

# まとめ
remove.bg APIのおかげで背景除去の自動化が非常に簡単に実装できました。
また、最新の画像ファイルの指定という小技もすぐ実装でき、目的を達成しました。
手動で面倒くさい作業はプログラムに投げると楽でいいですね。
OutSystemsでセッションタイムアウトをアプリケーション側で制御する

OutSystemsのセッションタイムアウト時間の変更は、通常は、ASP.NETの設定ファイル（machine.configかweb.config）で行われます。
しかし、トラブルシュート等のために開発側のエンジニアだけで変更したいこともあると思います。
今回はそういう目的に使えるForgeのコンポーネントを紹介します。

簡単なロジックなので、Visual Studioさえあれば、Forgeをインストールできない環境でも同じExtensionが作れるはずです。

# 動作確認環境
Personal Environment(Version 11.7.3 (Build 5968))
Service Studio(Version 11.6.30)
Browser Session Timeout(Version 2.0.1)

# Forgeコンポーネント
Browser Session Timeout
https://www.outsystems.com/forge/component-overview/1365/browser-session-timeout
C#で書かれたExtensionです。

この記事中で出てくるAction名はこのコンポーネントのものです。

# タイムアウト値を変更する
現在のセッションのタイムアウト値を変更する、SetSessionTimeOut Actionを使います。
パラメータは、現在のセッションに設定したいタイムアウト値を分数で指定します。このタイムアウト分の時間、リクエストをしないでいると、そのセッションはタイムアウトです。

![qSessionTimeout1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/3f6bde14-4a73-cc53-3c7c-23acffff646f.png)

1分でタイムアウトさせる例。

現在のセッションのタイムアウト値を確認するときは、GetSessionTimeOut Action。

# 即座にセッションを無効にする
パラメータのないClearSession Actionを呼ぶとセッション変数をクリアし、ユーザーをログアウトさせます。

実際にScreen Actionをこのように作ってテストしてみました。
![qSessionTimeout2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/bf0b63c2-bb5e-6cd2-c5b2-f40a4bfb15c2.png)

すると、ClearSession呼び出し直後では、GetUserIdがログインユーザーのIdを返す（＝普通はログイン中を表す）。
ただ、その後（Preparationが動いた後）、ちゃんとSecurityExceptionが発生し、Session変数もクリアされていました。ドキュメントからはわかりませんが、タイムラグがあるのかもしれません。

# C#のソースコードを確認してみる
各Actionに対応するC#のコードの主な部分を抜粋してみます。
.NETのSystem.Web.HttpContext.Current.Session.Timeoutに対する薄いラッパとして作成されているようです。

SetSessionTimeOut（ssMinutesはInput Parameterの分単位のタイムアウト時間）

```c#
HttpContext.Current.Session.Timeout = ssMinutes;
```

GetSessionTimeOut（ssMinutesはOutput Parameter）

```c#
ssMinutes = HttpContext.Current.Session.Timeout;
```

ClearTimeOut

```c#
HttpContext.Current.Session.Clear();
```

# 無効にしたのに、次のアクセスでSecurity Exceptionが起きない？
Persistent Loginを有効にしていると、タイムアウト発生後の次のアクセスで自動的に再ログインされてしまい、Security Exceptionが発生しないようです。
Security Exception発生時のトラブルシュートでこの機能を利用する場合はご注意ください。

（Persistent LoginはCookieを使って、一定期間はユーザーのログインを維持させる仕組みです。
標準のログイン画面では、「Remember me」のチェックボックスを入れておくとこの機能を使ってログインされます）
決定回帰木の可視化について

決定木が中で何をしているのか、
classifierであれば、大量に情報がありますが、Regressorになると激減して困っています。誰かご存知の方いらっしゃいますか。

dtreevizを使うとできるらしいのですが、
引数が今ひとつわかりません。
Graphvizではできないのですか。

よろしくお願いします。
Slackメッセージにハイパーリンクを使う小技

# はじめに
Slack メッセージにハイパーリンクを使えるようになっていました。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18646/babdca86-9f80-f126-1751-3b34aab1f899.png">


# (1) 選択済みテキストにURLを貼り付ける
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18646/afc02cf5-bb27-3148-98d8-b0cbf92cacaf.png">
:arrow_down: 
<img width="450" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18646/13a62c18-06ab-5760-bcc8-364e60db8524.png">


# (2) ハイパーリンクそのものを貼り付ける
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18646/532319d9-a946-6fe6-49fe-46182f92a3d7.png">
:arrow_down: 
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18646/59f3da3a-0316-d0bc-a45c-50f4304999bc.png">
[Kubernetes]Jobの動作を確認する 1

#はじめに
これまでDeploymentの動作を確認してきましたが、これからはJobの動作を確認したいと思います。

JobとはReplicaSetと同様にPodを管理する上位リソースですが、ReplicaSetと違って何かしらのジョブを実行したら、そのPodは削除されます。
なので、定常的な業務を動かすのではなく、バッチ処理的な業務での活用が考えられます。代表的なところだと、バックアップ、データ連携などでしょうか。

#Jobの作成
以下のマニフェスト（yamlファイル）を作成しました。

```sampleJob.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: sample-job1
spec:
  template:
    spec:
      containers:
      - name: sample-job1
        image: centos:latest
        command: ["echo"]
        args: ["hoge"]
      restartPolicy: Never
```
Cent OSのコンテナをデプロイして、そこでechoで"hoge"と表示させるだけのJobです。

applyします。

```
$ kubectl apply -f sampleJob.yaml
job.batch/sample-job1 created
```

#確認
作成したJobを確認します。

```
$ kubectl get jobs -o wide
NAME          COMPLETIONS   DURATION   AGE   CONTAINERS    IMAGES          SELECTOR
sample-job1   0/1           21s        21s   sample-job1   centos:latest   controller-uid=7fc0d5b6-663e-4a7a-b78d-0290faa3729d
$ kubectl get pod -o wide
NAME                READY   STATUS      RESTARTS   AGE   IP              NODE           NOMINATED NODE   READINESS GATES
sample-job1-m85pt   0/1     Completed   0          64s   192.168.79.78   k8s-worker01   <none>           <none>
```

STATUSがReplicaSetとと違って、「Completed」となってますね。Jobがもう終わって、Podは削除されているようです。

Jobがちゃんと実行されたのか、logを確認してみます。

```
$ kubectl logs sample-job1-m85pt
hoge
```
ちゃんと実行されてますね。

#まとめ
一つのJobの実行が終わったらすぐにその環境を削除するなんて、まさにマイクロサービスって感じがしますね。
Jobをうまく利用できるとHWリソースの節約にもなりますので、これからこのJobの動作を確認したいと思います。
医療情報データベースのまとめ！自分の使える情報を把握しよう

どうも、パパブロガーの[アツポン](https://a2poyo.com/)です。

最近は医薬品開発や大学院の研究でも医療情報データベースを活用することが増えてきました。

ただし、医療情報と言っても電子カルテやレセプト（診療報酬明細書）、DPCなど様々なデータがあり、それぞれのデータに特徴があります。

そのため、利用する医療情報データベースが何に由来するのか把握する必要があります。

その際に役立つ情報サイトを紹介します。

由来するデータベースを把握しておくことも大事になりますので、ぜひ参考にしましょう。

#医療情報データベース一覧
日本薬剤疫学会では「薬剤疫学とデータベースタスクフォース（TF）」を立ち上げて乱立している医療情報データベースの一覧表を作成しています。

日本で使用可能な主なデータベースが網羅されています。

[医療情報データベース一覧](http://www.jspe.jp/mt-static/FileUpload/files/JSPE_DB_TF_J.pdf)


#医療情報データベース検索
日本薬剤疫学会では医療情報データベース検索サイトも立ち上げ、自分の求めているデータベースとマッチングできるように設計されています。

[医療情報データベース検索サイト](https://sites.google.com/view/jspe-database-ja/%E3%83%9B%E3%83%BC%E3%83%A0)

#参考書籍
個人的におすすめの書籍は医学の歩みの医療情報データベース特集号です。

増え続けている医療情報データベースを分類してまとめてあり、主要なデータベースは例示して本文中で特徴も書かれていて全般を把握したい人にはおすすめです。

![医学の歩み](https://www.ishiyaku.co.jp/photo/jcem26511.jpg)

以上、医療情報データベースを把握したい人向けの内容でした。
yukicoder No.927 Second Permutation

[問題リンク](https://yukicoder.me/problems/no/927)
####解説
最も大きい並べ替えは降順ソートで求まる。
$2$ 番目に大きい並べ替えは最も大きい並べ替えの一個前の順列なので、prev_permutationしてやればよい。
prev_permutationができない場合やprev_permutationした後の数の最初の文字が0の時は解が無いことになる。
####コード
```cpp
#include <bits/stdc++.h>
using namespace std;
using lint = long long;
#define all(x) (x).begin(), (x).end()

int main(){
    string X;
    cin >> X;
    sort(all(X), greater<>());
    if(!prev_permutation(all(X))){
        cout << -1 << endl;
        return 0;
    }
    if(X[0] == '0'){
        cout << -1 << endl;
        return 0;
    }
    cout << X << endl;
}
```
Doker Toolboxを使ってDjango開発環境を構築する

#はじめに
~~この記事は主に自分用のDjango開発環境構築メモなので、至らない点も多いと思いますがご了承ください。タイトルの通り、Docker Toolboxを使ってDjango開発環境を構築する手順をまとめておきます。~~

より分かりやすくブログの方に書いたので、そちらをご覧ください。
URL ⇒　https://ryuusan.com/django2/

[docker公式サイト](https://docs.docker.com/compose/django/)

##1.Docker Toolboxを導入
ここは端折ります。(なら書くな)

##2.Django開発環境を構築
[DockerでDjangoの開発環境を作成](https://qiita.com/ykna/items/7e9154857790110abc47)を参考にして3つのファイルを用意し、Docker-compose up -d　を行います。この記事はデータベースの初期化なども説明されており、めちゃくちゃありがたかったです。

##3.ここからが問題だった！！
この環境に限っての話なのかどうなのかは分かりませんが、なぜかconection refusedの嵐です。[localhost:8000](http://localhost:8000)にアクセスしても、[0.0.0.0:8000](http://0.0.0.0:8000)にアクセスしてもダメでした。もちろん、curlでもダメ。

###解決方法
解決方法は、dockerに振り分けられたIPアドレスでアクセスすることでした。つまり、http://　'マシンIPアドレス'　:8000でアクセスすることができました。default machineであれば、最初に立ち上げたときに出ているはずです。また、IPアドレスの確認方法であればググれば出てくるはずなのでわからない場合はググってみてください。

##4.おわりに
こんなことで3時間くらい悩みました・・・。将来の自分や、自分と同じような状況に陥った誰かのためになれば良いなぁ。

#追記　エラー解決編
##"Error: Database is uninitialized and superuser password is not specified."
docker-compose upの際に遭遇。[こちらの記事](https://qiita.com/takos/items/c04ac2a64d519894ee13)で解決。
postgresqlのパスワードは必須ということかな。
【今日の疑問】MVCモデル

こんにちは、今日はTwitterもどきのアプリを作ってたのですがひとまずMVCモデルが理解できてないなと感じたので備忘録代わりに簡単にまとめます。

#MVCモデルとは

RailsなどのフレームワークでCRUDを使ったWebアプリを作る上で一番肝になる考え。

__ユーザーからHTTPリクエストを受け取り、それに応じたリクエストからコントローラーがビューに表示したいアクションを選択して、モデルがその表示したい情報をDBから引っ張ってきてビューを通してレスポンスする...__

流れとしてはこれですがそれぞれの用語についてまとめます笑


###ルーティング
HTTPリクエストを受け取って、それを実行するためのコントローラーとアクションを設定しておくことでどういう風にビューに表示することができるか流れを作ることができる。

###モデル
DBから表示させたいデータをSQLなどを使うことなくrailsだけで実行することができる。これに合わせて知っておきたいことはマイグレーション。

###ビュー
HTTPのレスポンスを返すときにユーザーに表示したいページを構築する部分。

###コントローラー
モデルとビューの橋渡し的な役割。モデルにデータをリクエストしたりビューにそれを渡したりもする。

######参考文献
[MVCモデルとは](https://blank-oldstranger.com/2019/01/11/mvc-model/#CRUD)
FragmentPagerAdapterのページ切り替えを無効にする方法

FragmentPagerAdapterでスワイプの無効/有効を切り替えたかったので実装をメモ。
ViewPagerでは実装できるけどFragmentPagerAdapterでは難しいみたい。
https://stackoverflow.com/questions/41656902/disable-swipe-in-fragmentpageradapter-android

結果、無効というかタブの切り替えは行われないような処理が書けた。
（スワイプしようとしても弾性をもって勝手に元の位置に戻る系の。これはこれでUIとしてありかなと。）
以下、実装。

```kotlin

private lateinit var listener:ViewPager.SimpleOnPageChangeListener
private lateinit var viewPager:ViewPager

                :

//スワイプを無効にする
listener = object : ViewPager.SimpleOnPageChangeListener() {
     override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
          super.onPageScrolled(position, positionOffset, positionOffsetPixels)
          viewPager.currentItem = 固定したいpageのposition
     }
}
viewPager.addOnPageChangeListener(listener)

                :

//スワイプを有効にする
viewPager.removeOnPageChangeListener(listener)
```
Chrome Ver.80系でJavaScriptを無効化する方法

##はじめに
JavaScriptのテスト時にChromeのJavaScriptを無効化したかったが、前のChromeのバージョンでの紹介記事は多かったがChrome Ver.80系での記事が少なかったため、Chrome Ver.80系でJavaScriptを無効化する方法をご紹介します。

##JavaScriptを無効化する方法

1. Chromeの右上にあるメニューボタンを押す。
2. メニューバー中の `設定` を押下する。
3. 検索窓で `JavaScript` と入力する。
<img width="752" alt="スクリーンショット 2020-03-17 22.05.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283595/2d6a3c30-82aa-c5e6-e2de-ebde7bf7bb37.png">
4. `サイトの設定` を押下する。 
5. `JavaScript` を押下する。
6. ステータスバーを `許可（推奨）` を　`ブロック中` に変更する。
<img width="707" alt="スクリーンショット 2020-03-17 22.10.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283595/e66b4378-a4b9-3e25-97e2-09709e5b7f0a.png">

これでChrome上でJavaScriptが無効化されます。
各ブラウザのCookie確認方法

#１．概要

SameSiteの影響で各Cookieが正しく生成されていることを確認する必要がありました。その中で、各ブラウザごとのCookieの確認方法を調査しましたので、その内容をまとめたいと思います。

#２．各ブラウザのCookie確認方法（PC）

### ■Chrome

1．右クリックから「検証」を押下
2．開発ツール右上の「Application＞Cookies」からCookieを確認する

### ■Safari（Mac）

1．右クリックから「要素の詳細を表示」を押下
2．開発ツール右上の「ストレージ＞Cookie」からCookieを確認する

### ■Edge

1．右クリックから「要素の検査」を押下
2．開発ツール右上の「ストレージ＞クッキー」からCookieを確認する

### ■Edge(chromium)

1．右クリックから「開発者ツールで調査する」を押下
2．開発ツール右上の「Application＞Cookie」からCookieを確認する

### ■Firefox

1．右クリックから「要素の調査」を押下
2．開発ツール右上の「ストレージ＞Cookie」からCookieを確認する

#3．各ブラウザのCookie確認方法（スマートフォン）

### ■Chrome（Android）

1．Android端末の「設定　＞　開発者向けオプション　＞　USBでバック」をONにする
2．PCの方でChromeを開き「chrome://inspect/#devices」と入力する
3．PCにAndroid端末をUSBで接続する。そしてAndroid端末の方に「USB接続の用途」が表示されるが「キャンセル」する
4．その後、接続後にAndroid端末の方で「USBデバックを許可しますか？」と表示されるのでOKを選択する
5．PC画面の方に接続したAndroid端末の情報が表示されるので、対象画面の「inspect」を押下する
6．開発ツールが立ち上がるので「Application＞Cookies」からCookieを確認する

※PCはMac、Windowsのどちらでも可能です。またWindowsの場合、Google USB Driverが必要とのことですが特に入れずに動作しました。


### ■Safari（iOS）

1．iPhoneの「設定　＞　Safari　＞　詳細　＞　Webインスペクタ」をONにする
2．MacにiPhoneをUSB接続する
3．MacのSafariを起動し、iPhone側はテストしたい対象の画面に遷移する
　**※接続して一度iPhoneを動かさないとMac側が認識しないようです**
4．MacのSafariの「開発　＞　○○のiPhone　＞　（対象ページのURL）」を選択する
5．開発ツールが立ち上がるので「ストレージ＞Cookie」から対象画面のCookieを確認する

#４．Cookieを確認できないブラウザ

調査した結果、**iOSのChrome**だけはCookieを確認する方法がないようです…。一応以下の方法を試したが無理でした。

- Mac（Chrome）とiPhone（Chrome）をUSB接続する　⇒MacがiPhoneを認識しない
- Windows（Chrome）とiPhone（Chrome）をUSB接続する　⇒WindowsがiPhoneを認識しない

もう少し調査してCookieの確認方法が見つからなければ、あきらめようと思います…

#５．まとめ

iPhoneのChromeはCookieを確認する方法がないので、できる限りiPhoneはSafariを使うといいと思います。（問題が起きてもCookieが原因なら調査できないので…）
【ド文系でも分かる】PHPでFizzBuzz

#なぜ今更FizzBuzz？
僕みたいなゴリゴリの文系卒の駆け出しエンジニアにとってサーバースクリプトに触れてからぶち当たる最初の難関がFizzBuzz問題ではないでしょうか。
ようやく理解できるレベルまで到達したので、文系の皆さんにもわかりやすいようにまとめてみたいと思います。

#そもそもFizzBuzzとは
そもそもコードを書く前に誰もが思うはず。
FizzBuzzってなんだ！！と。
~~FizzBuzzとは、過去に流行った「世界のナ○アツ」的なやつみたいです。~~

> プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。ただし、3の倍数では「Fizz」（Bizz Buzzの場合は「Bizz」）、5の倍数では「Buzz」、両者の公倍数（すなわち15の倍数）では「Fizz Buzz」（Bizz Buzzの場合は「Bizz Buzz」）を数の代わりに発言しなければならない。発言を間違えた者や、ためらった者は脱落となる。

引用元：[Fizz Buzz](https://ja.wikipedia.org/wiki/Fizz_Buzz)

**つまり、1から自然数をカウントしていき、３の倍数と５の倍数、その両方の公倍数のとき（15の倍数）に任意の文字をechoさせてあげればよろしい。
それ以外のときは単に数字をechoさせるロジックで実装すればよろしい。**

#実践
```php:fizzbuzz.php
<?php

for ($i = 1; $i <= 100; $i++) {
    if ($i % 15 === 0) {
        echo 'FizzBuzz' . "\n";
        continue;
    } elseif ($i % 3 === 0) {
        echo 'fizz' . "\n";
        continue;
    } elseif ($i % 5 === 0) {
        echo 'buzz' . "\n";
        continue;
    }
    echo $i . "\n";
}

```
ざっくりこんな感じ。
(あくまで一例です。他にもっと簡単な記述あるよ！などあればご教授いただけると幸いです)

初見はちんぷんかんぷんと思うので、要点を順番に解説していきます。


##①数字をひたすらカウントさせるコードを書く

```php:fizzbuzz.php
for ($i = 1; $i <= 100; $i++) { //変数iが100になるまでechoを実行する
    echo $i . "\n"; //数字が呼び出される（\nは見やすいように改行処理）
}
```
`$i = 1`とは初期値1と定義。
`$i++ `とは`$i = $i+1`の省略形でforが一回発動する毎に変数iに1を足してあげることです。

つまり、ここでは100になるまで変数$iを順にechoする。というコードが書かれています。

##②3の倍数と5の倍数の時に処理を分岐させる

```php:fizzbuzz.php
for ($i = 1; $i <= 100; $i++) { //変数iが100になるまで以下の処理をループ
  if ($i % 15 === 0) { //15の倍数のとき
        echo 'FizzBuzz' . "\n"; 
    } elseif ($i % 3 === 0) { //3の倍数のとき
        echo 'fizz' . "\n";
    } elseif ($i % 5 === 0) { //5の倍数のとき
        echo 'buzz' . "\n";
   echo $i . "\n"; //条件以外の数字が呼び出される
}
```
３の倍数の処理から書きがちですが、プログラミングは上から処理が実行されるのでFizzBuzzの処理（１５の倍数）は一番最初の条件として記述しましょう。

イメージとしては、
15の倍数のときにFizzBuzz出力→3の倍数のときにfizz出力→５の倍数のときにbuzz出力→
それ以外はカウントしたときの数字を出力。

条件内の
`$i % 15 === 0`は変数$iを１５で割った数が0ということ。
つまり`$i % ○ === 0`とするころで、○の倍数が取れるということです。

`===`は厳密に同じという意味。
条件式のイコールは曖昧な一致の`==`だとエラーのリスクが上がるので基本`===`で書きましょう。

##③分岐に入ったらループ処理に戻してあげる

```php:fizzbuzz.php
for ($i = 1; $i <= 100; $i++) { //変数iが100になるまで以下の処理をループ
  if ($i % 15 === 0) { //15の倍数のとき
        echo 'FizzBuzz' . "\n"; 
        continue; //ここでループ処理に復帰させる
    } elseif ($i % 3 === 0) { //3の倍数のとき
        echo 'fizz' . "\n";
        continue; //ここでループ処理に復帰させる
    } elseif ($i % 5 === 0) { //5の倍数のとき
        echo 'buzz' . "\n";
        continue; //ここでループ処理に復帰させる
   echo $i . "\n"; //条件以外の数字が呼び出される
}
```
②までの記述だと条件処理が行われた後に自然数を呼び出す処理も行われてしまうので、
各条件処理の最後に`continue`を使いループ処理をforに戻してあげましょう。

今回はcontinueでループ処理に戻す方法を試していますが、以下の方法もシンプルですね。

```php:fizzbuzz.php
for ($i = 1; $i <= 100; $i++) { //変数iが100になるまで以下の処理をループ
  if ($i % 15 === 0) { //15の倍数のとき
        echo 'FizzBuzz' . "\n"; 
    } elseif ($i % 3 === 0) { //3の倍数のとき
        echo 'fizz' . "\n";
    } elseif ($i % 5 === 0) { //5の倍数のとき
        echo 'buzz' . "\n";
    } else { //上記条件以外のとき
        echo $i . "\n"; //数字が呼び出される
  }
}
```


#おわりに

プログラミングっぽい処理の代表格のFizzBuzzは基本中の基本と言われています。
ロジックで説明されるとよくわからないFizzBuzz問題ですがコードで見ると意外と大したことないかと思います。

他にも解き方はたくさんあるかと思いますがこのやり方が僕にとって一番わかりやすくシンプルだったので、駆け出しエンジニアの皆さんに役立てられるように共有させていただきます。
PowerAutomateでSharePoint上のファイルを別名コピー

# はじめに
PowerAutomateでSharePoint上のファイルをコピーするアクションはありますが、別名でコピーするアクションが無いので一工夫必要です。はっきり言って、投稿するほどのネタではないんですが、自分用のメモとして残しておきます。
久しぶりの投稿がこんなにしょぼいので申し訳ない気持ちです。

# 別名コピー
以下の図のとおりです。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/2303521b-a670-6ebb-0987-494b8d94e497.png)
「ファイルコンテンツの取得」アクションでコピー元のファイルを指定します。次に「ファイルの作成」アクションでコピー先のサイトとフォルダーを決めてファイル名を指定します。
ファイルコンテンツは「ファイルコンテンツの取得」アクションで取得した「ファイルコンテンツ」を指定します。
全く簡単です。

# ちなみに
コピー先の同名ファイルがある場合は上書きされてしまうので注意が必要です。エラーにはなりません。
さらに、そのファイルをロックした状態（誰かが開いている状態）で実行した場合、エラーになります。Status:423になって誰かがロックしてますエラーになります。
コロナウイルスから学ぶdocker-compose

## はじめに
最早今更感ありますが、[新型コロナウイルス対策サイト](https://stopcovid19.metro.tokyo.lg.jp/)が話題ですね
オープンソースコミュニティへの貢献の方法については既に非常に丁寧な記事が出ているので割愛しますが、
docker-composeの紹介をしている人が少ないので書いてみます

勿論ボランティアで何か貢献できれば何よりですが、
このプロジェクトはコミットしないとしてもdocker-composeやvue.jsに触れてみるのにかなりお勧めです
~~正直お国が主導のプロジェクトがどんな地獄なのか見学するつもりで覗いてみたのでびっくりした~~

## docker-compose使ってみよう
新型コロナウイルス対策サイトの[gitリポジトリ](https://github.com/tokyo-metropolitan-gov/covid19)
ソースコードをクローンしたら、出来上がったディレクトリ上で

```
docker-compose up
```

と打つだけで環境構築からサーバーの起動まで終わり、
![スクリーンショット (126).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562066/0e84afe3-f1b1-f7f5-b95c-02cf02d8bd83.png)


ブラウザで[localhost:3000](http:localhst:3000/)にアクセスすると動くようになります、すごーい
![スクリーンショット (127).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562066/74c906f8-892a-200b-dd70-969f2bff0c86.png)

以上、みんなも試しにやってみてね

## 解説
当然docker及びdocker-composeはインストールする必要がありますが...
コマンドいくつか叩けばインストールできるので割愛

## docker-composeで動くことを確認するためにどこを見るのか

プロジェクトのルートディレクトリに[Dockerfile](https://github.com/tokyo-metropolitan-gov/covid19/blob/development/Dockerfile)が

```shell
FROM node:10.19-alpine

WORKDIR /app

COPY package.json yarn.lock ./

RUN yarn install

COPY . .

EXPOSE 3000
ENV HOST 0.0.0.0

CMD ["yarn", "dev"]
```

そして[docker-compose.yml](https://github.com/tokyo-metropolitan-gov/covid19/blob/development/docker-compose.yml)があります

```yml
version: "3"
services:
  app:
    container_name: covid19
    build:
      context: .
      dockerfile: Dockerfile
    tty: true
    ports:
        - 3000:3000
    volumes:
        - .:/app
        - node_modules:/app/node_modules
volumes:
  node_modules: {}
```
docker-compose.ymlがあるからには環境構築がdocker-composeで行えるはずです。
内容によってはこれらの中身を見ればどのようなフレームワークなのかもおおよそ推測できるでしょう
全てを解説すると長くなるし、そもそも完璧に説明できるほど熟知しているかというと微妙ですが

このファイルを見れば**docker-compose.yml**の記述に従って、
`covid19`という命名のappコンテナが立ち上がり、
localhostの3000番ポートでアクセスできるようになる、
という動きをまずは雰囲気で感じることができれば良いと思います

## 終わりに
遊んでみたくなるdocker-composeコマンドを紹介

```
docker-compose up 通常の起動、終了する時はctrl + c
docker-compose up -d => dオプションでデーモン化、バックグラウンド起動できる
docker-compose exec app bash =>　起動中のコンテナの中に入ることができる
docker-compose down => docker-composeで管理しているコンテナを全部終了する
```
Cyber Detective CTF voteforme 200

#問題

https://ctf.cybersoc.wales/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/e913af2f-fdad-3092-4903-bceeb10e4972.png)

#解いてみた

OSINTのCTF！
英語だけどGoogle翻訳使いながらやってみよう。

Jamesはどこの政党を支持しているでしょう？という問題。

問題のTwitterリンクを見てみます。
日本語翻訳で見ていくと反トランプっぽい感じでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/caa45423-20ac-4542-f540-29c42b20688e.png)

今のトランプさんは共和党なので反対の民主党を英語で回答すると正解。
レトロゲーム風ゲーム画面設定

レトロゲーム調は、作ろうとすると、以下の問題が起きます。

●ウィンドウ画面で実行させると画面が小さすぎて分かりにくい。デバッグチェックが厳しい
●フルスクリーンにすると目立ちますが、中間色でドット絵がぼけて表現できない
●画面更新が 60FPS,120FPS などPCのスペックにより変わってしまう

これらの点をクリアする必要があります。

上記3点をクリアしたソースコード

```cpp:main.cpp

# include <Siv3D.hpp> // OpenSiv3D v0.4.2
void Main()
{
	Graphics::SetTargetFrameRateHz(60);   // 60FPS固定
	Size genesis(320,224);  // MegaDrive(海外だとGenesis)の幅と高さのピクセル
	Window::SetTitle(U"Retro game");  // ウィンドウタイトル（フルスクリーンでは表示されない）
	// ウィンドウの枠を非表示にする
	//Window::SetStyle(WindowStyle::Frameless);   // ウィンドウ枠を消す

	Window::Resize(genesis*2); // ウィンドウ画面にしたとき、小さすぎて見えないので2倍にした
	Scene::SetBackground(ColorF(0.8, 0.9, 1.0));
	Window::SetFullscreen(true);
	Scene::Resize(genesis);
	//
	// シーンをウィンドウに転送する際の拡大縮小フィルタを「補間なし」に
	Scene::SetTextureFilter(TextureFilter::Nearest);

	// 背景を水色にする

	// 大きさ 60 のフォントを用意
	const Font font(60);

	// 320*224のテクスチャを用意(メガドライブと同じ画素数)
	const Texture genesisScreen(U"sonic3tails.gif");

	bool fullscreen = true;

	while (System::Update())
	{
		if (KeySpace.down())
		{
			fullscreen = ! fullscreen;
			Window::SetFullscreen(fullscreen);	// Windowかフルスクリーン切り替え
			Scene::Resize(genesis);
		}
		if (KeyN.down()) // 補間なし
		{
			Scene::SetTextureFilter(TextureFilter::Nearest);
		}
		if (KeyL.down()) // 補間あり
		{
			Scene::SetTextureFilter(TextureFilter::Linear);
		}
		genesisScreen.draw();
	}
}

//https://siv3d.github.io/ja-jp/tutorial/window/

```

# 操作キー
● スペース　　　Window画面、フルスクリーン切り替え
● N 　　　　　補間なし、ドットがくっきり見える
● L　　　　　 補完あり、境目の色の中間色で埋める、ぼやけた感じになる

動作はうまくいっている。


使用した画像：レトロゲーム画像、画素数同じ

↓ **sonic3tails.gif** で保存して OpenSiv3Dプロジェクトの **App**フォルダ に入れる
![sonic3tails.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76087/bb1371ad-1d88-31c3-8383-94016aed4d4d.gif)

この画面がフルスクリーンで表示されます。

レトロゲームが好きな人はこれで昔のゲーム機と同じドット絵でのフルスクリーン画面表示可能になります。


画面切り替えを1命令で簡単にできるようにしました。
ブロックをコピペして簡単に使用できます。

続きの記事はこちらです。
https://qiita.com/loppta/items/76aeaa29cd850cf9ad81
Python初心者がエナジードリンクあるあるをコード化してみた

エナジードリンクは体への負担が大きいという事を伝えたい…
それだけのためにお題にしました。（クラスと呼び出しをファイル分けて書いていないのは許してください）

```python
import sys

class Monena:
    def __init__(self):
        self.physical = 50
        self.mental = 50
        self.destruction = False
        self.physical_recovery = 0
        self.mental_recovery = 0


    def status_check(self):
        print('体力は' + str(self.physical))
        print('気力は' + str(self.mental))

        if self.physical < 0 or self.mental < 0:
            self.destruction = True
            print('アウトー!!!')
            sys.exit()

    def work(self, physical_damage, mental_damage):
        print('さあ今日も仕事するか…')
        self.physical = self.physical - physical_damage
        self.mental = self.mental - mental_damage
        self.physical_recovery = physical_damage
        self.mental_recovery = mental_damage

        if self.physical + self.mental < 50:
            self.monena()

        print('ようやく仕事終わった…')
        self.status_check()
        self.sleep()


    def monena(self):
        boost = 100 - (self.physical + self.mental)
        self.mental = self.mental + boost
        self.physical_recovery = self.physical_recovery - int(boost / 2)
        self.mental_recovery = self.mental_recovery - int(boost / 2)

        print('ヒャッハー！')
        self.status_check()


    def sleep(self):
        print('疲れた…寝よう…')

        if self.physical + self.physical_recovery > 50:
            self.physical = 50
        else:
            self.physical = self.physical + self.physical_recovery

        if self.mental + self.mental_recovery > 50:
            self.mental = 50
        else:
            self.mental = self.mental + self.mental_recovery

        self.get_up()


    def get_up(self):
        print('おはよう…もう朝か…')
        self.status_check()


monena = Monena()
monena.work(20, 20)
monena.work(30, 30)
monena.work(20, 20)
monena.work(30, 30)
```
Railsのバージョンを5から6にしたらBlocked Hostというエラーが出てきてびっくりした話

開発中のサービスのRailsのバージョンを5から6に上げたのですが、`Blocked host`というエラーが出るようになりこれまで使えていたユーザーの招待機能が使えなくなる事象に遭遇しました。

Rails 6から導入された新しいセキュリティー対策のようです。
解決策としてエラー画面に表示されている通りconfigファイルに許可するホストを追加しました。

```
development.rb or production.rb
config.hosts << "app.survelion.com"
```

バージョンアップの際は気をつけましょう。

参照記事: https://www.tmp1024.com/articles/solve-blocked-host-of-rails
Mcomixの画像キャシュ効率化

#はじめに

mcomixは漫画等が非常に読みやすいもののpython2であること、そして画像一時ファイルが/tmp以下に作られてしまいHDDアクセスが著しい。
そこで、python3ベースでforkしているmcomixに手を加えて画像キャシュの効率化を計った。

#環境
Linux Mint 19.3(おそらく他のものでディストリビューションでも問題ない)
git
python 3以上
memory-tempfile2.3.2以上（公式web: https://pypi.org/project/memory-tempfile/）
他はgitのREADME.rst参照

#ソースの取得
gitにてソースを自分の作業ディレクトリに移行する。https://github.com/mimaburao/mcomix3.git

```
$git clone https://github.com/mimaburao/mcomix3.git
```

#ライブラリのインストール
README.rstを参照して必要なライブラリをインストール後、memory-tempfileをインストールする。

```
$pip3 install memory-tempfile
```

#画像キャッシュのコードを追加
**clone上では変更済みになっている。**
作業内容としては、
Memoeytempfileのインスタンス(self._tempfile)を作成後、TemporaryDirectory関数を呼び出すと元のコードを流用できる。(以下に修正箇所の抜粋)

```mcomix/archive/archive_recursive.py
from memory_tempfile import MemoryTempfile


class RecursiveArchive(archive_base.BaseArchive):

    def __init__(self, archive, prefix='mcomix.'):
        
        self._tempfile = MemoryTempfile()  #memory-tempfileを使うときのインスタンス
        self._tempdir = self._tempfile.TemporaryDirectory(
            prefix=prefix, dir=prefs['temporary directory'])  #TemporaryDirectoryと同様に利用できる。
```

#問題点
PCの物理メモリにRAMは依存してしまう。通常はdf -hで確認できる。/run/user/なんとか　にあるメモリーが利用できる。このメモリーを超えるとディスクエラーが出てしまう。

#感想
大本のmcomix1.2.1はソフトウェアとしてインストール出来る。しかし、更新が停滞しているようなのでこうしたforkの方で細かい更新がかかれば幸いである。今回はpython3ベースのmcomixがすでにあったため、画像キャッシュのRAM化が可能となった。
RAMを利用するのは"設定"で出来るようになればさらに使い勝手が向上するだろう。いずれは、大きなファイルはメモリー容量一杯になるまで読み込んで、逐次更新できるようになればRAMで完結するはずである。

#参考
Mcomix公式 https://sourceforge.net/projects/mcomix/
Mcomixのフォーク(python3ベース) https://github.com/multiSnow/mcomix3
memoey-tempfile公式: https://pypi.org/project/memory-tempfile/
文字化けしたので調査しました

##文字コード
コンピューターは２進数しか扱えないので、ある２進数を特定の文字だと思い込ませる。これを文字コードと呼びます。
もう少し細かく言うと、文字集合を定義し、その集合の各文字に対応するビット組み合わせを一意に定めたもの。
ただ人間が２進数を読むのは辛いので、一般的に文字コードは１６進数で表されます。


##主な文字コード

###ASCII
英数字と一部の記号のための文字コードです。もっとも基本的な文字コードとして全世界に普及しているものです。
「アルファベット」「数字」「記号」「改行コード」等を１バイトで表現します。

###UTF-8
ASCIIを拡張して作られています。
全世界の文字に適用する目的で作成された文字コードです。世界中の多くのソフトウェアは、UTF-8に対応しています。そのため、「パソコンの世界共通語」と言っても過言ではありません。
2〜６バイトで表現されています。（日本語の文字は基本的に３バイトで表現します。）
ちなみに「亜」という文字は、「E4BA9C」で表します。

###Shiift-JIS
ASCIIを拡張して作られています。
日本語の文字のための文字コードで、日本語を使用する際には最も一般的に普及している文字コードのひとつです。
「半角カタカナ」は１バイトで表現し、それ以外の全角文字は２バイトで表現します。
ちなみに「亜」という文字は、「889F」で表します。

###UTF-16
ASCII拡張ではありません。
UTF-16は、多くの文字を対応し、様々な場面で使われていますが、UTF-8より対応するソフトウェアは少ないです。
世界中の文字全てを2バイトで表現し、残りのマイナーな文字を4バイトで表現します。そのため、半角アルファベット、半角数字、日本語のほとんどが2バイトで表現されます。
ちなみに「亜」という文字は、「4E9C」で表します。

##符号化文字集合と符号化形式
世の中にはたくさんの文字コードがあります。Shift-JIS、UTF-8、JIS X 0208、EUC-JP、Unicode、Shift-JIS、Latin1等。これらは一つの文字コードという概念ではなく、
符号化文字集合と文字符号化方式という二つの概念が存在し、これらが組み合わさって文字を表しています。

######主な符号化文字集合

- Unicode
- JIS X 0208

#####主な符号化形式

- Shift-JIS　(符号化文字集合：JIS X 0208)
- UTF-8　（符号化文字集合：Unicode）
- UTF-16　（符号化文字集合：Unicode）

##文字化け
各文字コードには、表現できる文字の範囲があり、対応していない文字の場合は、変換できずに代替文字が割り当てられます。特にShift-JISと、UTF-8やUTF-16の相互の変換で発生しやすいです。


##まとめ
上記の主な文字コードの「ちなみに文」でもわかるとおり、文字コードによって１６進数コードが全然違うことがわかります。
またASCIIとUTF-8には互換性があることがわかります、UTF-8選ばれている理由ですねー
今回はShift-JISに対応したソフトウェアにUTF-8を使用したことで文字化けしました。
『RaspberryPi4購入』

#『RaspberryPi4購入』

RaspberryPi4が発売されて、噂では4Core、メモリ4GBとなりサーバでも十分使用できる記事を見かけるようになってきたので私も何か作りたい衝動に駆られて、RaspberryPi4 メモリ4GB、HDMIケーブル、microSD、USB充電器が同梱されているセットを秋葉原の『千石電商』で購入。

<img src="https://raw.githubusercontent.com/legitwhiz/legitwhiz.github.io/master/technology_memo/images/RasberryPi/IMG_20200316_124128_473.jpg" width="840">

ケースは、RaspberryPi4を全体的にヒートシンクで覆う、ヒートシンクケースを選択しました。

<img src="https://raw.githubusercontent.com/legitwhiz/legitwhiz.github.io/master/technology_memo/images/RasberryPi/IMG_20200316_124236_904.jpg" width="840">

家に帰り、早速パッケージを開け、ヒートシンクケースを装着し、モニター、キーボードを繋げ、導入済みMicroSDカードを装填し、起動するとNOODSが起動してきてインストールするOSを選択画面が出力されるが、選択肢が「Raspbian Full」と「Libre ELEC」のみが選択できるようになっていた。
だが、今回の目的は、サーバとしての利用なのでwifiを接続すると選択肢が増え、「Raspbian Lite」を選択しインストール。

だが、1.5時間かけてインストールしたが100%にはなるが終わらない…
しょうがないので電源OFF/ONし、再度OSインストールすると45分程で終了。

設定もろもろは、後日に…
GoogleAppEngine StandardEditionでAPCuを使いたい

# 概要
 
* GAE SEでPHP内部キャッシュであるAPCuを使いたい
* しかしGAE SE(PHP7.2)ではAPCu拡張ライブラリは標準で用意されていなかった
* GAE FEではphp.iniに追記するだけで使える模様
* GAE SEでは個別でソースからビルドして組み込めるらしいのでやり方メモを残しておく
* ビルド環境はUbuntu

# 詳細

```
$ mkdir ~/build
$ cd ~/build
$ wget https://pecl.php.net/get/apcu-5.1.18.tgz
$ tar zxf apcu-5.1.18.tgz
$ mv apcu-5.1.18 apcu
$ cd ~/build/apcu
$ apt-get update
$ apt install php7.2-dev
$ phpize
$ ./configure --with-php-config=php-config
$ make
$ ls -l modules/apcu.so
```

* 上記でできたapcu.soをいつもGAEをデプロイする環境にコピーする
* 以下のように配置

```
$ cd ~
$ ll modules
drwxr-xr-x 2 user user   4096 Mar 17 18:28 ./
drwxr-xr-x 9 user user   4096 Mar 17 18:31 ../
-rw-r--r-- 1 user user 573488 Mar 17 18:25 apcu.so

$ vim php.ini
extension=modules/apcu.so
```

上記で完了。これでAPCキャッシュが利用可能となる
ゲッターとセッター、そして temporal coupling

## ゲッターとセッター

オブジェクト志向(以下OO)では、ゲッターやセッターの使用は勧められていません。
使用に際しては慎重さが求められます。

これは、`tell, don't ask` という原則と関係しています。
オブジェクトに対して状態を問い合わせる (ask) のではなく、処理を指示する (tell) ように実装するのが、OOらしい設計なのです。

:point_right: https://martinfowler.com/bliki/TellDontAsk.html

中でも、セッターの使用は特に避けたほうが良いと思われます。
オブジェクトのミューテーションはバグの温床です。
また、値がセットされているかの検査が乱発し、結果としてコードベースのメンテナンス性が低下します。

## temporal coupling

一般的な日本語訳の存在を筆者は知らないのですが、「時系列依存」と訳せるかもしれません。

特定の順序で呼び出される必要のある処理がある場合、それを `temporal coupling` と言います。
適切にカプセル化されていたなら、このようなことは起きないです。

この制約の存在は、得てしてベテランメンバーの頭の中だけに存在し、チームの暗黙知となります。

セッターの使用は `temporal coupling` を生みます。
例を擬似コードで示します。

```
main() { 
    const user = new User()
    user.setId(10) // repo.save(user) より前に必ず呼び出さないといけないので、これは termporal coupling
    
    if (user.id) {
        userRepo.save(user)
    }
}
```

改善例

```
main() { 
    // セッターを使わずに、初期化時にセットされることが保証されている
    const user = new User({id: 10})
    userRepo.save(user)
}
```

## まとめ

- ゲッターとセッターの濫用はダメ、絶対。
- 特定の順序で呼び出される必要がある処理について、アンチパターンとして `temporal coupling` という呼び名が付いている。
Atcoder ABC60 D - Simple Knapsack 別解集

wの幅が小さいのが特徴的
なかなか見ない制約なので初見びびった

#動的計画法
だってナップザックなんでしょ？
じゃあdpやるしかねえだろ　かかって来いぼけ

ということでやってみた
wは10^9のままだとつらいのでbase=w1を引いておこう
そうするとdpの大きさは101×301くらいなので全然間に合う

```python:dp.py
N,W=map(int,input().split())
dp=[[-1]*301 for i in range(N+1)]
dp[0][0]=0

for i in range(N):
    w,v=map(int,input().split())
    if i==0:
        base=w
    for i in range(N)[::-1]:
        for j in range(301)[::-1]:
            if dp[i][j]!=-1:
                dp[i+1][j+w-base]=max(dp[i][j]+v,dp[i+1][j+w-base])

ans=0
for index,item in enumerate(dp):
    if W-index*base+1<=0:
        break
    ans=max(max(item[:W-index*base+1]),ans)

print(ans)

```

#貪欲
重さが4種類しかないので各wをまとめたリストからvの大きいものを取り出していけばいい
取り出す個数は各wについて総当たりで試せばよい

```python:greedy.py
def saiki(value,HP,num):
    if num==0:
        value+=wa[0][min(HP//base,len(wa[0])-1)]
        ans.append(value)
    else:
        for i in range(len(wa[num])):
            if HP-(num+base)*i>=0:
                saiki(value+wa[num][i],HP-(num+base)*i,num-1)
            else:
                break
    return


N,W=map(int,input().split())

lis=[[] for i in range(4)]

for i in range(N):
    w,v=map(int,input().split())
    if i==0:
        base=w
    lis[w-base].append(v)

lis=list(map(lambda x:sorted(x, reverse=True),lis))

wa=[[0] for i in range(4)]

for i in range(len(wa)):
    for item in lis[i]:
        wa[i].append(wa[i][-1]+item)

ans=[]
saiki(0,W,3)
    

print(max(ans))
```

なんでansを配列にしてるかっていうと
数字で扱った時の「まだ定義されてない」みたいなバグが苦手だから
【簡単に説明してみた】Git:ブランチって？

#Gitのブランチについて知ろう
・ブランチを切るって何？
・ブランチ？想像もつかない
少しでも解決るべく、アウトプットしていきたいと思います。
#Gitのブランチって？
ブランチは、『作業を枝分かれさせて、プロジェクト本体に影響を与えないようにするため』に使います。
切ったブランチ（分岐したブランチ）は、他のブランチへの干渉をしないため、同じリポジトリ中で複数の変更を同時に進めていくことができます。
ブランチを切らない場合は、masterブランチと言います。
川の流れに例えると、ブランチを切ることで、本流が支流に分岐されるイメージですね。
チームでの開発の場合などにブランチを切ったりするみたいです![スクリーンショット 2020-03-17 19.42.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536974/79a349bd-9273-b8d5-d4fd-31abbbe1a3ac.png)

#ブランチを切るメリットは？
・不具合が起きた場合も対処しやすい
・チーう開発の際に他のメンバーの開発や、本体に影響を与えずに作業を行える

#実際のコマンドは？
ブランチを切る→これでブランチを作成します

```
$ git branch [ブランチ名]
```
ここでは、sample_branchとしてブランチを切ります

```
$ git branch sample_branch
```

⇩ブランチの切り替えを行うコマンドです。

```
$ git checkout sample_branch
```

このブランチの切り替えで起こっているのが、上の図で言う所の、『赤い部分』から枝分かれした『白い部分』のことですね

ブランチを切った状態でも、同じようにファイルの変更を行います。そして、masterブランチの時と同様にコミットします。

```
$ git add .
$ git commit -m 'Add branch'
```
その後、ブランチをmasterへマージしていきます。
マージとは、masterブランチと切ったブランチ（ここでは、sample_branch）を結合することですね。
これでmasterブランチへ変更を反映させることができます。

```
$ git checkout master
```
でmasterブランチへ切り替えます。
そして、

```
$ git merge sample_branch  
```
sample_branchで行った変更な内容をmergeして反映させます。

以上、ブランチについてでした。

##参考にした記事
https://backlog.com/ja/git-tutorial/stepup/01/
https://www.sejuku.net/blog/71071
SendKeys.Send()でチェックボックスをチェックするワザップ

地味に調べてもなかなか見つからなかったので

**👇※記事の対象者と背景を追記しました。🙇‍♀️**
そのままタイトルのとおりに `SendKeys.Send()` メソッドを使用してチェックボックスをチェックする方法になります。
業務で使用している Windows Form のアプリケーションの操作を自動化したいという話があり、いろいろ要件はあったのですが最終的には人間が行っているキーボード操作をそのままエミュレートして再現する形をとりました。

タイトルに対する結論としてはチェックボックスにフォーカスされている状態で☟でおｋです。

```c#
SendKeys.Send(" ")
```

つまるところ、普通にキーボード操作でチェックボックスをチェックするように `SPACE` キーの入力をエミュレートしたいのですが [リファレンス](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.sendkeys.send?view=netcore-3.1) の特殊なキーの一覧（ `Enter` など）には `SPACE` がありませんし `SendKeys.Send("{SPACE}")` とすると `System.ArgumentException: 'キーワード "SPACE" は有効ではありません。'` という例外が発生します。

半角空白文字で `SPACE` キーの入力をエミュレートできるということに関してはリファレンス本文中の下記の記述から推察できるのかなと思います。**こちらについては自分なりにそういう風に解釈したということなので解釈違いがあればご指摘ください🙇‍♂️**

> 各キーは、1つまたは複数の文字で表されます。 1つのキーボード文字を指定するには、文字自体を使用します。 たとえば、文字 A を表すには、文字列 "A" をメソッドに渡します。

こちらも
> ENTER や TAB、文字ではなくアクションを表すキーなど、キーを押したときに表示されない文字を指定するには、次の表のコードを使用します。

これらから、A のキーと文字列 "A" の対応のように `SPACE` キーが対応する文字列は " " になりますし、対応する文字列が存在するのであれば `Enter` などと同じように特殊なコード `{Enter}` の一覧には存在しないのは当然である、というように解釈しました。

一応下記の環境下で `SendKeys.Send(" ")` でチェックボックスにチェックできることを確認しました。

+ Visual Studio 2019 (16.5.0)
+ Windows Forms App (.NET Core) C#
+ .NET Core 3.1

下図のような適当なフォームを作成し `button1` の `Click` イベントのイベントハンドラで `SendKey.Send` します。`button1` をクリックするたびに checkBox1 のチェックのオンオフが切り替わります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174132/975125d1-81bc-7c75-8a89-acbadfd6a1e8.png)

```c#:button1_Click
private void button1_Click(object sender, EventArgs e)
{
    SendKeys.Send("{TAB}");
    SendKeys.Send(" ");
}
```
GitHub CLIでレビュー催促Slackを自動化する

[GitHub CLI](https://cli.github.com/)がいつの間にかリリースされていましたね。とりあえずお試しということでお仕事でPRを作って「レビューお願いします！」というSlack書き込みがダルすぎた(上にスルーされる頻度が多い、そして催促をする)ため簡単にシェルスクリプトで自動化してみました。使い方は簡単GitHubのPRでレビュー対象のものに*review*というタグを付けるだけです。実行すればSlackに投稿されるので、あとはお好みの頻度でバッチ処理を回してください。(僕は、とりあえず実験で埃かぶっているiMacで回すことにしました)



```shell  
function postWillReviewPR() {
    local result=`gh pr list -l review`
    if [ "$result" != "" ]; then

        local json="{\"text\": \"\n＝＝＝＝＝以下がレビュー待ちのPRです(レビューはお早めに)＝＝＝＝＝＝\nhttps://github.com/リポジトリ名/labels/review\n${result}\"}"
     
        curl -X POST -H 'Content-type: application/json' --data "$json" https://hooks.slack.com/services/ここを変える
    fi
}

postWillReviewPR

```

実行すると以下のように投稿されます。

```
＝＝＝＝＝以下がレビュー待ちのPRです(レビューはお早めに)＝＝＝＝＝＝
https://github.com/リポジトリ/labels/review
PR番号    PRタイトル    PRブランチ
PR番号    PRタイトル    PRブランチ
PR番号    PRタイトル    PRブランチ
...
```

ghコマンドの使い方は組み合わせ次第で無限大だと思うので、こういう使い方してるよ！というものがあれば是非教えて下さい！
python-pptxで画像をセンタリングする

#概要
python-pptxとPillow (PIL)を使って、PowerPointの中央に画像を挿入(センタリング)できるようにしました。

#背景
[python-pptx](https://python-pptx.readthedocs.io/en/latest/#)はpythonからPowerPointをつくることができるライブラリです。
非常に便利なのですが、スライドへ画像挿入するときの挿入位置は、画像左上の座標でしか指定しかできません。
センタリングをしたいなと思ったのですが、そのようなオプションがpython-pptxにあるのかよくわかりませんでした。
そこでPillowというライブラリで画像を別途読み込んで画像サイズを取得することで、センタリングを実現しました。

#環境
macOS Catalina バージョン 10.15.3
python3.7.0

#インストール
```console
pip install python-pptx
pip install Pillow
```

#コード
```Python
from pptx import Presentation
from pptx.util import Inches
from PIL import Image

IMG_PATH = "/path/to/img_file"
IMG_DISPLAY_HEIGHT = Inches(3) #スライドに表示するときの画像の高さ。とりあえず3インチとしておく。
SLIDE_OUTPUT_PATH = "test.pptx" #スライドの出力先パス

#スライドオブジェクトの定義
prs = Presentation() 

#スライドサイズを取得
SLIDE_WIDTH = prs.slide_width #
SLIDE_HEIGHT = prs.slide_height

#白紙のスライドを追加
blank_slide_layout = prs.slide_layouts[6] 
slide = prs.slides.add_slide(blank_slide_layout)

#画像サイズを取得してアスペクト比を得る
im = Image.open(IMG_PATH)
im_width, im_height = im.size
aspect_ratio = im_width/im_height

#表示された画像のサイズを計算
img_display_height = IMG_DISPLAY_HEIGHT
img_display_width = aspect_ratio*img_display_height

#センタリングする場合の画像の左上座標を計算
left = ( SLIDE_WIDTH - img_display_width ) / 2
top = ( SLIDE_HEIGHT - img_display_height ) / 2

#画像をスライドに追加
slide.shapes.add_picture(IMG_PATH, left, top, height = IMG_DISPLAY_HEIGHT)

#スライドを出力
prs.save(SLIDE_OUTPUT_PATH)
```
以上のコードにより下記のような、図がセンタリングされたパワポスライドを作ることができます。（テスト画像は筆者撮影）
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259353/9e3ff74e-bfa7-02f4-de76-d9707134bb2e.png">

Pillowの部分は元の画像のアスペクト比が計算できれば何でも良いので、例えばopencvでも代用可能です。
ドキュメントによるとpython-pptxにはsizeのプロパティをもつImageというクラスがあって、そこからsizeを取得することもできそうなのですが、具体的なやり方がわかりませんでした。
画像サイズ取得のためだけにPillowを使うのはスマートでないので、もしpython-pptx単体でのやり方をご存知な方がいたらご教授いただけると嬉しいです。

本記事は以上です。
ここまで読んでいただきありがとうございました。
PowerShellで引数を含めエイリアスとして登録する方法

```powershell
notepad everyday_open.txt
docker container ls -a
```
こういうクソ長いコマンドを打ちたくなかったがWindowsでどうやってエイリアス設定するのか知らない:see_no_evil:

と嘆いていたら会社の優しい人に教えてもらったので備忘録。

# 事前準備. $profileの作成

:small_blue_diamond:\$profileがない場合、New-Itemで\$profileを作成。

```powershell
New-Item -type file -force $profile
```
:small_blue_diamond:\$profileが出来たらメモ帳とかで開く。

```powershell
notepad $profile
```


# 引数を持たないエイリアスの設定
ここまではググれば山ほど出てくる。
:small_blue_diamond:\$profileの中にSet-Aliasのコマンドを書き込み、保存。

```powershell
# $profileに書き込んで保存。
Set-Alias dk docker
```
しかしこれ、引数をまとめて設定できない。
（Set-Aliasから使う方法ご存知でしたらコメントお願いします:pray:）

```powershell
# 例えばこういう感じの事はSet-Aliasではできない。
# 以下のコマンドではエイリアスは設定できないので注意。
Set-Alias dc docker container
```

# 引数ごとエイリアスとして登録したい場合どうするか
:small_blue_diamond:functionと\$argsを使い、下の例のような感じでfunctionを作って保存する。

```powershell
# 任意の引数を渡す必要がない場合
function nt(){
  notepad everyday_open.txt
}
```
```powershell
# 任意の引数を追加で渡したい場合
function dc(){
  docker container $args
}
```

:small_blue_diamond:これらのように保存することで短縮したコマンドが使えるようになる！

```powershell
nt # notepad everyday_open.txt
dc ls -a # docker container ls -a
dc rm hoge # docker container rm hoge
```

しあわせ
Rails6でActiveJobのQueueAdapterがTestAdapterに上書きされてしまい非同期で実行されてしまう

Rails6の不具合で`RAILS_ENV=test`の場合、Railsの`config.active_job.queue_adapter`の設定に関わらずActiveJobが非同期で実行されてしまう不具合が発生しています。これは現在(2020/2/28)の`6-0-stable`でも修正されていません。

今回はrspec-rails & sidekiqを利用しているという前提で書きます。

# 原因
Rails側のバグです。active_job/railtie.rb を6-0-stableと5-2-stableで比較してみると、
active_job.set_configs initializerにコードが追加されています。

https://github.com/rails/rails/blob/5-2-stable/activejob/lib/active_job/railtie.rb
https://github.com/rails/rails/blob/6-0-stable/activejob/lib/active_job/railtie.rb

```ruby:active_job/lib/active_job/railtie.rb
      ActiveSupport.on_load(:action_dispatch_integration_test) do
        include ActiveJob::TestHelper
      end
```

ここでincludeされているActiveJob::TestHelperが原因です。

https://github.com/rails/rails/blob/76bafb0b2ff5d4a7afc373191963eb2a243c75d4/activejob/lib/active_job/test_helper.rb#L36-L46

ActiveJob::TestHelperのbefore_setupで `queue_adapter_for_test`にハードコードされている `ActiveJob::QueueAdapters::TestAdapter` というadapterに上書きされてしまっていることで発生していました。

```ruby:activejob/lib/active_job/test_helper.rb
    def before_setup # :nodoc:
      test_adapter = queue_adapter_for_test

      queue_adapter_changed_jobs.each do |klass|
        klass.enable_test_adapter(test_adapter)
      end
# ...
# ...
# ...
    def queue_adapter_for_test
      ActiveJob::QueueAdapters::TestAdapter.new
    end
```

# 対策
別のissueにこんなコードで修正できるのでは？とありますが、issueに反応が無いので取り込まれる可能性は低いかもしれません。。。

https://github.com/rails/rails/pull/37685#issuecomment-559625920

Rails側の修正を待つという手もありますが、`spec_helper`に下記のコードを追加することで対応できます。

```ruby:spec/spec_helper.rb
RSpec.configure do |config|
  config.before(:each) do
    (ActiveJob::Base.descendants << ActiveJob::Base).each(&:disable_test_adapter)
  end
end
```

これでRSpec & Sidekiqの環境でもTestAdapterの上書きをキャンセルできます。


# issue
* https://github.com/rails/rails/issues/37270
Laravelでよく使うコマンド集

# 概要

ここでは、Laravelの初心者向けによく使うコマンドの説明をする。
基本的には```php artisan なんとかー```が多い。

下記の前提知識がある人を対象としています。

- PHPの経験があること。
- MVCの考え方を理解していること。
- Laravelのディレクトリ構成を知っていること。

以上を踏まえて、「やりかた」じゃなく「仕組み」を理解しましょう。
コピペしてやり方を覚えても仕組みが理解できない事には、設計や応用できませんので。

# Laravelで使用するコマンド集(よく使うものだけ)

## composer dump-autoload
```
composer dump-autoload
```
自身で作成したクラスのファイルをフレームワークに認識させる。
これを行うことで```require('ファイル名')```や```require_once（'ファイル名'）```が不要になる。
詳しくは、[ここ](https://qiita.com/WebSysRider/items/e41f211f8c913e008d03)をチェック。

## php artisan migrate

```
php artisan migrate
```
このコマンド1発で、Laravelで使用する全テーブルのＣＲＥＡＴＥ文が実行される感じ。
対象のテーブル定義は、```php artisan make:migration```で作成する。

## php artisan db:seed

```
php artisan db:seed
```
このコマンド1発で、空っぽのテーブルに初期データを入れられる。
初期データの定義は、```php artisan make:seeder```で作成する。

## php artisan make:migration

```
php artisan make:migration　[テーブル名]
```
テーブル作成用のクラスを作成する。
DB:insertなどを使用してＣＲＥＡＴＥ文となる基を記述する。
Laravelは基本的にＳＱＬを書くことはない。
詳しくは、[https://readouble.com/laravel/6.x/ja/migrations.html](https://readouble.com/laravel/6.x/ja/migrations.html)が参考になる。

## php artisan make:seeder
```
php artisan make:seeder　[テーブル名(アッパーキャメル記法)]Seeder
↓例(テーブル名「m_user_types」の場合)↓
php artisan make:seeder MUserTypesSeeder
```
初期データのINSERTとなるレコードを記述する。
詳しくは、[https://readouble.com/laravel/6.x/ja/seeding.html](https://readouble.com/laravel/6.x/ja/seeding.html)が参考になる。
これをやると、マスターデータなどコマンド1発で全て入る。
環境セットアップに便利！


## php artisan make:controller
```
php artisan make:controller　[コントローラー名(アッパーキャメル記法)]Controller
```
コントローラー名の例は、`SampleController`のようにアッパーキャメル記法で末尾にプレフィックス`Controller`をつける。
作成したコントローラーは、`app\Http\Controllers`配下に作成されます。

## php artisan make:model
```
php artisan make:model　[テーブル名]
```
Eloquentのモデルクラスがたったこの1行のコマンドで作成可能です。

## php artisan make:request 
```
php artisan make:request [アッパーキャメル記法]
```
各画面のバリデーションルールの指定など定義します。
これ個人的に超絶便利！

## php artisan make:rule
```
php artisan make:rule　[アッパーキャメル記法]Rule
```
Laravelの標準には無い独自のカスタムバリデーションを作るときに使います。
このコマンドで作成されたクラスに対して、OKなら`true`、NGなら`false`となるように独自のバリデーションチェックメソッドをs買う静します。

## php artisan make:test
```
php artisan make:test [アッパーキャメル記法]Test
```
Unitテストを行うクラスが作成されます。
作成されたクラスのメソッドにテストしたいロジックを記述していきます。







## shutdown
```
shutdown -s -t [秒数]
```

｢お疲れ様でした。お先に失礼します。」って言う直前によく打つコマンド
指定した秒数が経過すると、自動でシャットダウンされます。

***

あとは、気が向いたらまた続きを書きます。
コントローラや他のことについて。。。
Pythonで毎日AtCoder #8

### はじめに
[]()
8日目です。[Mリーグ](https://m-league.jp/)見ながら書いてます。

### #8
[問題](https://atcoder.jp/contests/agc012/tasks/agc012_a)

**考えたこと**
実はこの問題は、ぱっと問題見たときに解けなさそうだったので飛ばしていました。今回は、時間をたっぷり取って考えたので解けました。
チーム内の2番目に強い人がチームの強さになるので、どうやって二番目に強い人を残すかを考えなければいけません。

メンバー3N人を大きい順でsortし、それをAとします。Aの後ろからN人は一人ずつチームに入れると、必ずチーム内で最小の値になります。
残ったA[:2*N]を連続した二個ずつ同じチームに入れると、それぞれのチームの強さが最大化されます

```python
n = int(input())
a = list(map(int,input().split()))

a.sort(reverse=True)
a = a[:2*n]
ans = 0
for i in range(1,2*n,2):
    ans += a[i]
print(ans)
```

### まとめ
次のAGCもAくらいは解けたらいいな。競プロとは関係ないけど、Mリーグおもしろいので見ましょう。