OmniAICreator/Qiita-1.07M huggingface dataset:
Warning: PATH set to RVM ruby but GEM_HOME and/or GEM_PATH not set, see のエラー文の対処法（AWS Cloud9）

『Railsチュートリアル』学習中に突然現れたエラー文。

なぜエラーになったかも分からず、突然すぎてかなりビックリしたのでメモとして残します。

参考
https://codeday.me/jp/qa/20181222/82065.html
https://qiita.com/mt_ryo/items/c3560153ab71c0c3575e

手順

1、ターミナルで```vi ~/.bashrc```を入力。

2、```~/.bashrc```ファイルに以下の行を追加する。
```export PATH=$PATH':/path/to/add':frowning2:
export GEM_HOME=$HOME/.gem
export GEM_PATH=$HOME/.gem```
※最終行でOK

3、CTRL + C でコマンドモードへ(Type : quit < Enter > to exit vimが表示される)

4、ZZを入力(上書き保存して終了のコマンド)

5、Cloud9を再起動
※右上のRのところをクリックして「Manage EC2 Instance」
「アクション」→「インスタンスの状態」→「再起動」

今回はこれで解決しました。
原因は分からないままなので、時間がある時に調べたいと思います。

初投稿で拙い文章ですが、今後もアウトプットしていきたいなと思っています。
gcc の9.0をインストール

コンパイラは新しい方が気持ちが良いものです。Ubuntu 16.04にバージョン9系のgccをインストールします。対象言語はcとc++です。作業は全てrootで行います。
## リポジトリ

[Toolchain test builds](https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test)のPPAリポジトリを使えるようにします。

```Console
# add-apt-repository ppa:ubuntu-toolchain-r/test
# apt-get update
```

## gcc/g++
以下を実行します。g++を指定しますが、gccも入るので問題ありません。

```Console
# apt-get install g++-9-multilib
```

##デフォルトコンパイラ設定
これまでの作業でgcc-9/g++-9コマンドでバージョン9系のgccが使えますが、-9とか打ちたくないです。 update-alternativesで普段使いのコンパイラを9系にします。30はauto modeでのプライオリティで大きいほど優先されます。私の環境にはgccの5系と7系が既にインストールされ、それぞれプライオリティが10,20なので30を指定しました。

```Console
# update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 30
# update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 30
# update-alternatives --display gcc
gcc - auto mode
  link best version is /usr/bin/gcc-9
  link currently points to /usr/bin/gcc-9
  link gcc is /usr/bin/gcc
/usr/bin/gcc-5 - priority 10
/usr/bin/gcc-7 - priority 20
/usr/bin/gcc-9 - priority 30
# update-alternatives --display g++
g++ - auto mode
  link best version is /usr/bin/g++-9
  link currently points to /usr/bin/g++-9
  link g++ is /usr/bin/g++
/usr/bin/g++-5 - priority 10
/usr/bin/g++-7 - priority 20
/usr/bin/g++-9 - priority 30
```
Django Girls Tutorialを復習する（７）〜テンプレート内の動的データ,Djangoテンプレート〜

注意事項はこちら。
https://qiita.com/K-Kazutaka/items/1a432bda4f723e6757d6
写経用の記事です。

~テンプレート内の動的データ~

```blog/views.py
from django.shortcuts import render
from django.utils import timezone
from .models import Post

def post_list(request):
    posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
    return render(request, 'blog/post_list.html', {'posts': posts})
```

~Djangoテンプレート~

```blog/templates/blog/post_list.html
<html>
<head>
        <title>Django Girls blog</title>
</head>
    <body>
        <div>
            <h1><a href="/">Django Girls Blog</a></h1>
        </div>
        <div>

        {% for post in posts %}
            <div>
                <p>published: {{ post.published_date }}</p>
                <h1><a href="">{{ post.title }}</a></h1>
                <p>{{ post.text|linebreaksbr }}</p>
            </div>
        {% endfor %}           
    </body>
</html>
```
Excelのソートキー指定をGUIなしでできるマクロを書いた

# TL;DR
Excelのソートはキーが多いと面倒なので、GUIのソート設定を使わずにソートできるようなマクロを書いた

# 本文
## サンプル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282159/13cfa7cf-3834-d759-b055-85db8bc4a1b9.png)

## ソート順の設定方法
表のひとつ上の行を、ソート条件として扱う。
サンプルでは、第1キー：項目4、第2キー：項目3、第3キー：項目2(降順)。

## ソート範囲の設定方法
2通りの方法を使えるようにした。

- ソート範囲を選択
  - ヘッダ行も含めたソート範囲を選択。サンプルの画像の状態。
- ソート範囲を任意のセルに記載して、そのセルを選択
  - サンプル画像で言うと、C3セルを選択した状態。

## ソート実行
Alt+F8→sortHelper
親切設計よりも、いつでもどこでも使える汎用性を重視した。
ソート範囲をしくじってたら気づけるように、ソート範囲の最終セル(サンプルではG15)を終了後に選択するようにした

## ソース
https://github.com/kumanobori/VBA_props/blob/master/src/work.xlsm/sortHelper.bas

### 苦労したところ
ソート順を必ずしも1,2,3...の連番じゃなくてもいいようにしたかったので、ソート条件をDictionaryに格納してキーでソートしてCollectionに格納し直すという面倒なことをした。
【Git】先頭に<U+0096>がついたブランチ

あなた、ブランチ切るときにブラウザから貼り付けましたね？
（私は綴りに自信がなくて翻訳しました）

ターミナルでは`$`でCのエスケープシーケンスが使えるようなので

```terminal
$ git branch -D $'\x96'
```

で消すことができます
php-master-changes 2019-07-04

この日はエンジンの最適化、Azure Pipelines の設定修正、preloading の改善、pcre のデストラクタの処理修正、ドキュメントの修正があった！

# 2019-07-04
## dstogov: Better optimization in RELEASE build. ZEND_ASSERT(s) prevented optimization
- https://github.com/php/php-src/commit/09041151de1543b69e74a6a9637455b463700a24
- [7.4~]
- ZEND_ASSERT はリリースビルドでは ZEND_ASSUME となりコンパイラへのヒントとなるが、これが悪さして最適化が妨げられていたのを修正

## nikic: Fix ZTS flag on master
- https://github.com/php/php-src/commit/c581b2f5b0628c827a6c88434a17035c8eff71ab
- Azure Pipelines の設定で、master での ZTS のフラグが --enable-maintainer-zts のままだったのを --enable-zts へ修正

## nikic: Set PROPERTY_TYPES_RESOLVED flag for internal classes
- https://github.com/php/php-src/commit/1fea887cc00ea01fd34bc17860c1d41370f23e53
- [7.4~]
- 内部クラスで PROPERTY_TYPES_RESOLVED をセットするよう修正

## nikic: Preloading: Prevent autoloading while resolving constants
- https://github.com/php/php-src/commit/df243f19be8509f36c9a79a2f601bbaeb37762ae
- [7.4~]
- ext/opcache で、preloading 時の定数解決でオートロードが走らないよう修正

## dstogov: Split destructor
- https://github.com/php/php-src/commit/e3d35b64343e0619823bfa2fe104291a00ea7954
- [7.4~]
- ext/pcre で、デストラクタの処理を修正

## nikic: Preloading: Also handle trait methods outside main script
- https://github.com/php/php-src/commit/4a2646cf45982bc46208e0ec17b4e23f323b1dbc
- [7.4~]
- ext/opcache で、preloading 時の最適化処理で全 preload 済スクリプトの trait を処理するようにはなっていなかったのを修正

## nikic: Preloading: Relax known type restrictions
- https://github.com/php/php-src/commit/b250f89b92541e7c60310152cda6a50f0fa30225
- [7.4~]
- ext/opcache で、preloading のリンク条件の緩和
- リンク処理で共変チェックのため各メソッドの全ての引数型 / 返り値型が既知かをチェックし、未知のものがあればそのクラスをリンクしないようにする処理があった
- オーバーライドがなければ未知でも問題ないことになった

## villfa: Fix typo in NEWS [skip ci]
- https://github.com/php/php-src/commit/cb1237a3ede42464b9e938fac9faebdb650047d8
- [7.3~]
- NEWS の typo を修正

## cmb69: [ci skip] Remove NEWS entry
- https://github.com/php/php-src/commit/807c755670d698ec1b5d6b152ee99eba58c5467b
- [7.3~]
- NEWS に不要なエントリが入っていたのを削除

## dstogov: Introduce and use ZEND_VM_INLINE_HANDLER() to avoid ZEND_RETURN exception
- https://github.com/php/php-src/commit/925fd0fe6f11d164c888fefe5e267f700fd22263
- [7.4~]
- オペコードハンドラ種別に ZEND_VM_INLINE_HANDLER を導入

## dstogov: Improve zend_binary_assign_op helpers.
- https://github.com/php/php-src/commit/ef05eab432625dd6a2e62055ea7723d64bed593e
- [7.4~]
- 複合代入演算のオペコードハンドラの実装改善
MNCTF2019 情報漏洩I

#問題

http://mnctf.info/mnctf2019/tasks.php

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/33fc833b-ee5d-157c-6feb-6b086c8e373a.png)

#解いてみた

ファイルをダウンロードしてZIPを解凍するとbatファイルが入ってました。
サクラエディタで開いてみると確かに難読化されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/f2594c2b-1c2e-c520-2ffd-82303e156854.png)

さっぱり意味がわかりません。
%といえばURLエンコードかとも思いましたが、あれは%XXという形なので違います。

ファイル全体が難読化されている場合、どうやって実行されるんでしょう？

```
開始処理
↓
難読化部分をデコードする処理
↓
難読化部分の実行
↓
終了処理
```

のようなイメージを持っていましたが、これは全部が難読化されていて、実行されたときにいつデコードされるんでしょう。
デコード不要でそのまま実行できるということですかね。

batファイルってあんまり詳しくありませんが、2つ疑問に思ったことがありまして、1つ目は最初に

```
@echo off
```

って書きますよね。必須じゃないけど。というのと

```
%aaa%
```

みたいにすると変数の意味になりますよね。ということは変数ありまくりということになるんですが。
その前に変数の定義がないのにいきなり指定するとどうなるんだろうか。

というのを思いながら問題を見てると2行目の文字を飛び飛びで読むと@echo offになってる！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/b7d5c9b2-09e7-9d6b-8ff1-bf8047cd9f65.png)

それぞれの文字に変数が入ってるってことですかね。
ちょっと試してみます。

```
set aaa=00000
set bbb=11111

echo %aaa% %bbb%
```

これを実行すると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/a7eb12b4-0d31-aef0-01cf-3cf78e247808.png)

予想通りの展開です。

```
set aaa=00000
set bbb=11111

echo %aaa%aiueo%bbb%
```

これはどうでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/8fdd800b-27b5-e416-27a7-ba5a17dfa81e.png)

これも予想通りですね。定義していない変数を指定してみます。

```
set aaa=00000
set bbb=11111

echo %ccc%aiueo%bbb%
```

結果は

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/80bc362a-dc39-92a1-a340-80b03b73c8ef.png)

定義されていない変数はただ単に無視されるだけでエラーが出たりはしないようです。
例えば

```
echo 00000000
```

の各文字の間に%a%を入れると実行できるんでしょうか。

```
%a%e%a%c%a%h%a%o%a% %a%0%a%0%a%0%a%0%a%0%a%0%a%0%a%0%a%
```

これです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/eb8f09e9-d4aa-85c7-1a31-c042ea9857eb.png)

んーちょっと驚きですが、定義されていない変数%a%は無視されて元のecho 00000000が実行されました。
ということは難読化されているものも変数を空にすればよさそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/9ee24e34-1890-33db-e958-9e591b9a7581.png)

3行目にコメントでツール名が書かれていたのでこれが答えになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/b3021495-58e8-a3db-2dbb-41763b56752c.png)
線形回帰(Linear Regression)

## はじめに

これは筆者の勉強まとめページですので、指摘しまくってい頂けると幸いです

## BackPropagationを用いた線形回帰

今回はBack Propagationを用いた線形回帰をまとめます

Back Propagationとは、確立的勾配降下法の原理を用いた、パラメータ学習アルゴリズムです
もっとざっくり言うと、関数の極小値求めるものです(また今度まとめよっと)

$$ y = x・w + b $$

今回はwとbを学習してデータにフィットしたパラメータを得る操作をします

損失関数は今回二乗和誤差を採用しています

$$ loss = \frac{1}{n}\ \sum^{n}_{k=1}\ (y_k - t)^{2}  $$

以下コード

```python

import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
from sklearn import datasets

sess = tf.Session()

iris = datasets.load_iris()
x_vals = np.array([x[3] for x in iris.data])
y_vals = np.array([y[0] for y in iris.data])

learning_rate = 0.05
batch_size = 25

x_data = tf.placeholder(shape = [None, 1], dtype = tf.float32)
y_target = tf.placeholder(shape = [None, 1], dtype = tf.float32)

A = tf.Variable(tf.random_normal(shape = [1, 1]))
b = tf.Variable(tf.random_normal(shape = [1, 1]))

model_output = tf.add(tf.matmul(x_data, A), b)

loss = tf.reduce_mean(tf.square(y_target - model_output))

init = tf.global_variables_initializer()
sess.run(init)

optimizer = tf.train.GradientDescentOptimizer(learning_rate)
train = optimizer.minimize(loss)

loss_vec = []

for i in range(100):
    
    rand_index = np.random.choice(len(x_vals), size = batch_size)
    rand_x = np.transpose([x_vals[rand_index]])
    rand_y = np.transpose([y_vals[rand_index]])
    
    sess.run(train, feed_dict = {x_data: rand_x, y_target: rand_y})
    temp_loss = sess.run(loss, feed_dict = {x_data: rand_x, y_target: rand_y})
    
    loss_vec.append(temp_loss)
    
    if (i + 1) % 25 == 0:
        
        print("Step #" + str(i + 1) + " A = " + str(sess.run(A)) + " b = " + str(sess.run(b)))
        print("Loss = " + str(temp_loss))

[slope] = sess.run(A)
[y_intercept] = sess.run(b)

best_fit = []

for i in x_vals:
    
    best_fit.append(slope * i + y_intercept)

plt.plot(x_vals, y_vals, "o", label = "Data points")
plt.plot(x_vals, best_fit, "r-", label = "Best fit line", linewidth = 3)
plt.legend(loc = "upper left")
plt.title("Sepal Lentgth, Pedal Widh")
plt.xlabel("Pedal Width")
plt.ylabel("Sepal Length")
plt.show()

plt.plot(loss_vec, "k-")
plt.title("L2 Loss per Generation")
plt.xlabel("Generation")
plt.ylabel("L2 Loss")
plt.show()
```

![Unknown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257254/d0866a13-116d-916b-7f64-833fa4082331.png)

人によって得られる直線は違うと思われますが、大体こんな感じの直線が得られるかと思います

Loss値が減少方向に向かっていればうまく学習が進んでいる証拠です

![Unknown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257254/04266163-2a4b-a2f4-bae7-78595572e53d.png)
行列分解法(Matrix Decomposition Method)

## はじめに

これは筆者の勉強まとめページですので、指摘しまくってい頂けると幸いです

## 行列分解法

https://qiita.com/raso0527/items/563ed4bb6ae7f6125665

をベースに行列方程式を解く方法が行列分解法と呼ばれるものである。
今回はコレスキー分解と呼ばれる行列を用いて線形回帰を解く。
コレスキー分解についてはWikiを参照

https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%AC%E3%82%B9%E3%82%AD%E3%83%BC%E5%88%86%E8%A7%A3

コレスキー分解を施すと行列Aが以下のような形で表すことができる

$$ A = L・L^{'}$$

$$ L・L^{'}・x = b $$

$$ L・y = b $$

$$ L^{'}・x = y $$

この行列方程式を解いていくと解を算出できる
コレスキー分解を行うと、計算効率がよくなるため、逆行列法を用いるよりも良いとされているアルゴリズムである

```python
# コレスキー分解

tA_A = tf.matmul(tf.transpose(A_tensor), A_tensor)
L = tf.cholesky(tA_A)

tA_b = tf.matmul(tf.transpose(A_tensor), b)
sol1 = tf.matrix_solve(L, tA_b)

sol2 = tf.matrix_solve(tf.transpose(L), sol1)
```

行列分解法の記事の演算をちょっと置き換えるだけ
TensorFlow便利だなあ(棒)
【JAVA】Project Euler、Q8で詰まったのでメモ

# Project Eulerをjavaで解いてみたところQ8で詰まったのでメモ。


```java:Q8.java

public class Q8 {
  public static void main(String[] args) {
    final String STRING = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";
    final int NUM =13;

    //文字列の長さ確認用
    //System.out.println(STRING.length());

    int partial_product;
    int largest_product = 1;
    int position = 1;
    String digits=null;

    for(int i=0;i<=STRING.length()-NUM;i++){
    	partial_product = 1;
    	String partial_string = STRING.substring(i,i+NUM);
    	for(int t=0;t<partial_string.length	();t++){
    		partial_product *= Integer.parseInt(partial_string.substring(t,t+1));
    	}
    	if(partial_product>largest_product){
    		largest_product=partial_product;
    		digits=partial_string;
    		position=i;
    	}
    }
    System.out.println(position);
    System.out.println(digits);
    System.out.println(largest_product);
  }
}
```
悩んでいるところ

・アルゴリズムはこれで合っているはずなんだけど、なぜか答えが違う。
・最大値更新のためのif文の条件節が、上記と下記で結果が異なる。


```java
if(partial_product-largest_product>0)
```

~~解決したら追記します。~~

 【以下追記】
コメントに下さった通りで、int型だと型の最大値を超えてしまっていたことが原因でした。long型を使うことで解決しました。
ありがとうございました！
RSpecでChromedriverを使ってテストする際に「This version of ChromeDriver only supports Chrome version」と怒られた時の対処法


# 概要
RSpec実行時で下記のエラーが発生した時の対処法を記載する。

```Terminal
Selenium::WebDriver::Error::SessionNotCreatedError:
session not created: This version of ChromeDriver only supports Chrome version 74
(Driver info: chromedriver=74.0.3729.6 )
```

本エラーは、ChromeブラウザのバージョンとChromedriverのバージョンがあっていない場合に発生する。
Chromeブラウザのバージョンに合わせて、Chromedriverのバージョンを変えてあげればエラーを解消できる。


[2019/07/07 追記]
ブラウザとドライバのバージョンを揃える方法は、下記の２つがある。
1. 適切なバージョンのドライバをWebサイトから自分でダウンロードして配置する
2. ブラウザとドライバのバージョンを同期してくれるGem(webdrivers)を使って動悸する

本記事では、1の自分でwebサイトからドライバをダウンロードする方法を紹介する。
2のGemを使ったやり方は、下記の記事が参考になる。
https://qiita.com/jnchito/items/f9c3be449fd164176efa

特別な理由がない限り２を使うことを推奨する。簡単だし確実なので。

## Chromeのバージョンを確認
Chromeを起動して[メニュー]→[ヘルプ]→[Google Chromeについて]でバージョンを確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178845/c5763f2a-4bb5-f9fa-6650-e46fb119406a.png)

## 適切なバージョンのChromeDriverを入手
下記のURLからダウンロードページにアクセスできる。

```URL
https://chromedriver.storage.googleapis.com/index.html?path=[ほしいバージョン]
```

今回欲しいのは「70.0.3538」なので、下記のURLを指定すればOK。

```URL
https://chromedriver.storage.googleapis.com/index.html?path=70.0.3538
```

ダウンロードリンクが表示されるので、自分のプラットホームにあわせたリンクを選択してChromedriverをダウンロードする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178845/b07afdf7-329e-a65a-30e9-611d2f88cdef.png)

## Chromedriverを入れ替え
上記で取得したChromedriverでローカルPCのChromedriverを置き換える。
ローカルPCにあるChromedriverがどこにあるかは「which」コマンドで確認できる。

```Terminal
$ which chromedriver
```

Chromedriverを置き換えたら、以下のコマンドで入れ替わったことを確認する。
バージョンが70.0.3538になってればOK。

```Terminal
$ chromedriver -v
```

## 再度RSpecを実行
下記のコマンドでRSpecを実行。
エラーが出無くなればOK。

```Terminal
$ rspec
```

## 参考文献
- https://qiita.com/ktrkmk/items/948da8b4c6e9e2afaddc

以上です
Webサイトが表示されるまで〜簡易まとめ〜

ブラウザでWebサイトが表示されるまでを簡単にまとめてみた。
今回は自分の忘備録用です。

#### 1. デスクトップアプリケーションとWebアプリケーションの比較  
<!-- デスクトップアプリケーションとWebアプリケーションの違い-->
<table>
    <tr>
        <td></td>
        <td>デスクトップ</td>
        <td>Web</td>
    </tr>
    <tr>
        <td>処理の主体</td>
        <td>手元のPC</td>
        <td>サーバ（WEBサーバー）</td>
    </tr>
    <tr>
        <td>画面の表示</td>
        <td>OS上で表示</td>
        <td>Webブラウザ上で表示</td>
    </tr>
    <tr>
        <td>インストール</td>
        <td>必要</td>
        <td>不要</td>
    </tr>
</table>  

- デスクトップアプリケーションは処理の主体が「手元のPC」なのに対し、Webアプリケーションは「Webサーバー」である。


```
Webブラウザ（クライアント）からWEBサーバーにリクエストを送信 ⇆ 
WEBサーバからレスポンスを返却、ブラウザがレスポンス結果を表示する。
```

- クライアント（ブラウザ）とWEBサーバーとの通信やりとり

#### 2. Webって何？
- **<u>WWW（World Wide Web：ワールド ワイド ウェブ）</u>**の事で、Webとは、<u>「クモの巣」や「クモの巣状の物」</u>を表す。  
- 世界中のドキュメントが繋がり合う様を、**蜘蛛の巣**に例えてWorld Wide Webとなったらしい。Webの構造は“世界中に蜘蛛の巣のように幅広く張り巡らされたつながり”というイメージ。
- Webとはインターネットを使う利用形態の内、HTTPプロトコルという決まりに沿って通信しHTMLなどのマークアップ言語で作られたドキュメントなどを閲覧することができる技術（相互リンク/HTML上でHyper Linkというリンクによって色々な文章がみれる）
- **インターネットの中の一種**、HTMLなどで作られたドキュメント同士が相互にリンクされていて、自分の欲しい情報を得られる技術

#### 3. HTTPって何？
- Web上でやりとりする**リソース**の表現を、クライアントとサーバー間でやりとりするためのプロトコル（規定、ルール）
- HyperTextTransferProtocol：HTMLだけじゃなく、XMLや静止画![Bad Request]()
、画像、音声、Javascriptプログラム等・・・コンピュータで扱えるデータであれば何でも扱える  

```
クライアント：HTTPリクエスト（HTTPメソッド）　⇆　サーバー：HTTPレスポンス
```

※ リクエストとレスポンスを実際見てみよう！

- Qiitaのサイトが表示される時は、どんなリクエストとレスポンスのやり取りがあるのだろう？？  
  Qiita： https://qiita.com/

```
【General】
Request URL: https://qiita.com/
Request Method: GET
Status Code: 200  (from ServiceWorker)
Referrer Policy: origin

【Response Header】
cache-control: max-age=0, private, must-revalidate
content-encoding: gzip
content-type: text/html; charset=utf-8
date: Sat, 06 Jul 2019 11:19:09 GMT
etag: W/"f9f134ee82174916d41fa583f10ddd76"
referrer-policy: strict-origin-when-cross-origin
server: nginx
status: 200
strict-transport-security: max-age=2592000
x-content-type-options: nosniff
x-download-options: noopen
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
x-request-id: a3a42bb3-a238-4868-8c21-6c0c434fb84d
x-runtime: 0.145939
x-xss-protection: 1; mode=block

【Request Header】
Provisional headers are shown
Referer: https://www.google.com/
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
```


> 参考 「プロになるためのWeb技術入門」
【Ruby】ハッシュについての基本まとめ(要素の追加、削除、変更など)

#はじめに
今回はRubyのハッシュについて基本的な内容をまとめました！
初心者の方向けの記事です。ぜひご参考ください:relaxed:

#ハッシュとは
キーと値をセットで管理するデータのオブジェクトのことを言います。
例えば以下のような感じで保存します。

```test.rb
person = { name: 'たろう', age: 16, country: 'japan' }

```
この例で言うと、キーがnameやage、countryです。
値がたろうや16、japanになります。

#キーと値の取り出し方
上記の例をそのまま使用して説明します。
変数personのハッシュのキーだけ取得したい！と言う場合は以下のようにすると出力できます。

```test.rb

person.keys

# 出力結果==> [:name, :age, :country]
```

全ての値を出力したい場合は

```test.rb
person.values

# 出力結果==> ["たろう", 16, "japan"]
```

#ハッシュ内の特定の要素だけ取り出す
例えば、上記personのnameの値とageの値をそれぞれ取り出したい！と言う場合は以下のようにします。

```test.rb
person[:name]

# 出力結果==> "たろう"

person[:age]

# 出力結果==> 16

```

#ハッシュに要素を追加、変更、削除
###要素の追加
上記personに、新しくfavoriteキーと、その値"漫画"を追加したいとします。
その場合は以下のように書くだけです！

```test.rb
person[:favorite] = "漫画"

person
# 出力結果==> {:name=>"たろう", :age=>16, :country=>"japan", :favorite=>"漫画"}
```

###要素の削除
反対に削除したい場合は、personにdeleteメソッドをつけてあげて、引数でキーを指定します。

```test.rb
person = {:name=>"たろう", :age=>16, :country=>"japan", :favorite=>"漫画"}
person.delete(:favorite)
person
# 出力結果 ==> {:name=>"たろう", :age=>16, :country=>"japan"}
```
###要素の変更
personの名前を、たろうから"じろう"に変更してみます。
要素の追加と同じで

```test.rb
person[:name] = "じろう"
person
# 出力結果==>{:name=>"じろう", :age=>16, :country=>"japan"}
```
これで変更できます！
ただしこの際キー名を間違えてしまうと、謝って新しいオブジェクトが生成されてしまうので気をつけてくださいね！
以下がキーの名前を間違えた際の例です。

```test.rb
person = {:name=>"たろう", :age=>16, :country=>"japan", :favorite=>"漫画"}
person[:mame] = "じろう"
person
# 出力結果 ==> {:name=>"たろう", :age=>16, :country=>"japan", :mame==>"じろう"}
```

#さいごに
ハッシュの基本中の基本をまとめました。
このレベルくらいは参考書やサイトを見なくてもスラスラ書けるようになっていると良いと思います！
最後までご覧頂きありがとうございました:relaxed:
はじめての電子回路15講 入門者のつまづきポイント

# はじめての電子回路15講 入門者のつまづきポイント

> 読書が進みましたら随時、更新致します。気長にお待ち下さい。



### 電子回路の入門者である私自身が分からなかった用語や内容を纏めておきます。私自身の内容理解と、私と同類である入門者の助けになればと思い、纏めます。



## 第1講

- テブナンの定理 (引用：https://physnotes.jp/em/ecir_thev/)

  > 抵抗や直流電源を多数含んだ回路において, 特定の抵抗で生じている電位差やある特定の枝路に流れている電流値を知りたいときに使い勝手のよい定理として, **テブナンの定理**と呼ばれるものがある.
  >
  > テブナンの定理とは, 抵抗素子や直流電源が入り乱れた回路を, 内部抵抗を含んだ直流電圧源に置き換えることが出来るというものである[[1\]](https://physnotes.jp/em/ecir_thev/#footnote-1).
  >
  > ![img](https://physnotes.jp/images/thev_genev2.svg)
  >
  > 回路全体の各枝路に流れる電流を知りたいのであれば, [**キルヒホッフの法則**](https://physnotes.jp/em/kirchhoff-law/)や[**重ね合わせの理**](https://physnotes.jp/em/ecir_sp/)によって回路全体を解析すればよいが, 回路中のある部分の電流だけを知りたい場合にはテブナンの定理のほうが圧倒的に手早く計算することができる.

  - テブナンの定理のなかで**開放**という言葉と**短絡**という言葉が出てくるが、以下が分かりやすい。（引用：https://www.denken3.com/recipe/recipe03/recipe014-3.html）

  - > 開放とは、回路を切ってしまうことを言います。
    > 例えば、下図のような回路で、「![\displaystyle R_2](https://s0.wp.com/latex.php?latex=%5Cdisplaystyle+R_2&bg=ffffff&fg=000000&s=0)を開放する」というのは、![\displaystyle R_2](https://s0.wp.com/latex.php?latex=%5Cdisplaystyle+R_2&bg=ffffff&fg=000000&s=0)を取って回路を切ってしまうことを表します。
    > ![\displaystyle R_2](https://s0.wp.com/latex.php?latex=%5Cdisplaystyle+R_2&bg=ffffff&fg=000000&s=0)を開放すると、閉回路がないため、電流は流れません。
    > このことから、開放すると電流の流れにくさであるインピーダンスが無限大になるという表現をすることもあります。
    > また、開放した後のa-b間の電圧![\displaystyle V_{ab}](https://s0.wp.com/latex.php?latex=%5Cdisplaystyle+V_%7Bab%7D&bg=ffffff&fg=000000&s=0)は電源の![\displaystyle E](https://s0.wp.com/latex.php?latex=%5Cdisplaystyle+E&bg=ffffff&fg=000000&s=0)と同じです。
    >
    > 短絡はショートとも呼ばれ、2点間を抵抗が小さい導体（電線など）で接続することを言います。
    > 例えば、下図のような回路で、「![\displaystyle R_2](https://s0.wp.com/latex.php?latex=%5Cdisplaystyle+R_2&bg=ffffff&fg=000000&s=0)を短絡する」というのは、a-b間を電線で接続してしまうということです。
    >
    > ![img](https://www.denken3.com/wp2/wp-content/uploads/2019/04/014_r2.jpg)
    >
    > 短絡した回路において、下図のように、![\displaystyle R_1](https://s0.wp.com/latex.php?latex=%5Cdisplaystyle+R_1&bg=ffffff&fg=000000&s=0)を流れる電流を![\displaystyle I_1](https://s0.wp.com/latex.php?latex=%5Cdisplaystyle+I_1&bg=ffffff&fg=000000&s=0)とします。
    > この![\displaystyle I_1](https://s0.wp.com/latex.php?latex=%5Cdisplaystyle+I_1&bg=ffffff&fg=000000&s=0)は、点aで2つに分流しようとしますが、片方は電流の流れを妨げる![\displaystyle R_2](https://s0.wp.com/latex.php?latex=%5Cdisplaystyle+R_2&bg=ffffff&fg=000000&s=0)があるのに対し、片方の電線には電流の流れを妨げるものがありません。
    >
    > ![img](https://www.denken3.com/wp2/wp-content/uploads/2019/04/014_r3.jpg)
    >
    > よって、![\displaystyle R_1](https://s0.wp.com/latex.php?latex=%5Cdisplaystyle+R_1&bg=ffffff&fg=000000&s=0)を流れてきた電流![\displaystyle I_1](https://s0.wp.com/latex.php?latex=%5Cdisplaystyle+I_1&bg=ffffff&fg=000000&s=0)は、すべて短絡線のほうへ流れていきます。
    > すると、抵抗![\displaystyle R_2](https://s0.wp.com/latex.php?latex=%5Cdisplaystyle+R_2&bg=ffffff&fg=000000&s=0)はあってもなくても電流の流れに影響しませんので、外してしまっても同じです。

  

- 直流と交流 (引用：https://eleking.net/k21/k21t/k21t-sinewave.html)

  - 詳しくは上記引用元を参照。

  - > - **交流なので、時間がたつにつれて電圧がプラスになったりマイナスになったりする。**
    > - **波形の頂点の値が最大値になる。**
    > - **最大値を √22 でわった値が実効値になる。**



- インピーダンス

  - 抵抗のようなもの。各素子中にある電力の流れ難さを表す。

  - インピーダンスは複素数で表される。

  - 位相については→を参照。（引用：https://eleking.net/k21/k21t/k21t-phase.html）
Javascriptの分割代入

配列の分割代入

```js

let data = [10, 20, 30, 40, 50];
let [x0, x1, x2, x3, x4] = data

console.log(x0);
console.log(x1);
console.log(x2);
console.log(x3);
console.log(x4);
```


```shell:実行結果
10
20
30
40
50
```


オブジェクトの分割代入

```js
let car = {manufacturer: "TOYOTA", color: "white", price: 2500000};
let {color, model, price} = car

console.log("color: " + color);
console.log("model: " + model);
console.log("price: " + price);
```

```shell:実行結果
color: white
model: undefined
price: 2500000
```
クライアント側におけるSSHのパスワード認証と公開鍵認証の設定

## サーバー側で有効になっている認証方法を確認する方法
下記の例だと、publickey認証とpassword認証が有効になっている事がわかる。

```
$ ssh -v IPADDR
    ~省略~
debug1: Authentications that can continue: publickey,password
    ~省略~
```

## password認証
有効なユーザー、パスワードを指定して認証を行う方法

```
$ ssh USER@IPADDR
USER@IPADDR's password:         <---パスワードを入力する
```

**password認証を無効にする方法**
password認証はサーバー、クライアント共にデフォルトで有効になっている。
password認証を無効にするにはコンフィグファイルに、次の行を追加すれば良い。

```
PasswordAuthentication no
```

## publickey認証

1. 公開鍵と秘密鍵のペアを作成する

```
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX user@user
The key's randomart image is:
```
tオプションで暗号の種類を選択できる。
特に指定しない場合はRSAが選択される。

※OpenSSH7.0よりdsaの使用はデフォルトで無効になっている。http://www.openssh.com/txt/release-7.0

2. 公開鍵をリモートホストへデプロイする。

```
$ ssh-copy-id -i ~/.ssh/id_rsa.pub USER@IPADDR
```
iオプションで1の手順で作成した公開鍵を指定する。

# sshクライアントの挙動をデフォルトから変更する
sshクライアントの挙動をデフォルトから変更するには「コマンドオプションを指定する」あるいは「コンフィグファイルをカスタマイズ」します。

## sshクライアントにおける設定の読み込み順序

1. コマンドラインで指定した設定
2. ~/.ssh/config
3. /etc/ssh/ssh_config

設定項目毎に最初に読み込まれた設定が反映されるという事になっているため、
"1. コマンドラインで指定した設定"が最も優先され、"3. /etc/ssh/ssh_config"が最も優先度が低い。
Windows10にWSLを入れてUbuntu上でベンチマークを走らせる

[YAMADABenchmarkSuite](https://qiita.com/telmin_orca/items/2d30323a7c96db929ecf)をWindows10から動かす方法。

まず、Windows10に備わったWSLを使えるようにしてUbuntuパッケージを導入する下準備をする。
[Windows 10でLinuxを使う](https://qiita.com/whim0321/items/093fd3bb2dd287a72fba)を参考に
管理者権限で起動したコンソールからPowerShellを使って
```PS C:\Windows\System32> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux```
そして、再起動。
[Microsoft StoreからUbuntuを](https://www.microsoft.com/ja-jp/p/ubuntu/9nblggh4msv6)インストールする。
ほとんど何も入ってないので、開発環境は自分でインストールする必要がある。
UbuntuはDebian系のパッケージ管理を採用しているのでaptitudeを入れておく。
sudo を使って管理者権限を得て、コンソールからアプリをインストール。

```# apt-get install aptitude```

```# aptitude ```
操作は、u で最新のデータに更新、　Uでアップグレード準備、Gを２回叩いてアップグレード実行。終わったらENTERキーを叩いてメニューに戻り、
qで終了指示、本当にやっていいかYes･Noを聞かれるのでカーソルキーでYesを選んでENTERを叩くと終了。

カレントディレクトリに作業用の src のディレクトリを掘り、
```$ cd ```
```$ mkdir src ```
```$ cd src```
gitのファイルを格納するディレクトリも堀り、
```$ mkdir git ```
```$ cd git ```
gitをセットアップ。
```$ git init ```
そして、githubからYAMADABenchmarkSuiteをダウンロードしてクローンを作る。
```$ git clone https://github.com/telmin/YAMADABenchmarkSuite.git```
使用言語はC++なのでg++のコンパイラとmakeが必要。
```# apt-get install g++ make ```
加えて、HPC向けの演算ライブラリがそれぞれのベンチマークに必要。
fftは fftw3-dev ライブラリが
gemmには libblas-dev libopenblas-dev ライブラリが必要。
```# apt-get install fftw3-dev libblas-dev libopenblas-dev ```
準備ができたら、それぞれのディレクトリに降りて make するとベンチマーク用の実行形式が生成される。
```$ cd YAMADABenchmarkSuite ```
```$ cd fft ```
```$ make ```
```$ ls ```
```Makefile  fftw  fftw.cpp ```
```$ ./fftw ```

```$ cd .. ```
```$ cd gemm ```
```$ make ```
```$ ls ```
```Makefile   dgemm.hpp  flops_calc.hpp main.cpp sgemm.cpp  sgemm.o dgemm.cpp  dgemm.o    gemms           main.o    sgemm.hpp  timer.hpp ```
```$ ./gemms ```

```$ cd .. ```
```$ cd stream ```
```$ make ```
```$ ls ```
```HISTORY.txt  LICENSE.txt  Makefile  READ.ME  parsearg.hpp  stream.cpp  stream_cxx.out ```

``` $ for i in 1 2 4 8 16 32 64; do echo $i ; ./stream_cxx.out --numtimes 50 --arraysize \$i\M ; done ```

```$ cd .. ```

追記：2024/07/31
Debian 12.6(for Raspberry Pi 64bit)においては fftw3-dev は　libfftw3-dev といったパッケージ名に変更された模様。
kotlinでExcelからデータを読み込む


kotlinからExcelを操作する機会があったのでメモ。
コード全文は[git](https://github.com/ato1234/PoiSample)にあげてます。

# 環境
- JDK: 1.8
- kotlin: 1.3

# 準備
[Apache POI](https://poi.apache.org/)を利用します。
build.gradleのdependenciesに以下の行を追加します。

```groovy:build.gradle
compile 'org.apache.poi:poi-ooxml:4.1.0'
```

また、テスト用に以下のExcelファイルを用意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174740/da145ade-745e-9de6-8b3b-a607a693ced9.png)


# Workbook,Worksheetの取得
```kotlin
val file = Paths.get("PoiSampleWorkbook.xlsx").toFile()
val book = WorkbookFactory.create(file)
val sheet = book.getSheet("Sheet1")
```

# シート内の全てのデータを読み込む
以下のように行、列をシーケンスとして取得できます。

```kotlin
sheet.rowIterator().asSequence().forEach { row ->
    val values = row.cellIterator().asSequence().map { cell ->
        when (cell.cellType) {
            CellType.NUMERIC -> cell.numericCellValue.toString()
            CellType.STRING -> cell.stringCellValue
            else -> throw RuntimeException("CellType=${cell.cellType}]")
        }
    }
    println(values.toList())
}
```

```text:結果
[商品名, 価格]
[商品A, 5000.0]
[商品B, 7000.0]
[商品C, 10000.0]
```

ちなみに、CellTypeが数値のセルをstringCellValueで取得しようとすると以下のように怒られます。

```
Exception in thread "main" java.lang.IllegalStateException: Cannot get a STRING value from a NUMERIC cell
```

# シート内の任意のセルの値を読み込む
データの存在しない行、列を取得しようとするとnullが返されます。

```kotlin
// indexは0オリジン
val row = sheet.getRow(1)
if (row != null) {
    val cell = row.getCell(0)
    if (cell != null) {
        println(cell.stringCellValue)
    }
}
```
```:結果
商品A
```

またはCellUtilを利用すれば、存在しないセルを取得してもnullではなく空のセルを取得できます。

```kotlin
// indexは0オリジン
val row = CellUtil.getRow(1, sheet)
val cell = CellUtil.getCell(row, 0)
println(cell.stringCellValue)

// 存在しないセルを指定してもぬるぽにならず、CellType.BLANKのセルが取得できる
val row2 = CellUtil.getRow(999, sheet)
val cell2 = CellUtil.getCell(row2, 999)
println("CellType=${cell2.cellType}, value=${cell2.stringCellValue}")
```
```:結果
商品A
CellType=BLANK, value=
```

# 拡張関数でVBAっぽく
通常の使い方だとわざわざ行->列の順で取得しないといけないので面倒ですが、kotlinの拡張関数を使えばVBAのCellsっぽいことができます。

```kotlin
fun Sheet.cells(row: Int = 0, col: Int = 0) = CellUtil.getCell(CellUtil.getRow(row, this), col)
fun Cell.value() = when (cellType) {
    CellType.NUMERIC -> numericCellValue.toString()
    CellType.STRING -> stringCellValue
    else -> throw RuntimeException("CellType=$cellType]")
}

println(sheet.cells(1, 0).value())
println(sheet.cells(1, 1).value())
```
```:結果
商品A
5000.0
```

# 参考
http://www.ne.jp/asahi/hishidama/home/tech/apache/poi/index.html
コマンド履歴を修正してもうまく反映されないときに

#はじめに
ターミナル上でコマンドを貼り付けたと思ったらさっきコピペしたソースコードがまるまる残っててコマンド履歴が悲惨なことになったりしたことありませんか？
Zshはコマンド共有などコマンドに対して便利な機能がたくさんありますが、そのせいで間違ったコマンドを叩いてしまったときに履歴をうまく修正ができないときがあります。
ときには[こんな](https://qiita.com/Seigenkousya/items/086e682bcbcbe0815126)悲劇を引き起こしてしまうこともあるのです。

#最初に注意
まぁ、賢明な読者諸氏なら分かると思いますが過去記事の
[source ~/.zsh_historyは絶対に実行してはいけない(戒め](https://qiita.com/Seigenkousya/items/086e682bcbcbe0815126)
にあるとおり

```
$ source ~/.zsh_history
```

は間違いですし、絶対やってはいけません。(戒め
```source```コマンドは設定を更新させるコマンドではなくファイルに書かれたコマンドを現在のシェルで実行するコマンドです。(zshrcやvimrcにかかれている命令を実行して設定を反映させている)
権限次第ですが、今まで実行したコマンドを頭から実行するこの世の地獄をみることになります。

#間違えたコマンドの履歴を消すには

##コマンド履歴の修正
コマンドの履歴を修正する方法なら探せば色んなサイトに書いてあります。
今回はよく知られている2つの方法を書いておきます。

###~/.zsh_historyを修正する
一つは、~/.zsh_historyをエディタで開いて当該箇所を修正する方法です。

```
$ vim ~/.zsh_history
```
しかし、修正したいコマンドがまだ記録されていない場合があります。
ファイル上ではなくバッファ上に履歴がある場合があるからです。
その場合はバッファ上にあるコマンド履歴を.zsh_historyに書き出させるために一度、```exit```コマンドを使ってターミナルを閉じてから開き直します。

```
$ exit
$ vim ~/.zsh_history
```

これにより、バッファ上のコマンド履歴を.zsh_historyに反映させることができるのでそこから編集します。


###historyコマンドを使用する
もう一つは、historyコマンドを使う方法です。

```
$ history
$ history -d {番号}
例) $ history -d 8931
```
historyコマンドで過去に実行したコマンドとその番号を控えて```history -d {番号}```で消す方法です。
しかし、こちらの方法は僕の環境ではうまくいきませんでした。(謎)

##履歴の修正を反映する
問題はこっちです。
環境次第ではうまく反映されないので散々です。
僕もここで一年くらい苦しんでいました。

コマンド履歴の修正を反映するには、以下のコマンドを使います。

```
$ fc -R ~/.zsh_history
```

これで~/.zsh_history上の修正したデータを上手く反映することができました。

#まとめ
1.```exit```コマンドでターミナルを一度閉じる。
2.ターミナルを開き直してエディタを使って~/.zsh_historyの消したいコマンドの部分を削除して修正する。
3.```fc -R```で修正を反映させる。

```
$ exit
$ vim ~/.zsh_history
$ fc -R ~/.zsh_history
```
以上。

#終わりに
さっきやっと修正する方法が見つかったので衝動的に書きました。
既出だったらごめんなさい。
他にも困ってるひとがいたら、これを見て上手くいくといいなぁ。

#参考
[間違って入力したコマンドのhistoryの削除 - Qiita](https://qiita.com/katamuki/items/f9806bad3641baac2747)
PhpStormで複数ファイルの複数行を置換する手順

全ページが静的HTMLで作られているサイトのグローバルナビを変更することになった。
全部で400ファイルほど変更しなければならない！
PhpStormで一気に全ファイルの複数行の置換の仕方がわからなかった（のでメモ）！

※参考：ファイル内のテキストの検索と置換 - 公式ヘルプ | PhpStorm
https://pleiades.io/help/phpstorm/finding-and-replacing-text-in-file.html

# 手順

## 1.ファイルを1つ開き、変更したい箇所を選択し、「shift + command + R」を押す
<img width="403" alt="ソースコードの画面" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40940/d4d74519-98c1-e19b-eff7-dab9d0420f2d.png">

## 2.検索・置換画面が表示される。
<img width="983" alt="検索・置換の画面" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40940/1f318366-1e29-3fe5-9d32-9928c41b4950.png">

# 3.２つ目（置換したい内容）の入力欄にカーソルを当てる
<img width="983" alt="検索・置換の画面" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40940/be6a9bfb-76c2-b0a0-2fa4-17db32e7a05a.png">

# 4.改行マークを押す！
これを押さないと複数行を入力できない！
<img width="938" alt="検索・置換の画面　改行マーク" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40940/7b66a43d-2b9e-3609-cb36-7bc7e3634c08.png">
変更したい内容を入力する
<img width="983" alt="検索・置換の画面" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40940/efb6b3f1-bcc3-ada2-c095-771361f6a726.png">

# 5.入力が終わって「Replace All（Replace）」を押すと、確認されるので「Replace」を押す
<img width="936" alt="検索・置換の確認画面" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40940/1e984d19-732f-6489-3b73-3f118fc2572a.png">

# 6.変更完了
<img width="359" alt="変更後のソースコードの画面" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40940/84f31e1e-6b52-ae2a-4440-5940a10c9467.png">
備忘録）'Jupyter-notebook'カスタマイズ

#自力でカスタマイズ
C:\Users\user name\ .jupyter
に
customフォルダを作成
customフォルダ下にcssファイルを作成し設定を記述

#簡単に
```
C:\Users> pip install jupyterthemes  # 背景テーマのインストール
C:\Users> jt -l  # 背景テーマ一覧表示
C:\Users> jt -t 適用したいテーマの名前 
          # 例）jt -t oceans16
```

[参考サイト](https://www.lisz-works.com/entry/jupyter-theme)

#jupyter-notebook 起動時のディレクトリ移動
```
 C:\Users> jupyter notebook --generate-config #設定ファイルの作成
 C:\Users> jupyter notebook 移動したいディレクトリのパス
```
パスの指定は絶対パス、相対パスどちらも可能。

参考:[Jupyter_notebookをディレクトリを指定して起動する](https://qiita.com/ponponpopon/items/2c7fff94c7ec32ace230)
CentOS7にdocker、docker-composeをインストール

#CentOS7にdocker、docker-composeをインストールする
公式サイトの手順に従って作業する
https://docs.docker.com/install/linux/docker-ce/centos/

##dockerのインストール
docker周りのパッケージの削除

```
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-engin
```

インストールに必要なパッケージのインストール

```
sudo yum install yum-utils device-mapper-president-data lvm2
```
repositryの設定

```
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
```

dockerのインストール

```
sudo yum install docker-ce docker-ce-cli containerd.io
```

dockerの起動

```
sudo systemctl start docker 
```

dockerのバージョン確認

```
sudo docker -v
Docker version 18.09.7, build 2d0083d
```

##docker-composeのインストール
公式サイトの手順に従って作業する
https://docs.docker.com/compose/install/

docker-composeのダウンロード

```
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
```

バイナリに、実行可能権限を付与

```
sudo chmod +x /usr/local/bin/docker-compose
```

/usr/binにシンボリックリンクを作成

```
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
```

バージョン確認

```
sudo docker-compose -v
docker-compose version 1.24.0, build 0aa59064
```

以上
#Ruby の配列 ( Array ) で差集合を得るのと、集合 ( Set ) で差集合を得るの、どちらが速度が出るのかほんの少しだけ試してみた

配列

```rb
Benchmark.measure { 1000.times { [*1..10000] - [*5000..7000]  } }
  0.648272   0.086270   0.734542 (  0.736078)

Benchmark.measure { 1000.times { [*1..10000] - [*5000..7000]  } }
  0.680731   0.100771   0.781502 (  0.796209)

```

集合、遅いな。


```rb
Benchmark.measure { 1000.times { Set.new(1..10000).difference Set.new(5000..7000)  } }
  2.044662   0.281331   2.325993 (  2.331730)

Benchmark.measure { 1000.times { Set.new(1..10000).difference Set.new(5000..7000)  } }
  2.025427   0.264227   2.289654 (  2.295282)
```



# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
django twitter_clone作成　part2

##はじめに
こんにちは、rickyです。
今回はデータベースの定義を行いたいと思います。

##やり方
最初にデータベースをDjangoが作成できるようにアプリのmodels.pyに記載をしていきます。
Djangoはモデルが有効にされている際にアプリケーションのデータベーススキーマを作成(CLEATE TABLE文の実行)や、PythonからアクセスするためのデータベースAPIを作成できます。
そのためにはプロジェクトのsetting.pyに記述を行います。
setting.pyのINSTALLED_APPSに[アプリ名].[apps].[appsのクラス名]を記載します。
今回の私の場合ですとapp.apps.AppConfigとなります。
これでプロジェクトは、このアプリをインストールしたことを理解できました。
これにより、models.pyからデータベースを作成できるようになりました。
今回は簡単なデータベースを作成したいので文字列のみのデータベースを作成します。
以下のとおりになります。
```python:models.py
from django.db import models
class App(models.Model):
    body = models.CharField(max_length=140, verbose_name='投稿内容')
```
これで最大140字まで入力できる投稿内容欄の雛形ができました。
今度はこの情報をDjangoに変更があったと伝えるためにマイグレーションという作業をします。
ちなみにマイグレーションとは、システム、または、データ資産の移行作業のことである。(Weblio辞書より抜粋)
マイグレーションはターミナルから./manage.py makemigrationsで行えます。
マイグレーションが終わるとマイグレーションファイルが作成され、./manage.py migrateでマイグレーションファイルの実行ができます。
これで今回指定したカラムを持ったデータベースを作成できました。

##終わりに
いかがでしたか？
今回はデータベースの定義を行いました。
これで色々なカラムを持ったデータベースが作成できるようになったはずです。
文字列だけでなく時刻や、数値を持たせることができます。
色々なフィールドの型を調べてみるのも面白いかもしれません。
では、次回はテンプレートについて説明する予定です。
さようなら〜
#Ruby で配列の和集合・積集合・差集合を、記号じゃなくて、名前のあるメソッドで得る

記号ってわかりにくいじゃないですか

# require

```
require 'set'
```

# 和集合

```rb
Set.new([1,2,3]).union Set.new([2,3,4])
# => #<Set: {1, 2, 3, 4}>

(Set.new([1,2,3]).union Set.new([2,3,4])).to_a
# => [1, 2, 3, 4]
```

# 積集合

```rb

Set.new([1,2,3]).intersection Set.new([2,3,4])
=> #<Set: {2, 3}>

Set.new([1,2,3]).intersection Set.new([2,3,4])).to_a
=> [2, 3]
```


# 差集合

```rb
Set.new([1,2,3]).difference Set.new([2,3,4])
# => #<Set: {1}>

(Set.new([1,2,3]).difference Set.new([2,3,4])).to_a
# => [1]
```

# Ref

[class Set (Ruby 2.6.0)](https://docs.ruby-lang.org/ja/latest/class/Set.html)

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
LeetCodeのすヽめ ~フィボナッチ数列を例に~

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

唐突ですが、私のマイブームを紹介します。

https://leetcode.com/

LeetCodeという、コーディングの問題集的サイトです。
最近はここで毎日問題を解いているんですが、せっかくなら何かしらアウトプットした方がペースメーカーにもなると思い、ブログ記事にします。

LeetCodeでは、エンジニアの面接で行われるCoding Interviewで実際に出題された問題が掲載されているそうです。
実際にGoogle等のCoding Interviewを受けた人の話では、全く同じ問題は出ないが、LeetCodeをやっておけば解ける問題が出た、とのことでした。
難易度のレベルがEasy/Medium/Hardとあり、C/Java/Python/Rubyなど多くの言語に対応しています。
各問題にDiscussionページが設けられ、他のユーザーの解法を見て勉強できます。
一部問題には公式のSolutionページもあります（無料会員と有料会員で見られる範囲が異なります）。

<b><span style="color: #ff5252">ビジネスパーソンの方々、なんだエンジニアの話か、と思うなかれ。</span></b>
特に小中高校時代に算数が得意だった方にとっては、なかなか面白いサイトだと思います。
これを機会にコーディングデビューしてみては？と思うくらい。

例えば以下の問題。

https://leetcode.com/problems/climbing-stairs/

You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
Note: Given n will be a positive integer.

階段を上っていて、１段ずつないしは１段飛ばしでしか上れないとしたとき、n段目まで上る方法はいくつある？という問題です。
こんな問題、どこかで聞いたことありませんか？



n段目まで上るには、n-1段目から１段上るか、n-2段目から１段飛ばしで上るかのどちらかになります。
つまり、n段目までの上り方の数を$f(n)$とすると、$f(n)=f(n-1)+f(n-2)$になるわけです。
「フィボナッチ数列」という言葉を聞いたことはありませんか？「前の２つの数を加えると次の数になる」という数列で、まさにそれにあたるわけです。

これをコードで書くと、以下のようになります。

```python
class Solution:
    def climbStairs(self, n: int) -> int:
        if n == 1:
            return 1
        elif n == 2:
            return 2
        else:
            i = 3; a = 1; b = 2
            while i < n:
                a, b = b, a+b
                i += 1
            return a+b
```

もっと簡単に書くと以下の通り。

```python
class Solution:
    def climbStairs(self, n: int) -> int:
        a = b = 1
        for _ in range(n):
            a, b = b, a + b
        return a
```

エンジニア目線では、LeetCodeは処理時間とメモリ使用量について、計算量オーダー（あるアルゴリズムを使った演算の性能を表す指標）も示してくれるので助かります。
ただsubmitごとに値が大きく変わっていて（特に処理時間）、LeetCode側のサーバー側がどれだけ混んでるかに依っていそうなので、あくまで参考値ですが。

最後に、私がLeetCodeを知るきっかけになったTweetを紹介します。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">今年の4月に行われたKaggle daysの発表でKaggleは機械学習エンジニアのジョブにつくのに役立つか？という問題に関して、ジョブがほしいならKaggleではなくLeetCodeやれ、その後でKaggleやれとのこと <a href="https://t.co/KnudQRzsFu">pic.twitter.com/KnudQRzsFu</a></p>&mdash; MIC (@ml_datascience) <a href="https://twitter.com/ml_datascience/status/1135468356180381696?ref_src=twsrc%5Etfw">2019年6月3日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

とある理由でKaggleを注視しているんですが、なかなか敷居が高いですし、世の中の大半を占めるであろう、機械学習活用度 Low ~ Middle 層では、ここまでのスキルが必要か？と思っていました。
そう思っていたところでこのTweetを見て、我が意を得たり、と思ったわけです。

さて、このLeetCodeについてですが、今後は不定期ながらもこのBlogやQiita上で面白いと思った問題を取り上げていこうと思います。

~以下余談~

LeetCodeのもとになっているCoding Interviewですが、、日本では全くと言っていいほど行われていないそうですね。
今をときめく○ルカリのエンジニア面接に臨んだ米国大学卒の子（LeetCodeヘビーユーザー）が、「あなたの志望動機は〜」「強みは〜」など通り一遍の質問だけ聞かれて落とされ、納得いかない・・・と言ってました。
単純に<b><span style="color: #ff5252">評価できる人がいない</span></b>ということなんでしょうが、日本のITリテラシの低さの一端がまた見えてしまった気がします。
#ruby で数が大きい順に配列 / ハッシュを並び替えるには reverse が簡単ですよね ( desc sort / sort_by )

```rb
[3,1,2].sort.reverse
=> [3, 2, 1]
```

```rb
[{count: 3},{count: 1},{count: 2}].sort_by { |h| h[:count] }.reverse
# => [{:count=>3}, {:count=>2}, {:count=>1}]
```

別のやり方

```rb
[3,1,2].sort { |a, b| b <=> a }
# => [3, 2, 1]
```

```rb
[{count: 3},{count: 1},{count: 2}].sort_by { |h| -h[:count] }
# => [{:count=>3}, {:count=>2}, {:count=>1}]
```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
puppeteerでTweetDeckのツイートをふぁぼる(備忘録)

puppeteerでTweetDeckのツイートをふぁぼる

とりあえずメモとしてコピペ
説明もないので後で編集する

```ruby:Favorite_Click.js

const tmp = await page.$('article[data-key^="' + json[0].id_str + '"]');
const _tmp = await tmp.$('i[class="js-icon-favorite icon icon-favorite icon-favorite-toggle txt-center pull-left"]');
await _tmp.click();
```
Python::Numpyのarrayをインデックスソートする方法

Pythonで、ソート時に、リストをソートするのではなく、ソートされたインデックスを返す場合。numpyのargsortを使った方法をご紹介します。

#CODE

```argsort.py
#!/usr/bin/python3
import numpy

a=numpy.random.rand(10)
x=numpy.argsort(a)
print(a)
print(x)

b=a[x]
print(b)

z=x[-1::-1] # flip
print(z)

b=a[z]
print(b)

#stringの場合も同様に

a=numpy.array(['e','c','d','d','b','a'])
print(a)
x=numpy.argsort(a)
print(x)

b=a[x]
print (b)

```

#実行結果

```
[0.67958541 0.6855469  0.63389202 0.17932474 0.97544388 0.43904699
 0.35668947 0.17622098 0.53345127 0.15778868]
[9 7 3 6 5 8 2 0 1 4]
[0.15778868 0.17622098 0.17932474 0.35668947 0.43904699 0.53345127
 0.63389202 0.67958541 0.6855469  0.97544388]
[4 1 0 2 8 5 6 3 7 9]
[0.97544388 0.6855469  0.67958541 0.63389202 0.53345127 0.43904699
 0.35668947 0.17932474 0.17622098 0.15778868]
['e' 'c' 'd' 'd' 'b' 'a']
[5 4 1 2 3 0]
['a' 'b' 'c' 'd' 'd' 'e']
```
Apacheの名前ベースのバーチャルホストを利用したときのメモ

### 環境
- CentOS 7
- Apache 2.4.6

### 参考URL
- http://httpd.apache.org/docs/2.4/vhosts/name-based.html

## クライアント
### hostsにサーバー名を登録
```
192.168.99.101 nexus-server
```

## Apacheサーバー
### /etc/httpd/conf.dに下記の設定ファイルを作成
```
# どのドメインを名前ベースのバーチャルホストにするかを指定
# ちなみに名前ベースのバーチャルホストを利用するとメインホストがなくなる
NameVirtualHost *:80

<VirtualHost _default_:80>
</VirtualHost>

<VirtualHost *:80>
  ServerName nexus-server
  ProxyRequests off
  ProxyPass / http://localhost:8081/
  ProxyPassReverse / http://localhost:8081/
</VirtualHost>
```

## リバースプロキシを利用した場合
###　/etc/sysconfig/selinuxの該当行を編集し、サーバーを再起動
```
SELINUX=disabled
```
- https://httpd.apache.org/docs/2.4/ja/mod/mod_proxy.html
- http://www.hiihah.info/index.php?Linux%EF%BC%9ACentOS6%E3%81%A7mod_proxy%E3%81%8C%E5%8B%95%E3%81%8B%E3%81%AA%E3%81%84
Django Girls Tutorialを復習する（５）〜HTML入門〜

注意事項はこちら。
https://qiita.com/K-Kazutaka/items/1a432bda4f723e6757d6
写経用の記事です。


`blog内にtemplatesという名前のディレクトリを作成。
さらにそのtemplates内にblogという名前のディレクトリを作成。
blog/templates/blogないにpost_list.htmlというファイルを作成`

こんな感じ
blog
└───templates
    └───blog───post_list.html

これでエラーは消えたはず。もしまだエラーだったら、ControlCでサーバーを止めて、
もう一度python manage.py runserverコマンドを動かして再度サーバーを動かす。

post_list.htmlにHTMLを書き込む。

```blog/templates/blog/post_list.html
<html>
    <head>
        <title>Django Girls blog</title>
    </head>
    <body>
        <div>
            <h1><a href="/">Django Girls Blog</a></h1>
        </div>

        <div>
            <p>published: 14.06.2014, 12:14</p>
            <h2><a href="">My first post</a></h2>
            <p>Aenean eu leo quam. こんにちは！ よろしくお願いします！ </p>
        </div>

        <div>
            <p>公開日: 2014/06/14, 12:14</p>
            <h2><a href="">2番目の投稿</a></h2>
            <p> こんにちは！ よろしくお願いします！ </p>
        </div>
    </body>
</html>
```
指定したサイズと数量でテスト用ファイルを生成

# はじめに

以前にファイルサーバーの移行を担当した時に、移行（ファイルコピー）に要する時間を推測するため、移行先ファイルサーバーの書き込み性能をテストしたことがありました。
その時は、テストのために「適当な容量とファイル数のサンプル」を用意するのが少々面倒でした。

そこで、**「ファイルサイズ」「ファイル数」の2つを引数で指定して、ファイルを自動生成してくれるスクリプト**を作ってみました。
あまりにもニッチ過ぎるスクリプトですが、どなたかのお役に立てるかもしれません...

# スクリプト

スクリプトのオプションは以下の通りです。

* -h
 * ヘルプの表示。
* -s
 * 生成するファイルのサイズ。
 * 1KBであれば"1K"、1MBであれば"1M"、1GBであれば"1G"を指定する。
 * デフォルト値は1K。
* -c
 * 生成するファイル数。
 * デフォルト値は1。

なお、スクリプトの末尾の`echo -n -e "\n"`は、プログレスバーの代わりに出力している「...」を改行するために入れています。

```bash:mkfile.sh
#!/bin/bash

function usage {
    cat <<EOS
$(basename ${0}) is a file-creation tool for test.
Usage:
    $(basename ${0}) [<options>]
Options:
    -s    print file size in human readable format(e.g., 10K, 5M, 1G). default is 1K.
    -c    print file counts. default is 1.
EOS
}

FILE_SIZE="1K"
COUNT=1

while getopts s:c:h OPT
do
  case $OPT in
    "s" ) FILE_SIZE="$OPTARG"
          ;;
    "c" ) COUNT="$OPTARG"
          ;;
    "h" ) usage;
          exit 0
          ;;
  esac
done

for i in $( seq 1 $((COUNT)) ); do
  dd if=/dev/zero of=${FILE_SIZE}_${i}.txt bs=$FILE_SIZE count=1 2> /dev/null
  echo -n "."
done

echo -n -e "\n"
```


# 使い方

* `$ ./mkfiles.sh -s 100M -c 20`で、「100MBのファイルを20個生成する」ことができます。
 * 当たり前ですが、このスクリプトに対して実行権限を付与してから実行してください。
* 作成されるファイル名は、`{ファイルサイズ}_{連番}.txt`となります。
 * 以下の例では、`100M_1.txt`から`100M_20.txt`まで、100MBのファイルを20個生成しています。

```shell
[nkojima@akagi ~]$ ls
mkfiles.sh
[nkojima@akagi ~]$ ./mkfiles.sh -h
mkfiles.sh is a file-creation tool for test.

Usage:
    mkfiles.sh [<options>]

Options:
    -s    print file size in human readable format(e.g., 10K, 5M, 1G). default is 1K.
    -c    print file counts. default is 1.
[nkojima@akagi ~]$ ./mkfiles.sh -s 100M -c 20
....................
[nkojima@akagi ~]$ ls -lh
合計 2.0G
-rw-rw-r--. 1 nkojima nkojima 100M  7月  6 20:05 2019 100M_1.txt
-rw-rw-r--. 1 nkojima nkojima 100M  7月  6 20:05 2019 100M_10.txt
-rw-rw-r--. 1 nkojima nkojima 100M  7月  6 20:05 2019 100M_11.txt
-rw-rw-r--. 1 nkojima nkojima 100M  7月  6 20:05 2019 100M_12.txt
-rw-rw-r--. 1 nkojima nkojima 100M  7月  6 20:05 2019 100M_13.txt
-rw-rw-r--. 1 nkojima nkojima 100M  7月  6 20:05 2019 100M_14.txt
-rw-rw-r--. 1 nkojima nkojima 100M  7月  6 20:05 2019 100M_15.txt
-rw-rw-r--. 1 nkojima nkojima 100M  7月  6 20:05 2019 100M_16.txt
-rw-rw-r--. 1 nkojima nkojima 100M  7月  6 20:05 2019 100M_17.txt
-rw-rw-r--. 1 nkojima nkojima 100M  7月  6 20:05 2019 100M_18.txt
-rw-rw-r--. 1 nkojima nkojima 100M  7月  6 20:05 2019 100M_19.txt
-rw-rw-r--. 1 nkojima nkojima 100M  7月  6 20:05 2019 100M_2.txt
-rw-rw-r--. 1 nkojima nkojima 100M  7月  6 20:05 2019 100M_20.txt
-rw-rw-r--. 1 nkojima nkojima 100M  7月  6 20:05 2019 100M_3.txt
-rw-rw-r--. 1 nkojima nkojima 100M  7月  6 20:05 2019 100M_4.txt
-rw-rw-r--. 1 nkojima nkojima 100M  7月  6 20:05 2019 100M_5.txt
-rw-rw-r--. 1 nkojima nkojima 100M  7月  6 20:05 2019 100M_6.txt
-rw-rw-r--. 1 nkojima nkojima 100M  7月  6 20:05 2019 100M_7.txt
-rw-rw-r--. 1 nkojima nkojima 100M  7月  6 20:05 2019 100M_8.txt
-rw-rw-r--. 1 nkojima nkojima 100M  7月  6 20:05 2019 100M_9.txt
-rwx------. 1 nkojima nkojima  639  7月  6 20:04 2019 mkfiles.sh
```