OmniAICreator/Qiita-1.07M huggingface dataset:
Matlabのdatestr()をPythonで

個人的にいつ作ったかファイルかをメモするのによく使うdatestr()とnow()
Pythonだとdatetimeというモジュールでできる。　(timeというUNIX時間を扱うモジュールも別にある）

Matlabのnow()に相当するのがdatetime.datetime.now()
これは現在時刻のdatetimeオブジェクトを返してくる。

datetimeオブジェクトにはstrftimeというのメソッドがあり（string format timeの略？たぶん）
これがMatlabのdatestrに相当する。
フォーマットは　"%Y-%m-%d %H:%M:%S"　といったよくある書き方でOK。


#例：in Matlab
```matlab
>> datestr(now)

ans =
    '03-Feb-2021 12:34:56'

>> datestr(now,'yyyy-mm-dd HH:MM:SS')

ans =
    '2021-02-03 12:34:56'
```

#例：in Python
```python
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2021, 2, 3, 12, 34, 56, 123456)

>>> datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
'2021-02-03 12:34:56'
```
ちなみに、datetime.date というのもあり、こちらは日付だけを扱うようだ。
datetime.date.today()で今日の日付が取れる模様。
【Swift】UIColorでカラーコードを指定する

# どういうことか

たとえばボタンの色を変更する場合、最初から用意されているカラーであればこのように指定する。

```swift
button.backgroundColor = UIColor.blue
```

カラーコードで細かい色を指定したい。

```swift
button.backgroundColor = UIColor.005192
```

こんなふうには書けない。

## colorLiteralを使う

```swift
button.backgroundColor = UIColor {_ in return #colorLiteral()}
```

こんなふうに書くと

![b3da9f855be521db0fb03e2d3bdbe04a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413699/3901063d-bd2a-3b53-d7db-333c2c98f6ad.png)

`#colorLiteral()` の部分がアイコンに変化する。
このアイコンをダブルクリックしてカラーコードやRGBなどいろいろ細かい指定ができる。Xcode8から使えるようになったみたいです。

【参考】
**UIColorの定義はすべて#colorLiteral使ってみることにしてみた**
<https://medium.com/swift-column/color-literal-6223850f7e2c>
Rubyである色に近い色を導き出したい、という話

初投稿です
自身の復習の目的として投稿致します。
あまりこういった発信は慣れていないことも有りますので、気になった点があれば**ここ違うよ！**とか**ここ短くできるよ！**とかコメントを頂けると凄く喜びます

##これ is 何
- 「ある色配列(RGB)に対して近い色を上手に探したいんだけどどうすればいいのか」を考えたときの産物となっております。
- ポートフォリオに機能追加を行っていたときのものです。

##開発環境
`ruby 2.6.3`
`Rails 5.2.4.4`

##前提条件

```ruby

sample = [255, 192, 103]
# お好みの色(RGB)を配列指定。
colors = { "red" => [220, 53, 69], "orange" => [255, 153, 51], "yellow" => [255, 193, 7], "green" => [40, 167, 69], "blue" => [0, 123, 255], "indigo" => [51, 51, 204], "purple" => [153, 51, 255]}
# Hashで指定。こちらもお好みで。

```

2色間の色差の計算は以下で行っています。

```math

distance = \sqrt{{(R_2-R_1)}^2 + {(G_2-G_1)}^2+ {(B_2-B_1)}^2}

```

>参考：[色差(Wikipedia)](https://ja.wikipedia.org/wiki/%E8%89%B2%E5%B7%AE#%E3%83%A6%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%83%E3%83%89%E8%B7%9D%E9%9B%A2)

##実装
### 1.distanceを作る

```ruby
distance = {}
# 空Hashを作る
colors.each{|key, value|
  r = "#{(value[0] - sample[0])**2}"
  g = "#{(value[1] - sample[1])**2}"
  b = "#{(value[2] - sample[2])**2}"
  distance[key] = "#{((r + g + b).to_i**(1 / 2.0)).round}"
  # p distance => 下部コンソール(1)にて
}
# keyには色、valueには色の配列が入るので、それぞれの配列の1~3番目の差を計算し2乗
# 合計した上でその平方根を計算、小数点以下を四捨五入している(前提条件より)。
```


```:コンソール(1)
{"red"=>"1106884"}
{"red"=>"1106884", "orange"=>"3900"}
{"red"=>"1106884", "orange"=>"3900", "yellow"=>"139"}
{"red"=>"1106884", "orange"=>"3900", "yellow"=>"139", "green"=>"679894"}
{"red"=>"1106884", "orange"=>"3900", "yellow"=>"139", "green"=>"679894", "blue"=>"8063838"}
{"red"=>"1106884", "orange"=>"3900", "yellow"=>"139", "green"=>"679894", "blue"=>"8063838", "indigo"=>"20400049"}
{"red"=>"1106884", "orange"=>"3900", "yellow"=>"139", "green"=>"679894", "blue"=>"8063838", "indigo"=>"20400049", "purple"=>"10200097"}
```

7色の色毎にdistanceを持った、Hashを生成することが出来ました。
しかし、このままでは見た目で分かっても、指定の色を引き出せないので…
### 2.distanceを並び替える

```ruby
distance = {}
colors.each{|key, value|
  r = "#{(value[0] - sample[0])**2}"
  g = "#{(value[1] - sample[1])**2}"
  b = "#{(value[2] - sample[2])**2}"
  distance[key] = "#{((r + g + b).to_i**(1 / 2.0)).round}"
  # ここまでは1.と同様
      if key == "purple"
        sorted_dis = distance.sort {|(k1, v1), (k2, v2)| v1.to_i <=> v2.to_i }.to_h
        # valueの値によって、昇順に並び替える
        topcolor = sorted_dis.first.first
        # p topcolor => 下部コンソール(2)にて
      end
}
```

```:コンソール(2)
"yellow"
```

sampleに対しては、yellowが最も近いことが分かりました。
調べていくと、色に関しては色々な計算方法があり、まだまだ研究していかないといけない感じです！

ところで、

```ruby
hoge.each{|key, value|}
```
を見て思い出しましたが、hashに対するeachはRailsのflashメッセージでも使っていたような…と思ったので、次回はエラーメッセージの分岐とか復習がてら書いていこうと思います。
ここまでご覧頂きまして、誠にありがとうございます。

### 参考にさせて頂いた記事
[[Ruby] 便利な組み込みクラスのメソッド達（Hash編）](https://qiita.com/kidach1/items/651b5b5580be40ad047e)
[Django][個人的メモ]: 外部キーに紐付けされたデータの件数をfilter処理に使う方法

## 前置き
Djangoチュートリアルを終えてちまちまと自分用にカスタマイズしているくらいの初心者です。その過程で自動テストを追加しようとチュートリアルを再度確認していると、以下のような記述が。

>テストを追加することによって、同じように他の方法でアプリを改善できるでしょう。例えば、Choices を一つも持たない馬鹿げた Questions が公開可能になっています。このような Questions を排除するようビューでチェックできます。 Choices がない Question を作成し、それが公開されないことをテストし、同じようにして、Choices がある Question を作成し、それが公開 される ことをテストすることになるでしょう。
(引用元:[さらなるテストについて考える](https://docs.djangoproject.com/ja/3.1/intro/tutorial05/#ideas-for-more-tests))

自分は英単語と日本語を1:Mで対応させたモデルを使っているので、"対応する日本語を一つも持たない馬鹿げた英単語が公開可能になっている"状態です。

その手の表示を弾きたいだけなら、htmlファイル側でテンプレートタグを使い、適当なif処理でもさせればよいです。が、今回は公式のテストでも利用されているassertQuerysetEqualを使いたかった、というより他のテスト手法がわからなかったので、view側でQuerysetを送信する段階で弾くことにしました。

## 参考サイト様
[Djangoで、集計処理](https://blog.narito.ninja/detail/84/)

## コード

```python:models.py
class EnglishWord(models.Model):
    spell = models.CharField(max_length=30)
    pub_date = models.DateTimeField('date published')
    difficulty = models.IntegerField(default=0)

    def __str__(self):
        return self.spell
    
    def was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1) <= self.pub_date <= now
    
    was_published_recently.admin_order_field = 'pub_date'
    was_published_recently.boolean = True
    was_published_recently.short_description = 'Published Recently?'


class JapaneseWord(models.Model):
    english_word = models.ForeignKey(EnglishWord, on_delete=models.CASCADE)
    japanese_mean = models.CharField(max_length=50)
    difficulty = models.IntegerField(default=0)

    def __str__(self):
        return self.japanese_mean

```

```python:views.py
from django.db.models import Count

class IndexView(generic.ListView):
    template_name = 'wordapp/index.html'
    context_object_name = 'latest_english_word_list'

    def get_queryset(self):
        return EnglishWord.objects.annotate(count=Count('japaneseword')).filter(count__gt=0)
```

annotateで臨時のカラムを設けて、そこにカウントした件数を格納し、格納した件数で条件を設定する、といった感じだと思います。あとは後ろにチュートリアルどおりにorder_byを付け加えるなりなんなりできそうです。

## 終わりに
多分SQLを含めたデータ処理に慣れている人にとっては当たり前の話なのでしょうが、3時間ほど詰まったので備忘録代わりに。もっと上手いやり方がありそうな気配がしますが、とりあえず希望通りに動いたのでヨシ。集合知に感謝。
Salesforce Classic での Pardot を使用した対ビジネスマーケティングの自動化 ⇒ Pardot リードスコアリングと評価 (Salesforce Classic) ⇒ 評価の使用

１．Pardot のグレードはどのようなものですか?
２．デフォルトのプロファイルに自動的に割り当てられるのはどのプロスペクトですか?
３．Pardot でカスタムプロファイルを作成するとしたらその理由は何ですか?
４．カスタムプロファイルを使用してプロスペクトをグレーディングする正しい手順はどれですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/ac0ceb21-9c5c-f2b2-74aa-ebfaf7bac687.png)
Oracle Cloud (OCI) の GPU インスタンスで Singularity を使ってみる 

# はじめに
Singularity で GPU を試す必要があり試してみるっという目的です。
ゴールとしては、TensorFlow のベンチマークが動くというところにおきたいと思います。

# 環境構築
## 前提

以下についてはすでに完了している前提です。

- OCI のアカウントはすでにある
- VCN は作成済み
- GPUインスタンス(VM.GPU3.x)が利用できること （サービスリミットを緩和済みであること）
- インスタンスの作成から SSH アクセスまでを理解されていること

## インスタンスの作成
作成時のポイントは以下です。

- Image は Oracle Linux (RHEL互換)で Image Guild が Gen2-GPU-xxxx.xx.xx-x が選択されていることを確認します。Gen2-GPU というイメージは NVIDIA のドライバーや CUDA がインストール済みになります。
- Shape は VM.GPU3.x （ｘは搭載GPU数）を選択。今回は 1GPU で十分なので、VM.GPU3.1 を選択しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/b9c41e02-0a0a-dbb5-49b3-7c078a841a7f.png)

インスタンスの作成が完了したら SSH でログインします。

## Singularity のインストール
この時点で最新だった v3.7 を利用することとします。
インストールは以下の公式手順に書かれている通りでコンパイルできるので、詳細は省きます。
https://sylabs.io/guides/3.7/admin-guide/installation.html#installation-on-linux

インストール後、nvidia-smi を実行すると以下のようになってしまうので一旦 reboot します。

```
$ nvidia-smi
Failed to initialize NVML: Driver/library version mismatch
```

## Benchmark の準備

TensorFlow のベンチマークをダウンロードします。

```
git clone https://github.com/tensorflow/benchmarks.git
```

TensorFlow を動かす Docker イメージは[こちら](https://hub.docker.com/r/tensorflow/tensorflow)を利用しようと思います。

```
singularity pull docker://tensorflow/tensorflow:latest-gpu
```

## 実行

```
$ singularity exec --nv  ./tensorflow_latest-gpu.sif python ./benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py --num_gpus=1 --batch_size=64 --model=inception3 --variable_update=parameter_server
```

# 結果
- 数値は大人の事情で伏せますが、正常に動作し、妥当な images/sec の結果となりました。

- GPU を利用するコンテナを Rootless で動かす必要があり、Singularity と Enroot を試したのですが、Singularity はあっさりと動いてくれました。
- Enroot は設定の問題かうまく動かせず、また別の機会にチャレンジかなというところです。 
- 今回は Singularity をソースからコンパイルしましたが、Oracle Linux の EPEL は Singularity も含まれているので、そちらを使うのもありです。
Laravel 8.25.0でMigration時のSQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraintエラーを解決するまでの備忘録

<h1>背景</h1>
とあるゲームのクランメンバー募集サイトを作っていて、Users、Threads(板　スレ)、Commentsの三つのテーブルで外部キー連携しようとした際にエラーが出た。
エラーの内容はこれ

```terminal
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint 
(SQL: alter table `comments` add constraint `comments_user_id_foreign` 
foreign key (`user_id`) references `users` (`id`) on delete cascade on update cascade)
```
外部キーが追加できないよーとのことなので、とりあえずググってみた。

<h1>結論</h1>
[こちら](https://qiita.com/kitakrazy/items/6a3e1936da727dbd92b3)の記事にもあるように、連携したいテーブルのカラム同士でidの型が違っていたことが原因。
Laravelの機能で作ったUsersのidは最初からBigIncrementsなので、user_isはbigIntegerを指定してあげないとダメらしい
jsでオブジェクト特定値の合計を一行で出す

次のようなオブジェクトの特定の値(num)の合計だけを
出すのにmapやeach文でゴニョゴニョ数行書くのやだなぁと思い、

```js

ex = {
  id: 1,
  childrens: [
    {id: 1, num: 1},
    {id: 2, num: 3}
  ]
}
```

そうだreduceがあると思ったのですが、
シンプルな配列と違って、ちょっと扱いに迷ったので簡単にメモ。


```js
ex.childrens.reduce((sum, obj) =>{return sum + obj.num}, 0);
```
※0は、初期値。省略すると配列[0]の値。

ちなみに、オブジェクトのオブジェクトの場合、`Object.values`を使ってArray化して利用するアイデアも。

```js
ex2 = {
  0: {id: 1, num: 1},
  1: {id: 2, num: 3}
}
Object.values(ex2).reduce((sum, obj) =>{return sum + obj.num}, 0);
```


公式：
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

参考：
https://stackoverflow.com/questions/15748656/javascript-reduce-on-object

https://www.javadrive.jp/javascript/array/index19.html
Laravelのコントローラー

#概要
`Laravel`の学習に伴って最低限の知識を整理した個人的な備忘録です。
以前の記事の続きになります。

[Laravelのモデルとマイグレーション - Qiita](https://qiita.com/strrr/items/ba166c41422b66cce3fc)

#tinker
`tinker`とはLaravelフレームワークに標準搭載されている対話シェルのこと、 `Rails`でいう`binding.pry`的なやつ。
>Laravel Tinker is a powerful REPL for the Laravel framework.
[laravel/tinker - GitHub](https://github.com/laravel/tinker)

`REPL`とは`Read Eval Print Loop`の略で入力・評価・出力のループのこと。

[Laravel 標準搭載のデバッグ機能 tinker コマンドのご紹介 -Qiita](https://qiita.com/ucan-lab/items/0e9537be6d5709e1d099)

`tinker`を使うには以下コマンドを入力。

```
php artisan tinker
```
`tinker`を使ってデータベースにレコードを挿入してみる。

```
>>> $test = new App\Models\Test;
=> App\Models\Test {#3258}
>>> $test->text = "aaa";
=> "aaa"
>>> $test->save();
=> true
>>> App\Models\Test::all();
=> Illuminate\Database\Eloquent\Collection {#3981
     all: [
       App\Models\Test {#3980
         id: 1,
         text: "aaa",
         created_at: "2021-02-01 17:17:51",
         updated_at: "2021-02-01 17:17:51",
       },
     ],
   }
>>> exit
Exit:  Goodbye
```
`tinker`から抜けたい場合は`exit`を入力。

#コントローラー
実際に`TestController`を作成してみる。

```
php artisan make:controller TestController
```
以下実行結果。

```php:app/Http/Controllers/TestController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestController extends Controller
{
    //
}

```
S3 + CloudFront + Nuxt.jsを使いSSGで静的サイトを公開する

調べてもなかなか適切な情報がなかったので備忘録。

# 基本的な考え方

結構単純です。Lambdaとかリダイレクトルールとか一切使いません。

1. S3で静的サイトホスティングを設定する
これだけで、
a. /sub -> /sub/ に書き換え（HTTPリダイレクト）
b. /sub/ -> /sub/index.html に転送(HTTPサーバで言うrewrite)
の設定がされます。
これだけで、nuxtのSSGに完全対応できます。

2. CloudFrontで、1で設定した静的サイトホスティングのドメインを指定する。
**重要！**
CloudFrontでS3のオリジンを指定しようとすると、
同じアカウントで登録されたS3のドメインがサジェストされます。
でも、これを使ってはいけません。無視です。
あくまで静的サイトホスティングのドメインを指定します。

Nuxt.js対応という意味ではこれで終わりで、
あとは通常のS3 + CloudFrontと同じです。

# キャッシュポリシー

上記の通りでも最低限の運用ができますが、
Nuxt.jsでは、_nuxt以下のファイルにはハッシュが付きますので、
この部分だけキャッシュポリシーを変えるのが理想的です。
そこで以下のようにキャッシュを設定します。


### ブラウザキャッシュ(s3へのアップロード時に指定）
```
# /_nuxt/ 以下
aws s3 cp ./dist/_nuxt s3://bucketName/_nuxt --recursive --exclude ".git/*" --cache-control "max-age=86400"
# それ以外
aws s3 cp ./dist s3://bucketName/ --recursive --exclude ".git/*" --exclude "_nuxt/*" --cache-control "no-cache"; 
```

### CloudFrontキャッシュ(Behaviourで指定）
/_nuxt/* -> 86400秒(1日)
Default -> 10秒

Compress Objects AutomaticallyをONにするのを忘れないように。

数字はあくまで一例なので、運用状況次第で変わる部分かと思いますが、10秒というのは「更新があったらすぐに反映してほしいが、高負荷時にオリジンに負荷がいかないように」という基準、1日は、「理想は永続的にキャッシュしてほしいが、トラブル時に一応消える手段を持ちたい」という基準ですが、プロモーションサイトならともかく、会員制サイトだと、1日は短すぎるでしょう。1ヶ月〜1年くらいが妥当なラインかと思います。

# 余談

この記事の内容と論理的には何も関係ないのですが、上記の設定をしてページを読み込ませたら、ネットワーク使用量が画像とフォントを除いて57kという非常に優秀な結果になりました。Nuxt.js優秀過ぎる。

S3ともCloudFrontともほぼ関係ないですけどね（Compress Objects Automatically)に依存する結果ではあるけど）。
【Tensorflow】画像セグメンテーションのデータセットをビルドする

# Tensorflowチュートリアル

画像セグメンテーションのチュートリアルを行うにあたり
あたまのデータセット読み込みでつまづいたので
自分用にメモ。

ポイント

データセットのダウンロードあるいはビルドで失敗する場合は
あらかじめ手動でデータセットをダウンロードしておき
ビルドのコードを改変して、ローカルのファイルを読み込むようにする

環境

- Windows 10
- Anaconda

## 画像セグメンテーション

Tensorflow公式サイトで画像セグメンテーションのサンプルコードが公開されています。

[画像セグメンテーション](https://www.tensorflow.org/tutorials/images/segmentation)

いまどきは、関数`tfds`をつかってデータセットをダウンロードするようです。

```python
dataset, info = tfds.load('oxford_iiit_pet:3.*.*', with_info=True)
```

正常にダウンロードされればディレクトリが作成されます。
~\tensorflow_datasets\oxford_iiit_pet\3.2.0

```powershell
dataset_info.json                                                    
features.json                                                        
label.labels.txt                                                     
oxford_iiit_pet-test.tfrecord-00000-of-00004                         
oxford_iiit_pet-test.tfrecord-00001-of-00004                         
oxford_iiit_pet-test.tfrecord-00002-of-00004                         
oxford_iiit_pet-test.tfrecord-00003-of-00004                         
oxford_iiit_pet-train.tfrecord-00000-of-00004                        
oxford_iiit_pet-train.tfrecord-00001-of-00004                        
oxford_iiit_pet-train.tfrecord-00002-of-00004                        
oxford_iiit_pet-train.tfrecord-00003-of-00004                        
species.labels.txt                                                   
```

諸事情により、ソースコードを介してデータセットを読み込めない場合
手動でデータソースをダウンロードして、データセットを作ることができます。

### 報告されているISSUE

[404 Error during oxford-pets tutorial dataset loading - Github Issue](https://github.com/tensorflow/tensorflow/issues/31171)

自分も上記症状起きましたが、`tensorflow_dataset`をアップデートし、かつ`tfds-nightly`を`pip install`することで解消しました。

```python
import tensorflow_datasets as tfds
print(tfds.__version__)

'''出力結果
4.2.0+nightly
'''
```

### チュートリアルの中で使われているデータセット

- 動物の画像(.jpg): ***7,393*** 枚
- セグメンテーション用マスク画像(.png): ***14,780*** 枚
- ファイル名のリスト(.txt)

[The Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/)

#### 手動でダウンロードする

30分くらいかかる。
先方サーバーの都合か、しばしば途中で接続が切れるので、放っておくと時間を無駄にする。

Downloads -> 1. Dataset
images.tar.gz

Downloads -> 2. Groundtruth data
annotations.tar.gz

### データセットを手動でビルドする

`oxford_iiit_pet.py`を編集する。

\anaconda3\envs\py37\Lib\site-packages\tensorflow_datasets\image_classification\oxford_iiit_pet.py

変更前

```python
_BASE_URL = "http://www.robots.ox.ac.uk/~vgg/data/pets/data"
# 中略
dl_paths = dl_manager.download_and_extract({
    "images": _BASE_URL + "/images.tar.gz",
    "annotations": _BASE_URL + "/annotations.tar.gz",
})
```

変更前では英国サーバーからデータソースをダウンロードして展開しています。

変更後

```python
dl_paths = {
    "images": "~/local/path/to/images", # tar.gzはあらかじめ展開しておく
    "annotations": "~/local/path/to/annotations",
}
```

Anacondaプロンプトで環境をアクティベイトし
`tfds build oxford_iiit_pet`を実行する。

先述の通り、うまくいけばディレクトリが生成される。
~\tensorflow_datasets\oxford_iiit_pet\3.2.0


EOF
rails で Redis の設定を database.yml の様に環境変数から読み込む

## 概要
rails の database.yml では環境変数から設定値を取得し、取得出来なかった場合は、デフォルト値を使う書き方が出来ます。同じ事を Redis の設定ファイルでも行う方法です。
若手から実現したかったけど、やり方が分からずに断念していたと聞いたので、記事に残すことにしました。

## 環境
Rails 6.0.3

## Redis の設定ファイル
設定ファイルは config/redis.yml です。

```
default: &default
  host: <%= ENV.fetch('SESSION_DB_HOST') { 'session_db' } %>
  port: <%= ENV.fetch('SESSION_DB_PORT') { 6379 } %>

development:
  <<: *default

test:
  <<: *default

production:
  <<: *default
```

host と port を database.yml と同じく、環境変数が存在すれば環境変数から取得しセット、環境変数が存在しない場合はブロックで指定したデフォルト値をセットする様にしています。

## Redis の初期化
config/initializers/redis.rb で Redis の初期化を行います。

```
path = Rails.root + 'config/redis.yml'
yaml = Pathname.new path if path

config =
  if yaml && yaml.exist?
    YAML.load(ERB.new(yaml.read).result)[Rails.env] || {}
  else
    raise "Could not load redis configuration. No such file - #{path}"
  end

Redis.current = ConnectionPool.new(size: 10, timeout: 5) do
  Redis.new(
    host: config['host'],
    port: config['port']
  )
end
```

YAML.load(ERB.new(yaml.read).result)[Rails.env] の箇所で、読み込んだ redis.yml を ERB クラスを使って、eRuby スクリプトとして処理をしています。

## 参考
https://docs.ruby-lang.org/ja/latest/class/ERB.html
DatabricksにてDisplay関数を利用した場合におけるノートブックのファイルサイズへの影響について

## 概要
Databricksにて便利な機能であるDisplay関数を利用した場合に、ノートブック内に出力結果を保持しており、ノートブックのファイルサイズが肥大化するという事象を共有します。共有するノートブックにおいては、ファイルサイズを削減するためにレコード数を絞った上で共有する方がよさそです。

Jupyterノートブック（Ipython Notebook）形式で出力した際に、下記のようにデータも含めてエクスポートされることから、ノートブック内に保持している
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/dbdc5e88-dc02-fec7-47a3-91101e52f90f.png)

本記事記載の対応方法を実施したところ、ファイルサイズが約6分の1となりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/914cf83a-8097-b51a-d6bd-704cdeafc5e9.png)


## 対応方法
### 修正前

```python
display(df_data_geo)
```

### 修正後

```python
display(df.limit(10))
```
CentOS7.8のFileMakerServerでｎ日前の自動バックアップを削除

# はじめに
## 対象読者
* [Claris FileMaker](https://www.claris.com/ja/filemaker/) ユーザーで FileMaker Server 管理している人
* 自動バックアップが一週間分残ってしまうと、ディスク領域を逼迫して大変だから、任意の日数分だけ残しておきたいというニーズがある人

## 本記事の概要
* cron で任意の日付のバックアップディレクトリを削除する

# 本題
## 削除指令
* 以下は二日前のディレクトリを削除する cron での記述例です
  * `"2 days ago"` という表記がありますね。ここの数字を任意のものに変えることができます
  * `0 4 * * *` とあるのは、サーバに設定されたタイムゾーンにおける AM 04:00 毎日実行、という意です

```sh
0 4 * * * sudo rm -R /opt/FileMaker/FileMaker\ Server/Data/Backups/FMS_`date --date "2 days ago" +"\%Y-\%m-\%d"`_0000
```

## cron の設定
* Linux 操作に明るくない方向けに少し補足しておきます
* FileMaker Server を稼働させている CentOS に特定ユーザーでログインした後で、以下コマンドを打ってください

```sh
crontab -e
```

* エディタ未指定の場合は何のエディタを使用するか訊かれるはずなので `vi` を選んでおきましょう
* `vi` を選んだという前提で話を進めます。記述するために編集モードへ切り替える必要があるので `I` と入力して切り替えます
* 先の記述例を元に任意の設定を入力してください
* 入力を終えたら `ESC` を押して編集モードを抜けます
* さらに `:wq` と入力して保存します
* 念のため本当に設定されているか確認するためにもう一度 `crontab -e` を入力してみるとよいでしょう。先ほど保存した内容が確認できればよしです。今度は編集していないので `:q` で終了します


## Google ドライブへのバックアップと組み合わせ
* 以前に以下の記事を書いていました

[CentOS7.8のFileMakerServerでRcloneを使ってGoogleドライブへファイルバックアップ
](https://qiita.com/Hi_Noguchi/items/73d32dc240236f78e1fd)

* こちらと組み合わせると、例えば以下のような cron の記述例が完成します
  * 毎日 AM 04:00 に二日前時点のバックアップディレクトリを削除し、
  * 毎日 AM 05:00 に本日時点のバックアップディレクトリを Google ドライブへ同期する

```sh
0 4 * * * sudo rm -R /opt/FileMaker/FileMaker\ Server/Data/Backups/FMS_`date --date "2 days ago" +"\%Y-\%m-\%d"`_0000
0 5 * * * rclone copy /opt/FileMaker/FileMaker\ Server/Data/Backups/ FileMakerBackup:directory/`date +\%Y`/
```


# おわりに
## 感想
* Windows Server におけるタスクスケジューラなどと比べると cron の安心感たるやというのが何ともありますがいかがなものでしょうね……？
* 自動バックアップの残しておきたい日数は fmsadmin コマンドあたりで設定できて欲しかった
【邪道JS】多重クリック抑止を邪悪な方法で実現する

# はじめに

いろいろな事情があって読み込ませてるjsファイルがいじれないけど、なんとかして多重クリック抑止入れないといけないってことありますよね。
そんなときにこんな方法どうですかってやつです。

# こんな感じ

「click」ってボタンがあったとき、って想定です。

```html
<button onclick="window.clicked?event.preventDefault():(window.clicked=true)">click</button>
```

ちなみにclickって擬音なんだそうで、日本語訳すると多分「カチッ」です。日本語でも「ポチる」って言い方あるので、動詞にするとそんな感じになる予感がしてます。
https://www.85begin.com/columns/click

# ちゃんとやるとこんな感じ

普通、windowオブジェクトに勝手になんか値を入れてしまうのは良くないので……

```html
    <button class="preventMultipleClick">click</button>

    <script>
        const preventMultipleClick = {
            clicked: false,
            checkClicked: (event) => {
                if(preventMultipleClick.clicked){
                    event.preventDefault()
                }else{
                    preventMultipleClick.clicked = true;
                    console.log('click'); //多重クリックされてないことを確認する用
                }
            }
        }

        document.querySelectorAll('.preventMultipleClick').forEach(elm => {
            elm.addEventListener('click', preventMultipleClick.checkClicked);
        });
    </script>
```
なげえｗ
ちなみにイベントリスナーをjQueryで書くと少しだけ短くできます。
こういうときにありがたみを感じますね。

```javascript
$('.preventMultipleClick').on('click', preventMultipleClick.checkClicked);
```

ご利用は用法用量にお気をつけください。
ReactNativeでSVGアニメーション

参考


## React NativeでSVGを扱う
今回は[react-native-svg](https://github.com/react-native-community/react-native-svg)を使う前提

- ARTというライブラリもあるが、色々試している時に[このエラー](https://stackoverflow.com/questions/43822984/react-native-exception-thrown-while-executing-ui-block
)が発生して解決しなかった。
  react-native-svgのほうが安定して使えた印象。

## 基本的なアニメーションの流れ
- SvgやPathなどのタグをAnimationに対応させないと行けない。これを忘るとAnimated.valueを設定しても反映されない。ちょっとハマる。

```jsx

//使う要素を 順次以下のようにAnimatedに対応させる
const AnimatedSvg = Animated.createAnimatedComponent(Svg);
const AnimatedPath = Animated.createAnimatedComponent(Path);
const AnimatedCircle = Animated.createAnimatedComponent(Circle);

```
- 他の要素と同じように、Animated.value()を設定して、任意のタイミングでこの値を変動させることで実現する。stateの持たせるのがわかりやすいか。Svgでははfill(塗りつぶし色)やstroke（線）、opacityなどをpropとして指定する。普通の要素はstyleに指定したりするので注意。


- 変動させたい値の数だけ以下の処理が必要
 * Animated.value()の宣言
 * (必要なら)interpolateの設定
 * animationの実行

```jsx
//宣言
  constructor(props) {
    super(props);
    this.state = {
      checked: false,
      svgScale: new Animated.Value(50),
    };
  }
```


```jsx
//_interPolateの設定(cssのkeyframe的に)
    const _interPolateSvgScale = svgScale.interpolate({
      inputRange: [0, 100],
      outputRange: [0.8, 1],
    });

```



```jsx
//animationの実行
  _svgScaleAnimation = () => {
    const { checked, svgScale } = this.state
    Animated.timing(svgScale, {
      toValue: checked ? 0 : 100, 
      duration: duration,
      useNativeDriver: false,
    }).start();
  }

```

- 場所の移動や回転・サイズ変更などはstyleでtransformを指定する。[transform リファレンス](https://reactnative.dev/docs/transforms)
指定できる項目→
decomposedMatrix, rotation, scaleX, scaleY, transformMatrix, translateX, translateY

```jsx
    const dStyle = {
      transform: [
        { translateY: _interPolateHeartY },
        { scale: _interPolateSvgScale },
        { scaleX: _interPolateHeartTransformX },
        { scaleY: _interPolateHeartTransformY },
      ],
    };

...

    return (
            <AnimatedSvg height={100} width={100} style={dStyle} >


```

- cssのkeyframe的に段階的に変化を設定する場合や、色を変化させていく場合は、interpolateを使う。cssで一つのkeyframeで複数のプロパティを指定できるが、reactnativeではanimated.value()一つずつ設定しないといけない。

- ちあんみにSVG画像を表示する場合はreact-native-svg-uriを使う。この時propで調整出来るのはfillぐらいなので、あまり柔軟なanimationは出来ない..


## Pathのサイズ調整する方法

Path自体にはサイズ(height, width)の指定が出来なかった。
SVGタグにheightとwidthを指定してこれを枠とする。
その中にpathを描画すると元々のpathのサイズで描画される。
ここでSVGのviewBoxを調整するとSvgタグの中でpath全体がちょうどよく描画されるように調整することができる。
svgのpathを作成する時も一応使うサイズに合わせて作っておいた方が扱いやすい。


## 作ったアニメーション

![106687664-ec4ddb00-660f-11eb-8c64-992b131f8482.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226284/6c0e25ef-0081-6c9e-ce8d-d6fc60ca03e3.gif)


###　コード

- [円のボタンのアニメーションコード](https://github.com/Takuya-Nakamura/react_svg/blob/master/svg_sample/components/CircleButtonAnim.jsx)
- [ハートボタンのアニメーションコード](https://github.com/Takuya-Nakamura/react_svg/blob/master/svg_sample/components/PathButtonAnim.jsx)




....CSSで出来ることは一通り出来そうだけど、コード量は増えてしまいそう。
nuxt generateした時にエラーが発生したらビルドを失敗させたい

## 背景

github actionsを使ってCDを設定していた。
`nuxt generate`時にエラーが発生していたが、ビルド自体は失敗していなかった為そのままデプロイされていた。

Errorは吐いているがStep自体は成功してしまっている。
![スクリーンショット 2021-02-03 11.25.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488042/8f82cfbc-475d-c355-cec8-ae2675ef4d5a.png)

## 環境
nuxt v2.14.4以降

## 対処法
  
    
`nuxt generate` コマンドに `--fail-on-error` というoptionを追加すればfailしてくれるらしい。

```shell
nuxt generate --fail-on-error
```
<br/>
公式ドキュメントにしっかり書いてありました。。
[エラー時の失敗（Fail on Error）](https://ja.nuxtjs.org/docs/2.x/get-started/commands/#%E3%82%A8%E3%83%A9%E3%83%BC%E6%99%82%E3%81%AE%E5%A4%B1%E6%95%97%EF%BC%88fail-on-error%EF%BC%89)
Warning: Permanently added 'github.com,xxx.xxx.xxx.xxx' (RSA) to the list of known hosts. が出た時に対応したこと

タイトルの通り。

Git でリモートとの接続 (pull とか push とか) をした時にこんなエラーが出ている。

```log
Warning: Permanently added 'github.com,xxx.xxx.xxx.xxx' (RSA) to the list of known hosts.
```

Warning ではあるけど気持ち悪かったので色々調べてやっと解消したのでその結果を残しておく。
（私の環境ではこれで解消したので他の原因もあるかもしれませんが、記録として残しておく）

## 結論

`~/.ssh/config`

を見ると `UserKnownHostsFile` の設定がおかしなことになっていたので修正。

```
# 修正前
UserKnownHostsFile=/dev/null

# 修正後
UserKnownHostsFile ~/.ssh/known_hosts
```

## 参考

[stack overflow: Git says “Warning: Permanently added to the list of known hosts”
](https://stackoverflow.com/questions/9299651/git-says-warning-permanently-added-to-the-list-of-known-hosts)

やっと解消してよかった 😌
【Super Resolution】ESPCN : deconvolutionの代わりに画像をsubpixel accuracyで推定する方法

<h1>Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network</h1>
ESPCN(efficient sub-pixel convolutional neural network)を紹介する

<h1>アルゴリズム</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/29827c6e-33e8-0963-540c-732869881c9f.png)
convolutionでr^2のChannelを推定する。
推定したr^2をr x rのsub-pixelに展開する。
賢いな～

<h1>結果</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/f8a05256-c52e-7439-e413-38fa5673b727.png)
速度も速くて、精度も一番


<h1>結論</h1>
mono depthやstereo depthでsub-pixel毎にDisparity Mapを推定するのに使えそう。

<h1>参考文献</h1>
Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network
https://arxiv.org/pdf/1609.05158.pdf
【Stereo Depth】SuperDepth : sub-pixel convolutionで精度UP!

<h1>SuperDepth: Self-Supervised, Super-Resolved Monocular Depth Estimation</h1>
[ESPCN](https://qiita.com/minh33/items/83ecc67b51253e55981e)がstereo depthに応用している論文を見つけたので紹介。

<h1>結果</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/286c7b75-79f0-569c-98a9-25865450b720.png)
sub-pixel convolutionを使うと精度が上がった。

<h1>結論</h1>
sub-pixel convolutionはstereo depthにも有効である事が分かった。

<h1>参考文献</h1>
https://arxiv.org/pdf/1810.01849.pdf
Django is_active=True 

### 問題
dajgno rest apiを使う際、認証周りの楽するため、
simplejwt, djoserを使ってuser作成する際、どうやら、`is_active=False`が設定される

### 解決方法
```
'SEND_ACTIVATION_EMAIL': False, <- falseにすること
```
email認証を行わないと`is_active=True`にはさせない
Docker composeのコマンド（基礎）

開発環境としてDockerを使ってるのですが、なんとなくコマンドを打っていて、あまりちゃんとコマンドを理解していないので、覚え書きとしてまとめてみようと思います。

```
docker-compose  up -d
```
-> turn on your rails server
-> it is similar to rails s

```
docker-compose down
```
-> turns off your rails server
->it is similar to ctrl+c

```
docker-compose build
```
->installs gems and 3rd party plug-ins
-> similar to bundle install

```
docker-compose up --build -d
```
->it combines installing gems and turning on your server at the same time

```
docker ps -a
```
->checks for any application that is using docker
-> if you have docker problems or any errors in the future, it is good to use this command first to see if any application is running

```
docker system prune
```
-> To solve the error for this
-----------------------------------------------
if you have docker problems or any errors in the future, it is good to use this command first to see if any application is running
------------------------------------------------
-> it will automatically turn off the other applications and delete temporary memory that it is using
->after applying docker system prune, you turn down your server and build it up
↓
```
docker system prune
docker-compose down
docker-compose up --build
```

```
docker-compose exec web
```
->  To run other rails commands, begin with this command.
go-kintoneでのレコードの更新(PUT)のやり方

[公式Doc](https://pkg.go.dev/github.com/kintone/go-kintone)
# やり方

```go

import (
	"github.com/kintone/go-kintone"
)

...

//アプリの初期化
app := &kintone.App{
	"example.cybozu.com",
	"user1",
	"password",
	25, // AppID
}

// 更新用のデータ　※更新したいフィールドのみで大丈夫。
dataMap := map[string]interface{}{"フィールド名": kintone.SingleLineTextField("更新したいテキスト") /*, ...その他も*/ }

// 更新したいレコードのID
id := 1

//レコードの初期化
editedRecord := kintone.NewRecordWithId(id, dataMap)

//更新の実行
err := app.UpdateRecord(editedRecord, true)

```

# ハマったところ
`GetRecord`したレコードのフィールドをいじって、それを`UpdateRecord`してしまっていた。

```
RECORD_ID型のフィールドに値を設定することはできません。
```
それはそう
[矩形選択] RubyMine, Visual Studio Code 向け

Ruby Mine と Visual Studio Code で矩形選択して、移動する方法

| やりたいこと | Ruby Mine | Visual Studio Code |
|:------------------|:-------------------:|:--------------------:|
| 矩形選択       | option + ( option + (↑↓) ) | command + option + (↑↓) |
| 単語移動     | option + shift + (←→)      | option + (←→) |
| 行頭・行末移動       | ( command + shift + (←→) ) + (←→) | ( command + shift + (←→) ) + (←→) |
Cloud LoggingのログエントリとtextPayloadとjsonPayLoad

# 背景
Cloud Loggingを扱う際に、ログエントリについて把握しておくと捗るのでメモ。
まず、Cloud Loggingでは [`LogEntry`](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry?hl=ja) というデータ型を利用してログを表現する。

LogEntry型で必須の項目は

- logName: ログ名. 例: `projects/PROJECT_ID/logs/cloudfunctions.googleapis.com%2Fcloud-functions`
- resource: リソース情報. [`MonitoredResourced`](https://cloud.google.com/logging/docs/reference/v2/rest/v2/MonitoredResource?hl=ja)というデータ型で表現される. 例:  ` { "type": "gce_instance", "labels": { "instanceId": "12345678901234", "zone": "us-central1-a" }} `

そのほかに、timestampやseverity, payloadなどの情報を持つ。([詳細](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry?hl=ja))

特にpayloadに関しては、textPayloadとjsonPayloadの2種類があり、**この2つどちらを使うのかで検索クエリが異ってくる** ので、違いを把握しておく必要がある。

# textPayloadとjsonPayload
textPayloadはその名の通りテキストが入る。
jsonPayloadはJSON形式でログを表現できる -> [構造化ロギング](https://cloud.google.com/logging/docs/structured-logging?hl=ja)


# 触ってみる

gcloudでtextPayloadとjsonPayloadのログを登録してみてみる。

#### textPayload

gcloudでログを登録

```
gcloud logging write my-test-log "A simple entry."
```

cloud loggingのコンソールからはこんな感じで見える↓

![スクリーンショット 2021-01-20 12.37.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20307/1b97f2fa-ee55-fad6-b268-02d8a1a2e1c9.png)

#### jsonPayload

gcloudでログを登録

```
gcloud logging write --payload-type=json my-test-log '{ "message": "My second entry", "weather": "partly cloudy"}'
```

cloud loggingのコンソールからはこんな感じで見える↓


![スクリーンショット 2021-01-20 12.37.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20307/1511ff52-5e34-305a-4961-09c32c9a07ac.png)

このように、textPayloadとjsonPayloadで出力のされ方が変わり、検索する際のクエリも変わってくるので、どちらでロギングしているかに注意する。

# 参考
- [Cloud Logging#使用可能なログ#ログの仕様と管理](https://cloud.google.com/logging/docs/view/available-logs?hl=ja)
ド文系が1ヶ月勉強し基本情報技術者試験を受験してみる

所属している部署から資格取得を急かされたので、受験することにした。
受験を決意したものの、何から始めていいのか分からないので、やることを列挙する。

##そもそも基本情報技術者試験とは
情報処理推薦機構さんが提供するITエンジニアの登竜門と呼ばれる国家資格
公式情報は以下の通りです。
>https://www.jitec.ipa.go.jp/1_11seido/fe.html

##どうやって受験するの？
プロメトリック社が提供するサイトから申し込みをします。
※プロメトリックIDを取得していない場合は、取得してから申し込みができるようになります。
　以下リンク参照
　>http://pf.prometric-jp.com/testlist/fe/index.html

##申し込みが出来ない！
使用しているmac端末から予約しようとしたら「エラー99」と表示されてしまい、何度実施を試みても同じエラーが出たので、公式に問い合わせを実施した。
すると以下のような返事が返ってきた。
>エラーコード99でございますが、スマートフォンやタブレットからお手続きを行われている場合や、パソコンがMACの場合等、
>ご利用環境によっては、予約中にエラーが発生し、予約が完了できない場合がございます。
>また、パソコンの接続環境やセキュリティ設定のレベルなどにより同様のエラーになる場合もございます。
>恐れ入りますが、Windowsのパソコンでのお手続きをお願いいたします。

えええ、聞いてないよっていう気持ちでいっぱい。
手持ちがMACしかない人は大変じゃん！
仕方ないので妹のパソコンを借りて申し込みをする。

##学習方法
①過去問を解きまくる
　ネット上に過去問が存在しているので、それを毎日繰り返し解いている
　基本情報技術者試験ドットコム
　>https://www.fe-siken.com/fekakomon.php

②基本を押さえる為の本を購入
　巷にいろんな種類の本が出ていて、何が正解かもよくわからないけど、とりあえずシェアNO.1と謳われているものを選んでみる
　本の名前：キタミ式イラストIT塾　基本情報技術者　令和3年
　>https://www.amazon.co.jp/%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88IT%E5%A1%BE-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E4%BB%A4%E5%92%8C03%E5%B9%B4-%E3%81%8D%E3%81%9F%E3%81%BF%E3%82%8A%E3%82%85%E3%81%86%E3%81%98/dp/4297117819

③間違えノートを作成する
　問題を何度かやっていると同じように間違える問題があったので、それらを物理またはPCのメモ機能を用いてまとめていく。


##受験結果
まだ受験していないので、受験後また更新します〜

##その他
こんな勉強方法がよかったよーなどもしご意見あればコメントいただけると幸いです。
宜しくお願いします。
PowerAppsでドロップダウンの選択によって、 複数のデータカードを表示させたい（質問に投稿しましたが回答頂けないのでこちらに）

### 解決したいこと
PowerAppsでドロップダウン「カテゴリー」の選択によって、
複数のデータカードを表示させたい
例）
「カテゴリー」の値の中の「B」を選択したら、
複数の入力欄（複数のデータカード）を表示させたいです。

解決方法を教えて下さい。

表示させたい複数の入力欄を1ブロック化できるなら
その方法も教えて下さい。

動きとしては、下記の通り

◆契約書を選択したら
![01キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874732/78523d77-705f-bb88-c634-38c76f97ef3b.png)

◇担当者と確認日の入力欄が有効化する


![02キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874732/34a8df01-e7c3-46c8-a989-14dc666fb8db.png)

というやつです。

### 自分で試したこと

カテゴリーのドロップダウンのItemsプロパティに
何か入力する？
iPhoneのネットワーク設定が原因でVTube studioが使えなかった件


##iPhoneのネットワーク設定
スマホ側でインターネットの共有設定ができておらず、スマホの有線接続を認識しない状態でした
[iPhone や iPad でインターネット共有を設定する方法](https://support.apple.com/ja-jp/HT204023)

##PCとiPhoneで同じwifiを使用しているかどうか？
家に複数のネット環境がある場合に異なるwifiに接続している場合に使えない可能性がある
(PCがBuffaloとiPhoneがatermのwifiに接続していたら接続できなかった)

##PC側でVTubeStudioをブロックしていないか
セキュリティーソフトでブロックしている可能性がある
プライベートネットワークでVTubeStudioの許可が必要(ファイアウォール)

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Usually, it is the firewall settings. Please make sure VTube Studio is added as exception in your firewall!! 🔥🧱<br><br>Please also make sure your network is set to private. <a href="https://t.co/TnaAtqdUYi">pic.twitter.com/TnaAtqdUYi</a></p>&mdash; VTube Studio (@VTubeStudio) <a href="https://twitter.com/VTubeStudio/status/1301270254170054666?ref_src=twsrc%5Etfw">September 2, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


##PCのネットワーク設定
PCで有線接続を許可しているかどうか？
設定→ネットワークとインターネット→プロパティ
でネットワークプロファイルをプライベートに設定する
![ネットワーク設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369279/24db40b5-a98f-3ce2-bc01-855bf62dd8e9.png)
vscode remote containerのphpのコードをphp cs fixerで整形する

## 概要

remote containerを利用してphpのコードを書いて、保存した時に自動で整形されるようにする。

## 書かないこと

- remote containerの使い方
- php cs fixerのルール設定

## php-cs-fixerのインストール

Composer経由でインストールする。
docker環境なので、Dockerfileに以下を追加する。
追加したらコンテナを再構築する。

```Dockerfile
RUN composer global require "friendsofphp/php-cs-fixer"
```

## vscode拡張のインストール

vscodeのExtensionsで`junstyle.php-cs-fixer`を検索して、インストールする。

## settings.jsonの追加

ホームディレクトリに`.vscode/settings.json`がない場合は作成して、以下を追加する。

```json
{
  "php-cs-fixer.onsave": true,
  "php-cs-fixer.executablePath": "php-cs-fixer",
  "[php]": {
    "editor.defaultFormatter": "junstyle.php-cs-fixer"
  }
}
```
JavaScript ページのトップへスクトールさせるボタン





```javascript:script.js

const PageTopBtn = document.getElementById('js-scroll-top');
if (PageTopBtn) {
  PageTopBtn.addEventListener('click', () => {
    window.scrollTo({
      top: 0,
      behavior: 'smooth'
    });
  });
}

```



```html:index.html

<div id="js-scroll-top" class="scroll-top"></div>
```



```css:style.css

.scroll-top {
  display: block;
  position: fixed;
  right: 40px;
  bottom: 50px;
  width: 50px;
  height: 50px;
  border-radius: 25px;
  color: #fff;
  background-color: gray;
  z-index: 500;
  text-align: center;
  vertical-align: bottom;
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  box-shadow: 0 0 6px 0 rgba(0, 0, 0, 0.5);
  transition: 0.5s;
}
.scroll-top:hover {
  box-shadow: 0 4px 7px 0 rgba(0, 0, 0, 0.5);
  transform: translateY(-5px);
  cursor: pointer;
  opacity: 0.7;
}
.scroll-top:before {
display: block;
margin: -13px auto auto;
content: "";
position: absolute;
top: 50%;
right: 0;
left: 0;
width: 10px;
height: 10px;
z-index: 1;
border-top: solid 3px #ffffff;
border-right: solid 3px #ffffff;
-webkit-transform: rotate(-45deg);
transform: rotate(-45deg);
}
.scroll-top::after {
  display: block;
  margin: 25px auto auto;
  content: "TOP";
  font-size: 13px;
  line-height: 17px;
}

```
pythonでphotoshop psdファイルを読み込む (psd-tools)

# psd-toolsとは


psdファイルをpythonで読み込む為のpythonパッケージです
レイヤーごとの内容を取得できます。


# インストール

pipで入ります

```terminal
pip install psd-tools
```


# ファイル全体

## ファイルを読み込む


下のような背景＋4レイヤーからなるpsdファイルを読んでみます
![ダウンロード (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/500edaf7-ad31-e753-6a55-f0b3797469e9.png)

```python:python
import psd_tools
psd = psd_tools.PSDImage.open('./sample.psd')
psd
```

```python:結果
PSDImage(mode=ColorMode.RGB size=300x200 depth=8 channels=3)
  [0] PixelLayer('背景' size=300x200)
  [1] TypeLayer('テキストレイヤー' size=95x11)
  [2] PixelLayer('黄色四角' size=131x72)
  [3] ShapeLayer('長方形ツール' size=143x57)
  [4] ShapeLayer('赤線' size=119x98)
```


## 表示する


上記のpsdオブジェクトのcomposite()メソッドでファイル全体を画像に変換してくれます

```python:python
psd.composite()
```
![ダウンロード (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/500edaf7-ad31-e753-6a55-f0b3797469e9.png)


## 画像として書き出す


composite()してからsave()メソッドで画像として保存できます

```python:python
psd.composite().save('./sample.png')
```


## 値をnumpy arrayとして取得する


画像のRGBの値をnumpy arrayとして取得できます

```python:python
arr = psd.numpy()
print(arr.shape)
arr
```

```python:結果
(200, 300, 3)
array([[[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        ...,
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]],

       ...,

       [[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        ...,
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]]], dtype=float32)
```

中身は普通にRGBなので表示してやると同じ画像になります

```python:python
import matplotlib.pyplot as plt
plt.imshow(arr)
plt.show()
```
![ダウンロード (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/500edaf7-ad31-e753-6a55-f0b3797469e9.png)


# レイヤーごと

## レイヤーごとに表示する


psdオブジェクトはiterableで、インデックス指定またはiterでそれぞれのレイヤーを取得できます。for文で回すと下のレイヤーから順に出てきます。

```python:jupyter_notebook
for k, layer in enumerate(psd):
    print('{}: {}'.format(k, layer))
    print('offset: {}'.format(layer.offset))    
    display(layer.composite())
```

PixelLayer、TextLayer、ShapeLayerがそれぞれ区別されて読み込まれているのが分かります。また、描画がある場所だけ表示するようになっているので、layerごとにoffset, height, widthが設定されています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/d00975ac-10ba-50f5-acd3-3488464357a0.png" width=50%>


## レイヤーの値を取得する


レイヤーの値もnumpy arrayとして取得できます


```python:python
layer = psd[4]
arr = layer.numpy()
print(arr.shape)
arr[:80, :100]
```

レイヤーは透明度が設定されているので4チャンネルが取得されます。ShapeLayerはRGBの値は同じで透明度のみ変更されているので以下のように最後のチャンネルのみ変わります。

```python:結果
(98, 119, 4)
array([[[1., 0., 0., 0.],
        [1., 0., 0., 0.],
        [1., 0., 0., 0.],
        ...,
        [1., 0., 0., 0.],
        [1., 0., 0., 0.],
        [1., 0., 0., 0.]],

       ...,

        [[1., 0., 0., 0.],
        [1., 0., 0., 0.],
        [1., 0., 0., 0.],
        ...,
        [1., 0., 0., 1.],
        [1., 0., 0., 1.],
        [1., 0., 0., 1.]]], dtype=float32)
```


# ファイルの書き換えは出来ないっぽい

便利なのでこれを使ってpsd形式の込み入った図を作ろうかと思ったんですが、書き換えには対応していないようです。やりとりを見た感じだとpsd形式のフォーマットが公開されていないので独自に解析してやるしかないのが障害になってるようです。
https://github.com/psd-tools/psd-tools/issues/84
ブックレビュー　UnityC#　ゲームプログラミング入門とお知らせ


今回は、この間発売されたばかりの最新unity本を

レビューします。　こちら


[Unity本](https://amzn.to/3rfj9yR)


本書は、掌田さんが書いている、Unityのシリーズ本ですね。　

私は前の書籍も持ってますけど、内容的にはそちらを　

バージョンアップしたという感じです。　

前のやつは、いわゆる入門本でしたけどこちらは　中級者向けの　

内容となっています。　入門本みたいに最初から解説しているわけではなく　
もうがっつりとプログラミングの内容となっています。

ですので、Unity初心者の人だと少し難しいかなと思います。　




本書では、ゲームオブジェクトの基本

ゲームデータ管理、アニメーションについて、ヒューマノイドについて

ＧＵＩについて、マルチプレイヤーゲームについてを

解説しています。

ページ数でいうと、ヒューマノイドに関するページが多く充実していますが　

マルチプレイヤーゲームはページ数が少なく、さわりだけとなっています。　

マルチゲームの構築は難しいですから、そこの解説は

もうちょっとほしかったですね。　

しかし、ほかの部分は大いに参考になると思います。　

特にデータ管理の部分は、ネットなどにもあまり載っていない情報ですので　

そこだけでも、読む価値はあると思います。　

ただ、初心者が手を出すべき本ではないですね。





ＰＳ　

新しくUnityを学べるサイトを作りました。　
今後はこちらのサイトでUnity情報などを書いていきますので　

Unityに興味のある人は、ぜひブックマークしてください。

[ユニコーン](https://unitymaster2.com/)
インストールパッケージ.pkgにサインをする

作成したインストール用の.pkgファイルに、サインが欲しいと言われたので、調べてみました。以下手順になります。

# 証明書要求を生成する

* KeyChainから証明書アシスタント→認証局に証明書を要求
* CAのメールアドレスは空白で「ディスクに保存を選択」
* .csrファイルを保存

# インストール用証明書を作成する

* [Apple Developer Portal](https://developer.apple.com/)を開く
* 「Certificates, Identifiers & Profiles」から＋マークを押して「Create a New Certificate」画面へ
* 「Mac Installer Distribution」を選択して証明書を作成

# サインを行う

```
productsign —sign “3rd Party Mac Developer Installer: **** ” /Desktop/example.pkg /Desktop/example_signed.pkg  
```

# ごにょごにょ

参考サイトに.pkg作成時に付与する方法なども書いてあるのですが、別ソフトを使ったようなのでコマンドラインからサインを行いました。

きちんと証明を付与する事ができたようなのですが、「やっぱりいらなかった」と言われました...（謎。証明書の有効期限が１年なので、サインした場合には毎年更新しなくてはいけないような気がします。

個人的には野良パッケージでなく、ちゃんとAppStore経由で配布できるような感じにするべきだと思います。

# 参考

https://www.hexnode.com/mobile-device-management/help/how-to-sign-macos-pkg-files-for-deployment-with-hexnode-mdm/

Packages : パッケージ作成ソフト
http://s.sudre.free.fr/Software/Packages/about.html
JavaScript URLでパラメーターを送信、受信する

#リンクをクリックしてページ遷移先のフォームのチェックボックスにチェックを入れる方法



##送信


```javascript:script.js


const test01 = document.getElementById('id名'); //id名を探す。

if (test01){
  test01.addEventListener('click', function send(){ //id名をクリックした際に送る。
  const param02 = "送りたい内容";
  window.open().location.href = "〇〇.html?"+param02; 
  //「指定の〇〇.html + ? + 送りたい内容」をURLでパラメーターを送信できます。
  return false;
});
```
window.open() ・・・JSで別タブ開く指示
location.href ・・・現在ページURLを参照


##受信
URLのパラメーターを"document.location.search"で取得できます。
ただし、URLのパスの後ろのパラメーターの文字列をまとめて取得することしかできないため、
各パラメータの値の取得は取得した文字列を解析する必要があります。



```javascript:script.js


if (document.location.search) {
  const query03 = document.location.search.substring(1); 
  if (query03)
  document.getElementById(query03).checked = true;
}
```
substring(1)で2文字目以降の文字列を取り出しています。

今回は送りたいパラメータが１つだけであったため、param02とquery03をそのまま使えた。
複数のパラメータを送る際は処理をしなければならない。






参考サイト：
http://www.ipentec.com/document/javascript-get-parameter
Herokuのサブドメインから独自ドメインへお引越し(リダイレクト) nginx編

# はじめに
こんにちは。HerokuにWordPress入れてブログ始めた筆者です。

初めて数カ月、GoogleAdSenseの審査に落ちまくり、先駆者の奮闘ブログを拝読しまして、やはり独自ドメインにする必要があるのではと感じました。

今までは、herokuのサブドメイン(`example.herokuapp.com`)で運用していました。

そんなわけでHerokuのサブドメインから独自ドメインへのリダイレクトの設定を行ったのですが、Herokuならでは(?)の問題にぶち当たったので情報の共有のため記事にしました。


# ぶつかった問題
## 1. おいおい、Herokuのカスタムのnginx.confでserverブロック使えないんだが！！
Googleで`nginx ドメイン リダイレクト`とかで検索してでてくるこんなやつ↓ 使えば簡単に引っ越せると思ってましたが、なんと、Herokuのカスタムのnginx.confではserverブロックが使えません... :sob: 

```
server {
    server_name old-domain.com;
    rewrite ^(.*)$ https://new-domain.com$1 permanent;
}
```

ググってもググってもserverブロックでリダイレクトする記述ばかり、滅多にnginx.confいじらない筆者にとっては、手厳しい...。

# 解決策
これならHerokuのカスタムのnginx.confでも行けます:ok_hand:

```
if ($host = "old-domain.com") {
    rewrite ^ https://new-domain.com$request_uri? permanent;
}
```

なんだ、if文とか使えるんだ、勉強になりました。

# おわりに
無事にお引越しができました。私と同じようにHerokuでnginxのリダイレクトでお困りの方の救いになれば幸いです。
尚、GoogleAdSenseの審査はまだ通っていません :pray:
浮動小数点が使えない環境での平方根の計算

浮動小数点がない組み込み環境で平方根を計算しないといけないので下記のサイトを参考に高速化してみた。
https://talavax.com/math-sqrtint.html

動機としては値が大きくなると遅くなるのでどうにかしたい。
なので計算が簡単な2のべき乗の平方根はメモ化して定数化、そこを起点に計算をするように変更した。

（追記）Nが大きい場合は二分法を使ったほうが速いようです

```cpp
#include <cmath>
#include <iostream>
#include <type_traits>

template <typename T>
inline T sqrti(T val) {
  // static_assert(std::is_integral<T>::value == true);
  const struct _intern {
    static constexpr T compute_substractor(T root) {
      T c = 1;
      for (T num = root * root; num >= c; num -= c, c += 2)
        ;
      return c;
    }

    T table[sizeof(T) * 4];

    _intern(void) {
      for (T i = 0; i < (T)(sizeof(T) * 4); ++i) {
        table[i] = compute_substractor(1 << i);
      }
    }
  } intern;

  if (val == 0) {
    return 0;
  }

  T rank_base2 = (T)(sizeof(T) * 8 - 1);
  for (; rank_base2 > 0; --rank_base2) {
    if ((val & (1 << rank_base2)) != 0) {
      break;
    }
  }

  const T min_root_rank_base2 = rank_base2 >> 1;
  T root = 1 << min_root_rank_base2;
  for (T num = val - root * root, c = intern.table[min_root_rank_base2];
       num >= c; num -= c, c += 2, ++root)
    ;

  return root;
}

int main() {
  std::cout << "test" << std::endl;
  for (unsigned short i = 1; i < 0xFFFFU; ++i) {
    if (sqrti(i) != (unsigned short)sqrt(i)) {
      std::cout << "ng" << std::endl;
      return -1;
    }
  }
  std::cout << "ok" << std::endl;
  return 0;
}
```
SwiftUIでinit内でStateを変更しても反映されない

# コメントいただきよりよい方法見つかりました

```
@State var fullText: String // No default value of ""

init(letter: String) {
    _fullText = State(initialValue: list[letter]!)
}
```


# 以下更新前
`init` ないで Stateを変更してもUIに反映されませんでした。
`View`のonAppearでStateを変更すると反映されるようになりました。

参考
https://stackoverflow.com/questions/56691630/swiftui-state-var-initialization-issue
【kintone】クロス集計表を作ってみる（その２）

前回、データが1方向に伸びるアプリを作成しました。
[【kintone】クロス集計表を作ってみる（その１）](https://qiita.com/juri_don/items/316e8e816a92a247aa56)

今回は、前回作成したアプリでクロス集計表を作成します。
ちょっと複雑なクロス集計表も紹介します。

# 完成形（ひとまずの目標）
この一覧から、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/5bd0a969-3ce6-50d6-b45b-7710cdc79a39.png" width=300px>


↓↓↓このようなクロス集計表を作成するのが最初の目標です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/d20678f5-f7a7-b9d9-5d6b-0f8c831c759f.png)

クロス集計表は上と右側に**合計値**が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/d896bd58-ec66-6e29-bce1-6dd3003ac5cd.png)

ではグラフの設定をしていきましょう。

# グラフの設定

大項目：横に並べたいもの（テスト科目）
中項目：縦に並べたいもの（名前）
集計方法（合計）：表示したい数値（点数）

のように設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/74993b0a-db76-17f3-f1fd-c763e8ff783d.png)

大項目と横
中項目と縦
集計方法には数値を入れる

これだけで基本的なクロス集計表が作成できます。

※前回、2方向に伸びたデータを1方向にする過程で↓の図を使いましたが、逆のことをしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/4eb174dc-a03b-6846-0522-b818e9fc52c1.png)



# ちょっと複雑なクロス集計表

クロス集計表では小項目にも項目を追加することができます。
（集計方法は一つまでです）

試しに作成日時を追加してみると
中項目で指定した名前と数値の間に小項目が挟まれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/1d5f26d7-81a5-931b-e401-812202bb7b3f.png)

中項目に作成日時（日単位）、小項目に名前を選択すると、
中項目が同じ値のものは・・・・、まとまります！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/5189136c-bd63-9745-b4ea-bf4bd693fbf8.png)

このように、表の左側のヘッダーは2段構えできます。※上側のヘッダーは2段にできません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/7587de78-dc16-a8ea-f430-bc6deb6911dc.png)

左のヘッダーを2段構えするときは
このようにイメージして設定すると良さそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/ca7c710f-5faa-928f-663a-480c269894c1.png)


左側のヘッダだけは2段構えで使えるということに気づいて、
クラスのフィールドを追加して、クラスごとの集計ができるようにしてみました。
一番右側にはクラスごとの合計点も表示されます。

平均点であってほしいところですが、集計方法の平均を選択しても平均にはできませんでした。
※実際は別で生徒マスターのアプリを準備しておいてルックアップしたほうが良いですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/7b39ab4c-016c-c18e-5c5f-b52184423127.png)

# まとめ
今回は、データが1方向に伸びるアプリからクロス集計表を作りました。
設定のポイントを最後に書いて終わりたいと思います。

## シンプルなクロス集計表（2段構えしない）
大項目：横
中項目：縦
集計方法：数値

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/4c782424-4795-6a80-232f-c9673c997f28.png)

## 2段構えするクロス集計表
大項目：横
中項目：縦の左側
小項目：縦の右側
集計方法：数値


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/0434eb1f-3ad2-686d-b4d9-ffa4a995cec6.png)

読んでくださってありがとうございました！
次回はクロス集計表こんな時どうする？について書きたいと思います。
PythonのPillowで簡易的に同一画像の判別をする

### こんな人に役に立つ
* ２枚の画像が同じ画像か判別したい。
* 可能な限り簡易的にやりたい。
* 厳密性は求めない。

### こんな人に役に立たない
* リサイズされていても同一視したい。
* 類似度を考慮したい。

### なぜPillowで判別するのか
判別した流れでPillowでリサイズとかできて便利です。
「Python 画像 同じ」とかで調べたら、リサイズとかを考慮したやつしか出てこなかったので、もっと簡易的なやつを紹介します。

### コード
とても簡単です。
一応たくさんコメントを書いておきました〜


```python
# imgディレクトリに画像が入っている前提

from PIL import Image
import os

# このファイルがあるディレクトリの絶対パス
base_dir = os.path.abspath(os.path.dirname(__file__))

# 画像のハッシュを求める（正確にはハッシュではないけど)
def img_hash(filename):
    # ファイル名から絶対パスを求める
    pil_img = Image.open(base_dir + '/img/' + filename)
    # 画像を10x10にリサイズする
    pil_img = pil_img.resize((10, 10), Image.ANTIALIAS)
    # グレースケールに変換
    pil_img = pil_img.convert('L')
    # 100マスの色の数値を取得（この時点ではPILのオブジェクト）
    data = pil_img.getdata()
    # 数値を文字列にして、リストにする
    data_list = map(str, list(data))
    # くっつけて返す
    return ''.join(data_list)

print('01.jpg: ', img_hash('01.jpg')) # 728091867896130143159161748895106...
print('02.jpg: ', img_hash('02.jpg')) # 728091867896130143159161748895106...
print('03.jpg: ', img_hash('03.jpg')) # 255255255255246224215245255255255...
print(img_hash('01.jpg') == img_hash('02.jpg')) # True
print(img_hash('01.jpg') == img_hash('03.jpg')) # False
```

こんな感じです。
アンチエイリアスはやる意味はよくわからないけど、参考元がやってたのでやりました〜

## 参考
https://stackoverflow.com/questions/49689550/simple-hash-of-pil-image
vscode と jupyter notebook 2021/02/03現在

Python 3.7.6 64-bit

jupyter がインストールされた環境を選んだあと、
コマンドパレットから `jupyter create new` くらいを入力して、

```
Jupyter:Create New Blank Jupyter Notebook
```

を選択。

```
Python:Create New Blank Jupyter Notebook
```

は出てこない