OmniAICreator/Qiita-1.07M huggingface dataset:
WKWebViewのCookieが完全に削除できてなくなぜかセッション残っている…こわい

WKWebViewでログインして
↓
Cookie削除
↓
WKWebView表示…あれ？残ってる、情報が残っている…こわい

を削除したくてやっとこさ見つけたのが
https://github.com/jwfriese/FrequentFlyer/blob/50200c61b7502b03748f235cc02ae8d894ef7015/FrequentFlyer/HTTP/HTTPSessionUtils.swift


のやつ助かりました。これでこわいのはなくなりました。


ちなみにCookie削除仕切れなかったもの🙅…いかにも削除しました系なのに…

```.swift
import WebKit

if let cookies = HTTPCookieStorage.shared.cookies {
    for cookie in cookies {
        HTTPCookieStorage.shared.deleteCookie(cookie)
    }
}
```

ちゃんと削除できたもの🙆

```.swift
import WebKit

URLSession.shared.reset {} //cookieやキャッシュのリセット
UserDefaults.standard.synchronize()　//データの同期 いらない同期をあとで同期して変に値を残さないためな気がする。
        
let dataStore = WKWebsiteDataStore.default()　//WKWebsiteに保存されている全ての情報の削除
dataStore.fetchDataRecords(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes()) { records in
    dataStore.removeData(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes(), for: records, completionHandler: {})
}
```

#### しかしこれでも消えないことがある😱なぜ？

答え
↓
https://qiita.com/ShingoFukuyama/items/eede79a284c3669846e9
の

|<img width="742" alt="スクリーンショット 2018-07-10 21.20.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/54f7a82e-477a-a053-c08d-6164102cce9d.png">|
|:-:
|

に書かれているようにCookieの共有をするためにWKProcessPoolを使っているときはこれも初期化しないといけないらしいです( ･ὢ･ ) 
初期化は以下のextension書いてCookieの削除をする時に以下呼ぶようにしました。ちょっとなんとなく納得いく書き方じゃないけどとりあえず。

```.swift
WKProcessPool.shared.reset()
```

```.swift
extension WKProcessPool {
   static var shared = WKProcessPool()
   
   func reset(){
       WKProcessPool.shared = WKProcessPool()
   }
}
```

色々ツッコミどころあるかもですがgithuburl乗せておきます。
指摘などは優しく教えていただけると嬉しいです。

**githuburl**
↓
https://github.com/sachiko-kame/WKWebViewSample


補足:
githubのところfacebookでなんでやっているの？に関してですが(誰にもまだ聞かれていない)、ログイン状態あるものなら正直なんでもよかったんですってだけです。( ･ὢ･ ) 

##おまけ
あと、ios10でbodyが渡せないからってリクエスト送ってそれをloadHTMLで表示するといいと書いてありましたがうまく行かずloadHTMLに実際行う動作書いてそのHTMLのボタンを開いた時点で勝手に押すを行いました。

#最後に…
WKWebViewって、ios10ではbodynilになるし、なんか色々めんどくさいですね。でも色々いいところもあると思って。
Mathematica 基本操作+単一周波数の離散フーリエ変換(DFT)

# バージョン
Mathematica11を使用。

# リスト
注意：In[N],Out[N]はコードとして書かなくて大丈夫です。

```
(*数値や文字の並び（配列）をリストといい、{}の中に要素を並べる*)
In[0] = data = {1, 2, 3, 4}

out[0] = {1, 2, 3, 4}
```

```
In[1] = invdata = 1/data

Out[1] = {1, 1/2, 1/3, 1/4}
```

```
In[2] = invdata[[2]]

Out[3] = 1/2
```

```
In[3] = pdata = {{1, 1}, {2, 1/2}, {3, 1/3}, {4, 1/4}}

Out[3] = {{1, 1}, {2, 1/2}, {3, 1/3}, {4, 1/4}}

In[4] = pdata[[3]]

Out[4] = {3, 1/3}

In[5] = 
{
 pdata[[3, 1]], pdata[[4, 2]]
 }

Out[5] = {3, 1/4}
```

```
(*別の書き方*)
In[7] = Table[{k,k^2},{k,0,3}]

Out[7] = {{0, 0}, {1, 1}, {2, 4}, {3, 9}}
```

#プロット
- ListPlot関数は、点をプロット
- ListLinePlot関数は、点を通る点をプロット

```
In[6] = 
{
 ListPlot[{pdata, Filling → Axis, PlotStyle → {Black}, PlotMarkers → {"*", 20}}],
 ListLinePlot[{pdata, PlotStyle → {Black, Thick}}]
 }
```
Out[6] = 
![m1.PNG](https://qiita-image-store.s3.amazonaws.com/0/176349/0b6ca3bc-0244-ac8f-d5f6-db6dab1b7fec.png)

#遅延型
####遅延型の定義 ":=" と 即時型の "="
- "="はプログラム内で変数を固定するときにオススメ
- ":="は呼び出すたびに変数を置き直すときにオススメ
- "_"ブランクで後から変数を代入できる

```
In[8]=f[x_] := x^2
In[9]=
{
 f[3],
 f[t],
 f[a + b] // Expand,
 D[f[t], t],
 Integrate[f[t], t],
 Integrate[f[t], {t, 0, 1}], 
 Plot[f[t], {t, -1, 1}, PlotStyle -> {Black, Thick}]
 }
```
Out[9]=
![m2.PNG](https://qiita-image-store.s3.amazonaws.com/0/176349/ad7ebd00-262a-68c6-c27a-caf457d95fd8.png)

# 組み込み関数
ギリシャ文字などの特殊記号の入力方法は https://bit.ly/2IKJhem から
（例）[Esc]+p+[Esc] -> π, [Esc]+w+[Esc] -> ω

```
In[10]=
f[t_, A1_, ω1_, A2_, ω2_] := A1 Sin[ω1 t] + A2 Sin[ω2 t];


{
 Plot[f[t, 1, 2 π/0.1, 1, 2 π/0.11], {t, 0, T}, 
  PlotStyle -> {Black, Thick}],
 Plot[f[t, 1, 2 π/0.1, 0, 2 π/0.11], {t, 0, T}, 
  PlotStyle -> {Black, Thick}]
 }
```
Out[10]=
![m3.PNG](https://qiita-image-store.s3.amazonaws.com/0/176349/b4e08a74-d539-c83d-609a-b6b1e0566f6a.png)

左はA2≠0,つまり,f[t]=A1 Sin[ω1 t] + A2 Sin[ω2 t]
右はA2=0,つまり,f[t]=A1 Sin[ω1 t]

# 単一周波数の離散フーリエ変換(DFT)
```
In[11]=
f[t_, A1_, ω1_, A2_, ω2_] := A1 Sin[ω1 t] + A2 Sin[ω2 t];

{A1 = 1, ω1 = 2 π/0.1, A2 = 0, ω2 = 2 π/0.11};
ts = 0.03; M = T/ts;

dat = Table[{t, f[t, A1, ω1, A2, ω2]}, {t, 0, T, ts}];
dat31 = Table[dat[[k, 2]], {k, 1, M}];

dFT31 = Fourier[dat31];
{
 ListLinePlot[Re[dFT31], PlotRange -> All, PlotStyle -> {Black, Trick}],
 ListLinePlot[Im[dFT31], PlotRange -> All, PlotStyle -> {Black, Trick}]
 }
```
Out[11]=
![m4.PNG](https://qiita-image-store.s3.amazonaws.com/0/176349/9436efd9-0fb8-7db3-42bd-87442168c94a.png)
C#でGraphicsのInterpolationModeはNearestNeighborが一番早い 

# 概要
C#の話です。
GraphicsでDrawImageするとき、元画像と描画先のサイズが違うと補完して出力されます。
この補完方法はGraphics.InterpolationModeで指定できます。
測定した結果、NearestNeighborが一番早かったです。

# サンプルコード
以下に実際に動作するコードを置いてます。
https://github.com/minoru-nagasawa/PerformanceInterpolationMode/

# 結果
NearestNeighborが一番早く、他の30%ぐらいで描画されます。

|補完方法|合計クロック数|比率|
|:-:|:-:|:-:|
|Default|24130822|100%|
|Low|24676698|102%|
|High|40063964|166%|
|Bilinear|24049502|100%|
|Bicubic|110087971|456%|
|NearestNeighbor|7526678|31%|
|HighQualityBilinear|38939439|161%|
|HighQualityBicubic|40209789|167%|

![image.png](https://qiita-image-store.s3.amazonaws.com/0/178867/8c7c0e7f-bccf-0d63-c5c9-c3a1051d9c5e.png)

# 補足
本当は、Sizeによっても分ける必要がありそうですが、一番早いのを知りたかったのでこれぐらいで。

# 参考
- https://msdn.microsoft.com/ja-jp/library/system.drawing.drawing2d.interpolationmode(v=vs.110).aspx
    - 補完方法の詳細
Unityで特定のスクリプトを設定しているオブジェクトを見つける

新規開発から参加している人ならいざ知れず。
開発途中から参加した人はどのオブジェクトにどのスクリプトがついているかわからない！！

ということがあるかもしれません。

私はありました。

なので今回は簡単にスクリプトを発見する小ネタを書きたいと思います。


#見つけ方
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/269147/69873bf9-893c-8366-5bd7-3e9e9e307b5e.png)

画像ではオブジェクトが少なく簡単に見つけられますが実際のゲーム開発になるとものすごい量のオブジェクト存在し発見が困難になります。

![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/269147/1e4688da-7843-46f4-be4b-585b802eee58.png)
そんな時は画像の赤枠部分に「t:スクリプト名」と入力すると

![無題3.png](https://qiita-image-store.s3.amazonaws.com/0/269147/5e3c1f5c-d170-31e3-c5fb-8b28ba0a23ac.png)
指定したオブジェクトのみが表示されるようになります。


※完全一致で表示されます。（大文字小文字は気にしなくてもいい模様）

ちなみにUnityに初期からあるものも検索可能な模様（以前できなかった気がしたのですが・・・）
![無題6.png](https://qiita-image-store.s3.amazonaws.com/0/269147/8824d43b-fc04-d44d-b2a8-fb3f8c7137f1.png)
#おまけ
あと意外に知らない人が多かったので
Listに一つ一つオブジェクトを入れている人をよく見かけたのですが一括で挿入する方法があります
![無題4.png](https://qiita-image-store.s3.amazonaws.com/0/269147/f7145b29-77fe-2bc6-f25e-c19d36fad972.png)

赤枠のカギマークをクリックし固定します。（これを行うことで別のオブジェクトをクリックしてもInspectorが変更されなくなる）
![無題5.png](https://qiita-image-store.s3.amazonaws.com/0/269147/fee40fea-fa1c-1183-cbca-1a4f5083f8b0.png)

配列を指定してListにドラック＆ドロップをすると全て追加されます。（挿入される順番は上から順番に挿入されます）



#最後に
今回の記事についての内容は一応、私のほうでもQiitaを見て回ってなさそうだったので書かせていただきましたが、もしもすでに同じ記事があるよという情報があればすぐに消すので宜しくお願いします。
Ruby on Rails 5 入門 #27 コメントを削除できるようにしよう で詰まった

ドットインストールでRuby on Railsの勉強を始めたが、27〜28のコメントの削除の段階で詰まってしまった。

記事の作成及び削除に関する実装までは
説明の通りにやってうまくいき、削除もできた

しかし、コメントの方になって何故かうまくいかない

まずはshow.html.erbに対して以下の記載

```
<%= link_to '[Delete]',
    post_comment_path(@post, comment),        
    method: :delete,
    class: 'command',
    data: { confirm: 'Delete OK?' } %>
```

この
post_comment_path(@post, comment),
の部分、
post_comments_path(@post, comment),
にしないとURLジェネレートエラーが出る


ActionController::UrlGenerationError in Posts#show

No route matches {:action=>"destroy", :controller=>"comments", :id=>nil, :post_id=>"10"}, missing required keys: [:id]

どうも　:id　が無いと言うのはわかった。


とりあえずpost_comments~ にして続ける。

実装を指示された文章はこう

```comment.controller
def destroy
    @post = Post.find(params[:post_id])
    @comment = @post.comments.find(params[:id])
    @comment.destroy
    redirect_to post_path(@post)
end
```

書いてあることは多分間違っていない。
しかしいざ実行すると、

No route matches [DELETE] "/posts/10/comments.5"
Routes match in priority from top to bottom

と、そんなルートねぇよ
と追い返されてしまう……

一体何が原因なのか、現状では全く見当がつかない。

ひとまず理解できるまで、
初級の学習を#1からやり直してみようか……

どなたか心当たりのある方がいらっしゃれば助言をいただけると幸いです。
［Ruby］クラス・メソッド・initializeの継承

### この記事の内容
Rubyにおけるクラス・メソッド・initializeの継承

### この記事を書いた理由
忘れた時に確認するため

### コード例
```ruby:sample.rb
#親クラス
class Sample
    attr_accessor :name,:price
    
    def initialize(name,price)
        @name = name
        @price = price
    end
    
    def info()
        return "#{@name}  ¥#{@price}-"
    end
end

sample1 = Sample.new("sample1",1000)
sample2 = Sample.new("sample2",2000)
sample3 = Sample.new("sample3",3000)
sample4 = Sample.new("sample4",4000)

samples = [sample1,sample2,sample3,sample4]

puts "-----------------"

samples.each do |sample|
    puts sample.info()
    puts "-----------------"
end


#子クラス
class Subsample < Sample
    attr_accessor :memo
    
    def initialize(name,price,memo)
        super(name,price)
        @memo = memo
    end
    
    def info()
        super() + " #{@memo}"
    end
end

subsample1 = Subsample.new("subsample1",5000,"memo1")
puts subsample1.info()
```

```出力結果:command
-----------------
sample1  ¥1000-
-----------------
sample2  ¥2000-
-----------------
sample3  ¥3000-
-----------------
sample4  ¥4000-
-----------------
subsample1  ¥5000- memo1
```
C# List<T>についてのメモ

自分用のメモです

#ArrayListの問題点
ArrayListは要素をobjectとして取り扱うため、データの格納や取り出しを行う際にキャストが行われ、処理速度が低下する。

+ ジェネリック

コレクションを生成するクラスとして、Listジェネリッククラスがある。
ジェネリックは、クラスをインスタンス化する際に、型をパラメータとして指定することで、その型だけに対応したインスタンスを生成する。

+ ジェネリックを使うメリット

コレクション生成時にデータ型を指定するので、タイプセーフなコレクションを使うことができる。
型指定されているので、要素追加時にキャストが行われない。

#List&lt;T&gt;

ListジェネリッククラスはList&lt;T&gt;として表記される。
Tは型パラメータと呼び、インスタンスの作成時にリストの要素として扱いたい型を指定する。



* Listを使う

```cs
using System.Collections.Generic
namespace App
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> list = new List<string>();
            list.Add("abc");
            list.Add("def");
            list.Add("ghi");

            foreach (var str in list) {
                Console.WriteLine(str);
            }

            Console.ReadLine();
        }
    }
}
```

型パラメータにstringを指定することで、格納される要素の型がstringに限定され、listは文字列専用のListになる。
RedmineとGitLabを連携したメモ  (Docker for Windows)

- Dockerは`Version 18.03.1-ce-win65 (17513)`
- 本当はQNAPで動かしたかったが、まずは手元のDockerで起動してみる。
- Cドライブにディレクトリを用意。ここではc:/dockersharedisk/redmine
- powershellからdocker runしてエラーがないことを確認する。
 
```
> docker run --rm -v c:/dockersharedisk/redmine:/data alpine ls /data
```


## mysql起動
```
> docker run -d --name redminedb `
-e MYSQL_ROOT_PASSWORD=password `
-e MYSQL_DATABASE=redminedb `
mysql:latest --character-set-server=utf8 --collation-server=utf8_general_ci --skip-character-set-client-handshake
```

## redmine起動
```
> docker run -d -p 10083:80 --name redmine `
-e DB_NAME=redminedb `
-e DB_PASS=password `
--link redminedb:mysql `
-v c:/dockersharedisk/redmine:/home/git/data `
sameersbn/redmine:latest
```

## redis起動
```
> docker run --name redis -d sameersbn/redis:latest
```

### mysqlにgitlabが使うデータベースを作成する
- mysqlのcontainer idを調べる。

```
> docker ps
```

- redminedb（mysql）に入る

```
>docker exec -it -e COLUMNS=200 -e LINES=50 [container id] bash
# mysql -u root -ppassword
```


### mysqlにデータベース作成
    mysql> CREATE USER 'gitlab'@'%.%.%.%' IDENTIFIED BY 'password';
    mysql> CREATE DATABASE IF NOT EXISTS `gitlabdb` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;
    mysql> GRANT ALL PRIVILEGES ON `gitlabdb`.* TO 'gitlab'@'%.%.%.%';
    mysql> quit


## gitlab起動
```
> docker run --name gitlab -d `
-p 10080:80 `
-p 10022:22 `
-e GITLAB_PORT=10080 `
-e GITLAB_SSH_PORT=10022 `
-e DB_ADAPTER=mysql2 `
-e DB_HOST=mysql `
-e DB_NAME=gitlabdb `
-e DB_USER=gitlab `
-e DB_PASS=password `
-e GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string `
-e GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alpha-numeric-string `
-e GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alpha-numeric-string `
--link redminedb:mysql `
--link redis:redisio `
--link redmine:redmine -v c:/dockersharedisk/redmine:/home/git/data `
sameersbn/gitlab:latest
```

### ブラウザでアクセスしてみる
redmine
http://localhost:10083

gitlab
http://localhost:10080


詳細は省くがRedmineのプロジェクト > 設定 > リポジトリ　からリポジトリの指定を
`/home/git/data/repositories/testrepo/renkei-test.git`
などとしておくと連携ができた。



# 参考
https://agora.sanei-hy.co.jp/technology/2018/03/00016/
https://qiita.com/takara@github/items/06577c49b7e1d3f68102


# 備忘録,宿題
GitLabのwebhookは設定しなかった。が、ちゃんとコミットしたらはredmineで見れるようになった。
ちょっと使い方調べる。
QNAPのContainer Stationで動かしたいが、あっちはpostgresqlだったのでそのやり方を調べる。
fish shellでGoogleCloudFunctionsEmulatorのfunctionsコマンドを叩けず小ハマりした話

# 結論

**fish shellでGoogleCloudFunctionsEmulatorのコマンドを叩くときはaliasを貼りましょう**

という話です。

# 背景

最近fish shellに移行しました。fish shellすごい快適です。
fishについては、以下のサイトを参考にしていただけると良いかなと思います。

https://dev.classmethod.jp/etc/fish-shell-life/

また、最近GCPにも触り始めまして、GoogleCloudFunctionsで関数をデプロイしてサーバレスにAPIを作ったりということを趣味でやってみています。
チュートリアルわかりやすく解説されていますので興味がある方は是非。

https://cloud.google.com/functions/docs/tutorials/

# なんでハマったか

まず、fishシェルにはこちらのドキュメントにあるように`functions`というコマンドがあります。
https://fishshell.com/docs/current/tutorial.html#tut_functions

一方、GoogleCloudFunctionsEmulatorのコマンドは
`$functions start`や`$functions status`
というように、functionsというコマンドになります。

したがって、コマンド名がバッティングするので、
**fishシェルでGoogleCloudFunctionsEmulatorのコマンドを叩こうとすると、fishシェルの`functions`が呼ばれます**

# 解決策

冒頭にも書いたようにエイリアスを貼れば解決できます。

fishシェルでエイリアスを定義するときは、`~/.config/fish/`のディレクトリ配下に`config.fish`という名前のファイルで設定を記述できます。

1 config.fishファイルを作成

```bash
$ vi ~/.config/fish/config.fish
```

2 エイリアスの定義

```:config.fish
# 以下を追加
alias gf '/Users/yumitsuhori/.nodebrew/current/bin/functions'
```

これで、`gf`でGCPFunctionsEmulatorのコマンドが叩けるようになります。

---

追記：
@tosukeさんのご指摘より、

`functions-emulator`

でも叩けました。
ご指摘ありがとうございました。
ProMicroで圧電スピーカー＋タクトスイッチでドレミを演奏する

# 圧電スピーカーとは

　パッシブスピーカーとも呼ぶらしいですが、電流を流すことで金属板を振動させ、音を鳴らすスピーカーのことです。
　一般的なスピーカーと同じ原理で動いているはずなので、十分な出力が得られればスピーカーに接続することもできますし、TRS端子、もしくはTS端子を挟んで、イヤホンへの出力もできるはずです。（未検証）

# Arduinoを使った圧電スピーカーへの出力

　Arduinoで圧電スピーカーへ出力する場合は、tone関数という関数が用意されています。
　http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2484

　周波数を指定する必要があるのですが、こちらもArduinoの公式サイトで、どの周波数がどの音階に対応しているかの定義表を用意してくれてます。
　https://www.arduino.cc/en/Tutorial/ToneMelody?from=Tutorial.Tone

# タクトスイッチを使ってドレミの入力状態を得る

　今回は「ド、レ、ミ、ファ、ソ、ラ、シ、ド」の8個の音を拾うので、8個のタクトスイッチを用意しました。
　それに対応して、ProMicro側でも8本のGPIOをプルアップ抵抗の入力モードにしています。
　また、スピーカー出力用に1本をOUTPUTに設定しています。

# 配線イメージ

![写真 2018-07-08 22 34 34.jpg](https://qiita-image-store.s3.amazonaws.com/0/213990/e0eb05e6-2a4e-6fd1-8c38-ca2b75876abb.jpeg)

　大分煩雑になってきました。
　ドレミから順番に2,3,4,5,6,7,8,9のピンから順番にタクトスイッチへつないでいます。
　もう片方はGNDに接続しています。

　スピーカーは15番のピンから圧電スピーカーへつないでいて、GNDとスピーカーの間に1kΩの提供を挟んでいます。

# ソースコード

　特に凝ったことはやらずに押されたボタンのtone関数を叩くようにしています。
　同時に押された場合でも対応できるようにしていますが、そういう用途には向いてないようで、汚い和音が再生されます。
　そういうのをやりたかったら、YMZ294などを使って再生するのが一般的みたいですね。（またチャレンジしてみたいです）

```cpp
#include <Arduino.h>

#define SPEAKER 15
#define BUTTON_1 2
#define BUTTON_2 3
#define BUTTON_3 4
#define BUTTON_4 5
#define BUTTON_5 6
#define BUTTON_6 7
#define BUTTON_7 8
#define BUTTON_8 9

int melo = 200;
int doremi[] = {0, 131, 147, 165, 175, 196, 220, 247, 262};

void setup()
{
    pinMode(BUTTON_1, INPUT_PULLUP);
    pinMode(BUTTON_2, INPUT_PULLUP);
    pinMode(BUTTON_3, INPUT_PULLUP);
    pinMode(BUTTON_4, INPUT_PULLUP);
    pinMode(BUTTON_5, INPUT_PULLUP);
    pinMode(BUTTON_6, INPUT_PULLUP);
    pinMode(BUTTON_7, INPUT_PULLUP);
    pinMode(BUTTON_8, INPUT_PULLUP);
    pinMode(SPEAKER, OUTPUT);
}

void loop()
{
    int status = 0;
    int b1_flag = digitalRead(BUTTON_1);
    int b2_flag = digitalRead(BUTTON_2);
    int b3_flag = digitalRead(BUTTON_3);
    int b4_flag = digitalRead(BUTTON_4);
    int b5_flag = digitalRead(BUTTON_5);
    int b6_flag = digitalRead(BUTTON_6);
    int b7_flag = digitalRead(BUTTON_7);
    int b8_flag = digitalRead(BUTTON_8);
    if (b1_flag == LOW)
    {
        tone(SPEAKER, doremi[1], melo);
    }
    if (b2_flag == LOW)
    {
        tone(SPEAKER, doremi[2], melo);
    }
    if (b3_flag == LOW)
    {
        tone(SPEAKER, doremi[3], melo);
    }
    if (b4_flag == LOW)
    {
        tone(SPEAKER, doremi[4], melo);
    }
    if (b5_flag == LOW)
    {
        tone(SPEAKER, doremi[5], melo);
    }
    if (b6_flag == LOW)
    {
        tone(SPEAKER, doremi[6], melo);
    }
    if (b7_flag == LOW)
    {
        tone(SPEAKER, doremi[7], melo);
    }
    if (b8_flag == LOW)
    {
        tone(SPEAKER, doremi[8], melo);
    }
}
```

# 動作イメージ
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">圧電スピーカーとタクトスイッチ8個で、ドレミ再生してみた。 <a href="https://t.co/iYxAleYPrO">pic.twitter.com/iYxAleYPrO</a></p>&mdash; Toshio Maki (@Kirika_K2) <a href="https://twitter.com/Kirika_K2/status/1015873949626798080?ref_src=twsrc%5Etfw">2018年7月8日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Torでウェブサイト公開

torを使ってウェブサイトを閲覧する場合は、Tor browserを使います。

torを使って通常のブラウザでアクセス出来ないウェブサイトを交際するときは、torが必要になります。

ネットで調べるときは、ごちゃごちゃにならないようにしましょう。
Tor browserを使ってウェブサイトを閲覧するだけなのに、ウェブサイト公開の設定をすると、思わぬセキュリティホールが出来てしまうこともあるかも知れません。

この記事は、onionドメインで、ウェブサイトを公開したい人向けに書いています。
Ubuntuを使うことを、想定しています。

Tor browserを使うだけなら、簡単に設定できます。
ソフトをインストールするくらいです。
ボートを開く必要は、ルーターなど通勤回線の設定によります。

ボートの設定は、慎重に行ってください。

#onionドメインのウェブサイト公開

##torの起動と停止
設定ファイルを編集したら、この起動と停止のコマンドを使います。

```
sudo systemctl start tor.service
sudo systemctl stop  tor.service
```

または、

```
sudo service tor start
sudo service tor stop
```
##設定ファイル編集
torの設定ファイル名と場所は、ここです。
/etc/tor/torrc

vimで開くと行番号ないので、コマンドのモードで、下記のコマンドを入力すると、行番号を表示できます。

```
:set number
```

設定ファイルを編集したら、設定内容を反映させるために、torを停止して再び起動してください。


#サイトの公開に関して
onionのドメインのサイトを表示するためには、通常のウェブサイトの運用と同じソフトをインストールします。

ApacheやNginxといったウェブサーバーの準備が、必要です。

Nginxは、メモリも少なく軽く動くようです。
たくさんのアクセスが予想されるときは、Nginxも検討されると良いと思います。
k725さんから教えて頂きましたので、修正します。
Nginxでも、php-fpmを使うとPHPを使うことが出来ます。

Apacheは、PHPを使えるので、動きのあるサイトを作ることもできます。

NginxとApacheを組み合わせて使うことも、あるそうです。


##参考記事
この記事が、参考になります。
https://hackmd.io/s/HyxJs1A9W

ファイルの修正内容などは、この記事も参考になります。
https://netwiz.jp/?p=1597
viewpager Activityからfragmentへの値を渡す方法 更新する方法

#やりたいこと
mainActivityでボタンのクリックイベントを取得し、viewpagerを更新する。更新した後に、クリックされたボタンに応じて処理を変えたい。

#問題
ボタンの種類に応じて処理を変えるには、値をフラグメントに渡さないといけない。mainActivityからfragmentにどのように値をわたすか。

最初に浮かんだのは
①pagerAdapterに値を保持する関数を作り、その関数を通した後にsetAdapterをする。
pagerAdapter内でその値をbundle経由で各フラグメントにわたす。

次に考えたのは
②クリックリスナー内でプレファレンスに登録し、fragmentを更新。そのあと各fragmentでプリファレンスから取得。

結果的には②がうまく行った。
#①での問題
MainActivity(ClickListener内)

~~~
  pager = (ViewPager) findViewById(R.id.pager);
  adapter = new PagerAdapter(getSupportFragmentManager(),"取引記録年");
                          
  adapter.addData("取引記録年",this);
  pager.setAdapter(adapter);

~~~
PagerAdapter(一部略)

~~~

 @Override
    public Fragment getItem(int position) {

                Fragment fragment = null;
        switch (position){
            case 0:
                fragment = new SelectSheetListView();
                break;
            case 1:
                fragment = new StatisticFragment();
                break;
            case 2:

                SelectSheetListView selectSheetListView = new SelectSheetListView();
                Bundle bundle = new Bundle();
                bundle.putString("btn_status",btnData);
                selectSheetListView.setArguments(bundle);

                fragment = selectSheetListView;
                break;
            default:
                //fragment = new ChartFragment();
                fragment = new StatisticFragment();
                break;
        }
        return fragment;
    }

 public void addData(String Data, Context context)
    {
        btnData = Data;
      
    }

~~~

Activity起動時にはaddDataでうまく行くが、onclick内でやるとなぜか値が保持されなかった。

#②を適用したらうまく行った。


~~~

 SharedPreferences pref = this.getSharedPreferences("pref", MODE_PRIVATE);
                           SharedPreferences.Editor e = pref.edit();

                           e.putString("btnData","取引記録年" );
                           e.commit();

~~~
RPGっぽいのを作ってみる　その１

[前回](https://qiita.com/shinobideth/items/abd2fdeb08a06413e120)の投稿でRPGの戦闘シーンもどきを作ってみたので、学んだ事を使用して、少しづつブラッシュアップしていこうかなと思います。
今回はrubyのクラスとやらを学んだので（まだ全然理解が追いついていませんが・・・）プレイヤーのステータスをクラス化してみました。

```status.rb

class Status
    attr_accessor :name
    attr_accessor :level
    attr_accessor :life
    attr_accessor :atacck
    attr_accessor :defence
    
    def initialize
        puts "あなたの名前を入力して下さい"
        self.name = gets.chomp
    end
end
```

Statusクラスでプレイヤーの名前やレベルその他の項目を定義して、呼び出した時点で名前の入力を行います。
その他の項目に関してはどうやって設定するかは考え中です。

実際この程度だったら配列でなんとかできそうな気はしなくもないですし、クラス化する理由もよく分かってないですがどうなんでしょうか？
「こうした方がいい！」「なんて無駄な事をやっているんだ！」という意見があればどんどん突っ込んで下さい。
Raspbian Stretch の固定IPアドレス化

# Raspbianの固定IP化
Raspbianを固定IP化するのにあたり、以下の順番でやっていく。

1. DHCPで割り振られたIPアドレスを調べる
1. 他のPC（母艦）から調べたIPアドレスにSSHでログインする
1. /etc/dhcpcd.confを書き換える
1. リブートする

## ipアドレスを調べる

```
$ ifconfig -a
```
```
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.110.15  netmask 255.255.255.0  broadcast 192.168.110.255
        inet6 fe80::20f:d13f:7743:392  prefixlen 64  scopeid 0x20<link>
        ether b8:27:eb:be:63:00  txqueuelen 1000  (イーサネット)
        RX packets 102986  bytes 149294615 (142.3 MiB)
        RX errors 0  dropped 631  overruns 0  frame 0
        TX packets 55456  bytes 5171364 (4.9 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
```
もしくは

```
ip a s | grep global
```
```
    inet 192.168.110.15/24 brd 192.168.110.255 scope global wlan0
```
で、IPアドレスがわかる

## sshでRaspbianにログインする

```
$ ssh -l pi 192.168.110.15
```

## /etc/dhcpcd.confを書き換える
昔は、/etc/networks/interfacesを書き換えればよかたんだけど、Stretchは/etc/dhcpcd.confを書き換えるらしい。
以下の部分を追記した。

``` /etc/dhcpcd.conf
 interface wlan0
 static ip_address=192.168.110.50/24
 static routers=192.168.110.1
 static domain_name_servers=192.168.110.1
```

## リブート
リブートすると、IPアドレスが先程設定した固定IPアドレスで立ち上がってくるので、再度sshでログインできることを確認する。

```
$ ssh -l pi 192.168.110.50
```
これでRapiroにRaspberryPiを載せても、遠隔で設定できるようになった。
React-Native-Firebase > Starter Kitを試して見る



[React Native Firebase - Simple Firebase integration for React Native](https://rnfirebase.io/)


## Basic Starter Kit

[invertase/react-native-firebase-starter](https://github.com/invertase/react-native-firebase-starter)




### Clone & Install


```

git clone https://github.com/invertase/react-native-firebase-starter.git
cd react-native-firebase-starter
npm install

cd ios
pod install

```

### Rename Project


```
cd ..
npm run rename

```

> Enter your Project name, e.g. My Amazing Project: FireBaseTest
> Enter your Company name, e.g. My Company:
> ERROR: Please supply a company name



## GoogleService-Info.plistの作成

↓でGoogleService-Info.plistをダウンロードします。
[Firebase を iOS プロジェクトに追加する  |  Firebase](https://firebase.google.com/docs/ios/setup#add_firebase_to_your_app)


### [iOS アプリに Firebase を追加] をクリック

<img src="https://qiita-image-store.s3.amazonaws.com/0/49910/129a8b78-5b0c-ce82-c3a6-6e548f350102.png" width=300px />




<img src="https://qiita-image-store.s3.amazonaws.com/0/49910/1ee2bbe6-35f1-0968-6670-3d814d942664.png" width=300px />

iOSバンドルIDはXCodeで開いた時に設定する以下の赤枠部分のIDです。


<img src="https://qiita-image-store.s3.amazonaws.com/0/49910/dc8a8ab9-8ffd-afe3-401d-4e21cefe05ec.png" width=300px />


設定を押したらGoogleService-Info.plistがダウンロード可能になっています。
ダウンロードした後、iOS/APP名/の直下に配置します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/49910/effd0856-fc15-f241-bac0-9ec3e0395b36.png" width=300px />




## 実行

```
npm start
```

別のコンソールウィンドウで以下を実行
npm run ios


シミュレーターが立ち上がります
<img src="https://qiita-image-store.s3.amazonaws.com/0/49910/802074e8-9d1b-fa43-d802-c309dda342ee.png" width=300px />



iOS アプリに Firebase を追加　画面の方では
「Firebase がアプリに正常に追加されました」と表示されます

<img src="https://qiita-image-store.s3.amazonaws.com/0/49910/3bc210c5-ccab-bf06-9729-606acaec853c.png" width=300px />
10年後の仕事図鑑の感想

#*はじめに*#
この本は落合陽一さんと堀江貴文さん（通称ホリエモン）と言う凄い人たちが書いた
タイトル通り消える仕事と伸びる仕事を一般人（凡人）に分かりやすく書いてくれた
ありがたいバイブルです。

#*読んで何が変わった？*#
エンジニアについて、今ではなくていいので1,2年後に必ず続けていくか真剣に考えてみようと思った。

RPA（自動化）はやはり今後伸びていくはほぼ確実。
＝エンジニアのコードとかテストとかの工程の人は消えてPM等の管理する人とRPAを作ったり利用する事が出来る人だけが生き残る。

凡人の人達の仕事と上手くいっている人の違いとか
#*まとめ*#
今を精一杯生きていくって難しい。
気になる人は買って読んでください
re-exec法(仮)によるスクリプトのタイムアウト実現

# はじめに
何かの処理が完了しない場合に一定時間で打ち切りたい場合、timeoutというコマンドがあります。そのため、あるスクリプト自体をtimeout経由で実行すれば時間制限が設けられるのですが、ではスクリプト自身で完結させる場合どうするか。
ちょっとした方法ですが、re-exec法(仮) (適当に名前をつけただけ)という方法があるため、紹介します。

# 無難な方法
あるスクリプト`main.sh`があり、これが一定時間(例えば10秒)で終わらない場合は打ち切りたいとします。それを実現したければ、次のように別スクリプト`tmout.sh`を設ければ実現できます。

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

timeout 10 ./main.sh
```

しかし、それではタイムアウト処理のためだけにファイルを1つ増やすことになります。いえ、面倒でなければそれでも良いのですが。

# re-exec法(仮)
そんな時にどうするか。メインの処理もタイムアウト処理も1つのファイルで完結させることを考えます。
とは言え、timeoutコマンド経由でスクリプトを実行するという部分は変えられません。そこで**自分自身を再実行する**ことでまとめてしまいます。これをre-exec法(仮)としておきます。
※別にこういう名前が実際流通している訳ではなく、名前がないと説明し辛いので、仮に名付けただけです。

ただそうすると、スクリプト側としては**再実行が必要な状況なのか、それとも再実行されている状況なのか**が区別できませんから、そこを何とかするために環境変数の定義の有無で判定させます。

典型的な実装としては次のようになります。

```
#!/bin/bash

TIMELIMIT=10
[ -z "$MY_SECOND_EXECUTION" ] && MY_SECOND_EXECUTION=1 exec timeout $TIMELIMIT bash $0 "$@"

# 以下メインの処理
(略)
```

ここでは`MY_SECOND_EXECUTION`としていますが、この環境変数が定義されていなければ、初回実行と判断してtimeout経由で自身を再実行 ( その際環境変数を定義 )、定義されていれば再実行と判断して、メインの処理へ進む、ということです。

# サンプル
以下、簡単なサンプルを紹介します。
`countup.sh`というスクリプトで、引数に指定された回数のカウントアップを1秒おきで行うものですが、同時にこれに10秒の時間制限をかけます。

```shell:countup.sh
#!/bin/bash

TIMELIMIT=10
[ -z "$MY_SECOND_EXECUTION" ] && MY_SECOND_EXECUTION=1 exec timeout $TIMELIMIT bash $0 "$@"

# メイン
for ((i=0;i<"$1";i++)); do
  echo "** $i **"
  sleep 1
done
echo "** done **"
```

で、これを実行してみた結果です。カウント5回を指定した場合は時間内なので完走しますが、100回を指定すると10秒の制限に引っかかって打ち切られます。( 時間切れを示す timeout の終了ステータス124が返ってきます )

```shell-session:実行結果
$ ./countup.sh 5
** 0 **
** 1 **
** 2 **
** 3 **
** 4 **
** done **
$ echo $?
0
$ ./countup.sh 100
** 0 **
** 1 **
** 2 **
** 3 **
** 4 **
** 5 **
** 6 **
** 7 **
** 8 **
** 9 **
$ echo $?
124
```

# おまけ: re-exec法(仮)の応用
今回はtimeoutを間に挟む目的で使用しましたが、他にもコマンドを間に挟んで実行させたいような場面であれば同じ手法が使えると思います。

例えば、最近はもう流行らない手法ではありますが、デーモン起動するプログラムです。メジャーなデーモンプログラム ( sshdやhttpdなど ) は、自前でデーモン化する機能を備えているのですが、そうでないものでもsetsidコマンドを経由することでデーモン化することができます。
これとre-exec法(仮)を組み合わせてみます。

という訳で、以下サンプルです。単に指定秒数sleepするだけのスクリプトですが、これをデーモン化してみます。
※本来の意味でのデーモン化はもっと込み入ったことをするのですが、ここでは最低限、標準入出力の切り離し(/dev/nullへの接続)とsetsid実行としています。

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

[ -z "$MY_SECOND_EXECUTION" ] && MY_SECOND_EXECUTION=1 exec setsid bash $0 "$@" </dev/null >/dev/null 2>&1

# メイン
sleep "$1"
```

実行してみると、即座にコマンド実行したシェルの制御化を離れ、制御端末も切り離して(TTY=?)デーモン化されていることが分かります。

```shell-session:実行結果
$ ./dsleep.sh 1200
$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
(略)
angel        5     4  0 Jun30 pts/0    00:00:09 bash
angel     1502     1  2 22:17 ?        00:00:00 bash ./daemon.sh 1200
angel     1503  1502  0 22:17 ?        00:00:00 sleep 1200
(略)
```

# 終わりに
ちょっとした手法ですが、役に立つ場面もあるのではないでしょうか。
docker メモ

# イメージからコンテナを作成してシェルを起動して入る

オプション -i (--interactive) および -t (--tty) を付与して起動するのがポイント

| オプション | 内容 |
| --- | --- |
| -i, --interactive | コンテナの STDIN にアタッチ。コンテナの標準入力を開く。/bin/bashなどでコンテナーを操作する際に指定 |
| -t, --tty | 疑似ターミナル (pseudo-TTY) を割り当て。ttyを確保。/bin/bashなどでコンテナを操作する際に指定。 |
| -d | バックグラウンドで実行。WebやAPサーバなど常時実行するコンテナーで指定 |
| --name | ｛コンテナ名｝ |

 ｛イメージ名｝:｛タグ名｝
 コンテナで実行するコマンド

docker run の最後のコマンドはコンテナを起動して最初に動かすコマンド

例

```
$ docker run -t -i --name centos_test centos /bin/bash
$ docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
83414f6cd2d2        centos              "/bin/bash"         24 seconds ago      Up 25 seconds                           centos_test

$ docker attach 83414f6cd2d2
```

# centos7 で ssh

```
# yum list installed | grep ssh
```
で`open-ssh`がインストールされているか確認

なかったら下記コマンドでインストール

```
# yum -y install openssh-server
```

```
# vim /etc/ssh/sshd_config
```

| 項目 | 説明 |
|:--|:--|
| Port | SSH接続を受け付けるポート番号。<br>※今回はデフォルト値を使用するので#でコメントアウト！ |
| PermitRootLogin | rootユーザーでのログインを許可するか否か。<br>※今回は"no"を指定してね！ |
| PasswordAuthentication | パスワード認証を許可するか否か。<br>※今回は"yes"を指定してね！ |

```
# systemctl start sshd.service
Failed to get D-Bus connection: Operation not permitted
```

ここでこける

# --privilegedを付けて、コンテナを立ち上げてから入ることでsystemctlが使えるように

```
$ docker run --privileged --name centos_test -d centos /sbin/init
$ docker exec -ti centos_test bash
```

```
# yum list installed | grep ssh
# yum -y install openssh-server
# vi /etc/ssh/sshd_config
# systemctl start sshd.service
# systemctl status sshd.service
# yum install firewalld
# systemctl start firewalld
# systemctl enable firewalld
# systemctl status firewalld
# firewall-cmd --list-all
# firewall-cmd --permanent --add-service=ssh
# useradd testuser
# passwd testuser
```

コンテナのIPアドレスを取得

```
$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' centos_test
```
centos_test: コンテナIDも可
めっちゃランダムな css animation

雑にランダムなアニメーションを作りました。

![Kapture 2018-07-08 at 22.07.41.gif](https://qiita-image-store.s3.amazonaws.com/0/40717/01a288e6-2d94-cbb5-1239-1f4071eda5bb.gif)
![Kapture 2018-07-08 at 22.08.26.gif](https://qiita-image-store.s3.amazonaws.com/0/40717/a7e63959-0aea-f091-8c72-597ffea1b3c5.gif)

サイト: https://lain.elzup.org/

コード: https://github.com/elzup/lain-time/blob/master/src/components/Fact/index.js

抜粋

```js
const kaos = p => keyframes`
  0% {
		background: linear-gradient(
			${p.r[0]}deg,
			#${p.c[0]} ${p.h[0]}%,
			transparent ${p.h[0]}%
		)
		${p.h[5]}px 0,
		linear-gradient(${p.r[1]}deg, transparent 74%, #${p.c[1]} 78%),
		linear-gradient(
			${p.r[2]}deg,
			transparent ${p.h[1]}%,
			#${p.c[2]} ${p.h[2]}%,
			#${p.c[3]} ${p.h[3]}%,
			transparent ${p.h[4]}%
		),
		#${p.c[4]};
		background-size: ${p.h[6] * 10}px ${p.h[7] * 10}px;
  }
  100% {
		background: linear-gradient(
			${p.r[1]}deg,
			#${p.c[1]} ${p.h[1]}%,
			transparent ${p.h[1]}%
		)
		${p.h[6]}px 0,
		linear-gradient(${p.r[2]}deg, transparent 74%, #${p.c[2]} 78%),
		linear-gradient(
			${p.r[3]}deg,
			transparent ${p.h[2]}%,
			#${p.c[3]} ${p.h[3]}%,
			#${p.c[4]} ${p.h[4]}%,
			transparent ${p.h[5]}%
		),
		#${p.c[5]};
		background-size: ${p.h[7] * 10}px ${p.h[0] * 10}px;
  }
`
```

詳しく説明はしません。する意味があるほど設計を考えて作ってないです。

![DevTools_-_lain_elzup_org__and_Present_day__Present_time__and_index_js_—_components_Fact_—____ghq_github_com_elzup_lain-time.png](https://qiita-image-store.s3.amazonaws.com/0/40717/6a462829-b979-e7d8-9e04-d5e9bc56c4eb.png)

一つのハッシュ値から n/16, n/256, n/4096 の値を取り出しておいて css に当てています。
上の css を当てた要素を4枚(別の値)並べてさらに位置とrotate を変えています。

## サイトについて

https://lain.elzup.org/


navigator と window のシリアルと timestamp からハッシュを生成してます。ハッシュからハッシュ更新までの時間も決めています。

パターンが予測できない、誰も同じものを見れないグラフィックを作ってみたかった感じです。

animetion 雑すぎて多分ちょっと重いです。
Micro でファイルアップロードできる micro-upload を使ってみる

ZEIT の Micro で、ファイルアップロードをしてみたら簡単だったので書いておきます。

express-upload のラッパーというライブラリを使います。 https://github.com/julianduque/micro-upload

```
yarn add micro micro-upload
yarn add -D micro-dev
```

```js:index.js
const { upload } = require('micro-upload')

module.exports = upload(req => {
  req.files.file.mv('/tmp/file')
  return 'ok'
})
```

というファイルを用意して

```
yarn micro-dev
```

でサーバーを起動、そして

```
curl -XPOST -F file=@/path/to/image.jpg localhost:3000/files
```

などとすると、 `/tmp/file` にアップロードしたファイルが保存されます。

（ちなみに、これだけだと、どのURL、HTTPメソッドでもファイルアップロードされます）

S3 にアップロードするには、S3 の SDK を使う時、 `req.files.file.data` を Body とすれば良い。簡単。
jsの関数の基本　完璧個人メモ

完璧な個人的メモです。

何事も基礎は大事だ。
なんとなく理解した気になっているjsの基礎をおさらいしておこうと思った。

## 即時関数

```
> (function fact(n) {
... if(n<=1) return 1
... return n*fact(n-1)
... })(5)
// 120
```
以上のように無名関数を即時実行できる。
ES6の現代では使わないが、面白い。

## 引数の省略
関数定義式の仮引数よりも少ない数の実引数を指定して関数を実行すると、実引数が省略された仮引数はundefinedが渡される。

```
> const lol = (x,y) => {
... console.log(x)
... console.log(y)
... }
undefined
> lol("lol")
lol
```
## 可変長配列引数リスト(Arugumentsオブジェクト)
(ES6のアロー構文だとarugumentsオブジェクトは使えないが...）
全ての関数で利用可能なローカル変数として、argumentsがあります。arugumentsはArgumentsオブジェクトを値として持っています、関数がn個の実引数を指定して呼び出されたとすると、以下のように実引数の値がarugumentsに渡されます。

arguments[0] 一番目の実引数の値
arguments[n-1] n番目の実引数の値
さらにargumentsオブジェクトはlengthとcalleの2つのプロパティを持っており、次の値が格納されます。
arguments.length ...実引数の数
arguments.callee ...現在実行されている関数への参照

関数の中でargumentsを変更すると、関数の仮引数も変更されます。

ES6では代わりに残余引数を使います。

## 残余引数
関数の引数リストの最後の引数の前に...をつけると、最後の引数には、実際に関数に渡された実引数の残りの引数が配列として格納されます。この...の付いた引数を残余引数と言います。

```js
const f = (a, b, ...args) => {
  console.log(a, b, args)
}

f(1, 2, 3, 4, 5556) // => 1 2 [ 3, 4, 5556 ]
```
配列として渡されるのがミソ

```js
const sum = (...args) => {
  for(var i=0, s=0; i<args.length; i++) s+=args[i];
  console.log(s)
}

sum(1,2,3,4,5)
```

## forEach
forEachメソッドは、配列の要素を順番に取り出して、その値を引数の関数に渡すというイテレーションを行います。

```js
const a = [5, 4, 3]

a.forEach(val => console.log(val))
// 5
// 4
// 3
```

```js
const a = [5, 4, 3]
for(var v of a) console.log(v) // => 5 4 3
for(var v of "ABC") console.log(v) // => A B C
```

## 再帰関数
関数から自分自身を呼ぶことを、再帰呼び出しといいます。再帰呼び出しを行う関数を再帰関数と言います。

```js
> const fact = n => {
... if(n<=1) {
..... return 1
..... }
... return n*fact(n-1)
... }
undefined
> fact(5)
120
```
大抵の場合はfor文やwhile文で書いた方が可読性が高く、高速に動く。

再帰関数でクイックソートを書いてみた。

```js
// x:ソートする配列
// first:ソートする要素の開始位置
// last:ソートする要素の終了位置
const quicksort = (x,first,last) => {
  var p = x[Math.floor((first+last) / 2)]
  for(var i=first, j=last; ; i++, j--) {
    while(x[i]<p)i++
    while(p<x[j])j++
    if(i>=j) break;
    var w = x[i]; x[i] = x[j]; x[j] = w;
  }
  if (first < i-1) quicksort(x,first,i-1);
  if (j+1<last) quicksort(x,j+1,last);
}

var a = [7,2,5,1,8,9,3]
quicksort(a,0,a.length-1)
console.log(a)
```

上のコードは動かない.あとでなおす

## クロージャ
クロージャの定義は
「自分自身が定義された環境において、関数内の自由変数の名前解決を行う」
何言ってるかわからないですね。要約すると、関数自身の外側のスコープに変数名を探しに行くみたいです。

```js
function makeCounter() {
  var count = 0
  return function() {
    return count++
  }
}
```
みたいな感じらしい。ES6でのカリー化と何が違うのだろうか？
ちなみにカリー化すると

```js
const makeCounter = (a) => (b) => {
  return a + b
}
const counter = makeCounter("lol")
console.log(counter("ol")) // => lolol
```
となる。...reduxのミドルウェアを作る時以外見ないが


clojureで実装できる関数ファクトリという機能はカリー化では以下のように定義出来る

```js
const makeMultiplier = x => y => x + y

const multi1 = makeMultiplier(2) // => 4
const multi2 = makeMultiplier(10) // => 13

console.log(multi1(2))
console.log(multi2(3))
```

おまけ
jsって１行でif文が書けるのね。驚いた。

```js
if (1==1) foo
while(condition) i++
```
Python pipコマンド一覧

Python pipコマンド実行

```
#!/usr/bin/env python
pip 下記コマンド
```

Commands:

```
  install                     Install packages.
  download                    Download packages.
  uninstall                   Uninstall packages.
  freeze                      Output installed packages in requirements format.
  list                        List installed packages.
  show                        Show information about installed packages.
  check                       Verify installed packages have compatible dependencies.
  search                      Search PyPI for packages.
  wheel                       Build wheels from your requirements.
  hash                        Compute hashes of package archives.
  completion                  A helper command used for command completion.
  help                        Show help for commands.
```

General Options:

```
  -h, --help                  Show help.
  --isolated                  Run pip in an isolated mode, ignoring
                              environment variables and user configuration.
  -v, --verbose               Give more output. Option is additive, and can be
                              used up to 3 times.
  -V, --version               Show version and exit.
  -q, --quiet                 Give less output. Option is additive, and can be
                              used up to 3 times (corresponding to WARNING,
                              ERROR, and CRITICAL logging levels).
  --log <path>                Path to a verbose appending log.
  --proxy <proxy>             Specify a proxy in the form
                              [user:passwd@]proxy.server:port.
  --retries <retries>         Maximum number of retries each connection should
                              attempt (default 5 times).
  --timeout <sec>             Set the socket timeout (default 15 seconds).
  --exists-action <action>    Default action when a path already exists:
                              (s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.
  --trusted-host <hostname>   Mark this host as trusted, even though it does
                              not have valid or any HTTPS.
  --cert <path>               Path to alternate CA bundle.
  --client-cert <path>        Path to SSL client certificate, a single file
                              containing the private key and the certificate
                              in PEM format.
  --cache-dir <dir>           Store the cache data in <dir>.
  --no-cache-dir              Disable the cache.
  --disable-pip-version-check
                              Don't periodically check PyPI to determine
                              whether a new version of pip is available for
                              download. Implied with --no-index.
```
Markdown記法おさらい

Qiitaの記事をこれから書いていくにあたって、まずMarkdown記法をさらっとおさらいしておく。
といってもQiitaのチュートリアルほぼそのまま。なにかあればその都度追加。

見出し

```
# 見出し 1
## 見出し 2
### 見出し 3
```

強調

```
**強調**
```

リンク

```
[リンク](https://...)
```

コード

```
```python:ファイル名.py
コード
```

リスト

```
- リスト 1
- リスト 2
    - リスト 2-1
```

```
1. 番号付きリスト 1
2. 番号付きリスト 2
3. 番号付きリスト 3
```

```
- [ ] チェックボックス 1
- [ ] チェックボックス 2
- [×] チェックボックス 3
```
zshにpowerlineを適用させる

## 環境

* Mac
* zsh
* iTerm
* プラグイン管理：zplug

## 説明しないこと

* zplugのインストール方法
* pythonのインストール方法

> zplugの導入に関しては[こちら](https://qiita.com/sayama0402/items/adc1980b83d16c9a9bb0)をご確認ください。

## powerlineとは

ターミナルの表示をかっこよくするプラグイン
[公式](https://github.com/bhilburn/powerlevel9k)にgifが載っているので、見てみてください

## インストール

#### powerline install

```
$ pip install psutil
$ pip install powerline-shell
```

#### fonts install

```
$ git clone https://github.com/powerline/fonts.git && cd fonts && ./install.sh
```

iTermのPreferencesを開き、textを変更します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/19716/23fe7189-6158-d5ed-31ec-f11dce475f61.png)

「Font」から「Change Font」をクリックし、右上の検索窓より「powerline」と入力しましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/19716/4aeff7dc-e9e4-7e0e-26e6-b3ea5065aa35.png)

その中から適当なのを選んでおきます。
「Use a different font for non-ASCII text」というチェックボックスはチェックを外しておきます。

## .zshrcを編集

```yaml
zplug "b-ryan/powerline-shell"

function powerline_precmd() {
    PS1="$(powerline-shell --shell zsh $?)"
}

function install_powerline_precmd() {
  for s in ${precmd_functions[@]}; do
    if [ "$s" = "powerline_precmd" ]; then
      return
    fi
  done
  precmd_functions+=(powerline_precmd)
}

if [ "$TERM" != "linux" ]; then
    install_powerline_precmd
fi
```

`.zshrc`に以上の記述を加え、`source .zshrc`でpowerlineを適用出来るようになります。
Python3でProject Eulerを解く

# はじめに
Python3を勉強するためにProject Eulerの問題を順番に解いていきます.
# Problem1
10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.

同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ.

```python:hoge.py
ans = 0
for cnt in range(1,1000):
    if cnt%3 ==0 or cnt%5 == 0:
        ans += cnt
print(ans)
```
IoT時代にAIとブロックチェーンは両輪の技術

AIとブロックチェーン、あるいはAIと仮想通貨がともにメディアで取り上げられることも多くなっています。ともにバズワード、注目分野だからということは当然あるのですが、AI技術とブロックチェーン技術がともに発展して機能するようになることによって、世の中の多くのことが変わるのではないかと感じさせられることもあります。
最近のオンラインメディアの記事の中から、AIとブロックチェーンが連携することによってどのような相乗効果が期待されるかを取り上げている記事をピックアップして紹介します。

※下記サイトからの転載。ビッグデータ・AIなどに関するトピックを毎週取り上げています。
[TechCrowd: https://www.techcrowd.jp/related/](https://www.techcrowd.jp/related/)


#[AIとブロックチェーンを組み合わせた効果｜仮想通貨だけがトレンドではない] (https://www.bibitpost.com/archives/2750)

仮想通貨・暗号通貨・ICOなどの情報提供メディア 「Bibit Post」の記事です。ブロックチェーンとAIを組み合わせたトレンドを紹介してくれています。

まずはイギリスの国際的な著者でもあり、テクノロジーの専門家、創業者兼CEOでもあるBernard Marr（ バーナード・マー）氏が、AIとブロックチェーンという２つの強力な技術を組み合わせることで高めらる三点をブルームバーグに発表した内容についてふれています。

1. AIとブロックチェーンがうまく連携
AIの新たな分野は、まだ暗号化された状態のままでデータを扱う（処理するまたは処理する）ことができる構築アルゴリズムに関係しており、AIはセキュリティを強化することができる

2. AIが行った決定を、ブロックチェーンが“追跡・理解・説明”に役立つ
AIによって行われる決定には、「人間が理解すること」が難しい場合もある。ブロックチェーンは、こうしたAIによって行われた決定を「追跡・理解・説明」するための助けとなる。

3. AIは人間よりも“効率的”にブロックチェーンを管理できる
Bitcoinではブロックチェーン上のブロックを採掘するために「ブルートフォース」アプローチを採用しています。AIは、このブルートフォースアプローチよりインテリジェントで思慮深い方法のマイニングアルゴリズムを作り出せる。


#[AIとブロックチェーン技術の融合が医療革命を起こす] (https://innovation.mufg.jp/detail/id=218)

先端テクノロジーの情報発信、またMUFGのフィンテック導入等に関する情報発信を行うことを目的とした、MUFGが運営する新しい形のイノベーションメディア INNOVATION HUBの記事です。

AIの注目分野のひとつが医療ですが、画像処理や大量のデータ解析に長けたAIを、医療データの管理や解析に導入し、患者のカルテに紐づいた検査結果の履歴を一ヵ所にデータとして集約することができれば、医師の診療効率があげられ、患者一人ひとりに対してより丁寧な診察をすることができるようになることが期待されています。

すでにGoogle傘下のDeepMindと英国民保健サービス（NHS）と病院が提携した基盤づくりが始まっている。DeepMindのソフトウェアに大量のスキャン画像と症状を学習させ、スキャンデータのみから疾患を特定することを目指している。ところがこの試みは、患者に十分な説明もないまま、急性腎臓障害などでNHSを訪れた160万人分の患者データがDeepMindに提供されたというNew Scientistの報道を受けて、多大な批判を浴びることになりました。

医療機関が企業に個人情報を渡したことは確かに問題ですが、個人情報から切り離された医療データを収集して解析するプラットフォームを世界中の医療関係者が共有することができれば、医師たちはこれまでにない知見を得ることができ、患者もより適切な治療を受けることが
できるようになる。

そこで、個人情報を扱う医療プラットフォームとしての信頼を得るために、DeepMindはブロックチェーンを活用して暗号化した患者の個人情報をリアルタイムで追跡できる「Verifiable Data Audit」を2017年中に導入すると発表。

データの暗号化と変更履歴がすべて記録される分散型台帳を使用することで、個人情報の保護と勝手な改ざんの防止の両方が可能となります。AIとブロックチェーン技術を融合させた医療プラットフォームは、医療先進国と発展途上国との医療格差を埋める一助になることも期待されるとむすんでいます。


#[「AIで使うそのデータ信頼してもいいの？」、ブロックチェーンが導く未来の生活とは] (http://www.atmarkit.co.jp/ait/articles/1708/02/news007.html)

@ITが、ブロックチェーン技術とAIやロボティクスを連携させるアイデアを提案している人工知能（AI）関連の技術開発に取り組むクーガー 代表取締役 CEOの石井敦氏にインタビューを行った記事です。AIとブロックチェーンはどう結び付くのか。そもそもブロックチェーンは何の役に立つ技術なのか。基本的なところから石井氏の考えを聞いています。

AI技術に取り組んできた石井氏がブロックチェーンに関心をもった視点は、AIに用いる大量のデータの安全性に対する疑問・懸念からだったようです。もし集めたデータに偽造や改ざんがあった場合、機械学習で正確な分析ができなくなり、全てが水の泡になる可能性がある。そこでデータの活用と並行して、データの信頼性を担保する技術がないと、AIが今後立ちゆかなくなると考えたとのこと。その問題を現状で解決できる可能性がある最も有力な技術としてブロックチェーンに注目したようです。

ブロックチェーン技術の「改ざん不可能」という特徴が有効となる分野は、データを追跡、監査するニーズがあり、あまりスピードが求められない分野とのこと。例としてあげたのがサプライチェーン分野。原材料や加工途中の段階などをトレース（追跡）可能なように記録して、透明性を持たせる使い方が考えられます。

長期的な方向性としては、移動の問題解決に興味があり、メールやファイルを送るような気軽さで「自分を送る」自律的に飛ぶ有人ドローンのような乗り物を、飛行機に乗るぐらいの感覚で使えるようにしたいと考えているようです。

このようなビジョンを実現するにはAI、ロボティクスが欠かせず、そしてその技術を確立するには、データに信頼性を与える仕組みが必要。そういうビジョンから逆算して、現在ブロックチェーンに取り組んでいるとのことです。
GPSの研究　その36

#概要

GPSを理解したかった。
u-bloxのGPS受信機３台あるが、どいつもRXM-RAWを出力しない。

#ばった物、NEO-6M

```
soft:
7.03 (45969)

hard:
00040007

rom:

```

#ヘリコプターのOP　GPS(NEO-7M)

```
soft:
1.00 (59842)

hard:
00070000

rom:
PROTVER 14.00
GPS,SBAS,GLO,QZSS

```

#純正？NEO-7M

```
soft:
1.00 (59842)

hard:
00070000

rom:
PROTVER 14.00
GPS,SBAS,GLO,QZSS

```

以上。
Tesseract OCRの始め方

##Tesseract OCRを始める（自分用まとめ）
開発環境：windows 10 64bit

####Tesseract OCRをGitHubからダウンロードする
https://github.com/tesseract-ocr/tesseract/wiki
※ダウンロードした場所　C:\user\abc\tesseract-ocr

####Tesseract OCRをインストールする
ダウンロードしたファイルを実行する
ファイル名 tesseract-ocr-setup-3.05.02-20180621.exe

####Tesseract OCRの使い方
Tesseract OCRをインストールした場所でcmdを開く
#####インストールされているか確認する方法　

    >tesseract -v


#####使い方の表示

    >tesseract

#####画像ファイルから文字を読み、.txtに出力

    >tesseract 画像ファイル名.png テキストファイル名

画像ファイルから文字を読み取り、テキストファイルに出力する
もし、テキストファイルが無いなら、新しくファイルを作る
vagrant upでエラー（No usable default provider could be found for your system）対応

以下の様なエラーが出ました。  

```bash
$ vagrant up
No usable default provider could be found for your system.

Vagrant relies on interactions with 3rd party systems, known as
"providers", to provide Vagrant with resources to run development
environments. Examples are VirtualBox, VMware, Hyper-V.

The easiest solution to this message is to install VirtualBox, which
is available for free on all major platforms.

If you believe you already have a provider available, make sure it
is properly installed and configured. You can see more details about
why a particular provider isn't working by forcing usage with
`vagrant up --provider=PROVIDER`, which should give you a more specific
error message for that particular provider.
```

上記が出た時のバージョンは以下。

* vagrant ... Vagrant 1.8.5
* Virtual Box ... 5.2.12 r122591


### 対応方法

Vagrantを最新にしたら、なおります。⇨[ダウンロードURL](https://www.vagrantup.com/downloads.html)
Matlabでは値渡しがデフォルトなので、書き方によってはものすごく遅くなる

# C++

C++において関数への引数の渡し方には値渡し、ポインタ渡し、参照渡しがあり、これらを適切に使い分けることでプログラムのパフォーマンス（速度やメモリ消費量等）をコントロールすることができます。
一般的には、インスタンスの生成・破棄コストが無視できるint/double等のプリミティブな型に対しては値渡しを、無視できないクラスのインスタンスに対しては参照渡しを使います。ポインタ渡しは仮想関数を呼び出すときに使うことが多いですが、一般的には生ポインタの代わりにunique_ptr, shared_ptr, weak_ptrを使うため、ポインタ渡しを使う場面はあまり多くないと思います。

参考：[C++ Core Guidelines, F.call: Parameter passing](https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#fcall-parameter-passing)
 
# Python/MATLAB

一方、PythonやMATLABではC++の参照渡しを制御する&演算子に相当するキーワードが存在せず、デフォルトでどのように渡されるのかが決まっています。

## Python

~~pythonでは、int/double等のプリミティブな型は値渡しでその他は参照渡しであり、C++でプログラミングする時と同じ使い分け方なのであまり気にすることなくプログラムを書くことができます。~~
@shiracamus さんの指摘の通り、上の表現は間違っていますので削除します。
[Python言語リファレンス](https://docs.python.jp/3/reference/index.html)を読んだところ、immutable/mutableなオブジェクトについては[3.1 オブジェクト、値、および型](https://docs.python.jp/3/reference/datamodel.html#objects-values-and-types)の

> すべての属性は、同一性 (identity)、型、値をもっています。 __同一性 は生成されたあとは変更されません。__これはオブジェクトのアドレスのようなものだと考えられるかもしれません。（中略）オブジェクトによっては 値 を変更することが可能です。値を変更できるオブジェクトのことを mutable と呼びます。生成後に値を変更できないオブジェクトのことを immutable と呼びます。

を、代入文については[8.10. copy — 浅いコピーおよび深いコピー操作](https://docs.python.jp/3/library/copy.html)の

> Python において代入文はオブジェクトをコピーしません。__代入はターゲットとオブジェクトの間に束縛を作ります。__

が明快な説明でしょうか。名前の束縛については[4.2.1. 名前の束縛](https://docs.python.jp/3/reference/executionmodel.html#naming-and-binding)を参照。

> __名前 (name) は、オブジェクトを参照します。__名前を導入するには、名前への束縛 (name binding) 操作を行います。
> 以下の構造で、名前が束縛されます: 関数の仮引数 (formal parameter) 指定、 import 文、クラスや関数の定義 (定義を行ったブロックで、クラスや関数名を束縛します)、__代入が行われるときの代入対象の識別子__（後略）

名前の束縛＝参照の値渡しということでしょうか。なるほど。

## MATLAB

ところが__MATLABは基本的に値渡しです__（参照渡しをするには[ハンドル型](https://jp.mathworks.com/help/matlab/matlab_oop/handle-objects.html#btm3mgk-1)を継承する必要がある）。このため、MATLABで下手なコードを書くと著しくパフォーマンスが下がります。

追記：引数として関数に渡した変数を関数内で変更しない限りはコピーされません。変数を変更する場合コピーされます。

例えば、この春に他の学生がMATLABで書いた数値計算プログラムをC++に書き換えたのですが、約300倍高速になりました。
プロファイリングしてみると、私のC++プログラムにおいては計算時間の95%がソルバーの行列計算（Ax=bをxについて解く）で占められていたのですが、MATLABプログラムにおいてソルバーの行列計算（`x = A\b`）の占める割合は1%未満で、30%はメッシュファイルの出力、60%は行列要素の計算に費やされていました。

なぜ行列要素の計算にこれほどの時間が費やされていたかというと、その学生は巨大なモノリシックなクラスを定義してそのインスタンスを関数に渡していたため、関数を呼び出すたびにその巨大なクラスのインスタンスがコピーされていたからです。単一責任原則（SRP）に従ってクラス・関数を細かく分割してコードを書いていればここまで速度に差は出なかったと思います。

（日本ではMATLABを使ってプログラミングを勉強した人は少ないと思いますが、アメリカの大学では無料でMATLABを使えるところが多いため、MATLABでプログラムを勉強しそのまま使っている学生がたくさんいます。なので値渡し・参照渡し・ポインタ渡し自体を知らない学生がいます。）
kintone Slack連携プラグイン

# kintone Slack連携 プラグイン

## 商品URL
トライアル版（2018年9月まで）があります．
https://searchight.stores.jp/items/5b41f18550bbc32413000427

また，以下からお買い上げいただけます．
https://searchight.stores.jp/items/5b41e93aa6e6ee28f7004c32

下記の場合はお問い合わせください． ( 7749satellite_at_gmail.com )
- バグを見つけました
- 追加機能の希望
- 企業様など，Storesの決済方法が使えない

## このプラグインでは何ができるの？
kintoneにレコードを**追加・編集**したとき，ワークフローで**承認・差戻**したとき，
SlackのチャンネルやDMに通知ができます．

![result.png](https://qiita-image-store.s3.amazonaws.com/0/268024/8c7f0796-8122-f3c2-d951-e1c6710e2f25.png)

## このプラグインはどうやって使うの？
以下の手順で導入してください．

#### 1. Slack Webhook URLを取得する
以下URLを参考に，「Webhook URL」の値を取得します．
https://developer.cybozu.io/hc/ja/articles/207419736-kintone%E3%81%8B%E3%82%89Slack%E3%81%AB%E9%80%9A%E7%9F%A5%E3%82%92%E9%80%81%E3%82%8B%E6%96%B9%E6%B3%95

#### 2. プラグインをアプリに追加する
まずはkintone環境全体にアプリをインポートします．
https://jp.cybozu.help/ja/k/admin/plugin.html

次に，通知を行いたいアプリに対してプラグインを追加します．
https://jp.cybozu.help/ja/k/user/plugin.html

#### 3. プラグイン設定を行う
プラグインの設定画面で，1.で取得した「Webhook URL」の値を設定します．
「投稿するbotの名前」の設定は任意です．
![setting.png](https://qiita-image-store.s3.amazonaws.com/0/268024/c54752d2-2975-b278-273e-fa0864a004b2.png)

#### 4. アプリを更新する