OmniAICreator/Qiita-1.07M huggingface dataset:
ドリーズームやってみる


この記事はOculus Rift Advent Calendar 2018の9日目です．

Unity公式マニュアルにドリーズームのやり方が載っていたので試してみました．

参照：[ドリーズーム (別名「トロンボーン」エフェクト) - Unity マニュアル](https://docs.unity3d.com/ja/current/Manual/DollyZoom.html)

まずはプロジェクトを作成してカメラとモデルを配置します．

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">お気に入りのアセット「昭和の町モデルセット vol.1 民家」と「&quot;Unity-chan!&quot; Model」をプロジェクトに追加したところ． <a href="https://t.co/uqwsNqeI2N">pic.twitter.com/uqwsNqeI2N</a></p>&mdash; Hisa Itami (@hisaitami) <a href="https://twitter.com/hisaitami/status/1071318474285244421?ref_src=twsrc%5Etfw">December 8, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


公式マニュアルのExampleScript.csをコピペしてカメラにアタッチします．この時にエラーが発生したので，2つのメソッドの戻り値をvoidからfloatに修正しました．

```
$ diff -ur ExampleScript.cs.orig ExampleScript.cs
--- ExampleScript.cs.orig	2018-12-08 17:10:16.000000000 +0900
+++ ExampleScript.cs	2018-12-08 17:10:25.000000000 +0900
@@ -10,13 +10,13 @@
     private bool dzEnabled;

     // カメラから指定の距離にある錐台の高さを計算します
-    void FrustumHeightAtDistance(float distance)
+    float FrustumHeightAtDistance(float distance)
     {
         return 2.0f * distance * Mathf.Tan(camera.fieldOfView * 0.5f * Mathf.Deg2Rad);
     }

     // 指定した距離で指定の錐台の高さを得るために必要な FOV を計算します
-    void FOVForHeightAndDistance(float height, float distance)
+    float FOVForHeightAndDistance(float height, float distance)
     {
         return 2.0f * Mathf.Atan(height * 0.5f / distance) * Mathf.Rad2Deg;
     }
```

このスクリプトをMain Cameraにアタッチして，適当にカメラの設定を調整するとドリーズーム効果が...

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">ドリーズーム的な... <a href="https://t.co/6xhwUi1H6h">pic.twitter.com/6xhwUi1H6h</a></p>&mdash; Hisa Itami (@hisaitami) <a href="https://twitter.com/hisaitami/status/1071420639355973633?ref_src=twsrc%5Etfw">December 8, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

角度を変えても面白いかもしれません．

<blockquote class="twitter-tweet" data-conversation="none" data-lang="en"><p lang="ja" dir="ltr">上から <a href="https://t.co/4QmUP5BrPK">pic.twitter.com/4QmUP5BrPK</a></p>&mdash; Hisa Itami (@hisaitami) <a href="https://twitter.com/hisaitami/status/1071424195563847681?ref_src=twsrc%5Etfw">December 8, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


ドリーズームはヒッチコック監督の作品で有名になったカメラワークだそうです．メインの被写体はそのままに，背景の遠近感を変えることで不思議な効果が出せるのが面白いですね．

他にもバレットタイムとかケン・バーンズ効果とかカメラの動かし方を色々と遊んでみると面白そうだなと思いました．
Pythonでopenweatherapiを使って東京の天気を取得する

前の記事と同じようなことを、Pythonでやってみた。

前の記事: [Goでopenweatherapiを使って東京の天気を取得する](https://qiita.com/fj_tkfm/items/7a0858512d8dd80146c5)

## 技術要件

* Python 3.7
* requests 2.20.1

## 実装

```python
import requests

OPEN_WEATHER_API_KEY = 'YOUR_OPENWEATHERAPIKEY_HERE'

response = requests.get(
    'https://api.openweathermap.org/data/2.5/weather',
    params={'q': 'Tokyo', 'APPID': OPEN_WEATHER_API_KEY})

body = response.json()
if response.status_code != 200:
    print('Status code was {}. Reason: {}.'.format(body['cod'], body['message']))
    exit(1)

print('Current weather in Tokyo is {}.'.format(body['weather'][0]['main']))
```

特に変わったことはしていない。
個人的にPythonでWebAPIを使用する場合はrequestsを使うことが多いので、ここでもこれを利用している。
エラーハンドリングが必要な箇所が少なく、また結果を構造体に入れることもしていないので、コード自体は短くなっている。

逆に言えば、実装側が各メソッド呼び出しに対してそれがエラーを送出することを考慮しなければ行けない箇所が出てくる。
そういった点では、Goのほうがエラーハンドリングを実装側に明示させるので、良心的かも知れない。

```bash
> python3 get_weather.py
Current weather in Tokyo is Clouds.
curlのGET,POSTのデータを確認


# やりたいこと
pythonで簡易サーバを立ててcurlを投げ、内容を確認

### [手順1] サーバ起動 (ソースは後述)

```
$ ./server_python3.py
サーバを起動しました。ポート:8000
```


### [手順2] curl送信

```
$ curl -X GET 'http://localhost:8000/test?aaa=bbb&ccc=ddd' -d 'ああ'
method: GET
body  : ああ
params: {'aaa': ['bbb'], 'ccc': ['ddd']}
```

# サーバのソース
コピペで動くと思います
### python3用

```server_python3.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import http.server as s
from urllib.parse import urlparse
from urllib.parse import parse_qs

class MyHandler(s.BaseHTTPRequestHandler):
    def do_POST(self):
        self.make_data()
    def do_GET(self):
        self.make_data()
    def make_data(self):
        # urlパラメータを取得
        parsed = urlparse(self.path)
        # urlパラメータを解析
        params = parse_qs(parsed.query)
        # body部を取得
        content_len  = int(self.headers.get("content-length"))
        req_body = self.rfile.read(content_len).decode("utf-8")
        # 返信を組み立て
        body  = "method: " + str(self.command) + "\n"
        body += "params: " + str(params) + "\n"
        body += "body  : " + req_body + "\n"
        self.send_response(200)
        self.send_header('Content-type', 'text/html; charset=utf-8')
        self.send_header('Content-length', len(body.encode()))
        self.end_headers()
        self.wfile.write(body.encode())
host = '0.0.0.0'
port = 8000
httpd = s.HTTPServer((host, port), MyHandler)
print('サーバを起動しました。ポート:%s' % port)
httpd.serve_forever()
```


### python2用

```server_python2.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import SimpleHTTPServer as s
import BaseHTTPServer as b
from urlparse import urlparse
from urlparse import parse_qs

class MyHandler(s.SimpleHTTPRequestHandler):
    def do_POST(self):
        self.make_data()
    def do_GET(self):
        self.make_data()
    def make_data(self):
        # urlパラメータを取得
        parsed = urlparse(self.path)
        # urlパラメータを解析
        params = parse_qs(parsed.query)
        # body部を取得
        content_len  = int(self.headers.get("content-length", 0))
        req_body = self.rfile.read(content_len).decode("utf-8")
        # 返信を組み立て
        body  = "method: " + str(self.command) + "\n"
        body += "params: " + str(params) + "\n"
        body += "body  : " + req_body + "\n"
        self.send_response(200)
        self.send_header('Content-type', 'text/html; charset=utf-8')
        self.send_header('Content-length', len(body.encode("utf-8")))
        self.end_headers()
        self.wfile.write(body.encode("utf-8"))
host = '0.0.0.0'
port = 8000
httpd = b.HTTPServer((host, port), MyHandler)
print('サーバを起動しました。ポート:%s' % port)
httpd.serve_forever()
```
PHP-timezoneの変更と注意点-

phpにて
timezoneのデフォルトは、以下のようにドイツのベルリンが標準になっている。

```
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "Europe/Berlin"
```
そのため、phpで

```.php
<?php
echo date('Y-m-d H:i:s');
```
と出力しても日本時間ではない場合があるので注意が必要。

## 変更方法
①__はじめに設定ファイルを確認する。__
phpファイル内で

```.php
<?php
phpinfo();
```
と出力するか、MAMPにてwebPageを開いたtools内のinfoを確認する。




②__そこに表示される以下のパスが設定ファイルのパスである。__
<img width="318" alt="スクリーンショット 2018-12-09 午前0.25.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/252675/de7bf62c-71a9-6c0f-ff59-3648dc8d7b84.png">

③php.ini内の設定の変更

```
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "Europe/Berlin"  <--ここを変更
```                

　　　　　　　　　　　　　　　↓

```
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "Asia/Tokyo"  <--ここを変更
```

④MAMPの再起動

これで、日本時間に設定できているはずである。
<img width="317" alt="スクリーンショット 2018-12-09 午前0.32.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/252675/bc34698b-93b0-4b2f-25fd-b008449cabdf.png">

Default timezone => Asia/Tokyoになっていることが確認できる。


## 注意点
上記の方法をやってみても変更ができない場合は、以下の方法を試してみる。

①間違ったファイルパスのphp.iniを変更してないか？
②スペルミスはないか？
③再起動はしたか？

__④意外なミスとして以下がある。__
最初の段階でphp.iniのdate.timezoneの行の先頭に __;__ がついている場合がある。

```
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
; date.timezone = "Asia/Tokyo" 
```
__;__ はコメントアウトという意味なので、注意が必要。

```
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "Asia/Tokyo" 
```
__;__　が取れているかの確認をしてみよう！！
正規表現にマッチした部分をExcelに書き出す + プロットする(python版)

# 概要

VBScriptで書いた[正規表現にマッチした部分をExcelに書き出す + プロットする](https://qiita.com/int_main_void/items/f59d9e9f2a8d8f9c6b51)のpython版です。
![plotpy.gif](https://qiita-image-store.s3.amazonaws.com/0/34777/4224fddd-d6d5-3995-e36c-d912db46ad4d.gif)


# 使ったデータ

```plot.txt
(1,100)
(2,200)
(3,300)
(4,400)
(5,500)
```

# 使った正規表現

```
"\((\d),(\d{3})\)"
```

#バッチファイル(plot.bat)

使いたいpython.exeを下記の引数で呼び出しているだけです

```plot.bat
@echo off
使いたいpython.exeのフォルダ\python plot.py %1

```

# コード 
`excel.Visible = False`にする場合は、スクリプトの最後で[Save/SaveAs→Close→Quitの流れで閉じる](http://blog.livedoor.jp/midorityo/archives/50735275.html)ようにします。Quitを呼ばないと[Excel.exeが残ります](https://web.archive.org/web/20110405220235/https://technet.microsoft.com/ja-jp/scriptcenter/ff522015.aspx#8)。

```python:plot.py
# -*- coding: utf-8 -*-
import sys
import chardet
import win32com.client
import re

def plot(fname):
    #------ 本題とあまり関係ない部分 ここから ------
    #Excelを起動する
    excel = win32com.client.DispatchEx("Excel.Application")

    #Excelを画面表示する : VisibleプロパティをTrueにする
    excel.Visible = True #FalseにするときはSave/SaveAs→Close→Quitの流れが必要(Excel.exeが残ってしまう)

    #Excelを最前面に表示する
    WshShell = win32com.client.Dispatch("WScript.Shell")
    WshShell.AppActivate(excel.Caption)

    #アクティブなシートのオブジェクトを持っておく
    sheet = excel.Workbooks.Add().ActiveSheet

    #入力のテキストファイルのencoding判定しておく
    encoding = ""
    with open(fname, "rb") as f:
        encoding=chardet.detect(f.read())["encoding"]
    #------ 本題とあまり関係ない部分 ここまで ------

    ##
    # 正規表現にマッチした部分をExcelに書き出す + プロットする
    ##
    # まずは、正規表現にマッチした部分をExcelに書き出す
    with open(fname, encoding=encoding) as f:
        for s in f:
            m = re.search(r"\((\d),(\d{3})\)", s) #パターン設定+検索実行
            if m:
                #マッチした場合
                #Excelに書き出す
                sheet.Cells(excel.ActiveCell.Row,1).Value = m.group(1)
                sheet.Cells(excel.ActiveCell.Row,2).Value = m.group(2)
                
                #セルを次の行に進めておく
                sheet.Cells(excel.ActiveCell.Row+1,1).Select()
    
    # 次に、Excelに書き出したデータをプロットする

    chart = sheet.ChartObjects().Add(120, 20, 200, 150) #チャートオブジェクトを作る
    
    chart.Chart.ChartType = 74 #散布図にする。xlXYScatterLines(74)

    chart.Chart.SetSourceData(sheet.UsedRange) #データソースに書き出した箇所を設定する

if __name__ == "__main__":
    plot(fname=sys.argv[1])

```

# 参考
[[Python] Win32COM and Excel Charts - Grokbase](https://grokbase.com/t/python/python-list/006py49bsc/win32com-and-excel-charts)
Goでopenweatherapiを使って東京の天気を取得する

Goの練習として、openweatherapiというフリーで使える天気情報取得サービスのAPIを利用するものを作ってみた。
また、単純にリクエストを投げて結果を表示するだけでも良かったが、structに格納してから改めて文字列として出力するようにしてみた。

## 技術要件

* Go 1.11.2

## 事前準備

openweatherapiのAPIキーが必要になるので、アカウント登録をしてこれを取得する。
無料だとリクエスト数や利用できるAPIに制限がかかるが、今回は特に問題はない。

https://openweathermap.org/

## 実装

```go
package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "net/url"
)

const OpenWeatherApiKey = "YOUR_OPENWEATHERAPIKEY_HERE"

type Coord struct {
    Lon float32
    Lat float32
}

type Weather struct {
    Id int
    Main string
    Description string
    Icon string
}

type Main struct {
    Temp float32
    Pressure int
    Humidity int
    TempMin float32
    TempMax float32
}

type Wind struct {
    Speed float32
    Deg int
}

type Clouds struct {
    All int
}

type Sys struct {
    Type int
    Id int
    Message float32
    Country string
    Sunrise int
    Sunset int
}

type Response struct {
    Coord Coord
    Weather []Weather
    Base string
    Main Main
    Visibility int
    Wind Wind
    Clouds Clouds
    Dt int
    Sys Sys
    Id int
    Name string
    Cod int
}

func main() {
    values := url.Values{}
    values.Add("q", "Tokyo")
    values.Add("APPID", OpenWeatherApiKey)

    req, err := http.NewRequest("GET", "https://api.openweathermap.org/data/2.5/weather", nil)
    if err != nil {
        panic(err)
    }

    req.URL.RawQuery = values.Encode()
    client := &http.Client{}
    res, err := client.Do(req)
    if err != nil {
        panic(err)
    }

    defer res.Body.Close()

    response := Response{}
    err = json.NewDecoder(res.Body).Decode(&response)
    if err != nil {
        panic(err)
    }
    result, err := json.Marshal(response)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(result))
}
```

簡単に使用したAPIの説明をすると、今回はweatherという機能を使用している。
これは`q`に地名を指定することで、その場所の天気情報を取得することができる。
APIキーは`APPID`として指定する。

これを実行すれば東京の天気が取得できる。

```bash
> go run main.go
{"Coord":{"Lon":139.76,"Lat":35.68},"Weather":[{"Id":803,"Main":"Clouds","Description":"broken clouds","Icon":"04n"}],"Base":"stations","Main":{"Temp":279.18,"Pressure":1015,"Humidity":57,"TempMin":0,"TempMax":0},"Visibility":10000,"Wind":{"Speed":7.2,"Deg":340},"Clouds":{"All":75},"Dt":1544281200,"Sys":{"Type":1,"Id":8074,"Message":0.0043,"Country":"JP","Sunrise":1544218696,"Sunset":1544254049},"Id":1850147,"Name":"Tokyo","Cod":200}
```
Drupal8 チーム開発を始める前に

## はじめに

今回の内容は、仕事の都合でDrupal開発することになっちゃった人向けです。
前提として、以下を想定して書きます。

- PHPer
- Drupalは初めて
- 2〜4人くらいで同時にDrupal開発
- Drupalのバージョンは8

Drupalで複数人で開発を始めるときに、
事前に頭に入れておいた方が良さそうなトピックをまとめて見ます。

## Composer & Git

Drupalコアやモジュール、テーマはComposer(PHPのパッケージ管理)で一発導入可能です。

なので、DrupalコアのインストールからComposer使いましょう。
[Using Composer to manage Drupal site dependencies](https://www.drupal.org/docs/develop/using-composer/using-composer-to-manage-drupal-site-dependencies)

後述するconfig管理やカスタムモジュール、テーマを作成すると思いますので、通常のシステム開発同様Gitでソース管理は必須だと思います。

ComposerとGitはソースコード管理として機能がかぶるので、
どのように運用するか最初に決めましょう。

1. Composerで管理する部分はGit管理しない
2. Composer対象も一緒にGit管理する

個人的な全部Git管理が好きです。稼働環境に反映するときにComposer繋がらない!!という時が当たると辛いからです(笑)


## 開発エディタ・ツール

最低限、以下の内容ができるエディタ・ツールならなんでもOKだと思います。

* Drupalのコーディングスタンダードに準拠するフォーマットへ整える
* phpcsを即時実行できる環境を用意してコードをきれいに保つ
* 関数・メソッド・変数の補完機能を使って楽をする
* XDebugと連携してデバッグしやすい環境を整える

私はPHPStormが好きですが、VSCodeを使う方もいます。

[PHPStorm](https://www.jetbrains.com/help/phpstorm/drupal-support.html)
[VSCode](https://www.drupal.org/docs/develop/development-tools/configuring-visual-studio-code)


## 開発環境

自分の手元に動作させるには、仮想マシンを用意するのが良い気がします。ベースはVagrant・Dockerでしょうか。

おまけとしてデモ環境で動かすには、Dockerをサクッと定義して起動してくれるLandoは便利でした。

[Lando サンプル(Drupal Meetup Tokyoデモコード)](https://github.com/drupal-tokyo/drupalTokyo_24)


## Configuration Management

Drupalはあらゆる設定内容がDBに登録されています。
DBのテーブル定義を決めてしまう内容ですらDBにあります。

それをyamlファイルで管理しやすくしようというのが、
Configuration Managementです。

Configuration Managementの基本は、

* 自分のサイト設定をすべてyamlへエクスポート
* インポートするときは、yaml一式の内容で強制的にサイト設定を更新する

です。

ファイルになれば、Gitで管理できてDiff確認も簡単ですよね。

Configuration Managementで気をつける点としては、

* 作業するまえに、他人の差分を取り込む
Git最新取得だけではなく、Drupalへのyamlインポートもやる
* yamlをエクスポートしたときに、自分が変更していない差分があれば気にかける

です。

複数人開発で陥りやすいのは、自分の環境が最新だと思ってエクスポートしたら古い設定も出力されて開発が巻き戻る・・・的なところです。

コードレビューを必須にしたり、自動化スクリプトを作ったりして、開発ルールで防ぎましょう。

## モジュール

モジュールの組み合わせでDrupalの機能が決まります。
ちょっとでも楽に開発するために少しづつ気にしてみてください。

* 拡張モジュール
    * 拡張モジュールを探す癖をつける
    * 拡張モジュールにバグがあってもissue・パッチを見つける努力をしてみる
        * コントリビュートできたら最高ですね！
    * 拡張モジュールに手を入れない。絶対！
* カスタムモジュール
    * 他の拡張モジュールのソースコードを読んでみる
    * Drupalのドキュメントを読んでみる 
        * https://www.drupal.org/docs/develop
    * Deprecatedメソッドは使わない

## おしまいに

ものすごく偏った内容ですが、一度はぶち当たった問題ベースで書いてみました。

もっと他の話も知りたいという方は、
Drupal Meetup Tokyo や他の勉強会でお会いしましょう！
ASP.NET Core でFacebook認証を行う方法

# 内容
ASP.NET Coreを使って Facebook認証を実装できるようになること

# 事前準備

[前回のこちら](https://qiita.com/github129/items/ed0a59cfeac3c91c7208)の設定をご覧ください

# 実装

前回のこちらを参考に１部だけ追加を行います。
それ以外はすべて同じですので、そのまま全て実装してください。


## Startup.csに追加する

servicesに対してfacebookAuthを追加します

```csharp:Startup.cs
            services.AddAuthentication(options =>
            {
                options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            }).AddFacebook(facebookOptions =>
            {
                facebookOptions.AppId = "your_appId";
                facebookOptions.AppSecret = "your_secret_key";
            })

```

twitterと違うところはAppIdになっている点でしょうか。
[Facebook for developers](https://developers.facebook.com/?locale=ja_JP)からアプリを登録して値をそれぞれ取得しましょう。

プロダクト→Facebookログイン→クイックスタート→webから設定ができます。
表示されていない場合はプロダクトの＋ボタンから追加しましょう。

以下設定値

| 項目      |       値 | 
|:-----------------|------------------:|
| サイトURL           |              localhost:{ポート番号} |   

設定で有効なOAuthリダイレクトURIを設定します
今度はクイックスタートではなく設定を選択します。

| 項目      |       値 | 
|:-----------------|------------------:|
| 有効なOAuthリダイレクトURI         |         https　:　//localhost:{ポート番号}/singin-facebook |   

警告をすべて消すように設定してください。

AppID(アプリID)とapp secretに関しては
設定→ベーシック設定で取得することができます。

他は[前回実装](https://qiita.com/github129/items/ed0a59cfeac3c91c7208)したOKです。

# 参考

- https://www.youtube.com/watch?v=qL3tZ6yHWMA
- [前回の実装 ASP.NET Core でTwitter認証を行う方法](https://qiita.com/github129/items/ed0a59cfeac3c91c7208)
TypeScriptでGASを書くときにMoment.jsの定義ファイルをどう使うか

ちょいハマったのでメモ。

## 実はTypeScriptでかけるGoogle Apps Script
多くのGASerは知っているので、詳しくは割愛しますが、ローカルトランスパイル不要で、`clasp push`するだけで、自動的にサーバサイドでやってくれます（2018年の夏ぐらいから）。

### Global Install
```
$ npm i -g typescript
$ npm i -g @google/clasp
$ npm i -g tslint
```

### When start GAS project
```
$ clasp create <YOUR_GAS_PJ_NAME> --rootDir ./src
$ clasp pull
$ npm i -S @types/google-apps-script
$ tsc --init
$ tslint --init
```

# GASの外部ライブラリどうするか問題
ScriptId指定で読み込む外部のライブラリをどう取り扱うかです。
例えばGAS利用者で人気のmoment.js。

普通のJavaScript処理系では、次のように使いますが

```JavaScript:app.js
var moment = require('moment');
var now = moment();
```


GAS上では次のように使いますね。

```JavaScript:app.gs
var now = Moment.moment();
```

本来の使い方では、エクスポートされた関数をそのままGlobal空間のなかで使えますが、GASの外部ライブラリは、名前空間の概念がないため、そのライブラリ名がGlobal空間の変数名となり、必ず`LibraryName.LibraryMethod()`のように呼び出すことになります。

厄介なことに、ローカルの開発では外部ライブラリファイルは当然見えないため、tslintにいろいろ怒られるはめになります。

## 型定義が使えない
moment.jsには型定義ファイルがあります。ところが、上記の仕様のため、moment.d.tsの型定義ファイルを導入しても、そのままではGAS用TypeScriptで使えません。
ちなみにmoment.jsの型定義ファイルは、こうなってます。

```TypeScript:moment/moment.d.ts
declare function moment(inp?: moment.MomentInput, format?: moment.MomentFormatSpecification, strict?: boolean): moment.Moment;
declare function moment(inp?: moment.MomentInput, format?: moment.MomentFormatSpecification, language?: string, strict?: boolean): moment.Moment;
declare namespace moment {
// メソッド定義のexport
}
export = moment;
```

## 型の補完を効かせたい
単純にこうしました。

```TypeScript:gas/src/app.ts
const Moment = { moment : moment };
```
ただ、なんとなく納得が行かない感じが残ります。

### 型定義ファイルがない場合
これはもうDeclaretion宣言しかなさそう。

誰かいい方法知っていたら教えてください。
PHPとRailsの選定について


## はじめに
YYPHPの参加者にもPHP、プログラミング始めたてです。という方が多くいらっしゃいます。
そのような方からよく質問を受けるものとして。

**「RailsとPHPってどっちを勉強したらいいですか？」**

こちらの疑問に対しての直近1年Railsを実務で扱ってきた私からの私見を語りたいと思います。

## 結論
先に結論から述べておくと

**完全に1人で勉強を始めるならRubyonRailsから始めた方がいい。
周囲に他の言語に明るい人がいるならどちらでもいい。**

です。

### 完全に1人で勉強を始めるならRubyonRailsがいい

#### 非常に教材が充実していること

+ Progate
+ RailsTutorial

PHPには(私の知る限りでは)アプリケーションを実際に作りながら学ぶための教材がないため、独学で学ぶにはどうしても苦しいものがあります。


#### 規約に則った実装方針
RailsはREST(REpresentational State Transfer)を始めとした様々な規約に基づいた実装をするようにため、初心者が陥りがちな、どうしてファイルをわけないといけないのか、この処理はどこに書いたらいいのか、といった疑問に1人でどハマりすることなく実装を行えます。

#### Rubyにおけるのオブジェクト指向のわかりやすさ

PHPは `1` はただの数値リテラルですが、Rubyは　`1` もれっきとしたオブジェクトとして扱われます。そのため、前日の日時を知りたい場合に、より直感的に式を記述することができます。


### PHPのよさ
先に書いたようにRubyonRailsにはだれでもわかりやすい記述ができる点が初心者に注目される理由だと思っています。
ではPHPを勉強することのよさとはどこにあるのかという点です。


#### 環境構築の容易さ
初心者がプログラミングでつまづく理由の１つに環境構築があると思います。
PHPならXamppでWebサーバを立ち上げればすぐに始めることができるので、特に楽です。
また、始めはHTMLに直接PHPを書くことで、動作させて、公開することができるため、企業に対してのアピールという点では非常に効果的だと思います。

#### 案件の豊富さ
PHPはWebコンテンツ開発に特化した言語としては非常に多く用いられているため。クラウドソーシングを始めとしてPHPの案件数は非常に多く、多くの企業でも未経験からの採用のハードルがそこまで高くありません。
SSL証明書の期限を出力するワンライナー

某ニュースを見て、証明書といえばWebサーバの証明書も心配かもということで書いてみた。

```
curl --verbose https://www.yahoo.co.jp/ 2>&1 | grep 'expire date'
```

本当はGoogle Apps Scriptで書けたら、気になるURLをコピペするだけで一気に取得できるかもと妄想したが、下々の者が触らせてもらえるAPIは公開されてないようで。

```
function getCertifiateExpireDate(url) {
  var response = UrlFetchApp.fetch(url);
  expire_date = hogehoge...;
  return(expire_date);
}
```
NuxtアプリをApp Engineにデプロイしてなんちゃって独自ドメインで公開する.

やること
============================================================

ローカルマシンで作成しているNuxtアプリをGoogle Cloud PlatformのApp Engineにデプロイする手順を説明します.

Compute EngineでNuxtアプリを走らせて、独自ドメインをとって、SSL証明書取って＆置いて、とせっせとやっていたのですが、NuxtをApp Engineで走らせるだけで「ほぼ独自ドメイン&常時SSL対応」ができることに気づいてしまったのでメモメモ.

公式のクイックスタートを参考にしました.
https://cloud.google.com/appengine/docs/standard/nodejs/quickstart

前提条件
============================================================
* npm (5.2.0以上) がインストールされている.
* Cloud SDKがインストールされている.


Nuxtプロジェクトをローカルマシンに作成する.
============================================================

## Nuxtプロジェクトを作成する.
create-next-appで雛形を作成する.

```bash

   $ npx create-nuxt-app <my-app>

   # 好みに合わせて質問に答える. 回答例.
   # ? Project name MyApp
   # ? Project description MyApp Project
   # ? Use a custom server framework express
   # ? Use a custom UI framework none
   # ? Choose rendering mode Universal
   # ? Use axios module yes
   # ? Use eslint yes
   # ? Use prettier no
   # ? Author name myname
   # ? Choose a package manager npm
```

## ローカルでNuxtアプリをbuild&startする.

```bash
   $ cd my-app
   $ npm run build
   $ npm start
```

## ブラウザで確認
http://127.0.0.1:3000 にアクセスしてNuxtの初期ページが表示されることを確認する.


App Engineアプリケーションを作成する
============================================================

## GCPコンソールでGCPプロジェクトを作成する.
GCPプロジェクトIDがアプリのURL (https://[my-app-project].appspot.com) になるので注意.

## GCPコンソールでApp Engineアプリケーションを作成する.
「初めてのアプリへようこそ」の「言語を選択」からNode.jsを選択する. 
![nuxt_on_gae_01.png](https://qiita-image-store.s3.amazonaws.com/0/324285/2b771650-e3d2-f1c6-567b-3a30e529f054.png)

## アプリのリージョンを選択する.
後から変更できないので注意. リージョンを選択した後、チュートリアルが始まりますがそれは無視しました.
![nuxt_on_gae_02.png](https://qiita-image-store.s3.amazonaws.com/0/324285/6f91d34f-22c6-657e-23e6-65e3e3979aa6.png)

App Engineにデプロイする
============================================================

## package.jsonでHOSTを指定する.
package.jsonの"start"にHOSTの設定を追加する.
HOST=0.0.0.0でリモートマシンからの接続を許可する.

```bash
   "start": "cross-env NODE_ENV=production HOST=0.0.0.0 node server/index.js"
```

## app.yamlでデプロイ構成を指定する.
上で作成したNuxtプロジェクトのルートディレクトリにapp.yamlを作成し、以下を記述する.

```bash
   runtime: nodejs8
   env: standard
```

## デプロイする.
Nuxtプロジェクトのルートディレクトリで以下のコマンドを実行してデプロイする.

```bash
   $ gcloud app deploy --project my-app-project

   # Services to deploy:

   # descriptor:      [xxxxxxxxxxxxxx/my-app/app.yaml]
   # source:          [xxxxxxxxxxxxxx/my-app]
   # target project:  [my-app-project]
   # target service:  [default]
   # target version:  [xxxxxxxxxxxxxx]
   # target url:      [https://my-app-project.appspot.com]
```

## target urlにアクセスする.
Nuxtの初期ページが表示されることを確認する.

おわり
============================================================
いとも簡単になんちゃって独自ドメインと常時SSL対応ができてしまった...
AWSで気軽にConcourseを試してみる

　これは[Yahoo! JAPAN 18 新卒 Advent Calendar 2018](https://adventar.org/calendars/3388)の9日目の記事、及びConcourse Advent Calendar 2018の9日目です。

　同じ記事で複数advent calendarなんて不思議な話ですが、まあそれはそれ（そんなことするから、Concourseの他の記事と内容が類似しちゃうんだよ）

　題名通り、AWSでConcourseを試してみよう的な記事。
Concourseを自前でも欲しいって事で、やってみる。
　今回はDockerを使います。BOSHを使ってもよいのですが、AWSの無料枠は1ヶ月750時間なので複数インスタンスを使うのはお財布に厳しい！

# 事前準備
* AWSのインスタンス（今回はAmazon Linux AMI 2018.03.0 (HVM), SSD Volume Type）の用意。
* Docker install
* Docker Compose install
* (gitも入れておくと良い)


　インスタンスの立ち上げ方とか、dockerのinstallとかは無限に記事があるので、そちらをご参照下さい。

# Concourseを立ち上げる
```
wget https://raw.githubusercontent.com/starkandwayne/concourse-tutorial/master/docker-compose.yml
```

　ありがたい事に公式のdockerイメージと、それを利用したdocker-compose.ymlがあるので、それを手に入れましょう。
　ただしこれはlocalで使う用途のものなので、23行目を下記のように編集して下さい（YOUR_AWS_IPは、インスタンスのIPに書き換えてください）

```
- CONCOURSE_EXTERNAL_URL=http://YOUR_AWS_IP:8080
```

　これで準備は出来たので、後は

```
docker-compose up -d
```

を実行するだけ。これで　http://YOUR_AWS_IP:8080 にアクセスするとConcourseが立ち上がってるのが確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/164212/43b698b2-dd49-0b22-1184-8a0babeccad0.png)

※　アクセスできない場合は、恐らくAWSのインスタンスが8080ポートを開放してない可能性があります。インスタンのセキュリティグループ=>インバウンド=>編集から8080/tcpを追加して下さい。

　後は右上のloginから、userとpassにadminと入力するだけ！（今回はローカルではないので、docker-compose.ymlからuserとpasswordを変更しておくと良いかも）　loginが上手くいかない場合は、CONCOURSE_EXTERNAL_URLに正しい値が入ってないからかも。

# Concourseを操作する
　基本、Concourseはflyと呼ばれるコマンドを使って操作します。fly自体のinstallは

```
wget "http://YOUR_AWS_IP:8080/api/v1/cli?arch=amd64&platform=linux" -O fly
sudo install fly  /usr/local/bin
```
で出来ます。`fly --version`で`4.2.1`と表示されたらOK。
　此処まで出来たら、後は好き勝手にpipelineを作って自由にできる！

```
fly --target admin login --concourse-url http://YOUR_AWS_IP:8080 -u admin -p admin
fly -t admin set-pipeline -c pipeline.yml -p hello-world
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/164212/1266ad47-6657-fade-2954-097bc076b854.png)


# 終わりに
　今回は、Concourseを取り敢えず個人用に使って見たかったので、AWSとかいう簡単にインスタンスを立ち上げられるものと一緒に合わせて作りました。
　此処まで出来たら、後は豊富なConcourseのresourceを使って何でも出来ます。discordのbotとかいうニッチな物も作られてるので、俺はslackじゃなくてdiscordで情報管理をしたいんだ！　みたいな要望にも答えられて素敵！

# 参考
 https://concoursetutorial.com/
ハッシュの持つ複数の意味 

　ハッシュ(hash)は、情報系用語として複数の異なる意味を持つ。この記事ではハッシュについてそれぞれの意味を整理するとともに、ハッシュ値に置き換えることをハッシュ化と呼ばないことを提案する。

#ハッシュの主な意味
　大きくハッシュ記号とハッシュ法由来に分けられる。また、情報系以外ではハッシュドビーフなど料理でもよく使われている用語である。

- ハッシュ記号
 - ハッシュタグ 
- ハッシュ法
 - ハッシュ関数
 - 連想配列の別名
 - メッセージダイジェスト
 - Git コミットハッシュ

##ハッシュ記号とハッシュタグ
　TwitterなどSNSでお馴染みのハッシュタグは、#ではじまる一種のラベルである。#の字形が刃物でみじん切りの痕に似ているからであろうか。英語で#のことをハッシュシンボルと呼ぶ。それ使ったタグラベルなので、ハッシュタグになった。このハッシュタグは、諸説はあるにしろ次節より話題にするハッシュ法をもとにしたものとは直接関係がない。**ハッシュシンボル**、**ハッシュタグ** どちらもハッシュと略すことがある。

##ハッシュ法
　ハッシュ法とは、コンピュータに保管されているデータを高速にアクセスするための技術である。通常コンピュータにあるデータは、メモリアドレスなどのアドレス番号で管理されている。目的のデータに素早くアクセスができるようにアドレス番号の目次を作ることがある。その目次の仕組みにハッシュ法は広く使われている。アクセスは概ね次の手順で行われる。まずデータをハッシュ関数と呼ばれる変換関数で処理しハッシュ値と呼ばれる値を生成する。このハッシュ値とアドレス番号を組み合わせた目次をハッシュテーブルと呼ぶ。これを使い目的のデータのアドレス番号を入手しアクセスする。
　ここで登場した**ハッシュ法**、**ハッシュ関数**、**ハッシュ値**、**ハッシュテーブル**、 全てハッシュと略することがある。

##連想配列の別名
　プログラミング言語における連想配列とは配列の添字に文字列を使用することである。一部の言語では**ハッシュ**と呼ばれている。これはPerlなどで連想配列がハッシュ法で実装されていることが由来である。言語によってはコレクション(collection)とも辞書(dictionary)とも呼ばれている。

##メッセージダイジェスト
　ハッシュ法で使われているハッシュ関数は同じ値になりにくいものが求められる。 メッセージダイジェストは、この性質を応用しデータの検証を行う。ハッシュ値が異なれば元データが違うことを示せるからだ。ハッシュ値からは元の値を推測することは難しいのでパスワードの保存などに使われている。また、ここで使われるハッシュ関数は暗号学的ハッシュ関数と呼ばれており、ハッシュ法で使われているものに比べてさらに推測しにくい工夫が凝らされている。具体的な暗号学的ハッシュ関数のアルゴリズムにはSHA2がある。かつて多く利用されていたMD5には脆弱性が指摘されており利用機会は減っている。
　メッセージダイジェストのハッシュ値の目的が改ざん検出で、ハッシュ法のハッシュ値の目的であるハッシュテーブル利用とは全く異なっている点に注目して欲しい。**暗号学的ハッシュ関数**と暗号学的ハッシュ関数による**ハッシュ値**どちらもハッシュと略されることがある。

#Git コミットハッシュ
　バージョン管理システムのうち、GitはSubversionと異なり分散型なため更新日時でファイルの更新管理をすることはできない。そこで前節で説明したメッセージダイジェストをファイルの更新管理に利用している。このメッセージダイジェストのハッシュ値のことを**コミットハッシュ**と呼ぶ。これもハッシュと略されることがある。

#ハッシュ化
　hashingの訳として使われることがあるようだ。[e-words.jp](http://e-words.jp/w/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E5%8C%96.html
) では次のように紹介されている。

>ハッシュ化とは、元のデータから一定の計算手順に従ってハッシュ値と呼ばれる規則性のない固定長の値を求め、その値によって元のデータを置き換えること。パスワードの保管などでよく用いられる手法である。

　せめてハッシュ値化にできなかったのだろうか。ハッシュにはこれまでに説明したとおり複数の意味がある。この様な用語に単純に化をつけるのは混乱のもとなので避けたほうがよい。ハッシュ化だけでは、全て#に置換されてしまうこともありえる。


#おわりに
　ハッシュには、ハッシュ記号由来のものとハッシュ法由来の用語があり、更にハッシュ法由来のものには意味が異なる使い方があることを説明した。特に口頭では省略されやすく勘違いしやすい。無用なトラブルを避けるためにも正確な意味を把握し本来の意味を文脈から推察する必要がある。


#更新
2018/12/10 Gitコミットハッシュの追加。コメント頂いたtenmyo様に感謝します。詳細はコメント欄参照のこと。
Railsの自己結合②

#Railsの自己結合②
**はじめに**
前回の続きです。Rails Developers MeetUpでお話聞きながら書いてます。

##Railsで自己結合やってみる##

前回、自己結合が何かイメージできたところで実装です。
親子関係のあるPersonクラスを元に考えていきます。


```20181208054943_create_people.rb
class CreatePeople < ActiveRecord::Migration[5.1]
  def change
    create_table :people do |t|
      t.string :name
      t.references :person, foreign_key: true

      t.timestamps
    end
  end
end
```

Personモデルを作ります。
`references`で参照するカラムを作成し、外部キー制約も指定しています。

`rails db:migrate`します。

```schema.rb
ActiveRecord::Schema.define(version: 20181208054943) do
  create_table "people", force: :cascade do |t|
    t.string "name"
    t.integer "person_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["person_id"], name: "index_people_on_person_id"
  end
```

Personテーブルが作成されました。`reference`では自動でperson_idを作成してくれます。`index`も自動で貼ってくれます。
`person_id`を用いて親を参照できるようにします。


```Person.rb
class Person < ApplicationRecord
  has_many :children, :class_name => 'Person', :foreign_key => 'person_id', dependent: :destroy
  belongs_to :parent, :class_name => 'Person', :foreign_key => 'person_id', optional: true
end

```

1対Nの関係になりますので、`children`を多数持つので`has_many :children`、
その逆で`parent`は一人なので、`belongs_to :parent`となります。
`:class_name`はもちろん`Person`ですね。外部キーは`person_id`を指定します。
`dependant`によって親が消えたら子も消えるようにしてます。

```ruby
p = Person.create(name: "aaa")
p.children = [Person.create(name: "bbb")]
p
#=> #<ActiveRecord::Associations::CollectionProxy [#<Person id: 1, name: "aaa", person_id: 2, created_at: "2018-12-08 14:54:37", updated_at: "2018-12-08 14:54:37">]>
```

これで自己結合は完了です。実際に親を参照できるか試してみましょう。

```ruby
p.children.first.parent
#=>#<Person id: 1, name: "aaa", person_id: nil, created_at: "2018-12-08 14:52:26", updated_at: "2018-12-08 14:52:26">
```

これで自己結合は完璧ですね！
[cocoa][swift]BUKURO.swift 2018-09 を振り返る

<p>Cocoaを一人で勉強するのはつらくて長い道のり...<br />
そんなあなたの<br />
Cocoa.swift</p>

# Cocoa.swiftについて
<ul>
<li>Cocoa勉強会 関東 Swift分科会 です。</li>
<li>ほぼ毎月、池袋コワーキングスペース OpenOffice FOREST で開催してます。</li>
<li>macOS/iOS/watchOS/tvOSプログラマーのための勉強会です。</li>
<li>プログラムに関する知識や経験を共有を目的としています。</li>
<li>会の活動内容や発表資料、サンプルコードは公開を前提としています。</li>
<li>申し込みは、connpassから。<br /><a href="https://cocoa-kanto.connpass.com/">https://cocoa-kanto.connpass.com/</a></li>
</ul>

# swiftで作るLifeGame
<p>以前の発表したプログラムを、Documentベースにして、NSMatrxiの使用をやめて、Swiftで書き直しました。</p>

# Web API 通信の符号化について
## ASN.1, JSON, MessagePack, ProtocolBuffers, FlatBuffers, Avro
<p>HTTP通信の基礎的な話から、JSON以外のシリアライズ方法について説明しました。<br />
JSONの次は？MessagePackか？というところにAppleがSwift Protobufが提供した！ということと、サーバ側との連携を考えるとIDLに対応しているかどうか？というのが注目ポイントなのでしょうか？</p>

# AppleScriptとは何ぞや
## UNIXユーザーのためのとっかかり
<p>今のmacOSを活用しているエンジニアが業務で利用できるという観点から再利用可能なコード例が発表された。</p>

【関連情報】
<a href="https://qiita.com/advent-calendar/2018/cocoa">Cocoa Advent Calendar 2018</a><br />
<a href="https://cocoa-kanto.connpass.com/event/97193/">BUKURO.swift 2018-09</a><br />
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />
<a href="https://qiita.com/m_yukio">Qiita</a><br />
Todo管理をCUIでやってみたい

LIFULL新卒2年目エンジニアの@poyonexです。
本記事は[LIFULL Advent Calendar2018](https://qiita.com/advent-calendar/2018/lifull) 8日目の記事になります。

# はじめに
突然ですが、皆様業務や日常生活で演るべきタスクをどのように管理していますか？
おそらくですが、何かしらのTodo管理ツールを利用されているのではないでしょうか。
TrelloやMicrosoft Todo等々、様々な管理ツールが存在し、それを活用されていることでしょう。
（私も業務ではMicrosoftのTodo管理ツールを使っています）

しかしこれらのツールには共通した問題があります。
Todoを可視化するために、素敵なデザインを持っているがゆえに、マウスを利用せねばならないということです。
皆様の手元を見てください、キーボードとマウス、結構遠いです。
タスクの情報を書き換えたりステータスを変更したりと、この遠い距離を一日に結構な回数往復します。
「これをキーボードから手を離すことなくステータスが変更できれば最高なのでは？」
というのが、この記事の発端になります。
（どうなんでしょう、僕だけかもしれません）

# CUIによるTodo管理ツール
の、プロトタイプを作成しました。
かなり突貫で実装してますので、これからもりもり拡張していく予定です。
https://github.com/utayo/todo_cui
![Screenshot from 2018-12-08 23-30-21.png](https://qiita-image-store.s3.amazonaws.com/0/211856/ae28d631-f0c9-d66c-9d08-a385a5472be6.png)
言語はRuby, CUIの主な機能はttyというgemを利用しています。
https://github.com/piotrmurach/tty

##使い方（雑）
基本的に現在できる機能は以下のとおりです。

* 毎日の業務をバックログへ追加
* バックログへのタスクの追加
    * add taskを選択
    * タスク名を入力
* バックログのタスクを完了へ移動
    * complete taskを選択
    * 完了するタスクを選択

タスク管理ツールのミニマムだと思います。
タスク名以外は方向キーとEnterキーだけで動かせます。
（ホントはj/kでカーソル移動できたりすると最高なのですが）

## ttyについて
https://github.com/piotrmurach/tty
コマンドライン上の表示/操作をうまいことやってくれるGemです。
情報は↓記事を参考にさせていただきました。
https://qiita.com/OwlQiita/items/40703a2f02e73eae45d1

詳細はttyのライブラリを参照ください。
（後に実装の便利機能についてここは追記します）
Docker に載せるOSのサイズ比較（更新中）

# Docker に載せるOSのサイズ比較

Dockerに載せるOSにはいろいろなものがありますが、コンパクトに動かすためにサイズは気になるとこです。
ちょっと、比較していきますが、少しずつ更新していく予定なので、成長中の記事となります。

## オフィシャルイメージって？

Docker公式に [Docker Official Images](https://github.com/docker-library/official-images) というのがあります。
公式に提供されてる docker のイメージ集みたいなものですね。
何も考えずに、`docker run` 叩いてもイメージが持ってこれるものです。

確認したら、138個ありました。

```
adminer
aerospike
alpine
alt
amazonlinux
arangodb
backdrop
bash
bonita
buildpack-deps
busybox
cassandra
centos
chronograf
cirros
clearlinux
clefos
clojure
composer
consul
convertigo
couchbase
couchdb
crate
crux
debian
docker
drupal
eclipse-mosquitto
eggdrop
elasticsearch
elixir
erlang
euleros
fedora
flink
fsharp
gazebo
gcc
geonetwork
ghost
golang
gradle
groovy
haproxy
haskell
haxe
hello-seattle
hello-world
hola-mundo
httpd
hylang
ibmjava
influxdb
irssi
jetty
joomla
jruby
julia
kaazing-gateway
kapacitor
kibana
known
kong
lightstreamer
logstash
mageia
mariadb
matomo
maven
mediawiki
memcached
mongo
mongo-express
mono
mysql
nats
nats-streaming
neo4j
neurodebian
nextcloud
nginx
node
notary
nuxeo
odoo
open-liberty
openjdk
opensuse
oraclelinux
orientdb
owncloud
percona
perl
photon
php
php-zendserver
plone
postgres
pypy
python
r-base
rabbitmq
rakudo-star
rapidoid
redis
redmine
registry
rethinkdb
rocket.chat
ros
ruby
rust
sentry
silverpeas
sl
solr
sonarqube
sourcemage
spiped
storm
swarm
swift
swipl
teamspeak
telegraf
thrift
tomcat
tomee
traefik
ubuntu
vault
websphere-liberty
wordpress
xwiki
yourls
znc
zookeeper
```

結構ありますね。

## さっそくサイズの比較

実際、dockerコマンド叩いて、イメージをひっぱってきて確認しました。

```
alpine                                                          latest              196d12cf6ab1        2 months ago        4.41MB
amazonlinux                                                     latest              2467e0b1e917        11 days ago         162MB
busybox                                                         latest              59788edf1f3e        2 months ago        1.15MB
centos                                                          latest              1e1148e4cc2c        2 days ago          202MB
cirros                                                          latest              17d52dddc815        8 weeks ago         10.3MB
clearlinux                                                      latest              202faa1a3d2f        3 weeks ago         96.3MB
debian                                                          latest              4879790bd60d        3 weeks ago         101MB
fedora                                                          latest              8c568f104326        4 weeks ago         267MB
oraclelinux                                                     latest              70927e8bd213        4 weeks ago         234MB
photon                                                          latest              e0e7adda5a3e        4 weeks ago         32.1MB
ubuntu                                                          latest              93fd78260bd1        2 weeks ago         86.2MB
```

ざっくりOSをピックアップしていったので、抜けとかあるかもしれません。
やはり、`alpine` は圧倒的に小さいですね。
と思ったら、`busybox` はそれよりも小さいと・・・
使ったことないですけど、組み込み用のLinuxらしいですね。

## まとめ

オフィシャルイメージ以外にもいっぱいあると思うので、少しずつ載せていきたいと思います。
ド素人がiOSでSmalltalkを動かせるか調べてみた。

# はじめに

サーバーサイド・フロントエンドを３〜４年、iOS/Androidアプリエンジニアとして５年ほど。
Smalltalkは大学生の頃に授業の課題で耳にしたことと、Objective-Cのルーツであることくらいしか知らない。
オブジェクト指向の話題でSmalltalkが出てくるが、あまりにも知らなすぎたので今回調べてみることに。

# iSqueak というものを発見

いきなりですが、 iOSエンジニアなので今持っている得意なスキル+Smalltalkで何か出来ないか考えて最初に思いついたのがこれです。

https://isqueak.org/HomePage
https://www.mobilewikiserver.com/Scratch.html

iPhoneで動くらしいです。

これを今最新の Xcode 10.1,　iOS12 対応できたら面白そうだと作業開始。

湧き出るコンパイルエラー

つらい・・・あきらめ・・・

(iSqueak と Scratch App for IOS は同じもの？)

# Pyonkee を知る

Pyonkee というのを教えてもらい試してみました。

https://github.com/SoftUmeYa/Pyonkee

ベースとなっているのは[こちらのScratch.app for iOS](https://github.com/johnmci/Scratch.app.for.iOS)

AppStore でも公開されていて、ソースコードも公開されていました。

Xcode 10.1, iOS12 対応しようと思い、ビルド開始。

一発でビルド成功・・・! iSqueakのときの絶望はなんだったのか

Smalltalkは歴史があるからか、動かないソフトウェアが大半だと思っていましたが、しっかりメンテナンスがされているようです。

すばらしい。

DeprecatedになったAPIのワーニングは出てましたが、動作は問題なさそうです。

<img width="1109" alt="スクリーンショット 2018-12-08 8.29.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/1901/bfb0d8af-6cc7-6759-96ef-19f06cd70e1a.png">


# あれこれ用語について

## Squeak とは

https://squeak.org/
https://ja.wikipedia.org/wiki/Squeak

> Squeak（スクイーク）はSmalltalk環境のひとつで、Apple Smalltalkから派生したもの。
> Squeak（およびSmalltalk）環境においては、データもアプリケーションも、そして環境自体（つまりシステム）すら、すべてSmalltalk言語で記述されたオブジェクトで構成されているため、通常のコンピュータ環境でいうところのアプリケーションソフトという概念は希薄であるが、それでもそう呼ぶに相応しいオブジェクト群を見ることができる。

すごく興味深いことが書いてありました。

Smalltalkを開発するための環境すらSmalltalkで記述されたもの。

面白い。

<img width="1136" alt="スクリーンショット 2018-12-08 23.36.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/1901/3f258a81-5a5f-e708-ceb0-360cc3ddf0c0.png">


## Scratch とは

https://ja.wikipedia.org/wiki/Scratch_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E)

Squeak EtoysをベースにMITで開発されたプログラミング環境。
小学生向けのワークショップなども多数開催されている。

### Scratch 3.0が2019年に正式公開

まだまだ改善が重ねられウェブ版でかなり進化しているようです。

#### Demo

https://beta.scratch.mit.edu/
https://llk.github.io/scratch-gui/master/

#### SourceCode

https://github.com/LLK/scratch-gui

拡張も可能
https://github.com/LLK/scratch-vm/wiki/Scratch-3.0-Extensions-Specification

<img width="1069" alt="スクリーンショット 2018-12-08 23.38.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/1901/5bd1e22a-fcb7-da91-3eb8-1ed797978863.png">


## Google Blockly

https://developers.google.com/blockly/

GUIでブロックをつなぎ合わせてプログラミングが出来るライブラリ。

<img width="943" alt="スクリーンショット 2018-12-08 15.46.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/1901/c44679ec-68fd-4da3-e300-acecc58383c8.png">

# 雑記

Smalltalkはgccやllvmなどでコンパイルして実行するようなものではなく、
Smalltalkで作られた統合開発環境でSmalltalkで記述されたコンパイラでSmalltalkで書かれたプログラムを実行する。
鶏と卵状態じゃないかと。

他の言語と比べSmalltalkの場合、言語仕様だけでなく開発環境自体にも慣れる必要があって敷居が高い印象。
でも、環境構築とか全くいらないし、その空いた時間を環境慣れに使うとすれば、以外とそうでもない？

長く愛され様々な言語に影響を与えた言語であるため、普段使っている言語のルーツをたどる・思想を理解することで得られる事は大きいと思いました。

子供のプログラミングが盛んな昨今。うちの子ももう少し大きくなったら、 Scratch 3.0 で遊んでみようと思います。

[Original](https://tamazawa.net/2018/12/08/ド素人がiosでsmalltalkを動かせるか調べてみた%E3%80%82/)
TF-IDFとは

##背景
[arxiv](https://arxiv.org/)のサイトに掲載される論文に対して何か特徴量を抽出し、トレンドなどを得られればと考えた際に特徴語を抽出するTF-IDFを発見しました。

##TF-IDF
TF-IDFとはTFとIDFから成り立ちます。
TF(Term Frequency)は各文書における単語の頻出頻度を表しています。
IDF(Inverse Document Frequency)は逆文書頻度という希少価値の高い単語に高い値を付与します。
よってTF-IDFとは単語の頻度かつその単語の頻度を考慮した指標であるというこ
とです。

##例
```python:sample.py
from sklearn.feature_extraction.text import TfidfVectorizer

sentence = ["I'm gonna make a change.For once I'm my life It's gonna feel real good,Gonna make a difference Gonna make it right"]
vec = TfidfVectorizer(max_df=10)
docs = sentence
term_doc = vec.fit_transform(docs)
vocabulary_ = vec.vocabulary_
term_doc_array = term_doc.toarray()
print(term_doc_array)
```
結果は
`[[0. 0. 0. ... 0. 23. 0.
   0. 0. 0.57 ... 0.023. 0.
   ...
   0. 0. 0.64 ... 0.13 0. 0.]]`
 
以下のような1次元配列が出力され、TF-IDFの値が高いものが重要度が高い単語となります。
contract を試してみる

## contract?

長澤太郎さんによる、とてもわかりやすいスライドがすでにあるので見てください(完)
[Kotlin Contract](https://speakerdeck.com/ntaro/kotlin-contracts-number-m3kt)

で、終わるわけにもいけないので、具体的に試してみたことを書いてみます。

## 試してみること
+ Nullableな引数を受け取って、Nullじゃないかつ、特定の状態であればtrueを返すメソッドを作成する
    + このメソッドで判定を行った場合に、trueなら NonNullな型にスマートキャストされるようにする


## 具体的な例
nullかもしれない曜日の文字列を受け取って、休みの日(null ではない)なら `hello ${曜日}` と出力する

```kotlin
/**
 * 渡された曜日が休日かどうかを判定する
 *
 * @param dayOfWeek: "月", "火", "水", "木", "金", "土", "日", null
 * @return true:  休日
 *         false: 休日ではない
 */
fun isHoliday(dayOfWeek: String?): Boolean {
    return when (dayOfWeek) {
        "日" -> true
        else -> false
    }
}

/** "hello ${曜日名}" を出力する */
fun helloHoliday(dayOfWeek: String) = println("hello $dayOfWeek")

// "日" を設定。ただしNullable 型としておく
val dayOfWeek: String? = "日"

if (isHoliday(dayOfWeek)) {
    // 本当はこう書きたい
    // helloHoliday(dayOfWeek)
    // が、nullチェックしてからじゃないとコンパイルエラーになるため、どこかでnullチェックが必要
    if (dayOfWeek != null) {
        helloHoliday(dayOfWeek)
    }
}
```

isHoliday が true を返したら null じゃないことがわかっているのに！という場合でも、helloHolidayの引数がNonNull型のため、nullチェックが必要です。
面倒くさい！なんとかしたい！

そんな時に使えるのが`contract`です。

`isHoliday` を次のように書き換えます。

```kotlin
@ExperimentalContracts // contract はまだexperimental なので、annotationをつけておく必要がある
fun isHoliday(dayOfWeek: String?): Boolean {
    // コンパイラに、 true を返したら、引数はnullではないですよ、と教えてやる
    contract {
        returns(true) implies (dayOfWeek != null)
    }
    return when (dayOfWeek) {
        "日" -> true
        else -> false
    }
}
```

そうすると、次のような呼び出しでOKになります！

```kotlin
// 利用側も、どこかに@ExperimentalContracts をつけておく必要があるが今回は省略
if (isHoliday(dayOfWeek)) {
    // こう書いてもコンパイルエラーにならない！
    helloHoliday(dayOfWeek)
}
```


## まとめ
+ nullチェック + なんらかのチェック をまとめて行う関数を利用している場合、便利に使えそう
+ ただし、まだExperimentalなので、利用する際は注意が必要
+ 日曜日しか休みがないのはバグなのでは？
普通の要素にcss content

before, after疑似要素で使用するcontentプロパティですが、IE, Edge以外のブラウザでは普通の要素に対しても画像を指定した場合は適用されます。Chromeではgradient関数もいけました。文字列はいけません。

MDNによるとcontentプロパティの適用対象はbefore, after疑似要素のみとのことです。
https://developer.mozilla.org/ja/docs/Web/CSS/content

役に立たないCSS情報でした。

```css
/* IE, Edge以外は適用される */
.content-image {
  content: url(image.jpg);
}

/* 適切に表示されたのはChromeだけでした */
.content-gradient {
  content: linear-gradient(#000, #666);
  width: 100px;
  height: 100px;
}

/* 文字列は適用されない */
.content-string {
  content: "hello"
}
```

[デモ](https://codepen.io/anon/pen/bObJxE)
TensorFlow・KerasのTutorials・Examplesソースコード集

ネット上で無料で手に入る、TensorFlowとKerasのソースコード集を集めました。
眺めたり実際に動かしたりして理解を深めたい人向け。
他にも良いサイトがありましたらお知らせください。

(★の数は、個人的なおすすめの度合いを表しております。レビュー文も含め、個人の主観が多分に含まれていますのでご注意ください。)

# TensorFlow

## Hvass\-Labs/TensorFlow\-Tutorials: TensorFlow Tutorials with YouTube Videos (★★★)

URL : https://github.com/Hvass-Labs/TensorFlow-Tutorials

一通りの内容が揃っている上、jupyter notebookだけでなくなんとGoogle Colabでもソースが公開されているため、リンクに飛べばその場ですぐにコードを実行することができる。
しかもyoutubeの解説動画もついていて至れり尽くせり。

## tensorflow/models: Models and examples built with TensorFlow (★★)

URL : https://github.com/tensorflow/models

TensorFlow公式。
TensorFlowを用いた様々なモデルの実装例が紹介されている。
特に[researchディレクトリ](https://github.com/tensorflow/models/tree/master/research)には一通りのモデルが揃っていて、とにかく幅広い。

たくさんありすぎて逆に自分の目当てのものがどこにあるのかややわかりにくいのと、ソースコードがかなり細かめの粒度で分かれているので、好みが分かれると思う。

## tensorflow/tensorflow/contrib/eager/python/examples (★)

URL : https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/eager/python/examples

こちらもTensorFlowの公式。
先程のものとは打って変わって、代表的なアルゴリズムを絞り込んでいる。

大部分が*.pyのコードなのが残念。

## aymericdamien/TensorFlow\-Examples (★★)

URL : https://github.com/aymericdamien/TensorFlow-Examples

量は多くないが、内容ごとに大きく章が分かれているので、自分の目当てのものが探しやすい。
初心者向けのコンテンツも充実。
一つのトピックに対して、*.pyファイルと\*.ipynbファイルの両方が用意されていて、好きな方を選べるようになっている。

## ageron/handson-ml (★★)

URL : https://github.com/ageron/handson-ml

[handson-ml](https://www.amazon.co.jp/scikit-learn%E3%81%A8TensorFlow%E3%81%AB%E3%82%88%E3%82%8B%E5%AE%9F%E8%B7%B5%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92-Aur%C3%A9lien-G%C3%A9ron/dp/4873118344/ref=sr_1_1?ie=UTF8&qid=1544278425&sr=8-1&keywords=scikit-learn%E3%81%A8tensorflow%E3%81%AB%E3%82%88%E3%82%8B%E5%AE%9F%E8%B7%B5%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92)のgithubのリポジトリ。
前半はsklearn、後半がtensorflow。
jupyter notebookで説明がかなり丁寧に書かれているため、本を持っていなくてもこのソースコードだけで十分勉強可能。
量的にも質的にも、一つ一つのノートのボリュームが大きめ。




# Keras

## keras/examples at master · keras\-team/keras (★★)

URL : https://github.com/keras-team/keras/tree/master/examples

keras公式。
そこそこ網羅しているが、一つ一つのソースコードに対する説明がやや少なめ。

## fchollet/deep\-learning\-with\-python\-notebooks (★★★)

URL : https://github.com/fchollet/deep-learning-with-python-notebooks

[「pythonとkerasによるDeep Learning」](https://www.amazon.co.jp/Python%E3%81%A8Keras%E3%81%AB%E3%82%88%E3%82%8B%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-Francois-Chollet/dp/4839964262/ref=sr_1_2?ie=UTF8&qid=1544278461&sr=8-2&keywords=keras)のgithubリポジトリ。
全部\*.ipynbです。
公式の\*.pyファイルをそのまま*.ipynbにしたものも一部見られる。
kerasで何か動かしたいと思ったらまずここをチェックしてみると良い。

こちらに関してもhanson-mlと同様、jupyter notebookの解説が詳しいので、本を持っていなくてもこのソースコードだけで勉強できてしまう。

## oreilly\-japan/deep\-learning\-with\-keras\-ja: 『直感 Deep Learning』のリポジトリ (★)

URL : https://github.com/oreilly-japan/deep-learning-with-keras-ja

[「直感 Deep Learning」](https://www.amazon.co.jp/Deep-Learning-%E2%80%95Python%C3%97Keras%E3%81%A7%E3%82%A2%E3%82%A4%E3%83%87%E3%82%A2%E3%82%92%E5%BD%A2%E3%81%AB%E3%81%99%E3%82%8B%E3%83%AC%E3%82%B7%E3%83%94-Antonio-Gulli/dp/4873118263/ref=sr_1_3?ie=UTF8&qid=1544278461&sr=8-3&keywords=keras)のgithubリポジトリ。
全部*.pyです。
コードの説明が不足しているため、これだけで学習するのは難しい。
ここで勉強するなら書籍は必須か。
October CMS プラグイン実装テク：コンポーネントから他のコンポーネントを組み込む

コンポーネントから他のコンポーネントを組み込む方法は[公式ドキュメント][ref1]で触れられていますが、詳細が書かれていない上に、メソッドを実装しているのがどこかわからないので引数がわからなかったのでメモ。

[ref1]: https://octobercms.com/docs/plugin/components#page-cycle-inita

## 他のコンポーネントをロードする方法
下記のように`ComponentBase::addComponent()`でロードすることができる。

```php
<?php namespace Pikanji\MyPlugin\Components;

use Cms\Classes\ComponentBase;

class MyComponent extends ComponentBase
{
    public function init()
    {
        $properties = [
            "prop1" => "hoge",
            "prop2" => "fuga",
        ];
        $cmpAnotherComponent = $this->addComponent(
                'Pikanji\MyPlugin\Components\AnotherComponent',
                'anotherComponent',
                $properties
            );
    }
}
```

## 詳細
いつそのコンポーネントが必要になるかにもよるが、とりあえず`init()`でロードすれば、実際にページやコンポーネントのロジックが実行される前にロードしておけるので安全。

`ComponentBase::addComponent()`の詳細は下記の通り

* 第一引数：コンポーネントのクラス名
* 第二引数：任意のコンポーネント名
* 第三引数：コンポーネントのプロパティ
* 返り値：コンポーネントのインスタンス

### 蛇足
`ComponentBase::addComponent()`の実装は、`\Cms\Classes\Controller::addComponent()`にある。

`ComponentBase`クラスでは実装されていないが、存在しないメソッドが呼び出された時に`ComponentBase::__call()`が実行され、この中で`Controller`の同名のメソッドが呼び出される仕組みになっている。

## おまけ
ロード済みのコンポーネントのインスタンスを取得するメソッドもあるので参考までに。

```php
$cmpAnotherComponent = $this->findComponentByName('AnotherComponent');
```
（Juliaで）後退差分法で修正節点法でRLC直列回路を解析する

# やりたいこと
Juliaで[SPICE](https://ja.wikipedia.org/wiki/SPICE_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2))みたいな回路シミュレーションをしてみます。今回はタイトルの通り、[RLC直列回路](https://ja.wikipedia.org/wiki/RLC%E5%9B%9E%E8%B7%AF#/media/File:RLC_series_circuit_v1.svg)を修正節点法で求めて、一次の後退差分法で演算します。また、修正節点法との比較として閉路解析法でも同じ回路を後退差分法で演算します。
今回の特徴としては、SymPyを使って代数をそのまま計算したところで、Julia+SymPyだと式通りの計算ができるのでなかなか面白いかなと思います。

# 参考図書
[1] [書籍：電子回路シミュレーション](http://www.coronasha.co.jp/np/isbn/9784339026061/)
[2] [論文：パワーエレクトロニクスを対象としたリアルタイム・シミュレータに関する研究](https://sojo-u.repo.nii.ac.jp/index.php?action=pages_view_main&active_action=repository_action_common_download&item_id=701&item_no=1&attribute_id=22&file_no=4&page_id=13&block_id=21)

上記の２つの参考図書は、SPICEを理解するためには非常に良いと思います。修正節点法に関しては、基本的には[2]の48ページ目くらいに記載の通り計算をしました。また、[1]も非常にわかりやすい書籍だと思います。閉路解析法は、適当に直感で作りました。

# 閉路解析法の場合
```math
V=RI+L\frac{dI}{dt}+\frac{1}{C}\int Idt\\
V=RI(n)+L\frac{I(n)-I(n-1)}{\Delta t}+V_C(n-1)+\frac{I(n)}{C} \Delta t \\
I(n) = \frac{V+L\frac{I(n-1)}{\Delta t}-V_C(n-1)}{R+\frac{L}{\Delta t}+\frac{\Delta t}{C}} \\
V_C(n) = V_C(n-1) + \frac{I(n)}{C} \Delta t
```

最初の行が立式。2行目が差分法への展開。最後の2行が計算で使用する式です。今回の例だと、閉路は一つになるので結構簡単な式でいけます。また、（個人的には？）直感的な表現なので、式を考えるときに便利だと感じています。一方で、SPICEのようにネットリストから機械的に式を生成するためには、どのように式を作ればよいのか、判断が難しくなるそうです。

```julia
using Plots
gr()

# パラメータ
ts = 1e-3
tl = 0.0:ts:1.0
Rset, C, L = 10.0, 1e-1, 1e-1
G1 = 1/Rset
fin = 10 # Hz

ix, Vc = 0.0, 0.0
vina, vca, ixa = [], [], []
for t in tl
    Vin = 100*sin(2pi*fin*t)
    global ix = (Vin - Vc + L/ts*ix)/(L/ts + Rset)
    global Vc = Vc + ix/C * ts    
    push!(vina, Vin);    push!(vca, Vc);    push!(ixa, ix)
end

# 描画
pl1 = plot(tl, Vector[vina, vca], label=["Vin" "Vc"])
pl2 = plot(ixa, label=["i"])
plot(pl1, pl2, layout=(2,1))
```

# 修正節点法の場合
修正節点法は、名前の通り節点法を修正した方式になります。節点法と考え方が同じですが、節点法の場合は電流源しか扱えないのに対して電圧源を扱えるのが特徴です。節点法ですべてやりきるためには、電圧源を全て電流源に置き換える必要があり、いろいろと大変なので、SPICEでは修正節点法が使用されているそうです。ちなみに、修正節点法では、LとCは離散化モデルとしてコンダクタンス（抵抗）と電流源と電圧源に置き換えることになります。式の導出は参考図書[2]の48ページ目にお任せして、SymPyを使って計算をすると以下のようになります。

```julia
using SymPy, Plots
gr()

@syms G_1 G_C R_L E_in I_C E_L 

# SymPyで式を作る
A = [G_1 -G_1    0     0  1
    -G_1  G_1    0     1  0
       0    0  G_C    -1  0
       0    1   -1  -R_L  0
       1    0    0     0  0]

funcx = inv(A) * [0; 0; -I_C; E_L; E_in]
Ein_a, V3_a, I3_a = [], [], []

# 計算を実施
I3, V3 = 0.0, 0.0
for t in tl
    global I3, V3
    Gc, JC = C/ts, -C/ts * V3
    RL, EL = L/ts, -L/ts * I3
    Ein = 100*sin(2pi*fin*t)

    xxxx = subs(funcx, G_1=>G1, G_C=>Gc, R_L=>RL, E_in=>Ein, E_L=>EL, I_C=>JC)
    V3 = convert(Float64, xxxx[3])
    I3 = convert(Float64, xxxx[4])
        
    push!(Ein_a, Ein);     push!(V3_a, V3);    push!(I3_a, I3)
end
pl1 = plot([Ein_a, V3_a], label=["Vin" "Vc"])
pl2 = plot(I3_a, label="i")
plot(pl1, pl2, layout=(2,1))
```

jupyter notebookを使えば、SymPyはきれいな数式が表示されてとても気持ち良いです。計算は遅いので、lambdifyを使えば、若干速くなるかもしれません。jupyter notebookは後ほどリンクします。


# 最後に
時間が全然足りなくて色々と力及ばずな内容になりましたが、参考図書は非常に素晴らしいものなので、その紹介ができた点は良かったかなと思います。