OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonによる数値計算-Fano効果

# はじめに
Fano効果は1961年Ugo Fanoによって理論的に導かれた。任意の始状態から終状態へ移る際に連続的な準位と離散的な準位を通る過程があるときにこれらが干渉することで特徴的なスペクトルが現れる現象をFano効果という。Fano効果はラマン散乱、光電子放出、原子の光電離、光吸収、中性子散乱、量子ドット、金属表面での近藤効果など分光学では有名な現象である。

#Fano公式
Fano効果における量子干渉は次式で表される。第一項は連続準位、第二項は離散準位、第三項はそれらの干渉項である。


```math
H = E_{\phi}\left|\phi\right>\left<\phi\right|+\sum_{E'}{E'\left|\psi_{E'}\right>\left<\psi_{E'}\right|}+\sum_{E'}{\left(V_{E'}\left|\psi_{E'}\right>\left<\phi\right|+V_{E'}^{*}\left|\phi\right>\left<\psi_{E'}\right|\right)}
```

このハミルトニアンに対し、スペクトルは次のように与えられる。

```math
\frac{(\varepsilon+q)^{2}}{\varepsilon^{2}+1}
```
この式はFano公式と呼ばれる。$\varepsilon=(E-E_{0})/\Gamma$はエネルギーであり、$E_{0}$および$\Gamma$は共鳴準位の位置とその寿命である。$q$はFanoパラメータあるいは非対称パラメータと呼ばれており連続準位と共鳴準位とのカップリングの程度を表す。

#数式の可視化
Fano公式を可視化します。今回は三次元プロットをするためにAxes3Dをインポートしました。プログラムは下記のものを実行すればできるはずです。パラメータはてきとうに当てているので、必要に応じて書き換えてください。


```python:fano.py
import pylab
from matplotlib import pyplot
from mpl_toolkits.mplot3d import Axes3D


step = 500
p = [[0.00 for i in range(step)] for j in range(step)]
e = [[0.00 for i in range(step)] for j in range(step)]
q =　　[[0.00 for i in range(step)] for j in range(step)]

for i in range(step):
    for j in range(step):
        e[j][i] =(i-250)/10
        q[j][i] = j*0.05

for i in range(step):
    for j in range(step):
        p[j][i] = (e[j][i]+q[j][i])*(e[j][i]+q[j][i])/(e[j][i]*e[j][i]+1)

fig = pylab.figure()
ax = Axes3D(fig)
ax.set_xlabel("Energy")
ax.set_ylabel("Fano parameter")
ax.set_zlabel("dI/dV")
for j in range(40):
   ax.plot(e[:][j],q[:][j],p[:][j],'b')
pyplot.show()

```

三次元プロットは次の図のようになります。様々なFanoパラメータに対して曲線を書いてあります。Fano公式や図からわかるように$q=0$のときは反共鳴的なスペクトルになります。一方$q\rightarrow\infty$ではBreit-Wigenr型のスペクトルに一致します。
![fano1.png](https://qiita-image-store.s3.amazonaws.com/0/207891/5e23783c-f18b-cc9f-51af-04d2654299ca.png)

最もスペクトルの非対称性が顕著になるのは$q=1$のときで、次の図のようになる。
![fano2.png](https://qiita-image-store.s3.amazonaws.com/0/207891/1b0eeadf-83dc-ce81-574e-6ef1bcbe9837.png)
EtherscanのAPIをPHPから使う


EtherscanのAPIをPHPから使う必要があり、調べたのでメモ。

とりあえず[dzarezenko/etherscan-api](https://github.com/dzarezenko/etherscan-api)というのが良さそうなのですが、まったくサンプルコードが無い。mdには「使い方はsamplesを見ろ！」と書いているのにsamplesは無し・・・。


が、とりあえずソース見ながら適当に使ってみます。

### やりたいこと

ひとまず

* あるアドレスの残高
* あるアドレスのトランザクション一覧

が取得できればことが足りるので、それをやってみます。

### インストール

composerが使えます。

```bash
composer require dzarezenko/etherscan-api:dev-master
```

### 実装


```php:scan.php
<?php

    require_once './vendor/autoload.php';

    use etherscan\api\Etherscan;

    //Keyを指定（あらかじめEtherscanでアカウント作ってKeyを取得しておく）
    $scan = new Etherscan("xxxxxxxxxxxxxxxxxxxxxxxxxxxx");

    //あるアドレスの残高取得（適当に取得したアドレス）
    $balance = $scan->balance("0xAca0F51040c18844D5d3E040540807853f6105fA");

    //残高取得
    $balance_wei = $balance["result"];
    $balance_eth = ($balance["result"]/1000000000000000000);

    //あるアドレスのトランザクション取得
    $trans = $scan->transactionList("0xAca0F51040c18844D5d3E040540807853f6105fA");

    foreach($trans["result"] as $tran){

        //各要素取得
        $from = $tran["from"];
        $to = $tran["to"];
        $timestamp = $tran["timeStamp"];
        $value_wei = $tran["value"];
        $value_eth = ($tran["value"]/1000000000000000000);

        //timestamp - datetime
        //よけいなコードだけど、timestampをJSTになおしてみる
        $date_unixtime = $timestamp;
        $date = new DateTime('@'.$date_unixtime);
        $date->setTimezone(new DateTimeZone('Asia/Tokyo'));
        $jst = $date->format("Y-m-d H:i:s");

        //出力
        echo "$jst from: $from timestamp: $timestamp value: $value_eth<br>";

    }
```

### 考察

基本、同期処理なのでサービスとかでは使えないかな。。。と。非同期にも対応してそうな[PUBLIQNetwork/etherscan](https://github.com/PUBLIQNetwork/etherscan)というのもあるみたいですが、試していません。
ラムダ式を用いて短いメソッドを簡潔に書く方法

# はじめに
ラムダ式に対して理解度が乏しいので調べてみた。

# ラムダ式とは
たまたま手元の本に紹介があったので読んでみた

> 戻り値を返す短いメソッドを、より簡潔に書く方法。
> 確かな力が身につくC#「超」入門 より

なるほどよくわからない。

とりあえずコンソールアプリケーションでサンプルコードを書いてみた。

## Hello.World!をラムダ式で書いてみた

### よくある教本にある書き方で記述すると下記のようになる。

```csharp:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace lamdaStudy
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello. World!");
        }
    }
}
```

### ラムダ式を用いると下記のようになる。
※HelloWorldメソッドからラムダ式で読み込む

```csharp:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace lamdaStudy
{
    class Program
    {
        static void Main(string[] args)
        {
            HelloWorld();
        }
        static void HelloWorld() => Console.WriteLine("Hello. World!");
    }
}
```

### メソッドを呼び出そうとしなくても、エントリポイント(Mainメソッド)から呼び出せるらしい
```csharp:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace lamdaStudy
{
    class Program
    {
        static void Main(string[] args) => Console.WriteLine("Hello. World!");

    }
}
```

なるほど。少しだが理解が深まった気がする。


# 参考
・確かな力が身につくC#「超」入門

・メソッドもラムダ式で簡略化できる
https://qiita.com/octopa0327/items/413e89bd57a17097dea8

・ラムダ式 (C# プログラミング ガイド)
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/statements-expressions-operators/lambda-expressions￥

・構文：メソッドやプロパティをラムダ式で簡潔に実装するには？［C# 6.0／7.0］
http://www.atmarkit.co.jp/ait/articles/1606/01/news051.html
無線通信を理解するための構成要素

# はじめに
今の世の中は無線通信が進展しており、誰もがありがたくそれを利用している一方で、詳しい仕組みなどを理解している人は少ない。そこで無線通信を知るうえで必要なことは何なのかをまとめてみた。以下に具体的になにを学べばよいかを示す。

# 無線通信を学ぶ意義
IoT・M2Mの時代の到来により、センサーネットワークやスマートホームというものがこれから期待されている。その中で技術者は無線の物理的な側面を知ったうえで技術開発するのが望ましいと思われる。さらに理論的な理解がないと気づけない事柄があるかもしれない。なにより知っていると友人に自慢できると思うのでぜひ学んでみてほしい。

# 無線通信を学ぶステップ
次に段階的なステップを示す。1については興味がない場合はスキップしてもよい。

## 1. 電磁波を知る (理論) 
無線通信は電磁波を媒体として情報を伝える。どのようにアンテナから情報が送信され、どのようにアンテナから情報が受信されるのかを学ぶ。すべての無線通信はこの理論が基礎となっているため、学ぶに越したことはないだろう。

- 電磁気学 (マクスウェル方程式などからどのように電磁波が発生するのか)
- 電気工学 (送信機と受信機の基礎を学ぶ)
- 電波伝搬 (周波数によって伝搬特性はどのように変わるのか)
- アンテナ (様々な種類のアンテナを理解する)

## 2. 様々な方式を知る (理論)
無線通信では、干渉を避けたり、効率化をしたりするために様々な通信方式がある。

- 変調方式 (AM, FM, PM, ASK, FSK, PSK, QAM, OFDMなど)
- 多元接続 (TDMA, FDMA, CDMA, OFDMA, TDM, FDM, SDM)
- 品質 (符号理論, MIMO)

## 3. 実際に使われている無線通信を知る (実践)
面倒な理論を学習したあとでようやく実際に使われている無線通信システムを学ぶ。現在は複雑にあちこちで登場しているため区分の仕方が難しいが、様々な側面からとらえるとよい。

- 周波数による区分
- PAN/LAN/MAN/WANによる区分

# あとがき
初めてQiitaに投稿してみた。これはいわばテスト投稿なのだが、気が向けば上記の内容の詳細を解説することもしたい。
File Signature Using Hex editor to know what the exactly file type is & Shift bit - Extensionが変更されているファイル判断

Example:secret_file.jpg
<Summary>
when you open the file and Windows Photo Viewer is unable to open the file correctly, because this is not a picture file,

1.Download Hex editor as you like.

2.File open in Hex Editor and then look at begging of file bits.These beginning bits of file is called the file signature.(Magic Number) 
Example if your file is 50, 4B, 03, 04, 14, 00, 06, 00.

Search this number in google or below.

https://www.garykessler.net/library/file_sigs.html

informations said that 
50 4B 03 04 14 00 06 00 	  	PK......

DOCX, PPTX, XLSX 	  	Microsoft Office Open XML Format (OOXML) Document

3.Now you understand this .jpg file is maybe MS office format.

4.change the extension as secret_file.jpg -> secret_file.docx.

5.Now you can open the file to view.　

結論：Hex Editorを使って、拡張子不明なファイルを開く、
その際、先頭の2byteにあるFile Signatureから検索し、
ファイルの種類を識別することが可能。

追加：開いたファイルが正しく参照できない場合。
shift bit To read unreadable character file.
Just shift bit to left or right in Hex Editor if you look unreadable file which character is broken by someone.
 
例：secret.txtというファイルが存在し、開くと文字化けが発生。

Hex Editorで開くと以下の通り。
A8D0D2E640D2E640C240E8CA737421　....@..@.@..st!

その場合は、shift bit を左か右にしてみる。

結果：右にシフトすると、不明だったものが見えてくる。
546869732069732061207465737421 This is a test!

*Treat Data as:32bit unsigned long
Byte Ordering :Little Endian.
railsのserializeは値が同一でも設定し直すだけでchangedになるのをどうにかしたい

そもそもで、性能を気にする場合にserializeを使うのか否かといった議論とか、そもそもserializeって何っていう話とかはQiitaにたくさん記事があるのでそちらも併せてごらんください。

ここでは、とにかくserializeしますってなった後の話をしたいと思います。
以下、サンプルです。税区分をデータベースでは整数で保持するけど、モデル上は文字列で取り扱う場合です。

```ruby
module TaxType
  TAX_TYPE = [[1, '税別'], [2, '税込'], [3, '非課税'], [4, '不課税']]
  I2S = TAX_TYPE.to_h
  S2I = TAX_TYPE.map(&:reverse).to_h
  def self.dump(value)
    S2I[value]
  end
  def self.load(value)
    I2S[value]
  end
end

class Slip
  ...
  serialize :tax_type, TaxType
  ...
end
```

ここで、もともと税区分が'税別'だったときに'税別'を設定する場合、変更なしとして扱いたい。
changed? が false という評価になってほしいわけです。

```ruby
slip.tax_type = '税別'
```

ですが実際は、changed? はtrueになってしまいます。
変更されたか否かにかかわらず、常にtrueです。中身を見ずにtrueを設定しています。

この設計といいますか、仕様の意図は、巨大なJSONオブジェクトが変更されたかどうかを計算しようとするととても時間がかかるので、変更されたかどうかを計算をしないと決める必要があった。
それであれば、保存しておくに越したことはない。
というところではないでしょうか。

今回は単に文字列ですから、比較のコストは大したことはありません。
ついでと言っては何ですが、そのようなカラムはほかにもあるかもしれませんので、

```ruby
before_save do
  changes_to_save.each do |attribute, value|
    was, is = value
    if was == is
      clear_attribute_change attribute
    end
  end
  true
end
```

という感じで、保存の前に変更されているとマークされているもの全体に対して、実際はどうなんだ？ということを一つ一つチェックしていきます。

もしバリデーション中に変更されているかどうかの結果を使用したい場合は、この定義を before_save ではなく before_validation で行います。
保存のときだけなら、別にいつでも良いです。

せっかくなので、concernsに置けるようにしてみます。

```ruby
module ClearChangesIfEqual
  extend ActiveSupport::Concern

  included do
    before_save do
      changes_to_save.each do |attribute, value|
        was, is = value
        if was == is
          clear_attribute_change attribute
        end
      end
      true
    end
  end
end
```
必要に応じてmodelにincludeして使います。

コード自体は大したことがないもので、べたに比較し続けるかんじです。
ですが、挙動のイメージがわかないと、どこで処理をするのが良いのか判断に迷いますね。


では、今日もここまで読んでくれてありがとう。
日本の映像制作に期待すること

## はじめに

こういう文章を書くと嫌われると思いますが、日ごろ日本の映像制作に携わる人たちに関して思っていることをまとめてみました。

日本はコンテンツ大国だと思います。仕事の合間を縫っていろいろ小説や漫画を読むようにしていますが、本当に面白い作品はいくらでもあります。それらを効率よく映像化できれば、この業界にはいくらでも稼げる余地があると思います。

しかし、現状ハリウッドと比べると映画は見劣りしますし、中国や東南アジアに比べてもあまり元気があるように見えません。皆が疲弊していて、明るい将来があるように思えないのです。果たして予算がないことだけがいい作品を作れない原因でしょうか？ そんなことはないと思います。知恵を出せば乗り切れる問題はたくさんあるはずです。予算がないなら、効率よく作ればいいですし、センスを磨いて作品の価値を高めることが出来ます。おしゃれな配色にするのは時間がかかりません。

###まず、会社にお願いしたいことです。

## 教育に力を入れる

プレゼンでは、いったいどうして、この色とこの色を同じ画面で使ってしまったのか？　なぜこんな見栄えの悪いフォントやレイアウトを使うのか？　と理解に苦しむものをよく見ます。映像制作会社が用意したスライドやホームページが一昔前の田舎のスーパーのチラシのようだったらどうでしょう。センスのいい人はそんな会社に入りたいとは思いませんし、せっかく頑張って作ったものも、アピールできるどころか、一気に魅力が無くなります。企業のイメージというのは思っている以上に重要です。株主、新卒の学生などはそういった外に出ている情報で会社を判断します。

例えば、ある程度の規模の外資系企業だと、大抵おしゃれなパワーポイントのテンプレートが用意されています。フォントや配色を統一することで、最低限の見栄えを保証することができますから、個人が行うプレゼンで会社のイメージを著しく損なうことを予防することができます。

こういったものを用意するためのセンスはどう磨けばよいのでしょうか？　生まれつき？育った環境？いろいろ思いつくかもしれませんが、配色パターンやレイアウトをきちんと学べばかなり良いものが作れるようになるはずです。

では従業員にどうやって、そういった勉強をさせるか、という話になると思います。例えば、資格受験の費用を出しても、どうせ辞められてしまうからやらないという意見も耳にしますが、社員のモチベーションを上げつつ、長く務めてもらえるよう工夫すればよいと思います。例えば資格取得の翌年と翌々年の給料が少し上がるであるとか、報酬を先延ばしにすればよいのです。そういった制度があると、面白いな、会社をよくしたいのだなと、皆が感じ取れます。

## 差をつける

事なかれ主義のためか、嫌われないためか、査定をしても、全員同じような給料の変化しかしない会社があります。それでは、頑張っている人が報われません。一円でも多く、成果を上げた人に給料を支払うべきです。これが一番難しいところですが、その評価は誰が見ても納得できるものでなければなりません。面倒くさい人や、意見の強い人ばかりが得をするようになっているケースがよくあります。査定は本人や、上司以外にも同僚数名に匿名で行ってもらう、またその人は毎回変えるなどとすることで、少し公平にできるかもしれません。


###そして働いている人にお願いしたいことです。

## きちんとした日本語を使う

きちんとした文章を書ける人が非常に少なくなってきているように思います。私が仕事で受け取るメールは、失礼であったり、過剰敬語であったりすることが多く、正しい日本語が使われているメールを見ると安心します。何もお願いしていないときにまで「宜しくお願いいたします」をつける必要なんてありませんし、プライベートで会ったことがあるにせよ、仕事のメールはきちんとした文章で書くべきです。

最近では一つの作品を作るのにたくさんの人がかかわると思いますが、印象の悪い人の依頼は優先順位が下がります。逆にきちんとした人には、力になってあげたい、何とかしてあげたいと思うのが人間です。ですので、文章の書き方ひとつでことがうまく運ぶなら安いものです。

おかしな日本語は採用でも不利に働きます。採用担当から砕けた文体のメールが届いたら、その会社に行こうと思う人は少なくなるでしょう。文末に「！」がついていたり、文章の始まりが「あ、」であったりするのは論外です。これらは実際に何度か目にしたことがあります。

見出しを「きちんとした日本語」としてありますが、上で書いたことは日本語に限りません。英語でも失礼な書き方はいくらでも出来るので、気を付けたほうが良いですね。相手を敬っているかどうかというのは、英語のライティングのうまさとは全く関係ありません。また、逆に過剰に丁寧にしても何が言いたいのかわからなくなるので、失礼にならぬよう簡潔に書くのがよいでしょう。

## 勉強をする

効率よく仕事をこなすには、知恵を使うしかありません。仕事に関連することを学ぶのもそうですが、数学であったり、語学であったり、デザインであったり職種に関わらず色々なことを学ぶのがよいと思います。

デザイナーであっても数学の勉強は役に立つと思いますし、技術職の人にもデザインの勉強は役に立つはずです。数学は論理的な思考のトレーニングですから、無駄なく仕事を進めるのに不可欠です。また、違うジャンルのものに触れることでいろいろな発想が生まれます。

技術職でいうと、募集要項に、国際学会での研究発表経験がある、と記載している会社は多いですね。ですが面接に出てくる人がそういった経験がない、なんてことが多々あります。優秀な人を採用したいなら、採用する側も優秀であるべき、もしくは、少なくとも努力するべきです。肩書が立派でも、英語もできなければ、論文も読めもしないし書けもしない、そういう人の下で働きたい人がいるか、ということを、面接をする立場であれば、考えてみるべきです。いまはプログラムなんて誰でも書けるのです。

勉強をして、効率よく仕事をこなし、できた余裕でまた勉強する、というポジティブな循環になれば、仕事は楽しくなってくるはずです。効率の悪い作業や、不勉強な状態で開発されたツールによって、みんなが疲弊していくというのは経営者にとっても良くないことです。

## お金を意識する

頑張っても給料上がんないし、という気持ちもわかります。ただ、無駄が減らないことには会社に入ってくるお金は増えませんし、作品を制作した後に残るお金が無くなりますから、結局いいことはありません。給料を払いたくないね、と思う経営者も稀にいるでしょうが、ほとんどの場合無いから増やしてあげられないという状態でしょう。

ミーティングで何時間も話す人がいますが、ミーティングはお金がかかっています。会議室分の家賃、その間拘束される人たちの時給。参加人数を考えれば、一回のミーティングで何万円が消えていっているか分かるでしょう。

雑談をするなというのではありません。仲間内で仲良くなるのには適度な無駄話というのは必要です。ただ、過度の自慢話、武勇伝などは部下に好かれるためにも、辞めておいたほうが賢明かと思います。

## 最後に

いろいろ書きましたが、この業界に恨みがあるわけではありません。日本の映像制作会社や、この業界が魅力的に、もっと元気になってくれればいいなと思っています。
Pandas データフレーム 文字列操作

Pandas データフレームの列操作の学習しても、頭が整理されなかった。
その理由は「列や行の選択の仕方が複数あること」だと思っていたが、違うことに気づいた。
理由は以下の２つの違いをきっちり意識できていなかったことだった。
忘れないうちにメモ。

pandasの文字列操作には２つの方法がある。
１、Iteration(for loopなど）を利用して、一つ一つの要素（エクセルで言う所の「セル」）にアクセスして操作を行う。
２、列自体が持つメソッド（正確にはSeriesまたはDataframeが持つメソッド）利用する。

参考リンクは以下。（２に関してのみ）
https://note.nkmk.me/python-pandas-str-replace-strip-etc/
Google Home Miniを開けてみた。

# 初めに
昨年末、忘年会があり、そこでGoogle Home Miniが当たった。
最初は未開封だったが、最近色んなことができることを知り、とりあえず開けてみることに・・・

# 開封編

![WIN_20180219_23_37_53_Pro.jpg](https://qiita-image-store.s3.amazonaws.com/0/228374/a701454d-0d4c-b503-60ab-579f3b41a901.jpeg)

開けてみたらこんな感じ。
セットアップとか複雑なのかと思いきや、アプリを入れて、セットアップしていくだけらしい。

# セットアップ編

まずはアプリをインストール。
その後、起動。
メアド（G-mailのメアド）か電話番号を入力
ここでGoogleHomeMiniの電源を入れる。
探して、見つける。（どうやって見つけてるのかは要調査）
Wifi設定
あとは適当にポチポチして完了！

ざっくりと書きましたが、とりあえずセットアップはこんな感じで。
【AWS】ソリューションアーキテクト［アソシエイト］受験の心得 

AWSソリューションアーキテクト（SAA）を受けてきました。
私の受験までの流れを書いておきます。ご参考までに。

# 事前知識
まず、AWS認定試験とは何かを知るために下記の資料を見ました。
・「AWSBlack Belt Online Seminar 2017」
https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2017-aws

# セミナー参加
推奨されている公式の認定トレーニングに参加しました。
・「Architecting on AWS」
https://aws.amazon.com/jp/training/course-descriptions/architect/

# 書籍学習
試験対策本も購入し、読みました。
「合格対策 AWS認定ソリューションアーキテクト - アソシエイト」
https://www.amazon.co.jp/gp/product/486594043X/ref=oh_aui_detailpage_o02_s00?ie=UTF8&psc=1

![Architect's book.jpg](https://qiita-image-store.s3.amazonaws.com/0/239026/1e8c16be-03af-10ba-f4da-d42f99b94efe.jpeg)

# 受験後の感想
①本は参考程度に。
上記の書籍が出版されたのは2016年8月。
それ以降に追加された新機能の記載はないので、その問題は取りこぼしやすいです。

本文中に「新機能については省略する」と明示的に書いてある部分もありますが、書いていない部分については自主的にAWSのドキュメントで補完する必要があります。

②2,000円をケチらない。
Web上で模擬試験を受けることができます（有料）。
私は受けなかったのですが、出題形式に慣れておくには良いかもしれません。

（余談ですが、私が行った受験会場では、画面の向こうに「リモート面接官」がいる状況での試験だったので少々戸惑いました。やり取りはチャットで行いました。）

③「真実はいつも１つ」とは限らない。
サンプル問題を見ていてもわかると思いますが、正解が複数ある問題が割とあります。
その場合はベストプラクティスが正解なので、即答せず他の選択肢も確認しましょう。

ちなみに、「サービス名 + ベストプラクティス」で検索するとページが見つかります。たとえば、「IAM　ベストプラクティス」など。

#受験結果
合否は、試験終了直後に確認できます。
合格レベルが「65%（非公式）」といわれている所、私は「62%」で見事に落ちました。。

あと1, 2問正解しておけばと悔やまれますが、仕方ないですね。
（再試験は、14日後から可能のようです。）

#最後に
出題傾向は時期によって変わるようなので、受験される方は要注意を。
Docker for Windows で Shared Drivers するときに ESET の ファイアウォールで引っかかった時の対処法

https://docs.docker.com/docker-for-windows/#firewall-rules-for-shared-drives

ぶっちゃけ、ここに書いてることが全てなんですけど、はまったので。

# 445 ポートを解放する

https://web-atelier-midori.com/blog/docker/2378/

上記サイトに記載の通りポートを開ければいいんですが、このサイトの設定通りにすると全開になる気がしたので、ちょっといじりました。

* 一般タブ

| 項目 | 設定値 |
|---|---|
| 名前 | 445解放 |
| 有効 | Enable |
| 方向 | 双方向 |
| アクション | 許可 |
| プロトコル | TCPおよびUDP |
| プロファイル | 任意のプロファイル |

* ローカル

| 項目 | 設定値 |
|---|---|
| ポート | 445 |
| IP | _設定なし_ |
| ゾーン | ローカルアドレス |

* リモート

設定なし

# ルールの優先順位の変更

定義済みルールの中に445を拒否する設定があって、それよりも許可する設定を上に持ってこないと意味がないので、それをする。定義済みルールを表示するには、「すべてのルール(定義済み)を表示」をチェックする。後は矢印ボタンで作成したルールを拒否ルールより上にもってくるだけ。

# 対象外アプリは設定不要

https://web-atelier-midori.com/blog/docker/2378/ では、対象外アプリにDockerを入れてるみたいだったけど、上記の設定をすれば問題なく Shared Drives は設定できたので、今回は設定しなかった。


以上
Laravel

# Laravel

Laravelの最短開発手順です。ブラウザ上で開発できる、Cloud IDEの
[PaizaCloud](https://paiza.cloud/)を使うと簡単です。

## PHP
PHPが入っていない場合XAMP, apt-get/XAMPなどでインストールします。
[PaizaCloud](https://paiza.cloud/)の場合は、すでに環境ができているので必要ありません。

## Laravelのインストール
composerなどでインストールします。インストールしなくても、composerコマンドを使うこともできます。
こちらも、[PaizaCloud](https://paiza.cloud/)の場合は、すでに環境ができているので必要ありません。

## Laravelプロジェクトの作成

laravelコマンドで作成します。

```
$ laravel new hoge-app
```

composerコマンドでもできます。

```
$ composer create-project laravel/laravel hoge-app --prefer-dist
```

## サーバ起動

artisanコマンドを使います。8000番ポートで起動します。

```
$ php artisan serve
```

## MySQLのインストール

apt-getなどでmysqlをインストールします。こちらも、[PaizaCloud](https://paiza.cloud/)ではインストール済みです。
そして起動します。

```
$ sudo systemctl enable mysql
$ sudo systemctl start mysql
```

## データベースサーバの設定

.envファイルで設定します。
設定箇所は、DB_DATABASE、DB_USERNAME、DB_PASSWORDです。

## デプロイ

デプロイにはサーバが必要です。[PaizaCloud](https://paiza.cloud/)では、クラウド上の開発環境なので、そのまま公開できます。

## 参照

http://paiza.hatenablog.com/entry/2018/02/16/paizacloud_laravel
puppeteerでよく使うであろう処理の書き方

puppeteer
https://github.com/GoogleChrome/puppeteer/releases

puppeteerを触ってみて自分がよく使う書き方を載せたら
これから始めてみようかなって人に需要あるんじゃないかと書いてみます

# Basic認証突破
```javascript
const USERNAME = 'user';
const PASSWORD = 'passwd';
await page1.setExtraHTTPHeaders({
    Authorization: `Basic ${new Buffer(`${USERNAME}:${PASSWORD}`).toString('base64')}`
});
```

# ページ移動
```javascript
await page.goto("https://qiita.com/", {waitUntil: "domcontentloaded"});
```
第二引数のwaitUntilオプションなしで次にセレクタに関する処理を書くと
ページを読み込む前に処理が走ってセレクタを取得できずエラーになったりするので
DOM読み込み完了を待たせます

# タブ切り替え
```javascript
const page1 = await browser.newPage();
const page2 = await browser.newPage();
await page1.bringToFront();
```
2個タブ開いて1個目のタブに戻る

# 入力
```javascript
await page.type("#loginid", "input");
```
`id="loginid"`の入力欄に`input`って入力してくれます

# セレクトボックスから選択
```javascript
await page.select('select[name="birthday_month"]', '12');
```
`value="12"`のoption要素を選択します

# クリック
```javascript
page.click('a[href^="index.php?query="]');
```
正規表現も使えるので`^=`って書くと前方一致で探せます
`index.php?query=`から始まるhref属性を持つaタグをクリックしてくれます

# フォーム送信
```javascript
await page.evaluate(({}) => {
    $('input[name="mode"]').parent("form").submit();
},{});
```
`<input type="hidden" name="mode" value="submit">`
みたいな要素を含むformをsubmitしてくれます
id属性がないフォームが並んでたりするときは無理やりsubmitボタンをクリックさせるより
submitさせる方が便利だったりします

# ページ遷移を待つ
```javascript
page.click('a[href="index.php"]');
await page.waitForNavigation({timeout: 60000, waitUntil: "domcontentloaded"});
```
`page.waitFor(3000)`みたいに待つのはちょっとかっこ悪いのでページ遷移を検知させます
`page.waitForNavigation`の方だけ`await`させるのがポイントです

# 遷移を待つ その2
```javascript
await page.click('a[href="login.php"]');
await page.waitFor('a[href="mypage.php"]', {timeout: 120000});
```
遷移先の要素が取得できるようになるまで待たせる、というやり方です
いっぱいリダイレクトしてある要素のあるページにたどり着く、みたいな時はこれですかね

# CSSを操作
```javascript
await page.evaluate(({}) => {
    $('#slider').css("display", "block");
},{});
```
アコーディオンとかはクリックさせて開くか、cssを直接いじるか
隠れてる入力欄に入力とかさせる分には困らないんですが
ヘッドレスモードオフで画面見ながら動かしたい時はこうやって表示させたり

# valueの取得
```javascript
var login_id = await page.$eval('input[name="login_id"]', el => el.value);
```
readonlyの入力欄から値を取ったりhidden属性のinput要素から値を取るにはこれ

# 要素内のテキストを取得
```javascript
var data = await page.$eval('.classname', item => {
    return item.textContent;
});
```
`<div class="classname"></div>`とかで囲まれているテキストを取る時はこれ

API一覧見るともっともっとたくさんありますが
この辺の書き方使えばそれなりに事足りるかなと
trans系のプロパティについて


よくtransform、translate、transitionのtrans系（勝手に命名）がどれがどれだかわからなくなるのでまとめました。
~~英語の意味全然違うやんとかのツッコミはなしでお願いします。~~
##先に結論
**transform（変形）**…対象を変形させるプロパティ。
**traslate（移動）**…transformで使うtransform関数の一つ。対象を移動させる。
**transition（遷移）**…CSSアニメーションを指定する時に使う。


## transform（変形）プロパティ
transformプロパティは要素の変形を行うもの。
2D、３Dどちらにもできる。

### **使用可能OS**
IE9にはベンダープレフックス(-ms-)をつけましょう。
IE8以前には未対応。
Opera Miniでは使えません。
他はだいたいおっけー。
### **値**
要素に関するtransform関数を渡す。
**transform関数**

|効果|説明|transform関数|
|:-----------------|:------------------|:------------------|
| 移動 |位置を移動させる |traslate()、traslateX()、traslateY()、traslateZ()、traslate3d()で指定。|
| 縮尺           |サイズを変更する |scale()、scaleX()、scaleY()、scaleZ()、scale3d()で指定。|
| 回転             |回転させる|rotate()、rotateX()、rotateY()、rotateZ()、rotate3d()、で指定。|
| 傾斜              |ゆがませる|skew()、skewX()、skewY()で指定。|

### **その他transform関連プロパティ**
**transform-originプロパティ**
変形時の原点を指定する。
**transform-styleプロパティ**
変形させた要素を平に描写するか、３Dに描写するかを決めるもの。
以下のサイトの画像が大変わかりやすいです。
https://web-designer.cman.jp/css_ref/abc_list/transform-style/

## transition(遷移)プロパティ
cssアニメーションさせるときに使う。
イベントでaddClassされるクラスや、擬似要素などの後からつくプロパティに関して、変化の種類や長さ、タイミングを設定する。
### **使用可能OS**
IE9以前には未対応。
やっぱりOpera Miniでは使えません。
他はだいたいおっけー。

### **値**
transitionにまとめて、書くか、それぞれバラバラのプロパティに書くか選べる。

|プロパティ名|説明|
|:-----------------|:------------------|
|transition|アニメーションに関する情報をまとめて記載 |
| transition-property|アニメーションの名前 |
|transition-duration |アニメーションの所有時間|
|transition-timing-function|イージング指定|
|transition-delay|アニメーションスタートまでの時間|

### **transitionサンプル**
もともとあるセレクタにtransitionを指定してあげて、後からつけるクラスや擬似要素に変更するプロパティを指定してあげます。

```css
div {
  font-size: 14px;
  transition-property: font-size;
  transition-duration: 4s;
  transition-delay: 2s;
}

div:hover {
  font-size: 36px;
}
```

もしくはすべてtransitionプロパティに書く場合

```css
div {
    transition:transition-propertyの値 transition-durationの値 transition-timing-functionの値 transition-delayの値;
}
```
SparkでPOSTデータの最大個数と最大数を変更する方法

Jettyでフォームの値の最大値は、デフォルトで200KBになっている。
SparkはJettyを利用しているので、これに準ずる。

Jetty単体の場合は色々な設定方法があるようだが、Sparkの場合は結構めんどくさい。

詳細は省くが、やり方は下記のとおり。

````java:
public class Main {
  public static void main(String[] args) {
    EmbeddedServers.add(EmbeddedServers.Identifiers.JETTY, new EmbeddedJettyFactory(new MyJettyServerFactory()));

    get("/", () -> "Hello Spark!");
  }
}

class MyJettyServerFactory implements JettyServerFactory {
    /**
     * Creates a Jetty server.
     *
     * @param maxThreads          maxThreads
     * @param minThreads          minThreads
     * @param threadTimeoutMillis threadTimeoutMillis
     * @return a new jetty server instance
     */
	@Override
    public Server create(int maxThreads, int minThreads, int threadTimeoutMillis) {
        Server server;

        if (maxThreads > 0) {
            int max = maxThreads;
            int min = (minThreads > 0) ? minThreads : 8;
            int idleTimeout = (threadTimeoutMillis > 0) ? threadTimeoutMillis : 60000;

            server = new Server(new QueuedThreadPool(max, min, idleTimeout));
        } else {
            server = new Server();
        }

        server.setAttribute("org.eclipse.jetty.server.Request.maxFormKeys", 20000); // POSTデータの最大個数
        server.setAttribute("org.eclipse.jetty.server.Request.maxFormContentSize", 5000000); // POSTデータの最大値

        return server;
    }

    /**
     * Creates a Jetty server with supplied thread pool
     * @param threadPool thread pool
     * @return a new jetty server instance
     */
	@Override
    public Server create(ThreadPool threadPool) {
        return threadPool != null ? new Server(threadPool) : new Server();
    }
}
````

ちなみにプログラムでフォームの値を取得しない限り、エラーとはならない。
これって仕様的にどうなんだろう。
Ruby バイナリでのファイル読み書きテスト

とあるバイナリデータをファイルに書き出して同じデータが読み出されるか確認したい
思えばやった事がなかった

ぐぐりながらやってみたけど、とりあえず

- File.binwrite
- File.binread

使っとけばいいんだろうか？

```rb
RUBY_VERSION
# => "2.5.0"

require 'tempfile'

test_file_path = File.join(Dir.tmpdir, 'delete_me.bin')
test_data      = (0..255).to_a.pack('C*')

File.binwrite(test_file_path, test_data)

# この辺りでファイルを消したり戻したり検証したかった処理を行う

puts File.binread(test_file_path) == test_data
# => true

puts `hexdump -C #{test_file_path}`
# =>
# 00000000  00 01 02 03 04 05 06 07  08 09 0a 0b 0c 0d 0e 0f  |................|
# 00000010  10 11 12 13 14 15 16 17  18 19 1a 1b 1c 1d 1e 1f  |................|
# 00000020  20 21 22 23 24 25 26 27  28 29 2a 2b 2c 2d 2e 2f  | !"#$%&'()*+,-./|
# 00000030  30 31 32 33 34 35 36 37  38 39 3a 3b 3c 3d 3e 3f  |0123456789:;<=>?|
# 00000040  40 41 42 43 44 45 46 47  48 49 4a 4b 4c 4d 4e 4f  |@ABCDEFGHIJKLMNO|
# 00000050  50 51 52 53 54 55 56 57  58 59 5a 5b 5c 5d 5e 5f  |PQRSTUVWXYZ[\]^_|
# 00000060  60 61 62 63 64 65 66 67  68 69 6a 6b 6c 6d 6e 6f  |`abcdefghijklmno|
# 00000070  70 71 72 73 74 75 76 77  78 79 7a 7b 7c 7d 7e 7f  |pqrstuvwxyz{|}~.|
# 00000080  80 81 82 83 84 85 86 87  88 89 8a 8b 8c 8d 8e 8f  |................|
# 00000090  90 91 92 93 94 95 96 97  98 99 9a 9b 9c 9d 9e 9f  |................|
# 000000a0  a0 a1 a2 a3 a4 a5 a6 a7  a8 a9 aa ab ac ad ae af  |................|
# 000000b0  b0 b1 b2 b3 b4 b5 b6 b7  b8 b9 ba bb bc bd be bf  |................|
# 000000c0  c0 c1 c2 c3 c4 c5 c6 c7  c8 c9 ca cb cc cd ce cf  |................|
# 000000d0  d0 d1 d2 d3 d4 d5 d6 d7  d8 d9 da db dc dd de df  |................|
# 000000e0  e0 e1 e2 e3 e4 e5 e6 e7  e8 e9 ea eb ec ed ee ef  |................|
# 000000f0  f0 f1 f2 f3 f4 f5 f6 f7  f8 f9 fa fb fc fd fe ff  |................|
# 00000100

File.unlink(test_file_path)
```

File.binread(test_file_path) == test_data で true が返ってくるなら同一とみなせる、これさえ観測できればspecにするのも簡単だわね

ただ、今回のような使い方をしたいだけであれば File.binread でも File.read でも同じっぽいんで、
「私はこのファイルをバイナリデータとして取得したいんですが かまいませんね！！」というセマンティクスを持たせるくらいになりそう

```rb
require 'digest'

Digest::SHA1.hexdigest(File.binread('/aa/bb/binary_file.bin'))
=> "4f256dc33dfac48514a825a126179b7ba398194d"

Digest::SHA1.hexdigest(File.read('/aa/bb/binary_file.bin'))
=> "4f256dc33dfac48514a825a126179b7ba398194d"
```

「Windows の IO にはテキストモードとバイナリモードという2種類のモードが存在します」
https://docs.ruby-lang.org/ja/latest/class/IO.html#io_binmode

「ファイルを開くときの mode は "rb:ASCII-8BIT" です」
https://docs.ruby-lang.org/ja/latest/class/IO.html#S_BINREAD
APIKit+Codableにおけるエラーレスポンスの取得方法

# 前提
[APIKitとCodableとの連携](https://qiita.com/matsuda/items/812321141a7c3b5f22bd)という素晴らしい記事を参考に、Codableとの連携を終えていること

# したいこと
ほとんどのWebAPIでは、エラー時のレスポンスが定義されています。
こんな感じに。

```json
{
   "status": 400,
   "message": "hogehoge"
}
```

<font color="ORANGE">**それをこの中で補足したい！**</font>　ということ

```swift
Session.send(request) { result in
    switch result {
    case .success(let response):
        print(response)
    case .failure(let err):
        print(err)        
    }
}
```

# 参考
APIKit作者様のブログ[「APIKit: レスポンスに応じた独自のエラーを投げる」](https://blog.ishkawa.org/2016/05/23/1463585002/)
↑はCodable非対応なので、これをCodable対応にしましょう。

# いざ、実装!
## Requestオブジェクトに追加
現在はおそらくこんな感じだと思います。

```APIKit_extension.swift
extension APIKit.Request where Response: Decodable {
    var dataParser: DataParser {
        return JSONDataParser() as DataParser
    }

    func response(from object: Any, urlResponse: HTTPURLResponse) throws -> Response {
        let decoder = JSONDecoder()
        return try decoder.decode(Response.self, from: object as! Data)
    }
}
```

ここにメソッドとエラーを定義します。(エラーは単純化したサンプル)

```APIKit_extension.swift
extension APIKit.Request where Response: Decodable {
    var dataParser: DataParser {
        return JSONDataParser() as DataParser
    }

    func response(from object: Any, urlResponse: HTTPURLResponse) throws -> Response {
        let decoder = JSONDecoder()
        return try decoder.decode(Response.self, from: object as! Data)
    }
    
    func intercept(object: Any, urlResponse: HTTPURLResponse) throws -> Any {
        // 200番台でない場合は、MyErrorを投げる
        guard (200..<300).contains(urlResponse.statusCode) else {
            // ひとまず、Decodableな構造体に値を埋める
            let decoder = JSONDecoder()
            let obj_decoded = try decoder.decode(TmpMyError.self, from: object as! Data)
            // それもとにMyErrorを生成して投げる
            throw MyError(object: obj_decoded)
        }
        
        return object
    }
}

struct TmpMyError: Decodable {
    let status: Int
    let message: String
}

struct MyError: Error {
    let status: Int
    let message: String
    
    init(object: TmpMyError) {
        status = object.status
        message = object.message
    }
}
```

## 呼び出し側にcaseを追加

``` swift
Session.send(request) { result in
    switch result {
    case .success(let response):
        print(response)
    case .failure(.responseError(let err as MyError)):
        print("MyServiceError Message", err.message)
    case .failure(let err):
        print("Unknown error", err)        
    }
}
```

#おわりに
これが最適解かは分かりませんが、快適なAPIクライアントを開発できました。
KotlinでJava RMIを利用する。

Kotlinを使ったWebアプリケーションサーバーを作成している時に、サーバーを分散できるように、複数モジュールでの通信を行おうと考えました。
KotlinはJVMで動いており、Javaの資産は全て使えます。
つまり、JVMでのORB/RPCであるRMIも使えるということになります。
基本はJavaと同じですがメモ書き程度にやったことを残しておきます。

# 構成

Projectは、以下の3つのモジュールに分割されています。

- RMI Interface
- RMI Server
- RMI Client

RMI Client及びRMI Serverは共にRMI Interfaceに依存しており、RMI ClientとRMI Serverにおける直接の依存関係はありません。

# RMI Interface

RMI Interfaceモジュールは、下記のExampleRMIInterfaceのみを持ちます。

```kotlin:ExampleRMIInterface.kt

import java.rmi.Remote
import java.rmi.RemoteException

interface ExampleRMIInterface: Remote {
    @Throws(RemoteException::class)
    fun echo(text: String): String
}
```

RMIに用いるInterfaceは全てjava.rmi.Remoteを継承します。
また、RMIに用いるInterfaceの全てのメソッドはthrows RemoteException宣言されている必要があります。
Kotlinにおいては、@Throwsアノテーションをつけることで、コンパイル時にthrows宣言と同等の扱いになります。

# RMI Server

RMI Serverは、ExampleRMIInterfaceの実装であるExampleRMIImplと、メインクラスとなるExampleRMIServer.ktを持ちます。

```kotlin:ExampleRMIImple.kt

class ExampleRMIImpl: ExampleRMIInterface, UnicastRemoteObject(23456) {
    override fun echo(text: String): String {
        println(text)
        return text
    }
}

```

RMIに用いるInterfaceの実装には、@Throwsアノテーションをつける必要はありません。
また、UnicastRemoteObjectを継承することで、exportする手間を省くことができます。
UnicastRemoteObjectのコンストラクタに入れている数値はポート番号で、省略した場合匿名ポートが使われます。

```kotlin:ExampleRMIServer.kt
import java.rmi.registry.LocateRegistry

fun main(args: Array<String>) {
    val registry = LocateRegistry.createRegistry(23450)
    val remote = ExampleRMIImpl()
    registry.bind("example", remote)
}

```

まず、LocateRegistry.createRegistry()でRMIのRegistryを作成します。
このコードは、rmiregistryコマンドを実行することの完全な代替で、示す挙動はほぼ同じです。
独立したプロセスで行われるか、Server内の1スレッドとして行われるかの違いです。
また、引数はRegistryのポート番号で、クライアント側はこのポート番号を指定することでRegistryを取得できます。
そして、registry.bind()でRegistryにRemoteインターフェースを実装したオブジェクトを登録します。
第一引数は識別名で、LocateRegistryからこの識別名を用いてRMIのオブジェクトを取得できます。

# RMI Client

RMI Clientは、RMIを用いてメソッドを呼び出す、メイン関数/クラスのみを持ちます。

```kotlin:ExampleClient.kt

fun main(args: Array<String>) {
    val registry = LocateRegistry.getRegistry(23450)
    val example = registry.lookup("example") as ExampleRMIInterface
    example.echo("Hello, RMI!")
}
```

まず、ポートを指定してLocateRegistryを取得します。
同一物理サーバー内でない場合、第一引数にRegistryのホストのアドレスを文字列で入れることで、対象を指定できます。
次に、LocateRegistryに登録されているRemoteオブジェクトを取得し、使用しているRMI用のInterfaceにキャストします。
対象の検索はRegistryへの登録時に使った識別名を用います。
そして、取得したRemoteオブジェクトのメソッドを呼び出すと、RMI Serverへの通信が行われ、RMI Server側の実装が呼び出されます。

# 最後に
RMIについてわかりやすくまとめたドキュメントが少ない気がする(この記事がわかりやすいとは言っていない)
特に、rmiregistryを使わずにコードベースだけでやる方法は、中途半端だったりして情報を集めるのに多少苦労しました。
が、仕組みが分かってしまうと非常に簡単に実装することができ、通信をほとんど意識すること無く通信ができるので、非常に便利ですね。RMI。
マイニング用ASIC設定入門

# なぜこんな記事を書いたのか

某プール管理人さんの所にASICに関する質問が舞い込んだ為です。
ニーズがありそうなので、メモメモ。

# マイニング用ASICとは？

特定のアルゴリズムに特化した外付け専用集積回路装置。
GPUのバケモノみたいなものです。

## メリット

### **パフォーマンスが桁違いに良い**

最新型であれば最上位GPU100倍以上のパフォーマンスが見込めます。
2－3年前に販売された型落ちASICを選んでも、最上位GPUの2－3程度の効果は見込めます。

## デメリット

### **特定アルゴリズムにしか対応していない**

主に、SHA256、Scrypt、X11など。
―――
以下のアルゴリズムにはASICは対応出来ない為、GPUを利用する必要があります。

- ETHで採用されているDagger/Hashimoto
- Zcashで採用されているEquihash
- MONAで採用されているLyra2REv2

また、CPU特化型にも、ASICは対応できません。

- Moneroで採用されているCryptoNight
- BitZenyで採用されているYescrypto-r8（original yescrypto0.5）
- YENTENで採用されているYescrypto-r16

### **入手困難（主に中国製）**

海外から取り寄せる必要あり。

### **日本国内限定で、黒字採掘できる期間が短い**

日本の電気代は高いのです。

### **うるさい**

騒音はなかなかのものです

### **電力使いすぎで、ご家庭のブレーカーが落ちる**

海外からASICまとめ買いしたのち、この問題に該当して泣いている方が何名か、、、


# 設定方法

2つのタイプがあります。入手前に調べておくと吉。

## ASIC単独で動作可能なもの（オススメ）

ASICにラズパイがついているモデル。
最近はこちらが主流。
電源を入れると、ラズパイがDHCPでIPを取得、HTTPサーバとして稼働します。
以降の設定はブラウザ上で完結。ラクチン。

### PCに外部USB装置として認識させるもの

ラズパイが付いていないモデル、あるいは、USB型ASICなど。
別途Linuxサーバを用意し、かつ、マイニングツールを用意する必要あり。

オススメはbfgminer
http://bfgminer.org/

リリースノート等はこちら
https://bitcointalk.org/?topic=877081

参考までに、うちの~~化石~~ G-bladeさんは、以下の設定で動いています(bfgminer 5.4.2)

```
./bfgminer --scrypt -o stratum+tcp://hostname:port -u username -p password --api-listen -S noauto -S gsd:all --set-device gridseed0:clock=825 --set-device gridseed1:clock=825 
```

# オススメしますか？

入手難易度や、以下の観点を含めて考えると、GPUマイニングリグのほうが汎用性が高いんじゃないかなぁと思います。

- 最終的にASIC同士の殴り合いになるので、難易度が一気に上がる

- ASICは利益率の高い新アルゴリズムに対応できない

また、これから新コインを立ち上げようという方がいらっしゃるのであれば、ASIC未対応のアルゴリズムを採用することを**強く**お勧めします。

以上。
Perlの可読性はそんなに悪くない ～ 関数の引数編

# 始めに

最近、周りの人からよく言われます。

> Perlってだせぇよな～
> 帰ってPythonやろうぜ！

その理由の1つが「Perlは可読性が低い」ということらしいのです。
しかし個人的には、書き方によっては読みやすくも読みづらくもなり、それは言語に依存しないはずだと思います。

そこで、そんな悪評を吹き飛ばすために、可読性の高いコードを見てもらおうと考えました。



# 例: 関数の引数を受け取る場合

## 可読性が低い例

Perlでは関数の引数は、全てデフォルト配列に格納します。

「デフォルト配列...う、頭が」と思った方は、恐らく`@_`を想像していると思います。

```pl:デフォルト配列の使い方
print_arg1("text");

sub print_arg1 {
    my ($argv1) = @_;

    print $argv1;
}
```

```text:実行結果
text
```

正直読みづらいです。
これでは初心者さよならと言われても仕方ありません。



## 問題点

先ほどのコードの問題点を上げます。

- `@_`という謎の記号
- 配列なのに、なぜかスカラへの代入に配列の要素数ではなく要素を入れている？

2つ目については少し説明します。

Perlでは、配列をスカラに代入しようとすると、配列の要素数を入れます。

```pl:要素と要素数
my @three_elements = ("first", "second", "third");
my $count = @three_elements;
print $count;
```

```text:実行結果
3
```

ですが、先ほどのコードでは、`@_`をスカラに代入しようとしたら、なぜか配列の0番目の要素を入れているように見えます。

```pl:デフォルト配列の使い方（再掲）
print_arg1("text");

sub print_arg1 {
    my ($argv1) = @_;

    print $argv1;
}
```

これに関してですが、~~調べても詳しい説明は出てきませんでした。
仕様として考えるのが妥当かもしれません。~~

根本的な書き方を間違えてました。

```pl:今まで書いていたダメな例
print_arg1("text");

sub print_arg1 {
    my $argv1 = @_;

    print $argv1;
}
```

```text:実行結果
1
```

`my $argv1 = @_`と書くと要素数を入れてしまいますが、`my ($argv1) = @_`と書くことで、配列の1番目の要素を`$argv1`に入れることができます。

実行結果をちゃんと見ていなかった僕が悪いので、反省の意も込めて残しておきます。




## 解決策への事前知識

別の道を探りましょう。

PerlにはFIFOを簡単に実行できる組込み関数があります。
`shift @args`と書くことで、その戻り値に配列`@args`の先頭を渡し、`@args`にはその先頭が無くなった配列が残ります。

それを利用して、サブルーチンを見やすくしてみましょう。

```pl:デフォルト配列の使い方（再々掲）
sub print_arg1 {
    my ($argv1) = @_;

    # ...
}
```

```pl:デフォルト配列の先頭を取出すことを明記した書き方
sub print_arg1 {
    my $argv1 = shift @_;

    # ...
}
```

更に、Perlではデフォルト変数やデフォルト配列は、明記してする必要がない場合は省略できます。
これでもっと可読性が上がるに違いありません。



# 結果

```pl:これが可読性の高いコードだ！
print_arg1("text");

sub print_arg1 {
    my $argv1 = shift;

    print $argv1;
}
```

```text:実行結果
text
```

......



# おわりに

僕はそれでもPerlが好きです。

もし何か気づいたこと、気になったことがあれば教えてください！
Web初心者がfirebaseでPWA入門してみる(Authorization編)

# はじめに
こちらは[Web初心者がfirebaseでPWA入門してみる](https://qiita.com/tamalign/items/18d443787cf99bec1138)の第二回になります。
*前回の拙い記事をいいねしてくださった方ありがとうございます・・！*

今日は前回作成した`なまいきなねこ`とGoogleさんを繋げてみたいと思います。

端的に言うとログイン機能を実装して、ねこに言葉を教えるときに利用したいと思います。

成果物はこちらになります。
https://github.com/tamalign/CheekyCat/tree/day2

# Authorization機能を実装する
まずはプロジェクトに`Auth.js`を追加します。

```javascript:auth.js
var auth_button = document.getElementById('auth-button');
var logout_button = document.getElementById('logout-button');

firebase.auth().onAuthStateChanged(function(user) {

  if (user) {
     // ログアウトボタンを出す
     logout_button.style.display = "";
     auth_button.style.display = "none";
  } else {
    logout_button.style.display = "none";
    auth_button.style.display = "";
  }
});

function Auth()
{
  var provider = new firebase.auth.GoogleAuthProvider();
  firebase.auth().signInWithRedirect(provider);
}

function Logout()
{
  firebase.auth().signOut().then(function() {
    console.log("ログアウトしました");
    location.reload();
  }).catch(function(error) {
    console.log("ログアウトエラー");
});
}

```

Authorizationもログアウトも(ほぼ)一行で書けるので素敵ですね。

今回はGoogleアカウントでのログインを実装しました。

index.htmlも書き換えます。

```html:index.html
<!-- ログインボタン -->
<div id="button-container">
    <a href="#" id="auth-button" class="square_btn_blue" onclick="Auth()">ねこをGoogleに繋ぐ</a>
    <a href="#" id="logout-button"  class="square_btn_red" onclick="Logout()">ねこをGoogleから離す</a>
</div>
```


ログイン/ログアウトボタン要素をそれぞれ取得し、`firebase.auth().onAuthStateChanged`のコールバックで表示/非表示を制御します。
### ハマりどころ その1
前回書いたhtmlからのFirebase SDKの呼び出しですが、scriptタグの設定が`defer`になっていたため、新規に追加したauth.jsが先に読み込まれて `firebase`がundifinedと怒られました。

今回は速さは求めていないので、とりあえず`defer`を外しました。

### ハマりどころ その2(未解決)
*ログインした後のRedirect後に、firebase.auth().onAuthStateChange()が呼ばれるまで2つのボタンが表示されてしまいます。*

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79662/ea2ff246-2bc4-3150-bd2c-8da44ba4d3a0.png)

予めボタンのタグにstyle="display: none"を設定すると、コールバックでなぜか上書きしてくれない・・。

格好が悪いので早めに修正したいです。

**追記**
どうやらstyle="compact"を指定するとうまく動かないみたいです。

`style.display = ""`を指定して上書きしてやるとうまく消えました！

#まとめ
今回はGoogleアカウントでのログイン/ログアウトを実装してみました。

ハマりどころ2が解決していないので、後ほど修正して~~追記する予定です。~~追記しました。

次回は認証を行なった後に取得できるトークンを利用してユーザーアカウントを作成し、firebaseのRealtime Detabaseに追加したいと思います。
GAE/GoのMemcacheチートシート

# はじめに
Memcacheについて、簡潔にまとめてみました。

ひとまず代表的な処理のみ挙げてます。

# 公式ドキュメント
[Memcacheの概要](https://cloud.google.com/appengine/docs/standard/go/memcache/)
[Memcacheの使い方](https://cloud.google.com/appengine/docs/standard/go/memcache/using)
[Memcacheにおけるエラーハンドリングの重要性](https://cloud.google.com/appengine/articles/best-practices-for-app-engine-memcache#handling_memcache_api_failures_gracefully)
[memcache -GoDoc](https://godoc.org/google.golang.org/appengine/memcache)

# チートシート
以下は省略してます。

- コンテキストの生成 `ctx := appengine.NewContext(req)`
- import文

なお、エラー時の変数については[公式ドキュメント variables](https://godoc.org/google.golang.org/appengine/memcache#pkg-variables)を要参照

## Add
```go
// 追加したいItemを生成
item := &memcache.Item {
    Key: "飯島",
    Value: "院生",
    Expiration: time.Duration(1440) * time.Second //期限を1440秒に指定
}

err := memcache.Add(ctx, item)
// keyに該当するitemが既に存在している場合
if err == memcache.ErrNotStored {
    log.Infof(ctx, "item with key %q already exists", item.Key)
    return
}
// それ以外のエラーが起きた場合
if err != nil {
    log.Errorf(ctx, "error adding item: %v", err)
}
```

## Set
```go
// セットしたいItemを生成
item := &memcache.Item {
    Key: "飯島",
    Value: "院生",
    Expiration: time.Duration(1440) * time.Second //期限を1440秒に指定
}

err := memcache.Set(ctx, item)
if err != nil {
    log.Errorf(ctx, "error setting item: %v", err)
}
```

## Get
```go
// 取得したいItemのkey
key := "周平"

item, err := memcache.Get(ctx, key)
// keyに該当するItemが存在しない場合
if err == memcache.ErrCacheMiss {
    log.Infof(ctx, "item not in the cache")
    return
}
// それ以外のエラーが起きた場合
if err != nil {
    log.Errorf(ctx, "error getting item: %v", err)
    return
} 

// 取得したItemの値をstringに変換
v := bytesToString(item.Value)
```

### byte配列からstringへの変換
ItemのValueをstringに変換する際に、筆者はこれを使いました

```go
func bytesToString(data []byte) string {
	return string(data[:])
}
```

## Delete
```go
// 削除したいItemのkey
key := "飯島"

err := memcache.Delete(ctx, key)
// keyに該当するItemが存在しない場合
if err == memcache.ErrCacheMiss {
    log.Infof(ctx, "item not in the cache")
    return
}
// それ以外のエラーが起きた場合
if err != nil {
    log.Errorf(ctx, "error getting item: %v", err)
    return
}
```
オフィスファイルからPDFに変換

まずは LibreOffice をインストール

```
$ sudo yum install libreoffice
```

適当に変換

```
$ libreoffice --convert-to pdf --headless a_word.doc
$ libreoffice --convert-to pdf --headless a_excel.xlsx
```

オプションについては、

```
$ libreoffice --help
```

で確認する。
参照渡し【PHPエラー】

#PHP Notice
**Only variables should be passed by reference in** エラーの対処
なんで*Notice*出るのか理解できたのでメモ

```php
  /*  $rows 配列が入ってる
   *  $key 配列の最後のキーをint型で入れたい
   *  $ary_rows 参照渡し用キーを入れる配列
   */

  
  $key = (int)end(array_keys($rows)); // 1行で済むけど参照渡しになってない

  // ↑を分解してarray_keysの配列を一旦変数に入れてやるとNoticeエラーが出ない
  $ary_rows = array_keys($rows); // 配列のキーを入れてる
  $key = (int)end($ary_rows); // 配列のキーの最後のキーを入れてる
```
Cocos2dでSceneを作成・切り替える方法


新しいSceneクラスを作成します。
例では`CharacterList`と言うキャラクターを表示するシーンの想定していきます。



```CharacterList.h
#ifndef CharacterList_h
#define CharacterList_h

#include "cocos2d.h"

class CharacterList : public cocos2d::Scene
{
public:
    static cocos2d::Scene* Scene();
    virtual bool init();
    CREATE_FUNC(CharacterList);
};



#endif
```

```CharacterList.cpp
#include "CharacterList.h"

USING_NS_CC;


Scene* CharacterList::Scene(){
    auto scene = CharacterList::create();
    return scene;
}

bool CharacterList::init()
{
    if ( !Scene::init() ){
        return false;
    }
    
    
    
    auto visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();
    
    

    auto sprite = Sprite::create("Background.jpg");
    if (sprite == nullptr)
    {
        printf("Error");
    }
    else
    {
setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
        
        // add the sprite as a child to this layer
        this->addChild(sprite, 0);
    }
    
    

    return true;
}


```

CPP内の`CharacterList::create();`を実行する事で
CharacterListのinitが自動的に呼び出される様になってます。


大まかにこんな感じで準備したら、
切り替えたい箇所で次のコードを記述するだけ

```
Director::getInstance()->replaceScene(CharacterList::Scene());
```
RとPythonでKruskal-Wallis検定

データ作成
===

とりあえずPythonで適当なデータを作る。

```py
>>> import numpy as np
>>> import pandas as pd
>>> n = 100
>>> val = np.random.randn(n)
>>> cls = np.random.choice(['A', 'B', 'C'], n)
>>> a = pd.DataFrame(dict(cls=cls, val=val))
>>> a.head()
  cls       val
0   B  0.040708
1   A  2.736491
2   C  0.348282
3   C -0.942777
4   C  0.463018
>>> a.to_csv('hoge.tsv', index=False, sep='\t')
```

R
===

```R
> a <- read.table('hoge.tsv', header=T)
> head(a)
  cls         val
1   B  0.04070846
2   A  2.73649079
3   C  0.34828178
4   C -0.94277665
5   C  0.46301770
6   A -0.36467223
> kruskal.test(a$val ~ a$cls)

        Kruskal-Wallis rank sum test

data:  a$val by a$cls
Kruskal-Wallis chi-squared = 0.63086, df = 2, p-value = 0.7295
```

Python
===

```py
>>> import pandas as pd
>>> from scipy import stats
>>> a = pd.read_table('hoge.tsv')
>>> stats.kruskal(*(x[1] for x in a.groupby('cls')['val']))
KruskalResult(statistic=0.63086166681182476, pvalue=0.72947452456379802)
>>> len(a['cls'].unique())-1
2 # 自由度は勝手に出ないので、必要ならカテゴリ数-1で求める。
```

同じ結果が得られました。
mysqlコマンド

Mysql ログインコマンド
mysql -u kotakawa1110 -p

root ログイン
mysql -u root -p


create_myapp.sql

drop database if exists myapp;
create database myapp;
grant all on myapp.* to kotakawa1110 identified by "@Kota0108";

ファイル実行

\. ./create_myapp.sql　　root　mysql内で実行

もしくは

mysql -u root -p < create_myapp.sql 


select count(page_id) from page;
Pageテーブルのpage_idフィールドのフィールド数を出力
DESC page;
Pageテーブルのフィールド名一覧



create database jpencut CHARACTER SET utf8

alter table bicuttext change id id int(11) AUTO_INCREMENT;

create table bicuttext (id int primary key, jptitle varchar(255), jppage mediumblob, entitle varchar(255), enpage mediumblob);



ALTER TABLE page ADD INDEX index_title2(page_title);


page_titleにインデックスを貼る。（use JpWikipedia内）

show index from page;


$ask = "select ll_title from langlinks where ll_from=".$id." and ll_lang='".$ll_lang."'";


$ask = "select rd_title from redirect where rd_from=".$rd_from_id;


alter table langlinks add index index_link_id(ll_from);

alter table langlinks add index index_link_lang(ll_lang);


alter table redirect add index index_rd(rd_from);
Latexショートカットコマンド

Mac　OS　high　Sierra
バージョン10.13.3

emacs上でのlatexショートカットコマンドメモ


C-c C-t j :コンパイル
C-c C-t d :pdf化
C-x u :戻る
C-x 1:現在使用中のバッファ以外は非表示
trコマンド使い方

\r を \nに（\rを除去かも）

tr -d '\r' <1214_3bunya_teacher.txt>　1214_3bunya_teacher_kota.txt

参考：（http://blog.livedoor.jp/akf0/archives/51600360.html）


タブをスペースに
cat hightemp.txt | tr '\t' ' ' > hightempspace.txt
Azure Functionsで "hello world" 関数を作成してみた

## 初めに
Azure Functionsで"hello world" 関数の作成を試してみました。
AzureポータルからGUIを操作することで、5分程度で関数を作成することができ、下記のようにブラウザで、関数の動作を確認できます。
![AzureFunctions01.png](https://qiita-image-store.s3.amazonaws.com/0/239292/982f2944-b867-bbcb-9b6d-6f771bdee550.png)

以降のページに、Azure Functionsで"hello world" 関数を作成する手順を記します。
参考サイト：「Azure Portal で初めての関数を作成する」
https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-create-first-azure-function

# 1. Azure Portalで関数を作成する
Azure Portal の左上隅にある 「＋」（新規） ボタンをクリックします。
[Function App] をクリックします。
![AzureFunctions03.png](https://qiita-image-store.s3.amazonaws.com/0/239292/1d0ded36-f788-e104-78d2-f18954775971.png)

必要事項を入力した後、[作成] をクリックします。

アプリ名：新しい Function App を識別する名前。
サブスクリプション：有効なサブスクリプションを選択する
リソース グループ：Function App を作成するための新しいリソース グループの名前。
ホスティング プラン：既定の [従量課金プラン] では、リソースは関数の必要に応じて動的に追加されます。 ユーザーは、関数が実行された時間に対してだけ支払います。
場所：ユーザーに近い場所、または関数がアクセスする他のサービスの近くの場所を選択します。
Storage：Function App によって使用される新しいストレージの名前。
![AzureFunctions04.png](https://qiita-image-store.s3.amazonaws.com/0/239292/b72114a8-f336-e66a-1790-464bb1d31dea.png)

通知メニューで、デプロイメントが成功したことを確認します。

# 2.作成した関数の確認
Function App を展開します。
![AzureFunctions06.png](https://qiita-image-store.s3.amazonaws.com/0/239292/6650aff2-1007-09a9-7100-3fc1b5ebfd70.png)
作成した関数を選択します。
![AzureFunctions07.png](https://qiita-image-store.s3.amazonaws.com/0/239292/6b3c4e01-c9ee-70d2-77b3-ef9ea6ed0f83.png)
[関数] の横にある [+] ボタンをクリックします。

「1 シナリオを選択します」で「webhook + API」を選択します。
「2 言語を選択します」で「JavaScript」を選択します。
「この関数を作成する」をクリックします。
![AzureFunctions09.png](https://qiita-image-store.s3.amazonaws.com/0/239292/76c12092-b71d-b163-130d-077860b2cc41.png)
関数が作成されます。
「関数のURLの取得」をクリックします。
![AzureFunctions10.png](https://qiita-image-store.s3.amazonaws.com/0/239292/9e22e10e-f236-6bd4-80bd-c31748e3eecd.png)
「Get function URL」画面で「Copy」をクリックし、関数のURLをコピーします。
コピーした関数のURLをブラウザのアドレス欄に張り付けます。
この URL にクエリ文字列 &name=<任意の名前> を追加し、Enter キーを押して、要求を実行します。
![AzureFunctions12.png](https://qiita-image-store.s3.amazonaws.com/0/239292/b15d87e1-198b-d44d-c5cb-399592d02046.png)
関数のWebページが表示され、”Hello <任意の名前>”が表示されることを確認します。

以上
PhpStormで新規クラス作成時に自動挿入されるコメント(コードテンプレート)を無効にする

PhpStormでは、新規PHPクラスを作成するときにこのようなテンプレートコメントが自動挿入されてしまいます。

```php
/**
 * Created by PhpStorm.
 * User: DQNEO
 * Date: 2018/02/19
 * Time: 21:56
 */
```

これを無効にする方法をついに見つけました。

Preferences -> Editor -> File and Code Template -> Includes (TAB) -> PHP File Header

で編集して空にする。

# 参考
https://stackoverflow.com/questions/28787975/disable-phpstorm-new-file-branding
Slack通知: AWSコストとTrusted Advisorを見やすく表現する

何かを解決したいときの第一歩は、可視化から始めるとよいでしょう。
ということで、AWSコストとTrusted AdvisorをSlackに見やすく通知してみました。

全体的に気をつけた点

* ファーストビューに収める
* グラフィカルにする。絵文字を使う

# Trusted Advisor

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37384/0a3960d2-17bd-dee4-f5d6-af455ae6aca0.png)

##Slackメッセージのattachmentsサンプル

Ruby風

```json

{
    "attachments": [{
        "text": "<https://console.aws.amazon.com/trustedadvisor|TrustedAdvisor>
${savings}/月 節約できるかも？",
        "fields": [{
            "title": ":moneybag:コスト最適化",
            "value": ":broken_heart: ${cost_optimizing.error}　:yellow_heart: ${cost_optimizing.warning}",
            "short": true
        }, {
            "title": ":timer_clock:パフォーマンス",
            "value": ":broken_heart: ${performance.error}　:yellow_heart: ${performance.warning}",
            "short": true
        }, {
            "title": ":closed_lock_with_key:セキュリティ",
            "value": ":broken_heart: ${security.error}　:yellow_heart: ${security.warning}",
            "short": true
        }, {
            "title": ":umbrella:フォールトトレランス",
            "value": ":broken_heart: ${fault_tolerance.error}　:yellow_heart:  ${fault_tolerance.warning}",
            "short": true
        }, {
            "title": ":chart_with_upwards_trend:サービス制限",
            "value": ":broken_heart: ${service_limits.error}　:yellow_heart:  ${service_limits.warning}",
            "short": true
        }],
        "color": "#DDDDDD"
    }]
}

```

##利用するAWSのAPI
 
* DescribeTrustedAdvisorCheckSummaries
  * Trusted Advisorのデータ取得
* DescribeTrustedAdvisorChecks
  * Trusted Advisorのカテゴリ名を一括取得するだけ

## 工夫した点

* Trusted Advisorの各カテゴリのマークに絵文字を合わせた
* 重要なものだけ見せるため、問題のないGreen表示はカットした

# AWSコスト

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37384/e0ffb088-2577-7d26-2bdc-16ccb59ead70.png)


##Slackメッセージのattachmentsサンプル

python風

```python
{"attachments": [
        {
            "title": "今月のAWSコスト",
            "title_link": "https://console.aws.amazon.com/billing/home",
            "fields": [
                {
                    "title":  "¥{:,d}".format(math.ceil(total_cost)*rate) + ' ぐらい(現在)\n',
                    "value":  formatted_text + '\n今日までで${cost}'.format(cost=total_cost),
                    "short": "false"
                },
            ],
            "color": "#fff600",
            'ts':time.time(),
            "footer": '📕 {no1} ${no1cost} \n📒 {no2} ${no2cost}\n📗 others'.format(no1=no1,no2=no2 ,no1cost=no1cost ,no2cost=no2cost)
            }]
}

```


## 利用するAWSのAPI

* GetMetricStatistics : コストの取得
* ListMetrics : AWSサービス名を一括取得するだけ

## 工夫した点

* 割合を表現するため、7×7の49マス正方形を利用する
    * 1マス約2%となる
    * 長さ高さも大きすぎず小さすぎず
* 各マスについては端数は大雑把に処理する
    * 多少ずれてても趣旨はぶれない
brew audit がエラーで動かなかったので修復（homebrew）

こんにちは。
```brew audit``` がエラーで動かなくなったので修復しました。これは "[Old ~/.gem folder breaks brew audit after OS upgrade](https://github.com/Homebrew/brew/issues/3355)" (github.com/Homebrew/brew/issues/3355) の処方通りにしています。

```console
$ brew audit a_formula
Error: Could not find 'parallel' (~> 1.10) among 6 total gem(s)
:
:
$ rm -rf ~/.gem
$ rm -rf "$(brew --repo)"/Library/Homebrew/vendor
$ git -C "$(brew --repo)" checkout .
$ brew audit a_formula
```