OmniAICreator/Qiita-1.07M huggingface dataset:
vbaそのままコピペ「最終行まで取得」

解説抜きでサクッとコピペしたい自分向けのページ
「A2からA列最終行まで」

```vb
'構文1
Range("A2:A" & Cells(Rows.Count, "A").End(xlUp).Row).Select

'構文2
Range(Range("A2"), Cells(Rows.Count, "A").End(xlUp)).Select

'数値を取得
Dim r As long
r = Cells(Rows.Count, 1).End(xlUp).Row
```
SQLによる時系列データの集約


`BigQuery`で１分粒度のデータを５分や３０分に集約したくて、試した結果。

軽く調べたけど、タイムスタンプを文字列として…っていうやり方がちょっと面倒だったので自己流で。何かデメリットがあるのかも知れない。

# やりたいこと
細かい粒度のデータを集約（合算/平均など）したい。

# 前提
とりあえず以下の前提です。

- データは欠損していない
- キーとして扱っているフィールド（`DATA_TIMESTAMP`、`ID`）で重複はない
なおスキーマは以下の通り

| 列名 | データ型 |
| :-- | :-- |
| ID | STRING |
| VALUE | FLOAT64 |
| DATA_TIMESTAMP | TIMESTAMP |

# 実現方法
単純で、`DATA_TIMESTAMP`を秒で表現し、集約単位での余りを引く。 　
でその値で集約する。

```sql
# 1分値→5分値
SELECT 
    ID, VALUE, DATA_TIMESTAMP
FROM
    (SELECT 
            TIMESTAMP_SECONDS(UNIX_SECONDS(DATA_TIMESTAMP) - MOD(UNIX_SECONDS(DATA_TIMESTAMP), 300)) AS DATA_TIMESTAMP,
            ID,
            SUM(VALUE) AS VALUE
    FROM
        `series_data.xxx_01min`
    GROUP BY ID, DATA_TIMESTAMP) M
    ORDER BY ID, DATA_TIMESTAMP;
```

```sql
# 5分値→30分値
SELECT 
    ID, VALUE, DATA_TIMESTAMP
FROM
    (SELECT 
            TIMESTAMP_SECONDS(UNIX_SECONDS(DATA_TIMESTAMP) - MOD(UNIX_SECONDS(DATA_TIMESTAMP), 1800)) AS DATA_TIMESTAMP,
            ID,
            SUM(value) AS VALUE
    FROM
        `series_data.xxx_05min`
    GROUP BY ID, DATA_TIMESTAMP) M
    ORDER BY ID, DATA_TIMESTAMP;
```

## ちょっとした注意
より粒度の小さいデータ、この場合１分データがあれば３０分集約も作れるけれど、`BigQuery`のお金を節約するなら、1分→５分→30分のようにちょっとずつ再利用した方がいい。
Railsで複数DB接続する

# はじめに
追記
ActiveRecord v6.0から組み込みで複数データベース接続機能が提供されたため、現在ここで紹介してライブラリ側から「ActiveRecord v6.1以降はサポートしません。」と明記されています。よほどの事情がない限り、ここで紹介しているライブラリではなく、ActiveRecord組込の複数DB接続機能を利用しましょう。
https://github.com/eagletmt/switch_point#maintenance-notice

Rails5では、複数DB接続が公式ではサポートされていません(Rails6からは公式サポートされるそうです)。
しかし、読み込み系の処理はリードレプリカに、書き込み系の処理はmasterにって処理を振り分けたいという需要があったので、その時にやったことの備忘録として投稿します。

# Modelを介す場合
[SwitchPoint](https://github.com/eagletmt/switch_point)を使用しました。

## Switch Pointの設定
Gemfile
`gem 'switch_point'`

```yml:database.yml
production:
  # 省略

production_slave:
  # 省略
```

```ruby:config/initializers/switch_point.rb
SwitchPoint.configure do |config|
  config.auto_writable = true
  database_config = {
    readonly: :"#{Rails.env}_slave",
    writable: :"#{Rails.env}"
  }
  config.define_switch_point :setting, database_config
end
SwitchPoint::writable!(:setting)
```

`SwitchPoint::writable!(:setting)`
と書いておくことでデフォルトの接続先がmasterを向きます。

## 使い方
### Slaveに向ける
```ruby:hoge.rb
Hogemodel.with_readonly do
  data = Hogemodel.where(id: 1)
end

Hogemodel.with_readonly do
  aaa = Hogemodel.where(id: 1)
  aaa.title = 'フロントエンドのプロ直伝！ CSS余白設定の三原則（＋線の引き方）'
  Hogemodel. with_writable do
    aaa.save!
  end
end
```

### Slaveから読み込んでMasterに書き込む
```ruby:hoge.rb
Hogemodel.with_readonly do
  aaa = Hogemodel.where(id: 1)
  aaa.title = 'フロントエンドのプロ直伝！ CSS余白設定の三原則（＋線の引き方）'
  Hogemodel.with_writable do
    aaa.save!
  end
end
```

# Slaveに対して生SQLを発行したい場合
ときにはORMでは表現しにくい複雑なクエリをslaveに対して発行したいときもあると思います。

```ruby:slave_db.rb
module SlaveDb
  extend ActiveSupport::Concern
  class << self

    # slaveDBとコネクションを確立するための情報を返す
    def get_slave_db_connection
      db_config = Rails.configuration.database_configuration
      db_env = "#{Rails.env}_slave"
      ActiveRecord::Base.mysql2_connection(
        adapter: db_config[db_env]['adapter'],
        host: db_config[db_env]['host'],
        username: db_config[db_env]['username'],
        password: db_config[db_env]['password'],
        database: db_config[db_env]['database']
      )
    end
  end
end
```

Rails(MySQLに限る)は新しくDBとのコネクションを呼ぶ際に、内部的にmysql2_connectionというメソッドを叩いているため、database.ymlから取得した、slaveへの接続先を渡してこのメソッドを叩きます。

サクッと使いまわせるように、今回はconcernに処理を書きました。
呼び出し側では、

```ruby:slave_db.rb
include SlaveDb
begin
  # きっと複雑なクエリ
  query <<-"EOL"
    select * from ...
  EOL
  con = SlaveDb.get_slave_db_connection
  data_list = con.select_all(query).to_hash
ensure
  con&.disconnect!
end
```

こんな感じで使えます。

似たようなメソッドに`establish_connection`というメソッドもあるのですが、こちらは呼ばれると同時に、既存のコネクションを全部切断してしまうので、使用しませんでした。
Free BSD 10.4 を FreeBSD 11.2 にアップグレード

サポート外になっていたので更新。
素人なのでわけのわからないことしてるかもしれない。

現在のバージョン確認

```
freebsd-version
```
# ハードディスクのコピー
ディスクの確認

```
geom disk list
```
コピーの作成は

```
sudo recoverdisk /dev/ad数字(コピー元) /dev/ad数字(コピー先)
```
#アップグレード

FreeBSD のセキュリティパッチをダウンロードし、インストールする。

```
freebsd-update fetch
freebsd-update install
```

FreeBSDのシステムをFreeBSDリリース名にアップグレードする。

```
freebsd-update -r 11.2-RELEASE upgrade
```
手動で編集しろっていわれたら、

```
<<<<<<<< current version
##### FreeBSD:releng/10.4-RELEASE号/etc
========

##### FreeBSD:releng/11.2-RELEASE/etc

>>>>>>>> 11.2-RELEASE
```
のとき、##### FreeBSD:releng/11.2-RELEASE/etc以外の<<<から>>>まで全部消せばいいらしい。

変更点をディスクに反映。

```
freebsd-update install
```
終わったらシャットダウン。

```
shutdown -r now
```
ここでキーボードのキーマップと、SSHの設定を変更するよう言われた。
変更したら、
```
freebsd-update install
```

番号が上がるような(メジャーアップデート)場合はパッケージのアップグレードの必要がある。

```
pkg-static upgrade -f
```

最後にもう一回やり直しをなくすために、

```
freebsd-update install
```

作業ファイルの削除

```
rm -fr /var/db/freebsd-update/files
```
Java tips - Spring executionまとめ

# Spring executionまとめ
Springでメソッドを指定してAOPするときに、executionを用いるやり方があります。
その時に、executionってどうやって書くんだっけとなりやすいので備忘録としてまとめます。

## executionの書き方

例えば以下のようなテストメソッドがあるとします。

```java
package test;

public class TestC {
    public String testM(String str) throws Exception {
        return "test";
    }
}
```

このテストメソッドに前処理のAOPを用いる時は以下のように書きます。

```java
@Before("execution(public String test.TestC.testM(String)) throws Exception")
```

要素としては以下の順番に書きます。
- 修飾子
- 戻り値の型
- パッケージ名
- クラス名
- メソッド名
- 引数の型
- 例外

この中で修飾子と例外は省略が可能です。そのため、以下のように書くことが可能。

```java
@Before("execution(String test.TestC.testM(String))")
```

さらに、戻り値やパッケージ名やクラス名はワイルドカードを使用することができます。

```java
@Before("execution(* test.*.*(..))")
```

## まとめ
いつも忘れるので、まとめて思い出せるようにするだけで価値があるかな。
LINE WORKS の Quick Reply を使ってみる

(この記事は Python 3.7 ベースで作成されています)

LINE WORKS v2.6 で、Bot に [Quick Reply機能](https://developers.worksmobile.com/jp/document/100500807?lang=ja)が追加されましたので、送信テストを行ってみました。


# Quick Reply とは
メッセージ送信と同時に、返信候補をボタン形式で表示します。
![quickreplay.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224481/08e4e560-4937-620b-fe41-d04589635780.jpeg)

スタンプや画像その他すべてのメッセージ形式に追加でき、返信方法も[テキスト以外にカメラや地図も選べる](https://developers.worksmobile.com/jp/document/1005050?lang=ja)ため、定型の返信を促したい場合などに便利です。
![quickreplay2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224481/ab4ff5f8-9ebc-dd29-c1ac-9e1b8c10204d.jpeg)


また、postback を用いることで、実際のトーク画面では "起きた" を表示しつつ Bot 側には "action=yes&itemid=123" というような値を渡すこともできます。

# QuickReply のテスト
Python で Quick Reply つきメッセージ送信を送ってみました。

```python:send_message_w_qr.py
import json
import requests

#QuickReply つきメッセージ送信。Message はテキスト、QuickReply はJSON形式のリスト渡す。
def send_message_QR(BotNo, TargetId, Message, QRmessage):
        #リクエストURLの作成
        apiheadurl =  'https://apis.worksmobile.com/r' 
        apicategory = 'message/v1'
        apitarget= 'bot'
        apiurl= '/'.join([apiheadurl,APIID,apicategory,apitarget,str(BotNo),'message/push'])

        #ヘッダー情報
        header = {
                'consumerKey': {Server API Consumer Key},
                'Authorization': 'Bearer ' + {サーバー認証 Token},
                'Content-Type': 'application/json'
        }

        #送信ボディ
        payload = {
                'accountId' : TargetId,
                'content' : {
                        'type': 'text',
                        'text': Message,
                        'quickReply':{'items':QRmessage}
                }
        }
 
        #送信
        r = requests.post(apiurl, headers = header, data = json.dumps(payload))
        if r.status_code ==200:
                return True
        else:
                return False, r

# Quick reply メッセージリストの用意
QRMS = [
        {'action':{'type':'message','label':'起きた','text':'おきた','psotback':'action=yes&item=12'}},
        {'action':{'type':'message','label':'寝坊した','text':'ねむい'}},
        {'action':{'type':'message','label':'な、何が起こったのか…','text':'ポル'}}
        ]

#メッセージの送信
send_sticker_QR({Bot 番号},{送信先のメンバー},{送信するメッセージ文}, QRMS)

```

Quick Reply は content パラメータ内で、各メッセージの後に quickreply を追加するだけで簡単に送信することができます。
Hyper-Vについての忘備録

#はじめに

基本的には、ほかのVM系と同じ
WinServerでやってるから、微妙に違うような気がするだけであり
そもそもGUIでの設定変更とか自分のPCでちょこちょことしかやってない

操作、設定はほぼすべてGUIで行う。
すんごい新鮮
cmdもたまに使うぐらい

覚えたこと
・パーティションの分け方は基本的にC: D:を別の仮想HDを作成する。

・NICが複数種類ある場合はポートチャネリングと同じように、NICチーミングっちゅーもんをするらしい。
チーミングの方法は至ってシンプル下記参照

GUI
サーバーマネージャー→ローカルサーバーNIC チーミングで実施
アダプタとIFにてチーム追加(右クリック)で行うだけ。

サービス系と管理系を分けるようにする。
(これはNWでも同じですねWLCが想像しやすい

ブートの設定方法などに疑問が残る

今回の構築で使った参考URLを張っとく
あくまで自分用

http://www.vwnet.jp/windows/WS12R2/Hyper-V/Hyper-V_Network.htm
https://uncle-atsushi.com/hyper-v_virtual_switch_configuration
http://faq3.dospara.co.jp/faq/show/3362?site_domain=default
https://techinfoofmicrosofttech.osscons.jp/index.php?NIC%E3%83%81%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0
https://support.conoha.jp/ws/changepassword/
http://yanor.net/wiki/?Windows%20Server/Hyper-V/%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%E3%81%AE%E8%BF%BD%E5%8A%A0
https://milestone-of-se.nesuke.com/nw-basic/link-aggregation/windows-teaming-and-switch-config/



#覚え書き
###ホストOSと、仮想OSのNW-IF分け
仮想SW作成までは問題なかったが、ホストも仮想も同じIFでNWに出てしまうので
どうやって分けるんだろと思案

下記を参考に設定
https://qiita.com/kit/items/56916c4285f353e89ea0


仮想SW側でホストOSにNWアダプタを共有しない設定項目があったのでチェックボックスを外して
問題なくホストと仮想のIFを分けることが成功

イメージとしては下記
![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_307065_7164eddb-dbaa-c925-ee97-0d061e3017b0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307065/b33d34d1-05b5-5c2a-bf59-60359c9d2dc8.jpeg)



### VMの多重起動
基本的にすべてのVMは、DICKからOSのインストールを行っていたので
BOOT loaderがEのDVDドライブがプライマリ設定になっていた。
そこで、3つともDVD読み込みがプライマリになっていたのでプロセスが重なり
マウントできず、多重起動が不可となっていた。
そこで、物理DVDドライブの読み込みを削除したら解消した。
最終的にはどうするのが正しいのか不明→要確認

### 追加DISKのマウント
仮想DISKを追加マウントした場合、初期化及びシンプルボリュームの追加をしないと認識しない。
[スタート]→[ディスクの管理]→指定DISKのパーティション分け、名称変更を実施。

###[エラー]Downloaded Maps Manager 
ずっとエラー吐いてたのでなんじゃろと思い調べると
位置情報？マップへ機能のようなものらしい
多分サーバルームとかに置くから全くいらないと思うんだけど消すのかな

今のところ以上
AWS Solutions Architect Associate 合格記録

# この記事
AWS SAAを取得しました。
https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/
正式名称はAWS 認定ソリューションアーキテクト – アソシエイト。

これまで何をしたのか？
どんな勉強が役に立ったのか？
などを記録します。

# 私

はじめに私の事ですが、SE、3年目です。

これまでは、インフラの運用やたまに構築、AWSドキュメント作成などをしていました。
その他に、開発としてPythonを触ることもありましたが、あくまでインフラがメインです。

現在は、最高の環境でAWS関連の設計構築の仕事をするため、今話題の企業に入社したところです。
今後もAWSの仕事をしていくので、今回のSAA取得は第一歩というところです。

# 学習記録
実際にAWS関連で学習した内容や経験は、以下。
前提として、SE1年目にサーバーやネットワークの超基礎部分は学習済。


## SE 1年目

#### EC2、VPCに触れる
EC2とはなんなのか、詳しく見ていくところから始まりました。
当時その会社では、チームでAWSを業務で扱い始めた！というところに私が入ったので、
調査やドキュメント作成をする中で主にEC2やAWSネットワークリソース周りの調査をしました。

具体的にやったことは以下
・マネジメントコンソールからEC2を作成、SSH接続してLinux上の操作をする
・VPC、サブネットを設計してマネジメントコンソールから構築し、セキュアな基本構成EC2を試しに構築
・EC2の構成要素を知るため、CLIやドキュメントから全てのメソッドを調査、AWSドキュメントも読み込む

#### Webサーバーを立ててみる
・３層アーキテクチャの勉強の一環で、ApacheをEC2に立てて設定を変えたり。

## SE 2年目

#### 業務
・サーバー監視システムを構築するためドキュメント作成や構築。
ここではCloudWatch、SNS、Lambda、サードパーティ製品連携など。

#### 自身のアカウントでAWSと触れ合う
あまり深いところまで業務で触ることがなかったので、
自身の勉強として以下を実施

・基本アーキテクチャ作成
⑴Webサーバー ＋ APサーバー ＋ MysqlDB（無料利用枠で利用）を立てて動作確認
⑵踏み台 ＋ Webサーバー作成後、SG設定が反映されているかSSHアタック＆Apache設定の確認
⑶低スペックPCから高スペックなWindowsEC2インスタンス上に接続し、メモリが必要な作業
　また、Windows Server上でRDP設定変更して遊んだり。
⑷S3で自身のサイトを複数配信。安くて感激。
⑸LambdaやAPI Gatewayを利用してLINEにニュースや天気を配信してみる

・SageMakerを使った機械学習（異常検知をしてみる）など
※SAAとは関係なし。ただ、SageMaker上で何のリソースを作っているかをみるのは面白かった。

#### 試しにSAAを受けてみたら
この時期はまだ旧試験でした。
AWS Summitの際に受験してみた。

結果はあと１問で不合格。なんてこった…
対策したのは、以下のみ
・koiwaclub SAA問題１周
・BlackBeltを軽く閲覧

## SE 3年目(今)
#### 再び自身のアカウントで学習
・Route53に、お名前.comで取得したドメインを移管して、Webサーバーにアタッチ
ec2-xx〜っていうURL以外でアクセスできるあのワクワク。
・ECS Fargateを使用してみる
・ACMを利用してHTTPSでWebサイト配信

## 受験直前にやった事
### koiwaclub
https://aws.koiwaclub.com/
koiwaclubは今回の受験前は下から半分解きました。

得た事は大きく２点。
①**基本知識で足りない部分を埋める**事ができました。
ELB周りやS3の種類など、意外と穴があります。

②**問題数を解く事**で大きかった利点は
**「若干不自然な日本語に慣れる事」**です(笑)
問題文を読むのが間違いなく早くなりました。


### AWS公式で配布の例題 ＋ 模擬試験
**模擬試験は絶対に受けた方がいい**と思います。

模擬試験でわからなかったところを振り返りました。
あ、模擬試験は、わからない部分を上手く聞かれて64％で超ギリギリ不合格でしたw
みたことある数字でした…

### 書籍活用
この本を活用しました。
「AWS認定アソシエイト3資格対策
~ソリューションアーキテクト、デベロッパー、SysOpsアドミニストレーター~」
https://www.amazon.co.jp/dp/4865941991

最終的に知識が足りてなさそうな分野としてストレージ、高可用性などがありましたが
該当分野の章末問題を解いたり、知らない機能部分を読むことで**上手く補えました**。
初めは問題少ないかも？と思いましたが、私にはちょうどよかったです。

試験を受けて特に感じましたが、やはり**AWSに実際に触ってみることが大切**でした。
私は暗記が得意ではないので余計でしょうか。。

この本には章末にAWSが提供している**「チュートリアル」のリンク**が乗っています。
これ、ありがたい。該当サービスを全く触ったことがない場合、チュートリアルを上手く活用して
その経験が試験で活きる事が**高確率である**はずです。

これからDevOps系も受けるのでこの本はまだまだ活用できそうです！




# 結果
100-1000点中755、合格点は720。
スレスレですね(笑)

模擬試験でもそうでしたが、不得意分野はパフォーマンスに優れたアーキテクチャ設計のための知識。
いくつか試験中に不明点があったのは、明確に覚えています。悔しかったので。
しかし新試験に変わっても、試験対策として直前にひたすらやった穴埋めが功を奏して合格しました。

一つ感じたのは、サービスを全体的に網羅する必要があるな、と感じました。
あくまで個人的に感じた事。


# まとめ

### 役に立った物＆サイト
awskoiwaclub
https://aws.koiwaclub.com/

AWS配布の例題、模擬試験
https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/
※サイト内「サンプル問題のダウンロード」

「AWS認定アソシエイト3資格対策
~ソリューションアーキテクト、デベロッパー、SysOpsアドミニストレーター~」
https://www.amazon.co.jp/dp/4865941991

### 次

プロフェッショナル(SAP)を来月受けます。
実際に**チュートリアル**をたくさんやろう。
scipy 疎行列の準備でのスライスとリスト代入

scipy.sparse　には<a href = "https://docs.scipy.org/doc/scipy/reference/sparse.html">内部データ構造の違いにより多くの疎行列がある。</a>ただ、マトリックス自体の準備には　lil または　dok を用い、その後　tocsr などして計算効率の高いフォーマットに変換することが勧められている。
他方、マトリックスの準備にあたって、複数のエレメントに同一の処理を施したい場合がある。疎行列は巨大なデータを扱う場合に用いるしPython なので可能な限りループはしたくない。そこでスライスやリストを用いた処理をしたいのだが lil と dok では挙動に違いがあるようだ。

代入に関してはスライス、リストによる要素指定が　csr,lil,dok など共通して動作する。
他方、要素に対するブロードキャスト演算は　dok のみで動作するようだ。

検証コード　（たまたま複素行列演算を検証していたため複素数になっている）

```
from scipy.sparse import csr_matrix,lil_matrix,dok_matrix,dok_matrix
import numpy as np
csr = csr_matrix((10,10),dtype= np.csingle)
lil = lil_matrix((10,10),dtype= np.csingle)
dok = dok_matrix((10,10),dtype= np.csingle)

csr[1,2:4] = 1-1j
csr[2,[7,8,9]] = 1+1j
lil[1,2:4] = 1-1j
lil[2,[7,8,9]] = 1+1j
dok[1,2:4] = 1-1j
dok[2,[7,8,9]] = 1+1j

#ここまでは問題なく動作

csr[1,2:4] += 1-1j
csr[2,[7,8,9]] += 1+1j
lil[1,2:4] += 1-1j
lil[2,[7,8,9]] += 1+1j
dok[1,2:4] += 1-1j
dok[2,[7,8,9]] += 1+1j

#上記は、dok 意外をコメントアウトすると動作。動作しない場合のエラーメッセージは
# NotImplementedError: adding a nonzero scalar to a sparse matrix is not supported


print(type(csr),csr)
print(type(lil),lil)
print(type(dok),dok)
```
MySQL コマンド集

## 空テーブルの作成
```
mysql > CREATE TABLE xxxx like yyyy;
```

### テーブル一覧
```
mysql > show tables;
mysql > show table status;
```

### テーブルの構造
```
mysql > desc xxxx;
mysql > SHOW FULL COLUMNS FROM [テーブル名];
```

### ログイン
```
$ mysql -u [ユーザー名] -p
```

### ログアウト
```
mysql > \q
mysql > quit
mysql > exit
```

### Root情報取得
```
mysql > SELECT Host, User, Password FROM mysql.user;
```

### ユーザ追加
```
mysql > create user `testuser`@`localhost` IDENTIFIED BY 'password';
```
### ユーザーにDB操作権限を付与
```
mysql > grant all privileges on test_db.* to testuser@localhost IDENTIFIED BY 'password';
```
### ログイン中のユーザーのパスワードを設定する場合
```
mysql > set password = password('hogehoge123');
```
### 特定のユーザーのパスワードを設定する場合
```
mysql > set password for 'testuser'@'localhost' = password('hogehoge123');
```
### テーブルの削除
```
mysql > DROP TABLE hoge;
```
### 追加
```
mysql > INSERT INTO [テーブル名] [フィールド名] VALUES [値]

- 複数追加
insert into japan_holiday (name,year,month,day)
    values
     ('tokubetsu',2019,10,21),
     ('tokubetsu',2019,12,30),
     ('tokubetsu',2019,12,31),
     ('tokubetsu',2020,01,01),
     ('tokubetsu',2020,01,02),
     ('tokubetsu',2020,01,03),
     ('tokubetsu',2020,02,10)
;
```
### 更新
```
mysql > UPDATE [テーブル名] SET [フィールド名]=[値] [条件式]
```
- 条件式が無しだと、対象が全レコードになります。
- カンマ区切りで複数フィールド更新できます。

### 全レコード削除
```
mysql > DELETE FROM [テーブル名]
```
### 一部レコード削除
```
mysql > DELETE FROM [テーブル名] WHERE [条件式]
```
### 全データベースを対象とする
```
$ mysqldump -u [ユーザー名] -p -x --all-databases > [出力ファイル名]
```
### test_dbデータベースを対象とする
```
$ mysqldump -u [ユーザー名] -p -x test_db > [出力ファイル名];
```
### test_dbデータベースのusersテーブルのデータ内でidが５未満を対象とする
```
$ mysqldump -u [ユーザー名] -p -x test_db users --where="id < 5" > [出力ファイル名]
```
### restore
```
$ mysql -u[ユーザー名] -p new_db < [ダンプファイル名]
```
### SQL実行結果をファイルに出力
```
$ mysql -uroot -p -e "select * from users" test_db > /tmp/mysql.txt
```
【Rails5】API開発をする時に検討したGem一覧

2019/7/26時点

# API作成用Gem

| Gem | Star数 | 利用数 | 最終更新日 | コメント |
|:--|--:|--:|--:|:--|
| [grape](https://github.com/ruby-grape/grape) | 8,882 | 6,247 | 26 Jul 2019 |grapeで作成したrouteはrake routesには反映されない
| [AMS（active_model_serializers）](https://github.com/rails-api/active_model_serializers) | 4,852 | 32,291 | 28 Aug 2018 |
| [fast_jsonapi](https://github.com/Netflix/fast_jsonapi) | 4,426 | 1,512 | 12 Jun 2019 |AMSより速いと主張|

# JSONレンダリング用Gem

| Gem | Star数 | 利用数 | 最終更新日 | コメント |
|:--|--:|--:|--:|:--|
| [jbuilder](https://github.com/rails/jbuilder) | 3,619 | 887,286 | 15 May 2019 |Railsデフォルトだが[遅いと評判](https://www.reddit.com/r/rails/comments/897x9m/do_you_guys_use_jbuilder_why_why_not/dwpk9fa/)
| [rabl](https://github.com/nesquena/rabl) | 3,583 | 7,651 | 13 Jul 2019 |
| [jb](https://github.com/amatsuda/jb) | 871 | 251 | 1 Apr 2019 |
Hierarchy上のオブジェクトの名前を一括変換するやつ



![tool.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310991/6d34fbc4-a02f-a17d-4136-e92fc28b9809.png)








```HierarchyRenamer.cs

using UnityEngine;
using UnityEditor;
using System.Text.RegularExpressions;
using System.Linq;

public class HierarchyRenamer : EditorWindow
{

    [SerializeField]
    string pattern = "\\((\\d+)\\)"; // Regexパターン (半角数字)の()の部分だけを消す
    [SerializeField]
    string replacement = "$1"; // 置換文字列




    [SerializeField]
    string number = "31";


    // Hierarchy上で選択しているオブジェクトをリネームする
    void DoRename()
    {
        var gameObjects = Selection.gameObjects.Where(go => !AssetDatabase.IsMainAsset(go)).ToArray(); // リネーム対象のGameObject

        // Undoに登録
        Undo.RecordObjects(gameObjects, "Regex Rename");

        // 名前を変える
        foreach (var go in gameObjects)
        {
            go.name = Regex.Replace(go.name, this.pattern, this.replacement);
        }
    }
    //連番追加
    void AddNumber()
    {
        
         

        foreach (GameObject obj in Selection.gameObjects)
        {
            Undo.RegisterCompleteObjectUndo(obj, "Undo Add Number");

            int sibling = obj.transform.GetSiblingIndex();

            obj.name = string.Format("{0}{1}", obj.name + " (", (int.Parse(number) + sibling).ToString()+")");
        }
    }

    void OnGUI()
    {
        EditorGUILayout.LabelField("正規表現で名前変更と連番を追加がボタン押すだけでできます。");
        GUILayout.Space(2f);
        EditorGUILayout.LabelField("半角スペースと全角スペースを消す: \\s");
        GUILayout.Space(2f);
        EditorGUILayout.LabelField("(半角数字)の()の部分だけを消す: \\((\\d +)\\)");
        EditorGUILayout.LabelField("                        　　　　        $1");
        GUILayout.Space(2f);

        this.pattern = EditorGUILayout.TextField("Regex", this.pattern);
        this.replacement = EditorGUILayout.TextField("Replacement", this.replacement);


        // ボタンを表示
        if (GUILayout.Button("リネーム"))
        {
            this.DoRename();
        }



        this.number = EditorGUILayout.TextField("Start Number", this.number);
        

        EditorGUI.BeginDisabledGroup(Selection.gameObjects.Length == 0);

        // ボタンを表示
        if (GUILayout.Button("連番を追加"))
        {
            this.AddNumber();
        }

        EditorGUI.EndDisabledGroup();
    }

    [MenuItem("Tools/Hierarchy上のオブジェクト名を一括変更", false, 10000)]
    static void Open()
    {
        GetWindow<HierarchyRenamer>();
    }

}
```
作ってみたけど結局ez renameとかいうアセットでいいかも
Expo: Error: Cannot find module '../../tools/PackageManager'

#ReactNative: Error: Cannot find module '../../tools/PackageManager'

今日のこと。
Expoがアップグレードしたみたいで。
いつもどおりyarn startしたらExpoをアップデートしろ、と文句を言われて指示通りにしました。
そしてExpoのバージョンは3.0.4に。

再びyarn start
そうしたら上記のエラー。

###原因
expo-cliは'../../tools/PackageManager'を探そうとしてるが、実際のファイル名は最初の'P'が小文字になっている。
このように↓
`../../tools/packageManager`

コラー！:laughing:


###解決方法
`../../tools/packageManager`を`../../tools/PackageManager`とPを大文字にファイル名変更。

PackageManager.jsの場所はココです。↓
![Screenshot from 2019-07-26 14-35-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/59825beb-24a9-fb9b-b941-e7d8fd8771e6.png)


<br>
参考：[Expo(で作ったプロジェクト)が動かない "Error: Cannot find module '../../tools/PackageManager'"](https://qiita.com/masaki-shinkawa0303/items/9f4d4c727a28153e0477)

あ、当方ubuntu18.04環境です。
<br>
find と find_by と Fail Fast...と暗黙知

コードレビューしていて、以下のようなコードがありました。

```ruby
Model.find_by(id: params[:id])
```

おそらく、これを見た人は 「あー、このあと Model がない場合でも `nil` で処理したいんだろうな〜」と思ってコードを読んでいくと思います。

# `nil` を想定してない場合は `find`
`find_by` を使うケースって、 コードを読む(レビューする)側は「`nil` の場合は別で処理をしたい」みたいな意図があると思って読むと思っています。

なので、特に意図がないのであれば `find` にした方が読む側に不要な意図を伝えなくなるのでいいのかなと思います。

# Fail Fast
また、以下のようなコードがあったとき

```ruby
@model = Model.find_by(id: params[:id])
@model.do_something
```

`@model == nil` になる可能性があり、 エラーとして以下を吐きます。

```console
NoMethodError: undefined method `do_something' for nil:NilClass
```

`find_by` にすることによって `nil` になり、意図していない `NoMethodError` が発生する前に `find` で `ActiveRecord::RecordNotFound` を発生させた方がエラーの原因をはっきりさせることができます。

そして、最近聞いた話で Fail Fast ってまさにこれだな！と思いました。
https://en.wikipedia.org/wiki/Fail-fast

※ ちなみに... `find_by(name: params[:name')` とか `id` 以外でひきたいときは、 `find_by!` を使うのがいいと思います。

# プログラマーの暗黙知
ついでに...「 `find_by` してるってことは、あとの処理で `nil` でも動くようにした」みたいに、プログラマーってコードからいろんなことを読み取っていて、これってあまり言語化されていない暗黙知な気がします。

僕もまだまだ知らないことがあると思うし、無意識にやっていることも多いので、こういった部分を言語化していけるといいなと思います。
スクレイピング！！！Twitterのプロフィール画像を取ってこよう！！！

どうも!!!
初対面の人からはインドやタイのハーフと間違われるチャンクノです。
チャンクノというニックネームから韓国人と間違われることもあります。
なので「チャンさん!!!」と呼ばれることもあり、
節子それ名前ちゃう、ただの敬称や!!!てなことがまあまああります。
くのちゃんをひっくり返してチャンクノなんですね。

それでは本題に入ります。
初めに、このやり方には一つ注意点があります。
ajaxを使って表示させようとするとエラーが起きます。

```
Cross-Origin Read Blocking (CORB) blocked cross-origin response https://twitter.com/@aka with MIME type text/html. See https://www.chromestatus.com/feature/5629709824032768 for more details.
```
このようなエラーですね。
原因はChromeのCORBというものなのですが、これに関しては解決の仕方が分からないです😭
解決のやり方は出てくるのですが上手くいかず、、、。
私の理解力不足で書いてあることがよく分からずに試せていないものもあります。
なのでajaxを使わない人だけ使用することをおすすめします。
私は一旦諦めました、、、。

はい。
というわけで気を取り直してチャンクノ流のスクレイピングについて紹介します。(既出のやり方でしたらごめんなさい)
下記のコードは私が今個人で開発しているものの一部です。恥ずかしい🙈

```
**index.html.haml**

.registers
  - @registers.each do |register|
    .registers-list
      .registers-list__image
        - require 'mechanize'
        - agent = Mechanize.new
        - page = agent.get("https://twitter.com/#{register.account}")←ユーザー1人1人のページを取得
        - elements = page.search('.ProfileAvatar a)←個人ページの中にあるプロフィール画像のhtml要素を取得
        - elements.each do |ele|
          = image_tag ele.get_attribute('href')←aタグのhref要素を表示
```
こういう感じでそのままHTMLに突っ込むことができました。
ちなみにこのコードではtwitterのプロフィール画像を引っ張ってきてます。
DBには保存しないやり方です。
ぜひためしてみてください！！！

CORB問題の解決の仕方や、スクレイピングもっといいやり方あるよ！！！っていうかたはぜひ教えて欲しいです🙇‍♂️

それでは皆様のより良いプログラミングライフを祈って🙏🙏🙏
React Windows 環境構築備忘録（自分用）

reactの環境構築に手間取ったので備忘録を書いておこうと思う
#➀node.jsをインストール
#➁folderを作成
作成したフォルダーのアドレスバーにpowershellと入力（自分のPCの環境では右クリックでpowershellはでなかった。←自分が2週間ほど悩んだところ）
#➂コマンドを入力
これは悩まなかったので下記URLを参照（ていうかこれ見ればおけ）
[10 - ( React Js Tutorial ) Install React Using NPM]
(https://www.youtube.com/watch?v=YKBaqjOkXQY)
「npm start」まで入力したら
#➃フォルダー画面にもどる
また作成したフォルダーのアドレスバーにpowershellと入力（自分のPCの環境では右クリックでpowershellはでなかった。）
#➄出できたpowershell上にcode .と入力
画面がVSCODEでReactのローカル環境と同じひな型コードがうちこまれている。コードの文字を変更するとhttp://localhost:3000/
に反映される。
fishでanyenvを使う


参考
[anyenvを使う - Qiita](https://qiita.com/zaburo/items/8ac16133c3823c6e6ad6)

インストールしたの結構前なので、これからanyenvインストールする方はちゃんと公式見た方が良さそう。
https://github.com/anyenv/anyenv

brewは使わない。

```sh
git clone https://github.com/riywo/anyenv ~/.anyenv
```

リンクには書いてないけど次行く前にこれしろって言われる

```sh
anyenv install --init
```

~/.config/fish/config.fish

```sh
status --is-interactive; and source (anyenv init -|psub)
```

installできるものリスト

```sh
anyenv install -l
```

各**env環境をUpdateするためのプラグインをインストール

```sh
mkdir -p (anyenv root)/plugins
git clone https://github.com/znz/anyenv-update.git (anyenv root)/plugins/anyenv-update
```

```sh
anyenv update
```

## nodenv
参考
[ndenv / nodenv で Node.js をインストールする際、同時に Yarn もインストールする方法 - Qiita](https://qiita.com/pinemz/items/d758aede73e388c7b57a)

```sh
anyenv install nodenv
exec $SHELL -l
```

### yarnも
プラグインを入れる

```sh
git clone https://github.com/pine/nodenv-yarn-install.git (nodenv root)/plugins/nodenv-yarn-install
exec $SHELL -l
nodenv hooks install
```

インストールすればyarnも入る

```sh
# リスト確認
nodenv install -l
# install 安定板
nodenv install 10.15.3
```

バージョン指定

```
ndenv global v8.9.4
```

#### yarnがインストールされない場合

nodeのインストール時に注意されているはず。

```sh
> nodenv uninstall 12.7.0
.....
nodenv: default-packages file not found
```

default-packagesに記載したパッケージをデフォルトでインストールしてくれるため、yarnを加える

```sh
echo yarn >> (nodenv root)/default-packages
```

インストールしている場合は、一度アンインストールしてからインストールする

```
nodenv uninstall 12.7.0
nodenv install 12.7.0
```


## pyenv
```sh
anyenv install pyenv
exec $SHELL -l
```

```sh
pyenv install -l
pyenv install anaconda3-2019.03
pyenv versions
pyenv global anaconda3-2019.03
```

## goenv

```sh
anyenv install goenv
exec $SHELL -l
# インストール可能なリスト
goenv install -l
# バージョンは随時変更 https://golang.org/doc/devel/release.html#policy
goenv install 1.14.6
goenv global 1.14.6
```

## メモ
phpはphpenvじゃなくてphpbrew使う方が楽かも。
openshift に weave scope をインストールしたときの"No API token found"エラーの解決方法

openshift に weave scope をインストールしたときの"No API token found"エラーの解決方法
=======================================

あらまし
-------

1. openshift に weave scope をインストールしてみたが，動かなかった．
2. "No API token found" というエラーがでていた．
3. 最終的に，権限を設定するコマンドを修正したら動作した．

- 環境 2019/07/26 時点での情報
    - OpenShift: 3.1.1
    - weave scope: 1.11.3

1. ガイド通りにインストールしても，起動しない
-----------------------------------

[Installing Weave Scope / OpenShift](https://www.weave.works/docs/scope/latest/installing/#ose) の通りに実行しても，立ち上がらない．

   
```
$ oc login -u system:admin
```
    
```
$ oc new-project weave
$ oc adm policy add-cluster-role-to-user cluster-admin -z weave-scope
$ oc adm policy add-scc-to-user privileged -z weave-scope
$ oc adm policy add-scc-to-user anyuid -z default
```
```
$ oc apply -f 'https://cloud.weave.works/k8s/scope.yaml'
```

エラーなく終わるが，必要なpodが起動していない．．．




問題判別
-------

```
$ oc describe ds
...
Error creating: No API token found for service account "default", retry after the token is automatically created and added to the service account
```

どうやら，何かの権限が足りないらしい．




解決策
-------

試行錯誤の結果, ポリシー変更のコマンドの対象を `default`から `weave-scope` に変更してから `apply`したら，インストールに成功した．

```
$ oc adm policy add-scc-to-user anyuid -z weave-scope

$ oc apply -f 'https://cloud.weave.works/k8s/scope.yaml'
```
AWSで基盤お試し構築~RDS~

##### 前回の話
[AWSで基盤お試し構築~nginxで遊ぶ~](https://qiita.com/akhkyamada/private/dd2486330316a499ff9f)

# 前回までにやったこと
ネットワークつくってEC2立ててnginx入れて遊んだ。

## 今回目指すところ
**データベースを立てる**
AWSのサービスであるRDSを使って、サクッとDBを立ててみる。

## 準備
AWSマネジメントコンソールからRDSのページを開く。
東京リージョンで。

## RDSでmysqlしてみる
日本語変だけど、もう疲れたから許して。

準備が終わった段階で、こんな画面が見えているはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322955/075be1ee-dd30-9b8a-ad94-f7404c7ab7c3.png)

左ペインの「データベース」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322955/78dbbedf-c31d-b3d0-7202-30d9dfaa44fd.png)

右上の「データベースの作成」を押下すると、「エンジンの選択」画面が出る。
→MySQLを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322955/27284ea1-eec6-bc3e-c04f-e24a21c4b779.png)

★注意
今回は無料枠で試したいので、
**RDS 無料利用枠の対象オプションのみを有効化**に必ずチェックを入れておく

「DB詳細の指定」画面が出てくるはず。インスタンス周りは今回はデフォルトでOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322955/a85a47c0-4042-5ccf-45c5-4e2f3c3e2a31.png)

下にスクロールすると「設定」があるので、すべて入力。終わったら「次へ」。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322955/ec26a5ea-07dc-834d-5f24-b8d4d477c5cd.png)

VPCは自分で作成したやつを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322955/c435a87c-1d89-d56f-cd42-7442d602a19a.png)

データベースの名前を適当に決めて、あとはデフォルトでOK(今回は)。
終わったら一番下の「データベースの作成」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322955/5a7bfa65-11d0-ca71-e13f-c20e0589e13d.png)

うまくいったらこんな画面が出るはず。
ダメだったらうまいこと対応してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322955/d3b33d3a-b86d-e7a4-025c-690e8166b838.png)

しばらくするとステータスが"利用可能"になるはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322955/ef721a72-8758-9966-420d-5bf12330a6ee.png)

## 今回やったこと
- RDSを利用してMySQL立てた。

###### pythonの環境整えとけと言われたので次へ。もうこれで最後。
[EC2 python3 install & alias](https://qiita.com/akhkyamada/private/513aa19c23563cbea573)
【CSS3アニメ】画像不使用で「いいねボタン」を再現！

#概要
確かひと昔前のTwitterの「いいねボタン」はアニメーションで表現されていた。
（今では単純な切り替わりのみ。）

そのひと昔前のアニメーションを、CSSで再現したのがこちら。
背景スプライト画像を用いたアニメーションは、webクリエイターボックスさんが作成済みでした。
https://www.webcreatorbox.com/tech/css-sprite-steps

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="css,result" data-user="tezucurry" data-slug-hash="LwRzJz" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="LwRzJz">
  <span>See the Pen <a href="https://codepen.io/tezucurry/pen/LwRzJz/">
  LwRzJz</a> by 𝕋𝔼ℤ𝕌カレー | ベンガル料理勉強 (<a href="https://codepen.io/tezucurry">@tezucurry</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

ハートマークがしょっぱいので、webフォントやSVGの方がよさそう。

以上！平定！！
GASを用いてGoogleフォームのプルダウン内容をスプレッドシートから動的に生成する

スプレッドシートを更新すると、Googleフォームのプルダウンも更新されてほしいということがあったので、Google Apps Script(GAS)を使って連携させてみました。

## 実現したいこととやること
### 実現したいこと
1. スプレッドシートの内容とGoogleフォームのプルダウンの内容を同期させたい
- スプレッドシートを更新したら、自動的にGoogleフォームのプルダウンの項目が更新されていてほしい

### やること
1. Googleフォームの作成
- スプレッドシートの作成、プルダウンの中身の準備
- GASソースの準備
- トリガーの設定

#### Googleフォームの作成
とりあえず新規でGoogleフォームを起こし、1番目の質問項目をプルダウンに設定します。プルダウンのタイトルや中身は特に気にする必要はありません、デフォルトでOKです。
編集画面のURLからフォームIDをコピーしておきます。

#### スプレッドシートの作成、プルダウンの中身の準備
新規でスプレッドシートを起こし、A列に10個くらい適当に適当な値を入れます。文字でも数字でもなんでもOK。
スプレッドシートのURLから、シートIDをコピーしておきます。

#### GASソースの準備(サンプルソース)
Googleフォームの編集画面からスクリプトエディタを起動、ソース入力します。form_idとsheet_idは前項、前々項でコピーしたIDを入れればOKです。
この関数を実行すればGoogleフォームのプルダウンの中身が、スプレッドシートのA列に記載したものとなります。が、これだとスプレッドシートを更新したら、フォームも更新されるとは言えません。

```js
function change_pulldown_list(){
  //フォームIDからGoogleフォームを開き、質問事項を配列へ格納する
  var form_id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
  var form = FormApp.openById(form_id);
  var items = form.getItems();
  var item = items[0];
  //items[0]が1番目の質問事項アイテム、items[1]が2番目の質問事項アイテムといった具合

  //シートIDからスプレッドシートを開き、最終行を取得する
  var sheet_id = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy";
  var ss = SpreadsheetApp.openById(sheet_id);
  var sheet = ss.getSheetByName("シート1");
  var last_row = sheet.getLastRow();

  //スプレッドシートの先頭行から最終行までデータを読み込み、question_list配列に入れる
  //今回はA列の先頭から読み取るため、getRangeの中身は深く考えていません
  var question_list = sheet.getRange(1,1,last_row,1).getValues();

  //question_list配列の中身をitem(=items[0]=1番目の質問事項アイテム)に反映させる
  item.asListItem().setChoiceValues(question_list);
}
```

#### トリガーの設定
泥臭いやり方ですが、作成したスクリプトに対し時間主導型のトリガーを設定することで、疑似的にスプレッドシートとGoogleフォームの同期を行うことができます。新規トリガーを1分おきで設定すれば、実質的・疑似的にほぼ自動同期できているとみなせるかと思います。

この状態でスプレッドシートのA列を更新すると、1分程度でフォームのプルダウンの中身も自動で更新されます。
複数のxcodeを入れたあとにpod installできない


## pod install errorが発生。

```
$ pod install
-> Installing glog (0.3.5)

 /Applications/Xcode 10.2.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk
   checking whether the C compiler works... no
   configure: error: in `/Users/user2/Library/Caches/CocoaPods/Pods/External/glog/2263bd123499e5b93b5efe24871be317-aefd1':
   configure: error: C compiler cannot create executables
   See `config.log' for more details
[!] /bin/bash -c
set -e
#!/bin/bash
# Copyright (c) Facebook, Inc. and its affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
```

## 背景
- xcode 10.3が自動インストールされた。
- それにより、iphone emulatorたちが消えた。復活のために10.2をインストール。
- どうやらxcodeは複数インストールできるらしいので、複数xcodeをインストールしている状態に。
- さぁios開発しよ → **エラー！！**

## 関連するのissueを発見

以下のコマンドでトラブル解消しているコメント多数。

```bash
sudo xcode-select --switch /Applications/Xcode.app
```

僕は複数インストールしたXcodeの名前を、 `XCode`(10.3)と `XCode 10.2`(10.2)としていました。
コマンドを叩いてもスペースを認識しないのか `sudo xcode-select --switch /Applications/Xcode 10.2.app`実行できませんでした。
この名前があかんのではないかとして、10.3を削除し、`XCode 10.2` -> `Xcode`とし、再度コマンド実行。

その後、 `pod install`を実行したところ、成功しました。


https://github.com/facebook/react-native/issues/18408

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103475/4d03b2a3-8a1f-af3d-274c-59376586c2bc.png)
SPAでQRコードを生成する。

# 概要

「QRコードが欲しいなぁ…」って時ありますよね？

ネットで調べると、テキスト入力してー、サイズ入力してー、
作成ボタンポチーで、QRコードドーン、広告ワサワサー
みたいなサイトが色々引っ掛かりますよね。（偏見）

そこで、SPAでリアルタイムにQRコードが書き換わったら面白いかな、
と思って作ってみました。

# 作ったもの

[Realtime QR Code Generator](https://realtime-qrcode-generator.now.sh/)
![GIF.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365084/801f4820-b2e5-8618-e7a2-910822cd0558.gif)

# 使った技術

* React
* TypeScript
* Material-UI
* NOW
* [Google Chart API](https://developers.google.com/chart/infographics/docs/qr_codes)

# コード
[ここ](https://github.com/obuchi3/realtime-qrcode-generator)に置いています。
ざっくりポイントだけ抜粋します。

## Material-UIでCSS-in-JS

CSSクラスを`makeStyles`、`createStyles`で定義することができます。
これによりCSSファイルが不要になります。

```typescript
import { makeStyles, createStyles } from '@material-ui/styles';

const useStyles = makeStyles(() =>
  createStyles({
    app: {
      display: 'flex',
      flexWrap: 'wrap'
    },
    appBar: {
      marginBottom: '10px'
    }
  })
);

const App: React.FC = () => {
  const classes = useStyles();

  return (
    <div className={classes.app}>
      <AppBar position={'static'} color={'default'} className={classes.appBar}>
        <Toolbar>
          <Typography variant={'h6'} color={'inherit'}>
            Realtime QR Code Generator
          </Typography>
        </Toolbar>
      </AppBar>
    </div>
  );
};

export default App;
```

# QRコードの仕様

* [Google Chart API](https://developers.google.com/chart/infographics/docs/qr_codes)の仕様に準拠します。

# まとめ

* リアルタイムで動くQRコードは作れた。
* 1時間くらいで作ったので、バリデーションなどは未実装です…。
ReactNative WebViewのCookieをクリアする簡単な方法

WebViewのCookieを操作するには、例えば https://github.com/joeferraro/react-native-cookies などが使えます。

が、linkだとかなんとか面倒くさい。
*全消したいだけやねんけど。*

そんなときに、かなり簡単な方法があるようです。

```typescript
import { NativeModules } from 'react-native';

NativeModules.Networking.clearCookies(() => { });
```

`clearCookies` の引数（コールバック）は必ず書かないとクラッシュするようです。

参考: [react-nativeでWebView内のCookieをjsのコードのみで削除するには的なお話
](http://watanabeyu.blogspot.com/2018/06/react-nativewebviewcookiejs.html)
【Rails】REST APIを書く時のサンプル

# 動作検証環境
- Rails 5.2.3
 
# namespace + version を付ける。
- `app/controllers/api4ext/v1` 等。
  
# `base_controller.rb` を作る。
- `ActionController::API` を継承する。

```ruby:app/controllers/api4ext/v1/base_controller.rb

class Api4ext::BaseController < ActionController::API
  rescue_from Exception, with: :error_500
  rescue_from ActiveRecord::RecordNotFound, with: :error_404

  before_action :authenticate

  def authenticate

  end

  def error_500(e)
    logger.error("#{e.message}\n#{params.to_unsafe_h}\n#{e.backtrace.join("\n")}")
    # NOTE: Send an exception here to an external service as follows if needed.
    # Raygun.track_exception(e, custom_data: {params: params.to_unsafe_h})
    render json: {}, status: :internal_server_error
  end

  def error_404
    render json: {}, status: :not_found
  end
end
```

# resource 単位で controller を分ける。

```ruby:app/controllers/api4ext/v1/accounts_controller.rb

module Api4ext
  module V1
    class AccountsController < Api4ext::BaseController
      def show

      end

      def create

      end
    end
  end
end
```

# routing

```ruby:config/routes.rb

  namespace :api4ext do
    namespace :v1 do
      resources :accounts, only: [:show, :create]
    end
  end
```
JuliaでAtCoderのpractice contestをやってみた（３）

# 前回まで

https://qiita.com/dannchu/items/053b69d23b8887c0130e

https://qiita.com/dannchu/items/4cdce0c86f081ce1123a


`Julia`言語の練習をしています。`AtCoder`のbeginnerあたりならば手頃なのかなと思って，やってみました。

practice contestのB - Interactive Sortingの続きです。

# practice contest

## B - Interactive Sorting

<img width="1177" alt="スクリーンショット 2019-07-26 12.52.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426542/d21e0610-a545-5a00-2905-be4c847c26a1.png">

問題はインタラクティブ（どちらが大きいか質問しながら）に文字をソートします。

要素の個数$N$と質問回数$Q$に制限があります。

(1) $N=26$，$Q=1000$
(2) $N=26$，$Q=100$
(3) $N=5$，$Q=7$

(1)は前回解決したので，(2)です。前回のソートの考え方では終わらないので，別なソート方法で考えなくてはなりません。

自分で考えても良かったのですが，ソート方法を色々調べてみることにしました。

＜参考サイト＞

https://qiita.com/drken/items/44c60118ab3703f7727f

このサイトを見て，ソートについてよくわかりました。
前回(1)で行ったソートは`挿入ソート`と呼ばれていて，$O(n^2)$のオーダーということもわかりました。

そして，このオーダーを$O(n\log n)$とできるマージソートが紹介されていたので，これでやってみようと思いました。

## マージソート

今回，$O(n\log n)$のオーダーでソートできるとすると，$n=26$なので，
$$26\log 26=84.7105...<100$$
なので，(2)$N=26$，$Q=100$をクリアできそうです。

＜参考サイト＞

http://szmlb.hatenablog.com/entry/2018/03/18/001156

`Juila`で書いたマージソートがあったので，利用させてもらいました。

```Julia:B-InteractiveSorting2
nq=readline()
nq1=split(nq)
n=parse(Int,nq1[1])
q=parse(Int,nq1[2])
X=Any[]
for i=0:n-1
    X= push!(X , "$('A'+i)")
end

#
# Merge Sort
#

function mergeSort(A)

  Anew = copy(A)
  mergesort_array(Anew,  A,  1,  length(A)+1)

end

function mergesort_array(A, result, left, right)

  if right - left < 2 # Aが１個しかなかったら，そのまま返せ。
    return
  end
  if right - left == 2　# Aが２個だったら，大小を比較して返せ。
        println("? ",result[left]," ",result[left+1])
    if readline()==">\n"
      result[left],  result[left+1] = result[left+1], result[left]
    end
    return
  end

  mid = Int(round((right + left) / 2))
  mergesort_array(result, A, left,  mid)
  mergesort_array(result, A, mid, right)

  i = left
  j = mid
  idx = left
  while idx < right
    if j >= right|| (i < mid && (println("? ",A[i]," ",A[j]) ;readline()=="<\n"))
      result[idx] = A[i]
      i = i + 1
    else
      result[idx] = A[j]
      j = j + 1
    end
    idx = idx + 1
  end

end

function main()
mergeSort(X)

z="! "
for i=1:n
    z*=X[i]
end
println(z)
end
main()
```


悩んだところは

`(println("? ",A[i]," ",A[j]) ;readline()=="<\n")`

です。毎回，同じようなところで悩みます。


(2) $N=26$，$Q=100$も無事クリア！残るは(3) $N=5$，$Q=7$のみです。（続く）
ActiveRecord の関連をどんどんたどっていく

こんな感じの Model があるとする。

```ruby
class Company < ApplicationRecord
  has_many :users
end

class User < ApplicationRecord
  has_many :posts
end

class Post < ApplicationRecord
  has_many :comments
end

class Comment < ApplicationRecord
end
```

# Company が持っている Post をすべて取得
```ruby
class Company < ApplicationRecord
  has_many :users
  has_many :posts, through: :users
end
```

ってしてやると、以下でまとめて取得できる。

```ruby
# Company が持っている Post をすべて取得
Company.first.posts
```

# Company が持っている Comment をすべて取得
```ruby
class Company < ApplicationRecord
  has_many :users
  has_many :posts, through: :users
  has_many :comments, through: :posts
end
```

ってしてやると、以下でまとめて取得できる。

```ruby
# Company が持っている Comment をすべて取得
Company.first.comments
```

ApplicationRecord って本当になんでもいい感じでやってくれる！
php-master-changes 2019-07-25

今日は一部オペコードハンドラの実装修正、\_get_zval_ptr_deref() に ZEND_ATTRIBUTE_UNUSED を付ける修正、ビルドシステムの不要コード削除、PHP_JSON_VERSION に PHP_VERSION をそのまま使うようにする修正、通常ファイルの fread() / fwrite() 等のストリームの読み書きが失敗時に Notice を吐くようにする修正、コンパイラの警告潰し、ドキュメントの更新があった！

# 2019-07-25
## dstogov: Delay dereference
- https://github.com/php/php-src/commit/22e7ee3bb3ada369112f7ba6cf552ec9882e466b
- [7.4~]
- ZEND_SEND_ARRAY のオペコードハンドラ実装で、op2 のデリファレンスを遅延させるよう修正

## dstogov: Reordering
- https://github.com/php/php-src/commit/d7e8abb4aac506c1c64b5fbebf38e71053af2601
- [7.4~]
- ZEND_SEND_USER のオペコードハンドラ実装で、op2 の ARG_MUST_BE_SENT_BY_REF() のチェックを先に行うよう修正

## dstogov: Avoid over-specialization
- https://github.com/php/php-src/commit/853b426ecf1f0b631cf085ee313632811ddd6d24
- [7.4~]
- ZEND_COUNT と ZEND_GET_CLASS のオペコードハンドラ実装で、TMP|VAR でなく TMPVAR で特化ハンドラを指定するよう修正

## nikic: Mark \_get_zval_ptr_deref as unused
- https://github.com/php/php-src/commit/99d4b2bddc4cd42456e03d91d0454726767e35bd
- [7.4~]
- \_get_zval_ptr_deref() を ZEND_ATTRIBUTE_UNUSED でマーク

## petk: Remove outdated Libtool hack for macs
- https://github.com/php/php-src/commit/793dfa91bb6317dcf4aee7a59ef5ffa0d621abdd
- [7.4~]
- ビルドシステムで、古い Mac の autoconf 2.13 での問題を避けるためのハックを削除

## petk: Remove AC_FPM_POLL
- https://github.com/php/php-src/commit/a3169964c0d5b5fc3e25c5d912cd7f8af75fcd22
- [7.4~]
- sapi/fpm で、不要なマクロ AC_FPM_POLL の削除

## petk: Bump PHP_JSON_VERSION to PHP_VERSION
- https://github.com/php/php-src/commit/dee243d475b088189862d30755aac7bb9cdd61b3
- [7.4~]
- ext/json で、PHP_JSON_VERSION に PHP_VERSION をそのまま使うよう修正

## nikic: Throw notice for plain wrapper fread/fwrite errors
- https://github.com/php/php-src/commit/1cbcf0f4f1e9a14b3fc76f6d3e53b567a9464fd4
- [7.4~]
- 通常ファイルの fread() / fwrite() 等のストリームの読み書きが失敗時に Notice を吐くよう修正
- このへん入ることで盛大にこけるようになるテスト世の中にありそうな気はする（よいことなのだけど）、まあ 7.4 どうせ他にも色々ありそうだしな、みたいなのもあるけど

## remicollet: Fix build warnings
- https://github.com/php/php-src/commit/946a1e43149e95969caf721b2fbc1bbffc3c478c
- [7.4~]
- strncpy() を memcpy() にしてのコンパイラの警告潰し

## mbeccati: Addded missing NEWS/UPGRADING entries for PDO "??" escape
- https://github.com/php/php-src/commit/5d3d2b9827465ad44582e0f40fe883db37ba6df3
- [7.4~]
- NEWS、UPGRADING へ [PDO の "??"](https://qiita.com/sj-i/items/1ceec407dc374f950771#mbeccati-fix-fr-71885-allow-escaping-question-mark-placeholders) について追記
JuliaでAtCoderのpractice contestをやってみた（２）

# 前回まで

https://qiita.com/dannchu/items/053b69d23b8887c0130e

`Julia`言語の練習をしています。`AtCoder`のbeginnerあたりならば手頃なのかなと思って，やってみました。

practice contestのA - Welcome to AtCoderに続いて，B - Interactive Sortingです。

# practice contest

## B - Interactive Sorting

早速問題です。

何やら赤字で『初心者向けではない』と書いてあります。最初はあまり気に留めずはじめました。

<img width="1177" alt="スクリーンショット 2019-07-26 12.52.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426542/d21e0610-a545-5a00-2905-be4c847c26a1.png">

問題はインタラクティブ（どちらが大きいか質問しながら）に文字をソートします。

要素の個数$N$と質問回数$Q$に制限があります。

(1) $N=26$，$Q=1000$
(2) $N=26$，$Q=100$
(3) $N=5$，$Q=7$

それぞれ100点，合計300点満点です。

『何が違うのかな？』と思いながら，スタートです。

## 挿入ソート

『挿入ソート』という呼び名は確認しました。手順は次の通りです。

1. まず，は１番目（左端）と２番目（その右隣）を比較し，１番目の方が大きければ，１番目と２番目の要素を入れ替えます。
2. 次に２番目と３番目を比較し，大きい方を右側来るようにします。
3. 順次同様に繰り返し，$N-1$番目と$N$番目まで行います。すると，$N$番目に一番大きい数が来ることになります。
4. 再び，１番目と2番目から同じ操作を再び行うと，$N-1$番目に２番目に大きな数がきます。
5. このように繰り返していくと，ソートが完了します。

今回のソートでは

- 最初のターンは$N-1$回の質問です。
- ２番目のターンは$N-2$回の質問です。
- 一般に$k$番目のターンは$N-k$回の質問で$1\leqq k\leqq N-1$です。

質問の回数は

$$Q=\sum_{k=1}^{N-1}(N-k)=N(N-1)-\frac{N(N-1)}2=\frac{N(N-1)}2$$

となります。$N=26$のとき，$Q=26\times25/2=325$なので，(2)はだめだけど，(1)は行けそうです。

問題のサンプル解答（`Julia`はやはりありません。。。）もこの方針のようで，この解答だと300点満点中100点だと書いてあります。

## コード

さて，コードです。


```Julia:B-InteractiveSorting
nq=readline()
nq1=split(nq)
n=parse(Int,nq1[1])
q=parse(Int,nq1[2])
x=Any[]
for i=0:n-1
    x= push!(x , "$('A'+i)")
end
for j=1:n-1
    for i=1:n-j
        println("? ",x[i]," ",x[i+1])
        if readline()==">\n"
            x[i],x[i+1]=x[i+1],x[i]
        else 
        end
    end
end
z="! "
for i=1:n
    z*=x[i]
end
println(z)
```

考えたことは
- アルファベット２６文字の要素をどう用意するか？（上のコードのようにしました。）
- 要素を入れ替える時どうすればいいのか？　何か`swap`みたいな関数があるのかな？と思っていましたが，単純に`x[i],x[i+1]=x[i+1],x[i]`と書けば良いことがわかりました。

悩んだことは`readline()==">\n"`のところです。`Jupyter Notebook`の`Julia1.1.1`では`readline()==">"`で良かったのですが，そのまま，`AtCoder`の`Julia0.5.0`では合格となりませんでした。悩むのはこんなところばっかりです。

でもなんとか(1) $N=26$，$Q=1000$はクリアで，
100点/300点は取れました。（続く）
margin:autoが反映されない時の対処法

# margin:autoが反映されない時の対処法

初めまして。~~[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている~~（2020年1月退社）maec_lamarです。
今回から週に１回のペースでプログラミングについて学んだことを書いていきたいと思いますので、よろしくお願いします。
なお、プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

初回は、CSSで`margin:auto`を使っているのに要素の中央揃えができないという時、どのように対処すれば良いかについて僕なりに説明したいと思います。


## margin:autoが効かない原因と対処法

`margin`とは、要素の周りに指定した幅の余白を作るように要素のサイズを変える、CSSのプロパティです。
そして、値`auto`を使って`margin:auto`とすると、要素が親要素内の中央に来るように要素を移動させることができます。
しかし、その`margin:auto`が反映されないということが起きます。
その原因として、次のようなことが挙げられます。

### 原因１：テキストの中央揃えに使っている
```html:test.html
<p>Qiita</p>
```
```css:test.css
p {margin:auto;}
```
`margin:auto`は要素の中央揃えに使うので、上のようにしてテキストの中央揃えには使えません。
テキストの中央揃えには、下のようにプロパティ`text-align:center`を使います。

```html:test.html
<p>Qiita</p>
```
```css:test.css
p {text-align:center;}
```

### 原因２：要素が親要素と同じ大きさである

```html:test.html
<ul>
    <li>Qiita</li>
    <li>maec_lamar</li>
</ul>
```
```css:test.css
ul{margin:auto;}
```
上のように、そのまま`margin:auto`を用いても、リストを中央に持っていくことはできません。
一度、`border`プロパティなどを用いて要素を可視化してみましょう（Chromeをお使いの方は検証ツールを使うのも手です）。
すると、リスト要素の横幅がすでに画面一杯に広がっているので、要素の動かしようがありません。
この時は、下のように、まずリスト要素の大きさを、`width`を用いてリストの大きさに合わせた上で`margin:auto`を使えばリストを中央に持ってくることができます。

```css:test.css
ul{
    width:100px;
    margin:auto;
  }
```

## まとめ

今回は、`margin:auto`が使えない時の対処法について説明しました。
まずは`margin:auto`と`text-align:center`の違いを理解することが大切です。
また、`margin`が反映されない時、一度`border`などを用いて要素を視覚化すると、原因が分かるようになることがあります。
CSSで中央揃えができないという方は参考にしてみてはいかがでしょうか。
nginxを使ってアクセスログを追ってみた

# やりたいこと
* ある検索項目（URLのパラメータ）がどのくらい使われているのか調べたい

# やったこと
## nginxのアクセスログの置き場所を確認  

```bash
$ cat /etc/nginx/nginx.conf

access_log  /var/log/nginx/access.log  main; # ここにある
```


## 特定の文字列が含まれている行数を出力してみる

```bash
# とりあえずログが存在するか確認
$ tail -f /var/log/nginx/access.log
#ログが流れてくればok


# 特定の文字が含まれている行数を出力
$ cat /var/log/nginx/access.log | grep {検索したい文字列} | wc -l
934
```

### コマンド解説
#### wc -l
`wc`コマンドは、指定されたファイル内の行数、単語数、バイト数をカウントできる  

##### オプション
* `-c`バイト数のみを集計して表示  
* `-w`単語数のみを集計して表示  
* `-c`行数のみを集計して表示  
* `file`集計するファイルを指定する  

## 複数のアクセスログファイルを含めて行数を出力
```bash
# 数日前のアクセスログは圧縮されているため解凍する
$ gunzip /var/log/nginx/20190720.gz

# 行数の出力
$ find /var/log/nginx/ -type f -name "access.log-2019*" | xargs sudo grep jobTypes | wc -l
7388

# 解凍したファイルを圧縮し直しておく
$ gzip /var/log/nginx/20190720.gz
```

### コマンド解説
#### xargs
`xargs`コマンドは、標準入力やファイルを引数として、別のコマンドを実行することができる
VBA簡易スクリプト作成時のテンプレート

自分用メモなので記載が少ないのは悪しからず



```vb
Public Sub Exec()
    Call DoInitialize
    Call DoExecute
    Call DoFinalize
End Sub

'メイン処理
Private Sub DoExecute()
End Sub

' 初期処理
Private Sub DoInitialize()
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Application.Calculation = xlCalculationManual
    Application.StatusBar = ""
End Sub

' 終了処理
Private Sub DoFinalize()
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    Application.Calculation = xlCalculationAutomatic
    Application.StatusBar = ""
End Sub

```
Linuxコマンドについて

Linuxの便利なコマンドについて、特に覚えておくべきものを簡略化して書き連ねていきます。


# $ ls -a
- ファイル名の先頭にピリオドがあるファイルも表示
- このようなファイルには、Linuxシステムと結びつき簡単に編集されたくないファイルが多い


# $ls -l
- ファイルの詳細も表示
- "-a"と合わせて-laで使用されることもある


# $ ls -1
- リストを縦に並べられる

# $ls -lr
- リストを反対の順で表示

# $ls -tl
- 更新時間順にファイルを表示
- 新しいファイルから

# $ls  -lS
- サイズ順にファイルを表示
- 重いファイルから

# $ls -Xl
- 拡張子順にファイルを表示

# $ls -Rl
- ディレクトリの内容を再帰的に表示
- サブディレクトリの中身も表示

# $ls --full-time
- タイムスタンプの詳細を表示

# $ls -m
- ファイル名をカンマで区切って表示
- ファイル一覧をCSVとして吐き出したい時に使用

# $ls -lh
- ファイルサイズの単位を読みやすくするため、大きな数字を単位で表示
- 例：4000 → 4.0K

# $ls -lk
- ファイルサイズを全てキロバイトで表示
- 例：20 → 0.02K

# $ls -li
- ファイル名の左にi-node番号を表示

# $ls -lF
- ディレクトリ名の後に / を、実行可能なファイル名の後に * を付加

# $ls --help
- ヘルプを表示して助けてくれる
Onsen UIの<ons-icon>が表示されなくなったと思ったらアップデートが原因だった

## Onsen UIでiconが表示されなくなった
7/26, 12時時点で確認

## 調べた結果
Onsen UIが7/26にアップデートされたばかりだったようで、

本家Playgroundでもons-iconが表示できてない様子。

https://onsen.io/v2/api/js/ons-icon.html

## 対処
CDNで読み込むのではなく、安定版をダウンロードして読み込んで使うことにした。
【Go/Gin】フォームから受け取ったCSVファイルをパースする

Go言語の案件で、フォームからCSVファイルを受け取ってインポートする対応があり、その際に実装した内容のメモ

# ソースコード

```go
func CsvImportPostHandler(context *gin.Context) {
    // CSVファイル取得(csvfile=フォームのname属性の値)
    file, header , err := context.Request.FormFile("csvfile")

    // ファイル名
    fmt.Println(header.Filename)

    // ファイル読み取り
    reader := csv.NewReader(file)
    reader.LazyQuotes = true // ダブルクオートを厳密にチェックしない

    // レコード読み取り
    var line []string
    for {
        // 行毎のデータ取得してlineに格納
        line, err = reader.Read()
        if err != nil {
            break
        }

        // データ表示
        for _, s := range line {
            fmt.Println(s)
        }        
    }
}
```

# 参考サイト
- [csv - The Go Programming Language](https://golang.org/pkg/encoding/csv/)
- [go - retrieving posted files using Golang Gin - Stack Overflow](https://stackoverflow.com/questions/31792640/retrieving-posted-files-using-golang-gin)
- [Goでmultipart/form-dataをparseする - Qiita](https://qiita.com/r9y9/items/35a1cf139332a3072fc8)