OmniAICreator/Qiita-1.07M huggingface dataset:
度分秒→十進経緯度、日本測地系→世界測地系のそれぞれの座標変換

地図で使われる座標として緯度経度があります。
たとえば東京駅の場所はこのような緯度経度になります。

**東経139度46分13.6秒 北緯35度40分39.2秒**（DMS形式）

この座標表記は、**DMS (Degree Minute Second) 表記**と言われる、緯度経度を「度分秒（60進数）」を使って表したものです。
GIS の世界では一般的に**DEG (Degree) 表記**と言われる、緯度経度を10進数の度のみを使って表す「十進経緯度（十進度）」を使用します。

まずは度分秒を十進経緯度に変換していこうと思います。

##DMS表記からDEG表記への変換
北緯35度40分39.2秒をDEG表記に変換する場合

```
度 + （分÷60） + （秒÷60÷60）
＝35 + 40/60 + 39.2/60/60
＝35.67755556
```

東経139度46分13.6秒をDEG表記に変換する場合

```
度 + （分÷60） + （秒÷60÷60）
＝139 + 46/60 + 13.6/60/60
＝139.7704444
```

という計算式になります。

##測地系変換
現在日本で使用されている地図の多く（Google Maps、Yahoo! Mapなど）は、経緯度情報は世界測地系によるものとなっています。 
しかし、一部では日本測地系が用いられています。

そこで日本測地系から世界測地系への変換してみようと思います。
参照：[日本測地系と世界測地系の変換式](http://tancro.e-central.tv/grandmaster/excel/tky2wgs.html)

- 日本測地系 経度：jx、日本測地系 緯度：jy
- 世界測地系 経度：wx、世界測地系 緯度：wy

とします。

日本測地系から世界測地系への変換式は

```
wx = jx - jy * 0.000046038 - jx * 0.000083043 + 0.010040
wy = jy - jy * 0.00010695 + jx * 0.000017464 + 0.0046017
```
という計算式になります。

例えば、日本測地系の経緯度を

- jx：139.7704444
- jy：35.67755556

とすると、上記計算式に当てはめると世界測地系 経緯度は以下になります。

```
wx = 139.767235
wy = 35.68078249
```

これで日本測地系から世界測地系への変換完了です。

##Google mapで見てみよう
変換できた世界測地系の経緯度をGoogle mapで見てみると...

https://www.google.co.jp/maps?q=35.68078249,139.767235

東京駅が表示されました！パチパチパチパチ～:clap_tone1:
非エンジニアの担当者がKARTEを使ってサイトコンテンツを変更してみた

今回は非エンジニアの文系出身者がWebサイトのサイトコンテンツを変更する方法について解説します。
なお、今回の施策に関しては、<a href="https://karte.io/">web接客ツールKARTE</a>を導入している前提での話になります。

#コンテンツの変更方法について
##接客サービスの項目から作成、ユーザーに「見せる」を選択

<img width="721" alt="スクリーンショット 2020-01-22 10.20.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111504/22f3201c-5f43-9320-d755-5265866d1b4b.png">

##アクションを追加（旧テンプレートから選択する）で「埋め込み・HTMLを変更・挿入する」を選択

<img width="1237" alt="スクリーンショット 2020-01-22 10.24.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111504/2afe15d4-c653-027e-42f7-e1fb0a46fb43.png">

##先ほど選択した項目が接客サービスに追加されますので「編集ボタン」を押して接客内容を変更

<img width="1003" alt="スクリーンショット 2020-01-22 10.29.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111504/ffcbe293-0335-425d-872d-0b53e88980d9.png">

##変更したいコンテンツのHTMLを取得
今回は来店予約のボタンをサイト上部にも表示してみたいと思います。
変更したいコンテンツを決めて、HTMLをコピーし、KARTEの「変更HTML」にペイストする。
※もともと設定されているstyle（CSS）の影響を受けて、スタイルが崩れてしまう場合は直接ソースコードにstyleの記述を追加して微調整してください。
今回も少しstyleが崩れてしまったので、ボタンの位置を微調整しました。
` <div style="bottom: 0px;margin-bottom: 0px;" class="btnBox">`


<img width="1843" alt="スクリーンショット 2020-01-22 11.06.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111504/e5146d23-719c-79d7-eace-62f2eea5e732.png">

<img width="302" alt="スクリーンショット 2020-01-22 11.10.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111504/a2cb4756-9798-42c0-a7a1-092b9804939a.png">

##追加するコンテンツの位置を決める
コンテンツを追加する場所を決めて、追加するコンテンツ付近のclass名やid名を取得する。
取得したclass名やid名は埋め込み設定の埋め込み先CSSで指定することができます。
挿入するコンテンツは「置き換え」「前に挿入」「後ろに挿入」「子要素を置き換える」「子要素の先頭に追加」「子要素の最後に追加」の中から挿入場所を選択することができます。

<img width="299" alt="スクリーンショット 2020-01-22 13.17.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111504/5ceb1957-3cd1-fbe8-adb6-bcca3214eca7.png">

##設定したコンテンツが問題なく動作しているか確認
本番環境に実装する前に必ずプレビューしてください。プレビューは確認ページで確認する他に、「確認用URLを表示」からチームや外部に確認用URLも発行することができます。問題がないことが確認できたら接客を保存し、コンテンツの配信設定を完了させて配信。

<img width="1515" alt="スクリーンショット 2020-01-22 13.22.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111504/40d03d00-481c-d2cd-c959-61cff476c279.png">

##まとめ
KARTEを利用することでプログラミングの知識がない、非エンジニアでも迅速に施策を実施することができます。
WSL1でDocker使いたい

# WSL1でDocker使いたい

理由？
[WSLでDocker for windowsを使うッ！！！ \- Qiita](https://qiita.com/endo_hizumi/items/0cc50bdfbd827579733e)
この記事に触発されたから。俺もやってみようと思った。

あと、うまくいったらテスト環境でLinuxベースのやつさくさく切り替えられそうだしね。

## Windows側の操作

### WindowsにDockerインストール

[Dockerの公式サイト](https://www.docker.com/products/docker-desktop)から普通にダウンロードしてインストール

### WSLからWindowsのDockerを呼び出す設定

1. タスクバーのdockerアイコン右クリックして、Settingクリック
2. Generalの見出しの「Expose deamon on~~」のチェックを入れてOK。

これで、tcp://localhost:2375/でDockerが待ち受けしてくれるようになる。

画面は閉じないで、次の手順へ！！

### DockerがCドライブをマウントする設定

1. 同じ画面の`Resources`>`FileSharing`をクリック
2. 画面右にドライブレターが表示されるので、`C`にへっくいれてOK

画面はもう少しそのまま。閉じないで！！

### DockerのProxyとDNS設定

DockerはWindows標準とは別に独自のProxyとDNSの設定を持っている。
なので、クローズドな環境の場合はこちらも設定する。

1. 同じ画面の`Proxies`をクリックすると、右側に設定画面が表示される。環境にあわせて変更。
2. 同様に`Network`をクリックすると右側にDNSの切り替えスイッチとアドレス設定がでてくる。  
3. いっそ、ONにしてIPを「8.8.8.8」にした方が軽快に使える場合もあるが、まぁ、環境とご相談で。

## WSL側の操作

### dockerのインストール

```sh:dockerインストール
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install docker
$ sudo apt install docker-compose
```
### Cドライブのマウント場所の変更

標準だと`/mnt/c`になって使いにくいので変更する。

```txt:/etc/wsl.conf
[automount]
root = "/"  
```
## dockerの動作確認

いったん、DockerもWSLも一度再起動しとく（なんか不具合よく起きたのでお文じない）
再起動したのを確認したら、動作確認。

```sh:バージョン確認
$ docker version
Client:
 Version:           18.09.7
～～　略　～～
Server: Docker Engine - Community
 Engine:
  Version:          19.03.5
～～　略　～～
```

エンジンバージョンがWindowsと一致している。

```sh:hello-run
$ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

～～　略　～～

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

ここで躓く場合は、下記のネットワークの設定を確認しておく。

- WSLのPROXY設定がされていない
- WSLのNO_PROXYが設定されていない


## Jenkinsを起動する

[Jenkinsの公式ドキュメント](https://github.com/jenkinsci/docker/blob/master/README.md)
に記載されいている下記のコマンドそのままではWSLからは起動できない。

```sh:公式のコマンド（WSLでは動作しない）
$ docker run -p 8080:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts
```

下記の通りに変更するとWSL上でも動作する。

```sh:修正版のコマンド（WSLでも動く）
$ docker run -p 8080:8080 -p 50000:50000 -v /c/jenkins_home:/var/jenkins_home jenkins/jenkins:lts
```

WSL上のディレクトリにはDockerのファイルシステムをマウントできないのが原因らしい。
よって、Windows上のドライブを指定する必要がある。（上記の例では`C:\jenkins_home`）

## Jenkinsの起動確認

ブラウザから`http://localhost:8080`で初期画面が表示される。
パスワードは`C:\jenkins_home\secrets\initialAdminPassword`に保存されているのでコピペ

WSLからのDockerの動作確認としてはこれで終了
【unity】ウィンドウタブの動かし方

ウィンドウにあるタブは、ドラッグすることで、他のウィンドウとドッキングすることができます。

---

今回は、下図のように[ゲーム]タブを、他のウィンドウにドッキングしていきます。
<img width="432" alt="o.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/7a9940b8-dff5-967c-a462-30bc5a162d9c.png">

動かしたいタブ(今回は[ゲーム]タブ)をドラッグします。
<img width="419" alt="p.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/14b0913a-2cac-6c2c-48c2-10b23d299e4e.png">

マウスのボタンは押しっぱなしのまま動かします。
<img width="905" alt="q.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/acbeee62-da58-2e7c-9a80-0c7ec2de3afd.png">

マウスのボタンはまだまだ押しっぱなしです。
<img width="474" alt="r.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/86a974cf-f699-23a7-be44-b61f79ce0136.png">

自分にとってokなところで指を離します。
これにより、下図のように、[ゲーム]ウィンドウだけ独立しました。
<img width="868" alt="s.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/882f8924-a50e-744e-5ba3-9df69b897a7d.png">
ShellExecuteExを使ってファイルのプロパティダイアログを表示する際の注意点。


SHELLEXECUTEINFO構造体のlpVerbメンバに"properties"を指定するのですが、
これだけだと、そんな動作はありません、と実行時にエラーがでます。

ShellExecuteExはhInstAppメンバに31をセットしていることから、どうやら、
・「open」句はファイルに関連付けられたアプリケーションで起動、
・「print」句は既定の印刷プログラムを起動、
と同じ意味で、
「properties」句に関連付けられた動作を行おうとし、それが定義されていないからエラーとなった模様。

ここで、fMaskメンバに「SEE_MASK_INVOKEIDLIST」を指定すると、
「properties」句は「プロパティダイアログを開く」ことだと分かってくれるようです。

※エクスプローラの右クリックメニューの「プロパティ」と同じ動作をするよう指定したってこと？
"INVOKE"とか"IDLIST"とかいう言葉がそれを匂わせる。

※ウェブ上には
ShellExecuteExを使ってプロパティダイアログを表示する方法として
「SEE_MASK_INVOKEIDLIST」マスク指定なしのソースを書いている記事がいくつかあったけど、
一体どうやって実現したのか教えて欲しい。

:
;
しかし。
ShellExecuteExであっても、プロパティダイアログは瞬時に表示して閉じてしまう。
プロパティダイアログを永続的に表示しておくには、
ShellExecuteExを実行した後に何らかのpauseをかけておかなくてはならない...


```cpp:showProperty.cpp
#include <stdio.h>
#include <windows.h>
#include <shellapi.h>

int main(int argc, char** argv)
{
    int ret;
    char buf[1];
    if( argc < 2 ){
        printf("  [×] ファイルを指定してくださぃ\n");
        return -1;
    }

    SHELLEXECUTEINFO sei = {0};
    sei.cbSize = sizeof(SHELLEXECUTEINFO);
    sei.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_INVOKEIDLIST;
    sei.lpVerb = "properties";
    sei.lpFile = argv[1];
    sei.nShow = SW_SHOWNORMAL;

    if( ShellExecuteEx(&sei) == TRUE ){
        if( (int)sei.hInstApp > 32 ){
            printf("  [〇] ShellExecuteEX succeeded. %d\n", sei.hInstApp);
            ret = 0;
        }
    }
    else{
        printf("  [×] ShellExecuteEX failed. %d\n", sei.hInstApp);
        ret = -2;
    }

    //※入力待ちを作ってこのプロセスを止めておかないとプロパティダイアログが閉じてしまう。
    printf("enter any key...");
    gets_s(buf, 1);

    return ret;
}
```
レイアウトの変え方

Layout　を押下
<img width="1437" alt="m.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/ca21045f-7474-fced-537f-b9fdb9be9f98.png">

自分にとってちょうど良いレイアウトを選択する
よく使われるのが
　2x3
　デフォルト
<img width="149" alt="n.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/32224904-aabd-b146-f349-5d1cffde608e.png">
Javascript アロー関数を簡単にまとめて学ぶ

#はじめに
アロー関数？書けるよ。あまり理解してないけどって人向けに具体的な使用例の一部をお伝えする記事です。
アロー関数とは、
> アロー関数式は、より短く記述できる、通常の function 式の代替構文です。また、this, arguments, super, new.target を束縛しません。アロー関数式は、メソッドでない関数に最適で、コンストラクタとして使うことはできません。

つまり従来より簡潔に書けるし明瞭な構文で書けるってこと。
ちなみに関数とメソッドの違いは、

- 単独で **呼び出せる** のが関数 

```
myfunc(); <- こんな形の奴
```

- 単独で **呼び出せない** のが関数

```
var str = 'user1,user2,user3';
 
var result = str.split(','); <- メソッド
```

# 従来の関数の書き方との書き換え方
引数の値を2倍にして返り値で返す関数で例えると、

- 従来の書き方

```javascript:index.js

function doubleUp(num){
   return num * 2;
} 
```
- アロー関数で書き換えた書き方 その1

```javascript:index.js

const doubleUp = (num) => {
   return num * 2;
} 
```

- アロー関数で書き換えた書き方 その2.0 (引数が一つの場合に限る)

```javascript:index.js

const doubleUp = num => {
   return num * 2;
} 
```

- アロー関数で書き換えた書き方 その2.1 (引数が一つ以上の場合)

```javascript:index.js

const doubleUp = (a, b) => a * b;

```
- アロー関数で書き換えた書き方 その3.0 (関数の処理が returnで一行の場合に限る)

```javascript:index.js

const doubleUp = num => num * 2;

```

- アロー関数で書き換えた書き方 その3.1 (関数の処理が returnで一行以上の場合)

```javascript:index.js

const doubleUp = num => {
   alert('hoge');
   return num * 2;
}

```

# アロー関数と無名関数の挙動って一緒なの？
結論から言うと一緒じゃない。
関数内で this を使う場合は挙動が変わってくるんじゃい。
以下の関数を見るんじゃい。

```javascript:index.js

let person = {
   age: "30",
   callName: function(){
      console.log(this.age); //"30" が出力される
    
       window.setTimeout(function() {
          console.log(this.age) // undefined が出力される
      }, 1000);
   }
};
```
console.log(this)で両方とも出力してもらえればわかると思うんじゃい。 
window に関してはそもそも callName というオブジェクトがないんじゃい。
なので参照しようとすると undefined になるんじゃい。

しかし上記のようなオブジェクトにおいてageプロパティをwindow.setTimeout...内で使用したいというケースはよくあるケース。

ではどうするかというと、こうする。

- やり方 その１

```javascript:index.js

let person = {
   age: "30",
   callName: function(){
      console.log(this.age); //  "30" が出力される

    
       window.setTimeout(function() {
          console.log(this.age) //  "30" が出力される
      }.bind(this), 1000);
   }
};
```
bind()は引数とされている this と callName直下のスコープ内にある this を同じものとする機能があるんじゃい。
- やり方 その2

```javascript:index.js

let person = {
   age: "30",
   callName: function(){
      console.log(this.age); //"30" が出力される
      let hoge = this;
    
       window.setTimeout(function() {
          console.log(hoge.age) //"30" が出力される
      }, 1000);
   }
};
```
hoge変数にpersonオブジェクトのスコープを代入してあげるんじゃい。

- やり方 その3

```javascript:index.js

let person = {
   age: "30",
   callName: function(){
      console.log(this.age); //"30" が出力される
    
       window.setTimeout(function() {
          console.log(this.age) //"30" が出力される
      }.call(this), 1000);
   }
};
```
callメソッドを使うんじゃい。

- やり方 その4 

```javascript:index.js

let person = {
   age: "30",
   callName: function(){
      console.log(this.age); //"30" が出力される
    
       window.setTimeout(() => {
          console.log(this.age) //"30" が出力される
      }, 1000);
   }
};
```
アロー関数を使うんじゃい。
アロー関数内を使うと、アロー関数内でthisが定義されないんじゃい。
javascriptの性質上, アロー関数内でthisを見つけられない場合スコープチェーンを辿って
上の階層に同じ変数名のものを探すんじゃい。

最終的にグローバル変数まで探して見つかれなければ undefined を返すんじゃい。
こういう使い方があるんじゃい。


以上じゃい。

ps:
こういうやり方もあるよ〜」とかあれば教えて欲しいんじゃい。
勉強になるんじゃい。
VisualForce で rerender すると4バイト文字が化ける

# 問題点

SalesForce の VisualForce で rerender すると
4バイト文字が文字化けする

## サンプル

単純にボタン押したら再描画するだけの画面を作成

``` html:Test.vfp

<apex:page standardController="User" extensions="TestController" title="Test">
    <div>rerender範囲外：𠮷野家</div>
    <apex:form id="frm">
        <div>rerender範囲内：𠮷野家</div>
        <apex:commandButton value="rerender" action="{!act}" status="reloadStatus" rerender="frm" />
    </apex:form>
</apex:page>

```

``` Java:TestController.apxc

public class TestController {
	public TestController(ApexPages.StandardController controller) {
        
    }
    
    public void act(){
        return;
    }
}
```
これで `rerender` ボタンを押下すると

![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275964/b3f3c388-5230-dbe0-fa11-ef0d3079190f.png)
　↓
![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275964/ec999db9-7e83-a265-2b27-a4beee5a029d.png)

`rerender` 範囲内の「`𠮷野家`」が「`ஷ野家`」になってしまう
※範囲外に関しては変更なし


# 調査

## 文字コード

とりあえず「`𠮷`」と「`ஷ`」のコードポイント調べた

``` JavaScript:Test.js

console.log('ஷ'.codePointAt().toString(16));    // 0x0bb7
console.log('𠮷'.codePointAt().toString(16));    // 0x20bb7

```

絶対これや
サロゲートペア文字(4バイト文字)がおかしくなる模様


## 欠損箇所

`rerender` の範囲外は正常なことから `apex:commandButton` が怪しい
ボタン押下時は Ajax で Apex にアクセスしてるようなのでレスポンス内容を見てみる

```  XML:Response

<?xml version="1.0"?>
<html lang="en_US" xmlns="http://www.w3.org/1999/xhtml"><head>
	<!--省略-->
</head>
<body>
	<form id="j_id0:frm" name="j_id0:frm" method="post" action="https://hogehoge.visual.force.com/apex/Test?core.apexpages.request.devconsole=1" enctype="application/x-www-form-urlencoded">
		<input type="hidden" name="j_id0:frm" value="j_id0:frm" /> 
		<div>rerender範囲内：ஷ野家</div>
	<!--省略-->
</body>
</html>

```

もう化けとる
[このへん](https://www.w3.org/TR/xml/#charsets)見る限り XML ではサロゲートペア使えないっぽい

数値文字参照 `&#x20bb7;` にすればいけるかな～と思ったけど
状況変わらず Ajax のレスポンス時点で文字化けしてた。


# 対策

苦肉の策としてエスケープを挟むことにした
画面側でデコードできればURLエンコードとか他のでもいいと思う


``` html:Test.vfp

<apex:page standardController="User" extensions="TestController" title="Test">
    <div>rerender範囲外：𠮷野家</div>
    <apex:form id="frm">
        <div id="yoshi" style="visibility:hidden;">%uD842%uDFB7</div>
        <apex:commandButton value="rerender" action="{!act}" status="reloadStatus" rerender="frm" />
        <script>
			var ysdiv = document.getElementById('yoshi')
			ysdiv.innerHTML = unescape(ysdiv.innerHTML);
			ysdiv.style.visibility = "visible";
        </script>
    </apex:form>
</apex:page>

```

エスケープ後の文字列を表示してJSで無理矢理元に戻す感じ
`<script>` を `rerender` 内に置かないと動かないので注意

もうちょいきれいな対策したい
hyper 諸々

# command list


```
$ hyper list
```

```
$ hyper i {plugin name}
```

# config
ここにまとまってる。
https://hyper.is/#cfg


# plugins 

## overlay関連
とりあえず自分でforkするのがいい気がする。
一応下にあげておく。


### hyperterm-overlay
開発は進んでない。

### hyper-overlay
元になっているのはhyperterm-overlayで、forkされたもの。
よくなってると思いきや、hyper3だとちゃんと動かない可能性があるの気をつけるべし。

### hyper-visor(hyperterm-visor)
https://github.com/cwspear/hyperterm-visor#readme
golangにusingステートメントのようなものを作ってみた

この記事の内容は以下のバージョンで作りました。

```cmd
> go version
go version go1.13 windows/amd6
```

## きっかけ

* ちょっとしたgoのコードを書いているときに、「リソースの開放が面倒だなぁ」とおもった。
* .NETだと、usingステートメントですごくすっきりかけるから、似たようなものを作りたい。

## 通常のgoの場合

```go
// 何らかのリソースを取得する
resource, err := hogehoge.GetResource()
// エラーがあるかどうか調べてちょめちょめする
if err != nil {
  // ちょめちょめ
}
// 解放忘れがないように、deferを定義
defer resource.Close()

// ようやく本来やりたい処理
```

みたいな感じになる。本来やりたい処理を書き始めるまでいつまでかかるんだ・・・
という感じ

## 今回作ったもの

```go
type IDispose interface {
	open() error
	dispose()
}

func Using(disposable IDispose, fn func(resource interface{}) error) (err error) {
	if err = disposable.open(); err != nil {
		return err
	}
	defer disposable.dispose()
	if err = fn(disposable); err != nil {
		return err
	}
	return nil
}
```
IDisposeな構造体と関数を受け取り、Open/実行/Closeまでを自動的にやってくれるやつ。

## 使い方

IDisposeな構造体を用意

```go
type DisposableStruct struct {
  hogeResouce *hoge.HogeResource
}

func (s *DisposableStruct) open() error {
  return nil
}

func (s *DisposableStruct) dispose() {
  // リソースを破棄する処理
  s.hogeResouce.Close()
}
```

実行部

```go
err := Using(&DisposableStruct{hogeResouce: nil}, func(r interface{}) error {
  // castする必要がある。イケてない部分1
  hoge := r.(*DisposableStruct)
  // ここに本来やりたい処理を書く

  // 戻り値はエラーのみ。イケてない部分2
  return nil
})
```

## 最後に

* ジェネリクスが使えれば、もっとかっこよくかけるんだけど・・・
* golangでこんな無駄なことしてんじゃねぇよみたいに言われるかもしれないけど、気にしない。
* もっといい感じの実装がある場合はコメント欄で指摘をお待ちしております！
* 実際にはステートメントではなくただの関数です（タイトル詐欺ですまんな）
Github Actions の実行結果のブランチ名が変な件

Actionsタブを開くと、実行結果の一覧が確認できますが、こちらの表示がちょっと直感的でない、という話です。

## 前提

`master`ブランチをプロダクション、`staging`ブランチをステージングに、それぞれdeploy先を指定して、Github Actionsでdeployしています。

## 試行A

- 同じcommit（`a4ecff3`）まで`staging`と`master`ブランチを進めて、同時にpush

↓
<img width="1271" alt="スクリーンショット 2020-01-23 12.13.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4404/dc399ef2-ee25-2ae0-b85b-1970f3df3489.png">

２つbuild結果が追加されているものの、どちらも`master`になっているが、片方は`staging`になっていてほしい…


## 試行B

- `staging`ブランチにpush
- （少し間をおいて）`master`ブランチを上記の`staging`の先頭（`9c7a02b`）までリベースして、push

↓
<img width="1268" alt="スクリーンショット 2020-01-23 12.01.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4404/b882472e-49f4-f27f-28f4-bd92d07d5e5d.png">

矢印部分が本当は`master`になっていてほしい…

## 結論

pushイベントで実行されているものの、ブランチ名の表示がおかしい。ただし、buildの中で`GITHUB_REF#refs/heads/`を参照して、ブランチ毎に設定を変えている部分は意図通り動作していたので、大きな問題はないのですが、直感的じゃないな、というお話でした。
【Railsでスクレイピング】Mechanize記事まとめ

### **これを見ればスクレイピングできないサイトはない(技術的に)**
  


[Rails スクレイピング手法 Mechanizeの使い方 - Qiita](https://qiita.com/shizuma/items/d04facaa732f606f00ff)

[【rails】webサイトからスクレイピングしたデータをデータベースに保存する方法 - Qiita](https://qiita.com/tsubasaweb1/items/5be78cefed67020ac483)

[スクレイピングでサイト情報を取得し、データベースにストアするまでの流れをまとめてみた[Rails] - Qiita](https://qiita.com/takuyanin/items/01256773e1cbfc84f51a)

[Mechanizeでサイトログインしてスクレイピングするときのアレコレ メモ - Qiita](https://qiita.com/meguroman/items/6d2520ec83ffa4dfc0c7)


[MechanizeとNokogiriでリンク先のページをそれぞれスクレイピングするときのメモ（不規則なページを取得するとき） - Qiita](https://qiita.com/teruringo/items/a6acc7f245eca5d97b1e)

[RubyでWebスクレイピング - yhara.jp](https://yhara.jp/RubyScraping)

[【RubyでWebスクレイピング】Mechanizeを使ってスクレイピングをする方法【主要機能まとめ】](https://shinmedia20.com/ruby-mechanize)
[Swift5]端末からサーバへ画像のアップロード

##はじめに
以前書いた[[Android]端末からサーバへ画像のアップロード](https://qiita.com/hire1105/items/b5a8681405d9f437f759)のios版です。
こちらもいろいろ詰まったので、参考になればと思います。

###環境
* Xcode 11.3
* Swift 5

###ライブラリ
* Alamofire

そもそもこいつの導入でてこずりました。

参考：ライブラリの導入と、Alamofireの導入手順
https://qiita.com/0126/items/5d401acc219ac4f172d6

この方の記事を読めば大体はできると思いますが、自分が詰まったところのみ書いていきたいと思います。

* ターミナルで``carthage update --platform iOS``の実行
 * "Bad credentials"と表示され進まない。
      * Mac[キーチェインアクセス](https://support.apple.com/ja-jp/guide/keychain-access/kyca1085/mac)を開き``github.com``の削除。
* プロジェクト内にライブラリを追加
 * Linked Frameworks and Libraryが無い。
     * Framework,Libraries,and Embedded Content に変わっていた(?)
 
##ViewController.swift

【Swift3.0】Alamofireで画像＆パラメータを送信
https://qiita.com/tosaka07/items/eff35f410723d0e94f98
ほぼこちらの方と同じです変更点は

>Data型で使用します。UIImageJPEGRepresentationなどを使い、UIImageから変換しましょう。

の部分がSwiftのバージョンアップに伴って使えなくなったので、

```
let data:Data! = UIImageJPEGRepresentation(image!, 0.5) //これではなく
let data:Data! = image.jpegData(compressionQuality: 0.5)　//これ
```

くらいでしょうか。完成形はこちらです。

```swift:ViewController.swift
import Alamofire

func PostImage(image:UIImage){
        let data:Data! = image.jpegData(compressionQuality: 0.5)
        Alamofire.upload(
            multipartFormData: { multipartFormData in
                multipartFormData.append(data, withName: "test", fileName: "test.jpeg", mimeType: "image/jpeg")
            },
            to: "送るURL",
            encodingCompletion: { encodingResult in
                switch encodingResult {
                    case .success(let upload, _, _):
                        upload.responseJSON { res in
                            // 成功
                            let _ = response
                            print(res ?? "成功")
                        }
                    case .failure(let Error):
                        // 失敗
                        print(Error)
                }
            }
        )
```

以上です。

```
PostImage(image:送りたいUIImage)
```

で使います。

受け取る側は[[Android]端末からサーバへ画像のアップロード](https://qiita.com/hire1105/items/b5a8681405d9f437f759)と同じです。
【Rails】 Heroku, AWS で詰まったときに見る記事まとめ

## Heroku

#### db

[heroku上のDBをリセットする](https://qiita.com/G-awa/items/792b7cd60205823f7ac0)

```
heroku pg:reset DATABASE_URL
heroku run rake db:migrate
or
heroku run rake db:seed
```

[【Rails】Heroku上でApplication Error(H10 App crashed)【PostgreSQL】](https://qiita.com/totto357/items/1a6b88db8d2775540e1b)

```
group :production do
  gem 'pg', '0.20.0'
end
```

###### メモ
```heroku run rails c```でheroku上のdbの中身を確認できる。
```heroku run rails db:migrate:status```でdbの状態を見れる。
``heroku pg:psql -c "select * from posts;"``でも同様のことができる
```heroku logs -t```で詳しいエラー内容を見れる。


####  assets

[Rails4 asset pipeline関連設定まとめ（Heroku対応込）](https://qiita.com/tomomomo1217/items/fa8dfa094cc4c0e4e350)

```
RAILS_ENV=production bundle exec rake assets:precompile assets:clean

git add .

git commit -m "hoge"

git push origin hoge

git push heroku
```

[【rails】【heroku】【bootstrap】herokuでCSS、font、JavaScriptが反映されない。](https://gakeno-ueno-horyo.hatenadiary.org/entry/20150329/1427595646)


#### credentials.yml.enc, master.key

[【Rails5.2】credentials.yml.encとmaster.keyでのデプロイによる今までとの変更点](https://qiita.com/katsu105/items/88675da5119762d73d92)

```
EDITOR=vim bin/rails credentials:edit
```

[railsのエラー「Errno::EACCES: Permission denied」の解決](https://qiita.com/cutenkey/items/2505710b4c494bac152b)

[production環境でsecret_tokenをセットする(rails)](https://qiita.com/takusemba/items/2ad25d3d0a007757c194)


## AWS

[【Railsチュートリアル】S3に画像をアップロードする設定【13章課題】](https://qiita.com/ryuchan00/items/8e414562b7122e7ec4fb)

[Rails+carrierwave+heroku+AWS S3で画像アップロードさせるときにハマったこと](http://euglena1215.hatenablog.jp/entry/2017/01/07/134802)
【Go】int64型・uint64型からstring型へ変換する方法

# int64型からstring型へ変換する方法

```go
// int64
var Int64 int64 = 9223372036854775807

// strconv.FormatInt(int64, 基数（10進数）)
convertedInt64 := strconv.FormatInt(Int64, 10)
```

`9223372036854775807`は`int64`の最大数です

https://golang.org/pkg/builtin/#int64

> int64 is the set of all signed 64-bit integers. Range: -9223372036854775808 through 9223372036854775807.

# uint64型からstring型へ変換する方法

```go
// uint64	
var Uint64 uint64 = 18446744073709551615

// strconv.FormatUint(uint64, 基数（10進数）)
convertedUint64 := strconv.FormatUint(Uint64, 10)
```

`18446744073709551615`はuint64の最大数です

https://golang.org/pkg/builtin/#uint64

> uint64 is the set of all unsigned 64-bit integers. Range: 0 through 18446744073709551615.

# Go Playground

https://play.golang.org/p/mfNxKZS0xAM

```go
package main

import (
	"strconv"
	"fmt"
	"reflect"
)

func main() {

	var Int64 int64 = 9223372036854775807
	convertedInt64 := strconv.FormatInt(Int64,10)
	fmt.Printf("%v with type %s \n", convertedInt64, reflect.TypeOf(convertedInt64))
	
	var Uint64 uint64 = 18446744073709551615
	convertedUint64 := strconv.FormatUint(Uint64,10)
	fmt.Printf("%v with type %s \n", convertedUint64, reflect.TypeOf(convertedUint64))
}
```

実行結果

```
9223372036854775807 with type string 
18446744073709551615 with type string 
```

# 【おまけ】string型からint64・uint64型へ変換からの再びstring型へ変換

https://play.golang.org/p/tjlUnDzYgKY

```go
package main

import (
	"strconv"
	"fmt"
	"reflect"
)

func main() {
	fmt.Println("\n----- convert String to Int64 and Uint64 -------------------")

	// int64
	var strInt64 string = "9223372036854775807"
	convertedStrInt64, _ := strconv.ParseInt(strInt64, 10, 64)
	
	fmt.Printf("%v with type %s \n", convertedStrInt64, reflect.TypeOf(convertedStrInt64))
	
	// uint64	
	var strUint64 string = "18446744073709551615"
	convertedStrUint64, _ := strconv.ParseUint(strUint64, 10, 64)

	fmt.Printf("%v with type %s \n", convertedStrUint64, reflect.TypeOf(convertedStrUint64))
	
	fmt.Println("\n----- convert Int64 and Uint64 to String -------------------")
	
	convertedInt64 := strconv.FormatInt(convertedStrInt64,10)
	fmt.Printf("%v with type %s \n", convertedInt64, reflect.TypeOf(convertedInt64))
	
	convertedUint64 := strconv.FormatUint(convertedStrUint64,10)
	fmt.Printf("%v with type %s \n", convertedUint64, reflect.TypeOf(convertedUint64))
}
```

実行結果

```
----- convert String to Int64 and Uint64 -------------------
9223372036854775807 with type int64 
18446744073709551615 with type uint64 

----- convert Int64 and Uint64 to String -------------------
9223372036854775807 with type string 
18446744073709551615 with type string 
```
あっさり読むrails④（非同期処理）

#はじめに
JSを使った非同期処理を簡単に書いてみます。
関連事項を[次の記事](https://qiita.com/Moon1126Snow/items/323549d513022216a1d6)に書いています。
#前提
使用するのは、
`Ruby on rails`
`Haml`
`jQuery`
です。
CSSは特に指定しません。
#実行
次のファイルを用意します。

```ruby:Gemfile
gem 'jquery-rails'
```
これを記述して、`bundle install`します。
（ディレクトリが、アプリのディレクトリになっている事を確認。`pwd`というコマンドで確認可能）

```ruby:application.js
//= require jquery
```
この記述を忘れるとエラーになります（`$とは何ですか？`という感じのエラー）

```haml:sample.haml.html
= form_with model:@sample, local: true do |f|
  = f.text_area :name, placeholder: "サンプル", class: "sample-form"

.add-text
```
これがビューデータとなります。

```javascript:sample.js
$(function(){
 $(".sample-form").on("change" functon(){
   var sampletext = $(this).val;
   $(".add-text").text(sampletext):
 })
});
```
これが非同期処理の中身になります。

これで、テキストエリアに文章を入力すれば、同じ文章が`.add-text`の部分に表示されます。

※随時更新します
useGlobalState

```useGlobalState.jsx
import React, { useEffect, createContext, useReducer, useContext, useDebugValue } from 'react';

/* Action Types */
const SET_VALUE = 'SET_VALUE';

/* Define a context and a reducer for updating the context */
const GlobalStateContext = createContext();

const globalStateReducer = (state, action) => {
    const { key, data } = action.payload;
    switch (action.type) {
      case SET_VALUE:
        return {
          ...state,
          ...{ [key] : data },
        };
  
      default:
        return state;
    }
};

export const GlobalStateProvider = ({ children }) => {
    const [ state, dispatch ] = useReducer(globalStateReducer, {});

    return (
        <GlobalStateContext.Provider value={[ state, dispatch ]}>
            { children }
        </GlobalStateContext.Provider>
    );
};

const useGlobalState = (key, initialValue) => {
    const [ state, dispatch ] = useContext(GlobalStateContext);

    const setGlobalState = data => {
        dispatch({ 
            type: SET_VALUE, 
            payload: { key, data }, 
        });
    };

    const getState = () => {
        const resultState = state && state[key] ? state[key] : initialValue;
        return resultState;
    };

    useEffect(() => {
        if ( ! state || ! state.hasOwnProperty(key)) {
            setGlobalState(initialValue !== undefined ? initialValue : null);
        }
    }, [ initialValue ]);

    return [
        getState(),
        setGlobalState,
    ];
};

export default useGlobalState;
```

```index.jsx
import React from 'react';
import { render } from 'react-dom';
import '@project/initialize';

import { GlobalStateProvider } from './useGlobalState';

import Contents from './Contents';

const App = () => (
    <GlobalStateProvider>
        <Contents />
    </GlobalStateProvider>
);

render(<App />, document.getElementById('root'));
```

```Contents.jsx
import React from 'react';
import useGlobalState from './useGlobalState';

const Contents = () => {
    const defaultValue = null;
    const [ globalValue, setGlobalValue ] = useGlobalState('key', defaultValue);

    return (
        <div>{ globalValue }</div>
    )
};

export default Contents;
```
scoop環境構築【WIndowsでのパッケージ管理】

# 概要

Scoopとは、簡単に言うと「**Windowsで使用されるパッケージ管理ソフト**」のことです。パッケージ管理ソフトを簡単に言うと、「**ソフトウェアを管理するソフト**」です。追加で言うと、ソフトウェアの管理とは、「**ソフトウェアの導入／バージョンを管理する**」ということです。Linuxで言うところの「apt」や「yarn」、Macで言うところの「macports」です。

つまり、**コマンド一発でソフトウェアの導入が出来る**という風にとらえて良いです。

Windowsには標準でパッケージ管理ソフトがありません。開発系のエンジニアにとってこれは非常に不便です。わざわざインストーラをダウンロードしてGUI上でポチポチボタンを押さなければならないのは非常に苦痛です。

ただ、環境的にWindowsを使用しなければならない機会は多くあります。そのため、Windowsでもパッケージ管理ソフトを導入し、開発スピードを速めるという選択は早いうちに導入することを私はお勧めしています。楽なので。

# 類似ソフト（Chocolatey）との比較

始めに、Chocolateyの方が管理されているソフトウェア数が多いです。ただ、以下の理由でScoopを採用する人が増えているようです。

- インストール時に管理者権限の指定が面倒（ポップアップが出る）
- ローカルリポジトリの用意が面倒
- アンインストールが失敗するケースがそこそこある

私は選定段階でChocolateyの導入は見送っていますが、上記を鑑みるに一番気になるのはアンインストールが失敗するケースがそこそこあるって点です。使わなくなったソフトウェアは今後の開発時に影響がないように安全に消したいものです。

詳しいこのあたりの詳しい話は「[Scoopを使ったWindows環境構築のススメ - Super!!](https://qiita.com/Dooteeen/items/12dc8fb14042888113d0)」を見ると記述されています。要するに、上記の問題点をあんまり気にしなくてよいのがscoopと思っていただけると良いと思います。

# scoopのインストール

PowerShellにて以下のコマンドを打ってください。
**※注意**
**PowerShell 5以上および.NET Framework 4.5が必要**

```sh
Set-ExecutionPolicy RemoteSigned -scope CurrentUser; iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
```

その後、以下のコマンドにて、導入されたかを確認してください。エラーが出なければ基本導入が出来たととらえて良いです。

```sh
scoop -v
```

# コマンド

ここではあまり詳細な説明はしませんが、少しだけ。

## ソフトウェアのインストール／アンインストール

```sh
scoop install <packege_name>
scoop uninstall <packege_name> 
```

## インストールしたソフトウェアの確認

```sh
scoop list
```

# 気を付けること

使用上気を付けた方が良いことは、ソフトウェアをインストーラでインストールしたのか、scoopでインストールしたのかを整理できるようにすることです。GUIがあるようなソフトウェアは個人的にインストーラでインストールしてもいいんかなとも思っています。始めのうちはCUIで操作するようなソフトウェアをscoop、GUIで操作するようなソフトウェアはインストーラという分け方でもいいのかもしれません。

# 参考

- Scoop：[https://scoop.sh/](https://scoop.sh/)
- ScoopでWindowsにおける開発環境構築を最適化しよう：[https://blog.satotaichi.info/scoop/](https://blog.satotaichi.info/scoop/)
- Windowsでパッケージ管理したいなら、先ずScoopより始めよ：[https://www.jcsc.co.jp/tech_blog/archives/3](https://www.jcsc.co.jp/tech_blog/archives/3)
- Scoopを使ったWindows環境構築のススメ - Super!!：[https://qiita.com/Dooteeen/items/12dc8fb14042888113d0](https://qiita.com/Dooteeen/items/12dc8fb14042888113d0)
cscの作法 その39

# 概要

cscの作法、調べてみた。
chartやってみた。

# 環境

.NETFramework4.8


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/56116615-55f5-3e4e-27f7-ce65d539f63a.png)


# コンパイル

```
csc chart1.cs /r:System.Windows.Forms.DataVisualization.dll
```

# サンプルコード


```
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

namespace myapp 
{
	class ChartSample1 {
		public partial class form1: Form {
			private Chart chart;
			public form1() {
				this.Size = new Size(400, 400);
				this.Load += new System.EventHandler(this.form1_Load);
			}
			private void form1_Load(object sender, EventArgs e) {
				this.chart = new Chart();
				chart.ChartAreas.Clear();
				chart.Titles.Clear();
				chart.Series.Clear();
				ChartArea area = new ChartArea("area1");
				Title title = new Title("title1");
				title.DockedToChartArea = "area1";
				Series series1 = new Series();
				Series series2 = new Series();
				series1.ChartType = SeriesChartType.Line;
				series2.ChartType = SeriesChartType.Line;
				for (int i = 0; i < 360; i++)
				{
					series1.Points.AddXY(i, Math.Sin(i * Math.PI / 180.0));
					series2.Points.AddXY(i, Math.Cos(i * Math.PI / 180.0));
				}
				series1.ChartArea = "area1";
				series2.ChartArea = "area1";
				chart.ChartAreas.Add(area);
				chart.Titles.Add(title);
				chart.Series.Add(series1);
				chart.Series.Add(series2);
				this.Controls.Add(this.chart);
			}
		}
		static void Main() {
			Application.Run(new form1());
		}
	}
}




```

以上。
MySQLの全文検索の種類について

# MySQLの全文検索について

3種類有ります

## 自然言語検索
検索文字列が人間の自然な言語でのフレーズとして解釈されます。

### 特徴
特別な演算子は無い
ストップワードリストが適用される

### 動作
IN NATURAL LANGUAGE MODE 修飾子が指定されている場合または修飾子がまったく指定されていない場合は、全文検索が自然言語検索になる

## ブール検索
特別なクエリー言語のルールを使用して検索文字列が解釈される。

### 特徴
文字列には、検索対象の単語が含まれる
一致する行に単語が存在しなければならない、または存在してはならないように、あるいは通常よりも単語の重みが高くまたは低くなるように、要件を指定する演算子を含めることもできます。
特定の共通単語 (ストップワード) は、検索インデックスから省略され、検索文字列に存在しない場合は一致が行われません。

### 動作
IN BOOLEAN MODE 修飾子が有る場合、ブール検索になります。

## クエリー拡張検索
自然言語検索を改善したもの

### 特徴
自然言語検索を実行する際は、検索文字列が使用される。
その後、検索で返されたもっとも関連性の高い行からの単語が検索文字列に追加され、再度検索が実行される。
クエリーでは、2 回目の検索からの行が返されます。

### 動作
IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION または WITH QUERY EXPANSION 修飾子が有る場合は、クエリー拡張検索を行います。
複数のレコードを一括処理

一括でレコードをアレコレするやり方。なお割と力技。
それぞれやりたい事は以下。

①カートを空にする =Userに紐づくCartレコードを全削除
②カートに入ってる商品を注文する =複数のCartレコードを使って複数のOrderProductレコードを作成する。
③注文情報と注文商品情報をまとめて変更する =親要素と子要素を一括でupdateをかける

前提ーー
Cartモデル、OrderProductモデルには以下のカラムがある
・product_name
・quantity
・price
・order_id(OrderProductのみ)
・status(OrderProductのみ)
Orderモデル
・user_id
・status

User<Cart,Order
Order<OrderProduct　が１対他の関係。


#①カートを空にする
delete_allメソッドを使う。これを使うとUserに紐づいたCartレコードを全て削除できる。
似たようなものでDestroy_allがあるけどこちらはUserに紐づいた全てのレコードが削除されるらしい。つまりこの前提だとOrderレコードまで消えるっぽい。
actionはdestroyを個別削除に使っていたので新しく作成する。

```:config/routes.rb
delete 'public/carts' => "public/carts#delete_all"
```
```:carts_controller.rb
def delete_all
 @user = current_user
 @user.carts.delete_all
end
```
```:Carts/index.html.erb
<%= link_to "カートを空にする", public_carts_path, method: :delete %>
```


#②カートに入ってる商品を注文する
ここでやりたい挙動は
１、Orderレコードを新しく作成
２、そのIDを使ってOrderProductを作成

```:controller
def create
 @user = current_user

 @order = Order.new
 @order.user_id = current_user.id
 @order.save!

 @user.carts.each do |cart|
  order_product = OrderProduct.new
  order_product.order_id = @order.id
  order_product.quantity = cart.quantity
  order_product.product_name = cart.product_name
  order_product.total = cart.product.price
  order_product.save
 end
end
```
もっと大量のデータを扱う場合は別のやり方があると思う。
.eachで回すのはナンセンスだけどやり方調べる時間がなかった。


#③注文情報と注文商品情報をまとめて変更する
これが一番難しかった。何なら今でもいまいち理解できてない。

```:order_controller
def update
　@order = Order.find(params[:id])
　@order.update(order_params)
end

private
def order_params
 params.require(:order).permit(:user_id,:status, order_products_attributes: [:id, :status, :_destroy])
end
```
```:models/order.rb
accepts_nested_attributes_for :order_products
```
```:
<%= form_for [@order] do |f| %>
　<%= f.select :status, ['入金待ち', '入金確認', '製作中', '発送準備中', '発送済み'], {}, class: "dropdown" %>
　<%= f.fields_for :order_products do |order_product| %>			 
   <%= order_product.select  :status, ['着手不可', '製作待ち', '製作中', '製作完了'] %>	 
  <% end %>
  <%= f.submit "更新" %>
<% end %>
```

**order_products_attributes: [:id, :status, :_destroy]**
まず一番にcontrollerのこいつ。order_paramsに入りこんでるこいつ。attributesを使うならこれとモデルへの記述が必要でidと_destroyは形式として突っ込むらしい。何故かはよくわからない。

それからfields_for。これをform_forの中にとりあえず入れると、そこで子要素を編集できる。fields_forをかけると子要素のレコードを繰り返し持ってこれるので.eachはいらない。ただし<table>タグで:product_nameなんかを表示させる為に.eachも併用すると途端にテーブルが崩壊する。そういう場合はもうテーブルを分ける。入力のテーブルと商品名とかを表示させるテーブルをいい感じにくっつける。

submitはform_forの中且つfields_forの外。

これでいける。


え、同じ値を全レコードのカラムにぶち込みたい？
.eachで　.カラム　= "入れたい値"　を回せばいいんじゃないかな。
createならsaveする前に入れてさ。
【Rails】scope、ActiveSupport::Concernについて

# 環境
`Rails 5.2.3`
`mysql 5.7.28`


# リテラルについて

**例文**

```ruby:contoroller.rb
def index
  @boards = Board.includes(:user).order('created_at DESC')
end

def bookmarks
  @bookmarks = current_user.bookmarks.board.includes(:user).order('created_at DESC')
end
```

改善ポイント
・orderはリテラルではなくscopeで定義すべき

理由
・共通化できるクエリはscopeでメソッドのように定義すべき
・クエリはできるだけリテラルで使わないほうが良い
リテラル=変数やメソッド化していないただのベタ書きした文字や数字

メリット
・任意のメソッド名でどのような効果を持つかわかりやすくなる
・探す場所が1箇所に絞られ、リファクタリング容易(保守性)、データベースパフォーマンスの最適化（読み込みスピードUP）が図れる
・IDEの構文チェックがうまく走らないことがあり、ミスに気づけなくなることがある。

# scope
共通的に使うクエリーをメソッドのように定義することができる便利な機能。

```ruby:board.rb
scope :new_order, -> { order(created_at: :desc) }
```

```ruby:contoroller.rb
def index
  @boards = Board.includes(:user).new_order
end

def bookmarks
  @bookmarks = current_user.bookmarks.board.includes(:user).new_order
end
```

このようにscopeを使用することで先ほどあげたメリットがある。
しかし、システムが大きくなるほどscopeの数が増えていき見通しが悪くなる。
そんな時にActiveSupport::Conernを使ってmoduleに機能を切り出す。

# ActiveSupport::Concern
共通処理をモジュールとして切り出し、インクルードすることでモジュールを使用。

**例文**

```ruby:board.rb
scope :new_order, -> { order(created_at: :desc) }
```

```ruby:comment.rb
scope :new_order, -> { order(created_at: :desc) }
```

複数のモデルで同じscopeが定義されている時、ActiveSupport::Concernでまとめる。

>引用
1. app/models/concerns/以下のモジュールファイルを作成する
2. ActiveSupport::Concernモジュールをextendで取り込む
3. includedブロック内でscopeを宣言する
4. モデル側でモジュールをincludeする

```ruby:app/models/concerns/hoge.rb
require 'active_support'

module Hoge
  extend ActiveSupport::Concern

  included do
    scope :new_order, -> { order(created_at: :desc) }
  end
end
```

```ruby:board.rb,comment共通
include Hoge
```

# まとめ
参考資料
[Rails: モデルの外では名前付きスコープだけを使おう（翻訳）](https://techracho.bpsinc.jp/hachi8833/2018_06_14/57526)
[scopeをActiveSupport::Concernに分割する](https://qiita.com/hypermkt/items/0f6d759e03e2f6d527c0)
[[Rails] ActiveSupport::Concern の存在理由](https://qiita.com/castaneai/items/6dc121ce6ff100614f42)
Flutterでバックグラウンドからのコールバック処理で躓いたこと

Flutterアプリでネイティブ処理をバックグラウンドで動かした時に躓いたことのメモです。


#### 前提
※発生環境
Flutter (Channel beta, v1.13.6, on Mac OS X 10.15.2 19C57, locale ja-JP)
Android 9
iOS 13

公式での概要
https://flutter.dev/docs/development/packages-and-plugins/background-processes

上記公式がおすすめしている詳細とサンプル
https://medium.com/flutter/executing-dart-in-the-background-with-flutter-plugins-and-geofencing-2b3e40a1a124



### コールバックで可能なこと
コールバック自体はbackground isolateで実行されるので、main isolateで動いてる画面等が直接参照することはできません。ですが、ReceiverPort/SenderPortを使うことでbackground isolateからmain isolateへデータを送信することができます。

```dart
static String sendPortName = "myapp_send_port_name";

//background isolateで実行される。実際の使い方は上のサンプルを参照
void callback(data) {
    //background isolateからmain isolateにデータを送る
    final SendPort send = IsolateNameServer.lookupPortByName(sendPortName);
    send?.send(data);
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() {
    return _MyAppState();
  }
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    _initPort();
  }
  Future<void> _initPort() async {
    _rPort = ReceivePort();
    final _sPort = _rPort.sendPort;

    // register~は上書き更新できないので以前のStateが作成したものを消しておく
    IsolateNameServer.removePortNameMapping(sendPortName);
    IsolateNameServer.registerPortWithName(
        _sPort, sendPortName);
    // background isolateからデータを受け取って画面に反映
    _rPort.listen((data) {
        setState(() {
           //dataを_MyAppStateに反映させる
        });
    });
  }

  @override
  Widget build(BuildContext context) {
   //ボタンタップしたら何かのバックグラウンド処理を開始するような画面
  }
}
```


### コールバックで不可能だったこと
MethodChannelを使ったネイティブ実行ができませんでした(MissingPluginExceptionがthrowされる）、つまりpluginが使えません。実際に以下を試したが無理でした。

- flutter_local_notificationsを使ってデータをローカル通知で表示する。
- sqfliteを使ってデータを格納する
- shared_preferencesを使ってデータを格納する

これらを実行したければ、background isolateからmain isolateにデータを渡してそちらでやるしかないようです。

#### main isolateが死んでたらどうする？
例えばAndroidでマルチタスク画面からアプリを上スワイプで消したとします。この時、background isolateは生きてますが、main isolateは消えます（知識が不正確なのでこの表現で正しいか怪しい）、明示的にこの動作をしなくてもOSの都合によって同じ状態になることもあるでしょう。この場合、main isolate側に記述した処理は当然実行されません。

対応方法としては、callbackではなくネイティブ側に該当の処理(通知、DB保存etc)を個別に書くしかないのではと考えています（まだ試していない）。flutterのplugin機能で共通API化したはずの機能を再度ベタ書きするという悲しみ。。。
rakeタスクに引数を渡したいとき

rakeタスクで引数を渡したい！
意外とまとまった記事がなかったので備忘。

## タスク名とともに引数を書く
```ruby
task :task_name, ['filter'] => :environment do |_task, args|
  p args
  p args[:filter]
  ~
```
`filter` の部分は任意の文字でOK

## タスク実行方法
command: `rake "task_name[arg]"`

`arg` 部分に渡したい引数を書く。この場合だと "arg" が渡される。
タスク全体を "" で囲まないと、引数までタスクとして認識されない。 

## 実行結果
```
=> #<Rake::TaskArguments filter: arg>
"arg"
```
Intel と AMD で違う(?) BSF/BSR 命令

BSF/BSR で入力がゼロだったとき、出力は

* Intel: 未定義
* AMD: 変更されない

と、ドキュメントではなっている。

CPU の構造を考えると、条件代入命令 (CMOVcc) と同じで、パイプラインの終わりにある、書き込みステージの動作（出力レジスタへの代入）を行わないこと（ただしフラグ レジスタは更新）になりそうな気がする。

Intel も AMD も同じ動作になると思うので、手元の Core i7-8700B [コンパイラは g++]で試してみる。

```c++:sample.cpp
#include <iostream>
#include <iomanip>

using namespace std;

// int int_log2(unsigned x, int z=-1)
// 出力: (int)log2(x)
//      x が 0 の場合、z を返す

// Intel 仕様向け
int int_log2_intel(unsigned x, int z=-1)
{
    int b;
    asm("bsrl %2,%0;"  // b = BSR(x);
        "cmovz %1,%0"  // if (x == 0) b = z;
        : "=r" (b), "+r" (z) : "r" (x));
    return b;
}

// AMD 仕様向け
int int_log2_amd(unsigned x, int z=-1)
{
    asm("bsrl %1,%0" : "+r" (z) : "r" (x));
    return z;
}

// メイン関数
int main(int argc, char **argv)
{
    cout << showbase << right;
    for (int b = -1; b < 32; b++)
    {
        unsigned x = (b >= 0) ? (1 << b) : 0;
        cout << "int_log2(" << hex << setw(10) << x << ")"
             << " = " << dec << setw(2) << int_log2_intel(x)
             << ", "  << dec << setw(2) << int_log2_amd(x)
             << endl;
    }
    return 0;
}
```

をコンパイルして、実行すると

```
$ g++ -O3 -o sample sample.cpp
$ ./sample
int_log2(         0) = -1, -1
int_log2(       0x1) =  0,  0
int_log2(       0x2) =  1,  1
int_log2(       0x4) =  2,  2
int_log2(       0x8) =  3,  3
int_log2(      0x10) =  4,  4
int_log2(      0x20) =  5,  5
int_log2(      0x40) =  6,  6
int_log2(      0x80) =  7,  7
int_log2(     0x100) =  8,  8
int_log2(     0x200) =  9,  9
int_log2(     0x400) = 10, 10
int_log2(     0x800) = 11, 11
int_log2(    0x1000) = 12, 12
int_log2(    0x2000) = 13, 13
int_log2(    0x4000) = 14, 14
int_log2(    0x8000) = 15, 15
int_log2(   0x10000) = 16, 16
int_log2(   0x20000) = 17, 17
int_log2(   0x40000) = 18, 18
int_log2(   0x80000) = 19, 19
int_log2(  0x100000) = 20, 20
int_log2(  0x200000) = 21, 21
int_log2(  0x400000) = 22, 22
int_log2(  0x800000) = 23, 23
int_log2( 0x1000000) = 24, 24
int_log2( 0x2000000) = 25, 25
int_log2( 0x4000000) = 26, 26
int_log2( 0x8000000) = 27, 27
int_log2(0x10000000) = 28, 28
int_log2(0x20000000) = 29, 29
int_log2(0x40000000) = 30, 30
int_log2(0x80000000) = 31, 31
```

となった。手元の Intel CPU では AMD 仕様向けの処理でよさそうです。

AMD 仕様向けの処理がダメな CPU があるのなら、どれなのか知りたい...

> 追記： 80486 の初期バージョンが該当するらしい
Autosar文書、参考文献、略号一覧作成手順

Autosar文書、参考文献、略号一覧（作成中23/237）：英語(40)
https://qiita.com/kaizen_nagoya/items/2325b0156bc7fcf5a96d

の作成手順を記録します。

 <この項は書きかけです。順次追記します。>


# docker起動して作業

この作業自体が、下記作業の補助作業。

Autosar Document
https://www.autosar.org/nc/document-search/

Autosar単語帳(作業中)
https://qiita.com/kaizen_nagoya/items/0927727a94b157df2df8


```
docker run -v /Users/administrator/Downloads/autosar:/tmp/docker -it kaizenjapan/autosar /bin/bash
```

/Users/administrator/Downloads/autosarは実在するフォルダ名。
または

```
docker run -v /tmp/docker:/tmp/docker -it kaizenjapan/autosar /bin/bash
```

/tmp/dockerは実在するフォルダ名

#pdfファイルのありか

docker 上の /home/autosar/autosar_latest
のpdfフォルダを

/tmp/dockerに複写してある。

あるいは、dockerを起動したシステムのフォルダにあることを想定する。
なければ、

```
# mkdir /tmp/docker/pdf
# cp /home/autosar/autosar_latest/pdf/* /tmp/docker/pdf
```

# macOSならプレビューで開く

なぜか、acrobat readeで読むと文字列のコピペができない。
ファイル名を右クリックして「このアプリケーションで開く」で、「プレビュー」を選んで開く。


# 見出しをコピーペする

みだしもじの#を行頭につける。githubでは#の後に半角空白がいる。先にgithubに作るか、後でコピペするか、どちらでも同じように作業する。


# reference をコピペする


table of contentsの前にあるか、後ろにあるかどちらかの場合がある。みあたらなければ、文書の末尾をみるか、referenceで検索する。

Specification of Module XCP
のように、 Related documentationとしてreferenceでない場合もある。整合性がない文書ほど役に立つという経験則からすれば大事。


table of contentsの中にreferenceがどこにあるか示していない場合があり、何を考えているのかよくわかっていない。

reference の前に##をつける。githubでは#の後に半角空白がいる。先にgithubに作るか、後でコピペするか、どちらでも同じように作業する。


頁をまたぐ場合は、文書名、頁番号などの文字列を削除する。

# abbreviationをコピペする

referenceの前後か、先頭か最後をみる。abbreviation, acronymで検索する。
glossaryをreferenceで参照していればないのは納得できる。
glossaryをreferenceで参照していなくてないのは、参照している文献がglossaryを参照しているか、abbreviationがあればいいという意味だと理解。


Specification of ECU Resource Templateのp.7には、

>Where applicable, please consult the glossary and the abbreviation list contained in this document. 

という記述がある。

ISOなどの標準では、this document といったら、今現在、文章を記述している文書を指す。もし、glossaryを指すのであれば、the documentの方がいいかも。"Where applicable, please consult the glossary and the abbreviation list contained in the document. "とするとよいかも。Autosar会員の誰かが意見(comment)提出してくださることを期待します。

abbreviationに対してmeaningはどうなんだろう。

 Specification Wireless Ethernet Transceiver Driverでは、Abbreviation / Acronymに対してDescription
で、descriptionの方が落ち着く。

abbreviation の前に##をつける。githubでは#の後に半角空白がいる。先にgithubに作るか、後でコピペするか、どちらでも同じように作業する。

頁をまたぐ場合は、文書名、頁番号などの文字列を削除する。



## 表形式に整形する。

Qiitaにコピペすれば、markdownで表になる場合と、ならない場合がある。
Excelからコピペしても同様。

原理がまだよくわかっていない。

githubに表を作成する場合、いつも、Qiitaにコピペしてから、githubにコピペしている。

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
 

# 文書履歴(document history)
ver. 0.01 初稿 20200123 午前
ver. 0.02 表形式追記 20200123　昼


### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
Twitter APIを使用する

twitter gemを使ってrailsプロジェクトでtwitter apiを使う方法を書くつもりです
- https://developer.twitter.com/ で開発者アカウントを作成します
- https://developer.twitter.com/en/apps/create でアプリを作成します
    - 情報を埋める
    - twitterによる認証を使用している場合は、`Callback URLs` を適切に設定します
 
- アプリを作成した後、詳細をクリックして `Permissions` を設定します
    - デフォルトは読み取り専用です。 必要な許可に変更します。
- キーとトークンを設定する
    - 資格情報ファイルを編集します- `EDITOR = vim rails credentials:edit`
    - APIキーとアクセストークンを設定します（twitter_api_key、twitter_api_secret、twitter_access_token、twitter_access_token_secret）
- `gem install twitter` をインストールする
- twitterデータを使用するファイルを構成します

    ```
  client = Twitter::REST::Client.new do |config|
        config.consumer_key = Rails.application.credentials.twitter[:twitter_api_key]
        config.consumer_secret = Rails.application.credentials.twitter[:twitter_api_secret]
        config.access_token = Rails.application.credentials.twitter[:twitter_access_token]
        config.access_token_secret = Rails.application.credentials.twitter[:twitter_access_token_secret]
   end
   ```

すべてがtwitter apiを使用する準備ができています。
宝石の詳細と例はこちらでご覧いただけます- https://github.com/sferik/twitter
AWS初心者によるAWS初心者のためのAWS環境自動化入門

#はじめに
AWS上の環境構築の自動化サービスについて、勉強していたのですが
どれがどういう役割なの？違いをわかりやすくまとめた記事があると便利だよな！と思い、記事にしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/7649c469-d3bc-7e42-f0b6-93a60c53cf8d.png)
[AWS 公式slideshareより抜粋](https://www.slideshare.net/AmazonWebServicesJapan/awswebinaraws-54198407)


##Elastic Beanstalk
サーバーからネットワークの設定まで、アプリケーションの開発に必要な環境をあらかじめ整えてくれています。
運用やコストの面でもサポートしてくれて、面倒な環境の構築は Elastic Beanstalk に任せて、コードを書くだけでアプリケーションを作成することができます。

- 開発言語は、Java / PHP / Python / Python(with Docker) / Node.js / Go / NET / Ruby
- アプリケーションをアップロードするだけで展開できる
- サーバーやストレージなどアプリケーションの状態をモニタリングしたり、OSとデーターベースの管理ができる
- モニタリングやセキュリティーに必要なパッケージのみ使用してくれるので、不要なコストを削減
- 複数のユーザーや企業が同じアプリケーションを共有し、各々でカスタマイズすることが可能

##AWS CloudFormation
ほとんどすべてのAWSのリソースの構築や設定を行えるので、最も自由度が高いサービスです。
クラウド環境内のすべてのインフラストラクチャリソースを記述して、事前準備するための共通言語を提供します。

- JSON フォーマットを使用して構成を記述
- CloudFormer を使用すると、現在の構成をJSONフォーマットに変換でき、構成のコピーや雛形の作成が楽に
- CloudFormation で作成したAWSリソースは、CloudFormation 以外の方法で変更してはいけない

##AWS OpsWorks
サーバーのパッチ適用、アップデート、バックアップが自動的に実行され
Chef や Puppet （あらかじめ用意しておいた設定ファイルに基づいて、サーバーのさまざまな設定を自動的に行うソフトウェア、設定管理ツール）のマネージド型インスタンスを利用できるようになる、構成管理サービスです。

- 独自の設定管理システムを運用したり、そのインフラストラクチャを管理しなくて良い
- サーバーのパッチ適用、アップデート、バックアップの自動化
- ソフトウェアの設定、パッケージのインストール、データベースのセットアップ、サーバーのスケーリング、コードのデプロイといった運用が自動化
- サポート範囲は、Amazon EC2 インスタンス、Amazon EBS ボリューム、Elastic IP、Amazon CloudWatch メトリクスなど、アプリケーション志向の AWS リソースに限られている

###Chef
ファイルに記述した設定内容に応じて自動的にユーザーの作成やパッケージのインストール、設定ファイルの編集などを行うツールです。
Chefでは「Cookbook（クックブック）」や「Recipe（レシピ）」と呼ばれる設定ファイルの再利用がしやすい構造になっている点が特徴。
Ruby と Erlang で記述。Chef はフランス語で言う「料理人」が由来になっており、その構成要素も料理をモチーフにして命名されたそうです。

###Puppet
サーバーの環境設定やインストールなどを自動化する設定管理ツール。
Puppet は Ruby で実装されており、各種操作の実行を行うためのフロントエンドであるpuppetコマンドと、各種機能を実装した Ruby ライブラリから構成されています。


#それぞれのサービスの適正
|| OpsWorks| CloudFormation  | Elastic Beanstalk |
|:----------:|:----------:|:-----------:|:------------------:|
|用途| アプリケーションのモデル化、デプロイ、設定、管理、および関連アクティビティ|アプリケーションのモデル化、デプロイ、設定、管理、および関連アクティビティ| インスタンス上のWEBアプリケーションの展開と管理を自動化|
|管理レベル|より詳細で高レベル。柔軟性があり、単純な構成も複雑な構成も対応| 環境の土台を作る|インフラ環境そのものを自動で展開したり管理するには不向き|
|自由度|ユーザー独自のChefのクックブックを使用できる。EC2がほぼ自由に設定可能|OSより下のレイヤーでは自由度が高い。JSON or YAMLで記述してコード化|プログラミング言語、Docker コンテナのプラットフォーム|
|構成|スタックやレイヤーといったコンセプトに基づく|5 種類のテンプレート要素で自由にスタックを構成。|主なサーバはApache / Nginx / Tomcat / IIS|
|需要者| 知識があり、運用に効率性・柔軟性がほしい|自分で好きなように管理モデルをカスタムしたい| 専門知識がない、とりあえずな環境が欲しい|

#所感
繰り返し高頻度で行われる環境構築や、デプロイの作業は自動化できたほうが確実に効率が良いですよね。
手作業によるミスや、長時間の作業の無駄を省くためにも、重宝するべきサービスだと思います。
どこまで詳細に設定する必要があるのかで、どれを使うか選べるのも良い点ですね。

#公式サイトリンク
[AWS 公式サービス別ガイド](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)
bashコマンドラインからSQLを実行する(Postgresql)

# やりたいこと

bashコマンドラインからいちいちpostgresqlにログインしないでコマンドを実行したい。
そのままshellスクリプトで投げたいなど。。。。

# psqlオプション(サンプル)

巷でみるecho の引数をシングルクォーテーションで囲ったものだとwhere句のシングルクォーテーションが機能しなかったのでダブルクォーテーションを使う方法にした。

下記サンプルは接続したDBの全テーブルのレコード数を取得するクエリ

```
echo "\c $DB_NAME \\\ select relname, n_live_tup from pg_stat_user_tables where schemaname='public';" |psql -U $USER_NAME -h $HOST_NAME
```