OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonで毎日AtCoder #24

### はじめに
[前回](https://qiita.com/taxfree_python/items/c3cb84b31d6ff955b62d)
今回は[これ](https://qiita.com/drken/items/e77685614f3c6bf86f44)の解ける問題を解いていきます。

### #24
[ABC045-C](https://atcoder.jp/contests/arc061/tasks/arc061_a)
1110diff

**考えたこと**
初めてbit全探索という手法を知ったので使っていきます。文字の間に記号を入れるかを全探索します。

```python
s = input()

ans = 0
n = len(s) - 1 #間は文字数よりも1少ない
for i in range(2 ** n):
    op = [''] * n
    for j in range(n):
        if ((i >> j) & 1):
            op[n - j - 1] = '+'
    formula = ''
    for p_n, p_o in zip(s,op+['']):
        formula += (p_n+p_o)
    ans += eval(formula)

print(ans)
```

[ABC079-C](https://atcoder.jp/contests/abc079/tasks/abc079_c)
302diff

**考えたこと**
前の問題と違うのは記号が二つになったことですが、ほとんど同じです。
evalは文字の式を計算してintを返してくれます。

```python
abcd = input()
n = len(abcd) - 1
for i in range(2 ** n):
    op = ['-'] * n
    for j in range(n):
        if ((i >> j) & 1):
            op[n - j - 1] = '+'
    formula = ''
    for p_n, p_o in zip(abcd, op + ['']):
        formula += (p_n + p_o)
    if eval(formula) == 7:
        print(formula + '=7')
        break
```

[ARC029](https://atcoder.jp/contests/arc029/tasks/arc029_1)
465diff

**考えたこと**
どっちの肉焼き機を使うかでbit全探索。あとは、最小値を更新していくだけ。

```python
n = int(input())
t = [int(input()) for _ in range(n)]
ans = 10**9
for i in range(2 ** n):
    niku = ['Left'] * n
    for j in range(n):
        if ((i >> j) & 1):
            niku[n - j - 1] = 'Right'
    wait_time_left = 0
    wait_time_rignt = 0
    for k in range(n):
        if niku[k] == 'Left':
            wait_time_left += t[k]
        if niku[k] == 'Right':
            wait_time_rignt += t[k]
    wait_time = max(wait_time_left,wait_time_rignt)
    ans = min(ans,wait_time)
print(ans)
```

### できなかった問題
[ABC104-C](https://atcoder.jp/contests/abc104/tasks/abc104_c)
中途半端に解く問題の処理を書けなかった。

```python
d, g = map(int,input().split())
pc = [list(map(int,input().split())) for _ in range(d)]
n = len(pc)
ans = 10**9
for i in range(2 ** n):
    cost = 0
    score = 0
    check = [False] * n

    for j in range(n):
        if ((i >> j) & 1):
            check[n - j - 1] = True

    for k in range(n):
        if check[k]:
            for l in range(pc[k][0]):
                cost += 1
                score += 100 * (k+1)
                if l == pc[k][0]-1:
                    score += pc[k][1]
                if score >= g:
                    ans = min(ans,cost)
print(ans)
```

[ABC002-C](https://atcoder.jp/contests/abc002/tasks/abc002_4)
議員12人を派閥に含むか否かを考えたときに、知り合い同士を確認するコード書くすることができなかった。


### まとめ
難しい。新しいことを学習するのは楽しいけど、解けないと意味がないので定着するように過去問を解く。では、また
QiitaのストックとLGTMを「はてなブックマーク」に移行する

# はじめに
Qiitaで、ブックマーク代わりにLGTMやストックを使用している人もいるでしょう。
昨今、なにが起こるかわからない世情を考えてみるに、一つのサービスだけでブックマークを保持しておくと、リスクになります。

今回は、せっかく貯めた、LGTMやストックの情報を、はてなブックマークに移行するスクリプトを書いてみます。

なお、私のケースでは以下のように移行されました。
https://b.hatena.ne.jp/mima3/Qiita/

Qiitaのストック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/1c8c96a5-dd81-9a5a-cb75-31757a600c43.png)

登録したはてなブックマーク
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/fe7f3f3f-da88-3378-23a9-1218339f3738.png)


#環境
Windows10
Python 3.7.4


# 事前準備
## QiitaのAPIを実行する準備
下記を参考にアクセス用のトークンを取得してください。
https://qiita.com/mima_ita/items/ec33706c20f11a95516a

## はてなブックマークのRESTAPIを実行する準備
下記を参考に、はてなブックマークのRESTAPIを実行するためのConsumer KeyとConsumer Secretを作成してください

[はてなブックマークのREST APIを利用する](http://needtec.sakura.ne.jp/wod07672/2020/04/02/%e3%81%af%e3%81%a6%e3%81%aa%e3%83%96%e3%83%83%e3%82%af%e3%83%9e%e3%83%bc%e3%82%af%e3%81%aerest-api%e3%82%92%e5%88%a9%e7%94%a8%e3%81%99%e3%82%8b/)

# 使用方法
(1)以下からスクリプトを取得します
https://github.com/mima3/qiita_exporter

(2)LGTMをJSON形式でエクスポートします

```
python export_qiita_lgtm.py QiitaのID lgtm.json
```

(3)ストックをJSON形式でエクスポートします

```
python export_qiita_stock.py  QiitaのID "Qiitaのアクセストークン" stock.json
```

(4)作成したJSONを、はてなブックマークに登録します。

```
python import_hatena_bookmark.py はてなユーザID はてなパスワード はてなのConsumerKey はてなのConsumerSecret lgtm.json stock.json
```

ブックマークに登録の際、Qiitaの記事にあったタグのほかに[Qiita]というタグを付与して登録しています。

## 解説
LGTMについては残念ながらQiitaのAPI経由で取得することはできません。

下記のページで、[スクレイピングでQiitaの「いいね」一覧を取得する](https://qiita.com/lovemuffim114/items/a4760cfa9fc0fff15863)で先駆者様がいましたが、これは全部の記事に対して自分が「LGTM」または「ストック」しているか調べる挙動になっているようです。

2020年4月段階では[画面としてLGTMした記事](https://qiita.com/mima_ita/lgtms)が見れるので、今回は画面を解析して取得しています。

当然、画面の解析のためQiitaの画面の仕様変更であっさり動作しなくなる可能性があります。



# いろいろなまとめ
今回はストックやLGTMを、はてなブックマークに移行してみました。
また、いままでに記事を[GitHub](https://qiita.com/mima_ita/items/ec33706c20f11a95516a)や[WordPress](https://qiita.com/mima_ita/items/f4beb31c0ba65e6ab409)に移行する方法も紹介しています。

編集リクエストや、自動保存、ページ内の目次とか色々、便利な機能があるQiitaでありましたが、**なにがあるかわからない世の中**なので、皆様もそれぞれの方法で移行先を探してみるといいと思います。
外部キーに指定されているカラムのデータを削除しようとしたときのメモ

外部キーに指定されているデータをdestroyしようとしたところ、エラーが出てdestroyできなかったのでメモ。

#### やろうとしたこと

メモアプリで、メモに紐づくタグをグループ化するフォルダーのデータを削除しようとした。

#### 問題点

エラー（外部キーに指定されたデータを削除できないよ、的なメッセージ）


#### 前提
メモアプリで、メモにタグを紐づけている
フォルダにより、タグをグループできる。
削除しようとしたデータは、フォルダのデータ。

#####フォルダテーブルのデータ

```
mysql> select * from folders;
+----+------------+---------+---------------------+---------------------+
| id | name       | user_id | created_at          | updated_at          |
+----+------------+---------+---------------------+---------------------+
|  3 | Tag_group1 |       1 | 2020-03-31 15:25:48 | 2020-03-31 15:25:48 |
+----+------------+---------+---------------------+---------------------+
```

#####タグテーブルのデータ

```
mysql> select * from tags;
+----+-----------+---------+---------------------+---------------------+-----------+
| id | name      | user_id | created_at          | updated_at          | folder_id |
+----+-----------+---------+---------------------+---------------------+-----------+
|  3 | test_tag1 |       1 | 2020-03-31 13:57:45 | 2020-03-31 13:57:45 |      NULL |
|  4 | test_tag2 |       1 | 2020-03-31 13:58:03 | 2020-03-31 13:58:03 |      NULL |
+----+-----------+---------+---------------------+---------------------+-----------+
2 rows in set (0.00 sec)

```

#####タグテーブルの定義

```
mysql> desc tags;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| name       | varchar(255) | NO   | UNI | NULL    |                |
| user_id    | bigint(20)   | YES  | MUL | NULL    |                |
| created_at | datetime     | NO   |     | NULL    |                |
| updated_at | datetime     | NO   |     | NULL    |                |
| folder_id  | bigint(20)   | YES  | MUL | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
```

→　タグテーブルでは、削除しようとしたフォルダーのIDを外部キーとして持つ

####解決方法

→　タグテーブルでもつ外部キーの値を先に削除する。

```app/controllers/folders_controller.rb
  def destroy
    @folder = Folder.find(params[:id])
    @tags = Tag.where(folder_id: @folder.id)
    @tags.each do |tag|
      tag.update_column(:folder_id, nil)
    end
    @folder.destroy
  end
```

データの更新方法

```
Instance.update_column(:column_name value)
```
ApacheをSSL化しようとしたら起動しない。

#1. はじめに
ApacheにSSL自己証明書を設定した時に詰まった部分があったので、備忘録として残します。

#2. 証明書の作成
まず、以下コマンドで証明書を発行。

```
openssl ecparam -name prime256v1 -genkey -out server.key
openssl req -new -key server.key > server.csr
openssl ca -in server.csr -out server.crt
```

作成した証明書、秘密鍵を移動させます。

```
mv server.crt /etc/httpd/conf/ssl.crt/server.crt
mv server.key /etc/httpd/conf/ssl.key/server.key
```

#3. 設定の変更

証明書、秘密鍵の保存場所を指定します。

```
vi /etc/httpd/conf.d/ssl.conf
--snip--
<VirtualHost *:443>
--snip--
#   Server Certificate:
# Point SSLCertificateFile at a PEM encoded certificate.  If
# the certificate is encrypted, then you will be prompted for a
# pass phrase.  Note that a kill -HUP will prompt again.  A new
# certificate can be generated using the genkey(1) command.
#SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateFile /etc/httpd/conf/ssl.crt/server.crt

#   Server Private Key:
#   If the key is not combined with the certificate, use this
#   directive to point at the key file.  Keep in mind that if
#   you've both a RSA and a DSA private key you can configure
#   both in parallel (to also allow the use of DSA ciphers, etc.)
#SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key
--snip--
```

#4. Apacheの再起動

再起動するとエラーが発生。

```
systemctl restart httpd.service
Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.
```

journalctl -xe を見ても何も情報がない。。。
/var/log/httpd/error_log を確認すると Permission 関連のエラーが。
どうやらSELINUXが悪さしているみたい。

```php:/var/log/httpd/error_log
[Thu Apr 02 10:02:29.534751 2020] [ssl:emerg] [pid 19565] AH02312: Fatal error initialising mod_ssl, exiting.
[Thu Apr 02 10:02:33.453638 2020] [core:notice] [pid 19576] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
[Thu Apr 02 10:02:33.455370 2020] [suexec:notice] [pid 19576] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Thu Apr 02 10:02:33.455600 2020] [ssl:emerg] [pid 19576] (13)Permission denied: AH02201: Init: Can't open server certificate file /etc/httpd/conf/ssl.crt/wild_server.crt
```

調べてみるとSELinuxのセキュリティポリシーで各ファイルに適切なラベルが付与されていないとダメらしい。
ラベルは「ll -Z」コマンドで確認できる。

```
[root@149_centos ssl.key]# ll -Z
-rwxrwxrwx. hoge hoge unconfined_u:object_r:user_home_t:s0 wild_server.key
```

これを「restorecon」コマンドで適切なラベルを付け直す。

```
[root@149_centos ssl.key]# restorecon wild_server.key
[root@149_centos ssl.key]#
[root@149_centos ssl.key]# ll -Z
-rwxrwxrwx. hoge hoge unconfined_u:object_r:httpd_config_t:s0 wild_server.key
```

結果、「systemctl restart httpd.service」コマンドで正常に再起動しSSL化が出来た。
MacAppでfastlane deliver initすると上手くいかない時のTips

#問題
ドキュメントに書いてある通りに
`fastlane deliver init` を打ち込むと、AppleID/Password/2FA digits/BundleIDについて聞かれるので、ターミナルで入力していきます。ただし、
> <font color="#FF0000">Could not find app with app identifier 'xxxx' in your App Store Connect account (xxxx - Team: xxxx)</font>

と表示されて上手くいかない場合があります。

# ワークアラウンド
この問題に対して、[こちらワークアラウンド](https://github.com/fastlane/fastlane/issues/13999#issuecomment-489343115)ですが、`fastlane deliver init --platform=osx`と付ければ問題なく動きました。

# 原因
自分は`fastlane init`をせずにメタデータのアップロードだけしたかったので`fastlane deliver init`を最初に入力しました。そのため、デフォルトでiOS用の設定が使われてしまっていたのを、platformを付けることでosx用の設定で実行されるようにしているのだと思われます。

# 正しい対応
`fastlane init`をちゃんとしていれば、`Fastfile`で`platform "osx"`を指定することでこの問題は発生しなくなります。Deliverfileが作成されている場合は、そちらでも可能です。
TransifexをGitHubに連携させて自動でPRとか送らせる方法

#概要
東京都が3/4に新型コロナウイルス感染症対策サイトをリリースし、それをforkする形でJust 道 ITが北海道版新型コロナウイルス感染症まとめサイトを3/9にリリースしました。

[東京都 新型コロナウイルス感染症対策サイト](https://stopcovid19.metro.tokyo.lg.jp/)
[北海道 新型コロナウイルス感染症まとめサイト](https://stopcovid19.hokkaido.dev/)

現在、北海道新型コロナウイルス感染症まとめサイトでは多言語対応を進めています。（日本語、英語、简体中文、繁體中文、韓国語、ベトナム語、タイ語、やさしいにほんごにはすでにほぼ対応のため、更新作業が主になります）

翻訳ができる方は、翻訳作業にお手伝いください

このサイトでTransifexを利用しているのですがGitHubとの連携の際に日本語ドキュメントが見つけれなかったためせっかくなのでメモ書きのように書いておきます

## アカウント作成
Transifex のアカウントを作成し、Organizationを作成します。
（方法はhttps://qiita.com/iten/items/1274f3b85e11261f3b5c の記事をご覧ください。既存のプロジェクトに参加の部分を自分のプロジェクトを始めるにしてください。)

プロジェクトの作成の際に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275457/a54ff1dc-74e1-a27a-edc7-c29ba122547c.png)

ファイルベースのプロジェクトにして、他は各自入力しプロジェクトを作成をクリックし作成します

## 連携の設定
###github側の設定
https://github.com/apps/transifex-integration
これをgithubリポジトリにインストールしてリンクします
以上でgithub側の設定は終わりです

###リポジトリの選択
プロジェクトの設定から統合、Githubと連携をクリック

ルポを選択から対象のリポジトリを選択します

### ファイルを選択
ファイルを選択でGITHUBと同期するファイルを設定します
（以下、北海道版まとめサイトの設定は以下の通りです）

```yaml:setting.yml

filters:
  - filter_type: file
    # all supported i18n types: https://docs.transifex.com/formats
    file_format: KEYVALUEJSON
    source_language: ja
    source_file: assets/locales/ja.i18n.json
    # path expression to translation files, must contain <lang> placeholder
    translation_files_expression: assets/locales/<lang>.i18n.json
```
この場合
> fileの形式がKEYVALUEJSON
  元の言語がja
  翻訳元のJSONファイルが assets/locales/ja.i18n.json
  翻訳先のJSONファイルが assets/locales/\<lang\>.i18n.json（langに言語コードが入ります）

という設定です

### コンテンツを同期
翻訳をプッシュは

- 100% 翻訳済み
- 100% translated or updated (for 100% translated)
- 100% レビュー済み

の３種類があり、人が多くレビューが可能な環境であれば100%レビュー済みがおすすめ、北海道版では100% translated or updated (for 100% translated)
に設定しています。

Transifexにどのように翻訳をGitHubにプッシュさせますか？は
レビューやdeploy前に確認を行うためプル申請を作成がおすすめだと思います

その後右下のボタンをクリックすると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275457/a296ef57-ed2b-415e-0d45-150d4d9b2067.png)

こういった表示になり連携が完了します
(そのほか言語設定が必要です）

## まとめ
初めてTransifexとGithubを連携しましたがかなり簡単に便利な機能が利用できるのでおすすめだと思います！

北海道版　新型コロナウイルス感染症まとめサイトでは翻訳を行える方を探しています。ご協力頂けると幸いです。
Python: Djangoインストール・開発サーバ起動・停止まで


## Djangoの使い方

▼仮想環境を起動(source bin/activate)してから、djangoフレームワークをインストール

```
pip install django
```

▼django用に作成したディレクトリに移動

```
cd /Users/tanaka/Downloads/myPython/django
```

▼firstという名前のdjangoのプロジェクトをdjangoディレクトリ配下に作成

```
django-admin startproject first
```

▼作成したプロジェクト(first)に移動

```
cd first
```
▼開発用サーバーを起動

```powershell:JupyterLab
## manage.pyの親ディレクトリで実行
python3.8 manage.py runserver
```
[補足] PythonのVersionは　`python --version`　でチェック

▼サーバーが起動したらアクセス。　ロケットページ表示されたらOK　:o:

```
http://127.0.0.1:8000/
```

▼サーバー停止は `Control + C`


## アプリケーションの作成

▼tanakaappという名前のアプリケーションを作成

```
python3.8 manage.py startapp tanakaapp
```
[補足] <font color="red">Djangoのmanage.py（デフォルトファイル）があるディレクトリで以下コマンドを実行</font>

▼setting.pyファイルに新規作成したtestappアプリケーションを登録（※）

```
INSTALLED_APP = [
　　'tanakaapp.apps.MyappConfig',　（※）
　　'django.contrib.admin',
　　・・・・（略）・・・・
]
```

[補足](※)の意味
myapp:tanakaappアプリケーション
apps:appsモジュール
MyappConfig:MyappConfigクラス

## first/tanakaapp/templates/tanakaapp配下のindex.htmlの中身をブラウザに表示させよう

▼url.pyのimportに**include**を追加して、tanakaappプロジェクトのパスを通す

```
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
   path('admin/', admin.site.urls),
   path('tanakaapp/', include('tanakaapp/urls')),
]
```

▼tanakaappフォルダ内に, ulrs.pyを新規作成

```
from django.urls import path
from . import views

app_name = 'tanakaapp'

urlpatterns = [
    path('', views.index, name='index'),
]
```

▼http://127.0.0.1:8000/tanakaapp/
 『チワッス田中さん』と表示されるようにviews.pyに以下を記述

```
from django.http import HttpResponse


def index(request):
    return HttpResponse('チワッス田中さん')
```

▼読み込むHTMLを決める流れ

```
firstのurls.py
→ tanakaappのurls.py
→ tanakappのview.py
→ index.html
```


## ModelからDBにテーブル登録

▼DBにテーブルを登録するためには、models.pyで下準備をする

```
from django.db import models
from django.utils import timezone

class Day(models.Model):
    title = models.CharField('タイトル', max_length=200)
    text = models.TextField('本文')
    date = models.DateTimeField('日付', default=timezone.now)
```

▼manage.pyのディレクトリでmigrationsを実行（Modelの変更を伝えている）

```
python3.8 manage.py makemigrations diary
```
[補足] <font color="red">仮想環境の場合は、仮想環境上でコマンド実行すること</font>

▼migrateすることで、変更・作成したModelをDBに反映

```
python3.8 manage.py migrate
```

<font color="red">[おわり]</font>
macOS の ディスクユーティリティで iso が書き込めなかった話

接続されている書き込み可能なデバイスを表示

```
hdiutil burn -list
```

書き込む
`IOService:` の行全部必要でした。

```
hdiutil burn -device 'IOService:/AppleAC..VDServices' -speed max /path//to/iso
```
GraphQLでカスタムタイプの作り方

# はじめに
graphql-rubyでデフォルトであるタイプでは足りず、自作タイプを作りたいとき。
(英語含めて)これといった記事がなかったため書きました。
なお我流なので、正しいやり方を知っている人がいれば教えてください。
今回はTimeTypeを作ります。

# custom_types/time.rbの作成
わかりやすいようにcustom_typesでディレクトリを切っています。
実装は[本家](https://github.com/rmosolgo/graphql-ruby/blob/d1ca69a3daf93286c529e8fccb6e108c4370fb5b/lib/graphql/types/iso_8601_date_time.rb#L23)を参考にしました。

```ruby
module CustomTypes
  class Time < GraphQL::Schema::Scalar
    description "An ISO 8601-encoded time without timezone"

    # @param value [DateTime]
    # @return [String]
    def self.coerce_result(value, _ctx)
      value.strftime("%H:%M:%S")
    end

    # @param str_value [String]
    # @return [DateTime]
    def self.coerce_input(str_value, _ctx)
      ::Time.zone.parse(str_value)
    rescue ArgumentError
      # Invalid input
      nil
    end
  end
end
```

これでMutationとかから呼べます。

```ruby
class Mutations::CreateHoge < Mutations::BaseMutation
  graphql_name 'CreateHoge'
  argument :start, CustomTypes::Time, required: true

  field :errors, [String], null: false

  def resolve(**args)
    p args[:start]
    {
      errors: []
    }
  end
end
```
ダウンロードしたsraファイルが怪しいと思ったら

## はじめに

　SRAとはncbi-sraなどで入手できる圧縮されたシーケンサーのデータである。
prefetchなどを用いて最初からfastqにすることもできるようであるが、日本の場合だとDDBJなどから、sraファイルをダウンロードして、`fasterq-dump` を利用するケースが多いだろう。
　とこらが、ダウンロードしたSRAファイルが壊れていないかどうか調べるのはそれほど簡単ではない。ハッシュ値みたいのも探せばあるのかも知れないがよくわからない。なのでsra-tools公式のコマンドの`vdb-validate`を利用する。

## vdb-validate

* https://github.com/ncbi/sra-tools

`vdb-validate` コマンドはsra-toolsに含まれている。たとえばbiocondaなどでイントールできる。
使い方は簡単である。
```
vdb-validate SRR8888888.sra
```

## 結果のリダイレクト

気をつけなければならないのは、どうやらすべての出力が、標準エラー出力に出るところであり、結果をテキストファイルに保存したいようなときは

```
vdb-validate SRR8888888.sra 2> result.txt
```

とする必要がある。時間を記録したい場合は、

```
time sh -c "vdb-validate *.sra 2> vdb_validate_result.txt"
```

などとすればよいかも知れない。

```
time vdb-validate *.sra 2> vdb_validate_result.txt
```

でも特に問題はないが、この場合は、すべての処理が終わるまでテキストファイルに書き込まれないため、`tail vdb_validate_result.txt` などで途中経過をチラット観察することができない。

## 結果ファイルの確認

うまくいってる場合、大抵の途中経過行は ok が含まれているので

```
cat vdb_validate_result.txt | grep -v ok
```

とすれば、だいたいい感じに表示してくれるのではなかろうか。

## エラーのサンプル

たとえば、こんなエラーが出る

https://github.com/ncbi/sra-tools/issues/231#issuecomment-530462733

```
2019-09-11T16:37:23 vdb-validate.2.9.0 info: Database 'SRR9158298.sra' metadata: md5 ok
2019-09-11T16:37:23 vdb-validate.2.9.0 info: Table 'SEQUENCE' metadata: md5 ok
2019-09-11T16:37:23 vdb-validate.2.9.0 info: Column 'ALTREAD': checksums ok
2019-09-11T16:37:23 vdb-validate.2.9.0 err: binary large object corrupt while validating binary large object within database module - Column 'QUALITY': contains bad data
2019-09-11T16:37:23 vdb-validate.2.9.0 err: binary large object corrupt while validating binary large object within database module - Database 'SRR9158298.sra' check failed
```
【BizRobo】名前付きタグを使った一覧表の探索

# はじめに
Design Studio 10.4

名前付きタグを使って、Webサイトの一覧から特定の条件に一致するデータを取り出すことができる。
例えば、足立区の郵便局のうち、駐車場がある場所を一覧から抽出したいとする。

[郵便局・ATMをさがす - 日本郵政グループ (足立区のページ)](https://map.japanpost.jp/p/search/search.htm?&cond1=1&cond200=1&&&his=sa%2Csa1&&type=ShopA&area1=13&area2=%A4%A2%A4%C0%A4%C1%A4%AF%23%23%C2%AD%CE%A9%B6%E8&slogflg=1&areaptn=1&selnm=%C2%AD%CE%A9%B6%E8)

郵便局の一覧のうち、「P」のアイコンで駐車場があるかどうかがわかる。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/1f018b49-9150-0124-1231-f8836277c841.png)

# For Eachを使う場合
単純に実装するなら、For Each タグ を使って、駐車場アイコンがあるかどうか調べればよい。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/a8053d02-3874-423b-4386-a803af0fc7e4.png)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/fca34d82-65a6-1238-28fd-315e8f93b7d1.png)

# 名前付きタグを使う

上記とは別に、名前付きタグとLoopを使った例を以下に示す。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/bf6e8a94-3dcd-589e-cd33-4277244e7dca.png)

1.
まずLoopタグの前に Set Named Tag ステップを追加する。ここでまず1件目の駐車場ありの郵便局に対して、名前付きタグをつける。名前付きタグの名前は自動採番ではなく、任意の名前を付ける。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/ee5fe835-fdb7-b554-0a97-5358b12487bd.png)

これで1件目の行に名前が付いたので、名前付きタグの中から郵便局名などを取得すればよい。そして、次のステップで2件目以降の郵便局を探す。

2.
2件目以降の場合も検索条件は同じだが、検索範囲が異なる。1件目で付けた名前付きタグの後を検索するように設定する。こうすることで、上から順番に駐車場ありの郵便局を探すことができる。
次の名前付きタグが見つからない場合はエラーになるので、エラーハンドリング の設定を変更し、エラーの場合はループを抜け、後続処理へ続くように指定する。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/197b1c7a-9d09-df53-68bf-7b7be7162873.png)

サンプルの実行ログは以下の通り
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/0b141585-a400-b24e-7ea6-88835539023d.png)
開発を依頼されたら考えていること

## 始めに

自社サービスを内製でアジャイル開発している場合の話となります。


## バックログでwho,why,whatが理解できるか

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143303/425d9137-e0a9-5510-b52c-115f299d72d3.png)

https://qiita.com/yuichi_tr/items/fb823c32fb030d51585d#%E4%BD%95%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%AE%E3%81%8B%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E4%BD%95%E3%81%A7%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%AE%E3%81%8B%E3%82%92%E4%BC%9D%E3%81%88%E3%82%8B

前回qiitaに書いたんですが、アジャイルで内部開発している場合は、
何を作るのかではなく、**何でつくるのかを伝える**ことが最も重要であり、
エンジニアが空気を読んで開発するために必要です。

**(Who)は、(What)を実現したいなぜなら(why)だから**

エンジニアとして依頼を受けたら、このように文章にしてみて
何を解決したくてバックログを書いたのか理解できるか考えるようにしています。

why(背景となる課題、ユーザのペイン）が理解できないものは
誰も欲しがらない独りよがりなソリューションなことが多いと感じています。
納得するまで依頼してきた人に説明を求めましょう。

## 依頼された通り作らない。顧客へ価値が提供できる最小限のプロダクトになっているか？

開発依頼されたプロダクトは、本当にユーザへ価値を提供できているでしょうか？

エンジニアならわかるはずですが、一つのif文を追加するだけでも掛け合わせると
とんでもないテストパターンが必要になります。
安易な発想のプロダクトを、ただ言われた通り実装していくと
どんどん技術的負債を積み上げ自分の首を締めることになります。

作りたい衝動を抑え、最小限で価値を提供できる方法（仕組みや実装）を一緒に考えて
提案・設計することもエンジニアの仕事だと考えています。


## 社内にいるエンジニアはプログラム製造マシンではない

以前所属していた会社の代表にこんなことを言われたことがあります。

**「エンジニアにはアメとムチが必要だ。アメ見せておけば必死に開発するんだよ」**

当時、私はエンジニア部門の管理職だったので、私自身がエンジニアだということを
忘れての発言だったのでしょうが、衝撃的すぎて一生忘れられないインパクトがありました。

依頼された開発をその通り作るだけだと、このようにエンジニアは製造マシンだと思われてしまいます。
普段からロジカルな仕事をしているエンジニアこそ、何で作るのか、これで顧客へ価値を提供できるのか、最小限の開発になっているかをロジカルに提案する力が必要だと考えています。
OGP画像表示を Firebase Cloud Functions を使って実装する方法

Firebase を使って作成中のサービス [#オオエン](http://dev.ooen.me) に OGPイメージを表示したくなったので 調べて実装ししてみたのでそのメモ。


# Firebase 料金プラン 変更
料金プラン を `従量制` に変更する。 外部サーバとの通信が必要になるので `従量制` プランにする必要があります。
<img width="574" alt="スクリーンショット 2020-04-02 12.50.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100147/96a5e9ec-33cc-a1a8-f155-a6555dfaa064.png">

# Functions を利用するプロジェクトを作る
`firebase cli` で 初期化時に `functions` を有効にする

```
firebase init
〜
◉ Functions: Configure and deploy Cloud Functions
```

## OGP内容を取得するコード
https.onCall のプロトコル で 実装してみたコード

### 必要モジュールのインストール
```
npm i --save request 
npm i --save request-promise
```

### OGP 取得をしてみるコード
```
import * as rp from 'request-promise';
class Api {
    private constructor() {
    }

    public static async getSiteMeta(u: string) {
        const now = (new Date()).getTime();
        const result = {title: 'リンク', url: u, ogp: '', err: null, createDate: now};
        return rp(u)
        .then( (body: string) => {
            const t = body.match(/<title.*?>(.*?)<\/title>/);
            if (t !== null) {
            // console.log('t', t[1]);
            result.title = t[1];
            }
            const o = body.match(/<meta property="og:image" content="(.*?)"/);
            if (o !== null) {            
                result.ogp = o[1];
            }
            return Promise.resolve(result);
        })
        .catch((err: any) => {
            // console.log( 'err', err );
            result.err = err.message;
            return Promise.resolve(result);
        });
    }
};
exports.getSiteMeta = functions.https.onCall( async (data, context) => {
    return await Api.getSiteMeta(data.url);
});
```

## OGP内容を シェルで試す
`firebase functions:shell` で ローカルで実行できるので試す。
functions init 時に TypeScript を選んだ場合は `npm run shell` で実行できる。

```
cd functions
npm run shell
> getSiteMeta({url: 'http://dev.ooen.me/r/WbOHbEeX'})
〜
RESPONSE RECEIVED FROM FUNCTION: 200, {
  "result": {
    "title": "コンビニプリンおすすめ4種",
    "url": "http://dev.ooen.me/r/WbOHbEeX",
    "ogp": "https://firebasestorage.googleapis.com/v0/b/ooen-dev.appspot.com/o/OfRBD4q3KpMxcBiLLAwN8a7bEav1%2Ft_furu-1585796845061.jpg?alt=media&token=e63dde4d-1530-4d64-a0d8-0ce7c8d15e76",
    "err": null,
    "createDate": 1585803379441
  }
}
```

## ホスティング で 実行するコードサンプル
```
    public static getSiteMeta(u: string, callback: (data: any) => void) {
        const siteMeta = firebase.functions().httpsCallable('getSiteMeta');
        siteMeta({url: u}).then((result: any) => {
            // console.log('result', result);
            callback(result.data);
        });
    }
```

# 作成中サービス オオエン 

経験や行動した事をリストにして公開しとくと、誰かが試したよとか行動したよ！が届くのでちょっと嬉しくなるサービス。試したり行動した人を気軽に楽しく応援できます。興味ある方、 どんなリスト作りたいかなど事前登録で教えて貰えると嬉しいです！

こんな感じの画像をTwitterにシェアする事でリプライが届いたりします。
![#コンビニプリンおすすめ4種 #オオエン](https://pbs.twimg.com/card_img/1245549181676081153/3AL6fmhG?format=jpg&name=600x314)

```
#在宅勤務 のお供に コンビニ  #プリン を食べ比べ。 #ミチプー #イタリアンプリン

#コンビニプリンおすすめ4種
#オオエン by @t_furu
http://dev.ooen.me/r/WbOHbEeX
```
LaravelでDBに入っている値がURL文字列かどうか調べる

# はじめに

URLかどうかなんてDBに入れる前にフォームバリデーションで調べれば良いような気はしますが、それだとお客さんの要件にかなわないこともあるのです。つらい。

鬼の正規表現で調べても良いのですけど、そもそもLaravelにはURL文字列かどうか調べる機能はあるし、自力で鬼の正規表現を書くよりイケてる判定ができそうな気がするので、そいつを利用させてもらいたいものです。

基本的にバリデーションはRequestクラスをベースにしたRequestに面倒見させて、Controller側ではそいつをDIするってのが筋の良い書き方だとは思うのですが、そうじゃない使い方もできます。

# Validatorインスタンスをmakeしようぜ

ちょっと長いのですが、実はこんな感じにするとValidatorは作れるのです。

```php
// なんかDBのデータ取ってくる。こいつはurlというvarcharのカラムを持っていることとする。
$hoge_model = HogeModel::find($id);

// Validator::makeの第一引数は配列しか受けられないのでtoArrayしておく
$validator = Validator::make($hoge_model->toArray(), [
    'url' => 'url'
]);
```

こんな感じにするとValidatorインスタンスを作ることができます。
第2引数は君らの好きなバリデーションルールです。

あとは

```php
$validator->fails()
```

でバリデーションがしくじってたら `true` が返ってきます。つまりちゃんとURL文字列であれば `false` になるってことですね！

# （追記）もっと簡単なやり方あった。

urlヘルパのこと調べてたらこんなんあったんかワレー！

```php
URL::isValidUrl($url); // true or false
```
イベントソートを勉強してみた【競プロ】

#はじめに
イベントソートという用語で検索してもあまり説明しているサイトがなかったので勉強がてら書いていきます!!!!



---
###問題
<pre>
1.
N回, 整数Si, Ti, Xiが与えられる.
地点[Si, Ti)(←半区間)にXiを定義する(重複してもよい).
2.
Q個の以下のクエリに対して答えを出力しなさい.
&emsp; query :地点Diの位置に定義されているXiの最小値を答えよ.
[制約]
1 <= N, Q <= 2×10^5
</pre>
N, Qに対しての制約しか書いていないが, だいたいこのような問題を考える.
###解説
まず, 数直線を考える.
-から+を見ていくこととする.
もし見ていった先にSiがあれば区間iに入ったこととなる.
またTiがあれば区間iを出たことになる.
これを言い換える.

ある地点Djを考えた時に
Si <= DjであればDjはその区間iに入っている.
Ti <= DjであればDjはその区間iから出ていることになる.

c++では, これは重複を許す順序付き集合 'multiset' で実装できる.
<img width="400" alt="Untitled.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520192/1a3af1b9-ca98-b8e0-9e58-aeb86021ac0e.png">

Djを見る時にDj以下のSi, Tiに対して
1. 追加イベント(Si, 1, Xi)
2. 削除イベント(Ti, -1, Xi)
を行う.
追加イベントとは, Xiをmultisetにinsertすることで
削除イベントとは, Xiをmultisetから一つeraseすることである.

地点Djの位置に定義されているXiの最小値は, 以上の処理を行なった後のmultisetの最小値である.
実際のコードは以降ネタバレを参照してほしい.

---
#以降ネタバレ
##練習問題
AtCoderより 
・ ABC128 E問題
https://atcoder.jp/contests/abc128/tasks/abc128_e
・ 全国統一プログラミング王決定戦本戦 D問題
https://atcoder.jp/contests/nikkei2019-final/tasks/nikkei2019_final_d

E問題解答

```C++
#include <bits/stdc++.h>
#define rep(i, n) for(int i=0; i<(n); ++i)
#define rep2(i, s, n) for(int i=s; i<(n); ++i)
#define ALL(v) (v).begin(), (v).end()

using namespace std;

typedef long long ll;

struct event{
    ll t, type, val;
    bool operator<(const event& a){
        return t < a.t;
    }
};

int main(int argc, const char * argv[]) {
    // input
    cout << fixed << setprecision(10);
    ll N, Q; cin >> Q >> N;
    vector<event> eves;
    vector<ll> D(N);
    rep(i, Q){
        ll s, t, q;
        cin >> s >> t >> q;
        eves.push_back({s-q, 1, q}); // ins
        eves.push_back({t-q, -1, q}); // erase
    }
    rep(i, N){
        cin >> D[i];
    }

    sort(ALL(eves));

    int k = 0;
    multiset<ll> st;
    rep(i, N){
        // D[i]以下のイベントを全て処理する(stにins, erase)
        while(k < eves.size() && eves[k].t <= D[i]){
            if(eves[k].type == 1){
                st.insert(eves[k].val);
            }
            else {
                st.erase(st.find(eves[k].val));
            }
            k++;
        }

        // stの最小値を調べて出力
        if(st.empty()){
            cout << -1 << endl;
        }
        else{
            cout << *st.begin() << endl;
        }
    }
    return 0;
}
```

#終わり
イベントソートの用語自体は, ABC128のEの解説で有名になったようです(？）

コーディングの時, multisetではなくsetを使っていて無限時間かかった.
あと, multisetのerase(x)がxの値全てeraseする点にも注意すべし.
北海道 新型コロナウイルスまとめサイトの翻訳を手伝う方法

#概要
東京都が3/4に新型コロナウイルス感染症対策サイトをリリースし、それをforkする形でJust 道 ITが北海道版新型コロナウイルス感染症まとめサイトを3/9にリリースしました。

[東京都 新型コロナウイルス感染症対策サイト](https://stopcovid19.metro.tokyo.lg.jp/)
[北海道 新型コロナウイルス感染症まとめサイト](https://stopcovid19.hokkaido.dev/)

現在、北海道新型コロナウイルス感染症まとめサイトでは多言語対応を進めています。（日本語、英語、简体中文、繁體中文、韓国語、ベトナム語、タイ語、やさしいにほんごにはすでにほぼ対応のため、更新作業が主になります）

翻訳ができる方は、翻訳作業にお手伝いください

東京版での翻訳への参加方法は書かれていますが北海道版での参加方法は書かれていないため参加方法をまとめました。

#Transifexのアカウント作成方法
アカウント作成の部分については@itenさんの[こちらの記事](https://qiita.com/iten/items/1274f3b85e11261f3b5c)でわかりやすくまとめられていますのでご覧ください。

##プロジェクトへの参加方法
https://www.transifex.com/just-dou-it/stopcovid-19-hokkaido/

↑にアクセスすると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275457/12a7575a-f5ab-dcec-12b5-b8d5cfe9f24c.png)
この画面になりますので「チームに参加」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275457/c3480656-b13b-6495-f23b-6ff510f79099.png)
この画面になりますので利用できる言語を選択し、参加をクリックします
（ここにない言語の場合はSlack、Github、Twitterでご連絡いただくか、後にある追加方法から追加してください）

## 翻訳作業方法
https://www.transifex.com/just-dou-it/stopcovid-19-hokkaido/dashboard/

にアクセスし

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275457/62da67ea-e3b2-1973-bf5d-bdb1cd020a01.png)

翻訳ボタンをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275457/2328a146-3def-ab05-4354-5cc112b604d5.png)

左側で翻訳を行う言葉を選択し、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275457/9436323e-7394-3a52-503b-22fb54106ece.png)

ここに翻訳後の言葉を入力し、翻訳を保存（変更を保存）をクリックします。

以上が翻訳の手順です

## 言語の追加申請方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275457/311932df-80fe-aa74-0ddb-a546aef66a00.png)
言語を申請をクリックすることで各言語の申請を行えます


#不明な点等ありましたらお気軽にご連絡ください！
transifex移行に伴い取り急ぎ作成した記事のため抜けが多くあるかと思います。
わからない点やここ間違ってるなどありましたらお気軽にご連絡ください！
よろしくお願いいたします！
AWS Cognite (1) 概要まとめ

# 前書き
AWS Cogniteについて調査した内容のまとめです。AWSの丁寧な説明をかなり省略して記述しています。

---

# AWS Cognite の概要

アプリケーションの認証、許可、ユーザー管理をサポートしています。当然ですが、AWSのIAMのユーザー管理とは別です。

---
## 認証と許可の仕組み（ユーザープールとIDプール）
<dl>
<dt>ユーザープール</dt><dd>ユーザー情報の管理と認証</dd>
<dt>IDプール</dt><dd>AWSのサービスへの許可</dd>
</dl>

![ユーザープールとIDプールの認証と許可のイメージ](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/images/scenario-cup-cib2.png)

---
### その他の機能
<dl>
<dt>Amazon Cognito Sync</dt><dd>ユーザーデータのデバイス間の同期</dd>
<dt>Amazon Cognitoのモニタリング</dt>
<dd>
 <dl>
<dt>Amazon Cloud Watchメトリクス</dt><dd>リアルタイム監視</dd>
<dt>AWS CloudTrail</dt><dd>ロギング</dd>
 </dl>


</dd>
</dl>
---
## ユーザープール
***ユーザープールでできること***

* 新規ユーザー登録およびログインの機能。
* ログインなどのカスタマイズ可能なウェブ UI。
* Facebook、Google でソーシャルサインイン、Login with Amazon、Sign in with Apple、ユーザープールから SAML ID プロバイダーでサインイン。
* ユーザーディレクトリとユーザープロファイルの管理。
* 多要素認証 (MFA) などのセキュリティ機能、漏洩した認証情報のチェック、アカウントの乗っ取り保護、電話と E メールによる検証。
* カスタマイズされたワークフローと AWS Lambda トリガーによるユーザー移行。

---

### 認証方式
大きく分けて2つの方法を選べる。（ユーザープール作成時点で選ぶ。後から変更することはできない。よくよく設計する必要がある）
* ユーザー名
* Eメールアドレスおよび電話番号

### 属性
ユーザーの属性として次のものが用意されている。これらはオプション扱いだが、必要に応じて必須にすることも可能

| 属性 | 属性 | 属性 |
|:--|:--|:--|
| address     | locale       | preferred_username  |
| birthdate   | middle_name  | profile             |
| email       | name         | updated_at          |
| family_name | nickname     | website             |
| gender      | phone_number | zoneinfo            |
| given_name  | picture      |                     |

--- 
### カスタム属性

必要な属性を作ることもできます。
![カスタム属性.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93066/20e4b210-ccc1-773a-17ca-a54f019ab1b6.png)

---

### ポリシー
次のことを設定できます。

* パスワードの強度
* 管理者のみがユーザーを作成できる／ユーザーが自分で作成できる

### MFAそして確認
* 多要素認証(MFA)を有効にするか
* ユーザーがパスワードを忘れたとき場合の回復方法

---

### メッセージのカスタマイズ
アプリ向けメールの送信用に Amazon SES を使用する。その設定。***要調査***

### デバイス
デバイスを記憶するオプション。
* 常に
* User Opt In
* いいえ

---

### アプリクライアント
ユーザープールをアクセスできる、アプリケーションを登録できる。認証フローも登録。

### トリガー
認証前に決まった処理を行うなど、AWS Lambdaを使用したカスタマイズができます。

---

### 全般設定
#### ユーザーとグループ
* ユーザーを作成
* ユーザーの一覧/参照
* ユーザーをcsvでインポート。csvのヘッダをダウンロードできる
* グループを作れる/ユーザをグループに設定できる

---

#### アドバンストセキュリティ
追加料金が発生する場合がある。

#### メッセージのカスタマイズ
メールの設定。Amazon SES

---

#### 分析
Amazon Pinpointでユーザーを分析。キャンペーンを作成できる。追加料金。

---

### アプリの統合
工事中!

### フェデレーション
Facebook, Google といったプロバイダ経由のログイン設定。
YahooやRakutenは,直接はなさそう。規格に沿っていればできるのかな。要調査。

---

## IDプール
Delphi の型のエイリアス

# マルチプラットフォーム時代の型

Delphi には元々、[Integer](http://docwiki.embarcadero.com/Libraries/Rio/ja/System.Integer) とか [Cadinal](http://docwiki.embarcadero.com/Libraries/Rio/ja/System.Cardinal) と言った整数型があります。
ですが、今やこれらの型名は [NativeInt や LongWord といった型のエイリアス](http://docwiki.embarcadero.com/RADStudio/Rio/ja/%E5%8D%98%E7%B4%94%E5%9E%8B%EF%BC%88Delphi%EF%BC%89#.E6.95.B4.E6.95.B0.E5.9E.8B)と書いてあったり（実際には違います）します。

それじゃあ、NativeInt とか NativeUInt は何よっていう話ですが、これらは 32bit プラットフォームでは 32bit、64bit プラットフォームでは 64bit の整数を表す型です。
また、それに対して、プラットフォームに関わらず必ず 32bit 固定の型 FixedInt, FixedUInt もあります。
これについて詳しくは下記の DocWiki を参照してください。

* [XE8 DocWiki: 新しい Delphi データ型 FixedInt および FixedUInt](http://docwiki.embarcadero.com/RADStudio/XE8/ja/Delphi_XE8_%E3%81%8A%E3%82%88%E3%81%B3_C%2B%2BBuilder_XE8_%E3%81%AE%E6%96%B0%E6%A9%9F%E8%83%BD#.E6.96.B0.E3.81.97.E3.81.84_Delphi_.E3.83.87.E3.83.BC.E3.82.BF.E5.9E.8B_FixedInt_.E3.81.8A.E3.82.88.E3.81.B3_FixedUInt)

* [Rio DocWiki: プラットフォーム依存の整数型](http://docwiki.embarcadero.com/RADStudio/Rio/ja/%E5%86%85%E9%83%A8%E3%83%87%E3%83%BC%E3%82%BF%E5%BD%A2%E5%BC%8F%EF%BC%88Delphi%EF%BC%89#.E3.83.97.E3.83.A9.E3.83.83.E3.83.88.E3.83.95.E3.82.A9.E3.83.BC.E3.83.A0.E4.BE.9D.E5.AD.98.E3.81.AE.E6.95.B4.E6.95.B0.E5.9E.8B)


# ビット数に即した型名（エイリアス）

ということで、Integer とか NativeInt や FixedInt, LongWord とか、色々と型があって、マルチプラットフォームでは少々ややこしいです。
そこで、型のエイリアスを使うと解りやすく書けます。

| エイリアス | ビット数 |
|------------|----------|
|    Int8    |     8    |
|    Int16   |    16    |
|    Int32   |    32    |
|    Int64   |    64    |

うわあ！表にするまでも無く解りやすうい！

符号無し整数型や実数型についても同様で

| エイリアス | ビット数 |
|------------|----------|
|   UInt8    |     8    |
|   UInt16   |    16    |
|   UInt32   |    32    |
|   UInt64   |    64    |

| エイリアス | ビット数 |
|------------|----------|
|   Float32  |    32    |
|   Float64  |    64    |

と定義されています。
(そもそも実数型は Real を除いて Single / Double なんだからそのままなんですけどね…)

なお、全ての型のサイズについては下記の DocWiki をご覧ください。

* [64 ビット Windows データ型と 32 ビット Windows データ型の比較](http://docwiki.embarcadero.com/RADStudio/Rio/ja/64_%E3%83%93%E3%83%83%E3%83%88_Windows_%E3%83%87%E3%83%BC%E3%82%BF%E5%9E%8B%E3%81%A8_32_%E3%83%93%E3%83%83%E3%83%88_Windows_%E3%83%87%E3%83%BC%E3%82%BF%E5%9E%8B%E3%81%AE%E6%AF%94%E8%BC%83)

# まとめ
これからは型のエイリアスを使った方が解りやすそうです。

とはいえ、今や 32bit のバイナリが動作するのは Windows のみ…(iOS は 2017/9, Android は 2019/8, macOS は 2019/10 に 32bit アプリの実行またはストアへアップできなくなりました)

マルチプラットフォーム時代の！などとぶち上げましたが、実際に影響が大きいのは Windows でしょう。

ということで、VCL ユーザーも気になる Windows 64bit 対応については[公式の DocWiki ](http://docwiki.embarcadero.com/RADStudio/Rio/ja/64_%E3%83%93%E3%83%83%E3%83%88_Windows_%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA)も参考になりますが、DEKO さんの「[64 ビット Windows プログラミング ガイド for Delphi 64 ビット コンパイラ](https://ht-deko.com/tech070.html)」が解りやすく参考になります。
1.3 デバッグ機能 : コードアナライザー機能

# 目次へのリンク


[MATLABによる画像処理・コンピュータービジョン入門目次](https://qiita.com/tohruk/items/e5f7939b622bcf2e3c4c)


# 概要


MATLABのエディターに内蔵されているコードアナライザー機能を紹介します。MATLABプログラムを実行する前に潜在的な警告やエラーを発見できるためとても便利な機能です。




対応ファイル：[I1_03_lint_lengthofline.m](https://github.com/mathworks/MATLAB-IPCV-Eval-Kit-JP/blob/master/demo_files/I1_03_lint_lengthofline.m)


# MATLABのエディターでMATLABプログラムを開く


今回はコードアナライザーの機能を知るために警告やエラーが含まれているコードを開きます。


```matlab:code
edit I1_03_lint_lengthofline.m
```
# コードアナライザーで警告やエラーを確認


MATLABのエディター上でデフォルトでコードアナライザー機能がオンになります。警告の箇所と修正候補を提示してくれます。


![image_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/8fec76d9-1eac-49be-12e1-10da0240dc16.png)



右端の警告やエラーの表示をクリックすることで、該当行に移動することもできます。




![image_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/f0382b18-f6f9-2499-6e5d-9080f1bc4792.png)


# *コードアナライザーをレポート化する*


*コードアナライザーの警告やエラーをレポートとして一覧化することもできます。エディター右上の下矢印をクリックし、「コードアナライザーレポートを表示」をクリックします。*




![image_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/bf06df67-297c-a2bd-d033-159aa7e51320.png)




下記のようにレポート化することができました。一括して警告やエラーを確認できるので便利です。



![image_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/ba9b1f2f-d592-384d-86ff-9d31b99d31dd.png)




# まとめ


MATLABのエディターに内蔵されているコードアナライザーの機能を紹介しました。
実行時のエラーの低減だけでなく、可読性の向上や高速化につながる警告もあるので有効活用しましょう。


# *参考*

   -  [MATLAB コード アナライザー レポート](https://jp.mathworks.com/help/matlab/matlab_prog/matlab-code-analyzer-report.html) 

# *謝辞*


本記事は @eigs さんの[livescript2markdown](https://github.com/minoue-xx/livescript2markdown)を使わせていただいてます。


# 目次へのリンク


[MATLABによる画像処理・コンピュータービジョン入門目次](https://qiita.com/tohruk/items/e5f7939b622bcf2e3c4c)
【UE4】待機(Idle)アニメーションに、それなりにバリエーションを出す

[1]:https://historia.co.jp/ue4petitcon13
[2]:https://youtu.be/E031FMxMJ8Q
[3]:https://www.unrealengine.com/marketplace/en-US/product/paragon-minions


[株式会社ヒストリアさん主催の第13回ぷちコン][1]応募後のあれこれなど。
色々テンパって、やりたかったことができなかったり、誤魔化したりしたので、それらを整理しながら備忘録として残す。

(もしよろしければ、[私の作品の動画][2]を見てくださいませ)

# 待機アニメーションがとても残念だった

待機中の仲間の恐竜は、ただ単純にアイドルアニメーションを垂れ流しているだけだった。
そこだけ切り出して分かりやすくすると、こういう Anim Graph だった。

![20200402_1212.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358170/06668d69-a5fb-582e-f87d-e87b12db26b3.png)


なので、どこにいる仔も同じタイミングで同じように動いていて、とても残念だった。
ざっくり、こんな感じ(↓)

![20200402_1225.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358170/445caefa-f1f4-fad7-107c-76c3ba6524ee.gif)

# Random Sequence Player を使う

いつの間にか「Random Sequence Player」なるノードが増えていた。（昨日気づいた）
このノードは：

- 複数のアニメーションシーケンスをランダムな順番に再生してくれるようす。
- それぞれのアニメーションシーケンスに重みづけができる。要するにランダムでの選ばれやすさを指定できる。
- ループ回数や再生レートもランダムで選べる。

という機能がある様子。

例えば、こういう風にして：

![20200402_1233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358170/e573b580-fad3-aed9-040a-81d479890b94.png)

![20200402_1234.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358170/bb193031-cc2f-3c83-0e47-f15dc39b9012.png)

実行すると、こうなる：

![20200402_1238.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358170/1e351cd1-f0de-31c1-ac4e-cfc1440ba96c.gif)

待機(Idle)モーション１個だけしか使っていないが、再生の度、つまり 0 フレーム目に戻るたびに、再生レート(Play Rate) を 0.8～1.2 の間のランダムで決めてくれているので、それぞれの個体がバラバラに動くようになってくれる。

とても便利。

# さらに Aim Offset を加える

この恐竜は、もともと UE4 の無料アセット[Paragon: Minions][3] に入っている Buff_Black というキャラだが、Aim Offset も同梱されていた。

![20200402_1251.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358170/f8e3484e-3c78-7848-5f3c-903ff3aa7f07.gif)

これもええ感じに混ぜてみる。

![20200402_1304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358170/61b1c4d2-e2f7-9f6a-b809-eb99e064972f.png)

待機モーションをしながら、なんとなく頭を上下左右に向けるような動きを足すつもりである。その IdleYaw と IdlePitch は EventGraph の方で作る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358170/21a678b3-7d59-d54f-86bc-e2b244f5e2a8.png)

SIN 関数で、なんとなくゆっくりと数値を揺らしているだけ。
結果はこうなる：

![20200402_1312.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358170/f66e715e-7539-2739-5fc7-a4517f01114d.gif)

よし。ええ感じになった。

なお：

- Random Sequence Player に Idle アニメーションのほかに、噛みつきアニメーションを 0.25 の重みで混ぜてある。
- 噛みつきアニメーションは、そのままの再生レート(=1.0)で再生するととても攻撃的なので、0.5～0.7くらいの再生レートに落として、緩和してある。
[Mac]xargsで引数を任意の箇所に埋め込んで実行するメモ

## この記事について

何回やっても忘れるので。本当にただのメモ書きです。

## sample code

ローカルの特定のディレクトリ配下にあるファイルすべてをS3に上げるサンプルスニペット。

```.sh:upload_s3.sh
find -f <path_to_dir>/* -print0 | xargs -0 -I{} aws s3 cp  {} s3://my-bucket/prefix/
```

## ポイント

`find -I`の後ろに任意の文字列を入れることで、実行する末尾でなく任意の箇所に埋め込むことができる。
自分の~/.bashrcに必ず追加しているもの

もっとあるんだけどとりあえずこれは必ず書いてます。
Historyは、個人的に超重要だったりします。


```shell
export HISTTIMEFORMAT='%F %T ' 
export HISTSIZE=50000 

export LANG=ja_JP.UTF-8 

alias ggg='cat ~/.bashrc | grep git' 

alias la='ls -la' 
alias lt='ls -lt' 

alias gcd='cd /var/www/html && pwd' 
alias gcommit='git commit -am' 
alias gfetch='git fetch' 
alias gpull='git pull' 
alias gpush='git push -u origin master' 

alias gone='git log --oneline' 
alias glog='git log' 
alias gstat='git status'

set -o vi
```

たいしたこと書いてないので申し訳なす。。
emacs派の人とは仲良く出来ないと思ってます。。。。。。。。。。。。。。。
VSCODEを使ったMarkDown　設定

サブ機で作ったVSCODEでのMarkdown記法の練習ファイルの共有が目的

##拡張設定
- Markdown-PDF
- Markdown-formatter
- Japanese Language Pack for VS Code


## コードスニペット
議事録のフォーマットとよく使うMarkdown記法のスニペット
<pre>
{
	"Meeting":{
		"prefix":"meeting",
		"body": ["## 会議名:\n",
			"### 出席者:\n",
			"#### 場所:\n",
			"#### 時間：",
			"### 議題:\n",
			"### 議事:",
			"- ",
			"- ",
			"- ",
			"### 結論",
			"1. ",
			"2. ",
			"### 課題",
			"1. <details><summary>aaaaaaaaa【担当： 】</summary>vvvvvvvvvvvv</details>",
			"2. <details><summary>aaaaaaaaa【担当： 】</summary>vvvvvvvvvvvv</details>",
			"3. <details><summary>aaaaaaaaa【担当： 】</summary>vvvvvvvvvvvv</details>",
			"### Todo",
			"1. <details><summary>aaaaaaaaa【担当： 期限://】</summary>vvvvvvvvvvvv</details>",
			"2. <details><summary>aaaaaaaaa【担当： 期限://】</summary>vvvvvvvvvvvv</details>",
			"3. <details><summary>aaaaaaaaa【担当： 期限://】</summary>vvvvvvvvvvvv</details>",			
		],
		"description": "議事録フォーマット"
	},

	"link":{
		"prefix": "link",
		"body": "[](http://)",
		"description": "link"
	},

	"list":{
		"prefix": "list3",
		"body": [
			"+ first"
			"    + first-2"
			"        + first-3"
			"+ second"
			"    + second-2"
			"        + second-3"			
		],
		"description": ""
	},

	"number-list":{
		"prefix": "list-num3",
		"body": [
			"1. first"
			"    1. first-2"
			"        1. first-3"
			"1. second"
			"    1. second-2"
			"        1. second-3"			
		],
		"description": ""
	},

	"detail":{
		"prefix": "details",
		"body": [
		"<details><summary>aaaaaaaaa</summary>vvvvvvvvvvvv</details>"
		]
	}

}
</pre>

## CSS
シンプルなCSS
<pre>
body{
    color: black;
    background-color: white;
}


h1 {
    /*線の種類（単線）太さ 色*/
    border-bottom: solid 7px black
}

h2 {
    /*線の種類（単線）太さ 色*/
    border-bottom: solid 5px black;
  }

h3 {
    /*線の種類（単線）太さ 色*/
    border-bottom: solid 2px black;
}

h4 {
    /*線の種類（単線）太さ 色*/
    border-bottom: solid 1px black;
}

table {
    border: solid 2px;              /* 枠線指定 */   
}




th,td{
    border: solid 2px;              /* 枠線指定 */
    padding: 10px;      /* 余白指定 */
}
</pre>
え？ print true ? '①' : true ? '②' : '③'; って正解は①じゃないの？

# 答え

```php
php >  print true ? '①' : true ? '②' : '③';
②
```

もちろんみなさんは正解は②だとすぐわかったと思いますが、
私は、①になると思っていて、バグフィックスで30分くらいハマりました🥺

社内でもアンケートをとったら予想外だと思った人が3人/4人いたので、意外と混乱しやすい書き方だと思います。
<img width="637" alt="Slack___developers_chatting___m_a_cloud___1_個の新しいアイテム.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/006d67c8-ebe2-01df-1d26-08f5ef659f22.png">


# 解説

処理の順番がわかるようにカッコをつけるとこうなります。

```php
print (true ? '①' : true) ? '②' : '③';
```

1. `(true ? '①' : true) `が評価されて`'①'`になる。
2. `'①' ? '②' : '③'`こうなる。
3.  `'①'`が`true`と評価される 
(参考 PHP 型の比較表 https://www.php.net/manual/ja/types.comparisons.php)
4.  `true ? '②' : '③'`になる
5.  `②`になる


# ①だと思った人の頭の中

```php
print true ? '①' : (true ? '②' : '③');
```

# まとめ

- 三項演算子ネストすると混乱する人が出てくる🙋‍♂️
- 括弧つける、インデントをつける、if文にする など工夫して読みやすくしよう
スクラム イベント タイムボックス チートシート

スクラムイベントは [Scrum.org の Scrum Guide](https://www.scrumguides.org/scrum-guide.html) に定義されています。

新しく開発チームのサイトを作るときに、サイトの Welcomeページにこれらのイベントを記載してメンバーに周知したいので、私はよく README.md Markdown ファイルにチートシートを書いておきます。

サンプルはこんな感じ

| Event | Time-Box | Start |
----|----|----
| スプリント ( Sprint )   |  1週間 = Sprint  | |
| スプリントレビュー ( Sprint Review )  | 1時間 / Sprint| 金曜日 10:00  |
| スプリント計画 ( Sprint Planning meeting  )  | 2時間 / Sprint| 金曜日 13:00  |
| デイリースクラム ( Daily Scrum ) | 15分 / 日| 8:45  |
| スプリント振り返り ( Sprint Retrospective )  | 45分 / Sprint| 金曜日 11:00 |

スプリント期間が1・２・３・4週間用のサンプルをそれぞれ用意してあります。

[Scrum-TimeboxedEvents-Cheatsheet (GitHub)](https://github.com/surviveplus/Scrum-TimeboxedEvents-Cheatsheet)

Markdownのテキストをそのままコピーして、開始の曜日・時刻の部分を差し替えて使います。

例えば Azure DevOps で最初にスプリントの期間（日付）を設定するときに一緒に、これを README.md に保存して、さらに Outlook の予定・Teams 会議 の通知を全部作ってしまっておけば、スクラム開始の準備OK！

特に、スクラムで重要な Time-Box の時間（上限）を忘れないように、目の付くところに置いておくのが良い感じです。
ViewModelとLiveDataを使ったDialogFragmentのコールバック

2020年にもなっていまだにDialogFragmentのコールバック最適解がないのでGoogleは早くJetPackに作ってほしい


```kotlin
class MainActivity : AppCompatActivity() {

    private val viewModel: DialogViewModel<MainDialogResult> by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        if (savedInstanceState == null) {
            SampleDialogFragment().show(supportFragmentManager, "sample")
        }

        viewModel.result.observe(this) {
            when (it) {
                is MainDialogResult.Ok -> {
                    Log.i("result", it.message)
                }

                is MainDialogResult.Cancel -> {
                    Log.i("result", "cancel")
                }
            }
        }
    }
}

///////////////////// CallBack

sealed class MainDialogResult {
    data class Ok(val message: String) : MainDialogResult()
    object Cancel : MainDialogResult()
}

class DialogViewModel<T> : ViewModel() {
    val result: MutableLiveData<T> = MutableLiveData()
}

///////////////////// DialogFragment

class SampleDialogFragment : DialogFragment() {

    private val viewModel: DialogViewModel<MainDialogResult> by activityViewModels()

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return AlertDialog.Builder(requireContext())
            .setPositiveButton(android.R.string.ok) { _, _ ->
                val message = "OK!"
                viewModel.result.postValue(MainDialogResult.Ok(message))
            }
            .setNegativeButton(android.R.string.cancel) { _, _ ->
                viewModel.result.postValue(MainDialogResult.Cancel)
            }
            .create()
    }
}
```

これでActivity/Fragment共に画面回転のことも考慮してもちゃんと結果が受け取れるようになります。
しかしボイラープレートが多いですね...ほとんど再利用できる箇所がない
Git-flowとは？

#Git-flowとは？
簡単にいうとGitのブランチを活用したGitの開発手法。
**メリット**...開発スピードの向上、コンフリクトやマージのミスの発生を防げる。
**デメリット**...開発スタート時に運用ルールを決めておかないとプロジェクトがまとまらない。
**※**コンフリクト....同じ箇所を別々のブランチで別々の変更をかけてマージすること。

##Git-flowの５つのブランチ
1　フィーチャー......開発を行うためのブランチ。用途は個々の機能の実装やバグの解決
2　デベロップ..........開発を行うためのブランチ
3　リリース.............リリース前に準備、微調整を行うブランチ。
4　マスター............リリースしたデータをおいておくブランチ。
5　ホットフィックス......リリースされたデータに緊急の修正をするためのブランチ。

##詳細
開発を進める際にデベロップからフィーチャーブランチを作成し、作業を進めていく。それが終わったらデベロップブランチにマージという工程を繰り返す。
この工程を繰り返してリリースのタイミングになったらデベロップブランチからリリースブランチを作成する。ここでのマージ先はデベロップではなくマスターブランチ。
リリース後にバグが見つかった場合、マスターブランチからホットフィックスブランチを作成しバグの対応を行う。

##まとめ　　　　　　　
          
　　　　　　　　　　　**分岐元**   　　　　　　　　**マージ先**
フィーチャー　　　　デベロップ　　　　　　デベロップ
リリース　　　　　　デベロップ　　　　　　デベロップ・マスター
ホットフィックス　　マスター　　　　　　　デベロップ・マスター

Git-flow流れ
**1** developブランチからfeatureブランチを作成して、機能・タスクごとに開発を進める
**2** 1. をdevelopブランチにマージする
**3** 1.〜2. を繰り返して開発を進める
**4** 全データが揃いリリースのタイミングになったら、releaseブランチを作成し、バグ修正やドキュメントの整備をおこなう
**5** 4. をmaster, developブランチにマージして公開する
**6** もし急なバグが見つかったら、hot-fixブランチを用意して対応する
**7** 6. をmaster, developブランチにマージして公開する

![alt](https://liginc.co.jp/wp-content/uploads/2016/02/model.png)


##感想
Github-flowとの違いを理解することが難しかった......
完璧ではないがある程度は理解できたと思っています。

**参考サイト**
https://liginc.co.jp/248864
https://tracpath.com/bootcamp/learning_git_git_flow.html
CAMetalLayerを実機でもシミュレータでも良い感じにビルドする

時々、とても奇妙なクラスに出会うことがある。
CAMetalLayerはまさにそれで、実機ではiOS8+、シミュレータではiOS13+が必要になる。
これはシミュレータでMetalが使えるようになったのがiOS13~だったからという歴史的経緯によるものだ。
ちなみに内部的には実機とシミュレータでSDKが別れているため、それぞれのSDKごとにavailableが定義されて実現している。


```objc:実機SDK
API_AVAILABLE(macos(10.11), ios(8.0), watchos(2.0), tvos(9.0))
@interface CAMetalLayer : CALayer
```

```swift:シミュレータSDK
@available(iOS 13.0, *)
open class CAMetalLayer : CALayer {
```

さて、問題はアプリで`CAMetalLayer`を利用するときで、iOS12未満もサポートしているアプリだと次のような挙動になる。

||実機|シミュレータ|
|---|---|---|
|iOS12|○|コンパイルエラー|
|iOS13|○|○|

この挙動をどう見るか難しいところだが、シミュレータ相手であればさっとコンパイルだけ通したいこともあると思う。
そんなときは

```swift
public protocol CAMetalLayerInterface: class {
  var pixelFormat: MTLPixelFormat { get set }
  var framebufferOnly: Bool { get set }
  var presentsWithTransaction: Bool { get set }
  func nextDrawable() -> CAMetalDrawable?
}
#if targetEnvironment(simulator)
@available(iOS 13, *)
extension CAMetalLayer: CAMetalLayerInterface {}
#else
@available(iOS 12, *)
extension CAMetalLayer: CAMetalLayerInterface {}
#endif
open class AnimationView: UIView {
  typealias LayerClass = CAMetalLayerInterface & CALayer
  override open class var layerClass: Swift.AnyClass {
    #if targetEnvironment(simulator)
    if #available(iOS 13, *) {
      return CAMetalLayer.self
    } else {
      preconditionFailure("Not support simurator older than iOS12.")
    }
    #else
    return CAMetalLayer.self
    #endif
  }
  private var gpuLayer: LayerClass { self.layer as! LayerClass }
}
```

こんな感じで型を消しつつ、iOS12 & Simulator以外のときに型を入れてあげるのが良い気がする。

```
#if canImport(QuartzCore.CAMetalLayer)
```

とか

```
#if targetEnvironment(simulator) && available(iOS 13, *)
```

とか出来ればいいのになーって思ってしまった。レアケースだけど…

https://developer.apple.com/documentation/quartzcore/cametallayer
多重線形性

# 多重線形性
$ 写像 F(x_1,x_2, \cdots, x_n)$ に対して

```math
\begin{align}
F(x_1, \cdots, \color{red}{x_j’+x_j’’}, \cdots, x_n) 
&= F(x_1, \cdots, \color{red}{x_j’}, \cdots, x_n) \\
&+ F(x_1, \cdots, \color{red}{x_j'’}, \cdots, x_n)  \qquad \cdots (1)
\\\\[1pt]
F(x_1, \cdots, \color{red}{c}x_i, \cdots, x_n) &= \color{red}{c}F(x_1, \cdots, x_i, \cdots, x_n) \qquad \cdots (2)
\end{align}
```

を表満たす場合、F は 多重線形性 を持つという

この性質より

```math
\begin{align}
F(x_1, \cdots, c \ {(x_i’+x_i’’)}, \cdots, x_n) 
&= c \ F(x_1, \cdots, x_i’, \cdots, x_n) + c \ F(0, \cdots, x_i'’, \cdots, 0) 
\end{align}
```
と表現できる


# 参照
[線形代数入門(斎藤　正彦 著)](http://www.utp.or.jp/book/b302039.html)