OmniAICreator/Qiita-1.07M huggingface dataset:
githubページでの最強検索方法（ショートカットキー）

恥ずかしながら今まで知らずに来たので、忘れないように整理します！

githubには検索方法が存在します。

#ヘルプ
githubのレポジトリページ上で、「？」を入力しましょう。
ショートカット一覧が表示されます。
<img width="816" alt="스크린샷 2019-05-17 21.50.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324313/dce6cef2-bc67-cf0f-0894-5828b662e020.png">

#検索
「t」を入力しましょう。
ファイル名の検索が可能です。
<img width="1079" alt="스크린샷 2019-05-17 21.55.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324313/a4834416-c329-6eee-9639-f2e0ae48a6eb.png">
[Rails5]  heroku  db:resetからmigrateまで

rubyをherokuでデプロイをしている。
DBはMySQL2を使用。

ローカル環境のようにrails db:resetはできないので、
マイグレーションファイルを初めからやり直したい際の情報が古く、また断片的だったためにメモ。

###問題点
>Rails5から、productionモードでは、db:dropなどのDBを破壊する系のコマンド実行を防止する機能が追加された。

よって下記の参考にさせていただいた方法ではロールバックできなかった。
[参考記事]
[Herokuにデプロイ済みのMySQLのロールバック](https://qiita.com/gonzaemon111/items/d203297cba3b2499076b)

###解決に役立った参考記事
[参考記事]
[Rails5のproductionでrake db:dropはできない、普通には](https://qiita.com/Esfahan/items/75ade0233fe02ab04381#production%E3%81%A7db%E7%A0%B4%E5%A3%8A%E7%B3%BB%E3%81%AE%E5%87%A6%E7%90%86%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%A8%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E3%81%AA%E3%82%8B)

###:point_right:下記より実際の手順

#####1.　ロールバックを試す

```
$ heroku rake db:migrate:redo STEP=1
```
下記エラー文

```
rake aborted!
StandardError: An error has occurred, all later migrations canceled:
ActiveRecord::IrreversibleMigration
```

#####2.　次の３のステップに移るためにあえて実行。
[参考記事]
[Herokuにデプロイ済みのMySQLのロールバック](https://qiita.com/gonzaemon111/items/d203297cba3b2499076b)

コマンド

```
$ heroku run rake db:migrate:reset
```

エラー画面

```
rails aborted!
ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your 'production' database.
If you are sure you want to continue, run the same command with the environment variable:
DISABLE_DATABASE_ENVIRONMENT_CHECK=1
```

#####3. DBをdropさせる
２で表示された”DISABLE_DATABASE_ENVIRONMENT_CHECK=1”を使用する。
下記がコマンド

```
$ heroku run RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:drop
```
:point_down:やっとdropしてくれた

```
Dropped database ‘heroku_3b36eff50cb58e6'
```

#####4. DB生成
次のステップはheroku run rails db:migrateとの記事が多いができない。
railsコマンドいけるかなと思って試してみる。

```
$ heroku run rails db:create
```
無事に作られた

```
Created database 'heroku_3b36eff50cb58e6'
```

#####5. マイグレーション

```
$ heroku run rake db:migrate
```

以上、カラム名変更などマイグレーションがゴチャゴチャしてきてまとめたい際にロールバックができずに結構時間を要した。
heroku上でエラーの際などのMySQLコマンドがまとまった記事が見つけられずにあれこれ試した。
他に良い方法あれば是非教えてください:pray:
TeX で LR(0) DFA のような強そうなオートマトンを描く

レポート等でオートマトンを描きたくなることがあると思います。「TeX オートマトン」でググると、TikZの`automata`ライブラリでオートマトンを描く方法が様々な記事で解説されています。
それらの例で登場するオートマトンはどれも丸に矢印が生えているだけのシンプルな図です。では、以下のような状態遷移図は`automata`ライブラリで描くことができるでしょうか？

![IMG_0168.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233069/3de3857d-9196-1295-dce3-059c0421de5a.jpeg)


これは ANDREW W. APPEL, *Modern Compiler Implementation in ML* という本に出てくる、LR(0) DFA と呼ばれるオートマトンです。このオートマトンは

```math
\begin{align}
S &\rightarrow E \$ \\
E &\rightarrow T \\ 
E &\rightarrow T + E \\
T &\rightarrow x
\end{align}
```

という言語に対応していて、LR(0) の場合 shift と reduce が衝突して解析できませんが、 SLR (Simple LR(1)) の場合解析できます。


さて、これを描いてみましょう。

```tex
\usepackage{tikz}

\usetikzlibrary{automata}

\begin{tikzpicture}
  [>=latex, 
    node distance=3cm, 
    block/.style={state, rectangle, text width=6em}
  ]
 
  \node [block, label=above right:1] (q_0) 
    {
      \( S \rightarrow . E \$ \) \\
      \( E \rightarrow . T + E \) \\
      \( E \rightarrow . T \) \\
      \( T \rightarrow . x \) 
    };
  \node [block, label=above right:2] (q_1) [right of = q_0]
    {
      \( S \rightarrow E . \$ \)
    };
  \node [block, label=above right:3] (q_2) [below of = q_1] 
    {
      \( E \rightarrow T . + E \) \\
      \( E \rightarrow T . \)
    };
  \node [block, label=above right:4] (q_3) [below of = q_2]
    {
      \( E \rightarrow T + . E \) \\
      \( E \rightarrow . T + E \) \\
      \( E \rightarrow . T \) \\
      \( T \rightarrow . x \) 
    };
  \node [block, label=above right:5] (q_4) [left of = q_3]
    {
      \( T \rightarrow x . \)
    };
  \node [block, label=above right:6] (q_5) [right of = q_3]
    {
      \( E \rightarrow T + E . \)
    };
 
  \path [->] (q_0) edge [right]      node [above] {\(E\)} (q_1)
                   edge [right]      node [above] {\(T\)} (q_2)
                   edge [right]      node [left]  {\(x\)} (q_4)
             (q_2) edge [bend right] node [left]  {\(+\)} (q_3)
             (q_3) edge [right]      node [above] {\(x\)} (q_4)
                   edge [bend right] node [right] {\(T\)} (q_2)
                   edge [right]      node [above] {\(E\)} (q_5);
\end{tikzpicture}
```

すると

<img width="476" alt="スクリーンショット 2019-05-17 21.34.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233069/6699d281-9a56-4f33-b350-1b49102204a0.png">

それらしきものを描くことができました。


**いくつかのポイント**

- `node` の style で `rectangle` を指定することで、状態の部分を四角形にすることができます。
- `node` の style で `text width` を指定することで、中で改行ができるようになります。
- 中で複数行の数式を書くとき、普通に `align` 環境を使うと、数式の上側に余白ができて不恰好になってしまうので、一行ずつ数式を分けて書くのが良いと思います（もしオートマトン以外で数式を使わないのであれば、グローバルなオプションで余白の大きさを変えてしまっても良いとは思いますが）。
海外クラウドソーシングサイトまとめ

※本記事は海外のクラウドソーシングサービスに関して、発注者側の視点で役立つ情報についてまとめたものです。
## 海外大手クラウドソーシングサービス手数料一覧
海外の有名なクラウドソーシングサイトを手数料で比較したものを以下の表にまとめました。
もし情報が古くなっていましたら是非教えて欲しいです。


| サイト名       |       手数料 |    URL    |
|:-----------------|------------------:|:------------------:|
| Upwork             |              2.75% |        https://www.upwork.com/        |
| Fiverr           |            20.00% |       https://www.fiverr.com/       |
| Freelancer             |              3.00% |        https://www.freelancer.com/        |
| Guru               |                2.50% |          https://www.guru.com/         |
| Outsourcely             |             $19~229/month |        https://www.outsourcely.com/       |
| Witmart          |           $5.00~ |      http://www.witmart.com/       |
| Amazon Mechanical Turk          |           10.00% |      https://www.mturk.com/       |


## 海外サービス利用時の注意点
- 後払い×分割払いにする

先払いはいけません、逃げられます。金額の大きい仕事は特に注意してください。ただし一括後払いにすると受け入れてもらえませんので、できるだけ細かくマイルストーンを区切って支払うようにしましょう。これによって相手にスキルが無かった場合のダメージも最小限に抑えることができます。

- down paymentには要注意

この”down payment”という言葉は相当やっかいです。日本語で「頭金」という意味の言葉です。一般的には、何かを掛けで買う際にその代金の一部を先に支払う場合のお金のことを指し、その金額は合計金額の一部となるのですが、国や業界や人々によって解釈に違いがあり、フリーランサーにとっての頭金は合計金額とは別であるという主張をしてくる方もいます。実際に英語で検索するとそのような記述も存在しており、一度口論になると拉致がいかなくなります。こういう曖昧な表現を含む部分は契約時に必ず明確にしておきましょう。危険です。

- 合計金額とその内訳を明確にする

契約時には、こちらが支払う合計金額とその内訳は必ず明確にしておきましょう。ほとんどのクラウドソーシングのサイトでは仲介業者への手数料が発生しますが、こちらは支払い金額ベースで話を進めていても、相手は自分が受け取る金額ベースで話をしている場合があり、仲介業者の手数料をかけて軽くもめることがあります。気を付けましょう。



---
色々と書いてしまいましたが、ほとんどのサイト利用者は素晴らしい方々です。ただし言葉の壁、距離の壁、文化の壁によって、どうしても小さなトラブルは発生してしまうことがあります。極力トラブルのリスクを抑えるためにも、割り切って契約前は性悪説、契約後は性善説でいきましょう。

終わり
docker 基本操作

一度整理したいと思っていたのでまとめました。

##### イメージ取得
```
docker pull centos
※タグ指定するときは:xxxの形
docker pull centos:6
``` 
##### ローカルのイメージ確認
```
docker images
```
##### イメージからコンテナ作成
```
docker run --name centos01 -d centos /sbin/init
```
##### コンテナに入る
```
docker exec -it centos01 /bin/bash
※execでコンテナに入った場合は、出るときに exit を使える
docker run -it centos:6 /bin/bash
※runで入ったコンテナから出るときは Ctrl+p Ctrl+q を使う
```
##### 実行中のコンテナのみ表示
```
docker ps
```
##### 停止中も含めて
```
docker ps -a
```
##### コンテナの開始
```
docker start {コンテナ名} or {コンテナID}
```
##### コンテナの停止
```
docker stop {コンテナ名} or {コンテナID}
```
##### コンテナの削除
```
docker rm {コンテナ名} or {コンテナID}
```
##### コンテナの一括削除
```
docker rm $(docker ps -aq)
```
##### イメージの削除
```
docker rmi {イメージID}
```
#####イメージのビルド
```
image_nameの付け方は、alias/image_name:tagが一般的。
例えば田中という人が、rubyの環境を構築しているときは、tanaka/ruby:2.2.2などと表記する。
docker build -t image_name dir_name
dir_nameにはDockerfileがおいてある場所を指す。
カレントディレクトリにファイルがある場合は、「.（ドット）」を指定すれば良い。
```
##### コンテナの履歴を消さないといつまでも残り続けてディスクを圧迫する。定期的にクリーンアップ。
```
docker rm $(sudo docker ps -a -q)
```

##### コンテナからイメージを作る
```
イメージ化したいコンテナのIDを確認する
docker ps -a

イメージ化
docker commit <コンテナID> <任意の名前>/centos:6
docker commit <コンテナID> <任意の名前>/centos:6
 ```
##### Dockerfileからイメージを作る
```
※Mysqlをインストールして起動するDockerfileの場合。
※Dockerfileの書き方 → https://docs.docker.com/reference/builder/
ローカルで以下実行
---
cat << EOF > Dockerfile
FROM centos:6
MAINTAINER example <example@example.jp>
 
RUN yum -y install mysql-server
 
EXPOSE 3306
 
CMD ["/usr/bin/mysqld_safe", "--skip-grant-tables"]
 
EOF
---

# Dockerfile を元にイメージをビルド
docker build -t xxxxx/centos:mysql .
 
# ビルドしたイメージを元にコンテナを起動
docker run -d -p 3306:3306 -t xxxxx/centos:mysql
※d オプションはデーモンモードで標準入出力を表示しないというもの。
-p オプションはコンテナのポートをホスト OS 経由でアクセスできるようにするためのもの。
MySQL 用にコンテナの TCP:3306 ポートを、ホスト OS の TCP:3306 ポートと接続している。
```
プログラミング学習記録90〜1人でcommitしてpushしてmergeした〜

##今日やったこと
- Javaの基礎
- Git使い方入門を読む
- Bitbucketを使ってみる

###Javaの基礎
for文、while文による繰り返しを学びました。

この辺はJavaScriptと同じだったので、特に問題なく理解できました。

###Git使い方入門を読む
以前にも読んだことがある「わかばちゃんと学ぶGit使い方入門」を復習しました。

Git初心者の人が最初に読むのに１番オススメの本です。

ターミナルを使ったcommitやpushのやり方ではなく、sourcetreeというターミナルよりも簡単にできるツールを使うのですが、やっていることはターミナルでやっていることとほとんど同じです。

なので、この本が理解できれば、Gitの大まかな部分については理解できるようになると思います。

読むのが2回目ということもあり、40分程度で読み終えることができました。


###Bitbucketを使ってみる
GitHubは使ったことがあったのですが、Bitbucketは使ったことがなかったので使ってみました。

基本的な部分はGitHubと変わらないですね。

自分1人でcommitしたり、新しいブランチをしたりしてみました。

Git使い方入門で流れは理解できていたのですが、実際に手を動かすことで、より仕組みを理解することができました。

プルリクエストを自分に送って自分でマージしてみて意味あるのかな？と思っていましたが、1回やってみるのも悪くないですね。

おわり
自作 Github Apps を AWS Lambda で動かす

[probot](https://github.com/probot/probot) で開発をした Github Apps を AWS Lambda で動かすまでの備忘録

## 環境
- OS : AmazonLinux2
- node : 8.15.0

## Githu Apps を作成

ここは省略　[参考リンク](https://tech.fusic.co.jp/posts/2018-10-10-github-apps-probot)

## AWSにデプロイするための準備

- AWS CLIのインストール　[参考リンク](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html)
- Serverless FrameWorkのインストール　[参考リンク](https://serverless.com/framework/docs/providers/aws/guide/installation/)
    - デプロイ対象のAWSアカウントのクレデンシャル設定　[参考リンク](https://serverless.com/framework/docs/providers/aws/guide/credentials/)

## Github Apps の準備

probotが公式でLambdaで動かすためのライブラリを紹介しているので、リポジトリ直下で以下のコマンドを実行し、ライブラリを追加

```bash
npm install @probot/serverless-lambda
```

`./handler.js` を追加

```js
const { serverless } = require('@probot/serverless-lambda')
const appFn = require('./')
module.exports.probot = serverless(appFn)
```

Serverless Framework用の設定ファイル
`./serverless.yml` を追加

```yml
service: your-serverless-app-name
provider:
  memorySize: 128
  name: aws
  runtime: nodejs8.10
  region: ap-northeast-1
  stage: v1
functions:
  notify:
    handler: handler.probot
    environment:
      APP_ID: XXXX（開発時の.envと同様の値）
      WEBHOOK_SECRET: XXXX（開発時の.envと同様の値）
      LOG_LEVEL: error
      PRIVATE_KEY: XXX（GithubAppsから取得したPrivateKeyをBase64エンコードした値)
    events:
      - http:
          path: /endpoint
          method: post
```

## デプロイ

Serverless Framework のデプロイコマンドで簡単デプロイ

```bash
sls deploy
```

デプロイが終了するとAPI Gatewayのエンドポイントが出力される
そのURLを **GithubApps の Homepage URL, Webhook URL に設定**

これで開発したGithub AppsがLambda上で動作する

## 引っかかりポイント

ローカルの開発時は動いていたのに、Lambdaでは動かない！ってときは、とりあえず以下あたりをチェック

- Lambdaのクラウドウォッチログを確認
  - Github側で必要なアクションをしているのにそもそもログがない時 ⇒ GithubAppsの Webhoos URL にAPI Gatewayのエンドポイントが設定されていない
  - ログはあるけどエラーが出てる ⇒ serverless.yml の environment の値の不備の可能性が高い
  - ログはある、エラーはない、動いてない ⇒ 非同期処理の対応が出来ていない可能性が高い。外部へのPOSTやGETをしている場合は async/await でしっかりと制御を。Lambdaはメインの処理が終わると他の処理を待たずに終わってしまうので。
WebRTC を使ってカメラで取得した画像をブラウザ上に表示する

下記のような感じでいけました。

```index.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
<video id="video" autoplay playsinline></video>
<button id="start">start camera</button>
<script>
'use strict';

// カメラデバイスの取得に成功したときの処理
function handleSuccess(stream) {
    // HTML 内の video element を取得する。
    const video = document.querySelector('video');
    // video element の srcObject に stream を設定する。
    video.srcObject = stream;
}

// カメラデバイスが取得できなかったときの処理
function handleError(error) {
    console.error(error);
}

async function init(e) {
    const constraints = {
        audio: false,  // オーディオデバイスは使用しない
        video: true // デフォルトのカメラデバイスを使用する
    };

    try {
        // getUserMedia() でカメラデバイスを取得する。
        const stream = await navigator.mediaDevices.getUserMedia(constraints);
        // デバイス取得に成功したとき
        handleSuccess(stream);
    } catch (e) {
        // デバイスの取得に失敗したとき
        handleError(e);
    }
}

// start ボタンを押したらカメラでの撮影を開始する。
document.querySelector('#start').addEventListener('click', function(e){
    init(e);
}); 
</script>
</body>
</html>
```

最低限、これだけ書けば動くみたい。カメラが複数存在するときは、navigator.mediaDevices.enumerateDevices() を使ってデバイスリストを取得しておき、deviceID を constraints の audio や video に設定してやる必要がある。そのへんはまた次の記事で書・・・きますかねえ?

参考にしたコードはこちら： https://github.com/webrtc/samples/tree/gh-pages/src/content/getusermedia/gum

上記コードは、下記の組合せでは動作することを確認してます。
- chrome (74) + mac os (10.12)
- safari (12) + mac os (10.12)
- chrome (74) + windows 10

この記事を書いた時点では Edge では動きませんでしたが、2020/11 現在は動きました。ブラウザの対応状況はこちら： https://caniuse.com/?search=WebRTC

# 要 HTTPS

Web サーバなどに index.html を置く場合は、ssl (https) でアクセスしないと、少なくとも chrome では動作しません (Chrome が WebRTC の使用に SSL を要求するため)。ローカルなファイルを開く場合は、chrome でも問題なく動作します。

https な環境を無料で用意する方法で、すぐ思いつくのは以下の通りです。

- [github.io](https://pages.github.com/) を使う：HTMLを置くだけでよければ、これが一番簡単。
- [heroku](https://jp.heroku.com/) を使う：クレジットカードがなくても、無料枠で https のサーバを立てられる。
- 自宅サーバ + [Let's Encrpyt](https://letsencrypt.org/ja/) と Dynamic DNS で頑張る：あんまり手軽じゃないけど正攻法。

# サンプル

下記で、上記のコードを試せます。
https://royalcrab.github.io/rtc_camera.html

`getUserMedia()` に対応していないOS/ブラウザの組合せでは動きません。対応表は下記にあります。
- https://developer.mozilla.org/ja/docs/Web/API/MediaDevices/getUserMedia

by kani (2019/2020)
pytestでログ出力をテストしたい (caplog)

# まえがき
みなさんpytest使ってますか？
便利ですよね。

今回、とある処理で出力されるログ出力結果をテストケースにする必要があり、
職場のSlackで呟いてみたら `caplog` というfixtureがpytestにあると教えてもらいました。

当初はログファイルを直接openして、中身を走査しようかと思っていましたが
`caplog` を使うことで非常に簡単にログ出力テストが実装できましたので、紹介します。

# caplogとは
- pytestにデフォルトで用意されているfixtureで、loggerに出力される内容を複数の形式でcaptureしてくれる機能。
- pytestのドキュメントは[ここ](https://docs.pytest.org/en/latest/logging.html#caplog-fixture)

# 使い方
- まぁ公式ドキュメントにある通りなんですが…

```test.py
import logging

def outlog():
    logger = logging.getLogger("test")
    logger.info("これはinfoログ")
    logger.warning("これはwarningログ")
    logger.error("これはerrorログ")

class TestCapLog:
    def test_caplog(self, caplog):
        outlog()

        assert ("test", logging.INFO, "これはinfoログ") not in caplog.record_tuples, "ログレベルがデフォルトなので、INFOは出力されない"
        assert ("test", logging.WARNING, "これはwarningログ") in caplog.record_tuples
        assert ("test", logging.ERROR, "これはerrorログ") in caplog.record_tuples

        caplog.set_level(logging.INFO)
        outlog()

        assert ("test", logging.INFO, "これはinfoログ") in caplog.record_tuples, "ログレベルをINFOにしたので、INFOが出力される"
```

- こんな感じで書いて、 `pytest test.py` を実行すると、全てのテストがPassするはず。
- 上記で使用した `record_tuples` には、出力されたログが `(logger_name, log_level, log_text)` のタプルとしてlistに格納されています。
- これ以外にも、 `caplog.text` とすると、出力されたログをstrとして生で取得することが出来ます。

# 最後に
- ログ出力をテストするケースはあまりないのかもしれませんが、何かしらのチェック処理とかで<be>ワーニングを出したりしてエラーアラートサービスで検知していたりなどすると思いますので、<br>想定しているとおりにログが出ていることをチェックするには `caplog` が便利というお話でした。
picoCTF writeup (be-quick-or-be-dead-1)

ELFバイナリが与えられる．
そのまま実行すると時間切れで終了してしまう．

radare2でバイナリを開いてみた．
参考：[radare2 使い方 メモ](https://kimiyuki.net/blog/2018/03/11/radare2-usage-memo/)

以下のコマンドを順次実行して解析を始める．

1. aaa
2. s main
3. V
4. p

`:s sym.main`でmain関数へ移動すると，4つの命令を順に呼んでいる事がわかる．

- header
- get_key
- set_timer
- print_flag

`set_timer`でセットされたタイマにより中断されると推測．
これを呼ぶ部分を`nop`で埋めた．

```
// call sym.set_timer の行まで移動して
:w \x90\x90\x90\x90\x90
:q
```

改めて実行すると，フラグが表示される．
ChromeのブックマークからSlackアプリを起動する



## 概要
* Slackのアプリを入れているが、ついついブラウザーでSlackを開いてしまう私。
* Slackのタブもたくさん増えてしまって、PC重くなるのでアプリを使いたい。
* Slackのブックマークを開くとアプリが起動するそんな素敵な状態にしたい。

## 前提
* Mac x Chrome の環境で確認しています。

## やり方

* SlackのブックマークのURLを以下のように書き換えれば、アプリが起動するようになります！
* 末尾の random のところは、 立ち上げたときに開きたいチャンネル名を指定しておきます。
* 
```
https://ワークスペース名.slack.com/app_redirect?channel=random
```

![スクリーンショット 2019-05-17 20.42.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21391/0a128e79-b922-8732-0119-17d3e7134843.png)


## 結果
* 快適！
MacのVSCodeでPython Extensionが動かなくなったときの対処法（2019/04ぐらい）

# 症状

なんか全体的にロードされてない感じになる。

* コマンドパレットが置換されずに翻訳前の状態で表示される
* どのコマンドも動かない
* Log (Window) で `Unable to read file (Error: File not found (/.../.vscode/extensions/ms-python.python-2019.4.12954/snippets/python.json)`

# 解決策

Issue: https://github.com/Microsoft/vscode-python/issues/5478

1. VSCode 上で Python Extension をアンインストール
2. `rm -rf ~/.vscode/extensions/ms-python.python-2019.4.12954/`
3. Python Extension を再インストール
クラスを関数でいじる＠Typescript


Javascriptはclassもobjectなので、class自体を関数の引数や返り値として扱うことができます(高階関数ならぬ高階クラスでしょうか)。しかし、Typescriptで扱うとなると型が難しいので、まとめてみました。

## 引数・返り値がクラス

次のように`new`が存在するかどうかでクラスを指しているかどうかを判定します。

```Typescript
/* 引数がクラス */
function func(Cls: {new(...args: any): any) {
  /* 処理 */
}
/* 返り値がクラス */
function func(): {new(...args: any): any {
  /* 処理 */
}
```

インターフェースにしても良いですね

```Typescript
interface ClassConstructor {
  new(...args: any): any
}

/* 引数がクラス */
function func(Cls: ClassConstructor) {
  /* 処理 */
}
/* 返り値がクラス */
function func(): ClassConstructor {
  /* 処理 */
}
```

## クラスに条件を求める

`name`プロパティが存在するかどうかで無名クラスを入力として許さないことができます

```Typescript
interface ClassConstructor {
  new(...args: any): any,
  name: string
}
```

staticメソッドを同様に要求することもできます。

```Typescript
interface ClassConstructor {
  new(...args: any): any,
  staticMethod(): any,
}
```

インスタンスメソッドは`prototype`の形で条件を記述できます。

```Typescript
interface ClassConstructor {
  new(...args: any): any,
  prototype: {
    instanceMethod(): any
  }
}
```

## InstanceTypeの利用

`InstanceType<ClassConstructor>`は`ClassConstructor`を満たすクラスを示します。これを使いそうなパターンを2つほど紹介します。

例えば`ClassConstructor`のインスタンスになるようなクラスであることを指定する場合は次のように記述します。

```Typescript
class Cls implements InstanceType<ClassConstructor> {
  /* Clsが上記のようなstaticメソッドや
    インスタンスメソッドを実装していないとエラー*/
}
```

関数内で`ClassConstructor`を満たすクラスのインスタンスを生成するときは次のように書きます。

```Typescript
function func(Cls: ClassConstructor) {
  let instance: InstanceType<ClassConstructor> = new Cls();
}
```

他にも色々なパターンがあると思いますので、色々試してみてください。

## <参考> typeof
`InstanceType`と対極で、あるインスタンスのクラスがインスタンスとなるようなインターフェースを`typeof`で記述できます。

```Typescript
type A = InstanceType<typeof Cls> // AはCls
```

「高階クラス」を利用する場合には使ったことがないですが、`InstanceType`と組み合わせて使いたいパターンがあることもあるかもしれません。

## 例:

`toString`を実装したクラスに、クラス名を前につけた文字列を出力する`toVerboseString`を追加します。本当はもっと型推論とかしてくれるかもしれませんが、あえてかなり詳しく型を書いてみます。

```Typescript
interface StringifiableClass {
  new(...args: any[]): any,
  name: string,
  prototype: {
    toString(): string,
  }
}

type VerboseStringifialbeClass = StringifiableClass & {
  prototype: {
    toVerboseString(): string,
  }
}


function verbose<T extends StringifiableClass> (Cls: T):
  VerboseStringifialbeClass {
    return class extends Cls {
      toVerboseString() {
        return `${Cls.name} ${this.toString()}`;
      }
    }
}

class A implements InstanceType <StringifiableClass> {
  constructor(public str: string) {}
  toString() {
    return `--${this.str}--`;
  }
}

const B = verbose(A);

console.log(new B('foo').toVerboseString()) 
    // A --foo--
```

ちなみに次の書き方はエラーになります。

```Typescript
@verbose
class A implements InstanceType<StringifiableClass> {
  constructor(public str: string) {}
  toString() {
    return `--${this.str}--`;
  }
}

console.log(new A('foo').toVerboseString())
```

どうしてかはわかりません。デコレータの前後で型が変化してはいけないのかもしれません。デコレータが実験的だからかもしれません。

## 参考資料

* [Typescript Documentation - Decorators](https://www.typescriptlang.org/docs/handbook/decorators.html)
* [Typescript Documentation - Advanced Type](https://www.typescriptlang.org/docs/handbook/advanced-types.html)
不具合対処報告(案)



この文章は仮定にもとづく書式案です。
再利用していただいて結構です。

#不具合対処報告（案）　小川清  2019年5月16日

S起因のトラブルの原因

###第一原因：御社がSを選択したことです。

###第二原因：S選択前に、事前試験を提案させていただきました（提案番号N-3）。
費用負担ができないとのことで試験を実施せずに採用しています。

###第三原因：ソースコードにS起因のトラブルの原因が何か、どう対処したかをコメントで記述してあります。
コメントを担当の方が読まれていないのでしょうか。

###第四原因：上記三つの原因に対し担当の方が対応できるように教育の提案をさせていただきました(提案番号N-7)。
費用負担ができないとのことで教育を受けていただいていません。
classについてのメモ(Ruby)

```ruby:obj_test.rb
# -*- coding: utf-8 -*-

#クラス名は大文字で始める
class Fighter
    
    #class内の関数をメソッドと呼ぶ
    #initでclassの初期化(使用する変数の設定?)
    def initialize(attack_point)
        #インスタンス変数
        @attack_point = attack_point
    end

    def attack
        puts "プレイヤーの攻撃!" + @attack_point.to_s + "ダメージを与えた!"
    end

end

#インスタンスを作成
player = Fighter.new(50)
player.attack


#Fighterクラスを継承
class Berserker < Fighter

    def attack
      puts "プレイヤーの攻撃! 互いに" + (@attack_point * 2).to_s + "ダメージを受けた!"
    end

end

player = Berserker.new(50)
player.attack
```

結果

```
プレイヤーの攻撃!50ダメージを与えた!
プレイヤーの攻撃! 互いに100ダメージを受けた!
```
　　
参考図書
[アジャイル時代のオブジェクト脳のつくり方 Rubyで学ぶ究極の基礎講座](
"https://www.amazon.co.jp/%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E6%99%82%E4%BB%A3%E3%81%AE%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E8%84%B3%E3%81%AE%E3%81%A4%E3%81%8F%E3%82%8A%E6%96%B9-Ruby%E3%81%A7%E5%AD%A6%E3%81%B6%E7%A9%B6%E6%A5%B5%E3%81%AE%E5%9F%BA%E7%A4%8E%E8%AC%9B%E5%BA%A7-%E9%95%B7%E7%80%AC-%E5%98%89%E7%A7%80/dp/4798134651")
VPCの作成方法

#AWSでVPCの作成方法を説明します。

###そもそもVPCとは？

Virtual Private Cloudの略で、AWS上にネットワークを作成することができます。
[CIDR領域](https://qiita.com/mogulla3/items/efb4c9328d82d24d98e6)というIPアドレスの範囲を指定して、さらに小さなCIDERブロックに細分化して、ネットワークとして使用することができます。

![default-vpc-diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203857/6e88c81f-2ce4-363f-c638-5411c9cdaca0.png)

このように、VPC内に複数のサブネットを持つことができます。


サブネットを複数持てる利点として、

・外部に晒したくないネットワークを分ける
・他の部署のひとが触れないネットワークが必要な場合

などが挙げられますね。

##実際にVPCを作成していきましょう！

画像の「VPCの作成」ボタンを押します。

![vpcs _ VPC Management Console - Google Chrome 2019_05_17 18_17_05 (2)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203857/b3ae56f3-db3c-cfa5-3053-0db7e714f5ef.jpeg)

すると次の画像の画面が出てきます。

![スクリーンショット (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203857/a7353275-7749-b453-1a6a-2697da34745d.png)


作成するVPCの名前と、CIDRブロックを指定して、保存します。

これでVPCが出来上がりました。


##サブネットの作成

実際にVPCを使用するために、作成したVPCの中にサブネットを作っていきましょう！

VPCダッシュボードのサブネットタグを選択します。
サブネットの一覧画面が出てくるので、サブネットの作成ボタンを押します。

![スクリーンショット (4)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203857/2e1296b9-631e-8968-a418-bf5ba0b877c2.jpeg)

以下の画面が出てきます

![スクリーンショット (5)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203857/d3b3af22-1d9e-d960-b92a-69323c8b6273.jpeg)



①名前タグでサブネットの名前の設定を行います。

②VPCでサブネットを作成する対象のVPCを選択します。

③VPC CIDRは②で選択したVPCのCIDRブロックが表示されています。

④アベイラビリティゾーンはVPCの中のすでにあるサブネットの中にサブネットを作成したい場合に選択します。

⑤IPv4 CIDRブロックではサブネットのIPアドレスの範囲を指定します。


作成ボタンを押して完成です！！
Go で AtCoder Educational DP Contest F - LCS を解いてみた

Educational DP Contest F - LCS を解きました。

## 問題
> 文字列 s および t が与えられます。 s の部分列かつ t の部分列であるような文字列のうち、最長のものをひとつ求めてください。
注釈
文字列 x の部分列とは、 x から 0 個以上の文字を取り除いた後、残りの文字を元の順序で連結して得られる文字列のことです。
( https://atcoder.jp/contests/dp/tasks/dp_f より引用)

## 制約

* s および t は英小文字からなる文字列である。
* $ 1 \le |s|, |t| \le 3000 $

## 考え方

LCS (Longest Common Subsequence) は DP における超典型の問題で、 diff コマンドみたいなメジャーな応用があります。

DPは苦手意識がありますが、 LCS は解いた記憶があったので楽勝だと思ったら、普通と違っていたのが「最大長を求めよ」ではなく、「最長の文字列を求めよ」となっているところです。適当に書いて出したら無事死亡。
「ACできない！ナンデ！？」と思いながら試行錯誤してなんとか自力 AC できましたが、たぶんこれまで自分では「最大長を求めよ」のパターンしか解いたことがなかったみたいです。

初 AC のコードは DP 計算用の2次元配列にリストによるスタックを保持しておいて、共通シーケンスを枝分かれさせつつスタックしていく感じで書きました。
go の配列への append もそれと同じようなもんだろ、と思ってましたが、 append したときに Capacity がオーバーしない限りは既存の配列を上書きしてしまうので、途中で中身が破壊されてしまいます。
一方で文字列や配列を保持してコピーするとかなり効率が悪いので、場合によっては TLE してしまいます。

実践的には次のようなやり方が良いようです。

* まず、最大長を求める場合と同じように dp の表(int の2次元配列)に共通シーケンスの最大長を記録していく
* 表が埋まったら右下から $ s[i] == t[j]  $ の場所、つまり共通シーケンスの最大長を増やしたタイミングの $i$ を見つけては $ s[i] $ から共通シーケンスを復元していく

LCS の文字列の求め方について、 Qiita 上では @_rdtr さんの[記事](https://qiita.com/_rdtr/items/c49aa20f8d48fbea8bd2) に詳しい解説がありました。

## 提出コード

最終的に次のようなコードを書きました（抜粋）。全体は[こちら](https://atcoder.jp/contests/dp/submissions/5427806)

```go
func main() {
	defer stdout.Flush()
	s := []byte(readString())
	t := []byte(readString())
	dp := make([][]int, len(s))
	for i := range dp {
		dp[i] = make([]int, len(t))
	}

	for i := range dp {
		for j := range dp[i] {
			if 0 < i {
				dp[i][j] = dp[i-1][j]
			}
			if 0 < j {
				dp[i][j] = max(dp[i][j], dp[i][j-1])
			}
			if s[i] == t[j] {
				p := 0
				if 0 < i && 0 < j {
					p = dp[i-1][j-1]
				}
				p++
				dp[i][j] = max(dp[i][j], p)
			}
		}
	}

	i := len(s) - 1
	j := len(t) - 1

	b := make([]byte, 0)
	for 0 <= i && 0 <= j && 0 < dp[i][j] {
		for 0 < i && dp[i][j] == dp[i-1][j] {
			i--
		}
		for 0 < j && dp[i][j] == dp[i][j-1] {
			j--
		}
		b = append(b, s[i])
		i--
		j--
	}

	for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 {
		b[i], b[j] = b[j], b[i]
	}
	println(string(b))
}

func max(a, b int) int {
	if a < b {
		return b
	}
	return a
}
```
apt で悪いプロキシを掴んで "Hash sum mismatch" エラーが出た場合の対処法

## 概要

Laradock を docker-compose up する際、めちゃめちゃハマりました・・・

php-fpm の install の際に```"Hash sum mismatch" error``` エラーが出てしまい、
```docker-compose down --rmi all``` して再インストールしても同様で、
どうやってもう上手く行かず、数時間ハマりました。

これは、同様の状況で困っている方へ、**悪いプロキシを掴んでいる**という可能性もあるよ、という記事です。

### 99badproxy
これを試したら直りました。
https://askubuntu.com/a/809808

以下、自分が Docker で試した修正の diff です。
前述の askubuntu 通りのコマンドを実行しているだけです。

```
diff --git a/php-fpm/Dockerfile b/php-fpm/Dockerfile
index af3428f..ec80b2a 100644
--- a/php-fpm/Dockerfile
+++ b/php-fpm/Dockerfile
@@ -513,6 +513,11 @@ USER root
 ARG INSTALL_IMAGEMAGICK=false
 
 RUN if [ ${INSTALL_IMAGEMAGICK} = true ]; then \
+    touch /etc/apt/apt.conf.d/99fixbadproxy && \
+    echo "Acquire::http::Pipeline-Depth 0;" >> /etc/apt/apt.conf.d/99fixbadproxy && \
+    echo "Acquire::http::No-Cache true;" >> /etc/apt/apt.conf.d/99fixbadproxy && \
+    echo "Acquire::BrokenProxy    true;" >> /etc/apt/apt.conf.d/99fixbadproxy && \
+    apt-get update && \
     apt-get install -y libmagickwand-dev imagemagick && \
     pecl install imagick && \
     docker-php-ext-enable imagick \
```

良かった。
【react.js】JSX内でのclass属性名について



備忘録として残します。


#■やり方

`class="zokusei"`の書き方はNG。
下記が正しい記法です。

```jsx
const test = () => (
// 余談ですが、ここはJSX外なので、普通にJSのコメントアウトをする。
  <div className="container">
    {/* classは予約語なので、エラーになるのでclassNameが属性名。 */}
  </div>
);
```
#■余談
Reactを用いてSPAの開発をしているのですが、Vue.jsと違い難しいです・・・。
ですが、四苦八苦しつつもReactを楽しんでます。
それにしても、JSCODEはJSXも認識してコーディングの補助をしてくれるため、非常に助かってます。
少し前まではEclipseとAtomの併用で開発をしていたのですが、新しいプロジェクトにアサインするついでにVSCODEをメインIDEにしてみるといい意味で衝撃なことばかりです。
Go参考リンクメモ

メモ。随時追加。

## Basic

Golangのエラー処理とpkg/errors | SOTA
https://deeeet.com/writing/2016/04/25/go-pkg-errors/

Go1.7のcontextパッケージ | SOTA
https://deeeet.com/writing/2016/07/22/context/

Golangのcontext.Valueの使い方 | SOTA
https://deeeet.com/writing/2017/02/23/go-context-value/

ASCII.jp：Goならわかるシステムプログラミング
https://ascii.jp/elem/000/001/235/1235262/

エキスパートGo
https://www.slideshare.net/takuyaueda967/go-77689475

マスター・オブ・Reflectパッケージ
https://www.slideshare.net/takuyaueda967/reflect-27186813

## HTTP

net/httpで作るGo APIサーバー #1(アプリケーショングローバル)
https://akirachiku.com/post/2017-04-01-go-net-http-api-server-1/

net/httpで作るGo APIサーバー #2（http.Handlerインターフェース）
https://akirachiku.com/post/2017-04-02-go-net-http-api-server-2/

net/httpで作るGo APIサーバー #3（ミドルウェア）
https://akirachiku.com/post/2017-04-03-go-net-http-api-server-3/

net/httpで作るGo APIサーバー #4（ルーター、テスト）
https://akirachiku.com/post/2017-04-08-go-net-http-api-server-4/

net/httpで作るGo APIサーバー #5 (ロギング)
https://akirachiku.com/post/2018-06-23-go-net-http-api-server-5/

net/httpで作るGo APIサーバー #6（エラーハンドリング）
https://akirachiku.com/post/2018-08-11-go-net-http-api-server-6/

net/httpで作るGo APIサーバー #7（RDBMSとテスト）
https://akirachiku.com/post/2019-01-06-go-net-http-api-server-7/

## 構成

Go × Clean Architectureのサンプル実装 - 爆速でGo！
http://nakawatch.hatenablog.com/entry/2018/07/11/181453

Goでクリーンアーキテクチャを試す | POSTD
https://postd.cc/golang-clean-archithecture/


## config

jinzhu/configor: Golang Configuration tool that support YAML, JSON, TOML, Shell Environment
https://github.com/jinzhu/configor

kelseyhightower/envconfig: Golang library for managing configuration data from environment variables
https://github.com/kelseyhightower/envconfig
scp.SCPClient().get()と.put()を調べた

使用する参考にさせて頂いた記事
https://qiita.com/int_main_void/items/1cdec761b745010629d5

# 経緯
pythonでリモートサーバのファイルをコピー取得したいってなった時に

```
$ pip install paramiko
$ pip install scp
```

```python
import paramiko
import scp

# サーバに繋ぐ
with paramiko.SSHClient() as sshc:
  sshc.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  sshc.connect(hostname='XXX.XXX.XXX.XXX', port=22, username='hoge', password='hogehoge')

  # SSHClient()の接続設定を合わせてあげる
  with scp.SCPClient(sshc.get_transport()) as scpc:
    scpc.get('取得したいファイルのパス')
```
と、上記のようにすればファイルがコピー取得され、
取得したファイルはローカルの実行した.pyファイルと同じ階層の所に保存されますが、
やはり、ファイルの用途に合わせて保存先を分けたいと思い...

これって、保存先のパス指定できるはずだよね？

と思い、`scp.SCPClient().get()`の引数で存在するはずと思って調べました。

# 調査結果(筆者が理解できたところまで)
リポジトリ元が綺麗にまとめてくれていて良かったです
https://github.com/jbardin/scp.py

## get()
| パラメータ | 型 | 説明 |
|:--------|:---|:----|
| remote_path | string | リモートサーバ先から取得したいファイルのパス。ワイルドカードや環境変数を用いることも出来るらしい。 |
| local_path | string | ローカルの受け取り先パス。 |
| recursive | boolean | 再帰的に転送するかの設定。 |
| preserve_times | boolean | 転送されたファイルのmtimeとatimeを保存するかの設定。 |

```get_example.py
with scp.SCPClient(ssh.get_transport()) as scpc:
  scpc.get(
    remote_path='取得したいファイルパス',
    local_path='保存先のパス',
    recursive=True, #再帰的に転送するならTrue
    preserve_times=True #mtimeとatimeを保存したいならTrue
  )
```

## put()
| パラメータ | 型 | 説明 |
|:--------|:---|:----|
| files | string または リスト型 | ローカルから転送したい単一パス、またはパスのリスト。<br>ディレクトリを転送する場合はrecursive=Trueにする必要がある。 |
| remote_path | string | リモートサーバ先の受け取り先パス。デフォルトは`./` |
| recursive | boolean | 再帰的に転送するかの設定。 |
| preserve_times | boolean | 転送されたファイルのmtimeとatimeを保存するかの設定。 |

# 最後に
表向きのリポジトリ元のコードの使用例には、簡易的に書けるようにパラメータが省略されていたので、それを参考にされている方が多いのかなと思いました。

```origin_example.py
from paramiko import SSHClient
from scp import SCPClient

ssh = SSHClient()
ssh.load_system_host_keys()
ssh.connect('example.com')

# SCPCLient takes a paramiko transport as an argument
scp = SCPClient(ssh.get_transport())

# -------------------- この部分 -------------------------
scp.put('test.txt', 'test2.txt') #(files, remote_path)
scp.get('test2.txt') #(remote_path)
# -----------------------------------------------------
```
PyPI に Linux バイナリでパッケージをアップロードするメモ

`tinyobjloader` の Python バインディングを pybind11 で書いて pypi にアップロードしました. 

https://pypi.org/project/tinyobjloader/

パッケージ自体は小さいので, setup.py などの設定を見てもらうのがはやいと思います.

https://github.com/syoyo/tinyobjloader/tree/master/python

## PyPI パッケージングの手順

https://packaging.python.org/tutorials/packaging-projects/

を参考にします.

バイナリパッケージの場合があまり書かれていません.

## bdist_wheel

PyPi では, linux の場合は `manylinux1_x86_64` のアーキテクチャのみ受け付けるようです.
(32bit 環境も同様に manylinux1 でいけるはず?)

manylinux にしていないと, pypi への upload 時に弾かれます.

```
$ python setup.py bdist_wheel -p manylinux1_x86_64
```

として `-p` で `manylinux1_x86_64` を指定してバイナリパッケージを作ります.

ただ, あんまり新しい環境とかコンパイラを使っているとうまくいかないかもです.
その場合は,

https://github.com/pypa/auditwheel

などにあるように, Docker で古めの OS を起動 + audiowheel で whl の作り直しがよさそうです.

## PyPI へのアップロード

twine を使ってアップロードします.

Travis などで CI ビルドしたあとに, PyPI へアップロードしたい場合は, PyPI のサイトでアクセストークンを生成しておきます(このとき, とりあえず一回 twine でなにかしら whl アップロードして project を作っておく必要がある)

Travis の場合はこのあたり参考になります.

https://docs.travis-ci.com/user/deployment/pypi/

## エラーなど

### ImportError

実行時, import と

```
ImportError: dynamic module does not define module export function(PyInit_tinyobj)
```

などと出る場合. モジュールの定義と .so 名がことなっている(エラーメッセージの `PyInit_***` と PYBIND11_MODULE での定義, setup.py での記述が同じか確認しましょう.

コンパイル環境と実行環境の python の違いも考えられます.


## TODO

* Windows や macOS でのバイナリビルドも対応する. Travis や AppVeyor などと連携するのがいいかしら
Gitをイマイチちゃんと理解出来てなかったので、調べてみた

## ファイルの保存領域
- ワーキングツリー
- ステージング（インデックス）
- リポジトリ

上記の3種類があるそうです。ただ、この説明だとイマイチ自分自身ピント来なかったので、おなじみの作業開始時・add・commitをしたときにステージングやリポジトリがどう変化するか図示してみます。

とりあえず、3回コミットした状態から作業を開始する前提です。
![test.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47244/2d5270bb-990c-e330-ddbb-96568e324b13.jpeg)


### とりあえず新しく作業した
まだ add も　commit もしていない状態です。
![notadd.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47244/f1158661-3d24-32b9-9e9e-8783f6e5d5e9.jpeg)

### add した↓
なにかファイルに修正などを加えて
`git add .`
![add.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47244/b19418c5-73e2-bd08-0df1-8a2a00d4dd12.jpeg)

### commitした↓
`git commit -m 'コメント’`
![commit.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47244/14954418-9fa4-38ce-ae83-337024c55c6c.jpeg)


## commitを取り消したい
よく分かってなかった、reset コマンド
基本的にresetコマンドはcommitを取り消すためのコマンドですが、保存領域が3つあるので、オプションによってどれをどこまで戻すか指定します。

状態としてはA > B > C > D と4回コミットしてそこからDの内容を取り消したい。という状態を想定します。

### ①全てなかったことに　【reset --hard】
`git reset --hard HEAD^`


![commit.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47244/db1dcabd-4eea-484f-26d7-1a12b55f266b.jpeg)
↑これが、こうなります↓
![test.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47244/de96d271-3532-a90f-9cc8-6655ff09300c.jpeg)

使用頻度は一番低いかと思います。ステージングもワークツリーも全て過去に戻りますので、作業を全くしていない状態に戻ります。

### ②HEADだけ戻したい（commitする前）　【reset --soft】
`git reset --soft HEAD^`

![commit.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47244/a62baee5-cfec-393d-fca5-7af7e2c4bfa7.jpeg)
↑これが、こうなります↓

![add.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47244/0dafb292-5c25-0452-f324-f58108ab6cfa.jpeg)


### ③ステージングも戻したい(addする前）　【reset --mixed　or オプションなし】
`git reset --mixed HEAD^`
![commit.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47244/94219ff7-5ec7-ff62-87f4-2dddbb69c907.jpeg)
↑これが、こうなります↓
![notadd.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47244/3c5cb335-1e31-97b3-2232-d46a45a1738c.jpeg)

gitで追跡する必要のないlogファイルなどをaddしてしまった時に使えるかと。



## リモートにPush済みのcommitを取り消した
まだ、リモートにPushする前であれば、上記のresetコマンドでの対応でも問題ないかと思います。ただ、リモートにPushしたあとに、やっぱり取り消したいという場合は、resetコマンドを使ってしまうと再度プッシュする際にerrorが出てしまいます。

リモートには
A >　B　> C > D
まで記録されているが、ローカルではCからの作業追加をプッシュする形となるため。
`git push -f `
などで強制的にリモートをローカルで上書きする方法もありますが、危険性が高いので避けた方がいいか
と。
## revert　で打ち消す
`git revert HEAD^`
![commit.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47244/b84b4096-4ad1-493e-dee3-2b1f2cc07dec.jpeg)
↑これが、こうなります↓
![revert.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47244/78052d7f-639c-b9e5-86bf-43e30c0c9ec5.jpeg)

revertコマンドでは、変更内容を相殺するcommitをしてくれます。
なので、DからCへ戻しました。という履歴も残ります。

この場合再度、pushしてもエラーになりません。


# 参考にさせて頂いたサイト
### 図示するソフトを探す
図があったほうがわかりやすいと思いドローイングソフトを探すところからはじめました。
https://dev.classmethod.jp/etc/drawing_tools/

### 実際に使ったドローイングソフト
http://inkpod.carabiner.jp/index.html


# 最後に
githubも理解が浅いため、またググって、投稿しようと思います。
おかしな点あれば、まさかりいただけると幸いです。
SELinuxを一時的に無効 ＆　永久無効にする

#SELinuxを一時的に無効

```
[root@localhost ~]# getenforce
Enforcing

[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive
```

#再起動後も永久無効

```
[root@localhost ~]# vim /etc/sysconfig/selinux

SELINUX=enforcing ===>  SELINUX=disabled

reboot

```
gitのまとめ、あると嬉しい機能追加

## gitの基礎用語

### ヘッド[HEAD]
- 今いるブランチの最新のコミットを指す。
	- 「HEAD^」、「HEAD~」は直前のコミットを意味する。
	- 「HEAD~{n}」は「n個前」のコミットを意味する。


### ワーキングツリー[working tree]
- 今ローカルで作業している、コミットする前の状態。


### インデックス(ステージ[stage])
- addして追加した状態のことを指す、コミットする前の状態。


### ローカルリポジトリ[local repository]
- ファイルの変更履歴を記録（手元で管理）


### リモートリポジトリ[remote repository]
- ファイルの変更履歴を記録（みんなで共有)



## gitの操作

### git log 
- 各プロジェクトのコミット履歴を確認することができる。

#### git log オプション
- 「--oneline」オプションは各コミットを1行で出力する。
- 「--graph」オプションはブランチやマージの歴史を、log出力と共にグラフで表示する。



### git status
- 全体の変更点を確認する。
	- コードを修正したファイルをaddしていない、commitできるファイルがあるなどの確認ができる。



### git diff 
- addする前に変更点の確認ができる。
	- 「--cached」オプションはaddした後に変更点の確認ができる。
	- 「HEAD^」を付けることで今回コミットした変更点の確認ができる。

#### git diff HEAD..リモート名/ブランチ名
- pullする前にリモートとの変更点の確認ができる。

#### git diff リモート名/ブランチ名..HEAD
- pushする前にリモートとの変更点の確認ができる。



### git add [ファイル名orディレクトリ]
- ファイルやディレクトリをインデックスに追加。
	- インデックスに追加 = Git管理の対象に入れる。



### git commit 
- 追加・変更したファイルをGitに登録する。
	- 「-m」オプションはcommitする際にコメントを記述することができます。



### git config 
- gitの設定をオプションを付けることで変更、確認する事ができる。
	-「--global」、「--local」、「--system」オプションは範囲を指定する事ができる。	
		– system：システム全体の設定
		– global：該当ユーザーの全リポジトリの設定
		– local：該当のリポジトリのみ設定
	- 「--list」オプションは設定内容を確認できる。



### git branch 
- ブランチの一覧を表示と現在のブランチを確認できる。
	- 「-a」オプションはブランチの詳細を確認できる。



### git checkout ブランチ名
- 指定したブランチに移動する。
	- 「-b」オプションは新しくブランチを作成してかつ作成したブランチに移動する。
	- git checkout -b 新しいブランチ名 リモート名/ブランチ名
		- リモートのブランチを指定して切り替える事もできる。 
	- ブランチ名にコミットIDを指定する事ができる。



### git pull リモート名 ブランチ名
- リモートリポジトリの新しいデータをローカルリポジトリに取り込みかつリモートのブランチをマージする。



### git fetch
- リモートリポジトリの新しいデータをローカルリポジトリに取り込む。



### git push リモート名 ブランチ名
- リモートリポジトリにローカルの変更内容を送り込む。



### git merge マージしたいブランチ名
- ブランチとブランチを繋げる。



### git reflog
- HEADの移動履歴を確認できる。
	
#### git reflog <ブランチ名> 
- そのブランチ先端が指していたコミットの一覧を確認ができる。



### git reset 
- 状態を取り消し、巻き戻すことができる。

-  「HEAD」はaddの状態を戻す
- 「--hard HEAD」はファイルの状態、add、commit全ての状態を戻す
- 「--mixed HEAD」はcommitとaddの状態を戻す。
- 「--soft HEAD」はcommitの状態を戻す。



## ターミナルでgitを使いやすくする設定

- Git のバージョンを確認する

```
$ git version
```

- Appleのgitの場合は、homebrewのgitをインストール。

```
$ brew install git
```

### 便利な機能
- ターミナルでユーザーディレクトリに移動します。

```
$ cd
```

- 下記のコマンドで「git-completion.bash」 と 「git-prompt.sh」 のファイルがあることを確認する。
 
```
$ ls /usr/local/etc/bash_completion.d/
```

- 「.bash_profile」、「.bashrc」のどちらかのファイルを開いて編集する。

```
$ vi .bash_profile
```

- branch名を表示

```:.bash_profile
# ファイルに追加する内容
source /usr/local/etc/bash_completion.d/git-prompt.sh
source /usr/local/etc/bash_completion.d/git-comption.bash
GIT_PS1_SHOWDIRTYSTATE=true
PS1='\h:\W$(__git_ps1 "[\[\033[32m\]%s\[\033[0m\]]")\$ '
```

- 入力補完機能　有効

```:.bash_profile
# ファイルに追加する内容
if [ -f $(brew --prefix)/etc/bash_completion ]; then
  . $(brew --prefix)/etc/bash_completion
fi
```

- 設定を反映する

```
$ source ~/.bash_profile
```
Pythonで文字列部分一致度合いを調べる

# はじめに

「PC」と「ノートPC」の表層一致度は何％でしょうか？

４０％？１００％？

この記事では部分的な類似度（１００％の方）を計算する方法を解説します。


# difflibとは

[difflib](https://docs.python.org/ja/3/library/difflib.html)は様々な差を計算することができる便利ライブラリです。
今回は文字列間類似度を測る`SequenceMatcher`を使います。

```python
from difflib import SequenceMatcher

src, trg = 'PC' ,'ノートPC'
r = SequenceMatcher(None, src, trg).ratio()
```

しかし、この方法では文字列全体どうしの類似度を測るため、、部分一致している文字列間も類似度が小さくなってしまう仕様となっています。(r≒0.57)


# 部分的な類似度を計算する

早速コードをどうぞ。

```python
from difflib import SequenceMatcher

src, trg = 'PC', 'ノートPC' 
s_len, t_len = len(src), len(trg)

r = max([SequenceMatcher(None, src, trg[i:i+s_len]).ratio() for i in range(t_len-s_len+1)])

```

短い方の文字列を軸に、長い方の文字列から短い方の文字列長分取り出して比較、その後最大値を出力します。今回は文句無しで r=1.0 です。

# 参考
[difflib --- 差分の計算を助ける — Python 3.7.3 ドキュメント](https://docs.python.org/ja/3/library/difflib.html)
[openFrameworks] imguiで楽々save/load

## はじめに
　oFにおけるsave/load機能を実装したい場合、ofxGuiとofxXmlSettingsでの実装が散見されるが、imguiでこれをやりたい。
[cereal](http://uscilab.github.io/cereal/index.html)でもいいけど、ofParameterGroupに対応させるのめんどくさい。どうにか楽に実装できないか調べてみた。


## 結論
**ofSerializeとofDeserializeを使う。**
　とりあえず一番これが低カロリーで実装できた。ofParameterGroupにも対応。
何より、コアの機能で実現できたのでメンテナンスのコストもない。（わーい）


### 保存

```C++
ofJson json;
ofSerialize(json, parameter_group_);
ofSaveJson("settings.json", json);
```

### 呼び出し

```C++
ofJson json = ofLoadJson("settings.json");
ofDeserialize(json, parameter_group_);
```


### How to Use
ofxImGuiと組み合わせて使うとこんな感じと思う。


```C++
class BaseLayer 
{
public:
  BaseLayer(const std::string& unique_name) 
    : name_(unique_name) 
  {
    parameter_group_.setName(name_);
  }

  void drawGui() {
    auto Settings = ofxImGui::Settings();
    ofxImGui::AddGroup(this->parameter_group_, Settings);
		
    ImGui::Begin("Util");
    if (ImGui::Button("Save")) {
        ofJson json;
	    ofSerialize(json, parameter_group_);
	    ofSaveJson(name_ + "_settings.json", json);
    }
    if (ImGui::Button("Load")) {
        ofJson json = ofLoadJson(name_ + "_settings.json");
	    ofDeserialize(json, parameter_group_);
    }
    ImGui::End();
  }
  std::string name_;
  ofParameterGroup parameter_group_;
};
```


みたいに親クラスで実装して子クラスのコンストラクタで....

```C++
class MyGenLayer : public BaseLayer
{
  MyGenLayer(const std::string& unique_name)
    : BaseLayer(unique_name)
  {
      vec2_param.set("Emit Position", glm::vec2(5.0f, 5.0f), glm::vec2(0.0f, 0.0f), glm::vec2(12.0f, 12.0f));
      vec3_param.set("Rotation", glm::vec3(5.0f, 5.0f, 5.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(12.0f, 12.0f, 12.0f));
      parameter_group_.add(vec2_param);
      parameter_group_.add(vec3_param);

      ofJson json = ofLoadJson(name_ + "_settings.json");
      ofDeserialize(json, parameter_group_);
}
  void update() {}
  void draw() {}

private:
  //user define
  ofParameter<glm::vec2> vec2_param;
  ofParameter<glm::vec3> vec3_param;
};
```
Wio LTE M1/NB1(BG96) で、各社のSIMを使ってみる

# やってみること
各通信キャリアとも、LTE-Mに対応したというプレスリリースがなされています。
今回は、SORACOM から購入した [Wio LTE M1/NB1(BG96)](https://soracom.jp/products/module/wio_lte_m1_nb1/) を使用して、各キャリアのSIMでLTE-Mが使用できるかを実際に確認してみます。

# テストした環境
## 使用した機器
[Wio LTE M1/NB1(BG96)](https://soracom.jp/products/module/wio_lte_m1_nb1/)
## 使用したソースコード
以下のコードを使用しました。
各キャリアのSIM ごとに、`#define` のAPNの定義を変更します。
やっていることは、初期化→回線接続→yahooのページをHTTP GET、だけです。

```cpp:LTE_M_TEST.ino
#include <WioCellLibforArduino.h>

WioCellular Wio;

#define APN "**********"
#define USER "**********"
#define PASS "**********"

void setup() {
  delay(200);
  SerialUSB.begin(115200);
  SerialUSB.println("");
  SerialUSB.println("--- START ---------------------------------------------------");

  SerialUSB.println("### I/O Initialize.");
  Wio.Init();

  SerialUSB.println("### Power supply ON.");
  Wio.PowerSupplyCellular(true);
  delay(500);

  SerialUSB.println("### Turn on or reset.");
  Wio.SetAccessTechnology(WioCellular::ACCESS_TECHNOLOGY_LTE_M1);
  Wio.SetSelectNetwork(WioCellular::SELECT_NETWORK_MODE_MANUAL_IMSI);
  if (!Wio.TurnOnOrReset()) {
    SerialUSB.println("### ERROR! ###");
    return;
  }

  SerialUSB.println("### Connecting to \"" APN "\".");
  if (!Wio.Activate(APN, USER, PASS)) {
    SerialUSB.println("### ERROR! ###");
    return;
  }

  char w[32];
  if( Wio.HttpGet("http://www.yahoo.co.jp/",w,16)) {
    SerialUSB.println("##### HTTP GET OK");
  } else {
    SerialUSB.println("##### HTTP GET NG");
  }
}

void loop() {
}
```

## 使用したSIM
以下の SIM を使用しました。
上から、KDDI([SORACOM plan-KM1](https://soracom.jp/products/sim/plan-km1/)), SoftBank([b-mobile 190PadSIM](https://www.bmobile.ne.jp/190sim/index.html)), docomo([IIJmio](https://www.iijmio.jp/)), [IIJ フルMVNO](https://www.iij.ad.jp/biz/iijmobile/), というラインナップです。
![sim.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169018/dbb1ad9e-f83c-0226-98f4-2ca291a79a89.png)

#結果
## KDDI(SORACOM)
問題なし。
そもそもSORACOMが売っている機器とSIMですから、当たり前に問題なく動作します。

```
--- START ---------------------------------------------------
### I/O Initialize.
### Power supply ON.
### Turn on or reset.
### Connecting to "soracom.io".
##### HTTP GET OK
```

## SoftBank(b-mobile)
問題なく接続できました。

```
--- START ---------------------------------------------------
### I/O Initialize.
### Power supply ON.
### Turn on or reset.
### Connecting to "sb.mvno".
##### HTTP GET OK
```

## docomo(IIJmio)
接続できず。

```
--- START ---------------------------------------------------
### I/O Initialize.
### Power supply ON.
### Turn on or reset.
### Connecting to "iijmio.jp".
### ERROR! ###
```

## IIJ フルMVNO
接続できず。
IIJが発行したSIMですがドコモの電波を使っているものなので、ドコモがつながらなければIIJもつながらないのは当然といえば当然ですかね。

```
--- START ---------------------------------------------------
### I/O Initialize.
### Power supply ON.
### Turn on or reset.
### Connecting to "h.iijmobile.biz".
### ERROR! ###
```

#まとめ
各キャリアとも LTE-M には対応していることはプレスリリース済みなのですが、今回はドコモの回線だけ接続できませんでした。
ドコモの場合、「ドコモに対応している」と明確にうたっている通信チップを使わないとと接続できないという噂をちらほら聞いていますので、おそらく [Wio LTE M1/NB1(BG96)](https://soracom.jp/products/module/wio_lte_m1_nb1/) で使用されている通信チップ [Quectel BG96](https://www.quectel.com/product/bg96.htm) がまだドコモに対応できていないのが原因だと思います（想像）。
C#で文字列を分割する方法

##一度の入力しか使用できない時
一度の入力処理中で複数の数値を得るコードを書く時がある。
その時、入力を区別するためには「,」や「 」で区切らせることが多いと思う。
ex)東京,23,都  etc...

これを一つ一つに分けるときに使うのが**Split**だ。

##使い方
######区切り文字が1種類の場合

`code` string line = {東京,23,都};
`code` string[] str= line.Split(',');

区切りに使われている文字を指定するだけで
srt[0] ="東京" ,srt[1] ="23",srt[2] = "都"
に分割することができる。

######区切り文字が複数種類の場合

`code` string line = {東京:ばなな 香川：うどん 宮城:牛タン};
`code` string[] str= line.Split(':' , ' ');

str[0]="東京",str[1]="ばなな",str[2]="香川",str[3]="うどん",str[4]="宮城",str[5]="牛タン"
【Xcode】プロジェクトを流用する

「メモ」
プロジェクトを複製して、別プロジェクトとして作り直したい。
Aプロジェクトを複製->Bプロジェクトとしてrename->Build成功、までの手順のメモ書き。

## step1. プロジェクトAを複製
シンプルにプロジェクトAが格納されてるディレクトリを右クリックしてコピーしましょう。
適切なディレクトリにペーストしましょう。

## step2. プロジェクト名を変更する
プロジェクトAを開きます。Navigatorエリアから該当プロジェクトを選択しInspectorエリアのNameを"プロジェクトB"に変更します。
`Rename project content items?`
という内容が表示されるので `Rename` しましょう。

## step3. scheme作成
Xcodeウィンドウの左上のスキーム変更ボタンから `Manage shemes...` を選択し、"プロジェクトB"スキームを追加しましょう。そして"プロジェクトA"スキームは消してしまいましょう。

## step4. 各フォルダの名前変更
Navigatorエリアから"プロジェクトA"フォルダを選択しInspectorエリアのNameを"プロジェクトB"に変更します。
同じように、Navigaterエリアから"プロジェクトATests"フォルダを選択しInspectorエリアのNameを"プロジェクトBTests"に変更します。
同じように、Navigaterエリアから"プロジェクトAUITests"フォルダを選択しInspectorエリアのNameを"プロジェクトBUITests"に変更します。

## step5. podfileのtarget内容変更
コマンドラインを起動し該当プロジェクトのpodfileを編集します。
"target プロジェクトA" となってるところを"target プロジェクトB"に変更しましょう。
"target プロジェクトATests" となってるところを"target プロジェクトBTests"に変更しましょう。
"target プロジェクトAUITests" となってるところを"target プロジェクトBUITests"に変更しましょう。

## step6. entitlementsのパス修正(必要なら)
プロジェクトの `Build Setting` から、　`Signing` 項目の `Code Signing Entitlements` のパスが古いままになってるかと思うので適切なパスに修正しておきましょう。

## step7. Objective-C Bridging Headerファイルのパス修正(必要なら)
プロジェクトの `Build Setting` から、　`Swift Compiler - General` 項目の `Objective-C Bridging Header` のパスが古いままになってるかと思うので適切なパスに修正しておきましょう。

## step8. Info.plistファイルのパス修正
プロジェクトの `Build Setting` から、　`Packaging` 項目の `Info.plist File` のパスが古いままになってるかと思うので適切なパスに修正しておきましょう。

## End. クリーンビルド
クリーンビルドしてみてください。エラー出るようだったら頑張ってください。
（Build Settingで"プロジェクトA"で検索して検索引っかかったところを修正していくといいかも？）
【Java】一つの戻り値から複数の値を取得する

入門用のテキストを読みながら「戻り値が２つ以上返せるなら便利では？」と思ったので、調べつつ試しに書いてみた。一応忘れないようにノート。(Beansやリストという方法もあるみたいだけども勉強します......)

#結論から言うと#
一つの配列変数かクラス型変数に値をまとめて返すという方法を取った。最終的に「こんなことするくらいならメソッドを増やして一個ずつ返した方が良くないか？」と思いました。

- 複数の戻り値が同型の場合
    - **基本データ型の配列で返す方法**
- 複数の戻り値が異型の場合
    - **Object型の配列で返す方法**
    - **クラス型で返す方法**

アクセス制限のことを考えると、本当はもっと方法は限定されると思う。

#1. 複数の戻り値が同型の場合#
返したい戻り値が複数あり、すべて同型の場合は基本データ型に入れられるよね、という考え。無理くりdouble型にint型をぶち込んだりすることも出来っちゃ出来るけど、やりたくないよね？と思ったので、その場合は考えていない。
###1-1. 基本データ型配列で返す###
```Sub.java
public class Sub {
    private int A = 100;
    private int B = 200;

    public int[] getAB(){
        int[] array = new int[2];
        array[0] = A;
        array[1] = B;
        return array;
    }
}
```
```Main.java
public class Main {
    public static void main(String[] args){
        Sub sub = new Sub();
        int[] array = sub.getAB(); // ここでSubクラスからint配列が返ってくる。

        System.out.println(array[0]); // 出力
        System.out.println(array[1]);
    }
}
```

```実行結果.
100
200
```

#2. 複数の戻り値が異型の場合#

- 上と同じ考え方でObject型で返す方法
- クラス型で返してフィールドを呼び出す方法

###2-1. Object型配列で返す###
上で`int[]`って書いてた部分が`Object[]`になった。異型の値でもObject型配列なら一緒に格納できるよね、という考え。

```Sub.java
public class Sub {
    private int A = 100;
    private double B = 200.0;

    public Object[] getAB() {
        Object[] array = new Object[2];
        array[0] = A;
        array[1] = B;
        return array;
    }
}
```
```Main.java
public class Main {
    public static void main(String[] args) {
        Sub sub = new Sub();
        Object[] array = sub.getAB();

        System.out.println(array[0]);
        System.out.println(array[1]);
    }
}
```
```実行結果.
100
200.0
```
この記事で書いてる方法の中では一番まし？

###2-2. クラス型で返す###
オブジェクトを返した後から、そのオブジェクトのフィールドをメインメソッドで呼び出せば出来るよね、という考え。出来るには出来るがアクセス修飾子を使ってのアクセス制限ができない欠点。

```Sub.java
public class Sub {
    int circleAreaInt;
    double circleAreaDouble;

    public Sub calcCircleArea(int r) {
        Sub sub = new Sub();
        sub.circleAreaInt = 3 * r * r ;
        sub.circleAreaDouble = 3.14 * r * r;
        return sub;
    }
}
```
```Main.java
public class Main {
    public static void main(String[] args) {
        Sub sub = new Sub();
        sub = sub.calcCircleArea(2);

        System.out.println(sub.circleAreaInt);
        System.out.println(sub.circleAreaDouble);
    }
}
```
```実行結果.
12
12.56
```
引数(int)として円の半径`r`を渡すと、ゆとり世代の円周率(3)と非ゆとり世代の円周率(3.14)の両方で円の面積を計算して返してくれるメソッド......なのだが、あんまりいい例が思いつかなかった。こんな書き方をする必要はない。

#参考書籍#
[やさしいJava第7版]
(https://www.amazon.co.jp/%E3%82%84%E3%81%95%E3%81%97%E3%81%84Java-%E7%AC%AC7%E7%89%88-%E3%80%8C%E3%82%84%E3%81%95%E3%81%97%E3%81%84%E3%80%8D%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E9%AB%98%E6%A9%8B-%E9%BA%BB%E5%A5%88/dp/4815600848)
Pp.251