OmniAICreator/Qiita-1.07M huggingface dataset:
WeakReferenceの動作確認

JavaのWeakReferenceの動作を確認する。

```java
import java.lang.ref.WeakReference;
import java.util.WeakHashMap;

public class Main {

    static class Entry{
        private final String name;

        public Entry(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return name;
        }
    }

    public static void main(String[] args) {
        var val = new Entry("Hello");
        var ref = new WeakReference<>(val);

        System.out.println("ref: "+ val + ", weak-ref: "+ ref.get());

        System.out.println("gc");
        System.gc();

        System.out.println("ref: "+ val + ", weak-ref: "+ ref.get());

        System.out.println("e = null");
        val = null;

        System.out.println("gc");
        System.gc();

        System.out.println("ref: "+ val + ", weak-ref: "+ ref.get());
    }
}
```

実行結果は以下。

```
ref: Hello, weak-ref: Hello
gc
ref: Hello, weak-ref: Hello
e = null
gc
ref: null, weak-ref: null
```

ちなみに，
var e = "Hello";
でも同じ結果を期待したのだけれど，GCされずに残った。

```
ref: Hello, weak-ref: Hello
gc
ref: Hello, weak-ref: Hello
e = null
gc
ref: null, weak-ref: Hello
```

多分，コード自体が"Hello"を保持しているため，GC対象にならなかった可能性が高い。そこで以下のように明示的にnewすると同じ結果になった。

```
var e = new String("Hello");
```

StringでなくIntegerとかで試すときもvalueOfは勝手にキャッシュされるので注意は必要。
【Notch】AE＆C4Dユーザーが作るリアルタイムモーショングラフィックス #09 タイポグラフィ編

#キネティックタイポグラフィ
ライブ演出やMV、リリックビデオにおいて文字をモーションデザインの一部として使う演出の総称です。
モーションデザインにおいてこれが感覚的にできるということは非常に重要です。
結論から言うとかなり難しい
でも頑張ればそれなりにできる！

#Textノードについて
**「Textノード」**を使うことにより文字を描画することができます。
**「Text String」**に表示したい文字を打ち込みます。
厄介な点は事前にフォントファイルをプロジェクト内に読み込んでおかないとフォントが変えられないという点です。
![Typo01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/cbc78782-2359-03c7-9b81-8d7ed3d02842.png)
###※バグ発見　ver0.9.23時点
**「Letter Spacing Scale」**
キーフレームが打てるけどアニメーションしないパラメータ。ついでにModifierも繋げません。
トレイラーとかイベントOP映像とかで使えそうなパラメータなんですが。。。
（公式へバグ修正の要望送っておきました。）
![Typo07.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/09a69550-41ed-deea-c571-e8d118888ce9.gif)

#アニメーションをつけてみる
##作例①　 Deformerとキーフレーム
①**「Turbulence Deformer」**の影響値**「Blend Amount」**を最大値から0にするキーフレームを打つ
（ぐちゃぐちゃの状態からテキストの形へ変形）

②MaterialのWireframeをチェック

③Z軸のキーフレームアニメーションを打つ

④カーブエディタでいろいろイージングをいじいじ（[キーフレーム編参照](https://qiita.com/Shuhei_Maeta/items/fd96edc1dca838effec8)）

⑤「Mesh Emitter」を使用してParticleへ参照させる
![Typo05.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/9259a37b-48a5-a87d-2bc0-f08752630713.gif)
![Typo02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/edd21a62-51b7-19df-21ee-11678372f6f4.png)

##作例②　クローナーEffectorで制御
動きはクローナーを動かす機能である**「Effector」**を使用します。

簡単にいうと**「MoTextもどき」**ができます。
もちろんMoTextとMoGraaphエフェクターほど自由自在にはいかないですが。。。近いことはある程度可能だと思います。頑張れば。
![Typo06.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/8d8ba3ab-0d6d-ade0-8504-7d9c8141e1b9.gif)

①各種「**Effector**」を「Text」へ繋ぎアニメーション制御

②例のごとくキーフレームとイージングを調整
![Typo04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/aa540015-da34-eddd-7de9-c3c0b438e73e.png)

##作例③　クローナーEffector × Chunk Effector Deformer
作例②のように直接Effectorをつなげて制御できるのですが、
文字単位のモーションをつけるときの軸となるアンカーポイントが文字左下にあるようです。
文字の中心を軸としたい場合は**「Chunk Effector Deformer」**を使用することで解決できます。

**Chunk Effector Deformer**は1つのオブジェクト内で分かれているメッシュを別々のオブジェクトとして扱う場合に使用します。
つなぎ方は
「制御したいオブジェクト」→「Chunk Effector Deformer」←「Effector」

「Vertex Source Mode」を**「Chunks」**へ変更します
![Typo09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/138d7c1e-6d89-2ff3-da3a-52cd86707187.png)


###「Chunk Effector Deformer」なし
軸がおかしい
![Typo09.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/550a6bbe-e670-cbb5-4437-1f7be0d14b08.gif)

###「Chunk Effector Deformer」あり
軸が中心
![Typo08.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/a7375227-44bb-9d14-8e06-912b6bcfbb12.gif)


#次回
###シェイプモーション編　https://qiita.com/Shuhei_Maeta/items/45f95ac0b0dfcd890891
情報共有はこちらのグループで行っているのでぜひ参加してみてください。
Facebookグループ : https://www.facebook.com/groups/notchusergroupjapan/
Line オープンチャット : https://line.me/ti/g2/kJYmLLsvS2zNfR9PEiknMg

質問等あればお答えしますのでお気軽に
Twitter : https://twitter.com/shu1053
FB : https://www.facebook.com/profile.php?id=100009103327410
ユーザをsudoグループに追加

#sudoとは
    $ sudo (コマンド)
　　のようにコマンドの前に"sudo"を記述すると、コマンドをrootユーザー権限で
　　実行させることができる。
# ユーザをsudoグループに追加
　　下記のコマンドを実行すると<username>で指定したユーザをsudoグループに設定できる
　　

    $ usermod -G sudo <username>
Azure PipelineでAzure Web AppsのCI/CDをやってみる2

#0. はじめに
前回の記事の続き。
[Azure PipelineでAzure Web AppsのCI/CDをやってみる](https://qiita.com/piyo8810/items/4347a574163a69dd2fda)
前回の記事で、masterブランチにソースがコミットされたら、Azure Pipelineによって、自動でビルドからデプロイまで実行されるようになったはずなので、実際にやってみる。

#1. 開発環境
前回の記事と同じ。

#2. 自動ビルドの確認
ローカルのmasterにソースをコミットしたら、Azure pipelineによって自動でビルドされた。

以下の手順の通りに実施。
(1) Azure Pipelineにサインイン。
(2) 左メニューから「Repos」の「Files」を選択。
(3) 画面左上の「Clone」を選択。
(4) 表示されたブレード「IDE」のプルダウンから「Visual Studio」を選択。
(5) Visual Studioで、Cloneされたソースが開く
(6) Visual Studioでdevelopブランチを作成
(7) developブランチでソースを編集
(8) developブランチをコミット
(9) developブランチをリモートにプッシュ
(10) masterブランチにdevelopをマージ

この時点でAzure Pipelineがビルドを自動実行した。

#3. デプロイの確認
ビルドの成功を確認した後、Azure portalからWeb Appsを確認したら、ちゃんと修正が反映されていた。
すげぇ｡｡｡

#4. ハマったこと
ソースは、既存のGitHubのソースをAzure reposにインポートして使用していたのに、GitHubのソースをコミットしても反応がなかった。
「なんでやねん･･･」と思っていたが、どうやらzure Web AppsからPiplelineを作成すると、Azure reposのコミットをトリガーにするよう設定されていたようだ。
ていうか、前回Pipelineを作成するときに、GitHubを使うよう指定しなかったっけ｡｡｡｡
設定変えた記憶がない｡｡｡

#5. よくわかってないこと
自分でPipelineを自作した時と、Web Appsからpiplelineを作成した時では、Pipelineの編集画面が違うことに気づいた。
なんでや｡｡｡｡

とりあえず今日はここまで。
【Python/Django】JSON形式でレスポンスをするwebAPIを作成する

# 概要

　この記事は初心者の自分がRESTfulなAPIとswiftでiPhone向けのクーポン配信サービスを開発した手順を順番に記事にしています。技術要素を1つずつ調べながら実装したため、とても遠回りな実装となっています。

　前回の [Djangoのテンプレート機能を使ってみる](https://qiita.com/Ajyarimochi/items/9d64b13321f0779fc986)で作ったコードを改造して、JSON形式でレスポンスするようにします。Django Rest Frameworkという便利なフレームワークが存在しますが、まずは仕組みを理解するのを目的に Django Rest Framework 等は使わずに書いてみます。

### 参考
[Python Django入門 (6)](https://qiita.com/kaki_k/items/b76acaeab8a9d935c35c)


### 環境
Mac OS 10.15
VSCode 1.39.2
pipenv 2018.11.26
Python 3.7.4
Django 2.2.6

# 手順

* views.pyを修正
* 動作確認


### views.pyを修正

データをjson形式に変換するためにjsonのモジュールをインポートします。
コードに`import json`を追加します。

`json.dumps`を使って、構造体をインプットにしてjson形式の文字列を作成するプログラムを追加します。構造体を作るコードは元のコードの`params = { }`の部分をそのまま流用します。

json形式の文字列を作るコードを追加します。引数として構造体データの`params`を渡しています。
`json_str = json.dumps(params, ensure_ascii=False, indent=2)`

戻り値は、`HttpResponse`メソッドで単純にJson形式の文字列を返すだけです。
`return HttpResponse(json_str)`


修正後の`views.py`はこちらです。

```python:views.py
from django.shortcuts import render
from django.http import HttpResponse
import json #追加した

def coupon(request):
    if 'coupon_code' in request.GET:
        coupon_code = request.GET['coupon_code']
        if coupon_code == '0001':
            benefit = '1000円引きクーポン！'
            deadline = '2019/10/31'
            message = ''
        elif coupon_code == '0002':
            benefit = '10%引きクーポン！'
            deadline = '2019/11/30'
            message = ''
        else:
            benefit = 'NA'
            deadline = 'NA'
            message = '利用可能なクーポンが見つかりません'

        params = {
            'coupon_code':coupon_code,
            'coupon_benefits':benefit,
            'coupon_deadline':deadline,
            'message':message,
        }
        #json形式の文字列を生成
        json_str = json.dumps(params, ensure_ascii=False, indent=2) 
        return HttpResponse(json_str)
```


### 動作確認
コードを保存してdjangoのサーバを起動します。

ターミナルからcurlコマンドで`http://127.0.0.1:8000/coupon/?coupon_code=0001`にアクセスすると、jsonで値が取得出来ています。
<img width="633" alt="ami_coupon_api-test-curl-mask.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526594/2b50c841-0d64-ac9d-f404-2909fb24e529.png">


次はブラウザで`http://127.0.0.1:8000/coupon/?coupon_code=0001`にアクセスすると、json形式のデータが表示されました。
<img width="881" alt="ami_coupon_api-test-web.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526594/c2e817f6-98ea-987b-5e26-e10a54d89a65.png">


以上です。

次回は[クーポン情報をレスポンスするアプリ側の実装をします（swift）](https://qiita.com/Ajyarimochi/items/5a6e7a44d3fb2ab37f25)
Vue の忘れがちな事のメモ

# 値の変更をトリガーにしてタイマーセットする
値の変更を検知してタイマーセットする。
v-on などのイベントによらず、値変更がトリガーになるので適用範囲が広がる。

clearInterval を使ってリセットしないと、次の実行から interval 0 になる。

```javascript
var t; // timer
var timerRun; // timer status
var timerSet = new Vue({
  el: '#timer_obj',
  data: {
    message: '',
    icon: ''
  },
  methods: {
    icon_clear: function(){
      this.icon = '';
      this.message = '';
      timerRun = false; // done
    }
  },
  watch: {
    // triggered when changed
    icon: function(val){
      if (t && ! timerRun) {
        clearInterval(t) ; // reset interval 
      }
      if (val !== '') {
        timerRun = true;
        t = setInterval(this.icon_clear,3000); // method
      }
    }
  }
});

```

# コンポーネント間でやりとりする
- Props Down, Event Up
- emit を使う


### cf.
- [Vue.js最初の難関、「props down, event up」を初心者にわかるように解説してみた
](https://future-architect.github.io/articles/20200401/)
    - わかりやすい
- [VueコンポーネントのState管理を考える](https://user-first.ikyu.co.jp/entry/design-of-vue-and-vuex)
    - - [コンポーネント同士のやり取りどうするの？](https://scrapbox.io/vue-yawaraka/%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E5%90%8C%E5%A3%AB%E3%81%AE%E3%82%84%E3%82%8A%E5%8F%96%E3%82%8A%E3%81%A9%E3%81%86%E3%81%99%E3%82%8B%E3%81%AE%EF%BC%9F)


# computed はキャッシュする
- [算出プロパティの項目を参照](https://jp.vuejs.org/v2/guide/computed.html)
- computed 内で利用している data の変更に基づいて更新される
- methods は常に計算する
- getter に向いている

# Vue のエラー防止ルール

- [スタイルガイドの優先度A](https://jp.vuejs.org/v2/style-guide/index.html#%E5%84%AA%E5%85%88%E5%BA%A6-A-%E3%83%AB%E3%83%BC%E3%83%AB-%E5%BF%85%E9%A0%88-%E3%82%A8%E3%83%A9%E3%83%BC%E9%98%B2%E6%AD%A2
)
【Notch】AE＆C4Dユーザーが作るリアルタイムモーショングラフィックス #08 キーフレーム編

#気持ちいいアニメーションの追求
キーフレームやイージングにこだわることで気持ちのいいアニメーションを追求できます。
AEにはイージングの有料スクリプトがあったりしますが全部手打ち＆手動でベジエハンドルを調整する派です。

一方で、ランダムジェネ、オーディオリアクト、ライブカメラエフェクト等の一期一会な映像は非常に面白いなと思います。
Notchを使うことで気持ちいいアニメーションと一度きりの要素を複合、両立できてとても楽しい。

#Notchにおけるキーフレーム
パラメータの横の**「K」**というボタンがキーフレームを記録するボタンです。
押すと緑になります。
![キーフレーム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/307b65cd-8c33-18d3-ea67-6e7fc30a3bc0.png)

「K」ボタンがないパラメータはキーフレームが打てません。

Modifierも繋げません。
多用する「Shape3D」の固有パラメータは全滅です。悲しい。。。:disappointed_relieved:
![キーフレーム２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/7eca2a44-d85f-b57d-cd14-21f179227d23.png)

#キーフレームの属性
カーブエディタ（**F3**）で打ったキーフレームをいじいじします。
デフォルトはリニアなのでベジエハンドルがありません。
**「Key Interpolation」**からキーの属性を選びます。

###・ベジエハンドルによるイージング制御
**「Bezier 1D」**及び**「Bezier 2D」**でハンドルを出せます。
Bezier 1D・・・片方のみハンドルを表示
Bezier 2D・・・両サイドハンドルを表示
![キーフレーム3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/a91302c4-9a99-c7f6-aef9-4a40145d0266.png)
###例　カメライージングでカットを繋げる手法
イージングのスピード感を繋げることで異なるアニメーション、見た目のシーンへ迫力のあるカットチェンジをする
![Key01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/0c189df1-14f5-a548-7a35-790b63fee87c.gif)

###・ステップによる補完なし階段状キーフレーム
リニア、イージングどちらも不要なキーフレーム制御を使う場合**「Stepped」**を選択します。
![キーフレーム5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/4fc92bda-c43c-42ad-edc6-f1efc6535385.png)
###例「Select Child Node」を使用した子ノード切り替え
例えば以下の場合は**複数のカメラノードをキーフレームによって切り替え**ています。この場合**「Stepped」**が有効です。
![キーフレーム4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/2d30e8f9-a586-a578-b857-cbed1a39264b.png)
![Key02_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/cafdd46f-034f-1193-7595-479a02ea59d7.gif)


#キーフレームの繰り返し、オフセット
###「Curve Post Bihaviour」によるキーの動作設定
「Repeat」・・・キーフレームの繰り返し
「Offset」・・・イージングを保ちながら数値を追加し続ける　
![キーフレーム6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/348022b3-6bc5-e070-e479-9d8dd974934e.png)
![キーフレーム7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/ec500a03-b014-5b9e-5caf-c87b143b9ca1.png)
###例　クローナーオブジェクトの内側→外側をリピート
任意のキーフレームを手動で付け、Repeatモードにする。
複製して回転軸と時間をずらして交互にする。
![Key04.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/6e7f4806-0024-4d0b-9e9f-2651b1bf5ad0.gif)
![キーフレーム8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/626d3e25-20f1-6854-118b-1838d4c4bc9d.png)

#次回
###タイポグラフィ編 https://qiita.com/Shuhei_Maeta/items/9fb6834536baaddddf08
情報共有はこちらのグループで行っているのでぜひ参加してみてください。
Facebookグループ : https://www.facebook.com/groups/notchusergroupjapan/
Line オープンチャット : https://line.me/ti/g2/kJYmLLsvS2zNfR9PEiknMg

質問等あればお答えしますのでお気軽に
Twitter : https://twitter.com/shu1053
FB : https://www.facebook.com/profile.php?id=100009103327410
えっ？　Ruby で 0 / 0 == 0 + 0 ?


さて問題です。Ruby で以下の結果になるようにするには，どうすればいいでしょう。


```rb
puts "えっ？　Ruby で #{x} / #{x} == #{x} + #{x} ?"
# => えっ？　Ruby で 0 / 0 == 0 + 0 ?

puts x / x == x + x
# => true
```

ただし，`x` はローカル変数です。
外部ライブラリーは使いません。つまり，`x` の値は〈組込みクラスもしくは標準添付ライブラリーのクラス〉のインスタンスです。
クラスやモジュールに手は加えません。
メソッドの定義・再定義も行いません。


<details><summary>答えはここをめくってね</summary>
`require "pathname"; x = Pathname("0")`
</detail>
Javaのオブジェクトのサイズ感

Javaのオブジェクトのサイズ。間違いもありそう。

- reference
    - 4byte (32bit JVM or heapが32GB未満の64bit JVM)
    - 8byte (heapが32GB以上の64bit JVM)
- Object
    - 12byte (heapによらず）
- Array
    - 12byte (32bit JVM or heapが32GB未満の64bit JVM)
    - 24byte（heapが32GB以上の64bit JVM)

ただし，オブジェクトのサイズは8byteの倍数になるようにパディングされるので，オブジェクトの最小サイズは16byte

参考：Javaパフォーマンス, p.202
「リファクタリング 第2版」Swiftでコーディング その11

# 16頁 第1章 ボリューム特典ポイントの計算部分の抽出 volumeCreditsFor関数内変数名変更

## Swift版 main.swift

データ生成、結果表示付き。

```swift
import Foundation

makeData()

func playFor(aPerformance:Performance) -> Play {
    return plays[aPerformance.playID]!
}

func volumeCreditsFor(aPerformance:Performance) -> Int {
    var result = 0
    result += max(aPerformance.audience - 30, 0)
    if "comedy" == playFor(aPerformance: aPerformance).type {
        result += Int(aPerformance.audience / 5)
    }
    return result
}

func statement(invoice:Invoice, plays:Dictionary<String, Play>) -> String {
    var volumeCredits = 0
    var totalAmount = 0
    var result = "Statement for \(invoice.customer)\n"
    let format = NumberFormatter()
    format.numberStyle = .currency
    format.locale = Locale(identifier: "en_US")

    for perf in invoice.performances {
        volumeCredits += volumeCreditsFor(aPerformance: perf)

        result += "  \(playFor(aPerformance: perf).name): " + format.string(from: NSNumber(value: amountFor(aPerformance: perf) / 100))! + " (\(perf.audience) seats)\n"
        totalAmount += amountFor(aPerformance: perf)
    }
    result += "Amount owed is " + format.string(from: NSNumber(value: totalAmount / 100))! + "\n"
    result += "You earned \(volumeCredits) credits\n"
    return result
}

func amountFor(aPerformance:Performance) -> Int {
    var result = 0

    switch playFor(aPerformance: aPerformance).type {
    case "tragedy":
        result = 40000
        if aPerformance.audience > 30 {
            result += 1000 * (aPerformance.audience - 30)
        }
    case "comedy":
        result = 30000
        if aPerformance.audience > 20 {
            result += 10000 + 500 * (aPerformance.audience - 20)
        }
        result += 300 * aPerformance.audience
    default:
        print("error")
    }
    return result
}
 
let result = statement(invoice: invoices[0], plays: plays)
print(result)
```
「リファクタリング 第2版」Swiftでコーディング その10

# 15頁 第1章 ボリューム特典ポイントの計算部分の抽出

## Swift版 main.swift

データ生成、結果表示付き。

```swift
import Foundation

makeData()

func playFor(aPerformance:Performance) -> Play {
    return plays[aPerformance.playID]!
}

func volumeCreditsFor(perf:Performance) -> Int {
    var volumeCredits = 0
    volumeCredits += max(perf.audience - 30, 0)
    if "comedy" == playFor(aPerformance: perf).type {
        volumeCredits += Int(perf.audience / 5)
    }
    return volumeCredits
}

func statement(invoice:Invoice, plays:Dictionary<String, Play>) -> String {
    var volumeCredits = 0
    var totalAmount = 0
    var result = "Statement for \(invoice.customer)\n"
    let format = NumberFormatter()
    format.numberStyle = .currency
    format.locale = Locale(identifier: "en_US")

    for perf in invoice.performances {
        volumeCredits += volumeCreditsFor(perf: perf)

        result += "  \(playFor(aPerformance: perf).name): " + format.string(from: NSNumber(value: amountFor(aPerformance: perf) / 100))! + " (\(perf.audience) seats)\n"
        totalAmount += amountFor(aPerformance: perf)
    }
    result += "Amount owed is " + format.string(from: NSNumber(value: totalAmount / 100))! + "\n"
    result += "You earned \(volumeCredits) credits\n"
    return result
}

func amountFor(aPerformance:Performance) -> Int {
    var result = 0

    switch playFor(aPerformance: aPerformance).type {
    case "tragedy":
        result = 40000
        if aPerformance.audience > 30 {
            result += 1000 * (aPerformance.audience - 30)
        }
    case "comedy":
        result = 30000
        if aPerformance.audience > 20 {
            result += 10000 + 500 * (aPerformance.audience - 20)
        }
        result += 300 * aPerformance.audience
    default:
        print("error")
    }
    return result
}
 
let result = statement(invoice: invoices[0], plays: plays)
print(result)
```
Rails5.2でSendGridを使う

[Rails5.2で色々やってみる](https://qiita.com/lumbermill/items/5a94264eb3888bf0c133) という記事の続きで、メール送信機能を実装します。

![sendgrid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50780/8f4b6986-ef99-7153-b2c0-299e211a9eab.png)


まずは、railsコマンドでメーラの作成をします。

```bash
rails g mailer Notifications greet
:(省略)
```

greetというメソッドとテンプレート(textとhtml)が生成されています。今回は送信先のアドレスのみ引数として受け付けるように修正しました（その他はそのまま）。

```ruby:app/mailers/notifications_mailer.rb
  def greet(to)
    @greeting = "Hi"

    mail to: to
  end
```

メールの送信フォーム(mail1)と送信完了のページ(mail2)を作成します。

```ruby:config/routes.rb
  get '/mail1', to: 'pages#mail1'
  post '/mail2', to: 'pages#mail2'
```

コントローラ内の実装は以下のようになります。先に定義したgreetメソッドにメールの送信先を渡してそのまま配信しています。

```ruby:app/controllers/pages_controller.rb
  def mail1
  end

  def mail2
    @to = params[:to]
    NotificationsMailer.greet(@to).deliver_later
  end
```

対応するビューは以下のようになります。

```erb:app/views/pages/mail1.html.erb
<%= form_tag mail2_path do %>
  <% if flash[:error].present? %>
    <div id="error_explanation">
      <p><%= flash[:error] %></p>
    </div>
  <% end %>
    To:
    <%= text_field_tag :to, "", {placeholder: "smith@example.com" ,size: 60} %>
    <%= submit_tag 'Send email' %>
<% end %>
```

```erb:app/views/pages/mail2.html.erb
<p>Message was sent to <%= @to %></p>
<p><%= link_to 'Back', mail1_path %></p>
```

ローカルの開発環境(development)では実際にメールは送信されず、ログに送信されるメールが出力されますので、ここまでの設定でテストが可能なはずです。次にproduction環境にSendGridを設定します。SendGridのダッシュボードから秘密鍵を取得しておいてください。

```ruby:config/environments/production.rb
  ActionMailer::Base.smtp_settings = {
    :user_name => 'apikey',
    :password => Rails.application.credentials.sendgrid_secret_key,
    :domain => 'wiki.lmlab.net',
    :address => 'smtp.sendgrid.net',
    :port => 2525,
    :authentication => :plain,
    :enable_starttls_auto => true
  }
```

`sendgrid_secret_key`は以下のコマンドでcredentials.ymlを開いて書き込んでください（`master.key`の無い環境では読み書きできません、heroku環境でのRAILS_MASTER_KEYの設定方法については [Rails5.2でStripeを使う](https://qiita.com/lumbermill/items/5be5dee3bf646c07e47c)のおまけ欄を参照してください）。

```bash
EDITOR=vim rails credentials:edit
```
tsconfigで定義されたソースコード一覧の取得方法

ほぼ自分の備忘録用のTypeScript小ネタ。

TSのAPI使ったツール作ってるときに「ユーザーのtsconfig.jsonの内容に従って、プロジェクトのファイル一覧となる.tsのファイル名一覧がほしい」となったとする。要するに、tscコマンドを叩いたときにトランスパイルされるファイル群ってことなんだけど、この結果って `rootDir` や `files`, `exclude` などなどの値全部で決まるものなので、自前で頑張ると大体失敗する。

TSのCLIが使ってるのと同じAPI使えばいいわけで、下記のようにするとファイルの絶対パス一覧が取得できる。

```ts
import ts from 'typescript';

const res = ts.getParsedCommandLineOfConfigFile(
  'tsconfig.json',
  { },
  ts.sys as any,
);

console.log(res!.fileNames);
```

`res.options` とかすればparseされたCompile Optionsも取得できる。
【備忘録】PCのCPUの型番調べてみた(Macintosh, Windows)

##はじめに
自作PCの場合は、CPU単体で購入するので、
事前にスペック確認出来て良いですが、
既に出来上がっているPCだとそうもいきません。
そんな時、CPUの型番知りたいなと思って調べてみました。
備忘録として、やり方載せておきます。

##きっかけ
MacBookの場合、「Macについて」というメニューがあるのですが、
そこでは、CPUの型番は出てこなくて。。。
どんなCPUが積まれていて、性能を詳しく知りたいなと思い、
ターミナルで確認する方法に行き着きました。
##参考
以下のURLを参考にしました。
###Macintosh
『MacのCPUの型番や詳細情報の調べ方 | WebNexty』
https://webnexty.com/mac-cpu/
###Windows10
『バッチコマンドでシリアル番号やPCモデル、CUPの型番、OS情報を取得する方法 │ Web備忘録』
https://webbibouroku.com/Blog/Article/cmd-cpu-os-product

※尚、Windows10以外の環境で試していないため、Windows7でも同じコマンドが使えるかは不明です。

##CPUの型番の確認方法
###Macintoshの場合
ターミナルを開きます。
ターミナルを開いたら、以下のコマンドを入力します。

```:bash

sysctl machdep.cpu.brand_string
```

すると、以下のように結果が出ます。

```:shell-session
Intel(R) Core(TM) i5-2415M CPU @ 2.30GHz
```
これで、型番がわかりました。
ちなみに、CPUの情報は以下にあります。
『インテル® Core™ i5-2415M プロセッサー (3M キャッシュ、最大 2.90 GHz) 製品仕様』
https://ark.intel.com/content/www/jp/ja/ark/products/53449/intel-core-i5-2415m-processor-3m-cache-up-to-2-90-ghz.html

###Windows10の場合
Windows10の場合は、Macintoshのように、コマンドプロンプトでコマンド打たなくても、
設定›システム›バージョン情報という順番で進み、
プロセッサの欄で確認出来ますが、

コマンドだといろいろ出来ますし、何より、コマンドプロンプトを使いこなせるとカッコイイ！(そう思うのは自分だけかもしれませんがw)
WMI(Windows Management　Instrumentation) 
というWindowsの情報を管理しているところから取得します。
いろいろな情報が取得出来るようですが、
今回はCPU名のみ取得します。
気になった方は調べてみてください。
以下のコマンドを入力します。

```:bash
wmic CPU get Name
```

すると、以下のような結果が出ます。

```:shell-session
Name
Intel(R) Core(TM) i3-8100 CPU @ 3.60GHz
```
これで、バージョン情報に記載のCPU名と同じものが取得する事が出来ました。

##まとめ
今回、MacintoshとWindows10、それぞれでCPUの型番を調べる方法について、まとめてみました。
普段、どんなハードが載っているか、こと細かく気にした事がありませんでしたが、知っておくと、より良い開発出来るかなと思います。
気になった方はぜひ試してみてください。
Linuxでは、また調べ方が違うみたいなので、調べてまとめてみます。
.gitconfig でコマンド引数を使えるエイリアス登録をするにはシェル関数を定義すると良いらしい - #git tips

# .gitconfig

- シェルの関数で実現する
- エイリアスの中でだけ一時的に利用するシェル関数を定義する、名前はなんでも良いがここでは1文字のfとする
- 定義した後にすぐシェル関数 f を呼び出す
- f の後には何も記述しない、するとコマンド引数が暗黙的に git コマンドに渡される <- ここがポイント
- f は使い回し可能、複数のエイリアスで別の関数名をつける必要はない

git checkout <BRANCH_NAME> して Hello とか Wow とか標準出力する、特に意味のない例

```
[alias]
  checkout-and-say-hello = "!f() { git checkout \"$1\" && echo Hello; }; f"
  checkout-and-say-wow = "!f() { git checkout \"$1\" && echo Wow; }; f"

```

# Run


```
$ git checkout-and-say-wow master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
Wow
```

```
$ git checkout-and-say-hello master
Already on 'master'
Your branch is up to date with 'origin/master'.
Hello
```

# Ref

command - Git alias with positional parameters - Stack Overflow
https://stackoverflow.com/questions/3321492/git-alias-with-positional-parameters

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2897








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
git / gitconfig alias / use command argument

# .gitconfig

- Define temporary function. in this example "f"
- Will called soon temporary function without any args. because implicit used git command args.
- You can define same temporary function name like "f" multiple times. it will be not conflicted.

```
[alias]
  checkout-and-say-hello = "!f() { git checkout \"$1\" && echo Hello; }; f"
  checkout-and-say-wow = "!f() { git checkout \"$1\" && echo Wow; }; f"

```

# Run


```
$ git checkout-and-say-wow master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
Wow
```

```
$ git checkout-and-say-hello master
Already on 'master'
Your branch is up to date with 'origin/master'.
Hello
```

# Ref

command - Git alias with positional parameters - Stack Overflow
https://stackoverflow.com/questions/3321492/git-alias-with-positional-parameters

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2898








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
初心者によるプログラミング学習ログ 200日目

# 100日チャレンジの200日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

200日目は

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>200日目<br><br>udemyでcss+メディアクエリ、vue.js、webサイトコーディング<br>この休み中に、3つの講座やってます。2つぐらいおわりそうだから、もう1～2つぐらいやりたいな<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a> <a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1212156923543310336?ref_src=twsrc%5Etfw">December 31, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Raspberry Pi なら1ヶ月アップしておいても1ドル

Raspberry Pi のウェブサイトによれば、Raspberry Pi それぞれの機種の単ボードでの通常の電流消費（typical bare-board current consumption)は次の通りだそうです。

- Raspberry Pi 4 3W
- Raspberry Pi 3 2.5W
- Raspberry Pi Zero W 0.5W

ちなみに、40型相当LED電球の消費電力が4.1Wだとかだそうです。

他方で、日本における電力料金は、1kWh あたり 30円程度と見ておけば、現在ならお釣りが出る感じのようです。1000W を 1時間使うと 30円程度ということです。これを換算すれば、4.1W 程度を24時間使うと3円程度になります。30日程度すなわち1ヶ月程度使えば 100円、つまり1ドル程度です。

世界的に見ると、電力料金というのは、もちろん補助金の関係で（５割６割は数割のうち、という程度のセンスで）何割か程度のズレはありますが、それほど桁違いに変わるというものではないようです。

なので、とてもざっくりとした把握をするのであれば、「Raspberry Pi なら1ヶ月アップしておいても1ドル」と言えるのではないかと私は思います。
Angular HTTPでjson以外を受け取るときにERROR Parsingになる対処

恐らく少し調べれば分かる事なのですが、20分くらい戸惑ったのでメモ...
#エラー
```ts
this.http.get('http://hoge/fuga'.subscribe(data => {
      console.log(data);
    });
```
=>error Parsing
#解決

```ts
this.http.get('http://hoge/fuga',{ responseType: 'text' }).subscribe(data =>
{
      console.log(data);
    });
```

@angular/common/httpは標準でJSONとしてパースしようとするので、json以外の時はresponseTypeを
指定する必要があるらしい.
基本情報技術者試験の勉強計画　第11週（12/30週）

## 目標と結果
### 目標
・お正月であっても気を抜かない
・普段よりゆっくりできる日が続くので、先週より対策をやる週にしたい
・過去問道場の繰り返し
### 結果
・いつもよりはやらなかったが、一日10分程度は過去問を解くようにした。ただ、ゆっくりできる分気を抜いてしまったことが多々あった。
・過去問道場を解いた。
## 振り返り
### keep
・繰り返し同じ問題を解く
### problem
・睡眠時間を取りすぎない
### try
・できることを増やす
【Vue.js】ボタンの表示文字列を動的に変更するサンプルコード

## はじめに
Vue.jsを使って動的にボタンの表示文字列を変更するサンプルコードです。

親要素→子要素のデータの受け渡しを`属性`→`props`で行う方法を取っています。

## 環境
```yaml
OS: macOS Catalina 10.15.1
Vue: 2.6.10
vue-cli: 4.1.1
vuetify: 2.1.0
```
## 出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/fed5d886-a32b-7107-b119-3088bc217b29.png)

同じコンポーネントを使って、文字列だけを変更しています。

## コード

```vue:Wrapper.vue
<template>
  <v-row>
    <Button/>
    <v-spacer></v-spacer>
    <Button
      buttonName="サインアップ"
    />
  </v-row>
</template>

<script>
  import Button from './Button.vue'

  export default {
    name: 'Wrapper',
    components: {
      Button,
    }
  }
</script>
```

```vue:Button.vue
<template>
  <v-btn>
    {{ buttonName }}
  </v-btn>
</template>

<script>
  export default {
    name: 'Button',
    props: {
      'buttonName': {
        type: String,
        default: 'ログイン'
      }
    }
  }
</script>
```

`buttonName`に`default: 'ログイン'`を指定しているため、`Wrapper.vue`側では`buttonName="サインアップ"`だけ指定しています。

## おわりに
最後まで読んで頂きありがとうございました:bow_tone1:

どなたかの参考になれば幸いです:relaxed:
jsの>> 説明

アプリを作りたいと思いWEBに落ちているコードを参考にしていると、分からないコードがあったのでググったり動かしてみて分かった事を書いていきます。

結論

```
var x = 23
var x2 = x >> 1;
var x22 = Math.floor(x / 2);

console.log(x2 + ' , ' + x22)  //11 , 11
```


要するに
x >> p
と
Math.floor(x / 2**p)
は同じ値を返すということ
Railsでモデルから年齢の計算ロジックを別クラスに切り出す

Railsでモデルから年齢の計算ロジックを別クラスに切り出す方法です。

## 前提
誕生日のカラムを持つモデルが存在する
e.g. 
- User モデルの birthed_on カラム
- Employee モデルの birthed_on カラム

## 実装
Age というクラスを作成する

```ruby
class Age
  def initialize(birthed_on)
    @birthed_on = birthed_on
    @value = calculate
  end

  def ==(other_age)
    to_i == other_age.to_i
  end

  def to_i
    value
  end

  def to_s
    value.to_s
  end

  def inspect
    to_i
  end

  private
  attr_reader :birthed_on, :value

  def calculate
    current = Time.current.strftime('%Y%m%d').to_i
    birthed = birthed_on.strftime('%Y%m%d').to_i
    (current - birthed) / 10_000
  end
end
```

年齢の計算ロジックを切り出すモデルに composed_of を追加する

```ruby
# 例) ユーザモデル
class User < ApplicationRecord
  # 追加
  composed_of :age, mapping: [:birthed_on]
end

# 例) 従業員モデル
class Employee < ApplicationRecord
  # 追加
  composed_of :age, mapping: [:birthed_on]
end

# 例) 子どもモデル
class Child < ApplicationRecord
  # 追加
  composed_of :age, mapping: [:birthed_on]
end
```

確認

```ruby
pry(main)> User.find(1).update(birthed_on: Date.parse('1990-01-01'))
=> true
pry(main)> User.find(1).age
=> 30
```

以上です。
Node-RED uibuilder　で個人的にハマったところ

#はじめに
はじめまして、プログラミング歴1年にも満たない新人エンジニアです。

現在携わっているプロジェクトでNode-REDを使っているのですが、
そのNode-REDを使ってuiの作成をすることがあり、その際にuibuilderを使って作成しています。仕事で使用した際に、個人的にハマったところを中心に今回はまとめてみたので、よかったら参考にしてみてください。
#Node-RED　uibuilderの概要
ここでは基本的なことだけ書くので詳しくは[Node-RED uibuilderのgithub](https://github.com/TotallyInformation/node-red-contrib-uibuilder)などを参考にしてください。

- マルチユーザに対応したuiが作成できる
- デフォルトでvue.jsやbootstrapがインストールされており、別のライブラリのインストールも可能
- uibuilderノードでファイルの作成、削除が可能
- websocketでの通信の方法
  - リクエストの送信
`uibuilder.send({"key":value});`
  - レスポンスの受信`uibuilder.onChange('msg',function(newValue){
  });`

#個人的にハマったところ
####vue.jsを使わない場合のhtml
xmlをhtmlファイルに置く際に、vue.jsのインスタンスの中に入れられなかったので生のhtmlに置いて扱いました。その際に、ハマったことを書いときます。
#####uibuilderのフロントエンドは自動起動しない
これはuibuilder ver2.x以降に変更されたことらしいですが、`uibuilder.start()`を書いとかないとフロントエンドのライブラリは使えません。
デフォルトでvue.jsを使う際はすでに書かれているので、自分で書く必要はないため全然気にしていなかったのですが、生のhtmlで書く時や、デフォルのプログラムを消される際は注意してください。
#####サーバ起動時や接続時のリクエスト、レスポンスの方法
uibuilderノードには端子が二つ付いていて、上の端子が通常の通信時の処理を書き、下の端子はサーバの接続時や画面のリロード時などに行う処理を書きます。ただ、その際にmsg.uibuilderCtrlオブジェクトを削除する必要があります。削除しないとそのまま制御メッセージとして受け取られてしまうため、クライアントのリロード時や接続時にデータを渡すことができないので注意してください。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546084/bd045d98-d4cf-39bd-a42e-e2e8f7f6163b.png)

#####ライブラリインストール時のパス
uibuilderでライブラリをインストールし、htmlにrequireするときにパスを書く必要がありますが、そのパスもuibuilderで決まられたURLがあります。例えば、デフォルトで入っているvue.jsやbootstrapのインストールした際のローカルのパスだと`.node-red\node_modules\`直下にあります。しかし、htmlにrequireする際のパスは`../uibuilder/vendor/`となります。これはuibuilderノードのShow Detailed Informationに書いてあるので、ライブラリをインストールしてrequireする際はそちらを参考にしてみてください。

＊ちなみに、仕事ではクラウド上でNode-REDを使っているのですが、ローカルのNode-REDだと普通に見れたのですが、なぜか作業用のほうだとこのShow Detailed Informationのページが開けませんでした。なので、確認する際はローカルのNode-REDを起動して確認するのをおススメします。
#おわりに
私が個人的にNode-REDのuibuilderを使っていて、詰まったところを中心に今回まとめてみました。~~調べればわかることだしそもそもマイナーなことを書いているので~~参考になるかわかりませんが、少しでもお役に立てればというのと、普段dashboardを使ってる方に少しでもuibuilderに興味を持ってもらえればと思います。
Ubuntu 19.10 (Eoan)にDocker環境構築

# 概要
Ubuntu 19.10 (Eoan)にDocker環境を構築します。

# 手順
### 1. リポジトリの追加

基本的には下記オフィシャルのドキュメントの通りに進めます。パッケージからではなくてリポジトリからインストールする方法を取ります。
Get Docker Engine - Community for Ubuntu
https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-using-the-repository

#### 古いバージョンの削除
```shell
$ sudo apt-get remove docker docker-engine docker.io containerd runc
```
#### 必要なパッケージとGPGキーのインストール
```shell
$ sudo apt-get update
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```
verifyは省略します。

本来ならば次に

```shell
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
```
でリポジトリを追加するのですが、Ubuntu 19.10 (Eoan)用のリポジトリが存在せずにエラーになります。
https://github.com/docker/for-linux/issues/833
仕方がないのでUbuntu 19.04（Disco Dingo）用のリポジトリを追加して、オフィシャルドキュメントの続きを実行します。

```shell
$ sudo bash -c 'echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu disco stable" > /etc/apt/sources.list.d/docker-ce.list'
```
### 2. Docke engineのインストール
```shell
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
```
sudoなしでdockerを実行できるようにする

```shell
$ sudo usermod -aG docker $(whoami)
```
一旦再起動します。

### 3. 動作確認
```shell
$ docker info
```
### 4. docker-composeのインストール
バージョンはここで確認します。
https://github.com/docker/compose/releases

```shell
$ sudo curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
```
Python 仮想環境の概要と作成方法

# Pythonの仮想環境
仮想環境について、よくわからないまま使用していたため調べてみた。
本記事では、仮想環境とは何か、どうやって作成するのかを簡単に説明する。

## 仮想環境って何？
簡単に言うと、**プログラムを動かす空間**のこと。
この空間にさまざまなライブラリをインストールして使えるようにする。

## なんで仮想環境を作るの？
「ライブラリ同士の干渉」「ライブラリとフレームワークの相性の悪さ」といった問題を解決するため。
#### 仮想環境がないと...
- 仮想環境なしでフレームワークやライブラリを使用した場合、ライブラリ達が1箇所にどんどん追加されていく。
- 結果、複雑なライブラリ同士が干渉してうまく機能しないことがある。

#### 仮想環境を利用すると...
- 「python3.x系の機械学習用の仮想環境」「python2.x系の分析用の仮想環境」のように、好きにpythonのバージョンを選び、使うフレームワーク・ライブラリを選択することが可能になる。
- 結果、ライブラリ同士の干渉などの問題を回避できる。

## pythonの仮想環境の種類は？
- venv
- vertualenv
- conda

など。
今回は **venv** を用いた仮想環境の作成方法を以下で説明する。

## Pythonの仮想環境を使う方法/venv
venvは、Python3.4以降だとすぐに使える。
pythonのバージョンを確認するコマンドは以下。

```
$ python -V
```

### venvで仮想環境を作成する
下記コマンドで作成できる。

```
$ python -m venv ****
```

仮想環境を作成すると、作業ディレクトリに仮想環境のファイルがセットされる。
下記コマンドで確認できる。

```
$ ls -la
```

次に、下記コマンドで、作成した仮想環境を有効化する。

```
$ source ****/bin/activate
```
MySQL で The server quit without updating PID file というエラーが出た時

## mysqlが起動しない
mysqlを起動しようとコマンドを打ったところ、エラーが発生した。

```
$ sudo mysql.server start
Starting MySQL
.. ERROR! The server quit without updating PID file (/usr/local/var/mysql/****.local.pid).
```
## 原因
エラーログを確認。

```
$ sudo tail -f /usr/local/var/mysql/****.local.err | grep ERROR 
2019-12-31T18:01:14.011891Z 0 [ERROR] [MY-010274] [Server] Could not open unix socket lock file /tmp/mysql.sock.lock.
```

## 解決
lock fileを削除。

```
$ sudo rm -rf /tmp/mysql.sock.lock
```

その後起動すると...

```
$ sudo mysql.server start
Starting MySQL
.. SUCCESS! 
```
起動できました！
GO言語のGUIライブラリ「Fyne」のインストール方法

#はじめに
参考書を一通り読み終わり、
「さぁこれから本格的にコードを書いて勉強だ！」
「どうせなら何か適当にGUIのライブラリでも入れて楽しく勉強しよう！」
と思い、紆余曲折ありながらFyneというライブラリをubuntuに入れました。

入れるのに3日もかかってしまい、正直めっちゃ辛かったです笑
※私が色々試して実行できた方法なのでもしかしたら必要のない工程があるかもしれません。

#前提条件
・vmware　(virtualboxよりも滑らかに動くと思う、個人的に)
・ubuntu-ja-18.04.3　(https://www.ubuntulinux.jp/download/ja-remix)
※メモリは2G以上、プロセッサ数2 に設定

#1.アップデートや必要なものを入れる
```
$sudo apt-get -y update
$sudo apt-get -y upgrade
$sudo apt -y install git
$sudo apt -y install vim
```
#2.goのインストール
・(https://golang.org/dl) からリンクをコピー

```
$wget https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz
```

・解凍

```
$sudo tar -C /usr/local -zxf go1.13.5.linux-amd64.tar.gz
```

・末尾にPATH=$PATH:/usr/local/go/binを追記

```
$vim .bashrc
```
![erve.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474440/fc99caa8-d18e-048d-894e-465e67a156aa.png)

・環境変数を適用

```
$source .bashrc
```

・goのversion確認

```
$go version
go version go1.13.5 linux/amd64
```

#3.Fyneを入れる準備


```
$sudo apt install build-essential
$sudo apt-get - y install libasound2-dev libglu1-mesa-dev freeglut3-dev mesa-common-dev xorg-dev libgl1-mesa-dev git-all
$sudo apt-get -y install libegl1-mesa-dev libgles2-mesa-dev libx11-dev
$sudo apt -y install libglfw3-dev
```

ここでいったん再起動
#4.ようやくFyneのインストール！
・Fyneのインストール  (https://github.com/fyne-io/fyne)

```
$go get -v fyne.io/fyne/...
```

・ディレクトリ作成&サンプルダウンロード

```
$cd
$mkdir golang
$cd golang
$git clone https://github.com/fyne-io/examples.git
```

・サンプル実行

```
$cd examples
$go run main.go
```

・実行結果！
![aervawrevwr.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474440/c85a6b6a-6f9d-665c-26a5-4f94bee0ef1e.png)
Examplesウィンドウから項目を選択することでサンプルが実行される。

#終わりに
ということでubuntuにFyneをインストールしました。
これで楽しくGO言語の勉強ができます！

間違っているところがありましたらご指摘お願いします。

ここまで読んでいただきありがとうございました！！
年末ジャンボ 全国自治宝くじ 第818回 当選判別シート

# はじめに
宝くじをバラで購入したけど、確認が大変だったので作りました。
Google Spreadsheetで作成したのでダウンロードしてからご利用ください。
さっくり作ったので致命的な不具合があればコメント下さい。
上部の数値を変更する事で他の回でも流用も可能です。

# 使い方
組と番号を入力すると同じ行に○(当選)または×(非当選)が表示され、上部にカウントされます。
組の先頭が0から始まっている場合は0を省略して入力してください。
例：組が07 → 7
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536625/5ea9b653-9828-6605-e510-740a19301337.jpeg)



# 利用にあたっての注意事項
本シートによって生じた、不都合や不利益に関しては責任を負いかねます。予めご了承ください。

# ダウンロードはこちら 
[全国自治宝くじ 第818回 当選判別シート](https://docs.google.com/spreadsheets/d/1xCoPN5WBhoU5XUBfUBoA3_xOdshooVo7nVE-bM3DKC4/edit?usp=sharing)
kintoneのAPIで別アプリからqueryで取得したJSONデータの処理方法

#kintoneで別アプリからAPI経由でデータを取得して処理する
##処理イメージ
新規で作るkintoneアプリに、テーブルを設け、別アプリ（マスターデータ登録アプリ）から、ステータスが「使用中」のものだけを引っ張ってきて、新規アプリのテーブルにデータを突っ込む。テーブルの行数は引っ張ってきたデータの件数に依存するが、随時増やす。

##REST APIを使う
kintone関係のサイボウズのページを検索すると、REST APIを使うように書いてあるのだが、戻り値はJSONで返ってくる、と書いてある。JSONで返って来たデータを、巧いこと処理してテーブルに突っ込んで行かなくてはならないのだが、サイボウズのページには

```JavaScript:sample.js
console.log(record);
```

みたいなlog出力のサンプルしかなくて、戻り値のJSONをどう処理するべきか、というのに非常に苦労したので、ここに書いておく。

###検索条件の設定
まず、検索してデータを引っ張ってくるので、その検索条件を書く。一応、順番に並べる必要があるので、「ソートキー」というフィールドを作ってあって、そこに並び順を設定している。この辺の検索条件の設定の仕方はサイボウズkintone関係のページにたくさん書いてある。ちなみに件数は後でfor文を回すためにonにしてある。

```JavaScript:sample.js
var body = {
    "app": 27, //検索しに行くアプリのアプリID
    "query": 'ステータス in ("使用中") order by ソートキー asc',
    totalCount: true
    };
```

###REST APIの実行
検索条件を設定したら、実際にREST APIで検索を実行して、データを引っ張ってくるわけなのだが、引っ張って来る方法も、サイボウズkintone関係のページには書いてある。ただし、注意点があって、

**検索する処理と検索結果をなんとかする処理を別に書かずにpromiseでひとつにして書く**

という部分は注意が必要。

```JavaScript:sample.js
// 別アプリからレコード用データを取得
// promiseで書かないと取得と処理が同時に走るので注意
kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body).then(function(resp){
    return resp;
}, function(error) {
    console.log(error);
}).then(function(resp){
    // 取得したレコードの処理
    var records = JSON.stringify(resp);
    var results = JSON.parse(records);
    // データを作成
    var makeDataLineResult = makeDataLine(events, results, results['totalCount']);
});
```

###取得したデータの処理
取得したデータの処理は別関数にして処理させている。上記で言うと、'makeDataLine()'なのだが、取得した件数を元に、基本は繰り返し処理。

```JavaScript:sample.js
// 取得したデータを元にして処理
function makeDataLine(event, results, counts){
    for(var i=0; i<counts; i++){
        addRow(i, results);
    }
    deleteRow();
}
```
最初に書いたが、今回は取得してきたアプリで、取得してきたデータをテーブルに突っ込んでいるので、以下のような感じ。ちなみに「dataSheet」というのは、データを突っ込んでいるkintone詳細画面上のテーブルの名前。

```JavaScript:sample.js
// 行追加
function addRow(i, results){
    const record = kintone.app.record.get().record;
       
    record.dataSheet.value.push({
        value: {
            "No":{
                value: i+1,
                type: 'SINGLE_LINE_TEXT',
            },
           "間隔":{
                value: results['records'][i]['作業間隔']['value'],
                type: 'SINGLE_LINE_TEXT',
            },

// --- （中略と解説） ---
// 引数で渡す前にparseしたresultsの配列にはrecordsという形で情報が入っているので、そこに順番を示す「i」をつけて、
// 検索に行った先の「フィールド名」と「value」をつければ、値が取れる。
// typeに定義するのは、情報を格納するテーブルのフィールド形式。

          "メモ":{
                value: '',
                type: 'MULTI_LINE_TEXT',
           }
        }
    });
    kintone.app.record.set({record: record});
}
```

ちなみに、データを書き込むアプリには予めテーブルが定義されていて、1行目にはデータを突っ込めないので、最後に消す。便宜上、データシートのナンバリングに「0」を定義しておく。

```JavaScript:sample.js
// 1行目を消す関数
function deleteRow(){
    const record = kintone.app.record.get().record;
    const targetRowNo = 0;
    record.dataSheet.value.forEach(function(row, i){
        if(row.value.No.value === '0'){
            record.dataSheet.value.splice(i,1);
        } 
       kintone.app.record.set({record: record});
    });   
}
```

まとめると、REST APIで戻ってきたJSONをstringifyして、parseした上で、for文で回せばvalueがとれますよ、と。
LIFFを更新してもAndroidでは反映されない問題に対処

# 概要
LIFF(LINE Front-end Framework)でとあるサービスを開発している際、ページ内容を更新しようとすると、Androidではキャッシュされしまい更新されなくなってしまった。
# 方法
LIFFのエンドポイントに適当なクエリパラメータを指定し、ページを更新するたびに値を変えれば良い。
## 例
<img width="619" alt="スクリーンショット 2020-01-01 2.40.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464913/b3dbf95b-9e23-38fc-5e39-0a451f7d5413.png">
123を124とかに変更すると更新される。
# 余談
まともなLIFFのサービスってあるんですかね。知ってる人いたら教えてください。開発中って人も、
「文言」でレンダリング-ハートを描く(畫心)その2実践編

## はじめに
[前回](https://qiita.com/libru1/items/cab9b997ecd532052b0c)レンダリング素材作成の為VsCode Extentionをインストールしました

この記事ではv0.1.3になり増えたサンプルdraw_heart.wy(畫心)でハートを描きます

## 実行
公式のレンダリングをみると

![screenshot01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334227/a5ec29b8-7829-5b28-c680-f544c8016202.png)

原稿上部に赤い文字が、左ページには絵のような物がレンダリングされています。
mandelbrot.wy(曼德博集)の実行結果のようです。

v0.1.3になりReadMeにレンダリングコマンド実行例とレンダリング結果が載りました

```sh
wenyan examples/turing.wy --render --title 圖靈機
```
mandelbrot.wy(曼德博集)ではありませんが、美しくレンダリングされています

まずは、draw_heart.wy(畫心)を実行

```sh
$ wenyan examples/draw_heart.wy
```
<img width="598" alt="Screen Shot 2019-12-31 at 15.54.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334227/985f5f91-89b6-2ee8-dceb-0fcdd5545069.png">


標準出力に見事に文字列でハートが書かれています

次は、ReadMeの例に則りレンダリングしてみます

```sh
$ wenyan examples/draw_heart.wy --render --title 畫心
xxxxxxxx/examples/draw_heart.svg
```

出力されたsvgファイルのパスを確認し、開きます
<img width="793" alt="Screen Shot 2019-12-31 at 9.16.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334227/3a3bb27e-0930-056d-e8d6-bb69c0df34f9.png">

ソースはバッチリレンダリングされていますが、結果が含まれません。
また、上部の赤い文字もありません

実行結果をテキストファイルに保存しレンダリングしてみます

```sh
$ wenyan examples/draw_heart.txt --render 
xxxxxxxx/examples/draw_heart.000.svg
xxxxxxxx/examples/draw_heart.001.svg
xxxxxxxx/examples/draw_heart.002.svg
xxxxxxxx/examples/draw_heart.003.svg
xxxxxxxx/examples/draw_heart.004.svg
```
な、なんと連番を持った5つものsvgファイルが作成されました
↓　draw_heart.000.svg
<img width="793" alt="Screen Shot 2019-12-31 at 9.26.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334227/57f56ab0-8162-0b0c-8006-facc9027a61d.png">

ずれていて、ハートには見えません。
何か文字を小さくするか、罫線なしオプションとかあるのでしょうか

## おわりに

テキストファイルもレンダリング出来ることがわかりましたが、思うような見栄えには出来ませんでした
僕がエディタやターミナルを半透明にする理由

バクダンくんだよ。投稿が年を越してしまって申しわけわけ。

今回は僕のライフハックの一つを紹介するのだ。8割型個人の主観的体験に基づくので、ご自身のスタイル・体質等と照らし合わせて参考にしてくださいな。


# 半透明ウィンドウの可能性

最近の大抵のエディタやターミナルには、ウィンドウを半透明にするという機能があります。多くのサイトでは「作業中に後ろのテキストが読めて便利」といった形で紹介されているやつ。みなさんは活用していますか？

「かっこいいだけでしょ？」「半透明にしたら文字見にくくならない？」といった声も聞こえてきそうですが、うまく活用すれば作業の集中力を最大化することができるのです。

そう、最大化……さいd……

**はい！**
<img width="640" alt="20334.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42867/dba3d510-397f-94be-fac8-450545d5481e.jpeg">
**サイドチェストォォォ！！**

いやまって帰らないでこっちは一応真面目なんだ。


# 半透明ウィンドウの裏で動画を流すということ

確かに、エディタを半透明にすると、後ろのウィンドウが透けてカッコいいのは良いにしても、エディタの文字は読みにくくなります。特に背景が文字の場合、前景の文字とごっちゃになってしまってダメダメです。

でも、試しに動画を全画面で流し、その上に半透明のエディタ/ターミナルを全画面にして重ねてみます。
するとどうでしょう。作業中ちょっと集中力が途切れても、

人は動いている物に目が惹かれる
↓
画面が動いているので思わず見る
↓
そこにはエディタ/ターミナルがある
↓
自然な流れで作業が始まる

というカラクリにより、作業に集中し続けられるようになるのだ！
いやホントだって。

文字が読みにくい問題については、

動いている物→背景
動いていない物→前景

という見分けができて案外問題無いことがわかります。
でもさすがにコメントはオフにしましょ。


# 背景動画に適した動画の条件

とはいえ、多くの動画はやはり気が散ってしまいます。というか散りました。
良い作業用BGMならぬ作業用BGVにはいくつかの条件があるようです。

1. 十分に長いこと
2. 五月蝿くないこと
3. 動画の内容に興味が無いこと

要件1に関しては作業中ずっと流し続けられるぐらいの長さが必要というだけです。

要件2については、画面が激しく点滅するような動画、騒がしい動画・生放送はやはり気が散るので良くないということです。

大事なのは要件3で、BGVとしては内容に気を取られすぎないぐらい興味の無い動画である必要があるのですが、全く興味の無い動画を漁るのもそれはそれでたるいわけです。


# おすすめ動画

というわけで、僕が色々試した中で有効だったものを紹介してみます。

もちろん個人の趣味もありますので、自分に合ったものを探す方が良さそうです。あなたのオススメを見つけたらコメントでお教えくださいな。


## （既に観たことのある）アニメ

アニメ好きな人なら、既に見たことのあるアニメを流すのが良いでしょう。既に内容を知っているので興味も控えめ、というわけです。
特に日常系アニメなら激しい動きも少なく、また癒やし効果もあるのでおすすめです。

年末年始などはいろいろなアニメの全話一挙放送が行われているので、試しにそれを利用してみてはいかがでしょ。


## 音楽PV

音楽好きで、普段から音楽を聞きながら作業している人なら音楽PVのプレイリストを垂れ流すのも良いでしょう。

特に、大量に無料で公開されているVOCALOID曲のPVなどは動きの少ないほぼ一枚絵の動画だったりすることも多くておすすめです。
いい感じのプレイリストを探すのが面倒な方は、[僕が毎日日替わりでボカロ曲を100曲聴いてた話](http://www.bakudan.farm/blog/20160405/211946)を参考にすると良いのではでは？

なお、長時間音楽を聞き続けると耳を痛めるので、なんとか聴こえる程度の音量にしておきましょう。


# 各環境でgVimを半透明にする方法

ところで今思い出したのですが、この記事は[vim3 Advent Calender](https://qiita.com/advent-calendar/2019/vim3)の22日目の記事なのでした。というわけでここからは各環境のgVimでウィンドウを半透明にする方法をまとめますぞ。

なお、gVimの起動時から半透明にしたい場合は、`GUIEnter`以降のタイミングで設定する必要があるのでご注意を。


## Windows

WindowsのgVimの場合、[VimTweak](https://github.com/mattn/vimtweak)プラグインを入れれば`:VimTweakSetAlpha <number>`コマンドで0～255の範囲で不透明度を指定できるようになります（255が不透明）。

また、`+kaoriya`なgVimなら`transparency`オプションが追加されており、同様に不透明度を設定できます。


## Mac

MacVimなら`transparency`オプションが追加されております。こちらは0～100の範囲で透明度を指定します（0が不透明）。

しかし、macOSの場合、フルスクリーンにしたアプリの前に別のアプリを重ねることができないため、残念ながら上の画像のようなスタイルで作業するのは難しそうです。ざんねん。
何か良い方法を知っている方はお教えください。


## Linux

Linuxの場合はスペックやデスクトップ環境などに大きく左右されるのでなんとも言えませんが、`transset`コマンドが使える場合があるようです。

gvimrcあたりで

```vim
command! -nargs=1 Transset call system('transset --id ' . v:windowid . ' ' . <q-args>)
```

のようなコマンドを定義しておけば、`:Transset 0.85`のようにして半透明化できます。お試しあれ。

僕が使っているLinux Mint (Cinnamon)では`transset`が効かないようですが、Cinnamonの機能？で、ウィンドウのタイトルバー上でマウスホイールを回して半透明にしたり、キーボードショートカットで透明度を変更したりできるようにする設定があります。探してみてください。


# まとまれ

「作業中に音楽を聴くか否か」と同じように、人によって動画の有り無しどちらが良いか、どんな動画が良いかなどは変わってくると思いますが、僕はこのスタイルが一番長時間集中できます。嘘だと思って一度試してみてはいかがでしょ。
PythonでABC102のA~C問題を解く

### はじめに
[前回](https://qiita.com/taxfree_python/items/fdcc2bdac8e67fe277b5)からratedコンテストには出てないので進捗はないです。
今回は解説を読んでCまで解けました。
深夜に書いてるので、日本語間違えてるかもです
###A問題
[問題](https://atcoder.jp/contests/abc102/tasks/abc102_a)

**考えたこと**
nは入力値
何を考えずに解いたので、nが偶数の時を考慮していなくてWAがでました。nが偶数のときは必ずnになるので、

```python
n = int(input())
if n % 2 != 0:
    print(n*2)
else:
    print(n)
```
です。
###B問題
[問題](https://atcoder.jp/contests/abc102/tasks/abc102_b)

**考えたこと**
入力された数列をソートして最大値から最小値を引けばいいので、

```python
n = int(input())
a = list(map(int,input().split()))

a.sort(reverse=True)
print(abs(a[n-1]-a[0]))
```
abs()は絶対値を返す関数

###C問題
[問題](https://atcoder.jp/contests/abc102/tasks/arc100_a)
またARCかよ、ふざけんな

**考えたこと**
各項を最小にするようなbを決定できれば後は計算できるので、bの値を求めようとした。
bの値の範囲が分らなかったので、とりあえず最大値を取って計算させてみた

```python

n = int(input())
a = list(map(int,input().split()))

d = 0
c = []
for b in range(-max(a),max(a)+1):
    for i in range(0,len(a)):
        d += abs(a[i]-(b+i+1))
    c.append(d)
    d = 0
print(min(c))
```
TLEしました。そりゃそう。
計算数を減らすためにbの範囲を絞ろうとしたけどうまくいかなかったので、[解説](https://img.atcoder.jp/arc100/editorial.pdf)を見ることにしました。
なるほど、中央値を取ればいいのかということで実装

```python
n = int(input())
a = list(map(int,input().split()))

b_l = []
for i in range(0,len(a)):
    b_l.append(a[i] - (i+1))
b_l.sort()
b = b_l[n//2]
ans = 0
for i in range(0,len(a)):
    ans += abs(a[i] - (i+1+b))
print(ans)
```
中央値を取るという考えかたが分れば実装はするだけでした。
これは、自分で気付けた問題だったので精進します。

###まとめ
前回のCよりは簡単だと思ったので、解きたかった。

[参考にした記事](https://qiita.com/nomikura/items/ce0bfc9fd9c8f985409b)
Windows10のDockerToolBoxをアップデートする

WindowsでDockerを利用するには [Docker For Windows] (https://docs.docker.com/ee/docker-ee/windows/docker-ee/) がありますが、Windows10 Pro ではなかったり、既存のプロジェクトが Vagrantを利用している等で [Docker For Windows] (https://docs.docker.com/ee/docker-ee/windows/docker-ee/) を利用できないため [DockerToolBox](https://docs.docker.com/toolbox/toolbox_install_windows/) を利用している方もいると思います。

これを利用している時に、Dockerのバージョンを上げようと思いアップデートしようと思いましたがアップデートするための方法が見つからなかったため方法をメモします。

結論だけ書くと検索しても方法がなかなかでてきませんが、再インストールするだけで可能なようです。

## 既存のDockerをアンインストールする
既存の登録されているイメージ等は全て削除されますので必要に応じて、[docker save](https://docs.docker.com/engine/reference/commandline/save/) 等のコマンドでバックアップを取っておきます。
（※ 怖い場合は復元ポイントとか用意しておくとよいかも）

Windowsの場合は コントロールパネル → プログラム → プログラムのアンインストール から Docker をアンインストールします。

念のため再起動します。

## Dockerをインストールする
[Install Docker Toolbox on Windows](https://docs.docker.com/toolbox/toolbox_install_windows/) を参考に 公式の [Github](https://github.com/docker/toolbox/releases) から最新の .exe をダウンロードしてインストールします。

## 結果
コマンドでDockerのバージョンを確認します。

```
$ docker version                                                                                                        Client:
 Version:           19.03.1
 API version:       1.40
 Go version:        go1.12.7
 Git commit:        74b1e89e8a
 Built:             Wed Jul 31 15:18:18 2019
 OS/Arch:           windows/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.5
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.12
  Git commit:       633a0ea838
  Built:            Wed Nov 13 07:28:45 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
```

バージョンが 2019-12-31 時点での最新になっていますのでこれで完了です。