OmniAICreator/Qiita-1.07M huggingface dataset:
webpack+typescriptで、jsonインポート部分のエイリアスを定義しているのに、Cannot find moduleエラー

webpackでエイリアスで定義しているのに、`Cannot find module`エラーが出て、ちょっと悩みました。

### webpack.config.js
```javascript

alias: {
  '@': path.join(__dirname, './src/javascript')
}
```

### i18n.ts(抜粋)
```javascript

import i18next from 'i18next'
import { initReactI18next } from 'react-i18next'

import localeJson from '@/app/config/locale.json'
```

#### エラーメッセージ
```
ERROR in src/javascript/app/config/i18n.ts(4,24)
      TS2307: Cannot find module '@/app/config/locale.json'
```

## 原因
`tsconfig.json`の定義とwebpackのaliasの定義が矛盾してました。

```json
"paths": {
  "@/*": ["src/javascript/app/*"]
}
```
久しぶりに触ったリポジトリだったので、定義してたのすっかり忘れてました。
フロントエンド開発環境にDockerを使ってみる

Shellでのビルドを行うフロントエンドの開発で、Dockerにて開発環境を構築している理由を、
自分なりにまとめてみたいと思います。


# Docker を使う場合、何が嬉しいか

Dockerを使う場合にメリットがいくつかあります。

## 開発環境構築ドキュメントが不要になる

動作しているわけですから、Dockerfile に書いてあることが完全な正解になります。

**動作する開発環境構築のためのコードがそこに書いてあり、なおかつ動作が保証されている。**

これはかなりの安心感になるのではないでしょうか。

## 開発環境構築コード自体が gitリポジトリ に入る

別で書いたドキュメントに入るのではなく、開発環境構築自体が gitリポジトリに入っているようになります。
問題が起きて修正する際も履歴が残り、なおかつコードと同期されています。

また、gitリポジトリを見つけているのに、ドキュメントの場所が迷子ってことにもなりません。


## ホストOSに影響せずビルドすることができる。

複数の言語を扱ったりバージョンを扱ったりする場合があると思います。
その際に、 nvm や rbenv など環境切り替えパッケージを利用する必要がなくなり、
完全な開発環境になります。

ビルドする際は、 

```shell
docker exec {コンテナ名} bash -c "cd /opt/src && npm run build"
``` 

のようにホストOSからコマンドを実行します。

# 逆に困るところはあるか

ホストOSにて、普通に動かすよりも、動作が重い可能性があります。
※数値では未検証。感覚知です。

なので、もし動作が重く困る場合は、個人ごとに独自で、ホストOSに環境を構築してもいいと思います。

ただ、Dockerに開発環境構築するコードは維持します。
なぜかというと、それは開発環境構築のドキュメント代わりも兼ねているからです。

新規で入ってきたエンジニアはまず、Dockerで動かしてみる。
しばらく経って、速度を求めだしたらDockerfileを参照しながらホストOSに構築しても良い。

そのような運用が良いかと思います。

# まとめ

最近はこの方法でフロントエンド環境を構築しています。
git clone してきて、すぐにビルドができるところは楽でいいです。
rubyのバージョン変更　2.5.1

今回はプログラミングスクールの際、rubyのバージョンを誤って変更してしまった際
元に戻した方法を記載い致します。

通常慣れているかたはありえない事だと思いますが、私の様に何も気にせず記事投稿の内容を進めていると起こったりするかもしれません。笑
ですのでこちらの記事は初心者学習の傾けに記載致します。

開発環境
ruby  2.5.1
rails 5.2.4.1
OS    Sierra

開発中環境変数を触ってしまい、パスが通らなくなりました。
適当に記事を参考に元に戻せるか試してみましたが、パスが通っておらずPCによってもコマンドが異なる
為、投稿記事の内容では元に戻せませんでした、

ですので今回の記事もあくまで環境が同じ方向けになります。
ご注意ください。


私の場合はrubyのバージョンが2.3.4だったかな？　つまり現在利用いていたrubyのバージョンより古くなってしまい、一時的に開発ができなくなってしまいました。
ですが私の場合
下記のコマンドで簡単に元に戻せました。
ターミナルに下記のコマンドを1行づつ入力
----
     echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

     source ~/.bash_profile

     rbenv global 2.5.1

これで元どおりになりました。

あくまで参考程度ですが、すこし戸惑ったところですので載せておきます。
一行ごとに空行を挿入するExcelマクロ

###これは
Excelで、選択した範囲に一行ずつ空行を挿入するだけのちょっとしたExcelマクロです。
こんなのが意外と重宝します。

![beforeafter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164214/41499bf3-5540-6913-7613-1ae0b16c8ae8.png)

###コード

```vb
Sub 一行ごとに空行挿入()
    With ActiveWindow.RangeSelection
        Dim i
        For i = .Rows.Count To 1 Step -1
            .Resize(1).Offset(i).EntireRow.Insert
        Next
        .Resize(.Rows.Count + 1).Select
    End With
End Sub
```

###参考
こういう細々としたものを右クリックメニューに入れて都度使ってます。
:arrow_upper_right:[Excelの右クリックメニューに自家製マクロを追加する](https://qiita.com/jinoji/items/ea3febd87bff2560d0c0)
C++ のメンバ変数である配列をコンストラクタで初期化する

# 状況

こんな感じのクラスがある。

```c++
class foo
{
public:
    int ary_[3];
    foo();
};
```

まあ、生の配列使わずに `std::array` (のようなもの)を使おうよとか思うところはあるけれど、とにかくこういうクラスがある。

で。
デフォルトコンストラクタで `ary_` の値を `11,222,3333` で初期化したい。


# C++03 の場合

C++03 の場合、わりとどうしようもない。
私なら以下のようにするかな：

```c++:C++03
foo::foo()
{
    ary_[0] = 11;
    ary_[1] = 222;
    ary_[2] = 3333;
}
```

要素数が少なければ代入文をたくさん書くのもありだと思う。
代入文をたくさん書きたくない場合はこう：

```c++:C++03
#include <algorithm>

#define STATIC_ASSERT(key, x) enum \
{                                  \
    key = 1 / ((x) ? 1 : 0)        \
};

#define COUNTOF(x) (sizeof(x) / sizeof(*(x)))

template <typename T, size_t size>
inline T *endof(T (&ary)[size])
{
    return ary + size;
}

foo::foo()
{
    int initial_values[] = {11, 222, 333};
    STATIC_ASSERT(array_count_should_be_same, COUNTOF(initial_values) == COUNTOF(ary_));
    std::copy(initial_values, endof(initial_values), ary_);
}
```

`STATIC_ASSERT` とか `endof` は、C++03 で仕事するなら似たようなものをみんな用意していたんじゃないかと思うけどどうだろう。

いずれにせよ。

1. メンバ変数として、配列の中身がある状態が用意される
2. そこに何らかの方法で代入される

という流れになるので、配列の要素型にコンストラクタやデストラクタがある場合、無駄な処理が走ってしまう。

# C++11 以降の場合

C++03 までの、メンバである配列を初期化するいい方法がない、という欠陥は修正されている。

こんな感じ:

```C++:C++11
foo::foo()
    : ary_{11, 222, 3333} {}
```

ありがたい。
住宅価格を予測する（LinearRegressionによる回帰(kaggle)）ver1.0

#１　はじめに

　今回は、Sale Price(住宅価格）予測問題について解いていきます。最初は極々簡単な一次回帰式から予測を行いたいと思います。本来は多数ある特徴量を処理、最適化していくことが醍醐味なのですが、まずは簡単に予測するところから始めたいと思います。

参考ＵＲＬ
https://www.kaggle.com/katotaka/kaggle-prediction-house-prices

使用したバージョンはこちらです。

Python　3.7.6
numpy　1.18.1 
pandas　1.0.1
matplotlib　3.1.3
scikit-learn　0.22.1

#２　プログラムについて


#ライブラリ等

```python

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression
import seaborn as sns

# Jupyter Notebookの中でインライン表示する場合の設定（これが無いと別ウィンドウでグラフが開く）
%matplotlib inline 
```

　csvの読み込みとしてpandas、数列の処理としてnumpy、グラフ描画にmatplotlibとseaborn、そして回帰を行うためにsklern.linear_modelをインポートしました。


#訓練データの読み込み

```python

df = pd.read_csv("train.csv")
df
```
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567823/2620b893-5c98-e2b0-9f7e-e821e0958f61.png)


　特徴量が多いために一度にすべてを表示することができておりませんが、多くの住宅条件（面積、道に面しているか、プールがあるか）等が記載されています。これら条件が住宅価格(Sale Price）に影響しているかを評価して、予測するものです。



#相関係数の高い特徴量の見極め



```python

corrmat = df.corr()
k = 10 #number of variables for heatmap
cols = corrmat.nlargest(k, 'SalePrice')['SalePrice'].index
cm = np.corrcoef(df[cols].values.T)
sns.set(font_scale=1.25)
hm = sns.heatmap(cm, cbar=True, annot=True, square=True, fmt='.2f', annot_kws={'size': 10}, yticklabels=cols.values, xticklabels=cols.values)
plt.show()
```

![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567823/533dfe59-9244-5141-0756-d88f02920ae7.png)



　住宅価格に対して相関係数が高い特徴量を見出したいと思います。seabornのheatmapによって見てみましょう。SalePriceと相関係数高い特徴量はOverallQual（全体の品質）であることが分かります。品質が高ければ値段も高くなる、ということは感覚的にも理解しやすいものですね。
　

　

#回帰分析と散布図表示

```python

X = df[["OverallQual"]].values
y = df["SalePrice"].values
slr = LinearRegression()
slr.fit(X,y)

#散布図作成
plt.scatter(X,y)
plt.xlabel('OverallQual')
plt.ylabel('House Price($)')

#近似曲線の表示
plt.plot(X, slr.predict(X), color='red')

#グラフ表示
plt.show()

```

![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567823/7c32db2b-446f-f4b2-8c00-8e0019f2395e.png)


　OverallQualとSalePriceの関係をグラフに致しました。概ねの傾向は合っています。しかし、OverallQualが低いところでは実際より低く見積もられいます。また、OverallQualが高いところではバラツキが大きいことが分かります。これらは他の特徴量によりさらに精緻に予測できると思いますが、今回はこのまま予測します。





#予測

```python

#テストデータ読み込み
df_test = pd.read_csv('test.csv')

#テストデータのOverallQualの値をX_testへセット
X_test = df_test[["OverallQual"]].values

y_test_pred = slr.predict(X_test)
df_test[["Id", "SalePrice"]].to_csv("submission.csv", index = False)

```

kaggleへ送付した際のSCOREは0.84342でした(4563位4720チーム中）。
次の記事からは詳細に解析して良いスコアにしていきたいと思います。
【rails】読みやすいコードの書き方【初心者向け】

#はじめに
読みやすいコードを書くことで``コードレビューの効率が上がりますし、後々の変更もしやすくなります。``
逆に読みにくいコードは**読む時間がかかりますし、バグも混入しやすくなり、原因特定に時間がかかってしまいます**。
上記のような理由で、業務の効率を高めるために、``可読性の高いコード``を書くことは非常に重要です。

#参考文献
リーダブルコード要約とリーダブルコード要約の活用方法
https://qiita.com/AKB428/items/20e81ccc8d9998b5535d

脱初心者の第一歩！「これは！？」と思わせるイケてるコードの書き方【初心者向け】
https://note.com/cohki0305/n/n061d6fca4b01

#読みやすいコードの書き方
###1.変数に分かりやすい名前をつける

基本的に英語で命名し、**ぱっと見ただけで分かりやすい名前**をつけます。

```ruby
#悪い例
str = "suzuki" #何が入っているか分からない
time = 10  #単位がないので分かりづらい
```

```ruby
#良い例
name = "suzuki" #何が入っているかイメージ出来る
time_sec = 10  #単位があって分かりやすい
```
英語が思いつかない場合は**codic**で調べましょう！
https://codic.jp/engine


###2.列を揃える

```ruby
#悪い例
get '/login', to: 'sessions#new'
get '/auth/:provider/callback', to: 'sessions#twitter'
post '/login', to: 'sessions#create'
post '/logout', to: 'sessions#destroy'
```
上記のままだと、**ごちゃっとして見づらい**です。
以下のように修正します。

```ruby
#良い例
get  '/login',                   to: 'sessions#new'
get  '/auth/:provider/callback', to: 'sessions#twitter'
post '/login',                   to: 'sessions#create'
post '/logout',                  to: 'sessions#destroy'
```

こうすれば見やすいですし、分かりやすくなります。
**過剰にやりすぎると手間になるので、やりすぎはよくありません**が
出来る範囲で揃えるようにしましょう。

###3.適切なコメントを書く


```md
#不適切なコメント
 - コードを見てすぐに分かること
 - 関数名がおかしいなどの修正可能なものを補うコメント
```

```md
#適切なコメント
 - コメンタリーを入れる（こういう背景でこうなったみたいな理由を説明する）
 - 欠陥にコメントをつける(TODOやFIXMEを仕様)
```

###4.マジックナンバーは使わない
**マジックナンバーとは、プログラムに突然出てくる謎の数字のことです**。書いた本人しか分からない魔法の数字です。

```ruby
#悪い例
apple_price = 110

if apple_price < 100
    puts "買う"
else
    puts "買わない"
end
```
急に100という数字が出てきました。
何を基準にしている数字なのか分からないので
名前をつけましょう！

```ruby
#良い例
my_pocket_money = 100
apple_price = 110

if apple_price < my_pocket_money
    puts "買う"
else
    puts "買わない"
end
```
「所持金が足りないので、買えない」ということが理解できます。

###5.同じコードを繰り返さない
**DRY(Don't repeat yourself)**を守り、むやみにコードを**コピペしたりしないようにしましょう**。
量が増えることで、読む時間がかかり、修正にも時間がかかってしまいます。

**コピペしたときは、まとめれるか考えましょう**。
#### まとめる方法
1. モデルにメソッドを定義する
1. ヘルパーにメソッドを定義する

以下、参考文献です。

参考文献：[DRY原則をもう一度 -コンカレント・エンジニアリング-](https://qiita.com/Koki_jp/items/d5f1b5f277b581888a1f)

###6.if文のネストを浅くする

```ruby
#悪い例
if user.name == "suzuki"
  if user.age == 20
     if user.male
        puts "知り合いです"
     end
  end
end
```
ネストが深すぎると読みにくくなってしまいます。
多くても2重までにしましょう。

```ruby
#良い例
return unless user.name == "suzuki" && user.age == 20
  if user.male
    puts "知り合いです"
  end
```
**returnはif文から抜け出すときによく使われます。**

以上のようにすると、ネストを浅くすることが出来ます。

#終わりに
少しでも読みやすいコードを書けるように、日々意識することが大切だと思うので、可読性の高いコードが書けるように日々精進していきます。
qiitaで要約のことTLDRって書くやつ

引用: https://swallow.5ch.net/test/read.cgi/livejupiter/1567744421/

1風吹けば名無し2019/09/06(金) 13:33:41.04ID:fzqnEq78d
キメーんだよ
なんのことかと思ったわ


2風吹けば名無し2019/09/06(金) 13:34:33.83ID:neGBNmeIH>>6
分かるわ、どんだけ海外かぶれてーんだよって話やで本当にルー大柴かよ

3風吹けば名無し2019/09/06(金) 13:34:35.80ID:ob46EcQp0
tl;drやぞ

4風吹けば名無し2019/09/06(金) 13:34:46.20ID:8Kc3Z+T4a
TLDRして

5風吹けば名無し2019/09/06(金) 13:35:02.44ID:fzqnEq78d
ちなtoo long didn't readの略

7風吹けば名無し2019/09/06(金) 13:35:45.45ID:oNcWb8NU0
プログラマがキータイプ数なるべく短くするのは別に違和感ないけど
しかもどの人間も自分さえわかればいいやつらばっかだし

8風吹けば名無し2019/09/06(金) 13:35:58.67ID:oqo/5ZwQp>>11
例をe.g.もムカつく
せめてexやろ

11風吹けば名無し2019/09/06(金) 13:38:23.22ID:fzqnEq78d
8
わかる
ラテン語らしいな

10風吹けば名無し2019/09/06(金) 13:36:31.00ID:LdsUEypJ0
ギータ？
WSL-UbuntuへのAdoptOpenJDK11のインストール

# はじめに
WSL(Windows Subsystem for Linux)へのAdoptOpenJDKをPPAで公開されているバイナリを使ってインストールする際につまずいたので情報をまとめたいと思います。

# 参考サイト
[AdoptOpenJDK installers](https://launchpad.net/~rpardini/+archive/ubuntu/adoptopenjdk)

# ポート監視の無効化
作業用のPCにはカスペルスキーがインストールされていますが、ポート監視の設定などを行わないとSSL認証などが行えずエラーになってしまいます。今回この設定のせいで2～3時間、悩むことになりました。

&nbsp;1. kasperskyの管理コンソールから[設定]→[ネットワーク]を選択
&nbsp;2.「暗号化された接続のスキャン」項目の「暗号化された接続のスキャンする」を無効化
&nbsp;3. ネットワークポート項目の「設定したネットワークポートを監視する」の詳細項目を選択
&nbsp;4. 80番と443番ポートの監視を無効化　※下記図参照
![cap1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390539/10eaf927-5b95-6370-c5ae-47291b245401.png)

# sources.listへのダウンロード先の追加
[参考サイト](https://launchpad.net/~rpardini/+archive/ubuntu/adoptopenjdk)へも記載されていますが、/etc/apt/sources.listへ下記の内容を登録します。
※自分はソースが不要だったため、deb-srcは無効化しました。

```
deb http://ppa.launchpad.net/rpardini/adoptopenjdk/ubuntu bionic main 
# deb-src http://ppa.launchpad.net/rpardini/adoptopenjdk/ubuntu bionic main
```

# 公開鍵の追加
&nbsp;1. [参考サイト](https://launchpad.net/~rpardini/+archive/ubuntu/adoptopenjdk)の「Signing key：」のリンクをクリックし、リンク先の「Search results for '0x・・・'」の0x以降がKeyIDになるのでそれをコピー
&nbsp;2. 公開鍵を登録、[KeyID]に上の手順でコピーしたキーを貼付け

```
# sudo apt-key adv --keyserver keyserver.ubuntu.com --recv [KeyID]
```

# AdoptOpenJDK11のインストール
後はapt-getでインストールする。

```
# sudo apt-get update
# sudo apt-get install adoptopenjdk-11-installer
```
vagrantでcentos7をインストールする際のOpenSSL SSL_read: Connection reset by peer, errno 54というエラーを解決した

vagrantでcentos7をインストールしようと思い、[こちら](https://blog.centos.org/2019/07/updated-centos-vagrant-images-available-v1905-01/)を参考にcentos7のboxをインストール。

```
% vagrant box add centos/7
```

しかし、上記コマンド実行後に`OpenSSL SSL_read: Connection reset by peer, errno 54`というエラーが出た。

```
% vagrant box add centos/7
==> box: Loading metadata for box 'centos/7'
    box: URL: https://vagrantcloud.com/centos/7
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) hyperv
2) libvirt
3) virtualbox
4) vmware_desktop

Enter your choice: 3
==> box: Adding box 'centos/7' (v1905.1) for provider: virtualbox
    box: Downloading: https://vagrantcloud.com/centos/boxes/7/versions/1905.1/providers/virtualbox.box
    box: Download redirected to host: cloud.centos.org
An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again.

OpenSSL SSL_read: Connection reset by peer, errno 54
```

## 原因
ダウンロード関係のファイル等が格納されている`~/.vagrant.d/tmp`フォルダに、ダウンロードに失敗したゴミファイルが残ってしまっているのが原因だった。

```
% ls ~/.vagrant.d/tmp
box2105a8feebeaa01a32d7ed5e2fdbadf5b94181a5
```

## 解決方法
ゴミファイルを削除。

```
% rm ~/.vagrant.d/tmp/*
zsh: sure you want to delete the only file in /Users/username/.vagrant.d/tmp [yn]? y
remove /Users/username/.vagrant.d/tmp/box2105a8feebeaa01a32d7ed5e2fdbadf5b94181a5? 
```

これで再度`vagrant add`を実行したら無事インストールされた。

```
% vagrant box add centos/7
==> box: Loading metadata for box 'centos/7'
    box: URL: https://vagrantcloud.com/centos/7
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) hyperv
2) libvirt
3) virtualbox
4) vmware_desktop

Enter your choice: 3
==> box: Adding box 'centos/7' (v1905.1) for provider: virtualbox
    box: Downloading: https://vagrantcloud.com/centos/boxes/7/versions/1905.1/providers/virtualbox.box
==> box: Box download is resuming from prior download progress
    box: Download redirected to host: cloud.centos.org
==> box: Successfully added box 'centos/7' (v1905.1) for 'virtualbox'!
```
Spacemacsでob-scalaが見つからない現象

# 概要

```
apply: Cannot open load file: No such file or directory, ob-scala
```

Windows10でSpacemacsを使っている時。 `.spacemacs`の設定を再読み込み ( `Space f e R`)すると、上記のエラーが出る。





# 引き金となっているレイヤー
`org`レイヤーのような気がする。

`org`レイヤーと `scala`レイヤー、両方の設定を有効にするとエラーが起こる（片方なら平気）

`org`については似た議論が2年前に展開されていたが、うーん。

[File is missing: Cannot open load file, No such file or directory, ob-scala](https://emacs.stackexchange.com/questions/38306/file-is-missing-cannot-open-load-file-no-such-file-or-directory-ob-scala)

`ob-scala`は `org`から削除されていてMelpaパッケージの `scala-mode`にあると言われているが、最近 `scala-mode`からも消えてしまったみたいなことが書かれている。





# ひとまずの対処
`org`レイヤーと `scala`レイヤー、どちらかの設定は無効にしておく。

幸い `org`レイヤーを使っていないので、こちらを無効にしている。

とはいえ使う機会があれば詰みなので、根本的に解決したい。。。
C++, Go, Julia, Kotlin, Rust, Swift5 で競争

計算が速そうな6つの言語で、競争してみた。

種目は、64bit 整数を固定小数点数として使ったマンデルブロ集合の計算。
マシンは MacBook Pro (Retina, 15-inch, Mid 2015)。つまり、x86-64。

## ソースコード

全部乗せると長いので、一番短くなった Kotlin のを載せる：

```kotlin:kotlin
fun isMandel(rep: Int, lim: Long, x: Long, y: Long): Boolean {
    var zr = 0L
    var zi = 0L
    for (i in 0 until rep) {
        val zrNext = zr * zr / lim - zi * zi / lim + x
        val ziNext = zr * zi * 2 / lim + y
        val dist2 = zrNext * zrNext / lim + ziNext * ziNext / lim
        if (4 * lim < dist2) {
            return false
        }
        zr = zrNext
        zi = ziNext
    }
    return true
}

fun countMandel(rep: Int, div: Int): Long {
    val lim = 1L.shl(div)
    var count = 0L
    for (y in (-lim)..lim) {
        for (x in (-lim)..lim) {
            if (isMandel(rep, lim, x, y)) {
                count++
            }
        }
    }
    return count
}

fun main(args: Array<String>) {
    val rep = if (args.size <1) 100 else args[0].toInt(10)
    val div = if (args.size <2) 8 else args[1].toInt(10)
    println("rep=$rep  div=$div")
    println("result=${countMandel(rep, div)}")
}
```

他の言語については https://github.com/nabetani/ml-mandel を参照のこと。

書くにあたって

* inline 指定はしない(そうしたければコンパイラが勝手にやれ)
* 型はできるだけちゃんと書く(特に Julia)
* clang などの `-O2` ぐらいの感じで最適化オプションを指定する

ということにした。

C++ と Go 以外はほとんど書いたことがないん言語なんだけど、まあ大丈夫かなと思っている。

## 各処理系のバージョン

|名前|バージョン|
|:--|:--|
|clang++|Apple clang version 11.0.0 (clang-1100.0.33.17)|
|g++|(Homebrew GCC 9.2.0_3) 9.2.0|
|Go|go version go1.13.8 darwin/amd64|
|Julia|julia version 1.1.0|
|kotlin|Kotlin version 1.3.61-release-180 (JRE 12+33)|
|rustc|rustc 1.30.1 (1433507eb 2018-11-07)|
|Swift5|Apple Swift version 5.1.3 (swiftlang-1100.0.282.1 clang-1100.0.33.15)|

## 測定方法

まずは、引数なしで実行。
その後、 `time hoge 1000 9` みたいに実行して、 real の値を拾った。
real を拾ったのは処理系が勝手にマルチスレッドにした場合に備えたもの。まあそんな人いなかったと思うけど。

## 結果

|処理系|処理時間|補足|
|:--|--:|:--|
|C++ with clang|5.842秒|バイナリを実行|
|C++ with gcc|14.842秒|バイナリを実行|
|Go|15.951秒|バイナリを実行|
|Julia|7.857秒|`time julia main.jl 1000 9` で実行|
|Kotlin|9.602秒|`time kotlin MainKt 1000 9` で実行|
|Rust|14.822秒|バイナリを実行|
|Swift5|14.962秒|バイナリを実行|

kotlin は、コンパイル済みの class ファイルを `kotlin` コマンドに渡した。渡されているのは生バイナリじゃないし、kotlin コマンドの起動時間を含んでいるのでハンデがあると思う。

julia は、ソースコードを `julia` コマンドに渡したのでコンパイル時間を含んでいるかもしれない。コンパイル結果をキャッシュされたりしてるかもしれない(未確認)。いずれにせよ少なくとも julia コマンドの起動時間を含んでいるのでハンデがあると思う。

## 思ったこと

実行前の予想としては
　　速い ← C++勢 < Swift5 ≒ Rust [壁] Julia [壁] Kotlin < Go →　遅い
だったんだけど、
　　速い ← clang [壁] Julia < Kotlin [壁] Rust ≒ gcc ≒ Swift5 < Go →　遅い
という意外な結果になった。

clang が速いのは、たぶん `lim` による除算が全部シフトで行けるとコンパイラにバレたからだと思う(未確認)。
gcc はそれに気づかず、除算命令を発行したんじゃないかな(未確認)。それにしても遅い気がする。

Kotlin と Julia の速さに驚いた。
この内容で gcc を遥かに凌駕するとは。
ネットワークカメラ（RTSPで配信）の映像をFFmpegで録画する


# はじめに
この記事では、ffmpegでrtspで配信される映像をFFmpegを使って録画および確認するコマンドを紹介します。

# 環境
mac Mojave
ネットワークカメラ：Panasonic BB-SP104W
　　　↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103795/47a41037-57ab-79f7-a50d-d97d3e0e4d41.png)
# コマンド

rtspで配信される映像をmp4形式で記録するコマンドです。

```
$ ffmpeg -i rtsp://admin:password@192.168.0.10:554/MediaInput/h264 -f mp4 out.mp4
```

rtspで配信される映像を確認するコマンドです。

```
$ ffplay -i rtsp://admin:password@192.168.0.10:554/MediaInput/h264
```

ffplayコマンドを実行すると以下のように映像を確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103795/a34aa1c9-3bca-3f90-8a11-6a5ae5347dfd.png)

以上。
５つのプログラミング言語のまとめ

これから学ぶ５つのプログラミング言語について、概要をまとめます。
#HTML
*HTML（HyperText Markup Language）*

 - ウェブページを作成するために開発された言語。インターネット上で公開されてるウェブページのほとんどは、HTMLで作成されている。

 - HTMLはプログラミング言語ではなくマークアップ言語と言い、意味付けしたい箇所をタグで囲んで（マークアップ）して表現するのが特徴。
 - 文書内の各部分に目印をつけて、その部分がどんな要素なのかを明確にすることで、コンピュータがその文書の構造を理解できるようになる。 

 - HTMLには「HTML」「XHTML」「HTML5」など、いくつか種類があり、使えるタグに違いがある。

#CSS
*CSS(Cascading Style Sheets)*

- HTMLのレイアウトを指定するための言語。

- HTMLは文字情報だけでレイアウトの規格がないが、CSSを用いることで、要素に対して文字の大きさや色、罫線の太さ、位置などのレイアウトを指定できる。
- どのHTMLタグに対して見合えを調整するか（セレクタ）、 どういった内容のデザインを施すか（プロパティ）、プロパティはどの程度か（値）といった要素を用いて見栄えを整える。

#JavaScript

- 動的なWebページを作成する事のできるプログラミング言語。通常はブラウザ上で実行される。
 
- キーボードやマウス操作で画面を動かせたり、アニメーションを表示したりすることができる。

- 名前の似ているJavaとは別のプログラミング言語。


#Ruby


- プログラマーにとってコーディングしやすいプログラミング言語となっており、直感的に、実装したい機能をコーディングできる。
- WEBアプリケーションなどでよく使われる言語。

- 大手料理レシピサイトのcookpadもRubyが使用されている。
- オブジェクト指向言語である。（オブジェクト指向：プログラムを手順ではなくて、モノの作成と操作として見る概念）

#Ruby on Rails
- Rubyで使えるWebアプリケーションのフレームワーク。

- アプリケーションの開発を他のフレームワークより少ないコードで簡単に開発できるよう考慮し設計されている。

- スピード感をもって開発を行うベンチャー企業などに人気の技術。
pandas で 最大値を抽出する。

まず、
output_filesというディレクトリ(フォルダ)に
data.csvという名前のcsvファイルをつくる。

中身は
apple, 4
banana, 5
orange, 15
となっている。

```:data.csv
apple, 4
banana, 5
orange, 15
```

このcsvファイルから、
数値が最大である15を抽出し、
15のある列に一緒に書かれているorangeを出力させる事を目標とする。

```py:main
import pandas as pd

#data.csをdfとして読み込む。
#0列目の名前をfru_name、1列目の名前をcountとする。
df = pd.read_csv('output_files/data.csv', names=['fru_name', 'count',])

#df(data.csvを読み込んだもの)をそのまま出力させる。
print(df)
print('####################')
#countの最大値があるindexを出力させる。
print(df['count'].idxmax())
print('####################')
#countの最大値があるindexの0列目を出力させる。
print(df.iat[df['count'].idxmax(), 0])
print('####################')
```

```:実行結果
  fru_name  count
0    apple      4
1   banana      5
2   orange     15
####################
2
####################
orange
```
各種OSでのネットワーク再起動コマンド一覧

# 概要

OSの初期設定を手動で実行している場合などに、各種OSで、このOSだと何だっけな、と一瞬考えることがあるので、そういうときのために一覧でメモしておきます。


## Ubuntu

```console
sudo service network-manager restart
```

関連ドキュメント：

- Ubuntu Documentation [NetworkConfigurationCommandLine/Automatic
](https://help.ubuntu.com/community/NetworkConfigurationCommandLine/Automatic)

## Alpine Linux

```console
/etc/init.d/networking restart
```

関連ドキュメント：

- [Configure Networking](https://wiki.alpinelinux.org/wiki/Configure_Networking)

## Debian

```
sudo /etc/init.d/network-manager restart
```

or

```
sudo /etc/init.d/wicd restart
```


関連ドキュメント：
- Debianリファレンス [第5章 ネットワークの設定](https://www.debian.org/doc/manuals/debian-reference/ch05.ja.html)


## CentOS (6.x) / RHEL

```console
/etc/rc.d/init.d/network restart
```

関連ドキュメント：

- [9.3. インターフェース制御スクリプト](https://access.redhat.com/documentation/ja_jp/red_hat_enterprise_linux/6/html/deployment_guide/s1-networkscripts-control)

## CentOS (7.x-) / RHEL

```console
systemctl restart network
```

関連ドキュメント：

- [ネットワークガイド](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html-single/networking_guide/index)

## macOS

アダプタen0の接続の再起動の例：

```console
sudo ifconfig en0 down
sudo ifconfig en0 up
```

関連ドキュメント：

- 公式サイトに適当なものが見つけられませんでした。man ifconfigしてください。

## Windows

Uni*X系、Linux系とは少し趣が異なりますが、Microsoftのサイトによると、下記コマンド群が関係します。
状況によって必要な最低限のコマンドは異なりますが、一式すべてリセット、という意味でのコマンドが下記となります。

```console
netsh winsock reset
netsh int ip reset
ipconfig /release
ipconfig /renew
ipconfig /flushdns
```

関連ドキュメント：

- Windowsサポート [Windows のネットワーク接続の問題を解決する](https://support.microsoft.com/ja-jp/help/10741/windows-fix-network-connection-issues)

## FreeBSD


```console
/etc/rc.d/netif restart
```

関連ドキュメント：

- FreeBSD Handbook[11.5. Setting Up Network Interface Cards](https://www.freebsd.org/doc/handbook/config-network-setup.html)
素人が応用情報技術者試験の合格を目指す勉強進捗＿その１

2020年2月初めに急に思い立ち勉強を始めてから約1か月が経過しました。
これまでの勉強方法を列挙します。

###スペック
・年齢：　30代前半独身おじさん
・職業：　医療関係
・情報関連：　ど素人。趣味でプログラミングしている程度（Excel VBA, Java, Python）

###勉強時間
平日は４時間程度、休日は６時間程度を勉強に費やしています。

・平日
08:30-17:15　仕事
19:00-24:00　睡眠
24:30-05:00　勉強

###勉強内容（午前問題）
他ブログ様と同様、過去問から（だけを）重点的に勉強しています。過去問は直近のものから順番に過去に遡っています。
１か月（勉強時間 約100時間）で７年分に着手しました。
平日の４時間の勉強時間は新規の過去問を覚えることに費やしています。
初めは４時間で１年分（80問）も読み進めることが出来ませんでしたが、２週間も頑張れば徐々にスピードアップしてきました。
４時間以内で１年分を読み終えることが出来た日は、残り時間は新規問題に取り組むことをせず、前日までに読み終えた過去問を復習することにしています。

使用しているテキストは現状、応用情報技術者試験過去問題集パーフェクトラーニング（1780円）のみです。
これは過去問が印刷物として４回分、PDFとして16回分収録されているため、対費用効果が高いと思います。
巷では色々な問題集や参考書が発売・お勧めされているようですが、この20回分をまず覚えることが出来てから、それらの書籍に手を出せばいいのではないかと考えています。

ノートは取りません。メモも可能な限り取りません。ただ過去問を眺めるだけの勉強法です。
ノートなりメモなり、文章としてまとめるのは非効率と考えています。時間だけ費やして頭に残らないのが私です。
その代わり問題の解説部分は、そらんじる事が出来るくらいに何度も何度も何度も読んで覚えます。
１日で覚えることはせず、本番までに覚えることが出来れば良いと楽観視しています。

###勉強内容（午後問題）
勉強を開始して１か月が経ち、そろそろ着手し始めた方が良いかと思って情報セキュリティとプログラミングの過去問４年分を解いてみました。感想は、
・情報セキュリティ：　午前問題の解説を覚えていれば普通に解けそう
・プログラミング：　アルゴリズムの問題だから事前知識が無くても解ける
でした。私は覚えるのが苦手な方で、特に文章を書くのが駄目なので、午後問題はテクノロジ系６題から４題を選択する予定です。
午後問題は本日から力を入れていきます。

###現状評価
「応用情報技術者試験はとにかく覚えることが多い」との前噂通りだと感じています。
ただ、午前と午後で知識を問う分野に関しては、問題の傾向は変わらないのではないかと感じており、
午前問題を十二分に復習して覚えることが午後問題対策になるのでは無いかと感じ始めています
（これは大半の他サイト様の勉強方法と相反するものです）。

合格までの勉強時間としては、こればかりは個々人の能力や勉強方法によって全く異なるとは承知していますが、私のようなずぶの素人であれば、300時間くらいかなと現状考えています。
ただ前述の通り、ノートやメモを取るなどの手を動かす勉強は極力するべきではないと私個人は考えています（特に素人の方）。

本番まで残り50日ほど、毎日気を抜かず勉強を続けていきたいと思います。
MongoDB v4.2以降のdbリネーム

##概要
MongoDB v4.0以前まではdb名を変更する際、
*[データベース名を変更してコピー]→[元のデータベース削除]*
という流れで、リネームが行われてきました

しかし、dbを直接コピーするメソッド
```db.copyDatabase()```
が、v4.2以降から使えなくなったため、今回はv4.2以降でのリネームを行いました！

##手順
*[①対象のdbをアーカイブにダンプ]→[②アーカイブからdbを名前指定して取り出し]→[③元のデータベース削除]*

今回は、db名"sample"を"new_sample"に変更します。

######①対象のdbをアーカイブにダンプ
"sample_archive"アーカイブ上にダンプしていきます
ターミナル上で、

```
$ mongodump --archive="sample_archive" --db=sample
```


######②アーカイブからdbを名前指定して取り出し
```
$ mongorestore --archive="sample_archive" --nsFrom='sample.*' --nsTo='new_sample.*'
```
######③元のデータベース削除
```
$ mongo
> use sample
> db.dropDatabase()
```
[備忘録]Mac開発環境の作りかた

## Command Line Toolのインストール
開発に必要なソフトウェアをダウンロードするために必要なツール

```:ターミナル
$ xcode-select --install
```

## Homebrewのインストール
ホームディレクトリに移動して以下のコマンドを実行
処理には時間がかかる
途中で止まったらエンターを押す
パスワードを求められたらPCのパスワードを入力

```:ターミナル
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

### 無事インストールできたか確認
```:ターミナル
$ brew -v
Homebrew 1.8.0
```

### Homebrewを最新状態へアップデート
```:ターミナル
$ brew update
```

### 権限を変更
```:ターミナル
$ sudo chown -R `whoami`:admin /usr/local/bin
```

以上
Railsでtitleタグの内容をページ毎に変えたい

Ruby on Rails のViewファイルで、タイトルの文言を個別に変更するサンプルです。

サンプル

1.layout/application/htmlファイルのtitleタグ内を下記のように変える。
---------------
<title><%= content_for?(:title) ? yield(:title) : "デフォルトタイトル"%></title>

2.個別ページで、titleの内容を定義する。
-
<% content_for :title do %>
個別ページのタイトルの内容をココに書く。
<% end %>
The Hitchhiker's Guide to GoLand 2019.3

# はじめに

「The Hitchhiker's Guide to GoLand」の 2019.3 版新機能チュートリアルです。
( 2019.2 版は[こちら](https://qiita.com/sokeusu/items/6478d3f1377651f5e0df))

----
## 環境

* macOS Catalina 10.15.2
* GoLand 2019.3.1
* go version go1.13.3 darwin/amd64

----
# TL;DR

1. ショートカットを通して GoLand 2019.3 新機能を知るチュートリアル
2. チュートリアルメニュー
3. 個人的に有益だったチュートリアルの紹介

----
# The Hitchhiker's Guide to GoLand 2019.3 お品書き

チュートリアルは全部で 6 項目あります。

1. Delete unused parameters
2. Delete parameter names
3. Short and long type specification for parameters
4. Better names for error variables
5. Better variable names for the forr live template
6. Create a function from the function type

----
# 個人的に有益だったチュートリアル

1. 「4. Better names for error variables」はダルい for 構文のテンプレートなので使う局面は割とありそう

----
# 1. Delete unused parameters

未使用パラメータを削除する機能。
こういったリファクタ機能が文字列置換と違って便利なのは、関連箇所を文脈的に一括修正できるところですね。
また、このあたりまでくると気付いてきますが、たいていの機能は `option` + `return` からのコンテキストメニューで出てきます。
![ss-the-hitchhikers-to-guide-2019.3-delete-unused-parameter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549453/84f6db57-9de1-fe2f-c5dc-3efb7800d4f5.gif)

----
# 2. Delete parameter names 

チュートリアル説明としては「未使用パラメータを強調表示する」とあります。
前段 1 の赤文字 `string` 型指定部分ですね。
関数書き始めた段階で赤くしてくるので「分かっとるわ！ちょっと黙ってろ！」になることが多いです。
チュートリアルで行う内容は前段 1 と同じなので割愛します。

----
# 3. Short and long type specification for parameters

同じ型指定が連続している場合に省略・冗長をトグルする機能です。
(良し悪しは別として)同じ型の引数が 5 個くらい連続したらまとめてもいいかなと思いますが、チュートリアルのように 2 個程度であれば冗長でもきちんと指定しておきたい派です。
これも `option` + `return` のコンテキストメニューから操作します。
![ss-the-hitchhikers-to-guide-2019.3-Short and-long-type-specification-for-parameters.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549453/25c48096-849c-62c3-1317-9b9739aab9ba.gif)

----
# 4. Better names for error variables

Goland はエラー変数のより良い名前を提案するようになりました！
とあるのですが、なんでそれが `e` なんでしょうね。。`err` じゃないんかい。
![Better names for error variables.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549453/03de329a-20d0-59e4-0cfa-206450f15263.gif)

----
# 5. Better variable names for the forr live template

for 文のテンプレート機能。
スライス型変数に続けて入力で、
`.for` でオフセットのみ受ける for 文。
`.forr` で key:value 形式の for 文になります。
for 文書くのが若干ダルい局面はあるので、効率化を図れるかも知れません。
なお、テンプレートは `command` + `,` で設定を開き、`Live Template` で編集が可能です。
![Better variable names for the forr live template.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549453/247056db-1ea8-3d46-b2b5-fc193f5d4f41.gif)

----
# 6. Create a function from the function type

関数型から関数を作る機能。
なのですが、チュートリアルプロジェクトだと `net/http` が import できていないがために関数定義が読み取れずサジェストが効いていないです。
![Create a function from the function type.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549453/5832dd57-8884-1d1d-dbc1-57976fc72f60.gif)
ので、`go get -t "net/http"` で入れて再録。
今度はちゃんと「Create function 'handler'」が出ました。
![Create a function from the function type2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549453/11c528e7-56dc-0eea-7357-08c4fb8ef8ad.gif)



以上です。
ESP8266でSerial.Beginした後に、Pin3(RX)をGPIO(IN)として使う

　ESP8266を使っていると、様々なパッケージ品が市場に出回っているのに気づきます。
その様々な品の中で、システムの検討で役立つのがESP-01/ESP-01Sであります。
１ケ100円台で購入可能なのですから、大量投入による同時試験が可能になります。
おかげで、私のつたないソースコードでも不具合の早期発見が可能になりました。

さて検討でとても役に立つESP-01/ESP-01Sですが、端子は８ピンしかありません。
８ピンのウチで、電源の±で２本・RESETで１本・ENABLEで１本・
シリアルで２本なので自由に使えるピンは２本だけになります。

その自由に使えるピン２本も電源投入時はLOWだと書き込みモードに入ったりして、
面倒なピンだったりします。（汗

#なのでセンサー入力で使えるピンが欲しい
　センサー入力なので電源投入時のセンサー状態は不定になるので、自由に使えるピン２本に
入れるとセンサーLOWで電源投入すると書き込みモードで起動したりして使えない訳であります。

#そういえばログ出力ってSerialの受信は機能していないのでは？
実をいうと私が作成するプログラムでは簡易デバッグ用にログ出力としてシリアルを使うのですが
ログ出力だけでシリアルからは何も受信していない事に気づきました。
いつも何気なくGND/RX/TXと繋いでいたのですが、電気的にはGND/TXだけでログ出力できちゃう。

#て事は、Serial.Begin()後にRXピンをINPUTにモード変更したらどうなる？
どうなるか判らないので、以下のソースを作って試してみました。
動作結果は、TXピンはSerial出力行えて　RXピンはGPIO(IN)で使うことができました。




```INO:SERIALTEST.INO:
#define READPIN 3
int num;

void setup() {
  Serial.begin(115200);
  delay(1000);
  Serial.println( "SerialInputTest" );
  pinMode(READPIN, INPUT);
  num = 0;
}

void loop() {
   Serial.print( digitalRead(READPIN) );
   Serial.print( ":" );
   Serial.println( num );
   num++;
   delay(1000);
}
```
localStrageメモ

#localstrageとは
クライアント側のみで動く、データを保管するもの。
「情報をブラウザ上に保存しておく場所」


クライアント側のみで動く為、メッセージを送信する際はIDも一緒に送る必要がある。
(inputのvalueに値を指定などで)


#身近な例
ユーザーがあるサービスにログインした場合、ログイン情報をローカルストレージ上に保存しておくことで、次回ユーザーが訪れた時に自動ログインが完了しているパターンなどが考えられます。

#参考
https://toukei-lab.com/localstrage
selenium.common.exceptions.WebDriverException: Message: Process unexpectedly closed with status 1 対応

## こんなエラーが出てしまう場合
```python
    driver = webdriver.Firefox()
  File "/usr/local/pyenv/versions/3.6.8/lib/python3.6/site-packages/selenium/webdriver/firefox/webdriver.py", line 174, in __init__
    keep_alive=True)
  File "/usr/local/pyenv/versions/3.6.8/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 157, in __init__
    self.start_session(capabilities, browser_profile)
  File "/usr/local/pyenv/versions/3.6.8/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/usr/local/pyenv/versions/3.6.8/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/pyenv/versions/3.6.8/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: Process unexpectedly closed with status 1
```

##こんなふうに書き換える
```python
from selenium import webdriver
from selenium.webdriver.firefox.options import Options

options = Options()
options.headless = True
driver = webdriver.Firefox(options=options)
```

##例

```python
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from bs4 import BeautifulSoup
from time import sleep
import pandas as pd

options = Options()
options.headless = True
driver = webdriver.Firefox(options=options)
driver.get('https://nikkei225jp.com/data/karauri.php')
sleep(5)
html = driver.page_source.encode('utf-8')
driver.close()

df_list = pd.read_html(html, header=0)
print(df_list[3].head())
```

結果

```
           日付    日経平均株価  日経平均(変化)  東証一部出来高(百万株)  空売り比率合計  空売り比率(価格規制あり)  空売り比率(価格規制なし)
0  2020-02-28  21142.96   -805.27          2420     44.5           36.9            7.6
1  2020-02-27  21948.23   -477.96          1811     47.4           40.4            7.0
2  2020-02-26  22426.19   -179.22          1677     46.0           38.1            7.9
3  2020-02-25  22605.41   -781.33          1778     44.5           34.8            9.7
4  2020-02-21  23386.74    -92.41          1155     43.5           37.0            6.5

```
ゲーム開発者がやってみた親子Scratch　2回目

今回のサンプルに関してはタイトルやゲームオーバーも作成してみました。

前回に引き続きソースの流用はご自由に！

画像なのですが下記のサイトからいただいております。

https://www.ac-illust.com/

https://www.ac-illust.com/main/detail.php?id=1387916&word=%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%B2%E3%83%BC%E3%83%A0%E7%B4%A0%E6%9D%90

https://www.ac-illust.com/main/detail.php?id=1221225&word=%E3%81%8B%E3%82%8F%E3%81%84%E3%81%84%E3%83%BB%E3%83%A2%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%BC

またタイトルロゴは下記のサイトで作成しております。

https://ja.cooltext.com/#_ebcv=3kxCAMrX.liskul2so.1

ですので、各画像の利用に関しては上記サイトの規約に従ってください。

#■ゲームに関しての説明

Shooting
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530491/7fe8cf71-8cc1-993d-2ddf-6d45b24ce291.png)

https://scratch.mit.edu/projects/372171545

**★スタート**
・スペースキー

**★自機のそうさ**
・左右キー　移動
・スペースキー　ミサイル

敵にミサイルを充てると得点が入ります。敵の種類ごとに点数が違います。
敵は倒しても一定時間で再ポップします。
敵の弾が当たるとゲームオーバー。
ゲームオーバー画面でスペースキーを押すとタイトルに戻ります。
ハイスコアが保存されます。

#■息子の感想

とりあえず遊んでもらいました。

若干難しいとのこと。

あとソースの説明をしました。

かなり難しいとのこと。

この後でもろもろ問題点を列挙していきます。

#■Scratchプログラムの問題点

今回のサンプルですが、作成にかなりの時間を要しました。

下記のような理由からですね。

##・Scratchはスクリプトの構造化が行いにくい

私の知識が足りないだけかもしれませんが、敵キャラクターの動きなどはプログラムとしてまとめたいのですが、それができません。

基本Scratchはスプライトがまずあって、それに動きを付けていく仕組みです。

オブジェクト指向的感覚を学ぶのにはいいと思うのですが、プログラムの構造化を学ぶのには良くないかもしれません。

スクリプトのコピー、ペーストもやりにくいですね。あくまで小さなプログラムを作成するのに向いているような気がします。

##・画面遷移が行いにくい

画面遷移が行いにくいですね。

スプライトに関係しないゲーム全体の初期化であったり、画面遷移の機能をどうやって持たせるのかに悩みます。

あわせて背景の設定をどこで行うかが悩みどころです。

これらに関しては私が知らないだけで定番の形があるかもですね。どなたかご存知の方は教えてください！

現状はタイトルの背景はタイトルロゴ、ゲーム中の背景は自機、それぞれのスプライトで設定しスクリプトを記載しております。

画面遷移の機能がないので、画面遷移が行われた際に実施する処理（ゲーム開始時の初期化）を書くスプライトのスクリプトで行っています。

これがバグがわかりにくくとりにくく時間がかかった原因になりますね。

##・クローンがわかりにくい

クローンの仕組みがわかりにくいです。

スプライトのクローンを作成できるのはいいのですが、個別のクローンを特定して操作することが困難です。

クローンを発生させた後に、ずっとのループの中に入れて操作することは可能ですが、例えば「10番目に作成したクローンのx座標を変更する」というような操作方法がわかりません。

あとループでたくさんのオブジェクトを作成したかったのですが、このやり方も不明です。

本当はインベーダーみたいに横と縦に何列か並べたかったんですよね。

並べるだけではなく、それぞれで制御したかったのですが、あまりにもスクリプトが煩雑になるので断念しました。

##・メッセージが扱いにくい

何かの条件に引っ掛けてメッセージを飛ばすことができます。

そちらの機能自体は素晴らしいのですが、一度メッセージを飛ばした後の制御に難があります。

メッセージが飛んだら敵を登場させて、動かす、というところは可能です。

ただその動かすために基本「ずっと」のループを走らせておかないといけないです。

一度ゲームオーバーになって、もう一度メッセージを走らせたときに前回のメッセージで作成したクローンが死んでいなくてバグる、ということが起こります。

実際のプログラムだとwhile文が個別にたくさんあって、グローバル変数でその初期化や動作を制御するような仕組みになっちゃうわけです。

うーん、scrastchのプログラムといえどもいやだな。

角スプライトで外部で操作したい値は変数化しておいて、どこかでまとめてやる、というのが正しそうですね。

それもスクリプト作成で考えると煩雑でやりたくないです。

あとやはり、グローバル変数をたくさん設定しているような気がして、あまり気が進まないです。

#■現状の結論として

タイトル画面　⇔　ゲーム画面

のような画面遷移を挟むものは組みにくいですね。

単純にスクロールするだけのものだったらいけるのかなあ。

ループさせるより、毎回旗を押させてゲームを始めるようなせっけいしそうなのかもしれません。

スプライトをスクリプトで制御させる仕組みはとっつきはいいのですが、プログラムの別の醍醐味である、複雑な処理を簡単に書く、という部分が実現しにくいですね。

現状息子は自分で考えてゲームを作成するというところまではいっていません。

それを実現するためにわかりやすいさんぷるがたくさんあればいいだろうということでさくせいしているのですが、今回のサンプルは明らかに複雑でそういった目的に適していません。

次回以降はきれいに作ることは考えず、サンプルとして使いやすいものという観点で作成していこうと思います。

あとは構造化やアルゴリズムを覚えるための別のプログラミング言語を探さないとですね。

こちらもお勧めのものがありましたら教えてくださいー
heroku.ymlでDockerアプリケーションをデプロイする

## TL;DR
`heroku.yml`を使用してDjangoアプリケーションをDockerコンテナに入れてHerokuで動かします。
（ですので`Procfile`は使用しません）

※基本的に下記公式ページに則って対応すれば問題なしです。
https://devcenter.heroku.com/articles/build-docker-images-heroku-yml
今回はとても簡単に最小構成でお送りします。

## まずは必要なファイルを用意してGitへpushする
といっても最小構成なので２ファイルだけです。各ファイルは以下の通りです。

```dockerfile:Dockerfile
FROM python:3.7
ADD . /var/www/html
WORKDIR /var/www/html
RUN pip install -r ./requirements.txt
CMD gunicorn attakait_hp.wsgi --log-file -
```

```yml:heroku.yml
build:
  docker:
    web: Dockerfile
```

これらをプロジェクトのルートディレクトリに配置して、ご自身のリポジトリへpushします。

## `heroku stack:set container` を実行する
DockerコンテナをHeorkuで使用するために、下記コマンドを実行します。

```bash
heroku stack:set container -a heorkuのご自身のアプリケーション名
```

## 最後にherokuでデプロイすれば完了です。
最後にアプリケーションをHerokuへデプロイしましょう。
手動デプロイされている方は、`Deploy Branch`を押します。
![スクリーンショット 2020-02-29 12.11.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319350/e88d1716-63dc-26c5-d34a-804908013aed.png)

以上、終わり。
【制御工学】PID制御とステップ応答の可視化・分析

#1 はじめに
前回記事( https://qiita.com/sato235/items/5e006ebbf2949cf59463 )のなかで、制御器を入れた回路にて、ステップ入力とステップ応答の可視化を推奨されたので、今回の記事を作成した。
ゆくゆくは、ロボットの制御系設計に役立てたい。

#2 参考文献
##2.1 書籍
[1] 南裕樹　著、オーム社、「Pythonによる制御工学入門」

##2.2 Webページ
[a] 制御ブロック図: https://tajimarobotics.com/pid-block-diagram-transfer-function/
[b] 【制御工学】Pythonによる伝達関数のグラフ化: https://qiita.com/sato235/items/5e006ebbf2949cf59463
[c] 【制御工学】Pythonによる伝達関数や状態空間モデルの計算: https://qiita.com/sato235/items/f991411074c578d1640c

#3 実施内容
##3.1 PID制御のブロック図
![ブロック線図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509872/228337c2-5923-fcd8-3d77-9ab0ccb1af38.png)
出典: [a]

上記の「C」が制御器に相当する。
上記のフィードバック制御回路を、伝達関数にし、ステップ入力・応答を可視化する。

##3.2 伝達関数

```py:初期値
K=1
Kd=1
Wn=1
Ki=1
ita=1
Kp=1
```

伝達関数を作成

```py
C=matlab.tf([Kd, Kp, Ki],[1,0])
G=matlab.tf([K*Wn**2],[1,2*ita*Wn, Wn**2])
H=1
print("H")
print(H)
print("------------")
print("C")
print(C)
print("------------")

print("G")
print(G)
print("------------")


CG=matlab.series(C,G)
print("C*G")
print(CG)
print("------------")

CGH= matlab.feedback(CG,H,-1)
print("C*G/(1+C*G*H)")
print(CGH)
print("------------")
```

出力は以下の通り。

```py
H
1
------------
C

s^2 + s + 1
-----------
     s

------------
G

      1
-------------
s^2 + 2 s + 1

------------
C*G

  s^2 + s + 1
---------------
s^3 + 2 s^2 + s

------------
C*G/(1+C*G*H)

     s^2 + s + 1
---------------------
s^3 + 3 s^2 + 2 s + 1

------------
```

##3.3 ステップ入力・応答
上で作成した伝達関数を用いて、ステップ入力と応答を可視化する。

```py
t = np.linspace(0, 3, 1000)
yout, T = matlab.step(P, t)

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(T,yout, label="step response")
ax.plot(T,[1]*1000, linestyle="--", label="step input")
ax.set_xlabel("time[s]")
plt.legend(bbox_to_anchor=(1, 0.25), loc='upper right', borderaxespad=0, fontsize=11)
```

図にまとめると以下の通り。

![step_input_response.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509872/b6c5773e-1947-5e17-fe06-e560a7231a2f.png)


#4 まとめ
・制御器を入れたフィードバック回路でのステップ応答まで可視化できた。
・次は、安定性の考察や、C,G,Hの関数の係数を変えた場合の挙動の比較などを行いたい。
プログラミング初心者の俺がGeoDjangoで業務効率化地図アプリを作りきった話

# はじめに
本記事はPythonを使った開発フレームワーク、Djangoを使ってウェブアプリPublic Mappingをプログラミング初心者の私が開発した、開発記録のうち「経緯編」です。

アプリの構成、開発プロセスの詳細については[「開発後記編」](https://qiita.com/hiro-ishi/items/823a4301272348f835cb)をご参照ください。
※アプリについては現在停止中（2021年5月1日現在）
[公開リポジトリはこちら](https://github.com/hiro-ishi/publicmapdeploy)

# コンセプト：どんなアプリ作ったの？？
- 位置情報とメモを地図上で簡単に記録できて
- どこからでも参照・編集ができる（webアプリ）
- 印刷しても一目でわかる 
 
少人数チームでの運用を想定した地域の情報共有メモアプリを作成しました。
![app_overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304391/1e5967dd-b87f-6957-f51a-6619bad25ca0.png)



# なんでこのアプリが必要なの？
[アプリの作成意図をまとめた企画書はこちら](https://www.slideshare.net/hiroakii1/public-mapping)
**私、現職建設コンサルタントで環境アセスメントを主に担当しております。**
工事現場や工事予定箇所に赴き、現地の自然環境、社会環境に関わる情報を調査し、まとめ、環境保全対策を提案したり、実施したりするのが仕事です。
実際に調査をスムーズに実施するにあたっては、現地の情報に精通している必要があります。

*どこどこに希少植物が生えている、現場にいくにはこの道を通るのが近道だ、過去にはここで希少動物の目撃情報があった、、、、*

こういった調査対象に関する情報以外にも、

*トイレ休憩できる最寄りのコンビニはここだ、安全に車を停められる駐車場はここしかない、現地でお世話になっている住民の住所は＊＊＊、ここのラーメンは現場に行ったら食わにゃあかん、警察の取締りがよくある場所は、、、*

など、安全に、円滑に現地での作業を実施するにあたって必要な情報はたくさんあります。

## 何が課題なの？
しかし、調査報告書、成果品に残るのは前者の情報のみであって、調査にあたって必要な後者の情報をどう管理するかは、調査チームそれぞれのやり方、担当者個人のやり方に委ねられているのが常です。（それゆえ、現地に精通した技術者、調査員はバリューを持つわけですが・・・）

また、現地の状況はアップデートされていくもの。個人が手元の地図にメモで残していたり、メールでのやりとりで情報を共有したり、、、色々な情報が日々行き交い、蓄積していきます。
チーム内でルールが定められておらず、情報共有がうまくいかない時、問題が起こります。

![Screen Shot 2020-03-05 at 11.45.38 pm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304391/2825a100-1369-e55d-82d7-8c373de07988.png)

そういったトラブルを未然に防ぐため、既存の位置情報記録アプリや、GISソフトウェアを使った位置情報管理が考えられるわけですが、今度はこんな声が現場から、、、

![Screen Shot 2020-03-05 at 11.43.59 pm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304391/a5cd7ef5-983c-434d-cd07-d2670e0a3ad6.png)

## どうすれば現場の課題は解決されるの？
そんな現場から声を受け、現場が抱える課題を解決するため、以下の３点を実現するアプリを作りました。
・パブリッククラウドを使えない　→　レンタルサーバーか自社サーバー上にサーバーを置ける
・多機能なGISソフトは使いにくい　→　必要最低限の機能に絞って不慣れな人でも簡単に操作できる
・スマホ、パソコン使えない時は？　→　印刷して持ち歩けるような地図レイアウト

![Screen Shot 2020-03-06 at 12.21.08 am.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304391/d2be7ac5-a044-6def-2569-3b66a7f90298.png)

# なんで自分で作ったの？
一言で言ってしまえば、**Webアプリ開発かっこいいよね！やってみたい！！**という憧れがあったからです。
地図アプリというジャンルを選んだ理由は、現場の課題解決に貢献したい、そして、自分も現場管理で楽をしたい、という自分の内から溢れ出るモチベーションを感じたからです。
調査業務の管理をする傍ら、GISオペレーターとしても動いており、触ったことのなかったwebGISについてちゃんと学んでみたかった、という自己研鑽目的でもあります。

# 今後の展望
集めた位置情報は解析して意味を見出してナンボです。
Djangoの使用言語であるPythonには位置情報に関する統計解析パッケージが豊富に存在します。
今回アプリを作成したことで、web上で位置情報を扱う基礎を学べました。
今後は、webアプリに地理的な解析を適用し、

現地調査→データの取得→データ解析→解析結果の表現

までをワンストップでできるようなアプリの作成に挑戦したいと考えています。
Service層を意識したLaravelのMVCモデル（実践編）

##はじめに
前回[Service層を意識したLaravelのMVCモデル（概念編）](https://qiita.com/yukachin0414/items/3afafa63bd0796f8f3df)についてまとめたので、こちらも参考にしていただければと思います。
前回は仕組みについてまとめたので今回は実際にどんな感じにコーディングするのかまとめてみました。

##実際にコードを覗いてみましょう
今回はDBに登録済みのユーザーデータを取得し一覧画面に表示するというコーディングをします。

###コントローラ層：必要な情報を整理して画面表示や処理を指示する

```php:UserController.php
<?php
namespace App\Http\Controllers;

use App\Services\UserService;
use Illuminate\Support\Facades\DB;
use Illuminate\View\View;

/**
 * ユーザーに関するコントローラークラス
 * @package App\Http\Controllers
 */
class UserController extends Controller
{
    /**
     * ユーザー一覧画面表示
     * @return ユーザー一覧
     */
    public function index() :View
    {
        $users = UserService::getUsers();
        return view('user.index', compact('users'));
    }
}
```

###サービス層：取得したデータの並び替えなどの加工をする

```php:UserService.php
<?php
namespace App\Services;

use App\Models\User;
use Illuminate\Database\Eloquent\Collection;

/**
 * ユーザー情報のサービスクラス
 * @package App\Services
 */
class UserService
{
    /**
     * 全ユーザー情報取得
     * @return Collection 全ユーザー情報
     */
    public static function getUsers(): Collection
    {
        return User::getUsers();
    }
}
```

###モデル層：データを取得するなどDBの操作をする

```php:User.php
<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Collection;

/**
 * ユーザーテーブルのモデルクラス
 * @package App\Models
 */
class User extends BaseModel
{
    /**
     * 全ユーザー情報取得
     * @return Collection 全ユーザー情報
     */
    public static function getUsers(): Collection
    {
        return self::all();
    }
```

##おわりに
今回は簡潔にまとめるために並び替えや取得するデータの指定などはしませんでしたが、ぜひ試してみてください。
AWS STSを使ってみる


#STSとは...

AWS Security Token Serviceの略称で、一時的な認証情報を発行。
認証情報として、「アクセスキー」、「シークレットキー」、「セッショントークン」の3つが発行されるが、
あくまで期限付きで一時的に権限を付与する用途で用いられる。


STSで権限付与を行うためには、以下IAMユーザとIAMロールが必要になる。
これらはお互いに同じアカウントに所属していても、違うアカウントに所属していても良い。

>1. 権限を引き受けるIAMユーザ
1. 付与する権限の塊であるIAMロール

また、それぞれが下記のポリシー/信頼関係を持つ必要がある。(ロールには、実際にユーザが使いたい権限(EC2操作など)も付与)

## 既存の下記ポリシーをAssume RoleするIAMユーザへ追加する

```ruby:1.権限を引き受けるIAMユーザに付与するポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "sts:AssumeRole"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:iam::<アカウントID>:role/<Assume RoleするIAMロール名>"
            ]
        }
    ]
}
```

## ロール作成時に「信頼関係」を編集。IAMユーザからのAssume Roleを引き受けるために信頼関係を定義

```ruby:2.付与する権限の塊であるIAMロールに付与する信頼関係
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<アカウントID>:user/<Assume Role実行するIAMユーザ名>"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

ロールがユーザに権限を付与する最大制限時間はロールの下記の部分から指定可能である。 (１時間〜12時間まで)。
後続の②のduration-secondではこの時間の範囲内で時間指定可能。
![Screen Shot 2020-02-29 at 11.58.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245585/621939c1-0253-877e-18d9-46699ef901e0.png)

#この状態でSTSが下記のユースケースで可能。
## ①IAMユーザでAWSコンソールログイン状態でスイッチロールが可能
<img width="1228" alt="Screen Shot 2020-02-29 at 12.35.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245585/d2d496b1-356f-d910-5baa-19764a57ef3a.png">

##②IAMユーザのクレデンシャル情報をセットしたEC2などでAsuume Roleを実行してAWS CLI/SDKで利用

```rubvy:AssumeRole実行前
# aws ec2 describe-instances

An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.
```
```ruby:AssumeRole実行
# aws sts assume-role \
>   --role-arn          arn:aws:iam::<アカウントID>:role/sts_role \
>   --role-session-name sts-session \
>   --duration-second   900 \
>   --profile          default

{
    "AssumedRoleUser": {
        "AssumedRoleId": "xxxxxxxxxxxxxx:sts-session", 
        "Arn": "arn:aws:sts::<アカウントID>:assumed-role/sts_role/sts-session"
    }, 
    "Credentials": {
        "SecretAccessKey": "xxxxxxxxxxxxxxxxxxxx", 
        "SessionToken": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 
        "Expiration": "2020-02-29T03:29:34Z", 
        "AccessKeyId": "xxxxxxxxxxxxxxxxxxxx"
    }
}

```
```rubvy:AssumeRole実行後

# export AWS_ACCESS_KEY_ID="xxxxxxxxxxxxxxxxxxxx"
# export AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxx"
# export AWS_SESSION_TOKEN="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# aws ec2 describe-instances
→duration-secondで指定した期間は実行可能

→duration-secondで指定した期間外は実行不可能
「An error occurred (RequestExpired) when calling the DescribeInstances operation: Request has expired.」

```
コントリビューターが使ってるIonicデフォルトCSS

英語よりも日本語のほうがフォントサイズが大きく見えることが多々あります。Web技術でモバイルアプリをつくることができるIonic Frameworkも例外ではなく、デフォルトテンプレートは英語では格好よくみえるのですが、テキストを日本語に入れ替えると少し野暮ったくみえがちです。

そこで、私はいつも以下を `overwrite.scss` として配置して、デフォルトのフォントサイズを上書きしています。これからデザインする方の参考になりましたら幸いです。

```scss
html {
  font-size: 90%;
}

ion-toolbar {
  --background: var(--ion-background-color) !important;
  & * {
    font-size: 1rem;
    font-weight: normal;
  }
  ion-buttons {
    * {
      font-size: 1rem !important;
    }

    ion-button ion-icon[slot=icon-only] {
      font-size: 1.2rem !important;
    }

    ion-back-button {
      font-size: 0.8rem !important;
    }

    ion-button[fill="outline"] {
      font-size: 0.9rem !important;
      max-height: 26px;
    }
  }
  ion-back-button {
    padding-left: 8px;
  }

  ion-segment {
    padding: 0;
  }
}

ion-alert {
  .alert-title, .alert-button {
    font-size: 1.1rem !important;
  }
  .alert-sub-title {
    font-size: 0.9rem !important;
  }
  .alert-message {
    padding-top: 8px !important;
    text-align: left !important;
    font-size: 1rem !important;

    &:empty {
      padding: 0 0 8px !important;
    }
  }
}

ion-action-sheet {
  .action-sheet-button {
    font-size: 1.05rem !important;
  }
}

/**
 * Alert作成時に `cssClass: 'alert-absolute',` が必要です
 */
.ios {
  .alert-absolute {
    position: absolute !important;
  }
}

/**
 * この設定は親に `default-font-size` が必要です
 */
.default-font-size {
  ion-input, ion-textarea, ion-label, ion-datetime, ion-select, ion-select-option, ion-note, ion-searchbar, input, textarea {
    font-size: 1rem !important;
  }
}


```
macでエリアスの設定

# エリアスって？
エリアスはニックネームのようなもの。長いコマンドを打つのが面倒なので、短いニックネームをつけておいて、そのニックネームを打てば長いコマンドと同じ意味になります。

# エリアスの設定ファイル
OSがCatalinaになった際にシェルがbashからzshになりました。zshの設定ファイルは`~/.zshrc`です。

# .zshrcを編集(viで編集する例です）
ターミナルから下記のコマンドで.zshrcを開きます。
```
vi ~/.zshrc
```

.zshrcにエリアスの設定を書き込みます。
```
alias ニックネーム='本来のコマンド'
```

`escキー`を押し、`:wq`と入力すると、.zshrcは保存され、閉じます。

#読み込み
ターミナルで下記のように入力すると設定が読み込まれます。
```
source ~/.zshrc
```


# 以上！

以上で終了です。エリアスを設定しているといないでは、随分と作業効率が違うの活用してみてください。
Xorshiftを用いた簡易暗号化

ハイスコアやランキングなどちょっとしたデータを保存するときに、大袈裟に暗号化するほどではないけど平文で保存するのはちょっと・・・ということはないでしょうか？

そんな時のために、ちょっと暗号化する関数を用意しました。

```
uint32_t xorshift32(uint32_t _y){
    _y=_y^ (_y<< 13); _y=_y^(_y>> 17); return _y^(_y<< 5);
}
void xcrypt(char* _out, const char* _in, int _length, uint32_t _seed= 2463534242){
  for(int i=0; i< _length; ++i){
    _seed = xorshift32(_seed);
    _out[i] = (_in[i]^(_seed&0xff));
  }
}
```
xorshift32は乱数などに利用されている[関数](https://ja.wikipedia.org/wiki/Xorshift)、
xcryptは各バイトを乱数でxorするだけの関数です。
xorなので同じ処理を2回行うと復号化になります。

ソースも短いので他言語への移植も比較的容易だと思います。
(移植したらコメント欄に各言語版もアップしてもらえると嬉しかったり・・・)

```
const char *key = "Hello,World!";
char out[13],res[13];
mcrypt(out, key, 13);
Serial.println(out);  // ��9�_Wv���␝s�
mcrypt(res, out, 13);
Serial.println(res);  // Hello,World!
```
重要なデータの暗号化にはお勧めできませんが、上述のようなちょっとしたデータの暗号化には使えるんじゃないかと思います。
javascriptでスタックとキューを書く

#最初に
まずはじめにスタックとキューについて説明します。
スタックというものは後にいれたものを先に取り出すことです。
キューは先にいれたものを先に取り出すことです。
##スタックとキューのやり方
**スタック**

```javascript:main.js
let arr = [];
arr.push(1);
arr.push(2);
arr.push(3);
arr.push(4);

//[1,2,3,4]

console.log(arr.pop()); //4
console.log(arr.pop()); //3
console.log(arr.pop()); //2
console.log(arr.pop()); //1
```
スタックではpushメソッドとpopメソッドを使います。
push()は配列の最後に引数に入ってるものを格納するメソッドで,popメソッドは配列の最後にある物を取り出すメソッドです。

まず最初に変数arrのところで配列を宣言します。
そのあとにpush()で引数に入っている数字を格納していっています。
次にpopメソッドで最後のほうから取り出してそれをconsole.logで出力しています。

**キュー**

```javascript:main.js
let arr = [];
arr.push(1);
arr.push(2);
arr.push(3);
arr.push(4);

//[1,2,3,4]

console.log(arr.shift()); //1
console.log(arr.shift()); //2
console.log(arr.shift()); //3
console.log(arr.shift()); //4
```
キューではpushメソッドとshiftメソッドを使います。
shift()というものは配列の最初にあるものを取り出すメソッドです。

配列を宣言し、pushで格納します。
そのあとshift()で最初にいれたものを取り出すという感じです。

##破壊的なメソッド
配列などのオブジェクト(ここではarr)に変更などするとそれに影響が及ぶことです。
最初は空だったarrもpush()により格納されて変更されました。
shift()やpop()も破壊的なメソッドです。
わかりやすいようにコードを書きました。スタックを例に。

```javascript:main.js
let arr = [];
arr.push(1);
arr.push(2);
arr.push(3);
arr.push(4);
//[1,2,3,4]

arr.pop() //4
//ここでarrの中身を見てみます。
console.log(arr); // [1,2,3]
```
最初は[1,2,3,4],pop()で4を取り出してみたところ、arrの中身は[1,2,3]になりました。
実は**取り出したと同時に削除**してしまうんですね...
shiftメソッドも同じように配列の先頭を取り出すと同時に削除してしまいます。
shift,pop,pushメソッド以外にもたくさんの破壊的なメソッドがあるので気を付けて使わないといけないなと思いました。

#終わりに
アルゴリズムとデータ構造を勉強したのでそのアウトプットのために書きました。
参考になったらありがたいです。