OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScript: Array,Map,Object,Setをディープコピーする関数

2018.11.05 若干変更して[別記事](https://qiita.com/ttatsf/items/68de3795ae3bf35c0228)にまとめました。

#2018.10.24追記
これでいいみたい。ついでにSetも足してみました。

```js:
const mapForMap = f => a => new Map( [...a].map( f ) );  
const mapForSet = f => a => new Set( [...a].map( f ) );
const mapFromEntriesIntoObj = f => xs =>
  xs.reduce((acc, e)=>( { ...acc, [e[0]]:f(e[1]) } ), {} );
const mapForObj = f => a =>
  mapFromEntriesIntoObj( f )( Object.entries( a ) );
const getType = a => Object.prototype.toString.call(a).slice(8,-1) ;

const clone = a => {
  const type = getType( a );
  return (type === "Array")?  a.map( clone )
        :(type === "Map")?    mapForMap( clone )( a )
        :(type === "Set")?    mapForSet( clone )( a )
        :(type === "Object")? mapForObj( clone )( a )
        : a;
}
```

#以下、過去記事

完璧に何にでも対応できるディープコピーはやっぱり無理なようで(あったら教えてください)。
で、自分が困らない程度に作ってみました。

+ Map,Object用のmap関数を作る。
+ 引数が何なのか、文字列で取得。
+ 引数がArray,Map,Objectなら要素に再帰的にcloneを適用
+ それ以外ならそのまま返す


```Javascript:
const clone = a => {
  const mapForMap = f => a => {
      const b = new Map();
      [...a.keys()].forEach( e => b.set( e, f(a.get(e)) ) );
      return b;
  }
  const mapForObj = f => a => {
      const b = {};
      Object.keys(a).forEach( e => b[e] = f(a[e]) );
      return b;
  }
  const type = Object.prototype.toString.call(a).slice(8,-1) ;
  if(type === "Array") return a.map( clone );
  if(type === "Map") return mapForMap( clone )( a );
  if(type === "Object") return mapForObj( clone )( a );
  return a;
}

```

```Javascript:
class myClass{ 
  constructor(name){ 
    this.name=name 
  } 
}

const object = { 
   a: 1, 
   b: 'a', 
   c: '', 
   d: null, 
   e: undefined, 
   f: true, 
   g: [1, 2, 3], 
   h: function () { console.log('h'); }, 
   i: { 
     a: 1, 
     b: 'a', 
     c: '', 
     d: null, 
     e: undefined, 
     f: true, 
     g: [1, 2, 3], 
     h: function () { console.log('h'); }, 
     i: { a: 1 }, 
     j: new Map([ [ 0, 0 ], [ 1, 1 ] ]) ,
     k: new myClass("Q") 
   },
   j: new Map([ [ 0, 0 ], [ 1, 1 ] ]) ,
   k: new myClass("Q")
}

const cloned = clone(object)

console.log(cloned)
/* => 
{ 
  a: 1,
  b: 'a',
  c: '',
  d: null,
  e: undefined,
  f: true,
  g: [ 1, 2, 3 ],
  h: [Function: h],
  i: 
   { a: 1,
     b: 'a',
     c: '',
     d: null,
     e: undefined,
     f: true,
     g: [ 1, 2, 3 ],
     h: [Function: h],
     i: { a: 1 },
     j: Map { 0 => 0, 1 => 1 },
     k: { name: 'Q' } },
  j: Map { 0 => 0, 1 => 1 },
  k: { name: 'Q' } 
}
*/
```

だいたいは思ったとおりです。使えそう。
自前で定義したクラスmyClassはObjectに変わってしまっています。

Mapを特定したいので.toStringメソッドを使っていますが、これもやろうと思えば簡単に上書きできるので、そういうことがありうる環境では使えないかもです。

参考記事：[【JavaScript】オブジェクトをDeepCopyするclone関数を書いた](http://webkatu.com/clone-function-to-deepcopy-object/)
 [ES6のObject.assignがシャローコピーなのでディープコピーする方法を考える](https://kuroeveryday.blogspot.jp/2017/05/deep-clone-object-in-javascript.html)
同じ日付の昔の写真をツイートさせる

Google photo の `remember this day` という機能がある。Google photo に保存している、その日と同じ日付の昔の写真をまとめてくれる。私はこの機能がとても好きである。
思い出写真人間にはもってこいの機能だが、この機能は毎日発動するわけではない。そこで自分で似たような機能を作ろうと[以前作成した機能](https://qiita.com/paper2/items/65e07ad14520510cc472)を少しグレードアップ。

その日と同じ日の写真をツイートするようにしました。
これを実装するために、写真のメタ情報管理しないとだめだなと思い SQLite3 を利用してメタ情報を管理するようにしました。また網羅的に写真を見るために、view数も保持できるようにしました。これでできる限り多くの写真を見れるはず！

私の思い出ライフスタートです。


できれば顔認証とかで人が写っていたり、自分と誰か友達とか写っている写真を優先して表示とかできないだろうか。Google photo はやっている気がする。やけに自分が写った写真が選ばれている。
Raspbian Stretch Liteで無線LANを設定する

# 経緯

埃をかぶっていたラズパイ3を復活させようと、**Raspbian Stretch Lite March 2018** を新規インストールしたところ、内蔵無線LANがうまく繋がらず、ネットの情報通りにやってもうまくいかなかったり、情報が古かったりと苦労しました。解決策をメモします。

# 手順

```
# wpa_passphrase SSID名 パスフレーズ >>/etc/wpa_supplicant/wpa_supplicant.conf

# vi /etc/wpa_supplicant/wpa_supplicant.conf
network={
	ssid="SSID"
	#psk="パスフレーズ（平文）" ← 危ないのでこの行は消す
	psk=99196b83b3be536888eb20aab52e632c6f4e2e9c089eecc0a06651f5090af185
}
```
これで再起動すればDHCPでアドレスが取れるはずです。
IPを固定化したい場合はさらに以下の設定をします。

```
# vi /etc/dhcpcd.conf

# ↓ の行を追加
interface wlan0
SSID SSID名
inform IPアドレス/マスク
static routers=デフォルトゲートウェイ
static domain_name_servers=DNSサーバ
```

ネットの記事ではinterfaceとSSIDをどちらかしか設定しなくてもうまくいっている場合がありましたが、私の環境では両方設定しないと駄目でした。あと、dhcpcd.confにすでにeth0の設定があるとうまくいきませんでした。wlan0以外の設定は消しておくのが無難です（ということはeth0とwlan0両方で固定IPを使えなくなってしまいますが、力尽きたのでこれ以上は調査していません）。

以上です。
ヒトでもわかるWebブラウザ自作入門

# この記事は何?

こんにちは。現在私は趣味で[Webブラウザ](http://github.com/maekawatoshiki/naglfar)を実装しようとしています。
この記事にはその中で気づいたことをまとめていきたいと思います。

# ブラウザがやること

ブラウザは壮大で、複雑で、本当に様々なことをしています。(少なくとも、BlinkやServoのコードを見た私はそう思いました)
そのためこの章ではシンプルに、***ブラウザがどのように画面のレンダリングを行うのか***に重点を置いて説明していこうと思います。

## HTML/CSSの解析

Webページはほとんどの場合、当たり前ですがHTMLで書かれています。そんなHTML文書を、ブラウザは扱いやすくするためにツリー構造にします。これが俗に言う**DOM**(Document Object Model)です。

例えば、以下のようなコードがあったとしましょう。

```html
<html>
 <body>
  hello, <span style="color:red;">world!!</span>
 </body>
</html>
```

画面には``hello, (赤い文字で)world!!``と出力されますね。

以上のようなHTMLを、ブラウザは以下のような構造に変換します。

![DOM Tree](https://qiita-image-store.s3.amazonaws.com/0/69622/9a610e8a-f33a-e773-3a5e-ca6ee06947c1.png)

ツリー構造そのものですね。ひとつのタグの中に0個以上のタグやテキストが含まれていて、スタイルシートの情報が付随されていることもあります。
コードがツリー構造に変換される過程は、字句解析などのいわばコンパイラ寄りの話となってしまうので詳しくは解説しません。ですがひとつ言えることは、HTMLは文脈自由文法では簡単に定義することができず、他のプログラミング言語の字句解析よりも少しむずかしいかもしれない、ということです。

## レイアウト計算

### Replaced と Non-Replaced

HTMLやCSSの仕様について調べていると、たびたび``Replaced``や``Non-Replaced``という単語を目にします。これらは一体何なのでしょうか。

[CSS 2.1の仕様書](https://www.w3.org/TR/CSS21/conform.html) によると、``Replaced Element``は以下のように定義されています。

> An element whose content is outside the scope of the CSS formatting model, such as an image, embedded document, or applet. For example, the content of the HTML IMG element is often replaced by the image that its "src" attribute designates. Replaced elements often have intrinsic dimensions: an intrinsic width, an intrinsic height, and an intrinsic ratio. For example, a bitmap image has an intrinsic width and an intrinsic height specified in absolute units (from which the intrinsic ratio can obviously be determined). On the other hand, other documents may not have any intrinsic dimensions (for example, a blank HTML document). 

要するに、**画像などは``Replaced``な要素に該当する**よ！ということです。
これらの要素は非同期的に読み込まれることがあるので、特別に分けて考えられているようです。

もうお分かりかと思いますが、``Non-Replaced``は**``Replaced``以外**の要素のことです。ほとんどの要素はNon-Replacedですね。

### Block要素

``display: block``な要素は基本的に上から下へ配置されます。
以下の画像はBlock要素の代表的な例である``div``を使って簡単に説明してみたものです。

![Block](https://qiita-image-store.s3.amazonaws.com/0/69622/3fcf91e9-01d3-9ace-7e82-f49aa88cdb7e.png)

ある``div``の``y``座標は``自分の上のdiv要素のy座標と高さの足し算``で求められます。
``x``座標は``margin``を指定しない限りは``0``だと考えていいと思います。

### Inline要素

`display: inline`な要素は基本的に横方向に配置されます。

![Untitled Diagram(8).png](https://qiita-image-store.s3.amazonaws.com/0/69622/d30b321c-130e-3452-b7ff-e3ad764ffd84.png)

またテキストやInline要素の周りには``Anonymous Block``と呼ばれるBlock要素が生成されることがあります。これはテキストやInline要素をまとまりとして扱いやすくするためのものです。

### Float要素

- Sorry, coming soon.
Google Cloud Load BalancerのTIPS

## 概要
Google Cloud Load Balancer（以下GCLB）を2年ほど運用した気づきをTIPSとしてまとめます。


## BackendServiceへリトライ
以下の条件時に、BackendServiceへリトライ処理をします。

- `HTTP Method: GET`
- `BackendService`の`HTTP ResponseCode`が5xx、またはタイムアウト時

[ドキュメント（英語）](https://cloud.google.com/compute/docs/load-balancing/http/#timeouts_and_retries)によると、リトライ処理は2回までのようです。
> HTTP(S) load balancing retries failed GET requests in certain circumstances, such as when the response timeout is exhausted. It does not retry failed POST requests. Retries are limited to two attempts. Retried requests only generate one log entry for the final response. Refer to Logging for more information.


## KeepAlive Timeout
GCLBの`idle timeout`が600秒であるため、BackendService側のKeepAliveは600秒以上の値が必要です。
いつの間にかドキュメント（英語）に[推奨値](https://cloud.google.com/compute/docs/load-balancing/http/#timeouts_and_retries)が追加されていました。

| Web Server Software | Parameter         | Default Setting        | Recommended Setting     |
|---------------------|-------------------|------------------------|-------------------------|
| Apache              | KeepAliveTimeout  | KeepAliveTimeout 5     | KeepAliveTimeout 620    |
| nginx               | keepalive_timeout | keepalive_timeout 75s; | keepalive_timeout 620s; |

600秒未満の設定時に時発生する事象は、この[すばらしい記事](https://blog.percy.io/tuning-nginx-behind-google-cloud-platform-http-s-load-balancer-305982ddb340)にまとまっています。

## nginxでアクセス元IPアドレスを取得
GCLBは`130.211.0.0/22`と`35.191.0.0/16`のSourceIPAddressRangesを持っているため、FirewallとHealthCheckの設定にはこの値を使用します。
ただし`X-Forwarded-For`には転送ルールで設定したグローバルIPアドレスが入ってくるため、以下の設定をすることで`$remote_addr`にアクセス元IPアドレスが設定されます。

``` text
real_ip_header     X-Forwarded-For;
real_ip_recursive  on;

set_real_ip_from   10.0.0.0/8;         # Internal
set_real_ip_from   xxx.xxx.xxx.xxx/32; # HTTPS LB GlobalIP Address
```

## SSL証明書の更新手順
SSL証明書を更新する場合、`gcloud compute ssl-certificates`で登録したSSL証明書を直接更新はできません。
まずは新しいSSL証明書を新規登録し、HTTPSターゲットプロキシのSSL証明書リソースを新しい証明書に更新します。

## BackendServiceのタイムアウト
BackendServiceで設定できるタイムアウトは、`Transfer-Encoding: chunked`なリクエストでも切断します。
あたり前の挙動だと思いますが、応答のタイムアウトだと勘違いしたので一応記載します。

## 設定の反映時間
GCLBの設定変更は、即時反映されるわけではないので慌てず落ち着きましょう。
SSL証明書、HealthCheck、IAPなどを更新した場合、2分から5分ほどの時間がかかるのでまったり待ちます。

反映が完了するまでに10分以上を要したケースもありましたが、15分を経過した場合はソワソワしながらログや反映した手順を見直すことをオススメします。

## リクエストヘッダー: X-Cloud-Trace-Context
Stackdriver Traceを利用していなくても、リクエストHeaderに`X-Cloud-Trace-Context`が含まれます。
この値はリクエストごとに発行されるユニークなIDなので、アプリケーションログの含めると串刺し検索ができて便利です。
ただしClientで設定（改ざん）できるため、信頼できる値ではありません。
KPIなどに使用しないように注意してください。

## HTTP DELETE Method with Payload
GCLBはpayloadを含むDELETE Methodのリクエストを拒否します。
またレスポンスにpayloadが含まれてもリクエストが拒否されます。

## 最後に
この2年でGoogle Cloud Load Balancerには多くの便利な機能が追加されました。
CDN、Connection Draining、最近では[Cloud Identity-Aware Proxy](https://cloud.google.com/iap)、[Cloud Armor Security Policies](https://cloud.google.com/armor/docs/configure-security-policies)などの機能も追加され、より柔軟な設計ができるようになりました。
その進化スピードの反面、ドキュメントに記載されない暗黙知も存在するため新しい気付きがあればこの記事に追加していきたいと思います。
FirefoxでIndexedDBが利用できないときの対処法

IndexedDBを利用しているアドオンのユーザから報告が寄せられたので調査した。
関連バグ: https://bugzilla.mozilla.org/show_bug.cgi?id=944918
解決までのやり取り: https://github.com/sienori/Tab-Session-Manager/issues/210

# 現象
`window.indexedDB.open`すると以下のエラーを吐く。
アドオンやwebサイトに関わらず，IndexedDBを利用している全てのサービスで再現性がある。

```javascript
window.indexedDB.open('test', 1).onerror=(e=>{
    console.log(e.target.error.name);
    console.log(e.target.error.message);
});

//UnknownError
//The operation failed for reasons unrelated to the database itself and not covered by any other error code
```

# 解決方法
プロファイルのストレージが何らかの理由で破損していることが原因らしい。
以下の手順で初期化すれば解決する。

1. `about:profiles`より使用中のプロファイルのルートディレクトリを開く
![profiles2.png](https://qiita-image-store.s3.amazonaws.com/0/207934/7903579c-f04c-ee09-6fac-f68323866a66.png)  
2. Firefoxを終了し，`storage`フォルダを削除する  
![exprole.PNG](https://qiita-image-store.s3.amazonaws.com/0/207934/b064200d-e8c3-df84-c71d-93c3bce92be8.png)  
**注意: 一部のアドオンやサービスのデータが失われる可能性があります。
必ずファイルのバックアップを取り，リスクを理解した上で行ってください。**
3. Firefoxを起動するとIndexedDBを利用できるようになる
Railsのstrftimeのよく使うテンプレート

[株式会社TECH LUCK](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)という会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。
- プロジェクトでRailsエンジニアが足りなくて困っている
- Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
- オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい

また、Railsエンジニアも募集しておりますので、興味がありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご連絡いただけますと幸いです。

# 前提

Railsにはstrftimeという日時を変換して表示することができるメソッドがあります。
よく使うけれども都度調べているので、これを機にチートシートを作りました。
参考にしてみてください。


### 2018年03月01日

```ruby
time = Time.now
time.strftime("%Y年%m月%d日")

=> "2018年03月01日"
```

### 2018/03/01

```ruby
time = Time.now
time.strftime("%Y/%m/%d")

=> "2018/03/01"
```

### 18/03/01

```ruby
time = Time.now
time.strftime("%y/%m/%d")

=> "18/03/01"
```

### 午前23:24 or 午後23:24


### AM 09:24 or PM 23:24
*取得した時間が午前か午後かで変わります

```ruby
time = Time.now
time.strftime("%p %R")

=> "AM 09:24" or "PM 23:24"
```


### am 09:24 or pm 23:24
*取得した時間が午前か午後かで変わります

```ruby
time = Time.now
time.strftime("%P %R")

=> "am 09:24" or "pm 23:24"
```


### 23時59分

```ruby
time = Time.now
time.strftime("%H時%S分")

=> "23時57分"
```


### 午前11時59分 or 午後11時59分

```ruby
time = Time.now

time.strftime("%H時%S分")

=> "23時57分"
```


### March 01, 2018

```ruby
time = Time.now
time.strftime("%B %d, %Y")

=> "March 01, 2018"
```


### Mar 01, 2018

```ruby
time = Time.now
time.strftime("%b %d, %Y")

=> "Mar 01, 2018"
```

# 参考にしたサイト

https://techracho.bpsinc.jp/hachi8833/2016_10_06/25960
SubversionからGitへ移行（クライアント側）のイメージ図を書いてみた

いまさらだけどSVNを今まで操作して、ある日Gitを使えと言われた時の頭の中でのSVNからGit使いになるための変換イメージを記載。ホワイトボードのメモ書き。
## 今までの単純なSVNの操作イメージ
#### クライアントツール:[Tortoise SVN](https://ja.osdn.net/projects/tortoisesvn/) (GUI)で操作したイメージ
![svn.jpg](https://qiita-image-store.s3.amazonaws.com/0/230829/c9443bc2-bad9-ff1a-bc95-5c462cae5d2e.jpeg)
#### 1. SVNのリポジトリを自分のローカルにチェックアウトする
#### 2. 自分のローカルで作業
#### 3. 自分のローカルをSVNにコミットする
#### 4. リポジトリから最新情報を更新
## SVNからのGitの操作イメージ
#### クライアントツール: [Git for Windows](https://gitforwindows.org/) (CUI)で操作したイメージ
![iOS からアップロードされた画像 (2).jpg](https://qiita-image-store.s3.amazonaws.com/0/230829/889fe402-4606-544a-17dc-dfaf71478608.jpeg)
#### 1. Gitのリポジトリを自分のローカルに~~チェックアウト~~クーロンする
```sh:コマンド
git clone https://xxxxxxxxxxxxxx.yyy.zzz
```
#### 2. 自分のローカルで作業
#### 3. ローカルリポジトリに変更内容を追加
```sh:コマンド
git add .
```
#### 4. ローカルリポジトリにコミット
```sh:コマンド
git commit -m "commit message"
```
#### 5. ローカルリポジトリからリモートリポジトリに~~コミット~~プッシュ
```sh:コマンド
git push -u origin master
```
#### 6. リポジトリから最新情報を~~更新~~プル
```sh:コマンド
git pull
```
---
**※これだけだとSVNよりGitはローカルリポジトリが増えたイメージで、ただ単純に手数が増えた印象しか受けない。Gitだからこそというイメージを以下に記載する。**
## もっと高度なGitの使い方 branchとpull request
![Git2.jpg](https://qiita-image-store.s3.amazonaws.com/0/230829/9c893428-e4bf-2982-effe-032ae81e1410.jpeg)
#### 使用するGitリポジトリ：GitHubやBacklog等のWebサービス
#### 1. Gitのリポジトリ(master)から自分のローカルにクーロンする
```sh:コマンド
git clone -b master https://xxxxxxxxxxxxxx.yyy.zzz
```
#### 2. ブランチ（feature）作成
```sh:コマンド
git branch feature
```
#### 3. ブランチ（feature）移動
```sh:コマンド
git checkout feature
```
#### 4. 自分のローカルで作業
#### 5. ローカルリポジトリに追加＆コミット
```sh:コマンド
git commit -m "commit branch"
```
#### 6. ローカルリポジトリからリモートリポジトリにプッシュ
```sh:コマンド
git push -u origin feature
```
#### 7. Webサービスからプルリクエスト（※）を選択してブランチをmasterにマージする
Githubのプルリクエスト
![github.jpg](https://qiita-image-store.s3.amazonaws.com/0/230829/a8434a41-2e0d-ebe9-4e4f-f9f1611b3fdc.jpeg)
※プルリクエストはGit本来の機能ではなくGithubやBacklogなどのWebサービスが持っている機能
**ブランチの更新内容に本当に問題ないかソースレビューを有識者に出すイメージ。また問題なければ、ブランチからmasterへソースのマージが簡単にできる。**
Raspberry Pi にWebサーバ入れてphp動かす

# はじめに
Raspberry Pi にWebサーバ入れてphp動かす手順について簡単にまとめます。
なお、Raspberry PiでWebサーバを動かす場合は、Apacheより軽量なnginxがお勧めなのでnginxで動かします。

所要時間：10分
環境：Raspbian GNU/Linux 9.3 (stretch)

## nginxのインストール

- nginxのインストール   
`$ sudo apt-get install nginx`
- nginxの起動   
`$ sudo /etc/init.d/nginx start`

**nignx起動後、ブラウザにRaspberry PiのIPアドレスを入れてアクセスすればテストページが表示されます**
![スクリーンショット 2018-03-23 21.33.03.png](https://qiita-image-store.s3.amazonaws.com/0/221759/5f8361a0-24b9-467f-abc4-cfb163a4cfed.png)

## phpのインストール

- phpのインストール　※Raspbianの最新は7.0 
`$ sudo apt-get install php7.0-fpm`

- nginxでphpを使うための設定
`$ sudo vi /etc/nginx/sites-available/default`

```bash
# 44行目に「index.php」を追加
43          # Add index.php to the list if you are using PHP
44          index index.html index.htm index.nginx-debian.html index.php;
〜省略
# 56、57、60、63行目のコメントアウトを外す
56          location ~ \.php$ {
57                  include snippets/fastcgi-php.conf;
58          
59          #       # With php-fpm (or other unix sockets):
60                  fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
61          #       # With php-cgi (or other tcp sockets):
62          #       fastcgi_pass 127.0.0.1:9000;
63          }
```

- php.iniの設定     
`$ sudo vi /etc/php/7.0/fpm/php.ini`

```bash
# 760行目の「;cgi.fix_pathinfo=1」をデフォルトから変更
760  cgi.fix_pathinfo=0
```

## 動作確認
- phpの再起動    
`$ sudo /etc/init.d/php7.0-fpm restart`
- nignxの再起動    
`$ sudo /etc/init.d/nginx restart`



**ドキュメントルートにtest用phpファイルを作成してアクセスする**
`$ sudo vi /var/www/html/test.php`

test.phpの中身

```bash
<?php
phpinfo();
?>
```

**phpのステータス画面が表示されればOKです**
![スクリーンショット 2018-03-23 21.48.39.png](https://qiita-image-store.s3.amazonaws.com/0/221759/d9b4052e-97bb-22bd-053b-a730ccdb2b24.png)
TITAN V で BitZeny(Yescryptr8) をマイニングする(34.0 kH/s @ 150W)

漢なら TITAN V でリアルタイムレイトレーシングしつつ, 使っていない時間は BitZeny マイニングしたいですね!

やりましょう!

できました.

<img width="670" alt="Screen Shot 2018-03-23 at 21.16.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/36275/c1c944ef-51b5-2fca-be3e-d764f7a0f584.png">



## セットアップ

最近(2018 年 3 月), BitZeny(のアルゴリズム)にも対応した,

【マイナー必見】ソロマイニングに対応したよ【高速化Part4】
http://askmona.org/9245

KlausT-8.21-mod-r3 を使いました.

Ubuntu 16.04 + CUDA 9.1.85 + NVIDIA driver 390.30 でコンパイルと動作を確認しました.

## 性能

150W に powertune で 34.0 kH/s くらいでました.
参考までに 1080 Ti で 150W powetune だと 13.60 kH/s くらいでした.

1080 Ti の 2.5 倍くらい性能がよいですね!

ちなみに Threadripper 1950X では 14.7 kH/s です.

https://qiita.com/syoyo/items/b9256c786a1e9509ebb1 

## TODO

* Yenten も試す.
* KlausT-8.21-mod-r3, github に公開してほしい...
destroyメソッドのポイント

```
def destroy
    tweet = Tweet.find(params[:id])
    if tweet.user_id == current_user.id
      tweet.destroy
```
よく間違えるポイントはfindの後の表記間違い
ログインユーザーのid取得間違い

```
<%= link_to '編集', "/tweets/#{tweet.id}/edit", :method => :delete %>
```
よく間違えるポイントはメソッドの間違い
必ずdeleteを使う
(随時更新) 統計1級を目指すための用語集 by Team AI

#はじめに

Team AIでは年に1回ずつ行われている統計検定1級(大学専門)/準1級(大学教養)についての勉強会をはじめました。
オフィシャルガイドブックを元に、単語の意味を調べながらグループワークで学習を進めています。

#用語

##初級

###加重平均

「加重平均」とは重みつき平均ともいうそうです。
こちらに加重平均の詳しい内容が掲載されております。

[なるほど統計学園高等部　平均値]
http://www.stat.go.jp/koukou/howto/math/
https://oshiete.goo.ne.jp/qa/476273.html

###幾何平均

幾何平均（きかへいきん、英: geometric mean）または相乗平均は数学における平均の一種で、数値群の代表値である。多くの人が平均と聞いて思い浮かべる算術平均と似ているが、それぞれの数値を足すのではなく掛け、その積の冪根（数値がn個ならn乗根）をとることで得られる。

https://ja.wikipedia.org/wiki/%E5%B9%BE%E4%BD%95%E5%B9%B3%E5%9D%87

###調和平均

数学において、調和平均（ちょうわへいきん、英: harmonic mean, subcontrary mean）はいくつかの種類がある平均のうちの1つである。典型的には、率の平均が望まれているような状況で調和平均が適切である。

正の実数について、調和平均は逆数の算術平均の逆数として定義される。簡単な例として、3つの数 1, 2, 4 の調和平均は次のように計算できる：

<img width="319" alt="スクリーンショット 2018-03-23 21.25.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/76304/92a557ce-da14-beb5-6e8f-b17330e73169.png">

https://ja.wikipedia.org/wiki/%E8%AA%BF%E5%92%8C%E5%B9%B3%E5%9D%87


##中級

###対数計算
https://sci-pursuit.com/math/logarithm-formulae-and-calculation.html

###クロスバリデーション
交差検証（交差確認）[1]（こうさけんしょう、英: Cross-validation）とは、統計学において標本データを分割し、その一部をまず解析して、残る部分でその解析のテストを行い、解析自身の妥当性の検証・確認に当てる手法を指す[2] [3] [4]。データの解析（および導出された推定・統計的予測）がどれだけ本当に母集団に対処できるかを良い近似で検証・確認するための手法である。

最初に解析するデータを「訓練事例集合（training set）」などと呼び、他のデータを「テスト事例集合（testing set、テストデータ）」などと呼ぶ。

交差検証は Seymour Geisser が生み出した。特にそれ以上標本を集めるのが困難（危険だったり、コストがかかったり）な場合は、データから導いた推定は、交差検証などで慎重に裏付けを確認するべきである。
https://ja.wikipedia.org/wiki/%E4%BA%A4%E5%B7%AE%E6%A4%9C%E8%A8%BC

##上級

###ラッソ関数 L1正則化

###リッジ関数 L2正則化

###正則化

https://ja.wikipedia.org/wiki/%E6%AD%A3%E5%89%87%E5%8C%96
![20150228165325.png](https://qiita-image-store.s3.amazonaws.com/0/76304/283fcd06-d7a2-d36c-8f19-32f389b92fb4.png)


https://tjo.hatenablog.com/entry/2015/03/03/190000
jsdoで、なでしこ　その4

#概要

jsdoで、なでしこ、やってみた。
plugin作ってみた。

#サンプルコード


```
ドレミ作成
ドレミ曲 = 「ドドソソララソソファファミミレレドドソソファファミミレレソソファファミミレレドドソソララソソファファミミレレド」
ドレミ斉唱
```


#成果物

http://jsdo.it/ohisama1/Cb5q


以上。
draw.ioのテーブルを直接修正する

## はじめに
- draw.ioのデフォルトであるテーブルに行を追加すると背景色等の設定がなかった
- 修正方法を毎回頑張って調べるのが面倒なのでメモとして書きます

## 詳細
### 現象
- テーブルに行を追加すると以下のようになる

![before.png](https://qiita-image-store.s3.amazonaws.com/0/109886/5ab018ca-30f4-dade-ecfa-b8b51aae57c2.png)

- 2回目に挿入した一番下の行は偶数行と同じになってほしいのにそのままでは背景色が白のまま

### 修正する
- テーブルを選択した状態にすると赤枠の部分がクリックできるようになるので、選択して直接HTMLを修正します

![after.png](https://qiita-image-store.s3.amazonaws.com/0/109886/068f368e-c24f-31d9-1f82-eb1e59016983.png)

- とっても見ずらいので、別エディタにコピペして修正します

- 範囲外をクリックすると編集終了！

### 注意点
- 改行等を変更すると表示されなくなることがあるので修正後には元のフォーマットに戻した方が無難です
rails エラー　詳細ページや個人詳細ページにアクセスできない

エラーの原因はおそらくアソシエーションの定義ができていないから

記入するファイルはモデルファイル

1つが沢山の情報を保有していたら
has_many: モデルファイルの複数形

１つの１つと対になっているものは
belongs_to :ファイル名

とすることでアソシエーションが定義される
cargo-strictでunwrap()だらけのコードにサヨナラ

書き捨てのRustコードが`unwrap()`だらけで、エラーが発生した時に辛い思いをしたことはありませんか？
私はあります。

そんなあなたに、`cargo-strict`を書いてみました。

https://github.com/hhatto/cargo-strict

## 使い方

### インストール

```shell-session
$ cargo install --git https://github.com/hhatto/cargo-strict.git
```

### 実行
チェック対象は以下のようなファイルです。

```rust:simple.rs
fn main() {
    let s = "Hello world";  /* .unwrap() */
    let _ = s.find("wo").unwrap();
    // let _ = s.find("wo").unwrap();
    let ignore = "s.unwrap();";
}
```

実行してみます。

```shell-session
$ cargo strict
./simple.rs:2:24:     let _ = s.find("wo").unwrap();
```
`unwrap()`を使っているところを指摘してくれます。

### コード修正まで行う
指摘するだけとかまどろっこしいことはいいので、`expect()`に変換してくれって方は`--fix`オプションをつけて、実行すればコード修正までおこなってくれます。

```shell
$ cargo strict --fix
```

変更前後のファイル差分は以下のようなかたちになります。
行ごとにmd5ハッシュで別々のエラーIDを付与してくれます。

```diff
$ git diff
diff --git a/simple.rs b/simple.rs
index e066898..dbe188b 100644
--- a/simple.rs
+++ b/simple.rs
@@ -1,6 +1,6 @@
 fn main() {
     let s = "Hello world";  /* .unwrap() */
-    let _ = s.find("wo").unwrap();
+    let _ = s.find("wo").expect("error-id:5cb0410ba34b040dbbde09dc1991685d");
     // let _ = s.find("wo").unwrap();
     let ignore = "s.unwrap();";
 }
```

これでどこでエラーが発生したかがすぐにわかるようになりました。
Yahoo! JavaScriptマップAPI に ジオハッシュ の格子を表示する

![スクリーンショット.png](https://qiita-image-store.s3.amazonaws.com/0/1830/e15f275f-ef92-3c0d-fdbf-4db81c2b2d77.png)

## 概要
ヤフーのYOLPで提供されている、地図上にジオハッシュの矩形を表示する画面をつくりました。

 * https://ctyo.github.io/MapOnRect/geohash?geohash_length=5&z=14
   * geohash_lenghはジオハッシュ桁数(桁数が大きいほど詳細)
   * zは地図のズームレベルを指定
 * ソースコード全体 : https://github.com/ctyo/MapOnRect


※ Chromeでのみ動作確認

## ジオハッシュについて
[ジオハッシュ - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B8%E3%82%AA%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5) をご参照ください。
ジオハッシュ計算のプログラムは書かず、[chrisveness/latlon-geohash](https://github.com/chrisveness/latlon-geohash) こちらのライブラリを利用しました。

## 実装

### 独自のレイヤーを追加

ジオハッシュを描画しているレイヤーは Y.Layerクラスを継承して作成できます。

```
class CanvasLayer extends Y.Layer {
```

こちらを地図オブジェクトに追加すればhtml上に追加された状態になります。

```
var canvasLayer = new CanvasLayer(..省略..);
ymap.addLayer(canvasLayer);
```

### ジオハッシュの矩形を描画
レイヤー上ではCanvasオブジェクトを画面全体に配置し、緯度経度に対応したジオハッシュの矩形を描画するようにしました。

```
        var strokeGeohash = function (geohash) {
            var bounds = Geohash.bounds(geohash); // ジオハッシュ文字列から矩形緯度経度を取得
            var ne = that.fromLatLngToContainerPixel(new Y.LatLng(bounds.ne.lat, bounds.ne.lon)); // 北東の緯度経度をDOM上のpx値に変換
            var sw = that.fromLatLngToContainerPixel(new Y.LatLng(bounds.sw.lat, bounds.sw.lon)); // 南西の緯度経度をDOM上のpx値に変換
            // canvas に描画する
            var ctx = self.canvas_.getContext('2d');
            ctx.strokeStyle = "red";
            ctx.strokeRect(sw.x, ne.y, ne.x - sw.x, sw.y - ne.y); // canvasのstrokeRectは top, left, width, heightの並び
            ctx.strokeText(geohash, sw.x + 5, ne.y + 15); // 文字は矩形の中に収まるように微調整
        }
```

### 画面全体への描画
画面全体に描画には再帰処理で対応しました。
描画の終了の判定は、画面外にジオハッシュの矩形の端がすべて出たらというものにしました。
ヤフー地図のJSAPIには便利なことに指定の矩形内に緯度経度が収まっているかを判定する関数が用意されていましたので以下のように書けました。

```
            // 描画エリア内か確認
            var bounds = Geohash.bounds(geohash);
            var ymap = that.getMap(); // 地図全体を取得
            var map_bounds = ymap.getBounds(); // 表示している地図の矩形を取得
            if (!(
                map_bounds.containsLatLng(new Y.LatLng(bounds.ne.lat, bounds.ne.lon)) || // 北東
                map_bounds.containsLatLng(new Y.LatLng(bounds.sw.lat, bounds.ne.lon)) || // 北西
                map_bounds.containsLatLng(new Y.LatLng(bounds.sw.lat, bounds.sw.lon)) || // 南西
                map_bounds.containsLatLng(new Y.LatLng(bounds.ne.lat, bounds.sw.lon))    // 南東
            )) {
                return; // すべての判定が地図全体より外だったらreturnする。
            }
```

### 参考
* [ジオハッシュ - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B8%E3%82%AA%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5)
* [chrisveness/latlon-geohash: Gustavo Niemeyer’s geocoding system](https://github.com/chrisveness/latlon-geohash)
* [YOLP(地図):Layerクラス - Yahoo!デベロッパーネットワーク](https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/js/reference/YLayer.html#Layer)
* [Yahoo Map API でオリジナルLayerを作るには - ..たれろぐ..](http://d.hatena.ne.jp/naga_sawa/20110824/1314173830)
rails エラー　マイページにアクセスできない

```
エラー発生
def show
@comments = @tweet.comments.includes(:user) ***idが指定されていない***
end

改善
  def show
  @tweet = Tweet.find(params[:id])　
  @comments = @tweet.comments.includes(:user)　
end
```
　
idが指定されていないため、どのマイページを開くべきかが該当できない
テキストと画像が両方ないと保存されないようにしたい エラーの際に

validates_presence_ofは、モデルのファイル（拡張子rb）に記述して、
空っぽのまま保存したくない場合に

カラムを指定することで、そのプロパティを必須入力にします。

```
user.rb
validates_presence_of :name :image
```

これによりuserモデルで出てくるプロパティ
name_idとimage_idは空白で保存が出来ない

必ず、name imageを入力しないと受け付けなくなる
pandasで特定の列を抽出する

複数カラムあるcsvをデータフレームにインポートして、特定の列だけ抽出したいという
シチュエーションは皆さんよくあることだと思いますが、
私は書く度にググってるのので自分用のメモを書いときます。

csv ファイルに id, name ,desc という3つの項目が存在し、name と desc を抽出したいときは以下の様に書きます。

```python

import pandas as pd

df = pd.read_csv("./test.csv")
df = df[["name","desc"]]
```

リストをネストするのがポイントです。
rails エラー　トップページにデータベースの情報が表示されない

renderが機能していない

each文が機能していない　　のどちらか

見るべき部分はビュー画面の部分

```
<%= render コントローラーで定義したインスタンス変数　%>　の明記がない
```

もしくは部分テンプレートのファイル名の最初が[_]アンダースコアになっていないか
部分テンプレートの名前はインスタンス変数の名前を引用。
コマンドライン上でのbashを1行で (for文/if文)

#はじめに
linuxを使うならやはりbashが魅力的
ちょっとした作業に1行bash
コマンドライン上でbashコマンドを一行で実行する方法を紹介します。
最後に1行bashの魅力を伝えるため空のファイルのみを移動する方法を紹介します。

動作環境: linux全般

#for(繰り返し処理)
基本定な形

```
for 変数 in 値のリスト;do 処理　;done
```

###◯数値を使ったfor
for文を使って1~5までの数字を画面に表示する1行bash

```:command
$ for i in {1..5};do echo $i;done
```

```:実行結果
1
2
3
4
5
```

###◯ファイル名を読み込む
*バッククォート``でlsコマンドを囲む(アポストロフィ''では無いので注意)*

カレントディレクトリのファイル名を読み込みfor文を使って1行ずつ画面に表示する1行bash

>.directory/
>　├ file1 
>　├ file2　
>　├ file3
>　├ ...

```:command
$ for file in `ls`;do echo $file;done
```

```:実行結果
file1
file2
file3
...
```

#if(条件分岐)
基本的な形

```
if [ 条件式 ];then 処理;else 処理;fi
```

*条件式の前と後に半角スペース必要*
##文字列比較
|条件|条件式|
|---|---|
|文字列が等しい|=|
|文字列が異なる|!=|
|文字列の長さが0|-z|
|文字列の長さが1以上|-n|

###◯文字列が等しい場合

文字列が比較する場合「Match」一致しない場合「Missmatch」と表示する1行bash

```:command
$ if [ "a" = "a" ];then echo "Match";else echo "Missmatch";fi
```

```:実行結果
Match  
```

###◯文字の長さが０の場合

文字列の長さが0の場合「Match」0以外の場合「Missmatch」と表示する1行bash

```:command
$ if [ -z "" ];then echo "Match";else echo "Missmatch";fi
```

```:実行結果
Match
```

##数値比較
|条件|条件式|
|---|---|
|=|-eq|
|≠|-ne|
|<|-lt|
|>|-gt|
|≦|-le|
|≧|-ge|

###◯数値が等しい
数値が等しい場合「Match」等しくない場合「Missmatch」と表示する1行bash

```:command
$ if [ 1 -eq 1 ];then echo "equal";else echo "not equal";fi
```

```:実行結果
equal
```

#forとifの組み合わせ
##◯空のファイルのみ移動

カレントディレクトリ内の空ファイルのみを別ディレクトリに移動させる1行bash

ディレクトリ構成(コマンド実行前)

>.directory/
>　├ file1 (空ファイル)
>　├ file2　
>　├ file3 (空ファイル)
>trash/

```:command
$ for file in `ls`;do if [ -z -f `cat $file` ];then mv $file ../trash/;fi;done
```

ディレクトリ構成(コマンド実行後)
>.directory/
>　├ file2　
>trash/
>　├ file1 (空ファイル)
>　├ file3 (空ファイル)

今回は空ファイルのみを移動する方法を紹介しました。
他にも組み合わせ次第でわざわざプログラムを組まなくても手軽に解決できます。
やはりbashは魅力的ですね。
CentOS 7 Firewallの設定

# 動作確認環境
- 仮想環境 VMware Workstation Player 14.1.1
- OS Windows 10 Pro 64bit

# 仮想環境
- OS CentOS 7.4 (1708) minimalインストール
- メモリ 2GB
- HDD 250GB

# 設定
今後、サーバで使用するポートはWebサーバ関連のhttpの80番とhttpsの443番である。
以下のコマンドで2つのポートを開ける。

````
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --zone=public --add-service=https --permanent
````
設定を反映させる。

````
firewall-cmd --reload
````

---
[目次](https://qiita.com/knutpb1205/items/3ece0cab588afdb13f02)
SKStoreReviewController.requestReview()を通っているのにレビュー依頼画面が表示されない時のチェック事項

# 最初に結論
SKStoreReviewController.requestReview()を発火させてもポップアップが表示されない場合に考えられる原因は

**1. 端末の時間を変更している**
**2. ネットワーク通信ができていない**
**3. TestFlight経由である**

レビューを配布テストしたい場合はプロモーションコード経由のテストを行いましょう

# 概要
iOS 10.3以降で使える
Appleが公式で用意しているレビュー訴求用のAPI
SKStoreReviewController

表示するのは非常にカンタンで以下のように一行書くだけです。

```ViewController.swift
import UIKit
// ↓これをimport
import StoreKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // これで発火
        SKStoreReviewController.requestReview()
    }
}


```
このように表示されます。
<img width="375" alt="IMG_7434.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/25725/ea86e3f5-029d-df50-ad75-b523e424b400.png">


この画面はappleにapiで問い合せて表示しています。
その為、メソッドを発火させてもポップアップを表示させるには
api通信で成功し、表示させるべく結果が返ってくる必要があります。

この時、圏外であれば当然結果が返ってこないため表示がされず、
また端末の時間が現在時刻から変更されていると表示されません。
（試すとだいたい前後5日以上ずれていると表示されない）

TestFlight経由でも、このポップアップは表示されません。
https://developer.apple.com/documentation/storekit/skstorereviewcontroller/2851536-requestreview
> When you call this method while your app is still in development mode, a rating/review request view is always displayed so that you can test the user interface and experience. However, this method has no effect when you call it in an app that you distribute using TestFlight.

社内などのテスト配布で
このポップアップを確認したい場合は
プロモーションコードを利用して行えば可能であるようです。


# 結論（再掲）

SKStoreReviewController.requestReview()を発火させてもポップアップが表示されない場合に考えられる原因は

1. 端末の時間を変更している
2. ネットワーク通信ができていない
3. TestFlight経由である

- レビューを配布テストしたい場合はプロモーションコード経由のテストを行いましょう


「メソッド通っているのに画面が表示されない」と
デバッグに苦しむ前に、思い出して頂ければと思います。
LaravelMIX セットアップ



$ npm run dev

```
events.js:183
      throw er; // Unhandled 'error' event
      ^

Error: spawn node_modules/webpack/bin/webpack.js ENOENT
    at _errnoException (util.js:1022:11)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:190:19)
    at onErrorNT (internal/child_process.js:372:16)
    at _combinedTickCallback (internal/process/next_tick.js:138:11)
    at process._tickCallback (internal/process/next_tick.js:180:9)
    at Function.Module.runMain (module.js:695:11)
    at startup (bootstrap_node.js:188:16)
    at bootstrap_node.js:609:3
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! -y@1.0.0 development: `cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progr
ules --config=node_modules/laravel-mix/setup/webpack.config.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the -y@1.0.0 development script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/vagrant/.npm/_logs/2018-03-23T10_24_44_446Z-debug.log
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! -y@1.0.0 dev: `npm run development`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the -y@1.0.0 dev script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/vagrant/.npm/_logs/2018-03-23T10_24_44_474Z-debug.log
```


### 原因
npmバージョンと、nodeバージョンが合っていなかった
※node6.0.0に対しnpm5.7

参考：nodeとnpmのバージョン一覧
https://nodejs.org/ja/download/releases/

### やったこと
npmバージョンと、nodeバージョンを揃える
⇒node.js　のバージョン管理とバージョン指定インストールについては
　こちらを参照しました
　https://hombre-nuevo.com/javascript/node0005/

```
nvm use v6.0.0
node -v

npm install -g npm@5.7.1
```

インストールやり直し
```
npm install --no-bin-links
```

コンパイル
```
yarn run dev
```
RubyのInstance Method定義、あるいはSend Methodの忘備録

```ruby
class Example

  private
  
  def method_no_attr
    return 'call Example.method_no_attr'
  end

  def method_attr(attr)
    return "call Example.method_attr with attr = #{attr}"
  end

  def method_attrs(attr1, attr2)
    return "call Example.method_attrs with attr1 = #{attr1},  attr2 = #{attr2}"
  end

  def method_attrs_with_symbole(attr1:, attr2:)
    return "call Example.method_attrs_with_symbole with attr1 = #{attr1},  attr2 = #{attr2}"
  end

  def method_attrs_with_array_and_hash_option(attr1, *attr2, **attr3)
    return "call Example.method_attrs_with_array_and_hash_option with attr1 = #{attr1},  attr2 = #{attr2}, attr3 = #{attr3}"
  end
end

example = Example.new

example.send('method_no_attr')
# => "call Example.method_no_attr"

example.send('method_attr', 'Attr')
# => "call Example.method_attr with attr = Attr"

example.send('method_attrs', 'Attr1', 'Attr2')
# => "call Example.method_attrs with attr1 = Attr1,  attr2 = Attr2"

test_attr = ['TestAttr1', 'TestAttr2']
example.send('method_attrs', *test_attr)
# => "call Example.method_attrs with attr1 = TestAttr1,  attr2 = TestAttr2"

example.send('method_attrs_with_symbole', attr1: 'Attr1', attr2: 'Attr2')
# => "call Example.method_attrs_with_symbole with attr1 = Attr1,  attr2 = Attr2"

test_hash_attr = { attr1: 'TestHashAttr1', attr2: 'TestHashAttr2' }
example.send('method_attrs_with_symbole', test_hash_attr)
# => "call Example.method_attrs_with_symbole with attr1 = TestHashAttr1,  attr2 = TestHashAttr2"

example.send('method_attrs_with_array_and_hash_option', 'Attr1', 'Attr2', { attr3_1: 'Attr3_1' } )
# => "call Example.method_attrs_with_array_and_hash_option with attr1 = Attr1,  attr2 = [\"Attr2\"], attr3 = {:attr3_1=>\"Attr3_1\"}"

example.send('method_attrs_with_array_and_hash_option', 'Attr1', 'Attr2_1', 'Attr2_1', { attr3_1: 'Attr3_1' } )
# => "call Example.method_attrs_with_array_and_hash_option with attr1 = Attr1,  attr2 = [\"Attr2_1\", \"Attr2_1\"], attr3 = {:attr3_1=>\"Attr3_1\"}"


# OnlyRails(w/ ActiveSupport)

example_from_string_obj = 'Example'.constantize.new

example_from_string_obj.send('method_no_attr')
# => "call Example.method_no_attr"
```
Rails ConsoleからFaradayでjsonリクエストを送る

サクッと確認できたので備忘録

インスタンスを作成

```rb
client = Faraday.new(url: "PATH")
```

headerを設定

```rb
client.headers = { Accept: "application/json" }
```

メソッドとパス指定してリクエストを送る

```rb
client.get('PATH')
```

この程度なら`curl`でも良かった.
sinatra-paramの紹介

##はじめに
外国人の@rueyjyeです。
研修の時にSinatraを使って、REST APIを作りました。
自作のバリデーションを作る時に、大量なif文とか書きました。
コードはきれいじゃないと思った時に、使いやすいgemを見つかりました。
紹介させたいと思います。

## sinatra-param
https://github.com/mattt/sinatra-param
sinatra用のgemです。

パラメータを簡単に定義できるライベラリです。
バリデーションもきれいにできると思います。



## 使い方

とりあえず、インストール

```
gem install sinatra-param
```
sinatraのサンプルコード

```sample.rb
require 'sinatra/base'
require 'sinatra/param'
require 'json'

class App < Sinatra::Base
  helpers Sinatra::Param

  before do
    content_type :json
  end


  get '/search' do
    # ここからパラメータを定義します
    # 型、必須、デフォルト、正規化とか設定できます
    param :q,           String, required: true
    param :categories,  Array
    param :sort,        String, default: "title"
    param :order,       String, in: ["ASC", "DESC"], transform: :upcase, default: "ASC"
    param :price,       String, format: /[<\=>]\s*\$\d+/

    one_of :q, :categories

    {...}.to_json
  end
end
```
これでGETメソッド中のパラメータ定義ができます。


## バリデーション
バリデーション失敗したら、デフォルトでstatus 400エラーが返します。

※ Githubドキュメントは各バリデーションの使い方を書いてないけど、ちょっと使った結果は以下です。

・required

```rb

param :test, String, required: true
```

・blank

```rb
param :test, String, blank: true
```

・is

```rb

param :test, Integer, is: 10
```

・in, within, range

```rb

param :test, String, in: 'sample'
param :test, Integer, range: 1..5
```

・min / max

```rb

param :test, String, min: 10
```

・min_length / max_length

```rb

param :test, String, min_length: 10
```

・format

```rb

param :test, String, format: /[<\=>]\s*\$\d+/
```

## カスタマイズエラーメッセージ
定義のところもエラーメッセージをカスタマイズできます。

```rb

param :test,
      format: /regex/,
      message: "カスタマイズエラーメッセージ"
```


## Defaults and Transformations
デフォルト値を設定し、計算した結果に変換もできます

```rb

param :attribution, String, default: "example"
param :offset, Integer, min: 0, transform: lambda {|n| n - (n % 10)}
```

## One of and Any of
パラメータの数と必須の制限したい時には使いやすい。
##### One of
３つの中で必ず１つが入力する。３つの中で１つしか存在しない。

```rb

param :a, String
param :b, String
param :c, String

one_of :a, :b, :c
```

結果

```
a => ok
b => ok
c => ok
a,b => ng
a,c => ng
b,c => ng
a,b,c => ng
```
##### Any of
３つの中で必ず最小１つが入力する。

```rb

param :a, String
param :b, String
param :c, String

any_of :a, :b, :c
```

結果

```
a => ok
b => ok
c => ok
a,b => ok
a,c => ok
b,c => ok
a,b,c => ok
```

## 最後に
コードはきれいに書けるし、定義もできるところはいいと思います。
みなさんは是非使ってみてください。


## 参考
[sinatra-param](https://github.com/mattt/sinatra-param)
RHELで出力される"kernel: blk_update_request: I/O error, dev fd0, sector 0"を抑止したい

こんな感じのメッセージ出力がよくされる。抑止したい。

```
Mar 22 02:48:13 standard-R73 kernel: blk_update_request: I/O error, dev fd0, sector 0
```

フロッピーディスクがあるからかな。RHEL on Azureでは既定であるみたい。いつの時代だ...。

```shell-session
[root@standard-R73 nmikuni]# lsmod | grep floppy
floppy                 69417  0
```

lsmodで見えなくなるように設定しよう。

#手順

ブラックリストに登録する

```shell-session
[root@standard-R73 nmikuni]# echo "blacklist floppy" >> /lib/modprobe.d/dist-blacklist.conf
[root@standard-R73 nmikuni]# tail /lib/modprobe.d/dist-blacklist.conf
 # sound drivers
blacklist snd-pcsp
 ``
 # I/O dynamic configuration support for s390x (bz #563228)
blacklist chsc_sch
 ``
 # crypto algorithms
blacklist sha1-mb
blacklist floppy
```

カーネルからfloppyを削除する

```shell-session
[root@standard-R73 nmikuni]# rmmod floppy'
```

initramfs の再構築をする

```shell-session
[root@standard-R73 nmikuni]# cd /boot/
[root@standard-R73 boot]# dracut -f -v
```

OS再起動をする

```shell-session
[root@standard-R73 boot]# reboot
```

見えなくなった

```shell-session
[root@standard-R73 nmikuni]# lsmod | grep floppy
[root@standard-R73 nmikuni]#
```
URLパラメーターをJavascriptで取得してリンクの後ろに付けるメモ

URLパラメーターをJavascriptで取得してリンクの後ろに付けるという事案が有りましてコーディングしてみたので、メモです。
・URL
✗✗✗✗✗✗.net/index.php?target=123456789

・HTML
(リンクタグ例)
`<a href="✗✗✗✗✗✗.net/aaa/index.php?target=">リンク</a>`


javascript

```javascript
//コードが取得できないときのデフォルト値
var def = "123456789-1";//任意の値
var urlParam = location.search.substring(1);
if ((String(urlParam).length) <= 1){//単純にパラメーターが入っているかみてます。
	var cam = def;//入っていない場合、デフォルト値
}else{
		
if (urlParam.indexOf('target=') !== -1) {
//特定の文字が入っているかパラメーター精査を厳し目に

var parameter = decodeURIComponent(location.search.match(/target=(.*?)(&|$)/)[1]);
var str = parameter;
    var param = str.replace( '+', ',' );
//複数の値に対応。数値間の+（プラス）を,（カンマ）に置換
	var cam = param;
	var lang = 'default';
    var match = location.search.match(/target=(.*?)(&|$)/);
if(match) {
	lang = decodeURIComponent(match[1]);
	
}
}else{
	var cam = def;//条件に満たない場合デフォルト値の挿入
}

window.onload = function onLoad() {
		param = GetQueryString();
		target = document.getElementsByClassName('target');
		
function GetQueryString() {
var targets = document.querySelectorAll('a.target');//リンク挿入のClass
for (var i = 0; i < targets.length; i++) {
var target = targets[i];
var url = target.href;
url += cam;  //挿入するパラメーター
url += '$target2=';  //固定のものを入れるならこちらに記載★
target.href = url;	
}}
console.log(cam)
}
```

以上になります。
複数のLPを取り扱うときなどにあると便利かもですね！
今さらだが、fom_forの便利さをまとめてみた

viewをコーディングしているとき必ずと言っていいほど登場する`form_for`メソッド

`formタグを生成してくれるメソッド`ぐらいにしか思っていなかったが、よく調べると便利なんだと気づいた

## form_forの基本

```ruby
= form_for(@user) do |f|
  = f.label :name
  = f.text_field :name
　= f.submit "登録"
```

よく見るコード(haml)だが、まず第一に'form_forメソッド'は、
`@userのオブジェクトの中身`によって、遷移先のアクションを自動的に選択してくれる、という優れもの

そもそも`@user`は、コントローラで生成されたインスタンス。
例えば、`@user = User.new`でUserモデルのインスタンスが新たに生成された場合は、`@user`の中身はから。
ここで、`new.html.haml`ファイルが呼ばれ、このform_forメソッドが起動すると`form_forメソッド`は、自動的に`create`アクションへのパスを生成してくれます。
中身がからなので、このフォームで作成されたデータを新たに登録するんだなと、自動的に判断してくれるんですね。

うん、すごすぎる!!

今度は、editアクションで`@user = User.find(params[:id])`で`edit.html.haml`の`form_forメソッド`が呼ばれた場合はどうでしょう。
この場合は、`@user`に`params[:id]`で抽出されたデータが格納されていますので、`form_forメソッド`は、`updateアクション`へのパスを生成してくれます。
編集したいデータが`@user`に格納されているので、`form_for`は、今度はこの格納されている値を編集して更新するんだなと、判断してくれるんです。

めちゃ、すご。

## namespaceが設定されている場合のform_for

```ruby:routes.rb
 namespace 'admin' do
  resources :users
 end
```

```ruby:admin/users_controller.rb
 class Admin::UsersController < ApplicationController
  def new
   @user = User.new
  end
 end
```

上のような場合に、そのまま`form_for(@user) do |f|`を記述してもエラーとなります。
この場合のform_forは、

```ruby:new.html.haml
 form_for([:admin, @user]) do |f|
 ・・・・
```
と、namespaceで設定した変数を使用すると、しっかり動いてくれます。
iOS Safari「デスクトップ用サイトを表示」でのユーザーエージェント

# これは何

iOS 8 から Safari に「デスクトップ用サイトを表示」機能が追加されました。
この機能を使用した際の User Agent をまとめます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/50f7d453-c1ce-6fae-b53e-937d60e1f60d.png)

# iOS 8.x

## iOS 8.0

通常時：

```
Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A365 Safari/600.1.4
```

デスクトップ用サイトを表示時：

```
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10) AppleWebKit/538.44 (KHTML, like Gecko) Version/8.0 Safari/538.44
```

# iOS 9.x

## iOS 9.0

通常時：

```
Mozilla/5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13A344 Safari/601.1
```

デスクトップ用サイトを表示時：

```
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Safari/601.1.42
```

# iOS 10.x

## iOS 10.2

通常時：

```
Mozilla/5.0 (iPhone; CPU iPhone OS 10_2 like Mac OS X) AppleWebKit/602.3.12 (KHTML, like Gecko) Version/10.0 Mobile/14C92 Safari/602.1
```

デスクトップ用サイトを表示時：

```
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12) AppleWebKit/602.3.12 (KHTML, like Gecko) Version/10.0 Safari/602.1.31
```

## iOS 10.3.3

通常時：

```
Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 Mobile/14G60 Safari/602.1
```

デスクトップ用サイトを表示時：

```
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 Safari/602.1.31
```

# iOS 11.x

## iOS 11.0

通常時：

```
Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1
```

デスクトップ用サイトを表示時：

```
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/10.0 Safari/602.1.31
```

## iOS 11.3 beta 6

通常時：

```
Mozilla/5.0 (iPhone; CPU iPhone OS 11_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.0 Mobile/15E148 Safari/604.1
```

デスクトップ用サイトを表示時：

```
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1 Safari/605.1.15
```
Atomでパッケージの検索をする

Cloud9からAtomに環境移行したときのお話し。

バージョン：atom 1.0.18
日本語変換パッケージを入れてます。

```
パッケージ　=> setting view => Install Packages/Themes
```
![スクリーンショット 2018-03-23 17.59.22.png](https://qiita-image-store.s3.amazonaws.com/0/223487/f3921452-7ea1-b884-0f57-37ca863f8675.png)
スムーススクロール

## スムーススクロール

- https://github.com/Teddy-Zhu/vue-smoothscroll

~~~bash
$ yarn add vue-smoothscroll
~~~

code:

~~~js
...
import VueSmoothScroll from 'vue-smoothscroll'

Vue.use(VueSmoothScroll)
...
~~~


~~~js

  methods:{
      ...
      scrollTo(id){
          this.$SmoothScroll(document.getElementById(id), 800);
      }
      ...
  }
~~~

template:

~~~html
<input
  v-model="agreed"
  @change="scrollTo('scroll-submit')"
  type="checkbox" class="checkbox" name="agreed" />  

...
  <a name="submit" id="scroll-submit" ></a>
  <input type="submit"...>
  
~~~
GitHub見る時にDark Reader使うと目に優しくて捗った

# GitHub眩しい！
GitHubって標準だと驚きの白さですよね。
花粉症で目がしょぼしょぼのこの時期、こう白いとPRを見るのも一苦労。眩しくて辛いorz

# Dark Readerとは？
chromeの拡張機能です。
タイトルそのまま、WebサイトをDarkな色テーマにしてくれます。

<img width="1029" alt="スクリーンショット 2018-03-23 17.35.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/39909/5386c5fe-49b1-0878-02b5-c9b201ac0cf4.png">


https://chrome.google.com/webstore/detail/dark-reader/eimadpbcbfnmbkopoojfekhnkhdbieeh?hl=ja



# 使い方

**全てをDarkにする**
単純に拡張機能を入れるだけでokです。
ブラウザ右上のDark Readerアイコンが ↓ のように 
<img width="64" alt="スクリーンショット 2018-03-23 17.32.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/39909/e1da1c57-227a-55a1-54b6-eaaab2b4c668.png">

黒く出ていればDarkなテーマが有効になっていることを表しています。可愛いですね。

**特定のサイトだけDarkにする**

1. 右上のアイコンをクリック
2. Site listタブを洗濯
3. invert listed onlyにDarkにしたいURLを入力

↓ みたいな感じ。

<img width="275" alt="スクリーンショット 2018-03-23 17.26.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/39909/1dad4877-4bf6-899d-85a9-c8522a1f17a2.png">

簡単ですね！

# ショートカット

**Dark / LightをToggleする**
invert listed onlyにURLを追加している場合、
追加したURLのページでのみこのショートカットが有効になるようです。

- Win : Alt + Shift + A
- Mac : Option + Shift + Fn + A

**今見ているページをDark / Light にToggleする**
こちらはinvert listed onlyなどの設定は関係なく、
単純に今見ているページに対してDark / LightのToggleが行われます。

- Win : Alt + Shift + D
- Mac : Option + Shift + Fn + D
RubyでErrno::EXXXを例外補足できない場合の対処法

## ご注意(補足)
コメントでご指摘が有りましたので、誤解のないように補足いたします。
こちらの記事はあくまで「RubyでErrno::EXXXを例外補足できない場合」の対処法なので、
この方法をスタンダードとして推奨するものではありません。

本来であれば以下のように `rescue Errno::EXXX => ex` で補足できるはずです。

```[ruby]
begin
  # Something to do
rescue Errno::ECONNRESET => ex
  # Something to do
end
```

しかし、その方法では補足されない状況が発生しており、
調べた結果、一つの解決策が見つかりましたのでこの記事を作成いたしました。

考えられる原因や他の解決策をご存知のかたいらっしゃいましたら、
ぜひコメント頂けますと幸いです。

## 概要
Capybara + Poltergeistで自動ブラウザ操縦を実装していた際、
Windows環境でだけ、一定時間経過すると `Errno::ECONNRESET` が発生する状態になっていた。

作っているものの特性上、それは問題ないので例外補足してリトライさせようとしたが、
`rescue Errno::ECONNRESET => e` では補足されずにつまりました。

お恥ずかしや、おそらく基本中の基本っぽいが知りませんでした。


## 対処法
`rescue Errno::ECONNRESET => e` で補足せず、
`rescue Exception => ex` でつかまえて、その中で処理を分岐させる。

```[ruby]
begin
  # Something to do
rescue Exception => ex
  case ex
  when Errno::ECONNRESET
    # Something to do
  end
 end
```

## 参考
[ruby - How to catch Errno::ECONNRESET class in "case when"? - Stack Overflow](https://stackoverflow.com/questions/3801469/how-to-catch-errnoeconnreset-class-in-case-when/26565738)
sync.Onceの挙動がなんとなくしか分からなかったので実際に試してみた

#sync.Onceとは


ｓｙncパッケージの処理はこちらで説明されてたので、ご参考までにどうぞ
https://qiita.com/t-mochizuki/items/80dc959b4221c53f3c40#synconce


# 実際に試してみた

## PatternA
とりあえずsync.Onceを使った場合と使わない場合を織り交ぜてみた

### テストコード
```go
package main

import "fmt"
import "sync"

var foo string

func main() {
	var once sync.Once
	
	once.Do(func() {
		foo = "A"
	})
	once.Do(func() {
		foo = "B"
	})
	fmt.Println(foo)
	foo = "C"
	fmt.Println(foo)
	once.Do(func() {
		foo = "D"
	})
	fmt.Println(foo)
}
```
https://play.golang.org/p/imWwk2ij84-

### 結果
```
A
C
C
```

## PatternB
PatternAで `foo` が `D` にかわらなかったのが、`C` が代入されていたからか、そのまえにsync.Onceを使っていたからかを切り分ける

### テストコード
```go
package main

import "fmt"
import "sync"

var foo string

func main() {
	var once sync.Once
	
	foo = "C"
	once.Do(func() {
		foo = "D"
	})
	fmt.Println(foo)
}
```
https://play.golang.org/p/q2-qO73J7L1

### 結果
```
D
```

## PatternC
異なる処理を同じ sync.Once を使った場合にどうなるかを確認
### テストコード
```go
package main

import "fmt"
import "sync"

var foo string
var bar string

func main() {
	var once sync.Once
	
	foo = "NoN"
	bar = "NoN"
	once.Do(func() {
		foo = "A"
	})
	once.Do(func() {
		bar = "B"
	})
	fmt.Printf("foo: %s\n",foo)
	fmt.Printf("bar: %s\n",bar)
}
```
https://play.golang.org/p/A4Uq4yUUhUe

### 結果
```
foo: A
bar: NoN
```

## PatternD
異なる処理を異なる sync.Once を使った場合にどうなるかを確認
### テストコード
```go
package main

import "fmt"
import "sync"

var foo string
var bar string

func main() {
	var typea sync.Once
	var typeb sync.Once
	
	foo = "NoN"
	bar = "NoN"
	typea.Do(func() {
		foo = "A"
	})
	typeb.Do(func() {
		bar = "B"
	})
	fmt.Printf("foo: %s\n",foo)
	fmt.Printf("bar: %s\n",bar)
}
```
https://play.golang.org/p/VYXifllWJyy

### 結果
```
foo: A
bar: B
```

## 結論
- sync.Onceは宣言した変数別に管理される
- 中の処理が異なっていても関係ない。異なる処理を同じSync.Onceで管理してはいけない

当然といったら当然な結果でした。
RailsのDate型のサンプル

[株式会社TECH LUCK](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)という会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。
- プロジェクトでRailsエンジニアが足りなくて困っている
- Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
- オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい

また、Railsエンジニアも募集しておりますので、興味がありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご連絡いただけますと幸いです。

# 前提

Ruby on Railsで、Date型を使う機会があったので、サンプルコードとして使い方をまとめてみました。
実行結果はサンプルコードの下に記述してあります。
すべて `2018/01/05` に実行した結果となっています。


# 基本的な使い方

年、月、日を指定して取得する

```ruby
Date.new(2017, 01, 01)
# => Sun, 01 Jan 2017
```


今日の年月日を取得する

```ruby
Date.today
# Fri, 05 Jan 2018
```

今日の日付を取得する

```ruby
Date.today.day
# 5
```


今月の月を取得する

```ruby
Date.today.month
# 1
```

今年の年を取得する

```ruby
Date.today.month
# 2018
```

昨日の日付を取得する

```ruby
Date.yesterday
# Thu, 04 Jan 2018
```

## 〇〇日前、〇〇日後
`~~~s_ago`, `~~~s_since` というメソッドが有効です。

おとといの日付を取得する

```ruby
Date.today.days_ago(2)
# Wed, 03 Jan 2018
```

翌日の日付を取得する

```ruby
Date.tomorrow
# Sat, 06 Jan 2018
```

2日後の日付を取得する

```ruby
Date.today.days_since(2)
# Sun, 07 Jan 2018
```


先月の日付を取得する

```ruby
Date.today.last_month  #Date.last_monthだとエラーが起きる
# Tue, 05 Dec 2017
```

翌月の日付を取得する

```ruby
Date.today.next_month  #Date.next_monthだとエラーが起きる
# Mon, 05 Feb 2018
```


昨年の日付を取得する

```ruby
Date.today.last_year
# Thu, 05 Jan 2017
```

翌年の日付を取得する

```ruby
Date.today.next_year
# Sat, 05 Jan 2019
```

# 始めの日付、終わりの日付
`beginning_of_~~~`, `end_of_~~~` というメソッドが有効です。


今週の始めの日の日付を取得する

```ruby
Date.today.beginning_of_week
# Mon, 01 Jan 2018
```


今週の終わりの日の日付を取得する

```ruby
Date.today.end_of_week
# Sun, 07 Jan 2018
```


今月の始めの日の日付を取得する

```ruby
Date.today.beginning_of_month
# Mon, 01 Jan 2018
```

先月・翌月の始めの日の日付を取得する

```ruby
#先月
Date.today.last_month.beginning_of_month
# Fri, 01 Dec 2017

#翌月
Date.today.next_month.beginning_of_month
# Thu, 01 Feb 2018
```

今月の終わりの日の日付を取得する

```ruby
Date.today.end_of_month
# Wed, 31 Jan 2018
```


先月・翌月の終わりの日の日付を取得する

```ruby
#先月
Date.today.last_month.end_of_month
# Wed, 31 Jan 2018

#翌月
Date.today.next_month.end_of_month
# Wed, 28 Feb 2018
```