OmniAICreator/Qiita-1.07M huggingface dataset:
Go言語でAPIを叩いてみる

初めてGo言語に触れてみる。
お決まりのHello Worldの儀式を済ませたので、早速Goを使ってAPIを叩いてみる。

#環境
CentOS7
go version go1.12.7 linux/amd64

#APIを叩く
サンプルに使ったのは楽天ブックス総合検索API。
せっかくなのでリクエストパラメータに「go言語」を指定してみる。

```api_get.go
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"
	"os"
)

func main() {
	// リクエストパラメータの定義
	query_param := url.Values{}
	query_param.Add("applicationId", "XXXXXXXX") // XXXXXXXX => apiid
	query_param.Add("format", "json")
	query_param.Add("keyword", "go言語")
	query_param.Add("booksGenreId", "000")
	query_param.Add("page", "1")
	// クエリパラメータをエンコード
	parse_value := query_param.Encode()

	// getリクエスト
	response, err := http.Get("https://app.rakuten.co.jp/services/api/BooksTotal/Search/20170404?" + parse_value)
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	// レスポンスステータスの確認
	fmt.Println("status: ", response.Status)

	// レスポンスの内容を全て読み込む
	body, err := ioutil.ReadAll(response.Body)
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	// 読み込んだ中身を表示
	fmt.Println(string(body))
}

```

#結果

一番最初に取れたのは「スターティングGo言語」ですね。
名著がいい感じに取れました。


```
status:  200 OK
{"count":9,"page":1,"first":1,"last":9,"hits":9,"carrier":0,"pageCount":1,"Items":[{"Item":{"title":"スターティングGo言語","author":"松尾愛賀","artistName":"","publisherName":"翔泳社","label":"","isbn":"9784798142418","jan":"","hardware":"","os":"","itemCaption":"本書は、次世代のプログラミング言語として注目を浴びる「Ｇｏ言語」をこれから学ぶ人のための学習書です。基本構文から、ゴルーチンなどの特徴的な機能、開発ツールやパッケージの使い方まで、Ｇｏプログラムを書いてみたい方に必要な知識を解説しています。Ｇｏ言語の最新バージョン１．６に対応。使用頻度の高いパッケージの使い方は集中的に解説。巻末には標準ライブラリのパッケージカタログを付けました。便利で役立つ一冊です。"
# => 他にも取得出来ましたが長いので割愛
```

#まとめ
最近使っているpythonのrequestsのノリで書いてみましたが、全然goっぽくない。
今度は構造体に取得したデータをぶちこんだりして、もっとgoっぽく書けたらいいな。
WSLからWindows上のadb.exeを使うと改行コードがCRLFになる

さっき WSL から Windows 上の adb.exe を使ってたら文字列操作でわけがわからないことになってハマったのでメモ。

結局 `sed` で `\r` (CR) を消してあげれば動きました。

```sh
adb.exe shell ls $remote_dir | sed -e 's/\r//g'
```

adb 以外でも気をつけたほうがよさそうですね 🤔
a タグには必ず href を設定しよう

## どうする

a タグを書くときには必ず `href` を設定しましょう。

React などの vDOM ライブラリを使用している場合は a タグの挙動を `onClick` で上書きするようなコードを書くことも多いですが、その場合は `href="#"` などとしてダミーの値を設定しましょう。

```html
<!-- bad -->
<a onclick="alert('Yo!')">Say Yo!</a>

<!-- good -->
<a onclick="alert('Yo!')" href="#">Say Yo!</a>
```

## なんで

`href` が設定されていない a タグはタブキーでフォーカスできません。アクセシビリティ上の理由で、要素の選択とナビゲーションはキーボードだけで行えるのが好ましいです。そのため、基本的にすべての a タグはフォーカスできないといけません。

React を使っていて `onClick` が設定されている場合は要素にフォーカスした上でエンターできちんと `onClick` の処理が実行されます。

## もっと良くする

そもそもその要素は `<a>` である必要性があるのでしょうか？

`href` がなく `onclick` しかないならその要素は `<button>` である可能性が高いです。

様々な事情で a タグを使わざるを得ない場合もありますが、できるなら button 要素を使いたいです。

## 参考

* [\<a>: The Anchor element - HTML: Hypertext Markup Language | MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#Accessibility_concerns)
Tutorial for AIPS+Difmap VLBI imaging

# Introduction
This course addresses simple imaging of a compact continuum radio source, DA 193, observed with 10 VLBA stations at 15 GHz. Let's see the results first.
![difmap_uvpl01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157253/783fbd31-f048-0e94-eaec-f23a33906379.png)
(u, v) plot

![difmap_clean-map.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157253/81cc57a4-9207-1991-3e3d-232843eaf94a.png)
CLEAN image

# Data Specifications
The dataset is a subset of a session targeting NGC 1052. DA 193 is observed as a calibrator.

| Obs. Date | 2001-08-17 |
|:----------|:-----------|
| Array     | VLBA 10 stations |
| Source | DA 193 |
| Frequency | 15.4 GHz |
| Bandwidth | 16 MHz x 2 IFs, 64 channels/IF |
| Data Volume | 97.3 MB |

# Reduction Procedure

The data reduction procedure consists of (A) calibration with AIPS and (B) imaging with Difmap. See the links to each step. The calibration process starts from the raw dataset and generates calibrated visibilities, which is required in the imaging process. We also prepared the calibrated visibilities for who wants to skip calibration and just start imaging.

## (A) Calibration with AIPS
1. Download the raw data
2. Load the raw data into AIPS
3. Check the dataset
4. Amplitude calibration
5. Fringe fitting
6. Bandpass calibration
7. Channel averaging
8. Generate calibrated visibilities in FITS format

## (B) Imaging with Difmap
1. Load the calibrated visibilities into Difmap
2. Time averaging
3. Flagging
4. Dirty map
5. CLEAN
6. Phase self-calibration
7. Amplitude self-calibration
8. Final map
nvmeの型番の調べ方

ubuntuでNVMe載せたけど、型番忘れてしまった。

ということで、調べてみた。

nvme-cliというパッケージを入れないと駄目みたい。

`apt install nvme-cli`

`nvme list`


```
root@ajitama-pc:~# nvme list
Node             SN                   Model                                    Namespace Usage                      Format           FW Rev  
---------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- --------
/dev/nvme0n1     1909A4803144         WDC WDS250G1B0C-00S6U0                   1         250.06  GB / 250.06  GB    512   B +  0 B   201000WD
root@ajitama-pc:~# 
```
Android開発環境でコマンドラインからのビルドが失敗する場合の対処

# 前提
- Windows 10
- Android Studio 3.4.2

# 事象と原因
Android Studioで作成されたプロジェクトは、ディレクトリトップにて以下コマンドを実行することでフルビルドできる

```shell
gradlew.bat assemble
```

しかし、環境によっては以下のようなエラーが表示されることがある

```
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:compileDebugKotlin'.
> Kotlin could not find the required JDK tools in the Java installation 'C:\Program Files\Java\jre1.8.0_181' used by Gra
dle. Make sure Gradle is running on a JDK, not JRE.

...(中略)...

BUILD FAILED in 3s
13 actionable tasks: 13 executed
```

この原因はエラーメッセージにあるように、ビルドに必要な**JDK**にパスが通っておらず、**JRE**にパスが通っているためである

- JDK = Java Development Kit：Javaでアプリケーションを開発するためのライブラリ
- JRE = Java Runtime Environment：Javaアプリケーションを動かすためのライブラリ

# 解決策
スタートメニューから「path」と検索して「システム環境変数の編集」を起動し、「環境変数」をクリックする
![システムプロパティ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125334/9aa322da-8e52-f8fd-3285-d95fe7b10e76.png)

画面下側の「システム環境変数」の「新規」をクリックする
![環境変数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125334/8371f296-13bd-edcd-fd7b-fbd09b616ae5.png)

変数名`JAVA_HOME`でインストールされているJDKのパスを変数値に設定し、OKをクリックする
![環境変数追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125334/a667b877-2476-e04f-be62-dc26d4fad389.png)

コマンドラインを再起動して再度同じコマンドを叩き、ビルドできることを確認する
dockerでマイクラのポケモンサーバ簡単構築

#はじめに
dockerでpixelmonサーバ立ち上げたことがあったので、備忘録として残します。
いやぁ、楽しいですよねマインクラフト

あと、今回ネットワークと、サーバ設定周りは触れませんので、そこらへんはあしからず
(機会があったら家のサーバ環境とかも取り上げたいです！)

#構築環境
・centos7
　うん、docker動けばどこでもいいよ
・minecraft version 1.12.2
・forge version 14.23.5.2768
 （これwin側のバージョンは違うかもです)
・pixelmon version 2.4.2

自分が構築した時期も少し前と言うこともあり
全体的に古いバージョンなのですが、そこは臨機応変におねです

#内容

##ディレクトリ構造
centosのユーザで以下ディレクトリ作成してください。
また、mods直下にpixelmonのjarを配置してください。
>pokemon
 |--docker-compose.yml
 |--25565
 |　　|--data
 |　　|--mods
 |　　　　|--PixelmonGenerations-1.12.2-2.4.2-universal.jar

##docker-compose

```docker:docker-compose
version: '3'
services:
    minecraft-server:
        container_name: miutipokemon　　
        image: itzg/minecraft-server
        ports:
            - "25565:25565"
        tty: true
        stdin_open: true
        restart: always
        volumes:
            - ./25565/mods:/data/mods/
            - ./25565/data:/data/
        environment:
            EULA: "TRUE"
            VERSION: "1.12.2"
            TYPE: "FORGE"
            FORGEVERSION: "14.23.5.2768"
            SPAWN_MONSTERS: "false"

```
(これどうやったら色つくようにできるんだろう・・・)
軽く中身を説明すると
volumesの/data/modsでjarファイルをコンテナ内に同期させ、/dataでデータを永続化してます。
なので、バックアップを取りたい場合は、ホスト側の25565/dataの中身
全部取っておけばおっけーです。

environmentの中の設定詳細は以下URL
https://hub.docker.com/r/itzg/minecraft-server


#実行

docker-composeが配置されてるディレクトリにて

```
$ docker-compose up -d
```
と実行するだけ！
あとは、ネットワーク環境によりますがサーバ指定して入ってもらえば
OKです！

僕のサーバ公開しているので、遊びたいかたいたら一声かけてくださーい。
今日の学習

##やったこと
・HTMLのformタグ、inputの使い方
・rails チュートリアル２章を一通り終わらす。

##学んだこと
・alidatesとは何か？

テーブルのレコードでは必ずデータの形（文字列や整数）などが決まっていてレコードをテーブルに保存する時、値が正しいか検証する必要があるが、この検証を簡単に行うことができるのがvalidatesメソッドである。

使い方

→validatesメソッドの引数には、モデルの属性名の前に「:」を記述する。

その後にハッシュで「バリデーションの種類: true」を並べれば、その種類のバリデーションが行われる。

例

validates :number, :name, presence: true

※背番号(number)属性と名前(name)属性に「presence: true」を指定することで背番号と名前に「空を禁止(値を必ず入れなければいけない)」という制限を加えた。



また、「バリデーションの種類: { オプション: オプションの値 }」とすると、バリデーションごとにオプションを指定することが可能

例

validates :name, length: { maximum: 20 }

※「名前(name)属性に20文字以下(最大20文字)」という制限を加えた。

##補足
https://www.sejuku.net/blog/81862
AWS ELBでSSL化した際にLaravelのメール認証(EmailVerification)ができなくなった話

# 起きたこと
ELBでSSL化を行った際に、Laraveのメール認証が動かなくなってしまった。

エラーを探ってるとこんなメッセージが
`This request has been blocked;. the content must be served over HTTPS.`

# 結論
[ここに記載してあるとおり](https://qiita.com/Takagi-Yuya/items/47e80036bf15bbd0e50c)
TLS／SSL証明を行うロードバランサの裏でアプリケーションが実行されている場合は別で対応が必要みたいです。

>Tip!! AWS Elastic Load Balancingを使用している場合、$headersの値は
>Request::HEADER_X_FORWARDED_AWS_ELBに設定する必要があります。$headersで使用する
>内容の詳細は、Symfonyのtrusting proxiesドキュメントを参照してください。
Rails で attr_accessor と validates の組み合わせでエラー


```ruby:Migration
create_table :my_model do |t|
 t.string :domain, null: false
 t.string :category, null: false
 t.string :name, null: false
```

```ruby:MyModel
 validates :name, presence: true, uniqueness: {scope:[:domain, :category]}
 attr_accessor :name
```

このとき、MyModel.Create によって作成を試みると

```
ActiveRecord::NotNullViolation: SQLite3::ConstraintException: NOT NULL constraint failed:...
```

が起こる。

## attr_accessor

`attr_accessor :name` を除いてあげると、通るようになる。
明確な理由は分からないが、 attr_accessor は メソッド定義を上書きしている模様。

## Rails API docs for Active Record によると
おそらく Overwriting default accessors にあるように、super する必要があるものの、attr_accessor 単体では super しないために値が保存されないのではないかと思われる。（確信なし）

https://api.rubyonrails.org/classes/ActiveRecord/Base.html

## どうすればいいか
attr_accessor でアクセスしない場合、name はローカル変数として扱われてしまい、同一モデル内では値が上書きされない。したがって作成・保存のときに Null となっている。
（ただしReadはできるのでややこしい）。

同一モデル内で属性(attributes)にアクセス(更新・上書き)したい場合は、
self を使う。

```ruby:MyModel
def update_name
  self.name = 'My Nickname'
end
```
など。

---
memo: Rails 5.2.3
p+q=r2乗のN以下の素数を求める

#問題文
p+q=r2 を満たす N 以下の素数 (p,q,r) の組の個数を求めてください。

#ソース
```php
<?php
//入力値
$nyu = 10;

//素数を取得
for($i=2; $i<$nyu; ++$i){
    $flag = 0;
    for($j=2; $j<$i; ++$j){
        if( $i%$j == 0){
            $flag =1;
            break;
        }
    }
    if($flag == 0){
        $retsu[] = $i;
    }
}
//2乗の値を取得
for($i=0; $i<count($retsu); $i++){
    $total[] = $retsu[$i] * $retsu[$i];
}
//計算パターンを2次元配列に格納
foreach ($retsu as $val1) {
    foreach ($retsu as $val2) {
         $result[] = array_merge((array)$val1, (array)$val2);
    }
}
//配列に格納した組み合わせを足し算して、合計と一致するものにカウント+1
for($i=0; $i<count($retsu); $i++){
    for($p=0; $p<count($result); $p++){
        $tasu_kekka = ($result[$p][0] + $result[$p][1]);
        if($tasu_kekka == $total[$i]){
            $kekka[] = 1;
        }
    }
}

echo count($kekka);
?>
```
[正規表現] 英文から簡単に単語を抽出する

#

##はじめに

次のような英文があるとする．

```sample.rb
txt =
"The widow she cried over me, and called me a poor lamb, and she called
me a lot of other names, too, but she never meant no harm by it. She 
put me in them new clothes again, and I couldn’t do nothing but sweat
and sweat, and feel all cramped up. Well, then, the old thing commenced
again. The widow rung a bell for supper, and you hadto come to time. 
When you got to the table you couldn’t go right to eating, but you 
had to wait for the widow to tuck down her head and grumble a little over the victuals, though there warn’t really anything the matter with them, – that is, nothing only everything was cooked by itself. In a
barrel of odds and ends it is different; things get mixed up, and the
juice kind of swaps around, and the things go better."
```
このとき，英文中の`me`が出現する回数を数えるなら，

```sample.rb
txt.scan("me").size
```

とするのが一般的だが，`me`以外の単語も数えてしまう．例えば`names`や`meant`に反応する．他にも色々と回避するために正規表現を付け加えると，行頭の`me`や`me,`に反応しなくなる不幸も起きる．


##\bの効用
そこで余計な単語を無視したいときに役立つのが`\b`である．`\b`は単語の境界を表す正規表現で，単語の区切り目を条件づけることができる．

```sample2.rb
txt.scan(/\bme\b/).size
```

単語を取り出したいと感じたらとりあえず`\b`使っていこう！
bioinfoの競技プログラミングRosalindoを解いてみた

# 概要
　最近、ちょこちょこ競技プログラミング(Atcoder)を解いているのですが、自分の専門により近いのがあれば、もっと楽しいし、やっている時の罪悪感がないのではと思い、bioinfoの競技プログラミングを探していました。

　ということでググっってみたのですが、やはり競技プログラミングっぽいものはあまりなくて、以下の2つしか見当たらなかった
　
## [Bioinformatics Contest](https://bioinf.me/en/contest#details)
[Bioinformatics Institute](https://bioinf.me/en)
というNPOが1年に一回開催しているもの(今年は２月（例年？）でもう終わっている）

競技プログラミングっぽいけど、入賞者を見ると僕でも論文を何本も読んだことのある人がいてびっくり（学生以外のプロも参加してそう）

## [Rosalind](http://rosalind.info/problems/list-view/) 　
2012年ぐらいからあるbioinfoの競技プログラミングサイト

問題数があまり多くないっぽいのと、定期的にコンテストが開催されるわけではなく、[project Euler](https://projecteuler.net/)のバイオ特化みたいな感じなので、バイオの人が触れてみる価値はありそう。

[Reddit のポスト](https://www.reddit.com/r/bioinformatics/comments/a3css9/did_anyone_learn_bioinformatics_on_rosalindinfo/)　を見ると、Rosallingはアルゴリズムに偏っているので実の解析を学びたいならBioconductorやDatacampの解析を学ぶと良いが、アルゴリズムが好きな人や、興味を持つにはベストな方法ではないかと書いている。

注意点として、回答のコードを他の場所（例えばQiitaとかブログとか）に投稿してはいけないというルールがある。
（以下公式のQAから）
>Can I post my solutions somewhere?
No. The goal of Rosalind is to facilitate learning through problem solving. We encourage you to search the Internet or communicate with each other to find the best algorithms to solve our problem. However, there is a difference between looking for inspiration and copy-pasting someone else's code; we strongly advise you not to use others' source code. Once you have solved a problem, then we encourage you to post your code to the problem's comments section (which can be seen only by users who have also solved the problem). However, please do not publish your code outside of the Rosalind website.



[国籍とスコアの表](http://rosalind.info/problems/locations/)
を見ると319点がマックス？
日本人でも登録している人は100人ぐらいいるけど、今やっている人はほとんどいなさそう笑

[2012年の黎明期にやっていた人のブログ](https://xef.hatenadiary.org/entry/20121108/p1)
にファイルの操作などのtipsが載っている。

# 実際にやってみた上でのtips
* ファイルをダウンロードし、そのファイルを入力とした時の回答をファイルか、直打ちで提出する方式
* 問題によってはダウンロードから提出まで1minしかないので、ダウンロードまでにコード書いたり、デバッグも終わらせとく必要がある（以外に1minは短い）
* ファイルを開いて入力を確認するのはめんどくさいので、https://qiita.com/taashi/items/07bf75201a074e208ae5 を参考にしてpythonでファイル名を引数にとって展開する方法を学んだ
* また、提出も高速化しないと間に合わないので`python complemnt_seq.py test.txt ` のようにコピペも最速化する。（ファイルを作ってもいいがこっちの方が早そう）

入力例

```in_out.py

#!/use/bin/env python
# count ACGT occurance
import sys
import re
def ans(filename):
    with open(filename,"rU") as f:
        s = f.readline().split() # read 1 line
        print(ans)
if __name__ == '__main__':
    args = sys.argv
    ans(args[1])
```

# 感想
まだ簡単なのしかやっていない（Rosallindoはtree 形式とやらをとっていて、特定の系列に対してある問題をとかないと、次の問題を解くことができない）だが、やはり馴染みの深い分野だと、アルゴリズムとか全然なくても楽しい。
　
　まだ問題としては、塩基配列を受け取り、ACGTの頻度を返す、RNAの配列にする（T->U　への変換）、逆相補鎖を返すなど、単純な(pythonの文字列の扱いになれる程度の）問題しかやっていないが、他の人の回答をみることができ、色々と学びになる。
Chromeのインスペクターは右か左に配置するのがオススメな理由

## Chromeのインスペクターは右か左に配置するのがオススメな理由
Web開発をする方はChromeのインスペクターを使用するかと思います。

インスペクターは、ブラウザの右か左に設置するのがオススメです。
その理由は、スマホなどのレスポンシブデザインを開発するときに、すぐに横幅を変えることが出来るからです。
この記事が参考になれば幸いです。

## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Python3で複数のQRコードを読み取る

## TL;DR;
Python3でpyzbarを使って1イメージ内にある複数のQRコードを読み込みます。
備忘録です。

## 実行環境
* macOS Mojave 10.14.5
* Python 3.7.3
* zbar 0.10.9
* pyzbar 0.1.8


### pyzbar とは
> Read one-dimensional barcodes and QR codes from Python 2 and 3 using the zbar library.
> -- zbarライブラリを使用してPython 2と3から一次元バーコードとQRコードを 読みます。
[pyzbar -  PyPI](https://pypi.org/project/pyzbar/)


### ZBarとは
[ZBar bar code reader](http://zbar.sourceforge.net)

すごいOSSみたい
[zbar で画像からバーコードを読み取る](https://qiita.com/labocho/items/11985fa376b867b8e9ff)


## インストール

pyzbarのオフィシャルにあるとおりにインストール

```
brew install zbar
pip install pyzbar
```

画像を読むpillowもインストール

```
pip install Pillow
```


pillowはPILのforkらしい
[Pillow 6.0.1 Documentation](https://pillow.readthedocs.io/en/stable/)
[PIL(Python Imaging Library) が Pillow に変わっていた](http://nakamura001.hatenablog.com/entry/20170111/1484117632)


## 実行メモ

イメージを適当につくって読み込ませます。
実行したコードはオフィシャルに書いてあるもの。

イメージはPagesのテンプレートに適当にQRコードをはったやつです。

<img width="702" alt="sample.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434453/ad4931f7-53e9-7206-109c-4390d35bc6e3.png">




```python
❯❯❯ python
Python 3.7.3 (default, Apr 14 2019, 02:06:28)
[Clang 10.0.1 (clang-1001.0.46.3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

>>> from pyzbar.pyzbar import decode
>>> from PIL import Image
>>> from pandas import DataFrame
>>> data = DataFrame(decode(Image.open('sample.png')))
>>> data
```

||              data|       type       |      rect   |      polygon    |
|:--|:-----------------|------------------:|------------------:|-------------|
|1| b'http://www.apple.com/jp/'                      |   QRCODE         |(座標)|(座標)|
|2| b'https://googl.com'         |      QRCODE     |(略)|(略)|
|3| b'https://www.amazon.co.jp'                |QRCODE         |(略)|(略)|


値を見やすいようにpandasのDataFrameに入れています。

間違えてつくったQRコードのURLもきちんと読めていますね。
複数OK、座標まちまちOKであることを確認できました。


## 参考

QRコードの商標を持っているデンソーウェーブのサイト 
[QRコードドットコム  FAQ](http://www.qrcode.com/faq.html)
[Swift 5]ImageViewの画像の色を変更するにはRenderingModeを変更しよう

ものすごく簡単なことですが、いつもつい忘れてしまうので…

通常、デフォルトではUIImageのレンダリングモードがオリジナルモードとなっているため、以下のように`tintColor`を指定しても、元の画像の色から変更できない。

```swift
iconView.image = UIImage(named: "imageName")
iconView.tintColor = .gray
```

## 色を変更するならレンダリングモードを変更する必要があります

UIImageを生成した時に`withRenderingMode()`を繋げて指定し、レンダリングモードをテンプレートモードにすればOK！

```swift
iconView.image = UIImage(named: "imageName")?.withRenderingMode(.alwaysTemplate)
iconView.tintColor = .gray
```

`alwaysTemplate`は、Assetsの画像Inspectorで指定することもできます。

参考：https://stackoverflow.com/questions/12872680/changing-uiimage-color
VisualStudio2019で2017と同じ静的解析(コード分析)をしたい

# VS2019の静的解析について
VisualStudio2019で、静的解析のやり方がVS2017と変わっている様子。
2019から、静的解析/FxCopアナライズ/Roslynアナライズ、の3種類になっているようで、この3つのうち「静的解析」がVS2017で行っていたコード分析に当たるもの。ただそれは近く廃止になるっぽい。

下記のように、[分析] > [コード分析の設定] > [ソリューション用]の[コード分析設定]には、VS2019では推奨されてませんという旨のMsgが出てた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/e96088d9-c50d-330a-35b7-1511b1511ca1.png)

VS2017で同じ画面を開いたときは、こんな感じだった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/24ccfbf1-3148-8e34-5182-c4e89947a33e.png)
ここから、ルールセットを選ぶことができていた。

# VS2017の静的解析と同じことがVS2019でもしたい
VisualStudio2019では、2017と同じ静的解析は下記の手順で実施できる。

# 静的解析の実施方法
- プロジェクトを右クリックしてプロパティを開く
- [コード分析]を開く
- [規則セット]を選択する
- [ビルドに対するコード分析の有効化]にチェックを入れる
- 対象のプロジェクトをビルドする
- [エラー一覧]の警告とInformationとして指摘がでてくる→これが実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/e6122743-7060-b25f-c5db-fc62556bfdd4.png)

# 追記21/02/17

下記の赤枠の設定を「ビルド」だけにしていると、一部の指摘(C++の指摘？)が出てくれないので、「ビルド＋intellisense」にしておく必要がありそう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/292ca47d-3eff-4704-478c-b4f3d71f7981.png)


# 参考

https://docs.microsoft.com/en-gb/visualstudio/code-quality/walkthrough-analyzing-managed-code-for-code-defects?view=vs-2019
KSNCTF#29 Double Blindを解く

今回は
http://ksnctf.sweetduet.info/problem/29
を解いていきます。
![screenshot-ksnctf.sweetduet.info-2019.07.16-22_53_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262914/dadcf291-1bec-ecb7-db75-f8a85f8af00f.png)

paper.docxの中身
<img width="546" alt="スクリーンショット 2019-07-16 22.55.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262914/4a1a2fce-1c83-4611-3a57-bc66d30db6e3.png">

ここに答えはなさそう。
論文の内容ggったりしてたけど出てこなかった。

情報の中に何か入ってるかな？って思ったけど
。<img width="404" alt="スクリーンショット 2019-07-16 22.59.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262914/876b4ba7-072c-576c-228e-d8a5c17147b7.png">

そう甘くないみたい。

docxの中に隠れてるのかな。。。と思いdocxの仕組みを調べてみると

https://qiita.com/kaityo256/items/c15889dbb7acb2632c6e
![screenshot-qiita.com-2019.07.16-22_52_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262914/90cfa0e8-05c2-a327-9bc0-3a0216bafa9d.png)

ZIPで中にxmlが入ってるらしい。

unzipしたらファイルがたくさん出てきた<img width="390" alt="スクリーンショット 2019-07-16 23.02.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262914/b3091fe4-a129-3f10-0dd7-978e2dcad428.png">

全てのxmlファイルをFLAGで検索かけてみたけどどれもヒットしなかった...

と思ってたら

document.xmlを見ててFLAGの文字消していったらたまたまFLAGらしきものを発見
<img width="799" alt="スクリーンショット 2019-07-16 23.09.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262914/0cb89dcf-1694-5c07-e18d-3b74f23664f0.png">

![screenshot-ksnctf.sweetduet.info-2019.07.16-23_11_28 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262914/e6fa36cb-5b5d-a62c-d38b-4111918b9781.png)

正解しました・・・
まぐれ正解・・・

34分で解けました。
Laravelのマイグレーション履歴をリセットして、全テーブルを作り直す手順

マイグレーションやロールバックを繰り返しているうちに、テーブルやカラムの構成が混乱してきたので、初めから全テーブルを作り直したい、マイグレーションの履歴も削除したい、というような場面で。

## 手順

1. （必要であれば）以下バックアップをとっておく
    - 既存のテーブル
    - database/migrations配下の各マイグレーションファイル
1. 既存のテーブルを全て削除する
1. database/migrations配下のマイグレーションファイルを全て削除
1. 次のコマンドでバージョン管理用migrationテーブルを作成
    - `php artisan migrate:install`
1. （バックアップ済があれば）migrations/配下にファイルを再び配置
1. migrate実行
    - `php artisan migrate`

以上でテーブルとマイグレーションが初期化される。

上のようなリセット作業を減らすためにも、マイグレーションファイルはロールバックすることを考慮して、upメソッドだけではなく、downメソッドも適切に記述しよう。
AGC 035: A - XOR Circle

### 嘘解法
$i$ 番目のラクダにかぶせる帽子を $b_i$ と書くことにします。$\\{b_1、 b_2、 \cdots、 b_N\\} = \\{a_1、 a_2、 \cdots、 a_N\\}$ です。

$b_i$ が満たす条件を列挙すると次のようになります。

```math
\begin{align}
b_N \oplus b_2 &= b_1、 \\ 
b_1 \oplus b_3 &= b_2、 \\
\vdots &\\
b_{N-1} \oplus b_1 &= b_N
\end{align}
```
よって、すべてをXORすると、 $b_1 \oplus b_2 \oplus \cdots \oplus b_N = b_1 \oplus b_2 \oplus \cdots \oplus b_N \oplus b_1 \oplus b_2 \oplus \cdots \oplus b_N = 0$。
したがって $a_1 \oplus a_2 \oplus \cdots \oplus a_N = 0$。

これは必要条件にすぎず、たとえば、$N=4$ で $\\{a_i\\} = \\{1、 1、 1、 1\\}$ だと条件は満たしますが解はありません。

### 正しい解法
上の連立方程式をもう少し操作してみましょう。

まず、$b_1 \oplus b_3 = b_2$ の両辺に $b_3$ をXORすると、$b_1 = b_2 \oplus b_3$ となります。
これと $b_2 \oplus b_4 = b_3$ から、$b_1 = b_2 \oplus (b_2 \oplus b_4) = b_4$ となることがわかります。
同様にして、$b_2 = b_5 = \cdots$、$b_3 = b_6 = \cdots$ であることもわかります。したがって、$\\{a_i\\}$ に含まれる要素は高々3種類でなければなりません。以下、種類の数で場合分けをします。

#### 3種類のとき
3つの要素を $a_1、 a_2、 a_3$ とおくと、$a_1 \oplus a_2 \oplus a_3 = 0$ でなければなりません。また、$\\{a_i\\}$ に含まれる $a_1、 a_2、 a_3$ の個数は、すべて $N/3$ ずつでなければなりません。このことから、$N$ が3の倍数であることも必要になります。

以上の条件を満たすとき、最初の3頭に $a_1、 a_2、 a_3$ を配り、以後の3頭ずつにも最初に配った順番どおりに分配すればよいので、帽子の割り振り方は6通りあり、問いの答えになります。

#### 2個のとき
2つの要素を $a_1、 a_2$ とおくと、$a_1 \oplus a_2 \oplus a_2 = 0$ または $a_1 \oplus a_1 \oplus a_2 = 0$ でなければなりません。したがって、どちらかは $0$ です。$a_1 = 0$ とすると、$a_1$ の帽子をもらったラクダの両隣には、$a_2$ の帽子をもらったラクダがいなければならないので、$\\{a_i\\}$ には $0$ が $N/3$ 個、$a_2$ が $2N/3$ 個なければなりません。このことから、$N$ が3の倍数であることも必要になります。

以上の条件を満たすとき、帽子の割り振り方は最初の3頭のうち誰が $0$ をもらうかで3通りあり、問いの答えになります。

#### 1個のとき
言うまでもなく $\\{a_i\\}$ はすべて $0$ である必要があります。このときは、$N$ がいくつであっても問いの答えになります。

### 感想
嘘解法で通してすいませんでした。
強い人が「どうしたら全部XORって思いつくのかわかりません」と言っていてちょっと傷つくなど。
意外と簡単なVS Codeの環境移行

Visual Studio Codeの環境移行のやり方を紹介します．
<br>最新のバージョンでは，環境移行がかなり簡単になっています．

# 使用バージョンとOS
 - Visual Studio Code 1.36.1
 - Ubuntu 18.04 LTS(※Windows向けの情報もうろ覚えですが，記載してます．)

# 環境移行に必要なフォルダ
下の2つのフォルダを，古いPCから(USBメモリ等)に退避させ，新しいPCで<b>同じ場所</b>に置いてあげるだけ．

 - ```~/.vscode```( Windows : ```%USERPROFILE%\.vscode``` ) ディレクトリ
   - このディレクトリの中にプラグインのファイルが入ってたりします．
 - ```~/.config/Code/User```( Windows : ```%APPDATA%\Code\User``` ) ディレクトリ
   - このディレクトリの中に基本設定やキーコンフィグが入ってたりします．
Ubuntu 16.04 LTS インストール後の初期セットアップ

何度かUbuntu16.04を入れ直しする機会があったので、インストール直後の最低限お約束事メモ

## とりあえずアップデート
まずはupdate & upgradeで更新

<pre>
sudo apt-get update
sudo apt-get upgrade
</pre>

## 「システムプログラムの問題が見つかりました」のポップアップ停止
![システムプログラムの問題が見つかりました.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207722/cb5329b9-a411-c868-eca5-bcc868719a4b.png)
起動時に出てくるポップアップを出さなくする
以下を実行

<pre>
sudo rm /var/crash/*
sudo sed -i 's/enabled=1/enabled=0/g' /etc/default/apport
</pre>


## Google Chromeインストール＆「ログインのキーリングのロック解除」のポップアップ停止
1. Google Chromeのダウンロード
パッケージはGoogleChromeのサイトから落としてくる
※直接インストールせずにファイルとして保存
[Google Chrome](https://www.google.com/intl/ja/chrome/)  

2. インストール前に以下を実行
<pre>
sudo apt-get install libappindicator1
</pre>
3. パッケージのインストール
<pre>
sudo dpkg -i google-chrome-stable_current_amd64.deb
</pre>
4. 起動
インストール終わったら、Chromeを検索するか、以下を実行して起動
<pre>
google-chrome
</pre>

5. 起動時に出る「ログインのキーリングのロック解除」のポップアップを出さなくする
以下を実行
<pre>
sudo apt install seahorse
</pre>
「パスワードと鍵」を開く(検索で'pa'とか入れると出てくる)
![パスワードと鍵.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207722/d2406c36-3f91-33a9-4f0f-70de617c95d4.png)

「ログイン」の上で右クリック→「パスワードの変更」を選択
![パスワードと鍵-ログイン-パスワード変更.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207722/65494a6e-a8d4-7032-9a08-4fc40c158c75.png)


ログインパスワードを入力
![キーリングログインパスワード入力.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207722/c3ad449a-f362-7e74-c4ad-15ad9f152e5d.png)

新しいパスワードを入力する画面で、何も入力せず空欄のまま進める
![キーリングログインパスワード変更.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207722/b80cdf1b-c8d6-7712-5128-e108a74678b0.png)

空パスワードに対する警告が出ても無視して進める（完了）
![キーリングログインパスワード警告.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207722/6b83fe48-e6f7-6912-e0ad-c5d303428bd1.png)

## sambaインストール
特に書いておくほどでもないけど、とりあえず
<pre>
sudo apt-get install samba
</pre>

## sshインストール
特に書いておくほどでもないけど、とりあえず
<pre>
sudo apt-get install ssh
</pre>

## その他
あとは、その時々で入れたいものを入れて、環境構築を続ける・・・
MacでLaravel5.8導入 + 仮想環境構築

## 前提
下記のページ（公式ではない？）が非常によくできてるので読めばだいたいわかる
https://readouble.com/

環境：Mac
Homebrew, VirtualBox, Vagrant導入済み

## まずはComposerの導入
Homebrewを利用
すぐにバージョン古くなってるのでまずはアップデート確認

```
# ステータスチェック
$ brew doctor
# 問題があれば極力解決しておく

# アップデート
$ brew update

# アップグレード
$ brew upgrade

# エラーが出てなさそうなら、composerのインストール
$ brew install composer

# composerで、Laravelインストーラをダウンロード
$ composer global require laravel/installer
```

## パスを通してプロジェクト作成

laravelコマンドのパスを通す
.bash_profileに下記を追加
`export PATH=$PATH:~/.composer/vendor/bin`

プロジェクトを作成したい場所に移動してnewコマンド実行

```
$ cd ~/myProject
$ laravel new laravelTest
```

これでいったんプロジェクトの作成は完了。

## 仮想環境の設定
Homestead というVagrant仮想環境を使うと非常に都合が良いらしい

```
# Vagrantに、HomesteadのBoxイメージをインストール
$ vagrant box add laravel/homestead

# homeディレクトリにhomesteadのリポジトリをクローン（自分のLaravelの全プロジェクトをホストしておくHomestead Boxを用意するためらしい）
$ git clone https://github.com/laravel/homestead.git ~/Homestead

# 最新のmasterではなく安定版のreleaseブランチに変更
$ cd ~/Homestead
$ git checkout release

# 設定ファイルを作成（Homestead.yaml）
$ bash init.sh
```

### Homestead.yamlの設定
下記以外は特殊な設定がなければ初期設定のままでOK

```Homestead.yaml
# 仮想環境に同期したいローカル環境のディレクトリを記載する
# map: ローカル開発環境側　　to: 仮想環境側
folders:
    - map: ~/myProject/laravelTest
      to: /home/vagrant/laravelTest
```

### ホスト名の解決
hostsファイルに下記を追加する。192.168.10.10は、IPアドレスの初期値
`192.168.10.10  homestead.test`

### Vagrantの起動
Homesteadの設定が一通り終わったので、Vagrantを起動する。

```
# Homesteadディレクトリで
$ vagrant up
```

ブラウザで、`homestead.test`にアクセスして表示されればOK

### 仮想環境へのSSH接続

```
# Homesteadディレクトリで
$ vagrant ssh
```

アクセスが成功し、ホームディレクトリに同期させたかったディレクトリ, ファイルがあればOK
Homesteadディレクトリ以外からもssh接続できるようにするためには下記を.bash_profileに追加する。

```
function homestead() {
    ( cd ~/Homestead && vagrant $* )
}
```

これで他のディレクトリからも
`$ homestead ssh`
でssh接続できるようになる。（他のvagrantコマンドも）



おしまい
export defaultってなんだろう

# 問題
突然ですが、ここにこんなSampleコンポーネントがあります。（この記事はちょっとしたReact要素を含んでいますがReactを知らなくても多分わかります。)

```tsx:sample.tsx
export const Sample: FC<Props> = () => {
    return(<div>sample</div>);
}
```
これは、いかにもこんな感じでimportして使えそうです。

```tsx:sampleContainer.tsx
import { Sample } from './sample.tsx';
import { connect } from 'react-redux';

const mapStateToProps = .... ;　// 割愛

export default connect(mapStateToProps)(Sample);
```
さて、ここでexport defaultされているこの子はいったいどのようにimportしたら他の場所で使えるのでしょうか。

# 答え
答えは以下のようになります。

```tsx:routing.tsx
import SampleContainer from './sampleContainer.tsx';

const participantRoutes: Routes = [
  {
    path: "/activity",
    component: SampleContainer
  }
];
```
ファイル名と対応しているのかな？と一見思うかもしれませんが、これは唯一の回答ではありません。これでもいいのです。

```tsx:routing.tsx
import SC from './sampleContainer.tsx';

const participantRoutes: Routes = [
  {
    path: "/activity",
    component: SC
  }
];
```

と言うか、なんでもいいのです。(Syntax上はですが)
なんででしょうか。

考えてみたらとても自明なことだし納得のいくことなのですが、ReactでReduxするまでこれを意識しなければいけない場面がなかったので全く気づかず、不思議に思っていました。

# 解説
ポイントは**`export default`**です。これは文字通り、そのファイルのデフォルトとして後ろに続くものをexportするよ、という意味になります。
`export default`されたものを使いたい時、importする側は**任意の名前をつけることができます**。それは、これをデフォルトにするよ、と宣言しているからです。
これは自然に理解できると思いますが、デフォルトを複数指定することはできません。なので、１ファイル内にさっきのconnectのような`export default`宣言を複数書くとエラーが出ます。
なるほど、だから名前を好きにつけてもちゃんとconnectが使えたのですね:sunny:

詳しい説明： [MDN Export](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/export)
顔写真に自動でモザイクをかける

```python

# -*- coding: utf-8 -*-
import cv2
import math
import numpy as np
from PIL import Image

def main():
    img_filename = input()
    img = cv2.imread(img_filename)
    img_edit = Image.open(img_filename)
    
    cascade = cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")
    
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    faces  =  cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=1, minSize=(3,3))

    if len(faces) > 0:
 
        for face in faces:
 
            cut_face = img_edit.crop((face[0],
                                      face[1],
                                      face[0]+face[2],
                                      face[1]+face[3]))
 
            cut_face = cut_face.resize((int(face[2]/5), int(face[3]/5)), Image.LINEAR)
 
            cut_face = cut_face.resize(face[2:], Image.LINEAR)
 
            img_edit.paste(cut_face, tuple(face[:2]))

    img_dst = np.asarray(img_edit)
    img_edit.show()
    img_edit.save('result.jpg')

if __name__ == '__main__':
    main()

```
Sprokets::FileNotFound  couldn't find 'spree/backend/all.js'


<img width="966" alt="スクリーンショット 2019-05-27 17.02.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436942/82ea1f19-946a-d924-f7f2-88619817163d.png">

初めて`docker-compose up —build`を行い、ページに飛んだ際にこのエラーに出くわしました。

all.jsがないと言われているから、検索していると、`rails g spree:install`をすると解決するといった記事を見つけたので、以下の方法１のように実行しました。（先に結論から言うと、自分の場合は、この方法でエラーを解決することはできませんでした。）

###方法１（失敗した方法）
`$docker-compose up -d`
で、コンテナを起動し、
`$docker-compose exec potepanec bash`
で、コンテナ内に入り（potepanecの部分は、各自のものに変えてください）、
`$bundle exec rake db:migrate:reset`
`$bundle exec rails g spree:install
`を実行しましたが、エラーは解決する事ができませんでした。

###方法２（成功した方法）
`$docker rm -f $(docker ps -aq) && docker rmi -f $(docker images -q) && docker volume rm -f $(docker volume ls -q)
`
を行い、一度全部削除しました。この時気をつけなければいけないのは、これだとdockerに入っている他のプロジェクトも削除することになります。自分の場合は、扱っているプロジェクトがエラーを出しているものだけだったので、このコードで、一度全部削除しました。

次に、
`rm -f app/tmp/pids/server.pid`
で、pidを削除しました。このpidを削除しないと、同じエラーをはき出すので、dockerを削除した後、pidも削除することをお勧めします。

docker,pidを削除した後、
`docker-compose up --build`
を行ったところ、無事立ち上がりました！
NVIDIAドライバの入ったUbuntu16.04のGUIを復活させる

# Ubuntu16.04 GUI復活までの道のり

## 環境
OS: Ubuntu16.04
CPU: Xeon
GPU: GTX1080Ti✖️2
NVIDIAドライバ: 430

## 結論を先に言うと
NVIDIAドライバをaptで入れるのではなく、nvidia.comからGPUで検索し、.runファイルをダウンロード・インストールする

## あらまし
5月に14.04から16.04アップデートした。
すんなりとアップデートがいったわけではなかったが、カーネルを変更するなどして普通に使っていた。しかし、それからしばらく経ってから何かの拍子でNVIDIAドライバまたはCUDAのバージョンが変わってしまったらしく、`nvidia-smi`が実行できない状態に陥った.

さらに、nvidia-dockerで使いたいcudaに対して、ドライバのバージョンが満たされていない状態だった。そこで、`apt remove nvidia-*`で一度nvidiaドライバを削除したのち`apt install nvidia-430`で再びNVIDIAドライバを入れた。しかしここで、デスクトップ画面が正常に表示されない(画面左上で_が点滅)状況に陥った。ただし、ssh接続ののち`nvidia-smi`は実行されると言う不思議なことがおこった。

ここで、GUIソフトウェアの問題、もしくはcudaのせいかと思い、色々とXorgなどのコンフィグをいじったり、cudaを削除しようとするのだがうまくいかない。

最終的には、NVIDIAドライバを`apt`で入れるのではなく、nvidia.comからGPUで検索し、`.run`ファイルをダウンロード・インストールするとGUIが復帰した。
aptでインストールした時とrunファイルでインストールした時で、`430.**` の**のバージョンが異なっていた。同じ430系でもaptとrunファイルでは異なるバージョンとなるようだ。

## 作業手順

### NVIDIAドライバとCUDAを削除する

```
$ sudo apt-get --purge remove nvidia-*
$ sudo apt-get --purge remove cuda-*
```

### NVIDIAドライバのダウンロード
[NVIDIAのドライバダウンロード](https://www.nvidia.co.jp/Download/index.aspx?lang=jp)から該当するGPUのドライバを検索し、リンクを取得しwgetでダウンロードする

```
$ wget [リンクURL]
例えばこんな感じ
$ wget http://jp.download.nvidia.com/XFree86/Linux-x86_64/430.34/NVIDIA-Linux-x86_64-430.34.run
```

### blacklist-nouveau.confの確認
blacklist-nouveau.confを以下のようにする

```
$ cat /etc/modprobe.d/blacklist-nouveau.conf

blacklist nouveau
options nouveau modeset=0
```

### ドライバのインストール

```
$ chmod +x NVIDIA-Linux-x86_64-430.34.run
$ sudo service lightdm stop
$ sudo service gdm stop
$ sudo ./NVIDIA-Linux-x86_64-430.34.run 
```
なおこの時、`"The distribution-provided pre-install script failed! Are you sure you want to continue?"`のメッセージが出てきたが、インストールはコンティニューした。その後も`Would you like to register the kernel module sources with DKMS? This will allow DKMS to automatically build a new module, if you install a different kernel later.`などいくつかYes or Noを選択する項目があるので、選んでいく。


### リブート

```
$ sudo reboot
```
LeetCode / Implement strStr()

（[ブログ記事](https://mhiro216.hatenablog.com/entry/2019/07/16/222114)からの転載）

[https://leetcode.com/problems/implement-strstr/]

Implement strStr().

Return the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.

Example 1:
Input: haystack = "hello", needle = "ll"
Output: 2

Example 2:
Input: haystack = "aaaaa", needle = "bba"
Output: -1

Clarification:<br>
What should we return when needle is an empty string? This is a great question to ask during an interview.
For the purpose of this problem, we will return 0 when needle is an empty string. This is consistent to C's strstr() and Java's indexOf().

Pythonから入った私は知らなかったのですが、strstr関数というのはCやPHPで使われる「文字列から文字列を検索してその場所のポインタを返してくれる関数」だそうです。このstrstr関数を実装しなさい、という問題です。
そしてまたClarificationがポイントで、マッチングする文字列が空の場合は0を返すように実装する必要があります。

#### 解答・解説

##### 解法1
マッチングする文字列が空の場合に0を返すためにif文を入れたくなりますが、その欲求に争いつつ、できるだけシンプルに処理したコードが以下です。

```python
class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        for i in range(len(haystack) - len(needle)+1):
            if haystack[i:i+len(needle)] == needle:
                return i
        return -1
```

可読性は高いと思いますが、リストのスライスはリストのコピーを生成するため、時間計算量はhstackのサイズをhとしたときに最大で[tex: O(n * h)]に達してしまいます。

#### 解法2（のreference）
KMP法というアルゴリズムがあるようで、このアルゴリズムは一度照合した文字列を再度照合することはしないというアルゴリズムなので、時間計算量は高々[tex: O(n)]に抑えられるようです。
実装はちょっと難解で、余力のあるときにやります。。。ひとまずreferenceだけ示します。

[http://sevendays-study.com/algorithm/ex-day2.html]

ただ、処理が複雑になるため、計算量が解法1を上回るかというと、そうでもないようです。
【VirtualBox】Windows10でゲストOSを固定IPで設定し、かつ、外部ネットワークに接続できるようにする方法

## 要点
注意する点は以下の2点になります。
1. ネットワークアダプタを「NAT」用、「ホストオンリーアダプター」用の2つを作成すること
2. コントロール パネル\ネットワークとインターネット\ネットワーク接続より、「ホストオンリーアダプター」のIPv6設定を無効にすること

## VirtualBox上の設定 (前編)
1. Oracle VM VirtualBoxマネージャー画面から、ファイル(F)＞ホストネットワークマネージャー(H)を押下する。
2. 「作成(C)」ボタンを押下する。
3. 作成されたネットワークアダプタを選択し、「プロパティ(P)」ボタンを押下する。
4. 「アダプター(A)」タブを選択し、IPv4アドレスを任意の値に設定する。今回は、「172.17.100.254」に設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429119/875148d7-5005-a78e-4454-a4c377b203d3.png)

5. 「DHCPサーバー(D)」タブを選択し、以下の設定になっていることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429119/48a32b3e-475f-dd72-7bc5-3b7ce506306f.png)
6. Oracle VM VirtualBoxマネージャー画面から、仮想マシンを1台、任意に選択し、「設定(S)」ボタンを押下する。
7. 「ネットワーク」を設定し、「アダプター1」、「アダプター2」が以下の通りであることを確認し、「OK」ボタンを押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429119/756f1aaa-a0ea-1057-2734-c9c6f4f01a96.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429119/e018f0d3-a29f-5726-f2b4-74a62dc77505.png)

## ホストOS側の設定
1. コントロール パネル\ネットワークとインターネット\ネットワーク接続より、「VirtualBox Host-Only Ethernet Adapter」のネットワークアダプターを選択し、右クリックにて、「プロパティ」を選択する。
2. 「VirtualBox Host-Only Ethernet Adapter」のネットワークアダプターを選択し、右クリックにて、「無効にする(B)」を押下する。
3. 「VirtualBox Host-Only Ethernet Adapter」のネットワークアダプターを選択し、右クリックにて、「有効にする(A)」を押下する。

※この設定を行わないと、仮想マシン起動時に以下のようなエラーが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429119/72530d42-e86e-3c97-3805-f21a3de5c437.png)

## ゲストOS側の設定
1. nmtuiコマンドを実行し、「Please select an option」が表示されると、「Edit a Connection」を選択し、Enterキーを押下する。
2. 表示されているネットワークアダプターを選択し、<Edit...>を押下する。
3. Profile nameをDeviceの()内の文字に変更する。今回だと「enp0s8」に変更する。
4. IPv4 CONGIGURATION を<Manual>に変更し、Addressesを「VirtualBox上の設定 4.」で設定したIPv4のネットワーク体系(今回は172.17.100.1～172.17.100.253の中の172.17.100.1)に変更する。
5. Gatewayは「172.17.100.254」に変更し、<OK>ボタンを押下する。
6. ```nmcli c down enp0s8; nmcli c up enp0s8```を実行する。

## VirtualBox上の設定 (後編)
1. Oracle VM VirtualBoxマネージャー画面から、仮想マシンを1台、任意に選択し、「設定(S)」ボタンを押下する。
2. 「ネットワーク」を設定し、「アダプター1」、「アダプター2」が以下の通りであることを確認し、「OK」ボタンを押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429119/d75d1a3e-6a6e-80b4-9612-3663bc5d5050.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429119/3695b5a3-9384-9145-eff3-741710d85238.png)

## 動作確認
1. ゲストOS側より、```ping 8.8.8.8```を実行し、外部ネットワークに接続できることを確認する。
2. ホストOS側より、TeraTermを実行し、ホスト名を「172.17.100.1」の状態で「OK」ボタンを押下し、固定IPに接続できることを確認する。
46日目、VW で画面のサイズでフォントや画像のサイズを変える


[46日目。Javascriptで配列を作ってまとめて更新、メンテしやすくなりました。](https://qiita.com/robamimim/items/6e7c5c6fd812a2774a83)

続きです。

##画面のサイズで横幅を変える
画面の横幅を基準にする「vw」で画像やフォントの大きさを設定してみました。
ブラウザを伸ばしたり縮めたりすると図と文字がのびたり縮んだりします。おもしろーい！

[CSSのfont\-sizeが%とかemとかremとかvwで指定されてると、ビビっちゃう君と僕を救う2分](https://qiita.com/39_isao/items/e8242901ba1aadb75676)


```test.css

.main {
  width:100vw;
  padding: 1em;
  }

.contents { 
  width: 100vw;
  height:15vw;
  }

.contents img {
  width:12vw;
  height:12vw;
  margin:0em 1vw;
}

.left { 
  float:left;
  margin-right:1vw; 
}

.center{
  float:left;
  width:70vw;
  height:12vw;
  background-size:cover;
  background-image: url(cat.png);
}

.right {
  float:right;
  }

```

##リストの先頭文字をなしに。

```test.css
li {
  list-style: none;
  color:white;
  }
```

##フォントは明朝体にしたい。
[どの環境でも綺麗なゴシック体、明朝体のフォントを指定する](https://gray-code.com/html_css/specify-font-by-css/)

```test.css
font-family: "游明朝", YuMincho, "ヒラギノ明朝 ProN W3", "Hiragino Mincho ProN", "HG明朝E", "ＭＳ Ｐ明朝", "ＭＳ 明朝", serif;   
```

##要素のセルいっぱいに背景画像を表示したい。その上に文字を表示したい。
[トップページ  > CSS3  > background\-size](http://www.htmq.com/css3/background-size.shtml)

```
.center{
  float:left;
  width:70vw;
  height:12vw;
  background-size:cover;
  background-image: url(cat.png);
}
```

##ProgateのHTML & CSS 初級編
復習しながらCSSを組み立てました。
[学習コース HTML & CSS 初級編](https://prog-8.com/lessons/html/study/1)

##完成！
HTML & CSS 初級編とVWだけでできています。
拡大縮小するとずれまくるし、画像は飛んでいくしなかなか大変でした。

###所要時間　５時間
・HTML & CSS 初級編 １時間
・CSS組み立て
　１回目、pxで１時間
　２回目、vwで１時間
　３回目、画面を細長くしたときに要素が崩れるので組み直し　２時間

ここまで１１時間。
かかってるなー！！！
【JavaScript】innerHTM、textContentの違い

#はじめに
今回はinnerHTMLプロパティとtextContentプロパティの違いについて紹介します。
両方ともJavaScriptの要素内のテキストにアクセスできるプロパティです！
私はよくどっちがどっちだかわからなくなるので、ここでまとめておきます！

#両者の違い
###● innerHTML
"HTMLを解釈して出力する"のがinnerHTMLです。

###● textContent
"HTMLを解釈せずにそのまま文字として出力する"のがtextContentです。

以下にコードの例を載せておきます！

```test.html
<p id="p1">ボタンを押して下さい</p>
<input type="button" value="textContent" onclick="clickBtn1()">
<input type="button" value="innerhtml" onclick="clickBtn2()">

<script>
function clickBtn1(){
	const p1 = document.getElementById("p1");

	p1.textContent = "<b>ボタンを押しました</b>";
}
function clickBtn2(){
	const p1 = document.getElementById("p1");

	p1.innerHTML = "<b>ボタンを押しました</b>";
}
</script>
```

上記のコードは、ボタンをクリックすると、innerHTMLとtextContentでそれぞれ文字が出力される記述です。
innerHTMLの方をクリックした場合は　
**ボタンを押しました**　
と、`<b></b>`タグが反映されて太文字で文字が出力されます！

textContentの方をクリックした場合は、HTMLタグが読み込まれないので
`<b>ボタンを押しました</b>`と、タグもそのまま出力されます！

※こちらのコードは以下のサイトから引用させて頂きました！
こちらのサイトでは、それぞれのボタンをクリックした時のデモもあります！是非ご覧ください！
https://itsakura.com/js-textcontent-innerhtml

#さいごに
innerHTMLとtextContentの違いでした！
そもそもどっちがどっちかわからない場合は、innerHTMLの文字の意味を考えると覚えやすいです。
文字そのままで`inner`は**"内なる"**という意味なので、
`innerHTML`は直訳すると**"HTMLを内に入れる"**的な感じになります。
つまり`innerHTML`は**"HTMLタグを読み込むよ"**って解釈できます！
わからなくなったらこれでいきましょう！:relaxed:
Androidアプリ開発入門

Androidアプリ開発の備忘録

##アプリ開発のメリット
- Java、Kotlinの勉強になる
- 自分好みのアプリを作れる
- プロへの道が開ける

##リリース
GooglePlayConsoleからリリースする

**諸注意、作業方法**
パッケージ名がcom.exampleだとリリースできないので注意。
変更する場合はAndroidmanifestからリファクタリング、リネームする。

build.gradle(app)のバージョンを増やしていく。

アイコンのサイズ（解像度）はペイント(Windowsの場合)で変えることができる。

インストール後のアプリ名は、AndroidManifestで決める。

```XML:AndroidManifest.xml
android:label="@string/app_name"
```

##ソースコード管理
Gitの場合とりあえずSourcetree

**クローンのやり方**
保存先のパスは空フォルダにして、名前は空フォルダと同じにする

**ローカルリポジトリ作成**
ターミナルを開いて（右上辺りのボタン）リポジトリにしたいディレクトリでgit init実行
＋ボタンを押してAdd a repositoryで追加

**強制プッシュ**

```
$ git push -f origin master  　強制(force)的にプッシュする
```

##AndroidStudio
Andoid Studioをバージョンアップしたら端末が認識しなくなる場合は、端末のUSBデバッグの許可の取り消しを行う。

##AndroidStudioショートカット
ctrl + shift + enter
コロン自動補完

##ライブラリについて
ライブラリの使用時はバージョンに注意。バージョンがあっていないとコンパイルエラー、Gradleのエラーになる場合がある。
SDKのバージョンが合っていないといけない？

例）
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
implementation 'com.android.support:design:28.0.0'
これはセットで使う。

##ソースコード(Android)
**LayoutInflater (inflater)**
リソース（xml）を読み込んでビューにする。

**Tablayout**
pageTitleはfinal

##ソースコード(Java)
**public**
指定したクラス名とファイル名は同一にする。

**ArrayList**
サイズ関係ない？

**キャスト**
doubleをintに代入すると、小数点以下が切り捨てられる。

**this.s**
インスタンス変数s

**継承**
サブクラスが生成される際、子クラスのコンストラクタが実行される前に、親クラスのコンストラクタが実行される。

**Objectクラス**
toStringメソッド、getClassメソッドの暗黙の親クラス。

**抽象クラス**
変数（配列OK）で保持して、サブクラスのインスタンスを生成して代入すると便利

**抽象メソッド**
呼び出しの抽象化のため？

**インターフェース**
インスタンスをインターフェースでキャストして代入することで、インターフェースに記述してある機能しか使えなくする。

インターフェースでもstaticならばそのまま使える。

implementsして、そのクラスの中に実装する書き方と、newして（いるように見えるが実際は無名クラス）、無名クラスで実装する書き方がある。

**throws**
throwsはメソッドとセットで使い、例外発生時はメソッドの呼び出しもとに戻り、catchする。

独自例外処理クラスを作って、throw（例外発生の目印）を使ってcatchする。

**equals**
equalsは同一の参照かを比較してbooleanを返す。

**protected**
サブクラスのインスタンスからアクセスできる。（スーパークラスのインスタンスからはアクセスできない）

**無名クラス**
メインルーチンの中に定義されているため、上から順番の処理にならない。

**メソッド**
戻り値をまず見ることで、何をする処理かわかる。
例）getViewは最後にビューを返す。
Leetcode #394: Decode String

```swift
    func decodeString(_ s: String) -> String {
        var answer = String()
        var s = Array(s)
        var countStack = [Int]()
        var strStack = [String]()
        
        var i = 0
        while i < s.count {
            if s[i] >= "0" && s[i] <= "9" {
                var count = 0
                while s[i] >= "0" && s[i] <= "9" {
                    count = count * 10 + Int(String(s[i]))!
                    i += 1
                }
                countStack.append(count)
            } else if s[i] == "[" {
                strStack.append(answer)
                answer = ""
                i += 1
            } else if s[i] == "]" {
                let count = countStack.removeLast()
                var str = strStack.removeLast()
                for _ in 0..<count {
                    str += answer
                }
                answer = str
                 i += 1
            } else {
                answer += String(s[i])
                i += 1
            }
        }
        return answer
    }
```
Django 汎用ビュー入門2

##願望
汎用ビューを使って効率良くWEBサイトを作りたい。

要するに楽したい。

##環境
mac
python3.7.3
anaconda
vagrant 
django2.2.1
 
##前回やったこと

TemplateViewを使用して簡単にテンプレートを表示する。

ListViewを使用してデータをリスト形式で表示する。

<br>


##今回やりたいこと

1. 汎用ビューを使って詳細ページの作成

2. 汎用ビューを使ってレコードを作成するページの作成

<br>


###1. 汎用ビューを使って、詳細ページを作る



####viewsで汎用ビューを継承したクラスを作成

DetailViewを継承すると詳細ページを楽に作成出来る。

```viewtest/home/views.py
from django.views import generic
from .models import User

class UserDetailView(generic.DetailView):
    model = User
    # modelを指定

    template_name = 'home/detail.html'
    # テンプレートを指定
```




####urlsに汎用ビューとしてURLと紐づける

```viewtest/home/urls.py

...略^o^

urlpatterns = [
...
    path('users/<int:pk>/', views.UserDetailView.as_view(), name='detail'),
    # usersページに <a href="{% url 'home:detail' user.pk %}"></a>を設置しIDから情報を取得。
]

```



####今回表示させる適当な詳細ページ


```viewtest/home/templates/home/detail.html

{% extends 'home/base.html' %}

{% block content %}
<h1>{{ object.username }}</h1>
<!-- object.フィールド名 でデータを受け取る !-->

<p>SEX : {{ object.sex }}</p>
<p>AGE : {{ object.age }}</p>

{% endblock %}
```

前回作ったusers.htmlに aタグを挿入〜

```viewtest/home/templates/home/users.html
...略＾ー＾

<ul>
    {% for user in object_list %}
        <li><p><a href="{% url 'home:detail' user.pk %}">{{ user.username }}</a> - {{ user.sex }} ({{ user.age }})</p></li>
    {% empty %}
        <li><p>No Users yet</p></li>
    {% endfor %}
</ul>

...略＾w＾

```

これで簡単な詳細ページはOK。
これもまた既存メソッドをオーバーライドすれば色々出来るらしい。

<br>



###2. 汎用ビューを使ってレコード登録するページの作成




####viewsで継承

CreateViewを継承するとフォーム関連を楽に作れる。

```viewtest/home/views.py
from .models import User
from django.views import generic
from django.urls import reverse_razy

...略^u^

class UserCreateView(generic.CreateView):
    model = User
    # modelを指定

    fields = '__all__'
    # createviewは使用するfieldsを指定する必要がある。
    # この場合はmodelsで定義した、username, sex, ageのフォームが作られる。
    # 指定したい場合はリストとかでフィールド名指定

    template_name = 'home/create.html'

    success_url = reverse_razy('home:users')
    # 成功した時飛ばすURLを指定する。reverse_razyはクラス内でurls.pyを参照するんだっけか。
    
```

また、
CreateViewには、`form_valid()` `form_invalid()` といったメソッドが用意されていて、バリデーションの成功、失敗によって動作を実装出来る。




####urlsに汎用ビューとしてURLと紐づける

```viewtest/home/urls.py

...略^o^

urlpatterns = [
...
    path('create/', views.UserCreateView.as_view(), name='create'),
]

```

####今回表示させる適当な入力ページ

```viewtest/home/templates/home/create.html

{% extends 'home/base.html' %}

{% block content %}

<form action="" method="post">
{% csrf_token %}
    {{ form.as_p}}
    <!-- {{ form }} でもいけるけど、as_pにすると1個1個にpタグ付けて出力してくれるみたい !-->

    <input type="submit" value="createuser">
</form>

{% endblock %}
```

こりゃ楽だ〜

<br>




#結果

汎用ビューに興奮しすぎて眠れない


続く

<br>
Debianのdockerイメージでmysql-clientが無くてハマった人へ

# 結論
`mysql-client`パッケージじゃなくて`default-mysql-client`パッケージを使いましょう

## 経緯
Debian10 "buster"では`mysql-client`パッケージは存在しないため、ベースイメージにDebian10を使っているとDockerイメージでビルドなどしているとコケたりする。Debian9までは`mysql-transition`ソースパッケージが`mysql-client`バイナリパッケージを提供していたが、名前の通り「transition」なので新しいリリースでは落としたものと思われる。

## どうするのが良かったのか？
Debian9の時点で`default-mysql-client`パッケージを使うようにしておけばいちばん良かったし、Debian10がリリース前のフリーズ期間（半年ある）で洗い出しとけば良かった。

## 何が変わるの？
`mysql-client`パッケージも`default-mysql-client`パッケージも、結局は`mariadb-client`パッケージへの依存→最終的に`mariadb-client-10.3`を引っ張るので何も変わらないですね。
【iOS, Swift】（備忘録）コーディング規約の大事なとこだけ

Swiftのコーディング規約についていろいろ資料を見る時間があったので、規約で忘れがち、重要度が高そうなものを抜粋してまとめてみました。

（※ 個人差ありです）

基本的なもの、具体例は「参考」にあるものが詳しいです。（エウレカのものが分かりやすいと思います。）

## 目的

- プログラマー自身のエラーを減らして、さらにエラーを見つけやすくする
- コードの可読性と明快さを向上させる（他の人がコードをレビューもしくは書き換えると仮定して）
  => 冗長さがなく、誤解の可能性を少なくする

## 規約

- フォーマット
  - 半角スペース4つ分（Text Editingで設定する）。
- 命名
  - 出来る限り省略された名前を付けない。
  - 副作用がない場合は、名詞を使用する。
  - 副作用がある場合は、動詞を使用する
- 依存関係
    - 必要最低限のものだけを`import`する。（`UIKit`をインポートする必要がある場合は、`Foundation`をインポートしない。）
        - `import`文はOS固有のフレームワークと外部フレームワークとの間に空行を1行入れて、アルファベット順に並べる。
- 宣言の順序
  - `class`、`struct`、`enum`、`extension`、`protocol`などの全ての宣言は
    `// MARK: - <宣言の名前>`を付ける。
- アクセス修飾子
  - privateとして宣言することをデフォルトとして、必要なときだけinternalまたはpublicとして外部に公開する。
- 型
  - できる限り常に`var`ではなく`let`を使う。

- シンタックスシュガーを使用し短く書く。
  - 必要な場合を除いて、変数やプロパティの型は宣言文の左側か右側のいずれか片側から推測できるようにする。
  - Forced Unwrappingは避ける

- コメント
  - コメントは「なぜ？」という問いに答えるものであり、それ以外のことはコード自体が説明すべきである。
- Collections / SequenceTypes
  - `isEmpty`, `first`, `last`を使用する（indexを使用しなくても良い場合は使用しない）
  - `count`を使用する箇所は`indices`を検討する
        - → [Off-by-oneエラー](https://ja.wikipedia.org/wiki/Off-by-oneエラー)を回避できる
- Self
  - selfは省略する
  - クロージャ内では`[weak self]`、`guard let`節を用いて循環参照のケアをする。
    また、予期せぬクラッシュをケアする為に`[unowned self]`は使用しない。

## 参考

数字は最終更新日

- [raywenderlich](https://github.com/raywenderlich/swift-style-guide) 2019/04/28
- [Swift API Design Guidelines](https://swift.org/documentation/api-design-guidelines/#naming)
- [エウレカ](https://github.com/eure/swift-style-guide) 2016/08/03
- [クックパッド](https://github.com/cookpad/styleguide/blob/master/swift.ja.md) 2017/04/25
- [リクルートライフスタイル](https://github.com/recruit-lifestyle/swift-style-guide) 2017/07/11
Fortranでプログレスバー

#はじめに

長い計算の途中経過を知りたい場合、プログレスバーが欲しくなります。
端末上でプログレスバーを表示するサブルーチンをFortranで作ってみました。
ASCIIコードを指定して出力することで、([curses](https://ja.wikipedia.org/wiki/Curses)ライブラリなどがなくても)端末上に色々なメッセージを出すことができます。

#サブルーチン
端末の50文字程度を使ってプログレスバーを表示するサブルーチンです。引数の意味や注意点は以下の通り。
 - iparcent 整数型で1〜100までの数
 - uni 書き出す装置番号
 - １行前に戻って行末まで削除し、その後進捗を表示
 - 本ルーチン呼び出しの合間に他の処理で同一装置番号に出力が有る場合、プログレスバーの表示が崩れます。

```fortran
subroutine progressbar(iparcent,uni)
  use iso_fortran_env
  implicit none
  integer,intent(in) :: iparcent
  integer,intent(in) :: uni
  integer :: i
  character(len=1),parameter :: esc=achar(27)
  character(len=1),parameter :: cr=achar(13)
  i=1
  write(uni,'(A)',advance='no') esc//"[1A"//esc//"[0J"
  write(uni,'(A)',advance='no') cr//"|"
  do while(i<iparcent/2)
    write(uni,'(A,I3)',advance='no') "="
    i=i+1
  end do
  select case(mod(i,3))
  case(0)
    write(uni,'(A,I3)',advance='no') "\"
  case(1)
    write(uni,'(A,I3)',advance='no') "/"
  case default
    write(uni,'(A,I3)',advance='no') "."
  end select
  do while(i<100/2)
    write(uni,'(A,I3)',advance='no') " "
    i=i+1
  end do
  write(uni,'(A,I3,A)',advance='yes') "|",iparcent,"%"
end subroutine
```

#テストプログラム

 - sleepはGNU拡張なので、コンパイラによっては使えない場合があります。
 - 何かの処理の合間に、整数で％を指定してコールするとプログレスバーが表示されます。
 - 標準出力に書き出すことが前提で、ファイルに書き出すと読みにくいデータの羅列になります。したがって、出力先はerror_unitとしています。
 - 動作確認はLinuxのターミナルで行いました。

```fortran
program main
  use iso_fortran_env
  implicit none
  integer :: i
  !integer :: tb,te,cr,cm
  do i=1,100
    !call system_clock(tb,cr,cm)
    call sleep(1)
    call progressbar(i,error_unit)
    !call system_clock(te)
  end do
end program
```
#おわりに
数十分程度かかる計算をするとき、こういうルーチンを挟むことで計算時間を見積もり易くなりました。