OmniAICreator/Qiita-1.07M huggingface dataset:
VEGAの構文 まとめメモ

以下が公式のサンプルプログラム。
これを基にまとめていく。

```json:Pie_Chart_Example.json
{
  "$schema": "https://vega.github.io/schema/vega/v5.json",
  "width": 200,
  "height": 200,
  "autosize": "none",

  "signals": [
    {
      "name": "startAngle", "value": 0,
      "bind": {"input": "range", "min": 0, "max": 6.29, "step": 0.01}
    },
    {
      "name": "endAngle", "value": 6.29,
      "bind": {"input": "range", "min": 0, "max": 6.29, "step": 0.01}
    },
    {
      "name": "padAngle", "value": 0,
      "bind": {"input": "range", "min": 0, "max": 0.1}
    },
    {
      "name": "innerRadius", "value": 0,
      "bind": {"input": "range", "min": 0, "max": 90, "step": 1}
    },
    {
      "name": "cornerRadius", "value": 0,
      "bind": {"input": "range", "min": 0, "max": 10, "step": 0.5}
    },
    {
      "name": "sort", "value": false,
      "bind": {"input": "checkbox"}
    }
  ],

  "data": [
    {
      "name": "table",
      "values": [
        {"id": 1, "field": 4},
        {"id": 2, "field": 6},
        {"id": 3, "field": 10},
        {"id": 4, "field": 3},
        {"id": 5, "field": 7},
        {"id": 6, "field": 8}
      ],
      "transform": [
        {
          "type": "pie",
          "field": "field",
          "startAngle": {"signal": "startAngle"},
          "endAngle": {"signal": "endAngle"},
          "sort": {"signal": "sort"}
        }
      ]
    }
  ],

  "scales": [
    {
      "name": "color",
      "type": "ordinal",
      "domain": {"data": "table", "field": "id"},
      "range": {"scheme": "category20"}
    }
  ],

  "marks": [
    {
      "type": "arc",
      "from": {"data": "table"},
      "encode": {
        "enter": {
          "fill": {"scale": "color", "field": "id"},
          "x": {"signal": "width / 2"},
          "y": {"signal": "height / 2"}
        },
        "update": {
          "startAngle": {"field": "startAngle"},
          "endAngle": {"field": "endAngle"},
          "padAngle": {"signal": "padAngle"},
          "innerRadius": {"signal": "innerRadius"},
          "outerRadius": {"signal": "width / 2"},
          "cornerRadius": {"signal": "cornerRadius"}
        }
      }
    }
  ]
}
```
公式のURL：https://vega.github.io/vega/

#signals
グラフを操作するラジオボタンやリストを定義。
bindすることでレンジであれば、値の範囲などを指定できる。
#data
データセットを定義する。
transformではロードするデータとその処理方法を定義する。

データをそのまま書き込む場合はサンプルのようにdataのvaluesの中。データごとに一意のidが勝手に割り振られる。

urlを指定することでデータセットをロードできる
formatを指定してない場合は、行指向のjson形式と見なされる。

#scales
ビジュアルエンコーディングを行う部分。
データ値（数値、日付、カテゴリなど）をピクセルや色、サイズにマップする。
#marks
実際のグラフの形を定義する。
scalesで定義した色や、signalsで定義したグラフ操作の変数などを使用して組み立てていく。


それぞれで定義した変数は、グローバル変数のように使用できる。



ひとまず簡単にまとめてみた。
詳細に追々付け足していく予定。
QuestへのビルドがUnity2019.1.4f1で通らなかったお話（解決）

何てことないことでしたが、調べた限り同様のこと書いてる人見当たらないand困ってる人見かけたのでメモ。
#現象
Unityのコンソール上では、

`Build completed with a result of 'Succeeded' `


というログが出るのに、
Questで該当アプリを開いてもホーム画面に戻される。

#やったこと　
OtherSettings のGraphicsAPI をVulkan から、AutoGraphicsAPIに変える。
mysql2 のgemがない？トラブルシューティング


## 経緯
コントローラの作成を行おうとしたところ、mysql2のgemがないとのエラーが起こった。


```terminal
$ rails g controller tweets
#=>よくあるエラー
Could not find gem 'mysql2 (= 0.5.2)' in any of the gem sources listed in your Gemfile.
Run `bundle install` to install missing gems.
```

Gemfileにリストされているどのgem sourcesにもmysql2（= 0.5.2）が見つかりません。
足りないgemをインストールするために `bundle install`を実行してください。
とのこと。言われたままにやってみる

```
$ bundle install

Fetching mysql2 0.5.2
Installing mysql2 0.5.2 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

An error occurred while installing mysql2 (0.5.2), and Bundler cannot
continue.
Make sure that `gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'`
succeeds before bundling.

```

・・・だめだ

## 解決方法

この場合、以下のようにすることでmysql2をインストールできます。

```
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"
$ bundle install --path=vendor/bundle
```

正しくインストールされました！

```
$ bundle show | grep mysql2
  * mysql2 (0.4.5)
```
Step Function から Invokeする LambdaFunction のバージョンは明示的に指定した方が良い

## 概要

* SAM などで Lambda Function 群を一斉にデプロイするケースの場合、 State Machine から Invoke する LambdaFunction のバージョンは明示的に指定したほうが良い

という話です。

## 実現したい要件

Step Function の呼び出し先の一群の Lambda Functions 達を一斉にデプロイする場合、デプロイの前後で有効になっているバージョンを厳密に切り替えたい。

## 前提

以下のようなアーキテクチャの場合を前提にしてます:

* Step Functions で一群の Lambda Function 達をオーケストレーションしている
* SAMなどを使って Step Functions の Node (Lambda Function) を同時にデプロイする

## Lambda Function をバージョン指定せずに Invoke する場合

以下のいずれかに該当する場合です:

* デプロイ時に Lambda Function のバージョンがインクリメントされない
* State Machine でバージョン指定せずに invoke している

（以降では簡単のため、デプロイの前後でバージョンがインクリメントされない場合も旧いコードを Ver.1, 新しいコードをVer.2 と表記します。）

このようなアーキテクチャで `sam deploy` を実行したとすると、
デプロイ中に State Machine が invoke された場合、個々のLambda Functionはどのバージョンが呼び出されるかわかりません。
したがって、Ver.1 のコードと Ver.2 のコードが混在する状況が考えられます。

これだとアプリケーションの振る舞いが不確定になってしまうので、デプロイ前後でイベント伝搬を停止する必要が生じてしまいます。
これはすなわちサービス停止を意味します。

![no_versioning.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239145/74f48ed6-6f96-cb69-2328-94f73a20ceb0.png)

## 解決策: Lambda Function のバージョン指定して Invoke する

呼び出すLambda Function のバージョンを明示的に指定すれば、新旧のコードが混在することがないので、アプリケーションの振る舞いは確定的になります。
したがってサービスを止めることなくデプロイができます。

![versioning.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239145/9d67c410-085a-1514-93be-dec18a35111f.png)

## 具体的な設定方法

デプロイツールに AWS SAM を使っている場合、具体的な設定方法は以下です。

* SAM で Lambda Function の AutoPublishAlias パラメータを有効にする
* State machine 定義の Lambda Function の ARN をバージョンまで指定する

これを、

```yaml:template.yaml(変更前)
!GetAttr YourLambdaFunction.Arn
```

こうします。

```yaml:template.yaml(変更後)
Globals: 
  Function: 
    AutoPublishAlias: yourTag
```

```yaml:template.yaml(変更後)
!Ref YourLambdaFunction.Version
```

## 今後の課題

今後の課題として、以下があります:

1. Blue-Green Deploy のように、直前までうまく動いていた環境にすぐに切り戻せるようにしたい
2. Lambda Layer を利用している場合も適切に切り替えたい

1について、

これは Lambda の Alias を利用すれば実現できるかもしれません。
State Machine と Lambda Function を別々にデプロイする必要はありそうですが。

2について、

Lambda Layer を利用している場合、Step Function を invoke した時点では、どのバージョンの Lambda Layer が有効になるかコントロールできないため、別の方法で新旧の系切り替えが必要になります。

例えば、デプロイごとに StepFunction, Lambda Layer, Lambda Function といった一連のリソースを **毎回 Immutable に生成する** ような方法が考えられます。

これらの課題については、良い方法が実現できたらまた別の機会に書こうと思います。

## 参考

* [AWS Serverless Application Model (SAM) - Referencing Lambda Version & Alias resources](https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#referencing-lambda-version--alias-resources)
WTFormsでSelectのOptionに任意のattributeを付ける

# やりたかったこと、解決方針
WTFormsで`select`に`placeholder`を付けたかった。
Bootstrapを入れているので単に`option`に`class="hidden"`を入れれば良いが、htmlは`wtf.quickForm`を使いたかったので、Formクラスでなんとかならないかを調べた。
調べた結果Fieldクラスを作らないとダメそうだったので、どうせならclass属性だけじゃなくなんでも入れられるようにしたくなった。

# 環境
* python 3.6.7
* WTForms 2.2.1
* flask-Bootstrap 3.3.7.1

# ソース
`WTForms.SelectField`と`WTForms.widgets.Select`を拡張した

```python:field.py
from flask_wtf import FlaskForm
from wtforms import SelectField
from wtforms.widgets import Select, HTMLString, html_params

# WTForms.widgets.Selectを拡張
class SelectHasAttributesOption(Select):
    def __call__(self, field, **kwargs):
        kwargs.setdefault('id', field.id)
        if self.multiple:
            kwargs['multiple'] = True
        if 'required' not in kwargs and 'required' in getattr(field, 'flags', []):
            kwargs['required'] = True
        html = ['<select %s>' % html_params(name=field.name, **kwargs)]
        for val, label, selected, render_kw in field.iter_choices_with_render_kw(): # 追加：render_kw 変更：iter_choices_with_render_kw
            html.append(self.render_option(val, label, selected, **render_kw)) # 追加：**render_kw
        html.append('</select>')
        return HTMLString(''.join(html))

# WTForms.SelectFieldを拡張
class SelectHasAttributesOptionField(SelectField):
    widget = SelectHasAttributesOption()

    def iter_choices(self):
        for value, label, *_ in self.choices:
            yield (value, label, self.coerce(value) == self.data)

    def pre_validate(self, form):
        for v, *_ in self.choices:
            if self.data == v:
                break
        else:
            raise ValueError(self.gettext('Not a valid choice'))

    def iter_choices_with_render_kw(self):
        for value, label, *render_kw in self.choices:
            render_kw = render_kw[0] if render_kw else {}
            yield (value, label, self.coerce(value) == self.data, render_kw)
```

# 使い方
`SelectField`の代わりに`SelectHasAttributesOptionField`を使い、`choices`のタプルにrender_kw的に辞書を追加する。

### ソース
```python
from flask_wtf import FlaskForm
from .field import SelectHasAttributesOptionField

class TestForm(FlaskForm):
    select = SelectHasAttributesOptionField(
        'ラベル', 
        choices=[
            ('', '選択して', {'class': 'hidden'}), 
            ('1', '1'), 
            ('2', '2')
        ]
    )
```

### 実行
初期表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321322/3f0b4d95-da0f-c3e7-6d29-bd00ebd09104.png)
選択肢にplaceholderは表示されない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321322/9dce8f4b-361a-1b8b-c94c-45b744ce70ec.png)
SCIMに関する質問です。

はじめてのQuiitaを使用しますので、投稿の方法がわかりません。
すみませんが、SCIMにについて、
質問がありますので、Quiitaの皆様はごぞんじすれば教えてください。
GET　User Methodでは、
あるSP (例：Seculio) のユーザ（A/B/C)から、IDP（DB)にそのユーザ（A/B/C)を取得したい場合、どうすればよいでしょうか。

よろしくお願いします。
WordPress 投稿が反映されない

## WordPress : 新規構築時の設定不足
環境　　　
- mac
- Vagrant CentOS7
- WordPress5.2.1 

Vagrant にて CentOS7 を構築後 WordPress をインストールしたけれど・・・

新規投稿が　予約投稿　になり反映されない。

WordPress管理画面 -> 一般設定 
タイムゾーンは UTC+9 設定済み

ターミナルから **date**
日本時間が表示される ( OK )

php.ini を確認
vi /etc/php.ini
検索
/time.zone 
date.timezone = "Asia/Tokyo" 設定済み( OK )

念のため ターミナルから
php -r "echo date('Ymd H:i:s');" 
日本時間が表示される ( OK )

なんらかの時刻がらみの設定がわるい・・・locale?

そこで

```
[root@centos75 webdimension]# timedatectl
      Local time: Wed 2019-05-29 19:02:47 JST
  Universal time: Wed 2019-05-29 10:02:47 UTC
        RTC time: Wed 2019-05-29 10:02:47
       Time zone: UTC (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
```

Time zone: UTC (JST, +0900) このへんかな？と思い、

```
[root@centos75 webdimension]# timedatectl set-timezone Asia/Tokyo
[root@centos75 webdimension]# timedatectl
      Local time: Wed 2019-05-29 19:03:55 JST
  Universal time: Wed 2019-05-29 10:03:55 UTC
        RTC time: Wed 2019-05-29 10:03:55
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
```

Time zoneがかわった！
WordPressで投稿を作りなおしたら通常の動きになりました。
サーバーの設定不備でした。
IE11は、SVGのpath要素のd属性を勝手に書き換えるから気をつけろ

たとえば、以下のようなSVGがありました。

```svg
<svg id="item" xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
  <path d="M10,10,C20,20,40,20,50,10"/>
</svg>
```

この中のpath要素をJavaScriptで処理したい。d属性値を取得してみます。

```JavaScript
document.getElementById('item').querySelector('path').getAttribute('d')
//-> M10,10,C20,20,40,20,50,10
```
と思うよね。

ところが、IEは違いました。
> M 10 10 C 20 20 40 40 40 20 50

ファッ!? カンマ区切りはどこにいった？！

どうやら、IE11はお行儀が悪くて、**d属性値を勝手に書き換える癖**があるようです。（~~バカらしいので~~他のIEバージョンは確認していません）
カンマを消して、スペースを挿入するようです。それが彼の流儀なんでしょうか。

ニッチなのか、検索しても情報は少ないものの、この事象に遭遇して困惑している人もやはりいました。
https://stackoverflow.com/questions/21769692/ie11-strips-commas-from-my-svg-xml-attributes

このスペースで区切る書き方自体はSVGの仕様に則っているようです。
ただ、上記stack overflowでコメントしている人が言う通り、**書かれている文字列を書き換えていいというわけではない**。

全てのウェブサイト制作発注者に告ぐ。
そろそろIEをサポート対象から外す勇気を持て。
Android Studioでプロジェクトに必須なプラグインを設定する

Android プロジェクトで Code Style を統一するために必ず **Reformat Code** をかける運用にしたいため、[Save Actions](https://github.com/dubreuia/intellij-plugin-save-actions) のようなプラグインを使用することになると思います。
しかし、新しいメンバーがこのプラグインを導入を忘れてしまったりすることもあるので、できるだけプラグインの導入を強制したくなります。Android Studio ではプロジェクトに必須なプラグインを設定できるため、その方法を紹介します。

### Android Studio でプロジェクトに必須なプラグインを設定する

必須プラグインを設定したいプロジェクトを Android Studio で開き、**Android Studio -> Preferences** で Preferences 画面を表示します。
この画面の左側ペインの **Build, Execution, Deployment** から **Required Plugins** を選択し、+ボタンからプロジェクトで必須にしたいプラグインを追加します。

<img width="898" alt="スクリーンショット 2019-05-31 13.29.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16508/440486e6-29d7-d3ea-1e0f-d65ab0da0d07.png">

このように設定することで、 _.idea/externalDependencies.xml_ ファイルが作成されるため、これを Git リポジトリの管理対象となるようにしてください。

今回の Save Actions プラグインの場合、プラグインの設定が _.idea/saveactions_settings.xml_ ファイルに出力されているため、合わせてこちらも管理対象にしておくとよいでしょう。

### 必須プラグインがインストールされていない場合

上記のように設定したプロジェクトを、必須プラグインがインストールされていない環境で開くと、下図のようなポップアップでインストールを促してくれるようになります。

<img width="360" alt="スクリーンショット 2019-05-31 13.24.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16508/3222d5af-2b31-bad9-ec1a-2e7d7ba57917.png">
wikiextractorの結果のゴミ処理

# 目的
<doc>タグやテーブルタグの残骸を除去し、改行を保存した状態（一行ずつWord2Vecで学習するため）で出力したい。

# ソース
```
wiki_clean.py

if __name__ == '__main__':
    # WikiExtractorの出力結果を１ファイルにまとめたファイルを読み込む
    with open('wiki.txt', 'r') as fr:
        wiki_text = fr.readlines() 
        fr.close()

    # 全テキストリスト
    all_text = []

    # 除去ロジック
    for line in wiki_text:
        # docタグと空行の除去
        if line == '\n' or line.startswith('<doc') or line.startswith('</doc'):
            continue
        # テーブル部分の除去
        if line.count('||') > 4:
            continue
        # colspan部分の除去
        if line.__contains__('colspan='):
            continue
        all_text.append(line.rstrip())
    
    # 保存
    with open('wiki_clean.txt', 'w') as fw:
        fw.write("\n".join(all_text))
        fw.close()
```

# 終わりに
適当に書いたコードなので汚い
実はもっと楽な方法があるのではと思ってしまう
ハマりメモ: Nuxtでcreate-nuxt-appでいきなりエラー。Error: SyntaxError. Unexpected identifier

# Nuxtでcreate-nuxt-appでいきなりエラー

先日、タイトルの件で、ハマったのでメモ。
結論から言うと、bootstrap-vueを組み込んでプロジェクトを立ち上げるとエラーになる。
bootsrap-vueにエラーがあるので、バージョンを指定すればなおりました。bootstrap
使う人多いと思うのであげておきます。

## エラー発生
Nuxtを立ち上げようと


```
$ npx create-nuxt-app hogehoge
```

様々選んで、プロジェクトのディレクトリに移動して、


```
$ yarn dev
```

とるすると、、ブラウザにエラー画面が出てくる。

Error: SyntaxError. Unexpected identifier


## 解決策を探す

なんの根拠も無いのに、NuxtとNodeのバージョンの相性では無いかと思い込んで、様々なパーターンを試していました。

全然解決せず、ググり続けて２日ほど、githubにIssuが上がりました。

https://github.com/nuxt/nuxt.js/issues/5822

package.jsonのbootstrap-vueのバージョンをrc.20に固定する。


```javascript：package.json
- "bootstrap-vue": "^2.0.0-rc.21"
+ "bootstrap-vue": "2.0.0-rc.20",
```

```
$ npm install
```

エラー解決です。


## 振り返り

私はプログラミング初級者です。
Webプログラマになりたいと思い、３８歳なのに、妻子がいるのに、仕事を辞めて勉強しています。

よくよく考えてみれば、bootstrap-vueがおかしいんじゃないかと言う所まではissueが上がる前に気づけました。


その時点で、bootstrap-vueのバージョンを変えてみたりするべきでした。次は自分がissueを上げてみたいです。

初級者にとって、出だしでつまずくのは本当に悲しいですが、結果的には、Nuxtの公式ドキュメントを沢山読んだりと勉強になりましたので良かったです。
特定のカラム名を持つテーブルを探す on MySQL

株式会社オズビジョンのユッコ (@terra_yucco) です。
今日は何番煎じかわかりませんが、件名の通り。

# SQL

```sql
select table_name, column_name
  from information_schema.columns
 where column_name = '<column name>' and table_schema = '<database name>';
```

# カラム名が特定できない場合

例えば今回は IP アドレスを見たかったのですが `ip`, `src_ip`, `ip_addr` などまあ色々入り混じっています。なので like を使って関連も取得しました。
この場合最終的には出力結果の目検が必要 (`description` とかが引っかかる) ですが、幅を広げて確認できます。

```sql
select table_name, column_name
  from information_schema.columns
 where column_name like '%<column name>%' and table_schema = '<database name>';
```
Cloval~みんなでオシャレになるサービス~

### 成果物の紹介記事です
-----
# Cloval
サイトURL
cloval.xyz

テストユーザのログイン情報はサインインページに記載してあります

## サービスのコンセプト

みんなでコーディネートを投稿し、評価し合いオシャレになることを目指すサービス　<br>
このサービスの強みは以下 <br>

- オシャレ度という数値化できないものをユーザ間で評価し合うことによって可視化する
- ecサイトや著名な人、Wearなどと組み合わせることによって、スケールアップを期待できる。以下に例を挙げる <br>
 - 人が投稿したコーディネートから商品を購入できる
 - 著名人に評価を依頼することにより、宣伝効果を期待できる

### トップページデモ

![トップページ.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374226/6b5a2fd9-475f-a6aa-d1b7-1a7bb92b8267.gif)

## 主な機能
### 評価機能について
ユーザは二通りの方法でコーディネートを評価できる

#### いいねをする
- いいねをつけることにより、後から自分がいいねしたコーディネートをマイページで確認できる


![いいね機能.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374226/7013b193-bc86-363a-38ba-7d0462b5a887.gif)


####点数をつける
- 評価点に対して、ユーザにスコアを追加。スコアに応じてユーザのランクの設定。 
- コーディネートごとに評価値をもち、評価値の平均を閲覧することができる。
![点数.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374226/87aa0528-5ee7-f96d-8ae3-ff7feb4cc81a.gif)


### ユーザ登録機能
ユーザはパスワード、メールアドレスを登録してログインする


## 今後追加したい機能

### タグ機能

- ユーザはコーディネート投稿時にタグを追加できる
- タグでコーディネートを検索できる

### コメント機能
- コーディネートを評価する時、同時にコメントを残すことができる。それにより、著名人にコメントしてもらえる等の宣伝ができる。実際にお金があれば、著名人を雇うことにより、サービスを価値のあるものにできる(限定何名とかで)。
日高屋1000円ガチャ作ってみた

巷で流行っているサイゼリヤ1000円ガチャ。これは@marusho_summers氏が
作ったwebアプリで、サイゼリヤのメニューの中から自動で1000円以内のメニュー
提案してくれるというもの。  
[サイゼリヤ1000円ガチャをつくってみた(Heroku + Flask + LINEbot)](https://qiita.com/marusho_summers/items/a2d3681fac863734ec8a)

これを見た瞬間に思った。日高屋バージョンが欲しい。
僕は同僚と仕事帰りに日高屋でちょい飲みをして帰ることがよくある。
日高屋バージョンがあれば盛り上がるに違いない。  

ということで作ることにした。


# 作り方
## ソースコード
幸いなことに本家の作者はライセンスをMITにしてくださっており、
ソースの再利用は可能である。 僕がすべきことは[日高屋ホームページ](http://hidakaya.hiday.co.jp) から
メニューの情報を仕入れ、データベースに格納するのみ。 

一応、色とか文字とかちょっと変えた。

## 環境
構築環境は本家同様(というか自分はほんとにメニュー情報をDBに突っ込んだだけ。)

- Heroku
- Flask
* SQLAlchemy(SQLite)  

## こんなのできました。
<img width="633" alt="スクリーンショット 2019-05-31 0.26.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427622/8d67885d-0e70-d09e-f289-8b2849f38330.png">

https://hidakaya.herokuapp.com/get

ほんとにサイゼリヤ1000円ガチャまんまです。 
@marusho_summers氏ありがとうございます。　　
 
メニューがサイゼに比べて少なめという点が残念です。
ちょい飲み日高も追加すればもう少し増えて楽しいかもしれないです。

# 感想
僕も時間があれば一からなにか作りたいです。

これを機にいろんな亜種ガチャ増えないかな、、、笑
Javascriptで電卓を作ろう　第6回　バックスペースを押した時の不具合を直そう。

# 目次
[第1回 HTMLとCSSでボタンを横並びで配置しよう](https://qiita.com/rikimaru914/items/3412df78570b48b25858)

- HTMLのマークアップ
- CSS

[第2回　四則演算をやってみよう](https://qiita.com/rikimaru914/items/a30d83c43a4eb14ba999)

- Javascriptで四則演算
- 6)打った数字をコンソールに出力させよう。
- 7)打った数字と記号を変数に格納しよう。
- 8)計算結果を出力させよう。
- 8-1）「＝」を押した時の処理
- 8-2) 計算結果と計算途中を、計算結果の画面に表示させよう。

[第3回　連続で演算記号や小数点が押された場合の不具合処理](https://qiita.com/rikimaru914/items/8df2124165afd036b922)

- 最初に「＋　÷　－　×　＝」が押せないようにする。
- 二回連続で計算できるようにしたい。
- Cボタン（リセットボタン）を押した時の処理
- BS(バックスペース）ボタンを使えるようにする

[第4回　小数点を正しく入力できるように改善しよう](https://qiita.com/rikimaru914/items/61154567fa02f1d7a156)

- 12.12.や12..12のように小数点を間違って入力できてしまう。
- 電卓と同じように「.4」と入力したら0.4としたい。

[第5回　演算記号を連続して押した時の不具合を直そう](https://qiita.com/rikimaru914/items/21b3e4532f0de41db9a6)

[第6回　バックスペースを押した時の不具合を直そう（今回の記事はここ）](https://qiita.com/rikimaru914/items/0a97bfa685620f16cd5b)

[第7回　「4 ÷ 3 = 1.33333333333333333」の表示桁数を10桁にしたい](https://qiita.com/rikimaru914/items/c3f23aa65f4be780d6ff)

[第8回　「電卓と同じ表示画面を目指そう](https://qiita.com/rikimaru914/items/b4076b2673014034076c)

#BS（バックスペースキー）を押した時の不具合を修正しよう。
現在BSで文字を消した時、各mode(小数、整数モード)、各状態（最初、計算中、記号入力モード）が切り替わらない。
【例】
「2 + 0.4」を計算したい時に、間違って「4」を入力し、BSで消した後に「.4」を入力したとする。
「2」「+」「4」「BS」「.」「4」「=」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320736/05ba7a03-3d0c-cddc-56fb-67903f2d1289.png)
このようになってしまう。
このプログラムは、記号を入力した直後に「.4」と入力すると「0.4」となるように組んでいるが、一度「4」が入力された時点で、記号入力状態から、数値入力状態に変更されているため、BSを押しても、数値入力状態としてプログラムが動くからである。
そこで、BSを押し削除した場合、残った文字列の最後が何かで判断する。
最後の文字が演算記号ならstateを演算記号入力中calBtに変更
残った文字が一文字もない場合はstateをstartにする。

```javascript
  //BSボタン（バックスペース）を押した時の処理
  const bs = document.getElementById('bs')
  bs.addEventListener('click', () => {
    if(state ==='finish') {
      return;//計算後は、bsを押せない。
    }
//      一文字目から、最後から二文字目までをtotalに代入（最後の一文字を除きtotalに代入する）     
    total = output_sub.textContent.slice(0, -1);
    output_sub.textContent = total;
    
    let lastWord = output_sub.textContent.slice(-1)
    if(lastWord==='+'||lastWord==='-'||lastWord==='*'||lastWord==='/') {
//bsを押し、最後の文字が演算記号ならstateを演算記号入力中calBtに変更
      state = 'calBtn'
    }else if(lastWord==='') {
//bsを押し、文字が空ならstateを最初startに変更
      state = 'start';
    }    
  });
```
Windows wgrib2 メモ


メモです

### wgrib2

以下からwgrib2をダウンロード
[Index of /wd51we/wgrib2/Windows_64](https://www.ftp.cpc.ncep.noaa.gov/wd51we/wgrib2/Windows_64/)

DLLが必要になるので合わせてダウンロード
自分の環境では以下で動作しました。

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/a4193773-38a6-2c98-8684-70a9deae8bdd.png)



### gdal

[DownloadingGdalBinaries – GDAL](http://trac.osgeo.org/gdal/wiki/DownloadingGdalBinaries)



### topojson

GoeJSONをTopoJSONに変換する

```
npm install -g topojson
```





```js
var prev = ctx.globalCompositeOperation; //現在の設定を保存
ctx.globalCompositeOperation = "destination-in"; //globalCompositeOperationを destination-in に設定
ctx.fillStyle = "rgba(0, 0, 0, 0.90)"; //canvasを塗りつぶす。 0.9の値を変えると軌跡の見え方（長さ）が変わる
ctx.fillRect(0, 0, canvas.attr("width"), canvas.attr("height"));
ctx.globalCompositeOperation = prev; //globalCompositeOperationを元に戻す
```

globalCompositeOperationの仕様
[globalCompositeOperation プロパティ - Canvasリファレンス - HTML5.JP](http://www.html5.jp/canvas/ref/property/globalCompositeOperation.html)
CakePHP 2.xx > PHP5.x → PHP7.2　Fatal error


メモです。やり方解説ではありません。

## Lib

```shell-session
Fatal error: Cannot use 'Object' as class name as it is reserved in \lib\Cake\Core\Object.php on line 26
```

cakephpのGitからソースをダウンロードし、最新のLibに入れ替える

[cakephp/cakephp at 2.x](https://github.com/cakephp/cakephp/tree/2.x)


## Theme

Error: ThemeController could not be found.

Error: Create the class ThemeController below in file: app/controllers/theme_controller.php

```php
<?php
class ThemeController extends AppController {
    var $name = 'Theme';
}
```
シンプルにmodule.exports

### 一番簡単なmodule.exports

jsのcall backの中身をexportして見ようと思ったのですが、思いの外簡単なやり方が見つからなかったので、簡単メモです。

exportするobjectを作ります。

```js:hell.js
var hell={
}
module.exports=hell
```

上のobjectにstringを戻す関数を書きます。

```js:hell2.js
var str
var hell={
getStr=function(){
str="hell"
return str
}//fun
}
module.exports=hell
```
"hello world"なのですが、"hell"の方が短いのと、プログラミングはhell（地獄)です。
次にhellをgetします。

```js:get.js
var tmp=require("./hell")
console.log (tmp.getStr())
```

```
node get.js
```
`output`hell

"hell"が出力されます。
functionを書かずに、objectから直接stringを取り出す方法はこれです。

```js:hell3.js
var str
var hell={
str:"hell"
}
module.exports=hell
```

```js:get.js
var tmp=require("./hell")
console.log (tmp.str)
```

```
node get.js
```
`output`hell

無事stringが取り出せませした。
Git ブランチとマージ　自分用メモ

#ブランチって何？
並行して複数機能を開発するための仕組み
ほかの人の変更に影響を受けずに自分の開発を行える。

##ブランチの仕組み
その前にGitのデータの持ち方を確認

リポジトリ
1. 各ファイルの圧縮ファイル index.htmlの圧縮ファイルA
2. ツリー `git commit`によって作成される。コミットしたときのスナップショット。「index.htmlはこの圧縮ファイルですよ」という情報）
3. コミットファイル　`git commit`によって作成される。コミットについての情報（ツリー、作成者、日付、コミットメッセージ）
　tree ツリー1
　author Kenta May 12 2019
　parent 051Bd （ハッシュ化されたコミットID）
 "最初のコミット"

コミットはスナップショットを記録すること。
各コミットは、親コミットを持っている。

**ブランチ：コミットIDを持ったポインタ。常に、そのブランチの最新のコミットを指し示す。**
**HEAD：今現在、自分が作業しているブランチを指すポインタ。**

ブランチもHEADもリポジトリの中に保存されている。

## ブランチを新規追加

```
git branch <ブランチ名>
```

ただ新規のブランチを作るだけで、HEADの移動は行われない。

ブランチ一覧と、HEADを確認

```
git branch
```

リモートリポジトリのブランチも含めて表示

```
git branch -a
```

`-a`： "all"

どのブランチがどのコミットを指しているかの確認

```
git log --oneline --decorate
```

`--oneline`は短く表示したいからつけてるだけ。

### ブランチの切り替え = HEAD を移動する


```
git checkout <ブランチ名>
```
<br>

ブランチを新規作成して、さらにそこに移動。

```
git checkout -b <新規ブランチ名>
```
これは、`git branch <新規ブランチ名>` + `git checkout <新規ブランチ名>`と同じ。
ウォーターフォールモデル開発のメリット・デメリットと上手な付き合い方を解説

ウォーターフォールモデルとは、水が上から下に流れるように、順番に工程を進めていく方式です。要求定義、外部設計、内部設計、プログラム設計、コーディング、テストという分け方が一般的です。

そんなウォーターフォールモデルでの開発は、多くのソフトウェア開発者にとって、一番初めに触れるモデルでソフトウェアやシステム開発の進め方の基礎といってもいいモデルです。

時代遅れと言われることもありますが決してそんなことはありません。
デメリットさえ改善できればいまだに有効な進め方といってよいでしょう。

<h2>ウォーターフォールモデルのメリット</h2>

ウォーターフォールモデルのメリットとしては、プログラム開発では一番使われているモデルでもあり、作る方としても委託する方としても共通認識として機能する部分が多いこと。

また、最初に道筋をきれいに決めて進むことで、全体の工数を把握しやすく、進捗管理がしやすいモデルです。

<h2>ウォーターフォールモデルのデメリット</h2>

管理し易く丁寧な印象のウォーターフォールモデルですが、デメリットもあります。

最も大きな問題点は、仕様変更に弱いという性質。最初にきっちりと仕様書を作り、それに則って作業を進めるウォーターフォールモデルは手順を戻す時に、殆ど全てをやり直さないといけないことになります。

<h2>フォーターフォールモデルとの付き合い方</h2>

とはいえ、工数や進捗の管理し易さ、分かりやすさからウォーターフォールはクライアント(システム作りを依頼、購入した)にも分かりやすく、人気なモデルです。欠点を補い、良さを引き出して上手く付き合っていきたいところ。

ウォーターフォールモデルのやり方を外れ過ぎない程度に、ちょっとした工夫を凝らしてみると開発がはかどるかもしれません。

以下ではウォーターフォールモデルとの上手な付き合い方を3点ご紹介します。

<h3>具体的なテクニックその1</h3>

具体的な例としては、設計図の画面は実物のスクリーンショットにするといった工夫でしょう。設計書には、どういった画面かの図を載せないといけませんが、先に画面を実際に作ってしまえば、後はスクリーンショットを撮って張り付けるだけで画面イメージを作れてしまいます。

また、画面のレイアウトや、ちょっとした画面遷移など、誰でもすぐに理解できるレベルの所までは、先に開発を済ませてしまうことで、システム全体のイメージも掴みやすくなり、設計書を書く時にも捗ることと思います。

当然、画面はそのまま実装することを前提に作るので、コーディング作業と基本設計の両方を同時に進行できます。

過去にサイト設計した<a href="http://crowdfunding-hikaku.com/" target="_blank">クラウドファンディング</a>のサイトでも、実物のスクリーンショットを先に作ったことでスムーズな進行ができました。

<h3>具体的なテクニックその2</h3>

ウォーターフォールモデルに忠実に従うとすれば、ＳＥは設計関連、プログラマはコーディングやテストと、きっちりと役割分担をする必要があります。

しかし、それだとウォーターフォールモデル「仕様変更に弱い」という弱点は解消されません。そのため、役割分担を少しだけ崩してみるといった柔軟な工夫をしてみましょう。

プログラマはコーディング、ＳＥは設計といった役割分担は、システムを作るという観点においてはあまり効率的とはいえません。設計作業と製造作業は、たがいに行き来しながら行う方が、やり方として自然だからです。

最初にある程度、どういった機能を持っていて、どういう風に作るのかといったことを決めるのは必要ですが、最初に完成されたシステムを全てイメージすることは、経験豊富なＳＥでも難しい事です。

なので、設計書を作る際には実際に画面レイアウトや画面遷移を作りながら設計書を書くことになります。

また、この手法は、個々のスキル差を埋めるためにも有効です。実際にコーディングしてみないと全くイメージが湧かない人や、逆にコーディングは設計がきっちりと出来てからでないと難しいという人。こういった人はプログラマ、ＳＥといったくくりに限らず、存在します。

システム開発は求められるスキルに差があるため、派遣や出頭した人でチームを組むことが多い職業です。

なので、仕事の進め方や得手不得手の傾向はバラバラになりがちです。この手法は、そういったプロジェクトチームの断衝材になるでしょう。

<h3>具体的なテクニックその3</h3>
クライアントとの擦り合わせの情報を全体に公開して、要求定義書を書きながら、基本設計書、可能な範囲で詳細設計書も書き、コーディングも出来る所まで済ませてしまえるようにすると効率がいいです。

その際、マクロや引用等で設計書を関連付けてしまうと書類作成の面でも効率がアップします。

このテクニックのポイントは、不明確な仕様の部分は後回しにすることです。クライアントとは出来るだけ蜜に連絡を取りたいものですが、完全にリアルタイムとはいきません。また、開発を進めるうちに浮き出てくる疑問点や問題点もあるでしょう。

仕様変更での後戻りを無くす手段としては、不明確な場合は基本設計の段階でも作成をストップさせ、明確な部分は詳細設計やコーディングまで進めてしまうといった、工程毎ではなく機能毎の進捗管理が効率的です。

その際に懸案事項のリストを作成、共有し、不明確な部分はそこに書いて疑問点を明確にしておくと、いざクライアントとの打ち合わせの時に聞き漏らしが少なくなるので、合わせて行いましょう。

細かい所をちょっとしたアイデアで工夫して、工数節約、効率アップを心掛けたいですね。

<h2>ウォーターフォールモデルのまとめ</h2>
・作る方としても委託する方としても共通認識ができる。
・仕様変更に弱い。
・設計図の画面は実物のスクリーンショットにする。
・役割分担は明確に作らない方が良い。
・不明確な仕様の部分は後回しにする。

ウォーターフォールモデルをせ成功させるコツは柔軟性にあります。

さまざまな開発における基礎であり、有効に進めることができます。

このモデルを取り入れる方は、ぜひ上記を意識してみてください。
Machine Learning Production Pitch #2 勉強会メモ

# 概要

[Machine Learning Production Pitch #2](https://machine-learning-pitch.connpass.com/event/125115/)

> Machine Learning Production Pitchは、機械学習について業務で培った知見や経験や苦労話を共有できる場を提供することを目的としたMeetupです。機械学習に取り組み、実社会への適用に日々もがき苦しみ楽しんでいる方々を対象としております。
> 第２回のテーマも前回に引き続いて機械学習の「設計」がテーマとなります。今回はLeapMind株式会社、LINE株式会社、エムスリー株式会社およびスマートニュース株式会社より合計4名に発表して頂きます。またイベント後は、会場にてカジュアルな懇親会も予定していますので、直接何でもご質問いただければと思います。


# 発表

Airflowやluigiといったワークフローエンジン周りの知識がないので、その辺りは特に間違いがあるかも

## Detecting opinionated articles in SmartNews

[発表資料](https://speakerdeck.com/ztx0728/detecting-opinionated-articles-in-smartnews)

- 政治のオピニオン記事の検知
    - 記事はおおよそニュース記事かオピニオン記事に分類できる
    - 「オピニオン記事」か「オピニオン記事でないか」の二値分類
    - 大手のニュース記事サイトから、クローリングによりデータを取得した正例データとスマートニュースのTOP内の政治記事を負例とする

- モデル
    - 中間層はBERTやTransformer、Bi-LSTMなどで実装
    - 出力層のスマートニュース内の各分類タスクに置き換えて、マルチタスク学習を実施
    - ドメイン記事でファインチューニングしたBERTが一番良い評価
    - CPU運用を考慮し、記事のメタデータを追加したwide & deep learning modelを構築すると、更に良い評価

## つらくないAirflowにむけて

- Airflow
    - OSSのworkflowエンジン
    - pythonでDAGで依存するタスク群の関係を定義してワークフローを実装
    - 可視化できる

- 導入の経緯
    - MLモデルのデータ整形から学習・評価までを包括的に実装する必要
    - 依存化するタスクであるためワークフローエンジンの導入

- 課題
    - リソース管理のコストが大きい
    - DAGの管理コストが大きい
    - end-to-endの挙動が保証できない
- 工夫
    - kubernetesで実行環境のコンテナを定義して、リソース管理を実施
    - Droneでコンテナビルドやテストの自動化
    - DAGに対するunittest


## 機械学習関連の開発を 効率化した話

[発表資料](https://speakerdeck.com/nishiba/ji-jie-xue-xi-guan-lian-falsekai-fa-wo-xiao-lu-hua-sitahua)

- 開発のつらみ
    - データ加工
        - データが色々なDBにある
        - 色々JoinやFilterをしないと使えるデータにならない
        - DBごとのフォーマットを整える必要がある
    - 設計
        - 共通部分は他プロジェクトでも使いたい
        - (SWエンジニアに比べ)MLエンジニアは設計が弱い
        - 弱い設計コードのレビューや保守がつらい
    - 管理
        - パラメータとデータの管理が難しい
        - 良かった結果を再現できない

- Luigi
    - パイプラインツール
    - Spotify製
    -　設計が統一される
    - ログが読み易く、失敗部分の再実行が容易

- gokart
    - エムスリーが開発したLuigiのラッパー
    - 入出力周りの共通化
    - 出力ファイル名やパラメータ保存といった管理機能


## エッジ向けDeep Learningプロジェクトで必要なこと

- LeapMind
    - エッジ向けDeep Learning開発

- エッジデバイスでの推論モデルの実装
    - 学習済みモデルをエッジデバイス用への変換は容易ではない
    - 設計・学習の時点から、実際の推論環境を意識するべき

- 圧縮の手法
    - 剪定
    - 量子化
    - 共有
    - 蒸留

- 量子化
    - 計算の量子化をすると精度が劣化する
    - しかし、量子化の際に再学習を行うことで、精度の低下を防ぐことができる
    - 少ないビット数で演算する専用デバイスで高速かつ低電力化を実現する
    - GPUでは、圧縮と高速化の実現が難しく、専用ハードウェアを考える必要がある
    - pythonのtensorflowでモデルを実装し、Blueoil(独自ソフト)を用いて変換
CODE COMPLETE (上) -第2部 高品質なコードの生成 ②-

自分の理解を深めるために投稿します。

## 第6章：クラスの作成

### クラスの基礎：抽象データ型(ADT)

- ADTを理解すると…
  - オブジェクト指向プログラミングの理解につながる
  - 実装・変更が容易なクラスが作れる

```
// ADTを使用しない場合

// そのまま変数を設定する
currentFont.size = 16;

// ルーチンをライブラリにまとめる
currentFont.size = PointsToPixels( 12 );

// 属性に具体的な名前をつける
currentFont.sizeInPixels = PointsToPixels( 12 );
```

問題点

- 仮に `currentFont.sizeInPixels` と `currentFont.sizeInPoints` があった場合に両方定義できない(currentFontがどちらを利用すればいいかわからないため)
- 同じような行がコード内に散らばってしまう

```
// ADTを使用した場合

// 次のようなフォント制御用ルーチンをいくつか定義する
currentFont.SetSizeInPoints( sizeInPoints );
currentFont.SetSizeInPixels( sizeInPixels );
currentFont.SetBoldOn();
currentFont.SetBoldOff();
...

// 実際の変数定義は上記のルーチン内で行う
```
利点

- 実装の詳細が隠蔽される
- 変更がプログラム全体に影響しない
  - もし他のフォント処理が追加されても、一箇所だけ変更すれば良い
- インターフェイスが提供する情報をより明確にできる
  - `16` とはピクセルサイズか？ポイントサイズか？分からなくなりがち
  - ADTに集めれば、①全体を統一した単位で扱う、②明確に区別するといった方法が取れる
- パフォーマンスが改善しやすくなる
- プログラムが正しいか分かりやすくなる
  - ADTにまとめておけば、間違いの可能性は呼び出し時のルーチンの名前くらい
- プログラムのあちこちでデータをやり取りする必要がない
- 現実世界のエンティティを扱える 

## 良いクラスインターフェイス

上で述べたADTの概念はクラス設計と深く結びついている

- 良い抽象化
  - 一貫性がある
  - 関係のある情報だけ集まっている　など
- 良いカプセル化
  - クラスのメンバへのアクセスを最小限に抑える
  - メンバを外に公開しない
  - 疎結合　など
- 抽象化とカプセル化は、「どちらも行う」もしくは「どちらも行わない」くらい関係が深い

## 気をつけるべきこと

- 継承は複雑さを増長させる可能性がある
  - 本当に必要な時しか使わないこと
  - 「is a」関係にある時だけ使うこと
- クラスのルーチン数は出来るだけ少なく保つ
- クラスが呼び出すルーチン数も出来るだけ少なくする

## クラスを作る理由

- 現実世界のオブジェクト・抽象オブジェクトをモデリングする
- 複雑さを緩和・分離する
- 実装の詳細を隠蔽する
- 変更により影響を限定する
- グローバルデータを隠蔽する
- 引数の受け渡しを合理化
- 制御を一元化
- コードの再利用　など
わたしの「AWSサービスの選び方」

# はじめに

AWSの提供するサービスが多すぎて、どれを選べばよいのか悩んでしまう。
自分なりの「選び方」について、現時点のノウハウをまとめておく。

## 背景

* 業務上、AWSを使うことが増えてきた。（なので、AWSに絞った話です。）
* 最初にサービスを選ぶときに間違えてしまうと、後々の変更コストが高くつくので、なるべく初期段階で正しく選びたい。

# 自分がやってること
## サービス説明の「よくある質問」から類似サービスを見つけて比較する

**◆概要**

* 「よくある質問」において「違い」でページ内検索を行うと、類似サービスが引っかかる。
* SQSなら「SNS」「kinesis」「MQ」などが引っかかる。
	* https://aws.amazon.com/jp/sqs/faqs/
* 後は地道にサービス内容を調べて比較する
* はじめての人には使いやすいアプローチだと思う。

**◆メリデメ**

* メリット：比較的安定した調べ方なので、地道にやればちゃんとゴールにたどり着ける。
* デメリット：地道なやり方なので、サービス内容自体を理解するのにはそれなりに時間がかかる。

## 公式ブログをググる

**◆概要**

* なんとなくやりたいことのキーワードで検索し、公式ブログを探す。
	* 例：「dynamodb rds レプリケーション」→ https://aws.amazon.com/jp/blogs/database/how-to-stream-data-from-amazon-dynamodb-to-amazon-aurora-using-aws-lambda-and-amazon-kinesis-firehose/
* キーワード選定力を持った、AWSにある程度慣れている人向けかも。

**◆メリデメ**

* メリット：見つけた時の安心感が凄い。ダイレクトにゴールにたどり着ける時がある。
* デメリット：ヒットしない時もあるため、時間を浪費することになりがち。・検索能力に依存するため、安定しない。

## AWSに問い合わせる

**◆概要**

* AWSの[プロフェッショナルサービス](https://aws.amazon.com/jp/professional-services/)に問い合わせて相談する。
* 別途契約が必要。

**◆メリデメ**

* メリット：安心感も安定感もある。
* デメリット：何を聞きたいのかを自分自身がちゃんと理解できてないと、不毛な打ち合わせで終わる。提案初期のふわふわした段階だと、何聞いていいか結構わからないので、聞くタイミングが遅くなりがち。

## 日頃から情報収集しておく

**◆概要**

* AWSのブラックベルトシリーズやブログ、クラスメソッドさんのブログとかを日頃から追っかけておいて、ノウハウを蓄積しておく。

**◆メリデメ**

* メリット：問題にぶつかった時の瞬発力が違ってくる。
* デメリット：効果が出るまで時間がかかる。

----

「他にこんなのありますよー。」とか「同じだよ！特に◯◯をよく使うかなー。」とか、ご意見あればコメントいただけると嬉しいです。
Jasyptを利用したproperty fileの暗号化練習

下記手順通り。

1> maven dependencyの追加
```<!– https://mvnrepository.com/artifact/org.jasypt/jasypt-spring3 –>
<dependency>
<groupId>org.jasypt</groupId>
<artifactId>jasypt-spring3</artifactId>
<version>1.9.2</version>
</dependency>
```

2>set environment in eclipse : CAS_PBE_PASSWORD=master password
ここを参考し、変数を設定します。
https://stackoverflow.com/questions/7048216/environment-variables-in-eclipse

3> Encrypt your credentials
Jasypt provides a command line utility that can be used to encrypt the values of your properties. Download the Jasypt distribution and unpack it. The utilities reside in the bin directory.

encrypt input=”pa55word” password=”master password” algorithm=”PBEWITHMD5ANDDES”

Windowsでの実行方法：
cmdでコマンドラインを起動します。encrypt.batのあるフォルダは以下へ移動します。
下記コマンドを実行します。
encrypt.bat input="pa55word" password="master password" algorithm="PBEWITHMD5ANDDES"
こんな感じで暗号化したパスワードが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/7985a0f3-c9bb-141e-8893-65f65609327c.png)


4>Read credentials in a properties file i.e. database.properties

dataSource.password=ENC(4nZEPG531tZ4CmBjnni8oDicrXxyza9j)
dataSource.username=root

5>you can have it old way in a xml.

```Java:properties
<bean id="propertyPlaceholderConfigurer"
class="org.jasypt.spring.properties.EncryptablePropertyPlaceholderConfigurer">
<constructor-arg ref="configurationEncryptor" />
<property name="location" value="classpath:jdbc.properties" />
</bean>

<bean id="configurationEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
<property name="config" ref="environmentVariablesConfiguration" />
</bean>

<bean id="environmentVariablesConfiguration"
class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">
<property name="algorithm" value="PBEWITHMD5ANDDES" />
<property name="passwordEnvName" value="CAS_PBE_PASSWORD" />
```

# 参考リンク
https://suryanarayanjena.wordpress.com/jasypt/
#3Qタウンメモ →edit Tango 

![0A573D29-9EA8-468B-82CD-1366CD2E1C7B.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246806/3f066414-4541-3b15-ee29-3f550c5240b2.jpeg)

#edit Tango
Wikimedia Advent Calender 2020にて、「たんご百科事典」（https://edit-tango.webnode.jp/?fbclid=IwAR0uH3QWfv08X80_5Pfuf6lKiz79gf9SEcFyzdrUDCPe07TRapSae7MVl7I）が公開されています。
edit Tangoの創造したアーカイブは、Wikipedia/Wikimedia上で更新可能な点が優れていて、見て読んで楽しいコンテンツになっています。
また、2019年5月時点の名刺には「(エディット丹後、通称ET/エディタン）は誰でも編集できるオープンソースによる丹後地域の情報発信をサポートするボランティアです。」と記されていましたが、そこから成長し洗練されています。
【2020/12/25/01:08現在】

#3Qタウン Wikipedia Town in 琴引浜
2019.05.26に開催されたこのイベントの素晴らしい点は、
地元の方が気軽にWikipediaの編集ができるように、予めサポートボランティアが活動していることです。
Wikipediaの編集に必要な画像があり、イベント当日の撮影だけでは補えない場合もあるのですが、サポートボランティアの方が予め撮影した複数の画像をコモンズにUPされていたので、簡単に画像を使用することができました。

当日の編集対象は、以下の4テーマ。
「琴引浜」（加筆）
「鳴き砂」（加筆）
「琴引浜鳴き砂文化館」（新規立項）
「はだしのコンサート」（新規立項）

筆者が参加したグループは「琴引浜」でしたので、そこで編集作業中に気付いた点をメモします。

##特筆性の確認
1.はじめに
「琴引浜」の加筆前の記事をモニター画面に表示し、鳴き砂・琴引浜鳴き砂文化館・ナホトカ号事故についての記述が既にあり、それらに言及する必要があるか、聞いてみた。
→アイスブレイクというか、考える練習。
→→アカウント未作成の人は、この時間に作成。
2.役割分担
「琴引浜」に必要な記述、節を設定する。由来2名、地理3名、歴史3名に分かれて作業開始。
筆者は、節の構成変更・ギャラリーへの画像の追加、表記の校正を行った。
『丹後竹野郡掛津村耕地図』については舞鶴市に著作権があり、二次使用ができないため、使用を断念した。歴史節の内容を検討していた際、白滝神社については資料があるが琴引浜について記述がない、白滝神社≠琴引浜となり、琴引浜が登場する作品に節が変更となった。更に、琴引浜の生態系に特筆性があることが明らかになり、自然の節を設ける。
3.学校司書の存在
このグループには学校司書と高校生が参加していたので、初心者である高校生のサポートは学校司書が行った。筆者は図書館用語（書誌など）を使いがちなので、翻訳して頂き、助かった。
##出典明記
1.ガイドライン
「琴引浜」のTOPに「出典明記」のガイドラインが貼られている。加筆するとき、どの文献に載っている内容か（複数の文献に記載されていることが望ましいが）必ず明記するよう、促した。
2.引用と表現
作業中、学校司書が高校生から消しゴムを借りる場面があった。自分の表現で記すため、メモ用紙にシャープペンで文章を書き、推敲していたからだろう。
文献からの引用も、表記できない漢字があったりして、工夫が要る。百科事典の文章らしく書くことに、皆、集中していた。
3.参考文献
当日のタイムスケジュールに間に合わなかったので、翌日、マークアップを整理して加筆した。

##余白
○地元の参加者・初心者が多かった所為か、講評が甘かった。
「琴引浜」は、①海蔵寺や白滝神社などの史跡②山陰ジオパークなどの地質学知識③微小貝について、記述がない。
文学作品の引用は出典明記ガイドラインに則したマークアップが相応しい。
英語版にKotohiki beach(スタブ項目)とあるが、そこも加筆するべきではないか。なお、コモンズにUPされている画像ファイルはKotohikihama Beachとローマ字表記である。など、ツッコミどころあり。
edit Tangoのブラッシュアップに期待します。

##後日談
2019.06.02 Wikipedia日本語版メインページの新しい記事に、「琴引浜鳴き砂文化館」が掲載されています。
2019.06.03 Wikipedia日本語版メインページの新しい記事に、「はだしのコンサート」が掲載されています。
edit tangoにて継続的にブラシュアップされており、これから先も記事の精度が上がる可能性が高いです。
2019.09.07 ウィキペディアにゃウンの開催と日々の活動を、見守りたいと思います。

##続、後日談
2019.11.29 Wikipedia日本語版メインページの強化記事に、「琴引浜」が掲載されました。

※筆者は Wikipedia日本語版の利用者ですが、ウィキペディアンではありません。知識循環型社会（吉見俊哉)
https://www.jstage.jst.go.jp/article/jsr/65/4/65_557/_article/-char/ja/
を理想とする、市民です。
マークアップエンジニアが設計の参考にしているCSSフレームワーク 

マークアップエンジニアの私が個人でCSSフレームワークを作る際に
考え方を参考にしているおすすめフレームワークをご紹介します


#【定番】知名度No.1定番のBootstrap

フレームワークの定番として間違いがないBootstrap。
スタンダードとして考え方のベースにしたい。

![Alt text](https://i.gyazo.com/6ca1398f24e470af3a5b8408c297b970.png)

>Bootstrap
>https://getbootstrap.com/


#【定番】シンプルでわかりやすい最初に覚えるならBULMA

シンプルなネーミングとUIで人気です。

![Alt text](https://i.gyazo.com/61e31806db459d765e5c2e21d7857fe0.png)

>Bulma
>https://bulma.io/


#【便利】JavaScriptパーツが中心のUIkit

![Alt text](https://i.gyazo.com/dd409099d5e6617f867dc8072288cd3d.png)

>UIkit
>https://getuikit.com/v2/

#【便利】HTMLパーツが中心のSemantic UI
![Alt text](https://i.gyazo.com/0aacf4c4193bc9ab770d6d6da3edd76a.png)

>Semantic UI
>https://semantic-ui.com/

#【日本製】シンプルで使いやすい MUSUBii

WYSIWYGセットが便利です。

![Alt text](https://i.gyazo.com/c04868c101b791a079ae8e79d9b9567c.png)


>MUSUBii
>https://qrac.github.io/musubii/

#【日本製】CMS制作に特化 echo.css

WordPressを作る際に参考になります。
コーディングルールがついていて親切。
https://cms-skill.com/echo-css/docs/outline-rule.html

![Alt text](https://i.gyazo.com/942c8b538335684bd2d7775a1de3ef06.png)


>echo.css
>https://cms-skill.com/echo-css/

#【日本製】サイト設計の参考にBasis

mixinサンプルが豊富です。

![Alt text](https://i.gyazo.com/bd958fbab3fa6b1731d2925363bcd1e2.png)

>Basis
>https://getbasis.github.io/

各フレームワークの設計やモジュールのいいところを取り入れていきたいですね。
おすすめのフレームワーク、自作のフレームワークがあればぜひ教えてください！
Unity2019で最新アセットが落ちてこない対処法

#先まとめ
unityHubインストールしてログインしましょう。

#トラブル内容
・OculusQuest用にビルドしても入力が取れない
・なんかアセットが古いっぽい
・公式サイトからは落とせなくなってる
・アセットストアから何度落としても、『古い』

##ログインしてないとローカルの古いの掴まされる情報
・unity2019にした時点でログイン外されてたっぽい形跡
・unity2019はUnityHub使わないと『ログインできない』

#愚痴
・今まで自分でバージョン管理してたから引き続き自分でやりたかった
・ビルド環境は自分で構築したかった

#unityHubインストールしてログイン
・アセットストアに『更新』の文字が出てきた
bundle install で capybara-webkitのinstall時、Command 'qmake ' failedでこける(Xcode not set up properly)


## bundle installでこける
私的にnokogiriとcapybaraはこける鉄板。
qt@5.5は確実にあるはずなんだけどなあと思ったらXcodeのせいだった。
Xcodeをversion10にあげるときに、AppStoreから落とすと時間がかかるので、
Applicationから古いversionを消してAppleのサイトから直で落としてきていたのも罠だった。
(Xcodeはコーディングに使っていません。)

## エラー
前は qmake command not avairableみたいなエラーだったのに、今日はfailedだった。


```
Building native extensions.  This could take a while...
ERROR:  Error installing capybara-webkit:
        ERROR: Failed to build gem native extension.

    current directory: /Users/hoge/.rbenv/versions/2.4.6/lib/ruby/gems/2.4.0/gems/capybara-webkit-1.15.1
/Users/hoge/.rbenv/versions/2.4.6/bin/ruby -r ./siteconf20190531-390-jxbok3.rb extconf.rb
Project ERROR: Xcode not set up properly. You may need to confirm the license agreement by running /usr/bin/xcodebuild.
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/Users/hoge/.rbenv/versions/2.4.6/bin/$(RUBY_BASE_NAME)
        --with-gl-dir
        --without-gl-dir
        --with-gl-include
        --without-gl-include=${gl-dir}/include
        --with-gl-lib
        --without-gl-lib=${gl-dir}/lib
        --with-zlib-dir
        --without-zlib-dir
        --with-zlib-include
        --without-zlib-include=${zlib-dir}/include
        --with-zlib-lib
        --without-zlib-lib=${zlib-dir}/lib
Command 'qmake ' failed

```

## 対処
公式サイトに載ってます。
https://github.com/thoughtbot/capybara-webkit/wiki/Installing-Qt-and-compiling-capybara-webkit#xcode-80

`sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer`
を試せとのことだったが、試したら

`xcode-select: error: invalid developer directory '/Applications/Xcode.app/Contents/Developer'
`
とのこと。あれと思ったらApplicationsではなくDownloadsに入ってたので移動させて再実行からのbundle。
laravel + encode

laravelでエンコードによる不具合があった

laravelでのテキストの使用は
utf-8(BOMなし)　LF

OS内はutf-16が多い
utf-8な理由は処理効率がいいとが

使用する

larabel がブレードを見るとき一度ブレードをｐｈｐに変換しキャッシュ化する
そのファイルが入るのがstorage・framework・viewsの中

Sfihtjis と　エンコード周りは一度覚えたほうがいい
Kotlinで全角カタカナのバリデーションを作りたいから頑張った話


こんにちは。私です。
Kotlin頑張ってます。

## さて今回は
 **Kotlinで全角カタカナのバリデーション貼りたいな**って思う時あるじゃないですか。
あったんですよ。

色々調べたのですが

```kotlin:validate_katakana.kt
public class FullKanaTest {
 
    public static void main(String[] args) {
        //true
        System.out.println("カタカナカナ" + isFullKana("カタカナカナ"));
        //false
        System.out.println("カタカナじゃないよ" + isFullKana("カタカナじゃないよ"));
    }
 
    public static boolean isFullKana(String str) {
        return Pattern.matches("^[ァ-ヶー]*$", str);
    }
}
```
や

```
/^([ァ-ン]|ー)+$/
```
の正規表現使えばできるよ！！ってめっちゃ書いてました。

## いや、できん。
色々調べて使ってやってみたのですが、どうも理想の動きをしていない…。なんで…。。


## これだ！！

```kotlin:regular_expression_katakana.kt
val katakana = "カタカナカナ"
if(katakana.matches("^[\\u30A0-\\u30FF]+$".toRegex())){
    //true
    //全てカタカナだった場合入ります
}else{
    //false
    //カタカナじゃない文字が含まれていたらこっち
}
```

と上記の書き方でやりたいことができました！やったね！！

## まとめ

名前のフリガナとかで必要な場面は多いかと思います。
全角のカタカナのバリデーションがこっちで広まるといいな！

では！皆様良いValidationライフを٩( 'ω' )و
【//= require jquery】jQueryの導入ができない

バージョン

```
ruby '2.5.3'
gem 'rails', '~> 5.2.3'
```

# 前提
ヘッダーメニューをプロダウン表示するために、jQueryを導入しようとしたところエラーが発生。

```app/assets/javascripts/application.js
//= require rails-ujs
//= require jquery
//= require bootstrap
//= require activestorage
//= require turbolinks
//= require_tree .
```

# エラー内容
<img width="1144" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3233323731352f61326335363066382d646233652d666336332d343131352d3066346461623964366439382e706e67.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32413/3a519a6a-c312-13a1-afa7-6fece09755af.png">

jQueryが無いというエラー表示

# 解決策

```Gemfile.
gem 'jquery-rails', '4.3.1'
```
上記を追加。
`Gemfile`を保存したのち、`./qs bundle install`を行う。
※シェルスクリプトというファイルを追加しているので、`./qs`を私はいれています。

`bundle install`が終了したら、`rails`を再起動を行ったら表示される。

※`Gemfile`を追加したら、`rails`は必ず再起動
自作スクリプト + alias で作業効率化

自作スクリプトを alias すると便利だよと何度か言ってますが、Qiita にまとめてみます。

まずは、macのホームディレクトリ。
<img width="487" alt="Screen Shot 2019-05-31 at 11.33.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351420/19f54cda-908a-9a24-3926-75cce96f21a3.png">
`~/tools` というディレクトリを用意しました。
場所は別にどこでも構いません。

まずは簡単なスクリプトを用意します。
`cd ~/tools; mkdir _unit; cd _unit`
ということで、 `~/tools/_unit` というディレクトリを作って移動しました。
以下の２つのスクリプトをぶち込んでおきます。

```ruby:au2ang.rb
 input_real=ARGV[0].to_f
 output_real=0.52917721067*input_real
 p output_real
```
```ruby:ang2au.rb
 input_real=ARGV[0].to_f
 output_real=input_real/0.52917721067
 p output_real
```

次に、これを alias します。
`cd ~/tools; vi _alias`
_alias というファイルに以下を入力。

```bash:_alias
#!/bin/bash

dir_now=`dirname $BASH_SOURCE`

alias au2ang="ruby ${dir_now}/_unit/au2ang.rb"
alias ang2au="ruby ${dir_now}/_unit/ang2au.rb"
```
~/.bashrc に以下を書き加えます。
`source ~/tools/_alias`

で、bashを立ち上げ直すと。
<img width="439" alt="Screen Shot 2019-05-31 at 12.06.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351420/b6b9c4ec-3284-60be-bc7c-716bf102bc76.png">

Å ⇔ Bohr の単位換算がターミナルを立ち上げれば簡単にできるようになりました。めでたしめでたし。

これだけならどうってことはないかもしれないですが、スクリプトさえ書ければいくらでも応用が効きます。数行で書ける便利スクリプトもいくつかあるので、機会があったらご紹介できればと。
AWSのSecurity Groupが外された経緯を知る方法

# はじめに
AWSの開発に関わっていると、ある日突然EC2が通信できなくなったと連絡があり、原因を調べると**「アタッチしていたはずのSecurity Groupがデタッチされていたため」**ということがあります。
この場合、一次対処としてはSecurity Groupをアタッチし直すことになるでしょう。
その後、業務では根本原因を追求するため、どうしてSecurity Groupが外れたのかを調査することになります。
CloudTrailのイベント履歴画面で、イベント名**「ModifyNetworkInterfaceAttribute」**を確認すればOKです。

# ModifyNetworkInterfaceAttributeがないか調査
試しにSecurity Groupを複数アタッチしたEC2を用意し、Security Groupをデタッチします。
その後CloudTrailを見ると、以下のようにイベントが上がっています。
このイベントが、Security Groupの変更によって発生したものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/7598db1c-b21b-563d-61f0-2aecf82491a1.png)
上記の画面から、**誰がどこから、どのENI(ネットワークインタフェース)に対してSecurity Groupの操作をしたか**が分かります。

## 何が外された(デタッチされた)のかを知る
同じ画面上では、この操作によって、結果、ENIにどのSecurity Groupがアタッチされている状態となったかが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/d30ce37c-f198-215a-2cbb-f5e1aabdb6a4.png)
つまり、過去のModifyNetworkInterfaceAttributeのイベントを追いかけていけば、Security Groupのアタッチ状態の遷移を追うことができます。

## 検索条件(フィルタ)でENI IDを指定して調査
EC2にアタッチされているENIのID(eni-)が分かれば、イベント履歴画面でリソース名にENIのIDを指定して検索すると、ENIを絞り込んで、遷移を追うことができます。
Security Groupをデタッチする操作は、厳密にはSecurity Groupに対する操作ではなく、ENIに対する操作になりますので、ENIで絞り込んで調査します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/69e9a419-b2d5-0794-8e28-fefc6b3be38b.png)

## ※参考※ 検索条件(フィルタ)でSecurity Group IDを指定して調査
Security GroupのID(sg-)が分かれば、イベント履歴画面でリソース名にSecurity GroupのIDを指定して検索すると、そのSecurity Groupだけに絞り込んで調査できます。
ただし上記で説明したように、Security GroupのデタッチはENIに対する操作ですので、デタッチを追うにはENIで絞り込む必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/ea2f68af-5ec8-99af-85c3-66374880c0a6.png)

これでSecurity Groupがデタッチされた経緯を調査でき、犯人探しができるようになります。

えっ・・・経緯って言うけど、そもそも何でデタッチしたのかが分からないじゃないかって？
それを知るには、当事者にカツ丼を食べさせる必要があります。
Lighthouseでファイルの転送量がどれくらいオーバーしているかを調べる

### 本記事について
Chromeで使えるLighthouseの機能が先日のGoogle I/Oでアップデートされていました。
Performance Budgetという、HTML/CSS/Javascipt/imageなどのファイル転送容量の予算を決めて、それをモニタリングできる仕組みが誕生していたので、その動かし方と、計測の方法などを簡単に説明します。

コマンドを少し理解している方であれば、対応可能です。
コードは自分で書かなくてもできます。カスタマイズしたい方は、ご自身でググってみてください。

### 目次

・Lighthouseとは
・コマンドラインでLighthouseを動かす
・Performance Budgetの設定
・いざ、計測結果を確認！

### Lighthouseとは
Chromeで使える、Webページの計測ツールです。
Chrome Dev Toolからもアクセスできます。使い方は[こちら](https://www.wakuwakubank.com/posts/622-tool-lighthouse/)
色々な視点でWebページの解析をしてくれて、改善点も提案してくれます。便利。

### コマンドラインでLighthouseを動かす

```terminal
$ npm install -g lighthouse
```

でインストール

```terminal
$ lighthouse https://hogehoge.com #計測したいurlをコピペ
```
これだけです。

計測コマンドを走らせると

```
May we anonymously report runtime exceptions to improve the tool over time?  (y/N)
```
と聞かれますが、どっちでもいいと思います。エラー発生時にその情報を匿名化してGoogleに送信するかどうか聞いているだけなので、適当にどちらかを選択します。

これで計測がスタートし、全て終わるとterminalの一番下の方に

```terminal
Printer html output written to /Users/user-name/siteurl_2019-05-31_11-02-16.report.html
```
表示されているので、ブラウザでそれを開きます。
勝手に自分のホームディレクトリに出力されている感じですね。

見た目はこんな感じのHTMLが出てきます。

<img width="1118" alt="スクリーンショット 2019-05-31 11.37.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76779/d8bf98e4-e2bc-8f0e-54a9-d71c043b7c5e.png">

ここまではChrome Dev Toolでもできるのでいいのですが、ここからPerformance Budgetを設定して、モニタリングできるようにしていきます。

### Performance Budgetの設定
いよいよ、Performance Budgetを設定します。json形式のファイルを利用します。

そもそもどのくらいのファイル転送量を基準にすればいいかわからないよ！JSONってなんか難しそう。。という方もいらっしゃると思いますが、心配する必要はありません、[Performance Budget Calculator](https://perf-budget-calculator.firebaseapp.com/
)というツールがあります。これで簡単にJSONファイルを作ってくれます。
JSONファイルを作ったら、大人しくそのファイルをホームディレクトリに保存しましょう。
```/Users/user-name/budget.json```
のような感じで配置するということです。

デフォルトのJSONファイルは下記のような形になります。

```json
[
  { "resourceSizes":[
    { "resourceType": "document", "budget": 20 },
    { "resourceType": "stylesheet", "budget": 50 },
    { "resourceType": "font", "budget": 50 },
    { "resourceType": "image", "budget": 300 },
    { "resourceType": "script", "budget": 100 }
    ]
  }
]
```

これで準備が整いました。


### いざ、計測結果を確認！

```terminal
$ lighthouse https://youtube.com --budget-path=budget.json
```

このコマンドを叩きます。先ほどと同じようにHTMLファイルが生成されるので、確認してみます。

Performanceのスコア表示されている下を見ると、下記のようなエリアが新しく表示されていますね。

<img width="938" alt="スクリーンショット 2019-05-31 11.57.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76779/40ce47a2-f338-a653-128c-381d559f6e30.png">

scriptの量が多くて、思いっきり設定した予算をオーバーしていました。。笑

どのくらいの転送量を予算として設定するかという点は、今回はとりあえずデフォルトの数値（遅くもなく、早くもないというサイトのレベル）で設定しましたので、改善ポイントはありそうだということがわかりました。


以上、JSON形式のファイルを作ってコマンドを叩くと、サクッとパフォーマンス管理ができる事例でした。

参考：[Performance Budgets](https://developers.google.com/web/tools/lighthouse/audits/budgets#setup)
【随時更新】プログラミング学習にオススメの教材、エッセイ集

# 概要
エンジニアとしては働いているが、もう一歩抜け出したい！というときに助けになるサイトを集めました。

# 教材
- @ruiu さんの[低レイヤを知りたい人のためのCコンパイラ作成入門](https://www.sigbus.info/compilerbook)
- [karino2](https://twitter.com/karino2012)さんの[karino2の暇つぶしプログラム教室 C言語編](https://karino2.github.io/c-lesson/)
    - [Yohei Kikuta](https://twitter.com/yohei_kikuta)さんの[体験記](https://yoheikikuta.github.io/clesson_first_postscript/)
- 同じくkarino2さんの[karino2の暇つぶしプログラム教室 kotlin編](https://karino2.github.io/kotlin-lesson/)
- [仕事ですぐに使えるTypeScript](https://future-architect.github.io/typescript-guide/)
    - [作成の経緯](https://future-architect.github.io/articles/20190612/)
- [江添亮のC++入門](https://ezoeryou.github.io/cpp-intro/)
    - 動画1: https://www.youtube.com/watch?v=d9VgUHghlog&feature=youtu.be
    - 動画2: https://www.youtube.com/watch?v=fz8ahXzOUNE&feature=youtu.be
- [実践的低レイヤプログラミング](https://tanakamura.github.io/pllp/docs/index.html)

# エッセイ
- [ポール・グレアムのエッセイと和訳一覧](http://practical-scheme.net/wiliki/wiliki.cgi?naoya_t%3Aポール・グレアムのエッセイと和訳一覧)
- [ジョエル・スポルスキのエッセイ](https://komiyak.hatenablog.jp/entry/20140618/1403089671)
- [Eric Sink on the Business of Software 革新的ソフトウェア企業の作り方](https://www.amazon.co.jp/dp/4798117501/ref=cm_sw_r_tw_dp_U_x_Uwj8CbY9VG33G)

# 参考
- [算数で挫折した人向けの、Javascript入門](https://karino2.github.io/js-introduction/)
- [青木靖さんのサイト](http://www.aoky.net/)
- [らいおんの隠れ家](http://blog.livedoor.jp/lionfan/archives/cat_10076810.html)
- http://local.joelonsoftware.com/mediawiki/index.php?title=Special:Search&ns0=1&redirs=0&search=%E3%82%B8%E3%83%A7%E3%82%A8%E3%83%AB%E3%83%BB%E3%82%B9%E3%83%9D%E3%83%AB%E3%82%B9%E3%82%AD&limit=500&offset=0